From 8a4e9782887dd5ed8a9553569b67f474abf6b5ef Mon Sep 17 00:00:00 2001 From: bgoonz Date: Sun, 30 May 2021 19:43:47 -0400 Subject: [PATCH] initial commit --- DOCS/_static/basic.css | 768 + DOCS/_static/classic.css | 271 + DOCS/_static/copybutton.js | 64 + DOCS/_static/default.css | 1 + DOCS/_static/doctools.js | 315 + DOCS/_static/documentation_options.js | 11 + DOCS/_static/file.png | Bin 0 -> 286 bytes DOCS/_static/jquery.js | 2 + DOCS/_static/language_data.js | 297 + DOCS/_static/py.png | Bin 0 -> 695 bytes DOCS/_static/pydoctheme.css | 193 + DOCS/_static/pygments.css | 74 + DOCS/_static/right.html | 32 + DOCS/_static/sidebar.js | 194 + DOCS/_static/switchers.js | 182 + DOCS/_static/underscore.js | 31 + DOCS/right.html | 23 + DOCS/tutorial/appendix.html | 307 + DOCS/tutorial/appetite.html | 263 + DOCS/tutorial/classes.html | 1021 + DOCS/tutorial/controlflow.html | 1044 + DOCS/tutorial/datastructures.html | 881 + DOCS/tutorial/directory.html | 11 + DOCS/tutorial/errors.html | 654 + DOCS/tutorial/floatingpoint.html | 471 + DOCS/tutorial/index.html | 419 + DOCS/tutorial/inputoutput.html | 661 + DOCS/tutorial/interactive.html | 240 + DOCS/tutorial/interpreter.html | 336 + DOCS/tutorial/introduction.html | 723 + DOCS/tutorial/left.html | 23 + DOCS/tutorial/modules.html | 717 + DOCS/tutorial/right.html | 33 + DOCS/tutorial/stdlib.html | 515 + DOCS/tutorial/stdlib2.html | 572 + DOCS/tutorial/venv.html | 375 + DOCS/tutorial/whatnow.html | 259 + README.md | 0 index.html | 11 + learn-python3-samples/advance/do_generator.py | 31 + learn-python3-samples/advance/do_iter.py | 64 + learn-python3-samples/advance/do_listcompr.py | 12 + learn-python3-samples/advance/do_slice.py | 16 + learn-python3-samples/advance/do_yield.py | 29 + learn-python3-samples/advance/right.html | 30 + learn-python3-samples/async/aio_web.py | 33 + learn-python3-samples/async/async_hello.py | 16 + learn-python3-samples/async/async_hello2.py | 15 + learn-python3-samples/async/async_wget.py | 25 + learn-python3-samples/async/async_wget2.py | 15 + learn-python3-samples/async/coroutine.py | 24 + learn-python3-samples/async/right.html | 30 + learn-python3-samples/basic/do_for.py | 11 + learn-python3-samples/basic/do_if.py | 15 + learn-python3-samples/basic/do_input.py | 5 + learn-python3-samples/basic/do_print.py | 7 + learn-python3-samples/basic/do_while.py | 18 + learn-python3-samples/basic/hello.py | 4 + learn-python3-samples/basic/right.html | 31 + learn-python3-samples/basic/the_dict.py | 12 + learn-python3-samples/basic/the_list.py | 12 + learn-python3-samples/basic/the_set.py | 8 + learn-python3-samples/basic/the_string.py | 8 + learn-python3-samples/basic/the_tuple.py | 13 + learn-python3-samples/commonlib/check_bmp.py | 8 + learn-python3-samples/commonlib/do_base64.py | 14 + learn-python3-samples/commonlib/right.html | 31 + .../commonlib/use_chainmap.py | 20 + .../commonlib/use_collections.py | 28 + .../commonlib/use_datetime.py | 40 + .../commonlib/use_hashlib.py | 13 + .../commonlib/use_htmlparser.py | 36 + .../commonlib/use_itertools.py | 18 + learn-python3-samples/commonlib/use_sax.py | 28 + learn-python3-samples/commonlib/use_urllib.py | 58 + learn-python3-samples/context/do_closing.py | 17 + learn-python3-samples/context/do_suppress.py | 11 + learn-python3-samples/context/do_with.py | 14 + learn-python3-samples/context/right.html | 29 + learn-python3-samples/db/do_mysql.py | 31 + learn-python3-samples/db/do_sqlalchemy.py | 44 + learn-python3-samples/db/do_sqlite.py | 34 + learn-python3-samples/db/right.html | 29 + learn-python3-samples/debug/do_assert.py | 12 + learn-python3-samples/debug/do_logging.py | 10 + learn-python3-samples/debug/do_pdb.py | 9 + learn-python3-samples/debug/do_try.py | 12 + learn-python3-samples/debug/err.py | 12 + learn-python3-samples/debug/err_logging.py | 19 + learn-python3-samples/debug/err_raise.py | 12 + learn-python3-samples/debug/err_reraise.py | 17 + learn-python3-samples/debug/mydict.py | 14 + learn-python3-samples/debug/mydict2.py | 42 + learn-python3-samples/debug/mydict_test.py | 39 + learn-python3-samples/debug/right.html | 31 + learn-python3-samples/function/call_func.py | 9 + learn-python3-samples/function/def_func.py | 26 + learn-python3-samples/function/kw_args.py | 31 + learn-python3-samples/function/recur.py | 24 + learn-python3-samples/function/right.html | 30 + learn-python3-samples/function/var_args.py | 15 + learn-python3-samples/functional/decorator.py | 33 + learn-python3-samples/functional/do_filter.py | 14 + learn-python3-samples/functional/do_map.py | 7 + .../functional/do_partial.py | 9 + learn-python3-samples/functional/do_reduce.py | 61 + learn-python3-samples/functional/do_sorted.py | 15 + .../functional/prime_numbers.py | 29 + .../functional/return_func.py | 46 + learn-python3-samples/functional/right.html | 30 + learn-python3-samples/gui/hello_gui.py | 27 + learn-python3-samples/gui/right.html | 29 + learn-python3-samples/gui/turtle/rect.py | 26 + learn-python3-samples/gui/turtle/right.html | 29 + learn-python3-samples/gui/turtle/stars.py | 16 + learn-python3-samples/gui/turtle/tree.py | 59 + learn-python3-samples/io/do_bytesio.py | 16 + learn-python3-samples/io/do_dir.py | 16 + learn-python3-samples/io/do_stringio.py | 19 + learn-python3-samples/io/right.html | 30 + learn-python3-samples/io/use_json.py | 26 + learn-python3-samples/io/use_pickle.py | 11 + learn-python3-samples/io/with_file.py | 18 + learn-python3-samples/mail/fetch_mail.py | 86 + learn-python3-samples/mail/right.html | 29 + learn-python3-samples/mail/send_mail.py | 28 + .../hellorobot/.vscode/extensions.json | 13 + .../hellorobot/.vscode/launch.json | 14 + .../hellorobot/.vscode/settings.json | 6 + .../micropython/hellorobot/main.py | 14 + .../micropython/hellorobot/right.html | 29 + .../micropython/rccar/.vscode/extensions.json | 13 + .../micropython/rccar/.vscode/launch.json | 14 + .../micropython/rccar/.vscode/settings.json | 6 + .../micropython/rccar/devices.py | 47 + .../micropython/rccar/main.py | 100 + .../micropython/rccar/right.html | 29 + learn-python3-samples/micropython/right.html | 24 + .../smallcar/.vscode/extensions.json | 13 + .../micropython/smallcar/.vscode/launch.json | 14 + .../smallcar/.vscode/settings.json | 7 + .../micropython/smallcar/main.py | 51 + .../micropython/smallcar/right.html | 29 + .../micropython/tank/.vscode/extensions.json | 13 + .../micropython/tank/.vscode/launch.json | 14 + .../micropython/tank/.vscode/settings.json | 6 + .../micropython/tank/cannon.wav | Bin 0 -> 141378 bytes .../micropython/tank/devices.py | 47 + .../micropython/tank/joystick.py | 61 + .../micropython/tank/main.py | 103 + .../micropython/tank/right.html | 29 + learn-python3-samples/module/hello.py | 21 + learn-python3-samples/module/right.html | 29 + learn-python3-samples/multitask/do_folk.py | 12 + learn-python3-samples/multitask/do_lock.py | 33 + learn-python3-samples/multitask/do_queue.py | 34 + .../multitask/do_subprocess.py | 14 + .../multitask/multi_processing.py | 17 + .../multitask/multi_threading.py | 20 + .../multitask/pooled_processing.py | 22 + learn-python3-samples/multitask/right.html | 31 + .../multitask/task_master.py | 38 + .../multitask/task_worker.py | 36 + .../multitask/use_threadlocal.py | 24 + .../oop_advance/create_class_on_the_fly.py | 13 + learn-python3-samples/oop_advance/orm.py | 77 + learn-python3-samples/oop_advance/right.html | 31 + .../oop_advance/special_call.py | 12 + .../oop_advance/special_getattr.py | 21 + .../oop_advance/special_getitem.py | 30 + .../oop_advance/special_iter.py | 19 + .../oop_advance/special_str.py | 14 + learn-python3-samples/oop_advance/use_enum.py | 32 + .../oop_advance/use_metaclass.py | 19 + .../oop_advance/use_property.py | 22 + .../oop_advance/use_slots.py | 21 + learn-python3-samples/oop_basic/animals.py | 32 + learn-python3-samples/oop_basic/attrs.py | 25 + .../oop_basic/get_instance.py | 30 + learn-python3-samples/oop_basic/get_type.py | 14 + .../oop_basic/protected_student.py | 35 + learn-python3-samples/oop_basic/right.html | 30 + learn-python3-samples/oop_basic/student.py | 29 + learn-python3-samples/regex/regex.py | 13 + learn-python3-samples/regex/right.html | 29 + learn-python3-samples/right.html | 28 + learn-python3-samples/socket/do_tcp.py | 35 + learn-python3-samples/socket/right.html | 29 + learn-python3-samples/socket/udp_client.py | 14 + learn-python3-samples/socket/udp_server.py | 18 + learn-python3-samples/test/dict_doctest.py | 41 + learn-python3-samples/test/dict_unittest.py | 56 + learn-python3-samples/test/right.html | 29 + learn-python3-samples/web/do_flask.py | 29 + learn-python3-samples/web/do_wsgi.py | 11 + learn-python3-samples/web/hello.py | 7 + learn-python3-samples/web/mvc/app.py | 25 + learn-python3-samples/web/mvc/right.html | 29 + .../web/mvc/templates/form.html | 16 + .../web/mvc/templates/home.html | 8 + .../web/mvc/templates/right.html | 29 + .../web/mvc/templates/signin-ok.html | 8 + learn-python3-samples/web/right.html | 29 + left.html | 27 + .../m-n-m/.idea/.gitignore | 2 + .../05-interactive-code/m-n-m/.idea/.name | 1 + .../m-n-m/.idea/M&M Guessing.iml | 10 + .../inspectionProfiles/profiles_settings.xml | 6 + .../05-interactive-code/m-n-m/.idea/misc.xml | 4 + .../m-n-m/.idea/modules.xml | 8 + .../05-interactive-code/m-n-m/.idea/vcs.xml | 6 + .../05-interactive-code/m-n-m/guessinggame.py | 27 + .../code/05-interactive-code/m-n-m/right.html | 29 + .../code/05-interactive-code/right.html | 23 + .../right.html | 23 + .../rocks-game/.idea/.gitignore | 2 + .../rocks-game/.idea/.name | 1 + .../rocks-game/.idea/RPS Functions.iml | 10 + .../inspectionProfiles/profiles_settings.xml | 6 + .../rocks-game/.idea/misc.xml | 4 + .../rocks-game/.idea/modules.xml | 8 + .../rocks-game/.idea/vcs.xml | 6 + .../rocks-game/right.html | 29 + .../rocks-game/rpsgame.py | 106 + .../code/07-data-structures/right.html | 23 + .../rocks-game/.idea/.gitignore | 2 + .../07-data-structures/rocks-game/.idea/.name | 1 + .../rocks-game/.idea/RPS Data Structures.iml | 8 + .../inspectionProfiles/profiles_settings.xml | 6 + .../rocks-game/.idea/modules.xml | 8 + .../rocks-game/.idea/vcs.xml | 6 + .../07-data-structures/rocks-game/right.html | 29 + .../07-data-structures/rocks-game/rpsgame.py | 102 + .../simple_dict/.idea/.gitignore | 2 + .../simple_dict/.idea/.name | 1 + .../.idea/Data Structure Exploration.iml | 10 + .../simple_dict/playground.py | 39 + .../07-data-structures/simple_dict/right.html | 29 + .../code/08-problem-solving/right.html | 23 + .../tictactoe/.idea/.gitignore | 2 + .../08-problem-solving/tictactoe/.idea/.name | 1 + .../.idea/dictionaries/screencaster.xml | 7 + .../code/08-problem-solving/tictactoe/game.py | 125 + .../08-problem-solving/tictactoe/right.html | 29 + .../code/09-working-with-files/right.html | 23 + .../rocks-game/.idea/.gitignore | 2 + .../rocks-game/.idea/.name | 1 + .../rocks-game/.idea/RPS File IO.iml | 8 + .../.idea/dictionaries/screencaster.xml | 8 + .../inspectionProfiles/profiles_settings.xml | 6 + .../rocks-game/.idea/misc.xml | 4 + .../rocks-game/.idea/modules.xml | 8 + .../rocks-game/.idea/vcs.xml | 6 + .../rocks-game/right.html | 29 + .../rocks-game/rolls.json | 30 + .../rocks-game/rpsgame.py | 181 + .../code/10-external-libraries/right.html | 23 + .../rocks-game/.idea/.gitignore | 2 + .../rocks-game/.idea/.name | 1 + .../rocks-game/.idea/RPS External Libs.iml | 8 + .../.idea/dictionaries/mkennedy.xml | 7 + .../.idea/dictionaries/screencaster.xml | 8 + .../inspectionProfiles/profiles_settings.xml | 6 + .../rocks-game/.idea/misc.xml | 4 + .../rocks-game/.idea/modules.xml | 8 + .../rocks-game/.idea/vcs.xml | 6 + .../rocks-game/requirements.txt | 2 + .../rocks-game/right.html | 29 + .../rocks-game/rolls.json | 30 + .../rocks-game/rpsgame.py | 237 + .../code/11-error-handling/right.html | 23 + .../rocks-game/.idea/.gitignore | 2 + .../11-error-handling/rocks-game/.idea/.name | 1 + .../rocks-game/.idea/RPS Error Handling.iml | 8 + .../.idea/dictionaries/screencaster.xml | 7 + .../inspectionProfiles/profiles_settings.xml | 6 + .../rocks-game/.idea/modules.xml | 8 + .../rocks-game/.idea/vcs.xml | 6 + .../rocks-game/requirements.txt | 2 + .../11-error-handling/rocks-game/right.html | 29 + .../11-error-handling/rocks-game/rolls.json | 30 + .../11-error-handling/rocks-game/rpsgame.py | 212 + prac-4-beginners/code/right.html | 24 + .../practices/ch04_first_lines/readme.md | 70 + .../practices/ch04_first_lines/right.html | 29 + .../practices/ch05_interactive_code/readme.md | 84 + .../ch05_interactive_code/right.html | 29 + .../guessinggame.py | 27 + .../readme.md | 57 + .../right.html | 29 + .../practices/ch07_data_structures/readme.md | 68 + .../practices/ch07_data_structures/right.html | 29 + .../practices/ch08_problem_solving/readme.md | 36 + .../readme_files/Connect_4_Board_and_Box.jpg | Bin 0 -> 25667 bytes .../readme_files/right.html | 29 + .../practices/ch08_problem_solving/right.html | 29 + .../ch09_working_with_files/readme.md | 61 + .../ch09_working_with_files/right.html | 29 + .../ch10_external_libraries/readme.md | 63 + .../ch10_external_libraries/right.html | 29 + .../practices/ch11-error-handling/readme.md | 54 + .../practices/ch11-error-handling/right.html | 29 + prac-4-beginners/practices/readme.md | 13 + prac-4-beginners/practices/right.html | 31 + .../readme_resources/absolute-beginners.jpg | Bin 0 -> 69386 bytes prac-4-beginners/readme_resources/right.html | 29 + prac-4-beginners/right.html | 24 + .../right.html | 30 + .../step_1.md | 27 + .../step_2.md | 17 + .../step_3.md | 15 + .../step_4.md | 16 + .../step_5.png | Bin 0 -> 82489 bytes .../ch-05-interactive-code/hello_world.py | 2 + .../ch-05-interactive-code/right.html | 30 + .../ch-05-interactive-code/step_1.md | 3 + .../ch-05-interactive-code/step_2_even_odd.py | 14 + .../step_3_even_odd_a_lot.py | 23 + .../ch-05-interactive-code/step_4.png | Bin 0 -> 238167 bytes .../guessinggame.py | 52 + .../right.html | 29 + .../dictionary_program.py | 31 + .../ch-07-data-structures/right.html | 29 + .../ch-08-problem-solving/connect4.py | 212 + .../solutions/ch-08-problem-solving/readme.md | 70 + .../ch-08-problem-solving/right.html | 29 + .../connect4_files.py | 257 + .../ch-09-working-with-files/right.html | 29 + .../connect4_color.py | 259 + .../ch-10-external-libraries/requirements.txt | 1 + .../ch-10-external-libraries/right.html | 29 + .../solutions/ch-11-error-handling/readme.md | 42 + .../solutions/ch-11-error-handling/right.html | 29 + .../tictactoe_errors_handled.py | 122 + prac-4-beginners/solutions/readme.md | 7 + prac-4-beginners/solutions/right.html | 31 + python-mega-algo/.coveragerc | 4 + python-mega-algo/.gitattributes | 1 + python-mega-algo/.gitignore | 109 + python-mega-algo/.gitpod.yml | 2 + python-mega-algo/README.md | 949 + .../arithmetic_analysis/__init__.py | 0 .../arithmetic_analysis/bisection.py | 55 + .../gaussian_elimination.py | 83 + .../image_data/2D_problems.jpg | Bin 0 -> 58752 bytes .../image_data/2D_problems_1.jpg | Bin 0 -> 41392 bytes .../image_data/__init__.py | 0 .../arithmetic_analysis/image_data/right.html | 29 + .../in_static_equilibrium.py | 82 + .../arithmetic_analysis/intersection.py | 49 + .../arithmetic_analysis/lu_decomposition.py | 64 + .../newton_forward_interpolation.py | 57 + .../arithmetic_analysis/newton_method.py | 54 + .../arithmetic_analysis/newton_raphson.py | 43 + .../arithmetic_analysis/right.html | 31 + .../arithmetic_analysis/secant_method.py | 29 + python-mega-algo/backtracking/__init__.py | 0 .../backtracking/all_combinations.py | 46 + .../backtracking/all_permutations.py | 51 + .../backtracking/all_subsequences.py | 40 + python-mega-algo/backtracking/coloring.py | 114 + .../backtracking/hamiltonian_cycle.py | 177 + python-mega-algo/backtracking/knight_tour.py | 100 + python-mega-algo/backtracking/minimax.py | 69 + python-mega-algo/backtracking/n_queens.py | 90 + .../backtracking/n_queens_math.py | 158 + python-mega-algo/backtracking/rat_in_maze.py | 118 + python-mega-algo/backtracking/right.html | 32 + python-mega-algo/backtracking/sudoku.py | 158 + .../backtracking/sum_of_subsets.py | 65 + python-mega-algo/bit_manipulation/README.md | 7 + python-mega-algo/bit_manipulation/__init__.py | 0 .../bit_manipulation/binary_and_operator.py | 52 + .../bit_manipulation/binary_count_setbits.py | 41 + .../binary_count_trailing_zeros.py | 44 + .../bit_manipulation/binary_or_operator.py | 48 + .../bit_manipulation/binary_shifts.py | 109 + .../binary_twos_complement.py | 43 + .../bit_manipulation/binary_xor_operator.py | 52 + .../count_number_of_one_bits.py | 34 + .../bit_manipulation/reverse_bits.py | 85 + python-mega-algo/bit_manipulation/right.html | 31 + .../single_bit_manipulation_operations.py | 100 + python-mega-algo/blockchain/__init__.py | 0 .../blockchain/chinese_remainder_theorem.py | 94 + .../blockchain/diophantine_equation.py | 131 + .../blockchain/modular_division.py | 154 + python-mega-algo/blockchain/right.html | 29 + python-mega-algo/boolean_algebra/__init__.py | 0 .../boolean_algebra/quine_mc_cluskey.py | 173 + python-mega-algo/boolean_algebra/right.html | 29 + python-mega-algo/cellular_automata/README.md | 4 + .../cellular_automata/__init__.py | 0 .../cellular_automata/conways_game_of_life.py | 100 + .../cellular_automata/game_of_life.py | 131 + .../cellular_automata/one_dimensional.py | 74 + python-mega-algo/cellular_automata/right.html | 30 + python-mega-algo/ciphers/__init__.py | 0 python-mega-algo/ciphers/a1z26.py | 33 + python-mega-algo/ciphers/affine_cipher.py | 105 + python-mega-algo/ciphers/atbash.py | 66 + python-mega-algo/ciphers/base16.py | 22 + python-mega-algo/ciphers/base32.py | 13 + python-mega-algo/ciphers/base64_encoding.py | 142 + python-mega-algo/ciphers/base85.py | 13 + python-mega-algo/ciphers/beaufort_cipher.py | 82 + .../ciphers/brute_force_caesar_cipher.py | 56 + python-mega-algo/ciphers/caesar_cipher.py | 238 + python-mega-algo/ciphers/cryptomath_module.py | 15 + .../decrypt_caesar_with_chi_squared.py | 240 + .../ciphers/deterministic_miller_rabin.py | 137 + python-mega-algo/ciphers/diffie.py | 32 + python-mega-algo/ciphers/diffie_hellman.py | 267 + .../ciphers/elgamal_key_generator.py | 71 + python-mega-algo/ciphers/enigma_machine2.py | 293 + python-mega-algo/ciphers/hill_cipher.py | 231 + .../ciphers/mixed_keyword_cypher.py | 68 + .../ciphers/mono_alphabetic_ciphers.py | 63 + .../ciphers/morse_code_implementation.py | 97 + python-mega-algo/ciphers/onepad_cipher.py | 31 + python-mega-algo/ciphers/playfair_cipher.py | 105 + python-mega-algo/ciphers/porta_cipher.py | 103 + python-mega-algo/ciphers/prehistoric_men.txt | 7193 + python-mega-algo/ciphers/rabin_miller.py | 223 + python-mega-algo/ciphers/rail_fence_cipher.py | 102 + python-mega-algo/ciphers/right.html | 38 + python-mega-algo/ciphers/rot13.py | 37 + python-mega-algo/ciphers/rsa_cipher.py | 151 + python-mega-algo/ciphers/rsa_factorization.py | 57 + python-mega-algo/ciphers/rsa_key_generator.py | 59 + .../ciphers/shuffled_shift_cipher.py | 183 + .../ciphers/simple_keyword_cypher.py | 90 + .../ciphers/simple_substitution_cipher.py | 78 + python-mega-algo/ciphers/trafid_cipher.py | 128 + .../ciphers/transposition_cipher.py | 70 + ...ansposition_cipher_encrypt_decrypt_file.py | 41 + python-mega-algo/ciphers/vigenere_cipher.py | 65 + python-mega-algo/ciphers/xor_cipher.py | 205 + python-mega-algo/compression/__init__.py | 0 .../compression/burrows_wheeler.py | 168 + python-mega-algo/compression/huffman.py | 87 + .../image_data/PSNR-example-base.png | Bin 0 -> 4515013 bytes .../image_data/PSNR-example-comp-10.jpg | Bin 0 -> 106150 bytes .../compression/image_data/__init__.py | 0 .../image_data/compressed_image.png | Bin 0 -> 26684 bytes .../compression/image_data/example_image.jpg | Bin 0 -> 29986 bytes .../image_data/example_wikipedia_image.jpg | Bin 0 -> 486981 bytes .../compression/image_data/original_image.png | Bin 0 -> 83865 bytes .../compression/image_data/right.html | 30 + python-mega-algo/compression/lempel_ziv.py | 125 + .../compression/lempel_ziv_decompress.py | 111 + .../compression/peak_signal_to_noise_ratio.py | 45 + python-mega-algo/compression/right.html | 30 + python-mega-algo/computer_vision/README.md | 7 + python-mega-algo/computer_vision/__init__.py | 0 .../computer_vision/harriscorner.py | 75 + .../computer_vision/meanthreshold.py | 30 + python-mega-algo/computer_vision/right.html | 29 + python-mega-algo/conversions/__init__.py | 0 .../conversions/binary_to_decimal.py | 43 + .../conversions/binary_to_octal.py | 45 + .../conversions/decimal_to_any.py | 107 + .../conversions/decimal_to_binary.py | 59 + .../decimal_to_binary_recursion.py | 53 + .../conversions/decimal_to_hexadecimal.py | 79 + .../conversions/decimal_to_octal.py | 43 + python-mega-algo/conversions/hex_to_bin.py | 56 + .../conversions/hexadecimal_to_decimal.py | 49 + .../conversions/molecular_chemistry.py | 92 + .../conversions/octal_to_decimal.py | 43 + .../conversions/prefix_conversions.py | 102 + .../conversions/rgb_hsv_conversion.py | 159 + python-mega-algo/conversions/right.html | 33 + .../conversions/roman_numerals.py | 59 + .../conversions/temperature_conversions.py | 386 + .../conversions/weight_conversion.py | 287 + python-mega-algo/data_structures/__init__.py | 0 .../data_structures/binary_tree/__init__.py | 0 .../data_structures/binary_tree/avl_tree.py | 347 + .../binary_tree/basic_binary_tree.py | 101 + .../binary_tree/binary_search_tree.py | 221 + .../binary_search_tree_recursive.py | 638 + .../binary_tree/binary_tree_mirror.py | 44 + .../binary_tree/binary_tree_traversals.py | 154 + .../binary_tree/fenwick_tree.py | 28 + .../binary_tree/lazy_segment_tree.py | 137 + .../binary_tree/lowest_common_ancestor.py | 117 + .../binary_tree/merge_two_binary_trees.py | 93 + .../binary_tree/non_recursive_segment_tree.py | 158 + .../number_of_possible_binary_trees.py | 102 + .../binary_tree/red_black_tree.py | 720 + .../data_structures/binary_tree/right.html | 33 + .../binary_tree/segment_tree.py | 78 + .../binary_tree/segment_tree_other.py | 241 + .../data_structures/binary_tree/treap.py | 185 + .../data_structures/disjoint_set/__init__.py | 0 .../disjoint_set/alternate_disjoint_set.py | 68 + .../disjoint_set/disjoint_set.py | 79 + .../data_structures/disjoint_set/right.html | 29 + .../data_structures/hashing/__init__.py | 0 .../data_structures/hashing/double_hash.py | 41 + .../data_structures/hashing/hash_table.py | 83 + .../hashing/hash_table_with_linked_list.py | 27 + .../hashing/number_theory/__init__.py | 0 .../hashing/number_theory/prime_numbers.py | 29 + .../hashing/number_theory/right.html | 29 + .../hashing/quadratic_probing.py | 29 + .../data_structures/hashing/right.html | 30 + .../data_structures/heap/__init__.py | 0 .../data_structures/heap/binomial_heap.py | 403 + python-mega-algo/data_structures/heap/heap.py | 163 + .../data_structures/heap/heap_generic.py | 172 + .../data_structures/heap/max_heap.py | 87 + .../data_structures/heap/min_heap.py | 170 + .../data_structures/heap/randomized_heap.py | 188 + .../data_structures/heap/right.html | 30 + .../data_structures/heap/skew_heap.py | 192 + .../data_structures/linked_list/__init__.py | 80 + .../linked_list/circular_linked_list.py | 141 + .../linked_list/deque_doubly.py | 143 + .../linked_list/doubly_linked_list.py | 226 + .../linked_list/doubly_linked_list_two.py | 253 + .../linked_list/from_sequence.py | 44 + .../data_structures/linked_list/has_loop.py | 60 + .../linked_list/is_palindrome.py | 77 + .../linked_list/merge_two_lists.py | 83 + .../middle_element_of_linked_list.py | 64 + .../linked_list/print_reverse.py | 70 + .../data_structures/linked_list/right.html | 32 + .../linked_list/singly_linked_list.py | 240 + .../data_structures/linked_list/skip_list.py | 447 + .../data_structures/linked_list/swap_nodes.py | 55 + .../data_structures/queue/__init__.py | 0 .../data_structures/queue/circular_queue.py | 94 + .../queue/double_ended_queue.py | 57 + .../data_structures/queue/linked_queue.py | 151 + .../queue/priority_queue_using_list.py | 232 + .../data_structures/queue/queue_on_list.py | 52 + .../queue/queue_on_pseudo_stack.py | 57 + .../data_structures/queue/right.html | 30 + python-mega-algo/data_structures/right.html | 31 + .../data_structures/stacks/__init__.py | 0 .../stacks/balanced_parentheses.py | 37 + .../stacks/dijkstras_two_stack_algorithm.py | 83 + .../stacks/evaluate_postfix_notations.py | 51 + .../stacks/infix_to_postfix_conversion.py | 69 + .../stacks/infix_to_prefix_conversion.py | 93 + .../data_structures/stacks/linked_stack.py | 159 + .../stacks/next_greater_element.py | 98 + .../stacks/postfix_evaluation.py | 68 + .../stacks/prefix_evaluation.py | 60 + .../data_structures/stacks/right.html | 32 + .../data_structures/stacks/stack.py | 107 + .../data_structures/stacks/stack_using_dll.py | 123 + .../stacks/stock_span_problem.py | 53 + .../data_structures/trie/__init__.py | 0 .../data_structures/trie/right.html | 29 + python-mega-algo/data_structures/trie/trie.py | 127 + .../digital_image_processing/__init__.py | 0 .../change_brightness.py | 26 + .../change_contrast.py | 35 + .../convert_to_negative.py | 29 + .../dithering/__init__.py | 0 .../dithering/burkes.py | 87 + .../dithering/right.html | 29 + .../edge_detection/__init__.py | 0 .../edge_detection/canny.py | 122 + .../edge_detection/right.html | 29 + .../filters/__init__.py | 0 .../filters/bilateral_filter.py | 88 + .../filters/convolve.py | 49 + .../filters/gaussian_filter.py | 54 + .../filters/median_filter.py | 41 + .../filters/right.html | 30 + .../filters/sobel_filter.py | 39 + .../histogram_equalization/__init__.py | 0 .../histogram_stretch.py | 63 + .../image_data/__init__.py | 0 .../image_data/input.jpg | Bin 0 -> 60104 bytes .../image_data/right.html | 29 + .../output_data/__init__.py | 0 .../output_data/output.jpg | Bin 0 -> 118463 bytes .../output_data/right.html | 29 + .../histogram_equalization/right.html | 29 + .../image_data/__init__.py | 0 .../image_data/lena.jpg | Bin 0 -> 104428 bytes .../image_data/lena_small.jpg | Bin 0 -> 6971 bytes .../image_data/right.html | 29 + .../index_calculation.py | 576 + .../resize/__init__.py | 0 .../digital_image_processing/resize/resize.py | 71 + .../resize/right.html | 29 + .../digital_image_processing/right.html | 31 + .../rotation/__init__.py | 0 .../rotation/right.html | 29 + .../rotation/rotation.py | 56 + .../digital_image_processing/sepia.py | 50 + .../test_digital_image_processing.py | 93 + .../divide_and_conquer/__init__.py | 0 .../closest_pair_of_points.py | 143 + .../divide_and_conquer/convex_hull.py | 506 + .../divide_and_conquer/heaps_algorithm.py | 56 + .../heaps_algorithm_iterative.py | 60 + .../divide_and_conquer/inversions.py | 169 + .../divide_and_conquer/kth_order_statistic.py | 64 + .../divide_and_conquer/max_difference_pair.py | 44 + .../divide_and_conquer/max_subarray_sum.py | 76 + .../divide_and_conquer/mergesort.py | 112 + python-mega-algo/divide_and_conquer/peak.py | 53 + python-mega-algo/divide_and_conquer/power.py | 33 + .../divide_and_conquer/right.html | 32 + .../strassen_matrix_multiplication.py | 171 + .../dynamic_programming/__init__.py | 0 .../dynamic_programming/abbreviation.py | 39 + .../dynamic_programming/bitmask.py | 93 + .../dynamic_programming/climbing_stairs.py | 43 + .../dynamic_programming/edit_distance.py | 105 + .../dynamic_programming/factorial.py | 27 + .../dynamic_programming/fast_fibonacci.py | 38 + .../dynamic_programming/fibonacci.py | 65 + .../dynamic_programming/floyd_warshall.py | 42 + .../fractional_knapsack.py | 27 + .../fractional_knapsack_2.py | 60 + .../dynamic_programming/integer_partition.py | 37 + .../iterating_through_submasks.py | 62 + .../k_means_clustering_tensorflow.py_tf | 147 + .../dynamic_programming/knapsack.py | 150 + .../longest_common_subsequence.py | 83 + .../longest_increasing_subsequence.py | 61 + ...longest_increasing_subsequence_o(nlogn).py | 55 + .../dynamic_programming/longest_sub_array.py | 34 + .../dynamic_programming/matrix_chain_order.py | 54 + .../max_non_adjacent_sum.py | 34 + .../dynamic_programming/max_sub_array.py | 94 + .../max_sum_contiguous_subsequence.py | 20 + .../minimum_coin_change.py | 46 + .../dynamic_programming/minimum_cost_path.py | 37 + .../dynamic_programming/minimum_partition.py | 30 + .../minimum_steps_to_one.py | 65 + .../optimal_binary_search_tree.py | 144 + .../dynamic_programming/right.html | 36 + .../dynamic_programming/rod_cutting.py | 207 + .../dynamic_programming/subset_generation.py | 43 + .../dynamic_programming/sum_of_subset.py | 37 + .../electronics/electric_power.py | 52 + python-mega-algo/electronics/ohms_law.py | 42 + python-mega-algo/electronics/right.html | 29 + python-mega-algo/file_transfer/__init__.py | 0 python-mega-algo/file_transfer/mytext.txt | 6 + .../file_transfer/receive_file.py | 23 + python-mega-algo/file_transfer/right.html | 29 + python-mega-algo/file_transfer/send_file.py | 35 + .../file_transfer/tests/__init__.py | 0 .../file_transfer/tests/right.html | 29 + .../file_transfer/tests/test_send_file.py | 31 + python-mega-algo/fractals/koch_snowflake.py | 116 + python-mega-algo/fractals/mandelbrot.py | 150 + python-mega-algo/fractals/right.html | 29 + .../fractals/sierpinski_triangle.py | 76 + python-mega-algo/fuzzy_logic/__init__.py | 0 .../fuzzy_logic/fuzzy_operations.py | 102 + python-mega-algo/fuzzy_logic/right.html | 29 + .../genetic_algorithm/__init__.py | 0 .../genetic_algorithm/basic_string.py | 175 + python-mega-algo/genetic_algorithm/right.html | 29 + python-mega-algo/geodesy/__init__.py | 0 .../geodesy/haversine_distance.py | 56 + .../geodesy/lamberts_ellipsoidal_distance.py | 86 + python-mega-algo/geodesy/right.html | 29 + python-mega-algo/graphics/__init__.py | 0 python-mega-algo/graphics/bezier_curve.py | 114 + python-mega-algo/graphics/right.html | 29 + .../graphics/vector3_for_2d_rendering.py | 102 + python-mega-algo/graphs/__init__.py | 0 python-mega-algo/graphs/a_star.py | 100 + .../graphs/articulation_points.py | 55 + python-mega-algo/graphs/basic_graphs.py | 283 + python-mega-algo/graphs/bellman_ford.py | 56 + python-mega-algo/graphs/bfs_shortest_path.py | 106 + .../graphs/bfs_zero_one_shortest_path.py | 138 + .../graphs/bidirectional_a_star.py | 257 + .../bidirectional_breadth_first_search.py | 181 + .../graphs/breadth_first_search.py | 91 + .../graphs/breadth_first_search_2.py | 44 + .../breadth_first_search_shortest_path.py | 82 + .../graphs/check_bipartite_graph_bfs.py | 45 + .../graphs/check_bipartite_graph_dfs.py | 34 + .../graphs/connected_components.py | 58 + python-mega-algo/graphs/depth_first_search.py | 49 + .../graphs/depth_first_search_2.py | 65 + python-mega-algo/graphs/dijkstra.py | 118 + python-mega-algo/graphs/dijkstra_2.py | 58 + python-mega-algo/graphs/dijkstra_algorithm.py | 211 + python-mega-algo/graphs/dinic.py | 94 + ...irected_and_undirected_(weighted)_graph.py | 496 + .../edmonds_karp_multiple_source_and_sink.py | 193 + ...n_path_and_circuit_for_undirected_graph.py | 71 + python-mega-algo/graphs/even_tree.py | 59 + python-mega-algo/graphs/finding_bridges.py | 42 + .../graphs/frequent_pattern_graph_miner.py | 232 + python-mega-algo/graphs/g_topological_sort.py | 47 + .../graphs/gale_shapley_bigraph.py | 44 + python-mega-algo/graphs/graph_list.py | 143 + python-mega-algo/graphs/graph_matrix.py | 25 + .../graphs/graphs_floyd_warshall.py | 102 + python-mega-algo/graphs/greedy_best_first.py | 174 + .../graphs/kahns_algorithm_long.py | 31 + .../graphs/kahns_algorithm_topo.py | 36 + python-mega-algo/graphs/karger.py | 86 + python-mega-algo/graphs/markov_chain.py | 83 + .../graphs/minimum_spanning_tree_boruvka.py | 196 + .../graphs/minimum_spanning_tree_kruskal.py | 47 + .../graphs/minimum_spanning_tree_kruskal2.py | 109 + .../graphs/minimum_spanning_tree_prims.py | 116 + .../graphs/minimum_spanning_tree_prims2.py | 271 + .../graphs/multi_heuristic_astar.py | 313 + python-mega-algo/graphs/page_rank.py | 70 + python-mega-algo/graphs/prim.py | 152 + python-mega-algo/graphs/right.html | 40 + python-mega-algo/graphs/scc_kosaraju.py | 51 + .../graphs/strongly_connected_components.py | 92 + python-mega-algo/graphs/tarjans_scc.py | 83 + python-mega-algo/graphs/tests/right.html | 29 + .../tests/test_min_spanning_tree_kruskal.py | 36 + .../tests/test_min_spanning_tree_prim.py | 46 + python-mega-algo/hashes/__init__.py | 0 python-mega-algo/hashes/adler32.py | 29 + python-mega-algo/hashes/chaos_machine.py | 102 + python-mega-algo/hashes/djb2.py | 35 + python-mega-algo/hashes/enigma_machine.py | 59 + python-mega-algo/hashes/hamming_code.py | 296 + python-mega-algo/hashes/md5.py | 238 + python-mega-algo/hashes/right.html | 31 + python-mega-algo/hashes/sdbm.py | 37 + python-mega-algo/hashes/sha1.py | 171 + python-mega-algo/knapsack/README.md | 32 + python-mega-algo/knapsack/__init__.py | 0 python-mega-algo/knapsack/greedy_knapsack.py | 98 + python-mega-algo/knapsack/knapsack.py | 47 + python-mega-algo/knapsack/right.html | 29 + python-mega-algo/knapsack/tests/__init__.py | 0 python-mega-algo/knapsack/tests/right.html | 29 + .../knapsack/tests/test_greedy_knapsack.py | 75 + .../knapsack/tests/test_knapsack.py | 52 + python-mega-algo/linear_algebra/README.md | 75 + python-mega-algo/linear_algebra/__init__.py | 0 python-mega-algo/linear_algebra/right.html | 29 + .../linear_algebra/src/__init__.py | 0 .../linear_algebra/src/conjugate_gradient.py | 178 + python-mega-algo/linear_algebra/src/lib.py | 398 + .../linear_algebra/src/polynom_for_points.py | 129 + .../linear_algebra/src/power_iteration.py | 104 + .../linear_algebra/src/rayleigh_quotient.py | 68 + .../linear_algebra/src/right.html | 30 + .../linear_algebra/src/test_linear_algebra.py | 156 + .../linear_algebra/src/transformations_2d.py | 61 + python-mega-algo/machine_learning/__init__.py | 0 python-mega-algo/machine_learning/astar.py | 150 + .../machine_learning/data_transformations.py | 62 + .../machine_learning/decision_tree.py | 181 + .../machine_learning/forecasting/__init__.py | 0 .../machine_learning/forecasting/ex_data.csv | 114 + .../machine_learning/forecasting/right.html | 29 + .../machine_learning/forecasting/run.py | 156 + .../machine_learning/gaussian_naive_bayes.py | 44 + .../gradient_boosting_regressor.py | 66 + .../machine_learning/gradient_descent.py | 136 + .../machine_learning/k_means_clust.py | 353 + .../machine_learning/k_nearest_neighbours.py | 58 + .../machine_learning/knn_sklearn.py | 31 + .../linear_discriminant_analysis.py | 405 + .../machine_learning/linear_regression.py | 106 + .../machine_learning/logistic_regression.py | 87 + .../machine_learning/lstm/__init__.py | 0 .../machine_learning/lstm/lstm_prediction.py | 54 + .../machine_learning/lstm/right.html | 29 + .../machine_learning/lstm/sample_data.csv | 1259 + .../multilayer_perceptron_classifier.py | 29 + .../machine_learning/polymonial_regression.py | 45 + .../random_forest_classifier.py | 44 + .../random_forest_regressor.py | 40 + python-mega-algo/machine_learning/right.html | 34 + .../machine_learning/scoring_functions.py | 141 + .../sequential_minimum_optimization.py | 632 + .../machine_learning/similarity_search.py | 140 + .../support_vector_machines.py | 58 + .../word_frequency_functions.py | 137 + python-mega-algo/maths/3n_plus_1.py | 149 + python-mega-algo/maths/__init__.py | 0 python-mega-algo/maths/abs.py | 28 + python-mega-algo/maths/abs_max.py | 35 + python-mega-algo/maths/abs_min.py | 24 + python-mega-algo/maths/add.py | 19 + python-mega-algo/maths/aliquot_sum.py | 48 + python-mega-algo/maths/allocation_number.py | 49 + python-mega-algo/maths/area.py | 288 + python-mega-algo/maths/area_under_curve.py | 59 + python-mega-algo/maths/armstrong_numbers.py | 69 + python-mega-algo/maths/average_mean.py | 20 + python-mega-algo/maths/average_median.py | 35 + python-mega-algo/maths/average_mode.py | 31 + .../maths/bailey_borwein_plouffe.py | 89 + python-mega-algo/maths/basic_maths.py | 80 + python-mega-algo/maths/binary_exp_mod.py | 28 + .../maths/binary_exponentiation.py | 28 + .../maths/binary_exponentiation_2.py | 50 + .../maths/binary_exponentiation_3.py | 50 + .../maths/binomial_coefficient.py | 20 + .../maths/binomial_distribution.py | 40 + python-mega-algo/maths/bisection.py | 63 + python-mega-algo/maths/ceil.py | 24 + .../maths/chudnovsky_algorithm.py | 60 + python-mega-algo/maths/collatz_sequence.py | 44 + python-mega-algo/maths/combinations.py | 58 + python-mega-algo/maths/decimal_isolate.py | 45 + python-mega-algo/maths/entropy.py | 131 + python-mega-algo/maths/euclidean_distance.py | 62 + python-mega-algo/maths/euclidean_gcd.py | 47 + python-mega-algo/maths/euler_method.py | 40 + python-mega-algo/maths/eulers_totient.py | 45 + .../maths/extended_euclidean_algorithm.py | 85 + python-mega-algo/maths/factorial_iterative.py | 30 + python-mega-algo/maths/factorial_python.py | 34 + python-mega-algo/maths/factorial_recursive.py | 28 + python-mega-algo/maths/factors.py | 18 + .../maths/fermat_little_theorem.py | 31 + python-mega-algo/maths/fibonacci.py | 130 + .../maths/fibonacci_sequence_recursion.py | 22 + python-mega-algo/maths/find_max.py | 25 + python-mega-algo/maths/find_max_recursion.py | 25 + python-mega-algo/maths/find_min.py | 26 + python-mega-algo/maths/find_min_recursion.py | 25 + python-mega-algo/maths/floor.py | 22 + python-mega-algo/maths/gamma.py | 63 + python-mega-algo/maths/gaussian.py | 61 + .../maths/greatest_common_divisor.py | 77 + python-mega-algo/maths/greedy_coin_change.py | 102 + python-mega-algo/maths/hardy_ramanujanalgo.py | 45 + python-mega-algo/maths/images/__init__.py | 0 python-mega-algo/maths/images/gaussian.png | Bin 0 -> 53511 bytes python-mega-algo/maths/images/right.html | 29 + .../maths/integration_by_simpson_approx.py | 126 + python-mega-algo/maths/is_square_free.py | 39 + python-mega-algo/maths/jaccard_similarity.py | 80 + python-mega-algo/maths/kadanes.py | 65 + python-mega-algo/maths/karatsuba.py | 32 + .../maths/krishnamurthy_number.py | 49 + .../maths/kth_lexicographic_permutation.py | 40 + .../maths/largest_of_very_large_numbers.py | 35 + .../maths/largest_subarray_sum.py | 23 + .../maths/least_common_multiple.py | 95 + python-mega-algo/maths/line_length.py | 65 + .../maths/lucas_lehmer_primality_test.py | 41 + python-mega-algo/maths/lucas_series.py | 66 + .../maths/matrix_exponentiation.py | 100 + .../maths/max_sum_sliding_window.py | 45 + .../maths/median_of_two_arrays.py | 33 + python-mega-algo/maths/miller_rabin.py | 50 + python-mega-algo/maths/mobius_function.py | 43 + python-mega-algo/maths/modular_exponential.py | 45 + python-mega-algo/maths/monte_carlo.py | 129 + python-mega-algo/maths/monte_carlo_dice.py | 47 + python-mega-algo/maths/newton_raphson.py | 54 + python-mega-algo/maths/number_of_digits.py | 159 + .../maths/numerical_integration.py | 66 + python-mega-algo/maths/perfect_cube.py | 16 + python-mega-algo/maths/perfect_number.py | 34 + python-mega-algo/maths/perfect_square.py | 73 + .../maths/pi_monte_carlo_estimation.py | 67 + .../maths/polynomial_evaluation.py | 54 + .../maths/power_using_recursion.py | 36 + python-mega-algo/maths/prime_check.py | 58 + python-mega-algo/maths/prime_factors.py | 52 + python-mega-algo/maths/prime_numbers.py | 70 + .../maths/prime_sieve_eratosthenes.py | 47 + python-mega-algo/maths/primelib.py | 644 + python-mega-algo/maths/pythagoras.py | 33 + python-mega-algo/maths/qr_decomposition.py | 71 + .../quadratic_equations_complex_numbers.py | 38 + python-mega-algo/maths/radians.py | 29 + python-mega-algo/maths/radix2_fft.py | 180 + python-mega-algo/maths/relu.py | 40 + python-mega-algo/maths/right.html | 56 + python-mega-algo/maths/runge_kutta.py | 44 + python-mega-algo/maths/segmented_sieve.py | 51 + python-mega-algo/maths/series/__init__.py | 0 .../maths/series/arithmetic_mean.py | 66 + .../maths/series/geometric_mean.py | 75 + .../maths/series/geometric_series.py | 63 + .../maths/series/harmonic_series.py | 46 + python-mega-algo/maths/series/p_series.py | 48 + python-mega-algo/maths/series/right.html | 30 + .../maths/sieve_of_eratosthenes.py | 65 + python-mega-algo/maths/sigmoid.py | 39 + python-mega-algo/maths/simpson_rule.py | 51 + python-mega-algo/maths/softmax.py | 56 + python-mega-algo/maths/square_root.py | 64 + .../maths/sum_of_arithmetic_series.py | 23 + python-mega-algo/maths/sum_of_digits.py | 149 + .../maths/sum_of_geometric_progression.py | 28 + python-mega-algo/maths/test_prime_check.py | 8 + python-mega-algo/maths/trapezoidal_rule.py | 50 + python-mega-algo/maths/triplet_sum.py | 89 + python-mega-algo/maths/two_pointer.py | 61 + python-mega-algo/maths/two_sum.py | 47 + python-mega-algo/maths/ugly_numbers.py | 54 + python-mega-algo/maths/volume.py | 132 + python-mega-algo/maths/zellers_congruence.py | 158 + python-mega-algo/matrix/__init__.py | 0 .../matrix/count_islands_in_matrix.py | 36 + python-mega-algo/matrix/inverse_of_matrix.py | 40 + python-mega-algo/matrix/matrix_class.py | 358 + python-mega-algo/matrix/matrix_operation.py | 184 + ...h_fibonacci_using_matrix_exponentiation.py | 91 + python-mega-algo/matrix/right.html | 31 + python-mega-algo/matrix/rotate_matrix.py | 101 + .../matrix/searching_in_sorted_matrix.py | 46 + python-mega-algo/matrix/sherman_morrison.py | 268 + python-mega-algo/matrix/spiral_print.py | 68 + python-mega-algo/matrix/tests/__init__.py | 0 python-mega-algo/matrix/tests/pytest.ini | 3 + python-mega-algo/matrix/tests/right.html | 29 + .../matrix/tests/test_matrix_operation.py | 120 + python-mega-algo/mypy.ini | 5 + python-mega-algo/networking_flow/__init__.py | 0 .../networking_flow/ford_fulkerson.py | 61 + .../networking_flow/minimum_cut.py | 66 + python-mega-algo/networking_flow/right.html | 29 + .../2_hidden_layers_neural_network.py | 295 + python-mega-algo/neural_network/__init__.py | 0 .../back_propagation_neural_network.py | 199 + .../convolution_neural_network.py | 355 + python-mega-algo/neural_network/gan.py_tf | 506 + .../neural_network/input_data.py_tf | 345 + python-mega-algo/neural_network/perceptron.py | 238 + python-mega-algo/neural_network/right.html | 30 + python-mega-algo/other/__init__.py | 0 python-mega-algo/other/activity_selection.py | 46 + ...42\200\223logemann\342\200\223loveland.py" | 357 + .../other/dijkstra_bankers_algorithm.py | 225 + python-mega-algo/other/doomsday.py | 59 + .../other/fischer_yates_shuffle.py | 24 + python-mega-algo/other/gauss_easter.py | 59 + python-mega-algo/other/graham_scan.py | 171 + python-mega-algo/other/greedy.py | 63 + python-mega-algo/other/least_recently_used.py | 64 + python-mega-algo/other/lfu_cache.py | 187 + .../other/linear_congruential_generator.py | 37 + python-mega-algo/other/lru_cache.py | 193 + python-mega-algo/other/magicdiamondpattern.py | 55 + python-mega-algo/other/nested_brackets.py | 47 + python-mega-algo/other/password_generator.py | 77 + python-mega-algo/other/right.html | 33 + python-mega-algo/other/scoring_algorithm.py | 89 + python-mega-algo/other/sdes.py | 97 + python-mega-algo/other/tower_of_hanoi.py | 28 + python-mega-algo/physics/n_body_simulation.py | 348 + python-mega-algo/physics/right.html | 29 + python-mega-algo/project_euler/README.md | 118 + python-mega-algo/project_euler/__init__.py | 0 .../project_euler/problem_001/__init__.py | 0 .../project_euler/problem_001/right.html | 30 + .../project_euler/problem_001/sol1.py | 33 + .../project_euler/problem_001/sol2.py | 38 + .../project_euler/problem_001/sol3.py | 64 + .../project_euler/problem_001/sol4.py | 52 + .../project_euler/problem_001/sol5.py | 32 + .../project_euler/problem_001/sol6.py | 39 + .../project_euler/problem_001/sol7.py | 37 + .../project_euler/problem_002/__init__.py | 0 .../project_euler/problem_002/right.html | 30 + .../project_euler/problem_002/sol1.py | 48 + .../project_euler/problem_002/sol2.py | 46 + .../project_euler/problem_002/sol3.py | 48 + .../project_euler/problem_002/sol4.py | 72 + .../project_euler/problem_002/sol5.py | 52 + .../project_euler/problem_003/__init__.py | 0 .../project_euler/problem_003/right.html | 29 + .../project_euler/problem_003/sol1.py | 104 + .../project_euler/problem_003/sol2.py | 64 + .../project_euler/problem_003/sol3.py | 66 + .../project_euler/problem_004/__init__.py | 0 .../project_euler/problem_004/right.html | 29 + .../project_euler/problem_004/sol1.py | 53 + .../project_euler/problem_004/sol2.py | 39 + .../project_euler/problem_005/__init__.py | 0 .../project_euler/problem_005/right.html | 29 + .../project_euler/problem_005/sol1.py | 69 + .../project_euler/problem_005/sol2.py | 75 + .../project_euler/problem_006/__init__.py | 0 .../project_euler/problem_006/right.html | 30 + .../project_euler/problem_006/sol1.py | 44 + .../project_euler/problem_006/sol2.py | 41 + .../project_euler/problem_006/sol3.py | 42 + .../project_euler/problem_006/sol4.py | 41 + .../project_euler/problem_007/__init__.py | 0 .../project_euler/problem_007/right.html | 29 + .../project_euler/problem_007/sol1.py | 76 + .../project_euler/problem_007/sol2.py | 88 + .../project_euler/problem_007/sol3.py | 68 + .../project_euler/problem_008/__init__.py | 0 .../project_euler/problem_008/right.html | 29 + .../project_euler/problem_008/sol1.py | 82 + .../project_euler/problem_008/sol2.py | 81 + .../project_euler/problem_008/sol3.py | 94 + .../project_euler/problem_009/__init__.py | 0 .../project_euler/problem_009/right.html | 29 + .../project_euler/problem_009/sol1.py | 79 + .../project_euler/problem_009/sol2.py | 48 + .../project_euler/problem_009/sol3.py | 41 + .../project_euler/problem_010/__init__.py | 0 .../project_euler/problem_010/right.html | 29 + .../project_euler/problem_010/sol1.py | 65 + .../project_euler/problem_010/sol2.py | 67 + .../project_euler/problem_010/sol3.py | 61 + .../project_euler/problem_011/__init__.py | 0 .../project_euler/problem_011/grid.txt | 20 + .../project_euler/problem_011/right.html | 29 + .../project_euler/problem_011/sol1.py | 88 + .../project_euler/problem_011/sol2.py | 75 + .../project_euler/problem_012/__init__.py | 0 .../project_euler/problem_012/right.html | 29 + .../project_euler/problem_012/sol1.py | 60 + .../project_euler/problem_012/sol2.py | 47 + .../project_euler/problem_013/__init__.py | 0 .../project_euler/problem_013/num.txt | 100 + .../project_euler/problem_013/right.html | 29 + .../project_euler/problem_013/sol1.py | 25 + .../project_euler/problem_014/__init__.py | 0 .../project_euler/problem_014/right.html | 29 + .../project_euler/problem_014/sol1.py | 60 + .../project_euler/problem_014/sol2.py | 62 + .../project_euler/problem_015/__init__.py | 0 .../project_euler/problem_015/right.html | 29 + .../project_euler/problem_015/sol1.py | 44 + .../project_euler/problem_016/__init__.py | 0 .../project_euler/problem_016/right.html | 29 + .../project_euler/problem_016/sol1.py | 36 + .../project_euler/problem_016/sol2.py | 30 + .../project_euler/problem_017/__init__.py | 0 .../project_euler/problem_017/right.html | 29 + .../project_euler/problem_017/sol1.py | 63 + .../project_euler/problem_018/__init__.py | 0 .../project_euler/problem_018/right.html | 29 + .../project_euler/problem_018/solution.py | 64 + .../project_euler/problem_018/triangle.txt | 15 + .../project_euler/problem_019/__init__.py | 0 .../project_euler/problem_019/right.html | 29 + .../project_euler/problem_019/sol1.py | 64 + .../project_euler/problem_020/__init__.py | 0 .../project_euler/problem_020/right.html | 30 + .../project_euler/problem_020/sol1.py | 54 + .../project_euler/problem_020/sol2.py | 35 + .../project_euler/problem_020/sol3.py | 41 + .../project_euler/problem_020/sol4.py | 42 + .../project_euler/problem_021/__init__.py | 0 .../project_euler/problem_021/right.html | 29 + .../project_euler/problem_021/sol1.py | 54 + .../project_euler/problem_022/__init__.py | 0 .../project_euler/problem_022/p022_names.txt | 1 + .../project_euler/problem_022/right.html | 29 + .../project_euler/problem_022/sol1.py | 45 + .../project_euler/problem_022/sol2.py | 42 + .../project_euler/problem_023/__init__.py | 0 .../project_euler/problem_023/right.html | 29 + .../project_euler/problem_023/sol1.py | 52 + .../project_euler/problem_024/__init__.py | 0 .../project_euler/problem_024/right.html | 29 + .../project_euler/problem_024/sol1.py | 27 + .../project_euler/problem_025/__init__.py | 0 .../project_euler/problem_025/right.html | 29 + .../project_euler/problem_025/sol1.py | 101 + .../project_euler/problem_025/sol2.py | 71 + .../project_euler/problem_025/sol3.py | 56 + .../project_euler/problem_026/__init__.py | 0 .../project_euler/problem_026/right.html | 29 + .../project_euler/problem_026/sol1.py | 60 + .../project_euler/problem_027/__init__.py | 0 .../project_euler/problem_027/right.html | 29 + .../project_euler/problem_027/sol1.py | 74 + .../project_euler/problem_028/__init__.py | 0 .../project_euler/problem_028/right.html | 29 + .../project_euler/problem_028/sol1.py | 58 + .../project_euler/problem_029/__init__.py | 0 .../project_euler/problem_029/right.html | 29 + .../project_euler/problem_029/sol1.py | 50 + .../project_euler/problem_030/__init__.py | 0 .../project_euler/problem_030/right.html | 29 + .../project_euler/problem_030/sol1.py | 39 + .../project_euler/problem_031/__init__.py | 0 .../project_euler/problem_031/right.html | 29 + .../project_euler/problem_031/sol1.py | 65 + .../project_euler/problem_031/sol2.py | 59 + .../project_euler/problem_032/__init__.py | 0 .../project_euler/problem_032/right.html | 29 + .../project_euler/problem_032/sol32.py | 58 + .../project_euler/problem_033/__init__.py | 0 .../project_euler/problem_033/right.html | 29 + .../project_euler/problem_033/sol1.py | 68 + .../project_euler/problem_034/__init__.py | 1 + .../project_euler/problem_034/right.html | 29 + .../project_euler/problem_034/sol1.py | 36 + .../project_euler/problem_035/__init__.py | 1 + .../project_euler/problem_035/right.html | 29 + .../project_euler/problem_035/sol1.py | 82 + .../project_euler/problem_036/__init__.py | 0 .../project_euler/problem_036/right.html | 29 + .../project_euler/problem_036/sol1.py | 69 + .../project_euler/problem_037/__init__.py | 1 + .../project_euler/problem_037/right.html | 29 + .../project_euler/problem_037/sol1.py | 98 + .../project_euler/problem_038/__init__.py | 0 .../project_euler/problem_038/right.html | 29 + .../project_euler/problem_038/sol1.py | 77 + .../project_euler/problem_039/__init__.py | 1 + .../project_euler/problem_039/right.html | 29 + .../project_euler/problem_039/sol1.py | 55 + .../project_euler/problem_040/__init__.py | 0 .../project_euler/problem_040/right.html | 29 + .../project_euler/problem_040/sol1.py | 45 + .../project_euler/problem_041/__init__.py | 1 + .../project_euler/problem_041/right.html | 29 + .../project_euler/problem_041/sol1.py | 56 + .../project_euler/problem_042/__init__.py | 0 .../project_euler/problem_042/right.html | 29 + .../project_euler/problem_042/solution42.py | 47 + .../project_euler/problem_042/words.txt | 1 + .../project_euler/problem_043/__init__.py | 1 + .../project_euler/problem_043/right.html | 29 + .../project_euler/problem_043/sol1.py | 60 + .../project_euler/problem_044/__init__.py | 1 + .../project_euler/problem_044/right.html | 29 + .../project_euler/problem_044/sol1.py | 47 + .../project_euler/problem_045/__init__.py | 1 + .../project_euler/problem_045/right.html | 29 + .../project_euler/problem_045/sol1.py | 59 + .../project_euler/problem_046/__init__.py | 1 + .../project_euler/problem_046/right.html | 29 + .../project_euler/problem_046/sol1.py | 95 + .../project_euler/problem_047/__init__.py | 0 .../project_euler/problem_047/right.html | 29 + .../project_euler/problem_047/sol1.py | 112 + .../project_euler/problem_048/__init__.py | 0 .../project_euler/problem_048/right.html | 29 + .../project_euler/problem_048/sol1.py | 25 + .../project_euler/problem_049/__init__.py | 0 .../project_euler/problem_049/right.html | 29 + .../project_euler/problem_049/sol1.py | 139 + .../project_euler/problem_050/__init__.py | 0 .../project_euler/problem_050/right.html | 29 + .../project_euler/problem_050/sol1.py | 85 + .../project_euler/problem_051/__init__.py | 0 .../project_euler/problem_051/right.html | 29 + .../project_euler/problem_051/sol1.py | 111 + .../project_euler/problem_052/__init__.py | 0 .../project_euler/problem_052/right.html | 29 + .../project_euler/problem_052/sol1.py | 37 + .../project_euler/problem_053/__init__.py | 0 .../project_euler/problem_053/right.html | 29 + .../project_euler/problem_053/sol1.py | 43 + .../project_euler/problem_054/__init__.py | 0 .../project_euler/problem_054/poker_hands.txt | 1000 + .../project_euler/problem_054/right.html | 29 + .../project_euler/problem_054/sol1.py | 381 + .../problem_054/test_poker_hand.py | 228 + .../project_euler/problem_055/__init__.py | 1 + .../project_euler/problem_055/right.html | 29 + .../project_euler/problem_055/sol1.py | 81 + .../project_euler/problem_056/__init__.py | 0 .../project_euler/problem_056/right.html | 29 + .../project_euler/problem_056/sol1.py | 45 + .../project_euler/problem_057/__init__.py | 0 .../project_euler/problem_057/right.html | 29 + .../project_euler/problem_057/sol1.py | 48 + .../project_euler/problem_058/__init__.py | 1 + .../project_euler/problem_058/right.html | 29 + .../project_euler/problem_058/sol1.py | 86 + .../project_euler/problem_059/__init__.py | 0 .../project_euler/problem_059/p059_cipher.txt | 1 + .../project_euler/problem_059/right.html | 29 + .../project_euler/problem_059/sol1.py | 128 + .../project_euler/problem_059/test_cipher.txt | 1 + .../project_euler/problem_062/__init__.py | 0 .../project_euler/problem_062/right.html | 29 + .../project_euler/problem_062/sol1.py | 62 + .../project_euler/problem_063/__init__.py | 1 + .../project_euler/problem_063/right.html | 29 + .../project_euler/problem_063/sol1.py | 34 + .../project_euler/problem_064/__init__.py | 0 .../project_euler/problem_064/right.html | 29 + .../project_euler/problem_064/sol1.py | 77 + .../project_euler/problem_065/__init__.py | 0 .../project_euler/problem_065/right.html | 29 + .../project_euler/problem_065/sol1.py | 99 + .../project_euler/problem_067/__init__.py | 0 .../project_euler/problem_067/right.html | 29 + .../project_euler/problem_067/sol1.py | 49 + .../project_euler/problem_067/triangle.txt | 100 + .../project_euler/problem_069/__init__.py | 0 .../project_euler/problem_069/right.html | 29 + .../project_euler/problem_069/sol1.py | 66 + .../project_euler/problem_070/__init__.py | 0 .../project_euler/problem_070/right.html | 29 + .../project_euler/problem_070/sol1.py | 119 + .../project_euler/problem_071/__init__.py | 0 .../project_euler/problem_071/right.html | 29 + .../project_euler/problem_071/sol1.py | 48 + .../project_euler/problem_072/__init__.py | 0 .../project_euler/problem_072/right.html | 29 + .../project_euler/problem_072/sol1.py | 46 + .../project_euler/problem_072/sol2.py | 45 + .../project_euler/problem_074/__init__.py | 0 .../project_euler/problem_074/right.html | 29 + .../project_euler/problem_074/sol1.py | 110 + .../project_euler/problem_074/sol2.py | 126 + .../project_euler/problem_075/__init__.py | 0 .../project_euler/problem_075/right.html | 29 + .../project_euler/problem_075/sol1.py | 60 + .../project_euler/problem_076/__init__.py | 0 .../project_euler/problem_076/right.html | 29 + .../project_euler/problem_076/sol1.py | 55 + .../project_euler/problem_077/__init__.py | 0 .../project_euler/problem_077/right.html | 29 + .../project_euler/problem_077/sol1.py | 81 + .../project_euler/problem_080/__init__.py | 0 .../project_euler/problem_080/right.html | 29 + .../project_euler/problem_080/sol1.py | 37 + .../project_euler/problem_081/__init__.py | 0 .../project_euler/problem_081/matrix.txt | 80 + .../project_euler/problem_081/right.html | 29 + .../project_euler/problem_081/sol1.py | 47 + .../project_euler/problem_085/__init__.py | 0 .../project_euler/problem_085/right.html | 29 + .../project_euler/problem_085/sol1.py | 108 + .../project_euler/problem_086/__init__.py | 0 .../project_euler/problem_086/right.html | 29 + .../project_euler/problem_086/sol1.py | 105 + .../project_euler/problem_087/__init__.py | 0 .../project_euler/problem_087/right.html | 29 + .../project_euler/problem_087/sol1.py | 52 + .../project_euler/problem_089/__init__.py | 1 + .../problem_089/numeralcleanup_test.txt | 5 + .../project_euler/problem_089/p089_roman.txt | 1000 + .../project_euler/problem_089/right.html | 29 + .../project_euler/problem_089/sol1.py | 141 + .../project_euler/problem_091/__init__.py | 0 .../project_euler/problem_091/right.html | 29 + .../project_euler/problem_091/sol1.py | 59 + .../project_euler/problem_097/__init__.py | 1 + .../project_euler/problem_097/right.html | 29 + .../project_euler/problem_097/sol1.py | 46 + .../project_euler/problem_099/__init__.py | 0 .../project_euler/problem_099/base_exp.txt | 1000 + .../project_euler/problem_099/right.html | 29 + .../project_euler/problem_099/sol1.py | 34 + .../project_euler/problem_101/__init__.py | 0 .../project_euler/problem_101/right.html | 29 + .../project_euler/problem_101/sol1.py | 219 + .../project_euler/problem_102/__init__.py | 0 .../problem_102/p102_triangles.txt | 1000 + .../project_euler/problem_102/right.html | 29 + .../project_euler/problem_102/sol1.py | 81 + .../problem_102/test_triangles.txt | 2 + .../project_euler/problem_107/__init__.py | 0 .../problem_107/p107_network.txt | 40 + .../project_euler/problem_107/right.html | 29 + .../project_euler/problem_107/sol1.py | 128 + .../problem_107/test_network.txt | 7 + .../project_euler/problem_109/__init__.py | 0 .../project_euler/problem_109/right.html | 29 + .../project_euler/problem_109/sol1.py | 89 + .../project_euler/problem_112/__init__.py | 0 .../project_euler/problem_112/right.html | 29 + .../project_euler/problem_112/sol1.py | 89 + .../project_euler/problem_113/__init__.py | 0 .../project_euler/problem_113/right.html | 29 + .../project_euler/problem_113/sol1.py | 75 + .../project_euler/problem_119/__init__.py | 0 .../project_euler/problem_119/right.html | 29 + .../project_euler/problem_119/sol1.py | 51 + .../project_euler/problem_120/__init__.py | 0 .../project_euler/problem_120/right.html | 29 + .../project_euler/problem_120/sol1.py | 32 + .../project_euler/problem_121/__init__.py | 0 .../project_euler/problem_121/right.html | 29 + .../project_euler/problem_121/sol1.py | 64 + .../project_euler/problem_123/__init__.py | 0 .../project_euler/problem_123/right.html | 29 + .../project_euler/problem_123/sol1.py | 99 + .../project_euler/problem_125/__init__.py | 0 .../project_euler/problem_125/right.html | 29 + .../project_euler/problem_125/sol1.py | 56 + .../project_euler/problem_129/__init__.py | 0 .../project_euler/problem_129/right.html | 29 + .../project_euler/problem_129/sol1.py | 57 + .../project_euler/problem_135/__init__.py | 0 .../project_euler/problem_135/right.html | 29 + .../project_euler/problem_135/sol1.py | 61 + .../project_euler/problem_173/__init__.py | 0 .../project_euler/problem_173/right.html | 29 + .../project_euler/problem_173/sol1.py | 41 + .../project_euler/problem_174/__init__.py | 0 .../project_euler/problem_174/right.html | 29 + .../project_euler/problem_174/sol1.py | 52 + .../project_euler/problem_180/__init__.py | 0 .../project_euler/problem_180/right.html | 29 + .../project_euler/problem_180/sol1.py | 174 + .../project_euler/problem_188/__init__.py | 0 .../project_euler/problem_188/right.html | 29 + .../project_euler/problem_188/sol1.py | 68 + .../project_euler/problem_191/__init__.py | 0 .../project_euler/problem_191/right.html | 29 + .../project_euler/problem_191/sol1.py | 105 + .../project_euler/problem_203/__init__.py | 0 .../project_euler/problem_203/right.html | 29 + .../project_euler/problem_203/sol1.py | 188 + .../project_euler/problem_206/__init__.py | 0 .../project_euler/problem_206/right.html | 29 + .../project_euler/problem_206/sol1.py | 74 + .../project_euler/problem_207/__init__.py | 0 .../project_euler/problem_207/right.html | 29 + .../project_euler/problem_207/sol1.py | 98 + .../project_euler/problem_234/__init__.py | 0 .../project_euler/problem_234/right.html | 29 + .../project_euler/problem_234/sol1.py | 119 + .../project_euler/problem_301/__init__.py | 0 .../project_euler/problem_301/right.html | 29 + .../project_euler/problem_301/sol1.py | 58 + .../project_euler/problem_551/__init__.py | 0 .../project_euler/problem_551/right.html | 29 + .../project_euler/problem_551/sol1.py | 200 + python-mega-algo/project_euler/right.html | 55 + python-mega-algo/pytest.ini | 5 + python-mega-algo/quantum/README.md | 15 + python-mega-algo/quantum/__init__.py | 0 python-mega-algo/quantum/deutsch_jozsa.py | 122 + python-mega-algo/quantum/half_adder.py | 59 + python-mega-algo/quantum/not_gate.py | 41 + .../quantum/quantum_entanglement.py | 58 + python-mega-algo/quantum/right.html | 30 + .../quantum/ripple_adder_classic.py | 108 + .../quantum/single_qubit_measure.py | 34 + python-mega-algo/requirements.txt | 17 + python-mega-algo/right.html | 39 + python-mega-algo/scheduling/__init__.py | 0 .../scheduling/first_come_first_served.py | 108 + python-mega-algo/scheduling/right.html | 29 + python-mega-algo/scheduling/round_robin.py | 65 + .../scheduling/shortest_job_first.py | 151 + python-mega-algo/scripts/__init__.py | 0 .../scripts/build_directory_md.py | 45 + .../scripts/project_euler_answers.json | 727 + python-mega-algo/scripts/right.html | 30 + .../scripts/validate_filenames.py | 36 + .../scripts/validate_solutions.py | 96 + python-mega-algo/searches/__init__.py | 0 python-mega-algo/searches/binary_search.py | 308 + .../searches/binary_tree_traversal.py | 307 + .../searches/double_linear_search.py | 37 + .../double_linear_search_recursion.py | 35 + python-mega-algo/searches/fibonacci_search.py | 132 + python-mega-algo/searches/hill_climbing.py | 197 + .../searches/interpolation_search.py | 140 + python-mega-algo/searches/jump_search.py | 52 + python-mega-algo/searches/linear_search.py | 77 + python-mega-algo/searches/quick_select.py | 61 + python-mega-algo/searches/right.html | 33 + .../searches/sentinel_linear_search.py | 58 + .../searches/simple_binary_search.py | 59 + .../searches/simulated_annealing.py | 136 + python-mega-algo/searches/tabu_search.py | 292 + python-mega-algo/searches/tabu_test_data.txt | 10 + python-mega-algo/searches/ternary_search.py | 170 + python-mega-algo/sorts/__init__.py | 0 python-mega-algo/sorts/bead_sort.py | 43 + python-mega-algo/sorts/bitonic_sort.py | 96 + python-mega-algo/sorts/bogo_sort.py | 49 + python-mega-algo/sorts/bubble_sort.py | 52 + python-mega-algo/sorts/bucket_sort.py | 68 + .../sorts/cocktail_shaker_sort.py | 46 + python-mega-algo/sorts/comb_sort.py | 64 + python-mega-algo/sorts/counting_sort.py | 73 + python-mega-algo/sorts/cycle_sort.py | 53 + python-mega-algo/sorts/double_sort.py | 42 + python-mega-algo/sorts/external_sort.py | 157 + python-mega-algo/sorts/gnome_sort.py | 56 + python-mega-algo/sorts/heap_sort.py | 58 + python-mega-algo/sorts/insertion_sort.py | 60 + python-mega-algo/sorts/intro_sort.py | 173 + .../sorts/iterative_merge_sort.py | 73 + .../sorts/merge_insertion_sort.py | 179 + python-mega-algo/sorts/merge_sort.py | 53 + python-mega-algo/sorts/msd_radix_sort.py | 160 + python-mega-algo/sorts/natural_sort.py | 36 + .../sorts/normal_distribution_quick_sort.md | 75 + python-mega-algo/sorts/odd_even_sort.py | 47 + .../sorts/odd_even_transposition_parallel.py | 144 + .../odd_even_transposition_single_threaded.py | 33 + python-mega-algo/sorts/pancake_sort.py | 39 + python-mega-algo/sorts/patience_sort.py | 65 + python-mega-algo/sorts/pigeon_sort.py | 60 + python-mega-algo/sorts/pigeonhole_sort.py | 45 + python-mega-algo/sorts/quick_sort.py | 40 + .../sorts/quick_sort_3_partition.py | 101 + python-mega-algo/sorts/radix_sort.py | 52 + .../random_normal_distribution_quicksort.py | 64 + .../sorts/random_pivot_quick_sort.py | 44 + .../sorts/recursive_bubble_sort.py | 42 + .../sorts/recursive_insertion_sort.py | 77 + .../sorts/recursive_mergesort_array.py | 64 + .../sorts/recursive_quick_sort.py | 22 + python-mega-algo/sorts/right.html | 40 + python-mega-algo/sorts/selection_sort.py | 46 + python-mega-algo/sorts/shell_sort.py | 40 + python-mega-algo/sorts/slowsort.py | 63 + python-mega-algo/sorts/stooge_sort.py | 40 + python-mega-algo/sorts/strand_sort.py | 51 + python-mega-algo/sorts/tim_sort.py | 83 + python-mega-algo/sorts/topological_sort.py | 35 + python-mega-algo/sorts/tree_sort.py | 53 + python-mega-algo/sorts/unknown_sort.py | 40 + python-mega-algo/sorts/wiggle_sort.py | 38 + python-mega-algo/strings/__init__.py | 0 python-mega-algo/strings/aho_corasick.py | 93 + python-mega-algo/strings/anagrams.py | 35 + .../strings/autocomplete_using_trie.py | 64 + .../strings/boyer_moore_search.py | 86 + .../can_string_be_rearranged_as_palindrome.py | 115 + python-mega-algo/strings/capitalize.py | 27 + python-mega-algo/strings/check_anagrams.py | 33 + python-mega-algo/strings/check_pangram.py | 74 + .../detecting_english_programmatically.py | 61 + python-mega-algo/strings/dictionary.txt | 45334 +++ python-mega-algo/strings/frequency_finder.py | 120 + python-mega-algo/strings/is_palindrome.py | 28 + python-mega-algo/strings/jaro_winkler.py | 78 + .../strings/knuth_morris_pratt.py | 83 + .../strings/levenshtein_distance.py | 72 + python-mega-algo/strings/lower.py | 26 + python-mega-algo/strings/manacher.py | 107 + .../strings/min_cost_string_conversion.py | 131 + .../strings/naive_string_search.py | 42 + python-mega-algo/strings/palindrome.py | 66 + python-mega-algo/strings/prefix_function.py | 65 + python-mega-algo/strings/rabin_karp.py | 90 + python-mega-algo/strings/remove_duplicate.py | 15 + python-mega-algo/strings/reverse_letters.py | 19 + python-mega-algo/strings/reverse_words.py | 15 + python-mega-algo/strings/right.html | 37 + python-mega-algo/strings/split.py | 34 + python-mega-algo/strings/swap_case.py | 37 + python-mega-algo/strings/upper.py | 24 + python-mega-algo/strings/word_occurrence.py | 26 + python-mega-algo/strings/word_patterns.py | 44 + python-mega-algo/strings/words.txt | 235886 +++++++++++++++ python-mega-algo/strings/z_function.py | 90 + python-mega-algo/web_programming/__init__.py | 0 .../web_programming/co2_emission.py | 25 + .../web_programming/covid_stats_via_xpath.py | 23 + .../web_programming/crawl_google_results.py | 24 + .../crawl_google_scholar_citation.py | 32 + .../web_programming/currency_converter.py | 192 + .../web_programming/current_stock_price.py | 14 + .../web_programming/current_weather.py | 30 + .../web_programming/daily_horoscope.py | 35 + .../web_programming/emails_from_url.py | 104 + .../web_programming/fetch_bbc_news.py | 17 + .../web_programming/fetch_github_info.py | 50 + .../web_programming/fetch_jobs.py | 25 + .../get_imdb_top_250_movies_csv.py | 30 + .../web_programming/get_imdbtop.py | 20 + .../web_programming/instagram_crawler.py | 140 + .../web_programming/instagram_pic.py | 16 + .../web_programming/instagram_video.py | 17 + .../web_programming/recaptcha_verification.py | 66 + python-mega-algo/web_programming/right.html | 34 + .../web_programming/slack_message.py | 19 + .../web_programming/test_fetch_github_info.py | 27 + .../web_programming/world_covid19_stats.py | 27 + right.html | 22 + 1480 files changed, 389179 insertions(+) create mode 100644 DOCS/_static/basic.css create mode 100644 DOCS/_static/classic.css create mode 100644 DOCS/_static/copybutton.js create mode 100644 DOCS/_static/default.css create mode 100644 DOCS/_static/doctools.js create mode 100644 DOCS/_static/documentation_options.js create mode 100644 DOCS/_static/file.png create mode 100644 DOCS/_static/jquery.js create mode 100644 DOCS/_static/language_data.js create mode 100644 DOCS/_static/py.png create mode 100644 DOCS/_static/pydoctheme.css create mode 100644 DOCS/_static/pygments.css create mode 100644 DOCS/_static/right.html create mode 100644 DOCS/_static/sidebar.js create mode 100644 DOCS/_static/switchers.js create mode 100644 DOCS/_static/underscore.js create mode 100644 DOCS/right.html create mode 100644 DOCS/tutorial/appendix.html create mode 100644 DOCS/tutorial/appetite.html create mode 100644 DOCS/tutorial/classes.html create mode 100644 DOCS/tutorial/controlflow.html create mode 100644 DOCS/tutorial/datastructures.html create mode 100644 DOCS/tutorial/directory.html create mode 100644 DOCS/tutorial/errors.html create mode 100644 DOCS/tutorial/floatingpoint.html create mode 100644 DOCS/tutorial/index.html create mode 100644 DOCS/tutorial/inputoutput.html create mode 100644 DOCS/tutorial/interactive.html create mode 100644 DOCS/tutorial/interpreter.html create mode 100644 DOCS/tutorial/introduction.html create mode 100644 DOCS/tutorial/left.html create mode 100644 DOCS/tutorial/modules.html create mode 100644 DOCS/tutorial/right.html create mode 100644 DOCS/tutorial/stdlib.html create mode 100644 DOCS/tutorial/stdlib2.html create mode 100644 DOCS/tutorial/venv.html create mode 100644 DOCS/tutorial/whatnow.html create mode 100644 README.md create mode 100644 index.html create mode 100644 learn-python3-samples/advance/do_generator.py create mode 100644 learn-python3-samples/advance/do_iter.py create mode 100644 learn-python3-samples/advance/do_listcompr.py create mode 100644 learn-python3-samples/advance/do_slice.py create mode 100644 learn-python3-samples/advance/do_yield.py create mode 100644 learn-python3-samples/advance/right.html create mode 100644 learn-python3-samples/async/aio_web.py create mode 100644 learn-python3-samples/async/async_hello.py create mode 100644 learn-python3-samples/async/async_hello2.py create mode 100644 learn-python3-samples/async/async_wget.py create mode 100644 learn-python3-samples/async/async_wget2.py create mode 100644 learn-python3-samples/async/coroutine.py create mode 100644 learn-python3-samples/async/right.html create mode 100644 learn-python3-samples/basic/do_for.py create mode 100644 learn-python3-samples/basic/do_if.py create mode 100644 learn-python3-samples/basic/do_input.py create mode 100644 learn-python3-samples/basic/do_print.py create mode 100644 learn-python3-samples/basic/do_while.py create mode 100644 learn-python3-samples/basic/hello.py create mode 100644 learn-python3-samples/basic/right.html create mode 100644 learn-python3-samples/basic/the_dict.py create mode 100644 learn-python3-samples/basic/the_list.py create mode 100644 learn-python3-samples/basic/the_set.py create mode 100644 learn-python3-samples/basic/the_string.py create mode 100644 learn-python3-samples/basic/the_tuple.py create mode 100644 learn-python3-samples/commonlib/check_bmp.py create mode 100644 learn-python3-samples/commonlib/do_base64.py create mode 100644 learn-python3-samples/commonlib/right.html create mode 100644 learn-python3-samples/commonlib/use_chainmap.py create mode 100644 learn-python3-samples/commonlib/use_collections.py create mode 100644 learn-python3-samples/commonlib/use_datetime.py create mode 100644 learn-python3-samples/commonlib/use_hashlib.py create mode 100644 learn-python3-samples/commonlib/use_htmlparser.py create mode 100644 learn-python3-samples/commonlib/use_itertools.py create mode 100644 learn-python3-samples/commonlib/use_sax.py create mode 100644 learn-python3-samples/commonlib/use_urllib.py create mode 100644 learn-python3-samples/context/do_closing.py create mode 100644 learn-python3-samples/context/do_suppress.py create mode 100644 learn-python3-samples/context/do_with.py create mode 100644 learn-python3-samples/context/right.html create mode 100644 learn-python3-samples/db/do_mysql.py create mode 100644 learn-python3-samples/db/do_sqlalchemy.py create mode 100644 learn-python3-samples/db/do_sqlite.py create mode 100644 learn-python3-samples/db/right.html create mode 100644 learn-python3-samples/debug/do_assert.py create mode 100644 learn-python3-samples/debug/do_logging.py create mode 100644 learn-python3-samples/debug/do_pdb.py create mode 100644 learn-python3-samples/debug/do_try.py create mode 100644 learn-python3-samples/debug/err.py create mode 100644 learn-python3-samples/debug/err_logging.py create mode 100644 learn-python3-samples/debug/err_raise.py create mode 100644 learn-python3-samples/debug/err_reraise.py create mode 100644 learn-python3-samples/debug/mydict.py create mode 100644 learn-python3-samples/debug/mydict2.py create mode 100644 learn-python3-samples/debug/mydict_test.py create mode 100644 learn-python3-samples/debug/right.html create mode 100644 learn-python3-samples/function/call_func.py create mode 100644 learn-python3-samples/function/def_func.py create mode 100644 learn-python3-samples/function/kw_args.py create mode 100644 learn-python3-samples/function/recur.py create mode 100644 learn-python3-samples/function/right.html create mode 100644 learn-python3-samples/function/var_args.py create mode 100644 learn-python3-samples/functional/decorator.py create mode 100644 learn-python3-samples/functional/do_filter.py create mode 100644 learn-python3-samples/functional/do_map.py create mode 100644 learn-python3-samples/functional/do_partial.py create mode 100644 learn-python3-samples/functional/do_reduce.py create mode 100644 learn-python3-samples/functional/do_sorted.py create mode 100644 learn-python3-samples/functional/prime_numbers.py create mode 100644 learn-python3-samples/functional/return_func.py create mode 100644 learn-python3-samples/functional/right.html create mode 100644 learn-python3-samples/gui/hello_gui.py create mode 100644 learn-python3-samples/gui/right.html create mode 100644 learn-python3-samples/gui/turtle/rect.py create mode 100644 learn-python3-samples/gui/turtle/right.html create mode 100644 learn-python3-samples/gui/turtle/stars.py create mode 100644 learn-python3-samples/gui/turtle/tree.py create mode 100644 learn-python3-samples/io/do_bytesio.py create mode 100644 learn-python3-samples/io/do_dir.py create mode 100644 learn-python3-samples/io/do_stringio.py create mode 100644 learn-python3-samples/io/right.html create mode 100644 learn-python3-samples/io/use_json.py create mode 100644 learn-python3-samples/io/use_pickle.py create mode 100644 learn-python3-samples/io/with_file.py create mode 100644 learn-python3-samples/mail/fetch_mail.py create mode 100644 learn-python3-samples/mail/right.html create mode 100644 learn-python3-samples/mail/send_mail.py create mode 100644 learn-python3-samples/micropython/hellorobot/.vscode/extensions.json create mode 100644 learn-python3-samples/micropython/hellorobot/.vscode/launch.json create mode 100644 learn-python3-samples/micropython/hellorobot/.vscode/settings.json create mode 100644 learn-python3-samples/micropython/hellorobot/main.py create mode 100644 learn-python3-samples/micropython/hellorobot/right.html create mode 100644 learn-python3-samples/micropython/rccar/.vscode/extensions.json create mode 100644 learn-python3-samples/micropython/rccar/.vscode/launch.json create mode 100644 learn-python3-samples/micropython/rccar/.vscode/settings.json create mode 100644 learn-python3-samples/micropython/rccar/devices.py create mode 100644 learn-python3-samples/micropython/rccar/main.py create mode 100644 learn-python3-samples/micropython/rccar/right.html create mode 100644 learn-python3-samples/micropython/right.html create mode 100644 learn-python3-samples/micropython/smallcar/.vscode/extensions.json create mode 100644 learn-python3-samples/micropython/smallcar/.vscode/launch.json create mode 100644 learn-python3-samples/micropython/smallcar/.vscode/settings.json create mode 100644 learn-python3-samples/micropython/smallcar/main.py create mode 100644 learn-python3-samples/micropython/smallcar/right.html create mode 100644 learn-python3-samples/micropython/tank/.vscode/extensions.json create mode 100644 learn-python3-samples/micropython/tank/.vscode/launch.json create mode 100644 learn-python3-samples/micropython/tank/.vscode/settings.json create mode 100644 learn-python3-samples/micropython/tank/cannon.wav create mode 100644 learn-python3-samples/micropython/tank/devices.py create mode 100644 learn-python3-samples/micropython/tank/joystick.py create mode 100644 learn-python3-samples/micropython/tank/main.py create mode 100644 learn-python3-samples/micropython/tank/right.html create mode 100644 learn-python3-samples/module/hello.py create mode 100644 learn-python3-samples/module/right.html create mode 100644 learn-python3-samples/multitask/do_folk.py create mode 100644 learn-python3-samples/multitask/do_lock.py create mode 100644 learn-python3-samples/multitask/do_queue.py create mode 100644 learn-python3-samples/multitask/do_subprocess.py create mode 100644 learn-python3-samples/multitask/multi_processing.py create mode 100644 learn-python3-samples/multitask/multi_threading.py create mode 100644 learn-python3-samples/multitask/pooled_processing.py create mode 100644 learn-python3-samples/multitask/right.html create mode 100644 learn-python3-samples/multitask/task_master.py create mode 100644 learn-python3-samples/multitask/task_worker.py create mode 100644 learn-python3-samples/multitask/use_threadlocal.py create mode 100644 learn-python3-samples/oop_advance/create_class_on_the_fly.py create mode 100644 learn-python3-samples/oop_advance/orm.py create mode 100644 learn-python3-samples/oop_advance/right.html create mode 100644 learn-python3-samples/oop_advance/special_call.py create mode 100644 learn-python3-samples/oop_advance/special_getattr.py create mode 100644 learn-python3-samples/oop_advance/special_getitem.py create mode 100644 learn-python3-samples/oop_advance/special_iter.py create mode 100644 learn-python3-samples/oop_advance/special_str.py create mode 100644 learn-python3-samples/oop_advance/use_enum.py create mode 100644 learn-python3-samples/oop_advance/use_metaclass.py create mode 100644 learn-python3-samples/oop_advance/use_property.py create mode 100644 learn-python3-samples/oop_advance/use_slots.py create mode 100644 learn-python3-samples/oop_basic/animals.py create mode 100644 learn-python3-samples/oop_basic/attrs.py create mode 100644 learn-python3-samples/oop_basic/get_instance.py create mode 100644 learn-python3-samples/oop_basic/get_type.py create mode 100644 learn-python3-samples/oop_basic/protected_student.py create mode 100644 learn-python3-samples/oop_basic/right.html create mode 100644 learn-python3-samples/oop_basic/student.py create mode 100644 learn-python3-samples/regex/regex.py create mode 100644 learn-python3-samples/regex/right.html create mode 100644 learn-python3-samples/right.html create mode 100644 learn-python3-samples/socket/do_tcp.py create mode 100644 learn-python3-samples/socket/right.html create mode 100644 learn-python3-samples/socket/udp_client.py create mode 100644 learn-python3-samples/socket/udp_server.py create mode 100644 learn-python3-samples/test/dict_doctest.py create mode 100644 learn-python3-samples/test/dict_unittest.py create mode 100644 learn-python3-samples/test/right.html create mode 100644 learn-python3-samples/web/do_flask.py create mode 100644 learn-python3-samples/web/do_wsgi.py create mode 100644 learn-python3-samples/web/hello.py create mode 100644 learn-python3-samples/web/mvc/app.py create mode 100644 learn-python3-samples/web/mvc/right.html create mode 100644 learn-python3-samples/web/mvc/templates/form.html create mode 100644 learn-python3-samples/web/mvc/templates/home.html create mode 100644 learn-python3-samples/web/mvc/templates/right.html create mode 100644 learn-python3-samples/web/mvc/templates/signin-ok.html create mode 100644 learn-python3-samples/web/right.html create mode 100644 left.html create mode 100644 prac-4-beginners/code/05-interactive-code/m-n-m/.idea/.gitignore create mode 100644 prac-4-beginners/code/05-interactive-code/m-n-m/.idea/.name create mode 100644 prac-4-beginners/code/05-interactive-code/m-n-m/.idea/M&M Guessing.iml create mode 100644 prac-4-beginners/code/05-interactive-code/m-n-m/.idea/inspectionProfiles/profiles_settings.xml create mode 100644 prac-4-beginners/code/05-interactive-code/m-n-m/.idea/misc.xml create mode 100644 prac-4-beginners/code/05-interactive-code/m-n-m/.idea/modules.xml create mode 100644 prac-4-beginners/code/05-interactive-code/m-n-m/.idea/vcs.xml create mode 100644 prac-4-beginners/code/05-interactive-code/m-n-m/guessinggame.py create mode 100644 prac-4-beginners/code/05-interactive-code/m-n-m/right.html create mode 100644 prac-4-beginners/code/05-interactive-code/right.html create mode 100644 prac-4-beginners/code/06-organizing-code-with-functions/right.html create mode 100644 prac-4-beginners/code/06-organizing-code-with-functions/rocks-game/.idea/.gitignore create mode 100644 prac-4-beginners/code/06-organizing-code-with-functions/rocks-game/.idea/.name create mode 100644 prac-4-beginners/code/06-organizing-code-with-functions/rocks-game/.idea/RPS Functions.iml create mode 100644 prac-4-beginners/code/06-organizing-code-with-functions/rocks-game/.idea/inspectionProfiles/profiles_settings.xml create mode 100644 prac-4-beginners/code/06-organizing-code-with-functions/rocks-game/.idea/misc.xml create mode 100644 prac-4-beginners/code/06-organizing-code-with-functions/rocks-game/.idea/modules.xml create mode 100644 prac-4-beginners/code/06-organizing-code-with-functions/rocks-game/.idea/vcs.xml create mode 100644 prac-4-beginners/code/06-organizing-code-with-functions/rocks-game/right.html create mode 100644 prac-4-beginners/code/06-organizing-code-with-functions/rocks-game/rpsgame.py create mode 100644 prac-4-beginners/code/07-data-structures/right.html create mode 100644 prac-4-beginners/code/07-data-structures/rocks-game/.idea/.gitignore create mode 100644 prac-4-beginners/code/07-data-structures/rocks-game/.idea/.name create mode 100644 prac-4-beginners/code/07-data-structures/rocks-game/.idea/RPS Data Structures.iml create mode 100644 prac-4-beginners/code/07-data-structures/rocks-game/.idea/inspectionProfiles/profiles_settings.xml create mode 100644 prac-4-beginners/code/07-data-structures/rocks-game/.idea/modules.xml create mode 100644 prac-4-beginners/code/07-data-structures/rocks-game/.idea/vcs.xml create mode 100644 prac-4-beginners/code/07-data-structures/rocks-game/right.html create mode 100644 prac-4-beginners/code/07-data-structures/rocks-game/rpsgame.py create mode 100644 prac-4-beginners/code/07-data-structures/simple_dict/.idea/.gitignore create mode 100644 prac-4-beginners/code/07-data-structures/simple_dict/.idea/.name create mode 100644 prac-4-beginners/code/07-data-structures/simple_dict/.idea/Data Structure Exploration.iml create mode 100644 prac-4-beginners/code/07-data-structures/simple_dict/playground.py create mode 100644 prac-4-beginners/code/07-data-structures/simple_dict/right.html create mode 100644 prac-4-beginners/code/08-problem-solving/right.html create mode 100644 prac-4-beginners/code/08-problem-solving/tictactoe/.idea/.gitignore create mode 100644 prac-4-beginners/code/08-problem-solving/tictactoe/.idea/.name create mode 100644 prac-4-beginners/code/08-problem-solving/tictactoe/.idea/dictionaries/screencaster.xml create mode 100644 prac-4-beginners/code/08-problem-solving/tictactoe/game.py create mode 100644 prac-4-beginners/code/08-problem-solving/tictactoe/right.html create mode 100644 prac-4-beginners/code/09-working-with-files/right.html create mode 100644 prac-4-beginners/code/09-working-with-files/rocks-game/.idea/.gitignore create mode 100644 prac-4-beginners/code/09-working-with-files/rocks-game/.idea/.name create mode 100644 prac-4-beginners/code/09-working-with-files/rocks-game/.idea/RPS File IO.iml create mode 100644 prac-4-beginners/code/09-working-with-files/rocks-game/.idea/dictionaries/screencaster.xml create mode 100644 prac-4-beginners/code/09-working-with-files/rocks-game/.idea/inspectionProfiles/profiles_settings.xml create mode 100644 prac-4-beginners/code/09-working-with-files/rocks-game/.idea/misc.xml create mode 100644 prac-4-beginners/code/09-working-with-files/rocks-game/.idea/modules.xml create mode 100644 prac-4-beginners/code/09-working-with-files/rocks-game/.idea/vcs.xml create mode 100644 prac-4-beginners/code/09-working-with-files/rocks-game/right.html create mode 100644 prac-4-beginners/code/09-working-with-files/rocks-game/rolls.json create mode 100644 prac-4-beginners/code/09-working-with-files/rocks-game/rpsgame.py create mode 100644 prac-4-beginners/code/10-external-libraries/right.html create mode 100644 prac-4-beginners/code/10-external-libraries/rocks-game/.idea/.gitignore create mode 100644 prac-4-beginners/code/10-external-libraries/rocks-game/.idea/.name create mode 100644 prac-4-beginners/code/10-external-libraries/rocks-game/.idea/RPS External Libs.iml create mode 100644 prac-4-beginners/code/10-external-libraries/rocks-game/.idea/dictionaries/mkennedy.xml create mode 100644 prac-4-beginners/code/10-external-libraries/rocks-game/.idea/dictionaries/screencaster.xml create mode 100644 prac-4-beginners/code/10-external-libraries/rocks-game/.idea/inspectionProfiles/profiles_settings.xml create mode 100644 prac-4-beginners/code/10-external-libraries/rocks-game/.idea/misc.xml create mode 100644 prac-4-beginners/code/10-external-libraries/rocks-game/.idea/modules.xml create mode 100644 prac-4-beginners/code/10-external-libraries/rocks-game/.idea/vcs.xml create mode 100644 prac-4-beginners/code/10-external-libraries/rocks-game/requirements.txt create mode 100644 prac-4-beginners/code/10-external-libraries/rocks-game/right.html create mode 100644 prac-4-beginners/code/10-external-libraries/rocks-game/rolls.json create mode 100644 prac-4-beginners/code/10-external-libraries/rocks-game/rpsgame.py create mode 100644 prac-4-beginners/code/11-error-handling/right.html create mode 100644 prac-4-beginners/code/11-error-handling/rocks-game/.idea/.gitignore create mode 100644 prac-4-beginners/code/11-error-handling/rocks-game/.idea/.name create mode 100644 prac-4-beginners/code/11-error-handling/rocks-game/.idea/RPS Error Handling.iml create mode 100644 prac-4-beginners/code/11-error-handling/rocks-game/.idea/dictionaries/screencaster.xml create mode 100644 prac-4-beginners/code/11-error-handling/rocks-game/.idea/inspectionProfiles/profiles_settings.xml create mode 100644 prac-4-beginners/code/11-error-handling/rocks-game/.idea/modules.xml create mode 100644 prac-4-beginners/code/11-error-handling/rocks-game/.idea/vcs.xml create mode 100644 prac-4-beginners/code/11-error-handling/rocks-game/requirements.txt create mode 100644 prac-4-beginners/code/11-error-handling/rocks-game/right.html create mode 100644 prac-4-beginners/code/11-error-handling/rocks-game/rolls.json create mode 100644 prac-4-beginners/code/11-error-handling/rocks-game/rpsgame.py create mode 100644 prac-4-beginners/code/right.html create mode 100644 prac-4-beginners/practices/ch04_first_lines/readme.md create mode 100644 prac-4-beginners/practices/ch04_first_lines/right.html create mode 100644 prac-4-beginners/practices/ch05_interactive_code/readme.md create mode 100644 prac-4-beginners/practices/ch05_interactive_code/right.html create mode 100644 prac-4-beginners/practices/ch06-organizing-code-with-functions/guessinggame.py create mode 100644 prac-4-beginners/practices/ch06-organizing-code-with-functions/readme.md create mode 100644 prac-4-beginners/practices/ch06-organizing-code-with-functions/right.html create mode 100644 prac-4-beginners/practices/ch07_data_structures/readme.md create mode 100644 prac-4-beginners/practices/ch07_data_structures/right.html create mode 100644 prac-4-beginners/practices/ch08_problem_solving/readme.md create mode 100644 prac-4-beginners/practices/ch08_problem_solving/readme_files/Connect_4_Board_and_Box.jpg create mode 100644 prac-4-beginners/practices/ch08_problem_solving/readme_files/right.html create mode 100644 prac-4-beginners/practices/ch08_problem_solving/right.html create mode 100644 prac-4-beginners/practices/ch09_working_with_files/readme.md create mode 100644 prac-4-beginners/practices/ch09_working_with_files/right.html create mode 100644 prac-4-beginners/practices/ch10_external_libraries/readme.md create mode 100644 prac-4-beginners/practices/ch10_external_libraries/right.html create mode 100644 prac-4-beginners/practices/ch11-error-handling/readme.md create mode 100644 prac-4-beginners/practices/ch11-error-handling/right.html create mode 100644 prac-4-beginners/practices/readme.md create mode 100644 prac-4-beginners/practices/right.html create mode 100644 prac-4-beginners/readme_resources/absolute-beginners.jpg create mode 100644 prac-4-beginners/readme_resources/right.html create mode 100644 prac-4-beginners/right.html create mode 100644 prac-4-beginners/solutions/ch-04-writing-your-first-lines-of-code/right.html create mode 100644 prac-4-beginners/solutions/ch-04-writing-your-first-lines-of-code/step_1.md create mode 100644 prac-4-beginners/solutions/ch-04-writing-your-first-lines-of-code/step_2.md create mode 100644 prac-4-beginners/solutions/ch-04-writing-your-first-lines-of-code/step_3.md create mode 100644 prac-4-beginners/solutions/ch-04-writing-your-first-lines-of-code/step_4.md create mode 100644 prac-4-beginners/solutions/ch-04-writing-your-first-lines-of-code/step_5.png create mode 100644 prac-4-beginners/solutions/ch-05-interactive-code/hello_world.py create mode 100644 prac-4-beginners/solutions/ch-05-interactive-code/right.html create mode 100644 prac-4-beginners/solutions/ch-05-interactive-code/step_1.md create mode 100644 prac-4-beginners/solutions/ch-05-interactive-code/step_2_even_odd.py create mode 100644 prac-4-beginners/solutions/ch-05-interactive-code/step_3_even_odd_a_lot.py create mode 100644 prac-4-beginners/solutions/ch-05-interactive-code/step_4.png create mode 100644 prac-4-beginners/solutions/ch-06-organizing-code-with-functions/guessinggame.py create mode 100644 prac-4-beginners/solutions/ch-06-organizing-code-with-functions/right.html create mode 100644 prac-4-beginners/solutions/ch-07-data-structures/dictionary_program.py create mode 100644 prac-4-beginners/solutions/ch-07-data-structures/right.html create mode 100644 prac-4-beginners/solutions/ch-08-problem-solving/connect4.py create mode 100644 prac-4-beginners/solutions/ch-08-problem-solving/readme.md create mode 100644 prac-4-beginners/solutions/ch-08-problem-solving/right.html create mode 100644 prac-4-beginners/solutions/ch-09-working-with-files/connect4_files.py create mode 100644 prac-4-beginners/solutions/ch-09-working-with-files/right.html create mode 100644 prac-4-beginners/solutions/ch-10-external-libraries/connect4_color.py create mode 100644 prac-4-beginners/solutions/ch-10-external-libraries/requirements.txt create mode 100644 prac-4-beginners/solutions/ch-10-external-libraries/right.html create mode 100644 prac-4-beginners/solutions/ch-11-error-handling/readme.md create mode 100644 prac-4-beginners/solutions/ch-11-error-handling/right.html create mode 100644 prac-4-beginners/solutions/ch-11-error-handling/tictactoe_errors_handled.py create mode 100644 prac-4-beginners/solutions/readme.md create mode 100644 prac-4-beginners/solutions/right.html create mode 100644 python-mega-algo/.coveragerc create mode 100644 python-mega-algo/.gitattributes create mode 100644 python-mega-algo/.gitignore create mode 100644 python-mega-algo/.gitpod.yml create mode 100644 python-mega-algo/README.md create mode 100644 python-mega-algo/arithmetic_analysis/__init__.py create mode 100644 python-mega-algo/arithmetic_analysis/bisection.py create mode 100644 python-mega-algo/arithmetic_analysis/gaussian_elimination.py create mode 100644 python-mega-algo/arithmetic_analysis/image_data/2D_problems.jpg create mode 100644 python-mega-algo/arithmetic_analysis/image_data/2D_problems_1.jpg create mode 100644 python-mega-algo/arithmetic_analysis/image_data/__init__.py create mode 100644 python-mega-algo/arithmetic_analysis/image_data/right.html create mode 100644 python-mega-algo/arithmetic_analysis/in_static_equilibrium.py create mode 100644 python-mega-algo/arithmetic_analysis/intersection.py create mode 100644 python-mega-algo/arithmetic_analysis/lu_decomposition.py create mode 100644 python-mega-algo/arithmetic_analysis/newton_forward_interpolation.py create mode 100644 python-mega-algo/arithmetic_analysis/newton_method.py create mode 100644 python-mega-algo/arithmetic_analysis/newton_raphson.py create mode 100644 python-mega-algo/arithmetic_analysis/right.html create mode 100644 python-mega-algo/arithmetic_analysis/secant_method.py create mode 100644 python-mega-algo/backtracking/__init__.py create mode 100644 python-mega-algo/backtracking/all_combinations.py create mode 100644 python-mega-algo/backtracking/all_permutations.py create mode 100644 python-mega-algo/backtracking/all_subsequences.py create mode 100644 python-mega-algo/backtracking/coloring.py create mode 100644 python-mega-algo/backtracking/hamiltonian_cycle.py create mode 100644 python-mega-algo/backtracking/knight_tour.py create mode 100644 python-mega-algo/backtracking/minimax.py create mode 100644 python-mega-algo/backtracking/n_queens.py create mode 100644 python-mega-algo/backtracking/n_queens_math.py create mode 100644 python-mega-algo/backtracking/rat_in_maze.py create mode 100644 python-mega-algo/backtracking/right.html create mode 100644 python-mega-algo/backtracking/sudoku.py create mode 100644 python-mega-algo/backtracking/sum_of_subsets.py create mode 100644 python-mega-algo/bit_manipulation/README.md create mode 100644 python-mega-algo/bit_manipulation/__init__.py create mode 100644 python-mega-algo/bit_manipulation/binary_and_operator.py create mode 100644 python-mega-algo/bit_manipulation/binary_count_setbits.py create mode 100644 python-mega-algo/bit_manipulation/binary_count_trailing_zeros.py create mode 100644 python-mega-algo/bit_manipulation/binary_or_operator.py create mode 100644 python-mega-algo/bit_manipulation/binary_shifts.py create mode 100644 python-mega-algo/bit_manipulation/binary_twos_complement.py create mode 100644 python-mega-algo/bit_manipulation/binary_xor_operator.py create mode 100644 python-mega-algo/bit_manipulation/count_number_of_one_bits.py create mode 100644 python-mega-algo/bit_manipulation/reverse_bits.py create mode 100644 python-mega-algo/bit_manipulation/right.html create mode 100644 python-mega-algo/bit_manipulation/single_bit_manipulation_operations.py create mode 100644 python-mega-algo/blockchain/__init__.py create mode 100644 python-mega-algo/blockchain/chinese_remainder_theorem.py create mode 100644 python-mega-algo/blockchain/diophantine_equation.py create mode 100644 python-mega-algo/blockchain/modular_division.py create mode 100644 python-mega-algo/blockchain/right.html create mode 100644 python-mega-algo/boolean_algebra/__init__.py create mode 100644 python-mega-algo/boolean_algebra/quine_mc_cluskey.py create mode 100644 python-mega-algo/boolean_algebra/right.html create mode 100644 python-mega-algo/cellular_automata/README.md create mode 100644 python-mega-algo/cellular_automata/__init__.py create mode 100644 python-mega-algo/cellular_automata/conways_game_of_life.py create mode 100644 python-mega-algo/cellular_automata/game_of_life.py create mode 100644 python-mega-algo/cellular_automata/one_dimensional.py create mode 100644 python-mega-algo/cellular_automata/right.html create mode 100644 python-mega-algo/ciphers/__init__.py create mode 100644 python-mega-algo/ciphers/a1z26.py create mode 100644 python-mega-algo/ciphers/affine_cipher.py create mode 100644 python-mega-algo/ciphers/atbash.py create mode 100644 python-mega-algo/ciphers/base16.py create mode 100644 python-mega-algo/ciphers/base32.py create mode 100644 python-mega-algo/ciphers/base64_encoding.py create mode 100644 python-mega-algo/ciphers/base85.py create mode 100644 python-mega-algo/ciphers/beaufort_cipher.py create mode 100644 python-mega-algo/ciphers/brute_force_caesar_cipher.py create mode 100644 python-mega-algo/ciphers/caesar_cipher.py create mode 100644 python-mega-algo/ciphers/cryptomath_module.py create mode 100644 python-mega-algo/ciphers/decrypt_caesar_with_chi_squared.py create mode 100644 python-mega-algo/ciphers/deterministic_miller_rabin.py create mode 100644 python-mega-algo/ciphers/diffie.py create mode 100644 python-mega-algo/ciphers/diffie_hellman.py create mode 100644 python-mega-algo/ciphers/elgamal_key_generator.py create mode 100644 python-mega-algo/ciphers/enigma_machine2.py create mode 100644 python-mega-algo/ciphers/hill_cipher.py create mode 100644 python-mega-algo/ciphers/mixed_keyword_cypher.py create mode 100644 python-mega-algo/ciphers/mono_alphabetic_ciphers.py create mode 100644 python-mega-algo/ciphers/morse_code_implementation.py create mode 100644 python-mega-algo/ciphers/onepad_cipher.py create mode 100644 python-mega-algo/ciphers/playfair_cipher.py create mode 100644 python-mega-algo/ciphers/porta_cipher.py create mode 100644 python-mega-algo/ciphers/prehistoric_men.txt create mode 100644 python-mega-algo/ciphers/rabin_miller.py create mode 100644 python-mega-algo/ciphers/rail_fence_cipher.py create mode 100644 python-mega-algo/ciphers/right.html create mode 100644 python-mega-algo/ciphers/rot13.py create mode 100644 python-mega-algo/ciphers/rsa_cipher.py create mode 100644 python-mega-algo/ciphers/rsa_factorization.py create mode 100644 python-mega-algo/ciphers/rsa_key_generator.py create mode 100644 python-mega-algo/ciphers/shuffled_shift_cipher.py create mode 100644 python-mega-algo/ciphers/simple_keyword_cypher.py create mode 100644 python-mega-algo/ciphers/simple_substitution_cipher.py create mode 100644 python-mega-algo/ciphers/trafid_cipher.py create mode 100644 python-mega-algo/ciphers/transposition_cipher.py create mode 100644 python-mega-algo/ciphers/transposition_cipher_encrypt_decrypt_file.py create mode 100644 python-mega-algo/ciphers/vigenere_cipher.py create mode 100644 python-mega-algo/ciphers/xor_cipher.py create mode 100644 python-mega-algo/compression/__init__.py create mode 100644 python-mega-algo/compression/burrows_wheeler.py create mode 100644 python-mega-algo/compression/huffman.py create mode 100644 python-mega-algo/compression/image_data/PSNR-example-base.png create mode 100644 python-mega-algo/compression/image_data/PSNR-example-comp-10.jpg create mode 100644 python-mega-algo/compression/image_data/__init__.py create mode 100644 python-mega-algo/compression/image_data/compressed_image.png create mode 100644 python-mega-algo/compression/image_data/example_image.jpg create mode 100644 python-mega-algo/compression/image_data/example_wikipedia_image.jpg create mode 100644 python-mega-algo/compression/image_data/original_image.png create mode 100644 python-mega-algo/compression/image_data/right.html create mode 100644 python-mega-algo/compression/lempel_ziv.py create mode 100644 python-mega-algo/compression/lempel_ziv_decompress.py create mode 100644 python-mega-algo/compression/peak_signal_to_noise_ratio.py create mode 100644 python-mega-algo/compression/right.html create mode 100644 python-mega-algo/computer_vision/README.md create mode 100644 python-mega-algo/computer_vision/__init__.py create mode 100644 python-mega-algo/computer_vision/harriscorner.py create mode 100644 python-mega-algo/computer_vision/meanthreshold.py create mode 100644 python-mega-algo/computer_vision/right.html create mode 100644 python-mega-algo/conversions/__init__.py create mode 100644 python-mega-algo/conversions/binary_to_decimal.py create mode 100644 python-mega-algo/conversions/binary_to_octal.py create mode 100644 python-mega-algo/conversions/decimal_to_any.py create mode 100644 python-mega-algo/conversions/decimal_to_binary.py create mode 100644 python-mega-algo/conversions/decimal_to_binary_recursion.py create mode 100644 python-mega-algo/conversions/decimal_to_hexadecimal.py create mode 100644 python-mega-algo/conversions/decimal_to_octal.py create mode 100644 python-mega-algo/conversions/hex_to_bin.py create mode 100644 python-mega-algo/conversions/hexadecimal_to_decimal.py create mode 100644 python-mega-algo/conversions/molecular_chemistry.py create mode 100644 python-mega-algo/conversions/octal_to_decimal.py create mode 100644 python-mega-algo/conversions/prefix_conversions.py create mode 100644 python-mega-algo/conversions/rgb_hsv_conversion.py create mode 100644 python-mega-algo/conversions/right.html create mode 100644 python-mega-algo/conversions/roman_numerals.py create mode 100644 python-mega-algo/conversions/temperature_conversions.py create mode 100644 python-mega-algo/conversions/weight_conversion.py create mode 100644 python-mega-algo/data_structures/__init__.py create mode 100644 python-mega-algo/data_structures/binary_tree/__init__.py create mode 100644 python-mega-algo/data_structures/binary_tree/avl_tree.py create mode 100644 python-mega-algo/data_structures/binary_tree/basic_binary_tree.py create mode 100644 python-mega-algo/data_structures/binary_tree/binary_search_tree.py create mode 100644 python-mega-algo/data_structures/binary_tree/binary_search_tree_recursive.py create mode 100644 python-mega-algo/data_structures/binary_tree/binary_tree_mirror.py create mode 100644 python-mega-algo/data_structures/binary_tree/binary_tree_traversals.py create mode 100644 python-mega-algo/data_structures/binary_tree/fenwick_tree.py create mode 100644 python-mega-algo/data_structures/binary_tree/lazy_segment_tree.py create mode 100644 python-mega-algo/data_structures/binary_tree/lowest_common_ancestor.py create mode 100644 python-mega-algo/data_structures/binary_tree/merge_two_binary_trees.py create mode 100644 python-mega-algo/data_structures/binary_tree/non_recursive_segment_tree.py create mode 100644 python-mega-algo/data_structures/binary_tree/number_of_possible_binary_trees.py create mode 100644 python-mega-algo/data_structures/binary_tree/red_black_tree.py create mode 100644 python-mega-algo/data_structures/binary_tree/right.html create mode 100644 python-mega-algo/data_structures/binary_tree/segment_tree.py create mode 100644 python-mega-algo/data_structures/binary_tree/segment_tree_other.py create mode 100644 python-mega-algo/data_structures/binary_tree/treap.py create mode 100644 python-mega-algo/data_structures/disjoint_set/__init__.py create mode 100644 python-mega-algo/data_structures/disjoint_set/alternate_disjoint_set.py create mode 100644 python-mega-algo/data_structures/disjoint_set/disjoint_set.py create mode 100644 python-mega-algo/data_structures/disjoint_set/right.html create mode 100644 python-mega-algo/data_structures/hashing/__init__.py create mode 100644 python-mega-algo/data_structures/hashing/double_hash.py create mode 100644 python-mega-algo/data_structures/hashing/hash_table.py create mode 100644 python-mega-algo/data_structures/hashing/hash_table_with_linked_list.py create mode 100644 python-mega-algo/data_structures/hashing/number_theory/__init__.py create mode 100644 python-mega-algo/data_structures/hashing/number_theory/prime_numbers.py create mode 100644 python-mega-algo/data_structures/hashing/number_theory/right.html create mode 100644 python-mega-algo/data_structures/hashing/quadratic_probing.py create mode 100644 python-mega-algo/data_structures/hashing/right.html create mode 100644 python-mega-algo/data_structures/heap/__init__.py create mode 100644 python-mega-algo/data_structures/heap/binomial_heap.py create mode 100644 python-mega-algo/data_structures/heap/heap.py create mode 100644 python-mega-algo/data_structures/heap/heap_generic.py create mode 100644 python-mega-algo/data_structures/heap/max_heap.py create mode 100644 python-mega-algo/data_structures/heap/min_heap.py create mode 100644 python-mega-algo/data_structures/heap/randomized_heap.py create mode 100644 python-mega-algo/data_structures/heap/right.html create mode 100644 python-mega-algo/data_structures/heap/skew_heap.py create mode 100644 python-mega-algo/data_structures/linked_list/__init__.py create mode 100644 python-mega-algo/data_structures/linked_list/circular_linked_list.py create mode 100644 python-mega-algo/data_structures/linked_list/deque_doubly.py create mode 100644 python-mega-algo/data_structures/linked_list/doubly_linked_list.py create mode 100644 python-mega-algo/data_structures/linked_list/doubly_linked_list_two.py create mode 100644 python-mega-algo/data_structures/linked_list/from_sequence.py create mode 100644 python-mega-algo/data_structures/linked_list/has_loop.py create mode 100644 python-mega-algo/data_structures/linked_list/is_palindrome.py create mode 100644 python-mega-algo/data_structures/linked_list/merge_two_lists.py create mode 100644 python-mega-algo/data_structures/linked_list/middle_element_of_linked_list.py create mode 100644 python-mega-algo/data_structures/linked_list/print_reverse.py create mode 100644 python-mega-algo/data_structures/linked_list/right.html create mode 100644 python-mega-algo/data_structures/linked_list/singly_linked_list.py create mode 100644 python-mega-algo/data_structures/linked_list/skip_list.py create mode 100644 python-mega-algo/data_structures/linked_list/swap_nodes.py create mode 100644 python-mega-algo/data_structures/queue/__init__.py create mode 100644 python-mega-algo/data_structures/queue/circular_queue.py create mode 100644 python-mega-algo/data_structures/queue/double_ended_queue.py create mode 100644 python-mega-algo/data_structures/queue/linked_queue.py create mode 100644 python-mega-algo/data_structures/queue/priority_queue_using_list.py create mode 100644 python-mega-algo/data_structures/queue/queue_on_list.py create mode 100644 python-mega-algo/data_structures/queue/queue_on_pseudo_stack.py create mode 100644 python-mega-algo/data_structures/queue/right.html create mode 100644 python-mega-algo/data_structures/right.html create mode 100644 python-mega-algo/data_structures/stacks/__init__.py create mode 100644 python-mega-algo/data_structures/stacks/balanced_parentheses.py create mode 100644 python-mega-algo/data_structures/stacks/dijkstras_two_stack_algorithm.py create mode 100644 python-mega-algo/data_structures/stacks/evaluate_postfix_notations.py create mode 100644 python-mega-algo/data_structures/stacks/infix_to_postfix_conversion.py create mode 100644 python-mega-algo/data_structures/stacks/infix_to_prefix_conversion.py create mode 100644 python-mega-algo/data_structures/stacks/linked_stack.py create mode 100644 python-mega-algo/data_structures/stacks/next_greater_element.py create mode 100644 python-mega-algo/data_structures/stacks/postfix_evaluation.py create mode 100644 python-mega-algo/data_structures/stacks/prefix_evaluation.py create mode 100644 python-mega-algo/data_structures/stacks/right.html create mode 100644 python-mega-algo/data_structures/stacks/stack.py create mode 100644 python-mega-algo/data_structures/stacks/stack_using_dll.py create mode 100644 python-mega-algo/data_structures/stacks/stock_span_problem.py create mode 100644 python-mega-algo/data_structures/trie/__init__.py create mode 100644 python-mega-algo/data_structures/trie/right.html create mode 100644 python-mega-algo/data_structures/trie/trie.py create mode 100644 python-mega-algo/digital_image_processing/__init__.py create mode 100644 python-mega-algo/digital_image_processing/change_brightness.py create mode 100644 python-mega-algo/digital_image_processing/change_contrast.py create mode 100644 python-mega-algo/digital_image_processing/convert_to_negative.py create mode 100644 python-mega-algo/digital_image_processing/dithering/__init__.py create mode 100644 python-mega-algo/digital_image_processing/dithering/burkes.py create mode 100644 python-mega-algo/digital_image_processing/dithering/right.html create mode 100644 python-mega-algo/digital_image_processing/edge_detection/__init__.py create mode 100644 python-mega-algo/digital_image_processing/edge_detection/canny.py create mode 100644 python-mega-algo/digital_image_processing/edge_detection/right.html create mode 100644 python-mega-algo/digital_image_processing/filters/__init__.py create mode 100644 python-mega-algo/digital_image_processing/filters/bilateral_filter.py create mode 100644 python-mega-algo/digital_image_processing/filters/convolve.py create mode 100644 python-mega-algo/digital_image_processing/filters/gaussian_filter.py create mode 100644 python-mega-algo/digital_image_processing/filters/median_filter.py create mode 100644 python-mega-algo/digital_image_processing/filters/right.html create mode 100644 python-mega-algo/digital_image_processing/filters/sobel_filter.py create mode 100644 python-mega-algo/digital_image_processing/histogram_equalization/__init__.py create mode 100644 python-mega-algo/digital_image_processing/histogram_equalization/histogram_stretch.py create mode 100644 python-mega-algo/digital_image_processing/histogram_equalization/image_data/__init__.py create mode 100644 python-mega-algo/digital_image_processing/histogram_equalization/image_data/input.jpg create mode 100644 python-mega-algo/digital_image_processing/histogram_equalization/image_data/right.html create mode 100644 python-mega-algo/digital_image_processing/histogram_equalization/output_data/__init__.py create mode 100644 python-mega-algo/digital_image_processing/histogram_equalization/output_data/output.jpg create mode 100644 python-mega-algo/digital_image_processing/histogram_equalization/output_data/right.html create mode 100644 python-mega-algo/digital_image_processing/histogram_equalization/right.html create mode 100644 python-mega-algo/digital_image_processing/image_data/__init__.py create mode 100644 python-mega-algo/digital_image_processing/image_data/lena.jpg create mode 100644 python-mega-algo/digital_image_processing/image_data/lena_small.jpg create mode 100644 python-mega-algo/digital_image_processing/image_data/right.html create mode 100644 python-mega-algo/digital_image_processing/index_calculation.py create mode 100644 python-mega-algo/digital_image_processing/resize/__init__.py create mode 100644 python-mega-algo/digital_image_processing/resize/resize.py create mode 100644 python-mega-algo/digital_image_processing/resize/right.html create mode 100644 python-mega-algo/digital_image_processing/right.html create mode 100644 python-mega-algo/digital_image_processing/rotation/__init__.py create mode 100644 python-mega-algo/digital_image_processing/rotation/right.html create mode 100644 python-mega-algo/digital_image_processing/rotation/rotation.py create mode 100644 python-mega-algo/digital_image_processing/sepia.py create mode 100644 python-mega-algo/digital_image_processing/test_digital_image_processing.py create mode 100644 python-mega-algo/divide_and_conquer/__init__.py create mode 100644 python-mega-algo/divide_and_conquer/closest_pair_of_points.py create mode 100644 python-mega-algo/divide_and_conquer/convex_hull.py create mode 100644 python-mega-algo/divide_and_conquer/heaps_algorithm.py create mode 100644 python-mega-algo/divide_and_conquer/heaps_algorithm_iterative.py create mode 100644 python-mega-algo/divide_and_conquer/inversions.py create mode 100644 python-mega-algo/divide_and_conquer/kth_order_statistic.py create mode 100644 python-mega-algo/divide_and_conquer/max_difference_pair.py create mode 100644 python-mega-algo/divide_and_conquer/max_subarray_sum.py create mode 100644 python-mega-algo/divide_and_conquer/mergesort.py create mode 100644 python-mega-algo/divide_and_conquer/peak.py create mode 100644 python-mega-algo/divide_and_conquer/power.py create mode 100644 python-mega-algo/divide_and_conquer/right.html create mode 100644 python-mega-algo/divide_and_conquer/strassen_matrix_multiplication.py create mode 100644 python-mega-algo/dynamic_programming/__init__.py create mode 100644 python-mega-algo/dynamic_programming/abbreviation.py create mode 100644 python-mega-algo/dynamic_programming/bitmask.py create mode 100644 python-mega-algo/dynamic_programming/climbing_stairs.py create mode 100644 python-mega-algo/dynamic_programming/edit_distance.py create mode 100644 python-mega-algo/dynamic_programming/factorial.py create mode 100644 python-mega-algo/dynamic_programming/fast_fibonacci.py create mode 100644 python-mega-algo/dynamic_programming/fibonacci.py create mode 100644 python-mega-algo/dynamic_programming/floyd_warshall.py create mode 100644 python-mega-algo/dynamic_programming/fractional_knapsack.py create mode 100644 python-mega-algo/dynamic_programming/fractional_knapsack_2.py create mode 100644 python-mega-algo/dynamic_programming/integer_partition.py create mode 100644 python-mega-algo/dynamic_programming/iterating_through_submasks.py create mode 100644 python-mega-algo/dynamic_programming/k_means_clustering_tensorflow.py_tf create mode 100644 python-mega-algo/dynamic_programming/knapsack.py create mode 100644 python-mega-algo/dynamic_programming/longest_common_subsequence.py create mode 100644 python-mega-algo/dynamic_programming/longest_increasing_subsequence.py create mode 100644 python-mega-algo/dynamic_programming/longest_increasing_subsequence_o(nlogn).py create mode 100644 python-mega-algo/dynamic_programming/longest_sub_array.py create mode 100644 python-mega-algo/dynamic_programming/matrix_chain_order.py create mode 100644 python-mega-algo/dynamic_programming/max_non_adjacent_sum.py create mode 100644 python-mega-algo/dynamic_programming/max_sub_array.py create mode 100644 python-mega-algo/dynamic_programming/max_sum_contiguous_subsequence.py create mode 100644 python-mega-algo/dynamic_programming/minimum_coin_change.py create mode 100644 python-mega-algo/dynamic_programming/minimum_cost_path.py create mode 100644 python-mega-algo/dynamic_programming/minimum_partition.py create mode 100644 python-mega-algo/dynamic_programming/minimum_steps_to_one.py create mode 100644 python-mega-algo/dynamic_programming/optimal_binary_search_tree.py create mode 100644 python-mega-algo/dynamic_programming/right.html create mode 100644 python-mega-algo/dynamic_programming/rod_cutting.py create mode 100644 python-mega-algo/dynamic_programming/subset_generation.py create mode 100644 python-mega-algo/dynamic_programming/sum_of_subset.py create mode 100644 python-mega-algo/electronics/electric_power.py create mode 100644 python-mega-algo/electronics/ohms_law.py create mode 100644 python-mega-algo/electronics/right.html create mode 100644 python-mega-algo/file_transfer/__init__.py create mode 100644 python-mega-algo/file_transfer/mytext.txt create mode 100644 python-mega-algo/file_transfer/receive_file.py create mode 100644 python-mega-algo/file_transfer/right.html create mode 100644 python-mega-algo/file_transfer/send_file.py create mode 100644 python-mega-algo/file_transfer/tests/__init__.py create mode 100644 python-mega-algo/file_transfer/tests/right.html create mode 100644 python-mega-algo/file_transfer/tests/test_send_file.py create mode 100644 python-mega-algo/fractals/koch_snowflake.py create mode 100644 python-mega-algo/fractals/mandelbrot.py create mode 100644 python-mega-algo/fractals/right.html create mode 100644 python-mega-algo/fractals/sierpinski_triangle.py create mode 100644 python-mega-algo/fuzzy_logic/__init__.py create mode 100644 python-mega-algo/fuzzy_logic/fuzzy_operations.py create mode 100644 python-mega-algo/fuzzy_logic/right.html create mode 100644 python-mega-algo/genetic_algorithm/__init__.py create mode 100644 python-mega-algo/genetic_algorithm/basic_string.py create mode 100644 python-mega-algo/genetic_algorithm/right.html create mode 100644 python-mega-algo/geodesy/__init__.py create mode 100644 python-mega-algo/geodesy/haversine_distance.py create mode 100644 python-mega-algo/geodesy/lamberts_ellipsoidal_distance.py create mode 100644 python-mega-algo/geodesy/right.html create mode 100644 python-mega-algo/graphics/__init__.py create mode 100644 python-mega-algo/graphics/bezier_curve.py create mode 100644 python-mega-algo/graphics/right.html create mode 100644 python-mega-algo/graphics/vector3_for_2d_rendering.py create mode 100644 python-mega-algo/graphs/__init__.py create mode 100644 python-mega-algo/graphs/a_star.py create mode 100644 python-mega-algo/graphs/articulation_points.py create mode 100644 python-mega-algo/graphs/basic_graphs.py create mode 100644 python-mega-algo/graphs/bellman_ford.py create mode 100644 python-mega-algo/graphs/bfs_shortest_path.py create mode 100644 python-mega-algo/graphs/bfs_zero_one_shortest_path.py create mode 100644 python-mega-algo/graphs/bidirectional_a_star.py create mode 100644 python-mega-algo/graphs/bidirectional_breadth_first_search.py create mode 100644 python-mega-algo/graphs/breadth_first_search.py create mode 100644 python-mega-algo/graphs/breadth_first_search_2.py create mode 100644 python-mega-algo/graphs/breadth_first_search_shortest_path.py create mode 100644 python-mega-algo/graphs/check_bipartite_graph_bfs.py create mode 100644 python-mega-algo/graphs/check_bipartite_graph_dfs.py create mode 100644 python-mega-algo/graphs/connected_components.py create mode 100644 python-mega-algo/graphs/depth_first_search.py create mode 100644 python-mega-algo/graphs/depth_first_search_2.py create mode 100644 python-mega-algo/graphs/dijkstra.py create mode 100644 python-mega-algo/graphs/dijkstra_2.py create mode 100644 python-mega-algo/graphs/dijkstra_algorithm.py create mode 100644 python-mega-algo/graphs/dinic.py create mode 100644 python-mega-algo/graphs/directed_and_undirected_(weighted)_graph.py create mode 100644 python-mega-algo/graphs/edmonds_karp_multiple_source_and_sink.py create mode 100644 python-mega-algo/graphs/eulerian_path_and_circuit_for_undirected_graph.py create mode 100644 python-mega-algo/graphs/even_tree.py create mode 100644 python-mega-algo/graphs/finding_bridges.py create mode 100644 python-mega-algo/graphs/frequent_pattern_graph_miner.py create mode 100644 python-mega-algo/graphs/g_topological_sort.py create mode 100644 python-mega-algo/graphs/gale_shapley_bigraph.py create mode 100644 python-mega-algo/graphs/graph_list.py create mode 100644 python-mega-algo/graphs/graph_matrix.py create mode 100644 python-mega-algo/graphs/graphs_floyd_warshall.py create mode 100644 python-mega-algo/graphs/greedy_best_first.py create mode 100644 python-mega-algo/graphs/kahns_algorithm_long.py create mode 100644 python-mega-algo/graphs/kahns_algorithm_topo.py create mode 100644 python-mega-algo/graphs/karger.py create mode 100644 python-mega-algo/graphs/markov_chain.py create mode 100644 python-mega-algo/graphs/minimum_spanning_tree_boruvka.py create mode 100644 python-mega-algo/graphs/minimum_spanning_tree_kruskal.py create mode 100644 python-mega-algo/graphs/minimum_spanning_tree_kruskal2.py create mode 100644 python-mega-algo/graphs/minimum_spanning_tree_prims.py create mode 100644 python-mega-algo/graphs/minimum_spanning_tree_prims2.py create mode 100644 python-mega-algo/graphs/multi_heuristic_astar.py create mode 100644 python-mega-algo/graphs/page_rank.py create mode 100644 python-mega-algo/graphs/prim.py create mode 100644 python-mega-algo/graphs/right.html create mode 100644 python-mega-algo/graphs/scc_kosaraju.py create mode 100644 python-mega-algo/graphs/strongly_connected_components.py create mode 100644 python-mega-algo/graphs/tarjans_scc.py create mode 100644 python-mega-algo/graphs/tests/right.html create mode 100644 python-mega-algo/graphs/tests/test_min_spanning_tree_kruskal.py create mode 100644 python-mega-algo/graphs/tests/test_min_spanning_tree_prim.py create mode 100644 python-mega-algo/hashes/__init__.py create mode 100644 python-mega-algo/hashes/adler32.py create mode 100644 python-mega-algo/hashes/chaos_machine.py create mode 100644 python-mega-algo/hashes/djb2.py create mode 100644 python-mega-algo/hashes/enigma_machine.py create mode 100644 python-mega-algo/hashes/hamming_code.py create mode 100644 python-mega-algo/hashes/md5.py create mode 100644 python-mega-algo/hashes/right.html create mode 100644 python-mega-algo/hashes/sdbm.py create mode 100644 python-mega-algo/hashes/sha1.py create mode 100644 python-mega-algo/knapsack/README.md create mode 100644 python-mega-algo/knapsack/__init__.py create mode 100644 python-mega-algo/knapsack/greedy_knapsack.py create mode 100644 python-mega-algo/knapsack/knapsack.py create mode 100644 python-mega-algo/knapsack/right.html create mode 100644 python-mega-algo/knapsack/tests/__init__.py create mode 100644 python-mega-algo/knapsack/tests/right.html create mode 100644 python-mega-algo/knapsack/tests/test_greedy_knapsack.py create mode 100644 python-mega-algo/knapsack/tests/test_knapsack.py create mode 100644 python-mega-algo/linear_algebra/README.md create mode 100644 python-mega-algo/linear_algebra/__init__.py create mode 100644 python-mega-algo/linear_algebra/right.html create mode 100644 python-mega-algo/linear_algebra/src/__init__.py create mode 100644 python-mega-algo/linear_algebra/src/conjugate_gradient.py create mode 100644 python-mega-algo/linear_algebra/src/lib.py create mode 100644 python-mega-algo/linear_algebra/src/polynom_for_points.py create mode 100644 python-mega-algo/linear_algebra/src/power_iteration.py create mode 100644 python-mega-algo/linear_algebra/src/rayleigh_quotient.py create mode 100644 python-mega-algo/linear_algebra/src/right.html create mode 100644 python-mega-algo/linear_algebra/src/test_linear_algebra.py create mode 100644 python-mega-algo/linear_algebra/src/transformations_2d.py create mode 100644 python-mega-algo/machine_learning/__init__.py create mode 100644 python-mega-algo/machine_learning/astar.py create mode 100644 python-mega-algo/machine_learning/data_transformations.py create mode 100644 python-mega-algo/machine_learning/decision_tree.py create mode 100644 python-mega-algo/machine_learning/forecasting/__init__.py create mode 100644 python-mega-algo/machine_learning/forecasting/ex_data.csv create mode 100644 python-mega-algo/machine_learning/forecasting/right.html create mode 100644 python-mega-algo/machine_learning/forecasting/run.py create mode 100644 python-mega-algo/machine_learning/gaussian_naive_bayes.py create mode 100644 python-mega-algo/machine_learning/gradient_boosting_regressor.py create mode 100644 python-mega-algo/machine_learning/gradient_descent.py create mode 100644 python-mega-algo/machine_learning/k_means_clust.py create mode 100644 python-mega-algo/machine_learning/k_nearest_neighbours.py create mode 100644 python-mega-algo/machine_learning/knn_sklearn.py create mode 100644 python-mega-algo/machine_learning/linear_discriminant_analysis.py create mode 100644 python-mega-algo/machine_learning/linear_regression.py create mode 100644 python-mega-algo/machine_learning/logistic_regression.py create mode 100644 python-mega-algo/machine_learning/lstm/__init__.py create mode 100644 python-mega-algo/machine_learning/lstm/lstm_prediction.py create mode 100644 python-mega-algo/machine_learning/lstm/right.html create mode 100644 python-mega-algo/machine_learning/lstm/sample_data.csv create mode 100644 python-mega-algo/machine_learning/multilayer_perceptron_classifier.py create mode 100644 python-mega-algo/machine_learning/polymonial_regression.py create mode 100644 python-mega-algo/machine_learning/random_forest_classifier.py create mode 100644 python-mega-algo/machine_learning/random_forest_regressor.py create mode 100644 python-mega-algo/machine_learning/right.html create mode 100644 python-mega-algo/machine_learning/scoring_functions.py create mode 100644 python-mega-algo/machine_learning/sequential_minimum_optimization.py create mode 100644 python-mega-algo/machine_learning/similarity_search.py create mode 100644 python-mega-algo/machine_learning/support_vector_machines.py create mode 100644 python-mega-algo/machine_learning/word_frequency_functions.py create mode 100644 python-mega-algo/maths/3n_plus_1.py create mode 100644 python-mega-algo/maths/__init__.py create mode 100644 python-mega-algo/maths/abs.py create mode 100644 python-mega-algo/maths/abs_max.py create mode 100644 python-mega-algo/maths/abs_min.py create mode 100644 python-mega-algo/maths/add.py create mode 100644 python-mega-algo/maths/aliquot_sum.py create mode 100644 python-mega-algo/maths/allocation_number.py create mode 100644 python-mega-algo/maths/area.py create mode 100644 python-mega-algo/maths/area_under_curve.py create mode 100644 python-mega-algo/maths/armstrong_numbers.py create mode 100644 python-mega-algo/maths/average_mean.py create mode 100644 python-mega-algo/maths/average_median.py create mode 100644 python-mega-algo/maths/average_mode.py create mode 100644 python-mega-algo/maths/bailey_borwein_plouffe.py create mode 100644 python-mega-algo/maths/basic_maths.py create mode 100644 python-mega-algo/maths/binary_exp_mod.py create mode 100644 python-mega-algo/maths/binary_exponentiation.py create mode 100644 python-mega-algo/maths/binary_exponentiation_2.py create mode 100644 python-mega-algo/maths/binary_exponentiation_3.py create mode 100644 python-mega-algo/maths/binomial_coefficient.py create mode 100644 python-mega-algo/maths/binomial_distribution.py create mode 100644 python-mega-algo/maths/bisection.py create mode 100644 python-mega-algo/maths/ceil.py create mode 100644 python-mega-algo/maths/chudnovsky_algorithm.py create mode 100644 python-mega-algo/maths/collatz_sequence.py create mode 100644 python-mega-algo/maths/combinations.py create mode 100644 python-mega-algo/maths/decimal_isolate.py create mode 100644 python-mega-algo/maths/entropy.py create mode 100644 python-mega-algo/maths/euclidean_distance.py create mode 100644 python-mega-algo/maths/euclidean_gcd.py create mode 100644 python-mega-algo/maths/euler_method.py create mode 100644 python-mega-algo/maths/eulers_totient.py create mode 100644 python-mega-algo/maths/extended_euclidean_algorithm.py create mode 100644 python-mega-algo/maths/factorial_iterative.py create mode 100644 python-mega-algo/maths/factorial_python.py create mode 100644 python-mega-algo/maths/factorial_recursive.py create mode 100644 python-mega-algo/maths/factors.py create mode 100644 python-mega-algo/maths/fermat_little_theorem.py create mode 100644 python-mega-algo/maths/fibonacci.py create mode 100644 python-mega-algo/maths/fibonacci_sequence_recursion.py create mode 100644 python-mega-algo/maths/find_max.py create mode 100644 python-mega-algo/maths/find_max_recursion.py create mode 100644 python-mega-algo/maths/find_min.py create mode 100644 python-mega-algo/maths/find_min_recursion.py create mode 100644 python-mega-algo/maths/floor.py create mode 100644 python-mega-algo/maths/gamma.py create mode 100644 python-mega-algo/maths/gaussian.py create mode 100644 python-mega-algo/maths/greatest_common_divisor.py create mode 100644 python-mega-algo/maths/greedy_coin_change.py create mode 100644 python-mega-algo/maths/hardy_ramanujanalgo.py create mode 100644 python-mega-algo/maths/images/__init__.py create mode 100644 python-mega-algo/maths/images/gaussian.png create mode 100644 python-mega-algo/maths/images/right.html create mode 100644 python-mega-algo/maths/integration_by_simpson_approx.py create mode 100644 python-mega-algo/maths/is_square_free.py create mode 100644 python-mega-algo/maths/jaccard_similarity.py create mode 100644 python-mega-algo/maths/kadanes.py create mode 100644 python-mega-algo/maths/karatsuba.py create mode 100644 python-mega-algo/maths/krishnamurthy_number.py create mode 100644 python-mega-algo/maths/kth_lexicographic_permutation.py create mode 100644 python-mega-algo/maths/largest_of_very_large_numbers.py create mode 100644 python-mega-algo/maths/largest_subarray_sum.py create mode 100644 python-mega-algo/maths/least_common_multiple.py create mode 100644 python-mega-algo/maths/line_length.py create mode 100644 python-mega-algo/maths/lucas_lehmer_primality_test.py create mode 100644 python-mega-algo/maths/lucas_series.py create mode 100644 python-mega-algo/maths/matrix_exponentiation.py create mode 100644 python-mega-algo/maths/max_sum_sliding_window.py create mode 100644 python-mega-algo/maths/median_of_two_arrays.py create mode 100644 python-mega-algo/maths/miller_rabin.py create mode 100644 python-mega-algo/maths/mobius_function.py create mode 100644 python-mega-algo/maths/modular_exponential.py create mode 100644 python-mega-algo/maths/monte_carlo.py create mode 100644 python-mega-algo/maths/monte_carlo_dice.py create mode 100644 python-mega-algo/maths/newton_raphson.py create mode 100644 python-mega-algo/maths/number_of_digits.py create mode 100644 python-mega-algo/maths/numerical_integration.py create mode 100644 python-mega-algo/maths/perfect_cube.py create mode 100644 python-mega-algo/maths/perfect_number.py create mode 100644 python-mega-algo/maths/perfect_square.py create mode 100644 python-mega-algo/maths/pi_monte_carlo_estimation.py create mode 100644 python-mega-algo/maths/polynomial_evaluation.py create mode 100644 python-mega-algo/maths/power_using_recursion.py create mode 100644 python-mega-algo/maths/prime_check.py create mode 100644 python-mega-algo/maths/prime_factors.py create mode 100644 python-mega-algo/maths/prime_numbers.py create mode 100644 python-mega-algo/maths/prime_sieve_eratosthenes.py create mode 100644 python-mega-algo/maths/primelib.py create mode 100644 python-mega-algo/maths/pythagoras.py create mode 100644 python-mega-algo/maths/qr_decomposition.py create mode 100644 python-mega-algo/maths/quadratic_equations_complex_numbers.py create mode 100644 python-mega-algo/maths/radians.py create mode 100644 python-mega-algo/maths/radix2_fft.py create mode 100644 python-mega-algo/maths/relu.py create mode 100644 python-mega-algo/maths/right.html create mode 100644 python-mega-algo/maths/runge_kutta.py create mode 100644 python-mega-algo/maths/segmented_sieve.py create mode 100644 python-mega-algo/maths/series/__init__.py create mode 100644 python-mega-algo/maths/series/arithmetic_mean.py create mode 100644 python-mega-algo/maths/series/geometric_mean.py create mode 100644 python-mega-algo/maths/series/geometric_series.py create mode 100644 python-mega-algo/maths/series/harmonic_series.py create mode 100644 python-mega-algo/maths/series/p_series.py create mode 100644 python-mega-algo/maths/series/right.html create mode 100644 python-mega-algo/maths/sieve_of_eratosthenes.py create mode 100644 python-mega-algo/maths/sigmoid.py create mode 100644 python-mega-algo/maths/simpson_rule.py create mode 100644 python-mega-algo/maths/softmax.py create mode 100644 python-mega-algo/maths/square_root.py create mode 100644 python-mega-algo/maths/sum_of_arithmetic_series.py create mode 100644 python-mega-algo/maths/sum_of_digits.py create mode 100644 python-mega-algo/maths/sum_of_geometric_progression.py create mode 100644 python-mega-algo/maths/test_prime_check.py create mode 100644 python-mega-algo/maths/trapezoidal_rule.py create mode 100644 python-mega-algo/maths/triplet_sum.py create mode 100644 python-mega-algo/maths/two_pointer.py create mode 100644 python-mega-algo/maths/two_sum.py create mode 100644 python-mega-algo/maths/ugly_numbers.py create mode 100644 python-mega-algo/maths/volume.py create mode 100644 python-mega-algo/maths/zellers_congruence.py create mode 100644 python-mega-algo/matrix/__init__.py create mode 100644 python-mega-algo/matrix/count_islands_in_matrix.py create mode 100644 python-mega-algo/matrix/inverse_of_matrix.py create mode 100644 python-mega-algo/matrix/matrix_class.py create mode 100644 python-mega-algo/matrix/matrix_operation.py create mode 100644 python-mega-algo/matrix/nth_fibonacci_using_matrix_exponentiation.py create mode 100644 python-mega-algo/matrix/right.html create mode 100644 python-mega-algo/matrix/rotate_matrix.py create mode 100644 python-mega-algo/matrix/searching_in_sorted_matrix.py create mode 100644 python-mega-algo/matrix/sherman_morrison.py create mode 100644 python-mega-algo/matrix/spiral_print.py create mode 100644 python-mega-algo/matrix/tests/__init__.py create mode 100644 python-mega-algo/matrix/tests/pytest.ini create mode 100644 python-mega-algo/matrix/tests/right.html create mode 100644 python-mega-algo/matrix/tests/test_matrix_operation.py create mode 100644 python-mega-algo/mypy.ini create mode 100644 python-mega-algo/networking_flow/__init__.py create mode 100644 python-mega-algo/networking_flow/ford_fulkerson.py create mode 100644 python-mega-algo/networking_flow/minimum_cut.py create mode 100644 python-mega-algo/networking_flow/right.html create mode 100644 python-mega-algo/neural_network/2_hidden_layers_neural_network.py create mode 100644 python-mega-algo/neural_network/__init__.py create mode 100644 python-mega-algo/neural_network/back_propagation_neural_network.py create mode 100644 python-mega-algo/neural_network/convolution_neural_network.py create mode 100644 python-mega-algo/neural_network/gan.py_tf create mode 100644 python-mega-algo/neural_network/input_data.py_tf create mode 100644 python-mega-algo/neural_network/perceptron.py create mode 100644 python-mega-algo/neural_network/right.html create mode 100644 python-mega-algo/other/__init__.py create mode 100644 python-mega-algo/other/activity_selection.py create mode 100644 "python-mega-algo/other/davis\342\200\223putnam\342\200\223logemann\342\200\223loveland.py" create mode 100644 python-mega-algo/other/dijkstra_bankers_algorithm.py create mode 100644 python-mega-algo/other/doomsday.py create mode 100644 python-mega-algo/other/fischer_yates_shuffle.py create mode 100644 python-mega-algo/other/gauss_easter.py create mode 100644 python-mega-algo/other/graham_scan.py create mode 100644 python-mega-algo/other/greedy.py create mode 100644 python-mega-algo/other/least_recently_used.py create mode 100644 python-mega-algo/other/lfu_cache.py create mode 100644 python-mega-algo/other/linear_congruential_generator.py create mode 100644 python-mega-algo/other/lru_cache.py create mode 100644 python-mega-algo/other/magicdiamondpattern.py create mode 100644 python-mega-algo/other/nested_brackets.py create mode 100644 python-mega-algo/other/password_generator.py create mode 100644 python-mega-algo/other/right.html create mode 100644 python-mega-algo/other/scoring_algorithm.py create mode 100644 python-mega-algo/other/sdes.py create mode 100644 python-mega-algo/other/tower_of_hanoi.py create mode 100644 python-mega-algo/physics/n_body_simulation.py create mode 100644 python-mega-algo/physics/right.html create mode 100644 python-mega-algo/project_euler/README.md create mode 100644 python-mega-algo/project_euler/__init__.py create mode 100644 python-mega-algo/project_euler/problem_001/__init__.py create mode 100644 python-mega-algo/project_euler/problem_001/right.html create mode 100644 python-mega-algo/project_euler/problem_001/sol1.py create mode 100644 python-mega-algo/project_euler/problem_001/sol2.py create mode 100644 python-mega-algo/project_euler/problem_001/sol3.py create mode 100644 python-mega-algo/project_euler/problem_001/sol4.py create mode 100644 python-mega-algo/project_euler/problem_001/sol5.py create mode 100644 python-mega-algo/project_euler/problem_001/sol6.py create mode 100644 python-mega-algo/project_euler/problem_001/sol7.py create mode 100644 python-mega-algo/project_euler/problem_002/__init__.py create mode 100644 python-mega-algo/project_euler/problem_002/right.html create mode 100644 python-mega-algo/project_euler/problem_002/sol1.py create mode 100644 python-mega-algo/project_euler/problem_002/sol2.py create mode 100644 python-mega-algo/project_euler/problem_002/sol3.py create mode 100644 python-mega-algo/project_euler/problem_002/sol4.py create mode 100644 python-mega-algo/project_euler/problem_002/sol5.py create mode 100644 python-mega-algo/project_euler/problem_003/__init__.py create mode 100644 python-mega-algo/project_euler/problem_003/right.html create mode 100644 python-mega-algo/project_euler/problem_003/sol1.py create mode 100644 python-mega-algo/project_euler/problem_003/sol2.py create mode 100644 python-mega-algo/project_euler/problem_003/sol3.py create mode 100644 python-mega-algo/project_euler/problem_004/__init__.py create mode 100644 python-mega-algo/project_euler/problem_004/right.html create mode 100644 python-mega-algo/project_euler/problem_004/sol1.py create mode 100644 python-mega-algo/project_euler/problem_004/sol2.py create mode 100644 python-mega-algo/project_euler/problem_005/__init__.py create mode 100644 python-mega-algo/project_euler/problem_005/right.html create mode 100644 python-mega-algo/project_euler/problem_005/sol1.py create mode 100644 python-mega-algo/project_euler/problem_005/sol2.py create mode 100644 python-mega-algo/project_euler/problem_006/__init__.py create mode 100644 python-mega-algo/project_euler/problem_006/right.html create mode 100644 python-mega-algo/project_euler/problem_006/sol1.py create mode 100644 python-mega-algo/project_euler/problem_006/sol2.py create mode 100644 python-mega-algo/project_euler/problem_006/sol3.py create mode 100644 python-mega-algo/project_euler/problem_006/sol4.py create mode 100644 python-mega-algo/project_euler/problem_007/__init__.py create mode 100644 python-mega-algo/project_euler/problem_007/right.html create mode 100644 python-mega-algo/project_euler/problem_007/sol1.py create mode 100644 python-mega-algo/project_euler/problem_007/sol2.py create mode 100644 python-mega-algo/project_euler/problem_007/sol3.py create mode 100644 python-mega-algo/project_euler/problem_008/__init__.py create mode 100644 python-mega-algo/project_euler/problem_008/right.html create mode 100644 python-mega-algo/project_euler/problem_008/sol1.py create mode 100644 python-mega-algo/project_euler/problem_008/sol2.py create mode 100644 python-mega-algo/project_euler/problem_008/sol3.py create mode 100644 python-mega-algo/project_euler/problem_009/__init__.py create mode 100644 python-mega-algo/project_euler/problem_009/right.html create mode 100644 python-mega-algo/project_euler/problem_009/sol1.py create mode 100644 python-mega-algo/project_euler/problem_009/sol2.py create mode 100644 python-mega-algo/project_euler/problem_009/sol3.py create mode 100644 python-mega-algo/project_euler/problem_010/__init__.py create mode 100644 python-mega-algo/project_euler/problem_010/right.html create mode 100644 python-mega-algo/project_euler/problem_010/sol1.py create mode 100644 python-mega-algo/project_euler/problem_010/sol2.py create mode 100644 python-mega-algo/project_euler/problem_010/sol3.py create mode 100644 python-mega-algo/project_euler/problem_011/__init__.py create mode 100644 python-mega-algo/project_euler/problem_011/grid.txt create mode 100644 python-mega-algo/project_euler/problem_011/right.html create mode 100644 python-mega-algo/project_euler/problem_011/sol1.py create mode 100644 python-mega-algo/project_euler/problem_011/sol2.py create mode 100644 python-mega-algo/project_euler/problem_012/__init__.py create mode 100644 python-mega-algo/project_euler/problem_012/right.html create mode 100644 python-mega-algo/project_euler/problem_012/sol1.py create mode 100644 python-mega-algo/project_euler/problem_012/sol2.py create mode 100644 python-mega-algo/project_euler/problem_013/__init__.py create mode 100644 python-mega-algo/project_euler/problem_013/num.txt create mode 100644 python-mega-algo/project_euler/problem_013/right.html create mode 100644 python-mega-algo/project_euler/problem_013/sol1.py create mode 100644 python-mega-algo/project_euler/problem_014/__init__.py create mode 100644 python-mega-algo/project_euler/problem_014/right.html create mode 100644 python-mega-algo/project_euler/problem_014/sol1.py create mode 100644 python-mega-algo/project_euler/problem_014/sol2.py create mode 100644 python-mega-algo/project_euler/problem_015/__init__.py create mode 100644 python-mega-algo/project_euler/problem_015/right.html create mode 100644 python-mega-algo/project_euler/problem_015/sol1.py create mode 100644 python-mega-algo/project_euler/problem_016/__init__.py create mode 100644 python-mega-algo/project_euler/problem_016/right.html create mode 100644 python-mega-algo/project_euler/problem_016/sol1.py create mode 100644 python-mega-algo/project_euler/problem_016/sol2.py create mode 100644 python-mega-algo/project_euler/problem_017/__init__.py create mode 100644 python-mega-algo/project_euler/problem_017/right.html create mode 100644 python-mega-algo/project_euler/problem_017/sol1.py create mode 100644 python-mega-algo/project_euler/problem_018/__init__.py create mode 100644 python-mega-algo/project_euler/problem_018/right.html create mode 100644 python-mega-algo/project_euler/problem_018/solution.py create mode 100644 python-mega-algo/project_euler/problem_018/triangle.txt create mode 100644 python-mega-algo/project_euler/problem_019/__init__.py create mode 100644 python-mega-algo/project_euler/problem_019/right.html create mode 100644 python-mega-algo/project_euler/problem_019/sol1.py create mode 100644 python-mega-algo/project_euler/problem_020/__init__.py create mode 100644 python-mega-algo/project_euler/problem_020/right.html create mode 100644 python-mega-algo/project_euler/problem_020/sol1.py create mode 100644 python-mega-algo/project_euler/problem_020/sol2.py create mode 100644 python-mega-algo/project_euler/problem_020/sol3.py create mode 100644 python-mega-algo/project_euler/problem_020/sol4.py create mode 100644 python-mega-algo/project_euler/problem_021/__init__.py create mode 100644 python-mega-algo/project_euler/problem_021/right.html create mode 100644 python-mega-algo/project_euler/problem_021/sol1.py create mode 100644 python-mega-algo/project_euler/problem_022/__init__.py create mode 100644 python-mega-algo/project_euler/problem_022/p022_names.txt create mode 100644 python-mega-algo/project_euler/problem_022/right.html create mode 100644 python-mega-algo/project_euler/problem_022/sol1.py create mode 100644 python-mega-algo/project_euler/problem_022/sol2.py create mode 100644 python-mega-algo/project_euler/problem_023/__init__.py create mode 100644 python-mega-algo/project_euler/problem_023/right.html create mode 100644 python-mega-algo/project_euler/problem_023/sol1.py create mode 100644 python-mega-algo/project_euler/problem_024/__init__.py create mode 100644 python-mega-algo/project_euler/problem_024/right.html create mode 100644 python-mega-algo/project_euler/problem_024/sol1.py create mode 100644 python-mega-algo/project_euler/problem_025/__init__.py create mode 100644 python-mega-algo/project_euler/problem_025/right.html create mode 100644 python-mega-algo/project_euler/problem_025/sol1.py create mode 100644 python-mega-algo/project_euler/problem_025/sol2.py create mode 100644 python-mega-algo/project_euler/problem_025/sol3.py create mode 100644 python-mega-algo/project_euler/problem_026/__init__.py create mode 100644 python-mega-algo/project_euler/problem_026/right.html create mode 100644 python-mega-algo/project_euler/problem_026/sol1.py create mode 100644 python-mega-algo/project_euler/problem_027/__init__.py create mode 100644 python-mega-algo/project_euler/problem_027/right.html create mode 100644 python-mega-algo/project_euler/problem_027/sol1.py create mode 100644 python-mega-algo/project_euler/problem_028/__init__.py create mode 100644 python-mega-algo/project_euler/problem_028/right.html create mode 100644 python-mega-algo/project_euler/problem_028/sol1.py create mode 100644 python-mega-algo/project_euler/problem_029/__init__.py create mode 100644 python-mega-algo/project_euler/problem_029/right.html create mode 100644 python-mega-algo/project_euler/problem_029/sol1.py create mode 100644 python-mega-algo/project_euler/problem_030/__init__.py create mode 100644 python-mega-algo/project_euler/problem_030/right.html create mode 100644 python-mega-algo/project_euler/problem_030/sol1.py create mode 100644 python-mega-algo/project_euler/problem_031/__init__.py create mode 100644 python-mega-algo/project_euler/problem_031/right.html create mode 100644 python-mega-algo/project_euler/problem_031/sol1.py create mode 100644 python-mega-algo/project_euler/problem_031/sol2.py create mode 100644 python-mega-algo/project_euler/problem_032/__init__.py create mode 100644 python-mega-algo/project_euler/problem_032/right.html create mode 100644 python-mega-algo/project_euler/problem_032/sol32.py create mode 100644 python-mega-algo/project_euler/problem_033/__init__.py create mode 100644 python-mega-algo/project_euler/problem_033/right.html create mode 100644 python-mega-algo/project_euler/problem_033/sol1.py create mode 100644 python-mega-algo/project_euler/problem_034/__init__.py create mode 100644 python-mega-algo/project_euler/problem_034/right.html create mode 100644 python-mega-algo/project_euler/problem_034/sol1.py create mode 100644 python-mega-algo/project_euler/problem_035/__init__.py create mode 100644 python-mega-algo/project_euler/problem_035/right.html create mode 100644 python-mega-algo/project_euler/problem_035/sol1.py create mode 100644 python-mega-algo/project_euler/problem_036/__init__.py create mode 100644 python-mega-algo/project_euler/problem_036/right.html create mode 100644 python-mega-algo/project_euler/problem_036/sol1.py create mode 100644 python-mega-algo/project_euler/problem_037/__init__.py create mode 100644 python-mega-algo/project_euler/problem_037/right.html create mode 100644 python-mega-algo/project_euler/problem_037/sol1.py create mode 100644 python-mega-algo/project_euler/problem_038/__init__.py create mode 100644 python-mega-algo/project_euler/problem_038/right.html create mode 100644 python-mega-algo/project_euler/problem_038/sol1.py create mode 100644 python-mega-algo/project_euler/problem_039/__init__.py create mode 100644 python-mega-algo/project_euler/problem_039/right.html create mode 100644 python-mega-algo/project_euler/problem_039/sol1.py create mode 100644 python-mega-algo/project_euler/problem_040/__init__.py create mode 100644 python-mega-algo/project_euler/problem_040/right.html create mode 100644 python-mega-algo/project_euler/problem_040/sol1.py create mode 100644 python-mega-algo/project_euler/problem_041/__init__.py create mode 100644 python-mega-algo/project_euler/problem_041/right.html create mode 100644 python-mega-algo/project_euler/problem_041/sol1.py create mode 100644 python-mega-algo/project_euler/problem_042/__init__.py create mode 100644 python-mega-algo/project_euler/problem_042/right.html create mode 100644 python-mega-algo/project_euler/problem_042/solution42.py create mode 100644 python-mega-algo/project_euler/problem_042/words.txt create mode 100644 python-mega-algo/project_euler/problem_043/__init__.py create mode 100644 python-mega-algo/project_euler/problem_043/right.html create mode 100644 python-mega-algo/project_euler/problem_043/sol1.py create mode 100644 python-mega-algo/project_euler/problem_044/__init__.py create mode 100644 python-mega-algo/project_euler/problem_044/right.html create mode 100644 python-mega-algo/project_euler/problem_044/sol1.py create mode 100644 python-mega-algo/project_euler/problem_045/__init__.py create mode 100644 python-mega-algo/project_euler/problem_045/right.html create mode 100644 python-mega-algo/project_euler/problem_045/sol1.py create mode 100644 python-mega-algo/project_euler/problem_046/__init__.py create mode 100644 python-mega-algo/project_euler/problem_046/right.html create mode 100644 python-mega-algo/project_euler/problem_046/sol1.py create mode 100644 python-mega-algo/project_euler/problem_047/__init__.py create mode 100644 python-mega-algo/project_euler/problem_047/right.html create mode 100644 python-mega-algo/project_euler/problem_047/sol1.py create mode 100644 python-mega-algo/project_euler/problem_048/__init__.py create mode 100644 python-mega-algo/project_euler/problem_048/right.html create mode 100644 python-mega-algo/project_euler/problem_048/sol1.py create mode 100644 python-mega-algo/project_euler/problem_049/__init__.py create mode 100644 python-mega-algo/project_euler/problem_049/right.html create mode 100644 python-mega-algo/project_euler/problem_049/sol1.py create mode 100644 python-mega-algo/project_euler/problem_050/__init__.py create mode 100644 python-mega-algo/project_euler/problem_050/right.html create mode 100644 python-mega-algo/project_euler/problem_050/sol1.py create mode 100644 python-mega-algo/project_euler/problem_051/__init__.py create mode 100644 python-mega-algo/project_euler/problem_051/right.html create mode 100644 python-mega-algo/project_euler/problem_051/sol1.py create mode 100644 python-mega-algo/project_euler/problem_052/__init__.py create mode 100644 python-mega-algo/project_euler/problem_052/right.html create mode 100644 python-mega-algo/project_euler/problem_052/sol1.py create mode 100644 python-mega-algo/project_euler/problem_053/__init__.py create mode 100644 python-mega-algo/project_euler/problem_053/right.html create mode 100644 python-mega-algo/project_euler/problem_053/sol1.py create mode 100644 python-mega-algo/project_euler/problem_054/__init__.py create mode 100644 python-mega-algo/project_euler/problem_054/poker_hands.txt create mode 100644 python-mega-algo/project_euler/problem_054/right.html create mode 100644 python-mega-algo/project_euler/problem_054/sol1.py create mode 100644 python-mega-algo/project_euler/problem_054/test_poker_hand.py create mode 100644 python-mega-algo/project_euler/problem_055/__init__.py create mode 100644 python-mega-algo/project_euler/problem_055/right.html create mode 100644 python-mega-algo/project_euler/problem_055/sol1.py create mode 100644 python-mega-algo/project_euler/problem_056/__init__.py create mode 100644 python-mega-algo/project_euler/problem_056/right.html create mode 100644 python-mega-algo/project_euler/problem_056/sol1.py create mode 100644 python-mega-algo/project_euler/problem_057/__init__.py create mode 100644 python-mega-algo/project_euler/problem_057/right.html create mode 100644 python-mega-algo/project_euler/problem_057/sol1.py create mode 100644 python-mega-algo/project_euler/problem_058/__init__.py create mode 100644 python-mega-algo/project_euler/problem_058/right.html create mode 100644 python-mega-algo/project_euler/problem_058/sol1.py create mode 100644 python-mega-algo/project_euler/problem_059/__init__.py create mode 100644 python-mega-algo/project_euler/problem_059/p059_cipher.txt create mode 100644 python-mega-algo/project_euler/problem_059/right.html create mode 100644 python-mega-algo/project_euler/problem_059/sol1.py create mode 100644 python-mega-algo/project_euler/problem_059/test_cipher.txt create mode 100644 python-mega-algo/project_euler/problem_062/__init__.py create mode 100644 python-mega-algo/project_euler/problem_062/right.html create mode 100644 python-mega-algo/project_euler/problem_062/sol1.py create mode 100644 python-mega-algo/project_euler/problem_063/__init__.py create mode 100644 python-mega-algo/project_euler/problem_063/right.html create mode 100644 python-mega-algo/project_euler/problem_063/sol1.py create mode 100644 python-mega-algo/project_euler/problem_064/__init__.py create mode 100644 python-mega-algo/project_euler/problem_064/right.html create mode 100644 python-mega-algo/project_euler/problem_064/sol1.py create mode 100644 python-mega-algo/project_euler/problem_065/__init__.py create mode 100644 python-mega-algo/project_euler/problem_065/right.html create mode 100644 python-mega-algo/project_euler/problem_065/sol1.py create mode 100644 python-mega-algo/project_euler/problem_067/__init__.py create mode 100644 python-mega-algo/project_euler/problem_067/right.html create mode 100644 python-mega-algo/project_euler/problem_067/sol1.py create mode 100644 python-mega-algo/project_euler/problem_067/triangle.txt create mode 100644 python-mega-algo/project_euler/problem_069/__init__.py create mode 100644 python-mega-algo/project_euler/problem_069/right.html create mode 100644 python-mega-algo/project_euler/problem_069/sol1.py create mode 100644 python-mega-algo/project_euler/problem_070/__init__.py create mode 100644 python-mega-algo/project_euler/problem_070/right.html create mode 100644 python-mega-algo/project_euler/problem_070/sol1.py create mode 100644 python-mega-algo/project_euler/problem_071/__init__.py create mode 100644 python-mega-algo/project_euler/problem_071/right.html create mode 100644 python-mega-algo/project_euler/problem_071/sol1.py create mode 100644 python-mega-algo/project_euler/problem_072/__init__.py create mode 100644 python-mega-algo/project_euler/problem_072/right.html create mode 100644 python-mega-algo/project_euler/problem_072/sol1.py create mode 100644 python-mega-algo/project_euler/problem_072/sol2.py create mode 100644 python-mega-algo/project_euler/problem_074/__init__.py create mode 100644 python-mega-algo/project_euler/problem_074/right.html create mode 100644 python-mega-algo/project_euler/problem_074/sol1.py create mode 100644 python-mega-algo/project_euler/problem_074/sol2.py create mode 100644 python-mega-algo/project_euler/problem_075/__init__.py create mode 100644 python-mega-algo/project_euler/problem_075/right.html create mode 100644 python-mega-algo/project_euler/problem_075/sol1.py create mode 100644 python-mega-algo/project_euler/problem_076/__init__.py create mode 100644 python-mega-algo/project_euler/problem_076/right.html create mode 100644 python-mega-algo/project_euler/problem_076/sol1.py create mode 100644 python-mega-algo/project_euler/problem_077/__init__.py create mode 100644 python-mega-algo/project_euler/problem_077/right.html create mode 100644 python-mega-algo/project_euler/problem_077/sol1.py create mode 100644 python-mega-algo/project_euler/problem_080/__init__.py create mode 100644 python-mega-algo/project_euler/problem_080/right.html create mode 100644 python-mega-algo/project_euler/problem_080/sol1.py create mode 100644 python-mega-algo/project_euler/problem_081/__init__.py create mode 100644 python-mega-algo/project_euler/problem_081/matrix.txt create mode 100644 python-mega-algo/project_euler/problem_081/right.html create mode 100644 python-mega-algo/project_euler/problem_081/sol1.py create mode 100644 python-mega-algo/project_euler/problem_085/__init__.py create mode 100644 python-mega-algo/project_euler/problem_085/right.html create mode 100644 python-mega-algo/project_euler/problem_085/sol1.py create mode 100644 python-mega-algo/project_euler/problem_086/__init__.py create mode 100644 python-mega-algo/project_euler/problem_086/right.html create mode 100644 python-mega-algo/project_euler/problem_086/sol1.py create mode 100644 python-mega-algo/project_euler/problem_087/__init__.py create mode 100644 python-mega-algo/project_euler/problem_087/right.html create mode 100644 python-mega-algo/project_euler/problem_087/sol1.py create mode 100644 python-mega-algo/project_euler/problem_089/__init__.py create mode 100644 python-mega-algo/project_euler/problem_089/numeralcleanup_test.txt create mode 100644 python-mega-algo/project_euler/problem_089/p089_roman.txt create mode 100644 python-mega-algo/project_euler/problem_089/right.html create mode 100644 python-mega-algo/project_euler/problem_089/sol1.py create mode 100644 python-mega-algo/project_euler/problem_091/__init__.py create mode 100644 python-mega-algo/project_euler/problem_091/right.html create mode 100644 python-mega-algo/project_euler/problem_091/sol1.py create mode 100644 python-mega-algo/project_euler/problem_097/__init__.py create mode 100644 python-mega-algo/project_euler/problem_097/right.html create mode 100644 python-mega-algo/project_euler/problem_097/sol1.py create mode 100644 python-mega-algo/project_euler/problem_099/__init__.py create mode 100644 python-mega-algo/project_euler/problem_099/base_exp.txt create mode 100644 python-mega-algo/project_euler/problem_099/right.html create mode 100644 python-mega-algo/project_euler/problem_099/sol1.py create mode 100644 python-mega-algo/project_euler/problem_101/__init__.py create mode 100644 python-mega-algo/project_euler/problem_101/right.html create mode 100644 python-mega-algo/project_euler/problem_101/sol1.py create mode 100644 python-mega-algo/project_euler/problem_102/__init__.py create mode 100644 python-mega-algo/project_euler/problem_102/p102_triangles.txt create mode 100644 python-mega-algo/project_euler/problem_102/right.html create mode 100644 python-mega-algo/project_euler/problem_102/sol1.py create mode 100644 python-mega-algo/project_euler/problem_102/test_triangles.txt create mode 100644 python-mega-algo/project_euler/problem_107/__init__.py create mode 100644 python-mega-algo/project_euler/problem_107/p107_network.txt create mode 100644 python-mega-algo/project_euler/problem_107/right.html create mode 100644 python-mega-algo/project_euler/problem_107/sol1.py create mode 100644 python-mega-algo/project_euler/problem_107/test_network.txt create mode 100644 python-mega-algo/project_euler/problem_109/__init__.py create mode 100644 python-mega-algo/project_euler/problem_109/right.html create mode 100644 python-mega-algo/project_euler/problem_109/sol1.py create mode 100644 python-mega-algo/project_euler/problem_112/__init__.py create mode 100644 python-mega-algo/project_euler/problem_112/right.html create mode 100644 python-mega-algo/project_euler/problem_112/sol1.py create mode 100644 python-mega-algo/project_euler/problem_113/__init__.py create mode 100644 python-mega-algo/project_euler/problem_113/right.html create mode 100644 python-mega-algo/project_euler/problem_113/sol1.py create mode 100644 python-mega-algo/project_euler/problem_119/__init__.py create mode 100644 python-mega-algo/project_euler/problem_119/right.html create mode 100644 python-mega-algo/project_euler/problem_119/sol1.py create mode 100644 python-mega-algo/project_euler/problem_120/__init__.py create mode 100644 python-mega-algo/project_euler/problem_120/right.html create mode 100644 python-mega-algo/project_euler/problem_120/sol1.py create mode 100644 python-mega-algo/project_euler/problem_121/__init__.py create mode 100644 python-mega-algo/project_euler/problem_121/right.html create mode 100644 python-mega-algo/project_euler/problem_121/sol1.py create mode 100644 python-mega-algo/project_euler/problem_123/__init__.py create mode 100644 python-mega-algo/project_euler/problem_123/right.html create mode 100644 python-mega-algo/project_euler/problem_123/sol1.py create mode 100644 python-mega-algo/project_euler/problem_125/__init__.py create mode 100644 python-mega-algo/project_euler/problem_125/right.html create mode 100644 python-mega-algo/project_euler/problem_125/sol1.py create mode 100644 python-mega-algo/project_euler/problem_129/__init__.py create mode 100644 python-mega-algo/project_euler/problem_129/right.html create mode 100644 python-mega-algo/project_euler/problem_129/sol1.py create mode 100644 python-mega-algo/project_euler/problem_135/__init__.py create mode 100644 python-mega-algo/project_euler/problem_135/right.html create mode 100644 python-mega-algo/project_euler/problem_135/sol1.py create mode 100644 python-mega-algo/project_euler/problem_173/__init__.py create mode 100644 python-mega-algo/project_euler/problem_173/right.html create mode 100644 python-mega-algo/project_euler/problem_173/sol1.py create mode 100644 python-mega-algo/project_euler/problem_174/__init__.py create mode 100644 python-mega-algo/project_euler/problem_174/right.html create mode 100644 python-mega-algo/project_euler/problem_174/sol1.py create mode 100644 python-mega-algo/project_euler/problem_180/__init__.py create mode 100644 python-mega-algo/project_euler/problem_180/right.html create mode 100644 python-mega-algo/project_euler/problem_180/sol1.py create mode 100644 python-mega-algo/project_euler/problem_188/__init__.py create mode 100644 python-mega-algo/project_euler/problem_188/right.html create mode 100644 python-mega-algo/project_euler/problem_188/sol1.py create mode 100644 python-mega-algo/project_euler/problem_191/__init__.py create mode 100644 python-mega-algo/project_euler/problem_191/right.html create mode 100644 python-mega-algo/project_euler/problem_191/sol1.py create mode 100644 python-mega-algo/project_euler/problem_203/__init__.py create mode 100644 python-mega-algo/project_euler/problem_203/right.html create mode 100644 python-mega-algo/project_euler/problem_203/sol1.py create mode 100644 python-mega-algo/project_euler/problem_206/__init__.py create mode 100644 python-mega-algo/project_euler/problem_206/right.html create mode 100644 python-mega-algo/project_euler/problem_206/sol1.py create mode 100644 python-mega-algo/project_euler/problem_207/__init__.py create mode 100644 python-mega-algo/project_euler/problem_207/right.html create mode 100644 python-mega-algo/project_euler/problem_207/sol1.py create mode 100644 python-mega-algo/project_euler/problem_234/__init__.py create mode 100644 python-mega-algo/project_euler/problem_234/right.html create mode 100644 python-mega-algo/project_euler/problem_234/sol1.py create mode 100644 python-mega-algo/project_euler/problem_301/__init__.py create mode 100644 python-mega-algo/project_euler/problem_301/right.html create mode 100644 python-mega-algo/project_euler/problem_301/sol1.py create mode 100644 python-mega-algo/project_euler/problem_551/__init__.py create mode 100644 python-mega-algo/project_euler/problem_551/right.html create mode 100644 python-mega-algo/project_euler/problem_551/sol1.py create mode 100644 python-mega-algo/project_euler/right.html create mode 100644 python-mega-algo/pytest.ini create mode 100644 python-mega-algo/quantum/README.md create mode 100644 python-mega-algo/quantum/__init__.py create mode 100644 python-mega-algo/quantum/deutsch_jozsa.py create mode 100644 python-mega-algo/quantum/half_adder.py create mode 100644 python-mega-algo/quantum/not_gate.py create mode 100644 python-mega-algo/quantum/quantum_entanglement.py create mode 100644 python-mega-algo/quantum/right.html create mode 100644 python-mega-algo/quantum/ripple_adder_classic.py create mode 100644 python-mega-algo/quantum/single_qubit_measure.py create mode 100644 python-mega-algo/requirements.txt create mode 100644 python-mega-algo/right.html create mode 100644 python-mega-algo/scheduling/__init__.py create mode 100644 python-mega-algo/scheduling/first_come_first_served.py create mode 100644 python-mega-algo/scheduling/right.html create mode 100644 python-mega-algo/scheduling/round_robin.py create mode 100644 python-mega-algo/scheduling/shortest_job_first.py create mode 100644 python-mega-algo/scripts/__init__.py create mode 100644 python-mega-algo/scripts/build_directory_md.py create mode 100644 python-mega-algo/scripts/project_euler_answers.json create mode 100644 python-mega-algo/scripts/right.html create mode 100644 python-mega-algo/scripts/validate_filenames.py create mode 100644 python-mega-algo/scripts/validate_solutions.py create mode 100644 python-mega-algo/searches/__init__.py create mode 100644 python-mega-algo/searches/binary_search.py create mode 100644 python-mega-algo/searches/binary_tree_traversal.py create mode 100644 python-mega-algo/searches/double_linear_search.py create mode 100644 python-mega-algo/searches/double_linear_search_recursion.py create mode 100644 python-mega-algo/searches/fibonacci_search.py create mode 100644 python-mega-algo/searches/hill_climbing.py create mode 100644 python-mega-algo/searches/interpolation_search.py create mode 100644 python-mega-algo/searches/jump_search.py create mode 100644 python-mega-algo/searches/linear_search.py create mode 100644 python-mega-algo/searches/quick_select.py create mode 100644 python-mega-algo/searches/right.html create mode 100644 python-mega-algo/searches/sentinel_linear_search.py create mode 100644 python-mega-algo/searches/simple_binary_search.py create mode 100644 python-mega-algo/searches/simulated_annealing.py create mode 100644 python-mega-algo/searches/tabu_search.py create mode 100644 python-mega-algo/searches/tabu_test_data.txt create mode 100644 python-mega-algo/searches/ternary_search.py create mode 100644 python-mega-algo/sorts/__init__.py create mode 100644 python-mega-algo/sorts/bead_sort.py create mode 100644 python-mega-algo/sorts/bitonic_sort.py create mode 100644 python-mega-algo/sorts/bogo_sort.py create mode 100644 python-mega-algo/sorts/bubble_sort.py create mode 100644 python-mega-algo/sorts/bucket_sort.py create mode 100644 python-mega-algo/sorts/cocktail_shaker_sort.py create mode 100644 python-mega-algo/sorts/comb_sort.py create mode 100644 python-mega-algo/sorts/counting_sort.py create mode 100644 python-mega-algo/sorts/cycle_sort.py create mode 100644 python-mega-algo/sorts/double_sort.py create mode 100644 python-mega-algo/sorts/external_sort.py create mode 100644 python-mega-algo/sorts/gnome_sort.py create mode 100644 python-mega-algo/sorts/heap_sort.py create mode 100644 python-mega-algo/sorts/insertion_sort.py create mode 100644 python-mega-algo/sorts/intro_sort.py create mode 100644 python-mega-algo/sorts/iterative_merge_sort.py create mode 100644 python-mega-algo/sorts/merge_insertion_sort.py create mode 100644 python-mega-algo/sorts/merge_sort.py create mode 100644 python-mega-algo/sorts/msd_radix_sort.py create mode 100644 python-mega-algo/sorts/natural_sort.py create mode 100644 python-mega-algo/sorts/normal_distribution_quick_sort.md create mode 100644 python-mega-algo/sorts/odd_even_sort.py create mode 100644 python-mega-algo/sorts/odd_even_transposition_parallel.py create mode 100644 python-mega-algo/sorts/odd_even_transposition_single_threaded.py create mode 100644 python-mega-algo/sorts/pancake_sort.py create mode 100644 python-mega-algo/sorts/patience_sort.py create mode 100644 python-mega-algo/sorts/pigeon_sort.py create mode 100644 python-mega-algo/sorts/pigeonhole_sort.py create mode 100644 python-mega-algo/sorts/quick_sort.py create mode 100644 python-mega-algo/sorts/quick_sort_3_partition.py create mode 100644 python-mega-algo/sorts/radix_sort.py create mode 100644 python-mega-algo/sorts/random_normal_distribution_quicksort.py create mode 100644 python-mega-algo/sorts/random_pivot_quick_sort.py create mode 100644 python-mega-algo/sorts/recursive_bubble_sort.py create mode 100644 python-mega-algo/sorts/recursive_insertion_sort.py create mode 100644 python-mega-algo/sorts/recursive_mergesort_array.py create mode 100644 python-mega-algo/sorts/recursive_quick_sort.py create mode 100644 python-mega-algo/sorts/right.html create mode 100644 python-mega-algo/sorts/selection_sort.py create mode 100644 python-mega-algo/sorts/shell_sort.py create mode 100644 python-mega-algo/sorts/slowsort.py create mode 100644 python-mega-algo/sorts/stooge_sort.py create mode 100644 python-mega-algo/sorts/strand_sort.py create mode 100644 python-mega-algo/sorts/tim_sort.py create mode 100644 python-mega-algo/sorts/topological_sort.py create mode 100644 python-mega-algo/sorts/tree_sort.py create mode 100644 python-mega-algo/sorts/unknown_sort.py create mode 100644 python-mega-algo/sorts/wiggle_sort.py create mode 100644 python-mega-algo/strings/__init__.py create mode 100644 python-mega-algo/strings/aho_corasick.py create mode 100644 python-mega-algo/strings/anagrams.py create mode 100644 python-mega-algo/strings/autocomplete_using_trie.py create mode 100644 python-mega-algo/strings/boyer_moore_search.py create mode 100644 python-mega-algo/strings/can_string_be_rearranged_as_palindrome.py create mode 100644 python-mega-algo/strings/capitalize.py create mode 100644 python-mega-algo/strings/check_anagrams.py create mode 100644 python-mega-algo/strings/check_pangram.py create mode 100644 python-mega-algo/strings/detecting_english_programmatically.py create mode 100644 python-mega-algo/strings/dictionary.txt create mode 100644 python-mega-algo/strings/frequency_finder.py create mode 100644 python-mega-algo/strings/is_palindrome.py create mode 100644 python-mega-algo/strings/jaro_winkler.py create mode 100644 python-mega-algo/strings/knuth_morris_pratt.py create mode 100644 python-mega-algo/strings/levenshtein_distance.py create mode 100644 python-mega-algo/strings/lower.py create mode 100644 python-mega-algo/strings/manacher.py create mode 100644 python-mega-algo/strings/min_cost_string_conversion.py create mode 100644 python-mega-algo/strings/naive_string_search.py create mode 100644 python-mega-algo/strings/palindrome.py create mode 100644 python-mega-algo/strings/prefix_function.py create mode 100644 python-mega-algo/strings/rabin_karp.py create mode 100644 python-mega-algo/strings/remove_duplicate.py create mode 100644 python-mega-algo/strings/reverse_letters.py create mode 100644 python-mega-algo/strings/reverse_words.py create mode 100644 python-mega-algo/strings/right.html create mode 100644 python-mega-algo/strings/split.py create mode 100644 python-mega-algo/strings/swap_case.py create mode 100644 python-mega-algo/strings/upper.py create mode 100644 python-mega-algo/strings/word_occurrence.py create mode 100644 python-mega-algo/strings/word_patterns.py create mode 100644 python-mega-algo/strings/words.txt create mode 100644 python-mega-algo/strings/z_function.py create mode 100644 python-mega-algo/web_programming/__init__.py create mode 100644 python-mega-algo/web_programming/co2_emission.py create mode 100644 python-mega-algo/web_programming/covid_stats_via_xpath.py create mode 100644 python-mega-algo/web_programming/crawl_google_results.py create mode 100644 python-mega-algo/web_programming/crawl_google_scholar_citation.py create mode 100644 python-mega-algo/web_programming/currency_converter.py create mode 100644 python-mega-algo/web_programming/current_stock_price.py create mode 100644 python-mega-algo/web_programming/current_weather.py create mode 100644 python-mega-algo/web_programming/daily_horoscope.py create mode 100644 python-mega-algo/web_programming/emails_from_url.py create mode 100644 python-mega-algo/web_programming/fetch_bbc_news.py create mode 100644 python-mega-algo/web_programming/fetch_github_info.py create mode 100644 python-mega-algo/web_programming/fetch_jobs.py create mode 100644 python-mega-algo/web_programming/get_imdb_top_250_movies_csv.py create mode 100644 python-mega-algo/web_programming/get_imdbtop.py create mode 100644 python-mega-algo/web_programming/instagram_crawler.py create mode 100644 python-mega-algo/web_programming/instagram_pic.py create mode 100644 python-mega-algo/web_programming/instagram_video.py create mode 100644 python-mega-algo/web_programming/recaptcha_verification.py create mode 100644 python-mega-algo/web_programming/right.html create mode 100644 python-mega-algo/web_programming/slack_message.py create mode 100644 python-mega-algo/web_programming/test_fetch_github_info.py create mode 100644 python-mega-algo/web_programming/world_covid19_stats.py create mode 100644 right.html diff --git a/DOCS/_static/basic.css b/DOCS/_static/basic.css new file mode 100644 index 00000000..01192852 --- /dev/null +++ b/DOCS/_static/basic.css @@ -0,0 +1,768 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2020 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li div.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 450px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a.brackets:before, +span.brackets > a:before{ + content: "["; +} + +a.brackets:after, +span.brackets > a:after { + content: "]"; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px 7px 0 7px; + background-color: #ffe; + width: 40%; + float: right; +} + +p.sidebar-title { + font-weight: bold; +} + +/* -- topics ---------------------------------------------------------------- */ + +div.topic { + border: 1px solid #ccc; + padding: 7px 7px 0 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +div.admonition dl { + margin-bottom: 0; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +table.footnote td, table.footnote th { + border: 0 !important; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > p:first-child, +td > p:first-child { + margin-top: 0px; +} + +th > p:last-child, +td > p:last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist td { + vertical-align: top; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +li > p:first-child { + margin-top: 0px; +} + +li > p:last-child { + margin-bottom: 0px; +} + +dl.footnote > dt, +dl.citation > dt { + float: left; +} + +dl.footnote > dd, +dl.citation > dd { + margin-bottom: 0em; +} + +dl.footnote > dd:after, +dl.citation > dd:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dt:after { + content: ":"; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > p:first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0.5em; + content: ":"; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; +} + +td.linenos pre { + padding: 5px 0px; + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + margin-left: 0.5em; +} + +table.highlighttable td { + padding: 0 0.5em 0 0.5em; +} + +div.code-block-caption { + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +div.code-block-caption + div > div.highlight > pre { + margin-top: 0; +} + +div.doctest > div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + padding: 1em 1em 0; +} + +div.literal-block-wrapper div.highlight { + margin: 0; +} + +code.descname { + background-color: transparent; + font-weight: bold; + font-size: 1.2em; +} + +code.descclassname { + background-color: transparent; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: relative; + left: 0px; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/DOCS/_static/classic.css b/DOCS/_static/classic.css new file mode 100644 index 00000000..15375cc0 --- /dev/null +++ b/DOCS/_static/classic.css @@ -0,0 +1,271 @@ +/* + * classic.css_t + * ~~~~~~~~~~~~~ + * + * Sphinx stylesheet -- classic theme. + * + * :copyright: Copyright 2007-2020 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +@import url("basic.css"); + +/* -- page layout ----------------------------------------------------------- */ + +html { + /* CSS hack for macOS's scrollbar (see #1125) */ + background-color: #FFFFFF; +} + +body { + font-family: 'Lucida Grande', Arial, sans-serif; + font-size: 100%; + background-color: white; + color: #000; + margin: 0; + padding: 0; +} + +div.document { + background-color: white; +} + +div.documentwrapper { + float: left; + width: 100%; +} + +div.bodywrapper { + margin: 0 0 0 230px; +} + +div.body { + background-color: white; + color: #222222; + padding: 0 20px 30px 20px; +} + +div.footer { + color: #555555; + width: 100%; + padding: 9px 0 9px 0; + text-align: center; + font-size: 75%; +} + +div.footer a { + color: #555555; + text-decoration: underline; +} + +div.related { + background-color: white; + line-height: 30px; + color: #666666; +} + +div.related a { + color: #444444; +} + +div.sphinxsidebar { +} + +div.sphinxsidebar h3 { + font-family: 'Lucida Grande', Arial, sans-serif; + color: #444444; + font-size: 1.4em; + font-weight: normal; + margin: 0; + padding: 0; +} + +div.sphinxsidebar h3 a { + color: #444444; +} + +div.sphinxsidebar h4 { + font-family: 'Lucida Grande', Arial, sans-serif; + color: #444444; + font-size: 1.3em; + font-weight: normal; + margin: 5px 0 0 0; + padding: 0; +} + +div.sphinxsidebar p { + color: #444444; +} + +div.sphinxsidebar p.topless { + margin: 5px 10px 10px 10px; +} + +div.sphinxsidebar ul { + margin: 10px; + padding: 0; + color: #444444; +} + +div.sphinxsidebar a { + color: #444444; +} + +div.sphinxsidebar input { + border: 1px solid #444444; + font-family: sans-serif; + font-size: 1em; +} + + +/* for collapsible sidebar */ +div#sidebarbutton { + background-color: #3c6e83; +} + + +/* -- hyperlink styles ------------------------------------------------------ */ + +a { + color: #0090c0; + text-decoration: none; +} + +a:visited { + color: #00608f; + text-decoration: none; +} + +a:hover { + text-decoration: underline; +} + + + +/* -- body styles ----------------------------------------------------------- */ + +div.body h1, +div.body h2, +div.body h3, +div.body h4, +div.body h5, +div.body h6 { + font-family: 'Lucida Grande', Arial, sans-serif; + background-color: white; + font-weight: normal; + color: #1a1a1a; + border-bottom: 1px solid #ccc; + margin: 20px -20px 10px -20px; + padding: 3px 0 3px 10px; +} + +div.body h1 { margin-top: 0; font-size: 200%; } +div.body h2 { font-size: 160%; } +div.body h3 { font-size: 140%; } +div.body h4 { font-size: 120%; } +div.body h5 { font-size: 110%; } +div.body h6 { font-size: 100%; } + +a.headerlink { + color: #aaaaaa; + font-size: 0.8em; + padding: 0 4px 0 4px; + text-decoration: none; +} + +a.headerlink:hover { + background-color: #aaaaaa; + color: white; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + text-align: justify; + line-height: 130%; +} + +div.admonition p.admonition-title + p { + display: inline; +} + +div.admonition p { + margin-bottom: 5px; +} + +div.admonition pre { + margin-bottom: 5px; +} + +div.admonition ul, div.admonition ol { + margin-bottom: 5px; +} + +div.note { + background-color: #eee; + border: 1px solid #ccc; +} + +div.seealso { + background-color: #ffc; + border: 1px solid #ff6; +} + +div.topic { + background-color: #eee; +} + +div.warning { + background-color: #ffe4e4; + border: 1px solid #f66; +} + +p.admonition-title { + display: inline; +} + +p.admonition-title:after { + content: ":"; +} + +pre { + padding: 5px; + background-color: #eeffcc; + color: #333333; + line-height: 120%; + border: 1px solid #ac9; + border-left: none; + border-right: none; +} + +code { + background-color: #ecf0f3; + padding: 0 1px 0 1px; + font-size: 0.95em; +} + +th, dl.field-list > dt { + background-color: #ede; +} + +.warning code { + background: #efc2c2; +} + +.note code { + background: #d6d6d6; +} + +.viewcode-back { + font-family: 'Lucida Grande', Arial, sans-serif; +} + +div.viewcode-block:target { + background-color: #f4debf; + border-top: 1px solid #ac9; + border-bottom: 1px solid #ac9; +} + +div.code-block-caption { + color: #efefef; + background-color: #1c4e63; +} \ No newline at end of file diff --git a/DOCS/_static/copybutton.js b/DOCS/_static/copybutton.js new file mode 100644 index 00000000..f5960d26 --- /dev/null +++ b/DOCS/_static/copybutton.js @@ -0,0 +1,64 @@ +$(document).ready(function() { + /* Add a [>>>] button on the top-right corner of code samples to hide + * the >>> and ... prompts and the output and thus make the code + * copyable. */ + var div = $('.highlight-python .highlight,' + + '.highlight-python3 .highlight,' + + '.highlight-pycon .highlight,' + + '.highlight-default .highlight'); + var pre = div.find('pre'); + + // get the styles from the current theme + pre.parent().parent().css('position', 'relative'); + var hide_text = 'Hide the prompts and output'; + var show_text = 'Show the prompts and output'; + var border_width = pre.css('border-top-width'); + var border_style = pre.css('border-top-style'); + var border_color = pre.css('border-top-color'); + var button_styles = { + 'cursor':'pointer', 'position': 'absolute', 'top': '0', 'right': '0', + 'border-color': border_color, 'border-style': border_style, + 'border-width': border_width, 'color': border_color, 'text-size': '75%', + 'font-family': 'monospace', 'padding-left': '0.2em', 'padding-right': '0.2em', + 'border-radius': '0 3px 0 0' + } + + // create and add the button to all the code blocks that contain >>> + div.each(function(index) { + var jthis = $(this); + if (jthis.find('.gp').length > 0) { + var button = $('>>>'); + button.css(button_styles) + button.attr('title', hide_text); + button.data('hidden', 'false'); + jthis.prepend(button); + } + // tracebacks (.gt) contain bare text elements that need to be + // wrapped in a span to work with .nextUntil() (see later) + jthis.find('pre:has(.gt)').contents().filter(function() { + return ((this.nodeType == 3) && (this.data.trim().length > 0)); + }).wrap(''); + }); + + // define the behavior of the button when it's clicked + $('.copybutton').click(function(e){ + e.preventDefault(); + var button = $(this); + if (button.data('hidden') === 'false') { + // hide the code output + button.parent().find('.go, .gp, .gt').hide(); + button.next('pre').find('.gt').nextUntil('.gp, .go').css('visibility', 'hidden'); + button.css('text-decoration', 'line-through'); + button.attr('title', show_text); + button.data('hidden', 'true'); + } else { + // show the code output + button.parent().find('.go, .gp, .gt').show(); + button.next('pre').find('.gt').nextUntil('.gp, .go').css('visibility', 'visible'); + button.css('text-decoration', 'none'); + button.attr('title', hide_text); + button.data('hidden', 'false'); + } + }); +}); + diff --git a/DOCS/_static/default.css b/DOCS/_static/default.css new file mode 100644 index 00000000..81b93636 --- /dev/null +++ b/DOCS/_static/default.css @@ -0,0 +1 @@ +@import url("classic.css"); diff --git a/DOCS/_static/doctools.js b/DOCS/_static/doctools.js new file mode 100644 index 00000000..daccd209 --- /dev/null +++ b/DOCS/_static/doctools.js @@ -0,0 +1,315 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Sphinx JavaScript utilities for all documentation. + * + * :copyright: Copyright 2007-2020 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/** + * select a different prefix for underscore + */ +$u = _.noConflict(); + +/** + * make the code below compatible with browsers without + * an installed firebug like debugger +if (!window.console || !console.firebug) { + var names = ["log", "debug", "info", "warn", "error", "assert", "dir", + "dirxml", "group", "groupEnd", "time", "timeEnd", "count", "trace", + "profile", "profileEnd"]; + window.console = {}; + for (var i = 0; i < names.length; ++i) + window.console[names[i]] = function() {}; +} + */ + +/** + * small helper function to urldecode strings + */ +jQuery.urldecode = function(x) { + return decodeURIComponent(x).replace(/\+/g, ' '); +}; + +/** + * small helper function to urlencode strings + */ +jQuery.urlencode = encodeURIComponent; + +/** + * This function returns the parsed url parameters of the + * current request. Multiple values per key are supported, + * it will always return arrays of strings for the value parts. + */ +jQuery.getQueryParameters = function(s) { + if (typeof s === 'undefined') + s = document.location.search; + var parts = s.substr(s.indexOf('?') + 1).split('&'); + var result = {}; + for (var i = 0; i < parts.length; i++) { + var tmp = parts[i].split('=', 2); + var key = jQuery.urldecode(tmp[0]); + var value = jQuery.urldecode(tmp[1]); + if (key in result) + result[key].push(value); + else + result[key] = [value]; + } + return result; +}; + +/** + * highlight a given string on a jquery object by wrapping it in + * span elements with the given class name. + */ +jQuery.fn.highlightText = function(text, className) { + function highlight(node, addItems) { + if (node.nodeType === 3) { + var val = node.nodeValue; + var pos = val.toLowerCase().indexOf(text); + if (pos >= 0 && + !jQuery(node.parentNode).hasClass(className) && + !jQuery(node.parentNode).hasClass("nohighlight")) { + var span; + var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.className = className; + } + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + node.parentNode.insertBefore(span, node.parentNode.insertBefore( + document.createTextNode(val.substr(pos + text.length)), + node.nextSibling)); + node.nodeValue = val.substr(0, pos); + if (isInSVG) { + var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect"); + var bbox = node.parentElement.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute('class', className); + addItems.push({ + "parent": node.parentNode, + "target": rect}); + } + } + } + else if (!jQuery(node).is("button, select, textarea")) { + jQuery.each(node.childNodes, function() { + highlight(this, addItems); + }); + } + } + var addItems = []; + var result = this.each(function() { + highlight(this, addItems); + }); + for (var i = 0; i < addItems.length; ++i) { + jQuery(addItems[i].parent).before(addItems[i].target); + } + return result; +}; + +/* + * backward compatibility for jQuery.browser + * This will be supported until firefox bug is fixed. + */ +if (!jQuery.browser) { + jQuery.uaMatch = function(ua) { + ua = ua.toLowerCase(); + + var match = /(chrome)[ \/]([\w.]+)/.exec(ua) || + /(webkit)[ \/]([\w.]+)/.exec(ua) || + /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) || + /(msie) ([\w.]+)/.exec(ua) || + ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) || + []; + + return { + browser: match[ 1 ] || "", + version: match[ 2 ] || "0" + }; + }; + jQuery.browser = {}; + jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true; +} + +/** + * Small JavaScript module for the documentation. + */ +var Documentation = { + + init : function() { + this.fixFirefoxAnchorBug(); + this.highlightSearchWords(); + this.initIndexTable(); + if (DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) { + this.initOnKeyListeners(); + } + }, + + /** + * i18n support + */ + TRANSLATIONS : {}, + PLURAL_EXPR : function(n) { return n === 1 ? 0 : 1; }, + LOCALE : 'unknown', + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext : function(string) { + var translated = Documentation.TRANSLATIONS[string]; + if (typeof translated === 'undefined') + return string; + return (typeof translated === 'string') ? translated : translated[0]; + }, + + ngettext : function(singular, plural, n) { + var translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated === 'undefined') + return (n == 1) ? singular : plural; + return translated[Documentation.PLURALEXPR(n)]; + }, + + addTranslations : function(catalog) { + for (var key in catalog.messages) + this.TRANSLATIONS[key] = catalog.messages[key]; + this.PLURAL_EXPR = new Function('n', 'return +(' + catalog.plural_expr + ')'); + this.LOCALE = catalog.locale; + }, + + /** + * add context elements like header anchor links + */ + addContextElements : function() { + $('div[id] > :header:first').each(function() { + $('\u00B6'). + attr('href', '#' + this.id). + attr('title', _('Permalink to this headline')). + appendTo(this); + }); + $('dt[id]').each(function() { + $('\u00B6'). + attr('href', '#' + this.id). + attr('title', _('Permalink to this definition')). + appendTo(this); + }); + }, + + /** + * workaround a firefox stupidity + * see: https://bugzilla.mozilla.org/show_bug.cgi?id=645075 + */ + fixFirefoxAnchorBug : function() { + if (document.location.hash && $.browser.mozilla) + window.setTimeout(function() { + document.location.href += ''; + }, 10); + }, + + /** + * highlight the search words provided in the url in the text + */ + highlightSearchWords : function() { + var params = $.getQueryParameters(); + var terms = (params.highlight) ? params.highlight[0].split(/\s+/) : []; + if (terms.length) { + var body = $('div.body'); + if (!body.length) { + body = $('body'); + } + window.setTimeout(function() { + $.each(terms, function() { + body.highlightText(this.toLowerCase(), 'highlighted'); + }); + }, 10); + $('') + .appendTo($('#searchbox')); + } + }, + + /** + * init the domain index toggle buttons + */ + initIndexTable : function() { + var togglers = $('img.toggler').click(function() { + var src = $(this).attr('src'); + var idnum = $(this).attr('id').substr(7); + $('tr.cg-' + idnum).toggle(); + if (src.substr(-9) === 'minus.png') + $(this).attr('src', src.substr(0, src.length-9) + 'plus.png'); + else + $(this).attr('src', src.substr(0, src.length-8) + 'minus.png'); + }).css('display', ''); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) { + togglers.click(); + } + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords : function() { + $('#searchbox .highlight-link').fadeOut(300); + $('span.highlighted').removeClass('highlighted'); + }, + + /** + * make the url absolute + */ + makeURL : function(relativeURL) { + return DOCUMENTATION_OPTIONS.URL_ROOT + '/' + relativeURL; + }, + + /** + * get the current relative url + */ + getCurrentURL : function() { + var path = document.location.pathname; + var parts = path.split(/\//); + $.each(DOCUMENTATION_OPTIONS.URL_ROOT.split(/\//), function() { + if (this === '..') + parts.pop(); + }); + var url = parts.join('/'); + return path.substring(url.lastIndexOf('/') + 1, path.length - 1); + }, + + initOnKeyListeners: function() { + $(document).keydown(function(event) { + var activeElementType = document.activeElement.tagName; + // don't navigate when in search box or textarea + if (activeElementType !== 'TEXTAREA' && activeElementType !== 'INPUT' && activeElementType !== 'SELECT' + && !event.altKey && !event.ctrlKey && !event.metaKey && !event.shiftKey) { + switch (event.keyCode) { + case 37: // left + var prevHref = $('link[rel="prev"]').prop('href'); + if (prevHref) { + window.location.href = prevHref; + return false; + } + case 39: // right + var nextHref = $('link[rel="next"]').prop('href'); + if (nextHref) { + window.location.href = nextHref; + return false; + } + } + } + }); + } +}; + +// quick alias for translations +_ = Documentation.gettext; + +$(document).ready(function() { + Documentation.init(); +}); diff --git a/DOCS/_static/documentation_options.js b/DOCS/_static/documentation_options.js new file mode 100644 index 00000000..ed565a01 --- /dev/null +++ b/DOCS/_static/documentation_options.js @@ -0,0 +1,11 @@ +var DOCUMENTATION_OPTIONS = { + URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'), + VERSION: '3.9.5', + LANGUAGE: 'None', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false +}; \ No newline at end of file diff --git a/DOCS/_static/file.png b/DOCS/_static/file.png new file mode 100644 index 0000000000000000000000000000000000000000..a858a410e4faa62ce324d814e4b816fff83a6fb3 GIT binary patch literal 286 zcmV+(0pb3MP)s`hMrGg#P~ix$^RISR_I47Y|r1 z_CyJOe}D1){SET-^Amu_i71Lt6eYfZjRyw@I6OQAIXXHDfiX^GbOlHe=Ae4>0m)d(f|Me07*qoM6N<$f}vM^LjV8( literal 0 HcmV?d00001 diff --git a/DOCS/_static/jquery.js b/DOCS/_static/jquery.js new file mode 100644 index 00000000..a1c07fd8 --- /dev/null +++ b/DOCS/_static/jquery.js @@ -0,0 +1,2 @@ +/*! jQuery v3.4.1 | (c) JS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],E=C.document,r=Object.getPrototypeOf,s=t.slice,g=t.concat,u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},x=function(e){return null!=e&&e===e.window},c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.4.1",k=function(e,t){return new k.fn.init(e,t)},p=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;function d(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp($),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+$),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),ne=function(e,t,n){var r="0x"+t-65536;return r!=r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(m.childNodes),m.childNodes),t[m.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&((e?e.ownerDocument||e:m)!==C&&T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!A[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&U.test(t)){(s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=k),o=(l=h(t)).length;while(o--)l[o]="#"+s+" "+xe(l[o]);c=l.join(","),f=ee.test(t)&&ye(e.parentNode)||e}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){A(t,!0)}finally{s===k&&e.removeAttribute("id")}}}return g(t.replace(B,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[k]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:m;return r!==C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),m!==C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=k,!C.getElementsByName||!C.getElementsByName(k).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+k+"-]").length||v.push("~="),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+k+"+*").length||v.push(".#.+[+~]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",$)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e===C||e.ownerDocument===m&&y(m,e)?-1:t===C||t.ownerDocument===m&&y(m,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e===C?-1:t===C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]===m?-1:s[r]===m?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if((e.ownerDocument||e)!==C&&T(e),d.matchesSelector&&E&&!A[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){A(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=p[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&p(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?k.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?k.grep(e,function(e){return e===n!==r}):"string"!=typeof n?k.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(k.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:L.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof k?t[0]:t,k.merge(this,k.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),D.test(r[1])&&k.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(k):k.makeArray(e,this)}).prototype=k.fn,q=k(E);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}k.fn.extend({has:function(e){var t=k(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i,ge={option:[1,""],thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?k.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;nx",y.noCloneChecked=!!me.cloneNode(!0).lastChild.defaultValue;var Te=/^key/,Ce=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ee=/^([^.]*)(?:\.(.+)|)/;function ke(){return!0}function Se(){return!1}function Ne(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ae(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ae(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Se;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return k().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=k.guid++)),e.each(function(){k.event.add(this,t,i,r,n)})}function De(e,i,o){o?(Q.set(e,i,!1),k.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Q.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(k.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Q.set(this,i,r),t=o(this,i),this[i](),r!==(n=Q.get(this,i))||t?Q.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Q.set(this,i,{value:k.event.trigger(k.extend(r[0],k.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Q.get(e,i)&&k.event.add(e,i,ke)}k.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.get(t);if(v){n.handler&&(n=(o=n).handler,i=o.selector),i&&k.find.matchesSelector(ie,i),n.guid||(n.guid=k.guid++),(u=v.events)||(u=v.events={}),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof k&&k.event.triggered!==e.type?k.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(R)||[""]).length;while(l--)d=g=(s=Ee.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=k.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=k.event.special[d]||{},c=k.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&k.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),k.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.hasData(e)&&Q.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(R)||[""]).length;while(l--)if(d=g=(s=Ee.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=k.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||k.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)k.event.remove(e,d+t[l],n,r,!0);k.isEmptyObject(u)&&Q.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=k.event.fix(e),u=new Array(arguments.length),l=(Q.get(this,"events")||{})[s.type]||[],c=k.event.special[s.type]||{};for(u[0]=s,t=1;t\x20\t\r\n\f]*)[^>]*)\/>/gi,qe=/\s*$/g;function Oe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&k(e).children("tbody")[0]||e}function Pe(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Re(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Me(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(Q.hasData(e)&&(o=Q.access(e),a=Q.set(t,o),l=o.events))for(i in delete a.handle,a.events={},l)for(n=0,r=l[i].length;n")},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=oe(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||k.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Vt,Gt=[],Yt=/(=)\?(?=&|$)|\?\?/;k.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Gt.pop()||k.expando+"_"+kt++;return this[e]=!0,e}}),k.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Yt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Yt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Yt,"$1"+r):!1!==e.jsonp&&(e.url+=(St.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||k.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?k(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Gt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Vt=E.implementation.createHTMLDocument("").body).innerHTML="
",2===Vt.childNodes.length),k.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=D.exec(e))?[t.createElement(i[1])]:(i=we([e],t,o),o&&o.length&&k(o).remove(),k.merge([],i.childNodes)));var r,i,o},k.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(k.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},k.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){k.fn[t]=function(e){return this.on(t,e)}}),k.expr.pseudos.animated=function(t){return k.grep(k.timers,function(e){return t===e.elem}).length},k.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=k.css(e,"position"),c=k(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=k.css(e,"top"),u=k.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,k.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},k.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){k.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===k.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===k.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=k(e).offset()).top+=k.css(e,"borderTopWidth",!0),i.left+=k.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-k.css(r,"marginTop",!0),left:t.left-i.left-k.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===k.css(e,"position"))e=e.offsetParent;return e||ie})}}),k.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;k.fn[t]=function(e){return _(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),k.each(["top","left"],function(e,n){k.cssHooks[n]=ze(y.pixelPosition,function(e,t){if(t)return t=_e(e,n),$e.test(t)?k(e).position()[n]+"px":t})}),k.each({Height:"height",Width:"width"},function(a,s){k.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){k.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return _(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?k.css(e,t,i):k.style(e,t,n,i)},s,n?e:void 0,n)}})}),k.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){k.fn[n]=function(e,t){return 00 + var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 + var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 + var s_v = "^(" + C + ")?" + v; // vowel in stem + + this.stemWord = function (w) { + var stem; + var suffix; + var firstch; + var origword = w; + + if (w.length < 3) + return w; + + var re; + var re2; + var re3; + var re4; + + firstch = w.substr(0,1); + if (firstch == "y") + w = firstch.toUpperCase() + w.substr(1); + + // Step 1a + re = /^(.+?)(ss|i)es$/; + re2 = /^(.+?)([^s])s$/; + + if (re.test(w)) + w = w.replace(re,"$1$2"); + else if (re2.test(w)) + w = w.replace(re2,"$1$2"); + + // Step 1b + re = /^(.+?)eed$/; + re2 = /^(.+?)(ed|ing)$/; + if (re.test(w)) { + var fp = re.exec(w); + re = new RegExp(mgr0); + if (re.test(fp[1])) { + re = /.$/; + w = w.replace(re,""); + } + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1]; + re2 = new RegExp(s_v); + if (re2.test(stem)) { + w = stem; + re2 = /(at|bl|iz)$/; + re3 = new RegExp("([^aeiouylsz])\\1$"); + re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re2.test(w)) + w = w + "e"; + else if (re3.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + else if (re4.test(w)) + w = w + "e"; + } + } + + // Step 1c + re = /^(.+?)y$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(s_v); + if (re.test(stem)) + w = stem + "i"; + } + + // Step 2 + re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step2list[suffix]; + } + + // Step 3 + re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step3list[suffix]; + } + + // Step 4 + re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; + re2 = /^(.+?)(s|t)(ion)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + if (re.test(stem)) + w = stem; + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1] + fp[2]; + re2 = new RegExp(mgr1); + if (re2.test(stem)) + w = stem; + } + + // Step 5 + re = /^(.+?)e$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + re2 = new RegExp(meq1); + re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) + w = stem; + } + re = /ll$/; + re2 = new RegExp(mgr1); + if (re.test(w) && re2.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + + // and turn initial Y back to y + if (firstch == "y") + w = firstch.toLowerCase() + w.substr(1); + return w; + } +} + + + + + +var splitChars = (function() { + var result = {}; + var singles = [96, 180, 187, 191, 215, 247, 749, 885, 903, 907, 909, 930, 1014, 1648, + 1748, 1809, 2416, 2473, 2481, 2526, 2601, 2609, 2612, 2615, 2653, 2702, + 2706, 2729, 2737, 2740, 2857, 2865, 2868, 2910, 2928, 2948, 2961, 2971, + 2973, 3085, 3089, 3113, 3124, 3213, 3217, 3241, 3252, 3295, 3341, 3345, + 3369, 3506, 3516, 3633, 3715, 3721, 3736, 3744, 3748, 3750, 3756, 3761, + 3781, 3912, 4239, 4347, 4681, 4695, 4697, 4745, 4785, 4799, 4801, 4823, + 4881, 5760, 5901, 5997, 6313, 7405, 8024, 8026, 8028, 8030, 8117, 8125, + 8133, 8181, 8468, 8485, 8487, 8489, 8494, 8527, 11311, 11359, 11687, 11695, + 11703, 11711, 11719, 11727, 11735, 12448, 12539, 43010, 43014, 43019, 43587, + 43696, 43713, 64286, 64297, 64311, 64317, 64319, 64322, 64325, 65141]; + var i, j, start, end; + for (i = 0; i < singles.length; i++) { + result[singles[i]] = true; + } + var ranges = [[0, 47], [58, 64], [91, 94], [123, 169], [171, 177], [182, 184], [706, 709], + [722, 735], [741, 747], [751, 879], [888, 889], [894, 901], [1154, 1161], + [1318, 1328], [1367, 1368], [1370, 1376], [1416, 1487], [1515, 1519], [1523, 1568], + [1611, 1631], [1642, 1645], [1750, 1764], [1767, 1773], [1789, 1790], [1792, 1807], + [1840, 1868], [1958, 1968], [1970, 1983], [2027, 2035], [2038, 2041], [2043, 2047], + [2070, 2073], [2075, 2083], [2085, 2087], [2089, 2307], [2362, 2364], [2366, 2383], + [2385, 2391], [2402, 2405], [2419, 2424], [2432, 2436], [2445, 2446], [2449, 2450], + [2483, 2485], [2490, 2492], [2494, 2509], [2511, 2523], [2530, 2533], [2546, 2547], + [2554, 2564], [2571, 2574], [2577, 2578], [2618, 2648], [2655, 2661], [2672, 2673], + [2677, 2692], [2746, 2748], [2750, 2767], [2769, 2783], [2786, 2789], [2800, 2820], + [2829, 2830], [2833, 2834], [2874, 2876], [2878, 2907], [2914, 2917], [2930, 2946], + [2955, 2957], [2966, 2968], [2976, 2978], [2981, 2983], [2987, 2989], [3002, 3023], + [3025, 3045], [3059, 3076], [3130, 3132], [3134, 3159], [3162, 3167], [3170, 3173], + [3184, 3191], [3199, 3204], [3258, 3260], [3262, 3293], [3298, 3301], [3312, 3332], + [3386, 3388], [3390, 3423], [3426, 3429], [3446, 3449], [3456, 3460], [3479, 3481], + [3518, 3519], [3527, 3584], [3636, 3647], [3655, 3663], [3674, 3712], [3717, 3718], + [3723, 3724], [3726, 3731], [3752, 3753], [3764, 3772], [3774, 3775], [3783, 3791], + [3802, 3803], [3806, 3839], [3841, 3871], [3892, 3903], [3949, 3975], [3980, 4095], + [4139, 4158], [4170, 4175], [4182, 4185], [4190, 4192], [4194, 4196], [4199, 4205], + [4209, 4212], [4226, 4237], [4250, 4255], [4294, 4303], [4349, 4351], [4686, 4687], + [4702, 4703], [4750, 4751], [4790, 4791], [4806, 4807], [4886, 4887], [4955, 4968], + [4989, 4991], [5008, 5023], [5109, 5120], [5741, 5742], [5787, 5791], [5867, 5869], + [5873, 5887], [5906, 5919], [5938, 5951], [5970, 5983], [6001, 6015], [6068, 6102], + [6104, 6107], [6109, 6111], [6122, 6127], [6138, 6159], [6170, 6175], [6264, 6271], + [6315, 6319], [6390, 6399], [6429, 6469], [6510, 6511], [6517, 6527], [6572, 6592], + [6600, 6607], [6619, 6655], [6679, 6687], [6741, 6783], [6794, 6799], [6810, 6822], + [6824, 6916], [6964, 6980], [6988, 6991], [7002, 7042], [7073, 7085], [7098, 7167], + [7204, 7231], [7242, 7244], [7294, 7400], [7410, 7423], [7616, 7679], [7958, 7959], + [7966, 7967], [8006, 8007], [8014, 8015], [8062, 8063], [8127, 8129], [8141, 8143], + [8148, 8149], [8156, 8159], [8173, 8177], [8189, 8303], [8306, 8307], [8314, 8318], + [8330, 8335], [8341, 8449], [8451, 8454], [8456, 8457], [8470, 8472], [8478, 8483], + [8506, 8507], [8512, 8516], [8522, 8525], [8586, 9311], [9372, 9449], [9472, 10101], + [10132, 11263], [11493, 11498], [11503, 11516], [11518, 11519], [11558, 11567], + [11622, 11630], [11632, 11647], [11671, 11679], [11743, 11822], [11824, 12292], + [12296, 12320], [12330, 12336], [12342, 12343], [12349, 12352], [12439, 12444], + [12544, 12548], [12590, 12592], [12687, 12689], [12694, 12703], [12728, 12783], + [12800, 12831], [12842, 12880], [12896, 12927], [12938, 12976], [12992, 13311], + [19894, 19967], [40908, 40959], [42125, 42191], [42238, 42239], [42509, 42511], + [42540, 42559], [42592, 42593], [42607, 42622], [42648, 42655], [42736, 42774], + [42784, 42785], [42889, 42890], [42893, 43002], [43043, 43055], [43062, 43071], + [43124, 43137], [43188, 43215], [43226, 43249], [43256, 43258], [43260, 43263], + [43302, 43311], [43335, 43359], [43389, 43395], [43443, 43470], [43482, 43519], + [43561, 43583], [43596, 43599], [43610, 43615], [43639, 43641], [43643, 43647], + [43698, 43700], [43703, 43704], [43710, 43711], [43715, 43738], [43742, 43967], + [44003, 44015], [44026, 44031], [55204, 55215], [55239, 55242], [55292, 55295], + [57344, 63743], [64046, 64047], [64110, 64111], [64218, 64255], [64263, 64274], + [64280, 64284], [64434, 64466], [64830, 64847], [64912, 64913], [64968, 65007], + [65020, 65135], [65277, 65295], [65306, 65312], [65339, 65344], [65371, 65381], + [65471, 65473], [65480, 65481], [65488, 65489], [65496, 65497]]; + for (i = 0; i < ranges.length; i++) { + start = ranges[i][0]; + end = ranges[i][1]; + for (j = start; j <= end; j++) { + result[j] = true; + } + } + return result; +})(); + +function splitQuery(query) { + var result = []; + var start = -1; + for (var i = 0; i < query.length; i++) { + if (splitChars[query.charCodeAt(i)]) { + if (start !== -1) { + result.push(query.slice(start, i)); + start = -1; + } + } else if (start === -1) { + start = i; + } + } + if (start !== -1) { + result.push(query.slice(start)); + } + return result; +} + + diff --git a/DOCS/_static/py.png b/DOCS/_static/py.png new file mode 100644 index 0000000000000000000000000000000000000000..93e4a02c3d321c545898a2ebb8873c26dd8a9e5b GIT binary patch literal 695 zcmV;o0!aOdP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iOD~ z5jY_RGbdgE00K8jL_t(I%Vm>KNL4`;hrfH@vv+$Uln|xSCTLTOHmzE;5FTwpDtJ)a zz)exE-2_34AR^i+ZCXeh7m*-F5k*FrmbSHs%rX_!{PXUec{69`w(#D(>Vd<+%=bIz zH_V)XUD5sE?K5ebbKaSDu}#Dnq^Y!3`tis9>wSO*T+WBP3wS3NNBU~*PAtw^yjZ+< zQ5yK0z%d{y@_Pz6YdL>s7$6Y^hI$}5GUX?Ns>+iCUiRP z7h|*&%kQa?wQA%pYzqpaf*4?WM!x_ygY0K@07rplx^QhGhnE)r4wbx0x11<&3V?63 z=F8ch)p6iQ88E;iumPmSZif%JIwIgKh$T3)*ab8ImGLVf;IoYtVAb11Z&@wm>96=S z)!B&hojbAPoik&f)Lp;=N!HK;X~5oyfJ49$pbcorTyADv dm$H!t;2#0MumAjv0Ga>*002ovPDHLkV1gIiH5UK? literal 0 HcmV?d00001 diff --git a/DOCS/_static/pydoctheme.css b/DOCS/_static/pydoctheme.css new file mode 100644 index 00000000..33f74d79 --- /dev/null +++ b/DOCS/_static/pydoctheme.css @@ -0,0 +1,193 @@ +@import url("default.css"); + +body { + background-color: white; + margin-left: 1em; + margin-right: 1em; +} + +div.related { + margin-bottom: 1.2em; + padding: 0.5em 0; + border-top: 1px solid #ccc; + margin-top: 0.5em; +} + +div.related a:hover { + color: #0095C4; +} + +div.related:first-child { + border-top: 0; + border-bottom: 1px solid #ccc; +} + +.inline-search { + display: inline; +} +form.inline-search input { + display: inline; +} +form.inline-search input[type="submit"] { + width: 40px; +} + +div.sphinxsidebar { + background-color: #eeeeee; + border-radius: 5px; + line-height: 130%; + font-size: smaller; +} + +div.sphinxsidebar h3, div.sphinxsidebar h4 { + margin-top: 1.5em; +} + +div.sphinxsidebarwrapper > h3:first-child { + margin-top: 0.2em; +} + +div.sphinxsidebarwrapper > ul > li > ul > li { + margin-bottom: 0.4em; +} + +div.sphinxsidebar a:hover { + color: #0095C4; +} + +form.inline-search input, +div.sphinxsidebar input { + font-family: 'Lucida Grande',Arial,sans-serif; + border: 1px solid #999999; + font-size: smaller; + border-radius: 3px; +} + +div.sphinxsidebar input[type=text] { + max-width: 150px; +} + +div.body { + padding: 0 0 0 1.2em; +} + +div.body p { + line-height: 140%; +} + +div.body h1, div.body h2, div.body h3, div.body h4, div.body h5, div.body h6 { + margin: 0; + border: 0; + padding: 0.3em 0; +} + +div.body hr { + border: 0; + background-color: #ccc; + height: 1px; +} + +div.body pre { + border-radius: 3px; + border: 1px solid #ac9; +} + +div.body div.admonition, div.body div.impl-detail { + border-radius: 3px; +} + +div.body div.impl-detail > p { + margin: 0; +} + +div.body div.seealso { + border: 1px solid #dddd66; +} + +div.body a { + color: #0072aa; +} + +div.body a:visited { + color: #6363bb; +} + +div.body a:hover { + color: #00B0E4; +} + +tt, code, pre { + font-family: monospace, sans-serif; + font-size: 96.5%; +} + +div.body tt, div.body code { + border-radius: 3px; +} + +div.body tt.descname, div.body code.descname { + font-size: 120%; +} + +div.body tt.xref, div.body a tt, div.body code.xref, div.body a code { + font-weight: normal; +} + +table.docutils { + border: 1px solid #ddd; + min-width: 20%; + border-radius: 3px; + margin-top: 10px; + margin-bottom: 10px; +} + +table.docutils td, table.docutils th { + border: 1px solid #ddd !important; + border-radius: 3px; +} + +table p, table li { + text-align: left !important; +} + +table.docutils th { + background-color: #eee; + padding: 0.3em 0.5em; +} + +table.docutils td { + background-color: white; + padding: 0.3em 0.5em; +} + +table.footnote, table.footnote td { + border: 0 !important; +} + +div.footer { + line-height: 150%; + margin-top: -2em; + text-align: right; + width: auto; + margin-right: 10px; +} + +div.footer a:hover { + color: #0095C4; +} + +.refcount { + color: #060; +} + +.stableabi { + color: #229; +} + +.highlight { + background: none !important; +} + +dl > dt span ~ em { + font-family: monospace, sans-serif; +} diff --git a/DOCS/_static/pygments.css b/DOCS/_static/pygments.css new file mode 100644 index 00000000..d14395ef --- /dev/null +++ b/DOCS/_static/pygments.css @@ -0,0 +1,74 @@ +pre { line-height: 125%; margin: 0; } +td.linenos pre { color: #000000; background-color: #f0f0f0; padding: 0 5px 0 5px; } +span.linenos { color: #000000; background-color: #f0f0f0; padding: 0 5px 0 5px; } +td.linenos pre.special { color: #000000; background-color: #ffffc0; padding: 0 5px 0 5px; } +span.linenos.special { color: #000000; background-color: #ffffc0; padding: 0 5px 0 5px; } +.highlight .hll { background-color: #ffffcc } +.highlight { background: #eeffcc; } +.highlight .c { color: #408090; font-style: italic } /* Comment */ +.highlight .err { border: 1px solid #FF0000 } /* Error */ +.highlight .k { color: #007020; font-weight: bold } /* Keyword */ +.highlight .o { color: #666666 } /* Operator */ +.highlight .ch { color: #408090; font-style: italic } /* Comment.Hashbang */ +.highlight .cm { color: #408090; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #007020 } /* Comment.Preproc */ +.highlight .cpf { color: #408090; font-style: italic } /* Comment.PreprocFile */ +.highlight .c1 { color: #408090; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #408090; background-color: #fff0f0 } /* Comment.Special */ +.highlight .gd { color: #A00000 } /* Generic.Deleted */ +.highlight .ge { font-style: italic } /* Generic.Emph */ +.highlight .gr { color: #FF0000 } /* Generic.Error */ +.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ +.highlight .gi { color: #00A000 } /* Generic.Inserted */ +.highlight .go { color: #333333 } /* Generic.Output */ +.highlight .gp { color: #c65d09; font-weight: bold } /* Generic.Prompt */ +.highlight .gs { font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ +.highlight .gt { color: #0044DD } /* Generic.Traceback */ +.highlight .kc { color: #007020; font-weight: bold } /* Keyword.Constant */ +.highlight .kd { color: #007020; font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { color: #007020; font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { color: #007020 } /* Keyword.Pseudo */ +.highlight .kr { color: #007020; font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #902000 } /* Keyword.Type */ +.highlight .m { color: #208050 } /* Literal.Number */ +.highlight .s { color: #4070a0 } /* Literal.String */ +.highlight .na { color: #4070a0 } /* Name.Attribute */ +.highlight .nb { color: #007020 } /* Name.Builtin */ +.highlight .nc { color: #0e84b5; font-weight: bold } /* Name.Class */ +.highlight .no { color: #60add5 } /* Name.Constant */ +.highlight .nd { color: #555555; font-weight: bold } /* Name.Decorator */ +.highlight .ni { color: #d55537; font-weight: bold } /* Name.Entity */ +.highlight .ne { color: #007020 } /* Name.Exception */ +.highlight .nf { color: #06287e } /* Name.Function */ +.highlight .nl { color: #002070; font-weight: bold } /* Name.Label */ +.highlight .nn { color: #0e84b5; font-weight: bold } /* Name.Namespace */ +.highlight .nt { color: #062873; font-weight: bold } /* Name.Tag */ +.highlight .nv { color: #bb60d5 } /* Name.Variable */ +.highlight .ow { color: #007020; font-weight: bold } /* Operator.Word */ +.highlight .w { color: #bbbbbb } /* Text.Whitespace */ +.highlight .mb { color: #208050 } /* Literal.Number.Bin */ +.highlight .mf { color: #208050 } /* Literal.Number.Float */ +.highlight .mh { color: #208050 } /* Literal.Number.Hex */ +.highlight .mi { color: #208050 } /* Literal.Number.Integer */ +.highlight .mo { color: #208050 } /* Literal.Number.Oct */ +.highlight .sa { color: #4070a0 } /* Literal.String.Affix */ +.highlight .sb { color: #4070a0 } /* Literal.String.Backtick */ +.highlight .sc { color: #4070a0 } /* Literal.String.Char */ +.highlight .dl { color: #4070a0 } /* Literal.String.Delimiter */ +.highlight .sd { color: #4070a0; font-style: italic } /* Literal.String.Doc */ +.highlight .s2 { color: #4070a0 } /* Literal.String.Double */ +.highlight .se { color: #4070a0; font-weight: bold } /* Literal.String.Escape */ +.highlight .sh { color: #4070a0 } /* Literal.String.Heredoc */ +.highlight .si { color: #70a0d0; font-style: italic } /* Literal.String.Interpol */ +.highlight .sx { color: #c65d09 } /* Literal.String.Other */ +.highlight .sr { color: #235388 } /* Literal.String.Regex */ +.highlight .s1 { color: #4070a0 } /* Literal.String.Single */ +.highlight .ss { color: #517918 } /* Literal.String.Symbol */ +.highlight .bp { color: #007020 } /* Name.Builtin.Pseudo */ +.highlight .fm { color: #06287e } /* Name.Function.Magic */ +.highlight .vc { color: #bb60d5 } /* Name.Variable.Class */ +.highlight .vg { color: #bb60d5 } /* Name.Variable.Global */ +.highlight .vi { color: #bb60d5 } /* Name.Variable.Instance */ +.highlight .vm { color: #bb60d5 } /* Name.Variable.Magic */ +.highlight .il { color: #208050 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/DOCS/_static/right.html b/DOCS/_static/right.html new file mode 100644 index 00000000..28f9ab15 --- /dev/null +++ b/DOCS/_static/right.html @@ -0,0 +1,32 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/DOCS/_static + + + + + + + + +
Folders
<Go Back>
+
+ + + + + + + +
FileFileFileFile
basic.css pygments.css jquery.js underscore.js 
classic.css copybutton.js language_data.js file.png 
default.css doctools.js sidebar.js py.png 
pydoctheme.css documenta...ons.js switchers.js 
+ +

+Folders: 1
+Files: 15
+Size of all files: 162002 KB

+ + + \ No newline at end of file diff --git a/DOCS/_static/sidebar.js b/DOCS/_static/sidebar.js new file mode 100644 index 00000000..0680c6c8 --- /dev/null +++ b/DOCS/_static/sidebar.js @@ -0,0 +1,194 @@ +/* + * sidebar.js + * ~~~~~~~~~~ + * + * This script makes the Sphinx sidebar collapsible and implements intelligent + * scrolling. This is a slightly modified version of Sphinx's own sidebar.js. + * + * .sphinxsidebar contains .sphinxsidebarwrapper. This script adds in + * .sphixsidebar, after .sphinxsidebarwrapper, the #sidebarbutton used to + * collapse and expand the sidebar. + * + * When the sidebar is collapsed the .sphinxsidebarwrapper is hidden and the + * width of the sidebar and the margin-left of the document are decreased. + * When the sidebar is expanded the opposite happens. This script saves a + * per-browser/per-session cookie used to remember the position of the sidebar + * among the pages. Once the browser is closed the cookie is deleted and the + * position reset to the default (expanded). + * + * :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +$(function() { + // global elements used by the functions. + // the 'sidebarbutton' element is defined as global after its + // creation, in the add_sidebar_button function + var jwindow = $(window); + var jdocument = $(document); + var bodywrapper = $('.bodywrapper'); + var documentwrapper = $('.documentwrapper'); + var sidebar = $('.sphinxsidebar'); + var sidebarwrapper = $('.sphinxsidebarwrapper'); + + // original margin-left of the bodywrapper and width of the sidebar + // with the sidebar expanded + var bw_margin_expanded = bodywrapper.css('margin-left'); + var ssb_width_expanded = sidebar.width(); + + // margin-left of the bodywrapper and width of the sidebar + // with the sidebar collapsed + var bw_margin_collapsed = '.8em'; + var ssb_width_collapsed = '.8em'; + + // colors used by the current theme + var dark_color = '#AAAAAA'; + var light_color = '#CCCCCC'; + + function get_viewport_height() { + if (window.innerHeight) + return window.innerHeight; + else + return jwindow.height(); + } + + function sidebar_is_collapsed() { + return sidebarwrapper.is(':not(:visible)'); + } + + function toggle_sidebar() { + if (sidebar_is_collapsed()) + expand_sidebar(); + else + collapse_sidebar(); + // adjust the scrolling of the sidebar + scroll_sidebar(); + } + + function collapse_sidebar() { + sidebarwrapper.hide(); + sidebar.css('width', ssb_width_collapsed); + bodywrapper.css('margin-left', bw_margin_collapsed); + sidebarbutton.css({ + 'margin-left': '0', + 'height': documentwrapper.height(), + 'border-radius': '5px' + }); + sidebarbutton.find('span').text('»'); + sidebarbutton.attr('title', _('Expand sidebar')); + document.cookie = 'sidebar=collapsed'; + } + + function expand_sidebar() { + bodywrapper.css('margin-left', bw_margin_expanded); + sidebar.css('width', ssb_width_expanded); + sidebarwrapper.show(); + sidebarbutton.css({ + 'margin-left': ssb_width_expanded-12, + 'height': Math.max(sidebarwrapper.height(), documentwrapper.height()), + 'border-radius': '0 5px 5px 0' + }); + sidebarbutton.find('span').text('«'); + sidebarbutton.attr('title', _('Collapse sidebar')); + //sidebarwrapper.css({'padding-top': + // Math.max(window.pageYOffset - sidebarwrapper.offset().top, 10)}); + document.cookie = 'sidebar=expanded'; + } + + function add_sidebar_button() { + sidebarwrapper.css({ + 'float': 'left', + 'margin-right': '0', + 'width': ssb_width_expanded - 28 + }); + // create the button + sidebar.append( + '
«
' + ); + var sidebarbutton = $('#sidebarbutton'); + // find the height of the viewport to center the '<<' in the page + var viewport_height = get_viewport_height(); + var sidebar_offset = sidebar.offset().top; + var sidebar_height = Math.max(documentwrapper.height(), sidebar.height()); + sidebarbutton.find('span').css({ + 'display': 'block', + 'position': 'fixed', + 'top': Math.min(viewport_height/2, sidebar_height/2 + sidebar_offset) - 10 + }); + + sidebarbutton.click(toggle_sidebar); + sidebarbutton.attr('title', _('Collapse sidebar')); + sidebarbutton.css({ + 'border-radius': '0 5px 5px 0', + 'color': '#444444', + 'background-color': '#CCCCCC', + 'font-size': '1.2em', + 'cursor': 'pointer', + 'height': sidebar_height, + 'padding-top': '1px', + 'padding-left': '1px', + 'margin-left': ssb_width_expanded - 12 + }); + + sidebarbutton.hover( + function () { + $(this).css('background-color', dark_color); + }, + function () { + $(this).css('background-color', light_color); + } + ); + } + + function set_position_from_cookie() { + if (!document.cookie) + return; + var items = document.cookie.split(';'); + for(var k=0; k wintop && curbot > winbot) { + sidebarwrapper.css('top', $u.max([wintop - offset - 10, 0])); + } + else if (curtop < wintop && curbot < winbot) { + sidebarwrapper.css('top', $u.min([winbot - sidebar_height - offset - 20, + jdocument.height() - sidebar_height - 200])); + } + } + } + jwindow.scroll(scroll_sidebar); +}); diff --git a/DOCS/_static/switchers.js b/DOCS/_static/switchers.js new file mode 100644 index 00000000..ec386004 --- /dev/null +++ b/DOCS/_static/switchers.js @@ -0,0 +1,182 @@ +(function() { + 'use strict'; + + if (!String.prototype.startsWith) { + Object.defineProperty(String.prototype, 'startsWith', { + value: function(search, rawPos) { + var pos = rawPos > 0 ? rawPos|0 : 0; + return this.substring(pos, pos + search.length) === search; + } + }); + } + + // Parses versions in URL segments like: + // "3", "dev", "release/2.7" or "3.6rc2" + var version_regexs = [ + '(?:\\d)', + '(?:\\d\\.\\d[\\w\\d\\.]*)', + '(?:dev)', + '(?:release/\\d.\\d[\\x\\d\\.]*)']; + + var all_versions = {"3.11": "dev (3.11)", "3.10": "pre (3.10)", "3.9": "3.9", "3.8": "3.8", "3.7": "3.7", "3.6": "3.6", "3.5": "3.5", "2.7": "2.7"}; + var all_languages = {"en": "English", "es": "Spanish", "fr": "French", "ja": "Japanese", "ko": "Korean", "pt-br": "Brazilian Portuguese", "zh-cn": "Simplified Chinese", "zh-tw": "Traditional Chinese"}; + + function quote_attr(str) { + return '"' + str.replace('"', '\\"') + '"'; + } + + function build_version_select(release) { + var buf = [''); + return buf.join(''); + } + + function build_language_select(current_language) { + var buf = [''); + return buf.join(''); + } + + function navigate_to_first_existing(urls) { + // Navigate to the first existing URL in urls. + var url = urls.shift(); + if (urls.length == 0 || url.startsWith("file:///")) { + window.location.href = url; + return; + } + $.ajax({ + url: url, + success: function() { + window.location.href = url; + }, + error: function() { + navigate_to_first_existing(urls); + } + }); + } + + function on_version_switch() { + var selected_version = $(this).children('option:selected').attr('value') + '/'; + var url = window.location.href; + var current_language = language_segment_from_url(); + var current_version = version_segment_from_url(); + var new_url = url.replace('/' + current_language + current_version, + '/' + current_language + selected_version); + if (new_url != url) { + navigate_to_first_existing([ + new_url, + url.replace('/' + current_language + current_version, + '/' + selected_version), + '/' + current_language + selected_version, + '/' + selected_version, + '/' + ]); + } + } + + function on_language_switch() { + var selected_language = $(this).children('option:selected').attr('value') + '/'; + var url = window.location.href; + var current_language = language_segment_from_url(); + var current_version = version_segment_from_url(); + if (selected_language == 'en/') // Special 'default' case for english. + selected_language = ''; + var new_url = url.replace('/' + current_language + current_version, + '/' + selected_language + current_version); + if (new_url != url) { + navigate_to_first_existing([ + new_url, + '/' + ]); + } + } + + // Returns the path segment of the language as a string, like 'fr/' + // or '' if not found. + function language_segment_from_url() { + var path = window.location.pathname; + var language_regexp = '/((?:' + Object.keys(all_languages).join("|") + ')/)' + var match = path.match(language_regexp); + if (match !== null) + return match[1]; + return ''; + } + + // Returns the path segment of the version as a string, like '3.6/' + // or '' if not found. + function version_segment_from_url() { + var path = window.location.pathname; + var language_segment = language_segment_from_url(); + var version_segment = '(?:(?:' + version_regexs.join('|') + ')/)'; + var version_regexp = language_segment + '(' + version_segment + ')'; + var match = path.match(version_regexp); + if (match !== null) + return match[1]; + return '' + } + + function create_placeholders_if_missing() { + var version_segment = version_segment_from_url(); + var language_segment = language_segment_from_url(); + var index = "/" + language_segment + version_segment; + + if ($('.version_switcher_placeholder').length) + return; + + var html = ' \ + \ +Documentation »'; + + var probable_places = [ + "body>div.related>ul>li:not(.right):contains('Documentation'):first", + "body>div.related>ul>li:not(.right):contains('documentation'):first", + ]; + + for (var i = 0; i < probable_places.length; i++) { + var probable_place = $(probable_places[i]); + if (probable_place.length == 1) { + probable_place.html(html); + document.getElementById('indexlink').href = index; + return; + } + } + } + + $(document).ready(function() { + var language_segment = language_segment_from_url(); + var current_language = language_segment.replace(/\/+$/g, '') || 'en'; + var version_select = build_version_select(DOCUMENTATION_OPTIONS.VERSION); + + create_placeholders_if_missing(); + $('.version_switcher_placeholder').html(version_select); + $('.version_switcher_placeholder select').bind('change', on_version_switch); + + var language_select = build_language_select(current_language); + + $('.language_switcher_placeholder').html(language_select); + $('.language_switcher_placeholder select').bind('change', on_language_switch); + }); +})(); diff --git a/DOCS/_static/underscore.js b/DOCS/_static/underscore.js new file mode 100644 index 00000000..5b55f32b --- /dev/null +++ b/DOCS/_static/underscore.js @@ -0,0 +1,31 @@ +// Underscore.js 1.3.1 +// (c) 2009-2012 Jeremy Ashkenas, DocumentCloud Inc. +// Underscore is freely distributable under the MIT license. +// Portions of Underscore are inspired or borrowed from Prototype, +// Oliver Steele's Functional, and John Resig's Micro-Templating. +// For all details and documentation: +// http://documentcloud.github.com/underscore +(function(){function q(a,c,d){if(a===c)return a!==0||1/a==1/c;if(a==null||c==null)return a===c;if(a._chain)a=a._wrapped;if(c._chain)c=c._wrapped;if(a.isEqual&&b.isFunction(a.isEqual))return a.isEqual(c);if(c.isEqual&&b.isFunction(c.isEqual))return c.isEqual(a);var e=l.call(a);if(e!=l.call(c))return false;switch(e){case "[object String]":return a==String(c);case "[object Number]":return a!=+a?c!=+c:a==0?1/a==1/c:a==+c;case "[object Date]":case "[object Boolean]":return+a==+c;case "[object RegExp]":return a.source== +c.source&&a.global==c.global&&a.multiline==c.multiline&&a.ignoreCase==c.ignoreCase}if(typeof a!="object"||typeof c!="object")return false;for(var f=d.length;f--;)if(d[f]==a)return true;d.push(a);var f=0,g=true;if(e=="[object Array]"){if(f=a.length,g=f==c.length)for(;f--;)if(!(g=f in a==f in c&&q(a[f],c[f],d)))break}else{if("constructor"in a!="constructor"in c||a.constructor!=c.constructor)return false;for(var h in a)if(b.has(a,h)&&(f++,!(g=b.has(c,h)&&q(a[h],c[h],d))))break;if(g){for(h in c)if(b.has(c, +h)&&!f--)break;g=!f}}d.pop();return g}var r=this,G=r._,n={},k=Array.prototype,o=Object.prototype,i=k.slice,H=k.unshift,l=o.toString,I=o.hasOwnProperty,w=k.forEach,x=k.map,y=k.reduce,z=k.reduceRight,A=k.filter,B=k.every,C=k.some,p=k.indexOf,D=k.lastIndexOf,o=Array.isArray,J=Object.keys,s=Function.prototype.bind,b=function(a){return new m(a)};if(typeof exports!=="undefined"){if(typeof module!=="undefined"&&module.exports)exports=module.exports=b;exports._=b}else r._=b;b.VERSION="1.3.1";var j=b.each= +b.forEach=function(a,c,d){if(a!=null)if(w&&a.forEach===w)a.forEach(c,d);else if(a.length===+a.length)for(var e=0,f=a.length;e2;a== +null&&(a=[]);if(y&&a.reduce===y)return e&&(c=b.bind(c,e)),f?a.reduce(c,d):a.reduce(c);j(a,function(a,b,i){f?d=c.call(e,d,a,b,i):(d=a,f=true)});if(!f)throw new TypeError("Reduce of empty array with no initial value");return d};b.reduceRight=b.foldr=function(a,c,d,e){var f=arguments.length>2;a==null&&(a=[]);if(z&&a.reduceRight===z)return e&&(c=b.bind(c,e)),f?a.reduceRight(c,d):a.reduceRight(c);var g=b.toArray(a).reverse();e&&!f&&(c=b.bind(c,e));return f?b.reduce(g,c,d,e):b.reduce(g,c)};b.find=b.detect= +function(a,c,b){var e;E(a,function(a,g,h){if(c.call(b,a,g,h))return e=a,true});return e};b.filter=b.select=function(a,c,b){var e=[];if(a==null)return e;if(A&&a.filter===A)return a.filter(c,b);j(a,function(a,g,h){c.call(b,a,g,h)&&(e[e.length]=a)});return e};b.reject=function(a,c,b){var e=[];if(a==null)return e;j(a,function(a,g,h){c.call(b,a,g,h)||(e[e.length]=a)});return e};b.every=b.all=function(a,c,b){var e=true;if(a==null)return e;if(B&&a.every===B)return a.every(c,b);j(a,function(a,g,h){if(!(e= +e&&c.call(b,a,g,h)))return n});return e};var E=b.some=b.any=function(a,c,d){c||(c=b.identity);var e=false;if(a==null)return e;if(C&&a.some===C)return a.some(c,d);j(a,function(a,b,h){if(e||(e=c.call(d,a,b,h)))return n});return!!e};b.include=b.contains=function(a,c){var b=false;if(a==null)return b;return p&&a.indexOf===p?a.indexOf(c)!=-1:b=E(a,function(a){return a===c})};b.invoke=function(a,c){var d=i.call(arguments,2);return b.map(a,function(a){return(b.isFunction(c)?c||a:a[c]).apply(a,d)})};b.pluck= +function(a,c){return b.map(a,function(a){return a[c]})};b.max=function(a,c,d){if(!c&&b.isArray(a))return Math.max.apply(Math,a);if(!c&&b.isEmpty(a))return-Infinity;var e={computed:-Infinity};j(a,function(a,b,h){b=c?c.call(d,a,b,h):a;b>=e.computed&&(e={value:a,computed:b})});return e.value};b.min=function(a,c,d){if(!c&&b.isArray(a))return Math.min.apply(Math,a);if(!c&&b.isEmpty(a))return Infinity;var e={computed:Infinity};j(a,function(a,b,h){b=c?c.call(d,a,b,h):a;bd?1:0}),"value")};b.groupBy=function(a,c){var d={},e=b.isFunction(c)?c:function(a){return a[c]};j(a,function(a,b){var c=e(a,b);(d[c]||(d[c]=[])).push(a)});return d};b.sortedIndex=function(a, +c,d){d||(d=b.identity);for(var e=0,f=a.length;e>1;d(a[g])=0})})};b.difference=function(a){var c=b.flatten(i.call(arguments,1));return b.filter(a,function(a){return!b.include(c,a)})};b.zip=function(){for(var a=i.call(arguments),c=b.max(b.pluck(a,"length")),d=Array(c),e=0;e=0;d--)b=[a[d].apply(this,b)];return b[0]}}; +b.after=function(a,b){return a<=0?b():function(){if(--a<1)return b.apply(this,arguments)}};b.keys=J||function(a){if(a!==Object(a))throw new TypeError("Invalid object");var c=[],d;for(d in a)b.has(a,d)&&(c[c.length]=d);return c};b.values=function(a){return b.map(a,b.identity)};b.functions=b.methods=function(a){var c=[],d;for(d in a)b.isFunction(a[d])&&c.push(d);return c.sort()};b.extend=function(a){j(i.call(arguments,1),function(b){for(var d in b)a[d]=b[d]});return a};b.defaults=function(a){j(i.call(arguments, +1),function(b){for(var d in b)a[d]==null&&(a[d]=b[d])});return a};b.clone=function(a){return!b.isObject(a)?a:b.isArray(a)?a.slice():b.extend({},a)};b.tap=function(a,b){b(a);return a};b.isEqual=function(a,b){return q(a,b,[])};b.isEmpty=function(a){if(b.isArray(a)||b.isString(a))return a.length===0;for(var c in a)if(b.has(a,c))return false;return true};b.isElement=function(a){return!!(a&&a.nodeType==1)};b.isArray=o||function(a){return l.call(a)=="[object Array]"};b.isObject=function(a){return a===Object(a)}; +b.isArguments=function(a){return l.call(a)=="[object Arguments]"};if(!b.isArguments(arguments))b.isArguments=function(a){return!(!a||!b.has(a,"callee"))};b.isFunction=function(a){return l.call(a)=="[object Function]"};b.isString=function(a){return l.call(a)=="[object String]"};b.isNumber=function(a){return l.call(a)=="[object Number]"};b.isNaN=function(a){return a!==a};b.isBoolean=function(a){return a===true||a===false||l.call(a)=="[object Boolean]"};b.isDate=function(a){return l.call(a)=="[object Date]"}; +b.isRegExp=function(a){return l.call(a)=="[object RegExp]"};b.isNull=function(a){return a===null};b.isUndefined=function(a){return a===void 0};b.has=function(a,b){return I.call(a,b)};b.noConflict=function(){r._=G;return this};b.identity=function(a){return a};b.times=function(a,b,d){for(var e=0;e/g,">").replace(/"/g,""").replace(/'/g,"'").replace(/\//g,"/")};b.mixin=function(a){j(b.functions(a), +function(c){K(c,b[c]=a[c])})};var L=0;b.uniqueId=function(a){var b=L++;return a?a+b:b};b.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var t=/.^/,u=function(a){return a.replace(/\\\\/g,"\\").replace(/\\'/g,"'")};b.template=function(a,c){var d=b.templateSettings,d="var __p=[],print=function(){__p.push.apply(__p,arguments);};with(obj||{}){__p.push('"+a.replace(/\\/g,"\\\\").replace(/'/g,"\\'").replace(d.escape||t,function(a,b){return"',_.escape("+ +u(b)+"),'"}).replace(d.interpolate||t,function(a,b){return"',"+u(b)+",'"}).replace(d.evaluate||t,function(a,b){return"');"+u(b).replace(/[\r\n\t]/g," ")+";__p.push('"}).replace(/\r/g,"\\r").replace(/\n/g,"\\n").replace(/\t/g,"\\t")+"');}return __p.join('');",e=new Function("obj","_",d);return c?e(c,b):function(a){return e.call(this,a,b)}};b.chain=function(a){return b(a).chain()};var m=function(a){this._wrapped=a};b.prototype=m.prototype;var v=function(a,c){return c?b(a).chain():a},K=function(a,c){m.prototype[a]= +function(){var a=i.call(arguments);H.call(a,this._wrapped);return v(c.apply(b,a),this._chain)}};b.mixin(b);j("pop,push,reverse,shift,sort,splice,unshift".split(","),function(a){var b=k[a];m.prototype[a]=function(){var d=this._wrapped;b.apply(d,arguments);var e=d.length;(a=="shift"||a=="splice")&&e===0&&delete d[0];return v(d,this._chain)}});j(["concat","join","slice"],function(a){var b=k[a];m.prototype[a]=function(){return v(b.apply(this._wrapped,arguments),this._chain)}});m.prototype.chain=function(){this._chain= +true;return this};m.prototype.value=function(){return this._wrapped}}).call(this); diff --git a/DOCS/right.html b/DOCS/right.html new file mode 100644 index 00000000..c38c57cc --- /dev/null +++ b/DOCS/right.html @@ -0,0 +1,23 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/DOCS + + + + + + + + +
Folders
<Go Back> tutorial _static
+
+ +

+Folders: 3
+

+ + + \ No newline at end of file diff --git a/DOCS/tutorial/appendix.html b/DOCS/tutorial/appendix.html new file mode 100644 index 00000000..018d9272 --- /dev/null +++ b/DOCS/tutorial/appendix.html @@ -0,0 +1,307 @@ + + + + + + + + + 16. Appendix — Python 3.9.5 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ +
+

16. Appendix¶

+
+

16.1. Interactive Mode¶

+
+

16.1.1. Error Handling¶

+

When an error occurs, the interpreter prints an error message and a stack trace. +In interactive mode, it then returns to the primary prompt; when input came from +a file, it exits with a nonzero exit status after printing the stack trace. +(Exceptions handled by an except clause in a try statement +are not errors in this context.) Some errors are unconditionally fatal and +cause an exit with a nonzero exit; this applies to internal inconsistencies and +some cases of running out of memory. All error messages are written to the +standard error stream; normal output from executed commands is written to +standard output.

+

Typing the interrupt character (usually Control-C or Delete) to the primary or +secondary prompt cancels the input and returns to the primary prompt. 1 +Typing an interrupt while a command is executing raises the +KeyboardInterrupt exception, which may be handled by a try +statement.

+
+
+

16.1.2. Executable Python Scripts¶

+

On BSD’ish Unix systems, Python scripts can be made directly executable, like +shell scripts, by putting the line

+
#!/usr/bin/env python3.5
+
+
+

(assuming that the interpreter is on the user’s PATH) at the beginning +of the script and giving the file an executable mode. The #! must be the +first two characters of the file. On some platforms, this first line must end +with a Unix-style line ending ('\n'), not a Windows ('\r\n') line +ending. Note that the hash, or pound, character, '#', is used to start a +comment in Python.

+

The script can be given an executable mode, or permission, using the +chmod command.

+
$ chmod +x myscript.py
+
+
+

On Windows systems, there is no notion of an “executable modeâ€. The Python +installer automatically associates .py files with python.exe so that +a double-click on a Python file will run it as a script. The extension can +also be .pyw, in that case, the console window that normally appears is +suppressed.

+
+
+

16.1.3. The Interactive Startup File¶

+

When you use Python interactively, it is frequently handy to have some standard +commands executed every time the interpreter is started. You can do this by +setting an environment variable named PYTHONSTARTUP to the name of a +file containing your start-up commands. This is similar to the .profile +feature of the Unix shells.

+

This file is only read in interactive sessions, not when Python reads commands +from a script, and not when /dev/tty is given as the explicit source of +commands (which otherwise behaves like an interactive session). It is executed +in the same namespace where interactive commands are executed, so that objects +that it defines or imports can be used without qualification in the interactive +session. You can also change the prompts sys.ps1 and sys.ps2 in this +file.

+

If you want to read an additional start-up file from the current directory, you +can program this in the global start-up file using code like if +os.path.isfile('.pythonrc.py'): exec(open('.pythonrc.py').read()). +If you want to use the startup file in a script, you must do this explicitly +in the script:

+
import os
+filename = os.environ.get('PYTHONSTARTUP')
+if filename and os.path.isfile(filename):
+    with open(filename) as fobj:
+        startup_file = fobj.read()
+    exec(startup_file)
+
+
+
+
+

16.1.4. The Customization Modules¶

+

Python provides two hooks to let you customize it: sitecustomize and +usercustomize. To see how it works, you need first to find the location +of your user site-packages directory. Start Python and run this code:

+
>>> import site
+>>> site.getusersitepackages()
+'/home/user/.local/lib/python3.5/site-packages'
+
+
+

Now you can create a file named usercustomize.py in that directory and +put anything you want in it. It will affect every invocation of Python, unless +it is started with the -s option to disable the automatic import.

+

sitecustomize works in the same way, but is typically created by an +administrator of the computer in the global site-packages directory, and is +imported before usercustomize. See the documentation of the site +module for more details.

+

Footnotes

+
+
1
+

A problem with the GNU Readline package may prevent this.

+
+
+
+
+
+ + +
+
+
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/DOCS/tutorial/appetite.html b/DOCS/tutorial/appetite.html new file mode 100644 index 00000000..20a2bc72 --- /dev/null +++ b/DOCS/tutorial/appetite.html @@ -0,0 +1,263 @@ + + + + + + + + + 1. Whetting Your Appetite — Python 3.9.5 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ +
+

1. Whetting Your Appetite¶

+

If you do much work on computers, eventually you find that there’s some task +you’d like to automate. For example, you may wish to perform a +search-and-replace over a large number of text files, or rename and rearrange a +bunch of photo files in a complicated way. Perhaps you’d like to write a small +custom database, or a specialized GUI application, or a simple game.

+

If you’re a professional software developer, you may have to work with several +C/C++/Java libraries but find the usual write/compile/test/re-compile cycle is +too slow. Perhaps you’re writing a test suite for such a library and find +writing the testing code a tedious task. Or maybe you’ve written a program that +could use an extension language, and you don’t want to design and implement a +whole new language for your application.

+

Python is just the language for you.

+

You could write a Unix shell script or Windows batch files for some of these +tasks, but shell scripts are best at moving around files and changing text data, +not well-suited for GUI applications or games. You could write a C/C++/Java +program, but it can take a lot of development time to get even a first-draft +program. Python is simpler to use, available on Windows, Mac OS X, and Unix +operating systems, and will help you get the job done more quickly.

+

Python is simple to use, but it is a real programming language, offering much +more structure and support for large programs than shell scripts or batch files +can offer. On the other hand, Python also offers much more error checking than +C, and, being a very-high-level language, it has high-level data types built +in, such as flexible arrays and dictionaries. Because of its more general data +types Python is applicable to a much larger problem domain than Awk or even +Perl, yet many things are at least as easy in Python as in those languages.

+

Python allows you to split your program into modules that can be reused in other +Python programs. It comes with a large collection of standard modules that you +can use as the basis of your programs — or as examples to start learning to +program in Python. Some of these modules provide things like file I/O, system +calls, sockets, and even interfaces to graphical user interface toolkits like +Tk.

+

Python is an interpreted language, which can save you considerable time during +program development because no compilation and linking is necessary. The +interpreter can be used interactively, which makes it easy to experiment with +features of the language, to write throw-away programs, or to test functions +during bottom-up program development. It is also a handy desk calculator.

+

Python enables programs to be written compactly and readably. Programs written +in Python are typically much shorter than equivalent C, C++, or Java programs, +for several reasons:

+
    +
  • the high-level data types allow you to express complex operations in a single +statement;

  • +
  • statement grouping is done by indentation instead of beginning and ending +brackets;

  • +
  • no variable or argument declarations are necessary.

  • +
+

Python is extensible: if you know how to program in C it is easy to add a new +built-in function or module to the interpreter, either to perform critical +operations at maximum speed, or to link Python programs to libraries that may +only be available in binary form (such as a vendor-specific graphics library). +Once you are really hooked, you can link the Python interpreter into an +application written in C and use it as an extension or command language for that +application.

+

By the way, the language is named after the BBC show “Monty Python’s Flying +Circus†and has nothing to do with reptiles. Making references to Monty +Python skits in documentation is not only allowed, it is encouraged!

+

Now that you are all excited about Python, you’ll want to examine it in some +more detail. Since the best way to learn a language is to use it, the tutorial +invites you to play with the Python interpreter as you read.

+

In the next chapter, the mechanics of using the interpreter are explained. This +is rather mundane information, but essential for trying out the examples shown +later.

+

The rest of the tutorial introduces various features of the Python language and +system through examples, beginning with simple expressions, statements and data +types, through functions and modules, and finally touching upon advanced +concepts like exceptions and user-defined classes.

+
+ + +
+
+
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/DOCS/tutorial/classes.html b/DOCS/tutorial/classes.html new file mode 100644 index 00000000..f92afacb --- /dev/null +++ b/DOCS/tutorial/classes.html @@ -0,0 +1,1021 @@ + + + + + + + + + 9. Classes — Python 3.9.5 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ +
+

9. Classes¶

+

Classes provide a means of bundling data and functionality together. Creating +a new class creates a new type of object, allowing new instances of that +type to be made. Each class instance can have attributes attached to it for +maintaining its state. Class instances can also have methods (defined by its +class) for modifying its state.

+

Compared with other programming languages, Python’s class mechanism adds classes +with a minimum of new syntax and semantics. It is a mixture of the class +mechanisms found in C++ and Modula-3. Python classes provide all the standard +features of Object Oriented Programming: the class inheritance mechanism allows +multiple base classes, a derived class can override any methods of its base +class or classes, and a method can call the method of a base class with the same +name. Objects can contain arbitrary amounts and kinds of data. As is true for +modules, classes partake of the dynamic nature of Python: they are created at +runtime, and can be modified further after creation.

+

In C++ terminology, normally class members (including the data members) are +public (except see below Private Variables), and all member functions are +virtual. As in Modula-3, there are no shorthands for referencing the object’s +members from its methods: the method function is declared with an explicit first +argument representing the object, which is provided implicitly by the call. As +in Smalltalk, classes themselves are objects. This provides semantics for +importing and renaming. Unlike C++ and Modula-3, built-in types can be used as +base classes for extension by the user. Also, like in C++, most built-in +operators with special syntax (arithmetic operators, subscripting etc.) can be +redefined for class instances.

+

(Lacking universally accepted terminology to talk about classes, I will make +occasional use of Smalltalk and C++ terms. I would use Modula-3 terms, since +its object-oriented semantics are closer to those of Python than C++, but I +expect that few readers have heard of it.)

+
+

9.1. A Word About Names and Objects¶

+

Objects have individuality, and multiple names (in multiple scopes) can be bound +to the same object. This is known as aliasing in other languages. This is +usually not appreciated on a first glance at Python, and can be safely ignored +when dealing with immutable basic types (numbers, strings, tuples). However, +aliasing has a possibly surprising effect on the semantics of Python code +involving mutable objects such as lists, dictionaries, and most other types. +This is usually used to the benefit of the program, since aliases behave like +pointers in some respects. For example, passing an object is cheap since only a +pointer is passed by the implementation; and if a function modifies an object +passed as an argument, the caller will see the change — this eliminates the +need for two different argument passing mechanisms as in Pascal.

+
+
+

9.2. Python Scopes and Namespaces¶

+

Before introducing classes, I first have to tell you something about Python’s +scope rules. Class definitions play some neat tricks with namespaces, and you +need to know how scopes and namespaces work to fully understand what’s going on. +Incidentally, knowledge about this subject is useful for any advanced Python +programmer.

+

Let’s begin with some definitions.

+

A namespace is a mapping from names to objects. Most namespaces are currently +implemented as Python dictionaries, but that’s normally not noticeable in any +way (except for performance), and it may change in the future. Examples of +namespaces are: the set of built-in names (containing functions such as abs(), and +built-in exception names); the global names in a module; and the local names in +a function invocation. In a sense the set of attributes of an object also form +a namespace. The important thing to know about namespaces is that there is +absolutely no relation between names in different namespaces; for instance, two +different modules may both define a function maximize without confusion — +users of the modules must prefix it with the module name.

+

By the way, I use the word attribute for any name following a dot — for +example, in the expression z.real, real is an attribute of the object +z. Strictly speaking, references to names in modules are attribute +references: in the expression modname.funcname, modname is a module +object and funcname is an attribute of it. In this case there happens to be +a straightforward mapping between the module’s attributes and the global names +defined in the module: they share the same namespace! 1

+

Attributes may be read-only or writable. In the latter case, assignment to +attributes is possible. Module attributes are writable: you can write +modname.the_answer = 42. Writable attributes may also be deleted with the +del statement. For example, del modname.the_answer will remove +the attribute the_answer from the object named by modname.

+

Namespaces are created at different moments and have different lifetimes. The +namespace containing the built-in names is created when the Python interpreter +starts up, and is never deleted. The global namespace for a module is created +when the module definition is read in; normally, module namespaces also last +until the interpreter quits. The statements executed by the top-level +invocation of the interpreter, either read from a script file or interactively, +are considered part of a module called __main__, so they have their own +global namespace. (The built-in names actually also live in a module; this is +called builtins.)

+

The local namespace for a function is created when the function is called, and +deleted when the function returns or raises an exception that is not handled +within the function. (Actually, forgetting would be a better way to describe +what actually happens.) Of course, recursive invocations each have their own +local namespace.

+

A scope is a textual region of a Python program where a namespace is directly +accessible. “Directly accessible†here means that an unqualified reference to a +name attempts to find the name in the namespace.

+

Although scopes are determined statically, they are used dynamically. At any +time during execution, there are 3 or 4 nested scopes whose namespaces are +directly accessible:

+
    +
  • the innermost scope, which is searched first, contains the local names

  • +
  • the scopes of any enclosing functions, which are searched starting with the +nearest enclosing scope, contains non-local, but also non-global names

  • +
  • the next-to-last scope contains the current module’s global names

  • +
  • the outermost scope (searched last) is the namespace containing built-in names

  • +
+

If a name is declared global, then all references and assignments go directly to +the middle scope containing the module’s global names. To rebind variables +found outside of the innermost scope, the nonlocal statement can be +used; if not declared nonlocal, those variables are read-only (an attempt to +write to such a variable will simply create a new local variable in the +innermost scope, leaving the identically named outer variable unchanged).

+

Usually, the local scope references the local names of the (textually) current +function. Outside functions, the local scope references the same namespace as +the global scope: the module’s namespace. Class definitions place yet another +namespace in the local scope.

+

It is important to realize that scopes are determined textually: the global +scope of a function defined in a module is that module’s namespace, no matter +from where or by what alias the function is called. On the other hand, the +actual search for names is done dynamically, at run time — however, the +language definition is evolving towards static name resolution, at “compile†+time, so don’t rely on dynamic name resolution! (In fact, local variables are +already determined statically.)

+

A special quirk of Python is that – if no global or nonlocal +statement is in effect – assignments to names always go into the innermost scope. +Assignments do not copy data — they just bind names to objects. The same is true +for deletions: the statement del x removes the binding of x from the +namespace referenced by the local scope. In fact, all operations that introduce +new names use the local scope: in particular, import statements and +function definitions bind the module or function name in the local scope.

+

The global statement can be used to indicate that particular +variables live in the global scope and should be rebound there; the +nonlocal statement indicates that particular variables live in +an enclosing scope and should be rebound there.

+
+

9.2.1. Scopes and Namespaces Example¶

+

This is an example demonstrating how to reference the different scopes and +namespaces, and how global and nonlocal affect variable +binding:

+
def scope_test():
+    def do_local():
+        spam = "local spam"
+
+    def do_nonlocal():
+        nonlocal spam
+        spam = "nonlocal spam"
+
+    def do_global():
+        global spam
+        spam = "global spam"
+
+    spam = "test spam"
+    do_local()
+    print("After local assignment:", spam)
+    do_nonlocal()
+    print("After nonlocal assignment:", spam)
+    do_global()
+    print("After global assignment:", spam)
+
+scope_test()
+print("In global scope:", spam)
+
+
+

The output of the example code is:

+
After local assignment: test spam
+After nonlocal assignment: nonlocal spam
+After global assignment: nonlocal spam
+In global scope: global spam
+
+
+

Note how the local assignment (which is default) didn’t change scope_test’s +binding of spam. The nonlocal assignment changed scope_test’s +binding of spam, and the global assignment changed the module-level +binding.

+

You can also see that there was no previous binding for spam before the +global assignment.

+
+
+
+

9.3. A First Look at Classes¶

+

Classes introduce a little bit of new syntax, three new object types, and some +new semantics.

+
+

9.3.1. Class Definition Syntax¶

+

The simplest form of class definition looks like this:

+
class ClassName:
+    <statement-1>
+    .
+    .
+    .
+    <statement-N>
+
+
+

Class definitions, like function definitions (def statements) must be +executed before they have any effect. (You could conceivably place a class +definition in a branch of an if statement, or inside a function.)

+

In practice, the statements inside a class definition will usually be function +definitions, but other statements are allowed, and sometimes useful — we’ll +come back to this later. The function definitions inside a class normally have +a peculiar form of argument list, dictated by the calling conventions for +methods — again, this is explained later.

+

When a class definition is entered, a new namespace is created, and used as the +local scope — thus, all assignments to local variables go into this new +namespace. In particular, function definitions bind the name of the new +function here.

+

When a class definition is left normally (via the end), a class object is +created. This is basically a wrapper around the contents of the namespace +created by the class definition; we’ll learn more about class objects in the +next section. The original local scope (the one in effect just before the class +definition was entered) is reinstated, and the class object is bound here to the +class name given in the class definition header (ClassName in the +example).

+
+
+

9.3.2. Class Objects¶

+

Class objects support two kinds of operations: attribute references and +instantiation.

+

Attribute references use the standard syntax used for all attribute references +in Python: obj.name. Valid attribute names are all the names that were in +the class’s namespace when the class object was created. So, if the class +definition looked like this:

+
class MyClass:
+    """A simple example class"""
+    i = 12345
+
+    def f(self):
+        return 'hello world'
+
+
+

then MyClass.i and MyClass.f are valid attribute references, returning +an integer and a function object, respectively. Class attributes can also be +assigned to, so you can change the value of MyClass.i by assignment. +__doc__ is also a valid attribute, returning the docstring belonging to +the class: "A simple example class".

+

Class instantiation uses function notation. Just pretend that the class +object is a parameterless function that returns a new instance of the class. +For example (assuming the above class):

+
x = MyClass()
+
+
+

creates a new instance of the class and assigns this object to the local +variable x.

+

The instantiation operation (“calling†a class object) creates an empty object. +Many classes like to create objects with instances customized to a specific +initial state. Therefore a class may define a special method named +__init__(), like this:

+
def __init__(self):
+    self.data = []
+
+
+

When a class defines an __init__() method, class instantiation +automatically invokes __init__() for the newly-created class instance. So +in this example, a new, initialized instance can be obtained by:

+
x = MyClass()
+
+
+

Of course, the __init__() method may have arguments for greater +flexibility. In that case, arguments given to the class instantiation operator +are passed on to __init__(). For example,

+
>>> class Complex:
+...     def __init__(self, realpart, imagpart):
+...         self.r = realpart
+...         self.i = imagpart
+...
+>>> x = Complex(3.0, -4.5)
+>>> x.r, x.i
+(3.0, -4.5)
+
+
+
+
+

9.3.3. Instance Objects¶

+

Now what can we do with instance objects? The only operations understood by +instance objects are attribute references. There are two kinds of valid +attribute names: data attributes and methods.

+

data attributes correspond to “instance variables†in Smalltalk, and to “data +members†in C++. Data attributes need not be declared; like local variables, +they spring into existence when they are first assigned to. For example, if +x is the instance of MyClass created above, the following piece of +code will print the value 16, without leaving a trace:

+
x.counter = 1
+while x.counter < 10:
+    x.counter = x.counter * 2
+print(x.counter)
+del x.counter
+
+
+

The other kind of instance attribute reference is a method. A method is a +function that “belongs to†an object. (In Python, the term method is not unique +to class instances: other object types can have methods as well. For example, +list objects have methods called append, insert, remove, sort, and so on. +However, in the following discussion, we’ll use the term method exclusively to +mean methods of class instance objects, unless explicitly stated otherwise.)

+

Valid method names of an instance object depend on its class. By definition, +all attributes of a class that are function objects define corresponding +methods of its instances. So in our example, x.f is a valid method +reference, since MyClass.f is a function, but x.i is not, since +MyClass.i is not. But x.f is not the same thing as MyClass.f — it +is a method object, not a function object.

+
+
+

9.3.4. Method Objects¶

+

Usually, a method is called right after it is bound:

+
x.f()
+
+
+

In the MyClass example, this will return the string 'hello world'. +However, it is not necessary to call a method right away: x.f is a method +object, and can be stored away and called at a later time. For example:

+
xf = x.f
+while True:
+    print(xf())
+
+
+

will continue to print hello world until the end of time.

+

What exactly happens when a method is called? You may have noticed that +x.f() was called without an argument above, even though the function +definition for f() specified an argument. What happened to the argument? +Surely Python raises an exception when a function that requires an argument is +called without any — even if the argument isn’t actually used…

+

Actually, you may have guessed the answer: the special thing about methods is +that the instance object is passed as the first argument of the function. In our +example, the call x.f() is exactly equivalent to MyClass.f(x). In +general, calling a method with a list of n arguments is equivalent to calling +the corresponding function with an argument list that is created by inserting +the method’s instance object before the first argument.

+

If you still don’t understand how methods work, a look at the implementation can +perhaps clarify matters. When a non-data attribute of an instance is +referenced, the instance’s class is searched. If the name denotes a valid class +attribute that is a function object, a method object is created by packing +(pointers to) the instance object and the function object just found together in +an abstract object: this is the method object. When the method object is called +with an argument list, a new argument list is constructed from the instance +object and the argument list, and the function object is called with this new +argument list.

+
+
+

9.3.5. Class and Instance Variables¶

+

Generally speaking, instance variables are for data unique to each instance +and class variables are for attributes and methods shared by all instances +of the class:

+
class Dog:
+
+    kind = 'canine'         # class variable shared by all instances
+
+    def __init__(self, name):
+        self.name = name    # instance variable unique to each instance
+
+>>> d = Dog('Fido')
+>>> e = Dog('Buddy')
+>>> d.kind                  # shared by all dogs
+'canine'
+>>> e.kind                  # shared by all dogs
+'canine'
+>>> d.name                  # unique to d
+'Fido'
+>>> e.name                  # unique to e
+'Buddy'
+
+
+

As discussed in A Word About Names and Objects, shared data can have possibly surprising +effects with involving mutable objects such as lists and dictionaries. +For example, the tricks list in the following code should not be used as a +class variable because just a single list would be shared by all Dog +instances:

+
class Dog:
+
+    tricks = []             # mistaken use of a class variable
+
+    def __init__(self, name):
+        self.name = name
+
+    def add_trick(self, trick):
+        self.tricks.append(trick)
+
+>>> d = Dog('Fido')
+>>> e = Dog('Buddy')
+>>> d.add_trick('roll over')
+>>> e.add_trick('play dead')
+>>> d.tricks                # unexpectedly shared by all dogs
+['roll over', 'play dead']
+
+
+

Correct design of the class should use an instance variable instead:

+
class Dog:
+
+    def __init__(self, name):
+        self.name = name
+        self.tricks = []    # creates a new empty list for each dog
+
+    def add_trick(self, trick):
+        self.tricks.append(trick)
+
+>>> d = Dog('Fido')
+>>> e = Dog('Buddy')
+>>> d.add_trick('roll over')
+>>> e.add_trick('play dead')
+>>> d.tricks
+['roll over']
+>>> e.tricks
+['play dead']
+
+
+
+
+
+

9.4. Random Remarks¶

+

If the same attribute name occurs in both an instance and in a class, +then attribute lookup prioritizes the instance:

+
>>> class Warehouse:
+        purpose = 'storage'
+        region = 'west'
+
+>>> w1 = Warehouse()
+>>> print(w1.purpose, w1.region)
+storage west
+>>> w2 = Warehouse()
+>>> w2.region = 'east'
+>>> print(w2.purpose, w2.region)
+storage east
+
+
+

Data attributes may be referenced by methods as well as by ordinary users +(“clientsâ€) of an object. In other words, classes are not usable to implement +pure abstract data types. In fact, nothing in Python makes it possible to +enforce data hiding — it is all based upon convention. (On the other hand, +the Python implementation, written in C, can completely hide implementation +details and control access to an object if necessary; this can be used by +extensions to Python written in C.)

+

Clients should use data attributes with care — clients may mess up invariants +maintained by the methods by stamping on their data attributes. Note that +clients may add data attributes of their own to an instance object without +affecting the validity of the methods, as long as name conflicts are avoided — +again, a naming convention can save a lot of headaches here.

+

There is no shorthand for referencing data attributes (or other methods!) from +within methods. I find that this actually increases the readability of methods: +there is no chance of confusing local variables and instance variables when +glancing through a method.

+

Often, the first argument of a method is called self. This is nothing more +than a convention: the name self has absolutely no special meaning to +Python. Note, however, that by not following the convention your code may be +less readable to other Python programmers, and it is also conceivable that a +class browser program might be written that relies upon such a convention.

+

Any function object that is a class attribute defines a method for instances of +that class. It is not necessary that the function definition is textually +enclosed in the class definition: assigning a function object to a local +variable in the class is also ok. For example:

+
# Function defined outside the class
+def f1(self, x, y):
+    return min(x, x+y)
+
+class C:
+    f = f1
+
+    def g(self):
+        return 'hello world'
+
+    h = g
+
+
+

Now f, g and h are all attributes of class C that refer to +function objects, and consequently they are all methods of instances of +C — h being exactly equivalent to g. Note that this practice +usually only serves to confuse the reader of a program.

+

Methods may call other methods by using method attributes of the self +argument:

+
class Bag:
+    def __init__(self):
+        self.data = []
+
+    def add(self, x):
+        self.data.append(x)
+
+    def addtwice(self, x):
+        self.add(x)
+        self.add(x)
+
+
+

Methods may reference global names in the same way as ordinary functions. The +global scope associated with a method is the module containing its +definition. (A class is never used as a global scope.) While one +rarely encounters a good reason for using global data in a method, there are +many legitimate uses of the global scope: for one thing, functions and modules +imported into the global scope can be used by methods, as well as functions and +classes defined in it. Usually, the class containing the method is itself +defined in this global scope, and in the next section we’ll find some good +reasons why a method would want to reference its own class.

+

Each value is an object, and therefore has a class (also called its type). +It is stored as object.__class__.

+
+
+

9.5. Inheritance¶

+

Of course, a language feature would not be worthy of the name “class†without +supporting inheritance. The syntax for a derived class definition looks like +this:

+
class DerivedClassName(BaseClassName):
+    <statement-1>
+    .
+    .
+    .
+    <statement-N>
+
+
+

The name BaseClassName must be defined in a scope containing the +derived class definition. In place of a base class name, other arbitrary +expressions are also allowed. This can be useful, for example, when the base +class is defined in another module:

+
class DerivedClassName(modname.BaseClassName):
+
+
+

Execution of a derived class definition proceeds the same as for a base class. +When the class object is constructed, the base class is remembered. This is +used for resolving attribute references: if a requested attribute is not found +in the class, the search proceeds to look in the base class. This rule is +applied recursively if the base class itself is derived from some other class.

+

There’s nothing special about instantiation of derived classes: +DerivedClassName() creates a new instance of the class. Method references +are resolved as follows: the corresponding class attribute is searched, +descending down the chain of base classes if necessary, and the method reference +is valid if this yields a function object.

+

Derived classes may override methods of their base classes. Because methods +have no special privileges when calling other methods of the same object, a +method of a base class that calls another method defined in the same base class +may end up calling a method of a derived class that overrides it. (For C++ +programmers: all methods in Python are effectively virtual.)

+

An overriding method in a derived class may in fact want to extend rather than +simply replace the base class method of the same name. There is a simple way to +call the base class method directly: just call BaseClassName.methodname(self, +arguments). This is occasionally useful to clients as well. (Note that this +only works if the base class is accessible as BaseClassName in the global +scope.)

+

Python has two built-in functions that work with inheritance:

+
    +
  • Use isinstance() to check an instance’s type: isinstance(obj, int) +will be True only if obj.__class__ is int or some class +derived from int.

  • +
  • Use issubclass() to check class inheritance: issubclass(bool, int) +is True since bool is a subclass of int. However, +issubclass(float, int) is False since float is not a +subclass of int.

  • +
+
+

9.5.1. Multiple Inheritance¶

+

Python supports a form of multiple inheritance as well. A class definition with +multiple base classes looks like this:

+
class DerivedClassName(Base1, Base2, Base3):
+    <statement-1>
+    .
+    .
+    .
+    <statement-N>
+
+
+

For most purposes, in the simplest cases, you can think of the search for +attributes inherited from a parent class as depth-first, left-to-right, not +searching twice in the same class where there is an overlap in the hierarchy. +Thus, if an attribute is not found in DerivedClassName, it is searched +for in Base1, then (recursively) in the base classes of Base1, +and if it was not found there, it was searched for in Base2, and so on.

+

In fact, it is slightly more complex than that; the method resolution order +changes dynamically to support cooperative calls to super(). This +approach is known in some other multiple-inheritance languages as +call-next-method and is more powerful than the super call found in +single-inheritance languages.

+

Dynamic ordering is necessary because all cases of multiple inheritance exhibit +one or more diamond relationships (where at least one of the parent classes +can be accessed through multiple paths from the bottommost class). For example, +all classes inherit from object, so any case of multiple inheritance +provides more than one path to reach object. To keep the base classes +from being accessed more than once, the dynamic algorithm linearizes the search +order in a way that preserves the left-to-right ordering specified in each +class, that calls each parent only once, and that is monotonic (meaning that a +class can be subclassed without affecting the precedence order of its parents). +Taken together, these properties make it possible to design reliable and +extensible classes with multiple inheritance. For more detail, see +https://www.python.org/download/releases/2.3/mro/.

+
+
+
+

9.6. Private Variables¶

+

“Private†instance variables that cannot be accessed except from inside an +object don’t exist in Python. However, there is a convention that is followed +by most Python code: a name prefixed with an underscore (e.g. _spam) should +be treated as a non-public part of the API (whether it is a function, a method +or a data member). It should be considered an implementation detail and subject +to change without notice.

+

Since there is a valid use-case for class-private members (namely to avoid name +clashes of names with names defined by subclasses), there is limited support for +such a mechanism, called name mangling. Any identifier of the form +__spam (at least two leading underscores, at most one trailing underscore) +is textually replaced with _classname__spam, where classname is the +current class name with leading underscore(s) stripped. This mangling is done +without regard to the syntactic position of the identifier, as long as it +occurs within the definition of a class.

+

Name mangling is helpful for letting subclasses override methods without +breaking intraclass method calls. For example:

+
class Mapping:
+    def __init__(self, iterable):
+        self.items_list = []
+        self.__update(iterable)
+
+    def update(self, iterable):
+        for item in iterable:
+            self.items_list.append(item)
+
+    __update = update   # private copy of original update() method
+
+class MappingSubclass(Mapping):
+
+    def update(self, keys, values):
+        # provides new signature for update()
+        # but does not break __init__()
+        for item in zip(keys, values):
+            self.items_list.append(item)
+
+
+

The above example would work even if MappingSubclass were to introduce a +__update identifier since it is replaced with _Mapping__update in the +Mapping class and _MappingSubclass__update in the MappingSubclass +class respectively.

+

Note that the mangling rules are designed mostly to avoid accidents; it still is +possible to access or modify a variable that is considered private. This can +even be useful in special circumstances, such as in the debugger.

+

Notice that code passed to exec() or eval() does not consider the +classname of the invoking class to be the current class; this is similar to the +effect of the global statement, the effect of which is likewise restricted +to code that is byte-compiled together. The same restriction applies to +getattr(), setattr() and delattr(), as well as when referencing +__dict__ directly.

+
+
+

9.7. Odds and Ends¶

+

Sometimes it is useful to have a data type similar to the Pascal “record†or C +“structâ€, bundling together a few named data items. An empty class definition +will do nicely:

+
class Employee:
+    pass
+
+john = Employee()  # Create an empty employee record
+
+# Fill the fields of the record
+john.name = 'John Doe'
+john.dept = 'computer lab'
+john.salary = 1000
+
+
+

A piece of Python code that expects a particular abstract data type can often be +passed a class that emulates the methods of that data type instead. For +instance, if you have a function that formats some data from a file object, you +can define a class with methods read() and readline() that get the +data from a string buffer instead, and pass it as an argument.

+

Instance method objects have attributes, too: m.__self__ is the instance +object with the method m(), and m.__func__ is the function object +corresponding to the method.

+
+
+

9.8. Iterators¶

+

By now you have probably noticed that most container objects can be looped over +using a for statement:

+
for element in [1, 2, 3]:
+    print(element)
+for element in (1, 2, 3):
+    print(element)
+for key in {'one':1, 'two':2}:
+    print(key)
+for char in "123":
+    print(char)
+for line in open("myfile.txt"):
+    print(line, end='')
+
+
+

This style of access is clear, concise, and convenient. The use of iterators +pervades and unifies Python. Behind the scenes, the for statement +calls iter() on the container object. The function returns an iterator +object that defines the method __next__() which accesses +elements in the container one at a time. When there are no more elements, +__next__() raises a StopIteration exception which tells the +for loop to terminate. You can call the __next__() method +using the next() built-in function; this example shows how it all works:

+
>>> s = 'abc'
+>>> it = iter(s)
+>>> it
+<iterator object at 0x00A1DB50>
+>>> next(it)
+'a'
+>>> next(it)
+'b'
+>>> next(it)
+'c'
+>>> next(it)
+Traceback (most recent call last):
+  File "<stdin>", line 1, in <module>
+    next(it)
+StopIteration
+
+
+

Having seen the mechanics behind the iterator protocol, it is easy to add +iterator behavior to your classes. Define an __iter__() method which +returns an object with a __next__() method. If the class +defines __next__(), then __iter__() can just return self:

+
class Reverse:
+    """Iterator for looping over a sequence backwards."""
+    def __init__(self, data):
+        self.data = data
+        self.index = len(data)
+
+    def __iter__(self):
+        return self
+
+    def __next__(self):
+        if self.index == 0:
+            raise StopIteration
+        self.index = self.index - 1
+        return self.data[self.index]
+
+
+
>>> rev = Reverse('spam')
+>>> iter(rev)
+<__main__.Reverse object at 0x00A1DB50>
+>>> for char in rev:
+...     print(char)
+...
+m
+a
+p
+s
+
+
+
+
+

9.9. Generators¶

+

Generators are a simple and powerful tool for creating iterators. They +are written like regular functions but use the yield statement +whenever they want to return data. Each time next() is called on it, the +generator resumes where it left off (it remembers all the data values and which +statement was last executed). An example shows that generators can be trivially +easy to create:

+
def reverse(data):
+    for index in range(len(data)-1, -1, -1):
+        yield data[index]
+
+
+
>>> for char in reverse('golf'):
+...     print(char)
+...
+f
+l
+o
+g
+
+
+

Anything that can be done with generators can also be done with class-based +iterators as described in the previous section. What makes generators so +compact is that the __iter__() and __next__() methods +are created automatically.

+

Another key feature is that the local variables and execution state are +automatically saved between calls. This made the function easier to write and +much more clear than an approach using instance variables like self.index +and self.data.

+

In addition to automatic method creation and saving program state, when +generators terminate, they automatically raise StopIteration. In +combination, these features make it easy to create iterators with no more effort +than writing a regular function.

+
+
+

9.10. Generator Expressions¶

+

Some simple generators can be coded succinctly as expressions using a syntax +similar to list comprehensions but with parentheses instead of square brackets. +These expressions are designed for situations where the generator is used right +away by an enclosing function. Generator expressions are more compact but less +versatile than full generator definitions and tend to be more memory friendly +than equivalent list comprehensions.

+

Examples:

+
>>> sum(i*i for i in range(10))                 # sum of squares
+285
+
+>>> xvec = [10, 20, 30]
+>>> yvec = [7, 5, 3]
+>>> sum(x*y for x,y in zip(xvec, yvec))         # dot product
+260
+
+>>> unique_words = set(word for line in page  for word in line.split())
+
+>>> valedictorian = max((student.gpa, student.name) for student in graduates)
+
+>>> data = 'golf'
+>>> list(data[i] for i in range(len(data)-1, -1, -1))
+['f', 'l', 'o', 'g']
+
+
+

Footnotes

+
+
1
+

Except for one thing. Module objects have a secret read-only attribute called +__dict__ which returns the dictionary used to implement the module’s +namespace; the name __dict__ is an attribute but not a global name. +Obviously, using this violates the abstraction of namespace implementation, and +should be restricted to things like post-mortem debuggers.

+
+
+
+
+ + +
+
+
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/DOCS/tutorial/controlflow.html b/DOCS/tutorial/controlflow.html new file mode 100644 index 00000000..1d7e3422 --- /dev/null +++ b/DOCS/tutorial/controlflow.html @@ -0,0 +1,1044 @@ + + + + + + + + + 4. More Control Flow Tools — Python 3.9.5 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ +
+

4. More Control Flow Tools¶

+

Besides the while statement just introduced, Python uses the usual +flow control statements known from other languages, with some twists.

+
+

4.1. if Statements¶

+

Perhaps the most well-known statement type is the if statement. For +example:

+
>>> x = int(input("Please enter an integer: "))
+Please enter an integer: 42
+>>> if x < 0:
+...     x = 0
+...     print('Negative changed to zero')
+... elif x == 0:
+...     print('Zero')
+... elif x == 1:
+...     print('Single')
+... else:
+...     print('More')
+...
+More
+
+
+

There can be zero or more elif parts, and the else part is +optional. The keyword ‘elif’ is short for ‘else if’, and is useful +to avoid excessive indentation. An if … elif … +elif … sequence is a substitute for the switch or +case statements found in other languages.

+
+
+

4.2. for Statements¶

+

The for statement in Python differs a bit from what you may be used +to in C or Pascal. Rather than always iterating over an arithmetic progression +of numbers (like in Pascal), or giving the user the ability to define both the +iteration step and halting condition (as C), Python’s for statement +iterates over the items of any sequence (a list or a string), in the order that +they appear in the sequence. For example (no pun intended):

+
>>> # Measure some strings:
+... words = ['cat', 'window', 'defenestrate']
+>>> for w in words:
+...     print(w, len(w))
+...
+cat 3
+window 6
+defenestrate 12
+
+
+

Code that modifies a collection while iterating over that same collection can +be tricky to get right. Instead, it is usually more straight-forward to loop +over a copy of the collection or to create a new collection:

+
# Strategy:  Iterate over a copy
+for user, status in users.copy().items():
+    if status == 'inactive':
+        del users[user]
+
+# Strategy:  Create a new collection
+active_users = {}
+for user, status in users.items():
+    if status == 'active':
+        active_users[user] = status
+
+
+
+
+

4.3. The range() Function¶

+

If you do need to iterate over a sequence of numbers, the built-in function +range() comes in handy. It generates arithmetic progressions:

+
>>> for i in range(5):
+...     print(i)
+...
+0
+1
+2
+3
+4
+
+
+

The given end point is never part of the generated sequence; range(10) generates +10 values, the legal indices for items of a sequence of length 10. It +is possible to let the range start at another number, or to specify a different +increment (even negative; sometimes this is called the ‘step’):

+
range(5, 10)
+   5, 6, 7, 8, 9
+
+range(0, 10, 3)
+   0, 3, 6, 9
+
+range(-10, -100, -30)
+  -10, -40, -70
+
+
+

To iterate over the indices of a sequence, you can combine range() and +len() as follows:

+
>>> a = ['Mary', 'had', 'a', 'little', 'lamb']
+>>> for i in range(len(a)):
+...     print(i, a[i])
+...
+0 Mary
+1 had
+2 a
+3 little
+4 lamb
+
+
+

In most such cases, however, it is convenient to use the enumerate() +function, see Looping Techniques.

+

A strange thing happens if you just print a range:

+
>>> print(range(10))
+range(0, 10)
+
+
+

In many ways the object returned by range() behaves as if it is a list, +but in fact it isn’t. It is an object which returns the successive items of +the desired sequence when you iterate over it, but it doesn’t really make +the list, thus saving space.

+

We say such an object is iterable, that is, suitable as a target for +functions and constructs that expect something from which they can +obtain successive items until the supply is exhausted. We have seen that +the for statement is such a construct, while an example of a function +that takes an iterable is sum():

+
>>> sum(range(4))  # 0 + 1 + 2 + 3
+6
+
+
+

Later we will see more functions that return iterables and take iterables as +arguments. Lastly, maybe you are curious about how to get a list from a range. +Here is the solution:

+
>>> list(range(4))
+[0, 1, 2, 3]
+
+
+

In chapter Data Structures, we will discuss in more detail about +list().

+
+
+

4.4. break and continue Statements, and else Clauses on Loops¶

+

The break statement, like in C, breaks out of the innermost enclosing +for or while loop.

+

Loop statements may have an else clause; it is executed when the loop +terminates through exhaustion of the iterable (with for) or when the +condition becomes false (with while), but not when the loop is +terminated by a break statement. This is exemplified by the +following loop, which searches for prime numbers:

+
>>> for n in range(2, 10):
+...     for x in range(2, n):
+...         if n % x == 0:
+...             print(n, 'equals', x, '*', n//x)
+...             break
+...     else:
+...         # loop fell through without finding a factor
+...         print(n, 'is a prime number')
+...
+2 is a prime number
+3 is a prime number
+4 equals 2 * 2
+5 is a prime number
+6 equals 2 * 3
+7 is a prime number
+8 equals 2 * 4
+9 equals 3 * 3
+
+
+

(Yes, this is the correct code. Look closely: the else clause belongs to +the for loop, not the if statement.)

+

When used with a loop, the else clause has more in common with the +else clause of a try statement than it does with that of +if statements: a try statement’s else clause runs +when no exception occurs, and a loop’s else clause runs when no break +occurs. For more on the try statement and exceptions, see +Handling Exceptions.

+

The continue statement, also borrowed from C, continues with the next +iteration of the loop:

+
>>> for num in range(2, 10):
+...     if num % 2 == 0:
+...         print("Found an even number", num)
+...         continue
+...     print("Found an odd number", num)
+...
+Found an even number 2
+Found an odd number 3
+Found an even number 4
+Found an odd number 5
+Found an even number 6
+Found an odd number 7
+Found an even number 8
+Found an odd number 9
+
+
+
+
+

4.5. pass Statements¶

+

The pass statement does nothing. It can be used when a statement is +required syntactically but the program requires no action. For example:

+
>>> while True:
+...     pass  # Busy-wait for keyboard interrupt (Ctrl+C)
+...
+
+
+

This is commonly used for creating minimal classes:

+
>>> class MyEmptyClass:
+...     pass
+...
+
+
+

Another place pass can be used is as a place-holder for a function or +conditional body when you are working on new code, allowing you to keep thinking +at a more abstract level. The pass is silently ignored:

+
>>> def initlog(*args):
+...     pass   # Remember to implement this!
+...
+
+
+
+
+

4.6. Defining Functions¶

+

We can create a function that writes the Fibonacci series to an arbitrary +boundary:

+
>>> def fib(n):    # write Fibonacci series up to n
+...     """Print a Fibonacci series up to n."""
+...     a, b = 0, 1
+...     while a < n:
+...         print(a, end=' ')
+...         a, b = b, a+b
+...     print()
+...
+>>> # Now call the function we just defined:
+... fib(2000)
+0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597
+
+
+

The keyword def introduces a function definition. It must be +followed by the function name and the parenthesized list of formal parameters. +The statements that form the body of the function start at the next line, and +must be indented.

+

The first statement of the function body can optionally be a string literal; +this string literal is the function’s documentation string, or docstring. +(More about docstrings can be found in the section Documentation Strings.) +There are tools which use docstrings to automatically produce online or printed +documentation, or to let the user interactively browse through code; it’s good +practice to include docstrings in code that you write, so make a habit of it.

+

The execution of a function introduces a new symbol table used for the local +variables of the function. More precisely, all variable assignments in a +function store the value in the local symbol table; whereas variable references +first look in the local symbol table, then in the local symbol tables of +enclosing functions, then in the global symbol table, and finally in the table +of built-in names. Thus, global variables and variables of enclosing functions +cannot be directly assigned a value within a function (unless, for global +variables, named in a global statement, or, for variables of enclosing +functions, named in a nonlocal statement), although they may be +referenced.

+

The actual parameters (arguments) to a function call are introduced in the local +symbol table of the called function when it is called; thus, arguments are +passed using call by value (where the value is always an object reference, +not the value of the object). 1 When a function calls another function, +or calls itself recursively, a new +local symbol table is created for that call.

+

A function definition associates the function name with the function object in +the current symbol table. The interpreter recognizes the object pointed to by +that name as a user-defined function. Other names can also point to that same +function object and can also be used to access the function:

+
>>> fib
+<function fib at 10042ed0>
+>>> f = fib
+>>> f(100)
+0 1 1 2 3 5 8 13 21 34 55 89
+
+
+

Coming from other languages, you might object that fib is not a function but +a procedure since it doesn’t return a value. In fact, even functions without a +return statement do return a value, albeit a rather boring one. This +value is called None (it’s a built-in name). Writing the value None is +normally suppressed by the interpreter if it would be the only value written. +You can see it if you really want to using print():

+
>>> fib(0)
+>>> print(fib(0))
+None
+
+
+

It is simple to write a function that returns a list of the numbers of the +Fibonacci series, instead of printing it:

+
>>> def fib2(n):  # return Fibonacci series up to n
+...     """Return a list containing the Fibonacci series up to n."""
+...     result = []
+...     a, b = 0, 1
+...     while a < n:
+...         result.append(a)    # see below
+...         a, b = b, a+b
+...     return result
+...
+>>> f100 = fib2(100)    # call it
+>>> f100                # write the result
+[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
+
+
+

This example, as usual, demonstrates some new Python features:

+
    +
  • The return statement returns with a value from a function. +return without an expression argument returns None. Falling off +the end of a function also returns None.

  • +
  • The statement result.append(a) calls a method of the list object +result. A method is a function that ‘belongs’ to an object and is named +obj.methodname, where obj is some object (this may be an expression), +and methodname is the name of a method that is defined by the object’s type. +Different types define different methods. Methods of different types may have +the same name without causing ambiguity. (It is possible to define your own +object types and methods, using classes, see Classes) +The method append() shown in the example is defined for list objects; it +adds a new element at the end of the list. In this example it is equivalent to +result = result + [a], but more efficient.

  • +
+
+
+

4.7. More on Defining Functions¶

+

It is also possible to define functions with a variable number of arguments. +There are three forms, which can be combined.

+
+

4.7.1. Default Argument Values¶

+

The most useful form is to specify a default value for one or more arguments. +This creates a function that can be called with fewer arguments than it is +defined to allow. For example:

+
def ask_ok(prompt, retries=4, reminder='Please try again!'):
+    while True:
+        ok = input(prompt)
+        if ok in ('y', 'ye', 'yes'):
+            return True
+        if ok in ('n', 'no', 'nop', 'nope'):
+            return False
+        retries = retries - 1
+        if retries < 0:
+            raise ValueError('invalid user response')
+        print(reminder)
+
+
+

This function can be called in several ways:

+
    +
  • giving only the mandatory argument: +ask_ok('Do you really want to quit?')

  • +
  • giving one of the optional arguments: +ask_ok('OK to overwrite the file?', 2)

  • +
  • or even giving all arguments: +ask_ok('OK to overwrite the file?', 2, 'Come on, only yes or no!')

  • +
+

This example also introduces the in keyword. This tests whether or +not a sequence contains a certain value.

+

The default values are evaluated at the point of function definition in the +defining scope, so that

+
i = 5
+
+def f(arg=i):
+    print(arg)
+
+i = 6
+f()
+
+
+

will print 5.

+

Important warning: The default value is evaluated only once. This makes a +difference when the default is a mutable object such as a list, dictionary, or +instances of most classes. For example, the following function accumulates the +arguments passed to it on subsequent calls:

+
def f(a, L=[]):
+    L.append(a)
+    return L
+
+print(f(1))
+print(f(2))
+print(f(3))
+
+
+

This will print

+
[1]
+[1, 2]
+[1, 2, 3]
+
+
+

If you don’t want the default to be shared between subsequent calls, you can +write the function like this instead:

+
def f(a, L=None):
+    if L is None:
+        L = []
+    L.append(a)
+    return L
+
+
+
+
+

4.7.2. Keyword Arguments¶

+

Functions can also be called using keyword arguments +of the form kwarg=value. For instance, the following function:

+
def parrot(voltage, state='a stiff', action='voom', type='Norwegian Blue'):
+    print("-- This parrot wouldn't", action, end=' ')
+    print("if you put", voltage, "volts through it.")
+    print("-- Lovely plumage, the", type)
+    print("-- It's", state, "!")
+
+
+

accepts one required argument (voltage) and three optional arguments +(state, action, and type). This function can be called in any +of the following ways:

+
parrot(1000)                                          # 1 positional argument
+parrot(voltage=1000)                                  # 1 keyword argument
+parrot(voltage=1000000, action='VOOOOOM')             # 2 keyword arguments
+parrot(action='VOOOOOM', voltage=1000000)             # 2 keyword arguments
+parrot('a million', 'bereft of life', 'jump')         # 3 positional arguments
+parrot('a thousand', state='pushing up the daisies')  # 1 positional, 1 keyword
+
+
+

but all the following calls would be invalid:

+
parrot()                     # required argument missing
+parrot(voltage=5.0, 'dead')  # non-keyword argument after a keyword argument
+parrot(110, voltage=220)     # duplicate value for the same argument
+parrot(actor='John Cleese')  # unknown keyword argument
+
+
+

In a function call, keyword arguments must follow positional arguments. +All the keyword arguments passed must match one of the arguments +accepted by the function (e.g. actor is not a valid argument for the +parrot function), and their order is not important. This also includes +non-optional arguments (e.g. parrot(voltage=1000) is valid too). +No argument may receive a value more than once. +Here’s an example that fails due to this restriction:

+
>>> def function(a):
+...     pass
+...
+>>> function(0, a=0)
+Traceback (most recent call last):
+  File "<stdin>", line 1, in <module>
+TypeError: function() got multiple values for keyword argument 'a'
+
+
+

When a final formal parameter of the form **name is present, it receives a +dictionary (see Mapping Types — dict) containing all keyword arguments except for +those corresponding to a formal parameter. This may be combined with a formal +parameter of the form *name (described in the next subsection) which +receives a tuple containing the positional +arguments beyond the formal parameter list. (*name must occur +before **name.) For example, if we define a function like this:

+
def cheeseshop(kind, *arguments, **keywords):
+    print("-- Do you have any", kind, "?")
+    print("-- I'm sorry, we're all out of", kind)
+    for arg in arguments:
+        print(arg)
+    print("-" * 40)
+    for kw in keywords:
+        print(kw, ":", keywords[kw])
+
+
+

It could be called like this:

+
cheeseshop("Limburger", "It's very runny, sir.",
+           "It's really very, VERY runny, sir.",
+           shopkeeper="Michael Palin",
+           client="John Cleese",
+           sketch="Cheese Shop Sketch")
+
+
+

and of course it would print:

+
-- Do you have any Limburger ?
+-- I'm sorry, we're all out of Limburger
+It's very runny, sir.
+It's really very, VERY runny, sir.
+----------------------------------------
+shopkeeper : Michael Palin
+client : John Cleese
+sketch : Cheese Shop Sketch
+
+
+

Note that the order in which the keyword arguments are printed is guaranteed +to match the order in which they were provided in the function call.

+
+
+

4.7.3. Special parameters¶

+

By default, arguments may be passed to a Python function either by position +or explicitly by keyword. For readability and performance, it makes sense to +restrict the way arguments can be passed so that a developer need only look +at the function definition to determine if items are passed by position, by +position or keyword, or by keyword.

+

A function definition may look like:

+
def f(pos1, pos2, /, pos_or_kwd, *, kwd1, kwd2):
+      -----------    ----------     ----------
+        |             |                  |
+        |        Positional or keyword   |
+        |                                - Keyword only
+         -- Positional only
+
+
+

where / and * are optional. If used, these symbols indicate the kind of +parameter by how the arguments may be passed to the function: +positional-only, positional-or-keyword, and keyword-only. Keyword parameters +are also referred to as named parameters.

+
+

4.7.3.1. Positional-or-Keyword Arguments¶

+

If / and * are not present in the function definition, arguments may +be passed to a function by position or by keyword.

+
+
+

4.7.3.2. Positional-Only Parameters¶

+

Looking at this in a bit more detail, it is possible to mark certain parameters +as positional-only. If positional-only, the parameters’ order matters, and +the parameters cannot be passed by keyword. Positional-only parameters are +placed before a / (forward-slash). The / is used to logically +separate the positional-only parameters from the rest of the parameters. +If there is no / in the function definition, there are no positional-only +parameters.

+

Parameters following the / may be positional-or-keyword or keyword-only.

+
+
+

4.7.3.3. Keyword-Only Arguments¶

+

To mark parameters as keyword-only, indicating the parameters must be passed +by keyword argument, place an * in the arguments list just before the first +keyword-only parameter.

+
+
+

4.7.3.4. Function Examples¶

+

Consider the following example function definitions paying close attention to the +markers / and *:

+
>>> def standard_arg(arg):
+...     print(arg)
+...
+>>> def pos_only_arg(arg, /):
+...     print(arg)
+...
+>>> def kwd_only_arg(*, arg):
+...     print(arg)
+...
+>>> def combined_example(pos_only, /, standard, *, kwd_only):
+...     print(pos_only, standard, kwd_only)
+
+
+

The first function definition, standard_arg, the most familiar form, +places no restrictions on the calling convention and arguments may be +passed by position or keyword:

+
>>> standard_arg(2)
+2
+
+>>> standard_arg(arg=2)
+2
+
+
+

The second function pos_only_arg is restricted to only use positional +parameters as there is a / in the function definition:

+
>>> pos_only_arg(1)
+1
+
+>>> pos_only_arg(arg=1)
+Traceback (most recent call last):
+  File "<stdin>", line 1, in <module>
+TypeError: pos_only_arg() got an unexpected keyword argument 'arg'
+
+
+

The third function kwd_only_args only allows keyword arguments as indicated +by a * in the function definition:

+
>>> kwd_only_arg(3)
+Traceback (most recent call last):
+  File "<stdin>", line 1, in <module>
+TypeError: kwd_only_arg() takes 0 positional arguments but 1 was given
+
+>>> kwd_only_arg(arg=3)
+3
+
+
+

And the last uses all three calling conventions in the same function +definition:

+
>>> combined_example(1, 2, 3)
+Traceback (most recent call last):
+  File "<stdin>", line 1, in <module>
+TypeError: combined_example() takes 2 positional arguments but 3 were given
+
+>>> combined_example(1, 2, kwd_only=3)
+1 2 3
+
+>>> combined_example(1, standard=2, kwd_only=3)
+1 2 3
+
+>>> combined_example(pos_only=1, standard=2, kwd_only=3)
+Traceback (most recent call last):
+  File "<stdin>", line 1, in <module>
+TypeError: combined_example() got an unexpected keyword argument 'pos_only'
+
+
+

Finally, consider this function definition which has a potential collision between the positional argument name and **kwds which has name as a key:

+
def foo(name, **kwds):
+    return 'name' in kwds
+
+
+

There is no possible call that will make it return True as the keyword 'name' +will always bind to the first parameter. For example:

+
>>> foo(1, **{'name': 2})
+Traceback (most recent call last):
+  File "<stdin>", line 1, in <module>
+TypeError: foo() got multiple values for argument 'name'
+>>>
+
+
+

But using / (positional only arguments), it is possible since it allows name as a positional argument and 'name' as a key in the keyword arguments:

+
def foo(name, /, **kwds):
+    return 'name' in kwds
+>>> foo(1, **{'name': 2})
+True
+
+
+

In other words, the names of positional-only parameters can be used in +**kwds without ambiguity.

+
+
+

4.7.3.5. Recap¶

+

The use case will determine which parameters to use in the function definition:

+
def f(pos1, pos2, /, pos_or_kwd, *, kwd1, kwd2):
+
+
+

As guidance:

+
    +
  • Use positional-only if you want the name of the parameters to not be +available to the user. This is useful when parameter names have no real +meaning, if you want to enforce the order of the arguments when the function +is called or if you need to take some positional parameters and arbitrary +keywords.

  • +
  • Use keyword-only when names have meaning and the function definition is +more understandable by being explicit with names or you want to prevent +users relying on the position of the argument being passed.

  • +
  • For an API, use positional-only to prevent breaking API changes +if the parameter’s name is modified in the future.

  • +
+
+
+
+

4.7.4. Arbitrary Argument Lists¶

+

Finally, the least frequently used option is to specify that a function can be +called with an arbitrary number of arguments. These arguments will be wrapped +up in a tuple (see Tuples and Sequences). Before the variable number of arguments, +zero or more normal arguments may occur.

+
def write_multiple_items(file, separator, *args):
+    file.write(separator.join(args))
+
+
+

Normally, these variadic arguments will be last in the list of formal +parameters, because they scoop up all remaining input arguments that are +passed to the function. Any formal parameters which occur after the *args +parameter are ‘keyword-only’ arguments, meaning that they can only be used as +keywords rather than positional arguments.

+
>>> def concat(*args, sep="/"):
+...     return sep.join(args)
+...
+>>> concat("earth", "mars", "venus")
+'earth/mars/venus'
+>>> concat("earth", "mars", "venus", sep=".")
+'earth.mars.venus'
+
+
+
+
+

4.7.5. Unpacking Argument Lists¶

+

The reverse situation occurs when the arguments are already in a list or tuple +but need to be unpacked for a function call requiring separate positional +arguments. For instance, the built-in range() function expects separate +start and stop arguments. If they are not available separately, write the +function call with the *-operator to unpack the arguments out of a list +or tuple:

+
>>> list(range(3, 6))            # normal call with separate arguments
+[3, 4, 5]
+>>> args = [3, 6]
+>>> list(range(*args))            # call with arguments unpacked from a list
+[3, 4, 5]
+
+
+

In the same fashion, dictionaries can deliver keyword arguments with the +**-operator:

+
>>> def parrot(voltage, state='a stiff', action='voom'):
+...     print("-- This parrot wouldn't", action, end=' ')
+...     print("if you put", voltage, "volts through it.", end=' ')
+...     print("E's", state, "!")
+...
+>>> d = {"voltage": "four million", "state": "bleedin' demised", "action": "VOOM"}
+>>> parrot(**d)
+-- This parrot wouldn't VOOM if you put four million volts through it. E's bleedin' demised !
+
+
+
+
+

4.7.6. Lambda Expressions¶

+

Small anonymous functions can be created with the lambda keyword. +This function returns the sum of its two arguments: lambda a, b: a+b. +Lambda functions can be used wherever function objects are required. They are +syntactically restricted to a single expression. Semantically, they are just +syntactic sugar for a normal function definition. Like nested function +definitions, lambda functions can reference variables from the containing +scope:

+
>>> def make_incrementor(n):
+...     return lambda x: x + n
+...
+>>> f = make_incrementor(42)
+>>> f(0)
+42
+>>> f(1)
+43
+
+
+

The above example uses a lambda expression to return a function. Another use +is to pass a small function as an argument:

+
>>> pairs = [(1, 'one'), (2, 'two'), (3, 'three'), (4, 'four')]
+>>> pairs.sort(key=lambda pair: pair[1])
+>>> pairs
+[(4, 'four'), (1, 'one'), (3, 'three'), (2, 'two')]
+
+
+
+
+

4.7.7. Documentation Strings¶

+

Here are some conventions about the content and formatting of documentation +strings.

+

The first line should always be a short, concise summary of the object’s +purpose. For brevity, it should not explicitly state the object’s name or type, +since these are available by other means (except if the name happens to be a +verb describing a function’s operation). This line should begin with a capital +letter and end with a period.

+

If there are more lines in the documentation string, the second line should be +blank, visually separating the summary from the rest of the description. The +following lines should be one or more paragraphs describing the object’s calling +conventions, its side effects, etc.

+

The Python parser does not strip indentation from multi-line string literals in +Python, so tools that process documentation have to strip indentation if +desired. This is done using the following convention. The first non-blank line +after the first line of the string determines the amount of indentation for +the entire documentation string. (We can’t use the first line since it is +generally adjacent to the string’s opening quotes so its indentation is not +apparent in the string literal.) Whitespace “equivalent†to this indentation is +then stripped from the start of all lines of the string. Lines that are +indented less should not occur, but if they occur all their leading whitespace +should be stripped. Equivalence of whitespace should be tested after expansion +of tabs (to 8 spaces, normally).

+

Here is an example of a multi-line docstring:

+
>>> def my_function():
+...     """Do nothing, but document it.
+...
+...     No, really, it doesn't do anything.
+...     """
+...     pass
+...
+>>> print(my_function.__doc__)
+Do nothing, but document it.
+
+    No, really, it doesn't do anything.
+
+
+
+
+

4.7.8. Function Annotations¶

+

Function annotations are completely optional metadata +information about the types used by user-defined functions (see PEP 3107 and +PEP 484 for more information).

+

Annotations are stored in the __annotations__ +attribute of the function as a dictionary and have no effect on any other part of the +function. Parameter annotations are defined by a colon after the parameter name, followed +by an expression evaluating to the value of the annotation. Return annotations are +defined by a literal ->, followed by an expression, between the parameter +list and the colon denoting the end of the def statement. The +following example has a required argument, an optional argument, and the return +value annotated:

+
>>> def f(ham: str, eggs: str = 'eggs') -> str:
+...     print("Annotations:", f.__annotations__)
+...     print("Arguments:", ham, eggs)
+...     return ham + ' and ' + eggs
+...
+>>> f('spam')
+Annotations: {'ham': <class 'str'>, 'return': <class 'str'>, 'eggs': <class 'str'>}
+Arguments: spam eggs
+'spam and eggs'
+
+
+
+
+
+

4.8. Intermezzo: Coding Style¶

+

Now that you are about to write longer, more complex pieces of Python, it is a +good time to talk about coding style. Most languages can be written (or more +concise, formatted) in different styles; some are more readable than others. +Making it easy for others to read your code is always a good idea, and adopting +a nice coding style helps tremendously for that.

+

For Python, PEP 8 has emerged as the style guide that most projects adhere to; +it promotes a very readable and eye-pleasing coding style. Every Python +developer should read it at some point; here are the most important points +extracted for you:

+
    +
  • Use 4-space indentation, and no tabs.

    +

    4 spaces are a good compromise between small indentation (allows greater +nesting depth) and large indentation (easier to read). Tabs introduce +confusion, and are best left out.

    +
  • +
  • Wrap lines so that they don’t exceed 79 characters.

    +

    This helps users with small displays and makes it possible to have several +code files side-by-side on larger displays.

    +
  • +
  • Use blank lines to separate functions and classes, and larger blocks of +code inside functions.

  • +
  • When possible, put comments on a line of their own.

  • +
  • Use docstrings.

  • +
  • Use spaces around operators and after commas, but not directly inside +bracketing constructs: a = f(1, 2) + g(3, 4).

  • +
  • Name your classes and functions consistently; the convention is to use +UpperCamelCase for classes and lowercase_with_underscores for functions +and methods. Always use self as the name for the first method argument +(see A First Look at Classes for more on classes and methods).

  • +
  • Don’t use fancy encodings if your code is meant to be used in international +environments. Python’s default, UTF-8, or even plain ASCII work best in any +case.

  • +
  • Likewise, don’t use non-ASCII characters in identifiers if there is only the +slightest chance people speaking a different language will read or maintain +the code.

  • +
+

Footnotes

+
+
1
+

Actually, call by object reference would be a better description, +since if a mutable object is passed, the caller will see any changes the +callee makes to it (items inserted into a list).

+
+
+
+
+ + +
+
+
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/DOCS/tutorial/datastructures.html b/DOCS/tutorial/datastructures.html new file mode 100644 index 00000000..b04b2ee0 --- /dev/null +++ b/DOCS/tutorial/datastructures.html @@ -0,0 +1,881 @@ + + + + + + + + + 5. Data Structures — Python 3.9.5 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ +
+

5. Data Structures¶

+

This chapter describes some things you’ve learned about already in more detail, +and adds some new things as well.

+
+

5.1. More on Lists¶

+

The list data type has some more methods. Here are all of the methods of list +objects:

+
+
+list.append(x)
+

Add an item to the end of the list. Equivalent to a[len(a):] = [x].

+
+ +
+
+list.extend(iterable)
+

Extend the list by appending all the items from the iterable. Equivalent to +a[len(a):] = iterable.

+
+ +
+
+list.insert(i, x)
+

Insert an item at a given position. The first argument is the index of the +element before which to insert, so a.insert(0, x) inserts at the front of +the list, and a.insert(len(a), x) is equivalent to a.append(x).

+
+ +
+
+list.remove(x)
+

Remove the first item from the list whose value is equal to x. It raises a +ValueError if there is no such item.

+
+ +
+
+list.pop([i])
+

Remove the item at the given position in the list, and return it. If no index +is specified, a.pop() removes and returns the last item in the list. (The +square brackets around the i in the method signature denote that the parameter +is optional, not that you should type square brackets at that position. You +will see this notation frequently in the Python Library Reference.)

+
+ +
+
+list.clear()
+

Remove all items from the list. Equivalent to del a[:].

+
+ +
+
+list.index(x[, start[, end]])
+

Return zero-based index in the list of the first item whose value is equal to x. +Raises a ValueError if there is no such item.

+

The optional arguments start and end are interpreted as in the slice +notation and are used to limit the search to a particular subsequence of +the list. The returned index is computed relative to the beginning of the full +sequence rather than the start argument.

+
+ +
+
+list.count(x)
+

Return the number of times x appears in the list.

+
+ +
+
+list.sort(*, key=None, reverse=False)
+

Sort the items of the list in place (the arguments can be used for sort +customization, see sorted() for their explanation).

+
+ +
+
+list.reverse()
+

Reverse the elements of the list in place.

+
+ +
+
+list.copy()
+

Return a shallow copy of the list. Equivalent to a[:].

+
+ +

An example that uses most of the list methods:

+
>>> fruits = ['orange', 'apple', 'pear', 'banana', 'kiwi', 'apple', 'banana']
+>>> fruits.count('apple')
+2
+>>> fruits.count('tangerine')
+0
+>>> fruits.index('banana')
+3
+>>> fruits.index('banana', 4)  # Find next banana starting a position 4
+6
+>>> fruits.reverse()
+>>> fruits
+['banana', 'apple', 'kiwi', 'banana', 'pear', 'apple', 'orange']
+>>> fruits.append('grape')
+>>> fruits
+['banana', 'apple', 'kiwi', 'banana', 'pear', 'apple', 'orange', 'grape']
+>>> fruits.sort()
+>>> fruits
+['apple', 'apple', 'banana', 'banana', 'grape', 'kiwi', 'orange', 'pear']
+>>> fruits.pop()
+'pear'
+
+
+

You might have noticed that methods like insert, remove or sort that +only modify the list have no return value printed – they return the default +None. 1 This is a design principle for all mutable data structures in +Python.

+

Another thing you might notice is that not all data can be sorted or +compared. For instance, [None, 'hello', 10] doesn’t sort because +integers can’t be compared to strings and None can’t be compared to +other types. Also, there are some types that don’t have a defined +ordering relation. For example, 3+4j < 5+7j isn’t a valid +comparison.

+
+

5.1.1. Using Lists as Stacks¶

+

The list methods make it very easy to use a list as a stack, where the last +element added is the first element retrieved (“last-in, first-outâ€). To add an +item to the top of the stack, use append(). To retrieve an item from the +top of the stack, use pop() without an explicit index. For example:

+
>>> stack = [3, 4, 5]
+>>> stack.append(6)
+>>> stack.append(7)
+>>> stack
+[3, 4, 5, 6, 7]
+>>> stack.pop()
+7
+>>> stack
+[3, 4, 5, 6]
+>>> stack.pop()
+6
+>>> stack.pop()
+5
+>>> stack
+[3, 4]
+
+
+
+
+

5.1.2. Using Lists as Queues¶

+

It is also possible to use a list as a queue, where the first element added is +the first element retrieved (“first-in, first-outâ€); however, lists are not +efficient for this purpose. While appends and pops from the end of list are +fast, doing inserts or pops from the beginning of a list is slow (because all +of the other elements have to be shifted by one).

+

To implement a queue, use collections.deque which was designed to +have fast appends and pops from both ends. For example:

+
>>> from collections import deque
+>>> queue = deque(["Eric", "John", "Michael"])
+>>> queue.append("Terry")           # Terry arrives
+>>> queue.append("Graham")          # Graham arrives
+>>> queue.popleft()                 # The first to arrive now leaves
+'Eric'
+>>> queue.popleft()                 # The second to arrive now leaves
+'John'
+>>> queue                           # Remaining queue in order of arrival
+deque(['Michael', 'Terry', 'Graham'])
+
+
+
+
+

5.1.3. List Comprehensions¶

+

List comprehensions provide a concise way to create lists. +Common applications are to make new lists where each element is the result of +some operations applied to each member of another sequence or iterable, or to +create a subsequence of those elements that satisfy a certain condition.

+

For example, assume we want to create a list of squares, like:

+
>>> squares = []
+>>> for x in range(10):
+...     squares.append(x**2)
+...
+>>> squares
+[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
+
+
+

Note that this creates (or overwrites) a variable named x that still exists +after the loop completes. We can calculate the list of squares without any +side effects using:

+
squares = list(map(lambda x: x**2, range(10)))
+
+
+

or, equivalently:

+
squares = [x**2 for x in range(10)]
+
+
+

which is more concise and readable.

+

A list comprehension consists of brackets containing an expression followed +by a for clause, then zero or more for or if +clauses. The result will be a new list resulting from evaluating the expression +in the context of the for and if clauses which follow it. +For example, this listcomp combines the elements of two lists if they are not +equal:

+
>>> [(x, y) for x in [1,2,3] for y in [3,1,4] if x != y]
+[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]
+
+
+

and it’s equivalent to:

+
>>> combs = []
+>>> for x in [1,2,3]:
+...     for y in [3,1,4]:
+...         if x != y:
+...             combs.append((x, y))
+...
+>>> combs
+[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]
+
+
+

Note how the order of the for and if statements is the +same in both these snippets.

+

If the expression is a tuple (e.g. the (x, y) in the previous example), +it must be parenthesized.

+
>>> vec = [-4, -2, 0, 2, 4]
+>>> # create a new list with the values doubled
+>>> [x*2 for x in vec]
+[-8, -4, 0, 4, 8]
+>>> # filter the list to exclude negative numbers
+>>> [x for x in vec if x >= 0]
+[0, 2, 4]
+>>> # apply a function to all the elements
+>>> [abs(x) for x in vec]
+[4, 2, 0, 2, 4]
+>>> # call a method on each element
+>>> freshfruit = ['  banana', '  loganberry ', 'passion fruit  ']
+>>> [weapon.strip() for weapon in freshfruit]
+['banana', 'loganberry', 'passion fruit']
+>>> # create a list of 2-tuples like (number, square)
+>>> [(x, x**2) for x in range(6)]
+[(0, 0), (1, 1), (2, 4), (3, 9), (4, 16), (5, 25)]
+>>> # the tuple must be parenthesized, otherwise an error is raised
+>>> [x, x**2 for x in range(6)]
+  File "<stdin>", line 1, in <module>
+    [x, x**2 for x in range(6)]
+               ^
+SyntaxError: invalid syntax
+>>> # flatten a list using a listcomp with two 'for'
+>>> vec = [[1,2,3], [4,5,6], [7,8,9]]
+>>> [num for elem in vec for num in elem]
+[1, 2, 3, 4, 5, 6, 7, 8, 9]
+
+
+

List comprehensions can contain complex expressions and nested functions:

+
>>> from math import pi
+>>> [str(round(pi, i)) for i in range(1, 6)]
+['3.1', '3.14', '3.142', '3.1416', '3.14159']
+
+
+
+
+

5.1.4. Nested List Comprehensions¶

+

The initial expression in a list comprehension can be any arbitrary expression, +including another list comprehension.

+

Consider the following example of a 3x4 matrix implemented as a list of +3 lists of length 4:

+
>>> matrix = [
+...     [1, 2, 3, 4],
+...     [5, 6, 7, 8],
+...     [9, 10, 11, 12],
+... ]
+
+
+

The following list comprehension will transpose rows and columns:

+
>>> [[row[i] for row in matrix] for i in range(4)]
+[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]
+
+
+

As we saw in the previous section, the nested listcomp is evaluated in +the context of the for that follows it, so this example is +equivalent to:

+
>>> transposed = []
+>>> for i in range(4):
+...     transposed.append([row[i] for row in matrix])
+...
+>>> transposed
+[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]
+
+
+

which, in turn, is the same as:

+
>>> transposed = []
+>>> for i in range(4):
+...     # the following 3 lines implement the nested listcomp
+...     transposed_row = []
+...     for row in matrix:
+...         transposed_row.append(row[i])
+...     transposed.append(transposed_row)
+...
+>>> transposed
+[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]
+
+
+

In the real world, you should prefer built-in functions to complex flow statements. +The zip() function would do a great job for this use case:

+
>>> list(zip(*matrix))
+[(1, 5, 9), (2, 6, 10), (3, 7, 11), (4, 8, 12)]
+
+
+

See Unpacking Argument Lists for details on the asterisk in this line.

+
+
+
+

5.2. The del statement¶

+

There is a way to remove an item from a list given its index instead of its +value: the del statement. This differs from the pop() method +which returns a value. The del statement can also be used to remove +slices from a list or clear the entire list (which we did earlier by assignment +of an empty list to the slice). For example:

+
>>> a = [-1, 1, 66.25, 333, 333, 1234.5]
+>>> del a[0]
+>>> a
+[1, 66.25, 333, 333, 1234.5]
+>>> del a[2:4]
+>>> a
+[1, 66.25, 1234.5]
+>>> del a[:]
+>>> a
+[]
+
+
+

del can also be used to delete entire variables:

+
>>> del a
+
+
+

Referencing the name a hereafter is an error (at least until another value +is assigned to it). We’ll find other uses for del later.

+
+
+

5.3. Tuples and Sequences¶

+

We saw that lists and strings have many common properties, such as indexing and +slicing operations. They are two examples of sequence data types (see +Sequence Types — list, tuple, range). Since Python is an evolving language, other sequence data +types may be added. There is also another standard sequence data type: the +tuple.

+

A tuple consists of a number of values separated by commas, for instance:

+
>>> t = 12345, 54321, 'hello!'
+>>> t[0]
+12345
+>>> t
+(12345, 54321, 'hello!')
+>>> # Tuples may be nested:
+... u = t, (1, 2, 3, 4, 5)
+>>> u
+((12345, 54321, 'hello!'), (1, 2, 3, 4, 5))
+>>> # Tuples are immutable:
+... t[0] = 88888
+Traceback (most recent call last):
+  File "<stdin>", line 1, in <module>
+TypeError: 'tuple' object does not support item assignment
+>>> # but they can contain mutable objects:
+... v = ([1, 2, 3], [3, 2, 1])
+>>> v
+([1, 2, 3], [3, 2, 1])
+
+
+

As you see, on output tuples are always enclosed in parentheses, so that nested +tuples are interpreted correctly; they may be input with or without surrounding +parentheses, although often parentheses are necessary anyway (if the tuple is +part of a larger expression). It is not possible to assign to the individual +items of a tuple, however it is possible to create tuples which contain mutable +objects, such as lists.

+

Though tuples may seem similar to lists, they are often used in different +situations and for different purposes. +Tuples are immutable, and usually contain a heterogeneous sequence of +elements that are accessed via unpacking (see later in this section) or indexing +(or even by attribute in the case of namedtuples). +Lists are mutable, and their elements are usually homogeneous and are +accessed by iterating over the list.

+

A special problem is the construction of tuples containing 0 or 1 items: the +syntax has some extra quirks to accommodate these. Empty tuples are constructed +by an empty pair of parentheses; a tuple with one item is constructed by +following a value with a comma (it is not sufficient to enclose a single value +in parentheses). Ugly, but effective. For example:

+
>>> empty = ()
+>>> singleton = 'hello',    # <-- note trailing comma
+>>> len(empty)
+0
+>>> len(singleton)
+1
+>>> singleton
+('hello',)
+
+
+

The statement t = 12345, 54321, 'hello!' is an example of tuple packing: +the values 12345, 54321 and 'hello!' are packed together in a tuple. +The reverse operation is also possible:

+
>>> x, y, z = t
+
+
+

This is called, appropriately enough, sequence unpacking and works for any +sequence on the right-hand side. Sequence unpacking requires that there are as +many variables on the left side of the equals sign as there are elements in the +sequence. Note that multiple assignment is really just a combination of tuple +packing and sequence unpacking.

+
+
+

5.4. Sets¶

+

Python also includes a data type for sets. A set is an unordered collection +with no duplicate elements. Basic uses include membership testing and +eliminating duplicate entries. Set objects also support mathematical operations +like union, intersection, difference, and symmetric difference.

+

Curly braces or the set() function can be used to create sets. Note: to +create an empty set you have to use set(), not {}; the latter creates an +empty dictionary, a data structure that we discuss in the next section.

+

Here is a brief demonstration:

+
>>> basket = {'apple', 'orange', 'apple', 'pear', 'orange', 'banana'}
+>>> print(basket)                      # show that duplicates have been removed
+{'orange', 'banana', 'pear', 'apple'}
+>>> 'orange' in basket                 # fast membership testing
+True
+>>> 'crabgrass' in basket
+False
+
+>>> # Demonstrate set operations on unique letters from two words
+...
+>>> a = set('abracadabra')
+>>> b = set('alacazam')
+>>> a                                  # unique letters in a
+{'a', 'r', 'b', 'c', 'd'}
+>>> a - b                              # letters in a but not in b
+{'r', 'd', 'b'}
+>>> a | b                              # letters in a or b or both
+{'a', 'c', 'r', 'd', 'b', 'm', 'z', 'l'}
+>>> a & b                              # letters in both a and b
+{'a', 'c'}
+>>> a ^ b                              # letters in a or b but not both
+{'r', 'd', 'b', 'm', 'z', 'l'}
+
+
+

Similarly to list comprehensions, set comprehensions +are also supported:

+
>>> a = {x for x in 'abracadabra' if x not in 'abc'}
+>>> a
+{'r', 'd'}
+
+
+
+
+

5.5. Dictionaries¶

+

Another useful data type built into Python is the dictionary (see +Mapping Types — dict). Dictionaries are sometimes found in other languages as +“associative memories†or “associative arraysâ€. Unlike sequences, which are +indexed by a range of numbers, dictionaries are indexed by keys, which can be +any immutable type; strings and numbers can always be keys. Tuples can be used +as keys if they contain only strings, numbers, or tuples; if a tuple contains +any mutable object either directly or indirectly, it cannot be used as a key. +You can’t use lists as keys, since lists can be modified in place using index +assignments, slice assignments, or methods like append() and +extend().

+

It is best to think of a dictionary as a set of key: value pairs, +with the requirement that the keys are unique (within one dictionary). A pair of +braces creates an empty dictionary: {}. Placing a comma-separated list of +key:value pairs within the braces adds initial key:value pairs to the +dictionary; this is also the way dictionaries are written on output.

+

The main operations on a dictionary are storing a value with some key and +extracting the value given the key. It is also possible to delete a key:value +pair with del. If you store using a key that is already in use, the old +value associated with that key is forgotten. It is an error to extract a value +using a non-existent key.

+

Performing list(d) on a dictionary returns a list of all the keys +used in the dictionary, in insertion order (if you want it sorted, just use +sorted(d) instead). To check whether a single key is in the +dictionary, use the in keyword.

+

Here is a small example using a dictionary:

+
>>> tel = {'jack': 4098, 'sape': 4139}
+>>> tel['guido'] = 4127
+>>> tel
+{'jack': 4098, 'sape': 4139, 'guido': 4127}
+>>> tel['jack']
+4098
+>>> del tel['sape']
+>>> tel['irv'] = 4127
+>>> tel
+{'jack': 4098, 'guido': 4127, 'irv': 4127}
+>>> list(tel)
+['jack', 'guido', 'irv']
+>>> sorted(tel)
+['guido', 'irv', 'jack']
+>>> 'guido' in tel
+True
+>>> 'jack' not in tel
+False
+
+
+

The dict() constructor builds dictionaries directly from sequences of +key-value pairs:

+
>>> dict([('sape', 4139), ('guido', 4127), ('jack', 4098)])
+{'sape': 4139, 'guido': 4127, 'jack': 4098}
+
+
+

In addition, dict comprehensions can be used to create dictionaries from +arbitrary key and value expressions:

+
>>> {x: x**2 for x in (2, 4, 6)}
+{2: 4, 4: 16, 6: 36}
+
+
+

When the keys are simple strings, it is sometimes easier to specify pairs using +keyword arguments:

+
>>> dict(sape=4139, guido=4127, jack=4098)
+{'sape': 4139, 'guido': 4127, 'jack': 4098}
+
+
+
+
+

5.6. Looping Techniques¶

+

When looping through dictionaries, the key and corresponding value can be +retrieved at the same time using the items() method.

+
>>> knights = {'gallahad': 'the pure', 'robin': 'the brave'}
+>>> for k, v in knights.items():
+...     print(k, v)
+...
+gallahad the pure
+robin the brave
+
+
+

When looping through a sequence, the position index and corresponding value can +be retrieved at the same time using the enumerate() function.

+
>>> for i, v in enumerate(['tic', 'tac', 'toe']):
+...     print(i, v)
+...
+0 tic
+1 tac
+2 toe
+
+
+

To loop over two or more sequences at the same time, the entries can be paired +with the zip() function.

+
>>> questions = ['name', 'quest', 'favorite color']
+>>> answers = ['lancelot', 'the holy grail', 'blue']
+>>> for q, a in zip(questions, answers):
+...     print('What is your {0}?  It is {1}.'.format(q, a))
+...
+What is your name?  It is lancelot.
+What is your quest?  It is the holy grail.
+What is your favorite color?  It is blue.
+
+
+

To loop over a sequence in reverse, first specify the sequence in a forward +direction and then call the reversed() function.

+
>>> for i in reversed(range(1, 10, 2)):
+...     print(i)
+...
+9
+7
+5
+3
+1
+
+
+

To loop over a sequence in sorted order, use the sorted() function which +returns a new sorted list while leaving the source unaltered.

+
>>> basket = ['apple', 'orange', 'apple', 'pear', 'orange', 'banana']
+>>> for i in sorted(basket):
+...     print(i)
+...
+apple
+apple
+banana
+orange
+orange
+pear
+
+
+

Using set() on a sequence eliminates duplicate elements. The use of +sorted() in combination with set() over a sequence is an idiomatic +way to loop over unique elements of the sequence in sorted order.

+
>>> basket = ['apple', 'orange', 'apple', 'pear', 'orange', 'banana']
+>>> for f in sorted(set(basket)):
+...     print(f)
+...
+apple
+banana
+orange
+pear
+
+
+

It is sometimes tempting to change a list while you are looping over it; +however, it is often simpler and safer to create a new list instead.

+
>>> import math
+>>> raw_data = [56.2, float('NaN'), 51.7, 55.3, 52.5, float('NaN'), 47.8]
+>>> filtered_data = []
+>>> for value in raw_data:
+...     if not math.isnan(value):
+...         filtered_data.append(value)
+...
+>>> filtered_data
+[56.2, 51.7, 55.3, 52.5, 47.8]
+
+
+
+
+

5.7. More on Conditions¶

+

The conditions used in while and if statements can contain any +operators, not just comparisons.

+

The comparison operators in and not in check whether a value occurs +(does not occur) in a sequence. The operators is and is not compare +whether two objects are really the same object. All comparison operators have +the same priority, which is lower than that of all numerical operators.

+

Comparisons can be chained. For example, a < b == c tests whether a is +less than b and moreover b equals c.

+

Comparisons may be combined using the Boolean operators and and or, and +the outcome of a comparison (or of any other Boolean expression) may be negated +with not. These have lower priorities than comparison operators; between +them, not has the highest priority and or the lowest, so that A and +not B or C is equivalent to (A and (not B)) or C. As always, parentheses +can be used to express the desired composition.

+

The Boolean operators and and or are so-called short-circuit +operators: their arguments are evaluated from left to right, and evaluation +stops as soon as the outcome is determined. For example, if A and C are +true but B is false, A and B and C does not evaluate the expression +C. When used as a general value and not as a Boolean, the return value of a +short-circuit operator is the last evaluated argument.

+

It is possible to assign the result of a comparison or other Boolean expression +to a variable. For example,

+
>>> string1, string2, string3 = '', 'Trondheim', 'Hammer Dance'
+>>> non_null = string1 or string2 or string3
+>>> non_null
+'Trondheim'
+
+
+

Note that in Python, unlike C, assignment inside expressions must be done +explicitly with the +walrus operator :=. +This avoids a common class of problems encountered in C programs: typing = +in an expression when == was intended.

+
+
+

5.8. Comparing Sequences and Other Types¶

+

Sequence objects typically may be compared to other objects with the same sequence +type. The comparison uses lexicographical ordering: first the first two +items are compared, and if they differ this determines the outcome of the +comparison; if they are equal, the next two items are compared, and so on, until +either sequence is exhausted. If two items to be compared are themselves +sequences of the same type, the lexicographical comparison is carried out +recursively. If all items of two sequences compare equal, the sequences are +considered equal. If one sequence is an initial sub-sequence of the other, the +shorter sequence is the smaller (lesser) one. Lexicographical ordering for +strings uses the Unicode code point number to order individual characters. +Some examples of comparisons between sequences of the same type:

+
(1, 2, 3)              < (1, 2, 4)
+[1, 2, 3]              < [1, 2, 4]
+'ABC' < 'C' < 'Pascal' < 'Python'
+(1, 2, 3, 4)           < (1, 2, 4)
+(1, 2)                 < (1, 2, -1)
+(1, 2, 3)             == (1.0, 2.0, 3.0)
+(1, 2, ('aa', 'ab'))   < (1, 2, ('abc', 'a'), 4)
+
+
+

Note that comparing objects of different types with < or > is legal +provided that the objects have appropriate comparison methods. For example, +mixed numeric types are compared according to their numeric value, so 0 equals +0.0, etc. Otherwise, rather than providing an arbitrary ordering, the +interpreter will raise a TypeError exception.

+

Footnotes

+
+
1
+

Other languages may return the mutated object, which allows method +chaining, such as d->insert("a")->remove("b")->sort();.

+
+
+
+
+ + +
+
+
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/DOCS/tutorial/directory.html b/DOCS/tutorial/directory.html new file mode 100644 index 00000000..7bbd7e2a --- /dev/null +++ b/DOCS/tutorial/directory.html @@ -0,0 +1,11 @@ + + + +Site Navigation + + + + + + + \ No newline at end of file diff --git a/DOCS/tutorial/errors.html b/DOCS/tutorial/errors.html new file mode 100644 index 00000000..7bcb8ed3 --- /dev/null +++ b/DOCS/tutorial/errors.html @@ -0,0 +1,654 @@ + + + + + + + + + 8. Errors and Exceptions — Python 3.9.5 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ +
+

8. Errors and Exceptions¶

+

Until now error messages haven’t been more than mentioned, but if you have tried +out the examples you have probably seen some. There are (at least) two +distinguishable kinds of errors: syntax errors and exceptions.

+
+

8.1. Syntax Errors¶

+

Syntax errors, also known as parsing errors, are perhaps the most common kind of +complaint you get while you are still learning Python:

+
>>> while True print('Hello world')
+  File "<stdin>", line 1
+    while True print('Hello world')
+                   ^
+SyntaxError: invalid syntax
+
+
+

The parser repeats the offending line and displays a little ‘arrow’ pointing at +the earliest point in the line where the error was detected. The error is +caused by (or at least detected at) the token preceding the arrow: in the +example, the error is detected at the function print(), since a colon +(':') is missing before it. File name and line number are printed so you +know where to look in case the input came from a script.

+
+
+

8.2. Exceptions¶

+

Even if a statement or expression is syntactically correct, it may cause an +error when an attempt is made to execute it. Errors detected during execution +are called exceptions and are not unconditionally fatal: you will soon learn +how to handle them in Python programs. Most exceptions are not handled by +programs, however, and result in error messages as shown here:

+
>>> 10 * (1/0)
+Traceback (most recent call last):
+  File "<stdin>", line 1, in <module>
+ZeroDivisionError: division by zero
+>>> 4 + spam*3
+Traceback (most recent call last):
+  File "<stdin>", line 1, in <module>
+NameError: name 'spam' is not defined
+>>> '2' + 2
+Traceback (most recent call last):
+  File "<stdin>", line 1, in <module>
+TypeError: Can't convert 'int' object to str implicitly
+
+
+

The last line of the error message indicates what happened. Exceptions come in +different types, and the type is printed as part of the message: the types in +the example are ZeroDivisionError, NameError and TypeError. +The string printed as the exception type is the name of the built-in exception +that occurred. This is true for all built-in exceptions, but need not be true +for user-defined exceptions (although it is a useful convention). Standard +exception names are built-in identifiers (not reserved keywords).

+

The rest of the line provides detail based on the type of exception and what +caused it.

+

The preceding part of the error message shows the context where the exception +occurred, in the form of a stack traceback. In general it contains a stack +traceback listing source lines; however, it will not display lines read from +standard input.

+

Built-in Exceptions lists the built-in exceptions and their meanings.

+
+
+

8.3. Handling Exceptions¶

+

It is possible to write programs that handle selected exceptions. Look at the +following example, which asks the user for input until a valid integer has been +entered, but allows the user to interrupt the program (using Control-C or +whatever the operating system supports); note that a user-generated interruption +is signalled by raising the KeyboardInterrupt exception.

+
>>> while True:
+...     try:
+...         x = int(input("Please enter a number: "))
+...         break
+...     except ValueError:
+...         print("Oops!  That was no valid number.  Try again...")
+...
+
+
+

The try statement works as follows.

+
    +
  • First, the try clause (the statement(s) between the try and +except keywords) is executed.

  • +
  • If no exception occurs, the except clause is skipped and execution of the +try statement is finished.

  • +
  • If an exception occurs during execution of the try clause, the rest of the +clause is skipped. Then if its type matches the exception named after the +except keyword, the except clause is executed, and then execution +continues after the try statement.

  • +
  • If an exception occurs which does not match the exception named in the except +clause, it is passed on to outer try statements; if no handler is +found, it is an unhandled exception and execution stops with a message as +shown above.

  • +
+

A try statement may have more than one except clause, to specify +handlers for different exceptions. At most one handler will be executed. +Handlers only handle exceptions that occur in the corresponding try clause, not +in other handlers of the same try statement. An except clause may +name multiple exceptions as a parenthesized tuple, for example:

+
... except (RuntimeError, TypeError, NameError):
+...     pass
+
+
+

A class in an except clause is compatible with an exception if it is +the same class or a base class thereof (but not the other way around — an +except clause listing a derived class is not compatible with a base class). For +example, the following code will print B, C, D in that order:

+
class B(Exception):
+    pass
+
+class C(B):
+    pass
+
+class D(C):
+    pass
+
+for cls in [B, C, D]:
+    try:
+        raise cls()
+    except D:
+        print("D")
+    except C:
+        print("C")
+    except B:
+        print("B")
+
+
+

Note that if the except clauses were reversed (with except B first), it +would have printed B, B, B — the first matching except clause is triggered.

+

The last except clause may omit the exception name(s), to serve as a wildcard. +Use this with extreme caution, since it is easy to mask a real programming error +in this way! It can also be used to print an error message and then re-raise +the exception (allowing a caller to handle the exception as well):

+
import sys
+
+try:
+    f = open('myfile.txt')
+    s = f.readline()
+    i = int(s.strip())
+except OSError as err:
+    print("OS error: {0}".format(err))
+except ValueError:
+    print("Could not convert data to an integer.")
+except:
+    print("Unexpected error:", sys.exc_info()[0])
+    raise
+
+
+

The try … except statement has an optional else +clause, which, when present, must follow all except clauses. It is useful for +code that must be executed if the try clause does not raise an exception. For +example:

+
for arg in sys.argv[1:]:
+    try:
+        f = open(arg, 'r')
+    except OSError:
+        print('cannot open', arg)
+    else:
+        print(arg, 'has', len(f.readlines()), 'lines')
+        f.close()
+
+
+

The use of the else clause is better than adding additional code to +the try clause because it avoids accidentally catching an exception +that wasn’t raised by the code being protected by the try … +except statement.

+

When an exception occurs, it may have an associated value, also known as the +exception’s argument. The presence and type of the argument depend on the +exception type.

+

The except clause may specify a variable after the exception name. The +variable is bound to an exception instance with the arguments stored in +instance.args. For convenience, the exception instance defines +__str__() so the arguments can be printed directly without having to +reference .args. One may also instantiate an exception first before +raising it and add any attributes to it as desired.

+
>>> try:
+...     raise Exception('spam', 'eggs')
+... except Exception as inst:
+...     print(type(inst))    # the exception instance
+...     print(inst.args)     # arguments stored in .args
+...     print(inst)          # __str__ allows args to be printed directly,
+...                          # but may be overridden in exception subclasses
+...     x, y = inst.args     # unpack args
+...     print('x =', x)
+...     print('y =', y)
+...
+<class 'Exception'>
+('spam', 'eggs')
+('spam', 'eggs')
+x = spam
+y = eggs
+
+
+

If an exception has arguments, they are printed as the last part (‘detail’) of +the message for unhandled exceptions.

+

Exception handlers don’t just handle exceptions if they occur immediately in the +try clause, but also if they occur inside functions that are called (even +indirectly) in the try clause. For example:

+
>>> def this_fails():
+...     x = 1/0
+...
+>>> try:
+...     this_fails()
+... except ZeroDivisionError as err:
+...     print('Handling run-time error:', err)
+...
+Handling run-time error: division by zero
+
+
+
+
+

8.4. Raising Exceptions¶

+

The raise statement allows the programmer to force a specified +exception to occur. For example:

+
>>> raise NameError('HiThere')
+Traceback (most recent call last):
+  File "<stdin>", line 1, in <module>
+NameError: HiThere
+
+
+

The sole argument to raise indicates the exception to be raised. +This must be either an exception instance or an exception class (a class that +derives from Exception). If an exception class is passed, it will +be implicitly instantiated by calling its constructor with no arguments:

+
raise ValueError  # shorthand for 'raise ValueError()'
+
+
+

If you need to determine whether an exception was raised but don’t intend to +handle it, a simpler form of the raise statement allows you to +re-raise the exception:

+
>>> try:
+...     raise NameError('HiThere')
+... except NameError:
+...     print('An exception flew by!')
+...     raise
+...
+An exception flew by!
+Traceback (most recent call last):
+  File "<stdin>", line 2, in <module>
+NameError: HiThere
+
+
+
+
+

8.5. Exception Chaining¶

+

The raise statement allows an optional from which enables +chaining exceptions. For example:

+
# exc must be exception instance or None.
+raise RuntimeError from exc
+
+
+

This can be useful when you are transforming exceptions. For example:

+
>>> def func():
+...     raise IOError
+...
+>>> try:
+...     func()
+... except IOError as exc:
+...     raise RuntimeError('Failed to open database') from exc
+...
+Traceback (most recent call last):
+  File "<stdin>", line 2, in <module>
+  File "<stdin>", line 2, in func
+OSError
+
+The above exception was the direct cause of the following exception:
+
+Traceback (most recent call last):
+  File "<stdin>", line 4, in <module>
+RuntimeError: Failed to open database
+
+
+

Exception chaining happens automatically when an exception is raised inside an +except or finally section. Exception chaining can be +disabled by using from None idiom:

+
>>> try:
+...     open('database.sqlite')
+... except OSError:
+...     raise RuntimeError from None
+...
+Traceback (most recent call last):
+  File "<stdin>", line 4, in <module>
+RuntimeError
+
+
+

For more information about chaining mechanics, see Built-in Exceptions.

+
+
+

8.6. User-defined Exceptions¶

+

Programs may name their own exceptions by creating a new exception class (see +Classes for more about Python classes). Exceptions should typically +be derived from the Exception class, either directly or indirectly.

+

Exception classes can be defined which do anything any other class can do, but +are usually kept simple, often only offering a number of attributes that allow +information about the error to be extracted by handlers for the exception. When +creating a module that can raise several distinct errors, a common practice is +to create a base class for exceptions defined by that module, and subclass that +to create specific exception classes for different error conditions:

+
class Error(Exception):
+    """Base class for exceptions in this module."""
+    pass
+
+class InputError(Error):
+    """Exception raised for errors in the input.
+
+    Attributes:
+        expression -- input expression in which the error occurred
+        message -- explanation of the error
+    """
+
+    def __init__(self, expression, message):
+        self.expression = expression
+        self.message = message
+
+class TransitionError(Error):
+    """Raised when an operation attempts a state transition that's not
+    allowed.
+
+    Attributes:
+        previous -- state at beginning of transition
+        next -- attempted new state
+        message -- explanation of why the specific transition is not allowed
+    """
+
+    def __init__(self, previous, next, message):
+        self.previous = previous
+        self.next = next
+        self.message = message
+
+
+

Most exceptions are defined with names that end in “Errorâ€, similar to the +naming of the standard exceptions.

+

Many standard modules define their own exceptions to report errors that may +occur in functions they define. More information on classes is presented in +chapter Classes.

+
+
+

8.7. Defining Clean-up Actions¶

+

The try statement has another optional clause which is intended to +define clean-up actions that must be executed under all circumstances. For +example:

+
>>> try:
+...     raise KeyboardInterrupt
+... finally:
+...     print('Goodbye, world!')
+...
+Goodbye, world!
+KeyboardInterrupt
+Traceback (most recent call last):
+  File "<stdin>", line 2, in <module>
+
+
+

If a finally clause is present, the finally +clause will execute as the last task before the try +statement completes. The finally clause runs whether or +not the try statement produces an exception. The following +points discuss more complex cases when an exception occurs:

+
    +
  • If an exception occurs during execution of the try +clause, the exception may be handled by an except +clause. If the exception is not handled by an except +clause, the exception is re-raised after the finally +clause has been executed.

  • +
  • An exception could occur during execution of an except +or else clause. Again, the exception is re-raised after +the finally clause has been executed.

  • +
  • If the finally clause executes a break, +continue or return statement, exceptions are not +re-raised.

  • +
  • If the try statement reaches a break, +continue or return statement, the +finally clause will execute just prior to the +break, continue or return +statement’s execution.

  • +
  • If a finally clause includes a return +statement, the returned value will be the one from the +finally clause’s return statement, not the +value from the try clause’s return +statement.

  • +
+

For example:

+
>>> def bool_return():
+...     try:
+...         return True
+...     finally:
+...         return False
+...
+>>> bool_return()
+False
+
+
+

A more complicated example:

+
>>> def divide(x, y):
+...     try:
+...         result = x / y
+...     except ZeroDivisionError:
+...         print("division by zero!")
+...     else:
+...         print("result is", result)
+...     finally:
+...         print("executing finally clause")
+...
+>>> divide(2, 1)
+result is 2.0
+executing finally clause
+>>> divide(2, 0)
+division by zero!
+executing finally clause
+>>> divide("2", "1")
+executing finally clause
+Traceback (most recent call last):
+  File "<stdin>", line 1, in <module>
+  File "<stdin>", line 3, in divide
+TypeError: unsupported operand type(s) for /: 'str' and 'str'
+
+
+

As you can see, the finally clause is executed in any event. The +TypeError raised by dividing two strings is not handled by the +except clause and therefore re-raised after the finally +clause has been executed.

+

In real world applications, the finally clause is useful for +releasing external resources (such as files or network connections), regardless +of whether the use of the resource was successful.

+
+
+

8.8. Predefined Clean-up Actions¶

+

Some objects define standard clean-up actions to be undertaken when the object +is no longer needed, regardless of whether or not the operation using the object +succeeded or failed. Look at the following example, which tries to open a file +and print its contents to the screen.

+
for line in open("myfile.txt"):
+    print(line, end="")
+
+
+

The problem with this code is that it leaves the file open for an indeterminate +amount of time after this part of the code has finished executing. +This is not an issue in simple scripts, but can be a problem for larger +applications. The with statement allows objects like files to be +used in a way that ensures they are always cleaned up promptly and correctly.

+
with open("myfile.txt") as f:
+    for line in f:
+        print(line, end="")
+
+
+

After the statement is executed, the file f is always closed, even if a +problem was encountered while processing the lines. Objects which, like files, +provide predefined clean-up actions will indicate this in their documentation.

+
+
+ + +
+
+
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/DOCS/tutorial/floatingpoint.html b/DOCS/tutorial/floatingpoint.html new file mode 100644 index 00000000..3580df22 --- /dev/null +++ b/DOCS/tutorial/floatingpoint.html @@ -0,0 +1,471 @@ + + + + + + + + + 15. Floating Point Arithmetic: Issues and Limitations — Python 3.9.5 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ +
+

15. Floating Point Arithmetic: Issues and Limitations¶

+

Floating-point numbers are represented in computer hardware as base 2 (binary) +fractions. For example, the decimal fraction

+
0.125
+
+
+

has value 1/10 + 2/100 + 5/1000, and in the same way the binary fraction

+
0.001
+
+
+

has value 0/2 + 0/4 + 1/8. These two fractions have identical values, the only +real difference being that the first is written in base 10 fractional notation, +and the second in base 2.

+

Unfortunately, most decimal fractions cannot be represented exactly as binary +fractions. A consequence is that, in general, the decimal floating-point +numbers you enter are only approximated by the binary floating-point numbers +actually stored in the machine.

+

The problem is easier to understand at first in base 10. Consider the fraction +1/3. You can approximate that as a base 10 fraction:

+
0.3
+
+
+

or, better,

+
0.33
+
+
+

or, better,

+
0.333
+
+
+

and so on. No matter how many digits you’re willing to write down, the result +will never be exactly 1/3, but will be an increasingly better approximation of +1/3.

+

In the same way, no matter how many base 2 digits you’re willing to use, the +decimal value 0.1 cannot be represented exactly as a base 2 fraction. In base +2, 1/10 is the infinitely repeating fraction

+
0.0001100110011001100110011001100110011001100110011...
+
+
+

Stop at any finite number of bits, and you get an approximation. On most +machines today, floats are approximated using a binary fraction with +the numerator using the first 53 bits starting with the most significant bit and +with the denominator as a power of two. In the case of 1/10, the binary fraction +is 3602879701896397 / 2 ** 55 which is close to but not exactly +equal to the true value of 1/10.

+

Many users are not aware of the approximation because of the way values are +displayed. Python only prints a decimal approximation to the true decimal +value of the binary approximation stored by the machine. On most machines, if +Python were to print the true decimal value of the binary approximation stored +for 0.1, it would have to display

+
>>> 0.1
+0.1000000000000000055511151231257827021181583404541015625
+
+
+

That is more digits than most people find useful, so Python keeps the number +of digits manageable by displaying a rounded value instead

+
>>> 1 / 10
+0.1
+
+
+

Just remember, even though the printed result looks like the exact value +of 1/10, the actual stored value is the nearest representable binary fraction.

+

Interestingly, there are many different decimal numbers that share the same +nearest approximate binary fraction. For example, the numbers 0.1 and +0.10000000000000001 and +0.1000000000000000055511151231257827021181583404541015625 are all +approximated by 3602879701896397 / 2 ** 55. Since all of these decimal +values share the same approximation, any one of them could be displayed +while still preserving the invariant eval(repr(x)) == x.

+

Historically, the Python prompt and built-in repr() function would choose +the one with 17 significant digits, 0.10000000000000001. Starting with +Python 3.1, Python (on most systems) is now able to choose the shortest of +these and simply display 0.1.

+

Note that this is in the very nature of binary floating-point: this is not a bug +in Python, and it is not a bug in your code either. You’ll see the same kind of +thing in all languages that support your hardware’s floating-point arithmetic +(although some languages may not display the difference by default, or in all +output modes).

+

For more pleasant output, you may wish to use string formatting to produce a limited number of significant digits:

+
>>> format(math.pi, '.12g')  # give 12 significant digits
+'3.14159265359'
+
+>>> format(math.pi, '.2f')   # give 2 digits after the point
+'3.14'
+
+>>> repr(math.pi)
+'3.141592653589793'
+
+
+

It’s important to realize that this is, in a real sense, an illusion: you’re +simply rounding the display of the true machine value.

+

One illusion may beget another. For example, since 0.1 is not exactly 1/10, +summing three values of 0.1 may not yield exactly 0.3, either:

+
>>> .1 + .1 + .1 == .3
+False
+
+
+

Also, since the 0.1 cannot get any closer to the exact value of 1/10 and +0.3 cannot get any closer to the exact value of 3/10, then pre-rounding with +round() function cannot help:

+
>>> round(.1, 1) + round(.1, 1) + round(.1, 1) == round(.3, 1)
+False
+
+
+

Though the numbers cannot be made closer to their intended exact values, +the round() function can be useful for post-rounding so that results +with inexact values become comparable to one another:

+
>>> round(.1 + .1 + .1, 10) == round(.3, 10)
+True
+
+
+

Binary floating-point arithmetic holds many surprises like this. The problem +with “0.1†is explained in precise detail below, in the “Representation Error†+section. See The Perils of Floating Point +for a more complete account of other common surprises.

+

As that says near the end, “there are no easy answers.†Still, don’t be unduly +wary of floating-point! The errors in Python float operations are inherited +from the floating-point hardware, and on most machines are on the order of no +more than 1 part in 2**53 per operation. That’s more than adequate for most +tasks, but you do need to keep in mind that it’s not decimal arithmetic and +that every float operation can suffer a new rounding error.

+

While pathological cases do exist, for most casual use of floating-point +arithmetic you’ll see the result you expect in the end if you simply round the +display of your final results to the number of decimal digits you expect. +str() usually suffices, and for finer control see the str.format() +method’s format specifiers in Format String Syntax.

+

For use cases which require exact decimal representation, try using the +decimal module which implements decimal arithmetic suitable for +accounting applications and high-precision applications.

+

Another form of exact arithmetic is supported by the fractions module +which implements arithmetic based on rational numbers (so the numbers like +1/3 can be represented exactly).

+

If you are a heavy user of floating point operations you should take a look +at the Numerical Python package and many other packages for mathematical and +statistical operations supplied by the SciPy project. See <https://scipy.org>.

+

Python provides tools that may help on those rare occasions when you really +do want to know the exact value of a float. The +float.as_integer_ratio() method expresses the value of a float as a +fraction:

+
>>> x = 3.14159
+>>> x.as_integer_ratio()
+(3537115888337719, 1125899906842624)
+
+
+

Since the ratio is exact, it can be used to losslessly recreate the +original value:

+
>>> x == 3537115888337719 / 1125899906842624
+True
+
+
+

The float.hex() method expresses a float in hexadecimal (base +16), again giving the exact value stored by your computer:

+
>>> x.hex()
+'0x1.921f9f01b866ep+1'
+
+
+

This precise hexadecimal representation can be used to reconstruct +the float value exactly:

+
>>> x == float.fromhex('0x1.921f9f01b866ep+1')
+True
+
+
+

Since the representation is exact, it is useful for reliably porting values +across different versions of Python (platform independence) and exchanging +data with other languages that support the same format (such as Java and C99).

+

Another helpful tool is the math.fsum() function which helps mitigate +loss-of-precision during summation. It tracks “lost digits†as values are +added onto a running total. That can make a difference in overall accuracy +so that the errors do not accumulate to the point where they affect the +final total:

+
>>> sum([0.1] * 10) == 1.0
+False
+>>> math.fsum([0.1] * 10) == 1.0
+True
+
+
+
+

15.1. Representation Error¶

+

This section explains the “0.1†example in detail, and shows how you can perform +an exact analysis of cases like this yourself. Basic familiarity with binary +floating-point representation is assumed.

+

Representation error refers to the fact that some (most, actually) +decimal fractions cannot be represented exactly as binary (base 2) fractions. +This is the chief reason why Python (or Perl, C, C++, Java, Fortran, and many +others) often won’t display the exact decimal number you expect.

+

Why is that? 1/10 is not exactly representable as a binary fraction. Almost all +machines today (November 2000) use IEEE-754 floating point arithmetic, and +almost all platforms map Python floats to IEEE-754 “double precisionâ€. 754 +doubles contain 53 bits of precision, so on input the computer strives to +convert 0.1 to the closest fraction it can of the form J/2**N where J is +an integer containing exactly 53 bits. Rewriting

+
1 / 10 ~= J / (2**N)
+
+
+

as

+
J ~= 2**N / 10
+
+
+

and recalling that J has exactly 53 bits (is >= 2**52 but < 2**53), +the best value for N is 56:

+
>>> 2**52 <=  2**56 // 10  < 2**53
+True
+
+
+

That is, 56 is the only value for N that leaves J with exactly 53 bits. The +best possible value for J is then that quotient rounded:

+
>>> q, r = divmod(2**56, 10)
+>>> r
+6
+
+
+

Since the remainder is more than half of 10, the best approximation is obtained +by rounding up:

+
>>> q+1
+7205759403792794
+
+
+

Therefore the best possible approximation to 1/10 in 754 double precision is:

+
7205759403792794 / 2 ** 56
+
+
+

Dividing both the numerator and denominator by two reduces the fraction to:

+
3602879701896397 / 2 ** 55
+
+
+

Note that since we rounded up, this is actually a little bit larger than 1/10; +if we had not rounded up, the quotient would have been a little bit smaller than +1/10. But in no case can it be exactly 1/10!

+

So the computer never “sees†1/10: what it sees is the exact fraction given +above, the best 754 double approximation it can get:

+
>>> 0.1 * 2 ** 55
+3602879701896397.0
+
+
+

If we multiply that fraction by 10**55, we can see the value out to +55 decimal digits:

+
>>> 3602879701896397 * 10 ** 55 // 2 ** 55
+1000000000000000055511151231257827021181583404541015625
+
+
+

meaning that the exact number stored in the computer is equal to +the decimal value 0.1000000000000000055511151231257827021181583404541015625. +Instead of displaying the full decimal value, many languages (including +older versions of Python), round the result to 17 significant digits:

+
>>> format(0.1, '.17f')
+'0.10000000000000001'
+
+
+

The fractions and decimal modules make these calculations +easy:

+
>>> from decimal import Decimal
+>>> from fractions import Fraction
+
+>>> Fraction.from_float(0.1)
+Fraction(3602879701896397, 36028797018963968)
+
+>>> (0.1).as_integer_ratio()
+(3602879701896397, 36028797018963968)
+
+>>> Decimal.from_float(0.1)
+Decimal('0.1000000000000000055511151231257827021181583404541015625')
+
+>>> format(Decimal.from_float(0.1), '.17')
+'0.10000000000000001'
+
+
+
+
+ + +
+
+
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/DOCS/tutorial/index.html b/DOCS/tutorial/index.html new file mode 100644 index 00000000..f2c15951 --- /dev/null +++ b/DOCS/tutorial/index.html @@ -0,0 +1,419 @@ + + + + + + + + + The Python Tutorial — Python 3.9.5 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ +
+

The Python Tutorial¶

+

Python is an easy to learn, powerful programming language. It has efficient +high-level data structures and a simple but effective approach to +object-oriented programming. Python’s elegant syntax and dynamic typing, +together with its interpreted nature, make it an ideal language for scripting +and rapid application development in many areas on most platforms.

+

The Python interpreter and the extensive standard library are freely available +in source or binary form for all major platforms from the Python Web site, +https://www.python.org/, and may be freely distributed. The same site also +contains distributions of and pointers to many free third party Python modules, +programs and tools, and additional documentation.

+

The Python interpreter is easily extended with new functions and data types +implemented in C or C++ (or other languages callable from C). Python is also +suitable as an extension language for customizable applications.

+

This tutorial introduces the reader informally to the basic concepts and +features of the Python language and system. It helps to have a Python +interpreter handy for hands-on experience, but all examples are self-contained, +so the tutorial can be read off-line as well.

+

For a description of standard objects and modules, see The Python Standard Library. +The Python Language Reference gives a more formal definition of the language. To write +extensions in C or C++, read Extending and Embedding the Python Interpreter and +Python/C API Reference Manual. There are also several books covering Python in depth.

+

This tutorial does not attempt to be comprehensive and cover every single +feature, or even every commonly used feature. Instead, it introduces many of +Python’s most noteworthy features, and will give you a good idea of the +language’s flavor and style. After reading it, you will be able to read and +write Python modules and programs, and you will be ready to learn more about the +various Python library modules described in The Python Standard Library.

+

The Glossary is also worth going through.

+
+ +
+
+ + +
+
+
+ +
+
+ + + + + + + + diff --git a/DOCS/tutorial/inputoutput.html b/DOCS/tutorial/inputoutput.html new file mode 100644 index 00000000..b967cd85 --- /dev/null +++ b/DOCS/tutorial/inputoutput.html @@ -0,0 +1,661 @@ + + + + + + + + + 7. Input and Output — Python 3.9.5 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ +
+

7. Input and Output¶

+

There are several ways to present the output of a program; data can be printed +in a human-readable form, or written to a file for future use. This chapter will +discuss some of the possibilities.

+
+

7.1. Fancier Output Formatting¶

+

So far we’ve encountered two ways of writing values: expression statements and +the print() function. (A third way is using the write() method +of file objects; the standard output file can be referenced as sys.stdout. +See the Library Reference for more information on this.)

+

Often you’ll want more control over the formatting of your output than simply +printing space-separated values. There are several ways to format output.

+
    +
  • To use formatted string literals, begin a string +with f or F before the opening quotation mark or triple quotation mark. +Inside this string, you can write a Python expression between { and } +characters that can refer to variables or literal values.

    +
    >>> year = 2016
    +>>> event = 'Referendum'
    +>>> f'Results of the {year} {event}'
    +'Results of the 2016 Referendum'
    +
    +
    +
  • +
  • The str.format() method of strings requires more manual +effort. You’ll still use { and } to mark where a variable +will be substituted and can provide detailed formatting directives, +but you’ll also need to provide the information to be formatted.

    +
    >>> yes_votes = 42_572_654
    +>>> no_votes = 43_132_495
    +>>> percentage = yes_votes / (yes_votes + no_votes)
    +>>> '{:-9} YES votes  {:2.2%}'.format(yes_votes, percentage)
    +' 42572654 YES votes  49.67%'
    +
    +
    +
  • +
  • Finally, you can do all the string handling yourself by using string slicing and +concatenation operations to create any layout you can imagine. The +string type has some methods that perform useful operations for padding +strings to a given column width.

  • +
+

When you don’t need fancy output but just want a quick display of some +variables for debugging purposes, you can convert any value to a string with +the repr() or str() functions.

+

The str() function is meant to return representations of values which are +fairly human-readable, while repr() is meant to generate representations +which can be read by the interpreter (or will force a SyntaxError if +there is no equivalent syntax). For objects which don’t have a particular +representation for human consumption, str() will return the same value as +repr(). Many values, such as numbers or structures like lists and +dictionaries, have the same representation using either function. Strings, in +particular, have two distinct representations.

+

Some examples:

+
>>> s = 'Hello, world.'
+>>> str(s)
+'Hello, world.'
+>>> repr(s)
+"'Hello, world.'"
+>>> str(1/7)
+'0.14285714285714285'
+>>> x = 10 * 3.25
+>>> y = 200 * 200
+>>> s = 'The value of x is ' + repr(x) + ', and y is ' + repr(y) + '...'
+>>> print(s)
+The value of x is 32.5, and y is 40000...
+>>> # The repr() of a string adds string quotes and backslashes:
+... hello = 'hello, world\n'
+>>> hellos = repr(hello)
+>>> print(hellos)
+'hello, world\n'
+>>> # The argument to repr() may be any Python object:
+... repr((x, y, ('spam', 'eggs')))
+"(32.5, 40000, ('spam', 'eggs'))"
+
+
+

The string module contains a Template class that offers +yet another way to substitute values into strings, using placeholders like +$x and replacing them with values from a dictionary, but offers much less +control of the formatting.

+
+

7.1.1. Formatted String Literals¶

+

Formatted string literals (also called f-strings for +short) let you include the value of Python expressions inside a string by +prefixing the string with f or F and writing expressions as +{expression}.

+

An optional format specifier can follow the expression. This allows greater +control over how the value is formatted. The following example rounds pi to +three places after the decimal:

+
>>> import math
+>>> print(f'The value of pi is approximately {math.pi:.3f}.')
+The value of pi is approximately 3.142.
+
+
+

Passing an integer after the ':' will cause that field to be a minimum +number of characters wide. This is useful for making columns line up.

+
>>> table = {'Sjoerd': 4127, 'Jack': 4098, 'Dcab': 7678}
+>>> for name, phone in table.items():
+...     print(f'{name:10} ==> {phone:10d}')
+...
+Sjoerd     ==>       4127
+Jack       ==>       4098
+Dcab       ==>       7678
+
+
+

Other modifiers can be used to convert the value before it is formatted. +'!a' applies ascii(), '!s' applies str(), and '!r' +applies repr():

+
>>> animals = 'eels'
+>>> print(f'My hovercraft is full of {animals}.')
+My hovercraft is full of eels.
+>>> print(f'My hovercraft is full of {animals!r}.')
+My hovercraft is full of 'eels'.
+
+
+

For a reference on these format specifications, see +the reference guide for the Format Specification Mini-Language.

+
+
+

7.1.2. The String format() Method¶

+

Basic usage of the str.format() method looks like this:

+
>>> print('We are the {} who say "{}!"'.format('knights', 'Ni'))
+We are the knights who say "Ni!"
+
+
+

The brackets and characters within them (called format fields) are replaced with +the objects passed into the str.format() method. A number in the +brackets can be used to refer to the position of the object passed into the +str.format() method.

+
>>> print('{0} and {1}'.format('spam', 'eggs'))
+spam and eggs
+>>> print('{1} and {0}'.format('spam', 'eggs'))
+eggs and spam
+
+
+

If keyword arguments are used in the str.format() method, their values +are referred to by using the name of the argument.

+
>>> print('This {food} is {adjective}.'.format(
+...       food='spam', adjective='absolutely horrible'))
+This spam is absolutely horrible.
+
+
+

Positional and keyword arguments can be arbitrarily combined:

+
>>> print('The story of {0}, {1}, and {other}.'.format('Bill', 'Manfred',
+                                                       other='Georg'))
+The story of Bill, Manfred, and Georg.
+
+
+

If you have a really long format string that you don’t want to split up, it +would be nice if you could reference the variables to be formatted by name +instead of by position. This can be done by simply passing the dict and using +square brackets '[]' to access the keys.

+
>>> table = {'Sjoerd': 4127, 'Jack': 4098, 'Dcab': 8637678}
+>>> print('Jack: {0[Jack]:d}; Sjoerd: {0[Sjoerd]:d}; '
+...       'Dcab: {0[Dcab]:d}'.format(table))
+Jack: 4098; Sjoerd: 4127; Dcab: 8637678
+
+
+

This could also be done by passing the table as keyword arguments with the ‘**’ +notation.

+
>>> table = {'Sjoerd': 4127, 'Jack': 4098, 'Dcab': 8637678}
+>>> print('Jack: {Jack:d}; Sjoerd: {Sjoerd:d}; Dcab: {Dcab:d}'.format(**table))
+Jack: 4098; Sjoerd: 4127; Dcab: 8637678
+
+
+

This is particularly useful in combination with the built-in function +vars(), which returns a dictionary containing all local variables.

+

As an example, the following lines produce a tidily-aligned +set of columns giving integers and their squares and cubes:

+
>>> for x in range(1, 11):
+...     print('{0:2d} {1:3d} {2:4d}'.format(x, x*x, x*x*x))
+...
+ 1   1    1
+ 2   4    8
+ 3   9   27
+ 4  16   64
+ 5  25  125
+ 6  36  216
+ 7  49  343
+ 8  64  512
+ 9  81  729
+10 100 1000
+
+
+

For a complete overview of string formatting with str.format(), see +Format String Syntax.

+
+
+

7.1.3. Manual String Formatting¶

+

Here’s the same table of squares and cubes, formatted manually:

+
>>> for x in range(1, 11):
+...     print(repr(x).rjust(2), repr(x*x).rjust(3), end=' ')
+...     # Note use of 'end' on previous line
+...     print(repr(x*x*x).rjust(4))
+...
+ 1   1    1
+ 2   4    8
+ 3   9   27
+ 4  16   64
+ 5  25  125
+ 6  36  216
+ 7  49  343
+ 8  64  512
+ 9  81  729
+10 100 1000
+
+
+

(Note that the one space between each column was added by the +way print() works: it always adds spaces between its arguments.)

+

The str.rjust() method of string objects right-justifies a string in a +field of a given width by padding it with spaces on the left. There are +similar methods str.ljust() and str.center(). These methods do +not write anything, they just return a new string. If the input string is too +long, they don’t truncate it, but return it unchanged; this will mess up your +column lay-out but that’s usually better than the alternative, which would be +lying about a value. (If you really want truncation you can always add a +slice operation, as in x.ljust(n)[:n].)

+

There is another method, str.zfill(), which pads a numeric string on the +left with zeros. It understands about plus and minus signs:

+
>>> '12'.zfill(5)
+'00012'
+>>> '-3.14'.zfill(7)
+'-003.14'
+>>> '3.14159265359'.zfill(5)
+'3.14159265359'
+
+
+
+
+

7.1.4. Old string formatting¶

+

The % operator (modulo) can also be used for string formatting. Given 'string' +% values, instances of % in string are replaced with zero or more +elements of values. This operation is commonly known as string +interpolation. For example:

+
>>> import math
+>>> print('The value of pi is approximately %5.3f.' % math.pi)
+The value of pi is approximately 3.142.
+
+
+

More information can be found in the printf-style String Formatting section.

+
+
+
+

7.2. Reading and Writing Files¶

+

open() returns a file object, and is most commonly used with +two arguments: open(filename, mode).

+
>>> f = open('workfile', 'w')
+
+
+

The first argument is a string containing the filename. The second argument is +another string containing a few characters describing the way in which the file +will be used. mode can be 'r' when the file will only be read, 'w' +for only writing (an existing file with the same name will be erased), and +'a' opens the file for appending; any data written to the file is +automatically added to the end. 'r+' opens the file for both reading and +writing. The mode argument is optional; 'r' will be assumed if it’s +omitted.

+

Normally, files are opened in text mode, that means, you read and write +strings from and to the file, which are encoded in a specific encoding. If +encoding is not specified, the default is platform dependent (see +open()). 'b' appended to the mode opens the file in +binary mode: now the data is read and written in the form of bytes +objects. This mode should be used for all files that don’t contain text.

+

In text mode, the default when reading is to convert platform-specific line +endings (\n on Unix, \r\n on Windows) to just \n. When writing in +text mode, the default is to convert occurrences of \n back to +platform-specific line endings. This behind-the-scenes modification +to file data is fine for text files, but will corrupt binary data like that in +JPEG or EXE files. Be very careful to use binary mode when +reading and writing such files.

+

It is good practice to use the with keyword when dealing +with file objects. The advantage is that the file is properly closed +after its suite finishes, even if an exception is raised at some +point. Using with is also much shorter than writing +equivalent try-finally blocks:

+
>>> with open('workfile') as f:
+...     read_data = f.read()
+
+>>> # We can check that the file has been automatically closed.
+>>> f.closed
+True
+
+
+

If you’re not using the with keyword, then you should call +f.close() to close the file and immediately free up any system +resources used by it.

+
+

Warning

+

Calling f.write() without using the with keyword or calling +f.close() might result in the arguments +of f.write() not being completely written to the disk, even if the +program exits successfully.

+
+

After a file object is closed, either by a with statement +or by calling f.close(), attempts to use the file object will +automatically fail.

+
>>> f.close()
+>>> f.read()
+Traceback (most recent call last):
+  File "<stdin>", line 1, in <module>
+ValueError: I/O operation on closed file.
+
+
+
+

7.2.1. Methods of File Objects¶

+

The rest of the examples in this section will assume that a file object called +f has already been created.

+

To read a file’s contents, call f.read(size), which reads some quantity of +data and returns it as a string (in text mode) or bytes object (in binary mode). +size is an optional numeric argument. When size is omitted or negative, the +entire contents of the file will be read and returned; it’s your problem if the +file is twice as large as your machine’s memory. Otherwise, at most size +characters (in text mode) or size bytes (in binary mode) are read and returned. +If the end of the file has been reached, f.read() will return an empty +string ('').

+
>>> f.read()
+'This is the entire file.\n'
+>>> f.read()
+''
+
+
+

f.readline() reads a single line from the file; a newline character (\n) +is left at the end of the string, and is only omitted on the last line of the +file if the file doesn’t end in a newline. This makes the return value +unambiguous; if f.readline() returns an empty string, the end of the file +has been reached, while a blank line is represented by '\n', a string +containing only a single newline.

+
>>> f.readline()
+'This is the first line of the file.\n'
+>>> f.readline()
+'Second line of the file\n'
+>>> f.readline()
+''
+
+
+

For reading lines from a file, you can loop over the file object. This is memory +efficient, fast, and leads to simple code:

+
>>> for line in f:
+...     print(line, end='')
+...
+This is the first line of the file.
+Second line of the file
+
+
+

If you want to read all the lines of a file in a list you can also use +list(f) or f.readlines().

+

f.write(string) writes the contents of string to the file, returning +the number of characters written.

+
>>> f.write('This is a test\n')
+15
+
+
+

Other types of objects need to be converted – either to a string (in text mode) +or a bytes object (in binary mode) – before writing them:

+
>>> value = ('the answer', 42)
+>>> s = str(value)  # convert the tuple to string
+>>> f.write(s)
+18
+
+
+

f.tell() returns an integer giving the file object’s current position in the file +represented as number of bytes from the beginning of the file when in binary mode and +an opaque number when in text mode.

+

To change the file object’s position, use f.seek(offset, whence). The position is computed +from adding offset to a reference point; the reference point is selected by +the whence argument. A whence value of 0 measures from the beginning +of the file, 1 uses the current file position, and 2 uses the end of the file as +the reference point. whence can be omitted and defaults to 0, using the +beginning of the file as the reference point.

+
>>> f = open('workfile', 'rb+')
+>>> f.write(b'0123456789abcdef')
+16
+>>> f.seek(5)      # Go to the 6th byte in the file
+5
+>>> f.read(1)
+b'5'
+>>> f.seek(-3, 2)  # Go to the 3rd byte before the end
+13
+>>> f.read(1)
+b'd'
+
+
+

In text files (those opened without a b in the mode string), only seeks +relative to the beginning of the file are allowed (the exception being seeking +to the very file end with seek(0, 2)) and the only valid offset values are +those returned from the f.tell(), or zero. Any other offset value produces +undefined behaviour.

+

File objects have some additional methods, such as isatty() and +truncate() which are less frequently used; consult the Library +Reference for a complete guide to file objects.

+
+
+

7.2.2. Saving structured data with json¶

+

Strings can easily be written to and read from a file. Numbers take a bit more +effort, since the read() method only returns strings, which will have to +be passed to a function like int(), which takes a string like '123' +and returns its numeric value 123. When you want to save more complex data +types like nested lists and dictionaries, parsing and serializing by hand +becomes complicated.

+

Rather than having users constantly writing and debugging code to save +complicated data types to files, Python allows you to use the popular data +interchange format called JSON (JavaScript Object Notation). The standard module called json can take Python +data hierarchies, and convert them to string representations; this process is +called serializing. Reconstructing the data from the string representation +is called deserializing. Between serializing and deserializing, the +string representing the object may have been stored in a file or data, or +sent over a network connection to some distant machine.

+
+

Note

+

The JSON format is commonly used by modern applications to allow for data +exchange. Many programmers are already familiar with it, which makes +it a good choice for interoperability.

+
+

If you have an object x, you can view its JSON string representation with a +simple line of code:

+
>>> import json
+>>> x = [1, 'simple', 'list']
+>>> json.dumps(x)
+'[1, "simple", "list"]'
+
+
+

Another variant of the dumps() function, called dump(), +simply serializes the object to a text file. So if f is a +text file object opened for writing, we can do this:

+
json.dump(x, f)
+
+
+

To decode the object again, if f is a text file object which has +been opened for reading:

+
x = json.load(f)
+
+
+

This simple serialization technique can handle lists and dictionaries, but +serializing arbitrary class instances in JSON requires a bit of extra effort. +The reference for the json module contains an explanation of this.

+
+

See also

+

pickle - the pickle module

+

Contrary to JSON, pickle is a protocol which allows +the serialization of arbitrarily complex Python objects. As such, it is +specific to Python and cannot be used to communicate with applications +written in other languages. It is also insecure by default: +deserializing pickle data coming from an untrusted source can execute +arbitrary code, if the data was crafted by a skilled attacker.

+
+
+
+
+ + +
+
+
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/DOCS/tutorial/interactive.html b/DOCS/tutorial/interactive.html new file mode 100644 index 00000000..4bc896bb --- /dev/null +++ b/DOCS/tutorial/interactive.html @@ -0,0 +1,240 @@ + + + + + + + + + 14. Interactive Input Editing and History Substitution — Python 3.9.5 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ +
+

14. Interactive Input Editing and History Substitution¶

+

Some versions of the Python interpreter support editing of the current input +line and history substitution, similar to facilities found in the Korn shell and +the GNU Bash shell. This is implemented using the GNU Readline library, +which supports various styles of editing. This library has its own +documentation which we won’t duplicate here.

+
+

14.1. Tab Completion and History Editing¶

+

Completion of variable and module names is +automatically enabled at interpreter startup so +that the Tab key invokes the completion function; it looks at +Python statement names, the current local variables, and the available +module names. For dotted expressions such as string.a, it will evaluate +the expression up to the final '.' and then suggest completions from +the attributes of the resulting object. Note that this may execute +application-defined code if an object with a __getattr__() method +is part of the expression. The default configuration also saves your +history into a file named .python_history in your user directory. +The history will be available again during the next interactive interpreter +session.

+
+
+

14.2. Alternatives to the Interactive Interpreter¶

+

This facility is an enormous step forward compared to earlier versions of the +interpreter; however, some wishes are left: It would be nice if the proper +indentation were suggested on continuation lines (the parser knows if an indent +token is required next). The completion mechanism might use the interpreter’s +symbol table. A command to check (or even suggest) matching parentheses, +quotes, etc., would also be useful.

+

One alternative enhanced interactive interpreter that has been around for quite +some time is IPython, which features tab completion, object exploration and +advanced history management. It can also be thoroughly customized and embedded +into other applications. Another similar enhanced interactive environment is +bpython.

+
+
+ + +
+
+
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/DOCS/tutorial/interpreter.html b/DOCS/tutorial/interpreter.html new file mode 100644 index 00000000..f568a1fd --- /dev/null +++ b/DOCS/tutorial/interpreter.html @@ -0,0 +1,336 @@ + + + + + + + + + 2. Using the Python Interpreter — Python 3.9.5 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ +
+

2. Using the Python Interpreter¶

+
+

2.1. Invoking the Interpreter¶

+

The Python interpreter is usually installed as /usr/local/bin/python3.9 +on those machines where it is available; putting /usr/local/bin in your +Unix shell’s search path makes it possible to start it by typing the command:

+
python3.9
+
+
+

to the shell. 1 Since the choice of the directory where the interpreter lives +is an installation option, other places are possible; check with your local +Python guru or system administrator. (E.g., /usr/local/python is a +popular alternative location.)

+

On Windows machines where you have installed Python from the Microsoft Store, the python3.9 command will be available. If you have +the py.exe launcher installed, you can use the py +command. See Excursus: Setting environment variables for other ways to launch Python.

+

Typing an end-of-file character (Control-D on Unix, Control-Z on +Windows) at the primary prompt causes the interpreter to exit with a zero exit +status. If that doesn’t work, you can exit the interpreter by typing the +following command: quit().

+

The interpreter’s line-editing features include interactive editing, history +substitution and code completion on systems that support the GNU Readline library. +Perhaps the quickest check to see whether command line editing is supported is +typing Control-P to the first Python prompt you get. If it beeps, you +have command line editing; see Appendix Interactive Input Editing and History Substitution for an +introduction to the keys. If nothing appears to happen, or if ^P is +echoed, command line editing isn’t available; you’ll only be able to use +backspace to remove characters from the current line.

+

The interpreter operates somewhat like the Unix shell: when called with standard +input connected to a tty device, it reads and executes commands interactively; +when called with a file name argument or with a file as standard input, it reads +and executes a script from that file.

+

A second way of starting the interpreter is python -c command [arg] ..., +which executes the statement(s) in command, analogous to the shell’s +-c option. Since Python statements often contain spaces or other +characters that are special to the shell, it is usually advised to quote +command in its entirety with single quotes.

+

Some Python modules are also useful as scripts. These can be invoked using +python -m module [arg] ..., which executes the source file for module as +if you had spelled out its full name on the command line.

+

When a script file is used, it is sometimes useful to be able to run the script +and enter interactive mode afterwards. This can be done by passing -i +before the script.

+

All command line options are described in Command line and environment.

+
+

2.1.1. Argument Passing¶

+

When known to the interpreter, the script name and additional arguments +thereafter are turned into a list of strings and assigned to the argv +variable in the sys module. You can access this list by executing import +sys. The length of the list is at least one; when no script and no arguments +are given, sys.argv[0] is an empty string. When the script name is given as +'-' (meaning standard input), sys.argv[0] is set to '-'. When +-c command is used, sys.argv[0] is set to '-c'. When +-m module is used, sys.argv[0] is set to the full name of the +located module. Options found after -c command or -m +module are not consumed by the Python interpreter’s option processing but +left in sys.argv for the command or module to handle.

+
+
+

2.1.2. Interactive Mode¶

+

When commands are read from a tty, the interpreter is said to be in interactive +mode. In this mode it prompts for the next command with the primary prompt, +usually three greater-than signs (>>>); for continuation lines it prompts +with the secondary prompt, by default three dots (...). The interpreter +prints a welcome message stating its version number and a copyright notice +before printing the first prompt:

+
$ python3.9
+Python 3.9 (default, June 4 2019, 09:25:04)
+[GCC 4.8.2] on linux
+Type "help", "copyright", "credits" or "license" for more information.
+>>>
+
+
+

Continuation lines are needed when entering a multi-line construct. As an +example, take a look at this if statement:

+
>>> the_world_is_flat = True
+>>> if the_world_is_flat:
+...     print("Be careful not to fall off!")
+...
+Be careful not to fall off!
+
+
+

For more on interactive mode, see Interactive Mode.

+
+
+
+

2.2. The Interpreter and Its Environment¶

+
+

2.2.1. Source Code Encoding¶

+

By default, Python source files are treated as encoded in UTF-8. In that +encoding, characters of most languages in the world can be used simultaneously +in string literals, identifiers and comments — although the standard library +only uses ASCII characters for identifiers, a convention that any portable code +should follow. To display all these characters properly, your editor must +recognize that the file is UTF-8, and it must use a font that supports all the +characters in the file.

+

To declare an encoding other than the default one, a special comment line +should be added as the first line of the file. The syntax is as follows:

+
# -*- coding: encoding -*-
+
+
+

where encoding is one of the valid codecs supported by Python.

+

For example, to declare that Windows-1252 encoding is to be used, the first +line of your source code file should be:

+
# -*- coding: cp1252 -*-
+
+
+

One exception to the first line rule is when the source code starts with a +UNIX “shebang†line. In this case, the encoding +declaration should be added as the second line of the file. For example:

+
#!/usr/bin/env python3
+# -*- coding: cp1252 -*-
+
+
+

Footnotes

+
+
1
+

On Unix, the Python 3.x interpreter is by default not installed with the +executable named python, so that it does not conflict with a +simultaneously installed Python 2.x executable.

+
+
+
+
+
+ + +
+
+
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/DOCS/tutorial/introduction.html b/DOCS/tutorial/introduction.html new file mode 100644 index 00000000..2255ae3d --- /dev/null +++ b/DOCS/tutorial/introduction.html @@ -0,0 +1,723 @@ + + + + + + + + + 3. An Informal Introduction to Python — Python 3.9.5 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ +
+

3. An Informal Introduction to Python¶

+

In the following examples, input and output are distinguished by the presence or +absence of prompts (>>> and …): to repeat the example, you must type +everything after the prompt, when the prompt appears; lines that do not begin +with a prompt are output from the interpreter. Note that a secondary prompt on a +line by itself in an example means you must type a blank line; this is used to +end a multi-line command.

+

Many of the examples in this manual, even those entered at the interactive +prompt, include comments. Comments in Python start with the hash character, +#, and extend to the end of the physical line. A comment may appear at the +start of a line or following whitespace or code, but not within a string +literal. A hash character within a string literal is just a hash character. +Since comments are to clarify code and are not interpreted by Python, they may +be omitted when typing in examples.

+

Some examples:

+
# this is the first comment
+spam = 1  # and this is the second comment
+          # ... and now a third!
+text = "# This is not a comment because it's inside quotes."
+
+
+
+

3.1. Using Python as a Calculator¶

+

Let’s try some simple Python commands. Start the interpreter and wait for the +primary prompt, >>>. (It shouldn’t take long.)

+
+

3.1.1. Numbers¶

+

The interpreter acts as a simple calculator: you can type an expression at it +and it will write the value. Expression syntax is straightforward: the +operators +, -, * and / work just like in most other languages +(for example, Pascal or C); parentheses (()) can be used for grouping. +For example:

+
>>> 2 + 2
+4
+>>> 50 - 5*6
+20
+>>> (50 - 5*6) / 4
+5.0
+>>> 8 / 5  # division always returns a floating point number
+1.6
+
+
+

The integer numbers (e.g. 2, 4, 20) have type int, +the ones with a fractional part (e.g. 5.0, 1.6) have type +float. We will see more about numeric types later in the tutorial.

+

Division (/) always returns a float. To do floor division and +get an integer result (discarding any fractional result) you can use the // +operator; to calculate the remainder you can use %:

+
>>> 17 / 3  # classic division returns a float
+5.666666666666667
+>>>
+>>> 17 // 3  # floor division discards the fractional part
+5
+>>> 17 % 3  # the % operator returns the remainder of the division
+2
+>>> 5 * 3 + 2  # floored quotient * divisor + remainder
+17
+
+
+

With Python, it is possible to use the ** operator to calculate powers 1:

+
>>> 5 ** 2  # 5 squared
+25
+>>> 2 ** 7  # 2 to the power of 7
+128
+
+
+

The equal sign (=) is used to assign a value to a variable. Afterwards, no +result is displayed before the next interactive prompt:

+
>>> width = 20
+>>> height = 5 * 9
+>>> width * height
+900
+
+
+

If a variable is not “defined†(assigned a value), trying to use it will +give you an error:

+
>>> n  # try to access an undefined variable
+Traceback (most recent call last):
+  File "<stdin>", line 1, in <module>
+NameError: name 'n' is not defined
+
+
+

There is full support for floating point; operators with mixed type operands +convert the integer operand to floating point:

+
>>> 4 * 3.75 - 1
+14.0
+
+
+

In interactive mode, the last printed expression is assigned to the variable +_. This means that when you are using Python as a desk calculator, it is +somewhat easier to continue calculations, for example:

+
>>> tax = 12.5 / 100
+>>> price = 100.50
+>>> price * tax
+12.5625
+>>> price + _
+113.0625
+>>> round(_, 2)
+113.06
+
+
+

This variable should be treated as read-only by the user. Don’t explicitly +assign a value to it — you would create an independent local variable with the +same name masking the built-in variable with its magic behavior.

+

In addition to int and float, Python supports other types of +numbers, such as Decimal and Fraction. +Python also has built-in support for complex numbers, +and uses the j or J suffix to indicate the imaginary part +(e.g. 3+5j).

+
+
+

3.1.2. Strings¶

+

Besides numbers, Python can also manipulate strings, which can be expressed +in several ways. They can be enclosed in single quotes ('...') or +double quotes ("...") with the same result 2. \ can be used +to escape quotes:

+
>>> 'spam eggs'  # single quotes
+'spam eggs'
+>>> 'doesn\'t'  # use \' to escape the single quote...
+"doesn't"
+>>> "doesn't"  # ...or use double quotes instead
+"doesn't"
+>>> '"Yes," they said.'
+'"Yes," they said.'
+>>> "\"Yes,\" they said."
+'"Yes," they said.'
+>>> '"Isn\'t," they said.'
+'"Isn\'t," they said.'
+
+
+

In the interactive interpreter, the output string is enclosed in quotes and +special characters are escaped with backslashes. While this might sometimes +look different from the input (the enclosing quotes could change), the two +strings are equivalent. The string is enclosed in double quotes if +the string contains a single quote and no double quotes, otherwise it is +enclosed in single quotes. The print() function produces a more +readable output, by omitting the enclosing quotes and by printing escaped +and special characters:

+
>>> '"Isn\'t," they said.'
+'"Isn\'t," they said.'
+>>> print('"Isn\'t," they said.')
+"Isn't," they said.
+>>> s = 'First line.\nSecond line.'  # \n means newline
+>>> s  # without print(), \n is included in the output
+'First line.\nSecond line.'
+>>> print(s)  # with print(), \n produces a new line
+First line.
+Second line.
+
+
+

If you don’t want characters prefaced by \ to be interpreted as +special characters, you can use raw strings by adding an r before +the first quote:

+
>>> print('C:\some\name')  # here \n means newline!
+C:\some
+ame
+>>> print(r'C:\some\name')  # note the r before the quote
+C:\some\name
+
+
+

String literals can span multiple lines. One way is using triple-quotes: +"""...""" or '''...'''. End of lines are automatically +included in the string, but it’s possible to prevent this by adding a \ at +the end of the line. The following example:

+
print("""\
+Usage: thingy [OPTIONS]
+     -h                        Display this usage message
+     -H hostname               Hostname to connect to
+""")
+
+
+

produces the following output (note that the initial newline is not included):

+
Usage: thingy [OPTIONS]
+     -h                        Display this usage message
+     -H hostname               Hostname to connect to
+
+
+

Strings can be concatenated (glued together) with the + operator, and +repeated with *:

+
>>> # 3 times 'un', followed by 'ium'
+>>> 3 * 'un' + 'ium'
+'unununium'
+
+
+

Two or more string literals (i.e. the ones enclosed between quotes) next +to each other are automatically concatenated.

+
>>> 'Py' 'thon'
+'Python'
+
+
+

This feature is particularly useful when you want to break long strings:

+
>>> text = ('Put several strings within parentheses '
+...         'to have them joined together.')
+>>> text
+'Put several strings within parentheses to have them joined together.'
+
+
+

This only works with two literals though, not with variables or expressions:

+
>>> prefix = 'Py'
+>>> prefix 'thon'  # can't concatenate a variable and a string literal
+  File "<stdin>", line 1
+    prefix 'thon'
+                ^
+SyntaxError: invalid syntax
+>>> ('un' * 3) 'ium'
+  File "<stdin>", line 1
+    ('un' * 3) 'ium'
+                   ^
+SyntaxError: invalid syntax
+
+
+

If you want to concatenate variables or a variable and a literal, use +:

+
>>> prefix + 'thon'
+'Python'
+
+
+

Strings can be indexed (subscripted), with the first character having index 0. +There is no separate character type; a character is simply a string of size +one:

+
>>> word = 'Python'
+>>> word[0]  # character in position 0
+'P'
+>>> word[5]  # character in position 5
+'n'
+
+
+

Indices may also be negative numbers, to start counting from the right:

+
>>> word[-1]  # last character
+'n'
+>>> word[-2]  # second-last character
+'o'
+>>> word[-6]
+'P'
+
+
+

Note that since -0 is the same as 0, negative indices start from -1.

+

In addition to indexing, slicing is also supported. While indexing is used +to obtain individual characters, slicing allows you to obtain substring:

+
>>> word[0:2]  # characters from position 0 (included) to 2 (excluded)
+'Py'
+>>> word[2:5]  # characters from position 2 (included) to 5 (excluded)
+'tho'
+
+
+

Note how the start is always included, and the end always excluded. This +makes sure that s[:i] + s[i:] is always equal to s:

+
>>> word[:2] + word[2:]
+'Python'
+>>> word[:4] + word[4:]
+'Python'
+
+
+

Slice indices have useful defaults; an omitted first index defaults to zero, an +omitted second index defaults to the size of the string being sliced.

+
>>> word[:2]   # character from the beginning to position 2 (excluded)
+'Py'
+>>> word[4:]   # characters from position 4 (included) to the end
+'on'
+>>> word[-2:]  # characters from the second-last (included) to the end
+'on'
+
+
+

One way to remember how slices work is to think of the indices as pointing +between characters, with the left edge of the first character numbered 0. +Then the right edge of the last character of a string of n characters has +index n, for example:

+
 +---+---+---+---+---+---+
+ | P | y | t | h | o | n |
+ +---+---+---+---+---+---+
+ 0   1   2   3   4   5   6
+-6  -5  -4  -3  -2  -1
+
+
+

The first row of numbers gives the position of the indices 0…6 in the string; +the second row gives the corresponding negative indices. The slice from i to +j consists of all characters between the edges labeled i and j, +respectively.

+

For non-negative indices, the length of a slice is the difference of the +indices, if both are within bounds. For example, the length of word[1:3] is +2.

+

Attempting to use an index that is too large will result in an error:

+
>>> word[42]  # the word only has 6 characters
+Traceback (most recent call last):
+  File "<stdin>", line 1, in <module>
+IndexError: string index out of range
+
+
+

However, out of range slice indexes are handled gracefully when used for +slicing:

+
>>> word[4:42]
+'on'
+>>> word[42:]
+''
+
+
+

Python strings cannot be changed — they are immutable. +Therefore, assigning to an indexed position in the string results in an error:

+
>>> word[0] = 'J'
+Traceback (most recent call last):
+  File "<stdin>", line 1, in <module>
+TypeError: 'str' object does not support item assignment
+>>> word[2:] = 'py'
+Traceback (most recent call last):
+  File "<stdin>", line 1, in <module>
+TypeError: 'str' object does not support item assignment
+
+
+

If you need a different string, you should create a new one:

+
>>> 'J' + word[1:]
+'Jython'
+>>> word[:2] + 'py'
+'Pypy'
+
+
+

The built-in function len() returns the length of a string:

+
>>> s = 'supercalifragilisticexpialidocious'
+>>> len(s)
+34
+
+
+
+

See also

+
+
Text Sequence Type — str

Strings are examples of sequence types, and support the common +operations supported by such types.

+
+
String Methods

Strings support a large number of methods for +basic transformations and searching.

+
+
Formatted string literals

String literals that have embedded expressions.

+
+
Format String Syntax

Information about string formatting with str.format().

+
+
printf-style String Formatting

The old formatting operations invoked when strings are +the left operand of the % operator are described in more detail here.

+
+
+
+
+
+

3.1.3. Lists¶

+

Python knows a number of compound data types, used to group together other +values. The most versatile is the list, which can be written as a list of +comma-separated values (items) between square brackets. Lists might contain +items of different types, but usually the items all have the same type.

+
>>> squares = [1, 4, 9, 16, 25]
+>>> squares
+[1, 4, 9, 16, 25]
+
+
+

Like strings (and all other built-in sequence types), lists can be +indexed and sliced:

+
>>> squares[0]  # indexing returns the item
+1
+>>> squares[-1]
+25
+>>> squares[-3:]  # slicing returns a new list
+[9, 16, 25]
+
+
+

All slice operations return a new list containing the requested elements. This +means that the following slice returns a +shallow copy of the list:

+
>>> squares[:]
+[1, 4, 9, 16, 25]
+
+
+

Lists also support operations like concatenation:

+
>>> squares + [36, 49, 64, 81, 100]
+[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
+
+
+

Unlike strings, which are immutable, lists are a mutable +type, i.e. it is possible to change their content:

+
>>> cubes = [1, 8, 27, 65, 125]  # something's wrong here
+>>> 4 ** 3  # the cube of 4 is 64, not 65!
+64
+>>> cubes[3] = 64  # replace the wrong value
+>>> cubes
+[1, 8, 27, 64, 125]
+
+
+

You can also add new items at the end of the list, by using +the append() method (we will see more about methods later):

+
>>> cubes.append(216)  # add the cube of 6
+>>> cubes.append(7 ** 3)  # and the cube of 7
+>>> cubes
+[1, 8, 27, 64, 125, 216, 343]
+
+
+

Assignment to slices is also possible, and this can even change the size of the +list or clear it entirely:

+
>>> letters = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
+>>> letters
+['a', 'b', 'c', 'd', 'e', 'f', 'g']
+>>> # replace some values
+>>> letters[2:5] = ['C', 'D', 'E']
+>>> letters
+['a', 'b', 'C', 'D', 'E', 'f', 'g']
+>>> # now remove them
+>>> letters[2:5] = []
+>>> letters
+['a', 'b', 'f', 'g']
+>>> # clear the list by replacing all the elements with an empty list
+>>> letters[:] = []
+>>> letters
+[]
+
+
+

The built-in function len() also applies to lists:

+
>>> letters = ['a', 'b', 'c', 'd']
+>>> len(letters)
+4
+
+
+

It is possible to nest lists (create lists containing other lists), for +example:

+
>>> a = ['a', 'b', 'c']
+>>> n = [1, 2, 3]
+>>> x = [a, n]
+>>> x
+[['a', 'b', 'c'], [1, 2, 3]]
+>>> x[0]
+['a', 'b', 'c']
+>>> x[0][1]
+'b'
+
+
+
+
+
+

3.2. First Steps Towards Programming¶

+

Of course, we can use Python for more complicated tasks than adding two and two +together. For instance, we can write an initial sub-sequence of the +Fibonacci series +as follows:

+
>>> # Fibonacci series:
+... # the sum of two elements defines the next
+... a, b = 0, 1
+>>> while a < 10:
+...     print(a)
+...     a, b = b, a+b
+...
+0
+1
+1
+2
+3
+5
+8
+
+
+

This example introduces several new features.

+
    +
  • The first line contains a multiple assignment: the variables a and b +simultaneously get the new values 0 and 1. On the last line this is used again, +demonstrating that the expressions on the right-hand side are all evaluated +first before any of the assignments take place. The right-hand side expressions +are evaluated from the left to the right.

  • +
  • The while loop executes as long as the condition (here: a < 10) +remains true. In Python, like in C, any non-zero integer value is true; zero is +false. The condition may also be a string or list value, in fact any sequence; +anything with a non-zero length is true, empty sequences are false. The test +used in the example is a simple comparison. The standard comparison operators +are written the same as in C: < (less than), > (greater than), == +(equal to), <= (less than or equal to), >= (greater than or equal to) +and != (not equal to).

  • +
  • The body of the loop is indented: indentation is Python’s way of grouping +statements. At the interactive prompt, you have to type a tab or space(s) for +each indented line. In practice you will prepare more complicated input +for Python with a text editor; all decent text editors have an auto-indent +facility. When a compound statement is entered interactively, it must be +followed by a blank line to indicate completion (since the parser cannot +guess when you have typed the last line). Note that each line within a basic +block must be indented by the same amount.

  • +
  • The print() function writes the value of the argument(s) it is given. +It differs from just writing the expression you want to write (as we did +earlier in the calculator examples) in the way it handles multiple arguments, +floating point quantities, and strings. Strings are printed without quotes, +and a space is inserted between items, so you can format things nicely, like +this:

    +
    >>> i = 256*256
    +>>> print('The value of i is', i)
    +The value of i is 65536
    +
    +
    +

    The keyword argument end can be used to avoid the newline after the output, +or end the output with a different string:

    +
    >>> a, b = 0, 1
    +>>> while a < 1000:
    +...     print(a, end=',')
    +...     a, b = b, a+b
    +...
    +0,1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,
    +
    +
    +
  • +
+

Footnotes

+
+
1
+

Since ** has higher precedence than -, -3**2 will be +interpreted as -(3**2) and thus result in -9. To avoid this +and get 9, you can use (-3)**2.

+
+
2
+

Unlike other languages, special characters such as \n have the +same meaning with both single ('...') and double ("...") quotes. +The only difference between the two is that within single quotes you don’t +need to escape " (but you have to escape \') and vice versa.

+
+
+
+
+ + +
+
+
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/DOCS/tutorial/left.html b/DOCS/tutorial/left.html new file mode 100644 index 00000000..793c74f5 --- /dev/null +++ b/DOCS/tutorial/left.html @@ -0,0 +1,23 @@ + + + + + +/Users/bryan/Downloads/https___docs.python.org_3_tutorial_index.html/docs.python.org/3/tutorial + + + + + + + + + +
Folders
<RETURN TO NAVIGATION>
+
+ + + + \ No newline at end of file diff --git a/DOCS/tutorial/modules.html b/DOCS/tutorial/modules.html new file mode 100644 index 00000000..76558468 --- /dev/null +++ b/DOCS/tutorial/modules.html @@ -0,0 +1,717 @@ + + + + + + + + + 6. Modules — Python 3.9.5 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ +
+

6. Modules¶

+

If you quit from the Python interpreter and enter it again, the definitions you +have made (functions and variables) are lost. Therefore, if you want to write a +somewhat longer program, you are better off using a text editor to prepare the +input for the interpreter and running it with that file as input instead. This +is known as creating a script. As your program gets longer, you may want to +split it into several files for easier maintenance. You may also want to use a +handy function that you’ve written in several programs without copying its +definition into each program.

+

To support this, Python has a way to put definitions in a file and use them in a +script or in an interactive instance of the interpreter. Such a file is called a +module; definitions from a module can be imported into other modules or into +the main module (the collection of variables that you have access to in a +script executed at the top level and in calculator mode).

+

A module is a file containing Python definitions and statements. The file name +is the module name with the suffix .py appended. Within a module, the +module’s name (as a string) is available as the value of the global variable +__name__. For instance, use your favorite text editor to create a file +called fibo.py in the current directory with the following contents:

+
# Fibonacci numbers module
+
+def fib(n):    # write Fibonacci series up to n
+    a, b = 0, 1
+    while a < n:
+        print(a, end=' ')
+        a, b = b, a+b
+    print()
+
+def fib2(n):   # return Fibonacci series up to n
+    result = []
+    a, b = 0, 1
+    while a < n:
+        result.append(a)
+        a, b = b, a+b
+    return result
+
+
+

Now enter the Python interpreter and import this module with the following +command:

+
>>> import fibo
+
+
+

This does not enter the names of the functions defined in fibo directly in +the current symbol table; it only enters the module name fibo there. Using +the module name you can access the functions:

+
>>> fibo.fib(1000)
+0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987
+>>> fibo.fib2(100)
+[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
+>>> fibo.__name__
+'fibo'
+
+
+

If you intend to use a function often you can assign it to a local name:

+
>>> fib = fibo.fib
+>>> fib(500)
+0 1 1 2 3 5 8 13 21 34 55 89 144 233 377
+
+
+
+

6.1. More on Modules¶

+

A module can contain executable statements as well as function definitions. +These statements are intended to initialize the module. They are executed only +the first time the module name is encountered in an import statement. 1 +(They are also run if the file is executed as a script.)

+

Each module has its own private symbol table, which is used as the global symbol +table by all functions defined in the module. Thus, the author of a module can +use global variables in the module without worrying about accidental clashes +with a user’s global variables. On the other hand, if you know what you are +doing you can touch a module’s global variables with the same notation used to +refer to its functions, modname.itemname.

+

Modules can import other modules. It is customary but not required to place all +import statements at the beginning of a module (or script, for that +matter). The imported module names are placed in the importing module’s global +symbol table.

+

There is a variant of the import statement that imports names from a +module directly into the importing module’s symbol table. For example:

+
>>> from fibo import fib, fib2
+>>> fib(500)
+0 1 1 2 3 5 8 13 21 34 55 89 144 233 377
+
+
+

This does not introduce the module name from which the imports are taken in the +local symbol table (so in the example, fibo is not defined).

+

There is even a variant to import all names that a module defines:

+
>>> from fibo import *
+>>> fib(500)
+0 1 1 2 3 5 8 13 21 34 55 89 144 233 377
+
+
+

This imports all names except those beginning with an underscore (_). +In most cases Python programmers do not use this facility since it introduces +an unknown set of names into the interpreter, possibly hiding some things +you have already defined.

+

Note that in general the practice of importing * from a module or package is +frowned upon, since it often causes poorly readable code. However, it is okay to +use it to save typing in interactive sessions.

+

If the module name is followed by as, then the name +following as is bound directly to the imported module.

+
>>> import fibo as fib
+>>> fib.fib(500)
+0 1 1 2 3 5 8 13 21 34 55 89 144 233 377
+
+
+

This is effectively importing the module in the same way that import fibo +will do, with the only difference of it being available as fib.

+

It can also be used when utilising from with similar effects:

+
>>> from fibo import fib as fibonacci
+>>> fibonacci(500)
+0 1 1 2 3 5 8 13 21 34 55 89 144 233 377
+
+
+
+

Note

+

For efficiency reasons, each module is only imported once per interpreter +session. Therefore, if you change your modules, you must restart the +interpreter – or, if it’s just one module you want to test interactively, +use importlib.reload(), e.g. import importlib; +importlib.reload(modulename).

+
+
+

6.1.1. Executing modules as scripts¶

+

When you run a Python module with

+
python fibo.py <arguments>
+
+
+

the code in the module will be executed, just as if you imported it, but with +the __name__ set to "__main__". That means that by adding this code at +the end of your module:

+
if __name__ == "__main__":
+    import sys
+    fib(int(sys.argv[1]))
+
+
+

you can make the file usable as a script as well as an importable module, +because the code that parses the command line only runs if the module is +executed as the “main†file:

+
$ python fibo.py 50
+0 1 1 2 3 5 8 13 21 34
+
+
+

If the module is imported, the code is not run:

+
>>> import fibo
+>>>
+
+
+

This is often used either to provide a convenient user interface to a module, or +for testing purposes (running the module as a script executes a test suite).

+
+
+

6.1.2. The Module Search Path¶

+

When a module named spam is imported, the interpreter first searches for +a built-in module with that name. If not found, it then searches for a file +named spam.py in a list of directories given by the variable +sys.path. sys.path is initialized from these locations:

+
    +
  • The directory containing the input script (or the current directory when no +file is specified).

  • +
  • PYTHONPATH (a list of directory names, with the same syntax as the +shell variable PATH).

  • +
  • The installation-dependent default.

  • +
+
+

Note

+

On file systems which support symlinks, the directory containing the input +script is calculated after the symlink is followed. In other words the +directory containing the symlink is not added to the module search path.

+
+

After initialization, Python programs can modify sys.path. The +directory containing the script being run is placed at the beginning of the +search path, ahead of the standard library path. This means that scripts in that +directory will be loaded instead of modules of the same name in the library +directory. This is an error unless the replacement is intended. See section +Standard Modules for more information.

+
+
+

6.1.3. “Compiled†Python files¶

+

To speed up loading modules, Python caches the compiled version of each module +in the __pycache__ directory under the name module.version.pyc, +where the version encodes the format of the compiled file; it generally contains +the Python version number. For example, in CPython release 3.3 the compiled +version of spam.py would be cached as __pycache__/spam.cpython-33.pyc. This +naming convention allows compiled modules from different releases and different +versions of Python to coexist.

+

Python checks the modification date of the source against the compiled version +to see if it’s out of date and needs to be recompiled. This is a completely +automatic process. Also, the compiled modules are platform-independent, so the +same library can be shared among systems with different architectures.

+

Python does not check the cache in two circumstances. First, it always +recompiles and does not store the result for the module that’s loaded directly +from the command line. Second, it does not check the cache if there is no +source module. To support a non-source (compiled only) distribution, the +compiled module must be in the source directory, and there must not be a source +module.

+

Some tips for experts:

+
    +
  • You can use the -O or -OO switches on the Python command +to reduce the size of a compiled module. The -O switch removes assert +statements, the -OO switch removes both assert statements and __doc__ +strings. Since some programs may rely on having these available, you should +only use this option if you know what you’re doing. “Optimized†modules have +an opt- tag and are usually smaller. Future releases may +change the effects of optimization.

  • +
  • A program doesn’t run any faster when it is read from a .pyc +file than when it is read from a .py file; the only thing that’s faster +about .pyc files is the speed with which they are loaded.

  • +
  • The module compileall can create .pyc files for all modules in a +directory.

  • +
  • There is more detail on this process, including a flow chart of the +decisions, in PEP 3147.

  • +
+
+
+
+

6.2. Standard Modules¶

+

Python comes with a library of standard modules, described in a separate +document, the Python Library Reference (“Library Reference†hereafter). Some +modules are built into the interpreter; these provide access to operations that +are not part of the core of the language but are nevertheless built in, either +for efficiency or to provide access to operating system primitives such as +system calls. The set of such modules is a configuration option which also +depends on the underlying platform. For example, the winreg module is only +provided on Windows systems. One particular module deserves some attention: +sys, which is built into every Python interpreter. The variables +sys.ps1 and sys.ps2 define the strings used as primary and secondary +prompts:

+
>>> import sys
+>>> sys.ps1
+'>>> '
+>>> sys.ps2
+'... '
+>>> sys.ps1 = 'C> '
+C> print('Yuck!')
+Yuck!
+C>
+
+
+

These two variables are only defined if the interpreter is in interactive mode.

+

The variable sys.path is a list of strings that determines the interpreter’s +search path for modules. It is initialized to a default path taken from the +environment variable PYTHONPATH, or from a built-in default if +PYTHONPATH is not set. You can modify it using standard list +operations:

+
>>> import sys
+>>> sys.path.append('/ufs/guido/lib/python')
+
+
+
+
+

6.3. The dir() Function¶

+

The built-in function dir() is used to find out which names a module +defines. It returns a sorted list of strings:

+
>>> import fibo, sys
+>>> dir(fibo)
+['__name__', 'fib', 'fib2']
+>>> dir(sys)  
+['__breakpointhook__', '__displayhook__', '__doc__', '__excepthook__',
+ '__interactivehook__', '__loader__', '__name__', '__package__', '__spec__',
+ '__stderr__', '__stdin__', '__stdout__', '__unraisablehook__',
+ '_clear_type_cache', '_current_frames', '_debugmallocstats', '_framework',
+ '_getframe', '_git', '_home', '_xoptions', 'abiflags', 'addaudithook',
+ 'api_version', 'argv', 'audit', 'base_exec_prefix', 'base_prefix',
+ 'breakpointhook', 'builtin_module_names', 'byteorder', 'call_tracing',
+ 'callstats', 'copyright', 'displayhook', 'dont_write_bytecode', 'exc_info',
+ 'excepthook', 'exec_prefix', 'executable', 'exit', 'flags', 'float_info',
+ 'float_repr_style', 'get_asyncgen_hooks', 'get_coroutine_origin_tracking_depth',
+ 'getallocatedblocks', 'getdefaultencoding', 'getdlopenflags',
+ 'getfilesystemencodeerrors', 'getfilesystemencoding', 'getprofile',
+ 'getrecursionlimit', 'getrefcount', 'getsizeof', 'getswitchinterval',
+ 'gettrace', 'hash_info', 'hexversion', 'implementation', 'int_info',
+ 'intern', 'is_finalizing', 'last_traceback', 'last_type', 'last_value',
+ 'maxsize', 'maxunicode', 'meta_path', 'modules', 'path', 'path_hooks',
+ 'path_importer_cache', 'platform', 'prefix', 'ps1', 'ps2', 'pycache_prefix',
+ 'set_asyncgen_hooks', 'set_coroutine_origin_tracking_depth', 'setdlopenflags',
+ 'setprofile', 'setrecursionlimit', 'setswitchinterval', 'settrace', 'stderr',
+ 'stdin', 'stdout', 'thread_info', 'unraisablehook', 'version', 'version_info',
+ 'warnoptions']
+
+
+

Without arguments, dir() lists the names you have defined currently:

+
>>> a = [1, 2, 3, 4, 5]
+>>> import fibo
+>>> fib = fibo.fib
+>>> dir()
+['__builtins__', '__name__', 'a', 'fib', 'fibo', 'sys']
+
+
+

Note that it lists all types of names: variables, modules, functions, etc.

+

dir() does not list the names of built-in functions and variables. If you +want a list of those, they are defined in the standard module +builtins:

+
>>> import builtins
+>>> dir(builtins)  
+['ArithmeticError', 'AssertionError', 'AttributeError', 'BaseException',
+ 'BlockingIOError', 'BrokenPipeError', 'BufferError', 'BytesWarning',
+ 'ChildProcessError', 'ConnectionAbortedError', 'ConnectionError',
+ 'ConnectionRefusedError', 'ConnectionResetError', 'DeprecationWarning',
+ 'EOFError', 'Ellipsis', 'EnvironmentError', 'Exception', 'False',
+ 'FileExistsError', 'FileNotFoundError', 'FloatingPointError',
+ 'FutureWarning', 'GeneratorExit', 'IOError', 'ImportError',
+ 'ImportWarning', 'IndentationError', 'IndexError', 'InterruptedError',
+ 'IsADirectoryError', 'KeyError', 'KeyboardInterrupt', 'LookupError',
+ 'MemoryError', 'NameError', 'None', 'NotADirectoryError', 'NotImplemented',
+ 'NotImplementedError', 'OSError', 'OverflowError',
+ 'PendingDeprecationWarning', 'PermissionError', 'ProcessLookupError',
+ 'ReferenceError', 'ResourceWarning', 'RuntimeError', 'RuntimeWarning',
+ 'StopIteration', 'SyntaxError', 'SyntaxWarning', 'SystemError',
+ 'SystemExit', 'TabError', 'TimeoutError', 'True', 'TypeError',
+ 'UnboundLocalError', 'UnicodeDecodeError', 'UnicodeEncodeError',
+ 'UnicodeError', 'UnicodeTranslateError', 'UnicodeWarning', 'UserWarning',
+ 'ValueError', 'Warning', 'ZeroDivisionError', '_', '__build_class__',
+ '__debug__', '__doc__', '__import__', '__name__', '__package__', 'abs',
+ 'all', 'any', 'ascii', 'bin', 'bool', 'bytearray', 'bytes', 'callable',
+ 'chr', 'classmethod', 'compile', 'complex', 'copyright', 'credits',
+ 'delattr', 'dict', 'dir', 'divmod', 'enumerate', 'eval', 'exec', 'exit',
+ 'filter', 'float', 'format', 'frozenset', 'getattr', 'globals', 'hasattr',
+ 'hash', 'help', 'hex', 'id', 'input', 'int', 'isinstance', 'issubclass',
+ 'iter', 'len', 'license', 'list', 'locals', 'map', 'max', 'memoryview',
+ 'min', 'next', 'object', 'oct', 'open', 'ord', 'pow', 'print', 'property',
+ 'quit', 'range', 'repr', 'reversed', 'round', 'set', 'setattr', 'slice',
+ 'sorted', 'staticmethod', 'str', 'sum', 'super', 'tuple', 'type', 'vars',
+ 'zip']
+
+
+
+
+

6.4. Packages¶

+

Packages are a way of structuring Python’s module namespace by using “dotted +module namesâ€. For example, the module name A.B designates a submodule +named B in a package named A. Just like the use of modules saves the +authors of different modules from having to worry about each other’s global +variable names, the use of dotted module names saves the authors of multi-module +packages like NumPy or Pillow from having to worry about +each other’s module names.

+

Suppose you want to design a collection of modules (a “packageâ€) for the uniform +handling of sound files and sound data. There are many different sound file +formats (usually recognized by their extension, for example: .wav, +.aiff, .au), so you may need to create and maintain a growing +collection of modules for the conversion between the various file formats. +There are also many different operations you might want to perform on sound data +(such as mixing, adding echo, applying an equalizer function, creating an +artificial stereo effect), so in addition you will be writing a never-ending +stream of modules to perform these operations. Here’s a possible structure for +your package (expressed in terms of a hierarchical filesystem):

+
sound/                          Top-level package
+      __init__.py               Initialize the sound package
+      formats/                  Subpackage for file format conversions
+              __init__.py
+              wavread.py
+              wavwrite.py
+              aiffread.py
+              aiffwrite.py
+              auread.py
+              auwrite.py
+              ...
+      effects/                  Subpackage for sound effects
+              __init__.py
+              echo.py
+              surround.py
+              reverse.py
+              ...
+      filters/                  Subpackage for filters
+              __init__.py
+              equalizer.py
+              vocoder.py
+              karaoke.py
+              ...
+
+
+

When importing the package, Python searches through the directories on +sys.path looking for the package subdirectory.

+

The __init__.py files are required to make Python treat directories +containing the file as packages. This prevents directories with a common name, +such as string, unintentionally hiding valid modules that occur later +on the module search path. In the simplest case, __init__.py can just be +an empty file, but it can also execute initialization code for the package or +set the __all__ variable, described later.

+

Users of the package can import individual modules from the package, for +example:

+
import sound.effects.echo
+
+
+

This loads the submodule sound.effects.echo. It must be referenced with +its full name.

+
sound.effects.echo.echofilter(input, output, delay=0.7, atten=4)
+
+
+

An alternative way of importing the submodule is:

+
from sound.effects import echo
+
+
+

This also loads the submodule echo, and makes it available without its +package prefix, so it can be used as follows:

+
echo.echofilter(input, output, delay=0.7, atten=4)
+
+
+

Yet another variation is to import the desired function or variable directly:

+
from sound.effects.echo import echofilter
+
+
+

Again, this loads the submodule echo, but this makes its function +echofilter() directly available:

+
echofilter(input, output, delay=0.7, atten=4)
+
+
+

Note that when using from package import item, the item can be either a +submodule (or subpackage) of the package, or some other name defined in the +package, like a function, class or variable. The import statement first +tests whether the item is defined in the package; if not, it assumes it is a +module and attempts to load it. If it fails to find it, an ImportError +exception is raised.

+

Contrarily, when using syntax like import item.subitem.subsubitem, each item +except for the last must be a package; the last item can be a module or a +package but can’t be a class or function or variable defined in the previous +item.

+
+

6.4.1. Importing * From a Package¶

+

Now what happens when the user writes from sound.effects import *? Ideally, +one would hope that this somehow goes out to the filesystem, finds which +submodules are present in the package, and imports them all. This could take a +long time and importing sub-modules might have unwanted side-effects that should +only happen when the sub-module is explicitly imported.

+

The only solution is for the package author to provide an explicit index of the +package. The import statement uses the following convention: if a package’s +__init__.py code defines a list named __all__, it is taken to be the +list of module names that should be imported when from package import * is +encountered. It is up to the package author to keep this list up-to-date when a +new version of the package is released. Package authors may also decide not to +support it, if they don’t see a use for importing * from their package. For +example, the file sound/effects/__init__.py could contain the following +code:

+
__all__ = ["echo", "surround", "reverse"]
+
+
+

This would mean that from sound.effects import * would import the three +named submodules of the sound package.

+

If __all__ is not defined, the statement from sound.effects import * +does not import all submodules from the package sound.effects into the +current namespace; it only ensures that the package sound.effects has +been imported (possibly running any initialization code in __init__.py) +and then imports whatever names are defined in the package. This includes any +names defined (and submodules explicitly loaded) by __init__.py. It +also includes any submodules of the package that were explicitly loaded by +previous import statements. Consider this code:

+
import sound.effects.echo
+import sound.effects.surround
+from sound.effects import *
+
+
+

In this example, the echo and surround modules are imported in the +current namespace because they are defined in the sound.effects package +when the from...import statement is executed. (This also works when +__all__ is defined.)

+

Although certain modules are designed to export only names that follow certain +patterns when you use import *, it is still considered bad practice in +production code.

+

Remember, there is nothing wrong with using from package import +specific_submodule! In fact, this is the recommended notation unless the +importing module needs to use submodules with the same name from different +packages.

+
+
+

6.4.2. Intra-package References¶

+

When packages are structured into subpackages (as with the sound package +in the example), you can use absolute imports to refer to submodules of siblings +packages. For example, if the module sound.filters.vocoder needs to use +the echo module in the sound.effects package, it can use from +sound.effects import echo.

+

You can also write relative imports, with the from module import name form +of import statement. These imports use leading dots to indicate the current and +parent packages involved in the relative import. From the surround +module for example, you might use:

+
from . import echo
+from .. import formats
+from ..filters import equalizer
+
+
+

Note that relative imports are based on the name of the current module. Since +the name of the main module is always "__main__", modules intended for use +as the main module of a Python application must always use absolute imports.

+
+
+

6.4.3. Packages in Multiple Directories¶

+

Packages support one more special attribute, __path__. This is +initialized to be a list containing the name of the directory holding the +package’s __init__.py before the code in that file is executed. This +variable can be modified; doing so affects future searches for modules and +subpackages contained in the package.

+

While this feature is not often needed, it can be used to extend the set of +modules found in a package.

+

Footnotes

+
+
1
+

In fact function definitions are also ‘statements’ that are ‘executed’; the +execution of a module-level function definition enters the function name in +the module’s global symbol table.

+
+
+
+
+
+ + +
+
+
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/DOCS/tutorial/right.html b/DOCS/tutorial/right.html new file mode 100644 index 00000000..4c50ebb9 --- /dev/null +++ b/DOCS/tutorial/right.html @@ -0,0 +1,33 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/DOCS/tutorial + + + + + + + + +
Folders
<Go Back>
+
+ + + + + + + + +
FileFileFileFile
appendix.html directory.html interactive.html stdlib.html 
appetite.html errors.html interpreter.html stdlib2.html 
classes.html floatingpoint.html introduction.html venv.html 
controlflow.html index.html left.html whatnow.html 
datastruc...s.html inputoutput.html modules.html 
+ +

+Folders: 1
+Files: 19
+Size of all files: 809562 KB

+ + + \ No newline at end of file diff --git a/DOCS/tutorial/stdlib.html b/DOCS/tutorial/stdlib.html new file mode 100644 index 00000000..f833fa1e --- /dev/null +++ b/DOCS/tutorial/stdlib.html @@ -0,0 +1,515 @@ + + + + + + + + + 10. Brief Tour of the Standard Library — Python 3.9.5 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ +
+

10. Brief Tour of the Standard Library¶

+
+

10.1. Operating System Interface¶

+

The os module provides dozens of functions for interacting with the +operating system:

+
>>> import os
+>>> os.getcwd()      # Return the current working directory
+'C:\\Python39'
+>>> os.chdir('/server/accesslogs')   # Change current working directory
+>>> os.system('mkdir today')   # Run the command mkdir in the system shell
+0
+
+
+

Be sure to use the import os style instead of from os import *. This +will keep os.open() from shadowing the built-in open() function which +operates much differently.

+

The built-in dir() and help() functions are useful as interactive +aids for working with large modules like os:

+
>>> import os
+>>> dir(os)
+<returns a list of all module functions>
+>>> help(os)
+<returns an extensive manual page created from the module's docstrings>
+
+
+

For daily file and directory management tasks, the shutil module provides +a higher level interface that is easier to use:

+
>>> import shutil
+>>> shutil.copyfile('data.db', 'archive.db')
+'archive.db'
+>>> shutil.move('/build/executables', 'installdir')
+'installdir'
+
+
+
+
+

10.2. File Wildcards¶

+

The glob module provides a function for making file lists from directory +wildcard searches:

+
>>> import glob
+>>> glob.glob('*.py')
+['primes.py', 'random.py', 'quote.py']
+
+
+
+
+

10.3. Command Line Arguments¶

+

Common utility scripts often need to process command line arguments. These +arguments are stored in the sys module’s argv attribute as a list. For +instance the following output results from running python demo.py one two +three at the command line:

+
>>> import sys
+>>> print(sys.argv)
+['demo.py', 'one', 'two', 'three']
+
+
+

The argparse module provides a more sophisticated mechanism to process +command line arguments. The following script extracts one or more filenames +and an optional number of lines to be displayed:

+
import argparse
+
+parser = argparse.ArgumentParser(prog = 'top',
+    description = 'Show top lines from each file')
+parser.add_argument('filenames', nargs='+')
+parser.add_argument('-l', '--lines', type=int, default=10)
+args = parser.parse_args()
+print(args)
+
+
+

When run at the command line with python top.py --lines=5 alpha.txt +beta.txt, the script sets args.lines to 5 and args.filenames +to ['alpha.txt', 'beta.txt'].

+
+
+

10.4. Error Output Redirection and Program Termination¶

+

The sys module also has attributes for stdin, stdout, and stderr. +The latter is useful for emitting warnings and error messages to make them +visible even when stdout has been redirected:

+
>>> sys.stderr.write('Warning, log file not found starting a new one\n')
+Warning, log file not found starting a new one
+
+
+

The most direct way to terminate a script is to use sys.exit().

+
+
+

10.5. String Pattern Matching¶

+

The re module provides regular expression tools for advanced string +processing. For complex matching and manipulation, regular expressions offer +succinct, optimized solutions:

+
>>> import re
+>>> re.findall(r'\bf[a-z]*', 'which foot or hand fell fastest')
+['foot', 'fell', 'fastest']
+>>> re.sub(r'(\b[a-z]+) \1', r'\1', 'cat in the the hat')
+'cat in the hat'
+
+
+

When only simple capabilities are needed, string methods are preferred because +they are easier to read and debug:

+
>>> 'tea for too'.replace('too', 'two')
+'tea for two'
+
+
+
+
+

10.6. Mathematics¶

+

The math module gives access to the underlying C library functions for +floating point math:

+
>>> import math
+>>> math.cos(math.pi / 4)
+0.70710678118654757
+>>> math.log(1024, 2)
+10.0
+
+
+

The random module provides tools for making random selections:

+
>>> import random
+>>> random.choice(['apple', 'pear', 'banana'])
+'apple'
+>>> random.sample(range(100), 10)   # sampling without replacement
+[30, 83, 16, 4, 8, 81, 41, 50, 18, 33]
+>>> random.random()    # random float
+0.17970987693706186
+>>> random.randrange(6)    # random integer chosen from range(6)
+4
+
+
+

The statistics module calculates basic statistical properties +(the mean, median, variance, etc.) of numeric data:

+
>>> import statistics
+>>> data = [2.75, 1.75, 1.25, 0.25, 0.5, 1.25, 3.5]
+>>> statistics.mean(data)
+1.6071428571428572
+>>> statistics.median(data)
+1.25
+>>> statistics.variance(data)
+1.3720238095238095
+
+
+

The SciPy project <https://scipy.org> has many other modules for numerical +computations.

+
+
+

10.7. Internet Access¶

+

There are a number of modules for accessing the internet and processing internet +protocols. Two of the simplest are urllib.request for retrieving data +from URLs and smtplib for sending mail:

+
>>> from urllib.request import urlopen
+>>> with urlopen('http://tycho.usno.navy.mil/cgi-bin/timer.pl') as response:
+...     for line in response:
+...         line = line.decode('utf-8')  # Decoding the binary data to text.
+...         if 'EST' in line or 'EDT' in line:  # look for Eastern Time
+...             print(line)
+
+<BR>Nov. 25, 09:43:32 PM EST
+
+>>> import smtplib
+>>> server = smtplib.SMTP('localhost')
+>>> server.sendmail('soothsayer@example.org', 'jcaesar@example.org',
+... """To: jcaesar@example.org
+... From: soothsayer@example.org
+...
+... Beware the Ides of March.
+... """)
+>>> server.quit()
+
+
+

(Note that the second example needs a mailserver running on localhost.)

+
+
+

10.8. Dates and Times¶

+

The datetime module supplies classes for manipulating dates and times in +both simple and complex ways. While date and time arithmetic is supported, the +focus of the implementation is on efficient member extraction for output +formatting and manipulation. The module also supports objects that are timezone +aware.

+
>>> # dates are easily constructed and formatted
+>>> from datetime import date
+>>> now = date.today()
+>>> now
+datetime.date(2003, 12, 2)
+>>> now.strftime("%m-%d-%y. %d %b %Y is a %A on the %d day of %B.")
+'12-02-03. 02 Dec 2003 is a Tuesday on the 02 day of December.'
+
+>>> # dates support calendar arithmetic
+>>> birthday = date(1964, 7, 31)
+>>> age = now - birthday
+>>> age.days
+14368
+
+
+
+
+

10.9. Data Compression¶

+

Common data archiving and compression formats are directly supported by modules +including: zlib, gzip, bz2, lzma, zipfile and +tarfile.

+
>>> import zlib
+>>> s = b'witch which has which witches wrist watch'
+>>> len(s)
+41
+>>> t = zlib.compress(s)
+>>> len(t)
+37
+>>> zlib.decompress(t)
+b'witch which has which witches wrist watch'
+>>> zlib.crc32(s)
+226805979
+
+
+
+
+

10.10. Performance Measurement¶

+

Some Python users develop a deep interest in knowing the relative performance of +different approaches to the same problem. Python provides a measurement tool +that answers those questions immediately.

+

For example, it may be tempting to use the tuple packing and unpacking feature +instead of the traditional approach to swapping arguments. The timeit +module quickly demonstrates a modest performance advantage:

+
>>> from timeit import Timer
+>>> Timer('t=a; a=b; b=t', 'a=1; b=2').timeit()
+0.57535828626024577
+>>> Timer('a,b = b,a', 'a=1; b=2').timeit()
+0.54962537085770791
+
+
+

In contrast to timeit’s fine level of granularity, the profile and +pstats modules provide tools for identifying time critical sections in +larger blocks of code.

+
+
+

10.11. Quality Control¶

+

One approach for developing high quality software is to write tests for each +function as it is developed and to run those tests frequently during the +development process.

+

The doctest module provides a tool for scanning a module and validating +tests embedded in a program’s docstrings. Test construction is as simple as +cutting-and-pasting a typical call along with its results into the docstring. +This improves the documentation by providing the user with an example and it +allows the doctest module to make sure the code remains true to the +documentation:

+
def average(values):
+    """Computes the arithmetic mean of a list of numbers.
+
+    >>> print(average([20, 30, 70]))
+    40.0
+    """
+    return sum(values) / len(values)
+
+import doctest
+doctest.testmod()   # automatically validate the embedded tests
+
+
+

The unittest module is not as effortless as the doctest module, +but it allows a more comprehensive set of tests to be maintained in a separate +file:

+
import unittest
+
+class TestStatisticalFunctions(unittest.TestCase):
+
+    def test_average(self):
+        self.assertEqual(average([20, 30, 70]), 40.0)
+        self.assertEqual(round(average([1, 5, 7]), 1), 4.3)
+        with self.assertRaises(ZeroDivisionError):
+            average([])
+        with self.assertRaises(TypeError):
+            average(20, 30, 70)
+
+unittest.main()  # Calling from the command line invokes all tests
+
+
+
+
+

10.12. Batteries Included¶

+

Python has a “batteries included†philosophy. This is best seen through the +sophisticated and robust capabilities of its larger packages. For example:

+
    +
  • The xmlrpc.client and xmlrpc.server modules make implementing +remote procedure calls into an almost trivial task. Despite the modules +names, no direct knowledge or handling of XML is needed.

  • +
  • The email package is a library for managing email messages, including +MIME and other RFC 2822-based message documents. Unlike smtplib and +poplib which actually send and receive messages, the email package has +a complete toolset for building or decoding complex message structures +(including attachments) and for implementing internet encoding and header +protocols.

  • +
  • The json package provides robust support for parsing this +popular data interchange format. The csv module supports +direct reading and writing of files in Comma-Separated Value format, +commonly supported by databases and spreadsheets. XML processing is +supported by the xml.etree.ElementTree, xml.dom and +xml.sax packages. Together, these modules and packages +greatly simplify data interchange between Python applications and +other tools.

  • +
  • The sqlite3 module is a wrapper for the SQLite database +library, providing a persistent database that can be updated and +accessed using slightly nonstandard SQL syntax.

  • +
  • Internationalization is supported by a number of modules including +gettext, locale, and the codecs package.

  • +
+
+
+ + +
+
+
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/DOCS/tutorial/stdlib2.html b/DOCS/tutorial/stdlib2.html new file mode 100644 index 00000000..de81e83c --- /dev/null +++ b/DOCS/tutorial/stdlib2.html @@ -0,0 +1,572 @@ + + + + + + + + + 11. Brief Tour of the Standard Library — Part II — Python 3.9.5 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ +
+

11. Brief Tour of the Standard Library — Part II¶

+

This second tour covers more advanced modules that support professional +programming needs. These modules rarely occur in small scripts.

+
+

11.1. Output Formatting¶

+

The reprlib module provides a version of repr() customized for +abbreviated displays of large or deeply nested containers:

+
>>> import reprlib
+>>> reprlib.repr(set('supercalifragilisticexpialidocious'))
+"{'a', 'c', 'd', 'e', 'f', 'g', ...}"
+
+
+

The pprint module offers more sophisticated control over printing both +built-in and user defined objects in a way that is readable by the interpreter. +When the result is longer than one line, the “pretty printer†adds line breaks +and indentation to more clearly reveal data structure:

+
>>> import pprint
+>>> t = [[[['black', 'cyan'], 'white', ['green', 'red']], [['magenta',
+...     'yellow'], 'blue']]]
+...
+>>> pprint.pprint(t, width=30)
+[[[['black', 'cyan'],
+   'white',
+   ['green', 'red']],
+  [['magenta', 'yellow'],
+   'blue']]]
+
+
+

The textwrap module formats paragraphs of text to fit a given screen +width:

+
>>> import textwrap
+>>> doc = """The wrap() method is just like fill() except that it returns
+... a list of strings instead of one big string with newlines to separate
+... the wrapped lines."""
+...
+>>> print(textwrap.fill(doc, width=40))
+The wrap() method is just like fill()
+except that it returns a list of strings
+instead of one big string with newlines
+to separate the wrapped lines.
+
+
+

The locale module accesses a database of culture specific data formats. +The grouping attribute of locale’s format function provides a direct way of +formatting numbers with group separators:

+
>>> import locale
+>>> locale.setlocale(locale.LC_ALL, 'English_United States.1252')
+'English_United States.1252'
+>>> conv = locale.localeconv()          # get a mapping of conventions
+>>> x = 1234567.8
+>>> locale.format("%d", x, grouping=True)
+'1,234,567'
+>>> locale.format_string("%s%.*f", (conv['currency_symbol'],
+...                      conv['frac_digits'], x), grouping=True)
+'$1,234,567.80'
+
+
+
+
+

11.2. Templating¶

+

The string module includes a versatile Template class +with a simplified syntax suitable for editing by end-users. This allows users +to customize their applications without having to alter the application.

+

The format uses placeholder names formed by $ with valid Python identifiers +(alphanumeric characters and underscores). Surrounding the placeholder with +braces allows it to be followed by more alphanumeric letters with no intervening +spaces. Writing $$ creates a single escaped $:

+
>>> from string import Template
+>>> t = Template('${village}folk send $$10 to $cause.')
+>>> t.substitute(village='Nottingham', cause='the ditch fund')
+'Nottinghamfolk send $10 to the ditch fund.'
+
+
+

The substitute() method raises a KeyError when a +placeholder is not supplied in a dictionary or a keyword argument. For +mail-merge style applications, user supplied data may be incomplete and the +safe_substitute() method may be more appropriate — +it will leave placeholders unchanged if data is missing:

+
>>> t = Template('Return the $item to $owner.')
+>>> d = dict(item='unladen swallow')
+>>> t.substitute(d)
+Traceback (most recent call last):
+  ...
+KeyError: 'owner'
+>>> t.safe_substitute(d)
+'Return the unladen swallow to $owner.'
+
+
+

Template subclasses can specify a custom delimiter. For example, a batch +renaming utility for a photo browser may elect to use percent signs for +placeholders such as the current date, image sequence number, or file format:

+
>>> import time, os.path
+>>> photofiles = ['img_1074.jpg', 'img_1076.jpg', 'img_1077.jpg']
+>>> class BatchRename(Template):
+...     delimiter = '%'
+>>> fmt = input('Enter rename style (%d-date %n-seqnum %f-format):  ')
+Enter rename style (%d-date %n-seqnum %f-format):  Ashley_%n%f
+
+>>> t = BatchRename(fmt)
+>>> date = time.strftime('%d%b%y')
+>>> for i, filename in enumerate(photofiles):
+...     base, ext = os.path.splitext(filename)
+...     newname = t.substitute(d=date, n=i, f=ext)
+...     print('{0} --> {1}'.format(filename, newname))
+
+img_1074.jpg --> Ashley_0.jpg
+img_1076.jpg --> Ashley_1.jpg
+img_1077.jpg --> Ashley_2.jpg
+
+
+

Another application for templating is separating program logic from the details +of multiple output formats. This makes it possible to substitute custom +templates for XML files, plain text reports, and HTML web reports.

+
+
+

11.3. Working with Binary Data Record Layouts¶

+

The struct module provides pack() and +unpack() functions for working with variable length binary +record formats. The following example shows +how to loop through header information in a ZIP file without using the +zipfile module. Pack codes "H" and "I" represent two and four +byte unsigned numbers respectively. The "<" indicates that they are +standard size and in little-endian byte order:

+
import struct
+
+with open('myfile.zip', 'rb') as f:
+    data = f.read()
+
+start = 0
+for i in range(3):                      # show the first 3 file headers
+    start += 14
+    fields = struct.unpack('<IIIHH', data[start:start+16])
+    crc32, comp_size, uncomp_size, filenamesize, extra_size = fields
+
+    start += 16
+    filename = data[start:start+filenamesize]
+    start += filenamesize
+    extra = data[start:start+extra_size]
+    print(filename, hex(crc32), comp_size, uncomp_size)
+
+    start += extra_size + comp_size     # skip to the next header
+
+
+
+
+

11.4. Multi-threading¶

+

Threading is a technique for decoupling tasks which are not sequentially +dependent. Threads can be used to improve the responsiveness of applications +that accept user input while other tasks run in the background. A related use +case is running I/O in parallel with computations in another thread.

+

The following code shows how the high level threading module can run +tasks in background while the main program continues to run:

+
import threading, zipfile
+
+class AsyncZip(threading.Thread):
+    def __init__(self, infile, outfile):
+        threading.Thread.__init__(self)
+        self.infile = infile
+        self.outfile = outfile
+
+    def run(self):
+        f = zipfile.ZipFile(self.outfile, 'w', zipfile.ZIP_DEFLATED)
+        f.write(self.infile)
+        f.close()
+        print('Finished background zip of:', self.infile)
+
+background = AsyncZip('mydata.txt', 'myarchive.zip')
+background.start()
+print('The main program continues to run in foreground.')
+
+background.join()    # Wait for the background task to finish
+print('Main program waited until background was done.')
+
+
+

The principal challenge of multi-threaded applications is coordinating threads +that share data or other resources. To that end, the threading module provides +a number of synchronization primitives including locks, events, condition +variables, and semaphores.

+

While those tools are powerful, minor design errors can result in problems that +are difficult to reproduce. So, the preferred approach to task coordination is +to concentrate all access to a resource in a single thread and then use the +queue module to feed that thread with requests from other threads. +Applications using Queue objects for inter-thread communication and +coordination are easier to design, more readable, and more reliable.

+
+
+

11.5. Logging¶

+

The logging module offers a full featured and flexible logging system. +At its simplest, log messages are sent to a file or to sys.stderr:

+
import logging
+logging.debug('Debugging information')
+logging.info('Informational message')
+logging.warning('Warning:config file %s not found', 'server.conf')
+logging.error('Error occurred')
+logging.critical('Critical error -- shutting down')
+
+
+

This produces the following output:

+
WARNING:root:Warning:config file server.conf not found
+ERROR:root:Error occurred
+CRITICAL:root:Critical error -- shutting down
+
+
+

By default, informational and debugging messages are suppressed and the output +is sent to standard error. Other output options include routing messages +through email, datagrams, sockets, or to an HTTP Server. New filters can select +different routing based on message priority: DEBUG, +INFO, WARNING, ERROR, +and CRITICAL.

+

The logging system can be configured directly from Python or can be loaded from +a user editable configuration file for customized logging without altering the +application.

+
+
+

11.6. Weak References¶

+

Python does automatic memory management (reference counting for most objects and +garbage collection to eliminate cycles). The memory is freed shortly +after the last reference to it has been eliminated.

+

This approach works fine for most applications but occasionally there is a need +to track objects only as long as they are being used by something else. +Unfortunately, just tracking them creates a reference that makes them permanent. +The weakref module provides tools for tracking objects without creating a +reference. When the object is no longer needed, it is automatically removed +from a weakref table and a callback is triggered for weakref objects. Typical +applications include caching objects that are expensive to create:

+
>>> import weakref, gc
+>>> class A:
+...     def __init__(self, value):
+...         self.value = value
+...     def __repr__(self):
+...         return str(self.value)
+...
+>>> a = A(10)                   # create a reference
+>>> d = weakref.WeakValueDictionary()
+>>> d['primary'] = a            # does not create a reference
+>>> d['primary']                # fetch the object if it is still alive
+10
+>>> del a                       # remove the one reference
+>>> gc.collect()                # run garbage collection right away
+0
+>>> d['primary']                # entry was automatically removed
+Traceback (most recent call last):
+  File "<stdin>", line 1, in <module>
+    d['primary']                # entry was automatically removed
+  File "C:/python39/lib/weakref.py", line 46, in __getitem__
+    o = self.data[key]()
+KeyError: 'primary'
+
+
+
+
+

11.7. Tools for Working with Lists¶

+

Many data structure needs can be met with the built-in list type. However, +sometimes there is a need for alternative implementations with different +performance trade-offs.

+

The array module provides an array() object that is like +a list that stores only homogeneous data and stores it more compactly. The +following example shows an array of numbers stored as two byte unsigned binary +numbers (typecode "H") rather than the usual 16 bytes per entry for regular +lists of Python int objects:

+
>>> from array import array
+>>> a = array('H', [4000, 10, 700, 22222])
+>>> sum(a)
+26932
+>>> a[1:3]
+array('H', [10, 700])
+
+
+

The collections module provides a deque() object +that is like a list with faster appends and pops from the left side but slower +lookups in the middle. These objects are well suited for implementing queues +and breadth first tree searches:

+
>>> from collections import deque
+>>> d = deque(["task1", "task2", "task3"])
+>>> d.append("task4")
+>>> print("Handling", d.popleft())
+Handling task1
+
+
+
unsearched = deque([starting_node])
+def breadth_first_search(unsearched):
+    node = unsearched.popleft()
+    for m in gen_moves(node):
+        if is_goal(m):
+            return m
+        unsearched.append(m)
+
+
+

In addition to alternative list implementations, the library also offers other +tools such as the bisect module with functions for manipulating sorted +lists:

+
>>> import bisect
+>>> scores = [(100, 'perl'), (200, 'tcl'), (400, 'lua'), (500, 'python')]
+>>> bisect.insort(scores, (300, 'ruby'))
+>>> scores
+[(100, 'perl'), (200, 'tcl'), (300, 'ruby'), (400, 'lua'), (500, 'python')]
+
+
+

The heapq module provides functions for implementing heaps based on +regular lists. The lowest valued entry is always kept at position zero. This +is useful for applications which repeatedly access the smallest element but do +not want to run a full list sort:

+
>>> from heapq import heapify, heappop, heappush
+>>> data = [1, 3, 5, 7, 9, 2, 4, 6, 8, 0]
+>>> heapify(data)                      # rearrange the list into heap order
+>>> heappush(data, -5)                 # add a new entry
+>>> [heappop(data) for i in range(3)]  # fetch the three smallest entries
+[-5, 0, 1]
+
+
+
+
+

11.8. Decimal Floating Point Arithmetic¶

+

The decimal module offers a Decimal datatype for +decimal floating point arithmetic. Compared to the built-in float +implementation of binary floating point, the class is especially helpful for

+
    +
  • financial applications and other uses which require exact decimal +representation,

  • +
  • control over precision,

  • +
  • control over rounding to meet legal or regulatory requirements,

  • +
  • tracking of significant decimal places, or

  • +
  • applications where the user expects the results to match calculations done by +hand.

  • +
+

For example, calculating a 5% tax on a 70 cent phone charge gives different +results in decimal floating point and binary floating point. The difference +becomes significant if the results are rounded to the nearest cent:

+
>>> from decimal import *
+>>> round(Decimal('0.70') * Decimal('1.05'), 2)
+Decimal('0.74')
+>>> round(.70 * 1.05, 2)
+0.73
+
+
+

The Decimal result keeps a trailing zero, automatically +inferring four place significance from multiplicands with two place +significance. Decimal reproduces mathematics as done by hand and avoids +issues that can arise when binary floating point cannot exactly represent +decimal quantities.

+

Exact representation enables the Decimal class to perform +modulo calculations and equality tests that are unsuitable for binary floating +point:

+
>>> Decimal('1.00') % Decimal('.10')
+Decimal('0.00')
+>>> 1.00 % 0.10
+0.09999999999999995
+
+>>> sum([Decimal('0.1')]*10) == Decimal('1.0')
+True
+>>> sum([0.1]*10) == 1.0
+False
+
+
+

The decimal module provides arithmetic with as much precision as needed:

+
>>> getcontext().prec = 36
+>>> Decimal(1) / Decimal(7)
+Decimal('0.142857142857142857142857142857142857')
+
+
+
+
+ + +
+
+
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/DOCS/tutorial/venv.html b/DOCS/tutorial/venv.html new file mode 100644 index 00000000..22603b4f --- /dev/null +++ b/DOCS/tutorial/venv.html @@ -0,0 +1,375 @@ + + + + + + + + + 12. Virtual Environments and Packages — Python 3.9.5 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ +
+

12. Virtual Environments and Packages¶

+
+

12.1. Introduction¶

+

Python applications will often use packages and modules that don’t +come as part of the standard library. Applications will sometimes +need a specific version of a library, because the application may +require that a particular bug has been fixed or the application may be +written using an obsolete version of the library’s interface.

+

This means it may not be possible for one Python installation to meet +the requirements of every application. If application A needs version +1.0 of a particular module but application B needs version 2.0, then +the requirements are in conflict and installing either version 1.0 or 2.0 +will leave one application unable to run.

+

The solution for this problem is to create a virtual environment, a +self-contained directory tree that contains a Python installation for a +particular version of Python, plus a number of additional packages.

+

Different applications can then use different virtual environments. +To resolve the earlier example of conflicting requirements, +application A can have its own virtual environment with version 1.0 +installed while application B has another virtual environment with version 2.0. +If application B requires a library be upgraded to version 3.0, this will +not affect application A’s environment.

+
+
+

12.2. Creating Virtual Environments¶

+

The module used to create and manage virtual environments is called +venv. venv will usually install the most recent version of +Python that you have available. If you have multiple versions of Python on your +system, you can select a specific Python version by running python3 or +whichever version you want.

+

To create a virtual environment, decide upon a directory where you want to +place it, and run the venv module as a script with the directory path:

+
python3 -m venv tutorial-env
+
+
+

This will create the tutorial-env directory if it doesn’t exist, +and also create directories inside it containing a copy of the Python +interpreter, the standard library, and various supporting files.

+

A common directory location for a virtual environment is .venv. +This name keeps the directory typically hidden in your shell and thus +out of the way while giving it a name that explains why the directory +exists. It also prevents clashing with .env environment variable +definition files that some tooling supports.

+

Once you’ve created a virtual environment, you may activate it.

+

On Windows, run:

+
tutorial-env\Scripts\activate.bat
+
+
+

On Unix or MacOS, run:

+
source tutorial-env/bin/activate
+
+
+

(This script is written for the bash shell. If you use the +csh or fish shells, there are alternate +activate.csh and activate.fish scripts you should use +instead.)

+

Activating the virtual environment will change your shell’s prompt to show what +virtual environment you’re using, and modify the environment so that running +python will get you that particular version and installation of Python. +For example:

+
$ source ~/envs/tutorial-env/bin/activate
+(tutorial-env) $ python
+Python 3.5.1 (default, May  6 2016, 10:59:36)
+  ...
+>>> import sys
+>>> sys.path
+['', '/usr/local/lib/python35.zip', ...,
+'~/envs/tutorial-env/lib/python3.5/site-packages']
+>>>
+
+
+
+
+

12.3. Managing Packages with pip¶

+

You can install, upgrade, and remove packages using a program called +pip. By default pip will install packages from the Python +Package Index, <https://pypi.org>. You can browse the Python +Package Index by going to it in your web browser.

+

pip has a number of subcommands: “installâ€, “uninstallâ€, +“freezeâ€, etc. (Consult the Installing Python Modules guide for +complete documentation for pip.)

+

You can install the latest version of a package by specifying a package’s name:

+
(tutorial-env) $ python -m pip install novas
+Collecting novas
+  Downloading novas-3.1.1.3.tar.gz (136kB)
+Installing collected packages: novas
+  Running setup.py install for novas
+Successfully installed novas-3.1.1.3
+
+
+

You can also install a specific version of a package by giving the +package name followed by == and the version number:

+
(tutorial-env) $ python -m pip install requests==2.6.0
+Collecting requests==2.6.0
+  Using cached requests-2.6.0-py2.py3-none-any.whl
+Installing collected packages: requests
+Successfully installed requests-2.6.0
+
+
+

If you re-run this command, pip will notice that the requested +version is already installed and do nothing. You can supply a +different version number to get that version, or you can run pip +install --upgrade to upgrade the package to the latest version:

+
(tutorial-env) $ python -m pip install --upgrade requests
+Collecting requests
+Installing collected packages: requests
+  Found existing installation: requests 2.6.0
+    Uninstalling requests-2.6.0:
+      Successfully uninstalled requests-2.6.0
+Successfully installed requests-2.7.0
+
+
+

pip uninstall followed by one or more package names will remove the +packages from the virtual environment.

+

pip show will display information about a particular package:

+
(tutorial-env) $ pip show requests
+---
+Metadata-Version: 2.0
+Name: requests
+Version: 2.7.0
+Summary: Python HTTP for Humans.
+Home-page: http://python-requests.org
+Author: Kenneth Reitz
+Author-email: me@kennethreitz.com
+License: Apache 2.0
+Location: /Users/akuchling/envs/tutorial-env/lib/python3.4/site-packages
+Requires:
+
+
+

pip list will display all of the packages installed in the virtual +environment:

+
(tutorial-env) $ pip list
+novas (3.1.1.3)
+numpy (1.9.2)
+pip (7.0.3)
+requests (2.7.0)
+setuptools (16.0)
+
+
+

pip freeze will produce a similar list of the installed packages, +but the output uses the format that pip install expects. +A common convention is to put this list in a requirements.txt file:

+
(tutorial-env) $ pip freeze > requirements.txt
+(tutorial-env) $ cat requirements.txt
+novas==3.1.1.3
+numpy==1.9.2
+requests==2.7.0
+
+
+

The requirements.txt can then be committed to version control and +shipped as part of an application. Users can then install all the +necessary packages with install -r:

+
(tutorial-env) $ python -m pip install -r requirements.txt
+Collecting novas==3.1.1.3 (from -r requirements.txt (line 1))
+  ...
+Collecting numpy==1.9.2 (from -r requirements.txt (line 2))
+  ...
+Collecting requests==2.7.0 (from -r requirements.txt (line 3))
+  ...
+Installing collected packages: novas, numpy, requests
+  Running setup.py install for novas
+Successfully installed novas-3.1.1.3 numpy-1.9.2 requests-2.7.0
+
+
+

pip has many more options. Consult the Installing Python Modules +guide for complete documentation for pip. When you’ve written +a package and want to make it available on the Python Package Index, +consult the Distributing Python Modules guide.

+
+
+ + +
+
+
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/DOCS/tutorial/whatnow.html b/DOCS/tutorial/whatnow.html new file mode 100644 index 00000000..dfe80689 --- /dev/null +++ b/DOCS/tutorial/whatnow.html @@ -0,0 +1,259 @@ + + + + + + + + + 13. What Now? — Python 3.9.5 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ +
+

13. What Now?¶

+

Reading this tutorial has probably reinforced your interest in using Python — +you should be eager to apply Python to solving your real-world problems. Where +should you go to learn more?

+

This tutorial is part of Python’s documentation set. Some other documents in +the set are:

+
    +
  • The Python Standard Library:

    +

    You should browse through this manual, which gives complete (though terse) +reference material about types, functions, and the modules in the standard +library. The standard Python distribution includes a lot of additional code. +There are modules to read Unix mailboxes, retrieve documents via HTTP, generate +random numbers, parse command-line options, write CGI programs, compress data, +and many other tasks. Skimming through the Library Reference will give you an +idea of what’s available.

    +
  • +
  • Installing Python Modules explains how to install additional modules written +by other Python users.

  • +
  • The Python Language Reference: A detailed explanation of Python’s syntax and +semantics. It’s heavy reading, but is useful as a complete guide to the +language itself.

  • +
+

More Python resources:

+
    +
  • https://www.python.org: The major Python Web site. It contains code, +documentation, and pointers to Python-related pages around the Web. This Web +site is mirrored in various places around the world, such as Europe, Japan, and +Australia; a mirror may be faster than the main site, depending on your +geographical location.

  • +
  • https://docs.python.org: Fast access to Python’s documentation.

  • +
  • https://pypi.org: The Python Package Index, previously also nicknamed +the Cheese Shop 1, is an index of user-created Python modules that are available +for download. Once you begin releasing code, you can register it here so that +others can find it.

  • +
  • https://code.activestate.com/recipes/langs/python/: The Python Cookbook is a +sizable collection of code examples, larger modules, and useful scripts. +Particularly notable contributions are collected in a book also titled Python +Cookbook (O’Reilly & Associates, ISBN 0-596-00797-3.)

  • +
  • http://www.pyvideo.org collects links to Python-related videos from +conferences and user-group meetings.

  • +
  • https://scipy.org: The Scientific Python project includes modules for fast +array computations and manipulations plus a host of packages for such +things as linear algebra, Fourier transforms, non-linear solvers, +random number distributions, statistical analysis and the like.

  • +
+

For Python-related questions and problem reports, you can post to the newsgroup +comp.lang.python, or send them to the mailing list at +python-list@python.org. The newsgroup and mailing list are gatewayed, so +messages posted to one will automatically be forwarded to the other. There are +hundreds of postings a day, asking (and +answering) questions, suggesting new features, and announcing new modules. +Mailing list archives are available at https://mail.python.org/pipermail/.

+

Before posting, be sure to check the list of +Frequently Asked Questions (also called the FAQ). The +FAQ answers many of the questions that come up again and again, and may +already contain the solution for your problem.

+

Footnotes

+
+
1
+

“Cheese Shop†is a Monty Python’s sketch: a customer enters a cheese shop, +but whatever cheese he asks for, the clerk says it’s missing.

+
+
+
+ + +
+
+
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 00000000..e69de29b diff --git a/index.html b/index.html new file mode 100644 index 00000000..7bbd7e2a --- /dev/null +++ b/index.html @@ -0,0 +1,11 @@ + + + +Site Navigation + + + + + + + \ No newline at end of file diff --git a/learn-python3-samples/advance/do_generator.py b/learn-python3-samples/advance/do_generator.py new file mode 100644 index 00000000..4c89afc0 --- /dev/null +++ b/learn-python3-samples/advance/do_generator.py @@ -0,0 +1,31 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +s = (x * x for x in range(5)) +print(s) +for x in s: + print(x) + +def fib(max): + n, a, b = 0, 0, 1 + while n < max: + yield b + a, b = b, a + b + n = n + 1 + return 'done' + +f = fib(10) +print('fib(10):', f) +for x in f: + print(x) + +# call generator manually: +g = fib(5) +while 1: + try: + x = next(g) + print('g:', x) + except StopIteration as e: + print('Generator return value:', e.value) + break + diff --git a/learn-python3-samples/advance/do_iter.py b/learn-python3-samples/advance/do_iter.py new file mode 100644 index 00000000..0ded6af4 --- /dev/null +++ b/learn-python3-samples/advance/do_iter.py @@ -0,0 +1,64 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +from collections.abc import Iterable, Iterator + +def g(): + yield 1 + yield 2 + yield 3 + +print('Iterable? [1, 2, 3]:', isinstance([1, 2, 3], Iterable)) +print('Iterable? \'abc\':', isinstance('abc', Iterable)) +print('Iterable? 123:', isinstance(123, Iterable)) +print('Iterable? g():', isinstance(g(), Iterable)) + +print('Iterator? [1, 2, 3]:', isinstance([1, 2, 3], Iterator)) +print('Iterator? iter([1, 2, 3]):', isinstance(iter([1, 2, 3]), Iterator)) +print('Iterator? \'abc\':', isinstance('abc', Iterator)) +print('Iterator? 123:', isinstance(123, Iterator)) +print('Iterator? g():', isinstance(g(), Iterator)) + +# iter list: +print('for x in [1, 2, 3, 4, 5]:') +for x in [1, 2, 3, 4, 5]: + print(x) + +print('for x in iter([1, 2, 3, 4, 5]):') +for x in iter([1, 2, 3, 4, 5]): + print(x) + +print('next():') +it = iter([1, 2, 3, 4, 5]) +print(next(it)) +print(next(it)) +print(next(it)) +print(next(it)) +print(next(it)) + +d = {'a': 1, 'b': 2, 'c': 3} + +# iter each key: +print('iter key:', d) +for k in d.keys(): + print('key:', k) + +# iter each value: +print('iter value:', d) +for v in d.values(): + print('value:', v) + +# iter both key and value: +print('iter item:', d) +for k, v in d.items(): + print('item:', k, v) + +# iter list with index: +print('iter enumerate([\'A\', \'B\', \'C\']') +for i, value in enumerate(['A', 'B', 'C']): + print(i, value) + +# iter complex list: +print('iter [(1, 1), (2, 4), (3, 9)]:') +for x, y in [(1, 1), (2, 4), (3, 9)]: + print(x, y) diff --git a/learn-python3-samples/advance/do_listcompr.py b/learn-python3-samples/advance/do_listcompr.py new file mode 100644 index 00000000..328d5c5a --- /dev/null +++ b/learn-python3-samples/advance/do_listcompr.py @@ -0,0 +1,12 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +print([x * x for x in range(1, 11)]) +print([x * x for x in range(1, 11) if x % 2 == 0]) +print([m + n for m in 'ABC' for n in 'XYZ']) + +d = {'x': 'A', 'y': 'B', 'z': 'C' } +print([k + '=' + v for k, v in d.items()]) + +L = ['Hello', 'World', 'IBM', 'Apple'] +print([s.lower() for s in L]) diff --git a/learn-python3-samples/advance/do_slice.py b/learn-python3-samples/advance/do_slice.py new file mode 100644 index 00000000..fd8d7c69 --- /dev/null +++ b/learn-python3-samples/advance/do_slice.py @@ -0,0 +1,16 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +L = ['Michael', 'Sarah', 'Tracy', 'Bob', 'Jack'] + +print('L[0:3] =', L[0:3]) +print('L[:3] =', L[:3]) +print('L[1:3] =', L[1:3]) +print('L[-2:] =', L[-2:]) + +R = list(range(100)) +print('R[:10] =', R[:10]) +print('R[-10:] =', R[-10:]) +print('R[10:20] =', R[10:20]) +print('R[:10:2] =', R[:10:2]) +print('R[::5] =', R[::5]) diff --git a/learn-python3-samples/advance/do_yield.py b/learn-python3-samples/advance/do_yield.py new file mode 100644 index 00000000..8615284a --- /dev/null +++ b/learn-python3-samples/advance/do_yield.py @@ -0,0 +1,29 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +def each_ascii(s): + for ch in s: + yield ord(ch) + return '%s chars' % len(s) + +def yield_from(s): + r = yield from each_ascii(s) + print(r) + +def main(): + for x in each_ascii('abc'): + print(x) # => 'a', 'b', 'c' + it = each_ascii('xyz') + try: + while True: + print(next(it)) # => 'x', 'y', 'z' + except StopIteration as s: + print(s.value) # => '3 chars' + + # using yield from in main() will change main() from function to generator: + # r = yield from each_ascii('hello') + + for ch in yield_from('hello'): + pass + +main() diff --git a/learn-python3-samples/advance/right.html b/learn-python3-samples/advance/right.html new file mode 100644 index 00000000..2f3e6ee0 --- /dev/null +++ b/learn-python3-samples/advance/right.html @@ -0,0 +1,30 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/learn-python3-samples/advance + + + + + + + + +
Folders
<Go Back>
+
+ + + + + +
FileFileFileFile
do_generator.py do_listcompr.py do_slice.py do_yield.py 
do_iter.py 
+ +

+Folders: 1
+Files: 5
+Size of all files: 3337 KB

+ + + \ No newline at end of file diff --git a/learn-python3-samples/async/aio_web.py b/learn-python3-samples/async/aio_web.py new file mode 100644 index 00000000..9a65c74f --- /dev/null +++ b/learn-python3-samples/async/aio_web.py @@ -0,0 +1,33 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +__author__ = 'Michael Liao' + +''' +async web application. +''' + +import asyncio + +from aiohttp import web + +async def index(request): + await asyncio.sleep(0.5) + return web.Response(body=b'

Index

') + +async def hello(request): + await asyncio.sleep(0.5) + text = '

hello, %s!

' % request.match_info['name'] + return web.Response(body=text.encode('utf-8')) + +async def init(loop): + app = web.Application(loop=loop) + app.router.add_route('GET', '/', index) + app.router.add_route('GET', '/hello/{name}', hello) + srv = await loop.create_server(app.make_handler(), '127.0.0.1', 8000) + print('Server started at http://127.0.0.1:8000...') + return srv + +loop = asyncio.get_event_loop() +loop.run_until_complete(init(loop)) +loop.run_forever() diff --git a/learn-python3-samples/async/async_hello.py b/learn-python3-samples/async/async_hello.py new file mode 100644 index 00000000..02ee490c --- /dev/null +++ b/learn-python3-samples/async/async_hello.py @@ -0,0 +1,16 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +import threading +import asyncio + +@asyncio.coroutine +def hello(): + print('Hello world! (%s)' % threading.currentThread()) + yield from asyncio.sleep(1) + print('Hello again! (%s)' % threading.currentThread()) + +loop = asyncio.get_event_loop() +tasks = [hello(), hello()] +loop.run_until_complete(asyncio.wait(tasks)) +loop.close() diff --git a/learn-python3-samples/async/async_hello2.py b/learn-python3-samples/async/async_hello2.py new file mode 100644 index 00000000..aac074dc --- /dev/null +++ b/learn-python3-samples/async/async_hello2.py @@ -0,0 +1,15 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +import threading +import asyncio + +async def hello(): + print('Hello world! (%s)' % threading.currentThread()) + await asyncio.sleep(1) + print('Hello again! (%s)' % threading.currentThread()) + +loop = asyncio.get_event_loop() +tasks = [hello(), hello()] +loop.run_until_complete(asyncio.wait(tasks)) +loop.close() diff --git a/learn-python3-samples/async/async_wget.py b/learn-python3-samples/async/async_wget.py new file mode 100644 index 00000000..ec0c90da --- /dev/null +++ b/learn-python3-samples/async/async_wget.py @@ -0,0 +1,25 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +import asyncio + +@asyncio.coroutine +def wget(host): + print('wget %s...' % host) + connect = asyncio.open_connection(host, 80) + reader, writer = yield from connect + header = 'GET / HTTP/1.0\r\nHost: %s\r\n\r\n' % host + writer.write(header.encode('utf-8')) + yield from writer.drain() + while True: + line = yield from reader.readline() + if line == b'\r\n': + break + print('%s header > %s' % (host, line.decode('utf-8').rstrip())) + # Ignore the body, close the socket + writer.close() + +loop = asyncio.get_event_loop() +tasks = [wget(host) for host in ['www.sina.com.cn', 'www.sohu.com', 'www.163.com']] +loop.run_until_complete(asyncio.wait(tasks)) +loop.close() diff --git a/learn-python3-samples/async/async_wget2.py b/learn-python3-samples/async/async_wget2.py new file mode 100644 index 00000000..aac074dc --- /dev/null +++ b/learn-python3-samples/async/async_wget2.py @@ -0,0 +1,15 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +import threading +import asyncio + +async def hello(): + print('Hello world! (%s)' % threading.currentThread()) + await asyncio.sleep(1) + print('Hello again! (%s)' % threading.currentThread()) + +loop = asyncio.get_event_loop() +tasks = [hello(), hello()] +loop.run_until_complete(asyncio.wait(tasks)) +loop.close() diff --git a/learn-python3-samples/async/coroutine.py b/learn-python3-samples/async/coroutine.py new file mode 100644 index 00000000..5fa2b6a3 --- /dev/null +++ b/learn-python3-samples/async/coroutine.py @@ -0,0 +1,24 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +def consumer(): + r = '' + while True: + n = yield r + if not n: + return + print('[CONSUMER] Consuming %s...' % n) + r = '200 OK' + +def produce(c): + c.send(None) + n = 0 + while n < 5: + n = n + 1 + print('[PRODUCER] Producing %s...' % n) + r = c.send(n) + print('[PRODUCER] Consumer return: %s' % r) + c.close() + +c = consumer() +produce(c) diff --git a/learn-python3-samples/async/right.html b/learn-python3-samples/async/right.html new file mode 100644 index 00000000..ff8a65fd --- /dev/null +++ b/learn-python3-samples/async/right.html @@ -0,0 +1,30 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/learn-python3-samples/async + + + + + + + + +
Folders
<Go Back>
+
+ + + + + +
FileFileFileFile
aio_web.py async_hello2.py async_wget2.py coroutine.py 
async_hello.py async_wget.py 
+ +

+Folders: 1
+Files: 6
+Size of all files: 3139 KB

+ + + \ No newline at end of file diff --git a/learn-python3-samples/basic/do_for.py b/learn-python3-samples/basic/do_for.py new file mode 100644 index 00000000..8db278f4 --- /dev/null +++ b/learn-python3-samples/basic/do_for.py @@ -0,0 +1,11 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +# 打å°list: +names = ['Michael', 'Bob', 'Tracy'] +for name in names: + print(name) + +# 打å°æ•°å­— 0 - 9 +for x in range(10): + print(x) diff --git a/learn-python3-samples/basic/do_if.py b/learn-python3-samples/basic/do_if.py new file mode 100644 index 00000000..c0c16d7a --- /dev/null +++ b/learn-python3-samples/basic/do_if.py @@ -0,0 +1,15 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +# 注æ„: +# input()返回的是字符串 +# 必须通过int()将字符串转æ¢ä¸ºæ•´æ•° +# æ‰èƒ½ç”¨äºŽæ•°å€¼æ¯”较: +age = int(input('Input your age: ')) + +if age >= 18: + print('adult') +elif age >= 6: + print('teenager') +else: + print('kid') diff --git a/learn-python3-samples/basic/do_input.py b/learn-python3-samples/basic/do_input.py new file mode 100644 index 00000000..783523a1 --- /dev/null +++ b/learn-python3-samples/basic/do_input.py @@ -0,0 +1,5 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +name = input() +print('Hello,', name) diff --git a/learn-python3-samples/basic/do_print.py b/learn-python3-samples/basic/do_print.py new file mode 100644 index 00000000..1330003f --- /dev/null +++ b/learn-python3-samples/basic/do_print.py @@ -0,0 +1,7 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +print('The quick brown fox', 'jumps over', 'the lazy dog') +print(300) +print(100 + 200) +print('100 + 200 =', 100 + 200) diff --git a/learn-python3-samples/basic/do_while.py b/learn-python3-samples/basic/do_while.py new file mode 100644 index 00000000..f2b5b807 --- /dev/null +++ b/learn-python3-samples/basic/do_while.py @@ -0,0 +1,18 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +# 计算1+2+3+...+100: +sum = 0 +n = 1 +while n <= 100: + sum = sum + n + n = n + 1 +print(sum) + +# 计算1x2x3x...x100: +acc = 1 +n = 1 +while n <= 100: + acc = acc * n + n = n + 1 +print(acc) diff --git a/learn-python3-samples/basic/hello.py b/learn-python3-samples/basic/hello.py new file mode 100644 index 00000000..0c867109 --- /dev/null +++ b/learn-python3-samples/basic/hello.py @@ -0,0 +1,4 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +print('Hello, world') diff --git a/learn-python3-samples/basic/right.html b/learn-python3-samples/basic/right.html new file mode 100644 index 00000000..c680eee6 --- /dev/null +++ b/learn-python3-samples/basic/right.html @@ -0,0 +1,31 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/learn-python3-samples/basic + + + + + + + + +
Folders
<Go Back>
+
+ + + + + + +
FileFileFileFile
do_for.py do_print.py the_dict.py the_string.py 
do_if.py do_while.py the_list.py the_tuple.py 
do_input.py hello.py the_set.py 
+ +

+Folders: 1
+Files: 11
+Size of all files: 2340 KB

+ + + \ No newline at end of file diff --git a/learn-python3-samples/basic/the_dict.py b/learn-python3-samples/basic/the_dict.py new file mode 100644 index 00000000..edd90fff --- /dev/null +++ b/learn-python3-samples/basic/the_dict.py @@ -0,0 +1,12 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +d = { + 'Michael': 95, + 'Bob': 75, + 'Tracy': 85 +} +print('d[\'Michael\'] =', d['Michael']) +print('d[\'Bob\'] =', d['Bob']) +print('d[\'Tracy\'] =', d['Tracy']) +print('d.get(\'Thomas\', -1) =', d.get('Thomas', -1)) diff --git a/learn-python3-samples/basic/the_list.py b/learn-python3-samples/basic/the_list.py new file mode 100644 index 00000000..8dac133f --- /dev/null +++ b/learn-python3-samples/basic/the_list.py @@ -0,0 +1,12 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +classmates = ['Michael', 'Bob', 'Tracy'] +print('classmates =', classmates) +print('len(classmates) =', len(classmates)) +print('classmates[0] =', classmates[0]) +print('classmates[1] =', classmates[1]) +print('classmates[2] =', classmates[2]) +print('classmates[-1] =', classmates[-1]) +classmates.pop() +print('classmates =', classmates) diff --git a/learn-python3-samples/basic/the_set.py b/learn-python3-samples/basic/the_set.py new file mode 100644 index 00000000..67162e6a --- /dev/null +++ b/learn-python3-samples/basic/the_set.py @@ -0,0 +1,8 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +s1 = set([1, 1, 2, 2, 3, 3]) +print(s1) +s2 = set([2, 3, 4]) +print(s1 & s2) +print(s1 | s2) diff --git a/learn-python3-samples/basic/the_string.py b/learn-python3-samples/basic/the_string.py new file mode 100644 index 00000000..41c41fb2 --- /dev/null +++ b/learn-python3-samples/basic/the_string.py @@ -0,0 +1,8 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +s = 'Python-中文' +print(s) +b = s.encode('utf-8') +print(b) +print(b.decode('utf-8')) diff --git a/learn-python3-samples/basic/the_tuple.py b/learn-python3-samples/basic/the_tuple.py new file mode 100644 index 00000000..382c3aa7 --- /dev/null +++ b/learn-python3-samples/basic/the_tuple.py @@ -0,0 +1,13 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +classmates = ('Michael', 'Bob', 'Tracy') +print('classmates =', classmates) +print('len(classmates) =', len(classmates)) +print('classmates[0] =', classmates[0]) +print('classmates[1] =', classmates[1]) +print('classmates[2] =', classmates[2]) +print('classmates[-1] =', classmates[-1]) + +# cannot modify tuple: +classmates[0] = 'Adam' diff --git a/learn-python3-samples/commonlib/check_bmp.py b/learn-python3-samples/commonlib/check_bmp.py new file mode 100644 index 00000000..f55c1f63 --- /dev/null +++ b/learn-python3-samples/commonlib/check_bmp.py @@ -0,0 +1,8 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +import struct + +bmp_header = b'\x42\x4d\x38\x8c\x0a\x00\x00\x00\x00\x00\x36\x00\x00\x00\x28\x00\x00\x00\x80\x02\x00\x00\x68\x01\x00\x00\x01\x00\x18\x00' + +print(struct.unpack(' + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/learn-python3-samples/commonlib + + + + + + + + +
Folders
<Go Back>
+
+ + + + + + +
FileFileFileFile
check_bmp.py use_collections.py use_htmlparser.py use_sax.py 
do_base64.py use_datetime.py use_itertools.py use_urllib.py 
use_chainmap.py use_hashlib.py 
+ +

+Folders: 1
+Files: 10
+Size of all files: 7158 KB

+ + + \ No newline at end of file diff --git a/learn-python3-samples/commonlib/use_chainmap.py b/learn-python3-samples/commonlib/use_chainmap.py new file mode 100644 index 00000000..406e29e0 --- /dev/null +++ b/learn-python3-samples/commonlib/use_chainmap.py @@ -0,0 +1,20 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +from collections import ChainMap +import os, argparse + +defaults = { + 'color': 'red', + 'user': 'guest' +} + +parser = argparse.ArgumentParser() +parser.add_argument('-u', '--user') +parser.add_argument('-c', '--color') +namespace = parser.parse_args() +command_line_args = { k: v for k, v in vars(namespace).items() if v } + +combined = ChainMap(command_line_args, os.environ, defaults) +print('color=%s' % combined['color']) +print('user=%s' % combined['user']) diff --git a/learn-python3-samples/commonlib/use_collections.py b/learn-python3-samples/commonlib/use_collections.py new file mode 100644 index 00000000..c4dc10cd --- /dev/null +++ b/learn-python3-samples/commonlib/use_collections.py @@ -0,0 +1,28 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +from collections import namedtuple + +Point = namedtuple('Point', ['x', 'y']) +p = Point(1, 2) +print('Point:', p.x, p.y) + +from collections import deque + +q = deque(['a', 'b', 'c']) +q.append('x') +q.appendleft('y') +print(q) + +from collections import defaultdict + +dd = defaultdict(lambda: 'N/A') +dd['key1'] = 'abc' +print('dd[\'key1\'] =', dd['key1']) +print('dd[\'key2\'] =', dd['key2']) + +from collections import Counter +c = Counter() +for ch in 'programming': + c[ch] = c[ch] + 1 +print(c) diff --git a/learn-python3-samples/commonlib/use_datetime.py b/learn-python3-samples/commonlib/use_datetime.py new file mode 100644 index 00000000..625fad85 --- /dev/null +++ b/learn-python3-samples/commonlib/use_datetime.py @@ -0,0 +1,40 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +from datetime import datetime, timedelta, timezone + +# 获å–当å‰datetime: +now = datetime.now() +print('now =', now) +print('type(now) =', type(now)) + +# 用指定日期时间创建datetime: +dt = datetime(2015, 4, 19, 12, 20) +print('dt =', dt) + +# 把datetime转æ¢ä¸ºtimestamp: +print('datetime -> timestamp:', dt.timestamp()) + +# 把timestamp转æ¢ä¸ºdatetime: +t = dt.timestamp() +print('timestamp -> datetime:', datetime.fromtimestamp(t)) +print('timestamp -> datetime as UTC+0:', datetime.utcfromtimestamp(t)) + +# 从str读å–datetime: +cday = datetime.strptime('2015-6-1 18:19:59', '%Y-%m-%d %H:%M:%S') +print('strptime:', cday) + +# 把datetimeæ ¼å¼åŒ–输出: +print('strftime:', cday.strftime('%a, %b %d %H:%M')) + +# 对日期进行加å‡: +print('current datetime =', cday) +print('current + 10 hours =', cday + timedelta(hours=10)) +print('current - 1 day =', cday - timedelta(days=1)) +print('current + 2.5 days =', cday + timedelta(days=2, hours=12)) + +# 把时间从UTC+0时区转æ¢ä¸ºUTC+8: +utc_dt = datetime.utcnow().replace(tzinfo=timezone.utc) +utc8_dt = utc_dt.astimezone(timezone(timedelta(hours=8))) +print('UTC+0:00 now =', utc_dt) +print('UTC+8:00 now =', utc8_dt) diff --git a/learn-python3-samples/commonlib/use_hashlib.py b/learn-python3-samples/commonlib/use_hashlib.py new file mode 100644 index 00000000..e6480b2c --- /dev/null +++ b/learn-python3-samples/commonlib/use_hashlib.py @@ -0,0 +1,13 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +import hashlib + +md5 = hashlib.md5() +md5.update('how to use md5 in python hashlib?'.encode('utf-8')) +print(md5.hexdigest()) + +sha1 = hashlib.sha1() +sha1.update('how to use sha1 in '.encode('utf-8')) +sha1.update('python hashlib?'.encode('utf-8')) +print(sha1.hexdigest()) diff --git a/learn-python3-samples/commonlib/use_htmlparser.py b/learn-python3-samples/commonlib/use_htmlparser.py new file mode 100644 index 00000000..29e7b1ac --- /dev/null +++ b/learn-python3-samples/commonlib/use_htmlparser.py @@ -0,0 +1,36 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +from html.parser import HTMLParser +from html.entities import name2codepoint + +class MyHTMLParser(HTMLParser): + + def handle_starttag(self, tag, attrs): + print('<%s>' % tag) + + def handle_endtag(self, tag): + print('' % tag) + + def handle_startendtag(self, tag, attrs): + print('<%s/>' % tag) + + def handle_data(self, data): + print(data) + + def handle_comment(self, data): + print('') + + def handle_entityref(self, name): + print('&%s;' % name) + + def handle_charref(self, name): + print('&#%s;' % name) + +parser = MyHTMLParser() +parser.feed(''' + + + +

Some html HTML tutorial...
END

+''') diff --git a/learn-python3-samples/commonlib/use_itertools.py b/learn-python3-samples/commonlib/use_itertools.py new file mode 100644 index 00000000..65a908c1 --- /dev/null +++ b/learn-python3-samples/commonlib/use_itertools.py @@ -0,0 +1,18 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +import itertools + +natuals = itertools.count(1) +for n in natuals: + print(n) + if n >= 100: + break + +cs = itertools.cycle('ABC') +t = 10 +for c in cs: + print(c) + t = t - 1 + if t == 0: + break diff --git a/learn-python3-samples/commonlib/use_sax.py b/learn-python3-samples/commonlib/use_sax.py new file mode 100644 index 00000000..c8bb8bae --- /dev/null +++ b/learn-python3-samples/commonlib/use_sax.py @@ -0,0 +1,28 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +from xml.parsers.expat import ParserCreate + +class DefaultSaxHandler(object): + def start_element(self, name, attrs): + print('sax:start_element: %s, attrs: %s' % (name, str(attrs))) + + def end_element(self, name): + print('sax:end_element: %s' % name) + + def char_data(self, text): + print('sax:char_data: %s' % text) + +xml = r''' +
    +
  1. Python
  2. +
  3. Ruby
  4. +
+''' + +handler = DefaultSaxHandler() +parser = ParserCreate() +parser.StartElementHandler = handler.start_element +parser.EndElementHandler = handler.end_element +parser.CharacterDataHandler = handler.char_data +parser.Parse(xml) diff --git a/learn-python3-samples/commonlib/use_urllib.py b/learn-python3-samples/commonlib/use_urllib.py new file mode 100644 index 00000000..fb677545 --- /dev/null +++ b/learn-python3-samples/commonlib/use_urllib.py @@ -0,0 +1,58 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +from urllib import request, parse + +# get: + +with request.urlopen('https://api.douban.com/v2/book/2129650') as f: + data = f.read() + print('Status:', f.status, f.reason) + for k, v in f.getheaders(): + print('%s: %s' % (k, v)) + print('Data:', data.decode('utf-8')) + +# advanced get: + +req = request.Request('http://www.douban.com/') +req.add_header('User-Agent', 'Mozilla/6.0 (iPhone; CPU iPhone OS 8_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/8.0 Mobile/10A5376e Safari/8536.25') +with request.urlopen(req) as f: + print('Status:', f.status, f.reason) + for k, v in f.getheaders(): + print('%s: %s' % (k, v)) + print('Data:', f.read().decode('utf-8')) + +# post: + +print('Login to weibo.cn...') +email = input('Email: ') +passwd = input('Password: ') +login_data = parse.urlencode([ + ('username', email), + ('password', passwd), + ('entry', 'mweibo'), + ('client_id', ''), + ('savestate', '1'), + ('ec', ''), + ('pagerefer', 'https://passport.weibo.cn/signin/welcome?entry=mweibo&r=http%3A%2F%2Fm.weibo.cn%2F%3Fjumpfrom%3Dweibocom&jumpfrom=weibocom') +]) + +req = request.Request('https://passport.weibo.cn/sso/login') +req.add_header('Origin', 'https://passport.weibo.cn') +req.add_header('User-Agent', 'Mozilla/6.0 (iPhone; CPU iPhone OS 8_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/8.0 Mobile/10A5376e Safari/8536.25') +req.add_header('Referer', 'https://passport.weibo.cn/signin/login?entry=mweibo&res=wel&wm=3349&r=http%3A%2F%2Fm.weibo.cn%2F%3Fjumpfrom%3Dweibocom') + +with request.urlopen(req, data=login_data.encode('utf-8')) as f: + print('Status:', f.status, f.reason) + for k, v in f.getheaders(): + print('%s: %s' % (k, v)) + print('Data:', f.read().decode('utf-8')) + +# with proxy and proxy auth: + +proxy_handler = urllib.request.ProxyHandler({'http': 'http://www.example.com:3128/'}) +proxy_auth_handler = urllib.request.ProxyBasicAuthHandler() +proxy_auth_handler.add_password('realm', 'host', 'username', 'password') +opener = urllib.request.build_opener(proxy_handler, proxy_auth_handler) +with opener.open('http://www.example.com/login.html') as f: + pass diff --git a/learn-python3-samples/context/do_closing.py b/learn-python3-samples/context/do_closing.py new file mode 100644 index 00000000..320f1f72 --- /dev/null +++ b/learn-python3-samples/context/do_closing.py @@ -0,0 +1,17 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +from contextlib import contextmanager + +@contextmanager +def closing(fname): + f = None + try: + f = open(fname, 'r') + yield f + finally: + if f: + f.close() + +with closing('test.txt') as f: + print(f.read()) diff --git a/learn-python3-samples/context/do_suppress.py b/learn-python3-samples/context/do_suppress.py new file mode 100644 index 00000000..3a750c4b --- /dev/null +++ b/learn-python3-samples/context/do_suppress.py @@ -0,0 +1,11 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +import os + +from contextlib import suppress + +with suppress(FileNotFoundError): + os.remove('tempfile.1') + os.remove('tempfile.2') + os.remove('tempfile.3') diff --git a/learn-python3-samples/context/do_with.py b/learn-python3-samples/context/do_with.py new file mode 100644 index 00000000..073399ed --- /dev/null +++ b/learn-python3-samples/context/do_with.py @@ -0,0 +1,14 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +from contextlib import contextmanager + +@contextmanager +def log(name): + print('[%s] start...' % name) + yield + print('[%s] end.' % name) + +with log('DEBUG'): + print('Hello, world!') + print('Hello, Python!') diff --git a/learn-python3-samples/context/right.html b/learn-python3-samples/context/right.html new file mode 100644 index 00000000..90d27b8f --- /dev/null +++ b/learn-python3-samples/context/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/learn-python3-samples/context + + + + + + + + +
Folders
<Go Back>
+
+ + + + +
FileFileFileFile
do_closing.py do_suppress.py do_with.py 
+ +

+Folders: 1
+Files: 3
+Size of all files: 768 KB

+ + + \ No newline at end of file diff --git a/learn-python3-samples/db/do_mysql.py b/learn-python3-samples/db/do_mysql.py new file mode 100644 index 00000000..d1d1db8d --- /dev/null +++ b/learn-python3-samples/db/do_mysql.py @@ -0,0 +1,31 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +########## prepare ########## + +# install mysql-connector-python: +# pip3 install mysql-connector-python --allow-external mysql-connector-python + +import mysql.connector + +# change root password to yours: +conn = mysql.connector.connect(user='root', password='password', database='test') + +cursor = conn.cursor() +# 创建user表: +cursor.execute('create table user (id varchar(20) primary key, name varchar(20))') +# æ’入一行记录,注æ„MySQLçš„å ä½ç¬¦æ˜¯%s: +cursor.execute('insert into user (id, name) values (%s, %s)', ('1', 'Michael')) +print('rowcount =', cursor.rowcount) +# æ交事务: +conn.commit() +cursor.close() + +# è¿è¡ŒæŸ¥è¯¢: +cursor = conn.cursor() +cursor.execute('select * from user where id = %s', ('1',)) +values = cursor.fetchall() +print(values) +# 关闭Cursorå’ŒConnection: +cursor.close() +conn.close() diff --git a/learn-python3-samples/db/do_sqlalchemy.py b/learn-python3-samples/db/do_sqlalchemy.py new file mode 100644 index 00000000..85f137d4 --- /dev/null +++ b/learn-python3-samples/db/do_sqlalchemy.py @@ -0,0 +1,44 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +from sqlalchemy import Column, String, create_engine +from sqlalchemy.orm import sessionmaker +from sqlalchemy.ext.declarative import declarative_base + +# 创建对象的基类: +Base = declarative_base() + +# 定义User对象: +class User(Base): + # 表的åå­—: + __tablename__ = 'user' + + # 表的结构: + id = Column(String(20), primary_key=True) + name = Column(String(20)) + +# åˆå§‹åŒ–æ•°æ®åº“连接: +engine = create_engine('mysql+mysqlconnector://root:password@localhost:3306/test') +# 创建DBSession类型: +DBSession = sessionmaker(bind=engine) + +# 创建session对象: +session = DBSession() +# 创建新User对象: +new_user = User(id='5', name='Bob') +# 添加到session: +session.add(new_user) +# æ交å³ä¿å­˜åˆ°æ•°æ®åº“: +session.commit() +# 关闭session: +session.close() + +# 创建Session: +session = DBSession() +# 创建Query查询,filter是whereæ¡ä»¶ï¼Œæœ€åŽè°ƒç”¨one()返回唯一行,如果调用all()则返回所有行: +user = session.query(User).filter(User.id=='5').one() +# 打å°ç±»åž‹å’Œå¯¹è±¡çš„name属性: +print('type:', type(user)) +print('name:', user.name) +# 关闭Session: +session.close() diff --git a/learn-python3-samples/db/do_sqlite.py b/learn-python3-samples/db/do_sqlite.py new file mode 100644 index 00000000..dd36b7e7 --- /dev/null +++ b/learn-python3-samples/db/do_sqlite.py @@ -0,0 +1,34 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +import sqlite3 + +# 连接到SQLiteæ•°æ®åº“ +# æ•°æ®åº“文件是test.db +# 如果文件ä¸å­˜åœ¨ï¼Œä¼šè‡ªåŠ¨åœ¨å½“å‰ç›®å½•åˆ›å»º: +conn = sqlite3.connect('test.db') +# 创建一个Cursor: +cursor = conn.cursor() +# 执行一æ¡SQL语å¥ï¼Œåˆ›å»ºuser表: +cursor.execute('create table user (id varchar(20) primary key, name varchar(20))') +# 继续执行一æ¡SQL语å¥ï¼Œæ’入一æ¡è®°å½•: +cursor.execute('insert into user (id, name) values (\'1\', \'Michael\')') +# 通过rowcount获得æ’入的行数: +print('rowcount =', cursor.rowcount) +# 关闭Cursor: +cursor.close() +# æ交事务: +conn.commit() +# 关闭Connection: +conn.close() + +# 查询记录: +conn = sqlite3.connect('test.db') +cursor = conn.cursor() +# 执行查询语å¥: +cursor.execute('select * from user where id=?', '1') +# 获得查询结果集: +values = cursor.fetchall() +print(values) +cursor.close() +conn.close() diff --git a/learn-python3-samples/db/right.html b/learn-python3-samples/db/right.html new file mode 100644 index 00000000..53bf5e40 --- /dev/null +++ b/learn-python3-samples/db/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/learn-python3-samples/db + + + + + + + + +
Folders
<Go Back>
+
+ + + + +
FileFileFileFile
do_mysql.py do_sqlalchemy.py do_sqlite.py 
+ +

+Folders: 1
+Files: 3
+Size of all files: 2958 KB

+ + + \ No newline at end of file diff --git a/learn-python3-samples/debug/do_assert.py b/learn-python3-samples/debug/do_assert.py new file mode 100644 index 00000000..b94bd70d --- /dev/null +++ b/learn-python3-samples/debug/do_assert.py @@ -0,0 +1,12 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +def foo(s): + n = int(s) + assert n != 0, 'n is zero!' + return 10 / n + +def main(): + foo('0') + +main() diff --git a/learn-python3-samples/debug/do_logging.py b/learn-python3-samples/debug/do_logging.py new file mode 100644 index 00000000..a4b94179 --- /dev/null +++ b/learn-python3-samples/debug/do_logging.py @@ -0,0 +1,10 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +import logging +logging.basicConfig(level=logging.INFO) + +s = '0' +n = int(s) +logging.info('n = %d' % n) +print(10 / n) diff --git a/learn-python3-samples/debug/do_pdb.py b/learn-python3-samples/debug/do_pdb.py new file mode 100644 index 00000000..8e228833 --- /dev/null +++ b/learn-python3-samples/debug/do_pdb.py @@ -0,0 +1,9 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +import pdb + +s = '0' +n = int(s) +pdb.set_trace() # è¿è¡Œåˆ°è¿™é‡Œä¼šè‡ªåŠ¨æš‚åœ +print(10 / n) diff --git a/learn-python3-samples/debug/do_try.py b/learn-python3-samples/debug/do_try.py new file mode 100644 index 00000000..91338563 --- /dev/null +++ b/learn-python3-samples/debug/do_try.py @@ -0,0 +1,12 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +try: + print('try...') + r = 10 / 0 + print('result:', r) +except ZeroDivisionError as e: + print('except:', e) +finally: + print('finally...') +print('END') diff --git a/learn-python3-samples/debug/err.py b/learn-python3-samples/debug/err.py new file mode 100644 index 00000000..918880e6 --- /dev/null +++ b/learn-python3-samples/debug/err.py @@ -0,0 +1,12 @@ +# err.py +def foo(s): + return 10 / int(s) + +def bar(s): + return foo(s) * 2 + +def main(): + bar('0') + +main() + diff --git a/learn-python3-samples/debug/err_logging.py b/learn-python3-samples/debug/err_logging.py new file mode 100644 index 00000000..31f6a8c4 --- /dev/null +++ b/learn-python3-samples/debug/err_logging.py @@ -0,0 +1,19 @@ +# err_logging.py + +import logging + +def foo(s): + return 10 / int(s) + +def bar(s): + return foo(s) * 2 + +def main(): + try: + bar('0') + except Exception as e: + logging.exception(e) + +main() +print('END') + diff --git a/learn-python3-samples/debug/err_raise.py b/learn-python3-samples/debug/err_raise.py new file mode 100644 index 00000000..f057367a --- /dev/null +++ b/learn-python3-samples/debug/err_raise.py @@ -0,0 +1,12 @@ +# err_raise.py +class FooError(ValueError): + pass + +def foo(s): + n = int(s) + if n==0: + raise FooError('invalid value: %s' % s) + return 10 / n + +foo('0') + diff --git a/learn-python3-samples/debug/err_reraise.py b/learn-python3-samples/debug/err_reraise.py new file mode 100644 index 00000000..21b802bc --- /dev/null +++ b/learn-python3-samples/debug/err_reraise.py @@ -0,0 +1,17 @@ +# err_reraise.py + +def foo(s): + n = int(s) + if n==0: + raise ValueError('invalid value: %s' % s) + return 10 / n + +def bar(): + try: + foo('0') + except ValueError as e: + print('ValueError!') + raise + +bar() + diff --git a/learn-python3-samples/debug/mydict.py b/learn-python3-samples/debug/mydict.py new file mode 100644 index 00000000..cc9463aa --- /dev/null +++ b/learn-python3-samples/debug/mydict.py @@ -0,0 +1,14 @@ +class Dict(dict): + + def __init__(self, **kw): + super().__init__(**kw) + + def __getattr__(self, key): + try: + return self[key] + except KeyError: + raise AttributeError(r"'Dict' object has no attribute '%s'" % key) + + def __setattr__(self, key, value): + self[key] = value + diff --git a/learn-python3-samples/debug/mydict2.py b/learn-python3-samples/debug/mydict2.py new file mode 100644 index 00000000..b7d0cac6 --- /dev/null +++ b/learn-python3-samples/debug/mydict2.py @@ -0,0 +1,42 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +class Dict(dict): + ''' + Simple dict but also support access as x.y style. + + >>> d1 = Dict() + >>> d1['x'] = 100 + >>> d1.x + 100 + >>> d1.y = 200 + >>> d1['y'] + 200 + >>> d2 = Dict(a=1, b=2, c='3') + >>> d2.c + '3' + >>> d2['empty'] + Traceback (most recent call last): + ... + KeyError: 'empty' + >>> d2.empty + Traceback (most recent call last): + ... + AttributeError: 'Dict' object has no attribute 'empty' + ''' + def __init__(self, **kw): + super(Dict, self).__init__(**kw) + + def __getattr__(self, key): + try: + return self[key] + except KeyError: + raise AttributeError(r"'Dict' object has no attribute '%s'" % key) + + def __setattr__(self, key, value): + self[key] = value + +if __name__=='__main__': + import doctest + doctest.testmod() + diff --git a/learn-python3-samples/debug/mydict_test.py b/learn-python3-samples/debug/mydict_test.py new file mode 100644 index 00000000..f6cc881a --- /dev/null +++ b/learn-python3-samples/debug/mydict_test.py @@ -0,0 +1,39 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +import unittest + +from mydict import Dict + +class TestDict(unittest.TestCase): + + def test_init(self): + d = Dict(a=1, b='test') + self.assertEqual(d.a, 1) + self.assertEqual(d.b, 'test') + self.assertTrue(isinstance(d, dict)) + + def test_key(self): + d = Dict() + d['key'] = 'value' + self.assertEqual(d.key, 'value') + + def test_attr(self): + d = Dict() + d.key = 'value' + self.assertTrue('key' in d) + self.assertEqual(d['key'], 'value') + + def test_keyerror(self): + d = Dict() + with self.assertRaises(KeyError): + value = d['empty'] + + def test_attrerror(self): + d = Dict() + with self.assertRaises(AttributeError): + value = d.empty + +if __name__ == '__main__': + unittest.main() + diff --git a/learn-python3-samples/debug/right.html b/learn-python3-samples/debug/right.html new file mode 100644 index 00000000..e01a0ef3 --- /dev/null +++ b/learn-python3-samples/debug/right.html @@ -0,0 +1,31 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/learn-python3-samples/debug + + + + + + + + +
Folders
<Go Back>
+
+ + + + + + +
FileFileFileFile
do_assert.py do_try.py err_raise.py mydict2.py 
do_logging.py err.py err_reraise.py mydict_test.py 
do_pdb.py err_logging.py mydict.py 
+ +

+Folders: 1
+Files: 11
+Size of all files: 3512 KB

+ + + \ No newline at end of file diff --git a/learn-python3-samples/function/call_func.py b/learn-python3-samples/function/call_func.py new file mode 100644 index 00000000..d864134a --- /dev/null +++ b/learn-python3-samples/function/call_func.py @@ -0,0 +1,9 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +x = abs(100) +y = abs(-20) +print(x, y) +print('max(1, 2, 3) =', max(1, 2, 3)) +print('min(1, 2, 3) =', min(1, 2, 3)) +print('sum([1, 2, 3]) =', sum([1, 2, 3])) diff --git a/learn-python3-samples/function/def_func.py b/learn-python3-samples/function/def_func.py new file mode 100644 index 00000000..d7c09a13 --- /dev/null +++ b/learn-python3-samples/function/def_func.py @@ -0,0 +1,26 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +import math + +def my_abs(x): + if not isinstance(x, (int, float)): + raise TypeError('bad operand type') + if x >= 0: + return x + else: + return -x + +def move(x, y, step, angle=0): + nx = x + step * math.cos(angle) + ny = y - step * math.sin(angle) + return nx, ny + +n = my_abs(-20) +print(n) + +x, y = move(100, 100, 60, math.pi / 6) +print(x, y) + +# TypeError: bad operand type: +my_abs('123') diff --git a/learn-python3-samples/function/kw_args.py b/learn-python3-samples/function/kw_args.py new file mode 100644 index 00000000..03ee9a41 --- /dev/null +++ b/learn-python3-samples/function/kw_args.py @@ -0,0 +1,31 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +def print_scores(**kw): + print(' Name Score') + print('------------------') + for name, score in kw.items(): + print('%10s %d' % (name, score)) + print() + +print_scores(Adam=99, Lisa=88, Bart=77) + +data = { + 'Adam Lee': 99, + 'Lisa S': 88, + 'F.Bart': 77 +} + +print_scores(**data) + +def print_info(name, *, gender, city='Beijing', age): + print('Personal Info') + print('---------------') + print(' Name: %s' % name) + print(' Gender: %s' % gender) + print(' City: %s' % city) + print(' Age: %s' % age) + print() + +print_info('Bob', gender='male', age=20) +print_info('Lisa', gender='female', city='Shanghai', age=18) diff --git a/learn-python3-samples/function/recur.py b/learn-python3-samples/function/recur.py new file mode 100644 index 00000000..e3f66076 --- /dev/null +++ b/learn-python3-samples/function/recur.py @@ -0,0 +1,24 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +# 利用递归函数计算阶乘 +# N! = 1 * 2 * 3 * ... * N +def fact(n): + if n == 1: + return 1 + return n * fact(n-1) + +print('fact(1) =', fact(1)) +print('fact(5) =', fact(5)) +print('fact(10) =', fact(10)) + +# 利用递归函数移动汉诺塔: +def move(n, a, b, c): + if n == 1: + print('move', a, '-->', c) + else: + move(n-1, a, c, b) + move(1, a, b, c) + move(n-1, b, a, c) + +move(4, 'A', 'B', 'C') diff --git a/learn-python3-samples/function/right.html b/learn-python3-samples/function/right.html new file mode 100644 index 00000000..c29d7818 --- /dev/null +++ b/learn-python3-samples/function/right.html @@ -0,0 +1,30 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/learn-python3-samples/function + + + + + + + + +
Folders
<Go Back>
+
+ + + + + +
FileFileFileFile
call_func.py kw_args.py recur.py var_args.py 
def_func.py 
+ +

+Folders: 1
+Files: 5
+Size of all files: 2350 KB

+ + + \ No newline at end of file diff --git a/learn-python3-samples/function/var_args.py b/learn-python3-samples/function/var_args.py new file mode 100644 index 00000000..436a5a7b --- /dev/null +++ b/learn-python3-samples/function/var_args.py @@ -0,0 +1,15 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +def hello(greeting, *args): + if (len(args)==0): + print('%s!' % greeting) + else: + print('%s, %s!' % (greeting, ', '.join(args))) + +hello('Hi') # => greeting='Hi', args=() +hello('Hi', 'Sarah') # => greeting='Hi', args=('Sarah') +hello('Hello', 'Michael', 'Bob', 'Adam') # => greeting='Hello', args=('Michael', 'Bob', 'Adam') + +names = ('Bart', 'Lisa') +hello('Hello', *names) # => greeting='Hello', args=('Bart', 'Lisa') diff --git a/learn-python3-samples/functional/decorator.py b/learn-python3-samples/functional/decorator.py new file mode 100644 index 00000000..938bedf5 --- /dev/null +++ b/learn-python3-samples/functional/decorator.py @@ -0,0 +1,33 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +import functools + +def log(func): + @functools.wraps(func) + def wrapper(*args, **kw): + print('call %s():' % func.__name__) + return func(*args, **kw) + return wrapper + +@log +def now(): + print('2015-3-25') + +now() + +def logger(text): + def decorator(func): + @functools.wraps(func) + def wrapper(*args, **kw): + print('%s %s():' % (text, func.__name__)) + return func(*args, **kw) + return wrapper + return decorator + +@logger('DEBUG') +def today(): + print('2015-3-25') + +today() +print(today.__name__) diff --git a/learn-python3-samples/functional/do_filter.py b/learn-python3-samples/functional/do_filter.py new file mode 100644 index 00000000..8a9081cc --- /dev/null +++ b/learn-python3-samples/functional/do_filter.py @@ -0,0 +1,14 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +def is_odd(n): + return n % 2 == 1 + +L = range(100) + +print(list(filter(is_odd, L))) + +def not_empty(s): + return s and s.strip() + +print(list(filter(not_empty, ['A', '', 'B', None, 'C', ' ']))) diff --git a/learn-python3-samples/functional/do_map.py b/learn-python3-samples/functional/do_map.py new file mode 100644 index 00000000..9360a50a --- /dev/null +++ b/learn-python3-samples/functional/do_map.py @@ -0,0 +1,7 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +def f(x): + return x * x + +print(list(map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9]))) diff --git a/learn-python3-samples/functional/do_partial.py b/learn-python3-samples/functional/do_partial.py new file mode 100644 index 00000000..05da7b6f --- /dev/null +++ b/learn-python3-samples/functional/do_partial.py @@ -0,0 +1,9 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +import functools + +int2 = functools.partial(int, base=2) + +print('1000000 =', int2('1000000')) +print('1010101 =', int2('1010101')) diff --git a/learn-python3-samples/functional/do_reduce.py b/learn-python3-samples/functional/do_reduce.py new file mode 100644 index 00000000..bf8bc8a9 --- /dev/null +++ b/learn-python3-samples/functional/do_reduce.py @@ -0,0 +1,61 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +from functools import reduce + +CHAR_TO_INT = { + '0': 0, + '1': 1, + '2': 2, + '3': 3, + '4': 4, + '5': 5, + '6': 6, + '7': 7, + '8': 8, + '9': 9 +} + +def str2int(s): + ints = map(lambda ch: CHAR_TO_INT[ch], s) + return reduce(lambda x, y: x * 10 + y, ints) + +print(str2int('0')) +print(str2int('12300')) +print(str2int('0012345')) + +CHAR_TO_FLOAT = { + '0': 0, + '1': 1, + '2': 2, + '3': 3, + '4': 4, + '5': 5, + '6': 6, + '7': 7, + '8': 8, + '9': 9, + '.': -1 +} + +def str2float(s): + nums = map(lambda ch: CHAR_TO_FLOAT[ch], s) + point = 0 + def to_float(f, n): + nonlocal point + if n == -1: + point = 1 + return f + if point == 0: + return f * 10 + n + else: + point = point * 10 + return f + n / point + return reduce(to_float, nums, 0.0) + +print(str2float('0')) +print(str2float('123.456')) +print(str2float('123.45600')) +print(str2float('0.1234')) +print(str2float('.1234')) +print(str2float('120.0034')) diff --git a/learn-python3-samples/functional/do_sorted.py b/learn-python3-samples/functional/do_sorted.py new file mode 100644 index 00000000..c787958d --- /dev/null +++ b/learn-python3-samples/functional/do_sorted.py @@ -0,0 +1,15 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +from operator import itemgetter + +L = ['bob', 'about', 'Zoo', 'Credit'] + +print(sorted(L)) +print(sorted(L, key=str.lower)) + +students = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88)] + +print(sorted(students, key=itemgetter(0))) +print(sorted(students, key=lambda t: t[1])) +print(sorted(students, key=itemgetter(1), reverse=True)) diff --git a/learn-python3-samples/functional/prime_numbers.py b/learn-python3-samples/functional/prime_numbers.py new file mode 100644 index 00000000..e6a6a9e2 --- /dev/null +++ b/learn-python3-samples/functional/prime_numbers.py @@ -0,0 +1,29 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +def main(): + for n in primes(): + if n < 1000: + print(n) + else: + break + +def _odd_iter(): + n = 1 + while True: + n = n + 2 + yield n + +def _not_divisible(n): + return lambda x: x % n > 0 + +def primes(): + yield 2 + it = _odd_iter() + while True: + n = next(it) + yield n + it = filter(_not_divisible(n), it) + +if __name__ == '__main__': + main() diff --git a/learn-python3-samples/functional/return_func.py b/learn-python3-samples/functional/return_func.py new file mode 100644 index 00000000..147bd9f5 --- /dev/null +++ b/learn-python3-samples/functional/return_func.py @@ -0,0 +1,46 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +def lazy_sum(*args): + def sum(): + ax = 0 + for n in args: + ax = ax + n + return ax + return sum + +f = lazy_sum(1, 2, 4, 5, 7, 8, 9) +print(f) +print(f()) + +# why f1(), f2(), f3() returns 9, 9, 9 rather than 1, 4, 9? +def count(): + fs = [] + for i in range(1, 4): + def f(): + return i * i + fs.append(f) + return fs + +f1, f2, f3 = count() + +print(f1()) +print(f2()) +print(f3()) + +# fix: +def count(): + fs = [] + def f(n): + def j(): + return n * n + return j + for i in range(1, 4): + fs.append(f(i)) + return fs + +f1, f2, f3 = count() + +print(f1()) +print(f2()) +print(f3()) diff --git a/learn-python3-samples/functional/right.html b/learn-python3-samples/functional/right.html new file mode 100644 index 00000000..a9833126 --- /dev/null +++ b/learn-python3-samples/functional/right.html @@ -0,0 +1,30 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/learn-python3-samples/functional + + + + + + + + +
Folders
<Go Back>
+
+ + + + + +
FileFileFileFile
decorator.py do_map.py do_reduce.py prime_numbers.py 
do_filter.py do_partial.py do_sorted.py return_func.py 
+ +

+Folders: 1
+Files: 8
+Size of all files: 3798 KB

+ + + \ No newline at end of file diff --git a/learn-python3-samples/gui/hello_gui.py b/learn-python3-samples/gui/hello_gui.py new file mode 100644 index 00000000..005a8a31 --- /dev/null +++ b/learn-python3-samples/gui/hello_gui.py @@ -0,0 +1,27 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +from tkinter import * +import tkinter.messagebox as messagebox + +class Application(Frame): + def __init__(self, master=None): + Frame.__init__(self, master) + self.pack() + self.createWidgets() + + def createWidgets(self): + self.nameInput = Entry(self) + self.nameInput.pack() + self.alertButton = Button(self, text='Hello', command=self.hello) + self.alertButton.pack() + + def hello(self): + name = self.nameInput.get() or 'world' + messagebox.showinfo('Message', 'Hello, %s' % name) + +app = Application() +# 设置窗å£æ ‡é¢˜: +app.master.title('Hello World') +# 主消æ¯å¾ªçŽ¯: +app.mainloop() diff --git a/learn-python3-samples/gui/right.html b/learn-python3-samples/gui/right.html new file mode 100644 index 00000000..0ca5585e --- /dev/null +++ b/learn-python3-samples/gui/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/learn-python3-samples/gui + + + + + + + + +
Folders
<Go Back> turtle
+
+ + + + +
FileFileFileFile
hello_gui.py 
+ +

+Folders: 2
+Files: 1
+Size of all files: 700 KB

+ + + \ No newline at end of file diff --git a/learn-python3-samples/gui/turtle/rect.py b/learn-python3-samples/gui/turtle/rect.py new file mode 100644 index 00000000..9bd0e801 --- /dev/null +++ b/learn-python3-samples/gui/turtle/rect.py @@ -0,0 +1,26 @@ +# 导入turtle包的所有内容: +from turtle import * + +# 设置笔刷宽度: +width(4) + +# å‰è¿›: +forward(200) +# å³è½¬90度: +right(90) + +# 笔刷颜色: +pencolor('red') +forward(100) +right(90) + +pencolor('green') +forward(200) +right(90) + +pencolor('blue') +forward(100) +right(90) + +# 调用done()使得窗å£ç­‰å¾…被关闭,å¦åˆ™å°†ç«‹åˆ»å…³é—­çª—å£: +done() diff --git a/learn-python3-samples/gui/turtle/right.html b/learn-python3-samples/gui/turtle/right.html new file mode 100644 index 00000000..03c7cad1 --- /dev/null +++ b/learn-python3-samples/gui/turtle/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/learn-python3-samples/gui/turtle + + + + + + + + +
Folders
<Go Back>
+
+ + + + +
FileFileFileFile
rect.py stars.py tree.py 
+ +

+Folders: 1
+Files: 3
+Size of all files: 1264 KB

+ + + \ No newline at end of file diff --git a/learn-python3-samples/gui/turtle/stars.py b/learn-python3-samples/gui/turtle/stars.py new file mode 100644 index 00000000..3a7db272 --- /dev/null +++ b/learn-python3-samples/gui/turtle/stars.py @@ -0,0 +1,16 @@ +from turtle import * + +def drawStar(x, y): + pu() + goto(x, y) + pd() + # set heading: 0 + seth(0) + for i in range(5): + fd(40) + rt(144) + +for x in range(0, 250, 50): + drawStar(x, 0) + +done() diff --git a/learn-python3-samples/gui/turtle/tree.py b/learn-python3-samples/gui/turtle/tree.py new file mode 100644 index 00000000..43670e39 --- /dev/null +++ b/learn-python3-samples/gui/turtle/tree.py @@ -0,0 +1,59 @@ +from turtle import * + +colormode(255) + +lt(90) + +lv = 14 +l = 120 +s = 45 + +width(lv) + +r = 0 +g = 0 +b = 0 +pencolor(r, g, b) + +penup() +bk(l) +pendown() +fd(l) + +def draw_tree(l, level): + global r, g, b + # save the current pen width + w = width() + + # narrow the pen width + width(w * 3.0 / 4.0) + # set color: + r = r + 1 + g = g + 2 + b = b + 3 + pencolor(r % 200, g % 200, b % 200) + + l = 3.0 / 4.0 * l + + lt(s) + fd(l) + + if level < lv: + draw_tree(l, level + 1) + bk(l) + rt(2 * s) + fd(l) + + if level < lv: + draw_tree(l, level + 1) + bk(l) + lt(s) + + # restore the previous pen width + width(w) + +speed("fastest") + +draw_tree(l, 4) + +done() diff --git a/learn-python3-samples/io/do_bytesio.py b/learn-python3-samples/io/do_bytesio.py new file mode 100644 index 00000000..eb316bdd --- /dev/null +++ b/learn-python3-samples/io/do_bytesio.py @@ -0,0 +1,16 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +from io import BytesIO + +# write to BytesIO: +f = BytesIO() +f.write(b'hello') +f.write(b' ') +f.write(b'world!') +print(f.getvalue()) + +# read from BytesIO: +data = '人闲桂花è½ï¼Œå¤œé™æ˜¥å±±ç©ºã€‚月出惊山鸟,时鸣春涧中。'.encode('utf-8') +f = BytesIO(data) +print(f.read()) diff --git a/learn-python3-samples/io/do_dir.py b/learn-python3-samples/io/do_dir.py new file mode 100644 index 00000000..dc80853a --- /dev/null +++ b/learn-python3-samples/io/do_dir.py @@ -0,0 +1,16 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +from datetime import datetime +import os + +pwd = os.path.abspath('.') + +print(' Size Last Modified Name') +print('------------------------------------------------------------') + +for f in os.listdir(pwd): + fsize = os.path.getsize(f) + mtime = datetime.fromtimestamp(os.path.getmtime(f)).strftime('%Y-%m-%d %H:%M') + flag = '/' if os.path.isdir(f) else '' + print('%10d %s %s%s' % (fsize, mtime, f, flag)) diff --git a/learn-python3-samples/io/do_stringio.py b/learn-python3-samples/io/do_stringio.py new file mode 100644 index 00000000..dad4f993 --- /dev/null +++ b/learn-python3-samples/io/do_stringio.py @@ -0,0 +1,19 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +from io import StringIO + +# write to StringIO: +f = StringIO() +f.write('hello') +f.write(' ') +f.write('world!') +print(f.getvalue()) + +# read from StringIO: +f = StringIO('æ°´é¢ç»†é£Žç”Ÿï¼Œ\nè±æ­Œæ…¢æ…¢å£°ã€‚\n客亭临å°å¸‚,\nç¯ç«å¤œå¦†æ˜Žã€‚') +while True: + s = f.readline() + if s == '': + break + print(s.strip()) diff --git a/learn-python3-samples/io/right.html b/learn-python3-samples/io/right.html new file mode 100644 index 00000000..00208441 --- /dev/null +++ b/learn-python3-samples/io/right.html @@ -0,0 +1,30 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/learn-python3-samples/io + + + + + + + + +
Folders
<Go Back>
+
+ + + + + +
FileFileFileFile
do_bytesio.py do_stringio.py use_pickle.py with_file.py 
do_dir.py use_json.py 
+ +

+Folders: 1
+Files: 6
+Size of all files: 2418 KB

+ + + \ No newline at end of file diff --git a/learn-python3-samples/io/use_json.py b/learn-python3-samples/io/use_json.py new file mode 100644 index 00000000..5e3c7081 --- /dev/null +++ b/learn-python3-samples/io/use_json.py @@ -0,0 +1,26 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +import json + +d = dict(name='Bob', age=20, score=88) +data = json.dumps(d) +print('JSON Data is a str:', data) +reborn = json.loads(data) +print(reborn) + +class Student(object): + + def __init__(self, name, age, score): + self.name = name + self.age = age + self.score = score + + def __str__(self): + return 'Student object (%s, %s, %s)' % (self.name, self.age, self.score) + +s = Student('Bob', 20, 88) +std_data = json.dumps(s, default=lambda obj: obj.__dict__) +print('Dump Student:', std_data) +rebuild = json.loads(std_data, object_hook=lambda d: Student(d['name'], d['age'], d['score'])) +print(rebuild) diff --git a/learn-python3-samples/io/use_pickle.py b/learn-python3-samples/io/use_pickle.py new file mode 100644 index 00000000..d14eba9a --- /dev/null +++ b/learn-python3-samples/io/use_pickle.py @@ -0,0 +1,11 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +import pickle + +d = dict(name='Bob', age=20, score=88) +data = pickle.dumps(d) +print(data) + +reborn = pickle.loads(data) +print(reborn) diff --git a/learn-python3-samples/io/with_file.py b/learn-python3-samples/io/with_file.py new file mode 100644 index 00000000..003e92d8 --- /dev/null +++ b/learn-python3-samples/io/with_file.py @@ -0,0 +1,18 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +from datetime import datetime + +with open('test.txt', 'w') as f: + f.write('今天是 ') + f.write(datetime.now().strftime('%Y-%m-%d')) + +with open('test.txt', 'r') as f: + s = f.read() + print('open for read...') + print(s) + +with open('test.txt', 'rb') as f: + s = f.read() + print('open as binary for read...') + print(s) diff --git a/learn-python3-samples/mail/fetch_mail.py b/learn-python3-samples/mail/fetch_mail.py new file mode 100644 index 00000000..3188d50f --- /dev/null +++ b/learn-python3-samples/mail/fetch_mail.py @@ -0,0 +1,86 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +from email.parser import Parser +from email.header import decode_header +from email.utils import parseaddr + +import poplib + +# 输入邮件地å€, å£ä»¤å’ŒPOP3æœåŠ¡å™¨åœ°å€: +email = input('Email: ') +password = input('Password: ') +pop3_server = input('POP3 server: ') + +def guess_charset(msg): + charset = msg.get_charset() + if charset is None: + content_type = msg.get('Content-Type', '').lower() + pos = content_type.find('charset=') + if pos >= 0: + charset = content_type[pos + 8:].strip() + return charset + +def decode_str(s): + value, charset = decode_header(s)[0] + if charset: + value = value.decode(charset) + return value + +def print_info(msg, indent=0): + if indent == 0: + for header in ['From', 'To', 'Subject']: + value = msg.get(header, '') + if value: + if header=='Subject': + value = decode_str(value) + else: + hdr, addr = parseaddr(value) + name = decode_str(hdr) + value = u'%s <%s>' % (name, addr) + print('%s%s: %s' % (' ' * indent, header, value)) + if (msg.is_multipart()): + parts = msg.get_payload() + for n, part in enumerate(parts): + print('%spart %s' % (' ' * indent, n)) + print('%s--------------------' % (' ' * indent)) + print_info(part, indent + 1) + else: + content_type = msg.get_content_type() + if content_type=='text/plain' or content_type=='text/html': + content = msg.get_payload(decode=True) + charset = guess_charset(msg) + if charset: + content = content.decode(charset) + print('%sText: %s' % (' ' * indent, content + '...')) + else: + print('%sAttachment: %s' % (' ' * indent, content_type)) + +# 连接到POP3æœåŠ¡å™¨: +server = poplib.POP3(pop3_server) +# å¯ä»¥æ‰“开或关闭调试信æ¯: +server.set_debuglevel(1) +# å¯é€‰:打å°POP3æœåŠ¡å™¨çš„欢迎文字: +print(server.getwelcome().decode('utf-8')) +# 身份认è¯: +server.user(email) +server.pass_(password) +# stat()返回邮件数é‡å’Œå ç”¨ç©ºé—´: +print('Messages: %s. Size: %s' % server.stat()) +# list()返回所有邮件的编å·: +resp, mails, octets = server.list() +# å¯ä»¥æŸ¥çœ‹è¿”回的列表类似[b'1 82923', b'2 2184', ...] +print(mails) +# 获å–最新一å°é‚®ä»¶, 注æ„索引å·ä»Ž1开始: +index = len(mails) +resp, lines, octets = server.retr(index) +# lines存储了邮件的原始文本的æ¯ä¸€è¡Œ, +# å¯ä»¥èŽ·å¾—整个邮件的原始文本: +msg_content = b'\r\n'.join(lines).decode('utf-8') +# ç¨åŽè§£æžå‡ºé‚®ä»¶: +msg = Parser().parsestr(msg_content) +print_info(msg) +# å¯ä»¥æ ¹æ®é‚®ä»¶ç´¢å¼•å·ç›´æŽ¥ä»ŽæœåŠ¡å™¨åˆ é™¤é‚®ä»¶: +# server.dele(index) +# 关闭连接: +server.quit() diff --git a/learn-python3-samples/mail/right.html b/learn-python3-samples/mail/right.html new file mode 100644 index 00000000..d3e5ad46 --- /dev/null +++ b/learn-python3-samples/mail/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/learn-python3-samples/mail + + + + + + + + +
Folders
<Go Back>
+
+ + + + +
FileFileFileFile
fetch_mail.py send_mail.py 
+ +

+Folders: 1
+Files: 2
+Size of all files: 3717 KB

+ + + \ No newline at end of file diff --git a/learn-python3-samples/mail/send_mail.py b/learn-python3-samples/mail/send_mail.py new file mode 100644 index 00000000..be76c71b --- /dev/null +++ b/learn-python3-samples/mail/send_mail.py @@ -0,0 +1,28 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +from email import encoders +from email.header import Header +from email.mime.text import MIMEText +from email.utils import parseaddr, formataddr +import smtplib + +def _format_addr(s): + name, addr = parseaddr(s) + return formataddr((Header(name, 'utf-8').encode(), addr)) + +from_addr = input('From: ') +password = input('Password: ') +to_addr = input('To: ') +smtp_server = input('SMTP server: ') + +msg = MIMEText('hello, send by Python...', 'plain', 'utf-8') +msg['From'] = _format_addr('Python爱好者 <%s>' % from_addr) +msg['To'] = _format_addr('管ç†å‘˜ <%s>' % to_addr) +msg['Subject'] = Header('æ¥è‡ªSMTP的问候……', 'utf-8').encode() + +server = smtplib.SMTP(smtp_server, 25) +server.set_debuglevel(1) +server.login(from_addr, password) +server.sendmail(from_addr, [to_addr], msg.as_string()) +server.quit() diff --git a/learn-python3-samples/micropython/hellorobot/.vscode/extensions.json b/learn-python3-samples/micropython/hellorobot/.vscode/extensions.json new file mode 100644 index 00000000..f8f1a440 --- /dev/null +++ b/learn-python3-samples/micropython/hellorobot/.vscode/extensions.json @@ -0,0 +1,13 @@ +{ + // See http://go.microsoft.com/fwlink/?LinkId=827846 to learn about workspace recommendations. + // Extension identifier format: ${publisher}.${name}. Example: vscode.csharp + + // List of extensions which should be recommended for users of this workspace. + "recommendations": [ + "lego-education.ev3-micropython" + ], + // List of extensions recommended by VS Code that should not be recommended for users of this workspace. + "unwantedRecommendations": [ + "ms-python.python" + ] +} \ No newline at end of file diff --git a/learn-python3-samples/micropython/hellorobot/.vscode/launch.json b/learn-python3-samples/micropython/hellorobot/.vscode/launch.json new file mode 100644 index 00000000..af12883d --- /dev/null +++ b/learn-python3-samples/micropython/hellorobot/.vscode/launch.json @@ -0,0 +1,14 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "Download and Run", + "type": "ev3devBrowser", + "request": "launch", + "program": "/home/robot/${workspaceRootFolderName}/main.py" + } + ] +} diff --git a/learn-python3-samples/micropython/hellorobot/.vscode/settings.json b/learn-python3-samples/micropython/hellorobot/.vscode/settings.json new file mode 100644 index 00000000..37c9a5dd --- /dev/null +++ b/learn-python3-samples/micropython/hellorobot/.vscode/settings.json @@ -0,0 +1,6 @@ +// Place your settings in this file to overwrite default and user settings. +{ + "files.eol": "\n", + "debug.openDebug": "neverOpen", + "python.linting.enabled": false +} diff --git a/learn-python3-samples/micropython/hellorobot/main.py b/learn-python3-samples/micropython/hellorobot/main.py new file mode 100644 index 00000000..d51e43bd --- /dev/null +++ b/learn-python3-samples/micropython/hellorobot/main.py @@ -0,0 +1,14 @@ +#!/usr/bin/env pybricks-micropython + +from pybricks import ev3brick as brick +from pybricks.ev3devices import (Motor, TouchSensor, ColorSensor, InfraredSensor, UltrasonicSensor, GyroSensor) +from pybricks.parameters import (Port, Stop, Direction, Button, Color, SoundFile, ImageFile, Align) +from pybricks.tools import print, wait, StopWatch +from pybricks.robotics import DriveBase + +# Write your program here +brick.sound.beep() +# 输出到控制å°: +print('Hello, robot!') +# 输出到EV3å±å¹•: +brick.display.text('Hello, robot!') diff --git a/learn-python3-samples/micropython/hellorobot/right.html b/learn-python3-samples/micropython/hellorobot/right.html new file mode 100644 index 00000000..d96d6090 --- /dev/null +++ b/learn-python3-samples/micropython/hellorobot/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/learn-python3-samples/micropython/hellorobot + + + + + + + + +
Folders
<Go Back>
+
+ + + + +
FileFileFileFile
main.py 
+ +

+Folders: 1
+Files: 1
+Size of all files: 527 KB

+ + + \ No newline at end of file diff --git a/learn-python3-samples/micropython/rccar/.vscode/extensions.json b/learn-python3-samples/micropython/rccar/.vscode/extensions.json new file mode 100644 index 00000000..f8f1a440 --- /dev/null +++ b/learn-python3-samples/micropython/rccar/.vscode/extensions.json @@ -0,0 +1,13 @@ +{ + // See http://go.microsoft.com/fwlink/?LinkId=827846 to learn about workspace recommendations. + // Extension identifier format: ${publisher}.${name}. Example: vscode.csharp + + // List of extensions which should be recommended for users of this workspace. + "recommendations": [ + "lego-education.ev3-micropython" + ], + // List of extensions recommended by VS Code that should not be recommended for users of this workspace. + "unwantedRecommendations": [ + "ms-python.python" + ] +} \ No newline at end of file diff --git a/learn-python3-samples/micropython/rccar/.vscode/launch.json b/learn-python3-samples/micropython/rccar/.vscode/launch.json new file mode 100644 index 00000000..af12883d --- /dev/null +++ b/learn-python3-samples/micropython/rccar/.vscode/launch.json @@ -0,0 +1,14 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "Download and Run", + "type": "ev3devBrowser", + "request": "launch", + "program": "/home/robot/${workspaceRootFolderName}/main.py" + } + ] +} diff --git a/learn-python3-samples/micropython/rccar/.vscode/settings.json b/learn-python3-samples/micropython/rccar/.vscode/settings.json new file mode 100644 index 00000000..37c9a5dd --- /dev/null +++ b/learn-python3-samples/micropython/rccar/.vscode/settings.json @@ -0,0 +1,6 @@ +// Place your settings in this file to overwrite default and user settings. +{ + "files.eol": "\n", + "debug.openDebug": "neverOpen", + "python.linting.enabled": false +} diff --git a/learn-python3-samples/micropython/rccar/devices.py b/learn-python3-samples/micropython/rccar/devices.py new file mode 100644 index 00000000..0c6c133c --- /dev/null +++ b/learn-python3-samples/micropython/rccar/devices.py @@ -0,0 +1,47 @@ +# list input devices + +class InputDevice(): + def __init__(self): + self.name = '' + self.handler = '' + + def __str__(self): + return '' % (self.name, self.handler) + + def setName(self, name): + if len(name) >= 2 and name.startswith('"') and name.endswith('"'): + name = name[1:len(name)-1] + self.name = name + + def setHandler(self, handlers): + for handler in handlers.split(' '): + if handler.startswith('event'): + self.handler = handler + +def listDevices(): + devices = [] + with open('/proc/bus/input/devices', 'r') as f: + device = None + while True: + s = f.readline() + if s == '': + break + s = s.strip() + if s == '': + devices.append(device) + device = None + else: + if device is None: + device = InputDevice() + if s.startswith('N: Name='): + device.setName(s[8:]) + elif s.startswith('H: Handlers='): + device.setHandler(s[12:]) + return devices + +def detectJoystick(joystickNames): + for device in listDevices(): + for joystickName in joystickNames: + if joystickName in device.name: + return '/dev/input/%s' % device.handler + return None diff --git a/learn-python3-samples/micropython/rccar/main.py b/learn-python3-samples/micropython/rccar/main.py new file mode 100644 index 00000000..cf18c927 --- /dev/null +++ b/learn-python3-samples/micropython/rccar/main.py @@ -0,0 +1,100 @@ +#!/usr/bin/env pybricks-micropython + +import struct, threading + +from pybricks import ev3brick as brick +from pybricks.ev3devices import (Motor, TouchSensor, ColorSensor, InfraredSensor, UltrasonicSensor, GyroSensor) +from pybricks.parameters import (Port, Stop, Direction, Button, Color, SoundFile, ImageFile, Align) +from pybricks.tools import print, wait, StopWatch +from pybricks.robotics import DriveBase +from devices import detectJoystick + +class Robot(): + def __init__(self): + self.motor = Motor(Port.B) + self.ultrasonic = UltrasonicSensor(Port.S4) + self.active = True + self.speed = 0 + self.colors = [None, Color.GREEN, Color.YELLOW, Color.RED] + + def setSpeed(self, acc): + if acc < 0: + self.speed = max(-3, self.speed - 1) + elif acc > 0: + self.speed = min(3, self.speed + 1) + else: + self.speed = 0 + if self.speed != 0: + self.motor.run(self.speed * 90) + else: + self.motor.stop() + brick.light(self.colors[abs(self.speed)]) + + def inactive(self): + self.active = False + self.setSpeed(0) + brick.sound.beep() + +def autoStopLoop(robot): + while robot.active: + if robot.speed > 0 and robot.ultrasonic.distance() < 200: + robot.setSpeed(0) + wait(100) + +def joystickLoop(robot, eventFile): + FORMAT = 'llHHI' + EVENT_SIZE = struct.calcsize(FORMAT) + with open(eventFile, 'rb') as infile: + while True: + event = infile.read(EVENT_SIZE) + _, _, t, c, v = struct.unpack(FORMAT, event) + # button A, B: + if t == 1 and v == 1: + if c == 305: + # press A: + robot.setSpeed(1) + elif c == 304: + # press B: + robot.setSpeed(-1) + elif c == 307: + # press X: + return robot.inactive() + elif t == 3: + if c == 1: + # Left stick & vertical: + speed = 0 + if v < 32768: + # up: + speed = 1 + elif v > 32768: + # down: + speed = -1 + robot.setSpeed(speed) + +def buttonLoop(robot): + while True: + if not any(brick.buttons()): + wait(10) + else: + if Button.LEFT in brick.buttons(): + robot.setSpeed(-1) + elif Button.RIGHT in brick.buttons(): + robot.setSpeed(1) + elif Button.CENTER in brick.buttons(): + robot.setSpeed(0) + elif Button.UP in brick.buttons(): + return robot.inactive() + wait(500) + +def main(): + brick.sound.beep() + joystickEvent = detectJoystick(['Controller']) + robot = Robot() + t = threading.Thread(target=autoStopLoop, args=(robot,)) + t.start() + if joystickEvent: + joystickLoop(robot, joystickEvent) + else: + buttonLoop(robot) + +main() diff --git a/learn-python3-samples/micropython/rccar/right.html b/learn-python3-samples/micropython/rccar/right.html new file mode 100644 index 00000000..80913278 --- /dev/null +++ b/learn-python3-samples/micropython/rccar/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/learn-python3-samples/micropython/rccar + + + + + + + + +
Folders
<Go Back>
+
+ + + + +
FileFileFileFile
devices.py main.py 
+ +

+Folders: 1
+Files: 2
+Size of all files: 4495 KB

+ + + \ No newline at end of file diff --git a/learn-python3-samples/micropython/right.html b/learn-python3-samples/micropython/right.html new file mode 100644 index 00000000..b6e0f71d --- /dev/null +++ b/learn-python3-samples/micropython/right.html @@ -0,0 +1,24 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/learn-python3-samples/micropython + + + + + + + + + +
Folders
<Go Back> rccar smallcar tank
hellorobot
+
+ +

+Folders: 5
+

+ + + \ No newline at end of file diff --git a/learn-python3-samples/micropython/smallcar/.vscode/extensions.json b/learn-python3-samples/micropython/smallcar/.vscode/extensions.json new file mode 100644 index 00000000..f8f1a440 --- /dev/null +++ b/learn-python3-samples/micropython/smallcar/.vscode/extensions.json @@ -0,0 +1,13 @@ +{ + // See http://go.microsoft.com/fwlink/?LinkId=827846 to learn about workspace recommendations. + // Extension identifier format: ${publisher}.${name}. Example: vscode.csharp + + // List of extensions which should be recommended for users of this workspace. + "recommendations": [ + "lego-education.ev3-micropython" + ], + // List of extensions recommended by VS Code that should not be recommended for users of this workspace. + "unwantedRecommendations": [ + "ms-python.python" + ] +} \ No newline at end of file diff --git a/learn-python3-samples/micropython/smallcar/.vscode/launch.json b/learn-python3-samples/micropython/smallcar/.vscode/launch.json new file mode 100644 index 00000000..af12883d --- /dev/null +++ b/learn-python3-samples/micropython/smallcar/.vscode/launch.json @@ -0,0 +1,14 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "Download and Run", + "type": "ev3devBrowser", + "request": "launch", + "program": "/home/robot/${workspaceRootFolderName}/main.py" + } + ] +} diff --git a/learn-python3-samples/micropython/smallcar/.vscode/settings.json b/learn-python3-samples/micropython/smallcar/.vscode/settings.json new file mode 100644 index 00000000..a9e3a557 --- /dev/null +++ b/learn-python3-samples/micropython/smallcar/.vscode/settings.json @@ -0,0 +1,7 @@ +// Place your settings in this file to overwrite default and user settings. +{ + "files.eol": "\n", + "debug.openDebug": "neverOpen", + "python.linting.enabled": false, + "python.formatting.provider": "autopep8" +} diff --git a/learn-python3-samples/micropython/smallcar/main.py b/learn-python3-samples/micropython/smallcar/main.py new file mode 100644 index 00000000..9ddd7aec --- /dev/null +++ b/learn-python3-samples/micropython/smallcar/main.py @@ -0,0 +1,51 @@ +#!/usr/bin/env pybricks-micropython + +from pybricks import ev3brick as brick +from pybricks.ev3devices import (Motor, TouchSensor, ColorSensor, InfraredSensor, UltrasonicSensor, GyroSensor) +from pybricks.parameters import (Port, Stop, Direction, Button, Color, SoundFile, ImageFile, Align) +from pybricks.tools import print, wait, StopWatch +from pybricks.robotics import DriveBase + +# Write your program here + +motor = Motor(Port.B) +ultrasonic = UltrasonicSensor(Port.S4) + +brick.sound.beep() +brick.light(None) + +speed = 0 +colors = [None, Color.GREEN, Color.YELLOW, Color.RED] + +def setSpeed(acc): + global speed + if acc < 0: + speed = max(0, speed - 1) + elif acc > 0: + speed = min(3, speed + 1) + else: + speed = 0 + if speed > 0: + motor.run(speed * 90) + else: + motor.stop() + brick.light(colors[speed]) + +while True: + if not any(brick.buttons()): + wait(10) + else: + if Button.LEFT in brick.buttons(): + setSpeed(-1) + elif Button.RIGHT in brick.buttons(): + setSpeed(1) + elif Button.CENTER in brick.buttons(): + setSpeed(0) + elif Button.UP in brick.buttons(): + setSpeed(0) + break + wait(500) + if ultrasonic.distance() < 200: + setSpeed(0) + +brick.sound.beep() diff --git a/learn-python3-samples/micropython/smallcar/right.html b/learn-python3-samples/micropython/smallcar/right.html new file mode 100644 index 00000000..6b3e5c88 --- /dev/null +++ b/learn-python3-samples/micropython/smallcar/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/learn-python3-samples/micropython/smallcar + + + + + + + + +
Folders
<Go Back>
+
+ + + + +
FileFileFileFile
main.py 
+ +

+Folders: 1
+Files: 1
+Size of all files: 1308 KB

+ + + \ No newline at end of file diff --git a/learn-python3-samples/micropython/tank/.vscode/extensions.json b/learn-python3-samples/micropython/tank/.vscode/extensions.json new file mode 100644 index 00000000..f8f1a440 --- /dev/null +++ b/learn-python3-samples/micropython/tank/.vscode/extensions.json @@ -0,0 +1,13 @@ +{ + // See http://go.microsoft.com/fwlink/?LinkId=827846 to learn about workspace recommendations. + // Extension identifier format: ${publisher}.${name}. Example: vscode.csharp + + // List of extensions which should be recommended for users of this workspace. + "recommendations": [ + "lego-education.ev3-micropython" + ], + // List of extensions recommended by VS Code that should not be recommended for users of this workspace. + "unwantedRecommendations": [ + "ms-python.python" + ] +} \ No newline at end of file diff --git a/learn-python3-samples/micropython/tank/.vscode/launch.json b/learn-python3-samples/micropython/tank/.vscode/launch.json new file mode 100644 index 00000000..af12883d --- /dev/null +++ b/learn-python3-samples/micropython/tank/.vscode/launch.json @@ -0,0 +1,14 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "Download and Run", + "type": "ev3devBrowser", + "request": "launch", + "program": "/home/robot/${workspaceRootFolderName}/main.py" + } + ] +} diff --git a/learn-python3-samples/micropython/tank/.vscode/settings.json b/learn-python3-samples/micropython/tank/.vscode/settings.json new file mode 100644 index 00000000..37c9a5dd --- /dev/null +++ b/learn-python3-samples/micropython/tank/.vscode/settings.json @@ -0,0 +1,6 @@ +// Place your settings in this file to overwrite default and user settings. +{ + "files.eol": "\n", + "debug.openDebug": "neverOpen", + "python.linting.enabled": false +} diff --git a/learn-python3-samples/micropython/tank/cannon.wav b/learn-python3-samples/micropython/tank/cannon.wav new file mode 100644 index 0000000000000000000000000000000000000000..ee0d010272b91dc47a95f79ec4ef58541d6f7301 GIT binary patch literal 141378 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�evWZ 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%0DF7}ADV|ZU>mS&`D^*>kaZX0hxmUY_pTS$ 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 F_!kg_-TnXo literal 0 HcmV?d00001 diff --git a/learn-python3-samples/micropython/tank/devices.py b/learn-python3-samples/micropython/tank/devices.py new file mode 100644 index 00000000..0c6c133c --- /dev/null +++ b/learn-python3-samples/micropython/tank/devices.py @@ -0,0 +1,47 @@ +# list input devices + +class InputDevice(): + def __init__(self): + self.name = '' + self.handler = '' + + def __str__(self): + return '' % (self.name, self.handler) + + def setName(self, name): + if len(name) >= 2 and name.startswith('"') and name.endswith('"'): + name = name[1:len(name)-1] + self.name = name + + def setHandler(self, handlers): + for handler in handlers.split(' '): + if handler.startswith('event'): + self.handler = handler + +def listDevices(): + devices = [] + with open('/proc/bus/input/devices', 'r') as f: + device = None + while True: + s = f.readline() + if s == '': + break + s = s.strip() + if s == '': + devices.append(device) + device = None + else: + if device is None: + device = InputDevice() + if s.startswith('N: Name='): + device.setName(s[8:]) + elif s.startswith('H: Handlers='): + device.setHandler(s[12:]) + return devices + +def detectJoystick(joystickNames): + for device in listDevices(): + for joystickName in joystickNames: + if joystickName in device.name: + return '/dev/input/%s' % device.handler + return None diff --git a/learn-python3-samples/micropython/tank/joystick.py b/learn-python3-samples/micropython/tank/joystick.py new file mode 100644 index 00000000..0379051c --- /dev/null +++ b/learn-python3-samples/micropython/tank/joystick.py @@ -0,0 +1,61 @@ +# joystick control: + +import struct + +# define button code: + +BUTTON_A = 305 +BUTTON_B = 304 +BUTTON_X = 307 +BUTTON_Y = 306 +BUTTON_PLUS = 313 +BUTTON_MINUS = 312 +BUTTON_START = 317 +BUTTON_HOME = 316 + +class JoyStick(): + def __init__(self, eventFile): + self.eventFile = eventFile + self.buttonHandler = None + self.joyLeftHandler = None + self.joyRightHandler = None + + def setButtonHandler(self, buttonHandler): + self.buttonHandler = buttonHandler + + def setJoyLeftHandler(self, joyLeftHandler): + self.joyLeftHandler = joyLeftHandler + + def setJoyRightHandler(self, joyRightHandler): + self.joyRightHandler = joyRightHandler + + def startLoop(self): + FORMAT = 'llHHI' + EVENT_SIZE = struct.calcsize(FORMAT) + with open(self.eventFile, 'rb') as infile: + lx, ly, rx, ry = 0, 0, 0, 0 + while True: + event = infile.read(EVENT_SIZE) + _, _, t, c, v = struct.unpack(FORMAT, event) + if t == 1 and v == 1: + # button pressed: + if self.buttonHandler: + if not self.buttonHandler(c): + return + if t == 3: + if c == 0 and self.joyLeftHandler: + # left stick & horizontal: + lx = v - 32768 + self.joyLeftHandler(lx, ly) + elif c == 1 and self.joyLeftHandler: + # left stick & vertical: + ly = v - 32768 + self.joyLeftHandler(lx, ly) + elif c == 3 and self.joyRightHandler: + # right stick & horizontal: + rx = v - 32768 + self.joyRightHandler(rx, ry) + elif c == 4 and self.joyRightHandler: + # right stick & vertical: + ry = v - 32768 + self.joyRightHandler(rx, ry) diff --git a/learn-python3-samples/micropython/tank/main.py b/learn-python3-samples/micropython/tank/main.py new file mode 100644 index 00000000..efb082da --- /dev/null +++ b/learn-python3-samples/micropython/tank/main.py @@ -0,0 +1,103 @@ +#!/usr/bin/env pybricks-micropython + +import struct, threading + +from pybricks import ev3brick as brick +from pybricks.ev3devices import (Motor, TouchSensor, ColorSensor, InfraredSensor, UltrasonicSensor, GyroSensor) +from pybricks.parameters import (Port, Stop, Direction, Button, Color, SoundFile, ImageFile, Align) +from pybricks.tools import print, wait, StopWatch +from pybricks.robotics import DriveBase + +from devices import detectJoystick +from joystick import JoyStick, BUTTON_A, BUTTON_X + +SPEED = 100 +STEERING = 90 + +STATUS_STOPPED = 0 +STATUS_FORWARD = 1 +STATUS_BACKWARD = 2 +STATUS_STEERING = 3 + +COLORS = (None, Color.GREEN, Color.RED, Color.YELLOW) + +class Driver(): + def __init__(self, leftMotor, rightMotor, diameter, axle): + self.driver = DriveBase(leftMotor, rightMotor, diameter, axle) + self.x = 0 + self.y = 0 + self.speed = 0 + self.steering = 0 + + def drive(self, speed, steering): + self.speed = speed + self.steering = steering + if self.speed == 0: + self.driver.stop() + else: + self.driver.drive(self.speed, self.steering) + +class Robot(): + def __init__(self, leftMotor, rightMotor, topMotor, diameter, axle, maxSpeed=300, maxSteering=180, port=Port.S4): + self.driver = Driver(leftMotor, rightMotor, diameter, axle) + self.cannon = topMotor + self.ultrasonic = UltrasonicSensor(port) + self.speedStep = 32767 // maxSpeed + self.steeringStep = 32767 // maxSteering + self.active = True + + def drive(self, x, y): + # map y (-32768 ~ +32767) to speed (+maxSpeed ~ -maxSpeed): + speed = -y // self.speedStep + # map x (-32768 ~ +32767) to steering (-maxSteering ~ +maxSteering): + steering = x // self.steeringStep + self.driver.drive(speed, steering) + + def target(self, x): + self.cannon.run(-x // 327) + + def fire(self): + brick.sound.file('cannon.wav') + + def inactive(self): + self.active = False + self.drive(0, 0) + brick.sound.beep() + +def autoStopLoop(robot): + while robot.active: + if robot.ultrasonic.distance() < 200: + robot.drive(0, 0) + wait(100) + +def main(): + brick.sound.beep() + joystickEvent = detectJoystick(['Controller']) + if joystickEvent: + robot = Robot(Motor(Port.D), Motor(Port.A), Motor(Port.B), 55, 200) + t = threading.Thread(target=autoStopLoop, args=(robot,)) + t.start() + + def onButtonPressed(code): + if code == BUTTON_X: + robot.inactive() + return False + if code == BUTTON_A: + robot.fire() + return True + + def onLeftJoyChanged(x, y): + robot.drive(x, y) + + def onRightJoyChanged(x, y): + robot.target(x) + + joystick = JoyStick(joystickEvent) + joystick.setButtonHandler(onButtonPressed) + joystick.setJoyLeftHandler(onLeftJoyChanged) + joystick.setJoyRightHandler(onRightJoyChanged) + joystick.startLoop() + else: + brick.sound.beep() + +main() diff --git a/learn-python3-samples/micropython/tank/right.html b/learn-python3-samples/micropython/tank/right.html new file mode 100644 index 00000000..8139ea5a --- /dev/null +++ b/learn-python3-samples/micropython/tank/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/learn-python3-samples/micropython/tank + + + + + + + + +
Folders
<Go Back>
+
+ + + + +
FileFileFileFile
devices.py joystick.py main.py cannon.wav 
+ +

+Folders: 1
+Files: 4
+Size of all files: 147887 KB

+ + + \ No newline at end of file diff --git a/learn-python3-samples/module/hello.py b/learn-python3-samples/module/hello.py new file mode 100644 index 00000000..4cb622bf --- /dev/null +++ b/learn-python3-samples/module/hello.py @@ -0,0 +1,21 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +' a test module ' + +__author__ = 'Michael Liao' + +import sys + +def test(): + args = sys.argv + if len(args)==1: + print('Hello, world!') + elif len(args)==2: + print('Hello, %s!' % args[1]) + else: + print('Too many arguments!') + +if __name__=='__main__': + test() + diff --git a/learn-python3-samples/module/right.html b/learn-python3-samples/module/right.html new file mode 100644 index 00000000..d6c45b4f --- /dev/null +++ b/learn-python3-samples/module/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/learn-python3-samples/module + + + + + + + + +
Folders
<Go Back>
+
+ + + + +
FileFileFileFile
hello.py 
+ +

+Folders: 1
+Files: 1
+Size of all files: 342 KB

+ + + \ No newline at end of file diff --git a/learn-python3-samples/multitask/do_folk.py b/learn-python3-samples/multitask/do_folk.py new file mode 100644 index 00000000..2cabba8b --- /dev/null +++ b/learn-python3-samples/multitask/do_folk.py @@ -0,0 +1,12 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +import os + +print('Process (%s) start...' % os.getpid()) +# Only works on Unix/Linux/Mac: +pid = os.fork() +if pid == 0: + print('I am child process (%s) and my parent is %s.' % (os.getpid(), os.getppid())) +else: + print('I (%s) just created a child process (%s).' % (os.getpid(), pid)) diff --git a/learn-python3-samples/multitask/do_lock.py b/learn-python3-samples/multitask/do_lock.py new file mode 100644 index 00000000..23a3f1ed --- /dev/null +++ b/learn-python3-samples/multitask/do_lock.py @@ -0,0 +1,33 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +import time, threading + +# å‡å®šè¿™æ˜¯ä½ çš„银行存款: +balance = 0 +lock = threading.Lock() + +def change_it(n): + # 先存åŽå–,结果应该为0: + global balance + balance = balance + n + balance = balance - n + +def run_thread(n): + for i in range(100000): + # å…ˆè¦èŽ·å–é”: + lock.acquire() + try: + # 放心地改å§: + change_it(n) + finally: + # 改完了一定è¦é‡Šæ”¾é”: + lock.release() + +t1 = threading.Thread(target=run_thread, args=(5,)) +t2 = threading.Thread(target=run_thread, args=(8,)) +t1.start() +t2.start() +t1.join() +t2.join() +print(balance) diff --git a/learn-python3-samples/multitask/do_queue.py b/learn-python3-samples/multitask/do_queue.py new file mode 100644 index 00000000..02a8ef80 --- /dev/null +++ b/learn-python3-samples/multitask/do_queue.py @@ -0,0 +1,34 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +from multiprocessing import Process, Queue +import os, time, random + +# 写数æ®è¿›ç¨‹æ‰§è¡Œçš„代ç : +def write(q): + print('Process to write: %s' % os.getpid()) + for value in ['A', 'B', 'C']: + print('Put %s to queue...' % value) + q.put(value) + time.sleep(random.random()) + +# 读数æ®è¿›ç¨‹æ‰§è¡Œçš„代ç : +def read(q): + print('Process to read: %s' % os.getpid()) + while True: + value = q.get(True) + print('Get %s from queue.' % value) + +if __name__=='__main__': + # 父进程创建Queue,并传给å„个å­è¿›ç¨‹ï¼š + q = Queue() + pw = Process(target=write, args=(q,)) + pr = Process(target=read, args=(q,)) + # å¯åŠ¨å­è¿›ç¨‹pw,写入: + pw.start() + # å¯åŠ¨å­è¿›ç¨‹pr,读å–: + pr.start() + # 等待pw结æŸ: + pw.join() + # pr进程里是死循环,无法等待其结æŸï¼Œåªèƒ½å¼ºè¡Œç»ˆæ­¢: + pr.terminate() diff --git a/learn-python3-samples/multitask/do_subprocess.py b/learn-python3-samples/multitask/do_subprocess.py new file mode 100644 index 00000000..4c8b9db3 --- /dev/null +++ b/learn-python3-samples/multitask/do_subprocess.py @@ -0,0 +1,14 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +import subprocess + +print('$ nslookup www.python.org') +r = subprocess.call(['nslookup', 'www.python.org']) +print('Exit code:', r) + +print('$ nslookup') +p = subprocess.Popen(['nslookup'], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) +output, err = p.communicate(b'set q=mx\npython.org\nexit\n') +print(output.decode('utf-8')) +print('Exit code:', p.returncode) diff --git a/learn-python3-samples/multitask/multi_processing.py b/learn-python3-samples/multitask/multi_processing.py new file mode 100644 index 00000000..3cb76606 --- /dev/null +++ b/learn-python3-samples/multitask/multi_processing.py @@ -0,0 +1,17 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +from multiprocessing import Process +import os + +# å­è¿›ç¨‹è¦æ‰§è¡Œçš„ä»£ç  +def run_proc(name): + print('Run child process %s (%s)...' % (name, os.getpid())) + +if __name__=='__main__': + print('Parent process %s.' % os.getpid()) + p = Process(target=run_proc, args=('test',)) + print('Child process will start.') + p.start() + p.join() + print('Child process end.') diff --git a/learn-python3-samples/multitask/multi_threading.py b/learn-python3-samples/multitask/multi_threading.py new file mode 100644 index 00000000..5da05de3 --- /dev/null +++ b/learn-python3-samples/multitask/multi_threading.py @@ -0,0 +1,20 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +import time, threading + +# 新线程执行的代ç : +def loop(): + print('thread %s is running...' % threading.current_thread().name) + n = 0 + while n < 5: + n = n + 1 + print('thread %s >>> %s' % (threading.current_thread().name, n)) + time.sleep(1) + print('thread %s ended.' % threading.current_thread().name) + +print('thread %s is running...' % threading.current_thread().name) +t = threading.Thread(target=loop, name='LoopThread') +t.start() +t.join() +print('thread %s ended.' % threading.current_thread().name) diff --git a/learn-python3-samples/multitask/pooled_processing.py b/learn-python3-samples/multitask/pooled_processing.py new file mode 100644 index 00000000..97130f2e --- /dev/null +++ b/learn-python3-samples/multitask/pooled_processing.py @@ -0,0 +1,22 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +from multiprocessing import Pool +import os, time, random + +def long_time_task(name): + print('Run task %s (%s)...' % (name, os.getpid())) + start = time.time() + time.sleep(random.random() * 3) + end = time.time() + print('Task %s runs %0.2f seconds.' % (name, (end - start))) + +if __name__=='__main__': + print('Parent process %s.' % os.getpid()) + p = Pool(4) + for i in range(5): + p.apply_async(long_time_task, args=(i,)) + print('Waiting for all subprocesses done...') + p.close() + p.join() + print('All subprocesses done.') diff --git a/learn-python3-samples/multitask/right.html b/learn-python3-samples/multitask/right.html new file mode 100644 index 00000000..ff4c4d9f --- /dev/null +++ b/learn-python3-samples/multitask/right.html @@ -0,0 +1,31 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/learn-python3-samples/multitask + + + + + + + + +
Folders
<Go Back>
+
+ + + + + + +
FileFileFileFile
do_folk.py do_subprocess.py pooled_pr...ing.py task_worker.py 
do_lock.py multi_pro...ing.py task_master.py use_threadlocal.py 
do_queue.py multi_threading.py 
+ +

+Folders: 1
+Files: 10
+Size of all files: 6809 KB

+ + + \ No newline at end of file diff --git a/learn-python3-samples/multitask/task_master.py b/learn-python3-samples/multitask/task_master.py new file mode 100644 index 00000000..c01bf71b --- /dev/null +++ b/learn-python3-samples/multitask/task_master.py @@ -0,0 +1,38 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +import random, time, queue +from multiprocessing.managers import BaseManager + +# å‘é€ä»»åŠ¡çš„队列: +task_queue = queue.Queue() +# 接收结果的队列: +result_queue = queue.Queue() + +# 从BaseManager继承的QueueManager: +class QueueManager(BaseManager): + pass + +# 把两个Queue都注册到网络上, callableå‚æ•°å…³è”了Queue对象: +QueueManager.register('get_task_queue', callable=lambda: task_queue) +QueueManager.register('get_result_queue', callable=lambda: result_queue) +# 绑定端å£5000, 设置验è¯ç 'abc': +manager = QueueManager(address=('', 5000), authkey=b'abc') +# å¯åŠ¨Queue: +manager.start() +# 获得通过网络访问的Queue对象: +task = manager.get_task_queue() +result = manager.get_result_queue() +# 放几个任务进去: +for i in range(10): + n = random.randint(0, 10000) + print('Put task %d...' % n) + task.put(n) +# 从result队列读å–结果: +print('Try get results...') +for i in range(10): + r = result.get(timeout=10) + print('Result: %s' % r) +# 关闭: +manager.shutdown() +print('master exit.') diff --git a/learn-python3-samples/multitask/task_worker.py b/learn-python3-samples/multitask/task_worker.py new file mode 100644 index 00000000..8155a2b6 --- /dev/null +++ b/learn-python3-samples/multitask/task_worker.py @@ -0,0 +1,36 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +import time, sys +from multiprocessing.managers import BaseManager + +# 创建类似的QueueManager: +class QueueManager(BaseManager): + pass + +# 由于这个QueueManageråªä»Žç½‘络上获å–Queue,所以注册时åªæä¾›åå­—: +QueueManager.register('get_task_queue') +QueueManager.register('get_result_queue') + +# 连接到æœåŠ¡å™¨ï¼Œä¹Ÿå°±æ˜¯è¿è¡Œtask_master.py的机器: +server_addr = '127.0.0.1' +print('Connect to server %s...' % server_addr) +# 端å£å’ŒéªŒè¯ç æ³¨æ„ä¿æŒä¸Žtask_master.py设置的完全一致: +m = QueueManager(address=(server_addr, 5000), authkey=b'abc') +# 从网络连接: +m.connect() +# 获å–Queue的对象: +task = m.get_task_queue() +result = m.get_result_queue() +# 从task队列å–任务,并把结果写入result队列: +for i in range(10): + try: + n = task.get(timeout=1) + print('run task %d * %d...' % (n, n)) + r = '%d * %d = %d' % (n, n, n*n) + time.sleep(1) + result.put(r) + except Queue.Empty: + print('task queue is empty.') +# 处ç†ç»“æŸ: +print('worker exit.') diff --git a/learn-python3-samples/multitask/use_threadlocal.py b/learn-python3-samples/multitask/use_threadlocal.py new file mode 100644 index 00000000..77c0c9c8 --- /dev/null +++ b/learn-python3-samples/multitask/use_threadlocal.py @@ -0,0 +1,24 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +import threading + +# 创建全局ThreadLocal对象: +local_school = threading.local() + +def process_student(): + # 获å–当å‰çº¿ç¨‹å…³è”çš„student: + std = local_school.student + print('Hello, %s (in %s)' % (std, threading.current_thread().name)) + +def process_thread(name): + # 绑定ThreadLocalçš„student: + local_school.student = name + process_student() + +t1 = threading.Thread(target= process_thread, args=('Alice',), name='Thread-A') +t2 = threading.Thread(target= process_thread, args=('Bob',), name='Thread-B') +t1.start() +t2.start() +t1.join() +t2.join() diff --git a/learn-python3-samples/oop_advance/create_class_on_the_fly.py b/learn-python3-samples/oop_advance/create_class_on_the_fly.py new file mode 100644 index 00000000..38970234 --- /dev/null +++ b/learn-python3-samples/oop_advance/create_class_on_the_fly.py @@ -0,0 +1,13 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +def fn(self, name='world'): # 先定义函数 + print('Hello, %s.' % name) + +Hello = type('Hello', (object,), dict(hello=fn)) # 创建Hello class + +h = Hello() +print('call h.hello():') +h.hello() +print('type(Hello) =', type(Hello)) +print('type(h) =', type(h)) diff --git a/learn-python3-samples/oop_advance/orm.py b/learn-python3-samples/oop_advance/orm.py new file mode 100644 index 00000000..11899b3f --- /dev/null +++ b/learn-python3-samples/oop_advance/orm.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +' Simple ORM using metaclass ' + +class Field(object): + + def __init__(self, name, column_type): + self.name = name + self.column_type = column_type + + def __str__(self): + return '<%s:%s>' % (self.__class__.__name__, self.name) + +class StringField(Field): + + def __init__(self, name): + super(StringField, self).__init__(name, 'varchar(100)') + +class IntegerField(Field): + + def __init__(self, name): + super(IntegerField, self).__init__(name, 'bigint') + +class ModelMetaclass(type): + + def __new__(cls, name, bases, attrs): + if name=='Model': + return type.__new__(cls, name, bases, attrs) + print('Found model: %s' % name) + mappings = dict() + for k, v in attrs.items(): + if isinstance(v, Field): + print('Found mapping: %s ==> %s' % (k, v)) + mappings[k] = v + for k in mappings.keys(): + attrs.pop(k) + attrs['__mappings__'] = mappings # ä¿å­˜å±žæ€§å’Œåˆ—的映射关系 + attrs['__table__'] = name # å‡è®¾è¡¨å和类å一致 + return type.__new__(cls, name, bases, attrs) + +class Model(dict, metaclass=ModelMetaclass): + + def __init__(self, **kw): + super(Model, self).__init__(**kw) + + def __getattr__(self, key): + try: + return self[key] + except KeyError: + raise AttributeError(r"'Model' object has no attribute '%s'" % key) + + def __setattr__(self, key, value): + self[key] = value + + def save(self): + fields = [] + params = [] + args = [] + for k, v in self.__mappings__.items(): + fields.append(v.name) + params.append('?') + args.append(getattr(self, k, None)) + sql = 'insert into %s (%s) values (%s)' % (self.__table__, ','.join(fields), ','.join(params)) + print('SQL: %s' % sql) + print('ARGS: %s' % str(args)) + +# testing code: + +class User(Model): + id = IntegerField('id') + name = StringField('username') + email = StringField('email') + password = StringField('password') + +u = User(id=12345, name='Michael', email='test@orm.org', password='my-pwd') +u.save() diff --git a/learn-python3-samples/oop_advance/right.html b/learn-python3-samples/oop_advance/right.html new file mode 100644 index 00000000..6747d020 --- /dev/null +++ b/learn-python3-samples/oop_advance/right.html @@ -0,0 +1,31 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/learn-python3-samples/oop_advance + + + + + + + + +
Folders
<Go Back>
+
+ + + + + + +
FileFileFileFile
create_cl...fly.py special_getattr.py special_str.py use_property.py 
orm.py special_getitem.py use_enum.py use_slots.py 
special_call.py special_iter.py use_metaclass.py 
+ +

+Folders: 1
+Files: 11
+Size of all files: 6909 KB

+ + + \ No newline at end of file diff --git a/learn-python3-samples/oop_advance/special_call.py b/learn-python3-samples/oop_advance/special_call.py new file mode 100644 index 00000000..7fc27f7c --- /dev/null +++ b/learn-python3-samples/oop_advance/special_call.py @@ -0,0 +1,12 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +class Student(object): + def __init__(self, name): + self.name = name + + def __call__(self): + print('My name is %s.' % self.name) + +s = Student('Michael') +s() diff --git a/learn-python3-samples/oop_advance/special_getattr.py b/learn-python3-samples/oop_advance/special_getattr.py new file mode 100644 index 00000000..930141a4 --- /dev/null +++ b/learn-python3-samples/oop_advance/special_getattr.py @@ -0,0 +1,21 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +class Student(object): + + def __init__(self): + self.name = 'Michael' + + def __getattr__(self, attr): + if attr=='score': + return 99 + if attr=='age': + return lambda: 25 + raise AttributeError('\'Student\' object has no attribute \'%s\'' % attr) + +s = Student() +print(s.name) +print(s.score) +print(s.age()) +# AttributeError: 'Student' object has no attribute 'grade' +print(s.grade) diff --git a/learn-python3-samples/oop_advance/special_getitem.py b/learn-python3-samples/oop_advance/special_getitem.py new file mode 100644 index 00000000..19f5bcdd --- /dev/null +++ b/learn-python3-samples/oop_advance/special_getitem.py @@ -0,0 +1,30 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +class Fib(object): + + def __getitem__(self, n): + if isinstance(n, int): + a, b = 1, 1 + for x in range(n): + a, b = b, a + b + return a + if isinstance(n, slice): + start = n.start + stop = n.stop + if start is None: + start = 0 + a, b = 1, 1 + L = [] + for x in range(stop): + if x >= start: + L.append(a) + a, b = b, a + b + return L + +f = Fib() +print(f[0]) +print(f[5]) +print(f[100]) +print(f[0:5]) +print(f[:10]) diff --git a/learn-python3-samples/oop_advance/special_iter.py b/learn-python3-samples/oop_advance/special_iter.py new file mode 100644 index 00000000..90e1f8f1 --- /dev/null +++ b/learn-python3-samples/oop_advance/special_iter.py @@ -0,0 +1,19 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +class Fib(object): + + def __init__(self): + self.a, self.b = 0, 1 # åˆå§‹åŒ–两个计数器a,b + + def __iter__(self): + return self # 实例本身就是迭代对象,故返回自己 + + def __next__(self): + self.a, self.b = self.b, self.a + self.b # 计算下一个值 + if self.a > 100000: # 退出循环的æ¡ä»¶ + raise StopIteration(); + return self.a # 返回下一个值 + +for n in Fib(): + print(n) diff --git a/learn-python3-samples/oop_advance/special_str.py b/learn-python3-samples/oop_advance/special_str.py new file mode 100644 index 00000000..1071b693 --- /dev/null +++ b/learn-python3-samples/oop_advance/special_str.py @@ -0,0 +1,14 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +class Student(object): + + def __init__(self, name): + self.name = name + + def __str__(self): + return 'Student object (name: %s)' % self.name + + __repr__ = __str__ + +print(Student('Michael')) diff --git a/learn-python3-samples/oop_advance/use_enum.py b/learn-python3-samples/oop_advance/use_enum.py new file mode 100644 index 00000000..7d23b30a --- /dev/null +++ b/learn-python3-samples/oop_advance/use_enum.py @@ -0,0 +1,32 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +from enum import Enum, unique + +@unique +class Weekday(Enum): + Sun = 0 + Mon = 1 + Tue = 2 + Wed = 3 + Thu = 4 + Fri = 5 + Sat = 6 + +day1 = Weekday.Mon + +print('day1 =', day1) +print('Weekday.Tue =', Weekday.Tue) +print('Weekday[\'Tue\'] =', Weekday['Tue']) +print('Weekday.Tue.value =', Weekday.Tue.value) +print('day1 == Weekday.Mon ?', day1 == Weekday.Mon) +print('day1 == Weekday.Tue ?', day1 == Weekday.Tue) +print('day1 == Weekday(1) ?', day1 == Weekday(1)) + +for name, member in Weekday.__members__.items(): + print(name, '=>', member) + +Month = Enum('Month', ('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec')) + +for name, member in Month.__members__.items(): + print(name, '=>', member, ',', member.value) diff --git a/learn-python3-samples/oop_advance/use_metaclass.py b/learn-python3-samples/oop_advance/use_metaclass.py new file mode 100644 index 00000000..b0e9d6b9 --- /dev/null +++ b/learn-python3-samples/oop_advance/use_metaclass.py @@ -0,0 +1,19 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +# metaclass是创建类,所以必须从`type`类型派生: +class ListMetaclass(type): + def __new__(cls, name, bases, attrs): + attrs['add'] = lambda self, value: self.append(value) + return type.__new__(cls, name, bases, attrs) + +# 指示使用ListMetaclassæ¥å®šåˆ¶ç±» +class MyList(list, metaclass=ListMetaclass): + pass + +L = MyList() +L.add(1) +L.add(2) +L.add(3) +L.add('END') +print(L) diff --git a/learn-python3-samples/oop_advance/use_property.py b/learn-python3-samples/oop_advance/use_property.py new file mode 100644 index 00000000..9edcb02a --- /dev/null +++ b/learn-python3-samples/oop_advance/use_property.py @@ -0,0 +1,22 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +class Student(object): + + @property + def score(self): + return self._score + + @score.setter + def score(self, value): + if not isinstance(value, int): + raise ValueError('score must be an integer!') + if value < 0 or value > 100: + raise ValueError('score must between 0 ~ 100!') + self._score = value + +s = Student() +s.score = 60 +print('s.score =', s.score) +# ValueError: score must between 0 ~ 100! +s.score = 9999 diff --git a/learn-python3-samples/oop_advance/use_slots.py b/learn-python3-samples/oop_advance/use_slots.py new file mode 100644 index 00000000..ff98c2f6 --- /dev/null +++ b/learn-python3-samples/oop_advance/use_slots.py @@ -0,0 +1,21 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +class Student(object): + __slots__ = ('name', 'age') # 用tuple定义å…许绑定的属性å称 + +class GraduateStudent(Student): + pass + +s = Student() # 创建新的实例 +s.name = 'Michael' # 绑定属性'name' +s.age = 25 # 绑定属性'age' +# ERROR: AttributeError: 'Student' object has no attribute 'score' +try: + s.score = 99 +except AttributeError as e: + print('AttributeError:', e) + +g = GraduateStudent() +g.score = 99 +print('g.score =', g.score) diff --git a/learn-python3-samples/oop_basic/animals.py b/learn-python3-samples/oop_basic/animals.py new file mode 100644 index 00000000..e2153eac --- /dev/null +++ b/learn-python3-samples/oop_basic/animals.py @@ -0,0 +1,32 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +class Animal(object): + def run(self): + print('Animal is running...') + +class Dog(Animal): + def run(self): + print('Dog is running...') + +class Cat(Animal): + def run(self): + print('Cat is running...') + +def run_twice(animal): + animal.run() + animal.run() + +a = Animal() +d = Dog() +c = Cat() + +print('a is Animal?', isinstance(a, Animal)) +print('a is Dog?', isinstance(a, Dog)) +print('a is Cat?', isinstance(a, Cat)) + +print('d is Animal?', isinstance(d, Animal)) +print('d is Dog?', isinstance(d, Dog)) +print('d is Cat?', isinstance(d, Cat)) + +run_twice(c) diff --git a/learn-python3-samples/oop_basic/attrs.py b/learn-python3-samples/oop_basic/attrs.py new file mode 100644 index 00000000..1f8462d7 --- /dev/null +++ b/learn-python3-samples/oop_basic/attrs.py @@ -0,0 +1,25 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +class MyObject(object): + + def __init__(self): + self.x = 9 + + def power(self): + return self.x * self.x + +obj = MyObject() + +print('hasattr(obj, \'x\') =', hasattr(obj, 'x')) # 有属性'x'å—? +print('hasattr(obj, \'y\') =', hasattr(obj, 'y')) # 有属性'y'å—? +setattr(obj, 'y', 19) # 设置一个属性'y' +print('hasattr(obj, \'y\') =', hasattr(obj, 'y')) # 有属性'y'å—? +print('getattr(obj, \'y\') =', getattr(obj, 'y')) # 获å–属性'y' +print('obj.y =', obj.y) # 获å–属性'y' + +print('getattr(obj, \'z\') =',getattr(obj, 'z', 404)) # 获å–属性'z',如果ä¸å­˜åœ¨ï¼Œè¿”回默认值404 + +f = getattr(obj, 'power') # 获å–属性'power' +print(f) +print(f()) diff --git a/learn-python3-samples/oop_basic/get_instance.py b/learn-python3-samples/oop_basic/get_instance.py new file mode 100644 index 00000000..e2e2c92d --- /dev/null +++ b/learn-python3-samples/oop_basic/get_instance.py @@ -0,0 +1,30 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +class Animal(object): + pass + +class Dog(Animal): + pass + +class Husky(Dog): + pass + +a = Animal() +d = Dog() +h = Husky() + +print('check a = Animal()...') +print('isinstance(a, Animal) =', isinstance(a, Animal)) +print('isinstance(a, Dog) =', isinstance(a, Dog)) +print('isinstance(a, Husky) =', isinstance(a, Husky)) + +print('check d = Dog()...') +print('isinstance(d, Animal) =', isinstance(d, Animal)) +print('isinstance(d, Dog) =', isinstance(d, Dog)) +print('isinstance(d, Husky) =', isinstance(d, Husky)) + +print('check h = Husky()...') +print('isinstance(h, Animal) =', isinstance(h, Animal)) +print('isinstance(h, Dog) =', isinstance(h, Dog)) +print('isinstance(h, Husky) =', isinstance(h, Husky)) diff --git a/learn-python3-samples/oop_basic/get_type.py b/learn-python3-samples/oop_basic/get_type.py new file mode 100644 index 00000000..ae079e63 --- /dev/null +++ b/learn-python3-samples/oop_basic/get_type.py @@ -0,0 +1,14 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +# type() + +print('type(123) =', type(123)) +print('type(\'123\') =', type('123')) +print('type(None) =', type(None)) +print('type(abs) =', type(abs)) + +import types + +print('type(\'abc\')==str?', type('abc')==str) + diff --git a/learn-python3-samples/oop_basic/protected_student.py b/learn-python3-samples/oop_basic/protected_student.py new file mode 100644 index 00000000..6d67a71c --- /dev/null +++ b/learn-python3-samples/oop_basic/protected_student.py @@ -0,0 +1,35 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +class Student(object): + + def __init__(self, name, score): + self.__name = name + self.__score = score + + def get_name(self): + return self.__name + + def get_score(self): + return self.__score + + def set_score(self, score): + if 0 <= score <= 100: + self.__score = score + else: + raise ValueError('bad score') + + def get_grade(self): + if self.__score >= 90: + return 'A' + elif self.__score >= 60: + return 'B' + else: + return 'C' + +bart = Student('Bart Simpson', 59) +print('bart.get_name() =', bart.get_name()) +bart.set_score(60) +print('bart.get_score() =', bart.get_score()) + +print('DO NOT use bart._Student__name:', bart._Student__name) diff --git a/learn-python3-samples/oop_basic/right.html b/learn-python3-samples/oop_basic/right.html new file mode 100644 index 00000000..8a0f8503 --- /dev/null +++ b/learn-python3-samples/oop_basic/right.html @@ -0,0 +1,30 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/learn-python3-samples/oop_basic + + + + + + + + +
Folders
<Go Back>
+
+ + + + + +
FileFileFileFile
animals.py get_instance.py protected...ent.py student.py 
attrs.py get_type.py 
+ +

+Folders: 1
+Files: 6
+Size of all files: 3822 KB

+ + + \ No newline at end of file diff --git a/learn-python3-samples/oop_basic/student.py b/learn-python3-samples/oop_basic/student.py new file mode 100644 index 00000000..8a832ff0 --- /dev/null +++ b/learn-python3-samples/oop_basic/student.py @@ -0,0 +1,29 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +class Student(object): + + def __init__(self, name, score): + self.name = name + self.score = score + + def print_score(self): + print('%s: %s' % (self.name, self.score)) + + def get_grade(self): + if self.score >= 90: + return 'A' + elif self.score >= 60: + return 'B' + else: + return 'C' + +bart = Student('Bart Simpson', 59) +lisa = Student('Lisa Simpson', 87) + +print('bart.name =', bart.name) +print('bart.score =', bart.score) +bart.print_score() + +print('grade of Bart:', bart.get_grade()) +print('grade of Lisa:', lisa.get_grade()) diff --git a/learn-python3-samples/regex/regex.py b/learn-python3-samples/regex/regex.py new file mode 100644 index 00000000..89ef876e --- /dev/null +++ b/learn-python3-samples/regex/regex.py @@ -0,0 +1,13 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +import re + +print('Test: 010-12345') +m = re.match(r'^(\d{3})-(\d{3,8})$', '010-12345') +print(m.group(1), m.group(2)) + +t = '19:05:30' +print('Test:', t) +m = re.match(r'^(0[0-9]|1[0-9]|2[0-3]|[0-9])\:(0[0-9]|1[0-9]|2[0-9]|3[0-9]|4[0-9]|5[0-9]|[0-9])\:(0[0-9]|1[0-9]|2[0-9]|3[0-9]|4[0-9]|5[0-9]|[0-9])$', t) +print(m.groups()) diff --git a/learn-python3-samples/regex/right.html b/learn-python3-samples/regex/right.html new file mode 100644 index 00000000..0cb31af6 --- /dev/null +++ b/learn-python3-samples/regex/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/learn-python3-samples/regex + + + + + + + + +
Folders
<Go Back>
+
+ + + + +
FileFileFileFile
regex.py 
+ +

+Folders: 1
+Files: 1
+Size of all files: 369 KB

+ + + \ No newline at end of file diff --git a/learn-python3-samples/right.html b/learn-python3-samples/right.html new file mode 100644 index 00000000..d19c593a --- /dev/null +++ b/learn-python3-samples/right.html @@ -0,0 +1,28 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/learn-python3-samples + + + + + + + + + + + + + +
Folders
<Go Back> db mail oop_basic
advance debug micropython regex
async function module socket
basic functional multitask test
commonlib gui oop_advance web
context io
+
+ +

+Folders: 22
+

+ + + \ No newline at end of file diff --git a/learn-python3-samples/socket/do_tcp.py b/learn-python3-samples/socket/do_tcp.py new file mode 100644 index 00000000..c2bd1fc7 --- /dev/null +++ b/learn-python3-samples/socket/do_tcp.py @@ -0,0 +1,35 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +import socket + +# 创建一个socket: +s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + +# 建立连接: +s.connect(('www.sina.com.cn', 80)) + +# å‘é€æ•°æ®: +s.send(b'GET / HTTP/1.1\r\nHost: www.sina.com.cn\r\nConnection: close\r\n\r\n') + +# 接收数æ®: +buffer = [] +while True: + # æ¯æ¬¡æœ€å¤šæŽ¥æ”¶1k字节: + d = s.recv(1024) + if d: + buffer.append(d) + else: + break + +data = b''.join(buffer) + +# 关闭连接: +s.close() + +header, html = data.split(b'\r\n\r\n', 1) +print(header.decode('utf-8')) + +# 把接收的数æ®å†™å…¥æ–‡ä»¶: +with open('sina.html', 'wb') as f: + f.write(html) diff --git a/learn-python3-samples/socket/right.html b/learn-python3-samples/socket/right.html new file mode 100644 index 00000000..161d0582 --- /dev/null +++ b/learn-python3-samples/socket/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/learn-python3-samples/socket + + + + + + + + +
Folders
<Go Back>
+
+ + + + +
FileFileFileFile
do_tcp.py udp_client.py udp_server.py 
+ +

+Folders: 1
+Files: 3
+Size of all files: 1339 KB

+ + + \ No newline at end of file diff --git a/learn-python3-samples/socket/udp_client.py b/learn-python3-samples/socket/udp_client.py new file mode 100644 index 00000000..a7957736 --- /dev/null +++ b/learn-python3-samples/socket/udp_client.py @@ -0,0 +1,14 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +import socket + +s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + +for data in [b'Michael', b'Tracy', b'Sarah']: + # å‘é€æ•°æ®: + s.sendto(data, ('127.0.0.1', 9999)) + # 接收数æ®: + print(s.recv(1024).decode('utf-8')) + +s.close() diff --git a/learn-python3-samples/socket/udp_server.py b/learn-python3-samples/socket/udp_server.py new file mode 100644 index 00000000..7f54915f --- /dev/null +++ b/learn-python3-samples/socket/udp_server.py @@ -0,0 +1,18 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +import socket + +s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + +# 绑定端å£: +s.bind(('127.0.0.1', 9999)) + +print('Bind UDP on 9999...') + +while True: + # 接收数æ®: + data, addr = s.recvfrom(1024) + print('Received from %s:%s.' % addr) + reply = 'Hello, %s!' % data.decode('utf-8') + s.sendto(reply.encode('utf-8'), addr) diff --git a/learn-python3-samples/test/dict_doctest.py b/learn-python3-samples/test/dict_doctest.py new file mode 100644 index 00000000..a0bc4ac7 --- /dev/null +++ b/learn-python3-samples/test/dict_doctest.py @@ -0,0 +1,41 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +class Dict(dict): + ''' + Simple dict but also support access as x.y style. + + >>> d1 = Dict() + >>> d1['x'] = 100 + >>> d1.x + 100 + >>> d1.y = 200 + >>> d1['y'] + 200 + >>> d2 = Dict(a=1, b=2, c='3') + >>> d2.c + '3' + >>> d2['empty'] + Traceback (most recent call last): + ... + KeyError: 'empty' + >>> d2.empty + Traceback (most recent call last): + ... + AttributeError: 'Dict' object has no attribute 'empty' + ''' + def __init__(self, **kw): + super(Dict, self).__init__(**kw) + + def __getattr__(self, key): + try: + return self[key] + except KeyError: + raise AttributeError(r"'Dict' object has no attribute '%s'" % key) + + def __setattr__(self, key, value): + self[key] = value + +if __name__=='__main__': + import doctest + doctest.testmod() diff --git a/learn-python3-samples/test/dict_unittest.py b/learn-python3-samples/test/dict_unittest.py new file mode 100644 index 00000000..ab550b16 --- /dev/null +++ b/learn-python3-samples/test/dict_unittest.py @@ -0,0 +1,56 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +import unittest + +class Dict(dict): + + def __init__(self, **kw): + super(Dict, self).__init__(**kw) + + def __getattr__(self, key): + try: + return self[key] + except KeyError: + raise AttributeError(r"'Dict' object has no attribute '%s'" % key) + + def __setattr__(self, key, value): + self[key] = value + +class TestDict(unittest.TestCase): + + def setUp(self): + print('setUp...') + + def tearDown(self): + print('tearDown...') + + def test_init(self): + d = Dict(a=1, b='test') + self.assertEqual(d.a, 1) + self.assertEqual(d.b, 'test') + self.assertTrue(isinstance(d, dict)) + + def test_key(self): + d = Dict() + d['key'] = 'value' + self.assertEqual(d.key, 'value') + + def test_attr(self): + d = Dict() + d.key = 'value' + self.assertTrue('key' in d) + self.assertEqual(d['key'], 'value') + + def test_keyerror(self): + d = Dict() + with self.assertRaises(KeyError): + value = d['empty'] + + def test_attrerror(self): + d = Dict() + with self.assertRaises(AttributeError): + value = d.empty + +if __name__ == '__main__': + unittest.main() diff --git a/learn-python3-samples/test/right.html b/learn-python3-samples/test/right.html new file mode 100644 index 00000000..40ecfcb9 --- /dev/null +++ b/learn-python3-samples/test/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/learn-python3-samples/test + + + + + + + + +
Folders
<Go Back>
+
+ + + + +
FileFileFileFile
dict_doctest.py dict_unittest.py 
+ +

+Folders: 1
+Files: 2
+Size of all files: 2171 KB

+ + + \ No newline at end of file diff --git a/learn-python3-samples/web/do_flask.py b/learn-python3-samples/web/do_flask.py new file mode 100644 index 00000000..4f86584a --- /dev/null +++ b/learn-python3-samples/web/do_flask.py @@ -0,0 +1,29 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +from flask import Flask +from flask import request + +app = Flask(__name__) + +@app.route('/', methods=['GET', 'POST']) +def home(): + return '

Home

' + +@app.route('/signin', methods=['GET']) +def signin_form(): + return '''
+

+

+

+
''' + +@app.route('/signin', methods=['POST']) +def signin(): + # 需è¦ä»Žrequest对象读å–表å•å†…容: + if request.form['username']=='admin' and request.form['password']=='password': + return '

Hello, admin!

' + return '

Bad username or password.

' + +if __name__ == '__main__': + app.run() diff --git a/learn-python3-samples/web/do_wsgi.py b/learn-python3-samples/web/do_wsgi.py new file mode 100644 index 00000000..1e60a6b1 --- /dev/null +++ b/learn-python3-samples/web/do_wsgi.py @@ -0,0 +1,11 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +from wsgiref.simple_server import make_server + +from hello import application + +httpd = make_server('', 8000, application) +print('Serving HTTP on port 8000...') + +httpd.serve_forever() diff --git a/learn-python3-samples/web/hello.py b/learn-python3-samples/web/hello.py new file mode 100644 index 00000000..3150c226 --- /dev/null +++ b/learn-python3-samples/web/hello.py @@ -0,0 +1,7 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +def application(environ, start_response): + start_response('200 OK', [('Content-Type', 'text/html')]) + body = '

Hello, %s!

' % (environ['PATH_INFO'][1:] or 'web') + return [body.encode('utf-8')] diff --git a/learn-python3-samples/web/mvc/app.py b/learn-python3-samples/web/mvc/app.py new file mode 100644 index 00000000..3431919e --- /dev/null +++ b/learn-python3-samples/web/mvc/app.py @@ -0,0 +1,25 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +from flask import Flask, request, render_template + +app = Flask(__name__) + +@app.route('/', methods=['GET', 'POST']) +def home(): + return render_template('home.html') + +@app.route('/signin', methods=['GET']) +def signin_form(): + return render_template('form.html') + +@app.route('/signin', methods=['POST']) +def signin(): + username = request.form['username'] + password = request.form['password'] + if username=='admin' and password=='password': + return render_template('signin-ok.html', username=username) + return render_template('form.html', message='Bad username or password', username=username) + +if __name__ == '__main__': + app.run() diff --git a/learn-python3-samples/web/mvc/right.html b/learn-python3-samples/web/mvc/right.html new file mode 100644 index 00000000..7f141e02 --- /dev/null +++ b/learn-python3-samples/web/mvc/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/learn-python3-samples/web/mvc + + + + + + + + +
Folders
<Go Back> templates
+
+ + + + +
FileFileFileFile
app.py 
+ +

+Folders: 2
+Files: 1
+Size of all files: 705 KB

+ + + \ No newline at end of file diff --git a/learn-python3-samples/web/mvc/templates/form.html b/learn-python3-samples/web/mvc/templates/form.html new file mode 100644 index 00000000..316092ac --- /dev/null +++ b/learn-python3-samples/web/mvc/templates/form.html @@ -0,0 +1,16 @@ + + + Please Sign In + + + {% if message %} +

{{ message }}

+ {% endif %} +
+ Please sign in: +

+

+

+
+ + diff --git a/learn-python3-samples/web/mvc/templates/home.html b/learn-python3-samples/web/mvc/templates/home.html new file mode 100644 index 00000000..a53b4aff --- /dev/null +++ b/learn-python3-samples/web/mvc/templates/home.html @@ -0,0 +1,8 @@ + + + Home + + +

Home

+ + diff --git a/learn-python3-samples/web/mvc/templates/right.html b/learn-python3-samples/web/mvc/templates/right.html new file mode 100644 index 00000000..0c26c4fd --- /dev/null +++ b/learn-python3-samples/web/mvc/templates/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/learn-python3-samples/web/mvc/templates + + + + + + + + +
Folders
<Go Back>
+
+ + + + +
FileFileFileFile
form.html home.html signin-ok.html 
+ +

+Folders: 1
+Files: 3
+Size of all files: 672 KB

+ + + \ No newline at end of file diff --git a/learn-python3-samples/web/mvc/templates/signin-ok.html b/learn-python3-samples/web/mvc/templates/signin-ok.html new file mode 100644 index 00000000..61879397 --- /dev/null +++ b/learn-python3-samples/web/mvc/templates/signin-ok.html @@ -0,0 +1,8 @@ + + + Welcome, {{ username }} + + +

Welcome, {{ username }}!

+ + diff --git a/learn-python3-samples/web/right.html b/learn-python3-samples/web/right.html new file mode 100644 index 00000000..e3e798d9 --- /dev/null +++ b/learn-python3-samples/web/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/learn-python3-samples/web + + + + + + + + +
Folders
<Go Back> mvc
+
+ + + + +
FileFileFileFile
do_flask.py do_wsgi.py hello.py 
+ +

+Folders: 2
+Files: 3
+Size of all files: 1309 KB

+ + + \ No newline at end of file diff --git a/left.html b/left.html new file mode 100644 index 00000000..75616e8a --- /dev/null +++ b/left.html @@ -0,0 +1,27 @@ + + + + + +/Users/bryan/Downloads/PYTHON-REPO + + + + + + + + + + + + + +
Folders
<RETURN TO NAVIGATION>
DOCS
learn-pyt...amples
prac-4-beginners
python-mega-algo
+
+ + + + \ No newline at end of file diff --git a/prac-4-beginners/code/05-interactive-code/m-n-m/.idea/.gitignore b/prac-4-beginners/code/05-interactive-code/m-n-m/.idea/.gitignore new file mode 100644 index 00000000..5c98b428 --- /dev/null +++ b/prac-4-beginners/code/05-interactive-code/m-n-m/.idea/.gitignore @@ -0,0 +1,2 @@ +# Default ignored files +/workspace.xml \ No newline at end of file diff --git a/prac-4-beginners/code/05-interactive-code/m-n-m/.idea/.name b/prac-4-beginners/code/05-interactive-code/m-n-m/.idea/.name new file mode 100644 index 00000000..dcf0a958 --- /dev/null +++ b/prac-4-beginners/code/05-interactive-code/m-n-m/.idea/.name @@ -0,0 +1 @@ +M&M Guessing \ No newline at end of file diff --git a/prac-4-beginners/code/05-interactive-code/m-n-m/.idea/M&M Guessing.iml b/prac-4-beginners/code/05-interactive-code/m-n-m/.idea/M&M Guessing.iml new file mode 100644 index 00000000..4bb64fcf --- /dev/null +++ b/prac-4-beginners/code/05-interactive-code/m-n-m/.idea/M&M Guessing.iml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/prac-4-beginners/code/05-interactive-code/m-n-m/.idea/inspectionProfiles/profiles_settings.xml b/prac-4-beginners/code/05-interactive-code/m-n-m/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 00000000..105ce2da --- /dev/null +++ b/prac-4-beginners/code/05-interactive-code/m-n-m/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/prac-4-beginners/code/05-interactive-code/m-n-m/.idea/misc.xml b/prac-4-beginners/code/05-interactive-code/m-n-m/.idea/misc.xml new file mode 100644 index 00000000..a8117256 --- /dev/null +++ b/prac-4-beginners/code/05-interactive-code/m-n-m/.idea/misc.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/prac-4-beginners/code/05-interactive-code/m-n-m/.idea/modules.xml b/prac-4-beginners/code/05-interactive-code/m-n-m/.idea/modules.xml new file mode 100644 index 00000000..4943257c --- /dev/null +++ b/prac-4-beginners/code/05-interactive-code/m-n-m/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/prac-4-beginners/code/05-interactive-code/m-n-m/.idea/vcs.xml b/prac-4-beginners/code/05-interactive-code/m-n-m/.idea/vcs.xml new file mode 100644 index 00000000..c2365ab1 --- /dev/null +++ b/prac-4-beginners/code/05-interactive-code/m-n-m/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/prac-4-beginners/code/05-interactive-code/m-n-m/guessinggame.py b/prac-4-beginners/code/05-interactive-code/m-n-m/guessinggame.py new file mode 100644 index 00000000..f919ba7a --- /dev/null +++ b/prac-4-beginners/code/05-interactive-code/m-n-m/guessinggame.py @@ -0,0 +1,27 @@ +import random + +print("------------------------------") +print(" M&M guessing game!") +print("------------------------------") + +print("Guess the number of M&Ms and you get lunch on the house!") +print() + +mm_count = random.randint(1, 100) +attempt_limit = 5 +attempts = 0 + +while attempts < attempt_limit: + guess_text = input("How many M&Ms are in the jar? ") + guess = int(guess_text) + attempts += 1 + + if mm_count == guess: + print(f"You got a free lunch! It was {guess}.") + break + elif guess < mm_count: + print("Sorry, that's too LOW!") + else: + print("That's too HIGH!") + +print(f"Bye, you're done in {attempts}!") diff --git a/prac-4-beginners/code/05-interactive-code/m-n-m/right.html b/prac-4-beginners/code/05-interactive-code/m-n-m/right.html new file mode 100644 index 00000000..0e5ad346 --- /dev/null +++ b/prac-4-beginners/code/05-interactive-code/m-n-m/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/prac-4-beginners/code/05-interactive-code/m-n-m + + + + + + + + +
Folders
<Go Back>
+
+ + + + +
FileFileFileFile
guessinggame.py 
+ +

+Folders: 1
+Files: 1
+Size of all files: 656 KB

+ + + \ No newline at end of file diff --git a/prac-4-beginners/code/05-interactive-code/right.html b/prac-4-beginners/code/05-interactive-code/right.html new file mode 100644 index 00000000..836377ac --- /dev/null +++ b/prac-4-beginners/code/05-interactive-code/right.html @@ -0,0 +1,23 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/prac-4-beginners/code/05-interactive-code + + + + + + + + +
Folders
<Go Back> m-n-m
+
+ +

+Folders: 2
+

+ + + \ No newline at end of file diff --git a/prac-4-beginners/code/06-organizing-code-with-functions/right.html b/prac-4-beginners/code/06-organizing-code-with-functions/right.html new file mode 100644 index 00000000..71aea14b --- /dev/null +++ b/prac-4-beginners/code/06-organizing-code-with-functions/right.html @@ -0,0 +1,23 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/prac-4-beginners/code/06-organizing-code-with-functions + + + + + + + + +
Folders
<Go Back> rocks-game
+
+ +

+Folders: 2
+

+ + + \ No newline at end of file diff --git a/prac-4-beginners/code/06-organizing-code-with-functions/rocks-game/.idea/.gitignore b/prac-4-beginners/code/06-organizing-code-with-functions/rocks-game/.idea/.gitignore new file mode 100644 index 00000000..5c98b428 --- /dev/null +++ b/prac-4-beginners/code/06-organizing-code-with-functions/rocks-game/.idea/.gitignore @@ -0,0 +1,2 @@ +# Default ignored files +/workspace.xml \ No newline at end of file diff --git a/prac-4-beginners/code/06-organizing-code-with-functions/rocks-game/.idea/.name b/prac-4-beginners/code/06-organizing-code-with-functions/rocks-game/.idea/.name new file mode 100644 index 00000000..36f3bc56 --- /dev/null +++ b/prac-4-beginners/code/06-organizing-code-with-functions/rocks-game/.idea/.name @@ -0,0 +1 @@ +RPS Functions \ No newline at end of file diff --git a/prac-4-beginners/code/06-organizing-code-with-functions/rocks-game/.idea/RPS Functions.iml b/prac-4-beginners/code/06-organizing-code-with-functions/rocks-game/.idea/RPS Functions.iml new file mode 100644 index 00000000..4deaec04 --- /dev/null +++ b/prac-4-beginners/code/06-organizing-code-with-functions/rocks-game/.idea/RPS Functions.iml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/prac-4-beginners/code/06-organizing-code-with-functions/rocks-game/.idea/inspectionProfiles/profiles_settings.xml b/prac-4-beginners/code/06-organizing-code-with-functions/rocks-game/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 00000000..105ce2da --- /dev/null +++ b/prac-4-beginners/code/06-organizing-code-with-functions/rocks-game/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/prac-4-beginners/code/06-organizing-code-with-functions/rocks-game/.idea/misc.xml b/prac-4-beginners/code/06-organizing-code-with-functions/rocks-game/.idea/misc.xml new file mode 100644 index 00000000..55b47982 --- /dev/null +++ b/prac-4-beginners/code/06-organizing-code-with-functions/rocks-game/.idea/misc.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/prac-4-beginners/code/06-organizing-code-with-functions/rocks-game/.idea/modules.xml b/prac-4-beginners/code/06-organizing-code-with-functions/rocks-game/.idea/modules.xml new file mode 100644 index 00000000..66e2a585 --- /dev/null +++ b/prac-4-beginners/code/06-organizing-code-with-functions/rocks-game/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/prac-4-beginners/code/06-organizing-code-with-functions/rocks-game/.idea/vcs.xml b/prac-4-beginners/code/06-organizing-code-with-functions/rocks-game/.idea/vcs.xml new file mode 100644 index 00000000..c2365ab1 --- /dev/null +++ b/prac-4-beginners/code/06-organizing-code-with-functions/rocks-game/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/prac-4-beginners/code/06-organizing-code-with-functions/rocks-game/right.html b/prac-4-beginners/code/06-organizing-code-with-functions/rocks-game/right.html new file mode 100644 index 00000000..0fe1af4e --- /dev/null +++ b/prac-4-beginners/code/06-organizing-code-with-functions/rocks-game/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/prac-4-beginners/code/06-organizing-code-with-functions/rocks-game + + + + + + + + +
Folders
<Go Back>
+
+ + + + +
FileFileFileFile
rpsgame.py 
+ +

+Folders: 1
+Files: 1
+Size of all files: 2565 KB

+ + + \ No newline at end of file diff --git a/prac-4-beginners/code/06-organizing-code-with-functions/rocks-game/rpsgame.py b/prac-4-beginners/code/06-organizing-code-with-functions/rocks-game/rpsgame.py new file mode 100644 index 00000000..95e78af7 --- /dev/null +++ b/prac-4-beginners/code/06-organizing-code-with-functions/rocks-game/rpsgame.py @@ -0,0 +1,106 @@ +import random + + +def main(): + show_header() + play_game("You", "Computer") + + +def show_header(): + print("---------------------------") + print(" Rock Paper Scissors") + print(" Function Edition") + print("---------------------------") + + +def play_game(player_1, player_2): + rounds = 3 + wins_p1 = 0 + wins_p2 = 0 + + rolls = ['rock', 'paper', 'scissors'] + + while wins_p1 < rounds and wins_p2 < rounds: + roll1 = get_roll(player_1, rolls) + roll2 = random.choice(rolls) + + if not roll1: + print("Try again!") + continue + + print(f"{player_1} roll {roll1}") + print(f"{player_2} rolls {roll2}") + + winner = check_for_winning_throw(player_1, player_2, roll1, roll2) + + if winner is None: + print("This round was a tie!") + else: + print(f'{winner} takes the round!') + if winner == player_1: + wins_p1 += 1 + elif winner == player_2: + wins_p2 += 1 + + print(f"Score is {player_1}: {wins_p1} and {player_2}: {wins_p2}.") + print() + + if wins_p1 >= rounds: + overall_winner = player_1 + else: + overall_winner = player_2 + + print(f"{overall_winner} wins the game!") + + +def check_for_winning_throw(player_1, player_2, roll1, roll2): + # Rock + # Rock -> tie + # Paper -> lose + # Scissors -> win + # Paper + # Rock -> win + # Paper -> tie + # Scissors -> lose + # Scissors + # Rock -> lose + # Paper -> win + # Scissors -> tie + winner = None + if roll1 == roll2: + print("The play was tied!") + elif roll1 == 'rock': + if roll2 == 'paper': + winner = player_2 + elif roll2 == 'scissors': + winner = player_1 + elif roll1 == 'paper': + if roll2 == 'scissors': + winner = player_2 + elif roll2 == 'rock': + winner = player_1 + elif roll1 == 'scissors': + if roll2 == 'rock': + winner = player_2 + elif roll2 == 'paper': + winner = player_1 + return winner + + +def get_roll(player_name, rolls): + print("Available rolls:") + for index, r in enumerate(rolls, start=1): + print(f"{index}. {r}") + + text = input(f"{player_name}, what is your roll? ") + selected_index = int(text) - 1 + + if selected_index < 0 or selected_index >= len(rolls): + print(f"Sorry {player_name}, {text} is out of bounds!") + return None + + return rolls[selected_index] + + +if __name__ == '__main__': + main() diff --git a/prac-4-beginners/code/07-data-structures/right.html b/prac-4-beginners/code/07-data-structures/right.html new file mode 100644 index 00000000..e14262ff --- /dev/null +++ b/prac-4-beginners/code/07-data-structures/right.html @@ -0,0 +1,23 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/prac-4-beginners/code/07-data-structures + + + + + + + + +
Folders
<Go Back> rocks-game simple_dict
+
+ +

+Folders: 3
+

+ + + \ No newline at end of file diff --git a/prac-4-beginners/code/07-data-structures/rocks-game/.idea/.gitignore b/prac-4-beginners/code/07-data-structures/rocks-game/.idea/.gitignore new file mode 100644 index 00000000..5c98b428 --- /dev/null +++ b/prac-4-beginners/code/07-data-structures/rocks-game/.idea/.gitignore @@ -0,0 +1,2 @@ +# Default ignored files +/workspace.xml \ No newline at end of file diff --git a/prac-4-beginners/code/07-data-structures/rocks-game/.idea/.name b/prac-4-beginners/code/07-data-structures/rocks-game/.idea/.name new file mode 100644 index 00000000..2a943eb7 --- /dev/null +++ b/prac-4-beginners/code/07-data-structures/rocks-game/.idea/.name @@ -0,0 +1 @@ +RPS Data Structures \ No newline at end of file diff --git a/prac-4-beginners/code/07-data-structures/rocks-game/.idea/RPS Data Structures.iml b/prac-4-beginners/code/07-data-structures/rocks-game/.idea/RPS Data Structures.iml new file mode 100644 index 00000000..b5740c88 --- /dev/null +++ b/prac-4-beginners/code/07-data-structures/rocks-game/.idea/RPS Data Structures.iml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/prac-4-beginners/code/07-data-structures/rocks-game/.idea/inspectionProfiles/profiles_settings.xml b/prac-4-beginners/code/07-data-structures/rocks-game/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 00000000..105ce2da --- /dev/null +++ b/prac-4-beginners/code/07-data-structures/rocks-game/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/prac-4-beginners/code/07-data-structures/rocks-game/.idea/modules.xml b/prac-4-beginners/code/07-data-structures/rocks-game/.idea/modules.xml new file mode 100644 index 00000000..f72623fa --- /dev/null +++ b/prac-4-beginners/code/07-data-structures/rocks-game/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/prac-4-beginners/code/07-data-structures/rocks-game/.idea/vcs.xml b/prac-4-beginners/code/07-data-structures/rocks-game/.idea/vcs.xml new file mode 100644 index 00000000..c2365ab1 --- /dev/null +++ b/prac-4-beginners/code/07-data-structures/rocks-game/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/prac-4-beginners/code/07-data-structures/rocks-game/right.html b/prac-4-beginners/code/07-data-structures/rocks-game/right.html new file mode 100644 index 00000000..1ccfc5d4 --- /dev/null +++ b/prac-4-beginners/code/07-data-structures/rocks-game/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/prac-4-beginners/code/07-data-structures/rocks-game + + + + + + + + +
Folders
<Go Back>
+
+ + + + +
FileFileFileFile
rpsgame.py 
+ +

+Folders: 1
+Files: 1
+Size of all files: 2385 KB

+ + + \ No newline at end of file diff --git a/prac-4-beginners/code/07-data-structures/rocks-game/rpsgame.py b/prac-4-beginners/code/07-data-structures/rocks-game/rpsgame.py new file mode 100644 index 00000000..70ce1d0b --- /dev/null +++ b/prac-4-beginners/code/07-data-structures/rocks-game/rpsgame.py @@ -0,0 +1,102 @@ +import random + +rolls = { + 'rock': { + 'defeats': ['scissors'], + 'defeated_by': ['paper'] + }, + 'paper': { + 'defeats': ['rock'], + 'defeated_by': ['scissors'] + }, + 'scissors': { + 'defeats': ['paper'], + 'defeated_by': ['rock'] + }, +} + + +def main(): + show_header() + play_game("You", "Computer") + + +def show_header(): + print("---------------------------") + print(" Rock Paper Scissors") + print(" Data Structures Edition") + print("---------------------------") + + +def play_game(player_1, player_2): + wins = {player_1: 0, player_2: 0} + roll_names = list(rolls.keys()) + + while not find_winner(wins, wins.keys()): + roll1 = get_roll(player_1, roll_names) + roll2 = random.choice(roll_names) + + if not roll1: + print("Try again!") + continue + + print(f"{player_1} roll {roll1}") + print(f"{player_2} rolls {roll2}") + + winner = check_for_winning_throw(player_1, player_2, roll1, roll2) + + if winner is None: + print("This round was a tie!") + else: + print(f'{winner} takes the round!') + wins[winner] += 1 + + # print(f"Current win status: {wins}") + + print(f"Score is {player_1}: {wins[player_1]} and {player_2}: {wins[player_2]}.") + print() + + overall_winner = find_winner(wins, wins.keys()) + print(f"{overall_winner} wins the game!") + + +def find_winner(wins, names): + best_of = 3 + for name in names: + if wins.get(name, 0) >= best_of: + return name + + return None + + +def check_for_winning_throw(player_1, player_2, roll1, roll2): + winner = None + if roll1 == roll2: + print("The play was tied!") + + outcome = rolls.get(roll1, {}) + if roll2 in outcome.get('defeats'): + return player_1 + elif roll2 in outcome.get('defeated_by'): + return player_2 + + return winner + + +def get_roll(player_name, roll_names): + print("Available rolls:") + for index, r in enumerate(roll_names, start=1): + print(f"{index}. {r}") + + text = input(f"{player_name}, what is your roll? ") + selected_index = int(text) - 1 + + if selected_index < 0 or selected_index >= len(rolls): + print(f"Sorry {player_name}, {text} is out of bounds!") + return None + + return roll_names[selected_index] + + +if __name__ == '__main__': + main() diff --git a/prac-4-beginners/code/07-data-structures/simple_dict/.idea/.gitignore b/prac-4-beginners/code/07-data-structures/simple_dict/.idea/.gitignore new file mode 100644 index 00000000..5c98b428 --- /dev/null +++ b/prac-4-beginners/code/07-data-structures/simple_dict/.idea/.gitignore @@ -0,0 +1,2 @@ +# Default ignored files +/workspace.xml \ No newline at end of file diff --git a/prac-4-beginners/code/07-data-structures/simple_dict/.idea/.name b/prac-4-beginners/code/07-data-structures/simple_dict/.idea/.name new file mode 100644 index 00000000..5584fec0 --- /dev/null +++ b/prac-4-beginners/code/07-data-structures/simple_dict/.idea/.name @@ -0,0 +1 @@ +Data Structure Exploration \ No newline at end of file diff --git a/prac-4-beginners/code/07-data-structures/simple_dict/.idea/Data Structure Exploration.iml b/prac-4-beginners/code/07-data-structures/simple_dict/.idea/Data Structure Exploration.iml new file mode 100644 index 00000000..26b397d1 --- /dev/null +++ b/prac-4-beginners/code/07-data-structures/simple_dict/.idea/Data Structure Exploration.iml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/prac-4-beginners/code/07-data-structures/simple_dict/playground.py b/prac-4-beginners/code/07-data-structures/simple_dict/playground.py new file mode 100644 index 00000000..b8e36eba --- /dev/null +++ b/prac-4-beginners/code/07-data-structures/simple_dict/playground.py @@ -0,0 +1,39 @@ +# Data structures +# 1. Dictionaries +# 2. Lists / arrays [1,1,7,11] +# 3. Sets + +# Lists +lst = [1, 1, 11, 7] +print(lst) +lst.append(2) +print(lst) +lst.remove(11) +print(lst) +lst.sort() +print(lst) + +# Sets: +st = {1, 1, 11, 7} +st.add(1) +st.add(1) +st.add(11) +print(st) + +# Dictionaries +d = { + 'bob': 0, + 'sarah': 0, + 'defeated_by': {'paper', 'wolf'}, + 'defeats': {'scissors', 'sponge'} +} + +print(d['bob']) +d['bob'] += 1 +print(d['bob']) +print(d) +d['michael'] = 7 +print(d) +print(f"You are defeated by {d['defeated_by']}") +print(d.get('other', 42)) + diff --git a/prac-4-beginners/code/07-data-structures/simple_dict/right.html b/prac-4-beginners/code/07-data-structures/simple_dict/right.html new file mode 100644 index 00000000..04263c55 --- /dev/null +++ b/prac-4-beginners/code/07-data-structures/simple_dict/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/prac-4-beginners/code/07-data-structures/simple_dict + + + + + + + + +
Folders
<Go Back>
+
+ + + + +
FileFileFileFile
playground.py 
+ +

+Folders: 1
+Files: 1
+Size of all files: 547 KB

+ + + \ No newline at end of file diff --git a/prac-4-beginners/code/08-problem-solving/right.html b/prac-4-beginners/code/08-problem-solving/right.html new file mode 100644 index 00000000..8b47bbf5 --- /dev/null +++ b/prac-4-beginners/code/08-problem-solving/right.html @@ -0,0 +1,23 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/prac-4-beginners/code/08-problem-solving + + + + + + + + +
Folders
<Go Back> tictactoe
+
+ +

+Folders: 2
+

+ + + \ No newline at end of file diff --git a/prac-4-beginners/code/08-problem-solving/tictactoe/.idea/.gitignore b/prac-4-beginners/code/08-problem-solving/tictactoe/.idea/.gitignore new file mode 100644 index 00000000..5c98b428 --- /dev/null +++ b/prac-4-beginners/code/08-problem-solving/tictactoe/.idea/.gitignore @@ -0,0 +1,2 @@ +# Default ignored files +/workspace.xml \ No newline at end of file diff --git a/prac-4-beginners/code/08-problem-solving/tictactoe/.idea/.name b/prac-4-beginners/code/08-problem-solving/tictactoe/.idea/.name new file mode 100644 index 00000000..f063dcbe --- /dev/null +++ b/prac-4-beginners/code/08-problem-solving/tictactoe/.idea/.name @@ -0,0 +1 @@ +Tic Tac Toe \ No newline at end of file diff --git a/prac-4-beginners/code/08-problem-solving/tictactoe/.idea/dictionaries/screencaster.xml b/prac-4-beginners/code/08-problem-solving/tictactoe/.idea/dictionaries/screencaster.xml new file mode 100644 index 00000000..176e66ee --- /dev/null +++ b/prac-4-beginners/code/08-problem-solving/tictactoe/.idea/dictionaries/screencaster.xml @@ -0,0 +1,7 @@ + + + + diag + + + \ No newline at end of file diff --git a/prac-4-beginners/code/08-problem-solving/tictactoe/game.py b/prac-4-beginners/code/08-problem-solving/tictactoe/game.py new file mode 100644 index 00000000..b6df15ae --- /dev/null +++ b/prac-4-beginners/code/08-problem-solving/tictactoe/game.py @@ -0,0 +1,125 @@ +# √ choose the players +# √ create the board +# √ choose an initial player +# √ until someone wins, check for winner +# √ show the board +# √ choose location, mark it +# √ toggle active player + +# √ game over, active player won! + + +def main(): + print() + print("Welcome to TIC TAC TOE from TALK PYTHON") + print() + + # CREATE THE BOARD: + # Board is a list of rows + # Rows are a list of cells + board = [ + [None, None, None], + [None, None, None], + [None, None, None], + ] + + # CHOOSE INITIAL PLAYER + active_player_index = 0 + players = ["Michael", "Computer"] + symbols = ["X", "O"] + player = players[active_player_index] + + # UNTIL SOMEONE WINS + while not find_winner(board): + # SHOW THE BOARD + player = players[active_player_index] + symbol = symbols[active_player_index] + + announce_turn(player) + show_board(board) + if not choose_location(board, symbol): + print("That isn't an option, try again.") + continue + + # TOGGLE ACTIVE PLAYER + active_player_index = (active_player_index + 1) % len(players) + + print() + print(f"GAME OVER! {player} has won with the board: ") + show_board(board) + print() + + +def choose_location(board, symbol): + row = int(input("Choose which row: ")) + column = int(input("Choose which column: ")) + + row -= 1 + column -= 1 + if row < 0 or row >= len(board): + return False + if column < 0 or column >= len(board[0]): + return False + + cell = board[row][column] + if cell is not None: + return False + + board[row][column] = symbol + return True + + +def show_board(board): + for row in board: + print("| ", end='') + for cell in row: + symbol = cell if cell is not None else "_" + print(symbol, end=" | ") + print() + + +def announce_turn(player): + print() + print(f"It's {player}'s turn. Here's the board:") + print() + + +def find_winner(board): + sequences = get_winning_sequences(board) + + for cells in sequences: + symbol1 = cells[0] + if symbol1 and all(symbol1 == cell for cell in cells): + return True + + return False + + +def get_winning_sequences(board): + sequences = [] + + # Win by rows + rows = board + sequences.extend(rows) + + # Win by columns + for col_idx in range(0, 3): + col = [ + board[0][col_idx], + board[1][col_idx], + board[2][col_idx], + ] + sequences.append(col) + + # Win by diagonals + diagonals = [ + [board[0][0], board[1][1], board[2][2]], + [board[0][2], board[1][1], board[2][0]], + ] + sequences.extend(diagonals) + + return sequences + + +if __name__ == '__main__': + main() diff --git a/prac-4-beginners/code/08-problem-solving/tictactoe/right.html b/prac-4-beginners/code/08-problem-solving/tictactoe/right.html new file mode 100644 index 00000000..fc3311bf --- /dev/null +++ b/prac-4-beginners/code/08-problem-solving/tictactoe/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/prac-4-beginners/code/08-problem-solving/tictactoe + + + + + + + + +
Folders
<Go Back>
+
+ + + + +
FileFileFileFile
game.py 
+ +

+Folders: 1
+Files: 1
+Size of all files: 2771 KB

+ + + \ No newline at end of file diff --git a/prac-4-beginners/code/09-working-with-files/right.html b/prac-4-beginners/code/09-working-with-files/right.html new file mode 100644 index 00000000..9d064887 --- /dev/null +++ b/prac-4-beginners/code/09-working-with-files/right.html @@ -0,0 +1,23 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/prac-4-beginners/code/09-working-with-files + + + + + + + + +
Folders
<Go Back> rocks-game
+
+ +

+Folders: 2
+

+ + + \ No newline at end of file diff --git a/prac-4-beginners/code/09-working-with-files/rocks-game/.idea/.gitignore b/prac-4-beginners/code/09-working-with-files/rocks-game/.idea/.gitignore new file mode 100644 index 00000000..5c98b428 --- /dev/null +++ b/prac-4-beginners/code/09-working-with-files/rocks-game/.idea/.gitignore @@ -0,0 +1,2 @@ +# Default ignored files +/workspace.xml \ No newline at end of file diff --git a/prac-4-beginners/code/09-working-with-files/rocks-game/.idea/.name b/prac-4-beginners/code/09-working-with-files/rocks-game/.idea/.name new file mode 100644 index 00000000..1a6b62b7 --- /dev/null +++ b/prac-4-beginners/code/09-working-with-files/rocks-game/.idea/.name @@ -0,0 +1 @@ +RPS File IO \ No newline at end of file diff --git a/prac-4-beginners/code/09-working-with-files/rocks-game/.idea/RPS File IO.iml b/prac-4-beginners/code/09-working-with-files/rocks-game/.idea/RPS File IO.iml new file mode 100644 index 00000000..af83ea9b --- /dev/null +++ b/prac-4-beginners/code/09-working-with-files/rocks-game/.idea/RPS File IO.iml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/prac-4-beginners/code/09-working-with-files/rocks-game/.idea/dictionaries/screencaster.xml b/prac-4-beginners/code/09-working-with-files/rocks-game/.idea/dictionaries/screencaster.xml new file mode 100644 index 00000000..13875ca3 --- /dev/null +++ b/prac-4-beginners/code/09-working-with-files/rocks-game/.idea/dictionaries/screencaster.xml @@ -0,0 +1,8 @@ + + + + fout + leaderboard + + + \ No newline at end of file diff --git a/prac-4-beginners/code/09-working-with-files/rocks-game/.idea/inspectionProfiles/profiles_settings.xml b/prac-4-beginners/code/09-working-with-files/rocks-game/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 00000000..105ce2da --- /dev/null +++ b/prac-4-beginners/code/09-working-with-files/rocks-game/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/prac-4-beginners/code/09-working-with-files/rocks-game/.idea/misc.xml b/prac-4-beginners/code/09-working-with-files/rocks-game/.idea/misc.xml new file mode 100644 index 00000000..d640323b --- /dev/null +++ b/prac-4-beginners/code/09-working-with-files/rocks-game/.idea/misc.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/prac-4-beginners/code/09-working-with-files/rocks-game/.idea/modules.xml b/prac-4-beginners/code/09-working-with-files/rocks-game/.idea/modules.xml new file mode 100644 index 00000000..9417cd8e --- /dev/null +++ b/prac-4-beginners/code/09-working-with-files/rocks-game/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/prac-4-beginners/code/09-working-with-files/rocks-game/.idea/vcs.xml b/prac-4-beginners/code/09-working-with-files/rocks-game/.idea/vcs.xml new file mode 100644 index 00000000..c2365ab1 --- /dev/null +++ b/prac-4-beginners/code/09-working-with-files/rocks-game/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/prac-4-beginners/code/09-working-with-files/rocks-game/right.html b/prac-4-beginners/code/09-working-with-files/rocks-game/right.html new file mode 100644 index 00000000..0b849b1d --- /dev/null +++ b/prac-4-beginners/code/09-working-with-files/rocks-game/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/prac-4-beginners/code/09-working-with-files/rocks-game + + + + + + + + +
Folders
<Go Back>
+
+ + + + +
FileFileFileFile
rolls.json rpsgame.py 
+ +

+Folders: 1
+Files: 2
+Size of all files: 5130 KB

+ + + \ No newline at end of file diff --git a/prac-4-beginners/code/09-working-with-files/rocks-game/rolls.json b/prac-4-beginners/code/09-working-with-files/rocks-game/rolls.json new file mode 100644 index 00000000..000ab21f --- /dev/null +++ b/prac-4-beginners/code/09-working-with-files/rocks-game/rolls.json @@ -0,0 +1,30 @@ +{ + "rock": { + "defeats": ["fire", "scissors", "sponge"], + "defeated_by": ["paper", "air", "water"] + }, + "paper": { + "defeats": ["rock", "water", "air"], + "defeated_by": ["scissors", "fire", "sponge"] + }, + "scissors": { + "defeats": ["paper", "sponge", "air"], + "defeated_by": ["fire", "rock","water"] + }, + "fire": { + "defeats": ["scissors", "sponge", "paper"], + "defeated_by": ["rock", "water", "air"] + }, + "sponge": { + "defeats": ["paper", "air", "water"], + "defeated_by": ["rock", "fire", "scissors"] + }, + "air": { + "defeats": ["water", "rock", "fire"], + "defeated_by": ["paper", "sponge", "scissors"] + }, + "water": { + "defeats": ["rock", "fire", "scissors"], + "defeated_by": ["air", "paper", "sponge"] + } +} \ No newline at end of file diff --git a/prac-4-beginners/code/09-working-with-files/rocks-game/rpsgame.py b/prac-4-beginners/code/09-working-with-files/rocks-game/rpsgame.py new file mode 100644 index 00000000..70854345 --- /dev/null +++ b/prac-4-beginners/code/09-working-with-files/rocks-game/rpsgame.py @@ -0,0 +1,181 @@ +import datetime +import random +import json +import os + +rolls = {} + + +def main(): + log("App starting up...") + + load_rolls() + show_header() + show_leaderboard() + + player1, player2 = get_players() + log(f"{player1} has logged in.") + + play_game(player1, player2) + log("Game over.") + + +def show_header(): + print("---------------------------") + print(" Rock Paper Scissors") + print(" File I/O Edition") + print("---------------------------") + + +def show_leaderboard(): + leaders = load_leaders() + + sorted_leaders = list(leaders.items()) + sorted_leaders.sort(key=lambda l: l[1], reverse=True) + + print() + print("---------------------------") + print("LEADERS:") + for name, wins in sorted_leaders[0:5]: + print(f"{wins:,} -- {name}") + print("---------------------------") + print() + + +def get_players(): + p1 = input("Player 1, what is your name? ") + p2 = "Computer" + + return p1, p2 + + +def play_game(player_1, player_2): + log(f"New game starting between {player_1} and {player_2}.") + + wins = {player_1: 0, player_2: 0} + roll_names = list(rolls.keys()) + + while not find_winner(wins, wins.keys()): + roll1 = get_roll(player_1, roll_names) + roll2 = random.choice(roll_names) + + if not roll1: + print("Try again!") + continue + + log(f"Round: {player_1} roll {roll1} and {player_2} rolls {roll2}") + print(f"{player_1} roll {roll1}") + print(f"{player_2} rolls {roll2}") + + winner = check_for_winning_throw(player_1, player_2, roll1, roll2) + + if winner is None: + msg = "This round was a tie!" + print(msg) + log(msg) + else: + msg = f'{winner} takes the round!' + print(msg) + log(msg) + wins[winner] += 1 + + msg = f"Score is {player_1}: {wins[player_1]} and {player_2}: {wins[player_2]}." + print(msg) + log(msg) + print() + + overall_winner = find_winner(wins, wins.keys()) + msg = f"{overall_winner} wins the game!" + print(msg) + log(msg) + record_win(overall_winner) + + +def find_winner(wins, names): + best_of = 3 + for name in names: + if wins.get(name, 0) >= best_of: + return name + + return None + + +def check_for_winning_throw(player_1, player_2, roll1, roll2): + winner = None + if roll1 == roll2: + print("The play was tied!") + + outcome = rolls.get(roll1, {}) + if roll2 in outcome.get('defeats'): + return player_1 + elif roll2 in outcome.get('defeated_by'): + return player_2 + + return winner + + +def get_roll(player_name, roll_names): + print("Available rolls:") + for index, r in enumerate(roll_names, start=1): + print(f"{index}. {r}") + + text = input(f"{player_name}, what is your roll? ") + selected_index = int(text) - 1 + + if selected_index < 0 or selected_index >= len(rolls): + print(f"Sorry {player_name}, {text} is out of bounds!") + return None + + return roll_names[selected_index] + + +def load_rolls(): + global rolls + + directory = os.path.dirname(__file__) + filename = os.path.join(directory, 'rolls.json') + + with open(filename, 'r', encoding='utf-8') as fin: + rolls = json.load(fin) + + log(f"Loaded rolls: {list(rolls.keys())} from {os.path.basename(filename)}.") + + +def load_leaders(): + directory = os.path.dirname(__file__) + filename = os.path.join(directory, 'leaderboard.json') + + if not os.path.exists(filename): + return {} + + with open(filename, 'r', encoding='utf-8') as fin: + return json.load(fin) + + +def record_win(winner_name): + leaders = load_leaders() + + if winner_name in leaders: + leaders[winner_name] += 1 + else: + leaders[winner_name] = 1 + + directory = os.path.dirname(__file__) + filename = os.path.join(directory, 'leaderboard.json') + + with open(filename, 'w', encoding='utf-8') as fout: + json.dump(leaders, fout) + + +def log(msg): + directory = os.path.dirname(__file__) + filename = os.path.join(directory, 'rps.log') + + with open(filename, 'a', encoding='utf-8') as fout: + fout.write(f"[{datetime.datetime.now().date().isoformat()}] ") + fout.write(msg) + fout.write('\n') + + +if __name__ == '__main__': + main() diff --git a/prac-4-beginners/code/10-external-libraries/right.html b/prac-4-beginners/code/10-external-libraries/right.html new file mode 100644 index 00000000..370d5dfe --- /dev/null +++ b/prac-4-beginners/code/10-external-libraries/right.html @@ -0,0 +1,23 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/prac-4-beginners/code/10-external-libraries + + + + + + + + +
Folders
<Go Back> rocks-game
+
+ +

+Folders: 2
+

+ + + \ No newline at end of file diff --git a/prac-4-beginners/code/10-external-libraries/rocks-game/.idea/.gitignore b/prac-4-beginners/code/10-external-libraries/rocks-game/.idea/.gitignore new file mode 100644 index 00000000..5c98b428 --- /dev/null +++ b/prac-4-beginners/code/10-external-libraries/rocks-game/.idea/.gitignore @@ -0,0 +1,2 @@ +# Default ignored files +/workspace.xml \ No newline at end of file diff --git a/prac-4-beginners/code/10-external-libraries/rocks-game/.idea/.name b/prac-4-beginners/code/10-external-libraries/rocks-game/.idea/.name new file mode 100644 index 00000000..fb7b2225 --- /dev/null +++ b/prac-4-beginners/code/10-external-libraries/rocks-game/.idea/.name @@ -0,0 +1 @@ +RPS External Libs \ No newline at end of file diff --git a/prac-4-beginners/code/10-external-libraries/rocks-game/.idea/RPS External Libs.iml b/prac-4-beginners/code/10-external-libraries/rocks-game/.idea/RPS External Libs.iml new file mode 100644 index 00000000..9311ad8c --- /dev/null +++ b/prac-4-beginners/code/10-external-libraries/rocks-game/.idea/RPS External Libs.iml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/prac-4-beginners/code/10-external-libraries/rocks-game/.idea/dictionaries/mkennedy.xml b/prac-4-beginners/code/10-external-libraries/rocks-game/.idea/dictionaries/mkennedy.xml new file mode 100644 index 00000000..58366498 --- /dev/null +++ b/prac-4-beginners/code/10-external-libraries/rocks-game/.idea/dictionaries/mkennedy.xml @@ -0,0 +1,7 @@ + + + + leaderboard + + + \ No newline at end of file diff --git a/prac-4-beginners/code/10-external-libraries/rocks-game/.idea/dictionaries/screencaster.xml b/prac-4-beginners/code/10-external-libraries/rocks-game/.idea/dictionaries/screencaster.xml new file mode 100644 index 00000000..eea4968e --- /dev/null +++ b/prac-4-beginners/code/10-external-libraries/rocks-game/.idea/dictionaries/screencaster.xml @@ -0,0 +1,8 @@ + + + + colorama + darkgreen + + + \ No newline at end of file diff --git a/prac-4-beginners/code/10-external-libraries/rocks-game/.idea/inspectionProfiles/profiles_settings.xml b/prac-4-beginners/code/10-external-libraries/rocks-game/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 00000000..105ce2da --- /dev/null +++ b/prac-4-beginners/code/10-external-libraries/rocks-game/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/prac-4-beginners/code/10-external-libraries/rocks-game/.idea/misc.xml b/prac-4-beginners/code/10-external-libraries/rocks-game/.idea/misc.xml new file mode 100644 index 00000000..e48548df --- /dev/null +++ b/prac-4-beginners/code/10-external-libraries/rocks-game/.idea/misc.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/prac-4-beginners/code/10-external-libraries/rocks-game/.idea/modules.xml b/prac-4-beginners/code/10-external-libraries/rocks-game/.idea/modules.xml new file mode 100644 index 00000000..c8d300bf --- /dev/null +++ b/prac-4-beginners/code/10-external-libraries/rocks-game/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/prac-4-beginners/code/10-external-libraries/rocks-game/.idea/vcs.xml b/prac-4-beginners/code/10-external-libraries/rocks-game/.idea/vcs.xml new file mode 100644 index 00000000..c2365ab1 --- /dev/null +++ b/prac-4-beginners/code/10-external-libraries/rocks-game/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/prac-4-beginners/code/10-external-libraries/rocks-game/requirements.txt b/prac-4-beginners/code/10-external-libraries/rocks-game/requirements.txt new file mode 100644 index 00000000..01791905 --- /dev/null +++ b/prac-4-beginners/code/10-external-libraries/rocks-game/requirements.txt @@ -0,0 +1,2 @@ +colorama +prompt_toolkit diff --git a/prac-4-beginners/code/10-external-libraries/rocks-game/right.html b/prac-4-beginners/code/10-external-libraries/rocks-game/right.html new file mode 100644 index 00000000..84fb0f20 --- /dev/null +++ b/prac-4-beginners/code/10-external-libraries/rocks-game/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/prac-4-beginners/code/10-external-libraries/rocks-game + + + + + + + + +
Folders
<Go Back>
+
+ + + + +
FileFileFileFile
rolls.json rpsgame.py requirements.txt 
+ +

+Folders: 1
+Files: 3
+Size of all files: 7129 KB

+ + + \ No newline at end of file diff --git a/prac-4-beginners/code/10-external-libraries/rocks-game/rolls.json b/prac-4-beginners/code/10-external-libraries/rocks-game/rolls.json new file mode 100644 index 00000000..000ab21f --- /dev/null +++ b/prac-4-beginners/code/10-external-libraries/rocks-game/rolls.json @@ -0,0 +1,30 @@ +{ + "rock": { + "defeats": ["fire", "scissors", "sponge"], + "defeated_by": ["paper", "air", "water"] + }, + "paper": { + "defeats": ["rock", "water", "air"], + "defeated_by": ["scissors", "fire", "sponge"] + }, + "scissors": { + "defeats": ["paper", "sponge", "air"], + "defeated_by": ["fire", "rock","water"] + }, + "fire": { + "defeats": ["scissors", "sponge", "paper"], + "defeated_by": ["rock", "water", "air"] + }, + "sponge": { + "defeats": ["paper", "air", "water"], + "defeated_by": ["rock", "fire", "scissors"] + }, + "air": { + "defeats": ["water", "rock", "fire"], + "defeated_by": ["paper", "sponge", "scissors"] + }, + "water": { + "defeats": ["rock", "fire", "scissors"], + "defeated_by": ["air", "paper", "sponge"] + } +} \ No newline at end of file diff --git a/prac-4-beginners/code/10-external-libraries/rocks-game/rpsgame.py b/prac-4-beginners/code/10-external-libraries/rocks-game/rpsgame.py new file mode 100644 index 00000000..213097d8 --- /dev/null +++ b/prac-4-beginners/code/10-external-libraries/rocks-game/rpsgame.py @@ -0,0 +1,237 @@ +import datetime +import random +import json +import os + +from colorama import Fore +from prompt_toolkit import prompt +from prompt_toolkit.completion import WordCompleter, Completer, Completion + +rolls = {} + + +def main(): + print(Fore.WHITE) + log("App starting up...") + + load_rolls() + show_header() + show_leaderboard() + + player1, player2 = get_players() + log(f"{player1} has logged in.") + + play_game(player1, player2) + log("Game over.") + + +def show_header(): + print(Fore.LIGHTMAGENTA_EX) + print("---------------------------") + print(" Rock Paper Scissors") + print(" External Libraries Edition") + print("---------------------------") + print(Fore.WHITE) + + +def show_leaderboard(): + leaders = load_leaders() + + sorted_leaders = list(leaders.items()) + sorted_leaders.sort(key=lambda l: l[1], reverse=True) + + print() + print("---------------------------") + print("LEADERS:") + for name, wins in sorted_leaders[0:5]: + print(f"{wins:,} -- {name}") + print("---------------------------") + print() + + +def get_players(): + p1 = input("Player 1, what is your name? ") + p2 = "Computer" + + return p1, p2 + + +def play_game(player_1, player_2): + log(Fore.CYAN + f"New game starting between {player_1} and {player_2}.") + + wins = {player_1: 0, player_2: 0} + roll_names = list(rolls.keys()) + + while not find_winner(wins, wins.keys()): + roll1 = get_roll(player_1, roll_names) + roll2 = random.choice(roll_names) + + if not roll1: + print(Fore.LIGHTRED_EX + "Try again!") + print(Fore.WHITE) + continue + + log(f"Round: {player_1} roll {roll1} and {player_2} rolls {roll2}") + print(Fore.YELLOW + f"{player_1} rolls {roll1}") + print(Fore.LIGHTBLUE_EX + f"{player_2} rolls {roll2}") + print(Fore.WHITE) + + winner = check_for_winning_throw(player_1, player_2, roll1, roll2) + + if winner is None: + msg = "This round was a tie!" + print(msg) + log(msg) + else: + msg = f'{winner} takes the round!' + fore = Fore.GREEN if winner == player_1 else Fore.LIGHTRED_EX + print(fore + msg + Fore.WHITE) + log(msg) + wins[winner] += 1 + + msg = f"Score is {player_1}: {wins[player_1]} and {player_2}: {wins[player_2]}." + print(msg) + log(msg) + print() + + overall_winner = find_winner(wins, wins.keys()) + fore = Fore.GREEN if overall_winner == player_1 else Fore.LIGHTRED_EX + msg = f"{overall_winner} wins the game!" + print(fore + msg + Fore.WHITE) + log(msg) + record_win(overall_winner) + + +def find_winner(wins, names): + best_of = 3 + for name in names: + if wins.get(name, 0) >= best_of: + return name + + return None + + +def check_for_winning_throw(player_1, player_2, roll1, roll2): + winner = None + if roll1 == roll2: + print("The play was tied!") + + outcome = rolls.get(roll1, {}) + if roll2 in outcome.get('defeats'): + return player_1 + elif roll2 in outcome.get('defeated_by'): + return player_2 + + return winner + + +def get_roll(player_name, roll_names): + if os.environ.get('PYCHARM_HOSTED') == "1": + print(Fore.LIGHTRED_EX + "Warning: Cannot use fancy prompt dialog in PyCharm.") + print(Fore.LIGHTRED_EX + "Run this app outside of PyCharm to see it in action.") + val = input(Fore.LIGHTYELLOW_EX + "What is your roll: ") + print(Fore.WHITE) + return val + + print(f"Available rolls: {', '.join(roll_names)}.") + + # word_comp = WordCompleter(roll_names) + word_comp = PlayComplete() + + roll = prompt(f"{player_name}, what is your roll: ", completer=word_comp) + + if not roll or roll not in roll_names: + print(f"Sorry {player_name}, {roll} not valid!") + return None + + return roll + + +# def get_roll(player_name, roll_names): +# print("Available rolls:") +# for index, r in enumerate(roll_names, start=1): +# print(f"{index}. {r}") +# +# text = input(f"{player_name}, what is your roll? ") +# selected_index = int(text) - 1 +# +# if selected_index < 0 or selected_index >= len(rolls): +# print(f"Sorry {player_name}, {text} is out of bounds!") +# return None +# +# return roll_names[selected_index] +# + +def load_rolls(): + global rolls + + directory = os.path.dirname(__file__) + filename = os.path.join(directory, 'rolls.json') + + with open(filename, 'r', encoding='utf-8') as fin: + rolls = json.load(fin) + + log(f"Loaded rolls: {list(rolls.keys())} from {os.path.basename(filename)}.") + + +def load_leaders(): + directory = os.path.dirname(__file__) + filename = os.path.join(directory, 'leaderboard.json') + + if not os.path.exists(filename): + return {} + + with open(filename, 'r', encoding='utf-8') as fin: + return json.load(fin) + + +def record_win(winner_name): + leaders = load_leaders() + + if winner_name in leaders: + leaders[winner_name] += 1 + else: + leaders[winner_name] = 1 + + directory = os.path.dirname(__file__) + filename = os.path.join(directory, 'leaderboard.json') + + with open(filename, 'w', encoding='utf-8') as fout: + json.dump(leaders, fout) + + +def log(msg): + directory = os.path.dirname(__file__) + filename = os.path.join(directory, 'rps.log') + + with open(filename, 'a', encoding='utf-8') as fout: + fout.write(f"[{datetime.datetime.now().date().isoformat()}] ") + fout.write(msg) + fout.write('\n') + + +class PlayComplete(Completer): + + def get_completions(self, document, complete_event): + roll_names = list(rolls.keys()) + word = document.get_word_before_cursor() + complete_all = not word if not word.strip() else word == '.' + completions = [] + + for roll in roll_names: + is_substring = word in roll + if complete_all or is_substring: + + completion = Completion( + roll, + start_position=-len(word), + style="fg:white bg:darkgreen", + selected_style="fg:yellow bg:green") + + completions.append(completion) + + return completions + + +if __name__ == '__main__': + main() diff --git a/prac-4-beginners/code/11-error-handling/right.html b/prac-4-beginners/code/11-error-handling/right.html new file mode 100644 index 00000000..1e057ebf --- /dev/null +++ b/prac-4-beginners/code/11-error-handling/right.html @@ -0,0 +1,23 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/prac-4-beginners/code/11-error-handling + + + + + + + + +
Folders
<Go Back> rocks-game
+
+ +

+Folders: 2
+

+ + + \ No newline at end of file diff --git a/prac-4-beginners/code/11-error-handling/rocks-game/.idea/.gitignore b/prac-4-beginners/code/11-error-handling/rocks-game/.idea/.gitignore new file mode 100644 index 00000000..5c98b428 --- /dev/null +++ b/prac-4-beginners/code/11-error-handling/rocks-game/.idea/.gitignore @@ -0,0 +1,2 @@ +# Default ignored files +/workspace.xml \ No newline at end of file diff --git a/prac-4-beginners/code/11-error-handling/rocks-game/.idea/.name b/prac-4-beginners/code/11-error-handling/rocks-game/.idea/.name new file mode 100644 index 00000000..849f0517 --- /dev/null +++ b/prac-4-beginners/code/11-error-handling/rocks-game/.idea/.name @@ -0,0 +1 @@ +RPS Error Handling \ No newline at end of file diff --git a/prac-4-beginners/code/11-error-handling/rocks-game/.idea/RPS Error Handling.iml b/prac-4-beginners/code/11-error-handling/rocks-game/.idea/RPS Error Handling.iml new file mode 100644 index 00000000..b5740c88 --- /dev/null +++ b/prac-4-beginners/code/11-error-handling/rocks-game/.idea/RPS Error Handling.iml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/prac-4-beginners/code/11-error-handling/rocks-game/.idea/dictionaries/screencaster.xml b/prac-4-beginners/code/11-error-handling/rocks-game/.idea/dictionaries/screencaster.xml new file mode 100644 index 00000000..60b644f9 --- /dev/null +++ b/prac-4-beginners/code/11-error-handling/rocks-game/.idea/dictionaries/screencaster.xml @@ -0,0 +1,7 @@ + + + + colorama + + + \ No newline at end of file diff --git a/prac-4-beginners/code/11-error-handling/rocks-game/.idea/inspectionProfiles/profiles_settings.xml b/prac-4-beginners/code/11-error-handling/rocks-game/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 00000000..105ce2da --- /dev/null +++ b/prac-4-beginners/code/11-error-handling/rocks-game/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/prac-4-beginners/code/11-error-handling/rocks-game/.idea/modules.xml b/prac-4-beginners/code/11-error-handling/rocks-game/.idea/modules.xml new file mode 100644 index 00000000..ea2f16e8 --- /dev/null +++ b/prac-4-beginners/code/11-error-handling/rocks-game/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/prac-4-beginners/code/11-error-handling/rocks-game/.idea/vcs.xml b/prac-4-beginners/code/11-error-handling/rocks-game/.idea/vcs.xml new file mode 100644 index 00000000..c2365ab1 --- /dev/null +++ b/prac-4-beginners/code/11-error-handling/rocks-game/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/prac-4-beginners/code/11-error-handling/rocks-game/requirements.txt b/prac-4-beginners/code/11-error-handling/rocks-game/requirements.txt new file mode 100644 index 00000000..01791905 --- /dev/null +++ b/prac-4-beginners/code/11-error-handling/rocks-game/requirements.txt @@ -0,0 +1,2 @@ +colorama +prompt_toolkit diff --git a/prac-4-beginners/code/11-error-handling/rocks-game/right.html b/prac-4-beginners/code/11-error-handling/rocks-game/right.html new file mode 100644 index 00000000..9e70985a --- /dev/null +++ b/prac-4-beginners/code/11-error-handling/rocks-game/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/prac-4-beginners/code/11-error-handling/rocks-game + + + + + + + + +
Folders
<Go Back>
+
+ + + + +
FileFileFileFile
rolls.json rpsgame.py requirements.txt 
+ +

+Folders: 1
+Files: 3
+Size of all files: 6548 KB

+ + + \ No newline at end of file diff --git a/prac-4-beginners/code/11-error-handling/rocks-game/rolls.json b/prac-4-beginners/code/11-error-handling/rocks-game/rolls.json new file mode 100644 index 00000000..000ab21f --- /dev/null +++ b/prac-4-beginners/code/11-error-handling/rocks-game/rolls.json @@ -0,0 +1,30 @@ +{ + "rock": { + "defeats": ["fire", "scissors", "sponge"], + "defeated_by": ["paper", "air", "water"] + }, + "paper": { + "defeats": ["rock", "water", "air"], + "defeated_by": ["scissors", "fire", "sponge"] + }, + "scissors": { + "defeats": ["paper", "sponge", "air"], + "defeated_by": ["fire", "rock","water"] + }, + "fire": { + "defeats": ["scissors", "sponge", "paper"], + "defeated_by": ["rock", "water", "air"] + }, + "sponge": { + "defeats": ["paper", "air", "water"], + "defeated_by": ["rock", "fire", "scissors"] + }, + "air": { + "defeats": ["water", "rock", "fire"], + "defeated_by": ["paper", "sponge", "scissors"] + }, + "water": { + "defeats": ["rock", "fire", "scissors"], + "defeated_by": ["air", "paper", "sponge"] + } +} \ No newline at end of file diff --git a/prac-4-beginners/code/11-error-handling/rocks-game/rpsgame.py b/prac-4-beginners/code/11-error-handling/rocks-game/rpsgame.py new file mode 100644 index 00000000..c3448c19 --- /dev/null +++ b/prac-4-beginners/code/11-error-handling/rocks-game/rpsgame.py @@ -0,0 +1,212 @@ +import datetime +import random +import json +import os + +from colorama import Fore + +rolls = {} + + +def main(): + try: + print(Fore.WHITE) + log("App starting up...") + + show_header() + load_rolls() + show_leaderboard() + + player1, player2 = get_players() + log(f"{player1} has logged in.") + + play_game(player1, player2) + log("Game over.") + except json.decoder.JSONDecodeError as je: + print() + print(Fore.LIGHTRED_EX + "ERROR: The file rolls.json is invalid JSON." + Fore.WHITE) + print(Fore.LIGHTRED_EX + f"ERROR: {je}" + Fore.WHITE) + except FileNotFoundError as fe: + print() + print(Fore.LIGHTRED_EX + "ERROR: Rolls file not found" + Fore.WHITE) + print(Fore.LIGHTRED_EX + f"ERROR: {fe}" + Fore.WHITE) + except KeyboardInterrupt: + print() + print(Fore.LIGHTCYAN_EX + "You gotta run? Ok, cya next time!" + Fore.WHITE) + except Exception as x: + print(Fore.LIGHTRED_EX + f"Unknown error: {x}" + Fore.WHITE) + + +def show_header(): + print(Fore.LIGHTMAGENTA_EX) + print("---------------------------") + print(" Rock Paper Scissors") + print(" Error Handling Edition") + print("---------------------------") + print(Fore.WHITE) + + +def show_leaderboard(): + leaders = load_leaders() + + sorted_leaders = list(leaders.items()) + sorted_leaders.sort(key=lambda l: l[1], reverse=True) + + print() + print("---------------------------") + print("LEADERS:") + for name, wins in sorted_leaders[0:5]: + print(f"{wins:,} -- {name}") + print("---------------------------") + print() + + +def get_players(): + p1 = input("Player 1, what is your name? ") + p2 = "Computer" + + return p1, p2 + + +def play_game(player_1, player_2): + log(Fore.CYAN + f"New game starting between {player_1} and {player_2}.") + + wins = {player_1: 0, player_2: 0} + roll_names = list(rolls.keys()) + + while not find_winner(wins, wins.keys()): + roll1 = get_roll(player_1, roll_names) + roll2 = random.choice(roll_names) + + if not roll1: + print(Fore.LIGHTRED_EX + "Try again!") + print(Fore.WHITE) + continue + + log(f"Round: {player_1} roll {roll1} and {player_2} rolls {roll2}") + print(Fore.YELLOW + f"{player_1} rolls {roll1}") + print(Fore.LIGHTBLUE_EX + f"{player_2} rolls {roll2}") + print(Fore.WHITE) + + winner = check_for_winning_throw(player_1, player_2, roll1, roll2) + + if winner is None: + msg = "This round was a tie!" + print(msg) + log(msg) + else: + msg = f'{winner} takes the round!' + fore = Fore.GREEN if winner == player_1 else Fore.LIGHTRED_EX + print(fore + msg + Fore.WHITE) + log(msg) + wins[winner] += 1 + + msg = f"Score is {player_1}: {wins[player_1]} and {player_2}: {wins[player_2]}." + print(msg) + log(msg) + print() + + overall_winner = find_winner(wins, wins.keys()) + fore = Fore.GREEN if overall_winner == player_1 else Fore.LIGHTRED_EX + msg = f"{overall_winner} wins the game!" + print(fore + msg + Fore.WHITE) + log(msg) + record_win(overall_winner) + + +def find_winner(wins, names): + best_of = 3 + for name in names: + if wins.get(name, 0) >= best_of: + return name + + return None + + +def check_for_winning_throw(player_1, player_2, roll1, roll2): + winner = None + if roll1 == roll2: + print("The play was tied!") + + outcome = rolls.get(roll1, {}) + if roll2 in outcome.get('defeats'): + return player_1 + elif roll2 in outcome.get('defeated_by'): + return player_2 + + return winner + + +def get_roll(player_name, roll_names): + try: + print("Available rolls:") + for index, r in enumerate(roll_names, start=1): + print(f"{index}. {r}") + + text = input(f"{player_name}, what is your roll? ") + if text is None or not text.strip(): + print("You must enter response") + return None + + selected_index = int(text) - 1 + + if selected_index < 0 or selected_index >= len(roll_names): + print(f"Sorry {player_name}, {text} is out of bounds!") + return None + + return roll_names[selected_index] + except ValueError as ve: + print(Fore.RED + f"Could not convert to integer: {ve}" + Fore.WHITE) + return None + + +def load_rolls(): + global rolls + + directory = os.path.dirname(__file__) + filename = os.path.join(directory, 'rolls.json') + + with open(filename, 'r', encoding='utf-8') as fin: + rolls = json.load(fin) + + log(f"Loaded rolls: {list(rolls.keys())} from {os.path.basename(filename)}.") + + +def load_leaders(): + directory = os.path.dirname(__file__) + filename = os.path.join(directory, 'leaderboard.json') + + if not os.path.exists(filename): + return {} + + with open(filename, 'r', encoding='utf-8') as fin: + return json.load(fin) + + +def record_win(winner_name): + leaders = load_leaders() + + if winner_name in leaders: + leaders[winner_name] += 1 + else: + leaders[winner_name] = 1 + + directory = os.path.dirname(__file__) + filename = os.path.join(directory, 'leaderboard.json') + + with open(filename, 'w', encoding='utf-8') as fout: + json.dump(leaders, fout) + + +def log(msg): + directory = os.path.dirname(__file__) + filename = os.path.join(directory, 'rps.log') + + with open(filename, 'a', encoding='utf-8') as fout: + fout.write(f"[{datetime.datetime.now().date().isoformat()}] ") + fout.write(msg) + fout.write('\n') + + +if __name__ == '__main__': + main() diff --git a/prac-4-beginners/code/right.html b/prac-4-beginners/code/right.html new file mode 100644 index 00000000..786d626e --- /dev/null +++ b/prac-4-beginners/code/right.html @@ -0,0 +1,24 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/prac-4-beginners/code + + + + + + + + + +
Folders
<Go Back> 06-organi...ctions 08-problem-solving 10-extern...raries
05-intera...e-code 07-data-structures 09-workin...-files 11-error-handling
+
+ +

+Folders: 8
+

+ + + \ No newline at end of file diff --git a/prac-4-beginners/practices/ch04_first_lines/readme.md b/prac-4-beginners/practices/ch04_first_lines/readme.md new file mode 100644 index 00000000..7fbb3baa --- /dev/null +++ b/prac-4-beginners/practices/ch04_first_lines/readme.md @@ -0,0 +1,70 @@ +# Practice Exercises for first lines of code + +## Overview + +In this section, you'll have a chance to practice the concepts you've learned in the videos. First, review the core concepts covered that you'll need to keep in mind. Then go through the exercises below. + +Remember, these are for your own benefit. Feel free to skip them if you don't find a particular exercise valuable or you get stuck for too long. + +## Core concepts + +### REPL + +REPL stands for Read-Eval-Print-Loop and is the interactive environment you get when you type `python` in the terminal / command prompt. Remember, on macOS and Linux, you start Python 3's REPL by typing `python3`. + +### Variables and values + +Variables are names that we use to refer to data that could change or is complex to write directly. Values are the data that is currently assigned to that variable. We used [pythontutor.com](http://pythontutor.com) to explore this. + +Examples: + +```python +x = 7 +y = 11 +z = x + 2*y +name = 'Sarah' +``` + +### Using built-in libraries + +Python comes with many included libraries ([hundreds!](https://docs.python.org/3/library/)). To use one of these libraries, such as `sys`, you must tell Python you want to load it. This is done with the `import` keyword. + +Example: + +```python +import sys +print(f"The current version of Python is {sys.version_info}") +``` + +### Getting input from users + +Getting input from users is done with the `input` function. + +Example: + +```python +name = input("What is your name? ") +print(f"Hello {name}") +``` + +#### Converting data + +Certain operations (like math and string concatenation) require the correct data types. + +Data is converted to numerical types using the type name (int, float, etc). Here are a few examples: + +```python +text = '7.2' +whole_number = int(text) # value = 7 +number = float(text) # value = 7.2 +``` + +## Exercises + +Now it's your turn. Here are some ideas to practice. + +1. Run the Python REPL and verify you have Python 3.6 or higher. +2. Create a variable which is a whole number, compute the square and cube of it (i.e. x^2 and x^3, although that is not the Python code needed). +3. Ask a user for their name and age. Write code to tell them how many years you are older than them (negative numbers for younger is fine at this point). +4. Use the built-in library `datetime` and the function `datetime.datetime.now()` to determine the current year and print that to REPL using an f-string. +5. Take one of these sets of code and visualize them with [pythontutor.com](http://pythontutor.com/visualize.html#mode=edit) diff --git a/prac-4-beginners/practices/ch04_first_lines/right.html b/prac-4-beginners/practices/ch04_first_lines/right.html new file mode 100644 index 00000000..325b71fb --- /dev/null +++ b/prac-4-beginners/practices/ch04_first_lines/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/prac-4-beginners/practices/ch04_first_lines + + + + + + + + +
Folders
<Go Back>
+
+ + + + +
FileFileFileFile
readme.md 
+ +

+Folders: 1
+Files: 1
+Size of all files: 2540 KB

+ + + \ No newline at end of file diff --git a/prac-4-beginners/practices/ch05_interactive_code/readme.md b/prac-4-beginners/practices/ch05_interactive_code/readme.md new file mode 100644 index 00000000..040d097f --- /dev/null +++ b/prac-4-beginners/practices/ch05_interactive_code/readme.md @@ -0,0 +1,84 @@ +# Practice exercises for interactive code + +## Overview + +In this section, you'll have a chance to practice the concepts you've learned in the videos. First, review the core concepts covered that you'll need to keep in mind. Then go through the exercises below. + +Remember, these are for your own benefit. Feel free to skip them if you don't find a particular exercise valuable or you get stuck for too long. + +## Core concepts + +### Running Python code + +If you have a Python **file**, it can be executed inside PyCharm by simply right-clicking and choosing **Run**. Outside of PyCharm, you execute it like this: + +```bash +$ python3 program.py + +# or + +C:\> python program.py +``` + +Remember to use either `python` or `python3` based on your system setup. + +### if / else statements + +The essential lesson from this chapter is how code makes decisions to do one thing or another. The first building block are simple **this or that** type of processes. These are done with `if` statements. + +```python +num = 7 + +if num < 100: + print("Number is smallish") +``` + +We can also have code that has two or more branches with `elif` and `else`: + +```python +num = 7 + +if num < 100: + print("Number is smallish") +elif num < 1000: + print("Middle sized number.") +else: + print("That's one big number!") +``` + +### while loops + +When you need to repeat an operation as long as some condition is met, the `while` loop is the thing you want. + +```python +attempts = 0 + +while attempts < 5: + attempts += 1 + # do whatever you are attempting here... +``` + +### Is a number even or odd? + +This seems like a simple question to answer but requires a new operation. The modulo operator. This is basically the remainder of a division. For example, 19 / 5 is 3 as a **whole number** (int). But we know that there is a remainder of 4 for whole number math. In Python we express this as: + +```python +div = int(19 / 5) # <-- 3 +rem = 19 % 5 # <-- 4 +``` + +Then we can test whether a number is even if it is evenly divisible by 2 or has a remainder of 0: + +```python +remainder = num % 2 # Is this 0 or 1? +``` + + +## Exercises + +Now it's your turn. Here are some ideas to practice. + +1. Create a **hello_world.py** file and execute it with Python. This can be in PyCharm or in another editor and using the technique above. Seems trivial but will help you verify everything is working right there. Just have the program output "Hello world" +2. Write a program that requests a number from the user. Have the program print "Even" or "Odd" depending on whether they entered an even or odd number. +3. Extend the program above to repeatedly ask that question as long as the user enters a nonzero number. But if they enter 0, it should then stop asking and say goodbye. +4. Take one of these sets of code and visualize them with [pythontutor.com](http://pythontutor.com/visualize.html#mode=edit) diff --git a/prac-4-beginners/practices/ch05_interactive_code/right.html b/prac-4-beginners/practices/ch05_interactive_code/right.html new file mode 100644 index 00000000..59f91214 --- /dev/null +++ b/prac-4-beginners/practices/ch05_interactive_code/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/prac-4-beginners/practices/ch05_interactive_code + + + + + + + + +
Folders
<Go Back>
+
+ + + + +
FileFileFileFile
readme.md 
+ +

+Folders: 1
+Files: 1
+Size of all files: 2852 KB

+ + + \ No newline at end of file diff --git a/prac-4-beginners/practices/ch06-organizing-code-with-functions/guessinggame.py b/prac-4-beginners/practices/ch06-organizing-code-with-functions/guessinggame.py new file mode 100644 index 00000000..f919ba7a --- /dev/null +++ b/prac-4-beginners/practices/ch06-organizing-code-with-functions/guessinggame.py @@ -0,0 +1,27 @@ +import random + +print("------------------------------") +print(" M&M guessing game!") +print("------------------------------") + +print("Guess the number of M&Ms and you get lunch on the house!") +print() + +mm_count = random.randint(1, 100) +attempt_limit = 5 +attempts = 0 + +while attempts < attempt_limit: + guess_text = input("How many M&Ms are in the jar? ") + guess = int(guess_text) + attempts += 1 + + if mm_count == guess: + print(f"You got a free lunch! It was {guess}.") + break + elif guess < mm_count: + print("Sorry, that's too LOW!") + else: + print("That's too HIGH!") + +print(f"Bye, you're done in {attempts}!") diff --git a/prac-4-beginners/practices/ch06-organizing-code-with-functions/readme.md b/prac-4-beginners/practices/ch06-organizing-code-with-functions/readme.md new file mode 100644 index 00000000..daf5c5fa --- /dev/null +++ b/prac-4-beginners/practices/ch06-organizing-code-with-functions/readme.md @@ -0,0 +1,57 @@ +# Practice exercises for organizing with functions + +## Overview + +In this section, you'll have a chance to practice the concepts you've learned in the videos. First, review the core concepts covered that you'll need to keep in mind. Then go through the exercises below. + +Remember, these are for your own benefit. Feel free to skip them if you don't find a particular exercise valuable or you get stuck for too long. + +## Core concepts + +### Function with parameters (input data) + +When we have code that we want to reuse or isolate and treat as a single concept (black box), we define functions. Here is a basic function: + +```python +def say_hello(name): + print(f'Nice to meet you {name}') +``` + +### Function that generates data (return values) + +Functions can also return values to be used later: + +```python +def get_name(): + name = input("What is your name? ") + return name +``` + +We can then use these functions together as follows: + +```python +person = get_name() +say_hello(person) +``` + +### A main method and running "the program" + +As we saw, it's a good convention to have an overall organizing function that is what the whole program does at the top of the file. I called this main, for example: + +```python +def main(): + show_header() + get_names() + # ... +``` + +And you must remember to run this **at the end** of your program to actually make it execute. We added these two lines as the final of the source file: + +```python +if __name__ == "__main__": + main() +``` + +## Exercises + +Now it's your turn. Your practice exercise is to **take the M&M guessing game we created back in chapter 5 (interactive code) and clean it up using functions**. Make a copy of the file in this folder called `guessinggame.py`. That's what we started with. There are probably 3-4 functions that you can create to help organize and isolate parts of this application. Use the core concepts above to help. \ No newline at end of file diff --git a/prac-4-beginners/practices/ch06-organizing-code-with-functions/right.html b/prac-4-beginners/practices/ch06-organizing-code-with-functions/right.html new file mode 100644 index 00000000..c756d0c7 --- /dev/null +++ b/prac-4-beginners/practices/ch06-organizing-code-with-functions/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/prac-4-beginners/practices/ch06-organizing-code-with-functions + + + + + + + + +
Folders
<Go Back>
+
+ + + + +
FileFileFileFile
readme.md guessinggame.py 
+ +

+Folders: 1
+Files: 2
+Size of all files: 2552 KB

+ + + \ No newline at end of file diff --git a/prac-4-beginners/practices/ch07_data_structures/readme.md b/prac-4-beginners/practices/ch07_data_structures/readme.md new file mode 100644 index 00000000..95297aa5 --- /dev/null +++ b/prac-4-beginners/practices/ch07_data_structures/readme.md @@ -0,0 +1,68 @@ +# Practice exercises for data structures + +## Overview + +In this section, you'll have a chance to practice the concepts you've learned in the videos. First, review the core concepts covered that you'll need to keep in mind. Then go through the exercises below. + +Remember, these are for your own benefit. Feel free to skip them if you don't find a particular exercise valuable or you get stuck for too long. + +## Core concepts + +### Creating a static dictionary + +You can create a dictionary a number of ways. How you do this depends on how much data is static and how much is dynamic as part of the program's execution. + +```python +# Static data styles: + +# empty dictionary +names = {} + +# A dictionary with players start at zero score +two_names = {'player1': 0, 'player2': 0} + +# This is the same as before +two_names = dict(player1=0, player2=0) +``` + +### Creating a dynamic dictionary + +If you have dynamic data, this requires something else to build them: + +```python +names = get_list_of_names() +scores = {} +for n in names: + scores[n] = 0 + +# We can condense this using a dictionary comprehension. +# Same as above: +names = get_list_of_names() +scores = {n: 0 for n in names} +``` + +### Reading values from a dictionary + +```python +# Access a *known* value in the dictionary: +p1_score = scores['player1'] + +# Access a score, unsure whether player1 is a key, if it isn't there, return 0. +p1_score = scores.get('player1', 0) +``` + +## Exercises + +Now it's your turn. Try this practice below. + +The core idea in this chapter was about dictionaries and data structures in general. Create a simple program that creates a dictionary called `d` such that the following runs without error and prints what is expected: + +```python +# d = create d using core concepts above. + +print(d["Sam"]) # outputs 7 +print(d['rolls']) # outputs ['rock', 'paper', 'scissors'] +print(d.get('Sarah')) # outputs None +print(d.get('Jeff', -1)) # outputs -1 +print(d['done']) # outputs True +``` diff --git a/prac-4-beginners/practices/ch07_data_structures/right.html b/prac-4-beginners/practices/ch07_data_structures/right.html new file mode 100644 index 00000000..3a348fb3 --- /dev/null +++ b/prac-4-beginners/practices/ch07_data_structures/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/prac-4-beginners/practices/ch07_data_structures + + + + + + + + +
Folders
<Go Back>
+
+ + + + +
FileFileFileFile
readme.md 
+ +

+Folders: 1
+Files: 1
+Size of all files: 1982 KB

+ + + \ No newline at end of file diff --git a/prac-4-beginners/practices/ch08_problem_solving/readme.md b/prac-4-beginners/practices/ch08_problem_solving/readme.md new file mode 100644 index 00000000..26e259b0 --- /dev/null +++ b/prac-4-beginners/practices/ch08_problem_solving/readme.md @@ -0,0 +1,36 @@ +# Practice Exercises for problem solving + +## Overview + +In this section, you'll have a chance to practice the concepts you've learned in the videos. First, review the core concepts covered that you'll need to keep in mind. Then go through the exercises below. + +Remember, these are for your own benefit. Feel free to skip them if you don't find a particular exercise valuable or you get stuck for too long. + +## Core concepts + +### Michael's problem solving techniques + +Here are a few of the ideas I use to get traction while solving a problem + +1. Divide and conquer. +2. Have I seen a similar problem before? +3. Visualize the data ([pythontutor.com](http://pythontutor.com), debugger, `print()`, etc) +4. Run through the data structures (will a well known data structure help this problem?). +5. Is there a [PyPI](https://pypi.org/) package that solves this? Also check [awesome-python](https://awesome-python.com/). +6. Remember this is **part of the journey**. +7. **Just start**, you can adjust as you go and learn more. + + +## Exercises + +Now it's your turn. For this round, you get to dive into a similar experience as we had building [**Tic Tac Toe**](https://www.google.com/search?client=firefox-b-1-d&q=Tic+Tac+Toe) in the videos. + +![](readme_files/Connect_4_Board_and_Box.jpg) + +You get to build a **Connect 4** clone. Read more about the game **[on Wikipedia](https://en.wikipedia.org/wiki/Connect_Four)** or try a few rounds over at **[this website](https://www.mathsisfun.com/games/connect4.html)**. + +It should be pretty similar to tic tac toe. But the way a player selects a play is just to choose the column and the state of the board determines which row the puck stops in. Also, you do not need an entire row, column, or diagonal to win, just 4 of a given kind in any of these. + +Think about what you saw in the videos (**#2, have I seen a similar solution**), use the right data structure (**#4, Run through the data structures**), and as always, break the problem down to simple parts (**#1, Divide and conquer**). + +Also, remember that writing this program is involved. Most likely, it won't be super fast to solve (**#6, this is part of the journey**). Now, create a new blank project and start coding (**#7, just start**)! \ No newline at end of file diff --git a/prac-4-beginners/practices/ch08_problem_solving/readme_files/Connect_4_Board_and_Box.jpg b/prac-4-beginners/practices/ch08_problem_solving/readme_files/Connect_4_Board_and_Box.jpg new file mode 100644 index 0000000000000000000000000000000000000000..babf7a643e3404f3c644297e29b0539a5d2518c7 GIT binary patch literal 25667 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 + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/prac-4-beginners/practices/ch08_problem_solving/readme_files + + + + + + + + +
Folders
<Go Back>
+
+ + + + +
FileFileFileFile
Connect_4...ox.jpg 
+ +

+Folders: 1
+Files: 1
+Size of all files: 25667 KB

+ + + \ No newline at end of file diff --git a/prac-4-beginners/practices/ch08_problem_solving/right.html b/prac-4-beginners/practices/ch08_problem_solving/right.html new file mode 100644 index 00000000..de556eba --- /dev/null +++ b/prac-4-beginners/practices/ch08_problem_solving/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/prac-4-beginners/practices/ch08_problem_solving + + + + + + + + +
Folders
<Go Back> readme_files
+
+ + + + +
FileFileFileFile
readme.md 
+ +

+Folders: 2
+Files: 1
+Size of all files: 2231 KB

+ + + \ No newline at end of file diff --git a/prac-4-beginners/practices/ch09_working_with_files/readme.md b/prac-4-beginners/practices/ch09_working_with_files/readme.md new file mode 100644 index 00000000..a33fb785 --- /dev/null +++ b/prac-4-beginners/practices/ch09_working_with_files/readme.md @@ -0,0 +1,61 @@ +# Practice Exercises for file I/O + +## Overview + +In this section, you'll have a chance to practice the concepts you've learned in the videos. First, review the core concepts covered that you'll need to keep in mind. Then go through the exercises below. + +Remember, these are for your own benefit. Feel free to skip them if you don't find a particular exercise valuable or you get stuck for too long. + +## Core concepts + +### Determining the full path to a file + +Remember that the file location when loading files like `the_file.txt` depend on the working directory, which your program probably doesn't control. So we need to use the `os` module to work from known locations. + +```python +directory = os.path.dirname(__file__) +filename = os.path.join(directory, 'the_file.txt') +# Now filename is a full path +``` + +### Opening a file for reading + +To open a file we use, well, the `open()` function. But as we saw, we should do this within a `with` block to ensure it's closed and flushed in a timely manner. Note the **r** passed to open for read. + +```python +with open(filename, 'r', encoding='utf-8') as fin: + # work with fin here + +# fin is closed and useless at this point. +``` + +### Writing to a file + +Writing to a file is similar to reading, it's just about how you open it. Note the **w** for write and **fout** to tell us that it's an output not input file stream. + +```python +with open(filename, 'w', encoding='utf-8') as fout: + # work with four here +``` + +### Using json module with file streams + +Given a file stream, json can read or write objects to/from the json file format. + +```python +import json + +# load the rolls from fin input stream +rolls = json.load(fin) + +# save the leader dictionary to the fout file stream +json.dump(leaders, fout) +``` + +## Exercises + +Now it's your turn. In this practice, go back to the tic tac toe game we created back in the chapter on problem solving. Alternatively, if you made it through Connect 4, you can work with that one instead. Your job will be to: + +* Add a leader board (feel free to use JSON like we did). +* Add a running log file (test with `tail -n 20 -f FILENAME` on macOS and Linux, just open in PyCharm on Windows and it'll change). +* For extra credit, you can try to use [LogBook](https://logbook.readthedocs.io/en/stable/) to improve the logging (but it will require a few concepts we haven't covered yet). \ No newline at end of file diff --git a/prac-4-beginners/practices/ch09_working_with_files/right.html b/prac-4-beginners/practices/ch09_working_with_files/right.html new file mode 100644 index 00000000..5559cdd5 --- /dev/null +++ b/prac-4-beginners/practices/ch09_working_with_files/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/prac-4-beginners/practices/ch09_working_with_files + + + + + + + + +
Folders
<Go Back>
+
+ + + + +
FileFileFileFile
readme.md 
+ +

+Folders: 1
+Files: 1
+Size of all files: 2364 KB

+ + + \ No newline at end of file diff --git a/prac-4-beginners/practices/ch10_external_libraries/readme.md b/prac-4-beginners/practices/ch10_external_libraries/readme.md new file mode 100644 index 00000000..b6a0de1a --- /dev/null +++ b/prac-4-beginners/practices/ch10_external_libraries/readme.md @@ -0,0 +1,63 @@ +# Practice Exercises for external packages + +## Overview + +In this section, you'll have a chance to practice the concepts you've learned in the videos. First, review the core concepts covered that you'll need to keep in mind. Then go through the exercises below. + +Remember, these are for your own benefit. Feel free to skip them if you don't find a particular exercise valuable or you get stuck for too long. + +## Core concepts + +### requirements.txt + +When working with an application that uses external packages, you need to communicate what packages are required for it to run. We do this with a `requiements.txt` file, here is an example: + +``` +colorama +prompt_toolkit +``` + +Once you have a virtual environment active, you can install all the dependencies with this command: + +``` +(env) C:\> pip install -r requirements.txt +``` + +### Virtual environments + +Virtual environments are key to having different versions of the same library coexisting on your computer. You create one as follows: + +#### macOS / Linux + +``` +$ python3 –m venv venv +$ . venv/bin/activate +``` + +#### Windows + +``` +C:\> python –m venv venv +C:\> venv\scripts\activate +``` + +### pip + +Pip is the tool you use on the command line to install and view external packages. Here are some examples: + +```bash +$ pip list +$ pip install colorama +$ pip install -r requirements.txt +$ pip uninstall requests +``` + +## Exercises + +Now it's your turn. In this practice, go back to the tic tac toe game we created back in the chapter on problem solving. Alternatively, if you made it through Connect 4, you can work with that one instead. Your job will be to: + +* Create a virtual environment. +* Set it as the active python interpreter in PyCharm under `settings > project > project interpreter`. +* Create a requirements.txt file with `colorama` as a dependency. +* Install the requirements with `pip`. +* Use `colorama` to add colored output to your game. \ No newline at end of file diff --git a/prac-4-beginners/practices/ch10_external_libraries/right.html b/prac-4-beginners/practices/ch10_external_libraries/right.html new file mode 100644 index 00000000..21b7d2e1 --- /dev/null +++ b/prac-4-beginners/practices/ch10_external_libraries/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/prac-4-beginners/practices/ch10_external_libraries + + + + + + + + +
Folders
<Go Back>
+
+ + + + +
FileFileFileFile
readme.md 
+ +

+Folders: 1
+Files: 1
+Size of all files: 1899 KB

+ + + \ No newline at end of file diff --git a/prac-4-beginners/practices/ch11-error-handling/readme.md b/prac-4-beginners/practices/ch11-error-handling/readme.md new file mode 100644 index 00000000..ffdc8c68 --- /dev/null +++ b/prac-4-beginners/practices/ch11-error-handling/readme.md @@ -0,0 +1,54 @@ +# Practice Exercises for error handling + +## Overview + +In this section, you'll have a chance to practice the concepts you've learned in the videos. First, review the core concepts covered that you'll need to keep in mind. Then go through the exercises below. + +Remember, these are for your own benefit. Feel free to skip them if you don't find a particular exercise valuable or you get stuck for too long. + +## Core concepts + +### try / except + +When handling errors, we can check for bad values (e.g. `None` where a proper string was expected). But Python's native error handling approach is exception-based: throwing and catching exceptions. + +Below is the minimum code to catch an error in Python. + +```python +try: + do_risky_thing1() + do_risky_thing2() + do_risky_thing3() +except Exception as x: + # Deal with error, use x for help on what happened. +``` + +### Multiple error types + +The example above is good to catch errors. But it catches them all (well, almost all of them), and it treats them all the same. + +Below is code needed to handle different errors as well as unforeseen errors. + +```python +try: + do_risky_thing1() + do_risky_thing2() + do_risky_thing3() +except json.decoder.JSONDecodeError: + # Handle malformed JSON error +except FileNotFoundError as fe: + # Handle missing file error +except ValueError: + # Handle conversion error. +except Exception as x: + # Deal with error, use x for help on what happened. +``` + +**Note**: It is important that the most specific errors are listed first and the most general the last (`Exception`). Python selects the first (not best) match. + +## Exercises + +Now it's your turn. In this practice, go back to the tic tac toe game we created back in the chapter on problem solving. Alternatively, if you made it through Connect 4, you can work with that one instead. Your job will be to: + +* Add error handling around the input processing in your program using try / except. Be as specific on the errors as possible. If you can determine the cause or type of error, give a specific message. +* Think of all other ways your app could crash or run into trouble. Get it to crash, check the error type in the traceback, and add the appropriate error handling for this as well. \ No newline at end of file diff --git a/prac-4-beginners/practices/ch11-error-handling/right.html b/prac-4-beginners/practices/ch11-error-handling/right.html new file mode 100644 index 00000000..70593420 --- /dev/null +++ b/prac-4-beginners/practices/ch11-error-handling/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/prac-4-beginners/practices/ch11-error-handling + + + + + + + + +
Folders
<Go Back>
+
+ + + + +
FileFileFileFile
readme.md 
+ +

+Folders: 1
+Files: 1
+Size of all files: 2233 KB

+ + + \ No newline at end of file diff --git a/prac-4-beginners/practices/readme.md b/prac-4-beginners/practices/readme.md new file mode 100644 index 00000000..82de9c47 --- /dev/null +++ b/prac-4-beginners/practices/readme.md @@ -0,0 +1,13 @@ +# Practice Exercises + + + +* [Chapter 4: First lines of code](ch04_first_lines/readme.md) +* [Chapter 5: Interactive code](ch05_interactive_code/readme.md) +* [Chapter 6: Functions](ch06-organizing-code-with-functions/readme.md) +* [Chapter 7: Data structures](ch07_data_structures/readme.md) +* [Chapter 8: Problem solving](ch08_problem_solving/readme.md) +* [Chapter 9: Working with files](ch09_working_with_files/readme.md) +* [Chapter 10: External libraries](ch10_external_libraries/readme.md) +* [Chapter 11: Error handling](ch11-error-handling/readme.md) + diff --git a/prac-4-beginners/practices/right.html b/prac-4-beginners/practices/right.html new file mode 100644 index 00000000..0b85ed47 --- /dev/null +++ b/prac-4-beginners/practices/right.html @@ -0,0 +1,31 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/prac-4-beginners/practices + + + + + + + + + + +
Folders
<Go Back> ch06-orga...ctions ch08_prob...olving ch10_exte...raries
ch04_first_lines ch07_data...ctures ch09_work..._files ch11-erro...ndling
ch05_inte...e_code
+
+ + + + +
FileFileFileFile
readme.md 
+ +

+Folders: 9
+Files: 1
+Size of all files: 552 KB

+ + + \ No newline at end of file diff --git a/prac-4-beginners/readme_resources/absolute-beginners.jpg b/prac-4-beginners/readme_resources/absolute-beginners.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c759a6f16f8f4e04fa4b2f2df0447a458f105f32 GIT binary patch literal 69386 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 + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/prac-4-beginners/readme_resources + + + + + + + + +
Folders
<Go Back>
+
+ + + + +
FileFileFileFile
absolute-...rs.jpg 
+ +

+Folders: 1
+Files: 1
+Size of all files: 69386 KB

+ + + \ No newline at end of file diff --git a/prac-4-beginners/right.html b/prac-4-beginners/right.html new file mode 100644 index 00000000..a8b5ac37 --- /dev/null +++ b/prac-4-beginners/right.html @@ -0,0 +1,24 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/prac-4-beginners + + + + + + + + + +
Folders
<Go Back> practices readme_resources solutions
code
+
+ +

+Folders: 5
+

+ + + \ No newline at end of file diff --git a/prac-4-beginners/solutions/ch-04-writing-your-first-lines-of-code/right.html b/prac-4-beginners/solutions/ch-04-writing-your-first-lines-of-code/right.html new file mode 100644 index 00000000..71265f66 --- /dev/null +++ b/prac-4-beginners/solutions/ch-04-writing-your-first-lines-of-code/right.html @@ -0,0 +1,30 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/prac-4-beginners/solutions/ch-04-writing-your-first-lines-of-code + + + + + + + + +
Folders
<Go Back>
+
+ + + + + +
FileFileFileFile
step_1.md step_3.md step_4.md step_5.png 
step_2.md 
+ +

+Folders: 1
+Files: 5
+Size of all files: 84290 KB

+ + + \ No newline at end of file diff --git a/prac-4-beginners/solutions/ch-04-writing-your-first-lines-of-code/step_1.md b/prac-4-beginners/solutions/ch-04-writing-your-first-lines-of-code/step_1.md new file mode 100644 index 00000000..a329d478 --- /dev/null +++ b/prac-4-beginners/solutions/ch-04-writing-your-first-lines-of-code/step_1.md @@ -0,0 +1,27 @@ +## Step 1: Run the Python REPL and verify you have Python 3.6 or higher. + +### On macOS and Linux + +```bash +$ python3 + +Python 3.8.3 (default, May 27 2020, 20:54:22) +[Clang 11.0.3 (clang-1103.0.32.59)] on darwin +Type "help", "copyright", "credits" or "license" for more information. +>>> +``` + +### On Windows + +```commandline +# Ensure the right version of Python +# Should be 3.6 or higher + +C:\project\> python -V +Python 3.8.3 + +C:\project\> python +Python 3.8.3 (tags/v3.8.3:6f8c832, May 13 2020, 22:37:02) [MSC v.1924 64 bit (AMD64)] on win32 +Type "help", "copyright", "credits" or "license" for more information. +>>> +``` \ No newline at end of file diff --git a/prac-4-beginners/solutions/ch-04-writing-your-first-lines-of-code/step_2.md b/prac-4-beginners/solutions/ch-04-writing-your-first-lines-of-code/step_2.md new file mode 100644 index 00000000..67a5ae5a --- /dev/null +++ b/prac-4-beginners/solutions/ch-04-writing-your-first-lines-of-code/step_2.md @@ -0,0 +1,17 @@ +## Step 2: Create a variable which is a whole number, compute the square and cube of it + +``` +>>> num = 4 +>>> sqr = num * num +>>> sqr +16 +>>> cube = num * num * num +>>> cube +64 +>>> # A better way to do this +>>> num ** 2 +16 +>>> num ** 3 +64 +>>> +``` diff --git a/prac-4-beginners/solutions/ch-04-writing-your-first-lines-of-code/step_3.md b/prac-4-beginners/solutions/ch-04-writing-your-first-lines-of-code/step_3.md new file mode 100644 index 00000000..ad27313b --- /dev/null +++ b/prac-4-beginners/solutions/ch-04-writing-your-first-lines-of-code/step_3.md @@ -0,0 +1,15 @@ +## Step 3: Ask a user for their name and age. + +Write code to tell them how many years you are older than them (negative numbers for younger is fine at this point instead of older / younger with only positive numbers). + +``` +>>> my_age = 47 +>>> response = input("How old are you? ") +How old are you? 53 +>>> their_age = int(response) +>>> diff = their_age - my_age +>>> print(f'Great age! You are {diff} years older than me.') +Great age! You are 6 years older than me. +``` + + diff --git a/prac-4-beginners/solutions/ch-04-writing-your-first-lines-of-code/step_4.md b/prac-4-beginners/solutions/ch-04-writing-your-first-lines-of-code/step_4.md new file mode 100644 index 00000000..ddc00b0c --- /dev/null +++ b/prac-4-beginners/solutions/ch-04-writing-your-first-lines-of-code/step_4.md @@ -0,0 +1,16 @@ +## Step 4: Use the built-in library datetime + +Use the built-in library datetime and the function `datetime.datetime.now()` +to determine the current year and print that to REPL using an f-string. + + +``` +>>> import datetime +>>> right_now = datetime.datetime.now() +>>> # What is this thing? +>>> right_now +datetime.datetime(2020, 7, 10, 14, 41, 33, 790353) +>>> print(f"What a crazy year {right_now.year} has been, eh?") +What a crazy year 2020 has been, eh? +>>> +``` diff --git a/prac-4-beginners/solutions/ch-04-writing-your-first-lines-of-code/step_5.png b/prac-4-beginners/solutions/ch-04-writing-your-first-lines-of-code/step_5.png new file mode 100644 index 0000000000000000000000000000000000000000..14fec647b3a0fdd2851481be72f7338aaab417f7 GIT binary patch literal 82489 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ℜ1XPzI?MhnB)dF%j4;JA=@P7T%)S*y}SId>%! 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 + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/prac-4-beginners/solutions/ch-05-interactive-code + + + + + + + + +
Folders
<Go Back>
+
+ + + + + +
FileFileFileFile
step_1.md hello_world.py step_2_even_odd.py step_3_ev...lot.py 
step_4.png 
+ +

+Folders: 1
+Files: 5
+Size of all files: 239285 KB

+ + + \ No newline at end of file diff --git a/prac-4-beginners/solutions/ch-05-interactive-code/step_1.md b/prac-4-beginners/solutions/ch-05-interactive-code/step_1.md new file mode 100644 index 00000000..b5708041 --- /dev/null +++ b/prac-4-beginners/solutions/ch-05-interactive-code/step_1.md @@ -0,0 +1,3 @@ +## Step 1: Create a hello_world.py file and execute it with Python + +See [hello_world.py](./hello_world.py) diff --git a/prac-4-beginners/solutions/ch-05-interactive-code/step_2_even_odd.py b/prac-4-beginners/solutions/ch-05-interactive-code/step_2_even_odd.py new file mode 100644 index 00000000..d3f2cdb7 --- /dev/null +++ b/prac-4-beginners/solutions/ch-05-interactive-code/step_2_even_odd.py @@ -0,0 +1,14 @@ +print("Let's talk about numbers!") +print() + +num_text = input("What's your favorite whole number? ") +num = int(num_text) + +if num % 2 == 0: + print(f"What a sweet number, {num:,} is even!") +else: + print(f"That's odd. Yeah, I mean {num:,} is an odd number mathematically.") + +# Note: +# {num:,} does digit grouping: 10101010 -> 10,101,010 +# {num} would just repeat it as 10101010. diff --git a/prac-4-beginners/solutions/ch-05-interactive-code/step_3_even_odd_a_lot.py b/prac-4-beginners/solutions/ch-05-interactive-code/step_3_even_odd_a_lot.py new file mode 100644 index 00000000..335ee502 --- /dev/null +++ b/prac-4-beginners/solutions/ch-05-interactive-code/step_3_even_odd_a_lot.py @@ -0,0 +1,23 @@ +print("Let's talk about numbers!") +print() + +question_text = "Give me a whole number [0 to cancel]? " + +num_text = input(question_text) +num = int(num_text) + +while num != 0: + + if num % 2 == 0: + print(f"What a sweet number, {num:,} is even!") + else: + print(f"That's odd. Yeah, I mean {num:,} is an odd number mathematically.") + + # Note: + # {num:,} does digit grouping: 10101010 -> 10,101,010 + # {num} would just repeat it as 10101010. + + num_text = input(question_text) + num = int(num_text) + +print("kthxbye!") diff --git a/prac-4-beginners/solutions/ch-05-interactive-code/step_4.png b/prac-4-beginners/solutions/ch-05-interactive-code/step_4.png new file mode 100644 index 0000000000000000000000000000000000000000..dbcf6e974e83040d4ce8d48a234bdc2904288fec GIT binary patch literal 238167 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.~of>T+jQ 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 LSCg;Ye*Av`lmzT+ literal 0 HcmV?d00001 diff --git a/prac-4-beginners/solutions/ch-06-organizing-code-with-functions/guessinggame.py b/prac-4-beginners/solutions/ch-06-organizing-code-with-functions/guessinggame.py new file mode 100644 index 00000000..9cbee524 --- /dev/null +++ b/prac-4-beginners/solutions/ch-06-organizing-code-with-functions/guessinggame.py @@ -0,0 +1,52 @@ +import random + + +def main(): + show_header() + play_game() + + +def show_header(): + print("------------------------------") + print(" M&M guessing game!") + print("------------------------------") + + print("Guess the number of M&Ms and you get lunch on the house!") + print() + + +def get_guess_from_user(): + guess_text = input("How many M&Ms are in the jar? ") + guess = int(guess_text) + return guess + + +def evaluate_guess(guess, actual_count): + if actual_count == guess: + print(f"You got a free lunch! It was {guess}.") + elif guess < actual_count: + print("Sorry, that's too LOW!") + else: + print("That's too HIGH!") + + return actual_count == guess + + +def play_game(): + mm_count = random.randint(1, 100) + attempt_limit = 5 + attempts = 0 + + while attempts < attempt_limit: + guess = get_guess_from_user() + attempts += 1 + + won = evaluate_guess(guess, mm_count) + if won: + break + + print(f"Bye, you're done in {attempts} attempts!") + + +if __name__ == '__main__': + main() diff --git a/prac-4-beginners/solutions/ch-06-organizing-code-with-functions/right.html b/prac-4-beginners/solutions/ch-06-organizing-code-with-functions/right.html new file mode 100644 index 00000000..371ec988 --- /dev/null +++ b/prac-4-beginners/solutions/ch-06-organizing-code-with-functions/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/prac-4-beginners/solutions/ch-06-organizing-code-with-functions + + + + + + + + +
Folders
<Go Back>
+
+ + + + +
FileFileFileFile
guessinggame.py 
+ +

+Folders: 1
+Files: 1
+Size of all files: 1070 KB

+ + + \ No newline at end of file diff --git a/prac-4-beginners/solutions/ch-07-data-structures/dictionary_program.py b/prac-4-beginners/solutions/ch-07-data-structures/dictionary_program.py new file mode 100644 index 00000000..3a9143f8 --- /dev/null +++ b/prac-4-beginners/solutions/ch-07-data-structures/dictionary_program.py @@ -0,0 +1,31 @@ +##################################################################### +# +# The essence of this practice is to create this data structure here: +# +d = { + 'Sam': 7, + 'rolls': ['rock', 'paper', 'scissors'], + 'done': True +} + +##################################################################### +# +# This is unchanged from the instructions, +# sans formatting and display of output of expected. +# \t means tab in Python strings. +# + +print(d["Sam"], "\t\t\t\t\t\t\t\t# <- outputs 7?") +print(d['rolls'], "\t# <- outputs ['rock', 'paper', 'scissors']?") +print(d.get('Sarah'), "\t\t\t\t\t\t\t# <- outputs None?") +print(d.get('Jeff', -1), "\t\t\t\t\t\t\t\t# <- outputs -1?") +print(d['done'], "\t\t\t\t\t\t\t# <- outputs True?") + +#################################################################### +# Output when running this: +# +# 7 # <- outputs 7? +# ['rock', 'paper', 'scissors'] # <- outputs ['rock', 'paper', 'scissors']? +# None # <- outputs None? +# -1 # <- outputs -1? +# True # <- outputs True? diff --git a/prac-4-beginners/solutions/ch-07-data-structures/right.html b/prac-4-beginners/solutions/ch-07-data-structures/right.html new file mode 100644 index 00000000..294790df --- /dev/null +++ b/prac-4-beginners/solutions/ch-07-data-structures/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/prac-4-beginners/solutions/ch-07-data-structures + + + + + + + + +
Folders
<Go Back>
+
+ + + + +
FileFileFileFile
dictionar...ram.py 
+ +

+Folders: 1
+Files: 1
+Size of all files: 1032 KB

+ + + \ No newline at end of file diff --git a/prac-4-beginners/solutions/ch-08-problem-solving/connect4.py b/prac-4-beginners/solutions/ch-08-problem-solving/connect4.py new file mode 100644 index 00000000..7a39f026 --- /dev/null +++ b/prac-4-beginners/solutions/ch-08-problem-solving/connect4.py @@ -0,0 +1,212 @@ +import random +from typing import List, Optional + + +def main(): + print() + print("Welcome to Connect 4 from TALK PYTHON") + print() + + # CREATE THE BOARD: + # Board is a list of rows + # Rows are a list of cells + board = [ + # 6 rows + [None, None, None, None, None, None, None], # 7 columns per row + [None, None, None, None, None, None, None], + [None, None, None, None, None, None, None], + [None, None, None, None, None, None, None], + [None, None, None, None, None, None, None], + [None, None, None, None, None, None, None], + ] + + # CHOOSE INITIAL PLAYER + # We could use X and O, but let's liven it + # up with some emoji from: https://emojipedia.org/baseball/ + symbols = ["ðŸ€", "🥎"] + + active_player_index = 0 + player_name = input("What is your name player 1? ") + players = [player_name.capitalize(), "Computer"] + print(f"Welcome {players[0]}") + print(f"Your symbol will be {symbols[0]}.") + print(f"{players[1]}, will be {symbols[1]}.") + player = players[active_player_index] + symbol = symbols[active_player_index] + + # UNTIL SOMEONE WINS + while not find_winner(board): + # SHOW THE BOARD + player = players[active_player_index] + symbol = symbols[active_player_index] + + announce_turn(player) + show_board(board) + if not choose_location(board, symbol, active_player_index == 1): + print("That isn't an option, try again.") + continue + + # TOGGLE ACTIVE PLAYER + active_player_index = (active_player_index + 1) % len(players) + + print() + print(f"GAME OVER! {player} ({symbol}) has won with the board: ") + show_board(board) + print() + + +def choose_location(board, symbol, is_computer): + if not is_computer: + column = int(input("Choose which column: ")) + else: + column = random.randint(1, len(board[0])) + print(f"Computer chooses column {column}") + + column -= 1 + if column < 0 or column >= len(board[0]): + return False + + row = find_bottom_row(board, column) + if row is None: + return False + + cell = board[row][column] + if cell is not None: + return False + + board[row][column] = symbol + return True + + +def find_bottom_row(board: List[List[str]], column: int) -> Optional[int]: + col_cells = [ + board[n][column] + for n in range(0, len(board)) + ] + + last_empty = None + for idx, cell in enumerate(col_cells): + if cell is None: + last_empty = idx + + return last_empty + + +def show_board(board): + for row_idx, row in enumerate(board, start=1): + print("| ", end='') + for col_idx, cell in enumerate(row, start=1): + empty_text = f"({row_idx}, {col_idx})" + symbol = f' {cell} ' if cell is not None else empty_text + print(symbol, end=" | ") + print() + + +def announce_turn(player): + print() + print(f"It's {player}'s turn. Here's the board:") + print() + + +def find_winner(board): + sequences = get_winning_sequences(board) + + for cells in sequences: + symbol1 = cells[0] + if symbol1 and all(symbol1 == cell for cell in cells): + return True + + return False + + +def get_winning_sequences(board): + sequences = [] + + # Win by rows. + rows = board + for row in rows: + # Go through each row and get any consecutive sequence of 4 cells + fours_across = find_sequences_of_four_cells_in_a_row(row) + sequences.extend(fours_across) + + # Win by columns + for col_idx in range(0, 7): + col = [ + board[0][col_idx], + board[1][col_idx], + board[2][col_idx], + board[3][col_idx], + board[4][col_idx], + board[5][col_idx], + ] + # Go through each column and get any consecutive sequence of 4 cells + fours_down = find_sequences_of_four_cells_in_a_row(col) + sequences.extend(fours_down) + + # Win by diagonals + # In Tic-Tac-Toe, we just had two diagonals and they were easy to compute. + # It's pretty simple here too, but more, so just a bit more to type out + # for the possible options. + # + # To help visualize this, here is the board with indices: (row,col) + # [ + # ['(0,0)', '(0,1)', '(0,2)', '(0,3)', '(0,4)', '(0,5)', '(0,6)'], + # ['(1,0)', '(1,1)', '(1,2)', '(1,3)', '(1,4)', '(1,5)', '(1,6)'], + # ['(2,0)', '(2,1)', '(2,2)', '(2,3)', '(2,4)', '(2,5)', '(2,6)'], + # ['(3,0)', '(3,1)', '(3,2)', '(3,3)', '(3,4)', '(3,5)', '(3,6)'], + # ['(4,0)', '(4,1)', '(4,2)', '(4,3)', '(4,4)', '(4,5)', '(4,6)'], + # ['(5,0)', '(5,1)', '(5,2)', '(5,3)', '(5,4)', '(5,5)', '(5,6)'], + # ] + # + # I'm sure there a clever double for i in range(0, rows) & for j in range(0, cols) + # solution. But I'm afraid it will be too confusing for lots of us. + # So I'll just do it long-hand down here. + diagonals = [ + + # Down to the right diagonals + [board[5][0]], # Not really used, too short, but here for building the pattern + [board[4][0], board[5][1]], # Not really used, too short, but here for building the pattern + [board[3][0], board[4][1], board[5][2]], # Not really used, too short, but here for building the pattern + [board[2][0], board[3][1], board[4][2], board[5][3]], + [board[1][0], board[2][1], board[3][2], board[4][3], board[5][4]], + [board[0][0], board[1][1], board[2][2], board[3][3], board[4][4], board[5][5]], + [board[0][1], board[1][2], board[2][3], board[3][4], board[4][5], board[5][6]], + [board[0][2], board[1][3], board[2][4], board[3][5], board[4][6]], + [board[0][3], board[1][4], board[2][5], board[3][6]], + [board[0][4], board[1][5], board[2][6]], # Not really used, too short, but here for building the pattern + [board[0][5], board[1][6]], # Not really used, too short, but here for building the pattern + [board[0][6]], # Not really used, too short, but here for building the pattern + + # Down to the left diagonals + [board[0][0]], # Not really used, too short, but here for building the pattern + [board[0][1], board[1][0]], # Not really used, too short, but here for building the pattern + [board[2][0], board[1][1], board[0][2]], # Not really used, too short, but here for building the pattern + [board[0][3], board[1][2], board[2][1], board[3][0]], + [board[0][4], board[1][3], board[2][2], board[3][1], board[4][0]], + [board[0][5], board[1][4], board[2][3], board[3][2], board[4][1], board[5][0]], + [board[0][6], board[1][5], board[2][4], board[3][3], board[4][2], board[5][1]], + [board[1][6], board[2][5], board[3][4], board[4][3], board[5][2]], + [board[2][6], board[3][5], board[4][4], board[5][3]], + [board[3][6], board[4][5], board[5][4]], # Not really used, too short, but here for building the pattern + [board[4][6], board[5][5]], # Not really used, too short, but here for building the pattern + [board[5][6]], # Not really used, too short, but here for building the pattern + ] + for diag in diagonals: + fours_diagonals = find_sequences_of_four_cells_in_a_row(diag) + sequences.extend(fours_diagonals) + + return sequences + + +def find_sequences_of_four_cells_in_a_row(cells: List[str]) -> List[List[str]]: + sequences = [] + for n in range(0, len(cells) - 3): + candidate = cells[n:n + 4] + if len(candidate) == 4: + sequences.append(candidate) + + return sequences + + +if __name__ == '__main__': + main() diff --git a/prac-4-beginners/solutions/ch-08-problem-solving/readme.md b/prac-4-beginners/solutions/ch-08-problem-solving/readme.md new file mode 100644 index 00000000..5a3c01c1 --- /dev/null +++ b/prac-4-beginners/solutions/ch-08-problem-solving/readme.md @@ -0,0 +1,70 @@ +## Solution for Connect4 + +This one is VERY similar to TIC-TAC-TOE. There are three fundamental changes, other +than this, it's the same code for both games. + +### Change 1: Board data structure. + +We are using this data structure. Tic-Tac-Toe was 3x3. Connect4 is 7x6 (7 columns, 6 rows): + +```python +# Board is a list of rows +# Rows are a list of cells +board = [ + # 6 rows + [None, None, None, None, None, None, None], # 7 columns per row + [None, None, None, None, None, None, None], # 7 columns per row + [None, None, None, None, None, None, None], # 7 columns per row + [None, None, None, None, None, None, None], # 7 columns per row + [None, None, None, None, None, None, None], # 7 columns per row + [None, None, None, None, None, None, None], # 7 columns per row +] +``` + +### Change 2: You pick a column, drop the disk, it falls down + +The second major change is how you pick where to play. + +In Tic-Tac-Toe, it's choose the square. In Connect 4, it's choose the column, +drop the disk it fall as far as it can. We rewrote `choose_location()` accordingly. + +### Change 3: Finding lists of 4 in the rows, cols, and diagonals + +The final major change is finding wins. In Tic-Tac-Toe, we wrote a function called: + +```python +def get_winning_sequences(board): + ... +``` + +This function would turn rows, columns, and diagonals into just straight lists. Then +they are super simple to check. Are all of them one of the same kind and not empty? +For example, is a diagonal all X's? Then X's win. + +It's identical in connect 4. But finding these are a bit of a pain. You don't have to have +the whole row, or column, or diagonal the same to win. You just need 4 in a row of these. + +So we wrote a function called `find_sequences_of_four_cells_in_a_row(cells)`. It +takes a series of items, say 7 items, then returns all consecutive possibilities of 4. + +For example: + +```python +cells = [1, 2, 3, 4, 5, 6] +fours = find_sequences_of_four_cells_in_a_row(cells) +# fours = [ +# [1, 2, 3, 4], +# [2, 3, 4, 5], +# [3, 4, 5, 6] +#] +``` + +Then we can just return these out of `get_winning_sequences()` and it'll see if any are winners. +At that point, it's all the same as Tic-Tac-Toe. If they are all one type, that type is the winner. + +Finding the sequences is a bit more complex, but it's the same idea. Find all possible diagonals, +rows, and columns, use `find_sequences_of_four_cells_in_a_row()` to find the lists of 4 and check them. + +That's the game. + +See [connect4.py](./connect4.py) diff --git a/prac-4-beginners/solutions/ch-08-problem-solving/right.html b/prac-4-beginners/solutions/ch-08-problem-solving/right.html new file mode 100644 index 00000000..642027e5 --- /dev/null +++ b/prac-4-beginners/solutions/ch-08-problem-solving/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/prac-4-beginners/solutions/ch-08-problem-solving + + + + + + + + +
Folders
<Go Back>
+
+ + + + +
FileFileFileFile
readme.md connect4.py 
+ +

+Folders: 1
+Files: 2
+Size of all files: 10114 KB

+ + + \ No newline at end of file diff --git a/prac-4-beginners/solutions/ch-09-working-with-files/connect4_files.py b/prac-4-beginners/solutions/ch-09-working-with-files/connect4_files.py new file mode 100644 index 00000000..7faf5f98 --- /dev/null +++ b/prac-4-beginners/solutions/ch-09-working-with-files/connect4_files.py @@ -0,0 +1,257 @@ +import json +import os +import random +from typing import List, Optional + + +def main(): + print() + print("Welcome to TIC TAC TOE from TALK PYTHON") + print() + show_leaderboard() + + # CREATE THE BOARD: + # Board is a list of rows + # Rows are a list of cells + board = [ + # 6 rows + [None, None, None, None, None, None, None], # 7 columns per row + [None, None, None, None, None, None, None], + [None, None, None, None, None, None, None], + [None, None, None, None, None, None, None], + [None, None, None, None, None, None, None], + [None, None, None, None, None, None, None], + ] + + # CHOOSE INITIAL PLAYER + # We could use X and O, but let's liven it + # up with some emoji from: https://emojipedia.org/baseball/ + symbols = ["ðŸ€", "🥎"] + + active_player_index = 0 + player_name = input("What is your name player 1? ") + players = [player_name.capitalize(), "Computer"] + print(f"Welcome {players[0]}") + print(f"Your symbol will be {symbols[0]}.") + print(f"{players[1]}, will be {symbols[1]}.") + symbol = symbols[active_player_index] + player = players[active_player_index] + + # UNTIL SOMEONE WINS + while not find_winner(board): + # SHOW THE BOARD + player = players[active_player_index] + symbol = symbols[active_player_index] + + announce_turn(player) + show_board(board) + if not choose_location(board, symbol, active_player_index == 1): + print("That isn't an option, try again.") + continue + + # TOGGLE ACTIVE PLAYER + active_player_index = (active_player_index + 1) % len(players) + + print() + print(f"GAME OVER! {player} ({symbol}) has won with the board: ") + show_board(board) + record_win(player) + print() + + +def choose_location(board, symbol, is_computer): + if not is_computer: + column = int(input("Choose which column: ")) + else: + column = random.randint(1, len(board[0])) + print(f"Computer chooses column {column}") + + column -= 1 + if column < 0 or column >= len(board[0]): + return False + + row = find_bottom_row(board, column) + if row is None: + return False + + cell = board[row][column] + if cell is not None: + return False + + board[row][column] = symbol + return True + + +def find_bottom_row(board: List[List[str]], column: int) -> Optional[int]: + col_cells = [ + board[n][column] + for n in range(0, len(board)) + ] + + last_empty = None + for idx, cell in enumerate(col_cells): + if cell is None: + last_empty = idx + + return last_empty + + +def show_board(board): + for row_idx, row in enumerate(board, start=1): + print("| ", end='') + for col_idx, cell in enumerate(row, start=1): + empty_text = f"({row_idx}, {col_idx})" + symbol = f' {cell} ' if cell is not None else empty_text + print(symbol, end=" | ") + print() + + +def announce_turn(player): + print() + print(f"It's {player}'s turn. Here's the board:") + print() + + +def find_winner(board): + sequences = get_winning_sequences(board) + + for cells in sequences: + symbol1 = cells[0] + if symbol1 and all(symbol1 == cell for cell in cells): + return True + + return False + + +def get_winning_sequences(board): + sequences = [] + + # Win by rows. + rows = board + for row in rows: + # Go through each row and get any consecutive sequence of 4 cells + fours_across = find_sequences_of_four_cells_in_a_row(row) + sequences.extend(fours_across) + + # Win by columns + for col_idx in range(0, 7): + col = [ + board[0][col_idx], + board[1][col_idx], + board[2][col_idx], + board[3][col_idx], + board[4][col_idx], + board[5][col_idx], + ] + # Go through each column and get any consecutive sequence of 4 cells + fours_down = find_sequences_of_four_cells_in_a_row(col) + sequences.extend(fours_down) + + # Win by diagonals + # In Tic-Tac-Toe, we just had two diagonals and they were easy to compute. + # It's pretty simple here too, but more, so just a bit more to type out + # for the possible options. + # + # To help visualize this, here is the board with indices: (row,col) + # [ + # ['(0,0)', '(0,1)', '(0,2)', '(0,3)', '(0,4)', '(0,5)', '(0,6)'], + # ['(1,0)', '(1,1)', '(1,2)', '(1,3)', '(1,4)', '(1,5)', '(1,6)'], + # ['(2,0)', '(2,1)', '(2,2)', '(2,3)', '(2,4)', '(2,5)', '(2,6)'], + # ['(3,0)', '(3,1)', '(3,2)', '(3,3)', '(3,4)', '(3,5)', '(3,6)'], + # ['(4,0)', '(4,1)', '(4,2)', '(4,3)', '(4,4)', '(4,5)', '(4,6)'], + # ['(5,0)', '(5,1)', '(5,2)', '(5,3)', '(5,4)', '(5,5)', '(5,6)'], + # ] + # + # I'm sure there a clever double for i in range(0, rows) & for j in range(0, cols) + # solution. But I'm afraid it will be too confusing for lots of us. + # So I'll just do it long-hand down here. + diagonals = [ + + # Down to the right diagonals + [board[5][0]], # Not really used, too short, but here for building the pattern + [board[4][0], board[5][1]], # Not really used, too short, but here for building the pattern + [board[3][0], board[4][1], board[5][2]], # Not really used, too short, but here for building the pattern + [board[2][0], board[3][1], board[4][2], board[5][3]], + [board[1][0], board[2][1], board[3][2], board[4][3], board[5][4]], + [board[0][0], board[1][1], board[2][2], board[3][3], board[4][4], board[5][5]], + [board[0][1], board[1][2], board[2][3], board[3][4], board[4][5], board[5][6]], + [board[0][2], board[1][3], board[2][4], board[3][5], board[4][6]], + [board[0][3], board[1][4], board[2][5], board[3][6]], + [board[0][4], board[1][5], board[2][6]], # Not really used, too short, but here for building the pattern + [board[0][5], board[1][6]], # Not really used, too short, but here for building the pattern + [board[0][6]], # Not really used, too short, but here for building the pattern + + # Down to the left diagonals + [board[0][0]], # Not really used, too short, but here for building the pattern + [board[0][1], board[1][0]], # Not really used, too short, but here for building the pattern + [board[2][0], board[1][1], board[0][2]], # Not really used, too short, but here for building the pattern + [board[0][3], board[1][2], board[2][1], board[3][0]], + [board[0][4], board[1][3], board[2][2], board[3][1], board[4][0]], + [board[0][5], board[1][4], board[2][3], board[3][2], board[4][1], board[5][0]], + [board[0][6], board[1][5], board[2][4], board[3][3], board[4][2], board[5][1]], + [board[1][6], board[2][5], board[3][4], board[4][3], board[5][2]], + [board[2][6], board[3][5], board[4][4], board[5][3]], + [board[3][6], board[4][5], board[5][4]], # Not really used, too short, but here for building the pattern + [board[4][6], board[5][5]], # Not really used, too short, but here for building the pattern + [board[5][6]], # Not really used, too short, but here for building the pattern + ] + for diag in diagonals: + fours_diagonals = find_sequences_of_four_cells_in_a_row(diag) + sequences.extend(fours_diagonals) + + return sequences + + +def find_sequences_of_four_cells_in_a_row(cells: List[str]) -> List[List[str]]: + sequences = [] + for n in range(0, len(cells) - 3): + candidate = cells[n:n + 4] + if len(candidate) == 4: + sequences.append(candidate) + + return sequences + + +def show_leaderboard(): + leaders = load_leaders() + + sorted_leaders = list(leaders.items()) + sorted_leaders.sort(key=lambda l: l[1], reverse=True) + + print() + print("---------------------------") + print("LEADERS:") + for name, wins in sorted_leaders[0:5]: + print(f"{wins:,} -- {name}") + print("---------------------------") + print() + + +def load_leaders(): + directory = os.path.dirname(__file__) + filename = os.path.join(directory, 'leaderboard.json') + + if not os.path.exists(filename): + return {} + + with open(filename, 'r', encoding='utf-8') as fin: + return json.load(fin) + + +def record_win(winner_name): + leaders = load_leaders() + + if winner_name in leaders: + leaders[winner_name] += 1 + else: + leaders[winner_name] = 1 + + directory = os.path.dirname(__file__) + filename = os.path.join(directory, 'leaderboard.json') + + with open(filename, 'w', encoding='utf-8') as fout: + json.dump(leaders, fout) + + +if __name__ == '__main__': + main() diff --git a/prac-4-beginners/solutions/ch-09-working-with-files/right.html b/prac-4-beginners/solutions/ch-09-working-with-files/right.html new file mode 100644 index 00000000..b37a7c38 --- /dev/null +++ b/prac-4-beginners/solutions/ch-09-working-with-files/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/prac-4-beginners/solutions/ch-09-working-with-files + + + + + + + + +
Folders
<Go Back>
+
+ + + + +
FileFileFileFile
connect4_files.py 
+ +

+Folders: 1
+Files: 1
+Size of all files: 8684 KB

+ + + \ No newline at end of file diff --git a/prac-4-beginners/solutions/ch-10-external-libraries/connect4_color.py b/prac-4-beginners/solutions/ch-10-external-libraries/connect4_color.py new file mode 100644 index 00000000..3b411a03 --- /dev/null +++ b/prac-4-beginners/solutions/ch-10-external-libraries/connect4_color.py @@ -0,0 +1,259 @@ +import json +import os +import random +from typing import List, Optional + +from colorama import Fore + + +def main(): + print(Fore.WHITE) + print(Fore.LIGHTGREEN_EX + "Welcome to TIC TAC TOE from TALK PYTHON" + Fore.WHITE) + print() + show_leaderboard() + + # CREATE THE BOARD: + # Board is a list of rows + # Rows are a list of cells + board = [ + # 6 rows + [None, None, None, None, None, None, None], # 7 columns per row + [None, None, None, None, None, None, None], + [None, None, None, None, None, None, None], + [None, None, None, None, None, None, None], + [None, None, None, None, None, None, None], + [None, None, None, None, None, None, None], + ] + + # CHOOSE INITIAL PLAYER + # We could use X and O, but let's liven it + # up with some emoji from: https://emojipedia.org/baseball/ + symbols = ["ðŸ€", "🥎"] + + active_player_index = 0 + player_name = input(Fore.YELLOW + "What is your name player 1? " + Fore.WHITE) + players = [player_name.capitalize(), "Computer"] + print(f"Welcome {players[0]}" + Fore.WHITE) + print(f"Your symbol will be {symbols[0]}." + Fore.WHITE) + print(f"{players[1]}, will be {symbols[1]}." + Fore.WHITE) + symbol = symbols[active_player_index] + player = players[active_player_index] + + # UNTIL SOMEONE WINS + while not find_winner(board): + # SHOW THE BOARD + player = players[active_player_index] + symbol = symbols[active_player_index] + + announce_turn(player) + show_board(board) + if not choose_location(board, symbol, active_player_index == 1): + print(Fore.LIGHTRED_EX + "That isn't an option, try again." + Fore.WHITE) + continue + + # TOGGLE ACTIVE PLAYER + active_player_index = (active_player_index + 1) % len(players) + + print() + print(Fore.LIGHTGREEN_EX + f"GAME OVER! {player} ({symbol}) has won with the board: " + Fore.WHITE) + show_board(board) + record_win(player) + print() + + +def choose_location(board, symbol, is_computer): + if not is_computer: + column = int(input(Fore.YELLOW + "Choose which column: " + Fore.WHITE)) + else: + column = random.randint(1, len(board[0])) + print(Fore.YELLOW + f"Computer chooses column {column}" + Fore.WHITE) + + column -= 1 + if column < 0 or column >= len(board[0]): + return False + + row = find_bottom_row(board, column) + if row is None: + return False + + cell = board[row][column] + if cell is not None: + return False + + board[row][column] = symbol + return True + + +def find_bottom_row(board: List[List[str]], column: int) -> Optional[int]: + col_cells = [ + board[n][column] + for n in range(0, len(board)) + ] + + last_empty = None + for idx, cell in enumerate(col_cells): + if cell is None: + last_empty = idx + + return last_empty + + +def show_board(board): + for row_idx, row in enumerate(board, start=1): + print("| ", end='') + for col_idx, cell in enumerate(row, start=1): + empty_text = f"({row_idx}, {col_idx})" + symbol = f' {cell} ' if cell is not None else empty_text + print(symbol, end=" | ") + print() + + +def announce_turn(player): + print() + print(Fore.LIGHTCYAN_EX + f"It's {player}'s turn. Here's the board:" + Fore.WHITE) + print() + + +def find_winner(board): + sequences = get_winning_sequences(board) + + for cells in sequences: + symbol1 = cells[0] + if symbol1 and all(symbol1 == cell for cell in cells): + return True + + return False + + +def get_winning_sequences(board): + sequences = [] + + # Win by rows. + rows = board + for row in rows: + # Go through each row and get any consecutive sequence of 4 cells + fours_across = find_sequences_of_four_cells_in_a_row(row) + sequences.extend(fours_across) + + # Win by columns + for col_idx in range(0, 7): + col = [ + board[0][col_idx], + board[1][col_idx], + board[2][col_idx], + board[3][col_idx], + board[4][col_idx], + board[5][col_idx], + ] + # Go through each column and get any consecutive sequence of 4 cells + fours_down = find_sequences_of_four_cells_in_a_row(col) + sequences.extend(fours_down) + + # Win by diagonals + # In Tic-Tac-Toe, we just had two diagonals and they were easy to compute. + # It's pretty simple here too, but more, so just a bit more to type out + # for the possible options. + # + # To help visualize this, here is the board with indices: (row,col) + # [ + # ['(0,0)', '(0,1)', '(0,2)', '(0,3)', '(0,4)', '(0,5)', '(0,6)'], + # ['(1,0)', '(1,1)', '(1,2)', '(1,3)', '(1,4)', '(1,5)', '(1,6)'], + # ['(2,0)', '(2,1)', '(2,2)', '(2,3)', '(2,4)', '(2,5)', '(2,6)'], + # ['(3,0)', '(3,1)', '(3,2)', '(3,3)', '(3,4)', '(3,5)', '(3,6)'], + # ['(4,0)', '(4,1)', '(4,2)', '(4,3)', '(4,4)', '(4,5)', '(4,6)'], + # ['(5,0)', '(5,1)', '(5,2)', '(5,3)', '(5,4)', '(5,5)', '(5,6)'], + # ] + # + # I'm sure there a clever double for i in range(0, rows) & for j in range(0, cols) + # solution. But I'm afraid it will be too confusing for lots of us. + # So I'll just do it long-hand down here. + diagonals = [ + + # Down to the right diagonals + [board[5][0]], # Not really used, too short, but here for building the pattern + [board[4][0], board[5][1]], # Not really used, too short, but here for building the pattern + [board[3][0], board[4][1], board[5][2]], # Not really used, too short, but here for building the pattern + [board[2][0], board[3][1], board[4][2], board[5][3]], + [board[1][0], board[2][1], board[3][2], board[4][3], board[5][4]], + [board[0][0], board[1][1], board[2][2], board[3][3], board[4][4], board[5][5]], + [board[0][1], board[1][2], board[2][3], board[3][4], board[4][5], board[5][6]], + [board[0][2], board[1][3], board[2][4], board[3][5], board[4][6]], + [board[0][3], board[1][4], board[2][5], board[3][6]], + [board[0][4], board[1][5], board[2][6]], # Not really used, too short, but here for building the pattern + [board[0][5], board[1][6]], # Not really used, too short, but here for building the pattern + [board[0][6]], # Not really used, too short, but here for building the pattern + + # Down to the left diagonals + [board[0][0]], # Not really used, too short, but here for building the pattern + [board[0][1], board[1][0]], # Not really used, too short, but here for building the pattern + [board[2][0], board[1][1], board[0][2]], # Not really used, too short, but here for building the pattern + [board[0][3], board[1][2], board[2][1], board[3][0]], + [board[0][4], board[1][3], board[2][2], board[3][1], board[4][0]], + [board[0][5], board[1][4], board[2][3], board[3][2], board[4][1], board[5][0]], + [board[0][6], board[1][5], board[2][4], board[3][3], board[4][2], board[5][1]], + [board[1][6], board[2][5], board[3][4], board[4][3], board[5][2]], + [board[2][6], board[3][5], board[4][4], board[5][3]], + [board[3][6], board[4][5], board[5][4]], # Not really used, too short, but here for building the pattern + [board[4][6], board[5][5]], # Not really used, too short, but here for building the pattern + [board[5][6]], # Not really used, too short, but here for building the pattern + ] + for diag in diagonals: + fours_diagonals = find_sequences_of_four_cells_in_a_row(diag) + sequences.extend(fours_diagonals) + + return sequences + + +def find_sequences_of_four_cells_in_a_row(cells: List[str]) -> List[List[str]]: + sequences = [] + for n in range(0, len(cells) - 3): + candidate = cells[n:n + 4] + if len(candidate) == 4: + sequences.append(candidate) + + return sequences + + +def show_leaderboard(): + leaders = load_leaders() + + sorted_leaders = list(leaders.items()) + sorted_leaders.sort(key=lambda l: l[1], reverse=True) + + print() + print(Fore.LIGHTBLUE_EX + "---------------------------" + Fore.WHITE) + print(Fore.LIGHTBLUE_EX + "LEADERS:" + Fore.WHITE) + for name, wins in sorted_leaders[0:5]: + print(Fore.LIGHTBLUE_EX + f"{wins:,} -- {name}" + Fore.WHITE) + print(Fore.LIGHTBLUE_EX + "---------------------------" + Fore.WHITE) + print() + + +def load_leaders(): + directory = os.path.dirname(__file__) + filename = os.path.join(directory, 'leaderboard.json') + + if not os.path.exists(filename): + return {} + + with open(filename, 'r', encoding='utf-8') as fin: + return json.load(fin) + + +def record_win(winner_name): + leaders = load_leaders() + + if winner_name in leaders: + leaders[winner_name] += 1 + else: + leaders[winner_name] = 1 + + directory = os.path.dirname(__file__) + filename = os.path.join(directory, 'leaderboard.json') + + with open(filename, 'w', encoding='utf-8') as fout: + json.dump(leaders, fout) + + +if __name__ == '__main__': + main() diff --git a/prac-4-beginners/solutions/ch-10-external-libraries/requirements.txt b/prac-4-beginners/solutions/ch-10-external-libraries/requirements.txt new file mode 100644 index 00000000..3fcfb51b --- /dev/null +++ b/prac-4-beginners/solutions/ch-10-external-libraries/requirements.txt @@ -0,0 +1 @@ +colorama diff --git a/prac-4-beginners/solutions/ch-10-external-libraries/right.html b/prac-4-beginners/solutions/ch-10-external-libraries/right.html new file mode 100644 index 00000000..2f7950ad --- /dev/null +++ b/prac-4-beginners/solutions/ch-10-external-libraries/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/prac-4-beginners/solutions/ch-10-external-libraries + + + + + + + + +
Folders
<Go Back>
+
+ + + + +
FileFileFileFile
connect4_color.py requirements.txt 
+ +

+Folders: 1
+Files: 2
+Size of all files: 9115 KB

+ + + \ No newline at end of file diff --git a/prac-4-beginners/solutions/ch-11-error-handling/readme.md b/prac-4-beginners/solutions/ch-11-error-handling/readme.md new file mode 100644 index 00000000..63a7dd5d --- /dev/null +++ b/prac-4-beginners/solutions/ch-11-error-handling/readme.md @@ -0,0 +1,42 @@ +## Solution for error handling in tic-tac-toe + +The only part of this first pass on the game that could fail is choosing the location. + +Did you notice that when it asks for a number, if you don't enter anything it crashes hard? + +How about if you state too much? It asks for row and you answer 2,3 (row and column)? Boom again. + +That's what we fixed here with `try/except`: + +```python +def choose_location(board, symbol): + try: + row = int(input("Choose which row: ")) + + row -= 1 + if row < 0 or row >= len(board): + return False + + column = int(input("Choose which column: ")) + column -= 1 + if column < 0 or column >= len(board[0]): + return False + + cell = board[row][column] + if cell is not None: + return False + + board[row][column] = symbol + return True + except ValueError as ve: + print(f"Error: Cannot convert input to a number.") + return False + except Exception: + # Not sure what else happened here, but didn't work. + return False +``` + +For a more advanced version, you could edit the tic-tac-toe from files and make sure we have +permissions to save to the files and that they are in a correct format for `json` to read and so on. + +See [tictactoe_errors_handled.py](./tictactoe_errors_handled.py) diff --git a/prac-4-beginners/solutions/ch-11-error-handling/right.html b/prac-4-beginners/solutions/ch-11-error-handling/right.html new file mode 100644 index 00000000..20508342 --- /dev/null +++ b/prac-4-beginners/solutions/ch-11-error-handling/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/prac-4-beginners/solutions/ch-11-error-handling + + + + + + + + +
Folders
<Go Back>
+
+ + + + +
FileFileFileFile
readme.md tictactoe...led.py 
+ +

+Folders: 1
+Files: 2
+Size of all files: 4168 KB

+ + + \ No newline at end of file diff --git a/prac-4-beginners/solutions/ch-11-error-handling/tictactoe_errors_handled.py b/prac-4-beginners/solutions/ch-11-error-handling/tictactoe_errors_handled.py new file mode 100644 index 00000000..32916020 --- /dev/null +++ b/prac-4-beginners/solutions/ch-11-error-handling/tictactoe_errors_handled.py @@ -0,0 +1,122 @@ +def main(): + print() + print("Welcome to TIC TAC TOE from TALK PYTHON") + print(" Safe edition!") + print() + + # CREATE THE BOARD: + # Board is a list of rows + # Rows are a list of cells + board = [ + [None, None, None], + [None, None, None], + [None, None, None], + ] + + # CHOOSE INITIAL PLAYER + active_player_index = 0 + players = ["Michael", "Computer"] + symbols = ["X", "O"] + player = players[active_player_index] + + # UNTIL SOMEONE WINS + while not find_winner(board): + # SHOW THE BOARD + player = players[active_player_index] + symbol = symbols[active_player_index] + + announce_turn(player) + show_board(board) + if not choose_location(board, symbol): + print("That isn't an option, try again.") + continue + + # TOGGLE ACTIVE PLAYER + active_player_index = (active_player_index + 1) % len(players) + + print() + print(f"GAME OVER! {player} has won with the board: ") + show_board(board) + print() + + +def choose_location(board, symbol): + try: + row = int(input("Choose which row: ")) + + row -= 1 + if row < 0 or row >= len(board): + return False + + column = int(input("Choose which column: ")) + column -= 1 + if column < 0 or column >= len(board[0]): + return False + + cell = board[row][column] + if cell is not None: + return False + + board[row][column] = symbol + return True + except ValueError as ve: + print(f"Error: Cannot convert input to a number.") + return False + except Exception: + # Not sure what else happened here, but didn't work. + return False + +def show_board(board): + for row in board: + print("| ", end='') + for cell in row: + symbol = cell if cell is not None else "_" + print(symbol, end=" | ") + print() + + +def announce_turn(player): + print() + print(f"It's {player}'s turn. Here's the board:") + print() + + +def find_winner(board): + sequences = get_winning_sequences(board) + + for cells in sequences: + symbol1 = cells[0] + if symbol1 and all(symbol1 == cell for cell in cells): + return True + + return False + + +def get_winning_sequences(board): + sequences = [] + + # Win by rows + rows = board + sequences.extend(rows) + + # Win by columns + for col_idx in range(0, 3): + col = [ + board[0][col_idx], + board[1][col_idx], + board[2][col_idx], + ] + sequences.append(col) + + # Win by diagonals + diagonals = [ + [board[0][0], board[1][1], board[2][2]], + [board[0][2], board[1][1], board[2][0]], + ] + sequences.extend(diagonals) + + return sequences + + +if __name__ == '__main__': + main() diff --git a/prac-4-beginners/solutions/readme.md b/prac-4-beginners/solutions/readme.md new file mode 100644 index 00000000..2e5e7ea6 --- /dev/null +++ b/prac-4-beginners/solutions/readme.md @@ -0,0 +1,7 @@ +# Solutions: [Enabled] + +We've decided to include the solutions to the practice exercises. Initially, the intention was to omit them. It can be frustrating. However, **it's working your way through that actually drives the learning**. It feels good to see the solution, but to make it really click, you have to make it your own and work your way through it. + +Ideally, this is a *check my solution* type of thing. You should now see the solutions by chapter above (under construction at the moment.) + +Best of luck on the course, Michael! \ No newline at end of file diff --git a/prac-4-beginners/solutions/right.html b/prac-4-beginners/solutions/right.html new file mode 100644 index 00000000..bf19c6af --- /dev/null +++ b/prac-4-beginners/solutions/right.html @@ -0,0 +1,31 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/prac-4-beginners/solutions + + + + + + + + + + +
Folders
<Go Back> ch-06-org...ctions ch-08-pro...olving ch-10-ext...raries
ch-04-wri...f-code ch-07-dat...ctures ch-09-wor...-files ch-11-err...ndling
ch-05-int...e-code
+
+ + + + +
FileFileFileFile
readme.md 
+ +

+Folders: 9
+Files: 1
+Size of all files: 535 KB

+ + + \ No newline at end of file diff --git a/python-mega-algo/.coveragerc b/python-mega-algo/.coveragerc new file mode 100644 index 00000000..f7e6eb21 --- /dev/null +++ b/python-mega-algo/.coveragerc @@ -0,0 +1,4 @@ +[report] +sort = Cover +omit = + .env/* diff --git a/python-mega-algo/.gitattributes b/python-mega-algo/.gitattributes new file mode 100644 index 00000000..176a458f --- /dev/null +++ b/python-mega-algo/.gitattributes @@ -0,0 +1 @@ +* text=auto diff --git a/python-mega-algo/.gitignore b/python-mega-algo/.gitignore new file mode 100644 index 00000000..574cdf31 --- /dev/null +++ b/python-mega-algo/.gitignore @@ -0,0 +1,109 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a Python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +.hypothesis/ +.pytest_cache/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# pyenv +.python-version + +# celery beat schedule file +celerybeat-schedule + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ + +.DS_Store +.idea +.try +.vscode/ diff --git a/python-mega-algo/.gitpod.yml b/python-mega-algo/.gitpod.yml new file mode 100644 index 00000000..5975b8b8 --- /dev/null +++ b/python-mega-algo/.gitpod.yml @@ -0,0 +1,2 @@ +tasks: + - init: pip3 install -r ./requirements.txt diff --git a/python-mega-algo/README.md b/python-mega-algo/README.md new file mode 100644 index 00000000..e9a8a02c --- /dev/null +++ b/python-mega-algo/README.md @@ -0,0 +1,949 @@ +# Algorithms + +Run +```sh +pip install -r requirements.txt +``` +in this directory + +## Arithmetic Analysis + * [Bisection](https://github.com/TheAlgorithms/Python/blob/master/arithmetic_analysis/bisection.py) + * [Gaussian Elimination](https://github.com/TheAlgorithms/Python/blob/master/arithmetic_analysis/gaussian_elimination.py) + * [In Static Equilibrium](https://github.com/TheAlgorithms/Python/blob/master/arithmetic_analysis/in_static_equilibrium.py) + * [Intersection](https://github.com/TheAlgorithms/Python/blob/master/arithmetic_analysis/intersection.py) + * [Lu Decomposition](https://github.com/TheAlgorithms/Python/blob/master/arithmetic_analysis/lu_decomposition.py) + * [Newton Forward Interpolation](https://github.com/TheAlgorithms/Python/blob/master/arithmetic_analysis/newton_forward_interpolation.py) + * [Newton Method](https://github.com/TheAlgorithms/Python/blob/master/arithmetic_analysis/newton_method.py) + * [Newton Raphson](https://github.com/TheAlgorithms/Python/blob/master/arithmetic_analysis/newton_raphson.py) + * [Secant Method](https://github.com/TheAlgorithms/Python/blob/master/arithmetic_analysis/secant_method.py) + +## Backtracking + * [All Combinations](https://github.com/TheAlgorithms/Python/blob/master/backtracking/all_combinations.py) + * [All Permutations](https://github.com/TheAlgorithms/Python/blob/master/backtracking/all_permutations.py) + * [All Subsequences](https://github.com/TheAlgorithms/Python/blob/master/backtracking/all_subsequences.py) + * [Coloring](https://github.com/TheAlgorithms/Python/blob/master/backtracking/coloring.py) + * [Hamiltonian Cycle](https://github.com/TheAlgorithms/Python/blob/master/backtracking/hamiltonian_cycle.py) + * [Knight Tour](https://github.com/TheAlgorithms/Python/blob/master/backtracking/knight_tour.py) + * [Minimax](https://github.com/TheAlgorithms/Python/blob/master/backtracking/minimax.py) + * [N Queens](https://github.com/TheAlgorithms/Python/blob/master/backtracking/n_queens.py) + * [N Queens Math](https://github.com/TheAlgorithms/Python/blob/master/backtracking/n_queens_math.py) + * [Rat In Maze](https://github.com/TheAlgorithms/Python/blob/master/backtracking/rat_in_maze.py) + * [Sudoku](https://github.com/TheAlgorithms/Python/blob/master/backtracking/sudoku.py) + * [Sum Of Subsets](https://github.com/TheAlgorithms/Python/blob/master/backtracking/sum_of_subsets.py) + +## Bit Manipulation + * [Binary And Operator](https://github.com/TheAlgorithms/Python/blob/master/bit_manipulation/binary_and_operator.py) + * [Binary Count Setbits](https://github.com/TheAlgorithms/Python/blob/master/bit_manipulation/binary_count_setbits.py) + * [Binary Count Trailing Zeros](https://github.com/TheAlgorithms/Python/blob/master/bit_manipulation/binary_count_trailing_zeros.py) + * [Binary Or Operator](https://github.com/TheAlgorithms/Python/blob/master/bit_manipulation/binary_or_operator.py) + * [Binary Shifts](https://github.com/TheAlgorithms/Python/blob/master/bit_manipulation/binary_shifts.py) + * [Binary Twos Complement](https://github.com/TheAlgorithms/Python/blob/master/bit_manipulation/binary_twos_complement.py) + * [Binary Xor Operator](https://github.com/TheAlgorithms/Python/blob/master/bit_manipulation/binary_xor_operator.py) + * [Count Number Of One Bits](https://github.com/TheAlgorithms/Python/blob/master/bit_manipulation/count_number_of_one_bits.py) + * [Reverse Bits](https://github.com/TheAlgorithms/Python/blob/master/bit_manipulation/reverse_bits.py) + * [Single Bit Manipulation Operations](https://github.com/TheAlgorithms/Python/blob/master/bit_manipulation/single_bit_manipulation_operations.py) + +## Blockchain + * [Chinese Remainder Theorem](https://github.com/TheAlgorithms/Python/blob/master/blockchain/chinese_remainder_theorem.py) + * [Diophantine Equation](https://github.com/TheAlgorithms/Python/blob/master/blockchain/diophantine_equation.py) + * [Modular Division](https://github.com/TheAlgorithms/Python/blob/master/blockchain/modular_division.py) + +## Boolean Algebra + * [Quine Mc Cluskey](https://github.com/TheAlgorithms/Python/blob/master/boolean_algebra/quine_mc_cluskey.py) + +## Cellular Automata + * [Conways Game Of Life](https://github.com/TheAlgorithms/Python/blob/master/cellular_automata/conways_game_of_life.py) + * [Game Of Life](https://github.com/TheAlgorithms/Python/blob/master/cellular_automata/game_of_life.py) + * [One Dimensional](https://github.com/TheAlgorithms/Python/blob/master/cellular_automata/one_dimensional.py) + +## Ciphers + * [A1Z26](https://github.com/TheAlgorithms/Python/blob/master/ciphers/a1z26.py) + * [Affine Cipher](https://github.com/TheAlgorithms/Python/blob/master/ciphers/affine_cipher.py) + * [Atbash](https://github.com/TheAlgorithms/Python/blob/master/ciphers/atbash.py) + * [Base16](https://github.com/TheAlgorithms/Python/blob/master/ciphers/base16.py) + * [Base32](https://github.com/TheAlgorithms/Python/blob/master/ciphers/base32.py) + * [Base64 Encoding](https://github.com/TheAlgorithms/Python/blob/master/ciphers/base64_encoding.py) + * [Base85](https://github.com/TheAlgorithms/Python/blob/master/ciphers/base85.py) + * [Beaufort Cipher](https://github.com/TheAlgorithms/Python/blob/master/ciphers/beaufort_cipher.py) + * [Brute Force Caesar Cipher](https://github.com/TheAlgorithms/Python/blob/master/ciphers/brute_force_caesar_cipher.py) + * [Caesar Cipher](https://github.com/TheAlgorithms/Python/blob/master/ciphers/caesar_cipher.py) + * [Cryptomath Module](https://github.com/TheAlgorithms/Python/blob/master/ciphers/cryptomath_module.py) + * [Decrypt Caesar With Chi Squared](https://github.com/TheAlgorithms/Python/blob/master/ciphers/decrypt_caesar_with_chi_squared.py) + * [Deterministic Miller Rabin](https://github.com/TheAlgorithms/Python/blob/master/ciphers/deterministic_miller_rabin.py) + * [Diffie](https://github.com/TheAlgorithms/Python/blob/master/ciphers/diffie.py) + * [Diffie Hellman](https://github.com/TheAlgorithms/Python/blob/master/ciphers/diffie_hellman.py) + * [Elgamal Key Generator](https://github.com/TheAlgorithms/Python/blob/master/ciphers/elgamal_key_generator.py) + * [Enigma Machine2](https://github.com/TheAlgorithms/Python/blob/master/ciphers/enigma_machine2.py) + * [Hill Cipher](https://github.com/TheAlgorithms/Python/blob/master/ciphers/hill_cipher.py) + * [Mixed Keyword Cypher](https://github.com/TheAlgorithms/Python/blob/master/ciphers/mixed_keyword_cypher.py) + * [Mono Alphabetic Ciphers](https://github.com/TheAlgorithms/Python/blob/master/ciphers/mono_alphabetic_ciphers.py) + * [Morse Code Implementation](https://github.com/TheAlgorithms/Python/blob/master/ciphers/morse_code_implementation.py) + * [Onepad Cipher](https://github.com/TheAlgorithms/Python/blob/master/ciphers/onepad_cipher.py) + * [Playfair Cipher](https://github.com/TheAlgorithms/Python/blob/master/ciphers/playfair_cipher.py) + * [Porta Cipher](https://github.com/TheAlgorithms/Python/blob/master/ciphers/porta_cipher.py) + * [Rabin Miller](https://github.com/TheAlgorithms/Python/blob/master/ciphers/rabin_miller.py) + * [Rail Fence Cipher](https://github.com/TheAlgorithms/Python/blob/master/ciphers/rail_fence_cipher.py) + * [Rot13](https://github.com/TheAlgorithms/Python/blob/master/ciphers/rot13.py) + * [Rsa Cipher](https://github.com/TheAlgorithms/Python/blob/master/ciphers/rsa_cipher.py) + * [Rsa Factorization](https://github.com/TheAlgorithms/Python/blob/master/ciphers/rsa_factorization.py) + * [Rsa Key Generator](https://github.com/TheAlgorithms/Python/blob/master/ciphers/rsa_key_generator.py) + * [Shuffled Shift Cipher](https://github.com/TheAlgorithms/Python/blob/master/ciphers/shuffled_shift_cipher.py) + * [Simple Keyword Cypher](https://github.com/TheAlgorithms/Python/blob/master/ciphers/simple_keyword_cypher.py) + * [Simple Substitution Cipher](https://github.com/TheAlgorithms/Python/blob/master/ciphers/simple_substitution_cipher.py) + * [Trafid Cipher](https://github.com/TheAlgorithms/Python/blob/master/ciphers/trafid_cipher.py) + * [Transposition Cipher](https://github.com/TheAlgorithms/Python/blob/master/ciphers/transposition_cipher.py) + * [Transposition Cipher Encrypt Decrypt File](https://github.com/TheAlgorithms/Python/blob/master/ciphers/transposition_cipher_encrypt_decrypt_file.py) + * [Vigenere Cipher](https://github.com/TheAlgorithms/Python/blob/master/ciphers/vigenere_cipher.py) + * [Xor Cipher](https://github.com/TheAlgorithms/Python/blob/master/ciphers/xor_cipher.py) + +## Compression + * [Burrows Wheeler](https://github.com/TheAlgorithms/Python/blob/master/compression/burrows_wheeler.py) + * [Huffman](https://github.com/TheAlgorithms/Python/blob/master/compression/huffman.py) + * [Lempel Ziv](https://github.com/TheAlgorithms/Python/blob/master/compression/lempel_ziv.py) + * [Lempel Ziv Decompress](https://github.com/TheAlgorithms/Python/blob/master/compression/lempel_ziv_decompress.py) + * [Peak Signal To Noise Ratio](https://github.com/TheAlgorithms/Python/blob/master/compression/peak_signal_to_noise_ratio.py) + +## Computer Vision + * [Harriscorner](https://github.com/TheAlgorithms/Python/blob/master/computer_vision/harriscorner.py) + * [Meanthreshold](https://github.com/TheAlgorithms/Python/blob/master/computer_vision/meanthreshold.py) + +## Conversions + * [Binary To Decimal](https://github.com/TheAlgorithms/Python/blob/master/conversions/binary_to_decimal.py) + * [Binary To Octal](https://github.com/TheAlgorithms/Python/blob/master/conversions/binary_to_octal.py) + * [Decimal To Any](https://github.com/TheAlgorithms/Python/blob/master/conversions/decimal_to_any.py) + * [Decimal To Binary](https://github.com/TheAlgorithms/Python/blob/master/conversions/decimal_to_binary.py) + * [Decimal To Binary Recursion](https://github.com/TheAlgorithms/Python/blob/master/conversions/decimal_to_binary_recursion.py) + * [Decimal To Hexadecimal](https://github.com/TheAlgorithms/Python/blob/master/conversions/decimal_to_hexadecimal.py) + * [Decimal To Octal](https://github.com/TheAlgorithms/Python/blob/master/conversions/decimal_to_octal.py) + * [Hex To Bin](https://github.com/TheAlgorithms/Python/blob/master/conversions/hex_to_bin.py) + * [Hexadecimal To Decimal](https://github.com/TheAlgorithms/Python/blob/master/conversions/hexadecimal_to_decimal.py) + * [Molecular Chemistry](https://github.com/TheAlgorithms/Python/blob/master/conversions/molecular_chemistry.py) + * [Octal To Decimal](https://github.com/TheAlgorithms/Python/blob/master/conversions/octal_to_decimal.py) + * [Prefix Conversions](https://github.com/TheAlgorithms/Python/blob/master/conversions/prefix_conversions.py) + * [Rgb Hsv Conversion](https://github.com/TheAlgorithms/Python/blob/master/conversions/rgb_hsv_conversion.py) + * [Roman Numerals](https://github.com/TheAlgorithms/Python/blob/master/conversions/roman_numerals.py) + * [Temperature Conversions](https://github.com/TheAlgorithms/Python/blob/master/conversions/temperature_conversions.py) + * [Weight Conversion](https://github.com/TheAlgorithms/Python/blob/master/conversions/weight_conversion.py) + +## Data Structures + * Binary Tree + * [Avl Tree](https://github.com/TheAlgorithms/Python/blob/master/data_structures/binary_tree/avl_tree.py) + * [Basic Binary Tree](https://github.com/TheAlgorithms/Python/blob/master/data_structures/binary_tree/basic_binary_tree.py) + * [Binary Search Tree](https://github.com/TheAlgorithms/Python/blob/master/data_structures/binary_tree/binary_search_tree.py) + * [Binary Search Tree Recursive](https://github.com/TheAlgorithms/Python/blob/master/data_structures/binary_tree/binary_search_tree_recursive.py) + * [Binary Tree Mirror](https://github.com/TheAlgorithms/Python/blob/master/data_structures/binary_tree/binary_tree_mirror.py) + * [Binary Tree Traversals](https://github.com/TheAlgorithms/Python/blob/master/data_structures/binary_tree/binary_tree_traversals.py) + * [Fenwick Tree](https://github.com/TheAlgorithms/Python/blob/master/data_structures/binary_tree/fenwick_tree.py) + * [Lazy Segment Tree](https://github.com/TheAlgorithms/Python/blob/master/data_structures/binary_tree/lazy_segment_tree.py) + * [Lowest Common Ancestor](https://github.com/TheAlgorithms/Python/blob/master/data_structures/binary_tree/lowest_common_ancestor.py) + * [Merge Two Binary Trees](https://github.com/TheAlgorithms/Python/blob/master/data_structures/binary_tree/merge_two_binary_trees.py) + * [Non Recursive Segment Tree](https://github.com/TheAlgorithms/Python/blob/master/data_structures/binary_tree/non_recursive_segment_tree.py) + * [Number Of Possible Binary Trees](https://github.com/TheAlgorithms/Python/blob/master/data_structures/binary_tree/number_of_possible_binary_trees.py) + * [Red Black Tree](https://github.com/TheAlgorithms/Python/blob/master/data_structures/binary_tree/red_black_tree.py) + * [Segment Tree](https://github.com/TheAlgorithms/Python/blob/master/data_structures/binary_tree/segment_tree.py) + * [Segment Tree Other](https://github.com/TheAlgorithms/Python/blob/master/data_structures/binary_tree/segment_tree_other.py) + * [Treap](https://github.com/TheAlgorithms/Python/blob/master/data_structures/binary_tree/treap.py) + * Disjoint Set + * [Alternate Disjoint Set](https://github.com/TheAlgorithms/Python/blob/master/data_structures/disjoint_set/alternate_disjoint_set.py) + * [Disjoint Set](https://github.com/TheAlgorithms/Python/blob/master/data_structures/disjoint_set/disjoint_set.py) + * Hashing + * [Double Hash](https://github.com/TheAlgorithms/Python/blob/master/data_structures/hashing/double_hash.py) + * [Hash Table](https://github.com/TheAlgorithms/Python/blob/master/data_structures/hashing/hash_table.py) + * [Hash Table With Linked List](https://github.com/TheAlgorithms/Python/blob/master/data_structures/hashing/hash_table_with_linked_list.py) + * Number Theory + * [Prime Numbers](https://github.com/TheAlgorithms/Python/blob/master/data_structures/hashing/number_theory/prime_numbers.py) + * [Quadratic Probing](https://github.com/TheAlgorithms/Python/blob/master/data_structures/hashing/quadratic_probing.py) + * Heap + * [Binomial Heap](https://github.com/TheAlgorithms/Python/blob/master/data_structures/heap/binomial_heap.py) + * [Heap](https://github.com/TheAlgorithms/Python/blob/master/data_structures/heap/heap.py) + * [Heap Generic](https://github.com/TheAlgorithms/Python/blob/master/data_structures/heap/heap_generic.py) + * [Max Heap](https://github.com/TheAlgorithms/Python/blob/master/data_structures/heap/max_heap.py) + * [Min Heap](https://github.com/TheAlgorithms/Python/blob/master/data_structures/heap/min_heap.py) + * [Randomized Heap](https://github.com/TheAlgorithms/Python/blob/master/data_structures/heap/randomized_heap.py) + * [Skew Heap](https://github.com/TheAlgorithms/Python/blob/master/data_structures/heap/skew_heap.py) + * Linked List + * [Circular Linked List](https://github.com/TheAlgorithms/Python/blob/master/data_structures/linked_list/circular_linked_list.py) + * [Deque Doubly](https://github.com/TheAlgorithms/Python/blob/master/data_structures/linked_list/deque_doubly.py) + * [Doubly Linked List](https://github.com/TheAlgorithms/Python/blob/master/data_structures/linked_list/doubly_linked_list.py) + * [Doubly Linked List Two](https://github.com/TheAlgorithms/Python/blob/master/data_structures/linked_list/doubly_linked_list_two.py) + * [From Sequence](https://github.com/TheAlgorithms/Python/blob/master/data_structures/linked_list/from_sequence.py) + * [Has Loop](https://github.com/TheAlgorithms/Python/blob/master/data_structures/linked_list/has_loop.py) + * [Is Palindrome](https://github.com/TheAlgorithms/Python/blob/master/data_structures/linked_list/is_palindrome.py) + * [Merge Two Lists](https://github.com/TheAlgorithms/Python/blob/master/data_structures/linked_list/merge_two_lists.py) + * [Middle Element Of Linked List](https://github.com/TheAlgorithms/Python/blob/master/data_structures/linked_list/middle_element_of_linked_list.py) + * [Print Reverse](https://github.com/TheAlgorithms/Python/blob/master/data_structures/linked_list/print_reverse.py) + * [Singly Linked List](https://github.com/TheAlgorithms/Python/blob/master/data_structures/linked_list/singly_linked_list.py) + * [Skip List](https://github.com/TheAlgorithms/Python/blob/master/data_structures/linked_list/skip_list.py) + * [Swap Nodes](https://github.com/TheAlgorithms/Python/blob/master/data_structures/linked_list/swap_nodes.py) + * Queue + * [Circular Queue](https://github.com/TheAlgorithms/Python/blob/master/data_structures/queue/circular_queue.py) + * [Double Ended Queue](https://github.com/TheAlgorithms/Python/blob/master/data_structures/queue/double_ended_queue.py) + * [Linked Queue](https://github.com/TheAlgorithms/Python/blob/master/data_structures/queue/linked_queue.py) + * [Priority Queue Using List](https://github.com/TheAlgorithms/Python/blob/master/data_structures/queue/priority_queue_using_list.py) + * [Queue On List](https://github.com/TheAlgorithms/Python/blob/master/data_structures/queue/queue_on_list.py) + * [Queue On Pseudo Stack](https://github.com/TheAlgorithms/Python/blob/master/data_structures/queue/queue_on_pseudo_stack.py) + * Stacks + * [Balanced Parentheses](https://github.com/TheAlgorithms/Python/blob/master/data_structures/stacks/balanced_parentheses.py) + * [Dijkstras Two Stack Algorithm](https://github.com/TheAlgorithms/Python/blob/master/data_structures/stacks/dijkstras_two_stack_algorithm.py) + * [Evaluate Postfix Notations](https://github.com/TheAlgorithms/Python/blob/master/data_structures/stacks/evaluate_postfix_notations.py) + * [Infix To Postfix Conversion](https://github.com/TheAlgorithms/Python/blob/master/data_structures/stacks/infix_to_postfix_conversion.py) + * [Infix To Prefix Conversion](https://github.com/TheAlgorithms/Python/blob/master/data_structures/stacks/infix_to_prefix_conversion.py) + * [Linked Stack](https://github.com/TheAlgorithms/Python/blob/master/data_structures/stacks/linked_stack.py) + * [Next Greater Element](https://github.com/TheAlgorithms/Python/blob/master/data_structures/stacks/next_greater_element.py) + * [Postfix Evaluation](https://github.com/TheAlgorithms/Python/blob/master/data_structures/stacks/postfix_evaluation.py) + * [Prefix Evaluation](https://github.com/TheAlgorithms/Python/blob/master/data_structures/stacks/prefix_evaluation.py) + * [Stack](https://github.com/TheAlgorithms/Python/blob/master/data_structures/stacks/stack.py) + * [Stack Using Dll](https://github.com/TheAlgorithms/Python/blob/master/data_structures/stacks/stack_using_dll.py) + * [Stock Span Problem](https://github.com/TheAlgorithms/Python/blob/master/data_structures/stacks/stock_span_problem.py) + * Trie + * [Trie](https://github.com/TheAlgorithms/Python/blob/master/data_structures/trie/trie.py) + +## Digital Image Processing + * [Change Brightness](https://github.com/TheAlgorithms/Python/blob/master/digital_image_processing/change_brightness.py) + * [Change Contrast](https://github.com/TheAlgorithms/Python/blob/master/digital_image_processing/change_contrast.py) + * [Convert To Negative](https://github.com/TheAlgorithms/Python/blob/master/digital_image_processing/convert_to_negative.py) + * Dithering + * [Burkes](https://github.com/TheAlgorithms/Python/blob/master/digital_image_processing/dithering/burkes.py) + * Edge Detection + * [Canny](https://github.com/TheAlgorithms/Python/blob/master/digital_image_processing/edge_detection/canny.py) + * Filters + * [Bilateral Filter](https://github.com/TheAlgorithms/Python/blob/master/digital_image_processing/filters/bilateral_filter.py) + * [Convolve](https://github.com/TheAlgorithms/Python/blob/master/digital_image_processing/filters/convolve.py) + * [Gaussian Filter](https://github.com/TheAlgorithms/Python/blob/master/digital_image_processing/filters/gaussian_filter.py) + * [Median Filter](https://github.com/TheAlgorithms/Python/blob/master/digital_image_processing/filters/median_filter.py) + * [Sobel Filter](https://github.com/TheAlgorithms/Python/blob/master/digital_image_processing/filters/sobel_filter.py) + * Histogram Equalization + * [Histogram Stretch](https://github.com/TheAlgorithms/Python/blob/master/digital_image_processing/histogram_equalization/histogram_stretch.py) + * [Index Calculation](https://github.com/TheAlgorithms/Python/blob/master/digital_image_processing/index_calculation.py) + * Resize + * [Resize](https://github.com/TheAlgorithms/Python/blob/master/digital_image_processing/resize/resize.py) + * Rotation + * [Rotation](https://github.com/TheAlgorithms/Python/blob/master/digital_image_processing/rotation/rotation.py) + * [Sepia](https://github.com/TheAlgorithms/Python/blob/master/digital_image_processing/sepia.py) + * [Test Digital Image Processing](https://github.com/TheAlgorithms/Python/blob/master/digital_image_processing/test_digital_image_processing.py) + +## Divide And Conquer + * [Closest Pair Of Points](https://github.com/TheAlgorithms/Python/blob/master/divide_and_conquer/closest_pair_of_points.py) + * [Convex Hull](https://github.com/TheAlgorithms/Python/blob/master/divide_and_conquer/convex_hull.py) + * [Heaps Algorithm](https://github.com/TheAlgorithms/Python/blob/master/divide_and_conquer/heaps_algorithm.py) + * [Heaps Algorithm Iterative](https://github.com/TheAlgorithms/Python/blob/master/divide_and_conquer/heaps_algorithm_iterative.py) + * [Inversions](https://github.com/TheAlgorithms/Python/blob/master/divide_and_conquer/inversions.py) + * [Kth Order Statistic](https://github.com/TheAlgorithms/Python/blob/master/divide_and_conquer/kth_order_statistic.py) + * [Max Difference Pair](https://github.com/TheAlgorithms/Python/blob/master/divide_and_conquer/max_difference_pair.py) + * [Max Subarray Sum](https://github.com/TheAlgorithms/Python/blob/master/divide_and_conquer/max_subarray_sum.py) + * [Mergesort](https://github.com/TheAlgorithms/Python/blob/master/divide_and_conquer/mergesort.py) + * [Peak](https://github.com/TheAlgorithms/Python/blob/master/divide_and_conquer/peak.py) + * [Power](https://github.com/TheAlgorithms/Python/blob/master/divide_and_conquer/power.py) + * [Strassen Matrix Multiplication](https://github.com/TheAlgorithms/Python/blob/master/divide_and_conquer/strassen_matrix_multiplication.py) + +## Dynamic Programming + * [Abbreviation](https://github.com/TheAlgorithms/Python/blob/master/dynamic_programming/abbreviation.py) + * [Bitmask](https://github.com/TheAlgorithms/Python/blob/master/dynamic_programming/bitmask.py) + * [Climbing Stairs](https://github.com/TheAlgorithms/Python/blob/master/dynamic_programming/climbing_stairs.py) + * [Edit Distance](https://github.com/TheAlgorithms/Python/blob/master/dynamic_programming/edit_distance.py) + * [Factorial](https://github.com/TheAlgorithms/Python/blob/master/dynamic_programming/factorial.py) + * [Fast Fibonacci](https://github.com/TheAlgorithms/Python/blob/master/dynamic_programming/fast_fibonacci.py) + * [Fibonacci](https://github.com/TheAlgorithms/Python/blob/master/dynamic_programming/fibonacci.py) + * [Floyd Warshall](https://github.com/TheAlgorithms/Python/blob/master/dynamic_programming/floyd_warshall.py) + * [Fractional Knapsack](https://github.com/TheAlgorithms/Python/blob/master/dynamic_programming/fractional_knapsack.py) + * [Fractional Knapsack 2](https://github.com/TheAlgorithms/Python/blob/master/dynamic_programming/fractional_knapsack_2.py) + * [Integer Partition](https://github.com/TheAlgorithms/Python/blob/master/dynamic_programming/integer_partition.py) + * [Iterating Through Submasks](https://github.com/TheAlgorithms/Python/blob/master/dynamic_programming/iterating_through_submasks.py) + * [Knapsack](https://github.com/TheAlgorithms/Python/blob/master/dynamic_programming/knapsack.py) + * [Longest Common Subsequence](https://github.com/TheAlgorithms/Python/blob/master/dynamic_programming/longest_common_subsequence.py) + * [Longest Increasing Subsequence](https://github.com/TheAlgorithms/Python/blob/master/dynamic_programming/longest_increasing_subsequence.py) + * [Longest Increasing Subsequence O(Nlogn)](https://github.com/TheAlgorithms/Python/blob/master/dynamic_programming/longest_increasing_subsequence_o(nlogn).py) + * [Longest Sub Array](https://github.com/TheAlgorithms/Python/blob/master/dynamic_programming/longest_sub_array.py) + * [Matrix Chain Order](https://github.com/TheAlgorithms/Python/blob/master/dynamic_programming/matrix_chain_order.py) + * [Max Non Adjacent Sum](https://github.com/TheAlgorithms/Python/blob/master/dynamic_programming/max_non_adjacent_sum.py) + * [Max Sub Array](https://github.com/TheAlgorithms/Python/blob/master/dynamic_programming/max_sub_array.py) + * [Max Sum Contiguous Subsequence](https://github.com/TheAlgorithms/Python/blob/master/dynamic_programming/max_sum_contiguous_subsequence.py) + * [Minimum Coin Change](https://github.com/TheAlgorithms/Python/blob/master/dynamic_programming/minimum_coin_change.py) + * [Minimum Cost Path](https://github.com/TheAlgorithms/Python/blob/master/dynamic_programming/minimum_cost_path.py) + * [Minimum Partition](https://github.com/TheAlgorithms/Python/blob/master/dynamic_programming/minimum_partition.py) + * [Minimum Steps To One](https://github.com/TheAlgorithms/Python/blob/master/dynamic_programming/minimum_steps_to_one.py) + * [Optimal Binary Search Tree](https://github.com/TheAlgorithms/Python/blob/master/dynamic_programming/optimal_binary_search_tree.py) + * [Rod Cutting](https://github.com/TheAlgorithms/Python/blob/master/dynamic_programming/rod_cutting.py) + * [Subset Generation](https://github.com/TheAlgorithms/Python/blob/master/dynamic_programming/subset_generation.py) + * [Sum Of Subset](https://github.com/TheAlgorithms/Python/blob/master/dynamic_programming/sum_of_subset.py) + +## Electronics + * [Electric Power](https://github.com/TheAlgorithms/Python/blob/master/electronics/electric_power.py) + * [Ohms Law](https://github.com/TheAlgorithms/Python/blob/master/electronics/ohms_law.py) + +## File Transfer + * [Receive File](https://github.com/TheAlgorithms/Python/blob/master/file_transfer/receive_file.py) + * [Send File](https://github.com/TheAlgorithms/Python/blob/master/file_transfer/send_file.py) + * Tests + * [Test Send File](https://github.com/TheAlgorithms/Python/blob/master/file_transfer/tests/test_send_file.py) + +## Fractals + * [Koch Snowflake](https://github.com/TheAlgorithms/Python/blob/master/fractals/koch_snowflake.py) + * [Mandelbrot](https://github.com/TheAlgorithms/Python/blob/master/fractals/mandelbrot.py) + * [Sierpinski Triangle](https://github.com/TheAlgorithms/Python/blob/master/fractals/sierpinski_triangle.py) + +## Fuzzy Logic + * [Fuzzy Operations](https://github.com/TheAlgorithms/Python/blob/master/fuzzy_logic/fuzzy_operations.py) + +## Genetic Algorithm + * [Basic String](https://github.com/TheAlgorithms/Python/blob/master/genetic_algorithm/basic_string.py) + +## Geodesy + * [Haversine Distance](https://github.com/TheAlgorithms/Python/blob/master/geodesy/haversine_distance.py) + * [Lamberts Ellipsoidal Distance](https://github.com/TheAlgorithms/Python/blob/master/geodesy/lamberts_ellipsoidal_distance.py) + +## Graphics + * [Bezier Curve](https://github.com/TheAlgorithms/Python/blob/master/graphics/bezier_curve.py) + * [Vector3 For 2D Rendering](https://github.com/TheAlgorithms/Python/blob/master/graphics/vector3_for_2d_rendering.py) + +## Graphs + * [A Star](https://github.com/TheAlgorithms/Python/blob/master/graphs/a_star.py) + * [Articulation Points](https://github.com/TheAlgorithms/Python/blob/master/graphs/articulation_points.py) + * [Basic Graphs](https://github.com/TheAlgorithms/Python/blob/master/graphs/basic_graphs.py) + * [Bellman Ford](https://github.com/TheAlgorithms/Python/blob/master/graphs/bellman_ford.py) + * [Bfs Shortest Path](https://github.com/TheAlgorithms/Python/blob/master/graphs/bfs_shortest_path.py) + * [Bfs Zero One Shortest Path](https://github.com/TheAlgorithms/Python/blob/master/graphs/bfs_zero_one_shortest_path.py) + * [Bidirectional A Star](https://github.com/TheAlgorithms/Python/blob/master/graphs/bidirectional_a_star.py) + * [Bidirectional Breadth First Search](https://github.com/TheAlgorithms/Python/blob/master/graphs/bidirectional_breadth_first_search.py) + * [Breadth First Search](https://github.com/TheAlgorithms/Python/blob/master/graphs/breadth_first_search.py) + * [Breadth First Search 2](https://github.com/TheAlgorithms/Python/blob/master/graphs/breadth_first_search_2.py) + * [Breadth First Search Shortest Path](https://github.com/TheAlgorithms/Python/blob/master/graphs/breadth_first_search_shortest_path.py) + * [Check Bipartite Graph Bfs](https://github.com/TheAlgorithms/Python/blob/master/graphs/check_bipartite_graph_bfs.py) + * [Check Bipartite Graph Dfs](https://github.com/TheAlgorithms/Python/blob/master/graphs/check_bipartite_graph_dfs.py) + * [Connected Components](https://github.com/TheAlgorithms/Python/blob/master/graphs/connected_components.py) + * [Depth First Search](https://github.com/TheAlgorithms/Python/blob/master/graphs/depth_first_search.py) + * [Depth First Search 2](https://github.com/TheAlgorithms/Python/blob/master/graphs/depth_first_search_2.py) + * [Dijkstra](https://github.com/TheAlgorithms/Python/blob/master/graphs/dijkstra.py) + * [Dijkstra 2](https://github.com/TheAlgorithms/Python/blob/master/graphs/dijkstra_2.py) + * [Dijkstra Algorithm](https://github.com/TheAlgorithms/Python/blob/master/graphs/dijkstra_algorithm.py) + * [Dinic](https://github.com/TheAlgorithms/Python/blob/master/graphs/dinic.py) + * [Directed And Undirected (Weighted) Graph](https://github.com/TheAlgorithms/Python/blob/master/graphs/directed_and_undirected_(weighted)_graph.py) + * [Edmonds Karp Multiple Source And Sink](https://github.com/TheAlgorithms/Python/blob/master/graphs/edmonds_karp_multiple_source_and_sink.py) + * [Eulerian Path And Circuit For Undirected Graph](https://github.com/TheAlgorithms/Python/blob/master/graphs/eulerian_path_and_circuit_for_undirected_graph.py) + * [Even Tree](https://github.com/TheAlgorithms/Python/blob/master/graphs/even_tree.py) + * [Finding Bridges](https://github.com/TheAlgorithms/Python/blob/master/graphs/finding_bridges.py) + * [Frequent Pattern Graph Miner](https://github.com/TheAlgorithms/Python/blob/master/graphs/frequent_pattern_graph_miner.py) + * [G Topological Sort](https://github.com/TheAlgorithms/Python/blob/master/graphs/g_topological_sort.py) + * [Gale Shapley Bigraph](https://github.com/TheAlgorithms/Python/blob/master/graphs/gale_shapley_bigraph.py) + * [Graph List](https://github.com/TheAlgorithms/Python/blob/master/graphs/graph_list.py) + * [Graph Matrix](https://github.com/TheAlgorithms/Python/blob/master/graphs/graph_matrix.py) + * [Graphs Floyd Warshall](https://github.com/TheAlgorithms/Python/blob/master/graphs/graphs_floyd_warshall.py) + * [Greedy Best First](https://github.com/TheAlgorithms/Python/blob/master/graphs/greedy_best_first.py) + * [Kahns Algorithm Long](https://github.com/TheAlgorithms/Python/blob/master/graphs/kahns_algorithm_long.py) + * [Kahns Algorithm Topo](https://github.com/TheAlgorithms/Python/blob/master/graphs/kahns_algorithm_topo.py) + * [Karger](https://github.com/TheAlgorithms/Python/blob/master/graphs/karger.py) + * [Markov Chain](https://github.com/TheAlgorithms/Python/blob/master/graphs/markov_chain.py) + * [Minimum Spanning Tree Boruvka](https://github.com/TheAlgorithms/Python/blob/master/graphs/minimum_spanning_tree_boruvka.py) + * [Minimum Spanning Tree Kruskal](https://github.com/TheAlgorithms/Python/blob/master/graphs/minimum_spanning_tree_kruskal.py) + * [Minimum Spanning Tree Kruskal2](https://github.com/TheAlgorithms/Python/blob/master/graphs/minimum_spanning_tree_kruskal2.py) + * [Minimum Spanning Tree Prims](https://github.com/TheAlgorithms/Python/blob/master/graphs/minimum_spanning_tree_prims.py) + * [Minimum Spanning Tree Prims2](https://github.com/TheAlgorithms/Python/blob/master/graphs/minimum_spanning_tree_prims2.py) + * [Multi Heuristic Astar](https://github.com/TheAlgorithms/Python/blob/master/graphs/multi_heuristic_astar.py) + * [Page Rank](https://github.com/TheAlgorithms/Python/blob/master/graphs/page_rank.py) + * [Prim](https://github.com/TheAlgorithms/Python/blob/master/graphs/prim.py) + * [Scc Kosaraju](https://github.com/TheAlgorithms/Python/blob/master/graphs/scc_kosaraju.py) + * [Strongly Connected Components](https://github.com/TheAlgorithms/Python/blob/master/graphs/strongly_connected_components.py) + * [Tarjans Scc](https://github.com/TheAlgorithms/Python/blob/master/graphs/tarjans_scc.py) + * Tests + * [Test Min Spanning Tree Kruskal](https://github.com/TheAlgorithms/Python/blob/master/graphs/tests/test_min_spanning_tree_kruskal.py) + * [Test Min Spanning Tree Prim](https://github.com/TheAlgorithms/Python/blob/master/graphs/tests/test_min_spanning_tree_prim.py) + +## Hashes + * [Adler32](https://github.com/TheAlgorithms/Python/blob/master/hashes/adler32.py) + * [Chaos Machine](https://github.com/TheAlgorithms/Python/blob/master/hashes/chaos_machine.py) + * [Djb2](https://github.com/TheAlgorithms/Python/blob/master/hashes/djb2.py) + * [Enigma Machine](https://github.com/TheAlgorithms/Python/blob/master/hashes/enigma_machine.py) + * [Hamming Code](https://github.com/TheAlgorithms/Python/blob/master/hashes/hamming_code.py) + * [Md5](https://github.com/TheAlgorithms/Python/blob/master/hashes/md5.py) + * [Sdbm](https://github.com/TheAlgorithms/Python/blob/master/hashes/sdbm.py) + * [Sha1](https://github.com/TheAlgorithms/Python/blob/master/hashes/sha1.py) + +## Knapsack + * [Greedy Knapsack](https://github.com/TheAlgorithms/Python/blob/master/knapsack/greedy_knapsack.py) + * [Knapsack](https://github.com/TheAlgorithms/Python/blob/master/knapsack/knapsack.py) + * Tests + * [Test Greedy Knapsack](https://github.com/TheAlgorithms/Python/blob/master/knapsack/tests/test_greedy_knapsack.py) + * [Test Knapsack](https://github.com/TheAlgorithms/Python/blob/master/knapsack/tests/test_knapsack.py) + +## Linear Algebra + * Src + * [Conjugate Gradient](https://github.com/TheAlgorithms/Python/blob/master/linear_algebra/src/conjugate_gradient.py) + * [Lib](https://github.com/TheAlgorithms/Python/blob/master/linear_algebra/src/lib.py) + * [Polynom For Points](https://github.com/TheAlgorithms/Python/blob/master/linear_algebra/src/polynom_for_points.py) + * [Power Iteration](https://github.com/TheAlgorithms/Python/blob/master/linear_algebra/src/power_iteration.py) + * [Rayleigh Quotient](https://github.com/TheAlgorithms/Python/blob/master/linear_algebra/src/rayleigh_quotient.py) + * [Test Linear Algebra](https://github.com/TheAlgorithms/Python/blob/master/linear_algebra/src/test_linear_algebra.py) + * [Transformations 2D](https://github.com/TheAlgorithms/Python/blob/master/linear_algebra/src/transformations_2d.py) + +## Machine Learning + * [Astar](https://github.com/TheAlgorithms/Python/blob/master/machine_learning/astar.py) + * [Data Transformations](https://github.com/TheAlgorithms/Python/blob/master/machine_learning/data_transformations.py) + * [Decision Tree](https://github.com/TheAlgorithms/Python/blob/master/machine_learning/decision_tree.py) + * Forecasting + * [Run](https://github.com/TheAlgorithms/Python/blob/master/machine_learning/forecasting/run.py) + * [Gaussian Naive Bayes](https://github.com/TheAlgorithms/Python/blob/master/machine_learning/gaussian_naive_bayes.py) + * [Gradient Boosting Regressor](https://github.com/TheAlgorithms/Python/blob/master/machine_learning/gradient_boosting_regressor.py) + * [Gradient Descent](https://github.com/TheAlgorithms/Python/blob/master/machine_learning/gradient_descent.py) + * [K Means Clust](https://github.com/TheAlgorithms/Python/blob/master/machine_learning/k_means_clust.py) + * [K Nearest Neighbours](https://github.com/TheAlgorithms/Python/blob/master/machine_learning/k_nearest_neighbours.py) + * [Knn Sklearn](https://github.com/TheAlgorithms/Python/blob/master/machine_learning/knn_sklearn.py) + * [Linear Discriminant Analysis](https://github.com/TheAlgorithms/Python/blob/master/machine_learning/linear_discriminant_analysis.py) + * [Linear Regression](https://github.com/TheAlgorithms/Python/blob/master/machine_learning/linear_regression.py) + * [Logistic Regression](https://github.com/TheAlgorithms/Python/blob/master/machine_learning/logistic_regression.py) + * Lstm + * [Lstm Prediction](https://github.com/TheAlgorithms/Python/blob/master/machine_learning/lstm/lstm_prediction.py) + * [Multilayer Perceptron Classifier](https://github.com/TheAlgorithms/Python/blob/master/machine_learning/multilayer_perceptron_classifier.py) + * [Polymonial Regression](https://github.com/TheAlgorithms/Python/blob/master/machine_learning/polymonial_regression.py) + * [Random Forest Classifier](https://github.com/TheAlgorithms/Python/blob/master/machine_learning/random_forest_classifier.py) + * [Random Forest Regressor](https://github.com/TheAlgorithms/Python/blob/master/machine_learning/random_forest_regressor.py) + * [Scoring Functions](https://github.com/TheAlgorithms/Python/blob/master/machine_learning/scoring_functions.py) + * [Sequential Minimum Optimization](https://github.com/TheAlgorithms/Python/blob/master/machine_learning/sequential_minimum_optimization.py) + * [Similarity Search](https://github.com/TheAlgorithms/Python/blob/master/machine_learning/similarity_search.py) + * [Support Vector Machines](https://github.com/TheAlgorithms/Python/blob/master/machine_learning/support_vector_machines.py) + * [Word Frequency Functions](https://github.com/TheAlgorithms/Python/blob/master/machine_learning/word_frequency_functions.py) + +## Maths + * [3N Plus 1](https://github.com/TheAlgorithms/Python/blob/master/maths/3n_plus_1.py) + * [Abs](https://github.com/TheAlgorithms/Python/blob/master/maths/abs.py) + * [Abs Max](https://github.com/TheAlgorithms/Python/blob/master/maths/abs_max.py) + * [Abs Min](https://github.com/TheAlgorithms/Python/blob/master/maths/abs_min.py) + * [Add](https://github.com/TheAlgorithms/Python/blob/master/maths/add.py) + * [Aliquot Sum](https://github.com/TheAlgorithms/Python/blob/master/maths/aliquot_sum.py) + * [Allocation Number](https://github.com/TheAlgorithms/Python/blob/master/maths/allocation_number.py) + * [Area](https://github.com/TheAlgorithms/Python/blob/master/maths/area.py) + * [Area Under Curve](https://github.com/TheAlgorithms/Python/blob/master/maths/area_under_curve.py) + * [Armstrong Numbers](https://github.com/TheAlgorithms/Python/blob/master/maths/armstrong_numbers.py) + * [Average Mean](https://github.com/TheAlgorithms/Python/blob/master/maths/average_mean.py) + * [Average Median](https://github.com/TheAlgorithms/Python/blob/master/maths/average_median.py) + * [Average Mode](https://github.com/TheAlgorithms/Python/blob/master/maths/average_mode.py) + * [Bailey Borwein Plouffe](https://github.com/TheAlgorithms/Python/blob/master/maths/bailey_borwein_plouffe.py) + * [Basic Maths](https://github.com/TheAlgorithms/Python/blob/master/maths/basic_maths.py) + * [Binary Exp Mod](https://github.com/TheAlgorithms/Python/blob/master/maths/binary_exp_mod.py) + * [Binary Exponentiation](https://github.com/TheAlgorithms/Python/blob/master/maths/binary_exponentiation.py) + * [Binary Exponentiation 2](https://github.com/TheAlgorithms/Python/blob/master/maths/binary_exponentiation_2.py) + * [Binary Exponentiation 3](https://github.com/TheAlgorithms/Python/blob/master/maths/binary_exponentiation_3.py) + * [Binomial Coefficient](https://github.com/TheAlgorithms/Python/blob/master/maths/binomial_coefficient.py) + * [Binomial Distribution](https://github.com/TheAlgorithms/Python/blob/master/maths/binomial_distribution.py) + * [Bisection](https://github.com/TheAlgorithms/Python/blob/master/maths/bisection.py) + * [Ceil](https://github.com/TheAlgorithms/Python/blob/master/maths/ceil.py) + * [Chudnovsky Algorithm](https://github.com/TheAlgorithms/Python/blob/master/maths/chudnovsky_algorithm.py) + * [Collatz Sequence](https://github.com/TheAlgorithms/Python/blob/master/maths/collatz_sequence.py) + * [Combinations](https://github.com/TheAlgorithms/Python/blob/master/maths/combinations.py) + * [Decimal Isolate](https://github.com/TheAlgorithms/Python/blob/master/maths/decimal_isolate.py) + * [Entropy](https://github.com/TheAlgorithms/Python/blob/master/maths/entropy.py) + * [Euclidean Distance](https://github.com/TheAlgorithms/Python/blob/master/maths/euclidean_distance.py) + * [Euclidean Gcd](https://github.com/TheAlgorithms/Python/blob/master/maths/euclidean_gcd.py) + * [Euler Method](https://github.com/TheAlgorithms/Python/blob/master/maths/euler_method.py) + * [Eulers Totient](https://github.com/TheAlgorithms/Python/blob/master/maths/eulers_totient.py) + * [Extended Euclidean Algorithm](https://github.com/TheAlgorithms/Python/blob/master/maths/extended_euclidean_algorithm.py) + * [Factorial Iterative](https://github.com/TheAlgorithms/Python/blob/master/maths/factorial_iterative.py) + * [Factorial Python](https://github.com/TheAlgorithms/Python/blob/master/maths/factorial_python.py) + * [Factorial Recursive](https://github.com/TheAlgorithms/Python/blob/master/maths/factorial_recursive.py) + * [Factors](https://github.com/TheAlgorithms/Python/blob/master/maths/factors.py) + * [Fermat Little Theorem](https://github.com/TheAlgorithms/Python/blob/master/maths/fermat_little_theorem.py) + * [Fibonacci](https://github.com/TheAlgorithms/Python/blob/master/maths/fibonacci.py) + * [Fibonacci Sequence Recursion](https://github.com/TheAlgorithms/Python/blob/master/maths/fibonacci_sequence_recursion.py) + * [Find Max](https://github.com/TheAlgorithms/Python/blob/master/maths/find_max.py) + * [Find Max Recursion](https://github.com/TheAlgorithms/Python/blob/master/maths/find_max_recursion.py) + * [Find Min](https://github.com/TheAlgorithms/Python/blob/master/maths/find_min.py) + * [Find Min Recursion](https://github.com/TheAlgorithms/Python/blob/master/maths/find_min_recursion.py) + * [Floor](https://github.com/TheAlgorithms/Python/blob/master/maths/floor.py) + * [Gamma](https://github.com/TheAlgorithms/Python/blob/master/maths/gamma.py) + * [Gaussian](https://github.com/TheAlgorithms/Python/blob/master/maths/gaussian.py) + * [Greatest Common Divisor](https://github.com/TheAlgorithms/Python/blob/master/maths/greatest_common_divisor.py) + * [Greedy Coin Change](https://github.com/TheAlgorithms/Python/blob/master/maths/greedy_coin_change.py) + * [Hardy Ramanujanalgo](https://github.com/TheAlgorithms/Python/blob/master/maths/hardy_ramanujanalgo.py) + * [Integration By Simpson Approx](https://github.com/TheAlgorithms/Python/blob/master/maths/integration_by_simpson_approx.py) + * [Is Square Free](https://github.com/TheAlgorithms/Python/blob/master/maths/is_square_free.py) + * [Jaccard Similarity](https://github.com/TheAlgorithms/Python/blob/master/maths/jaccard_similarity.py) + * [Kadanes](https://github.com/TheAlgorithms/Python/blob/master/maths/kadanes.py) + * [Karatsuba](https://github.com/TheAlgorithms/Python/blob/master/maths/karatsuba.py) + * [Krishnamurthy Number](https://github.com/TheAlgorithms/Python/blob/master/maths/krishnamurthy_number.py) + * [Kth Lexicographic Permutation](https://github.com/TheAlgorithms/Python/blob/master/maths/kth_lexicographic_permutation.py) + * [Largest Of Very Large Numbers](https://github.com/TheAlgorithms/Python/blob/master/maths/largest_of_very_large_numbers.py) + * [Largest Subarray Sum](https://github.com/TheAlgorithms/Python/blob/master/maths/largest_subarray_sum.py) + * [Least Common Multiple](https://github.com/TheAlgorithms/Python/blob/master/maths/least_common_multiple.py) + * [Line Length](https://github.com/TheAlgorithms/Python/blob/master/maths/line_length.py) + * [Lucas Lehmer Primality Test](https://github.com/TheAlgorithms/Python/blob/master/maths/lucas_lehmer_primality_test.py) + * [Lucas Series](https://github.com/TheAlgorithms/Python/blob/master/maths/lucas_series.py) + * [Matrix Exponentiation](https://github.com/TheAlgorithms/Python/blob/master/maths/matrix_exponentiation.py) + * [Max Sum Sliding Window](https://github.com/TheAlgorithms/Python/blob/master/maths/max_sum_sliding_window.py) + * [Median Of Two Arrays](https://github.com/TheAlgorithms/Python/blob/master/maths/median_of_two_arrays.py) + * [Miller Rabin](https://github.com/TheAlgorithms/Python/blob/master/maths/miller_rabin.py) + * [Mobius Function](https://github.com/TheAlgorithms/Python/blob/master/maths/mobius_function.py) + * [Modular Exponential](https://github.com/TheAlgorithms/Python/blob/master/maths/modular_exponential.py) + * [Monte Carlo](https://github.com/TheAlgorithms/Python/blob/master/maths/monte_carlo.py) + * [Monte Carlo Dice](https://github.com/TheAlgorithms/Python/blob/master/maths/monte_carlo_dice.py) + * [Newton Raphson](https://github.com/TheAlgorithms/Python/blob/master/maths/newton_raphson.py) + * [Number Of Digits](https://github.com/TheAlgorithms/Python/blob/master/maths/number_of_digits.py) + * [Numerical Integration](https://github.com/TheAlgorithms/Python/blob/master/maths/numerical_integration.py) + * [Perfect Cube](https://github.com/TheAlgorithms/Python/blob/master/maths/perfect_cube.py) + * [Perfect Number](https://github.com/TheAlgorithms/Python/blob/master/maths/perfect_number.py) + * [Perfect Square](https://github.com/TheAlgorithms/Python/blob/master/maths/perfect_square.py) + * [Pi Monte Carlo Estimation](https://github.com/TheAlgorithms/Python/blob/master/maths/pi_monte_carlo_estimation.py) + * [Polynomial Evaluation](https://github.com/TheAlgorithms/Python/blob/master/maths/polynomial_evaluation.py) + * [Power Using Recursion](https://github.com/TheAlgorithms/Python/blob/master/maths/power_using_recursion.py) + * [Prime Check](https://github.com/TheAlgorithms/Python/blob/master/maths/prime_check.py) + * [Prime Factors](https://github.com/TheAlgorithms/Python/blob/master/maths/prime_factors.py) + * [Prime Numbers](https://github.com/TheAlgorithms/Python/blob/master/maths/prime_numbers.py) + * [Prime Sieve Eratosthenes](https://github.com/TheAlgorithms/Python/blob/master/maths/prime_sieve_eratosthenes.py) + * [Primelib](https://github.com/TheAlgorithms/Python/blob/master/maths/primelib.py) + * [Pythagoras](https://github.com/TheAlgorithms/Python/blob/master/maths/pythagoras.py) + * [Qr Decomposition](https://github.com/TheAlgorithms/Python/blob/master/maths/qr_decomposition.py) + * [Quadratic Equations Complex Numbers](https://github.com/TheAlgorithms/Python/blob/master/maths/quadratic_equations_complex_numbers.py) + * [Radians](https://github.com/TheAlgorithms/Python/blob/master/maths/radians.py) + * [Radix2 Fft](https://github.com/TheAlgorithms/Python/blob/master/maths/radix2_fft.py) + * [Relu](https://github.com/TheAlgorithms/Python/blob/master/maths/relu.py) + * [Runge Kutta](https://github.com/TheAlgorithms/Python/blob/master/maths/runge_kutta.py) + * [Segmented Sieve](https://github.com/TheAlgorithms/Python/blob/master/maths/segmented_sieve.py) + * Series + * [Arithmetic Mean](https://github.com/TheAlgorithms/Python/blob/master/maths/series/arithmetic_mean.py) + * [Geometric Mean](https://github.com/TheAlgorithms/Python/blob/master/maths/series/geometric_mean.py) + * [Geometric Series](https://github.com/TheAlgorithms/Python/blob/master/maths/series/geometric_series.py) + * [Harmonic Series](https://github.com/TheAlgorithms/Python/blob/master/maths/series/harmonic_series.py) + * [P Series](https://github.com/TheAlgorithms/Python/blob/master/maths/series/p_series.py) + * [Sieve Of Eratosthenes](https://github.com/TheAlgorithms/Python/blob/master/maths/sieve_of_eratosthenes.py) + * [Sigmoid](https://github.com/TheAlgorithms/Python/blob/master/maths/sigmoid.py) + * [Simpson Rule](https://github.com/TheAlgorithms/Python/blob/master/maths/simpson_rule.py) + * [Softmax](https://github.com/TheAlgorithms/Python/blob/master/maths/softmax.py) + * [Square Root](https://github.com/TheAlgorithms/Python/blob/master/maths/square_root.py) + * [Sum Of Arithmetic Series](https://github.com/TheAlgorithms/Python/blob/master/maths/sum_of_arithmetic_series.py) + * [Sum Of Digits](https://github.com/TheAlgorithms/Python/blob/master/maths/sum_of_digits.py) + * [Sum Of Geometric Progression](https://github.com/TheAlgorithms/Python/blob/master/maths/sum_of_geometric_progression.py) + * [Test Prime Check](https://github.com/TheAlgorithms/Python/blob/master/maths/test_prime_check.py) + * [Trapezoidal Rule](https://github.com/TheAlgorithms/Python/blob/master/maths/trapezoidal_rule.py) + * [Triplet Sum](https://github.com/TheAlgorithms/Python/blob/master/maths/triplet_sum.py) + * [Two Pointer](https://github.com/TheAlgorithms/Python/blob/master/maths/two_pointer.py) + * [Two Sum](https://github.com/TheAlgorithms/Python/blob/master/maths/two_sum.py) + * [Ugly Numbers](https://github.com/TheAlgorithms/Python/blob/master/maths/ugly_numbers.py) + * [Volume](https://github.com/TheAlgorithms/Python/blob/master/maths/volume.py) + * [Zellers Congruence](https://github.com/TheAlgorithms/Python/blob/master/maths/zellers_congruence.py) + +## Matrix + * [Count Islands In Matrix](https://github.com/TheAlgorithms/Python/blob/master/matrix/count_islands_in_matrix.py) + * [Inverse Of Matrix](https://github.com/TheAlgorithms/Python/blob/master/matrix/inverse_of_matrix.py) + * [Matrix Class](https://github.com/TheAlgorithms/Python/blob/master/matrix/matrix_class.py) + * [Matrix Operation](https://github.com/TheAlgorithms/Python/blob/master/matrix/matrix_operation.py) + * [Nth Fibonacci Using Matrix Exponentiation](https://github.com/TheAlgorithms/Python/blob/master/matrix/nth_fibonacci_using_matrix_exponentiation.py) + * [Rotate Matrix](https://github.com/TheAlgorithms/Python/blob/master/matrix/rotate_matrix.py) + * [Searching In Sorted Matrix](https://github.com/TheAlgorithms/Python/blob/master/matrix/searching_in_sorted_matrix.py) + * [Sherman Morrison](https://github.com/TheAlgorithms/Python/blob/master/matrix/sherman_morrison.py) + * [Spiral Print](https://github.com/TheAlgorithms/Python/blob/master/matrix/spiral_print.py) + * Tests + * [Test Matrix Operation](https://github.com/TheAlgorithms/Python/blob/master/matrix/tests/test_matrix_operation.py) + +## Networking Flow + * [Ford Fulkerson](https://github.com/TheAlgorithms/Python/blob/master/networking_flow/ford_fulkerson.py) + * [Minimum Cut](https://github.com/TheAlgorithms/Python/blob/master/networking_flow/minimum_cut.py) + +## Neural Network + * [2 Hidden Layers Neural Network](https://github.com/TheAlgorithms/Python/blob/master/neural_network/2_hidden_layers_neural_network.py) + * [Back Propagation Neural Network](https://github.com/TheAlgorithms/Python/blob/master/neural_network/back_propagation_neural_network.py) + * [Convolution Neural Network](https://github.com/TheAlgorithms/Python/blob/master/neural_network/convolution_neural_network.py) + * [Perceptron](https://github.com/TheAlgorithms/Python/blob/master/neural_network/perceptron.py) + +## Other + * [Activity Selection](https://github.com/TheAlgorithms/Python/blob/master/other/activity_selection.py) + * [Davis–Putnam–Logemann–Loveland](https://github.com/TheAlgorithms/Python/blob/master/other/davis–putnam–logemann–loveland.py) + * [Dijkstra Bankers Algorithm](https://github.com/TheAlgorithms/Python/blob/master/other/dijkstra_bankers_algorithm.py) + * [Doomsday](https://github.com/TheAlgorithms/Python/blob/master/other/doomsday.py) + * [Fischer Yates Shuffle](https://github.com/TheAlgorithms/Python/blob/master/other/fischer_yates_shuffle.py) + * [Gauss Easter](https://github.com/TheAlgorithms/Python/blob/master/other/gauss_easter.py) + * [Graham Scan](https://github.com/TheAlgorithms/Python/blob/master/other/graham_scan.py) + * [Greedy](https://github.com/TheAlgorithms/Python/blob/master/other/greedy.py) + * [Least Recently Used](https://github.com/TheAlgorithms/Python/blob/master/other/least_recently_used.py) + * [Lfu Cache](https://github.com/TheAlgorithms/Python/blob/master/other/lfu_cache.py) + * [Linear Congruential Generator](https://github.com/TheAlgorithms/Python/blob/master/other/linear_congruential_generator.py) + * [Lru Cache](https://github.com/TheAlgorithms/Python/blob/master/other/lru_cache.py) + * [Magicdiamondpattern](https://github.com/TheAlgorithms/Python/blob/master/other/magicdiamondpattern.py) + * [Nested Brackets](https://github.com/TheAlgorithms/Python/blob/master/other/nested_brackets.py) + * [Password Generator](https://github.com/TheAlgorithms/Python/blob/master/other/password_generator.py) + * [Scoring Algorithm](https://github.com/TheAlgorithms/Python/blob/master/other/scoring_algorithm.py) + * [Sdes](https://github.com/TheAlgorithms/Python/blob/master/other/sdes.py) + * [Tower Of Hanoi](https://github.com/TheAlgorithms/Python/blob/master/other/tower_of_hanoi.py) + +## Physics + * [N Body Simulation](https://github.com/TheAlgorithms/Python/blob/master/physics/n_body_simulation.py) + +## Project Euler + * Problem 001 + * [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_001/sol1.py) + * [Sol2](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_001/sol2.py) + * [Sol3](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_001/sol3.py) + * [Sol4](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_001/sol4.py) + * [Sol5](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_001/sol5.py) + * [Sol6](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_001/sol6.py) + * [Sol7](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_001/sol7.py) + * Problem 002 + * [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_002/sol1.py) + * [Sol2](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_002/sol2.py) + * [Sol3](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_002/sol3.py) + * [Sol4](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_002/sol4.py) + * [Sol5](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_002/sol5.py) + * Problem 003 + * [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_003/sol1.py) + * [Sol2](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_003/sol2.py) + * [Sol3](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_003/sol3.py) + * Problem 004 + * [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_004/sol1.py) + * [Sol2](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_004/sol2.py) + * Problem 005 + * [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_005/sol1.py) + * [Sol2](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_005/sol2.py) + * Problem 006 + * [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_006/sol1.py) + * [Sol2](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_006/sol2.py) + * [Sol3](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_006/sol3.py) + * [Sol4](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_006/sol4.py) + * Problem 007 + * [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_007/sol1.py) + * [Sol2](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_007/sol2.py) + * [Sol3](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_007/sol3.py) + * Problem 008 + * [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_008/sol1.py) + * [Sol2](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_008/sol2.py) + * [Sol3](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_008/sol3.py) + * Problem 009 + * [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_009/sol1.py) + * [Sol2](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_009/sol2.py) + * [Sol3](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_009/sol3.py) + * Problem 010 + * [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_010/sol1.py) + * [Sol2](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_010/sol2.py) + * [Sol3](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_010/sol3.py) + * Problem 011 + * [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_011/sol1.py) + * [Sol2](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_011/sol2.py) + * Problem 012 + * [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_012/sol1.py) + * [Sol2](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_012/sol2.py) + * Problem 013 + * [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_013/sol1.py) + * Problem 014 + * [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_014/sol1.py) + * [Sol2](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_014/sol2.py) + * Problem 015 + * [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_015/sol1.py) + * Problem 016 + * [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_016/sol1.py) + * [Sol2](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_016/sol2.py) + * Problem 017 + * [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_017/sol1.py) + * Problem 018 + * [Solution](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_018/solution.py) + * Problem 019 + * [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_019/sol1.py) + * Problem 020 + * [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_020/sol1.py) + * [Sol2](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_020/sol2.py) + * [Sol3](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_020/sol3.py) + * [Sol4](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_020/sol4.py) + * Problem 021 + * [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_021/sol1.py) + * Problem 022 + * [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_022/sol1.py) + * [Sol2](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_022/sol2.py) + * Problem 023 + * [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_023/sol1.py) + * Problem 024 + * [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_024/sol1.py) + * Problem 025 + * [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_025/sol1.py) + * [Sol2](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_025/sol2.py) + * [Sol3](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_025/sol3.py) + * Problem 026 + * [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_026/sol1.py) + * Problem 027 + * [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_027/sol1.py) + * Problem 028 + * [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_028/sol1.py) + * Problem 029 + * [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_029/sol1.py) + * Problem 030 + * [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_030/sol1.py) + * Problem 031 + * [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_031/sol1.py) + * [Sol2](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_031/sol2.py) + * Problem 032 + * [Sol32](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_032/sol32.py) + * Problem 033 + * [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_033/sol1.py) + * Problem 034 + * [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_034/sol1.py) + * Problem 035 + * [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_035/sol1.py) + * Problem 036 + * [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_036/sol1.py) + * Problem 037 + * [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_037/sol1.py) + * Problem 038 + * [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_038/sol1.py) + * Problem 039 + * [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_039/sol1.py) + * Problem 040 + * [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_040/sol1.py) + * Problem 041 + * [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_041/sol1.py) + * Problem 042 + * [Solution42](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_042/solution42.py) + * Problem 043 + * [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_043/sol1.py) + * Problem 044 + * [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_044/sol1.py) + * Problem 045 + * [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_045/sol1.py) + * Problem 046 + * [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_046/sol1.py) + * Problem 047 + * [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_047/sol1.py) + * Problem 048 + * [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_048/sol1.py) + * Problem 049 + * [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_049/sol1.py) + * Problem 050 + * [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_050/sol1.py) + * Problem 051 + * [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_051/sol1.py) + * Problem 052 + * [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_052/sol1.py) + * Problem 053 + * [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_053/sol1.py) + * Problem 054 + * [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_054/sol1.py) + * [Test Poker Hand](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_054/test_poker_hand.py) + * Problem 055 + * [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_055/sol1.py) + * Problem 056 + * [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_056/sol1.py) + * Problem 057 + * [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_057/sol1.py) + * Problem 058 + * [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_058/sol1.py) + * Problem 059 + * [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_059/sol1.py) + * Problem 062 + * [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_062/sol1.py) + * Problem 063 + * [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_063/sol1.py) + * Problem 064 + * [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_064/sol1.py) + * Problem 065 + * [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_065/sol1.py) + * Problem 067 + * [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_067/sol1.py) + * Problem 069 + * [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_069/sol1.py) + * Problem 070 + * [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_070/sol1.py) + * Problem 071 + * [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_071/sol1.py) + * Problem 072 + * [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_072/sol1.py) + * [Sol2](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_072/sol2.py) + * Problem 074 + * [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_074/sol1.py) + * [Sol2](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_074/sol2.py) + * Problem 075 + * [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_075/sol1.py) + * Problem 076 + * [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_076/sol1.py) + * Problem 077 + * [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_077/sol1.py) + * Problem 080 + * [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_080/sol1.py) + * Problem 081 + * [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_081/sol1.py) + * Problem 085 + * [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_085/sol1.py) + * Problem 086 + * [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_086/sol1.py) + * Problem 087 + * [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_087/sol1.py) + * Problem 089 + * [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_089/sol1.py) + * Problem 091 + * [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_091/sol1.py) + * Problem 097 + * [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_097/sol1.py) + * Problem 099 + * [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_099/sol1.py) + * Problem 101 + * [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_101/sol1.py) + * Problem 102 + * [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_102/sol1.py) + * Problem 107 + * [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_107/sol1.py) + * Problem 109 + * [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_109/sol1.py) + * Problem 112 + * [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_112/sol1.py) + * Problem 113 + * [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_113/sol1.py) + * Problem 119 + * [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_119/sol1.py) + * Problem 120 + * [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_120/sol1.py) + * Problem 121 + * [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_121/sol1.py) + * Problem 123 + * [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_123/sol1.py) + * Problem 125 + * [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_125/sol1.py) + * Problem 129 + * [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_129/sol1.py) + * Problem 135 + * [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_135/sol1.py) + * Problem 173 + * [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_173/sol1.py) + * Problem 174 + * [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_174/sol1.py) + * Problem 180 + * [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_180/sol1.py) + * Problem 188 + * [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_188/sol1.py) + * Problem 191 + * [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_191/sol1.py) + * Problem 203 + * [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_203/sol1.py) + * Problem 206 + * [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_206/sol1.py) + * Problem 207 + * [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_207/sol1.py) + * Problem 234 + * [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_234/sol1.py) + * Problem 301 + * [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_301/sol1.py) + * Problem 551 + * [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_551/sol1.py) + +## Quantum + * [Deutsch Jozsa](https://github.com/TheAlgorithms/Python/blob/master/quantum/deutsch_jozsa.py) + * [Half Adder](https://github.com/TheAlgorithms/Python/blob/master/quantum/half_adder.py) + * [Not Gate](https://github.com/TheAlgorithms/Python/blob/master/quantum/not_gate.py) + * [Quantum Entanglement](https://github.com/TheAlgorithms/Python/blob/master/quantum/quantum_entanglement.py) + * [Ripple Adder Classic](https://github.com/TheAlgorithms/Python/blob/master/quantum/ripple_adder_classic.py) + * [Single Qubit Measure](https://github.com/TheAlgorithms/Python/blob/master/quantum/single_qubit_measure.py) + +## Scheduling + * [First Come First Served](https://github.com/TheAlgorithms/Python/blob/master/scheduling/first_come_first_served.py) + * [Round Robin](https://github.com/TheAlgorithms/Python/blob/master/scheduling/round_robin.py) + * [Shortest Job First](https://github.com/TheAlgorithms/Python/blob/master/scheduling/shortest_job_first.py) + +## Searches + * [Binary Search](https://github.com/TheAlgorithms/Python/blob/master/searches/binary_search.py) + * [Binary Tree Traversal](https://github.com/TheAlgorithms/Python/blob/master/searches/binary_tree_traversal.py) + * [Double Linear Search](https://github.com/TheAlgorithms/Python/blob/master/searches/double_linear_search.py) + * [Double Linear Search Recursion](https://github.com/TheAlgorithms/Python/blob/master/searches/double_linear_search_recursion.py) + * [Fibonacci Search](https://github.com/TheAlgorithms/Python/blob/master/searches/fibonacci_search.py) + * [Hill Climbing](https://github.com/TheAlgorithms/Python/blob/master/searches/hill_climbing.py) + * [Interpolation Search](https://github.com/TheAlgorithms/Python/blob/master/searches/interpolation_search.py) + * [Jump Search](https://github.com/TheAlgorithms/Python/blob/master/searches/jump_search.py) + * [Linear Search](https://github.com/TheAlgorithms/Python/blob/master/searches/linear_search.py) + * [Quick Select](https://github.com/TheAlgorithms/Python/blob/master/searches/quick_select.py) + * [Sentinel Linear Search](https://github.com/TheAlgorithms/Python/blob/master/searches/sentinel_linear_search.py) + * [Simple Binary Search](https://github.com/TheAlgorithms/Python/blob/master/searches/simple_binary_search.py) + * [Simulated Annealing](https://github.com/TheAlgorithms/Python/blob/master/searches/simulated_annealing.py) + * [Tabu Search](https://github.com/TheAlgorithms/Python/blob/master/searches/tabu_search.py) + * [Ternary Search](https://github.com/TheAlgorithms/Python/blob/master/searches/ternary_search.py) + +## Sorts + * [Bead Sort](https://github.com/TheAlgorithms/Python/blob/master/sorts/bead_sort.py) + * [Bitonic Sort](https://github.com/TheAlgorithms/Python/blob/master/sorts/bitonic_sort.py) + * [Bogo Sort](https://github.com/TheAlgorithms/Python/blob/master/sorts/bogo_sort.py) + * [Bubble Sort](https://github.com/TheAlgorithms/Python/blob/master/sorts/bubble_sort.py) + * [Bucket Sort](https://github.com/TheAlgorithms/Python/blob/master/sorts/bucket_sort.py) + * [Cocktail Shaker Sort](https://github.com/TheAlgorithms/Python/blob/master/sorts/cocktail_shaker_sort.py) + * [Comb Sort](https://github.com/TheAlgorithms/Python/blob/master/sorts/comb_sort.py) + * [Counting Sort](https://github.com/TheAlgorithms/Python/blob/master/sorts/counting_sort.py) + * [Cycle Sort](https://github.com/TheAlgorithms/Python/blob/master/sorts/cycle_sort.py) + * [Double Sort](https://github.com/TheAlgorithms/Python/blob/master/sorts/double_sort.py) + * [External Sort](https://github.com/TheAlgorithms/Python/blob/master/sorts/external_sort.py) + * [Gnome Sort](https://github.com/TheAlgorithms/Python/blob/master/sorts/gnome_sort.py) + * [Heap Sort](https://github.com/TheAlgorithms/Python/blob/master/sorts/heap_sort.py) + * [Insertion Sort](https://github.com/TheAlgorithms/Python/blob/master/sorts/insertion_sort.py) + * [Intro Sort](https://github.com/TheAlgorithms/Python/blob/master/sorts/intro_sort.py) + * [Iterative Merge Sort](https://github.com/TheAlgorithms/Python/blob/master/sorts/iterative_merge_sort.py) + * [Merge Insertion Sort](https://github.com/TheAlgorithms/Python/blob/master/sorts/merge_insertion_sort.py) + * [Merge Sort](https://github.com/TheAlgorithms/Python/blob/master/sorts/merge_sort.py) + * [Msd Radix Sort](https://github.com/TheAlgorithms/Python/blob/master/sorts/msd_radix_sort.py) + * [Natural Sort](https://github.com/TheAlgorithms/Python/blob/master/sorts/natural_sort.py) + * [Odd Even Sort](https://github.com/TheAlgorithms/Python/blob/master/sorts/odd_even_sort.py) + * [Odd Even Transposition Parallel](https://github.com/TheAlgorithms/Python/blob/master/sorts/odd_even_transposition_parallel.py) + * [Odd Even Transposition Single Threaded](https://github.com/TheAlgorithms/Python/blob/master/sorts/odd_even_transposition_single_threaded.py) + * [Pancake Sort](https://github.com/TheAlgorithms/Python/blob/master/sorts/pancake_sort.py) + * [Patience Sort](https://github.com/TheAlgorithms/Python/blob/master/sorts/patience_sort.py) + * [Pigeon Sort](https://github.com/TheAlgorithms/Python/blob/master/sorts/pigeon_sort.py) + * [Pigeonhole Sort](https://github.com/TheAlgorithms/Python/blob/master/sorts/pigeonhole_sort.py) + * [Quick Sort](https://github.com/TheAlgorithms/Python/blob/master/sorts/quick_sort.py) + * [Quick Sort 3 Partition](https://github.com/TheAlgorithms/Python/blob/master/sorts/quick_sort_3_partition.py) + * [Radix Sort](https://github.com/TheAlgorithms/Python/blob/master/sorts/radix_sort.py) + * [Random Normal Distribution Quicksort](https://github.com/TheAlgorithms/Python/blob/master/sorts/random_normal_distribution_quicksort.py) + * [Random Pivot Quick Sort](https://github.com/TheAlgorithms/Python/blob/master/sorts/random_pivot_quick_sort.py) + * [Recursive Bubble Sort](https://github.com/TheAlgorithms/Python/blob/master/sorts/recursive_bubble_sort.py) + * [Recursive Insertion Sort](https://github.com/TheAlgorithms/Python/blob/master/sorts/recursive_insertion_sort.py) + * [Recursive Quick Sort](https://github.com/TheAlgorithms/Python/blob/master/sorts/recursive_quick_sort.py) + * [Selection Sort](https://github.com/TheAlgorithms/Python/blob/master/sorts/selection_sort.py) + * [Shell Sort](https://github.com/TheAlgorithms/Python/blob/master/sorts/shell_sort.py) + * [Slowsort](https://github.com/TheAlgorithms/Python/blob/master/sorts/slowsort.py) + * [Stooge Sort](https://github.com/TheAlgorithms/Python/blob/master/sorts/stooge_sort.py) + * [Strand Sort](https://github.com/TheAlgorithms/Python/blob/master/sorts/strand_sort.py) + * [Tim Sort](https://github.com/TheAlgorithms/Python/blob/master/sorts/tim_sort.py) + * [Topological Sort](https://github.com/TheAlgorithms/Python/blob/master/sorts/topological_sort.py) + * [Tree Sort](https://github.com/TheAlgorithms/Python/blob/master/sorts/tree_sort.py) + * [Unknown Sort](https://github.com/TheAlgorithms/Python/blob/master/sorts/unknown_sort.py) + * [Wiggle Sort](https://github.com/TheAlgorithms/Python/blob/master/sorts/wiggle_sort.py) + +## Strings + * [Aho Corasick](https://github.com/TheAlgorithms/Python/blob/master/strings/aho_corasick.py) + * [Anagrams](https://github.com/TheAlgorithms/Python/blob/master/strings/anagrams.py) + * [Autocomplete Using Trie](https://github.com/TheAlgorithms/Python/blob/master/strings/autocomplete_using_trie.py) + * [Boyer Moore Search](https://github.com/TheAlgorithms/Python/blob/master/strings/boyer_moore_search.py) + * [Can String Be Rearranged As Palindrome](https://github.com/TheAlgorithms/Python/blob/master/strings/can_string_be_rearranged_as_palindrome.py) + * [Capitalize](https://github.com/TheAlgorithms/Python/blob/master/strings/capitalize.py) + * [Check Anagrams](https://github.com/TheAlgorithms/Python/blob/master/strings/check_anagrams.py) + * [Check Pangram](https://github.com/TheAlgorithms/Python/blob/master/strings/check_pangram.py) + * [Detecting English Programmatically](https://github.com/TheAlgorithms/Python/blob/master/strings/detecting_english_programmatically.py) + * [Frequency Finder](https://github.com/TheAlgorithms/Python/blob/master/strings/frequency_finder.py) + * [Is Palindrome](https://github.com/TheAlgorithms/Python/blob/master/strings/is_palindrome.py) + * [Jaro Winkler](https://github.com/TheAlgorithms/Python/blob/master/strings/jaro_winkler.py) + * [Knuth Morris Pratt](https://github.com/TheAlgorithms/Python/blob/master/strings/knuth_morris_pratt.py) + * [Levenshtein Distance](https://github.com/TheAlgorithms/Python/blob/master/strings/levenshtein_distance.py) + * [Lower](https://github.com/TheAlgorithms/Python/blob/master/strings/lower.py) + * [Manacher](https://github.com/TheAlgorithms/Python/blob/master/strings/manacher.py) + * [Min Cost String Conversion](https://github.com/TheAlgorithms/Python/blob/master/strings/min_cost_string_conversion.py) + * [Naive String Search](https://github.com/TheAlgorithms/Python/blob/master/strings/naive_string_search.py) + * [Palindrome](https://github.com/TheAlgorithms/Python/blob/master/strings/palindrome.py) + * [Prefix Function](https://github.com/TheAlgorithms/Python/blob/master/strings/prefix_function.py) + * [Rabin Karp](https://github.com/TheAlgorithms/Python/blob/master/strings/rabin_karp.py) + * [Remove Duplicate](https://github.com/TheAlgorithms/Python/blob/master/strings/remove_duplicate.py) + * [Reverse Letters](https://github.com/TheAlgorithms/Python/blob/master/strings/reverse_letters.py) + * [Reverse Words](https://github.com/TheAlgorithms/Python/blob/master/strings/reverse_words.py) + * [Split](https://github.com/TheAlgorithms/Python/blob/master/strings/split.py) + * [Swap Case](https://github.com/TheAlgorithms/Python/blob/master/strings/swap_case.py) + * [Upper](https://github.com/TheAlgorithms/Python/blob/master/strings/upper.py) + * [Word Occurrence](https://github.com/TheAlgorithms/Python/blob/master/strings/word_occurrence.py) + * [Word Patterns](https://github.com/TheAlgorithms/Python/blob/master/strings/word_patterns.py) + * [Z Function](https://github.com/TheAlgorithms/Python/blob/master/strings/z_function.py) + +## Web Programming + * [Co2 Emission](https://github.com/TheAlgorithms/Python/blob/master/web_programming/co2_emission.py) + * [Covid Stats Via Xpath](https://github.com/TheAlgorithms/Python/blob/master/web_programming/covid_stats_via_xpath.py) + * [Crawl Google Results](https://github.com/TheAlgorithms/Python/blob/master/web_programming/crawl_google_results.py) + * [Crawl Google Scholar Citation](https://github.com/TheAlgorithms/Python/blob/master/web_programming/crawl_google_scholar_citation.py) + * [Currency Converter](https://github.com/TheAlgorithms/Python/blob/master/web_programming/currency_converter.py) + * [Current Stock Price](https://github.com/TheAlgorithms/Python/blob/master/web_programming/current_stock_price.py) + * [Current Weather](https://github.com/TheAlgorithms/Python/blob/master/web_programming/current_weather.py) + * [Daily Horoscope](https://github.com/TheAlgorithms/Python/blob/master/web_programming/daily_horoscope.py) + * [Emails From Url](https://github.com/TheAlgorithms/Python/blob/master/web_programming/emails_from_url.py) + * [Fetch Bbc News](https://github.com/TheAlgorithms/Python/blob/master/web_programming/fetch_bbc_news.py) + * [Fetch Github Info](https://github.com/TheAlgorithms/Python/blob/master/web_programming/fetch_github_info.py) + * [Fetch Jobs](https://github.com/TheAlgorithms/Python/blob/master/web_programming/fetch_jobs.py) + * [Get Imdb Top 250 Movies Csv](https://github.com/TheAlgorithms/Python/blob/master/web_programming/get_imdb_top_250_movies_csv.py) + * [Get Imdbtop](https://github.com/TheAlgorithms/Python/blob/master/web_programming/get_imdbtop.py) + * [Instagram Crawler](https://github.com/TheAlgorithms/Python/blob/master/web_programming/instagram_crawler.py) + * [Instagram Pic](https://github.com/TheAlgorithms/Python/blob/master/web_programming/instagram_pic.py) + * [Instagram Video](https://github.com/TheAlgorithms/Python/blob/master/web_programming/instagram_video.py) + * [Recaptcha Verification](https://github.com/TheAlgorithms/Python/blob/master/web_programming/recaptcha_verification.py) + * [Slack Message](https://github.com/TheAlgorithms/Python/blob/master/web_programming/slack_message.py) + * [Test Fetch Github Info](https://github.com/TheAlgorithms/Python/blob/master/web_programming/test_fetch_github_info.py) + * [World Covid19 Stats](https://github.com/TheAlgorithms/Python/blob/master/web_programming/world_covid19_stats.py) diff --git a/python-mega-algo/arithmetic_analysis/__init__.py b/python-mega-algo/arithmetic_analysis/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/arithmetic_analysis/bisection.py b/python-mega-algo/arithmetic_analysis/bisection.py new file mode 100644 index 00000000..0ef69167 --- /dev/null +++ b/python-mega-algo/arithmetic_analysis/bisection.py @@ -0,0 +1,55 @@ +from typing import Callable + + +def bisection(function: Callable[[float], float], a: float, b: float) -> float: + """ + finds where function becomes 0 in [a,b] using bolzano + >>> bisection(lambda x: x ** 3 - 1, -5, 5) + 1.0000000149011612 + >>> bisection(lambda x: x ** 3 - 1, 2, 1000) + Traceback (most recent call last): + ... + ValueError: could not find root in given interval. + >>> bisection(lambda x: x ** 2 - 4 * x + 3, 0, 2) + 1.0 + >>> bisection(lambda x: x ** 2 - 4 * x + 3, 2, 4) + 3.0 + >>> bisection(lambda x: x ** 2 - 4 * x + 3, 4, 1000) + Traceback (most recent call last): + ... + ValueError: could not find root in given interval. + """ + start: float = a + end: float = b + if function(a) == 0: # one of the a or b is a root for the function + return a + elif function(b) == 0: + return b + elif ( + function(a) * function(b) > 0 + ): # if none of these are root and they are both positive or negative, + # then this algorithm can't find the root + raise ValueError("could not find root in given interval.") + else: + mid: float = start + (end - start) / 2.0 + while abs(start - mid) > 10 ** -7: # until precisely equals to 10^-7 + if function(mid) == 0: + return mid + elif function(mid) * function(start) < 0: + end = mid + else: + start = mid + mid = start + (end - start) / 2.0 + return mid + + +def f(x: float) -> float: + return x ** 3 - 2 * x - 5 + + +if __name__ == "__main__": + print(bisection(f, 1, 1000)) + + import doctest + + doctest.testmod() diff --git a/python-mega-algo/arithmetic_analysis/gaussian_elimination.py b/python-mega-algo/arithmetic_analysis/gaussian_elimination.py new file mode 100644 index 00000000..2dada4fb --- /dev/null +++ b/python-mega-algo/arithmetic_analysis/gaussian_elimination.py @@ -0,0 +1,83 @@ +""" +Gaussian elimination method for solving a system of linear equations. +Gaussian elimination - https://en.wikipedia.org/wiki/Gaussian_elimination +""" + + +import numpy as np + + +def retroactive_resolution(coefficients: np.matrix, vector: np.ndarray) -> np.ndarray: + """ + This function performs a retroactive linear system resolution + for triangular matrix + + Examples: + 2x1 + 2x2 - 1x3 = 5 2x1 + 2x2 = -1 + 0x1 - 2x2 - 1x3 = -7 0x1 - 2x2 = -1 + 0x1 + 0x2 + 5x3 = 15 + >>> gaussian_elimination([[2, 2, -1], [0, -2, -1], [0, 0, 5]], [[5], [-7], [15]]) + array([[2.], + [2.], + [3.]]) + >>> gaussian_elimination([[2, 2], [0, -2]], [[-1], [-1]]) + array([[-1. ], + [ 0.5]]) + """ + + rows, columns = np.shape(coefficients) + + x = np.zeros((rows, 1), dtype=float) + for row in reversed(range(rows)): + sum = 0 + for col in range(row + 1, columns): + sum += coefficients[row, col] * x[col] + + x[row, 0] = (vector[row] - sum) / coefficients[row, row] + + return x + + +def gaussian_elimination(coefficients: np.matrix, vector: np.ndarray) -> np.ndarray: + """ + This function performs Gaussian elimination method + + Examples: + 1x1 - 4x2 - 2x3 = -2 1x1 + 2x2 = 5 + 5x1 + 2x2 - 2x3 = -3 5x1 + 2x2 = 5 + 1x1 - 1x2 + 0x3 = 4 + >>> gaussian_elimination([[1, -4, -2], [5, 2, -2], [1, -1, 0]], [[-2], [-3], [4]]) + array([[ 2.3 ], + [-1.7 ], + [ 5.55]]) + >>> gaussian_elimination([[1, 2], [5, 2]], [[5], [5]]) + array([[0. ], + [2.5]]) + """ + # coefficients must to be a square matrix so we need to check first + rows, columns = np.shape(coefficients) + if rows != columns: + return np.array((), dtype=float) + + # augmented matrix + augmented_mat = np.concatenate((coefficients, vector), axis=1) + augmented_mat = augmented_mat.astype("float64") + + # scale the matrix leaving it triangular + for row in range(rows - 1): + pivot = augmented_mat[row, row] + for col in range(row + 1, columns): + factor = augmented_mat[col, row] / pivot + augmented_mat[col, :] -= factor * augmented_mat[row, :] + + x = retroactive_resolution( + augmented_mat[:, 0:columns], augmented_mat[:, columns : columns + 1] + ) + + return x + + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/arithmetic_analysis/image_data/2D_problems.jpg b/python-mega-algo/arithmetic_analysis/image_data/2D_problems.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8887cf6416856496c3bb725e0e8ca3b517370cc0 GIT binary patch literal 58752 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 literal 0 HcmV?d00001 diff --git a/python-mega-algo/arithmetic_analysis/image_data/2D_problems_1.jpg b/python-mega-algo/arithmetic_analysis/image_data/2D_problems_1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..aa9f4536201498e50d1d3d50f88143f700ed32b9 GIT binary patch literal 41392 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 Dx^_5` literal 0 HcmV?d00001 diff --git a/python-mega-algo/arithmetic_analysis/image_data/__init__.py b/python-mega-algo/arithmetic_analysis/image_data/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/arithmetic_analysis/image_data/right.html b/python-mega-algo/arithmetic_analysis/image_data/right.html new file mode 100644 index 00000000..565e3bba --- /dev/null +++ b/python-mega-algo/arithmetic_analysis/image_data/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/arithmetic_analysis/image_data + + + + + + + + +
Folders
<Go Back>
+
+ + + + +
FileFileFileFile
2D_problems.jpg 2D_problems_1.jpg __init__.py 
+ +

+Folders: 1
+Files: 3
+Size of all files: 100144 KB

+ + + \ No newline at end of file diff --git a/python-mega-algo/arithmetic_analysis/in_static_equilibrium.py b/python-mega-algo/arithmetic_analysis/in_static_equilibrium.py new file mode 100644 index 00000000..dbab4645 --- /dev/null +++ b/python-mega-algo/arithmetic_analysis/in_static_equilibrium.py @@ -0,0 +1,82 @@ +""" +Checks if a system of forces is in static equilibrium. +""" +from typing import List + +from numpy import array, cos, cross, ndarray, radians, sin + + +def polar_force( + magnitude: float, angle: float, radian_mode: bool = False +) -> List[float]: + """ + Resolves force along rectangular components. + (force, angle) => (force_x, force_y) + >>> polar_force(10, 45) + [7.0710678118654755, 7.071067811865475] + >>> polar_force(10, 3.14, radian_mode=True) + [-9.999987317275394, 0.01592652916486828] + """ + if radian_mode: + return [magnitude * cos(angle), magnitude * sin(angle)] + return [magnitude * cos(radians(angle)), magnitude * sin(radians(angle))] + + +def in_static_equilibrium( + forces: ndarray, location: ndarray, eps: float = 10 ** -1 +) -> bool: + """ + Check if a system is in equilibrium. + It takes two numpy.array objects. + forces ==> [ + [force1_x, force1_y], + [force2_x, force2_y], + ....] + location ==> [ + [x1, y1], + [x2, y2], + ....] + >>> force = array([[1, 1], [-1, 2]]) + >>> location = array([[1, 0], [10, 0]]) + >>> in_static_equilibrium(force, location) + False + """ + # summation of moments is zero + moments: ndarray = cross(location, forces) + sum_moments: float = sum(moments) + return abs(sum_moments) < eps + + +if __name__ == "__main__": + # Test to check if it works + forces = array( + [polar_force(718.4, 180 - 30), polar_force(879.54, 45), polar_force(100, -90)] + ) + + location = array([[0, 0], [0, 0], [0, 0]]) + + assert in_static_equilibrium(forces, location) + + # Problem 1 in image_data/2D_problems.jpg + forces = array( + [ + polar_force(30 * 9.81, 15), + polar_force(215, 180 - 45), + polar_force(264, 90 - 30), + ] + ) + + location = array([[0, 0], [0, 0], [0, 0]]) + + assert in_static_equilibrium(forces, location) + + # Problem in image_data/2D_problems_1.jpg + forces = array([[0, -2000], [0, -1200], [0, 15600], [0, -12400]]) + + location = array([[0, 0], [6, 0], [10, 0], [12, 0]]) + + assert in_static_equilibrium(forces, location) + + import doctest + + doctest.testmod() diff --git a/python-mega-algo/arithmetic_analysis/intersection.py b/python-mega-algo/arithmetic_analysis/intersection.py new file mode 100644 index 00000000..204dd5d8 --- /dev/null +++ b/python-mega-algo/arithmetic_analysis/intersection.py @@ -0,0 +1,49 @@ +import math +from typing import Callable + + +def intersection(function: Callable[[float], float], x0: float, x1: float) -> float: + """ + function is the f we want to find its root + x0 and x1 are two random starting points + >>> intersection(lambda x: x ** 3 - 1, -5, 5) + 0.9999999999954654 + >>> intersection(lambda x: x ** 3 - 1, 5, 5) + Traceback (most recent call last): + ... + ZeroDivisionError: float division by zero, could not find root + >>> intersection(lambda x: x ** 3 - 1, 100, 200) + 1.0000000000003888 + >>> intersection(lambda x: x ** 2 - 4 * x + 3, 0, 2) + 0.9999999998088019 + >>> intersection(lambda x: x ** 2 - 4 * x + 3, 2, 4) + 2.9999999998088023 + >>> intersection(lambda x: x ** 2 - 4 * x + 3, 4, 1000) + 3.0000000001786042 + >>> intersection(math.sin, -math.pi, math.pi) + 0.0 + >>> intersection(math.cos, -math.pi, math.pi) + Traceback (most recent call last): + ... + ZeroDivisionError: float division by zero, could not find root + """ + x_n: float = x0 + x_n1: float = x1 + while True: + if x_n == x_n1 or function(x_n1) == function(x_n): + raise ZeroDivisionError("float division by zero, could not find root") + x_n2: float = x_n1 - ( + function(x_n1) / ((function(x_n1) - function(x_n)) / (x_n1 - x_n)) + ) + if abs(x_n2 - x_n1) < 10 ** -5: + return x_n2 + x_n = x_n1 + x_n1 = x_n2 + + +def f(x: float) -> float: + return math.pow(x, 3) - (2 * x) - 5 + + +if __name__ == "__main__": + print(intersection(f, 3, 3.5)) diff --git a/python-mega-algo/arithmetic_analysis/lu_decomposition.py b/python-mega-algo/arithmetic_analysis/lu_decomposition.py new file mode 100644 index 00000000..ef37d1b7 --- /dev/null +++ b/python-mega-algo/arithmetic_analysis/lu_decomposition.py @@ -0,0 +1,64 @@ +"""Lower-Upper (LU) Decomposition. + +Reference: +- https://en.wikipedia.org/wiki/LU_decomposition +""" +from typing import Tuple + +import numpy as np +from numpy import ndarray + + +def lower_upper_decomposition(table: ndarray) -> Tuple[ndarray, ndarray]: + """Lower-Upper (LU) Decomposition + + Example: + + >>> matrix = np.array([[2, -2, 1], [0, 1, 2], [5, 3, 1]]) + >>> outcome = lower_upper_decomposition(matrix) + >>> outcome[0] + array([[1. , 0. , 0. ], + [0. , 1. , 0. ], + [2.5, 8. , 1. ]]) + >>> outcome[1] + array([[ 2. , -2. , 1. ], + [ 0. , 1. , 2. ], + [ 0. , 0. , -17.5]]) + + >>> matrix = np.array([[2, -2, 1], [0, 1, 2]]) + >>> lower_upper_decomposition(matrix) + Traceback (most recent call last): + ... + ValueError: 'table' has to be of square shaped array but got a 2x3 array: + [[ 2 -2 1] + [ 0 1 2]] + """ + # Table that contains our data + # Table has to be a square array so we need to check first + rows, columns = np.shape(table) + if rows != columns: + raise ValueError( + f"'table' has to be of square shaped array but got a {rows}x{columns} " + + f"array:\n{table}" + ) + lower = np.zeros((rows, columns)) + upper = np.zeros((rows, columns)) + for i in range(columns): + for j in range(i): + total = 0 + for k in range(j): + total += lower[i][k] * upper[k][j] + lower[i][j] = (table[i][j] - total) / upper[j][j] + lower[i][i] = 1 + for j in range(i, columns): + total = 0 + for k in range(i): + total += lower[i][k] * upper[k][j] + upper[i][j] = table[i][j] - total + return lower, upper + + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/arithmetic_analysis/newton_forward_interpolation.py b/python-mega-algo/arithmetic_analysis/newton_forward_interpolation.py new file mode 100644 index 00000000..66cde4b7 --- /dev/null +++ b/python-mega-algo/arithmetic_analysis/newton_forward_interpolation.py @@ -0,0 +1,57 @@ +# https://www.geeksforgeeks.org/newton-forward-backward-interpolation/ + +import math +from typing import List + + +# for calculating u value +def ucal(u: float, p: int) -> float: + """ + >>> ucal(1, 2) + 0 + >>> ucal(1.1, 2) + 0.11000000000000011 + >>> ucal(1.2, 2) + 0.23999999999999994 + """ + temp = u + for i in range(1, p): + temp = temp * (u - i) + return temp + + +def main() -> None: + n = int(input("enter the numbers of values: ")) + y: List[List[float]] = [] + for i in range(n): + y.append([]) + for i in range(n): + for j in range(n): + y[i].append(j) + y[i][j] = 0 + + print("enter the values of parameters in a list: ") + x = list(map(int, input().split())) + + print("enter the values of corresponding parameters: ") + for i in range(n): + y[i][0] = float(input()) + + value = int(input("enter the value to interpolate: ")) + u = (value - x[0]) / (x[1] - x[0]) + + # for calculating forward difference table + + for i in range(1, n): + for j in range(n - i): + y[j][i] = y[j + 1][i - 1] - y[j][i - 1] + + summ = y[0][0] + for i in range(1, n): + summ += (ucal(u, i) * y[0][i]) / math.factorial(i) + + print(f"the value at {value} is {summ}") + + +if __name__ == "__main__": + main() diff --git a/python-mega-algo/arithmetic_analysis/newton_method.py b/python-mega-algo/arithmetic_analysis/newton_method.py new file mode 100644 index 00000000..a9a94372 --- /dev/null +++ b/python-mega-algo/arithmetic_analysis/newton_method.py @@ -0,0 +1,54 @@ +"""Newton's Method.""" + +# Newton's Method - https://en.wikipedia.org/wiki/Newton%27s_method +from typing import Callable + +RealFunc = Callable[[float], float] # type alias for a real -> real function + + +# function is the f(x) and derivative is the f'(x) +def newton( + function: RealFunc, + derivative: RealFunc, + starting_int: int, +) -> float: + """ + >>> newton(lambda x: x ** 3 - 2 * x - 5, lambda x: 3 * x ** 2 - 2, 3) + 2.0945514815423474 + >>> newton(lambda x: x ** 3 - 1, lambda x: 3 * x ** 2, -2) + 1.0 + >>> newton(lambda x: x ** 3 - 1, lambda x: 3 * x ** 2, -4) + 1.0000000000000102 + >>> import math + >>> newton(math.sin, math.cos, 1) + 0.0 + >>> newton(math.sin, math.cos, 2) + 3.141592653589793 + >>> newton(math.cos, lambda x: -math.sin(x), 2) + 1.5707963267948966 + >>> newton(math.cos, lambda x: -math.sin(x), 0) + Traceback (most recent call last): + ... + ZeroDivisionError: Could not find root + """ + prev_guess = float(starting_int) + while True: + try: + next_guess = prev_guess - function(prev_guess) / derivative(prev_guess) + except ZeroDivisionError: + raise ZeroDivisionError("Could not find root") from None + if abs(prev_guess - next_guess) < 10 ** -5: + return next_guess + prev_guess = next_guess + + +def f(x: float) -> float: + return (x ** 3) - (2 * x) - 5 + + +def f1(x: float) -> float: + return 3 * (x ** 2) - 2 + + +if __name__ == "__main__": + print(newton(f, f1, 3)) diff --git a/python-mega-algo/arithmetic_analysis/newton_raphson.py b/python-mega-algo/arithmetic_analysis/newton_raphson.py new file mode 100644 index 00000000..146bb0aa --- /dev/null +++ b/python-mega-algo/arithmetic_analysis/newton_raphson.py @@ -0,0 +1,43 @@ +# Implementing Newton Raphson method in Python +# Author: Syed Haseeb Shah (github.com/QuantumNovice) +# The Newton-Raphson method (also known as Newton's method) is a way to +# quickly find a good approximation for the root of a real-valued function +from decimal import Decimal +from math import * # noqa: F401, F403 +from typing import Union + +from sympy import diff + + +def newton_raphson( + func: str, a: Union[float, Decimal], precision: float = 10 ** -10 +) -> float: + """Finds root from the point 'a' onwards by Newton-Raphson method + >>> newton_raphson("sin(x)", 2) + 3.1415926536808043 + >>> newton_raphson("x**2 - 5*x +2", 0.4) + 0.4384471871911695 + >>> newton_raphson("x**2 - 5", 0.1) + 2.23606797749979 + >>> newton_raphson("log(x)- 1", 2) + 2.718281828458938 + """ + x = a + while True: + x = Decimal(x) - (Decimal(eval(func)) / Decimal(eval(str(diff(func))))) + # This number dictates the accuracy of the answer + if abs(eval(func)) < precision: + return float(x) + + +# Let's Execute +if __name__ == "__main__": + # Find root of trigonometric function + # Find value of pi + print(f"The root of sin(x) = 0 is {newton_raphson('sin(x)', 2)}") + # Find root of polynomial + print(f"The root of x**2 - 5*x + 2 = 0 is {newton_raphson('x**2 - 5*x + 2', 0.4)}") + # Find Square Root of 5 + print(f"The root of log(x) - 1 = 0 is {newton_raphson('log(x) - 1', 2)}") + # Exponential Roots + print(f"The root of exp(x) - 1 = 0 is {newton_raphson('exp(x) - 1', 0)}") diff --git a/python-mega-algo/arithmetic_analysis/right.html b/python-mega-algo/arithmetic_analysis/right.html new file mode 100644 index 00000000..1222f3bf --- /dev/null +++ b/python-mega-algo/arithmetic_analysis/right.html @@ -0,0 +1,31 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/arithmetic_analysis + + + + + + + + +
Folders
<Go Back> image_data
+
+ + + + + + +
FileFileFileFile
bisection.py in_static...ium.py newton_method.py secant_method.py 
gaussian_...ion.py lu_decomp...ion.py newton_raphson.py __init__.py 
intersection.py newton_fo...ion.py 
+ +

+Folders: 2
+Files: 10
+Size of all files: 14750 KB

+ + + \ No newline at end of file diff --git a/python-mega-algo/arithmetic_analysis/secant_method.py b/python-mega-algo/arithmetic_analysis/secant_method.py new file mode 100644 index 00000000..7eb1dd8f --- /dev/null +++ b/python-mega-algo/arithmetic_analysis/secant_method.py @@ -0,0 +1,29 @@ +""" +Implementing Secant method in Python +Author: dimgrichr +""" +from math import exp + + +def f(x: float) -> float: + """ + >>> f(5) + 39.98652410600183 + """ + return 8 * x - 2 * exp(-x) + + +def secant_method(lower_bound: float, upper_bound: float, repeats: int) -> float: + """ + >>> secant_method(1, 3, 2) + 0.2139409276214589 + """ + x0 = lower_bound + x1 = upper_bound + for i in range(0, repeats): + x0, x1 = x1, x1 - (f(x1) * (x1 - x0)) / (f(x1) - f(x0)) + return x1 + + +if __name__ == "__main__": + print(f"Example: {secant_method(1, 3, 2) = }") diff --git a/python-mega-algo/backtracking/__init__.py b/python-mega-algo/backtracking/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/backtracking/all_combinations.py b/python-mega-algo/backtracking/all_combinations.py new file mode 100644 index 00000000..76462837 --- /dev/null +++ b/python-mega-algo/backtracking/all_combinations.py @@ -0,0 +1,46 @@ +""" + In this problem, we want to determine all possible combinations of k + numbers out of 1 ... n. We use backtracking to solve this problem. + Time complexity: O(C(n,k)) which is O(n choose k) = O((n!/(k! * (n - k)!))) +""" +from typing import List + + +def generate_all_combinations(n: int, k: int) -> List[List[int]]: + """ + >>> generate_all_combinations(n=4, k=2) + [[1, 2], [1, 3], [1, 4], [2, 3], [2, 4], [3, 4]] + """ + + result: List[List[int]] = [] + create_all_state(1, n, k, [], result) + return result + + +def create_all_state( + increment: int, + total_number: int, + level: int, + current_list: List[int], + total_list: List[List[int]], +) -> None: + if level == 0: + total_list.append(current_list[:]) + return + + for i in range(increment, total_number - level + 2): + current_list.append(i) + create_all_state(i + 1, total_number, level - 1, current_list, total_list) + current_list.pop() + + +def print_all_state(total_list: List[List[int]]) -> None: + for i in total_list: + print(*i) + + +if __name__ == "__main__": + n = 4 + k = 2 + total_list = generate_all_combinations(n, k) + print_all_state(total_list) diff --git a/python-mega-algo/backtracking/all_permutations.py b/python-mega-algo/backtracking/all_permutations.py new file mode 100644 index 00000000..a0032c5c --- /dev/null +++ b/python-mega-algo/backtracking/all_permutations.py @@ -0,0 +1,51 @@ +""" + In this problem, we want to determine all possible permutations + of the given sequence. We use backtracking to solve this problem. + + Time complexity: O(n! * n), + where n denotes the length of the given sequence. +""" +from typing import List, Union + + +def generate_all_permutations(sequence: List[Union[int, str]]) -> None: + create_state_space_tree(sequence, [], 0, [0 for i in range(len(sequence))]) + + +def create_state_space_tree( + sequence: List[Union[int, str]], + current_sequence: List[Union[int, str]], + index: int, + index_used: List[int], +) -> None: + """ + Creates a state space tree to iterate through each branch using DFS. + We know that each state has exactly len(sequence) - index children. + It terminates when it reaches the end of the given sequence. + """ + + if index == len(sequence): + print(current_sequence) + return + + for i in range(len(sequence)): + if not index_used[i]: + current_sequence.append(sequence[i]) + index_used[i] = True + create_state_space_tree(sequence, current_sequence, index + 1, index_used) + current_sequence.pop() + index_used[i] = False + + +""" +remove the comment to take an input from the user + +print("Enter the elements") +sequence = list(map(int, input().split())) +""" + +sequence: List[Union[int, str]] = [3, 1, 2, 4] +generate_all_permutations(sequence) + +sequence_2: List[Union[int, str]] = ["A", "B", "C"] +generate_all_permutations(sequence_2) diff --git a/python-mega-algo/backtracking/all_subsequences.py b/python-mega-algo/backtracking/all_subsequences.py new file mode 100644 index 00000000..99db4ea4 --- /dev/null +++ b/python-mega-algo/backtracking/all_subsequences.py @@ -0,0 +1,40 @@ +""" +In this problem, we want to determine all possible subsequences +of the given sequence. We use backtracking to solve this problem. + +Time complexity: O(2^n), +where n denotes the length of the given sequence. +""" +from typing import Any, List + + +def generate_all_subsequences(sequence: List[Any]) -> None: + create_state_space_tree(sequence, [], 0) + + +def create_state_space_tree( + sequence: List[Any], current_subsequence: List[Any], index: int +) -> None: + """ + Creates a state space tree to iterate through each branch using DFS. + We know that each state has exactly two children. + It terminates when it reaches the end of the given sequence. + """ + + if index == len(sequence): + print(current_subsequence) + return + + create_state_space_tree(sequence, current_subsequence, index + 1) + current_subsequence.append(sequence[index]) + create_state_space_tree(sequence, current_subsequence, index + 1) + current_subsequence.pop() + + +if __name__ == "__main__": + seq: List[Any] = [3, 1, 2, 4] + generate_all_subsequences(seq) + + seq.clear() + seq.extend(["A", "B", "C"]) + generate_all_subsequences(seq) diff --git a/python-mega-algo/backtracking/coloring.py b/python-mega-algo/backtracking/coloring.py new file mode 100644 index 00000000..3956b21a --- /dev/null +++ b/python-mega-algo/backtracking/coloring.py @@ -0,0 +1,114 @@ +""" + Graph Coloring also called "m coloring problem" + consists of coloring given graph with at most m colors + such that no adjacent vertices are assigned same color + + Wikipedia: https://en.wikipedia.org/wiki/Graph_coloring +""" +from typing import List + + +def valid_coloring( + neighbours: List[int], colored_vertices: List[int], color: int +) -> bool: + """ + For each neighbour check if coloring constraint is satisfied + If any of the neighbours fail the constraint return False + If all neighbours validate constraint return True + + >>> neighbours = [0,1,0,1,0] + >>> colored_vertices = [0, 2, 1, 2, 0] + + >>> color = 1 + >>> valid_coloring(neighbours, colored_vertices, color) + True + + >>> color = 2 + >>> valid_coloring(neighbours, colored_vertices, color) + False + """ + # Does any neighbour not satisfy the constraints + return not any( + neighbour == 1 and colored_vertices[i] == color + for i, neighbour in enumerate(neighbours) + ) + + +def util_color( + graph: List[List[int]], max_colors: int, colored_vertices: List[int], index: int +) -> bool: + """ + Pseudo-Code + + Base Case: + 1. Check if coloring is complete + 1.1 If complete return True (meaning that we successfully colored graph) + + Recursive Step: + 2. Itterates over each color: + Check if current coloring is valid: + 2.1. Color given vertex + 2.2. Do recursive call check if this coloring leads to solving problem + 2.4. if current coloring leads to solution return + 2.5. Uncolor given vertex + + >>> graph = [[0, 1, 0, 0, 0], + ... [1, 0, 1, 0, 1], + ... [0, 1, 0, 1, 0], + ... [0, 1, 1, 0, 0], + ... [0, 1, 0, 0, 0]] + >>> max_colors = 3 + >>> colored_vertices = [0, 1, 0, 0, 0] + >>> index = 3 + + >>> util_color(graph, max_colors, colored_vertices, index) + True + + >>> max_colors = 2 + >>> util_color(graph, max_colors, colored_vertices, index) + False + """ + + # Base Case + if index == len(graph): + return True + + # Recursive Step + for i in range(max_colors): + if valid_coloring(graph[index], colored_vertices, i): + # Color current vertex + colored_vertices[index] = i + # Validate coloring + if util_color(graph, max_colors, colored_vertices, index + 1): + return True + # Backtrack + colored_vertices[index] = -1 + return False + + +def color(graph: List[List[int]], max_colors: int) -> List[int]: + """ + Wrapper function to call subroutine called util_color + which will either return True or False. + If True is returned colored_vertices list is filled with correct colorings + + >>> graph = [[0, 1, 0, 0, 0], + ... [1, 0, 1, 0, 1], + ... [0, 1, 0, 1, 0], + ... [0, 1, 1, 0, 0], + ... [0, 1, 0, 0, 0]] + + >>> max_colors = 3 + >>> color(graph, max_colors) + [0, 1, 0, 2, 0] + + >>> max_colors = 2 + >>> color(graph, max_colors) + [] + """ + colored_vertices = [-1] * len(graph) + + if util_color(graph, max_colors, colored_vertices, 0): + return colored_vertices + + return [] diff --git a/python-mega-algo/backtracking/hamiltonian_cycle.py b/python-mega-algo/backtracking/hamiltonian_cycle.py new file mode 100644 index 00000000..7be1ea35 --- /dev/null +++ b/python-mega-algo/backtracking/hamiltonian_cycle.py @@ -0,0 +1,177 @@ +""" + A Hamiltonian cycle (Hamiltonian circuit) is a graph cycle + through a graph that visits each node exactly once. + Determining whether such paths and cycles exist in graphs + is the 'Hamiltonian path problem', which is NP-complete. + + Wikipedia: https://en.wikipedia.org/wiki/Hamiltonian_path +""" +from typing import List + + +def valid_connection( + graph: List[List[int]], next_ver: int, curr_ind: int, path: List[int] +) -> bool: + """ + Checks whether it is possible to add next into path by validating 2 statements + 1. There should be path between current and next vertex + 2. Next vertex should not be in path + If both validations succeeds we return True saying that it is possible to connect + this vertices either we return False + + Case 1:Use exact graph as in main function, with initialized values + >>> graph = [[0, 1, 0, 1, 0], + ... [1, 0, 1, 1, 1], + ... [0, 1, 0, 0, 1], + ... [1, 1, 0, 0, 1], + ... [0, 1, 1, 1, 0]] + >>> path = [0, -1, -1, -1, -1, 0] + >>> curr_ind = 1 + >>> next_ver = 1 + >>> valid_connection(graph, next_ver, curr_ind, path) + True + + Case 2: Same graph, but trying to connect to node that is already in path + >>> path = [0, 1, 2, 4, -1, 0] + >>> curr_ind = 4 + >>> next_ver = 1 + >>> valid_connection(graph, next_ver, curr_ind, path) + False + """ + + # 1. Validate that path exists between current and next vertices + if graph[path[curr_ind - 1]][next_ver] == 0: + return False + + # 2. Validate that next vertex is not already in path + return not any(vertex == next_ver for vertex in path) + + +def util_hamilton_cycle(graph: List[List[int]], path: List[int], curr_ind: int) -> bool: + """ + Pseudo-Code + Base Case: + 1. Check if we visited all of vertices + 1.1 If last visited vertex has path to starting vertex return True either + return False + Recursive Step: + 2. Iterate over each vertex + Check if next vertex is valid for transiting from current vertex + 2.1 Remember next vertex as next transition + 2.2 Do recursive call and check if going to this vertex solves problem + 2.3 If next vertex leads to solution return True + 2.4 Else backtrack, delete remembered vertex + + Case 1: Use exact graph as in main function, with initialized values + >>> graph = [[0, 1, 0, 1, 0], + ... [1, 0, 1, 1, 1], + ... [0, 1, 0, 0, 1], + ... [1, 1, 0, 0, 1], + ... [0, 1, 1, 1, 0]] + >>> path = [0, -1, -1, -1, -1, 0] + >>> curr_ind = 1 + >>> util_hamilton_cycle(graph, path, curr_ind) + True + >>> print(path) + [0, 1, 2, 4, 3, 0] + + Case 2: Use exact graph as in previous case, but in the properties taken from + middle of calculation + >>> graph = [[0, 1, 0, 1, 0], + ... [1, 0, 1, 1, 1], + ... [0, 1, 0, 0, 1], + ... [1, 1, 0, 0, 1], + ... [0, 1, 1, 1, 0]] + >>> path = [0, 1, 2, -1, -1, 0] + >>> curr_ind = 3 + >>> util_hamilton_cycle(graph, path, curr_ind) + True + >>> print(path) + [0, 1, 2, 4, 3, 0] + """ + + # Base Case + if curr_ind == len(graph): + # return whether path exists between current and starting vertices + return graph[path[curr_ind - 1]][path[0]] == 1 + + # Recursive Step + for next in range(0, len(graph)): + if valid_connection(graph, next, curr_ind, path): + # Insert current vertex into path as next transition + path[curr_ind] = next + # Validate created path + if util_hamilton_cycle(graph, path, curr_ind + 1): + return True + # Backtrack + path[curr_ind] = -1 + return False + + +def hamilton_cycle(graph: List[List[int]], start_index: int = 0) -> List[int]: + r""" + Wrapper function to call subroutine called util_hamilton_cycle, + which will either return array of vertices indicating hamiltonian cycle + or an empty list indicating that hamiltonian cycle was not found. + Case 1: + Following graph consists of 5 edges. + If we look closely, we can see that there are multiple Hamiltonian cycles. + For example one result is when we iterate like: + (0)->(1)->(2)->(4)->(3)->(0) + + (0)---(1)---(2) + | / \ | + | / \ | + | / \ | + |/ \| + (3)---------(4) + >>> graph = [[0, 1, 0, 1, 0], + ... [1, 0, 1, 1, 1], + ... [0, 1, 0, 0, 1], + ... [1, 1, 0, 0, 1], + ... [0, 1, 1, 1, 0]] + >>> hamilton_cycle(graph) + [0, 1, 2, 4, 3, 0] + + Case 2: + Same Graph as it was in Case 1, changed starting index from default to 3 + + (0)---(1)---(2) + | / \ | + | / \ | + | / \ | + |/ \| + (3)---------(4) + >>> graph = [[0, 1, 0, 1, 0], + ... [1, 0, 1, 1, 1], + ... [0, 1, 0, 0, 1], + ... [1, 1, 0, 0, 1], + ... [0, 1, 1, 1, 0]] + >>> hamilton_cycle(graph, 3) + [3, 0, 1, 2, 4, 3] + + Case 3: + Following Graph is exactly what it was before, but edge 3-4 is removed. + Result is that there is no Hamiltonian Cycle anymore. + + (0)---(1)---(2) + | / \ | + | / \ | + | / \ | + |/ \| + (3) (4) + >>> graph = [[0, 1, 0, 1, 0], + ... [1, 0, 1, 1, 1], + ... [0, 1, 0, 0, 1], + ... [1, 1, 0, 0, 0], + ... [0, 1, 1, 0, 0]] + >>> hamilton_cycle(graph,4) + [] + """ + + # Initialize path with -1, indicating that we have not visited them yet + path = [-1] * (len(graph) + 1) + # initialize start and end of path with starting index + path[0] = path[-1] = start_index + # evaluate and if we find answer return path either return empty array + return path if util_hamilton_cycle(graph, path, 1) else [] diff --git a/python-mega-algo/backtracking/knight_tour.py b/python-mega-algo/backtracking/knight_tour.py new file mode 100644 index 00000000..8e6613e0 --- /dev/null +++ b/python-mega-algo/backtracking/knight_tour.py @@ -0,0 +1,100 @@ +# Knight Tour Intro: https://www.youtube.com/watch?v=ab_dY3dZFHM + +from typing import List, Tuple + + +def get_valid_pos(position: Tuple[int, int], n: int) -> List[Tuple[int, int]]: + """ + Find all the valid positions a knight can move to from the current position. + + >>> get_valid_pos((1, 3), 4) + [(2, 1), (0, 1), (3, 2)] + """ + + y, x = position + positions = [ + (y + 1, x + 2), + (y - 1, x + 2), + (y + 1, x - 2), + (y - 1, x - 2), + (y + 2, x + 1), + (y + 2, x - 1), + (y - 2, x + 1), + (y - 2, x - 1), + ] + permissible_positions = [] + + for position in positions: + y_test, x_test = position + if 0 <= y_test < n and 0 <= x_test < n: + permissible_positions.append(position) + + return permissible_positions + + +def is_complete(board: List[List[int]]) -> bool: + """ + Check if the board (matrix) has been completely filled with non-zero values. + + >>> is_complete([[1]]) + True + + >>> is_complete([[1, 2], [3, 0]]) + False + """ + + return not any(elem == 0 for row in board for elem in row) + + +def open_knight_tour_helper( + board: List[List[int]], pos: Tuple[int, int], curr: int +) -> bool: + """ + Helper function to solve knight tour problem. + """ + + if is_complete(board): + return True + + for position in get_valid_pos(pos, len(board)): + y, x = position + + if board[y][x] == 0: + board[y][x] = curr + 1 + if open_knight_tour_helper(board, position, curr + 1): + return True + board[y][x] = 0 + + return False + + +def open_knight_tour(n: int) -> List[List[int]]: + """ + Find the solution for the knight tour problem for a board of size n. Raises + ValueError if the tour cannot be performed for the given size. + + >>> open_knight_tour(1) + [[1]] + + >>> open_knight_tour(2) + Traceback (most recent call last): + ... + ValueError: Open Kight Tour cannot be performed on a board of size 2 + """ + + board = [[0 for i in range(n)] for j in range(n)] + + for i in range(n): + for j in range(n): + board[i][j] = 1 + if open_knight_tour_helper(board, (i, j), 1): + return board + board[i][j] = 0 + + raise ValueError(f"Open Kight Tour cannot be performed on a board of size {n}") + + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/backtracking/minimax.py b/python-mega-algo/backtracking/minimax.py new file mode 100644 index 00000000..dda29b47 --- /dev/null +++ b/python-mega-algo/backtracking/minimax.py @@ -0,0 +1,69 @@ +""" +Minimax helps to achieve maximum score in a game by checking all possible moves +depth is current depth in game tree. + +nodeIndex is index of current node in scores[]. +if move is of maximizer return true else false +leaves of game tree is stored in scores[] +height is maximum height of Game tree +""" +import math +from typing import List + + +def minimax( + depth: int, node_index: int, is_max: bool, scores: List[int], height: float +) -> int: + """ + >>> import math + >>> scores = [90, 23, 6, 33, 21, 65, 123, 34423] + >>> height = math.log(len(scores), 2) + >>> minimax(0, 0, True, scores, height) + 65 + >>> minimax(-1, 0, True, scores, height) + Traceback (most recent call last): + ... + ValueError: Depth cannot be less than 0 + >>> minimax(0, 0, True, [], 2) + Traceback (most recent call last): + ... + ValueError: Scores cannot be empty + >>> scores = [3, 5, 2, 9, 12, 5, 23, 23] + >>> height = math.log(len(scores), 2) + >>> minimax(0, 0, True, scores, height) + 12 + """ + + if depth < 0: + raise ValueError("Depth cannot be less than 0") + + if len(scores) == 0: + raise ValueError("Scores cannot be empty") + + if depth == height: + return scores[node_index] + + if is_max: + return max( + minimax(depth + 1, node_index * 2, False, scores, height), + minimax(depth + 1, node_index * 2 + 1, False, scores, height), + ) + + return min( + minimax(depth + 1, node_index * 2, True, scores, height), + minimax(depth + 1, node_index * 2 + 1, True, scores, height), + ) + + +def main() -> None: + scores = [90, 23, 6, 33, 21, 65, 123, 34423] + height = math.log(len(scores), 2) + print("Optimal value : ", end="") + print(minimax(0, 0, True, scores, height)) + + +if __name__ == "__main__": + import doctest + + doctest.testmod() + main() diff --git a/python-mega-algo/backtracking/n_queens.py b/python-mega-algo/backtracking/n_queens.py new file mode 100644 index 00000000..29b8d819 --- /dev/null +++ b/python-mega-algo/backtracking/n_queens.py @@ -0,0 +1,90 @@ +""" + + The nqueens problem is of placing N queens on a N * N + chess board such that no queen can attack any other queens placed + on that chess board. + This means that one queen cannot have any other queen on its horizontal, vertical and + diagonal lines. + +""" +from typing import List + +solution = [] + + +def isSafe(board: List[List[int]], row: int, column: int) -> bool: + """ + This function returns a boolean value True if it is safe to place a queen there + considering the current state of the board. + + Parameters : + board(2D matrix) : board + row ,column : coordinates of the cell on a board + + Returns : + Boolean Value + + """ + for i in range(len(board)): + if board[row][i] == 1: + return False + for i in range(len(board)): + if board[i][column] == 1: + return False + for i, j in zip(range(row, -1, -1), range(column, -1, -1)): + if board[i][j] == 1: + return False + for i, j in zip(range(row, -1, -1), range(column, len(board))): + if board[i][j] == 1: + return False + return True + + +def solve(board: List[List[int]], row: int) -> bool: + """ + It creates a state space tree and calls the safe function until it receives a + False Boolean and terminates that branch and backtracks to the next + possible solution branch. + """ + if row >= len(board): + """ + If the row number exceeds N we have board with a successful combination + and that combination is appended to the solution list and the board is printed. + + """ + solution.append(board) + printboard(board) + print() + return True + for i in range(len(board)): + """ + For every row it iterates through each column to check if it is feasible to + place a queen there. + If all the combinations for that particular branch are successful the board is + reinitialized for the next possible combination. + """ + if isSafe(board, row, i): + board[row][i] = 1 + solve(board, row + 1) + board[row][i] = 0 + return False + + +def printboard(board: List[List[int]]) -> None: + """ + Prints the boards that have a successful combination. + """ + for i in range(len(board)): + for j in range(len(board)): + if board[i][j] == 1: + print("Q", end=" ") + else: + print(".", end=" ") + print() + + +# n=int(input("The no. of queens")) +n = 8 +board = [[0 for i in range(n)] for j in range(n)] +solve(board, 0) +print("The total no. of solutions are :", len(solution)) diff --git a/python-mega-algo/backtracking/n_queens_math.py b/python-mega-algo/backtracking/n_queens_math.py new file mode 100644 index 00000000..a8651c5c --- /dev/null +++ b/python-mega-algo/backtracking/n_queens_math.py @@ -0,0 +1,158 @@ +r""" +Problem: + +The n queens problem is of placing N queens on a N * N chess board such that no queen +can attack any other queens placed on that chess board. This means that one queen +cannot have any other queen on its horizontal, vertical and diagonal lines. + +Solution: + +To solve this problem we will use simple math. First we know the queen can move in all +the possible ways, we can simplify it in this: vertical, horizontal, diagonal left and + diagonal right. + +We can visualize it like this: + +left diagonal = \ +right diagonal = / + +On a chessboard vertical movement could be the rows and horizontal movement could be +the columns. + +In programming we can use an array, and in this array each index could be the rows and +each value in the array could be the column. For example: + + . Q . . We have this chessboard with one queen in each column and each queen + . . . Q can't attack to each other. + Q . . . The array for this example would look like this: [1, 3, 0, 2] + . . Q . + +So if we use an array and we verify that each value in the array is different to each +other we know that at least the queens can't attack each other in horizontal and +vertical. + +At this point we have that halfway completed and we will treat the chessboard as a +Cartesian plane. Hereinafter we are going to remember basic math, so in the school we +learned this formula: + + Slope of a line: + + y2 - y1 + m = ---------- + x2 - x1 + +This formula allow us to get the slope. For the angles 45º (right diagonal) and 135º +(left diagonal) this formula gives us m = 1, and m = -1 respectively. + +See:: +https://www.enotes.com/homework-help/write-equation-line-that-hits-origin-45-degree-1474860 + +Then we have this another formula: + +Slope intercept: + +y = mx + b + +b is where the line crosses the Y axis (to get more information see: +https://www.mathsisfun.com/y_intercept.html), if we change the formula to solve for b +we would have: + +y - mx = b + +And like we already have the m values for the angles 45º and 135º, this formula would +look like this: + +45º: y - (1)x = b +45º: y - x = b + +135º: y - (-1)x = b +135º: y + x = b + +y = row +x = column + +Applying this two formulas we can check if a queen in some position is being attacked +for another one or vice versa. + +""" +from typing import List + + +def depth_first_search( + possible_board: List[int], + diagonal_right_collisions: List[int], + diagonal_left_collisions: List[int], + boards: List[List[str]], + n: int, +) -> None: + """ + >>> boards = [] + >>> depth_first_search([], [], [], boards, 4) + >>> for board in boards: + ... print(board) + ['. Q . . ', '. . . Q ', 'Q . . . ', '. . Q . '] + ['. . Q . ', 'Q . . . ', '. . . Q ', '. Q . . '] + """ + + # Get next row in the current board (possible_board) to fill it with a queen + row = len(possible_board) + + # If row is equal to the size of the board it means there are a queen in each row in + # the current board (possible_board) + if row == n: + # We convert the variable possible_board that looks like this: [1, 3, 0, 2] to + # this: ['. Q . . ', '. . . Q ', 'Q . . . ', '. . Q . '] + boards.append([". " * i + "Q " + ". " * (n - 1 - i) for i in possible_board]) + return + + # We iterate each column in the row to find all possible results in each row + for col in range(n): + + # We apply that we learned previously. First we check that in the current board + # (possible_board) there are not other same value because if there is it means + # that there are a collision in vertical. Then we apply the two formulas we + # learned before: + # + # 45º: y - x = b or 45: row - col = b + # 135º: y + x = b or row + col = b. + # + # And we verify if the results of this two formulas not exist in their variables + # respectively. (diagonal_right_collisions, diagonal_left_collisions) + # + # If any or these are True it means there is a collision so we continue to the + # next value in the for loop. + if ( + col in possible_board + or row - col in diagonal_right_collisions + or row + col in diagonal_left_collisions + ): + continue + + # If it is False we call dfs function again and we update the inputs + depth_first_search( + possible_board + [col], + diagonal_right_collisions + [row - col], + diagonal_left_collisions + [row + col], + boards, + n, + ) + + +def n_queens_solution(n: int) -> None: + boards: List[List[str]] = [] + depth_first_search([], [], [], boards, n) + + # Print all the boards + for board in boards: + for column in board: + print(column) + print("") + + print(len(boards), "solutions were found.") + + +if __name__ == "__main__": + import doctest + + doctest.testmod() + n_queens_solution(4) diff --git a/python-mega-algo/backtracking/rat_in_maze.py b/python-mega-algo/backtracking/rat_in_maze.py new file mode 100644 index 00000000..cd2a8f41 --- /dev/null +++ b/python-mega-algo/backtracking/rat_in_maze.py @@ -0,0 +1,118 @@ +from typing import List + + +def solve_maze(maze: List[List[int]]) -> bool: + """ + This method solves the "rat in maze" problem. + In this problem we have some n by n matrix, a start point and an end point. + We want to go from the start to the end. In this matrix zeroes represent walls + and ones paths we can use. + Parameters : + maze(2D matrix) : maze + Returns: + Return: True if the maze has a solution or False if it does not. + >>> maze = [[0, 1, 0, 1, 1], + ... [0, 0, 0, 0, 0], + ... [1, 0, 1, 0, 1], + ... [0, 0, 1, 0, 0], + ... [1, 0, 0, 1, 0]] + >>> solve_maze(maze) + [1, 0, 0, 0, 0] + [1, 1, 1, 1, 0] + [0, 0, 0, 1, 0] + [0, 0, 0, 1, 1] + [0, 0, 0, 0, 1] + True + + >>> maze = [[0, 1, 0, 1, 1], + ... [0, 0, 0, 0, 0], + ... [0, 0, 0, 0, 1], + ... [0, 0, 0, 0, 0], + ... [0, 0, 0, 0, 0]] + >>> solve_maze(maze) + [1, 0, 0, 0, 0] + [1, 0, 0, 0, 0] + [1, 0, 0, 0, 0] + [1, 0, 0, 0, 0] + [1, 1, 1, 1, 1] + True + + >>> maze = [[0, 0, 0], + ... [0, 1, 0], + ... [1, 0, 0]] + >>> solve_maze(maze) + [1, 1, 1] + [0, 0, 1] + [0, 0, 1] + True + + >>> maze = [[0, 1, 0], + ... [0, 1, 0], + ... [1, 0, 0]] + >>> solve_maze(maze) + No solution exists! + False + + >>> maze = [[0, 1], + ... [1, 0]] + >>> solve_maze(maze) + No solution exists! + False + """ + size = len(maze) + # We need to create solution object to save path. + solutions = [[0 for _ in range(size)] for _ in range(size)] + solved = run_maze(maze, 0, 0, solutions) + if solved: + print("\n".join(str(row) for row in solutions)) + else: + print("No solution exists!") + return solved + + +def run_maze(maze: List[List[int]], i: int, j: int, solutions: List[List[int]]) -> bool: + """ + This method is recursive starting from (i, j) and going in one of four directions: + up, down, left, right. + If a path is found to destination it returns True otherwise it returns False. + Parameters: + maze(2D matrix) : maze + i, j : coordinates of matrix + solutions(2D matrix) : solutions + Returns: + Boolean if path is found True, Otherwise False. + """ + size = len(maze) + # Final check point. + if i == j == (size - 1): + solutions[i][j] = 1 + return True + + lower_flag = (not (i < 0)) and (not (j < 0)) # Check lower bounds + upper_flag = (i < size) and (j < size) # Check upper bounds + + if lower_flag and upper_flag: + # check for already visited and block points. + block_flag = (not (solutions[i][j])) and (not (maze[i][j])) + if block_flag: + # check visited + solutions[i][j] = 1 + + # check for directions + if ( + run_maze(maze, i + 1, j, solutions) + or run_maze(maze, i, j + 1, solutions) + or run_maze(maze, i - 1, j, solutions) + or run_maze(maze, i, j - 1, solutions) + ): + return True + + solutions[i][j] = 0 + return False + return False + + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/backtracking/right.html b/python-mega-algo/backtracking/right.html new file mode 100644 index 00000000..2978b52e --- /dev/null +++ b/python-mega-algo/backtracking/right.html @@ -0,0 +1,32 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/backtracking + + + + + + + + +
Folders
<Go Back>
+
+ + + + + + + +
FileFileFileFile
all_combi...ons.py hamiltoni...cle.py n_queens.py sudoku.py 
all_permu...ons.py knight_tour.py n_queens_math.py sum_of_subsets.py 
all_subse...ces.py minimax.py rat_in_maze.py __init__.py 
coloring.py 
+ +

+Folders: 1
+Files: 13
+Size of all files: 34432 KB

+ + + \ No newline at end of file diff --git a/python-mega-algo/backtracking/sudoku.py b/python-mega-algo/backtracking/sudoku.py new file mode 100644 index 00000000..3bfaddd6 --- /dev/null +++ b/python-mega-algo/backtracking/sudoku.py @@ -0,0 +1,158 @@ +""" +Given a partially filled 9×9 2D array, the objective is to fill a 9×9 +square grid with digits numbered 1 to 9, so that every row, column, and +and each of the nine 3×3 sub-grids contains all of the digits. + +This can be solved using Backtracking and is similar to n-queens. +We check to see if a cell is safe or not and recursively call the +function on the next column to see if it returns True. if yes, we +have solved the puzzle. else, we backtrack and place another number +in that cell and repeat this process. +""" +from typing import List, Optional, Tuple + +Matrix = List[List[int]] + +# assigning initial values to the grid +initial_grid: Matrix = [ + [3, 0, 6, 5, 0, 8, 4, 0, 0], + [5, 2, 0, 0, 0, 0, 0, 0, 0], + [0, 8, 7, 0, 0, 0, 0, 3, 1], + [0, 0, 3, 0, 1, 0, 0, 8, 0], + [9, 0, 0, 8, 6, 3, 0, 0, 5], + [0, 5, 0, 0, 9, 0, 6, 0, 0], + [1, 3, 0, 0, 0, 0, 2, 5, 0], + [0, 0, 0, 0, 0, 0, 0, 7, 4], + [0, 0, 5, 2, 0, 6, 3, 0, 0], +] + +# a grid with no solution +no_solution: Matrix = [ + [5, 0, 6, 5, 0, 8, 4, 0, 3], + [5, 2, 0, 0, 0, 0, 0, 0, 2], + [1, 8, 7, 0, 0, 0, 0, 3, 1], + [0, 0, 3, 0, 1, 0, 0, 8, 0], + [9, 0, 0, 8, 6, 3, 0, 0, 5], + [0, 5, 0, 0, 9, 0, 6, 0, 0], + [1, 3, 0, 0, 0, 0, 2, 5, 0], + [0, 0, 0, 0, 0, 0, 0, 7, 4], + [0, 0, 5, 2, 0, 6, 3, 0, 0], +] + + +def is_safe(grid: Matrix, row: int, column: int, n: int) -> bool: + """ + This function checks the grid to see if each row, + column, and the 3x3 subgrids contain the digit 'n'. + It returns False if it is not 'safe' (a duplicate digit + is found) else returns True if it is 'safe' + """ + for i in range(9): + if grid[row][i] == n or grid[i][column] == n: + return False + + for i in range(3): + for j in range(3): + if grid[(row - row % 3) + i][(column - column % 3) + j] == n: + return False + + return True + + +def is_completed(grid: Matrix) -> bool: + """ + This function checks if the puzzle is completed or not. + it is completed when all the cells are assigned with a non-zero number. + + >>> is_completed([[0]]) + False + >>> is_completed([[1]]) + True + >>> is_completed([[1, 2], [0, 4]]) + False + >>> is_completed([[1, 2], [3, 4]]) + True + >>> is_completed(initial_grid) + False + >>> is_completed(no_solution) + False + """ + return all(all(cell != 0 for cell in row) for row in grid) + + +def find_empty_location(grid: Matrix) -> Optional[Tuple[int, int]]: + """ + This function finds an empty location so that we can assign a number + for that particular row and column. + """ + for i in range(9): + for j in range(9): + if grid[i][j] == 0: + return i, j + return None + + +def sudoku(grid: Matrix) -> Optional[Matrix]: + """ + Takes a partially filled-in grid and attempts to assign values to + all unassigned locations in such a way to meet the requirements + for Sudoku solution (non-duplication across rows, columns, and boxes) + + >>> sudoku(initial_grid) # doctest: +NORMALIZE_WHITESPACE + [[3, 1, 6, 5, 7, 8, 4, 9, 2], + [5, 2, 9, 1, 3, 4, 7, 6, 8], + [4, 8, 7, 6, 2, 9, 5, 3, 1], + [2, 6, 3, 4, 1, 5, 9, 8, 7], + [9, 7, 4, 8, 6, 3, 1, 2, 5], + [8, 5, 1, 7, 9, 2, 6, 4, 3], + [1, 3, 8, 9, 4, 7, 2, 5, 6], + [6, 9, 2, 3, 5, 1, 8, 7, 4], + [7, 4, 5, 2, 8, 6, 3, 1, 9]] + >>> sudoku(no_solution) is None + True + """ + + if is_completed(grid): + return grid + + location = find_empty_location(grid) + if location is not None: + row, column = location + else: + # If the location is ``None``, then the grid is solved. + return grid + + for digit in range(1, 10): + if is_safe(grid, row, column, digit): + grid[row][column] = digit + + if sudoku(grid) is not None: + return grid + + grid[row][column] = 0 + + return None + + +def print_solution(grid: Matrix) -> None: + """ + A function to print the solution in the form + of a 9x9 grid + """ + for row in grid: + for cell in row: + print(cell, end=" ") + print() + + +if __name__ == "__main__": + # make a copy of grid so that you can compare with the unmodified grid + for example_grid in (initial_grid, no_solution): + print("\nExample grid:\n" + "=" * 20) + print_solution(example_grid) + print("\nExample grid solution:") + solution = sudoku(example_grid) + if solution is not None: + print_solution(solution) + else: + print("Cannot find a solution.") diff --git a/python-mega-algo/backtracking/sum_of_subsets.py b/python-mega-algo/backtracking/sum_of_subsets.py new file mode 100644 index 00000000..f695b8f7 --- /dev/null +++ b/python-mega-algo/backtracking/sum_of_subsets.py @@ -0,0 +1,65 @@ +""" + The sum-of-subsetsproblem states that a set of non-negative integers, and a + value M, determine all possible subsets of the given set whose summation sum + equal to given M. + + Summation of the chosen numbers must be equal to given number M and one number + can be used only once. +""" +from typing import List + + +def generate_sum_of_subsets_soln(nums: List[int], max_sum: int) -> List[List[int]]: + result: List[List[int]] = [] + path: List[int] = [] + num_index = 0 + remaining_nums_sum = sum(nums) + create_state_space_tree(nums, max_sum, num_index, path, result, remaining_nums_sum) + return result + + +def create_state_space_tree( + nums: List[int], + max_sum: int, + num_index: int, + path: List[int], + result: List[List[int]], + remaining_nums_sum: int, +) -> None: + """ + Creates a state space tree to iterate through each branch using DFS. + It terminates the branching of a node when any of the two conditions + given below satisfy. + This algorithm follows depth-fist-search and backtracks when the node is not + branchable. + + """ + if sum(path) > max_sum or (remaining_nums_sum + sum(path)) < max_sum: + return + if sum(path) == max_sum: + result.append(path) + return + for num_index in range(num_index, len(nums)): + create_state_space_tree( + nums, + max_sum, + num_index + 1, + path + [nums[num_index]], + result, + remaining_nums_sum - nums[num_index], + ) + + +""" +remove the comment to take an input from the user + +print("Enter the elements") +nums = list(map(int, input().split())) +print("Enter max_sum sum") +max_sum = int(input()) + +""" +nums = [3, 34, 4, 12, 5, 2] +max_sum = 9 +result = generate_sum_of_subsets_soln(nums, max_sum) +print(*result) diff --git a/python-mega-algo/bit_manipulation/README.md b/python-mega-algo/bit_manipulation/README.md new file mode 100644 index 00000000..2ef16615 --- /dev/null +++ b/python-mega-algo/bit_manipulation/README.md @@ -0,0 +1,7 @@ +https://docs.python.org/3/reference/expressions.html#binary-bitwise-operations +https://docs.python.org/3/reference/expressions.html#unary-arithmetic-and-bitwise-operations +https://docs.python.org/3/library/stdtypes.html#bitwise-operations-on-integer-types + +https://wiki.python.org/moin/BitManipulation +https://wiki.python.org/moin/BitwiseOperators +https://www.tutorialspoint.com/python3/bitwise_operators_example.htm diff --git a/python-mega-algo/bit_manipulation/__init__.py b/python-mega-algo/bit_manipulation/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/bit_manipulation/binary_and_operator.py b/python-mega-algo/bit_manipulation/binary_and_operator.py new file mode 100644 index 00000000..191ff8eb --- /dev/null +++ b/python-mega-algo/bit_manipulation/binary_and_operator.py @@ -0,0 +1,52 @@ +# https://www.tutorialspoint.com/python3/bitwise_operators_example.htm + + +def binary_and(a: int, b: int) -> str: + """ + Take in 2 integers, convert them to binary, + return a binary number that is the + result of a binary and operation on the integers provided. + + >>> binary_and(25, 32) + '0b000000' + >>> binary_and(37, 50) + '0b100000' + >>> binary_and(21, 30) + '0b10100' + >>> binary_and(58, 73) + '0b0001000' + >>> binary_and(0, 255) + '0b00000000' + >>> binary_and(256, 256) + '0b100000000' + >>> binary_and(0, -1) + Traceback (most recent call last): + ... + ValueError: the value of both input must be positive + >>> binary_and(0, 1.1) + Traceback (most recent call last): + ... + TypeError: 'float' object cannot be interpreted as an integer + >>> binary_and("0", "1") + Traceback (most recent call last): + ... + TypeError: '<' not supported between instances of 'str' and 'int' + """ + if a < 0 or b < 0: + raise ValueError("the value of both input must be positive") + + a_binary = str(bin(a))[2:] # remove the leading "0b" + b_binary = str(bin(b))[2:] # remove the leading "0b" + + max_len = max(len(a_binary), len(b_binary)) + + return "0b" + "".join( + str(int(char_a == "1" and char_b == "1")) + for char_a, char_b in zip(a_binary.zfill(max_len), b_binary.zfill(max_len)) + ) + + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/bit_manipulation/binary_count_setbits.py b/python-mega-algo/bit_manipulation/binary_count_setbits.py new file mode 100644 index 00000000..3c926945 --- /dev/null +++ b/python-mega-algo/bit_manipulation/binary_count_setbits.py @@ -0,0 +1,41 @@ +def binary_count_setbits(a: int) -> int: + """ + Take in 1 integer, return a number that is + the number of 1's in binary representation of that number. + + >>> binary_count_setbits(25) + 3 + >>> binary_count_setbits(36) + 2 + >>> binary_count_setbits(16) + 1 + >>> binary_count_setbits(58) + 4 + >>> binary_count_setbits(4294967295) + 32 + >>> binary_count_setbits(0) + 0 + >>> binary_count_setbits(-10) + Traceback (most recent call last): + ... + ValueError: Input value must be a positive integer + >>> binary_count_setbits(0.8) + Traceback (most recent call last): + ... + TypeError: Input value must be a 'int' type + >>> binary_count_setbits("0") + Traceback (most recent call last): + ... + TypeError: '<' not supported between instances of 'str' and 'int' + """ + if a < 0: + raise ValueError("Input value must be a positive integer") + elif isinstance(a, float): + raise TypeError("Input value must be a 'int' type") + return bin(a).count("1") + + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/bit_manipulation/binary_count_trailing_zeros.py b/python-mega-algo/bit_manipulation/binary_count_trailing_zeros.py new file mode 100644 index 00000000..f401c4ab --- /dev/null +++ b/python-mega-algo/bit_manipulation/binary_count_trailing_zeros.py @@ -0,0 +1,44 @@ +from math import log2 + + +def binary_count_trailing_zeros(a: int) -> int: + """ + Take in 1 integer, return a number that is + the number of trailing zeros in binary representation of that number. + + >>> binary_count_trailing_zeros(25) + 0 + >>> binary_count_trailing_zeros(36) + 2 + >>> binary_count_trailing_zeros(16) + 4 + >>> binary_count_trailing_zeros(58) + 1 + >>> binary_count_trailing_zeros(4294967296) + 32 + >>> binary_count_trailing_zeros(0) + 0 + >>> binary_count_trailing_zeros(-10) + Traceback (most recent call last): + ... + ValueError: Input value must be a positive integer + >>> binary_count_trailing_zeros(0.8) + Traceback (most recent call last): + ... + TypeError: Input value must be a 'int' type + >>> binary_count_trailing_zeros("0") + Traceback (most recent call last): + ... + TypeError: '<' not supported between instances of 'str' and 'int' + """ + if a < 0: + raise ValueError("Input value must be a positive integer") + elif isinstance(a, float): + raise TypeError("Input value must be a 'int' type") + return 0 if (a == 0) else int(log2(a & -a)) + + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/bit_manipulation/binary_or_operator.py b/python-mega-algo/bit_manipulation/binary_or_operator.py new file mode 100644 index 00000000..bf938b21 --- /dev/null +++ b/python-mega-algo/bit_manipulation/binary_or_operator.py @@ -0,0 +1,48 @@ +# https://www.tutorialspoint.com/python3/bitwise_operators_example.htm + + +def binary_or(a: int, b: int) -> str: + """ + Take in 2 integers, convert them to binary, and return a binary number that is the + result of a binary or operation on the integers provided. + + >>> binary_or(25, 32) + '0b111001' + >>> binary_or(37, 50) + '0b110111' + >>> binary_or(21, 30) + '0b11111' + >>> binary_or(58, 73) + '0b1111011' + >>> binary_or(0, 255) + '0b11111111' + >>> binary_or(0, 256) + '0b100000000' + >>> binary_or(0, -1) + Traceback (most recent call last): + ... + ValueError: the value of both input must be positive + >>> binary_or(0, 1.1) + Traceback (most recent call last): + ... + TypeError: 'float' object cannot be interpreted as an integer + >>> binary_or("0", "1") + Traceback (most recent call last): + ... + TypeError: '<' not supported between instances of 'str' and 'int' + """ + if a < 0 or b < 0: + raise ValueError("the value of both input must be positive") + a_binary = str(bin(a))[2:] # remove the leading "0b" + b_binary = str(bin(b))[2:] + max_len = max(len(a_binary), len(b_binary)) + return "0b" + "".join( + str(int("1" in (char_a, char_b))) + for char_a, char_b in zip(a_binary.zfill(max_len), b_binary.zfill(max_len)) + ) + + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/bit_manipulation/binary_shifts.py b/python-mega-algo/bit_manipulation/binary_shifts.py new file mode 100644 index 00000000..50dc27ff --- /dev/null +++ b/python-mega-algo/bit_manipulation/binary_shifts.py @@ -0,0 +1,109 @@ +# Information on binary shifts: +# https://docs.python.org/3/library/stdtypes.html#bitwise-operations-on-integer-types +# https://www.interviewcake.com/concept/java/bit-shift + + +def logical_left_shift(number: int, shift_amount: int) -> str: + """ + Take in 2 positive integers. + 'number' is the integer to be logically left shifted 'shift_amount' times. + i.e. (number << shift_amount) + Return the shifted binary representation. + + >>> logical_left_shift(0, 1) + '0b00' + >>> logical_left_shift(1, 1) + '0b10' + >>> logical_left_shift(1, 5) + '0b100000' + >>> logical_left_shift(17, 2) + '0b1000100' + >>> logical_left_shift(1983, 4) + '0b111101111110000' + >>> logical_left_shift(1, -1) + Traceback (most recent call last): + ... + ValueError: both inputs must be positive integers + """ + if number < 0 or shift_amount < 0: + raise ValueError("both inputs must be positive integers") + + binary_number = str(bin(number)) + binary_number += "0" * shift_amount + return binary_number + + +def logical_right_shift(number: int, shift_amount: int) -> str: + """ + Take in positive 2 integers. + 'number' is the integer to be logically right shifted 'shift_amount' times. + i.e. (number >>> shift_amount) + Return the shifted binary representation. + + >>> logical_right_shift(0, 1) + '0b0' + >>> logical_right_shift(1, 1) + '0b0' + >>> logical_right_shift(1, 5) + '0b0' + >>> logical_right_shift(17, 2) + '0b100' + >>> logical_right_shift(1983, 4) + '0b1111011' + >>> logical_right_shift(1, -1) + Traceback (most recent call last): + ... + ValueError: both inputs must be positive integers + """ + if number < 0 or shift_amount < 0: + raise ValueError("both inputs must be positive integers") + + binary_number = str(bin(number))[2:] + if shift_amount >= len(binary_number): + return "0b0" + shifted_binary_number = binary_number[: len(binary_number) - shift_amount] + return "0b" + shifted_binary_number + + +def arithmetic_right_shift(number: int, shift_amount: int) -> str: + """ + Take in 2 integers. + 'number' is the integer to be arithmetically right shifted 'shift_amount' times. + i.e. (number >> shift_amount) + Return the shifted binary representation. + + >>> arithmetic_right_shift(0, 1) + '0b00' + >>> arithmetic_right_shift(1, 1) + '0b00' + >>> arithmetic_right_shift(-1, 1) + '0b11' + >>> arithmetic_right_shift(17, 2) + '0b000100' + >>> arithmetic_right_shift(-17, 2) + '0b111011' + >>> arithmetic_right_shift(-1983, 4) + '0b111110000100' + """ + if number >= 0: # Get binary representation of positive number + binary_number = "0" + str(bin(number)).strip("-")[2:] + else: # Get binary (2's complement) representation of negative number + binary_number_length = len(bin(number)[3:]) # Find 2's complement of number + binary_number = bin(abs(number) - (1 << binary_number_length))[3:] + binary_number = ( + "1" + "0" * (binary_number_length - len(binary_number)) + binary_number + ) + + if shift_amount >= len(binary_number): + return "0b" + binary_number[0] * len(binary_number) + return ( + "0b" + + binary_number[0] * shift_amount + + binary_number[: len(binary_number) - shift_amount] + ) + + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/bit_manipulation/binary_twos_complement.py b/python-mega-algo/bit_manipulation/binary_twos_complement.py new file mode 100644 index 00000000..2c064ec1 --- /dev/null +++ b/python-mega-algo/bit_manipulation/binary_twos_complement.py @@ -0,0 +1,43 @@ +# Information on 2's complement: https://en.wikipedia.org/wiki/Two%27s_complement + + +def twos_complement(number: int) -> str: + """ + Take in a negative integer 'number'. + Return the two's complement representation of 'number'. + + >>> twos_complement(0) + '0b0' + >>> twos_complement(-1) + '0b11' + >>> twos_complement(-5) + '0b1011' + >>> twos_complement(-17) + '0b101111' + >>> twos_complement(-207) + '0b100110001' + >>> twos_complement(1) + Traceback (most recent call last): + ... + ValueError: input must be a negative integer + """ + if number > 0: + raise ValueError("input must be a negative integer") + binary_number_length = len(bin(number)[3:]) + twos_complement_number = bin(abs(number) - (1 << binary_number_length))[3:] + twos_complement_number = ( + ( + "1" + + "0" * (binary_number_length - len(twos_complement_number)) + + twos_complement_number + ) + if number < 0 + else "0" + ) + return "0b" + twos_complement_number + + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/bit_manipulation/binary_xor_operator.py b/python-mega-algo/bit_manipulation/binary_xor_operator.py new file mode 100644 index 00000000..6f896219 --- /dev/null +++ b/python-mega-algo/bit_manipulation/binary_xor_operator.py @@ -0,0 +1,52 @@ +# https://www.tutorialspoint.com/python3/bitwise_operators_example.htm + + +def binary_xor(a: int, b: int) -> str: + """ + Take in 2 integers, convert them to binary, + return a binary number that is the + result of a binary xor operation on the integers provided. + + >>> binary_xor(25, 32) + '0b111001' + >>> binary_xor(37, 50) + '0b010111' + >>> binary_xor(21, 30) + '0b01011' + >>> binary_xor(58, 73) + '0b1110011' + >>> binary_xor(0, 255) + '0b11111111' + >>> binary_xor(256, 256) + '0b000000000' + >>> binary_xor(0, -1) + Traceback (most recent call last): + ... + ValueError: the value of both input must be positive + >>> binary_xor(0, 1.1) + Traceback (most recent call last): + ... + TypeError: 'float' object cannot be interpreted as an integer + >>> binary_xor("0", "1") + Traceback (most recent call last): + ... + TypeError: '<' not supported between instances of 'str' and 'int' + """ + if a < 0 or b < 0: + raise ValueError("the value of both input must be positive") + + a_binary = str(bin(a))[2:] # remove the leading "0b" + b_binary = str(bin(b))[2:] # remove the leading "0b" + + max_len = max(len(a_binary), len(b_binary)) + + return "0b" + "".join( + str(int(char_a != char_b)) + for char_a, char_b in zip(a_binary.zfill(max_len), b_binary.zfill(max_len)) + ) + + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/bit_manipulation/count_number_of_one_bits.py b/python-mega-algo/bit_manipulation/count_number_of_one_bits.py new file mode 100644 index 00000000..51fd2b63 --- /dev/null +++ b/python-mega-algo/bit_manipulation/count_number_of_one_bits.py @@ -0,0 +1,34 @@ +def get_set_bits_count(number: int) -> int: + """ + Count the number of set bits in a 32 bit integer + >>> get_set_bits_count(25) + 3 + >>> get_set_bits_count(37) + 3 + >>> get_set_bits_count(21) + 3 + >>> get_set_bits_count(58) + 4 + >>> get_set_bits_count(0) + 0 + >>> get_set_bits_count(256) + 1 + >>> get_set_bits_count(-1) + Traceback (most recent call last): + ... + ValueError: the value of input must be positive + """ + if number < 0: + raise ValueError("the value of input must be positive") + result = 0 + while number: + if number % 2 == 1: + result += 1 + number = number >> 1 + return result + + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/bit_manipulation/reverse_bits.py b/python-mega-algo/bit_manipulation/reverse_bits.py new file mode 100644 index 00000000..55608ae1 --- /dev/null +++ b/python-mega-algo/bit_manipulation/reverse_bits.py @@ -0,0 +1,85 @@ +def get_reverse_bit_string(number: int) -> str: + """ + return the bit string of an integer + + >>> get_reverse_bit_string(9) + '10010000000000000000000000000000' + >>> get_reverse_bit_string(43) + '11010100000000000000000000000000' + >>> get_reverse_bit_string(2873) + '10011100110100000000000000000000' + >>> get_reverse_bit_string("this is not a number") + Traceback (most recent call last): + ... + TypeError: operation can not be conducted on a object of type str + """ + if not isinstance(number, int): + raise TypeError( + "operation can not be conducted on a object of type " + f"{type(number).__name__}" + ) + bit_string = "" + for _ in range(0, 32): + bit_string += str(number % 2) + number = number >> 1 + return bit_string + + +def reverse_bit(number: int) -> str: + """ + Take in an 32 bit integer, reverse its bits, + return a string of reverse bits + + result of a reverse_bit and operation on the integer provided. + + >>> reverse_bit(25) + '00000000000000000000000000011001' + >>> reverse_bit(37) + '00000000000000000000000000100101' + >>> reverse_bit(21) + '00000000000000000000000000010101' + >>> reverse_bit(58) + '00000000000000000000000000111010' + >>> reverse_bit(0) + '00000000000000000000000000000000' + >>> reverse_bit(256) + '00000000000000000000000100000000' + >>> reverse_bit(-1) + Traceback (most recent call last): + ... + ValueError: the value of input must be positive + + >>> reverse_bit(1.1) + Traceback (most recent call last): + ... + TypeError: Input value must be a 'int' type + + >>> reverse_bit("0") + Traceback (most recent call last): + ... + TypeError: '<' not supported between instances of 'str' and 'int' + """ + if number < 0: + raise ValueError("the value of input must be positive") + elif isinstance(number, float): + raise TypeError("Input value must be a 'int' type") + elif isinstance(number, str): + raise TypeError("'<' not supported between instances of 'str' and 'int'") + result = 0 + # iterator over [1 to 32],since we are dealing with 32 bit integer + for _ in range(1, 33): + # left shift the bits by unity + result = result << 1 + # get the end bit + end_bit = number % 2 + # right shift the bits by unity + number = number >> 1 + # add that bit to our ans + result = result | end_bit + return get_reverse_bit_string(result) + + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/bit_manipulation/right.html b/python-mega-algo/bit_manipulation/right.html new file mode 100644 index 00000000..26abf48e --- /dev/null +++ b/python-mega-algo/bit_manipulation/right.html @@ -0,0 +1,31 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/bit_manipulation + + + + + + + + +
Folders
<Go Back>
+
+ + + + + + +
FileFileFileFile
README.md binary_co...ros.py binary_tw...ent.py reverse_bits.py 
binary_an...tor.py binary_or...tor.py binary_xo...tor.py single_bi...ons.py 
binary_co...its.py binary_shifts.py count_num...its.py __init__.py 
+ +

+Folders: 1
+Files: 12
+Size of all files: 17314 KB

+ + + \ No newline at end of file diff --git a/python-mega-algo/bit_manipulation/single_bit_manipulation_operations.py b/python-mega-algo/bit_manipulation/single_bit_manipulation_operations.py new file mode 100644 index 00000000..b43ff07b --- /dev/null +++ b/python-mega-algo/bit_manipulation/single_bit_manipulation_operations.py @@ -0,0 +1,100 @@ +#!/usr/bin/env python3 + +"""Provide the functionality to manipulate a single bit.""" + + +def set_bit(number: int, position: int) -> int: + """ + Set the bit at position to 1. + + Details: perform bitwise or for given number and X. + Where X is a number with all the bits – zeroes and bit on given + position – one. + + >>> set_bit(0b1101, 1) # 0b1111 + 15 + >>> set_bit(0b0, 5) # 0b100000 + 32 + >>> set_bit(0b1111, 1) # 0b1111 + 15 + """ + return number | (1 << position) + + +def clear_bit(number: int, position: int) -> int: + """ + Set the bit at position to 0. + + Details: perform bitwise and for given number and X. + Where X is a number with all the bits – ones and bit on given + position – zero. + + >>> clear_bit(0b10010, 1) # 0b10000 + 16 + >>> clear_bit(0b0, 5) # 0b0 + 0 + """ + return number & ~(1 << position) + + +def flip_bit(number: int, position: int) -> int: + """ + Flip the bit at position. + + Details: perform bitwise xor for given number and X. + Where X is a number with all the bits – zeroes and bit on given + position – one. + + >>> flip_bit(0b101, 1) # 0b111 + 7 + >>> flip_bit(0b101, 0) # 0b100 + 4 + """ + return number ^ (1 << position) + + +def is_bit_set(number: int, position: int) -> bool: + """ + Is the bit at position set? + + Details: Shift the bit at position to be the first (smallest) bit. + Then check if the first bit is set by anding the shifted number with 1. + + >>> is_bit_set(0b1010, 0) + False + >>> is_bit_set(0b1010, 1) + True + >>> is_bit_set(0b1010, 2) + False + >>> is_bit_set(0b1010, 3) + True + >>> is_bit_set(0b0, 17) + False + """ + return ((number >> position) & 1) == 1 + + +def get_bit(number: int, position: int) -> int: + """ + Get the bit at the given position + + Details: perform bitwise and for the given number and X, + Where X is a number with all the bits – zeroes and bit on given position – one. + If the result is not equal to 0, then the bit on the given position is 1, else 0. + + >>> get_bit(0b1010, 0) + 0 + >>> get_bit(0b1010, 1) + 1 + >>> get_bit(0b1010, 2) + 0 + >>> get_bit(0b1010, 3) + 1 + """ + return int((number & (1 << position)) != 0) + + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/blockchain/__init__.py b/python-mega-algo/blockchain/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/blockchain/chinese_remainder_theorem.py b/python-mega-algo/blockchain/chinese_remainder_theorem.py new file mode 100644 index 00000000..b50147ac --- /dev/null +++ b/python-mega-algo/blockchain/chinese_remainder_theorem.py @@ -0,0 +1,94 @@ +""" +Chinese Remainder Theorem: +GCD ( Greatest Common Divisor ) or HCF ( Highest Common Factor ) + +If GCD(a,b) = 1, then for any remainder ra modulo a and any remainder rb modulo b +there exists integer n, such that n = ra (mod a) and n = ra(mod b). If n1 and n2 are +two such integers, then n1=n2(mod ab) + +Algorithm : + +1. Use extended euclid algorithm to find x,y such that a*x + b*y = 1 +2. Take n = ra*by + rb*ax +""" +from typing import Tuple + + +# Extended Euclid +def extended_euclid(a: int, b: int) -> Tuple[int, int]: + """ + >>> extended_euclid(10, 6) + (-1, 2) + + >>> extended_euclid(7, 5) + (-2, 3) + + """ + if b == 0: + return (1, 0) + (x, y) = extended_euclid(b, a % b) + k = a // b + return (y, x - k * y) + + +# Uses ExtendedEuclid to find inverses +def chinese_remainder_theorem(n1: int, r1: int, n2: int, r2: int) -> int: + """ + >>> chinese_remainder_theorem(5,1,7,3) + 31 + + Explanation : 31 is the smallest number such that + (i) When we divide it by 5, we get remainder 1 + (ii) When we divide it by 7, we get remainder 3 + + >>> chinese_remainder_theorem(6,1,4,3) + 14 + + """ + (x, y) = extended_euclid(n1, n2) + m = n1 * n2 + n = r2 * x * n1 + r1 * y * n2 + return (n % m + m) % m + + +# ----------SAME SOLUTION USING InvertModulo instead ExtendedEuclid---------------- + +# This function find the inverses of a i.e., a^(-1) +def invert_modulo(a: int, n: int) -> int: + """ + >>> invert_modulo(2, 5) + 3 + + >>> invert_modulo(8,7) + 1 + + """ + (b, x) = extended_euclid(a, n) + if b < 0: + b = (b % n + n) % n + return b + + +# Same a above using InvertingModulo +def chinese_remainder_theorem2(n1: int, r1: int, n2: int, r2: int) -> int: + """ + >>> chinese_remainder_theorem2(5,1,7,3) + 31 + + >>> chinese_remainder_theorem2(6,1,4,3) + 14 + + """ + x, y = invert_modulo(n1, n2), invert_modulo(n2, n1) + m = n1 * n2 + n = r2 * x * n1 + r1 * y * n2 + return (n % m + m) % m + + +if __name__ == "__main__": + from doctest import testmod + + testmod(name="chinese_remainder_theorem", verbose=True) + testmod(name="chinese_remainder_theorem2", verbose=True) + testmod(name="invert_modulo", verbose=True) + testmod(name="extended_euclid", verbose=True) diff --git a/python-mega-algo/blockchain/diophantine_equation.py b/python-mega-algo/blockchain/diophantine_equation.py new file mode 100644 index 00000000..7df674cb --- /dev/null +++ b/python-mega-algo/blockchain/diophantine_equation.py @@ -0,0 +1,131 @@ +from typing import Tuple + + +def diophantine(a: int, b: int, c: int) -> Tuple[float, float]: + """ + Diophantine Equation : Given integers a,b,c ( at least one of a and b != 0), the + diophantine equation a*x + b*y = c has a solution (where x and y are integers) + iff gcd(a,b) divides c. + + GCD ( Greatest Common Divisor ) or HCF ( Highest Common Factor ) + + >>> diophantine(10,6,14) + (-7.0, 14.0) + + >>> diophantine(391,299,-69) + (9.0, -12.0) + + But above equation has one more solution i.e., x = -4, y = 5. + That's why we need diophantine all solution function. + + """ + + assert ( + c % greatest_common_divisor(a, b) == 0 + ) # greatest_common_divisor(a,b) function implemented below + (d, x, y) = extended_gcd(a, b) # extended_gcd(a,b) function implemented below + r = c / d + return (r * x, r * y) + + +def diophantine_all_soln(a: int, b: int, c: int, n: int = 2) -> None: + """ + Lemma : if n|ab and gcd(a,n) = 1, then n|b. + + Finding All solutions of Diophantine Equations: + + Theorem : Let gcd(a,b) = d, a = d*p, b = d*q. If (x0,y0) is a solution of + Diophantine Equation a*x + b*y = c. a*x0 + b*y0 = c, then all the + solutions have the form a(x0 + t*q) + b(y0 - t*p) = c, + where t is an arbitrary integer. + + n is the number of solution you want, n = 2 by default + + >>> diophantine_all_soln(10, 6, 14) + -7.0 14.0 + -4.0 9.0 + + >>> diophantine_all_soln(10, 6, 14, 4) + -7.0 14.0 + -4.0 9.0 + -1.0 4.0 + 2.0 -1.0 + + >>> diophantine_all_soln(391, 299, -69, n = 4) + 9.0 -12.0 + 22.0 -29.0 + 35.0 -46.0 + 48.0 -63.0 + + """ + (x0, y0) = diophantine(a, b, c) # Initial value + d = greatest_common_divisor(a, b) + p = a // d + q = b // d + + for i in range(n): + x = x0 + i * q + y = y0 - i * p + print(x, y) + + +def greatest_common_divisor(a: int, b: int) -> int: + """ + Euclid's Lemma : d divides a and b, if and only if d divides a-b and b + + Euclid's Algorithm + + >>> greatest_common_divisor(7,5) + 1 + + Note : In number theory, two integers a and b are said to be relatively prime, + mutually prime, or co-prime if the only positive integer (factor) that + divides both of them is 1 i.e., gcd(a,b) = 1. + + >>> greatest_common_divisor(121, 11) + 11 + + """ + if a < b: + a, b = b, a + + while a % b != 0: + a, b = b, a % b + + return b + + +def extended_gcd(a: int, b: int) -> Tuple[int, int, int]: + """ + Extended Euclid's Algorithm : If d divides a and b and d = a*x + b*y for integers + x and y, then d = gcd(a,b) + + >>> extended_gcd(10, 6) + (2, -1, 2) + + >>> extended_gcd(7, 5) + (1, -2, 3) + + """ + assert a >= 0 and b >= 0 + + if b == 0: + d, x, y = a, 1, 0 + else: + (d, p, q) = extended_gcd(b, a % b) + x = q + y = p - q * (a // b) + + assert a % d == 0 and b % d == 0 + assert d == a * x + b * y + + return (d, x, y) + + +if __name__ == "__main__": + from doctest import testmod + + testmod(name="diophantine", verbose=True) + testmod(name="diophantine_all_soln", verbose=True) + testmod(name="extended_gcd", verbose=True) + testmod(name="greatest_common_divisor", verbose=True) diff --git a/python-mega-algo/blockchain/modular_division.py b/python-mega-algo/blockchain/modular_division.py new file mode 100644 index 00000000..4f7f50a9 --- /dev/null +++ b/python-mega-algo/blockchain/modular_division.py @@ -0,0 +1,154 @@ +from typing import Tuple + + +def modular_division(a: int, b: int, n: int) -> int: + """ + Modular Division : + An efficient algorithm for dividing b by a modulo n. + + GCD ( Greatest Common Divisor ) or HCF ( Highest Common Factor ) + + Given three integers a, b, and n, such that gcd(a,n)=1 and n>1, the algorithm should + return an integer x such that 0≤x≤n−1, and b/a=x(modn) (that is, b=ax(modn)). + + Theorem: + a has a multiplicative inverse modulo n iff gcd(a,n) = 1 + + + This find x = b*a^(-1) mod n + Uses ExtendedEuclid to find the inverse of a + + >>> modular_division(4,8,5) + 2 + + >>> modular_division(3,8,5) + 1 + + >>> modular_division(4, 11, 5) + 4 + + """ + assert n > 1 and a > 0 and greatest_common_divisor(a, n) == 1 + (d, t, s) = extended_gcd(n, a) # Implemented below + x = (b * s) % n + return x + + +def invert_modulo(a: int, n: int) -> int: + """ + This function find the inverses of a i.e., a^(-1) + + >>> invert_modulo(2, 5) + 3 + + >>> invert_modulo(8,7) + 1 + + """ + (b, x) = extended_euclid(a, n) # Implemented below + if b < 0: + b = (b % n + n) % n + return b + + +# ------------------ Finding Modular division using invert_modulo ------------------- + + +def modular_division2(a: int, b: int, n: int) -> int: + """ + This function used the above inversion of a to find x = (b*a^(-1))mod n + + >>> modular_division2(4,8,5) + 2 + + >>> modular_division2(3,8,5) + 1 + + >>> modular_division2(4, 11, 5) + 4 + + """ + s = invert_modulo(a, n) + x = (b * s) % n + return x + + +def extended_gcd(a: int, b: int) -> Tuple[int, int, int]: + """ + Extended Euclid's Algorithm : If d divides a and b and d = a*x + b*y for integers x + and y, then d = gcd(a,b) + >>> extended_gcd(10, 6) + (2, -1, 2) + + >>> extended_gcd(7, 5) + (1, -2, 3) + + ** extended_gcd function is used when d = gcd(a,b) is required in output + + """ + assert a >= 0 and b >= 0 + + if b == 0: + d, x, y = a, 1, 0 + else: + (d, p, q) = extended_gcd(b, a % b) + x = q + y = p - q * (a // b) + + assert a % d == 0 and b % d == 0 + assert d == a * x + b * y + + return (d, x, y) + + +def extended_euclid(a: int, b: int) -> Tuple[int, int]: + """ + Extended Euclid + >>> extended_euclid(10, 6) + (-1, 2) + + >>> extended_euclid(7, 5) + (-2, 3) + + """ + if b == 0: + return (1, 0) + (x, y) = extended_euclid(b, a % b) + k = a // b + return (y, x - k * y) + + +def greatest_common_divisor(a: int, b: int) -> int: + """ + Euclid's Lemma : d divides a and b, if and only if d divides a-b and b + Euclid's Algorithm + + >>> greatest_common_divisor(7,5) + 1 + + Note : In number theory, two integers a and b are said to be relatively prime, + mutually prime, or co-prime if the only positive integer (factor) that divides + both of them is 1 i.e., gcd(a,b) = 1. + + >>> greatest_common_divisor(121, 11) + 11 + + """ + if a < b: + a, b = b, a + + while a % b != 0: + a, b = b, a % b + + return b + + +if __name__ == "__main__": + from doctest import testmod + + testmod(name="modular_division", verbose=True) + testmod(name="modular_division2", verbose=True) + testmod(name="invert_modulo", verbose=True) + testmod(name="extended_gcd", verbose=True) + testmod(name="extended_euclid", verbose=True) + testmod(name="greatest_common_divisor", verbose=True) diff --git a/python-mega-algo/blockchain/right.html b/python-mega-algo/blockchain/right.html new file mode 100644 index 00000000..9bb4afdc --- /dev/null +++ b/python-mega-algo/blockchain/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/blockchain + + + + + + + + +
Folders
<Go Back>
+
+ + + + +
FileFileFileFile
chinese_r...rem.py diophanti...ion.py modular_d...ion.py __init__.py 
+ +

+Folders: 1
+Files: 4
+Size of all files: 8922 KB

+ + + \ No newline at end of file diff --git a/python-mega-algo/boolean_algebra/__init__.py b/python-mega-algo/boolean_algebra/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/boolean_algebra/quine_mc_cluskey.py b/python-mega-algo/boolean_algebra/quine_mc_cluskey.py new file mode 100644 index 00000000..70cdf25a --- /dev/null +++ b/python-mega-algo/boolean_algebra/quine_mc_cluskey.py @@ -0,0 +1,173 @@ +from typing import List + + +def compare_string(string1: str, string2: str) -> str: + """ + >>> compare_string('0010','0110') + '0_10' + + >>> compare_string('0110','1101') + 'X' + """ + l1 = list(string1) + l2 = list(string2) + count = 0 + for i in range(len(l1)): + if l1[i] != l2[i]: + count += 1 + l1[i] = "_" + if count > 1: + return "X" + else: + return "".join(l1) + + +def check(binary: List[str]) -> List[str]: + """ + >>> check(['0.00.01.5']) + ['0.00.01.5'] + """ + pi = [] + while 1: + check1 = ["$"] * len(binary) + temp = [] + for i in range(len(binary)): + for j in range(i + 1, len(binary)): + k = compare_string(binary[i], binary[j]) + if k != "X": + check1[i] = "*" + check1[j] = "*" + temp.append(k) + for i in range(len(binary)): + if check1[i] == "$": + pi.append(binary[i]) + if len(temp) == 0: + return pi + binary = list(set(temp)) + + +def decimal_to_binary(no_of_variable: int, minterms: List[float]) -> List[str]: + """ + >>> decimal_to_binary(3,[1.5]) + ['0.00.01.5'] + """ + temp = [] + s = "" + for m in minterms: + for i in range(no_of_variable): + s = str(m % 2) + s + m //= 2 + temp.append(s) + s = "" + return temp + + +def is_for_table(string1: str, string2: str, count: int) -> bool: + """ + >>> is_for_table('__1','011',2) + True + + >>> is_for_table('01_','001',1) + False + """ + l1 = list(string1) + l2 = list(string2) + count_n = 0 + for i in range(len(l1)): + if l1[i] != l2[i]: + count_n += 1 + if count_n == count: + return True + else: + return False + + +def selection(chart: List[List[int]], prime_implicants: List[str]) -> List[str]: + """ + >>> selection([[1]],['0.00.01.5']) + ['0.00.01.5'] + + >>> selection([[1]],['0.00.01.5']) + ['0.00.01.5'] + """ + temp = [] + select = [0] * len(chart) + for i in range(len(chart[0])): + count = 0 + rem = -1 + for j in range(len(chart)): + if chart[j][i] == 1: + count += 1 + rem = j + if count == 1: + select[rem] = 1 + for i in range(len(select)): + if select[i] == 1: + for j in range(len(chart[0])): + if chart[i][j] == 1: + for k in range(len(chart)): + chart[k][j] = 0 + temp.append(prime_implicants[i]) + while 1: + max_n = 0 + rem = -1 + count_n = 0 + for i in range(len(chart)): + count_n = chart[i].count(1) + if count_n > max_n: + max_n = count_n + rem = i + + if max_n == 0: + return temp + + temp.append(prime_implicants[rem]) + + for i in range(len(chart[0])): + if chart[rem][i] == 1: + for j in range(len(chart)): + chart[j][i] = 0 + + +def prime_implicant_chart( + prime_implicants: List[str], binary: List[str] +) -> List[List[int]]: + """ + >>> prime_implicant_chart(['0.00.01.5'],['0.00.01.5']) + [[1]] + """ + chart = [[0 for x in range(len(binary))] for x in range(len(prime_implicants))] + for i in range(len(prime_implicants)): + count = prime_implicants[i].count("_") + for j in range(len(binary)): + if is_for_table(prime_implicants[i], binary[j], count): + chart[i][j] = 1 + + return chart + + +def main(): + no_of_variable = int(input("Enter the no. of variables\n")) + minterms = [ + int(x) + for x in input( + "Enter the decimal representation of Minterms 'Spaces Separated'\n" + ).split() + ] + binary = decimal_to_binary(no_of_variable, minterms) + + prime_implicants = check(binary) + print("Prime Implicants are:") + print(prime_implicants) + chart = prime_implicant_chart(prime_implicants, binary) + + essential_prime_implicants = selection(chart, prime_implicants) + print("Essential Prime Implicants are:") + print(essential_prime_implicants) + + +if __name__ == "__main__": + import doctest + + doctest.testmod() + main() diff --git a/python-mega-algo/boolean_algebra/right.html b/python-mega-algo/boolean_algebra/right.html new file mode 100644 index 00000000..3311cb8f --- /dev/null +++ b/python-mega-algo/boolean_algebra/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/boolean_algebra + + + + + + + + +
Folders
<Go Back>
+
+ + + + +
FileFileFileFile
quine_mc_...key.py __init__.py 
+ +

+Folders: 1
+Files: 2
+Size of all files: 4281 KB

+ + + \ No newline at end of file diff --git a/python-mega-algo/cellular_automata/README.md b/python-mega-algo/cellular_automata/README.md new file mode 100644 index 00000000..c3fa0516 --- /dev/null +++ b/python-mega-algo/cellular_automata/README.md @@ -0,0 +1,4 @@ +# Cellular Automata + +* https://en.wikipedia.org/wiki/Cellular_automaton +* https://mathworld.wolfram.com/ElementaryCellularAutomaton.html diff --git a/python-mega-algo/cellular_automata/__init__.py b/python-mega-algo/cellular_automata/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/cellular_automata/conways_game_of_life.py b/python-mega-algo/cellular_automata/conways_game_of_life.py new file mode 100644 index 00000000..321baa3a --- /dev/null +++ b/python-mega-algo/cellular_automata/conways_game_of_life.py @@ -0,0 +1,100 @@ +""" +Conway's Game of Life implemented in Python. +https://en.wikipedia.org/wiki/Conway%27s_Game_of_Life +""" + +from __future__ import annotations + +from typing import List + +from PIL import Image + +# Define glider example +GLIDER = [ + [0, 1, 0, 0, 0, 0, 0, 0], + [0, 0, 1, 0, 0, 0, 0, 0], + [1, 1, 1, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0], +] + +# Define blinker example +BLINKER = [[0, 1, 0], [0, 1, 0], [0, 1, 0]] + + +def new_generation(cells: List[List[int]]) -> List[List[int]]: + """ + Generates the next generation for a given state of Conway's Game of Life. + >>> new_generation(BLINKER) + [[0, 0, 0], [1, 1, 1], [0, 0, 0]] + """ + next_generation = [] + for i in range(len(cells)): + next_generation_row = [] + for j in range(len(cells[i])): + # Get the number of live neighbours + neighbour_count = 0 + if i > 0 and j > 0: + neighbour_count += cells[i - 1][j - 1] + if i > 0: + neighbour_count += cells[i - 1][j] + if i > 0 and j < len(cells[i]) - 1: + neighbour_count += cells[i - 1][j + 1] + if j > 0: + neighbour_count += cells[i][j - 1] + if j < len(cells[i]) - 1: + neighbour_count += cells[i][j + 1] + if i < len(cells) - 1 and j > 0: + neighbour_count += cells[i + 1][j - 1] + if i < len(cells) - 1: + neighbour_count += cells[i + 1][j] + if i < len(cells) - 1 and j < len(cells[i]) - 1: + neighbour_count += cells[i + 1][j + 1] + + # Rules of the game of life (excerpt from Wikipedia): + # 1. Any live cell with two or three live neighbours survives. + # 2. Any dead cell with three live neighbours becomes a live cell. + # 3. All other live cells die in the next generation. + # Similarly, all other dead cells stay dead. + alive = cells[i][j] == 1 + if ( + (alive and 2 <= neighbour_count <= 3) + or not alive + and neighbour_count == 3 + ): + next_generation_row.append(1) + else: + next_generation_row.append(0) + + next_generation.append(next_generation_row) + return next_generation + + +def generate_images(cells: list[list[int]], frames) -> list[Image.Image]: + """ + Generates a list of images of subsequent Game of Life states. + """ + images = [] + for _ in range(frames): + # Create output image + img = Image.new("RGB", (len(cells[0]), len(cells))) + pixels = img.load() + + # Save cells to image + for x in range(len(cells)): + for y in range(len(cells[0])): + colour = 255 - cells[y][x] * 255 + pixels[x, y] = (colour, colour, colour) + + # Save image + images.append(img) + cells = new_generation(cells) + return images + + +if __name__ == "__main__": + images = generate_images(GLIDER, 16) + images[0].save("out.gif", save_all=True, append_images=images[1:]) diff --git a/python-mega-algo/cellular_automata/game_of_life.py b/python-mega-algo/cellular_automata/game_of_life.py new file mode 100644 index 00000000..09863993 --- /dev/null +++ b/python-mega-algo/cellular_automata/game_of_life.py @@ -0,0 +1,131 @@ +"""Conway's Game Of Life, Author Anurag Kumar(mailto:anuragkumarak95@gmail.com) + +Requirements: + - numpy + - random + - time + - matplotlib + +Python: + - 3.5 + +Usage: + - $python3 game_o_life + +Game-Of-Life Rules: + + 1. + Any live cell with fewer than two live neighbours + dies, as if caused by under-population. + 2. + Any live cell with two or three live neighbours lives + on to the next generation. + 3. + Any live cell with more than three live neighbours + dies, as if by over-population. + 4. + Any dead cell with exactly three live neighbours be- + comes a live cell, as if by reproduction. + """ +import random +import sys + +import numpy as np +from matplotlib import pyplot as plt +from matplotlib.colors import ListedColormap + +usage_doc = "Usage of script: script_nama " + +choice = [0] * 100 + [1] * 10 +random.shuffle(choice) + + +def create_canvas(size): + canvas = [[False for i in range(size)] for j in range(size)] + return canvas + + +def seed(canvas): + for i, row in enumerate(canvas): + for j, _ in enumerate(row): + canvas[i][j] = bool(random.getrandbits(1)) + + +def run(canvas): + """This function runs the rules of game through all points, and changes their + status accordingly.(in the same canvas) + @Args: + -- + canvas : canvas of population to run the rules on. + + @returns: + -- + None + """ + canvas = np.array(canvas) + next_gen_canvas = np.array(create_canvas(canvas.shape[0])) + for r, row in enumerate(canvas): + for c, pt in enumerate(row): + # print(r-1,r+2,c-1,c+2) + next_gen_canvas[r][c] = __judge_point( + pt, canvas[r - 1 : r + 2, c - 1 : c + 2] + ) + + canvas = next_gen_canvas + del next_gen_canvas # cleaning memory as we move on. + return canvas.tolist() + + +def __judge_point(pt, neighbours): + dead = 0 + alive = 0 + # finding dead or alive neighbours count. + for i in neighbours: + for status in i: + if status: + alive += 1 + else: + dead += 1 + + # handling duplicate entry for focus pt. + if pt: + alive -= 1 + else: + dead -= 1 + + # running the rules of game here. + state = pt + if pt: + if alive < 2: + state = False + elif alive == 2 or alive == 3: + state = True + elif alive > 3: + state = False + else: + if alive == 3: + state = True + + return state + + +if __name__ == "__main__": + if len(sys.argv) != 2: + raise Exception(usage_doc) + + canvas_size = int(sys.argv[1]) + # main working structure of this module. + c = create_canvas(canvas_size) + seed(c) + fig, ax = plt.subplots() + fig.show() + cmap = ListedColormap(["w", "k"]) + try: + while True: + c = run(c) + ax.matshow(c, cmap=cmap) + fig.canvas.draw() + ax.cla() + except KeyboardInterrupt: + # do nothing. + pass diff --git a/python-mega-algo/cellular_automata/one_dimensional.py b/python-mega-algo/cellular_automata/one_dimensional.py new file mode 100644 index 00000000..da77e444 --- /dev/null +++ b/python-mega-algo/cellular_automata/one_dimensional.py @@ -0,0 +1,74 @@ +""" +Return an image of 16 generations of one-dimensional cellular automata based on a given +ruleset number +https://mathworld.wolfram.com/ElementaryCellularAutomaton.html +""" + +from __future__ import annotations + +from PIL import Image + +# Define the first generation of cells +# fmt: off +CELLS = [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]] +# fmt: on + + +def format_ruleset(ruleset: int) -> list[int]: + """ + >>> format_ruleset(11100) + [0, 0, 0, 1, 1, 1, 0, 0] + >>> format_ruleset(0) + [0, 0, 0, 0, 0, 0, 0, 0] + >>> format_ruleset(11111111) + [1, 1, 1, 1, 1, 1, 1, 1] + """ + return [int(c) for c in f"{ruleset:08}"[:8]] + + +def new_generation(cells: list[list[int]], rule: list[int], time: int) -> list[int]: + population = len(cells[0]) # 31 + next_generation = [] + for i in range(population): + # Get the neighbors of each cell + # Handle neighbours outside bounds by using 0 as their value + left_neighbor = 0 if i == 0 else cells[time][i - 1] + right_neighbor = 0 if i == population - 1 else cells[time][i + 1] + # Define a new cell and add it to the new generation + situation = 7 - int(f"{left_neighbor}{cells[time][i]}{right_neighbor}", 2) + next_generation.append(rule[situation]) + return next_generation + + +def generate_image(cells: list[list[int]]) -> Image.Image: + """ + Convert the cells into a greyscale PIL.Image.Image and return it to the caller. + >>> from random import random + >>> cells = [[random() for w in range(31)] for h in range(16)] + >>> img = generate_image(cells) + >>> isinstance(img, Image.Image) + True + >>> img.width, img.height + (31, 16) + """ + # Create the output image + img = Image.new("RGB", (len(cells[0]), len(cells))) + pixels = img.load() + # Generates image + for w in range(img.width): + for h in range(img.height): + color = 255 - int(255 * cells[h][w]) + pixels[w, h] = (color, color, color) + return img + + +if __name__ == "__main__": + rule_num = bin(int(input("Rule:\n").strip()))[2:] + rule = format_ruleset(int(rule_num)) + for time in range(16): + CELLS.append(new_generation(CELLS, rule, time)) + img = generate_image(CELLS) + # Uncomment to save the image + # img.save(f"rule_{rule_num}.png") + img.show() diff --git a/python-mega-algo/cellular_automata/right.html b/python-mega-algo/cellular_automata/right.html new file mode 100644 index 00000000..d37e4a36 --- /dev/null +++ b/python-mega-algo/cellular_automata/right.html @@ -0,0 +1,30 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/cellular_automata + + + + + + + + +
Folders
<Go Back>
+
+ + + + + +
FileFileFileFile
README.md game_of_life.py one_dimensional.py __init__.py 
conways_g...ife.py 
+ +

+Folders: 1
+Files: 5
+Size of all files: 8698 KB

+ + + \ No newline at end of file diff --git a/python-mega-algo/ciphers/__init__.py b/python-mega-algo/ciphers/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/ciphers/a1z26.py b/python-mega-algo/ciphers/a1z26.py new file mode 100644 index 00000000..e6684fb1 --- /dev/null +++ b/python-mega-algo/ciphers/a1z26.py @@ -0,0 +1,33 @@ +""" +Convert a string of characters to a sequence of numbers +corresponding to the character's position in the alphabet. + +https://www.dcode.fr/letter-number-cipher +http://bestcodes.weebly.com/a1z26.html +""" + + +def encode(plain: str) -> list[int]: + """ + >>> encode("myname") + [13, 25, 14, 1, 13, 5] + """ + return [ord(elem) - 96 for elem in plain] + + +def decode(encoded: list[int]) -> str: + """ + >>> decode([13, 25, 14, 1, 13, 5]) + 'myname' + """ + return "".join(chr(elem + 96) for elem in encoded) + + +def main() -> None: + encoded = encode(input("-> ").strip().lower()) + print("Encoded: ", encoded) + print("Decoded:", decode(encoded)) + + +if __name__ == "__main__": + main() diff --git a/python-mega-algo/ciphers/affine_cipher.py b/python-mega-algo/ciphers/affine_cipher.py new file mode 100644 index 00000000..d3b806ba --- /dev/null +++ b/python-mega-algo/ciphers/affine_cipher.py @@ -0,0 +1,105 @@ +import random +import sys + +from . import cryptomath_module as cryptomath + +SYMBOLS = ( + r""" !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`""" + r"""abcdefghijklmnopqrstuvwxyz{|}~""" +) + + +def check_keys(keyA: int, keyB: int, mode: str) -> None: + if mode == "encrypt": + if keyA == 1: + sys.exit( + "The affine cipher becomes weak when key " + "A is set to 1. Choose different key" + ) + if keyB == 0: + sys.exit( + "The affine cipher becomes weak when key " + "B is set to 0. Choose different key" + ) + if keyA < 0 or keyB < 0 or keyB > len(SYMBOLS) - 1: + sys.exit( + "Key A must be greater than 0 and key B must " + f"be between 0 and {len(SYMBOLS) - 1}." + ) + if cryptomath.gcd(keyA, len(SYMBOLS)) != 1: + sys.exit( + f"Key A {keyA} and the symbol set size {len(SYMBOLS)} " + "are not relatively prime. Choose a different key." + ) + + +def encrypt_message(key: int, message: str) -> str: + """ + >>> encrypt_message(4545, 'The affine cipher is a type of monoalphabetic ' + ... 'substitution cipher.') + 'VL}p MM{I}p~{HL}Gp{vp pFsH}pxMpyxIx JHL O}F{~pvuOvF{FuF{xIp~{HL}Gi' + """ + keyA, keyB = divmod(key, len(SYMBOLS)) + check_keys(keyA, keyB, "encrypt") + cipherText = "" + for symbol in message: + if symbol in SYMBOLS: + symIndex = SYMBOLS.find(symbol) + cipherText += SYMBOLS[(symIndex * keyA + keyB) % len(SYMBOLS)] + else: + cipherText += symbol + return cipherText + + +def decrypt_message(key: int, message: str) -> str: + """ + >>> decrypt_message(4545, 'VL}p MM{I}p~{HL}Gp{vp pFsH}pxMpyxIx JHL O}F{~pvuOvF{FuF' + ... '{xIp~{HL}Gi') + 'The affine cipher is a type of monoalphabetic substitution cipher.' + """ + keyA, keyB = divmod(key, len(SYMBOLS)) + check_keys(keyA, keyB, "decrypt") + plainText = "" + modInverseOfkeyA = cryptomath.find_mod_inverse(keyA, len(SYMBOLS)) + for symbol in message: + if symbol in SYMBOLS: + symIndex = SYMBOLS.find(symbol) + plainText += SYMBOLS[(symIndex - keyB) * modInverseOfkeyA % len(SYMBOLS)] + else: + plainText += symbol + return plainText + + +def get_random_key() -> int: + while True: + keyA = random.randint(2, len(SYMBOLS)) + keyB = random.randint(2, len(SYMBOLS)) + if cryptomath.gcd(keyA, len(SYMBOLS)) == 1 and keyB % len(SYMBOLS) != 0: + return keyA * len(SYMBOLS) + keyB + + +def main() -> None: + """ + >>> key = get_random_key() + >>> msg = "This is a test!" + >>> decrypt_message(key, encrypt_message(key, msg)) == msg + True + """ + message = input("Enter message: ").strip() + key = int(input("Enter key [2000 - 9000]: ").strip()) + mode = input("Encrypt/Decrypt [E/D]: ").strip().lower() + + if mode.startswith("e"): + mode = "encrypt" + translated = encrypt_message(key, message) + elif mode.startswith("d"): + mode = "decrypt" + translated = decrypt_message(key, message) + print(f"\n{mode.title()}ed text: \n{translated}") + + +if __name__ == "__main__": + import doctest + + doctest.testmod() + # main() diff --git a/python-mega-algo/ciphers/atbash.py b/python-mega-algo/ciphers/atbash.py new file mode 100644 index 00000000..5c2aea61 --- /dev/null +++ b/python-mega-algo/ciphers/atbash.py @@ -0,0 +1,66 @@ +""" https://en.wikipedia.org/wiki/Atbash """ +import string + + +def atbash_slow(sequence: str) -> str: + """ + >>> atbash_slow("ABCDEFG") + 'ZYXWVUT' + + >>> atbash_slow("aW;;123BX") + 'zD;;123YC' + """ + output = "" + for i in sequence: + extract = ord(i) + if 65 <= extract <= 90: + output += chr(155 - extract) + elif 97 <= extract <= 122: + output += chr(219 - extract) + else: + output += i + return output + + +def atbash(sequence: str) -> str: + """ + >>> atbash("ABCDEFG") + 'ZYXWVUT' + + >>> atbash("aW;;123BX") + 'zD;;123YC' + """ + letters = string.ascii_letters + letters_reversed = string.ascii_lowercase[::-1] + string.ascii_uppercase[::-1] + return "".join( + letters_reversed[letters.index(c)] if c in letters else c for c in sequence + ) + + +def benchmark() -> None: + """Let's benchmark them side-by-side...""" + from timeit import timeit + + print("Running performance benchmarks...") + print( + "> atbash_slow()", + timeit( + "atbash_slow(printable)", + setup="from string import printable ; from __main__ import atbash_slow", + ), + "seconds", + ) + print( + "> atbash()", + timeit( + "atbash(printable)", + setup="from string import printable ; from __main__ import atbash", + ), + "seconds", + ) + + +if __name__ == "__main__": + for example in ("ABCDEFGH", "123GGjj", "testStringtest", "with space"): + print(f"{example} encrypted in atbash: {atbash(example)}") + benchmark() diff --git a/python-mega-algo/ciphers/base16.py b/python-mega-algo/ciphers/base16.py new file mode 100644 index 00000000..f27ea462 --- /dev/null +++ b/python-mega-algo/ciphers/base16.py @@ -0,0 +1,22 @@ +import base64 + + +def encode_to_b16(inp: str) -> bytes: + """ + Encodes a given utf-8 string into base-16. + >>> encode_to_b16('Hello World!') + b'48656C6C6F20576F726C6421' + >>> encode_to_b16('HELLO WORLD!') + b'48454C4C4F20574F524C4421' + >>> encode_to_b16('') + b'' + """ + encoded = inp.encode("utf-8") # encoded the input (we need a bytes like object) + b16encoded = base64.b16encode(encoded) # b16encoded the encoded string + return b16encoded + + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/ciphers/base32.py b/python-mega-algo/ciphers/base32.py new file mode 100644 index 00000000..da289a72 --- /dev/null +++ b/python-mega-algo/ciphers/base32.py @@ -0,0 +1,13 @@ +import base64 + + +def main() -> None: + inp = input("->") + encoded = inp.encode("utf-8") # encoded the input (we need a bytes like object) + b32encoded = base64.b32encode(encoded) # b32encoded the encoded string + print(b32encoded) + print(base64.b32decode(b32encoded).decode("utf-8")) # decoded it + + +if __name__ == "__main__": + main() diff --git a/python-mega-algo/ciphers/base64_encoding.py b/python-mega-algo/ciphers/base64_encoding.py new file mode 100644 index 00000000..634afcb8 --- /dev/null +++ b/python-mega-algo/ciphers/base64_encoding.py @@ -0,0 +1,142 @@ +B64_CHARSET = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" + + +def base64_encode(data: bytes) -> bytes: + """Encodes data according to RFC4648. + + The data is first transformed to binary and appended with binary digits so that its + length becomes a multiple of 6, then each 6 binary digits will match a character in + the B64_CHARSET string. The number of appended binary digits would later determine + how many "=" sign should be added, the padding. + For every 2 binary digits added, a "=" sign is added in the output. + We can add any binary digits to make it a multiple of 6, for instance, consider the + following example: + "AA" -> 0010100100101001 -> 001010 010010 1001 + As can be seen above, 2 more binary digits should be added, so there's 4 + possibilities here: 00, 01, 10 or 11. + That being said, Base64 encoding can be used in Steganography to hide data in these + appended digits. + + >>> from base64 import b64encode + >>> a = b"This pull request is part of Hacktoberfest20!" + >>> b = b"https://tools.ietf.org/html/rfc4648" + >>> c = b"A" + >>> base64_encode(a) == b64encode(a) + True + >>> base64_encode(b) == b64encode(b) + True + >>> base64_encode(c) == b64encode(c) + True + >>> base64_encode("abc") + Traceback (most recent call last): + ... + TypeError: a bytes-like object is required, not 'str' + """ + # Make sure the supplied data is a bytes-like object + if not isinstance(data, bytes): + raise TypeError( + f"a bytes-like object is required, not '{data.__class__.__name__}'" + ) + + binary_stream = "".join(bin(byte)[2:].zfill(8) for byte in data) + + padding_needed = len(binary_stream) % 6 != 0 + + if padding_needed: + # The padding that will be added later + padding = b"=" * ((6 - len(binary_stream) % 6) // 2) + + # Append binary_stream with arbitrary binary digits (0's by default) to make its + # length a multiple of 6. + binary_stream += "0" * (6 - len(binary_stream) % 6) + else: + padding = b"" + + # Encode every 6 binary digits to their corresponding Base64 character + return ( + "".join( + B64_CHARSET[int(binary_stream[index : index + 6], 2)] + for index in range(0, len(binary_stream), 6) + ).encode() + + padding + ) + + +def base64_decode(encoded_data: str) -> bytes: + """Decodes data according to RFC4648. + + This does the reverse operation of base64_encode. + We first transform the encoded data back to a binary stream, take off the + previously appended binary digits according to the padding, at this point we + would have a binary stream whose length is multiple of 8, the last step is + to convert every 8 bits to a byte. + + >>> from base64 import b64decode + >>> a = "VGhpcyBwdWxsIHJlcXVlc3QgaXMgcGFydCBvZiBIYWNrdG9iZXJmZXN0MjAh" + >>> b = "aHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzQ2NDg=" + >>> c = "QQ==" + >>> base64_decode(a) == b64decode(a) + True + >>> base64_decode(b) == b64decode(b) + True + >>> base64_decode(c) == b64decode(c) + True + >>> base64_decode("abc") + Traceback (most recent call last): + ... + AssertionError: Incorrect padding + """ + # Make sure encoded_data is either a string or a bytes-like object + if not isinstance(encoded_data, bytes) and not isinstance(encoded_data, str): + raise TypeError( + "argument should be a bytes-like object or ASCII string, not " + f"'{encoded_data.__class__.__name__}'" + ) + + # In case encoded_data is a bytes-like object, make sure it contains only + # ASCII characters so we convert it to a string object + if isinstance(encoded_data, bytes): + try: + encoded_data = encoded_data.decode("utf-8") + except UnicodeDecodeError: + raise ValueError("base64 encoded data should only contain ASCII characters") + + padding = encoded_data.count("=") + + # Check if the encoded string contains non base64 characters + if padding: + assert all( + char in B64_CHARSET for char in encoded_data[:-padding] + ), "Invalid base64 character(s) found." + else: + assert all( + char in B64_CHARSET for char in encoded_data + ), "Invalid base64 character(s) found." + + # Check the padding + assert len(encoded_data) % 4 == 0 and padding < 3, "Incorrect padding" + + if padding: + # Remove padding if there is one + encoded_data = encoded_data[:-padding] + + binary_stream = "".join( + bin(B64_CHARSET.index(char))[2:].zfill(6) for char in encoded_data + )[: -padding * 2] + else: + binary_stream = "".join( + bin(B64_CHARSET.index(char))[2:].zfill(6) for char in encoded_data + ) + + data = [ + int(binary_stream[index : index + 8], 2) + for index in range(0, len(binary_stream), 8) + ] + + return bytes(data) + + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/ciphers/base85.py b/python-mega-algo/ciphers/base85.py new file mode 100644 index 00000000..9740299b --- /dev/null +++ b/python-mega-algo/ciphers/base85.py @@ -0,0 +1,13 @@ +import base64 + + +def main() -> None: + inp = input("->") + encoded = inp.encode("utf-8") # encoded the input (we need a bytes like object) + a85encoded = base64.a85encode(encoded) # a85encoded the encoded string + print(a85encoded) + print(base64.a85decode(a85encoded).decode("utf-8")) # decoded it + + +if __name__ == "__main__": + main() diff --git a/python-mega-algo/ciphers/beaufort_cipher.py b/python-mega-algo/ciphers/beaufort_cipher.py new file mode 100644 index 00000000..8eae847a --- /dev/null +++ b/python-mega-algo/ciphers/beaufort_cipher.py @@ -0,0 +1,82 @@ +""" +Author: Mohit Radadiya +""" + +from string import ascii_uppercase + +dict1 = {char: i for i, char in enumerate(ascii_uppercase)} +dict2 = {i: char for i, char in enumerate(ascii_uppercase)} + + +# This function generates the key in +# a cyclic manner until it's length isn't +# equal to the length of original text +def generate_key(message: str, key: str) -> str: + """ + >>> generate_key("THE GERMAN ATTACK","SECRET") + 'SECRETSECRETSECRE' + """ + x = len(message) + i = 0 + while True: + if x == i: + i = 0 + if len(key) == len(message): + break + key += key[i] + i += 1 + return key + + +# This function returns the encrypted text +# generated with the help of the key +def cipher_text(message: str, key_new: str) -> str: + """ + >>> cipher_text("THE GERMAN ATTACK","SECRETSECRETSECRE") + 'BDC PAYUWL JPAIYI' + """ + cipher_text = "" + i = 0 + for letter in message: + if letter == " ": + cipher_text += " " + else: + x = (dict1[letter] - dict1[key_new[i]]) % 26 + i += 1 + cipher_text += dict2[x] + return cipher_text + + +# This function decrypts the encrypted text +# and returns the original text +def original_text(cipher_text: str, key_new: str) -> str: + """ + >>> original_text("BDC PAYUWL JPAIYI","SECRETSECRETSECRE") + 'THE GERMAN ATTACK' + """ + or_txt = "" + i = 0 + for letter in cipher_text: + if letter == " ": + or_txt += " " + else: + x = (dict1[letter] + dict1[key_new[i]] + 26) % 26 + i += 1 + or_txt += dict2[x] + return or_txt + + +def main() -> None: + message = "THE GERMAN ATTACK" + key = "SECRET" + key_new = generate_key(message, key) + s = cipher_text(message, key_new) + print(f"Encrypted Text = {s}") + print(f"Original Text = {original_text(s, key_new)}") + + +if __name__ == "__main__": + import doctest + + doctest.testmod() + main() diff --git a/python-mega-algo/ciphers/brute_force_caesar_cipher.py b/python-mega-algo/ciphers/brute_force_caesar_cipher.py new file mode 100644 index 00000000..8ab6e773 --- /dev/null +++ b/python-mega-algo/ciphers/brute_force_caesar_cipher.py @@ -0,0 +1,56 @@ +def decrypt(message: str) -> None: + """ + >>> decrypt('TMDETUX PMDVU') + Decryption using Key #0: TMDETUX PMDVU + Decryption using Key #1: SLCDSTW OLCUT + Decryption using Key #2: RKBCRSV NKBTS + Decryption using Key #3: QJABQRU MJASR + Decryption using Key #4: PIZAPQT LIZRQ + Decryption using Key #5: OHYZOPS KHYQP + Decryption using Key #6: NGXYNOR JGXPO + Decryption using Key #7: MFWXMNQ IFWON + Decryption using Key #8: LEVWLMP HEVNM + Decryption using Key #9: KDUVKLO GDUML + Decryption using Key #10: JCTUJKN FCTLK + Decryption using Key #11: IBSTIJM EBSKJ + Decryption using Key #12: HARSHIL DARJI + Decryption using Key #13: GZQRGHK CZQIH + Decryption using Key #14: FYPQFGJ BYPHG + Decryption using Key #15: EXOPEFI AXOGF + Decryption using Key #16: DWNODEH ZWNFE + Decryption using Key #17: CVMNCDG YVMED + Decryption using Key #18: BULMBCF XULDC + Decryption using Key #19: ATKLABE WTKCB + Decryption using Key #20: ZSJKZAD VSJBA + Decryption using Key #21: YRIJYZC URIAZ + Decryption using Key #22: XQHIXYB TQHZY + Decryption using Key #23: WPGHWXA SPGYX + Decryption using Key #24: VOFGVWZ ROFXW + Decryption using Key #25: UNEFUVY QNEWV + """ + LETTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + for key in range(len(LETTERS)): + translated = "" + for symbol in message: + if symbol in LETTERS: + num = LETTERS.find(symbol) + num = num - key + if num < 0: + num = num + len(LETTERS) + translated = translated + LETTERS[num] + else: + translated = translated + symbol + print(f"Decryption using Key #{key}: {translated}") + + +def main() -> None: + message = input("Encrypted message: ") + message = message.upper() + decrypt(message) + + +if __name__ == "__main__": + import doctest + + doctest.testmod() + main() diff --git a/python-mega-algo/ciphers/caesar_cipher.py b/python-mega-algo/ciphers/caesar_cipher.py new file mode 100644 index 00000000..4b2f76c7 --- /dev/null +++ b/python-mega-algo/ciphers/caesar_cipher.py @@ -0,0 +1,238 @@ +from string import ascii_letters +from typing import Dict, Optional + + +def encrypt(input_string: str, key: int, alphabet: Optional[str] = None) -> str: + """ + encrypt + ======= + Encodes a given string with the caesar cipher and returns the encoded + message + + Parameters: + ----------- + * input_string: the plain-text that needs to be encoded + * key: the number of letters to shift the message by + + Optional: + * alphabet (None): the alphabet used to encode the cipher, if not + specified, the standard english alphabet with upper and lowercase + letters is used + + Returns: + * A string containing the encoded cipher-text + + More on the caesar cipher + ========================= + The caesar cipher is named after Julius Caesar who used it when sending + secret military messages to his troops. This is a simple substitution cipher + where very character in the plain-text is shifted by a certain number known + as the "key" or "shift". + + Example: + Say we have the following message: + "Hello, captain" + + And our alphabet is made up of lower and uppercase letters: + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" + + And our shift is "2" + + We can then encode the message, one letter at a time. "H" would become "J", + since "J" is two letters away, and so on. If the shift is ever two large, or + our letter is at the end of the alphabet, we just start at the beginning + ("Z" would shift to "a" then "b" and so on). + + Our final message would be "Jgnnq, ecrvckp" + + Further reading + =============== + * https://en.m.wikipedia.org/wiki/Caesar_cipher + + Doctests + ======== + >>> encrypt('The quick brown fox jumps over the lazy dog', 8) + 'bpm yCqks jzwEv nwF rCuxA wDmz Bpm tiHG lwo' + + >>> encrypt('A very large key', 8000) + 's nWjq dSjYW cWq' + + >>> encrypt('a lowercase alphabet', 5, 'abcdefghijklmnopqrstuvwxyz') + 'f qtbjwhfxj fqumfgjy' + """ + # Set default alphabet to lower and upper case english chars + alpha = alphabet or ascii_letters + + # The final result string + result = "" + + for character in input_string: + if character not in alpha: + # Append without encryption if character is not in the alphabet + result += character + else: + # Get the index of the new key and make sure it isn't too large + new_key = (alpha.index(character) + key) % len(alpha) + + # Append the encoded character to the alphabet + result += alpha[new_key] + + return result + + +def decrypt(input_string: str, key: int, alphabet: Optional[str] = None) -> str: + """ + decrypt + ======= + Decodes a given string of cipher-text and returns the decoded plain-text + + Parameters: + ----------- + * input_string: the cipher-text that needs to be decoded + * key: the number of letters to shift the message backwards by to decode + + Optional: + * alphabet (None): the alphabet used to decode the cipher, if not + specified, the standard english alphabet with upper and lowercase + letters is used + + Returns: + * A string containing the decoded plain-text + + More on the caesar cipher + ========================= + The caesar cipher is named after Julius Caesar who used it when sending + secret military messages to his troops. This is a simple substitution cipher + where very character in the plain-text is shifted by a certain number known + as the "key" or "shift". Please keep in mind, here we will be focused on + decryption. + + Example: + Say we have the following cipher-text: + "Jgnnq, ecrvckp" + + And our alphabet is made up of lower and uppercase letters: + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" + + And our shift is "2" + + To decode the message, we would do the same thing as encoding, but in + reverse. The first letter, "J" would become "H" (remember: we are decoding) + because "H" is two letters in reverse (to the left) of "J". We would + continue doing this. A letter like "a" would shift back to the end of + the alphabet, and would become "Z" or "Y" and so on. + + Our final message would be "Hello, captain" + + Further reading + =============== + * https://en.m.wikipedia.org/wiki/Caesar_cipher + + Doctests + ======== + >>> decrypt('bpm yCqks jzwEv nwF rCuxA wDmz Bpm tiHG lwo', 8) + 'The quick brown fox jumps over the lazy dog' + + >>> decrypt('s nWjq dSjYW cWq', 8000) + 'A very large key' + + >>> decrypt('f qtbjwhfxj fqumfgjy', 5, 'abcdefghijklmnopqrstuvwxyz') + 'a lowercase alphabet' + """ + # Turn on decode mode by making the key negative + key *= -1 + + return encrypt(input_string, key, alphabet) + + +def brute_force(input_string: str, alphabet: Optional[str] = None) -> Dict[int, str]: + """ + brute_force + =========== + Returns all the possible combinations of keys and the decoded strings in the + form of a dictionary + + Parameters: + ----------- + * input_string: the cipher-text that needs to be used during brute-force + + Optional: + * alphabet: (None): the alphabet used to decode the cipher, if not + specified, the standard english alphabet with upper and lowercase + letters is used + + More about brute force + ====================== + Brute force is when a person intercepts a message or password, not knowing + the key and tries every single combination. This is easy with the caesar + cipher since there are only all the letters in the alphabet. The more + complex the cipher, the larger amount of time it will take to do brute force + + Ex: + Say we have a 5 letter alphabet (abcde), for simplicity and we intercepted the + following message: + + "dbc" + + we could then just write out every combination: + ecd... and so on, until we reach a combination that makes sense: + "cab" + + Further reading + =============== + * https://en.wikipedia.org/wiki/Brute_force + + Doctests + ======== + >>> brute_force("jFyuMy xIH'N vLONy zILwy Gy!")[20] + "Please don't brute force me!" + + >>> brute_force(1) + Traceback (most recent call last): + TypeError: 'int' object is not iterable + """ + # Set default alphabet to lower and upper case english chars + alpha = alphabet or ascii_letters + + # To store data on all the combinations + brute_force_data = {} + + # Cycle through each combination + for key in range(1, len(alpha) + 1): + # Decrypt the message and store the result in the data + brute_force_data[key] = decrypt(input_string, key, alpha) + + return brute_force_data + + +if __name__ == "__main__": + while True: + print(f'\n{"-" * 10}\n Menu\n{"-" * 10}') + print(*["1.Encrypt", "2.Decrypt", "3.BruteForce", "4.Quit"], sep="\n") + + # get user input + choice = input("\nWhat would you like to do?: ").strip() or "4" + + # run functions based on what the user chose + if choice not in ("1", "2", "3", "4"): + print("Invalid choice, please enter a valid choice") + elif choice == "1": + input_string = input("Please enter the string to be encrypted: ") + key = int(input("Please enter off-set: ").strip()) + + print(encrypt(input_string, key)) + elif choice == "2": + input_string = input("Please enter the string to be decrypted: ") + key = int(input("Please enter off-set: ").strip()) + + print(decrypt(input_string, key)) + elif choice == "3": + input_string = input("Please enter the string to be decrypted: ") + brute_force_data = brute_force(input_string) + + for key, value in brute_force_data.items(): + print(f"Key: {key} | Message: {value}") + + elif choice == "4": + print("Goodbye.") + break diff --git a/python-mega-algo/ciphers/cryptomath_module.py b/python-mega-algo/ciphers/cryptomath_module.py new file mode 100644 index 00000000..be8764ff --- /dev/null +++ b/python-mega-algo/ciphers/cryptomath_module.py @@ -0,0 +1,15 @@ +def gcd(a: int, b: int) -> int: + while a != 0: + a, b = b % a, a + return b + + +def find_mod_inverse(a: int, m: int) -> int: + if gcd(a, m) != 1: + raise ValueError(f"mod inverse of {a!r} and {m!r} does not exist") + u1, u2, u3 = 1, 0, a + v1, v2, v3 = 0, 1, m + while v3 != 0: + q = u3 // v3 + v1, v2, v3, u1, u2, u3 = (u1 - q * v1), (u2 - q * v2), (u3 - q * v3), v1, v2, v3 + return u1 % m diff --git a/python-mega-algo/ciphers/decrypt_caesar_with_chi_squared.py b/python-mega-algo/ciphers/decrypt_caesar_with_chi_squared.py new file mode 100644 index 00000000..e7faeae7 --- /dev/null +++ b/python-mega-algo/ciphers/decrypt_caesar_with_chi_squared.py @@ -0,0 +1,240 @@ +#!/usr/bin/env python3 + +from typing import Optional + + +def decrypt_caesar_with_chi_squared( + ciphertext: str, + cipher_alphabet: Optional[list[str]] = None, + frequencies_dict: Optional[dict[str, float]] = None, + case_sensetive: bool = False, +) -> tuple[int, float, str]: + """ + Basic Usage + =========== + Arguments: + * ciphertext (str): the text to decode (encoded with the caesar cipher) + + Optional Arguments: + * cipher_alphabet (list): the alphabet used for the cipher (each letter is + a string separated by commas) + * frequencies_dict (dict): a dictionary of word frequencies where keys are + the letters and values are a percentage representation of the frequency as + a decimal/float + * case_sensetive (bool): a boolean value: True if the case matters during + decryption, False if it doesn't + + Returns: + * A tuple in the form of: + ( + most_likely_cipher, + most_likely_cipher_chi_squared_value, + decoded_most_likely_cipher + ) + + where... + - most_likely_cipher is an integer representing the shift of the smallest + chi-squared statistic (most likely key) + - most_likely_cipher_chi_squared_value is a float representing the + chi-squared statistic of the most likely shift + - decoded_most_likely_cipher is a string with the decoded cipher + (decoded by the most_likely_cipher key) + + + The Chi-squared test + ==================== + + The caesar cipher + ----------------- + The caesar cipher is a very insecure encryption algorithm, however it has + been used since Julius Caesar. The cipher is a simple substitution cipher + where each character in the plain text is replaced by a character in the + alphabet a certain number of characters after the original character. The + number of characters away is called the shift or key. For example: + + Plain text: hello + Key: 1 + Cipher text: ifmmp + (each letter in hello has been shifted one to the right in the eng. alphabet) + + As you can imagine, this doesn't provide lots of security. In fact + decrypting ciphertext by brute-force is extremely easy even by hand. However + one way to do that is the chi-squared test. + + The chi-squared test + ------------------- + Each letter in the english alphabet has a frequency, or the amount of times + it shows up compared to other letters (usually expressed as a decimal + representing the percentage likelihood). The most common letter in the + english language is "e" with a frequency of 0.11162 or 11.162%. The test is + completed in the following fashion. + + 1. The ciphertext is decoded in a brute force way (every combination of the + 26 possible combinations) + 2. For every combination, for each letter in the combination, the average + amount of times the letter should appear the message is calculated by + multiplying the total number of characters by the frequency of the letter + + For example: + In a message of 100 characters, e should appear around 11.162 times. + + 3. Then, to calculate the margin of error (the amount of times the letter + SHOULD appear with the amount of times the letter DOES appear), we use + the chi-squared test. The following formula is used: + + Let: + - n be the number of times the letter actually appears + - p be the predicted value of the number of times the letter should + appear (see #2) + - let v be the chi-squared test result (referred to here as chi-squared + value/statistic) + + (n - p)^2 + --------- = v + p + + 4. Each chi squared value for each letter is then added up to the total. + The total is the chi-squared statistic for that encryption key. + 5. The encryption key with the lowest chi-squared value is the most likely + to be the decoded answer. + + Further Reading + ================ + + * http://practicalcryptography.com/cryptanalysis/text-characterisation/chi-squared- + statistic/ + * https://en.wikipedia.org/wiki/Letter_frequency + * https://en.wikipedia.org/wiki/Chi-squared_test + * https://en.m.wikipedia.org/wiki/Caesar_cipher + + Doctests + ======== + >>> decrypt_caesar_with_chi_squared( + ... 'dof pz aol jhlzhy jpwoly zv wvwbshy? pa pz avv lhzf av jyhjr!' + ... ) # doctest: +NORMALIZE_WHITESPACE + (7, 3129.228005747531, + 'why is the caesar cipher so popular? it is too easy to crack!') + + >>> decrypt_caesar_with_chi_squared('crybd cdbsxq') + (10, 233.35343938980898, 'short string') + + >>> decrypt_caesar_with_chi_squared(12) + Traceback (most recent call last): + AttributeError: 'int' object has no attribute 'lower' + """ + alphabet_letters = cipher_alphabet or [chr(i) for i in range(97, 123)] + + # If the argument is None or the user provided an empty dictionary + if not frequencies_dict: + # Frequencies of letters in the english language (how much they show up) + frequencies = { + "a": 0.08497, + "b": 0.01492, + "c": 0.02202, + "d": 0.04253, + "e": 0.11162, + "f": 0.02228, + "g": 0.02015, + "h": 0.06094, + "i": 0.07546, + "j": 0.00153, + "k": 0.01292, + "l": 0.04025, + "m": 0.02406, + "n": 0.06749, + "o": 0.07507, + "p": 0.01929, + "q": 0.00095, + "r": 0.07587, + "s": 0.06327, + "t": 0.09356, + "u": 0.02758, + "v": 0.00978, + "w": 0.02560, + "x": 0.00150, + "y": 0.01994, + "z": 0.00077, + } + else: + # Custom frequencies dictionary + frequencies = frequencies_dict + + if not case_sensetive: + ciphertext = ciphertext.lower() + + # Chi squared statistic values + chi_squared_statistic_values: dict[int, tuple[float, str]] = {} + + # cycle through all of the shifts + for shift in range(len(alphabet_letters)): + decrypted_with_shift = "" + + # decrypt the message with the shift + for letter in ciphertext: + try: + # Try to index the letter in the alphabet + new_key = (alphabet_letters.index(letter) - shift) % len( + alphabet_letters + ) + decrypted_with_shift += alphabet_letters[new_key] + except ValueError: + # Append the character if it isn't in the alphabet + decrypted_with_shift += letter + + chi_squared_statistic = 0.0 + + # Loop through each letter in the decoded message with the shift + for letter in decrypted_with_shift: + if case_sensetive: + if letter in frequencies: + # Get the amount of times the letter occurs in the message + occurrences = decrypted_with_shift.count(letter) + + # Get the excepcted amount of times the letter should appear based + # on letter frequencies + expected = frequencies[letter] * occurrences + + # Complete the chi squared statistic formula + chi_letter_value = ((occurrences - expected) ** 2) / expected + + # Add the margin of error to the total chi squared statistic + chi_squared_statistic += chi_letter_value + else: + if letter.lower() in frequencies: + # Get the amount of times the letter occurs in the message + occurrences = decrypted_with_shift.count(letter) + + # Get the excepcted amount of times the letter should appear based + # on letter frequencies + expected = frequencies[letter] * occurrences + + # Complete the chi squared statistic formula + chi_letter_value = ((occurrences - expected) ** 2) / expected + + # Add the margin of error to the total chi squared statistic + chi_squared_statistic += chi_letter_value + + # Add the data to the chi_squared_statistic_values dictionary + chi_squared_statistic_values[shift] = ( + chi_squared_statistic, + decrypted_with_shift, + ) + + # Get the most likely cipher by finding the cipher with the smallest chi squared + # statistic + most_likely_cipher: int = min( + chi_squared_statistic_values, key=chi_squared_statistic_values.get + ) # type: ignore # First argument to `min` is not optional + + # Get all the data from the most likely cipher (key, decoded message) + ( + most_likely_cipher_chi_squared_value, + decoded_most_likely_cipher, + ) = chi_squared_statistic_values[most_likely_cipher] + + # Return the data on the most likely shift + return ( + most_likely_cipher, + most_likely_cipher_chi_squared_value, + decoded_most_likely_cipher, + ) diff --git a/python-mega-algo/ciphers/deterministic_miller_rabin.py b/python-mega-algo/ciphers/deterministic_miller_rabin.py new file mode 100644 index 00000000..d7fcb67e --- /dev/null +++ b/python-mega-algo/ciphers/deterministic_miller_rabin.py @@ -0,0 +1,137 @@ +"""Created by Nathan Damon, @bizzfitch on github +>>> test_miller_rabin() +""" + + +def miller_rabin(n: int, allow_probable: bool = False) -> bool: + """Deterministic Miller-Rabin algorithm for primes ~< 3.32e24. + + Uses numerical analysis results to return whether or not the passed number + is prime. If the passed number is above the upper limit, and + allow_probable is True, then a return value of True indicates that n is + probably prime. This test does not allow False negatives- a return value + of False is ALWAYS composite. + + Parameters + ---------- + n : int + The integer to be tested. Since we usually care if a number is prime, + n < 2 returns False instead of raising a ValueError. + allow_probable: bool, default False + Whether or not to test n above the upper bound of the deterministic test. + + Raises + ------ + ValueError + + Reference + --------- + https://en.wikipedia.org/wiki/Miller%E2%80%93Rabin_primality_test + """ + if n == 2: + return True + if not n % 2 or n < 2: + return False + if n > 5 and n % 10 not in (1, 3, 7, 9): # can quickly check last digit + return False + if n > 3_317_044_064_679_887_385_961_981 and not allow_probable: + raise ValueError( + "Warning: upper bound of deterministic test is exceeded. " + "Pass allow_probable=True to allow probabilistic test. " + "A return value of True indicates a probable prime." + ) + # array bounds provided by analysis + bounds = [ + 2_047, + 1_373_653, + 25_326_001, + 3_215_031_751, + 2_152_302_898_747, + 3_474_749_660_383, + 341_550_071_728_321, + 1, + 3_825_123_056_546_413_051, + 1, + 1, + 318_665_857_834_031_151_167_461, + 3_317_044_064_679_887_385_961_981, + ] + + primes = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41] + for idx, _p in enumerate(bounds, 1): + if n < _p: + # then we have our last prime to check + plist = primes[:idx] + break + d, s = n - 1, 0 + # break up n -1 into a power of 2 (s) and + # remaining odd component + # essentially, solve for d * 2 ** s == n - 1 + while d % 2 == 0: + d //= 2 + s += 1 + for prime in plist: + pr = False + for r in range(s): + m = pow(prime, d * 2 ** r, n) + # see article for analysis explanation for m + if (r == 0 and m == 1) or ((m + 1) % n == 0): + pr = True + # this loop will not determine compositeness + break + if pr: + continue + # if pr is False, then the above loop never evaluated to true, + # and the n MUST be composite + return False + return True + + +def test_miller_rabin() -> None: + """Testing a nontrivial (ends in 1, 3, 7, 9) composite + and a prime in each range. + """ + assert not miller_rabin(561) + assert miller_rabin(563) + # 2047 + + assert not miller_rabin(838_201) + assert miller_rabin(838_207) + # 1_373_653 + + assert not miller_rabin(17_316_001) + assert miller_rabin(17_316_017) + # 25_326_001 + + assert not miller_rabin(3_078_386_641) + assert miller_rabin(3_078_386_653) + # 3_215_031_751 + + assert not miller_rabin(1_713_045_574_801) + assert miller_rabin(1_713_045_574_819) + # 2_152_302_898_747 + + assert not miller_rabin(2_779_799_728_307) + assert miller_rabin(2_779_799_728_327) + # 3_474_749_660_383 + + assert not miller_rabin(113_850_023_909_441) + assert miller_rabin(113_850_023_909_527) + # 341_550_071_728_321 + + assert not miller_rabin(1_275_041_018_848_804_351) + assert miller_rabin(1_275_041_018_848_804_391) + # 3_825_123_056_546_413_051 + + assert not miller_rabin(79_666_464_458_507_787_791_867) + assert miller_rabin(79_666_464_458_507_787_791_951) + # 318_665_857_834_031_151_167_461 + + assert not miller_rabin(552_840_677_446_647_897_660_333) + assert miller_rabin(552_840_677_446_647_897_660_359) + # 3_317_044_064_679_887_385_961_981 + # upper limit for probabilistic test + + +if __name__ == "__main__": + test_miller_rabin() diff --git a/python-mega-algo/ciphers/diffie.py b/python-mega-algo/ciphers/diffie.py new file mode 100644 index 00000000..c0038927 --- /dev/null +++ b/python-mega-algo/ciphers/diffie.py @@ -0,0 +1,32 @@ +from typing import Optional + + +def find_primitive(n: int) -> Optional[int]: + for r in range(1, n): + li = [] + for x in range(n - 1): + val = pow(r, x, n) + if val in li: + break + li.append(val) + else: + return r + return None + + +if __name__ == "__main__": + q = int(input("Enter a prime number q: ")) + a = find_primitive(q) + if a is None: + print(f"Cannot find the primitive for the value: {a!r}") + else: + a_private = int(input("Enter private key of A: ")) + a_public = pow(a, a_private, q) + b_private = int(input("Enter private key of B: ")) + b_public = pow(a, b_private, q) + + a_secret = pow(b_public, a_private, q) + b_secret = pow(a_public, b_private, q) + + print("The key value generated by A is: ", a_secret) + print("The key value generated by B is: ", b_secret) diff --git a/python-mega-algo/ciphers/diffie_hellman.py b/python-mega-algo/ciphers/diffie_hellman.py new file mode 100644 index 00000000..072f4aaa --- /dev/null +++ b/python-mega-algo/ciphers/diffie_hellman.py @@ -0,0 +1,267 @@ +from binascii import hexlify +from hashlib import sha256 +from os import urandom + +# RFC 3526 - More Modular Exponential (MODP) Diffie-Hellman groups for +# Internet Key Exchange (IKE) https://tools.ietf.org/html/rfc3526 + +primes = { + # 1536-bit + 5: { + "prime": int( + "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1" + + "29024E088A67CC74020BBEA63B139B22514A08798E3404DD" + + "EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245" + + "E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED" + + "EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3D" + + "C2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F" + + "83655D23DCA3AD961C62F356208552BB9ED529077096966D" + + "670C354E4ABC9804F1746C08CA237327FFFFFFFFFFFFFFFF", + base=16, + ), + "generator": 2, + }, + # 2048-bit + 14: { + "prime": int( + "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1" + + "29024E088A67CC74020BBEA63B139B22514A08798E3404DD" + + "EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245" + + "E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED" + + "EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3D" + + "C2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F" + + "83655D23DCA3AD961C62F356208552BB9ED529077096966D" + + "670C354E4ABC9804F1746C08CA18217C32905E462E36CE3B" + + "E39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9" + + "DE2BCBF6955817183995497CEA956AE515D2261898FA0510" + + "15728E5A8AACAA68FFFFFFFFFFFFFFFF", + base=16, + ), + "generator": 2, + }, + # 3072-bit + 15: { + "prime": int( + "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1" + + "29024E088A67CC74020BBEA63B139B22514A08798E3404DD" + + "EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245" + + "E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED" + + "EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3D" + + "C2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F" + + "83655D23DCA3AD961C62F356208552BB9ED529077096966D" + + "670C354E4ABC9804F1746C08CA18217C32905E462E36CE3B" + + "E39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9" + + "DE2BCBF6955817183995497CEA956AE515D2261898FA0510" + + "15728E5A8AAAC42DAD33170D04507A33A85521ABDF1CBA64" + + "ECFB850458DBEF0A8AEA71575D060C7DB3970F85A6E1E4C7" + + "ABF5AE8CDB0933D71E8C94E04A25619DCEE3D2261AD2EE6B" + + "F12FFA06D98A0864D87602733EC86A64521F2B18177B200C" + + "BBE117577A615D6C770988C0BAD946E208E24FA074E5AB31" + + "43DB5BFCE0FD108E4B82D120A93AD2CAFFFFFFFFFFFFFFFF", + base=16, + ), + "generator": 2, + }, + # 4096-bit + 16: { + "prime": int( + "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1" + + "29024E088A67CC74020BBEA63B139B22514A08798E3404DD" + + "EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245" + + "E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED" + + "EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3D" + + "C2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F" + + "83655D23DCA3AD961C62F356208552BB9ED529077096966D" + + "670C354E4ABC9804F1746C08CA18217C32905E462E36CE3B" + + "E39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9" + + "DE2BCBF6955817183995497CEA956AE515D2261898FA0510" + + "15728E5A8AAAC42DAD33170D04507A33A85521ABDF1CBA64" + + "ECFB850458DBEF0A8AEA71575D060C7DB3970F85A6E1E4C7" + + "ABF5AE8CDB0933D71E8C94E04A25619DCEE3D2261AD2EE6B" + + "F12FFA06D98A0864D87602733EC86A64521F2B18177B200C" + + "BBE117577A615D6C770988C0BAD946E208E24FA074E5AB31" + + "43DB5BFCE0FD108E4B82D120A92108011A723C12A787E6D7" + + "88719A10BDBA5B2699C327186AF4E23C1A946834B6150BDA" + + "2583E9CA2AD44CE8DBBBC2DB04DE8EF92E8EFC141FBECAA6" + + "287C59474E6BC05D99B2964FA090C3A2233BA186515BE7ED" + + "1F612970CEE2D7AFB81BDD762170481CD0069127D5B05AA9" + + "93B4EA988D8FDDC186FFB7DC90A6C08F4DF435C934063199" + + "FFFFFFFFFFFFFFFF", + base=16, + ), + "generator": 2, + }, + # 6144-bit + 17: { + "prime": int( + "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E08" + + "8A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B" + + "302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9" + + "A637ED6B0BFF5CB6F406B7EDEE386BFB5A899FA5AE9F24117C4B1FE6" + + "49286651ECE45B3DC2007CB8A163BF0598DA48361C55D39A69163FA8" + + "FD24CF5F83655D23DCA3AD961C62F356208552BB9ED529077096966D" + + "670C354E4ABC9804F1746C08CA18217C32905E462E36CE3BE39E772C" + + "180E86039B2783A2EC07A28FB5C55DF06F4C52C9DE2BCBF695581718" + + "3995497CEA956AE515D2261898FA051015728E5A8AAAC42DAD33170D" + + "04507A33A85521ABDF1CBA64ECFB850458DBEF0A8AEA71575D060C7D" + + "B3970F85A6E1E4C7ABF5AE8CDB0933D71E8C94E04A25619DCEE3D226" + + "1AD2EE6BF12FFA06D98A0864D87602733EC86A64521F2B18177B200C" + + "BBE117577A615D6C770988C0BAD946E208E24FA074E5AB3143DB5BFC" + + "E0FD108E4B82D120A92108011A723C12A787E6D788719A10BDBA5B26" + + "99C327186AF4E23C1A946834B6150BDA2583E9CA2AD44CE8DBBBC2DB" + + "04DE8EF92E8EFC141FBECAA6287C59474E6BC05D99B2964FA090C3A2" + + "233BA186515BE7ED1F612970CEE2D7AFB81BDD762170481CD0069127" + + "D5B05AA993B4EA988D8FDDC186FFB7DC90A6C08F4DF435C934028492" + + "36C3FAB4D27C7026C1D4DCB2602646DEC9751E763DBA37BDF8FF9406" + + "AD9E530EE5DB382F413001AEB06A53ED9027D831179727B0865A8918" + + "DA3EDBEBCF9B14ED44CE6CBACED4BB1BDB7F1447E6CC254B33205151" + + "2BD7AF426FB8F401378CD2BF5983CA01C64B92ECF032EA15D1721D03" + + "F482D7CE6E74FEF6D55E702F46980C82B5A84031900B1C9E59E7C97F" + + "BEC7E8F323A97A7E36CC88BE0F1D45B7FF585AC54BD407B22B4154AA" + + "CC8F6D7EBF48E1D814CC5ED20F8037E0A79715EEF29BE32806A1D58B" + + "B7C5DA76F550AA3D8A1FBFF0EB19CCB1A313D55CDA56C9EC2EF29632" + + "387FE8D76E3C0468043E8F663F4860EE12BF2D5B0B7474D6E694F91E" + + "6DCC4024FFFFFFFFFFFFFFFF", + base=16, + ), + "generator": 2, + }, + # 8192-bit + 18: { + "prime": int( + "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1" + + "29024E088A67CC74020BBEA63B139B22514A08798E3404DD" + + "EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245" + + "E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED" + + "EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3D" + + "C2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F" + + "83655D23DCA3AD961C62F356208552BB9ED529077096966D" + + "670C354E4ABC9804F1746C08CA18217C32905E462E36CE3B" + + "E39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9" + + "DE2BCBF6955817183995497CEA956AE515D2261898FA0510" + + "15728E5A8AAAC42DAD33170D04507A33A85521ABDF1CBA64" + + "ECFB850458DBEF0A8AEA71575D060C7DB3970F85A6E1E4C7" + + "ABF5AE8CDB0933D71E8C94E04A25619DCEE3D2261AD2EE6B" + + "F12FFA06D98A0864D87602733EC86A64521F2B18177B200C" + + "BBE117577A615D6C770988C0BAD946E208E24FA074E5AB31" + + "43DB5BFCE0FD108E4B82D120A92108011A723C12A787E6D7" + + "88719A10BDBA5B2699C327186AF4E23C1A946834B6150BDA" + + "2583E9CA2AD44CE8DBBBC2DB04DE8EF92E8EFC141FBECAA6" + + "287C59474E6BC05D99B2964FA090C3A2233BA186515BE7ED" + + "1F612970CEE2D7AFB81BDD762170481CD0069127D5B05AA9" + + "93B4EA988D8FDDC186FFB7DC90A6C08F4DF435C934028492" + + "36C3FAB4D27C7026C1D4DCB2602646DEC9751E763DBA37BD" + + "F8FF9406AD9E530EE5DB382F413001AEB06A53ED9027D831" + + "179727B0865A8918DA3EDBEBCF9B14ED44CE6CBACED4BB1B" + + "DB7F1447E6CC254B332051512BD7AF426FB8F401378CD2BF" + + "5983CA01C64B92ECF032EA15D1721D03F482D7CE6E74FEF6" + + "D55E702F46980C82B5A84031900B1C9E59E7C97FBEC7E8F3" + + "23A97A7E36CC88BE0F1D45B7FF585AC54BD407B22B4154AA" + + "CC8F6D7EBF48E1D814CC5ED20F8037E0A79715EEF29BE328" + + "06A1D58BB7C5DA76F550AA3D8A1FBFF0EB19CCB1A313D55C" + + "DA56C9EC2EF29632387FE8D76E3C0468043E8F663F4860EE" + + "12BF2D5B0B7474D6E694F91E6DBE115974A3926F12FEE5E4" + + "38777CB6A932DF8CD8BEC4D073B931BA3BC832B68D9DD300" + + "741FA7BF8AFC47ED2576F6936BA424663AAB639C5AE4F568" + + "3423B4742BF1C978238F16CBE39D652DE3FDB8BEFC848AD9" + + "22222E04A4037C0713EB57A81A23F0C73473FC646CEA306B" + + "4BCBC8862F8385DDFA9D4B7FA2C087E879683303ED5BDD3A" + + "062B3CF5B3A278A66D2A13F83F44F82DDF310EE074AB6A36" + + "4597E899A0255DC164F31CC50846851DF9AB48195DED7EA1" + + "B1D510BD7EE74D73FAF36BC31ECFA268359046F4EB879F92" + + "4009438B481C6CD7889A002ED5EE382BC9190DA6FC026E47" + + "9558E4475677E9AA9E3050E2765694DFC81F56E880B96E71" + + "60C980DD98EDD3DFFFFFFFFFFFFFFFFF", + base=16, + ), + "generator": 2, + }, +} + + +class DiffieHellman: + """ + Class to represent the Diffie-Hellman key exchange protocol + + + >>> alice = DiffieHellman() + >>> bob = DiffieHellman() + + >>> alice_private = alice.get_private_key() + >>> alice_public = alice.generate_public_key() + + >>> bob_private = bob.get_private_key() + >>> bob_public = bob.generate_public_key() + + >>> # generating shared key using the DH object + >>> alice_shared = alice.generate_shared_key(bob_public) + >>> bob_shared = bob.generate_shared_key(alice_public) + + >>> assert alice_shared == bob_shared + + >>> # generating shared key using static methods + >>> alice_shared = DiffieHellman.generate_shared_key_static( + ... alice_private, bob_public + ... ) + >>> bob_shared = DiffieHellman.generate_shared_key_static( + ... bob_private, alice_public + ... ) + + >>> assert alice_shared == bob_shared + """ + + # Current minimum recommendation is 2048 bit (group 14) + def __init__(self, group: int = 14) -> None: + if group not in primes: + raise ValueError("Unsupported Group") + self.prime = primes[group]["prime"] + self.generator = primes[group]["generator"] + + self.__private_key = int(hexlify(urandom(32)), base=16) + + def get_private_key(self) -> str: + return hex(self.__private_key)[2:] + + def generate_public_key(self) -> str: + public_key = pow(self.generator, self.__private_key, self.prime) + return hex(public_key)[2:] + + def is_valid_public_key(self, key: int) -> bool: + # check if the other public key is valid based on NIST SP800-56 + if 2 <= key and key <= self.prime - 2: + if pow(key, (self.prime - 1) // 2, self.prime) == 1: + return True + return False + + def generate_shared_key(self, other_key_str: str) -> str: + other_key = int(other_key_str, base=16) + if not self.is_valid_public_key(other_key): + raise ValueError("Invalid public key") + shared_key = pow(other_key, self.__private_key, self.prime) + return sha256(str(shared_key).encode()).hexdigest() + + @staticmethod + def is_valid_public_key_static(remote_public_key_str: int, prime: int) -> bool: + # check if the other public key is valid based on NIST SP800-56 + if 2 <= remote_public_key_str and remote_public_key_str <= prime - 2: + if pow(remote_public_key_str, (prime - 1) // 2, prime) == 1: + return True + return False + + @staticmethod + def generate_shared_key_static( + local_private_key_str: str, remote_public_key_str: str, group: int = 14 + ) -> str: + local_private_key = int(local_private_key_str, base=16) + remote_public_key = int(remote_public_key_str, base=16) + prime = primes[group]["prime"] + if not DiffieHellman.is_valid_public_key_static(remote_public_key, prime): + raise ValueError("Invalid public key") + shared_key = pow(remote_public_key, local_private_key, prime) + return sha256(str(shared_key).encode()).hexdigest() + + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/ciphers/elgamal_key_generator.py b/python-mega-algo/ciphers/elgamal_key_generator.py new file mode 100644 index 00000000..f557b0e0 --- /dev/null +++ b/python-mega-algo/ciphers/elgamal_key_generator.py @@ -0,0 +1,71 @@ +import os +import random +import sys + +from . import cryptomath_module as cryptomath +from . import rabin_miller + +min_primitive_root = 3 + + +# I have written my code naively same as definition of primitive root +# however every time I run this program, memory exceeded... +# so I used 4.80 Algorithm in +# Handbook of Applied Cryptography(CRC Press, ISBN : 0-8493-8523-7, October 1996) +# and it seems to run nicely! +def primitive_root(p_val: int) -> int: + print("Generating primitive root of p") + while True: + g = random.randrange(3, p_val) + if pow(g, 2, p_val) == 1: + continue + if pow(g, p_val, p_val) == 1: + continue + return g + + +def generate_key(key_size: int) -> tuple[tuple[int, int, int, int], tuple[int, int]]: + print("Generating prime p...") + p = rabin_miller.generateLargePrime(key_size) # select large prime number. + e_1 = primitive_root(p) # one primitive root on modulo p. + d = random.randrange(3, p) # private_key -> have to be greater than 2 for safety. + e_2 = cryptomath.find_mod_inverse(pow(e_1, d, p), p) + + public_key = (key_size, e_1, e_2, p) + private_key = (key_size, d) + + return public_key, private_key + + +def make_key_files(name: str, keySize: int) -> None: + if os.path.exists("%s_pubkey.txt" % name) or os.path.exists( + "%s_privkey.txt" % name + ): + print("\nWARNING:") + print( + '"%s_pubkey.txt" or "%s_privkey.txt" already exists. \n' + "Use a different name or delete these files and re-run this program." + % (name, name) + ) + sys.exit() + + publicKey, privateKey = generate_key(keySize) + print("\nWriting public key to file %s_pubkey.txt..." % name) + with open("%s_pubkey.txt" % name, "w") as fo: + fo.write( + "%d,%d,%d,%d" % (publicKey[0], publicKey[1], publicKey[2], publicKey[3]) + ) + + print("Writing private key to file %s_privkey.txt..." % name) + with open("%s_privkey.txt" % name, "w") as fo: + fo.write("%d,%d" % (privateKey[0], privateKey[1])) + + +def main() -> None: + print("Making key files...") + make_key_files("elgamal", 2048) + print("Key files generation successful") + + +if __name__ == "__main__": + main() diff --git a/python-mega-algo/ciphers/enigma_machine2.py b/python-mega-algo/ciphers/enigma_machine2.py new file mode 100644 index 00000000..f4ce5a07 --- /dev/null +++ b/python-mega-algo/ciphers/enigma_machine2.py @@ -0,0 +1,293 @@ +""" +Wikipedia: https://en.wikipedia.org/wiki/Enigma_machine +Video explanation: https://youtu.be/QwQVMqfoB2E +Also check out Numberphile's and Computerphile's videos on this topic + +This module contains function 'enigma' which emulates +the famous Enigma machine from WWII. +Module includes: +- enigma function +- showcase of function usage +- 9 randnomly generated rotors +- reflector (aka static rotor) +- original alphabet + +Created by TrapinchO +""" + +RotorPositionT = tuple[int, int, int] +RotorSelectionT = tuple[str, str, str] + + +# used alphabet -------------------------- +# from string.ascii_uppercase +abc = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + +# -------------------------- default selection -------------------------- +# rotors -------------------------- +rotor1 = "EGZWVONAHDCLFQMSIPJBYUKXTR" +rotor2 = "FOBHMDKEXQNRAULPGSJVTYICZW" +rotor3 = "ZJXESIUQLHAVRMDOYGTNFWPBKC" +# reflector -------------------------- +reflector = { + "A": "N", + "N": "A", + "B": "O", + "O": "B", + "C": "P", + "P": "C", + "D": "Q", + "Q": "D", + "E": "R", + "R": "E", + "F": "S", + "S": "F", + "G": "T", + "T": "G", + "H": "U", + "U": "H", + "I": "V", + "V": "I", + "J": "W", + "W": "J", + "K": "X", + "X": "K", + "L": "Y", + "Y": "L", + "M": "Z", + "Z": "M", +} + +# -------------------------- extra rotors -------------------------- +rotor4 = "RMDJXFUWGISLHVTCQNKYPBEZOA" +rotor5 = "SGLCPQWZHKXAREONTFBVIYJUDM" +rotor6 = "HVSICLTYKQUBXDWAJZOMFGPREN" +rotor7 = "RZWQHFMVDBKICJLNTUXAGYPSOE" +rotor8 = "LFKIJODBEGAMQPXVUHYSTCZRWN" +rotor9 = "KOAEGVDHXPQZMLFTYWJNBRCIUS" + + +def _validator( + rotpos: RotorPositionT, rotsel: RotorSelectionT, pb: str +) -> tuple[RotorPositionT, RotorSelectionT, dict[str, str]]: + """ + Checks if the values can be used for the 'enigma' function + + >>> _validator((1,1,1), (rotor1, rotor2, rotor3), 'POLAND') + ((1, 1, 1), ('EGZWVONAHDCLFQMSIPJBYUKXTR', 'FOBHMDKEXQNRAULPGSJVTYICZW', \ +'ZJXESIUQLHAVRMDOYGTNFWPBKC'), \ +{'P': 'O', 'O': 'P', 'L': 'A', 'A': 'L', 'N': 'D', 'D': 'N'}) + + :param rotpos: rotor_positon + :param rotsel: rotor_selection + :param pb: plugb -> validated and transformed + :return: (rotpos, rotsel, pb) + """ + # Checks if there are 3 unique rotors + + unique_rotsel = len(set(rotsel)) + if unique_rotsel < 3: + raise Exception(f"Please use 3 unique rotors (not {unique_rotsel})") + + # Checks if rotor positions are valid + rotorpos1, rotorpos2, rotorpos3 = rotpos + if not 0 < rotorpos1 <= len(abc): + raise ValueError( + f"First rotor position is not within range of 1..26 (" f"{rotorpos1}" + ) + if not 0 < rotorpos2 <= len(abc): + raise ValueError( + f"Second rotor position is not within range of 1..26 (" f"{rotorpos2})" + ) + if not 0 < rotorpos3 <= len(abc): + raise ValueError( + f"Third rotor position is not within range of 1..26 (" f"{rotorpos3})" + ) + + # Validates string and returns dict + pbdict = _plugboard(pb) + + return rotpos, rotsel, pbdict + + +def _plugboard(pbstring: str) -> dict[str, str]: + """ + https://en.wikipedia.org/wiki/Enigma_machine#Plugboard + + >>> _plugboard('PICTURES') + {'P': 'I', 'I': 'P', 'C': 'T', 'T': 'C', 'U': 'R', 'R': 'U', 'E': 'S', 'S': 'E'} + >>> _plugboard('POLAND') + {'P': 'O', 'O': 'P', 'L': 'A', 'A': 'L', 'N': 'D', 'D': 'N'} + + In the code, 'pb' stands for 'plugboard' + + Pairs can be separated by spaces + :param pbstring: string containing plugboard setting for the Enigma machine + :return: dictionary containing converted pairs + """ + + # tests the input string if it + # a) is type string + # b) has even length (so pairs can be made) + if not isinstance(pbstring, str): + raise TypeError(f"Plugboard setting isn't type string ({type(pbstring)})") + elif len(pbstring) % 2 != 0: + raise Exception(f"Odd number of symbols ({len(pbstring)})") + elif pbstring == "": + return {} + + pbstring.replace(" ", "") + + # Checks if all characters are unique + tmppbl = set() + for i in pbstring: + if i not in abc: + raise Exception(f"'{i}' not in list of symbols") + elif i in tmppbl: + raise Exception(f"Duplicate symbol ({i})") + else: + tmppbl.add(i) + del tmppbl + + # Created the dictionary + pb = {} + for j in range(0, len(pbstring) - 1, 2): + pb[pbstring[j]] = pbstring[j + 1] + pb[pbstring[j + 1]] = pbstring[j] + + return pb + + +def enigma( + text: str, + rotor_position: RotorPositionT, + rotor_selection: RotorSelectionT = (rotor1, rotor2, rotor3), + plugb: str = "", +) -> str: + """ + The only difference with real-world enigma is that I allowed string input. + All characters are converted to uppercase. (non-letter symbol are ignored) + How it works: + (for every letter in the message) + + - Input letter goes into the plugboard. + If it is connected to another one, switch it. + + - Letter goes through 3 rotors. + Each rotor can be represented as 2 sets of symbol, where one is shuffled. + Each symbol from the first set has corresponding symbol in + the second set and vice versa. + + example: + | ABCDEFGHIJKLMNOPQRSTUVWXYZ | e.g. F=D and D=F + | VKLEPDBGRNWTFCJOHQAMUZYIXS | + + - Symbol then goes through reflector (static rotor). + There it is switched with paired symbol + The reflector can be represented as2 sets, each with half of the alphanet. + There are usually 10 pairs of letters. + + Example: + | ABCDEFGHIJKLM | e.g. E is paired to X + | ZYXWVUTSRQPON | so when E goes in X goes out and vice versa + + - Letter then goes through the rotors again + + - If the letter is connected to plugboard, it is switched. + + - Return the letter + + >>> enigma('Hello World!', (1, 2, 1), plugb='pictures') + 'KORYH JUHHI!' + >>> enigma('KORYH, juhhi!', (1, 2, 1), plugb='pictures') + 'HELLO, WORLD!' + >>> enigma('hello world!', (1, 1, 1), plugb='pictures') + 'FPNCZ QWOBU!' + >>> enigma('FPNCZ QWOBU', (1, 1, 1), plugb='pictures') + 'HELLO WORLD' + + + :param text: input message + :param rotor_position: tuple with 3 values in range 1..26 + :param rotor_selection: tuple with 3 rotors () + :param plugb: string containing plugboard configuration (default '') + :return: en/decrypted string + """ + + text = text.upper() + rotor_position, rotor_selection, plugboard = _validator( + rotor_position, rotor_selection, plugb.upper() + ) + + rotorpos1, rotorpos2, rotorpos3 = rotor_position + rotor1, rotor2, rotor3 = rotor_selection + rotorpos1 -= 1 + rotorpos2 -= 1 + rotorpos3 -= 1 + + result = [] + + # encryption/decryption process -------------------------- + for symbol in text: + if symbol in abc: + + # 1st plugboard -------------------------- + if symbol in plugboard: + symbol = plugboard[symbol] + + # rotor ra -------------------------- + index = abc.index(symbol) + rotorpos1 + symbol = rotor1[index % len(abc)] + + # rotor rb -------------------------- + index = abc.index(symbol) + rotorpos2 + symbol = rotor2[index % len(abc)] + + # rotor rc -------------------------- + index = abc.index(symbol) + rotorpos3 + symbol = rotor3[index % len(abc)] + + # reflector -------------------------- + # this is the reason you don't need another machine to decipher + + symbol = reflector[symbol] + + # 2nd rotors + symbol = abc[rotor3.index(symbol) - rotorpos3] + symbol = abc[rotor2.index(symbol) - rotorpos2] + symbol = abc[rotor1.index(symbol) - rotorpos1] + + # 2nd plugboard + if symbol in plugboard: + symbol = plugboard[symbol] + + # moves/resets rotor positions + rotorpos1 += 1 + if rotorpos1 >= len(abc): + rotorpos1 = 0 + rotorpos2 += 1 + if rotorpos2 >= len(abc): + rotorpos2 = 0 + rotorpos3 += 1 + if rotorpos3 >= len(abc): + rotorpos3 = 0 + + # else: + # pass + # Error could be also raised + # raise ValueError( + # 'Invalid symbol('+repr(symbol)+')') + result.append(symbol) + + return "".join(result) + + +if __name__ == "__main__": + message = "This is my Python script that emulates the Enigma machine from WWII." + rotor_pos = (1, 1, 1) + pb = "pictures" + rotor_sel = (rotor2, rotor4, rotor8) + en = enigma(message, rotor_pos, rotor_sel, pb) + + print("Encrypted message:", en) + print("Decrypted message:", enigma(en, rotor_pos, rotor_sel, pb)) diff --git a/python-mega-algo/ciphers/hill_cipher.py b/python-mega-algo/ciphers/hill_cipher.py new file mode 100644 index 00000000..bc8f5b41 --- /dev/null +++ b/python-mega-algo/ciphers/hill_cipher.py @@ -0,0 +1,231 @@ +""" + +Hill Cipher: +The 'HillCipher' class below implements the Hill Cipher algorithm which uses +modern linear algebra techniques to encode and decode text using an encryption +key matrix. + +Algorithm: +Let the order of the encryption key be N (as it is a square matrix). +Your text is divided into batches of length N and converted to numerical vectors +by a simple mapping starting with A=0 and so on. + +The key is then multiplied with the newly created batch vector to obtain the +encoded vector. After each multiplication modular 36 calculations are performed +on the vectors so as to bring the numbers between 0 and 36 and then mapped with +their corresponding alphanumerics. + +While decrypting, the decrypting key is found which is the inverse of the +encrypting key modular 36. The same process is repeated for decrypting to get +the original message back. + +Constraints: +The determinant of the encryption key matrix must be relatively prime w.r.t 36. + +Note: +This implementation only considers alphanumerics in the text. If the length of +the text to be encrypted is not a multiple of the break key(the length of one +batch of letters), the last character of the text is added to the text until the +length of the text reaches a multiple of the break_key. So the text after +decrypting might be a little different than the original text. + +References: +https://apprendre-en-ligne.net/crypto/hill/Hillciph.pdf +https://www.youtube.com/watch?v=kfmNeskzs2o +https://www.youtube.com/watch?v=4RhLNDqcjpA + +""" +import string + +import numpy + + +def greatest_common_divisor(a: int, b: int) -> int: + """ + >>> greatest_common_divisor(4, 8) + 4 + >>> greatest_common_divisor(8, 4) + 4 + >>> greatest_common_divisor(4, 7) + 1 + >>> greatest_common_divisor(0, 10) + 10 + """ + return b if a == 0 else greatest_common_divisor(b % a, a) + + +class HillCipher: + key_string = string.ascii_uppercase + string.digits + # This cipher takes alphanumerics into account + # i.e. a total of 36 characters + + # take x and return x % len(key_string) + modulus = numpy.vectorize(lambda x: x % 36) + + to_int = numpy.vectorize(lambda x: round(x)) + + def __init__(self, encrypt_key: numpy.ndarray) -> None: + """ + encrypt_key is an NxN numpy array + """ + self.encrypt_key = self.modulus(encrypt_key) # mod36 calc's on the encrypt key + self.check_determinant() # validate the determinant of the encryption key + self.break_key = encrypt_key.shape[0] + + def replace_letters(self, letter: str) -> int: + """ + >>> hill_cipher = HillCipher(numpy.array([[2, 5], [1, 6]])) + >>> hill_cipher.replace_letters('T') + 19 + >>> hill_cipher.replace_letters('0') + 26 + """ + return self.key_string.index(letter) + + def replace_digits(self, num: int) -> str: + """ + >>> hill_cipher = HillCipher(numpy.array([[2, 5], [1, 6]])) + >>> hill_cipher.replace_digits(19) + 'T' + >>> hill_cipher.replace_digits(26) + '0' + """ + return self.key_string[round(num)] + + def check_determinant(self) -> None: + """ + >>> hill_cipher = HillCipher(numpy.array([[2, 5], [1, 6]])) + >>> hill_cipher.check_determinant() + """ + det = round(numpy.linalg.det(self.encrypt_key)) + + if det < 0: + det = det % len(self.key_string) + + req_l = len(self.key_string) + if greatest_common_divisor(det, len(self.key_string)) != 1: + raise ValueError( + f"determinant modular {req_l} of encryption key({det}) is not co prime " + f"w.r.t {req_l}.\nTry another key." + ) + + def process_text(self, text: str) -> str: + """ + >>> hill_cipher = HillCipher(numpy.array([[2, 5], [1, 6]])) + >>> hill_cipher.process_text('Testing Hill Cipher') + 'TESTINGHILLCIPHERR' + >>> hill_cipher.process_text('hello') + 'HELLOO' + """ + chars = [char for char in text.upper() if char in self.key_string] + + last = chars[-1] + while len(chars) % self.break_key != 0: + chars.append(last) + + return "".join(chars) + + def encrypt(self, text: str) -> str: + """ + >>> hill_cipher = HillCipher(numpy.array([[2, 5], [1, 6]])) + >>> hill_cipher.encrypt('testing hill cipher') + 'WHXYJOLM9C6XT085LL' + >>> hill_cipher.encrypt('hello') + '85FF00' + """ + text = self.process_text(text.upper()) + encrypted = "" + + for i in range(0, len(text) - self.break_key + 1, self.break_key): + batch = text[i : i + self.break_key] + vec = [self.replace_letters(char) for char in batch] + batch_vec = numpy.array([vec]).T + batch_encrypted = self.modulus(self.encrypt_key.dot(batch_vec)).T.tolist()[ + 0 + ] + encrypted_batch = "".join( + self.replace_digits(num) for num in batch_encrypted + ) + encrypted += encrypted_batch + + return encrypted + + def make_decrypt_key(self) -> numpy.ndarray: + """ + >>> hill_cipher = HillCipher(numpy.array([[2, 5], [1, 6]])) + >>> hill_cipher.make_decrypt_key() + array([[ 6, 25], + [ 5, 26]]) + """ + det = round(numpy.linalg.det(self.encrypt_key)) + + if det < 0: + det = det % len(self.key_string) + det_inv = None + for i in range(len(self.key_string)): + if (det * i) % len(self.key_string) == 1: + det_inv = i + break + + inv_key = ( + det_inv + * numpy.linalg.det(self.encrypt_key) + * numpy.linalg.inv(self.encrypt_key) + ) + + return self.to_int(self.modulus(inv_key)) + + def decrypt(self, text: str) -> str: + """ + >>> hill_cipher = HillCipher(numpy.array([[2, 5], [1, 6]])) + >>> hill_cipher.decrypt('WHXYJOLM9C6XT085LL') + 'TESTINGHILLCIPHERR' + >>> hill_cipher.decrypt('85FF00') + 'HELLOO' + """ + decrypt_key = self.make_decrypt_key() + text = self.process_text(text.upper()) + decrypted = "" + + for i in range(0, len(text) - self.break_key + 1, self.break_key): + batch = text[i : i + self.break_key] + vec = [self.replace_letters(char) for char in batch] + batch_vec = numpy.array([vec]).T + batch_decrypted = self.modulus(decrypt_key.dot(batch_vec)).T.tolist()[0] + decrypted_batch = "".join( + self.replace_digits(num) for num in batch_decrypted + ) + decrypted += decrypted_batch + + return decrypted + + +def main() -> None: + N = int(input("Enter the order of the encryption key: ")) + hill_matrix = [] + + print("Enter each row of the encryption key with space separated integers") + for _ in range(N): + row = [int(x) for x in input().split()] + hill_matrix.append(row) + + hc = HillCipher(numpy.array(hill_matrix)) + + print("Would you like to encrypt or decrypt some text? (1 or 2)") + option = input("\n1. Encrypt\n2. Decrypt\n") + if option == "1": + text_e = input("What text would you like to encrypt?: ") + print("Your encrypted text is:") + print(hc.encrypt(text_e)) + elif option == "2": + text_d = input("What text would you like to decrypt?: ") + print("Your decrypted text is:") + print(hc.decrypt(text_d)) + + +if __name__ == "__main__": + import doctest + + doctest.testmod() + + main() diff --git a/python-mega-algo/ciphers/mixed_keyword_cypher.py b/python-mega-algo/ciphers/mixed_keyword_cypher.py new file mode 100644 index 00000000..17890217 --- /dev/null +++ b/python-mega-algo/ciphers/mixed_keyword_cypher.py @@ -0,0 +1,68 @@ +def mixed_keyword(key: str = "college", pt: str = "UNIVERSITY") -> str: + """ + + For key:hello + + H E L O + A B C D + F G I J + K M N P + Q R S T + U V W X + Y Z + and map vertically + + >>> mixed_keyword("college", "UNIVERSITY") # doctest: +NORMALIZE_WHITESPACE + {'A': 'C', 'B': 'A', 'C': 'I', 'D': 'P', 'E': 'U', 'F': 'Z', 'G': 'O', 'H': 'B', + 'I': 'J', 'J': 'Q', 'K': 'V', 'L': 'L', 'M': 'D', 'N': 'K', 'O': 'R', 'P': 'W', + 'Q': 'E', 'R': 'F', 'S': 'M', 'T': 'S', 'U': 'X', 'V': 'G', 'W': 'H', 'X': 'N', + 'Y': 'T', 'Z': 'Y'} + 'XKJGUFMJST' + """ + key = key.upper() + pt = pt.upper() + temp = [] + for i in key: + if i not in temp: + temp.append(i) + len_temp = len(temp) + # print(temp) + alpha = [] + modalpha = [] + for j in range(65, 91): + t = chr(j) + alpha.append(t) + if t not in temp: + temp.append(t) + # print(temp) + r = int(26 / 4) + # print(r) + k = 0 + for _ in range(r): + s = [] + for j in range(len_temp): + s.append(temp[k]) + if not (k < 25): + break + k += 1 + modalpha.append(s) + # print(modalpha) + d = {} + j = 0 + k = 0 + for j in range(len_temp): + for m in modalpha: + if not (len(m) - 1 >= j): + break + d[alpha[k]] = m[j] + if not k < 25: + break + k += 1 + print(d) + cypher = "" + for i in pt: + cypher += d[i] + return cypher + + +print(mixed_keyword("college", "UNIVERSITY")) diff --git a/python-mega-algo/ciphers/mono_alphabetic_ciphers.py b/python-mega-algo/ciphers/mono_alphabetic_ciphers.py new file mode 100644 index 00000000..46013f49 --- /dev/null +++ b/python-mega-algo/ciphers/mono_alphabetic_ciphers.py @@ -0,0 +1,63 @@ +from typing import Literal + +LETTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + + +def translate_message( + key: str, message: str, mode: Literal["encrypt", "decrypt"] +) -> str: + """ + >>> translate_message("QWERTYUIOPASDFGHJKLZXCVBNM","Hello World","encrypt") + 'Pcssi Bidsm' + """ + chars_a = LETTERS if mode == "decrypt" else key + chars_b = key if mode == "decrypt" else LETTERS + translated = "" + # loop through each symbol in the message + for symbol in message: + if symbol.upper() in chars_a: + # encrypt/decrypt the symbol + sym_index = chars_a.find(symbol.upper()) + if symbol.isupper(): + translated += chars_b[sym_index].upper() + else: + translated += chars_b[sym_index].lower() + else: + # symbol is not in LETTERS, just add it + translated += symbol + return translated + + +def encrypt_message(key: str, message: str) -> str: + """ + >>> encrypt_message("QWERTYUIOPASDFGHJKLZXCVBNM", "Hello World") + 'Pcssi Bidsm' + """ + return translate_message(key, message, "encrypt") + + +def decrypt_message(key: str, message: str) -> str: + """ + >>> decrypt_message("QWERTYUIOPASDFGHJKLZXCVBNM", "Hello World") + 'Itssg Vgksr' + """ + return translate_message(key, message, "decrypt") + + +def main() -> None: + message = "Hello World" + key = "QWERTYUIOPASDFGHJKLZXCVBNM" + mode = "decrypt" # set to 'encrypt' or 'decrypt' + + if mode == "encrypt": + translated = encrypt_message(key, message) + elif mode == "decrypt": + translated = decrypt_message(key, message) + print(f"Using the key {key}, the {mode}ed message is: {translated}") + + +if __name__ == "__main__": + import doctest + + doctest.testmod() + main() diff --git a/python-mega-algo/ciphers/morse_code_implementation.py b/python-mega-algo/ciphers/morse_code_implementation.py new file mode 100644 index 00000000..eec4183f --- /dev/null +++ b/python-mega-algo/ciphers/morse_code_implementation.py @@ -0,0 +1,97 @@ +# Python program to implement Morse Code Translator + +# Dictionary representing the morse code chart +MORSE_CODE_DICT = { + "A": ".-", + "B": "-...", + "C": "-.-.", + "D": "-..", + "E": ".", + "F": "..-.", + "G": "--.", + "H": "....", + "I": "..", + "J": ".---", + "K": "-.-", + "L": ".-..", + "M": "--", + "N": "-.", + "O": "---", + "P": ".--.", + "Q": "--.-", + "R": ".-.", + "S": "...", + "T": "-", + "U": "..-", + "V": "...-", + "W": ".--", + "X": "-..-", + "Y": "-.--", + "Z": "--..", + "1": ".----", + "2": "..---", + "3": "...--", + "4": "....-", + "5": ".....", + "6": "-....", + "7": "--...", + "8": "---..", + "9": "----.", + "0": "-----", + "&": ".-...", + "@": ".--.-.", + ":": "---...", + ",": "--..--", + ".": ".-.-.-", + "'": ".----.", + '"': ".-..-.", + "?": "..--..", + "/": "-..-.", + "=": "-...-", + "+": ".-.-.", + "-": "-....-", + "(": "-.--.", + ")": "-.--.-", + # Exclamation mark is not in ITU-R recommendation + "!": "-.-.--", +} + + +def encrypt(message: str) -> str: + cipher = "" + for letter in message: + if letter != " ": + cipher += MORSE_CODE_DICT[letter] + " " + else: + cipher += "/ " + + # Remove trailing space added on line 64 + return cipher[:-1] + + +def decrypt(message: str) -> str: + decipher = "" + letters = message.split(" ") + for letter in letters: + if letter != "/": + decipher += list(MORSE_CODE_DICT.keys())[ + list(MORSE_CODE_DICT.values()).index(letter) + ] + else: + decipher += " " + + return decipher + + +def main() -> None: + message = "Morse code here" + result = encrypt(message.upper()) + print(result) + + message = result + result = decrypt(message) + print(result) + + +if __name__ == "__main__": + main() diff --git a/python-mega-algo/ciphers/onepad_cipher.py b/python-mega-algo/ciphers/onepad_cipher.py new file mode 100644 index 00000000..3ace9b09 --- /dev/null +++ b/python-mega-algo/ciphers/onepad_cipher.py @@ -0,0 +1,31 @@ +import random + + +class Onepad: + @staticmethod + def encrypt(text: str) -> tuple[list[int], list[int]]: + """Function to encrypt text using pseudo-random numbers""" + plain = [ord(i) for i in text] + key = [] + cipher = [] + for i in plain: + k = random.randint(1, 300) + c = (i + k) * k + cipher.append(c) + key.append(k) + return cipher, key + + @staticmethod + def decrypt(cipher: list[int], key: list[int]) -> str: + """Function to decrypt text using pseudo-random numbers.""" + plain = [] + for i in range(len(key)): + p = int((cipher[i] - (key[i]) ** 2) / key[i]) + plain.append(chr(p)) + return "".join([i for i in plain]) + + +if __name__ == "__main__": + c, k = Onepad().encrypt("Hello") + print(c, k) + print(Onepad().decrypt(c, k)) diff --git a/python-mega-algo/ciphers/playfair_cipher.py b/python-mega-algo/ciphers/playfair_cipher.py new file mode 100644 index 00000000..7c0ee5bd --- /dev/null +++ b/python-mega-algo/ciphers/playfair_cipher.py @@ -0,0 +1,105 @@ +import itertools +import string +from typing import Generator, Iterable + + +def chunker(seq: Iterable[str], size: int) -> Generator[tuple[str, ...], None, None]: + it = iter(seq) + while True: + chunk = tuple(itertools.islice(it, size)) + if not chunk: + return + yield chunk + + +def prepare_input(dirty: str) -> str: + """ + Prepare the plaintext by up-casing it + and separating repeated letters with X's + """ + + dirty = "".join([c.upper() for c in dirty if c in string.ascii_letters]) + clean = "" + + if len(dirty) < 2: + return dirty + + for i in range(len(dirty) - 1): + clean += dirty[i] + + if dirty[i] == dirty[i + 1]: + clean += "X" + + clean += dirty[-1] + + if len(clean) & 1: + clean += "X" + + return clean + + +def generate_table(key: str) -> list[str]: + + # I and J are used interchangeably to allow + # us to use a 5x5 table (25 letters) + alphabet = "ABCDEFGHIKLMNOPQRSTUVWXYZ" + # we're using a list instead of a '2d' array because it makes the math + # for setting up the table and doing the actual encoding/decoding simpler + table = [] + + # copy key chars into the table if they are in `alphabet` ignoring duplicates + for char in key.upper(): + if char not in table and char in alphabet: + table.append(char) + + # fill the rest of the table in with the remaining alphabet chars + for char in alphabet: + if char not in table: + table.append(char) + + return table + + +def encode(plaintext: str, key: str) -> str: + table = generate_table(key) + plaintext = prepare_input(plaintext) + ciphertext = "" + + # https://en.wikipedia.org/wiki/Playfair_cipher#Description + for char1, char2 in chunker(plaintext, 2): + row1, col1 = divmod(table.index(char1), 5) + row2, col2 = divmod(table.index(char2), 5) + + if row1 == row2: + ciphertext += table[row1 * 5 + (col1 + 1) % 5] + ciphertext += table[row2 * 5 + (col2 + 1) % 5] + elif col1 == col2: + ciphertext += table[((row1 + 1) % 5) * 5 + col1] + ciphertext += table[((row2 + 1) % 5) * 5 + col2] + else: # rectangle + ciphertext += table[row1 * 5 + col2] + ciphertext += table[row2 * 5 + col1] + + return ciphertext + + +def decode(ciphertext: str, key: str) -> str: + table = generate_table(key) + plaintext = "" + + # https://en.wikipedia.org/wiki/Playfair_cipher#Description + for char1, char2 in chunker(ciphertext, 2): + row1, col1 = divmod(table.index(char1), 5) + row2, col2 = divmod(table.index(char2), 5) + + if row1 == row2: + plaintext += table[row1 * 5 + (col1 - 1) % 5] + plaintext += table[row2 * 5 + (col2 - 1) % 5] + elif col1 == col2: + plaintext += table[((row1 - 1) % 5) * 5 + col1] + plaintext += table[((row2 - 1) % 5) * 5 + col2] + else: # rectangle + plaintext += table[row1 * 5 + col2] + plaintext += table[row2 * 5 + col1] + + return plaintext diff --git a/python-mega-algo/ciphers/porta_cipher.py b/python-mega-algo/ciphers/porta_cipher.py new file mode 100644 index 00000000..498ae294 --- /dev/null +++ b/python-mega-algo/ciphers/porta_cipher.py @@ -0,0 +1,103 @@ +alphabet = { + "A": ("ABCDEFGHIJKLM", "NOPQRSTUVWXYZ"), + "B": ("ABCDEFGHIJKLM", "NOPQRSTUVWXYZ"), + "C": ("ABCDEFGHIJKLM", "ZNOPQRSTUVWXY"), + "D": ("ABCDEFGHIJKLM", "ZNOPQRSTUVWXY"), + "E": ("ABCDEFGHIJKLM", "YZNOPQRSTUVWX"), + "F": ("ABCDEFGHIJKLM", "YZNOPQRSTUVWX"), + "G": ("ABCDEFGHIJKLM", "XYZNOPQRSTUVW"), + "H": ("ABCDEFGHIJKLM", "XYZNOPQRSTUVW"), + "I": ("ABCDEFGHIJKLM", "WXYZNOPQRSTUV"), + "J": ("ABCDEFGHIJKLM", "WXYZNOPQRSTUV"), + "K": ("ABCDEFGHIJKLM", "VWXYZNOPQRSTU"), + "L": ("ABCDEFGHIJKLM", "VWXYZNOPQRSTU"), + "M": ("ABCDEFGHIJKLM", "UVWXYZNOPQRST"), + "N": ("ABCDEFGHIJKLM", "UVWXYZNOPQRST"), + "O": ("ABCDEFGHIJKLM", "TUVWXYZNOPQRS"), + "P": ("ABCDEFGHIJKLM", "TUVWXYZNOPQRS"), + "Q": ("ABCDEFGHIJKLM", "STUVWXYZNOPQR"), + "R": ("ABCDEFGHIJKLM", "STUVWXYZNOPQR"), + "S": ("ABCDEFGHIJKLM", "RSTUVWXYZNOPQ"), + "T": ("ABCDEFGHIJKLM", "RSTUVWXYZNOPQ"), + "U": ("ABCDEFGHIJKLM", "QRSTUVWXYZNOP"), + "V": ("ABCDEFGHIJKLM", "QRSTUVWXYZNOP"), + "W": ("ABCDEFGHIJKLM", "PQRSTUVWXYZNO"), + "X": ("ABCDEFGHIJKLM", "PQRSTUVWXYZNO"), + "Y": ("ABCDEFGHIJKLM", "OPQRSTUVWXYZN"), + "Z": ("ABCDEFGHIJKLM", "OPQRSTUVWXYZN"), +} + + +def generate_table(key: str) -> list[tuple[str, str]]: + """ + >>> generate_table('marvin') # doctest: +NORMALIZE_WHITESPACE + [('ABCDEFGHIJKLM', 'UVWXYZNOPQRST'), ('ABCDEFGHIJKLM', 'NOPQRSTUVWXYZ'), + ('ABCDEFGHIJKLM', 'STUVWXYZNOPQR'), ('ABCDEFGHIJKLM', 'QRSTUVWXYZNOP'), + ('ABCDEFGHIJKLM', 'WXYZNOPQRSTUV'), ('ABCDEFGHIJKLM', 'UVWXYZNOPQRST')] + """ + return [alphabet[char] for char in key.upper()] + + +def encrypt(key: str, words: str) -> str: + """ + >>> encrypt('marvin', 'jessica') + 'QRACRWU' + """ + cipher = "" + count = 0 + table = generate_table(key) + for char in words.upper(): + cipher += get_opponent(table[count], char) + count = (count + 1) % len(table) + return cipher + + +def decrypt(key: str, words: str) -> str: + """ + >>> decrypt('marvin', 'QRACRWU') + 'JESSICA' + """ + return encrypt(key, words) + + +def get_position(table: tuple[str, str], char: str) -> tuple[int, int]: + """ + >>> get_position(generate_table('marvin')[0], 'M') + (0, 12) + """ + # `char` is either in the 0th row or the 1st row + row = 0 if char in table[0] else 1 + col = table[row].index(char) + return row, col + + +def get_opponent(table: tuple[str, str], char: str) -> str: + """ + >>> get_opponent(generate_table('marvin')[0], 'M') + 'T' + """ + row, col = get_position(table, char.upper()) + if row == 1: + return table[0][col] + else: + return table[1][col] if row == 0 else char + + +if __name__ == "__main__": + import doctest + + doctest.testmod() # Fist ensure that all our tests are passing... + """ + Demo: + + Enter key: marvin + Enter text to encrypt: jessica + Encrypted: QRACRWU + Decrypted with key: JESSICA + """ + key = input("Enter key: ").strip() + text = input("Enter text to encrypt: ").strip() + cipher_text = encrypt(key, text) + + print(f"Encrypted: {cipher_text}") + print(f"Decrypted with key: {decrypt(key, cipher_text)}") diff --git a/python-mega-algo/ciphers/prehistoric_men.txt b/python-mega-algo/ciphers/prehistoric_men.txt new file mode 100644 index 00000000..a58e533a --- /dev/null +++ b/python-mega-algo/ciphers/prehistoric_men.txt @@ -0,0 +1,7193 @@ +The Project Gutenberg eBook, Prehistoric Men, by Robert J. (Robert John) +Braidwood, Illustrated by Susan T. Richert + + +This eBook is for the use of anyone anywhere in the United States and most +other parts of the world at no cost and with almost no restrictions +whatsoever. You may copy it, give it away or re-use it under the terms of +the Project Gutenberg License included with this eBook or online at +www.gutenberg.org. If you are not located in the United States, you'll have +to check the laws of the country where you are located before using this ebook. + + +Title: Prehistoric Men +Author: Robert J. (Robert John) Braidwood +Release Date: July 28, 2016 [eBook #52664] +Language: English +Character set encoding: UTF-8 + + +***START OF THE PROJECT GUTENBERG EBOOK PREHISTORIC MEN*** + + +E-text prepared by Stephen Hutcheson, Dave Morgan, Charlie Howard, and the +Online Distributed Proofreading Team (http://www.pgdp.net) + + + +Note: Project Gutenberg also has an HTML version of this + file which includes the original illustrations. + See 52664-h.htm or 52664-h.zip: + (http://www.gutenberg.org/files/52664/52664-h/52664-h.htm) + or + (http://www.gutenberg.org/files/52664/52664-h.zip) + + +Transcriber's note: + + Some characters might not display in this UTF-8 text + version. If so, the reader should consult the HTML + version referred to above. One example of this might + occur in the second paragraph under "Choppers and + Adze-like Tools", page 46, which contains the phrase + “an adze cutting edge is ? shaped”. The symbol before + “shaped” looks like a sharply-italicized sans-serif “L”. + Devices that cannot display that symbol may substitute + a question mark, a square, or other symbol. + + +PREHISTORIC MEN + +by + +ROBERT J. BRAIDWOOD + +Research Associate, Old World Prehistory + +Professor +Oriental Institute and Department of Anthropology +University of Chicago + +Drawings by Susan T. Richert + + +[Illustration] + +Chicago Natural History Museum +Popular Series +Anthropology, Number 37 + +Third Edition Issued in Co-operation with +The Oriental Institute, The University of Chicago + +Edited by Lillian A. Ross + +Printed in the United States of America +by Chicago Natural History Museum Press + +Copyright 1948, 1951, and 1957 by Chicago Natural History Museum + +First edition 1948 +Second edition 1951 +Third edition 1957 +Fourth edition 1959 + + +Preface + +[Illustration] + + +Like the writing of most professional archeologists, mine has been +confined to so-called learned papers. Good, bad, or indifferent, these +papers were in a jargon that only my colleagues and a few advanced +students could understand. Hence, when I was asked to do this little +book, I soon found it extremely difficult to say what I meant in simple +fashion. The style is new to me, but I hope the reader will not find it +forced or pedantic; at least I have done my very best to tell the story +simply and clearly. + +Many friends have aided in the preparation of the book. The whimsical +charm of Miss Susan Richert’s illustrations add enormously to the +spirit I wanted. She gave freely of her own time on the drawings and +in planning the book with me. My colleagues at the University of +Chicago, especially Professor Wilton M. Krogman (now of the University +of Pennsylvania), and also Mrs. Linda Braidwood, Associate of the +Oriental Institute, and Professors Fay-Cooper Cole and Sol Tax, of +the Department of Anthropology, gave me counsel in matters bearing on +their special fields, and the Department of Anthropology bore some of +the expense of the illustrations. From Mrs. Irma Hunter and Mr. Arnold +Maremont, who are not archeologists at all and have only an intelligent +layman’s notion of archeology, I had sound advice on how best to tell +the story. I am deeply indebted to all these friends. + +While I was preparing the second edition, I had the great fortune +to be able to rework the third chapter with Professor Sherwood L. +Washburn, now of the Department of Anthropology of the University of +California, and the fourth, fifth, and sixth chapters with Professor +Hallum L. Movius, Jr., of the Peabody Museum, Harvard University. The +book has gained greatly in accuracy thereby. In matters of dating, +Professor Movius and the indications of Professor W. F. Libby’s Carbon +14 chronology project have both encouraged me to choose the lowest +dates now current for the events of the Pleistocene Ice Age. There is +still no certain way of fixing a direct chronology for most of the +Pleistocene, but Professor Libby’s method appears very promising for +its end range and for proto-historic dates. In any case, this book +names “periods,” and new dates may be written in against mine, if new +and better dating systems appear. + +I wish to thank Dr. Clifford C. Gregg, Director of Chicago Natural +History Museum, for the opportunity to publish this book. My old +friend, Dr. Paul S. Martin, Chief Curator in the Department of +Anthropology, asked me to undertake the job and inspired me to complete +it. I am also indebted to Miss Lillian A. Ross, Associate Editor of +Scientific Publications, and to Mr. George I. Quimby, Curator of +Exhibits in Anthropology, for all the time they have given me in +getting the manuscript into proper shape. + + ROBERT J. BRAIDWOOD + _June 15, 1950_ + + + + +Preface to the Third Edition + + +In preparing the enlarged third edition, many of the above mentioned +friends have again helped me. I have picked the brains of Professor F. +Clark Howell of the Department of Anthropology of the University of +Chicago in reworking the earlier chapters, and he was very patient in +the matter, which I sincerely appreciate. + +All of Mrs. Susan Richert Allen’s original drawings appear, but a few +necessary corrections have been made in some of the charts and some new +drawings have been added by Mr. John Pfiffner, Staff Artist, Chicago +Natural History Museum. + + ROBERT J. BRAIDWOOD + _March 1, 1959_ + + + + +Contents + + + PAGE + How We Learn about Prehistoric Men 7 + + The Changing World in Which Prehistoric Men Lived 17 + + Prehistoric Men Themselves 22 + + Cultural Beginnings 38 + + More Evidence of Culture 56 + + Early Moderns 70 + + End and Prelude 92 + + The First Revolution 121 + + The Conquest of Civilization 144 + + End of Prehistory 162 + + Summary 176 + + List of Books 180 + + Index 184 + + + + +HOW WE LEARN about Prehistoric Men + +[Illustration] + + +Prehistory means the time before written history began. Actually, more +than 99 per cent of man’s story is prehistory. Man is at least half a +million years old, but he did not begin to write history (or to write +anything) until about 5,000 years ago. + +The men who lived in prehistoric times left us no history books, but +they did unintentionally leave a record of their presence and their way +of life. This record is studied and interpreted by different kinds of +scientists. + + +SCIENTISTS WHO FIND OUT ABOUT PREHISTORIC MEN + +The scientists who study the bones and teeth and any other parts +they find of the bodies of prehistoric men, are called _physical +anthropologists_. Physical anthropologists are trained, much like +doctors, to know all about the human body. They study living people, +too; they know more about the biological facts of human “races” than +anybody else. If the police find a badly decayed body in a trunk, +they ask a physical anthropologist to tell them what the person +originally looked like. The physical anthropologists who specialize in +prehistoric men work with fossils, so they are sometimes called _human +paleontologists_. + + +ARCHEOLOGISTS + +There is a kind of scientist who studies the things that prehistoric +men made and did. Such a scientist is called an _archeologist_. It is +the archeologist’s business to look for the stone and metal tools, the +pottery, the graves, and the caves or huts of the men who lived before +history began. + +But there is more to archeology than just looking for things. In +Professor V. Gordon Childe’s words, archeology “furnishes a sort of +history of human activity, provided always that the actions have +produced concrete results and left recognizable material traces.” You +will see that there are at least three points in what Childe says: + + 1. The archeologists have to find the traces of things left behind by + ancient man, and + + 2. Only a few objects may be found, for most of these were probably + too soft or too breakable to last through the years. However, + + 3. The archeologist must use whatever he can find to tell a story--to + make a “sort of history”--from the objects and living-places and + graves that have escaped destruction. + +What I mean is this: Let us say you are walking through a dump yard, +and you find a rusty old spark plug. If you want to think about what +the spark plug means, you quickly remember that it is a part of an +automobile motor. This tells you something about the man who threw +the spark plug on the dump. He either had an automobile, or he knew +or lived near someone who did. He can’t have lived so very long ago, +you’ll remember, because spark plugs and automobiles are only about +sixty years old. + +When you think about the old spark plug in this way you have +just been making the beginnings of what we call an archeological +_interpretation_; you have been making the spark plug tell a story. +It is the same way with the man-made things we archeologists find +and put in museums. Usually, only a few of these objects are pretty +to look at; but each of them has some sort of story to tell. Making +the interpretation of his finds is the most important part of the +archeologist’s job. It is the way he gets at the “sort of history of +human activity” which is expected of archeology. + + +SOME OTHER SCIENTISTS + +There are many other scientists who help the archeologist and the +physical anthropologist find out about prehistoric men. The geologists +help us tell the age of the rocks or caves or gravel beds in which +human bones or man-made objects are found. There are other scientists +with names which all begin with “paleo” (the Greek word for “old”). The +_paleontologists_ study fossil animals. There are also, for example, +such scientists as _paleobotanists_ and _paleoclimatologists_, who +study ancient plants and climates. These scientists help us to know +the kinds of animals and plants that were living in prehistoric times +and so could be used for food by ancient man; what the weather was +like; and whether there were glaciers. Also, when I tell you that +prehistoric men did not appear until long after the great dinosaurs had +disappeared, I go on the say-so of the paleontologists. They know that +fossils of men and of dinosaurs are not found in the same geological +period. The dinosaur fossils come in early periods, the fossils of men +much later. + +Since World War II even the atomic scientists have been helping the +archeologists. By testing the amount of radioactivity left in charcoal, +wood, or other vegetable matter obtained from archeological sites, they +have been able to date the sites. Shell has been used also, and even +the hair of Egyptian mummies. The dates of geological and climatic +events have also been discovered. Some of this work has been done from +drillings taken from the bottom of the sea. + +This dating by radioactivity has considerably shortened the dates which +the archeologists used to give. If you find that some of the dates +I give here are more recent than the dates you see in other books +on prehistory, it is because I am using one of the new lower dating +systems. + +[Illustration: RADIOCARBON CHART + +The rate of disappearance of radioactivity as time passes.[1]] + + [1] It is important that the limitations of the radioactive carbon + “dating” system be held in mind. As the statistics involved in + the system are used, there are two chances in three that the + “date” of the sample falls within the range given as plus or + minus an added number of years. For example, the “date” for the + Jarmo village (see chart), given as 6750 ± 200 B.C., really + means that there are only two chances in three that the real + date of the charcoal sampled fell between 6950 and 6550 B.C. + We have also begun to suspect that there are ways in which the + samples themselves may have become “contaminated,” either on + the early or on the late side. We now tend to be suspicious of + single radioactive carbon determinations, or of determinations + from one site alone. But as a fabric of consistent + determinations for several or more sites of one archeological + period, we gain confidence in the “dates.” + + +HOW THE SCIENTISTS FIND OUT + +So far, this chapter has been mainly about the people who find out +about prehistoric men. We also need a word about _how_ they find out. + +All our finds came by accident until about a hundred years ago. Men +digging wells, or digging in caves for fertilizer, often turned up +ancient swords or pots or stone arrowheads. People also found some odd +pieces of stone that didn’t look like natural forms, but they also +didn’t look like any known tool. As a result, the people who found them +gave them queer names; for example, “thunderbolts.” The people thought +the strange stones came to earth as bolts of lightning. We know now +that these strange stones were prehistoric stone tools. + +Many important finds still come to us by accident. In 1935, a British +dentist, A. T. Marston, found the first of two fragments of a very +important fossil human skull, in a gravel pit at Swanscombe, on the +River Thames, England. He had to wait nine months, until the face of +the gravel pit had been dug eight yards farther back, before the second +fragment appeared. They fitted! Then, twenty years later, still another +piece appeared. In 1928 workmen who were blasting out rock for the +breakwater in the port of Haifa began to notice flint tools. Thus the +story of cave men on Mount Carmel, in Palestine, began to be known. + +Planned archeological digging is only about a century old. Even before +this, however, a few men realized the significance of objects they dug +from the ground; one of these early archeologists was our own Thomas +Jefferson. The first real mound-digger was a German grocer’s clerk, +Heinrich Schliemann. Schliemann made a fortune as a merchant, first +in Europe and then in the California gold-rush of 1849. He became an +American citizen. Then he retired and had both money and time to test +an old idea of his. He believed that the heroes of ancient Troy and +Mycenae were once real Trojans and Greeks. He proved it by going to +Turkey and Greece and digging up the remains of both cities. + +Schliemann had the great good fortune to find rich and spectacular +treasures, and he also had the common sense to keep notes and make +descriptions of what he found. He proved beyond doubt that many ancient +city mounds can be _stratified_. This means that there may be the +remains of many towns in a mound, one above another, like layers in a +cake. + +You might like to have an idea of how mounds come to be in layers. +The original settlers may have chosen the spot because it had a good +spring and there were good fertile lands nearby, or perhaps because +it was close to some road or river or harbor. These settlers probably +built their town of stone and mud-brick. Finally, something would have +happened to the town--a flood, or a burning, or a raid by enemies--and +the walls of the houses would have fallen in or would have melted down +as mud in the rain. Nothing would have remained but the mud and debris +of a low mound of _one_ layer. + +The second settlers would have wanted the spot for the same reasons +the first settlers did--good water, land, and roads. Also, the second +settlers would have found a nice low mound to build their houses on, +a protection from floods. But again, something would finally have +happened to the second town, and the walls of _its_ houses would have +come tumbling down. This makes the _second_ layer. And so on.... + +In Syria I once had the good fortune to dig on a large mound that had +no less than fifteen layers. Also, most of the layers were thick, and +there were signs of rebuilding and repairs within each layer. The mound +was more than a hundred feet high. In each layer, the building material +used had been a soft, unbaked mud-brick, and most of the debris +consisted of fallen or rain-melted mud from these mud-bricks. + +This idea of _stratification_, like the cake layers, was already a +familiar one to the geologists by Schliemann’s time. They could show +that their lowest layer of rock was oldest or earliest, and that the +overlying layers became more recent as one moved upward. Schliemann’s +digging proved the same thing at Troy. His first (lowest and earliest) +city had at least nine layers above it; he thought that the second +layer contained the remains of Homer’s Troy. We now know that Homeric +Troy was layer VIIa from the bottom; also, we count eleven layers or +sub-layers in total. + +Schliemann’s work marks the beginnings of modern archeology. Scholars +soon set out to dig on ancient sites, from Egypt to Central America. + + +ARCHEOLOGICAL INFORMATION + +As time went on, the study of archeological materials--found either +by accident or by digging on purpose--began to show certain things. +Archeologists began to get ideas as to the kinds of objects that +belonged together. If you compared a mail-order catalogue of 1890 with +one of today, you would see a lot of differences. If you really studied +the two catalogues hard, you would also begin to see that certain +objects “go together.” Horseshoes and metal buggy tires and pieces of +harness would begin to fit into a picture with certain kinds of coal +stoves and furniture and china dishes and kerosene lamps. Our friend +the spark plug, and radios and electric refrigerators and light bulbs +would fit into a picture with different kinds of furniture and dishes +and tools. You won’t be old enough to remember the kind of hats that +women wore in 1890, but you’ve probably seen pictures of them, and you +know very well they couldn’t be worn with the fashions of today. + +This is one of the ways that archeologists study their materials. +The various tools and weapons and jewelry, the pottery, the kinds +of houses, and even the ways of burying the dead tend to fit into +pictures. Some archeologists call all of the things that go together to +make such a picture an _assemblage_. The assemblage of the first layer +of Schliemann’s Troy was as different from that of the seventh layer as +our 1900 mail-order catalogue is from the one of today. + +The archeologists who came after Schliemann began to notice other +things and to compare them with occurrences in modern times. The +idea that people will buy better mousetraps goes back into very +ancient times. Today, if we make good automobiles or radios, we can +sell some of them in Turkey or even in Timbuktu. This means that a +few present-day types of American automobiles and radios form part +of present-day “assemblages” in both Turkey and Timbuktu. The total +present-day “assemblage” of Turkey is quite different from that of +Timbuktu or that of America, but they have at least some automobiles +and some radios in common. + +Now these automobiles and radios will eventually wear out. Let us +suppose we could go to some remote part of Turkey or to Timbuktu in a +dream. We don’t know what the date is, in our dream, but we see all +sorts of strange things and ways of living in both places. Nobody +tells us what the date is. But suddenly we see a 1936 Ford; so we +know that in our dream it has to be at least the year 1936, and only +as many years after that as we could reasonably expect a Ford to keep +in running order. The Ford would probably break down in twenty years’ +time, so the Turkish or Timbuktu “assemblage” we’re seeing in our dream +has to date at about A.D. 1936-56. + +Archeologists not only “date” their ancient materials in this way; they +also see over what distances and between which peoples trading was +done. It turns out that there was a good deal of trading in ancient +times, probably all on a barter and exchange basis. + + +EVERYTHING BEGINS TO FIT TOGETHER + +Now we need to pull these ideas all together and see the complicated +structure the archeologists can build with their materials. + +Even the earliest archeologists soon found that there was a very long +range of prehistoric time which would yield only very simple things. +For this very long early part of prehistory, there was little to be +found but the flint tools which wandering, hunting and gathering +people made, and the bones of the wild animals they ate. Toward the +end of prehistoric time there was a general settling down with the +coming of agriculture, and all sorts of new things began to be made. +Archeologists soon got a general notion of what ought to appear with +what. Thus, it would upset a French prehistorian digging at the bottom +of a very early cave if he found a fine bronze sword, just as much as +it would upset him if he found a beer bottle. The people of his very +early cave layer simply could not have made bronze swords, which came +later, just as do beer bottles. Some accidental disturbance of the +layers of his cave must have happened. + +With any luck, archeologists do their digging in a layered, stratified +site. They find the remains of everything that would last through +time, in several different layers. They know that the assemblage in +the bottom layer was laid down earlier than the assemblage in the next +layer above, and so on up to the topmost layer, which is the latest. +They look at the results of other “digs” and find that some other +archeologist 900 miles away has found ax-heads in his lowest layer, +exactly like the ax-heads of their fifth layer. This means that their +fifth layer must have been lived in at about the same time as was the +first layer in the site 200 miles away. It also may mean that the +people who lived in the two layers knew and traded with each other. Or +it could mean that they didn’t necessarily know each other, but simply +that both traded with a third group at about the same time. + +You can see that the more we dig and find, the more clearly the main +facts begin to stand out. We begin to be more sure of which people +lived at the same time, which earlier and which later. We begin to +know who traded with whom, and which peoples seemed to live off by +themselves. We begin to find enough skeletons in burials so that the +physical anthropologists can tell us what the people looked like. We +get animal bones, and a paleontologist may tell us they are all bones +of wild animals; or he may tell us that some or most of the bones are +those of domesticated animals, for instance, sheep or cattle, and +therefore the people must have kept herds. + +More important than anything else--as our structure grows more +complicated and our materials increase--is the fact that “a sort +of history of human activity” does begin to appear. The habits or +traditions that men formed in the making of their tools and in the +ways they did things, begin to stand out for us. How characteristic +were these habits and traditions? What areas did they spread over? +How long did they last? We watch the different tools and the traces +of the way things were done--how the burials were arranged, what +the living-places were like, and so on. We wonder about the people +themselves, for the traces of habits and traditions are useful to us +only as clues to the men who once had them. So we ask the physical +anthropologists about the skeletons that we found in the burials. The +physical anthropologists tell us about the anatomy and the similarities +and differences which the skeletons show when compared with other +skeletons. The physical anthropologists are even working on a +method--chemical tests of the bones--that will enable them to discover +what the blood-type may have been. One thing is sure. We have never +found a group of skeletons so absolutely similar among themselves--so +cast from a single mould, so to speak--that we could claim to have a +“pure” race. I am sure we never shall. + +We become particularly interested in any signs of change--when new +materials and tool types and ways of doing things replace old ones. We +watch for signs of social change and progress in one way or another. + +We must do all this without one word of written history to aid us. +Everything we are concerned with goes back to the time _before_ men +learned to write. That is the prehistorian’s job--to find out what +happened before history began. + + + + +THE CHANGING WORLD in which Prehistoric Men Lived + +[Illustration] + + +Mankind, we’ll say, is at least a half million years old. It is very +hard to understand how long a time half a million years really is. +If we were to compare this whole length of time to one day, we’d get +something like this: The present time is midnight, and Jesus was +born just five minutes and thirty-six seconds ago. Earliest history +began less than fifteen minutes ago. Everything before 11:45 was in +prehistoric time. + +Or maybe we can grasp the length of time better in terms of +generations. As you know, primitive peoples tend to marry and have +children rather early in life. So suppose we say that twenty years +will make an average generation. At this rate there would be 25,000 +generations in a half-million years. But our United States is much less +than ten generations old, twenty-five generations take us back before +the time of Columbus, Julius Caesar was alive just 100 generations ago, +David was king of Israel less than 150 generations ago, 250 generations +take us back to the beginning of written history. And there were 24,750 +generations of men before written history began! + +I should probably tell you that there is a new method of prehistoric +dating which would cut the earliest dates in my reckoning almost +in half. Dr. Cesare Emiliani, combining radioactive (C14) and +chemical (oxygen isotope) methods in the study of deep-sea borings, +has developed a system which would lower the total range of human +prehistory to about 300,000 years. The system is still too new to have +had general examination and testing. Hence, I have not used it in this +book; it would mainly affect the dates earlier than 25,000 years ago. + + +CHANGES IN ENVIRONMENT + +The earth probably hasn’t changed much in the last 5,000 years (250 +generations). Men have built things on its surface and dug into it and +drawn boundaries on maps of it, but the places where rivers, lakes, +seas, and mountains now stand have changed very little. + +In earlier times the earth looked very different. Geologists call the +last great geological period the _Pleistocene_. It began somewhere +between a half million and a million years ago, and was a time of great +changes. Sometimes we call it the Ice Age, for in the Pleistocene +there were at least three or four times when large areas of earth +were covered with glaciers. The reason for my uncertainty is that +while there seem to have been four major mountain or alpine phases of +glaciation, there may only have been three general continental phases +in the Old World.[2] + + [2] This is a complicated affair and I do not want to bother you + with its details. Both the alpine and the continental ice sheets + seem to have had minor fluctuations during their _main_ phases, + and the advances of the later phases destroyed many of the + traces of the earlier phases. The general textbooks have tended + to follow the names and numbers established for the Alps early + in this century by two German geologists. I will not bother you + with the names, but there were _four_ major phases. It is the + second of these alpine phases which seems to fit the traces of + the earliest of the great continental glaciations. In this book, + I will use the four-part system, since it is the most familiar, + but will add the word _alpine_ so you may remember to make the + transition to the continental system if you wish to do so. + +Glaciers are great sheets of ice, sometimes over a thousand feet +thick, which are now known only in Greenland and Antarctica and in +high mountains. During several of the glacial periods in the Ice Age, +the glaciers covered most of Canada and the northern United States and +reached down to southern England and France in Europe. Smaller ice +sheets sat like caps on the Rockies, the Alps, and the Himalayas. The +continental glaciation only happened north of the equator, however, so +remember that “Ice Age” is only half true. + +As you know, the amount of water on and about the earth does not vary. +These large glaciers contained millions of tons of water frozen into +ice. Because so much water was frozen and contained in the glaciers, +the water level of lakes and oceans was lowered. Flooded areas were +drained and appeared as dry land. There were times in the Ice Age when +there was no English Channel, so that England was not an island, and a +land bridge at the Dardanelles probably divided the Mediterranean from +the Black Sea. + +A very important thing for people living during the time of a +glaciation was the region adjacent to the glacier. They could not, of +course, live on the ice itself. The questions would be how close could +they live to it, and how would they have had to change their way of +life to do so. + + +GLACIERS CHANGE THE WEATHER + +Great sheets of ice change the weather. When the front of a glacier +stood at Milwaukee, the weather must have been bitterly cold in +Chicago. The climate of the whole world would have been different, and +you can see how animals and men would have been forced to move from one +place to another in search of food and warmth. + +On the other hand, it looks as if only a minor proportion of the whole +Ice Age was really taken up by times of glaciation. In between came +the _interglacial_ periods. During these times the climate around +Chicago was as warm as it is now, and sometimes even warmer. It may +interest you to know that the last great glacier melted away less than +10,000 years ago. Professor Ernst Antevs thinks we may be living in an +interglacial period and that the Ice Age may not be over yet. So if you +want to make a killing in real estate for your several hundred times +great-grandchildren, you might buy some land in the Arizona desert or +the Sahara. + +We do not yet know just why the glaciers appeared and disappeared, as +they did. It surely had something to do with an increase in rainfall +and a fall in temperature. It probably also had to do with a general +tendency for the land to rise at the beginning of the Pleistocene. We +know there was some mountain-building at that time. Hence, rain-bearing +winds nourished the rising and cooler uplands with snow. An increase +in all three of these factors--if they came together--would only have +needed to be slight. But exactly why this happened we do not know. + +The reason I tell you about the glaciers is simply to remind you of the +changing world in which prehistoric men lived. Their surroundings--the +animals and plants they used for food, and the weather they had to +protect themselves from--were always changing. On the other hand, this +change happened over so long a period of time and was so slow that +individual people could not have noticed it. Glaciers, about which they +probably knew nothing, moved in hundreds of miles to the north of them. +The people must simply have wandered ever more southward in search +of the plants and animals on which they lived. Or some men may have +stayed where they were and learned to hunt different animals and eat +different foods. Prehistoric men had to keep adapting themselves to new +environments and those who were most adaptive were most successful. + + +OTHER CHANGES + +Changes took place in the men themselves as well as in the ways they +lived. As time went on, they made better tools and weapons. Then, too, +we begin to find signs of how they started thinking of other things +than food and the tools to get it with. We find that they painted on +the walls of caves, and decorated their tools; we find that they buried +their dead. + +At about the time when the last great glacier was finally melting away, +men in the Near East made the first basic change in human economy. +They began to plant grain, and they learned to raise and herd certain +animals. This meant that they could store food in granaries and “on the +hoof” against the bad times of the year. This first really basic change +in man’s way of living has been called the “food-producing revolution.” +By the time it happened, a modern kind of climate was beginning. Men +had already grown to look as they do now. Know-how in ways of living +had developed and progressed, slowly but surely, up to a point. It was +impossible for men to go beyond that point if they only hunted and +fished and gathered wild foods. Once the basic change was made--once +the food-producing revolution became effective--technology leaped ahead +and civilization and written history soon began. + + + + +Prehistoric Men THEMSELVES + +[Illustration] + + +DO WE KNOW WHERE MAN ORIGINATED? + +For a long time some scientists thought the “cradle of mankind” was in +central Asia. Other scientists insisted it was in Africa, and still +others said it might have been in Europe. Actually, we don’t know +where it was. We don’t even know that there was only _one_ “cradle.” +If we had to choose a “cradle” at this moment, we would probably say +Africa. But the southern portions of Asia and Europe may also have been +included in the general area. The scene of the early development of +mankind was certainly the Old World. It is pretty certain men didn’t +reach North or South America until almost the end of the Ice Age--had +they done so earlier we would certainly have found some trace of them +by now. + +The earliest tools we have yet found come from central and south +Africa. By the dating system I’m using, these tools must be over +500,000 years old. There are now reports that a few such early tools +have been found--at the Sterkfontein cave in South Africa--along with +the bones of small fossil men called “australopithecines.” + +Not all scientists would agree that the australopithecines were “men,” +or would agree that the tools were made by the australopithecines +themselves. For these sticklers, the earliest bones of men come from +the island of Java. The date would be about 450,000 years ago. So far, +we have not yet found the tools which we suppose these earliest men in +the Far East must have made. + +Let me say it another way. How old are the earliest traces of men we +now have? Over half a million years. This was a time when the first +alpine glaciation was happening in the north. What has been found so +far? The tools which the men of those times made, in different parts +of Africa. It is now fairly generally agreed that the “men” who made +the tools were the australopithecines. There is also a more “man-like” +jawbone at Kanam in Kenya, but its find-spot has been questioned. The +next earliest bones we have were found in Java, and they may be almost +a hundred thousand years younger than the earliest African finds. We +haven’t yet found the tools of these early Javanese. Our knowledge of +tool-using in Africa spreads quickly as time goes on: soon after the +appearance of tools in the south we shall have them from as far north +as Algeria. + +Very soon after the earliest Javanese come the bones of slightly more +developed people in Java, and the jawbone of a man who once lived in +what is now Germany. The same general glacial beds which yielded the +later Javanese bones and the German jawbone also include tools. These +finds come from the time of the second alpine glaciation. + +So this is the situation. By the time of the end of the second alpine +or first continental glaciation (say 400,000 years ago) we have traces +of men from the extremes of the more southerly portions of the Old +World--South Africa, eastern Asia, and western Europe. There are also +some traces of men in the middle ground. In fact, Professor Franz +Weidenreich believed that creatures who were the immediate ancestors +of men had already spread over Europe, Africa, and Asia by the time +the Ice Age began. We certainly have no reason to disbelieve this, but +fortunate accidents of discovery have not yet given us the evidence to +prove it. + + +MEN AND APES + +Many people used to get extremely upset at the ill-formed notion +that “man descended from the apes.” Such words were much more likely +to start fights or “monkey trials” than the correct notion that all +living animals, including man, ascended or evolved from a single-celled +organism which lived in the primeval seas hundreds of millions of years +ago. Men are mammals, of the order called Primates, and man’s living +relatives are the great apes. Men didn’t “descend” from the apes or +apes from men, and mankind must have had much closer relatives who have +since become extinct. + +Men stand erect. They also walk and run on their two feet. Apes are +happiest in trees, swinging with their arms from branch to branch. +Few branches of trees will hold the mighty gorilla, although he still +manages to sleep in trees. Apes can’t stand really erect in our sense, +and when they have to run on the ground, they use the knuckles of their +hands as well as their feet. + +A key group of fossil bones here are the south African +australopithecines. These are called the _Australopithecinae_ or +“man-apes” or sometimes even “ape-men.” We do not _know_ that they were +directly ancestral to men but they can hardly have been so to apes. +Presently I’ll describe them a bit more. The reason I mention them +here is that while they had brains no larger than those of apes, their +hipbones were enough like ours so that they must have stood erect. +There is no good reason to think they couldn’t have walked as we do. + + +BRAINS, HANDS, AND TOOLS + +Whether the australopithecines were our ancestors or not, the proper +ancestors of men must have been able to stand erect and to walk on +their two feet. Three further important things probably were involved, +next, before they could become men proper. These are: + + 1. The increasing size and development of the brain. + + 2. The increasing usefulness (specialization) of the thumb and hand. + + 3. The use of tools. + +Nobody knows which of these three is most important, or which came +first. Most probably the growth of all three things was very much +blended together. If you think about each of the things, you will see +what I mean. Unless your hand is more flexible than a paw, and your +thumb will work against (or oppose) your fingers, you can’t hold a tool +very well. But you wouldn’t get the idea of using a tool unless you had +enough brain to help you see cause and effect. And it is rather hard to +see how your hand and brain would develop unless they had something to +practice on--like using tools. In Professor Krogman’s words, “the hand +must become the obedient servant of the eye and the brain.” It is the +_co-ordination_ of these things that counts. + +Many other things must have been happening to the bodies of the +creatures who were the ancestors of men. Our ancestors had to develop +organs of speech. More than that, they had to get the idea of letting +_certain sounds_ made with these speech organs have _certain meanings_. + +All this must have gone very slowly. Probably everything was developing +little by little, all together. Men became men very slowly. + + +WHEN SHALL WE CALL MEN MEN? + +What do I mean when I say “men”? People who looked pretty much as we +do, and who used different tools to do different things, are men to me. +We’ll probably never know whether the earliest ones talked or not. They +probably had vocal cords, so they could make sounds, but did they know +how to make sounds work as symbols to carry meanings? But if the fossil +bones look like our skeletons, and if we find tools which we’ll agree +couldn’t have been made by nature or by animals, then I’d say we had +traces of _men_. + +The australopithecine finds of the Transvaal and Bechuanaland, in +south Africa, are bound to come into the discussion here. I’ve already +told you that the australopithecines could have stood upright and +walked on their two hind legs. They come from the very base of the +Pleistocene or Ice Age, and a few coarse stone tools have been found +with the australopithecine fossils. But there are three varieties +of the australopithecines and they last on until a time equal to +that of the second alpine glaciation. They are the best suggestion +we have yet as to what the ancestors of men _may_ have looked like. +They were certainly closer to men than to apes. Although their brain +size was no larger than the brains of modern apes their body size and +stature were quite small; hence, relative to their small size, their +brains were large. We have not been able to prove without doubt that +the australopithecines were _tool-making_ creatures, even though the +recent news has it that tools have been found with australopithecine +bones. The doubt as to whether the australopithecines used the tools +themselves goes like this--just suppose some man-like creature (whose +bones we have not yet found) made the tools and used them to kill +and butcher australopithecines. Hence a few experts tend to let +australopithecines still hang in limbo as “man-apes.” + + +THE EARLIEST MEN WE KNOW + +I’ll postpone talking about the tools of early men until the next +chapter. The men whose bones were the earliest of the Java lot have +been given the name _Meganthropus_. The bones are very fragmentary. We +would not understand them very well unless we had the somewhat later +Javanese lot--the more commonly known _Pithecanthropus_ or “Java +man”--against which to refer them for study. One of the less well-known +and earliest fragments, a piece of lower jaw and some teeth, rather +strongly resembles the lower jaws and teeth of the australopithecine +type. Was _Meganthropus_ a sort of half-way point between the +australopithecines and _Pithecanthropus_? It is still too early to say. +We shall need more finds before we can be definite one way or the other. + +Java man, _Pithecanthropus_, comes from geological beds equal in age +to the latter part of the second alpine glaciation; the _Meganthropus_ +finds refer to beds of the beginning of this glaciation. The first +finds of Java man were made in 1891-92 by Dr. Eugene Dubois, a Dutch +doctor in the colonial service. Finds have continued to be made. There +are now bones enough to account for four skulls. There are also four +jaws and some odd teeth and thigh bones. Java man, generally speaking, +was about five feet six inches tall, and didn’t hold his head very +erect. His skull was very thick and heavy and had room for little more +than two-thirds as large a brain as we have. He had big teeth and a big +jaw and enormous eyebrow ridges. + +No tools were found in the geological deposits where bones of Java man +appeared. There are some tools in the same general area, but they come +a bit later in time. One reason we accept the Java man as man--aside +from his general anatomical appearance--is that these tools probably +belonged to his near descendants. + +Remember that there are several varieties of men in the whole early +Java lot, at least two of which are earlier than the _Pithecanthropus_, +“Java man.” Some of the earlier ones seem to have gone in for +bigness, in tooth-size at least. _Meganthropus_ is one of these +earlier varieties. As we said, he _may_ turn out to be a link to +the australopithecines, who _may_ or _may not_ be ancestral to men. +_Meganthropus_ is best understandable in terms of _Pithecanthropus_, +who appeared later in the same general area. _Pithecanthropus_ is +pretty well understandable from the bones he left us, and also because +of his strong resemblance to the fully tool-using cave-dwelling “Peking +man,” _Sinanthropus_, about whom we shall talk next. But you can see +that the physical anthropologists and prehistoric archeologists still +have a lot of work to do on the problem of earliest men. + + +PEKING MEN AND SOME EARLY WESTERNERS + +The earliest known Chinese are called _Sinanthropus_, or “Peking man,” +because the finds were made near that city. In World War II, the United +States Marine guard at our Embassy in Peking tried to help get the +bones out of the city before the Japanese attack. Nobody knows where +these bones are now. The Red Chinese accuse us of having stolen them. +They were last seen on a dock-side at a Chinese port. But should you +catch a Marine with a sack of old bones, perhaps we could achieve peace +in Asia by returning them! Fortunately, there is a complete set of +casts of the bones. + +Peking man lived in a cave in a limestone hill, made tools, cracked +animal bones to get the marrow out, and used fire. Incidentally, the +bones of Peking man were found because Chinese dig for what they call +“dragon bones” and “dragon teeth.” Uneducated Chinese buy these things +in their drug stores and grind them into powder for medicine. The +“dragon teeth” and “bones” are really fossils of ancient animals, and +sometimes of men. The people who supply the drug stores have learned +where to dig for strange bones and teeth. Paleontologists who get to +China go to the drug stores to buy fossils. In a roundabout way, this +is how the fallen-in cave of Peking man at Choukoutien was discovered. + +Peking man was not quite as tall as Java man but he probably stood +straighter. His skull looked very much like that of the Java skull +except that it had room for a slightly larger brain. His face was less +brutish than was Java man’s face, but this isn’t saying much. + +Peking man dates from early in the interglacial period following the +second alpine glaciation. He probably lived close to 350,000 years +ago. There are several finds to account for in Europe by about this +time, and one from northwest Africa. The very large jawbone found +near Heidelberg in Germany is doubtless even earlier than Peking man. +The beds where it was found are of second alpine glacial times, and +recently some tools have been said to have come from the same beds. +There is not much I need tell you about the Heidelberg jaw save that it +seems certainly to have belonged to an early man, and that it is very +big. + +Another find in Germany was made at Steinheim. It consists of the +fragmentary skull of a man. It is very important because of its +relative completeness, but it has not yet been fully studied. The bone +is thick, but the back of the head is neither very low nor primitive, +and the face is also not primitive. The forehead does, however, have +big ridges over the eyes. The more fragmentary skull from Swanscombe in +England (p. 11) has been much more carefully studied. Only the top and +back of that skull have been found. Since the skull rounds up nicely, +it has been assumed that the face and forehead must have been quite +“modern.” Careful comparison with Steinheim shows that this was not +necessarily so. This is important because it bears on the question of +how early truly “modern” man appeared. + +Recently two fragmentary jaws were found at Ternafine in Algeria, +northwest Africa. They look like the jaws of Peking man. Tools were +found with them. Since no jaws have yet been found at Steinheim or +Swanscombe, but the time is the same, one wonders if these people had +jaws like those of Ternafine. + + +WHAT HAPPENED TO JAVA AND PEKING MEN + +Professor Weidenreich thought that there were at least a dozen ways in +which the Peking man resembled the modern Mongoloids. This would seem +to indicate that Peking man was really just a very early Chinese. + +Several later fossil men have been found in the Java-Australian area. +The best known of these is the so-called Solo man. There are some finds +from Australia itself which we now know to be quite late. But it looks +as if we may assume a line of evolution from Java man down to the +modern Australian natives. During parts of the Ice Age there was a land +bridge all the way from Java to Australia. + + +TWO ENGLISHMEN WHO WEREN’T OLD + +The older textbooks contain descriptions of two English finds which +were thought to be very old. These were called Piltdown (_Eoanthropus +dawsoni_) and Galley Hill. The skulls were very modern in appearance. +In 1948-49, British scientists began making chemical tests which proved +that neither of these finds is very old. It is now known that both +“Piltdown man” and the tools which were said to have been found with +him were part of an elaborate fake! + + +TYPICAL “CAVE MEN” + +The next men we have to talk about are all members of a related group. +These are the Neanderthal group. “Neanderthal man” himself was found in +the Neander Valley, near Düsseldorf, Germany, in 1856. He was the first +human fossil to be recognized as such. + +[Illustration: PRINCIPAL KNOWN TYPES OF FOSSIL MEN + + CRO-MAGNON + NEANDERTHAL + MODERN SKULL + COMBE-CAPELLE + SINANTHROPUS + PITHECANTHROPUS] + +Some of us think that the neanderthaloids proper are only those people +of western Europe who didn’t get out before the beginning of the last +great glaciation, and who found themselves hemmed in by the glaciers +in the Alps and northern Europe. Being hemmed in, they intermarried +a bit too much and developed into a special type. Professor F. Clark +Howell sees it this way. In Europe, the earliest trace of men we +now know is the Heidelberg jaw. Evolution continued in Europe, from +Heidelberg through the Swanscombe and Steinheim types to a group of +pre-neanderthaloids. There are traces of these pre-neanderthaloids +pretty much throughout Europe during the third interglacial period--say +100,000 years ago. The pre-neanderthaloids are represented by such +finds as the ones at Ehringsdorf in Germany and Saccopastore in Italy. +I won’t describe them for you, since they are simply less extreme than +the neanderthaloids proper--about half way between Steinheim and the +classic Neanderthal people. + +Professor Howell believes that the pre-neanderthaloids who happened to +get caught in the pocket of the southwest corner of Europe at the onset +of the last great glaciation became the classic Neanderthalers. Out in +the Near East, Howell thinks, it is possible to see traces of people +evolving from the pre-neanderthaloid type toward that of fully modern +man. Certainly, we don’t see such extreme cases of “neanderthaloidism” +outside of western Europe. + +There are at least a dozen good examples in the main or classic +Neanderthal group in Europe. They date to just before and in the +earlier part of the last great glaciation (85,000 to 40,000 years ago). +Many of the finds have been made in caves. The “cave men” the movies +and the cartoonists show you are probably meant to be Neanderthalers. +I’m not at all sure they dragged their women by the hair; the women +were probably pretty tough, too! + +Neanderthal men had large bony heads, but plenty of room for brains. +Some had brain cases even larger than the average for modern man. Their +faces were heavy, and they had eyebrow ridges of bone, but the ridges +were not as big as those of Java man. Their foreheads were very low, +and they didn’t have much chin. They were about five feet three inches +tall, but were heavy and barrel-chested. But the Neanderthalers didn’t +slouch as much as they’ve been blamed for, either. + +One important thing about the Neanderthal group is that there is a fair +number of them to study. Just as important is the fact that we know +something about how they lived, and about some of the tools they made. + + +OTHER MEN CONTEMPORARY WITH THE NEANDERTHALOIDS + +We have seen that the neanderthaloids seem to be a specialization +in a corner of Europe. What was going on elsewhere? We think that +the pre-neanderthaloid type was a generally widespread form of men. +From this type evolved other more or less extreme although generally +related men. The Solo finds in Java form one such case. Another was the +Rhodesian man of Africa, and the more recent Hopefield finds show more +of the general Rhodesian type. It is more confusing than it needs to be +if these cases outside western Europe are called neanderthaloids. They +lived during the same approximate time range but they were all somewhat +different-looking people. + + +EARLY MODERN MEN + +How early is modern man (_Homo sapiens_), the “wise man”? Some people +have thought that he was very early, a few still think so. Piltdown +and Galley Hill, which were quite modern in anatomical appearance and +_supposedly_ very early in date, were the best “evidence” for very +early modern men. Now that Piltdown has been liquidated and Galley Hill +is known to be very late, what is left of the idea? + +The backs of the skulls of the Swanscombe and Steinheim finds look +rather modern. Unless you pay attention to the face and forehead of the +Steinheim find--which not many people have--and perhaps also consider +the Ternafine jaws, you might come to the conclusion that the crown of +the Swanscombe head was that of a modern-like man. + +Two more skulls, again without faces, are available from a French +cave site, Fontéchevade. They come from the time of the last great +interglacial, as did the pre-neanderthaloids. The crowns of the +Fontéchevade skulls also look quite modern. There is a bit of the +forehead preserved on one of these skulls and the brow-ridge is not +heavy. Nevertheless, there is a suggestion that the bones belonged to +an immature individual. In this case, his (or even more so, if _her_) +brow-ridges would have been weak anyway. The case for the Fontéchevade +fossils, as modern type men, is little stronger than that for +Swanscombe, although Professor Vallois believes it a good case. + +It seems to add up to the fact that there were people living in +Europe--before the classic neanderthaloids--who looked more modern, +in some features, than the classic western neanderthaloids did. Our +best suggestion of what men looked like--just before they became fully +modern--comes from a cave on Mount Carmel in Palestine. + + +THE FIRST MODERNS + +Professor T. D. McCown and the late Sir Arthur Keith, who studied the +Mount Carmel bones, figured out that one of the two groups involved +was as much as 70 per cent modern. There were, in fact, two groups or +varieties of men in the Mount Carmel caves and in at least two other +Palestinian caves of about the same time. The time would be about that +of the onset of colder weather, when the last glaciation was beginning +in the north--say 75,000 years ago. + +The 70 per cent modern group came from only one cave, Mugharet es-Skhul +(“cave of the kids”). The other group, from several caves, had bones of +men of the type we’ve been calling pre-neanderthaloid which we noted +were widespread in Europe and beyond. The tools which came with each +of these finds were generally similar, and McCown and Keith, and other +scholars since their study, have tended to assume that both the Skhul +group and the pre-neanderthaloid group came from exactly the same time. +The conclusion was quite natural: here was a population of men in the +act of evolving in two different directions. But the time may not be +exactly the same. It is very difficult to be precise, within say 10,000 +years, for a time some 75,000 years ago. If the Skhul men are in fact +later than the pre-neanderthaloid group of Palestine, as some of us +think, then they show how relatively modern some men were--men who +lived at the same time as the classic Neanderthalers of the European +pocket. + +Soon after the first extremely cold phase of the last glaciation, we +begin to get a number of bones of completely modern men in Europe. +We also get great numbers of the tools they made, and their living +places in caves. Completely modern skeletons begin turning up in caves +dating back to toward 40,000 years ago. The time is about that of the +beginning of the second phase of the last glaciation. These skeletons +belonged to people no different from many people we see today. Like +people today, not everybody looked alike. (The positions of the more +important fossil men of later Europe are shown in the chart on page +72.) + + +DIFFERENCES IN THE EARLY MODERNS + +The main early European moderns have been divided into two groups, the +Cro-Magnon group and the Combe Capelle-Brünn group. Cro-Magnon people +were tall and big-boned, with large, long, and rugged heads. They +must have been built like many present-day Scandinavians. The Combe +Capelle-Brünn people were shorter; they had narrow heads and faces, and +big eyebrow-ridges. Of course we don’t find the skin or hair of these +people. But there is little doubt they were Caucasoids (“Whites”). + +Another important find came in the Italian Riviera, near Monte Carlo. +Here, in a cave near Grimaldi, there was a grave containing a woman +and a young boy, buried together. The two skeletons were first called +“Negroid” because some features of their bones were thought to resemble +certain features of modern African Negro bones. But more recently, +Professor E. A. Hooton and other experts questioned the use of the word +“Negroid” in describing the Grimaldi skeletons. It is true that nothing +is known of the skin color, hair form, or any other fleshy feature of +the Grimaldi people, so that the word “Negroid” in its usual meaning is +not proper here. It is also not clear whether the features of the bones +claimed to be “Negroid” are really so at all. + +From a place called Wadjak, in Java, we have “proto-Australoid” skulls +which closely resemble those of modern Australian natives. Some of +the skulls found in South Africa, especially the Boskop skull, look +like those of modern Bushmen, but are much bigger. The ancestors of +the Bushmen seem to have once been very widespread south of the Sahara +Desert. True African Negroes were forest people who apparently expanded +out of the west central African area only in the last several thousand +years. Although dark in skin color, neither the Australians nor the +Bushmen are Negroes; neither the Wadjak nor the Boskop skulls are +“Negroid.” + +As we’ve already mentioned, Professor Weidenreich believed that Peking +man was already on the way to becoming a Mongoloid. Anyway, the +Mongoloids would seem to have been present by the time of the “Upper +Cave” at Choukoutien, the _Sinanthropus_ find-spot. + + +WHAT THE DIFFERENCES MEAN + +What does all this difference mean? It means that, at one moment in +time, within each different area, men tended to look somewhat alike. +From area to area, men tended to look somewhat different, just as +they do today. This is all quite natural. People _tended_ to mate +near home; in the anthropological jargon, they made up geographically +localized breeding populations. The simple continental division of +“stocks”--black = Africa, yellow = Asia, white = Europe--is too simple +a picture to fit the facts. People became accustomed to life in some +particular area within a continent (we might call it a “natural area”). +As they went on living there, they evolved towards some particular +physical variety. It would, of course, have been difficult to draw +a clear boundary between two adjacent areas. There must always have +been some mating across the boundaries in every case. One thing human +beings don’t do, and never have done, is to mate for “purity.” It is +self-righteous nonsense when we try to kid ourselves into thinking that +they do. + +I am not going to struggle with the whole business of modern stocks and +races. This is a book about prehistoric men, not recent historic or +modern men. My physical anthropologist friends have been very patient +in helping me to write and rewrite this chapter--I am not going to +break their patience completely. Races are their business, not mine, +and they must do the writing about races. I shall, however, give two +modern definitions of race, and then make one comment. + + Dr. William G. Boyd, professor of Immunochemistry, School of + Medicine, Boston University: “We may define a human race as a + population which differs significantly from other human populations + in regard to the frequency of one or more of the genes it + possesses.” + + Professor Sherwood L. Washburn, professor of Physical Anthropology, + Department of Anthropology, the University of California: “A ‘race’ + is a group of genetically similar populations, and races intergrade + because there are always intermediate populations.” + +My comment is that the ideas involved here are all biological: they +concern groups, _not_ individuals. Boyd and Washburn may differ a bit +on what they want to consider a “population,” but a population is a +group nevertheless, and genetics is biology to the hilt. Now a lot of +people still think of race in terms of how people dress or fix their +food or of other habits or customs they have. The next step is to talk +about racial “purity.” None of this has anything whatever to do with +race proper, which is a matter of the biology of groups. + +Incidentally, I’m told that if man very carefully _controls_ +the breeding of certain animals over generations--dogs, cattle, +chickens--he might achieve a “pure” race of animals. But he doesn’t do +it. Some unfortunate genetic trait soon turns up, so this has just as +carefully to be bred out again, and so on. + + +SUMMARY OF PRESENT KNOWLEDGE OF FOSSIL MEN + +The earliest bones of men we now have--upon which all the experts +would probably agree--are those of _Meganthropus_, from Java, of about +450,000 years ago. The earlier australopithecines of Africa were +possibly not tool-users and may not have been ancestral to men at all. +But there is an alternate and evidently increasingly stronger chance +that some of them may have been. The Kanam jaw from Kenya, another +early possibility, is not only very incomplete but its find-spot is +very questionable. + +Java man proper, _Pithecanthropus_, comes next, at about 400,000 years +ago, and the big Heidelberg jaw in Germany must be of about the same +date. Next comes Swanscombe in England, Steinheim in Germany, the +Ternafine jaws in Algeria, and Peking man, _Sinanthropus_. They all +date to the second great interglacial period, about 350,000 years ago. + +Piltdown and Galley Hill are out, and with them, much of the starch +in the old idea that there were two distinct lines of development +in human evolution: (1) a line of “paleoanthropic” development from +Heidelberg to the Neanderthalers where it became extinct, and (2) a +very early “modern” line, through Piltdown, Galley Hill, Swanscombe, to +us. Swanscombe, Steinheim, and Ternafine are just as easily cases of +very early pre-neanderthaloids. + +The pre-neanderthaloids were very widespread during the third +interglacial: Ehringsdorf, Saccopastore, some of the Mount Carmel +people, and probably Fontéchevade are cases in point. A variety of +their descendants can be seen, from Java (Solo), Africa (Rhodesian +man), and about the Mediterranean and in western Europe. As the acute +cold of the last glaciation set in, the western Europeans found +themselves surrounded by water, ice, or bitter cold tundra. To vastly +over-simplify it, they “bred in” and became classic neanderthaloids. +But on Mount Carmel, the Skhul cave-find with its 70 per cent modern +features shows what could happen elsewhere at the same time. + +Lastly, from about 40,000 or 35,000 years ago--the time of the onset +of the second phase of the last glaciation--we begin to find the fully +modern skeletons of men. The modern skeletons differ from place to +place, just as different groups of men living in different places still +look different. + +What became of the Neanderthalers? Nobody can tell me for sure. I’ve a +hunch they were simply “bred out” again when the cold weather was over. +Many Americans, as the years go by, are no longer ashamed to claim they +have “Indian blood in their veins.” Give us a few more generations +and there will not be very many other Americans left to whom we can +brag about it. It certainly isn’t inconceivable to me to imagine a +little Cro-Magnon boy bragging to his friends about his tough, strong, +Neanderthaler great-great-great-great-grandfather! + + + + +Cultural BEGINNINGS + +[Illustration] + + +Men, unlike the lower animals, are made up of much more than flesh and +blood and bones; for men have “culture.” + + +WHAT IS CULTURE? + +“Culture” is a word with many meanings. The doctors speak of making a +“culture” of a certain kind of bacteria, and ants are said to have a +“culture.” Then there is the Emily Post kind of “culture”--you say a +person is “cultured,” or that he isn’t, depending on such things as +whether or not he eats peas with his knife. + +The anthropologists use the word too, and argue heatedly over its finer +meanings; but they all agree that every human being is part of or has +some kind of culture. Each particular human group has a particular +culture; that is one of the ways in which we can tell one group of +men from another. In this sense, a CULTURE means the way the members +of a group of people think and believe and live, the tools they make, +and the way they do things. Professor Robert Redfield says a culture +is an organized or formalized body of conventional understandings. +“Conventional understandings” means the whole set of rules, beliefs, +and standards which a group of people lives by. These understandings +show themselves in art, and in the other things a people may make and +do. The understandings continue to last, through tradition, from one +generation to another. They are what really characterize different +human groups. + + +SOME CHARACTERISTICS OF CULTURE + +A culture lasts, although individual men in the group die off. On +the other hand, a culture changes as the different conventions and +understandings change. You could almost say that a culture lives in the +minds of the men who have it. But people are not born with it; they +get it as they grow up. Suppose a day-old Hungarian baby is adopted by +a family in Oshkosh, Wisconsin, and the child is not told that he is +Hungarian. He will grow up with no more idea of Hungarian culture than +anyone else in Oshkosh. + +So when I speak of ancient Egyptian culture, I mean the whole body +of understandings and beliefs and knowledge possessed by the ancient +Egyptians. I mean their beliefs as to why grain grew, as well as their +ability to make tools with which to reap the grain. I mean their +beliefs about life after death. What I am thinking about as culture is +a thing which lasted in time. If any one Egyptian, even the Pharaoh, +died, it didn’t affect the Egyptian culture of that particular moment. + + +PREHISTORIC CULTURES + +For that long period of man’s history that is all prehistory, we have +no written descriptions of cultures. We find only the tools men made, +the places where they lived, the graves in which they buried their +dead. Fortunately for us, these tools and living places and graves all +tell us something about the ways these men lived and the things they +believed. But the story we learn of the very early cultures must be +only a very small part of the whole, for we find so few things. The +rest of the story is gone forever. We have to do what we can with what +we find. + +For all of the time up to about 75,000 years ago, which was the time +of the classic European Neanderthal group of men, we have found few +cave-dwelling places of very early prehistoric men. First, there is the +fallen-in cave where Peking man was found, near Peking. Then there are +two or three other _early_, but not _very early_, possibilities. The +finds at the base of the French cave of Fontéchevade, those in one of +the Makapan caves in South Africa, and several open sites such as Dr. +L. S. B. Leakey’s Olorgesailie in Kenya doubtless all lie earlier than +the time of the main European Neanderthal group, but none are so early +as the Peking finds. + +You can see that we know very little about the home life of earlier +prehistoric men. We find different kinds of early stone tools, but we +can’t even be really sure which tools may have been used together. + + +WHY LITTLE HAS LASTED FROM EARLY TIMES + +Except for the rare find-spots mentioned above, all our very early +finds come from geological deposits, or from the wind-blown surfaces +of deserts. Here is what the business of geological deposits really +means. Let us say that a group of people was living in England about +300,000 years ago. They made the tools they needed, lived in some sort +of camp, almost certainly built fires, and perhaps buried their dead. +While the climate was still warm, many generations may have lived in +the same place, hunting, and gathering nuts and berries; but after some +few thousand years, the weather began very gradually to grow colder. +These early Englishmen would not have known that a glacier was forming +over northern Europe. They would only have noticed that the animals +they hunted seemed to be moving south, and that the berries grew larger +toward the south. So they would have moved south, too. + +The camp site they left is the place we archeologists would really have +liked to find. All of the different tools the people used would have +been there together--many broken, some whole. The graves, and traces +of fire, and the tools would have been there. But the glacier got +there first! The front of this enormous sheet of ice moved down over +the country, crushing and breaking and plowing up everything, like a +gigantic bulldozer. You can see what happened to our camp site. + +Everything the glacier couldn’t break, it pushed along in front of it +or plowed beneath it. Rocks were ground to gravel, and soil was caught +into the ice, which afterwards melted and ran off as muddy water. Hard +tools of flint sometimes remained whole. Human bones weren’t so hard; +it’s a wonder _any_ of them lasted. Gushing streams of melt water +flushed out the debris from underneath the glacier, and water flowed +off the surface and through great crevasses. The hard materials these +waters carried were even more rolled and ground up. Finally, such +materials were dropped by the rushing waters as gravels, miles from +the front of the glacier. At last the glacier reached its greatest +extent; then it melted backward toward the north. Debris held in the +ice was dropped where the ice melted, or was flushed off by more melt +water. When the glacier, leaving the land, had withdrawn to the sea, +great hunks of ice were broken off as icebergs. These icebergs probably +dropped the materials held in their ice wherever they floated and +melted. There must be many tools and fragmentary bones of prehistoric +men on the bottom of the Atlantic Ocean and the North Sea. + +Remember, too, that these glaciers came and went at least three or four +times during the Ice Age. Then you will realize why the earlier things +we find are all mixed up. Stone tools from one camp site got mixed up +with stone tools from many other camp sites--tools which may have been +made tens of thousands or more years apart. The glaciers mixed them +all up, and so we cannot say which particular sets of tools belonged +together in the first place. + + +“EOLITHS” + +But what sort of tools do we find earliest? For almost a century, +people have been picking up odd bits of flint and other stone in the +oldest Ice Age gravels in England and France. It is now thought these +odd bits of stone weren’t actually worked by prehistoric men. The +stones were given a name, _eoliths_, or “dawn stones.” You can see them +in many museums; but you can be pretty sure that very few of them were +actually fashioned by men. + +It is impossible to pick out “eoliths” that seem to be made in any +one _tradition_. By “tradition” I mean a set of habits for making one +kind of tool for some particular job. No two “eoliths” look very much +alike: tools made as part of some one tradition all look much alike. +Now it’s easy to suppose that the very earliest prehistoric men picked +up and used almost any sort of stone. This wouldn’t be surprising; you +and I do it when we go camping. In other words, some of these “eoliths” +may actually have been used by prehistoric men. They must have used +anything that might be handy when they needed it. We could have figured +that out without the “eoliths.” + + +THE ROAD TO STANDARDIZATION + +Reasoning from what we know or can easily imagine, there should have +been three major steps in the prehistory of tool-making. The first step +would have been simple _utilization_ of what was at hand. This is the +step into which the “eoliths” would fall. The second step would have +been _fashioning_--the haphazard preparation of a tool when there was a +need for it. Probably many of the earlier pebble tools, which I shall +describe next, fall into this group. The third step would have been +_standardization_. Here, men began to make tools according to certain +set traditions. Counting the better-made pebble tools, there are four +such traditions or sets of habits for the production of stone tools in +earliest prehistoric times. Toward the end of the Pleistocene, a fifth +tradition appears. + + +PEBBLE TOOLS + +At the beginning of the last chapter, you’ll remember that I said there +were tools from very early geological beds. The earliest bones of men +have not yet been found in such early beds although the Sterkfontein +australopithecine cave approaches this early date. The earliest tools +come from Africa. They date back to the time of the first great +alpine glaciation and are at least 500,000 years old. The earliest +ones are made of split pebbles, about the size of your fist or a bit +bigger. They go under the name of pebble tools. There are many natural +exposures of early Pleistocene geological beds in Africa, and the +prehistoric archeologists of south and central Africa have concentrated +on searching for early tools. Other finds of early pebble tools have +recently been made in Algeria and Morocco. + +[Illustration: SOUTH AFRICAN PEBBLE TOOL] + +There are probably early pebble tools to be found in areas of the +Old World besides Africa; in fact, some prehistorians already claim +to have identified a few. Since the forms and the distinct ways of +making the earlier pebble tools had not yet sufficiently jelled into +a set tradition, they are difficult for us to recognize. It is not +so difficult, however, if there are great numbers of “possibles” +available. A little later in time the tradition becomes more clearly +set, and pebble tools are easier to recognize. So far, really large +collections of pebble tools have only been found and examined in Africa. + + +CORE-BIFACE TOOLS + +The next tradition we’ll look at is the _core_ or biface one. The tools +are large pear-shaped pieces of stone trimmed flat on the two opposite +sides or “faces.” Hence “biface” has been used to describe these tools. +The front view is like that of a pear with a rather pointed top, and +the back view looks almost exactly the same. Look at them side on, and +you can see that the front and back faces are the same and have been +trimmed to a thin tip. The real purpose in trimming down the two faces +was to get a good cutting edge all around. You can see all this in the +illustration. + +[Illustration: ABBEVILLIAN BIFACE] + +We have very little idea of the way in which these core-bifaces were +used. They have been called “hand axes,” but this probably gives the +wrong idea, for an ax, to us, is not a pointed tool. All of these early +tools must have been used for a number of jobs--chopping, scraping, +cutting, hitting, picking, and prying. Since the core-bifaces tend to +be pointed, it seems likely that they were used for hitting, picking, +and prying. But they have rough cutting edges, so they could have been +used for chopping, scraping, and cutting. + + +FLAKE TOOLS + +The third tradition is the _flake_ tradition. The idea was to get a +tool with a good cutting edge by simply knocking a nice large flake off +a big block of stone. You had to break off the flake in such a way that +it was broad and thin, and also had a good sharp cutting edge. Once you +really got on to the trick of doing it, this was probably a simpler way +to make a good cutting tool than preparing a biface. You have to know +how, though; I’ve tried it and have mashed my fingers more than once. + +The flake tools look as if they were meant mainly for chopping, +scraping, and cutting jobs. When one made a flake tool, the idea seems +to have been to produce a broad, sharp, cutting edge. + +[Illustration: CLACTONIAN FLAKE] + +The core-biface and the flake traditions were spread, from earliest +times, over much of Europe, Africa, and western Asia. The map on page +52 shows the general area. Over much of this great region there was +flint. Both of these traditions seem well adapted to flint, although +good core-bifaces and flakes were made from other kinds of stone, +especially in Africa south of the Sahara. + + +CHOPPERS AND ADZE-LIKE TOOLS + +The fourth early tradition is found in southern and eastern Asia, from +northwestern India through Java and Burma into China. Father Maringer +recently reported an early group of tools in Japan, which most resemble +those of Java, called Patjitanian. The prehistoric men in this general +area mostly used quartz and tuff and even petrified wood for their +stone tools (see illustration, p. 46). + +This fourth early tradition is called the _chopper-chopping tool_ +tradition. It probably has its earliest roots in the pebble tool +tradition of African type. There are several kinds of tools in this +tradition, but all differ from the western core-bifaces and flakes. +There are broad, heavy scrapers or cleavers, and tools with an +adze-like cutting edge. These last-named tools are called “hand adzes,” +just as the core-bifaces of the west have often been called “hand +axes.” The section of an adze cutting edge is ? shaped; the section of +an ax is < shaped. + +[Illustration: ANYATHIAN ADZE-LIKE TOOL] + +There are also pointed pebble tools. Thus the tool kit of these early +south and east Asiatic peoples seems to have included tools for doing +as many different jobs as did the tools of the Western traditions. + +Dr. H. L. Movius has emphasized that the tools which were found in the +Peking cave with Peking man belong to the chopper-tool tradition. This +is the only case as yet where the tools and the man have been found +together from very earliest times--if we except Sterkfontein. + + +DIFFERENCES WITHIN THE TOOL-MAKING TRADITIONS + +The latter three great traditions in the manufacture of stone +tools--and the less clear-cut pebble tools before them--are all we have +to show of the cultures of the men of those times. Changes happened in +each of the traditions. As time went on, the tools in each tradition +were better made. There could also be slight regional differences in +the tools within one tradition. Thus, tools with small differences, but +all belonging to one tradition, can be given special group (facies) +names. + +This naming of special groups has been going on for some time. Here are +some of these names, since you may see them used in museum displays +of flint tools, or in books. Within each tradition of tool-making +(save the chopper tools), the earliest tool type is at the bottom +of the list, just as it appears in the lowest beds of a geological +stratification.[3] + + [3] Archeologists usually make their charts and lists with the + earliest materials at the bottom and the latest on top, since + this is the way they find them in the ground. + + Chopper tool (all about equally early): + Anyathian (Burma) + Choukoutienian (China) + Patjitanian (Java) + Soan (India) + + Flake: + “Typical Mousterian” + Levalloiso-Mousterian + Levalloisian + Tayacian + Clactonian (localized in England) + + Core-biface: + Some blended elements in “Mousterian” + Micoquian (= Acheulean 6 and 7) + Acheulean + Abbevillian (once called “Chellean”) + + Pebble tool: + Oldowan + Ain Hanech + pre-Stellenbosch + Kafuan + +The core-biface and the flake traditions appear in the chart (p. 65). + +The early archeologists had many of the tool groups named before they +ever realized that there were broader tool preparation traditions. This +was understandable, for in dealing with the mixture of things that come +out of glacial gravels the easiest thing to do first is to isolate +individual types of tools into groups. First you put a bushel-basketful +of tools on a table and begin matching up types. Then you give names to +the groups of each type. The groups and the types are really matters of +the archeologists’ choice; in real life, they were probably less exact +than the archeologists’ lists of them. We now know pretty well in which +of the early traditions the various early groups belong. + + +THE MEANING OF THE DIFFERENT TRADITIONS + +What do the traditions really mean? I see them as the standardization +of ways to make tools for particular jobs. We may not know exactly what +job the maker of a particular core-biface or flake tool had in mind. We +can easily see, however, that he already enjoyed a know-how, a set of +persistent habits of tool preparation, which would always give him the +same type of tool when he wanted to make it. Therefore, the traditions +show us that persistent habits already existed for the preparation of +one type of tool or another. + +This tells us that one of the characteristic aspects of human culture +was already present. There must have been, in the minds of these +early men, a notion of the ideal type of tool for a particular job. +Furthermore, since we find so many thousands upon thousands of tools +of one type or another, the notion of the ideal types of tools _and_ +the know-how for the making of each type must have been held in common +by many men. The notions of the ideal types and the know-how for their +production must have been passed on from one generation to another. + +I could even guess that the notions of the ideal type of one or the +other of these tools stood out in the minds of men of those times +somewhat like a symbol of “perfect tool for good job.” If this were +so--remember it’s only a wild guess of mine--then men were already +symbol users. Now let’s go on a further step to the fact that the words +men speak are simply sounds, each different sound being a symbol for a +different meaning. If standardized tool-making suggests symbol-making, +is it also possible that crude word-symbols were also being made? I +suppose that it is not impossible. + +There may, of course, be a real question whether tool-utilizing +creatures--our first step, on page 42--were actually men. Other +animals utilize things at hand as tools. The tool-fashioning creature +of our second step is more suggestive, although we may not yet feel +sure that many of the earlier pebble tools were man-made products. But +with the step to standardization and the appearance of the traditions, +I believe we must surely be dealing with the traces of culture-bearing +_men_. The “conventional understandings” which Professor Redfield’s +definition of culture suggests are now evidenced for us in the +persistent habits for the preparation of stone tools. Were we able to +see the other things these prehistoric men must have made--in materials +no longer preserved for the archeologist to find--I believe there would +be clear signs of further conventional understandings. The men may have +been physically primitive and pretty shaggy in appearance, but I think +we must surely call them men. + + +AN OLDER INTERPRETATION OF THE WESTERN TRADITIONS + +In the last chapter, I told you that many of the older archeologists +and human paleontologists used to think that modern man was very old. +The supposed ages of Piltdown and Galley Hill were given as evidence +of the great age of anatomically modern man, and some interpretations +of the Swanscombe and Fontéchevade fossils were taken to support +this view. The conclusion was that there were two parallel lines or +“phyla” of men already present well back in the Pleistocene. The +first of these, the more primitive or “paleoanthropic” line, was +said to include Heidelberg, the proto-neanderthaloids and classic +Neanderthal. The more anatomically modern or “neanthropic” line was +thought to consist of Piltdown and the others mentioned above. The +Neanderthaler or paleoanthropic line was thought to have become extinct +after the first phase of the last great glaciation. Of course, the +modern or neanthropic line was believed to have persisted into the +present, as the basis for the world’s population today. But with +Piltdown liquidated, Galley Hill known to be very late, and Swanscombe +and Fontéchevade otherwise interpreted, there is little left of the +so-called parallel phyla theory. + +While the theory was in vogue, however, and as long as the European +archeological evidence was looked at in one short-sighted way, the +archeological materials _seemed_ to fit the parallel phyla theory. It +was simply necessary to believe that the flake tools were made only +by the paleoanthropic Neanderthaler line, and that the more handsome +core-biface tools were the product of the neanthropic modern-man line. + +Remember that _almost_ all of the early prehistoric European tools +came only from the redeposited gravel beds. This means that the tools +were not normally found in the remains of camp sites or work shops +where they had actually been dropped by the men who made and used +them. The tools came, rather, from the secondary hodge-podge of the +glacial gravels. I tried to give you a picture of the bulldozing action +of glaciers (p. 40) and of the erosion and weathering that were +side-effects of a glacially conditioned climate on the earth’s surface. +As we said above, if one simply plucks tools out of the redeposited +gravels, his natural tendency is to “type” the tools by groups, and to +think that the groups stand for something _on their own_. + +In 1906, M. Victor Commont actually made a rare find of what seems +to have been a kind of workshop site, on a terrace above the Somme +river in France. Here, Commont realized, flake tools appeared clearly +in direct association with core-biface tools. Few prehistorians paid +attention to Commont or his site, however. It was easier to believe +that flake tools represented a distinct “culture” and that this +“culture” was that of the Neanderthaler or paleoanthropic line, and +that the core-bifaces stood for another “culture” which was that of the +supposed early modern or neanthropic line. Of course, I am obviously +skipping many details here. Some later sites with Neanderthal fossils +do seem to have only flake tools, but other such sites have both types +of tools. The flake tools which appeared _with_ the core-bifaces +in the Swanscombe gravels were never made much of, although it +was embarrassing for the parallel phyla people that Fontéchevade +ran heavily to flake tools. All in all, the parallel phyla theory +flourished because it seemed so neat and easy to understand. + + +TRADITIONS ARE TOOL-MAKING HABITS, NOT CULTURES + +In case you think I simply enjoy beating a dead horse, look in any +standard book on prehistory written twenty (or even ten) years ago, or +in most encyclopedias. You’ll find that each of the individual tool +types, of the West, at least, was supposed to represent a “culture.” +The “cultures” were believed to correspond to parallel lines of human +evolution. + +In 1937, Mr. Harper Kelley strongly re-emphasized the importance +of Commont’s workshop site and the presence of flake tools with +core-bifaces. Next followed Dr. Movius’ clear delineation of the +chopper-chopping tool tradition of the Far East. This spoiled the nice +symmetry of the flake-tool = paleoanthropic, core-biface = neanthropic +equations. Then came increasing understanding of the importance of +the pebble tools in Africa, and the location of several more workshop +sites there, especially at Olorgesailie in Kenya. Finally came the +liquidation of Piltdown and the deflation of Galley Hill’s date. So it +is at last possible to picture an individual prehistoric man making a +flake tool to do one job and a core-biface tool to do another. Commont +showed us this picture in 1906, but few believed him. + +[Illustration: DISTRIBUTION OF TOOL-PREPARATION TRADITIONS + +Time approximately 100,000 years ago] + +There are certainly a few cases in which flake tools did appear with +few or no core-bifaces. The flake-tool group called Clactonian in +England is such a case. Another good, but certainly later case is +that of the cave on Mount Carmel in Palestine, where the blended +pre-neanderthaloid, 70 per cent modern-type skulls were found. Here, in +the same level with the skulls, were 9,784 flint tools. Of these, only +three--doubtless strays--were core-bifaces; all the rest were flake +tools or flake chips. We noted above how the Fontéchevade cave ran to +flake tools. The only conclusion I would draw from this is that times +and circumstances did exist in which prehistoric men needed only flake +tools. So they only made flake tools for those particular times and +circumstances. + + +LIFE IN EARLIEST TIMES + +What do we actually know of life in these earliest times? In the +glacial gravels, or in the terrace gravels of rivers once swollen by +floods of melt water or heavy rains, or on the windswept deserts, we +find stone tools. The earliest and coarsest of these are the pebble +tools. We do not yet know what the men who made them looked like, +although the Sterkfontein australopithecines probably give us a good +hint. Then begin the more formal tool preparation traditions of the +west--the core-bifaces and the flake tools--and the chopper-chopping +tool series of the farther east. There is an occasional roughly worked +piece of bone. From the gravels which yield the Clactonian flakes of +England comes the fire-hardened point of a wooden spear. There are +also the chance finds of the fossil human bones themselves, of which +we spoke in the last chapter. Aside from the cave of Peking man, none +of the earliest tools have been found in caves. Open air or “workshop” +sites which do not seem to have been disturbed later by some geological +agency are very rare. + +The chart on page 65 shows graphically what the situation in +west-central Europe seems to have been. It is not yet certain whether +there were pebble tools there or not. The Fontéchevade cave comes +into the picture about 100,000 years ago or more. But for the earlier +hundreds of thousands of years--below the red-dotted line on the +chart--the tools we find come almost entirely from the haphazard +mixture within the geological contexts. + +The stone tools of each of the earlier traditions are the simplest +kinds of all-purpose tools. Almost any one of them could be used for +hacking, chopping, cutting, and scraping; so the men who used them must +have been living in a rough and ready sort of way. They found or hunted +their food wherever they could. In the anthropological jargon, they +were “food-gatherers,” pure and simple. + +Because of the mixture in the gravels and in the materials they +carried, we can’t be sure which animals these men hunted. Bones of +the larger animals turn up in the gravels, but they could just as +well belong to the animals who hunted the men, rather than the other +way about. We don’t know. This is why camp sites like Commont’s and +Olorgesailie in Kenya are so important when we do find them. The animal +bones at Olorgesailie belonged to various mammals of extremely large +size. Probably they were taken in pit-traps, but there are a number of +groups of three round stones on the site which suggest that the people +used bolas. The South American Indians used three-ball bolas, with the +stones in separate leather bags connected by thongs. These were whirled +and then thrown through the air so as to entangle the feet of a fleeing +animal. + +Professor F. Clark Howell recently returned from excavating another +important open air site at Isimila in Tanganyika. The site yielded +the bones of many fossil animals and also thousands of core-bifaces, +flakes, and choppers. But Howell’s reconstruction of the food-getting +habits of the Isimila people certainly suggests that the word “hunting” +is too dignified for what they did; “scavenging” would be much nearer +the mark. + +During a great part of this time the climate was warm and pleasant. The +second interglacial period (the time between the second and third great +alpine glaciations) lasted a long time, and during much of this time +the climate may have been even better than ours is now. We don’t know +that earlier prehistoric men in Europe or Africa lived in caves. They +may not have needed to; much of the weather may have been so nice that +they lived in the open. Perhaps they didn’t wear clothes, either. + + +WHAT THE PEKING CAVE-FINDS TELL US + +The one early cave-dwelling we have found is that of Peking man, in +China. Peking man had fire. He probably cooked his meat, or used +the fire to keep dangerous animals away from his den. In the cave +were bones of dangerous animals, members of the wolf, bear, and cat +families. Some of the cat bones belonged to beasts larger than tigers. +There were also bones of other wild animals: buffalo, camel, deer, +elephants, horses, sheep, and even ostriches. Seventy per cent of the +animals Peking man killed were fallow deer. It’s much too cold and dry +in north China for all these animals to live there today. So this list +helps us know that the weather was reasonably warm, and that there was +enough rain to grow grass for the grazing animals. The list also helps +the paleontologists to date the find. + +Peking man also seems to have eaten plant food, for there are hackberry +seeds in the debris of the cave. His tools were made of sandstone and +quartz and sometimes of a rather bad flint. As we’ve already seen, they +belong in the chopper-tool tradition. It seems fairly clear that some +of the edges were chipped by right-handed people. There are also many +split pieces of heavy bone. Peking man probably split them so he could +eat the bone marrow, but he may have used some of them as tools. + +Many of these split bones were the bones of Peking men. Each one of the +skulls had already had the base broken out of it. In no case were any +of the bones resting together in their natural relation to one another. +There is nothing like a burial; all of the bones are scattered. Now +it’s true that animals could have scattered bodies that were not cared +for or buried. But splitting bones lengthwise and carefully removing +the base of a skull call for both the tools and the people to use them. +It’s pretty clear who the people were. Peking man was a cannibal. + + * * * * * + +This rounds out about all we can say of the life and times of early +prehistoric men. In those days life was rough. You evidently had to +watch out not only for dangerous animals but also for your fellow men. +You ate whatever you could catch or find growing. But you had sense +enough to build fires, and you had already formed certain habits for +making the kinds of stone tools you needed. That’s about all we know. +But I think we’ll have to admit that cultural beginnings had been made, +and that these early people were really _men_. + + + + +MORE EVIDENCE of Culture + +[Illustration] + + +While the dating is not yet sure, the material that we get from caves +in Europe must go back to about 100,000 years ago; the time of the +classic Neanderthal group followed soon afterwards. We don’t know why +there is no earlier material in the caves; apparently they were not +used before the last interglacial phase (the period just before the +last great glaciation). We know that men of the classic Neanderthal +group were living in caves from about 75,000 to 45,000 years ago. +New radioactive carbon dates even suggest that some of the traces of +culture we’ll describe in this chapter may have lasted to about 35,000 +years ago. Probably some of the pre-neanderthaloid types of men had +also lived in caves. But we have so far found their bones in caves only +in Palestine and at Fontéchevade. + + +THE CAVE LAYERS + +In parts of France, some peasants still live in caves. In prehistoric +time, many generations of people lived in them. As a result, many +caves have deep layers of debris. The first people moved in and lived +on the rock floor. They threw on the floor whatever they didn’t want, +and they tracked in mud; nobody bothered to clean house in those days. +Their debris--junk and mud and garbage and what not--became packed +into a layer. As time went on, and generations passed, the layer grew +thicker. Then there might have been a break in the occupation of the +cave for a while. Perhaps the game animals got scarce and the people +moved away; or maybe the cave became flooded. Later on, other people +moved in and began making a new layer of their own on top of the first +layer. Perhaps this process of layering went on in the same cave for a +hundred thousand years; you can see what happened. The drawing on this +page shows a section through such a cave. The earliest layer is on the +bottom, the latest one on top. They go in order from bottom to top, +earliest to latest. This is the _stratification_ we talked about (p. +12). + +[Illustration: SECTION OF SHELTER ON LOWER TERRACE, LE MOUSTIER] + +While we may find a mix-up in caves, it’s not nearly as bad as the +mixing up that was done by glaciers. The animal bones and shells, the +fireplaces, the bones of men, and the tools the men made all belong +together, if they come from one layer. That’s the reason why the cave +of Peking man is so important. It is also the reason why the caves in +Europe and the Near East are so important. We can get an idea of which +things belong together and which lot came earliest and which latest. + +In most cases, prehistoric men lived only in the mouths of caves. +They didn’t like the dark inner chambers as places to live in. They +preferred rock-shelters, at the bases of overhanging cliffs, if there +was enough overhang to give shelter. When the weather was good, they no +doubt lived in the open air as well. I’ll go on using the term “cave” +since it’s more familiar, but remember that I really mean rock-shelter, +as a place in which people actually lived. + +The most important European cave sites are in Spain, France, and +central Europe; there are also sites in England and Italy. A few caves +are known in the Near East and Africa, and no doubt more sites will be +found when the out-of-the-way parts of Europe, Africa, and Asia are +studied. + + +AN “INDUSTRY” DEFINED + +We have already seen that the earliest European cave materials are +those from the cave of Fontéchevade. Movius feels certain that the +lowest materials here date back well into the third interglacial stage, +that which lay between the Riss (next to the last) and the Würm I +(first stage of the last) alpine glaciations. This material consists +of an _industry_ of stone tools, apparently all made in the flake +tradition. This is the first time we have used the word “industry.” +It is useful to call all of the different tools found together in one +layer and made of _one kind of material_ an industry; that is, the +tools must be found together as men left them. Tools taken from the +glacial gravels (or from windswept desert surfaces or river gravels +or any geological deposit) are not “together” in this sense. We might +say the latter have only “geological,” not “archeological” context. +Archeological context means finding things just as men left them. We +can tell what tools go together in an “industrial” sense only if we +have archeological context. + +Up to now, the only things we could have called “industries” were the +worked stone industry and perhaps the worked (?) bone industry of the +Peking cave. We could add some of the very clear cases of open air +sites, like Olorgesailie. We couldn’t use the term for the stone tools +from the glacial gravels, because we do not know which tools belonged +together. But when the cave materials begin to appear in Europe, we can +begin to speak of industries. Most of the European caves of this time +contain industries of flint tools alone. + + +THE EARLIEST EUROPEAN CAVE LAYERS + +We’ve just mentioned the industry from what is said to be the oldest +inhabited cave in Europe; that is, the industry from the deepest layer +of the site at Fontéchevade. Apparently it doesn’t amount to much. The +tools are made of stone, in the flake tradition, and are very poorly +worked. This industry is called _Tayacian_. Its type tool seems to be +a smallish flake tool, but there are also larger flakes which seem to +have been fashioned for hacking. In fact, the type tool seems to be +simply a smaller edition of the Clactonian tool (pictured on p. 45). + +None of the Fontéchevade tools are really good. There are scrapers, +and more or less pointed tools, and tools that may have been used +for hacking and chopping. Many of the tools from the earlier glacial +gravels are better made than those of this first industry we see in +a European cave. There is so little of this material available that +we do not know which is really typical and which is not. You would +probably find it hard to see much difference between this industry and +a collection of tools of the type called Clactonian, taken from the +glacial gravels, especially if the Clactonian tools were small-sized. + +The stone industry of the bottommost layer of the Mount Carmel cave, +in Palestine, where somewhat similar tools were found, has also been +called Tayacian. + +I shall have to bring in many unfamiliar words for the names of the +industries. The industries are usually named after the places where +they were first found, and since these were in most cases in France, +most of the names which follow will be of French origin. However, +the names have simply become handles and are in use far beyond the +boundaries of France. It would be better if we had a non-place-name +terminology, but archeologists have not yet been able to agree on such +a terminology. + + +THE ACHEULEAN INDUSTRY + +Both in France and in Palestine, as well as in some African cave +sites, the next layers in the deep caves have an industry in both the +core-biface and the flake traditions. The core-biface tools usually +make up less than half of all the tools in the industry. However, +the name of the biface type of tool is generally given to the whole +industry. It is called the _Acheulean_, actually a late form of it, as +“Acheulean” is also used for earlier core-biface tools taken from the +glacial gravels. In western Europe, the name used is _Upper Acheulean_ +or _Micoquian_. The same terms have been borrowed to name layers E and +F in the Tabun cave, on Mount Carmel in Palestine. + +The Acheulean core-biface type of tool is worked on two faces so as +to give a cutting edge all around. The outline of its front view may +be oval, or egg-shaped, or a quite pointed pear shape. The large +chip-scars of the Acheulean core-bifaces are shallow and flat. It is +suspected that this resulted from the removal of the chips with a +wooden club; the deep chip-scars of the earlier Abbevillian core-biface +came from beating the tool against a stone anvil. These tools are +really the best and also the final products of the core-biface +tradition. We first noticed the tradition in the early glacial gravels +(p. 43); now we see its end, but also its finest examples, in the +deeper cave levels. + +The flake tools, which really make up the greater bulk of this +industry, are simple scrapers and chips with sharp cutting edges. The +habits used to prepare them must have been pretty much the same as +those used for at least one of the flake industries we shall mention +presently. + +There is very little else in these early cave layers. We do not have +a proper “industry” of bone tools. There are traces of fire, and of +animal bones, and a few shells. In Palestine, there are many more +bones of deer than of gazelle in these layers; the deer lives in a +wetter climate than does the gazelle. In the European cave layers, the +animal bones are those of beasts that live in a warm climate. They +belonged in the last interglacial period. We have not yet found the +bones of fossil men definitely in place with this industry. + +[Illustration: ACHEULEAN BIFACE] + + +FLAKE INDUSTRIES FROM THE CAVES + +Two more stone industries--the _Levalloisian_ and the +“_Mousterian_”--turn up at approximately the same time in the European +cave layers. Their tools seem to be mainly in the flake tradition, +but according to some of the authorities their preparation also shows +some combination with the habits by which the core-biface tools were +prepared. + +Now notice that I don’t tell you the Levalloisian and the “Mousterian” +layers are both above the late Acheulean layers. Look at the cave +section (p. 57) and you’ll find that some “Mousterian of Acheulean +tradition” appears above some “typical Mousterian.” This means that +there may be some kinds of Acheulean industries that are later than +some kinds of “Mousterian.” The same is true of the Levalloisian. + +There were now several different kinds of habits that men used in +making stone tools. These habits were based on either one or the other +of the two traditions--core-biface or flake--or on combinations of +the habits used in the preparation techniques of both traditions. All +were popular at about the same time. So we find that people who made +one kind of stone tool industry lived in a cave for a while. Then they +gave up the cave for some reason, and people with another industry +moved in. Then the first people came back--or at least somebody with +the same tool-making habits as the first people. Or maybe a third group +of tool-makers moved in. The people who had these different habits for +making their stone tools seem to have moved around a good deal. They no +doubt borrowed and exchanged tricks of the trade with each other. There +were no patent laws in those days. + +The extremely complicated interrelationships of the different habits +used by the tool-makers of this range of time are at last being +systematically studied. M. François Bordes has developed a statistical +method of great importance for understanding these tool preparation +habits. + + +THE LEVALLOISIAN AND MOUSTERIAN + +The easiest Levalloisian tool to spot is a big flake tool. The trick +in making it was to fashion carefully a big chunk of stone (called +the Levalloisian “tortoise core,” because it resembles the shape of +a turtle-shell) and then to whack this in such a way that a large +flake flew off. This large thin flake, with sharp cutting edges, is +the finished Levalloisian tool. There were various other tools in a +Levalloisian industry, but this is the characteristic _Levalloisian_ +tool. + +There are several “typical Mousterian” stone tools. Different from +the tools of the Levalloisian type, these were made from “disc-like +cores.” There are medium-sized flake “side scrapers.” There are also +some small pointed tools and some small “hand axes.” The last of these +tool types is often a flake worked on both of the flat sides (that +is, bifacially). There are also pieces of flint worked into the form +of crude balls. The pointed tools may have been fixed on shafts to +make short jabbing spears; the round flint balls may have been used as +bolas. Actually, we don’t _know_ what either tool was used for. The +points and side scrapers are illustrated (pp. 64 and 66). + +[Illustration: LEVALLOIS FLAKE] + + +THE MIXING OF TRADITIONS + +Nowadays the archeologists are less and less sure of the importance +of any one specific tool type and name. Twenty years ago, they used +to speak simply of Acheulean or Levalloisian or Mousterian tools. +Now, more and more, _all_ of the tools from some one layer in a +cave are called an “industry,” which is given a mixed name. Thus we +have “Levalloiso-Mousterian,” and “Acheuleo-Levalloisian,” and even +“Acheuleo-Mousterian” (or “Mousterian of Acheulean tradition”). Bordes’ +systematic work is beginning to clear up some of our confusion. + +The time of these late Acheuleo-Levalloiso-Mousterioid industries +is from perhaps as early as 100,000 years ago. It may have lasted +until well past 50,000 years ago. This was the time of the first +phase of the last great glaciation. It was also the time that the +classic group of Neanderthal men was living in Europe. A number of +the Neanderthal fossil finds come from these cave layers. Before the +different habits of tool preparation were understood it used to be +popular to say Neanderthal man was “Mousterian man.” I think this is +wrong. What used to be called “Mousterian” is now known to be a variety +of industries with tools of both core-biface and flake habits, and +so mixed that the word “Mousterian” used alone really doesn’t mean +anything. The Neanderthalers doubtless understood the tool preparation +habits by means of which Acheulean, Levalloisian and Mousterian type +tools were produced. We also have the more modern-like Mount Carmel +people, found in a cave layer of Palestine with tools almost entirely +in the flake tradition, called “Levalloiso-Mousterian,” and the +Fontéchevade-Tayacian (p. 59). + +[Illustration: MOUSTERIAN POINT] + + +OTHER SUGGESTIONS OF LIFE IN THE EARLY CAVE LAYERS + +Except for the stone tools, what do we know of the way men lived in the +time range after 100,000 to perhaps 40,000 years ago or even later? +We know that in the area from Europe to Palestine, at least some of +the people (some of the time) lived in the fronts of caves and warmed +themselves over fires. In Europe, in the cave layers of these times, +we find the bones of different animals; the bones in the lowest layers +belong to animals that lived in a warm climate; above them are the +bones of those who could stand the cold, like the reindeer and mammoth. +Thus, the meat diet must have been changing, as the glacier crept +farther south. Shells and possibly fish bones have lasted in these +cave layers, but there is not a trace of the vegetable foods and the +nuts and berries and other wild fruits that must have been eaten when +they could be found. + +[Illustration: CHART SHOWING PRESENT UNDERSTANDING OF RELATIONSHIPS AND +SUCCESSION OF TOOL-PREPARATION TRADITIONS, INDUSTRIES, AND ASSEMBLAGES +OF WEST-CENTRAL EUROPE + +Wavy lines indicate transitions in industrial habits. These transitions +are not yet understood in detail. The glacial and climatic scheme shown +is the alpine one.] + +Bone tools have also been found from this period. Some are called +scrapers, and there are also long chisel-like leg-bone fragments +believed to have been used for skinning animals. Larger hunks of bone, +which seem to have served as anvils or chopping blocks, are fairly +common. + +Bits of mineral, used as coloring matter, have also been found. We +don’t know what the color was used for. + +[Illustration: MOUSTERIAN SIDE SCRAPER] + +There is a small but certain number of cases of intentional burials. +These burials have been found on the floors of the caves; in other +words, the people dug graves in the places where they lived. The holes +made for the graves were small. For this reason (or perhaps for some +other?) the bodies were in a curled-up or contracted position. Flint or +bone tools or pieces of meat seem to have been put in with some of the +bodies. In several cases, flat stones had been laid over the graves. + + +TOOLS FROM AFRICA AND ASIA ABOUT 100,000 YEARS AGO + +Professor Movius characterizes early prehistoric Africa as a continent +showing a variety of stone industries. Some of these industries were +purely local developments and some were practically identical with +industries found in Europe at the same time. From northwest Africa +to Capetown--excepting the tropical rain forest region of the west +center--tools of developed Acheulean, Levalloisian, and Mousterian +types have been recognized. Often they are named after African place +names. + +In east and south Africa lived people whose industries show a +development of the Levalloisian technique. Such industries are +called Stillbay. Another industry, developed on the basis of the +Acheulean technique, is called Fauresmith. From the northwest comes +an industry with tanged points and flake-blades; this is called the +Aterian. The tropical rain forest region contained people whose stone +tools apparently show adjustment to this peculiar environment; the +so-called Sangoan industry includes stone picks, adzes, core-bifaces +of specialized Acheulean type, and bifacial points which were probably +spearheads. + +In western Asia, even as far as the east coast of India, the tools of +the Eurafrican core-biface and flake tool traditions continued to be +used. But in the Far East, as we noted in the last chapter, men had +developed characteristic stone chopper and chopping tools. This tool +preparation tradition--basically a pebble tool tradition--lasted to the +very end of the Ice Age. + +When more intact open air sites such as that of an earlier time at +Olorgesailie, and more stratified cave sites are found and excavated +in Asia and Africa, we shall be able to get a more complete picture. +So far, our picture of the general cultural level of the Old World at +about 100,000 years ago--and soon afterwards--is best from Europe, but +it is still far from complete there, too. + + +CULTURE AT THE BEGINNING OF THE LAST GREAT GLACIAL PERIOD + +The few things we have found must indicate only a very small part +of the total activities of the people who lived at the time. All of +the things they made of wood and bark, of skins, of anything soft, +are gone. The fact that burials were made, at least in Europe and +Palestine, is pretty clear proof that the people had some notion of a +life after death. But what this notion really was, or what gods (if +any) men believed in, we cannot know. Dr. Movius has also reminded me +of the so-called bear cults--cases in which caves have been found which +contain the skulls of bears in apparently purposeful arrangement. This +might suggest some notion of hoarding up the spirits or the strength of +bears killed in the hunt. Probably the people lived in small groups, +as hunting and food-gathering seldom provide enough food for large +groups of people. These groups probably had some kind of leader or +“chief.” Very likely the rude beginnings of rules for community life +and politics, and even law, were being made. But what these were, we +do not know. We can only guess about such things, as we can only guess +about many others; for example, how the idea of a family must have been +growing, and how there may have been witch doctors who made beginnings +in medicine or in art, in the materials they gathered for their trade. + +The stone tools help us most. They have lasted, and we can find +them. As they come to us, from this cave or that, and from this +layer or that, the tool industries show a variety of combinations +of the different basic habits or traditions of tool preparation. +This seems only natural, as the groups of people must have been very +small. The mixtures and blendings of the habits used in making stone +tools must mean that there were also mixtures and blends in many of +the other ideas and beliefs of these small groups. And what this +probably means is that there was no one _culture_ of the time. It is +certainly unlikely that there were simply three cultures, “Acheulean,” +“Levalloisian,” and “Mousterian,” as has been thought in the past. +Rather there must have been a great variety of loosely related cultures +at about the same stage of advancement. We could say, too, that here +we really begin to see, for the first time, that remarkable ability +of men to adapt themselves to a variety of conditions. We shall see +this adaptive ability even more clearly as time goes on and the record +becomes more complete. + +Over how great an area did these loosely related cultures reach in +the time 75,000 to 45,000 or even as late as 35,000 years ago? We +have described stone tools made in one or another of the flake and +core-biface habits, for an enormous area. It covers all of Europe, all +of Africa, the Near East, and parts of India. It is perfectly possible +that the flake and core-biface habits lasted on after 35,000 years ago, +in some places outside of Europe. In northern Africa, for example, we +are certain that they did (see chart, p. 72). + +On the other hand, in the Far East (China, Burma, Java) and in northern +India, the tools of the old chopper-tool tradition were still being +made. Out there, we must assume, there was a different set of loosely +related cultures. At least, there was a different set of loosely +related habits for the making of tools. But the men who made them must +have looked much like the men of the West. Their tools were different, +but just as useful. + +As to what the men of the West looked like, I’ve already hinted at all +we know so far (pp. 29 ff.). The Neanderthalers were present at +the time. Some more modern-like men must have been about, too, since +fossils of them have turned up at Mount Carmel in Palestine, and at +Teshik Tash, in Trans-caspian Russia. It is still too soon to know +whether certain combinations of tools within industries were made +only by certain physical types of men. But since tools of both the +core-biface and the flake traditions, and their blends, turn up from +South Africa to England to India, it is most unlikely that only one +type of man used only one particular habit in the preparation of tools. +What seems perfectly clear is that men in Africa and men in India were +making just as good tools as the men who lived in western Europe. + + + + +EARLY MODERNS + +[Illustration] + + +From some time during the first inter-stadial of the last great +glaciation (say some time after about 40,000 years ago), we have +more accurate dates for the European-Mediterranean area and less +accurate ones for the rest of the Old World. This is probably +because the effects of the last glaciation have been studied in the +European-Mediterranean area more than they have been elsewhere. + + +A NEW TRADITION APPEARS + +Something new was probably beginning to happen in the +European-Mediterranean area about 40,000 years ago, though all the +rest of the Old World seems to have been going on as it had been. I +can’t be sure of this because the information we are using as a basis +for dates is very inaccurate for the areas outside of Europe and the +Mediterranean. + +We can at least make a guess. In Egypt and north Africa, men were still +using the old methods of making stone tools. This was especially true +of flake tools of the Levalloisian type, save that they were growing +smaller and smaller as time went on. But at the same time, a new +tradition was becoming popular in westernmost Asia and in Europe. This +was the blade-tool tradition. + + +BLADE TOOLS + +A stone blade is really just a long parallel-sided flake, as the +drawing shows. It has sharp cutting edges, and makes a very useful +knife. The real trick is to be able to make one. It is almost +impossible to make a blade out of any stone but flint or a natural +volcanic glass called obsidian. And even if you have flint or obsidian, +you first have to work up a special cone-shaped “blade-core,” from +which to whack off blades. + +[Illustration: PLAIN BLADE] + +You whack with a hammer stone against a bone or antler punch which is +directed at the proper place on the blade-core. The blade-core has to +be well supported or gripped while this is going on. To get a good +flint blade tool takes a great deal of know-how. + +Remember that a tradition in stone tools means no more than that some +particular way of making the tools got started and lasted a long time. +Men who made some tools in one tradition or set of habits would also +make other tools for different purposes by means of another tradition +or set of habits. It was even possible for the two sets of habits to +become combined. + + +THE EARLIEST BLADE TOOLS + +The oldest blade tools we have found were deep down in the layers of +the Mount Carmel caves, in Tabun Eb and Ea. Similar tools have been +found in equally early cave levels in Syria; their popularity there +seems to fluctuate a bit. Some more or less parallel-sided flakes are +known in the Levalloisian industry in France, but they are probably +no earlier than Tabun E. The Tabun blades are part of a local late +“Acheulean” industry, which is characterized by core-biface “hand +axes,” but which has many flake tools as well. Professor F. E. +Zeuner believes that this industry may be more than 120,000 years old; +actually its date has not yet been fixed, but it is very old--older +than the fossil finds of modern-like men in the same caves. + +[Illustration: SUCCESSION OF ICE AGE FLINT TYPES, INDUSTRIES, AND +ASSEMBLAGES, AND OF FOSSIL MEN, IN NORTHWESTERN EURAFRASIA] + +For some reason, the habit of making blades in Palestine and Syria was +interrupted. Blades only reappeared there at about the same time they +were first made in Europe, some time after 45,000 years ago; that is, +after the first phase of the last glaciation was ended. + +[Illustration: BACKED BLADE] + +We are not sure just where the earliest _persisting_ habits for the +production of blade tools developed. Impressed by the very early +momentary appearance of blades at Tabun on Mount Carmel, Professor +Dorothy A. Garrod first favored the Near East as a center of origin. +She spoke of “some as yet unidentified Asiatic centre,” which she +thought might be in the highlands of Iran or just beyond. But more +recent work has been done in this area, especially by Professor Coon, +and the blade tools do not seem to have an early appearance there. When +the blade tools reappear in the Syro-Palestinian area, they do so in +industries which also include Levalloiso-Mousterian flake tools. From +the point of view of form and workmanship, the blade tools themselves +are not so fine as those which seem to be making their appearance +in western Europe about the same time. There is a characteristic +Syro-Palestinian flake point, possibly a projectile tip, called the +Emiran, which is not known from Europe. The appearance of blade tools, +together with Levalloiso-Mousterian flakes, continues even after the +Emiran point has gone out of use. + +It seems clear that the production of blade tools did not immediately +swamp the set of older habits in Europe, too; the use of flake +tools also continued there. This was not so apparent to the older +archeologists, whose attention was focused on individual tool types. It +is not, in fact, impossible--although it is certainly not proved--that +the technique developed in the preparation of the Levalloisian tortoise +core (and the striking of the Levalloisian flake from it) might have +followed through to the conical core and punch technique for the +production of blades. Professor Garrod is much impressed with the speed +of change during the later phases of the last glaciation, and its +probable consequences. She speaks of “the greater number of industries +having enough individual character to be classified as distinct ... +since evolution now starts to outstrip diffusion.” Her “evolution” here +is of course an industrial evolution rather than a biological one. +Certainly the people of Europe had begun to make blade tools during +the warm spell after the first phase of the last glaciation. By about +40,000 years ago blades were well established. The bones of the blade +tool makers we’ve found so far indicate that anatomically modern men +had now certainly appeared. Unfortunately, only a few fossil men have +so far been found from the very beginning of the blade tool range in +Europe (or elsewhere). What I certainly shall _not_ tell you is that +conquering bands of fine, strong, anatomically modern men, armed with +superior blade tools, came sweeping out of the East to exterminate the +lowly Neanderthalers. Even if we don’t know exactly what happened, I’d +lay a good bet it wasn’t that simple. + +We do know a good deal about different blade industries in Europe. +Almost all of them come from cave layers. There is a great deal of +complication in what we find. The chart (p. 72) tries to simplify +this complication; in fact, it doubtless simplifies it too much. But +it may suggest all the complication of industries which is going +on at this time. You will note that the upper portion of my much +simpler chart (p. 65) covers the same material (in the section +marked “Various Blade-Tool Industries”). That chart is certainly too +simplified. + +You will realize that all this complication comes not only from +the fact that we are finding more material. It is due also to the +increasing ability of men to adapt themselves to a great variety of +situations. Their tools indicate this adaptiveness. We know there was +a good deal of climatic change at this time. The plants and animals +that men used for food were changing, too. The great variety of tools +and industries we now find reflect these changes and the ability of men +to keep up with the times. Now, for example, is the first time we are +sure that there are tools to _make_ other tools. They also show men’s +increasing ability to adapt themselves. + + +SPECIAL TYPES OF BLADE TOOLS + +The most useful tools that appear at this time were made from blades. + + 1. The “backed” blade. This is a knife made of a flint blade, with + one edge purposely blunted, probably to save the user’s fingers + from being cut. There are several shapes of backed blades (p. + 73). + + [Illustration: TWO BURINS] + + 2. The _burin_ or “graver.” The burin was the original chisel. Its + cutting edge is _transverse_, like a chisel’s. Some burins are + made like a screw-driver, save that burins are sharp. Others have + edges more like the blade of a chisel or a push plane, with + only one bevel. Burins were probably used to make slots in wood + and bone; that is, to make handles or shafts for other tools. + They must also be the tools with which much of the engraving on + bone (see p. 83) was done. There is a bewildering variety of + different kinds of burins. + +[Illustration: TANGED POINT] + + 3. The “tanged” point. These stone points were used to tip arrows or + light spears. They were made from blades, and they had a long tang + at the bottom where they were fixed to the shaft. At the place + where the tang met the main body of the stone point, there was + a marked “shoulder,” the beginnings of a barb. Such points had + either one or two shoulders. + +[Illustration: NOTCHED BLADE] + + 4. The “notched” or “strangulated” blade. Along with the points for + arrows or light spears must go a tool to prepare the arrow or + spear shaft. Today, such a tool would be called a “draw-knife” or + a “spoke-shave,” and this is what the notched blades probably are. + Our spoke-shaves have sharp straight cutting blades and really + “shave.” Notched blades of flint probably scraped rather than cut. + + 5. The “awl,” “drill,” or “borer.” These blade tools are worked out + to a spike-like point. They must have been used for making holes + in wood, bone, shell, skin, or other things. + +[Illustration: DRILL OR AWL] + + 6. The “end-scraper on a blade” is a tool with one or both ends + worked so as to give a good scraping edge. It could have been used + to hollow out wood or bone, scrape hides, remove bark from trees, + and a number of other things (p. 78). + +There is one very special type of flint tool, which is best known from +western Europe in an industry called the Solutrean. These tools were +usually made of blades, but the best examples are so carefully worked +on both sides (bifacially) that it is impossible to see the original +blade. This tool is + + 7. The “laurel leaf” point. Some of these tools were long and + dagger-like, and must have been used as knives or daggers. Others + were small, called “willow leaf,” and must have been mounted on + spear or arrow shafts. Another typical Solutrean tool is the + “shouldered” point. Both the “laurel leaf” and “shouldered” point + types are illustrated (see above and p. 79). + +[Illustration: END-SCRAPER ON A BLADE] + +[Illustration: LAUREL LEAF POINT] + +The industries characterized by tools in the blade tradition also +yield some flake and core tools. We will end this list with two types +of tools that appear at this time. The first is made of a flake; the +second is a core tool. + +[Illustration: SHOULDERED POINT] + + 8. The “keel-shaped round scraper” is usually small and quite round, + and has had chips removed up to a peak in the center. It is called + “keel-shaped” because it is supposed to look (when upside down) + like a section through a boat. Actually, it looks more like a tent + or an umbrella. Its outer edges are sharp all the way around, and + it was probably a general purpose scraping tool (see illustration, + p. 81). + + 9. The “keel-shaped nosed scraper” is a much larger and heavier tool + than the round scraper. It was made on a core with a flat bottom, + and has one nicely worked end or “nose.” Such tools are usually + large enough to be easily grasped, and probably were used like + push planes (see illustration, p. 81). + +[Illustration: KEEL-SHAPED ROUND SCRAPER] + +[Illustration: KEEL-SHAPED NOSED SCRAPER] + +The stone tools (usually made of flint) we have just listed are among +the most easily recognized blade tools, although they show differences +in detail at different times. There are also many other kinds. Not +all of these tools appear in any one industry at one time. Thus the +different industries shown in the chart (p. 72) each have only some +of the blade tools we’ve just listed, and also a few flake tools. Some +industries even have a few core tools. The particular types of blade +tools appearing in one cave layer or another, and the frequency of +appearance of the different types, tell which industry we have in each +layer. + + +OTHER KINDS OF TOOLS + +By this time in Europe--say from about 40,000 to about 10,000 years +ago--we begin to find other kinds of material too. Bone tools begin +to appear. There are knives, pins, needles with eyes, and little +double-pointed straight bars of bone that were probably fish-hooks. The +fish-line would have been fastened in the center of the bar; when the +fish swallowed the bait, the bar would have caught cross-wise in the +fish’s mouth. + +One quite special kind of bone tool is a long flat point for a light +spear. It has a deep notch cut up into the breadth of its base, and is +called a “split-based bone point” (p. 82). We know examples of bone +beads from these times, and of bone handles for flint tools. Pierced +teeth of some animals were worn as beads or pendants, but I am not sure +that elks’ teeth were worn this early. There are even spool-shaped +“buttons” or toggles. + +[Illustration: SPLIT-BASED BONE POINT] + +[Illustration: SPEAR-THROWER] + +[Illustration: BONE HARPOON] + +Antler came into use for tools, especially in central and western +Europe. We do not know the use of one particular antler tool that +has a large hole bored in one end. One suggestion is that it was +a thong-stropper used to strop or work up hide thongs (see +illustration, below); another suggestion is that it was an arrow-shaft +straightener. + +Another interesting tool, usually of antler, is the spear-thrower, +which is little more than a stick with a notch or hook on one end. +The hook fits into the butt end of the spear, and the length of the +spear-thrower allows you to put much more power into the throw (p. +82). It works on pretty much the same principle as the sling. + +Very fancy harpoons of antler were also made in the latter half of +the period in western Europe. These harpoons had barbs on one or both +sides and a base which would slip out of the shaft (p. 82). Some have +engraved decoration. + + +THE BEGINNING OF ART + +[Illustration: THONG-STROPPER] + +In western Europe, at least, the period saw the beginning of several +kinds of art work. It is handy to break the art down into two great +groups: the movable art, and the cave paintings and sculpture. The +movable art group includes the scratchings, engravings, and modeling +which decorate tools and weapons. Knives, stroppers, spear-throwers, +harpoons, and sometimes just plain fragments of bone or antler are +often carved. There is also a group of large flat pebbles which seem +almost to have served as sketch blocks. The surfaces of these various +objects may show animals, or rather abstract floral designs, or +geometric designs. + +[Illustration: “VENUS” FIGURINE FROM WILLENDORF] + +Some of the movable art is not done on tools. The most remarkable +examples of this class are little figures of women. These women seem to +be pregnant, and their most female characteristics are much emphasized. +It is thought that these “Venus” or “Mother-goddess” figurines may be +meant to show the great forces of nature--fertility and the birth of +life. + + +CAVE PAINTINGS + +In the paintings on walls and ceilings of caves we have some examples +that compare with the best art of any time. The subjects were usually +animals, the great cold-weather beasts of the end of the Ice Age: the +mammoth, the wooly rhinoceros, the bison, the reindeer, the wild horse, +the bear, the wild boar, and wild cattle. As in the movable art, there +are different styles in the cave art. The really great cave art is +pretty well restricted to southern France and Cantabrian (northwestern) +Spain. + +There are several interesting things about the “Franco-Cantabrian” cave +art. It was done deep down in the darkest and most dangerous parts of +the caves, although the men lived only in the openings of caves. If you +think what they must have had for lights--crude lamps of hollowed stone +have been found, which must have burned some kind of oil or grease, +with a matted hair or fiber wick--and of the animals that may have +lurked in the caves, you’ll understand the part about danger. Then, +too, we’re sure the pictures these people painted were not simply to be +looked at and admired, for they painted one picture right over other +pictures which had been done earlier. Clearly, it was the _act_ of +_painting_ that counted. The painter had to go way down into the most +mysterious depths of the earth and create an animal in paint. Possibly +he believed that by doing this he gained some sort of magic power over +the same kind of animal when he hunted it in the open air. It certainly +doesn’t look as if he cared very much about the picture he painted--as +a finished product to be admired--for he or somebody else soon went +down and painted another animal right over the one he had done. + +The cave art of the Franco-Cantabrian style is one of the great +artistic achievements of all time. The subjects drawn are almost always +the larger animals of the time: the bison, wild cattle and horses, the +wooly rhinoceros, the mammoth, the wild boar, and the bear. In some of +the best examples, the beasts are drawn in full color and the paintings +are remarkably alive and charged with energy. They come from the hands +of men who knew the great animals well--knew the feel of their fur, the +tremendous drive of their muscles, and the danger one faced when he +hunted them. + +Another artistic style has been found in eastern Spain. It includes +lively drawings, often of people hunting with bow and arrow. The East +Spanish art is found on open rock faces and in rock-shelters. It is +less spectacular and apparently more recent than the Franco-Cantabrian +cave art. + + +LIFE AT THE END OF THE ICE AGE IN EUROPE + +Life in these times was probably as good as a hunter could expect it +to be. Game and fish seem to have been plentiful; berries and wild +fruits probably were, too. From France to Russia, great pits or +piles of animal bones have been found. Some of this killing was done +as our Plains Indians killed the buffalo--by stampeding them over +steep river banks or cliffs. There were also good tools for hunting, +however. In western Europe, people lived in the openings of caves and +under overhanging rocks. On the great plains of eastern Europe, very +crude huts were being built, half underground. The first part of this +time must have been cold, for it was the middle and end phases of the +last great glaciation. Northern Europe from Scotland to Scandinavia, +northern Germany and Russia, and also the higher mountains to the +south, were certainly covered with ice. But people had fire, and the +needles and tools that were used for scraping hides must mean that they +wore clothing. + +It is clear that men were thinking of a great variety of things beside +the tools that helped them get food and shelter. Such burials as we +find have more grave-gifts than before. Beads and ornaments and often +flint, bone, or antler tools are included in the grave, and sometimes +the body is sprinkled with red ochre. Red is the color of blood, which +means life, and of fire, which means heat. Professor Childe wonders if +the red ochre was a pathetic attempt at magic--to give back to the body +the heat that had gone from it. But pathetic or not, it is sure proof +that these people were already moved by death as men still are moved by +it. + +Their art is another example of the direction the human mind was +taking. And when I say human, I mean it in the fullest sense, for this +is the time in which fully modern man has appeared. On page 34, we +spoke of the Cro-Magnon group and of the Combe Capelle-Brünn group of +Caucasoids and of the Grimaldi “Negroids,” who are no longer believed +to be Negroid. I doubt that any one of these groups produced most of +the achievements of the times. It’s not yet absolutely sure which +particular group produced the great cave art. The artists were almost +certainly a blend of several (no doubt already mixed) groups. The pair +of Grimaldians were buried in a grave with a sprinkling of red ochre, +and were provided with shell beads and ornaments and with some blade +tools of flint. Regardless of the different names once given them by +the human paleontologists, each of these groups seems to have shared +equally in the cultural achievements of the times, for all that the +archeologists can say. + + +MICROLITHS + +One peculiar set of tools seems to serve as a marker for the very last +phase of the Ice Age in southwestern Europe. This tool-making habit is +also found about the shore of the Mediterranean basin, and it moved +into northern Europe as the last glaciation pulled northward. People +began making blade tools of very small size. They learned how to chip +very slender and tiny blades from a prepared core. Then they made these +little blades into tiny triangles, half-moons (“lunates”), trapezoids, +and several other geometric forms. These little tools are called +“microliths.” They are so small that most of them must have been fixed +in handles or shafts. + +[Illustration: MICROLITHS + + BLADE FRAGMENT + BURIN + LUNATE + TRAPEZOID + SCALENE TRIANGLE + ARROWHEAD] + +We have found several examples of microliths mounted in shafts. In +northern Europe, where their use soon spread, the microlithic triangles +or lunates were set in rows down each side of a bone or wood point. +One corner of each little triangle stuck out, and the whole thing +made a fine barbed harpoon. In historic times in Egypt, geometric +trapezoidal microliths were still in use as arrowheads. They were +fastened--broad end out--on the end of an arrow shaft. It seems queer +to give an arrow a point shaped like a “T.” Actually, the little points +were very sharp, and must have pierced the hides of animals very +easily. We also think that the broader cutting edge of the point may +have caused more bleeding than a pointed arrowhead would. In hunting +fleet-footed animals like the gazelle, which might run for miles after +being shot with an arrow, it was an advantage to cause as much bleeding +as possible, for the animal would drop sooner. + +We are not really sure where the microliths were first invented. There +is some evidence that they appear early in the Near East. Their use +was very common in northwest Africa but this came later. The microlith +makers who reached south Russia and central Europe possibly moved up +out of the Near East. Or it may have been the other way around; we +simply don’t yet know. + +Remember that the microliths we are talking about here were made from +carefully prepared little blades, and are often geometric in outline. +Each microlithic industry proper was made up, in good part, of such +tiny blade tools. But there were also some normal-sized blade tools and +even some flake scrapers, in most microlithic industries. I emphasize +this bladelet and the geometric character of the microlithic industries +of the western Old World, since there has sometimes been confusion in +the matter. Sometimes small flake chips, utilized as minute pointed +tools, have been called “microliths.” They may be _microlithic_ in size +in terms of the general meaning of the word, but they do not seem to +belong to the sub-tradition of the blade tool preparation habits which +we have been discussing here. + + +LATER BLADE-TOOL INDUSTRIES OF THE NEAR EAST AND AFRICA + +The blade-tool industries of normal size we talked about earlier spread +from Europe to central Siberia. We noted that blade tools were made +in western Asia too, and early, although Professor Garrod is no longer +sure that the whole tradition originated in the Near East. If you look +again at my chart (p. 72) you will note that in western Asia I list +some of the names of the western European industries, but with the +qualification “-like” (for example, “Gravettian-like”). The western +Asiatic blade-tool industries do vaguely recall some aspects of those +of western Europe, but we would probably be better off if we used +completely local names for them. The “Emiran” of my chart is such an +example; its industry includes a long spike-like blade point which has +no western European counterpart. + +When we last spoke of Africa (p. 66), I told you that stone tools +there were continuing in the Levalloisian flake tradition, and were +becoming smaller. At some time during this process, two new tool +types appeared in northern Africa: one was the Aterian point with +a tang (p. 67), and the other was a sort of “laurel leaf” point, +called the “Sbaikian.” These two tool types were both produced from +flakes. The Sbaikian points, especially, are roughly similar to some +of the Solutrean points of Europe. It has been suggested that both the +Sbaikian and Aterian points may be seen on their way to France through +their appearance in the Spanish cave deposits of Parpallo, but there is +also a rival “pre-Solutrean” in central Europe. We still do not know +whether there was any contact between the makers of these north African +tools and the Solutrean tool-makers. What does seem clear is that the +blade-tool tradition itself arrived late in northern Africa. + + +NETHER AFRICA + +Blade tools and “laurel leaf” points and some other probably late +stone tool types also appear in central and southern Africa. There +are geometric microliths on bladelets and even some coarse pottery in +east Africa. There is as yet no good way of telling just where these +items belong in time; in broad geological terms they are “late.” +Some people have guessed that they are as early as similar European +and Near Eastern examples, but I doubt it. The makers of small-sized +Levalloisian flake tools occupied much of Africa until very late in +time. + + +THE FAR EAST + +India and the Far East still seem to be going their own way. In India, +some blade tools have been found. These are not well dated, save that +we believe they must be post-Pleistocene. In the Far East it looks as +if the old chopper-tool tradition was still continuing. For Burma, +Dr. Movius feels this is fairly certain; for China he feels even more +certain. Actually, we know very little about the Far East at about the +time of the last glaciation. This is a shame, too, as you will soon +agree. + + +THE NEW WORLD BECOMES INHABITED + +At some time toward the end of the last great glaciation--almost +certainly after 20,000 years ago--people began to move over Bering +Strait, from Asia into America. As you know, the American Indians have +been assumed to be basically Mongoloids. New studies of blood group +types make this somewhat uncertain, but there is no doubt that the +ancestors of the American Indians came from Asia. + +The stone-tool traditions of Europe, Africa, the Near and Middle East, +and central Siberia, did _not_ move into the New World. With only a +very few special or late exceptions, there are _no_ core-bifaces, +flakes, or blade tools of the Old World. Such things just haven’t been +found here. + +This is why I say it’s a shame we don’t know more of the end of the +chopper-tool tradition in the Far East. According to Weidenreich, +the Mongoloids were in the Far East long before the end of the last +glaciation. If the genetics of the blood group types do demand a +non-Mongoloid ancestry for the American Indians, who else may have been +in the Far East 25,000 years ago? We know a little about the habits +for making stone tools which these first people brought with them, +and these habits don’t conform with those of the western Old World. +We’d better keep our eyes open for whatever happened to the end of +the chopper-tool tradition in northern China; already there are hints +that it lasted late there. Also we should watch future excavations +in eastern Siberia. Perhaps we shall find the chopper-tool tradition +spreading up that far. + + +THE NEW ERA + +Perhaps it comes in part from the way I read the evidence and perhaps +in part it is only intuition, but I feel that the materials of this +chapter suggest a new era in the ways of life. Before about 40,000 +years ago, people simply “gathered” their food, wandering over large +areas to scavenge or to hunt in a simple sort of way. But here we +have seen them “settling-in” more, perhaps restricting themselves in +their wanderings and adapting themselves to a given locality in more +intensive ways. This intensification might be suggested by the word +“collecting.” The ways of life we described in the earlier chapters +were “food-gathering” ways, but now an era of “food-collecting” has +begun. We shall see further intensifications of it in the next chapter. + + + + +End and PRELUDE + +[Illustration] + + +Up to the end of the last glaciation, we prehistorians have a +relatively comfortable time schedule. The farther back we go the less +exact we can be about time and details. Elbow-room of five, ten, +even fifty or more thousands of years becomes available for us to +maneuver in as we work backward in time. But now our story has come +forward to the point where more exact methods of dating are at hand. +The radioactive carbon method reaches back into the span of the last +glaciation. There are other methods, developed by the geologists and +paleobotanists, which supplement and extend the usefulness of the +radioactive carbon dates. And, happily, as our means of being more +exact increases, our story grows more exciting. There are also more +details of culture for us to deal with, which add to the interest. + + +CHANGES AT THE END OF THE ICE AGE + +The last great glaciation of the Ice Age was a two-part affair, with a +sub-phase at the end of the second part. In Europe the last sub-phase +of this glaciation commenced somewhere around 15,000 years ago. Then +the glaciers began to melt back, for the last time. Remember that +Professor Antevs (p. 19) isn’t sure the Ice Age is over yet! This +melting sometimes went by fits and starts, and the weather wasn’t +always changing for the better; but there was at least one time when +European weather was even better than it is now. + +The melting back of the glaciers and the weather fluctuations caused +other changes, too. We know a fair amount about these changes in +Europe. In an earlier chapter, we said that the whole Ice Age was a +matter of continual change over long periods of time. As the last +glaciers began to melt back some interesting things happened to mankind. + +In Europe, along with the melting of the last glaciers, geography +itself was changing. Britain and Ireland had certainly become islands +by 5000 B.C. The Baltic was sometimes a salt sea, sometimes a large +fresh-water lake. Forests began to grow where the glaciers had been, +and in what had once been the cold tundra areas in front of the +glaciers. The great cold-weather animals--the mammoth and the wooly +rhinoceros--retreated northward and finally died out. It is probable +that the efficient hunting of the earlier people of 20,000 or 25,000 +to about 12,000 years ago had helped this process along (see p. 86). +Europeans, especially those of the post-glacial period, had to keep +changing to keep up with the times. + +The archeological materials for the time from 10,000 to 6000 B.C. seem +simpler than those of the previous five thousand years. The great cave +art of France and Spain had gone; so had the fine carving in bone and +antler. Smaller, speedier animals were moving into the new forests. New +ways of hunting them, or ways of getting other food, had to be found. +Hence, new tools and weapons were necessary. Some of the people who +moved into northern Germany were successful reindeer hunters. Then the +reindeer moved off to the north, and again new sources of food had to +be found. + + +THE READJUSTMENTS COMPLETED IN EUROPE + +After a few thousand years, things began to look better. Or at least +we can say this: By about 6000 B.C. we again get hotter archeological +materials. The best of these come from the north European area: +Britain, Belgium, Holland, Denmark, north Germany, southern Norway and +Sweden. Much of this north European material comes from bogs and swamps +where it had become water-logged and has kept very well. Thus we have +much more complete _assemblages_[4] than for any time earlier. + + [4] “Assemblage” is a useful word when there are different kinds of + archeological materials belonging together, from one area and of + one time. An assemblage is made up of a number of “industries” + (that is, all the tools in chipped stone, all the tools in + bone, all the tools in wood, the traces of houses, etc.) and + everything else that manages to survive, such as the art, the + burials, the bones of the animals used as food, and the traces + of plant foods; in fact, everything that has been left to us + and can be used to help reconstruct the lives of the people to + whom it once belonged. Our own present-day “assemblage” would be + the sum total of all the objects in our mail-order catalogues, + department stores and supply houses of every sort, our churches, + our art galleries and other buildings, together with our roads, + canals, dams, irrigation ditches, and any other traces we might + leave of ourselves, from graves to garbage dumps. Not everything + would last, so that an archeologist digging us up--say 2,000 + years from now--would find only the most durable items in our + assemblage. + +The best known of these assemblages is the _Maglemosian_, named after a +great Danish peat-swamp where much has been found. + +[Illustration: SKETCH OF MAGLEMOSIAN ASSEMBLAGE + + CHIPPED STONE + HEMP + GROUND STONE + BONE AND ANTLER + WOOD] + +In the Maglemosian assemblage the flint industry was still very +important. Blade tools, tanged arrow points, and burins were still +made, but there were also axes for cutting the trees in the new +forests. Moreover, the tiny microlithic blades, in a variety of +geometric forms, are also found. Thus, a specialized tradition that +possibly began east of the Mediterranean had reached northern Europe. +There was also a ground stone industry; some axes and club-heads were +made by grinding and polishing rather than by chipping. The industries +in bone and antler show a great variety of tools: axes, fish-hooks, +fish spears, handles and hafts for other tools, harpoons, and clubs. +A remarkable industry in wood has been preserved. Paddles, sled +runners, handles for tools, and bark floats for fish-nets have been +found. There are even fish-nets made of plant fibers. Canoes of some +kind were no doubt made. Bone and antler tools were decorated with +simple patterns, and amber was collected. Wooden bows and arrows are +found. + +It seems likely that the Maglemosian bog finds are remains of summer +camps, and that in winter the people moved to higher and drier regions. +Childe calls them the “Forest folk”; they probably lived much the +same sort of life as did our pre-agricultural Indians of the north +central states. They hunted small game or deer; they did a great deal +of fishing; they collected what plant food they could find. In fact, +their assemblage shows us again that remarkable ability of men to adapt +themselves to change. They had succeeded in domesticating the dog; he +was still a very wolf-like dog, but his long association with mankind +had now begun. Professor Coon believes that these people were direct +descendants of the men of the glacial age and that they had much the +same appearance. He believes that most of the Ice Age survivors still +extant are living today in the northwestern European area. + + +SOUTH AND CENTRAL EUROPE PERHAPS AS READJUSTED AS THE NORTH + +There is always one trouble with things that come from areas where +preservation is exceptionally good: The very quantity of materials in +such an assemblage tends to make things from other areas look poor +and simple, although they may not have been so originally at all. The +assemblages of the people who lived to the south of the Maglemosian +area may also have been quite large and varied; but, unfortunately, +relatively little of the southern assemblages has lasted. The +water-logged sites of the Maglemosian area preserved a great deal +more. Hence the Maglemosian itself _looks_ quite advanced to us, when +we compare it with the few things that have happened to last in other +areas. If we could go back and wander over the Europe of eight thousand +years ago, we would probably find that the peoples of France, central +Europe, and south central Russia were just as advanced as those of the +north European-Baltic belt. + +South of the north European belt the hunting-food-collecting peoples +were living on as best they could during this time. One interesting +group, which seems to have kept to the regions of sandy soil and scrub +forest, made great quantities of geometric microliths. These are the +materials called _Tardenoisian_. The materials of the “Forest folk” of +France and central Europe generally are called _Azilian_; Dr. Movius +believes the term might best be restricted to the area south of the +Loire River. + + +HOW MUCH REAL CHANGE WAS THERE? + +You can see that no really _basic_ change in the way of life has yet +been described. Childe sees the problem that faced the Europeans of +10,000 to 3000 B.C. as a problem in readaptation to the post-glacial +forest environment. By 6000 B.C. some quite successful solutions of +the problem--like the Maglemosian--had been made. The upsets that came +with the melting of the last ice gradually brought about all sorts of +changes in the tools and food-getting habits, but the people themselves +were still just as much simple hunters, fishers, and food-collectors as +they had been in 25,000 B.C. It could be said that they changed just +enough so that they would not have to change. But there is a bit more +to it than this. + +Professor Mathiassen of Copenhagen, who knows the archeological remains +of this time very well, poses a question. He speaks of the material +as being neither rich nor progressive, in fact “rather stagnant,” but +he goes on to add that the people had a certain “receptiveness” and +were able to adapt themselves quickly when the next change did come. +My own understanding of the situation is that the “Forest folk” made +nothing as spectacular as had the producers of the earlier Magdalenian +assemblage and the Franco-Cantabrian art. On the other hand, they +_seem_ to have been making many more different kinds of tools for many +more different kinds of tasks than had their Ice Age forerunners. I +emphasize “seem” because the preservation in the Maglemosian bogs +is very complete; certainly we cannot list anywhere near as many +different things for earlier times as we did for the Maglemosians +(p. 94). I believe this experimentation with all kinds of new tools +and gadgets, this intensification of adaptiveness (p. 91), this +“receptiveness,” even if it is still only pointed toward hunting, +fishing, and food-collecting, is an important thing. + +Remember that the only marker we have handy for the _beginning_ of +this tendency toward “receptiveness” and experimentation is the +little microlithic blade tools of various geometric forms. These, we +saw, began before the last ice had melted away, and they lasted on +in use for a very long time. I wish there were a better marker than +the microliths but I do not know of one. Remember, too, that as yet +we can only use the microliths as a marker in Europe and about the +Mediterranean. + + +CHANGES IN OTHER AREAS? + +All this last section was about Europe. How about the rest of the world +when the last glaciers were melting away? + +We simply don’t know much about this particular time in other parts +of the world except in Europe, the Mediterranean basin and the Middle +East. People were certainly continuing to move into the New World by +way of Siberia and the Bering Strait about this time. But for the +greater part of Africa and Asia, we do not know exactly what was +happening. Some day, we shall no doubt find out; today we are without +clear information. + + +REAL CHANGE AND PRELUDE IN THE NEAR EAST + +The appearance of the microliths and the developments made by the +“Forest folk” of northwestern Europe also mark an end. They show us +the terminal phase of the old food-collecting way of life. It grows +increasingly clear that at about the same time that the Maglemosian and +other “Forest folk” were adapting themselves to hunting, fishing, and +collecting in new ways to fit the post-glacial environment, something +completely new was being made ready in western Asia. + +Unfortunately, we do not have as much understanding of the climate and +environment of the late Ice Age in western Asia as we have for most +of Europe. Probably the weather was never so violent or life quite +so rugged as it was in northern Europe. We know that the microliths +made their appearance in western Asia at least by 10,000 B.C. and +possibly earlier, marking the beginning of the terminal phase of +food-collecting. Then, gradually, we begin to see the build-up towards +the first _basic change_ in human life. + +This change amounted to a revolution just as important as the +Industrial Revolution. In it, men first learned to domesticate +plants and animals. They began _producing_ their food instead of +simply gathering or collecting it. When their food-production +became reasonably effective, people could and did settle down in +village-farming communities. With the appearance of the little farming +villages, a new way of life was actually under way. Professor Childe +has good reason to speak of the “food-producing revolution,” for it was +indeed a revolution. + + +QUESTIONS ABOUT CAUSE + +We do not yet know _how_ and _why_ this great revolution took place. We +are only just beginning to put the questions properly. I suspect the +answers will concern some delicate and subtle interplay between man and +nature. Clearly, both the level of culture and the natural condition of +the environment must have been ready for the great change, before the +change itself could come about. + +It is going to take years of co-operative field work by both +archeologists and the natural scientists who are most helpful to them +before the _how_ and _why_ answers begin to appear. Anthropologically +trained archeologists are fascinated with the cultures of men in times +of great change. About ten or twelve thousand years ago, the general +level of culture in many parts of the world seems to have been ready +for change. In northwestern Europe, we saw that cultures “changed +just enough so that they would not have to change.” We linked this to +environmental changes with the coming of post-glacial times. + +In western Asia, we archeologists can prove that the food-producing +revolution actually took place. We can see _the_ important consequence +of effective domestication of plants and animals in the appearance of +the settled village-farming community. And within the village-farming +community was the seed of civilization. The way in which effective +domestication of plants and animals came about, however, must also be +linked closely with the natural environment. Thus the archeologists +will not solve the _how_ and _why_ questions alone--they will need the +help of interested natural scientists in the field itself. + + +PRECONDITIONS FOR THE REVOLUTION + +Especially at this point in our story, we must remember how culture and +environment go hand in hand. Neither plants nor animals domesticate +themselves; men domesticate them. Furthermore, men usually domesticate +only those plants and animals which are useful. There is a good +question here: What is cultural usefulness? But I shall side-step it to +save time. Men cannot domesticate plants and animals that do not exist +in the environment where the men live. Also, there are certainly some +animals and probably some plants that resist domestication, although +they might be useful. + +This brings me back again to the point that _both_ the level of culture +and the natural condition of the environment--with the proper plants +and animals in it--must have been ready before domestication could +have happened. But this is precondition, not cause. Why did effective +food-production happen first in the Near East? Why did it happen +independently in the New World slightly later? Why also in the Far +East? Why did it happen at all? Why are all human beings not still +living as the Maglemosians did? These are the questions we still have +to face. + + +CULTURAL “RECEPTIVENESS” AND PROMISING ENVIRONMENTS + +Until the archeologists and the natural scientists--botanists, +geologists, zoologists, and general ecologists--have spent many more +years on the problem, we shall not have full _how_ and _why_ answers. I +do think, however, that we are beginning to understand what to look for. + +We shall have to learn much more of what makes the cultures of men +“receptive” and experimental. Did change in the environment alone +force it? Was it simply a case of Professor Toynbee’s “challenge and +response?” I cannot believe the answer is quite that simple. Were it +so simple, we should want to know why the change hadn’t come earlier, +along with earlier environmental changes. We shall not know the answer, +however, until we have excavated the traces of many more cultures of +the time in question. We shall doubtless also have to learn more about, +and think imaginatively about, the simpler cultures still left today. +The “mechanics” of culture in general will be bound to interest us. + +It will also be necessary to learn much more of the environments of +10,000 to 12,000 years ago. In which regions of the world were the +natural conditions most promising? Did this promise include plants and +animals which could be domesticated, or did it only offer new ways of +food-collecting? There is much work to do on this problem, but we are +beginning to get some general hints. + +Before I begin to detail the hints we now have from western Asia, I +want to do two things. First, I shall tell you of an old theory as to +how food-production might have appeared. Second, I will bother you with +some definitions which should help us in our thinking as the story goes +on. + + +AN OLD THEORY AS TO THE CAUSE OF THE REVOLUTION + +The idea that change would result, if the balance between nature +and culture became upset, is of course not a new one. For at least +twenty-five years, there has been a general theory as to _how_ the +food-producing revolution happened. This theory depends directly on the +idea of natural change in the environment. + +The five thousand years following about 10,000 B.C. must have been +very difficult ones, the theory begins. These were the years when +the most marked melting of the last glaciers was going on. While the +glaciers were in place, the climate to the south of them must have been +different from the climate in those areas today. You have no doubt read +that people once lived in regions now covered by the Sahara Desert. +This is true; just when is not entirely clear. The theory is that +during the time of the glaciers, there was a broad belt of rain winds +south of the glaciers. These rain winds would have kept north Africa, +the Nile Valley, and the Middle East green and fertile. But when the +glaciers melted back to the north, the belt of rain winds is supposed +to have moved north too. Then the people living south and east of the +Mediterranean would have found that their water supply was drying up, +that the animals they hunted were dying or moving away, and that the +plant foods they collected were dried up and scarce. + +According to the theory, all this would have been true except in the +valleys of rivers and in oases in the growing deserts. Here, in the +only places where water was left, the men and animals and plants would +have clustered. They would have been forced to live close to one +another, in order to live at all. Presently the men would have seen +that some animals were more useful or made better food than others, +and so they would have begun to protect these animals from their +natural enemies. The men would also have been forced to try new plant +foods--foods which possibly had to be prepared before they could be +eaten. Thus, with trials and errors, but by being forced to live close +to plants and animals, men would have learned to domesticate them. + + +THE OLD THEORY TOO SIMPLE FOR THE FACTS + +This theory was set up before we really knew anything in detail about +the later prehistory of the Near and Middle East. We now know that +the facts which have been found don’t fit the old theory at all well. +Also, I have yet to find an American meteorologist who feels that we +know enough about the changes in the weather pattern to say that it can +have been so simple and direct. And, of course, the glacial ice which +began melting after 12,000 years ago was merely the last sub-phase of +the last great glaciation. There had also been three earlier periods +of great alpine glaciers, and long periods of warm weather in between. +If the rain belt moved north as the glaciers melted for the last time, +it must have moved in the same direction in earlier times. Thus, the +forced neighborliness of men, plants, and animals in river valleys and +oases must also have happened earlier. Why didn’t domestication happen +earlier, then? + +Furthermore, it does not seem to be in the oases and river valleys +that we have our first or only traces of either food-production +or the earliest farming villages. These traces are also in the +hill-flanks of the mountains of western Asia. Our earliest sites of the +village-farmers do not seem to indicate a greatly different climate +from that which the same region now shows. In fact, everything we now +know suggests that the old theory was just too simple an explanation to +have been the true one. The only reason I mention it--beyond correcting +the ideas you may get in the general texts--is that it illustrates the +kind of thinking we shall have to do, even if it is doubtless wrong in +detail. + +We archeologists shall have to depend much more than we ever have on +the natural scientists who can really help us. I can tell you this from +experience. I had the great good fortune to have on my expedition staff +in Iraq in 1954-55, a geologist, a botanist, and a zoologist. Their +studies added whole new bands of color to my spectrum of thinking about +_how_ and _why_ the revolution took place and how the village-farming +community began. But it was only a beginning; as I said earlier, we are +just now learning to ask the proper questions. + + +ABOUT STAGES AND ERAS + +Now come some definitions, so I may describe my material more easily. +Archeologists have always loved to make divisions and subdivisions +within the long range of materials which they have found. They often +disagree violently about which particular assemblage of material +goes into which subdivision, about what the subdivisions should be +named, about what the subdivisions really mean culturally. Some +archeologists, probably through habit, favor an old scheme of Grecized +names for the subdivisions: paleolithic, mesolithic, neolithic. I +refuse to use these words myself. They have meant too many different +things to too many different people and have tended to hide some pretty +fuzzy thinking. Probably you haven’t even noticed my own scheme of +subdivision up to now, but I’d better tell you in general what it is. + +I think of the earliest great group of archeological materials, from +which we can deduce only a food-gathering way of culture, as the +_food-gathering stage_. I say “stage” rather than “age,” because it +is not quite over yet; there are still a few primitive people in +out-of-the-way parts of the world who remain in the _food-gathering +stage_. In fact, Professor Julian Steward would probably prefer to call +it a food-gathering _level_ of existence, rather than a stage. This +would be perfectly acceptable to me. I also tend to find myself using +_collecting_, rather than _gathering_, for the more recent aspects or +era of the stage, as the word “collecting” appears to have more sense +of purposefulness and specialization than does “gathering” (see p. +91). + +Now, while I think we could make several possible subdivisions of the +food-gathering stage--I call my subdivisions of stages _eras_[5]--I +believe the only one which means much to us here is the last or +_terminal sub-era of food-collecting_ of the whole food-gathering +stage. The microliths seem to mark its approach in the northwestern +part of the Old World. It is really shown best in the Old World by +the materials of the “Forest folk,” the cultural adaptation to the +post-glacial environment in northwestern Europe. We talked about +the “Forest folk” at the beginning of this chapter, and I used the +Maglemosian assemblage of Denmark as an example. + + [5] It is difficult to find words which have a sequence or gradation + of meaning with respect to both development and a range of time + in the past, or with a range of time from somewhere in the past + which is perhaps not yet ended. One standard Webster definition + of _stage_ is: “One of the steps into which the material + development of man ... is divided.” I cannot find any dictionary + definition that suggests which of the words, _stage_ or _era_, + has the meaning of a longer span of time. Therefore, I have + chosen to let my eras be shorter, and to subdivide my stages + into eras. Webster gives _era_ as: “A signal stage of history, + an epoch.” When I want to subdivide my eras, I find myself using + _sub-eras_. Thus I speak of the _eras_ within a _stage_ and of + the _sub-eras_ within an _era_; that is, I do so when I feel + that I really have to, and when the evidence is clear enough to + allow it. + +The food-producing revolution ushers in the _food-producing stage_. +This stage began to be replaced by the _industrial stage_ only about +two hundred years ago. Now notice that my stage divisions are in terms +of technology and economics. We must think sharply to be sure that the +subdivisions of the stages, the eras, are in the same terms. This does +not mean that I think technology and economics are the only important +realms of culture. It is rather that for most of prehistoric time the +materials left to the archeologists tend to limit our deductions to +technology and economics. + +I’m so soon out of my competence, as conventional ancient history +begins, that I shall only suggest the earlier eras of the +food-producing stage to you. This book is about prehistory, and I’m not +a universal historian. + + +THE TWO EARLIEST ERAS OF THE FOOD-PRODUCING STAGE + +The food-producing stage seems to appear in western Asia with really +revolutionary suddenness. It is seen by the relative speed with which +the traces of new crafts appear in the earliest village-farming +community sites we’ve dug. It is seen by the spread and multiplication +of these sites themselves, and the remarkable growth in human +population we deduce from this increase in sites. We’ll look at some +of these sites and the archeological traces they yield in the next +chapter. When such village sites begin to appear, I believe we are in +the _era of the primary village-farming community_. I also believe this +is the second era of the food-producing stage. + +The first era of the food-producing stage, I believe, was an _era of +incipient cultivation and animal domestication_. I keep saying “I +believe” because the actual evidence for this earlier era is so slight +that one has to set it up mainly by playing a hunch for it. The reason +for playing the hunch goes about as follows. + +One thing we seem to be able to see, in the food-collecting era in +general, is a tendency for people to begin to settle down. This +settling down seemed to become further intensified in the terminal +era. How this is connected with Professor Mathiassen’s “receptiveness” +and the tendency to be experimental, we do not exactly know. The +evidence from the New World comes into play here as well as that from +the Old World. With this settling down in one place, the people of the +terminal era--especially the “Forest folk” whom we know best--began +making a great variety of new things. I remarked about this earlier in +the chapter. Dr. Robert M. Adams is of the opinion that this atmosphere +of experimentation with new tools--with new ways of collecting food--is +the kind of atmosphere in which one might expect trials at planting +and at animal domestication to have been made. We first begin to find +traces of more permanent life in outdoor camp sites, although caves +were still inhabited at the beginning of the terminal era. It is not +surprising at all that the “Forest folk” had already domesticated the +dog. In this sense, the whole era of food-collecting was becoming ready +and almost “incipient” for cultivation and animal domestication. + +Northwestern Europe was not the place for really effective beginnings +in agriculture and animal domestication. These would have had to take +place in one of those natural environments of promise, where a variety +of plants and animals, each possible of domestication, was available in +the wild state. Let me spell this out. Really effective food-production +must include a variety of items to make up a reasonably well-rounded +diet. The food-supply so produced must be trustworthy, even though +the food-producing peoples themselves might be happy to supplement +it with fish and wild strawberries, just as we do when such things +are available. So, as we said earlier, part of our problem is that +of finding a region with a natural environment which includes--and +did include, some ten thousand years ago--a variety of possibly +domesticable wild plants and animals. + + +NUCLEAR AREAS + +Now comes the last of my definitions. A region with a natural +environment which included a variety of wild plants and animals, +both possible and ready for domestication, would be a central +or core or _nuclear area_, that is, it would be when and _if_ +food-production took place within it. It is pretty hard for me to +imagine food-production having ever made an independent start outside +such a nuclear area, although there may be some possible nuclear areas +in which food-production never took place (possibly in parts of Africa, +for example). + +We know of several such nuclear areas. In the New World, Middle America +and the Andean highlands make up one or two; it is my understanding +that the evidence is not yet clear as to which. There seems to have +been a nuclear area somewhere in southeastern Asia, in the Malay +peninsula or Burma perhaps, connected with the early cultivation of +taro, breadfruit, the banana and the mango. Possibly the cultivation +of rice and the domestication of the chicken and of zebu cattle and +the water buffalo belong to this southeast Asiatic nuclear area. We +know relatively little about it archeologically, as yet. The nuclear +area which was the scene of the earliest experiment in effective +food-production was in western Asia. Since I know it best, I shall use +it as my example. + + +THE NUCLEAR NEAR EAST + +The nuclear area of western Asia is naturally the one of greatest +interest to people of the western cultural tradition. Our cultural +heritage began within it. The area itself is the region of the hilly +flanks of rain-watered grass-land which build up to the high mountain +ridges of Iran, Iraq, Turkey, Syria, and Palestine. The map on page +125 indicates the region. If you have a good atlas, try to locate the +zone which surrounds the drainage basin of the Tigris and Euphrates +Rivers at elevations of from approximately 2,000 to 5,000 feet. The +lower alluvial land of the Tigris-Euphrates basin itself has very +little rainfall. Some years ago Professor James Henry Breasted called +the alluvial lands of the Tigris-Euphrates a part of the “fertile +crescent.” These alluvial lands are very fertile if irrigated. Breasted +was most interested in the oriental civilizations of conventional +ancient history, and irrigation had been discovered before they +appeared. + +The country of hilly flanks above Breasted’s crescent receives from +10 to 20 or more inches of winter rainfall each year, which is about +what Kansas has. Above the hilly-flanks zone tower the peaks and ridges +of the Lebanon-Amanus chain bordering the coast-line from Palestine +to Turkey, the Taurus Mountains of southern Turkey, and the Zagros +range of the Iraq-Iran borderland. This rugged mountain frame for our +hilly-flanks zone rises to some magnificent alpine scenery, with peaks +of from ten to fifteen thousand feet in elevation. There are several +gaps in the Mediterranean coastal portion of the frame, through which +the winter’s rain-bearing winds from the sea may break so as to carry +rain to the foothills of the Taurus and the Zagros. + +The picture I hope you will have from this description is that of an +intermediate hilly-flanks zone lying between two regions of extremes. +The lower Tigris-Euphrates basin land is low and far too dry and hot +for agriculture based on rainfall alone; to the south and southwest, it +merges directly into the great desert of Arabia. The mountains which +lie above the hilly-flanks zone are much too high and rugged to have +encouraged farmers. + + +THE NATURAL ENVIRONMENT OF THE NUCLEAR NEAR EAST + +The more we learn of this hilly-flanks zone that I describe, the +more it seems surely to have been a nuclear area. This is where we +archeologists need, and are beginning to get, the help of natural +scientists. They are coming to the conclusion that the natural +environment of the hilly-flanks zone today is much as it was some eight +to ten thousand years ago. There are still two kinds of wild wheat and +a wild barley, and the wild sheep, goat, and pig. We have discovered +traces of each of these at about nine thousand years ago, also traces +of wild ox, horse, and dog, each of which appears to be the probable +ancestor of the domesticated form. In fact, at about nine thousand +years ago, the two wheats, the barley, and at least the goat, were +already well on the road to domestication. + +The wild wheats give us an interesting clue. They are only available +together with the wild barley within the hilly-flanks zone. While the +wild barley grows in a variety of elevations and beyond the zone, +at least one of the wild wheats does not seem to grow below the hill +country. As things look at the moment, the domestication of both the +wheats together could _only_ have taken place within the hilly-flanks +zone. Barley seems to have first come into cultivation due to its +presence as a weed in already cultivated wheat fields. There is also +a suggestion--there is still much more to learn in the matter--that +the animals which were first domesticated were most at home up in the +hilly-flanks zone in their wild state. + +With a single exception--that of the dog--the earliest positive +evidence of domestication includes the two forms of wheat, the barley, +and the goat. The evidence comes from within the hilly-flanks zone. +However, it comes from a settled village proper, Jarmo (which I’ll +describe in the next chapter), and is thus from the era of the primary +village-farming community. We are still without positive evidence of +domesticated grain and animals in the first era of the food-producing +stage, that of incipient cultivation and animal domestication. + + +THE ERA OF INCIPIENT CULTIVATION AND ANIMAL DOMESTICATION + +I said above (p. 105) that my era of incipient cultivation and animal +domestication is mainly set up by playing a hunch. Although we cannot +really demonstrate it--and certainly not in the Near East--it would +be very strange for food-collectors not to have known a great deal +about the plants and animals most useful to them. They do seem to have +domesticated the dog. We can easily imagine them remembering to go +back, season after season, to a particular patch of ground where seeds +or acorns or berries grew particularly well. Most human beings, unless +they are extremely hungry, are attracted to baby animals, and many wild +pups or fawns or piglets must have been brought back alive by hunting +parties. + +In this last sense, man has probably always been an incipient +cultivator and domesticator. But I believe that Adams is right in +suggesting that this would be doubly true with the experimenters of +the terminal era of food-collecting. We noticed that they also seem +to have had a tendency to settle down. Now my hunch goes that _when_ +this experimentation and settling down took place within a potential +nuclear area--where a whole constellation of plants and animals +possible of domestication was available--the change was easily made. +Professor Charles A. Reed, our field colleague in zoology, agrees that +year-round settlement with plant domestication probably came before +there were important animal domestications. + + +INCIPIENT ERAS AND NUCLEAR AREAS + +I have put this scheme into a simple chart (p. 111) with the names +of a few of the sites we are going to talk about. You will see that my +hunch means that there are eras of incipient cultivation _only_ within +nuclear areas. In a nuclear area, the terminal era of food-collecting +would probably have been quite short. I do not know for how long a time +the era of incipient cultivation and domestication would have lasted, +but perhaps for several thousand years. Then it passed on into the era +of the primary village-farming community. + +Outside a nuclear area, the terminal era of food-collecting would last +for a long time; in a few out-of-the-way parts of the world, it still +hangs on. It would end in any particular place through contact with +and the spread of ideas of people who had passed on into one of the +more developed eras. In many cases, the terminal era of food-collecting +was ended by the incoming of the food-producing peoples themselves. +For example, the practices of food-production were carried into Europe +by the actual movement of some numbers of peoples (we don’t know how +many) who had reached at least the level of the primary village-farming +community. The “Forest folk” learned food-production from them. There +was never an era of incipient cultivation and domestication proper in +Europe, if my hunch is right. + + +ARCHEOLOGICAL DIFFICULTIES IN SEEING THE INCIPIENT ERA + +The way I see it, two things were required in order that an era of +incipient cultivation and domestication could begin. First, there had +to be the natural environment of a nuclear area, with its whole group +of plants and animals capable of domestication. This is the aspect of +the matter which we’ve said is directly given by nature. But it is +quite possible that such an environment with such a group of plants +and animals in it may have existed well before ten thousand years ago +in the Near East. It is also quite possible that the same promising +condition may have existed in regions which never developed into +nuclear areas proper. Here, again, we come back to the cultural factor. +I think it was that “atmosphere of experimentation” we’ve talked about +once or twice before. I can’t define it for you, other than to say that +by the end of the Ice Age, the general level of many cultures was ready +for change. Ask me how and why this was so, and I’ll tell you we don’t +know yet, and that if we did understand this kind of question, there +would be no need for me to go on being a prehistorian! + +[Illustration: POSSIBLE RELATIONSHIPS OF STAGES AND ERAS IN WESTERN +ASIA AND NORTHEASTERN AFRICA] + +Now since this was an era of incipience, of the birth of new ideas, +and of experimentation, it is very difficult to see its traces +archeologically. New tools having to do with the new ways of getting +and, in fact, producing food would have taken some time to develop. +It need not surprise us too much if we cannot find hoes for planting +and sickles for reaping grain at the very beginning. We might expect +a time of making-do with some of the older tools, or with make-shift +tools, for some of the new jobs. The present-day wild cousin of the +domesticated sheep still lives in the mountains of western Asia. It has +no wool, only a fine down under hair like that of a deer, so it need +not surprise us to find neither the whorls used for spinning nor traces +of woolen cloth. It must have taken some time for a wool-bearing sheep +to develop and also time for the invention of the new tools which go +with weaving. It would have been the same with other kinds of tools for +the new way of life. + +It is difficult even for an experienced comparative zoologist to tell +which are the bones of domesticated animals and which are those of +their wild cousins. This is especially so because the animal bones the +archeologists find are usually fragmentary. Furthermore, we do not have +a sort of library collection of the skeletons of the animals or an +herbarium of the plants of those times, against which the traces which +the archeologists find may be checked. We are only beginning to get +such collections for the modern wild forms of animals and plants from +some of our nuclear areas. In the nuclear area in the Near East, some +of the wild animals, at least, have already become extinct. There are +no longer wild cattle or wild horses in western Asia. We know they were +there from the finds we’ve made in caves of late Ice Age times, and +from some slightly later sites. + + +SITES WITH ANTIQUITIES OF THE INCIPIENT ERA + +So far, we know only a very few sites which would suit my notion of the +incipient era of cultivation and animal domestication. I am closing +this chapter with descriptions of two of the best Near Eastern examples +I know of. You may not be satisfied that what I am able to describe +makes a full-bodied era of development at all. Remember, however, that +I’ve told you I’m largely playing a kind of a hunch, and also that the +archeological materials of this era will always be extremely difficult +to interpret. At the beginning of any new way of life, there will be a +great tendency for people to make-do, at first, with tools and habits +they are already used to. I would suspect that a great deal of this +making-do went on almost to the end of this era. + + +THE NATUFIAN, AN ASSEMBLAGE OF THE INCIPIENT ERA + +The assemblage called the Natufian comes from the upper layers of a +number of caves in Palestine. Traces of its flint industry have also +turned up in Syria and Lebanon. We don’t know just how old it is. I +guess that it probably falls within five hundred years either way of +about 5000 B.C. + +Until recently, the people who produced the Natufian assemblage were +thought to have been only cave dwellers, but now at least three open +air Natufian sites have been briefly described. In their best-known +dwelling place, on Mount Carmel, the Natufian folk lived in the open +mouth of a large rock-shelter and on the terrace in front of it. On the +terrace, they had set at least two short curving lines of stones; but +these were hardly architecture; they seem more like benches or perhaps +the low walls of open pens. There were also one or two small clusters +of stones laid like paving, and a ring of stones around a hearth or +fireplace. One very round and regular basin-shaped depression had been +cut into the rocky floor of the terrace, and there were other less +regular basin-like depressions. In the newly reported open air sites, +there seem to have been huts with rounded corners. + +Most of the finds in the Natufian layer of the Mount Carmel cave were +flints. About 80 per cent of these flint tools were microliths made +by the regular working of tiny blades into various tools, some having +geometric forms. The larger flint tools included backed blades, burins, +scrapers, a few arrow points, some larger hacking or picking tools, and +one special type. This last was the sickle blade. + +We know a sickle blade of flint when we see one, because of a strange +polish or sheen which seems to develop on the cutting edge when the +blade has been used to cut grasses or grain, or--perhaps--reeds. In +the Natufian, we have even found the straight bone handles in which a +number of flint sickle blades were set in a line. + +There was a small industry in ground or pecked stone (that is, abraded +not chipped) in the Natufian. This included some pestle and mortar +fragments. The mortars are said to have a deep and narrow hole, +and some of the pestles show traces of red ochre. We are not sure +that these mortars and pestles were also used for grinding food. In +addition, there were one or two bits of carving in stone. + + +NATUFIAN ANTIQUITIES IN OTHER MATERIALS; BURIALS AND PEOPLE + +The Natufian industry in bone was quite rich. It included, beside the +sickle hafts mentioned above, points and harpoons, straight and curved +types of fish-hooks, awls, pins and needles, and a variety of beads and +pendants. There were also beads and pendants of pierced teeth and shell. + +A number of Natufian burials have been found in the caves; some burials +were grouped together in one grave. The people who were buried within +the Mount Carmel cave were laid on their backs in an extended position, +while those on the terrace seem to have been “flexed” (placed in their +graves in a curled-up position). This may mean no more than that it was +easier to dig a long hole in cave dirt than in the hard-packed dirt of +the terrace. The people often had some kind of object buried with them, +and several of the best collections of beads come from the burials. On +two of the skulls there were traces of elaborate head-dresses of shell +beads. + +[Illustration: SKETCH OF NATUFIAN ASSEMBLAGE + + MICROLITHS + ARCHITECTURE? + BURIAL + CHIPPED STONE + GROUND STONE + BONE] + +The animal bones of the Natufian layers show beasts of a “modern” type, +but with some differences from those of present-day Palestine. The +bones of the gazelle far outnumber those of the deer; since gazelles +like a much drier climate than deer, Palestine must then have had much +the same climate that it has today. Some of the animal bones were those +of large or dangerous beasts: the hyena, the bear, the wild boar, +and the leopard. But the Natufian people may have had the help of a +large domesticated dog. If our guess at a date for the Natufian is +right (about 7750 B.C.), this is an earlier dog than was that in the +Maglemosian of northern Europe. More recently, it has been reported +that a domesticated goat is also part of the Natufian finds. + +The study of the human bones from the Natufian burials is not yet +complete. Until Professor McCown’s study becomes available, we may note +Professor Coon’s assessment that these people were of a “basically +Mediterranean type.” + + +THE KARIM SHAHIR ASSEMBLAGE + +Karim Shahir differs from the Natufian sites in that it shows traces +of a temporary open site or encampment. It lies on the top of a bluff +in the Kurdish hill-country of northeastern Iraq. It was dug by Dr. +Bruce Howe of the expedition I directed in 1950-51 for the Oriental +Institute and the American Schools of Oriental Research. In 1954-55, +our expedition located another site, M’lefaat, with general resemblance +to Karim Shahir, but about a hundred miles north of it. In 1956, Dr. +Ralph Solecki located still another Karim Shahir type of site called +Zawi Chemi Shanidar. The Zawi Chemi site has a radiocarbon date of 8900 +± 300 B.C. + +Karim Shahir has evidence of only one very shallow level of occupation. +It was probably not lived on very long, although the people who lived +on it spread out over about three acres of area. In spots, the single +layer yielded great numbers of fist-sized cracked pieces of limestone, +which had been carried up from the bed of a stream at the bottom of the +bluff. We think these cracked stones had something to do with a kind of +architecture, but we were unable to find positive traces of hut plans. +At M’lefaat and Zawi Chemi, there were traces of rounded hut plans. + +As in the Natufian, the great bulk of small objects of the Karim Shahir +assemblage was in chipped flint. A large proportion of the flint tools +were microlithic bladelets and geometric forms. The flint sickle blade +was almost non-existent, being far scarcer than in the Natufian. The +people of Karim Shahir did a modest amount of work in the grinding of +stone; there were milling stone fragments of both the mortar and the +quern type, and stone hoes or axes with polished bits. Beads, pendants, +rings, and bracelets were made of finer quality stone. We found a few +simple points and needles of bone, and even two rather formless unbaked +clay figurines which seemed to be of animal form. + +[Illustration: SKETCH OF KARIM SHAHIR ASSEMBLAGE + + CHIPPED STONE + GROUND STONE + UNBAKED CLAY + SHELL + BONE + “ARCHITECTURE”] + +Karim Shahir did not yield direct evidence of the kind of vegetable +food its people ate. The animal bones showed a considerable +increase in the proportion of the bones of the species capable of +domestication--sheep, goat, cattle, horse, dog--as compared with animal +bones from the earlier cave sites of the area, which have a high +proportion of bones of wild forms like deer and gazelle. But we do not +know that any of the Karim Shahir animals were actually domesticated. +Some of them may have been, in an “incipient” way, but we have no means +at the moment that will tell us from the bones alone. + + +WERE THE NATUFIAN AND KARIM SHAHIR PEOPLES FOOD-PRODUCERS? + +It is clear that a great part of the food of the Natufian people +must have been hunted or collected. Shells of land, fresh-water, and +sea animals occur in their cave layers. The same is true as regards +Karim Shahir, save for sea shells. But on the other hand, we have +the sickles, the milling stones, the possible Natufian dog, and the +goat, and the general animal situation at Karim Shahir to hint at an +incipient approach to food-production. At Karim Shahir, there was the +tendency to settle down out in the open; this is echoed by the new +reports of open air Natufian sites. The large number of cracked stones +certainly indicates that it was worth the peoples’ while to have some +kind of structure, even if the site as a whole was short-lived. + +It is a part of my hunch that these things all point toward +food-production--that the hints we seek are there. But in the sense +that the peoples of the era of the primary village-farming community, +which we shall look at next, are fully food-producing, the Natufian +and Karim Shahir folk had not yet arrived. I think they were part of +a general build-up to full scale food-production. They were possibly +controlling a few animals of several kinds and perhaps one or two +plants, without realizing the full possibilities of this “control” as a +new way of life. + +This is why I think of the Karim Shahir and Natufian folk as being at +a level, or in an era, of incipient cultivation and domestication. But +we shall have to do a great deal more excavation in this range of time +before we’ll get the kind of positive information we need. + + +SUMMARY + +I am sorry that this chapter has had to be so much more about ideas +than about the archeological traces of prehistoric men themselves. +But the antiquities of the incipient era of cultivation and animal +domestication will not be spectacular, even when we do have them +excavated in quantity. Few museums will be interested in these +antiquities for exhibition purposes. The charred bits or impressions +of plants, the fragments of animal bone and shell, and the varied +clues to climate and environment will be as important as the artifacts +themselves. It will be the ideas to which these traces lead us that +will be important. I am sure that this unspectacular material--when we +have much more of it, and learn how to understand what it says--will +lead us to how and why answers about the first great change in human +history. + +We know the earliest village-farming communities appeared in western +Asia, in a nuclear area. We do not yet know why the Near Eastern +experiment came first, or why it didn’t happen earlier in some other +nuclear area. Apparently, the level of culture and the promise of the +natural environment were ready first in western Asia. The next sites +we look at will show a simple but effective food-production already +in existence. Without effective food-production and the settled +village-farming communities, civilization never could have followed. +How effective food-production came into being by the end of the +incipient era, is, I believe, one of the most fascinating questions any +archeologist could face. + +It now seems probable--from possibly two of the Palestinian sites with +varieties of the Natufian (Jericho and Nahal Oren)--that there were +one or more local Palestinian developments out of the Natufian into +later times. In the same way, what followed after the Karim Shahir type +of assemblage in northeastern Iraq was in some ways a reflection of +beginnings made at Karim Shahir and Zawi Chemi. + + + + +THE First Revolution + +[Illustration] + + +As the incipient era of cultivation and animal domestication passed +onward into the era of the primary village-farming community, the first +basic change in human economy was fully achieved. In southwestern Asia, +this seems to have taken place about nine thousand years ago. I am +going to restrict my description to this earliest Near Eastern case--I +do not know enough about the later comparable experiments in the Far +East and in the New World. Let us first, once again, think of the +contrast between food-collecting and food-producing as ways of life. + + +THE DIFFERENCE BETWEEN FOOD-COLLECTORS AND FOOD-PRODUCERS + +Childe used the word “revolution” because of the radical change that +took place in the habits and customs of man. Food-collectors--that is, +hunters, fishers, berry- and nut-gatherers--had to live in small groups +or bands, for they had to be ready to move wherever their food supply +moved. Not many people can be fed in this way in one area, and small +children and old folks are a burden. There is not enough food to store, +and it is not the kind that can be stored for long. + +Do you see how this all fits into a picture? Small groups of people +living now in this cave, now in that--or out in the open--as they moved +after the animals they hunted; no permanent villages, a few half-buried +huts at best; no breakable utensils; no pottery; no signs of anything +for clothing beyond the tools that were probably used to dress the +skins of animals; no time to think of much of anything but food and +protection and disposal of the dead when death did come: an existence +which takes nature as it finds it, which does little or nothing to +modify nature--all in all, a savage’s existence, and a very tough one. +A man who spends his whole life following animals just to kill them to +eat, or moving from one berry patch to another, is really living just +like an animal himself. + + +THE FOOD-PRODUCING ECONOMY + +Against this picture let me try to draw another--that of man’s life +after food-production had begun. His meat was stored “on the hoof,” +his grain in silos or great pottery jars. He lived in a house: it was +worth his while to build one, because he couldn’t move far from his +fields and flocks. In his neighborhood enough food could be grown +and enough animals bred so that many people were kept busy. They all +lived close to their flocks and fields, in a village. The village was +already of a fair size, and it was growing, too. Everybody had more to +eat; they were presumably all stronger, and there were more children. +Children and old men could shepherd the animals by day or help with +the lighter work in the fields. After the crops had been harvested the +younger men might go hunting and some of them would fish, but the food +they brought in was only an addition to the food in the village; the +villagers wouldn’t starve, even if the hunters and fishermen came home +empty-handed. + +There was more time to do different things, too. They began to modify +nature. They made pottery out of raw clay, and textiles out of hair +or fiber. People who became good at pottery-making traded their pots +for food and spent all of their time on pottery alone. Other people +were learning to weave cloth or to make new tools. There were already +people in the village who were becoming full-time craftsmen. + +Other things were changing, too. The villagers must have had +to agree on new rules for living together. The head man of the +village had problems different from those of the chief of the small +food-collectors’ band. If somebody’s flock of sheep spoiled a wheat +field, the owner wanted payment for the grain he lost. The chief of +the hunters was never bothered with such questions. Even the gods +had changed. The spirits and the magic that had been used by hunters +weren’t of any use to the villagers. They needed gods who would watch +over the fields and the flocks, and they eventually began to erect +buildings where their gods might dwell, and where the men who knew most +about the gods might live. + + +WAS FOOD-PRODUCTION A “REVOLUTION”? + +If you can see the difference between these two pictures--between +life in the food-collecting stage and life after food-production +had begun--you’ll see why Professor Childe speaks of a revolution. +By revolution, he doesn’t mean that it happened over night or that +it happened only once. We don’t know exactly how long it took. Some +people think that all these changes may have occurred in less than +500 years, but I doubt that. The incipient era was probably an affair +of some duration. Once the level of the village-farming community had +been established, however, things did begin to move very fast. By +six thousand years ago, the descendants of the first villagers had +developed irrigation and plow agriculture in the relatively rainless +Mesopotamian alluvium and were living in towns with temples. Relative +to the half million years of food-gathering which lay behind, this had +been achieved with truly revolutionary suddenness. + + +GAPS IN OUR KNOWLEDGE OF THE NEAR EAST + +If you’ll look again at the chart (p. 111) you’ll see that I have +very few sites and assemblages to name in the incipient era of +cultivation and domestication, and not many in the earlier part of +the primary village-farming level either. Thanks in no small part +to the intelligent co-operation given foreign excavators by the +Iraq Directorate General of Antiquities, our understanding of the +sequence in Iraq is growing more complete. I shall use Iraq as my main +yard-stick here. But I am far from being able to show you a series of +Sears Roebuck catalogues, even century by century, for any part of +the nuclear area. There is still a great deal of earth to move, and a +great mass of material to recover and interpret before we even begin to +understand “how” and “why.” + +Perhaps here, because this kind of archeology is really my specialty, +you’ll excuse it if I become personal for a moment. I very much look +forward to having further part in closing some of the gaps in knowledge +of the Near East. This is not, as I’ve told you, the spectacular +range of Near Eastern archeology. There are no royal tombs, no gold, +no great buildings or sculpture, no writing, in fact nothing to +excite the normal museum at all. Nevertheless it is a range which, +idea-wise, gives the archeologist tremendous satisfaction. The country +of the hilly flanks is an exciting combination of green grasslands +and mountainous ridges. The Kurds, who inhabit the part of the area +in which I’ve worked most recently, are an extremely interesting and +hospitable people. Archeologists don’t become rich, but I’ll forego +the Cadillac for any bright spring morning in the Kurdish hills, on a +good site with a happy crew of workmen and an interested and efficient +staff. It is probably impossible to convey the full feeling which life +on such a dig holds--halcyon days for the body and acute pleasurable +stimulation for the mind. Old things coming newly out of the good dirt, +and the pieces of the human puzzle fitting into place! I think I am +an honest man; I cannot tell you that I am sorry the job is not yet +finished and that there are still gaps in this part of the Near Eastern +archeological sequence. + + +EARLIEST SITES OF THE VILLAGE FARMERS + +So far, the Karim Shahir type of assemblage, which we looked at in the +last chapter, is the earliest material available in what I take to +be the nuclear area. We do not believe that Karim Shahir was a village +site proper: it looks more like the traces of a temporary encampment. +Two caves, called Belt and Hotu, which are outside the nuclear area +and down on the foreshore of the Caspian Sea, have been excavated +by Professor Coon. These probably belong in the later extension of +the terminal era of food-gathering; in their upper layers are traits +like the use of pottery borrowed from the more developed era of the +same time in the nuclear area. The same general explanation doubtless +holds true for certain materials in Egypt, along the upper Nile and in +the Kharga oasis: these materials, called Sebilian III, the Khartoum +“neolithic,” and the Khargan microlithic, are from surface sites, +not from caves. The chart (p. 111) shows where I would place these +materials in era and time. + +[Illustration: THE HILLY FLANKS OF THE CRESCENT AND EARLY SITES OF THE +NEAR EAST] + +Both M’lefaat and Dr. Solecki’s Zawi Chemi Shanidar site appear to have +been slightly more “settled in” than was Karim Shahir itself. But I do +not think they belong to the era of farming-villages proper. The first +site of this era, in the hills of Iraqi Kurdistan, is Jarmo, on which +we have spent three seasons of work. Following Jarmo comes a variety of +sites and assemblages which lie along the hilly flanks of the crescent +and just below it. I am going to describe and illustrate some of these +for you. + +Since not very much archeological excavation has yet been done on sites +of this range of time, I shall have to mention the names of certain +single sites which now alone stand for an assemblage. This does not +mean that I think the individual sites I mention were unique. In the +times when their various cultures flourished, there must have been +many little villages which shared the same general assemblage. We are +only now beginning to locate them again. Thus, if I speak of Jarmo, +or Jericho, or Sialk as single examples of their particular kinds of +assemblages, I don’t mean that they were unique at all. I think I could +take you to the sites of at least three more Jarmos, within twenty +miles of the original one. They are there, but they simply haven’t yet +been excavated. In 1956, a Danish expedition discovered material of +Jarmo type at Shimshara, only two dozen miles northeast of Jarmo, and +below an assemblage of Hassunan type (which I shall describe presently). + + +THE GAP BETWEEN KARIM SHAHIR AND JARMO + +As we see the matter now, there is probably still a gap in the +available archeological record between the Karim Shahir-M’lefaat-Zawi +Chemi group (of the incipient era) and that of Jarmo (of the +village-farming era). Although some items of the Jarmo type materials +do reflect the beginnings of traditions set in the Karim Shahir group +(see p. 120), there is not a clear continuity. Moreover--to the +degree that we may trust a few radiocarbon dates--there would appear +to be around two thousand years of difference in time. The single +available Zawi Chemi “date” is 8900 ± 300 B.C.; the most reasonable +group of “dates” from Jarmo average to about 6750 ± 200 B.C. I am +uncertain about this two thousand years--I do not think it can have +been so long. + +This suggests that we still have much work to do in Iraq. You can +imagine how earnestly we await the return of political stability in the +Republic of Iraq. + + +JARMO, IN THE KURDISH HILLS, IRAQ + +The site of Jarmo has a depth of deposit of about twenty-seven feet, +and approximately a dozen layers of architectural renovation and +change. Nevertheless it is a “one period” site: its assemblage remains +essentially the same throughout, although one or two new items are +added in later levels. It covers about four acres of the top of a +bluff, below which runs a small stream. Jarmo lies in the hill country +east of the modern oil town of Kirkuk. The Iraq Directorate General of +Antiquities suggested that we look at it in 1948, and we have had three +seasons of digging on it since. + +The people of Jarmo grew the barley plant and two different kinds of +wheat. They made flint sickles with which to reap their grain, mortars +or querns on which to crack it, ovens in which it might be parched, and +stone bowls out of which they might eat their porridge. We are sure +that they had the domesticated goat, but Professor Reed (the staff +zoologist) is not convinced that the bones of the other potentially +domesticable animals of Jarmo--sheep, cattle, pig, horse, dog--show +sure signs of domestication. We had first thought that all of these +animals were domesticated ones, but Reed feels he must find out much +more before he can be sure. As well as their grain and the meat from +their animals, the people of Jarmo consumed great quantities of land +snails. Botanically, the Jarmo wheat stands about half way between +fully bred wheat and the wild forms. + + +ARCHITECTURE: HALL-MARK OF THE VILLAGE + +The sure sign of the village proper is in its traces of architectural +permanence. The houses of Jarmo were only the size of a small cottage +by our standards, but each was provided with several rectangular rooms. +The walls of the houses were made of puddled mud, often set on crude +foundations of stone. (The puddled mud wall, which the Arabs call +_touf_, is built by laying a three to six inch course of soft mud, +letting this sun-dry for a day or two, then adding the next course, +etc.) The village probably looked much like the simple Kurdish farming +village of today, with its mud-walled houses and low mud-on-brush +roofs. I doubt that the Jarmo village had more than twenty houses at +any one moment of its existence. Today, an average of about seven +people live in a comparable Kurdish house; probably the population of +Jarmo was about 150 people. + +[Illustration: SKETCH OF JARMO ASSEMBLAGE + + CHIPPED STONE + UNBAKED CLAY + GROUND STONE + POTTERY _UPPER THIRD OF SITE ONLY._ + REED MATTING + BONE + ARCHITECTURE] + +It is interesting that portable pottery does not appear until the +last third of the life of the Jarmo village. Throughout the duration +of the village, however, its people had experimented with the plastic +qualities of clay. They modeled little figurines of animals and of +human beings in clay; one type of human figurine they favored was that +of a markedly pregnant woman, probably the expression of some sort of +fertility spirit. They provided their house floors with baked-in-place +depressions, either as basins or hearths, and later with domed ovens of +clay. As we’ve noted, the houses themselves were of clay or mud; one +could almost say they were built up like a house-sized pot. Then, +finally, the idea of making portable pottery itself appeared, although +I very much doubt that the people of the Jarmo village discovered the +art. + +On the other hand, the old tradition of making flint blades and +microlithic tools was still very strong at Jarmo. The sickle-blade was +made in quantities, but so also were many of the much older tool types. +Strangely enough, it is within this age-old category of chipped stone +tools that we see one of the clearest pointers to a newer age. Many of +the Jarmo chipped stone tools--microliths--were made of obsidian, a +black volcanic natural glass. The obsidian beds nearest to Jarmo are +over three hundred miles to the north. Already a bulk carrying trade +had been established--the forerunner of commerce--and the routes were +set by which, in later times, the metal trade was to move. + +There are now twelve radioactive carbon “dates” from Jarmo. The most +reasonable cluster of determinations averages to about 6750 ± 200 +B.C., although there is a completely unreasonable range of “dates” +running from 3250 to 9250 B.C.! _If_ I am right in what I take to be +“reasonable,” the first flush of the food-producing revolution had been +achieved almost nine thousand years ago. + + +HASSUNA, IN UPPER MESOPOTAMIAN IRAQ + +We are not sure just how soon after Jarmo the next assemblage of Iraqi +material is to be placed. I do not think the time was long, and there +are a few hints that detailed habits in the making of pottery and +ground stone tools were actually continued from Jarmo times into the +time of the next full assemblage. This is called after a site named +Hassuna, a few miles to the south and west of modern Mosul. We also +have Hassunan type materials from several other sites in the same +general region. It is probably too soon to make generalizations about +it, but the Hassunan sites seem to cluster at slightly lower elevations +than those we have been talking about so far. + +The catalogue of the Hassuna assemblage is of course more full and +elaborate than that of Jarmo. The Iraqi government’s archeologists +who dug Hassuna itself, exposed evidence of increasing architectural +know-how. The walls of houses were still formed of puddled mud; +sun-dried bricks appear only in later periods. There were now several +different ways of making and decorating pottery vessels. One style of +pottery painting, called the Samarran style, is an extremely handsome +one and must have required a great deal of concentration and excellence +of draftsmanship. On the other hand, the old habits for the preparation +of good chipped stone tools--still apparent at Jarmo--seem to have +largely disappeared by Hassunan times. The flint work of the Hassunan +catalogue is, by and large, a wretched affair. We might guess that the +kinaesthetic concentration of the Hassuna craftsmen now went into other +categories; that is, they suddenly discovered they might have more fun +working with the newer materials. It’s a shame, for example, that none +of their weaving is preserved for us. + +The two available radiocarbon determinations from Hassunan contexts +stand at about 5100 and 5600 B.C. ± 250 years. + + +OTHER EARLY VILLAGE SITES IN THE NUCLEAR AREA + +I’ll now name and very briefly describe a few of the other early +village assemblages either in or adjacent to the hilly flanks of the +crescent. Unfortunately, we do not have radioactive carbon dates for +many of these materials. We may guess that some particular assemblage, +roughly comparable to that of Hassuna, for example, must reflect a +culture which lived at just about the same time as that of Hassuna. We +do this guessing on the basis of the general similarity and degree of +complexity of the Sears Roebuck catalogues of the particular assemblage +and that of Hassuna. We suppose that for sites near at hand and of a +comparable cultural level, as indicated by their generally similar +assemblages, the dating must be about the same. We may also know that +in a general stratigraphic sense, the sites in question may both appear +at the bottom of the ascending village sequence in their respective +areas. Without a number of consistent radioactive carbon dates, we +cannot be precise about priorities. + +[Illustration: SKETCH OF HASSUNA ASSEMBLAGE + + POTTERY + POTTERY OBJECTS + CHIPPED STONE + BONE + GROUND STONE + ARCHITECTURE + REED MATTING + BURIAL] + +The ancient mound at Jericho, in the Dead Sea valley in Palestine, +yields some very interesting material. Its catalogue somewhat resembles +that of Jarmo, especially in the sense that there is a fair depth +of deposit without portable pottery vessels. On the other hand, the +architecture of Jericho is surprisingly complex, with traces of massive +stone fortification walls and the general use of formed sun-dried +mud brick. Jericho lies in a somewhat strange and tropically lush +ecological niche, some seven hundred feet below sea level; it is +geographically within the hilly-flanks zone but environmentally not +part of it. + +Several radiocarbon “dates” for Jericho fall within the range of those +I find reasonable for Jarmo, and their internal statistical consistency +is far better than that for the Jarmo determinations. It is not yet +clear exactly what this means. + +The mound at Jericho (Tell es-Sultan) contains a remarkably +fine sequence, which perhaps does not have the gap we noted in +Iraqi-Kurdistan between the Karim Shahir group and Jarmo. While I am +not sure that the Jericho sequence will prove valid for those parts +of Palestine outside the special Dead Sea environmental niche, the +sequence does appear to proceed from the local variety of Natufian into +that of a very well settled community. So far, we have little direct +evidence for the food-production basis upon which the Jericho people +subsisted. + +There is an early village assemblage with strong characteristics of its +own in the land bordering the northeast corner of the Mediterranean +Sea, where Syria and the Cilician province of Turkey join. This early +Syro-Cilician assemblage must represent a general cultural pattern +which was at least in part contemporary with that of the Hassuna +assemblage. These materials from the bases of the mounds at Mersin, and +from Judaidah in the Amouq plain, as well as from a few other sites, +represent the remains of true villages. The walls of their houses were +built of puddled mud, but some of the house foundations were of stone. +Several different kinds of pottery were made by the people of these +villages. None of it resembles the pottery from Hassuna or from the +upper levels of Jarmo or Jericho. The Syro-Cilician people had not +lost their touch at working flint. An important southern variation of +the Syro-Cilician assemblage has been cleared recently at Byblos, a +port town famous in later Phoenician times. There are three radiocarbon +determinations which suggest that the time range for these developments +was in the sixth or early fifth millennium B.C. + +It would be fascinating to search for traces of even earlier +village-farming communities and for the remains of the incipient +cultivation era, in the Syro-Cilician region. + + +THE IRANIAN PLATEAU AND THE NILE VALLEY + +The map on page 125 shows some sites which lie either outside or in +an extension of the hilly-flanks zone proper. From the base of the +great mound at Sialk on the Iranian plateau came an assemblage of +early village material, generally similar, in the kinds of things it +contained, to the catalogues of Hassuna and Judaidah. The details of +how things were made are different; the Sialk assemblage represents +still another cultural pattern. I suspect it appeared a bit later +in time than did that of Hassuna. There is an important new item in +the Sialk catalogue. The Sialk people made small drills or pins of +hammered copper. Thus the metallurgist’s specialized craft had made its +appearance. + +There is at least one very early Iranian site on the inward slopes +of the hilly-flanks zone. It is the earlier of two mounds at a place +called Bakun, in southwestern Iran; the results of the excavations +there are not yet published and we only know of its coarse and +primitive pottery. I only mention Bakun because it helps us to plot the +extent of the hilly-flanks zone villages on the map. + +The Nile Valley lies beyond the peculiar environmental zone of the +hilly flanks of the crescent, and it is probable that the earliest +village-farming communities in Egypt were established by a few people +who wandered into the Nile delta area from the nuclear area. The +assemblage which is most closely comparable to the catalogue of Hassuna +or Judaidah, for example, is that from little settlements along the +shore of the Fayum lake. The Fayum materials come mainly from grain +bins or silos. Another site, Merimde, in the western part of the Nile +delta, shows the remains of a true village, but it may be slightly +later than the settlement of the Fayum. There are radioactive carbon +“dates” for the Fayum materials at about 4275 B.C. ± 320 years, which +is almost fifteen hundred years later than the determinations suggested +for the Hassunan or Syro-Cilician assemblages. I suspect that this +is a somewhat over-extended indication of the time it took for the +generalized cultural pattern of village-farming community life to +spread from the nuclear area down into Egypt, but as yet we have no way +of testing these matters. + +In this same vein, we have two radioactive carbon dates for an +assemblage from sites near Khartoum in the Sudan, best represented by +the mound called Shaheinab. The Shaheinab catalogue roughly corresponds +to that of the Fayum; the distance between the two places, as the Nile +flows, is roughly 1,500 miles. Thus it took almost a thousand years for +the new way of life to be carried as far south into Africa as Khartoum; +the two Shaheinab “dates” average about 3300 B.C. ± 400 years. + +If the movement was up the Nile (southward), as these dates suggest, +then I suspect that the earliest available village material of middle +Egypt, the so-called Tasian, is also later than that of the Fayum. The +Tasian materials come from a few graves near a village called Deir +Tasa, and I have an uncomfortable feeling that the Tasian “assemblage” +may be mainly an artificial selection of poor examples of objects which +belong in the following range of time. + + +SPREAD IN TIME AND SPACE + +There are now two things we can do; in fact, we have already begun to +do them. We can watch the spread of the new way of life upward through +time in the nuclear area. We can also see how the new way of life +spread outward in space from the nuclear area, as time went on. There +is good archeological evidence that both these processes took place. +For the hill country of northeastern Iraq, in the nuclear area, we +have already noticed how the succession (still with gaps) from Karim +Shahir, through M’lefaat and Jarmo, to Hassuna can be charted (see +chart, p. 111). In the next chapter, we shall continue this charting +and description of what happened in Iraq upward through time. We also +watched traces of the new way of life move through space up the Nile +into Africa, to reach Khartoum in the Sudan some thirty-five hundred +years later than we had seen it at Jarmo or Jericho. We caught glimpses +of it in the Fayum and perhaps at Tasa along the way. + +For the remainder of this chapter, I shall try to suggest briefly for +you the directions taken by the spread of the new way of life from the +nuclear area in the Near East. First, let me make clear again that +I _do not_ believe that the village-farming community way of life +was invented only once and in the Near East. It seems to me that the +evidence is very clear that a separate experiment arose in the New +World. For China, the question of independence or borrowing--in the +appearance of the village-farming community there--is still an open +one. In the last chapter, we noted the probability of an independent +nuclear area in southeastern Asia. Professor Carl Sauer strongly +champions the great importance of this area as _the_ original center +of agricultural pursuits, as a kind of “cradle” of all incipient eras +of the Old World at least. While there is certainly not the slightest +archeological evidence to allow us to go that far, we may easily expect +that an early southeast Asian development would have been felt in +China. However, the appearance of the village-farming community in the +northwest of India, at least, seems to have depended on the earlier +development in the Near East. It is also probable that ideas of the new +way of life moved well beyond Khartoum in Africa. + + +THE SPREAD OF THE VILLAGE-FARMING COMMUNITY WAY OF LIFE INTO EUROPE + +How about Europe? I won’t give you many details. You can easily imagine +that the late prehistoric prelude to European history is a complicated +affair. We all know very well how complicated an area Europe is now, +with its welter of different languages and cultures. Remember, however, +that a great deal of archeology has been done on the late prehistory of +Europe, and very little on that of further Asia and Africa. If we knew +as much about these areas as we do of Europe, I expect we’d find them +just as complicated. + +This much is clear for Europe, as far as the spread of the +village-community way of life is concerned. The general idea and much +of the know-how and the basic tools of food-production moved from the +Near East to Europe. So did the plants and animals which had been +domesticated; they were not naturally at home in Europe, as they were +in western Asia. I do not, of course, mean that there were traveling +salesmen who carried these ideas and things to Europe with a commercial +gleam in their eyes. The process took time, and the ideas and things +must have been passed on from one group of people to the next. There +was also some actual movement of peoples, but we don’t know the size of +the groups that moved. + +The story of the “colonization” of Europe by the first farmers is +thus one of (1) the movement from the eastern Mediterranean lands +of some people who were farmers; (2) the spread of ideas and things +beyond the Near East itself and beyond the paths along which the +“colonists” moved; and (3) the adaptations of the ideas and things +by the indigenous “Forest folk”, about whose “receptiveness” Professor +Mathiassen speaks (p. 97). It is important to note that the resulting +cultures in the new European environment were European, not Near +Eastern. The late Professor Childe remarked that “the peoples of the +West were not slavish imitators; they adapted the gifts from the East +... into a new and organic whole capable of developing on its own +original lines.” + + +THE WAYS TO EUROPE + +Suppose we want to follow the traces of those earliest village-farmers +who did travel from western Asia into Europe. Let us start from +Syro-Cilicia, that part of the hilly-flanks zone proper which lies in +the very northeastern corner of the Mediterranean. Three ways would be +open to us (of course we could not be worried about permission from the +Soviet authorities!). We would go north, or north and slightly east, +across Anatolian Turkey, and skirt along either shore of the Black Sea +or even to the east of the Caucasus Mountains along the Caspian Sea, +to reach the plains of Ukrainian Russia. From here, we could march +across eastern Europe to the Baltic and Scandinavia, or even hook back +southwestward to Atlantic Europe. + +Our second way from Syro-Cilicia would also lie over Anatolia, to the +northwest, where we would have to swim or raft ourselves over the +Dardanelles or the Bosphorus to the European shore. Then we would bear +left toward Greece, but some of us might turn right again in Macedonia, +going up the valley of the Vardar River to its divide and on down +the valley of the Morava beyond, to reach the Danube near Belgrade +in Jugoslavia. Here we would turn left, following the great river +valley of the Danube up into central Europe. We would have a number of +tributary valleys to explore, or we could cross the divide and go down +the valley of the Rhine to the North Sea. + +Our third way from Syro-Cilicia would be by sea. We would coast along +southern Anatolia and visit Cyprus, Crete, and the Aegean islands on +our way to Greece, where, in the north, we might meet some of those who +had taken the second route. From Greece, we would sail on to Italy and +the western isles, to reach southern France and the coasts of Spain. +Eventually a few of us would sail up the Atlantic coast of Europe, to +reach western Britain and even Ireland. + +[Illustration: PROBABLE ROUTES AND TIMING IN THE SPREAD OF THE +VILLAGE-FARMING COMMUNITY WAY OF LIFE FROM THE NEAR EAST TO EUROPE] + +Of course none of us could ever take these journeys as the first +farmers took them, since the whole course of each journey must have +lasted many lifetimes. The date given to the assemblage called Windmill +Hill, the earliest known trace of village-farming communities in +England, is about 2500 B.C. I would expect about 5500 B.C. to be a +safe date to give for the well-developed early village communities of +Syro-Cilicia. We suspect that the spread throughout Europe did not +proceed at an even rate. Professor Piggott writes that “at a date +probably about 2600 B.C., simple agricultural communities were being +established in Spain and southern France, and from the latter region a +spread northwards can be traced ... from points on the French seaboard +of the [English] Channel ... there were emigrations of a certain number +of these tribes by boat, across to the chalk lands of Wessex and Sussex +[in England], probably not more than three or four generations later +than the formation of the south French colonies.” + +New radiocarbon determinations are becoming available all the +time--already several suggest that the food-producing way of life +had reached the lower Rhine and Holland by 4000 B.C. But not all +prehistorians accept these “dates,” so I do not show them on my map +(p. 139). + + +THE EARLIEST FARMERS OF ENGLAND + +To describe the later prehistory of all Europe for you would take +another book and a much larger one than this is. Therefore, I have +decided to give you only a few impressions of the later prehistory of +Britain. Of course the British Isles lie at the other end of Europe +from our base-line in western Asia. Also, they received influences +along at least two of the three ways in which the new way of life +moved into Europe. We will look at more of their late prehistory in a +following chapter: here, I shall speak only of the first farmers. + +The assemblage called Windmill Hill, which appears in the south of +England, exhibits three different kinds of structures, evidence of +grain-growing and of stock-breeding, and some distinctive types of +pottery and stone implements. The most remarkable type of structure +is the earthwork enclosures which seem to have served as seasonal +cattle corrals. These enclosures were roughly circular, reached over +a thousand feet in diameter, and sometimes included two or three +concentric sets of banks and ditches. Traces of oblong timber houses +have been found, but not within the enclosures. The second type of +structure is mine-shafts, dug down into the chalk beds where good +flint for the making of axes or hoes could be found. The third type +of structure is long simple mounds or “unchambered barrows,” in one +end of which burials were made. It has been commonly believed that the +Windmill Hill assemblage belonged entirely to the cultural tradition +which moved up through France to the Channel. Professor Piggott is now +convinced, however, that important elements of Windmill Hill stem from +northern Germany and Denmark--products of the first way into Europe +from the east. + +The archeological traces of a second early culture are to be found +in the west of England, western and northern Scotland, and most of +Ireland. The bearers of this culture had come up the Atlantic coast +by sea from southern France and Spain. The evidence they have left us +consists mainly of tombs and the contents of tombs, with only very +rare settlement sites. The tombs were of some size and received the +bodies of many people. The tombs themselves were built of stone, heaped +over with earth; the stones enclosed a passage to a central chamber +(“passage graves”), or to a simple long gallery, along the sides of +which the bodies were laid (“gallery graves”). The general type of +construction is called “megalithic” (= great stone), and the whole +earth-mounded structure is often called a _barrow_. Since many have +proper chambers, in one sense or another, we used the term “unchambered +barrow” above to distinguish those of the Windmill Hill type from these +megalithic structures. There is some evidence for sacrifice, libations, +and ceremonial fires, and it is clear that some form of community +ritual was focused on the megalithic tombs. + +The cultures of the people who produced the Windmill Hill assemblage +and of those who made the megalithic tombs flourished, at least in +part, at the same time. Although the distributions of the two different +types of archeological traces are in quite different parts of the +country, there is Windmill Hill pottery in some of the megalithic +tombs. But the tombs also contain pottery which seems to have arrived +with the tomb builders themselves. + +The third early British group of antiquities of this general time +(following 2500 B.C.) comes from sites in southern and eastern England. +It is not so certain that the people who made this assemblage, called +Peterborough, were actually farmers. While they may on occasion have +practiced a simple agriculture, many items of their assemblage link +them closely with that of the “Forest folk” of earlier times in +England and in the Baltic countries. Their pottery is decorated with +impressions of cords and is quite different from that of Windmill Hill +and the megalithic builders. In addition, the distribution of their +finds extends into eastern Britain, where the other cultures have left +no trace. The Peterborough people had villages with semi-subterranean +huts, and the bones of oxen, pigs, and sheep have been found in a few +of these. On the whole, however, hunting and fishing seem to have been +their vital occupations. They also established trade routes especially +to acquire the raw material for stone axes. + +A probably slightly later culture, whose traces are best known from +Skara Brae on Orkney, also had its roots in those cultures of the +Baltic area which fused out of the meeting of the “Forest folk” and +the peoples who took the eastern way into Europe. Skara Brae is very +well preserved, having been built of thin stone slabs about which +dune-sand drifted after the village died. The individual houses, the +bedsteads, the shelves, the chests for clothes and oddments--all built +of thin stone-slabs--may still be seen in place. But the Skara Brae +people lived entirely by sheep- and cattle-breeding, and by catching +shellfish. Neither grain nor the instruments of agriculture appeared at +Skara Brae. + + +THE EUROPEAN ACHIEVEMENT + +The above is only a very brief description of what went on in Britain +with the arrival of the first farmers. There are many interesting +details which I have omitted in order to shorten the story. + +I believe some of the difficulty we have in understanding the +establishment of the first farming communities in Europe is with +the word “colonization.” We have a natural tendency to think of +“colonization” as it has happened within the last few centuries. In the +case of the colonization of the Americas, for example, the colonists +came relatively quickly, and in increasingly vast numbers. They had +vastly superior technical, political, and war-making skills, compared +with those of the Indians. There was not much mixing with the Indians. +The case in Europe five or six thousand years ago must have been very +different. I wonder if it is even proper to call people “colonists” +who move some miles to a new region, settle down and farm it for some +years, then move on again, generation after generation? The ideas and +the things which these new people carried were only _potentially_ +superior. The ideas and things and the people had to prove themselves +in their adaptation to each new environment. Once this was done another +link to the chain would be added, and then the forest-dwellers and +other indigenous folk of Europe along the way might accept the new +ideas and things. It is quite reasonable to expect that there must have +been much mixture of the migrants and the indigenes along the way; the +Peterborough and Skara Brae assemblages we mentioned above would seem +to be clear traces of such fused cultures. Sometimes, especially if the +migrants were moving by boat, long distances may have been covered in +a short time. Remember, however, we seem to have about three thousand +years between the early Syro-Cilician villages and Windmill Hill. + +Let me repeat Professor Childe again. “The peoples of the West were +not slavish imitators: they adapted the gifts from the East ... into +a new and organic whole capable of developing on its own original +lines.” Childe is of course completely conscious of the fact that his +“peoples of the West” were in part the descendants of migrants who came +originally from the “East,” bringing their “gifts” with them. This +was the late prehistoric achievement of Europe--to take new ideas and +things and some migrant peoples and, by mixing them with the old in its +own environments, to forge a new and unique series of cultures. + +What we know of the ways of men suggests to us that when the details +of the later prehistory of further Asia and Africa are learned, their +stories will be just as exciting. + + + + +THE Conquest of Civilization + +[Illustration] + + +Now we must return to the Near East again. We are coming to the point +where history is about to begin. I am going to stick pretty close +to Iraq and Egypt in this chapter. These countries will perhaps be +the most interesting to most of us, for the foundations of western +civilization were laid in the river lands of the Tigris and Euphrates +and of the Nile. I shall probably stick closest of all to Iraq, because +things first happened there and also because I know it best. + +There is another interesting thing, too. We have seen that the first +experiment in village-farming took place in the Near East. So did +the first experiment in civilization. Both experiments “took.” The +traditions we live by today are based, ultimately, on those ancient +beginnings in food-production and civilization in the Near East. + + +WHAT “CIVILIZATION” MEANS + +I shall not try to define “civilization” for you; rather, I shall +tell you what the word brings to my mind. To me civilization means +urbanization: the fact that there are cities. It means a formal +political set-up--that there are kings or governing bodies that the +people have set up. It means formal laws--rules of conduct--which the +government (if not the people) believes are necessary. It probably +means that there are formalized projects--roads, harbors, irrigation +canals, and the like--and also some sort of army or police force +to protect them. It means quite new and different art forms. It +also usually means there is writing. (The people of the Andes--the +Incas--had everything which goes to make up a civilization but formal +writing. I can see no reason to say they were not civilized.) Finally, +as the late Professor Redfield reminded us, civilization seems to bring +with it the dawn of a new kind of moral order. + +In different civilizations, there may be important differences in the +way such things as the above are managed. In early civilizations, it is +usual to find religion very closely tied in with government, law, and +so forth. The king may also be a high priest, or he may even be thought +of as a god. The laws are usually thought to have been given to the +people by the gods. The temples are protected just as carefully as the +other projects. + + +CIVILIZATION IMPOSSIBLE WITHOUT FOOD-PRODUCTION + +Civilizations have to be made up of many people. Some of the people +live in the country; some live in very large towns or cities. Classes +of society have begun. There are officials and government people; there +are priests or religious officials; there are merchants and traders; +there are craftsmen, metal-workers, potters, builders, and so on; there +are also farmers, and these are the people who produce the food for the +whole population. It must be obvious that civilization cannot exist +without food-production and that food-production must also be at a +pretty efficient level of village-farming before civilization can even +begin. + +But people can be food-producing without being civilized. In many +parts of the world this is still the case. When the white men first +came to America, the Indians in most parts of this hemisphere were +food-producers. They grew corn, potatoes, tomatoes, squash, and many +other things the white men had never eaten before. But only the Aztecs +of Mexico, the Mayas of Yucatan and Guatemala, and the Incas of the +Andes were civilized. + + +WHY DIDN’T CIVILIZATION COME TO ALL FOOD-PRODUCERS? + +Once you have food-production, even at the well-advanced level of +the village-farming community, what else has to happen before you +get civilization? Many men have asked this question and have failed +to give a full and satisfactory answer. There is probably no _one_ +answer. I shall give you my own idea about how civilization _may_ have +come about in the Near East alone. Remember, it is only a guess--a +putting together of hunches from incomplete evidence. It is _not_ meant +to explain how civilization began in any of the other areas--China, +southeast Asia, the Americas--where other early experiments in +civilization went on. The details in those areas are quite different. +Whether certain general principles hold, for the appearance of any +early civilization, is still an open and very interesting question. + + +WHERE CIVILIZATION FIRST APPEARED IN THE NEAR EAST + +You remember that our earliest village-farming communities lay along +the hilly flanks of a great “crescent.” (See map on p. 125.) +Professor Breasted’s “fertile crescent” emphasized the rich river +valleys of the Nile and the Tigris-Euphrates Rivers. Our hilly-flanks +area of the crescent zone arches up from Egypt through Palestine and +Syria, along southern Turkey into northern Iraq, and down along the +southwestern fringe of Iran. The earliest food-producing villages we +know already existed in this area by about 6750 B.C. (± 200 years). + +Now notice that this hilly-flanks zone does not include southern +Mesopotamia, the alluvial land of the lower Tigris and Euphrates in +Iraq, or the Nile Valley proper. The earliest known villages of classic +Mesopotamia and Egypt seem to appear fifteen hundred or more years +after those of the hilly-flanks zone. For example, the early Fayum +village which lies near a lake west of the Nile Valley proper (see p. +135) has a radiocarbon date of 4275 B.C. ± 320 years. It was in the +river lands, however, that the immediate beginnings of civilization +were made. + +We know that by about 3200 B.C. the Early Dynastic period had begun +in southern Mesopotamia. The beginnings of writing go back several +hundred years earlier, but we can safely say that civilization had +begun in Mesopotamia by 3200 B.C. In Egypt, the beginning of the First +Dynasty is slightly later, at about 3100 B.C., and writing probably +did not appear much earlier. There is no question but that history and +civilization were well under way in both Mesopotamia and Egypt by 3000 +B.C.--about five thousand years ago. + + +THE HILLY-FLANKS ZONE VERSUS THE RIVER LANDS + +Why did these two civilizations spring up in these two river +lands which apparently were not even part of the area where the +village-farming community began? Why didn’t we have the first +civilizations in Palestine, Syria, north Iraq, or Iran, where we’re +sure food-production had had a long time to develop? I think the +probable answer gives a clue to the ways in which civilization began in +Egypt and Mesopotamia. + +The land in the hilly flanks is of a sort which people can farm without +too much trouble. There is a fairly fertile coastal strip in Palestine +and Syria. There are pleasant mountain slopes, streams running out to +the sea, and rain, at least in the winter months. The rain belt and the +foothills of the Turkish mountains also extend to northern Iraq and on +to the Iranian plateau. The Iranian plateau has its mountain valleys, +streams, and some rain. These hilly flanks of the “crescent,” through +most of its arc, are almost made-to-order for beginning farmers. The +grassy slopes of the higher hills would be pasture for their herds +and flocks. As soon as the earliest experiments with agriculture and +domestic animals had been successful, a pleasant living could be +made--and without too much trouble. + +I should add here again, that our evidence points increasingly to a +climate for those times which is very little different from that for +the area today. Now look at Egypt and southern Mesopotamia. Both are +lands without rain, for all intents and purposes. Both are lands with +rivers that have laid down very fertile soil--soil perhaps superior to +that in the hilly flanks. But in both lands, the rivers are of no great +aid without some control. + +The Nile floods its banks once a year, in late September or early +October. It not only soaks the narrow fertile strip of land on either +side; it lays down a fresh layer of new soil each year. Beyond the +fertile strip on either side rise great cliffs, and behind them is the +desert. In its natural, uncontrolled state, the yearly flood of the +Nile must have caused short-lived swamps that were full of crocodiles. +After a short time, the flood level would have dropped, the water and +the crocodiles would have run back into the river, and the swamp plants +would have become parched and dry. + +The Tigris and the Euphrates of Mesopotamia are less likely to flood +regularly than the Nile. The Tigris has a shorter and straighter course +than the Euphrates; it is also the more violent river. Its banks are +high, and when the snows melt and flow into all of its tributary rivers +it is swift and dangerous. The Euphrates has a much longer and more +curving course and few important tributaries. Its banks are lower and +it is less likely to flood dangerously. The land on either side and +between the two rivers is very fertile, south of the modern city of +Baghdad. Unlike the Nile Valley, neither the Tigris nor the Euphrates +is flanked by cliffs. The land on either side of the rivers stretches +out for miles and is not much rougher than a poor tennis court. + + +THE RIVERS MUST BE CONTROLLED + +The real trick in both Egypt and Mesopotamia is to make the rivers work +for you. In Egypt, this is a matter of building dikes and reservoirs +that will catch and hold the Nile flood. In this way, the water is held +and allowed to run off over the fields as it is needed. In Mesopotamia, +it is a matter of taking advantage of natural river channels and branch +channels, and of leading ditches from these onto the fields. + +Obviously, we can no longer find the first dikes or reservoirs of +the Nile Valley, or the first canals or ditches of Mesopotamia. The +same land has been lived on far too long for any traces of the first +attempts to be left; or, especially in Egypt, it has been covered by +the yearly deposits of silt, dropped by the river floods. But we’re +pretty sure the first food-producers of Egypt and southern Mesopotamia +must have made such dikes, canals, and ditches. In the first place, +there can’t have been enough rain for them to grow things otherwise. +In the second place, the patterns for such projects seem to have been +pretty well set by historic times. + + +CONTROL OF THE RIVERS THE BUSINESS OF EVERYONE + +Here, then, is a _part_ of the reason why civilization grew in Egypt +and Mesopotamia first--not in Palestine, Syria, or Iran. In the latter +areas, people could manage to produce their food as individuals. It +wasn’t too hard; there were rain and some streams, and good pasturage +for the animals even if a crop or two went wrong. In Egypt and +Mesopotamia, people had to put in a much greater amount of work, and +this work couldn’t be individual work. Whole villages or groups of +people had to turn out to fix dikes or dig ditches. The dikes had to be +repaired and the ditches carefully cleared of silt each year, or they +would become useless. + +There also had to be hard and fast rules. The person who lived nearest +the ditch or the reservoir must not be allowed to take all the water +and leave none for his neighbors. It was not only a business of +learning to control the rivers and of making their waters do the +farmer’s work. It also meant controlling men. But once these men had +managed both kinds of controls, what a wonderful yield they had! The +soil was already fertile, and the silt which came in the floods and +ditches kept adding fertile soil. + + +THE GERM OF CIVILIZATION IN EGYPT AND MESOPOTAMIA + +This learning to work together for the common good was the real germ of +the Egyptian and the Mesopotamian civilizations. The bare elements of +civilization were already there: the need for a governing hand and for +laws to see that the communities’ work was done and that the water was +justly shared. You may object that there is a sort of chicken and egg +paradox in this idea. How could the people set up the rules until they +had managed to get a way to live, and how could they manage to get a +way to live until they had set up the rules? I think that small groups +must have moved down along the mud-flats of the river banks quite +early, making use of naturally favorable spots, and that the rules grew +out of such cases. It would have been like the hand-in-hand growth of +automobiles and paved highways in the United States. + +Once the rules and the know-how did get going, there must have been a +constant interplay of the two. Thus, the more the crops yielded, the +richer and better-fed the people would have been, and the more the +population would have grown. As the population grew, more land would +have needed to be flooded or irrigated, and more complex systems of +dikes, reservoirs, canals, and ditches would have been built. The more +complex the system, the more necessity for work on new projects and for +the control of their use.... And so on.... + +What I have just put down for you is a guess at the manner of growth of +some of the formalized systems that go to make up a civilized society. +My explanation has been pointed particularly at Egypt and Mesopotamia. +I have already told you that the irrigation and water-control part of +it does not apply to the development of the Aztecs or the Mayas, or +perhaps anybody else. But I think that a fair part of the story of +Egypt and Mesopotamia must be as I’ve just told you. + +I am particularly anxious that you do _not_ understand me to mean that +irrigation _caused_ civilization. I am sure it was not that simple at +all. For, in fact, a complex and highly engineered irrigation system +proper did not come until later times. Let’s say rather that the simple +beginnings of irrigation allowed and in fact encouraged a great number +of things in the technological, political, social, and moral realms of +culture. We do not yet understand what all these things were or how +they worked. But without these other aspects of culture, I do not +think that urbanization and civilization itself could have come into +being. + + +THE ARCHEOLOGICAL SEQUENCE TO CIVILIZATION IN IRAQ + +We last spoke of the archeological materials of Iraq on page 130, +where I described the village-farming community of Hassunan type. The +Hassunan type villages appear in the hilly-flanks zone and in the +rolling land adjacent to the Tigris in northern Iraq. It is probable +that even before the Hassuna pattern of culture lived its course, a +new assemblage had been established in northern Iraq and Syria. This +assemblage is called Halaf, after a site high on a tributary of the +Euphrates, on the Syro-Turkish border. + +[Illustration: SKETCH OF SELECTED ITEMS OF HALAFIAN ASSEMBLAGE + + BEADS AND PENDANTS + POTTERY MOTIFS + POTTERY] + +The Halafian assemblage is incompletely known. The culture it +represents included a remarkably handsome painted pottery. +Archeologists have tended to be so fascinated with this pottery that +they have bothered little with the rest of the Halafian assemblage. We +do know that strange stone-founded houses, with plans like those of the +popular notion of an Eskimo igloo, were built. Like the pottery of the +Samarran style, which appears as part of the Hassunan assemblage (see +p. 131), the Halafian painted pottery implies great concentration and +excellence of draftsmanship on the part of the people who painted it. + +We must mention two very interesting sites adjacent to the mud-flats of +the rivers, half way down from northern Iraq to the classic alluvial +Mesopotamian area. One is Baghouz on the Euphrates; the other is +Samarra on the Tigris (see map, p. 125). Both these sites yield the +handsome painted pottery of the style called Samarran: in fact it +is Samarra which gives its name to the pottery. Neither Baghouz nor +Samarra have completely Hassunan types of assemblages, and at Samarra +there are a few pots of proper Halafian style. I suppose that Samarra +and Baghouz give us glimpses of those early farmers who had begun to +finger their way down the mud-flats of the river banks toward the +fertile but yet untilled southland. + + +CLASSIC SOUTHERN MESOPOTAMIA FIRST OCCUPIED + +Our next step is into the southland proper. Here, deep in the core of +the mound which later became the holy Sumerian city of Eridu, Iraqi +archeologists uncovered a handsome painted pottery. Pottery of the same +type had been noticed earlier by German archeologists on the surface +of a small mound, awash in the spring floods, near the remains of the +Biblical city of Erich (Sumerian = Uruk; Arabic = Warka). This “Eridu” +pottery, which is about all we have of the assemblage of the people who +once produced it, may be seen as a blend of the Samarran and Halafian +painted pottery styles. This may over-simplify the case, but as yet we +do not have much evidence to go on. The idea does at least fit with my +interpretation of the meaning of Baghouz and Samarra as way-points on +the mud-flats of the rivers half way down from the north. + +My colleague, Robert Adams, believes that there were certainly +riverine-adapted food-collectors living in lower Mesopotamia. The +presence of such would explain why the Eridu assemblage is not simply +the sum of the Halafian and Samarran assemblages. But the domesticated +plants and animals and the basic ways of food-production must have +come from the hilly-flanks country in the north. + +Above the basal Eridu levels, and at a number of other sites in the +south, comes a full-fledged assemblage called Ubaid. Incidentally, +there is an aspect of the Ubaidian assemblage in the north as well. It +seems to move into place before the Halaf manifestation is finished, +and to blend with it. The Ubaidian assemblage in the south is by far +the more spectacular. The development of the temple has been traced +at Eridu from a simple little structure to a monumental building some +62 feet long, with a pilaster-decorated façade and an altar in its +central chamber. There is painted Ubaidian pottery, but the style is +hurried and somewhat careless and gives the _impression_ of having been +a cheap mass-production means of decoration when compared with the +carefully drafted styles of Samarra and Halaf. The Ubaidian people made +other items of baked clay: sickles and axes of very hard-baked clay +are found. The northern Ubaidian sites have yielded tools of copper, +but metal tools of unquestionable Ubaidian find-spots are not yet +available from the south. Clay figurines of human beings with monstrous +turtle-like faces are another item in the southern Ubaidian assemblage. + +[Illustration: SKETCH OF SELECTED ITEMS OF UBAIDIAN ASSEMBLAGE] + +There is a large Ubaid cemetery at Eridu, much of it still awaiting +excavation. The few skeletons so far tentatively studied reveal a +completely modern type of “Mediterraneanoid”; the individuals whom the +skeletons represent would undoubtedly blend perfectly into the modern +population of southern Iraq. What the Ubaidian assemblage says to us is +that these people had already adapted themselves and their culture to +the peculiar riverine environment of classic southern Mesopotamia. For +example, hard-baked clay axes will chop bundles of reeds very well, or +help a mason dress his unbaked mud bricks, and there were only a few +soft and pithy species of trees available. The Ubaidian levels of Eridu +yield quantities of date pits; that excellent and characteristically +Iraqi fruit was already in use. The excavators also found the clay +model of a ship, with the stepping-point for a mast, so that Sinbad the +Sailor must have had his antecedents as early as the time of Ubaid. +The bones of fish, which must have flourished in the larger canals as +well as in the rivers, are common in the Ubaidian levels and thereafter. + + +THE UBAIDIAN ACHIEVEMENT + +On present evidence, my tendency is to see the Ubaidian assemblage +in southern Iraq as the trace of a new era. I wish there were more +evidence, but what we have suggests this to me. The culture of southern +Ubaid soon became a culture of towns--of centrally located towns with +some rural villages about them. The town had a temple and there must +have been priests. These priests probably had political and economic +functions as well as religious ones, if the somewhat later history of +Mesopotamia may suggest a pattern for us. Presently the temple and its +priesthood were possibly the focus of the market; the temple received +its due, and may already have had its own lands and herds and flocks. +The people of the town, undoubtedly at least in consultation with the +temple administration, planned and maintained the simple irrigation +ditches. As the system flourished, the community of rural farmers would +have produced more than sufficient food. The tendency for specialized +crafts to develop--tentative at best at the cultural level of the +earlier village-farming community era--would now have been achieved, +and probably many other specialists in temple administration, water +control, architecture, and trade would also have appeared, as the +surplus food-supply was assured. + +Southern Mesopotamia is not a land rich in natural resources other +than its fertile soil. Stone, good wood for construction, metal, and +innumerable other things would have had to be imported. Grain and +dates--although both are bulky and difficult to transport--and wool and +woven stuffs must have been the mediums of exchange. Over what area did +the trading net-work of Ubaid extend? We start with the idea that the +Ubaidian assemblage is most richly developed in the south. We assume, I +think, correctly, that it represents a cultural flowering of the south. +On the basis of the pottery of the still elusive “Eridu” immigrants +who had first followed the rivers into alluvial Mesopotamia, we get +the notion that the characteristic painted pottery style of Ubaid +was developed in the southland. If this reconstruction is correct +then we may watch with interest where the Ubaid pottery-painting +tradition spread. We have already mentioned that there is a substantial +assemblage of (and from the southern point of view, _fairly_ pure) +Ubaidian material in northern Iraq. The pottery appears all along the +Iranian flanks, even well east of the head of the Persian Gulf, and +ends in a later and spectacular flourish in an extremely handsome +painted style called the “Susa” style. Ubaidian pottery has been noted +up the valleys of both of the great rivers, well north of the Iraqi +and Syrian borders on the southern flanks of the Anatolian plateau. +It reaches the Mediterranean Sea and the valley of the Orontes in +Syria, and it may be faintly reflected in the painted style of a +site called Ghassul, on the east bank of the Jordan in the Dead Sea +Valley. Over this vast area--certainly in all of the great basin of +the Tigris-Euphrates drainage system and its natural extensions--I +believe we may lay our fingers on the traces of a peculiar way of +decorating pottery, which we call Ubaidian. This cursive and even +slap-dash decoration, it appears to me, was part of a new cultural +tradition which arose from the adjustments which immigrant northern +farmers first made to the new and challenging environment of southern +Mesopotamia. But exciting as the idea of the spread of influences of +the Ubaid tradition in space may be, I believe you will agree that the +consequences of the growth of that tradition in southern Mesopotamia +itself, as time passed, are even more important. + + +THE WARKA PHASE IN THE SOUTH + +So far, there are only two radiocarbon determinations for the Ubaidian +assemblage, one from Tepe Gawra in the north and one from Warka in the +south. My hunch would be to use the dates 4500 to 3750 B.C., with a +plus or more probably a minus factor of about two hundred years for +each, as the time duration of the Ubaidian assemblage in southern +Mesopotamia. + +Next, much to our annoyance, we have what is almost a temporary +black-out. According to the system of terminology I favor, our next +“assemblage” after that of Ubaid is called the _Warka_ phase, from +the Arabic name for the site of Uruk or Erich. We know it only from +six or seven levels in a narrow test-pit at Warka, and from an even +smaller hole at another site. This “assemblage,” so far, is known only +by its pottery, some of which still bears Ubaidian style painting. The +characteristic Warkan pottery is unpainted, with smoothed red or gray +surfaces and peculiar shapes. Unquestionably, there must be a great +deal more to say about the Warkan assemblage, but someone will first +have to excavate it! + + +THE DAWN OF CIVILIZATION + +After our exasperation with the almost unknown Warka interlude, +following the brilliant “false dawn” of Ubaid, we move next to an +assemblage which yields traces of a preponderance of those elements +which we noted (p. 144) as meaning civilization. This assemblage +is that called _Proto-Literate_; it already contains writing. On +the somewhat shaky principle that writing, however early, means +history--and no longer prehistory--the assemblage is named for the +historical implications of its content, and no longer after the name of +the site where it was first found. Since some of the older books used +site-names for this assemblage, I will tell you that the Proto-Literate +includes the latter half of what used to be called the “Uruk period” +_plus_ all of what used to be called the “Jemdet Nasr period.” It shows +a consistent development from beginning to end. + +I shall, in fact, leave much of the description and the historic +implications of the Proto-Literate assemblage to the conventional +historians. Professor T. J. Jacobsen, reaching backward from the +legends he finds in the cuneiform writings of slightly later times, can +in fact tell you a more complete story of Proto-Literate culture than +I can. It should be enough here if I sum up briefly what the excavated +archeological evidence shows. + +We have yet to dig a Proto-Literate site in its entirety, but the +indications are that the sites cover areas the size of small cities. +In architecture, we know of large and monumental temple structures, +which were built on elaborate high terraces. The plans and decoration +of these temples follow the pattern set in the Ubaid phase: the chief +difference is one of size. The German excavators at the site of Warka +reckoned that the construction of only one of the Proto-Literate temple +complexes there must have taken 1,500 men, each working a ten-hour day, +five years to build. + + +ART AND WRITING + +If the architecture, even in its monumental forms, can be seen to +stem from Ubaidian developments, this is not so with our other +evidence of Proto-Literate artistic expression. In relief and applied +sculpture, in sculpture in the round, and on the engraved cylinder +seals--all of which now make their appearance--several completely +new artistic principles are apparent. These include the composition +of subject-matter in groups, commemorative scenes, and especially +the ability and apparent desire to render the human form and face. +Excellent as the animals of the Franco-Cantabrian art may have been +(see p. 85), and however handsome were the carefully drafted +geometric designs and conventionalized figures on the pottery of the +early farmers, there seems to have been, up to this time, a mental +block about the drawing of the human figure and especially the human +face. We do not yet know what caused this self-consciousness about +picturing themselves which seems characteristic of men before the +appearance of civilization. We do know that with civilization, the +mental block seems to have been removed. + +Clay tablets bearing pictographic signs are the Proto-Literate +forerunners of cuneiform writing. The earliest examples are not well +understood but they seem to be “devices for making accounts and +for remembering accounts.” Different from the later case in Egypt, +where writing appears fully formed in the earliest examples, the +development from simple pictographic signs to proper cuneiform writing +may be traced, step by step, in Mesopotamia. It is most probable +that the development of writing was connected with the temple and +the need for keeping account of the temple’s possessions. Professor +Jacobsen sees writing as a means for overcoming space, time, and the +increasing complications of human affairs: “Literacy, which began +with ... civilization, enhanced mightily those very tendencies in its +development which characterize it as a civilization and mark it off as +such from other types of culture.” + +[Illustration: RELIEF ON A PROTO-LITERATE STONE VASE, WARKA + +Unrolled drawing, with restoration suggested by figures from +contemporary cylinder seals] + +While the new principles in art and the idea of writing are not +foreshadowed in the Ubaid phase, or in what little we know of the +Warkan, I do not think we need to look outside southern Mesopotamia +for their beginnings. We do know something of the adjacent areas, +too, and these beginnings are not there. I think we must accept them +as completely new discoveries, made by the people who were developing +the whole new culture pattern of classic southern Mesopotamia. Full +description of the art, architecture, and writing of the Proto-Literate +phase would call for many details. Men like Professor Jacobsen and Dr. +Adams can give you these details much better than I can. Nor shall I do +more than tell you that the common pottery of the Proto-Literate phase +was so well standardized that it looks factory made. There was also +some handsome painted pottery, and there were stone bowls with inlaid +decoration. Well-made tools in metal had by now become fairly common, +and the metallurgist was experimenting with the casting process. Signs +for plows have been identified in the early pictographs, and a wheeled +chariot is shown on a cylinder seal engraving. But if I were forced to +a guess in the matter, I would say that the development of plows and +draft-animals probably began in the Ubaid period and was another of the +great innovations of that time. + +The Proto-Literate assemblage clearly suggests a highly developed and +sophisticated culture. While perhaps not yet fully urban, it is on +the threshold of urbanization. There seems to have been a very dense +settlement of Proto-Literate sites in classic southern Mesopotamia, +many of them newly founded on virgin soil where no earlier settlements +had been. When we think for a moment of what all this implies, of the +growth of an irrigation system which must have existed to allow the +flourish of this culture, and of the social and political organization +necessary to maintain the irrigation system, I think we will agree that +at last we are dealing with civilization proper. + + +FROM PREHISTORY TO HISTORY + +Now it is time for the conventional ancient historians to take over +the story from me. Remember this when you read what they write. Their +real base-line is with cultures ruled over by later kings and emperors, +whose writings describe military campaigns and the administration of +laws and fully organized trading ventures. To these historians, the +Proto-Literate phase is still a simple beginning for what is to follow. +If they mention the Ubaid assemblage at all--the one I was so lyrical +about--it will be as some dim and fumbling step on the path to the +civilized way of life. + +I suppose you could say that the difference in the approach is that as +a prehistorian I have been looking forward or upward in time, while the +historians look backward to glimpse what I’ve been describing here. My +base-line was half a million years ago with a being who had little more +than the capacity to make tools and fire to distinguish him from the +animals about him. Thus my point of view and that of the conventional +historian are bound to be different. You will need both if you want to +understand all of the story of men, as they lived through time to the +present. + + + + +End of PREHISTORY + +[Illustration] + + +You’ll doubtless easily recall your general course in ancient history: +how the Sumerian dynasties of Mesopotamia were supplanted by those of +Babylonia, how the Hittite kingdom appeared in Anatolian Turkey, and +about the three great phases of Egyptian history. The literate kingdom +of Crete arose, and by 1500 B.C. there were splendid fortified Mycenean +towns on the mainland of Greece. This was the time--about the whole +eastern end of the Mediterranean--of what Professor Breasted called the +“first great internationalism,” with flourishing trade, international +treaties, and royal marriages between Egyptians, Babylonians, and +Hittites. By 1200 B.C., the whole thing had fragmented: “the peoples of +the sea were restless in their isles,” and the great ancient centers in +Egypt, Mesopotamia, and Anatolia were eclipsed. Numerous smaller states +arose--Assyria, Phoenicia, Israel--and the Trojan war was fought. +Finally Assyria became the paramount power of all the Near East, +presently to be replaced by Persia. + +A new culture, partaking of older west Asiatic and Egyptian elements, +but casting them with its own tradition into a new mould, arose in +mainland Greece. + +I once shocked my Classical colleagues to the core by referring to +Greece as “a second degree derived civilization,” but there is much +truth in this. The principles of bronze- and then of iron-working, of +the alphabet, and of many other elements in Greek culture were borrowed +from western Asia. Our debt to the Greeks is too well known for me even +to mention it, beyond recalling to you that it is to Greece we owe the +beginnings of rational or empirical science and thought in general. But +Greece fell in its turn to Rome, and in 55 B.C. Caesar invaded Britain. + +I last spoke of Britain on page 142; I had chosen it as my single +example for telling you something of how the earliest farming +communities were established in Europe. Now I will continue with +Britain’s later prehistory, so you may sense something of the end of +prehistory itself. Remember that Britain is simply a single example +we select; the same thing could be done for all the other countries +of Europe, and will be possible also, some day, for further Asia and +Africa. Remember, too, that prehistory in most of Europe runs on for +three thousand or more years _after_ conventional ancient history +begins in the Near East. Britain is a good example to use in showing +how prehistory ended in Europe. As we said earlier, it lies at the +opposite end of Europe from the area of highest cultural achievement in +those times, and should you care to read more of the story in detail, +you may do so in the English language. + + +METAL USERS REACH ENGLAND + +We left the story of Britain with the peoples who made three different +assemblages--the Windmill Hill, the megalith-builders, and the +Peterborough--making adjustments to their environments, to the original +inhabitants of the island, and to each other. They had first arrived +about 2500 B.C., and were simple pastoralists and hoe cultivators who +lived in little village communities. Some of them planted little if any +grain. By 2000 B.C., they were well settled in. Then, somewhere in the +range from about 1900 to 1800 B.C., the traces of the invasion of a new +series of peoples began to appear. + +The first newcomers are called the Beaker folk, after the name of a +peculiar form of pottery they made. The beaker type of pottery seems +oldest in Spain, where it occurs with great collective tombs of +megalithic construction and with copper tools. But the Beaker folk who +reached England seem already to have moved first from Spain(?) to the +Rhineland and Holland. While in the Rhineland, and before leaving for +England, the Beaker folk seem to have mixed with the local population +and also with incomers from northeastern Europe whose culture included +elements brought originally from the Near East by the eastern way +through the steppes. This last group has also been named for a peculiar +article in its assemblage; the group is called the Battle-axe folk. A +few Battle-axe folk elements, including, in fact, stone battle-axes, +reached England with the earliest Beaker folk,[6] coming from the +Rhineland. + + [6] The British authors use the term “Beaker folk” to mean both + archeological assemblage and human physical type. They speak + of a “... tall, heavy-boned, rugged, and round-headed” strain + which they take to have developed, apparently in the Rhineland, + by a mixture of the original (Spanish?) beaker-makers and + the northeast European battle-axe makers. However, since the + science of physical anthropology is very much in flux at the + moment, and since I am not able to assess the evidence for these + physical types, I _do not_ use the term “folk” in this book with + its usual meaning of standardized physical type. When I use + “folk” here, I mean simply _the makers of a given archeological + assemblage_. The difficulty only comes when assemblages are + named for some item in them; it is too clumsy to make an + adjective of the item and refer to a “beakerian” assemblage. + +The Beaker folk settled earliest in the agriculturally fertile south +and east. There seem to have been several phases of Beaker folk +invasions, and it is not clear whether these all came strictly from the +Rhineland or Holland. We do know that their copper daggers and awls +and armlets are more of Irish or Atlantic European than of Rhineland +origin. A few simple habitation sites and many burials of the Beaker +folk are known. They buried their dead singly, sometimes in conspicuous +individual barrows with the dead warrior in his full trappings. The +spectacular element in the assemblage of the Beaker folk is a group +of large circular monuments with ditches and with uprights of wood or +stone. These “henges” became truly monumental several hundred years +later; while they were occasionally dedicated with a burial, they were +not primarily tombs. The effect of the invasion of the Beaker folk +seems to cut across the whole fabric of life in Britain. + +[Illustration: BEAKER] + +There was, however, a second major element in British life at this +time. It shows itself in the less well understood traces of a group +again called after one of the items in their catalogue, the Food-vessel +folk. There are many burials in these “food-vessel” pots in northern +England, Scotland, and Ireland, and the pottery itself seems to +link back to that of the Peterborough assemblage. Like the earlier +Peterborough people in the highland zone before them, the makers of +the food-vessels seem to have been heavily involved in trade. It is +quite proper to wonder whether the food-vessel pottery itself was made +by local women who were married to traders who were middlemen in the +transmission of Irish metal objects to north Germany and Scandinavia. +The belt of high, relatively woodless country, from southwest to +northeast, was already established as a natural route for inland trade. + + +MORE INVASIONS + +About 1500 B.C., the situation became further complicated by the +arrival of new people in the region of southern England anciently +called Wessex. The traces suggest the Brittany coast of France as a +source, and the people seem at first to have been a small but “heroic” +group of aristocrats. Their “heroes” are buried with wealth and +ceremony, surrounded by their axes and daggers of bronze, their gold +ornaments, and amber and jet beads. These rich finds show that the +trade-linkage these warriors patronized spread from the Baltic sources +of amber to Mycenean Greece or even Egypt, as evidenced by glazed blue +beads. + +The great visual trace of Wessex achievement is the final form of +the spectacular sanctuary at Stonehenge. A wooden henge or circular +monument was first made several hundred years earlier, but the site +now received its great circles of stone uprights and lintels. The +diameter of the surrounding ditch at Stonehenge is about 350 feet, the +diameter of the inner circle of large stones is about 100 feet, and +the tallest stone of the innermost horseshoe-shaped enclosure is 29 +feet 8 inches high. One circle is made of blue stones which must have +been transported from Pembrokeshire, 145 miles away as the crow flies. +Recently, many carvings representing the profile of a standard type of +bronze axe of the time, and several profiles of bronze daggers--one of +which has been called Mycenean in type--have been found carved in the +stones. We cannot, of course, describe the details of the religious +ceremonies which must have been staged in Stonehenge, but we can +certainly imagine the well-integrated and smoothly working culture +which must have been necessary before such a great monument could have +been built. + + +“THIS ENGLAND” + +The range from 1900 to about 1400 B.C. includes the time of development +of the archeological features usually called the “Early Bronze Age” +in Britain. In fact, traces of the Wessex warriors persisted down to +about 1200 B.C. The main regions of the island were populated, and the +adjustments to the highland and lowland zones were distinct and well +marked. The different aspects of the assemblages of the Beaker folk and +the clearly expressed activities of the Food-vessel folk and the Wessex +warriors show that Britain was already taking on her characteristic +trading role, separated from the European continent but conveniently +adjacent to it. The tin of Cornwall--so important in the production +of good bronze--as well as the copper of the west and of Ireland, +taken with the gold of Ireland and the general excellence of Irish +metal work, assured Britain a trader’s place in the then known world. +Contacts with the eastern Mediterranean may have been by sea, with +Cornish tin as the attraction, or may have been made by the Food-vessel +middlemen on their trips to the Baltic coast. There they would have +encountered traders who traveled the great north-south European road, +by which Baltic amber moved southward to Greece and the Levant, and +ideas and things moved northward again. + +There was, however, the Channel between England and Europe, and this +relative isolation gave some peace and also gave time for a leveling +and further fusion of culture. The separate cultural traditions began +to have more in common. The growing of barley, the herding of sheep and +cattle, and the production of woolen garments were already features +common to all Britain’s inhabitants save a few in the remote highlands, +the far north, and the distant islands not yet fully touched by +food-production. The “personality of Britain” was being formed. + + +CREMATION BURIALS BEGIN + +Along with people of certain religious faiths, archeologists are +against cremation (for other people!). Individuals to be cremated seem +in past times to have been dressed in their trappings and put upon a +large pyre: it takes a lot of wood and a very hot fire for a thorough +cremation. When the burning had been completed, the few fragile scraps +of bone and such odd beads of stone or other rare items as had resisted +the great heat seem to have been whisked into a pot and the pot buried. +The archeologist is left with the pot and the unsatisfactory scraps in +it. + +Tentatively, after about 1400 B.C. and almost completely over the whole +island by 1200 B.C., Britain became the scene of cremation burials +in urns. We know very little of the people themselves. None of their +settlements have been identified, although there is evidence that they +grew barley and made enclosures for cattle. The urns used for the +burials seem to have antecedents in the pottery of the Food-vessel +folk, and there are some other links with earlier British traditions. +In Lancashire, a wooden circle seems to have been built about a grave +with cremated burials in urns. Even occasional instances of cremation +may be noticed earlier in Britain, and it is not clear what, if any, +connection the British cremation burials in urns have with the classic +_Urnfields_ which were now beginning in the east Mediterranean and +which we shall mention below. + +The British cremation-burial-in-urns folk survived a long time in the +highland zone. In the general British scheme, they make up what is +called the “Middle Bronze Age,” but in the highland zone they last +until after 900 B.C. and are considered to be a specialized highland +“Late Bronze Age.” In the highland zone, these later cremation-burial +folk seem to have continued the older Food-vessel tradition of being +middlemen in the metal market. + +Granting that our knowledge of this phase of British prehistory is +very restricted because the cremations have left so little for the +archeologist, it does not appear that the cremation-burial-urn folk can +be sharply set off from their immediate predecessors. But change on a +grander scale was on the way. + + +REVERBERATIONS FROM CENTRAL EUROPE + +In the centuries immediately following 1000 B.C., we see with fair +clarity two phases of a cultural process which must have been going +on for some time. Certainly several of the invasions we have already +described in this chapter were due to earlier phases of the same +cultural process, but we could not see the details. + +[Illustration: SLASHING SWORD] + +Around 1200 B.C. central Europe was upset by the spread of the +so-called Urnfield folk, who practiced cremation burial in urns and +whom we also know to have been possessors of long, slashing swords and +the horse. I told you above that we have no idea that the Urnfield +folk proper were in any way connected with the people who made +cremation-burial-urn cemeteries a century or so earlier in Britain. It +has been supposed that the Urnfield folk themselves may have shared +ideas with the people who sacked Troy. We know that the Urnfield +pressure from central Europe displaced other people in northern France, +and perhaps in northwestern Germany, and that this reverberated into +Britain about 1000 B.C. + +Soon after 750 B.C., the same thing happened again. This time, the +pressure from central Europe came from the Hallstatt folk who were iron +tool makers: the reverberation brought people from the western Alpine +region across the Channel into Britain. + +At first it is possible to see the separate results of these folk +movements, but the developing cultures soon fused with each other and +with earlier British elements. Presently there were also strains of +other northern and western European pottery and traces of Urnfield +practices themselves which appeared in the finished British product. I +hope you will sense that I am vastly over-simplifying the details. + +The result seems to have been--among other things--a new kind of +agricultural system. The land was marked off by ditched divisions. +Rectangular fields imply the plow rather than hoe cultivation. We seem +to get a picture of estate or tribal boundaries which included village +communities; we find a variety of tools in bronze, and even whetstones +which show that iron has been honed on them (although the scarce iron +has not been found). Let me give you the picture in Professor S. +Piggott’s words: “The ... Late Bronze Age of southern England was but +the forerunner of the earliest Iron Age in the same region, not only in +the techniques of agriculture, but almost certainly in terms of ethnic +kinship ... we can with some assurance talk of the Celts ... the great +early Celtic expansion of the Continent is recognized to be that of the +Urnfield people.” + +Thus, certainly by 500 B.C., there were people in Britain, some of +whose descendants we may recognize today in name or language in remote +parts of Wales, Scotland, and the Hebrides. + + +THE COMING OF IRON + +Iron--once the know-how of reducing it from its ore in a very hot, +closed fire has been achieved--produces a far cheaper and much more +efficient set of tools than does bronze. Iron tools seem first to +have been made in quantity in Hittite Anatolia about 1500 B.C. In +continental Europe, the earliest, so-called Hallstatt, iron-using +cultures appeared in Germany soon after 750 B.C. Somewhat later, +Greek and especially Etruscan exports of _objets d’art_--which moved +with a flourishing trans-Alpine wine trade--influenced the Hallstatt +iron-working tradition. Still later new classical motifs, together with +older Hallstatt, oriental, and northern nomad motifs, gave rise to a +new style in metal decoration which characterizes the so-called La Tène +phase. + +A few iron users reached Britain a little before 400 B.C. Not long +after that, a number of allied groups appeared in southern and +southeastern England. They came over the Channel from France and must +have been Celts with dialects related to those already in England. A +second wave of Celts arrived from the Marne district in France about +250 B.C. Finally, in the second quarter of the first century B.C., +there were several groups of newcomers, some of whom were Belgae of +a mixed Teutonic-Celtic confederacy of tribes in northern France and +Belgium. The Belgae preceded the Romans by only a few years. + + +HILL-FORTS AND FARMS + +The earliest iron-users seem to have entrenched themselves temporarily +within hill-top forts, mainly in the south. Gradually, they moved +inland, establishing _individual_ farm sites with extensive systems +of rectangular fields. We recognize these fields by the “lynchets” or +lines of soil-creep which plowing left on the slopes of hills. New +crops appeared; there were now bread wheat, oats, and rye, as well as +barley. + +At Little Woodbury, near the town of Salisbury, a farmstead has been +rather completely excavated. The rustic buildings were within a +palisade, the round house itself was built of wood, and there were +various outbuildings and pits for the storage of grain. Weaving was +done on the farm, but not blacksmithing, which must have been a +specialized trade. Save for the lack of firearms, the place might +almost be taken for a farmstead on the American frontier in the early +1800’s. + +Toward 250 B.C. there seems to have been a hasty attempt to repair the +hill-forts and to build new ones, evidently in response to signs of +restlessness being shown by remote relatives in France. + + +THE SECOND PHASE + +Perhaps the hill-forts were not entirely effective or perhaps a +compromise was reached. In any case, the newcomers from the Marne +district did establish themselves, first in the southeast and then to +the north and west. They brought iron with decoration of the La Tène +type and also the two-wheeled chariot. Like the Wessex warriors of +over a thousand years earlier, they made “heroes’” graves, with their +warriors buried in the war-chariots and dressed in full trappings. + +[Illustration: CELTIC BUCKLE] + +The metal work of these Marnian newcomers is excellent. The peculiar +Celtic art style, based originally on the classic tendril motif, +is colorful and virile, and fits with Greek and Roman descriptions +of Celtic love of color in dress. There is a strong trace of these +newcomers northward in Yorkshire, linked by Ptolemy’s description to +the Parisii, doubtless part of the Celtic tribe which originally gave +its name to Paris on the Seine. Near Glastonbury, in Somerset, two +villages in swamps have been excavated. They seem to date toward the +middle of the first century B.C., which was a troubled time in Britain. +The circular houses were built on timber platforms surrounded with +palisades. The preservation of antiquities by the water-logged peat of +the swamp has yielded us a long catalogue of the materials of these +villagers. + +In Scotland, which yields its first iron tools at a date of about 100 +B.C., and in northern Ireland even slightly earlier, the effects of the +two phases of newcomers tend especially to blend. Hill-forts, “brochs” +(stone-built round towers) and a variety of other strange structures +seem to appear as the new ideas develop in the comparative isolation of +northern Britain. + + +THE THIRD PHASE + +For the time of about the middle of the first century B.C., we again +see traces of frantic hill-fort construction. This simple military +architecture now took some new forms. Its multiple ramparts must +reflect the use of slings as missiles, rather than spears. We probably +know the reason. In 56 B.C., Julius Caesar chastised the Veneti of +Brittany for outraging the dignity of Roman ambassadors. The Veneti +were famous slingers, and doubtless the reverberations of escaping +Veneti were felt across the Channel. The military architecture suggests +that some Veneti did escape to Britain. + +Also, through Caesar, we learn the names of newcomers who arrived in +two waves, about 75 B.C. and about 50 B.C. These were the Belgae. Now, +at last, we can even begin to speak of dynasties and individuals. +Some time before 55 B.C., the Catuvellauni, originally from the Marne +district in France, had possessed themselves of a large part of +southeastern England. They evidently sailed up the Thames and built a +town of over a hundred acres in area. Here ruled Cassivellaunus, “the +first man in England whose name we know,” and whose town Caesar sacked. +The town sprang up elsewhere again, however. + + +THE END OF PREHISTORY + +Prehistory, strictly speaking, is now over in southern Britain. +Claudius’ effective invasion took place in 43 A.D.; by 83 A.D., a raid +had been made as far north as Aberdeen in Scotland. But by 127 A.D., +Hadrian had completed his wall from the Solway to the Tyne, and the +Romans settled behind it. In Scotland, Romanization can have affected +the countryside very little. Professor Piggott adds that “... it is +when the pressure of Romanization is relaxed by the break-up of the +Dark Ages that we see again the Celtic metal-smiths handling their +material with the same consummate skill as they had before the Roman +Conquest, and with traditional styles that had not even then forgotten +their Marnian and Belgic heritage.” + +In fact, many centuries go by, in Britain as well as in the rest of +Europe, before the archeologist’s task is complete and the historian on +his own is able to describe the ways of men in the past. + + +BRITAIN AS A SAMPLE OF THE GENERAL COURSE OF PREHISTORY IN EUROPE + +In giving this very brief outline of the later prehistory of Britain, +you will have noticed how often I had to refer to the European +continent itself. Britain, beyond the English Channel for all of her +later prehistory, had a much simpler course of events than did most of +the rest of Europe in later prehistoric times. This holds, in spite +of all the “invasions” and “reverberations” from the continent. Most +of Europe was the scene of an even more complicated ebb and flow of +cultural change, save in some of its more remote mountain valleys and +peninsulas. + +The whole course of later prehistory in Europe is, in fact, so very +complicated that there is no single good book to cover it all; +certainly there is none in English. There are some good regional +accounts and some good general accounts of part of the range from about +3000 B.C. to A.D. 1. I suspect that the difficulty of making a good +book that covers all of its later prehistory is another aspect of what +makes Europe so very complicated a continent today. The prehistoric +foundations for Europe’s very complicated set of civilizations, +cultures, and sub-cultures--which begin to appear as history +proceeds--were in themselves very complicated. + +Hence, I selected the case of Britain as a single example of how +prehistory ends in Europe. It could have been more complicated than we +found it to be. Even in the subject matter on Britain in the chapter +before the last, we did not see direct traces of the effect on Britain +of the very important developments which took place in the Danubian +way from the Near East. Apparently Britain was not affected. Britain +received the impulses which brought copper, bronze, and iron tools from +an original east Mediterranean homeland into Europe, almost at the ends +of their journeys. But by the same token, they had had time en route to +take on their characteristic European aspects. + +Some time ago, Sir Cyril Fox wrote a famous book called _The +Personality of Britain_, sub-titled “Its Influence on Inhabitant and +Invader in Prehistoric and Early Historic Times.” We have not gone +into the post-Roman early historic period here; there are still the +Anglo-Saxons and Normans to account for as well as the effects of +the Romans. But what I have tried to do was to begin the story of +how the personality of Britain was formed. The principles that Fox +used, in trying to balance cultural and environmental factors and +interrelationships would not be greatly different for other lands. + + + + +Summary + +[Illustration] + + +In the pages you have read so far, you have been brought through the +earliest 99 per cent of the story of man’s life on this planet. I have +left only 1 per cent of the story for the historians to tell. + + +THE DRAMA OF THE PAST + +Men first became men when evolution had carried them to a certain +point. This was the point where the eye-hand-brain co-ordination was +good enough so that tools could be made. When tools began to be made +according to sets of lasting habits, we know that men had appeared. +This happened over a half million years ago. The stage for the play +may have been as broad as all of Europe, Africa, and Asia. At least, +it seems unlikely that it was only one little region that saw the +beginning of the drama. + +Glaciers and different climates came and went, to change the settings. +But the play went on in the same first act for a very long time. The +men who were the players had simple roles. They had to feed themselves +and protect themselves as best they could. They did this by hunting, +catching, and finding food wherever they could, and by taking such +protection as caves, fire, and their simple tools would give them. +Before the first act was over, the last of the glaciers was melting +away, and the players had added the New World to their stage. If +we want a special name for the first act, we could call it _The +Food-Gatherers_. + +There were not many climaxes in the first act, so far as we can see. +But I think there may have been a few. Certainly the pace of the +first act accelerated with the swing from simple gathering to more +intensified collecting. The great cave art of France and Spain was +probably an expression of a climax. Even the ideas of burying the dead +and of the “Venus” figurines must also point to levels of human thought +and activity that were over and above pure food-getting. + + +THE SECOND ACT + +The second act began only about ten thousand years ago. A few of the +players started it by themselves near the center of the Old World part +of the stage, in the Near East. It began as a plant and animal act, but +it soon became much more complicated. + +But the players in this one part of the stage--in the Near East--were +not the only ones to start off on the second act by themselves. Other +players, possibly in several places in the Far East, and certainly in +the New World, also started second acts that began as plant and animal +acts, and then became complicated. We can call the whole second act +_The Food-Producers_. + + +THE FIRST GREAT CLIMAX OF THE SECOND ACT + +In the Near East, the first marked climax of the second act happened +in Mesopotamia and Egypt. The play and the players reached that great +climax that we call civilization. This seems to have come less than +five thousand years after the second act began. But it could never have +happened in the first act at all. + +There is another curious thing about the first act. Many of the players +didn’t know it was over and they kept on with their roles long after +the second act had begun. On the edges of the stage there are today +some players who are still going on with the first act. The Eskimos, +and the native Australians, and certain tribes in the Amazon jungle are +some of these players. They seem perfectly happy to keep on with the +first act. + +The second act moved from climax to climax. The civilizations of +Mesopotamia and Egypt were only the earliest of these climaxes. The +players to the west caught the spirit of the thing, and climaxes +followed there. So also did climaxes come in the Far Eastern and New +World portions of the stage. + +The greater part of the second act should really be described to you +by a historian. Although it was a very short act when compared to the +first one, the climaxes complicate it a great deal. I, a prehistorian, +have told you about only the first act, and the very beginning of the +second. + + +THE THIRD ACT + +Also, as a prehistorian I probably should not even mention the third +act--it began so recently. The third act is _The Industrialization_. +It is the one in which we ourselves are players. If the pace of the +second act was so much faster than that of the first, the pace of the +third act is terrific. The danger is that it may wear down the players +completely. + +What sort of climaxes will the third act have, and are we already in +one? You have seen by now that the acts of my play are given in terms +of modes or basic patterns of human economy--ways in which people +get food and protection and safety. The climaxes involve more than +human economy. Economics and technological factors may be part of the +climaxes, but they are not all. The climaxes may be revolutions in +their own way, intellectual and social revolutions if you like. + +If the third act follows the pattern of the second act, a climax should +come soon after the act begins. We may be due for one soon if we are +not already in it. Remember the terrific pace of this third act. + + +WHY BOTHER WITH PREHISTORY? + +Why do we bother about prehistory? The main reason is that we think it +may point to useful ideas for the present. We are in the troublesome +beginnings of the third act of the play. The beginnings of the second +act may have lessons for us and give depth to our thinking. I know +there are at least _some_ lessons, even in the present incomplete +state of our knowledge. The players who began the second act--that of +food-production--separately, in different parts of the world, were not +all of one “pure race” nor did they have “pure” cultural traditions. +Some apparently quite mixed Mediterraneans got off to the first start +on the second act and brought it to its first two climaxes as well. +Peoples of quite different physical type achieved the first climaxes in +China and in the New World. + +In our British example of how the late prehistory of Europe worked, we +listed a continuous series of “invasions” and “reverberations.” After +each of these came fusion. Even though the Channel protected Britain +from some of the extreme complications of the mixture and fusion of +continental Europe, you can see how silly it would be to refer to a +“pure” British race or a “pure” British culture. We speak of the United +States as a “melting pot.” But this is nothing new. Actually, Britain +and all the rest of the world have been “melting pots” at one time or +another. + +By the time the written records of Mesopotamia and Egypt begin to turn +up in number, the climaxes there are well under way. To understand the +beginnings of the climaxes, and the real beginnings of the second act +itself, we are thrown back on prehistoric archeology. And this is as +true for China, India, Middle America, and the Andes, as it is for the +Near East. + +There are lessons to be learned from all of man’s past, not simply +lessons of how to fight battles or win peace conferences, but of how +human society evolves from one stage to another. Many of these lessons +can only be looked for in the prehistoric past. So far, we have only +made a beginning. There is much still to do, and many gaps in the story +are yet to be filled. The prehistorian’s job is to find the evidence, +to fill the gaps, and to discover the lessons men have learned in the +past. As I see it, this is not only an exciting but a very practical +goal for which to strive. + + + + +List of Books + + +BOOKS OF GENERAL INTEREST + +(Chosen from a variety of the increasingly useful list of cheap +paperbound books.) + + Childe, V. Gordon + _What Happened in History._ 1954. Penguin. + _Man Makes Himself._ 1955. Mentor. + _The Prehistory of European Society._ 1958. Penguin. + + Dunn, L. C., and Dobzhansky, Th. + _Heredity, Race, and Society._ 1952. Mentor. + + Frankfort, Henri, Frankfort, H. A., Jacobsen, Thorkild, and Wilson, + John A. + _Before Philosophy._ 1954. Penguin. + + Simpson, George G. + _The Meaning of Evolution._ 1955. Mentor. + + Wheeler, Sir Mortimer + _Archaeology from the Earth._ 1956. Penguin. + + +GEOCHRONOLOGY AND THE ICE AGE + +(Two general books. Some Pleistocene geologists disagree with Zeuner’s +interpretation of the dating evidence, but their points of view appear +in professional journals, in articles too cumbersome to list here.) + + Flint, R. F. + _Glacial Geology and the Pleistocene Epoch._ 1947. John Wiley + and Sons. + + Zeuner, F. E. + _Dating the Past._ 1952 (3rd ed.). Methuen and Co. + + +FOSSIL MEN AND RACE + +(The points of view of physical anthropologists and human +paleontologists are changing very quickly. Two of the different points +of view are listed here.) + + Clark, W. E. Le Gros + _History of the Primates._ 1956 (5th ed.). British Museum + (Natural History). (Also in Phoenix edition, 1957.) + + Howells, W. W. + _Mankind So Far._ 1944. Doubleday, Doran. + + +GENERAL ANTHROPOLOGY + +(These are standard texts not absolutely up to date in every detail, or +interpretative essays concerned with cultural change through time as +well as in space.) + + Kroeber, A. L. + _Anthropology._ 1948. Harcourt, Brace. + + Linton, Ralph + _The Tree of Culture._ 1955. Alfred A. Knopf, Inc. + + Redfield, Robert + _The Primitive World and Its Transformations._ 1953. Cornell + University Press. + + Steward, Julian H. + _Theory of Culture Change._ 1955. University of Illinois Press. + + White, Leslie + _The Science of Culture._ 1949. Farrar, Strauss. + + +GENERAL PREHISTORY + +(A sampling of the more useful and current standard works in English.) + + Childe, V. Gordon + _The Dawn of European Civilization._ 1957. Kegan Paul, Trench, + Trubner. + _Prehistoric Migrations in Europe._ 1950. Instituttet for + Sammenlignende Kulturforskning. + + Clark, Grahame + _Archaeology and Society._ 1957. Harvard University Press. + + Clark, J. G. D. + _Prehistoric Europe: The Economic Basis._ 1952. Methuen and Co. + + Garrod, D. A. E. + _Environment, Tools, and Man._ 1946. Cambridge University + Press. + + Movius, Hallam L., Jr. + “Old World Prehistory: Paleolithic” in _Anthropology Today_. + Kroeber, A. L., ed. 1953. University of Chicago Press. + + Oakley, Kenneth P. + _Man the Tool-Maker._ 1956. British Museum (Natural History). + (Also in Phoenix edition, 1957.) + + Piggott, Stuart + _British Prehistory._ 1949. Oxford University Press. + + Pittioni, Richard + _Die Urgeschichtlichen Grundlagen der Europäischen Kultur._ + 1949. Deuticke. (A single book which does attempt to cover the + whole range of European prehistory to ca. 1 A.D.) + + +THE NEAR EAST + + Adams, Robert M. + “Developmental Stages in Ancient Mesopotamia,” _in_ Steward, + Julian, _et al_, _Irrigation Civilizations: A Comparative + Study_. 1955. Pan American Union. + + Braidwood, Robert J. + _The Near East and the Foundations for Civilization._ 1952. + University of Oregon. + + Childe, V. Gordon + _New Light on the Most Ancient East._ 1952. Oriental Dept., + Routledge and Kegan Paul. + + Frankfort, Henri + _The Birth of Civilization in the Near East._ 1951. University + of Indiana Press. (Also in Anchor edition, 1956.) + + Pallis, Svend A. + _The Antiquity of Iraq._ 1956. Munksgaard. + + Wilson, John A. + _The Burden of Egypt._ 1951. University of Chicago Press. (Also + in Phoenix edition, called _The Culture of Ancient Egypt_, + 1956.) + + +HOW DIGGING IS DONE + + Braidwood, Linda + _Digging beyond the Tigris._ 1953. Schuman, New York. + + Wheeler, Sir Mortimer + _Archaeology from the Earth._ 1954. Oxford, London. + + + + +Index + + + Abbevillian, 48; + core-biface tool, 44, 48 + + Acheulean, 48, 60 + + Acheuleo-Levalloisian, 63 + + Acheuleo-Mousterian, 63 + + Adams, R. M., 106 + + Adzes, 45 + + Africa, east, 67, 89; + north, 70, 89; + south, 22, 25, 34, 40, 67 + + Agriculture, incipient, in England, 140; + in Near East, 123 + + Ain Hanech, 48 + + Amber, taken from Baltic to Greece, 167 + + American Indians, 90, 142 + + Anatolia, used as route to Europe, 138 + + Animals, in caves, 54, 64; + in cave art, 85 + + Antevs, Ernst, 19 + + Anyathian, 47 + + Archeological interpretation, 8 + + Archeology, defined, 8 + + Architecture, at Jarmo, 128; + at Jericho, 133 + + Arrow, points, 94; + shaft straightener, 83 + + Art, in caves, 84; + East Spanish, 85; + figurines, 84; + Franco-Cantabrian, 84, 85; + movable (engravings, modeling, scratchings), 83; + painting, 83; + sculpture, 83 + + Asia, western, 67 + + Assemblage, defined, 13, 14; + European, 94; + Jarmo, 129; + Maglemosian, 94; + Natufian, 113 + + Aterian, industry, 67; + point, 89 + + Australopithecinae, 24 + + Australopithecine, 25, 26 + + Awls, 77 + + Axes, 62, 94 + + Ax-heads, 15 + + Azilian, 97 + + Aztecs, 145 + + + Baghouz, 152 + + Bakun, 134 + + Baltic sea, 93 + + Banana, 107 + + Barley, wild, 108 + + Barrow, 141 + + Battle-axe folk, 164; + assemblage, 164 + + Beads, 80; + bone, 114 + + Beaker folk, 164; + assemblage, 164-165 + + Bear, in cave art, 85; + cult, 68 + + Belgium, 94 + + Belt cave, 126 + + Bering Strait, used as route to New World, 98 + + Bison, in cave art, 85 + + Blade, awl, 77; + backed, 75; + blade-core, 71; + end-scraper, 77; + stone, defined, 71; + strangulated (notched), 76; + tanged point, 76; + tools, 71, 75-80, 90; + tool tradition, 70 + + Boar, wild, in cave art, 85 + + Bogs, source of archeological materials, 94 + + Bolas, 54 + + Bordes, François, 62 + + Borer, 77 + + Boskop skull, 34 + + Boyd, William C., 35 + + Bracelets, 118 + + Brain, development of, 24 + + Breadfruit, 107 + + Breasted, James H., 107 + + Brick, at Jericho, 133 + + Britain, 94; + late prehistory, 163-175; + invaders, 173 + + Broch, 172 + + Buffalo, in China, 54; + killed by stampede, 86 + + Burials, 66, 86; + in “henges,” 164; + in urns, 168 + + Burins, 75 + + Burma, 90 + + Byblos, 134 + + + Camel, 54 + + Cannibalism, 55 + + Cattle, wild, 85, 112; + in cave art, 85; + domesticated, 15; + at Skara Brae, 142 + + Caucasoids, 34 + + Cave men, 29 + + Caves, 62; + art in, 84 + + Celts, 170 + + Chariot, 160 + + Chicken, domestication of, 107 + + Chiefs, in food-gathering groups, 68 + + Childe, V. Gordon, 8 + + China, 136 + + Choukoutien, 28, 35 + + Choukoutienian, 47 + + Civilization, beginnings, 144, 149, 157; + meaning of, 144 + + Clactonian, 45, 47 + + Clay, used in modeling, 128; + baked, used for tools, 153 + + Club-heads, 82, 94 + + Colonization, in America, 142; + in Europe, 142 + + Combe Capelle, 30 + + Combe Capelle-Brünn group, 34 + + Commont, Victor, 51 + + Coon, Carlton S., 73 + + Copper, 134 + + Corn, in America, 145 + + Corrals for cattle, 140 + + “Cradle of mankind,” 136 + + Cremation, 167 + + Crete, 162 + + Cro-Magnon, 30, 34 + + Cultivation, incipient, 105, 109, 111 + + Culture, change, 99; + characteristics, defined, 38, 49; + prehistoric, 39 + + + Danube Valley, used as route from Asia, 138 + + Dates, 153 + + Deer, 54, 96 + + Dog, domesticated, 96 + + Domestication, of animals, 100, 105, 107; + of plants, 100 + + “Dragon teeth” fossils in China, 28 + + Drill, 77 + + Dubois, Eugene, 26 + + + Early Dynastic Period, Mesopotamia, 147 + + East Spanish art, 72, 85 + + Egypt, 70, 126 + + Ehringsdorf, 31 + + Elephant, 54 + + Emiliani, Cesare, 18 + + Emiran flake point, 73 + + England, 163-168; + prehistoric, 19, 40; + farmers in, 140 + + Eoanthropus dawsoni, 29 + + Eoliths, 41 + + Erich, 152 + + Eridu, 152 + + Euphrates River, floods in, 148 + + Europe, cave dwellings, 58; + at end of Ice Age, 93; + early farmers, 140; + glaciers in, 40; + huts in, 86; + routes into, 137-140; + spread of food-production to, 136 + + + Far East, 69, 90 + + Farmers, 103 + + Fauresmith industry, 67 + + Fayum, 135; + radiocarbon date, 146 + + “Fertile Crescent,” 107, 146 + + Figurines, “Venus,” 84; + at Jarmo, 128; + at Ubaid, 153 + + Fire, used by Peking man, 54 + + First Dynasty, Egypt, 147 + + Fish-hooks, 80, 94 + + Fishing, 80; + by food-producers, 122 + + Fish-lines, 80 + + Fish spears, 94 + + Flint industry, 127 + + Fontéchevade, 32, 56, 58 + + Food-collecting, 104, 121; + end of, 104 + + Food-gatherers, 53, 176 + + Food-gathering, 99, 104; + in Old World, 104; + stages of, 104 + + Food-producers, 176 + + Food-producing economy, 122; + in America, 145; + in Asia, 105 + + Food-producing revolution, 99, 105; + causes of, 101; + preconditions for, 100 + + Food-production, beginnings of, 99; + carried to Europe, 110 + + Food-vessel folk, 164 + + “Forest folk,” 97, 98, 104, 110 + + Fox, Sir Cyril, 174 + + France, caves in, 56 + + + Galley Hill (fossil type), 29 + + Garrod, D. A., 73 + + Gazelle, 114 + + Germany, 94 + + Ghassul, 156 + + Glaciers, 18, 30; + destruction by, 40 + + Goat, wild, 108; + domesticated, 128 + + Grain, first planted, 20 + + Graves, passage, 141; + gallery, 141 + + Greece, civilization in, 163; + as route to western Europe, 138; + towns in, 162 + + Grimaldi skeletons, 34 + + + Hackberry seeds used as food, 55 + + Halaf, 151; + assemblage, 151 + + Hallstatt, tradition, 169 + + Hand, development of, 24, 25 + + Hand adzes, 46 + + Hand axes, 44 + + Harpoons, antler, 83, 94; + bone, 82, 94 + + Hassuna, 131; + assemblage, 131, 132 + + Heidelberg, fossil type, 28 + + Hill-forts, in England, 171; + in Scotland, 172 + + Hilly flanks of Near East, 107, 108, 125, 131, 146, 147 + + History, beginning of, 7, 17 + + Hoes, 112 + + Holland, 164 + + Homo sapiens, 32 + + Hooton, E. A., 34 + + Horse, 112; + wild, in cave art, 85; + in China, 54 + + Hotu cave, 126 + + Houses, 122; + at Jarmo, 128; + at Halaf, 151 + + Howe, Bruce, 116 + + Howell, F. Clark, 30 + + Hunting, 93 + + + Ice Age, in Asia, 99; + beginning of, 18; + glaciers in, 41; + last glaciation, 93 + + Incas, 145 + + India, 90, 136 + + Industrialization, 178 + + Industry, blade-tool, 88; + defined, 58; + ground stone, 94 + + Internationalism, 162 + + Iran, 107, 147 + + Iraq, 107, 124, 127, 136, 147 + + Iron, introduction of, 170 + + Irrigation, 123, 149, 155 + + Italy, 138 + + + Jacobsen, T. J., 157 + + Jarmo, 109, 126, 128, 130; + assemblage, 129 + + Java, 23, 29 + + Java man, 26, 27, 29 + + Jefferson, Thomas, 11 + + Jericho, 119, 133 + + Judaidah, 134 + + + Kafuan, 48 + + Kanam, 23, 36 + + Karim Shahir, 116-119, 124; + assemblage, 116, 117 + + Keith, Sir Arthur, 33 + + Kelley, Harper, 51 + + Kharga, 126 + + Khartoum, 136 + + Knives, 80 + + Krogman, W. M., 3, 25 + + + Lamps, 85 + + Land bridges in Mediterranean, 19 + + La Tène phase, 170 + + Laurel leaf point, 78, 89 + + Leakey, L. S. B., 40 + + Le Moustier, 57 + + Levalloisian, 47, 61, 62 + + Levalloiso-Mousterian, 47, 63 + + Little Woodbury, 170 + + + Magic, used by hunters, 123 + + Maglemosian, assemblage, 94, 95; + folk, 98 + + Makapan, 40 + + Mammoth, 93; + in cave art, 85 + + “Man-apes,” 26 + + Mango, 107 + + Mankind, age, 17 + + Maringer, J., 45 + + Markets, 155 + + Marston, A. T., 11 + + Mathiassen, T., 97 + + McCown, T. D., 33 + + Meganthropus, 26, 27, 36 + + Men, defined, 25; + modern, 32 + + Merimde, 135 + + Mersin, 133 + + Metal-workers, 160, 163, 167, 172 + + Micoquian, 48, 60 + + Microliths, 87; + at Jarmo, 130; + “lunates,” 87; + trapezoids, 87; + triangles, 87 + + Minerals used as coloring matter, 66 + + Mine-shafts, 140 + + M’lefaat, 126, 127 + + Mongoloids, 29, 90 + + Mortars, 114, 118, 127 + + Mounds, how formed, 12 + + Mount Carmel, 11, 33, 52, 59, 64, 69, 113, 114 + + “Mousterian man,” 64 + + “Mousterian” tools, 61, 62; + of Acheulean tradition, 62 + + Movius, H. L., 47 + + + Natufian, animals in, 114; + assemblage, 113, 114, 115; + burials, 114; + date of, 113 + + Neanderthal man, 29, 30, 31, 56 + + Near East, beginnings of civilization in, 20, 144; + cave sites, 58; + climate in Ice Age, 99; + “Fertile Crescent,” 107, 146; + food-production in, 99; + Natufian assemblage in, 113-115; + stone tools, 114 + + Needles, 80 + + Negroid, 34 + + New World, 90 + + Nile River valley, 102, 134; + floods in, 148 + + Nuclear area, 106, 110; + in Near East, 107 + + + Obsidian, used for blade tools, 71; + at Jarmo, 130 + + Ochre, red, with burials, 86 + + Oldowan, 48 + + Old World, 67, 70, 90; + continental phases in, 18 + + Olorgesailie, 40, 51 + + Ostrich, in China, 54 + + Ovens, 128 + + Oxygen isotopes, 18 + + + Paintings in caves, 83 + + Paleoanthropic man, 50 + + Palestine, burials, 56; + cave sites, 52; + types of man, 69 + + Parpallo, 89 + + Patjitanian, 45, 47 + + Pebble tools, 42 + + Peking cave, 54; + animals in, 54 + + Peking man, 27, 28, 29, 54, 58 + + Pendants, 80; + bone, 114 + + Pestle, 114 + + Peterborough, 141; + assemblage, 141 + + Pictographic signs, 158 + + Pig, wild, 108 + + “Piltdown man,” 29 + + Pins, 80 + + Pithecanthropus, 26, 27, 30, 36 + + Pleistocene, 18, 25 + + Plows developed, 123 + + Points, arrow, 76; + laurel leaf, 78; + shouldered, 78, 79; + split-based bone, 80, 82; + tanged, 76; + willow leaf, 78 + + Potatoes, in America, 145 + + Pottery, 122, 130, 156; + decorated, 142; + painted, 131, 151, 152; + Susa style, 156; + in tombs, 141 + + Prehistory, defined, 7; + range of, 18 + + Pre-neanderthaloids, 30, 31, 37 + + Pre-Solutrean point, 89 + + Pre-Stellenbosch, 48 + + Proto-Literate assemblage, 157-160 + + + Race, 35; + biological, 36; + “pure,” 16 + + Radioactivity, 9, 10 + + Radioactive carbon dates, 18, 92, 120, 130, 135, 156 + + Redfield, Robert, 38, 49 + + Reed, C. A., 128 + + Reindeer, 94 + + Rhinoceros, 93; + in cave art, 85 + + Rhodesian man, 32 + + Riss glaciation, 58 + + Rock-shelters, 58; + art in, 85 + + + Saccopastore, 31 + + Sahara Desert, 34, 102 + + Samarra, 152; + pottery, 131, 152 + + Sangoan industry, 67 + + Sauer, Carl, 136 + + Sbaikian point, 89 + + Schliemann, H., 11, 12 + + Scotland, 171 + + Scraper, flake, 79; + end-scraper on blade, 77, 78; + keel-shaped, 79, 80, 81 + + Sculpture in caves, 83 + + Sebilian III, 126 + + Shaheinab, 135 + + Sheep, wild, 108; + at Skara Brae, 142; + in China, 54 + + Shellfish, 142 + + Ship, Ubaidian, 153 + + Sialk, 126, 134; + assemblage, 134 + + Siberia, 88; + pathway to New World, 98 + + Sickle, 112, 153; + blade, 113, 130 + + Silo, 122 + + Sinanthropus, 27, 30, 35 + + Skara Brae, 142 + + Snails used as food, 128 + + Soan, 47 + + Solecki, R., 116 + + Solo (fossil type), 29, 32 + + Solutrean industry, 77 + + Spear, shaft, 78; + thrower, 82, 83 + + Speech, development of organs of, 25 + + Squash, in America, 145 + + Steinheim fossil skull, 28 + + Stillbay industry, 67 + + Stonehenge, 166 + + Stratification, in caves, 12, 57; + in sites, 12 + + Swanscombe (fossil type), 11, 28 + + Syria, 107 + + + Tabun, 60, 71 + + Tardenoisian, 97 + + Taro, 107 + + Tasa, 135 + + Tayacian, 47, 59 + + Teeth, pierced, in beads and pendants, 114 + + Temples, 123, 155 + + Tepe Gawra, 156 + + Ternafine, 29 + + Teshik Tash, 69 + + Textiles, 122 + + Thong-stropper, 80 + + Tigris River, floods in, 148 + + Toggle, 80 + + Tomatoes, in America, 145 + + Tombs, megalithic, 141 + + Tool-making, 42, 49 + + Tool-preparation traditions, 65 + + Tools, 62; + antler, 80; + blade, 70, 71, 75; + bone, 66; + chopper, 47; + core-biface, 43, 48, 60, 61; + flake, 44, 47, 51, 60, 64; + flint, 80, 127; + ground stone, 68, 127; + handles, 94; + pebble, 42, 43, 48, 53; + use of, 24 + + Touf (mud wall), 128 + + Toynbee, A. J., 101 + + Trade, 130, 155, 162 + + Traders, 167 + + Traditions, 15; + blade tool, 70; + definition of, 51; + interpretation of, 49; + tool-making, 42, 48; + chopper-tool, 47; + chopper-chopping tool, 45; + core-biface, 43, 48; + flake, 44, 47; + pebble tool, 42, 48 + + Tool-making, prehistory of, 42 + + Turkey, 107, 108 + + + Ubaid, 153; + assemblage, 153-155 + + Urnfields, 168, 169 + + + Village-farming community era, 105, 119 + + + Wad B, 72 + + Wadjak, 34 + + Warka phase, 156; + assemblage, 156 + + Washburn, Sherwood L., 36 + + Water buffalo, domestication of, 107 + + Weidenreich, F., 29, 34 + + Wessex, 166, 167 + + Wheat, wild, 108; + partially domesticated, 127 + + Willow leaf point, 78 + + Windmill Hill, 138; + assemblage, 138, 140 + + Witch doctors, 68 + + Wool, 112; + in garments, 167 + + Writing, 158; + cuneiform, 158 + + Würm I glaciation, 58 + + + Zebu cattle, domestication of, 107 + + Zeuner, F. E., 73 + + + + + * * * * * * + + + + +Transcriber’s note: + +Punctuation, hyphenation, and spelling were made consistent when a +predominant preference was found in this book; otherwise they were not +changed. + +Simple typographical errors were corrected; occasional unbalanced +quotation marks retained. + +Ambiguous hyphens at the ends of lines were retained. + +Index not checked for proper alphabetization or correct page references. + +In the original book, chapter headings were accompanied by +illustrations, sometimes above, sometimes below, and sometimes +adjacent. In this eBook those ilustrations always appear below the +headings. + + + +***END OF THE PROJECT GUTENBERG EBOOK PREHISTORIC MEN*** + + +******* This file should be named 52664-0.txt or 52664-0.zip ******* + + +This and all associated files of various formats will be found in: +http://www.gutenberg.org/dirs/5/2/6/6/52664 + + +Updated editions will replace the previous one--the old editions will +be renamed. + +Creating the works from print editions not protected by U.S. copyright +law means that no one owns a United States copyright in these works, +so the Foundation (and you!) can copy and distribute it in the United +States without permission and without paying copyright +royalties. Special rules, set forth in the General Terms of Use part +of this license, apply to copying and distributing Project +Gutenberg-tm electronic works to protect the PROJECT GUTENBERG-tm +concept and trademark. Project Gutenberg is a registered trademark, +and may not be used if you charge for the eBooks, unless you receive +specific permission. If you do not charge anything for copies of this +eBook, complying with the rules is very easy. You may use this eBook +for nearly any purpose such as creation of derivative works, reports, +performances and research. They may be modified and printed and given +away--you may do practically ANYTHING in the United States with eBooks +not protected by U.S. copyright law. Redistribution is subject to the +trademark license, especially commercial redistribution. + +START: FULL LICENSE + +THE FULL PROJECT GUTENBERG LICENSE +PLEASE READ THIS BEFORE YOU DISTRIBUTE OR USE THIS WORK + +To protect the Project Gutenberg-tm mission of promoting the free +distribution of electronic works, by using or distributing this work +(or any other work associated in any way with the phrase "Project +Gutenberg"), you agree to comply with all the terms of the Full +Project Gutenberg-tm License available with this file or online at +www.gutenberg.org/license. + +Section 1. General Terms of Use and Redistributing Project +Gutenberg-tm electronic works + +1.A. By reading or using any part of this Project Gutenberg-tm +electronic work, you indicate that you have read, understand, agree to +and accept all the terms of this license and intellectual property +(trademark/copyright) agreement. If you do not agree to abide by all +the terms of this agreement, you must cease using and return or +destroy all copies of Project Gutenberg-tm electronic works in your +possession. If you paid a fee for obtaining a copy of or access to a +Project Gutenberg-tm electronic work and you do not agree to be bound +by the terms of this agreement, you may obtain a refund from the +person or entity to whom you paid the fee as set forth in paragraph +1.E.8. + +1.B. "Project Gutenberg" is a registered trademark. It may only be +used on or associated in any way with an electronic work by people who +agree to be bound by the terms of this agreement. There are a few +things that you can do with most Project Gutenberg-tm electronic works +even without complying with the full terms of this agreement. See +paragraph 1.C below. There are a lot of things you can do with Project +Gutenberg-tm electronic works if you follow the terms of this +agreement and help preserve free future access to Project Gutenberg-tm +electronic works. See paragraph 1.E below. + +1.C. The Project Gutenberg Literary Archive Foundation ("the +Foundation" or PGLAF), owns a compilation copyright in the collection +of Project Gutenberg-tm electronic works. Nearly all the individual +works in the collection are in the public domain in the United +States. If an individual work is unprotected by copyright law in the +United States and you are located in the United States, we do not +claim a right to prevent you from copying, distributing, performing, +displaying or creating derivative works based on the work as long as +all references to Project Gutenberg are removed. Of course, we hope +that you will support the Project Gutenberg-tm mission of promoting +free access to electronic works by freely sharing Project Gutenberg-tm +works in compliance with the terms of this agreement for keeping the +Project Gutenberg-tm name associated with the work. You can easily +comply with the terms of this agreement by keeping this work in the +same format with its attached full Project Gutenberg-tm License when +you share it without charge with others. + +1.D. The copyright laws of the place where you are located also govern +what you can do with this work. Copyright laws in most countries are +in a constant state of change. If you are outside the United States, +check the laws of your country in addition to the terms of this +agreement before downloading, copying, displaying, performing, +distributing or creating derivative works based on this work or any +other Project Gutenberg-tm work. The Foundation makes no +representations concerning the copyright status of any work in any +country outside the United States. + +1.E. Unless you have removed all references to Project Gutenberg: + +1.E.1. The following sentence, with active links to, or other +immediate access to, the full Project Gutenberg-tm License must appear +prominently whenever any copy of a Project Gutenberg-tm work (any work +on which the phrase "Project Gutenberg" appears, or with which the +phrase "Project Gutenberg" is associated) is accessed, displayed, +performed, viewed, copied or distributed: + + This eBook is for the use of anyone anywhere in the United States and + most other parts of the world at no cost and with almost no + restrictions whatsoever. You may copy it, give it away or re-use it + under the terms of the Project Gutenberg License included with this + eBook or online at www.gutenberg.org. If you are not located in the + United States, you'll have to check the laws of the country where you + are located before using this ebook. + +1.E.2. If an individual Project Gutenberg-tm electronic work is +derived from texts not protected by U.S. copyright law (does not +contain a notice indicating that it is posted with permission of the +copyright holder), the work can be copied and distributed to anyone in +the United States without paying any fees or charges. If you are +redistributing or providing access to a work with the phrase "Project +Gutenberg" associated with or appearing on the work, you must comply +either with the requirements of paragraphs 1.E.1 through 1.E.7 or +obtain permission for the use of the work and the Project Gutenberg-tm +trademark as set forth in paragraphs 1.E.8 or 1.E.9. + +1.E.3. If an individual Project Gutenberg-tm electronic work is posted +with the permission of the copyright holder, your use and distribution +must comply with both paragraphs 1.E.1 through 1.E.7 and any +additional terms imposed by the copyright holder. Additional terms +will be linked to the Project Gutenberg-tm License for all works +posted with the permission of the copyright holder found at the +beginning of this work. + +1.E.4. Do not unlink or detach or remove the full Project Gutenberg-tm +License terms from this work, or any files containing a part of this +work or any other work associated with Project Gutenberg-tm. + +1.E.5. Do not copy, display, perform, distribute or redistribute this +electronic work, or any part of this electronic work, without +prominently displaying the sentence set forth in paragraph 1.E.1 with +active links or immediate access to the full terms of the Project +Gutenberg-tm License. + +1.E.6. You may convert to and distribute this work in any binary, +compressed, marked up, nonproprietary or proprietary form, including +any word processing or hypertext form. However, if you provide access +to or distribute copies of a Project Gutenberg-tm work in a format +other than "Plain Vanilla ASCII" or other format used in the official +version posted on the official Project Gutenberg-tm web site +(www.gutenberg.org), you must, at no additional cost, fee or expense +to the user, provide a copy, a means of exporting a copy, or a means +of obtaining a copy upon request, of the work in its original "Plain +Vanilla ASCII" or other form. Any alternate format must include the +full Project Gutenberg-tm License as specified in paragraph 1.E.1. + +1.E.7. Do not charge a fee for access to, viewing, displaying, +performing, copying or distributing any Project Gutenberg-tm works +unless you comply with paragraph 1.E.8 or 1.E.9. + +1.E.8. You may charge a reasonable fee for copies of or providing +access to or distributing Project Gutenberg-tm electronic works +provided that + +* You pay a royalty fee of 20% of the gross profits you derive from + the use of Project Gutenberg-tm works calculated using the method + you already use to calculate your applicable taxes. The fee is owed + to the owner of the Project Gutenberg-tm trademark, but he has + agreed to donate royalties under this paragraph to the Project + Gutenberg Literary Archive Foundation. Royalty payments must be paid + within 60 days following each date on which you prepare (or are + legally required to prepare) your periodic tax returns. Royalty + payments should be clearly marked as such and sent to the Project + Gutenberg Literary Archive Foundation at the address specified in + Section 4, "Information about donations to the Project Gutenberg + Literary Archive Foundation." + +* You provide a full refund of any money paid by a user who notifies + you in writing (or by e-mail) within 30 days of receipt that s/he + does not agree to the terms of the full Project Gutenberg-tm + License. You must require such a user to return or destroy all + copies of the works possessed in a physical medium and discontinue + all use of and all access to other copies of Project Gutenberg-tm + works. + +* You provide, in accordance with paragraph 1.F.3, a full refund of + any money paid for a work or a replacement copy, if a defect in the + electronic work is discovered and reported to you within 90 days of + receipt of the work. + +* You comply with all other terms of this agreement for free + distribution of Project Gutenberg-tm works. + +1.E.9. If you wish to charge a fee or distribute a Project +Gutenberg-tm electronic work or group of works on different terms than +are set forth in this agreement, you must obtain permission in writing +from both the Project Gutenberg Literary Archive Foundation and The +Project Gutenberg Trademark LLC, the owner of the Project Gutenberg-tm +trademark. Contact the Foundation as set forth in Section 3 below. + +1.F. + +1.F.1. Project Gutenberg volunteers and employees expend considerable +effort to identify, do copyright research on, transcribe and proofread +works not protected by U.S. copyright law in creating the Project +Gutenberg-tm collection. Despite these efforts, Project Gutenberg-tm +electronic works, and the medium on which they may be stored, may +contain "Defects," such as, but not limited to, incomplete, inaccurate +or corrupt data, transcription errors, a copyright or other +intellectual property infringement, a defective or damaged disk or +other medium, a computer virus, or computer codes that damage or +cannot be read by your equipment. + +1.F.2. LIMITED WARRANTY, DISCLAIMER OF DAMAGES - Except for the "Right +of Replacement or Refund" described in paragraph 1.F.3, the Project +Gutenberg Literary Archive Foundation, the owner of the Project +Gutenberg-tm trademark, and any other party distributing a Project +Gutenberg-tm electronic work under this agreement, disclaim all +liability to you for damages, costs and expenses, including legal +fees. YOU AGREE THAT YOU HAVE NO REMEDIES FOR NEGLIGENCE, STRICT +LIABILITY, BREACH OF WARRANTY OR BREACH OF CONTRACT EXCEPT THOSE +PROVIDED IN PARAGRAPH 1.F.3. YOU AGREE THAT THE FOUNDATION, THE +TRADEMARK OWNER, AND ANY DISTRIBUTOR UNDER THIS AGREEMENT WILL NOT BE +LIABLE TO YOU FOR ACTUAL, DIRECT, INDIRECT, CONSEQUENTIAL, PUNITIVE OR +INCIDENTAL DAMAGES EVEN IF YOU GIVE NOTICE OF THE POSSIBILITY OF SUCH +DAMAGE. + +1.F.3. LIMITED RIGHT OF REPLACEMENT OR REFUND - If you discover a +defect in this electronic work within 90 days of receiving it, you can +receive a refund of the money (if any) you paid for it by sending a +written explanation to the person you received the work from. If you +received the work on a physical medium, you must return the medium +with your written explanation. The person or entity that provided you +with the defective work may elect to provide a replacement copy in +lieu of a refund. If you received the work electronically, the person +or entity providing it to you may choose to give you a second +opportunity to receive the work electronically in lieu of a refund. If +the second copy is also defective, you may demand a refund in writing +without further opportunities to fix the problem. + +1.F.4. Except for the limited right of replacement or refund set forth +in paragraph 1.F.3, this work is provided to you 'AS-IS', WITH NO +OTHER WARRANTIES OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT +LIMITED TO WARRANTIES OF MERCHANTABILITY OR FITNESS FOR ANY PURPOSE. + +1.F.5. Some states do not allow disclaimers of certain implied +warranties or the exclusion or limitation of certain types of +damages. If any disclaimer or limitation set forth in this agreement +violates the law of the state applicable to this agreement, the +agreement shall be interpreted to make the maximum disclaimer or +limitation permitted by the applicable state law. The invalidity or +unenforceability of any provision of this agreement shall not void the +remaining provisions. + +1.F.6. INDEMNITY - You agree to indemnify and hold the Foundation, the +trademark owner, any agent or employee of the Foundation, anyone +providing copies of Project Gutenberg-tm electronic works in +accordance with this agreement, and any volunteers associated with the +production, promotion and distribution of Project Gutenberg-tm +electronic works, harmless from all liability, costs and expenses, +including legal fees, that arise directly or indirectly from any of +the following which you do or cause to occur: (a) distribution of this +or any Project Gutenberg-tm work, (b) alteration, modification, or +additions or deletions to any Project Gutenberg-tm work, and (c) any +Defect you cause. + +Section 2. Information about the Mission of Project Gutenberg-tm + +Project Gutenberg-tm is synonymous with the free distribution of +electronic works in formats readable by the widest variety of +computers including obsolete, old, middle-aged and new computers. It +exists because of the efforts of hundreds of volunteers and donations +from people in all walks of life. + +Volunteers and financial support to provide volunteers with the +assistance they need are critical to reaching Project Gutenberg-tm's +goals and ensuring that the Project Gutenberg-tm collection will +remain freely available for generations to come. In 2001, the Project +Gutenberg Literary Archive Foundation was created to provide a secure +and permanent future for Project Gutenberg-tm and future +generations. To learn more about the Project Gutenberg Literary +Archive Foundation and how your efforts and donations can help, see +Sections 3 and 4 and the Foundation information page at +www.gutenberg.org + +Section 3. Information about the Project Gutenberg Literary +Archive Foundation + +The Project Gutenberg Literary Archive Foundation is a non profit +501(c)(3) educational corporation organized under the laws of the +state of Mississippi and granted tax exempt status by the Internal +Revenue Service. The Foundation's EIN or federal tax identification +number is 64-6221541. Contributions to the Project Gutenberg Literary +Archive Foundation are tax deductible to the full extent permitted by +U.S. federal laws and your state's laws. + +The Foundation's principal office is in Fairbanks, Alaska, with the +mailing address: PO Box 750175, Fairbanks, AK 99775, but its +volunteers and employees are scattered throughout numerous +locations. Its business office is located at 809 North 1500 West, Salt +Lake City, UT 84116, (801) 596-1887. Email contact links and up to +date contact information can be found at the Foundation's web site and +official page at www.gutenberg.org/contact + +For additional contact information: + + Dr. Gregory B. Newby + Chief Executive and Director + gbnewby@pglaf.org + +Section 4. Information about Donations to the Project Gutenberg +Literary Archive Foundation + +Project Gutenberg-tm depends upon and cannot survive without wide +spread public support and donations to carry out its mission of +increasing the number of public domain and licensed works that can be +freely distributed in machine readable form accessible by the widest +array of equipment including outdated equipment. Many small donations +($1 to $5,000) are particularly important to maintaining tax exempt +status with the IRS. + +The Foundation is committed to complying with the laws regulating +charities and charitable donations in all 50 states of the United +States. Compliance requirements are not uniform and it takes a +considerable effort, much paperwork and many fees to meet and keep up +with these requirements. We do not solicit donations in locations +where we have not received written confirmation of compliance. To SEND +DONATIONS or determine the status of compliance for any particular +state visit www.gutenberg.org/donate + +While we cannot and do not solicit contributions from states where we +have not met the solicitation requirements, we know of no prohibition +against accepting unsolicited donations from donors in such states who +approach us with offers to donate. + +International donations are gratefully accepted, but we cannot make +any statements concerning tax treatment of donations received from +outside the United States. U.S. laws alone swamp our small staff. + +Please check the Project Gutenberg Web pages for current donation +methods and addresses. Donations are accepted in a number of other +ways including checks, online payments and credit card donations. To +donate, please visit: www.gutenberg.org/donate + +Section 5. General Information About Project Gutenberg-tm electronic works. + +Professor Michael S. Hart was the originator of the Project +Gutenberg-tm concept of a library of electronic works that could be +freely shared with anyone. For forty years, he produced and +distributed Project Gutenberg-tm eBooks with only a loose network of +volunteer support. + +Project Gutenberg-tm eBooks are often created from several printed +editions, all of which are confirmed as not protected by copyright in +the U.S. unless a copyright notice is included. Thus, we do not +necessarily keep eBooks in compliance with any particular paper +edition. + +Most people start at our Web site which has the main PG search +facility: www.gutenberg.org + +This Web site includes information about Project Gutenberg-tm, +including how to make donations to the Project Gutenberg Literary +Archive Foundation, how to help produce our new eBooks, and how to +subscribe to our email newsletter to hear about new eBooks. diff --git a/python-mega-algo/ciphers/rabin_miller.py b/python-mega-algo/ciphers/rabin_miller.py new file mode 100644 index 00000000..65c16298 --- /dev/null +++ b/python-mega-algo/ciphers/rabin_miller.py @@ -0,0 +1,223 @@ +# Primality Testing with the Rabin-Miller Algorithm + +import random + + +def rabinMiller(num: int) -> bool: + s = num - 1 + t = 0 + + while s % 2 == 0: + s = s // 2 + t += 1 + + for trials in range(5): + a = random.randrange(2, num - 1) + v = pow(a, s, num) + if v != 1: + i = 0 + while v != (num - 1): + if i == t - 1: + return False + else: + i = i + 1 + v = (v ** 2) % num + return True + + +def isPrime(num: int) -> bool: + if num < 2: + return False + + lowPrimes = [ + 2, + 3, + 5, + 7, + 11, + 13, + 17, + 19, + 23, + 29, + 31, + 37, + 41, + 43, + 47, + 53, + 59, + 61, + 67, + 71, + 73, + 79, + 83, + 89, + 97, + 101, + 103, + 107, + 109, + 113, + 127, + 131, + 137, + 139, + 149, + 151, + 157, + 163, + 167, + 173, + 179, + 181, + 191, + 193, + 197, + 199, + 211, + 223, + 227, + 229, + 233, + 239, + 241, + 251, + 257, + 263, + 269, + 271, + 277, + 281, + 283, + 293, + 307, + 311, + 313, + 317, + 331, + 337, + 347, + 349, + 353, + 359, + 367, + 373, + 379, + 383, + 389, + 397, + 401, + 409, + 419, + 421, + 431, + 433, + 439, + 443, + 449, + 457, + 461, + 463, + 467, + 479, + 487, + 491, + 499, + 503, + 509, + 521, + 523, + 541, + 547, + 557, + 563, + 569, + 571, + 577, + 587, + 593, + 599, + 601, + 607, + 613, + 617, + 619, + 631, + 641, + 643, + 647, + 653, + 659, + 661, + 673, + 677, + 683, + 691, + 701, + 709, + 719, + 727, + 733, + 739, + 743, + 751, + 757, + 761, + 769, + 773, + 787, + 797, + 809, + 811, + 821, + 823, + 827, + 829, + 839, + 853, + 857, + 859, + 863, + 877, + 881, + 883, + 887, + 907, + 911, + 919, + 929, + 937, + 941, + 947, + 953, + 967, + 971, + 977, + 983, + 991, + 997, + ] + + if num in lowPrimes: + return True + + for prime in lowPrimes: + if (num % prime) == 0: + return False + + return rabinMiller(num) + + +def generateLargePrime(keysize: int = 1024) -> int: + while True: + num = random.randrange(2 ** (keysize - 1), 2 ** (keysize)) + if isPrime(num): + return num + + +if __name__ == "__main__": + num = generateLargePrime() + print(("Prime number:", num)) + print(("isPrime:", isPrime(num))) diff --git a/python-mega-algo/ciphers/rail_fence_cipher.py b/python-mega-algo/ciphers/rail_fence_cipher.py new file mode 100644 index 00000000..20633170 --- /dev/null +++ b/python-mega-algo/ciphers/rail_fence_cipher.py @@ -0,0 +1,102 @@ +""" https://en.wikipedia.org/wiki/Rail_fence_cipher """ + + +def encrypt(input_string: str, key: int) -> str: + """ + Shuffles the character of a string by placing each of them + in a grid (the height is dependent on the key) in a zigzag + formation and reading it left to right. + + >>> encrypt("Hello World", 4) + 'HWe olordll' + + >>> encrypt("This is a message", 0) + Traceback (most recent call last): + ... + ValueError: Height of grid can't be 0 or negative + + >>> encrypt(b"This is a byte string", 5) + Traceback (most recent call last): + ... + TypeError: sequence item 0: expected str instance, int found + """ + temp_grid: list[list[str]] = [[] for _ in range(key)] + lowest = key - 1 + + if key <= 0: + raise ValueError("Height of grid can't be 0 or negative") + if key == 1 or len(input_string) <= key: + return input_string + + for position, character in enumerate(input_string): + num = position % (lowest * 2) # puts it in bounds + num = min(num, lowest * 2 - num) # creates zigzag pattern + temp_grid[num].append(character) + grid = ["".join(row) for row in temp_grid] + output_string = "".join(grid) + + return output_string + + +def decrypt(input_string: str, key: int) -> str: + """ + Generates a template based on the key and fills it in with + the characters of the input string and then reading it in + a zigzag formation. + + >>> decrypt("HWe olordll", 4) + 'Hello World' + + >>> decrypt("This is a message", -10) + Traceback (most recent call last): + ... + ValueError: Height of grid can't be 0 or negative + + >>> decrypt("My key is very big", 100) + 'My key is very big' + """ + grid = [] + lowest = key - 1 + + if key <= 0: + raise ValueError("Height of grid can't be 0 or negative") + if key == 1: + return input_string + + temp_grid: list[list[str]] = [[] for _ in range(key)] # generates template + for position in range(len(input_string)): + num = position % (lowest * 2) # puts it in bounds + num = min(num, lowest * 2 - num) # creates zigzag pattern + temp_grid[num].append("*") + + counter = 0 + for row in temp_grid: # fills in the characters + splice = input_string[counter : counter + len(row)] + grid.append([character for character in splice]) + counter += len(row) + + output_string = "" # reads as zigzag + for position in range(len(input_string)): + num = position % (lowest * 2) # puts it in bounds + num = min(num, lowest * 2 - num) # creates zigzag pattern + output_string += grid[num][0] + grid[num].pop(0) + return output_string + + +def bruteforce(input_string: str) -> dict[int, str]: + """Uses decrypt function by guessing every key + + >>> bruteforce("HWe olordll")[4] + 'Hello World' + """ + results = {} + for key_guess in range(1, len(input_string)): # tries every key + results[key_guess] = decrypt(input_string, key_guess) + return results + + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/ciphers/right.html b/python-mega-algo/ciphers/right.html new file mode 100644 index 00000000..2c767945 --- /dev/null +++ b/python-mega-algo/ciphers/right.html @@ -0,0 +1,38 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/ciphers + + + + + + + + +
Folders
<Go Back>
+
+ + + + + + + + + + + + + +
FileFileFileFile
a1z26.py cryptomat...ule.py morse_cod...ion.py shuffled_...her.py 
affine_cipher.py decrypt_c...red.py onepad_cipher.py simple_ke...her.py 
atbash.py determini...bin.py playfair_cipher.py simple_su...her.py 
base16.py diffie.py porta_cipher.py trafid_cipher.py 
base32.py diffie_hellman.py rabin_miller.py transposi...her.py 
base64_encoding.py elgamal_k...tor.py rail_fenc...her.py transposi...ile.py 
base85.py enigma_machine2.py rot13.py vigenere_cipher.py 
beaufort_cipher.py hill_cipher.py rsa_cipher.py xor_cipher.py 
brute_for...her.py mixed_key...her.py rsa_facto...ion.py __init__.py 
caesar_cipher.py mono_alph...ers.py rsa_key_g...tor.py prehistor...en.txt 
+ +

+Folders: 1
+Files: 40
+Size of all files: 459212 KB

+ + + \ No newline at end of file diff --git a/python-mega-algo/ciphers/rot13.py b/python-mega-algo/ciphers/rot13.py new file mode 100644 index 00000000..b367c321 --- /dev/null +++ b/python-mega-algo/ciphers/rot13.py @@ -0,0 +1,37 @@ +def dencrypt(s: str, n: int = 13) -> str: + """ + https://en.wikipedia.org/wiki/ROT13 + + >>> msg = "My secret bank account number is 173-52946 so don't tell anyone!!" + >>> s = dencrypt(msg) + >>> s + "Zl frperg onax nppbhag ahzore vf 173-52946 fb qba'g gryy nalbar!!" + >>> dencrypt(s) == msg + True + """ + out = "" + for c in s: + if "A" <= c <= "Z": + out += chr(ord("A") + (ord(c) - ord("A") + n) % 26) + elif "a" <= c <= "z": + out += chr(ord("a") + (ord(c) - ord("a") + n) % 26) + else: + out += c + return out + + +def main() -> None: + s0 = input("Enter message: ") + + s1 = dencrypt(s0, 13) + print("Encryption:", s1) + + s2 = dencrypt(s1, 13) + print("Decryption: ", s2) + + +if __name__ == "__main__": + import doctest + + doctest.testmod() + main() diff --git a/python-mega-algo/ciphers/rsa_cipher.py b/python-mega-algo/ciphers/rsa_cipher.py new file mode 100644 index 00000000..b1e8a73f --- /dev/null +++ b/python-mega-algo/ciphers/rsa_cipher.py @@ -0,0 +1,151 @@ +import os +import sys + +from . import rsa_key_generator as rkg + +DEFAULT_BLOCK_SIZE = 128 +BYTE_SIZE = 256 + + +def get_blocks_from_text( + message: str, block_size: int = DEFAULT_BLOCK_SIZE +) -> list[int]: + message_bytes = message.encode("ascii") + + block_ints = [] + for block_start in range(0, len(message_bytes), block_size): + block_int = 0 + for i in range(block_start, min(block_start + block_size, len(message_bytes))): + block_int += message_bytes[i] * (BYTE_SIZE ** (i % block_size)) + block_ints.append(block_int) + return block_ints + + +def get_text_from_blocks( + block_ints: list[int], message_length: int, block_size: int = DEFAULT_BLOCK_SIZE +) -> str: + message: list[str] = [] + for block_int in block_ints: + block_message: list[str] = [] + for i in range(block_size - 1, -1, -1): + if len(message) + i < message_length: + ascii_number = block_int // (BYTE_SIZE ** i) + block_int = block_int % (BYTE_SIZE ** i) + block_message.insert(0, chr(ascii_number)) + message.extend(block_message) + return "".join(message) + + +def encrypt_message( + message: str, key: tuple[int, int], blockSize: int = DEFAULT_BLOCK_SIZE +) -> list[int]: + encrypted_blocks = [] + n, e = key + + for block in get_blocks_from_text(message, blockSize): + encrypted_blocks.append(pow(block, e, n)) + return encrypted_blocks + + +def decrypt_message( + encrypted_blocks: list[int], + message_length: int, + key: tuple[int, int], + block_size: int = DEFAULT_BLOCK_SIZE, +) -> str: + decrypted_blocks = [] + n, d = key + for block in encrypted_blocks: + decrypted_blocks.append(pow(block, d, n)) + return get_text_from_blocks(decrypted_blocks, message_length, block_size) + + +def read_key_file(key_filename: str) -> tuple[int, int, int]: + with open(key_filename) as fo: + content = fo.read() + key_size, n, EorD = content.split(",") + return (int(key_size), int(n), int(EorD)) + + +def encrypt_and_write_to_file( + message_filename: str, + key_filename: str, + message: str, + block_size: int = DEFAULT_BLOCK_SIZE, +) -> str: + key_size, n, e = read_key_file(key_filename) + if key_size < block_size * 8: + sys.exit( + "ERROR: Block size is %s bits and key size is %s bits. The RSA cipher " + "requires the block size to be equal to or greater than the key size. " + "Either decrease the block size or use different keys." + % (block_size * 8, key_size) + ) + + encrypted_blocks = [str(i) for i in encrypt_message(message, (n, e), block_size)] + + encrypted_content = ",".join(encrypted_blocks) + encrypted_content = f"{len(message)}_{block_size}_{encrypted_content}" + with open(message_filename, "w") as fo: + fo.write(encrypted_content) + return encrypted_content + + +def read_from_file_and_decrypt(message_filename: str, key_filename: str) -> str: + key_size, n, d = read_key_file(key_filename) + with open(message_filename) as fo: + content = fo.read() + message_length_str, block_size_str, encrypted_message = content.split("_") + message_length = int(message_length_str) + block_size = int(block_size_str) + + if key_size < block_size * 8: + sys.exit( + "ERROR: Block size is %s bits and key size is %s bits. The RSA cipher " + "requires the block size to be equal to or greater than the key size. " + "Did you specify the correct key file and encrypted file?" + % (block_size * 8, key_size) + ) + + encrypted_blocks = [] + for block in encrypted_message.split(","): + encrypted_blocks.append(int(block)) + + return decrypt_message(encrypted_blocks, message_length, (n, d), block_size) + + +def main() -> None: + filename = "encrypted_file.txt" + response = input(r"Encrypt\Decrypt [e\d]: ") + + if response.lower().startswith("e"): + mode = "encrypt" + elif response.lower().startswith("d"): + mode = "decrypt" + + if mode == "encrypt": + if not os.path.exists("rsa_pubkey.txt"): + rkg.makeKeyFiles("rsa", 1024) + + message = input("\nEnter message: ") + pubkey_filename = "rsa_pubkey.txt" + print("Encrypting and writing to %s..." % (filename)) + encryptedText = encrypt_and_write_to_file(filename, pubkey_filename, message) + + print("\nEncrypted text:") + print(encryptedText) + + elif mode == "decrypt": + privkey_filename = "rsa_privkey.txt" + print("Reading from %s and decrypting..." % (filename)) + decrypted_text = read_from_file_and_decrypt(filename, privkey_filename) + print("writing decryption to rsa_decryption.txt...") + with open("rsa_decryption.txt", "w") as dec: + dec.write(decrypted_text) + + print("\nDecryption:") + print(decrypted_text) + + +if __name__ == "__main__": + main() diff --git a/python-mega-algo/ciphers/rsa_factorization.py b/python-mega-algo/ciphers/rsa_factorization.py new file mode 100644 index 00000000..7543d0cd --- /dev/null +++ b/python-mega-algo/ciphers/rsa_factorization.py @@ -0,0 +1,57 @@ +""" +An RSA prime factor algorithm. + +The program can efficiently factor RSA prime number given the private key d and +public key e. +Source: on page 3 of https://crypto.stanford.edu/~dabo/papers/RSA-survey.pdf +More readable source: https://www.di-mgt.com.au/rsa_factorize_n.html +large number can take minutes to factor, therefore are not included in doctest. +""" +from __future__ import annotations + +import math +import random + + +def rsafactor(d: int, e: int, N: int) -> list[int]: + """ + This function returns the factors of N, where p*q=N + Return: [p, q] + + We call N the RSA modulus, e the encryption exponent, and d the decryption exponent. + The pair (N, e) is the public key. As its name suggests, it is public and is used to + encrypt messages. + The pair (N, d) is the secret key or private key and is known only to the recipient + of encrypted messages. + + >>> rsafactor(3, 16971, 25777) + [149, 173] + >>> rsafactor(7331, 11, 27233) + [113, 241] + >>> rsafactor(4021, 13, 17711) + [89, 199] + """ + k = d * e - 1 + p = 0 + q = 0 + while p == 0: + g = random.randint(2, N - 1) + t = k + while True: + if t % 2 == 0: + t = t // 2 + x = (g ** t) % N + y = math.gcd(x - 1, N) + if x > 1 and y > 1: + p = y + q = N // y + break # find the correct factors + else: + break # t is not divisible by 2, break and choose another g + return sorted([p, q]) + + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/ciphers/rsa_key_generator.py b/python-mega-algo/ciphers/rsa_key_generator.py new file mode 100644 index 00000000..584066d8 --- /dev/null +++ b/python-mega-algo/ciphers/rsa_key_generator.py @@ -0,0 +1,59 @@ +import os +import random +import sys + +from . import cryptomath_module as cryptoMath +from . import rabin_miller as rabinMiller + + +def main() -> None: + print("Making key files...") + makeKeyFiles("rsa", 1024) + print("Key files generation successful.") + + +def generateKey(keySize: int) -> tuple[tuple[int, int], tuple[int, int]]: + print("Generating prime p...") + p = rabinMiller.generateLargePrime(keySize) + print("Generating prime q...") + q = rabinMiller.generateLargePrime(keySize) + n = p * q + + print("Generating e that is relatively prime to (p - 1) * (q - 1)...") + while True: + e = random.randrange(2 ** (keySize - 1), 2 ** (keySize)) + if cryptoMath.gcd(e, (p - 1) * (q - 1)) == 1: + break + + print("Calculating d that is mod inverse of e...") + d = cryptoMath.find_mod_inverse(e, (p - 1) * (q - 1)) + + publicKey = (n, e) + privateKey = (n, d) + return (publicKey, privateKey) + + +def makeKeyFiles(name: str, keySize: int) -> None: + if os.path.exists("%s_pubkey.txt" % (name)) or os.path.exists( + "%s_privkey.txt" % (name) + ): + print("\nWARNING:") + print( + '"%s_pubkey.txt" or "%s_privkey.txt" already exists. \n' + "Use a different name or delete these files and re-run this program." + % (name, name) + ) + sys.exit() + + publicKey, privateKey = generateKey(keySize) + print("\nWriting public key to file %s_pubkey.txt..." % name) + with open("%s_pubkey.txt" % name, "w") as out_file: + out_file.write(f"{keySize},{publicKey[0]},{publicKey[1]}") + + print("Writing private key to file %s_privkey.txt..." % name) + with open("%s_privkey.txt" % name, "w") as out_file: + out_file.write(f"{keySize},{privateKey[0]},{privateKey[1]}") + + +if __name__ == "__main__": + main() diff --git a/python-mega-algo/ciphers/shuffled_shift_cipher.py b/python-mega-algo/ciphers/shuffled_shift_cipher.py new file mode 100644 index 00000000..01d09964 --- /dev/null +++ b/python-mega-algo/ciphers/shuffled_shift_cipher.py @@ -0,0 +1,183 @@ +import random +import string +from typing import Optional + + +class ShuffledShiftCipher: + """ + This algorithm uses the Caesar Cipher algorithm but removes the option to + use brute force to decrypt the message. + + The passcode is a a random password from the selection buffer of + 1. uppercase letters of the English alphabet + 2. lowercase letters of the English alphabet + 3. digits from 0 to 9 + + Using unique characters from the passcode, the normal list of characters, + that can be allowed in the plaintext, is pivoted and shuffled. Refer to docstring + of __make_key_list() to learn more about the shuffling. + + Then, using the passcode, a number is calculated which is used to encrypt the + plaintext message with the normal shift cipher method, only in this case, the + reference, to look back at while decrypting, is shuffled. + + Each cipher object can possess an optional argument as passcode, without which a + new passcode is generated for that object automatically. + cip1 = ShuffledShiftCipher('d4usr9TWxw9wMD') + cip2 = ShuffledShiftCipher() + """ + + def __init__(self, passcode: Optional[str] = None) -> None: + """ + Initializes a cipher object with a passcode as it's entity + Note: No new passcode is generated if user provides a passcode + while creating the object + """ + self.__passcode = passcode or self.__passcode_creator() + self.__key_list = self.__make_key_list() + self.__shift_key = self.__make_shift_key() + + def __str__(self) -> str: + """ + :return: passcode of the cipher object + """ + return "Passcode is: " + "".join(self.__passcode) + + def __neg_pos(self, iterlist: list[int]) -> list[int]: + """ + Mutates the list by changing the sign of each alternate element + + :param iterlist: takes a list iterable + :return: the mutated list + + """ + for i in range(1, len(iterlist), 2): + iterlist[i] *= -1 + return iterlist + + def __passcode_creator(self) -> list[str]: + """ + Creates a random password from the selection buffer of + 1. uppercase letters of the English alphabet + 2. lowercase letters of the English alphabet + 3. digits from 0 to 9 + + :rtype: list + :return: a password of a random length between 10 to 20 + """ + choices = string.ascii_letters + string.digits + password = [random.choice(choices) for _ in range(random.randint(10, 20))] + return password + + def __make_key_list(self) -> list[str]: + """ + Shuffles the ordered character choices by pivoting at breakpoints + Breakpoints are the set of characters in the passcode + + eg: + if, ABCDEFGHIJKLMNOPQRSTUVWXYZ are the possible characters + and CAMERA is the passcode + then, breakpoints = [A,C,E,M,R] # sorted set of characters from passcode + shuffled parts: [A,CB,ED,MLKJIHGF,RQPON,ZYXWVUTS] + shuffled __key_list : ACBEDMLKJIHGFRQPONZYXWVUTS + + Shuffling only 26 letters of the english alphabet can generate 26! + combinations for the shuffled list. In the program we consider, a set of + 97 characters (including letters, digits, punctuation and whitespaces), + thereby creating a possibility of 97! combinations (which is a 152 digit number + in itself), thus diminishing the possibility of a brute force approach. + Moreover, shift keys even introduce a multiple of 26 for a brute force approach + for each of the already 97! combinations. + """ + # key_list_options contain nearly all printable except few elements from + # string.whitespace + key_list_options = ( + string.ascii_letters + string.digits + string.punctuation + " \t\n" + ) + + keys_l = [] + + # creates points known as breakpoints to break the key_list_options at those + # points and pivot each substring + breakpoints = sorted(set(self.__passcode)) + temp_list: list[str] = [] + + # algorithm for creating a new shuffled list, keys_l, out of key_list_options + for i in key_list_options: + temp_list.extend(i) + + # checking breakpoints at which to pivot temporary sublist and add it into + # keys_l + if i in breakpoints or i == key_list_options[-1]: + keys_l.extend(temp_list[::-1]) + temp_list.clear() + + # returning a shuffled keys_l to prevent brute force guessing of shift key + return keys_l + + def __make_shift_key(self) -> int: + """ + sum() of the mutated list of ascii values of all characters where the + mutated list is the one returned by __neg_pos() + """ + num = sum(self.__neg_pos([ord(x) for x in self.__passcode])) + return num if num > 0 else len(self.__passcode) + + def decrypt(self, encoded_message: str) -> str: + """ + Performs shifting of the encoded_message w.r.t. the shuffled __key_list + to create the decoded_message + + >>> ssc = ShuffledShiftCipher('4PYIXyqeQZr44') + >>> ssc.decrypt("d>**-1z6&'5z'5z:z+-='$'>=zp:>5:#z<'.&>#") + 'Hello, this is a modified Caesar cipher' + + """ + decoded_message = "" + + # decoding shift like Caesar cipher algorithm implementing negative shift or + # reverse shift or left shift + for i in encoded_message: + position = self.__key_list.index(i) + decoded_message += self.__key_list[ + (position - self.__shift_key) % -len(self.__key_list) + ] + + return decoded_message + + def encrypt(self, plaintext: str) -> str: + """ + Performs shifting of the plaintext w.r.t. the shuffled __key_list + to create the encoded_message + + >>> ssc = ShuffledShiftCipher('4PYIXyqeQZr44') + >>> ssc.encrypt('Hello, this is a modified Caesar cipher') + "d>**-1z6&'5z'5z:z+-='$'>=zp:>5:#z<'.&>#" + + """ + encoded_message = "" + + # encoding shift like Caesar cipher algorithm implementing positive shift or + # forward shift or right shift + for i in plaintext: + position = self.__key_list.index(i) + encoded_message += self.__key_list[ + (position + self.__shift_key) % len(self.__key_list) + ] + + return encoded_message + + +def test_end_to_end(msg: str = "Hello, this is a modified Caesar cipher") -> str: + """ + >>> test_end_to_end() + 'Hello, this is a modified Caesar cipher' + """ + cip1 = ShuffledShiftCipher() + return cip1.decrypt(cip1.encrypt(msg)) + + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/ciphers/simple_keyword_cypher.py b/python-mega-algo/ciphers/simple_keyword_cypher.py new file mode 100644 index 00000000..447bacfc --- /dev/null +++ b/python-mega-algo/ciphers/simple_keyword_cypher.py @@ -0,0 +1,90 @@ +def remove_duplicates(key: str) -> str: + """ + Removes duplicate alphabetic characters in a keyword (letter is ignored after its + first appearance). + :param key: Keyword to use + :return: String with duplicates removed + >>> remove_duplicates('Hello World!!') + 'Helo Wrd' + """ + + key_no_dups = "" + for ch in key: + if ch == " " or ch not in key_no_dups and ch.isalpha(): + key_no_dups += ch + return key_no_dups + + +def create_cipher_map(key: str) -> dict[str, str]: + """ + Returns a cipher map given a keyword. + :param key: keyword to use + :return: dictionary cipher map + """ + # Create alphabet list + alphabet = [chr(i + 65) for i in range(26)] + # Remove duplicate characters from key + key = remove_duplicates(key.upper()) + offset = len(key) + # First fill cipher with key characters + cipher_alphabet = {alphabet[i]: char for i, char in enumerate(key)} + # Then map remaining characters in alphabet to + # the alphabet from the beginning + for i in range(len(cipher_alphabet), 26): + char = alphabet[i - offset] + # Ensure we are not mapping letters to letters previously mapped + while char in key: + offset -= 1 + char = alphabet[i - offset] + cipher_alphabet[alphabet[i]] = char + return cipher_alphabet + + +def encipher(message: str, cipher_map: dict[str, str]) -> str: + """ + Enciphers a message given a cipher map. + :param message: Message to encipher + :param cipher_map: Cipher map + :return: enciphered string + >>> encipher('Hello World!!', create_cipher_map('Goodbye!!')) + 'CYJJM VMQJB!!' + """ + return "".join(cipher_map.get(ch, ch) for ch in message.upper()) + + +def decipher(message: str, cipher_map: dict[str, str]) -> str: + """ + Deciphers a message given a cipher map + :param message: Message to decipher + :param cipher_map: Dictionary mapping to use + :return: Deciphered string + >>> cipher_map = create_cipher_map('Goodbye!!') + >>> decipher(encipher('Hello World!!', cipher_map), cipher_map) + 'HELLO WORLD!!' + """ + # Reverse our cipher mappings + rev_cipher_map = {v: k for k, v in cipher_map.items()} + return "".join(rev_cipher_map.get(ch, ch) for ch in message.upper()) + + +def main() -> None: + """ + Handles I/O + :return: void + """ + message = input("Enter message to encode or decode: ").strip() + key = input("Enter keyword: ").strip() + option = input("Encipher or decipher? E/D:").strip()[0].lower() + try: + func = {"e": encipher, "d": decipher}[option] + except KeyError: + raise KeyError("invalid input option") + cipher_map = create_cipher_map(key) + print(func(message, cipher_map)) + + +if __name__ == "__main__": + import doctest + + doctest.testmod() + main() diff --git a/python-mega-algo/ciphers/simple_substitution_cipher.py b/python-mega-algo/ciphers/simple_substitution_cipher.py new file mode 100644 index 00000000..a763bd6b --- /dev/null +++ b/python-mega-algo/ciphers/simple_substitution_cipher.py @@ -0,0 +1,78 @@ +import random +import sys + +LETTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + + +def main() -> None: + message = input("Enter message: ") + key = "LFWOAYUISVKMNXPBDCRJTQEGHZ" + resp = input("Encrypt/Decrypt [e/d]: ") + + checkValidKey(key) + + if resp.lower().startswith("e"): + mode = "encrypt" + translated = encryptMessage(key, message) + elif resp.lower().startswith("d"): + mode = "decrypt" + translated = decryptMessage(key, message) + + print(f"\n{mode.title()}ion: \n{translated}") + + +def checkValidKey(key: str) -> None: + keyList = list(key) + lettersList = list(LETTERS) + keyList.sort() + lettersList.sort() + + if keyList != lettersList: + sys.exit("Error in the key or symbol set.") + + +def encryptMessage(key: str, message: str) -> str: + """ + >>> encryptMessage('LFWOAYUISVKMNXPBDCRJTQEGHZ', 'Harshil Darji') + 'Ilcrism Olcvs' + """ + return translateMessage(key, message, "encrypt") + + +def decryptMessage(key: str, message: str) -> str: + """ + >>> decryptMessage('LFWOAYUISVKMNXPBDCRJTQEGHZ', 'Ilcrism Olcvs') + 'Harshil Darji' + """ + return translateMessage(key, message, "decrypt") + + +def translateMessage(key: str, message: str, mode: str) -> str: + translated = "" + charsA = LETTERS + charsB = key + + if mode == "decrypt": + charsA, charsB = charsB, charsA + + for symbol in message: + if symbol.upper() in charsA: + symIndex = charsA.find(symbol.upper()) + if symbol.isupper(): + translated += charsB[symIndex].upper() + else: + translated += charsB[symIndex].lower() + else: + translated += symbol + + return translated + + +def getRandomKey() -> str: + key = list(LETTERS) + random.shuffle(key) + return "".join(key) + + +if __name__ == "__main__": + main() diff --git a/python-mega-algo/ciphers/trafid_cipher.py b/python-mega-algo/ciphers/trafid_cipher.py new file mode 100644 index 00000000..aeb98bea --- /dev/null +++ b/python-mega-algo/ciphers/trafid_cipher.py @@ -0,0 +1,128 @@ +# https://en.wikipedia.org/wiki/Trifid_cipher + + +def __encryptPart(messagePart: str, character2Number: dict[str, str]) -> str: + one, two, three = "", "", "" + tmp = [] + + for character in messagePart: + tmp.append(character2Number[character]) + + for each in tmp: + one += each[0] + two += each[1] + three += each[2] + + return one + two + three + + +def __decryptPart( + messagePart: str, character2Number: dict[str, str] +) -> tuple[str, str, str]: + tmp, thisPart = "", "" + result = [] + + for character in messagePart: + thisPart += character2Number[character] + + for digit in thisPart: + tmp += digit + if len(tmp) == len(messagePart): + result.append(tmp) + tmp = "" + + return result[0], result[1], result[2] + + +def __prepare( + message: str, alphabet: str +) -> tuple[str, str, dict[str, str], dict[str, str]]: + # Validate message and alphabet, set to upper and remove spaces + alphabet = alphabet.replace(" ", "").upper() + message = message.replace(" ", "").upper() + + # Check length and characters + if len(alphabet) != 27: + raise KeyError("Length of alphabet has to be 27.") + for each in message: + if each not in alphabet: + raise ValueError("Each message character has to be included in alphabet!") + + # Generate dictionares + numbers = ( + "111", + "112", + "113", + "121", + "122", + "123", + "131", + "132", + "133", + "211", + "212", + "213", + "221", + "222", + "223", + "231", + "232", + "233", + "311", + "312", + "313", + "321", + "322", + "323", + "331", + "332", + "333", + ) + character2Number = {} + number2Character = {} + for letter, number in zip(alphabet, numbers): + character2Number[letter] = number + number2Character[number] = letter + + return message, alphabet, character2Number, number2Character + + +def encryptMessage( + message: str, alphabet: str = "ABCDEFGHIJKLMNOPQRSTUVWXYZ.", period: int = 5 +) -> str: + message, alphabet, character2Number, number2Character = __prepare(message, alphabet) + encrypted, encrypted_numeric = "", "" + + for i in range(0, len(message) + 1, period): + encrypted_numeric += __encryptPart(message[i : i + period], character2Number) + + for i in range(0, len(encrypted_numeric), 3): + encrypted += number2Character[encrypted_numeric[i : i + 3]] + + return encrypted + + +def decryptMessage( + message: str, alphabet: str = "ABCDEFGHIJKLMNOPQRSTUVWXYZ.", period: int = 5 +) -> str: + message, alphabet, character2Number, number2Character = __prepare(message, alphabet) + decrypted_numeric = [] + decrypted = "" + + for i in range(0, len(message) + 1, period): + a, b, c = __decryptPart(message[i : i + period], character2Number) + + for j in range(0, len(a)): + decrypted_numeric.append(a[j] + b[j] + c[j]) + + for each in decrypted_numeric: + decrypted += number2Character[each] + + return decrypted + + +if __name__ == "__main__": + msg = "DEFEND THE EAST WALL OF THE CASTLE." + encrypted = encryptMessage(msg, "EPSDUCVWYM.ZLKXNBTFGORIJHAQ") + decrypted = decryptMessage(encrypted, "EPSDUCVWYM.ZLKXNBTFGORIJHAQ") + print(f"Encrypted: {encrypted}\nDecrypted: {decrypted}") diff --git a/python-mega-algo/ciphers/transposition_cipher.py b/python-mega-algo/ciphers/transposition_cipher.py new file mode 100644 index 00000000..589bb8cb --- /dev/null +++ b/python-mega-algo/ciphers/transposition_cipher.py @@ -0,0 +1,70 @@ +import math + +""" +In cryptography, the TRANSPOSITION cipher is a method of encryption where the +positions of plaintext are shifted a certain number(determined by the key) that +follows a regular system that results in the permuted text, known as the encrypted +text. The type of transposition cipher demonstrated under is the ROUTE cipher. +""" + + +def main() -> None: + message = input("Enter message: ") + key = int(input("Enter key [2-%s]: " % (len(message) - 1))) + mode = input("Encryption/Decryption [e/d]: ") + + if mode.lower().startswith("e"): + text = encryptMessage(key, message) + elif mode.lower().startswith("d"): + text = decryptMessage(key, message) + + # Append pipe symbol (vertical bar) to identify spaces at the end. + print("Output:\n%s" % (text + "|")) + + +def encryptMessage(key: int, message: str) -> str: + """ + >>> encryptMessage(6, 'Harshil Darji') + 'Hlia rDsahrij' + """ + cipherText = [""] * key + for col in range(key): + pointer = col + while pointer < len(message): + cipherText[col] += message[pointer] + pointer += key + return "".join(cipherText) + + +def decryptMessage(key: int, message: str) -> str: + """ + >>> decryptMessage(6, 'Hlia rDsahrij') + 'Harshil Darji' + """ + numCols = math.ceil(len(message) / key) + numRows = key + numShadedBoxes = (numCols * numRows) - len(message) + plainText = [""] * numCols + col = 0 + row = 0 + + for symbol in message: + plainText[col] += symbol + col += 1 + + if ( + (col == numCols) + or (col == numCols - 1) + and (row >= numRows - numShadedBoxes) + ): + col = 0 + row += 1 + + return "".join(plainText) + + +if __name__ == "__main__": + import doctest + + doctest.testmod() + main() diff --git a/python-mega-algo/ciphers/transposition_cipher_encrypt_decrypt_file.py b/python-mega-algo/ciphers/transposition_cipher_encrypt_decrypt_file.py new file mode 100644 index 00000000..b91c73c9 --- /dev/null +++ b/python-mega-algo/ciphers/transposition_cipher_encrypt_decrypt_file.py @@ -0,0 +1,41 @@ +import os +import sys +import time + +from . import transposition_cipher as transCipher + + +def main() -> None: + inputFile = "Prehistoric Men.txt" + outputFile = "Output.txt" + key = int(input("Enter key: ")) + mode = input("Encrypt/Decrypt [e/d]: ") + + if not os.path.exists(inputFile): + print("File %s does not exist. Quitting..." % inputFile) + sys.exit() + if os.path.exists(outputFile): + print("Overwrite %s? [y/n]" % outputFile) + response = input("> ") + if not response.lower().startswith("y"): + sys.exit() + + startTime = time.time() + if mode.lower().startswith("e"): + with open(inputFile) as f: + content = f.read() + translated = transCipher.encryptMessage(key, content) + elif mode.lower().startswith("d"): + with open(outputFile) as f: + content = f.read() + translated = transCipher.decryptMessage(key, content) + + with open(outputFile, "w") as outputObj: + outputObj.write(translated) + + totalTime = round(time.time() - startTime, 2) + print(("Done (", totalTime, "seconds )")) + + +if __name__ == "__main__": + main() diff --git a/python-mega-algo/ciphers/vigenere_cipher.py b/python-mega-algo/ciphers/vigenere_cipher.py new file mode 100644 index 00000000..d97a9694 --- /dev/null +++ b/python-mega-algo/ciphers/vigenere_cipher.py @@ -0,0 +1,65 @@ +LETTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + + +def main() -> None: + message = input("Enter message: ") + key = input("Enter key [alphanumeric]: ") + mode = input("Encrypt/Decrypt [e/d]: ") + + if mode.lower().startswith("e"): + mode = "encrypt" + translated = encryptMessage(key, message) + elif mode.lower().startswith("d"): + mode = "decrypt" + translated = decryptMessage(key, message) + + print("\n%sed message:" % mode.title()) + print(translated) + + +def encryptMessage(key: str, message: str) -> str: + """ + >>> encryptMessage('HDarji', 'This is Harshil Darji from Dharmaj.') + 'Akij ra Odrjqqs Gaisq muod Mphumrs.' + """ + return translateMessage(key, message, "encrypt") + + +def decryptMessage(key: str, message: str) -> str: + """ + >>> decryptMessage('HDarji', 'Akij ra Odrjqqs Gaisq muod Mphumrs.') + 'This is Harshil Darji from Dharmaj.' + """ + return translateMessage(key, message, "decrypt") + + +def translateMessage(key: str, message: str, mode: str) -> str: + translated = [] + keyIndex = 0 + key = key.upper() + + for symbol in message: + num = LETTERS.find(symbol.upper()) + if num != -1: + if mode == "encrypt": + num += LETTERS.find(key[keyIndex]) + elif mode == "decrypt": + num -= LETTERS.find(key[keyIndex]) + + num %= len(LETTERS) + + if symbol.isupper(): + translated.append(LETTERS[num]) + elif symbol.islower(): + translated.append(LETTERS[num].lower()) + + keyIndex += 1 + if keyIndex == len(key): + keyIndex = 0 + else: + translated.append(symbol) + return "".join(translated) + + +if __name__ == "__main__": + main() diff --git a/python-mega-algo/ciphers/xor_cipher.py b/python-mega-algo/ciphers/xor_cipher.py new file mode 100644 index 00000000..12d580e7 --- /dev/null +++ b/python-mega-algo/ciphers/xor_cipher.py @@ -0,0 +1,205 @@ +""" + author: Christian Bender + date: 21.12.2017 + class: XORCipher + + This class implements the XOR-cipher algorithm and provides + some useful methods for encrypting and decrypting strings and + files. + + Overview about methods + + - encrypt : list of char + - decrypt : list of char + - encrypt_string : str + - decrypt_string : str + - encrypt_file : boolean + - decrypt_file : boolean +""" + + +class XORCipher: + def __init__(self, key: int = 0): + """ + simple constructor that receives a key or uses + default key = 0 + """ + + # private field + self.__key = key + + def encrypt(self, content: str, key: int) -> list[str]: + """ + input: 'content' of type string and 'key' of type int + output: encrypted string 'content' as a list of chars + if key not passed the method uses the key by the constructor. + otherwise key = 1 + """ + + # precondition + assert isinstance(key, int) and isinstance(content, str) + + key = key or self.__key or 1 + + # make sure key can be any size + while key > 255: + key -= 255 + + # This will be returned + ans = [] + + for ch in content: + ans.append(chr(ord(ch) ^ key)) + + return ans + + def decrypt(self, content: str, key: int) -> list[str]: + """ + input: 'content' of type list and 'key' of type int + output: decrypted string 'content' as a list of chars + if key not passed the method uses the key by the constructor. + otherwise key = 1 + """ + + # precondition + assert isinstance(key, int) and isinstance(content, list) + + key = key or self.__key or 1 + + # make sure key can be any size + while key > 255: + key -= 255 + + # This will be returned + ans = [] + + for ch in content: + ans.append(chr(ord(ch) ^ key)) + + return ans + + def encrypt_string(self, content: str, key: int = 0) -> str: + """ + input: 'content' of type string and 'key' of type int + output: encrypted string 'content' + if key not passed the method uses the key by the constructor. + otherwise key = 1 + """ + + # precondition + assert isinstance(key, int) and isinstance(content, str) + + key = key or self.__key or 1 + + # make sure key can be any size + while key > 255: + key -= 255 + + # This will be returned + ans = "" + + for ch in content: + ans += chr(ord(ch) ^ key) + + return ans + + def decrypt_string(self, content: str, key: int = 0) -> str: + """ + input: 'content' of type string and 'key' of type int + output: decrypted string 'content' + if key not passed the method uses the key by the constructor. + otherwise key = 1 + """ + + # precondition + assert isinstance(key, int) and isinstance(content, str) + + key = key or self.__key or 1 + + # make sure key can be any size + while key > 255: + key -= 255 + + # This will be returned + ans = "" + + for ch in content: + ans += chr(ord(ch) ^ key) + + return ans + + def encrypt_file(self, file: str, key: int = 0) -> bool: + """ + input: filename (str) and a key (int) + output: returns true if encrypt process was + successful otherwise false + if key not passed the method uses the key by the constructor. + otherwise key = 1 + """ + + # precondition + assert isinstance(file, str) and isinstance(key, int) + + try: + with open(file) as fin: + with open("encrypt.out", "w+") as fout: + + # actual encrypt-process + for line in fin: + fout.write(self.encrypt_string(line, key)) + + except OSError: + return False + + return True + + def decrypt_file(self, file: str, key: int) -> bool: + """ + input: filename (str) and a key (int) + output: returns true if decrypt process was + successful otherwise false + if key not passed the method uses the key by the constructor. + otherwise key = 1 + """ + + # precondition + assert isinstance(file, str) and isinstance(key, int) + + try: + with open(file) as fin: + with open("decrypt.out", "w+") as fout: + + # actual encrypt-process + for line in fin: + fout.write(self.decrypt_string(line, key)) + + except OSError: + return False + + return True + + +# Tests +# crypt = XORCipher() +# key = 67 + +# # test encrypt +# print(crypt.encrypt("hallo welt",key)) +# # test decrypt +# print(crypt.decrypt(crypt.encrypt("hallo welt",key), key)) + +# # test encrypt_string +# print(crypt.encrypt_string("hallo welt",key)) + +# # test decrypt_string +# print(crypt.decrypt_string(crypt.encrypt_string("hallo welt",key),key)) + +# if (crypt.encrypt_file("test.txt",key)): +# print("encrypt successful") +# else: +# print("encrypt unsuccessful") + +# if (crypt.decrypt_file("encrypt.out",key)): +# print("decrypt successful") +# else: +# print("decrypt unsuccessful") diff --git a/python-mega-algo/compression/__init__.py b/python-mega-algo/compression/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/compression/burrows_wheeler.py b/python-mega-algo/compression/burrows_wheeler.py new file mode 100644 index 00000000..7d705af7 --- /dev/null +++ b/python-mega-algo/compression/burrows_wheeler.py @@ -0,0 +1,168 @@ +""" +https://en.wikipedia.org/wiki/Burrows%E2%80%93Wheeler_transform + +The Burrows–Wheeler transform (BWT, also called block-sorting compression) +rearranges a character string into runs of similar characters. This is useful +for compression, since it tends to be easy to compress a string that has runs +of repeated characters by techniques such as move-to-front transform and +run-length encoding. More importantly, the transformation is reversible, +without needing to store any additional data except the position of the first +original character. The BWT is thus a "free" method of improving the efficiency +of text compression algorithms, costing only some extra computation. +""" +from __future__ import annotations + + +def all_rotations(s: str) -> list[str]: + """ + :param s: The string that will be rotated len(s) times. + :return: A list with the rotations. + :raises TypeError: If s is not an instance of str. + Examples: + + >>> all_rotations("^BANANA|") # doctest: +NORMALIZE_WHITESPACE + ['^BANANA|', 'BANANA|^', 'ANANA|^B', 'NANA|^BA', 'ANA|^BAN', 'NA|^BANA', + 'A|^BANAN', '|^BANANA'] + >>> all_rotations("a_asa_da_casa") # doctest: +NORMALIZE_WHITESPACE + ['a_asa_da_casa', '_asa_da_casaa', 'asa_da_casaa_', 'sa_da_casaa_a', + 'a_da_casaa_as', '_da_casaa_asa', 'da_casaa_asa_', 'a_casaa_asa_d', + '_casaa_asa_da', 'casaa_asa_da_', 'asaa_asa_da_c', 'saa_asa_da_ca', + 'aa_asa_da_cas'] + >>> all_rotations("panamabanana") # doctest: +NORMALIZE_WHITESPACE + ['panamabanana', 'anamabananap', 'namabananapa', 'amabananapan', + 'mabananapana', 'abananapanam', 'bananapanama', 'ananapanamab', + 'nanapanamaba', 'anapanamaban', 'napanamabana', 'apanamabanan'] + >>> all_rotations(5) + Traceback (most recent call last): + ... + TypeError: The parameter s type must be str. + """ + if not isinstance(s, str): + raise TypeError("The parameter s type must be str.") + + return [s[i:] + s[:i] for i in range(len(s))] + + +def bwt_transform(s: str) -> dict: + """ + :param s: The string that will be used at bwt algorithm + :return: the string composed of the last char of each row of the ordered + rotations and the index of the original string at ordered rotations list + :raises TypeError: If the s parameter type is not str + :raises ValueError: If the s parameter is empty + Examples: + + >>> bwt_transform("^BANANA") + {'bwt_string': 'BNN^AAA', 'idx_original_string': 6} + >>> bwt_transform("a_asa_da_casa") + {'bwt_string': 'aaaadss_c__aa', 'idx_original_string': 3} + >>> bwt_transform("panamabanana") + {'bwt_string': 'mnpbnnaaaaaa', 'idx_original_string': 11} + >>> bwt_transform(4) + Traceback (most recent call last): + ... + TypeError: The parameter s type must be str. + >>> bwt_transform('') + Traceback (most recent call last): + ... + ValueError: The parameter s must not be empty. + """ + if not isinstance(s, str): + raise TypeError("The parameter s type must be str.") + if not s: + raise ValueError("The parameter s must not be empty.") + + rotations = all_rotations(s) + rotations.sort() # sort the list of rotations in alphabetically order + # make a string composed of the last char of each rotation + return { + "bwt_string": "".join([word[-1] for word in rotations]), + "idx_original_string": rotations.index(s), + } + + +def reverse_bwt(bwt_string: str, idx_original_string: int) -> str: + """ + :param bwt_string: The string returned from bwt algorithm execution + :param idx_original_string: A 0-based index of the string that was used to + generate bwt_string at ordered rotations list + :return: The string used to generate bwt_string when bwt was executed + :raises TypeError: If the bwt_string parameter type is not str + :raises ValueError: If the bwt_string parameter is empty + :raises TypeError: If the idx_original_string type is not int or if not + possible to cast it to int + :raises ValueError: If the idx_original_string value is lower than 0 or + greater than len(bwt_string) - 1 + + >>> reverse_bwt("BNN^AAA", 6) + '^BANANA' + >>> reverse_bwt("aaaadss_c__aa", 3) + 'a_asa_da_casa' + >>> reverse_bwt("mnpbnnaaaaaa", 11) + 'panamabanana' + >>> reverse_bwt(4, 11) + Traceback (most recent call last): + ... + TypeError: The parameter bwt_string type must be str. + >>> reverse_bwt("", 11) + Traceback (most recent call last): + ... + ValueError: The parameter bwt_string must not be empty. + >>> reverse_bwt("mnpbnnaaaaaa", "asd") # doctest: +NORMALIZE_WHITESPACE + Traceback (most recent call last): + ... + TypeError: The parameter idx_original_string type must be int or passive + of cast to int. + >>> reverse_bwt("mnpbnnaaaaaa", -1) + Traceback (most recent call last): + ... + ValueError: The parameter idx_original_string must not be lower than 0. + >>> reverse_bwt("mnpbnnaaaaaa", 12) # doctest: +NORMALIZE_WHITESPACE + Traceback (most recent call last): + ... + ValueError: The parameter idx_original_string must be lower than + len(bwt_string). + >>> reverse_bwt("mnpbnnaaaaaa", 11.0) + 'panamabanana' + >>> reverse_bwt("mnpbnnaaaaaa", 11.4) + 'panamabanana' + """ + if not isinstance(bwt_string, str): + raise TypeError("The parameter bwt_string type must be str.") + if not bwt_string: + raise ValueError("The parameter bwt_string must not be empty.") + try: + idx_original_string = int(idx_original_string) + except ValueError: + raise TypeError( + "The parameter idx_original_string type must be int or passive" + " of cast to int." + ) + if idx_original_string < 0: + raise ValueError("The parameter idx_original_string must not be lower than 0.") + if idx_original_string >= len(bwt_string): + raise ValueError( + "The parameter idx_original_string must be lower than" " len(bwt_string)." + ) + + ordered_rotations = [""] * len(bwt_string) + for x in range(len(bwt_string)): + for i in range(len(bwt_string)): + ordered_rotations[i] = bwt_string[i] + ordered_rotations[i] + ordered_rotations.sort() + return ordered_rotations[idx_original_string] + + +if __name__ == "__main__": + entry_msg = "Provide a string that I will generate its BWT transform: " + s = input(entry_msg).strip() + result = bwt_transform(s) + print( + f"Burrows Wheeler transform for string '{s}' results " + f"in '{result['bwt_string']}'" + ) + original_string = reverse_bwt(result["bwt_string"], result["idx_original_string"]) + print( + f"Reversing Burrows Wheeler transform for entry '{result['bwt_string']}' " + f"we get original string '{original_string}'" + ) diff --git a/python-mega-algo/compression/huffman.py b/python-mega-algo/compression/huffman.py new file mode 100644 index 00000000..3a3cbfa4 --- /dev/null +++ b/python-mega-algo/compression/huffman.py @@ -0,0 +1,87 @@ +import sys + + +class Letter: + def __init__(self, letter, freq): + self.letter = letter + self.freq = freq + self.bitstring = "" + + def __repr__(self): + return f"{self.letter}:{self.freq}" + + +class TreeNode: + def __init__(self, freq, left, right): + self.freq = freq + self.left = left + self.right = right + + +def parse_file(file_path): + """ + Read the file and build a dict of all letters and their + frequencies, then convert the dict into a list of Letters. + """ + chars = {} + with open(file_path) as f: + while True: + c = f.read(1) + if not c: + break + chars[c] = chars[c] + 1 if c in chars.keys() else 1 + return sorted([Letter(c, f) for c, f in chars.items()], key=lambda l: l.freq) + + +def build_tree(letters): + """ + Run through the list of Letters and build the min heap + for the Huffman Tree. + """ + while len(letters) > 1: + left = letters.pop(0) + right = letters.pop(0) + total_freq = left.freq + right.freq + node = TreeNode(total_freq, left, right) + letters.append(node) + letters.sort(key=lambda l: l.freq) + return letters[0] + + +def traverse_tree(root, bitstring): + """ + Recursively traverse the Huffman Tree to set each + Letter's bitstring, and return the list of Letters + """ + if type(root) is Letter: + root.bitstring = bitstring + return [root] + letters = [] + letters += traverse_tree(root.left, bitstring + "0") + letters += traverse_tree(root.right, bitstring + "1") + return letters + + +def huffman(file_path): + """ + Parse the file, build the tree, then run through the file + again, using the list of Letters to find and print out the + bitstring for each letter. + """ + letters_list = parse_file(file_path) + root = build_tree(letters_list) + letters = traverse_tree(root, "") + print(f"Huffman Coding of {file_path}: ") + with open(file_path) as f: + while True: + c = f.read(1) + if not c: + break + le = list(filter(lambda l: l.letter == c, letters))[0] + print(le.bitstring, end=" ") + print() + + +if __name__ == "__main__": + # pass the file path to the huffman function + huffman(sys.argv[1]) diff --git a/python-mega-algo/compression/image_data/PSNR-example-base.png b/python-mega-algo/compression/image_data/PSNR-example-base.png new file mode 100644 index 0000000000000000000000000000000000000000..bf12a5450b96e17c239dab14ebed66b201eddb7c GIT binary patch literal 4515013 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 z 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
vdricjzji#@-*@P0e??`Hk# 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%0DL@9ZY#9Dx*&hU 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 @8X@9Lt}Ju`qNf6oGx+d}mg$PB=b1CJmchh@ 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

XzKvz~^4K920>@am~zNZ?%QZuT&b^(|?+b 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 z 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 z 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

jx(hv`o!n0 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­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 F&{AX6#FMHpr2)32nqPe2NYPI9#>yI%m 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 DSfge+8gf|l`-ejBEcs}7Hx+*K>OC)R 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 @YR&4jZo{d~dIR>H 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

r7)Z&O&XB^vr0AbEt?1lthI9OVH)@G^L!? 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%0D@8~XPD_8cK43(Yr;&yt;{0qjV?JxJ1_osCWvy%~ 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

QA)EcAL?0#w=MP2~3qKs~UO9m=cnvn@q3u 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

ju-1@UcVZ>fR?

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�#!7N@DUqBR(+m%;w5&=9nUWXfCTvEB)eqzb;m=12-7xfFC!Qp_o71fnWb zC(0bF#7$#=y!X(XpJ#cGQ7pnJ3f z>>2A6&aCMBj@5eIvhI*YyU`eD(MFSUmZf!=czS+jbvyuYyWa6)bBA#qa`j{}d^qhn zo%c*}WIUZ2_a~mGNIsl7KkrdF(07(yXX$job_3d2jPLM$hcy z(-as(CTmMHl`#idCM%7h5~9W$D5_ipCQ*nLwQ6D#b>+J6xLK{~jKgFpszQnw3)VV{ zE|gS=xwdTV_FZY&j0t%_RxQrbWHLC5r4!|pR``B}wSyp(jbXFt0MEKxVQZ!;&)v>( z`wCuseP%?Q++JDwwq!ESV0w#oj*1e6bf+jT(wGs=VjkvE-lBKE?iH!0h zjyT7Ov_H{@%+1Y?+q*l#l9w#!h*D@H-?`aWsg+u=OVS(`oRXq1rYM+t@1^;Umvd1t zikE_7CT64zr*q`_`GHR#J}{1F;y7|Tp4dO{IUP?ezh2Ie6kB#@a~l2V)h*k<|0ye7 z2+c*EfGK8jj#yRcy_ZaKV{qQ%dXI4)OB<+byA*hJ&TnlQu(h3ssfyq#Mp-<@l-NJ* zIZY#2jmdB-@R&bILtHa4O~e!$f-#ADADBWCp_P$r<}pSYP9-_Bt#y=A2o0M!#i=PI zMNyq%lxUTPb)!^rjPp|ta%lq`Arp*YBDO*>=hB2(h7cysQ=%wKt%~C~avDdhGxWU$ zmFay)=N#U2yngv3*294Jnwy)R+vhcIHAvQQ2t2O_bhUK;mfM|?=3a@@EGuEO%(=?C zInp$ecUIbSS1S?s2zB3+I*+M^oYNwmi{UI*MOucmu9#d=Sr#AX963#acs`;_kO5`R zs2Wf;6Q{((bl@RosD`43Hmnep>S-KhxX}CN_EU`pSkO6R=S-<_WE{_&QX+=L`7G2E ztL41RDKQK^FYa%+yS?GXeTOa;=M^1_m06*83b(nXgvcpG$S`cSe6iW^1(h13&;j;G z-o1Uxe!u6#rw^P@XC9xPd3m$rpML&Re)9UBuYUZR?aO;scUyAJ>>nO^_x*dmfB(p@ z|MZ48ANPc*&>KUiE17^?|MbZvOl_?oaRnYLs zwJK4`TPeCTwKWflP((qUW^xgdGpXl1Y%RrROZ5_GViOFh(wrrY5~NjIis(y`Z?qCo zT_aOKyfoTI@Q0;juoY#@#aXV}(i7Ek+C?#3TA{8bzeCP`EkZCw6~v>G!PM+DE7BcG zqhYPoC5zxumb)bm8&5`%e&K+28R)3Ze>CA8XA>AsV3rAOFq4PCZ&DOrn$<> z;y%drvOpJ1ygYY}5dlQ5l8%{Y+5qAPD&-m?Uf*NYNch65t9a80CIiu}wO z<29GJx(WSggGx8k;BID!}Gjn8?hS1tst3_O!1wCf8 zP_Y(c^Rk7P#c-J$N~B)bN;gILmGillM%B^_?v&<8oO9N!Dvi3^A_1Cf-YPBMr5R<| zmald0W12Yalp|GZOx5I=q?T?$=dlWkPgfB{c|EWmZn@oMz%z|U&N&Entu!)+7U9*< zIdPz;+9ZAARLrH4Dm)%X*83wryR}%mYBhl+BehjZg_J=ni}wSoevQ!`IfK;>r5$68 zOcb(J#3^#h6Xy~MHOp|wYRQ^DpNLbU>sDB87*7XIr%9Yjd1M#{hJKKHrAW^3akAtr z1Cv||Q_74}U`h$4W#A5Qn$8QhQQSF>bw5aEWz5vv7M>vxQX&>{VT(&clS>muH}{Qd zRD*f!X05p8x=!j~)ftR(7%aM065#;CKs~=IPhqjJv@`9m<{Vlro|kz(Q|e!5Sk@&5 z;u<-rO{0S-5huv!6v@?byWNs8g3}()98M?Rzk5%Ofo`|u=Rf<3tQBuRJuq|+D5F?y z9WP(MB&QBzw73YB^kp@tw&Hm0ekiWCp5ok)SUkn0k#Ol{3jWS(0h*u*EC` zo3DTVGh)a*e0pYooXEwHq6ltOHOsP)nKCzrsxU?o zVvZ^Ca5}O*9Js%|V?FFxzue(W5E@cVtoki|-?Lf`B!^rfwvz&@%G~bPy0Qm=_KN|wuDj2%F+i#oU)K-sw@Is6H9941xZFcaK`#v$mQ+6*??#wPjQlxAt^e6Q4$=Soy=-H#n2|U;p73 z{Np#@FddFeDf1udiRtvrYO_Z99onrJv}GuYG9~`?zy6vx-~N%0-~T{79k8}16veu8 zd~tuzzx>bt#LbJB{Qghh@$29IJKgS{Uwr))|MJiO%=Xm{$yT&>y#4bJ{OfOjhf8aI z_^{{n^vti{KSG6LvOL9#SwTG=2+!}?^{-gYnXa zuUPMHNaqBn6Sicu_2ld*+TyjQYk8q)Fa2UEs6H+(JT+%U8Yi=xlG$!IOw*YZN3`w) zsB6G@C*q?S|JeqyrHOkl-{ZPOPR+9%Fq9(wgU(G{RyE#xYAGB~2mbuspLp};&*EP8 zmYU=lq>Uj})&6@CMV2KaRA0vAEl$rFq0HrW@9I{g%?o>laKg2&nQri`cRP&jc>BY9cEc?{`qi&E z>>v2|-~NU%oG_hZj1$j~2gWgwa>aK8ufF_}Zs$o=aX3#rKkP9XHs0g45}`8%oJ?AqtTs^)H-YN&FCQCb*b$nqM_ofA;k&Z=DjhDglUxTwUrs3RT}H8ES#r_@pNVy zN4l=#?nW`PC#TTjyP_<5h5@U3jFu=gZ8U2q-{a~vIZJ(b+bQysfnDba08ttj%REw78#VXVCS!*~4ozx@WIJ;n&_Hs?&8A~8+kICUD8Csek)d;2{#BzjkQaWha|W~iPV zK;^=CJaP_!aY~#{XSQ3RfmhW#m$1q{)0(JfUQLg`4iJ-%eTf><**tB#d- z=ph|(=8v;8THY}u(8V<=r<&>iVCNu-4}9K*!wX2acfiEQUvB zv&{8t*4Qk2FEcN4`5ZaVJeQ%7QD+yvQs_o$%eA(hQ(Hc^Sw}5bF;z(1hcXIfWR4<6 zBqw55)nu|cqZ)!-QzQbaw0ExULM$vww`^@Lv(H6DaZTV;@_U;RtLU6$hdW0l@FUCMFnJLSz zFvlnqpEA$4uA&Hv)aY%%(RNrB(*%ajTD!og0ow)av%)u0T ziNRi?YnJ)LOq7_H_49mX7KX@7AgLs;xy{McOplzi>kFSp;{CNMd^WqP(uk1i>NT{; zhtFju%f435cGIYKa~zC(NiUsl`Ky}nBD|@K$-1UP7>ujss|=E7Jq+Bjm2n7J3HqKZ(gbC&m4 zC|GYv8L zN~uMzklPM~rS}%`8O>Z}l%nrEuU~!1TX~;s|DIroO zIAt+tr~FC!O=rZ0;%KT&Y2+|wLNX08 zC&inq6<;%f%2Xn$CW z&J7I1z;?4?HS}~{$7=8ls~+F^hIFQ72t^L3BM%P`JUl+K)`nmH=u7VIU!YtE#&Hg3 z9`_G?eEP_zPoH>rKJw8!9v_c9Cm8*}I6}q}BX~5nHUvh<=<|dzX<5i<*^|g;X~fy2 zji`ca%9xtTrYZGZVX9~L#}h#dqOBlN5w(cgUS_L?R3Ozv*E>o~jIl6knuJFlK&C0s zViHBGHY+-3(Ar|#Lrk8Dwz;gpr_6dtvS@0#xkJ~9qcY1tTx-QnSH@0LY6c8_zXjXz zE2N>XxiV;jZD$EyW3~f&-IKK@H{ygE-!Orn;IGSsbEoUwUEmdJS%av{gU@pO`Aza*w{BBwTpDwWQ63`0-f z58@6p@;yD5#QWo(Z@>GNfBW^n^7#0PFrKBknF6(lfWl}C$}ESt?>(#anql(P^AS~U zWpE^%ELnjR!4cP-Ks&)cs!9ohbIUOjw4){?0;`xv?N7-L6$QQIpGQJWgei(>BUcWG z6X(1bKA{TP1Z7?pbk$Ip7ic(#3fe96$Dz&&ROU{z_Smb@BA`ZsV zq-NxTDHj)SEkcseSMJ!D;!+r?hQc*%02N9h7>$TJ<#*_6IERrKC%m_;`!%;aPb`LF zhIS721hqn&71hZ-5tQLvVX80|MVD#M*jC83V#+KjmJ+!^O{keTlM>VENXd!wQCwHs z?MlwfQV1au;zW!=8X9F~UzQ>@N#^TmIumka98Z*(AQi|`C{MYF2x5%Xm_Wp=Ew34I zgp@4HX4R3aYtb^f#c@c^;20w*7Y?V1G0M*@S(dkzM2o z|C?`EuR8jT=WzPSr#Ij6Z~xDK=8ymOJKjG{{QKJ{K1IWn9qVC>^_JbM9c#Y=y~8O( zia{E;x#4Ssn@}1#LpO9%X#-%yJ#<#N5px8~Zrg&oNMGINk_zPvG0EV=S`n+{l!Qdl z@>H$0qJ%9(2i_8PgCUW4<9%@>|yd~C)A?UhVXUCQy0-r zS(fU#xx;62nQmDmf^(e(S%wQ?YKbI*Mf4+s;Wk(>v!h*9$HiP_X*R*Cp53Smv#RA( z)q>0)>xEX-8YERU%FOs@!R{L6T9&-fSR`}4;loApamj{n1M!&*B@L^%OUYSYR}svj z($~nm&(-?NF5*hrU6!EvLbdslIWI5h3OUEp1l0wx#?|Ysh{nENMHF2Sh6>%N6@m^H zH@%P|)Vy?2S;ZBaRsR3>_dX>=H)pm(le*=A?64Ah*` zSkuwFo>jkMb92M<;UkAnBVnAdM$u{LY!Aso5=Z7V32~!puwJ+9bwjR+k|r_%*J~7( zQY=+D1~YJKXTIw@?%fMkD~VSrB~x28hgRVF0c8v+Cqk)`qpmak3xRH>;Hp8=8QrW|ke!0RL#!FOE z`*#H(Uz`KF30LO#8A8A~%inzcHLq`9P%8Z4kKgj`pWksfj)WqSQyEAL8KXVrYFVfy zMJbXosGOJFPJ=}9*hMg)(Ap7779nR2OnJl&fN|XJUhw+mYmCx(W6+(WByc6Nu^n|f z;Hna8Q@d9}soZKuu|4PAD~`!<<8MjsiPCK;Zp+=vOiU5$EY`Wj(ODZl)EI}gn%)r~ib6^y2uG&pC&u@R zhd)0;dPb#0oHA3CCGM)OIDPy7vW`E-KE0zq{F$M1lpmgW_g@~#FK!4$uHW%-{hn;+is@bpLuk)qu~k?ORac#}!g_+V@^Fk^!1+;E1C1Wv0#OAt@T9Q!| zV=-PRf67`BMNNUEoYavuW10XUWm;rq0y3$DW$rbTHOkdM9SpguhNPArokq}6#uB6A zyXWtC+&^<{W|c8ZPajig&zYI{)bfn0$PTrt)U2)q3(e)#kir?6QOw!Krkz~6Uc{lX z$|S*Bs4=%QUoW*$&LcSoRA~l=By-DL3zh=9Zvt0MEtyzEl&!3$w&!53b*Vc`3^<(p zEMwRLZVl$nF@>r1?uq^W8CwflX9i~(EF2F{jHf;O!vk6=)|)Nkuz`{(okg!aT31FY z&-;=6{v$cTm%sd)1D4z>51KoJ8~&JpHDm-0>{&teps>gTb|99wY%p$1&+tF zh|^pm>O#_n(yt`wDJN7doOF_VKi&4!`tz!`F_tUAx@7k7*? zvp*fk>^L7Mw6_e~6(J;)R=DE?Q${oAD%BA%nr_oj>~nj#GwwHnS- zLRkf+N5{g(SiXF<JZrYj$eNDH`JdfY_Ax0L)$Sp za*k*NIabbxz?(M@91dqV_muHKJV#0$>D`vw)h(;xj$Yq!n=Rjb@l(1yv1->mHU+V= zhEyTuge!*q<43$PC|%f(Bj5h+x14`?iyi~`71erjXPL%{k%>@28;7+WLk&Ei&YVt9 zym|WpWjExU*sh$+T8k&;iXw4(_nsf#yyeZCH+=ooEx-E3|H9vW{Ud6zJRe7jvluJl z;G8trj-nxl6E-Dw>kX6A?5B~HH*`7iJjZUOL{7DdahvhZD#mbL7Or~PlCfIQWR z(*~<8IYgZGgb*>th;ZU`lo=T!bbYzGAHnNBSDLM=NCrCTq_G7}S`r;^31GA&Hwk}JPB zW81P(Yw7<)5OB#3FQqimgKkT2G40F=a%I_3xGN-hY0qVYb~0bi4egFmOHVj2GnG4mjJ1Hymc-E1A?onn!v61h;%t*}=am@U4wIR19eC3kqKF5E^ zm2S0vyC!)SyX*Oy=q2*Rn@mxe6wAdqj?9Qum7PmzWW-Vmsfn9p&H`~d$*eX8LYSDw zlgyCY|DO^6xfwlkN(+TYDaA2|MpP?HOwcu>+!%S^at)iAR?FJVbdf3qq zYpjtNVq;`xuF#kkor`X`bV?)2N_6EC2RP4$=PdDg4AOGdnGJihaid7BGWUh*+Mca0 zI*Qsv6zYFKQ;=G*Uj4h$`eyT4*81GrvOr@R;iw4JoKi(_a21iLTGY!N*DyQrtGXf* zG+|0r^4?3kZ)R}h;z)1e_BzKswcTEy49;k#X=KVHVLbBg(>vZiK45&0U2V9zy{8Tx z&RZN=b^z_?sH~Pq3tda2&1E6|G^&;FI;_)lZp&)u7!L=YA3yQ5Ke9i+Lzm2tzZ&qH zo_#qJTfDAm0$bGt7P-zMfJ;K26W$K>m;GThtNc^>or~1ExTk5XsdYf@{TY) z@!fZSVzaSy{wq)&B^N@h9FKvVrFV(rL<%EuJV8y2<0#K&qlKn5Q!?A7wy4YSQda}T zFG`Drt~p)KK(OP*G9%w`IPDvORQS5GaOn)79#NG0Zplp?7)KXP+yP9@2It2$7D z8WXO-TFYw-s-Rt_XhopN!K9_xOF?pV$8+R#KFP4XR%#7oB@cw$vJaJMO-56JC@uqc zYh{sAN@;~53uZKHWD!~`Qwkh4=I8GK03ZNKL_t(Xg=@>_c>pMg5JBB%l}KcAi4?8T zuEYA4Wm5_&*Gu?U!z@Sbh}w%fvqxF=G##cQidSc_&ftt9A_v}yx3 zNmp8i`B#G@`Ft&%_pDbd?rv}C`wnf?qI^G3fm4)>io+DeWt%FcT9k4a?XX514$I(8 z!xTrRl!)p~(UN)9`+?4{$f{CI!4%2JO;e_HnlN+}WvCI>)}w62*TlLex)K?3V52-6 z2kXwTS#=GOS3zrHu1qZ(@|YsWj~`?xvr$AnQmP^5!t?3G({az?bl~~viKoMfILX7b zUs>F+Bjy2RgSVjCGt4pmBLwvA3EG>h3R@(+7!@4oRekI z{&0}tbg6=dH?P`A0Iw(I3743PBMUW7H=#s z@9+8I^^bV@YK6jzOBKba3J=!tz8F60j$?m^UB8myLKY>UwT{jU-d!mvriQ-9Sx@II zXSHS@*NoxJc|3`$H^=rqLTfTBs>qNkO%pjtZhXoRQe~PZ8Te13WwIs4X%w`6PQ=^@ z3$c=mp!?2KB!*1qI#S8xnp!SmLt&Rz7$`$-?s-8&<%VR^vKY$^?K}_K^(7-xw_;r~ zsvAmtZWddyW12Ei&zW|n<<#UPGy?~z=2mPqGJ+BcNmg*KnW81LTx;7FVy(g1Z1DH5 z>F-`qZf}{o70D=U-;vil*sSmr8MX{P-Fip2-ZHGW7~i25eei{awCuX-JY379Bn9(0 zp5}C<|D6J_<38pk>hA~Kfdc#MREWw02UDCN0(`2}u!k6R7suH)`U zuXuTP&sW2iS}X4#Kk?z;zvu0nKk@w^|GR2BUzxG$2lj2ou;52 z!-UdS1ThG1ateu%HCbg!EX!hePMoZ&3hLXK=9;>o@8rA%ZAEaUr~xRNho>jbc_NH~LrHXHWHs)&>j(Ox*}PbB`_rFrB%|xZ zU(N@r^Rftv32&6-hBs80TstFFo_PV=8kaftS*y>p>p+VbXzq`SY2t;tC~_q(uAOC9 zOe|Gstz?zK@nZA6a{kt)?rsaaxrv$^zglGQZ;k#8(KS2NCHu=ZSFKw9tXJr? zW|VJ3pc%U+?+Yys8r{xY)o{Dlwq&`~wKcGxtGz4oJWw+lv58#e9q5L7ln+dmy5z2L zf#ZX13qWd9(HERClq~PNlvc~nomT3 zHiTA}xvrDCw(}V8g^H5|Rxp*qm;zG}JhyXR^03v6ytR_iof50w;`}|Q(}8Im(XOLt zPbg=U@}LyQX+*bcFr6oC5t_^xgiOZj2IDs<(?hL1$3RJiwf5w!7)xS`iJauQW30n= zouKr>h|-0WCY))=I0~smI_G7M8NY`XDi>PFYBR1-eHPOu zE{~K8CSPSe>e+cZKa=uR{^P}+FlW>8R||Zl>Jr(o1j1=`<;kCi)otjeAcn$tIFp7G z-Fhth7qb|X3qk}Do#?P@ZK|}Oh#yA&toDKLmkCkeBPf3r-SqsH4#&$HUwbF z4F}%ND=io$RIPMP$TW+#OA}?zePS+9vm%y4=NuiLyJ5xOef<;u_UGU5WyWI|@ z;e0-DI_^;v`eBfoZYJC`*K3%gKx$^_3_qdrde{+5W&C>0`-caPKi?4Z9Ob54Mza&V zXO?G;QU+@@8&}wDw!D1xiWe_laCd)Cw;piAAVX#A+u5E`rIJ#BlJLVIn~=_Z-J(x^;&uig%}veE;~KPJ2$H zEMrRU_;@(;K1JS)iF0w>-)#BCE64x#fBc_RcgKJHkN+3_6Ws5%+}_*}=s9PDc9s|? za)z6Y=l*8LT5lj){t_I=C+UxR;Fn*%=B+dQ_S^5M#-L1U6u#ziE)}CIrY%{W)lCf2 zFuF}BGox6;@xTnm)uoa`M7L|3XV>?PG*w*c;TF4LtZf98<|MkJ2&G(5+6!VGS**W# z`X*T1QNh&qq&W{pKfcgkKcHp zCW2WSkOsVn8#k_>X0Nrrr8Ok$n$o(#(-?Ebe4EvUZ;dL|#$s$>*zDOJ?uf$y7dGHG z%%zahqGEOvQd6X{5-{?W7;!~@_Jd3L;w;hnd`NoTp$=cc+QM|P7;h-ekunr9lSU;w2CX0!S~N*)at~XE6w$a z97`AIgj)12Q)(lXigjuf3sS)(k~i#(;KgapCXLMy+3hTMhmphKKrNyPy8@5*_e|%R z^ZgH8igaqDVJZt@i1-+>wP=#wm}_r2A>#djHJUHkc|~jPL&Y#ToMCB#SVyxC=OWEq)fY7md4~&%vNm=E8flrCQ)XTgF*sgL zmNDoVCv0z!7_|nZDJ`j#%yF8zJvAMy3YBA>ouv-9yp!gQnj+f zj*d{`y$;8njx>jz|rm>4kxM!&)3idah+1`b0Z=QC0kk{JZD>#2;ICo7!Ln_}{!)2ZcL*#r?W18O#)TXtXWnLKKrdO9Ff~{%2wQn`fUnwA#omQ*G`df2DPCRyx70 z*>pvbi>c3ea@z?by()OEM`o>l>i3asv|g~SUFvpK#(O23vDdWwdiSr_^{O#7xz^ZS zd%@eY;m)}5e9w0tXG1sOwQIFMC{q= z>oe96-JomIwLYhb4wl!QaVQf+o6ob{^5FUXaqhtQ1q&!`l=BKH}!w9+HY zH3VVg*+g!hd)io2Cv7E~eer!(^M>v9yL6NCYUZ{g{k+s^+?Z}s(QD%P{V`!E6V&2gVqA_tTF^d*o@m;q~h`9L6otTT1jg|0ta-vHt#g z=i@0{y13CrjLZJDV22IB*N{QeW84Q%%g zae9Y0r@OaN@xv0@)nP`5acWYp?87ZaW`|q%of>+lGy~jp-l$>*lZmdlc zD%TFnReaTsD4e3Zj4hq%AF1M@m3~kHJiRZ+P%tcW<+5a^Idi%!Tsl5?nr7yu&`M)k zGM8m0)xvq6wZFLP1M94(m8Jqz)d9?05|@18GGACOGc}iv4ps+&GqvLc`(Rl*`oM7Q zsJFde%v$=8K{uFo?F!UC+p2!JMYI#ug@GXq>hiIM7A@X8HbI4TvDzP6o1tV#xoJ99 zISk$I=xNqqy=QRRl{*^CrfJgCbo|udBSQ#yXRk>U=Yl#UZSRa(F;N|Up$R%sszDRZ zOValfUGxnWZxlx!w>J!a#AArwEB-kK#6p%rEerGciMk|p#CV4dPE+nusZBTV^}}nv zaLRcs9>ZV^hr#o57ujydo){NWny}4~MF&a2>wD)zph!>P8Q`WhW0Fj%hE^-{`ABSuyRTl6wuYzENe|XiAUB$~OtoqndYNes=Cbf`IWjyx z;G9)lbScbP2f2@@Gxv`Vy!-fx+rjd;e@LX}$klR5jiof^QdnB0Af)OL=Wtug!CJiU zwE-q!jV1a`H#%I4GOrjP70omyZ@RNl@g-VQVH-pP!3w^qt2l_kXH9z;3*O0f(N?lW z@5{D^Xe>MD`#@a9>W>efxqo`3EDJ+z+=hYM?UwBj*~Ng{4B#AsrO7~ZmCO0UKm7Eb zpMLs@Wtur3PuGpjTTgVFl%1E%G!;&liQF15Hi3Wn-3#Jhye7TeV24}2fBcF6^ACUE zcmMbg%#RP;#ewf$yyTzrUogJ19MVW^1EC0&LJ6fi={tf?ESFOGd|9}^eiO2+V2vf88}E-#4AX@#Kw-GB9J9_dgoX*0u zM8v(s3v9tF`TY>y_Zp1!-^$3LvTV`#jc)a)l^AOaJJ`O zCOvdN;}=UaRA*Ln%oWI5SG-vNdZqFOE=W@Y-Ul@^n4*Rtv>rvo5<|p~mc#DAi^GA} zH+SsEJ>xLqz2z`QUT*g6b~_|kqO}BL@aQ3DGmMNes=!{=9MMGjWuWzr*govCLHm1r z!-d9ZJ=X4VP7P%xX#%yBN)bb^i`GM~=(|i))Rx5&&B)TUcYIETylA5Sv@Fb35bGJ@ z$mZsbo10t4jrPm012nA#>4X=rE=A|m05J{&Aw;|nEIA=n2QZ~46ts)DW86i_7Pb`~ zX*S_9UHJ6zGe5rjnQ6%wfmeqYj5m8eJbdP-ckl33*gDTXj=X*I70n1XSYlat<1KP| zLN0=tf8y~6M18Kl5~&`TpH!-k%y54zSs=M8)WiK7$kvVdTxuakICK zcb5HbWHXKo0|``-Cd@M5Q5TSN}<)L=D@ZN8etd)oO2ArKnVVNcA8TnrOf$! z;oX`g zD&PW}IC6Iwh%sF2h)S(Yv!3Ky?|=pHRfs;ah;W`}(z574$9koxM9&zM=(42T*9J{E z8L#A`(RsWH*rnl$!MTy-^m%qgyEnx)S`_xt^XG5B=61j3{q)F13g^?AWiqr3X`b}6 z5=SIPPW8g&;gJ__zrnResEt?S!12R7P7j}Ht&(fGBE;5&tfJsO^eTzx-mx#R+5bQO zYW<>lZBeq%@V@l|Zl39WU9gv5h=dLB_8B3~6|1+p;-5R{f6<{wCw`d53UqDKI(EGu z=%wi}t`8Gd%(r}b2Q<==)g38r)og3JAyd|L{W?_W$$zg7#a1#>DkUea+mY1}s%Zo55!U}!jHsca>YBe+ zjkwZCHB)R;s!y&2XTZT_PUMmaqC#ftbd7mRoRaR9sc2fgtqA+t^gL_S5NIsSdFJ8i zp7)>L({g1SBhfidtVuzAe{)WV)gh_L78e3>7ug>U9PVymvu7%vr8=?%&P(I|bmD0$ zCcSzeLfX<95fA6V3+?FTQ5C z-Lf4<-Ba9#bWu!xP7Boriao=cPB9?SF}KELMbsCMi=Kp<416E1E~4hx!9`r$^dWN4 zo?;huNZ|Es>pJD7whFD`S~sfHb~PNX)fcO&u8NTG9nUFUJe6m>=G8XJ)o{ZXr4L^~ zHov5P_VhXby*q;NN+ul>dyv1mJKXcr<K5#xAdH7h%t@ZoXp6iSnowV|ls|*WXi_Nwso5Pb|yK>2%`pc;xBn z#Ih_*%c7~s+;olcj-_OBtCU)ZLqLpD0fP^;ZhCbw65N2X4pR)cTM&poU_kd$0WUCL z777Uw$f-~}DKIS;qEo?Ns~BfWnQ4~=lMFc*&hweeeBmE|_>uR=nTONFPw(IH?jOG4 zS9fEj3P z-~Ei-e8XI4ihE?d8<_Hu%XH>+YP2$Oe>^iUjlqpnFw z`HtyW`2OPqe(;L6ZI)uxVCseIx!s`MrF7J9SWO}gB`>z#y;%*p8YLH2O`X+RkZP_2 zN$F?d+CQINy6){NdJZyuFHvHSVt1$1=}JNP!}~}6{)eAA=0@1vvNS`>jb)mz_l{=u z&zAD#*@JHQl`n9*J?&Roe~qTEZ>66nEUj2f^rQ?`Jj3>u+ZS($ktRvc zA7ZX|U>#cr9ju3{cxib)6R5vWi38X7ryHi4dB(u%T0UT{rx=4Bc1TlkW$Q;B7B`4d z2^W=KX@=E)&pxlinl32N#fnBSPS0kwD6Um1)|q~8=m8xk%%T;9Roa!7gsC_u48CDq zWtooD@@aB`e<8#SOzS>U}jAmb7p_UvQ&iw1FBFhm4Di+Z%2UTY?ju)!>te zQ3BnP$)!=}2@xepnwF_4(@J8R7wnV>)*&{Nn0umBjh{=-lv=Si^!-oGY2KNuNFdV4 zRp+fwB*qXiQYp)YP;I{lIfilM?)H|$cE_7HZ+LNgN0}1e|KSgO#_*xMr`k#(BL$A< zGaoi zMhN0L_>r67*$1!5Iw{y<@WJB89ljcV{||pdycHg&d)|FI@$SRS^x>ZEeox#^TxzEI zz*3u5jCMgsR^g_TJbfJWPU}54n?4V*hAfauBY4X+&+MWw4g+Hm7#j`4=q<8Lv|MQO z#K{YThpl%wu~?^fCM$hrYm|n9Y1qNjZg<$4`D7B0mlMThFojQ_Kk(Jd9gI6HBX^q{ zO4XoP79r)vyv&>*KJoD39mmH9mXtUhPZ(oK&G5Kf*uQ$gyW^4XUM>9TH$jbIZXkNc zAr_)*G-geemkTEu8Ha%?mXa++1e>5NGdG(ND+Q5+6Uz_=Zf;-j^3@yMV0fG@Pwzj` zZVROtC2UGjGKAXr$gN@}vyTIr#d> z!j3zJ-3@WGQPS%w5I3Qj`v1LB%X4D*isF{0&ub?*mYm2rU!PYx9aH)pN!xT4m8 z)UPH7$U zQmI8lTtz%f^DKB48%cgcBGaO#hHbyAI`8^@-ZDnLPgv`&YtpsytJ4RZbBvo!$FTQx zTsn1l+)y?fjtpF8HAi@B7)Q$}j?s_(7HCzGx^~y=nm$KuZ85*7YqM+7VC$c^PDxx7?asP2n{}m3JkNBXn25FY znfd^4LyIfWWQE=+Ah#b)!!*z$Sq%k7_}BPu9d3wGSeAToz^(j zg%%p;k_m?myO%Gx*&MjN*)W<$%QL!s193@(e6KoY~O3XRw$Jz}Y&t551 zifEVE^Fv^t03mAx}Ba8 zkthQdc_aIMUuwi)=RFEwL>OJ`k+-pG)t}i9WE9 zd-qb+RlJMs*wzu@^4tw^ZGZS8JtYmPnX*ijWx|iXgIgO`DiUBZnu3eLFlU&nVM!eg zDHYT5FR%}-R%$*&c|zm@!7+>mZ)RL;jNUOf$NlGfZd&2L{crw~-~5}u;(c5AkN?kq z;Qn`ii;V#>8*&|(dV)ADDy(SdbH?=)ZpoQkRg4l8%bjcGCfpK(@cuMw0!cin8LF`q z8=wy)x3&+Parz!x(BOXQ2RDl|nkF*+QoOpEoVV8twkDE#OJv{dY^yj5*;%HNF)k3q z;&Q{cp3e8$bKQWH5>uP0O%ZY4dqRv1PBDC^lkhMt{No>gB45tj#X#NdiB@tNd z+27r;`Q}d;U%uh?@CrX{*p~O)hArQG{cDc5FS*%md3E!OmtVc*c6UnztjR1cVT@zv zw=AZrh?EpF>q;S7OT8Qq*ny4vJTce~|2_Yq8t?CQTb&O_DWJpyZ zGq{B`W#-FgoEvEvHnotXfOXhi)U~E&d`*ZD2le$##{?eIkU_QE$J{R z;aHL)=+&KAJMO8m%<2YTW*t_RQnYTn38_}Fj@p!5QTpa%ox8d$ubPlCcxx!YYz(!u zjyR*Iirf`}B%%Wu=TwYd)0Ea3#8xK%WzS2;zjuM5)_yr&>9eNesu7%p$yugg^$?-s zB^`#_XE%6oLCqgMVX-D;O3_387!)t*dWY63M%Jp&SIUX#>@~e99cgWhfs*j~+>y&V z2nx=!=_aYWVZ-bFfx{RS=SgN825z>2+kIfS4dkXnA}fu65NL|2u1a3%{F60rqau?i zzDO5Nj}IPk4PzBGJj6)N3n|U|+02DhDk*D4fb*e$4U2P?&>fg_svMUK@9&>@|LHT2 z4^J#pQmRE2#5uwk*^WC*v9zV&y=ZqQf_IMXW?%@GF?zxnup&gS>6Fn7?81)033JV~ zmPw~i&?@ugLMc^i2=b!ORa!`sBBP}VpC2Fi^!UWjA3ibO+%Sd>b~d!9C;s~Pf6s?c zpV$qNy>)DY=fmfpnOh=BCe1UHN}d-)gj5SgV93HLEj*o1JY5nJcDy@Rj&aM;8<2^e zZ3LP4(_j6X+rx(6eDf`T`Dg!(w=Z9@d%0sXZgpr_EjPD!EV=UG<30cMhwqtAN8Atz zg9_kr2y8b|Q}+nls3x=Ey&5%!h;f!BEnJqwd0F@zDyCkT=1R#EESXJHla&OobrR`9 zT`o`*{p+h9+)E!=SL11+cO5tFpZ6iM@rEHpXqC|q*y_nsV>zC%UfsH>YRb2netzf| zGp&ZQB- z%`=wzicAwqd!ic##`4O0w za;5S3;K?Wke%x#r#(~@08{T~N6)*2zu-$GbB9z6FB~Z-3QkCZ9qVJuE2IrO3C0RwM zXtlV3QYmdBddtnt0UIpCZbM2hsX0;RgrrPe7PfI<9HJT^oc_LUZf|%y2DZBc<7U8M zdG~(9`7#m54NJS=qN*vE8PHATQLPgQ(a#3?YA3EexIZlc5(lAU| zgPPlXHyL=#hShLf`@l)A6r3+R+|^*c4$*Y4GR`1wydvu92yJ6+H~Kvrbe=owpD7~i zfaGef>8bW+b%>3Tj?t8BfBY}j5M!Yk<|T1FH>!gmkz5*iDLfn}KHWaBA9pON5;uFE z<|7{;9(kG)^JPYYrHE2-qVp8gD2nY^Ofk>sfG>LCO&|E>&IeUOMo(KbJqxv*d4GS; z<>^RHiRrTNcslZUoOwE(csxGwPd|UeJ4Y!EHx85{%&GSBMng&UTA8tSka876pG{8q1OhaiF!vGHVUP z>2x8L!ufn5x61K+()FmXt3C{R|E@5M2MmV8cEfHH)gVA&J4Uv{KyYeQMpSIoWKf37 zBga2xjz0+J-~S^taMp8~3UgKyN=k`TGneB7=i?)mN(c^_EQyKI7V>4LCBO|#btY3d z&V`?kXU?TCdc%hhx!ZV}bKK{IKaYHR_fK5TkK8|G?1rm7r_?h2+`!(n73;x&t`QP*DM`6wr$wpET>QcDm3yW!#ZDYGPyxeSQ z%@BqiwHbc(?XURFcYnb!>?y`^PL(z_?y6@~17;j)z8hk!!I?m5mWN}axDyB4Xmw&K z1*&DboNv)*U>8kT$IQmL++ zlPcB=;xnb`omARNRMLCPHA#uZO1aJ}%$oL+XR&ET_jXI;bI&5-r*i?JT0;zZB1t!2Hp zEN3JyRjx73soDdagZ&-%J^sT5ITSTIhBYEHCf(|I+8^ttb9Dz!a~ zv=WP=csveLCDX9c(NIyzqxCCwyTv+#kDgjHVdJ@beLzg+csw97>)g>pZD%e^X2f7+ zzz$CzR zPi*Z7UI=(SySJ>h2TdKnqsg3G;o<3tU+v$pz1#DrufAsYYT;-1N30JN8qo|or(cb@ zD^bm$GefIM%HX4#8=U2CG(_*%ZAY?kEX{yae175(GKZaGI0TYc;bI>h#Tty?Qn+Cl z7B<6627kba(@Fy`G*>XD;vH<-@q=^ZgIp#>%_kXJk8LAU>s2_&6O`&iS2d1wN{FG z@5ov2=yKIBzsjXsvMn@R7T_121k5oK7d^dBQtGYYWk8 zAHAMyRY((ruo*BzWTD}V;BC`DW^0&c@V#GqG2Im3R?3U}f+okchrHF=>yWjQb6F-* zO0+yZW2mciLbH5P=VW_AwozN{w7b@GJ5~cQ_F3SR)fC>$6-llly`G`fw5JD+R+|P+ z`&`sok6q2ttlie`maRHScS4ZK*V0~4bGnzD+(*5bU9f~^2f@F7s= zN$>k!=c`-=+;Z)sx1AIf`kH3D@v*haQu|&18k}4!{aUAE>G0KieO)X5fBiamy;oTy zYEEfZDLbW5vQn~2uB5D8^SLTbwRI!^rB3?(HVp*UW~iH6#?67(Z@vNVkd98$WWCe$ zzR~^Nb|Rt@T~zN{jSYy-;Ehq@jT1dF_Vpvyc_BZhH9g%fd40p$^l3W(~!0 z6^K{8!HBuehOWqb(@Aln>HB~|dPRV-eV%2zL6kgI5kDn_M(jUN5hZ-) zR>^rGrKQ(f%C%N9mkiygdOly6ritxvhaCpoZc7+;?6wv^>e*xTo|?`qWyX}&Yjr&0 z9X2|Bjlr$CSh!h2Opx0L#f z_5Z@AZ;X5qj8VtNS_RSbf&KaD22Z2O{~>rBP*Wl|HA=WnUrcExddJ=y+&(hRl@<&c z&tNx%-AndgeN6?1oVgP<`<|zTrBsp~dcZJaoYtnUmC4o`yf;ldvyDX@sIFi-Cce9x zs*<{_F-Thx)RG3m`P6AF5@yU5EAu4K!zKI!&hzk3wfMYtktCu+R4WT1G zyRhYYXUf(2VtZ$n^K6F5b{yDmBAYR=9W>PzeIrr7vX8*z3kjcXZV?Xq($gJ^Q)yI|oT+7oy3mrNSvaRN zS%fxhI1@NMJn--S>R<3b{Ez=Vy!aaMY`1~`>39DJK18aCq$U_LOUp1Tmf4^~S#MCJ zRaF$UcA*t)2pDVdF@jN)?QT1ea$~fPEJZshy&>03@E&Q}xoU0qWA#!~XLaza4j|Lf z_v@-t#F!Ui9x+t~ir^gwpJA~4=FJ^#dCT2?;P~c3FrL8& zyfF+u^r82N-;9LK2r+WAiTvwtzvlM#j$r_N;`NKjzqH@*Tk{pAHV)&4gCDpFkzo{a zJ<)PzNi(eq3!bTEYR$AIQF2!N_cD=B6EZD2l*^6`e7=0<^g%by)3osU^NAQ7%fkk$ z9*kF>pS4aAaqankMzsI8)k;o<$cS~0^RjTf%#@}VKRv{({$@?4Ow&xt1woz6MJkgi zwB9AYnsG|&;U@F!?5v`=I#who7HVNM0!Dk|j13s;@pi;nry{;QcQ`e9cH&v5!xjfh zs&HNh0;V^uTfz2C+#tFRS%>M}J&L$*N?gGx`miTko%8EaQ=R{%BXwKFdq<3(7%bKytPcL3p7t}cgK%g z?I$k<2^Hx=RQ*D-H$BQHJrzM0W$0bW7DLHdlgG;iYt(2{a{&y)II`XBSmiZrp=Is2 zKc^%2#}n^9-t)uH?>Rl4FzwmpiM2>8#3qP$h;P(1f!X4%#T(CH4Vw@dd}EB-t#<$T z!0B}2{^1et1E;#{o@m?C4nbXq)Rv?#55qLab2%8PB-b7x# z*ilcP`2Oi5fAjtCIcG%=-HuzlIOLD_ir`;nTFWf+tmr`L-Nyo<8jhxM&O%`1hJo$Y zad>sh#aZrNz2#=y@YPo@_|rdm!*^f5=GR}p?R4(`>mxZ9mi?! zw{*;-Cb9Zute+3o?;$9CqalRa5&KrxvFjPZ2vv%Thh{a!pmjPObDK&gILA16oER=o zkNBLhxiVmA#*=Htdxs5?CXFQ(2JiUh)f@ixfAtr*X!zm#pZS{~e$S^L-;pak6-X{J z1RctiQo4!sSzL0?b$9zO|1w|plQq7;$v!94uSQVke$jFLEL?Xi-`c@($r) zjLMbg_?eo7Fk~xN7r&TZi(~Z9uUJyOWVUWx>Ro^x4d-0wgYq>2=P*q#^V)suuCKRM ze&Hq-sU5rDuJ3`h(rZ*S1y}p9rPcmt`eicLwPwJwl-xUKZO6zfnP|zWzyESgKxk5; zK9jr9!9uC}xhy5qYVCs)xVbq{T1FNX%}%Ei%VkpGwFw&=DT9OP5vz4GH5Ha+;#?-u zyr}rN+dbEj7>hMt>!h-N9p@awc1H+;5r?w@7luA?u!PZ*%Z2-o?`iXi4cbX>{RZc} zqAbObgC;&o&V=Cc!D6j&`{IVfZp$}s-}3t99lOnz+JuMMBB@fvGB1`TYxm`L7_~P$ zMm={_t!b&vQ0OUurfYBTj?o9q_LdM2w6b99!sT+|bUag?<8Jiaj2j4nWIRh=*m}dR zWHx1C5Qp)B7dIPfON{%0!R~lDY?*T-Wy?~9hNl?Il8aJbs%5DY=XB(J`b?0-opsoG z!H6)=GfOJW^99KXsv5cGy3lIH%Lo=Fw)AJKw5sQZs`s6BkP~7g#(`lN7{`$qJ-e-W z?xi*s+g5|$vxcVotG#{(uf>AhWCRA&+Vexa{!MHbh|KlQ`-@_T)|l0C!`?)MNX;i{PV+~T}3J59k%IuZH(&`XPsPT zR?y;eF{1R8Dt+DPZ-W|WFcbrS`1q0g`+J_Ap7`|nf#WoBSu&|MPSeabZ2Fnd_bMT| zCVQ@lj&{A-J+FV=aFi@K*K|K_O-XHd4g~Iu=hg+>xFug^9?OD{p6m_BR`|Pjf8?+^ zkWyy5*-?pn`1FMJL4SrO_}vW~>+rXgan#gpi1C?b<6syzict=ulBsfGjFFl%X*xqw zqib%3`Eud$@sY=;2c~&u{`rHZO_q$u;Ki}q+)=Bd!IO9{Ne5XN!!jS4=0}WFqBr=G zwSvO0*l0%>MwXm=3MSHgWX_d^ne2rh%gp|(J6?SAjS9lM4UhSW%V>E>g}D{J+TX#} zaQkAzi?3gCbJ+9t=7yVbU^DEnyU4%zum3Io`~USHIDh&lVx7q~v!ue~Tp8jG;r2DR zL!{WoZt&c0cF0l?>ku0lZ@%HwT*Y zOX_=qo`GP=mGfM+f4((p>EuAmRiM|#9vw^=Ww$``dFtOXucdL=?nm#sA?RS~@w zO8ocZgovq1ta4Vr zS9A_*8Yxw3S!mORlqM)e6VpWqVdU%m9dCy{oF;tBNPu1R%+tc}-+j-=`%k>Qd&$mQ zf@y5Gj??8ck_vBL?Kzj3sVr2PndCxcqcb=M-u79Lf!!dqZNRq$BMYr$738bsF`t>N zifG>W>)_2fO)1i=b1bkMcZ4y}b`fJ8b1JyYq`$pX86@@3R2MY-vw2rU38%G-H9BAH zeY{;5w*7mG2)Psj5gP__YurCx7?(_43Zo00?jMwRP#QY}e!t`A!&cvC1DkE+_Vo>N zIuWABHfSc%Y@?Wjcxa}P`%F-rkVQY2t&7`^=gxLhdfjQQxT^Obx?nG&_nS(%3SLes zw#suFba3RNCY4e&SfrS0!|m+>A3fg=BhDJmPbW%FP@5(>MHq%1+uauD9j!J(3@q~n zV=SAfcdBxk82yOPg7Z+Uki&2G;hVROZ}0RRIhBIn zjF=EHW9-$Lp_5e|#(ACJxQ=EPp_#@;^!1Npq#38{Tq=+kqHAj0-wfTrsx<@L3C64W zB}!#*k&+9?He98pC2Tl@0ZSV{AKU5H@$*&-Wb9N4}AYObe%} z@U$EW(c)d8Ef$%Ql0Js5k_g2h+lt?93HuFi-oE9V*KhgL-~5JGuU_)`>7L(T?veAt zvK*PEl1d>X1UG;SEY|Vj?v}%D%WuB2l;;GRJvFjG>l5sUvvHS8w-- zEo4djaE5YRm|8(FMC)m-kWd5X={!-=!p#w4@IC0D8q8oEV!A-nv1s1;YkiwHR%`Nl zrQ}MBv#swj7LX^L3rKaua8e=K&b)XXIo$5~{Nc!c`+`4v{aebC`02;boG%xqd1lxQ zyofrpY6c}T7{jp76l)o_dv0HV_=pd&YY-}Is#aur_j;$#iT&c1ZLeu#J)+tkfHK(N zh(n;1LXwT1s{8)Xb>LpVr{b)VGJE>Bn{G|-&_-4h!QJTm$?!!$LfVzSZH(4` zui2_@xzyiRTZyf!VY+{x>)GR(OenqXaJ@raMR&kf)3e^4@X)GKt5*XCrr$%?iQ_XI zUxOD_4K2Omr}sE&z|Hizb2Hb^L2VkyP9-7IC|=J|wKYmn>cy(VmYUTB*G&bbQ_qVu zW`x-qQZpRUi_ngtX4N+^uAfue zFXpWwMz*`{l_K7oG_-oV>3R76^C!}L;r{fIPv?7He)APW+;bCedHvN}#>0+<%GSVO zEO~BRwwb9Jd`@7rZpeByH2WBE-s8N-PsazOUr@Y@7(1%S(5kuzl)*#e$G}QY zhO4_mH`&n}Hc?XpH@lJTxM3UyoDr-ESU=EwWU7tR(}mAZXU?-aCSvgFz}To@yxk~z zH^zXE114;*onj?xw^ZkkU<~-`@y7L@PWr~GxK1yEuZ7TuyV3`>wG|{KeQ!(F#i`$3 zR?LgTAkOH)u&J|61!Z;Qw9;rP5qqDg)Y6Rt>Qu2kW#)SKr1XobtX-30s6Y~fWa0DU znag=*90ImAj5LZgk`+=G&Wmu#!g;RRt6kJ#=B>d}Xp*}Pt`DY6PeGf;k|s>OBnJ*knAyzm^VZmT*>Khb@wIH764b6F~3*f8{()uRhtiig1 zb=nu3Ow{Ew*q##TRRtA10~SX!m0V_Qvpp@O7>?)z6sO&lPMvbLy9ZmXzo1wctCwf# zoLytJ9muuP4>i(%h(0`6i&%P!Qbb)rgR}TftMFDZEt92j$%Rv%N#0^^Z?Hi-nDcJS zJdB*N>;*zjY=Xg7?Hz-}K3Kkabw>!6Z@>GNC1;$AL>Kfx?$ik5L&SuL^_~RyG_lQ3 zw5QC6v``FO<{6tZJFBj+ays%TaGx^2Z%y4{Ia5+5r$S4OrK;(tWxa$~G0as>KeY&R zQKVFEm0;EAkZNH`iFr{s^ca2bjc!*_W5o}t_@x_LDMb%lMtc@r(&~fO;WnvMT=a^4 zH@5f4t7x9)r0#U*HC18+;}yNO_7Pbd){^AwP*e|c^qyBuR<#D=EQ={vNAGUd!G%IR z)P?AS)n^t*Fz$Nr_t7!9$juN5KC;{G@lG%MmfpLB4mkf`w%)8qk}N&bd(LWR?j9Zy zxz^UrA~{2isKM|;80c0v`oX#rAPJBF0RxC5U^q>(n@#ps)m2%!#o~)CXVt}b%p;mo zHyTyQ&dSPkH#_HB-uHPmlGA52f^3;4mU$v(MRgk~Fk3jXH5O|+?C9H>M;AAP-zxXB@UaOZs>Sn4cdx8t*AA}`l-;O0SPp% zkkJ;aG;yAprZea9gh9~{61_l4&8;Itx44QXv>-+2^TKJII8IY*wl;u4XUR5Kt)Nv3 z_E#NmzqsMm%NOi+9h?0gZ462qHruUWt7^tl`1JlAhr>Pp^s8U<>wo?osT$5p1>1x2 zIKPv@M+~Ig7Ia3FDV&#?X%5T{?{1W0H*9%x{gSKwEBay2r{lL=wKj8d;weBgRrxeNEh31SeEe~~V zG7Lot5+rLa8OlnNougF2&!Gi(CAqL!?ueX;DWO`PKJOnf@0h5b{Jz? z-lcsif|rVR(!@BWnnOj-(Uj%9tw4;0`*6g>#O-cNB%!os*m+_Up1hsV!s?2cl$RMn$YYU*us!O%VJ)1J_@^FnpZrHZWd*L0 z8tO8PE|(>|bQFrbIssY@q@Ohdb# zh8r1|MMzd#4PIg)E({KHwM{TDuuBMYXsrH=Jpw*C5qvq zJXTE+EZKDD)00cnN&oGqK)PH`WoXqy1`?e z5yf{5QtNut1c{Zc(=1+7JHtj9hH9|R(O-3J>Xvy4^jWdr?XkXRqbkaEY_(&f9a@WH z{Ka;I(hihEDTg&3o%bRTt(j9?I2jFX^vd@fhLbI5W=&rl?qoBUDW&MZVu0v9-W51C_X9kbziRov0uxj|zbr zGg|kU>aj}UoksPQ({UunjP?@SWj7nfY=~iDJe~PnD&)H}+x->AXg=LP5>w(fDYW(M zuN>a@be-o)wR}dU#YIwJUuGhn&!@!wp{Fd0H`llLs&TI4Jk5+t;Bb88;qEhs$9tAJ zk#l8^fw6dMEu2P)Dv)J!#b_riA7gR8!=!KduNhID^6jB5#J zm;bHf4^z_R&$QCxE-ojY+&k-;Mss(nQphTjs{~o*Tye^=>jsA1HOoA6d<2~}b90~k z{L8O69Y%im=|}G7i62f!-rRlS`u4WPGe|6$I07wR3kq6lh59rwTI1bXyw2sksB+en zc1~-pdGpQB@%w9b)56txBv!@4;lStnBR4rQP$Z&d8VO56XA!X1LR(U}O9tmk>sW`G zLbMZ60lH$U^s2f*37P3UG0y?hcibJ0%*({qZaJNfbas!and@6mf3xSR)gX@#4^qQ9 zM>j~H?S~GuW*9bdp8>;mg93cZ#qQj|GDkkV|HyCt@I4<6M?SoN&*Q@bcXxL@9#16T z93yv!6UXyN$eG76V6-7FiJRRu3dik>Oe`AohGcp|Db1;vBswr@ECpu^y_wKfal75& zb;o(GB;$CDM@-IiS;JCE)=-L}4->C0)JTCnB;eilEz_1F7a*b`^U!TRI7{S#yQ-KV`>LsEH z%4Lz9Vr;#T^oBC8k$XDFbRm+oj0}`<-kk1p|M3KD$@qyQlr*R z5t>*^H|JYXjp|g&)AGH2ZnSao8i05q6IF>xltFX3-1Dl#1>ntLl zTqN2`SFE1tj1jk=E+PQdj)mOlqiyNlu*)lIJGb9+*9{nJ1yQbqHu@yUmCS0jo*PQu z8P^FdM=QZv8{bJBr?I?vaf|aEul&IIJTi_W<8&s+#J2C4rjg!z`prN$3@B?sYsPuO z8OLte(YuaCZDejc2g-EhYU@a4Mt7F#Jl*~p?R&I=G#$|1^6HyE$4r_Vn|OKi6-!l| zYau&N^@gr@R(QLJrip5XOb8>l<>_Je(&&3XIbon|>fHi)16$!XeEh1&^OUbNAsr_e;Xm8Rvl7 zF`gsK@}7tD$ld*CeCOEju1Uo*E`f*fL`;F2k%(8TamwP0W~T$+zTWU}-fsBx@q0f1 z{$GfnKU3y~G|j|P8FM0(gteVSw!Zw5&N(*QEwNU9_uKFI=imLnQVsXhL~8DLqYP-r z5|TtR7)M+pcUf}L1BO}@wz-1?^5;#aLwQZa5Mv=Ux@oD9Qo$NA*VHTyb8BrQa7vc3 zQhn?Bp6G136v%CEsAn`iwOAfcm6R8fns|49K$&;MIr2aKkN+*-{x|=gfA}xI;1BOU za~wy`b7Fga!(&%));4pcIGVdtp;}9rE1la=mC!bH6OyauB7UBo-d>@klLNo{;rc2XW4}rKWloZzZ$SXQZ+g6?P%- zDTT>dX8O9BH5>g+x4KsLM&%Mqb)nz2nLugF*s@~O+pJ|>3KoQPVb&HuHxi%EJY2t)h#IT#Ky$}jZ zmWx>y_Ywu6sw|$@`9>{53b92|YQZ*gLN0BtrBwU(t+5f$=+8=BdgzO2!L=CGCekoU zH-fc95|^AWJ94##td&cN*?Pm;Ok4F?Bw>?xues?L+N11hRLe)K&j^sEu8{oNdM^D; zsI4w>g%?7sQkUH(t2MBe_V-+Broj`i|UcS6k(r-&8LD{?r5|wF(Yi zVkIQ9H|NZFIMR2HWjgcl@PMwFVLPztHaO$S+M@kNMp-GLazd9Rrr}a>NzRR>!mQFI zl7J;rV`84q98Zr-X`#E?vbnnAdVkB8Z@vUzNfKF@itKu*N@hqawX(=O;nKU)3{UN& zNu^$d_?2c#DQ$PGG|DJ^H;75sis80Y#T*MMMCRj}$Gdw@htE75KeK&(!?54;V)ueK z`!^URdvC8Kl9(_P52MWKV#Zxx(Rnc~Snq|V;hfaRT4R6zhu;$CncJH^yJ1V6Wtg{w zg_y#{l@w!So)=OOC&hW3TAo}W#3T#kq8O(vsDui+BvOuoa4DjI8OMo`B>yx-$ybv9 zzmkf$rO~3cO{Iv-OKVb7LK$NTDPD#drP<$8RgATgau5d@ra1uQuv(YKadib<4sms9 zXmo9O{8prC)3hC>xtghx_tJ)OPH9Zls0?Y5Of97&21n7AF=p<^iM#X2oHI&WmMRWf z69gcb;*6Ul6IW?b7g^&4XPw1at1y=gb8E%XT~$M0Xd{YqrP{()Fx~3|w+bfaWoC(i zR3a(mR+Qp~SLGQ{TDSP{)dk-G zT1{!a)IvybUPd%k;uunvtkNQ=i_+ZPu|jIpgF)NYY+16REhPkX;*`Ona28n(WpQ#_ zov>A5>xRAe7*nAf!FrZ4@af(6lxd=xa;>DeT-)TV(s7HY#!aSyW%kvXDcBBryiDJ=>QIzxDX7ikt;!DF?V|8J~hOTEZd? zs22R7opV$Ax9EwYF~w2QEK4C4$yh8&F8!58lCqp*&N`GeM6w*xprnn+m=2l!trf?M^b(8%Faqo;l4k35XOzL-2P+ z;jJJlLx>nFXyQ~QAMEq}J%{6&IZ94tu9dh1!V(BI5w|0{f=1)fvgoidFC(YBM0f77 zeqeud%hhIKERm@uhM?Jm0aqg4TISP{!`b3G$8a^^H$A=TFKN0wM`pLto@&EJ-IQ3W zsm4`_baqQlf$2PRINaf#M%T=Ex@WHInG3q_m~(-Cz}*b&%`5VDKn(*Qe)`CKI5E$G z`FLU&EZ%BvZ?@dL-1GXYSG@Y-8@zL9V^LMp8B30VAfLnF2;*lExTM$$_F33$eNR6MEBgyT9g}Z@%C^eElVV^_O4s`iqzB zuWul0LI^C&9d$Zz{``m@1|G+ms*O0cvb^7_#WrOJ@E0wt4UBE>|uQjB-L!+9s4MNVWC*;LNsNY_>R zot#Y~%4=iNQYAyysFv$m>77D*PcDX(Cc%+bCG?zB;5-p(!B|Cg(Amt(S36E)B+iRC zchF36;du8*xjS=p)3Ng#zWDZMWb4T1j5QmMQ^t`n&3zk!I4P}N-JoCzP&&YHor`vrfBf zL--;wM4feP`W@D29v=>TzPqF32f~sFVIeG0?!+a?!oDr(E4e+hEfZKh-H|0H5v)3k z?>f59VJ;SXBv-Xj0ZLnJ76nPm8CyG11G}!1#d~hUe{BTa-UJ(Z#lyAw#TbbK>9i>J zW2((5D9_oj+2D+!+w7X)t%oklJ=rqQssfcNn>GwpD592JdP<>BiJi5ikT@&369>1) zSrHHw?@>vb-lhVgph!59mh9ycC+3>@>F$oh{b#my!qx?}quNgRW@{d4X#)}z)riBB zn3;gG+cIo7c<-3v%xTPwA@cAz600WEOj1=Ag=Flya8a~40Szi&1|QCd6Qk5D?{piw z8wA;GHFP;*6@;86KEyh#k|B*wLI|S2qSivt9%CKbYfDU(R4s$sQtE)QS5p5fOD?$$ z(!IoK6h|Zx>6oLVq{`hXvvC$*6?1hQV&Fbx9;V3Sc@Z(A>7kQnN-5LCqh1C<&e8de z2rsVm^u zvCXQveX43TT9rF0BkukVOx9s6NJuONkqkB7qkbj#o5uh3ez z+9~6QLE3~YV<2a(xc~D?>{wUjD-9%}YH7nob$P$4lEKQ=?S@@{g*Gc1vGV@IM?QVJ zr{8Q)E>M-`-H-1%9FD|PIJZUnI4_s1UvfjDwgqIZvIucVA6?eG+ybd;mRcywBD93* z%p8;S0J)%YVvFYG^$pf;c=_rreeY2UuCDfN7!=uVcchZo3=AGUvp* zcYmZ>#Sia(V6LWypB2cLL86ZScm7EW%Ek4#kusFy> zFs|&H&o1a!?VixQPD$@p+W?*_nd)UFkz8VMo*kRbOd|Uab8*{?;qp%%Wb54|RG~GJ zLd#iEE6zy-22G@~=8GF6eW*-1n|rOcMe(|fPlfm4(*qEzWwbHXBm4T;IN6=y%l3Ai@_b1_5m>YK;)8 zvLrM{L=E0aT$$E}5N4{;^wnO-Pcbf}9K_hN8R+|-VY8vsf^+^-t7zjWx#E3C9}Dw5 zp$x<{GmQsITsS=35$BP97})Qx*x%k_w8R}6W7zMm*bW<<-4W)A>3n894rnL+hVwnv zU-9zg+ZJ6G=w3xinen{?r_BVHSvSHv7B$0Ju>6Q&7^EM9T}lh+<7K@F%J zshm(6QjO%27?ng6F7rZ&BU&X~Gqf2zs#;Pkgn6W-$jQyv2zxg$gfoxh$mdUY9PS>; zi~L#13Eza!pQaVU5tGlyhWdh$*vV5qKme(Y=z( zyvBpXwgfWbeyy2`kzTo>rcGVN&S0$~uMX^%u`aG)iAt*#yxmZu!RP_yG^Q^UdOjcC zb37mU`8QvZtfOed7vKDhmv7(l`28O-+a0IevxI<25tR!TjnxHTW?6t2BQAf{L{6%< zy7*bfe6bht>l2mfsjt2)P211cjh3StO|s9Ks&Zr7wwb~z3C&yt{2dc3+ie z%kGK@QBkXHMrLQa-KVwHr4+fg0GrE1Ndml@f6rnI0a|weom8aP{JvFW$UCTf=79Kv-Bt*$1pK-!ga8(tT3aO6 zN;zodr2JXe@5nwQd`M5SbUrL%CTG1Z5=;QdyKU zRR5&>P{uTrh`}o)N61=AbHA6AaWOP}Yhg*U;3OqX(rAAcMB3{9Xb(qwpX7y6_3{v} zNdJpfq2+SrhND>Xm`%$GwWgqy#n}O)JvA%BoY1OZbiulrQemDK9+!plJW;Gh51lAf zR?KvheqILicS({ehjzqqCndrb38;kQQ??@%e=a)uBw4SiFrrRGeIfmpIUZ!uA0X-cq!bDsUMqw76O zSvXE-9v>da5wbEuE-2z;GHqZaG}PEos1;pgXzN`=z?CdmSnsj5;=HFKF&56*rcBdd zq-b?s2Ft5UQ7MDcU^fcqe2e60*eJ7NnJU&ATqlkr->_7Y6Qx_!(jtqrRt&^NoUzX6 zRxCd`yRC7pz|(ZY2B!^P2O+KaE6K^Oa^}u+ZcVyo3H3769?zQ7Xc%WtN}BV0Pj1g( zY+2Z~stYqS{%=n)SPo+oF=SE zbp3$03e$?mTneOut*SZCE6Wm^P)smlrn!@971~3p_2Q~mx>8bZi{Zw&DW*B3bsLJy z`(YYhX_+TZ(+IT@U4WbtRvWzYRNG-&tx>h));q13r zX+p({u|26&KAn&J=DR=eb$-LvYQEmz^7X%e#mApM@&0ZCugS+d(z4L^eQU_%Trn-{ zJ?8W$i0s@{w3i0%f=%NoCt5vg-CM5qYSDda%uA~u^%H*e@=Mew<@F^8?`dGKc(MT) zTAULWV}ydE*Nm+KF=d>QSgGC6adUeGRr7d%&)xlJjzvfbA!b5?oDGSNYCY9}9#)lh ztNn~!^R5t&nMRwIk!K8j--#oyH8)+?x5aS1Jo{SfCP+|Z>rg1HHS&Ac4FlN3fl94Q z3sF8xu3keQYlST0*A?O{AhEHpwKGq6q~eiqr@?muRjQL8gql2v62*z1oHrre#pB^|Wa} zW>h96MW+?TDF$btX2N);)*`N1=drG`+wK{zwp?GoK;t+~BlmZYXl1bl{5-KtGqDyS z?1X^xmStIZpADxpa!NCI_jg!r_+k3Mt``(+sFm|PGKPsbN0w@^Zp+Yj465RE!goCs zjW!l*97a1j=Y{m5B^^-JinBtYQR{n{6uO}nYZJ?wXW5x6Ni^RjV3Wv0R3X5-e6OC{l6gs7pkjDuN2^ z$Y?~lf0|GDvhcE3YJxvrv_=72Bd*Y*oCzdBtCT{bzjp%~#l~TW)TyQA(UU-doP&BPj)zWkPAo z^~T}76K7poNK0U-Tb$|9qot+_OW|<5E7|A&9#SLXw94w#T&9w{kNT}O0|tL=uADpyxm98VdY126U+fBD5N|NYsw-HVrOcRkDLj^XN>!xYH1kd>tx{e*pNL#|aYp3`ce6B5=s+=~sT z8MBb0gjQc<2v^0STiY33+7wf8=0Xf92ntfQOw*Fu%*GgsR@5v4cI5>9BEwFFatdV~ zRSU_`G^)mBk=ST-dL;_3(Q@tgq?*V^dU%c1Lcwyrr|x05+w<^Vrs_&t5z!Pa5kSq& zjnIuvd*kf&%nxmYVAoZid}Lkjpb;pyl%JB;5@lm#WVXt^xO*RW&B zg4aee>sNuk)AlJ3*0hm+m4(07Qj6$@%2o<;lE^vZEL}ISguvtDN#fa*#QSNb*L<9d zgG^#%o5L#!&CRSsW+nBD%-#~JsOCkTq4sllWS&)L0s1sjFCFx&D)m@+cz9e3y&Y(F&$5g z<3daszulmFkJkfzZ|S;gQWJ|g=SV@aT%FNe?XIx7a`WO1QOn$B*AHy8mSwxj?6jua zIQFk!@cPY57UN`&Q#3e_AqgoH5#**)u*Tr6lU(x_7l7|6%8*M$mw>5aun|Y6p<7$pn#IA@7aYh;;HOEY1W3kgaq#ayJX+3&CE zI?p`c%My@6Z^dwsg9!X`Q7o~rxILdff8u_&Y^ug}p1W~m&V|}2HA|>$U5hEz$V^yk zHvJCmHr&2=%YJu@+imIl0p}fPg|S}l)z$+zYvq}!QkT_+$e+X5$XJkbVwp$Av5;cH zTFY)Xu-SH8@Ag=4@!nHX7RS97#IVtdyet%#3G;#<96=Af|1_bD znkY43Lnf;ee)UU8};U;f!!I{%sWavc5lA8-G7bR%q7O9y_q~u7A7HuJxNUB1cLK!je#fjart$9b7KpU<39 z=IX;|tTB9gJaP0tW*W~ZRk*#{V~r=wku(Rvx?3;q|3)#Q&Gc1s!K?a2Oj9ic@A-&JRusA2eXCf# zJpHpu%mZ@07@26-dg-ArQBZBYV90+e!mX8Rs!E$G%yu6;#m0{ON$T2uZm6avBb z7kRF=Mz`;T)tz1o51|liX=dEe2x0QE*=9D=6-rh@%1l-6{vwe`Q;71Jt2T#F3fE{s zR4wyr>}B5}Vo!C65iDzs#}lEcR5_mo`f4u*jg{I|p9v9H5y>UaC({t|5=klj)idGZ zx-?&-9@-p!B@(VtBl0ga?T4OaFRo_R7Mh;ddi#R^Hcv5#RsBi)*qZ9SiYj#FLT_AW zPS1s*4cRR3U3vOWYpcfqynR~dOAV0Q&wrX_Nd$nzGZ<4^w1viL!*=Mn+BlZ^OhPdg z&D}ZjA}hA&W^&G`k|0IdTxr#2P?pf*npBbAu$D@ynqw+_US>*I=$z+f|AKE`eu12`W96PQ5yZPL+sk;qn?rJ)cOF}KqtStwi>&|E-BhQBd^CwAzw*R zMrpJ)+}^w(Mj^kKk~lp+vh^oEg~;RmC$6vd3~oSSNf|PlQEBEX_r-ENGSBl9fy9Vm z0TfmnL^5V9C`~e&e6yvLx#8Dkx#bWSsL=*vWiTW;#F3O`F{S{gEUq{~78xr}aJ>qK zN?Q`k^K6}$<*%_Aqc523l(V>iY9S;+B9v5_r&*jar;!*UwNye(oX3edER55_eRPDb zC&lb1|zG`>_UtHf7-Y z*VM4$>x;Bzx@avpUkhkwDSe0SJiXBuhnminPBmml8wRKnS=wco8}&igg3pCfdl4h# z8LVS5;`|s7GfWzGj^*Kw!+C;kOU4Nz+*o?EX?Zvmqnk=wt9IxroEHV1Zi~a3GxI!= zqJa|GxrN<+!!Ycy&eQiBw6aX&$g<2BRT)o#V4^JPox@o{UX&vFHlaMJ_)J5#mzpnm zY=wHsxL-w#l1UEH7*eQ&C{&DEE7m!zSIw!Dq(D%j#x6>R3R4W!Qs}!YjF!9%=OhzX zH&;T=BE->J+-#{0#g{pV%dHebok>|Ts%tK2Cre^on(96VA@vt2Ogj&QAE;DPj96!I zeaH2+W=hxi&O_xweMngfs|=UCo{|bqOD@={X4159I-fZ&GfPS2IZ)?BDVkK}U3htQ z!*09fu#9{>Jb<;FA5Tn6YRgl>GRs?NL~K*4pn9t!HxH~qQ?%d|YXxs4Pxa-CmssQ3 z3|p+VEDbfBO2T=A^A=|%Z&{qiUW7`n;;nBP#G1}`Sfj~F(8b<68Af!&CC(zup;1sW zS#NO0l2agtz#Jlak-T`x01}1y5)xA!sb~=a*}y4BVjQ7Vx~3wd6mp2n(=q9>e7%1S{!$&RAMTahSiU)P%n)ZkZYovBGiDEKV_>zPov~i=1j?%P%FnK zn$QjHx)$Q4EhN`vTv3%`WigzKC`VOOv}P)KDJ}D;6-{*&Of+SxhFoM2EiN%R*GqGG zDr>RMb9H^q%iCAHcyYsSGqCA8wwn#R-G;93$;-^uX3Ogr*L?Zt$h2S+k!jT4hn#Rn3wMA_ zz#rbd=flH+h{F0UfAQ6~_^!toD=yLbjJ6h|9DOUcRTUABql(xm1ZoPHoW&i|5Mo+e z9&_dXbjB?U4tQ~O!)~+1x(!QJyni_I@o*x9g^hFUJIkx<9oM(l=%FV&Lp6#nN6tyq z*J_Gn>p3o!!*ZtckaMIK&8Nqi`}ar6DYMg(>37VLG0Orxt%E2dHIH#!b8Z-X!^|4r z92Q!ND>rM(B-kj6#9nlRWxL;Cw5IR3f@?~NI0baA3@r-67)^+YB`+cn)DCC7IKA3Z zF^A<@E>%NmtvPCdX{uCJB=gK~;yUm9U%{PX|h_Y_?mBwi3tUI{M8PrxbnP zgO&&l=LO?Eo=%)jN4CSj(0f$Pl&mjK))jAFlwkO&1&hQrsGKlH(_6=4nj9|k;g+&};8nw_@Js3na=KU3MOKl$fNYc|#D3}}%x ztgdn;`P8L0G;Uq*c-6>B%`IGIsjR6NceWt^9KKX+6a;p0fnX({T5UUCnb&g0T1U1L zLzH+L!VbO@1aPY@XyVGM);7k<9yp6)+FL>8nT9@;JEyc^-xKNQl2542Gxx%pbKUAa zBYl8G%}DK{TRw42>5@%*>7~p%_z?7*uFsn5BJ*ZlB!^B_aRH_($o^VInNP#(uLGL0 zh&wIwlxKQzeU#dI7S&i<1&qNdN39B-a$C$u1D8uddrfCN&UmVkg^pJ8dsYoqFZ3OQ zQ?lr#RF)-jIG@??w`{Hkly?-p@OY)ru~L(g4?wlEMoX5ssZjJKn6>pUEe=Ym$cBHG ztZ2!@RgxROjKpw4)j*|VoF_`mU=5l|Br|lLzOzz)llk!B9gm;yh14)ll$bE8aylHz zDG-)fa;=>a5qIvGN@S)o<-lgx;;P1Pu29xs`W{1I*Evk@$yZyfvGkp|-HOT#ej|dV z7RjZG5-}_CT~i{e;aw%mvAJz?P7qvc4>0pm1t zneo*z=SNf*=(OTAe`bI7ynOp5U%q_B^;JM=&%?t5RB`U7Qqan@Ok;71=!;VUW*QlY zCL)x1q?}bn?$eqpPHT*+Y)s{LYatylT(dC_LX-h(Tu5^z%_C72=4r%hLk<(?m^sWN z=NuTvh4;Vu1)FLa@83~t=BM}Xc^D^t`THOEhrj<7KaKEi_OQ9d*iGwEGlMlEPA?U0 zDm7*fDGE;58qgiZcoESL8xeK74s8s*sdN-vg-vk`%qY`QPG_vTCWXp57PeP6^xZ&+ z1#dfw(#+~WQWK>{?zCe*C(6Uj=Z_D(ynV~dt6RSQ;u|*mo>)(W`;lM%_8sqj`i|d! z{{y9ZcAFbEe#48GZ&`avFJkJMi_-Uh+Tu&0q5$|Koq;@BY(&JAe^mvwOqA0jxp!D^=sPhZIJ*JsC{?%qy`Xhz1UTKW-i8vA zh|7$@8sAW$GG9}w3OR;)i3n0HTB(*w&Xw!kmYbUwT@!v^m?DMqIAnbYye`F!SZ zK2j+XhhP-jzQ-t-r;!vR$N2%H!5Pb@>*$>+1N)8Rm?Kk;XvBCDOA;4ooFGL^DX?U`7wTbEg^(lGiP%ilLJmm; z5~)zFVjgGu&f|?040l>6y%$qOk@&*i^;k3|rbfO@gp{$iG=+>tW5}_#2qd{yGOOEC z1c|lPxw;W5;+m1H9i=LkX_4Mffj0(gt3+eQNJ%r^XXbgK)D!)tGN>J~BziSKmsvul zb{=CqnMzR7Um4$%iz3W3zG_aN?$C2)`|tyJPjQl+T#O|unTI;(38gXu)>^55DHr-{ zEd|pVp}&QQ2@9+!@_C@1dLBRgQA`-tHsMmM%bjJ@_uMUk!{NwyIHRk)n}=}$=TO>` z=E5PKhz}#C7IIpIL|YRf2hu4KLu6S3s6wp~YsI+c&46<~)A@|nk(=v*&6VSPIPu5t ze&XT&#Ce+Nh8|@dX-?dq&b)j7Q3O*di3qW*g1~3O<&;S^qq9TlLdbK2+iE)3K~Crz zxxOCIDszATNUoM#9rx#vtSfVh1eMtt$A=GRzP}$y#`5bwe2;NLy{bb`=^W=}!BxO{ za*Ofv&hz5BV?T6s#-pw0haW%j&wu>LUw->%Xm>@%b53wpj$>A63u#(V+K@4rI^laK zv-|Q|yLAR@|OXe7)as`|UT} z-%flyO#JZqo}v}X4HzB8nUo?%&5#e28rW@KQ~qDF-mK}8>pIhW_L!Mx_=Xx#AV825 zTO!r6!w$*zjqMx%X5YDeY5T&_9btF0)o#%e35p<4RjB%gb50I>^u^kl=YzT;5GbIA zGi2u8d#&}p&ubj6RAMn0)uE~;<}7tsN#t4?tmd#Eh*YK&DO%2+sclBS+RfR$4owwO zUrSVjYO!iURISaiY_(7+RhXzDQsP2YiXNe_Tt0v1eBbkJc;+9+6JLMxGyc2(>Mwcy z{lx$E_aFHF{huf`ad&*jakuBwkDtj&lq{)6F)yIo;8|_MVX4Eex0Iq~r*Ff`Yo7N? zn~}KDhF)*y*P<+|gl>xgtyh%Y1~FG_-Cj2}ZY{D08}t?hOB=FD4t2#EC$HOvce#kr zRa-B$R+d5JR!4}D0ugH8|uQ~U+*^N~r8ov}-=r$D2)HW(# zFO3$ozma}HEg9Pc{l;Z{6Em)c4%PZ(>lw_KLRa!;EUXGl8*1w|_s~roU>fyB=t$QY zSXpVh>n+lV+-t@Lib@pfC$z-+qP7#|$4U!oBG2tlsH>=cyU#aC zO?#hL4F1+%QtkY^4#jodhze5A)y?o+TUTO>duu|0ZD?O*s9ax|MC3ZD)z>S19VJG@ zT8p^mw`hpwJa1GwUPL);>8-7ovd$rOBYUf6I#Z(1mG`Z{_8t9xFSWmu*`}%mvuR&e zt3?J1L5norDTOXV-$>O`t%v=du_TOle0n}{`0fW@-`+4s5n?90Mq9Co=%qv6dTU(G zxK}ey>m#iqk47v}D;ZPO7Jbob*jgIdLq4Nc3Zifja!SOgWbSjkXPHKp^T-eX{2t>n z!?EM>c;IHZ!PcH}fw2}oou8SP8LKOCoKRF^%H$YPRGbsBZs&XKSKs`CWtzCZyJP70 zyr~ZJv$vvVL4K3gt?7%#I3pPCoJlznQW8XcYZ@rb*5qDSk6P=N{orgv%Xr^hHx{K0 zsX~lFa*WO+343})7tV#tub`gvhR9^&f~2VY`J7oZOI=>5%an^NGro?LvOS= znJ{RKY$^@OwyA5{(7UYomiF+i3yx~24_>NfxE8Xi5e=$IO^u7JlqTlHTr06kL7$?i4SOsm2bLmPB+fX=uh4x5SjuN(OK_&Ny2(tT_r|oLFLH8fV5ShMXmZIs%g#?0?z(KAZQ(_Wi>vdlAv9$n)eVVTYo#+CcIP>i zLM$2I3F30i644+6nJm~uDlBtAD@_cM%X|@(h)STcWRh76E|IewoRx8CyCWydWh%@G zVll)BaS5%7CD9if*Qi#=xw)N$sG&>~>`WE!G=nt^Dss2m@$)xFZudt)c$Ff}am10P zZM)ZvCMH9Q1?L)8uq4X7P>b9%U3Mbkh=H;!;vzva6?r~WOvDrkOK8_yhI^$JV$F>6 z+?)j(V_QCC&h1bn_fTp0#!@R`%G8*I!mu7Va$yRQ=rq+im@~U3f|{-7IW15Wy*6Y& zOV+G)WUYvKp(a@;wGr1Pt*K?ItN~V8DQ=Y_s)qY(uFmc7(bUSNIayU*#e%DYeLWRN zS!eZ1CTVWOlF6w#J(Z;$>7>!0OH+)B`@a-vN?0vos{f66{dtTk%v)>(Y zPO<9;cEgdI!wtLrk?cLC?|Ap-jyJDfb9Zxx@4USK7pma3(WM%#p;j=;Hs_0o-fB(E z^T@JHf;%(@RR#AQLc$w`b{6jkv~@fc!|C~%>Ei<-%$&xNaaveH;{I@8cevs8+qeAn zZ-2}E@yP9N$6yULr$*561PvGK`7URsSFaeYqwDtkwmafYPw#gO-GFtLK%{E$$DVna zAj$r&S_4EY!KTJAx8_a6dBe@|2J6J3K7}AL1@po@KhptU-rVx$=9aG8u@uGq!y~Ux zC!jEB!<)mvo4Xsnc=r~(tno|9*eLkR&6s+Bm_6!I+R+?*Y&h(S2?o3Np->hd*5TwTwyBrW2OHvFk7O7E~J^p*=< zuY7`+!MCm8D!FWg1VPrd?BQ1UW_Xda*VNC(Z^iq|L4GM2TOHM|u)tf3LKC9m{xEQw zlH^<$an5V4XyinkYuLv2Uf0M3t%?XCtGHQd1*X%|;LP6CTmS$d07*naR9jNyJdTW) zXKI)@J3~$dYc!o!gqV0Zk97MZgLMRLSS}a-^zlc&`{4%}hK0gq6gtN^PQ(abGtYG-)WqrOk>2h2#h1V0c{=fjKm8tU0ynn@l-m(wVF@FsOdK;_52&iq zDq>8+=^Iqdg4a#UhOADtN{keyMd(FH8C@dpzkguxhJXJbf6t9>4H08x{Vat!1Qt~} zFB4^nxN2p;on}T2(-Npt#Ad~Kd7_lc$A<@scD#SS@Xwz#i$9PL9%Xx3>v9y)O||lz z6@}K0stZY3FaxST;@lC}9njq#z2CLwj;6O7H#ig?S38ciGE~px68rrP&*LM5(b$_E zOM2wy*06tl~G%Tj;~;UPsxSnIYAof-HtSZwmtWEH~ih-{+Imi-~G3I`~Uud zfAhcmul)0$zvH|tU_9O*aQ;X?9GK(W&c$p3tkoU0x=eDd9QS*=p(D%-`@vI{Vw{7d z$~HoxR)(xV+tg@82A{K>*V`T;xs~<0mjHdEg{c?OQPtNb?$>DLDLLVsLzye$w6>Ltfs|+7jzCB_c!cbIR@XO zy+wOV)kWxJ)(DNK7>ssgUs{x!#%g!P?rYVe%|a8=UD2y`rRCI$Plc`&ZaYWW4eX62 z=vh}aaMr~RJaHU8_uiQIQ-zj%pOSRU}$vrkCphvS~x`9|vKM)B->kESwCBVk!k_Dd0=YeVmxoC#urX+h14AbA@V#90l_P`qXy zZuwk1^K!;^2Vz*LM&SleFs5O^dzPiJEJ6iRG*>bswm?TFe2zTW7Ht+3^(mo&$y#E= zpC9%+tTs&N3xE96KT93%ExE{A7Q%v};JxMMc#E|i^HjNvfjP-O(Der28FVcy<0Jwp z46}~%cVE2a?(UYu%?*^o^Yhczc%Rh5loMmDoZ^C>YLjhB972kT7$hcA znU##u5_+o$E;d3HijYTAj-)hldwbjZCIxFXIEQyTv~76pevkJZ#tb|^Poy-__X&^3 z?kX-8($h1MifhlwWgICnGVFKs-cu^rTA4n7qMR>W;**e_j6qqcO_n5NMDIFk%iA^0 zxFr~DaqNef$hx%k%eJ~o5X5qRk+_Z&m(8KS##J5mJ6^wj&FAsLr%#_*ra+7tV=Niy zyMfMk)KX9-3)!PqYD%b5#AFa6gK)pWT1?;J4+CAl=hfRUxINxei{kS1#P9#V|G-Yc zfBLuoH-x}fZ@n)x0L>wsyDa+k(%e&h*WMjC0Q+YK)X25lK&1j?vXhN~5xsn%+wH56l zR!!#zj)z;`zI%&Omi_*QzxdT(FzgQe{*QlT8fO%SqBM&#La9g@ofXP!ZU@Ws{29B9 z+~3}_cegmD@T&4OO;lr~MdrWvgR-Jto|%{{|$N3k6tYgF;5DngtkS<-T$ zRKx3C$Kl|aOJ=D~&Tz3ZBVumdt_@itL`zPTnDD*dhM*zN63tg~GwT&%o$yA6*C~ux zol(Z)s^dJKx!onczB{r^k$?9e{(-0}|HJ?EKQbHxfB(A=+;*Lawxjd{o!gU&#Qj!E zBPq$CyH<(9QyPi%RA5^)Qf*FRRhl!pt^Zc7Io@q(-t;3%ZB_5f2zFk~C#7etw~^|0 zPSID0)P`%{27#q+nc-_*xR`ay_W$aOq5MmXzM#?9*VEg~rM~C~(0VW8O{^5tdZuE} zzYc)cI2`rj{p*!F`eK;Ap1a!YsWj~V>Z&d+hNvJ^(XtJVWj$-a{}+UTHJ(`W@{3d3 zcXvH|i2!4bjIJ-x@$Fi+q5JwnE8Q^hLN=gQe4`t57L@ke=UV&A>se$K5>k!qCYwRR z{?y2{^?ud%U9Iyl8Q@I!ilQ}Lf8fqI`mRUk zL@k9s{_q2z9zHP~I(+ZxY|no1C^RWoVl$SP+EgX$wL*kMb#>P3)qpJG0}+bIuaykB zMGuN`#56%_6ZRE(219Bj-t!5j3Hv;vb75Wr52q8#XU^x(sQH%Rt`MtZ35Ca}6Q4dw z+>0f%%z;Fq>LQd6E7v=ejCDQsn_v8f6f#3Uu-ok^Nd`OCyM{okZDX&}9G1Wla>)(J zZi%Jfyc~wS8l-8|6cdsMB+hSDVZYlqH@%jPs6r}*c@CV@iG?EW@*2@Cvoq^L)P-PR z(Uq}CZe2>q`$&SlEq_#{T(JkD1XJ5kx;9nC<_2#MvNhtsw#GI` zlr)7>O_IxJ^b6Io3}bW!Tfu9Mtp-&MIj?Aw^})ZQH@`ETR;spGJK%c*YGz51xD?c)a3P|Vk(`+B{g~BqAvPl&w zIJ~uj(lk>7#c_*2ARUG&+ z1j#;5axa%6^o?3Xwf!_tkcv<@QY2CYk=X{>DHp7E%=SG>X-@M<%muZ~ETGnwL0ipaFS7A<8mFY7qe}LbZP~1~8c0oq z0i@NHS*xhd{{?=>7}w%JETszNAciQzqZ*;Chd|vJBr8^{wrrjj$3ba>06|Epvf_#K z<{nYxHvFh)Bk(1IqO*psMJe3u_VmuvX(dA&?-{%kmtYl)vq6zVV7y!ihl30@OWm{| zSJ^EamS}T5U=^fPWj5d6%-*b5mJe)7YF_R}K z+0xq`$Gu@V?D+Yccf7g1<8V0OtfLg!kEbxBJ4<2V?u(8uaD4gezu`R2%+rF`j$?PA zGnTN-bX`Y?6UIx!>Gb@F%9)%p%baAmrVJ$|ignQMFuJhY^}K$4PuF$iQdvUee3_VI z;5GVu8g*nJ@ z>=G-=?)h;FJjaDNPrQEpj-26(w?9MQ>^XF%4dvH@KqEcA*5qsjr{oN$ZI3Itvg-@? zMik<^+anG_e<^NG(7k1XTN`Fw6!&1PGRV~oTSsTqRzSmRmReQsLBiZKhy zxYjJKtuZWxs5Nqkbk0#zqLz%)&^d8^Y`?f=HPqmk}0M`^`55~C~=`EMP~|MrNB4$_niOyK~P$( z1ItFxP@8vr8``bKP-z4p)g0XA#WShbye;)pB;4u{SZ9oNRi{^RIj@e>bzuLJP*hRq zYF;Sx)ir$Vs>N)D_hu%SC>2DoxJV#Z!?#Cb$W&vnc1M^~%l;}D`URyCfrFm1# zuL{tz7I{XBS*NwcL9wot;#90JvftPSm{+%*psP|V#@lD(N-ij+ZtD4!Qc&tOZ+6=s zHz+~F8U6(8r?%#UYWZqfYg82+r7wbme~AR#=m({2xr%BP3BEv~X{9JBQFTi0 zaR85*AKYP z^69(p*aN0_{POiHo*qto`aE+woyeDwnlF@GsXAdi#Q9l7tTB+5h16p6Qp4j*gr5oX;bdX`)z5qT-Cl6h(-csX%m28kbAP<;q26Fq$Q1 z{L!;;NBrU)x<9b%d?S1Xm@mZnnM}lJ*M#6jhBy5lb9{x}y~f#FygyQ%CmTf#GbINO zJIj}^jyPq=W28@T;|@HT&+Mwjd5IR{y>gwsMlSzGg~0imo7Pbx}xtxwPf z`)vqLPE-O`DUynGdW{;9VPe&VTnoNdoG!dQ+;D$;!{uyvA4lepgh-+C)`(RNWu1bcqah#7mw}a>7DPq?%m9=DD+xl-&E$%AkyiqT%!|OuHno`n6&XFO$ zoGpx%Xu{E0mYfKe6G|6Ik%RTzc*o#8%6oLL$vRVO!kZ>`E`|v7UoUsid5??AuT>Po>g1solH+w|eJQB_tUrNwS$x-)N$-lp@M%!TGiv@YK%7 zs`Y$K(Uh8~x{Xwt*|*yEIdJkC+ESb&=|s{N`W;?5Osd4Jn(#t!y46(ny3(b{PVFRm z!U&?i-0|;&#`|r<@@?59|)N_?_qZGVyfzk?Hcx zZWy?`y`}CHhps0D#f0K<45S1d;8Mn@O3sb2rVL3NQ~~2E*>!yJ^*4O;%b)Y*mtS&w zd&8#>AJP6tYKn5scz9$PPv{bHMaw$g3?gKqcxKHecq>Wn?NoCUuBvTdp|zo!Le7aX z&J3xS*htj`a@jD?61i9FdQ$Fioo3j*VVpjbR7N`^*M@-VjSN9t2i9ZsK#hUo9ojld z%w!CuCYBI6&6!$5tBHgJ8A70xigPnY8K!xrH1bv{5OP8p5sa+o#cTeyYQ5m*{Bw>J z7U?ltgE3ND?T3N8PY+z?!nn*rBUBZmH8p4U?t-t1Wtt=h*T{KAmx`;J4vQ|Z@5BYH zy$9{^+S8kk*KW_-{XJeeCOWwLk`Eug|*9%3?T%D zZlD@VR;!w3#e$145^adJwwP3jOj6oVl|vZ^PN9d6e&4gZ`+}q#&vPX1o;b%5OJcXX z;r`t(_?v(A8y=sYN&oTxq1pkJG6%Dx*FF1gU~fB#Xe$v?!Z~ooqLyb=TyQpVe}6~W zA341His^Lb)uHFu1N)vsu}sOMqoS)B?<;1gB-4?p7%S-Q=@R(i`yaVXiA0C;M@)2d zO@yD;9OaO31(eQ|@rmLTlg_BIqq9c_>p3v7+YKaDd8~mjC+0Hqe7Rtq<Y$%`oh^%!xT)Wq%N*Z-V9H=rkD7sC9i`oXwy!6v>Ek3Wc)mruVsY0zZ6WrlYcw1$ zq6Ap;)z`1JT;bsD_tqB!`&zHH@)}{JS`>oxDf1PbzRt_q%&B#Uq!U}gD1&LkZ}D>G zCfZY*OMNvntfmF2rP~mwIULGnrnqL0*GA6PO$@n4E#yZ2-UxcNY|$v|HGlc>4eRV` zO(ff7qwRLDKgoC4g0&S}AYc6nQehQ>sO^5^WxQg&UKiRkrdnLm%YG59M^b(w0O2RS zjWwRADtZ5FCcRoS?3=J+i_=q0Y)1uLBT*-s4(HOoGyr4>ObTK44_nWvc; z0~GlF`9xNl^Ek8L-|*_~YYxXF$HTD+-^vcm$&$v9X+ZlGR2KM&@N_lLo zaO1J}UF%O2=BRicM@r2YFEx|4LZ`_^Vejtl1!r$NoVCO>i~H4-4I!3OBG-a0GEi1+ zcyG}t6^S|FQ*2*AqLd^m{#rzBInPYvNR5fwby(eUj8h`VNC<&x8oA6Pk7Z(fJ`<;f z%QQ2^$Q&b=d1jg;r^iRe%S4(IU*(?nbXH72m830LaY1guRBrrJZlB1v^a z9%yJAj^0#BT1yVKX^ptJ1cDX(tTvjW%QX{2DT>vCuc&%!3d`#hD5_;DHe4l&)bcfI z%lXnxeIp9HmNRN4$3R;vj(DYBJfmgH&nUI508S{nHHSBIFtrN(z#Azp%_?4K!}DAU zstSI))+@(FDRJ`2&jqPbw8GTXa2lm4zXUf)q20`DHjR9ab;!TwY?NAC&aMoVArVU< zB*~~NRZAwC&gg1IOi(*I28`)3)?tic8fQLz`oPoY2W(fl-Ss$o#2)u_-s7_35-)s? z7mO-Aef-R0m>66~X9SOEl%Y2YN5pH*U=)K944Nqglk=Ls2T>Gbji^OQh3WZ$`TWez zISzft-RpZ^zk0rh6PK_MLnOu~mWZ-ZB`t{jxJc8pv>|+vAVQXui79igBShJ(x*Rde z%kVczHmYl!5Qut z9V!ox56mHwilF_=3pe>Xn2#}%vpAq)5rRWSF_nfDYPs_vC25MF8s-;NbNLk3K|sTx zctgdpAlQ30a#$tliZYsM3B)2pWuXELk#j96(KO>)}YnS;H(qCZz=4$Uas5f zC~1YQHU{e~rnfj{@y=12(oiG!S5TF4UhoBe`RYrCZXkLMyAE<8jT6iKiDgMx>rgmi zT!$o*Np(7(CF4@3Mowtrf|hl!UkaaUi=?m$=M0^fK_#UfUdnoiF0Gudg1&CwyQm2hwOvjeBw zBX_q)oVQr*uWI4^0@t-3_nNRkYjG*X7`a?7#IVu{I{Mx+^n)nym6f$zH-~dh-08wp zE1yDOnIkBV?Rz?HFg0>h;W*Ej_wO;|iPGpc#TYK*1=Aa1kizkeQlvR>YaOW(CfTv7)pSr*Mqoz^a+0Gt|fTSTA{KXhTTS+*?wB z6gYd5{06)A}o_7Kum#gnxROfibN-A zVhki*IandlM5UN=qJ-9Wf$W{I|d5+dqEGci;Yr`Fz<1q)KHG z9cjG@c(!adt_Se)(v@AyPm0=?M(-`RteuPWx^BG4i&izs&()eA{W9`MD!*0T%!_rd ztT}L7qd{+lG9Xj}wIaG&4cqW<;t+7gDgwnMG|X>?`G?u4p;QeEEtjFfck}EMGfB(|XuF7CaZUTxHud__d^F%BQyCgJ-k|U)gmSv(= zapa2g)i$B9#Tbk67UQ+))zV5+9?2Rhedt)nW5L;)?0;Po87)oBuG(sdomdt$@x zxz2FJihy*AJkGNAO^Xa~Ufif=-aTYiEB;Y2rpE+PWE}Dl$}ICRVJWX?y0iZflF=9A9NusQS#?Q;c^+lIzImRf$zTip4m*~IPv&!L6fmg(Roh@ znfc+Fho>{|KYrlz(<9?0kh5l9A|cIkPF|KaoXiq$7e#QEicr2nLBuK{wy4a^GEd}P z&$7%EwV;5`Id1j`<|T*#sTAUp@V4TOry7T{5~ov9=w4wlWaB8xpo}MW1KRH;=h%1j zy@NQ?)roxmk<+J0oaY8jG|VxBwe-V|{&0)wZz**Ls-qM~DoIQS*6_`%Bft5@YfL@! z_%To}uv3cB-%x_0do^H&ndjx1&Kkb{`q%ucZ~l_k$2*oHuFxEVIN?&^GzOlhh{{jc z9N8UiINscHxVgu5JO23npWwaX_O9dIZO5_mc&+FJvLNR}Yw^p7iWAfLOt&|5ykq|S zf%iXt;Mi$i-8laA!${xV@$T(A5&!o3O8@{M07*naRMYwdalz_?I1US2Pe5t4GFID~ zr>P~Ps^$LnhPQ9tFo($Re)l_0=ZK=Q&8@7-evz4H$JrZZ|TaYR&PIi|m`V zMW7f($_ZyY#dzp?%zjUzu;c|7qln7dXd$$WCF@_ST4qM(6Y9M61n+Qd^Xe zxZ0hx*qckRv|EdM{daABFqP)*+$|=&B-E9v_fyo8-^bTEy63 z5jU3+e0FUpUQ>WM2-(UGIPK|-qLxeybBixf#AQbN9m;qpnYfZQ8v@pMy?6w@TO*guXGT0`lH`;RG4NI8u)^WVOWAK)+Oym~Nh>`e5j3TGZc|M`g z+`ZZ}97LpMts|6zn@3)~kpYW0LQF6S-E|2vBse`iGhHs^npu{alx7iVG!msYLVheI zLyRO0rKDDICvr|Laz+d;yRPMQujjX_He9s~K4!d^{;p{cmI6|ZJUu^g35IH|h(~)T zOXo6ERbfeqB`%blG_#Z64@xml38Np?U!HD-2@7r;c(BCC!Q~v5N2|7L0j*{n6ylcrDp6@#H=|%d<<*b^rCKgl;;6Dxn64MIo~lG$akoc` zKk(ss1Y7v}>sRcD9ShfMQk()=o*4)T)*U@L)a^UMWVEmUq>UFO9pZ&sy{cg44IyhZ%@GmpGx5`v& zacsBxPd7()S!>00@L%;$B6CV<+2Q({lg>J?e=*=?8|+7y_oVp1eYnAhq`3ZD+jgD(V`WLXf?Tx+=Hf+rWUe0`1c3bOhyr`Gg{-jy~dM}3c zYyYIs2y<08F?MY|80qzi>2Zy*TM2QhiBt-yMaC)QOsnd(FVK`A*H8N*$_@>tQLm}8 zN34;`D^ZUYwYpN7)<3&C&8sRK^m1xe@mfKz{?dp}6 za)I_9WWP^KWQhx(KYikII-zRebUO3u)hqTx&+-1A>i4|qzQJ~$oGX3bi3pI2GX-0l zq1q`H6sZ};q<$|J-Ew<-kFgy~*7O+;A-1(0PE){NF3e#@8O81}usiHAMo9G5x29cA zf%ABlgR<4KiKEb7Z%t{dA%;NB36kVU#U*ljK1t&x36d?ge5zCg32-`(oX>)S)k=%& zBV|&OL$YjU3(FFC&Xw^pQd1?irp=Tqrx=)X<#L(Hv7m}>hzDszP9ZYQlA~NxY0XeM z1Z|R~+VZs;K74h3uN#HZ;z~8G0iu-N3anKn9YSES4O#43L8qm47)vG<-I|*~D-tMe zFulr$w&t5|L$)GHskVq})4&Vbww&eGk<5a4sQRZvE!L)Qt;8mU60Ew=17wYnwnR|{ zr#ebaf{?6&5>;AJOM)s21fM zhKF05p|))!`rE%sf1O=JV47OI&#K`W=Ux zSGaDEbpxqH>YS-dA)B7%*kgB&uCwfoIAo0%)sLs(RHQeSU8gzrj=_7Z*4v>(S3!j- zQ9!WFXU6f&`w#EAJU{ZfQ~c`dU-0^iclhBzQJ&AAA0c{ffB7rs%QMS7Vy(eii*DIg z-glH-`EmEecsg@Fp9#ytoC{MJJWf;;cJve%8Dcbi zeb?=%!WN_!2gYD>zbO)pb9BbOa1t6!+s1qEMI{NFE7yBVH}v?<(|KfgUvX*~#Nrz9VVZj|rzja+F^YS-IVNOaqNNzGq7o{)Iqh1^Nh}pj*&0Mj>n3)2aWvMg zP^hJixOg!jYNdTnXd*F+x?a^n&JoZ|(}=OKL{CaH&ri?ndV@AMIA?I3ZO*_pAX^Vv zxm*tqjV4pHMQe#|nJy>J=M!3MdMoHzvP4-pC5V2g)GV}x6a%(FV%(O(hzGpXhQO%Z!RhG-L zFvrM`AK&x-;{)$Mej-orv9>2>SQdr09ZGxRypZEW=cK9Be|8un!{Dy(DXmE|qv?!c zu~0(B)QaAaz?AlY^710Qk579W3kFKYETe7QW1hsC>3KpxyU-V%z+;O<3Jq0 zPEUmK!rpp$){G%(M~Ma74fNHcI)x3=%yq`1bS0!fp93itO3FBE>AjQaq11Bfs7>S} z2g;H%8t~4^`dg96iYDMv%24P@MN4*PDo_@3DMHuLg%lM_2UP6@$JG=oON!_43DxI$O_=wdR)Rx<1GCDzb0%l=?zpy}d$x z;g)|<>}AEKpsr0gSddA1-6D}hVqdDn+hF9^LW`?Go2`+O+n|J68;z;Oowx767;(;Q zr1`cU<`qrsy$s*m`DV?>Tl2qF`OkVOjabzNGDg2Bgw+)%u5A-Ws^*F=TjOMn=*c;? z<_()*LB1ZfH3p0}7}aE^s)6d=RI>=FnZz5-JavVIihpG z_XcOBIM+3c0A`JhQhJNps(MYV7ZH?T_=T7x#eEhRWKNV+a9-2h97&y}#KhzC$U%FY z?&#gXtDBB}n(?PSHAfykp2&K^>d3ph9hdi!F)W<(!gI)Yv&Wkq#_uu4anm12xsnEn zbg^Zmq(rVA-ToEY2=ccZj@YgzBe?&f6saUk73X;uZqe4Fj5wZS6Q4*PwG{8R7PJy^ zUCxnlxiF3+%QDj!iSa5mQDWfp!zUgeKcgC%Ea%(`cM+p1lEh$S5fzpq_*$16WVapXo+6Z z-lG(xWhUf|L(`j%=NeJgb2;?<_M0zo>csv1fm~)jzW>CXyWwMs-aAT?h@7Y(7R$2Vu^$F@`x|!0 zJL37mvILft375zvNwh@Pj!+e$3dT}m!ZccSR20K-2e!u!H&owA43=b?Az`uu#tf3n zx-_0itaN>cx1HdQwUS|Fn5j;>ubr{n9tK_=4;-waMi{ha0_L!Qwxm)xmjp&JRiIjO z_WbT2|G@kApLm)teEZ>h{_v-N7L?+gc{*MGf41JN$Brva*L&6!!yYn|Oi~o3E_HQR z7hoU525dBZVVoQP^#cR80UNO4bGo{!t5s69B#t@lA%->j;#(0rsnZZ3RzYMYGj>F* zZ+PG5oUt z9l>QUL*P;uZ4?|CWkp1(RibgQ+ge$2YjMJrA_SCDGOBon(*rRC`bH>Sxz1Krr%WXW z7_-b|K&753CyLXwTGIrAO+&(`$hLpU_3ay8zInsdo3BZ>A*f8O^S8z1QIsZTEu!a=#WYhc z?zocG`fILY#84K&d8mXpiK>`mL_y+%3v*{55$tC&eNKdVi9=97zhA@vD4^Ln< zX44UnIZD1CSI`>_KJ96E(?S_57XS0$sGNV_x#^EY@*_28;(~jeqMIba4{9%MNK=4FWBn~Re zoQtv$&@@y5hdh{utSrGMVs&q7XBkt(WK~_OO70ud1y4)v)@qal4OUx@IuPTG z(S~l$B631A&T{R{_DWoQC>kvWtgJMnm5k^)Nq+A<&e$p%wMH>dk0^U)PJyfn-Ib;= zVNKzG{l|Y~-(U0b-GQ5Hc=-ID!{a@N^MSUx;r8_#{%-$***KDMOO~L-I@a1eE5Vz) zN^qhQuiB=g)s8UE-2L*7`}e;Ph6$CxIfKrLo5u3yxnHIBcp;(+YH3sQSDv*jef?aiD zW*oEb$kuX7mN*t-ZU|b5)3gZHMb$<3@?0q`{a8Yf@S=A!q~t21T-7DHkcm){l))7v zdm5clD$%qrI2;TA-#`6@$8cnKvtzU0^Yi-?-~Z)3s6^9uOeymD@WgovXwy|QUl14b zGXc9St;_0YUW8ah6)`HX%*_{?U46%v@?Y)Ub*&FqZn#<&)R*|PZ*0KQ~q5+#Fr5N%MxE) zpMngh#`vxKW_|gLFp7e$CRa_4vOGtdHEvF;Oi>o2(3(P~_vMlLzM8a$Ro{BlpM8S>8z4eLy& z-cMHjdXcWaj3QWe6AN{E9R}&O{#X*-pS$yyuPN_?i|II1s)%m+6dh|i{J(?5FO*d% zVitFQc}@zbF?^NSkQdVdLUm5ob2xeKhs1}w6Q|P|r8P%2^4V3ants0-nO7lqTGi$KeqDdhT{7lY?aUMAgPn@PRlMdLnr);*2 zfSP7P2txnOLQngGmZ9rRFH@CJ4>p%%XKxq;4HAYd4r6i3m7OMwZGH0DhCE*HebD{4X-KNJ5!x0J$l$EpDJh7DQpp7^h_EYV}3AQ8CQgXiS!6R|=x6^mC*n zS!BDKr<$`Ag$wE>RdtOq8WZ&TkXt*8%c5pMtNQ1coRq~SHPr(^k+F3ExjOQf>@uT? z^+iak=+Io4=U6e5a@aWQ*31=Gi}93#P!?(yk}jE?1j}8DWVkHOrDce`U~XifV$fD_ zq}FP-8_At$8-sH#*d4QBw-Fta9Z#nr=t4*`l2VYZ$}C`}>c4_~mC5g_p0c zd3pN{SGyNvEh2?+nhEDKx2n@OQQ^pHYgLx&B)F9NV+VkWA{X4g|1NAMoqZgFA8hk!ER8jC3rJqKJa zw5_Px$NLjc$0Or7iF-NF~&Dc;x(a&qixX2>f^&_;`5aa2`Y~hDarF0 zYnGZ?k*3mcZi}Exm6jY#YcwcRo!Wv|HP*ki)(YatRpC_d zk?m$jK{3xWUE9eU%P4V=HF7{}r`VWAGT`gNep!rE1P8XNUzGx96m4Vax{mF(!?hhD z)*)LFl7iNfy>~tjJe^LUHP^1^Rd>a2zx@`q>-pty&%>t=eE9h%-rap>7)P|SX?NJp z;rboHd*u91WHfhqmX)qRNEN!!u-l`-K>NqQEW?it24Dxf44Crwl znZqoDBx@luDD3kJvh_iKRD@bsI(;Ab(D$Tar zvQwIE4s16YTx%(Qhb@I;i2U29N4CSr?W^DL-SrC^H*lw5Hl8raGu*Tdx7!W>?YD3E zo3Fp&pFjSU|LvdtZ+`jki5JZ+MHO)y)oy%2ZkHry7FD=~x}fcIuFHH?mBi1q=$HJw z1!*Qf@>0aBie@i07dz?NSmzbu_r+p=Nnp>l7hBNuORKHSf@`apcT4lQg!CDSZAw{$ zDwwKHFCykPI#q{lxd2e`=!^SbDi_tMrm2(E{#yCnRi@}gJuaY(U7wUP#1xOQed-L zn{s7jtRPwOO8|L2C5ni4mEwzL-Xg@PLY8Q%oaA0XkdHA*u4_YPZ#AZ5vbHjqDFKzm z6_867#3mAZlvKgk!lpH}t>NbS4f{<`e{+l7UlWroUry)5IEdRkXBm1VAQU6b-jb!4 zGlfvaYk6JRN8O=vq!6V^O$lY7H!U~YTfB>M#>UU2aln^^*8w$ocAJJLJu;k+4ChDA z^8tnDFV?cvj_eHgArMT%W}|qy?VxyqPK0qJhsZn$o;~=96cW~I+IB~y8nA^}93{(e zPKHx?b;~;i4vQ(`80?&>*%E5K4@AtjJWeu7-_|&hInHb;ct0`>XHMrMj5E=VBH+te z5PP*()pNjxjB|x;*P^XM8N(b4J_pXz6J0;kxK@OOMwWLdaj&Jt)gvPaQc>6fAx7FX z(WFd^qSpr7vDO4jW`=5GWvQ5-JI+d_;K)Lx z4VD~drjYO<(nd|=HiYp+Ndap#R#PKL66M(_R2hR#8I$wckED7gQse2CGjK6#nP+ij zB}IHtC~ev8cf5J?hHu_}%k9foq#z`UkP0b5sPS$YwUSCQLdz=4q9TinIi*5M8PJ3j zD3$6~lo9$xC4z(y>6N0fnrRBm^Ned6v^C5rQBst-UKNpx15D;~rY_Xcc~_EOmx4Qfp+T2wG8WQz?65Y>-&M zNF-70GA~miMmLre1=Fjoqfci#*VY)MRKIqrnEi(22gxlhYDJ=kEJO2Q^1OVp#Tm^Q zA~}g@$LLC^YC9h8ANk{-{>(r8-QTj^-|#wXf@&ClelKLGR&#ZAMaq)#eVR^$`?@;X zzo2Ovj4coXhtmV4M2xXPU8Dd2AOJ~3K~!t7O-srnYVdV75%Iy3X3zaOaI@VKhLLeN z6H7ul1J+;~OWQOwu3@{`igUXJOfEPI)+~d4h(y%lURPiGVAVp8(h>`$j3!2L;?91g zka3OpLA9}!WCvJ-pJ$FwPs9YL`JR+UQqAbL#^AKUp@}{cVkTlag}~!5;Zxx}%=kG# zDnw(@#*kIU$3TfSRezS zkG9?5nl1C}nZ^@Sh!kx}DbtXdU1oFDv)g9gy#9_>D-Iv;3G>YH{%20dN9K86`>R+A zDqEbkwA!)T?bu%Jd3-qV`SX#OEqC_^&T}AVO(=!15Y5U$kC7!?40FwTPgVG%h^b&w zl-@-fl-*!dBxb`jSK>-(P}vJv(N?isrAMYB^;1!1jRC0{Y|q|<^(?UlryH4Wr2^TI zbRm|BsAgp$uX{H; z@oQ!I;$U9Lb}ZTO%a_)RD2!)V_4;dGb3<3eeg1+Z#}|Zv#r%0e%wNRf`8lp{iP>Xu zyFXj)t2K@9vUpdlg1={a1EJ_Wi+pC8c|O~IT~>|1erv16jJ+;#^|S2soR%2Rizsq2 zXI=yW%MPHr=5t($5jlvt?jkhFRp?xeP$ff*BtMgVAZn@AOEnCXHF~A2j`v)0C3nSV zgwk4Dxn2l3wf}KV16JrE${305RT2S`>ocj1lh_l(I&Ue9fI_+}-@&Xku9z|M#cc8ny_183;D~`iJ%0kZlm!IBqeEh_#tB#ki->}{9 zDKXdCsqAAG`r5KDk{WR7F^q^gmU+Fp#8Ij&1_o6UWuD1?W|}ANkB=OtBiSk3&6ex0 zUUPl>6-ryq=ZQE3N|Jj+YSl>8GS@Gwu*L|g{~7gZeNM_k4|mMobN~3jr;i``Dipr@`Ws@(+&?@rPKnd;Oe})6oI+rnCgzYh3=>mK3?Y!U zL7RpY4XMa5Lz)SQMU!%OaUH2bQHhAfmzk*yjIl7qgpYxk6D@+sD76rmh9H9$H>Ju& z#x+KkL0Q+l`*nCC2;H3ZI+Tnsa7b)0!oo6gZlbJEBQVaONg;93&kxQW9BrCDC^K#(^^N=2CJRu zb+i;vgy9Y*a!rMNiyM2^O@@g zcCICdhJYct%t#`I0vH-q2-BH{mv~?*fsvWMhbESa9=iZX9MTZF#?YINO_P}?!Gk>< zM<)M?7cXDY_8YSFC78}($x_UwnGj|MpU^4ca-lH>wmVwa&?n8@_2gkD4kIZi+NG4p ziKg3NjJT~Oc7#0*$q<)RoQKz zX~cn5G`TC7t1F!CKs&T<(6+^zM(+K*49^80DlTxnHXxf`mYNF=t!)~N6?ctuc2(s& z>#$aqs38PdcC`(t2Bj2D+v3`$;?!gSlTwmFqY)I5U{lme8^}3hvtC_`Dnr}$_5VxW zp9~hNf>O!hs&vKcYfX&MbsZ#8nmcPrF|q4*_)!*j&R8fBW1-}L(ITWW23*&RL!u&N zl+vV%kt=7l)^PuaKTv?UbYD4Da9b~+*))}71$|fa#f4kBt=_E;O7Lop=~#k zu#_VuMdmTlILo<2X)p|&o@OCX5Q*c6O9`tDw^y$SUa{Z3Wb!kOwOAA{ul8JD?Z|#+ zx7qU5o3DBC@`k$L?)YvenOM*^9T$m0xw^->{82%+m5U{D23^C zCWfU@*Q9+5z_x4Ywc*v(p4;nd`o6<7hNt1g;dCa)g6n!r+mJ)R9|!z2F$c*ZjJ6^7 zTVheT{f;!AC?w9_GZh8LkF-9LhL3zkG0igt%^Wl5kT{&r9M6KFi`xxucp}X+2E@^B zwd#Yx;+tWh=2N}6qJ5;=MNJadX?dAAtJ`!>32u2aMqiK;0@qAPUD z=nOU%2p$_eO^zfV&_?5H;~i3FxSKglAGvuM*~dty6@ItlXMf;4oVl`=?_S;V<~MKn z{?iBkpMU-@-2ZY1S>oUt;uCoHF`&yc8X`qx+1XB@fzjgprMZH#1 zPo^riS@60`GhS9)T)wyk$_0T>T@=dzU)4wzeL?G$1&99(IrjzjPu}H8Rr*oI$D6d6 zysH|y4$4c;bqKLIG0N&Q~pdq$1gmS{4l{M_k*2F3i!Bazf|o^haVi zSQOf5GqX<|9v(OypUCF}n-Xy~ekbQ3WF4(U zfK@U2))qzxGLT+ zREJcZJI_)V%Sg$YNi9f45m{=jF-fu2Ez>lz>l{NU+=`PahOsf@l7W_0bjb~2d z0iz8~hTF{zZNH&xH&`Qa9>%!U0Ulxy=ixjMV;}|*3$)FizU#@Y6(J6#IRH3W?r!#Im3t7wo1G)k>-H4%$eDZmt4J ztDv=5*AVBK<9H&guh{h)cGo@E+a1nYaTVrFHkM)>P1jU3u{>{9yG!2Z;-EKn9pIK! z7aS$Xv$&86$c)|-qGz54reQ$k!gL-PN6%rNIH$-z|M(-{zx#!kZo}2~BcI;=!sm~7 zjK>*;hl$MGID52$ejx1rb$ z)wI~Q6Y;24%qcOcGbsg@OC63wB^DT3*NJGgZON@=ibAa!=D@p;2afto*94N57(r(p zU75fH&S@su!gk+rQiT?cnJ0$fo~Pl7i2|;n+gyW=L>?IZnaQ+Fv7;R|uYfc@@k-A$ zWx~6{XfvlUVNRNtS1-8TY3}Yv=J9}yg}qChOd;!rqaT?f{4~N}{_w=NZyf*A|NI}h z`u2uD{rpJ$%Po(;eBe5sxc+WSQtxTZj!+=tK^vUgVU&Ch7Ee);+;16zrhoN{+iT5r zGxF8z!vFsLJxz3UO^;QE7(gi_*^V`<60~Hq*Lp_^jAd{}6?iU~RQcRZF~lXhDn^V} zbjGkT8e0c?%h0dnDg-VWSuIN)PkrC#B#xTAP`yePF}9xwF`&koAsM&p!Zhf^cKl+kEwXp5~mrlaJ-@pNWPo){wD2U*@DS*2Rln4jw6(^cSj90GREj6PMeL?RVWqYbv- zl9lH1IP&99ANl6(TVB5Y8eb&x>u@|{Ti9$`tkL*5*LjCwnh!h@QAy@_^LXOZr}q?< z*zK=q(oP}^eHF!6&6pIf+wx>8F>Akt{f5>$nVC|!zPjdWvms9&haodm5pI#C2nkh8 zH5temp4BC{Hz%p@bQRGXwa~i^X%gDXG|kwyVY}aAJGkEO>03*fC+2bB>Hf?-yk{H+ zLdZNFo;aOPgdk}BP1n=emT3x{=g6E5Q&ybjL@`c;o7rKMqAN+_`Rdst8T6{oNNb#D zDT2N&HLfpbT$YHKVk}W5skulpbE-9RMnq{jL1Q-(sb?)sV|nrNB`;rG^R;O>&x!Y+ z9>}MeYv<@UhS$G&&FgjyVUSn%FqQR=2dxhU|K|uXDsYOKV$f5pgOy$r*(v zX@}cx7>7sN`M@bo{PfeGQSFwl(ZpTHH`_NHYox4?6D5feC5`fHXM4J)L2D)Tb}D3L zD5lm@F=A8^(rbxK;lMoJQ8=TULbuWEUv6-XWA>iO&rIGkPo9q-K1lB$zvK6BzoKtD zTps!9r+=o|Y-n9a*9gfb6d~#Q$x|ke+BsaOX!i!~GRMOc?|%G|!9TLuw78qM3?cCN zbYL7Gg&L!mHR~FqPzaf43p}}AnTp0P8dG%bp`}(_%qclXV#=7t zVx0(%w9b%Z=_d|ceW9VP?(k~zs7ozf&lM4~SthGR)I{ywtRZ6s_nZ~?!->N%@;ASK z!#BVAjyWbCPiJygv_|IZT3gu?SRqcOB<3LW66I2t)ha(by|M`WiWu~CdFIuArhZpS zeX%?)b-|wzlCbonmvb?#%i+Rh=UGI*ITuMz=D-32MWVDGR0E!Q)g z8YQQ`FbP~1zDqTt>OHfF=BQB%S-hL5GD9V|l$0qkNS_=$F@;JiNn(5|g_4B)n=9ES zm%tpRFS6Eit^&a#^<64uJv&Pkprn^Ib1TZO_}X@E64dYR=|=diZHT8Fa^ z(~p?8#X9M^8WN5U(=5@#603-IvaByscNi&uWFE7U9KJMETu2Ri6@WaCL0GW(OI+Gw z7?aPsiaeIg_PR{hHLH6SBm9beun-{gGmH0f)>7w@Wl@9{R&uP;YW=$}WCykUs(vLl zsQ=1Krd~V;56&iHh30(?Qh$Xv1|E@VypjKC@Hh!|y;*EU*=qT1r@ zo~CQrZm)QHxMw(z-~%yqT)o)QwHuVNm}*Y5%CNT^Lf>#YpGe1oKOZ?A9#O|VcJc!c z#}hyN{8xVb@kf5K9bYBS-NT6wA3ib7iCi=a$^P?E)TP!n#O%QCNLF0vMH^f@VTvN; zM5@CLqvfFuNrpHz41$s@$wY!OOxZ9MLt;xTq2eWxmxiubNTbQwiL)>!axs$6SR~K8 zsDf!Kz^G!2bV^ty*sWFHtSzv2NrtY{9M4aL^N40kwuY(6 z^jS)>&Znil^IE$*M~z-74cf}GUe!TP zTNm_3Yg#AEBVEz(MS*p)1h>}W$C3NHd#<)S-oAay*10;EFt|=)7kuy%>83QDlVOd@ zi_5;OD$JZSlL|FAT?!lPjJV)(B8EuJ35Aj6pAz(p)sm;GwPo^0VhD`qBYv7NIuiX% zNdt3`?CM4ds=85DP)J#dnZE02zWI)}6~(=3EZQ}o3?V1{JX2C3dQTV!a`X^mEjTJF zNDYi6&VH5y8AbF_as!np`C@{U6c6`D{`JGp{Nek*@Gt-RBX>_{jFV;v@9{wp&Z)k? zk~5;7Tw*{!2_jUP3>Z73-- zk26GQbVClAP;&y;fOPSPRfkQDEUC*@g`#N`yDLQuQCyal<}l7O9M&j&5CMlOa=u7b z_({13nXjpXCSOy9IbKeK5&RE(TYXU5Z+UGdoANNl!*IoF66P*%t$ z?WRLHCju@5y5C{1GTQ>LZOa@5vw03l6!YgZVVbbcNnN>M|6@Q!q2iqUz}?}FSR(h2 z4;;=XUTA}|mN{n*PX~sFBYqC6P_An`8f{5Fp^WA*PfR(Iy$otnobWXhC?;`UDQ$=d z?I+e8BI_LAeEpWsPX{(lgDP-+eI*W&m}StJ3q(++l020BITNLoq$0+Z(!^9_aj;;v zB(i+3q-x5WBE>?fneG_97KOQHC9aV@M%9JUEUIrU!%&PU`E!yCdXT}GwhC*V3_Eia zrG7zT8?v}bVoVfWP}br4jbyCmks-|jR7)D`tRPmaIE7SjHMcowkwXpy3UCeqCJ$|O z50#pkS>=JM4&0a6p_DVz9I9|dXd5bJXyo0LQOsm!?>Ns-Tuq+e?smMijsuBit2vLJ zzj<-XfB(DR^I;hHPk;Is-hVpbk4hp6`UzX9M7abZtXO-H7Um88Bzq*pwAOzDfv zx-YTmB0ya-zjCQczERRO`H|p98Yk*( z*%T%booH4^fUU^a&T6*X4X<9@aC3dl?)pY@A+zT3apHIy8K%hTG%>fOx+lv@gUF>~ z_p5W?JZtIG3R@IMgH|&!)n~mT5>2Xc86n9%k|SP4N^ckskq;l=Ve?F@6@Ig)Z~B^P z+A(Lj?sHa@Bto*RGBy-uAF-yv8H=`^5E*(!NS>4xewLi%Y%+5Us4V%YjVY2v-qfXe zs;K6iP-?(?iApP~NCsz!#Mu*L;GChcT z#gIJ7XtHhuducSPL^27ZGu9bqPbE`i(t^3J3sj{dLl9B0F-Dx8N;Ahu$O#h*;c4J- zIPu~A1KL^!1Mg2qLMo^r(Qw%~k`vciPO4HoWcM4h3>E#5s5mL~#-aNTZ5sL_^@wRR zX?{dIi(^ah(m$z`Q6ZD&K-jW%cnNOX(G@(zLo@jpo`prs0f9 z2Gclt+tW22Q_jp;bMxl!+0G*-Ox!dMw8DD${fifzk25F#3)=Ol{)%Dte0=uuyTDi7hG;yUY0T_uJMGW$m}JC$TWGp56tHi=UK$cBzcC9 z=QDr);Rg;+k91vwu}Z|p^(-rtI*87d8X_lRQD34>_2L9v`x$i+z|~nvV;xt!4KMbU z9uOy{;PK-GB`)b~Qp>2iOkA>$3+RfJUxaSfXk>J!(Z&#i7t}Yk539rFrq;lBlT>hx zwscBW+-zC#;4G14bx>^(0vTDbwZ$ys*0Q8v2+@t|EK|?2d6xx=S*R(MZB{b6Xz}f9 zP0ogtOdTc*FgC?VAV~aUv}+8H%?5H|oMxur<@s_B<3uo?qGuRR;6oKHD70xVkvOKH zbx$mrJRXQ)BF0RPvdlHcU{ohDm^CiS7=v{NTfc{MLJ%nxF>8=H7Aax&8<7Gl#XO0F zeBZaceR;*!X0mn|XW6wKlOOPYMwP;Ro@rtb9PB(1<}-U|*zB$(Vx}mZYtdSqy4k>W zvlC}Kij5AuxqZcM)3d$VgEdUS3qe6Ejt`IIkcgp|rF6{rw8RgFI-HNh9M?+kf}f%y z@#Xw8PEhvKAaj%)5}USXqb>o;gxe){2OhUtW*W2+}-;}}$n&LW(ODG_ub zsK{g$4?|{(nVc;}%d);?L4_*=Nf~^~RWMc;Y;~hzj0mXn5^=clt*h}VgUO()V^Nle zb&*#D2W^a6GpUU-sF=|?VkXbdG~9HSvT68c--wW48rg3fZeHwo_2Pzovm<91lq2;$ zS{Gc%?5&}5j%Y1j1qw4J&UDG4aE#fb6oh%gBtN2t$S;o{ z8Ioszbxn8OLA02VFxJw#mc~iF<}~OOq;^dal9(CfohODkU1usWM$S(UJUo784imfG z4!7N+njTyOG|W@s>3HJ)aNu!@gy6Z&n$qognkRlao%v}TQ7LiN7jBDVTQm_EOJ+us zRD(5&mscC!eD#v;?uzq=iNpOPg(o&wU(p%G(-b)mBR&Q(GAM&KJx#ym>ctzHt>VqM zzvY|X{EqiOop^XEl=h6G-n+$-P(&^7qg*UbJA!U8wxex(-n{vmoGkC(-Eln3WTjEI zSw(^+#q~X>Yod!?_69ZTDQ9r4Tg`!bq3DK8n&(P4HMG6-@WD?q(${8v$Ciagvb;l= zUbNiZqhJ64AOJ~3K~z#7iz;#^d-amtronqfu8aCymyTjQ5<2J->mnq}RBOFwj#G6Jbw7`flNx^=zg3bz zUSrRc7V&0T(eTgr@9J4h8Y`7p>kFaIm9iqYmorj5bG4UR!#}t5Ea!8nDtT2dtM2vh zUi;h?sl9A4mEs~X5R#Ot=kfBnE$U!Z#o^0>{1W%VGY5bDtk*@Z7)@7!o362*>)c4M zy*XO1!no&4VV=z)RwsUqz{|B(_bK6hAozh4X6YB>68kBL`4EKK5<^%c=1La2S@52D zo*AR(Je&!>{=RfU!7p^kTw`29j5WUPf~0p=qB>-Dk=Of1DKX#~Yb!BD-os97tWKDu zaYnO^GrdaW;>g*P(#$-cF~(wCL)&#C2(%8K9L)=$PLQ&7|xMg9jE?-AIi&e;##PrO1zp@NU{oE1-ZK|7o{kCO&9@I0{hg#0C zDtx)*w?Df-o>2x1T1?7S@TTkBtJLUPiJFP%tk6Ya0c#vzzkJDfc;XNDANl3!NPnK_ zt`mLNVN@mSEW(S$$g9%jd9I}MR7EUnOs-Poq}KCT7YH$NnmwNnC(hFessN%jaqdSE^CuF;C1)#G-@_ zrR1K!zP+ND$lWhLb3T4zoDJE$;7VViw551MniR^? zF$gBe&nv=AGT&wS8dIhyEm>tXKT@j#RzENWS9k3q{5H zVpFReSS?wX^~IRAWFsv(8L1X%rU)*>QqWZlP?S8-(I>QNXmu-%WU0y+t=Z}gsc{5g zXAIsJY_A9##TYb2w=gRdf}3x&M(4y-CbHHP+Y5Re1Mzh%>J*j~M+>pF~+rM+aa)f?RkI>Kp% zAD*B@oE0pyR$0{Um{o9QYkp_S8eI~)BpPGcbuF*ot|8A2r%Xe3*3$}=cO@PP)Q9b|&wkKK+| zdm5|gtzpv|t~$r2Z`pPZ=NvJ~Fs@|kQY+wN=5RW5IGh-t9*A?G>3eJr>&rEZ`PoCs6O{Zy{mEtmoMc^q8O4mSD+ZtSZ2?WFQ;m2tE=kF3yZIjdhe@X!{P^I&{o*)nHC`QWU*(yTz#4zK}K{8UKC;+W(aJIp<4Nc>SK?bPj;l$zTK#GBB9;*6K(Yu!I zcE`>2Emv1J^!=8`w$+iUIP1ipe*6PJ{P+W(-hZfheuXdvoN1sawwolxZZ&q>`K?G#}2OjO6G7*_`)vMf_dF@^~rrn<1NDtTlHG)=kepn_U?}1_69R-QNsp?p5S}VHQ=4b-`_C2zC(`#!Ac=tOcVN)Dw(}i)Ye+9 z+1cuv>uIcG>^&uk(BgbPGlffI$f#?ks4*EZbXJy=RXaA@EkhA1NsJlidyr$E93xYy zs1!*{WIj(^E;FhgSeAqvHNNi|#*xlAwmZc*juO)VgxNCBGdULyr&+#hlLa{+3x{}M zo+i??5T@yht4ukIz+ef)d1`}>%(4Wu5g|vR@MJuvCGcVY$cK-Qgi8>|zcVB%-g|V+ zq|3~*EG#*(#DG@@li+Mcq;}1!GAlBz;eoZL^A1ntNFqi>@*+f28OVayM;o$j)@q$3 zD;14OQ3PA92{8@&TXjP&=2iYuP}<5J6q}2%BBBu|O-I#Dbz3#$`W(+tB@;NOgma#* z?__YGd8_7r?FNpagwDZiZ#VqyZ+_1|egDYQLu8DeTmyj%MsHelN^Zg_ zQFGUp$1YTq7LW0wiK-1R=&Sl{S+AQ@U0oyW$`z+yXlTHeole7&EB(SP|03V&>QKmB z2llLHx8{6T#>%ssi=gbAYd$MQ)tXe(s`9|(&w#wdy5NixB;rc*xC)b6^R-6URMlW| zGQ=oN#jTY>=Y&cUxv?tT1q+z3uKUuSk2T(Er8)&;ufu}c5MgUGnRB^{=T_ytQfro* zG;&Mbx5l$vjl^qoRZa5iIOCd7H^W@yOf_o;TDdMPO8b3R(TmplDkP|D9Enobf4|ns ziAjbZRZ(-rHulQ-^u%%hfq8nws)#kB{Z1)1my5)$#P)3HT8K5{jplAM^6t$m-o1Ux z&CLxJ#T+v~fBeL!Q{WOcrzugfLJFv>7)RXwvZxh@sMf2vV#UtLI%IWuYpn!pszuNt zXk?AfRWhI}xM4um4i$R*c1E9OdaJk{2H3q}7&c6oGd|3OxX=MNbM* z!@$sQ!F#H4#3j;ow?gl#ipvt1E(_DV5Q2zCN(!i42&!O|P@CpuCPj$>n8J}518Iq{ z5}d+9j;X2GgJeHjg*FyvG_JGQ_RRHEl+!4$Fr7u&TS}FDW3<#J^}1_lG=_HnDpiQt zVeRIc7ihf|0+Y9-m?$OF<~nUildl6ogCeyvxUUwYEU_pqF%nZ?FqN<0zUI~ITRxpW z;a!JOhS7Nb?CWp%_RDwV%aP-9;bJu(KK#J{^MC()9-kg~dVFfmU?uM5R0$R_wZ-jhB8BrMT3>p(JLb*youpSeEmVt~U}bWeecR zKrx173>izV7DZ$V3!zMuWx-_4R1_gKjAhF*FU|FQ9Y>Z%m1;|rSfUW1)PgFS4>4d( zWHWej36va(%OY8W+ClB8rK4amZcA>$X;l?E1s1!ZxGhR;KwGey+&kzUAuqh{1F!Dj zPkwRFpk70Or%#bTe0U=5Bi;|tdvxDpdW*HN@iUvPW@8IuZ|HpA&VfX4oeu zdZ_YEY{n699H-NTd6~)Kh*OzOZ|FCUuHSHT_l6MR)8WG5a?6KLM@oRh{>a~+Kk>VN z`YjJr;X-~Z-`zxeu>oc}EH;m1D`;*N(;d+AYL-(y|RyEpH+zq#Q!M=r|(Ns*Ts zXDzD0G)sb-G)a%glc}S)y z=EZRA#T}uwpwz83WNooVH;RnJqR<4?J`Li6^l}M6OZmv1i2HtI7Rarx?Io*TDi1{6{;*#auo5rHjd7SCgz%$NvoxjzbCH|%47FDCJ z_}@}1DKE`gCkuNTolPlm)aMk5VU~MD5GjzsXp1#Y#7!l$giNB+Z+8si78Vf>JbwDf z#}7Y~W1#Chx^BRA8A<{y#OO$xCgx>Eg+p_cMQV(U;}+b2?OtPt9n*9n zANSb4$E6wP6xJEJb5+GOQlGOz1&dJz*4@pP@%El~@80t2?v}7jT;`JqGHW4sj;U6< zq6jIFRYs{yGznIbajED=OexJlyJk}B_Dosxj(NVYFyjY>_Z?w^I_&Vf*K~ts@EW^Z zur)EJNIsqgqdtJGnT;t_ubBk9fUn{JCuVGo*jD=$CG?dwSX)(1)P`i5bG1F6S}Cjs zryCikthniQVNu#bqSaDOR=Z-Qb$fqQLp-m@Z4sRoVkvz5IS|9bw|84!-QV&Tzxoxr zbNu?(zh=LGAWlc751$y_NI!0|cOy#o?B^5HZRS+FTH6ftbgB~Vl$ zE(<9^bsNU}dtPmCdDGpHbI0#~`jJ08{75xIeR%)=J)2TWJpfrm>d*M` zc;bgYe9vM%-J5rWoS+*i-M~a8u zU59!Dx){FaBXh23tJ^{e;uOgtP@|Y$D2dJ(Zr^OVeS1ePkTPiFDaw#rY^a=-4o#1> zhR$1@Gvu+C8JsdGBXfVd=;fh|GknfRHw08qm}|ibD9^<7ek2#Zw>wH zj{V&6+wcF8-~7X``Q^KBur8AGnK(^&12?;l(>ZWDT`0)8xKbFDTKhlK0@&O9LOnaa zm1?r|`Z8<2o&V|O240r_rHN}QBC=jF*q{HK>gs4!t!OannHr~BE__jK4x?W#z@LTr zLSIua9QMz-?pm8>@Ol27l~#>}v*xeM@>o@KJs;GIJoh!Ss~MfIKQE;eFITUMmk#ZE zUEIC^_ls$AUDT=<7CxxD3P9?!b6d%hIOS)$b!N>+ z&y9^Nq@Jh>3xz;wq*G9)N_<{3w&qC_v?ZEGCD1ZcP)*3-tQC`E6F4fRuF(!!YqSSt zU&Jb}`#LSOI{U(aM-%=UW3GbyPD!+dwi01w+AL2gjkT_kPb*l5_I<0*Bs;z|lSC~N z7xs*luh*scbL7BhK>O##cU3Pk6j#Q=bC81&K3=%!uci^XPvk$>*E;znfoLUZymZ`O zzsohMK%1+fsmat zdUYk)DJ9WMp%|7$(HTpKg^&uNT0+Xiu%Xmjj;A9_h}bTW%S_Id<(QcEf#dYVVR<5k z*yy{p5o~5E1)IsTB(N3hHE)#Wt8q)cyJurG`;b_aCe(`S22SUR7!x%nmSrNx30sV~ ztSdxJbIb^4-Wv~EG3U%_ITK?P1!q~atSTy1OaX(zT2EA#l0^NhwIByePSlifR+iIU z=bBnc@Xop_Sxyu~jtysQtl$~Rc42r=N#?G_rdYsY>y|`++&eHWll}M?ue>{j1s||wJLO15b<#J(vJaD<3@z!A~ zgv*78pMT`%p9;kps!}Y=Oq>^Tfq99{Iks3@O;n1oKq!GroViR(!*4@sxf%*Z*9qcX zwZcQ`N{oUfS(b=R3t1UPzqrmDPyu_5-7(^w_>R~ZOdhzbT!-r|i$m4r8yqBY~tW0l5l46ZGtih{LHhXS(GAT4N*&u~fRw5@L{yk(8kXZnr%u z7cTox?CmT1&6cU5X^S?*0;luL!^6+SWg#pRah@o(()oey?v`7v+J*UHo%lVAevQWLdx#g>OZ}`(+bZEE5_kgJ+7L=-diiv;x`GNoZ;fWu9e8O2z ztr}-KdT+5x6S8BMHJ#hC=`Hu$4foqS-rT-N)ks_}pQIL z(6&b#+Xht`RT8Et1GN@xm+J+SWXvm6!A}efx=$hh{Y zL{+V5l;NRn%74A8thL4{2+PDNCX51OB__o?O-kmvgj7mVou^bwm;;!^beT!%NLqwC z5SE$C=`5H+Z8@IKfZ`Ghn^M_cKC$UHl+z$|i4d6Ph3PU8L*R5eay%SKDRDTRFurfJ zmMl&=B57$$nK@jM(6JVlm{?-ud^lfKwcG6tH+Oe*+Yzf3KYiG9m}h?6UwAr1asj7A zH6AFK5ZHQ$-}ZF38wi0O#h@L7_DuSW_kxr(#tOB-Xq=Ngc^NQCqu^c7&CM;H>*#!s z?>b_UoL%d@3^uJ0DpC_vgb-wa5|RuRwQj0-O|Au3MN}Aab6Ax^Op*zyTMoEco3m>n zE=#qdGPwk(g%AUjg7@|r>)t-Q2$h~2LFb&@ODz{l7A=~Z6-BlCvqi}irSL{kw8D3e zTWbM_(H?CaF`Y3;J!Pwq9ZD)BUBv04!So#^RhA-(F(vzYOi@f$1U&{NxUVcf>qKQP zS&)kee@z!qbEEMflz`%-m{H2{hr#A8-f~ukA0D6h@rNH-mV)YU zsAj{I627cICnIj)mUBjnQz_cCMXr9%cPkZB+R~PEU2d;AsY!{LM}{SW0@O|My{ef_ zYy1>OnvZMlUcC-n)Qi+PId4p>Bg+dHKi46s3^B?xX20gE%WaJW(W@h%2}nwFL#@ug z`m(|2xmJ~DWo_C8kH6-lUzugszkY7}LMm-Qqa;r(%iw6m$t5lK@hXyAMGKo$h@f1}PtRF-;uOEsbX~+(1ie>_w2!njdrC)u_oWf_psgcem?cjVFrbP9{cD}${C*AT_d zXng1BvLZQ)(M5<{MK_e4WbA6AQFSF~iCAmRC>IB#M0b=XAn7qEYa|Q0jdOJS3{K1V zC#D5$Ec-CiDZ{s4{es)=$k=rv%A_)NhA+BTD5n^`mC$mc(UVq_GW|y^_3Jp>(wvrskwa zfwA)Qb)Cg~$pRKgyYl|y5l4C*}!(0k= zQIt|K!Co7ASKE-Oxdrs~-O_k#=&Hsm3sG~93m?uW4yPkG&M|t+7jIwl)z{zf4}bq_ ze*fD)u zrQ=_J_m*$p+%wOa-~YVlumA4v`Q1OwSUZ51MSnkdyoJ#l?gq=wE4G8hnnI2X)FNoz zoXJaIt`%bqzGiI6+;4XDzK5g;bL6l;;FaR$^&M|EJ8o`YvAKK2lod%oF_nPxm3f+o zOXc^Uexx^*bA_M{Dlha#vp+p?I6UHqj?z1VEhLi}soXe)iUC(0quR04TQ2d)({$l{ zJQEkqUp$_8_3n=U>fih;{@uU(Ytq9bho7D>G4lG=dv5L>BbIZWS?bJ!LfJ|+g*iox z7w399pFwwMKk_HT4d+)oeohyb5I|}9+0;U<5o24{coC=A)tuCvG-7Ih7Fw=uBH08; zosn}C+K*DqDYMih@3ImEC0g#87^{#*TK0LpX6dSHK55fHkuhSHa8NtNMmtQ^9L{IX zr@-S<2+HA|-0>l25lc1-q`>!6n+I6(x`a2nWyjN8gGIz?N*11436-%nXJ%=lQc%p( z#Bu*f>3ggZhi0sh(PU-G%~h$D#;c6eayJaUh>DGIXl<_!P1-QBXi3 z&4#-rvv-G}ch9VI2E%b8`mplV_4J+2M!JL~Cv&p96n4c+UUhdN+Y zBBjJMoq4+K`FPorOJZv?zDD}8aI@XAbp~AoyD9?daJ@@)=P^`jUE~h17M%-uo{1?F z_Lb~A7Mrm-(<==oQ^t;996DLt6u28Kw)X57%W(?qfBGI*P6Va+<1u5yi5f4I3VyTU z_RV{SySHS&A>k-{$N6%B>M>4HYb3GKkc6vRbrR#TwsZ{)EYa-K#ged;0~KMa1xb|DS#fsd77Rx!vCK_RTxqq8XH9IYvJI@I<*>F!RFU z6gf>xn+rQSG|noFPH2@moEP@V5H}mP50AXR-|^kuExA;tek3c0j)597ITW-rlo*-Q zEW+_CQfpnxHJX(%c&o2j+1I61`);?lJHB$?l53{l^!QF9ZfgOf9Jlp`H?In_PJDTO zhf<26_Z%-r5`|$H_>(WcmU)ITkSoi1rlg2zaTGPnJGu1(rDTrtnRA^GR9T9 z4tg)Ks39%n8aUT8Q*?xQ!tk2^@V`$ikDvI{ufAf`Cpdi~K0RVOjrSH;E1_z%*`T$M za7_tZo*voT9%CJZnY+=!+Z*Okm{Y!*L!Q!wr_+JM(|B_$6`A%Z^ za-~#5%t8aw+M>~<7|>Llv(h)UrDiFs_<8Nt%r(AjUFua;+CA1>^Hrgol9;q4SbbBa zwx(7*8E+z0SH^A6?&gm0hdnmW46c$=V2*`i9D3vEy=7}HnTSq{#9&l0tmG)K0ax*2UBT)i9KzrBq^~c|E>do<7 z5mT)99bIR{;?)RrB}qS>aw6tTpA#`fnL{*%fojcj$(dV~dDEggtu}3kpszm%twjjD zMmdWZPhbCFx|t-jHf^r|{1mJ+1*M+<-x}MffAWX3Ee=pC{Tx@&b|pgVsl+H2ozrLl z03ZNKL_t(>Yu5S}T_$}>tqQ9OR;AB{r7QSe>*hQ!|19aDym&r8$JxIWSSZB{$9lfj zWOaS=SM{&CPTopUq)}9CLM{>n045 z`_vkV+btaJumL_{492`#V7`$AwZNJ3nBwB51*QRt45t`oU9-W==CA z4iNRDD(&GZG^FH81!=i}L_yN7!|jH}%qfVfIwg6aa%l)l!FRc?RP+@76~VnM#pP5W6x$Y;EXh^UUzgkW9>p%%oST%TgF^P)IQo2 z$#I63M_n*Vve%bOMGrkg`(9_gP)ucGjpU{0nVa#3|MHi=09EAaE5=8^~@To)rUG%qYmU`aD6Wp3|ANSX6AR@j45cNTZEuS zlLR?p<#}GRzYlXC3mk^RTE!h3W_0n?49--1Z<(fr5EpibnbB_88jCTCq^h_|^bJ*O zE=v#uP!t5WGmdRHup3AEu0t;iZl`e7Vf?`1bmlxybk@-u!>;T3`qeAm-`(=6AJ{5I zrvwpXl%kI_U*GI_^Ot|d>8r1>z9+{j3r8hQoKuQkD>|zgy~EVZMrEdlANczvP-|wH z7N%+9ayl?C6S+iub6HvM7{(3Sc&3lSi_6=p+SHK_tqgN$nYU#jrG)EyZ0Av_a^G3{ zZi6+_2*f3lQWgS7KQQz+Y&HXZH*j>aun)_H`Fv!)oSDu?ekwmvPXT=i1T7-2Ovb2& zuN58~xkikVKxpSRyUm81n;manzvce!o}0~xwU+I6%kABc?RH??_Bg9qmYLpr-o1Lm zpMU)=U%q{VQJUObu>}!wq3VkUM()5yL~potFtt4ADQS&2n$BB^HK4R;g;o9EP`}86 zBgafQ&zz?Vm&?rgd?Ca{3W3Anz%)(7RIt_(b1O%!$95h1{2-sXR6-1#&Sz3C9F7M< zh@8%6sup*naUNqW{Wub0l3@lKU7)j0;w!Ww>yAie(t+qLb6v56U^ZLKupxGX}`@vfJI_{ebHn#_Q%_7XnbqiMS+kf&Km{0K}v67V)OD1NyGh79aC_mM;&=$2mjhd1JRMUn{RvJQW4Y@5Sjdrcsl5w6b8TG}oz;ib7TSjWTe#dG5$nD*GmQu;Zpv*`vaZQ&N(GCqG*BVnnr;BKlwgg`D>5UQrq3CE_Yp~n0 zyE&H4701?!`iAMlO2bhartC^Qt1p`Ux?;`cG|*Z^Qnfzk?A6r;U+ZV6G(PhLJZHnH zBK6>^3(hsR@9bGYU8vXikkXp>m5NhaJzg7*Hs{s#nE!uyd7#80Q=bR@vaDZygb*kV zo&T&57jT-o4i3~6cdV`pd-;7E2ISfMFSWN4QKN{{>oxmMwb&|!0=v?3>vj3B+c04L z9&1_S2igLEU3@=pj>x(;k7TQd+Hfo?MYaxQdLo&c#NDOZ(p;mc*3hA!g#^lCFf3DK z|9C{TIHPg9MH|cOyDhtW&weS~#LDrqkg_LVA3JjuBdV8;f8~XHv}Izp8^u>}PD9ml zN3_qFa}WyCd||nqP$e-ve&o(OZf~}dPe?&uo~XHS(+_NSBX-lbVPuf zTJ5QozUDxuSg5Iq*kZ=JEK8Jz{4`1til-ko;&!bW>l{i~QcBm@7^MYQC#buEv4&yj z*^VQ&E~FSy#;`0w?j$Yl4DUUg%|@ICwEn6M8rLb>q8n1tZ`qCm;k-vF=yqFn{f1ZD z9q-0FQqX)@G^b%;=q-KU@yc)L)j-yU-QAYX54`!}8J>Af#m6b&!u^5eZ(IUQd zb1&6WQC(!W5sbVu7KJ5*jN9EX70o#p)X+0$SYqV(_(Yl)a%o~Y?-_=k+hHWRkz9q; zm6ax@inSf_6!>;{$G`dVJAU>oZcefmf_ z&&1Qje13xEguB1tc6ZC|u;u>kTZZkH(~|k{Y0sbk>X&@;#aH~>|LZ^U4?mm;`NUKn z$T^^r<>!wF_Qo)kM?TF@^nSy5d}O;k@SXaOufDwJ+rRvd|M0&Z$<^?>7;Mp8jx#Ym zG3y}6TWxW@I9xVX@%3o@2D+iAYH@HcB{N5f`l;ya z&~0^duX&-RJbwmdWO;6E2XkgRCq8^S@!{zJsn9t^F16*WR!owJ7>qbCg&G+f6+pGv zjJ8tDnwpBB!xbV})-sQ(N@~cI6R|j!l-M7S)D)R|Pw%BpD<~ow-Su?+$T;@m#;lNH zV4g12(vh3^wCj4D?HVPqQE!USprp5MkvbH-E_hSW-N5j6%h-?n^wZCrrkR*v&M?Q! zoCU+5Y9*xRj>J%^7a~qGiIiF?Dv9u}@|+2~I_Z6;bWQNr#QwTeeD#u_tR+^V>zt6) zav-OO>pJ3QpyY@%hD|T$vNbe9roxtlQJT(r#$llAEZS6-WVm_#8hS^mg~4?Y6FOyx zg>bxZ$brN8$oVXyW}^+(IF!}g+}z;2$M+tqH8BSE#}gsUBKkCjoFX+OUiAa--`vqT z%XB<*xdb*w)0tatmF1iRzkB+L*WyF-y1O$u}@cpEV~Q;|io)fR6p)_7v9JUt$mj^`#SEjVomNtQ9S6wWz_cp_z* zr%7mFEm};WP^Dm%L1{y;dW`iV95#-Vy|B3*c>Q|A+q*m7-M;2#cukImX})kc9{Kq3 zCk_ukqqD-%QAuo#XVh9|hqjP)BI^uVkxOJLkcuomu^Qd-uBD_@FEWlL@<`W;F{+tI zn(->-7U9ITZd;=yQj6`Mtd^I~yl49=|vFsWUPbEM8QD2rFN%@@rz zp0Fy#-AbC(@&j~Ms5TVI-nAGmCb65(1j_m zotWa0tQEV_aCh5doZ%2=j&&jThB|A`^MXAexy-O!W@-Rc3aMO}QB*dB`3dTor-zUH z{Kr4=@L&9rS9h<-qv!l&$tp2=sWn4XbXdIhbXt0mTq{q<2UOLK2FygEcLZq~(iV^m+eR`nvczB%KSR%?>H+@UQR^Le3O8={{V4(R9jwySGi zJul)`G2I$@SKHs0@+=N`!3}@TC;zM`YY6*NC}^@SpV9SDpZD?gg;{&W?5{G7g50lH zAwj91MGKfFl6n4xo>~7@x0r+?cl$L1y+s(HuB7p{9Bo4Rw)gVRk&%cY-TF?^RtjM| zHzHkW5kRHQ;&ol?9Yr*XWQ6+cwH3jX(yjV`&SYN~)mH&Tl|P%hy2~4V@C7BWw%8s0 zVv(;KwXkG~jk79a^)tSG&AcmBHh9XJ7U8H+Dw3NSw-yl`C}V|E&ToSu#>mzf2q zen4A`u@>VU##mgV%iCLH31Onog?HnQ_xCrvzujVVqSqsM$dfn&BfI;Qb&NvyA)@!C%yWqY!~}6Flo*IfuJBYdiipt96)`1h0hJS^nV4pDo^fT6X4D|qlUi|U=IzbMzy6oM zLM9CA@If%u3Y;?KkLd zi`I&VIza(nH7-L;m5{UuSP*J}&f@rAY9ElC7&PiwsLesT>X`YMC((O3WxM-geB(g%}rnXB%clqdG(BMv8M( zT}ePKhB*YuO^X3lkED4)<%BAQ&2~$_+u(0^C~p}XS_mZwxs5WdKzq(Si&5Otn`_3g zGy+8zJb|1fA5tqrTuxv#MpfoZkc*}iYF-`Cx-L}exS zP!>vxIV3`e%*rs&7T5LIhCgyzu^R_ok3%cY6eVSJk&D(UP1i8|$6Y1d?Ff0xCA=oq z${b{W>Q23$`ra7`NiEmw)2D##Sv0OZ6y?uNDdKAAr ztiw>)-j3o@s)DBqz?>4xhv+u_G8w`AsJrX2Uw(}6sl2$u`x=?QZ_(B~Oy zrXUOE)C#fGa^zhV$D}p}Zv;z!J8Zb^d$z{XwLI~`T6W#Q?PjF&9!L~r*jUfjdB)D; zv=(tkNn|CC6Q$+eGqq(ow!hA8Nwxknt)hE3FVA9%>^$V(MIEqMO)Vza6_z` zB^APP;l~dL9uFtUl**OMW#V$VkaNa)kIK;bUht3ALV!!Xmx3uLa_Pvf#|)Om-ij0B zHT2sp#u_%`NG^qbGYFDRX{Zsc6oYm2)=TlH3QLy!+K>WoYi95R8imt_VUYJ~Sr+=Q zcbL9IxsHN^q)1CE_VZS6r*ohMWpvC6&Z{#baqBcY4&B>MEuVD8M;cdS{_7H-+lwge$>`IdUs5 zlUDRz7Jf0Us^N7I-ZXT08og8o&$U^L+hA3(y1P>&+bB|VOd6xF4M=SZXtjpJt`RLp zglSxd)&=!)@q2AtrHPWJPfM#>VbT_3EK^QU1C~OHGxIW0jppYMANfE210B%l)Dgwo| zp%uYTevx^nuHp<;UgUDs`eOag6;mfUTdk`ua*2tB0XrRd|H;4V_ z3ww&3!zsyKw4&xpqd?^5HqOmyzuuFy@3OSTsnYiPJUy$9Y0pR^x9A$lCv3yOl~!QQ z)j?9)vt=ZVO`g>v!@za9vZ}|+RgBl_2xqPtWVuRAfo_bxs#VJ^lyX^{XW?GX`B~|G zU3ND$etTDJbtv8PNtMB9sM_M{$W|3<8L4@uq!~rRs?0jF)k-K6HFM3PUGJ9j64A$r zm?RR!4L$vC$G9;VYZ!}W>tIfnloT;#VwUKz+DKltwr5sd*?8?tSQk-67NgowiwH5D za}-s$T=pE!dp`dB1L1O_qcS+l-R(O}O-##$kB1{V%=FIl#W#P7(j75a&gaN-mFNWH>Zm{5Rvm~-=ZH1*)+Fq<5VUkLeOF~&Ks<@ z7z5U7tTUuJ$RaO>>wrun(Pd7rXus#&$`)71YE3IOQ4t)Y^PZ6nTUAj@lsiFd85nBN zwUDNTVhX*tk~OW02!&nd^?lE6wOC^$H&7{dgTWdhNs$Y2UPPRblDu!zo{}T4j-Rl9 z{2SiqpSTM@l4In(-*9gOqw(}QW0eS*!zF>LxcP$3Pi$?Vs*Ki!FzvaVj$}Gwl*g`j zj{Dn@o1tg9h)cF&n5|+io2w&AwI~szr3Y2*j#rJwR#l-v+~i!2iRuUXe#`y1g}7jI z<@WV0uU_5b`;k->^c$vF`S^6^cfs&+*^_EPV|el%+BtmH*r+*cN7S_$1tglrgn&OD z`Q=T|FJFzM-Indn@cX}o*Y?Qa{Dd3+KxjE*E}E0cR}5z$Gqh$AMmNdHC>q>ikG4m50-bOI931q|AZoc;@5bz~lZS zLuaUWBX9ejS2wr()nEP#{`6OW&L0ma_U9A-!+-zZ@{2FN;;Wngng8*B`giEViE@@D z;!-`I4vEwLkz@jFJjNE%;@E9Ad^smfDs09L{p(wPJYKjlmTVn|R8YqY)g`KHVpHWQ zrEoWn^i+QTpMK5W6w;@k*z_Cz>c9E#`0|Ud`T60I+9F~EdApi0);Ovc`Ly*aoxA!9 zEzSLsWf_@D5p;4cSmSWUQitC!i-^2o}`RK$y9xntd&yR-P1@{ zta+mA_&iZUAfFcUvJhinnlAVpuVR&?DmhhZlE|Q{6j^I>)sz}n%bN^LWf;^@y2!w? zIhTrFmlV<)q?DLz@Z@w0j)K@>m=H!>*os#(H#b_ziJIH6w=I`T6KOf)8bL5K zSD{L+l*$#Cn`*(`h!E>_jzZ8xG3}4+fBwMZ#|M5mo>}z5C7vl!hReFDYwowzitWvg znx!vGIkiE5rDUn0!W1d7;&f%ZR9vU=wj=n$w9Gg^aJReT)BKUs`M_ma7*x+v6Em5E zg2h@)KTw8|DML7((R!gO#d-h0bb7)Mj;sc#ide(|MXluQC`D+ZS!truq@;!1YkbV299|HsywHOaDES9;&}A%@JX;S6^m zKmcq?w6->>)h#pWK|fmmLVA$38QCp12@dKDg5(`=?x`_{i11Ml+at0LB$yq;MHz0L zs>q0N_r2EomXn_2{4=ko7o4l?_8lRr2-aJxIQ~>9ty{N<-O}*}HTflDNHsJ9l&;_2 zC^@07sozx|lU99KG@Tq<6{kVZWNRIkkyT)9_iAbPthCnI>?>ZI=50@7{{rn@} z+}_bU!?5!lm%v2kaXOM8BA3%E2friM%;(of4hP5GH}9BZ$5Y8n@kE+0bU4KHBvVNy zW8Uq#>v!yif%jkC^PB>I`Q6|1^|!xdIz2HS_H-ZKt5H#eDu&)VMx)}p(r7fmvI>&M z8Wn(z#Yx4reksA=jKAWOMKRei=`-4S*GNd2&N#fvx7>~QIFxvjtPq?SXgS} zVLI~ZVdUXQ$Ma8#m*qs1%Kd)i-Tg=U@g1iKp@<44-7THHAwPSo%oVN^a!1q1F&{3*I3hZl-ILFQ19o`AO++dS%*L!~T@g4WQVYu62I@sTg>~0SD zexMshoOk4$i4k62Xa2x5FQ;iE8L!5(Rj^+xX-wNcn-(5eja!>|+~{{&L7{7inrYsU zi`%_uR^xrESF&>LwqK3kQpzT?@&Cyezv-mLe3@KsLyEE*;jj7HFFNTrpAX^da_r)Rx{_nodNNN5_%PG^?YmU+FnjG zJIJu9<*25FqMwmz`z_O`P-K1Q zD6YS@P^bo?V~j1NUWh3W=7p!%&rkxRx##%w%&sI6kO3V7#R zNG!3I*w*&D=1lt;R+C3*^EbU8ec$8zk<@=+xmZri#PsRH_ott@e}Au)JTY#1gouV; zOV!GfTunOsR$Y<6+>SPH9=R=->HSVYRygONaQ$^OEbr2^e>W(=?wkt zj?Rqu&b7d6Vz)miW%yks7*85@3|)tFj?TMAV$n(gmqH}I9rO$U03ZNKL_t){XKGF$ zk(bXu;cVf@hX;<+g-|PD$(lf23YU<1KF^#l3o#_!_F7NO+7TFvc85wnw8yw_=z|bK$IAqDCDJt|7frDf%a+HY~Li$y+Zy>vl^^ zuhhA=o);UgYjew#xpmh&t%s>97UzaT#oFesEc)^^f^#Y!6sZ)WDK`BbbHhkDBv)z- zDrg(aFbs5lV6c|^!wvhJ9cI@dZon9iA9lE|r(m@YC$)#96s#C^k9gO_W6^}YF?1L$ zWvdpcS#iM5QL1AqV10sd;l_59)UecTGwgGu+CnV>ipQ3uB7_*dA@f99Ua0AW?RpG~ zdKRNgK`z2jQ*+bl!?q64)y!6j^TO-%Gj>^UMjzUMa7vN$90(FVB$0lA4L1;eOrKO$c-2yy*0#`*!vycdQvGI=b3-{`~#0q4@|Ew)bqsG zy8~a{-1C07=P-2nt=0Z30_|EHqsjfH~L#&l0CSFpa=0dQMR5R5$LQ%0!vcAJ&(Zlg29jP(n zoh63|XaX#k#3YV+nXy*;+fz;$=e8|pN_lew+5*QA)Ol9)dq~OTWhRG(l*5%m(1xVF zH5{zr&RcHB9_yUqAf484xNyN)r=3Mr@z*%p`UZ7V<*oLayN03HB%h{zmvv*SobatH zxRy%BlT*euwD>WciK(;>Ba4u!vsb~qILu@S^UM;?EN##;U1pZ~!s&SAbUcwlR2TX< zGV}u}UYO>Yx;4i&~-!aDuEa||qt_R3CUr=6LCc5}8(n68f%`$mkD+8~2=-IOS{H^jg^ zFY2yF4Ok@?LW-Cy6xaH+1w;}vjwNJX=Y^N)!f^?N0tG{{J^T9|zVqyNd&XhMup9BN z!+Y&woV!tlD=Xx%XnIzJ6q}L88phqO;Z8g4qHOnM2n*+&C?R4}p{Ht(y@5~{=4dF@ zvm1Ke-`w&3=72Sp{n&G!E*y_1td9))9mCB%UAMy&N1WBnF)uTHZyCFe7#Cj8Cv0ai zQ))KUMClJW>)HE(Ti4^PC7Hq$7v@@+VkS-#yRL&U@%a0HB>eO{YF_YGuy!P7rIDQH z1a{#0GEuB2Q~{^dk|kAQDHOEMrdH8?MN+q`ZCE9-9tK#Jg%A_VGHYtjS~~BsomU~V z9RLh!f-$CShep!~X0-i}DGfc|I#O3hxv7e)R2;Y>`co;IhTqs{*L1ZKBG>0s-_yR4 zhH7a;)weEZQS{zwHn?`vy*WI#LFy{lw^Q`hB`(?*ww_bhj&&UhrG`b*0iiQ`7_4sK zB|HA=cR%s;^mqLJ$4{J%WvPyES=f&|x|}h2VUk|m(4~$4*MshgAv30R+qXWv+72o0 z;G0+ByyP|}OWQ*pgDI2C<1Z--iQgcPonN`?Z(*xy-PTQQ@b?xD64rX)h#xk|R zx!$_-8~vix)+;Y>NKmCxO~U}My@IQFU)vC%>h)dC02wufSUw9;x5+BLq2w7y}Hh7fDjAAk-D0hb$YZcXR6y0aOAAdo=~+`A_R`Fk=LgO?(S|FjxX%*-Z9?2r(&_4Vb^tp z1k+r(ghI;bxri0%PD8l8O^+0Ld;HyjaX(_M z$H&O-!#fq-on`F%t4Vhiw9uZmSXxb)Q>q9xlUtpIi0=1tE^m4WR^G~0x>KY;3cU@nPVa@ zk>l}|u*@tW=s@lA!ki zN+!EXFio@-H3gfoXEB+nCVu?Gk6ca^!UVo{+HkLcfbD|etr)4!&kWKh-Rmz zJR?{#ovCz0I!WyM%1xID%f!2V=9k|bpx$u~k=NJ2yj++r7rjHACzON_fsa6cI&ye< zA;$#P;fFo=jwAC0+lsKly6eBqarRtzo>u;`T_%-$YcG6ll++}6K zz&Kzj46nCzH@D=eGD)T*>nzC#xlt!bmEs_K!Q>8d#fnxjtf)NhG?Si7_V=32w zgNV{G!W5WXM=wSb()|wUZxKJ@tl+JMEQCuSl|(0MI6RDdrYw}8Gn6S7vSdt>RvA{? zP(QPU)Qa|=R|IP-)9IDYo++ZnUzaUAWALRgOKBTXP3gb!Ww#-4(Q3x_URUzYRjl8F zHfz$ZZc*n=z)5JosS%ySND-(W@v^1(Y%>+6sQXNPw+m^Bc&BTK&iHCu$8|6~$S7)`7{Cs>B^{gxqC} zubjdOx4^LLx!DaYr^4~&iPy&m_D;AT9P}N-xTjjnyP?CmTVg5fz0OpO@A1YcwX`PQ z-3*NVx0ue;552BCDIuw)9gRn<+i<$Ii8Ed*-U{9*k~@W|87d9bptS@!Q*%UeCM`3| zq6Wi~6EQ86k~F|X!8u(UcQ*&#fB3+#-{Jd#zZg7!Hd>yd=lh=@cz%3kHyTV{IKMn| zdc8263t1fJ%gpo3BeeuNYx&{vg)krS4({&WF^c8!>6I7~#%mJL6!54pR;&K}iU+UQ znjmIs&Xh)O$Zbf!(x6Hs2^C74=b`x8sI%zO%!K;BH`uIU1FeQwQ>hiPR_p!@Sg*Bp z&RJ$FoJ;2C=O@y1=6OCMyPj$cNi4?_2~%QP09Ww-#Jfj|A`SDbR? zF}}8%i$W-c}kbC%T1*hWb%#)8$Em#3=nYZX|HZQkv2t!R@qaj*MhYYoFNa9b;1 zrvPO7ZorzJS_@sLq?)*7cKyJ(>*;#Sa^B(nfhA-L3m?C^=iU1cn66S?pzaOc56!e} znpt0G{D*2NuV0s^!Q#4g$IIFgy;gm#S!8pir<%3? zVr^=Z4Oa(Z->fTFb-aF&uD^bbH$`<{u1{~!^Ivp~%NMMot&; z#;sL}hpXefv<~gn^?Oa>zp1f%TPd)TJyxOKT$9+>Mtk|A_Hudi9j|2RjXt=h=G8`s zm#hTi(rWUuQA1jc;98|c)iu9Xt)xy_jk}T;Oj)!Rx@1BKIs+|*7*jJ8G>dzy%OT}f zW2*Ifxg-@-8-)#Hbna1gCflgw+Z=v;A6!C&gI0RxLaXBe%C& zXKSowaKg|Cm9oC?S?4J2>(;dDhRRzyz1AI-R&m&7LEHV>W(wQ=P}>}YX5wy!yQ0;T zrkT*L;flId9nxktnuoY{tV`YU``gT_=1L5K7z4RzxNivyxn!2O5QCoOQ;cn|z4bRx zlIk_JnOK$>2`RFqq_soRNX|w>2ch(YzT;RcpFVx2cb3D@Lke2wyc;QEh~lV5=g0eD zr?k7ORgUq%h^;cs)k5TfC?6|RI2xg)szi3 zQ&W5Rtln%^4BqK&nyYpzhm^HbIHP?=&5cs4x{>mmF3T$GP+JdQF=xD}%eOYymSS(3 zqrY5}H>IVNLW#PmX_%){)vr>tu&|}-jpF`?fpHw0!&`g2L&{_$ni>$>HrwcjI!)vd z@qVQD9nKkcuH&{J8M+=ZP92@L(pj)hUplc=LXEf-D5659PZ3isSVbn&Hs7W>Vr^|* z(WzpCI)ck|p}fAr`AC{3LI}E%^&MkBP)kqU_vE5OjzlI0qvEs_Qo7KyaCm>ie&;DQ zbIOHzp0UQ0s~`kL>{g>L6KQUhs-M9rM#9sD*Js@jhgf)-F1&=uk}Ef^AikrzkxbtN z2;J8p8Cwj_^i8yst;nUbj@}7#Z|F1hD|XIWKJEto;@hwI<+t}dgoXd}FaIxoczovY z{!i$JcXY!oyexiFVm6p%QH1aVu(7x>$|o%2!7YA;A5R01}k`@_nWDPaU7c) zcE!X%G7?x?K z)%0!{Q&3t;Lo=zd zB9Yc>W-L<^p>H(w>U}o@$xg5%ZZ;qecsR^l5JP|`CO|R@ngS7*xbXyN{PDKxHeb4Rf4c=Q0d+qw^I!C1S5g8S@ zbc3CtcuF?ZlJPc>QervjCNQSN92ep|;bsVPAePKbp<1P(7^_44oi!Z9@^QcC!~I8! z0n-gcJ21EdU0E3Wo?1L9s*sr)mB$x@nN=7$o@Sn3FN7E=Q^kp3#SyS9b0E)w>FHHX zBsp=8k;l`S*V9FXe;hylaKyyKu6I}}yJ28%Et2l$BTA|CP)odATd&bwUu0Q@y-N@aJwLNXawpS=c^c`ZP zb$YKdR&D#DcF>S^h%gn5ZAo!8714UtS0YMzgD2Oavoyi03DlK04sWAQUd)y_&2M_t zO*0Z)@vLjQUWdH3qV8VFn3`}7N-@;_z~^ZB=^y@uoFdK-%rRlcfy)w^PS1Qi?8qVN z9;OXwg%w#X4ZqCQM9|EdwqfS<)f{UI!4`~t)ACoFP%k>v)C5J{L`<<}>-rE;+_l+isp|FKZhxCk#`3!=Z@1;C5O}u2ANI_vZhM0WD+S&BvT2+Vx{A_SY93jHw(P4 z@ZMx@b_Y7skp@rN^?c5S%bXSA*6PEo6vev(p+YfM_cx^?=pj%f=^(46J7eo0)B%(Z zKK!6b$=%_Acb;XQNF_5*6PGFS>2*T#!hZ1Fj03|sGKI+NdD6Sp3cVK$nUp5o!;X&b z-JWsq?8bq<9~%ivhc$|ow_A6lY4`1V->tck)Ew@$7IH~fL9J0aMD%^D2|C%#K&x@) zoZFD6)D8S$xb_~FEh+OR_0l>BLcw{5Bm6EVxv8dt3 zA~GgGY)qV9!9&m7T2ea;M2T#0lw zf%lq5EW$xNcGz>%f8ah^P5JI`@G()11>>mIkdr3ehkcK8FoqZQ^)59r^7){sTXK`jM9!nDd37{$}LQZ*Tao-~GTp{`kaj_{h!ShMU8C zY!Pg~BlgnpLfc)Ix6bo?J7_ zlIX365QsHnCGp|?SJ-akxBu`RFXzC#L~1rIC#I_|A23)IPQcqrC-x(clr%G3QV%H27&1fvyw7uQcgtzJ-r52=_ z5)tUk(g5H(Crd3^T-xuOQq<-eS<~_B-mNr)9$P|k6PY&jYq`>MRwi)UKdEuE?FXgb zh$*@4T?}gKDb$uw)DVe^`gW@h6O-QvLrTiD?X$HNB;yVzC=tRXkzyj(Lcoxuu$02$BgsUlfyO$gR*%r>+Alh1 zGS=(g(+w=c4WSwwBgNd{@!TCo&U57X^g_tO>+6MwhgVXnI6orBa(tb5x-6s=utu2X z1#cGK^#g}t!1{r3oOn7;NGhZ%gp}Gn&`dAZUa53N6eqr#mQAw-8Pn#624gx!Yj3x% zk`GIx^hoD0z1#ME(u~l?XkW6R6_M+H*jk6{oUY9|u~cEVzae!uOnpba`~6osB_S6zHyR95^$cjFYBh>;h|!=-X}xROK6@nrZ;9MSig=sU&8xuH zL~etj+JteITD=lcO~D#V?u8U1eGS+yGvXizF2~RGqv3GyOlM84N^U0D9LO1@89GX> z6f9|)k(@Og)qcjJOC!lZGIc}6*Oo}H+ZnGd5VgLUaWuuh?E%R3N{@SkrO#UuOxF_C ze(Rg_%~c?+_1fiK|G3Nh3)6glV}#%fA^%Gno@@rStp}bfVMbbvUZi2`n_Yq}-WcW$lD1YXS5kdDyxsmDg z9jW!xv{bzQPARGWS7xCUHFJe!Axsltnn@v$7M=UWT8PU+SOQ_0HPpEx^;aanl`Sw) zbEf9hjEmYUUfviAj90_8R_&}-b*0~0W3k54IY-}hYWyu%(}oqJnESQU-f9I{t{vmJ z1JgAsTE-fy8l!I`tkMYIZ)b3g%=E=juD+=^t+i2wbYE4GEtH~ksWiHQEI_EPd8}o>8=q_yRK7hZ4FY^ zN{xw5WB1@a#jSM_6;}mcp$B{watd6QnU~9vsU~i32l~!4+K!u>12?yKYUJ#a&ct)U zHL~9|BviNO11csNoy|&Vb>2!U-6{dv2N!c`l?l3+52(>9*^cTvrJ}n|t2IRpv);7w z!h#Z(Mdwwq1&MG%LaVZ6tselSIDIwdg8S|t|CLlSpa1Zg$Hxc$?j_Q{Oq@&Mn4ok! zF2S)>AygrchE%}#4p|fJRlr6)n4%kLV>2QSa-=;c3=TpJTl;iv?jR>d557`c5;wQa zZzLrhw3gNpB1NUP&~OB~MD0v9730($VXfa%f2~UI3v9@B9jsSDaK&{~T3V(ZxZb=p zbxD-AVQ}~+lx_{5Mv)rARYWyns8+98%$bP3kca^r6V(+=1$VJX?>QJT*6Hmt%Le5;4v*Ojf1z)g(P$c58 z+BK0Nm4%#C)U*atn(2Ds-~8#H@b%Xpxx~Of{I~CTIsSx5rp5^RoKeMTY6iuth&Vz? zgp@hOMNJ(doaUM1JQH(e$(e57GrFEo7phb`KT?vSMvd#J&a*VcoVS{)tYqer2&QtM z9M+8l?@3~Cr4mlh#`GN0# z_Z_Ev=5c-{=ZG!BuIs@Gz4xupNb3*0^J?nw-G-Dk2)^qy*}NjOSFy(!taIwxvMqJ_ zrfOpSvn&fr;!r%fYs81@bnzQ2?79K(2V%|~rEzQ+DCm5;3q?`U+g-{i(tqOfQ001BWNkls_M&L@cdyv}CN)cTjES2C6}-q6=$L*LzKQOZZkX#8QcbHI>)b7g9=0^THG&#aOa<9VRtl(b{!*uZg-u!a9rTI_;btcT_4%T-3c;^VM%! zD<-#+r|-8LegX7CUsr z99eQA(8wdJFVyP&lxrm9K#@X?>t>>1z;HU!qzKykQ!?brd7kK;N74K#gyMikS*a))q+|wT=u73c_uTlNLrBa&{ef6BODS-`nbA)W?R2An|(MFK1vS6k6&=Td=IuJuY)|Sk%ij}k$ zZ|oOnYaQr*snn}^=ZzTr29ri@U81$LnvZ5=Yl5yd?utxnJ!_aXfqNaOXVxkpK|O$F z>qcLbRL(i1Dgv~y6|prTE^7k4y@OYQSN&PdyvG~d`o<8@(}^CoEn?fj*K0~`i7@2? zR`}Cje9N!C`AA5K$0hLn!@wy z+cQ~m!vy3j|Oh1cEQ8Vm%-I@_#eP0z>4;iL8 z#@B;dX(&1ajVx8ob*NsAK?+-kbXi4A(~6&33IYLJuEM`HU_^(Pv?{9HkPpU~?I*J$ zSkXg|mAV<`#F%Yp-yC{M{8{%0O~@5N0&gvSpn%7EoThh8#p>L)& zw~|U~{ert#ps}~xX0{EyN@=D?tFF*wR?>xj9|PFj3??E-BhrX>I4i_u;TR{RXfK`E ztdpfSEX6==srOt8mfB2Q!g0D_Y+~rWR)p9{jSJ2=dMk8R$wCb-sX|NhUTk$Lv@X3h z@mS6Exm^E$RGfDl4twtIZb-`nQVDTk7Km|S@Q!!;k$;Vz%M|Ivf$K4T06$^|%WhC( zB9xZuPnh5l6Q~HuSR`laG;7k@2%*)87-x{6q=lx?Tk;dfd?be62(GSF zk47SD#DY>wBl75)RHWikX7GAWs?L*A8@$Cpjgg!Z%dB0p)>*#)m*4YG|Igp@@wVqL ze)9_+7RPbUqEB@wAMy9^sWFk4z^)(Y8u1{N!Y&)UIG%ny^0GucP+iZihs%&z+#Zo0vz#d+ zOnByE@ZRFcq#Srnnrx9$dAI8r?Z`Yu9-dwZ#pv9}uJtW-tBEP?y{u+)`68z#UkpIs zcD>dwu&>B!9BV-ZfzS--ITr#n8luiUs;tBz`NH(bD$s4afwCFdG^q^xZs7jrmi@Tn zrHa(f1=? zfBcI6<|C=<@RPJCVX_xIdPVyIUFPg%QRu6@1NI+co4cOCZE%F$%9 zWHkfI`tR9xy_(qK{+Kj;t@DvLCeHdrs*#4izy4i(u{Y4q)Ea4q#`@*w)KY8uwPxh9 zYgV$6_I%^XmDY)ic1D|aHju3E$=aw<*;)>V10TNrN-HbE%yN1mUe3&-m4;zS*c`}y zrtkOcyFDQW%p4Ib91eRzN*w2jOI(=Zg&fZevt`CoVx)J5_q&nzcLz%G{Pw%=m_C2c zVeGltzXvOfL&v*8VAqj{9T-O}E!k}ZDG|HcCqxVCGG?ofDZQgc!;&H)omGsFk=)XA z?BW2lP z!;ZV*9kO>YYcdZJOwElrX6XAiGc&f$LmWv8MOt-+S0aL}1`h<|%$B$`&MNxZs^~+l z;Pyzj!>%)6$rz(+x3PkCp3t!5-s^e88jzAmA>u3S{XoCdl>2YK{tds`kjh$R>bqvR zE*T?bt9lswj@orBxzLNyi{J&kw}h;(UJeldQuGX^Dg><6>oJ2X?z1 zJI4K+ zYkBK-0+tQazV>df2H>?S_-#*o!vk(+@QuK4R#SP|&g$x8*XzEenpd5wt>M=Sm+QWv z{*fU--c$vOn9Uf}b}blbzlRvrnd)``Z{O=0c4NB+a!oyN7w$@keoHG{_d9IYlI^^; zRRU1AH1@iLOI01NRv{&Kt@~kIJhdc!Vwq>=%Z2m#%;j=nnkHgOl$@X{4YaHs z+P?Ib|)C;@SW-+t64(H42tEq#;7LYJXlL=rU{+> zyJpT;H2xaA6RWzE(y?8uYSa5@t@~-sWmnU7dyh+gbB{H1jlAuO-@KqJ-S9dC5*m%L zUH7t4SKG|PD5+xIN4;&cuNy%^DBHhV_~M3WdnJ`CE8<$kiR*E-;_ARq-jc$vb1N%G zXFjBjW^P2UG0o7C+vmEO=B!Y2(;TfOg@rJk+Vlis$}G!5jENW`m(!WLMDDwe`=O^F zTAiyEoqFhZylv)@E%i++|9R`dT;-bNycsg(Tu@X2$ zt6p<%d+xI74!oH|#;Ub_sS!%m17o(M$-3_^S?dI}^2*W;9??WetJ2XuzXtP^sAa0E z$|XbT9AcDEL#ysH75bGB(cUAr$QICYfB*X*I9*OGOF)d`?>iePwr3K-(WzjTEu_TY zeCuh~n>*J`A|oa%GN)u+U|Rn~QwP<_WSg71y<|&6>y(Db)PbcgmNBU#LT{)y=(6@w z)sy%evAu2lo%7_9s6~b6QWZIFwB%cdbeZjgTE)HET$$Mj&U>8gw%P0|HW`t&L1f#g z#u(KoU<~36oj4L1*RYtNeUiB(V$Ea&F$69#W2)gImecEtraQ)tzP3ZA_gL@sfp5ZG zt)(rVQTxlC$2g~{pw^QT+h*2@)t5=tWG8F4XFp&{F z)D$T=g7n($R1F{dJ3j8d;=ljpzvUq;{QW;YaEw1P*o-AW)(%i5+qDI>8pYBTAug?d zrt5Idv-2I@%^kM$U_JLnaQ(n3MCK$&b(Da94`)fzdV-A#NHNY#ana8$J5IwMZ=tik zVQ>r2)68H0w;%ZDrwhOR*B|-#{@1v!XEc`44-EZ)lf>OHu^NBPE#Ck#$+%jRE;pX;^YJ|~ycKwcNeqEx! zan37_uU2}E6;iC_@#UF^<11C*_U49Pn_rW@3f%gEU)fW)o;jzM=u`2oUaezW zcTU-Qi1f45Zuy2Yb2{ADZWsOMFkPC9$&ib>qD-;ucYB6T4~vMwIIV-WZanX`TmC%P!q=BzZL112v*?;T!rkudAf#)&W!owdXQNetE4 ztJ8Gtkt&%8c;C@G&wjV#_U0Dbd!`gP&kJ*0Smp(99kvK@nwTyVr{j^!e8EvLSp_F& zJlTl$I{RD19EizsniE+((p6%FG#3_AFuf-r5F#(<6Nl3aqwMIMl4G)1mQ*QL$sxI! zvAlTt>`5tNY|?>MQ8PrT5JF(e2}{8n&1YkEz)+2&?>**nA;wHs65gQib;;DZu(bX` zTG~BS?K3)_7o0T=M(FxMvnZX@zRh+h6f0Y=d09f+m>R6<@utJJz7vx(HYWlZQlsGH zw!Y6Zu0n^fEDMyv@#U4{`9wxIg~(Dep%jL&kV53;bm5W`F%`lzW5qIhuN4U1GR4Sw znV3V+=O{#KTjNuVND)d_bYTFp_bg(t-43i*L=p*OJMvsuO6E0Ph+RTlK*X}&A2{5M zt?g3ZuUltU6OpbC>T7aI)1hTO32n7FMk;o&n`7PxIAdDMTd5L(`lW-q8MA7UYp+-P z4C))SyB?6W9%MWGRyM@E?*7-lP!(+**FLNwwBLp{Fg3dOT1z#y0qbTKZU+&*Fu+J% zu~To_?YDuu;=k6exw;8&4FM()#W&1WrW;HXZWBw%yt^Cu)30y%AAbFTcXxMu|NP2t ze|n-HdtRT9n3&tTs0ZUKjt*=UQc;uW+w0~;g*~=GbA$Anx5k3jD<|6XRoBiduA;aR zJ=COzqL(j>32See(^hl1Y=x2wmuX>| zXL3qd?{Q?T6w2rbxlk7!ik9~NDGdv6F}SruaeX`uSM!kQenpI4)4esVL%#6yAAV#x zzVh>QVe%cj-JZMM$j#la*d0zhJv`D&;_G)e+}|D8k2}OTrX@1XiynAOp%xw9T$Y8? zd16`uFFEsEGDWn`YzdKEp<5BdMn`Zo;X5^>qYmH<7P}$tv1)?QZeBGtdhfRiGNlTs zcyE!6|q z+ViFRle)g|TYq$+U`)a0Ov(_aq!_=3cr{`X?-}h#%2_L(zWo!z@tM&VKD__P-rsQv z@bdW+e+V;|G_3aDdZGM zQmM8Le2jJ_=aiH*1q{aGjpMN;{CC1_cj%;1}=@__h3l<^$Py zfOHe+u0mC1R^<>8?rwvs-s$k+Tvanqq)3XSR1Ov4rl$9vefC~kD6S$d6KrMISAO%G zH~jDa@Sgwk|M*Y*{r~h=_}wFPJwN^QJ@=!>8P9+F{r7x27v^f%9eRQf?7F}%czOqY z0I5lhyyA(*^As&qrC3PUC{$FWCI;{5t<@xvIAn1+9=M#2Oiv%#cf#ljGc!vO>Z13~ z-TlZu49rI%My38mQ+fMvM>pPKY9Yllz1wr>2KI+H?8gJh1&M{Q_NUuM5HY$m`SJKk z@5uWDc#qwW7)jJ7!ZVuV0pA1t4xaLIWi-qh{9l#M*OCGA$y(PnOgi1wbVhh8-=3e>VL z9PEaAy>&pSVNk9H$2Ea}gUw%S(`v1^z+$~$w3J~jRa5-ybFmSQ+VaZ2t`xHN`gs~- zFh!G>cE!xLWZ$ZTmG<0OtLb&;RXgiL;CMRm)Q`OMFPL2DjloO{alY{L$Iq0QdAK`h zaHB-r(9!L8eDT$L`n!=&FE4yLb;L_YH)(?Xd8zD{%!g_j#(PEzcKitwCkBDL;E8$R zFP~1-LD*k9YS`n3J!aS=zEc8;DR@)VFt18EuB9PMNm!If6}%@Um}((qHY9v$wFS9# zOBe6RT}N`3Z1g)^N}}fZ$1!nB6Jjn^*7%k-jbZ5 zwEJRbJ$K`t-fLGo&XWa}c%jzF*bm(84-DM^0x4=8SuUEW4P9W|jdY!FI%3khp4ae- zw~pSc`K}9&&Ii2jFwT=2Ue{XvcU8C-q-Mp*8`Yup@f);jy%BmevDkDlX?M}Kbg@2!n{{;v8HDif9T@2-;hEZxRI;#{gjrJlXaXNh_ zmznSCH@u_r^z_2zGEuze+!lr2>QYy?J9VQ-1=q~e<@!FX6^vN2i6mK&5^!!*nn;XW zus~^vk-J03-~au8WO#VTPd~r#%P%uO|NO+q<7dJ+aKBe1dMO&lDYam|#rnWf46zuB z^@>Lp(Ga3(#&NODXuyUhH{0U#=Iq$cdf5zHTC*mvQt-8|wK;YRCWu^VZE|zYZD-l9 z@%6HjZtP8(|CVysYPOnob304dTLaZlXCsF%FQ!*TgSJ}>mr*rvQmXM)1kR-YA~-Tnfl*eYrZv=XiUB??*Z>k ztL!#gxP(?WF2c1oTy&4A^%J&*A+9wRdhat^vcE`C=V?~rWbZ68^eiDXW04wuVvM}J z9QkwSD^ydIVpNrUyXm_|HRY8DD5CFo zD@t*v7Hrk}Wv#*0aENQQB5P>I8b_8&jirTd3{H%q|BGo_uhxT^w!?vXkN#5j@>It*17g42Ep<05g%iYlvX$$~Bc3{Yyu;MF-SW$Rtak~RJ6yb2%< z*=n+)1FKj{fm%{at!qlv*h&b7T66(bN>S8V>x&Y~t7ZL$5HXsbm9^}IO0Cz_@0vnc zomcC?;H;-Qk8@7lIOsRjh$e@;vl!aIEs9>uwc=AD0D}o21DHh33F$JWM&ikFH;lah z@K^l#mov*U<5R^s$4us#Ou%41FSsyLvv!G(-Zwmj;Ju?5?Kw|k zCSaY{>rhhI3Q zOo&2Hhpnk~B^j#qU_3rpDvC9gA_V8?haPWw4!fSi;Xvp+Y^Och6@x8`&6djqb3v-7 zB;6=j?=)>1EHx*VbYZTLoyYeh-C@V=$-JV7Xk_2T$JxcD-jDE#nxpH+k2y+wV!DSkS?Di0u?h-6cvc{Cs?&pA-d><(k=yPXn zTS}PbSkuqdIoAjdwW0TP@n^OJyf$}{+$CX-P04N@bcSq$EZQ-#xzNySHC} zD4OJPci^xa@ogEZ+>3&gYln_$g6VZp&^nq+O9*?1^KD_!(Ar{EjHM;a_CqTzB&!W1Dm zMcOPPT0h_{wrW?Z*^(i((XRCXk@lI^wg@SuB7PNruCCeAP}{~?s_(ajQ1MO=JJIEE zZkGk)JBrQNQ26lMzu}wT{59iYPX?A;ILEnR(knU6kPF_Z8EiH^-dOhD^Jcf>@qSOg z>p91Tr}L4gr)MT}VF&{bcqvbqOCnatRlDHV_NXissft4{R4#Gmc%H6@d`@s#n4VtP z?RRv$jwcrgRye&pk&Z|9L&yDLfhB3h$7Ci_$r!PeB~fc8o+ro|TQXE( z7siI z1K5@{t!t>XIk8Ra%GQ)qZ41il@MpFm@|q-XE@X3qnOi&d+CW+X32v)|aK@@IQne4= zw!tY_?FuatD6-&#&~^G;=jw?j@qE5;KE2S%dp?YY-+uca`1;$4?w|fEf2fIinVAGN z*sOy8+VLfN0oH-2;VexX8gFU^RHAP}KvVwf4bnh|C%;YWwXTaj*Y2IXI)86zPNof7 z>-*2QpSx5|&l~HI>eLwMOM7ah0rge(=zCB5H*ds-M%pogk)WSd8?@G6yIE-gP8VCX z>iM&F>Dp$NE3OTMYm&P;@P}@a001BWNklnCB&M*=Zd{uziC#k#D}_~_+Pd7u~h(Ax#IY1)dAFF z+v2lqM#B|jq5fn|AgtnwcTN}f(;H&WEG1!cV(@I#09^)qeFsRU8bg+hDTc0n7w5~u zbUL#OJ=RrhS?F!x&YO2)L5M;FqtC>h_GfvmdrlI#A+m^a2f0!oxdde_z8G7X6 zh|`(lyx^Uu_aj|5@Xe#crx{z5o}c56-F}aCJwsR6k8NR9G9@Q2^GuQxGC>r>Jbk8? zh;fdb3zuo3R$&|xL*FYF&ggf)l)^GCEK8!)im@J3Ga`BGjWaExq9*J{O!A)2cl2E# zbb+o9?1m9z3V|Jtj$j<#DaKbj5q04uO-Qt2TjyqLy;z?stKSpV3G6lB&=&t@OXI9b zn=3j~T8eR6COXp*MvM1>ZrEW{VNQ{sfBcCb?nWNI{E~0J{)*@0k>m3xK7RVlPe1&H z-R_b7n;jPDLiajFw5Bea&q=v?Nz-+W3}O1PkzbsE6BQH)n(RUK#{{f_&$ zcW`(B8OUkjJfBI+OuQWV{PRc7bD?C1b3LwohdQf92RA59V4f!IV#tHAxWvRnF&C26 zZc#>)X-D=5$}7v z?{VEu$y+XBtjC%=NS06+Qay1Q_xw;y=#QLVPJI03M}E8%I@j^`;hugE#q=0I z(EEYjIJ~J?$w--zni|0MSp*1Q4Df5J@cGl zuG}9+2D8K4K;H?MP{=tl_CaU9obXof^3yy~D)hsV=bxYG!^mCl^}QroA&`w%!AT5a zi;|LzV;lz#_dDKNc=~u`I-VJv8md!CU_D*uF_LgL5ITpi%@BH{a4l{MtydS~NBj02?y+YJ6%!bnC^Y8SS=|AevM%-o9Fo ztjm_#wh?Q}Qmbst*5fNx#nd&SS=RfOm1c;PW|nOU&r)z=xa$Und&j{BOtlyj@CbK( zhl!D2e)yi}=T97`6WxzWwey-o1Ozn@^t@KaL#3iDHhNmW9b1J|*}x zWxlD7aW``R@Q5Yxu;203H^1dH!+-nd|H{Ydg)i=Ud~o!KJ;TEt5*&D~{)yJ(?6q3R zxA&&87IB_f490q}0Y4bru){Rdcd62hjC9AI;86S`E)vRsTGT3KL+l19YfcFz+&NCU@isg z9AoDgJJp)zCBt;lyRI8acmjrCECEXpOQ;r~1#*O}bs@$kN?A1~)zZ8(BnvgqO#`u7 z4O;~%YIrGtINN3+z1xFmC$6z{)@x_<5?fuK-nm@YVQjwQwTqhcq!`FX6aNmx>cYlb zLk)^!FJqzaNAC8KB5T#G&arJ9!*0J*Z7M6xb~S|T2)y?LVk-SOlB+=#zqXXM6%!2o zp{Le`k3alOxG#8<3BF)T#`%i#Ex45pk^;+IapJIIC}mB4zsGc*WVEg?UCzXFCW`JPOwp9A-*@cyg?--x6z~MEv0uz_1LJDSzwVGp%|7+X1bht|HT{r(?9;tc)#b5fA}X}p3VpnAA}+u zml?D<*|zt!Q#xc;L*hz$TG81ST{4%p2sBqGzs`;~fg*ELskbG@H={P2L42dtQD5mE z>wGBb(>LTyV46~C9`KBiX+(`GyJ=B+*P>PT$x0u%NosQq?_)%( zZ!o$n#6Yp`SDp6)p~H1o_nmK{-PO#Ti&BTYbM3RM8{Kfd?`=Pqb*ye@d2P?~Mo_YT zGecG>%|KzVCd7Kx#jLTLDb%#Ev^Dykb&d8=TMg>flzF39S=nxDTG=R6V;ZUQx>Vdu zAFJkIw_x;`_(vuwAu^f z5Z6BKl3C^pbBt;dwIF>^&EIzfEH;D0(rPFisU+qSm9U)KY%b=imo*nnDTz{&R^Ij9 z9`6EQe|X2c_m7yoC)dm=UC0)eykK3!b=6FkigB9$D8?Z;V#-h~F(t*JsSQdyszEOz z-hy|Oq>h#I%aQps5ic{QR9sffPqC3K1<8W(rKP0xrBZ68BwgIaW)dJk$!Qb$TuPV} zF?Asj@lFpl+m^^uTbfLuk}wVX>TJN2f)lSpiE9W%`(Na!@Q4jwDbe zlS-oIMV&oe#rU4yT82&-2FubLV#jf@3Y|S_it_zfIAbUl8hY&a= z;isn)$N77vl8CvoJKSsUk12$PJ*(&C145XXa$6^z`GNZhv6djZ7vWWzqfzaccMKcg(iO5Qw&8 zPKC~NoQqa8lqoT$N{~cXBb_(wJIi78+z+1p=y`J(@ec`{!3FK(sK(%WhZzI8Wb7$% znKIs4zW>W#*!Mk;_YZV^&)0YNJnj$t=9_PMniihtnR825&8IUZCgLj zY+q7RXh+m{R!p&Bo)nF8b)^~YL&+6mwCX{f&5Bm5EMQa=uvT$t+dHS#RyZ%)`)bAf z*w8*J;fj4k2j%tf&p1W3v~;2_c+`;Nyt>(hpsxEiC}SGlJeV6ak|y+wf!gUsDz-WS zR|n*VwtO)0VREu-29bk1M0Blz~cg0&ZpJ}@=HixXUn|QN2%E7+IBKnG$h$)%J z5O`~ZZ=Ip9iiA5Z3t?GwC@O`#%up)97;F)YJ8u`{hq&hhy8mf^7D&6gh-AKq|^kyQ0v?3^RdiKmZG$QT(9JK~b~{P~%AUT`+B z+wa+pJ3<%e`%%9~vg3H3`276D(@7~g&r9Ufr;i+;o|w;P(!4+^t@l?&?py@#JDm00 z4Le2?IP@d?(DBSdEQy*mAu>{p^+Z1)#!_+< z|FRIpV({1uCIAdU^S)PHZcCrMY!&Uj4>)6+p#`vkFzz4(4jvwMJ@;?#7>AzD3$;e= zplu!4>u_nBAgr!+{rzXNO3z$-#aqg4>uWZe_+)iWuk|KtpVFG%+7S6F0gFhZl9;XD zfg#F86|s$D*BhF&R!U>&=@Q^T3}1m_t#4@F2(wxI`~iM=MsP9KjiGr=Cui=Q-Q{JpSfY;y0N?4H%-7YtV^tu@t z>e|bP(T-nZ6nEP?+>9|TVXf&GU7VP0@Lfk(b0cnCdk^n~uT{53y)pT6LvuoW^YM5z#PY4E6oB38b$141$Oj;(+(}`0&l4Dfz zPfqPFJ!73^x}5nj8Gd+*xDvUP3!i7hZm3`pQv@D4AWGpc$F`!ad*BjYYs<*h&;>R94>>%`1c3=iYURwP* z6cK7(NJ&_z9Ouk`|HIGxU-3WF*U01DotiCDWUjEJ%6{0>nU07jS3~DJ?ZVE9+NyVq z^=h;-f~{@gEQTVLREq{1Zd+rT$<$k~vy!*E+)0IMDz<@tr0Pr8&bktl^UPkjFQh?9kf@t*tLJy@+XEP0^|J$pZ3Qo)LzQKnd!D`F~t z_uIckzWgix@BjDz;ivEa$m5$g^t*eUaSXu|yvJEX7MM~YQZ{6&G%;^WOShp%(?nc_ zcezQo(Qxf@?cv1AtLhqaC8PhU$J5*h({gjR=xp0;cvm6zrth|{btN|%=QR!1D&?$$ zYUul($A>o@_6MHMFJx<)LHc&CbuB%se{Hah`U3U#{8-N)s{sq|l=9*%1gF}_Qa!N= z+9fz@caIt0;&$)V9N=85ytDXf3H^@#ZjTtpyi8=VSEJg7=aqKe%65m*Mf@n571~)XOSFnRd+Z4(*6nI-%WSYR- zmPFTZV{OSo(-to^>mg3VTfoT;ZhTbYZ-CBc$9S>QJ6GPvVMi56%3)D>4In6*> zhoM6VbnUN-(FGO3Yr4MCGMx48`GlP{1Tpxel{B>&vJ{F<%Aef~724!#5loJH{u@Kd zx}2-c2y8@%;yIgvV_vj+uv5*V+YNMUU0Brx$2$rZM z!-9}YCD%wgXI(~@%91k2llG!J=Qy7eFVBnCjbW4obeS|PX(Wec*md6H`i?O47~kf(bw;Wl#5Uvay3nwgTGc#WE0^hlNNru$bt85e z3%h>gFa|R49B0ncg=JZA&hhT;TlROI8f$B%dU!cq_~qkAL=3xe$8dMY`0$8xs=uyZ zlo%t~p6CqhcKb#PD&&%N&J(@MIBT#a0tDQX$cMMEP7?%&;U zN(nig*=IeczkPeh`$M2>IvCE8vS4cv+5O+`WIt`1l3( z?!Yh4FTB|uc=z}gy1*>L5;M!?g5*pxP@IG6F*VYU&<%H_IT4IO!X32=)A1uUp6ING zF|rfHI4V7+uEfGhM(A2az?E$gqIrh9p4|2{TsMc%A$9TLM4?#O_4ZHESD1{&6tv@CF=dXnbMqd z4C9Wj>(v};9l;9TbDpN-RZVBxyT2u#+0gAb>3LbrQ#V-oMu0V@YLfeA3Arxs z*Kpc(Q7PAXZIu?QY{v1e&UjsnHeKMla5t|=G3$TidUCa;ui@7dB`r99gKukRTfNQ_ z+fCzo?NMEMvs}w7ox~u4bFwP{n}wR|JLI&tNr7Sb1&r z)Zd>zv$6#k%q#lOHd-2UQwR6!|Lsa(x;5ZS3z^7m+J3E$kn68Qf6C#NnPjV!5)EUr zwFRzqk@h-6+BKliAnYx;Y+hBrDe=Ip&zY-8sZA3!j8^aFQVa96@bvVVpFe)&=Z`<( zgXOP(`y1{b?${p=c;D$Uf+{&Et+vUtp(RbDVj5$y zRDHH25!1wcnVFY~In9i_fOD`PI_~y6=JTadVgV3h9I+Sd^O zw}1C70mpY=e8q3R{*H5jr6f`=h_e{y!RwG9c7360|7y$yu*@-%Q(=yoopoD>gW`v* zCOIkOTF6TxrO2QD_(y*H;YXfCv{TQTCh!VHtYYlEqqGuwO?3#_XBGcbOLCP$tc6?? zsU%KCd)B16r^GgNvr|WyZ2gv3yhN!hBBbK1y8eU}Tai`Rwwef`Aqf+er3y))SWTkG zTEXfDRWT!)Tnff*CuV0X|C9G@{&@0Y>3mv{2 zaG~`#`6ie+tK8%=Er>1Nx3yLnG_hc|Dy-|cyOuv}6m2^=qHPN!!srxP#FPne-2c+W774C9Ekj(Lt8PbcPi)&*%x z$x6ehP@4nSIeeMbrSA;27)n%Jjdry{H>j)Mw6}1UO39{~=k*(5jiU=_Kc2VjLUTwq z#E)}r$tsl+msWGp`iY9)`akoUa<6JYsZ!Yu-ImJBF>!u*=6HM}FA-yeTrHQ&%uk;_ z^7L{dmP$2F6X`f=TLzk9+OoQmQ=*Ed#M7G4Xa=9!Uc_}xyR3h&Vd-T%u-fHK`vt)E zY|4WOxfW8JVO-(lJ ziY~m{;=+1OA8s9x?E+D>hC*%uz*a9^_Ez|iU#%Y+_S)1Hb(5R(PPQ(p?a;Su3r4wF z;M}HQWKGd=gszeuL6-w25e2lSoryeKO(1RoHfK+nM-D_l|@9C zf~Dd_QL#1)i%m)-5j2h7e(xz~=9EbyEV-!w)@tt(Lhv3R0(%z}71|H<E!?$05#oNb69^X80f2R&WoCT-nb#)fgIsW|1 z%J(urPQ-xhbjay4A$X|V@@aLd19Gnt$9c~kogcANkKcM zq$NFE(7&g~1KX--*7Ltot#;0(DlDaPULu$CnS(Pt_5&$&us3vJYFDWkLySoWMGVPg{dJ_Q!nD;6z!Vo!TQYfD2u29TQi`ESCK$aO zh222+c!%BfNEetlE^EPBySXf_xhB`wq0kveGWr}>k@aGsVy31&o7#0@jXG;uSn~U zl9oQU-12v?xb_VTTc9}Kj4d=$iPa(DX7II5RB%lsR-=U7>Sk0FZVU5uDJa)LN6B7m zCt6EIw7c{M|=?`lIu8p3`}&g-1pM2#j;>%v|UzUx108V-D= z3V>~5>bxpSHxk2$eiE-c3r=i@WaFP}NZGdN*hCem`@VbCPVr_Jg3bJT5%bHM6 zC39Z1PDn6d^&S+0Cgp@5A=p^j@oDTyPDg zulL=p190t>mVj9eJ?pD~P5fB1Ef?KNU}$}Z)f-Z0=xPULKtfL)JXsbstl<&AXMFP| zZ{B@H=SK_)u_MV1^zXi4_w`@lcXyPm3;Q&k$wu!@B`1B+W~FzO!nQn5^Gu3~m?I@Y zSu!!5SkjScJ}Fwhz+iePFwGZE>B398@cD9LK3(XO;oc5Z4CfTNEQw>x9GA??lz4i% zFfB>NhE&?YQ7J{wiChx3WX@8F#wyOQJ21L{@j+3;y}<^M8hIEz|M+)*$6vqyz^A|b znLqsN!t*a@qMI<*F^mrJflI8!ST%*=I)fcOrq(~j_JsM40H zV(3ia>xVsm`^8(n+(kl+yni@w81I-fT;iGI^ui@YW`S%gQ7ly)#bi8gBSd)DVH{91 zl#Dk9X9M1pjefPNdZtRd2NtartU~V$2Mc?#%!^{q_dei9i|jgFve=rj5{XM;&W0ta zS@bktn5T-jJNj|Qa6j7gVklt5voR&THTNm7=)TTx`9wtI4OCf~u{pW8Gt_E*5OVfv-j`F*lIjoAXGu z_Oc0hU>LiR_mA)S@$L=BpMTW%zp)$o-C?kelopzqQb{beB@m_cjyHpy6ip(vS5L`? zl8n}UIjh=NH4MYZ{dnN3cOUrecYn+7&6k{(s#P0p`EI+Oq4V?}PUj;*PV73%B-#aA z>pG)p($ck_c~2Sg#{d8z07*naR2tgUO3^TgaZQJE(DX8op>shi=Bg6gVv21xUh6<) zOM)TSyYThrDI3{m^%}0duj2GBP*#Mnc%3PYYH+n)DNXD9`f3twM$v|OUGLCXN7;5R zR&lCTMSPv@*E#^5!`<4KWR*13_dO3mI2a{}8Dn^U&dlY^IUbqo%pi^^Nox{)VJ?ZE zKmQr2Gao*DpzB8N4~|_J`H&1*9LsURr3>@)MDYs}&-BZMcN9JZ_&80B_t3qA(;^@T zVmcG&3t{kly?=+ddpskOg?Y-PI5Bido6%~;)PTsK$#4?Y8C)L-V~6iM!Vu`Z#~DLj zqMC<_5VQUXP;w>JNOig06J^6)OVI_hU1yIfYJPBTTR8XnLAqr+mpe#yF`K zY;c63Q$k|N*jfpIYt*4sD-mHY8UN->MmrLn;jtM@eS2=iKui@Wj(Dp4@cm!l)6YDg zekLCc#d(U`f!Q(a-t*z@8_eTx`SP-0tFRwNY!|qctnY$c@fNDrphYbPQUse>j3F(V zoeiYw_?O@RD>+{fvtV4&uuIU-O=^dY5z4HF45uU?N$~w2|ICkn`jLP8)A#)0kAGp3 zfEXdSK4-jXOJMD`_E?O`jq2ASwoq)tQ5QokiOb~$Q!jk;?K{Ta^7+#fmrEhx+K#1H zv!%6!p~Jd8DJ@7Z8`Qb^9?`i^QWDOUz6Viv?(#CmKtm{eFUFT7lyiSfk0 z{_e#4{|xWH{Eq+cPru_|e*A&E;B*P!XY8RXd#;WRyA{Rh_t>%Vi;HM2V{ys%P}H}YRy6Vv7XWXWfxE2O+&b4_>=d-{%w>vJ{ zVXW#_bFA97Pus#MZKiV8={~PqyTqL|dW2B|x72ILpxAZ~z}|#eS~9);-0fNyxymD} zR#NrnV2x9ayVc~ZwU%v1yVWSl&B|S$k(R)(H-B@T54WCsxv4)`>4EN5(*4z=y*@kU zN{mu8|J6J$MqV%Y*LtIy$_LixS?ZSHtT*4Al^9uR%U|PE*I1XtM$Mq!7&_6gjcL)A zHT=6iyDQBRQ??w6b*e`P5r&-Fd%}^dFsFsjr)Ms4;qCn+K6r+%XK4Y@$5weEb=3nk%I%#R+-fak7ATpVX8!W=7rZy@_aoW9 zW!&%Z)lfo*Ga6bjBKTBDwJ@i|VpZd|)?vNwcTIbS{Qvfk|3F9Jaev3#yGLT0u)*PM zXsJol7W9fzx31wfYsEQFE`=qwZo{nU$WjZEHIbK6CN7HgonvH@iO=U}UY1WhEx*v^ z6EV&h=gGC=ip5D2gtBb2Q?6}E*?!nLFY5Fxm7L?&sT`$fzm&;X-yT-qdXmK=S%vE& zbxVNVHeb5-X1CZa0cxArYK<-qDZR(LjzGcJ!r(o_FmmX3+_{d& zYB?M(q@0+3oTvq)i3;8tY^R-!-Z`An0mV7RKvr?=?(XP!dwf4)Lcm(DPQCV$56hjVFTv9pRim$(pm&%XDJy~j%-&)TbWnPyT>WD^wMS49v08wZ{UBs8g+ zQbKCh-sP5-szomhz76&T%Ti&KVgtqW+8J+~(}qeHdhHyG3&Y`_6c>K};ZI0PoaZAS^4Gk5_W?id*;|7R zo_Z;ylvvV4UlY5-o}nMu@AepPIiDxubS5tsN{skUdklS0BS!G;^UtLXrJBeuS(D(G zqV$BCo6zgqJw0dw)8{Mp76-N^1^TX6@gi4t!I5)r1GJ%YvUS`@soUna6dJU|kz*mX zpZyeP!qDSehjHfumw92zg-_>+pMUz1(FzAA{3TWX?fV}&9WQ+Te5Pba-|flLUbLc# z_f#^uUEJ4hWM>nd4_iOX+V#BR3#(|Fvl?kQN4?tlmPj-}X{jt$p{2@(Q(T>ma)VI5 zX+LQfH@V5o>H%uZE#gmJCk!?upj;hq?LTU<&D!Q(_b!TT9gb#O+O*^?>oUK-LJDs6 zk!w#Y=JvSXE^$@z4XRRZE*UG%>FPDSCKzt}wzo3IwkT`VkSY}0TzG3Qa}&n(5~ONQ zwrYLwA#kpR>GZ^(PoJ@(VqiwJGQ+Bg12Ij|G23ENyTP3b@O5K5Z-P!TqKH7O?!1k` zI>kKgtYNUQbB3|=NbiXv>MX}J*Lo$^Op&BPA}W*USs>CicbvMRPoFL)(^$=!In7+Andv+e7d>M;-|J_1?OPrm?$t~f95HJZ#@O%Ze20-UeK5$9aBYd*^?~F0g_qMar^`vZkiDnt zM&=~EOo!{TE#)v`Bqb;SZ~`B+;X#!Hgd&+^+lJ!xz#qPTh(C1;ia$( zp2xxS-J1u#eSAak7cM`2WWHRuEHh^@%rS8Y9lK#9l+6BcV7CjryBqoD%_H7=K7W4V zhfkmQ-5>wRd_LoyLzYE*)SchZwi`yb4On?KP*}4ecw77qazUJI)R1a!-qG!SzV=I9 zt26X$s9KiV264IRt-C!Vwz8P^KGiCZdK)A&wISWihQD5y(b5DDG3NUGwdce%Yjjf7SFU)oE0U#s z&bNJlH+YCE=JDFYi-BPraa{+#Bh4q~`9i6QF+gZykF~AXKnh~@Y}C7qBZ=jb3h8*} zdAabIWBxLOW2@oq+k3wH>I2=-F{g!>;}fT+k9_sTTmJEX{RbZI z_MDHOxc~5u&I$kYU;YdK_PgJ+TqdUD87FFd$gz@=rm$iuTvF8fo8>~CD|Ja=62{eL zVS$<|t~!DVB&nPwajFZ)cp)vBQ35-(r`=Gw#Ka{P<|-@|&ao(g%4>&iZb=uxQY0XF zLhl(mgAH2SP$P<|HCnY{d&{`999-o;ynVy}^5xffXZW#Z{yd-f)5|A1W4Rmm47+=b zGc36+#I0*$kyo)Drzv`4@FK0cMj#%kBodBldr~{Uhv2v$Du4AR@(Zn7!G|1YF)K_P_;if}=8 zv4E~B0961IIYoqryA7)PMlSACHH&Nt770KyGa}s0Ro}b!`_B1v;xq@Q7^%Jo>u|P5 ziouJax2`Gb492R)&(y-`v{^Td2G^^9F}2`c(TfqT7WLRV&pe&g@tg~nMF;S6u8bHC z_XmvgT%MmumlI*0cs@?NOf#1><2uK~{x!R?kv?_NDp!kPc$ zGV|LH@0pJ;q$(^+;hYPX(}gh4+&|v&*gNh=$8KkMb+Am&f8tLcFI=X;>o;$?+l^aK ztfWLpnUaKzrPkFSS_v^}U?i&!uTnQki)?h2t6z3~XRNA`awCOZy`zYH&Nlh^5WBU+ zyt8!u(6GZWrJ1QN8ptZ`0WPu)oJEvYSmiqVxgvlBD+MbVTU49T4L$PuEpK1F5?$&Rj8%;k)@Cu~UM zoKz1|6UJ*{U``rZug4QM83wbX)}qbR6${^fP1^!`6eR)n-eE+;>(&Z=H!7~*d5rIv zmq-YOR5B!8UP^mkYxJUQ&qdiTh~_ry-oBq}R`MD`E!#c!mWZQsIuV_Fl_uMx4Omw- zo;6BAGsd=avYx-HXi&YBx{*FjJM+jDtILnKr!m8EzLnpP9$SEd1W8; z1r9h4o#U<_7&{NOFfU6hIO+Q%T2mXejw8m++}4(vw9 zxy*c=Pb?)-Qem*2esf;^_j*gh>m%6l`4}Wy+jkT5x4SP7C?vsKnY`uVK)n z&l^`Vr6vuhSPOB{XU}-goy`>6G2Ff4%@^PB@%Y%gkMo~*?X~aTBB_mqaQp!`oRZGe= zy6Ba{mAgTow8M_?!kK?LLU_9)Jp6)qIP;tXJ%#(jp1$vi8#%``l(#+)oa@`Xx$Q=3 zZuiAXkpN6F`*+n%%iaQfx7sSFi|vYQtD^TWn<0SA8S-;*_3+Zj7_Pj$kt((7KTBWnw7f!zH6hzmi5osmYdW{ z!4S=EE9IJ-V5aIq)_KRe6_8Caa{V)x8$wZ=d948*ZsV6=3%Xc3>aXv46`T8}T5e|cD zNMkP0IZ8|$5x@Yw*rwXn5{WmensX`9k9#il#8W90Q+b*$oR=MTnsIh$;UU>hn3^Nb zIumSk%DPg)Z^OImS-v*XXDf=VP50aKkM3BtVp)t~G8He5yZt?KKC;{G>H3atf6w9m z5odd1tc=sFr21MYR)3wjWEl3U#b{xeb&p$X!F~1m6|M@T%BK(C(|e(#$NEkiO0l6d z>gxN`7k!LD(e~5C93#)i6Z5>VEYHLkSf)S#`LgglP0Xos zjumVn+ zSP7})u=D&Vl^BBlfK**XIS)f`>Ac^dZq_)Q^H?`l$Kf3xw=5qOIyPMHuRgUiQb%B8eNwNvNj@&YcCLOvDN0vcE(Y=o}9v#z)m?p z)Wo@v)rD0(F+<3eP%Abq)Z!pEM@4anb;PXHf}IHWQs{RB)(L~D-0c*Ff46rWb|Z)V z4r48@>%j=QIg5>jnkqE~OgFGpA=bqH@t#jl13x@{zzrSJse|iqc)%Km?|b6QC+6o5 zg!4;t9!;cZI9@zC7oJ{@Jbip-2@zvG*0d(1)fQ2<8fvf&Q&Y`4aJJNtNSB2)E8g6C zLs`_f9?pT1n8qmmh{tPr~9oT2&Aa?xcasOJ#F5(=>xrkFX0 zg`Lv|SO^K*dnIyAGxNN(Ms6X7#OadxbeuUI7h)E?@3GyW!5A#D7EHs5VXlJ^*Iwqv zx}UiTOkS@q&4|j1F)4Y*=?a5IkUddSM;Pe7b zAtm*@cfQkPTV8_(I+!Z8V$+~uB<*Bg@zYxoM5s=-!_Qi56tsS$eD*%M;;#TdH0KVJRS~sZ^=O~X{1bziLeBI`uLHbo<4Fp zAF1U6HY@c(q%{QA*r@*e=90)cYTL*P(iuFS=sG-mY)B9bHD_&>Iom$N&~;u3AVbHl z?-{xt?~HoLJ6+y;ZddYqB>YkzR!B#HeOjs(tFL)Pl#nD>_xktqD>fJlWhX+2*GasKmVXS8y z5BPD1+3kp8d6@#I%gl5<6Bm8wXp6oyWMNBNW~K1drshde)jiu`y!i-Y&g7Ud4Ph^B z!D`zDCEsAuR?0>@R#4Dj)QUNit%at^;wdbI7_|W(Lwl!YI-@PB)PZk4)Y6b*)>yLf z%y}j(s^RfPhnSltt;`Gle zm4erXu(6z`3xEFZTPA^0W^hH9G1HmDV0pD47>AMJ@P_IP#%Z|cPv1ZD{`(`-<;;iY zXO2PDGM(?0pi?U;r)_wwVW8{9Ij@gT5kc#N!}<;oxs4lKk;F9jpQf`*bKWUU=oRRQc6Ucw+_Jv`JUw zFGVq0ZTu1b30x_WZUHjr4g9ON4}pjq5SeF@+1UUP#ptQzL}M(EOJ0^8AVE zd}JI)?hbp55pBH1iI@V@<)Y8CaG@+0!V;J-6DcMgHkQJ^;DxlZ*k)@iVyHH$;@xYjC&b%@gjfN3ogDJ`fZ+DeX6 zu)V|HckK2fVlv0mnbY~md_M8|)m#3%zy1}!{^n~Q-@M^3-~EMu`Rza9oZ&zJr~kmv zS)QJL;IF>=hVjiW_}xGKhX470`d|6|zy6Ntc;@_k#^I1+2vgK>4h>-pEGZCjXv3z= z!+zlH{ejNwXXSLBnCD2!5KD|bkA8;7v6q!>Z6jV{b^_+*%_UaNM z6@5>L7`%7veFx4Hs&L7QvR{cik_DH92kE$54C%)gf;XJbf!TV}!#y?uwr{?5C}Qwk z2eu>DN|=wEF>Xvg`29Bi2!j#W;`e2D~U4sLPeEi%g#qfBZwwyc6~&QL`!? zKAvX&^5GMyc65VkjQq|r?gmU-4)#`6Iv}`CsdYIk=|WPbgb9-ieRh;oxy*sn99ZT+ zipw?dCQgGo2um(3F=D-N_i)EoMR<2ta6`xU)5K3d{6w4rm$~vhN3tpW^6OW8`PHxa z#hWiU9C{9;;jN2&?II89%6!C~@3n($VpedOpCz9y@pK`|5Op1wAZ5xEBDo+(*pR=Hd+fTmG& zZn3ykw4GO~(YuAWsLf*{T%K?&be&Lhr8D|_Q<9@79-M-)diRJdTUc*Hik23RYr%r` z-DKMP(wKFytFxMH;gSPCeEdNFum8e$*prRYM~v0Eijj)sf{B$-;3a2*bhyqo9gWc? zkSHC{w2P96mP5R)bPj#)`HHo|e(1O#2fBV_NtyTaM9P7VOqS9#Hf`ZvTc~lR|Fq$^ z+42{9zvHIOxGhX>BIBP)bys?VSsQJ7u1;C;-SeVB;=b$H$&OAwUvSi_;*1DEiD0OR6)c^NBD;oLIU}u$=)MVG_zbW6MM?6AO@RkMtvt z_Xox*eE9I5m*-EUu;9IAH|*%Tp%w15xqq1#&eMg{=|~YF43wezD9$n15o0|MuMYg(FaIOyRQRv|^v^_7ar;q8xJ$v>P6KOL zB|rhWkuX)IVy^GG+T7qR<*k`xi?Jg)8?^{K-F^)HRIiY^KU8Evb(=yKELq#e$Trvf63wT zE8gC{=J}@|*moV{{vOwPrfDLkOxN`o>j|+iFPTzc&T*sVlm@I6xz04#BG0yr{Mo|! z^QN(UmIv2%uiW_B*Vg^#detiyy%F77`?-ozAtTPRLZgmD`^_&r+241c2FxHW4#kdaN^>o9?csMZbc39tQSX-7& zOSw`5)-#tuX>{8>q-x2`Als}>#I*0tO0X^0U`CsFuV2UO44<~x7EEz%Zn$c63mMsZ zV`~ItrM8t?H?(^M?vR!}QB~`*SsTwL5cD>G`t*I=rvTNr;A{snB&8<9R&n*^fJnF^uC5 zu^mM$wigbaCs!d6G1lRFPfQsr{ic+#=<~pd(K1pxzOcl^`Q^li_wU*DJ-czFANPo8 z!}l_&V>&ksw}>#u$oX>NJk2aQaheuRr!&V%oAx0jMM8%R6_zEEYGDqMIVN?znt_lZ zWXNq8x1`vf&YWYe}!#G%erE5cws`>w-SO$ymm)yXC5V|Nrx4h*?)=qitg zp1Z@qDODu3f|n`SG?Q(m82zAFdwmF7Yw5jb?0WisfHp`Q!NbTn26OY5Ht zZL45gL#yiV&(d&BMi;CBcU+DyB(a2;n9pZTkk!iR^vv=26Ca;Haak_(DNtf$ z30Yh63FbKgj{V_|oG1O9o13&gEg>!j={(gKYPG~H%t6uHAUN@grz(|{B59ea4FM=9 zHq?odG`!aqzcZHFkT|tw4YE{wec`kvhq&f8&N@s@6;i6inDu$E1bvaDjH}wtsyXAt z&^w2%ItVeYCrd}jGqGBXcmjr)^@3U&Mlb2QWpmHw)?`b~t0VGxYQMDPV`(qawQ;b% zTFQC?Y9rtcX>(JfS9)IA1_^R~ZEX&m+_3RdnzyNPgRLogn7u_l)$4FWUwm2rD(j*D ziubw6ac;w&4N2ed|D`#_O8vZDzai>3AI<8=uAiqoZw?0BBw5#P%yz*utD9FFbIz&b za+!j*G1h@t-9W@Gz1P-RA~zl&r6gd$WrIng$aABf&s1A5O9T;*NY}PJ+TLH+P0naw zLl+k9sbTf-M0<{x=HW%^>YdA!N&@?VK6(mF*^t9)ev!2`nM!Hh-SSxshe(c#l z+~dXp*I81CJlwtJZ-4b`{`S|u;+J22#jn5lioXijY&q+m3PH@$hcX;jyEnOqdtd9TdSEhqvmb zTNd@p``**_o^e028%OfqBfW;TBN@&vXemI;!DK9zB|*#? zDG5^(gERDWDE`%eMj#{`hLeQ6>O^1EDUboi&t;>)mLBh@c0VxmMJ9W5OoQ^WO6=J zY9OV|yac9Y;XEyzFEew9#B9hJ7E_o^WI@RyIX8T`z&u?D)6Ccp_^#jFP_iYyuMOZL zrC~bPLo^%yoQBue;dUVx5btr$VY&_*JH;I$iuE=Y?`e2L9ST|3DNZRHOqW|~U)w0o zdunU>t>5cv3SzA`R9l-lXZ>k1vbN&NbpeZ9o5u(*xlnUrk<5}!8x)%s!h;wBvIz5O z!kH&(C&XIlx(?@InKHX^&(~jm!TsHVDJ*>a^u##?j?XWI(?m^`WsU@(_?}EpPBd>{ zqLgL346Q@A>jL5GK&5iil)gd5H}tBs^!C~wvyF%#>mq!;7~Nv!WNniPpHV138f)(W~VGCpr9tf7gr4J}qo*Y@jQM>kutc*W7LZ!{x{klVuIja0)G!r$I< z=5v?q4JK}TJFcELxj`n^HgXX*ET7b}xqYv{m$ISbs#DrPZEiGcjGhnYWot;9)iu@> z7MdP6?ZQ~LFQg8L%8kzO>I*DY@%pt?D7g*pOGEIPn{d~)y;ZGXirKt|wJl$ikdvu3 zVatN+48?bpI76~{E7)2zk!}>@ZK|WAQgT9=!FsB(gwnS&Q%5Y0Y(3Zv79Smvp4GrC`$+8ArDpwDnUG`_@*jMTa2MG_gz*%jJlz8Wc9eNHW?q+z%r| z*Q<{+&J4ZdaqKv^x1TsgzxLh0n}-9bPAoZ4s%U_6^(U9Y^ONKF(lPcOkB<-Rb|bmu z7M`e_&S#!qj?9;jT+SbP{`3MiGf!GO$ku>~nM?J*E^M_In<` zctuPv{P|D+!f$@}PyF*g|0~vXIyg52-i@jZ5vvQ+hQ3VJkZp(SD}&8+BJ>wQp&nmbB07_DXL<#Ht;-GT%Zk^8cMU#jcO6BNm%2l29iX*kNd7YZ?*9z zskZUIF1S*ygqmR~h;i(SPWSz{j9yd({2XUTMPSkK!4*bU70u1 z<`qg7YJ{{#cT=yX-q%ejm>MX{g(3;lIezi@n)|o!c>m!8|DOKLoT4feV%lC>#|+X$(Gn7Zly5|vm>3u0f-$p4M!x2`%K8cNr!pQ`3EUW1fIoBT%a zgGwFHuY0z&QI9&tSC4$<9sbQDG3jT-TB~03oS2SJkY)};$8I-pw|~V$@#J)e+x6se zN3sJ?pPslpf8y=yN4|RVhF`sU%{LDZ{Q2Mh%(p-M1g>MeeH*)WL zMiGwZBd6z2q;SS{dhRh|8OMRU!yTRXIB}S2+Cr#8iPV%D`%XiUe(+e+BSyoKrY)K& zl~^kmR`0pqjZ&(FC6Z$yEs>ISHW_lJrijh@zE@9hX0ZcCdIs<5N6-G%JHGt&-}22j zf5qmqEeEY}WGkDK#92sTc-o8Qn!21tBP-<+M9-V1{$NGV8 zbd*bCPMInl#aMDtIs*n`PPm$zZnTnfU=9m&nA<$rV22Lll@hsrmc6Omx2aIxW=v-5 zYMPR`goW>ZdQXi3XOyVAEzGD`bEO$Qyn5t|=T8{#`Svg0@!j`7YUrTv*^N7P{m5?U zF|`nv8Ji=0Qnl0^V4C%o)%S+o+k1T9@o@h&Av>0rC(g%-pZ@sI_%Gh#jtllUGZ)A5 z<9C$!3DZ^PVwj307pIEUnm{t4B$lZ936IcGG2+R7WUen1N$gBdpDHC?m{~X{$22)g zh`4$om6?ELsh(mScZWMh?>Qb{n5K!E6TJZ4Kq9|)?00*{al{%+D(X@WZPuULIsSY; zf|+@JSg10x-&Owd@rgft_Z>zS?BIFzuIG7LIGtu{48$CnD^wflz2#m4<@7xzc)oo5 znmaCh_}BlNPk;C=_T`BwoJh7KwypYe~7y&MPQ)uDOm)(T94r*Ju6BEYcWDwGPwfNS7ru4EnxY=iMNrrrlHZZ=j^0 z^bhaoy~TH;?92co!;%P>blS`+g?s*8+N0% zim7d3f5q)rRO_QupS=COR8{28)#}{qcwxSrS>}mly0AX6n7C^GfHarKrZMHi2Hw*J79mUDxZGDeF?!8htMn0kH-*bV?Yu4)2B0cjuOQQ;0&mK37*;Y_dPx*Bot)&fVKaZ`AEvf^Mrg$prqI~l`v=Bs_ z#cySgEgULWbx^%g3$CSy_4BsUPgWAu`Z?GNhRrcwUU8al4)`My*_tb`=sMywM?=NZRQ zwLaG2tAQw_7&c9xa~4|+sU-c{mV}dhqh=6Qd$k~mJAV8~&XM!!#MALT-~Qo*w~p6u z-r;=DU;gqVPaj{vI7&6-l!+-4mc;RVB5rS zCL~7Gnd6Kj`%zsA)*-D;OuNviyF0W&YtkfIt)#4p=8_|y!bs;0^GT32<7>eIrkIvY zZobY{F)MjPU#y^sN+spmQkU8mtqosP+Qq|4B}rki|CUMAjuI`i^!=H>WFm)mpZGR@>vvDVZ1o^f;x);Hu=*j&n+r(KdhfJ1E;o2;0U z0=a6-rU;}qWX!3sTmm)aHvdwGX!H*21Ya{9mJU74ukQ`J9WK_PeA!wj(kKnEp}#H-q(CWhJs@85d$-}$t=%r%;GpU)F0motYTnwi zQst(NdR@%OE#kR0FJLa@svgsVVx4QbVj#CcinQ-pHSNn#Hgu*Q81;ECrs5if!>#y5 z(`kw?>ES6C4M$073z61-%-qmK+Je-!1yITwn#dHgRE)QXg(SjaAcTcJB~pbTO|JoX zE7VvNMPJn4Wu0a41LL3rlgG!`jCYEdEKB5zSC9PXzxzA>(|`DTzWCxD{Wub9Wr;JX zM0(R}qc$gEh5m5B8C`6LAu;%lY1ZdS-+4@id70IjSs>Jc89ZjOJifi>zTPp$uXsHr z=F5qBnm9gvA}>i>iJ@R{onDBEuD9*MWEmH z6arxh>J~&OsgOd13eM@VH<4R-272e%^^VRMOf($NM=qBO-T*c6cF;E9aY>jEaXC@v z3%jAGI(R-GN%@8IbS8?!uyBcvgyJ0Md8VX9?>wV5;4RfhYz>?~e&T$*aGuYUu;7oM z*v~J-!=8|4&S4_eqCUP@NJgOZ>X#0QkP1tzoTtPkBy#oShJT9LTVAg3N`5=)V6cmn(l1tKV6KKh9qAX;O!uI&9;eq>yM_xZ3_|qT%ji(>KV_s%H zJs$}XjOnSSBb$zx4dQ&8e(Q23*W3`O>t|NBoA~+}E)5k{&CSqPz!Zxuc0=M}THvS= zO-wtbn{^N^a!t6m|L@u&Z(%mpp*1%Rv$E+}rBPM3VL}@oOS$o}uZUrzgOSxCd&U0g z-z#Y2S6cMUZgiRJd#<$ijj^)fVe9IeU0rS4gu?ucSaS^{Too}5+-4LDwgt4-XFE6H zujY^4T8?WNQ`C8;{oobVuL0f=f(Ej@*HCE-H0ZCTXMO zPKj1%%iUTBrszV?I${-S$vWKRW>A7r@{=*`@>VgT0T0OqTPx0ar0X%U(;LMukY^p^7T8$p=a=p zAAa{O|L_0v8~*XPzvagtXI^GUb&gpaVta~Ma_2P^WAyGPjU=`;3tbQFz6=Dv=asr7w>>qd>AGz;#+>ISWFNihN z;xM`3Y9s@fWg(`l&5o>?;8HWwteERW)Ci`g*h2MoR2K2(2slQgc!j%$1r$mNu16v0DSoLfe#;k z;^S_|JPlae@v>Ovx~GT^@HJ2beM5f6P;ql1=R~T8DqdS5ChHt1@&^`+aG@<)PgfD=-n3WSMTVGuU#AAXv?}i+hRl`Ilmaw!I;?0FmRNLpQ*_IF5>S_0=Qn@UJXR7My z#ywOG=9ZFiUYE??bQtS(@nr<#2PKafMJ#ix)>#qsVvs6?m>TL-HXrWGFb=LgxVKF~zc+7EFHOe0*WLyr||RTb4yNfBgV42arImf>{8sKJ~g) z>y(yQTZ_#(yR`*7rvYu(NNh7n^>MipQzhog`8;zzP0Z(+=`v~1u{I1gr4c5CP8_}M z*jdl6>)7`LJJ+)}o`+$_{qDf8-hRp7fAed8^N;_9KRxVul$q1hPdJ;XVZ!?de)Ywd z*!G-@%SGMVNsB{X42QnwaU7}Bq#?vw$O20(4IK`}2)PxPN>-whDXKtJYS_9g)&Q1R zMc~Hd+cU|uIm6X$T=7`jlS{_*BL!hv%MwKcsABZ}Z%g3v;Ugc@JO$2k#Cgk- z0+%V_%@HqPNsuF^6n1uC7)H8oq>H}KQZ=}@mdC!=&|67dE(t3_ zG?o~m5;t<2C8t7-5lP@0&2GhUi`Z=;Xr+9%Y`kg%ShLGpyUhhT_y9WNQ6xf@~ zxBeO;Thm{}Y)xiXVE0DWkybiup)RR6p+Q}cu6Lu~t>g*Va9s>0PBYZl!tYH3WZy_gB%U&Oh6)`dP8-nl9MV zc6BQ%==mkmkquN2X4m1mJ7k}*Np*}qrj77eZU{(Pb}g!Ep}l*ZwBU$rVpnMeDw+q} zTD||syzR&p!n*_%an`PsQ+B{@0+!fi0!_vJ2F$V5~ZqOjLwua{FyfmbTL;7GNm+~MY+*;H9GnF^HG(c zE{2VsQGqOlETZ@GrDs_d<*$ zOwo(Q+Gtsmwkx7t5S;Z53pDDm*>@D@w;xuqZu=ml)_e-lQInz$*7cM(Zq0_UNM-3p zk~>p!+@e-BU+LCszDA6Y8vaw-gWSm4XkGo5=Gwk$=`~}uojTRT)8&OyXHuF8^^q=B zdSmgnqZ&h4X40aVMVkuUxF_x&a7GyWj(HfE^Fppk5y8c1gU0l9-Hw+_xjFy7< z2(luX9BJcKQCdL`*nDB!3D)eeR?(CUj!MR6-~613T-4h`*5yrYDZ}T}Gd2ef`yF%8 zAx$?ZT3+mh-U_kPbgx+wr8){7HE7~z4IuQU#~Duufv_avl(={eX-IXNmKVjWiq-G) zQnHc;R?BNe8>%sr2zpstv_TvxEP2LDqU$ZTCdzceq^Nl$Cpap5aXj7~7!G^PJ&gAQ zcl&$#zNa5{JPrfnXj!r*m{W7R+8FWU9@mZdKG4O;c|jL6r2~_x#vs1O_?~LC-I=SV zeN@qB+GU{~ma1%*i&gPr+k>jaND*DCq!@JwoD-dG7`{@sR%gjo6V)y?5B_I=)OpN;V&J?U@s_zmKb&14OIERVzeB}7)6A~^YC;V^`K0UptXD#Z0 z#?=+tC8U~2HE;fr&3VV_jb?i(nzksb4Fy!TA^kOGSyyz>3W;w{7}FYoD^_UzcU+hC zZOPsK>C*7|+lr!oHl1pJssF8yaXm!JrV-lyJ=%=^Ok3X$ve%V)Zb>vn51Q6olxsNP z<|wkgve$OVwexaq?$=vYUzwy@ z>1{d%*C;zfkM#{L z*ixb)L{2$zsRdF|40}uv6BUSIX#)^_4)wlg-+M-9D6t{>?TE38z_LbL(VQcer)6(Vjioa^9Oy7@4 zrx?`LbgBUrqqzO8d2HIEdmS3zEH|Yc*oq$Pj8XDQE~+%pVW`z`BcjiJKn=s0)H>EB zB~<|-*j~?5>RoQ_a=lqm)=P3}t^R9uYNK_Oo2NovFE8sEqprapJ+N2pzc)&k+rmzW zkc=Z{FhRY1edkC9vUPN1y0{R}&zuPK-t*?|TP`8u?q2ibhZC2jBCaK^TO!!ojFdpE zV0?Fj&07b_*M$6bv6i|e>P=gEIb&P*y}c*aXJBi?Nt4eSf!h-Odg0RjYx`%)l~^Kj zZ5XPjzB%0Ltt)T!jos=|qy^$=p*vlFt&8?;*U-+a>-%1$`31|>V@E>{8?Gvq^?SV` zW4ZqC&j%DY;VZdWvi$#I4Ylokv#!4`Y*w|@76Q<4M1x(me`nr?{{b9#2?y$}h7i~RGOC%s5 ze#5{^y$+q$Rw`>(pfvYyT_qeVJ3+rDo%f8xfDs5`rgI%R#@5cXgb+B_3!QTeqvg&0 z9j{-1&G}OJ@bQT$EQoW|YDq-{&fe{)Rg`)rg0UVk!q8=MSDELDfCmfGgcdc-W$Xg zat-9-n3jooSqRM$pNddKQTbBZAX1ucp*0FMv?1)fJ6<2&akqQaC1z5BTPc?N-2?9q zcieZ{ME~LAGw+{IeEIf{Uw`uz5Boi*^9dq+nk)bN@4n@K`QQFeetiEEZXEE#$h;&y z_s6I|{-vF*qzTSS{{Pr|vnETj>^kq;XK?pB#FSZ?SykO=bT>$mFqmYZAjwQ`l<6ny zNw4IKIEyBcAR!}wZgf|5Rc1zH#2wuIjC$C|{oW|xsoN^6GBfUVKf_*YeT$M3qXcqS zFwTMRx#@e1Gk6bQ-EFunLo>jqCa)$Ppcv2Ab_5(RMc0tddwQp$*c1ZeH0c^@4OtY0 zPtk#j4sj~gYHHP0HO^(Dv?L>j9>FCgu!vXkoNXfP?rw`zMW<8J9m{Ya$Vu#*y(jbDk%T&8R(v!W0WRt3fa2N=S(*OiXd6G~;K;I>@Zn;&Nt} zBb|5bO~LNL_#M4{V87jyjpccq=(;Vp!wt8?hT&#IG>K^*NvDZl5o~>ZiB@|2)X#C>zb8Wj8C@h zET!mR`aDgXLu|>ej#3NOXu@*E9yh$MMTv2x1yZyw!(Q;IZ6BizWNW)2Y5kGa4p#9L zDOl^F-_zf`r{BM$xErGB>3ZMhZLsk@CRI$xOercArW8sOFY;CW&4tOQ3C5DI(|e|w z)`dA&YOGkN^((oV5tKBd_hTuSWTcdh|i56E;OIedm%QdsCcj(&I zhtAlwN^!9Ry7e4hS5%!KxMjaznR4yUSl4D(jA>&1f>~WoBVy>yK&6mMCdQdKo#@BY zmC;?)z>_0(*4}MzU=TwumMoP}BIDsqv^~dE`NfC#{4an0-}B+^TTX`~|KIO^&wuz2 z|DMO=iSBmKc}|Rv2Vi9GYa^mQiLYOt_p4~d1 zv7$j7W3AFP(KXul-AdJ5NNGc7=&Z17B1*N8Ol6t_&Ssp?7@wij_RDIN+-8hzMu~#$ zwVrf}GtOkX92oP==Xi!6e#_l{&%5{U=r#k}^Anpo@kf933x3z{csid+_00BkAW;~0 zx13UDjw&!)qm&0f9kJH&X4~P6n*9PoH4drZN_)3*X-4Yh`@hgN^nNH;B&+s{HX~+U z&U_;4D7Y?U326g$bB)esHGpEY!Yh}=dCr`|8RxXp()ByUI0{0jZN?@ATeAkqijboa zOJJW3`>kc@25$FT9vftRPzWp^nd_3~+{^Nh< zyB~f8Q#c1Wl>ph38j+}$sPBrkZH5A&Rsw>}kn4o?maXZj)*>#GDohE2c+S#@w`gr? zMhHc#_d*q7$W7>|*fuYls-Y9F=iroEC8bl+Vb08{5VNiaV>V1#Fk|HTa3*EAyS?Y( z{+|1r8;0Cr?Ldk%FE7vJaw4ROm@tZ|*Di zMc9krFt{3ZUF?n=o#zh`?%urR!`pkle0js0uPo1V<+p$Mgz;T7Y_&UMqv#sz$dbr8 zg_M_EHNg7^nN8ZGGq|>C7Rfxlvv!&Ww!| z()z}uru3}{)*Gzr7*pZpc)*pJx3_!zu;KpQH~5>c_`}m@zC0dyJO{p<0yp-AF?#+- zpzDT4&9Tg(Ql^Mtv02Za*6Mn=$nfbONZ7C9wpbR%V3pT`_ENJaMQJ#tRl?OJh||`2 z@6~u*a=Mt21g);h8U_- zb9Nf3Zh2P3S|*#4wx;Ztie3GX+gVSaoxG&zuc!>=3Jr1jvGlH;bNl^Ey`u8kmHt>`qVtw`o{3eT z5rb0PNSRu6emD$0F$B8phNs5^e|UVR8yt4G<)#YTYBhuxGv{&S`S8p%pV{vQ-aXuM z*X_C4-*7rld>Kcg6Q*!xSJkvyN^SeR!Q=&RucU(9^p&!_zvbG%5-)V)rj6?JRxY1+ zJG(A#R5gM)hpn(FGbIM*^Nh&{j8tYbLQPodD8*x~r`D`>ovxYhmnw{OH9Kq1x^-%v zchwlG7^1*j5~H<5;|Qs6IKA-0cw#QFDe7D-2F})UHUhm4An00$k9R7XWEF8$$kCVk zy7EKo2Q9hvAK8>BRfqS*&MQ84MX5E!b18)!BbC$!OBHWKU$CmUgmZW5i)V`lgP5~1W8Flz6a!ntA^Bnl}lsF#_+}`fN3e`EPII?jJruEo0th?mOlqxl6 za?!5%Ts1u}wmH5_CWe{uJhAEPrJKVTMPal9Rh6n3{j3WJ=c1{Zz80S6 z8ET-OGxPa{!}s4|W2EaWQ8ZcFi)FXjlErXy6M4AZ@c!cF-m~BD z@Vgxog*inA2Q>$t9v!Jx72k~@-Z0o5C1pL_)=G+j<1w{f&D_?OhI?y=jZ!N!X?0y0 z$!oXkGVn}Q?ZWdsF@_^jDjPhVwKyY4EHF24dAszP=JHB8sN1q3&(-Z^Sk4|PRuZWR z+bU3{mgt*jgRMfI1E#__1)fev<}_3Dge!sP68P=Y%*W@mqPWGjj&sG zU(v&0DVH&R5re%FL+T>f*Q<`=*0-~O-fV z{yMC`COIw`8Iigs8pW(-#aw10vK|(fi;&nRx->zi%EcX8Dy{2k!4sFuW_^vGy29re zxw!F`ONJgy4OgmDJ5(+y{{;(l5%P=}?GLA4^`GqNJIts<@{^bBx_sst*$Ad6jD;hzKbfl)tc81 z&eArqH(0itTLwQc*q*KJ*>@W{?=e-YGHiv;ws))boY|7}?`ReGEY+wGWd(9x-!(D9 zFlg<@JdLC|C}Q)YKU9)HhzGp z3Y;;9nAERrjlTPcAUP|!#=I7M#kSsVF?h89wB*tZg6+yuWv%B}u#D@VQF)6i-r2M> zh!sUZQ`OO5TM}PI+}Z}1%}mo=o6-_QxwKx+Hk2n9s=46Lq+TwJ>z&YO%B+?qAm`ME zrj2^k3`Wjgb!WA;K*Tf|NPVN)+1;sCyB0m`)Pyq~BuHW6_U48U@AmArTVg1j&j-TG zi4p>0g?`)f{{1_)H+K}*@%ta2_^ZGD9j9@o6!3^9iA%sZ@Y0d1Z+ld|auwHCH72^; z+IH_T>pwNM{rvTUYF{AnnpbcC9%eyJ!9FQIkc_d? z%pSUqF7-pp7w5!j+Ao*Zb>_7LwsWK+gjASfWr}LVvE7wZq}Ho@OB*Pe*NmXcaH+0m zh0=%^r6omO*D(w|L)X)F8>-WkjWJ$-&mwGH&%3)j_5+OP6NmGQ_G5Nk`)I1RAc|d$ zhYC;7!6G$~<|8RgD*A?rJe{d&rXyo*!fYJH?@3YbZ6*Zf5FkZ0A2mE-PKA)O21J*n zXK7$Rm#A6DF(EC%P3zfKjK4lZopbbE-zaWcwdI`0%t>pXT3uABiB=bkYcEe(oDxN_ zu46mwx#{+FwqvSI=$j|{ZeSQX?zSDbgX3u$IZYGAS~j}@Z-o?Qgvxfi;py;^#~*%+ zlp{a;dXG3ur4V}+MR&sv*F^M1;7qw0ajn)-IcwN=mYp-)-|pG%c66IP;(ATf^&QD( z&Sm6qej&|)2fN|jaEnOCDQk^fZ#%rvWYyEt7d}5eah_*F$x4%{Y7{T6ztC9+-ZP8f zstOuKw2RTA)j`ryIN4|gnz1VMbbU_*c7x*|{n2}F?%%NA-|~xZf5Fe*f5Y8o$9Cwj zwlc>vDV!@`X|=2+3mGcI%d3c>~0 zwp%swl?wArYi3aMvXP}4wvk_SsJY#5sn3z!;@|d1GPDJUtzdH);O7%?~$&EzU z?))^Aqjt8X zeuW;v*QK7PQfojurv&dflUmArnrMmIM9qm96Z51scOgZ>Jd;Z^y&IjeDRn|9X@-)S zlL{+`sc;A*bIerN^W&En;xuu4bIWGC*j(d;%_;`wv?O2^_ifD5>|U<0*5y(! z&`c(=8BCWsbq;Das#OgU#u#09#DNz=GhhowiAyBRQiWB3JTT`OHwSL|fsKLt-gDn~ ze7N1S+d2N~_uq3GpLlxt%<=G+Z@)J5C9xynYbDRA%~S@Q7qX~{ql&@!zM=aY7P*Np zIwu8j32Qn^=@d7-=}4o;oMt-P)5$_lZI!jw(Ax$3o-cE;B2?4N%{5bV)OzEw@YoOcuIfr{thU-6(UR%oB$UVam*(Uf6#8#O=ca|M=IxpqLF$W1{Oe{O0@b zq0UW&w@|G%wOWUl)?<%Dm|MLiNbxOj)b_xx$N8RI6FJYimsD-iR#Qq?vEIfwy*mgi zhT9s5#kRSgFtxfEC8tzsj!M|;Jwzdf!sp}6={WQC?ZDTYTmJZ$f5I>RsYRS@e*Rp%nc8YL!FO}Dyi*Et(2NpndI z$F{%o3IV?goweW=!E_BC$r|htDrFAMP_ED6A|B?}RUML24XxO^tBEJ& z0&165(>Jxwcb#K59Ya{y=G1)o?CLAh=~Xc7%6w0~Ztts*W;H+?);UDUm&!b8^gHid zo4sDd?+PR{TxJLhiKSGkyFN!Oqy?>RTmm9$q`#!^rK(75TEe`pv3AqW7fX0i&1rh? zJYQ)8%{1B!^7UF+zcT+_QyJE{+Ldm`qA%179$&;)n_Ie3%Ek0p z8+~j&0k^=yqP^(f87LRhVT`5SS(nJ(at>R_$9bJgUIQ#H)eD)}eg-3256x9YWX)-< zT`)#oSLXht+M=vvqq0&ch()VaQc_xh5uIDKp9>0N3e$WhrNqne$d|)`ZnMX9mLQgd zQ8ILboD6fWoO9uvB4sLUM#s)~cq}C)tmwSQ`wmjuzoa&Et@13js#htyvgi#9CD>T4 z*%C`)2C;25&>09zq_b8PlTBS`v9wB3V=LAdHr>F(-7V+yfzBJ|aN_alGfr#h+27o8 zdvk|4-CxC6tx~S0&1^;2-WWCb0C=C-41#mMXU;QIj69uBgxRp&++p2@Q+)wuvJ}ST z5V3?@NY0anp^0e)*Ls3uF0l3jsMD4vAm@^ra9>v^V+i4D=%_emimVriQX6hkF6od3 z2|=xh^Bm`(0;}(uuwEgYkr>HI@rh0@$mIoNTB}?JU1dqfsoPQIpZ2oI3Pu2Y?h=Sql$fUKmU>{Q-KsShw~%5{SMQ0K%n=x z_>MQ$=$9C{?jvP;c+-eB4y1GI`lf+P%b7m?D6GR7ENOQXu-4GfoE!Rd{D0RKi zElu!+MCuHwrQ>`X*rzJYG4c873u&CWvxYY}cd+R=juSa#QYeI6*d7k-{_Yd+c27Kh zf8>|%A9?rYmi^t9{o6Z++bzX8rj$93XAX~#jE86DaU!IGGX}BR1tw%_4%+ur47Frz z8`LeGeqft8E^Sz%lSP|ZyVBPV@01Bqd$Y%J;&eJeg}Lk4ct_uPMK71jW@VNOcGk|q zTw+5b(*!4@T}B8gDwRRkct^z&OY4S_whl~@95OHC#LGC6DL4E{;8^>Qt+=L)~)FU7V9j_Ykp^w4~EDagrOZ8ZnoyqUHBB zW~B#MW7aAIuH2$aqOr&Y1*dC36Qc-`rI#oT#Bn)KjCgQEcNBEqoQPXLbgy+BSW-{O34kY+$I92 zF|i+K;uI-EBD+XDjd(9~qPW-GdT?t>*qU*r;v2L}J9Mn}O*ONb3JwiBD{e(HOB*;X z{YlPuINOX0&Fwmcfc4rL)qBrwwAHI3dSKt1e{lf#pX3Nd)hWnd)tan5bSfT4I zoiRwxYSQr=Boz*aGo3q<%M)|xsP#Y&nUD>LC%a4(bx>nrHWq3^a?zw-bC9Q2DI%g5 z)?759TSbi*#WE3Igq`hM~;l0E6zFjzMyP#@1&e#rvkfJ6Ab542zwU*Ah zhK$s;Y3*GV6=)X%fD|AmO#@KLTm*DSr89aa!e|e+pwIvSAOJ~3K~z8FS3}3I-+#@` z?H#}Q;SC*6n>j1mOq~+=YD_1x> zuP}C(9^dt%eVtBtg=?vQ&ja>TYgqkBD8Bw=53E=F!zuT10)(-_shQj)8PM;%ZwPOdI+X9bTDQ z8Z|==lzrFXoh8SN$%dO@!|m+`F=~K{*)WAlE)MT@fS%FxtdK7|qR~nOJp-~<83;Ns zHjU;|YEi+yR?hRp>3AgP%+U92`hi`)q2JsvO@->A_XD(Qqv?DmoX$AYvFj~^hdFC+ zd07T9S*dGQGF2)mMRH1vapat4CMs^XquXxSSf}X!TA&(YO3XQNlLK*%2to*vc@D&! zi763sVs01N6jSRpE0m}vZOVve(#n`QU_{t&x0>P_&nt_eghcK$H5dJy)0tEhaeg|D zOgR#ophIZ}s`jGfs;J=72CALy@tc8e&^os?Pb8G0;Jm|o#frOHs5vslK*(9wcT=$z z_T83Y=rEg}U;j^k#T4buiKHvRa!`an7}MSW(-Zw`_)C zO`orWs3t6&&L>XCQSU!l@A2ENr>k%{o;V#(#A)UG%f}x+^4;Hk&os_tgy-X#d74SbkttWk1j!Bb+c)&X9o9s8Yw?W4 z@rlRJ-*G%Y6LKYsBO6ba0oU!>?(Z172P}I^?b?8?;*4Y4S9X2HZ5?Ins9sY&S(M1* zT!(X(zVnDTcw^{N#l=EQ0hbarOr%sfg^79mLY0CO!F3+#t(wVvQTWLw=nb@ zFg-B_tW!ZojAsgon1Tivj3XJvnP>6q`W9m|?4*jLHVpV8iZ{bcEh^YAChk(HB`I;w zSX{Am8=VoHi>z2>Lusbi#ZV>9wA%!sM)k>*S2UM$wNceq=Xqfbr&V3=md;vD)hii~ zHjK4m_ z_~G}zLChN}H%!xKVj1xp-M6=KV3tC*f;a(jNcAnGQ#Is5Q94;m`IZ94_Y9i>?-YA) zozt0I%9xz66|88@s2h6v{YI1EDeKx0baa18g)j$lj%#ufmYL~s2{T&gYYSx_oKS%sWSC}6p+Nv@~>fRjLL)M6~vdb!4wW zG%>Og$3mN%RI`|Po!-MzR9c`_0?{(VDMqPgR-{!(=pMcZkhRX#6p>t*=fr$GF@E~Y zi!&TthIjX*@XR+qd#AMvbK!^I{+^fbz9&q9p@aMTTb{>R#cd~w*|l2PhS6kdF48Kq zmRe0cGY-F>#@a(q7X_HED2e#7<)869=@fM?I?mKoi6Qa){K7d{ayHa7Q_y>=F^27S$EI_b zp=axM>`UgWcQ^d{AODhKHoP1yWfta_N1O?S&XTP~Qqoj+F&xIgl+V1iLiil{_S+5b z-aT-eJ*5~9FE2cwzOxZpK_(o9(*7K6j}N~6nJ*ElPV zPUaRSYsm06(^K@bCS+5t7}K>7Nm+w7TEUhGHDi(zPLCn;GR|!Kj&J_>=lsQA{15!; zKl&&9;qQLr|M^${njb!XN4MGXd@e*f=FZ@zqNdlPcNm>HS5j)>8ynj_wOq{CM#BlA z_)8Bvv7!B0JKyxb%Pnws5pJbj5W9L+WhWO>-m0NaFf$xE%6z8EWmeHf7a}WTDGdO%$&|r_~UD!LD5@S}xT)O9EME_Zr4v z)p5&;%g^?LAwU76!Rgs=1hti&VUW(nmVKp&Q;1LS?giPt8v}e*Tep zdf_~MBBYUTzI}&n_cl{|ayCeHIy)(el4nSPl#*79x{P!C4dIk1G18UFpZx4SZ{B^) zR4ewQVf%hh6^CsugYk4G=gc^dq!1a;Cu&k5E{!w3>o8V37<17>f+k<>>S$gLSta*t zYF&}Qm0Ba#iaNxNtmvVoU&LGeA_~G3GBIRM)66&rj^`8OY>^pq)sA=DuqQ_9dU@2Y z4QXlfa^;k0Ll|osUVh21spuuvfYEfeGY0Q^Zij)lcYAJj8+t2PuU)ek?SkmMrE@C6 zr3_!5&wPG4^6BY?^V1h%D7a!7`i_mW+&|oKcYDLnzWTt=e)UVrZp){`f$ye25Ne{h zmSQU^%9`c^FRc%7%@)-wbW8j7^%B>_gG;ZBX{gtBpeRL!x+{^>azVGo6v^|9lnGN4 z&a}}@%|tQ8QXvVZedi0lMM}Xm41cB&Lu9je+-z^S-QRJ4|3KYsF;!~?OuuDH0#7d- ze|+NfbR?FxSz?-2P)G<#49Pm?obhu6u?<;eNG4OHYKPZVuZ+}|v~QR8xZ*Z-Nau}# zcG;gp<#>#^8T#8jZ|*)|cN=VfB1ItuMLL!FmX|L-5>A!V-+bhUPY3R{p6%Y!Z9RVL z8MXsp2-8f=nW+tTH^YE+o)9AE(@1QhxG`!%$XRjowf*lZBIe8GypkJMs9+kxeo0~F zs!4${RZio`;WSbzoV-&c+R$TNJA^F-yDhQ2jH**gEn%vkt^S!75sR*a+UqLlMQ6_1 zttVCu92LWuBBxl1c#3N&oSOAu=o6+Ga!4vhk@Zzwn0ao&Q_%Y7Bw$}YUvE?U+w}rg1y89aZTFg~3O}!=t zy^@IJ5`MozxV$zc$b!B42SljV7_z>bh3nR*1^HC390Heg4p;ruuWEeO?{GN`t=P)? zxt%o%&S%0jW1MBP>$SVF?-8TPG-;{2O^R6WF}2Vc zI6VHq4?jL}IL>_h^h7+*Y^tUKYCC{yMF2#TIOdVldE$7E*c^zt5K`iB9(g$)Ih;n$ zf$474WJL1iryxn1~kn&8mSyTD~Cg-+yDT!qqBgc>k zV#W{)Tgme0=%Hp-#BobC?n_ zB;LE8Etb2kr#FW2d}11pwsC--mdFAo?KnVDRSxAT`o&SF6gj!@w_17>uZ7k`U149z{?ta9a+C#L%Cc& z%F-8IQ{*L$WzvAZRR)wFKsiHl?G3nsm7_Vu9E0d2A?e{bo^1|l1`s|nIe622O ziISYP;-r*JFNWSaY=Jb*7{EJEDTOf2*b*3DUij`ef6dErWK4;39*NdtYNgWYWjz*b z8+gQ&nC3_bp_yAe!`8Fi?eKk1HwwQ-0pA4G4lN73*-6B%gZx|!-07YV!+>ZUAXOEZZ$d~Dv=i^6A=Xv+d4Uh9Z z&*#edoNyl!#TJ6y^C$oGFL?it{zs;1T#ZG>YPX{pgLPJoe9pB2k{YUVQWLkcYQ#$^ zw!gQUZKbweS$)Xco%buIaax@;FVD~X`1r_63_LwO@#*s;=idY+q>w%PnFl z_@x@!7_1Z|=4*)LN(EV|Fd__Hr*|0yZykp`GC0G-Zs7gkd9(41=R`eyq1MD`4AVIB zci;V~3$^h{Kg8F0CX&L2>~s-FAbx4d*!%V_y4N=aAH75=Uyz z>~=eRC&V~0&m&zYq#{Z@t49AOrKnkZo*LZ)N>|!_qF|a(kLVCn$wEfom|JRc6ahE%%50XY$?)6XT~TNK1Qk)#C7a$-|+66pX2(D zIKB|i&zKZ(rd+yemjU0B5_@GvxD0@o1f6Mg4BcOp*tG0LgO5crDfqR3VKtjvP#tru#~E8(db_+Ar#8iBzq#%xynE^9^5 zLj9|&SYH<^&~-hWGy$d*HL0dRiGgxDFou~BCrXZZ$@I?g^ZgwkKD?*j?fLlfLfQ=a zUOotMn<)i0+a2@q$kX(Ut$|q!3 zS)A*+zk7@GPJi|}FrCg=D*H}TlF+ZGI;tVY%HT60Y4Scso$Zwzi6N4c;GD&ov(}&0 zq9$_DRIv4yZt$d8J6*a?aMd9c2Jav%ac*Xy@x$Olp*Odyf+#f~M7$QcI;(GQ~;#z6Q@r5d9Tgu)T+s4HeQw+|@8fcWY zq#yx1lz?d+0Nx5mn$*Xyt;p{ z_x)D{<@|cayQHz}Pw()u&NJ3JntFLr_1Y#nPhV!MQk4qen(TIF35L<0Do@(UPfZMlp^g@_j z=Gq#Jx;8xM9WV2f7TqWx9$&$y*t zUH2fTq40%4js9S(ec`~m{^Z{KkL z?g8HJIZLI_?ur*#krn}w_CtzM{Z#|QjWpd}2NAp zzGPfBOd$}Ga2}PcTdPsnj7duLl1%9g#`Sm{JxxpQdfeUao)R)Qy9f5eE#G|gz}vT9 z5rAKP^A!m&-nYYzrXWt!$jdx&j*;Ve9<4l+%UM!t=s{?;oNNwx?(m}CRRC(14 zUFSQz^J`~|a~9(i6Dg)0s+JC_B9vU2L*&cLfj@lw#19`o^TX#y^2>?%_z~(+dlp(c zK^>`WP?&X`_&P(i@S62yx7K1CF5#jZHTka!y|>(Kd+v5y9(H@~wp%vN<1yqCNipc} znhd6N)MQ#`cjD9IGk^H}h0o6?V$trJyN7!o?jLx#d&AdX-}B+&ooib#dBjihn+j%&sGzCPJ;GoUndN=Q~n@FJzwV0nP`WQs5~@wnxD{ z7Hn6U<`bqAZn_Q+eD(G#Zr|Rsxg8kp_9TR39f`hBs-=k2O~-nw$%LXwAgz4}gfJ7P zKnjsuGOi!4K4!M1(tANla{<;%-fls!peyJ1G0L#AOo9lv?M}G>jPW_pUc6nzPcE_I;bspAmzfXX?wZC z6l$_t`;jd2lOX3Z9JwIp*Zlk<3{<&7Bv+P?yEb#eDjBV+0awYz*9p<<496vT`dXv^ z>EG}A^Q{XJfU7_1^{2w?kf^3lmb9i(8zVIroE5wQaaPfPu0yP4=z9k5TTk4GJ?pbI zr;+WpXXrd(@@@E(cz*f9n>TOhcUy{g6ywNZS{k*{K2jv63{~r5Qc8@ckrX4lu4BL7 z6Ndo~`c7@P8~RP(OmX^b9$pTdP7|M=ANkGif8=Ajz?g>-SNv`{))Tz-!O*E`1r`Dj~|K07w&HM>~{lc+YyJJQ|Gl8 zD9)sYI&)Zh<4I%!2`3#DOEw)7mXreC6^71mw>MZ@kS!aVUZC;sO9nG$EVx3}!~H-wPLN%2^rC=J0_qn|}l(XML; zJQY1Op-vnASZh~Pi?s`G+FZRxb?wnIVzH*f_MWcuIv_}fei(4R!y1o~P3y(7Yp1&I z)R9_+*wUd^49+=CZZ_=rb$Y4RD>1t$8KN|yHjAOyvb1Saq!0{hA}f{N7`B@|H#aw& zV&I48XHKV)I18nuDNpM zd@jqypwSD~j`-%bUPa?;V;6tFZ6!AZTd8&J0RAaq=K7*|A*WnY{k2{a^4II+YUsMO z4Pvh@`>$8mE4l6}Ifty%a~77lTpBUW){ zsnuoqESJup@oE|qzjnWkw?B4(gii>V%izwB!*O;DNvPfF2|aLSZ; zCQV1ecp^>{gNe*FYSOi&^~{-b!!oo!KHqt;`aIp=-|@|d54?SQuW0R}-KnV-rnxYO zLaMF_V~u)M_1v@Q6=gA@E+)6@t+OnK4q49x&UuDzLy;3EMtp%DL&lP-FimIXF%ai~ zuQPx6{fST2aymy2X+pN1&HWoX9LBLyL$u?raGJE6UNCfh&u$oW&~2@jafTVZMXdJT zX}em*Ssf4!gU9=>t#?GLNZpFR-{ z9AhAs%ru`{ZHZ{*%I+3lp@x|>Pqg{%e zbe_|6=6nu3eSYEaaA5n@1K&K{b37-eFDHKU*T3i18UFZBe$Hm-FpTW?JGzI5b&#?) z;HBgm1E5~*lm(mY3= zQe-ZHba-Ld{+{FU#C$qoQzjfo=8*XA^GE*8fBs9pe>@SYW7>R6mVxSbR{gE!)m<*IVv-Fs0*VFC1zlpWjfsJ=O1U-44IK#cgisoX{I#-&qDJY+a@^ zuyd8pWCjne5d=#^EvkVilc$-Kg*Yn_!4_~yQ+RW&L?a}zieEJP-WFrPDOz|i8L>UC z+mnhX=0L0qEk+ZCLZp;{)(}TxIFV9DYC^!#2QFJpN-UV;I$M@ zmPjQvilLDO8QCzP?JQnu-)2h(apioVx6+XQ|tP-r2J#I4$YH(h9Kn;yJQdW|n2fXho zrX!<$#>34mKmK^jkH7nCzRV}6YP@i&O+*s_03ZNKL_t)tbhRtduT*I@V{Puy2BEcH z+uDluv5LxyB8nzoI$Dbv5C?8|$JuT8K7x4}5ezAe?S9roGUMnrTecgmEUcv>)>9M@ zg*TO)72)h!Wt?k!A86%VtXh?)CU%3X?vnIa>))=b+Df@EUZ+FucC zuH${Rg+ppt_t{0PS`uxS!z)QW$@>`jUuY5IBE_1jz=vCAEldk*s3XoiooA!yZ0Ad^_Ttyeyc& z1!` z8ic8u!DkZVG^sv>F|@v+TWPRnySu}0Je#(|uQv?c3M5g+M{-fBNKB*NQzk{!=alfS z)WM^^Yhu8ZNRmQHg={ZNpl0kR-oJgzG$?8Ad^wY2Qj>M#u|aD+qfO+JIS?^=n7~@m znk%cCv9($m>6~L62OXY?P#Uj9)H;BZ8oFX(=&=NcBj=KVdXM*om=p<~vJUT@b2!|Rl+0OG=Pdb(&#uP#>$@=bK6}LJIleDLtpGBN zNifYL#aLGRhF4$z3~WQw1rAyGbo@Z_mS5iQIAzb2Jj3LO(O`{|HJNLftWrkIQdQze z)Zu1Mq+IAi2aQKsXoAN#o_xqyUuz^%y=PG%6Gjsx{x-4d=U*EEN^1*QOjn z0?rf~S7?l|_J-YVMd%!->B711S*?}I6a|L4s?XFUw0NMUnF5UnE?;oRk*B}=JN(bS zg^y2^$A8PKmE+^#%x~VG@Lk7O+knIYySZmFfz57BXIpl6FIlbjynFjw+U7gn{r1~ha3H~W`VBA^&o>uak`a-zg zsmwfWamzEXXhQX~(3%iZb?|PjC5SA>1u$9>chk)-=9cVG&AjG1x5!DB zx&=K$>d(;@9b|WIuj_hanan^4Mk~zwftU)1$0vrEI1K|ic;0;dhTY3On{A8r4%gfI zUTKwrwMzANE>NtgI#E$Np*5=Os{oMm!ebw-bufJiu zjGT`bPUlEUveZ6%qvmU=pY>0*8sCQfmS^C`JY$T(4IZ2jrwheQT*edU;Y^VWzBTOc zU$WWU6QjdRz&D;^3f}6wYYEs;DOt8G0e5RGzVjU`ze3i9?RL$}yEkk$_e_##SE(kG zsg5}CAuwh|u0&B}$~0-3;dD4*O-sAl;H<48vWlr8c$yG&kh}Ct)P>8=80P}`nwHfr zxKg4XAmT`h6LE^9R4Atb`*b0_f8zZ64;*^5GRgCxY($2V)8AW2|#k?$77b}9dbAPCG}Uetm*NIFQH8({SW*njmN1YzdK)08+4nNNock}s5^ z=;?VBQjGpIb3N>4bL|_NQJr?_9=@g+g}K+AXTA2O9?bG=vAY2Y&xRONO6^at&t8$5 z!oLom`C=fyROtRhy4?K4uzrzeZ&5nRj8`G(rZ?EkYqQkxjH^99Viwonl7d`NF0vqy zWIjg8?R9uk^g@E;I+Vwq`c*5JP$UqTVYp`BTXD{yV`0CA9 zync8=>l^(@yhDOMb1B7TFB_(T^W_Xu2;MKr;N_PndeJz+uL9y)y)cvl(@4n^MTAKV z#RU$B6Cd9FKp6*osq4^sPj(F-jwc@9Zut1)kCZskbdJp?ux>p~1GvIa3TF&sRxzY= zo^7y*)edA?2HJY~3l_u~R$ka{0^7|77XrrVUe|UV?YhHAMbSkmxFKWayF(>C=IX^9eE|l6QICo{6+M}%ErVj6&vDk`z zbQZh^oEmnm8^8NQ5V$u$}RLCYX zjw7A7ym<41pa0@#>^2P_4xjN^#e5yuUu!!`N{}Mf=}=R|)DG9$pUr&UyBd&6t^1HV z37m~S*G|dn?^q)Q&UaB6557R5^0)<(^UI}wY#kp1EHgB8oUcg7RGT@ z(K;o%F0lIQ6~Q$`Neumw$HxOjw3|7E7T;=LwV8|j47l1QEh6MJ5r>{B4#;#SjR$1B zKpyL03%rdalZj=5B$#9|#o~>}IYpG>3`rtg8@PXU&)vgb&(y|Xn}$*x(@+>=LX0PP zPeki)=Fvr-kFi{PqSeT1>oZ!es6%5YDsAHntV08v6~{~9X-MSDNb(o3`lIAIdF zs4tRpPLm6wM1@o_%Veu5*Sdx-w4Q89X<|wv(=?J((sODl^i$%JVCs9O{)7Wo!6R|t z@zX~>J$~YF>Pc}vw>m=8@bKa#+wF!;w`O`gb38oq^z=wBnQqn5ZPvKe3fFeHrX@6u ziuPCnhQ?ZQEKKKtunB~wp$nc-8qSxV-+lkcPQK%tabo*$$NhT6`{Ts-Zx6)Fe=-PX)$M@2>k@3lqVs1all7py1c zgq$NyV|caS^58qhuH(TwK7Q&D4E;FpbUt$$d-9YiNqLV;QsdCHa@2YV?4&4M=W(IM;jl^d&KR^`I^~2z??6+Ly18qp z!J3HiEs;PUi(=WW*Cct-j!R3XZ5_cH(sW_E6xz_xbse!(vo~5DW^6^DJA?B|H_~H3 z9Sqbes#N!nT%HdVRIRr+X?Wp0WlSu@EZW0dw}Dhqk-i$}<{Cs}proSa#HLwDb_=n@ zs_0&TNQRQNFWfmAlqxaT`~~lIFp;wgyIyN*yjOx%lP%U;?fe!!w|H-8L!fIL+9r^5 z;&eP|okTT1>D9sl8FIww5T}e;Cr00sttFUMrCro>urb)I ziA!rNl5<_3l{iT$i(6btM>>4cGi9U;EACc1cH4Wp)rPKVSvOtn)Baq-RAV@a)+Mxce|L%xgqu} zB5*xOEH#(HO?s>DRY;{+np#LgZ;iLomTr5+*V7QKcpGYkg9d8m0fZ(5ma7Fh>RqY$c<%4j-j8B4`&jF zU$DnNOle{C9u-*Q~Mp?f>z=^ACUj z_qcY&Kto@IQmZn?oGWo<{*q>$EkC>a&GlmDriyPNihB2lVWq|Rop7#!T!TLbtn;-} z%vRrueHPAf3u#C9HE&!EklE`jX&z`oHDlLx-{^374h?0p?!UDT)rbc4JZ{;ajPpw` z_m%rob%P?fCMa9M+N*JlQYp|^z0=LLoYmkxe}Ta_I)Iz?gV~r+_0V=E;@oJ!GtT^0 z^SOoqZqs5#2alDis~_mKMq1Zix9GUf_Rv`uu-EU`KC79j8oFEu^~;%11PQ*HI%JuS zn?>hV)cA~QpJ#66=IgO@4x-NJYH!_@;Adw8X#M}0_2$H)!I)>2es+cgS7Xae^C>@3 zD|po`oO4&5M(p)D#bMm6rPr~psdbb_lhS}z!z{XgMcNxRM3@ljZ1XvZ*E+YL*(qf) zi|IF9w2F5A3DjYwF%~I~ENaZ0-?kvtL}PRyC`Cg_GwnojsR@)?i&-123Rha9ab~F> zv@;E9)^z5Ce?41SaX05G&#=mral%F6Rl7p^k;_w0YaQRc|Hy?*Z-ug7@$h2Lez#@U zbp(OVHKZo$^HeK9EE)teMzpKm8f?rk4aB6hAuA9E)p;)Y$YD5h&XGQ6_Qrx&ihFAl zF%MXY7*o_J?R0NUp!&%|lK`#qf%LOd(3NBuvw zhqd6Gp-G7bFy8Bfob^HJ$HK?q#CiOLI|m&C&nUHe(JD0!t*MtxDXF@hweKjWsCb=R zNNFO*iB$U&r)gpuwEOma897}>4(EZ>nE3Sg#Od=B!#Hxpa7mex(P5?cI7>|+NOjw? zq-kw+Z@c=^ISbaQkl~z)WSXcmcqeQ(9rt%@HY@F|H@Ps47jjJGtoQ_L6oYESAUPwk zFk~2FCW)cx*6i*!thx1hRVBI#ndAR3pyRGPmQKy$Y`LLTA9bfLl9k?Gcgs&4%BSR5%w)Z#;ds0n<=S zz!s~UzGQ+}y=?lxB!x*TcB(kYN&DlfJ#PtG*8_kpX6fM#&Jb#sRrZ!_46Ybf(qPRF zclU-1mee{vdW$Oq?rm7IZFEK7CJ_}7bwLa4|26LDQB5c+x8kZP{$kA1_evUZn)F@Dg9h9OX z(Ts;Nwm$c|`pvkZ8l|WUqWL0OKVS08;=o)E6>>dn$$UtzBFEgxLQRs-uKn9&g2+#g zj=#hl-C}xfdvfN!A0s!rg}DkB))>UisO{^h`WA6)eroo8^WV$Oi2l}fKKHyx9ZJhA zs2F*E+ZmR_>OV2DnVIYudyy2OHxjY}%8~Mp3{?dze zLtvgi)+{$f0DF_F6@#~qU<@9q|8A}c9ne0pdMNaw!e@4t;v8cVEd< zrCk?-%UCy2YA0HnG<7pfgQESj)`QHZ#5fhEVdCjBk}??Qxr`ITm>7nMm~yQ_u#38A zv3M826kH|2l=?Z%rKTx~K2H^$C%DCcr{cMyy<-+~R>yX+)i9Ondm*0X5MZ=Aq=+K? zv%MnvjHzh_V{o>qou!5;s`1L^Dnu-6kK$7oO`)i8Wh^A8LvBHEMgMa)ij!)Mr_Inz z1rt1DDttbikqql*#bp{HPjsE5K{$WdBT?OIl@ zGyl4B)uFmPufluQFVFLP`A_!Pn=AijLCnsLKg-4A5BH#@M&emN+4a)DBsspUHK|{} zdnVX$V-EYn4M$16w(gsSQX=DY;e0;u^z_KspOC31jS)$S##qRO&;<7P_jLO$E4u{? zgG8SCBf~{ghfN5y!LzX{z8WLMnCLGTrfEc^(1b0GR|?qDBdqZTd}s*mY|?S{m)G-_ z)0ApT1LNh$aDE~W7i7F(%2WsAnwChmAh}jn6{qJ(W1)3mEls_9h}Cn>*WbM1n>Vl6 zHVrG|2sSW@u-$E)3r^>(9YqLf*$94^B! zLeGkGyf7w%6vyctS#^$*ls02xp}`Z3N0Oz8!AV2FVN51FO~9JiYieDTs8n($=Saz! zzCV-FNS@TV8skLD6S)qJhfB|RQ4=dwz&Q6k$G#`#f>?(Q4l#!N%{^b;z2eo&mpJ2i ze=)>Ph)M4P>+ObiwW3*fOE+*68Wj?Yn(aJlfSRUB&$7X?@`2QJ950CuFmRh>fX3 zfSOn(PBQ|dDlq~?NQsg%anfPGh%gKzAKrhU?|Y^gIUbIfxz6BxW*i-@>aEd>bZQDa2B+ z&M|HF>^s5wpu=Hn@uGNJQz9irt$gv-5GDnaeXVZDl-fIMgR97Y9ezhq(XTj%m_`$$ zF=4Y-7>zM&GQ~I=>uK7CuvsfkzGRZg%jY@iT!<{%H7p1@jRc#qP0)&&oFHqbIR&CK zl$u7xIFhl5q@`Lgm8_*&0&q zw$|?YQqyf&vCP&`OjyWkvo>qd8oDO53tdR*ZfZo<|8DShuJI|A6rxG|nf?{Lp_ruN zw1-kAN`hwHvfs44ynjGM_#rASa>`kU>R!cdBaX~O&WR>wHqNu^T8!OtzuT~G9iNXQ zaV!MeDm75%w4biE3w59l#H83oV=1?IT667Db=4Rgx-}1X_iWo058akk=-95ddiz(a{_Iz9`pCcicTc?gbmss5kH6u+@hyM)SN|NpKJoeUBgc0urcaNg_aC`?^~X%F zU#an|SnOKpjpcIg`S|%G#RXn^&)x^^gkQDbEoK@xjs23!wg^UqQxU8byqS}54i{QX zsL9!CM2>l6yjVyhMGA-GBgg*CA@?}52jhqc54$zH-79RHh~tsXDq|(nKPA$XKt_xV zP@<9^ljU;hu}(3r1*_U;%GH=-@xftTQ1eYTcnhKNblna&O`2rPnI>H;Lqw$3g-5(! zfxXdqjjt(8B@HOaO3fizbiK|t>);|~99B(}qW4E*QzbD9nXx{n<=OM;@Rh-(MuaqK z4?9*3lD1L`DFum>zT>t~vSNUXz1Hwi^qKXQ{!q}`P69Y{p;#d_Ys54(+k5Smca}}p z5>}qv-0|_^8O;FJvI`wgmxlFu$KWr7mBGoGk_U<_9CLxNQUkXEN*#*WIiW73BE(!6 ztf6s2V=~iNxSZiKocVa^ncRw;EoCf33!`y3j8;RGfovxR6KJf^n8L~_u?cZ_AA$7_wRn-Gw^X3iRVO@8@~FK`Lloi=lrub-||2Ium1~@44>s6xV!%joDf>eloPhy z&^q0R-u?KN_isP(-FKh({Pe_Sa!7EblJz`Yt2`Y_T(Fu-qL`xH_Oqra^O|L!)l%LD zcZ|7)R+tB*H&m8+Z8Np9vCK(ZV^oKiYxvOnmT0_cALD`jI`c38`pZY-uiB7 zB24k;H5f73>pj!kwF+wh03ZNKL_t(7;YqW+-z*iq=H^Z-%N5jFsYE*J*;xNfmZG6V zS2f~N^$FuDRa2{9oU>K`v(G80Viiod)YsLavC)d{!>3qA^d8~X9M!JU6%rhNz9$*@{yJGO z;Kpb$Z0>Hi)?&P)HPe+2P@SBT^YU5D^@P_iJugOot&y1Z;j+}B<{J~Cw_fq~Gs%mj zKbu;WQ=DCD4J3=!lca<;m02kDI^QI zb!_kV-0jx5ZpC)B#TP?oJU$646BwGa-YcuI!C9;I6S`8GnSFlr6&nAv~1RU)tcQ0>KXdD91Dw?d%+++Fw|eO_P94wQd4dc2@7B_IL$JcO3G9QXG2lwn zbU+%lkHb{Ae5q*>0W%fE7ACC@#JND%u2`=&Y`P8G)tb$!y?#ls zp2y>n!{Nj*PF(tdAdN1LCD#XpisUgAH+MG8ZmhC=zvTu`I6G#pUYe^&YmAUeT99sv z%5}?vUaGswTJ1#>Du%KMp=hd~tb>SLUn;2)GHV2nkgS0i36o<=iEN;s-CGuV)||qc zvKPXuz{VO{V~JUalW;l?^r!x2m>pF7$VSE807F*izc*ToutF~gsSYFNjl+q)JZ9-o zuU)tzL}zOPFRN(Nw7C7AP2(UDD-mJ2Z@{4~;TR!A1sp=G~b)6|2vah8NoO2QYbmlab>({o;i z7S@`IzP5E>rpeA?3dQ7QSno8Rr~<550xDR0>z1DdlOYeU^-8AyDYPe#4;< z`Gb*)NcnPX{;a=U<{m!#1xA1FO{+bB&%28%y4|WHPjVGmX5+$bEwHiAF@)wyL|%HD zo@EbeCi5meDbFzV-2ARZvZ(^djGZ!nI9!?;K=m-9okUQKN?pb1fWgUi@Lri}3;sxD zJ$a@h$@1A;lh0-$2;2<1>OsZc8VPDIn3dTup#Af9Mj2bHm+%zT_R;q@RR1d?vTYi+ z>ox23mi^t9?PkxqZE1|K3c~&UEB5zq*gm{Q8c)LEibHb3nFz*{$_|HPZLfWIWdmm! zh=++>GC>So)A88%yn8xuK3rIb2A70&<0&Rng4$$K%8Zu?$s)Nh42jTM#AX_4knFfz z1|E-3#559Wbxkb#?%0YSn%$p6KPo9>}Bt|u~x!@oKhOFr* zXEdprO+({7)<#8(=1j^1Q|yU3R_s{DNF)v?Y@QUcmNL_ma4?ESYmCKv720!FlhYU@ z!&JKfjn&ShQtFW0RDlW31|neaoX3a}t;3n0GpT)!^M%096dKWRswUL*(44A(UzVB& zbESgJ3Ap(%&9zG|Sv}-R9oD$Ty?b@3&bU@{;}SN;B1VT}R6##i1COl^VOyQNMs!@5 zYj=~C>$Ka;j6b{e^wk_)Wc6~F)PM=qCAov2D=3fAf1qGDJ**UyYn(ZFV|Y%y1Jllx)oq$I&1OT2g>kAT z-Bi@j>pgM3qiNSjSSfACOoZJEyQ3zEYZAL@z;{r<`ApYFY)%-2rfHbi)5ng-%bBTt z!Ty(DBS|1ZXaY8J)L(L97Ab{{m3{O`aY4OgW@RJ*S&l;&B)yNyof^D zwdb^ded)@QXO$l0Qj^*99j(x{fi5&`x(?aw$gW{51Ecp$&SAS2+pV$dHIoSEDbn@> z>n32ORg~PM@7(%+M;ScbW<{AsN)dM;$nu99a?RhsZcZ&f`>vSe_(SaoaUL?GSu{Z4ox( zM0+?rg5SarSc4e3fsdlGL32?o2Ja$ckeizPKfbj$wV8;MF)v73zs2s zJP%x^$P{PenX4w%YhQFsHBn8zp2^Df?5Kn&!AoY2S$eN{Zkb&JRDwJ-ouN zwuIG=QXD1=tw!vw3AnbYX=))xix`KgG=Uk5Z)ej5aHM^1&QOr&$jH%tNW!a0ZH-zAD&eApwtFGnM zX3N9N*Eru1(bVyw*Us=P+COdTeU(}{VV&M%b1GokS{JAK*Njv)MNLnk>Kt|!!R1;r zP;w!;RQK=MI&Ghu&}&!im(6JlA=jDZXE%SJWl6rv(rdf?dHZ~T#bTnnnj-VuNqbub zg{^5ob9=g~j(jiWb%+$ZTGysd!YmF z$0y=A@OihP!P3-fwHHmtU;ptRaeh4VcmMc3KOP5u`|gqZm+$zm{^~Cor!(*V@$Y&6 zPe0POANXqfh8O$SnD~-U!-OP@aShofo`xRI2e#7-t(3G5nbMLlEyfZNLb152xvd*R zFpk#wD@xv}aE}FV3|(-f964SR{Y81O#TnYoil4VTEPILs#83RfjGX(=T+W5_Nh=mS;GEMzwb9sbHmWO$6s+s8&d@rqRa`L<>Vh(1 zh$$kmRv_iN&pL~Bhjc|ZV=t8vlvY9c;_)CU@FG9Mq$V% zBd*FO(}cm&ddGgf=GAV+%k7T4&U3eJa3#_;j#8!D?zTt2KGE zBTO0j_{insXHuCkK3s>IqQei1FlE7(q-#SHfUN7VSVpVZ_m^+>bkmBoy4el?rNE=vJl961;cIVEC34J+G}{ z4(*vr39Mm`d4+c7rlzFs>DL+*HJ@Hr@*6^24f@QV6VJ5P`p<8S=|+@(c*Uh_z0O?4 zjH~r2bzfFfg)Eg(^H6(MIWgA?s5$89ma3PsP(J5Sn=JLAb27c&)r;IbA3E@KHwe4d z&E}-*fb>eCxe{=e&v@w>*UBWBhu=3}_foGqhYo}rjn>|PbPS>7CA4Lh(55E4&1}{% zOZz&G3?(V~IfHfW+z_b2x*~N*taWC2{=1B&luC;zb0v_~mU=1bGq!f29GC?`f7Pa? z8m`LCd7>?;o(aJ=YE~7e>z&ppOjhslzz|9gO3l&l@-eT*ysMHtB zRbtJpE~J$a`cIv^tvU3IaZ|N(Q)j07b1k1IreWgU+aG!N;T@Ohf?avK-HxBV{+7-D zj_r0w+pRD$;|eqwH2}XrK);`qsos+;;=P&;tq)U!s!XNp8e=KqxK;jsDuB5R=Ia@}l;=bI;v*$x zT-)HgHE|d?9tJF)RTJ=QT{41&IP~Of052xcCvQE@80~E~dXP0vi>vj2b6Bx>46Si=-m>L zp5n`{nOCeM#YBk(S06fxASP)t$$&Ar-uHCCYO6sacslcV+yd!wadeySsY}s!& z6yGw5_C!fAM9EAA&N1_J8u^Zqw?ovrfkmX8g&>0yi<=D6PncLR))8n4*5lob3YTRF z+c>*)1Q#ma5PcS~ke!ez*x=~G4)HB1j+}-kj^~lKSiXJnz<>SMf6kx(i@&7Z@31zo z-|gwzt{$u^-Xmx7IFQZc(p;rryvvi}kMd z0jj8BL@yD=X?+5MCXTZ9yEo2}rO?DlH+`jP5^zcy5K;G;2(f6FjPr(461j}p8Co)_ z#5%Ch%acCcx#G%Igm?2MuMq+yntBM%yG>HPV?Xjm>1 zVs4z8OSk-&c;orYb64lwZFAEN@(MGj_vRt`a{;ExcUPC+e29_jeke{S6t335(Dl zk62rU5aS4K%Vxi2-8r`V73*!wdbMW1enICfYnQm&cpkQQtXF%w%^leTG1C>JBvg}# z1;*mAcpA|Q+b|BC#tWtIkzpW5VYS}Scomb#=Ki*tYZj~yajZJ8hpA|nqH%ipGAupZ^PW7X zu5uNCN`-CB&U_urTwzr+{%&4>?EH?`gj^DsDj7y9QOK9s1+RM$lIm<&ma-5X+Rx^! zOt$)dUn@9fg06YCuGx7=Jil}12FaCYY?xi%?-?sMOodOEo*a8lQZPXg=4OiQgXgr{ zavlvojsxen7ry`S#4n#Rzxro?&YNb9|N0H<&hpzIKXM)lZV=LWP^yEcCiLnB0s+KbpzI-o*fWsF<@C}_^lTbs46NoXY1dtQKDM_nT!6$f!SRojPl9>xJMb5*S z509Vu{P{hW#LB@oc)jQsMVCo^S)>@m`^5xk>b~a;HC^h+lIgr<)ivx^9V_p#PQ~SE z6#7XRQ(?*md{b*DwC+ZcfQrS|4>MnT2#sAjBB+fW=@c@_e9O{@Q( zDKZ=mkPCf^oW~w-6k*$%4c0rdHCp{4hHO23Zkfu&#aIT6_Sv^B!E4nMam1wwNfYDw z%sF+8(v#donnwEEGlfL9g~=s`80#7YCZ*+tNHJlY;nUMQBwzUa$zr_c(WsMu7)Qo_ z;DlW&8hjnLhH7Xk^=y-zqQ`yL@ap9Q+qPrfZL!%Sk~!tb`zi5eoYYKgJ=PhH{gHL! zc>UEkG^+=SG3mV!CFTMEh)q4H0a((Ae9#C z&kyI8b*vaomL-$xKv)!koHXeiykpe{8fO`&flHr|obYHBkoS(R39L7J?A>eF-Z5Yp zQzpd(;>oGdOD1|l)3zM@kxl5B`U}=6DmE8~Oc#s|7~fFDFl2+xaPH5nL!);hXDPPU zBGl(0*5OL;oMtSYCA6N&fww|2Nryy0HW_Etv?Vg(or+62CVUAPTi6;+?TL$&wvY#b z(%^lo^*SyR!obcL9^8gQJ`>}JjUG(KI>r4Kf+j_cA&H*le9mmMrjcnIeAiG?(dru} zMMqnYct@;gPaK%wDC3NgFO2a7&Tt-j{HkNf6GZ~+b&D;Il%}N{HkYCUc<=SB)HvEM z=p9s`BN*0$-q=HX+gAShOr^x=t?H$foU4~ z%@5!4^z8b3N24#qWF$+EEv}!D2g+nm||1KI*@e6 zV1fn!mPC=s^*(8zGjo@_RyB{-0mpK?t+ckeQc=E`=G$sWl;u3I;0|kjgL#JEH#f<( zC44s5H7*G0n|r)mG5gOkBOgES_+|WxKl#zHTlO!9)5Xdcei8P!Ex1aJb^fmU9UKvF39D=o0!N^>vQ^P1Zx;$q|Xtto)*=< ztg*b>Il5-eZndWIL5InvFi2J`yMfMo8e?#%p~riz@N&+u4MNVAlm*jR9vZ`oMwps` zv-B7;=P6->RwJGV!zl$0dE}f&vI(>6G<>d&9o^SCgVAuA2F9F#6^zB6Ox5p z(;&kI6IM&7ah#GS3awL8r`6|biW=sUst+R?>M0q#$z;*>D(C-?t~cqCEKAe#o-^Hh zZSXNNA~LcnD=TYic9Rm-0L6u%g%;XtAwj=NJN*pp1xOG`t_czn39$!OcTG9O?BVV< z+~EwL7T>wo%ri>`6tXfaGQ!;K+Bx6wzRz1uk(bzI9-T@>8#}6i=FG5g9usv+|E-SP znxj1nq)AE`t>luN3rDL|#-`RQ-YZ3AjFE)i!A^{lIck4kmAQHh8+OWxL+e?+>^%V8$J}C=u{_dw~%+mclVc_Gw}&lOlzk&S2~u z8B(*8o37Si=TOm1P#gaJ*`WkO>;<#RUo^4m$Uf*(OETwHQO+&DOZMUKe z4fpr=#QlUxf#?iKi`y?5K7Hcx``_~6o8R%j z{jdKE5(R(QtH6BKFyxW2Z8_ZU`FL1!d40|2pMS{|;r-o#v3PP_(zH#3I9V3hVDVUe zE=s|8znFB4IjzBFnX-LFw-R*4c;;P~)? zwY%k4Uw_Hp{Kt3P?FWrS2m!(2e1qUvIiXpvn4*SeEo4w@PC4Z=6N=55kih93a(=E# zK69W}=X)_{1|m8AyfYfSngXm-Q`#KmrVdl7q#iy0t<`>aeUgjR_ah^fhEPWVSOcTfd77N4x2EQ* zm!i4wbKGB9*gU!ulTytg2xC#9_ZTM?2bH4K#gue+;#le>U9HR!xV4wA=y|{7?bPS2 zUeW`;=sY1%Kg#1!>bY>pbC0S-H zCjv!%rmCr65ow;0uM4N|W~s*GnS7zK1*bDB*K?pgx%ycfttUTCkG#Em&+oqd9pAkE zo)=%d;%arpPrv**FJHdGTP5p+Y?-E!#(5}Fd$2TVgqZW#;A?#*N>~t!2`ZpmqIH}S zNBbBVMDXi1uRg!#vzITqdGR^NA#s2IfEUlyN1U+~32GLVnZA)1ia-%l4OQ}I%$H`t z;Vyt+yTHaeN&#mN48uSi5+)^%kN13Xu-SGRt!p3^%W+UMf@IyfsfbI@ zKZhY$hcC%uvM2a8T_e~i#7_gmLnIX)ZXFLjX-qgQ$D!x(a9}@8d^{f6#fih1=!Znx zbkH`$y4a7RAH1SGGSND6XedrGMWtf1y(q#-q^dP$G%*HaJqK}D-%S+ZSvk8f-HEg>`iFdqz_lb8O3~3mc zjw5%wk#F8S@GuBNZkT8>1bib)T()s_Fee2mjzS@cA&aZ3ZXJ@_d3{v}_NgLx4d*#9 zep$we)d5VNv+d175!ZvQq98QZAlIDp%sdib+`x67Xa!ve*I3W0q}z*>^ejHQqc12${Epf`FkczYV! zm#j(_t&6)}001BWNklUaG`~xi#ig2$(tJ{ybWK@o$%9*!V?&tc2Gd-Cse4K#p|g=3vS8HZuR-XPGfi#0@h(%r6V2Cpa6kS4FtDif|1gG#1u1GivJs)+zBK<$+Xo3}PW=8tdtIADJHBP__;e8cLjq zrjUtDLyz+gV;p@SIV8)WKk(uHBV&p<1ECl$FK-Ad@XnH|tIkA?df6QheDnS-ufP8W zc02kh^YQV>FzKK#i9gX%jLuU{l0P!COZY427}AX{bOar$o%^*2}Tfy!nmZ zlflug+N!!PL~A)Z$2dfs?+B|6u2E7Al2|t$BNIb^AdB$&?FSzFiLlzT-rn%My;gTx z7A7*TyWqmEROq(dvRSWKtykD!xh#=fk`i#R1Y>D@i+3$a3O*GYF=XTDW2EmRLo6I? zR-i`BYt7dT=%}t%&Ejr{Z z6@g{t%z;%8)=bR|pKGN0S6z?`lVnU*0Uao+EE~uM&G2pmhuAX=1J-z=g))se1C3BwAU%Lp#s$`|9fZQq0n-SI4zm?gBGM5Y@BXf?|W0d!stsFi%wS=RzcX z81pGNZq7|3SIpTgw)}x}t;i{Q1~ZyD&CMp1+XHh*l|kuT(I@C z%{A`9s$HL)6H@d&%4l6WraFA_Ufujf&vT@3IQHs(^np~Y3IpmnkY%KC0ar8&Qf#3g zCx&rijD_G0V-}nwj6_UHI^3};=8@v{`(zfj`C6b(FdwIb&Se{>AL(|fZiCipe8)&@;-(W(k&sD8qU9e;l#x`7Eu846!T!Zxo zoWMG)So@YXtVjsXdwhmuGkb5z&JuE>Luj0%YqiNo3gaLg4im|!D`QFn{r&;T6Aod_ zBT3OG1kqk67a^tuIh`^X+P4rV@KMdsTa3#?NOWOu)(_oqo>jUpzzee_t{N^uz!xtAfq|x!PkKFhJ zZ-4uSfAxR;EB@wh{*E+G91lG?Wmesq7!$b|wilORJnPMtBG9xA_xqlIeAlzzJua~= z)~Qd)1&?bwLet?xAT<%=EMu{-n8e};l~CgdjpcA0uuTgAlF2kH&t@BN$&lj2 z#%4Ayu`UrG3-k}z_=t;pLUF`okJ;z~yDKgl?=Ccd7tCixd z!xphgqiwvWwXUA8R-^K|H3*DjPbwpq+Y6q5_8GtVi(fJf1OM;uUQ^OYDH-n_>#k+H zT2~i#Q2I$q_2->4$#r>Pt)W2$HqJUOHX8ePJRaE}4C9zIu7)$G^fCvN&o6B)@zQl z#ECak=03f~Hfwyl;VN8k(Rf^F>JFs}qQ#Oc1#fnpi3M5}UXN2Gi@|zN_IkJ3dLP(o zPS9RYqhFFJhCG z=F(_h&?|NdU7pKn$ZX_kpRBf>az-zbClrA^*Rhp$HM_T+wKUE_sPu=NC`F?~iYT2Y zrHQF1y)jMj>B9p;hGU|07T0Zv(c;#HL`G!9n-Lo)hVj5dzvt8aN3OOveEI4Ny31?6 zfBeYT$APOXG~#G{OJiD+0g^_;thOzsfzemDV`#~#r<4ItBv`d(k0xQ95T-T3dmi^k z)~?_!#MG-x&Ke?c^bN7=C^71Mb2M<=vuau%9T=+=%Q6`LxIb|J_5-`afrtAYA#_ZA z!P!7Ig`7R5tZ>%Tb%9tMoe4*LPR%IdN|KShpox_#sq=@c^_Hv6n)P}`mdxw7Z>q3PbkR94daGE}p~9JY zh%W-WX2P2uo?*8qTwT+B_JWJmiXZ|h ztBK8OpIhehx(QgPF>x1{TUMRt_VPKopBNqsNixQ*d4BVp>#Lvf@R{)Y%eP=GkNqR! zVHkVX>q}m}{F2-55_9*SZj6McrSYNCZVg!q&g%@z)aV8$u(qC8>ovc)x#8;K5@Q{= zS694iTXIg6taIQzO*|g!uYp;pq~U2 zBgF~g>a5T>q|~f$Q<~;S8oSjc*5#^snu^|}aDn{Ha#Nv4nSZ+`Ymt}m~6bN4rVclVClw!s*Ob1jw*o1qB?YcsS4pU&L0)|{cC zRisr)6`0HpVC0042Z9Svg#CI4%VGpRHvvhJC6aA+EQg}bcia30-r7Ja%zyr`&Qk!GBm8qW58 z)}Gx-OP2f7I5`nne%&ItpJV5sI-||m{?PvD4>F6t-#$U{KSAV~N`{!{+_isK5Mj~t zOmvYc=9J;5pVy@4Xf=a6(Pg{j!k7})PC8?m_b4?`u|j+Bxbc59s0k_$eYr=(J& zi$-oKjYFULl9V!Y61&VOdp+xC`WWb0Fd7U z+GS33ikda2UyHs^wi2plnx>Re=K*z|KgS%M?E~^Tns+vEoS8WcnPa==Z6A4viLt<8 zf8fiX{DjN4;j+;>OaH7&wh^tV^u2D>*j1@@xr$omS=aJD)u=3uL2Q&RoibC>h(*ds zLk6E2=C7CwlwwIGAzpB%U`2%jRy1ZBtLPM|Vx4oU@*G)dZKz*4J(H~sC+Zy#W1fGYxzCe&YS^j;?FCzP(~|xuxm63h``5Gpb>LWzVXgi8BuW_^~Ia zf|HIeI3x``97Z0GkL;&`W1QF>59FjO_>>EWVPZ&yPyIwD;KG*1Sc2;)HX$xm+-t>h z*DqM9823^U8O6@IRux}V3f?zZ(`a^XeSqgxyF1JLjnl;8m`K2CwZfopP~#lIxjC}B zBJt`lP83N;#W;BHRbg2(u(M=L(ZP&nWhmyXahA*NhG#cdbX`-C^o3y@6xUhtlA#GS zA>gX>Zon{^!iT=+p&!WBQ?jK?j#kzjvJnre^#HZtt{g`-s>=}nd*Ish5 zUbF7Dl+r+UifOMoo7oy7hHNdxHaaLTCl$1**#A;hYC7esXc&9SIw{H$r`UoxPT8eU z@uTzMo|oZv&b67T@39d*By&ZQ)JSuEze-lcjx`laqqtvNGMiOHv5_nTHaL=$sxT?I znqS^W%P37%)i*fnp?GaJ(IuaEiYM#vgD@gl-Ji}j^l8V#?v97YPwWnNJUqT<=yzBd z2_|5zr!&+6at2d0<1jdEyCMW#(1K!VjImf3suHOFj7}E=!<0Dedva74y*P*Uj;0N` z# z(@Cf?7?4V47)OS2U>JK+oSBl`&1H2Bsp8F8eP?)SMPY zzu5&Pqre=+1!*B|&JjCR5MgYo8f>e`mj$nWR+Mpy)zHga>Lpn?v&=rl-CH?1%jbNm zGaQmU$x@#YO767HKEoZ$tn{4KVNw=v?<~^e6jP+cfF$*Tx2ODgYic&&4>H~7#k
  • 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

    Q9Hsi>y>-hXnKI3+G%YXl` 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%0AoP8w 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%0DH=ZI}T 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

    u$JsejrQ`Vu@9&T_@OYg#kHR=XsexRR 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 Y7Txg)7514(x+Y<%~u%nEF-ybb$ zhS6;et0D+wPI%^43}O3zv@{~A3rgGP6TENUOnzc0{!I-T_SlXB)5U8LV0dx`G_WV1 zUF2=U8z*OQbVyGZYX_fv*u7u3nU=V`+Px(P}L zfPa!9-88J=JQOvb< zQz`-jc{!UYL~V}|;w@HTyEdBGNHBYk_<%+$iV}j;tC~3}1ck(8_d{SLr>%+FfTA`b zNX4#y-Uw|BBZr|qm$e}Yb!?XG14J|wrsM8HySD@TXUbT0#j;j6Uj<9`%`+s-sFYB3 zK`tf^C?d2135*1_nld63GGjSKBj6|p6T~?z}l;dPYZIA&=AD-9Z zRK5)}9(-+P1&+mxI#skAxvUgO+@M(dAey09l^*ETLGUCZ9BD3YYPVZAsG@eonKz-A z{5&(z)3~Rww!YJbFd2=HL|g1jhWgc}UG~2>LbJU_prsRKG$izA*FZzl4Yy81I;-u) z*h!2;vG>DjTkp7$*Nm!^2$%pf>b0N8Yy^=Ip($dXCzRcU1VO!=@bTe{shn}MPuT7D z;CZ%Z>X5V#n?uj{DZ?60mX38v(7H64-BIa6do2htL25xM1?!S=KAy3kU*qjv!f%-I zoJ&u}iwn(mhIL&?TOX)B=W7xFjWdLc+xD;bC#D^-58Rw2Gmr|K?gQc>UFO%9Y{4Oh zlT7>zleWM1^kl0p=q3(mCo)jqClAvN-&eP7gp3p`-*>k`aW9}_0ⅅ{V_e(wJ>do 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�wrVD1uQxGrpVry3YGb{pM#*b96_KI!av2AD6ZO0lHEXM~d zhZT>H-{A570Zd2FX#^sQ<&+-+DwE+#Ho+;Y=RzvBVA*_o-VIaf4Jo4`A**9%)pKUJ z=Vw9NVdb$I>gl;2JrJ84L0S&dz!#G*%So!EzXSl4Kx)5QD|XM>+Dk#sJFUg@?rOMJX*~-3S%Z|e52zIwDCMB|Vzpb&7`j4H7n56}P{mxS-W`GEU}I~>xA5Ez%s1;4&L}~uIo6lihzM`{6*(8A6cLsLVa5W&DIIXP9H5c$n$IYEH3wBNWj(JE%My*^ z5fjem7kv5rGd}MZyio+w$uNBjBZiDfN1U@^0qf@{ln5N}KH&Si2P7o?`f@=*#36mg z!oly%fU;*BIJ3F5LRe6_v3l-G+s2kkCZ}q99i3(XymLe2 z25rqe9E+HS-t7NkXblFbyO(4lz&m-!X+!P&Hvy!6mESjKG%CGc;7_P@az*ibe3{}F z{p!tabM_3;0gasBrkM2(lA4m7sEbiYGaY(n;1E#K6e%(q-R59po?S0I2~w#?2Mvk> z_t=2ucV?bK7N?J#*gn6glX_wbuO}C@kmw|YalCrJYk(-!MYRC`|Af8SlPt+~=J%cB z?h%<;S#{S28eB#sxM0l2G&7tL&GaBW>2H^fUPd-X%1jc5AP5p@G|SD{Uz{;*~IDgx}h87`F2VqbfYG)Nk!q@X@a0W|3 zCl6E_2@e#_Dq9h!4^dqzsXE%TereJLA?mg3fb*|`ObvVKauaPE$2z1+o~s7Lig6}@ zV(7yfx)nNAu^xz=u3@6wK(Rs(QPV%g6e5I7m$Q$5zpBYwa>s1j~)YW1PNkoN#} zP(BRHgobDjvd>CNHgVs8bX;*xcIRxK&!h3gYbd5z5fD3yCVcl zbA%VoZNUkpfo_)jkcShPec0_e@~VO?8JtWcsZPXef*Bw5lr1C0h_wVLMHE&%y*wjB zaXK&9E*tKrJ&G8WLv#Z{a6eC=ZNmjd3Cl5K3Nz+3;kvB2O2!>e&|Gkp6A%E+8Jhx0 z#TMzh;N|*^D=mnJgoif|_@Dpt-{Rl@#n15N?jB!VpYYu;{}G>m{cF&2!OWJ|mz7Y; zib8}E0_NQw$G2~BcmIIh{tnabfDjX=;5ns%Jj#mA0c&XsJ~)>aO#mT;n4p2cl#ty0 z8$8M)`0zwrH7CRk5ga)V!XLE7A46~GCqn&Nbs2Zh=WGIawq>XmVop!u`&;Pa0u137nT+l{4X=qb(!DBQU)Toor z83BU!`=*j)RGMg0RB*mLV<}hc-|TSrW{)tNfrCTzGYlxj$bL3_Wk^tj9KglSg#v;4 z0;7O!9-zf3aw}p09`5%@X~I{({ubYS{fGs7gfulLxSbuPVNCln!10}ghI_BV(>hG8 z?*C3GVXqm69A+_ew2AFZeBLQhGSpZ!OpLha!HW2@&T9+Z8lJX;dIwQMBiDpBxUAw* z`U|pGeffqs)t46HHSDTYU{xbq(8Llt7CdzsrRK1&Lei|IBbTXv=5@IyWE74X z0$A$d;rDW?WKQkFY!mCK$JVhgI<*P+tX#LA)S@X$o1uk@eWyyB^!ZxRhG)&5`^}WF z=4*3+s}PWl_E_(a;7ekz(ICoDHcY%o72H%296Sy}Y&McJAQ>v9DrKM`WKknhI&OW1w5xKBG)AlTPB)7Krg+pl18~b-pP-qNTK(=TUt78BK1-r}0 z=U2UfXMmg9N{?Hu zJvrG;6H#e9) z$GDS@S=U>6e$KK%jNAU^W znhtJo^L0N`W8VgGcY*B+yme~*oh_p~)vnep;f68MLx-y2Oop7h`acEc@U10TZF?+|Jg)#JbswX%+bEnO2ce|osRyl2Z;I| zJCOE=9<=Az+t(3?pbYCuT=+eLq6(q4 zbP^ha8(kC9XK(e655B`FMQ%@M>a(LDY*?_71b$yJKT IJwcVGLRmT|GyX z32}}%1jccmaYz#gg6s8yMF?Sk2jKu!8z`7d)Cv$D99QbCpAMJ+NI~?4V<8|`L?Kzh zChqncm*@ocMuEjiWY}o3W$P50l@Ri zM9h&*!A-I@Ob@kC>sG{;RaS?9r1<~+m(bu+Y$v|Cq-ns@j7Vd&OmBCkH}q?z9N2-j z2{mMtAz--WW(+62ErYT)lxD?f*X0NCt$UekJ4j@z7|*@F-|z6{yAMda9iA@V;JjTS zVP`IP1)?`~g*Oyp%eq#^R0xaH8#I&_BMB5tBzP-|_v?z32q9%CCkPDlnGq1~jwlyk zr3@qjtr>IPAEnX(}?$UG-;uTUX1Xj1k|l zV0W0YNWuAZ#jjqTP|AvHPHoUl2#D4dTcO7RI)$H3MerdxIa*n%H4p!hr264g^_RtX8dBBwXtTT7P zQWRy$*wz)-mjzRb*ffE{45XbkfyF2uTPe*gpUVan!CH!)sW~H;Y+{eq1SdoRTZ*lT zZn)e*9#k{IL<*t{xg-}%(`1iJstZ=aRyLfrtKoFP$i=b4Suo8BZ;$V>+fR7=_73+C z_c-1ikX|g$_44=`=f@{pE>~=;qG&W=4I5SuswkQfIpX1X2TlnwMr@Q3v*I|<*rgc~ zY~Ya&JIry$?(TpUfQEyt~KO-+c=?U-99~FL8I+1@PnqtcqbEgGge2a;O*j3h^ zwG?V|r`=5PD!*NuH8@LJetPmfUxSp@&SiUNjXp7N0glJ6-wZ;CZAiqKG{sACD9dwD3 z=UnRGRMtV=eTx#ODx4c~dmARsgG-~|5ruBCWEH0$bXXSG%-vzgRmlQ%aS_p%?bZ3# zvLJ76EdBwOA08pmTmntxVu)0BSI3yVI}VVjE(wPy15nT0b(UKD@7HIlHLe7(3tC=d z+QMtng)fVnOT?GCae$M@bXjDEDOqdyouVNv)nuFKv+_?IfW-zP=H6)V)^CI)ms9 zj<*Bsi|=4o|2*9Bt7tjX2!3jbG_pt?w6wv4bi0pM;z=LZHrHOu7Y0G4i|e?&K0ncN z;+d^isV-h+x`{vN@lp(_1Aj8NGx=v%-y_QeE)Ctu{`qW5i!5gnJR_PrF3)MB!lE^-23PRHoN zQFGF9iwP)dr{xr^uLBDL1Sv2g+ufZdW2KA`Ob}ZFLjq$HtDoz47}&CSE%Ve|M7#Yx z7A-hFyvL7!{1cpB&iL;8M@%t-iICR?A_@DHpc*`Dy*en(fzHfW@&cudoHs-PAe+(A zriem{@6O-hA{QLr-QjME_}~85{{{c)ul^eJ{S&_Wr?2q8|Cj#*|LyPp4xc}NM!8-= zDMCq*)d*W*n(*fM25;Yg!14YK=IMald_V}v79X_QdedDx1V%~;S_(=oASnn`m#+ej zK;Y=8YGCrIB7r~!E#I6dbder9D!n?g2^OtIVhG(@>1SX5wFS0|P?|fb&KTXfYqS^c z0xl;H8D*Mm2}4>_-O#e5P(T!aa39v?`VZr8Wbn=n{&bb*%+ng3!!CHZ$vnPYz*??1 z8YZ|c-pBiIzzwyLzJCB*9rK|xa4OBC=3o}sf8H^tKI|86_ncsD@if919G@eTzYH{< zAsZ4vse-n;jIB;-LKkffTwNw^qQmOVx?C@~oKGMEj)w#8k4H@N)SPlEMh-D@nKbG` z(c*c$@+=SYhL~TLO zE))?OmipQ&^D$FmK!?jhDr08pwCl$wW->xlRNi(Gl3CFLFRAD%gsN_qXz3 zO9Wzzw4~t1ootbHwRU83T22cnHO*sQv7BD;{QQW#Tz!4rX;q2H7yM|#dx%A0)FhU??j!3(ba!6Y=*LF; zqrR}OAg>_^HBe}^>b?RJ?$ClZUG(p&zg^27pK(Ye6$jqbQIYS->*weYa~() zRWq@E7_67Qu5H3&-{A)2Sg zNU<4uYOKP|3}p~0)bDeQld2H_{?f4b@AdOz=H{w@?aggfoc2mk#|8ZmA<>`vE&}P4 zgL(((Fj*vzkVyj&Kn$oN1BkrHSXkKG__ zBG}dow)KMJ{SJ4Bg#8q;Zkyl9omx^wHxxz^V;7fHp>Gv^&_I|W(rylFA_srw-OSK( zRfgKG8YKx~pwZYLzKXbN)HjnNuzJ)x-B8qOKbl;8!5~DU5oAcs1p*&l6jDrD4}Z_- zL4Xu(jZ={fiUCvHf#izoy5M{|VK*JX1bldV2Pq%$&G(Py+NIzqNjAsr=;)?Vfg4(m z6orUPR4(zXW3|@kS1w{ojfH%{G z%OW^$E2imyr6`td#V#GJy$C=^cIa>I0_D2a}>=*=I6h=xZ{ZJLJU_k}6V9WkZrVw%ttf(z0n$CRxip${fYb+F)nVKJGYY{M6+J5qY>9hj7J7C^{V|4coVGfLmlgDH9jJX&l#3Wz_=4nC-j1(BG0xcU-GG%*; zp2OnqG|3r@EI`RfYD@j1rdn@ehmx@^xeZ_fFO=KccY%H8&nHIWXy*N6a$KEkS&5rhHQj$S#Z?? ziUIri08m0KK%6Jcafdw>q-jPj!1vE5Ak6rPCw%e8A8@+ta5*qK;@>gAHUI!107*naRHC7|YPQm#j23l#A{3E_yks4gPt}M_ zL-u?{9Mya`?~p>nQo#}A(sJN#&{&R}m5O8=)Uto*U*x}2QS#!BTAsGnh8M-v`Rok> zcb9f^Tx)aq)Qqq?L$3`@Q|^!X*Pew`&&ImUXYIx4Dhk%n^0%8(wk?0XfM@juwDz2G zRYTf0HLWTBxdF?obC-wa!<-)Eh{Gll97GT;`lJ>r?d#(koV(Wi^Z~0?oeg!UT82Eg zUe9pt+;4;luhrIcgHxlM|2)*;5(i(_4c zWR5L&`CJ^o-G=N^-|gH5rY^ecACoWht2kME#&3Jh*cY@eqLD`G8qm)5l%o-)%btx+ zElNnV3u)SO-@fJH3KGAN3us*G6^x)f~MD#nxyIp^18<63Cs`A==q0 zrL=*sD#O^iJ}?X>u4b=6reO4<7}=lYIx?q*#;!w=z~b>DCc-Mh?z$NqgQY;!YQ8`L z2=?8?5D{bp)Pxpw7zmiyLJ^T-gz9Sfy|8;Vg@hsn8O0VSp1(Y&8S}IUC<0g;(I`a5 zx?FI%o&YJB1L4hwcc8w#zx(DB{`t4R#p9z^T9R{Z9_{}TW2 z|M_?LFaOWq*1C-K#cFgF@M1Q z2yp0kl)aO74$9!i70G=m>S8~udyOX1+`(cs1BemG-7$kRT~TY+PNIWW45l+O$OQlP z*P}Zid)+}rTAwW(eP+?Kj>&U+34n%x9E@O4`+bWb>>0c=EbQwdNZKMvx;xOxf|a6J zqk%|!SctR;92#=Xbs!0~Frps$r!H^rslMPnGpb?wuGYY1D4-p6SKm?S8_zViapON2n4))`wnj&-s79^ zp78Z|kGK>@348CG#m?IwEM}Zr;+eM)tM0$ZMLc(t3r8kFJp4BQa zxK)2L4`Ti*S>f(fw%#F_5Xk@Zh5BH-)cdT()Y&wWuOWSYiY3Z@XTOVLEc#l?~e>)T6#N``vuR*}A( zGJ_QW?PqMxMmChUn1|kGUAxkv#5IB|{|x#f&nfMp~6@@shF;N(PFXCbTWz%@kI* zHKi1vxfQ=N)lCSFHLi=%whPrEHbe*h2@SPskM0>4^>slC9V1n1O=-h%4(wtVI7LMV zG26)qac3q z9!Uj(3XTWHaTjpC3Qkwxo2Lb*LU=BOMFe3^NK*pqhA0bWj?hFV8YB}2^=N`Fie>8f zd+tqOpGDNDs3u4g^qnmAfRSNYj~i4s4Ps~RLY4aWF^xK=R^YcdFh5&GX$Ur;ws3Cl z^MQQOBK4@o+oECmX%KHUd7v*F3(+8C=(LENpz$iig;+kjh&y6mxvmHLVqL&P2hu?I zDtmq4GXv2si1Mya+%$1xL=jiCBmnHf?kPlMR&2Fpiv zAxkZvzAn9W#U@+&%1t@ntr1TP!TX7)x7@DTk6m-KWnnRA?^um zR2MU&j3fh}!?85iaQ$c4vYve>Ly$-yq{d|EG-mGeGVNlJp3iQCzbKWCQ>%#51b8B) z1=T5!!of~PASVx@85YoED~P;C^mn>FQ+6(KvFKI!Gs;9aRLUCV)+m2<_6W6{b5xb= z7{4@(WL~-d8`|Fcm8{tefN(N(-CF=RbcVJEsF?d2li1hw?Y$qvHDA-lF+^4RhhYD| zq6s3@jXN|Dk=i?`-N>RIJ7h%v;4xu6%1cRnzCbM|=k9pK@!>5_*BAW$+b2vkj9c1q4`gwe_kz;qncgd zVjwiifer`>rrsE2M*l7QhX=z&#H{D@eVi z!6L$zlB<|IPkq^3a>mAtX^Kq&RMfEW9k+6eb#F>64q(q~XpMzCy-YMvTHe9BWfadg z*|rUv7fwML*#`(yNFY|MSxxEV>TqUYS1fxhO_Qm6m{2xHR#h>CD!>84inS=t*9FUJ zg`GGY527{*5UFYb8;&;2#emWfcP}|oUj1_;GB8_qv=l;g6whrwYkkN(G0Ac>YRCu# zqOtKVgkp_huqMEZf3(4ON4XS%f7Y(#B>^M$%ebkxs++3kJ85<2j;I^|jw+6~irNrLJ81v_WK*QL!y!c!wngM}S@Hb%h|Bhb?@!+WPcO*Z zYR*;l=2rz71yh{u2``Gv<%E2_;u(xt{o)bAB`H!2m_is-hw8ap)~XRl5ZTXHe}|Zp z;|{Og#Wv(4f?x}K9UQRjN)}tp0tm9%_a+@t-36%JT=uxt@Kf<>-AdgsrJX z0CJW=DOiDyrlPE*1!eIJ_Kqh5q&ZmG(N`e`?B+cVclS6R9}we&6avyb;YAnF{(yJK zJ6qN>VU9);VKpq2J*Vz~j1f!`o5u&Ue?e<_PyY{e-AMGBY$0x?Qn4e#QgHPz{R@ZvNuwqm*T_3|f^U%PUTnrpDsOkLY- znFCD~lVn6#W-&{KQpQy`Kr$$2d^{fTKm5^8@S`9781s}6@&%XY@4)&9nM;?km7n)&?dM9VA?$) zE(M=XFSwi++|defK=j4yJ|=LoB@SGv7o#^iAs4IS!Pa!rz88LTW zadV~w4_XKyHvD;0ElLH4iDv^2l#Cwp-ZS2si<^4!Su@WYuH2!_GJsr|Zt^&V21MDI zF{XT*|L2QrX##=JbLK`Q*wBDChkNI@w&CZHP}anXRVD26ycUzpzK|$wc_=qn{kE`I zAUU#-h;Hyz?1R){rO@-7E2W?=@_kVr9P`wM($ro3^-iOTNv{NrhIf}AEX}(Uy5q=) zbbCih$>0vxHs=)dTvE%VrG`nZHxXBUCXYW)Z!!6=h=FZ=UcVpd_nj?)hirS|Chlmo zmBH;<9arqa2oif>bRa2UjB;`J+bBRSS{yGM2D*R`%Uu*z-QaQ~U8n+@o&gJ`=H?Fm z(b(^jTkWWdUNgJnpf$MFu|8z535Sk0bR8xWft^dvqRpuxusl=|Kli0l8Mr-f<}9tx zLc!+hdVUqBPzN(DYJ#aVC7O^HC@gL1Y@clzo(4sZPC^tgjCNmmx3+uN{ zgW9z=!_v(*?Q9^&fi{B*dwfV02tnHG5@KVtw7iTEF8~R{5{Jn#zNLwk>X5cbX=H)gj4K3t@;Dso0vr$5h6b+*nOk;Ta0EGd zt*a@4LNvh$4`epBL3r)=G_t#OB0#}L`V^pfMGRyDvn-$(5a$VrZSh`Q!CnPJ%2kkS zpZDYrjVj14xju9Lrwzf}QY|0QmM%nO^ph<^vMoG|SbPVw{bwOWK(qB~WXn6QC~guHD?)4s(z%o-s9U<%m8a>JtnX__&|XoJXAKxIYQHk_9e5EcLKuYQJ) z@89Fgw;%AcKm9lO>L30IpZ?`H_|?yUj-UVC|Al|f3(io8GD_SbYk-CT4m-R(9`XMD z2khoOxB#VWfNsdT`eHajv0=+ABHJ8*2w3xiZCwzEEKbg!*^-NAVLIu>G0-hK%>_+D zJqW%Gs8P$Y?`z8z&ErGmqWMN}T3tAagZD@UDFvj+P{}CU6$BH&a&sBxc7HUHd#P@? z!R6}pmf!6rnN5SNjQblQTOEDtoRgHD@;It*cI@BG2nN%s2V0bUP;pOBeU`C|{RT zRZX4~6iKZgBXL@b0Nb|UdOabr;^F>)hr<#3Iaz<@SaYy8p?1ZOLluD%vJ~V>;*mOJ zH=%P~#=m=bi~GYpF6WG==M|@`;+kzf!(7E7)SMNyHZ{j|tCDZ%gbgn{h$HP;;TFlj z)j>FX#y2D#cDI^z*A)}rAbq*wJ7v7}wBc%`-I}9+zh@;IgHguEw~_Bix~NoNXZ5y) z?X5ekt1*1m(&@k^plFpDHL;<-a<5iOXUE}I%&!rHs`x5`ECbu`3bC9;q+rW>6@^5* zBe+&Ngr0HBgMh)?oYUNO=Dhy5= zI07ly99E}Ea_VbLxZjagLW5?qT$NK}8%YsC}6eD&-IH+Kbgb)b(6#Rh_Xz;#p zw+BMRdCs6KLC=K8YevoiIjWN-JiA=j=a|LkVhoi4kq8a8u-806*hN6d5Xz81W)|~# zXeBvhH*ttZMfNB*uT!`?JgpB@j45Cww^?QSgQRn6F+Kw^zdL&U=NR39{rAW||L$4J zQnBE*=cZR~eQ$7y0yIVwN-KePd!+pV^JIj|InJ2V4l&GaVJT|P%c}}VSLF4I<#fgr zfy;72nj`Lx_eit#Q`0Ocn6R6UShq^j*-%zz>BN0As`hMmPL$ zJ_ts!#jsdYZPCx_XQ`?iE{QP0TWDm0>hL|bdxr;ETaW6iX>xU;SEC`B26A6>nCr0c z?a^22iZ0VQ`>js53oRK1;cB}KBM+Fk36zI#T-$^WBhcy9T&B(B`)aZ-Yvn{>-Fxx#r=mM*oh{0BW4+~!M&(`Okg5r@b+Jw;Xzt(j3^7V%O@w71|@hB6X2fmH zD2tK6*o}!&1ce0P(q@cW7xtsrr8&F&%po3PS}VCs8o^T9ci|{}7iWZ75c(m+D6F!Xa`n6$mjh z6wk{ApC5sJnsI+T;`kJysnh60sMfwbi`xvyy)r>sj8Oh(pDeHkP;HvlBW0!ZS$9_WWmJThAW~3 zWmDjn>{uc&?jmr?ifsj!tGC@zz%xOn=!+^r0-rnkD*#_&>Xd}+EYS;A$S0>0q9n+tqZ1k zhn)Mc+E9LO_wgGlkqIy|F;oMRST3HhVu>40q)2PVLyUMEBWTZf&KYF`rnJL#WkfdT zP=s1;g)b?$B6!&CFwHYAMRCmq-@ZKK_uqblWqro^@)>-2@#U}QeFTCOZ*(_l&;O!p zYv2QQmx)=H#9bMseShi)eBcE24zkYTLsh@3K;n?0?5KHL5OYWUdQ5=~--}dNq~x0> zpsJ75i;PWrao83L-c%Sa*_MEC^>zt$k--h?tDezJ9+`m<5Q1fpD00t7_Kd8SJEnpF zMvT@R2Lwcl*o6tl-2o{kY&ruRvESVx%!d00vm8_BVNWsVmo2-V^b5~caC_Nt&(je;6NGN2gb{*WWq=dw=Igu)L zfl>1+{d|TxQq~5HxhnO@pH=_v-=-OQI%8X(p+WE>1rh?@9%lU6AAO0R{`AlBITJoD z3(DtD*q0Yf`yDOy!fIpg#51!a3eWOLUjn_B@~a}gQSG}&-_iimT<9)g?* zvzqe!A_cf)L=cYC9grrxNWpbG;oHyO;(hcCooQ#dyvr4wSL`Ro=7>1;D4$IVmb}^X zmLm2H=n5;!tD~2KyOZq<*%*D{K{qkjZ9v@a4IWnR!3NSi^cHnci2=LW8~$4ZQX|BO zv?Z##`q2a>y=89rREQ4%ho47d=fuO$?D#qzkglWyb_s+?eOOw3PxZ41O<4^u^7?1h za>%*Lyo)>6hZrLA0SS%6#zDIa4xRgX2)_d-y;87`~524 z?A1?iIOFP);5rb|jzq4Xv5uL4g9xIiy6DOVsfFxastZyQ^;6MAfyD>7?34ml%P=FQ zn77v@M0Y!+(Zy{Ek)9PuTljEZE0}3SSS@~JPZ}#%X;#^(!#XxLR39@oJ`Q3WW1yv7CyJX=Py zmI9C>B4SQ<66URV6q31QnozVUQ~*^Iq@!5>5@YR996wA1kY&zG@w2VwK$Z-Vf+8zS zZ%YV)5o0jNKPlF{qLeFQaPhFa@JbON5OOv-O(q+}otKOyZ#b_jN?9?hU?#$wH}{zK z@A2h_k9hxZ4e)s!N$m@pRee(?-UtTQtmjW~pRw+nn#y-s^fX|BT-$RNCTmrHZ z*6Rk!E6U|;I6}E#|1je(fA*L7i@*3YeDUrb9zw!D{Y0t!?udMRwH)j$Ih8CeD#xy|ot zypH7VOdb)YDg(k^36TP#FP(DBxc5Gva(8V>@jIc%Z!j~8phYL83{;u60Co4f>W#zBYHxal zM!v;>S67>ic+KGkmvMPs1(=mAQP0aNhO5f~y^Y+c149-3Vf4H9Gqbt$Tb`{I@m-wp zYGF?|TaG4RgW5Y>@#oj;g3I{{S}xchj<`SUu}cA|-ti)qBVAWpj7CnWn9@qS5&z+( zhzWS4ATZ&0caQtyJs^bBX~E@MP&7azV{&}Mkx>Xg%7 z@3uObTYhuvDRdZYHZh7vOfVZEN9w2JOKlgFa^hB7-;kyoMi)MC^(925L{!jEHO#n> z%@)SC95z9FHq%T9ZKeY4aaIO!qDFZzB4LfUw7FhNCRPtw5K)lJ70Y(U6cjT7`MThG zxnf&4lxqgI3_`&{*0^JtNjE8s> zl#!H>3*gaEHp>>*dYdzJOAHMGffXqi$g(0`HiZ2KzHUg@4ZAJl5P@SPOkA+6C*+GF zT?5K=!ZI`Ha)%fbNC1g0K6Rz)j0EG#=X%C)fXbc|p8j!*cyR^fc z5>iN3ep}2>^ArqjVcjII6Q+v_}=|Nk`5%+MEt?Xtjo`3%Ay?bio$+9GUC#8zx*SPW8|x zw&+BO>J$|8=PFA<0%0br%L<`K8PxbUtqZrlu&nYqqY}D_boh>hsgay-i#F}lvu0?e zMwO{X#?c`Sj~yxqMo3^H5{u~=;~<#3(FH1?Vso=fRC1?> zeGi023A|zWNL}Ll*5+0HR|S2Q3ebcF+Q9X0IH-Fg8u0wumc|&Cqk_8HQKv9Vn-vId zqXMePRjO%6jraw6ZH(wf2Mlwqic@zk;$U7MW;sfOD0rM->L3!SA`fnkdcG0Kz7oO8 zEfS^nJWXhzJ-Y8kq+dlhHG0wiltl|lqjl8J*M6sBj*Dj4!*E8mNKF)IHsh`>)cq`T zvJZj+ks)AQw+*6%X}8ClH}7#>E?7&(_fMa&OM9e{aLo%=RUpj>(;h_`r_&YdMQ~jN zo3^*lb|f&ukqa;&pHUwJA!@0RMr<*z?qMWY%aOl81`l)AmGqQ_FoI z%4itP>aH8zKXo`;@4_lVYG5A4Ld}DW z9qI;GrPd_|tgz6EB@E_T6R`+}fSRYLM!TpETvwRYWx9wWm(_B(yg&rV;vk57L+1-4 zsV+Bnx71=pWAlQv;R`!*N2K({KcnZ?DZs(dYL+SJD0Q}hXLUD4j^?}}Th5y+&Tw2I zT82E5xbs)Bt}CwBE4Fn-Ss9Yoo^vGGl-Z)#mJMYq*rh$l5o<9qQoR@hVZE++d3*#k zBN8J9Mw(_r)S+NoFV+nEcNK%Vk(aeNS~Xin>$bK$9;f^|a?XV$<%+Oge4q@hp8Zxz zR~AYU!?yqd+D+hH0P{5C-Te_C zKfcF@k8i*k`1vn?iSx@NezcFsXTj-Gux)}OhFlCW0P_riAkGOpQOiV&2~vRdvVpaL zV?tndLDmIZ-oPn<*oGZafUPWmtSH+BrwiUxk>x%56 zuoR;YG00GzQ!=Hns0ov>U@HahcYD0MpRi9mpe(qE;JTi1dM51V13)``etJS-Mam1_ z?jp{bab-Y+fizhWbP?#`9%s zrf3@z3@EOaBUZuF^us(=z%m@+u{BVDLe1WC#dE!X*c8cvTYS2b46a@uS$cC^@d zts^cEIyhs|8-W`SdA~z3HVh-i-CaU7G@~u2+C^?*O!lmqapXAJ0V!JC<*lz8a~*#6 zm~ma56LqlAk=SKujvZM&y21x6zhzNMTYwmjO>RV?+617EEUV|2czlW9xz(jyRJ*&k z4GXI4qr3Eo4D;EVOM)x1J1W1_!KwB-$3(4qg9LBi7n2Wkt3#4H){FF&cV8Qput1T0 z!x^g5S@fm`Ys;50l1ToLm~yC<+!d+==C(T8Nh|)3+AyGa!%1Tkj{&bdWC^!XR2}dr z`l4)zSgOe1aX%yU+T|gGVz>^EZRt^w!f*##9dy9+%Ik8+1{ZxnVRgOLFl{8I)fFPm zfv?a%7>hteMpE+!5`l>@vAL*4rN>}YEV}=w=!$kT zTX5^ca#3(Jyj_uOR30eGx>-FUiWDaoVFs(igXiCAM=Y0;8{sN&u))1AQj6p9ivrpE z#hRm=w~Sm?-3Rr!8T`mw^K%8tDRP4`J#KdJwAV{#El~KTD#hNz|1Jg8P zKSliL%@H5&cX+d(@h~S$DtLK%!Skn2c)lu@EO@>w$VdnwS_*KHw)9%HU@Zk}$yjqi zDJGoIB8X7PwqmiroWK7b|NZa(D}MQ3{|;aO!@uCG zZ=Ucd!0GM|oUBh33JB94X@4}w-0luK?QqHVnNh``D~3E|izW%&<4f58uc%-vrD0EV zjfsQN!5Zq-og9r|LUbc4V;=}sdRs+oSL31Ord!-b8Itz;i=V@PzmMdwBIzN*r5I(TSsP!3C99nO3o zx)v=yFxA1oev8k%$$zY8unQupi&*OrRJ%K$b&O*i0JcC$zuojBVv=t&`d-mybr21p z0c(monyVwfXN>C&O^1BA-Z94Zeg|yZil_4nPNzqtsCYOYa5pCeRp^!xm=S{0B^~|V z9ED?KjN_?AZ0;mQu@ylG0n0>Vw~NjD0&aC9ajOctfCVPPC%h7%pd)VW`3Y^Yben-o7Qdn+ zJ%QTbn^+qy1!B}sa-lb=LU{sn0ke1?Y>|UykfKHgVqNHx3^6(`@XQv^fh~implm0c zE}wCsf;l9-JU!#->4eL5!@6t;YL3T+1<%FiSc&^HPSpfKYKx;OIi1Rgc$K7QG(7vW zuxAxh$>5S(yb&PS@`_DrWQNVk?CvbkZ1l&VoiHNVL_#S>O!MsI026x$CjrD(|1eIp zV!?_K*k@g8G&b%+>NPNkq9JI9I5Q#zri8E*B#oGbKwH6O%UE&2Z{oN3`Seftf*$bx z-H-8`PoMEmUww_=e)Z2-Pb-3a4Z?Npr8wrd3vAWv zVhV)p4(%#7DPH@Bnz2ky?9v}hV#mboc4oJwjIfPr-AE&<&{9Bb5wQ0A8<8)A5kf$U z5fow<+K5<;P%_;8?r_AsvzeRtbIM3yj))xW4%KlmrU^?yamp}ap{_0QuExtKjan^ue{PS<|)z`nr%jtyWdIIwuLb$WJ zL3M|!^aWotrQBfux}#lt)Ps&VH|oMEW@`NojbeIrN)vGt*Y$WGbkhq4x(L_>zxAId zCSujbG8@=*-e*t|zW!#Gxsr!6czoq&RTJWF$KH^4$9|8U*e##uyjh!8GBw z$8yks5!b%-tic_k!(E{ronPlAwJTH-6Vr;5UkPqHGa-`7P#?9gRgt9{QEHEiMsXFb z%W(LDjhaD;yw6jA*UGSBw;fz{q~mr*ROdETG)zVT;DHEK1={s9l(xhl%$hnZ&oKxk zUKthC>2#H_&;%6z&tqSx+dqffGejbdfP@=ThWF1j{QSC$QoW($HC(|s-5|P&PpI!t z!6-`7L0qowneq$WMfuu(b~X1j;|1CCP;O!x>d(<;Ht5kH{m*C-4rTaV`@BTkpLeJ< zbQtQiK6?D`-HNDmP*2oIpL*94l~!xjKPO(%r<$RqWvy58@vS3YMf$Sd1+KOCsgVrz zk5E*QhuLZ+=%}KZH9}x_*>|RSr6{QOm?#tl*KJ0IBwJr*yQOFmt8u~(1ldk_ zxt_5V0mJ71iwbyR6be|f0C~fD%~)38n*Haq-HlRvE#Gt4d&_+$8~luDF=u*1QK44{ zLw~l1vjW{jM4%?PY_aV1xqL-0d~F<|S8-P@&Vg;#5=BbSKy_R;K@CCdg>Nje;b47x zUDL4uDxhRV`!xfM0|XhY1;^(V2YSJWBO}EFzP!Ijrihny#rKaVDsA0g=l$)qJ}mP(GKyF zO{Jv``B-z?dvS-4pEZPN( zbuG9)T@Yr$$A<^t0BoO5czL;EMyg@K5HA#27%3}us+OrlrkHL6aKBVR6V|-p1V$;g zyh}vL_I$GSpZI4Y^@&Yeb9@Q%GR;OGkjL1uBdz(wptgf69+ z(rQpANsHMaAR6wKJaCu*#36%)V`vvjsRe{*kufopHUPkuZRrzZvWzTP6J>*wV8aXQ z%6LPL23xecZF*f7T&4?7FVA?%8Clc@4Md0ZSDp{!6pUk zx}xL-+h)jmW=32V8;q+p+Bs(w&R8o3SIo^^@vcm!)GBsUA-Z@WXLDF_b!%({idLj- zQhHV|!OrT6HT0sSh(M@-3%kpxyIY5JD|_E!FeI3x=<9n=6u_ju9Mje;=%8RUhn|9p z<@E%2^pX-#GLVZYQq=_`45$WQ-q;;d^CoN26@r~jDJ7)Ip8L=13$|^=wQShHh@5bs z9p1z}-lrK~q#3}5xA%KopAx>koN&Dqe11`AG`yZl#!dqQ0VQXI5V5C#En6c|vZ54V zTMM4lpLYtNxM9l~A=saf)P{j+ny}wROe%OTSDari?h+4JFDnjrci0~izI;64%a=30 z`0`8q^e2CW$Ip-WZu{iUTLy_B=!W~Qa6P}g}o}NG9<#NKD zCLHdMcvRRxMiNvEM?^UzOpG}u1X4r+Xj7~Pfiba7`TrPuw_Z!K>^g7ExmHB%z0W02 z)}3A5q*=FnyK^TA_Jw5#Ts*(o(;hX^Bbcc)NC#%b4}HmvsG zD&qk&XBpG9!@@NO+$cgocdqYHcBML8V$Z0@Fx-@V&%;`OU%w_n8iL&=i9>NOJ+G`5 zlLam7uzoJmvBifgLbW+*Dh_oV-YOJX1Zk=R9v`GKgETbsJNtrOg_{C9`eFh@mg3M~ zwZUU^3{sJ${b%Bmx~3^Dm4D!w>=k!m{6cE>3XjS2a!O&`wl`LwC0i{Yi9zWWBq*{;JoR z1DPXw7+6sgDH6!zW*kV;@!5fmCgLbS4s1f^k@lhe{%InNarH-j2G;Az>aNV5Ny{@)QX{(X5X5>UzFZM7mhZ#i+@@Cn$stJ(`N^xW$f{SWA!&Mpg$cRBe=L=>L z9IsC}9f7Oc8yv2$aeaG@<1zzjLrEKc@!j{x&ljBUA8~npMxIXCKq$pTnI${+SS&7O zMTVpem$YF^38~m}Y~cuqAQ!>Y(_5U^x43(K#NEdq;}8F%{{;W}KlwvUy5XxI|6Ba= zAN}w6(?9+f`2H8~aR2=yR#NEI0hkyF5iv}lxL`hAV?NzjO~Vme5rl#kfj}S7SqOw| zb=MG4As!J`BzFw7kcmyX4iz0&=}1-CWxaN%cOXaI)Su7NL_YSv<`^tqW0MPlNS$0$ zT;%UEy$Z<^BE*RsMvyT`&1)A3LX1!X*0kYyy&y)$-OYmI#L&DV#u;;*z_5() zYG9#?!EO1Y_1YAO7L?-XYcRkOVPag}-eO*kP$fJ)J>&iRM~F<|7@JF-K#pnUCZcMN zK<+4@$HCdx7&I=@txjSwF-Es8b0<|>(PN$|Czqf zFo8_;-T~et*hiBtHD$CK7BM)DstOUQiSbFO;pPJeU!ZEMU9rmtj-K}_$lDoZy+Cq8 zM#d$bak)I15$O=X%MDH+-5?Y}%7W;GnHh>Xm|0*(FuH^H=?!P+k5Gg<)aEyo=FpIhFS1`8cd%VB@7U`Rxb3_mO=fgxcKLMb5zZn@Hpc%nUP+{A}A|57P_PO=Nt zZ80+nI0EawxvIi>e_mvG@3fgZS?`y9b`|1ew2lxl&2zh#Lzr-glNrpW#WLr^Yzvx( zDP}WgOf$kXfkSLUb|p6zp_7Yv%rd9w3)q0^5IT-rip4&z8-fTpC`!o)l<@Z90c(21 zQ`+#5760J3e;Ysg>@)nvZ~i(izyCY<=YRGu@#Am5!(aU5$N2W=PY7voA&kA3iu7wF zRXD2I?}-RFm5Gr2yZ84G4ftt7dk2gSr%)Gu7g7YWIZqQHstYe_1eot_dOaa+f!O+8 z&R$=t8w@LcT^qTf3gv5USc7+J{NIOAeQod5(LKBu^Z86t`chv9w|OHDR3yL8`7uNk zs>gJoQB-;@Aw%StHX(`bv<1QIA#s6pHw$tj0km_r{<$u`n;<@Ot9{W}sn{7jMmtcY z6IBXv6?E4c#&F@r+-RV+Ce#-Z*u!@}3OamV zll^*|sk}79Z}DAFXwR#(=#Y_QXy13XGhedb%Vs_!pV4*7m-XBt+4fKzkf$rBX1c*9 zFc2p^tpUgh2eRw2iQp_^0gr_d5&d1^-zC)up-O89*ypP;}1Qmc5>XF zn!>&-z%bhxqeouMk?K512eEYhy9{V3Pyu48;~B?`)*)=ES~{_XN4;rHJtctHAw_J1 z3>$JVlnRn4p2~(d&vwC&H-sYtr|WBcesjeA-3_+Oiu?NuRH6^iy`UkFu62aFso8^l z9wGz;Xq=JQaQfnT0KuO?_9jN%WlYSL(Wft(VkTcIOKU*t|Erig_RKt<1Hv3Jg^27I zpVgWKe4*EWnmGT+S<4fUDyHH`gZ|=E>2gwro^3l$H{3j59ty9r43g zxA^X(3mz|zD1mViL1b@=q(JSDZ;l^9cO-Jn& z^6-F?3rIJ_DLQdR5e`QL5SICfX_|04o^U)JF~!LgykbkziOx986AsIQX_`<}khX+% z%UDGm=jj-cRx}lVaSP7*fRqetZ{h$utwY7!X+bV(bO+BcBe#IC#WS}0hIM#OJ2TM4 z4;&nUt|-2YC;%o&yG*XYj=T3}V+s)=1Z>;d)M4s00TM+_3>Ld5r!Zrh1rp9!9Yfsf zOZFK0f`AoI&ySc0$Z>1KR}(7;lH|5j2Ni@EFloS+tXa)DH({NG5y|K(>-ydy$6C9} zdPV66d%gF_56Da{M;z{m3vlJFC&M`JvoAZupV>jRkHBaI8z@Lh`*%zsso13=x`?Z~ zHqf%0(2%0!=ZInIObM4uaiEN&$YU^fT~)?QFVM*q;xR@97nX!N=qVf4H5pPiMg*EL zW5Obgc@^-(Gs43oUY$<(;`J+p=}Y|W&;Ay9A*@k>r)NNH5ucJ}#Fcf$6eBnU6$nhZCfuW4a=v}hZ4h< zq$})e)5)9NeXo5+t zDsTV3Wgsq8H>1T8WF9d9x4WlrGYe5U3HC$ z3u2}k3*_}MGb56nrz9p=h-PoMoIl5FGY4oPfipwO@I}47BP=tzHu~*pUFC0?Bc};kDeuH28^^fr7uYQK#`1QYs-~Zj;!}+^+ z`03yLzxcC%@qggY{^U>b)1Ter-7{e;3|eMv3~Z!0#RZ4u3e)j~>39O7MNFxaM`VXY z9Yi_)pOJut%?Tlca7oApQ599#1T!9c)87r%SEi%hs5x14jl-x2?-ru%gbp3t#^`Z$ z;?6MC+RN#4ExVBjMHn2+5nA)QE0UI*BWTQ~<%ZP6;0mhldxA7KNL#4V-jOtnE!%ae z=+?TfF4ZZ`16o$~gLK;}59A@Trx^oWU?D?3FE#o>|31Zq_u`yRSn`L95w%$sh`_Xg}j-uOX!_7|bL<&EeJWJ!uPo>Ru->dF)7teU;ZU8hR?N z6IjR>!$lpFOQGeXj-~(}Typi@O)oLY6}eACoktzX+*S?L)_X3(;bDMWc~^cfqQ^?@ zh(CJ?O&gZO`(srWX1(|oC^p^fszxZk`PM9CW0VVyA`MQ5Ojc7v=}89q(TLW1maF;ZnLZ&(G{87xi!6TMiLbHXav@YJmQrE zd{uA(Tp=V!`&~kMKKx@Q?6Me&_Gt_vAOR(m%%k`bYma{`61&HS&1{ zmjy*5vRK`aIARSEB^I!pv6KvwD~O&<>PHv5*C{qh|0wKlBrX>g)!qWsWB){?$*tPr zSEUgS_Av+jonA#Uvg-QP!8EZKi(%i54rU)31o3q} zNm?U{JQhTIB%W5Yj}ETiN}%w0iL@xJAufi{;jtlbEy*< z$C~#;I+C_Cvd;pl*@Zz=DpcQVbZ&d3N=2>pmKJS>(R${RlI=^1HX%ZD>Q})4Q;Up6 zV?yi~_Dq9dq+%7SiPQHdXf?WanxEe{VMn3p;uqT8wRIuyQBq#VkO(GJ0Lx~rEeE5%0H(kIB2p>HN;sDd=gS#6GY->?*|DrSXKdSM4nRTMW)cKJGH%0!FK=Jr zFR$Ms%!HDPWiczT#2K1x!4Ds#*Bgzz7_3-^9CLT5dp2I=(ADc)hp^lZxVBK&;CWL1 z3a*2OIzA**?7EJ*E$v4&v@-1-xsK~0&(Buqe&E{9Is&1zm)eNzA4LYr9gjr*VlWJ! z9VZWbz(xh<%QJ3h#V5;zyZIWg?rw2E-QchDS9p?)XCKDZ(LiDor_36`YE7=N0Ggpx zzzCRRvLPD_N)SLIPOSLo_Jo_)pWpWMpI!(6%83bC?h_rZ`~&BZv*SiWY1r*r1S5sSm-NGX==aS=e(~ z=!JTz4C>+6!Ii>D~X_hl8V7Ba3k&K*I&yrWm zXKz(j=}ROjSTASXYr(4Tt=Bq2*}j3bKfLcx5=(-nVdD4u9s z3V0Tn4w=&p%cO?O6&JUt8iG@N@WSNpa0(FJT2`K0Mq3u(xUi{F2EsgGITfiE?mjFt z@j}h?w2XVGV)BA4`+GcrP?(X7$=?vRI>ak5u_4PTAjXIo0@xAnNeV9Oiqq4IkP9S4 zaEvGjSk)T-H|H~c`t3J}^MvE4pMfIb?sS9j!(TizWBx5VxMin6DEJDXvnqIe+tQa+h?aXNR zu{RDcEIO(qhHFrAqZVM@xvnbBdENJM=EPIoFD+{^J2Bcawzy(6kRtjsU^jpl!vUUc zCT$7Pd_Zaf9QZ)KH71AoWZ@^bBlNvIb~}+}HMJ zR^%3S+R$(YSB1W>E;^=+Xb>F?3U95Vx^ARvfdF1UITaWFc& z@JrzHgOifEw|}~m|_oPs_u9mux52wP@sW^?6bPZl!o=+Df0at*|Bp@ z6&ceci5s?%szaOhyJ2b$RPC;f!KJT*v#`5jq_XmxpkkN#tAqQ)1-$)qMq9viH@fyg zUTvgn41-!)Y`>pJ*6pxdkV@r|=C*G+^)*Yn0TP`;q=RB3V8Dz~cUbed1gj2F?h9${ zcQ3caSB=*2cMLm9xh}_=lbeP(j%HBowW%+WEA67VD5$v+MeUvmCZLcY7MGx%+{7W+ zy9R_QE{&qpoVk7v26t^#9DQBhNrfA=#r*IDj}{3KO(=CM1BoWy|Sw$83wr@LbsqMytui9D`H}f-llk z>%ckq!fVWwH8KVV!n8~%QXrwAXtAN2FU8K64U7N?A!jErp&*bzS@5IVBW`bQ5l>$r z9uAnMi0e7x>G=WY`+L0q_B*_LcaOC&-dze3PskjBI3Yv9>k1X8LP-IKfO(qjek_7@ zGsJ#@_#+|El2A&9Y%3lgpYi(j6@K;0kMM{8@gLy#|Gj^V^V^J{{N=yJpZstCGyeJi z`9I<9(~8V@kZ=Hn2rLZ629AsvCmiM@j>j9&yx1b9m>4Fq^{=ebVzZj-$8+Qv>VuNe ziyV+tuYdjBo4Whwa1SVoPvAgsoxdM?xTO4rk z{RYkloK2~V5wmSE!D`s`5s)VwmxNcxBaY#O2os7cv-P>$ zmFP6|lA^|d5Vl$;a|9@0mIBfhG1@%s?r_BQa=`m7WUj=3;uzJPl@WwVL+fwr47v&@EJo7z z=-JL)RU-kFl0kvNlLb3OVk1iWa=)a6ZM`6;tz+7$Ix7Xa6s&1ODj8EW(@r2pNeOw~ zkj@w6ZM8X{ivh^*ztC(OVhaxmHrojbZ~%t|aXw(VA-uY~!DpZT3YZTT`4|}#XQUi_ zrdY*N)Nt+M^L%pJE$zbS)OrFpUsXbkYUqRv?NqKn-5t%1B5Qv=9RvtKC;=?i%SQkA zA^=H>AAk22?;qac&wuhQ{;$7!hu``Kzl-1a?cczE@DKk!{@&mHE&LC!{~7-HpZza* z^WA$8pCDps!W;-eGfGjYOc3!10?K~eu?s7_4jIATO>NdQwA&Jx>Y~>B2k4NOO>J=| z!Y;CqPTO(!uGSO5g|IX%(0Me#yYRgBeP{&1o;hA47fk4{yIy%G;?jNnFa`v)NE-26 z@G5X_3rlL`g3;_zJdT)&J1KNrUbk9~TQA3TXQ6BqXi6?*2+cuX9nB(BuZhHVBbeQeZHO3euJ3xr6&)zjbq^yi;vol8Tz`Fcm-P;F z{$lR?^1t{0EX_bs`(*Z0-1=H-Nd7vD8a?8Kn!BzjQrz$ve3#@iJ@0u#jZpST7|~iY zcpb_zkPM{7cXVnrTfZVb0-y>QOc1jD(%-cS0Gs>1=Fk`0W%|2mqds>N8NN^I0vZ+V zE^Qth@|8wd4OUJ_uC%%~(?k{TTJ2V;ij5Yc^`Fsp23e$EpSOw*(I&%wFKcO;)IBPK zTAZN{<$1F;`L^Gl#oX$&kqD-WA);D4)spR=6RrDL*+o6p`G1`YNsX04H(}9Eixj#^ z$?24$gpy(Xc`1m*Zn`yjMnP~osWu_%o-hHMF^*&-?LwN}oQus6tX^Z(*_t%5a2I1i z)jvTOLetJkMK7pm+TLkh6g3b~p%#S)MkMOZFA;{U!=6ojCVyBs_LsUc#4%|hbQiSM z^#KxQTwG=R^LLN9FyU@t$YI8DW_x;c~wY3SafC7HY%%0KtZ0PAjpY7C;Eg z0Yx${Tf#yU3Kg&dlU8T7=eje2o4QSRXwj;)k&4RoW`L^$0l_i^OTlH`khX-=;eaVj zD9CmO2X7eLu+Em`hL&PvDoCU_rwx*Ug$Si&jAT0>YxSb+! zJmObAxx==e@%H`^Pfr`tYS*MXQfj0@ZMUuF>7}{@L>Y$g#>9H%594E{zLvL{K)y$iU(jMmVMghn@TaaqDA@7FA z)lI1GqEykAsc}X|X5cJ@eBN+)`wkz+8J~T2!sGE8?;ekMyg!3^LMR0)*_)$anU9n} z8r@yX$Z9CgM1q73ffTQ%3FYY#a=ypwAAE$5KK}ym-miFi`-nLlkQ7+Gpyt_%$vGR= zW7`VeUY>E-fS?6avLc#F28v(`Gv?C))4YH=V%rj)pPrGn6}e=j^^CA89?yj3@jVXH zgk_#EO%nn~Of!L(0x+SlAkK^g!&-v~ob5me?#65QdY?wmaRMQuh%eGp0T&yJ#)(@~ zKQT4bIx7&=@X}$IvF9k!p{USWym*$L9m2kRFI|<%xj=F@XTM{DO&s6_SI$7m7AsJS zWxf+(EfwKn1K6B5Z0Bd>v_XnFz3MQcAL2#~So4aE(2+i^=~hIFn5NhffKm}`jKEXN z#G|4+^&$dqOoLsGNIoCH#{1S{T1>fv4sTOAdd?m&bh#%S-fQ0vh$3?;bX zKQUx$igq|L%+;s{M9fTb9nf$UyVB24qan%~;M z5}Zn6D0*aI(}0T_#RV}SYeb5K?@+++?s0!9IDP#N*B^Zhoikp)x&n$~Sxz{8{1NUC z=4N&$z#Tk92vDQZ7(ei9-klinJ!Ie8H>R*Ek+d z2-AeQ7>>tk3=?~;M0hR&lsZ81>1GTNDk#YYTN4DdK4aYy)|8P!c(|Mq51t1}(FYL` z6eh4Lgfa*TDP=$k4h!QH7EDtFF|f=F2nn}`D_ouKkmQW#Z39BU60bm8L6LwMW}KE8 z^TId>hEjx*V~fSq{0CkwrsO1eCo|UbiY;Y?b;W5~aD6y|NOAx8h;1tnI$`50=saf1 z8=ANlDQ##~u|lrKX6?&b3hWCb?M365M@lb}_Xf92#dh-$<3M=PQ0)R$>R<7oS|2~X zHaABvtf)QHJTzwN!vPF#9vYanIu`#!3D>eT{oiAyro_e&52QVCv=xk<QnhUIRJsN+h~sLKJg_kg}28MP8%`1(z$+8a}Sp*rnoZf%&>UmoDT zcb~sh4b!-kAM$tUm*hu{PJ)Jd9UXw}-lZYON?TmOcn{JrMsLIMUJ5n$U-vUxa~f)l z6KN9)u$oI%n4HEm^kM^oue#3g66s#E4#(i$Dkh-4!>-SJ`r_X5_J(uI??s^zkEuN#^IdB~Yr1$?*puNts~DvY+^TEV$w&3uYZ-<0f;0QjK*vbAA%$0a7JNn6 zDGdlg>I*w`bh9>+!9ar`I7)96HjF}%>Y(L)4I6#mR|kAkL}Vk*#5v-4eZq2DFf9{8 zjF_jTQG)_8=EJcKX@e5h%QMbTPk8_K9k%DQ=P#-cM6_8>?RSy^*QVn-tbgVvTGZBj zR=0i2rBfq9wJcjzNH#!yF2!8tKFC3sz_YuXRGXMLgy8s96JSHAVa5$(YfntBgGmk` znji`kkJKqe+K#pgX|Oq+z^slt2Lqre#iD0aGbjkQtso`oLQ*YAl$txFzN71)Fj4!l zHfR(<+QeNSCWavDs6kuOdcBzwI5L)rP{bVk(xQi?(E_%VF--)`87W;bEdfO`KKblZ z{O0Gk`25uk4u@MjynDvwlJW5UBfk3P8{9uW;{M?QIcFT^gA2b45H0s{%`1@Y*-IiQ zqKItFrBW0rtw<@OD3CqsKuUt<3uYAr6ny&n7GHjGhky86e;5DR@BKcc0Dt?lpWt8r z)nDR|{?-43uh$jR>421H&~kt#LP;Cq5^dSwi=$8n#Xc01Vv!b1`vJyor~*r6$Ew=a$42x9i!nS_+)NDm@NtojUJ+nzC#~|&G!>kU3f+Pv&&90Fiz~KW5)gS z6n{~;DUuaY!)!?qG#-1wHtHRg11gkN47$dKJsX`uCCn_!Dn<~_&R5MO>*7vig zNOx&B(~!>qAT@Ke@vK^w_DFT07Cj{6$hjf%EB!>8VaJ0Tq>`bUl&@2xs^Q0Ld)Y0~ z`|oZ;eIA6A9fe!Oo%OYjQj3Y1mj%-tkyA#>*_NwPovt(p76Il76VE`{%&okgAz-I7 z28a^YoN-=P5DCiZgsb@k#NcRk2Ib&&Bcu5Ka6Ie9#mm%0HFjSVQA8IoRf>gp4P`_C zv1KoXCIp}%*upF~8A4)2JC43sDA2-C4VaG$mT+zF?kZ?-*KOK1Ts9z;=u{%KWl0Pc zi&*dK-7r$@1Jr1?i+9pSm+s31UNG8j==Bz`mf-3 z|Nb9fI(&g2|Ku0=i+}U4@c!uun*h(Lcm%4s2;nq^`pkz=DHFwJuVDu9;_)QfGV5C= zy_1|o)t?2ADf8>0Y;)$IKvYJgXg{l1|FxBDR3b;zt12`Vk7X3(l90rRNY}?Bf+{ZO zC#3T;F3S_1pC7TV&wyk*155I_B%2jQ1~f2)XRH4vMO+S;=PSgxV4ew|eR_u<{qTo~ z;TrGWJ>rrsC`u?i+1`LMLY@1$xQ?A9M;uI`*-!Cy5>!eajnP%(tgf~7J?e~y=sY7_ z2nuZoutJ>0jRZ`{%+ToojUVG33En5c-~5}m_{rOUiSOTkkB2vZfq(R${!{!n|Mh=` zyLiTb_uu~aCc4J0*NfR`sS*I4p=$9Gg%Xr)Y93S&Mm#hPaWe8tMA%yUcQnDU3IoA_n!7S)|FHNq81TcUtl^+Ep*8J)}1IGttY4g3X;8;7tJ)##fwAn(jD=njU>=r z^nF?1giA8ezGxJ0)bo3Yw5w(gA1;n2K8*3|z925cpAQb5nn!-t`2Ds=QjhSo7eu=8 zj~m4II>gk~zP|nb)FVY{H>ViCn-(J6FQuOeHHK`ApWT09gIE;Rg>Ur=4QK9$%li+P z_@i*F&ZxQDp?|r4}441YsE<@J5NUv1dwX8;zAu^;9ddQ7uobj`5!cE%@l>22qdr$+u5<`#yONt>dG}hUKJenS;u%@HRw6&W7CK!vTzfO*1Za7^Z5` z29dnD_KaI!PMgjkcY*TgY?UzNV7Rx-2Lh!OTcVs-EF3XUv$?9tl+?9ZhYv@o;oA&n z#7hLtgnU`?EQ+)~VVi-cCq>y-oQ~I+4=02v_)At1*jyPQD}L*TKfvp|JN)eH@9_Qo zGrs@+0T1^VQ~sn4bBqvw3DvFeL<1s~RKTo`c&ksqZouRHBg(9}{_KQ!bBFm5asEaim@J=K#jzYF;t*z_*z&Y^o{k33_N0QS z8RhZ_Y!CSO_6DEaeTuXy-oAYT!h$nQ-4}~uRsm(p7ca76lQT*_WA@B!xmr7wEj|vsVH7wG77;ew0mtJDZvf>$PZIMvKXaLnYN*$C$*e}hh&<7Z^VC*I? zHS&Riqr#}UR<-L@ci1c?!I8GA+O_<^VB`f9-aXg+7B4L^) zaAXt+&fA7JZ@n8sI++9Ov#q&m(4kuje0*FOntVGD=f-4q$aV41Y0VF3J zrxR`t3!c)9^W$5T^oYaFjGMy&&x!H)Z0^P_7fjoRFfUjlu!M@@Q*Xv)VECXTqhBJq zUp5iV39TQH*7PM}4gZdx;lnr?3Pc^V%PM)Mwy@0oS<>!YreWC6gBe{1g*nr>ys!D9 zz65MVeLd^A`-ZFexP{Pn6}FCH*n`tsDw1AzBgR3y#=B*C{cOs^`wp~AT$i>tX`bnw zlbyx^%79QCaiuTuc~y7`sJT#l+|e4?hJ&XMzC&$%*S=(I!+FIncf2E{KHTh&bOw6S zly;RcKEVIApU>JB#x)Y4xjL%2spiNHh;dKzba7(;9vcd=em5#@U@9)qXlSh}NN5q0 z)W{9+bEmzB$M$KU6^-{O4RH|7Wh$fUc&Ou`!|Eo-M=I*GQqYA|~ck z9dg{9v|{m6)DX$GYwp8dc>K$#g138+`*0-myfE4`H~cv*y%>e}26Y%v2M^kpV7u4~ zUw$Z!>TumfG4PN*U9UN#yB-dRjj9kSSnZTEu4BMww>S9m2cKDg-y;A3AOJ~3K~&>c zzW5lQeexPtrvs*7&7+ipv~6~7Ga%WTw)6RfufGL;nji4>WySNhLBNm!(Wevu^59b` zt)*=0{PynY1B2GMx4}>4`c)(_d6wx&IsvvMO?=W&e7t~EuoWXFK?tN)TS##sqxkg0 z5xdQyp_b2yQ1j&q1Q{Mf-)KYXt}GLP*)z`d@aC((#{DV=eDn4JkMG~$t2aN#eE}}< zh?N#33MeGVl2IgC-a18K%8+zHUIQY*1RcaKNOk1skQqp=eznh=eaPPE6UabfB2G>izIuKxEHGMu0g`#a*=HOvi{31z9I>2<~cP z?``_xv!WoO!H}Q1c-AfL@)xVvp_vzafK0o{kPipyg9)u+tcM(yT@I|YY+`BGMTA{I z(WTHWx~s+k_$0K9@gE3)vel=JxMJ_?oDy89R?_4kuDtW~FD*!jbr z6Gk9tDM%tVe`MG@5sDZCj>iQt20W%@X!*8m;68__xw!(Ate~t2V#{HvOL7FL5Q-AA zlXHyhX){yHI9CX7yZTpAV=?VnjrBXHF+^20|_cDOt}M=V0_z z3do4q{Duu|CK5RXnbjW2IfV%mk#atF&476oa zz#JoDwC9PVPgSIt!AcZG6EbZe7%7hd$n}i8Ug3N`;rZ!^=kpV`%NbHukyN!m?aD=}~YU54c?ph`b<&6(Nh0X(I~5B5Z~GxgNY{cHw)2fQ*tE zulsGbD+BeBcA`@Z1jsrrkO8lqwICG}h(upHiBnigv7vbi2duSlzdqs5zx@_}^*{a< z{!9M%@gM#d3l2f?`P~7p=8XGw!!$*#3V;eGt^)Yz@1z7!aS@x-fvF4*);&p2T^LJ) zs=h75cSfSYWI!(?PuaUinRD0A~G6=(-!+o#jBj6 zo%m9(UlRjzqcb;>4^@%hK<2CBJsF(u&_QTGdr<@J51Jy{gp+&OstIhXd87)10~8Lc zFjE0JeqE_Y7q%Cp4S|e2%?;6AM<%TfR(D7@=eW=Rn_#dm@Qcr*>kPxr(J;gpspi3w z5F5p+_}?e?AXn`yDXFCDiYcc~+iKW&Db4K3gDbwrSM|6*ae;#gpu9(S5uo_?o&Ozl zMIGaDwAU&v8t}!;sP&$sn9$!_rOtu;*(xycOYmBO)MK-nVWA6X#YMn4eE%0 zr6Jw4Pg21i(q49bve}SDBtS-FV zO%u88Yew>v?ucOB7$XCvkp@Fg73_`1u}WO%MW`a`z}l|}s1c@70Rw271@~8z6*uAo zM^!XT2l`@`=?oVkM82cvDRk;;GN)>nC4;xV+XT`QAT%OKY5D~8e zrsE8b0g8m8<}?k&Jr|N0QwZR|U@cg#PLQ)8pA#;Z3!Z{yGs|*9AalUR7(9gDGkjtI zEdgI1Zt=;@EpF!p-+gq(*RSsJ?RW2SemLX&ctN=o6a_+7sz6o0mw0hJs}To+a?7TMXLM!HofUVFnNt$32#Zw=KA?N3 zy*TRkJE{-Km!?kUAH{m^-U@yo*`dW^!<6bQ3d3BnU;;QGXTkHDaaks;(+Lm4xLh)F z7N{h{YOrH=qz+ht#L?w_9Uyb&IgVk67* zi~uAjP}%^>2$V2U0*8dMUhvJ^w>ZQJ*H^c=xxU8h)K!?`f`^tlMATH3m4Hzd z(>0SUsV&x31d=SLxxie|@NDf67)1n0Z7`imZcbRKsFkK*_I&aI4@|=%$k6`*YJuwm zHqVE$%z$!3T3QpxZP9NTuBBz=5%;A_9W2%6q`Dw$PIb*>Gsi(dh=i=>q9cE&1fI;b zm`%Z5Gr+j1ks}Z$2t{j9mH>^xWk}kwkl7G)x!C()nhuDQ4e*G959bv#BA6{AggBrm zY~bfbM%h*fHbf;%Az+#p#N~(s1cd`q*=$h3rZ$aiGzL=3P^*e_<=}A<0;UC%7cf!+ zrsaS@0Z|oH6e$C=96>=44x2C07!PEjjgQY~EHOayBQ9qntppATG+C?(1c3`mx`0B# zbvWRPEh>cO1?y>n$^~y94&djAO$}AAfgusdB6!}Ou*!xzd4-&walM%Epp*jQ1yM6jn-bQi1kD+fWC(ys6{i?*b9F+vzQ%K4Y)~L4Ak|zRi$=(jL4`0w5k(M{ z5XG9%NDODod$h|~3J+@6kj&KsT{FXn!)!m*qXqQ!A2*ZW`E;IiVU zxMi4eTg<&&mW>N>`sJkZ|KI;3GN7mGP@Cxkn0jBU7^YY zUa1Y9X~-$6?*ZlkE44?aHSE0Kul6Ch#n&_+cFleooI@QaW$_HA_9S0(=m*R7is^58 zu}ZrEJGq;g2b^l3%@2+L4w0r!jY?LV>4e=uP58sgqn z$|CMe8*qaM$+-N(pqED55%&$6 zycBqhKfxLZ7ufVg{D^GqjzP4hx<4~OP>(@qIvtnwx*;2yg zvLdZdfC|=JpkQ3G;LW>7JiL96=Z6PuLZC3CfCh1ERlzfWccsuLD+#I zSJX0$6&X&dZSJ7z=0uV9UMo@nQWNb_MMTA4vk{x^NIflzMMr!&&j4R~^?1DkdCKF&r_`pz0U&1)rK2b{!z1CMiggpD#86sH$c)qmVSxr(h4;C|0%=XO4s#Hy zCWs1R5ZoRP2sz^E?GtW}2mJ6ypW~CCevHq4@N0Pfam4-o6B3Mqpg|CVFY1y&uwm6F zkEIjPe1wJx6eh%Fa;K~A7Hp{Jr6V1Mq`AUEy>HnCwN-dC?ce6LR|{$a(K`680~F;k zOMV!Z`Eyzw-NsPp%Rq#V(X5E^j(_!cZ!uwZB=1+H=NwnZTaCApRtG3bc3Bkl{u?C7 zB*-NLVlL(yo59R}PmTU`-U;e#abop04+AU5$hly^L;xcDg)@ygj147U8jiK^tn0Q- zJDtrB*(v~_CgBB3FbE8*TTLr@5km%S=mHHl zmZ;Pi9_rZqK@?gX>0b*E(e6C8g?qntV^CE)$ZN!kn23q|xffT&k{cT;Ub+gvT2vzf zn2JZ&aO;K1i4NpwRRPI9Zgt=*ealicI@#V@5#8_1$4nhh}^z zj$T)&V+cf=)3Ow`kQ_E-Ib6tBWJ4~&UGakKQGX_C zj4m1ja?ZG%SF9HkIK&t*O*2#i&W{_?TKjQ9p#Whc@o2U3slRKhbDk{QSW0R*2qNqp zysE>p((%gGzK%wnusiwClI!V(TxmKhT!1f3v- zA&Ie-0HS09Nfmc+iwn}D2bGx-Xo)k*R)A70GF05&RWcyim%I#8i}cg*B1_weTLaO% zA&*;(xyO!>&xl$XI67j-rg>b}`%<|GAYn18qDRarkqKO7^4)-ifMRA`QpVF15pj+C zJ8D!8O7$CY+c)%76S<2O!TIaXY9KKFtX=I-I?xx+`ras%^ zI|#1$`eD9MMUXT^8o&vOnYq(MRd+iARYlIF%~fkH&dq_qAPKEMu8ZT=XS>*esIv!@ z*t5*-Tgh&ys~nmtz+tAB9pgT8o@o%!_qoq#2C4HJBCDIB-0Co8GcIbD-T7&=G;YzP z2;2hds`w++S%(0@9ll@;3++npA%tNLRQq{5z>EYHtD}0%0Uu@@&8a>_HR&){$dG|Z zKyAE~Ym8;Br2_3D%Mv7Jyp1X*Ed2jN?u6EVIh}7$k+F;i= zVCw;(h$Kipc&&8ApgoSUR61I%(Od-REe>Lv&!NR_+JzmWrYg;|epv3*$3~wVgvPw% z!0k_?Iw#_`gS2ZEsLvpK4cw`L(u6`bOH@DK+3(vZYQqs4ez*?9)2dwGe>vU+dd?%H zAWBzj)NHc?MPfj3K!_7=mMeU8x&}=V&j~n96HZga^W_58?4KjFqBm2O-}L6EKEMJ% zVg&Pov_4={U=h=?i08cS(6po&b$Na0H{dlZ=AsG`{P)SEIHv@9es;yQ;FeFA5HYi7 zP%{~3d~$S}n`2`DK9U0-C&hAiM7|DqTOROyzTl=DF+ZL0X%gICGSbrp%VEax`iMvy zL^e!O@TI)MMvU8!?(osof{$Mv@cpN+@ZI;1c>nGhZ@#|AqT6$thIsQG2o7OdjKyOJ`F^8v3uy~A{S!khDoH*X$s|NcEtvgKMi zTik;Uypgpblyb*_r~udsfD1x?!p%W&cXve6f^WZmi-#PLrUmaxg2E8{Nh}*u%LObO z7zGn&P+9TtbPo-J>rd|R@yDOy_1&kKc)`=-Gje9EsUU3yX%iGB9Of%fU>st${Hlh-V_x^(PSBBY-;d% zo)DG^n`FE{KjHa&X~@_hp35Sh{SyI==8i9cf#Sm{twoy;^gt+@fl?sF5NlG(kbPzg zd%Jy1P2CFHQvBx$f`pdgMMR#5V#A3xkk?}QQA2+R<5abz8msi{K?GQ7F`n3`*`EQhP3oco-+vSihrFri@4sJNs`j&QSf zTgG@jpQK@c3DxQN1v$aL6aFuJ-<6!89mc-PLN1x#y}MtlTHF6x(TYP=7X;P;QYTWV zis+KhSn8=tcaerUuIk@cRD;|Nw8?SLIoZ<9?-{F)sVbmJdo^;4H9@5>NXwJgt|9Y< zky3MEXy+WO-)#38*X2}oe|k6(Q&+$B3T5jN#D_@*=SE#5fYw^meliYD_(2y10a%@N znmXls`TRXfO0^T(?3a3F@hH^Zt-5M3wyK-M%Obp61a+C(*@w*>#1VPchm;1jk{-%{ zR>X6?x#nPdt6+m3Z(7UHMx`z5;Z&10w9$GV=4{P(@IjV|Ua-TgW>rv@nmbv3Ix3Fz zN?j z{wLqy>kl9B_1E9vhaW%T@BZd*@p68~)AJL4c$tyI5nC95(_r^hN|-1kkm5KTjH;Ao z&}Q`(huMeL{$5dw{K+Cs6h;hXvB)7V0&nl<^M+49{D^=2&;N`Mw|98>`T-C3xA?2S z{0q#9a2Vg?pMU!uzWexl%Z2wxPM5iHz+3 z77ED30IvwNT6akd4Y3aRLUG`!c>gM0{&cJZGxmFgI@BobxIg}0a`SGOP_7JTrOV9b z>UycJ_9B*Zv2iXA;W9ui&pVg8$RecF9kf~KHw)E>lb22Mh0?y`y;Ekuh>sHgfmh-NRGsy$LY8@LnVH6$+) zx|~>TsWXKzQzQSnjB=GKfZP*(xDPw5gIz^7u`9R|6fL69NogQNCTQO9^7I+o{DQl? z5qGB}#^7$XP+~6juErgah0wWVzRY-60AUz$m`<3+1Lmyw{Bps|JR{&>6gzFi9`0P| zTt%(j09o64`8tBAEkU&QaDDE5`GX5xN=a)5dlq|s)fZ~w`R*iE_pn$2=llg^c$~(r z$t8r0nw#pQsrKRZ^aSk5R8$q3J{Xr)o6@W7BYhR2gl-w#U%S-JGwakuND_JmDpwo2|BIq4r3f&?vZI3cF~ohEb*xbLV}YQ16NqFa^YDF-jp?jy*{`cSJHo z-E}I-o$;v}VW5iWv)7c8J2lNaEc{r#o@ z3WP1MSe6A@1w#x#VB}z~N~A2HiYhx_gU!UNQgpg19J-A>s^$4BmsK z1mXxnb|R0s;L2Q?>C@qRUYGx}G@nI1hauv!+mQIyX1UG)>s6(Tb5!6Vb>H}IMl(a?t zPPpH>?ki5;>wS`rSXaJxvF9jt5r2awWSHnt0mK+>fvfvHM5*t~jY;Ch)N0sJP+FU+44aV)j!LNtYg?^s}8VroI#9{82aHl)9?a>Q#_Xx_~OOdi|EPNKbfV zTQ#E8I)$1ri=%x8m4xASB{?sXymxS6eKTwjTBs7&@`YX{q3f#|W?cmPyob3H9dyp3 zQXVq(F@f#*rDEVHL<9Yz?BAJxvM-pG8g9NtAZlO!?WthsO;lWCGvQ`lE@B?-1gc7H z`R~H+;+SvIJ`5qB4OOna5i4xx9jai??6|FF+`;N4^arHVySw+Vi&-nV5!~(1>%O%t z>pL@pMJ1X*mOb*DxTA$Bph!>!V&XoL#Yhnxw-=rMf<(x8JaT$cDdi2 zjtHYU*x9dR^+UX5F+pr;bR0&{R|4kQaNmcP5A!i4j=C?2mqEe<9eAr2YP@cX+?~ZANHOprKa$$sF!SL z|Dxz4dZiQ*vZw*#-9aQi_)G;8->dOTa|h4;>rQ7b?gdx7Qm@?Fg%1PDHXMU+UGj%Q zODKxBY(q75RJ(ZARdF;-BnYzLZVLF>yLWhabHYl3^Yazo{_qLUPYa-IgS9$TwqZ(g zJU&T=P;xXIdo0`r$un+_1Mco`FmHm-&(C<-1}qeCUJ_PB43v;1A#EE%S`j3Hazf5C z=5#?EBkpf+@!{*A;hS%Mj+@g1rsEy{@WUra9PoU-;xeyRl!a)EQ3^f)3N~yYwqZ~( zrN}`ORwyXEV4G*l)5;rkTQQ`BH3^oaxILaQjQ(A)<(sX#`Fn1|B??BN2q|Nl1{{tf zpewfJf+Z)U8mq2#(Z#A3lR;V?ha$ExFUT|%!|;piE2C)u03ZNKL_t*KIuKLG7D++O zmj<@rt5tl_;bID?FOOYm?RZMx%mT?P zh%%TDP?`WtID`qu!x0)sEHQ#H00PU>ay*j^86hqJThQg$41(Uc}4*9h!{r<#E5YOh>`MI zmtrr(rj~c*9(QWU;#kO%U8Qf%t1WG=#vjaqEJh)*=PM)Sgq&C8ZG-ZLCsq4QiNS%8 zBJlD2gwNl9hb^s;P#jsK4@1rAbaQu)yEpG~yty|b3K51e7`i8A@G#(;uioPBc!S5M zXZ-GmKj3-2VuK=Y8wLPx?(T3n9kJwu^L)X}GUIZ+B8%WSOi%}}1Y(2`5rZL?3r=j(!eendD9o?Xhw*#;C#&Nwd#H|G%#x3{=C9`UlQ z_~CrUvSq9~V_s$)nV}hoLbyLncsVJap0Bv31dZ%UKy6v^gzD^+SMJqPP?w*-W(TRh zf`PqS)c4$>epuIMkaz#-CCY9&)qaLP`>;8cD;Sho#+ee;c$nr|LW|EKeMKokmqF)s zhCA#FuAX02uiPyTK>hNxPo3lHpyORE!0TKj&)o&rhMqfDTgUXOYFDavE4AD){~ee* z6*M}udp9U9=Pq7h<)wFlRg7rorreQ_sO8dA_y2XSu_o2tI5fE1k&d(*0za#lvHxU%fhoK<$pOg>D*xM#N~#= z?fUjge5u*RJBpNj2)RS#a`)`l>|!Tdl^?3r|L7c_?b{EX7Mi-uVcNx4I1-f!IkbeN0*OS-czj_i(TAC zmzCVa91csD)=-wSPyNtSk5ghY%y!Ak4MbS|dHA?q@r)~?h`Fc&Ll{_6#+uE^Q_c)x z%OY17HY+nI5kxmf9ZOYy!^N`FiE5h=TWV9=6NHo+-m(lxnZ)@J+?M0jGSrREiCUhl zyXQnrfJxd==KX@-7WM@V*ku6wVlzp0n7@f`#0g9&V$1q&N%#H0#i2etOvyx21>MWV ziItn1v79*`XQWPWQdi`I6;Vu#EtM4Y3JF-mKiLre!OOcuf+Qy- z&zH>Zjx-@oAkQlI2Xz=DCJ?UI8Ilz=4p?j&hKVC$a=IJa0DGA)_~F|>;5Q-QZn@%5 z|MK79_{|6W;;XMP|F??x{w;2P`!n49r@zN<{@=gDvL?(REGme|0F3~EZJm*1!!}%^k++2nqub2V@RFh~}&UVF(cuPe}f3aVS~HQWR9?ASkhjBn0+(5v=@7X@5RNW=q-6a*l?)_iEJ^LV>!+;@-h&&)~ ztJT*@Fa`TA64_QGbOU)iuV{yY-&G8%`#2=+-CwybL=ALcaW>@~uS>m}nQf?ODT7wE zA#7#^i-N_L7RAXZ?ozjzpp&#zT@JYs&t}m2wh2b^>@mi_u2{E%je@r zTO&qx!~We0Uu!H;#jciFU@uJb`aFAfxR6C#Fe#8%dv}XyvUmLZK$giUav}mv$)<_K zps3JbPPv>E>zZ)I3Y{1+j2NO|NtgX|>~RFL3G%igr-aQZ2N}Wo-WYH=m_VK>nsa(G z(@D|<6+%ijPr=}>(yl*}x;VAxHCQw46b2WiDUfnN&Z7y`!)A+ZQ0*g2na*U3f2QDc z)Dk0;LD47zQhuIpfz@M}ZT@BgiI&-HvJmYkP%Xc?Ep1pEor#@X6NqiuD8@-)A+Q=c zd<+8;5AMc=#fM13z>J5RJ3Jh3us)yh`48V=-Oh+1gC;u*5(@%=Os(Dw?9ohhK4I>3 zQMMUO=eoB=k9(;ND_A49f}5+fBWYTklr*y&2*_A|r^*HT|%w(nB)V7>(U{{fe)v_&xjv?Gf zz>$+Ensa*>;kt8oHwt5+RzE}_Mt7Ex+&T5YLYxDcSduS!mxR@z4ssz#5er^(y| zoXm~JP@bhO27&!O<)&__an|MRVnGwK5F=_4Q+xf=Ex0R|U&v$20p(ctfgKys$#NY5 z)kOx}sXbH`gT4w{EC#C@FVYNWMPO|GO9l%e>eONy`iOCkoe01uYqrkp2ppj<{bLTr z`78(uM6qI<*l-)GWU$yFkU`MMNbts=#8sE3s9Xr3gJA}d1Scg#Fupnp-rhuH5FR(e zDhWS6eZqG63~Uz=4Gf}Y#ypynEdU%{Y37G4LotwohJZsn zVvGUnx*%=#Fnzo};d!~@FhAiq9Pn_u!QJ72G-u@V2EDl=4iSgL5pSmh?n1=FVZ;H7 zNWiDh6TbbZ$kzoCBghXwLtC4}yiIu9Fk?3c*Om(hzhL^ql}ocsZ8$Dv86X`luc$^H zU%{cN>PuF4b$V%sxqNjHR(DfYNN&LvT%BW56)NV2%FW$fGj-J5=$vpojCi=c!|iFr z_2mUW&KE4pVv8)VadNhT)NpV%$jqz=d9^nvn5#Rd6-XJU08Hb6;c&nrgy+kQ$61hx zkV47r01^_AuHbb=6kt#*n3uF-P8;q|BmVSPzr-)T`UdYG-eDMzc$`ytb1`IqR4o46%1Q|&MTe9pb za75$*7s{A2L#|f@*>FGHjugzjx4x29*~4^nXjf>)ZB_N4G0u5#tDb%03JpRVf3u71Qx@pRU|eKmaUf) zwt2ypHw0#kX~Yl%I0SP>bV$dJDqf37!|4wQ954Y_ix_fco^-Rj|7f{B!c4@ zar1D8clQri=M5h}f5Lg0v8iHN7eEAW-@L=a{XGpEjzR$Q-FT&@>H1dP)GNdd|U zF#;3WT_UR3Bw^7FSJ|*>Mg*BK0>HqG52suF<c! zZc*))fzaZCz?Td8*IxK$XX#X>`&@f^6?3ygv2{s9N(~i7T?TVgb8B5Fx}MdBU*x#Z zio2q^EHpC>Hz5$UWo&6)c0ZR7rD}83iktoPyM-}Te>9bR!!D1sW_*GC{%dZt()22# zqYaxaUdg|MiV*CU{eCBhqCBSzrjljr!{5-Bxi#Ar+OkxsHJz-niUBK~hqX2r#pOoe zmPM#7r=ELc{mvOpyL8-F`2(E@Q1=!<^llAtdpS7*yK~KnJf`Ji=L@&zS=I+{SCDb{n;DFv_N44nSbIGLS`qFbi-4z-q`)&4)O&C5QY zxQ}}1ar=d+lnX|;YO$y;UhUU(Oqw>wDtF{1@?k>u?}P-E%v6@~BDBj_B$VhZ?UrQt zVvz)N1Ew90mzqMpHlQXfP&Xr zC6d<+C9ln6IHY?AJBND5G%(e=I|Z1@-R^B!QV0#Z49`wApVctDw(lzLST#Yi`-58@ z1kWCKCtnhzEMQUVVK|gmy^2q`AXi0R6Bz4~Hv6DUV1E|6g&3g`%nA|8X7Dzk3BkqV zNfDGVFtFx~nG$#)U;r>hL}d(58~EEN+bo90VE|o7k!Y!Qy;2-H?!xNvt+Jj*u-w#{mP`@FFlFBnD-GX#gYR z8WjJsUJ<_k1Lk$Xr>7VE>d$|L>EVDs;(+5fKf^EX@A0p{I^jRQ4fy+i{58IRT!C`} zgfI*dOc^O zvc3$%iU`QA9CBeM`vTJ5l_6Ly6*(djaGVCP3X*HJviH`~3&^e-6jx*3a6Uic`S~LbW5E6W4aOlN1arO`vRo^!x{5w)9&Ybx zg1ghT2j|%N4?tbz7bqaa!35F79_xm-TqSU~Gc=b)efjwdg@!G@!G(q_jdG}sNwTlWi5kVqckH2%mAbzMF67V-)2v#d zO}pWF3cPc`ap$gY*}#4Vdr8-j&K64}5RbuY!V^Nv$E`TnvNVJ=VkNZzYS)X^scIPh~r>%K}Wl)60!^45(Ahfi~|9>0E^vM3<66Ar_D$Z znhv@QqP8G1PDUjFbr%xb`T&iIKcaQ zX~T8m4(VI+sezFPFbDgcve@j!KZ}%;EsLEvCZUi=v@UIk8(pdxt?Ic=uY|~AGlA?Q zn!v!wiqWGL24V~xuqq?r1Kg1Ce1uRczJbnKe-~Hxy_L+jQ&MOiJL>|G! z9=#~gyn4OT=s)TK;3WwcHMWeq$P@9IqRk?*BwvQx9h7p0NCNq+B5fOTN=V701YK2I zO(Q8`+gAJgG=rINmR=H!)tRU&XTuJw3kaJiMcM+;kI*dbjL4li2mWVKM+IqZvvwGIC$T7X zEGIx@LkbCzPGCCtKQFnNAlW^~21-sFgJi_}(*yq9zx_A(v!9>v^y%;MFTef`WFw@F zu*inQ8+e$YYC=imVnP$|l>=CfyvJx+)_oK#>N?iu8f?-dhI{2EWgQ)k&o4 zCQ1L_r7SiWnzFrPu!u)yiwPF(sSHiLT;3}c>uY+$go@S}H|gf;>Y~>c`b@iJVG&mq z)PL?sgZ#QD_ehbRj#49%E4j@6_rQIRg(g5KQ81ayg^841Nt zQV6-Dx9ryI((1U^3v6+shtwX7YyVwIFGV<6=MTQj^d)8L7q_6DGrIbWY3K~8UEm}& zGeje;P+bOdrH*kYRuH?Jovaiz?zgqtYA>s8+!+i;q*v6XE}o|RD}eS?M74Ub3O<;9 z-)3J#bVqb0R;u{-X+M|6i**8W7p^E8C9#KDn~{{xhB{NMeOe|AWhvqx^@t23+X{c_udjEc+CH;JB2puJ zlp0HRfnKFn(dycvR}`lvc4=m-euh=KyjAhd#E895maF$Vj4wIcOPz2q55)IFYlIZCJQ5NU(VBvP{~lO}AMu}a3~c;&+o zAyYz(0da~T9T3VCiV5mPT{LSshCrAjV_6fDD$bV~FL}fDy5aHVg3INK%kdU>JujCN=!_QSJgvz7x*e4vS%OcwTP#R6A7B}vxhs3alrHAGoIHOPs@Vm^VJIPIDw$pHUWohS?sEYga<)n zb%5YxhhN@6c>_hlbU0wmjHk{|bYR6>&`&=jTVH?TVM@Pe@xt;A6$Sn^IITFe7idHjafPH-(5H9-(Q) zcDdjp1=r#(GgT~WLX-vTxZ!lj7V_9BwM0B~R|JV&)t582SuiBU{p}Gi$0L6GDI*Cm zCUYxgQ6x2$Fy#c~1sQ}jD{@L8*uoWB)WD9XFYybm#`mWXB!r+DSvNlitRRPfmRbh; zU8b*gZW?j{0eiEgWl`2;C>OOhi&h+pxazq{D2>=5)n(G+12_(~q0eAYu-u_x7=REl zur-auq2|MfU;`Ud2D%EB89YQ&8!{t7&E=Id7>sEM7>2>{U1S(Sl!Bas4-D<+=FQ)= zZ37}%p#Z6uA-S_QINJS+8Im>xj!2R%E52Z>OI~GZu!x#!mm?5Ii$!2I)Rbda>yl(! zp?UKGc|kD+LmTk`QLdS@DJRU=3zqo>hvSGiOc;VY>D2}llrsjlVS#MP8dD!rZ8;&O z4U!ciz_vPBB9|sukwmdc_WUFtU`R$t8PVf4mb77!4Ph9-np;t=0#?RwnDDcA@9>Kc zA8>mZ5Lq!q2D2jP6^Foh^Kgr|@7_SR4S#t2j8C6FQ5CTCoK$BP%IIR|TXR>O=ye$=?%Hl@&4MZ=f+*O7vywSso^ZPl#(uwk{lb^ zobSQ0uXd2y&lZDLwR_TOXH?lXdw@RNaBuoC(^C{Lp1j5t>z5axo zs>ify7k{)vr)+iY=V5Lzoq0Fxo;49myc5DfGF^W7gurbGkwH1wAQY z;9z?cQCuavAO=q6vU4*CgD60R5LGd-yB@dAp4rWpDFua3dv$#0rD(JaebrpM$f~{% zrM98hnS>e8WHpAGld&O+xt>QN*@ws_MnkK^Oeg?3J0iaues!e0N;J^@|G%jqGh-wI zNpe?gu($w!W|MmCP4;(_ysIH#3v2{859}uI9oXI1UkEc)x`A9LOjfcQUJ5y^YrMI+ zEv-Cdcj1$ZVY^|3*PY2-YS`@Vo^DR~_WK{PCX2@U`TYa#A8s+fe~a%w{(#>FxmSMVsIi_Kvp0LK{@)8i!lxn!!+7rX5NsAZDazweyb9MYXs@O?)=*BW2t;;2mhL|m?{(j+W;i5Iqp48si=!4)8qNTeF z)$=M#gEwd98mZ8=)Kz4o%1B}hyAVv|V2(&TlSZ~B^I;q?hKLvl+qPOw++f;WK)v6_ zWcOLF6bWfH4K+M#^7DZGE)wz_WpZS7jaMmLoV}ArUuC%NGC+5+irSE}R5Bf#AiueP zwc=O_Ql0qZF2vWv!y;%aKOL1tLdgKuZa}O+WXDhDg!9W2K7aa%Au4X~4!F5JVu}&u zOO!%UfyaADmRAc0?sbmU71j&Hia1cZ$hUDAaXK6^Uo&J?R6AySI8Y#$+ANmszAvMC zZ40bA1n5Xd0!G$=?6i~0iZ9}8&#TWWNZAEhy@7?=Sy#mJuLtr3qw2M&9NCxa-0GM{ z2ba!at+nouJ|ndvaXpT)qkWd|K6qS7`Rf$979iPkSW8dJU*KF(QQUO_5gMMlA)1T( z8(odnTx~>UvBYiJN$$vJMdU*D(<+wTwhbHtl&$7B{GBax1DP;QbH)%Dr!j(b1!TrD z0J?36%*g8%FXv}`o)^ewcfghsLI@CHqy!`Zgk9j}XBEd_w6^H;2C}}P2=8kSa$rQZ zxNglC=(d59MZHnrUEBz>83vf56M&rL0IEbo%V*CZk3m83nM@Hm6Jw-c#3ym04s5<* zu>;Z@t7|V1ic?MOKFoPT5{2Z1pb59ZvBX(1Xhskt-0Ag<<@^K=3m6%v+Z)`Tj(B-` z!r%Ufzrpk43x4zQGroO3t#XC z*##OF4N)7*&U$z#VH5^fpu7TkLX-(X7a*)g0Mh|1 z34+g{5tzQZ!~1Xk3}4^<6?nbi)A#=metmw#XPS_29soq}CJ+vg6cE*@4$6uYvv1ZS zLW;KA;N1D#_u69Z=HTQ47uDtxmP(C-Bf~B0y9$rWGN}BgM|+WYJgmo1v?LIFPIK31 ztM;?__OI;MdFcC!LM0`<%AtN`PViZ+aU@c$7fKWySISF^^eeSNX5D>Wg=)gZldNsl z)n)NjuR|pmYNHpFJM5>j$El-`QBSUGX7;Xs!p=}pmdr|DMg*0=K7qTLKMx>3?JM7uPz!WUSV>OWui5svbR{M$c)9&m?>12u)NIN>rAAM_Uk7 zHwB~`co`*Mz&~G#F8FZ4qEGA?(LXb3WFoY8I);cO$;o_18zAILWeyymlEBgEu|`EF zAeS?XeczaOzy;s3QKW!K6HoynD{I#yu1YIM+Fl^aITr zb}E&S!AxCD>%M%>Tu375RTP$YS_-VP49hUpGkaCbYz`^Q7#9T3V#uW_k_^a(;}G!f zbijxA4|x0jEl#&LSXJ=D^Ampm=`$|Z8K5Jeu{LMW{?HdkXZFq`zj#ZQtHM+kUgRYx zRtO>){)mLCV)?b1so)=r%C{+!c{X{zT5f!9guCA9ls?s)i zB{Aid8xbnLIy z6Ov?XTgJRGHXV?Oz#$nnaajoscJ6`i86slFT8`fR2Rgptvb`qSFD#;{hB4mb~Ju8)gQA28@}(qPFydH6N5_ zNLsK_G_2&7+S1$$HPMnkLbXVhl40eG_~P6x@2qGW5OG(8{Ujo$t*BdjP#0p-HUCl- z;w^`Hr1PIYfzo=5d)GBqeF-|j0c>;0FEO#3=nLN%nIG*9qIznF!KRJ9K1lY zFDm+PFvSR>WW{$jb#=`R;Motymu7h=DCrJvh~)E(=tFv;lbqhv1D=KpB%Kcl!thUz8D6Cd{mc zlc9tmFXo!ijBPPt!4xA{#jx&Vm_2J&&B?WHn-9dLMkhep#k`4H?xGKp0tk`KX^>Mw z(gg9G+o*(*qBYDZ<1`NV@ct|OtDk>^4{z=;u(=IluspdK2oDeUc>m@t1`c?7e!&kv ze8%I`GuCAVE92&Pz}?Lqrs;qUf|qs1<$A&S@fmsEaDTkTG#&B0ELhWu1JmBg4a@fn zJYYhE%i$fCsb&uEhq1eYT{^T>_XoASc2@>d=oGW&ZlNw#qdYlGp`r;5gBYq-tQ31b?#borOOt%3_`7mO*#9*o$7Z$AVeiY?^R4! zzezwnD|-bwYQCWE1Q8Xd*I{V;VV&%j@q66`^<9p*2(NCqt$sln?$%NA9`9BE)=v09 zF7_-LtSuu{YleB>IA~W>^r!(LY7LUl3PN$UvHx?sWp{bjs4AJYIzowBq(YrJR+nX4 zmeyrGyR$^UY=YafkKJuoht25h#JdcwFLCrG2EKQ}P{~^*s!M;?U3cQk%|;QZdGswp z%*O`esM3yR)qO|0d!zLWynhjKR$<=G8QvB}74cTxm--V24OhdQVM?_=_Z4wjpDQCR z1Q^;Mx?gA;W*NT7ZNB_IUo#i7>S~m;)8hKqDYD_n~;SjnQ<1_a2$pmM@|hqtl6U#+tVJE|a?=-~_mur>J7+ zcV8@7et2`hGWvY(?rbP{MQvG}W!bM)Y0w&QF1d^TOeZaw+2&#-HbwsgAbMV&g0Q9y zpVtkt2wu($K0LqR-SZi5zJ7zd_xHHHdyDb-2KVnTn3LjsU2$0w)@*|DWnQq%GbCq7 zR;-%|=ZG0m6l3JV=|g137y^bEAqcKvASegq+z_F`7xwnv+Ibb@0hd8=Nh|*8cfZBq zd%?{q;`VpH!C&MRfB9E`fuFy<$J^6A?vEevxBu{a{HMSBHNOA$8Ou6j7$2QE73q}sM5I-D&X~Hm$)sbvMdKU$Zkv^Zi9fe}N*I1Gp(c#WH}CdHPqtFP=W&eZ_BKt#WRU9g^Qc`9|G zCLN(fUG!9lJKQ;Iq#|$7BE0%2h+Q^0xBJQ6>|6*jj+^9iFIHhA?}uI}*`4CTh}fA= zxC+?%A)F9)A!yVgn4yl!?4nh2T5-Le@pS$Kp%sVQ8yrp(!VpYPTow=FJtEn{4BQ;p z<*e+gi#}A+ho~8xjkH3#VNDC>?TX{^gg<(C09M71dO_w4LbMEMujzu=S-B0(e1aOs zqg8B3yBe8l{kva{b-Aj2WP#UbS-ORob_JRmy@~J>^?Qw%EQ56IC^!w;`s#Gb|5-mbD#Bgd_)03!?Xwt$i#&nxE38IM1F z#Bx2mvpk#7I}wF${x?%*6=~zK98CB4COL6bg>RX&<)W zw#9ghPUH~nobq{*ilgDvVhg?qWSWq-j6sYjds$XIKRx37`~ytA^oZx@C;a;Q zg5PWjAHV+r-#wo3W8M(>2*rdf5$onOguEgKi%C??F5G1(1@9ZO(fPQYhrvlqELx)= zQ9OkzcCYz>UrJPo+TB+6qFIa{w5AoQWNzo^?sI_#@);Gdv0%{|5(GIW08_Ot(i2G~I6oVV5HO1 zgH=?%EfSd{G!q~jo}RwPpZw~N@xT7h|0CYszQOwo{(SQlVA+~7$BnX-M) zviTe<)XxhZ9l{;{I<>~Vp4GkZOtRE^Qlu?+%2HH(wo>}tP?p4^F8FEviix7QW@Pt$ zj+UY~xad}>MhEVW)-Fm$wTm$HrkA?kM?0h;?Go{PA+6@@u5qcQU+?yL*>^|$0gJ$52Vb&iWx(Qx_QiEL-3y7`xCf>WsOVvM*N zP@K9$w&N=|dgy{2TKv~5N`dnKFXyg^+Q{n!rY7{$F7&&4u3ZEs;`h3fmb8;&u-B6+ zf`Pb3Jk+1lDb3jpD5dVPzsCsFD&*0tx)U)JPqt{wjwt6={kaw0pIQEUF)=p*heiDf zA_oNad6o;s+0A>BvkR}a&Ud@1VHM_-nFsq^#}?A$p9ZQawn!ffJt&Z!Lq@kO!VDMI zYrl+lTzwboS7&tfF5)Iw{RzSrxe%C{D%FE}4}bL%X*HKTgq71E2e=F zBH?&A;B-6TGAC@w;=&Lnq(a=|;N%poB0wTSB0-S-4ugt`xCkedcA*A+R6w2Wsl6?Q zZbF?%MV;oX`|#IRf75Geht!cwEJTnlrb9Y%qH|8n>H4empj6w77);g=TFTmxA5HO0M`bb*Iz=G2ylXjx^t;qB7GCR&r8M^gC*wR&RRe3a`M7} zn+mju1en}iX-hrk01Xjw7%&V0LokJNPFIKsLL6{B-r#UJBE-?NP7*Q%ISaPU7VgDq z1QJ9a3>JJ;8LkCFmjxvNdsFDmJ*gmT@*Nc0vq^*)tkGu2swBz&`xsseHS3M7squd+ z4M<8z*%kxhjvG2Fe-7X+rQg7lmTkR;=4v1t06WU|rYd=Jx_OvWo^v@m0#A5DZ_M z1WDC~*^ark+-f_gB9C};_YPmb|A2S*4;aXr;xR^mY`A@Uy2Dp*-Xn&H^WzzhpPuk| ze!-RmV;B&4z-c<+I3B5aBok z#M1=cRuEQmbEb?>&(B~HoIeq6-oC}#cV8i|8$NyhgmqqQh)RS*JU|4vIUR7ky+O(w zF3)G^vS9+_J{~aL-eS6mm@j91db#5C`3wedKMAg@B5#h-!cy^L%m>KO&vK;}w!PD{ z&>^%8AIZQ_>`^_LqGLhT3xDkv-`Wt~b>rxYN*`XcXJWwzcx515a=2QDNchsoOpf>~ zO>c4f8jd*>Ax~LcDt1GE?UwO(PWKsUtUUs~&(^ECWz`{8?>&@M{{R-dRHQ42z zZ-e4KUZG^I7I(|5{6cMYBB;=Lnu=9xW+q;Z+6%U?-5cfiR(I~QM+>1w3Sj4?FAaZy z)(pSm24QNBesEbF`M{rgb^a?HS&!N!bff0h^eCE$0j_pNU4%4E@IDW>i+$)3`mA+% zS>C7c1$wPGJpB8nvixa|!De>hI-D#FT#VE);Bbk?|Hs zS9ktO`9|fZk=ZuP&Xs^rh*{*KVj&Yo*t;koO%_KL*+mJ0TpD~|j#|#V)J)6r^VGTm zdy&pQ*H0_LT07BCMLh2sZ?1@KXtzM}rBcl!cegDmT-0p+2P+(v>I0IB*NldnjuDy# zPxFRtPRQpOkIRO;^BEtW-(kAF108R17Y97Vgg<_Bbmtyn)qtmE!;j|~k1s1W0WR~5 zv@F=>D?~O-HtFYj?Wyu<1C0mK`K9`W73JVMtELx}cyN{RI{@kN%5 zEoW@=)uM`WLQq8nV>%uYZ;y!Mh%ihTrU`Mf+G)!P;tTT_3DL<_fulL{x%!5xxR=l& z(MwG*#QNQeW@L|TU>_hU`{2%nIYtl?NHUS^Kvs(p+wjGnRf`|c7U%~it~tbQmeE96 z3bwOi%WYA^?6CsD9GJ_7d0w%mj3nlsh6caonp%#u$9D$5%gR0LGZP_O4s#Q&mF#iL zy{8%_R*M#G@iGmCO*^quIeW{@C?HoxOIujh@ZL)ED(6Wc_Fl#QjDdTxUzcZ2Z75g< zJRc|diccXzwwgmt~*eEy8IU2!~)I7|^^3ZhL06MiM|#V_6C%tGr)?5?f*a ztl|LgNs+9ugpm5B_>iUWh{`juM-nEnnOI1VD$(`VMUB1#%aQ~T_BPW zB5=GJku_kEvk69!Y}w_s4OJM%od`3yeHYpLVsE7a!=3miPzXpO*m5?p9RbtffYb44 zpT9eM6c}3VL2tQ58Z{x9;@g5I)z+aanNj0nPNh`G7BPR zqwzQfA!){z6CfKVS+LOovMG*igYQ)diz*2yrx0 zB#j6%f`mL zT4N>@`*@5h(ng0GmgdkVCt*}N8yPA%On z`>+2Lzx{{b;jjP0KY?k02H=teS545#>L|^&Bw7nK3WVr178J2Kj5@lD@zWCPOa0c_ zMaO6n95B;}hZod7vWeF^%y|cPsApvn%+}|V-K6CAFxxC3mmW9iVe3V{s4dOz)Y zR}yoIYp#UHhJ!J@G^-+W?8C@vf1i=+b!$MjI*0la~IcA`&z%Jx=;Y4XcU1(C-(k=neU$nGgVDwjT-dG z!VtN+nmrPVI+C&a+%@|mH-M{f((dMRYjSsZ&r}s~UaYsFPV}*x zm2qA2wmOYF3MOiNk93)9?50il{G-Mid2dbLD+D&v2ovo{Ly9(!Q{=Y4fp&&JfHc;* zcPNCuY|DNlNtI}Dn;#3>?;>@UB9;ErlL2hc?cbd=0TGcecEL6NsS*NNU3B6Ct6j7o zzv`YDjLjxt9U-jJ2fAf2y^4pVZr%tj+40t&P(ge6_gx5qg*Hl^z_ZNu2n~xDib$iJ z6@5$swcPsL#|&1=On>{i_`uI1Gv*q}8#y5@3j#6@(+zHq6Hdp`$jqtLo5G5EgmiLZ z+i%zo)L&emJ8-3T*mtJ2=HxEsZnv%{j|Ssc;Q`c>UV^_96+>}ON~ zalpXAbFIzAoj^!LNRh#J5i&%4I$!beRjvTV`yB5vM?q zZ8lMW5;SFmYzu6k%v&+nC7s#BoQpWRK7`_)Dl*!ueFoCRIEsecW#-QPT_o&tn!$tl+}{62QbO|V)F6hcXV2NolyO-vczk-q z<@t;#0ty9*Vu$MxB5n>RoQ_9VR>Ls;>xz_Y2po#K+Kb(R10GIC9EOOe>jmFEKjX5l z2ns|IWMnJ?ERun=BBl+Hj7&CERiS!0NS9OGXIjHCP8BO%@cbk`Fy^Wfq%KqD^>U*+ zXH~mg)#fT>+t2!$qr1zuplrzL45S2#5gber9)<~FoDfILYL9`Dw$+B%iz^!AfN7i% zI3g!Oc4v=f)NE!Z8^pyB5ZV6Cm3HFUtOd_2*@IzJ;_pDf=K_L&6*D4EDYpjd>kDSI9nz~hL><{Atk z+PGBIT!|$o*(VYdiXg|_i%iiR`vT8ii{2zCZcexO>Z_mO?b~-4r^$*0Uo->;VjOXM zbBAd<;_`CE?A&Vj>#wHO<+AyXSckzf(0nLPn zXh`#v5GiAz0L_F0F-B%=V603~84$A(7G_!Ttz;Z;@4>=&nlBi1z`7);Y?$*3RbUD? zI1CSXc>fmh%@N;y{0<*~{0LbTgA#^x!NbEXZhrQF&*zBWpD)nM1=DfFn`6L&6V7KJ zng;xTY`uA}B*}5*d(7M;A~Ww&Yj<;b6eT@8;C=sZ@-TRqA)tXqBa$M!t82MSW=6QX z+5BPVOJtEigH5UGR#s$$hb`y)4o-&&hk3)65;)9I8ngW{)EcxePHU0Z#5w-GxI?+U<%~13ALTHT(RhEXmw{8cP6}47fU)sfCTF<9CbZ)3@7uisQt`CD$ zLFXk8xzR22YgqKT%SdmUIeY1ro>M&l&Pk;seY<~nP>~wSP)Hi;o|L;#K^0^2sZgs7 z8i|DV!SUTGaKrc8#U6}9Ve+M#c4VCnOHb5mLH*pWe;*s5DgtR6Oo)zoxwOlE+XW`n z%u&b??a_xt&_3XofhkMgpeyxLjhc%bjReFsqN(1)tUC%sXi9fR7}fpt+U}f*1P!`d zrq|^Plihba$DCrH4O|Dzx*s%vIytIltV?x^)jYyFIHN&$(C(qSG~l+h=Bh})QCQoM ze~--VADBE+p=bSqh6U*mK{3W1G>83=RaxV0Ks|@P3ypPf(R=Qm7fNlpBx=n%`p^fc zu^kHJVOgt280hZr9_t{3;CB>A*qI@|CpJP2LhwO=cAV#}>vJSfdCd(X6fH=aTeL@m zCO~%L79DSjJ_c%NI_v->eDmDs;Ba+Zrm7RyY_QgrZRnzfHtZM$13HxXb^4;EW#~!& zX1gP#iG4;Sogzdd8eOyJwv&BN73obJ_Ri5g%(EkV$3}UW9aMLb=-$cDGNR#v50^ey zlq0i?z_Wbsx03yM%EI8hu5Dy1Tha(>51;_XI`0+glOI)>kIzK?CfTi0)|Zb z(UC+w;)i+v;%%r^1#9tZ!~X8o9j(L+ZZz;`$M~%=8XOb zyL?af9yNooff3b|JeSJ_&tE|K+UQUPscwRFu*MgJ<?;@NMBxMWrJa z_qN;}M?_xJOtQx#vv%hrRNL~`0}_YWHunEZ_EJE1F)TLQv?vRxHsTCRr>_{pliDIm zoysR_%VrW6wrV#ok(TBNhR;N+KvMkLNHec+>y7KZO^zgHCj+o#um*eg@q&4Y$jFE> zBOoGYr$esKprCm3_6>MiP!zaaH)sk2IU$%KC1^vqh7hd2iQ1wcNClZ)oROaq5RpWY zviApKXHw1^LLdYcKr$rT!nl6Fmc4DyZ^>p{V2=e-k8{i=0U_7|QpD#~H4-D3a48Os zw&9Vh3m=dXOT{CNy2iMG%N2#rMv9pNqElGR#a$pJU^^G&%Z79~BBg@o*NhU6Sdl%J za)N}2v?a{5E$ua&5a$`^l-m88;q?;*aEw4Ca20Nm89-Dj$sr&xBYTWNb@VPZx}Xvl zLqx7i>B$W^l?3beWQ`n1Ib$o?@cGQ37@)@)r@K2~+ko?{)gggfOrRP9!;B6od8|OT zIEQ7y>3G8Nc#psbtZPA0;Bbt1yuSx6!1J$P@XPZv-hBRokMDlK>HdV21c%Me{57fT z>1`HJ?Dn>rR>bF~O-lA%z?}>j=5Yql#(-5|g7F>VB3rHk+Gu?c62OY0lY5KJ=#qqS zO^SnN{CKYj_>5nE{e-9Mge?bLMX^p1B`#2oShv;14bdnE!IreF>agQh1vG~}>EKir zH$DzRs80DB&g^k(-+Mr|Pajd|JQuY>wbEYLq7q;svCTul7-qY6YZlDM{&lmly8~iFcDXPr-oKq z6ZeHZoa7Ohn((0Zq7i+rK!fZ-2;YhOny12J!iZa_-7eZl!Jv5=Fz?ljsa@30(!|nj z*U+5B)HCFL0WQ8@6adO<#+MPkC^Yz66m3J`1&K;EiOLX>vVDZI0Gri6w z>(ajoo(AVEjrEw+Z_0Zg>E;ft^oM>^`n@O}6+ejhYn0XP2~&53VKwUXrGo~ZkLTO^cF$OH2hntG!wrgNO&DrTw;&vd2r%5n6 zf{+^G6D=hfZnK%3;x1}BV7P8@FhnJFSFTr%s5Am%kyk?P$wrpMUg?~lbYCR&nS+ilMHtddR z2!=mf2;KWLIJ0ydw6Z%^N9A92tJ#9E;=|jo5gTIIi%a*(uvC#)md`~RL9$rWAsM6z zfdi(a73r7jioZU6McOv3+Xf-V^m2y82olAzC7i&xFk=mbq=w6Kn*gW)p_mIMYe6no zeA`~}w4Sl1WKDqDvubF_fcwJ%Zyz4;csgNXwk&x^m63>J&USxcw;dRuJA+8nG_xs@;od7 z>K=yM&ug!owy@`h@TrG(U@H_Fo}R>C*3xl~HP3~CX^J==jyN9gFfT{Pds+c| z?aZ+SZgJIiLEf?r|TQg@72L%veWrC+)Mns$u{BE@L^a-K@TW(>W-#TBgH*uy50NKGmVSa3!~5x7~BG$@!j#FHTI+9V=KmR z_yOIe<_hZy$?LH*KEzhOS#tK_cD*JACaAJQ)E!GrcpyDjnT7$cyF%?5pq?K(y1NuN zSh|ih-!0H-$RHnZ<GKOl@9TgFpk$engsfcw1Y5qD24=Ab58y z=pa03IM%_b5M1CvK9CKKV4^JtLA&(Y@88;BjTqs2h00Eyev4$qP4ol*gE*)Cz4HCA zrQ+{vOV_gVz+=DQ&q?*P^bBNbnZef8*M_Tpdc`0hsThBC7l>!Dib~h@*ZYA73_tbz zqABN_f`3@tu(U-(ZzOeaKG1-V>+xEu9nVV@_vQ;B8#kWkQ!h73&6 z2Jn$%TWrR5ss}?Q$7sE{1QcRi1h{U%%eDdA6XfXy#1Tq_!!qMA2izYc-aedgm;+9C zNAP^W>F$X8<2xK5-vXas@a31kBd=e;@z}2cTYQ`?dIU?HpbErE8m8S)5LTBLQUq)u zSR_F{Z-7Tao!2Y!r%!l)n(@E>^lx~}6Aq8>@#DiCe*e>Z{Q8HV@b$|RE|*v2HDODe zCEIb2p;-<`Pz=~)Ln=muvN=OA;c32D#8jNHNk*I^mcxR>>4<5bo49y%Ua1gD@#oBi z!iK+>HYg?UFY24ia%35#0e}fLtrsn=f3S!=ivx;BqiiA0Mr2Y&&IP%siMnMncVr-Q zx@L1|vx^Ckd|}cAiWP}#3oP=?mF)^#CF3H3Rn=z>XyV?`Xy4KVjvbLn9@E1f`B%ke zgB!bKCy!MJwKRt-IW3^S55usC)OO#)XEIdDGozzsIG>vsyAILR99~*cTuQB8t8QZn z9my^tL%qiBncKU&2(5e+)9=`^mjM)P>lv5V7eF_hPBZSNh(ibnQcS4N(Pl(0oJvmE z%A$x65Jg{15A+>Bqgc`Ma*0eB5{Ya8&xB11zP&tQO;cRHQ8wg~vDtX|#J~ zTR9bU>V^31E9~BLrMPt{^R#!-CV@1HR3#*tU$#=?BsrY2<$gJ9{?GP%bXe zVec(u$b}aOoAWDh7Y8aOtWs=2R*7`7nJbiientwCxyPo)3AxyNoM|=(-h8xWyV=Q_ zShd#O?7czGxfKhd7BkfPM)H}?u+(hGaU5D5w-J!N|6uW%%4*^;6~#eK1a$)Q6 z?DNPA2*Bxd#M?J_c$^<0GU0hmxTF;f#l&}rOTf!?M#cqSzkCHU@c4rf6i!hvE8)u= zA;qXPg#jt-5xN12+{D23EMf1{dJWuZoaAm+8f_v~*f5Cyd4NKKMlrip{g$W8Zp5-@ z_lAO9cz|9}5qcqHITGh{kIXfiTGoWaD{ash|v-%X9Yv9nkN zJ(6v=ThU%k4+k#|hX5B5W&i=c`4V&ZF-vQo> z^3WTIN~88Qp#+BWy*h7M8ydaV1$FTnsP})Pqg{q&`p{wRheaS1g6C=n!+^^WZALKC zEQ-x3RP5ZSu4lFAOFJvHUE@}p491P!!k)T0u+Dm$!@lkl$ai7^ea7i-Wu_i)5(d6k zT`V^O5c}^#uO<4u>xQN<^k5onH&q?UWY>4c`5FE$+$>f%NShrrRfh%nNHM6I5ANR! znW?eH@ielU3sAyMw6%&6c5p-1;gOPAW8J97%9KG&UJ1)>CM5Mb*_>R;K!Zk)fwD+c zptR^*?7r(twzQuIkJ>K1PV(y`L_^=*d&J<+Gz($y3few_hA3~x&I;Xb!gLV1>mYR4 zJMGILPGzs%)Tx5EalmlFfDGdKIGE{1pA9kJa30Wlqn&VaXK0evHbK101RkZ~t0GKN7$ z+h>MdZQQP<*Hz;jYBZ(Q>so4k+U60V{Td>B-j(~k&>|IF_%VxJ?-3N}&1qTt{el^7JnEJe&fB0U@KRgmGN;=ESqDeIe?}(P+b*qB1kC!D-KIU4iQ=cB9S45JQ9jv=;hOV zz!E3S(+uW-ylwdW`71vC{S(&L3s`4Rw9lEfxWPyvB!jyiP0d9tLyWGwV|ACb;0h&2 zc!zqbNM&}4`#k_<^_s3uGmu@f0G z1FzQ&`T2}oKH>TGisKv+4l{6Au(5*a0Vf=6sOU-{Wd>&j?cDW(b6N4UU2&F##J2dI zNCC}|Qot~A$RV1TM)QV}Go-ALvU#x+5#5mt$%uimu;PG%i4_GIFV_p!>jn1&ObSC< zB6x1&2554;OtjfcUGmZ`I8X<~Qt4PE9oRw5ol9+qyU(K5!MRxVIok8B+%b;<#mzos zwZ=3f7jfsmy3&hUAd_XFX3MP1$)t};&=BpJ*b=CS4V_R>@`|()Br$TzmZx5e2QLdk_y%SG%O&OCuN zV$;;{@*J!BUYi3aICVftAk2ti!C?;2$k62o$=UAzXfX}Zhjog+P-IuzvI?Xml$;<= z70Ch=1ZXLsvLa9hF(J-JAkJ9V6(z4&FD9^{FhMm#$lfCyEbDIy5yXUq0!T(GiWR`D zz>EVzh$vF9rq#0O*fL9*36UdWoIy%HfJsKsfC7CiSA0*VOf(G?dhRAYT_(qZ^!L zh~W4K!o6C67AJf#^@X9VWH&`l>hRxdLoYunL-)9wH%kBN*m^JF}-}?8L znpZZsY^&3lRU4kS5{n8P|E1M6uYK`}J&sVEiPtimF$!aQiOr+1z`w)hJ{mL6h*4a) zKy_hWhcHsfDm8WM28%yrT=z(%0o{s@q#oV%)m^B1qbk5|kI)L@D!{Dndb=H^-&jLzxF5W3S=-Mlc5g6x-mAt0=#Jly%ps6jkdl zy*X)4J`92mUm}QLZ_Uw`59?4$N9<8=p1q!}PW>^ry)~Eqofhh~LlfK#SU?>Fv@|Te zwJr^E>i2VNZf_Rq-VGLXs+W%EiT3lUE}XSSc?~fTZE@msiM}t_;ouqA05o)7wa(_A zBVBKCJ1aVE>ekiX23?Bg{GxgfMWggoqCk%d5f^RTByacvCl_=vV6g4ClGU3v-&b3| z+Livq6)nnb$g{&YqvHvc_RFWb}NGFO|y%^2#kP?06hi>7|XJtq>QKQ1=lrWJ14yU`VBK>+#MGj z?(T7Xe23ru;a~7CKfcGG=U?z2>o@%RWyUd1j;Iw(AwWaGS`s1{$1ouapv4v~G);!A zhag}=LByo5I0RrzE4I9WSh3{|@ib#i8GrlR-|^-Bdpv#oiXRRS`0?QpPe1;ErZ+kC_D!8~1r}(0nVoh*>XtpXvYA;%vaEzIe6v)?Y z=f)9_S*g8n7Oy$lLXX>U)ZSO-xGBYO{6YX1bDj%KsGUWS8u5esJEq1iNbj$yQmks! z2kAf<4N@r6K90gqLK zGE}n-*IJhNUSMSZWSgsKz1F&mKOBF(QBSi8Wz&Z1wjr|P^?lJ|^N?n(Zh5XX15nhW z=(vdxM%R#6XEcg|6cLJ}I})L`e7L}z$>rr4*LB4dCmin{@%HqHySMjPrU{>4FZgo4 zAm;)q^FI{mwY*!82&sk?b46;4(Ak;dYt+xM)vtp?iwm#key7)H7@dN&6Gimoc<#BK zLo6M)c!OKY(0;JVH!e{fa+1LcF5OLMj;D?qw`Z3c!AAVPs@ciXkhR)sUvj~JCSSY~ zw^~d@nt3U@Ny*9vI}vS}7}{jGNO1#_v}I!vX<4%xI)zSlJw%UqXcQ-}5w)Rq9qU>I zK__tG_8vk2;vpjG0+I)CjL7RNe);x-$DDBpg4gtlz;ko&w?RIY)&qrL{d&!Y_Z4uT zn^J%jsXAvA+1k8Jveh^gr%q;aaz`!}uTz)*S_F~0&=XuqwMO6wEm}!j$P8#Uq&|nx z?n(G_Y1zC()+-HnI(LV1pa}vKsfjvKVc1+nW?+iQIfG)r;qHXvqh0^0Bz#-HA(Y7+ z!4$zXAs}L!j~4p~1@i>v;Dp5k=H-OLvLH?q;xY|`d~UsDJAbQKvv>wN8wsEZwyC=v zTa_%@W~b~+MINHK>QYb$$k~iSF-|xw2RuC7VcRym;?+^tj4WcNA)iZ}&o9U+V_72J z+&|zhJ|b;|%n6tS8XQ3wMfLFAY?CCpSi}fTmD&v{(;q6=e z?)?wQX~i!;{|$Lj%=bTnUsn_an-u~Gkr1X}l-Gvlb`wC5RtvH({CGGs*+mJYgTPRA zn2C0ZiV%=6VD38vs*_Y)RMpO2?L9_~ovATV{T`|gec1`c`G#`E12wJZp8IvI%R6#X zZi^^$!KeSZj54@~`|hU3Sefy%&NFUMSOm;uVpay5xn+n)#vmkfeti?!S7laVMQGvN zac@0P1&3g}LBDRHMRuuEfWvMHXdkgOCpEF|0`*woE`Qshh5oR21p4Uk=kN31X%Ghp zbt-_3adg)^Glv~rtX@O%Ax{WlH&5TqyIcf4Qqt-(WV3U1V~F-R2XDE{K#qjMiP^(v zE%yDcX1VeOtPXVDnnSNWrcj(pq20ha4MN2Ro>h;ha#27v19Y>f?T4&?A9i~Gpl6k8 z$sSAs7H3#RHf0bja5D}z(>M)tkUC)~%@_%wG+KoAywQQw zfF6Y?3Mr+a4z`@P=l1nogsM6?sdv=f7=3AZs!X-1m7 z`q|m)`!Ro{5~=FXqyeArf3e^+HAa6gkF|VsL6a6~*ViHy?0k)GP>aDGWHtBQwLb$I z0nHT_+qhYVRj&X4%b@7-Map%{`26h^OG#i+@Y@F*rx_pLJm9iseEEFFC8a)8sly== z&}IsX!VwyRzkmf11TaFruAzD@^v1DIgQQKFY%wGSg$4P1MpVYaz(FU_1TY1J7z`7}6C@`DBFuBZ z=4N>kAc!yQr6A=E#D+0H-5n9<$uTX2mzOjC^Ur_Ar(ZuA&Qc0AZ2(0(aHK26Itp!2 zvz4wm>3Cj$;g95n_B~U}2qu4fnR&}mYuXRyIt;}yAgI`sv7xT2pfNu~hw)m=w)dAL zIrBulvnd`^AfAhfS|CYXy6A37Px}tGEi9y>O=!ILEsKO};YVYx1$v$`)n!L@T?TNl zm1iPf_y#+8xcCb@E}+wdv~Kw8%QJrc`W44ugSm%~?=jz>z^8j0=7=>H1Qi4|RXD*= z$wky+y4l>6n`UGZXf$_oAwduZiMG6PYXA#!F4#)KRuXc~hGC>3FIfRDf*^)F%X!5$ zXI$5UbS>DZKp40xW6cp;5fC$`VL1;=1p7Qz++Y~q z(2y6*R-~wY9}(m(4pc;&BP5xF;r!XIM^4$Dgn*FefQhNt5HfOFaTP(nCd6>HB1wT% z5^~-klEA@o!%8;Q@RkzNmc02l^*_0)(o!l)TW%B;6fG@dPAV3YfS?5{2%79VRw%Jh zY)j8V1w1h}W+b<{@mAV1d6k0A@pmCa|7XI&<{HQnK)fJ};F=XlZOMO>gd;0>o-j=_ zDA<`$m5?KD%(I9&qm9yQ9!mq1c!hy&kzOf?(Tr&giq@$QaW4iAqkWslp>}n;xI)V zLIjH7vTZ1^Msp?r8d1&Mj9}=!C4zGVF8R_*I>*g7mP%MWD zKfZm$KmGP6BrW*gfB8>*`t}XamlfNkpd`gaz~uqBJ4MVP;_2%%&X+4V1{(rw35U}i zWb&k?B*`Y8IS~f}`QHwBpHJd|ZYTkK**bR@c|h^1rQ8cjgjxyMZcs|{N%sz^h=x7NjATVnS35p6?w zZMb+Pi$lxtozu|n8r(aLhXwwSKiy80!cBSGPN^F0!~_l9 z)l=(V8#BiyEHrnmIP$o36Jc|l4GZBG8KAYtYeX3Iu}lAygBY^xi0$%+0Sl}A)rYaF*4?PLg0hp&Os32wge3>63^)h4vKkMkk@-{GG>e8l|^_c(u= z@a-3%=!Q4}6BVEcas+rGOd2qY;q70Qv6X^p%U~%GEfCI#V)y*ZS`akj&HV}I^NPZ@ z_}4Atbp`(O^BI4*Wc==Qhj)j7kLx3Tdh-!K{rDBnU%o)rgs1Y{oKWQMXGtqi#pOh{ zm{x^`(1s$GGhL9b2}wMEH3Yo57sM%o)@=}#`$-rWkt1fd-n^b65$a2(c}$*+?7p?+jlijRV*=lMIHloQln>5&()5z!QoJ&ZS`8 z&WIr7YzO;t|9}r~PS8-0q-D=Wqk%*{V%7p-MUo9`E_h8QJih|Cxg zICFDJZPLeqTdYXE_lizN1eEIT^BRr!s_UKuYs;KEw@fGyQZqU@t&TXfIzgEc;*5ff z6~T-R5jY%X#N{4D_h2#6-4u^NCX_%CTEb$XN4X%mH=ASU~H>k2~4D5hwAj95)G`Lc^A!W@lM zlTyMQ0-_RL)w2Kn#V!cHc-LbsAY8+`(n&y=Q}6!D6Dot_u!9k z3EiHMMcRd7;GR{_+Rrtcwf1>z{pA)<;WTOS7$cuyHgY4ywzMlK`*Wz?r%f2_WJc~{ zyVet`^jPX$bPZZvQHCX-vO?r$>0Z^Pjk+|>&b8%q;}-QUH&KmFkh;b9@2G3;-Y%u= zmf!ZrN${ZviA#SOzFI==L4F3QNe*iI5k<6g+FV*-e(q{2ZEKy0Y z=<#xUQei*$RIR@Z)#Tta9y6cK2vb5)AZ-Pa99<{&{wP|krdFFZ?z$_c!Q6!Jgg{2U zap7At&?yF#s$j$tO%Odw;#bNybpiE!#{FjQhk^tc2y0coiM7$^3{ zl|5I@u?bPxQBsEG%Yji?nj2fZXci`0l(S(WSWHQ5g{vJ-uL=0eb3)t%p#Td993K|^ z=5&C(f53LNoLiIl*h9s&>8J-oRitWZw`t1}ZT+I<$rDcq!3HBBM$&|m3P6U5%1OZD ze;!#85ZU#?dXq6SI8KVz5;pjO@2aD!@?lp2vbESLZ-yIQ7AOd7QsiPo!N3cAI&7FW zv1}cp*oyI_0?D@EU6?(;Hsf%Z@$lvzhtm=BG6Nyv+siBd@?U?$U;gWFcs*aiY|A9o z0_JE4d_gaAYoW+K=$8Q$O zuAw3JdNyozF%tR@lb&N!^NzKq43jzaYNlTk0uZWZxKS>&hbq&J^N~k2PF2JCy~sXb z>x1!sw7e&X@($gm6hYGhXhz9bKoX!XGMNaMQm{qBYf6|_!TZAz$9Tl)?mcL}$5t$U zp=A5n*1Xt4%y1rESu{@($HRg(B{PMq-+MD7m{$nfmMxP-3bvfFmW(7BAoAfP5D_dJ zND?+ClyX4E1mOVT30YTM^9G`ft43@RAPAso1}4Lga|%!?C?SKiH@#YE3?3;!q%D^j zgZjA2umS|E+y(?Hw`!)r=~^>nboAd+Umj~Ggh*9`Pj)coT&WEe0a@OhE0qhdWxz?SRAVM3IGoC-t=^7VoXZ^%4h zmKjH4OdMPoq~H+kc@=4Ivz^!39fLL}3Z6M8&5?-#fgS4L+}*KE>VtuR!WQpgi=x<6 zjtsvict8Mo5e|xN(FPQ#yNFZ^BwL;yaX?hY-5l}u!&?+BI6r^I_3{KD8;Y0-gc*?| zCL(Yt&@Ca8AWr}VYQwZ)4bsM>5QL$ z{*0&dD`qOVi+7lL0Yq_{?fgw^!n)b;gAkf~H25%qRCmxPLpgT|U}LwCww&#%x>wyh z*T(|hAt-xf=uKW&Yi4C|#E+`j`UYqMGwGjMT)a^;Abr^+?#!zL)atJ50~uRdw#ECP z4jv86+F3`!vR)Sq#bf0s}KWGGoi=>Sa&>CE6n7DCtP_Mf!vclkQ z-}$V)Xcg*MuX=9Tf@R1=A7=jQNUb_q(IL;eE&Xq>tj+BuHH+3Ws=&TX{r*1{H(AA* zVGuW0DpQU1(dJ;V=Q&i*7!j01i)iYsD($Y?0g)|ZbL;vLO$3pbIavADI7wkxC13Z=y z<*dVEiv9E1_ab#EN7|O%<3Jv&yG6Q=&2(GD)9$S3xwd;`bsfI7`glO6;pW$3aD6tn zEqY|gen3DS-9AD_E0fb~seWyE7xl4Y7-@|ep?(%O#|-= zrv)1bSqjQ>!ixxyGwyQ2DF82@e?_|d7N^I1WVYD3jDirwhff0nTf`8_eqZGx&|@@(w>eyu;VWXZ-#*?~z`A zL^?lXySyS@voDAPG8C7xfuy*g)31-??3n@PY;geUU?Iu4mV!%Bgi=t}%?IJ#wM4}3 ztQ1IrEp;pA6w(GM)zLvj7EworH!e9_6iY6R=49dtbO%L4gR;F#Y9vAv1laEhDqvQK z#GXGntR~5s&w(RAiiv}xpzX6tr0gA^P;#krovMpycGj zlRoIG5gA21Q<6;JK*KhCw`k47z;EZE*ETq7Vv72{(OrU}#hq za}C@59-ma{e*|K~$?CKq9Pc381?MD~t{E{T023CIbAf^_#_M1zB=S9XYu3(1vmp>@8R%W6KHUdckW>cqkhl-+#d4X-3&5%uxJg+_lx9V($)V5k$?|27!>zVMBlf1}!sK zj|iGTiJ<}DDd0W?#MKNLDWyh6s`Cl}SeB#Lvt9*oY&A6zL->do8Ot)^u*~3KzrQY3 zIL7*^dS5RY>v~0AR~)8j)l)8JR!JMS%M~SW*jB;B(S<@5?@j#s^o z1gZD++K48mbx|AUDp z2a;Q6Jj7t6XSYaLBX7iff<lrC+9z#iu62~?2 zQf0u2af?DDNEiR?Q13dR&HKW>NT+dFjfX}_sY`pM;G#Rhwq;OcOoxDX@89D6hu`Az z_y5BG_|t#K)Abo|mJ_1KRB{34*+`A>d0TM2|K`L8a)3L-NR~@;;13IX9x|<+Y(ok} ze>U5FuET)DNh;&JnzS^>zSig(<=t{U*39<$KK7oWx?;Q75CiE@+e~6-s?_hZ-gg=8 zq~9+QtGK4ctBt**OOETj)?Mj37&4NUCP?39KVuZZ?_I;4{s&AgE~yd(Y?l)Odqzfz z09ihKaJRKB@Ji37ug{#%I21-#9ea5mJ8=R;YA-?knI~z>#2o=?T#(l#z9j$m&<$u! zU+>cHaqi>agAr5oMi57hWz^ndGz#6s4RT#rXTGxT_O_W(*^v#^2`!C;TWJ7l(OZ_& z?e|bIp=cGx*XOm$xa)Yh3O@_=Jo`EvuzOc_ndB;^VF{E5@#at$YFz-7YQ7!rDIHuB ziWbqSEG-hNy41yIHS7k|&Km0T0r9$m+jXr%*xYKc79a853`Iv~f{EzFX+e!dq2Jjq zM5`>mi-UV??GUX{Xz1l>cP6ws*07>8L$iD*AgTXbR6Ig@r~$mti{ueNDlX>hW3>7* z6z_plJ)d3~LIEO*m<6()k+y(&CM>5Ja#5_=BVn z6`yZNz(#N%>)KIv#Jls3hWVB+b&Qv`+J`DfBxQc^Ou zoDD*k1=s5pX}e;c0^U8`U>4UacsG{+1w`W_8D4i8*M0hg!)t6NEaIIY<1{XUs_c)bSozsk-J*jQZm4oDCmw~ zs>>0x34sL&lPP#r5;SLvY~X@5Cv52q90Bh=^>+cF74Og1c!34tHQ&@S3hjrJy)cZY>3A6KvOv#c^E)f@|KemE?od z*f4fX0W&eCJmbr0!u=FM1z41@idw2AM-&7sbHp+qaC$gkd023jg3nK9l$RI85|C7E zS-Gu1Dp)w0+L43N2J4I@tj%lK`xhG;Bl!c zPqgf4CZiPa_hLm;{uMz{%hxoAZ*6#`Ey+SKdI6MB6qaR~6F`QOx23uI0-+2d4{F6J zyDNwsnP4w|^2W<&Vm*}LG2~2BHq+Wqeieu>or&n562UC zgf_8@a2)4HF0LSLYsNn86L3*PiU`vT4FGAv2EjRHq)l;u4EX1te#B3|{SiMuJ>k#G z!Op}|n$MpDAUR_@UyN>GfO7@~ zY46f0xNXrzlRQs|#K>zzVPGR0ip#np3#iysj%=))m*3p~SeqzsHXs-{RrzI}~2yVuE3_2LNUPB&2( zERjEz72UsgL#Z#LYEIg?z(dQWHE&lL^QCF;iXUCf!xuk9BcL~!HyPVCFRVFa_4~y= zwg|8gQ+q#3#ir=c?xS^){BJ^-o14$?Mv-iDEOi==wngDUj;PIdTT*ko2klJr+PL8}qve4k zw`Y)iU{_rxZK=dH{)rmF%5L%CPAecfuD3^&*wa>_v+T|txHE!$X`B4r&J(*E!s{2m zFT=3FQYZpNKj%vm=`^9GihTy{mIQKze9iMVhlz^^!2WEBIfRQ0POCwLN|w3F5n1fcgg+(n*%YymzfaUHUG|eb9A(P|v z1GlIVh>0UN5iFSezN_vI|NiU3Fc$>JqBj?7eLsX?19zO9@zOa}T zyMv;ZhU;Y)!PFQPKv0VABv`|dyE(TqgTxck(7?RHw3FTF`(4nb03gH+TdB38peIcWvbB( z9(mP8yA?y-1)QV`E;JC4f-Szhmt~LWt7o;k+fvovODv73(#jIq#{t~N`oW_|L4EPS zZ7yj<$r^jaff1(&jwf(nggHWG1CxKe2=>fe92cJOjtNV6G1bB4ikh083GE5 zD+7rF4v3ht*YZr5DGW7wH_7SH=k{)shCbE1(bfag5K6XR?BXVuc|^XG?vCZ%hL7r5 z>vcO1i$GGV`(;qfDSh8QbTNYN=!shEo?4^3y1g3z?7bO=o_BozyV_dB<`cJ6HtKok z(#(PSodTZRu+yo9>|}*n_jiM!HZ!P;ikK1WOk?l}0>#bE8yHxU4tMxuq zhv?r*HLg^NMu_pxpC!Ahd0h0ox}iXgh~-=xO^sssJZ{^JW#w(EH%DR0d9g5YPSH|&)hG+zssbr zB%w;_l|kq}h*)-efpIRUoxUh_P6BJ7ZQf%2vXTjpOgxG9Tq^snm8_?+`qHj-7%7pe zjcU;GlY|;5joRm{&5Ek~-URHSMTA1x|LoAt@#~flg~2%^Yzg;=JKViF;M-R4`ErH^ z!gXD7nob}w(LbgGp3@Vi(*eho8nL8DsSo0X77gNrGVEg;%Rp$Z{Smh)1nidl^xb!7 zvsCz;vBv&TBYt>4sRJcwAPH8&49t+AHPNg;xTJ&ILRvN@sbfR5qIim{U|jvHLpC6X zHrV`9GSYcN_%`DdC!9cddsy(p`?q*0U-0G21)|y<6=l#TH`pWBC>Cvaik|bRP%2hr zazL045D6%0g652}W+W*MJ3S*{4n3hB(h(IpsLYyMv;GoSwP;1IH)Ir=+ZIsFQ}lvI zOr3v!!r|cvUV>wca!1fR+Osz1sbsvS4XI>Ihln@F86V%h$NP`(@%Zj7PWSf^Vtjsj z!QX!Vg#Y;;f5!j*>(BV|d`8v?ga{xQeld$Ttkf_vH2Qt&a=YRx>*8(alG6TNRM$!H zC7^Z$JT=U(wn0^W5snTU9dm?zV7Ehwv_r3}CJpDr4S$aT+0p@IgS(0v7|q;No(0== zn_VTSK15S@0aOu2srXcUzqA)EKy`xDr9Ao4QCuaaVok9hP+$c|pcG%(in!`lKrA?( zPMA+KKD_^cKm6wR`1tk*P$qo+@(nMqFF3D)lxwb<0Gj-;5Ino1ujI^$pQ^sMQk>?|X zfCDie=Of;q?(y;CN8G=Ai*Nag|M>OqcnJ)=yjV`BM1SFL9l_KV2gQ|^>Un0=a&tFv zMHJhDzq%cr3f_ms=(%O;*iu7}4spB~6kg-K&A|qEY@ekK1K>qWsrkD`5(x;duu@Ec ztv{+3PE|-CL_{m5v>4_Uqcgw<;O#lG-y5_$A;}%e8am#1x71?4-=sTix{}k?jgC*_ z@mUmVXJ=r-6c>bP#xx&5F(3*cr9g`y<%F_cP_~TAdPSCk!@OXb7vyZtk&34^M}1el z)@MNoot;3m$D&h58dcJO37>388wrr;PS?V%h%0UNWp00B^`XCZCmkD^;f&-;CIA2+ z07*naR1gBvbg(QzDbQp;r>q&rBjNx4;RpQocfZG`j4+=d6j6{7LIlwSRl@ap#n-2= zh(vh9Z!jGe%q6tEHO-2R3z#?X%QFsT!Mx0Pb2@@Tz-x?ncJarm8JgiZIACJ?_aKZ( zA~GpfGCXITfGG)ROW4jAtk(-z1R(|pn{eWAIM~mbXH4@1Va6pFyrhJATOn!15+l;_ z2&Ea6>|RN0!u7h@a}^?{!x3-Z62J>Set3sJ{PqKW^V2&BFZkut6P_+B?%uw`@$nAV zbHWk8e8(Wlc-azC4hZ2MpaWhn2``c$G&QuE3`63!;9}lWR(6e`o$W$9j#qaEHv*3| z$!2|av}jX97j(BghGky$v%(9c;(7BGy-c2)xyAr0RxCpcAlaW^zZX@I{k_o|4R;eW zZk^-WvNrX`akB$AH$)u|5flDY>EK+ig{AC$vot6Yv|(@uY`nT#oqBfF*f59-=L%Wm z2KLFV^XnpeaNWAgSor4WQ(vMA^+kTC;B+^&(0ISxl8|~d$_N|QA#ar(t6k#; zm>Dr}!@z=SgQxpCLI=hlg_i4zF^k=o$tHlT2;H8K4J}Ra+(szXfzz&~FYX+<){w!z zXjGLpR34Wjw^(Izb+gu7SLw8eJvd6+eY79?cq3lnC)6EZ!Rzvl*&9M_ZgSLG_2w3_ zTDH}NZ2fE)l>ZWf$ERUk+Rad436pgI@7C&Y6U zNqUws*WtdpM_;*Ncd0hE%@(4&MR@&_DgsZlp46|c zxmf0KZeLIUBVYK)7j!bJ*@0K)wZX4iB$=Q}AOWD{{k$BSlveo7$x@#zuYefWTH{`ftv^E1Bw<`;N4 z-{XB!e182EKD_-UK0bWL<@xtmwuCSM6fJ|Cg4eMkjtL|mh}l9YXMx6m!|{lR*ROH^ z@EUPEKop3>h!~=YaC5frJ_H*Wi$A}#2|pBsKpuf64M~dP@GVZSzz_&ha)Ls6VrO%{ zR`f0iIVYr)k+ltj%!TKsgKkg*Vu);x|Lo$NI^k|1kf{nbPSv%-)n(YIBT9{op)Lp! zX;co>g|~XUN*!rVz7WpW+REcdVr17qwr8Ta;HW*5xsv?SCdFC;FxmXY&+nZffVrZ1 z`zE`&y8WE-*Z6WFu55D{iqynzCDO-Z60OGyo>gy8M?=+*NaKKQh{*E|*R)}sGiFJ6 z$N_hG#d!=ELPTJrb!B&*afsM*f@rquu3L-{^&UGPQbs`(Ld=4V6lpZKuw;9N#9_on z8HhmAgv;lja6ra4fATdBrwM=m{Ue?p7sN4QOMv)-Ac=yzWjLe_{q1^ol)kt_(mzKn zVrHT)-?dvB?eabwHn}VexvLk^Kc_p~a*Ya9MFw~EeEa=v#7tc@i+{&8+QJ?tMkmn@ zfZMs4zEElU;NSW7+>#q=jjC02*dcNi9g&8bE+KcH32777P{|(8=BO{vz9KwxF)5Lh zv4Ec;yj!64+3ba2sg*Kn1{=dMx0RT>W0t_6I5}~OF^!XvLpfszgb)W@WN6U`9ZLA6 z^WQZ0t$r*0N?gqy4>w34o8ZWFG6BGX-n`fluhHYMu*TtU8 zEJ$0f&qxLAKI?L^LgMO*OkS@GN5pXijS(CpC=LkY2#ygvOc>md5<eW34HGWU0cnj`1^D=Q#c%%Y|A~hr_!s}`zs8%dzryABKO)>Rp5}y{ zHm9tH7Ne~uIAAB4%u#DpEGSpOOA)7JVMw-T4|DL?CpAwm1GF^}tEyrs1V(8tS`NjL z4;PoVS?)*?k$}5lL?ngGGnP3aGULc2Qc~}IZI&yNuwHM->jKFeHaTHP8%9#lCPs3V zgcueKlyQIm3fCp#bk100L5K;7R^;OYa6aKW6V?PM50GJiPy(2cqe4i`_#wU!DtX!- zHNs9Rfj?{W7dmAZC#kgBxr^Tv^*ONk+#Q?Mk=YkRN{E3FMg?wHJU;#aJpP1u{~Evk z)!*RX{^NfHMMVq|vu3Q>dW8_9eHQ{8dBBo4i!5Nvq*i7`V&t5RfZ+nv@;;=)a96>X zpo<06-8{U^8I*p8Fedv2d=m!yH6S$%xAx}Lo$o-aIm@#-R|2T@;9YySBdb+9Ko_e* zJ`XRm*e@38c)7gY&pfCT|0ooZJHdm}7ovlj#FkO#qPdH;B`GfDMm`a4qUo|lt-FJbox`{K;6F&|z~ z7a@4-b#t5P_J)H}A4=<=#03N<0;T$2Nhdfd^nf~}f%5@f??InAmqsvE_q6RZ}ot$&{-{k=-8h<3AwP-dLI=r8n0K|~h& z^RoiCWy7Oh!5N4+ARZV)0M28;#sb~|&YPWoJR&I&hocMbwThyCjtpYE+|IN^*u`s< z^U|niEpD=$8=;%S_MJ@eCI*&DBQ@Vtx7=s7@H3J+L)AK8G1EFbRwlxo>LtIds(r{X4;iv{y#i&_pqB3AZ%? zA>!eD#Bey^?d#Wgc>M~eyE702E|(eKeg8-NhrjIaiRt7E+)jHDr2i-L5gnkozY z;?QGP0jmvR;8`TnY)BAaidQUJ%`^5xow+Uv(TfqN4O*J0fNG1~F9wQGBm_3>OX7+f zBo6hU4{R=vlrvZ|B3o|HLV^?&x-Ll9XJETw)de{U#&N{khj)1Y{uj8ryT_Z?Z^0qr z@_fbZdc%)De8BTfk#V-h01Y8pVCX79&J2-=EXkKf17ai`4iOkK2G6rnF$c*o448(& zhg|0LNZAS!4zZE}po|q8KI@8W0tQK7iAduEI5Ng)2kns~-W-m2dphCGaED_K&;@w6 z5Lg4|ID&+cgILrC1<;nOOK;7F;5Ir$@e0^5EfYc5oeBz&h-+-fhsO<_Ewz|%s%vrU zpt+a|K9JF6$(6%1(9Wo-zN}JMgA@WI#GxMknr#%p%udbVmV?A4tAtvC+~q*ER9CIV zdF4(NB%Js;RLCai(bRo~t`!5ivj$2L9I<~!?2T$f7$zHZjt30W5fn_3UX+~73JC(? zU`W_7Ag2u}o7=;v4g+);F^-ehwLZL}mbIJ9Fso+rT5c%Ug#{1F$^QF z^Ngp<4cnINd{Uz?48)km5f}sJERgGr1i~Q(#2A5b!zC+jmkT%q9Pb|xM$7iolGjR% z0Kq_lB*3TV3x<@j`QR!>qm4x8629x5=-GHy}&Ulz!? zNsiDgOP;2ncBEJ5=I{5xB|}U5LhyxinxMNT9i2mi%AfBXdcCAxch9}*H8Umw26D7Pkb&M7&$J z>|BJ^aoQ>M-DO7IQah-TW329N7h1^@Oxg)>Lz7RCDh~b}D-@Sp9Lm0Mr%;oJA|B*jW0=b@Em)SVbXfc%8eu}08QI=D!Ixdw=d@ur5MU=DXuT)7 z_I9X)y5!3r?HrI?+&V-c7EhqC#yF(_Ap7%~Ya~dyXTjuR2OFpa<$50lKbJ|{4I1c0 zezXfJsz56z7w{FgwAA}X#h(Qofk8;Ss0JYUJ(RKuhHZ%#TFOTykU4$HMT9Cggk^4d z%e^d%Lhw9w@w{}~;KrzJc&P+ML>4lkE*sS*kYF4bSOtIb{vCe(*T2HM`&W2#IOEgP z6@T}4|A3GG{0Y~zL75PS(OkLZb%+f@5$(JX%Jw~bW^Ns+iQ+)P76M|#A{BwA1kD>n z$=qmh03qO(Gd|reIGqQ?F=7aW2_wFK{S~hN$&8Qx{1N~B{RapG!!SWZM3P){0CRC1 zaU-sY$HEL0aX6gtaQ_N-_xA{4G?BD)5ei;cS}kirdfL{VI}9$qFV1}~_jN%sI@Xev zOk|zmXJnVh-VJ31898VB9`(yi%2bU7OtPh9vHVytLt`z);2ETV^+gQ(_| zNkmcr_>FMV<>_Ycm&+L`U96lr$n-@tAnn>y>D)&}Am0pSFRcM z-HB>gg^qYof&r*={8M%FmidvO2Q)SOwq24&SW`&1U=RKQ6i1oVC=_DqV!sM9mD>XR zWt7#=2zJ$Tp0!f9+I)<2!iYEg@40i2<5F40K9R_WEV9ze>Os&BliTq0b^H zG-r?yLKp!av80TF1Hw395XAwCb%{vZ6`!9LY@dFEl@fmOXMc)c|Mh=?w?Dkc_s^ek zy(~y7$UOR4X!k?#TCI?Ukj$__taVOY?>J_AO^vnWOBC-xnUFC$Y1aNHZss75%gPX} z>w;k%?D``+W7c&BC&r1QEvarRmO|rH0>#mmJxi*j*JW97TdsJ%J!08z$dYj!zk=W= z#4uvWCP2)$8wQziHw}1ucfuGVp3XNc8{uvmFogh)7NIb2E0)cujb-tX)vgl_y@*Tp z;HPS|X@okJ4nD0d=8g(|fq2(rs{)w>L^p)mlLx2{2x_yggair!!xWJ&Pxz1j?%&}r z|MqVY5ODwIJw8AF7LU3?P7@LcVPLH5hQl~QG-J&ICg7f2$dv^{G#6`vpASqsssd_` zb6d_g7xNyiycRl;)PZId-_+Xqg}a`*9$jkQaxdfXexxoFsS)d7QJiItP95%<_k+yZ z{=nyKH8Q6YQsvHhTKgZNY8>RAQ38& zLL}8_6XoV2C-&vBC^lV7z)XeMaYuK{lB>uSo%7$f4^04HzpsYW)-P7r@VRD-PNYr{ z@4*gkAoVDm5{=Hi=(o*vxEe^@WGhrDto^*kGQo@RtQa@M#5CR9$@YDyj(X{19$)+w z{tWGfecDAVh-!U4O1Te2>v9vsh@dt%gtR%7FOCBfL@dg-)q!m>yQ=KU->gmGNzAop z*RHl8ijJ{wODuM>3snhwEvBum^5u6w&#!a&&e*W0Me&Qsf^PQ7T*WUh@&42qoC@O- zRQ6rEkDx4i<+?bhYHEa=ukpf=(IKrnCpq>sIFEy zv?Iut?Y&LEWW=iq5*5W!8$efTD=|pfmn_*7HsbCNKd3Sd5E-y!hGGC^1{T2>BF^K8 z@er}B35!YaEDKKA_fXWb4uGmoYbnW&iY{3HlC_5Bu97%H*c#ZJHYC|vW9$xDEg)1s zNQgSzgmyVEJ&S{_I2RubMK1Et1SZD)-5I}l_ZAO#Cu@RJg8E>BtAaLQ+Y)ZehLj0O zfxr{ubina^kMsQ<-oAT-hc~Yg;(*7e3;y`W5BTl3f57j)`vd;@$46{5AjAVwHe``1 zo8nR}yT%^Gxsw=c&D$uL?Y$z4>H*rqlM5 z`1E+erysBQ@Oj1O>wruQVMAJFB@3AM!$PzyqBEE$#9+&mq1G@~s{4gV~L+PL;o79Kt6;bNWdalY2XprhCQE^vY z%{6KmJq=Aw2!&&z8Cl9Vjp`aLL*ne{WAX-;oi0M~ym{m9v_iZ?Czk16ab8h%`o744 z^5IW)sCTGZa_pbI_v{T#=qMz<*z||YzyZT_!0~X#IGqsU1dgF%D^(ipB5;7l0aG{` z(O_G#TxXk>^b2Mj{z= zGM64j2#pR`_iQ1_{@o-OW)vl@4F-b`QWWpKA$jA^xq)eEX6~k@C@uV2f2Rxh) zh>;KjB|mw?+$`21nRCcyOY3gg3T!^M%}Fb>eX zA*TdZAcP6R5f>SO6tHo^9q#e!5V3}2xYdR6@uw>u(u{Bd4q?Q*H}CMoACZ@za3TfY zZutDiCwzYTjO+CZ4#0f5VZJ=!JdDUtT$T-=u7X(t7R@f;5=SSQi%M%l)zp_#NImWZ zLdj0<+~-y2sj|y_FBmT8$G0pqYOyGFp;Si0#nCEmnUR(=Rdd;0M8{qil!a0DA}x1V zFhf$8rlT}0?b?H*wE-Y?nS;R3k=tp9i+}NNx?&eK$C^43P*Kb_^!1l{uhcEz_wwg2 ze_!A9phs`jg1jw(%e$6R^R-{JbKCZ~HtmE*RUA>i2kC3LJvC%6q$@5a?DD+pcff`! zCPy8E%(WR%vT3!tDn<76pP~-YIyexol$#!^EKjLl5UU!^ArvOD*G1BB?QN;siS9I2 z@s@bbx>l+X{Q9R|jv5MC>V=|Ry0u^hq-S=@f>uF<_BeSj%xocDh6SjUnMf})3HL4# zTV&BbU_xbgeJM%j2%`ENWXIKsJJO{nT&U%Iir;4iqgYc{{5$RACt93R-GI3>QmgZ@ z)~iK1UG7W2_{y`@u>D5=QonYyyT8iH=|xo5a#3HA|IfaN|HL5r$%10k*Skn%HBH~XC3+8(+_o+w}n z+_`z1oq?2b-1JLLR5Ffv6j=psct#jVyNVv7vXdV z31POLElIN1A`A|LWBq}^1Gd`@90}`k!-@?Y7^fKV7k~a|_?N%_OT4+ihbG|The!PO zpT5OUKYfB`Teiy~U>qlGs>m7GvVc;?7zq@jQB+95BpB3&KO6Z#PZg7xa6_3O0Z2Jx z$t#w1Lw1pgh+>>35EHh%Axr}}5-yiV$Y!xW52pj}PZJ^u#=sZ?VbhGrey(L-(3gmt z5TGQOw~W9MaXR2|JYpIK1O!9niaGQk3KppjJrh^hc@|}XDfCg#OLM{`UqD&}pQP*p zaCbO{g5#%J7ppI|bIK*R0Xd5;r(Lj}QnH10u!VI3b!R4Z?jnDlGdIeMqAvEecV!jv zp9++12rf0UrPU!V@v`!V49TeI<^Z-pD2r}pHkX!C&EQ3$SP?Mg?75Yt7b6!evCTiC zvFviWM?xx0!X!*18j$pqTX zu{`=B3?O0*JR--0JV)f^g6C~RhGN!)vuqe*ub$4k|YQTHragPKKf$Nx*kcb9x8?x>SjFX>Obk0){N+A zQflIZFJcnCP8V*D_A0cb>NwOM8R|3(ZW|=jdHGI=YwRl}hDxfxGZzP(NQ)ZuI)}6o zADjP@cVaW{M3CKNugkvevzoa&+zWxgDv}ZlQe4lpL-|wZI4uU0nvuNAq3!A{!p{(* z`oX()Sa7X#&k{+kK9?;**W&OmB2-cDGgKf65KSP-Sk#5api1;a6_~Yqy^luKE^nI% z*vQW_>ShjpZfHjBl~@R}ZAi<4G~ck?7Nm8?p(xlX3I;m`)t!f^D?0$ zb3}}Tq3q8i4u>PAX~J+gnz189jMEV@j5y!DvY0-Y`6Oq7 zxci3>(7U&|eETh?)#m`W701&7+qz&FN8GjzkqJ=~q7ouUsAOan9GEeeS+P0_x)V5Q z*AHr$U3(2vD89jCZt&72O6bHvo{L;!jT6Ry%aX^-8mW&!V! zn7PKtwFO@n7gH4O9es}r zP-a3FV@H*SL@v-YdaYBvijY@f^?gOwcLX4G<}CmFOtkB{tC+$~2}S6rFJkAkh~-2( z$F7k#$~+;%7V(u{_agrsFtL1zVHD|?s8q?U_4oQBzRfm*Mfp~m9#wIPXp3a4vm>9C z2Wig!Y~EmqW}^cI?{kW~4i+0s7G@5m;KKjrKJO!wYYaoZma~aM*&}SaleAuYFL;FQ z0nR_WEZ_I>(u6DQk$Kdw0$ZdbL5+UW_4U=jQq6lEv5HXR4?z1mgV{~N&4JhMVV^g= zRR3u=XDUCtziCQGUV4545IHt-HEVT`s}t^uIDucx7JaBAB>(^*07*naRM|u7nYt=U zJ35HRjc4kHXSMEX2IxuvD58A8m-Yc11BU#{uSvm1j9H`i0vWQ3lim{Eyn17O3Nv_& z`1tr4!a#`A3nA%#=NSU;CNz80JusCR>|`;7%58 zu`t=6U1e5j)I_(7f`|}FL(Lr^5=S@j&TU2@FF>@qwWxC+m|`x}7g*+o<5f-yz0`bxZi;4?o}^e)BDU z^X>Qe;nO2F0Wb^@v7tfT3pgr0Bh{?;;ykxEE;Z}2Px??_Fq$}d;~9gcW4O*j%T&oeHcFL-*q;M4Pp=NWif6q^JH18aw`fe(;s#t#U@1BM|W#%Y(8 zti(=C&^p-Y#p^YXW3bF_^6ZkDd#Z{U2vaceMz9T)WntEAUc;g;Fc<$kFNo0wWm_CA z`%e;p>_dl)I8Go*Sl1PKTQLp+OUl@`WLfgAB+UqZZ*2%6c%G{*rZdRzU0e8-Wn0A( zvnd}9{il^mP;yy477U_-B;rc}20~e~_(IViS6Ku}l4k)%N2_|qvq*gq!QEfBw9J-s zsU=W1CKcfxs zr8BD4hbRYouVN22R$!Kdv~AdQvAp(Z$Vkh2vcZrLIkuiKxLRM6Ag2}ExD?3rGi(QF~xuZ3_-$G zGMEPw(NI91H%#k>>5lPm81eT09llq=ho63Q2Nxq{8=4Dc3?t+IbOP(&wb z;OvX`!#%*j4^J0-f?%F!%mQ4OgzN2wAcW&_z%6CW>x}0`v0y;bep&002m+(vP>V`v zg>d$(yPQX|Q(>1zR*?7Qb}f*3x9^r-qwh*#&21RgaNynyl}00QT^N$IY|I|R-xpv~ zmy&%(xi`)3q$@edQl5EzhBbYe1KYdXi?g88H#*fk6Ym!JbqL>OtMzJZ)s~aZ+K!A} zHazX7iTj2gZLqm}t=yFK)!W?{uEnWNgh3k4vAGPjYj~(--uh575P?D|RM9PIsV;J< z%iVsdTy73~v^q{r{K19R;)C-dxG2}6Dk`3<2ovGMZG|)kZxwlvxl(5w2)g zRODOv`?h8jN4RPGZlpO}N5r4S7FU&ehbET(Yb14ojydZJiK@u{br%MwO_0)I!kHOK zq>6Csf~XD_@~#1``F|bqPeO;ICbwl3F$pq)yDhlp8@DXGB8t^6E}<{4D= z6%$acbNfdBWhlkZMZ1@4wupOt+k&7hx3R$BCpaNlI2_Xkm(N|zIyW(|JA?z8@xUpaCv;fk3T-*H{bpdKm7EB5CXC&hS8}W zDI=wfO$k{UF_~i>A>xu|ENR0ezHm|jd?AUX*zycSr{_pUq>RLld_=JKt%QUX*XIl7 z>kVn$AZbI4z+nHuWNHCD?ze3 zjMQ=6LJH)q#$8CTYbO(dk~D027XzYxrW84RPX>XQyQB=ZGQ{h7sd#WzqoOGXmrZvF zagTbVf+t7(0;h>O-)YhBB@mzv3_&%67B9}4TtrX!Qfs)Q^iacs67A2hO7ZZaXAwbH zQicCJBC!QqaVh#XV(|Y)t86=0p z08zs2I%8gMNNF)5N3?lc^7=)5&{sqnC8c9LcqPaec08a^-)ff8avJ0-^Ymryf)u6PGcB!wibH!_O zNs(LWwIe9Tl2hBUhxkPvGhRe8^w0FrEl{+Jck78r!u{OzMNX|FVYL_M79mR6nwQAV z5?|Cg^qR}E2%Zv<#TFzYn8JXRjo@MeI2YE#u;5au9&K)htktDYQ+85}ySKrJWKlx| zg{B#j66V_l+q&R-x!~#P5ot@HdJP-#y^%n>&1Z{D{xbPgo@3y3U|Dx`UCckVTQbWGnQI(0yNa zABOG#pg>>07!F=L2JPxcDTJX6O&c^NNLrEeR`RZpvk4)SW~41um*Oy3ln2C~JsJbD zZdjHZmfID}I@|NgBSl0qmU%<+yzZ1T*5!t*0@8@bPl9+EupX~CO-E!Q%rYYmf@{7Z zfgwC%z1={RFb3fD@rV>Ae3}<*c{VedY5cEC8)I3QKAm}hCcyxU7gUcJIB>v9x%Pgdw6mXUhbu>2+&9NH zRr-yYAEb-VK_9_^KKH(h{pg}Ls!^|t$tnUKtz=s2NOdmCRjOy`-r3v4^7TyQ*7xPk zA#R6S=w<^Qtw-A4skpjx-ANHN<=q0c2)R&t%n)|xvi6iR069>-w@@RpJdd8c*-$o7 zqdlIaiMxw~zKAHjZZC=^@htmpo9g?C#z;i}+|VwT5GA4%)g)VlIOY3WdX>>c;g zD9QUi#@_U%eXT|S<+jLu87&}fSuMW*OGRL$`Xbhd>$15RL!ep>22IST^?lXP#&DpIQi}>m3QS6a!h004A?6o4C zUR7r1)uCUAer4CjOXH)Q@kVfx{CF_?+vyJZh{dq!dAJbRRV~! zi4JQlp;jtWp{p~(F77gSGe73xg^{%pKANzIb`go?eOddEi?kAfEYz;d{p+Vg1v&55 zLTG9wi+lb-`zMN0M_Lz&-uJlHN;u*3%V z^%fc3u(HI-dd`{s)lgsLi0aTS>Z|M2-6v%OCY0+A|yt}gL%I8=9)Qq4?O&d>-T4G;j! zmM{@vU`8xMUoLrsQa>>6@=@Ecw>dCW3dUIwyop|yguC&G*RS5-{&dDLj-W%t780fe zjOI1LoH7`Uc$jcqH$0{lLl|*49dVeB2*(5NUcJKm*RL@J#`Si?4?ljw-~Z-!_@_Vo z0pI`hi0dYxaD-^I3?!x9;pHhTUSM~vN4+St!&{KgDYRlo(P8b&@}LZ*T2Vk%V8NYR zvHXmpqU-Zm8YYEW%im>UR)CFCMH8BOszfBP;~|S9+5NVftDCtN6l&{wal}}A;OlPv z(({q&r2-Mz5L(2$p=W(ai7jSBVC1|(@?s)^yg*WdgcZZ93Gd&2gSW3<G_Js>xv}<8U}2{&}fkcg8sqJH4C?*@%^C`xO<5Ea7ndfQxv-e7SpWAc|l(7^~Vqq;%J{ivP?(mD$6>MA}^Skku*C3iK?=L+`vkgtOWn!0wAiLva7zP_;xpiHRG0s>J1_96jHh+@AlsUYWsB`xNZS98}}hMYAefe0ZC zki0>31F5-t0twi>>t4`1Vuo#ig_;}OIV*xKcLOPo!JG%P5)#dzF#>~PM#c}%j~G7w zh&g7QrUCEn?=fn`h=|K=#%)cQ(+X0>0L5*au{;VMFIPNYo{-WzyuLeQkO&^4DWbt3 zY=}Xzh6RV`ga<_2pMQbV!vmh@6_3vsT%WHH3CKD?(hS`QcdzepIGrJw@$vBy%i|+1 zPgfj<1I~93h&&h%nH;$pqvum?RzNcY49ojV8-|py(Tc~sAsqsAoa~cyCG@Z<^79pw z4tR4s;r`86c-~fg|KT&1+atD3keM;B8`dr3JQ_-H&cO4UaoH3b7+FIdx_bWuAs2;E z?@w+nMWwcI=8ogk2rVWg?43(gQ^B<=?;B5}L+DlKj2Dj5;wRAOp{ndKYK4+Q-9o<4 zZ|zJfJ7@Mw7tx+h)nP%k%i8G_>@DLHUG`YZ)!apN*0@mWve$LDeAjLX-zBtH>lt;~ z$<@u!x#HQM{ULOy)qPB8a~YL7uv;3}KgQhQ`=~A5r4z_%dd9jeV8o^RxLwZbFEV$R~+020;NWP$N`RNu5+1%cW zE>EVTl$89{p0UOy%7yls0lk{N#098h$Ll~_+d!SX(c8&Kd(uH^f~4j5?eMpK##lwF zQN@L7ad}|vkh}Y#UR@+~Iu+|Jnp=K@JKjS<-M>INiaQmlp&A3B>nl=qt8=gNrv3d; zs1K}r7oJe?_tdndghn5;Oun7x$b(YspCoPqL8ZHNU^m=NG&60*8#ev%s zCWygDv(xft}t~ZyZ0p!MWk%wqwHh=e}RG6 zdu6V1Y-K2@Vq&+f3Aen0WrkA1`?vS_=9^#Q-P^D5pZ>|8;ur|O|EGV%?fHU#`rYsG zc@fMsBFkpKp9mox=%K+YR3*DL0Ah2(^BnDF}TYvj+L@$~c=$7#Yi7^ZMZ31eU+AAII@1FgAc z(WVfPm_fq;if4qw5ggBePS{pK(8Y)bAZ*ePFzs0$JV%*@AX7lf0$RmtZE1+jL_qQd zPgZj^6he+>bMLEq|EK2Q6loc&l^9gk=42$PLI_i}dKf$E30lwV5hkRqV{XrXu|YAn zNDcBAUJ#}xXrYb;p?8;l=@y{UZ1t6-r#3f`+>opA=tcju zMLLmM@F+735GHe_UKQK6;IOQoNjcdW6MB&#yU(B-2BKxJtCQ5&MRdVqOCtqHiG<*Q ztbzze2m@}*h95tF#=0zR-lFRDnAfYM;2=(=q;?%~6M=CEj&dz@DsfSlf41aV+10@% zWe;wm{W`F$lJV*q5_H)+T>-qyTJ444#mU}XsvP>7)lsP4f0B!a@C%!26 z|DrQoh!Y!YY@X6S8j)z1DO_a2;bk#jmnz!u%uXfx0tMU+;Ip<2Uc6WiG_p>M;Vk5+ z@@a3}>T;qU$fe+*(3IfWfJoV99uf#j6LQWVGUPYu0I2ESi^wwss})rhAqE#;Fme(^ z9;~(~LYnM7RL+Ih5u!Qf$2cNRBVrs8h5<1~9B8b9q)i1mS=O@Em8nv1EOXoAcR18OQtGlN_~#JK zyQVgK%-R0?oO6wzGTMsb;rADdy?vs zCl@>vLL_S=IAs;jt@YVi%1%aMVhzPpb{lUR17-+__-LT~aTUv2>3Wmdu zieVJoG~+xRKzzU=3Yz?V<_%k(alIsfx4JAMF)9Q5cSJ?-UFaO(+OL=UBzN(3c#+{u z9Sy6P!HoP^1TPlNSLV%GOZ?OZ;mzvUHDTZ*NCRlP$8Vm0#Q*R={xA63-~E7Z{^mc! zS9FK?{%icx!x{hK55EP^5g$H$#O3LNiB1qDOatM_2LyvSAP1WfF4BarUqtDYg>Sd0 z*G`aA&V$iwf334P?TlyAp1al9)nvC)OgT~rGhN)96YbbVa#BR*-Qw6NR$)I^aff^p z%5}3B`SL6b>Px+TvEOGzi*`$W>}HyPMQ-)yD!W{;JiA%D*P+_=)INvEzWB`^1?A6- zOz!??kE5#oj8@w-M+9B$wYy-Voc|(y54?{$*=1#y*+A`GUKlb!yC~CIi`4H(zFaud zo;uNHS^IeqyuRF-JRmQe*;M0c>Up4AMKj5-DDE8mm2_9AimL6|SbER$eC7N?FiOsZ zqk67$5s|P{8_;4Nr6W2J@8@WlTO18n<6Es5_VGKd!>@H_sjum!)4n%slE*7?Go-4v znxuTUwXWY0)U=DR>|)!z34AH&|G5l%Q0VCAjn+W*8a4A``FGhH;zCLWZIxcz$9$Jr zP9aZmM^-X2LNVa<(L>x~1iN?+CVD~l>|#b^2@zlfiblDlZYBW}uLh<{39+Y7Kx77= zCw%$|c)F}etGc<3!P98H=b|7^`26FKm>3v1AyLNN+Xoye;`uU~SkbAyh5l5o^+NY; z6hbN~Lv>D4X1QGAm8l~t_{2f#{1P>in_P@bT?|?gR&yWoS%0XwvBmbAtc}_ft3$Vr z;EJopu`1nAII32ipg7(otF~g-55RI`+aYdhd4zx*BR($+@OVK|#hZD?;qHuI+#hhd zJL4RIk9P?lpBLP&8MjNqdbuHtBXA((H5=}i*fC_bw9l@p7Fecv_T^zJ$|Z8Q1{rEh zC_p%vD$5J}fukchv@Y#;F>CQ?|%4zfBy80Ia$6kC?fgb zAvafwVQ3P!SqOO!hNhW2{uidNJf zo4QlXp;P`8)wJKtTs~_<;g@`~n)y{+?@FC_le&CKg&=h?2~-jNq;0*R`xwlY9_+4$ z;BIv(%6$JU&GByeDab2WH;e<}a6aO6oN&6o!<+Z7@%HWxgJukpv3~ps%jJd-KYqsN z%Zkg!cwPiKOxR*TQgbIW2P9b$I5&Kd=9*24x?U(XYsZ(=SFswL! z>rkT~^j8;Z%VI5m4V_X}3D_XmIAMc1DIy56B%G!r&cleq>4Y_B{P^h;1e4u`!B9gf z&lnQS>6mR$4~+mvh~qiM2ghK=!4dF*2-zmr&>frJfRQ3%2*@Eqo*r!tPd32ZWW_C8#L5r|hmkQH?h#@cUTba8 zpYs*3lHk>F!i0#ouU_FgulW7%zO#XH7GzDxTSC}?!>c>oO#?oy3$EK0x94Y!>Ix^-0b#D| zqaJ&TZg57v;MXQiLZ8}2RoO}frnbvctIbJ+a@V$wLomg1ZjDMot|}Bc<*Hoo-Rwn0 zUE*9y1JySxL~w_s?%c}S=fF$ns#W@ON&dpoRCh^5VJR;h`B5#B~uT zT8Exxaiz2u2-K|Vt|3W7YKn11TfS?f=7d1I?A`vGOo;Vo2agP4UmBxkf3}4{xvk4k zap2gYw)PE}IMS-n1VlOtQX!v+G*=}mn5Mn&)Ks5oxVrIkwgLEv-q{j#eN$3uHSxGfDl8T&guil{{8Qb~pUh64zAX5(r;hqf}v1 zTKk3FH^(nTVtrn>i+F8O@&DIwmixAe0qRfl>rtrB2QCMK)T}~g-PdS!up(dnzRvMc zP>RYe@3{$Bs9VrCXEmcO$lB{I5m;QW@tR`iG@sz&-$3m5V8cKL87eKH<}G$_rZmb` z+`~N*9~L)3&7HxW`?V|=+HE zhEe3sm1&s#43Q1D>t}rZ{sF)Kt6$-pufD?9?|*?qjQIEe_y2=GeD?=DKh605(=#L< zkU0UAaUASiTIGOs%b1sd&FkbOK*9}C88HwJ3P@gXaq(!nB`^&LFo1^#jE5uQct#S2uDN0Yt1C?1Rg)d{7%cuo;1K}XH>4tsCg-#a5w)l$+s1mo zYWL%orAAz-8>0=6&&}EEjv;jyd=W~sN78Lh!J!%n$NRXD&f!{5Umu(onjLvB$|c*g zAGCJC4XrqkdZuiY>cWE2ov+-^iXv{SGY+%a`oLVfdV*dIjkU`MFMT{UQ9P9xHyiwi zN~QB>83O~iC2|`Ja&_O2)H5*HaQ9lyqh44|^=vmUML|jqMlKU`x{IUyRm(uLeU4d8 z7$@FSa2TM62c-2Ao~|p#aKkik72^#dLfGU{LM@6#JgXXNkt`$x&Q#sB;?%LxjTI__ zO%t|l!{L0w@i5`KEco#F2uT^!IDx`oop~&aZ_jk*wzS}uso+PvV_d7@MQY(yViOAD zop-sc-LnX}QV;62)(M`duPb`2@)udX($N-u;ar@OJJ)B$quHNjY3Z{4lE9Ze+_~IP z@yKlmTC#~rTEt^{8{&os>1I;qfaJPJ;GLt5JK87h=0&2Z{(1CEkzFhf??i?ijNaML zcBsn`w(ohUXF+|!s9gHZ%Tfq_Ai09g?OdEAF! zTb`jJcupH~R!B<7Yl5sBQreJ{(MnTZu%-pi^A%aLh0_Hf3?l|&oZh^*CWIq64v5nM z)8UA5JRpRCVLV{q5i!OV#UOV6ZJT0%A^F{0He>(*AOJ~3K~%G7t;=_$v07WVx<)&x zQJpI?VVn-oVSvhJ`R}UGoDhct@+Oe90kUCRt{6wfFTZ|=zxn1H{Nnt8BOmdHZ-2nI z-~BT{5z~0U?V3<xz_CU#3fCB?V&d7Pi0$|jLWts8m(d^~CbI8OqAKubvN+Nb*VO+^ z$LsI*A!s5cEe>1JFDP#<6*mIebK%R`rj092?z|E0no#d46bkkDTiPwMQ~mcOEizHM z#c&ZCl}NA(;^mfKPgDer(xQl*qGU8M1y|BR`v7xCQK=l>4nN-4ay5phrxbZFB}KU3 zlL2V&s3+AI_d@${_u>fdb^vWwQH0Fsq8=L}vYAq~o6TkPXnt+~Ug!%^npRq#wk0PT z1vayrAnLL`)a$PbD|>S>wSKQrC8I)OtdWZY^>Q~8OzgWygoeO{%{A%gee}ZPdX=joFDPyt4*~A@FEnPSOOP8A%6_5X#QJ)ZJKhwR_?m7|6)7T1 zMs#{l4rV|}X>&0~=nNty4qm`q;&LL?gqEufB0x4s5C!LgQ}9O`0fQqnRJo#?16e_o z$r3J@Z9zq1t_%`$O>!{h@l_OwMy#4KKQFi>;LUBp={DhTf50z~0T0Ik57U5;hZT=; z#S;s*Ede|LC108dSuDHQ20g9t&egG9-b4BDZJ}C*oL2C%55eq9Y`0@u1W;8OXUXIG!-D4baDF!uwaR zaXK7uODnGHf*+o*`1Z#i@yAckxU32d6Mzv(45eHl+66hc8-V)It(qMB!-OhbLAs0$ zzYPu5;VyM9j>(dT$pxndzlQwbE@jx>WyN>HQtg_xFO+EDJt~B#9=_rWy)x*t9K!6_ zC#o2-DmdwL1G|hnfNU^?mH|a|h>I@!r_c%rfkMMn!Q8_HSOG07(zamJ4Uq)*rvqL+ zobc|=J-+(tJ$~`_4c?3gT-ODk9xwR)A3x*6=V$!%biwEA0_D+)Z!pGSE@MuH?d2k{ zDDGt{!lgF2H-$P^g{ev#G8fg8Qfqd#plRy@h3mkmN8_|5Qm9U~s`-?LST2Lvib^b0 zhD<)7GAe??l*NM*1~5(`;NAOoc>Bw*5$}%pe0jom-+hPc^95>>X9zQ*Oh#95d>be@ z-9qZZ-iE$D2+=Z>A!thAEC|YVaTgrBqGH)VA({w-9VxCVNNK~CR%9_0S-cI10k}U8 zcz=J!ag0z1ZfnHzh46_oo}OpSk{pMU5gd~~jw5n*^}Ev^G&VF%E{o-YWyyHqCiUS# zK{>kXW`$z܎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

    uW?%tmfx6)NJY$+Clz9g2 zXWVkZei7&lTuuwP0*a|EdbIQhTP)9=^N>#bY#m%V;yKrGY1^khaj0_IqTUrg92X>$ zA6`ALraknGNdcCvsYX3EKpQr;PNoi9Htd!0(e4gP1#jgMf(=?qQ^_c!k`I0zIp&LG zf9_;JQf5D19<*dKK#iP(8bfx^6GwLPXgV+*n@6ccRfSr!42xS}QY`BupcOBlzryXa zyC%?J!NcVUFyZ!Qhy66+cE7`(fF13ib;jdS@$TI{e)g-c@td#S;rMugqPbdqkV{6n za1<{Y#Xwa@6&wJj+Ao0Ug;RO$#dlI5hkMP3!d}dxt8kf9K}S!ysQqip4k~1?S%_l- zCuwIvp@tG>Zh4mLN$~n#zr^!TzlXp6gCF6)Y`?%WVYR>K_#H|}dZGv(A|F&k@ht40HxGYSMK1_E8`3Roj?O1{xS%hjf~26S z8Hr^?J4Zn)nzU{}C9g4^A&7y!lTu0nvNDFrzl;8bZ?86y7la^33vl);kIl?&y<|P(s~qPvIs<5I$TmHY9KoB^The=Sc@g23`F(PtM;Y z`p5*2>@wu^Yc;+{^x=g1KT}5@I>O8b1&;XYZm)I@c#SIDRJNUu$gOVTq>GIr-tWH> zX=}B*K+6VJuW0YBN)wnzG|Z`K@_ueV!-C)kdy&ka?R{U(f+71MbIk=| z*CM?}lxn%;hVN@b5PNiokPaQWI{yDSJ-eGIw6;HknQ$l-%jOQfVq_vfbn8P?tMQ7s z&~R$af{`AebHfNTpj5$FFxfk?qSbVQ4RhVFs};l(R${Dn`TAEVlB_xQofUH{h6GM} zWS5`U**zIG6Uh)`1N)q-%?~8pAh^orY#35EKls_k$YhP2i7a;CUQ=3(xaX+T$O@-0 zh4@VAce>ZE`9zxYoBb>l>&ZB#!{`4LU&}j}AU?~N+HwDiQGw$Ys!^~Jt zm$;K!4m#V?rJ+BGwx}m{h#KrSakbbJBE{+Sh>3xDVtoGjr}z^t`1NnT!@qv{4yV&2 zZufUUU9l|}&{S-fW#5nXIIS-DD`|!|X2_Bnfrxr0GG)vyb)jm`H+NczW7G*f2ifPe z;R4kjr;>Yczl%H$=|fi%t7kmBaJ`R(RbA|*sc%4{OCcp{`LdE4DmX$peCcgVW{Y0% zSe7=l?h8`_H`<)iun_av9QCXSA0u0=M;Ao&wohpp#D)yQ zQZIw6R!nBx4i{S#X{SI5nzOboWEvJ;O&l4d6#KI#bLnj^OqTX@tR~i-M6rY7bUEUp zC+z7J{`}wm3I5{W{4u`zr+>!Z{mZZLAO8Lya9#+)H&{WqY!$V%x`V1EE8Caa$O*uv zt+rWf1#R}Ev1Q=mIy#C%;K*8r*_F^ZpQ03Tp;||GYZ9F1I=08Q!0K`ntq&13UYGWM zmAx)A0XZW2XskQwN*t1x_WnLZA4{zk;}G;TqAE%6Q%eC<3RDCewb&_$=h3%0b&q-K znCUoMgQR0-8mEVF5_wsV7i%`vVsI`E*nP6ziqg_ zlmn%TcJDEmin(kVCsF9SU?(f+-37Pr882Vn;pNA#@cFA(Sa`xW?;r4+@801Xy~p{o zy3GkZO_*oKVcs_tDiuS)Sw3AUec@maY4aSk<%{D^8-A6smV%XAjy*P@ECP`gwJtbb zPBF%3#};Ja;#356Qo}7^5q>qdHEcN!whA?yN5S;kTag$K0_(Mewr}PJIr9L ztK$8#;Qsa3_?K^9!i+!q z^mEi7e1`M8w|M*hE#@7e$Qi&K^aUuP771l)TyZik?(<@(74!Ub7k@n{NExS;2UsE) zu3P(cH9dofx2vOayTc=8W3omDZ1I6Mm0?KM!P_7J03ZNKL_t)jF*N4h^fDY?fg?i-P2Y%kqe2RWLmV^8qJTJQ!-d@D5xG z)@{S3t{`e*6q5}=z3KNj72@QEG90br-P_=!6%H#as0s=d?75&wTRw?YEVV}3wU&Ml zp#l?6wy-_{m>~kJ=BTfQp*w;~%dUU<><)kQ`=8;X7YD5C8Nc}YJN(Pfe~yP`!|mNG zYm7?E@+`AWwOfAL%u~Ay;)0&6F>ODaZ5se0k>twe%fQhgayE{R=mHQal1cY-cOi|VBYU= z`|KHxRq^KQZ}I-^J#P00FlJO~&C5I$+}+MN%sVWb;^DGltELjSd)o_`cmuc%fH@6p zIn<7bYJ}4QF=eC`%S>||^3rk&qSQB1aGjnLj z^6vQf>*x*AE;k!ZPC5+I)EYB>+O{U=7me86P^VMZWopmj3xbN{|K0gAAmXiQq7O{J zGY%X5&p;aBGLINeO^Y$TYA~VKgJgR0JoL|^W50wY2GRpuMN{?@a#pG}1m`qcT4T&= z?>lwSnIu=Eh~*b+mtb(9n$_^6Db~S69+b0GugN*lq-o&VD4oBad0iuWQm+uzjV?es zW>e;cUtXT~NGyb?vwK3jrNc!&F@W->G2`g3Xg-Dn>daX zT>yp@t1?iPdWPCS|Di4-8Z-TR?+~2v}r z3X(9REx&BQ$SsYhqDAMF-5ydDwKf`$`qI`(3&dc~s7~s`3G^Yff9evhFN#HhJ2s-E zvxP6mP#E2sNkFaIma*LWOST{MCW1*6lL%%3)=jbKhE;dii1E0rSS}0Xd?V}ADLEwiALOTf4V! z<~=svWB>96{_HRQ0)P7Fe~xFbZoy~57himVU;g^nc=Prh>egzGWm$0%!DXwUX$Mdf zFV6EGhub^s_cu+b&XZ{s#RhkF4p+fMO_16g77UdMA}y0$Y7=l4G(=oQX+$Ugvsgfr zVwwoDHf+8qLAhWhLS=S=OeBN8pvcI`*SvPc&^)uLlNxfJ@&f^(2DhP>h&FWY_U7kR0W08LdA#Q zNt{JCfSu?*Uaje{qMqyIcI}^H+HJ{8QXN{5`(<`W-OW5TMi5T%6)cpKo_L8ogpTf}7AGCPM2Wf6QVX+1hO&E!0f zy}M6cL@YfD(r+7;zQ_r2w?z`T?OG{}Jq$n$4`1BKBjd8MixtL2UX9;%h^C&K+|P*?xlnCJs9jLt5sXe@v*(e> zB3P)OQDMR%bRv=cTdnTi#hAtH=V{>}{0`5ZIi11OiEP7?w+_!;r=~ga)kKgyiX6Rua^1LNgP33lMq;`FOVW~rF~y+R>`J7mr!yd-#KEt z2nQ9gpLf(_yJ9&_C@N3wW!bc=tw$#}VY&fVD9nd02GTTR@fyp?6*1>BA)N1p1hx0) zK>-=#RXA;jd!6bAkkV!!+-M8R444Rw{VYlEU+!n~-!bTJ{k%{^nkN;4V4UZP^`D!G z93;=xxW_kYGE{k@UO|h)iaB>$z87tGovQD_sNY$`nJ8&DFq)ySDJ4=9X(QE0of^@} z1#IF{MqjSS*~P{BRe(!P&rF)Xpb3&Sk=AR7cO@bkO3R`d7y zyqM8UGj_(_XM2aK^rgGq!jsRbH4`4qIC3@jycWGU#j4spI%TzwrYw5TGndp_G*8cl zUJj*AgCkHayGwf_W&3@@htM%2-duW--@b2G(b|Gs3aS#A54f;`cmwT$8?2z?iWmBb z{aNthv*#!u&v=+-JWdB}zZKA_Vz(*9y0H+5aGP7ShfWZmq&c}{te#Uzro}Cx2Wec_S1yt&+l;e>=w7Tw|I5;46p8< zQMpH}sm(XEb|j@x8y9MFh!w-!Z1$u~TyQf_I1~nP!$uc#%$jz>UQ!!cD;Zwd zFyI;C?F-QqjMkh2HdNKFz;Yo%$r&-Moq*UXlvHf_VMbk9r$!cVwJJ7{ZkV{@)kk;u z^yLdYn+r-IoYqI2aly^=8$5q@hr9g&ce|TF$GmyG$Nl>w-aIb&?fnVgJ*?Qu6xee$ z(ga0urrn{a=BWy-Qy=hTF$`eDB#UKHd?Y-QD4SU7@moxk9i4GR071BZ4rY$UL|^ z5RZX&!Gq^rTXWGC3|D9)dWz(u0qbW)0QcKjO=hg-KItNbmR0YInAlo}a?EpL-C<|N z6zP!Nr_{3?-7!Tf&0(}IfNUVyux=~X<%}vTN`X1e+d^OJ3fU@TT^st+zkh4OHx+D3 zkWEpwKuf{O3y!=3+?0>A*viR6LMMjoW?bq9uB}ozj(G9eD}46(rw}E4_1mxU@cteJ1yTvHbE=TyaF}s8>`-gP<7vfO&8VW?CVfmBc>(!vz)t5O7EROgqC%xF$A^vVjU(7ScMLQv9cIgvj zG@0N_pA3oKW9Uwj$M=_CU;X7m1)D!9ppoo_^Wgm$-@mio`R$QuJub zSNG+$A~1mc8K|}lw|v&B2~p^Sva4Fao%S>&HV4ve1Pmo~sfhxv^a8^&XmeB=I?_B3 zCYalsSyORV(*h}kd`H;5EeU+8X3$o+TFFFh{&+9 zLAK$9FBd|X&Z+mKLGR`C2O5N4eZb)FhC5K0&}y=+f+hw-Fj2vd3aF4h7r@1a`C`tX zdcNS{{yplpfo^ZwFxFz_oRiUVLm8(H(6ud=iyH3UBdWZ=5`oeVTNTW+0+XU{3zSwc zR_xXVv=WYVi#NLB)l0#@`>Wr>|L{lO$44(eLA`yBU;pF(g z&ma@yd^zK|wum>D8T0N2Wxm1gaEF_lyA~s6!@l-Lt$23cgF;4g-LNL= zA$5ULIFZAxq9MEjxBk8@920)kr2>Ie9`nlwRK4|oK_JOaHxr?{;E0uNVTeE&%Ll~P z*XIlHLDMikG~rg#0ox061Z%>+21*`XG*DTvndFb&38QR8UH3 z=m_mKK`dx3Vka-deJNX}f-0*mXc>>EBQ~vg{_Gh(zCB?2bdRrp@B_#Ncz8U6C&pp7 z$9Y>K!;_ z)u;d5$Q=Tz-3XM$0O}4)Ah6J)J_>6JH;*LC^|8jHlt2*=D6yC%n^{fbL?NFUar)e9 z7bnKjSfUqFaO7pf^2*(y!A4@rj%!UgYX4k|{VZdtSQ8gU%9AYm2^%GS7spI?i6&Al$wNcO~oj z33)4ik1t#EEHlNWr~->5L5DBwJBAV!0<8;f_7nEg45}61eDx)M@sIx%w655H@;&g2 zSGZgNo(|Y(#%0+e?x~TnG`Z8;U$!N3i!U{EO`&Em(GaV4@il3qQ5AD#b($o7kfPS} z>&N&IQ62gkB!g5JQc|Le#p<@5eSPgRcIhdWO5OE-CEQe_Eg-#dq1 z10okd13Jo-u;%B&0 z!e?(b1F>_~YG!2u)p2Lzf}i32V5ju7vs;G$y++>vt3Xu0rAdhB&RzhJGCbYg22TX8 zf(X>2E<9;VLmH9SRx4EjipK?2bJ(YOSf!D0+w;g}yua-1Y1r4~LMHnRyauuQ(0fev z7?z;JIE6uth-}73X>UuFnuN)O-(6~5=WqKLTEiMIq;cjr*4$$eG>2qT#)4lh>qR5~ zT;WDB{=nH|wQi)Ocfk@}#YRX%->aeKUAU@FTTEmgwb)*f?i$BcFVX+ChG=8_`e+cu zXDF3FU#g=8k?;Y>Hc{H2r9Rw#{;Zj**`5uK%C5(J2vN-Gqh`TKzwj7>s9~k`w%ID# zlZz#N`$ zT{EJkV7EJ9zP$tXH+WcAoZeh;Iz8h4{D9Z*zr(wCZ?GO8F-yg#FJ9oq^E>S49S+lk zvMu1cpkQZNaTD%#d%V1Tf!mw+c(}Kr2eqPZvcH*G0}Jh!7=(r_8A3-g=1h&q{Dz`R zZEnw?@p2zHd$B+|%tmu@S)&NoF1B!mDk~-?Ow3p=XRK$%a=Ew+x#czj_T*8jo^2D!N7Y?@K&<+?wxz@S@*ig7)V!^Z{+`M>! z7k9Uqr?!wSr2r6o`sx!r`}ieZ-M+*#I$$|&cz-_O&HE$Xzk83@Z{FkWal=yfsJjEU zYN$V^?xa`GmC@aQ?nyg3&Qq`Qn)32J=LTlSR$j2Feh3e*LrY5uF*aaA zk_#{A*N=hFMp$6RcOdBLgy*jpeDeGTAHDn>H!nT{P8E873oa|%Ue4Rp4s#+@YV?MN zUG-T7B`4eHzFMk$oanH(zJa50ga4)=Bt08IBGAT8j zDid24P!uvUh?*?T*wnBJsT&j(wXRr~6V`RX#Dcr2VkThPwc?=_-W!(78RyFdm-89x z+FV&oEwh}!4L7ff%@D1gUqyvYWYG}9MWih?q+(YJlnXA~3T*A~Te+ziC!>1E+2tpm*G>v9t>G!$+*8X^p|SDz`=v*MBok6oS zb^M|1fjZ&c>l2oB!)X&7=?41z4!S=8+XUhQn%aP%ir;mT7NHalLnUf%b3}}2QuXBw zEgO`jg`uP2z3{9eSXulh-HLpr7|J+xM3s_LYoMmLuhUes>{$SYz7_@QCZKJ_4?g}F zFK=(~&Fgn~dt5M26CRHztUBYP+ZliG!|&nl*)x3m?g8JvevjkB3EO4CVY-EgU@C-j%hDZ+*$d{meBrFo@x6^96JezExPHs^`jqna zd?Dj!I|U0U<)x0ezu}xyIAsfjswq)?a z(@|0OHD0@D^ZoAyUi^2Qa?wOnf!qG>5)O)-?>DMog#zerH0Xnpdh9tD*?le))m5PBM$3j!w zxsq}n8-dx}2;s)J7RT@2?ltJH8P$|&Z)jgeL@!0OiR1Ro1PlL~!GMPEQbqJ>OK#aprL_ zt-rOX6>TTkZr)+5Yg>4d0_zId>~mrTXu~E8mSqFB0+J2eA~;sX>-B;M7Hn8>rxiOc zC_Gthv|=ai^As&O*MhQ5m>r51m zLMn|Q005iVv%qS@qz|~LjHKt28cw%L3<^z&Li3EZDzI%RWx_PinCBT~U9m2gD{)E} zSg8_3DhmIO@uqU*NP28pX@L8vV<@mPJzG7-Y#~aiDYnc=Pv$t{OwFTC=#eYoO(Nl@ zC^XA{3}IOMv##)sdgX{3?bKb29K+9n5Y&k+VwHdobg48k;)iOVC(pX!$lw^+t_c&wTzNznv(;XW0Fn4F@v zSO;Q^N1lkeK0UrbO`KbE{2n#5d0(h?bar-iXD48F(~Q^qE@H?L6!x`l8ONM4scE6m z^3T&yTD!p;<(EWhlwdsHXlPew|^Xsp7H;o*fQYWx@UF zh+lvCCI01?zrbJp(NFM#34iuye}=6p{{7$nN4$P_MA;Lz4LIx%5G5>i!;m%Yf?)Ec zJw^N*nIX>m5YaXpLC)|sM<08uY8l4;%pc$1u_sMuq$5_O*R~NgZ8Z~{&}__Y@4=Z$ zNtKBtzz+ioKD?y678KYMT1}iqfqnM6sSHbIN$0?1`wDlLV<6fPXe!nRIbqMEWZROx z&6@I}r3>0TQ=F~^sL6G?;{qxi=xMQ9l1PBUn5U_etF-q^jmp-d(THQg5TY6m(Th68 z8t#LMcR>{3eG_a~K}GF?Utg@U-!G**xwSj?#cFM~?K}HKTs)@MJ~L_t8P!hdrHCwX zbBaIP^u+MwVgKp&*Y`ukjP1(|=7>8JTgK;&hD;lapfnpOyL? zH0Dk;aI5L(M#H3=&x#Skywj4@5Y2=*_tfGdLl8~K>g&O1rI}jjCYN;fME$H! z_j`rxhET<%$*roRarJ}Z0yOdKz59ab|i@77&mD{uR@Bs zFbZ`Qo!TM;%xCtCGoY5(8ANr~wB(Qu@lHnm4M z6Z)df-Q8lSD54Q7mppI@cMD*%VV3Rgssfi~gKS5vDmY6uC0Dl-_2*j6W#0#~#VNBj zqi;slSzk_D_OlHyRSZMRNJwdk%#B`T_MDd1d{rxB+!mfcB^)D8-AI z?#3Y!FvA25GCDQm@$cDh;fjkXOnT8ND+&F8>RIE>!7<`DC@tj2oYszc^rMZqXU>L; zHfrV(XG<{+rV#x=2+NJ&H3`1B?D6UQf=^#C{`w~$f%p+W`=>WpmR*Y-Xx8!`XtSv>~6=6}q*o;d$P5H-ot;*%lsE-PP4H=iTMy8SI-{;ZGcSTupgR z*iRE)-R`j8-(t7hV_gJ~4@WH93Z>G9x+aLJ=A7KkJCrg<@lvD>>1pD&H1lj6Q4|G~ zXFM#xQ3YJ~sJmPHSv42>p%fdolPTsb!-v~au5hD-Xo^?>wV?ys{U?5Y`Y;ZC2{0Lc ztPfob`5&1%G`ODfbK`bAQMwux8(hDe001BWNkl2oo!201GuiSFz}US_Q|` z8HE~_t4uS_i{Q<}1&Obx#4k4dmaEKzfXK`cL;SY_Wn%l&e;={nzKa;>HkB*ZJt#z6}{(eb2 z#-B{+q3Ff5*FQa5tT!Z_&SG$Dewb}x;BJ`0D0NCBYl>PS=gDf{@+8HsJA8Op?)M(~ zIu}}o+996&Ofa~*=Ehj6rz_h&K)M#nP$DYW-^BfFF9dU_GuU#Z3VLmkhs|P(A+o5Z z63%80JXl9D+OTFIL*zSJ)7Py1J=Zji@y}h7>t8f}X1*vb_Os7Kg@`mr2z3<==Rv2o zH1)pdhBXaAMLI3O)#=RK?hhBm}w>jMw1Y%IBPYubW7?9*QQMo63NN?xjP| zV9nwOGW2eCpP5w!X>OPZ9XcqV=-L_Xd72m<*5O{g3VP3ifOtQX^E{)6DJ|nkESnvj z+?SEH^ntH!SXkKSz?jWgo z&?L5iv9i5XINP^l2|al554XEnpGsCKGB% zAO1o6Kt|M@+oeShN!5nFR~KFbi>}z}1yBLcgrEH6$N0&Qe}q5$(U0(>?|qJMzWy5T ze*GK#=fC?${L3%Dz$ygZ9dKML&Q&4YgnU|B&$~a|;IO|1v;>1=t(%>?pWcTsi+=a(s8aX)*eudi7L>Z zJ-Z)B!=d7H7hgVV)esDbNFYFw&Z6Qssu+=jw2AD}BCnul$Rc&t(L3cubf)%ccQFt9 zar6auV6G#3y$x%L3B)xVWWQ@6#A&enlr{ovx~03^YuFaU(DHAki$HyWk`^|TzvlpE zDy{xpH^>GY_EQsPx3C5qsuDGOqFf^(#HLjWpGTwk+;4m7eLsnNhU*RsWx zdb~?jie3jY-Yq2EZ5TLrcVOy>=^h8d%hj-@^$Vi!hOF736cL#HTOZX-1Fk4DLfXU@3krl3~LIxbPhBSQ@09T%T)%nT2t)AA7%UVfFnI`3w80tNT;OT-YUlWWHZc@#m)oE!#Hba%XaCZ}o z)vlUpge|MF3$lr>gtlV^ER4sSCle?nH!Z>-6h{5EtuQvxG3J8K-VXLi;8cAY; za3c@<-(gE>n4nrbO3CSE+85JKM~gI$H;$gehskY*rr@`FgPv7#Sr&yctE z5+ns0F*PPEa~wFQddTmjnh6kBy|x?B!g!P^mtMeZePOTEc3*v|ttrBY1{IX11+1nS z8Z7ou2V)@(qOZ6ijLb^ru2!^JpvTFoBq5H?U5Pc#Oj;aRpT&1G%5|g)Ih};kWk3WX zi_wuj$B5WSD0Y6%p^3dc{;Wm2w)$FQnx)~0SCtSPQdhV|Jg>XCH+cU~5qmJq72F)A z>HVg>%-8sV1&lQjl*vh^9ue*LhiK^A)av`bTD9kkYG3;MycIfpzThe9GPYkIltP}G z*xJNGfS|w)YCXzih#N@)5k)uVCae*_$*7j!Yt@nRta)zK_nNuSnYq=p9uayS`{Z?o z(*{a@&X9J{1FgBe|Am?ur0>N{u%*`$V52;c3_#{mZAkwF*Vb3jZLzz(GdK<7>cu)!x;0Yp|5YN)tEA0Jt0(4LQ!jqEXGNT{-m zL*qvL#{Wy$yZu_09Os>1MCRIipL43JtGn6FCM8moXvt&wGWNj0yl9>V^Dr39v{%Q@j)71zq`lF`+I!) zofE$E{0e`6EV#XNth-7x2eje0n+z9dI8qaKal(f?+L&D9W5XFuO9#tzwX;ri@OdSe8S_|E(=@F4oonL(S7t!L`^@olt5giM%`>a6Db(aJa(5MSyaPvaZn-*2AG= zfKBYHJQo)F_k|~GY#X;hDZqi3fu8DSGlR-8|YtFSBf=@;zF)B^R12H-=MyQL* z+Pa}!9iU6W*KgnBn|Jp;&sH~FEe#)E7yRfqzY8$okN@MJimZXkP^?Z3z>@=9!X|3Tn0*yMNFh?)$t*Hw_mNEm&Sf}mSkWV0bQITM>1R%I*LG}F&w}djo{akz6u*AZQj+4FXd0r3 z>4hMus^h3IIl)m?M{bNm%eW|D8PRGKfSPO-ql^(InHt@A5oI80yo!j|i78jbRPOt!;BF9yE$zlz4zs7p-}Y8<8UsF#? zIVawzFWG4^P_8!EY^^(1J$ed^mIQS%T%BAk<~&nQE*2Si_PwB+zR)?g0U=EAGw#y5 zu*x0Og?S*8X?PhmNzjRt(%qV;0)6x>`OsSi;5p&t`dKBOp~zzp!Rg%*O&MycnFv3c zvs8<+J?HvJ#f<5l@uRRrTH3rg;Iv=}q_OqpnMM+Ij;0Je8@K^EmwrsC-E}S|A{;~S zlre4Zd-27QfUmej@F<8Y}C4FLx(f1JI)JA>BEq%HI%ZT)Fs~YwE+tg)=i*=(4^sV zS-}h}eCz}{W?=0C2SXddZHdDL(cckj{T(jaLD_vV+ncV>KK~TI{afG1Klukg#`nMT z9kk1ew_kmYum1CY#$W&am$( zHpqvbWCQ*FbM^BYsE(+l4qhBYInSol7>JPxM#iA8587J@gE?v&cl+o>W$Q?A(y>qu zzLdqDNtD}Ud5si#*N>d;*@>S>F+uSOfl;3isI-y&>J%~^h|GdAMYiNWlXnQxECl4_ zrQ9z`VaytsxW|nL8V{nI1*&jNw#^NE zZYmTA?Ch)`@COYclh-3@H$Cc~ux6z1&Ru*d_6s}ug{JRbC@pD*Y`tqxXo!g<2$5N& ztz95RX+A=uS9=_^&>|8e$UCXVa(gRJ)Iqaz1|13jaeEc3YfdG z@6Kl|Tyb^t3?CleVgcdd{(_(U*}aP% z6_Yv0ZBRXEB%!6bV~&>S-%%Mr)>uwR(vC^&S)wa5V}USG1cUfye}9SZfouWBv5F`WQ1454A~zfoxE8|@8zq<-2m9QI z>p$f#D*;=tzlQL=|2e+A);9j$c~|1IjZNi|lQs8@2!XwQCX(FhL8?sn_Uide!Ol%Tmj}#mm`r@hIW11fP*-N{5;; zXgpm!NCkN!uEP~BB-7WytQNs*$bUyYo1v4lOFiZSBkDyo$HF1RsXhku^MfhHQY2AE zp%Hb<3G3c#O97RV;&LbtdgEPC>!T@1(TO4&e{R}yrpL0Hnu8>nBTY0aG|$r{nIobH z+LoCF82ELX&IYzSGS)d(==+XiFBFKHLTQfR3?T&}%1@ovaI?Fi*=x{D_Cds^M3dC}sFb%eh!Q#s zFX>HXSKav&NEG=3y+yAf95#I^oa^ z#X#h$jk%#yQ>1m(sSb6DJK1b0(6j6s76nwg1Ac|}Twe5LyR@EzaD6=Bcv$*itTHMu zz&22pNVx(%zPuk8oB#3BFE=$i3zuHJFZUmCd#_kUI>ylQps99cyi)18ikm>S#NWNv z?y_GS(1;(ddpcdKPjCTtOnBHY3>0)<837?|Y(z+E8j@Rju7 zK?m}J^I=asFPt>L(H;Auo?UN6Zf|gV4x}$gT^!w*!_mrd`RKIF9a+yqogbG+f(MKx zfOc=CqrEXOaDGq^_r2_<28On=gVJ5)%TjQCDmYf)cwiitg1Rs&3J#^>qwD8*@%$P$ z&luNN2fV*~z?*lsc=h@NzWMe8-hQ~lhldp#9U$CwMX3F->*VUK|J+=IQXq!w_54t- zJO=ks?B!RIro3LzV+7V7ZHKftk41})93HZv7DdL*5Pl#nCLz)fULLp+UmB?^C+)x- zu_H9)LaRC4u@Sfc59cWuT0EEKW|1%o-$d1+`!?mg_>!zjaa9!`6kEFdA->4=1cpf70 z$osGba$OkU15gOHRn)@RN;NumM`8&pxHc@*`tX%4e_pm&+K9zbfCz`$KYO9>6zM;P zm?|HJAMGgja#*l!7Zep#CO{fm5gbavQkFjSZRjo$1r}Jg7x(k7lp6Wb$K{AatvINH zbiukUeL!*`9IH7m6*wFYp>FItk)GdKsCCpS9l@&L=J6`_`Eeh9Z_<%t%EeryYRej6 ziN%PKM5x5zjzbZtV?m>Kz9rl$x3O3XOr*k)t9^w*r90Zhhy=dK$VW(|=oP|*c2Xfm>}axT2*2hnhl4i}GS0=1EMv^zuHg#;DT zPmgTTX75oS4sp~m*;O!zG-Gf!HFW@ra@0Z$N}nMO!K5QSY1mse4Q?WLP!XAD13^pE z!jY01xvSPW4a6T~Wb=@4uP9N&=#Tj$1wNd1VWy-rK8-^#$b-}r&R`n&zKr7bA2<;w z;MvgW=gf6zI0T1kuMdohLF8K>h!OW;z-Y!h9ivS-U8Bw=&%>CadiJ9&#DY&I+cBk~ z8t+hI#V8;CoR3`QX7@qQ{7b{w)_?9z`$9#eg<@T885|3HudQ0I+g6sb;PN)mGhJnX zz^Dzv2u=ApV&7e_TZ;W2P3K&8g^qklTkdL*Y#hnni92M`G74amW(YD3f=-SmfV(-^ z>bPjWlA|-6wrL@bgnD&Hs}I*R%9nOc=$s7M@4Dn}^$3BW5bfTZ5PRFbURbSqorf+i zL?ly#H+RRug=ALuC$#a@N*N}O)iZ6I!LNAKcLZ!aM6A)HX(B_gjwMc-G>jb6tk&wDqs{GYr(d)sB?XZ z9a(=a$k-7QA{2p!U@7a}36!Fi${09O5~w*5#YB4*1%o%V-u8iuw9u z>qB2zK}5K^xyEOozQjNK@sIKQzx`vJZ*TGEfAe?vt3Ufo{HLG%1aHr0+$(^G3+`8d z4qa5x+NEbyF9)0s2OMj`!W_#m)|SLLiq3v&{s}qtBc%^ckIraA8U~%=@3Yb;l2tX!ezR_=aEzmBs>E zZP2AbY4PZda0*)O7x~#nmg`$P*^L3mG7-F(pvceB9-YOx-s65Aty{yx!-o6A8Rydh zN3IZ(PRckOAW*bT4RvmAPh}IkI?17Sp$wX3+!hmU_nM`(4Z1ZPPba**xxtYO?r$IP z=9^b||MneZ70XTMjzf2r^i+FFJSSyGMW83@?wongP%t z*Z=ze#r@p{0zz3T8g=w|2zsdtycqqSb3sCPkM=vSw{b@Fa*~#2%B2a4P2AHB?sk%f zd5TbUnQ+QMSJ2k~`J$8H#rsM%=db_!$*r8w?cg$rQyG~qMyda!z(%IO_M=h3F6eUKEuEP{Ru*=S|zN;@h#{$_G?2?v8Iw7$JtstVNN>?|q)!Utp zT!wf^dvq>hRtl?|q~BGWz(ezNYhj3jFWV^*$40gR+U~ygrEZWUrPFjIQ8|2(7InMK zLI*eaA>sG;;_19|Ql^R6muDfWqt@DE`!x~Tyss%vS1@4%jqHsn4c6x;tRq&ozu#>b zMyZ(CdDNr)i0I~9U5jh05eql3CDDyS}4OT-^FVW}vv__^z~ zn$>8?bZ&nK5{WD#=cM($5wmsA5=-I{z9a!IkGsm=ZBd_R@f3fso1zA#gfJ6wr1a=i z-(PUt7iPyxF$RQ;mvaFi&nr?}Ap5=}FRRICha!`Shmy#HR1>uUn6+p|Gf4P*G82QE zP-cil`ajz|W+gApy(6d@;RBK=x%@dypPeRR;GJIbcj<2$Ge(!9`j zcsX7+aQB+c5>6aK(A#yte@XcKd_U#?*{pu_`l*BvLBcGVg;u~!Qr=8ZGl)xh*EWP} z{vC7*5|238NBDZ4C{k|N9m0oU<{|~EJSx_oP*3bAY?Rao8n`KqW_J_`yTULzSO)c* zB0owY{X(X3Lu(jpYCq*cmfssY^_5qG%{ufq?v{r%SQu` zGOlcx=dB=(eM#gT`2di}!86cCMpcmh5EhI~oR}z#+@2b)gI!LSSblk}hT%{^*Cq_`-#X3+{JGkFh|$G{GapH3F#XVh;}dw78;M zk-oot%lKg27EpG{d!fjhFfLCGLZ-8HV2$mNNexdw3z-=U9RMz9vVf>y(`uc*ggcyK z;ofXWAThw@(wpFI>pAh2Du{tiS8TcsCtNdyXAh!OpE40>K3e4RF@5SrFUG=Dpr!(7 zv5fAtU=2iHi_FblOE<%7mZ4Z|)__nMg9|&~1eB2aNk^sj{RcX%pOFQ?A{$x-?x47| z4VU{n9L_7svEYb1{P2fA!i$$5;jdra;oG+>YAN_gS3F!U_~_+J{Exr?BmCggFYsr7 z{$KI4FTcfl0lIX(pd3#&*dU+*O%|-JVl#IQs6iz+(PJ3Y3o}j5QCHfgj3diek0_Ev zoA9Po6}zI3Cl$3cnU-vPDyH5{&sd;hEi{11fD#Qw-|!5Frm4 zT=5(E(==54isZa;tZdMyhC9wFC7zR>2i~Gd%@2Ci)U{uOiskV|MJtr+JWW_b@QmqF z%5M50#&k?9^hR8K001BWNkleyA!R+cIADdlK$3UrAEy*yd0 z_w$!fN_M{wE18QVP?s3Iav5S0GDJ+VMwXN72c|-29gAdlDe@i)8uu!alP?b%DF(CZ z?spmpeaD`OO(&Y&HJdBUqc53SBZziuy_JEl4$-jNjYoC@FuGT);$mJv^$4F&IzT zb~*%O?tmPW2MULq>Q09m2vHe&%i!gCtP0H{PfGP#!bnO8N@(YR^uaGp(HSw+3Z-sO z3G_ine;2k<+jv9F{`u2zNO*#H3=4|6vOCFyXp49VGLbNeq86Ym757cdPwjO`Ui#RA zR_FdkCvi?*M5s0N8cPU&?!wtkW1!|y6bi!Pkrs|mUAMklDhotn3=Z;~?x^wmyZ8S6 zd)(dLL$nj(RuS;p7jmKsDhHgdDw?cN-O#okYea0ls%-Hcy6d)o{~aq%=m>sY1={XG zTTj?M)&oAid5#}``Wc>=iogE)SNM}Z`*Zy1AO8_vee+8^aDgrhZXZ@$8gQ&v&}{{4 z!C_%s)dkme!2#%b_LYs0)H-2Jd)2z>ibWOWP*Ca+(=`QF08Lz|pL!r^c9xekCMxy} zS+=#1;c|ydwfDo_*S=6EMUf1ktR~}^_m&#Zv<>K#LJaHaZe#;UsA4IES_o}bQ~(<@ zmo=_++{rSg;i>rPQ zo5(@AVC4oOMq>f1VzB}BgCQ|J%Tt0_kPRH;j1wIM8Fkz)=2*PAk%+D49(QW4;{s(F zcQGcUWFGqEdagY2nQLAGCUAz@z2+IyWUeod*=xm#DgJVnY^Uo_{rBaeMl&Io3ddrXLZB?Rq)*waq>o+w zI^$83hcW6NHG<;aq(HkSds@H{9xXCd9G%({qM7Dpk0$IX@t7Sbr+z^mE!9TcWLmPP zpMev}=W%Sqh^iu6&QJ{1-J~<_WG5-?Gn`wBO`_yZ%wOiC;Gz&L=H4cx*9aenj4Cw$ z?bUh4Dic8pX~qjtH0HQBTcR5J8O>}uql~%EIm~(1tQK3U!=O>vi69(U0MA8+GNjlY zp=OfcemX4ZbwiJqVK7c$I-)4!VY|hDxxdG&!yEj=|MO4r=ciBb`~U0zfFJ#n&+*OO zkDwdl5C7eNz^mI^)YGxwaa1i{s?Vp7C?Kr~JwBcjpWSv-68HNlgjk%;_8xnbBj@tc zQ3L-^J9n&!IU$qSBnzuD$sy0I?++tM>qFe2v0b2Og|)0@YSeswJDqleBHzQ4cO zA?wRZV>)Yck!NaJ5X?M6YBU!ypF&!8Ilft(0jnc>n#?`fNU(0338aUSpf9Tc$Yz<* zRzsLTrAJBHVw1#(gxO_2M0Xw^E6&-WbY@T|0>b0N{ChFdo+`RSm?)w_W5F*1VL>HA z;bL)W-TcsJhZ0^uX$?&p)MoDL0x(n1()KLZ4%y*PPe|1AeNmD_Hvjr@j_W)R#ypGfbedrn44r?9 ztn>TV-QdLhXyx4Rh=eJ(@4F})QO*9oD5;0E^Mq~g&Nb>v!Vu&5%zy09#%J2=%o5*M z%xj3CEU0ljw3zHrn0+%~RD!|~im)0hWg=Wb`2NjO680#8*# zj<~^CF#9_j04kod?9-1F??}|+j{L{t7?T`l1W$fS(r(RC)ORj2MLr6mu zK{VYzS@lQ}ou#ulGW|S7XR&AgK1lJz&&RP%W(9vxcmm82S(RuhG3?u+{VkX$M=YESk_bjC{Y&K-}eh=$=H_CYypFSiZ{$`i|~ z{*%rOgMBPp4D{XItwXI+?7(6sXzRIv1r3!Hr&4frJmLD;N8sygV7u*kX9DQfEXQEO zMGGWaM780QT|b^-mLF7gSxi2ylgQXeEaqT?jFRDkam1=oiYz|w1f}!@M{jpEN&uw zjP;vbo4_O7&km$yDn9#!NFx8k8(AU8wQ)Gm*_Q}HLnM&MFij+!Py?@)l%3&r@CA`Z zJb_ThVsYyZqKye_VZ6V+#rto+g|OmaIaOW6)0M+3DJp3U682|Hh=z=?FpzMVghl|;NIV3wz)|Fq@=s=$vx^02!U3h>K%$bU@_g`n#tkEosF7hqKD1JMk4HKumj#t8 zxY^*qRr*xJH$(ua_V=!BYdDFRdmg-qf~qZ(Tj@D>)H;&XVkio6cQ8@G+BR%*0nvt~ z2#zH9?BkE{FaEoKj+g)F_wbWH`H%R?yZ?l`04G{d>It;e7`>^X!<(b`6g`V^+iW=tgNHSC~nyY|1=1kQt!7hA`;R=t%MNoQT2+|!w-Lb;sXH@E&XLGg+6k;gW zz_U{c*EyEo{Yu-QA}FOR4Tal4?9&h~fF+P_#h4kjBiQ=Mt$Xx(;oeDRQ4 zR8`BncGj9LaJCRoN*7eY?-1(lL@KeIX@;T84meH-FbYL=Uq*-zg3UeC><$euqd{MY z7$qUk*s@3aV1{Ginc|tpd#WW3(Y6s`V)?qFVV#)7i?mbYDF{;R?=EE7ffNHU%I^3; zd)T{|R3Y&^(mW~`^5_g>0uaK16|O_%Y{cC|q8h`Oks~;U8~Y_uJh#@UhqGPgxD?iL zzbVaq7v=MjBt*xWwcA$H%#h$;lLM_}-$yg&*F0Qv0kf(+T6&AQjJoJYrUgL1r+W`J zXa$kn9Sc1lj5K#<5O=H+1R_ACbzlb}J(6a-K-u42bKn#A6I~Nw27PQu|wFW_t zAnGv`4MqF#tS$wI;{mO4C&#JU!k$fV-O>b&F)}S%7ZpgcTyOzo153l9E?BtYlj|GY zfBOn}@ev9y_~!iwyt=G-vt7`xpW*QA1`q84Z9QW%I^CgGiv$oH46EMsf>S*~O0TQQ z7V(7&)Cfei7Svj?t?O|8+4s)eMb=PB=x&J~Xe?<*58reQxB@F($Y6$wtICkZSg|>% z4k~1hca7zuSX>w<@9RsqL)5pk+Us{3ofc?)=QAlhLG^DB^FZ@m{Q4D=m{%6P`*wf;Vf*_E_`JlE$kPP zkg4Bc-4TXVckXKc%o3(EY6lETN21{f=9nYUjCqwL)+|%L_OJgR)qRxS5NX9g9wRCV zGzeDV1(x13J~VqqL{UW1HoVY}n8?Ks~-fHxn@sYUjj4 zRB))ZFYE<4aK-6xfSfmc`~Dled3B4|?{4v{Z{Oj3X#g!|gu#f+%ZreRnnXk?AQ2HX zi$*YIPiFbQ_`1ro9%ugB(MgvIUknZJz)tXLV zX)^sgrL|LMx|$oT zgw|H9t%0-?0PpS}@F#Cy;o(30F>aqR{@eflU!wju{}@->4c_0~;gA00Cs>=HqCijp zRKPNmQOqdQbaEL+-$ayFfiy*u_H#CUPi8Y@JI^CpOUJXSjx37&cl-A;VGoSHGiWdU zUZHSlhX_3r+foLxR|MeYHsnU>$kc7<+1dh_YR|09ubj*MSam{u3)w<+>CyO zIhiW#ebo_5p|uWztJmu`10Ayh6NkAg*O!;uW@eZ^htw217V9f<8KK#3#8;Xw)LN}a z8UfT!oI;3?C4qiug3VPbNm$V%#mHiN-F?nfx>(SGaGk}8w)MB7xS>!L(gdW>3F&!l9(AyGtQKdu#I%s}IOb8(uCdXYv1NYiX;kwD1%@#9f)gS^us3WuI{ z0@`spa-?$1gHAE08ioo%r~Y{TCH4=yK)d<=#24Po6PYBQYk%ikoBs1$rPC91znL`A zMbYkjFW6(}CE@9NkCMf=jTD3$=UvH*p7{Smew2iLHYyGs&|+rI`|8&wew( z2LoY_(By*)qxGKhl}tchyQvxKygov@gEd83I>|tkMs{vQOALV$TSQ6Bc_?)({+!D& z;L%g#7oERIu`ibGL#&jXElTr27Re%-Q8#mTX&^M8dZCeBEd4*Jeo*`1)Ky73F0fEh z1-zPLkgrWqYhUyz1celf0t*2P6)bhZ)r%LnQO5PvdmPKsT?n#4Avn9To~tca$>v#O z**6_Js?$I(Lx98r9{N>hgN3%D%7#O&I9?rae0Gg;JOOncUA3k`u#!v>2PK*z z!&ZdysXLB!eL$gGytui>7vK2=hlOz29&mgA8t-4f!N<>@40vQ0lSgtRpRSMW-b@c5c%Au8p4`kJj@!&v$2x zoRv%fra)Q0ipjw^(Dxilx2|f=r}+@BKsqL}#_UAq2F{VFO_K-Tm2bUKYd$0(wX9$p z*!Wc_Jwv8{P6dq#?=Bnu`sY7KDHm+dZ?N9qVmn{Z>H!B3DwV#ZH-~;h*^LrLG*fT* zII>@}c4)XFO=&$uzoW6s*(E6>2E%9>NK_ZT1P0JP-x3SfZ7inPvQHEs;Uq-zIjTd2 zT3=X4UuD;#j3oroofYK$?GsbSk`85U^`_Sc>D(9mOr`6h7eXPip?n_<73Hp`Z3#d9sF<*IAbw*p=cSl#`s0}YG7L-)_^ z!Q~VtqmLYE8%hfp!ffA*V3R(SBnY$t&D`s851FEkF|u$Z=G24@juImqx{V==sM^51 z7qISn&N(_R7~?ds)RZeOJYLd5XdvpJy55V!6KY-q!`Z zKA>zH3KW$ZUcS7>@BHwGc=_?C_|>;>@b>LJwyoen8V-ko=f~%GaUi@T!iRTf+@5do z!fp#)+!WiN2Sa5j;+JI$wCy9`ksIpu*sVjWp$ zqRGkOWSEj%QoRUl!-gD`gF<8BuH??f{0j5<`^aD`Rmv&nuw^4KI5h~DS)eU*!xX5d zCo19&J)H2Z(NZdnL8AR#f^9=3fBm)$^I?a?a$;7?Qsm2e^Da)Nl7WGXk+UC){CL2f zBRup;9r_@<$es-2zelk=+dy`YJaf%Mb{b1YcMC&&8v~8EiSG| zqOMJbOPVYaMy%muUI4nJ0Y)*AjA6(PeO|N#NkM4*?HUxdHLHutz$V6~kr~pQd5e;h1HUVAqnf}|b*eD@Jod&Hj6qYD^VV{J>Bwn6D#d4vGwr-d&0Gojf@nCra#B4WS%QvZAFo&MGah-0-JHyYNeCkQWrWLa)g13x;NqEc1)dSt&xIDvE5*`Z zP^@Ng_XR;ATSKD_fPhIsWnhja5z6+@0n-puu{l$-x<5D6k#BE*4x;YWsSfY%rT$in zpubNrT(O_|%qRi~woY*%MlA(g7}uvGD)m$Q=J_?QuCAbOZo!4YrDD67V4K7SsqXyl znV6N9V4n5bqM2yfMK=I8fou)BG&F!uw25QpdH?|d}s729GLhH6Z{IhzfHO9J`ubfNIi&X`Y3G=E6JX^;R)_NTT z48m&b?`CIiOIYR!K#b$r?MWy(eNxNZI7$WS? z-We>srt|rah%apvwG~kc4zD;Z;>vZ;x=edLc-mx0%8s#hUYp{MshMmPv-9V zX@JZbqdM^9f>dw16Ds%MhB+o%aI=;esT<~FGT%8tN zUmbBcR6BFFz+!uUO-}FX;rFC{l0|Ut%cwtUh;7$?KAY@XSTn}0g(_A^a z^LONZK4L(nJ7(O`^2BmrAVqn)kI4E(4szZTf;ykv=}n~qny$Cj9v=A3`aaco}`lBIe=dmc%kyosSiDsTjZg~UH9e5*9SzMVb zG<}}zi?2-0O*N<+3p5*CR3AC<*<)4A{KDb#?vF_SyYjAP9e<`I3JRs@n%L2Yu+(D% z`ZCZBS&NLijXX93gWAC)(VsItHUw^V9*MM0^VO0(glbD~ir&fpKB7Htx4&MDwn<-H zN94f}HL(Ajf}p5*pGr*QnTyO$dqxXKyr_#}f*xmoPUTMgoBJ6G8pFCZ6XOxEo^X*LWkUs1nnjQI$@?6#vy6Se!L5sQq%SUgK{*Jky_OOhOJFji4<|!O|12a( z2T0Lv2*D7=Kkx4=gU}Mujg3Y|Mhc-2IcU0%$Me)U~Vbc?!2Xi=%Y*$y#bafY}f&tK^6&V9&4ip7c43*}^@dmWkbFM)+ z)TOJXQ`Qd=;ri-?!{LB!+pxBd`P_(>;Y`Pyi-UMy9;SJIs@-14vGL z`+plrWTW}uhRgx3U_3O%cDVzWJA86`#KM4H8n{`e7!wv$CW{>7nxiD z2gdJwRPp@v&+za6 zb_~F-3nVrZ>-Zv10vF@Ovg`(kL#)vkna#4FLc!}!SG9sVEo3>CES}-(-&@K9B@Pw* z__;L}JxNn!@dab3M$<4U2@xk;SHMFY!nf`G7T>&|+CVR%e9 zCkoMq5_o^a)Rp$dt-C*vm-`KDMPNfvq|*~U90F%)OxkGzbTQa*-xH~9EA??a;`))$1BMJY_Hi#%Am&}E@GEju>7B6XOU#Qy8 zY~ekI7W87jfh@ay{ykaskucH+S4C%`qOWfJS!yEb!;xut=8HP7znZ-V{kWImHqV2E z7%0dP=uO}0ejzKN=q0tL$1@wX3oiW3rs>^jNhmlR7uY$vSjW&;G_!{|W!)y6Tf~OM z#W2nnnH%dKPvbO;kwH81){?k@9<@qSf1@%6Ia%~vQWLme-0$57x$*b&V$04UA4Vm1 zoiA3rNh+rO_p`1)n`6;7iCrvjchuGzI6p_$%A#^z*@Y0e`>E0)>`>tqG{8x%CyYUC^3| z-MK)tpcO$8#id=qN~roAD-+gskFvhU%X*DtyWsYGhxgj>@pnJR%a1?BcKQfkFSmI4 zu;0oo$p8Q#07*naRAFsEsKgMN?D=nc!FgR#DtfNC z2ntt}Qc((9wtatwnq8a%%Nf;iUbo0+ozISjzINXb?QCD_*}>e7JwW!iv*j!LzFaZcZnht`;1Z14fR$CDk zJALX>QENpl1)_?(yEERtd5?GRKH%>59{1-B4|ivr&ns@FLAl~V`pjoTKMR;(?&LO_ z74Zp+bZ2!M(2`^U9Y2xe##3Ioe=fpfz~6_zCZx2zvF2eRJYF)Jd9o{VVD6v1N0akb zV-T)s#r(9J5AIB-$5)+{5`tQ?1|;eW8SE5Nn(I`RPM^T&)1989VdN3O&XF+Q(^yWE zB1mnlJccylk$RezqiR&p*>FH&f@a;)RAuyr5lItb#YfV*NlZJO2>U_$+>=DGVk{=T zz8mjwIA%Q;c3#5`Gej(8eBM%a=MRr9atNVyq7+g3?c(oB+V5G-LIL}ZZ2?sc&#c1T zQI8qL?sc{=?Zqe=wH#1r!z(KIi*H}yWNWquJHXI{x1H(_dmzqyu88NuV2}{ z-l-`)~1Hr5zMXX4?upCAc-X9@DR@nql1kE1!Kg*}g1 zU<=?tE2Uz8&BV$PQ$Harr*QSdxPkIsw41pEx*YmbAm zI2SR&wvL!G@u)-~C>KuV?7NAr*Rf1p0O;ZXAQsOdN=f1}GC?tMU+5H%I`G9^VXHyh zgPZc>6(L?*b&cm$RJ+k7;*W+1TSTEvAiCPptpA-hY1mYtn+6p*2X$%6pBJ0=53D`R zg)K&DLYV37rAiBGpYbOm84c2F&Y|B@bOz^)bvs9MF1kj&r1Sw5Oj>)KM!sv)wP@aj7f-c&X0qh)sHSAjlqKWF!`O#3#8 zsJB#%#G*D9{a%KKKt`s?TT7xc@g=wRx@d|8Q71gfh~d}~kAteF$=qURxM-uqdw?PPM1;}(tBcHZ%$r40PtnYfMnMx9MA#A0!s&y_#xPPvjl7ku>W2taT-H~i|=EndBQz>j|8dmyeLC@KpMyxCy)fI^Ih0+p@^CN>#i zDV?$+8!9cKERQ_cU9%APHXk1NOuoc5}1LBaMEr8T~%>bfR+QEeew*SeDOK7RJ^=-fw%W} zAT4Opd$vN{pMg@)F8f72&-lOOD2Ql?$i~q?v-z{^%6#n9b86~5<{=t_0-Ka%N~8%p z*DRNfxFdUdCLv*=;T#h9b7dH=T?6IO6+SdqG>f_D=MJNcCG-&J4r{R{OidDCII_sy z%N{G0#l|G^)9`5GVYSI}~V7IWZK1{H#~ zgyM6zg<%w3#X&6Q5g3K}C@|&G1+A86uU70zmvM(O(Fa66q-!d3tOSjmPY|%tKp$lh zilb*J)PxB2y9N^saIDo{oVlg3Fdr(`pLP;V5@iD5a%gkVNd~-PVSy zN~o29b;I|*_g#Gc`Db|j`YrBmH=J81vs^^cSRm^KSRcSIpJ8n)e)_Yo@XKGl2I>LF zrPw*#aafxQNVr3V16%0At1S&_Wqh9rb*e^60C_=_mvsGSX!~}=9h_FM_~XMnRHM2x zUq{gw!)eXST_3zB(TuCJi3S=Oj~fcv&ly<3k_tc(DD$IUBU3@0?9m%tYq@C@hvJQw zr)TB;SsLD`>ETPk-XedS_%{+ zu7N@nzgz9svgdv#@(rhjed}BIK!7oZVxA}=T8%6r7?ep3ygbFMaYWEqW7lMySCPp! z1Q(ODX;+K&x2Tva!Ias$$H+-)`UjTW)y(2iQ}S3PKi;E#qwa3&kvSR}uF9bt58vh^ zOtB2{n$)OOm?-jA2aea=?KIRpol29ileT!GDN4g@PQffOnNd5F;{|?a>>cXA#yFam z+D{EDe9*fW0_9)2C-U%)EQJ_$+tS&V_E{j2CMPx|?`||^^o6Evv{c0MCuP*`^b`d^ z9xd&No?3Pi>OSkS{|#rvzl0E&*xqsR2p$@Fims?Pv~%{T7YdA>3Bt8aA2p?X%`O}+F$m5AV}AyU4ctjv8gp8mEMn+ZhaIsk z(@LB#2a{kd2jBsMZQW4T3c6G@A>3VVaecSpc_~=x4Qjmt-#kZqdyA7OFQD76c2M7NF--T+#GQ$2vVbZ3-o0M(JD z%>W2u(AY8l>cA1MGD_gFM(gD5kt>BMl*%qiELQ}5Y8LRgE~Fj$PN*IlPv z2vrEQCE^K8fbO*ok7w1fl9SNZb6Q3EJEw|``(mI+({-{{4{LCPfY@eA#+jd%C%u0g zwdAG})S0~IX?b{?glYTwRA3vzVjMqhyeYr?Ah!6T=P8X zrrN*Da1-{qzypBGCMZo%p`iN}%lmuW9Pe>;T5wv9I2|i$U2uJ3EK9W|{sDDiXcKI* zV#A78uixVB+Yfm4<~=^#o^iei*2ZX!pi*&P7|azL^*+-F%nhyI0q#naAqs3BRYug$ zWIy}7M$JMy=8>O}&wne}$f8P=MtCYc6041zW+hJZg3@bC`pJANep`6PnL;!Y%;wO6WX!4zxCWM&dI7u68>v(=m<;)ZuvRySM> z=cr?3B{e`AWKxZpPG2xc%2{O(>K;pTnJvYELU++{V03vnnmG$J2#-@ubtcUyCb|*v zuK&tDzvvh*jeB2NL8v+q*J-0N zG*hIbC!&mhNWBEH^*4ll{&r$W#Nt)0Kk(;qzf9A#)SG8o6o1$JFCXYRp@!qWrOAyy zk@k|%UJJ*rAe(|B{vhZEnv#Yjo-r+D#3zlXdfa7-iG0-d+&0RReS5bYQsK`txX0*N zO_-N3;$+`tiFYQD)#!o{k5N(pi&D5o`z+}YwTZSq)2rNF-<<&CcPOCJA_7n$7N0nF z6x|%q>$*+4sfjbvTAS6W7E3FFm5Nb+B+j55H&Q&l&vqPcnsj(Nd1Qi#t;Kgen4>rz zi(653>5m8-3s-_sU%&b2kp>9_8ze5}3p5e}> zCon#k4MaYl@|suX-Zg6H__bsU=3#6gBf}C?40L7zj(YNl8JGqQaY{wX7PUmuW;Roi zzmJ(5fJX@g)5$&Tp%kAF`|MDWApDx#`5bOjU#91ohl^RG1dPv%!tI`rA;>4)=*xD7 zO-k{cNcVdZ(d7Nn-XN-Y?1j#B)tWC%iVsp#e$d!#b%S{wOV^yQn=@5)MjmKlKr0gV zO7|ZSA{$XAX%v}qzALVpIqn4lYL*Y!43%Ocf+m7Z3A`+*Q~|BsCFR4Zl#LL74@nv0 zIWIC@FdE1;L9>^uDEDlM)?fGKK)600@Z$Og*QX;+OU2<(aX1$6p<GQyk$h5>ZN+-TNjm10)D55)~7MW25R z5=GB``1%M55?NQ{`=+GMCYtH$p0nwnwRqx-sdv=W!DM(ESH-9)nn`@&klm@h5!qU^ zhF$F7v8Kw^G0Z5~a4ZFd3LY+Z02kEL6+WELcz&!nU(UF{FF4kU!xe)|1M!BUz>$IL zn*%=n&I{me!79N0dBY}(vQ#S!WPY}+c^lb$w8No}?^mM$D6tUNy-ZaxIm0GJmF^U+ zR4q3wyG)Dy*#mLv%k7eo{*o|kk2MAy4VxOWG|(*M7bry*UH=VAh^Eh|&Q#5z&;=XLIB=Ht-vqy}7yCWpD3t6-meWfaCyitdy#v(NH;Jr*hO>e5C5Y^I9DR9GS8y z+b1J%DHadI(XWAYZJ~^#aDjI>Nn-_r@t^`_f+$1Jz=u1*PrrJDS6{ux+j7K%GV~%q zsZcGrY%Q8!NrRT*kdY}XXlw&|b5_#ACui=BV%UeYJQkR-9Hq$>7|l*X4<-HffB=T6 zfM`ptw4nu&x{0x}wwr zPzo-Wt-n(?0V^ib>x7G8osz(5aTF&lof8AyHx{UqS~WXZi39H*3SZ>>NS%fWkr|(m zpYeHyxNk;L0y8CMKTzn7|Dk}5rCrl-08lJxB^>4%)f5?owpf;gtR+XcStd3s1u=q< zx}^AF1pyHJFQv!`!vv(_F33-+v>n`5xPuuydxCPw*(q` zxD@-pDQW02glK`2(vevo!lMb*CGq?DDaac3!r^vH=Uj`7tA=Vm1{Dpl36h(Cj-KF7#JqZ>yugW*)@~@GZ!jn)%qB84@yT!Je2Xo zu0Ec5U>2tC(QgDy0|4xi_NK~rC+s5!og+}AKN@Z;&#)xbPSgoL?(H*`i3g!xvO=X)BZ)jx4B5 zXtH2!1V}}t2IvLEj7zDwv>x?y;O-EbVhUXNlIu1ToJIfY15U$iifquWXTcW+YON@| zpqn?l3n!9_ZAewDKVBJuE^p?1y;|7cKjEMM)8E5=z2L9@^e^ymzv6y7gAQF>+SU!v>Ji(zhEr8#gR~0> zS6HsDP;dYFaY{Mv4;L^Hqgk1dJQvLIA&U-2XYOkQkc3Vx@?}jvxAV}_ai}3kpxE-q(xAsx*nMmF zX-o4iB{q{n7he?WkxQfvivsKYig&kXu)IU9jH}}jHwVJuu;A+I)R*|BS0LNA;j(Uc z`~DVhZ|`yY&~O%oV(B@Dwe-b|?Jva^iTP*j#sQu%)M6w64)JDkOQ-%NW)<>yGVEtK zE3hi>1pjun@0vr_u;Gd&*Jd<7NnN~`Yx=}OE9CEFU4yU04@q>N#Ok9 z&5Riu;{J$#N&cpdw3NU9RE?&8Y=|vpaY{^BtT$+yXZrd27}33hGJ+=rl0MJG&IAio z()@R#c!+sYaY!6Y8#=bQA)#bqDcjx9j|ORxqr&rto$*ihXSYyr%}1Jl5u5hqfl^1E zqpjE=y?JR359B@S*q2$Vd$a=ERFm*>7|8MZ2u@Ik+TcIOaUF(HQqjm1D@q zG?pAbSoOw+ZK&)`Aaf@PbbN$kO&Q0C zzhQKzu!{=f5_Ctnh-K{bhF~L|J8L_r_Yxt>g?4%_SOrvSM>VZyeCOj6e*1f$gWG57i-)H#(fcvSygABsm5nD9BHnk?1(N$s;7b`=gxUf zkPWEk0lqCca)BUYX+Jp+Vqr0yw*I102%BV9UIh+(pkte_nskVAh9X(#;_s=224Two zY3?8p>TY5Htu-_yaAgP|@M_!e*Y^!aG`s_2ZGD(omj#X3239RmSum@uCnTGOa*d|J zWLhX$t~{mXpD#$m!KiqIcoVe9?hFjtUbg41;8giaCWs`woV!K)8QkKG>QslvLs4oD3r&p*JoX!H84>+wARa?_?m<#USyum9GKAaZl{SDUB z5y$lmtqonYoX*f9D7!sQ%Yq4v$qPko7;a@n#R@SenX?6Q1c!h?Wj1%XrZZi_Rq5X2 z)_0olXUMHDY56T9K8paBlt(;}JT!zYK1A{%U3Od)qQSKsIlM;dC|ueSTRg9txbDg)_92JrWpA-s12sz@)gn!iAeM^RpVzwz~ zM`36abxLnyO+Zn%%Wz}@0b=o$2LNl_r|^m~?hi2)yKp1ML<41moBZcU7Bc8|pOP}O zRIe;^WE4ke|H>~2B^ZZeYD0E+ndJ~0q-I5v+G|t3r=N#*r=<^0nTA1&&xZ>#y4Eo5 zevWdF5TLYVK}ch&>4S9?AkvlGyJ6`pajrnM`#5!j0Zn=HTjxhdHFp)iySsX$#zXzT z{dy!3k~$$wT4tguX2ZX-q%1r1#V`s59U>2D=!zpi4MFKKEIz2zL2RMui9x-Az#X3p!$wuH%3{Pt@ zcjCnD92OFgRurz7i5s%m97oV5Y@3KtNidmcE@(BB@w=K9h-1#NQ{qV4UF3Das)|(> z=-R|{R0;}tltN_5v_3#urYI4C3oy-quFYXhQ(N-XDmY8U^Xm&I?klXFmhcKjMCOz<>L1|0ixh;N2d_ z(+O07Qx!~QhEzgT!m=z-SxvA_m}f>Q6Dn&PYI8r`*f6=vTEWEqPEI0<=6)$dUCdeXSanS&2IDH3)H6_QPxk1;pf*9EG)RquI!?I4!AIv~8s?j6D=LIfvr%G8g z-~_@-Y%x2f#VlyGcZa)cBgF3l#VCf`hVb%++7?-f%0s+bKkqw9FIC1r zxo42KH)wFr_S4tuLN_#wCQ|#}OjtqPO+@I9daYJ-F>QvZX|T`jbMVEX&phIsWJ;!k zjDD8>J!-$NYmN@_Wl47HBrz?46M+(j*zGmFh~i{5WM#%lC1M9i2tOVLH_vBG^op4u zu`i6B#XwY1EDF3z#nV!821CnaysDlLysf1Q4HO9P>8K>2dDz`4BX!waLY6P?#o}G zOf#O&C;aIzf5q?r`|p8ss|i*WFbj4dXl*~EwM>|5NBXiwh-e&=)?VRkXaE2p07*na zRI_F}R0waHp{GjwnyU%7C(3SO4l!hq4%A$tN@mRH?}B8K5_BXNXm%9zW!~)fGo`S@ zgpbaIDZ279Mbw0*r9SsXFDDX~Qa9lE{EeMb5cdj)aWGu->4wt*$4{M+G3ekZ1kEni zB<=q`+2VbOE|4tJMO*N*3vI=cKw3Y_$Yn z&{A}RT6e|Elzu)~P9A;_`=jPn*M6g(RD+U)j1+k7t!dp0T zwNoK-TrG7nTV5UZYT-^g@|wKTJadVCfYo1?15S+<^=Y__##$Gbuj1J(vIN7XG$J1eq=W|g; z)REeI$c{CNy?N}dHzHF)ul3Y+ncnk=*I52yQjZfRJEQxVqnH8(1KL*2@z80?VO&(w zz>)@Mi;$oQZOSzbC27u<@FyZJACV!KBNjE$$YRWiU|0qpV?R$g+#Ik!96*I}t_wcB zKH>3vw!xt}C5a*R980{`)Nyx)*`us^p*);>2?3^ktKVV(1cd~5H#6Qn+~Tu0_jtHH z;O6##{eF+#eg>C!KfA0#O-z|s#v`E=Ppucc|{Ci0b>S;P-TzDPiIv9g#Fzu?)Nk1S#g>K z%d+6pa)K@^WC5@OcPD||oH5<)Fx?*TGu`9O{Vg8m9e#K@VL$Ki!^cOwJfE>h#p!fx zL!XHo*1fJ^WlU61M6pg~IG|Me_@31d{5JHjxTG6!6m;esbPNzg~X3KvV0@{=!+u?)DWBEOr)XC-|cVk{`MBC701U9*sUw>=Na?F zIE#sF*3z=IiGhMB+K@2T>TVe3P%aOP3}jTff1T0~+T;vyce5lqNPqXY?dYZ*v>1Yh zI;SDao)gYRQ*K-?{0HUtu>7NN0*8Y<7f!Yi+ZIj5-Ar+b7-rMaH0E3)C2(!oo4YdM zRVuU+ru`jGy5Ntfs9^BID7!td)`nXRSDhn|lh}Z+pcUiTbWC@#`$r8=O5uEIUq7Rd z3NhqW=5tCiv4wP8RHj115rLF`=Gko^c8~erXGiw=a?rCIBX(dcu!uFB9oAFzUOj*NK<$EFt#euFA;qb@krAn^8MJ}lA zo^#B!6EaM^N9Js!B*tkAVa<~3em-e45E`>cofhV! z|7)3gL1@U-7Fq3QE9r0BqJk9AsXJ>j+YUJ|6xKjDxwWbW_O4(`u1?QY-4xJ6-vtk z?MR!PKM0GMKwyQv=(46*NzcoLa5SV z*wq(%CW;CCIDpBX3)m2zVmaM@1}!p=P%}z2A+}+63q?PoA=VN{Leqw~mYnG^%~DDL zK~0&{b`EhCcx7R^5zuU4sA9r1JG;mQ6s$c5(h86u?6Bj~yVXSoT1tQCV_=82BqsZe zIV1Vh5Z6kr4iE)To%|!R1~Rw}OG}Ri(nJvg!7DIUN%v^xQ~DVyv3!gY%(Bi!$sz}{ z&~8&?89}g#Jo`d}t?qgu>u^>#Zg-*QLz7LWOy527m>7C-VplTke7Hsk21fO zjoXcly${Uu2glX-GeeTCcmy9Sb@7MSeZDN0A$PdDg|iSwGNC41+>HE~vDGpNLQ+~_ zVx<0gT^X)*Qc$%sCxlI!9HD;pUvZ|HsKf^=17w+s109^bBaq;H_0Km&PYkF|i&9 zR4dkXHN#59S8v|otNZtOxO>3=`=>wQ`^QH-y*xwDuK@2*nNWqnl^dyx$ujM0mzulq zF_~qulNZV8;jaU8#~(ZXJQi=lAZauj`wk59+-jkgShY%@%TRc9Ad@XO zIk_@Ob9{>iWpf*&0LneFUKN$J=VC=5*OL$nu|I8dD^8!CFE+`HZtV;jV=jnYB&zZK zkQPeo@?qAWN_bW>UqWM=G@;I6|YLY5CyGkgv^bCF<(5I;H?l_ zOk3;!L{scb66sdEn>h*oJg1q4NVYDpcN!^Wkwb_(5)m-v!&96G7FUTY#=fE3P9~Kr z#)RBWYPfSdKAkPDkL;c&BXGgZWrLWDQjIq*`Py`8B#d;YT*g=@=~RqkDSiIw?xbRL zV2Q|p?(){5FYhE&z4%%w)uw87FsCKEY-vjv#~mA}$;POVX#!RqNf-6UA7phJr-iFW zl6v1P(#Z2nMD=1>->y39Unlig7=i>AJY38%##c})5N$?;s8O2% zR{NYfJ{%Y4w^=z;Hz7%0<0le$^ypVa3z}w5VLZY}I2fg57Wa|Kf82JH&@QTB^ciB% zvizLd8idlevLtaHZNC=Mpb2Y6xaW5+&3cFEr0h}GjR}NCf|CvgXCC-YimT}um%^Lt z*TpvQBm;W0=uc;u-jv|+hKQmKwVb6EN64Gx21lq+FbbJgZuW8Rr?xSHm5YVUsgsX z;Q$e#thFsqxaC_*t*COs1jRfN?rtW$dvn0u?bI^sZN??USk^Pn=QHMc-*EcNiXWd} z@yBofg1`Ro2`?`vlxc^8Vgui)q3A4m15Tv%g}n{3MH-&59a63yq`*gzE%b5*SRPgl zE-9ppV7r7VVUZT8d<#ytdpah^vgq84413@b+_?@$q zUGVnx1rKj-alhPQe>!2>-{O9raX8Gl+fR6VdxO8dIpD89KH4 zvOw(lQyQBRO-sL~z?A-Zr9zK9lh2T}>6qyYG}e?0m2%6F-C^4Qb5d4a%gng;-zzj7 zT84W}#VY$@W~$z%Zj)XFR>4_TR8rjTcX+cufNRCm@d@YS5zFf0lxM^*Bm+0-b7U7{KW3Q%I-V=xm82{ zs^wq{(PfooKf5T-d>N-1<*P&fN#tGziibK9$X&tgcv{PkQ5td_1r-8dstAYu#6Z!C z+5p}-pKa?3!2BDtNd?r><1BL#O?jbYZBD^wE7S=zEgY-pNp z_v{|M_CJ)G41dl$SwvF|OL`AVen`KYJ(fFJ+Do6 zUl=h|spl1QnQ%P4Ky|^}cei+WxWS%xkn;;pFOPUWJ)ztmKy$(Qw18#T2Htgr)&-w2 z;cF@QN^kKmRq@9a_@$NKGewZP1? z4Z^sIuh`F*_A}&g++Ta=x0p^`3NE;Rd|FB) zr^H~}T*f95@VA$XqqBj^fXErMmQKh5W6?996}1vRKEB}l>3{>@U@AwH{e<^7Gk)>z z4yTt}e1H6e)A5X20WNzKlvv)))6_ELlh}~G=kibz}75?>q{2u@Ir*FYr@%-|N zeG$DDw&#Hz2`+Yyu!|;509o3BNK#RV zFmb_5)ZHu=55Z1jBaIqS4M$8S1Rm~Uqh|!6KsQ6L;rwz!jzkT;hL9KCT;cVH2vRDl z)rOvp+nsK7v5X1tMRylL(@D_8c+JJA1365!#(7942z7_K3r*l|Q36(;jEvIUUMy*l z%nVUNRcLkiW~mjm-b3BWJz-=8<$+77igy< zUAWr>8JVJMw**SD_9D>EsG4!r<)K|=s%6s&NH#XKT8J3XRFDQHvv&bGyCcck}tpk6!l zJa`>`1}@4e7WwD#MXkNF-&=WD)OCESrYLp$H7-Vv(Rj~BFi56&aLhLbtZ zmqixYJME}uH)wRMt|k!$ch7iQmZ=IRO|r&~IZUXSV8#owio&Zo;T1R&=AR$%#W!#9 zoB#MZ{==`n!Yl`zUkJx1!SkmNIO-FYn|sK-2V{nx2`mDc?EWW7UR@c!Kar98Gt`lT zKsDzi_eC#Qy8zoBFt%`BkGf*Y=AZrpB>TCsE#DC0j^4XE0U=W#Vy2tK(wyE?GJ2(K zs4yX*K{9a#O>uL>rNwaFh`O^Io6wfw3?5L}gihjYXTivqB5e*wQiWE8kWfV0Y$Tmk zwbuB`A|?iOK}pk0N=T7&6%}h;V#ygNWR(zDcieUVUY+O$l8se}hjIj^OhdoB=|=3F zPV_)R@0HLEDUB3KuKPz`FS1d{6w>Ibh7yapi4v$bp}Q0L1hw_Sr4=zGQ|sNPb`Dp& zZ+H+q%Mgd7C{Ps4x>)1{qk61h5D`m=W1~ik&(OXv=vYhZCgyI4Oz5V(pf&i8Ku1Gg zj=Yu2(Y%Qc$KU(n(!*%L>(R7nu;`*V^j!6z_~x~`&4WDYLaDZ1PF%3lCy!g&pJ*rO zMO?6((Tv;??4u+^a4KAn(%ViMyC9jl*9f`p(mX?=tzgdkG>+M$XqOCLGI8kN6>2JF z@_`P5g=%xY!Uaqv`U8&z40Bfgiib0dj0kRQKI*;0wfQT>ytRu{^~(K(Jcn^}f{X;B zcF<`*J7U*XF%8*|UR0@GDs&(nS!xR_Mqdz8a?DH0v>@fAW*m__>Zml8@TN%Q*O$~B zBs?`!Gzr~L~egG9lq4v+( zDcA}{M_I6;4jq*Nf>c4RR#<3rbQLkg+uAOPN`Mp{@@n*oYaZcHcFZnywV^a+eRK4W z8Pt8~&>BmTIv%Ua37@sepLd6t=;r?bArxC* zJRBzc@b(UW{rHL>K0f2)hZoe7U{AAseKrtrg+KS^)tB~>!5o+}4V=3-|J+xNZ8$DQ zi!ikmtER((hlO^U7;m&gNDhp#q0Z+)$HUV=&XDXb_2x8g+>9D-NPT6078%pja{Qz! zUSD5uURFq%v8rGtOJe5s#8f3Pt?9E)Uq3Y`9;f0tP-ZT6(T;t=(D3T8w5NoV+G3g_ z2asCv9eIefaRHE+hq(P5Rw#hg}m!kSvDJnxL3$VWVJfLmOFEOw+D?uj>Li9r5}1f(tVu%!=gC*p4{6~`A$CaOFL!~Oz$%%T}@kn+vD-Hw~BOTxxg9XhX!ZI#EQgivpw% z&U}#@Iov6`T9SHGH?*C|n00{=_q!y!LL8$OHJA|u)CNgoyVhJa1prBH%OTG^5BF7P z!1!{UVxn#?V;}I4rUiMLYXxR|JiB2|d>H;U*9(L2Cltk_1>dPR@n&ZvK8*ux%8Sr& zp35eyYs{zA(!TT%C$U5$c0`(LU^CPBbv>ZXy|oP~6>$X&BT6DOb+A&7gj)u_VOIdGuC8++Yi{ zRJ*yhUe)~-dXX=iT|8N!$TWJ~I1PI8mQd4Bk&?U7m-T+1wSjXULNy*r#w^BAjJOQ} zBOZ%e7Jy-_nUNsdCfFsl2(0E>o|s!?)9M+DrMa#RrCthSzdJxxuwvK9F<4PhP>8U^ z{hs>CtspgvEYknwOjZl=jz&{0e&&E;I9^IyYWl)bl?LT~DJ%Avpo=fy7AOQW6Q)vd zUKHPbe8hg5v1i8p1iYK~(1!=8te9!S_dk5V^YanKvNSzLPEg##*>kw5i+#B;lo@3e zlvN;An^T`A3;da|u8O9(n|M=Z+@yidt!2k6xzs09dFF2nR>#5@WdV&}|>|9sq@`552x9bVJ^A7c}$Fw^% z!6!BRcbR5XsXo@~=VUtHLKqq%J!wK^6O|V#t)I30c%gQ#h!wq>a%EK%n8;#s1X9J2 z)`S%ey@_x%N~7qZ2}-mm#O4Ww2~}2Ma0O1P2{Ud2#MU6gd?ag>L^>nGF2kwA=AbsquNp7t$(V$28r_)dXjAEKhbE7A{?Q$jzBAj-HP|P+M0Ti9%Ik0Y)hV z)NiPZNG9Fpn*OwLi8oTgs1vjg81r4zXXPnyM?2La>LALCx7imBEQ{uFObd;K(Cs9e?soHgQmh{DqRXBcJD{9>E~Y(5tq-u5Se%V+ z*7jLeQFLu12W`o}3}&(cFZViKy|22A>FJI)>V}OZLihQHrYVDq{x@Ub_<03VJoM_4 z5dS{WO7E77X{E)rc+8N$D#{^xIgg*#N#^DCC~E57^m39r))gmwV- zsOJeZ6=143$%2IiOPMgQCMu!`sF(3EBo#$@Q$w`Jh)>mPakf_0!b7p%NuM>Gc zl~Bo)W@hMpvknB8B#I&$?vX)w>=9T=?cy#*3eKIoJSElDw25`()XVo1it>Z$dxN&E z0&}A!K%^u0rBz!&Buhp>GuXG~A^AR`OD}z4=vndVvmWhP(s>*d)C0=12cxWMXZa$? zHEC9*7)%B}%WAWmI`r$5i61%&hO>JiBCk|8gfi;FdG6l?#gv|6hTB(inu5jq8L4{R ztbjz|;2g)Z5fSSEA@3pqP2zsGeUI-c1l{CGSMG_xqMMkXd9t~%G}ET)K#AygZI9O- zdiQkSg)!w~%){f)KF7_PIMsiC9HcXa)@re0l;Ilv3@1g=x%28h!iPElo*5xB?Zo3Q z3}H1{DXlhZ)<7?6rNOp5EGMZ`KH=0m`?KRIP0_O#{Z-a~A&C-nEKG{+e#B~DP>#>h zM0Ux!u(rLLW&e zw{@dml7tJTz}(HQB|k~o0JL4&cT!FlFo;F;wr5m=sO;1vr7oDm5L4j5P5``ji8mkOs`QbYA+N2(7JJwsLqV@OQ< zAyjeaNITSuA$S5}!!@!We1MfkmI;y3#xlHBX?cMt1~9G_Dhyp~TgVgRu;1bK{ua}2 zMqLbtSQ^r^)&(RK1*JEHZLq?FG7VXI;s3m;@u_V`fV!fn;C7zz*~1;)-0ku3<`(mQ zMwtjVcej}58RumMV*=AFUQY{d?mxpbG5)tdeTV=3kAFs43J!9E9nUzcpcbI&ib7<$ zy`^1J4VczmEU7I6r`n@uNR}96h@oKEn_*YaT(zTaIcRDJ*$Suw4fg|QC1ymp^7M{R48Yz52I@;!Y}E^V;dmHf30bd&N*2Dc0+HMjOR0Qi;z-xt&q8uiOa1&YVXNU+M*9FVt0v5rWy5jKig2S$TzU5|*hx>cn-QD2* zn|r*yyT`YOTNL>l9zVPqZl;>f*tQL5#jZ?08{D3k^s7{k@Z&M5)_NK=*#ee5*L+dU*r*0`+2p-stsG4 z`<|qsfQx6(0szgaQR+A}$NNm_Igf=3`?9ZP$9hgwM}Si(d9xmnHMu5q9BhXBF})8w z*qS63Olm?hVlr`9i%|i)z^P@Pi95n-h1Mf#UGVwa8~pt9_qg93P?s}K=M#SX_z^P} zygR(XT-#H(*9k|9l@U@@29C9&vH-N=XLkqur=NX>KP*3BSynI;c4dci70YY4^INt9 zS&kgDa4|W$SoI=nu{Vu8+!w5VDO0y*FB#j-hbtp#u)RC@)Gw zbdBnG=Wg@OdrjAeio5M_EvAHcY~vy0!%4XYiIo*k#Ha2gT&qKlm)hFod-~w@Qgh01;{SLP~#+UCNP|A$`%^rXK>qi`4E0(pQR-n*~Wv#7VDJIn9YReF- z!KUV%Ygz4ptkU!otf*v&{M`X35tMn4a&y3IJ>gG}k2wGCUvWRp`0~TI_~!3_jj#TG z!ax1y*Lb+!SywEzwr%y&o}KfNv0rbn zJDfpfLYa3c^FEdi)q2DBvouE{u`O$j?q}N~RvY57fMmtQ6$fg<;8hAL@30bKl>(Y~ zpcPo_YR+RLy`|hhfS_C;wJ+=yO~|jc0#c%GFJAXfQ}5CI;1f;@J_J!h_4>lpXD&(N z)G0qsA|MykQMfmFa5y6b@tNaF*>RQxZyV%>2_S8lZ3`==woGurt&(1)c;sb)`255M ze*+Dzjw|`@cHb@%GSjUO0et~l;0WJLLiFWJc6g5q{qdaDbPiAuXf)MCUDWMDrct0a zXeMp(m}9zhaQJ%El$jQ&BX`Bli_VX=y1B67_^Z`q+-pecOEu2_S|&}opd;}b0uF8t zr7R%rkplfb<=ht!nZB;n>Yjj zorr%#$vCdzaBTO!#KL|^dGtPxx?|4g9b~i6SaK4L5qm@^5zFCip^+yr#r=zjk1t=;$pIM(Z#G3;)M8Y)Mtb>uZnxltpADHGmR-NM+iMOf!ty2 z?^hafQx?Q@`(lq8rSzGqlY=C7Ol^4tRI08PZIP^!3078*h`UuA#WI)yUaJ|6l+hfE zjt&#)@gq+2iaMpCGJ0k=G0JX-58r>nr|%X#{^1kq*RLo=QS=FPIOC}tajt^Xst}$* z^$4vMyJ-SR!C~ElumV)On^(h;5N3rTS}loJTG>_Y>uDL{EeFShXeIA_?fG`$qOZnc_9m6JW5@``ZVGdC&vUU=y+Pk41x7$Qg8LKSRYC5$ToVxTJccq?Ru4&em z`+d$PZIAYiyl|t%Xt_YsU!t=q`c0+Y=Q}dqBRRH9uMpqG+b%-}w8wMgm=6v!T&Er& zJ5ni;AFf1MToU^w5OxszH5u}|Ibx#5#`p>;a3jFh z!T0Rd87DVzc6lQRvlO|V+6bU3v8Z=5z(~VL)Rb)J&h@j`T|m&sHZaqczFQ%84rpY3v@MqS+v{iGt4t_oa; zn}8Wa7d?Qc*{8ozLcmW=b9>2KhIxL>CR{SKbvtYcL4z5{4Mf=_k|s`)XMFy19=4M0 z{i?Nz$%@_d+IP>e`9G*we3tc6f)po3C}02MKmFHMz)~QTHHNoHNF2*&He@_|_O^DV zr`n6Zy4prs;~G^65t!G&(MeT9(f7Z+IOWJ0vI9UH@?CcXT~C-vuvW#H8#ey^-5y`v zAMnMSJ1nx|&p-Tt47^yBmD***kpp{w;2HGv;~1Zoh9=f30n4z>2&32dtRz-@pA1|NJk%!-o&g z*iU=Ns$gy|?-T)MvIP!TVWdbZY>=g`sIp;^_NUC0`&~gE&5S<;l+ZWmxf>S@Udpm={A$l3B?P`*-P9HKUbJb( zgx7?yYsjFw@IHE~mj``19|g(#Www-gRFrM(=1V*x3&aGVOHh^+u@|KFDsm6yn+Bg|mTC}QtSXP>?!Xme6Hab?yg+gI9a~MU2#d=!s zx0fe8e*6)vinn*SxY_OO^P8J0oPmX;y|1Seb|B0I>}JNE86Q`{Qdg{X1(yl)Jhi)6 zDhlz4H#CH>gv*Ko8QwEx<;viByJ&Jp3q!dC;!S!IGrS#;Sm*&61fv1Cdls1F#TmcGkP+z!vqWXKxJdDQ* zWs*-tZDG#Magz%ExSMmcuG`P24c{rFiA=HtS9-`!$WLCZe*r#hP13)kU2y{!;zwDtTu9?ha>e= zsiD%`AtG$`AOTw1e;2YvA*1*WXs&mKHeo}$t2%9gf~pZ7OzJ`lW{rGhe=j64{tW_Ygpl~CtEds37?;wfc`%jBd`><9MRyVTCsSVx4 zo=x!ulVJyKR3!D62)ttS*&8-18s zzABXocZVD7_Xkj!QI)Vty8-L68fB|CS7BY7TaXz`tstI2Dws*JvtDss4RT&4h_c=D zEeffX*aXrEuZ!Y`nG2{C z6rN*H$+0l1L4#}Wk3HYg1htL$CH5H$s(t>|hcar&a{yB*C{qDca9&od9=Sqn*WEy(W=P9_ZQ=DXqE zNNB9Su#&rwHi69dX%Dua8I(WoQ-zmlYACDlzad!mgfI^0lc z7`t(w=DsWoUAkk56T+L4Q@sCYHsVfUJA0|mOf-EjGZ7|>txE}Ejr_^2=P&WOSXsg3 zKc;qGlnJGj{<$z4V%CP&rNpAut8exhg4e(H4$uEJ}jKa@KiiOJn@`!VIiw1Y+n}}G}u`d$ZU)4x`FcMOjsj>;hF_us@tuA$nThQqU7Mzv0jh6S(BjCDJ!x; z$=h8fW=2#0&mz#;2#->mII|_ewqL6%SZg!xEzV|~sXS&Y~YaM!vehnp&mFLsb z=!RB|W()m^r7r)}Y%ayT5YZ4}pw!n>?A;KRG&f5^X)|gGx(Lb7F&7v4d_F|5v3oMp zRQ9`SuOi$b?W7;s77%I48!lR=O{P7i{-67@_~Nd_P#Z+36t|TYOvq@jZ1jq3XC$M? zBC!I+$#q0QO(p118z|7|I^@DmGNJ_GV%koLr0X4U40DPebaR~eXB)La|DNOC8Wwl< zyx6@FWHf(H^6AePIGJ8UB=PM?4C>2hB)T&bT~wOtMh%~1W&I(I1Xx5YC5J$&zr{3| zNsxZ-CHLE^5t$Zom7M8OokO9x$jBSa0qw_{pSAwEU@$#(!2+_l$ETDjS|!JA)23hX z+BW8mp5ep2Zsg$^Ginc0s-e2MvUs0Py^hRhTc$ODEk$gdSO54=|21*FhRls9x(zXGVa4?1^;KLzQsU6%!Op#qu2lI|9CZv&a2` zasT!W&ifgE`t*p8&o52sepVchD@3_vNQaA=hNaf{tmX@U{54%l{qn*y>}0!79kQfu&sLntePy@_E*Z;gxGVQ}firK^hFWyjRBj|jby zrH;mIzr=uL<@sRGvy;3DD`o0SQ2RX!_r+PIb1XcWCn%NSVxnju)AyH7;+3fn$dp5EUZgc)QS@YGgInow=30HM-h|=bJr<@N>Lm{_CsnZ4} zrX(5g+6TAs#&#urBtsL1af?!K5*uat1m+p_v_M~<@MaR+l^IeCzJEI7gD6&-P%vRn zd#J7uUE9K5fMtrcOn1+N(^+MRICXJLe~x@nf8iEzF#)++y({=6HRNEzB!{+$M`^#t zj)HCtap4I&+F{0w;3*Pi8g zavSOsO}3B~%P^`?S)sbx*(R8HLMe0VcWH2L#x5pJOJi|LTkN<7dapx@rSAo(XTF4+ zSNh;Dh9}a00zUZS&G4zY|I?yIyMnSt1{8;?J>Ii4xZzliq)b(y<*Zyp`;gW!{usC`b6A_19ic^6dWePX}<@Tg7fK&Wj%wZmK(L!wK>{2 zE9?6*)Ul|=&YQqVlU@pb@_=oVXAI($OQxFzNk3V}qOm(Ti(!Qd(YRoXMHg>;J~}L* zL7ugT?wCnSbm|FOfudwv_NW!wng)M{f=PHw9qK)zo?D4<*moqS|7qbc;;zBx=sB9` z3o4M(?@icH$*CsB{sJ)=1m;{+eETT$>2F&%9vtC0%~TUq&dEyir=Kl`A=?lb>P zUEpcAiG&L$Vav=dhZH%|2hKW>OEP7L-D9E}=V>0+Y!PNUkkxu);|ltiF4(!ll#uv? ztB^v#$k+%Fqp9@8So`-y>l~6Lz1e4@^oy z3}|`C88iW)ufA%aF*gqeFCUx0Yu`?-Y;DFmIIK%O9@gTwsVxji@xQobVPg^B$< zINoIrfvlfzePPiT^(~jL0#z^<#_fKGo81n(skEWAVdp(>RiRkd1#7Jl$)u$;%(^a^ zxd}u>fK`0(v|=v6yx&2Hu?UiofG*C+AaXH{gU4ZAdGfl5+7bcOV-|?|!Y)2fD)!zrvEA_`_{-A^KAunb z?!yoG^!yQ@zq!R1hdqAt#pn3d+qd}q_6D~%JM3<6v7q2o6-#X~N^@ygcJ6p;i+ca7BWasc%JBFx@Do64drr{n59TCzG2vPxMRBtsW{``pIic6s9J8IG>l8C-mngl4C!L95Xt#)&TpS_L?h^= zk4}+6EZ2~tZ&o{mi8gt`zK9m9KNx9NKoMh6bFC+R5!P7~DR(>JwOu&vz2a7gbe%E+ zT&(ZOYw5O_V-s$LGkTb)a^E#k$4hq|5)X?_1%{kn%0KEH9T^!7Jl+G$1EpsWX`q=4 zNF4(%hUreOGZUCHb3?Q9cam3{`RMMP942ouDz;)_R%fKk%FtE7<9A|DxT7&~$Mi zh#J-xX}&y>zS;>FvkbZ45@>6W^~^x)yiiwYoH-QEQ%%x9=_F%!NQba4(x3YRIdaXj zgSdZFqSC1Y1W;+u`e9PY>m%s+g0H{+8n>T)fpYs65AT10Qf|RAgK5IDo}r~;r4@o| zV_ctyn$VG3tc{adilw{PE);nBTAO2jm1am=wb2%Jsm)1m z`OZ}YOKr5yD(#;?ud6NS+h41?K%~ujtC3`>w?jmVefGw%ljN6JfuX)>@jY$ zy3^n91z$MYG=j(Y7E1IQwuQRTC}|s)a|5>o*a+adQDXqLwHU3SS(y1U_4Eu5;-1Gg z>lHZ$Qj7so^hFoyaoi(Oi+SfpoWwWU#hjU-3`)_x8!i+SXIl_Jf=awL(}_I^jQ3us!*X32pMPO>dlPf`T*VS2Fcw}5`rB`1)_*_zkv^O4Y}pHMH1?9TMnq8LJeD7``2TaIVn)ft`#eys8Rt` z?B^9lk0=7 zPK6=(NO7~9@Nl!o!|lFd(Qj{Xv!5|f1-p6f7alVz6SU0u<6nQkZ~w>d@rS>BkK=Jc zAyZJ4DV8CQsbqJ}2I0w@h@?zobFYyreOLO$&EL6SNdCQ>>=2F*gxeCQC$<(^cHAzbhxI z;pp|cvt6GPpcASV=(NLG1uy3#R$T#EFhOy*E8zJJj>i)|9iMTM6)4S-al7B+et+9g z(>Hs(XvO!RKH$UCGwMQ^bcY@GSTtqJCbt0+sBPhyk=p*ct2-Q}pq2?-D|X9*>2AW0d%|DN zC!C%t_QI&V;5eNyl?l_CQRW>!@d-QGf$QAp9a;=6S9)Gz$vH9GA-_A-Q@(8|<@mF+aTAT&7^{b$b93kAMd z*7r+P6G6XgZ(i)kzrS##%BxtT_tw60P0OnG_vSK~I;`I6vGgtil=kM_F_71P7BR)R8 z;J65$&r3T$RGXWQfWvNwLWHUntArc@jCL-0rqzBo<9430P6c=S1Lnf0Ys*t~oUd*9 z%yDYtkA&v)u^3^)3$pV}64s01XG~v+`y$cZQS7+=h%!mE1|K|9hrlusNUD8asldyQ z?sRWtw|j_~O7i&F=TFHM6it8&FXEXI!%xS3~g1=m>>VRx*E}de{ zLT?jeh((Oae|Flllf@8#;q>XD{3!4Z}Q@QGwg|c=F z+~&5R&p^>ZDr18!rY=q@Z1telM%Jo}xeBZ0v%5my9FnE9TuoarX~GWby5f8~;&?pb zysTIR4b4u1-BfTt@9=Oq;NkWLw>Nw24hNid#c8d0T`GtsFbZmILhu$Z#4)*KAR>4k<;)apZ9j*!hY0>5j$DY8I# z6Pe@m4c16kZ1*}zpF5=Km4I!jiPR(KT6;tGQN2V)YOJ*4&xmoQNGz#FtaTnD;R?=P zgLpN%fRZs289~~Sycc2X*t(W-v`b!ODp)1XXks6j^FV9K&L`47Xdc;_UEm;UJ)2s zh>|z6m>5kIt!B@R6mUBrqJ8F5s+hRlYNzVK9= z=Q`5dV+tkBQ-(MkjEXJmt7y+Qhr3W~iybk1 zgjfuxT0}~?kFDd;OhZkEH>YmosH`#H-9%2Ry)+mQ)H#oNYp&`7>mGezWH>kUkt8Se zcsHq?=j;ycA&xM`kPNfQapCOoE&jg}0Rt%(GQGE1Tt+`dwW6OA>s>;xnO(E z_;mel^v^EhX9mZ47qw)n99*Dfb)3@&y&iRPumAh~ma!fJO*kgRCQ9Qt(m5F#dv{H7 z?!-N!iPmCdM={zh(le#t*vxAZymvBekCTm>MZ1I`2$P$|ci+#jMMHFQU@Rnqm_Vu4 z!9Z&E`Bpgf(J}MGd>gjUvSnsfX|aYW8cK)H_sX)K(wt^{Pm+s}X`@H+XhBL;KmVQ* z;@)PGI@GItVUnY5-nmCYauX^d�VondV_Z0oP<8^ShP03WE~&n-dian;iHM5-0jD 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 z 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

    !=i0w2GM*+Jl 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 b?ZE#JHedHD0vg=s00000NkvXXu0mjfyWDWu literal 0 HcmV?d00001 diff --git a/python-mega-algo/compression/image_data/PSNR-example-comp-10.jpg b/python-mega-algo/compression/image_data/PSNR-example-comp-10.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a137ebb1100f6d9d774d9366b7ca7fb63febaf47 GIT binary patch literal 106150 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�ihU{<{^3 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 literal 0 HcmV?d00001 diff --git a/python-mega-algo/compression/image_data/__init__.py b/python-mega-algo/compression/image_data/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/compression/image_data/compressed_image.png b/python-mega-algo/compression/image_data/compressed_image.png new file mode 100644 index 0000000000000000000000000000000000000000..75c41c21c7b579b88cedfbaee9ecaeb919db5683 GIT binary patch literal 26684 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Ð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 XP;3!Jj7l4S00000NkvXXu0mjfCMpBg literal 0 HcmV?d00001 diff --git a/python-mega-algo/compression/image_data/example_image.jpg b/python-mega-algo/compression/image_data/example_image.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3a58ba3a8c338e08940c4494b4edd799294323e3 GIT binary patch literal 29986 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 s9am|bRRv=;_t!^V@h8*7d?f;ZVh7rx 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%0A+#UL&&mho07?U*D6J;hQ1F=JqT`7O4W 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
    =>J#rO)?a%I-AN-KLx#MCO+N!O%%ntC%r8#+nb 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 literal 0 HcmV?d00001 diff --git a/python-mega-algo/compression/image_data/original_image.png b/python-mega-algo/compression/image_data/original_image.png new file mode 100644 index 0000000000000000000000000000000000000000..09a76ffa8ce1de9b6a96718074a32b341557e76a GIT binary patch literal 83865 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 z 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�Sb5QGN=^8)xhfJ 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 literal 0 HcmV?d00001 diff --git a/python-mega-algo/compression/image_data/right.html b/python-mega-algo/compression/image_data/right.html new file mode 100644 index 00000000..b742f36a --- /dev/null +++ b/python-mega-algo/compression/image_data/right.html @@ -0,0 +1,30 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/compression/image_data + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + + +
    FileFileFileFile
    example_image.jpg PSNR-exam...10.jpg original_image.png __init__.py 
    example_w...ge.jpg compresse...ge.png PSNR-exam...se.png 
    + +

    +Folders: 1
    +Files: 7
    +Size of all files: 5248679 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/compression/lempel_ziv.py b/python-mega-algo/compression/lempel_ziv.py new file mode 100644 index 00000000..6743dc42 --- /dev/null +++ b/python-mega-algo/compression/lempel_ziv.py @@ -0,0 +1,125 @@ +""" + One of the several implementations of Lempel–Ziv–Welch compression algorithm + https://en.wikipedia.org/wiki/Lempel%E2%80%93Ziv%E2%80%93Welch +""" + +import math +import os +import sys + + +def read_file_binary(file_path: str) -> str: + """ + Reads given file as bytes and returns them as a long string + """ + result = "" + try: + with open(file_path, "rb") as binary_file: + data = binary_file.read() + for dat in data: + curr_byte = f"{dat:08b}" + result += curr_byte + return result + except OSError: + print("File not accessible") + sys.exit() + + +def add_key_to_lexicon( + lexicon: dict, curr_string: str, index: int, last_match_id: str +) -> None: + """ + Adds new strings (curr_string + "0", curr_string + "1") to the lexicon + """ + lexicon.pop(curr_string) + lexicon[curr_string + "0"] = last_match_id + + if math.log2(index).is_integer(): + for curr_key in lexicon: + lexicon[curr_key] = "0" + lexicon[curr_key] + + lexicon[curr_string + "1"] = bin(index)[2:] + + +def compress_data(data_bits: str) -> str: + """ + Compresses given data_bits using Lempel–Ziv–Welch compression algorithm + and returns the result as a string + """ + lexicon = {"0": "0", "1": "1"} + result, curr_string = "", "" + index = len(lexicon) + + for i in range(len(data_bits)): + curr_string += data_bits[i] + if curr_string not in lexicon: + continue + + last_match_id = lexicon[curr_string] + result += last_match_id + add_key_to_lexicon(lexicon, curr_string, index, last_match_id) + index += 1 + curr_string = "" + + while curr_string != "" and curr_string not in lexicon: + curr_string += "0" + + if curr_string != "": + last_match_id = lexicon[curr_string] + result += last_match_id + + return result + + +def add_file_length(source_path: str, compressed: str) -> str: + """ + Adds given file's length in front (using Elias gamma coding) of the compressed + string + """ + file_length = os.path.getsize(source_path) + file_length_binary = bin(file_length)[2:] + length_length = len(file_length_binary) + + return "0" * (length_length - 1) + file_length_binary + compressed + + +def write_file_binary(file_path: str, to_write: str) -> None: + """ + Writes given to_write string (should only consist of 0's and 1's) as bytes in the + file + """ + byte_length = 8 + try: + with open(file_path, "wb") as opened_file: + result_byte_array = [ + to_write[i : i + byte_length] + for i in range(0, len(to_write), byte_length) + ] + + if len(result_byte_array[-1]) % byte_length == 0: + result_byte_array.append("10000000") + else: + result_byte_array[-1] += "1" + "0" * ( + byte_length - len(result_byte_array[-1]) - 1 + ) + + for elem in result_byte_array: + opened_file.write(int(elem, 2).to_bytes(1, byteorder="big")) + except OSError: + print("File not accessible") + sys.exit() + + +def compress(source_path, destination_path: str) -> None: + """ + Reads source file, compresses it and writes the compressed result in destination + file + """ + data_bits = read_file_binary(source_path) + compressed = compress_data(data_bits) + compressed = add_file_length(source_path, compressed) + write_file_binary(destination_path, compressed) + + +if __name__ == "__main__": + compress(sys.argv[1], sys.argv[2]) diff --git a/python-mega-algo/compression/lempel_ziv_decompress.py b/python-mega-algo/compression/lempel_ziv_decompress.py new file mode 100644 index 00000000..4d3c2c0d --- /dev/null +++ b/python-mega-algo/compression/lempel_ziv_decompress.py @@ -0,0 +1,111 @@ +""" + One of the several implementations of Lempel–Ziv–Welch decompression algorithm + https://en.wikipedia.org/wiki/Lempel%E2%80%93Ziv%E2%80%93Welch +""" + +import math +import sys + + +def read_file_binary(file_path: str) -> str: + """ + Reads given file as bytes and returns them as a long string + """ + result = "" + try: + with open(file_path, "rb") as binary_file: + data = binary_file.read() + for dat in data: + curr_byte = f"{dat:08b}" + result += curr_byte + return result + except OSError: + print("File not accessible") + sys.exit() + + +def decompress_data(data_bits: str) -> str: + """ + Decompresses given data_bits using Lempel–Ziv–Welch compression algorithm + and returns the result as a string + """ + lexicon = {"0": "0", "1": "1"} + result, curr_string = "", "" + index = len(lexicon) + + for i in range(len(data_bits)): + curr_string += data_bits[i] + if curr_string not in lexicon: + continue + + last_match_id = lexicon[curr_string] + result += last_match_id + lexicon[curr_string] = last_match_id + "0" + + if math.log2(index).is_integer(): + newLex = {} + for curr_key in list(lexicon): + newLex["0" + curr_key] = lexicon.pop(curr_key) + lexicon = newLex + + lexicon[bin(index)[2:]] = last_match_id + "1" + index += 1 + curr_string = "" + return result + + +def write_file_binary(file_path: str, to_write: str) -> None: + """ + Writes given to_write string (should only consist of 0's and 1's) as bytes in the + file + """ + byte_length = 8 + try: + with open(file_path, "wb") as opened_file: + result_byte_array = [ + to_write[i : i + byte_length] + for i in range(0, len(to_write), byte_length) + ] + + if len(result_byte_array[-1]) % byte_length == 0: + result_byte_array.append("10000000") + else: + result_byte_array[-1] += "1" + "0" * ( + byte_length - len(result_byte_array[-1]) - 1 + ) + + for elem in result_byte_array[:-1]: + opened_file.write(int(elem, 2).to_bytes(1, byteorder="big")) + except OSError: + print("File not accessible") + sys.exit() + + +def remove_prefix(data_bits: str) -> str: + """ + Removes size prefix, that compressed file should have + Returns the result + """ + counter = 0 + for letter in data_bits: + if letter == "1": + break + counter += 1 + + data_bits = data_bits[counter:] + data_bits = data_bits[counter + 1 :] + return data_bits + + +def compress(source_path: str, destination_path: str) -> None: + """ + Reads source file, decompresses it and writes the result in destination file + """ + data_bits = read_file_binary(source_path) + data_bits = remove_prefix(data_bits) + decompressed = decompress_data(data_bits) + write_file_binary(destination_path, decompressed) + + +if __name__ == "__main__": + compress(sys.argv[1], sys.argv[2]) diff --git a/python-mega-algo/compression/peak_signal_to_noise_ratio.py b/python-mega-algo/compression/peak_signal_to_noise_ratio.py new file mode 100644 index 00000000..6c6c4c38 --- /dev/null +++ b/python-mega-algo/compression/peak_signal_to_noise_ratio.py @@ -0,0 +1,45 @@ +""" +Peak signal-to-noise ratio - PSNR + https://en.wikipedia.org/wiki/Peak_signal-to-noise_ratio +Source: +https://tutorials.techonical.com/how-to-calculate-psnr-value-of-two-images-using-python +""" + +import math +import os + +import cv2 +import numpy as np + + +def psnr(original, contrast): + mse = np.mean((original - contrast) ** 2) + if mse == 0: + return 100 + PIXEL_MAX = 255.0 + PSNR = 20 * math.log10(PIXEL_MAX / math.sqrt(mse)) + return PSNR + + +def main(): + dir_path = os.path.dirname(os.path.realpath(__file__)) + # Loading images (original image and compressed image) + original = cv2.imread(os.path.join(dir_path, "image_data/original_image.png")) + contrast = cv2.imread(os.path.join(dir_path, "image_data/compressed_image.png"), 1) + + original2 = cv2.imread(os.path.join(dir_path, "image_data/PSNR-example-base.png")) + contrast2 = cv2.imread( + os.path.join(dir_path, "image_data/PSNR-example-comp-10.jpg"), 1 + ) + + # Value expected: 29.73dB + print("-- First Test --") + print(f"PSNR value is {psnr(original, contrast)} dB") + + # # Value expected: 31.53dB (Wikipedia Example) + print("\n-- Second Test --") + print(f"PSNR value is {psnr(original2, contrast2)} dB") + + +if __name__ == "__main__": + main() diff --git a/python-mega-algo/compression/right.html b/python-mega-algo/compression/right.html new file mode 100644 index 00000000..62d593b3 --- /dev/null +++ b/python-mega-algo/compression/right.html @@ -0,0 +1,30 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/compression + + + + + + + + +
    Folders
    <Go Back> image_data
    +
    + + + + + +
    FileFileFileFile
    burrows_wheeler.py lempel_ziv.py peak_sign...tio.py __init__.py 
    huffman.py lempel_zi...ess.py 
    + +

    +Folders: 2
    +Files: 6
    +Size of all files: 17079 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/computer_vision/README.md b/python-mega-algo/computer_vision/README.md new file mode 100644 index 00000000..94ee4930 --- /dev/null +++ b/python-mega-algo/computer_vision/README.md @@ -0,0 +1,7 @@ +### Computer Vision + +Computer vision is a field of computer science that works on enabling computers to see, +identify and process images in the same way that human vision does, and then provide appropriate output. +It is like imparting human intelligence and instincts to a computer. +Image processing and computer vision are a little different from each other. Image processing means applying some algorithms for transforming image from one form to the other like smoothing, contrasting, stretching, etc. +While computer vision comes from modelling image processing using the techniques of machine learning, computer vision applies machine learning to recognize patterns for interpretation of images (much like the process of visual reasoning of human vision). diff --git a/python-mega-algo/computer_vision/__init__.py b/python-mega-algo/computer_vision/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/computer_vision/harriscorner.py b/python-mega-algo/computer_vision/harriscorner.py new file mode 100644 index 00000000..fb7f560f --- /dev/null +++ b/python-mega-algo/computer_vision/harriscorner.py @@ -0,0 +1,75 @@ +import cv2 +import numpy as np + +""" +Harris Corner Detector +https://en.wikipedia.org/wiki/Harris_Corner_Detector +""" + + +class Harris_Corner: + def __init__(self, k: float, window_size: int): + + """ + k : is an empirically determined constant in [0.04,0.06] + window_size : neighbourhoods considered + """ + + if k in (0.04, 0.06): + self.k = k + self.window_size = window_size + else: + raise ValueError("invalid k value") + + def __str__(self): + + return f"Harris Corner detection with k : {self.k}" + + def detect(self, img_path: str): + + """ + Returns the image with corners identified + img_path : path of the image + output : list of the corner positions, image + """ + + img = cv2.imread(img_path, 0) + h, w = img.shape + corner_list = [] + color_img = img.copy() + color_img = cv2.cvtColor(color_img, cv2.COLOR_GRAY2RGB) + dy, dx = np.gradient(img) + ixx = dx ** 2 + iyy = dy ** 2 + ixy = dx * dy + k = 0.04 + offset = self.window_size // 2 + for y in range(offset, h - offset): + for x in range(offset, w - offset): + wxx = ixx[ + y - offset : y + offset + 1, x - offset : x + offset + 1 + ].sum() + wyy = iyy[ + y - offset : y + offset + 1, x - offset : x + offset + 1 + ].sum() + wxy = ixy[ + y - offset : y + offset + 1, x - offset : x + offset + 1 + ].sum() + + det = (wxx * wyy) - (wxy ** 2) + trace = wxx + wyy + r = det - k * (trace ** 2) + # Can change the value + if r > 0.5: + corner_list.append([x, y, r]) + color_img.itemset((y, x, 0), 0) + color_img.itemset((y, x, 1), 0) + color_img.itemset((y, x, 2), 255) + return color_img, corner_list + + +if __name__ == "__main__": + + edge_detect = Harris_Corner(0.04, 3) + color_img, _ = edge_detect.detect("path_to_image") + cv2.imwrite("detect.png", color_img) diff --git a/python-mega-algo/computer_vision/meanthreshold.py b/python-mega-algo/computer_vision/meanthreshold.py new file mode 100644 index 00000000..76657933 --- /dev/null +++ b/python-mega-algo/computer_vision/meanthreshold.py @@ -0,0 +1,30 @@ +from PIL import Image + +""" +Mean thresholding algorithm for image processing +https://en.wikipedia.org/wiki/Thresholding_(image_processing) +""" + + +def mean_threshold(image: Image) -> Image: + """ + image: is a grayscale PIL image object + """ + height, width = image.size + mean = 0 + pixels = image.load() + for i in range(width): + for j in range(height): + pixel = pixels[j, i] + mean += pixel + mean //= width * height + + for j in range(width): + for i in range(height): + pixels[i, j] = 255 if pixels[i, j] > mean else 0 + return image + + +if __name__ == "__main__": + image = mean_threshold(Image.open("path_to_image").convert("L")) + image.save("output_image_path") diff --git a/python-mega-algo/computer_vision/right.html b/python-mega-algo/computer_vision/right.html new file mode 100644 index 00000000..f528f37a --- /dev/null +++ b/python-mega-algo/computer_vision/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/computer_vision + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    README.md harriscorner.py meanthreshold.py __init__.py 
    + +

    +Folders: 1
    +Files: 4
    +Size of all files: 3691 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/conversions/__init__.py b/python-mega-algo/conversions/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/conversions/binary_to_decimal.py b/python-mega-algo/conversions/binary_to_decimal.py new file mode 100644 index 00000000..a7625e47 --- /dev/null +++ b/python-mega-algo/conversions/binary_to_decimal.py @@ -0,0 +1,43 @@ +def bin_to_decimal(bin_string: str) -> int: + """ + Convert a binary value to its decimal equivalent + + >>> bin_to_decimal("101") + 5 + >>> bin_to_decimal(" 1010 ") + 10 + >>> bin_to_decimal("-11101") + -29 + >>> bin_to_decimal("0") + 0 + >>> bin_to_decimal("a") + Traceback (most recent call last): + ... + ValueError: Non-binary value was passed to the function + >>> bin_to_decimal("") + Traceback (most recent call last): + ... + ValueError: Empty string was passed to the function + >>> bin_to_decimal("39") + Traceback (most recent call last): + ... + ValueError: Non-binary value was passed to the function + """ + bin_string = str(bin_string).strip() + if not bin_string: + raise ValueError("Empty string was passed to the function") + is_negative = bin_string[0] == "-" + if is_negative: + bin_string = bin_string[1:] + if not all(char in "01" for char in bin_string): + raise ValueError("Non-binary value was passed to the function") + decimal_number = 0 + for char in bin_string: + decimal_number = 2 * decimal_number + int(char) + return -decimal_number if is_negative else decimal_number + + +if __name__ == "__main__": + from doctest import testmod + + testmod() diff --git a/python-mega-algo/conversions/binary_to_octal.py b/python-mega-algo/conversions/binary_to_octal.py new file mode 100644 index 00000000..35ede95b --- /dev/null +++ b/python-mega-algo/conversions/binary_to_octal.py @@ -0,0 +1,45 @@ +""" +The function below will convert any binary string to the octal equivalent. + +>>> bin_to_octal("1111") +'17' + +>>> bin_to_octal("101010101010011") +'52523' + +>>> bin_to_octal("") +Traceback (most recent call last): +... +ValueError: Empty string was passed to the function +>>> bin_to_octal("a-1") +Traceback (most recent call last): +... +ValueError: Non-binary value was passed to the function +""" + + +def bin_to_octal(bin_string: str) -> str: + if not all(char in "01" for char in bin_string): + raise ValueError("Non-binary value was passed to the function") + if not bin_string: + raise ValueError("Empty string was passed to the function") + oct_string = "" + while len(bin_string) % 3 != 0: + bin_string = "0" + bin_string + bin_string_in_3_list = [ + bin_string[index : index + 3] + for index in range(len(bin_string)) + if index % 3 == 0 + ] + for bin_group in bin_string_in_3_list: + oct_val = 0 + for index, val in enumerate(bin_group): + oct_val += int(2 ** (2 - index) * int(val)) + oct_string += str(oct_val) + return oct_string + + +if __name__ == "__main__": + from doctest import testmod + + testmod() diff --git a/python-mega-algo/conversions/decimal_to_any.py b/python-mega-algo/conversions/decimal_to_any.py new file mode 100644 index 00000000..3c72a773 --- /dev/null +++ b/python-mega-algo/conversions/decimal_to_any.py @@ -0,0 +1,107 @@ +"""Convert a positive Decimal Number to Any Other Representation""" + + +def decimal_to_any(num: int, base: int) -> str: + """ + Convert a positive integer to another base as str. + >>> decimal_to_any(0, 2) + '0' + >>> decimal_to_any(5, 4) + '11' + >>> decimal_to_any(20, 3) + '202' + >>> decimal_to_any(58, 16) + '3A' + >>> decimal_to_any(243, 17) + 'E5' + >>> decimal_to_any(34923, 36) + 'QY3' + >>> decimal_to_any(10, 11) + 'A' + >>> decimal_to_any(16, 16) + '10' + >>> decimal_to_any(36, 36) + '10' + >>> # negatives will error + >>> decimal_to_any(-45, 8) # doctest: +ELLIPSIS + Traceback (most recent call last): + ... + ValueError: parameter must be positive int + >>> # floats will error + >>> decimal_to_any(34.4, 6) # doctest: +ELLIPSIS + Traceback (most recent call last): + ... + TypeError: int() can't convert non-string with explicit base + >>> # a float base will error + >>> decimal_to_any(5, 2.5) # doctest: +ELLIPSIS + Traceback (most recent call last): + ... + TypeError: 'float' object cannot be interpreted as an integer + >>> # a str base will error + >>> decimal_to_any(10, '16') # doctest: +ELLIPSIS + Traceback (most recent call last): + ... + TypeError: 'str' object cannot be interpreted as an integer + >>> # a base less than 2 will error + >>> decimal_to_any(7, 0) # doctest: +ELLIPSIS + Traceback (most recent call last): + ... + ValueError: base must be >= 2 + >>> # a base greater than 36 will error + >>> decimal_to_any(34, 37) # doctest: +ELLIPSIS + Traceback (most recent call last): + ... + ValueError: base must be <= 36 + """ + if isinstance(num, float): + raise TypeError("int() can't convert non-string with explicit base") + if num < 0: + raise ValueError("parameter must be positive int") + if isinstance(base, str): + raise TypeError("'str' object cannot be interpreted as an integer") + if isinstance(base, float): + raise TypeError("'float' object cannot be interpreted as an integer") + if base in (0, 1): + raise ValueError("base must be >= 2") + if base > 36: + raise ValueError("base must be <= 36") + # fmt: off + ALPHABET_VALUES = {'10': 'A', '11': 'B', '12': 'C', '13': 'D', '14': 'E', '15': 'F', + '16': 'G', '17': 'H', '18': 'I', '19': 'J', '20': 'K', '21': 'L', + '22': 'M', '23': 'N', '24': 'O', '25': 'P', '26': 'Q', '27': 'R', + '28': 'S', '29': 'T', '30': 'U', '31': 'V', '32': 'W', '33': 'X', + '34': 'Y', '35': 'Z'} + # fmt: on + new_value = "" + mod = 0 + div = 0 + while div != 1: + div, mod = divmod(num, base) + if base >= 11 and 9 < mod < 36: + actual_value = ALPHABET_VALUES[str(mod)] + mod = actual_value + new_value += str(mod) + div = num // base + num = div + if div == 0: + return str(new_value[::-1]) + elif div == 1: + new_value += str(div) + return str(new_value[::-1]) + + return new_value[::-1] + + +if __name__ == "__main__": + import doctest + + doctest.testmod() + + for base in range(2, 37): + for num in range(1000): + assert int(decimal_to_any(num, base), base) == num, ( + num, + base, + decimal_to_any(num, base), + int(decimal_to_any(num, base), base), + ) diff --git a/python-mega-algo/conversions/decimal_to_binary.py b/python-mega-algo/conversions/decimal_to_binary.py new file mode 100644 index 00000000..c21cdbca --- /dev/null +++ b/python-mega-algo/conversions/decimal_to_binary.py @@ -0,0 +1,59 @@ +"""Convert a Decimal Number to a Binary Number.""" + + +def decimal_to_binary(num: int) -> str: + + """ + Convert an Integer Decimal Number to a Binary Number as str. + >>> decimal_to_binary(0) + '0b0' + >>> decimal_to_binary(2) + '0b10' + >>> decimal_to_binary(7) + '0b111' + >>> decimal_to_binary(35) + '0b100011' + >>> # negatives work too + >>> decimal_to_binary(-2) + '-0b10' + >>> # other floats will error + >>> decimal_to_binary(16.16) # doctest: +ELLIPSIS + Traceback (most recent call last): + ... + TypeError: 'float' object cannot be interpreted as an integer + >>> # strings will error as well + >>> decimal_to_binary('0xfffff') # doctest: +ELLIPSIS + Traceback (most recent call last): + ... + TypeError: 'str' object cannot be interpreted as an integer + """ + + if isinstance(num, float): + raise TypeError("'float' object cannot be interpreted as an integer") + if isinstance(num, str): + raise TypeError("'str' object cannot be interpreted as an integer") + + if num == 0: + return "0b0" + + negative = False + + if num < 0: + negative = True + num = -num + + binary: list[int] = [] + while num > 0: + binary.insert(0, num % 2) + num >>= 1 + + if negative: + return "-0b" + "".join(str(e) for e in binary) + + return "0b" + "".join(str(e) for e in binary) + + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/conversions/decimal_to_binary_recursion.py b/python-mega-algo/conversions/decimal_to_binary_recursion.py new file mode 100644 index 00000000..c149ea86 --- /dev/null +++ b/python-mega-algo/conversions/decimal_to_binary_recursion.py @@ -0,0 +1,53 @@ +def binary_recursive(decimal: int) -> str: + """ + Take a positive integer value and return its binary equivalent. + >>> binary_recursive(1000) + '1111101000' + >>> binary_recursive("72") + '1001000' + >>> binary_recursive("number") + Traceback (most recent call last): + ... + ValueError: invalid literal for int() with base 10: 'number' + """ + decimal = int(decimal) + if decimal in (0, 1): # Exit cases for the recursion + return str(decimal) + div, mod = divmod(decimal, 2) + return binary_recursive(div) + str(mod) + + +def main(number: str) -> str: + """ + Take an integer value and raise ValueError for wrong inputs, + call the function above and return the output with prefix "0b" & "-0b" + for positive and negative integers respectively. + >>> main(0) + '0b0' + >>> main(40) + '0b101000' + >>> main(-40) + '-0b101000' + >>> main(40.8) + Traceback (most recent call last): + ... + ValueError: Input value is not an integer + >>> main("forty") + Traceback (most recent call last): + ... + ValueError: Input value is not an integer + """ + number = str(number).strip() + if not number: + raise ValueError("No input value was provided") + negative = "-" if number.startswith("-") else "" + number = number.lstrip("-") + if not number.isnumeric(): + raise ValueError("Input value is not an integer") + return f"{negative}0b{binary_recursive(int(number))}" + + +if __name__ == "__main__": + from doctest import testmod + + testmod() diff --git a/python-mega-algo/conversions/decimal_to_hexadecimal.py b/python-mega-algo/conversions/decimal_to_hexadecimal.py new file mode 100644 index 00000000..2389c6d1 --- /dev/null +++ b/python-mega-algo/conversions/decimal_to_hexadecimal.py @@ -0,0 +1,79 @@ +""" Convert Base 10 (Decimal) Values to Hexadecimal Representations """ + +# set decimal value for each hexadecimal digit +values = { + 0: "0", + 1: "1", + 2: "2", + 3: "3", + 4: "4", + 5: "5", + 6: "6", + 7: "7", + 8: "8", + 9: "9", + 10: "a", + 11: "b", + 12: "c", + 13: "d", + 14: "e", + 15: "f", +} + + +def decimal_to_hexadecimal(decimal: float) -> str: + """ + take integer decimal value, return hexadecimal representation as str beginning + with 0x + >>> decimal_to_hexadecimal(5) + '0x5' + >>> decimal_to_hexadecimal(15) + '0xf' + >>> decimal_to_hexadecimal(37) + '0x25' + >>> decimal_to_hexadecimal(255) + '0xff' + >>> decimal_to_hexadecimal(4096) + '0x1000' + >>> decimal_to_hexadecimal(999098) + '0xf3eba' + >>> # negatives work too + >>> decimal_to_hexadecimal(-256) + '-0x100' + >>> # floats are acceptable if equivalent to an int + >>> decimal_to_hexadecimal(17.0) + '0x11' + >>> # other floats will error + >>> decimal_to_hexadecimal(16.16) # doctest: +ELLIPSIS + Traceback (most recent call last): + ... + AssertionError + >>> # strings will error as well + >>> decimal_to_hexadecimal('0xfffff') # doctest: +ELLIPSIS + Traceback (most recent call last): + ... + AssertionError + >>> # results are the same when compared to Python's default hex function + >>> decimal_to_hexadecimal(-256) == hex(-256) + True + """ + assert type(decimal) in (int, float) and decimal == int(decimal) + decimal = int(decimal) + hexadecimal = "" + negative = False + if decimal < 0: + negative = True + decimal *= -1 + while decimal > 0: + decimal, remainder = divmod(decimal, 16) + hexadecimal = values[remainder] + hexadecimal + hexadecimal = "0x" + hexadecimal + if negative: + hexadecimal = "-" + hexadecimal + return hexadecimal + + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/conversions/decimal_to_octal.py b/python-mega-algo/conversions/decimal_to_octal.py new file mode 100644 index 00000000..4c313bdd --- /dev/null +++ b/python-mega-algo/conversions/decimal_to_octal.py @@ -0,0 +1,43 @@ +"""Convert a Decimal Number to an Octal Number.""" + +import math + +# Modified from: +# https://github.com/TheAlgorithms/Javascript/blob/master/Conversions/DecimalToOctal.js + + +def decimal_to_octal(num: int) -> str: + """Convert a Decimal Number to an Octal Number. + + >>> all(decimal_to_octal(i) == oct(i) for i + ... in (0, 2, 8, 64, 65, 216, 255, 256, 512)) + True + """ + octal = 0 + counter = 0 + while num > 0: + remainder = num % 8 + octal = octal + (remainder * math.floor(math.pow(10, counter))) + counter += 1 + num = math.floor(num / 8) # basically /= 8 without remainder if any + # This formatting removes trailing '.0' from `octal`. + return f"0o{int(octal)}" + + +def main() -> None: + """Print octal equivalents of decimal numbers.""" + print("\n2 in octal is:") + print(decimal_to_octal(2)) # = 2 + print("\n8 in octal is:") + print(decimal_to_octal(8)) # = 10 + print("\n65 in octal is:") + print(decimal_to_octal(65)) # = 101 + print("\n216 in octal is:") + print(decimal_to_octal(216)) # = 330 + print("\n512 in octal is:") + print(decimal_to_octal(512)) # = 1000 + print("\n") + + +if __name__ == "__main__": + main() diff --git a/python-mega-algo/conversions/hex_to_bin.py b/python-mega-algo/conversions/hex_to_bin.py new file mode 100644 index 00000000..e358d810 --- /dev/null +++ b/python-mega-algo/conversions/hex_to_bin.py @@ -0,0 +1,56 @@ +def hex_to_bin(hex_num: str) -> int: + """ + Convert a hexadecimal value to its binary equivalent + #https://stackoverflow.com/questions/1425493/convert-hex-to-binary + Here, we have used the bitwise right shift operator: >> + Shifts the bits of the number to the right and fills 0 on voids left as a result. + Similar effect as of dividing the number with some power of two. + Example: + a = 10 + a >> 1 = 5 + + >>> hex_to_bin("AC") + 10101100 + >>> hex_to_bin("9A4") + 100110100100 + >>> hex_to_bin(" 12f ") + 100101111 + >>> hex_to_bin("FfFf") + 1111111111111111 + >>> hex_to_bin("-fFfF") + -1111111111111111 + >>> hex_to_bin("F-f") + Traceback (most recent call last): + ... + ValueError: Invalid value was passed to the function + >>> hex_to_bin("") + Traceback (most recent call last): + ... + ValueError: No value was passed to the function + """ + + hex_num = hex_num.strip() + if not hex_num: + raise ValueError("No value was passed to the function") + + is_negative = hex_num[0] == "-" + if is_negative: + hex_num = hex_num[1:] + + try: + int_num = int(hex_num, 16) + except ValueError: + raise ValueError("Invalid value was passed to the function") + + bin_str = "" + while int_num > 0: + bin_str = str(int_num % 2) + bin_str + int_num >>= 1 + + return int(("-" + bin_str) if is_negative else bin_str) + + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/conversions/hexadecimal_to_decimal.py b/python-mega-algo/conversions/hexadecimal_to_decimal.py new file mode 100644 index 00000000..beb1c2c3 --- /dev/null +++ b/python-mega-algo/conversions/hexadecimal_to_decimal.py @@ -0,0 +1,49 @@ +hex_table = {hex(i)[2:]: i for i in range(16)} # Use [:2] to strip off the leading '0x' + + +def hex_to_decimal(hex_string: str) -> int: + """ + Convert a hexadecimal value to its decimal equivalent + #https://www.programiz.com/python-programming/methods/built-in/hex + + >>> hex_to_decimal("a") + 10 + >>> hex_to_decimal("12f") + 303 + >>> hex_to_decimal(" 12f ") + 303 + >>> hex_to_decimal("FfFf") + 65535 + >>> hex_to_decimal("-Ff") + -255 + >>> hex_to_decimal("F-f") + Traceback (most recent call last): + ... + ValueError: Non-hexadecimal value was passed to the function + >>> hex_to_decimal("") + Traceback (most recent call last): + ... + ValueError: Empty string was passed to the function + >>> hex_to_decimal("12m") + Traceback (most recent call last): + ... + ValueError: Non-hexadecimal value was passed to the function + """ + hex_string = hex_string.strip().lower() + if not hex_string: + raise ValueError("Empty string was passed to the function") + is_negative = hex_string[0] == "-" + if is_negative: + hex_string = hex_string[1:] + if not all(char in hex_table for char in hex_string): + raise ValueError("Non-hexadecimal value was passed to the function") + decimal_number = 0 + for char in hex_string: + decimal_number = 16 * decimal_number + hex_table[char] + return -decimal_number if is_negative else decimal_number + + +if __name__ == "__main__": + from doctest import testmod + + testmod() diff --git a/python-mega-algo/conversions/molecular_chemistry.py b/python-mega-algo/conversions/molecular_chemistry.py new file mode 100644 index 00000000..8c684599 --- /dev/null +++ b/python-mega-algo/conversions/molecular_chemistry.py @@ -0,0 +1,92 @@ +""" +Functions useful for doing molecular chemistry: +* molarity_to_normality +* moles_to_pressure +* moles_to_volume +* pressure_and_volume_to_temperature +""" + + +def molarity_to_normality(nfactor: int, moles: float, volume: float) -> float: + """ + Convert molarity to normality. + Volume is taken in litres. + + Wikipedia reference: https://en.wikipedia.org/wiki/Equivalent_concentration + Wikipedia reference: https://en.wikipedia.org/wiki/Molar_concentration + + >>> molarity_to_normality(2, 3.1, 0.31) + 20 + >>> molarity_to_normality(4, 11.4, 5.7) + 8 + """ + return round((float(moles / volume) * nfactor)) + + +def moles_to_pressure(volume: float, moles: float, temperature: float) -> float: + """ + Convert moles to pressure. + Ideal gas laws are used. + Temperature is taken in kelvin. + Volume is taken in litres. + Pressure has atm as SI unit. + + Wikipedia reference: https://en.wikipedia.org/wiki/Gas_laws + Wikipedia reference: https://en.wikipedia.org/wiki/Pressure + Wikipedia reference: https://en.wikipedia.org/wiki/Temperature + + >>> moles_to_pressure(0.82, 3, 300) + 90 + >>> moles_to_pressure(8.2, 5, 200) + 10 + """ + return round(float((moles * 0.0821 * temperature) / (volume))) + + +def moles_to_volume(pressure: float, moles: float, temperature: float) -> float: + """ + Convert moles to volume. + Ideal gas laws are used. + Temperature is taken in kelvin. + Volume is taken in litres. + Pressure has atm as SI unit. + + Wikipedia reference: https://en.wikipedia.org/wiki/Gas_laws + Wikipedia reference: https://en.wikipedia.org/wiki/Pressure + Wikipedia reference: https://en.wikipedia.org/wiki/Temperature + + >>> moles_to_volume(0.82, 3, 300) + 90 + >>> moles_to_volume(8.2, 5, 200) + 10 + """ + return round(float((moles * 0.0821 * temperature) / (pressure))) + + +def pressure_and_volume_to_temperature( + pressure: float, moles: float, volume: float +) -> float: + """ + Convert pressure and volume to temperature. + Ideal gas laws are used. + Temperature is taken in kelvin. + Volume is taken in litres. + Pressure has atm as SI unit. + + Wikipedia reference: https://en.wikipedia.org/wiki/Gas_laws + Wikipedia reference: https://en.wikipedia.org/wiki/Pressure + Wikipedia reference: https://en.wikipedia.org/wiki/Temperature + + >>> pressure_and_volume_to_temperature(0.82, 1, 2) + 20 + >>> pressure_and_volume_to_temperature(8.2, 5, 3) + 60 + """ + return round(float((pressure * volume) / (0.0821 * moles))) + + +if __name__ == "__main__": + + import doctest + + doctest.testmod() diff --git a/python-mega-algo/conversions/octal_to_decimal.py b/python-mega-algo/conversions/octal_to_decimal.py new file mode 100644 index 00000000..5a7373fe --- /dev/null +++ b/python-mega-algo/conversions/octal_to_decimal.py @@ -0,0 +1,43 @@ +def oct_to_decimal(oct_string: str) -> int: + """ + Convert a octal value to its decimal equivalent + + >>> oct_to_decimal("12") + 10 + >>> oct_to_decimal(" 12 ") + 10 + >>> oct_to_decimal("-45") + -37 + >>> oct_to_decimal("2-0Fm") + Traceback (most recent call last): + ... + ValueError: Non-octal value was passed to the function + >>> oct_to_decimal("") + Traceback (most recent call last): + ... + ValueError: Empty string was passed to the function + >>> oct_to_decimal("19") + Traceback (most recent call last): + ... + ValueError: Non-octal value was passed to the function + """ + oct_string = str(oct_string).strip() + if not oct_string: + raise ValueError("Empty string was passed to the function") + is_negative = oct_string[0] == "-" + if is_negative: + oct_string = oct_string[1:] + if not oct_string.isdigit() or not all(0 <= int(char) <= 7 for char in oct_string): + raise ValueError("Non-octal value was passed to the function") + decimal_number = 0 + for char in oct_string: + decimal_number = 8 * decimal_number + int(char) + if is_negative: + decimal_number = -decimal_number + return decimal_number + + +if __name__ == "__main__": + from doctest import testmod + + testmod() diff --git a/python-mega-algo/conversions/prefix_conversions.py b/python-mega-algo/conversions/prefix_conversions.py new file mode 100644 index 00000000..78db4a91 --- /dev/null +++ b/python-mega-algo/conversions/prefix_conversions.py @@ -0,0 +1,102 @@ +""" +Convert International System of Units (SI) and Binary prefixes +""" +from enum import Enum +from typing import Union + + +class SI_Unit(Enum): + yotta = 24 + zetta = 21 + exa = 18 + peta = 15 + tera = 12 + giga = 9 + mega = 6 + kilo = 3 + hecto = 2 + deca = 1 + deci = -1 + centi = -2 + milli = -3 + micro = -6 + nano = -9 + pico = -12 + femto = -15 + atto = -18 + zepto = -21 + yocto = -24 + + +class Binary_Unit(Enum): + yotta = 8 + zetta = 7 + exa = 6 + peta = 5 + tera = 4 + giga = 3 + mega = 2 + kilo = 1 + + +def convert_si_prefix( + known_amount: float, + known_prefix: Union[str, SI_Unit], + unknown_prefix: Union[str, SI_Unit], +) -> float: + """ + Wikipedia reference: https://en.wikipedia.org/wiki/Binary_prefix + Wikipedia reference: https://en.wikipedia.org/wiki/International_System_of_Units + >>> convert_si_prefix(1, SI_Unit.giga, SI_Unit.mega) + 1000 + >>> convert_si_prefix(1, SI_Unit.mega, SI_Unit.giga) + 0.001 + >>> convert_si_prefix(1, SI_Unit.kilo, SI_Unit.kilo) + 1 + >>> convert_si_prefix(1, 'giga', 'mega') + 1000 + >>> convert_si_prefix(1, 'gIGa', 'mEGa') + 1000 + """ + if isinstance(known_prefix, str): + known_prefix = SI_Unit[known_prefix.lower()] + if isinstance(unknown_prefix, str): + unknown_prefix = SI_Unit[unknown_prefix.lower()] + unknown_amount: float = known_amount * ( + 10 ** (known_prefix.value - unknown_prefix.value) + ) + return unknown_amount + + +def convert_binary_prefix( + known_amount: float, + known_prefix: Union[str, Binary_Unit], + unknown_prefix: Union[str, Binary_Unit], +) -> float: + """ + Wikipedia reference: https://en.wikipedia.org/wiki/Metric_prefix + >>> convert_binary_prefix(1, Binary_Unit.giga, Binary_Unit.mega) + 1024 + >>> convert_binary_prefix(1, Binary_Unit.mega, Binary_Unit.giga) + 0.0009765625 + >>> convert_binary_prefix(1, Binary_Unit.kilo, Binary_Unit.kilo) + 1 + >>> convert_binary_prefix(1, 'giga', 'mega') + 1024 + >>> convert_binary_prefix(1, 'gIGa', 'mEGa') + 1024 + """ + if isinstance(known_prefix, str): + known_prefix = Binary_Unit[known_prefix.lower()] + if isinstance(unknown_prefix, str): + unknown_prefix = Binary_Unit[unknown_prefix.lower()] + unknown_amount: float = known_amount * ( + 2 ** ((known_prefix.value - unknown_prefix.value) * 10) + ) + return unknown_amount + + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/conversions/rgb_hsv_conversion.py b/python-mega-algo/conversions/rgb_hsv_conversion.py new file mode 100644 index 00000000..081cfe1d --- /dev/null +++ b/python-mega-algo/conversions/rgb_hsv_conversion.py @@ -0,0 +1,159 @@ +""" +The RGB color model is an additive color model in which red, green, and blue light +are added together in various ways to reproduce a broad array of colors. The name +of the model comes from the initials of the three additive primary colors, red, +green, and blue. Meanwhile, the HSV representation models how colors appear under +light. In it, colors are represented using three components: hue, saturation and +(brightness-)value. This file provides functions for converting colors from one +representation to the other. + +(description adapted from https://en.wikipedia.org/wiki/RGB_color_model and +https://en.wikipedia.org/wiki/HSL_and_HSV). +""" + + +def hsv_to_rgb(hue: float, saturation: float, value: float) -> list[int]: + """ + Conversion from the HSV-representation to the RGB-representation. + Expected RGB-values taken from + https://www.rapidtables.com/convert/color/hsv-to-rgb.html + + >>> hsv_to_rgb(0, 0, 0) + [0, 0, 0] + >>> hsv_to_rgb(0, 0, 1) + [255, 255, 255] + >>> hsv_to_rgb(0, 1, 1) + [255, 0, 0] + >>> hsv_to_rgb(60, 1, 1) + [255, 255, 0] + >>> hsv_to_rgb(120, 1, 1) + [0, 255, 0] + >>> hsv_to_rgb(240, 1, 1) + [0, 0, 255] + >>> hsv_to_rgb(300, 1, 1) + [255, 0, 255] + >>> hsv_to_rgb(180, 0.5, 0.5) + [64, 128, 128] + >>> hsv_to_rgb(234, 0.14, 0.88) + [193, 196, 224] + >>> hsv_to_rgb(330, 0.75, 0.5) + [128, 32, 80] + """ + if hue < 0 or hue > 360: + raise Exception("hue should be between 0 and 360") + + if saturation < 0 or saturation > 1: + raise Exception("saturation should be between 0 and 1") + + if value < 0 or value > 1: + raise Exception("value should be between 0 and 1") + + chroma = value * saturation + hue_section = hue / 60 + second_largest_component = chroma * (1 - abs(hue_section % 2 - 1)) + match_value = value - chroma + + if hue_section >= 0 and hue_section <= 1: + red = round(255 * (chroma + match_value)) + green = round(255 * (second_largest_component + match_value)) + blue = round(255 * (match_value)) + elif hue_section > 1 and hue_section <= 2: + red = round(255 * (second_largest_component + match_value)) + green = round(255 * (chroma + match_value)) + blue = round(255 * (match_value)) + elif hue_section > 2 and hue_section <= 3: + red = round(255 * (match_value)) + green = round(255 * (chroma + match_value)) + blue = round(255 * (second_largest_component + match_value)) + elif hue_section > 3 and hue_section <= 4: + red = round(255 * (match_value)) + green = round(255 * (second_largest_component + match_value)) + blue = round(255 * (chroma + match_value)) + elif hue_section > 4 and hue_section <= 5: + red = round(255 * (second_largest_component + match_value)) + green = round(255 * (match_value)) + blue = round(255 * (chroma + match_value)) + else: + red = round(255 * (chroma + match_value)) + green = round(255 * (match_value)) + blue = round(255 * (second_largest_component + match_value)) + + return [red, green, blue] + + +def rgb_to_hsv(red: int, green: int, blue: int) -> list[float]: + """ + Conversion from the RGB-representation to the HSV-representation. + The tested values are the reverse values from the hsv_to_rgb-doctests. + Function "approximately_equal_hsv" is needed because of small deviations due to + rounding for the RGB-values. + + >>> approximately_equal_hsv(rgb_to_hsv(0, 0, 0), [0, 0, 0]) + True + >>> approximately_equal_hsv(rgb_to_hsv(255, 255, 255), [0, 0, 1]) + True + >>> approximately_equal_hsv(rgb_to_hsv(255, 0, 0), [0, 1, 1]) + True + >>> approximately_equal_hsv(rgb_to_hsv(255, 255, 0), [60, 1, 1]) + True + >>> approximately_equal_hsv(rgb_to_hsv(0, 255, 0), [120, 1, 1]) + True + >>> approximately_equal_hsv(rgb_to_hsv(0, 0, 255), [240, 1, 1]) + True + >>> approximately_equal_hsv(rgb_to_hsv(255, 0, 255), [300, 1, 1]) + True + >>> approximately_equal_hsv(rgb_to_hsv(64, 128, 128), [180, 0.5, 0.5]) + True + >>> approximately_equal_hsv(rgb_to_hsv(193, 196, 224), [234, 0.14, 0.88]) + True + >>> approximately_equal_hsv(rgb_to_hsv(128, 32, 80), [330, 0.75, 0.5]) + True + """ + if red < 0 or red > 255: + raise Exception("red should be between 0 and 255") + + if green < 0 or green > 255: + raise Exception("green should be between 0 and 255") + + if blue < 0 or blue > 255: + raise Exception("blue should be between 0 and 255") + + float_red = red / 255 + float_green = green / 255 + float_blue = blue / 255 + value = max(max(float_red, float_green), float_blue) + chroma = value - min(min(float_red, float_green), float_blue) + saturation = 0 if value == 0 else chroma / value + + if chroma == 0: + hue = 0.0 + elif value == float_red: + hue = 60 * (0 + (float_green - float_blue) / chroma) + elif value == float_green: + hue = 60 * (2 + (float_blue - float_red) / chroma) + else: + hue = 60 * (4 + (float_red - float_green) / chroma) + + hue = (hue + 360) % 360 + + return [hue, saturation, value] + + +def approximately_equal_hsv(hsv_1: list[float], hsv_2: list[float]) -> bool: + """ + Utility-function to check that two hsv-colors are approximately equal + + >>> approximately_equal_hsv([0, 0, 0], [0, 0, 0]) + True + >>> approximately_equal_hsv([180, 0.5, 0.3], [179.9999, 0.500001, 0.30001]) + True + >>> approximately_equal_hsv([0, 0, 0], [1, 0, 0]) + False + >>> approximately_equal_hsv([180, 0.5, 0.3], [179.9999, 0.6, 0.30001]) + False + """ + check_hue = abs(hsv_1[0] - hsv_2[0]) < 0.2 + check_saturation = abs(hsv_1[1] - hsv_2[1]) < 0.002 + check_value = abs(hsv_1[2] - hsv_2[2]) < 0.002 + + return check_hue and check_saturation and check_value diff --git a/python-mega-algo/conversions/right.html b/python-mega-algo/conversions/right.html new file mode 100644 index 00000000..8880630b --- /dev/null +++ b/python-mega-algo/conversions/right.html @@ -0,0 +1,33 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/conversions + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + + + + + +
    FileFileFileFile
    binary_to...mal.py decimal_t...mal.py molecular...try.py roman_numerals.py 
    binary_to_octal.py decimal_t...tal.py octal_to_...mal.py temperatu...ons.py 
    decimal_to_any.py hexadecim...mal.py prefix_co...ons.py weight_co...ion.py 
    decimal_t...ary.py hex_to_bin.py rgb_hsv_c...ion.py __init__.py 
    decimal_t...ion.py 
    + +

    +Folders: 1
    +Files: 17
    +Size of all files: 50139 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/conversions/roman_numerals.py b/python-mega-algo/conversions/roman_numerals.py new file mode 100644 index 00000000..9c0de2cd --- /dev/null +++ b/python-mega-algo/conversions/roman_numerals.py @@ -0,0 +1,59 @@ +def roman_to_int(roman: str) -> int: + """ + LeetCode No. 13 Roman to Integer + Given a roman numeral, convert it to an integer. + Input is guaranteed to be within the range from 1 to 3999. + https://en.wikipedia.org/wiki/Roman_numerals + >>> tests = {"III": 3, "CLIV": 154, "MIX": 1009, "MMD": 2500, "MMMCMXCIX": 3999} + >>> all(roman_to_int(key) == value for key, value in tests.items()) + True + """ + vals = {"I": 1, "V": 5, "X": 10, "L": 50, "C": 100, "D": 500, "M": 1000} + total = 0 + place = 0 + while place < len(roman): + if (place + 1 < len(roman)) and (vals[roman[place]] < vals[roman[place + 1]]): + total += vals[roman[place + 1]] - vals[roman[place]] + place += 2 + else: + total += vals[roman[place]] + place += 1 + return total + + +def int_to_roman(number: int) -> str: + """ + Given a integer, convert it to an roman numeral. + https://en.wikipedia.org/wiki/Roman_numerals + >>> tests = {"III": 3, "CLIV": 154, "MIX": 1009, "MMD": 2500, "MMMCMXCIX": 3999} + >>> all(int_to_roman(value) == key for key, value in tests.items()) + True + """ + ROMAN = [ + (1000, "M"), + (900, "CM"), + (500, "D"), + (400, "CD"), + (100, "C"), + (90, "XC"), + (50, "L"), + (40, "XL"), + (10, "X"), + (9, "IX"), + (5, "V"), + (4, "IV"), + (1, "I"), + ] + result = [] + for (arabic, roman) in ROMAN: + (factor, number) = divmod(number, arabic) + result.append(roman * factor) + if number == 0: + break + return "".join(result) + + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/conversions/temperature_conversions.py b/python-mega-algo/conversions/temperature_conversions.py new file mode 100644 index 00000000..167c9dc6 --- /dev/null +++ b/python-mega-algo/conversions/temperature_conversions.py @@ -0,0 +1,386 @@ +""" Convert between different units of temperature """ + + +def celsius_to_fahrenheit(celsius: float, ndigits: int = 2) -> float: + """ + Convert a given value from Celsius to Fahrenheit and round it to 2 decimal places. + Wikipedia reference: https://en.wikipedia.org/wiki/Celsius + Wikipedia reference: https://en.wikipedia.org/wiki/Fahrenheit + + >>> celsius_to_fahrenheit(273.354, 3) + 524.037 + >>> celsius_to_fahrenheit(273.354, 0) + 524.0 + >>> celsius_to_fahrenheit(-40.0) + -40.0 + >>> celsius_to_fahrenheit(-20.0) + -4.0 + >>> celsius_to_fahrenheit(0) + 32.0 + >>> celsius_to_fahrenheit(20) + 68.0 + >>> celsius_to_fahrenheit("40") + 104.0 + >>> celsius_to_fahrenheit("celsius") + Traceback (most recent call last): + ... + ValueError: could not convert string to float: 'celsius' + """ + return round((float(celsius) * 9 / 5) + 32, ndigits) + + +def celsius_to_kelvin(celsius: float, ndigits: int = 2) -> float: + """ + Convert a given value from Celsius to Kelvin and round it to 2 decimal places. + Wikipedia reference: https://en.wikipedia.org/wiki/Celsius + Wikipedia reference: https://en.wikipedia.org/wiki/Kelvin + + >>> celsius_to_kelvin(273.354, 3) + 546.504 + >>> celsius_to_kelvin(273.354, 0) + 547.0 + >>> celsius_to_kelvin(0) + 273.15 + >>> celsius_to_kelvin(20.0) + 293.15 + >>> celsius_to_kelvin("40") + 313.15 + >>> celsius_to_kelvin("celsius") + Traceback (most recent call last): + ... + ValueError: could not convert string to float: 'celsius' + """ + return round(float(celsius) + 273.15, ndigits) + + +def celsius_to_rankine(celsius: float, ndigits: int = 2) -> float: + """ + Convert a given value from Celsius to Rankine and round it to 2 decimal places. + Wikipedia reference: https://en.wikipedia.org/wiki/Celsius + Wikipedia reference: https://en.wikipedia.org/wiki/Rankine_scale + + >>> celsius_to_rankine(273.354, 3) + 983.707 + >>> celsius_to_rankine(273.354, 0) + 984.0 + >>> celsius_to_rankine(0) + 491.67 + >>> celsius_to_rankine(20.0) + 527.67 + >>> celsius_to_rankine("40") + 563.67 + >>> celsius_to_rankine("celsius") + Traceback (most recent call last): + ... + ValueError: could not convert string to float: 'celsius' + """ + return round((float(celsius) * 9 / 5) + 491.67, ndigits) + + +def fahrenheit_to_celsius(fahrenheit: float, ndigits: int = 2) -> float: + """ + Convert a given value from Fahrenheit to Celsius and round it to 2 decimal places. + Wikipedia reference: https://en.wikipedia.org/wiki/Fahrenheit + Wikipedia reference: https://en.wikipedia.org/wiki/Celsius + + >>> fahrenheit_to_celsius(273.354, 3) + 134.086 + >>> fahrenheit_to_celsius(273.354, 0) + 134.0 + >>> fahrenheit_to_celsius(0) + -17.78 + >>> fahrenheit_to_celsius(20.0) + -6.67 + >>> fahrenheit_to_celsius(40.0) + 4.44 + >>> fahrenheit_to_celsius(60) + 15.56 + >>> fahrenheit_to_celsius(80) + 26.67 + >>> fahrenheit_to_celsius("100") + 37.78 + >>> fahrenheit_to_celsius("fahrenheit") + Traceback (most recent call last): + ... + ValueError: could not convert string to float: 'fahrenheit' + """ + return round((float(fahrenheit) - 32) * 5 / 9, ndigits) + + +def fahrenheit_to_kelvin(fahrenheit: float, ndigits: int = 2) -> float: + """ + Convert a given value from Fahrenheit to Kelvin and round it to 2 decimal places. + Wikipedia reference: https://en.wikipedia.org/wiki/Fahrenheit + Wikipedia reference: https://en.wikipedia.org/wiki/Kelvin + + >>> fahrenheit_to_kelvin(273.354, 3) + 407.236 + >>> fahrenheit_to_kelvin(273.354, 0) + 407.0 + >>> fahrenheit_to_kelvin(0) + 255.37 + >>> fahrenheit_to_kelvin(20.0) + 266.48 + >>> fahrenheit_to_kelvin(40.0) + 277.59 + >>> fahrenheit_to_kelvin(60) + 288.71 + >>> fahrenheit_to_kelvin(80) + 299.82 + >>> fahrenheit_to_kelvin("100") + 310.93 + >>> fahrenheit_to_kelvin("fahrenheit") + Traceback (most recent call last): + ... + ValueError: could not convert string to float: 'fahrenheit' + """ + return round(((float(fahrenheit) - 32) * 5 / 9) + 273.15, ndigits) + + +def fahrenheit_to_rankine(fahrenheit: float, ndigits: int = 2) -> float: + """ + Convert a given value from Fahrenheit to Rankine and round it to 2 decimal places. + Wikipedia reference: https://en.wikipedia.org/wiki/Fahrenheit + Wikipedia reference: https://en.wikipedia.org/wiki/Rankine_scale + + >>> fahrenheit_to_rankine(273.354, 3) + 733.024 + >>> fahrenheit_to_rankine(273.354, 0) + 733.0 + >>> fahrenheit_to_rankine(0) + 459.67 + >>> fahrenheit_to_rankine(20.0) + 479.67 + >>> fahrenheit_to_rankine(40.0) + 499.67 + >>> fahrenheit_to_rankine(60) + 519.67 + >>> fahrenheit_to_rankine(80) + 539.67 + >>> fahrenheit_to_rankine("100") + 559.67 + >>> fahrenheit_to_rankine("fahrenheit") + Traceback (most recent call last): + ... + ValueError: could not convert string to float: 'fahrenheit' + """ + return round(float(fahrenheit) + 459.67, ndigits) + + +def kelvin_to_celsius(kelvin: float, ndigits: int = 2) -> float: + """ + Convert a given value from Kelvin to Celsius and round it to 2 decimal places. + Wikipedia reference: https://en.wikipedia.org/wiki/Kelvin + Wikipedia reference: https://en.wikipedia.org/wiki/Celsius + + >>> kelvin_to_celsius(273.354, 3) + 0.204 + >>> kelvin_to_celsius(273.354, 0) + 0.0 + >>> kelvin_to_celsius(273.15) + 0.0 + >>> kelvin_to_celsius(300) + 26.85 + >>> kelvin_to_celsius("315.5") + 42.35 + >>> kelvin_to_celsius("kelvin") + Traceback (most recent call last): + ... + ValueError: could not convert string to float: 'kelvin' + """ + return round(float(kelvin) - 273.15, ndigits) + + +def kelvin_to_fahrenheit(kelvin: float, ndigits: int = 2) -> float: + """ + Convert a given value from Kelvin to Fahrenheit and round it to 2 decimal places. + Wikipedia reference: https://en.wikipedia.org/wiki/Kelvin + Wikipedia reference: https://en.wikipedia.org/wiki/Fahrenheit + + >>> kelvin_to_fahrenheit(273.354, 3) + 32.367 + >>> kelvin_to_fahrenheit(273.354, 0) + 32.0 + >>> kelvin_to_fahrenheit(273.15) + 32.0 + >>> kelvin_to_fahrenheit(300) + 80.33 + >>> kelvin_to_fahrenheit("315.5") + 108.23 + >>> kelvin_to_fahrenheit("kelvin") + Traceback (most recent call last): + ... + ValueError: could not convert string to float: 'kelvin' + """ + return round(((float(kelvin) - 273.15) * 9 / 5) + 32, ndigits) + + +def kelvin_to_rankine(kelvin: float, ndigits: int = 2) -> float: + """ + Convert a given value from Kelvin to Rankine and round it to 2 decimal places. + Wikipedia reference: https://en.wikipedia.org/wiki/Kelvin + Wikipedia reference: https://en.wikipedia.org/wiki/Rankine_scale + + >>> kelvin_to_rankine(273.354, 3) + 492.037 + >>> kelvin_to_rankine(273.354, 0) + 492.0 + >>> kelvin_to_rankine(0) + 0.0 + >>> kelvin_to_rankine(20.0) + 36.0 + >>> kelvin_to_rankine("40") + 72.0 + >>> kelvin_to_rankine("kelvin") + Traceback (most recent call last): + ... + ValueError: could not convert string to float: 'kelvin' + """ + return round((float(kelvin) * 9 / 5), ndigits) + + +def rankine_to_celsius(rankine: float, ndigits: int = 2) -> float: + """ + Convert a given value from Rankine to Celsius and round it to 2 decimal places. + Wikipedia reference: https://en.wikipedia.org/wiki/Rankine_scale + Wikipedia reference: https://en.wikipedia.org/wiki/Celsius + + >>> rankine_to_celsius(273.354, 3) + -121.287 + >>> rankine_to_celsius(273.354, 0) + -121.0 + >>> rankine_to_celsius(273.15) + -121.4 + >>> rankine_to_celsius(300) + -106.48 + >>> rankine_to_celsius("315.5") + -97.87 + >>> rankine_to_celsius("rankine") + Traceback (most recent call last): + ... + ValueError: could not convert string to float: 'rankine' + """ + return round((float(rankine) - 491.67) * 5 / 9, ndigits) + + +def rankine_to_fahrenheit(rankine: float, ndigits: int = 2) -> float: + """ + Convert a given value from Rankine to Fahrenheit and round it to 2 decimal places. + Wikipedia reference: https://en.wikipedia.org/wiki/Rankine_scale + Wikipedia reference: https://en.wikipedia.org/wiki/Fahrenheit + + >>> rankine_to_fahrenheit(273.15) + -186.52 + >>> rankine_to_fahrenheit(300) + -159.67 + >>> rankine_to_fahrenheit("315.5") + -144.17 + >>> rankine_to_fahrenheit("rankine") + Traceback (most recent call last): + ... + ValueError: could not convert string to float: 'rankine' + """ + return round(float(rankine) - 459.67, ndigits) + + +def rankine_to_kelvin(rankine: float, ndigits: int = 2) -> float: + """ + Convert a given value from Rankine to Kelvin and round it to 2 decimal places. + Wikipedia reference: https://en.wikipedia.org/wiki/Rankine_scale + Wikipedia reference: https://en.wikipedia.org/wiki/Kelvin + + >>> rankine_to_kelvin(0) + 0.0 + >>> rankine_to_kelvin(20.0) + 11.11 + >>> rankine_to_kelvin("40") + 22.22 + >>> rankine_to_kelvin("rankine") + Traceback (most recent call last): + ... + ValueError: could not convert string to float: 'rankine' + """ + return round((float(rankine) * 5 / 9), ndigits) + + +def reaumur_to_kelvin(reaumur: float, ndigits: int = 2) -> float: + """ + Convert a given value from reaumur to Kelvin and round it to 2 decimal places. + Reference:- http://www.csgnetwork.com/temp2conv.html + + >>> reaumur_to_kelvin(0) + 273.15 + >>> reaumur_to_kelvin(20.0) + 298.15 + >>> reaumur_to_kelvin(40) + 323.15 + >>> reaumur_to_kelvin("reaumur") + Traceback (most recent call last): + ... + ValueError: could not convert string to float: 'reaumur' + """ + return round((float(reaumur) * 1.25 + 273.15), ndigits) + + +def reaumur_to_fahrenheit(reaumur: float, ndigits: int = 2) -> float: + """ + Convert a given value from reaumur to fahrenheit and round it to 2 decimal places. + Reference:- http://www.csgnetwork.com/temp2conv.html + + >>> reaumur_to_fahrenheit(0) + 32.0 + >>> reaumur_to_fahrenheit(20.0) + 77.0 + >>> reaumur_to_fahrenheit(40) + 122.0 + >>> reaumur_to_fahrenheit("reaumur") + Traceback (most recent call last): + ... + ValueError: could not convert string to float: 'reaumur' + """ + return round((float(reaumur) * 2.25 + 32), ndigits) + + +def reaumur_to_celsius(reaumur: float, ndigits: int = 2) -> float: + """ + Convert a given value from reaumur to celsius and round it to 2 decimal places. + Reference:- http://www.csgnetwork.com/temp2conv.html + + >>> reaumur_to_celsius(0) + 0.0 + >>> reaumur_to_celsius(20.0) + 25.0 + >>> reaumur_to_celsius(40) + 50.0 + >>> reaumur_to_celsius("reaumur") + Traceback (most recent call last): + ... + ValueError: could not convert string to float: 'reaumur' + """ + return round((float(reaumur) * 1.25), ndigits) + + +def reaumur_to_rankine(reaumur: float, ndigits: int = 2) -> float: + """ + Convert a given value from reaumur to rankine and round it to 2 decimal places. + Reference:- http://www.csgnetwork.com/temp2conv.html + + >>> reaumur_to_rankine(0) + 491.67 + >>> reaumur_to_rankine(20.0) + 536.67 + >>> reaumur_to_rankine(40) + 581.67 + >>> reaumur_to_rankine("reaumur") + Traceback (most recent call last): + ... + ValueError: could not convert string to float: 'reaumur' + """ + return round((float(reaumur) * 2.25 + 32 + 459.67), ndigits) + + +if __name__ == "__main__": + + import doctest + + doctest.testmod() diff --git a/python-mega-algo/conversions/weight_conversion.py b/python-mega-algo/conversions/weight_conversion.py new file mode 100644 index 00000000..c344416b --- /dev/null +++ b/python-mega-algo/conversions/weight_conversion.py @@ -0,0 +1,287 @@ +""" +Conversion of weight units. + +__author__ = "Anubhav Solanki" +__license__ = "MIT" +__version__ = "1.0.0" +__maintainer__ = "Anubhav Solanki" +__email__ = "anubhavsolanki0@gmail.com" + +USAGE : +-> Import this file into their respective project. +-> Use the function weight_conversion() for conversion of weight units. +-> Parameters : + -> from_type : From which type you want to convert + -> to_type : To which type you want to convert + -> value : the value which you want to convert + +REFERENCES : + +-> Wikipedia reference: https://en.wikipedia.org/wiki/Kilogram +-> Wikipedia reference: https://en.wikipedia.org/wiki/Gram +-> Wikipedia reference: https://en.wikipedia.org/wiki/Millimetre +-> Wikipedia reference: https://en.wikipedia.org/wiki/Tonne +-> Wikipedia reference: https://en.wikipedia.org/wiki/Long_ton +-> Wikipedia reference: https://en.wikipedia.org/wiki/Short_ton +-> Wikipedia reference: https://en.wikipedia.org/wiki/Pound +-> Wikipedia reference: https://en.wikipedia.org/wiki/Ounce +-> Wikipedia reference: https://en.wikipedia.org/wiki/Fineness#Karat +-> Wikipedia reference: https://en.wikipedia.org/wiki/Dalton_(unit) +""" + +KILOGRAM_CHART: dict[str, float] = { + "kilogram": 1, + "gram": pow(10, 3), + "milligram": pow(10, 6), + "metric-ton": pow(10, -3), + "long-ton": 0.0009842073, + "short-ton": 0.0011023122, + "pound": 2.2046244202, + "ounce": 35.273990723, + "carrat": 5000, + "atomic-mass-unit": 6.022136652e26, +} + +WEIGHT_TYPE_CHART: dict[str, float] = { + "kilogram": 1, + "gram": pow(10, -3), + "milligram": pow(10, -6), + "metric-ton": pow(10, 3), + "long-ton": 1016.04608, + "short-ton": 907.184, + "pound": 0.453592, + "ounce": 0.0283495, + "carrat": 0.0002, + "atomic-mass-unit": 1.660540199e-27, +} + + +def weight_conversion(from_type: str, to_type: str, value: float) -> float: + """ + Conversion of weight unit with the help of KILOGRAM_CHART + + "kilogram" : 1, + "gram" : pow(10, 3), + "milligram" : pow(10, 6), + "metric-ton" : pow(10, -3), + "long-ton" : 0.0009842073, + "short-ton" : 0.0011023122, + "pound" : 2.2046244202, + "ounce" : 35.273990723, + "carrat" : 5000, + "atomic-mass-unit" : 6.022136652E+26 + + >>> weight_conversion("kilogram","kilogram",4) + 4 + >>> weight_conversion("kilogram","gram",1) + 1000 + >>> weight_conversion("kilogram","milligram",4) + 4000000 + >>> weight_conversion("kilogram","metric-ton",4) + 0.004 + >>> weight_conversion("kilogram","long-ton",3) + 0.0029526219 + >>> weight_conversion("kilogram","short-ton",1) + 0.0011023122 + >>> weight_conversion("kilogram","pound",4) + 8.8184976808 + >>> weight_conversion("kilogram","ounce",4) + 141.095962892 + >>> weight_conversion("kilogram","carrat",3) + 15000 + >>> weight_conversion("kilogram","atomic-mass-unit",1) + 6.022136652e+26 + >>> weight_conversion("gram","kilogram",1) + 0.001 + >>> weight_conversion("gram","gram",3) + 3.0 + >>> weight_conversion("gram","milligram",2) + 2000.0 + >>> weight_conversion("gram","metric-ton",4) + 4e-06 + >>> weight_conversion("gram","long-ton",3) + 2.9526219e-06 + >>> weight_conversion("gram","short-ton",3) + 3.3069366000000003e-06 + >>> weight_conversion("gram","pound",3) + 0.0066138732606 + >>> weight_conversion("gram","ounce",1) + 0.035273990723 + >>> weight_conversion("gram","carrat",2) + 10.0 + >>> weight_conversion("gram","atomic-mass-unit",1) + 6.022136652e+23 + >>> weight_conversion("milligram","kilogram",1) + 1e-06 + >>> weight_conversion("milligram","gram",2) + 0.002 + >>> weight_conversion("milligram","milligram",3) + 3.0 + >>> weight_conversion("milligram","metric-ton",3) + 3e-09 + >>> weight_conversion("milligram","long-ton",3) + 2.9526219e-09 + >>> weight_conversion("milligram","short-ton",1) + 1.1023122e-09 + >>> weight_conversion("milligram","pound",3) + 6.6138732605999995e-06 + >>> weight_conversion("milligram","ounce",2) + 7.054798144599999e-05 + >>> weight_conversion("milligram","carrat",1) + 0.005 + >>> weight_conversion("milligram","atomic-mass-unit",1) + 6.022136652e+20 + >>> weight_conversion("metric-ton","kilogram",2) + 2000 + >>> weight_conversion("metric-ton","gram",2) + 2000000 + >>> weight_conversion("metric-ton","milligram",3) + 3000000000 + >>> weight_conversion("metric-ton","metric-ton",2) + 2.0 + >>> weight_conversion("metric-ton","long-ton",3) + 2.9526219 + >>> weight_conversion("metric-ton","short-ton",2) + 2.2046244 + >>> weight_conversion("metric-ton","pound",3) + 6613.8732606 + >>> weight_conversion("metric-ton","ounce",4) + 141095.96289199998 + >>> weight_conversion("metric-ton","carrat",4) + 20000000 + >>> weight_conversion("metric-ton","atomic-mass-unit",1) + 6.022136652e+29 + >>> weight_conversion("long-ton","kilogram",4) + 4064.18432 + >>> weight_conversion("long-ton","gram",4) + 4064184.32 + >>> weight_conversion("long-ton","milligram",3) + 3048138240.0 + >>> weight_conversion("long-ton","metric-ton",4) + 4.06418432 + >>> weight_conversion("long-ton","long-ton",3) + 2.999999907217152 + >>> weight_conversion("long-ton","short-ton",1) + 1.119999989746176 + >>> weight_conversion("long-ton","pound",3) + 6720.000000049448 + >>> weight_conversion("long-ton","ounce",1) + 35840.000000060514 + >>> weight_conversion("long-ton","carrat",4) + 20320921.599999998 + >>> weight_conversion("long-ton","atomic-mass-unit",4) + 2.4475073353955697e+30 + >>> weight_conversion("short-ton","kilogram",3) + 2721.5519999999997 + >>> weight_conversion("short-ton","gram",3) + 2721552.0 + >>> weight_conversion("short-ton","milligram",1) + 907184000.0 + >>> weight_conversion("short-ton","metric-ton",4) + 3.628736 + >>> weight_conversion("short-ton","long-ton",3) + 2.6785713457296 + >>> weight_conversion("short-ton","short-ton",3) + 2.9999999725344 + >>> weight_conversion("short-ton","pound",2) + 4000.0000000294335 + >>> weight_conversion("short-ton","ounce",4) + 128000.00000021611 + >>> weight_conversion("short-ton","carrat",4) + 18143680.0 + >>> weight_conversion("short-ton","atomic-mass-unit",1) + 5.463186016507968e+29 + >>> weight_conversion("pound","kilogram",4) + 1.814368 + >>> weight_conversion("pound","gram",2) + 907.184 + >>> weight_conversion("pound","milligram",3) + 1360776.0 + >>> weight_conversion("pound","metric-ton",3) + 0.001360776 + >>> weight_conversion("pound","long-ton",2) + 0.0008928571152432 + >>> weight_conversion("pound","short-ton",1) + 0.0004999999954224 + >>> weight_conversion("pound","pound",3) + 3.0000000000220752 + >>> weight_conversion("pound","ounce",1) + 16.000000000027015 + >>> weight_conversion("pound","carrat",1) + 2267.96 + >>> weight_conversion("pound","atomic-mass-unit",4) + 1.0926372033015936e+27 + >>> weight_conversion("ounce","kilogram",3) + 0.0850485 + >>> weight_conversion("ounce","gram",3) + 85.0485 + >>> weight_conversion("ounce","milligram",4) + 113398.0 + >>> weight_conversion("ounce","metric-ton",4) + 0.000113398 + >>> weight_conversion("ounce","long-ton",4) + 0.0001116071394054 + >>> weight_conversion("ounce","short-ton",4) + 0.0001249999988556 + >>> weight_conversion("ounce","pound",1) + 0.0625000000004599 + >>> weight_conversion("ounce","ounce",2) + 2.000000000003377 + >>> weight_conversion("ounce","carrat",1) + 141.7475 + >>> weight_conversion("ounce","atomic-mass-unit",1) + 1.70724563015874e+25 + >>> weight_conversion("carrat","kilogram",1) + 0.0002 + >>> weight_conversion("carrat","gram",4) + 0.8 + >>> weight_conversion("carrat","milligram",2) + 400.0 + >>> weight_conversion("carrat","metric-ton",2) + 4.0000000000000003e-07 + >>> weight_conversion("carrat","long-ton",3) + 5.9052438e-07 + >>> weight_conversion("carrat","short-ton",4) + 8.818497600000002e-07 + >>> weight_conversion("carrat","pound",1) + 0.00044092488404000004 + >>> weight_conversion("carrat","ounce",2) + 0.0141095962892 + >>> weight_conversion("carrat","carrat",4) + 4.0 + >>> weight_conversion("carrat","atomic-mass-unit",4) + 4.8177093216e+23 + >>> weight_conversion("atomic-mass-unit","kilogram",4) + 6.642160796e-27 + >>> weight_conversion("atomic-mass-unit","gram",2) + 3.321080398e-24 + >>> weight_conversion("atomic-mass-unit","milligram",2) + 3.3210803980000002e-21 + >>> weight_conversion("atomic-mass-unit","metric-ton",3) + 4.9816205970000004e-30 + >>> weight_conversion("atomic-mass-unit","long-ton",3) + 4.9029473573977584e-30 + >>> weight_conversion("atomic-mass-unit","short-ton",1) + 1.830433719948128e-30 + >>> weight_conversion("atomic-mass-unit","pound",3) + 1.0982602420317504e-26 + >>> weight_conversion("atomic-mass-unit","ounce",2) + 1.1714775914938915e-25 + >>> weight_conversion("atomic-mass-unit","carrat",2) + 1.660540199e-23 + >>> weight_conversion("atomic-mass-unit","atomic-mass-unit",2) + 1.999999998903455 + """ + if to_type not in KILOGRAM_CHART or from_type not in WEIGHT_TYPE_CHART: + raise ValueError( + f"Invalid 'from_type' or 'to_type' value: {from_type!r}, {to_type!r}\n" + f"Supported values are: {', '.join(WEIGHT_TYPE_CHART)}" + ) + return value * KILOGRAM_CHART[to_type] * WEIGHT_TYPE_CHART[from_type] + + +if __name__ == "__main__": + + import doctest + + doctest.testmod() diff --git a/python-mega-algo/data_structures/__init__.py b/python-mega-algo/data_structures/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/data_structures/binary_tree/__init__.py b/python-mega-algo/data_structures/binary_tree/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/data_structures/binary_tree/avl_tree.py b/python-mega-algo/data_structures/binary_tree/avl_tree.py new file mode 100644 index 00000000..e0d3e4d4 --- /dev/null +++ b/python-mega-algo/data_structures/binary_tree/avl_tree.py @@ -0,0 +1,347 @@ +""" +Implementation of an auto-balanced binary tree! +For doctests run following command: +python3 -m doctest -v avl_tree.py +For testing run: +python avl_tree.py +""" + +import math +import random +from typing import Any, List, Optional + + +class my_queue: + def __init__(self) -> None: + self.data: List[Any] = [] + self.head: int = 0 + self.tail: int = 0 + + def is_empty(self) -> bool: + return self.head == self.tail + + def push(self, data: Any) -> None: + self.data.append(data) + self.tail = self.tail + 1 + + def pop(self) -> Any: + ret = self.data[self.head] + self.head = self.head + 1 + return ret + + def count(self) -> int: + return self.tail - self.head + + def print(self) -> None: + print(self.data) + print("**************") + print(self.data[self.head : self.tail]) + + +class my_node: + def __init__(self, data: Any) -> None: + self.data = data + self.left: Optional[my_node] = None + self.right: Optional[my_node] = None + self.height: int = 1 + + def get_data(self) -> Any: + return self.data + + def get_left(self) -> Optional["my_node"]: + return self.left + + def get_right(self) -> Optional["my_node"]: + return self.right + + def get_height(self) -> int: + return self.height + + def set_data(self, data: Any) -> None: + self.data = data + return + + def set_left(self, node: Optional["my_node"]) -> None: + self.left = node + return + + def set_right(self, node: Optional["my_node"]) -> None: + self.right = node + return + + def set_height(self, height: int) -> None: + self.height = height + return + + +def get_height(node: Optional["my_node"]) -> int: + if node is None: + return 0 + return node.get_height() + + +def my_max(a: int, b: int) -> int: + if a > b: + return a + return b + + +def right_rotation(node: my_node) -> my_node: + r""" + A B + / \ / \ + B C Bl A + / \ --> / / \ + Bl Br UB Br C + / + UB + UB = unbalanced node + """ + print("left rotation node:", node.get_data()) + ret = node.get_left() + assert ret is not None + node.set_left(ret.get_right()) + ret.set_right(node) + h1 = my_max(get_height(node.get_right()), get_height(node.get_left())) + 1 + node.set_height(h1) + h2 = my_max(get_height(ret.get_right()), get_height(ret.get_left())) + 1 + ret.set_height(h2) + return ret + + +def left_rotation(node: my_node) -> my_node: + """ + a mirror symmetry rotation of the left_rotation + """ + print("right rotation node:", node.get_data()) + ret = node.get_right() + assert ret is not None + node.set_right(ret.get_left()) + ret.set_left(node) + h1 = my_max(get_height(node.get_right()), get_height(node.get_left())) + 1 + node.set_height(h1) + h2 = my_max(get_height(ret.get_right()), get_height(ret.get_left())) + 1 + ret.set_height(h2) + return ret + + +def lr_rotation(node: my_node) -> my_node: + r""" + A A Br + / \ / \ / \ + B C LR Br C RR B A + / \ --> / \ --> / / \ + Bl Br B UB Bl UB C + \ / + UB Bl + RR = right_rotation LR = left_rotation + """ + left_child = node.get_left() + assert left_child is not None + node.set_left(left_rotation(left_child)) + return right_rotation(node) + + +def rl_rotation(node: my_node) -> my_node: + right_child = node.get_right() + assert right_child is not None + node.set_right(right_rotation(right_child)) + return left_rotation(node) + + +def insert_node(node: Optional["my_node"], data: Any) -> Optional["my_node"]: + if node is None: + return my_node(data) + if data < node.get_data(): + node.set_left(insert_node(node.get_left(), data)) + if ( + get_height(node.get_left()) - get_height(node.get_right()) == 2 + ): # an unbalance detected + left_child = node.get_left() + assert left_child is not None + if ( + data < left_child.get_data() + ): # new node is the left child of the left child + node = right_rotation(node) + else: + node = lr_rotation(node) + else: + node.set_right(insert_node(node.get_right(), data)) + if get_height(node.get_right()) - get_height(node.get_left()) == 2: + right_child = node.get_right() + assert right_child is not None + if data < right_child.get_data(): + node = rl_rotation(node) + else: + node = left_rotation(node) + h1 = my_max(get_height(node.get_right()), get_height(node.get_left())) + 1 + node.set_height(h1) + return node + + +def get_rightMost(root: my_node) -> Any: + while True: + right_child = root.get_right() + if right_child is None: + break + root = right_child + return root.get_data() + + +def get_leftMost(root: my_node) -> Any: + while True: + left_child = root.get_left() + if left_child is None: + break + root = left_child + return root.get_data() + + +def del_node(root: my_node, data: Any) -> Optional["my_node"]: + left_child = root.get_left() + right_child = root.get_right() + if root.get_data() == data: + if left_child is not None and right_child is not None: + temp_data = get_leftMost(right_child) + root.set_data(temp_data) + root.set_right(del_node(right_child, temp_data)) + elif left_child is not None: + root = left_child + elif right_child is not None: + root = right_child + else: + return None + elif root.get_data() > data: + if left_child is None: + print("No such data") + return root + else: + root.set_left(del_node(left_child, data)) + else: # root.get_data() < data + if right_child is None: + return root + else: + root.set_right(del_node(right_child, data)) + + if get_height(right_child) - get_height(left_child) == 2: + assert right_child is not None + if get_height(right_child.get_right()) > get_height(right_child.get_left()): + root = left_rotation(root) + else: + root = rl_rotation(root) + elif get_height(right_child) - get_height(left_child) == -2: + assert left_child is not None + if get_height(left_child.get_left()) > get_height(left_child.get_right()): + root = right_rotation(root) + else: + root = lr_rotation(root) + height = my_max(get_height(root.get_right()), get_height(root.get_left())) + 1 + root.set_height(height) + return root + + +class AVLtree: + """ + An AVL tree doctest + Examples: + >>> t = AVLtree() + >>> t.insert(4) + insert:4 + >>> print(str(t).replace(" \\n","\\n")) + 4 + ************************************* + >>> t.insert(2) + insert:2 + >>> print(str(t).replace(" \\n","\\n").replace(" \\n","\\n")) + 4 + 2 * + ************************************* + >>> t.insert(3) + insert:3 + right rotation node: 2 + left rotation node: 4 + >>> print(str(t).replace(" \\n","\\n").replace(" \\n","\\n")) + 3 + 2 4 + ************************************* + >>> t.get_height() + 2 + >>> t.del_node(3) + delete:3 + >>> print(str(t).replace(" \\n","\\n").replace(" \\n","\\n")) + 4 + 2 * + ************************************* + """ + + def __init__(self) -> None: + self.root: Optional[my_node] = None + + def get_height(self) -> int: + return get_height(self.root) + + def insert(self, data: Any) -> None: + print("insert:" + str(data)) + self.root = insert_node(self.root, data) + + def del_node(self, data: Any) -> None: + print("delete:" + str(data)) + if self.root is None: + print("Tree is empty!") + return + self.root = del_node(self.root, data) + + def __str__( + self, + ) -> str: # a level traversale, gives a more intuitive look on the tree + output = "" + q = my_queue() + q.push(self.root) + layer = self.get_height() + if layer == 0: + return output + cnt = 0 + while not q.is_empty(): + node = q.pop() + space = " " * int(math.pow(2, layer - 1)) + output += space + if node is None: + output += "*" + q.push(None) + q.push(None) + else: + output += str(node.get_data()) + q.push(node.get_left()) + q.push(node.get_right()) + output += space + cnt = cnt + 1 + for i in range(100): + if cnt == math.pow(2, i) - 1: + layer = layer - 1 + if layer == 0: + output += "\n*************************************" + return output + output += "\n" + break + output += "\n*************************************" + return output + + +def _test() -> None: + import doctest + + doctest.testmod() + + +if __name__ == "__main__": + _test() + t = AVLtree() + lst = list(range(10)) + random.shuffle(lst) + for i in lst: + t.insert(i) + print(str(t)) + random.shuffle(lst) + for i in lst: + t.del_node(i) + print(str(t)) diff --git a/python-mega-algo/data_structures/binary_tree/basic_binary_tree.py b/python-mega-algo/data_structures/binary_tree/basic_binary_tree.py new file mode 100644 index 00000000..575b157e --- /dev/null +++ b/python-mega-algo/data_structures/binary_tree/basic_binary_tree.py @@ -0,0 +1,101 @@ +from typing import Optional + + +class Node: + """ + A Node has data variable and pointers to Nodes to its left and right. + """ + + def __init__(self, data: int) -> None: + self.data = data + self.left: Optional[Node] = None + self.right: Optional[Node] = None + + +def display(tree: Optional[Node]) -> None: # In Order traversal of the tree + """ + >>> root = Node(1) + >>> root.left = Node(0) + >>> root.right = Node(2) + >>> display(root) + 0 + 1 + 2 + >>> display(root.right) + 2 + """ + if tree: + display(tree.left) + print(tree.data) + display(tree.right) + + +def depth_of_tree(tree: Optional[Node]) -> int: + """ + Recursive function that returns the depth of a binary tree. + + >>> root = Node(0) + >>> depth_of_tree(root) + 1 + >>> root.left = Node(0) + >>> depth_of_tree(root) + 2 + >>> root.right = Node(0) + >>> depth_of_tree(root) + 2 + >>> root.left.right = Node(0) + >>> depth_of_tree(root) + 3 + >>> depth_of_tree(root.left) + 2 + """ + return 1 + max(depth_of_tree(tree.left), depth_of_tree(tree.right)) if tree else 0 + + +def is_full_binary_tree(tree: Node) -> bool: + """ + Returns True if this is a full binary tree + + >>> root = Node(0) + >>> is_full_binary_tree(root) + True + >>> root.left = Node(0) + >>> is_full_binary_tree(root) + False + >>> root.right = Node(0) + >>> is_full_binary_tree(root) + True + >>> root.left.left = Node(0) + >>> is_full_binary_tree(root) + False + >>> root.right.right = Node(0) + >>> is_full_binary_tree(root) + False + """ + if not tree: + return True + if tree.left and tree.right: + return is_full_binary_tree(tree.left) and is_full_binary_tree(tree.right) + else: + return not tree.left and not tree.right + + +def main() -> None: # Main function for testing. + tree = Node(1) + tree.left = Node(2) + tree.right = Node(3) + tree.left.left = Node(4) + tree.left.right = Node(5) + tree.left.right.left = Node(6) + tree.right.left = Node(7) + tree.right.left.left = Node(8) + tree.right.left.left.right = Node(9) + + print(is_full_binary_tree(tree)) + print(depth_of_tree(tree)) + print("Tree is: ") + display(tree) + + +if __name__ == "__main__": + main() diff --git a/python-mega-algo/data_structures/binary_tree/binary_search_tree.py b/python-mega-algo/data_structures/binary_tree/binary_search_tree.py new file mode 100644 index 00000000..a1ed1d0a --- /dev/null +++ b/python-mega-algo/data_structures/binary_tree/binary_search_tree.py @@ -0,0 +1,221 @@ +""" +A binary search Tree +""" + + +class Node: + def __init__(self, value, parent): + self.value = value + self.parent = parent # Added in order to delete a node easier + self.left = None + self.right = None + + def __repr__(self): + from pprint import pformat + + if self.left is None and self.right is None: + return str(self.value) + return pformat({"%s" % (self.value): (self.left, self.right)}, indent=1) + + +class BinarySearchTree: + def __init__(self, root=None): + self.root = root + + def __str__(self): + """ + Return a string of all the Nodes using in order traversal + """ + return str(self.root) + + def __reassign_nodes(self, node, new_children): + if new_children is not None: # reset its kids + new_children.parent = node.parent + if node.parent is not None: # reset its parent + if self.is_right(node): # If it is the right children + node.parent.right = new_children + else: + node.parent.left = new_children + else: + self.root = new_children + + def is_right(self, node): + return node == node.parent.right + + def empty(self): + return self.root is None + + def __insert(self, value): + """ + Insert a new node in Binary Search Tree with value label + """ + new_node = Node(value, None) # create a new Node + if self.empty(): # if Tree is empty + self.root = new_node # set its root + else: # Tree is not empty + parent_node = self.root # from root + while True: # While we don't get to a leaf + if value < parent_node.value: # We go left + if parent_node.left is None: + parent_node.left = new_node # We insert the new node in a leaf + break + else: + parent_node = parent_node.left + else: + if parent_node.right is None: + parent_node.right = new_node + break + else: + parent_node = parent_node.right + new_node.parent = parent_node + + def insert(self, *values): + for value in values: + self.__insert(value) + return self + + def search(self, value): + if self.empty(): + raise IndexError("Warning: Tree is empty! please use another.") + else: + node = self.root + # use lazy evaluation here to avoid NoneType Attribute error + while node is not None and node.value is not value: + node = node.left if value < node.value else node.right + return node + + def get_max(self, node=None): + """ + We go deep on the right branch + """ + if node is None: + node = self.root + if not self.empty(): + while node.right is not None: + node = node.right + return node + + def get_min(self, node=None): + """ + We go deep on the left branch + """ + if node is None: + node = self.root + if not self.empty(): + node = self.root + while node.left is not None: + node = node.left + return node + + def remove(self, value): + node = self.search(value) # Look for the node with that label + if node is not None: + if node.left is None and node.right is None: # If it has no children + self.__reassign_nodes(node, None) + elif node.left is None: # Has only right children + self.__reassign_nodes(node, node.right) + elif node.right is None: # Has only left children + self.__reassign_nodes(node, node.left) + else: + tmp_node = self.get_max( + node.left + ) # Gets the max value of the left branch + self.remove(tmp_node.value) + node.value = ( + tmp_node.value + ) # Assigns the value to the node to delete and keep tree structure + + def preorder_traverse(self, node): + if node is not None: + yield node # Preorder Traversal + yield from self.preorder_traverse(node.left) + yield from self.preorder_traverse(node.right) + + def traversal_tree(self, traversal_function=None): + """ + This function traversal the tree. + You can pass a function to traversal the tree as needed by client code + """ + if traversal_function is None: + return self.preorder_traverse(self.root) + else: + return traversal_function(self.root) + + def inorder(self, arr: list, node: Node): + """Perform an inorder traversal and append values of the nodes to + a list named arr""" + if node: + self.inorder(arr, node.left) + arr.append(node.value) + self.inorder(arr, node.right) + + def find_kth_smallest(self, k: int, node: Node) -> int: + """Return the kth smallest element in a binary search tree""" + arr = [] + self.inorder(arr, node) # append all values to list using inorder traversal + return arr[k - 1] + + +def postorder(curr_node): + """ + postOrder (left, right, self) + """ + node_list = list() + if curr_node is not None: + node_list = postorder(curr_node.left) + postorder(curr_node.right) + [curr_node] + return node_list + + +def binary_search_tree(): + r""" + Example + 8 + / \ + 3 10 + / \ \ + 1 6 14 + / \ / + 4 7 13 + + >>> t = BinarySearchTree().insert(8, 3, 6, 1, 10, 14, 13, 4, 7) + >>> print(" ".join(repr(i.value) for i in t.traversal_tree())) + 8 3 1 6 4 7 10 14 13 + >>> print(" ".join(repr(i.value) for i in t.traversal_tree(postorder))) + 1 4 7 6 3 13 14 10 8 + >>> BinarySearchTree().search(6) + Traceback (most recent call last): + ... + IndexError: Warning: Tree is empty! please use another. + """ + testlist = (8, 3, 6, 1, 10, 14, 13, 4, 7) + t = BinarySearchTree() + for i in testlist: + t.insert(i) + + # Prints all the elements of the list in order traversal + print(t) + + if t.search(6) is not None: + print("The value 6 exists") + else: + print("The value 6 doesn't exist") + + if t.search(-1) is not None: + print("The value -1 exists") + else: + print("The value -1 doesn't exist") + + if not t.empty(): + print("Max Value: ", t.get_max().value) + print("Min Value: ", t.get_min().value) + + for i in testlist: + t.remove(i) + print(t) + + +if __name__ == "__main__": + import doctest + + doctest.testmod() + # binary_search_tree() diff --git a/python-mega-algo/data_structures/binary_tree/binary_search_tree_recursive.py b/python-mega-algo/data_structures/binary_tree/binary_search_tree_recursive.py new file mode 100644 index 00000000..a05e28a7 --- /dev/null +++ b/python-mega-algo/data_structures/binary_tree/binary_search_tree_recursive.py @@ -0,0 +1,638 @@ +""" +This is a python3 implementation of binary search tree using recursion + +To run tests: +python -m unittest binary_search_tree_recursive.py + +To run an example: +python binary_search_tree_recursive.py +""" +import unittest +from typing import Iterator, Optional + + +class Node: + def __init__(self, label: int, parent: Optional["Node"]) -> None: + self.label = label + self.parent = parent + self.left: Optional[Node] = None + self.right: Optional[Node] = None + + +class BinarySearchTree: + def __init__(self) -> None: + self.root: Optional[Node] = None + + def empty(self) -> None: + """ + Empties the tree + + >>> t = BinarySearchTree() + >>> assert t.root is None + >>> t.put(8) + >>> assert t.root is not None + """ + self.root = None + + def is_empty(self) -> bool: + """ + Checks if the tree is empty + + >>> t = BinarySearchTree() + >>> t.is_empty() + True + >>> t.put(8) + >>> t.is_empty() + False + """ + return self.root is None + + def put(self, label: int) -> None: + """ + Put a new node in the tree + + >>> t = BinarySearchTree() + >>> t.put(8) + >>> assert t.root.parent is None + >>> assert t.root.label == 8 + + >>> t.put(10) + >>> assert t.root.right.parent == t.root + >>> assert t.root.right.label == 10 + + >>> t.put(3) + >>> assert t.root.left.parent == t.root + >>> assert t.root.left.label == 3 + """ + self.root = self._put(self.root, label) + + def _put( + self, node: Optional[Node], label: int, parent: Optional[Node] = None + ) -> Node: + if node is None: + node = Node(label, parent) + else: + if label < node.label: + node.left = self._put(node.left, label, node) + elif label > node.label: + node.right = self._put(node.right, label, node) + else: + raise Exception(f"Node with label {label} already exists") + + return node + + def search(self, label: int) -> Node: + """ + Searches a node in the tree + + >>> t = BinarySearchTree() + >>> t.put(8) + >>> t.put(10) + >>> node = t.search(8) + >>> assert node.label == 8 + + >>> node = t.search(3) + Traceback (most recent call last): + ... + Exception: Node with label 3 does not exist + """ + return self._search(self.root, label) + + def _search(self, node: Optional[Node], label: int) -> Node: + if node is None: + raise Exception(f"Node with label {label} does not exist") + else: + if label < node.label: + node = self._search(node.left, label) + elif label > node.label: + node = self._search(node.right, label) + + return node + + def remove(self, label: int) -> None: + """ + Removes a node in the tree + + >>> t = BinarySearchTree() + >>> t.put(8) + >>> t.put(10) + >>> t.remove(8) + >>> assert t.root.label == 10 + + >>> t.remove(3) + Traceback (most recent call last): + ... + Exception: Node with label 3 does not exist + """ + node = self.search(label) + if node.right and node.left: + lowest_node = self._get_lowest_node(node.right) + lowest_node.left = node.left + lowest_node.right = node.right + node.left.parent = lowest_node + if node.right: + node.right.parent = lowest_node + self._reassign_nodes(node, lowest_node) + elif not node.right and node.left: + self._reassign_nodes(node, node.left) + elif node.right and not node.left: + self._reassign_nodes(node, node.right) + else: + self._reassign_nodes(node, None) + + def _reassign_nodes(self, node: Node, new_children: Optional[Node]) -> None: + if new_children: + new_children.parent = node.parent + + if node.parent: + if node.parent.right == node: + node.parent.right = new_children + else: + node.parent.left = new_children + else: + self.root = new_children + + def _get_lowest_node(self, node: Node) -> Node: + if node.left: + lowest_node = self._get_lowest_node(node.left) + else: + lowest_node = node + self._reassign_nodes(node, node.right) + + return lowest_node + + def exists(self, label: int) -> bool: + """ + Checks if a node exists in the tree + + >>> t = BinarySearchTree() + >>> t.put(8) + >>> t.put(10) + >>> t.exists(8) + True + + >>> t.exists(3) + False + """ + try: + self.search(label) + return True + except Exception: + return False + + def get_max_label(self) -> int: + """ + Gets the max label inserted in the tree + + >>> t = BinarySearchTree() + >>> t.get_max_label() + Traceback (most recent call last): + ... + Exception: Binary search tree is empty + + >>> t.put(8) + >>> t.put(10) + >>> t.get_max_label() + 10 + """ + if self.root is None: + raise Exception("Binary search tree is empty") + + node = self.root + while node.right is not None: + node = node.right + + return node.label + + def get_min_label(self) -> int: + """ + Gets the min label inserted in the tree + + >>> t = BinarySearchTree() + >>> t.get_min_label() + Traceback (most recent call last): + ... + Exception: Binary search tree is empty + + >>> t.put(8) + >>> t.put(10) + >>> t.get_min_label() + 8 + """ + if self.root is None: + raise Exception("Binary search tree is empty") + + node = self.root + while node.left is not None: + node = node.left + + return node.label + + def inorder_traversal(self) -> Iterator[Node]: + """ + Return the inorder traversal of the tree + + >>> t = BinarySearchTree() + >>> [i.label for i in t.inorder_traversal()] + [] + + >>> t.put(8) + >>> t.put(10) + >>> t.put(9) + >>> [i.label for i in t.inorder_traversal()] + [8, 9, 10] + """ + return self._inorder_traversal(self.root) + + def _inorder_traversal(self, node: Optional[Node]) -> Iterator[Node]: + if node is not None: + yield from self._inorder_traversal(node.left) + yield node + yield from self._inorder_traversal(node.right) + + def preorder_traversal(self) -> Iterator[Node]: + """ + Return the preorder traversal of the tree + + >>> t = BinarySearchTree() + >>> [i.label for i in t.preorder_traversal()] + [] + + >>> t.put(8) + >>> t.put(10) + >>> t.put(9) + >>> [i.label for i in t.preorder_traversal()] + [8, 10, 9] + """ + return self._preorder_traversal(self.root) + + def _preorder_traversal(self, node: Optional[Node]) -> Iterator[Node]: + if node is not None: + yield node + yield from self._preorder_traversal(node.left) + yield from self._preorder_traversal(node.right) + + +class BinarySearchTreeTest(unittest.TestCase): + @staticmethod + def _get_binary_search_tree() -> BinarySearchTree: + r""" + 8 + / \ + 3 10 + / \ \ + 1 6 14 + / \ / + 4 7 13 + \ + 5 + """ + t = BinarySearchTree() + t.put(8) + t.put(3) + t.put(6) + t.put(1) + t.put(10) + t.put(14) + t.put(13) + t.put(4) + t.put(7) + t.put(5) + + return t + + def test_put(self) -> None: + t = BinarySearchTree() + assert t.is_empty() + + t.put(8) + r""" + 8 + """ + assert t.root is not None + assert t.root.parent is None + assert t.root.label == 8 + + t.put(10) + r""" + 8 + \ + 10 + """ + assert t.root.right is not None + assert t.root.right.parent == t.root + assert t.root.right.label == 10 + + t.put(3) + r""" + 8 + / \ + 3 10 + """ + assert t.root.left is not None + assert t.root.left.parent == t.root + assert t.root.left.label == 3 + + t.put(6) + r""" + 8 + / \ + 3 10 + \ + 6 + """ + assert t.root.left.right is not None + assert t.root.left.right.parent == t.root.left + assert t.root.left.right.label == 6 + + t.put(1) + r""" + 8 + / \ + 3 10 + / \ + 1 6 + """ + assert t.root.left.left is not None + assert t.root.left.left.parent == t.root.left + assert t.root.left.left.label == 1 + + with self.assertRaises(Exception): + t.put(1) + + def test_search(self) -> None: + t = self._get_binary_search_tree() + + node = t.search(6) + assert node.label == 6 + + node = t.search(13) + assert node.label == 13 + + with self.assertRaises(Exception): + t.search(2) + + def test_remove(self) -> None: + t = self._get_binary_search_tree() + + t.remove(13) + r""" + 8 + / \ + 3 10 + / \ \ + 1 6 14 + / \ + 4 7 + \ + 5 + """ + assert t.root is not None + assert t.root.right is not None + assert t.root.right.right is not None + assert t.root.right.right.right is None + assert t.root.right.right.left is None + + t.remove(7) + r""" + 8 + / \ + 3 10 + / \ \ + 1 6 14 + / + 4 + \ + 5 + """ + assert t.root.left is not None + assert t.root.left.right is not None + assert t.root.left.right.left is not None + assert t.root.left.right.right is None + assert t.root.left.right.left.label == 4 + + t.remove(6) + r""" + 8 + / \ + 3 10 + / \ \ + 1 4 14 + \ + 5 + """ + assert t.root.left.left is not None + assert t.root.left.right.right is not None + assert t.root.left.left.label == 1 + assert t.root.left.right.label == 4 + assert t.root.left.right.right.label == 5 + assert t.root.left.right.left is None + assert t.root.left.left.parent == t.root.left + assert t.root.left.right.parent == t.root.left + + t.remove(3) + r""" + 8 + / \ + 4 10 + / \ \ + 1 5 14 + """ + assert t.root is not None + assert t.root.left.label == 4 + assert t.root.left.right.label == 5 + assert t.root.left.left.label == 1 + assert t.root.left.parent == t.root + assert t.root.left.left.parent == t.root.left + assert t.root.left.right.parent == t.root.left + + t.remove(4) + r""" + 8 + / \ + 5 10 + / \ + 1 14 + """ + assert t.root.left is not None + assert t.root.left.left is not None + assert t.root.left.label == 5 + assert t.root.left.right is None + assert t.root.left.left.label == 1 + assert t.root.left.parent == t.root + assert t.root.left.left.parent == t.root.left + + def test_remove_2(self) -> None: + t = self._get_binary_search_tree() + + t.remove(3) + r""" + 8 + / \ + 4 10 + / \ \ + 1 6 14 + / \ / + 5 7 13 + """ + assert t.root is not None + assert t.root.left is not None + assert t.root.left.left is not None + assert t.root.left.right is not None + assert t.root.left.right.left is not None + assert t.root.left.right.right is not None + assert t.root.left.label == 4 + assert t.root.left.right.label == 6 + assert t.root.left.left.label == 1 + assert t.root.left.right.right.label == 7 + assert t.root.left.right.left.label == 5 + assert t.root.left.parent == t.root + assert t.root.left.right.parent == t.root.left + assert t.root.left.left.parent == t.root.left + assert t.root.left.right.left.parent == t.root.left.right + + def test_empty(self) -> None: + t = self._get_binary_search_tree() + t.empty() + assert t.root is None + + def test_is_empty(self) -> None: + t = self._get_binary_search_tree() + assert not t.is_empty() + + t.empty() + assert t.is_empty() + + def test_exists(self) -> None: + t = self._get_binary_search_tree() + + assert t.exists(6) + assert not t.exists(-1) + + def test_get_max_label(self) -> None: + t = self._get_binary_search_tree() + + assert t.get_max_label() == 14 + + t.empty() + with self.assertRaises(Exception): + t.get_max_label() + + def test_get_min_label(self) -> None: + t = self._get_binary_search_tree() + + assert t.get_min_label() == 1 + + t.empty() + with self.assertRaises(Exception): + t.get_min_label() + + def test_inorder_traversal(self) -> None: + t = self._get_binary_search_tree() + + inorder_traversal_nodes = [i.label for i in t.inorder_traversal()] + assert inorder_traversal_nodes == [1, 3, 4, 5, 6, 7, 8, 10, 13, 14] + + def test_preorder_traversal(self) -> None: + t = self._get_binary_search_tree() + + preorder_traversal_nodes = [i.label for i in t.preorder_traversal()] + assert preorder_traversal_nodes == [8, 3, 1, 6, 4, 5, 7, 10, 14, 13] + + +def binary_search_tree_example() -> None: + r""" + Example + 8 + / \ + 3 10 + / \ \ + 1 6 14 + / \ / + 4 7 13 + \ + 5 + + Example After Deletion + 4 + / \ + 1 7 + \ + 5 + + """ + + t = BinarySearchTree() + t.put(8) + t.put(3) + t.put(6) + t.put(1) + t.put(10) + t.put(14) + t.put(13) + t.put(4) + t.put(7) + t.put(5) + + print( + """ + 8 + / \\ + 3 10 + / \\ \\ + 1 6 14 + / \\ / + 4 7 13 + \\ + 5 + """ + ) + + print("Label 6 exists:", t.exists(6)) + print("Label 13 exists:", t.exists(13)) + print("Label -1 exists:", t.exists(-1)) + print("Label 12 exists:", t.exists(12)) + + # Prints all the elements of the list in inorder traversal + inorder_traversal_nodes = [i.label for i in t.inorder_traversal()] + print("Inorder traversal:", inorder_traversal_nodes) + + # Prints all the elements of the list in preorder traversal + preorder_traversal_nodes = [i.label for i in t.preorder_traversal()] + print("Preorder traversal:", preorder_traversal_nodes) + + print("Max. label:", t.get_max_label()) + print("Min. label:", t.get_min_label()) + + # Delete elements + print("\nDeleting elements 13, 10, 8, 3, 6, 14") + print( + """ + 4 + / \\ + 1 7 + \\ + 5 + """ + ) + t.remove(13) + t.remove(10) + t.remove(8) + t.remove(3) + t.remove(6) + t.remove(14) + + # Prints all the elements of the list in inorder traversal after delete + inorder_traversal_nodes = [i.label for i in t.inorder_traversal()] + print("Inorder traversal after delete:", inorder_traversal_nodes) + + # Prints all the elements of the list in preorder traversal after delete + preorder_traversal_nodes = [i.label for i in t.preorder_traversal()] + print("Preorder traversal after delete:", preorder_traversal_nodes) + + print("Max. label:", t.get_max_label()) + print("Min. label:", t.get_min_label()) + + +if __name__ == "__main__": + binary_search_tree_example() diff --git a/python-mega-algo/data_structures/binary_tree/binary_tree_mirror.py b/python-mega-algo/data_structures/binary_tree/binary_tree_mirror.py new file mode 100644 index 00000000..dc7f657b --- /dev/null +++ b/python-mega-algo/data_structures/binary_tree/binary_tree_mirror.py @@ -0,0 +1,44 @@ +""" +Problem Description: +Given a binary tree, return it's mirror. +""" + + +def binary_tree_mirror_dict(binary_tree_mirror_dictionary: dict, root: int): + if not root or root not in binary_tree_mirror_dictionary: + return + left_child, right_child = binary_tree_mirror_dictionary[root][:2] + binary_tree_mirror_dictionary[root] = [right_child, left_child] + binary_tree_mirror_dict(binary_tree_mirror_dictionary, left_child) + binary_tree_mirror_dict(binary_tree_mirror_dictionary, right_child) + + +def binary_tree_mirror(binary_tree: dict, root: int = 1) -> dict: + """ + >>> binary_tree_mirror({ 1: [2,3], 2: [4,5], 3: [6,7], 7: [8,9]}, 1) + {1: [3, 2], 2: [5, 4], 3: [7, 6], 7: [9, 8]} + >>> binary_tree_mirror({ 1: [2,3], 2: [4,5], 3: [6,7], 4: [10,11]}, 1) + {1: [3, 2], 2: [5, 4], 3: [7, 6], 4: [11, 10]} + >>> binary_tree_mirror({ 1: [2,3], 2: [4,5], 3: [6,7], 4: [10,11]}, 5) + Traceback (most recent call last): + ... + ValueError: root 5 is not present in the binary_tree + >>> binary_tree_mirror({}, 5) + Traceback (most recent call last): + ... + ValueError: binary tree cannot be empty + """ + if not binary_tree: + raise ValueError("binary tree cannot be empty") + if root not in binary_tree: + raise ValueError(f"root {root} is not present in the binary_tree") + binary_tree_mirror_dictionary = dict(binary_tree) + binary_tree_mirror_dict(binary_tree_mirror_dictionary, root) + return binary_tree_mirror_dictionary + + +if __name__ == "__main__": + binary_tree = {1: [2, 3], 2: [4, 5], 3: [6, 7], 7: [8, 9]} + print(f"Binary tree: {binary_tree}") + binary_tree_mirror_dictionary = binary_tree_mirror(binary_tree, 5) + print(f"Binary tree mirror: {binary_tree_mirror_dictionary}") diff --git a/python-mega-algo/data_structures/binary_tree/binary_tree_traversals.py b/python-mega-algo/data_structures/binary_tree/binary_tree_traversals.py new file mode 100644 index 00000000..ce42eed1 --- /dev/null +++ b/python-mega-algo/data_structures/binary_tree/binary_tree_traversals.py @@ -0,0 +1,154 @@ +# https://en.wikipedia.org/wiki/Tree_traversal +from dataclasses import dataclass +from typing import Optional + + +@dataclass +class Node: + data: int + left: Optional["Node"] = None + right: Optional["Node"] = None + + +def make_tree() -> Node: + return Node(1, Node(2, Node(4), Node(5)), Node(3)) + + +def preorder(root: Node): + """ + Pre-order traversal visits root node, left subtree, right subtree. + >>> preorder(make_tree()) + [1, 2, 4, 5, 3] + """ + return [root.data] + preorder(root.left) + preorder(root.right) if root else [] + + +def postorder(root: Node): + """ + Post-order traversal visits left subtree, right subtree, root node. + >>> postorder(make_tree()) + [4, 5, 2, 3, 1] + """ + return postorder(root.left) + postorder(root.right) + [root.data] if root else [] + + +def inorder(root: Node): + """ + In-order traversal visits left subtree, root node, right subtree. + >>> inorder(make_tree()) + [4, 2, 5, 1, 3] + """ + return inorder(root.left) + [root.data] + inorder(root.right) if root else [] + + +def height(root: Node): + """ + Recursive function for calculating the height of the binary tree. + >>> height(None) + 0 + >>> height(make_tree()) + 3 + """ + return (max(height(root.left), height(root.right)) + 1) if root else 0 + + +def level_order_1(root: Node): + """ + Print whole binary tree in Level Order Traverse. + Level Order traverse: Visit nodes of the tree level-by-level. + """ + if not root: + return + temp = root + que = [temp] + while len(que) > 0: + print(que[0].data, end=" ") + temp = que.pop(0) + if temp.left: + que.append(temp.left) + if temp.right: + que.append(temp.right) + return que + + +def level_order_2(root: Node, level: int): + """ + Level-wise traversal: Print all nodes present at the given level of the binary tree + """ + if not root: + return root + if level == 1: + print(root.data, end=" ") + elif level > 1: + level_order_2(root.left, level - 1) + level_order_2(root.right, level - 1) + + +def print_left_to_right(root: Node, level: int): + """ + Print elements on particular level from left to right direction of the binary tree. + """ + if not root: + return + if level == 1: + print(root.data, end=" ") + elif level > 1: + print_left_to_right(root.left, level - 1) + print_left_to_right(root.right, level - 1) + + +def print_right_to_left(root: Node, level: int): + """ + Print elements on particular level from right to left direction of the binary tree. + """ + if not root: + return + if level == 1: + print(root.data, end=" ") + elif level > 1: + print_right_to_left(root.right, level - 1) + print_right_to_left(root.left, level - 1) + + +def zigzag(root: Node): + """ + ZigZag traverse: Print node left to right and right to left, alternatively. + """ + flag = 0 + height_tree = height(root) + for h in range(1, height_tree + 1): + if flag == 0: + print_left_to_right(root, h) + flag = 1 + else: + print_right_to_left(root, h) + flag = 0 + + +def main(): # Main function for testing. + """ + Create binary tree. + """ + root = make_tree() + """ + All Traversals of the binary are as follows: + """ + print(f" In-order Traversal is {inorder(root)}") + print(f" Pre-order Traversal is {preorder(root)}") + print(f"Post-order Traversal is {postorder(root)}") + print(f"Height of Tree is {height(root)}") + print("Complete Level Order Traversal is : ") + level_order_1(root) + print("\nLevel-wise order Traversal is : ") + for h in range(1, height(root) + 1): + level_order_2(root, h) + print("\nZigZag order Traversal is : ") + zigzag(root) + print() + + +if __name__ == "__main__": + import doctest + + doctest.testmod() + main() diff --git a/python-mega-algo/data_structures/binary_tree/fenwick_tree.py b/python-mega-algo/data_structures/binary_tree/fenwick_tree.py new file mode 100644 index 00000000..54f0f07a --- /dev/null +++ b/python-mega-algo/data_structures/binary_tree/fenwick_tree.py @@ -0,0 +1,28 @@ +class FenwickTree: + def __init__(self, SIZE): # create fenwick tree with size SIZE + self.Size = SIZE + self.ft = [0 for i in range(0, SIZE)] + + def update(self, i, val): # update data (adding) in index i in O(lg N) + while i < self.Size: + self.ft[i] += val + i += i & (-i) + + def query(self, i): # query cumulative data from index 0 to i in O(lg N) + ret = 0 + while i > 0: + ret += self.ft[i] + i -= i & (-i) + return ret + + +if __name__ == "__main__": + f = FenwickTree(100) + f.update(1, 20) + f.update(4, 4) + print(f.query(1)) + print(f.query(3)) + print(f.query(4)) + f.update(2, -5) + print(f.query(1)) + print(f.query(3)) diff --git a/python-mega-algo/data_structures/binary_tree/lazy_segment_tree.py b/python-mega-algo/data_structures/binary_tree/lazy_segment_tree.py new file mode 100644 index 00000000..9066db29 --- /dev/null +++ b/python-mega-algo/data_structures/binary_tree/lazy_segment_tree.py @@ -0,0 +1,137 @@ +from __future__ import annotations + +import math +from typing import List, Union + + +class SegmentTree: + def __init__(self, size: int) -> None: + self.size = size + # approximate the overall size of segment tree with given value + self.segment_tree = [0 for i in range(0, 4 * size)] + # create array to store lazy update + self.lazy = [0 for i in range(0, 4 * size)] + self.flag = [0 for i in range(0, 4 * size)] # flag for lazy update + + def left(self, idx: int) -> int: + """ + >>> segment_tree = SegmentTree(15) + >>> segment_tree.left(1) + 2 + >>> segment_tree.left(2) + 4 + >>> segment_tree.left(12) + 24 + """ + return idx * 2 + + def right(self, idx: int) -> int: + """ + >>> segment_tree = SegmentTree(15) + >>> segment_tree.right(1) + 3 + >>> segment_tree.right(2) + 5 + >>> segment_tree.right(12) + 25 + """ + return idx * 2 + 1 + + def build( + self, idx: int, left_element: int, right_element: int, A: List[int] + ) -> None: + if left_element == right_element: + self.segment_tree[idx] = A[left_element - 1] + else: + mid = (left_element + right_element) // 2 + self.build(self.left(idx), left_element, mid, A) + self.build(self.right(idx), mid + 1, right_element, A) + self.segment_tree[idx] = max( + self.segment_tree[self.left(idx)], self.segment_tree[self.right(idx)] + ) + + def update( + self, idx: int, left_element: int, right_element: int, a: int, b: int, val: int + ) -> bool: + """ + update with O(lg n) (Normal segment tree without lazy update will take O(nlg n) + for each update) + + update(1, 1, size, a, b, v) for update val v to [a,b] + """ + if self.flag[idx] is True: + self.segment_tree[idx] = self.lazy[idx] + self.flag[idx] = False + if left_element != right_element: + self.lazy[self.left(idx)] = self.lazy[idx] + self.lazy[self.right(idx)] = self.lazy[idx] + self.flag[self.left(idx)] = True + self.flag[self.right(idx)] = True + + if right_element < a or left_element > b: + return True + if left_element >= a and right_element <= b: + self.segment_tree[idx] = val + if left_element != right_element: + self.lazy[self.left(idx)] = val + self.lazy[self.right(idx)] = val + self.flag[self.left(idx)] = True + self.flag[self.right(idx)] = True + return True + mid = (left_element + right_element) // 2 + self.update(self.left(idx), left_element, mid, a, b, val) + self.update(self.right(idx), mid + 1, right_element, a, b, val) + self.segment_tree[idx] = max( + self.segment_tree[self.left(idx)], self.segment_tree[self.right(idx)] + ) + return True + + # query with O(lg n) + def query( + self, idx: int, left_element: int, right_element: int, a: int, b: int + ) -> Union[int, float]: + """ + query(1, 1, size, a, b) for query max of [a,b] + >>> A = [1, 2, -4, 7, 3, -5, 6, 11, -20, 9, 14, 15, 5, 2, -8] + >>> segment_tree = SegmentTree(15) + >>> segment_tree.build(1, 1, 15, A) + >>> segment_tree.query(1, 1, 15, 4, 6) + 7 + >>> segment_tree.query(1, 1, 15, 7, 11) + 14 + >>> segment_tree.query(1, 1, 15, 7, 12) + 15 + """ + if self.flag[idx] is True: + self.segment_tree[idx] = self.lazy[idx] + self.flag[idx] = False + if left_element != right_element: + self.lazy[self.left(idx)] = self.lazy[idx] + self.lazy[self.right(idx)] = self.lazy[idx] + self.flag[self.left(idx)] = True + self.flag[self.right(idx)] = True + if right_element < a or left_element > b: + return -math.inf + if left_element >= a and right_element <= b: + return self.segment_tree[idx] + mid = (left_element + right_element) // 2 + q1 = self.query(self.left(idx), left_element, mid, a, b) + q2 = self.query(self.right(idx), mid + 1, right_element, a, b) + return max(q1, q2) + + def __str__(self) -> str: + return str([self.query(1, 1, self.size, i, i) for i in range(1, self.size + 1)]) + + +if __name__ == "__main__": + A = [1, 2, -4, 7, 3, -5, 6, 11, -20, 9, 14, 15, 5, 2, -8] + size = 15 + segt = SegmentTree(size) + segt.build(1, 1, size, A) + print(segt.query(1, 1, size, 4, 6)) + print(segt.query(1, 1, size, 7, 11)) + print(segt.query(1, 1, size, 7, 12)) + segt.update(1, 1, size, 1, 3, 111) + print(segt.query(1, 1, size, 1, 15)) + segt.update(1, 1, size, 7, 8, 235) + print(segt) diff --git a/python-mega-algo/data_structures/binary_tree/lowest_common_ancestor.py b/python-mega-algo/data_structures/binary_tree/lowest_common_ancestor.py new file mode 100644 index 00000000..2f1e893f --- /dev/null +++ b/python-mega-algo/data_structures/binary_tree/lowest_common_ancestor.py @@ -0,0 +1,117 @@ +# https://en.wikipedia.org/wiki/Lowest_common_ancestor +# https://en.wikipedia.org/wiki/Breadth-first_search + +from __future__ import annotations + +import queue + + +def swap(a: int, b: int) -> tuple[int, int]: + """ + Return a tuple (b, a) when given two integers a and b + >>> swap(2,3) + (3, 2) + >>> swap(3,4) + (4, 3) + >>> swap(67, 12) + (12, 67) + """ + a ^= b + b ^= a + a ^= b + return a, b + + +def create_sparse(max_node: int, parent: list[list[int]]) -> list[list[int]]: + """ + creating sparse table which saves each nodes 2^i-th parent + """ + j = 1 + while (1 << j) < max_node: + for i in range(1, max_node + 1): + parent[j][i] = parent[j - 1][parent[j - 1][i]] + j += 1 + return parent + + +# returns lca of node u,v +def lowest_common_ancestor( + u: int, v: int, level: list[int], parent: list[list[int]] +) -> list[list[int]]: + # u must be deeper in the tree than v + if level[u] < level[v]: + u, v = swap(u, v) + # making depth of u same as depth of v + for i in range(18, -1, -1): + if level[u] - (1 << i) >= level[v]: + u = parent[i][u] + # at the same depth if u==v that mean lca is found + if u == v: + return u + # moving both nodes upwards till lca in found + for i in range(18, -1, -1): + if parent[i][u] != 0 and parent[i][u] != parent[i][v]: + u, v = parent[i][u], parent[i][v] + # returning longest common ancestor of u,v + return parent[0][u] + + +# runs a breadth first search from root node of the tree +def breadth_first_search( + level: list[int], + parent: list[list[int]], + max_node: int, + graph: dict[int, int], + root=1, +) -> tuple[list[int], list[list[int]]]: + """ + sets every nodes direct parent + parent of root node is set to 0 + calculates depth of each node from root node + """ + level[root] = 0 + q = queue.Queue(maxsize=max_node) + q.put(root) + while q.qsize() != 0: + u = q.get() + for v in graph[u]: + if level[v] == -1: + level[v] = level[u] + 1 + q.put(v) + parent[0][v] = u + return level, parent + + +def main() -> None: + max_node = 13 + # initializing with 0 + parent = [[0 for _ in range(max_node + 10)] for _ in range(20)] + # initializing with -1 which means every node is unvisited + level = [-1 for _ in range(max_node + 10)] + graph = { + 1: [2, 3, 4], + 2: [5], + 3: [6, 7], + 4: [8], + 5: [9, 10], + 6: [11], + 7: [], + 8: [12, 13], + 9: [], + 10: [], + 11: [], + 12: [], + 13: [], + } + level, parent = breadth_first_search(level, parent, max_node, graph, 1) + parent = create_sparse(max_node, parent) + print("LCA of node 1 and 3 is: ", lowest_common_ancestor(1, 3, level, parent)) + print("LCA of node 5 and 6 is: ", lowest_common_ancestor(5, 6, level, parent)) + print("LCA of node 7 and 11 is: ", lowest_common_ancestor(7, 11, level, parent)) + print("LCA of node 6 and 7 is: ", lowest_common_ancestor(6, 7, level, parent)) + print("LCA of node 4 and 12 is: ", lowest_common_ancestor(4, 12, level, parent)) + print("LCA of node 8 and 8 is: ", lowest_common_ancestor(8, 8, level, parent)) + + +if __name__ == "__main__": + main() diff --git a/python-mega-algo/data_structures/binary_tree/merge_two_binary_trees.py b/python-mega-algo/data_structures/binary_tree/merge_two_binary_trees.py new file mode 100644 index 00000000..6b202adb --- /dev/null +++ b/python-mega-algo/data_structures/binary_tree/merge_two_binary_trees.py @@ -0,0 +1,93 @@ +#!/usr/local/bin/python3 +""" +Problem Description: Given two binary tree, return the merged tree. +The rule for merging is that if two nodes overlap, then put the value sum of +both nodes to the new value of the merged node. Otherwise, the NOT null node +will be used as the node of new tree. +""" +from typing import Optional + + +class Node: + """ + A binary node has value variable and pointers to its left and right node. + """ + + def __init__(self, value: int = 0) -> None: + self.value = value + self.left: Optional[Node] = None + self.right: Optional[Node] = None + + +def merge_two_binary_trees(tree1: Optional[Node], tree2: Optional[Node]) -> Node: + """ + Returns root node of the merged tree. + + >>> tree1 = Node(5) + >>> tree1.left = Node(6) + >>> tree1.right = Node(7) + >>> tree1.left.left = Node(2) + >>> tree2 = Node(4) + >>> tree2.left = Node(5) + >>> tree2.right = Node(8) + >>> tree2.left.right = Node(1) + >>> tree2.right.right = Node(4) + >>> merged_tree = merge_two_binary_trees(tree1, tree2) + >>> print_preorder(merged_tree) + 9 + 11 + 2 + 1 + 15 + 4 + """ + if tree1 is None: + return tree2 + if tree2 is None: + return tree1 + + tree1.value = tree1.value + tree2.value + tree1.left = merge_two_binary_trees(tree1.left, tree2.left) + tree1.right = merge_two_binary_trees(tree1.right, tree2.right) + return tree1 + + +def print_preorder(root: Optional[Node]) -> None: + """ + Print pre-order traversal of the tree. + + >>> root = Node(1) + >>> root.left = Node(2) + >>> root.right = Node(3) + >>> print_preorder(root) + 1 + 2 + 3 + >>> print_preorder(root.right) + 3 + """ + if root: + print(root.value) + print_preorder(root.left) + print_preorder(root.right) + + +if __name__ == "__main__": + tree1 = Node(1) + tree1.left = Node(2) + tree1.right = Node(3) + tree1.left.left = Node(4) + + tree2 = Node(2) + tree2.left = Node(4) + tree2.right = Node(6) + tree2.left.right = Node(9) + tree2.right.right = Node(5) + + print("Tree1 is: ") + print_preorder(tree1) + print("Tree2 is: ") + print_preorder(tree2) + merged_tree = merge_two_binary_trees(tree1, tree2) + print("Merged Tree is: ") + print_preorder(merged_tree) diff --git a/python-mega-algo/data_structures/binary_tree/non_recursive_segment_tree.py b/python-mega-algo/data_structures/binary_tree/non_recursive_segment_tree.py new file mode 100644 index 00000000..c914079e --- /dev/null +++ b/python-mega-algo/data_structures/binary_tree/non_recursive_segment_tree.py @@ -0,0 +1,158 @@ +""" +A non-recursive Segment Tree implementation with range query and single element update, +works virtually with any list of the same type of elements with a "commutative" +combiner. + +Explanation: +https://www.geeksforgeeks.org/iterative-segment-tree-range-minimum-query/ +https://www.geeksforgeeks.org/segment-tree-efficient-implementation/ + +>>> SegmentTree([1, 2, 3], lambda a, b: a + b).query(0, 2) +6 +>>> SegmentTree([3, 1, 2], min).query(0, 2) +1 +>>> SegmentTree([2, 3, 1], max).query(0, 2) +3 +>>> st = SegmentTree([1, 5, 7, -1, 6], lambda a, b: a + b) +>>> st.update(1, -1) +>>> st.update(2, 3) +>>> st.query(1, 2) +2 +>>> st.query(1, 1) +-1 +>>> st.update(4, 1) +>>> st.query(3, 4) +0 +>>> st = SegmentTree([[1, 2, 3], [3, 2, 1], [1, 1, 1]], lambda a, b: [a[i] + b[i] for i +... in range(len(a))]) +>>> st.query(0, 1) +[4, 4, 4] +>>> st.query(1, 2) +[4, 3, 2] +>>> st.update(1, [-1, -1, -1]) +>>> st.query(1, 2) +[0, 0, 0] +>>> st.query(0, 2) +[1, 2, 3] +""" +from __future__ import annotations + +from typing import Callable, TypeVar + +T = TypeVar("T") + + +class SegmentTree: + def __init__(self, arr: list[T], fnc: Callable[[T, T], T]) -> None: + """ + Segment Tree constructor, it works just with commutative combiner. + :param arr: list of elements for the segment tree + :param fnc: commutative function for combine two elements + + >>> SegmentTree(['a', 'b', 'c'], lambda a, b: f'{a}{b}').query(0, 2) + 'abc' + >>> SegmentTree([(1, 2), (2, 3), (3, 4)], + ... lambda a, b: (a[0] + b[0], a[1] + b[1])).query(0, 2) + (6, 9) + """ + self.N = len(arr) + self.st = [None for _ in range(len(arr))] + arr + self.fn = fnc + self.build() + + def build(self) -> None: + for p in range(self.N - 1, 0, -1): + self.st[p] = self.fn(self.st[p * 2], self.st[p * 2 + 1]) + + def update(self, p: int, v: T) -> None: + """ + Update an element in log(N) time + :param p: position to be update + :param v: new value + + >>> st = SegmentTree([3, 1, 2, 4], min) + >>> st.query(0, 3) + 1 + >>> st.update(2, -1) + >>> st.query(0, 3) + -1 + """ + p += self.N + self.st[p] = v + while p > 1: + p = p // 2 + self.st[p] = self.fn(self.st[p * 2], self.st[p * 2 + 1]) + + def query(self, l: int, r: int) -> T: # noqa: E741 + """ + Get range query value in log(N) time + :param l: left element index + :param r: right element index + :return: element combined in the range [l, r] + + >>> st = SegmentTree([1, 2, 3, 4], lambda a, b: a + b) + >>> st.query(0, 2) + 6 + >>> st.query(1, 2) + 5 + >>> st.query(0, 3) + 10 + >>> st.query(2, 3) + 7 + """ + l, r = l + self.N, r + self.N # noqa: E741 + res = None + while l <= r: # noqa: E741 + if l % 2 == 1: + res = self.st[l] if res is None else self.fn(res, self.st[l]) + if r % 2 == 0: + res = self.st[r] if res is None else self.fn(res, self.st[r]) + l, r = (l + 1) // 2, (r - 1) // 2 + return res + + +if __name__ == "__main__": + from functools import reduce + + test_array = [1, 10, -2, 9, -3, 8, 4, -7, 5, 6, 11, -12] + + test_updates = { + 0: 7, + 1: 2, + 2: 6, + 3: -14, + 4: 5, + 5: 4, + 6: 7, + 7: -10, + 8: 9, + 9: 10, + 10: 12, + 11: 1, + } + + min_segment_tree = SegmentTree(test_array, min) + max_segment_tree = SegmentTree(test_array, max) + sum_segment_tree = SegmentTree(test_array, lambda a, b: a + b) + + def test_all_segments(): + """ + Test all possible segments + """ + for i in range(len(test_array)): + for j in range(i, len(test_array)): + min_range = reduce(min, test_array[i : j + 1]) + max_range = reduce(max, test_array[i : j + 1]) + sum_range = reduce(lambda a, b: a + b, test_array[i : j + 1]) + assert min_range == min_segment_tree.query(i, j) + assert max_range == max_segment_tree.query(i, j) + assert sum_range == sum_segment_tree.query(i, j) + + test_all_segments() + + for index, value in test_updates.items(): + test_array[index] = value + min_segment_tree.update(index, value) + max_segment_tree.update(index, value) + sum_segment_tree.update(index, value) + test_all_segments() diff --git a/python-mega-algo/data_structures/binary_tree/number_of_possible_binary_trees.py b/python-mega-algo/data_structures/binary_tree/number_of_possible_binary_trees.py new file mode 100644 index 00000000..1ad8f2ed --- /dev/null +++ b/python-mega-algo/data_structures/binary_tree/number_of_possible_binary_trees.py @@ -0,0 +1,102 @@ +""" +Hey, we are going to find an exciting number called Catalan number which is use to find +the number of possible binary search trees from tree of a given number of nodes. + +We will use the formula: t(n) = SUMMATION(i = 1 to n)t(i-1)t(n-i) + +Further details at Wikipedia: https://en.wikipedia.org/wiki/Catalan_number +""" +""" +Our Contribution: +Basically we Create the 2 function: + 1. catalan_number(node_count: int) -> int + Returns the number of possible binary search trees for n nodes. + 2. binary_tree_count(node_count: int) -> int + Returns the number of possible binary trees for n nodes. +""" + + +def binomial_coefficient(n: int, k: int) -> int: + """ + Since Here we Find the Binomial Coefficient: + https://en.wikipedia.org/wiki/Binomial_coefficient + C(n,k) = n! / k!(n-k)! + :param n: 2 times of Number of nodes + :param k: Number of nodes + :return: Integer Value + + >>> binomial_coefficient(4, 2) + 6 + """ + result = 1 # To kept the Calculated Value + # Since C(n, k) = C(n, n-k) + if k > (n - k): + k = n - k + # Calculate C(n,k) + for i in range(k): + result *= n - i + result //= i + 1 + return result + + +def catalan_number(node_count: int) -> int: + """ + We can find Catalan number many ways but here we use Binomial Coefficient because it + does the job in O(n) + + return the Catalan number of n using 2nCn/(n+1). + :param n: number of nodes + :return: Catalan number of n nodes + + >>> catalan_number(5) + 42 + >>> catalan_number(6) + 132 + """ + return binomial_coefficient(2 * node_count, node_count) // (node_count + 1) + + +def factorial(n: int) -> int: + """ + Return the factorial of a number. + :param n: Number to find the Factorial of. + :return: Factorial of n. + + >>> import math + >>> all(factorial(i) == math.factorial(i) for i in range(10)) + True + >>> factorial(-5) # doctest: +ELLIPSIS + Traceback (most recent call last): + ... + ValueError: factorial() not defined for negative values + """ + if n < 0: + raise ValueError("factorial() not defined for negative values") + result = 1 + for i in range(1, n + 1): + result *= i + return result + + +def binary_tree_count(node_count: int) -> int: + """ + Return the number of possible of binary trees. + :param n: number of nodes + :return: Number of possible binary trees + + >>> binary_tree_count(5) + 5040 + >>> binary_tree_count(6) + 95040 + """ + return catalan_number(node_count) * factorial(node_count) + + +if __name__ == "__main__": + node_count = int(input("Enter the number of nodes: ").strip() or 0) + if node_count <= 0: + raise ValueError("We need some nodes to work with.") + print( + f"Given {node_count} nodes, there are {binary_tree_count(node_count)} " + f"binary trees and {catalan_number(node_count)} binary search trees." + ) diff --git a/python-mega-algo/data_structures/binary_tree/red_black_tree.py b/python-mega-algo/data_structures/binary_tree/red_black_tree.py new file mode 100644 index 00000000..8be39431 --- /dev/null +++ b/python-mega-algo/data_structures/binary_tree/red_black_tree.py @@ -0,0 +1,720 @@ +""" +python/black : true +flake8 : passed +""" +from typing import Iterator, Optional + + +class RedBlackTree: + """ + A Red-Black tree, which is a self-balancing BST (binary search + tree). + This tree has similar performance to AVL trees, but the balancing is + less strict, so it will perform faster for writing/deleting nodes + and slower for reading in the average case, though, because they're + both balanced binary search trees, both will get the same asymptotic + performance. + To read more about them, https://en.wikipedia.org/wiki/Red–black_tree + Unless otherwise specified, all asymptotic runtimes are specified in + terms of the size of the tree. + """ + + def __init__( + self, + label: Optional[int] = None, + color: int = 0, + parent: Optional["RedBlackTree"] = None, + left: Optional["RedBlackTree"] = None, + right: Optional["RedBlackTree"] = None, + ) -> None: + """Initialize a new Red-Black Tree node with the given values: + label: The value associated with this node + color: 0 if black, 1 if red + parent: The parent to this node + left: This node's left child + right: This node's right child + """ + self.label = label + self.parent = parent + self.left = left + self.right = right + self.color = color + + # Here are functions which are specific to red-black trees + + def rotate_left(self) -> "RedBlackTree": + """Rotate the subtree rooted at this node to the left and + returns the new root to this subtree. + Performing one rotation can be done in O(1). + """ + parent = self.parent + right = self.right + self.right = right.left + if self.right: + self.right.parent = self + self.parent = right + right.left = self + if parent is not None: + if parent.left == self: + parent.left = right + else: + parent.right = right + right.parent = parent + return right + + def rotate_right(self) -> "RedBlackTree": + """Rotate the subtree rooted at this node to the right and + returns the new root to this subtree. + Performing one rotation can be done in O(1). + """ + parent = self.parent + left = self.left + self.left = left.right + if self.left: + self.left.parent = self + self.parent = left + left.right = self + if parent is not None: + if parent.right is self: + parent.right = left + else: + parent.left = left + left.parent = parent + return left + + def insert(self, label: int) -> "RedBlackTree": + """Inserts label into the subtree rooted at self, performs any + rotations necessary to maintain balance, and then returns the + new root to this subtree (likely self). + This is guaranteed to run in O(log(n)) time. + """ + if self.label is None: + # Only possible with an empty tree + self.label = label + return self + if self.label == label: + return self + elif self.label > label: + if self.left: + self.left.insert(label) + else: + self.left = RedBlackTree(label, 1, self) + self.left._insert_repair() + else: + if self.right: + self.right.insert(label) + else: + self.right = RedBlackTree(label, 1, self) + self.right._insert_repair() + return self.parent or self + + def _insert_repair(self) -> None: + """Repair the coloring from inserting into a tree.""" + if self.parent is None: + # This node is the root, so it just needs to be black + self.color = 0 + elif color(self.parent) == 0: + # If the parent is black, then it just needs to be red + self.color = 1 + else: + uncle = self.parent.sibling + if color(uncle) == 0: + if self.is_left() and self.parent.is_right(): + self.parent.rotate_right() + self.right._insert_repair() + elif self.is_right() and self.parent.is_left(): + self.parent.rotate_left() + self.left._insert_repair() + elif self.is_left(): + self.grandparent.rotate_right() + self.parent.color = 0 + self.parent.right.color = 1 + else: + self.grandparent.rotate_left() + self.parent.color = 0 + self.parent.left.color = 1 + else: + self.parent.color = 0 + uncle.color = 0 + self.grandparent.color = 1 + self.grandparent._insert_repair() + + def remove(self, label: int) -> "RedBlackTree": + """Remove label from this tree.""" + if self.label == label: + if self.left and self.right: + # It's easier to balance a node with at most one child, + # so we replace this node with the greatest one less than + # it and remove that. + value = self.left.get_max() + self.label = value + self.left.remove(value) + else: + # This node has at most one non-None child, so we don't + # need to replace + child = self.left or self.right + if self.color == 1: + # This node is red, and its child is black + # The only way this happens to a node with one child + # is if both children are None leaves. + # We can just remove this node and call it a day. + if self.is_left(): + self.parent.left = None + else: + self.parent.right = None + else: + # The node is black + if child is None: + # This node and its child are black + if self.parent is None: + # The tree is now empty + return RedBlackTree(None) + else: + self._remove_repair() + if self.is_left(): + self.parent.left = None + else: + self.parent.right = None + self.parent = None + else: + # This node is black and its child is red + # Move the child node here and make it black + self.label = child.label + self.left = child.left + self.right = child.right + if self.left: + self.left.parent = self + if self.right: + self.right.parent = self + elif self.label > label: + if self.left: + self.left.remove(label) + else: + if self.right: + self.right.remove(label) + return self.parent or self + + def _remove_repair(self) -> None: + """Repair the coloring of the tree that may have been messed up.""" + if color(self.sibling) == 1: + self.sibling.color = 0 + self.parent.color = 1 + if self.is_left(): + self.parent.rotate_left() + else: + self.parent.rotate_right() + if ( + color(self.parent) == 0 + and color(self.sibling) == 0 + and color(self.sibling.left) == 0 + and color(self.sibling.right) == 0 + ): + self.sibling.color = 1 + self.parent._remove_repair() + return + if ( + color(self.parent) == 1 + and color(self.sibling) == 0 + and color(self.sibling.left) == 0 + and color(self.sibling.right) == 0 + ): + self.sibling.color = 1 + self.parent.color = 0 + return + if ( + self.is_left() + and color(self.sibling) == 0 + and color(self.sibling.right) == 0 + and color(self.sibling.left) == 1 + ): + self.sibling.rotate_right() + self.sibling.color = 0 + self.sibling.right.color = 1 + if ( + self.is_right() + and color(self.sibling) == 0 + and color(self.sibling.right) == 1 + and color(self.sibling.left) == 0 + ): + self.sibling.rotate_left() + self.sibling.color = 0 + self.sibling.left.color = 1 + if ( + self.is_left() + and color(self.sibling) == 0 + and color(self.sibling.right) == 1 + ): + self.parent.rotate_left() + self.grandparent.color = self.parent.color + self.parent.color = 0 + self.parent.sibling.color = 0 + if ( + self.is_right() + and color(self.sibling) == 0 + and color(self.sibling.left) == 1 + ): + self.parent.rotate_right() + self.grandparent.color = self.parent.color + self.parent.color = 0 + self.parent.sibling.color = 0 + + def check_color_properties(self) -> bool: + """Check the coloring of the tree, and return True iff the tree + is colored in a way which matches these five properties: + (wording stolen from wikipedia article) + 1. Each node is either red or black. + 2. The root node is black. + 3. All leaves are black. + 4. If a node is red, then both its children are black. + 5. Every path from any node to all of its descendent NIL nodes + has the same number of black nodes. + This function runs in O(n) time, because properties 4 and 5 take + that long to check. + """ + # I assume property 1 to hold because there is nothing that can + # make the color be anything other than 0 or 1. + + # Property 2 + if self.color: + # The root was red + print("Property 2") + return False + + # Property 3 does not need to be checked, because None is assumed + # to be black and is all the leaves. + + # Property 4 + if not self.check_coloring(): + print("Property 4") + return False + + # Property 5 + if self.black_height() is None: + print("Property 5") + return False + # All properties were met + return True + + def check_coloring(self) -> None: + """A helper function to recursively check Property 4 of a + Red-Black Tree. See check_color_properties for more info. + """ + if self.color == 1: + if color(self.left) == 1 or color(self.right) == 1: + return False + if self.left and not self.left.check_coloring(): + return False + if self.right and not self.right.check_coloring(): + return False + return True + + def black_height(self) -> int: + """Returns the number of black nodes from this node to the + leaves of the tree, or None if there isn't one such value (the + tree is color incorrectly). + """ + if self is None: + # If we're already at a leaf, there is no path + return 1 + left = RedBlackTree.black_height(self.left) + right = RedBlackTree.black_height(self.right) + if left is None or right is None: + # There are issues with coloring below children nodes + return None + if left != right: + # The two children have unequal depths + return None + # Return the black depth of children, plus one if this node is + # black + return left + (1 - self.color) + + # Here are functions which are general to all binary search trees + + def __contains__(self, label) -> bool: + """Search through the tree for label, returning True iff it is + found somewhere in the tree. + Guaranteed to run in O(log(n)) time. + """ + return self.search(label) is not None + + def search(self, label: int) -> "RedBlackTree": + """Search through the tree for label, returning its node if + it's found, and None otherwise. + This method is guaranteed to run in O(log(n)) time. + """ + if self.label == label: + return self + elif label > self.label: + if self.right is None: + return None + else: + return self.right.search(label) + else: + if self.left is None: + return None + else: + return self.left.search(label) + + def floor(self, label: int) -> int: + """Returns the largest element in this tree which is at most label. + This method is guaranteed to run in O(log(n)) time.""" + if self.label == label: + return self.label + elif self.label > label: + if self.left: + return self.left.floor(label) + else: + return None + else: + if self.right: + attempt = self.right.floor(label) + if attempt is not None: + return attempt + return self.label + + def ceil(self, label: int) -> int: + """Returns the smallest element in this tree which is at least label. + This method is guaranteed to run in O(log(n)) time. + """ + if self.label == label: + return self.label + elif self.label < label: + if self.right: + return self.right.ceil(label) + else: + return None + else: + if self.left: + attempt = self.left.ceil(label) + if attempt is not None: + return attempt + return self.label + + def get_max(self) -> int: + """Returns the largest element in this tree. + This method is guaranteed to run in O(log(n)) time. + """ + if self.right: + # Go as far right as possible + return self.right.get_max() + else: + return self.label + + def get_min(self) -> int: + """Returns the smallest element in this tree. + This method is guaranteed to run in O(log(n)) time. + """ + if self.left: + # Go as far left as possible + return self.left.get_min() + else: + return self.label + + @property + def grandparent(self) -> "RedBlackTree": + """Get the current node's grandparent, or None if it doesn't exist.""" + if self.parent is None: + return None + else: + return self.parent.parent + + @property + def sibling(self) -> "RedBlackTree": + """Get the current node's sibling, or None if it doesn't exist.""" + if self.parent is None: + return None + elif self.parent.left is self: + return self.parent.right + else: + return self.parent.left + + def is_left(self) -> bool: + """Returns true iff this node is the left child of its parent.""" + return self.parent and self.parent.left is self + + def is_right(self) -> bool: + """Returns true iff this node is the right child of its parent.""" + return self.parent and self.parent.right is self + + def __bool__(self) -> bool: + return True + + def __len__(self) -> int: + """ + Return the number of nodes in this tree. + """ + ln = 1 + if self.left: + ln += len(self.left) + if self.right: + ln += len(self.right) + return ln + + def preorder_traverse(self) -> Iterator[int]: + yield self.label + if self.left: + yield from self.left.preorder_traverse() + if self.right: + yield from self.right.preorder_traverse() + + def inorder_traverse(self) -> Iterator[int]: + if self.left: + yield from self.left.inorder_traverse() + yield self.label + if self.right: + yield from self.right.inorder_traverse() + + def postorder_traverse(self) -> Iterator[int]: + if self.left: + yield from self.left.postorder_traverse() + if self.right: + yield from self.right.postorder_traverse() + yield self.label + + def __repr__(self) -> str: + from pprint import pformat + + if self.left is None and self.right is None: + return f"'{self.label} {(self.color and 'red') or 'blk'}'" + return pformat( + { + f"{self.label} {(self.color and 'red') or 'blk'}": ( + self.left, + self.right, + ) + }, + indent=1, + ) + + def __eq__(self, other) -> bool: + """Test if two trees are equal.""" + if self.label == other.label: + return self.left == other.left and self.right == other.right + else: + return False + + +def color(node) -> int: + """Returns the color of a node, allowing for None leaves.""" + if node is None: + return 0 + else: + return node.color + + +""" +Code for testing the various +functions of the red-black tree. +""" + + +def test_rotations() -> bool: + """Test that the rotate_left and rotate_right functions work.""" + # Make a tree to test on + tree = RedBlackTree(0) + tree.left = RedBlackTree(-10, parent=tree) + tree.right = RedBlackTree(10, parent=tree) + tree.left.left = RedBlackTree(-20, parent=tree.left) + tree.left.right = RedBlackTree(-5, parent=tree.left) + tree.right.left = RedBlackTree(5, parent=tree.right) + tree.right.right = RedBlackTree(20, parent=tree.right) + # Make the right rotation + left_rot = RedBlackTree(10) + left_rot.left = RedBlackTree(0, parent=left_rot) + left_rot.left.left = RedBlackTree(-10, parent=left_rot.left) + left_rot.left.right = RedBlackTree(5, parent=left_rot.left) + left_rot.left.left.left = RedBlackTree(-20, parent=left_rot.left.left) + left_rot.left.left.right = RedBlackTree(-5, parent=left_rot.left.left) + left_rot.right = RedBlackTree(20, parent=left_rot) + tree = tree.rotate_left() + if tree != left_rot: + return False + tree = tree.rotate_right() + tree = tree.rotate_right() + # Make the left rotation + right_rot = RedBlackTree(-10) + right_rot.left = RedBlackTree(-20, parent=right_rot) + right_rot.right = RedBlackTree(0, parent=right_rot) + right_rot.right.left = RedBlackTree(-5, parent=right_rot.right) + right_rot.right.right = RedBlackTree(10, parent=right_rot.right) + right_rot.right.right.left = RedBlackTree(5, parent=right_rot.right.right) + right_rot.right.right.right = RedBlackTree(20, parent=right_rot.right.right) + if tree != right_rot: + return False + return True + + +def test_insertion_speed() -> bool: + """Test that the tree balances inserts to O(log(n)) by doing a lot + of them. + """ + tree = RedBlackTree(-1) + for i in range(300000): + tree = tree.insert(i) + return True + + +def test_insert() -> bool: + """Test the insert() method of the tree correctly balances, colors, + and inserts. + """ + tree = RedBlackTree(0) + tree.insert(8) + tree.insert(-8) + tree.insert(4) + tree.insert(12) + tree.insert(10) + tree.insert(11) + ans = RedBlackTree(0, 0) + ans.left = RedBlackTree(-8, 0, ans) + ans.right = RedBlackTree(8, 1, ans) + ans.right.left = RedBlackTree(4, 0, ans.right) + ans.right.right = RedBlackTree(11, 0, ans.right) + ans.right.right.left = RedBlackTree(10, 1, ans.right.right) + ans.right.right.right = RedBlackTree(12, 1, ans.right.right) + return tree == ans + + +def test_insert_and_search() -> bool: + """Tests searching through the tree for values.""" + tree = RedBlackTree(0) + tree.insert(8) + tree.insert(-8) + tree.insert(4) + tree.insert(12) + tree.insert(10) + tree.insert(11) + if 5 in tree or -6 in tree or -10 in tree or 13 in tree: + # Found something not in there + return False + if not (11 in tree and 12 in tree and -8 in tree and 0 in tree): + # Didn't find something in there + return False + return True + + +def test_insert_delete() -> bool: + """Test the insert() and delete() method of the tree, verifying the + insertion and removal of elements, and the balancing of the tree. + """ + tree = RedBlackTree(0) + tree = tree.insert(-12) + tree = tree.insert(8) + tree = tree.insert(-8) + tree = tree.insert(15) + tree = tree.insert(4) + tree = tree.insert(12) + tree = tree.insert(10) + tree = tree.insert(9) + tree = tree.insert(11) + tree = tree.remove(15) + tree = tree.remove(-12) + tree = tree.remove(9) + if not tree.check_color_properties(): + return False + if list(tree.inorder_traverse()) != [-8, 0, 4, 8, 10, 11, 12]: + return False + return True + + +def test_floor_ceil() -> bool: + """Tests the floor and ceiling functions in the tree.""" + tree = RedBlackTree(0) + tree.insert(-16) + tree.insert(16) + tree.insert(8) + tree.insert(24) + tree.insert(20) + tree.insert(22) + tuples = [(-20, None, -16), (-10, -16, 0), (8, 8, 8), (50, 24, None)] + for val, floor, ceil in tuples: + if tree.floor(val) != floor or tree.ceil(val) != ceil: + return False + return True + + +def test_min_max() -> bool: + """Tests the min and max functions in the tree.""" + tree = RedBlackTree(0) + tree.insert(-16) + tree.insert(16) + tree.insert(8) + tree.insert(24) + tree.insert(20) + tree.insert(22) + if tree.get_max() != 22 or tree.get_min() != -16: + return False + return True + + +def test_tree_traversal() -> bool: + """Tests the three different tree traversal functions.""" + tree = RedBlackTree(0) + tree = tree.insert(-16) + tree.insert(16) + tree.insert(8) + tree.insert(24) + tree.insert(20) + tree.insert(22) + if list(tree.inorder_traverse()) != [-16, 0, 8, 16, 20, 22, 24]: + return False + if list(tree.preorder_traverse()) != [0, -16, 16, 8, 22, 20, 24]: + return False + if list(tree.postorder_traverse()) != [-16, 8, 20, 24, 22, 16, 0]: + return False + return True + + +def test_tree_chaining() -> bool: + """Tests the three different tree chaining functions.""" + tree = RedBlackTree(0) + tree = tree.insert(-16).insert(16).insert(8).insert(24).insert(20).insert(22) + if list(tree.inorder_traverse()) != [-16, 0, 8, 16, 20, 22, 24]: + return False + if list(tree.preorder_traverse()) != [0, -16, 16, 8, 22, 20, 24]: + return False + if list(tree.postorder_traverse()) != [-16, 8, 20, 24, 22, 16, 0]: + return False + return True + + +def print_results(msg: str, passes: bool) -> None: + print(str(msg), "works!" if passes else "doesn't work :(") + + +def pytests() -> None: + assert test_rotations() + assert test_insert() + assert test_insert_and_search() + assert test_insert_delete() + assert test_floor_ceil() + assert test_tree_traversal() + assert test_tree_chaining() + + +def main() -> None: + """ + >>> pytests() + """ + print_results("Rotating right and left", test_rotations()) + + print_results("Inserting", test_insert()) + + print_results("Searching", test_insert_and_search()) + + print_results("Deleting", test_insert_delete()) + + print_results("Floor and ceil", test_floor_ceil()) + + print_results("Tree traversal", test_tree_traversal()) + + print_results("Tree traversal", test_tree_chaining()) + + print("Testing tree balancing...") + print("This should only be a few seconds.") + test_insertion_speed() + print("Done!") + + +if __name__ == "__main__": + main() diff --git a/python-mega-algo/data_structures/binary_tree/right.html b/python-mega-algo/data_structures/binary_tree/right.html new file mode 100644 index 00000000..332bf880 --- /dev/null +++ b/python-mega-algo/data_structures/binary_tree/right.html @@ -0,0 +1,33 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/data_structures/binary_tree + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + + + + + +
    FileFileFileFile
    avl_tree.py binary_tr...als.py merge_two...ees.py segment_tree.py 
    basic_bin...ree.py fenwick_tree.py non_recur...ree.py segment_t...her.py 
    binary_se...ree.py lazy_segm...ree.py number_of...ees.py treap.py 
    binary_se...ive.py lowest_co...tor.py red_black_tree.py __init__.py 
    binary_tr...ror.py 
    + +

    +Folders: 1
    +Files: 17
    +Size of all files: 98750 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/data_structures/binary_tree/segment_tree.py b/python-mega-algo/data_structures/binary_tree/segment_tree.py new file mode 100644 index 00000000..10451ae6 --- /dev/null +++ b/python-mega-algo/data_structures/binary_tree/segment_tree.py @@ -0,0 +1,78 @@ +import math + + +class SegmentTree: + def __init__(self, A): + self.N = len(A) + self.st = [0] * ( + 4 * self.N + ) # approximate the overall size of segment tree with array N + self.build(1, 0, self.N - 1) + + def left(self, idx): + return idx * 2 + + def right(self, idx): + return idx * 2 + 1 + + def build(self, idx, l, r): # noqa: E741 + if l == r: # noqa: E741 + self.st[idx] = A[l] + else: + mid = (l + r) // 2 + self.build(self.left(idx), l, mid) + self.build(self.right(idx), mid + 1, r) + self.st[idx] = max(self.st[self.left(idx)], self.st[self.right(idx)]) + + def update(self, a, b, val): + return self.update_recursive(1, 0, self.N - 1, a - 1, b - 1, val) + + def update_recursive(self, idx, l, r, a, b, val): # noqa: E741 + """ + update(1, 1, N, a, b, v) for update val v to [a,b] + """ + if r < a or l > b: + return True + if l == r: # noqa: E741 + self.st[idx] = val + return True + mid = (l + r) // 2 + self.update_recursive(self.left(idx), l, mid, a, b, val) + self.update_recursive(self.right(idx), mid + 1, r, a, b, val) + self.st[idx] = max(self.st[self.left(idx)], self.st[self.right(idx)]) + return True + + def query(self, a, b): + return self.query_recursive(1, 0, self.N - 1, a - 1, b - 1) + + def query_recursive(self, idx, l, r, a, b): # noqa: E741 + """ + query(1, 1, N, a, b) for query max of [a,b] + """ + if r < a or l > b: + return -math.inf + if l >= a and r <= b: # noqa: E741 + return self.st[idx] + mid = (l + r) // 2 + q1 = self.query_recursive(self.left(idx), l, mid, a, b) + q2 = self.query_recursive(self.right(idx), mid + 1, r, a, b) + return max(q1, q2) + + def showData(self): + showList = [] + for i in range(1, N + 1): + showList += [self.query(i, i)] + print(showList) + + +if __name__ == "__main__": + A = [1, 2, -4, 7, 3, -5, 6, 11, -20, 9, 14, 15, 5, 2, -8] + N = 15 + segt = SegmentTree(A) + print(segt.query(4, 6)) + print(segt.query(7, 11)) + print(segt.query(7, 12)) + segt.update(1, 3, 111) + print(segt.query(1, 15)) + segt.update(7, 8, 235) + segt.showData() diff --git a/python-mega-algo/data_structures/binary_tree/segment_tree_other.py b/python-mega-algo/data_structures/binary_tree/segment_tree_other.py new file mode 100644 index 00000000..90afd7ca --- /dev/null +++ b/python-mega-algo/data_structures/binary_tree/segment_tree_other.py @@ -0,0 +1,241 @@ +""" +Segment_tree creates a segment tree with a given array and function, +allowing queries to be done later in log(N) time +function takes 2 values and returns a same type value +""" +from collections.abc import Sequence +from queue import Queue + + +class SegmentTreeNode: + def __init__(self, start, end, val, left=None, right=None): + self.start = start + self.end = end + self.val = val + self.mid = (start + end) // 2 + self.left = left + self.right = right + + def __str__(self): + return f"val: {self.val}, start: {self.start}, end: {self.end}" + + +class SegmentTree: + """ + >>> import operator + >>> num_arr = SegmentTree([2, 1, 5, 3, 4], operator.add) + >>> for node in num_arr.traverse(): + ... print(node) + ... + val: 15, start: 0, end: 4 + val: 8, start: 0, end: 2 + val: 7, start: 3, end: 4 + val: 3, start: 0, end: 1 + val: 5, start: 2, end: 2 + val: 3, start: 3, end: 3 + val: 4, start: 4, end: 4 + val: 2, start: 0, end: 0 + val: 1, start: 1, end: 1 + >>> + >>> num_arr.update(1, 5) + >>> for node in num_arr.traverse(): + ... print(node) + ... + val: 19, start: 0, end: 4 + val: 12, start: 0, end: 2 + val: 7, start: 3, end: 4 + val: 7, start: 0, end: 1 + val: 5, start: 2, end: 2 + val: 3, start: 3, end: 3 + val: 4, start: 4, end: 4 + val: 2, start: 0, end: 0 + val: 5, start: 1, end: 1 + >>> + >>> num_arr.query_range(3, 4) + 7 + >>> num_arr.query_range(2, 2) + 5 + >>> num_arr.query_range(1, 3) + 13 + >>> + >>> max_arr = SegmentTree([2, 1, 5, 3, 4], max) + >>> for node in max_arr.traverse(): + ... print(node) + ... + val: 5, start: 0, end: 4 + val: 5, start: 0, end: 2 + val: 4, start: 3, end: 4 + val: 2, start: 0, end: 1 + val: 5, start: 2, end: 2 + val: 3, start: 3, end: 3 + val: 4, start: 4, end: 4 + val: 2, start: 0, end: 0 + val: 1, start: 1, end: 1 + >>> + >>> max_arr.update(1, 5) + >>> for node in max_arr.traverse(): + ... print(node) + ... + val: 5, start: 0, end: 4 + val: 5, start: 0, end: 2 + val: 4, start: 3, end: 4 + val: 5, start: 0, end: 1 + val: 5, start: 2, end: 2 + val: 3, start: 3, end: 3 + val: 4, start: 4, end: 4 + val: 2, start: 0, end: 0 + val: 5, start: 1, end: 1 + >>> + >>> max_arr.query_range(3, 4) + 4 + >>> max_arr.query_range(2, 2) + 5 + >>> max_arr.query_range(1, 3) + 5 + >>> + >>> min_arr = SegmentTree([2, 1, 5, 3, 4], min) + >>> for node in min_arr.traverse(): + ... print(node) + ... + val: 1, start: 0, end: 4 + val: 1, start: 0, end: 2 + val: 3, start: 3, end: 4 + val: 1, start: 0, end: 1 + val: 5, start: 2, end: 2 + val: 3, start: 3, end: 3 + val: 4, start: 4, end: 4 + val: 2, start: 0, end: 0 + val: 1, start: 1, end: 1 + >>> + >>> min_arr.update(1, 5) + >>> for node in min_arr.traverse(): + ... print(node) + ... + val: 2, start: 0, end: 4 + val: 2, start: 0, end: 2 + val: 3, start: 3, end: 4 + val: 2, start: 0, end: 1 + val: 5, start: 2, end: 2 + val: 3, start: 3, end: 3 + val: 4, start: 4, end: 4 + val: 2, start: 0, end: 0 + val: 5, start: 1, end: 1 + >>> + >>> min_arr.query_range(3, 4) + 3 + >>> min_arr.query_range(2, 2) + 5 + >>> min_arr.query_range(1, 3) + 3 + >>> + + """ + + def __init__(self, collection: Sequence, function): + self.collection = collection + self.fn = function + if self.collection: + self.root = self._build_tree(0, len(collection) - 1) + + def update(self, i, val): + """ + Update an element in log(N) time + :param i: position to be update + :param val: new value + >>> import operator + >>> num_arr = SegmentTree([2, 1, 5, 3, 4], operator.add) + >>> num_arr.update(1, 5) + >>> num_arr.query_range(1, 3) + 13 + """ + self._update_tree(self.root, i, val) + + def query_range(self, i, j): + """ + Get range query value in log(N) time + :param i: left element index + :param j: right element index + :return: element combined in the range [i, j] + >>> import operator + >>> num_arr = SegmentTree([2, 1, 5, 3, 4], operator.add) + >>> num_arr.update(1, 5) + >>> num_arr.query_range(3, 4) + 7 + >>> num_arr.query_range(2, 2) + 5 + >>> num_arr.query_range(1, 3) + 13 + >>> + """ + return self._query_range(self.root, i, j) + + def _build_tree(self, start, end): + if start == end: + return SegmentTreeNode(start, end, self.collection[start]) + mid = (start + end) // 2 + left = self._build_tree(start, mid) + right = self._build_tree(mid + 1, end) + return SegmentTreeNode(start, end, self.fn(left.val, right.val), left, right) + + def _update_tree(self, node, i, val): + if node.start == i and node.end == i: + node.val = val + return + if i <= node.mid: + self._update_tree(node.left, i, val) + else: + self._update_tree(node.right, i, val) + node.val = self.fn(node.left.val, node.right.val) + + def _query_range(self, node, i, j): + if node.start == i and node.end == j: + return node.val + + if i <= node.mid: + if j <= node.mid: + # range in left child tree + return self._query_range(node.left, i, j) + else: + # range in left child tree and right child tree + return self.fn( + self._query_range(node.left, i, node.mid), + self._query_range(node.right, node.mid + 1, j), + ) + else: + # range in right child tree + return self._query_range(node.right, i, j) + + def traverse(self): + if self.root is not None: + queue = Queue() + queue.put(self.root) + while not queue.empty(): + node = queue.get() + yield node + + if node.left is not None: + queue.put(node.left) + + if node.right is not None: + queue.put(node.right) + + +if __name__ == "__main__": + import operator + + for fn in [operator.add, max, min]: + print("*" * 50) + arr = SegmentTree([2, 1, 5, 3, 4], fn) + for node in arr.traverse(): + print(node) + print() + + arr.update(1, 5) + for node in arr.traverse(): + print(node) + print() + + print(arr.query_range(3, 4)) # 7 + print(arr.query_range(2, 2)) # 5 + print(arr.query_range(1, 3)) # 13 + print() diff --git a/python-mega-algo/data_structures/binary_tree/treap.py b/python-mega-algo/data_structures/binary_tree/treap.py new file mode 100644 index 00000000..a09dcc92 --- /dev/null +++ b/python-mega-algo/data_structures/binary_tree/treap.py @@ -0,0 +1,185 @@ +# flake8: noqa + +from __future__ import annotations + +from random import random +from typing import Optional, Tuple + + +class Node: + """ + Treap's node + Treap is a binary tree by value and heap by priority + """ + + def __init__(self, value: Optional[int] = None): + self.value = value + self.prior = random() + self.left: Optional[Node] = None + self.right: Optional[Node] = None + + def __repr__(self) -> str: + from pprint import pformat + + if self.left is None and self.right is None: + return f"'{self.value}: {self.prior:.5}'" + else: + return pformat( + {f"{self.value}: {self.prior:.5}": (self.left, self.right)}, indent=1 + ) + + def __str__(self) -> str: + value = str(self.value) + " " + left = str(self.left or "") + right = str(self.right or "") + return value + left + right + + +def split(root: Optional[Node], value: int) -> Tuple[Optional[Node], Optional[Node]]: + """ + We split current tree into 2 trees with value: + + Left tree contains all values less than split value. + Right tree contains all values greater or equal, than split value + """ + if root is None: # None tree is split into 2 Nones + return None, None + elif root.value is None: + return None, None + else: + if value < root.value: + """ + Right tree's root will be current node. + Now we split(with the same value) current node's left son + Left tree: left part of that split + Right tree's left son: right part of that split + """ + left, root.left = split(root.left, value) + return left, root + else: + """ + Just symmetric to previous case + """ + root.right, right = split(root.right, value) + return root, right + + +def merge(left: Optional[Node], right: Optional[Node]) -> Optional[Node]: + """ + We merge 2 trees into one. + Note: all left tree's values must be less than all right tree's + """ + if (not left) or (not right): # If one node is None, return the other + return left or right + elif left.prior < right.prior: + """ + Left will be root because it has more priority + Now we need to merge left's right son and right tree + """ + left.right = merge(left.right, right) + return left + else: + """ + Symmetric as well + """ + right.left = merge(left, right.left) + return right + + +def insert(root: Optional[Node], value: int) -> Optional[Node]: + """ + Insert element + + Split current tree with a value into left, right, + Insert new node into the middle + Merge left, node, right into root + """ + node = Node(value) + left, right = split(root, value) + return merge(merge(left, node), right) + + +def erase(root: Optional[Node], value: int) -> Optional[Node]: + """ + Erase element + + Split all nodes with values less into left, + Split all nodes with values greater into right. + Merge left, right + """ + left, right = split(root, value - 1) + _, right = split(right, value) + return merge(left, right) + + +def inorder(root: Optional[Node]) -> None: + """ + Just recursive print of a tree + """ + if not root: # None + return + else: + inorder(root.left) + print(root.value, end=",") + inorder(root.right) + + +def interactTreap(root: Optional[Node], args: str) -> Optional[Node]: + """ + Commands: + + value to add value into treap + - value to erase all nodes with value + + >>> root = interactTreap(None, "+1") + >>> inorder(root) + 1, + >>> root = interactTreap(root, "+3 +5 +17 +19 +2 +16 +4 +0") + >>> inorder(root) + 0,1,2,3,4,5,16,17,19, + >>> root = interactTreap(root, "+4 +4 +4") + >>> inorder(root) + 0,1,2,3,4,4,4,4,5,16,17,19, + >>> root = interactTreap(root, "-0") + >>> inorder(root) + 1,2,3,4,4,4,4,5,16,17,19, + >>> root = interactTreap(root, "-4") + >>> inorder(root) + 1,2,3,5,16,17,19, + >>> root = interactTreap(root, "=0") + Unknown command + """ + for arg in args.split(): + if arg[0] == "+": + root = insert(root, int(arg[1:])) + + elif arg[0] == "-": + root = erase(root, int(arg[1:])) + + else: + print("Unknown command") + + return root + + +def main() -> None: + """After each command, program prints treap""" + root = None + print( + "enter numbers to create a tree, + value to add value into treap, " + "- value to erase all nodes with value. 'q' to quit. " + ) + + args = input() + while args != "q": + root = interactTreap(root, args) + print(root) + args = input() + + print("good by!") + + +if __name__ == "__main__": + import doctest + + doctest.testmod() + main() diff --git a/python-mega-algo/data_structures/disjoint_set/__init__.py b/python-mega-algo/data_structures/disjoint_set/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/data_structures/disjoint_set/alternate_disjoint_set.py b/python-mega-algo/data_structures/disjoint_set/alternate_disjoint_set.py new file mode 100644 index 00000000..5103335b --- /dev/null +++ b/python-mega-algo/data_structures/disjoint_set/alternate_disjoint_set.py @@ -0,0 +1,68 @@ +""" +Implements a disjoint set using Lists and some added heuristics for efficiency +Union by Rank Heuristic and Path Compression +""" + + +class DisjointSet: + def __init__(self, set_counts: list) -> None: + """ + Initialize with a list of the number of items in each set + and with rank = 1 for each set + """ + self.set_counts = set_counts + self.max_set = max(set_counts) + num_sets = len(set_counts) + self.ranks = [1] * num_sets + self.parents = list(range(num_sets)) + + def merge(self, src: int, dst: int) -> bool: + """ + Merge two sets together using Union by rank heuristic + Return True if successful + Merge two disjoint sets + >>> A = DisjointSet([1, 1, 1]) + >>> A.merge(1, 2) + True + >>> A.merge(0, 2) + True + >>> A.merge(0, 1) + False + """ + src_parent = self.get_parent(src) + dst_parent = self.get_parent(dst) + + if src_parent == dst_parent: + return False + + if self.ranks[dst_parent] >= self.ranks[src_parent]: + self.set_counts[dst_parent] += self.set_counts[src_parent] + self.set_counts[src_parent] = 0 + self.parents[src_parent] = dst_parent + if self.ranks[dst_parent] == self.ranks[src_parent]: + self.ranks[dst_parent] += 1 + joined_set_size = self.set_counts[dst_parent] + else: + self.set_counts[src_parent] += self.set_counts[dst_parent] + self.set_counts[dst_parent] = 0 + self.parents[dst_parent] = src_parent + joined_set_size = self.set_counts[src_parent] + + self.max_set = max(self.max_set, joined_set_size) + return True + + def get_parent(self, disj_set: int) -> int: + """ + Find the Parent of a given set + >>> A = DisjointSet([1, 1, 1]) + >>> A.merge(1, 2) + True + >>> A.get_parent(0) + 0 + >>> A.get_parent(1) + 2 + """ + if self.parents[disj_set] == disj_set: + return disj_set + self.parents[disj_set] = self.get_parent(self.parents[disj_set]) + return self.parents[disj_set] diff --git a/python-mega-algo/data_structures/disjoint_set/disjoint_set.py b/python-mega-algo/data_structures/disjoint_set/disjoint_set.py new file mode 100644 index 00000000..9591cd20 --- /dev/null +++ b/python-mega-algo/data_structures/disjoint_set/disjoint_set.py @@ -0,0 +1,79 @@ +""" + disjoint set + Reference: https://en.wikipedia.org/wiki/Disjoint-set_data_structure +""" + + +class Node: + def __init__(self, data): + self.data = data + + +def make_set(x): + """ + make x as a set. + """ + # rank is the distance from x to its' parent + # root's rank is 0 + x.rank = 0 + x.parent = x + + +def union_set(x, y): + """ + union two sets. + set with bigger rank should be parent, so that the + disjoint set tree will be more flat. + """ + x, y = find_set(x), find_set(y) + if x.rank > y.rank: + y.parent = x + else: + x.parent = y + if x.rank == y.rank: + y.rank += 1 + + +def find_set(x): + """ + return the parent of x + """ + if x != x.parent: + x.parent = find_set(x.parent) + return x.parent + + +def find_python_set(node: Node) -> set: + """ + Return a Python Standard Library set that contains i. + """ + sets = ({0, 1, 2}, {3, 4, 5}) + for s in sets: + if node.data in s: + return s + raise ValueError(f"{node.data} is not in {sets}") + + +def test_disjoint_set(): + """ + >>> test_disjoint_set() + """ + vertex = [Node(i) for i in range(6)] + for v in vertex: + make_set(v) + + union_set(vertex[0], vertex[1]) + union_set(vertex[1], vertex[2]) + union_set(vertex[3], vertex[4]) + union_set(vertex[3], vertex[5]) + + for node0 in vertex: + for node1 in vertex: + if find_python_set(node0).isdisjoint(find_python_set(node1)): + assert find_set(node0) != find_set(node1) + else: + assert find_set(node0) == find_set(node1) + + +if __name__ == "__main__": + test_disjoint_set() diff --git a/python-mega-algo/data_structures/disjoint_set/right.html b/python-mega-algo/data_structures/disjoint_set/right.html new file mode 100644 index 00000000..70852abf --- /dev/null +++ b/python-mega-algo/data_structures/disjoint_set/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/data_structures/disjoint_set + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    alternate...set.py disjoint_set.py __init__.py 
    + +

    +Folders: 1
    +Files: 3
    +Size of all files: 3945 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/data_structures/hashing/__init__.py b/python-mega-algo/data_structures/hashing/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/data_structures/hashing/double_hash.py b/python-mega-algo/data_structures/hashing/double_hash.py new file mode 100644 index 00000000..57b1ffff --- /dev/null +++ b/python-mega-algo/data_structures/hashing/double_hash.py @@ -0,0 +1,41 @@ +#!/usr/bin/env python3 +from .hash_table import HashTable +from .number_theory.prime_numbers import check_prime, next_prime + + +class DoubleHash(HashTable): + """ + Hash Table example with open addressing and Double Hash + """ + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + def __hash_function_2(self, value, data): + + next_prime_gt = ( + next_prime(value % self.size_table) + if not check_prime(value % self.size_table) + else value % self.size_table + ) # gt = bigger than + return next_prime_gt - (data % next_prime_gt) + + def __hash_double_function(self, key, data, increment): + return (increment * self.__hash_function_2(key, data)) % self.size_table + + def _collision_resolution(self, key, data=None): + i = 1 + new_key = self.hash_function(data) + + while self.values[new_key] is not None and self.values[new_key] != key: + new_key = ( + self.__hash_double_function(key, data, i) + if self.balanced_factor() >= self.lim_charge + else None + ) + if new_key is None: + break + else: + i += 1 + + return new_key diff --git a/python-mega-algo/data_structures/hashing/hash_table.py b/python-mega-algo/data_structures/hashing/hash_table.py new file mode 100644 index 00000000..fd9e6eec --- /dev/null +++ b/python-mega-algo/data_structures/hashing/hash_table.py @@ -0,0 +1,83 @@ +#!/usr/bin/env python3 +from .number_theory.prime_numbers import next_prime + + +class HashTable: + """ + Basic Hash Table example with open addressing and linear probing + """ + + def __init__(self, size_table, charge_factor=None, lim_charge=None): + self.size_table = size_table + self.values = [None] * self.size_table + self.lim_charge = 0.75 if lim_charge is None else lim_charge + self.charge_factor = 1 if charge_factor is None else charge_factor + self.__aux_list = [] + self._keys = {} + + def keys(self): + return self._keys + + def balanced_factor(self): + return sum([1 for slot in self.values if slot is not None]) / ( + self.size_table * self.charge_factor + ) + + def hash_function(self, key): + return key % self.size_table + + def _step_by_step(self, step_ord): + + print(f"step {step_ord}") + print([i for i in range(len(self.values))]) + print(self.values) + + def bulk_insert(self, values): + i = 1 + self.__aux_list = values + for value in values: + self.insert_data(value) + self._step_by_step(i) + i += 1 + + def _set_value(self, key, data): + self.values[key] = data + self._keys[key] = data + + def _collision_resolution(self, key, data=None): + new_key = self.hash_function(key + 1) + + while self.values[new_key] is not None and self.values[new_key] != key: + + if self.values.count(None) > 0: + new_key = self.hash_function(new_key + 1) + else: + new_key = None + break + + return new_key + + def rehashing(self): + survivor_values = [value for value in self.values if value is not None] + self.size_table = next_prime(self.size_table, factor=2) + self._keys.clear() + self.values = [None] * self.size_table # hell's pointers D: don't DRY ;/ + for value in survivor_values: + self.insert_data(value) + + def insert_data(self, data): + key = self.hash_function(data) + + if self.values[key] is None: + self._set_value(key, data) + + elif self.values[key] == data: + pass + + else: + collision_resolution = self._collision_resolution(key, data) + if collision_resolution is not None: + self._set_value(collision_resolution, data) + else: + self.rehashing() + self.insert_data(data) diff --git a/python-mega-algo/data_structures/hashing/hash_table_with_linked_list.py b/python-mega-algo/data_structures/hashing/hash_table_with_linked_list.py new file mode 100644 index 00000000..fe838268 --- /dev/null +++ b/python-mega-algo/data_structures/hashing/hash_table_with_linked_list.py @@ -0,0 +1,27 @@ +from collections import deque + +from .hash_table import HashTable + + +class HashTableWithLinkedList(HashTable): + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + def _set_value(self, key, data): + self.values[key] = deque([]) if self.values[key] is None else self.values[key] + self.values[key].appendleft(data) + self._keys[key] = self.values[key] + + def balanced_factor(self): + return ( + sum([self.charge_factor - len(slot) for slot in self.values]) + / self.size_table + * self.charge_factor + ) + + def _collision_resolution(self, key, data=None): + if not ( + len(self.values[key]) == self.charge_factor and self.values.count(None) == 0 + ): + return key + return super()._collision_resolution(key, data) diff --git a/python-mega-algo/data_structures/hashing/number_theory/__init__.py b/python-mega-algo/data_structures/hashing/number_theory/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/data_structures/hashing/number_theory/prime_numbers.py b/python-mega-algo/data_structures/hashing/number_theory/prime_numbers.py new file mode 100644 index 00000000..db4d40f4 --- /dev/null +++ b/python-mega-algo/data_structures/hashing/number_theory/prime_numbers.py @@ -0,0 +1,29 @@ +#!/usr/bin/env python3 +""" + module to operations with prime numbers +""" + + +def check_prime(number): + """ + it's not the best solution + """ + special_non_primes = [0, 1, 2] + if number in special_non_primes[:2]: + return 2 + elif number == special_non_primes[-1]: + return 3 + + return all([number % i for i in range(2, number)]) + + +def next_prime(value, factor=1, **kwargs): + value = factor * value + first_value_val = value + + while not check_prime(value): + value += 1 if not ("desc" in kwargs.keys() and kwargs["desc"] is True) else -1 + + if value == first_value_val: + return next_prime(value + 1, **kwargs) + return value diff --git a/python-mega-algo/data_structures/hashing/number_theory/right.html b/python-mega-algo/data_structures/hashing/number_theory/right.html new file mode 100644 index 00000000..8e10461e --- /dev/null +++ b/python-mega-algo/data_structures/hashing/number_theory/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/data_structures/hashing/number_theory + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    prime_numbers.py __init__.py 
    + +

    +Folders: 1
    +Files: 2
    +Size of all files: 678 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/data_structures/hashing/quadratic_probing.py b/python-mega-algo/data_structures/hashing/quadratic_probing.py new file mode 100644 index 00000000..0930340a --- /dev/null +++ b/python-mega-algo/data_structures/hashing/quadratic_probing.py @@ -0,0 +1,29 @@ +#!/usr/bin/env python3 + +from .hash_table import HashTable + + +class QuadraticProbing(HashTable): + """ + Basic Hash Table example with open addressing using Quadratic Probing + """ + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + def _collision_resolution(self, key, data=None): + i = 1 + new_key = self.hash_function(key + i * i) + + while self.values[new_key] is not None and self.values[new_key] != key: + i += 1 + new_key = ( + self.hash_function(key + i * i) + if not self.balanced_factor() >= self.lim_charge + else None + ) + + if new_key is None: + break + + return new_key diff --git a/python-mega-algo/data_structures/hashing/right.html b/python-mega-algo/data_structures/hashing/right.html new file mode 100644 index 00000000..ab09ee6e --- /dev/null +++ b/python-mega-algo/data_structures/hashing/right.html @@ -0,0 +1,30 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/data_structures/hashing + + + + + + + + +
    Folders
    <Go Back> number_theory
    +
    + + + + + +
    FileFileFileFile
    double_hash.py hash_tabl...ist.py quadratic...ing.py __init__.py 
    hash_table.py 
    + +

    +Folders: 2
    +Files: 5
    +Size of all files: 5341 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/data_structures/heap/__init__.py b/python-mega-algo/data_structures/heap/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/data_structures/heap/binomial_heap.py b/python-mega-algo/data_structures/heap/binomial_heap.py new file mode 100644 index 00000000..2c9626ff --- /dev/null +++ b/python-mega-algo/data_structures/heap/binomial_heap.py @@ -0,0 +1,403 @@ +# flake8: noqa + +""" +Binomial Heap +Reference: Advanced Data Structures, Peter Brass +""" + + +class Node: + """ + Node in a doubly-linked binomial tree, containing: + - value + - size of left subtree + - link to left, right and parent nodes + """ + + def __init__(self, val): + self.val = val + # Number of nodes in left subtree + self.left_tree_size = 0 + self.left = None + self.right = None + self.parent = None + + def mergeTrees(self, other): + """ + In-place merge of two binomial trees of equal size. + Returns the root of the resulting tree + """ + assert self.left_tree_size == other.left_tree_size, "Unequal Sizes of Blocks" + + if self.val < other.val: + other.left = self.right + other.parent = None + if self.right: + self.right.parent = other + self.right = other + self.left_tree_size = self.left_tree_size * 2 + 1 + return self + else: + self.left = other.right + self.parent = None + if other.right: + other.right.parent = self + other.right = self + other.left_tree_size = other.left_tree_size * 2 + 1 + return other + + +class BinomialHeap: + r""" + Min-oriented priority queue implemented with the Binomial Heap data + structure implemented with the BinomialHeap class. It supports: + - Insert element in a heap with n elements: Guaranteed logn, amoratized 1 + - Merge (meld) heaps of size m and n: O(logn + logm) + - Delete Min: O(logn) + - Peek (return min without deleting it): O(1) + + Example: + + Create a random permutation of 30 integers to be inserted and 19 of them deleted + >>> import numpy as np + >>> permutation = np.random.permutation(list(range(30))) + + Create a Heap and insert the 30 integers + __init__() test + >>> first_heap = BinomialHeap() + + 30 inserts - insert() test + >>> for number in permutation: + ... first_heap.insert(number) + + Size test + >>> print(first_heap.size) + 30 + + Deleting - delete() test + >>> for i in range(25): + ... print(first_heap.deleteMin(), end=" ") + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 + + Create a new Heap + >>> second_heap = BinomialHeap() + >>> vals = [17, 20, 31, 34] + >>> for value in vals: + ... second_heap.insert(value) + + + The heap should have the following structure: + + 17 + / \ + # 31 + / \ + 20 34 + / \ / \ + # # # # + + preOrder() test + >>> print(second_heap.preOrder()) + [(17, 0), ('#', 1), (31, 1), (20, 2), ('#', 3), ('#', 3), (34, 2), ('#', 3), ('#', 3)] + + printing Heap - __str__() test + >>> print(second_heap) + 17 + -# + -31 + --20 + ---# + ---# + --34 + ---# + ---# + + mergeHeaps() test + >>> merged = second_heap.mergeHeaps(first_heap) + >>> merged.peek() + 17 + + values in merged heap; (merge is inplace) + >>> while not first_heap.isEmpty(): + ... print(first_heap.deleteMin(), end=" ") + 17 20 25 26 27 28 29 31 34 + """ + + def __init__(self, bottom_root=None, min_node=None, heap_size=0): + self.size = heap_size + self.bottom_root = bottom_root + self.min_node = min_node + + def mergeHeaps(self, other): + """ + In-place merge of two binomial heaps. + Both of them become the resulting merged heap + """ + + # Empty heaps corner cases + if other.size == 0: + return + if self.size == 0: + self.size = other.size + self.bottom_root = other.bottom_root + self.min_node = other.min_node + return + # Update size + self.size = self.size + other.size + + # Update min.node + if self.min_node.val > other.min_node.val: + self.min_node = other.min_node + # Merge + + # Order roots by left_subtree_size + combined_roots_list = [] + i, j = self.bottom_root, other.bottom_root + while i or j: + if i and ((not j) or i.left_tree_size < j.left_tree_size): + combined_roots_list.append((i, True)) + i = i.parent + else: + combined_roots_list.append((j, False)) + j = j.parent + # Insert links between them + for i in range(len(combined_roots_list) - 1): + if combined_roots_list[i][1] != combined_roots_list[i + 1][1]: + combined_roots_list[i][0].parent = combined_roots_list[i + 1][0] + combined_roots_list[i + 1][0].left = combined_roots_list[i][0] + # Consecutively merge roots with same left_tree_size + i = combined_roots_list[0][0] + while i.parent: + if ( + (i.left_tree_size == i.parent.left_tree_size) and (not i.parent.parent) + ) or ( + i.left_tree_size == i.parent.left_tree_size + and i.left_tree_size != i.parent.parent.left_tree_size + ): + + # Neighbouring Nodes + previous_node = i.left + next_node = i.parent.parent + + # Merging trees + i = i.mergeTrees(i.parent) + + # Updating links + i.left = previous_node + i.parent = next_node + if previous_node: + previous_node.parent = i + if next_node: + next_node.left = i + else: + i = i.parent + # Updating self.bottom_root + while i.left: + i = i.left + self.bottom_root = i + + # Update other + other.size = self.size + other.bottom_root = self.bottom_root + other.min_node = self.min_node + + # Return the merged heap + return self + + def insert(self, val): + """ + insert a value in the heap + """ + if self.size == 0: + self.bottom_root = Node(val) + self.size = 1 + self.min_node = self.bottom_root + else: + # Create new node + new_node = Node(val) + + # Update size + self.size += 1 + + # update min_node + if val < self.min_node.val: + self.min_node = new_node + # Put new_node as a bottom_root in heap + self.bottom_root.left = new_node + new_node.parent = self.bottom_root + self.bottom_root = new_node + + # Consecutively merge roots with same left_tree_size + while ( + self.bottom_root.parent + and self.bottom_root.left_tree_size + == self.bottom_root.parent.left_tree_size + ): + + # Next node + next_node = self.bottom_root.parent.parent + + # Merge + self.bottom_root = self.bottom_root.mergeTrees(self.bottom_root.parent) + + # Update Links + self.bottom_root.parent = next_node + self.bottom_root.left = None + if next_node: + next_node.left = self.bottom_root + + def peek(self): + """ + return min element without deleting it + """ + return self.min_node.val + + def isEmpty(self): + return self.size == 0 + + def deleteMin(self): + """ + delete min element and return it + """ + # assert not self.isEmpty(), "Empty Heap" + + # Save minimal value + min_value = self.min_node.val + + # Last element in heap corner case + if self.size == 1: + # Update size + self.size = 0 + + # Update bottom root + self.bottom_root = None + + # Update min_node + self.min_node = None + + return min_value + # No right subtree corner case + # The structure of the tree implies that this should be the bottom root + # and there is at least one other root + if self.min_node.right is None: + # Update size + self.size -= 1 + + # Update bottom root + self.bottom_root = self.bottom_root.parent + self.bottom_root.left = None + + # Update min_node + self.min_node = self.bottom_root + i = self.bottom_root.parent + while i: + if i.val < self.min_node.val: + self.min_node = i + i = i.parent + return min_value + # General case + # Find the BinomialHeap of the right subtree of min_node + bottom_of_new = self.min_node.right + bottom_of_new.parent = None + min_of_new = bottom_of_new + size_of_new = 1 + + # Size, min_node and bottom_root + while bottom_of_new.left: + size_of_new = size_of_new * 2 + 1 + bottom_of_new = bottom_of_new.left + if bottom_of_new.val < min_of_new.val: + min_of_new = bottom_of_new + # Corner case of single root on top left path + if (not self.min_node.left) and (not self.min_node.parent): + self.size = size_of_new + self.bottom_root = bottom_of_new + self.min_node = min_of_new + # print("Single root, multiple nodes case") + return min_value + # Remaining cases + # Construct heap of right subtree + newHeap = BinomialHeap( + bottom_root=bottom_of_new, min_node=min_of_new, heap_size=size_of_new + ) + + # Update size + self.size = self.size - 1 - size_of_new + + # Neighbour nodes + previous_node = self.min_node.left + next_node = self.min_node.parent + + # Initialize new bottom_root and min_node + self.min_node = previous_node or next_node + self.bottom_root = next_node + + # Update links of previous_node and search below for new min_node and + # bottom_root + if previous_node: + previous_node.parent = next_node + + # Update bottom_root and search for min_node below + self.bottom_root = previous_node + self.min_node = previous_node + while self.bottom_root.left: + self.bottom_root = self.bottom_root.left + if self.bottom_root.val < self.min_node.val: + self.min_node = self.bottom_root + if next_node: + next_node.left = previous_node + + # Search for new min_node above min_node + i = next_node + while i: + if i.val < self.min_node.val: + self.min_node = i + i = i.parent + # Merge heaps + self.mergeHeaps(newHeap) + + return min_value + + def preOrder(self): + """ + Returns the Pre-order representation of the heap including + values of nodes plus their level distance from the root; + Empty nodes appear as # + """ + # Find top root + top_root = self.bottom_root + while top_root.parent: + top_root = top_root.parent + # preorder + heap_preOrder = [] + self.__traversal(top_root, heap_preOrder) + return heap_preOrder + + def __traversal(self, curr_node, preorder, level=0): + """ + Pre-order traversal of nodes + """ + if curr_node: + preorder.append((curr_node.val, level)) + self.__traversal(curr_node.left, preorder, level + 1) + self.__traversal(curr_node.right, preorder, level + 1) + else: + preorder.append(("#", level)) + + def __str__(self): + """ + Overwriting str for a pre-order print of nodes in heap; + Performance is poor, so use only for small examples + """ + if self.isEmpty(): + return "" + preorder_heap = self.preOrder() + + return "\n".join(("-" * level + str(value)) for value, level in preorder_heap) + + +# Unit Tests +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/data_structures/heap/heap.py b/python-mega-algo/data_structures/heap/heap.py new file mode 100644 index 00000000..65a70e46 --- /dev/null +++ b/python-mega-algo/data_structures/heap/heap.py @@ -0,0 +1,163 @@ +from typing import Iterable, List, Optional + + +class Heap: + """A Max Heap Implementation + + >>> unsorted = [103, 9, 1, 7, 11, 15, 25, 201, 209, 107, 5] + >>> h = Heap() + >>> h.build_max_heap(unsorted) + >>> print(h) + [209, 201, 25, 103, 107, 15, 1, 9, 7, 11, 5] + >>> + >>> h.extract_max() + 209 + >>> print(h) + [201, 107, 25, 103, 11, 15, 1, 9, 7, 5] + >>> + >>> h.insert(100) + >>> print(h) + [201, 107, 25, 103, 100, 15, 1, 9, 7, 5, 11] + >>> + >>> h.heap_sort() + >>> print(h) + [1, 5, 7, 9, 11, 15, 25, 100, 103, 107, 201] + """ + + def __init__(self) -> None: + self.h: List[float] = [] + self.heap_size: int = 0 + + def __repr__(self) -> str: + return str(self.h) + + def parent_index(self, child_idx: int) -> Optional[int]: + """return the parent index of given child""" + if child_idx > 0: + return (child_idx - 1) // 2 + return None + + def left_child_idx(self, parent_idx: int) -> Optional[int]: + """ + return the left child index if the left child exists. + if not, return None. + """ + left_child_index = 2 * parent_idx + 1 + if left_child_index < self.heap_size: + return left_child_index + return None + + def right_child_idx(self, parent_idx: int) -> Optional[int]: + """ + return the right child index if the right child exists. + if not, return None. + """ + right_child_index = 2 * parent_idx + 2 + if right_child_index < self.heap_size: + return right_child_index + return None + + def max_heapify(self, index: int) -> None: + """ + correct a single violation of the heap property in a subtree's root. + """ + if index < self.heap_size: + violation: int = index + left_child = self.left_child_idx(index) + right_child = self.right_child_idx(index) + # check which child is larger than its parent + if left_child is not None and self.h[left_child] > self.h[violation]: + violation = left_child + if right_child is not None and self.h[right_child] > self.h[violation]: + violation = right_child + # if violation indeed exists + if violation != index: + # swap to fix the violation + self.h[violation], self.h[index] = self.h[index], self.h[violation] + # fix the subsequent violation recursively if any + self.max_heapify(violation) + + def build_max_heap(self, collection: Iterable[float]) -> None: + """build max heap from an unsorted array""" + self.h = list(collection) + self.heap_size = len(self.h) + if self.heap_size > 1: + # max_heapify from right to left but exclude leaves (last level) + for i in range(self.heap_size // 2 - 1, -1, -1): + self.max_heapify(i) + + def max(self) -> float: + """return the max in the heap""" + if self.heap_size >= 1: + return self.h[0] + else: + raise Exception("Empty heap") + + def extract_max(self) -> float: + """get and remove max from heap""" + if self.heap_size >= 2: + me = self.h[0] + self.h[0] = self.h.pop(-1) + self.heap_size -= 1 + self.max_heapify(0) + return me + elif self.heap_size == 1: + self.heap_size -= 1 + return self.h.pop(-1) + else: + raise Exception("Empty heap") + + def insert(self, value: float) -> None: + """insert a new value into the max heap""" + self.h.append(value) + idx = (self.heap_size - 1) // 2 + self.heap_size += 1 + while idx >= 0: + self.max_heapify(idx) + idx = (idx - 1) // 2 + + def heap_sort(self) -> None: + size = self.heap_size + for j in range(size - 1, 0, -1): + self.h[0], self.h[j] = self.h[j], self.h[0] + self.heap_size -= 1 + self.max_heapify(0) + self.heap_size = size + + +if __name__ == "__main__": + import doctest + + # run doc test + doctest.testmod() + + # demo + for unsorted in [ + [0], + [2], + [3, 5], + [5, 3], + [5, 5], + [0, 0, 0, 0], + [1, 1, 1, 1], + [2, 2, 3, 5], + [0, 2, 2, 3, 5], + [2, 5, 3, 0, 2, 3, 0, 3], + [6, 1, 2, 7, 9, 3, 4, 5, 10, 8], + [103, 9, 1, 7, 11, 15, 25, 201, 209, 107, 5], + [-45, -2, -5], + ]: + print(f"unsorted array: {unsorted}") + + heap = Heap() + heap.build_max_heap(unsorted) + print(f"after build heap: {heap}") + + print(f"max value: {heap.extract_max()}") + print(f"after max value removed: {heap}") + + heap.insert(100) + print(f"after new value 100 inserted: {heap}") + + heap.heap_sort() + print(f"heap-sorted array: {heap}\n") diff --git a/python-mega-algo/data_structures/heap/heap_generic.py b/python-mega-algo/data_structures/heap/heap_generic.py new file mode 100644 index 00000000..553cb945 --- /dev/null +++ b/python-mega-algo/data_structures/heap/heap_generic.py @@ -0,0 +1,172 @@ +class Heap: + """ + A generic Heap class, can be used as min or max by passing the key function + accordingly. + """ + + def __init__(self, key=None): + # Stores actual heap items. + self.arr = list() + # Stores indexes of each item for supporting updates and deletion. + self.pos_map = {} + # Stores current size of heap. + self.size = 0 + # Stores function used to evaluate the score of an item on which basis ordering + # will be done. + self.key = key or (lambda x: x) + + def _parent(self, i): + """Returns parent index of given index if exists else None""" + return int((i - 1) / 2) if i > 0 else None + + def _left(self, i): + """Returns left-child-index of given index if exists else None""" + left = int(2 * i + 1) + return left if 0 < left < self.size else None + + def _right(self, i): + """Returns right-child-index of given index if exists else None""" + right = int(2 * i + 2) + return right if 0 < right < self.size else None + + def _swap(self, i, j): + """Performs changes required for swapping two elements in the heap""" + # First update the indexes of the items in index map. + self.pos_map[self.arr[i][0]], self.pos_map[self.arr[j][0]] = ( + self.pos_map[self.arr[j][0]], + self.pos_map[self.arr[i][0]], + ) + # Then swap the items in the list. + self.arr[i], self.arr[j] = self.arr[j], self.arr[i] + + def _cmp(self, i, j): + """Compares the two items using default comparison""" + return self.arr[i][1] < self.arr[j][1] + + def _get_valid_parent(self, i): + """ + Returns index of valid parent as per desired ordering among given index and + both it's children + """ + left = self._left(i) + right = self._right(i) + valid_parent = i + + if left is not None and not self._cmp(left, valid_parent): + valid_parent = left + if right is not None and not self._cmp(right, valid_parent): + valid_parent = right + + return valid_parent + + def _heapify_up(self, index): + """Fixes the heap in upward direction of given index""" + parent = self._parent(index) + while parent is not None and not self._cmp(index, parent): + self._swap(index, parent) + index, parent = parent, self._parent(parent) + + def _heapify_down(self, index): + """Fixes the heap in downward direction of given index""" + valid_parent = self._get_valid_parent(index) + while valid_parent != index: + self._swap(index, valid_parent) + index, valid_parent = valid_parent, self._get_valid_parent(valid_parent) + + def update_item(self, item, item_value): + """Updates given item value in heap if present""" + if item not in self.pos_map: + return + index = self.pos_map[item] + self.arr[index] = [item, self.key(item_value)] + # Make sure heap is right in both up and down direction. + # Ideally only one of them will make any change. + self._heapify_up(index) + self._heapify_down(index) + + def delete_item(self, item): + """Deletes given item from heap if present""" + if item not in self.pos_map: + return + index = self.pos_map[item] + del self.pos_map[item] + self.arr[index] = self.arr[self.size - 1] + self.pos_map[self.arr[self.size - 1][0]] = index + self.size -= 1 + # Make sure heap is right in both up and down direction. Ideally only one + # of them will make any change- so no performance loss in calling both. + if self.size > index: + self._heapify_up(index) + self._heapify_down(index) + + def insert_item(self, item, item_value): + """Inserts given item with given value in heap""" + arr_len = len(self.arr) + if arr_len == self.size: + self.arr.append([item, self.key(item_value)]) + else: + self.arr[self.size] = [item, self.key(item_value)] + self.pos_map[item] = self.size + self.size += 1 + self._heapify_up(self.size - 1) + + def get_top(self): + """Returns top item tuple (Calculated value, item) from heap if present""" + return self.arr[0] if self.size else None + + def extract_top(self): + """ + Return top item tuple (Calculated value, item) from heap and removes it as well + if present + """ + top_item_tuple = self.get_top() + if top_item_tuple: + self.delete_item(top_item_tuple[0]) + return top_item_tuple + + +def test_heap() -> None: + """ + >>> h = Heap() # Max-heap + >>> h.insert_item(5, 34) + >>> h.insert_item(6, 31) + >>> h.insert_item(7, 37) + >>> h.get_top() + [7, 37] + >>> h.extract_top() + [7, 37] + >>> h.extract_top() + [5, 34] + >>> h.extract_top() + [6, 31] + >>> h = Heap(key=lambda x: -x) # Min heap + >>> h.insert_item(5, 34) + >>> h.insert_item(6, 31) + >>> h.insert_item(7, 37) + >>> h.get_top() + [6, -31] + >>> h.extract_top() + [6, -31] + >>> h.extract_top() + [5, -34] + >>> h.extract_top() + [7, -37] + >>> h.insert_item(8, 45) + >>> h.insert_item(9, 40) + >>> h.insert_item(10, 50) + >>> h.get_top() + [9, -40] + >>> h.update_item(10, 30) + >>> h.get_top() + [10, -30] + >>> h.delete_item(10) + >>> h.get_top() + [9, -40] + """ + pass + + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/data_structures/heap/max_heap.py b/python-mega-algo/data_structures/heap/max_heap.py new file mode 100644 index 00000000..fbc8eed0 --- /dev/null +++ b/python-mega-algo/data_structures/heap/max_heap.py @@ -0,0 +1,87 @@ +class BinaryHeap: + """ + A max-heap implementation in Python + >>> binary_heap = BinaryHeap() + >>> binary_heap.insert(6) + >>> binary_heap.insert(10) + >>> binary_heap.insert(15) + >>> binary_heap.insert(12) + >>> binary_heap.pop() + 15 + >>> binary_heap.pop() + 12 + >>> binary_heap.get_list + [10, 6] + >>> len(binary_heap) + 2 + """ + + def __init__(self): + self.__heap = [0] + self.__size = 0 + + def __swap_up(self, i: int) -> None: + """Swap the element up""" + temporary = self.__heap[i] + while i // 2 > 0: + if self.__heap[i] > self.__heap[i // 2]: + self.__heap[i] = self.__heap[i // 2] + self.__heap[i // 2] = temporary + i //= 2 + + def insert(self, value: int) -> None: + """Insert new element""" + self.__heap.append(value) + self.__size += 1 + self.__swap_up(self.__size) + + def __swap_down(self, i: int) -> None: + """Swap the element down""" + while self.__size >= 2 * i: + if 2 * i + 1 > self.__size: + bigger_child = 2 * i + else: + if self.__heap[2 * i] > self.__heap[2 * i + 1]: + bigger_child = 2 * i + else: + bigger_child = 2 * i + 1 + temporary = self.__heap[i] + if self.__heap[i] < self.__heap[bigger_child]: + self.__heap[i] = self.__heap[bigger_child] + self.__heap[bigger_child] = temporary + i = bigger_child + + def pop(self) -> int: + """Pop the root element""" + max_value = self.__heap[1] + self.__heap[1] = self.__heap[self.__size] + self.__size -= 1 + self.__heap.pop() + self.__swap_down(1) + return max_value + + @property + def get_list(self): + return self.__heap[1:] + + def __len__(self): + """Length of the array""" + return self.__size + + +if __name__ == "__main__": + import doctest + + doctest.testmod() + # create an instance of BinaryHeap + binary_heap = BinaryHeap() + binary_heap.insert(6) + binary_heap.insert(10) + binary_heap.insert(15) + binary_heap.insert(12) + # pop root(max-values because it is max heap) + print(binary_heap.pop()) # 15 + print(binary_heap.pop()) # 12 + # get the list and size after operations + print(binary_heap.get_list) + print(len(binary_heap)) diff --git a/python-mega-algo/data_structures/heap/min_heap.py b/python-mega-algo/data_structures/heap/min_heap.py new file mode 100644 index 00000000..9265c483 --- /dev/null +++ b/python-mega-algo/data_structures/heap/min_heap.py @@ -0,0 +1,170 @@ +# Min heap data structure +# with decrease key functionality - in O(log(n)) time + + +class Node: + def __init__(self, name, val): + self.name = name + self.val = val + + def __str__(self): + return f"{self.__class__.__name__}({self.name}, {self.val})" + + def __lt__(self, other): + return self.val < other.val + + +class MinHeap: + """ + >>> r = Node("R", -1) + >>> b = Node("B", 6) + >>> a = Node("A", 3) + >>> x = Node("X", 1) + >>> e = Node("E", 4) + >>> print(b) + Node(B, 6) + >>> myMinHeap = MinHeap([r, b, a, x, e]) + >>> myMinHeap.decrease_key(b, -17) + >>> print(b) + Node(B, -17) + >>> print(myMinHeap["B"]) + -17 + """ + + def __init__(self, array): + self.idx_of_element = {} + self.heap_dict = {} + self.heap = self.build_heap(array) + + def __getitem__(self, key): + return self.get_value(key) + + def get_parent_idx(self, idx): + return (idx - 1) // 2 + + def get_left_child_idx(self, idx): + return idx * 2 + 1 + + def get_right_child_idx(self, idx): + return idx * 2 + 2 + + def get_value(self, key): + return self.heap_dict[key] + + def build_heap(self, array): + lastIdx = len(array) - 1 + startFrom = self.get_parent_idx(lastIdx) + + for idx, i in enumerate(array): + self.idx_of_element[i] = idx + self.heap_dict[i.name] = i.val + + for i in range(startFrom, -1, -1): + self.sift_down(i, array) + return array + + # this is min-heapify method + def sift_down(self, idx, array): + while True: + l = self.get_left_child_idx(idx) # noqa: E741 + r = self.get_right_child_idx(idx) + + smallest = idx + if l < len(array) and array[l] < array[idx]: + smallest = l + if r < len(array) and array[r] < array[smallest]: + smallest = r + + if smallest != idx: + array[idx], array[smallest] = array[smallest], array[idx] + ( + self.idx_of_element[array[idx]], + self.idx_of_element[array[smallest]], + ) = ( + self.idx_of_element[array[smallest]], + self.idx_of_element[array[idx]], + ) + idx = smallest + else: + break + + def sift_up(self, idx): + p = self.get_parent_idx(idx) + while p >= 0 and self.heap[p] > self.heap[idx]: + self.heap[p], self.heap[idx] = self.heap[idx], self.heap[p] + self.idx_of_element[self.heap[p]], self.idx_of_element[self.heap[idx]] = ( + self.idx_of_element[self.heap[idx]], + self.idx_of_element[self.heap[p]], + ) + idx = p + p = self.get_parent_idx(idx) + + def peek(self): + return self.heap[0] + + def remove(self): + self.heap[0], self.heap[-1] = self.heap[-1], self.heap[0] + self.idx_of_element[self.heap[0]], self.idx_of_element[self.heap[-1]] = ( + self.idx_of_element[self.heap[-1]], + self.idx_of_element[self.heap[0]], + ) + + x = self.heap.pop() + del self.idx_of_element[x] + self.sift_down(0, self.heap) + return x + + def insert(self, node): + self.heap.append(node) + self.idx_of_element[node] = len(self.heap) - 1 + self.heap_dict[node.name] = node.val + self.sift_up(len(self.heap) - 1) + + def is_empty(self): + return True if len(self.heap) == 0 else False + + def decrease_key(self, node, newValue): + assert ( + self.heap[self.idx_of_element[node]].val > newValue + ), "newValue must be less that current value" + node.val = newValue + self.heap_dict[node.name] = newValue + self.sift_up(self.idx_of_element[node]) + + +# USAGE + +r = Node("R", -1) +b = Node("B", 6) +a = Node("A", 3) +x = Node("X", 1) +e = Node("E", 4) + +# Use one of these two ways to generate Min-Heap + +# Generating Min-Heap from array +myMinHeap = MinHeap([r, b, a, x, e]) + +# Generating Min-Heap by Insert method +# myMinHeap.insert(a) +# myMinHeap.insert(b) +# myMinHeap.insert(x) +# myMinHeap.insert(r) +# myMinHeap.insert(e) + +# Before +print("Min Heap - before decrease key") +for i in myMinHeap.heap: + print(i) + +print("Min Heap - After decrease key of node [B -> -17]") +myMinHeap.decrease_key(b, -17) + +# After +for i in myMinHeap.heap: + print(i) + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/data_structures/heap/randomized_heap.py b/python-mega-algo/data_structures/heap/randomized_heap.py new file mode 100644 index 00000000..0ddc2272 --- /dev/null +++ b/python-mega-algo/data_structures/heap/randomized_heap.py @@ -0,0 +1,188 @@ +#!/usr/bin/env python3 + +from __future__ import annotations + +import random +from typing import Generic, Iterable, List, Optional, TypeVar + +T = TypeVar("T") + + +class RandomizedHeapNode(Generic[T]): + """ + One node of the randomized heap. Contains the value and references to + two children. + """ + + def __init__(self, value: T) -> None: + self._value: T = value + self.left: Optional[RandomizedHeapNode[T]] = None + self.right: Optional[RandomizedHeapNode[T]] = None + + @property + def value(self) -> T: + """Return the value of the node.""" + return self._value + + @staticmethod + def merge( + root1: Optional[RandomizedHeapNode[T]], root2: Optional[RandomizedHeapNode[T]] + ) -> Optional[RandomizedHeapNode[T]]: + """Merge 2 nodes together.""" + if not root1: + return root2 + + if not root2: + return root1 + + if root1.value > root2.value: + root1, root2 = root2, root1 + + if random.choice([True, False]): + root1.left, root1.right = root1.right, root1.left + + root1.left = RandomizedHeapNode.merge(root1.left, root2) + + return root1 + + +class RandomizedHeap(Generic[T]): + """ + A data structure that allows inserting a new value and to pop the smallest + values. Both operations take O(logN) time where N is the size of the + structure. + Wiki: https://en.wikipedia.org/wiki/Randomized_meldable_heap + + >>> RandomizedHeap([2, 3, 1, 5, 1, 7]).to_sorted_list() + [1, 1, 2, 3, 5, 7] + + >>> rh = RandomizedHeap() + >>> rh.pop() + Traceback (most recent call last): + ... + IndexError: Can't get top element for the empty heap. + + >>> rh.insert(1) + >>> rh.insert(-1) + >>> rh.insert(0) + >>> rh.to_sorted_list() + [-1, 0, 1] + """ + + def __init__(self, data: Optional[Iterable[T]] = ()) -> None: + """ + >>> rh = RandomizedHeap([3, 1, 3, 7]) + >>> rh.to_sorted_list() + [1, 3, 3, 7] + """ + self._root: Optional[RandomizedHeapNode[T]] = None + for item in data: + self.insert(item) + + def insert(self, value: T) -> None: + """ + Insert the value into the heap. + + >>> rh = RandomizedHeap() + >>> rh.insert(3) + >>> rh.insert(1) + >>> rh.insert(3) + >>> rh.insert(7) + >>> rh.to_sorted_list() + [1, 3, 3, 7] + """ + self._root = RandomizedHeapNode.merge(self._root, RandomizedHeapNode(value)) + + def pop(self) -> T: + """ + Pop the smallest value from the heap and return it. + + >>> rh = RandomizedHeap([3, 1, 3, 7]) + >>> rh.pop() + 1 + >>> rh.pop() + 3 + >>> rh.pop() + 3 + >>> rh.pop() + 7 + >>> rh.pop() + Traceback (most recent call last): + ... + IndexError: Can't get top element for the empty heap. + """ + result = self.top() + self._root = RandomizedHeapNode.merge(self._root.left, self._root.right) + + return result + + def top(self) -> T: + """ + Return the smallest value from the heap. + + >>> rh = RandomizedHeap() + >>> rh.insert(3) + >>> rh.top() + 3 + >>> rh.insert(1) + >>> rh.top() + 1 + >>> rh.insert(3) + >>> rh.top() + 1 + >>> rh.insert(7) + >>> rh.top() + 1 + """ + if not self._root: + raise IndexError("Can't get top element for the empty heap.") + return self._root.value + + def clear(self): + """ + Clear the heap. + + >>> rh = RandomizedHeap([3, 1, 3, 7]) + >>> rh.clear() + >>> rh.pop() + Traceback (most recent call last): + ... + IndexError: Can't get top element for the empty heap. + """ + self._root = None + + def to_sorted_list(self) -> List[T]: + """ + Returns sorted list containing all the values in the heap. + + >>> rh = RandomizedHeap([3, 1, 3, 7]) + >>> rh.to_sorted_list() + [1, 3, 3, 7] + """ + result = [] + while self: + result.append(self.pop()) + + return result + + def __bool__(self) -> bool: + """ + Check if the heap is not empty. + + >>> rh = RandomizedHeap() + >>> bool(rh) + False + >>> rh.insert(1) + >>> bool(rh) + True + >>> rh.clear() + >>> bool(rh) + False + """ + return self._root is not None + + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/data_structures/heap/right.html b/python-mega-algo/data_structures/heap/right.html new file mode 100644 index 00000000..324e04c3 --- /dev/null +++ b/python-mega-algo/data_structures/heap/right.html @@ -0,0 +1,30 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/data_structures/heap + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + + +
    FileFileFileFile
    binomial_heap.py heap_generic.py min_heap.py skew_heap.py 
    heap.py max_heap.py randomized_heap.py __init__.py 
    + +

    +Folders: 1
    +Files: 8
    +Size of all files: 39035 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/data_structures/heap/skew_heap.py b/python-mega-algo/data_structures/heap/skew_heap.py new file mode 100644 index 00000000..417a383f --- /dev/null +++ b/python-mega-algo/data_structures/heap/skew_heap.py @@ -0,0 +1,192 @@ +#!/usr/bin/env python3 + +from __future__ import annotations + +from typing import Generic, Iterable, Iterator, Optional, TypeVar + +T = TypeVar("T") + + +class SkewNode(Generic[T]): + """ + One node of the skew heap. Contains the value and references to + two children. + """ + + def __init__(self, value: T) -> None: + self._value: T = value + self.left: Optional[SkewNode[T]] = None + self.right: Optional[SkewNode[T]] = None + + @property + def value(self) -> T: + """Return the value of the node.""" + return self._value + + @staticmethod + def merge( + root1: Optional[SkewNode[T]], root2: Optional[SkewNode[T]] + ) -> Optional[SkewNode[T]]: + """Merge 2 nodes together.""" + if not root1: + return root2 + + if not root2: + return root1 + + if root1.value > root2.value: + root1, root2 = root2, root1 + + result = root1 + temp = root1.right + result.right = root1.left + result.left = SkewNode.merge(temp, root2) + + return result + + +class SkewHeap(Generic[T]): + """ + A data structure that allows inserting a new value and to pop the smallest + values. Both operations take O(logN) time where N is the size of the + structure. + Wiki: https://en.wikipedia.org/wiki/Skew_heap + Visualisation: https://www.cs.usfca.edu/~galles/visualization/SkewHeap.html + + >>> list(SkewHeap([2, 3, 1, 5, 1, 7])) + [1, 1, 2, 3, 5, 7] + + >>> sh = SkewHeap() + >>> sh.pop() + Traceback (most recent call last): + ... + IndexError: Can't get top element for the empty heap. + + >>> sh.insert(1) + >>> sh.insert(-1) + >>> sh.insert(0) + >>> list(sh) + [-1, 0, 1] + """ + + def __init__(self, data: Optional[Iterable[T]] = ()) -> None: + """ + >>> sh = SkewHeap([3, 1, 3, 7]) + >>> list(sh) + [1, 3, 3, 7] + """ + self._root: Optional[SkewNode[T]] = None + for item in data: + self.insert(item) + + def __bool__(self) -> bool: + """ + Check if the heap is not empty. + + >>> sh = SkewHeap() + >>> bool(sh) + False + >>> sh.insert(1) + >>> bool(sh) + True + >>> sh.clear() + >>> bool(sh) + False + """ + return self._root is not None + + def __iter__(self) -> Iterator[T]: + """ + Returns sorted list containing all the values in the heap. + + >>> sh = SkewHeap([3, 1, 3, 7]) + >>> list(sh) + [1, 3, 3, 7] + """ + result = [] + while self: + result.append(self.pop()) + + # Pushing items back to the heap not to clear it. + for item in result: + self.insert(item) + + return iter(result) + + def insert(self, value: T) -> None: + """ + Insert the value into the heap. + + >>> sh = SkewHeap() + >>> sh.insert(3) + >>> sh.insert(1) + >>> sh.insert(3) + >>> sh.insert(7) + >>> list(sh) + [1, 3, 3, 7] + """ + self._root = SkewNode.merge(self._root, SkewNode(value)) + + def pop(self) -> T: + """ + Pop the smallest value from the heap and return it. + + >>> sh = SkewHeap([3, 1, 3, 7]) + >>> sh.pop() + 1 + >>> sh.pop() + 3 + >>> sh.pop() + 3 + >>> sh.pop() + 7 + >>> sh.pop() + Traceback (most recent call last): + ... + IndexError: Can't get top element for the empty heap. + """ + result = self.top() + self._root = SkewNode.merge(self._root.left, self._root.right) + + return result + + def top(self) -> T: + """ + Return the smallest value from the heap. + + >>> sh = SkewHeap() + >>> sh.insert(3) + >>> sh.top() + 3 + >>> sh.insert(1) + >>> sh.top() + 1 + >>> sh.insert(3) + >>> sh.top() + 1 + >>> sh.insert(7) + >>> sh.top() + 1 + """ + if not self._root: + raise IndexError("Can't get top element for the empty heap.") + return self._root.value + + def clear(self): + """ + Clear the heap. + + >>> sh = SkewHeap([3, 1, 3, 7]) + >>> sh.clear() + >>> sh.pop() + Traceback (most recent call last): + ... + IndexError: Can't get top element for the empty heap. + """ + self._root = None + + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/data_structures/linked_list/__init__.py b/python-mega-algo/data_structures/linked_list/__init__.py new file mode 100644 index 00000000..a5f5537b --- /dev/null +++ b/python-mega-algo/data_structures/linked_list/__init__.py @@ -0,0 +1,80 @@ +""" +Linked Lists consists of Nodes. +Nodes contain data and also may link to other nodes: + - Head Node: First node, the address of the + head node gives us access of the complete list + - Last node: points to null +""" + +from typing import Any + + +class Node: + def __init__(self, item: Any, next: Any) -> None: + self.item = item + self.next = next + + +class LinkedList: + def __init__(self) -> None: + self.head = None + self.size = 0 + + def add(self, item: Any) -> None: + self.head = Node(item, self.head) + self.size += 1 + + def remove(self) -> Any: + if self.is_empty(): + return None + else: + item = self.head.item + self.head = self.head.next + self.size -= 1 + return item + + def is_empty(self) -> bool: + return self.head is None + + def __str__(self) -> str: + """ + >>> linked_list = LinkedList() + >>> linked_list.add(23) + >>> linked_list.add(14) + >>> linked_list.add(9) + >>> print(linked_list) + 9 --> 14 --> 23 + """ + if not self.is_empty: + return "" + else: + iterate = self.head + item_str = "" + item_list = [] + while iterate: + item_list.append(str(iterate.item)) + iterate = iterate.next + + item_str = " --> ".join(item_list) + + return item_str + + def __len__(self) -> int: + """ + >>> linked_list = LinkedList() + >>> len(linked_list) + 0 + >>> linked_list.add("a") + >>> len(linked_list) + 1 + >>> linked_list.add("b") + >>> len(linked_list) + 2 + >>> _ = linked_list.remove() + >>> len(linked_list) + 1 + >>> _ = linked_list.remove() + >>> len(linked_list) + 0 + """ + return self.size diff --git a/python-mega-algo/data_structures/linked_list/circular_linked_list.py b/python-mega-algo/data_structures/linked_list/circular_linked_list.py new file mode 100644 index 00000000..f67c1e8f --- /dev/null +++ b/python-mega-algo/data_structures/linked_list/circular_linked_list.py @@ -0,0 +1,141 @@ +from typing import Any + + +class Node: + def __init__(self, data: Any): + self.data = data + self.next = None + + +class CircularLinkedList: + def __init__(self): + self.head = None + self.tail = None + + def __iter__(self): + node = self.head + while self.head: + yield node.data + node = node.next + if node == self.head: + break + + def __len__(self) -> int: + return len(tuple(iter(self))) + + def __repr__(self): + return "->".join(str(item) for item in iter(self)) + + def insert_tail(self, data: Any) -> None: + self.insert_nth(len(self), data) + + def insert_head(self, data: Any) -> None: + self.insert_nth(0, data) + + def insert_nth(self, index: int, data: Any) -> None: + if index < 0 or index > len(self): + raise IndexError("list index out of range.") + new_node = Node(data) + if self.head is None: + new_node.next = new_node # first node points itself + self.tail = self.head = new_node + elif index == 0: # insert at head + new_node.next = self.head + self.head = self.tail.next = new_node + else: + temp = self.head + for _ in range(index - 1): + temp = temp.next + new_node.next = temp.next + temp.next = new_node + if index == len(self) - 1: # insert at tail + self.tail = new_node + + def delete_front(self): + return self.delete_nth(0) + + def delete_tail(self) -> None: + return self.delete_nth(len(self) - 1) + + def delete_nth(self, index: int = 0): + if not 0 <= index < len(self): + raise IndexError("list index out of range.") + delete_node = self.head + if self.head == self.tail: # just one node + self.head = self.tail = None + elif index == 0: # delete head node + self.tail.next = self.tail.next.next + self.head = self.head.next + else: + temp = self.head + for _ in range(index - 1): + temp = temp.next + delete_node = temp.next + temp.next = temp.next.next + if index == len(self) - 1: # delete at tail + self.tail = temp + return delete_node.data + + def is_empty(self): + return len(self) == 0 + + +def test_circular_linked_list() -> None: + """ + >>> test_circular_linked_list() + """ + circular_linked_list = CircularLinkedList() + assert len(circular_linked_list) == 0 + assert circular_linked_list.is_empty() is True + assert str(circular_linked_list) == "" + + try: + circular_linked_list.delete_front() + assert False # This should not happen + except IndexError: + assert True # This should happen + + try: + circular_linked_list.delete_tail() + assert False # This should not happen + except IndexError: + assert True # This should happen + + try: + circular_linked_list.delete_nth(-1) + assert False + except IndexError: + assert True + + try: + circular_linked_list.delete_nth(0) + assert False + except IndexError: + assert True + + assert circular_linked_list.is_empty() is True + for i in range(5): + assert len(circular_linked_list) == i + circular_linked_list.insert_nth(i, i + 1) + assert str(circular_linked_list) == "->".join(str(i) for i in range(1, 6)) + + circular_linked_list.insert_tail(6) + assert str(circular_linked_list) == "->".join(str(i) for i in range(1, 7)) + circular_linked_list.insert_head(0) + assert str(circular_linked_list) == "->".join(str(i) for i in range(0, 7)) + + assert circular_linked_list.delete_front() == 0 + assert circular_linked_list.delete_tail() == 6 + assert str(circular_linked_list) == "->".join(str(i) for i in range(1, 6)) + assert circular_linked_list.delete_nth(2) == 3 + + circular_linked_list.insert_nth(2, 3) + assert str(circular_linked_list) == "->".join(str(i) for i in range(1, 6)) + + assert circular_linked_list.is_empty() is False + + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/data_structures/linked_list/deque_doubly.py b/python-mega-algo/data_structures/linked_list/deque_doubly.py new file mode 100644 index 00000000..2b9d70c2 --- /dev/null +++ b/python-mega-algo/data_structures/linked_list/deque_doubly.py @@ -0,0 +1,143 @@ +""" +Implementing Deque using DoublyLinkedList ... +Operations: + 1. insertion in the front -> O(1) + 2. insertion in the end -> O(1) + 3. remove from the front -> O(1) + 4. remove from the end -> O(1) +""" + + +class _DoublyLinkedBase: + """A Private class (to be inherited)""" + + class _Node: + __slots__ = "_prev", "_data", "_next" + + def __init__(self, link_p, element, link_n): + self._prev = link_p + self._data = element + self._next = link_n + + def has_next_and_prev(self): + return ( + f" Prev -> {self._prev is not None}, Next -> {self._next is not None}" + ) + + def __init__(self): + self._header = self._Node(None, None, None) + self._trailer = self._Node(None, None, None) + self._header._next = self._trailer + self._trailer._prev = self._header + self._size = 0 + + def __len__(self): + return self._size + + def is_empty(self): + return self.__len__() == 0 + + def _insert(self, predecessor, e, successor): + # Create new_node by setting it's prev.link -> header + # setting it's next.link -> trailer + new_node = self._Node(predecessor, e, successor) + predecessor._next = new_node + successor._prev = new_node + self._size += 1 + return self + + def _delete(self, node): + predecessor = node._prev + successor = node._next + + predecessor._next = successor + successor._prev = predecessor + self._size -= 1 + temp = node._data + node._prev = node._next = node._data = None + del node + return temp + + +class LinkedDeque(_DoublyLinkedBase): + def first(self): + """return first element + >>> d = LinkedDeque() + >>> d.add_first('A').first() + 'A' + >>> d.add_first('B').first() + 'B' + """ + if self.is_empty(): + raise Exception("List is empty") + return self._header._next._data + + def last(self): + """return last element + >>> d = LinkedDeque() + >>> d.add_last('A').last() + 'A' + >>> d.add_last('B').last() + 'B' + """ + if self.is_empty(): + raise Exception("List is empty") + return self._trailer._prev._data + + # DEque Insert Operations (At the front, At the end) + + def add_first(self, element): + """insertion in the front + >>> LinkedDeque().add_first('AV').first() + 'AV' + """ + return self._insert(self._header, element, self._header._next) + + def add_last(self, element): + """insertion in the end + >>> LinkedDeque().add_last('B').last() + 'B' + """ + return self._insert(self._trailer._prev, element, self._trailer) + + # DEqueu Remove Operations (At the front, At the end) + + def remove_first(self): + """removal from the front + >>> d = LinkedDeque() + >>> d.is_empty() + True + >>> d.remove_first() + Traceback (most recent call last): + ... + IndexError: remove_first from empty list + >>> d.add_first('A') # doctest: +ELLIPSIS + >> d.remove_first() + 'A' + >>> d.is_empty() + True + """ + if self.is_empty(): + raise IndexError("remove_first from empty list") + return self._delete(self._header._next) + + def remove_last(self): + """removal in the end + >>> d = LinkedDeque() + >>> d.is_empty() + True + >>> d.remove_last() + Traceback (most recent call last): + ... + IndexError: remove_first from empty list + >>> d.add_first('A') # doctest: +ELLIPSIS + >> d.remove_last() + 'A' + >>> d.is_empty() + True + """ + if self.is_empty(): + raise IndexError("remove_first from empty list") + return self._delete(self._trailer._prev) diff --git a/python-mega-algo/data_structures/linked_list/doubly_linked_list.py b/python-mega-algo/data_structures/linked_list/doubly_linked_list.py new file mode 100644 index 00000000..0eb3cf10 --- /dev/null +++ b/python-mega-algo/data_structures/linked_list/doubly_linked_list.py @@ -0,0 +1,226 @@ +""" +https://en.wikipedia.org/wiki/Doubly_linked_list +""" + + +class Node: + def __init__(self, data): + self.data = data + self.previous = None + self.next = None + + def __str__(self): + return f"{self.data}" + + +class DoublyLinkedList: + def __init__(self): + self.head = None + self.tail = None + + def __iter__(self): + """ + >>> linked_list = DoublyLinkedList() + >>> linked_list.insert_at_head('b') + >>> linked_list.insert_at_head('a') + >>> linked_list.insert_at_tail('c') + >>> tuple(linked_list) + ('a', 'b', 'c') + """ + node = self.head + while node: + yield node.data + node = node.next + + def __str__(self): + """ + >>> linked_list = DoublyLinkedList() + >>> linked_list.insert_at_tail('a') + >>> linked_list.insert_at_tail('b') + >>> linked_list.insert_at_tail('c') + >>> str(linked_list) + 'a->b->c' + """ + return "->".join([str(item) for item in self]) + + def __len__(self): + """ + >>> linked_list = DoublyLinkedList() + >>> for i in range(0, 5): + ... linked_list.insert_at_nth(i, i + 1) + >>> len(linked_list) == 5 + True + """ + return len(tuple(iter(self))) + + def insert_at_head(self, data): + self.insert_at_nth(0, data) + + def insert_at_tail(self, data): + self.insert_at_nth(len(self), data) + + def insert_at_nth(self, index: int, data): + """ + >>> linked_list = DoublyLinkedList() + >>> linked_list.insert_at_nth(-1, 666) + Traceback (most recent call last): + .... + IndexError: list index out of range + >>> linked_list.insert_at_nth(1, 666) + Traceback (most recent call last): + .... + IndexError: list index out of range + >>> linked_list.insert_at_nth(0, 2) + >>> linked_list.insert_at_nth(0, 1) + >>> linked_list.insert_at_nth(2, 4) + >>> linked_list.insert_at_nth(2, 3) + >>> str(linked_list) + '1->2->3->4' + >>> linked_list.insert_at_nth(5, 5) + Traceback (most recent call last): + .... + IndexError: list index out of range + """ + if not 0 <= index <= len(self): + raise IndexError("list index out of range") + new_node = Node(data) + if self.head is None: + self.head = self.tail = new_node + elif index == 0: + self.head.previous = new_node + new_node.next = self.head + self.head = new_node + elif index == len(self): + self.tail.next = new_node + new_node.previous = self.tail + self.tail = new_node + else: + temp = self.head + for i in range(0, index): + temp = temp.next + temp.previous.next = new_node + new_node.previous = temp.previous + new_node.next = temp + temp.previous = new_node + + def delete_head(self): + return self.delete_at_nth(0) + + def delete_tail(self): + return self.delete_at_nth(len(self) - 1) + + def delete_at_nth(self, index: int): + """ + >>> linked_list = DoublyLinkedList() + >>> linked_list.delete_at_nth(0) + Traceback (most recent call last): + .... + IndexError: list index out of range + >>> for i in range(0, 5): + ... linked_list.insert_at_nth(i, i + 1) + >>> linked_list.delete_at_nth(0) == 1 + True + >>> linked_list.delete_at_nth(3) == 5 + True + >>> linked_list.delete_at_nth(1) == 3 + True + >>> str(linked_list) + '2->4' + >>> linked_list.delete_at_nth(2) + Traceback (most recent call last): + .... + IndexError: list index out of range + """ + if not 0 <= index <= len(self) - 1: + raise IndexError("list index out of range") + delete_node = self.head # default first node + if len(self) == 1: + self.head = self.tail = None + elif index == 0: + self.head = self.head.next + self.head.previous = None + elif index == len(self) - 1: + delete_node = self.tail + self.tail = self.tail.previous + self.tail.next = None + else: + temp = self.head + for i in range(0, index): + temp = temp.next + delete_node = temp + temp.next.previous = temp.previous + temp.previous.next = temp.next + return delete_node.data + + def delete(self, data) -> str: + current = self.head + + while current.data != data: # Find the position to delete + if current.next: + current = current.next + else: # We have reached the end an no value matches + return "No data matching given value" + + if current == self.head: + self.delete_head() + + elif current == self.tail: + self.delete_tail() + + else: # Before: 1 <--> 2(current) <--> 3 + current.previous.next = current.next # 1 --> 3 + current.next.previous = current.previous # 1 <--> 3 + return data + + def is_empty(self): + """ + >>> linked_list = DoublyLinkedList() + >>> linked_list.is_empty() + True + >>> linked_list.insert_at_tail(1) + >>> linked_list.is_empty() + False + """ + return len(self) == 0 + + +def test_doubly_linked_list() -> None: + """ + >>> test_doubly_linked_list() + """ + linked_list = DoublyLinkedList() + assert linked_list.is_empty() is True + assert str(linked_list) == "" + + try: + linked_list.delete_head() + assert False # This should not happen. + except IndexError: + assert True # This should happen. + + try: + linked_list.delete_tail() + assert False # This should not happen. + except IndexError: + assert True # This should happen. + + for i in range(10): + assert len(linked_list) == i + linked_list.insert_at_nth(i, i + 1) + assert str(linked_list) == "->".join(str(i) for i in range(1, 11)) + + linked_list.insert_at_head(0) + linked_list.insert_at_tail(11) + assert str(linked_list) == "->".join(str(i) for i in range(0, 12)) + + assert linked_list.delete_head() == 0 + assert linked_list.delete_at_nth(9) == 10 + assert linked_list.delete_tail() == 11 + assert len(linked_list) == 9 + assert str(linked_list) == "->".join(str(i) for i in range(1, 10)) + + +if __name__ == "__main__": + from doctest import testmod + + testmod() diff --git a/python-mega-algo/data_structures/linked_list/doubly_linked_list_two.py b/python-mega-algo/data_structures/linked_list/doubly_linked_list_two.py new file mode 100644 index 00000000..184b6966 --- /dev/null +++ b/python-mega-algo/data_structures/linked_list/doubly_linked_list_two.py @@ -0,0 +1,253 @@ +""" +- A linked list is similar to an array, it holds values. However, links in a linked + list do not have indexes. +- This is an example of a double ended, doubly linked list. +- Each link references the next link and the previous one. +- A Doubly Linked List (DLL) contains an extra pointer, typically called previous + pointer, together with next pointer and data which are there in singly linked list. + - Advantages over SLL - It can be traversed in both forward and backward direction. + Delete operation is more efficient +""" + + +class Node: + def __init__(self, data: int, previous=None, next_node=None): + self.data = data + self.previous = previous + self.next = next_node + + def __str__(self) -> str: + return f"{self.data}" + + def get_data(self) -> int: + return self.data + + def get_next(self): + return self.next + + def get_previous(self): + return self.previous + + +class LinkedListIterator: + def __init__(self, head): + self.current = head + + def __iter__(self): + return self + + def __next__(self): + if not self.current: + raise StopIteration + else: + value = self.current.get_data() + self.current = self.current.get_next() + return value + + +class LinkedList: + def __init__(self): + self.head = None # First node in list + self.tail = None # Last node in list + + def __str__(self): + current = self.head + nodes = [] + while current is not None: + nodes.append(current.get_data()) + current = current.get_next() + return " ".join(str(node) for node in nodes) + + def __contains__(self, value: int): + current = self.head + while current: + if current.get_data() == value: + return True + current = current.get_next() + return False + + def __iter__(self): + return LinkedListIterator(self.head) + + def get_head_data(self): + if self.head: + return self.head.get_data() + return None + + def get_tail_data(self): + if self.tail: + return self.tail.get_data() + return None + + def set_head(self, node: Node) -> None: + + if self.head is None: + self.head = node + self.tail = node + else: + self.insert_before_node(self.head, node) + + def set_tail(self, node: Node) -> None: + if self.head is None: + self.set_head(node) + else: + self.insert_after_node(self.tail, node) + + def insert(self, value: int) -> None: + node = Node(value) + if self.head is None: + self.set_head(node) + else: + self.set_tail(node) + + def insert_before_node(self, node: Node, node_to_insert: Node) -> None: + node_to_insert.next = node + node_to_insert.previous = node.previous + + if node.get_previous() is None: + self.head = node_to_insert + else: + node.previous.next = node_to_insert + + node.previous = node_to_insert + + def insert_after_node(self, node: Node, node_to_insert: Node) -> None: + node_to_insert.previous = node + node_to_insert.next = node.next + + if node.get_next() is None: + self.tail = node_to_insert + else: + node.next.previous = node_to_insert + + node.next = node_to_insert + + def insert_at_position(self, position: int, value: int) -> None: + current_position = 1 + new_node = Node(value) + node = self.head + while node: + if current_position == position: + self.insert_before_node(node, new_node) + return None + current_position += 1 + node = node.next + self.insert_after_node(self.tail, new_node) + + def get_node(self, item: int) -> Node: + node = self.head + while node: + if node.get_data() == item: + return node + node = node.get_next() + raise Exception("Node not found") + + def delete_value(self, value): + node = self.get_node(value) + + if node is not None: + if node == self.head: + self.head = self.head.get_next() + + if node == self.tail: + self.tail = self.tail.get_previous() + + self.remove_node_pointers(node) + + @staticmethod + def remove_node_pointers(node: Node) -> None: + if node.get_next(): + node.next.previous = node.previous + + if node.get_previous(): + node.previous.next = node.next + + node.next = None + node.previous = None + + def is_empty(self): + return self.head is None + + +def create_linked_list() -> None: + """ + >>> new_linked_list = LinkedList() + >>> new_linked_list.get_head_data() is None + True + >>> new_linked_list.get_tail_data() is None + True + >>> new_linked_list.is_empty() + True + >>> new_linked_list.insert(10) + >>> new_linked_list.get_head_data() + 10 + >>> new_linked_list.get_tail_data() + 10 + >>> new_linked_list.insert_at_position(position=3, value=20) + >>> new_linked_list.get_head_data() + 10 + >>> new_linked_list.get_tail_data() + 20 + >>> new_linked_list.set_head(Node(1000)) + >>> new_linked_list.get_head_data() + 1000 + >>> new_linked_list.get_tail_data() + 20 + >>> new_linked_list.set_tail(Node(2000)) + >>> new_linked_list.get_head_data() + 1000 + >>> new_linked_list.get_tail_data() + 2000 + >>> for value in new_linked_list: + ... print(value) + 1000 + 10 + 20 + 2000 + >>> new_linked_list.is_empty() + False + >>> for value in new_linked_list: + ... print(value) + 1000 + 10 + 20 + 2000 + >>> 10 in new_linked_list + True + >>> new_linked_list.delete_value(value=10) + >>> 10 in new_linked_list + False + >>> new_linked_list.delete_value(value=2000) + >>> new_linked_list.get_tail_data() + 20 + >>> new_linked_list.delete_value(value=1000) + >>> new_linked_list.get_tail_data() + 20 + >>> new_linked_list.get_head_data() + 20 + >>> for value in new_linked_list: + ... print(value) + 20 + >>> new_linked_list.delete_value(value=20) + >>> for value in new_linked_list: + ... print(value) + >>> for value in range(1,10): + ... new_linked_list.insert(value=value) + >>> for value in new_linked_list: + ... print(value) + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + """ + + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/data_structures/linked_list/from_sequence.py b/python-mega-algo/data_structures/linked_list/from_sequence.py new file mode 100644 index 00000000..94b44f15 --- /dev/null +++ b/python-mega-algo/data_structures/linked_list/from_sequence.py @@ -0,0 +1,44 @@ +# Recursive Prorgam to create a Linked List from a sequence and +# print a string representation of it. + + +class Node: + def __init__(self, data=None): + self.data = data + self.next = None + + def __repr__(self): + """Returns a visual representation of the node and all its following nodes.""" + string_rep = "" + temp = self + while temp: + string_rep += f"<{temp.data}> ---> " + temp = temp.next + string_rep += "" + return string_rep + + +def make_linked_list(elements_list): + """Creates a Linked List from the elements of the given sequence + (list/tuple) and returns the head of the Linked List.""" + + # if elements_list is empty + if not elements_list: + raise Exception("The Elements List is empty") + + # Set first element as Head + head = Node(elements_list[0]) + current = head + # Loop through elements from position 1 + for data in elements_list[1:]: + current.next = Node(data) + current = current.next + return head + + +list_data = [1, 3, 5, 32, 44, 12, 43] +print(f"List: {list_data}") +print("Creating Linked List from List.") +linked_list = make_linked_list(list_data) +print("Linked List:") +print(linked_list) diff --git a/python-mega-algo/data_structures/linked_list/has_loop.py b/python-mega-algo/data_structures/linked_list/has_loop.py new file mode 100644 index 00000000..405ece7e --- /dev/null +++ b/python-mega-algo/data_structures/linked_list/has_loop.py @@ -0,0 +1,60 @@ +from typing import Any + + +class ContainsLoopError(Exception): + pass + + +class Node: + def __init__(self, data: Any) -> None: + self.data = data + self.next_node = None + + def __iter__(self): + node = self + visited = [] + while node: + if node in visited: + raise ContainsLoopError + visited.append(node) + yield node.data + node = node.next_node + + @property + def has_loop(self) -> bool: + """ + A loop is when the exact same Node appears more than once in a linked list. + >>> root_node = Node(1) + >>> root_node.next_node = Node(2) + >>> root_node.next_node.next_node = Node(3) + >>> root_node.next_node.next_node.next_node = Node(4) + >>> root_node.has_loop + False + >>> root_node.next_node.next_node.next_node = root_node.next_node + >>> root_node.has_loop + True + """ + try: + list(self) + return False + except ContainsLoopError: + return True + + +if __name__ == "__main__": + root_node = Node(1) + root_node.next_node = Node(2) + root_node.next_node.next_node = Node(3) + root_node.next_node.next_node.next_node = Node(4) + print(root_node.has_loop) # False + root_node.next_node.next_node.next_node = root_node.next_node + print(root_node.has_loop) # True + + root_node = Node(5) + root_node.next_node = Node(6) + root_node.next_node.next_node = Node(5) + root_node.next_node.next_node.next_node = Node(6) + print(root_node.has_loop) # False + + root_node = Node(1) + print(root_node.has_loop) # False diff --git a/python-mega-algo/data_structures/linked_list/is_palindrome.py b/python-mega-algo/data_structures/linked_list/is_palindrome.py new file mode 100644 index 00000000..acc87c1c --- /dev/null +++ b/python-mega-algo/data_structures/linked_list/is_palindrome.py @@ -0,0 +1,77 @@ +def is_palindrome(head): + if not head: + return True + # split the list to two parts + fast, slow = head.next, head + while fast and fast.next: + fast = fast.next.next + slow = slow.next + second = slow.next + slow.next = None # Don't forget here! But forget still works! + # reverse the second part + node = None + while second: + nxt = second.next + second.next = node + node = second + second = nxt + # compare two parts + # second part has the same or one less node + while node: + if node.val != head.val: + return False + node = node.next + head = head.next + return True + + +def is_palindrome_stack(head): + if not head or not head.next: + return True + + # 1. Get the midpoint (slow) + slow = fast = cur = head + while fast and fast.next: + fast, slow = fast.next.next, slow.next + + # 2. Push the second half into the stack + stack = [slow.val] + while slow.next: + slow = slow.next + stack.append(slow.val) + + # 3. Comparison + while stack: + if stack.pop() != cur.val: + return False + cur = cur.next + + return True + + +def is_palindrome_dict(head): + if not head or not head.next: + return True + d = {} + pos = 0 + while head: + if head.val in d.keys(): + d[head.val].append(pos) + else: + d[head.val] = [pos] + head = head.next + pos += 1 + checksum = pos - 1 + middle = 0 + for v in d.values(): + if len(v) % 2 != 0: + middle += 1 + else: + step = 0 + for i in range(0, len(v)): + if v[i] + v[len(v) - 1 - step] != checksum: + return False + step += 1 + if middle > 1: + return False + return True diff --git a/python-mega-algo/data_structures/linked_list/merge_two_lists.py b/python-mega-algo/data_structures/linked_list/merge_two_lists.py new file mode 100644 index 00000000..96ec6b8a --- /dev/null +++ b/python-mega-algo/data_structures/linked_list/merge_two_lists.py @@ -0,0 +1,83 @@ +""" +Algorithm that merges two sorted linked lists into one sorted linked list. +""" +from __future__ import annotations + +from collections.abc import Iterable, Iterator +from dataclasses import dataclass +from typing import Optional + +test_data_odd = (3, 9, -11, 0, 7, 5, 1, -1) +test_data_even = (4, 6, 2, 0, 8, 10, 3, -2) + + +@dataclass +class Node: + data: int + next: Optional[Node] + + +class SortedLinkedList: + def __init__(self, ints: Iterable[int]) -> None: + self.head: Optional[Node] = None + for i in reversed(sorted(ints)): + self.head = Node(i, self.head) + + def __iter__(self) -> Iterator[int]: + """ + >>> tuple(SortedLinkedList(test_data_odd)) == tuple(sorted(test_data_odd)) + True + >>> tuple(SortedLinkedList(test_data_even)) == tuple(sorted(test_data_even)) + True + """ + node = self.head + while node: + yield node.data + node = node.next + + def __len__(self) -> int: + """ + >>> for i in range(3): + ... len(SortedLinkedList(range(i))) == i + True + True + True + >>> len(SortedLinkedList(test_data_odd)) + 8 + """ + return len(tuple(iter(self))) + + def __str__(self) -> str: + """ + >>> str(SortedLinkedList([])) + '' + >>> str(SortedLinkedList(test_data_odd)) + '-11 -> -1 -> 0 -> 1 -> 3 -> 5 -> 7 -> 9' + >>> str(SortedLinkedList(test_data_even)) + '-2 -> 0 -> 2 -> 3 -> 4 -> 6 -> 8 -> 10' + """ + return " -> ".join([str(node) for node in self]) + + +def merge_lists( + sll_one: SortedLinkedList, sll_two: SortedLinkedList +) -> SortedLinkedList: + """ + >>> SSL = SortedLinkedList + >>> merged = merge_lists(SSL(test_data_odd), SSL(test_data_even)) + >>> len(merged) + 16 + >>> str(merged) + '-11 -> -2 -> -1 -> 0 -> 0 -> 1 -> 2 -> 3 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8 -> 9 -> 10' + >>> list(merged) == list(sorted(test_data_odd + test_data_even)) + True + """ + return SortedLinkedList(list(sll_one) + list(sll_two)) + + +if __name__ == "__main__": + import doctest + + doctest.testmod() + SSL = SortedLinkedList + print(merge_lists(SSL(test_data_odd), SSL(test_data_even))) diff --git a/python-mega-algo/data_structures/linked_list/middle_element_of_linked_list.py b/python-mega-algo/data_structures/linked_list/middle_element_of_linked_list.py new file mode 100644 index 00000000..185c4ccb --- /dev/null +++ b/python-mega-algo/data_structures/linked_list/middle_element_of_linked_list.py @@ -0,0 +1,64 @@ +class Node: + def __init__(self, data: int) -> int: + self.data = data + self.next = None + + +class LinkedList: + def __init__(self): + self.head = None + + def push(self, new_data: int) -> int: + new_node = Node(new_data) + new_node.next = self.head + self.head = new_node + return self.head.data + + def middle_element(self) -> int: + """ + >>> link = LinkedList() + >>> link.middle_element() + No element found. + >>> link.push(5) + 5 + >>> link.push(6) + 6 + >>> link.push(8) + 8 + >>> link.push(8) + 8 + >>> link.push(10) + 10 + >>> link.push(12) + 12 + >>> link.push(17) + 17 + >>> link.push(7) + 7 + >>> link.push(3) + 3 + >>> link.push(20) + 20 + >>> link.push(-20) + -20 + >>> link.middle_element() + 12 + >>> + """ + slow_pointer = self.head + fast_pointer = self.head + if self.head: + while fast_pointer and fast_pointer.next: + fast_pointer = fast_pointer.next.next + slow_pointer = slow_pointer.next + return slow_pointer.data + else: + print("No element found.") + + +if __name__ == "__main__": + link = LinkedList() + for i in range(int(input().strip())): + data = int(input().strip()) + link.push(data) + print(link.middle_element()) diff --git a/python-mega-algo/data_structures/linked_list/print_reverse.py b/python-mega-algo/data_structures/linked_list/print_reverse.py new file mode 100644 index 00000000..c46f228e --- /dev/null +++ b/python-mega-algo/data_structures/linked_list/print_reverse.py @@ -0,0 +1,70 @@ +from typing import List + + +class Node: + def __init__(self, data=None): + self.data = data + self.next = None + + def __repr__(self): + """Returns a visual representation of the node and all its following nodes.""" + string_rep = [] + temp = self + while temp: + string_rep.append(f"{temp.data}") + temp = temp.next + return "->".join(string_rep) + + +def make_linked_list(elements_list: List): + """Creates a Linked List from the elements of the given sequence + (list/tuple) and returns the head of the Linked List. + >>> make_linked_list([]) + Traceback (most recent call last): + ... + Exception: The Elements List is empty + >>> make_linked_list([7]) + 7 + >>> make_linked_list(['abc']) + abc + >>> make_linked_list([7, 25]) + 7->25 + """ + if not elements_list: + raise Exception("The Elements List is empty") + + current = head = Node(elements_list[0]) + for i in range(1, len(elements_list)): + current.next = Node(elements_list[i]) + current = current.next + return head + + +def print_reverse(head_node: Node) -> None: + """Prints the elements of the given Linked List in reverse order + >>> print_reverse([]) + >>> linked_list = make_linked_list([69, 88, 73]) + >>> print_reverse(linked_list) + 73 + 88 + 69 + """ + if head_node is not None and isinstance(head_node, Node): + print_reverse(head_node.next) + print(head_node.data) + + +def main(): + from doctest import testmod + + testmod() + + linked_list = make_linked_list([14, 52, 14, 12, 43]) + print("Linked List:") + print(linked_list) + print("Elements in Reverse:") + print_reverse(linked_list) + + +if __name__ == "__main__": + main() diff --git a/python-mega-algo/data_structures/linked_list/right.html b/python-mega-algo/data_structures/linked_list/right.html new file mode 100644 index 00000000..14b80d82 --- /dev/null +++ b/python-mega-algo/data_structures/linked_list/right.html @@ -0,0 +1,32 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/data_structures/linked_list + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + + + + +
    FileFileFileFile
    circular_...ist.py from_sequence.py middle_el...ist.py skip_list.py 
    deque_doubly.py has_loop.py print_reverse.py swap_nodes.py 
    doubly_li...ist.py is_palindrome.py singly_li...ist.py __init__.py 
    doubly_li...two.py merge_two_lists.py 
    + +

    +Folders: 1
    +Files: 14
    +Size of all files: 54699 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/data_structures/linked_list/singly_linked_list.py b/python-mega-algo/data_structures/linked_list/singly_linked_list.py new file mode 100644 index 00000000..e45a210a --- /dev/null +++ b/python-mega-algo/data_structures/linked_list/singly_linked_list.py @@ -0,0 +1,240 @@ +class Node: + def __init__(self, data): + self.data = data + self.next = None + + def __repr__(self): + return f"Node({self.data})" + + +class LinkedList: + def __init__(self): + self.head = None + + def __iter__(self): + node = self.head + while node: + yield node.data + node = node.next + + def __len__(self) -> int: + """ + Return length of linked list i.e. number of nodes + >>> linked_list = LinkedList() + >>> len(linked_list) + 0 + >>> linked_list.insert_tail("head") + >>> len(linked_list) + 1 + >>> linked_list.insert_head("head") + >>> len(linked_list) + 2 + >>> _ = linked_list.delete_tail() + >>> len(linked_list) + 1 + >>> _ = linked_list.delete_head() + >>> len(linked_list) + 0 + """ + return len(tuple(iter(self))) + + def __repr__(self): + """ + String representation/visualization of a Linked Lists + """ + return "->".join([str(item) for item in self]) + + def __getitem__(self, index): + """ + Indexing Support. Used to get a node at particular position + >>> linked_list = LinkedList() + >>> for i in range(0, 10): + ... linked_list.insert_nth(i, i) + >>> all(str(linked_list[i]) == str(i) for i in range(0, 10)) + True + >>> linked_list[-10] + Traceback (most recent call last): + ... + ValueError: list index out of range. + >>> linked_list[len(linked_list)] + Traceback (most recent call last): + ... + ValueError: list index out of range. + """ + if not 0 <= index < len(self): + raise ValueError("list index out of range.") + for i, node in enumerate(self): + if i == index: + return node + + # Used to change the data of a particular node + def __setitem__(self, index, data): + """ + >>> linked_list = LinkedList() + >>> for i in range(0, 10): + ... linked_list.insert_nth(i, i) + >>> linked_list[0] = 666 + >>> linked_list[0] + 666 + >>> linked_list[5] = -666 + >>> linked_list[5] + -666 + >>> linked_list[-10] = 666 + Traceback (most recent call last): + ... + ValueError: list index out of range. + >>> linked_list[len(linked_list)] = 666 + Traceback (most recent call last): + ... + ValueError: list index out of range. + """ + if not 0 <= index < len(self): + raise ValueError("list index out of range.") + current = self.head + for i in range(index): + current = current.next + current.data = data + + def insert_tail(self, data) -> None: + self.insert_nth(len(self), data) + + def insert_head(self, data) -> None: + self.insert_nth(0, data) + + def insert_nth(self, index: int, data) -> None: + if not 0 <= index <= len(self): + raise IndexError("list index out of range") + new_node = Node(data) + if self.head is None: + self.head = new_node + elif index == 0: + new_node.next = self.head # link new_node to head + self.head = new_node + else: + temp = self.head + for _ in range(index - 1): + temp = temp.next + new_node.next = temp.next + temp.next = new_node + + def print_list(self) -> None: # print every node data + print(self) + + def delete_head(self): + return self.delete_nth(0) + + def delete_tail(self): # delete from tail + return self.delete_nth(len(self) - 1) + + def delete_nth(self, index: int = 0): + if not 0 <= index <= len(self) - 1: # test if index is valid + raise IndexError("list index out of range") + delete_node = self.head # default first node + if index == 0: + self.head = self.head.next + else: + temp = self.head + for _ in range(index - 1): + temp = temp.next + delete_node = temp.next + temp.next = temp.next.next + return delete_node.data + + def is_empty(self) -> bool: + return self.head is None + + def reverse(self): + prev = None + current = self.head + + while current: + # Store the current node's next node. + next_node = current.next + # Make the current node's next point backwards + current.next = prev + # Make the previous node be the current node + prev = current + # Make the current node the next node (to progress iteration) + current = next_node + # Return prev in order to put the head at the end + self.head = prev + + +def test_singly_linked_list() -> None: + """ + >>> test_singly_linked_list() + """ + linked_list = LinkedList() + assert linked_list.is_empty() is True + assert str(linked_list) == "" + + try: + linked_list.delete_head() + assert False # This should not happen. + except IndexError: + assert True # This should happen. + + try: + linked_list.delete_tail() + assert False # This should not happen. + except IndexError: + assert True # This should happen. + + for i in range(10): + assert len(linked_list) == i + linked_list.insert_nth(i, i + 1) + assert str(linked_list) == "->".join(str(i) for i in range(1, 11)) + + linked_list.insert_head(0) + linked_list.insert_tail(11) + assert str(linked_list) == "->".join(str(i) for i in range(0, 12)) + + assert linked_list.delete_head() == 0 + assert linked_list.delete_nth(9) == 10 + assert linked_list.delete_tail() == 11 + assert len(linked_list) == 9 + assert str(linked_list) == "->".join(str(i) for i in range(1, 10)) + + assert all(linked_list[i] == i + 1 for i in range(0, 9)) is True + + for i in range(0, 9): + linked_list[i] = -i + assert all(linked_list[i] == -i for i in range(0, 9)) is True + + +def main(): + from doctest import testmod + + testmod() + + linked_list = LinkedList() + linked_list.insert_head(input("Inserting 1st at head ").strip()) + linked_list.insert_head(input("Inserting 2nd at head ").strip()) + print("\nPrint list:") + linked_list.print_list() + linked_list.insert_tail(input("\nInserting 1st at tail ").strip()) + linked_list.insert_tail(input("Inserting 2nd at tail ").strip()) + print("\nPrint list:") + linked_list.print_list() + print("\nDelete head") + linked_list.delete_head() + print("Delete tail") + linked_list.delete_tail() + print("\nPrint list:") + linked_list.print_list() + print("\nReverse linked list") + linked_list.reverse() + print("\nPrint list:") + linked_list.print_list() + print("\nString representation of linked list:") + print(linked_list) + print("\nReading/changing Node data using indexing:") + print(f"Element at Position 1: {linked_list[1]}") + linked_list[1] = input("Enter New Value: ").strip() + print("New list:") + print(linked_list) + print(f"length of linked_list is : {len(linked_list)}") + + +if __name__ == "__main__": + main() diff --git a/python-mega-algo/data_structures/linked_list/skip_list.py b/python-mega-algo/data_structures/linked_list/skip_list.py new file mode 100644 index 00000000..8f06e619 --- /dev/null +++ b/python-mega-algo/data_structures/linked_list/skip_list.py @@ -0,0 +1,447 @@ +""" +Based on "Skip Lists: A Probabilistic Alternative to Balanced Trees" by William Pugh +https://epaperpress.com/sortsearch/download/skiplist.pdf +""" + +from __future__ import annotations + +from random import random +from typing import Generic, Optional, TypeVar + +KT = TypeVar("KT") +VT = TypeVar("VT") + + +class Node(Generic[KT, VT]): + def __init__(self, key: KT, value: VT): + self.key = key + self.value = value + self.forward: list[Node[KT, VT]] = [] + + def __repr__(self) -> str: + """ + :return: Visual representation of Node + + >>> node = Node("Key", 2) + >>> repr(node) + 'Node(Key: 2)' + """ + + return f"Node({self.key}: {self.value})" + + @property + def level(self) -> int: + """ + :return: Number of forward references + + >>> node = Node("Key", 2) + >>> node.level + 0 + >>> node.forward.append(Node("Key2", 4)) + >>> node.level + 1 + >>> node.forward.append(Node("Key3", 6)) + >>> node.level + 2 + """ + + return len(self.forward) + + +class SkipList(Generic[KT, VT]): + def __init__(self, p: float = 0.5, max_level: int = 16): + self.head = Node("root", None) + self.level = 0 + self.p = p + self.max_level = max_level + + def __str__(self) -> str: + """ + :return: Visual representation of SkipList + + >>> skip_list = SkipList() + >>> print(skip_list) + SkipList(level=0) + >>> skip_list.insert("Key1", "Value") + >>> print(skip_list) # doctest: +ELLIPSIS + SkipList(level=... + [root]--... + [Key1]--Key1... + None *... + >>> skip_list.insert("Key2", "OtherValue") + >>> print(skip_list) # doctest: +ELLIPSIS + SkipList(level=... + [root]--... + [Key1]--Key1... + [Key2]--Key2... + None *... + """ + + items = list(self) + + if len(items) == 0: + return f"SkipList(level={self.level})" + + label_size = max((len(str(item)) for item in items), default=4) + label_size = max(label_size, 4) + 4 + + node = self.head + lines = [] + + forwards = node.forward.copy() + lines.append(f"[{node.key}]".ljust(label_size, "-") + "* " * len(forwards)) + lines.append(" " * label_size + "| " * len(forwards)) + + while len(node.forward) != 0: + node = node.forward[0] + + lines.append( + f"[{node.key}]".ljust(label_size, "-") + + " ".join(str(n.key) if n.key == node.key else "|" for n in forwards) + ) + lines.append(" " * label_size + "| " * len(forwards)) + forwards[: node.level] = node.forward + + lines.append("None".ljust(label_size) + "* " * len(forwards)) + return f"SkipList(level={self.level})\n" + "\n".join(lines) + + def __iter__(self): + node = self.head + + while len(node.forward) != 0: + yield node.forward[0].key + node = node.forward[0] + + def random_level(self) -> int: + """ + :return: Random level from [1, self.max_level] interval. + Higher values are less likely. + """ + + level = 1 + while random() < self.p and level < self.max_level: + level += 1 + + return level + + def _locate_node(self, key) -> tuple[Optional[Node[KT, VT]], list[Node[KT, VT]]]: + """ + :param key: Searched key, + :return: Tuple with searched node (or None if given key is not present) + and list of nodes that refer (if key is present) of should refer to + given node. + """ + + # Nodes with refer or should refer to output node + update_vector = [] + + node = self.head + + for i in reversed(range(self.level)): + # i < node.level - When node level is lesser than `i` decrement `i`. + # node.forward[i].key < key - Jumping to node with key value higher + # or equal to searched key would result + # in skipping searched key. + while i < node.level and node.forward[i].key < key: + node = node.forward[i] + # Each leftmost node (relative to searched node) will potentially have to + # be updated. + update_vector.append(node) + + update_vector.reverse() # Note that we were inserting values in reverse order. + + # len(node.forward) != 0 - If current node doesn't contain any further + # references then searched key is not present. + # node.forward[0].key == key - Next node key should be equal to search key + # if key is present. + if len(node.forward) != 0 and node.forward[0].key == key: + return node.forward[0], update_vector + else: + return None, update_vector + + def delete(self, key: KT): + """ + :param key: Key to remove from list. + + >>> skip_list = SkipList() + >>> skip_list.insert(2, "Two") + >>> skip_list.insert(1, "One") + >>> skip_list.insert(3, "Three") + >>> list(skip_list) + [1, 2, 3] + >>> skip_list.delete(2) + >>> list(skip_list) + [1, 3] + """ + + node, update_vector = self._locate_node(key) + + if node is not None: + for i, update_node in enumerate(update_vector): + # Remove or replace all references to removed node. + if update_node.level > i and update_node.forward[i].key == key: + if node.level > i: + update_node.forward[i] = node.forward[i] + else: + update_node.forward = update_node.forward[:i] + + def insert(self, key: KT, value: VT): + """ + :param key: Key to insert. + :param value: Value associated with given key. + + >>> skip_list = SkipList() + >>> skip_list.insert(2, "Two") + >>> skip_list.find(2) + 'Two' + >>> list(skip_list) + [2] + """ + + node, update_vector = self._locate_node(key) + if node is not None: + node.value = value + else: + level = self.random_level() + + if level > self.level: + # After level increase we have to add additional nodes to head. + for i in range(self.level - 1, level): + update_vector.append(self.head) + self.level = level + + new_node = Node(key, value) + + for i, update_node in enumerate(update_vector[:level]): + # Change references to pass through new node. + if update_node.level > i: + new_node.forward.append(update_node.forward[i]) + + if update_node.level < i + 1: + update_node.forward.append(new_node) + else: + update_node.forward[i] = new_node + + def find(self, key: VT) -> Optional[VT]: + """ + :param key: Search key. + :return: Value associated with given key or None if given key is not present. + + >>> skip_list = SkipList() + >>> skip_list.find(2) + >>> skip_list.insert(2, "Two") + >>> skip_list.find(2) + 'Two' + >>> skip_list.insert(2, "Three") + >>> skip_list.find(2) + 'Three' + """ + + node, _ = self._locate_node(key) + + if node is not None: + return node.value + + return None + + +def test_insert(): + skip_list = SkipList() + skip_list.insert("Key1", 3) + skip_list.insert("Key2", 12) + skip_list.insert("Key3", 41) + skip_list.insert("Key4", -19) + + node = skip_list.head + all_values = {} + while node.level != 0: + node = node.forward[0] + all_values[node.key] = node.value + + assert len(all_values) == 4 + assert all_values["Key1"] == 3 + assert all_values["Key2"] == 12 + assert all_values["Key3"] == 41 + assert all_values["Key4"] == -19 + + +def test_insert_overrides_existing_value(): + skip_list = SkipList() + skip_list.insert("Key1", 10) + skip_list.insert("Key1", 12) + + skip_list.insert("Key5", 7) + skip_list.insert("Key7", 10) + skip_list.insert("Key10", 5) + + skip_list.insert("Key7", 7) + skip_list.insert("Key5", 5) + skip_list.insert("Key10", 10) + + node = skip_list.head + all_values = {} + while node.level != 0: + node = node.forward[0] + all_values[node.key] = node.value + + if len(all_values) != 4: + print() + assert len(all_values) == 4 + assert all_values["Key1"] == 12 + assert all_values["Key7"] == 7 + assert all_values["Key5"] == 5 + assert all_values["Key10"] == 10 + + +def test_searching_empty_list_returns_none(): + skip_list = SkipList() + assert skip_list.find("Some key") is None + + +def test_search(): + skip_list = SkipList() + + skip_list.insert("Key2", 20) + assert skip_list.find("Key2") == 20 + + skip_list.insert("Some Key", 10) + skip_list.insert("Key2", 8) + skip_list.insert("V", 13) + + assert skip_list.find("Y") is None + assert skip_list.find("Key2") == 8 + assert skip_list.find("Some Key") == 10 + assert skip_list.find("V") == 13 + + +def test_deleting_item_from_empty_list_do_nothing(): + skip_list = SkipList() + skip_list.delete("Some key") + + assert len(skip_list.head.forward) == 0 + + +def test_deleted_items_are_not_founded_by_find_method(): + skip_list = SkipList() + + skip_list.insert("Key1", 12) + skip_list.insert("V", 13) + skip_list.insert("X", 14) + skip_list.insert("Key2", 15) + + skip_list.delete("V") + skip_list.delete("Key2") + + assert skip_list.find("V") is None + assert skip_list.find("Key2") is None + + +def test_delete_removes_only_given_key(): + skip_list = SkipList() + + skip_list.insert("Key1", 12) + skip_list.insert("V", 13) + skip_list.insert("X", 14) + skip_list.insert("Key2", 15) + + skip_list.delete("V") + assert skip_list.find("V") is None + assert skip_list.find("X") == 14 + assert skip_list.find("Key1") == 12 + assert skip_list.find("Key2") == 15 + + skip_list.delete("X") + assert skip_list.find("V") is None + assert skip_list.find("X") is None + assert skip_list.find("Key1") == 12 + assert skip_list.find("Key2") == 15 + + skip_list.delete("Key1") + assert skip_list.find("V") is None + assert skip_list.find("X") is None + assert skip_list.find("Key1") is None + assert skip_list.find("Key2") == 15 + + skip_list.delete("Key2") + assert skip_list.find("V") is None + assert skip_list.find("X") is None + assert skip_list.find("Key1") is None + assert skip_list.find("Key2") is None + + +def test_delete_doesnt_leave_dead_nodes(): + skip_list = SkipList() + + skip_list.insert("Key1", 12) + skip_list.insert("V", 13) + skip_list.insert("X", 142) + skip_list.insert("Key2", 15) + + skip_list.delete("X") + + def traverse_keys(node): + yield node.key + for forward_node in node.forward: + yield from traverse_keys(forward_node) + + assert len(set(traverse_keys(skip_list.head))) == 4 + + +def test_iter_always_yields_sorted_values(): + def is_sorted(lst): + for item, next_item in zip(lst, lst[1:]): + if next_item < item: + return False + return True + + skip_list = SkipList() + for i in range(10): + skip_list.insert(i, i) + assert is_sorted(list(skip_list)) + skip_list.delete(5) + skip_list.delete(8) + skip_list.delete(2) + assert is_sorted(list(skip_list)) + skip_list.insert(-12, -12) + skip_list.insert(77, 77) + assert is_sorted(list(skip_list)) + + +def pytests(): + for i in range(100): + # Repeat test 100 times due to the probabilistic nature of skip list + # random values == random bugs + test_insert() + test_insert_overrides_existing_value() + + test_searching_empty_list_returns_none() + test_search() + + test_deleting_item_from_empty_list_do_nothing() + test_deleted_items_are_not_founded_by_find_method() + test_delete_removes_only_given_key() + test_delete_doesnt_leave_dead_nodes() + + test_iter_always_yields_sorted_values() + + +def main(): + """ + >>> pytests() + """ + + skip_list = SkipList() + skip_list.insert(2, "2") + skip_list.insert(4, "4") + skip_list.insert(6, "4") + skip_list.insert(4, "5") + skip_list.insert(8, "4") + skip_list.insert(9, "4") + + skip_list.delete(4) + + print(skip_list) + + +if __name__ == "__main__": + main() diff --git a/python-mega-algo/data_structures/linked_list/swap_nodes.py b/python-mega-algo/data_structures/linked_list/swap_nodes.py new file mode 100644 index 00000000..11c0cd5a --- /dev/null +++ b/python-mega-algo/data_structures/linked_list/swap_nodes.py @@ -0,0 +1,55 @@ +from typing import Any + + +class Node: + def __init__(self, data: Any): + self.data = data + self.next = None + + +class LinkedList: + def __init__(self): + self.head = None + + def print_list(self): + temp = self.head + while temp is not None: + print(temp.data, end=" ") + temp = temp.next + print() + + # adding nodes + def push(self, new_data: Any): + new_node = Node(new_data) + new_node.next = self.head + self.head = new_node + + # swapping nodes + def swap_nodes(self, node_data_1, node_data_2): + if node_data_1 == node_data_2: + return + else: + node_1 = self.head + while node_1 is not None and node_1.data != node_data_1: + node_1 = node_1.next + + node_2 = self.head + while node_2 is not None and node_2.data != node_data_2: + node_2 = node_2.next + + if node_1 is None or node_2 is None: + return + + node_1.data, node_2.data = node_2.data, node_1.data + + +if __name__ == "__main__": + ll = LinkedList() + for i in range(5, 0, -1): + ll.push(i) + + ll.print_list() + + ll.swap_nodes(1, 4) + print("After swapping") + ll.print_list() diff --git a/python-mega-algo/data_structures/queue/__init__.py b/python-mega-algo/data_structures/queue/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/data_structures/queue/circular_queue.py b/python-mega-algo/data_structures/queue/circular_queue.py new file mode 100644 index 00000000..93a6ef80 --- /dev/null +++ b/python-mega-algo/data_structures/queue/circular_queue.py @@ -0,0 +1,94 @@ +# Implementation of Circular Queue (using Python lists) + + +class CircularQueue: + """Circular FIFO queue with a fixed capacity""" + + def __init__(self, n: int): + self.n = n + self.array = [None] * self.n + self.front = 0 # index of the first element + self.rear = 0 + self.size = 0 + + def __len__(self) -> int: + """ + >>> cq = CircularQueue(5) + >>> len(cq) + 0 + >>> cq.enqueue("A") # doctest: +ELLIPSIS + >> len(cq) + 1 + """ + return self.size + + def is_empty(self) -> bool: + """ + >>> cq = CircularQueue(5) + >>> cq.is_empty() + True + >>> cq.enqueue("A").is_empty() + False + """ + return self.size == 0 + + def first(self): + """ + >>> cq = CircularQueue(5) + >>> cq.first() + False + >>> cq.enqueue("A").first() + 'A' + """ + return False if self.is_empty() else self.array[self.front] + + def enqueue(self, data): + """ + This function insert an element in the queue using self.rear value as an index + >>> cq = CircularQueue(5) + >>> cq.enqueue("A") # doctest: +ELLIPSIS + >> (cq.size, cq.first()) + (1, 'A') + >>> cq.enqueue("B") # doctest: +ELLIPSIS + >> (cq.size, cq.first()) + (2, 'A') + """ + if self.size >= self.n: + raise Exception("QUEUE IS FULL") + + self.array[self.rear] = data + self.rear = (self.rear + 1) % self.n + self.size += 1 + return self + + def dequeue(self): + """ + This function removes an element from the queue using on self.front value as an + index + >>> cq = CircularQueue(5) + >>> cq.dequeue() + Traceback (most recent call last): + ... + Exception: UNDERFLOW + >>> cq.enqueue("A").enqueue("B").dequeue() + 'A' + >>> (cq.size, cq.first()) + (1, 'B') + >>> cq.dequeue() + 'B' + >>> cq.dequeue() + Traceback (most recent call last): + ... + Exception: UNDERFLOW + """ + if self.size == 0: + raise Exception("UNDERFLOW") + + temp = self.array[self.front] + self.array[self.front] = None + self.front = (self.front + 1) % self.n + self.size -= 1 + return temp diff --git a/python-mega-algo/data_structures/queue/double_ended_queue.py b/python-mega-algo/data_structures/queue/double_ended_queue.py new file mode 100644 index 00000000..dd003b7c --- /dev/null +++ b/python-mega-algo/data_structures/queue/double_ended_queue.py @@ -0,0 +1,57 @@ +# Python code to demonstrate working of +# extend(), extendleft(), rotate(), reverse() + +# importing "collections" for deque operations +import collections + +# initializing deque +de = collections.deque([1, 2, 3]) + +# using extend() to add numbers to right end +# adds 4,5,6 to right end +de.extend([4, 5, 6]) + +# printing modified deque +print("The deque after extending deque at end is : ") +print(de) + +# using extendleft() to add numbers to left end +# adds 7,8,9 to right end +de.extendleft([7, 8, 9]) + +# printing modified deque +print("The deque after extending deque at beginning is : ") +print(de) + +# using rotate() to rotate the deque +# rotates by 3 to left +de.rotate(-3) + +# printing modified deque +print("The deque after rotating deque is : ") +print(de) + +# using reverse() to reverse the deque +de.reverse() + +# printing modified deque +print("The deque after reversing deque is : ") +print(de) + +# get right-end value and eliminate +startValue = de.pop() + +print("The deque after popping value at end is : ") +print(de) + +# get left-end value and eliminate +endValue = de.popleft() + +print("The deque after popping value at start is : ") +print(de) + +# eliminate element searched by value +de.remove(5) + +print("The deque after eliminating element searched by value : ") +print(de) diff --git a/python-mega-algo/data_structures/queue/linked_queue.py b/python-mega-algo/data_structures/queue/linked_queue.py new file mode 100644 index 00000000..8526ad31 --- /dev/null +++ b/python-mega-algo/data_structures/queue/linked_queue.py @@ -0,0 +1,151 @@ +""" A Queue using a linked list like structure """ +from typing import Any + + +class Node: + def __init__(self, data: Any) -> None: + self.data = data + self.next = None + + def __str__(self) -> str: + return f"{self.data}" + + +class LinkedQueue: + """ + >>> queue = LinkedQueue() + >>> queue.is_empty() + True + >>> queue.put(5) + >>> queue.put(9) + >>> queue.put('python') + >>> queue.is_empty(); + False + >>> queue.get() + 5 + >>> queue.put('algorithms') + >>> queue.get() + 9 + >>> queue.get() + 'python' + >>> queue.get() + 'algorithms' + >>> queue.is_empty() + True + >>> queue.get() + Traceback (most recent call last): + ... + IndexError: dequeue from empty queue + """ + + def __init__(self) -> None: + self.front = self.rear = None + + def __iter__(self): + node = self.front + while node: + yield node.data + node = node.next + + def __len__(self) -> int: + """ + >>> queue = LinkedQueue() + >>> for i in range(1, 6): + ... queue.put(i) + >>> len(queue) + 5 + >>> for i in range(1, 6): + ... assert len(queue) == 6 - i + ... _ = queue.get() + >>> len(queue) + 0 + """ + return len(tuple(iter(self))) + + def __str__(self) -> str: + """ + >>> queue = LinkedQueue() + >>> for i in range(1, 4): + ... queue.put(i) + >>> queue.put("Python") + >>> queue.put(3.14) + >>> queue.put(True) + >>> str(queue) + '1 <- 2 <- 3 <- Python <- 3.14 <- True' + """ + return " <- ".join(str(item) for item in self) + + def is_empty(self) -> bool: + """ + >>> queue = LinkedQueue() + >>> queue.is_empty() + True + >>> for i in range(1, 6): + ... queue.put(i) + >>> queue.is_empty() + False + """ + return len(self) == 0 + + def put(self, item) -> None: + """ + >>> queue = LinkedQueue() + >>> queue.get() + Traceback (most recent call last): + ... + IndexError: dequeue from empty queue + >>> for i in range(1, 6): + ... queue.put(i) + >>> str(queue) + '1 <- 2 <- 3 <- 4 <- 5' + """ + node = Node(item) + if self.is_empty(): + self.front = self.rear = node + else: + assert isinstance(self.rear, Node) + self.rear.next = node + self.rear = node + + def get(self) -> Any: + """ + >>> queue = LinkedQueue() + >>> queue.get() + Traceback (most recent call last): + ... + IndexError: dequeue from empty queue + >>> queue = LinkedQueue() + >>> for i in range(1, 6): + ... queue.put(i) + >>> for i in range(1, 6): + ... assert queue.get() == i + >>> len(queue) + 0 + """ + if self.is_empty(): + raise IndexError("dequeue from empty queue") + assert isinstance(self.front, Node) + node = self.front + self.front = self.front.next + if self.front is None: + self.rear = None + return node.data + + def clear(self) -> None: + """ + >>> queue = LinkedQueue() + >>> for i in range(1, 6): + ... queue.put(i) + >>> queue.clear() + >>> len(queue) + 0 + >>> str(queue) + '' + """ + self.front = self.rear = None + + +if __name__ == "__main__": + from doctest import testmod + + testmod() diff --git a/python-mega-algo/data_structures/queue/priority_queue_using_list.py b/python-mega-algo/data_structures/queue/priority_queue_using_list.py new file mode 100644 index 00000000..c5cf2643 --- /dev/null +++ b/python-mega-algo/data_structures/queue/priority_queue_using_list.py @@ -0,0 +1,232 @@ +""" +Pure Python implementations of a Fixed Priority Queue and an Element Priority Queue +using Python lists. +""" + + +class OverFlowError(Exception): + pass + + +class UnderFlowError(Exception): + pass + + +class FixedPriorityQueue: + """ + Tasks can be added to a Priority Queue at any time and in any order but when Tasks + are removed then the Task with the highest priority is removed in FIFO order. In + code we will use three levels of priority with priority zero Tasks being the most + urgent (high priority) and priority 2 tasks being the least urgent. + + Examples + >>> fpq = FixedPriorityQueue() + >>> fpq.enqueue(0, 10) + >>> fpq.enqueue(1, 70) + >>> fpq.enqueue(0, 100) + >>> fpq.enqueue(2, 1) + >>> fpq.enqueue(2, 5) + >>> fpq.enqueue(1, 7) + >>> fpq.enqueue(2, 4) + >>> fpq.enqueue(1, 64) + >>> fpq.enqueue(0, 128) + >>> print(fpq) + Priority 0: [10, 100, 128] + Priority 1: [70, 7, 64] + Priority 2: [1, 5, 4] + >>> fpq.dequeue() + 10 + >>> fpq.dequeue() + 100 + >>> fpq.dequeue() + 128 + >>> fpq.dequeue() + 70 + >>> fpq.dequeue() + 7 + >>> print(fpq) + Priority 0: [] + Priority 1: [64] + Priority 2: [1, 5, 4] + >>> fpq.dequeue() + 64 + >>> fpq.dequeue() + 1 + >>> fpq.dequeue() + 5 + >>> fpq.dequeue() + 4 + >>> fpq.dequeue() + Traceback (most recent call last): + ... + data_structures.queue.priority_queue_using_list.UnderFlowError: All queues are empty + >>> print(fpq) + Priority 0: [] + Priority 1: [] + Priority 2: [] + """ + + def __init__(self): + self.queues = [ + [], + [], + [], + ] + + def enqueue(self, priority: int, data: int) -> None: + """ + Add an element to a queue based on its priority. + If the priority is invalid ValueError is raised. + If the queue is full an OverFlowError is raised. + """ + try: + if len(self.queues[priority]) >= 100: + raise OverflowError("Maximum queue size is 100") + self.queues[priority].append(data) + except IndexError: + raise ValueError("Valid priorities are 0, 1, and 2") + + def dequeue(self) -> int: + """ + Return the highest priority element in FIFO order. + If the queue is empty then an under flow exception is raised. + """ + for queue in self.queues: + if queue: + return queue.pop(0) + raise UnderFlowError("All queues are empty") + + def __str__(self) -> str: + return "\n".join(f"Priority {i}: {q}" for i, q in enumerate(self.queues)) + + +class ElementPriorityQueue: + """ + Element Priority Queue is the same as Fixed Priority Queue except that the value of + the element itself is the priority. The rules for priorities are the same the as + Fixed Priority Queue. + + >>> epq = ElementPriorityQueue() + >>> epq.enqueue(10) + >>> epq.enqueue(70) + >>> epq.enqueue(4) + >>> epq.enqueue(1) + >>> epq.enqueue(5) + >>> epq.enqueue(7) + >>> epq.enqueue(4) + >>> epq.enqueue(64) + >>> epq.enqueue(128) + >>> print(epq) + [10, 70, 4, 1, 5, 7, 4, 64, 128] + >>> epq.dequeue() + 1 + >>> epq.dequeue() + 4 + >>> epq.dequeue() + 4 + >>> epq.dequeue() + 5 + >>> epq.dequeue() + 7 + >>> epq.dequeue() + 10 + >>> print(epq) + [70, 64, 128] + >>> epq.dequeue() + 64 + >>> epq.dequeue() + 70 + >>> epq.dequeue() + 128 + >>> epq.dequeue() + Traceback (most recent call last): + ... + data_structures.queue.priority_queue_using_list.UnderFlowError: The queue is empty + >>> print(epq) + [] + """ + + def __init__(self): + self.queue = [] + + def enqueue(self, data: int) -> None: + """ + This function enters the element into the queue + If the queue is full an Exception is raised saying Over Flow! + """ + if len(self.queue) == 100: + raise OverFlowError("Maximum queue size is 100") + self.queue.append(data) + + def dequeue(self) -> int: + """ + Return the highest priority element in FIFO order. + If the queue is empty then an under flow exception is raised. + """ + if not self.queue: + raise UnderFlowError("The queue is empty") + else: + data = min(self.queue) + self.queue.remove(data) + return data + + def __str__(self) -> str: + """ + Prints all the elements within the Element Priority Queue + """ + return str(self.queue) + + +def fixed_priority_queue(): + fpq = FixedPriorityQueue() + fpq.enqueue(0, 10) + fpq.enqueue(1, 70) + fpq.enqueue(0, 100) + fpq.enqueue(2, 1) + fpq.enqueue(2, 5) + fpq.enqueue(1, 7) + fpq.enqueue(2, 4) + fpq.enqueue(1, 64) + fpq.enqueue(0, 128) + print(fpq) + print(fpq.dequeue()) + print(fpq.dequeue()) + print(fpq.dequeue()) + print(fpq.dequeue()) + print(fpq.dequeue()) + print(fpq) + print(fpq.dequeue()) + print(fpq.dequeue()) + print(fpq.dequeue()) + print(fpq.dequeue()) + print(fpq.dequeue()) + + +def element_priority_queue(): + epq = ElementPriorityQueue() + epq.enqueue(10) + epq.enqueue(70) + epq.enqueue(100) + epq.enqueue(1) + epq.enqueue(5) + epq.enqueue(7) + epq.enqueue(4) + epq.enqueue(64) + epq.enqueue(128) + print(epq) + print(epq.dequeue()) + print(epq.dequeue()) + print(epq.dequeue()) + print(epq.dequeue()) + print(epq.dequeue()) + print(epq) + print(epq.dequeue()) + print(epq.dequeue()) + print(epq.dequeue()) + print(epq.dequeue()) + print(epq.dequeue()) + + +if __name__ == "__main__": + fixed_priority_queue() + element_priority_queue() diff --git a/python-mega-algo/data_structures/queue/queue_on_list.py b/python-mega-algo/data_structures/queue/queue_on_list.py new file mode 100644 index 00000000..7eefaef6 --- /dev/null +++ b/python-mega-algo/data_structures/queue/queue_on_list.py @@ -0,0 +1,52 @@ +"""Queue represented by a Python list""" + + +class Queue: + def __init__(self): + self.entries = [] + self.length = 0 + self.front = 0 + + def __str__(self): + printed = "<" + str(self.entries)[1:-1] + ">" + return printed + + """Enqueues {@code item} + @param item + item to enqueue""" + + def put(self, item): + self.entries.append(item) + self.length = self.length + 1 + + """Dequeues {@code item} + @requirement: |self.length| > 0 + @return dequeued + item that was dequeued""" + + def get(self): + self.length = self.length - 1 + dequeued = self.entries[self.front] + # self.front-=1 + # self.entries = self.entries[self.front:] + self.entries = self.entries[1:] + return dequeued + + """Rotates the queue {@code rotation} times + @param rotation + number of times to rotate queue""" + + def rotate(self, rotation): + for i in range(rotation): + self.put(self.get()) + + """Enqueues {@code item} + @return item at front of self.entries""" + + def get_front(self): + return self.entries[0] + + """Returns the length of this.entries""" + + def size(self): + return self.length diff --git a/python-mega-algo/data_structures/queue/queue_on_pseudo_stack.py b/python-mega-algo/data_structures/queue/queue_on_pseudo_stack.py new file mode 100644 index 00000000..0acf5c8e --- /dev/null +++ b/python-mega-algo/data_structures/queue/queue_on_pseudo_stack.py @@ -0,0 +1,57 @@ +"""Queue represented by a pseudo stack (represented by a list with pop and append)""" + + +class Queue: + def __init__(self): + self.stack = [] + self.length = 0 + + def __str__(self): + printed = "<" + str(self.stack)[1:-1] + ">" + return printed + + """Enqueues {@code item} + @param item + item to enqueue""" + + def put(self, item): + self.stack.append(item) + self.length = self.length + 1 + + """Dequeues {@code item} + @requirement: |self.length| > 0 + @return dequeued + item that was dequeued""" + + def get(self): + self.rotate(1) + dequeued = self.stack[self.length - 1] + self.stack = self.stack[:-1] + self.rotate(self.length - 1) + self.length = self.length - 1 + return dequeued + + """Rotates the queue {@code rotation} times + @param rotation + number of times to rotate queue""" + + def rotate(self, rotation): + for i in range(rotation): + temp = self.stack[0] + self.stack = self.stack[1:] + self.put(temp) + self.length = self.length - 1 + + """Reports item at the front of self + @return item at front of self.stack""" + + def front(self): + front = self.get() + self.put(front) + self.rotate(self.length - 1) + return front + + """Returns the length of this.stack""" + + def size(self): + return self.length diff --git a/python-mega-algo/data_structures/queue/right.html b/python-mega-algo/data_structures/queue/right.html new file mode 100644 index 00000000..40f605c9 --- /dev/null +++ b/python-mega-algo/data_structures/queue/right.html @@ -0,0 +1,30 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/data_structures/queue + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + + +
    FileFileFileFile
    circular_queue.py linked_queue.py queue_on_list.py __init__.py 
    double_en...eue.py priority_...ist.py queue_on_...ack.py 
    + +

    +Folders: 1
    +Files: 7
    +Size of all files: 15842 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/data_structures/right.html b/python-mega-algo/data_structures/right.html new file mode 100644 index 00000000..baca94f1 --- /dev/null +++ b/python-mega-algo/data_structures/right.html @@ -0,0 +1,31 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/data_structures + + + + + + + + + + +
    Folders
    <Go Back> hashing linked_list stacks
    binary_tree heap queue trie
    disjoint_set
    +
    + + + + +
    FileFileFileFile
    __init__.py 
    + +

    +Folders: 9
    +Files: 1
    +Size of all files: 0 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/data_structures/stacks/__init__.py b/python-mega-algo/data_structures/stacks/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/data_structures/stacks/balanced_parentheses.py b/python-mega-algo/data_structures/stacks/balanced_parentheses.py new file mode 100644 index 00000000..674f7ea4 --- /dev/null +++ b/python-mega-algo/data_structures/stacks/balanced_parentheses.py @@ -0,0 +1,37 @@ +from .stack import Stack + + +def balanced_parentheses(parentheses: str) -> bool: + """Use a stack to check if a string of parentheses is balanced. + >>> balanced_parentheses("([]{})") + True + >>> balanced_parentheses("[()]{}{[()()]()}") + True + >>> balanced_parentheses("[(])") + False + >>> balanced_parentheses("1+2*3-4") + True + >>> balanced_parentheses("") + True + """ + stack = Stack() + bracket_pairs = {"(": ")", "[": "]", "{": "}"} + for bracket in parentheses: + if bracket in bracket_pairs: + stack.push(bracket) + elif bracket in (")", "]", "}"): + if stack.is_empty() or bracket_pairs[stack.pop()] != bracket: + return False + return stack.is_empty() + + +if __name__ == "__main__": + from doctest import testmod + + testmod() + + examples = ["((()))", "((())", "(()))"] + print("Balanced parentheses demonstration:\n") + for example in examples: + not_str = "" if balanced_parentheses(example) else "not " + print(f"{example} is {not_str}balanced") diff --git a/python-mega-algo/data_structures/stacks/dijkstras_two_stack_algorithm.py b/python-mega-algo/data_structures/stacks/dijkstras_two_stack_algorithm.py new file mode 100644 index 00000000..8b4668f9 --- /dev/null +++ b/python-mega-algo/data_structures/stacks/dijkstras_two_stack_algorithm.py @@ -0,0 +1,83 @@ +""" +Author: Alexander Joslin +GitHub: github.com/echoaj + +Explanation: https://medium.com/@haleesammar/implemented-in-js-dijkstras-2-stack- + algorithm-for-evaluating-mathematical-expressions-fc0837dae1ea + +We can use Dijkstra's two stack algorithm to solve an equation +such as: (5 + ((4 * 2) * (2 + 3))) + +THESE ARE THE ALGORITHM'S RULES: +RULE 1: Scan the expression from left to right. When an operand is encountered, + push it onto the the operand stack. + +RULE 2: When an operator is encountered in the expression, + push it onto the operator stack. + +RULE 3: When a left parenthesis is encountered in the expression, ignore it. + +RULE 4: When a right parenthesis is encountered in the expression, + pop an operator off the operator stack. The two operands it must + operate on must be the last two operands pushed onto the operand stack. + We therefore pop the operand stack twice, perform the operation, + and push the result back onto the operand stack so it will be available + for use as an operand of the next operator popped off the operator stack. + +RULE 5: When the entire infix expression has been scanned, the value left on + the operand stack represents the value of the expression. + +NOTE: It only works with whole numbers. +""" +__author__ = "Alexander Joslin" + +import operator as op + +from .stack import Stack + + +def dijkstras_two_stack_algorithm(equation: str) -> int: + """ + DocTests + >>> dijkstras_two_stack_algorithm("(5 + 3)") + 8 + >>> dijkstras_two_stack_algorithm("((9 - (2 + 9)) + (8 - 1))") + 5 + >>> dijkstras_two_stack_algorithm("((((3 - 2) - (2 + 3)) + (2 - 4)) + 3)") + -3 + + :param equation: a string + :return: result: an integer + """ + operators = {"*": op.mul, "/": op.truediv, "+": op.add, "-": op.sub} + + operand_stack = Stack() + operator_stack = Stack() + + for i in equation: + if i.isdigit(): + # RULE 1 + operand_stack.push(int(i)) + elif i in operators: + # RULE 2 + operator_stack.push(i) + elif i == ")": + # RULE 4 + opr = operator_stack.peek() + operator_stack.pop() + num1 = operand_stack.peek() + operand_stack.pop() + num2 = operand_stack.peek() + operand_stack.pop() + + total = operators[opr](num2, num1) + operand_stack.push(total) + + # RULE 5 + return operand_stack.peek() + + +if __name__ == "__main__": + equation = "(5 + ((4 * 2) * (2 + 3)))" + # answer = 45 + print(f"{equation} = {dijkstras_two_stack_algorithm(equation)}") diff --git a/python-mega-algo/data_structures/stacks/evaluate_postfix_notations.py b/python-mega-algo/data_structures/stacks/evaluate_postfix_notations.py new file mode 100644 index 00000000..2a4baf9d --- /dev/null +++ b/python-mega-algo/data_structures/stacks/evaluate_postfix_notations.py @@ -0,0 +1,51 @@ +from typing import Any, List + +""" +The Reverse Polish Nation also known as Polish postfix notation +or simply postfix notation. +https://en.wikipedia.org/wiki/Reverse_Polish_notation +Classic examples of simple stack implementations +Valid operators are +, -, *, /. +Each operand may be an integer or another expression. +""" + + +def evaluate_postfix(postfix_notation: list) -> int: + """ + >>> evaluate_postfix(["2", "1", "+", "3", "*"]) + 9 + >>> evaluate_postfix(["4", "13", "5", "/", "+"]) + 6 + >>> evaluate_postfix([]) + 0 + """ + if not postfix_notation: + return 0 + + operations = {"+", "-", "*", "/"} + stack: List[Any] = [] + + for token in postfix_notation: + if token in operations: + b, a = stack.pop(), stack.pop() + if token == "+": + stack.append(a + b) + elif token == "-": + stack.append(a - b) + elif token == "*": + stack.append(a * b) + else: + if a * b < 0 and a % b != 0: + stack.append(a // b + 1) + else: + stack.append(a // b) + else: + stack.append(int(token)) + + return stack.pop() + + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/data_structures/stacks/infix_to_postfix_conversion.py b/python-mega-algo/data_structures/stacks/infix_to_postfix_conversion.py new file mode 100644 index 00000000..dedba847 --- /dev/null +++ b/python-mega-algo/data_structures/stacks/infix_to_postfix_conversion.py @@ -0,0 +1,69 @@ +""" +https://en.wikipedia.org/wiki/Infix_notation +https://en.wikipedia.org/wiki/Reverse_Polish_notation +https://en.wikipedia.org/wiki/Shunting-yard_algorithm +""" + +from .balanced_parentheses import balanced_parentheses +from .stack import Stack + + +def precedence(char: str) -> int: + """ + Return integer value representing an operator's precedence, or + order of operation. + https://en.wikipedia.org/wiki/Order_of_operations + """ + return {"+": 1, "-": 1, "*": 2, "/": 2, "^": 3}.get(char, -1) + + +def infix_to_postfix(expression_str: str) -> str: + """ + >>> infix_to_postfix("(1*(2+3)+4))") + Traceback (most recent call last): + ... + ValueError: Mismatched parentheses + >>> infix_to_postfix("") + '' + >>> infix_to_postfix("3+2") + '3 2 +' + >>> infix_to_postfix("(3+4)*5-6") + '3 4 + 5 * 6 -' + >>> infix_to_postfix("(1+2)*3/4-5") + '1 2 + 3 * 4 / 5 -' + >>> infix_to_postfix("a+b*c+(d*e+f)*g") + 'a b c * + d e * f + g * +' + >>> infix_to_postfix("x^y/(5*z)+2") + 'x y ^ 5 z * / 2 +' + """ + if not balanced_parentheses(expression_str): + raise ValueError("Mismatched parentheses") + stack = Stack() + postfix = [] + for char in expression_str: + if char.isalpha() or char.isdigit(): + postfix.append(char) + elif char == "(": + stack.push(char) + elif char == ")": + while not stack.is_empty() and stack.peek() != "(": + postfix.append(stack.pop()) + stack.pop() + else: + while not stack.is_empty() and precedence(char) <= precedence(stack.peek()): + postfix.append(stack.pop()) + stack.push(char) + while not stack.is_empty(): + postfix.append(stack.pop()) + return " ".join(postfix) + + +if __name__ == "__main__": + from doctest import testmod + + testmod() + expression = "a+b*(c^d-e)^(f+g*h)-i" + + print("Infix to Postfix Notation demonstration:\n") + print("Infix notation: " + expression) + print("Postfix notation: " + infix_to_postfix(expression)) diff --git a/python-mega-algo/data_structures/stacks/infix_to_prefix_conversion.py b/python-mega-algo/data_structures/stacks/infix_to_prefix_conversion.py new file mode 100644 index 00000000..d3dc9e3e --- /dev/null +++ b/python-mega-algo/data_structures/stacks/infix_to_prefix_conversion.py @@ -0,0 +1,93 @@ +""" +Output: + +Enter an Infix Equation = a + b ^c + Symbol | Stack | Postfix +---------------------------- + c | | c + ^ | ^ | c + b | ^ | cb + + | + | cb^ + a | + | cb^a + | | cb^a+ + + a+b^c (Infix) -> +a^bc (Prefix) +""" + + +def infix_2_postfix(Infix): + Stack = [] + Postfix = [] + priority = { + "^": 3, + "*": 2, + "/": 2, + "%": 2, + "+": 1, + "-": 1, + } # Priority of each operator + print_width = len(Infix) if (len(Infix) > 7) else 7 + + # Print table header for output + print( + "Symbol".center(8), + "Stack".center(print_width), + "Postfix".center(print_width), + sep=" | ", + ) + print("-" * (print_width * 3 + 7)) + + for x in Infix: + if x.isalpha() or x.isdigit(): + Postfix.append(x) # if x is Alphabet / Digit, add it to Postfix + elif x == "(": + Stack.append(x) # if x is "(" push to Stack + elif x == ")": # if x is ")" pop stack until "(" is encountered + while Stack[-1] != "(": + Postfix.append(Stack.pop()) # Pop stack & add the content to Postfix + Stack.pop() + else: + if len(Stack) == 0: + Stack.append(x) # If stack is empty, push x to stack + else: # while priority of x is not > priority of element in the stack + while len(Stack) > 0 and priority[x] <= priority[Stack[-1]]: + Postfix.append(Stack.pop()) # pop stack & add to Postfix + Stack.append(x) # push x to stack + + print( + x.center(8), + ("".join(Stack)).ljust(print_width), + ("".join(Postfix)).ljust(print_width), + sep=" | ", + ) # Output in tabular format + + while len(Stack) > 0: # while stack is not empty + Postfix.append(Stack.pop()) # pop stack & add to Postfix + print( + " ".center(8), + ("".join(Stack)).ljust(print_width), + ("".join(Postfix)).ljust(print_width), + sep=" | ", + ) # Output in tabular format + + return "".join(Postfix) # return Postfix as str + + +def infix_2_prefix(Infix): + Infix = list(Infix[::-1]) # reverse the infix equation + + for i in range(len(Infix)): + if Infix[i] == "(": + Infix[i] = ")" # change "(" to ")" + elif Infix[i] == ")": + Infix[i] = "(" # change ")" to "(" + + return (infix_2_postfix("".join(Infix)))[ + ::-1 + ] # call infix_2_postfix on Infix, return reverse of Postfix + + +if __name__ == "__main__": + Infix = input("\nEnter an Infix Equation = ") # Input an Infix equation + Infix = "".join(Infix.split()) # Remove spaces from the input + print("\n\t", Infix, "(Infix) -> ", infix_2_prefix(Infix), "(Prefix)") diff --git a/python-mega-algo/data_structures/stacks/linked_stack.py b/python-mega-algo/data_structures/stacks/linked_stack.py new file mode 100644 index 00000000..310c29f7 --- /dev/null +++ b/python-mega-algo/data_structures/stacks/linked_stack.py @@ -0,0 +1,159 @@ +""" A Stack using a linked list like structure """ +from typing import Any, Optional + + +class Node: + def __init__(self, data): + self.data = data + self.next = None + + def __str__(self): + return f"{self.data}" + + +class LinkedStack: + """ + Linked List Stack implementing push (to top), + pop (from top) and is_empty + + >>> stack = LinkedStack() + >>> stack.is_empty() + True + >>> stack.push(5) + >>> stack.push(9) + >>> stack.push('python') + >>> stack.is_empty() + False + >>> stack.pop() + 'python' + >>> stack.push('algorithms') + >>> stack.pop() + 'algorithms' + >>> stack.pop() + 9 + >>> stack.pop() + 5 + >>> stack.is_empty() + True + >>> stack.pop() + Traceback (most recent call last): + ... + IndexError: pop from empty stack + """ + + def __init__(self) -> None: + self.top: Optional[Node] = None + + def __iter__(self): + node = self.top + while node: + yield node.data + node = node.next + + def __str__(self): + """ + >>> stack = LinkedStack() + >>> stack.push("c") + >>> stack.push("b") + >>> stack.push("a") + >>> str(stack) + 'a->b->c' + """ + return "->".join([str(item) for item in self]) + + def __len__(self): + """ + >>> stack = LinkedStack() + >>> len(stack) == 0 + True + >>> stack.push("c") + >>> stack.push("b") + >>> stack.push("a") + >>> len(stack) == 3 + True + """ + return len(tuple(iter(self))) + + def is_empty(self) -> bool: + """ + >>> stack = LinkedStack() + >>> stack.is_empty() + True + >>> stack.push(1) + >>> stack.is_empty() + False + """ + return self.top is None + + def push(self, item: Any) -> None: + """ + >>> stack = LinkedStack() + >>> stack.push("Python") + >>> stack.push("Java") + >>> stack.push("C") + >>> str(stack) + 'C->Java->Python' + """ + node = Node(item) + if not self.is_empty(): + node.next = self.top + self.top = node + + def pop(self) -> Any: + """ + >>> stack = LinkedStack() + >>> stack.pop() + Traceback (most recent call last): + ... + IndexError: pop from empty stack + >>> stack.push("c") + >>> stack.push("b") + >>> stack.push("a") + >>> stack.pop() == 'a' + True + >>> stack.pop() == 'b' + True + >>> stack.pop() == 'c' + True + """ + if self.is_empty(): + raise IndexError("pop from empty stack") + assert isinstance(self.top, Node) + pop_node = self.top + self.top = self.top.next + return pop_node.data + + def peek(self) -> Any: + """ + >>> stack = LinkedStack() + >>> stack.push("Java") + >>> stack.push("C") + >>> stack.push("Python") + >>> stack.peek() + 'Python' + """ + if self.is_empty(): + raise IndexError("peek from empty stack") + + assert self.top is not None + return self.top.data + + def clear(self) -> None: + """ + >>> stack = LinkedStack() + >>> stack.push("Java") + >>> stack.push("C") + >>> stack.push("Python") + >>> str(stack) + 'Python->C->Java' + >>> stack.clear() + >>> len(stack) == 0 + True + """ + self.top = None + + +if __name__ == "__main__": + from doctest import testmod + + testmod() diff --git a/python-mega-algo/data_structures/stacks/next_greater_element.py b/python-mega-algo/data_structures/stacks/next_greater_element.py new file mode 100644 index 00000000..d8c7ed17 --- /dev/null +++ b/python-mega-algo/data_structures/stacks/next_greater_element.py @@ -0,0 +1,98 @@ +arr = [-10, -5, 0, 5, 5.1, 11, 13, 21, 3, 4, -21, -10, -5, -1, 0] +expect = [-5, 0, 5, 5.1, 11, 13, 21, -1, 4, -1, -10, -5, -1, 0, -1] + + +def next_greatest_element_slow(arr: list) -> list: + """ + Get the Next Greatest Element (NGE) for all elements in a list. + Maximum element present after the current one which is also greater than the + current one. + >>> next_greatest_element_slow(arr) == expect + True + """ + result = [] + for i in range(0, len(arr), 1): + next = -1 + for j in range(i + 1, len(arr), 1): + if arr[i] < arr[j]: + next = arr[j] + break + result.append(next) + return result + + +def next_greatest_element_fast(arr: list) -> list: + """ + Like next_greatest_element_slow() but changes the loops to use + enumerate() instead of range(len()) for the outer loop and + for in a slice of arr for the inner loop. + >>> next_greatest_element_fast(arr) == expect + True + """ + result = [] + for i, outer in enumerate(arr): + next = -1 + for inner in arr[i + 1 :]: + if outer < inner: + next = inner + break + result.append(next) + return result + + +def next_greatest_element(arr: list) -> list: + """ + Get the Next Greatest Element (NGE) for all elements in a list. + Maximum element present after the current one which is also greater than the + current one. + + A naive way to solve this is to take two loops and check for the next bigger + number but that will make the time complexity as O(n^2). The better way to solve + this would be to use a stack to keep track of maximum number giving a linear time + solution. + >>> next_greatest_element(arr) == expect + True + """ + stack = [] + result = [-1] * len(arr) + + for index in reversed(range(len(arr))): + if len(stack): + while stack[-1] <= arr[index]: + stack.pop() + if len(stack) == 0: + break + + if len(stack) != 0: + result[index] = stack[-1] + + stack.append(arr[index]) + + return result + + +if __name__ == "__main__": + from doctest import testmod + from timeit import timeit + + testmod() + print(next_greatest_element_slow(arr)) + print(next_greatest_element_fast(arr)) + print(next_greatest_element(arr)) + + setup = ( + "from __main__ import arr, next_greatest_element_slow, " + "next_greatest_element_fast, next_greatest_element" + ) + print( + "next_greatest_element_slow():", + timeit("next_greatest_element_slow(arr)", setup=setup), + ) + print( + "next_greatest_element_fast():", + timeit("next_greatest_element_fast(arr)", setup=setup), + ) + print( + " next_greatest_element():", + timeit("next_greatest_element(arr)", setup=setup), + ) diff --git a/python-mega-algo/data_structures/stacks/postfix_evaluation.py b/python-mega-algo/data_structures/stacks/postfix_evaluation.py new file mode 100644 index 00000000..574acac7 --- /dev/null +++ b/python-mega-algo/data_structures/stacks/postfix_evaluation.py @@ -0,0 +1,68 @@ +""" +Output: + +Enter a Postfix Equation (space separated) = 5 6 9 * + + Symbol | Action | Stack +----------------------------------- + 5 | push(5) | 5 + 6 | push(6) | 5,6 + 9 | push(9) | 5,6,9 + | pop(9) | 5,6 + | pop(6) | 5 + * | push(6*9) | 5,54 + | pop(54) | 5 + | pop(5) | + + | push(5+54) | 59 + + Result = 59 +""" + +import operator as op + + +def Solve(Postfix): + Stack = [] + Div = lambda x, y: int(x / y) # noqa: E731 integer division operation + Opr = { + "^": op.pow, + "*": op.mul, + "/": Div, + "+": op.add, + "-": op.sub, + } # operators & their respective operation + + # print table header + print("Symbol".center(8), "Action".center(12), "Stack", sep=" | ") + print("-" * (30 + len(Postfix))) + + for x in Postfix: + if x.isdigit(): # if x in digit + Stack.append(x) # append x to stack + # output in tabular format + print(x.rjust(8), ("push(" + x + ")").ljust(12), ",".join(Stack), sep=" | ") + else: + B = Stack.pop() # pop stack + # output in tabular format + print("".rjust(8), ("pop(" + B + ")").ljust(12), ",".join(Stack), sep=" | ") + + A = Stack.pop() # pop stack + # output in tabular format + print("".rjust(8), ("pop(" + A + ")").ljust(12), ",".join(Stack), sep=" | ") + + Stack.append( + str(Opr[x](int(A), int(B))) + ) # evaluate the 2 values popped from stack & push result to stack + # output in tabular format + print( + x.rjust(8), + ("push(" + A + x + B + ")").ljust(12), + ",".join(Stack), + sep=" | ", + ) + + return int(Stack[0]) + + +if __name__ == "__main__": + Postfix = input("\n\nEnter a Postfix Equation (space separated) = ").split(" ") + print("\n\tResult = ", Solve(Postfix)) diff --git a/python-mega-algo/data_structures/stacks/prefix_evaluation.py b/python-mega-algo/data_structures/stacks/prefix_evaluation.py new file mode 100644 index 00000000..00df2c1e --- /dev/null +++ b/python-mega-algo/data_structures/stacks/prefix_evaluation.py @@ -0,0 +1,60 @@ +""" +Python3 program to evaluate a prefix expression. +""" + +calc = { + "+": lambda x, y: x + y, + "-": lambda x, y: x - y, + "*": lambda x, y: x * y, + "/": lambda x, y: x / y, +} + + +def is_operand(c): + """ + Return True if the given char c is an operand, e.g. it is a number + + >>> is_operand("1") + True + >>> is_operand("+") + False + """ + return c.isdigit() + + +def evaluate(expression): + """ + Evaluate a given expression in prefix notation. + Asserts that the given expression is valid. + + >>> evaluate("+ 9 * 2 6") + 21 + >>> evaluate("/ * 10 2 + 4 1 ") + 4.0 + """ + stack = [] + + # iterate over the string in reverse order + for c in expression.split()[::-1]: + + # push operand to stack + if is_operand(c): + stack.append(int(c)) + + else: + # pop values from stack can calculate the result + # push the result onto the stack again + o1 = stack.pop() + o2 = stack.pop() + stack.append(calc[c](o1, o2)) + + return stack.pop() + + +# Driver code +if __name__ == "__main__": + test_expression = "+ 9 * 2 6" + print(evaluate(test_expression)) + + test_expression = "/ * 10 2 + 4 1 " + print(evaluate(test_expression)) diff --git a/python-mega-algo/data_structures/stacks/right.html b/python-mega-algo/data_structures/stacks/right.html new file mode 100644 index 00000000..6b3dcef0 --- /dev/null +++ b/python-mega-algo/data_structures/stacks/right.html @@ -0,0 +1,32 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/data_structures/stacks + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + + + + +
    FileFileFileFile
    balanced_...ses.py infix_to_...ion.py postfix_e...ion.py stack_using_dll.py 
    dijkstras...thm.py linked_stack.py prefix_ev...ion.py stock_spa...lem.py 
    evaluate_...ons.py next_grea...ent.py stack.py __init__.py 
    infix_to_...ion.py 
    + +

    +Folders: 1
    +Files: 13
    +Size of all files: 26967 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/data_structures/stacks/stack.py b/python-mega-algo/data_structures/stacks/stack.py new file mode 100644 index 00000000..245d39b3 --- /dev/null +++ b/python-mega-algo/data_structures/stacks/stack.py @@ -0,0 +1,107 @@ +from typing import List + + +class StackOverflowError(BaseException): + pass + + +class Stack: + """A stack is an abstract data type that serves as a collection of + elements with two principal operations: push() and pop(). push() adds an + element to the top of the stack, and pop() removes an element from the top + of a stack. The order in which elements come off of a stack are + Last In, First Out (LIFO). + https://en.wikipedia.org/wiki/Stack_(abstract_data_type) + """ + + def __init__(self, limit: int = 10): + self.stack: List[int] = [] + self.limit = limit + + def __bool__(self) -> bool: + return bool(self.stack) + + def __str__(self) -> str: + return str(self.stack) + + def push(self, data): + """Push an element to the top of the stack.""" + if len(self.stack) >= self.limit: + raise StackOverflowError + self.stack.append(data) + + def pop(self): + """Pop an element off of the top of the stack.""" + return self.stack.pop() + + def peek(self): + """Peek at the top-most element of the stack.""" + return self.stack[-1] + + def is_empty(self) -> bool: + """Check if a stack is empty.""" + return not bool(self.stack) + + def is_full(self) -> bool: + return self.size() == self.limit + + def size(self) -> int: + """Return the size of the stack.""" + return len(self.stack) + + def __contains__(self, item) -> bool: + """Check if item is in stack""" + return item in self.stack + + +def test_stack() -> None: + """ + >>> test_stack() + """ + stack = Stack(10) + assert bool(stack) is False + assert stack.is_empty() is True + assert stack.is_full() is False + assert str(stack) == "[]" + + try: + _ = stack.pop() + assert False # This should not happen + except IndexError: + assert True # This should happen + + try: + _ = stack.peek() + assert False # This should not happen + except IndexError: + assert True # This should happen + + for i in range(10): + assert stack.size() == i + stack.push(i) + + assert bool(stack) is True + assert stack.is_empty() is False + assert stack.is_full() is True + assert str(stack) == str(list(range(10))) + assert stack.pop() == 9 + assert stack.peek() == 8 + + stack.push(100) + assert str(stack) == str([0, 1, 2, 3, 4, 5, 6, 7, 8, 100]) + + try: + stack.push(200) + assert False # This should not happen + except StackOverflowError: + assert True # This should happen + + assert stack.is_empty() is False + assert stack.size() == 10 + + assert 5 in stack + assert 55 not in stack + + +if __name__ == "__main__": + test_stack() diff --git a/python-mega-algo/data_structures/stacks/stack_using_dll.py b/python-mega-algo/data_structures/stacks/stack_using_dll.py new file mode 100644 index 00000000..3ce764dd --- /dev/null +++ b/python-mega-algo/data_structures/stacks/stack_using_dll.py @@ -0,0 +1,123 @@ +# A complete working Python program to demonstrate all +# stack operations using a doubly linked list + + +class Node: + def __init__(self, data): + self.data = data # Assign data + self.next = None # Initialize next as null + self.prev = None # Initialize prev as null + + +class Stack: + """ + >>> stack = Stack() + >>> stack.is_empty() + True + >>> stack.print_stack() + stack elements are: + >>> for i in range(4): + ... stack.push(i) + ... + >>> stack.is_empty() + False + >>> stack.print_stack() + stack elements are: + 3->2->1->0-> + >>> stack.top() + 3 + >>> len(stack) + 4 + >>> stack.pop() + 3 + >>> stack.print_stack() + stack elements are: + 2->1->0-> + """ + + def __init__(self): + self.head = None + + def push(self, data): + """add a Node to the stack""" + if self.head is None: + self.head = Node(data) + else: + new_node = Node(data) + self.head.prev = new_node + new_node.next = self.head + new_node.prev = None + self.head = new_node + + def pop(self): + """pop the top element off the stack""" + if self.head is None: + return None + else: + temp = self.head.data + self.head = self.head.next + self.head.prev = None + return temp + + def top(self): + """return the top element of the stack""" + return self.head.data + + def __len__(self): + temp = self.head + count = 0 + while temp is not None: + count += 1 + temp = temp.next + return count + + def is_empty(self): + return self.head is None + + def print_stack(self): + print("stack elements are:") + temp = self.head + while temp is not None: + print(temp.data, end="->") + temp = temp.next + + +# Code execution starts here +if __name__ == "__main__": + + # Start with the empty stack + stack = Stack() + + # Insert 4 at the beginning. So stack becomes 4->None + print("Stack operations using Doubly LinkedList") + stack.push(4) + + # Insert 5 at the beginning. So stack becomes 4->5->None + stack.push(5) + + # Insert 6 at the beginning. So stack becomes 4->5->6->None + stack.push(6) + + # Insert 7 at the beginning. So stack becomes 4->5->6->7->None + stack.push(7) + + # Print the stack + stack.print_stack() + + # Print the top element + print("\nTop element is ", stack.top()) + + # Print the stack size + print("Size of the stack is ", len(stack)) + + # pop the top element + stack.pop() + + # pop the top element + stack.pop() + + # two elements have now been popped off + stack.print_stack() + + # Print True if the stack is empty else False + print("\nstack is empty:", stack.is_empty()) diff --git a/python-mega-algo/data_structures/stacks/stock_span_problem.py b/python-mega-algo/data_structures/stacks/stock_span_problem.py new file mode 100644 index 00000000..cc2adfdd --- /dev/null +++ b/python-mega-algo/data_structures/stacks/stock_span_problem.py @@ -0,0 +1,53 @@ +""" +The stock span problem is a financial problem where we have a series of n daily +price quotes for a stock and we need to calculate span of stock's price for all n days. + +The span Si of the stock's price on a given day i is defined as the maximum +number of consecutive days just before the given day, for which the price of the stock +on the current day is less than or equal to its price on the given day. +""" + + +def calculateSpan(price, S): + + n = len(price) + # Create a stack and push index of fist element to it + st = [] + st.append(0) + + # Span value of first element is always 1 + S[0] = 1 + + # Calculate span values for rest of the elements + for i in range(1, n): + + # Pop elements from stack while stack is not + # empty and top of stack is smaller than price[i] + while len(st) > 0 and price[st[0]] <= price[i]: + st.pop() + + # If stack becomes empty, then price[i] is greater + # than all elements on left of it, i.e. price[0], + # price[1], ..price[i-1]. Else the price[i] is + # greater than elements after top of stack + S[i] = i + 1 if len(st) <= 0 else (i - st[0]) + + # Push this element to stack + st.append(i) + + +# A utility function to print elements of array +def printArray(arr, n): + for i in range(0, n): + print(arr[i], end=" ") + + +# Driver program to test above function +price = [10, 4, 5, 90, 120, 80] +S = [0 for i in range(len(price) + 1)] + +# Fill the span values in array S[] +calculateSpan(price, S) + +# Print the calculated span values +printArray(S, len(price)) diff --git a/python-mega-algo/data_structures/trie/__init__.py b/python-mega-algo/data_structures/trie/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/data_structures/trie/right.html b/python-mega-algo/data_structures/trie/right.html new file mode 100644 index 00000000..4f65fcd4 --- /dev/null +++ b/python-mega-algo/data_structures/trie/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/data_structures/trie + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    trie.py __init__.py 
    + +

    +Folders: 1
    +Files: 2
    +Size of all files: 3521 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/data_structures/trie/trie.py b/python-mega-algo/data_structures/trie/trie.py new file mode 100644 index 00000000..6582be24 --- /dev/null +++ b/python-mega-algo/data_structures/trie/trie.py @@ -0,0 +1,127 @@ +""" +A Trie/Prefix Tree is a kind of search tree used to provide quick lookup +of words/patterns in a set of words. A basic Trie however has O(n^2) space complexity +making it impractical in practice. It however provides O(max(search_string, length of +longest word)) lookup time making it an optimal approach when space is not an issue. +""" + + +class TrieNode: + def __init__(self): + self.nodes = dict() # Mapping from char to TrieNode + self.is_leaf = False + + def insert_many(self, words: [str]): + """ + Inserts a list of words into the Trie + :param words: list of string words + :return: None + """ + for word in words: + self.insert(word) + + def insert(self, word: str): + """ + Inserts a word into the Trie + :param word: word to be inserted + :return: None + """ + curr = self + for char in word: + if char not in curr.nodes: + curr.nodes[char] = TrieNode() + curr = curr.nodes[char] + curr.is_leaf = True + + def find(self, word: str) -> bool: + """ + Tries to find word in a Trie + :param word: word to look for + :return: Returns True if word is found, False otherwise + """ + curr = self + for char in word: + if char not in curr.nodes: + return False + curr = curr.nodes[char] + return curr.is_leaf + + def delete(self, word: str): + """ + Deletes a word in a Trie + :param word: word to delete + :return: None + """ + + def _delete(curr: TrieNode, word: str, index: int): + if index == len(word): + # If word does not exist + if not curr.is_leaf: + return False + curr.is_leaf = False + return len(curr.nodes) == 0 + char = word[index] + char_node = curr.nodes.get(char) + # If char not in current trie node + if not char_node: + return False + # Flag to check if node can be deleted + delete_curr = _delete(char_node, word, index + 1) + if delete_curr: + del curr.nodes[char] + return len(curr.nodes) == 0 + return delete_curr + + _delete(self, word, 0) + + +def print_words(node: TrieNode, word: str): + """ + Prints all the words in a Trie + :param node: root node of Trie + :param word: Word variable should be empty at start + :return: None + """ + if node.is_leaf: + print(word, end=" ") + + for key, value in node.nodes.items(): + print_words(value, word + key) + + +def test_trie(): + words = "banana bananas bandana band apple all beast".split() + root = TrieNode() + root.insert_many(words) + # print_words(root, "") + assert all(root.find(word) for word in words) + assert root.find("banana") + assert not root.find("bandanas") + assert not root.find("apps") + assert root.find("apple") + assert root.find("all") + root.delete("all") + assert not root.find("all") + root.delete("banana") + assert not root.find("banana") + assert root.find("bananas") + return True + + +def print_results(msg: str, passes: bool) -> None: + print(str(msg), "works!" if passes else "doesn't work :(") + + +def pytests(): + assert test_trie() + + +def main(): + """ + >>> pytests() + """ + print_results("Testing trie functionality", test_trie()) + + +if __name__ == "__main__": + main() diff --git a/python-mega-algo/digital_image_processing/__init__.py b/python-mega-algo/digital_image_processing/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/digital_image_processing/change_brightness.py b/python-mega-algo/digital_image_processing/change_brightness.py new file mode 100644 index 00000000..97493f1a --- /dev/null +++ b/python-mega-algo/digital_image_processing/change_brightness.py @@ -0,0 +1,26 @@ +from PIL import Image + + +def change_brightness(img: Image, level: float) -> Image: + """ + Change the brightness of a PIL Image to a given level. + """ + + def brightness(c: int) -> float: + """ + Fundamental Transformation/Operation that'll be performed on + every bit. + """ + return 128 + level + (c - 128) + + if not -255.0 <= level <= 255.0: + raise ValueError("level must be between -255.0 (black) and 255.0 (white)") + return img.point(brightness) + + +if __name__ == "__main__": + # Load image + with Image.open("image_data/lena.jpg") as img: + # Change brightness to 100 + brigt_img = change_brightness(img, 100) + brigt_img.save("image_data/lena_brightness.png", format="png") diff --git a/python-mega-algo/digital_image_processing/change_contrast.py b/python-mega-algo/digital_image_processing/change_contrast.py new file mode 100644 index 00000000..20015334 --- /dev/null +++ b/python-mega-algo/digital_image_processing/change_contrast.py @@ -0,0 +1,35 @@ +""" +Changing contrast with PIL + +This algorithm is used in +https://noivce.pythonanywhere.com/ Python web app. + +python/black: True +flake8 : True +""" + +from PIL import Image + + +def change_contrast(img: Image, level: int) -> Image: + """ + Function to change contrast + """ + factor = (259 * (level + 255)) / (255 * (259 - level)) + + def contrast(c: int) -> int: + """ + Fundamental Transformation/Operation that'll be performed on + every bit. + """ + return int(128 + factor * (c - 128)) + + return img.point(contrast) + + +if __name__ == "__main__": + # Load image + with Image.open("image_data/lena.jpg") as img: + # Change contrast to 170 + cont_img = change_contrast(img, 170) + cont_img.save("image_data/lena_high_contrast.png", format="png") diff --git a/python-mega-algo/digital_image_processing/convert_to_negative.py b/python-mega-algo/digital_image_processing/convert_to_negative.py new file mode 100644 index 00000000..7df44138 --- /dev/null +++ b/python-mega-algo/digital_image_processing/convert_to_negative.py @@ -0,0 +1,29 @@ +""" + Implemented an algorithm using opencv to convert a colored image into its negative +""" +from cv2 import destroyAllWindows, imread, imshow, waitKey + + +def convert_to_negative(img): + # getting number of pixels in the image + pixel_h, pixel_v = img.shape[0], img.shape[1] + + # converting each pixel's color to its negative + for i in range(pixel_h): + for j in range(pixel_v): + img[i][j] = [255, 255, 255] - img[i][j] + + return img + + +if __name__ == "__main__": + # read original image + img = imread("image_data/lena.jpg", 1) + + # convert to its negative + neg = convert_to_negative(img) + + # show result image + imshow("negative of original image", img) + waitKey(0) + destroyAllWindows() diff --git a/python-mega-algo/digital_image_processing/dithering/__init__.py b/python-mega-algo/digital_image_processing/dithering/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/digital_image_processing/dithering/burkes.py b/python-mega-algo/digital_image_processing/dithering/burkes.py new file mode 100644 index 00000000..2bf0bbe0 --- /dev/null +++ b/python-mega-algo/digital_image_processing/dithering/burkes.py @@ -0,0 +1,87 @@ +""" +Implementation Burke's algorithm (dithering) +""" +import numpy as np +from cv2 import destroyAllWindows, imread, imshow, waitKey + + +class Burkes: + """ + Burke's algorithm is using for converting grayscale image to black and white version + Source: Source: https://en.wikipedia.org/wiki/Dither + + Note: + * Best results are given with threshold= ~1/2 * max greyscale value. + * This implementation get RGB image and converts it to greyscale in runtime. + """ + + def __init__(self, input_img, threshold: int): + self.min_threshold = 0 + # max greyscale value for #FFFFFF + self.max_threshold = int(self.get_greyscale(255, 255, 255)) + + if not self.min_threshold < threshold < self.max_threshold: + raise ValueError(f"Factor value should be from 0 to {self.max_threshold}") + + self.input_img = input_img + self.threshold = threshold + self.width, self.height = self.input_img.shape[1], self.input_img.shape[0] + + # error table size (+4 columns and +1 row) greater than input image because of + # lack of if statements + self.error_table = [ + [0 for _ in range(self.height + 4)] for __ in range(self.width + 1) + ] + self.output_img = np.ones((self.width, self.height, 3), np.uint8) * 255 + + @classmethod + def get_greyscale(cls, blue: int, green: int, red: int) -> float: + """ + >>> Burkes.get_greyscale(3, 4, 5) + 3.753 + """ + return 0.114 * blue + 0.587 * green + 0.2126 * red + + def process(self) -> None: + for y in range(self.height): + for x in range(self.width): + greyscale = int(self.get_greyscale(*self.input_img[y][x])) + if self.threshold > greyscale + self.error_table[y][x]: + self.output_img[y][x] = (0, 0, 0) + current_error = greyscale + self.error_table[x][y] + else: + self.output_img[y][x] = (255, 255, 255) + current_error = greyscale + self.error_table[x][y] - 255 + """ + Burkes error propagation (`*` is current pixel): + + * 8/32 4/32 + 2/32 4/32 8/32 4/32 2/32 + """ + self.error_table[y][x + 1] += int(8 / 32 * current_error) + self.error_table[y][x + 2] += int(4 / 32 * current_error) + self.error_table[y + 1][x] += int(8 / 32 * current_error) + self.error_table[y + 1][x + 1] += int(4 / 32 * current_error) + self.error_table[y + 1][x + 2] += int(2 / 32 * current_error) + self.error_table[y + 1][x - 1] += int(4 / 32 * current_error) + self.error_table[y + 1][x - 2] += int(2 / 32 * current_error) + + +if __name__ == "__main__": + # create Burke's instances with original images in greyscale + burkes_instances = [ + Burkes(imread("image_data/lena.jpg", 1), threshold) + for threshold in (1, 126, 130, 140) + ] + + for burkes in burkes_instances: + burkes.process() + + for burkes in burkes_instances: + imshow( + f"Original image with dithering threshold: {burkes.threshold}", + burkes.output_img, + ) + + waitKey(0) + destroyAllWindows() diff --git a/python-mega-algo/digital_image_processing/dithering/right.html b/python-mega-algo/digital_image_processing/dithering/right.html new file mode 100644 index 00000000..fc8be6ca --- /dev/null +++ b/python-mega-algo/digital_image_processing/dithering/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/digital_image_processing/dithering + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    burkes.py __init__.py 
    + +

    +Folders: 1
    +Files: 2
    +Size of all files: 3326 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/digital_image_processing/edge_detection/__init__.py b/python-mega-algo/digital_image_processing/edge_detection/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/digital_image_processing/edge_detection/canny.py b/python-mega-algo/digital_image_processing/edge_detection/canny.py new file mode 100644 index 00000000..295b4d82 --- /dev/null +++ b/python-mega-algo/digital_image_processing/edge_detection/canny.py @@ -0,0 +1,122 @@ +import cv2 +import numpy as np + +from digital_image_processing.filters.convolve import img_convolve +from digital_image_processing.filters.sobel_filter import sobel_filter + +PI = 180 + + +def gen_gaussian_kernel(k_size, sigma): + center = k_size // 2 + x, y = np.mgrid[0 - center : k_size - center, 0 - center : k_size - center] + g = ( + 1 + / (2 * np.pi * sigma) + * np.exp(-(np.square(x) + np.square(y)) / (2 * np.square(sigma))) + ) + return g + + +def canny(image, threshold_low=15, threshold_high=30, weak=128, strong=255): + image_row, image_col = image.shape[0], image.shape[1] + # gaussian_filter + gaussian_out = img_convolve(image, gen_gaussian_kernel(9, sigma=1.4)) + # get the gradient and degree by sobel_filter + sobel_grad, sobel_theta = sobel_filter(gaussian_out) + gradient_direction = np.rad2deg(sobel_theta) + gradient_direction += PI + + dst = np.zeros((image_row, image_col)) + + """ + Non-maximum suppression. If the edge strength of the current pixel is the largest + compared to the other pixels in the mask with the same direction, the value will be + preserved. Otherwise, the value will be suppressed. + """ + for row in range(1, image_row - 1): + for col in range(1, image_col - 1): + direction = gradient_direction[row, col] + + if ( + 0 <= direction < 22.5 + or 15 * PI / 8 <= direction <= 2 * PI + or 7 * PI / 8 <= direction <= 9 * PI / 8 + ): + W = sobel_grad[row, col - 1] + E = sobel_grad[row, col + 1] + if sobel_grad[row, col] >= W and sobel_grad[row, col] >= E: + dst[row, col] = sobel_grad[row, col] + + elif (PI / 8 <= direction < 3 * PI / 8) or ( + 9 * PI / 8 <= direction < 11 * PI / 8 + ): + SW = sobel_grad[row + 1, col - 1] + NE = sobel_grad[row - 1, col + 1] + if sobel_grad[row, col] >= SW and sobel_grad[row, col] >= NE: + dst[row, col] = sobel_grad[row, col] + + elif (3 * PI / 8 <= direction < 5 * PI / 8) or ( + 11 * PI / 8 <= direction < 13 * PI / 8 + ): + N = sobel_grad[row - 1, col] + S = sobel_grad[row + 1, col] + if sobel_grad[row, col] >= N and sobel_grad[row, col] >= S: + dst[row, col] = sobel_grad[row, col] + + elif (5 * PI / 8 <= direction < 7 * PI / 8) or ( + 13 * PI / 8 <= direction < 15 * PI / 8 + ): + NW = sobel_grad[row - 1, col - 1] + SE = sobel_grad[row + 1, col + 1] + if sobel_grad[row, col] >= NW and sobel_grad[row, col] >= SE: + dst[row, col] = sobel_grad[row, col] + + """ + High-Low threshold detection. If an edge pixel’s gradient value is higher + than the high threshold value, it is marked as a strong edge pixel. If an + edge pixel’s gradient value is smaller than the high threshold value and + larger than the low threshold value, it is marked as a weak edge pixel. If + an edge pixel's value is smaller than the low threshold value, it will be + suppressed. + """ + if dst[row, col] >= threshold_high: + dst[row, col] = strong + elif dst[row, col] <= threshold_low: + dst[row, col] = 0 + else: + dst[row, col] = weak + + """ + Edge tracking. Usually a weak edge pixel caused from true edges will be connected + to a strong edge pixel while noise responses are unconnected. As long as there is + one strong edge pixel that is involved in its 8-connected neighborhood, that weak + edge point can be identified as one that should be preserved. + """ + for row in range(1, image_row): + for col in range(1, image_col): + if dst[row, col] == weak: + if 255 in ( + dst[row, col + 1], + dst[row, col - 1], + dst[row - 1, col], + dst[row + 1, col], + dst[row - 1, col - 1], + dst[row + 1, col - 1], + dst[row - 1, col + 1], + dst[row + 1, col + 1], + ): + dst[row, col] = strong + else: + dst[row, col] = 0 + + return dst + + +if __name__ == "__main__": + # read original image in gray mode + lena = cv2.imread(r"../image_data/lena.jpg", 0) + # canny edge detection + canny_dst = canny(lena) + cv2.imshow("canny", canny_dst) + cv2.waitKey(0) diff --git a/python-mega-algo/digital_image_processing/edge_detection/right.html b/python-mega-algo/digital_image_processing/edge_detection/right.html new file mode 100644 index 00000000..e6d468a2 --- /dev/null +++ b/python-mega-algo/digital_image_processing/edge_detection/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/digital_image_processing/edge_detection + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    canny.py __init__.py 
    + +

    +Folders: 1
    +Files: 2
    +Size of all files: 4698 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/digital_image_processing/filters/__init__.py b/python-mega-algo/digital_image_processing/filters/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/digital_image_processing/filters/bilateral_filter.py b/python-mega-algo/digital_image_processing/filters/bilateral_filter.py new file mode 100644 index 00000000..76ae4dd2 --- /dev/null +++ b/python-mega-algo/digital_image_processing/filters/bilateral_filter.py @@ -0,0 +1,88 @@ +""" +Implementation of Bilateral filter + +Inputs: + img: A 2d image with values in between 0 and 1 + varS: variance in space dimension. + varI: variance in Intensity. + N: Kernel size(Must be an odd number) +Output: + img:A 2d zero padded image with values in between 0 and 1 +""" +import math +import sys + +import cv2 +import numpy as np + + +def vec_gaussian(img: np.ndarray, variance: float) -> np.ndarray: + # For applying gaussian function for each element in matrix. + sigma = math.sqrt(variance) + cons = 1 / (sigma * math.sqrt(2 * math.pi)) + return cons * np.exp(-((img / sigma) ** 2) * 0.5) + + +def get_slice(img: np.ndarray, x: int, y: int, kernel_size: int) -> np.ndarray: + half = kernel_size // 2 + return img[x - half : x + half + 1, y - half : y + half + 1] + + +def get_gauss_kernel(kernel_size: int, spatial_variance: float) -> np.ndarray: + # Creates a gaussian kernel of given dimension. + arr = np.zeros((kernel_size, kernel_size)) + for i in range(0, kernel_size): + for j in range(0, kernel_size): + arr[i, j] = math.sqrt( + abs(i - kernel_size // 2) ** 2 + abs(j - kernel_size // 2) ** 2 + ) + return vec_gaussian(arr, spatial_variance) + + +def bilateral_filter( + img: np.ndarray, + spatial_variance: float, + intensity_variance: float, + kernel_size: int, +) -> np.ndarray: + img2 = np.zeros(img.shape) + gaussKer = get_gauss_kernel(kernel_size, spatial_variance) + sizeX, sizeY = img.shape + for i in range(kernel_size // 2, sizeX - kernel_size // 2): + for j in range(kernel_size // 2, sizeY - kernel_size // 2): + + imgS = get_slice(img, i, j, kernel_size) + imgI = imgS - imgS[kernel_size // 2, kernel_size // 2] + imgIG = vec_gaussian(imgI, intensity_variance) + weights = np.multiply(gaussKer, imgIG) + vals = np.multiply(imgS, weights) + val = np.sum(vals) / np.sum(weights) + img2[i, j] = val + return img2 + + +def parse_args(args: list) -> tuple: + filename = args[1] if args[1:] else "../image_data/lena.jpg" + spatial_variance = float(args[2]) if args[2:] else 1.0 + intensity_variance = float(args[3]) if args[3:] else 1.0 + if args[4:]: + kernel_size = int(args[4]) + kernel_size = kernel_size + abs(kernel_size % 2 - 1) + else: + kernel_size = 5 + return filename, spatial_variance, intensity_variance, kernel_size + + +if __name__ == "__main__": + filename, spatial_variance, intensity_variance, kernel_size = parse_args(sys.argv) + img = cv2.imread(filename, 0) + cv2.imshow("input image", img) + + out = img / 255 + out = out.astype("float32") + out = bilateral_filter(out, spatial_variance, intensity_variance, kernel_size) + out = out * 255 + out = np.uint8(out) + cv2.imshow("output image", out) + cv2.waitKey(0) + cv2.destroyAllWindows() diff --git a/python-mega-algo/digital_image_processing/filters/convolve.py b/python-mega-algo/digital_image_processing/filters/convolve.py new file mode 100644 index 00000000..29968201 --- /dev/null +++ b/python-mega-algo/digital_image_processing/filters/convolve.py @@ -0,0 +1,49 @@ +# @Author : lightXu +# @File : convolve.py +# @Time : 2019/7/8 0008 ä¸‹åˆ 16:13 +from cv2 import COLOR_BGR2GRAY, cvtColor, imread, imshow, waitKey +from numpy import array, dot, pad, ravel, uint8, zeros + + +def im2col(image, block_size): + rows, cols = image.shape + dst_height = cols - block_size[1] + 1 + dst_width = rows - block_size[0] + 1 + image_array = zeros((dst_height * dst_width, block_size[1] * block_size[0])) + row = 0 + for i in range(0, dst_height): + for j in range(0, dst_width): + window = ravel(image[i : i + block_size[0], j : j + block_size[1]]) + image_array[row, :] = window + row += 1 + + return image_array + + +def img_convolve(image, filter_kernel): + height, width = image.shape[0], image.shape[1] + k_size = filter_kernel.shape[0] + pad_size = k_size // 2 + # Pads image with the edge values of array. + image_tmp = pad(image, pad_size, mode="edge") + + # im2col, turn the k_size*k_size pixels into a row and np.vstack all rows + image_array = im2col(image_tmp, (k_size, k_size)) + + # turn the kernel into shape(k*k, 1) + kernel_array = ravel(filter_kernel) + # reshape and get the dst image + dst = dot(image_array, kernel_array).reshape(height, width) + return dst + + +if __name__ == "__main__": + # read original image + img = imread(r"../image_data/lena.jpg") + # turn image in gray scale value + gray = cvtColor(img, COLOR_BGR2GRAY) + # Laplace operator + Laplace_kernel = array([[0, 1, 0], [1, -4, 1], [0, 1, 0]]) + out = img_convolve(gray, Laplace_kernel).astype(uint8) + imshow("Laplacian", out) + waitKey(0) diff --git a/python-mega-algo/digital_image_processing/filters/gaussian_filter.py b/python-mega-algo/digital_image_processing/filters/gaussian_filter.py new file mode 100644 index 00000000..87fa67fb --- /dev/null +++ b/python-mega-algo/digital_image_processing/filters/gaussian_filter.py @@ -0,0 +1,54 @@ +""" +Implementation of gaussian filter algorithm +""" +from itertools import product + +from cv2 import COLOR_BGR2GRAY, cvtColor, imread, imshow, waitKey +from numpy import dot, exp, mgrid, pi, ravel, square, uint8, zeros + + +def gen_gaussian_kernel(k_size, sigma): + center = k_size // 2 + x, y = mgrid[0 - center : k_size - center, 0 - center : k_size - center] + g = 1 / (2 * pi * sigma) * exp(-(square(x) + square(y)) / (2 * square(sigma))) + return g + + +def gaussian_filter(image, k_size, sigma): + height, width = image.shape[0], image.shape[1] + # dst image height and width + dst_height = height - k_size + 1 + dst_width = width - k_size + 1 + + # im2col, turn the k_size*k_size pixels into a row and np.vstack all rows + image_array = zeros((dst_height * dst_width, k_size * k_size)) + row = 0 + for i, j in product(range(dst_height), range(dst_width)): + window = ravel(image[i : i + k_size, j : j + k_size]) + image_array[row, :] = window + row += 1 + + # turn the kernel into shape(k*k, 1) + gaussian_kernel = gen_gaussian_kernel(k_size, sigma) + filter_array = ravel(gaussian_kernel) + + # reshape and get the dst image + dst = dot(image_array, filter_array).reshape(dst_height, dst_width).astype(uint8) + + return dst + + +if __name__ == "__main__": + # read original image + img = imread(r"../image_data/lena.jpg") + # turn image in gray scale value + gray = cvtColor(img, COLOR_BGR2GRAY) + + # get values with two different mask size + gaussian3x3 = gaussian_filter(gray, 3, sigma=1) + gaussian5x5 = gaussian_filter(gray, 5, sigma=0.8) + + # show result images + imshow("gaussian filter with 3x3 mask", gaussian3x3) + imshow("gaussian filter with 5x5 mask", gaussian5x5) + waitKey() diff --git a/python-mega-algo/digital_image_processing/filters/median_filter.py b/python-mega-algo/digital_image_processing/filters/median_filter.py new file mode 100644 index 00000000..17401856 --- /dev/null +++ b/python-mega-algo/digital_image_processing/filters/median_filter.py @@ -0,0 +1,41 @@ +""" +Implementation of median filter algorithm +""" +from cv2 import COLOR_BGR2GRAY, cvtColor, imread, imshow, waitKey +from numpy import divide, int8, multiply, ravel, sort, zeros_like + + +def median_filter(gray_img, mask=3): + """ + :param gray_img: gray image + :param mask: mask size + :return: image with median filter + """ + # set image borders + bd = int(mask / 2) + # copy image size + median_img = zeros_like(gray_img) + for i in range(bd, gray_img.shape[0] - bd): + for j in range(bd, gray_img.shape[1] - bd): + # get mask according with mask + kernel = ravel(gray_img[i - bd : i + bd + 1, j - bd : j + bd + 1]) + # calculate mask median + median = sort(kernel)[int8(divide((multiply(mask, mask)), 2) + 1)] + median_img[i, j] = median + return median_img + + +if __name__ == "__main__": + # read original image + img = imread("../image_data/lena.jpg") + # turn image in gray scale value + gray = cvtColor(img, COLOR_BGR2GRAY) + + # get values with two different mask size + median3x3 = median_filter(gray, 3) + median5x5 = median_filter(gray, 5) + + # show result images + imshow("median filter with 3x3 mask", median3x3) + imshow("median filter with 5x5 mask", median5x5) + waitKey(0) diff --git a/python-mega-algo/digital_image_processing/filters/right.html b/python-mega-algo/digital_image_processing/filters/right.html new file mode 100644 index 00000000..f3a4841e --- /dev/null +++ b/python-mega-algo/digital_image_processing/filters/right.html @@ -0,0 +1,30 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/digital_image_processing/filters + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + + +
    FileFileFileFile
    bilateral...ter.py gaussian_filter.py sobel_filter.py __init__.py 
    convolve.py median_filter.py 
    + +

    +Folders: 1
    +Files: 6
    +Size of all files: 8711 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/digital_image_processing/filters/sobel_filter.py b/python-mega-algo/digital_image_processing/filters/sobel_filter.py new file mode 100644 index 00000000..33284a32 --- /dev/null +++ b/python-mega-algo/digital_image_processing/filters/sobel_filter.py @@ -0,0 +1,39 @@ +# @Author : lightXu +# @File : sobel_filter.py +# @Time : 2019/7/8 0008 ä¸‹åˆ 16:26 +import numpy as np +from cv2 import COLOR_BGR2GRAY, cvtColor, imread, imshow, waitKey + +from digital_image_processing.filters.convolve import img_convolve + + +def sobel_filter(image): + kernel_x = np.array([[-1, 0, 1], [-2, 0, 2], [-1, 0, 1]]) + kernel_y = np.array([[1, 2, 1], [0, 0, 0], [-1, -2, -1]]) + + dst_x = np.abs(img_convolve(image, kernel_x)) + dst_y = np.abs(img_convolve(image, kernel_y)) + # modify the pix within [0, 255] + dst_x = dst_x * 255 / np.max(dst_x) + dst_y = dst_y * 255 / np.max(dst_y) + + dst_xy = np.sqrt((np.square(dst_x)) + (np.square(dst_y))) + dst_xy = dst_xy * 255 / np.max(dst_xy) + dst = dst_xy.astype(np.uint8) + + theta = np.arctan2(dst_y, dst_x) + return dst, theta + + +if __name__ == "__main__": + # read original image + img = imread("../image_data/lena.jpg") + # turn image in gray scale value + gray = cvtColor(img, COLOR_BGR2GRAY) + + sobel_grad, sobel_theta = sobel_filter(gray) + + # show result images + imshow("sobel filter", sobel_grad) + imshow("sobel theta", sobel_theta) + waitKey(0) diff --git a/python-mega-algo/digital_image_processing/histogram_equalization/__init__.py b/python-mega-algo/digital_image_processing/histogram_equalization/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/digital_image_processing/histogram_equalization/histogram_stretch.py b/python-mega-algo/digital_image_processing/histogram_equalization/histogram_stretch.py new file mode 100644 index 00000000..0288a2c1 --- /dev/null +++ b/python-mega-algo/digital_image_processing/histogram_equalization/histogram_stretch.py @@ -0,0 +1,63 @@ +""" +Created on Fri Sep 28 15:22:29 2018 + +@author: Binish125 +""" +import copy +import os + +import cv2 +import numpy as np +from matplotlib import pyplot as plt + + +class contrastStretch: + def __init__(self): + self.img = "" + self.original_image = "" + self.last_list = [] + self.rem = 0 + self.L = 256 + self.sk = 0 + self.k = 0 + self.number_of_rows = 0 + self.number_of_cols = 0 + + def stretch(self, input_image): + self.img = cv2.imread(input_image, 0) + self.original_image = copy.deepcopy(self.img) + x, _, _ = plt.hist(self.img.ravel(), 256, [0, 256], label="x") + self.k = np.sum(x) + for i in range(len(x)): + prk = x[i] / self.k + self.sk += prk + last = (self.L - 1) * self.sk + if self.rem != 0: + self.rem = int(last % last) + last = int(last + 1 if self.rem >= 0.5 else last) + self.last_list.append(last) + self.number_of_rows = int(np.ma.count(self.img) / self.img[1].size) + self.number_of_cols = self.img[1].size + for i in range(self.number_of_cols): + for j in range(self.number_of_rows): + num = self.img[j][i] + if num != self.last_list[num]: + self.img[j][i] = self.last_list[num] + cv2.imwrite("output_data/output.jpg", self.img) + + def plotHistogram(self): + plt.hist(self.img.ravel(), 256, [0, 256]) + + def showImage(self): + cv2.imshow("Output-Image", self.img) + cv2.imshow("Input-Image", self.original_image) + cv2.waitKey(5000) + cv2.destroyAllWindows() + + +if __name__ == "__main__": + file_path = os.path.join(os.path.basename(__file__), "image_data/input.jpg") + stretcher = contrastStretch() + stretcher.stretch(file_path) + stretcher.plotHistogram() + stretcher.showImage() diff --git a/python-mega-algo/digital_image_processing/histogram_equalization/image_data/__init__.py b/python-mega-algo/digital_image_processing/histogram_equalization/image_data/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/digital_image_processing/histogram_equalization/image_data/input.jpg b/python-mega-algo/digital_image_processing/histogram_equalization/image_data/input.jpg new file mode 100644 index 0000000000000000000000000000000000000000..483da6fd97f44624598f9f501fddcd2987951677 GIT binary patch literal 60104 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

    EY;=J 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 KfA@_5fB)G)6y%Qp literal 0 HcmV?d00001 diff --git a/python-mega-algo/digital_image_processing/histogram_equalization/image_data/right.html b/python-mega-algo/digital_image_processing/histogram_equalization/image_data/right.html new file mode 100644 index 00000000..18ee7339 --- /dev/null +++ b/python-mega-algo/digital_image_processing/histogram_equalization/image_data/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/digital_image_processing/histogram_equalization/image_data + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    input.jpg __init__.py 
    + +

    +Folders: 1
    +Files: 2
    +Size of all files: 60104 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/digital_image_processing/histogram_equalization/output_data/__init__.py b/python-mega-algo/digital_image_processing/histogram_equalization/output_data/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/digital_image_processing/histogram_equalization/output_data/output.jpg b/python-mega-algo/digital_image_processing/histogram_equalization/output_data/output.jpg new file mode 100644 index 0000000000000000000000000000000000000000..48c70d8ae17daa06ac182057374ffdb3b8556384 GIT binary patch literal 118463 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
    *T7_3qkn#_;k!8@|UCWQ+^E7# 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 F{|Aochi3o) literal 0 HcmV?d00001 diff --git a/python-mega-algo/digital_image_processing/histogram_equalization/output_data/right.html b/python-mega-algo/digital_image_processing/histogram_equalization/output_data/right.html new file mode 100644 index 00000000..84b53ab7 --- /dev/null +++ b/python-mega-algo/digital_image_processing/histogram_equalization/output_data/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/digital_image_processing/histogram_equalization/output_data + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    output.jpg __init__.py 
    + +

    +Folders: 1
    +Files: 2
    +Size of all files: 118463 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/digital_image_processing/histogram_equalization/right.html b/python-mega-algo/digital_image_processing/histogram_equalization/right.html new file mode 100644 index 00000000..4d4226a8 --- /dev/null +++ b/python-mega-algo/digital_image_processing/histogram_equalization/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/digital_image_processing/histogram_equalization + + + + + + + + +
    Folders
    <Go Back> image_data output_data
    +
    + + + + +
    FileFileFileFile
    histogram...tch.py __init__.py 
    + +

    +Folders: 3
    +Files: 2
    +Size of all files: 1894 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/digital_image_processing/image_data/__init__.py b/python-mega-algo/digital_image_processing/image_data/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/digital_image_processing/image_data/lena.jpg b/python-mega-algo/digital_image_processing/image_data/lena.jpg new file mode 100644 index 0000000000000000000000000000000000000000..15c4d9764effe5ad9d84dc0e4af553788f80dc73 GIT binary patch literal 104428 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 z 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
    NE>Wy#+nw!+{7f+RSuE)M#)za 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 literal 0 HcmV?d00001 diff --git a/python-mega-algo/digital_image_processing/image_data/lena_small.jpg b/python-mega-algo/digital_image_processing/image_data/lena_small.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b85144e9f65ca0c115c41e79a6c29c24aa9a322d GIT binary patch literal 6971 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 Hxt{+YSh(6Q literal 0 HcmV?d00001 diff --git a/python-mega-algo/digital_image_processing/image_data/right.html b/python-mega-algo/digital_image_processing/image_data/right.html new file mode 100644 index 00000000..da643f21 --- /dev/null +++ b/python-mega-algo/digital_image_processing/image_data/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/digital_image_processing/image_data + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    lena.jpg lena_small.jpg __init__.py 
    + +

    +Folders: 1
    +Files: 3
    +Size of all files: 111399 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/digital_image_processing/index_calculation.py b/python-mega-algo/digital_image_processing/index_calculation.py new file mode 100644 index 00000000..4350b860 --- /dev/null +++ b/python-mega-algo/digital_image_processing/index_calculation.py @@ -0,0 +1,576 @@ +# Author: João Gustavo A. Amorim +# Author email: joaogustavoamorim@gmail.com +# Coding date: jan 2019 +# python/black: True + +# Imports +import numpy as np + + +# Class implemented to calculus the index +class IndexCalculation: + """ + # Class Summary + This algorithm consists in calculating vegetation indices, these + indices can be used for precision agriculture for example (or remote + sensing). There are functions to define the data and to calculate the + implemented indices. + + # Vegetation index + https://en.wikipedia.org/wiki/Vegetation_Index + A Vegetation Index (VI) is a spectral transformation of two or more bands + designed to enhance the contribution of vegetation properties and allow + reliable spatial and temporal inter-comparisons of terrestrial + photosynthetic activity and canopy structural variations + + # Information about channels (Wavelength range for each) + * nir - near-infrared + https://www.malvernpanalytical.com/br/products/technology/near-infrared-spectroscopy + Wavelength Range 700 nm to 2500 nm + * Red Edge + https://en.wikipedia.org/wiki/Red_edge + Wavelength Range 680 nm to 730 nm + * red + https://en.wikipedia.org/wiki/Color + Wavelength Range 635 nm to 700 nm + * blue + https://en.wikipedia.org/wiki/Color + Wavelength Range 450 nm to 490 nm + * green + https://en.wikipedia.org/wiki/Color + Wavelength Range 520 nm to 560 nm + + + # Implemented index list + #"abbreviationOfIndexName" -- list of channels used + + #"ARVI2" -- red, nir + #"CCCI" -- red, redEdge, nir + #"CVI" -- red, green, nir + #"GLI" -- red, green, blue + #"NDVI" -- red, nir + #"BNDVI" -- blue, nir + #"redEdgeNDVI" -- red, redEdge + #"GNDVI" -- green, nir + #"GBNDVI" -- green, blue, nir + #"GRNDVI" -- red, green, nir + #"RBNDVI" -- red, blue, nir + #"PNDVI" -- red, green, blue, nir + #"ATSAVI" -- red, nir + #"BWDRVI" -- blue, nir + #"CIgreen" -- green, nir + #"CIrededge" -- redEdge, nir + #"CI" -- red, blue + #"CTVI" -- red, nir + #"GDVI" -- green, nir + #"EVI" -- red, blue, nir + #"GEMI" -- red, nir + #"GOSAVI" -- green, nir + #"GSAVI" -- green, nir + #"Hue" -- red, green, blue + #"IVI" -- red, nir + #"IPVI" -- red, nir + #"I" -- red, green, blue + #"RVI" -- red, nir + #"MRVI" -- red, nir + #"MSAVI" -- red, nir + #"NormG" -- red, green, nir + #"NormNIR" -- red, green, nir + #"NormR" -- red, green, nir + #"NGRDI" -- red, green + #"RI" -- red, green + #"S" -- red, green, blue + #"IF" -- red, green, blue + #"DVI" -- red, nir + #"TVI" -- red, nir + #"NDRE" -- redEdge, nir + + #list of all index implemented + #allIndex = ["ARVI2", "CCCI", "CVI", "GLI", "NDVI", "BNDVI", "redEdgeNDVI", + "GNDVI", "GBNDVI", "GRNDVI", "RBNDVI", "PNDVI", "ATSAVI", + "BWDRVI", "CIgreen", "CIrededge", "CI", "CTVI", "GDVI", "EVI", + "GEMI", "GOSAVI", "GSAVI", "Hue", "IVI", "IPVI", "I", "RVI", + "MRVI", "MSAVI", "NormG", "NormNIR", "NormR", "NGRDI", "RI", + "S", "IF", "DVI", "TVI", "NDRE"] + + #list of index with not blue channel + #notBlueIndex = ["ARVI2", "CCCI", "CVI", "NDVI", "redEdgeNDVI", "GNDVI", + "GRNDVI", "ATSAVI", "CIgreen", "CIrededge", "CTVI", "GDVI", + "GEMI", "GOSAVI", "GSAVI", "IVI", "IPVI", "RVI", "MRVI", + "MSAVI", "NormG", "NormNIR", "NormR", "NGRDI", "RI", "DVI", + "TVI", "NDRE"] + + #list of index just with RGB channels + #RGBIndex = ["GLI", "CI", "Hue", "I", "NGRDI", "RI", "S", "IF"] + """ + + def __init__(self, red=None, green=None, blue=None, redEdge=None, nir=None): + # print("Numpy version: " + np.__version__) + self.setMatrices(red=red, green=green, blue=blue, redEdge=redEdge, nir=nir) + + def setMatrices(self, red=None, green=None, blue=None, redEdge=None, nir=None): + if red is not None: + self.red = red + if green is not None: + self.green = green + if blue is not None: + self.blue = blue + if redEdge is not None: + self.redEdge = redEdge + if nir is not None: + self.nir = nir + return True + + def calculation( + self, index="", red=None, green=None, blue=None, redEdge=None, nir=None + ): + """ + performs the calculation of the index with the values instantiated in the class + :str index: abbreviation of index name to perform + """ + self.setMatrices(red=red, green=green, blue=blue, redEdge=redEdge, nir=nir) + funcs = { + "ARVI2": self.ARVI2, + "CCCI": self.CCCI, + "CVI": self.CVI, + "GLI": self.GLI, + "NDVI": self.NDVI, + "BNDVI": self.BNDVI, + "redEdgeNDVI": self.redEdgeNDVI, + "GNDVI": self.GNDVI, + "GBNDVI": self.GBNDVI, + "GRNDVI": self.GRNDVI, + "RBNDVI": self.RBNDVI, + "PNDVI": self.PNDVI, + "ATSAVI": self.ATSAVI, + "BWDRVI": self.BWDRVI, + "CIgreen": self.CIgreen, + "CIrededge": self.CIrededge, + "CI": self.CI, + "CTVI": self.CTVI, + "GDVI": self.GDVI, + "EVI": self.EVI, + "GEMI": self.GEMI, + "GOSAVI": self.GOSAVI, + "GSAVI": self.GSAVI, + "Hue": self.Hue, + "IVI": self.IVI, + "IPVI": self.IPVI, + "I": self.I, + "RVI": self.RVI, + "MRVI": self.MRVI, + "MSAVI": self.MSAVI, + "NormG": self.NormG, + "NormNIR": self.NormNIR, + "NormR": self.NormR, + "NGRDI": self.NGRDI, + "RI": self.RI, + "S": self.S, + "IF": self.IF, + "DVI": self.DVI, + "TVI": self.TVI, + "NDRE": self.NDRE, + } + + try: + return funcs[index]() + except KeyError: + print("Index not in the list!") + return False + + def ARVI2(self): + """ + Atmospherically Resistant Vegetation Index 2 + https://www.indexdatabase.de/db/i-single.php?id=396 + :return: index + −0.18+1.17*(self.nir−self.red)/(self.nir+self.red) + """ + return -0.18 + (1.17 * ((self.nir - self.red) / (self.nir + self.red))) + + def CCCI(self): + """ + Canopy Chlorophyll Content Index + https://www.indexdatabase.de/db/i-single.php?id=224 + :return: index + """ + return ((self.nir - self.redEdge) / (self.nir + self.redEdge)) / ( + (self.nir - self.red) / (self.nir + self.red) + ) + + def CVI(self): + """ + Chlorophyll vegetation index + https://www.indexdatabase.de/db/i-single.php?id=391 + :return: index + """ + return self.nir * (self.red / (self.green ** 2)) + + def GLI(self): + """ + self.green leaf index + https://www.indexdatabase.de/db/i-single.php?id=375 + :return: index + """ + return (2 * self.green - self.red - self.blue) / ( + 2 * self.green + self.red + self.blue + ) + + def NDVI(self): + """ + Normalized Difference self.nir/self.red Normalized Difference Vegetation + Index, Calibrated NDVI - CDVI + https://www.indexdatabase.de/db/i-single.php?id=58 + :return: index + """ + return (self.nir - self.red) / (self.nir + self.red) + + def BNDVI(self): + """ + Normalized Difference self.nir/self.blue self.blue-normalized difference + vegetation index + https://www.indexdatabase.de/db/i-single.php?id=135 + :return: index + """ + return (self.nir - self.blue) / (self.nir + self.blue) + + def redEdgeNDVI(self): + """ + Normalized Difference self.rededge/self.red + https://www.indexdatabase.de/db/i-single.php?id=235 + :return: index + """ + return (self.redEdge - self.red) / (self.redEdge + self.red) + + def GNDVI(self): + """ + Normalized Difference self.nir/self.green self.green NDVI + https://www.indexdatabase.de/db/i-single.php?id=401 + :return: index + """ + return (self.nir - self.green) / (self.nir + self.green) + + def GBNDVI(self): + """ + self.green-self.blue NDVI + https://www.indexdatabase.de/db/i-single.php?id=186 + :return: index + """ + return (self.nir - (self.green + self.blue)) / ( + self.nir + (self.green + self.blue) + ) + + def GRNDVI(self): + """ + self.green-self.red NDVI + https://www.indexdatabase.de/db/i-single.php?id=185 + :return: index + """ + return (self.nir - (self.green + self.red)) / ( + self.nir + (self.green + self.red) + ) + + def RBNDVI(self): + """ + self.red-self.blue NDVI + https://www.indexdatabase.de/db/i-single.php?id=187 + :return: index + """ + return (self.nir - (self.blue + self.red)) / (self.nir + (self.blue + self.red)) + + def PNDVI(self): + """ + Pan NDVI + https://www.indexdatabase.de/db/i-single.php?id=188 + :return: index + """ + return (self.nir - (self.green + self.red + self.blue)) / ( + self.nir + (self.green + self.red + self.blue) + ) + + def ATSAVI(self, X=0.08, a=1.22, b=0.03): + """ + Adjusted transformed soil-adjusted VI + https://www.indexdatabase.de/db/i-single.php?id=209 + :return: index + """ + return a * ( + (self.nir - a * self.red - b) + / (a * self.nir + self.red - a * b + X * (1 + a ** 2)) + ) + + def BWDRVI(self): + """ + self.blue-wide dynamic range vegetation index + https://www.indexdatabase.de/db/i-single.php?id=136 + :return: index + """ + return (0.1 * self.nir - self.blue) / (0.1 * self.nir + self.blue) + + def CIgreen(self): + """ + Chlorophyll Index self.green + https://www.indexdatabase.de/db/i-single.php?id=128 + :return: index + """ + return (self.nir / self.green) - 1 + + def CIrededge(self): + """ + Chlorophyll Index self.redEdge + https://www.indexdatabase.de/db/i-single.php?id=131 + :return: index + """ + return (self.nir / self.redEdge) - 1 + + def CI(self): + """ + Coloration Index + https://www.indexdatabase.de/db/i-single.php?id=11 + :return: index + """ + return (self.red - self.blue) / self.red + + def CTVI(self): + """ + Corrected Transformed Vegetation Index + https://www.indexdatabase.de/db/i-single.php?id=244 + :return: index + """ + ndvi = self.NDVI() + return ((ndvi + 0.5) / (abs(ndvi + 0.5))) * (abs(ndvi + 0.5) ** (1 / 2)) + + def GDVI(self): + """ + Difference self.nir/self.green self.green Difference Vegetation Index + https://www.indexdatabase.de/db/i-single.php?id=27 + :return: index + """ + return self.nir - self.green + + def EVI(self): + """ + Enhanced Vegetation Index + https://www.indexdatabase.de/db/i-single.php?id=16 + :return: index + """ + return 2.5 * ( + (self.nir - self.red) / (self.nir + 6 * self.red - 7.5 * self.blue + 1) + ) + + def GEMI(self): + """ + Global Environment Monitoring Index + https://www.indexdatabase.de/db/i-single.php?id=25 + :return: index + """ + n = (2 * (self.nir ** 2 - self.red ** 2) + 1.5 * self.nir + 0.5 * self.red) / ( + self.nir + self.red + 0.5 + ) + return n * (1 - 0.25 * n) - (self.red - 0.125) / (1 - self.red) + + def GOSAVI(self, Y=0.16): + """ + self.green Optimized Soil Adjusted Vegetation Index + https://www.indexdatabase.de/db/i-single.php?id=29 + mit Y = 0,16 + :return: index + """ + return (self.nir - self.green) / (self.nir + self.green + Y) + + def GSAVI(self, L=0.5): + """ + self.green Soil Adjusted Vegetation Index + https://www.indexdatabase.de/db/i-single.php?id=31 + mit L = 0,5 + :return: index + """ + return ((self.nir - self.green) / (self.nir + self.green + L)) * (1 + L) + + def Hue(self): + """ + Hue + https://www.indexdatabase.de/db/i-single.php?id=34 + :return: index + """ + return np.arctan( + ((2 * self.red - self.green - self.blue) / 30.5) * (self.green - self.blue) + ) + + def IVI(self, a=None, b=None): + """ + Ideal vegetation index + https://www.indexdatabase.de/db/i-single.php?id=276 + b=intercept of vegetation line + a=soil line slope + :return: index + """ + return (self.nir - b) / (a * self.red) + + def IPVI(self): + """ + Infraself.red percentage vegetation index + https://www.indexdatabase.de/db/i-single.php?id=35 + :return: index + """ + return (self.nir / ((self.nir + self.red) / 2)) * (self.NDVI() + 1) + + def I(self): # noqa: E741,E743 + """ + Intensity + https://www.indexdatabase.de/db/i-single.php?id=36 + :return: index + """ + return (self.red + self.green + self.blue) / 30.5 + + def RVI(self): + """ + Ratio-Vegetation-Index + http://www.seos-project.eu/modules/remotesensing/remotesensing-c03-s01-p01.html + :return: index + """ + return self.nir / self.red + + def MRVI(self): + """ + Modified Normalized Difference Vegetation Index RVI + https://www.indexdatabase.de/db/i-single.php?id=275 + :return: index + """ + return (self.RVI() - 1) / (self.RVI() + 1) + + def MSAVI(self): + """ + Modified Soil Adjusted Vegetation Index + https://www.indexdatabase.de/db/i-single.php?id=44 + :return: index + """ + return ( + (2 * self.nir + 1) + - ((2 * self.nir + 1) ** 2 - 8 * (self.nir - self.red)) ** (1 / 2) + ) / 2 + + def NormG(self): + """ + Norm G + https://www.indexdatabase.de/db/i-single.php?id=50 + :return: index + """ + return self.green / (self.nir + self.red + self.green) + + def NormNIR(self): + """ + Norm self.nir + https://www.indexdatabase.de/db/i-single.php?id=51 + :return: index + """ + return self.nir / (self.nir + self.red + self.green) + + def NormR(self): + """ + Norm R + https://www.indexdatabase.de/db/i-single.php?id=52 + :return: index + """ + return self.red / (self.nir + self.red + self.green) + + def NGRDI(self): + """ + Normalized Difference self.green/self.red Normalized self.green self.red + difference index, Visible Atmospherically Resistant Indices self.green + (VIself.green) + https://www.indexdatabase.de/db/i-single.php?id=390 + :return: index + """ + return (self.green - self.red) / (self.green + self.red) + + def RI(self): + """ + Normalized Difference self.red/self.green self.redness Index + https://www.indexdatabase.de/db/i-single.php?id=74 + :return: index + """ + return (self.red - self.green) / (self.red + self.green) + + def S(self): + """ + Saturation + https://www.indexdatabase.de/db/i-single.php?id=77 + :return: index + """ + max = np.max([np.max(self.red), np.max(self.green), np.max(self.blue)]) + min = np.min([np.min(self.red), np.min(self.green), np.min(self.blue)]) + return (max - min) / max + + def IF(self): + """ + Shape Index + https://www.indexdatabase.de/db/i-single.php?id=79 + :return: index + """ + return (2 * self.red - self.green - self.blue) / (self.green - self.blue) + + def DVI(self): + """ + Simple Ratio self.nir/self.red Difference Vegetation Index, Vegetation Index + Number (VIN) + https://www.indexdatabase.de/db/i-single.php?id=12 + :return: index + """ + return self.nir / self.red + + def TVI(self): + """ + Transformed Vegetation Index + https://www.indexdatabase.de/db/i-single.php?id=98 + :return: index + """ + return (self.NDVI() + 0.5) ** (1 / 2) + + def NDRE(self): + return (self.nir - self.redEdge) / (self.nir + self.redEdge) + + +""" +# genering a random matrices to test this class +red = np.ones((1000,1000, 1),dtype="float64") * 46787 +green = np.ones((1000,1000, 1),dtype="float64") * 23487 +blue = np.ones((1000,1000, 1),dtype="float64") * 14578 +redEdge = np.ones((1000,1000, 1),dtype="float64") * 51045 +nir = np.ones((1000,1000, 1),dtype="float64") * 52200 + +# Examples of how to use the class + +# instantiating the class +cl = IndexCalculation() + +# instantiating the class with the values +#cl = indexCalculation(red=red, green=green, blue=blue, redEdge=redEdge, nir=nir) + +# how set the values after instantiate the class cl, (for update the data or when don't +# instantiating the class with the values) +cl.setMatrices(red=red, green=green, blue=blue, redEdge=redEdge, nir=nir) + +# calculating the indices for the instantiated values in the class + # Note: the CCCI index can be changed to any index implemented in the class. +indexValue_form1 = cl.calculation("CCCI", red=red, green=green, blue=blue, + redEdge=redEdge, nir=nir).astype(np.float64) +indexValue_form2 = cl.CCCI() + +# calculating the index with the values directly -- you can set just the values +# preferred note: the *calculation* function performs the function *setMatrices* +indexValue_form3 = cl.calculation("CCCI", red=red, green=green, blue=blue, + redEdge=redEdge, nir=nir).astype(np.float64) + +print("Form 1: "+np.array2string(indexValue_form1, precision=20, separator=', ', + floatmode='maxprec_equal')) +print("Form 2: "+np.array2string(indexValue_form2, precision=20, separator=', ', + floatmode='maxprec_equal')) +print("Form 3: "+np.array2string(indexValue_form3, precision=20, separator=', ', + floatmode='maxprec_equal')) + +# A list of examples results for different type of data at NDVI +# float16 -> 0.31567383 #NDVI (red = 50, nir = 100) +# float32 -> 0.31578946 #NDVI (red = 50, nir = 100) +# float64 -> 0.3157894736842105 #NDVI (red = 50, nir = 100) +# longdouble -> 0.3157894736842105 #NDVI (red = 50, nir = 100) +""" diff --git a/python-mega-algo/digital_image_processing/resize/__init__.py b/python-mega-algo/digital_image_processing/resize/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/digital_image_processing/resize/resize.py b/python-mega-algo/digital_image_processing/resize/resize.py new file mode 100644 index 00000000..4836521f --- /dev/null +++ b/python-mega-algo/digital_image_processing/resize/resize.py @@ -0,0 +1,71 @@ +""" Multiple image resizing techniques """ +import numpy as np +from cv2 import destroyAllWindows, imread, imshow, waitKey + + +class NearestNeighbour: + """ + Simplest and fastest version of image resizing. + Source: https://en.wikipedia.org/wiki/Nearest-neighbor_interpolation + """ + + def __init__(self, img, dst_width: int, dst_height: int): + if dst_width < 0 or dst_height < 0: + raise ValueError("Destination width/height should be > 0") + + self.img = img + self.src_w = img.shape[1] + self.src_h = img.shape[0] + self.dst_w = dst_width + self.dst_h = dst_height + + self.ratio_x = self.src_w / self.dst_w + self.ratio_y = self.src_h / self.dst_h + + self.output = self.output_img = ( + np.ones((self.dst_h, self.dst_w, 3), np.uint8) * 255 + ) + + def process(self): + for i in range(self.dst_h): + for j in range(self.dst_w): + self.output[i][j] = self.img[self.get_y(i)][self.get_x(j)] + + def get_x(self, x: int) -> int: + """ + Get parent X coordinate for destination X + :param x: Destination X coordinate + :return: Parent X coordinate based on `x ratio` + >>> nn = NearestNeighbour(imread("digital_image_processing/image_data/lena.jpg", + ... 1), 100, 100) + >>> nn.ratio_x = 0.5 + >>> nn.get_x(4) + 2 + """ + return int(self.ratio_x * x) + + def get_y(self, y: int) -> int: + """ + Get parent Y coordinate for destination Y + :param y: Destination X coordinate + :return: Parent X coordinate based on `y ratio` + >>> nn = NearestNeighbour(imread("digital_image_processing/image_data/lena.jpg", + ... 1), 100, 100) + >>> nn.ratio_y = 0.5 + >>> nn.get_y(4) + 2 + """ + return int(self.ratio_y * y) + + +if __name__ == "__main__": + dst_w, dst_h = 800, 600 + im = imread("image_data/lena.jpg", 1) + n = NearestNeighbour(im, dst_w, dst_h) + n.process() + + imshow( + f"Image resized from: {im.shape[1]}x{im.shape[0]} to {dst_w}x{dst_h}", n.output + ) + waitKey(0) + destroyAllWindows() diff --git a/python-mega-algo/digital_image_processing/resize/right.html b/python-mega-algo/digital_image_processing/resize/right.html new file mode 100644 index 00000000..a086813e --- /dev/null +++ b/python-mega-algo/digital_image_processing/resize/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/digital_image_processing/resize + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    resize.py __init__.py 
    + +

    +Folders: 1
    +Files: 2
    +Size of all files: 2221 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/digital_image_processing/right.html b/python-mega-algo/digital_image_processing/right.html new file mode 100644 index 00000000..a931b390 --- /dev/null +++ b/python-mega-algo/digital_image_processing/right.html @@ -0,0 +1,31 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/digital_image_processing + + + + + + + + + +
    Folders
    <Go Back> edge_detection histogram...zation resize
    dithering filters image_data rotation
    +
    + + + + + +
    FileFileFileFile
    change_br...ess.py convert_t...ive.py sepia.py __init__.py 
    change_contrast.py index_cal...ion.py test_digi...ing.py 
    + +

    +Folders: 8
    +Files: 7
    +Size of all files: 26309 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/digital_image_processing/rotation/__init__.py b/python-mega-algo/digital_image_processing/rotation/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/digital_image_processing/rotation/right.html b/python-mega-algo/digital_image_processing/rotation/right.html new file mode 100644 index 00000000..592dc640 --- /dev/null +++ b/python-mega-algo/digital_image_processing/rotation/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/digital_image_processing/rotation + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    rotation.py __init__.py 
    + +

    +Folders: 1
    +Files: 2
    +Size of all files: 1783 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/digital_image_processing/rotation/rotation.py b/python-mega-algo/digital_image_processing/rotation/rotation.py new file mode 100644 index 00000000..958d16fa --- /dev/null +++ b/python-mega-algo/digital_image_processing/rotation/rotation.py @@ -0,0 +1,56 @@ +from pathlib import Path + +import cv2 +import numpy as np +from matplotlib import pyplot as plt + + +def get_rotation( + img: np.ndarray, pt1: np.ndarray, pt2: np.ndarray, rows: int, cols: int +) -> np.ndarray: + """ + Get image rotation + :param img: np.array + :param pt1: 3x2 list + :param pt2: 3x2 list + :param rows: columns image shape + :param cols: rows image shape + :return: np.array + """ + matrix = cv2.getAffineTransform(pt1, pt2) + return cv2.warpAffine(img, matrix, (rows, cols)) + + +if __name__ == "__main__": + # read original image + image = cv2.imread( + str(Path(__file__).resolve().parent.parent / "image_data" / "lena.jpg") + ) + # turn image in gray scale value + gray_img = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) + # get image shape + img_rows, img_cols = gray_img.shape + + # set different points to rotate image + pts1 = np.array([[50, 50], [200, 50], [50, 200]], np.float32) + pts2 = np.array([[10, 100], [200, 50], [100, 250]], np.float32) + pts3 = np.array([[50, 50], [150, 50], [120, 200]], np.float32) + pts4 = np.array([[10, 100], [80, 50], [180, 250]], np.float32) + + # add all rotated images in a list + images = [ + gray_img, + get_rotation(gray_img, pts1, pts2, img_rows, img_cols), + get_rotation(gray_img, pts2, pts3, img_rows, img_cols), + get_rotation(gray_img, pts2, pts4, img_rows, img_cols), + ] + + # plot different image rotations + fig = plt.figure(1) + titles = ["Original", "Rotation 1", "Rotation 2", "Rotation 3"] + for i, image in enumerate(images): + plt.subplot(2, 2, i + 1), plt.imshow(image, "gray") + plt.title(titles[i]) + plt.axis("off") + plt.subplots_adjust(left=0.0, bottom=0.05, right=1.0, top=0.95) + plt.show() diff --git a/python-mega-algo/digital_image_processing/sepia.py b/python-mega-algo/digital_image_processing/sepia.py new file mode 100644 index 00000000..e9dd2c06 --- /dev/null +++ b/python-mega-algo/digital_image_processing/sepia.py @@ -0,0 +1,50 @@ +""" + Implemented an algorithm using opencv to tone an image with sepia technique +""" +from cv2 import destroyAllWindows, imread, imshow, waitKey + + +def make_sepia(img, factor: int): + """ + Function create sepia tone. + Source: https://en.wikipedia.org/wiki/Sepia_(color) + """ + pixel_h, pixel_v = img.shape[0], img.shape[1] + + def to_grayscale(blue, green, red): + """ + Helper function to create pixel's greyscale representation + Src: https://pl.wikipedia.org/wiki/YUV + """ + return 0.2126 * red + 0.587 * green + 0.114 * blue + + def normalize(value): + """Helper function to normalize R/G/B value -> return 255 if value > 255""" + return min(value, 255) + + for i in range(pixel_h): + for j in range(pixel_v): + greyscale = int(to_grayscale(*img[i][j])) + img[i][j] = [ + normalize(greyscale), + normalize(greyscale + factor), + normalize(greyscale + 2 * factor), + ] + + return img + + +if __name__ == "__main__": + # read original image + images = { + percentage: imread("image_data/lena.jpg", 1) for percentage in (10, 20, 30, 40) + } + + for percentage, img in images.items(): + make_sepia(img, percentage) + + for percentage, img in images.items(): + imshow(f"Original image with sepia (factor: {percentage})", img) + + waitKey(0) + destroyAllWindows() diff --git a/python-mega-algo/digital_image_processing/test_digital_image_processing.py b/python-mega-algo/digital_image_processing/test_digital_image_processing.py new file mode 100644 index 00000000..40f2f7b8 --- /dev/null +++ b/python-mega-algo/digital_image_processing/test_digital_image_processing.py @@ -0,0 +1,93 @@ +""" +PyTest's for Digital Image Processing +""" +from cv2 import COLOR_BGR2GRAY, cvtColor, imread +from numpy import array, uint8 +from PIL import Image + +from digital_image_processing import change_contrast as cc +from digital_image_processing import convert_to_negative as cn +from digital_image_processing import sepia as sp +from digital_image_processing.dithering import burkes as bs +from digital_image_processing.edge_detection import canny as canny +from digital_image_processing.filters import convolve as conv +from digital_image_processing.filters import gaussian_filter as gg +from digital_image_processing.filters import median_filter as med +from digital_image_processing.filters import sobel_filter as sob +from digital_image_processing.resize import resize as rs + +img = imread(r"digital_image_processing/image_data/lena_small.jpg") +gray = cvtColor(img, COLOR_BGR2GRAY) + + +# Test: convert_to_negative() +def test_convert_to_negative(): + negative_img = cn.convert_to_negative(img) + # assert negative_img array for at least one True + assert negative_img.any() + + +# Test: change_contrast() +def test_change_contrast(): + with Image.open("digital_image_processing/image_data/lena_small.jpg") as img: + # Work around assertion for response + assert str(cc.change_contrast(img, 110)).startswith( + " Divide and conquer +The points are sorted based on Xco-ords and +then based on Yco-ords separately. +And by applying divide and conquer approach, +minimum distance is obtained recursively. + +>> Closest points can lie on different sides of partition. +This case handled by forming a strip of points +whose Xco-ords distance is less than closest_pair_dis +from mid-point's Xco-ords. Points sorted based on Yco-ords +are used in this step to reduce sorting time. +Closest pair distance is found in the strip of points. (closest_in_strip) + +min(closest_pair_dis, closest_in_strip) would be the final answer. + +Time complexity: O(n * log n) +""" + + +def euclidean_distance_sqr(point1, point2): + """ + >>> euclidean_distance_sqr([1,2],[2,4]) + 5 + """ + return (point1[0] - point2[0]) ** 2 + (point1[1] - point2[1]) ** 2 + + +def column_based_sort(array, column=0): + """ + >>> column_based_sort([(5, 1), (4, 2), (3, 0)], 1) + [(3, 0), (5, 1), (4, 2)] + """ + return sorted(array, key=lambda x: x[column]) + + +def dis_between_closest_pair(points, points_counts, min_dis=float("inf")): + """ + brute force approach to find distance between closest pair points + + Parameters : + points, points_count, min_dis (list(tuple(int, int)), int, int) + + Returns : + min_dis (float): distance between closest pair of points + + >>> dis_between_closest_pair([[1,2],[2,4],[5,7],[8,9],[11,0]],5) + 5 + + """ + + for i in range(points_counts - 1): + for j in range(i + 1, points_counts): + current_dis = euclidean_distance_sqr(points[i], points[j]) + if current_dis < min_dis: + min_dis = current_dis + return min_dis + + +def dis_between_closest_in_strip(points, points_counts, min_dis=float("inf")): + """ + closest pair of points in strip + + Parameters : + points, points_count, min_dis (list(tuple(int, int)), int, int) + + Returns : + min_dis (float): distance btw closest pair of points in the strip (< min_dis) + + >>> dis_between_closest_in_strip([[1,2],[2,4],[5,7],[8,9],[11,0]],5) + 85 + """ + + for i in range(min(6, points_counts - 1), points_counts): + for j in range(max(0, i - 6), i): + current_dis = euclidean_distance_sqr(points[i], points[j]) + if current_dis < min_dis: + min_dis = current_dis + return min_dis + + +def closest_pair_of_points_sqr(points_sorted_on_x, points_sorted_on_y, points_counts): + """divide and conquer approach + + Parameters : + points, points_count (list(tuple(int, int)), int) + + Returns : + (float): distance btw closest pair of points + + >>> closest_pair_of_points_sqr([(1, 2), (3, 4)], [(5, 6), (7, 8)], 2) + 8 + """ + + # base case + if points_counts <= 3: + return dis_between_closest_pair(points_sorted_on_x, points_counts) + + # recursion + mid = points_counts // 2 + closest_in_left = closest_pair_of_points_sqr( + points_sorted_on_x, points_sorted_on_y[:mid], mid + ) + closest_in_right = closest_pair_of_points_sqr( + points_sorted_on_y, points_sorted_on_y[mid:], points_counts - mid + ) + closest_pair_dis = min(closest_in_left, closest_in_right) + + """ + cross_strip contains the points, whose Xcoords are at a + distance(< closest_pair_dis) from mid's Xcoord + """ + + cross_strip = [] + for point in points_sorted_on_x: + if abs(point[0] - points_sorted_on_x[mid][0]) < closest_pair_dis: + cross_strip.append(point) + + closest_in_strip = dis_between_closest_in_strip( + cross_strip, len(cross_strip), closest_pair_dis + ) + return min(closest_pair_dis, closest_in_strip) + + +def closest_pair_of_points(points, points_counts): + """ + >>> closest_pair_of_points([(2, 3), (12, 30)], len([(2, 3), (12, 30)])) + 28.792360097775937 + """ + points_sorted_on_x = column_based_sort(points, column=0) + points_sorted_on_y = column_based_sort(points, column=1) + return ( + closest_pair_of_points_sqr( + points_sorted_on_x, points_sorted_on_y, points_counts + ) + ) ** 0.5 + + +if __name__ == "__main__": + points = [(2, 3), (12, 30), (40, 50), (5, 1), (12, 10), (3, 4)] + print("Distance:", closest_pair_of_points(points, len(points))) diff --git a/python-mega-algo/divide_and_conquer/convex_hull.py b/python-mega-algo/divide_and_conquer/convex_hull.py new file mode 100644 index 00000000..9c096f67 --- /dev/null +++ b/python-mega-algo/divide_and_conquer/convex_hull.py @@ -0,0 +1,506 @@ +""" +The convex hull problem is problem of finding all the vertices of convex polygon, P of +a set of points in a plane such that all the points are either on the vertices of P or +inside P. TH convex hull problem has several applications in geometrical problems, +computer graphics and game development. + +Two algorithms have been implemented for the convex hull problem here. +1. A brute-force algorithm which runs in O(n^3) +2. A divide-and-conquer algorithm which runs in O(n log(n)) + +There are other several other algorithms for the convex hull problem +which have not been implemented here, yet. + +""" + +from typing import Iterable, List, Set, Union + + +class Point: + """ + Defines a 2-d point for use by all convex-hull algorithms. + + Parameters + ---------- + x: an int or a float, the x-coordinate of the 2-d point + y: an int or a float, the y-coordinate of the 2-d point + + Examples + -------- + >>> Point(1, 2) + (1.0, 2.0) + >>> Point("1", "2") + (1.0, 2.0) + >>> Point(1, 2) > Point(0, 1) + True + >>> Point(1, 1) == Point(1, 1) + True + >>> Point(-0.5, 1) == Point(0.5, 1) + False + >>> Point("pi", "e") + Traceback (most recent call last): + ... + ValueError: could not convert string to float: 'pi' + """ + + def __init__(self, x, y): + self.x, self.y = float(x), float(y) + + def __eq__(self, other): + return self.x == other.x and self.y == other.y + + def __ne__(self, other): + return not self == other + + def __gt__(self, other): + if self.x > other.x: + return True + elif self.x == other.x: + return self.y > other.y + return False + + def __lt__(self, other): + return not self > other + + def __ge__(self, other): + if self.x > other.x: + return True + elif self.x == other.x: + return self.y >= other.y + return False + + def __le__(self, other): + if self.x < other.x: + return True + elif self.x == other.x: + return self.y <= other.y + return False + + def __repr__(self): + return f"({self.x}, {self.y})" + + def __hash__(self): + return hash(self.x) + + +def _construct_points( + list_of_tuples: Union[List[Point], List[List[float]], Iterable[List[float]]] +) -> List[Point]: + """ + constructs a list of points from an array-like object of numbers + + Arguments + --------- + + list_of_tuples: array-like object of type numbers. Acceptable types so far + are lists, tuples and sets. + + Returns + -------- + points: a list where each item is of type Point. This contains only objects + which can be converted into a Point. + + Examples + ------- + >>> _construct_points([[1, 1], [2, -1], [0.3, 4]]) + [(1.0, 1.0), (2.0, -1.0), (0.3, 4.0)] + >>> _construct_points([1, 2]) + Ignoring deformed point 1. All points must have at least 2 coordinates. + Ignoring deformed point 2. All points must have at least 2 coordinates. + [] + >>> _construct_points([]) + [] + >>> _construct_points(None) + [] + """ + + points: List[Point] = [] + if list_of_tuples: + for p in list_of_tuples: + if isinstance(p, Point): + points.append(p) + else: + try: + points.append(Point(p[0], p[1])) + except (IndexError, TypeError): + print( + f"Ignoring deformed point {p}. All points" + " must have at least 2 coordinates." + ) + return points + + +def _validate_input(points: Union[List[Point], List[List[float]]]) -> List[Point]: + """ + validates an input instance before a convex-hull algorithms uses it + + Parameters + --------- + points: array-like, the 2d points to validate before using with + a convex-hull algorithm. The elements of points must be either lists, tuples or + Points. + + Returns + ------- + points: array_like, an iterable of all well-defined Points constructed passed in. + + + Exception + --------- + ValueError: if points is empty or None, or if a wrong data structure like a scalar + is passed + + TypeError: if an iterable but non-indexable object (eg. dictionary) is passed. + The exception to this a set which we'll convert to a list before using + + + Examples + ------- + >>> _validate_input([[1, 2]]) + [(1.0, 2.0)] + >>> _validate_input([(1, 2)]) + [(1.0, 2.0)] + >>> _validate_input([Point(2, 1), Point(-1, 2)]) + [(2.0, 1.0), (-1.0, 2.0)] + >>> _validate_input([]) + Traceback (most recent call last): + ... + ValueError: Expecting a list of points but got [] + >>> _validate_input(1) + Traceback (most recent call last): + ... + ValueError: Expecting an iterable object but got an non-iterable type 1 + """ + + if not hasattr(points, "__iter__"): + raise ValueError( + f"Expecting an iterable object but got an non-iterable type {points}" + ) + + if not points: + raise ValueError(f"Expecting a list of points but got {points}") + + return _construct_points(points) + + +def _det(a: Point, b: Point, c: Point) -> float: + """ + Computes the sign perpendicular distance of a 2d point c from a line segment + ab. The sign indicates the direction of c relative to ab. + A Positive value means c is above ab (to the left), while a negative value + means c is below ab (to the right). 0 means all three points are on a straight line. + + As a side note, 0.5 * abs|det| is the area of triangle abc + + Parameters + ---------- + a: point, the point on the left end of line segment ab + b: point, the point on the right end of line segment ab + c: point, the point for which the direction and location is desired. + + Returns + -------- + det: float, abs(det) is the distance of c from ab. The sign + indicates which side of line segment ab c is. det is computed as + (a_xb_y + c_xa_y + b_xc_y) - (a_yb_x + c_ya_x + b_yc_x) + + Examples + ---------- + >>> _det(Point(1, 1), Point(1, 2), Point(1, 5)) + 0.0 + >>> _det(Point(0, 0), Point(10, 0), Point(0, 10)) + 100.0 + >>> _det(Point(0, 0), Point(10, 0), Point(0, -10)) + -100.0 + """ + + det = (a.x * b.y + b.x * c.y + c.x * a.y) - (a.y * b.x + b.y * c.x + c.y * a.x) + return det + + +def convex_hull_bf(points: List[Point]) -> List[Point]: + """ + Constructs the convex hull of a set of 2D points using a brute force algorithm. + The algorithm basically considers all combinations of points (i, j) and uses the + definition of convexity to determine whether (i, j) is part of the convex hull or + not. (i, j) is part of the convex hull if and only iff there are no points on both + sides of the line segment connecting the ij, and there is no point k such that k is + on either end of the ij. + + Runtime: O(n^3) - definitely horrible + + Parameters + --------- + points: array-like of object of Points, lists or tuples. + The set of 2d points for which the convex-hull is needed + + Returns + ------ + convex_set: list, the convex-hull of points sorted in non-decreasing order. + + See Also + -------- + convex_hull_recursive, + + Examples + --------- + >>> convex_hull_bf([[0, 0], [1, 0], [10, 1]]) + [(0.0, 0.0), (1.0, 0.0), (10.0, 1.0)] + >>> convex_hull_bf([[0, 0], [1, 0], [10, 0]]) + [(0.0, 0.0), (10.0, 0.0)] + >>> convex_hull_bf([[-1, 1],[-1, -1], [0, 0], [0.5, 0.5], [1, -1], [1, 1], + ... [-0.75, 1]]) + [(-1.0, -1.0), (-1.0, 1.0), (1.0, -1.0), (1.0, 1.0)] + >>> convex_hull_bf([(0, 3), (2, 2), (1, 1), (2, 1), (3, 0), (0, 0), (3, 3), + ... (2, -1), (2, -4), (1, -3)]) + [(0.0, 0.0), (0.0, 3.0), (1.0, -3.0), (2.0, -4.0), (3.0, 0.0), (3.0, 3.0)] + """ + + points = sorted(_validate_input(points)) + n = len(points) + convex_set = set() + + for i in range(n - 1): + for j in range(i + 1, n): + points_left_of_ij = points_right_of_ij = False + ij_part_of_convex_hull = True + for k in range(n): + if k != i and k != j: + det_k = _det(points[i], points[j], points[k]) + + if det_k > 0: + points_left_of_ij = True + elif det_k < 0: + points_right_of_ij = True + else: + # point[i], point[j], point[k] all lie on a straight line + # if point[k] is to the left of point[i] or it's to the + # right of point[j], then point[i], point[j] cannot be + # part of the convex hull of A + if points[k] < points[i] or points[k] > points[j]: + ij_part_of_convex_hull = False + break + + if points_left_of_ij and points_right_of_ij: + ij_part_of_convex_hull = False + break + + if ij_part_of_convex_hull: + convex_set.update([points[i], points[j]]) + + return sorted(convex_set) + + +def convex_hull_recursive(points: List[Point]) -> List[Point]: + """ + Constructs the convex hull of a set of 2D points using a divide-and-conquer strategy + The algorithm exploits the geometric properties of the problem by repeatedly + partitioning the set of points into smaller hulls, and finding the convex hull of + these smaller hulls. The union of the convex hull from smaller hulls is the + solution to the convex hull of the larger problem. + + Parameter + --------- + points: array-like of object of Points, lists or tuples. + The set of 2d points for which the convex-hull is needed + + Runtime: O(n log n) + + Returns + ------- + convex_set: list, the convex-hull of points sorted in non-decreasing order. + + Examples + --------- + >>> convex_hull_recursive([[0, 0], [1, 0], [10, 1]]) + [(0.0, 0.0), (1.0, 0.0), (10.0, 1.0)] + >>> convex_hull_recursive([[0, 0], [1, 0], [10, 0]]) + [(0.0, 0.0), (10.0, 0.0)] + >>> convex_hull_recursive([[-1, 1],[-1, -1], [0, 0], [0.5, 0.5], [1, -1], [1, 1], + ... [-0.75, 1]]) + [(-1.0, -1.0), (-1.0, 1.0), (1.0, -1.0), (1.0, 1.0)] + >>> convex_hull_recursive([(0, 3), (2, 2), (1, 1), (2, 1), (3, 0), (0, 0), (3, 3), + ... (2, -1), (2, -4), (1, -3)]) + [(0.0, 0.0), (0.0, 3.0), (1.0, -3.0), (2.0, -4.0), (3.0, 0.0), (3.0, 3.0)] + + """ + points = sorted(_validate_input(points)) + n = len(points) + + # divide all the points into an upper hull and a lower hull + # the left most point and the right most point are definitely + # members of the convex hull by definition. + # use these two anchors to divide all the points into two hulls, + # an upper hull and a lower hull. + + # all points to the left (above) the line joining the extreme points belong to the + # upper hull + # all points to the right (below) the line joining the extreme points below to the + # lower hull + # ignore all points on the line joining the extreme points since they cannot be + # part of the convex hull + + left_most_point = points[0] + right_most_point = points[n - 1] + + convex_set = {left_most_point, right_most_point} + upper_hull = [] + lower_hull = [] + + for i in range(1, n - 1): + det = _det(left_most_point, right_most_point, points[i]) + + if det > 0: + upper_hull.append(points[i]) + elif det < 0: + lower_hull.append(points[i]) + + _construct_hull(upper_hull, left_most_point, right_most_point, convex_set) + _construct_hull(lower_hull, right_most_point, left_most_point, convex_set) + + return sorted(convex_set) + + +def _construct_hull( + points: List[Point], left: Point, right: Point, convex_set: Set[Point] +) -> None: + """ + + Parameters + --------- + points: list or None, the hull of points from which to choose the next convex-hull + point + left: Point, the point to the left of line segment joining left and right + right: The point to the right of the line segment joining left and right + convex_set: set, the current convex-hull. The state of convex-set gets updated by + this function + + Note + ---- + For the line segment 'ab', 'a' is on the left and 'b' on the right. + but the reverse is true for the line segment 'ba'. + + Returns + ------- + Nothing, only updates the state of convex-set + """ + if points: + extreme_point = None + extreme_point_distance = float("-inf") + candidate_points = [] + + for p in points: + det = _det(left, right, p) + + if det > 0: + candidate_points.append(p) + + if det > extreme_point_distance: + extreme_point_distance = det + extreme_point = p + + if extreme_point: + _construct_hull(candidate_points, left, extreme_point, convex_set) + convex_set.add(extreme_point) + _construct_hull(candidate_points, extreme_point, right, convex_set) + + +def convex_hull_melkman(points: List[Point]) -> List[Point]: + """ + Constructs the convex hull of a set of 2D points using the melkman algorithm. + The algorithm works by iteratively inserting points of a simple polygonal chain + (meaning that no line segments between two consecutive points cross each other). + Sorting the points yields such a polygonal chain. + + For a detailed description, see http://cgm.cs.mcgill.ca/~athens/cs601/Melkman.html + + Runtime: O(n log n) - O(n) if points are already sorted in the input + + Parameters + --------- + points: array-like of object of Points, lists or tuples. + The set of 2d points for which the convex-hull is needed + + Returns + ------ + convex_set: list, the convex-hull of points sorted in non-decreasing order. + + See Also + -------- + + Examples + --------- + >>> convex_hull_melkman([[0, 0], [1, 0], [10, 1]]) + [(0.0, 0.0), (1.0, 0.0), (10.0, 1.0)] + >>> convex_hull_melkman([[0, 0], [1, 0], [10, 0]]) + [(0.0, 0.0), (10.0, 0.0)] + >>> convex_hull_melkman([[-1, 1],[-1, -1], [0, 0], [0.5, 0.5], [1, -1], [1, 1], + ... [-0.75, 1]]) + [(-1.0, -1.0), (-1.0, 1.0), (1.0, -1.0), (1.0, 1.0)] + >>> convex_hull_melkman([(0, 3), (2, 2), (1, 1), (2, 1), (3, 0), (0, 0), (3, 3), + ... (2, -1), (2, -4), (1, -3)]) + [(0.0, 0.0), (0.0, 3.0), (1.0, -3.0), (2.0, -4.0), (3.0, 0.0), (3.0, 3.0)] + """ + points = sorted(_validate_input(points)) + n = len(points) + + convex_hull = points[:2] + for i in range(2, n): + det = _det(convex_hull[1], convex_hull[0], points[i]) + if det > 0: + convex_hull.insert(0, points[i]) + break + elif det < 0: + convex_hull.append(points[i]) + break + else: + convex_hull[1] = points[i] + i += 1 + + for i in range(i, n): + if ( + _det(convex_hull[0], convex_hull[-1], points[i]) > 0 + and _det(convex_hull[-1], convex_hull[0], points[1]) < 0 + ): + # The point lies within the convex hull + continue + + convex_hull.insert(0, points[i]) + convex_hull.append(points[i]) + while _det(convex_hull[0], convex_hull[1], convex_hull[2]) >= 0: + del convex_hull[1] + while _det(convex_hull[-1], convex_hull[-2], convex_hull[-3]) <= 0: + del convex_hull[-2] + + # `convex_hull` is contains the convex hull in circular order + return sorted(convex_hull[1:] if len(convex_hull) > 3 else convex_hull) + + +def main(): + points = [ + (0, 3), + (2, 2), + (1, 1), + (2, 1), + (3, 0), + (0, 0), + (3, 3), + (2, -1), + (2, -4), + (1, -3), + ] + # the convex set of points is + # [(0, 0), (0, 3), (1, -3), (2, -4), (3, 0), (3, 3)] + results_bf = convex_hull_bf(points) + + results_recursive = convex_hull_recursive(points) + assert results_bf == results_recursive + + results_melkman = convex_hull_melkman(points) + assert results_bf == results_melkman + + print(results_bf) + + +if __name__ == "__main__": + main() diff --git a/python-mega-algo/divide_and_conquer/heaps_algorithm.py b/python-mega-algo/divide_and_conquer/heaps_algorithm.py new file mode 100644 index 00000000..af30ad66 --- /dev/null +++ b/python-mega-algo/divide_and_conquer/heaps_algorithm.py @@ -0,0 +1,56 @@ +""" +Heap's algorithm returns the list of all permutations possible from a list. +It minimizes movement by generating each permutation from the previous one +by swapping only two elements. +More information: +https://en.wikipedia.org/wiki/Heap%27s_algorithm. +""" + + +def heaps(arr: list) -> list: + """ + Pure python implementation of the Heap's algorithm (recursive version), + returning all permutations of a list. + >>> heaps([]) + [()] + >>> heaps([0]) + [(0,)] + >>> heaps([-1, 1]) + [(-1, 1), (1, -1)] + >>> heaps([1, 2, 3]) + [(1, 2, 3), (2, 1, 3), (3, 1, 2), (1, 3, 2), (2, 3, 1), (3, 2, 1)] + >>> from itertools import permutations + >>> sorted(heaps([1,2,3])) == sorted(permutations([1,2,3])) + True + >>> all(sorted(heaps(x)) == sorted(permutations(x)) + ... for x in ([], [0], [-1, 1], [1, 2, 3])) + True + """ + + if len(arr) <= 1: + return [tuple(arr)] + + res = [] + + def generate(k: int, arr: list): + if k == 1: + res.append(tuple(arr[:])) + return + + generate(k - 1, arr) + + for i in range(k - 1): + if k % 2 == 0: # k is even + arr[i], arr[k - 1] = arr[k - 1], arr[i] + else: # k is odd + arr[0], arr[k - 1] = arr[k - 1], arr[0] + generate(k - 1, arr) + + generate(len(arr), arr) + return res + + +if __name__ == "__main__": + user_input = input("Enter numbers separated by a comma:\n").strip() + arr = [int(item) for item in user_input.split(",")] + print(heaps(arr)) diff --git a/python-mega-algo/divide_and_conquer/heaps_algorithm_iterative.py b/python-mega-algo/divide_and_conquer/heaps_algorithm_iterative.py new file mode 100644 index 00000000..4dab41f5 --- /dev/null +++ b/python-mega-algo/divide_and_conquer/heaps_algorithm_iterative.py @@ -0,0 +1,60 @@ +""" +Heap's (iterative) algorithm returns the list of all permutations possible from a list. +It minimizes movement by generating each permutation from the previous one +by swapping only two elements. +More information: +https://en.wikipedia.org/wiki/Heap%27s_algorithm. +""" + + +def heaps(arr: list) -> list: + """ + Pure python implementation of the iterative Heap's algorithm, + returning all permutations of a list. + >>> heaps([]) + [()] + >>> heaps([0]) + [(0,)] + >>> heaps([-1, 1]) + [(-1, 1), (1, -1)] + >>> heaps([1, 2, 3]) + [(1, 2, 3), (2, 1, 3), (3, 1, 2), (1, 3, 2), (2, 3, 1), (3, 2, 1)] + >>> from itertools import permutations + >>> sorted(heaps([1,2,3])) == sorted(permutations([1,2,3])) + True + >>> all(sorted(heaps(x)) == sorted(permutations(x)) + ... for x in ([], [0], [-1, 1], [1, 2, 3])) + True + """ + + if len(arr) <= 1: + return [tuple(arr)] + + res = [] + + def generate(n: int, arr: list): + c = [0] * n + res.append(tuple(arr)) + + i = 0 + while i < n: + if c[i] < i: + if i % 2 == 0: + arr[0], arr[i] = arr[i], arr[0] + else: + arr[c[i]], arr[i] = arr[i], arr[c[i]] + res.append(tuple(arr)) + c[i] += 1 + i = 0 + else: + c[i] = 0 + i += 1 + + generate(len(arr), arr) + return res + + +if __name__ == "__main__": + user_input = input("Enter numbers separated by a comma:\n").strip() + arr = [int(item) for item in user_input.split(",")] + print(heaps(arr)) diff --git a/python-mega-algo/divide_and_conquer/inversions.py b/python-mega-algo/divide_and_conquer/inversions.py new file mode 100644 index 00000000..9bb65622 --- /dev/null +++ b/python-mega-algo/divide_and_conquer/inversions.py @@ -0,0 +1,169 @@ +""" +Given an array-like data structure A[1..n], how many pairs +(i, j) for all 1 <= i < j <= n such that A[i] > A[j]? These pairs are +called inversions. Counting the number of such inversions in an array-like +object is the important. Among other things, counting inversions can help +us determine how close a given array is to being sorted + +In this implementation, I provide two algorithms, a divide-and-conquer +algorithm which runs in nlogn and the brute-force n^2 algorithm. + +""" + + +def count_inversions_bf(arr): + """ + Counts the number of inversions using a a naive brute-force algorithm + + Parameters + ---------- + arr: arr: array-like, the list containing the items for which the number + of inversions is desired. The elements of `arr` must be comparable. + + Returns + ------- + num_inversions: The total number of inversions in `arr` + + Examples + --------- + + >>> count_inversions_bf([1, 4, 2, 4, 1]) + 4 + >>> count_inversions_bf([1, 1, 2, 4, 4]) + 0 + >>> count_inversions_bf([]) + 0 + """ + + num_inversions = 0 + n = len(arr) + + for i in range(n - 1): + for j in range(i + 1, n): + if arr[i] > arr[j]: + num_inversions += 1 + + return num_inversions + + +def count_inversions_recursive(arr): + """ + Counts the number of inversions using a divide-and-conquer algorithm + + Parameters + ----------- + arr: array-like, the list containing the items for which the number + of inversions is desired. The elements of `arr` must be comparable. + + Returns + ------- + C: a sorted copy of `arr`. + num_inversions: int, the total number of inversions in 'arr' + + Examples + -------- + + >>> count_inversions_recursive([1, 4, 2, 4, 1]) + ([1, 1, 2, 4, 4], 4) + >>> count_inversions_recursive([1, 1, 2, 4, 4]) + ([1, 1, 2, 4, 4], 0) + >>> count_inversions_recursive([]) + ([], 0) + """ + if len(arr) <= 1: + return arr, 0 + else: + mid = len(arr) // 2 + P = arr[0:mid] + Q = arr[mid:] + + A, inversion_p = count_inversions_recursive(P) + B, inversions_q = count_inversions_recursive(Q) + C, cross_inversions = _count_cross_inversions(A, B) + + num_inversions = inversion_p + inversions_q + cross_inversions + return C, num_inversions + + +def _count_cross_inversions(P, Q): + """ + Counts the inversions across two sorted arrays. + And combine the two arrays into one sorted array + + For all 1<= i<=len(P) and for all 1 <= j <= len(Q), + if P[i] > Q[j], then (i, j) is a cross inversion + + Parameters + ---------- + P: array-like, sorted in non-decreasing order + Q: array-like, sorted in non-decreasing order + + Returns + ------ + R: array-like, a sorted array of the elements of `P` and `Q` + num_inversion: int, the number of inversions across `P` and `Q` + + Examples + -------- + + >>> _count_cross_inversions([1, 2, 3], [0, 2, 5]) + ([0, 1, 2, 2, 3, 5], 4) + >>> _count_cross_inversions([1, 2, 3], [3, 4, 5]) + ([1, 2, 3, 3, 4, 5], 0) + """ + + R = [] + i = j = num_inversion = 0 + while i < len(P) and j < len(Q): + if P[i] > Q[j]: + # if P[1] > Q[j], then P[k] > Q[k] for all i < k <= len(P) + # These are all inversions. The claim emerges from the + # property that P is sorted. + num_inversion += len(P) - i + R.append(Q[j]) + j += 1 + else: + R.append(P[i]) + i += 1 + + if i < len(P): + R.extend(P[i:]) + else: + R.extend(Q[j:]) + + return R, num_inversion + + +def main(): + arr_1 = [10, 2, 1, 5, 5, 2, 11] + + # this arr has 8 inversions: + # (10, 2), (10, 1), (10, 5), (10, 5), (10, 2), (2, 1), (5, 2), (5, 2) + + num_inversions_bf = count_inversions_bf(arr_1) + _, num_inversions_recursive = count_inversions_recursive(arr_1) + + assert num_inversions_bf == num_inversions_recursive == 8 + + print("number of inversions = ", num_inversions_bf) + + # testing an array with zero inversion (a sorted arr_1) + + arr_1.sort() + num_inversions_bf = count_inversions_bf(arr_1) + _, num_inversions_recursive = count_inversions_recursive(arr_1) + + assert num_inversions_bf == num_inversions_recursive == 0 + print("number of inversions = ", num_inversions_bf) + + # an empty list should also have zero inversions + arr_1 = [] + num_inversions_bf = count_inversions_bf(arr_1) + _, num_inversions_recursive = count_inversions_recursive(arr_1) + + assert num_inversions_bf == num_inversions_recursive == 0 + print("number of inversions = ", num_inversions_bf) + + +if __name__ == "__main__": + main() diff --git a/python-mega-algo/divide_and_conquer/kth_order_statistic.py b/python-mega-algo/divide_and_conquer/kth_order_statistic.py new file mode 100644 index 00000000..f6e81a30 --- /dev/null +++ b/python-mega-algo/divide_and_conquer/kth_order_statistic.py @@ -0,0 +1,64 @@ +""" +Find the kth smallest element in linear time using divide and conquer. +Recall we can do this trivially in O(nlogn) time. Sort the list and +access kth element in constant time. + +This is a divide and conquer algorithm that can find a solution in O(n) time. + +For more information of this algorithm: +https://web.stanford.edu/class/archive/cs/cs161/cs161.1138/lectures/08/Small08.pdf +""" +from random import choice +from typing import List + + +def random_pivot(lst): + """ + Choose a random pivot for the list. + We can use a more sophisticated algorithm here, such as the median-of-medians + algorithm. + """ + return choice(lst) + + +def kth_number(lst: List[int], k: int) -> int: + """ + Return the kth smallest number in lst. + >>> kth_number([2, 1, 3, 4, 5], 3) + 3 + >>> kth_number([2, 1, 3, 4, 5], 1) + 1 + >>> kth_number([2, 1, 3, 4, 5], 5) + 5 + >>> kth_number([3, 2, 5, 6, 7, 8], 2) + 3 + >>> kth_number([25, 21, 98, 100, 76, 22, 43, 60, 89, 87], 4) + 43 + """ + # pick a pivot and separate into list based on pivot. + pivot = random_pivot(lst) + + # partition based on pivot + # linear time + small = [e for e in lst if e < pivot] + big = [e for e in lst if e > pivot] + + # if we get lucky, pivot might be the element we want. + # we can easily see this: + # small (elements smaller than k) + # + pivot (kth element) + # + big (elements larger than k) + if len(small) == k - 1: + return pivot + # pivot is in elements bigger than k + elif len(small) < k - 1: + return kth_number(big, k - len(small) - 1) + # pivot is in elements smaller than k + else: + return kth_number(small, k) + + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/divide_and_conquer/max_difference_pair.py b/python-mega-algo/divide_and_conquer/max_difference_pair.py new file mode 100644 index 00000000..ffc4b76a --- /dev/null +++ b/python-mega-algo/divide_and_conquer/max_difference_pair.py @@ -0,0 +1,44 @@ +def max_difference(a: list[int]) -> tuple[int, int]: + """ + We are given an array A[1..n] of integers, n >= 1. We want to + find a pair of indices (i, j) such that + 1 <= i <= j <= n and A[j] - A[i] is as large as possible. + + Explanation: + https://www.geeksforgeeks.org/maximum-difference-between-two-elements/ + + >>> max_difference([5, 11, 2, 1, 7, 9, 0, 7]) + (1, 9) + """ + # base case + if len(a) == 1: + return a[0], a[0] + else: + # split A into half. + first = a[: len(a) // 2] + second = a[len(a) // 2 :] + + # 2 sub problems, 1/2 of original size. + small1, big1 = max_difference(first) + small2, big2 = max_difference(second) + + # get min of first and max of second + # linear time + min_first = min(first) + max_second = max(second) + + # 3 cases, either (small1, big1), + # (min_first, max_second), (small2, big2) + # constant comparisons + if big2 - small2 > max_second - min_first and big2 - small2 > big1 - small1: + return small2, big2 + elif big1 - small1 > max_second - min_first: + return small1, big1 + else: + return min_first, max_second + + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/divide_and_conquer/max_subarray_sum.py b/python-mega-algo/divide_and_conquer/max_subarray_sum.py new file mode 100644 index 00000000..43f58086 --- /dev/null +++ b/python-mega-algo/divide_and_conquer/max_subarray_sum.py @@ -0,0 +1,76 @@ +""" +Given a array of length n, max_subarray_sum() finds +the maximum of sum of contiguous sub-array using divide and conquer method. + +Time complexity : O(n log n) + +Ref : INTRODUCTION TO ALGORITHMS THIRD EDITION +(section : 4, sub-section : 4.1, page : 70) + +""" + + +def max_sum_from_start(array): + """This function finds the maximum contiguous sum of array from 0 index + + Parameters : + array (list[int]) : given array + + Returns : + max_sum (int) : maximum contiguous sum of array from 0 index + + """ + array_sum = 0 + max_sum = float("-inf") + for num in array: + array_sum += num + if array_sum > max_sum: + max_sum = array_sum + return max_sum + + +def max_cross_array_sum(array, left, mid, right): + """This function finds the maximum contiguous sum of left and right arrays + + Parameters : + array, left, mid, right (list[int], int, int, int) + + Returns : + (int) : maximum of sum of contiguous sum of left and right arrays + + """ + + max_sum_of_left = max_sum_from_start(array[left : mid + 1][::-1]) + max_sum_of_right = max_sum_from_start(array[mid + 1 : right + 1]) + return max_sum_of_left + max_sum_of_right + + +def max_subarray_sum(array, left, right): + """Maximum contiguous sub-array sum, using divide and conquer method + + Parameters : + array, left, right (list[int], int, int) : + given array, current left index and current right index + + Returns : + int : maximum of sum of contiguous sub-array + + """ + + # base case: array has only one element + if left == right: + return array[right] + + # Recursion + mid = (left + right) // 2 + left_half_sum = max_subarray_sum(array, left, mid) + right_half_sum = max_subarray_sum(array, mid + 1, right) + cross_sum = max_cross_array_sum(array, left, mid, right) + return max(left_half_sum, right_half_sum, cross_sum) + + +array = [-2, -5, 6, -2, -3, 1, 5, -6] +array_length = len(array) +print( + "Maximum sum of contiguous subarray:", max_subarray_sum(array, 0, array_length - 1) +) diff --git a/python-mega-algo/divide_and_conquer/mergesort.py b/python-mega-algo/divide_and_conquer/mergesort.py new file mode 100644 index 00000000..46a46941 --- /dev/null +++ b/python-mega-algo/divide_and_conquer/mergesort.py @@ -0,0 +1,112 @@ +from typing import List + + +def merge(left_half: List, right_half: List) -> List: + """Helper function for mergesort. + + >>> left_half = [-2] + >>> right_half = [-1] + >>> merge(left_half, right_half) + [-2, -1] + + >>> left_half = [1,2,3] + >>> right_half = [4,5,6] + >>> merge(left_half, right_half) + [1, 2, 3, 4, 5, 6] + + >>> left_half = [-2] + >>> right_half = [-1] + >>> merge(left_half, right_half) + [-2, -1] + + >>> left_half = [12, 15] + >>> right_half = [13, 14] + >>> merge(left_half, right_half) + [12, 13, 14, 15] + + >>> left_half = [] + >>> right_half = [] + >>> merge(left_half, right_half) + [] + """ + sorted_array = [None] * (len(right_half) + len(left_half)) + + pointer1 = 0 # pointer to current index for left Half + pointer2 = 0 # pointer to current index for the right Half + index = 0 # pointer to current index for the sorted array Half + + while pointer1 < len(left_half) and pointer2 < len(right_half): + if left_half[pointer1] < right_half[pointer2]: + sorted_array[index] = left_half[pointer1] + pointer1 += 1 + index += 1 + else: + sorted_array[index] = right_half[pointer2] + pointer2 += 1 + index += 1 + while pointer1 < len(left_half): + sorted_array[index] = left_half[pointer1] + pointer1 += 1 + index += 1 + + while pointer2 < len(right_half): + sorted_array[index] = right_half[pointer2] + pointer2 += 1 + index += 1 + + return sorted_array + + +def merge_sort(array: List) -> List: + """Returns a list of sorted array elements using merge sort. + + >>> from random import shuffle + >>> array = [-2, 3, -10, 11, 99, 100000, 100, -200] + >>> shuffle(array) + >>> merge_sort(array) + [-200, -10, -2, 3, 11, 99, 100, 100000] + + >>> shuffle(array) + >>> merge_sort(array) + [-200, -10, -2, 3, 11, 99, 100, 100000] + + >>> array = [-200] + >>> merge_sort(array) + [-200] + + >>> array = [-2, 3, -10, 11, 99, 100000, 100, -200] + >>> shuffle(array) + >>> sorted(array) == merge_sort(array) + True + + >>> array = [-2] + >>> merge_sort(array) + [-2] + + >>> array = [] + >>> merge_sort(array) + [] + + >>> array = [10000000, 1, -1111111111, 101111111112, 9000002] + >>> sorted(array) == merge_sort(array) + True + """ + if len(array) <= 1: + return array + # the actual formula to calculate the middle element = left + (right - left) // 2 + # this avoids integer overflow in case of large N + middle = 0 + (len(array) - 0) // 2 + + # Split the array into halves till the array length becomes equal to One + # merge the arrays of single length returned by mergeSort function and + # pass them into the merge arrays function which merges the array + left_half = array[:middle] + right_half = array[middle:] + + return merge(merge_sort(left_half), merge_sort(right_half)) + + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/divide_and_conquer/peak.py b/python-mega-algo/divide_and_conquer/peak.py new file mode 100644 index 00000000..f94f83ed --- /dev/null +++ b/python-mega-algo/divide_and_conquer/peak.py @@ -0,0 +1,53 @@ +""" +Finding the peak of a unimodal list using divide and conquer. +A unimodal array is defined as follows: array is increasing up to index p, +then decreasing afterwards. (for p >= 1) +An obvious solution can be performed in O(n), +to find the maximum of the array. +(From Kleinberg and Tardos. Algorithm Design. +Addison Wesley 2006: Chapter 5 Solved Exercise 1) +""" +from typing import List + + +def peak(lst: List[int]) -> int: + """ + Return the peak value of `lst`. + >>> peak([1, 2, 3, 4, 5, 4, 3, 2, 1]) + 5 + >>> peak([1, 10, 9, 8, 7, 6, 5, 4]) + 10 + >>> peak([1, 9, 8, 7]) + 9 + >>> peak([1, 2, 3, 4, 5, 6, 7, 0]) + 7 + >>> peak([1, 2, 3, 4, 3, 2, 1, 0, -1, -2]) + 4 + """ + # middle index + m = len(lst) // 2 + + # choose the middle 3 elements + three = lst[m - 1 : m + 2] + + # if middle element is peak + if three[1] > three[0] and three[1] > three[2]: + return three[1] + + # if increasing, recurse on right + elif three[0] < three[2]: + if len(lst[:m]) == 2: + m -= 1 + return peak(lst[m:]) + + # decreasing + else: + if len(lst[:m]) == 2: + m += 1 + return peak(lst[:m]) + + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/divide_and_conquer/power.py b/python-mega-algo/divide_and_conquer/power.py new file mode 100644 index 00000000..f2e023af --- /dev/null +++ b/python-mega-algo/divide_and_conquer/power.py @@ -0,0 +1,33 @@ +def actual_power(a: int, b: int): + """ + Function using divide and conquer to calculate a^b. + It only works for integer a,b. + """ + if b == 0: + return 1 + if (b % 2) == 0: + return actual_power(a, int(b / 2)) * actual_power(a, int(b / 2)) + else: + return a * actual_power(a, int(b / 2)) * actual_power(a, int(b / 2)) + + +def power(a: int, b: int) -> float: + """ + >>> power(4,6) + 4096 + >>> power(2,3) + 8 + >>> power(-2,3) + -8 + >>> power(2,-3) + 0.125 + >>> power(-2,-3) + -0.125 + """ + if b < 0: + return 1 / actual_power(a, b) + return actual_power(a, b) + + +if __name__ == "__main__": + print(power(-2, -3)) diff --git a/python-mega-algo/divide_and_conquer/right.html b/python-mega-algo/divide_and_conquer/right.html new file mode 100644 index 00000000..fdff74b0 --- /dev/null +++ b/python-mega-algo/divide_and_conquer/right.html @@ -0,0 +1,32 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/divide_and_conquer + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + + + + +
    FileFileFileFile
    closest_p...nts.py inversions.py max_subar...sum.py power.py 
    convex_hull.py kth_order...tic.py mergesort.py strassen_...ion.py 
    heaps_algorithm.py max_diffe...air.py peak.py __init__.py 
    heaps_alg...ive.py 
    + +

    +Folders: 1
    +Files: 13
    +Size of all files: 44362 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/divide_and_conquer/strassen_matrix_multiplication.py b/python-mega-algo/divide_and_conquer/strassen_matrix_multiplication.py new file mode 100644 index 00000000..ca10e04a --- /dev/null +++ b/python-mega-algo/divide_and_conquer/strassen_matrix_multiplication.py @@ -0,0 +1,171 @@ +from __future__ import annotations + +import math + + +def default_matrix_multiplication(a: list, b: list) -> list: + """ + Multiplication only for 2x2 matrices + """ + if len(a) != 2 or len(a[0]) != 2 or len(b) != 2 or len(b[0]) != 2: + raise Exception("Matrices are not 2x2") + new_matrix = [ + [a[0][0] * b[0][0] + a[0][1] * b[1][0], a[0][0] * b[0][1] + a[0][1] * b[1][1]], + [a[1][0] * b[0][0] + a[1][1] * b[1][0], a[1][0] * b[0][1] + a[1][1] * b[1][1]], + ] + return new_matrix + + +def matrix_addition(matrix_a: list, matrix_b: list): + return [ + [matrix_a[row][col] + matrix_b[row][col] for col in range(len(matrix_a[row]))] + for row in range(len(matrix_a)) + ] + + +def matrix_subtraction(matrix_a: list, matrix_b: list): + return [ + [matrix_a[row][col] - matrix_b[row][col] for col in range(len(matrix_a[row]))] + for row in range(len(matrix_a)) + ] + + +def split_matrix(a: list) -> tuple[list, list, list, list]: + """ + Given an even length matrix, returns the top_left, top_right, bot_left, bot_right + quadrant. + + >>> split_matrix([[4,3,2,4],[2,3,1,1],[6,5,4,3],[8,4,1,6]]) + ([[4, 3], [2, 3]], [[2, 4], [1, 1]], [[6, 5], [8, 4]], [[4, 3], [1, 6]]) + >>> split_matrix([ + ... [4,3,2,4,4,3,2,4],[2,3,1,1,2,3,1,1],[6,5,4,3,6,5,4,3],[8,4,1,6,8,4,1,6], + ... [4,3,2,4,4,3,2,4],[2,3,1,1,2,3,1,1],[6,5,4,3,6,5,4,3],[8,4,1,6,8,4,1,6] + ... ]) # doctest: +NORMALIZE_WHITESPACE + ([[4, 3, 2, 4], [2, 3, 1, 1], [6, 5, 4, 3], [8, 4, 1, 6]], [[4, 3, 2, 4], + [2, 3, 1, 1], [6, 5, 4, 3], [8, 4, 1, 6]], [[4, 3, 2, 4], [2, 3, 1, 1], + [6, 5, 4, 3], [8, 4, 1, 6]], [[4, 3, 2, 4], [2, 3, 1, 1], [6, 5, 4, 3], + [8, 4, 1, 6]]) + """ + if len(a) % 2 != 0 or len(a[0]) % 2 != 0: + raise Exception("Odd matrices are not supported!") + + matrix_length = len(a) + mid = matrix_length // 2 + + top_right = [[a[i][j] for j in range(mid, matrix_length)] for i in range(mid)] + bot_right = [ + [a[i][j] for j in range(mid, matrix_length)] for i in range(mid, matrix_length) + ] + + top_left = [[a[i][j] for j in range(mid)] for i in range(mid)] + bot_left = [[a[i][j] for j in range(mid)] for i in range(mid, matrix_length)] + + return top_left, top_right, bot_left, bot_right + + +def matrix_dimensions(matrix: list) -> tuple[int, int]: + return len(matrix), len(matrix[0]) + + +def print_matrix(matrix: list) -> None: + for i in range(len(matrix)): + print(matrix[i]) + + +def actual_strassen(matrix_a: list, matrix_b: list) -> list: + """ + Recursive function to calculate the product of two matrices, using the Strassen + Algorithm. It only supports even length matrices. + """ + if matrix_dimensions(matrix_a) == (2, 2): + return default_matrix_multiplication(matrix_a, matrix_b) + + a, b, c, d = split_matrix(matrix_a) + e, f, g, h = split_matrix(matrix_b) + + t1 = actual_strassen(a, matrix_subtraction(f, h)) + t2 = actual_strassen(matrix_addition(a, b), h) + t3 = actual_strassen(matrix_addition(c, d), e) + t4 = actual_strassen(d, matrix_subtraction(g, e)) + t5 = actual_strassen(matrix_addition(a, d), matrix_addition(e, h)) + t6 = actual_strassen(matrix_subtraction(b, d), matrix_addition(g, h)) + t7 = actual_strassen(matrix_subtraction(a, c), matrix_addition(e, f)) + + top_left = matrix_addition(matrix_subtraction(matrix_addition(t5, t4), t2), t6) + top_right = matrix_addition(t1, t2) + bot_left = matrix_addition(t3, t4) + bot_right = matrix_subtraction(matrix_subtraction(matrix_addition(t1, t5), t3), t7) + + # construct the new matrix from our 4 quadrants + new_matrix = [] + for i in range(len(top_right)): + new_matrix.append(top_left[i] + top_right[i]) + for i in range(len(bot_right)): + new_matrix.append(bot_left[i] + bot_right[i]) + return new_matrix + + +def strassen(matrix1: list, matrix2: list) -> list: + """ + >>> strassen([[2,1,3],[3,4,6],[1,4,2],[7,6,7]], [[4,2,3,4],[2,1,1,1],[8,6,4,2]]) + [[34, 23, 19, 15], [68, 46, 37, 28], [28, 18, 15, 12], [96, 62, 55, 48]] + >>> strassen([[3,7,5,6,9],[1,5,3,7,8],[1,4,4,5,7]], [[2,4],[5,2],[1,7],[5,5],[7,8]]) + [[139, 163], [121, 134], [100, 121]] + """ + if matrix_dimensions(matrix1)[1] != matrix_dimensions(matrix2)[0]: + raise Exception( + f"Unable to multiply these matrices, please check the dimensions. \n" + f"Matrix A:{matrix1} \nMatrix B:{matrix2}" + ) + dimension1 = matrix_dimensions(matrix1) + dimension2 = matrix_dimensions(matrix2) + + if dimension1[0] == dimension1[1] and dimension2[0] == dimension2[1]: + return [matrix1, matrix2] + + maximum = max(max(dimension1), max(dimension2)) + maxim = int(math.pow(2, math.ceil(math.log2(maximum)))) + new_matrix1 = matrix1 + new_matrix2 = matrix2 + + # Adding zeros to the matrices so that the arrays dimensions are the same and also + # power of 2 + for i in range(0, maxim): + if i < dimension1[0]: + for j in range(dimension1[1], maxim): + new_matrix1[i].append(0) + else: + new_matrix1.append([0] * maxim) + if i < dimension2[0]: + for j in range(dimension2[1], maxim): + new_matrix2[i].append(0) + else: + new_matrix2.append([0] * maxim) + + final_matrix = actual_strassen(new_matrix1, new_matrix2) + + # Removing the additional zeros + for i in range(0, maxim): + if i < dimension1[0]: + for j in range(dimension2[1], maxim): + final_matrix[i].pop() + else: + final_matrix.pop() + return final_matrix + + +if __name__ == "__main__": + matrix1 = [ + [2, 3, 4, 5], + [6, 4, 3, 1], + [2, 3, 6, 7], + [3, 1, 2, 4], + [2, 3, 4, 5], + [6, 4, 3, 1], + [2, 3, 6, 7], + [3, 1, 2, 4], + [2, 3, 4, 5], + [6, 2, 3, 1], + ] + matrix2 = [[0, 2, 1, 1], [16, 2, 3, 3], [2, 2, 7, 7], [13, 11, 22, 4]] + print(strassen(matrix1, matrix2)) diff --git a/python-mega-algo/dynamic_programming/__init__.py b/python-mega-algo/dynamic_programming/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/dynamic_programming/abbreviation.py b/python-mega-algo/dynamic_programming/abbreviation.py new file mode 100644 index 00000000..5175aa9e --- /dev/null +++ b/python-mega-algo/dynamic_programming/abbreviation.py @@ -0,0 +1,39 @@ +""" +https://www.hackerrank.com/challenges/abbr/problem +You can perform the following operation on some string, : + +1. Capitalize zero or more of 's lowercase letters at some index i + (i.e., make them uppercase). +2. Delete all of the remaining lowercase letters in . + +Example: +a=daBcd and b="ABC" +daBcd -> capitalize a and c(dABCd) -> remove d (ABC) +""" + + +def abbr(a: str, b: str) -> bool: + """ + >>> abbr("daBcd", "ABC") + True + >>> abbr("dBcd", "ABC") + False + """ + n = len(a) + m = len(b) + dp = [[False for _ in range(m + 1)] for _ in range(n + 1)] + dp[0][0] = True + for i in range(n): + for j in range(m + 1): + if dp[i][j]: + if j < m and a[i].upper() == b[j]: + dp[i + 1][j + 1] = True + if a[i].islower(): + dp[i + 1][j] = True + return dp[n][m] + + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/dynamic_programming/bitmask.py b/python-mega-algo/dynamic_programming/bitmask.py new file mode 100644 index 00000000..2994db5b --- /dev/null +++ b/python-mega-algo/dynamic_programming/bitmask.py @@ -0,0 +1,93 @@ +""" + +This is a Python implementation for questions involving task assignments between people. +Here Bitmasking and DP are used for solving this. + +Question :- +We have N tasks and M people. Each person in M can do only certain of these tasks. Also +a person can do only one task and a task is performed only by one person. +Find the total no of ways in which the tasks can be distributed. +""" +from collections import defaultdict + + +class AssignmentUsingBitmask: + def __init__(self, task_performed, total): + + self.total_tasks = total # total no of tasks (N) + + # DP table will have a dimension of (2^M)*N + # initially all values are set to -1 + self.dp = [ + [-1 for i in range(total + 1)] for j in range(2 ** len(task_performed)) + ] + + self.task = defaultdict(list) # stores the list of persons for each task + + # final_mask is used to check if all persons are included by setting all bits + # to 1 + self.final_mask = (1 << len(task_performed)) - 1 + + def CountWaysUtil(self, mask, task_no): + + # if mask == self.finalmask all persons are distributed tasks, return 1 + if mask == self.final_mask: + return 1 + + # if not everyone gets the task and no more tasks are available, return 0 + if task_no > self.total_tasks: + return 0 + + # if case already considered + if self.dp[mask][task_no] != -1: + return self.dp[mask][task_no] + + # Number of ways when we don't this task in the arrangement + total_ways_util = self.CountWaysUtil(mask, task_no + 1) + + # now assign the tasks one by one to all possible persons and recursively + # assign for the remaining tasks. + if task_no in self.task: + for p in self.task[task_no]: + + # if p is already given a task + if mask & (1 << p): + continue + + # assign this task to p and change the mask value. And recursively + # assign tasks with the new mask value. + total_ways_util += self.CountWaysUtil(mask | (1 << p), task_no + 1) + + # save the value. + self.dp[mask][task_no] = total_ways_util + + return self.dp[mask][task_no] + + def countNoOfWays(self, task_performed): + + # Store the list of persons for each task + for i in range(len(task_performed)): + for j in task_performed[i]: + self.task[j].append(i) + + # call the function to fill the DP table, final answer is stored in dp[0][1] + return self.CountWaysUtil(0, 1) + + +if __name__ == "__main__": + + total_tasks = 5 # total no of tasks (the value of N) + + # the list of tasks that can be done by M persons. + task_performed = [[1, 3, 4], [1, 2, 5], [3, 4]] + print( + AssignmentUsingBitmask(task_performed, total_tasks).countNoOfWays( + task_performed + ) + ) + """ + For the particular example the tasks can be distributed as + (1,2,3), (1,2,4), (1,5,3), (1,5,4), (3,1,4), + (3,2,4), (3,5,4), (4,1,3), (4,2,3), (4,5,3) + total 10 + """ diff --git a/python-mega-algo/dynamic_programming/climbing_stairs.py b/python-mega-algo/dynamic_programming/climbing_stairs.py new file mode 100644 index 00000000..048d57ae --- /dev/null +++ b/python-mega-algo/dynamic_programming/climbing_stairs.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python3 + + +def climb_stairs(n: int) -> int: + """ + LeetCdoe No.70: Climbing Stairs + Distinct ways to climb a n step staircase where + each time you can either climb 1 or 2 steps. + + Args: + n: number of steps of staircase + + Returns: + Distinct ways to climb a n step staircase + + Raises: + AssertionError: n not positive integer + + >>> climb_stairs(3) + 3 + >>> climb_stairs(1) + 1 + >>> climb_stairs(-7) # doctest: +ELLIPSIS + Traceback (most recent call last): + ... + AssertionError: n needs to be positive integer, your input -7 + """ + assert ( + isinstance(n, int) and n > 0 + ), f"n needs to be positive integer, your input {n}" + if n == 1: + return 1 + dp = [0] * (n + 1) + dp[0], dp[1] = (1, 1) + for i in range(2, n + 1): + dp[i] = dp[i - 1] + dp[i - 2] + return dp[n] + + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/dynamic_programming/edit_distance.py b/python-mega-algo/dynamic_programming/edit_distance.py new file mode 100644 index 00000000..56877e0c --- /dev/null +++ b/python-mega-algo/dynamic_programming/edit_distance.py @@ -0,0 +1,105 @@ +""" +Author : Turfa Auliarachman +Date : October 12, 2016 + +This is a pure Python implementation of Dynamic Programming solution to the edit +distance problem. + +The problem is : +Given two strings A and B. Find the minimum number of operations to string B such that +A = B. The permitted operations are removal, insertion, and substitution. +""" + + +class EditDistance: + """ + Use : + solver = EditDistance() + editDistanceResult = solver.solve(firstString, secondString) + """ + + def __init__(self): + self.__prepare__() + + def __prepare__(self, N=0, M=0): + self.dp = [[-1 for y in range(0, M)] for x in range(0, N)] + + def __solveDP(self, x, y): + if x == -1: + return y + 1 + elif y == -1: + return x + 1 + elif self.dp[x][y] > -1: + return self.dp[x][y] + else: + if self.A[x] == self.B[y]: + self.dp[x][y] = self.__solveDP(x - 1, y - 1) + else: + self.dp[x][y] = 1 + min( + self.__solveDP(x, y - 1), + self.__solveDP(x - 1, y), + self.__solveDP(x - 1, y - 1), + ) + + return self.dp[x][y] + + def solve(self, A, B): + if isinstance(A, bytes): + A = A.decode("ascii") + + if isinstance(B, bytes): + B = B.decode("ascii") + + self.A = str(A) + self.B = str(B) + + self.__prepare__(len(A), len(B)) + + return self.__solveDP(len(A) - 1, len(B) - 1) + + +def min_distance_bottom_up(word1: str, word2: str) -> int: + """ + >>> min_distance_bottom_up("intention", "execution") + 5 + >>> min_distance_bottom_up("intention", "") + 9 + >>> min_distance_bottom_up("", "") + 0 + """ + m = len(word1) + n = len(word2) + dp = [[0 for _ in range(n + 1)] for _ in range(m + 1)] + for i in range(m + 1): + for j in range(n + 1): + + if i == 0: # first string is empty + dp[i][j] = j + elif j == 0: # second string is empty + dp[i][j] = i + elif ( + word1[i - 1] == word2[j - 1] + ): # last character of both substing is equal + dp[i][j] = dp[i - 1][j - 1] + else: + insert = dp[i][j - 1] + delete = dp[i - 1][j] + replace = dp[i - 1][j - 1] + dp[i][j] = 1 + min(insert, delete, replace) + return dp[m][n] + + +if __name__ == "__main__": + solver = EditDistance() + + print("****************** Testing Edit Distance DP Algorithm ******************") + print() + + S1 = input("Enter the first string: ").strip() + S2 = input("Enter the second string: ").strip() + + print() + print("The minimum Edit Distance is: %d" % (solver.solve(S1, S2))) + print("The minimum Edit Distance is: %d" % (min_distance_bottom_up(S1, S2))) + print() + print("*************** End of Testing Edit Distance DP Algorithm ***************") diff --git a/python-mega-algo/dynamic_programming/factorial.py b/python-mega-algo/dynamic_programming/factorial.py new file mode 100644 index 00000000..1c9c927f --- /dev/null +++ b/python-mega-algo/dynamic_programming/factorial.py @@ -0,0 +1,27 @@ +# Factorial of a number using memoization + +from functools import lru_cache + + +@lru_cache +def factorial(num: int) -> int: + """ + >>> factorial(7) + 5040 + >>> factorial(-1) + Traceback (most recent call last): + ... + ValueError: Number should not be negative. + >>> [factorial(i) for i in range(10)] + [1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880] + """ + if num < 0: + raise ValueError("Number should not be negative.") + + return 1 if num in (0, 1) else num * factorial(num - 1) + + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/dynamic_programming/fast_fibonacci.py b/python-mega-algo/dynamic_programming/fast_fibonacci.py new file mode 100644 index 00000000..f48186a3 --- /dev/null +++ b/python-mega-algo/dynamic_programming/fast_fibonacci.py @@ -0,0 +1,38 @@ +#!/usr/bin/env python3 + +""" +This program calculates the nth Fibonacci number in O(log(n)). +It's possible to calculate F(1_000_000) in less than a second. +""" +from __future__ import annotations + +import sys + + +def fibonacci(n: int) -> int: + """ + return F(n) + >>> [fibonacci(i) for i in range(13)] + [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144] + """ + if n < 0: + raise ValueError("Negative arguments are not supported") + return _fib(n)[0] + + +# returns (F(n), F(n-1)) +def _fib(n: int) -> tuple[int, int]: + if n == 0: # (F(0), F(1)) + return (0, 1) + + # F(2n) = F(n)[2F(n+1) − F(n)] + # F(2n+1) = F(n+1)^2+F(n)^2 + a, b = _fib(n // 2) + c = a * (b * 2 - a) + d = a * a + b * b + return (d, c + d) if n % 2 else (c, d) + + +if __name__ == "__main__": + n = int(sys.argv[1]) + print(f"fibonacci({n}) is {fibonacci(n)}") diff --git a/python-mega-algo/dynamic_programming/fibonacci.py b/python-mega-algo/dynamic_programming/fibonacci.py new file mode 100644 index 00000000..cab1358d --- /dev/null +++ b/python-mega-algo/dynamic_programming/fibonacci.py @@ -0,0 +1,65 @@ +""" +This is a pure Python implementation of Dynamic Programming solution to the fibonacci +sequence problem. +""" + + +class Fibonacci: + def __init__(self, N=None): + self.fib_array = [] + if N: + N = int(N) + self.fib_array.append(0) + self.fib_array.append(1) + for i in range(2, N + 1): + self.fib_array.append(self.fib_array[i - 1] + self.fib_array[i - 2]) + elif N == 0: + self.fib_array.append(0) + print(self.fib_array) + + def get(self, sequence_no=None): + """ + >>> Fibonacci(5).get(3) + [0, 1, 1, 2, 3, 5] + [0, 1, 1, 2] + >>> Fibonacci(5).get(6) + [0, 1, 1, 2, 3, 5] + Out of bound. + >>> Fibonacci(5).get(-1) + [0, 1, 1, 2, 3, 5] + [] + """ + if sequence_no is not None: + if sequence_no < len(self.fib_array): + return print(self.fib_array[: sequence_no + 1]) + else: + print("Out of bound.") + else: + print("Please specify a value") + + +if __name__ == "__main__": + print("\n********* Fibonacci Series Using Dynamic Programming ************\n") + print("\n Enter the upper limit for the fibonacci sequence: ", end="") + try: + N = int(input().strip()) + fib = Fibonacci(N) + print( + "\n********* Enter different values to get the corresponding fibonacci " + "sequence, enter any negative number to exit. ************\n" + ) + while True: + try: + i = int(input("Enter value: ").strip()) + if i < 0: + print("\n********* Good Bye!! ************\n") + break + fib.get(i) + except NameError: + print("\nInvalid input, please try again.") + except NameError: + print("\n********* Invalid input, good bye!! ************\n") + + import doctest + + doctest.testmod() diff --git a/python-mega-algo/dynamic_programming/floyd_warshall.py b/python-mega-algo/dynamic_programming/floyd_warshall.py new file mode 100644 index 00000000..4a901d8f --- /dev/null +++ b/python-mega-algo/dynamic_programming/floyd_warshall.py @@ -0,0 +1,42 @@ +import math + + +class Graph: + def __init__(self, N=0): # a graph with Node 0,1,...,N-1 + self.N = N + self.W = [ + [math.inf for j in range(0, N)] for i in range(0, N) + ] # adjacency matrix for weight + self.dp = [ + [math.inf for j in range(0, N)] for i in range(0, N) + ] # dp[i][j] stores minimum distance from i to j + + def addEdge(self, u, v, w): + self.dp[u][v] = w + + def floyd_warshall(self): + for k in range(0, self.N): + for i in range(0, self.N): + for j in range(0, self.N): + self.dp[i][j] = min(self.dp[i][j], self.dp[i][k] + self.dp[k][j]) + + def showMin(self, u, v): + return self.dp[u][v] + + +if __name__ == "__main__": + graph = Graph(5) + graph.addEdge(0, 2, 9) + graph.addEdge(0, 4, 10) + graph.addEdge(1, 3, 5) + graph.addEdge(2, 3, 7) + graph.addEdge(3, 0, 10) + graph.addEdge(3, 1, 2) + graph.addEdge(3, 2, 1) + graph.addEdge(3, 4, 6) + graph.addEdge(4, 1, 3) + graph.addEdge(4, 2, 4) + graph.addEdge(4, 3, 9) + graph.floyd_warshall() + graph.showMin(1, 4) + graph.showMin(0, 3) diff --git a/python-mega-algo/dynamic_programming/fractional_knapsack.py b/python-mega-algo/dynamic_programming/fractional_knapsack.py new file mode 100644 index 00000000..c74af7ef --- /dev/null +++ b/python-mega-algo/dynamic_programming/fractional_knapsack.py @@ -0,0 +1,27 @@ +from bisect import bisect +from itertools import accumulate + + +def fracKnapsack(vl, wt, W, n): + """ + >>> fracKnapsack([60, 100, 120], [10, 20, 30], 50, 3) + 240.0 + """ + + r = list(sorted(zip(vl, wt), key=lambda x: x[0] / x[1], reverse=True)) + vl, wt = [i[0] for i in r], [i[1] for i in r] + acc = list(accumulate(wt)) + k = bisect(acc, W) + return ( + 0 + if k == 0 + else sum(vl[:k]) + (W - acc[k - 1]) * (vl[k]) / (wt[k]) + if k != n + else sum(vl[:k]) + ) + + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/dynamic_programming/fractional_knapsack_2.py b/python-mega-algo/dynamic_programming/fractional_knapsack_2.py new file mode 100644 index 00000000..fb841070 --- /dev/null +++ b/python-mega-algo/dynamic_programming/fractional_knapsack_2.py @@ -0,0 +1,60 @@ +# https://en.wikipedia.org/wiki/Continuous_knapsack_problem +# https://www.guru99.com/fractional-knapsack-problem-greedy.html +# https://medium.com/walkinthecode/greedy-algorithm-fractional-knapsack-problem-9aba1daecc93 + +from __future__ import annotations + + +def fractional_knapsack( + value: list[int], weight: list[int], capacity: int +) -> tuple[int, list[int]]: + """ + >>> value = [1, 3, 5, 7, 9] + >>> weight = [0.9, 0.7, 0.5, 0.3, 0.1] + >>> fractional_knapsack(value, weight, 5) + (25, [1, 1, 1, 1, 1]) + >>> fractional_knapsack(value, weight, 15) + (25, [1, 1, 1, 1, 1]) + >>> fractional_knapsack(value, weight, 25) + (25, [1, 1, 1, 1, 1]) + >>> fractional_knapsack(value, weight, 26) + (25, [1, 1, 1, 1, 1]) + >>> fractional_knapsack(value, weight, -1) + (-90.0, [0, 0, 0, 0, -10.0]) + >>> fractional_knapsack([1, 3, 5, 7], weight, 30) + (16, [1, 1, 1, 1]) + >>> fractional_knapsack(value, [0.9, 0.7, 0.5, 0.3, 0.1], 30) + (25, [1, 1, 1, 1, 1]) + >>> fractional_knapsack([], [], 30) + (0, []) + """ + index = list(range(len(value))) + ratio = [v / w for v, w in zip(value, weight)] + index.sort(key=lambda i: ratio[i], reverse=True) + + max_value = 0 + fractions = [0] * len(value) + for i in index: + if weight[i] <= capacity: + fractions[i] = 1 + max_value += value[i] + capacity -= weight[i] + else: + fractions[i] = capacity / weight[i] + max_value += value[i] * capacity / weight[i] + break + + return max_value, fractions + + +if __name__ == "__main__": + n = int(input("Enter number of items: ")) + value = input(f"Enter the values of the {n} item(s) in order: ").split() + value = [int(v) for v in value] + weight = input(f"Enter the positive weights of the {n} item(s) in order: ".split()) + weight = [int(w) for w in weight] + capacity = int(input("Enter maximum weight: ")) + + max_value, fractions = fractional_knapsack(value, weight, capacity) + print("The maximum value of items that can be carried:", max_value) + print("The fractions in which the items should be taken:", fractions) diff --git a/python-mega-algo/dynamic_programming/integer_partition.py b/python-mega-algo/dynamic_programming/integer_partition.py new file mode 100644 index 00000000..4eb06348 --- /dev/null +++ b/python-mega-algo/dynamic_programming/integer_partition.py @@ -0,0 +1,37 @@ +""" +The number of partitions of a number n into at least k parts equals the number of +partitions into exactly k parts plus the number of partitions into at least k-1 parts. +Subtracting 1 from each part of a partition of n into k parts gives a partition of n-k +into k parts. These two facts together are used for this algorithm. +""" + + +def partition(m): + memo = [[0 for _ in range(m)] for _ in range(m + 1)] + for i in range(m + 1): + memo[i][0] = 1 + + for n in range(m + 1): + for k in range(1, m): + memo[n][k] += memo[n][k - 1] + if n - k > 0: + memo[n][k] += memo[n - k - 1][k] + + return memo[m][m - 1] + + +if __name__ == "__main__": + import sys + + if len(sys.argv) == 1: + try: + n = int(input("Enter a number: ").strip()) + print(partition(n)) + except ValueError: + print("Please enter a number.") + else: + try: + n = int(sys.argv[1]) + print(partition(n)) + except ValueError: + print("Please pass a number.") diff --git a/python-mega-algo/dynamic_programming/iterating_through_submasks.py b/python-mega-algo/dynamic_programming/iterating_through_submasks.py new file mode 100644 index 00000000..21c64dba --- /dev/null +++ b/python-mega-algo/dynamic_programming/iterating_through_submasks.py @@ -0,0 +1,62 @@ +""" +Author : Syed Faizan (3rd Year Student IIIT Pune) +github : faizan2700 +You are given a bitmask m and you want to efficiently iterate through all of +its submasks. The mask s is submask of m if only bits that were included in +bitmask are set +""" +from __future__ import annotations + + +def list_of_submasks(mask: int) -> list[int]: + + """ + Args: + mask : number which shows mask ( always integer > 0, zero does not have any + submasks ) + + Returns: + all_submasks : the list of submasks of mask (mask s is called submask of mask + m if only bits that were included in original mask are set + + Raises: + AssertionError: mask not positive integer + + >>> list_of_submasks(15) + [15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1] + >>> list_of_submasks(13) + [13, 12, 9, 8, 5, 4, 1] + >>> list_of_submasks(-7) # doctest: +ELLIPSIS + Traceback (most recent call last): + ... + AssertionError: mask needs to be positive integer, your input -7 + >>> list_of_submasks(0) # doctest: +ELLIPSIS + Traceback (most recent call last): + ... + AssertionError: mask needs to be positive integer, your input 0 + + """ + + assert ( + isinstance(mask, int) and mask > 0 + ), f"mask needs to be positive integer, your input {mask}" + + """ + first submask iterated will be mask itself then operation will be performed + to get other submasks till we reach empty submask that is zero ( zero is not + included in final submasks list ) + """ + all_submasks = [] + submask = mask + + while submask: + all_submasks.append(submask) + submask = (submask - 1) & mask + + return all_submasks + + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/dynamic_programming/k_means_clustering_tensorflow.py_tf b/python-mega-algo/dynamic_programming/k_means_clustering_tensorflow.py_tf new file mode 100644 index 00000000..4fbcedea --- /dev/null +++ b/python-mega-algo/dynamic_programming/k_means_clustering_tensorflow.py_tf @@ -0,0 +1,147 @@ +import tensorflow as tf +from random import shuffle +from numpy import array + + +def TFKMeansCluster(vectors, noofclusters): + """ + K-Means Clustering using TensorFlow. + 'vectors' should be a n*k 2-D NumPy array, where n is the number + of vectors of dimensionality k. + 'noofclusters' should be an integer. + """ + + noofclusters = int(noofclusters) + assert noofclusters < len(vectors) + + # Find out the dimensionality + dim = len(vectors[0]) + + # Will help select random centroids from among the available vectors + vector_indices = list(range(len(vectors))) + shuffle(vector_indices) + + # GRAPH OF COMPUTATION + # We initialize a new graph and set it as the default during each run + # of this algorithm. This ensures that as this function is called + # multiple times, the default graph doesn't keep getting crowded with + # unused ops and Variables from previous function calls. + + graph = tf.Graph() + + with graph.as_default(): + + # SESSION OF COMPUTATION + + sess = tf.Session() + + ##CONSTRUCTING THE ELEMENTS OF COMPUTATION + + ##First lets ensure we have a Variable vector for each centroid, + ##initialized to one of the vectors from the available data points + centroids = [ + tf.Variable(vectors[vector_indices[i]]) for i in range(noofclusters) + ] + ##These nodes will assign the centroid Variables the appropriate + ##values + centroid_value = tf.placeholder("float64", [dim]) + cent_assigns = [] + for centroid in centroids: + cent_assigns.append(tf.assign(centroid, centroid_value)) + + ##Variables for cluster assignments of individual vectors(initialized + ##to 0 at first) + assignments = [tf.Variable(0) for i in range(len(vectors))] + ##These nodes will assign an assignment Variable the appropriate + ##value + assignment_value = tf.placeholder("int32") + cluster_assigns = [] + for assignment in assignments: + cluster_assigns.append(tf.assign(assignment, assignment_value)) + + ##Now lets construct the node that will compute the mean + # The placeholder for the input + mean_input = tf.placeholder("float", [None, dim]) + # The Node/op takes the input and computes a mean along the 0th + # dimension, i.e. the list of input vectors + mean_op = tf.reduce_mean(mean_input, 0) + + ##Node for computing Euclidean distances + # Placeholders for input + v1 = tf.placeholder("float", [dim]) + v2 = tf.placeholder("float", [dim]) + euclid_dist = tf.sqrt(tf.reduce_sum(tf.pow(tf.sub(v1, v2), 2))) + + ##This node will figure out which cluster to assign a vector to, + ##based on Euclidean distances of the vector from the centroids. + # Placeholder for input + centroid_distances = tf.placeholder("float", [noofclusters]) + cluster_assignment = tf.argmin(centroid_distances, 0) + + ##INITIALIZING STATE VARIABLES + + ##This will help initialization of all Variables defined with respect + ##to the graph. The Variable-initializer should be defined after + ##all the Variables have been constructed, so that each of them + ##will be included in the initialization. + init_op = tf.initialize_all_variables() + + # Initialize all variables + sess.run(init_op) + + ##CLUSTERING ITERATIONS + + # Now perform the Expectation-Maximization steps of K-Means clustering + # iterations. To keep things simple, we will only do a set number of + # iterations, instead of using a Stopping Criterion. + noofiterations = 100 + for iteration_n in range(noofiterations): + + ##EXPECTATION STEP + ##Based on the centroid locations till last iteration, compute + ##the _expected_ centroid assignments. + # Iterate over each vector + for vector_n in range(len(vectors)): + vect = vectors[vector_n] + # Compute Euclidean distance between this vector and each + # centroid. Remember that this list cannot be named + #'centroid_distances', since that is the input to the + # cluster assignment node. + distances = [ + sess.run(euclid_dist, feed_dict={v1: vect, v2: sess.run(centroid)}) + for centroid in centroids + ] + # Now use the cluster assignment node, with the distances + # as the input + assignment = sess.run( + cluster_assignment, feed_dict={centroid_distances: distances} + ) + # Now assign the value to the appropriate state variable + sess.run( + cluster_assigns[vector_n], feed_dict={assignment_value: assignment} + ) + + ##MAXIMIZATION STEP + # Based on the expected state computed from the Expectation Step, + # compute the locations of the centroids so as to maximize the + # overall objective of minimizing within-cluster Sum-of-Squares + for cluster_n in range(noofclusters): + # Collect all the vectors assigned to this cluster + assigned_vects = [ + vectors[i] + for i in range(len(vectors)) + if sess.run(assignments[i]) == cluster_n + ] + # Compute new centroid location + new_location = sess.run( + mean_op, feed_dict={mean_input: array(assigned_vects)} + ) + # Assign value to appropriate variable + sess.run( + cent_assigns[cluster_n], feed_dict={centroid_value: new_location} + ) + + # Return centroids and assignments + centroids = sess.run(centroids) + assignments = sess.run(assignments) + return centroids, assignments diff --git a/python-mega-algo/dynamic_programming/knapsack.py b/python-mega-algo/dynamic_programming/knapsack.py new file mode 100644 index 00000000..69e54c00 --- /dev/null +++ b/python-mega-algo/dynamic_programming/knapsack.py @@ -0,0 +1,150 @@ +""" +Given weights and values of n items, put these items in a knapsack of + capacity W to get the maximum total value in the knapsack. + +Note that only the integer weights 0-1 knapsack problem is solvable + using dynamic programming. +""" + + +def MF_knapsack(i, wt, val, j): + """ + This code involves the concept of memory functions. Here we solve the subproblems + which are needed unlike the below example + F is a 2D array with -1s filled up + """ + global F # a global dp table for knapsack + if F[i][j] < 0: + if j < wt[i - 1]: + val = MF_knapsack(i - 1, wt, val, j) + else: + val = max( + MF_knapsack(i - 1, wt, val, j), + MF_knapsack(i - 1, wt, val, j - wt[i - 1]) + val[i - 1], + ) + F[i][j] = val + return F[i][j] + + +def knapsack(W, wt, val, n): + dp = [[0 for i in range(W + 1)] for j in range(n + 1)] + + for i in range(1, n + 1): + for w in range(1, W + 1): + if wt[i - 1] <= w: + dp[i][w] = max(val[i - 1] + dp[i - 1][w - wt[i - 1]], dp[i - 1][w]) + else: + dp[i][w] = dp[i - 1][w] + + return dp[n][W], dp + + +def knapsack_with_example_solution(W: int, wt: list, val: list): + """ + Solves the integer weights knapsack problem returns one of + the several possible optimal subsets. + + Parameters + --------- + + W: int, the total maximum weight for the given knapsack problem. + wt: list, the vector of weights for all items where wt[i] is the weight + of the i-th item. + val: list, the vector of values for all items where val[i] is the value + of the i-th item + + Returns + ------- + optimal_val: float, the optimal value for the given knapsack problem + example_optional_set: set, the indices of one of the optimal subsets + which gave rise to the optimal value. + + Examples + ------- + >>> knapsack_with_example_solution(10, [1, 3, 5, 2], [10, 20, 100, 22]) + (142, {2, 3, 4}) + >>> knapsack_with_example_solution(6, [4, 3, 2, 3], [3, 2, 4, 4]) + (8, {3, 4}) + >>> knapsack_with_example_solution(6, [4, 3, 2, 3], [3, 2, 4]) + Traceback (most recent call last): + ... + ValueError: The number of weights must be the same as the number of values. + But got 4 weights and 3 values + """ + if not (isinstance(wt, (list, tuple)) and isinstance(val, (list, tuple))): + raise ValueError( + "Both the weights and values vectors must be either lists or tuples" + ) + + num_items = len(wt) + if num_items != len(val): + raise ValueError( + "The number of weights must be the " + "same as the number of values.\nBut " + f"got {num_items} weights and {len(val)} values" + ) + for i in range(num_items): + if not isinstance(wt[i], int): + raise TypeError( + "All weights must be integers but " + f"got weight of type {type(wt[i])} at index {i}" + ) + + optimal_val, dp_table = knapsack(W, wt, val, num_items) + example_optional_set = set() + _construct_solution(dp_table, wt, num_items, W, example_optional_set) + + return optimal_val, example_optional_set + + +def _construct_solution(dp: list, wt: list, i: int, j: int, optimal_set: set): + """ + Recursively reconstructs one of the optimal subsets given + a filled DP table and the vector of weights + + Parameters + --------- + + dp: list of list, the table of a solved integer weight dynamic programming problem + + wt: list or tuple, the vector of weights of the items + i: int, the index of the item under consideration + j: int, the current possible maximum weight + optimal_set: set, the optimal subset so far. This gets modified by the function. + + Returns + ------- + None + + """ + # for the current item i at a maximum weight j to be part of an optimal subset, + # the optimal value at (i, j) must be greater than the optimal value at (i-1, j). + # where i - 1 means considering only the previous items at the given maximum weight + if i > 0 and j > 0: + if dp[i - 1][j] == dp[i][j]: + _construct_solution(dp, wt, i - 1, j, optimal_set) + else: + optimal_set.add(i) + _construct_solution(dp, wt, i - 1, j - wt[i - 1], optimal_set) + + +if __name__ == "__main__": + """ + Adding test case for knapsack + """ + val = [3, 2, 4, 4] + wt = [4, 3, 2, 3] + n = 4 + w = 6 + F = [[0] * (w + 1)] + [[0] + [-1 for i in range(w + 1)] for j in range(n + 1)] + optimal_solution, _ = knapsack(w, wt, val, n) + print(optimal_solution) + print(MF_knapsack(n, wt, val, w)) # switched the n and w + + # testing the dynamic programming problem with example + # the optimal subset for the above example are items 3 and 4 + optimal_solution, optimal_subset = knapsack_with_example_solution(w, wt, val) + assert optimal_solution == 8 + assert optimal_subset == {3, 4} + print("optimal_value = ", optimal_solution) + print("An optimal subset corresponding to the optimal value", optimal_subset) diff --git a/python-mega-algo/dynamic_programming/longest_common_subsequence.py b/python-mega-algo/dynamic_programming/longest_common_subsequence.py new file mode 100644 index 00000000..fdcf3311 --- /dev/null +++ b/python-mega-algo/dynamic_programming/longest_common_subsequence.py @@ -0,0 +1,83 @@ +""" +LCS Problem Statement: Given two sequences, find the length of longest subsequence +present in both of them. A subsequence is a sequence that appears in the same relative +order, but not necessarily continuous. +Example:"abc", "abg" are subsequences of "abcdefgh". +""" + + +def longest_common_subsequence(x: str, y: str): + """ + Finds the longest common subsequence between two strings. Also returns the + The subsequence found + + Parameters + ---------- + + x: str, one of the strings + y: str, the other string + + Returns + ------- + L[m][n]: int, the length of the longest subsequence. Also equal to len(seq) + Seq: str, the subsequence found + + >>> longest_common_subsequence("programming", "gaming") + (6, 'gaming') + >>> longest_common_subsequence("physics", "smartphone") + (2, 'ph') + >>> longest_common_subsequence("computer", "food") + (1, 'o') + """ + # find the length of strings + + assert x is not None + assert y is not None + + m = len(x) + n = len(y) + + # declaring the array for storing the dp values + L = [[0] * (n + 1) for _ in range(m + 1)] + + for i in range(1, m + 1): + for j in range(1, n + 1): + if x[i - 1] == y[j - 1]: + match = 1 + else: + match = 0 + + L[i][j] = max(L[i - 1][j], L[i][j - 1], L[i - 1][j - 1] + match) + + seq = "" + i, j = m, n + while i > 0 and j > 0: + if x[i - 1] == y[j - 1]: + match = 1 + else: + match = 0 + + if L[i][j] == L[i - 1][j - 1] + match: + if match == 1: + seq = x[i - 1] + seq + i -= 1 + j -= 1 + elif L[i][j] == L[i - 1][j]: + i -= 1 + else: + j -= 1 + + return L[m][n], seq + + +if __name__ == "__main__": + a = "AGGTAB" + b = "GXTXAYB" + expected_ln = 4 + expected_subseq = "GTAB" + + ln, subseq = longest_common_subsequence(a, b) + print("len =", ln, ", sub-sequence =", subseq) + import doctest + + doctest.testmod() diff --git a/python-mega-algo/dynamic_programming/longest_increasing_subsequence.py b/python-mega-algo/dynamic_programming/longest_increasing_subsequence.py new file mode 100644 index 00000000..f5ca8a2b --- /dev/null +++ b/python-mega-algo/dynamic_programming/longest_increasing_subsequence.py @@ -0,0 +1,61 @@ +""" +Author : Mehdi ALAOUI + +This is a pure Python implementation of Dynamic Programming solution to the longest +increasing subsequence of a given sequence. + +The problem is : +Given an array, to find the longest and increasing sub-array in that given array and +return it. +Example: [10, 22, 9, 33, 21, 50, 41, 60, 80] as input will return + [10, 22, 33, 41, 60, 80] as output +""" +from __future__ import annotations + + +def longest_subsequence(array: list[int]) -> list[int]: # This function is recursive + """ + Some examples + >>> longest_subsequence([10, 22, 9, 33, 21, 50, 41, 60, 80]) + [10, 22, 33, 41, 60, 80] + >>> longest_subsequence([4, 8, 7, 5, 1, 12, 2, 3, 9]) + [1, 2, 3, 9] + >>> longest_subsequence([9, 8, 7, 6, 5, 7]) + [8] + >>> longest_subsequence([1, 1, 1]) + [1, 1, 1] + >>> longest_subsequence([]) + [] + """ + array_length = len(array) + # If the array contains only one element, we return it (it's the stop condition of + # recursion) + if array_length <= 1: + return array + # Else + pivot = array[0] + isFound = False + i = 1 + longest_subseq = [] + while not isFound and i < array_length: + if array[i] < pivot: + isFound = True + temp_array = [element for element in array[i:] if element >= array[i]] + temp_array = longest_subsequence(temp_array) + if len(temp_array) > len(longest_subseq): + longest_subseq = temp_array + else: + i += 1 + + temp_array = [element for element in array[1:] if element >= pivot] + temp_array = [pivot] + longest_subsequence(temp_array) + if len(temp_array) > len(longest_subseq): + return temp_array + else: + return longest_subseq + + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/dynamic_programming/longest_increasing_subsequence_o(nlogn).py b/python-mega-algo/dynamic_programming/longest_increasing_subsequence_o(nlogn).py new file mode 100644 index 00000000..af536f8b --- /dev/null +++ b/python-mega-algo/dynamic_programming/longest_increasing_subsequence_o(nlogn).py @@ -0,0 +1,55 @@ +############################# +# Author: Aravind Kashyap +# File: lis.py +# comments: This programme outputs the Longest Strictly Increasing Subsequence in +# O(NLogN) Where N is the Number of elements in the list +############################# +from __future__ import annotations + + +def CeilIndex(v, l, r, key): # noqa: E741 + while r - l > 1: + m = (l + r) // 2 + if v[m] >= key: + r = m + else: + l = m # noqa: E741 + return r + + +def LongestIncreasingSubsequenceLength(v: list[int]) -> int: + """ + >>> LongestIncreasingSubsequenceLength([2, 5, 3, 7, 11, 8, 10, 13, 6]) + 6 + >>> LongestIncreasingSubsequenceLength([]) + 0 + >>> LongestIncreasingSubsequenceLength([0, 8, 4, 12, 2, 10, 6, 14, 1, 9, 5, 13, 3, + ... 11, 7, 15]) + 6 + >>> LongestIncreasingSubsequenceLength([5, 4, 3, 2, 1]) + 1 + """ + if len(v) == 0: + return 0 + + tail = [0] * len(v) + length = 1 + + tail[0] = v[0] + + for i in range(1, len(v)): + if v[i] < tail[0]: + tail[0] = v[i] + elif v[i] > tail[length - 1]: + tail[length] = v[i] + length += 1 + else: + tail[CeilIndex(tail, -1, length - 1, v[i])] = v[i] + + return length + + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/dynamic_programming/longest_sub_array.py b/python-mega-algo/dynamic_programming/longest_sub_array.py new file mode 100644 index 00000000..30159a13 --- /dev/null +++ b/python-mega-algo/dynamic_programming/longest_sub_array.py @@ -0,0 +1,34 @@ +""" +Author : Yvonne + +This is a pure Python implementation of Dynamic Programming solution to the + longest_sub_array problem. + +The problem is : +Given an array, to find the longest and continuous sub array and get the max sum of the + sub array in the given array. +""" + + +class SubArray: + def __init__(self, arr): + # we need a list not a string, so do something to change the type + self.array = arr.split(",") + print(("the input array is:", self.array)) + + def solve_sub_array(self): + rear = [int(self.array[0])] * len(self.array) + sum_value = [int(self.array[0])] * len(self.array) + for i in range(1, len(self.array)): + sum_value[i] = max( + int(self.array[i]) + sum_value[i - 1], int(self.array[i]) + ) + rear[i] = max(sum_value[i], rear[i - 1]) + return rear[len(self.array) - 1] + + +if __name__ == "__main__": + whole_array = input("please input some numbers:") + array = SubArray(whole_array) + re = array.solve_sub_array() + print(("the results is:", re)) diff --git a/python-mega-algo/dynamic_programming/matrix_chain_order.py b/python-mega-algo/dynamic_programming/matrix_chain_order.py new file mode 100644 index 00000000..9411bc70 --- /dev/null +++ b/python-mega-algo/dynamic_programming/matrix_chain_order.py @@ -0,0 +1,54 @@ +import sys + +""" +Dynamic Programming +Implementation of Matrix Chain Multiplication +Time Complexity: O(n^3) +Space Complexity: O(n^2) +""" + + +def MatrixChainOrder(array): + N = len(array) + Matrix = [[0 for x in range(N)] for x in range(N)] + Sol = [[0 for x in range(N)] for x in range(N)] + + for ChainLength in range(2, N): + for a in range(1, N - ChainLength + 1): + b = a + ChainLength - 1 + + Matrix[a][b] = sys.maxsize + for c in range(a, b): + cost = ( + Matrix[a][c] + Matrix[c + 1][b] + array[a - 1] * array[c] * array[b] + ) + if cost < Matrix[a][b]: + Matrix[a][b] = cost + Sol[a][b] = c + return Matrix, Sol + + +# Print order of matrix with Ai as Matrix +def PrintOptimalSolution(OptimalSolution, i, j): + if i == j: + print("A" + str(i), end=" ") + else: + print("(", end=" ") + PrintOptimalSolution(OptimalSolution, i, OptimalSolution[i][j]) + PrintOptimalSolution(OptimalSolution, OptimalSolution[i][j] + 1, j) + print(")", end=" ") + + +def main(): + array = [30, 35, 15, 5, 10, 20, 25] + n = len(array) + # Size of matrix created from above array will be + # 30*35 35*15 15*5 5*10 10*20 20*25 + Matrix, OptimalSolution = MatrixChainOrder(array) + + print("No. of Operation required: " + str(Matrix[1][n - 1])) + PrintOptimalSolution(OptimalSolution, 1, n - 1) + + +if __name__ == "__main__": + main() diff --git a/python-mega-algo/dynamic_programming/max_non_adjacent_sum.py b/python-mega-algo/dynamic_programming/max_non_adjacent_sum.py new file mode 100644 index 00000000..5362b22c --- /dev/null +++ b/python-mega-algo/dynamic_programming/max_non_adjacent_sum.py @@ -0,0 +1,34 @@ +# Video Explanation: https://www.youtube.com/watch?v=6w60Zi1NtL8&feature=emb_logo + +from __future__ import annotations + + +def maximum_non_adjacent_sum(nums: list[int]) -> int: + """ + Find the maximum non-adjacent sum of the integers in the nums input list + + >>> print(maximum_non_adjacent_sum([1, 2, 3])) + 4 + >>> maximum_non_adjacent_sum([1, 5, 3, 7, 2, 2, 6]) + 18 + >>> maximum_non_adjacent_sum([-1, -5, -3, -7, -2, -2, -6]) + 0 + >>> maximum_non_adjacent_sum([499, 500, -3, -7, -2, -2, -6]) + 500 + """ + if not nums: + return 0 + max_including = nums[0] + max_excluding = 0 + for num in nums[1:]: + max_including, max_excluding = ( + max_excluding + num, + max(max_including, max_excluding), + ) + return max(max_excluding, max_including) + + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/dynamic_programming/max_sub_array.py b/python-mega-algo/dynamic_programming/max_sub_array.py new file mode 100644 index 00000000..3060010e --- /dev/null +++ b/python-mega-algo/dynamic_programming/max_sub_array.py @@ -0,0 +1,94 @@ +""" +author : Mayank Kumar Jha (mk9440) +""" +from __future__ import annotations + + +def find_max_sub_array(A, low, high): + if low == high: + return low, high, A[low] + else: + mid = (low + high) // 2 + left_low, left_high, left_sum = find_max_sub_array(A, low, mid) + right_low, right_high, right_sum = find_max_sub_array(A, mid + 1, high) + cross_left, cross_right, cross_sum = find_max_cross_sum(A, low, mid, high) + if left_sum >= right_sum and left_sum >= cross_sum: + return left_low, left_high, left_sum + elif right_sum >= left_sum and right_sum >= cross_sum: + return right_low, right_high, right_sum + else: + return cross_left, cross_right, cross_sum + + +def find_max_cross_sum(A, low, mid, high): + left_sum, max_left = -999999999, -1 + right_sum, max_right = -999999999, -1 + summ = 0 + for i in range(mid, low - 1, -1): + summ += A[i] + if summ > left_sum: + left_sum = summ + max_left = i + summ = 0 + for i in range(mid + 1, high + 1): + summ += A[i] + if summ > right_sum: + right_sum = summ + max_right = i + return max_left, max_right, (left_sum + right_sum) + + +def max_sub_array(nums: list[int]) -> int: + """ + Finds the contiguous subarray which has the largest sum and return its sum. + + >>> max_sub_array([-2, 1, -3, 4, -1, 2, 1, -5, 4]) + 6 + + An empty (sub)array has sum 0. + >>> max_sub_array([]) + 0 + + If all elements are negative, the largest subarray would be the empty array, + having the sum 0. + >>> max_sub_array([-1, -2, -3]) + 0 + >>> max_sub_array([5, -2, -3]) + 5 + >>> max_sub_array([31, -41, 59, 26, -53, 58, 97, -93, -23, 84]) + 187 + """ + best = 0 + current = 0 + for i in nums: + current += i + if current < 0: + current = 0 + best = max(best, current) + return best + + +if __name__ == "__main__": + """ + A random simulation of this algorithm. + """ + import time + from random import randint + + from matplotlib import pyplot as plt + + inputs = [10, 100, 1000, 10000, 50000, 100000, 200000, 300000, 400000, 500000] + tim = [] + for i in inputs: + li = [randint(1, i) for j in range(i)] + strt = time.time() + (find_max_sub_array(li, 0, len(li) - 1)) + end = time.time() + tim.append(end - strt) + print("No of Inputs Time Taken") + for i in range(len(inputs)): + print(inputs[i], "\t\t", tim[i]) + plt.plot(inputs, tim) + plt.xlabel("Number of Inputs") + plt.ylabel("Time taken in seconds ") + plt.show() diff --git a/python-mega-algo/dynamic_programming/max_sum_contiguous_subsequence.py b/python-mega-algo/dynamic_programming/max_sum_contiguous_subsequence.py new file mode 100644 index 00000000..bac59237 --- /dev/null +++ b/python-mega-algo/dynamic_programming/max_sum_contiguous_subsequence.py @@ -0,0 +1,20 @@ +def max_subarray_sum(nums: list) -> int: + """ + >>> max_subarray_sum([6 , 9, -1, 3, -7, -5, 10]) + 17 + """ + if not nums: + return 0 + n = len(nums) + + res, s, s_pre = nums[0], nums[0], nums[0] + for i in range(1, n): + s = max(nums[i], s_pre + nums[i]) + s_pre = s + res = max(res, s) + return res + + +if __name__ == "__main__": + nums = [6, 9, -1, 3, -7, -5, 10] + print(max_subarray_sum(nums)) diff --git a/python-mega-algo/dynamic_programming/minimum_coin_change.py b/python-mega-algo/dynamic_programming/minimum_coin_change.py new file mode 100644 index 00000000..2869b585 --- /dev/null +++ b/python-mega-algo/dynamic_programming/minimum_coin_change.py @@ -0,0 +1,46 @@ +""" +You have m types of coins available in infinite quantities +where the value of each coins is given in the array S=[S0,... Sm-1] +Can you determine number of ways of making change for n units using +the given types of coins? +https://www.hackerrank.com/challenges/coin-change/problem +""" + + +def dp_count(S, n): + """ + >>> dp_count([1, 2, 3], 4) + 4 + >>> dp_count([1, 2, 3], 7) + 8 + >>> dp_count([2, 5, 3, 6], 10) + 5 + >>> dp_count([10], 99) + 0 + >>> dp_count([4, 5, 6], 0) + 1 + >>> dp_count([1, 2, 3], -5) + 0 + """ + if n < 0: + return 0 + # table[i] represents the number of ways to get to amount i + table = [0] * (n + 1) + + # There is exactly 1 way to get to zero(You pick no coins). + table[0] = 1 + + # Pick all coins one by one and update table[] values + # after the index greater than or equal to the value of the + # picked coin + for coin_val in S: + for j in range(coin_val, n + 1): + table[j] += table[j - coin_val] + + return table[n] + + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/dynamic_programming/minimum_cost_path.py b/python-mega-algo/dynamic_programming/minimum_cost_path.py new file mode 100644 index 00000000..3ad24b55 --- /dev/null +++ b/python-mega-algo/dynamic_programming/minimum_cost_path.py @@ -0,0 +1,37 @@ +# Youtube Explanation: https://www.youtube.com/watch?v=lBRtnuxg-gU + +from __future__ import annotations + + +def minimum_cost_path(matrix: list[list[int]]) -> int: + """ + Find the minimum cost traced by all possible paths from top left to bottom right in + a given matrix + + >>> minimum_cost_path([[2, 1], [3, 1], [4, 2]]) + 6 + + >>> minimum_cost_path([[2, 1, 4], [2, 1, 3], [3, 2, 1]]) + 7 + """ + + # preprocessing the first row + for i in range(1, len(matrix[0])): + matrix[0][i] += matrix[0][i - 1] + + # preprocessing the first column + for i in range(1, len(matrix)): + matrix[i][0] += matrix[i - 1][0] + + # updating the path cost for current position + for i in range(1, len(matrix)): + for j in range(1, len(matrix[0])): + matrix[i][j] += min(matrix[i - 1][j], matrix[i][j - 1]) + + return matrix[-1][-1] + + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/dynamic_programming/minimum_partition.py b/python-mega-algo/dynamic_programming/minimum_partition.py new file mode 100644 index 00000000..8fad4ef3 --- /dev/null +++ b/python-mega-algo/dynamic_programming/minimum_partition.py @@ -0,0 +1,30 @@ +""" +Partition a set into two subsets such that the difference of subset sums is minimum +""" + + +def findMin(arr): + n = len(arr) + s = sum(arr) + + dp = [[False for x in range(s + 1)] for y in range(n + 1)] + + for i in range(1, n + 1): + dp[i][0] = True + + for i in range(1, s + 1): + dp[0][i] = False + + for i in range(1, n + 1): + for j in range(1, s + 1): + dp[i][j] = dp[i][j - 1] + + if arr[i - 1] <= j: + dp[i][j] = dp[i][j] or dp[i - 1][j - arr[i - 1]] + + for j in range(int(s / 2), -1, -1): + if dp[n][j] is True: + diff = s - 2 * j + break + + return diff diff --git a/python-mega-algo/dynamic_programming/minimum_steps_to_one.py b/python-mega-algo/dynamic_programming/minimum_steps_to_one.py new file mode 100644 index 00000000..f4eb7033 --- /dev/null +++ b/python-mega-algo/dynamic_programming/minimum_steps_to_one.py @@ -0,0 +1,65 @@ +""" +YouTube Explanation: https://www.youtube.com/watch?v=f2xi3c1S95M + +Given an integer n, return the minimum steps to 1 + +AVAILABLE STEPS: + * Decrement by 1 + * if n is divisible by 2, divide by 2 + * if n is divisible by 3, divide by 3 + + +Example 1: n = 10 +10 -> 9 -> 3 -> 1 +Result: 3 steps + +Example 2: n = 15 +15 -> 5 -> 4 -> 2 -> 1 +Result: 4 steps + +Example 3: n = 6 +6 -> 2 -> 1 +Result: 2 step +""" + +from __future__ import annotations + +__author__ = "Alexander Joslin" + + +def min_steps_to_one(number: int) -> int: + """ + Minimum steps to 1 implemented using tabulation. + >>> min_steps_to_one(10) + 3 + >>> min_steps_to_one(15) + 4 + >>> min_steps_to_one(6) + 2 + + :param number: + :return int: + """ + + if number <= 0: + raise ValueError(f"n must be greater than 0. Got n = {number}") + + table = [number + 1] * (number + 1) + + # starting position + table[1] = 0 + for i in range(1, number): + table[i + 1] = min(table[i + 1], table[i] + 1) + # check if out of bounds + if i * 2 <= number: + table[i * 2] = min(table[i * 2], table[i] + 1) + # check if out of bounds + if i * 3 <= number: + table[i * 3] = min(table[i * 3], table[i] + 1) + return table[number] + + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/dynamic_programming/optimal_binary_search_tree.py b/python-mega-algo/dynamic_programming/optimal_binary_search_tree.py new file mode 100644 index 00000000..0d94c1b6 --- /dev/null +++ b/python-mega-algo/dynamic_programming/optimal_binary_search_tree.py @@ -0,0 +1,144 @@ +#!/usr/bin/env python3 + +# This Python program implements an optimal binary search tree (abbreviated BST) +# building dynamic programming algorithm that delivers O(n^2) performance. +# +# The goal of the optimal BST problem is to build a low-cost BST for a +# given set of nodes, each with its own key and frequency. The frequency +# of the node is defined as how many time the node is being searched. +# The search cost of binary search tree is given by this formula: +# +# cost(1, n) = sum{i = 1 to n}((depth(node_i) + 1) * node_i_freq) +# +# where n is number of nodes in the BST. The characteristic of low-cost +# BSTs is having a faster overall search time than other implementations. +# The reason for their fast search time is that the nodes with high +# frequencies will be placed near the root of the tree while the nodes +# with low frequencies will be placed near the leaves of the tree thus +# reducing search time in the most frequent instances. +import sys +from random import randint + + +class Node: + """Binary Search Tree Node""" + + def __init__(self, key, freq): + self.key = key + self.freq = freq + + def __str__(self): + """ + >>> str(Node(1, 2)) + 'Node(key=1, freq=2)' + """ + return f"Node(key={self.key}, freq={self.freq})" + + +def print_binary_search_tree(root, key, i, j, parent, is_left): + """ + Recursive function to print a BST from a root table. + + >>> key = [3, 8, 9, 10, 17, 21] + >>> root = [[0, 1, 1, 1, 1, 1], [0, 1, 1, 1, 1, 3], [0, 0, 2, 3, 3, 3], \ + [0, 0, 0, 3, 3, 3], [0, 0, 0, 0, 4, 5], [0, 0, 0, 0, 0, 5]] + >>> print_binary_search_tree(root, key, 0, 5, -1, False) + 8 is the root of the binary search tree. + 3 is the left child of key 8. + 10 is the right child of key 8. + 9 is the left child of key 10. + 21 is the right child of key 10. + 17 is the left child of key 21. + """ + if i > j or i < 0 or j > len(root) - 1: + return + + node = root[i][j] + if parent == -1: # root does not have a parent + print(f"{key[node]} is the root of the binary search tree.") + elif is_left: + print(f"{key[node]} is the left child of key {parent}.") + else: + print(f"{key[node]} is the right child of key {parent}.") + + print_binary_search_tree(root, key, i, node - 1, key[node], True) + print_binary_search_tree(root, key, node + 1, j, key[node], False) + + +def find_optimal_binary_search_tree(nodes): + """ + This function calculates and prints the optimal binary search tree. + The dynamic programming algorithm below runs in O(n^2) time. + Implemented from CLRS (Introduction to Algorithms) book. + https://en.wikipedia.org/wiki/Introduction_to_Algorithms + + >>> find_optimal_binary_search_tree([Node(12, 8), Node(10, 34), Node(20, 50), \ + Node(42, 3), Node(25, 40), Node(37, 30)]) + Binary search tree nodes: + Node(key=10, freq=34) + Node(key=12, freq=8) + Node(key=20, freq=50) + Node(key=25, freq=40) + Node(key=37, freq=30) + Node(key=42, freq=3) + + The cost of optimal BST for given tree nodes is 324. + 20 is the root of the binary search tree. + 10 is the left child of key 20. + 12 is the right child of key 10. + 25 is the right child of key 20. + 37 is the right child of key 25. + 42 is the right child of key 37. + """ + # Tree nodes must be sorted first, the code below sorts the keys in + # increasing order and rearrange its frequencies accordingly. + nodes.sort(key=lambda node: node.key) + + n = len(nodes) + + keys = [nodes[i].key for i in range(n)] + freqs = [nodes[i].freq for i in range(n)] + + # This 2D array stores the overall tree cost (which's as minimized as possible); + # for a single key, cost is equal to frequency of the key. + dp = [[freqs[i] if i == j else 0 for j in range(n)] for i in range(n)] + # sum[i][j] stores the sum of key frequencies between i and j inclusive in nodes + # array + sum = [[freqs[i] if i == j else 0 for j in range(n)] for i in range(n)] + # stores tree roots that will be used later for constructing binary search tree + root = [[i if i == j else 0 for j in range(n)] for i in range(n)] + + for interval_length in range(2, n + 1): + for i in range(n - interval_length + 1): + j = i + interval_length - 1 + + dp[i][j] = sys.maxsize # set the value to "infinity" + sum[i][j] = sum[i][j - 1] + freqs[j] + + # Apply Knuth's optimization + # Loop without optimization: for r in range(i, j + 1): + for r in range(root[i][j - 1], root[i + 1][j] + 1): # r is a temporal root + left = dp[i][r - 1] if r != i else 0 # optimal cost for left subtree + right = dp[r + 1][j] if r != j else 0 # optimal cost for right subtree + cost = left + sum[i][j] + right + + if dp[i][j] > cost: + dp[i][j] = cost + root[i][j] = r + + print("Binary search tree nodes:") + for node in nodes: + print(node) + + print(f"\nThe cost of optimal BST for given tree nodes is {dp[0][n - 1]}.") + print_binary_search_tree(root, keys, 0, n - 1, -1, False) + + +def main(): + # A sample binary search tree + nodes = [Node(i, randint(1, 50)) for i in range(10, 0, -1)] + find_optimal_binary_search_tree(nodes) + + +if __name__ == "__main__": + main() diff --git a/python-mega-algo/dynamic_programming/right.html b/python-mega-algo/dynamic_programming/right.html new file mode 100644 index 00000000..f2d1a125 --- /dev/null +++ b/python-mega-algo/dynamic_programming/right.html @@ -0,0 +1,36 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/dynamic_programming + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + + + + + + + + +
    FileFileFileFile
    abbreviation.py fractiona...ack.py longest_s...ray.py minimum_s...one.py 
    bitmask.py fractiona...k_2.py matrix_ch...der.py optimal_b...ree.py 
    climbing_stairs.py integer_p...ion.py max_non_a...sum.py rod_cutting.py 
    edit_distance.py iterating...sks.py max_sub_array.py subset_ge...ion.py 
    factorial.py knapsack.py max_sum_c...nce.py sum_of_subset.py 
    fast_fibonacci.py longest_c...nce.py minimum_c...nge.py __init__.py 
    fibonacci.py longest_i...nce.py minimum_c...ath.py k_means_c....py_tf 
    floyd_warshall.py longest_i...gn).py minimum_p...ion.py 
    + +

    +Folders: 1
    +Files: 31
    +Size of all files: 58887 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/dynamic_programming/rod_cutting.py b/python-mega-algo/dynamic_programming/rod_cutting.py new file mode 100644 index 00000000..442a39cb --- /dev/null +++ b/python-mega-algo/dynamic_programming/rod_cutting.py @@ -0,0 +1,207 @@ +""" +This module provides two implementations for the rod-cutting problem: +1. A naive recursive implementation which has an exponential runtime +2. Two dynamic programming implementations which have quadratic runtime + +The rod-cutting problem is the problem of finding the maximum possible revenue +obtainable from a rod of length ``n`` given a list of prices for each integral piece +of the rod. The maximum revenue can thus be obtained by cutting the rod and selling the +pieces separately or not cutting it at all if the price of it is the maximum obtainable. + +""" + + +def naive_cut_rod_recursive(n: int, prices: list): + """ + Solves the rod-cutting problem via naively without using the benefit of dynamic + programming. The results is the same sub-problems are solved several times + leading to an exponential runtime + + Runtime: O(2^n) + + Arguments + ------- + n: int, the length of the rod + prices: list, the prices for each piece of rod. ``p[i-i]`` is the + price for a rod of length ``i`` + + Returns + ------- + The maximum revenue obtainable for a rod of length n given the list of prices + for each piece. + + Examples + -------- + >>> naive_cut_rod_recursive(4, [1, 5, 8, 9]) + 10 + >>> naive_cut_rod_recursive(10, [1, 5, 8, 9, 10, 17, 17, 20, 24, 30]) + 30 + """ + + _enforce_args(n, prices) + if n == 0: + return 0 + max_revue = float("-inf") + for i in range(1, n + 1): + max_revue = max( + max_revue, prices[i - 1] + naive_cut_rod_recursive(n - i, prices) + ) + + return max_revue + + +def top_down_cut_rod(n: int, prices: list): + """ + Constructs a top-down dynamic programming solution for the rod-cutting + problem via memoization. This function serves as a wrapper for + _top_down_cut_rod_recursive + + Runtime: O(n^2) + + Arguments + -------- + n: int, the length of the rod + prices: list, the prices for each piece of rod. ``p[i-i]`` is the + price for a rod of length ``i`` + + Note + ---- + For convenience and because Python's lists using 0-indexing, length(max_rev) = + n + 1, to accommodate for the revenue obtainable from a rod of length 0. + + Returns + ------- + The maximum revenue obtainable for a rod of length n given the list of prices + for each piece. + + Examples + ------- + >>> top_down_cut_rod(4, [1, 5, 8, 9]) + 10 + >>> top_down_cut_rod(10, [1, 5, 8, 9, 10, 17, 17, 20, 24, 30]) + 30 + """ + _enforce_args(n, prices) + max_rev = [float("-inf") for _ in range(n + 1)] + return _top_down_cut_rod_recursive(n, prices, max_rev) + + +def _top_down_cut_rod_recursive(n: int, prices: list, max_rev: list): + """ + Constructs a top-down dynamic programming solution for the rod-cutting problem + via memoization. + + Runtime: O(n^2) + + Arguments + -------- + n: int, the length of the rod + prices: list, the prices for each piece of rod. ``p[i-i]`` is the + price for a rod of length ``i`` + max_rev: list, the computed maximum revenue for a piece of rod. + ``max_rev[i]`` is the maximum revenue obtainable for a rod of length ``i`` + + Returns + ------- + The maximum revenue obtainable for a rod of length n given the list of prices + for each piece. + """ + if max_rev[n] >= 0: + return max_rev[n] + elif n == 0: + return 0 + else: + max_revenue = float("-inf") + for i in range(1, n + 1): + max_revenue = max( + max_revenue, + prices[i - 1] + _top_down_cut_rod_recursive(n - i, prices, max_rev), + ) + + max_rev[n] = max_revenue + + return max_rev[n] + + +def bottom_up_cut_rod(n: int, prices: list): + """ + Constructs a bottom-up dynamic programming solution for the rod-cutting problem + + Runtime: O(n^2) + + Arguments + ---------- + n: int, the maximum length of the rod. + prices: list, the prices for each piece of rod. ``p[i-i]`` is the + price for a rod of length ``i`` + + Returns + ------- + The maximum revenue obtainable from cutting a rod of length n given + the prices for each piece of rod p. + + Examples + ------- + >>> bottom_up_cut_rod(4, [1, 5, 8, 9]) + 10 + >>> bottom_up_cut_rod(10, [1, 5, 8, 9, 10, 17, 17, 20, 24, 30]) + 30 + """ + _enforce_args(n, prices) + + # length(max_rev) = n + 1, to accommodate for the revenue obtainable from a rod of + # length 0. + max_rev = [float("-inf") for _ in range(n + 1)] + max_rev[0] = 0 + + for i in range(1, n + 1): + max_revenue_i = max_rev[i] + for j in range(1, i + 1): + max_revenue_i = max(max_revenue_i, prices[j - 1] + max_rev[i - j]) + + max_rev[i] = max_revenue_i + + return max_rev[n] + + +def _enforce_args(n: int, prices: list): + """ + Basic checks on the arguments to the rod-cutting algorithms + + n: int, the length of the rod + prices: list, the price list for each piece of rod. + + Throws ValueError: + + if n is negative or there are fewer items in the price list than the length of + the rod + """ + if n < 0: + raise ValueError(f"n must be greater than or equal to 0. Got n = {n}") + + if n > len(prices): + raise ValueError( + f"Each integral piece of rod must have a corresponding " + f"price. Got n = {n} but length of prices = {len(prices)}" + ) + + +def main(): + prices = [6, 10, 12, 15, 20, 23] + n = len(prices) + + # the best revenue comes from cutting the rod into 6 pieces, each + # of length 1 resulting in a revenue of 6 * 6 = 36. + expected_max_revenue = 36 + + max_rev_top_down = top_down_cut_rod(n, prices) + max_rev_bottom_up = bottom_up_cut_rod(n, prices) + max_rev_naive = naive_cut_rod_recursive(n, prices) + + assert expected_max_revenue == max_rev_top_down + assert max_rev_top_down == max_rev_bottom_up + assert max_rev_bottom_up == max_rev_naive + + +if __name__ == "__main__": + main() diff --git a/python-mega-algo/dynamic_programming/subset_generation.py b/python-mega-algo/dynamic_programming/subset_generation.py new file mode 100644 index 00000000..4781b23b --- /dev/null +++ b/python-mega-algo/dynamic_programming/subset_generation.py @@ -0,0 +1,43 @@ +# Print all subset combinations of n element in given set of r element. + + +def combination_util(arr, n, r, index, data, i): + """ + Current combination is ready to be printed, print it + arr[] ---> Input Array + data[] ---> Temporary array to store current combination + start & end ---> Staring and Ending indexes in arr[] + index ---> Current index in data[] + r ---> Size of a combination to be printed + """ + if index == r: + for j in range(r): + print(data[j], end=" ") + print(" ") + return + # When no more elements are there to put in data[] + if i >= n: + return + # current is included, put next at next location + data[index] = arr[i] + combination_util(arr, n, r, index + 1, data, i + 1) + # current is excluded, replace it with + # next (Note that i+1 is passed, but + # index is not changed) + combination_util(arr, n, r, index, data, i + 1) + # The main function that prints all combinations + # of size r in arr[] of size n. This function + # mainly uses combinationUtil() + + +def print_combination(arr, n, r): + # A temporary array to store all combination one by one + data = [0] * r + # Print all combination using temporary array 'data[]' + combination_util(arr, n, r, 0, data, 0) + + +# Driver function to check for above function +arr = [10, 20, 30, 40, 50] +print_combination(arr, len(arr), 3) +# This code is contributed by Ambuj sahu diff --git a/python-mega-algo/dynamic_programming/sum_of_subset.py b/python-mega-algo/dynamic_programming/sum_of_subset.py new file mode 100644 index 00000000..a12177b5 --- /dev/null +++ b/python-mega-algo/dynamic_programming/sum_of_subset.py @@ -0,0 +1,37 @@ +def isSumSubset(arr, arrLen, requiredSum): + """ + >>> isSumSubset([2, 4, 6, 8], 4, 5) + False + >>> isSumSubset([2, 4, 6, 8], 4, 14) + True + """ + # a subset value says 1 if that subset sum can be formed else 0 + # initially no subsets can be formed hence False/0 + subset = [[False for i in range(requiredSum + 1)] for i in range(arrLen + 1)] + + # for each arr value, a sum of zero(0) can be formed by not taking any element + # hence True/1 + for i in range(arrLen + 1): + subset[i][0] = True + + # sum is not zero and set is empty then false + for i in range(1, requiredSum + 1): + subset[0][i] = False + + for i in range(1, arrLen + 1): + for j in range(1, requiredSum + 1): + if arr[i - 1] > j: + subset[i][j] = subset[i - 1][j] + if arr[i - 1] <= j: + subset[i][j] = subset[i - 1][j] or subset[i - 1][j - arr[i - 1]] + + # uncomment to print the subset + # for i in range(arrLen+1): + # print(subset[i]) + print(subset[arrLen][requiredSum]) + + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/electronics/electric_power.py b/python-mega-algo/electronics/electric_power.py new file mode 100644 index 00000000..e4e685bb --- /dev/null +++ b/python-mega-algo/electronics/electric_power.py @@ -0,0 +1,52 @@ +# https://en.m.wikipedia.org/wiki/Electric_power +from collections import namedtuple +from typing import Tuple + + +def electric_power(voltage: float, current: float, power: float) -> Tuple: + """ + This function can calculate any one of the three (voltage, current, power), + fundamental value of electrical system. + examples are below: + >>> electric_power(voltage=0, current=2, power=5) + result(name='voltage', value=2.5) + >>> electric_power(voltage=2, current=2, power=0) + result(name='power', value=4.0) + >>> electric_power(voltage=-2, current=3, power=0) + result(name='power', value=6.0) + >>> electric_power(voltage=2, current=4, power=2) + Traceback (most recent call last): + File "", line 15, in + ValueError: Only one argument must be 0 + >>> electric_power(voltage=0, current=0, power=2) + Traceback (most recent call last): + File "", line 19, in + ValueError: Only one argument must be 0 + >>> electric_power(voltage=0, current=2, power=-4) + Traceback (most recent call last): + File "", line 23, in >> electric_power(voltage=2.2, current=2.2, power=0) + result(name='power', value=4.84) + """ + result = namedtuple("result", "name value") + if (voltage, current, power).count(0) != 1: + raise ValueError("Only one argument must be 0") + elif power < 0: + raise ValueError( + "Power cannot be negative in any electrical/electronics system" + ) + elif voltage == 0: + return result("voltage", power / current) + elif current == 0: + return result("current", power / voltage) + elif power == 0: + return result("power", float(round(abs(voltage * current), 2))) + else: + raise ValueError("Exactly one argument must be 0") + + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/electronics/ohms_law.py b/python-mega-algo/electronics/ohms_law.py new file mode 100644 index 00000000..41bffa9f --- /dev/null +++ b/python-mega-algo/electronics/ohms_law.py @@ -0,0 +1,42 @@ +# https://en.wikipedia.org/wiki/Ohm%27s_law +from typing import Dict + + +def ohms_law(voltage: float, current: float, resistance: float) -> Dict[str, float]: + """ + Apply Ohm's Law, on any two given electrical values, which can be voltage, current, + and resistance, and then in a Python dict return name/value pair of the zero value. + + >>> ohms_law(voltage=10, resistance=5, current=0) + {'current': 2.0} + >>> ohms_law(voltage=0, current=0, resistance=10) + Traceback (most recent call last): + ... + ValueError: One and only one argument must be 0 + >>> ohms_law(voltage=0, current=1, resistance=-2) + Traceback (most recent call last): + ... + ValueError: Resistance cannot be negative + >>> ohms_law(resistance=0, voltage=-10, current=1) + {'resistance': -10.0} + >>> ohms_law(voltage=0, current=-1.5, resistance=2) + {'voltage': -3.0} + """ + if (voltage, current, resistance).count(0) != 1: + raise ValueError("One and only one argument must be 0") + if resistance < 0: + raise ValueError("Resistance cannot be negative") + if voltage == 0: + return {"voltage": float(current * resistance)} + elif current == 0: + return {"current": voltage / resistance} + elif resistance == 0: + return {"resistance": voltage / current} + else: + raise ValueError("Exactly one argument must be 0") + + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/electronics/right.html b/python-mega-algo/electronics/right.html new file mode 100644 index 00000000..3305486f --- /dev/null +++ b/python-mega-algo/electronics/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/electronics + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    electric_power.py ohms_law.py 
    + +

    +Folders: 1
    +Files: 2
    +Size of all files: 3410 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/file_transfer/__init__.py b/python-mega-algo/file_transfer/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/file_transfer/mytext.txt b/python-mega-algo/file_transfer/mytext.txt new file mode 100644 index 00000000..54cfa7f7 --- /dev/null +++ b/python-mega-algo/file_transfer/mytext.txt @@ -0,0 +1,6 @@ +Hello +This is sample data +«küßî» +“ЌÏБЇ†+😀😉 +😋 diff --git a/python-mega-algo/file_transfer/receive_file.py b/python-mega-algo/file_transfer/receive_file.py new file mode 100644 index 00000000..37a50303 --- /dev/null +++ b/python-mega-algo/file_transfer/receive_file.py @@ -0,0 +1,23 @@ +if __name__ == "__main__": + import socket # Import socket module + + sock = socket.socket() # Create a socket object + host = socket.gethostname() # Get local machine name + port = 12312 + + sock.connect((host, port)) + sock.send(b"Hello server!") + + with open("Received_file", "wb") as out_file: + print("File opened") + print("Receiving data...") + while True: + data = sock.recv(1024) + print(f"{data = }") + if not data: + break + out_file.write(data) # Write data to a file + + print("Successfully got the file") + sock.close() + print("Connection closed") diff --git a/python-mega-algo/file_transfer/right.html b/python-mega-algo/file_transfer/right.html new file mode 100644 index 00000000..065bcdaf --- /dev/null +++ b/python-mega-algo/file_transfer/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/file_transfer + + + + + + + + +
    Folders
    <Go Back> tests
    +
    + + + + +
    FileFileFileFile
    receive_file.py send_file.py __init__.py mytext.txt 
    + +

    +Folders: 2
    +Files: 4
    +Size of all files: 1756 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/file_transfer/send_file.py b/python-mega-algo/file_transfer/send_file.py new file mode 100644 index 00000000..1c56e48f --- /dev/null +++ b/python-mega-algo/file_transfer/send_file.py @@ -0,0 +1,35 @@ +def send_file(filename: str = "mytext.txt", testing: bool = False) -> None: + import socket + + port = 12312 # Reserve a port for your service. + sock = socket.socket() # Create a socket object + host = socket.gethostname() # Get local machine name + sock.bind((host, port)) # Bind to the port + sock.listen(5) # Now wait for client connection. + + print("Server listening....") + + while True: + conn, addr = sock.accept() # Establish connection with client. + print(f"Got connection from {addr}") + data = conn.recv(1024) + print(f"Server received: {data = }") + + with open(filename, "rb") as in_file: + data = in_file.read(1024) + while data: + conn.send(data) + print(f"Sent {data!r}") + data = in_file.read(1024) + + print("Done sending") + conn.close() + if testing: # Allow the test to complete + break + + sock.shutdown(1) + sock.close() + + +if __name__ == "__main__": + send_file() diff --git a/python-mega-algo/file_transfer/tests/__init__.py b/python-mega-algo/file_transfer/tests/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/file_transfer/tests/right.html b/python-mega-algo/file_transfer/tests/right.html new file mode 100644 index 00000000..51742312 --- /dev/null +++ b/python-mega-algo/file_transfer/tests/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/file_transfer/tests + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    test_send_file.py __init__.py 
    + +

    +Folders: 1
    +Files: 2
    +Size of all files: 1013 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/file_transfer/tests/test_send_file.py b/python-mega-algo/file_transfer/tests/test_send_file.py new file mode 100644 index 00000000..2a600844 --- /dev/null +++ b/python-mega-algo/file_transfer/tests/test_send_file.py @@ -0,0 +1,31 @@ +from unittest.mock import Mock, patch + +from file_transfer.send_file import send_file + + +@patch("socket.socket") +@patch("builtins.open") +def test_send_file_running_as_expected(file, sock): + # ===== initialization ===== + conn = Mock() + sock.return_value.accept.return_value = conn, Mock() + f = iter([1, None]) + file.return_value.__enter__.return_value.read.side_effect = lambda _: next(f) + + # ===== invoke ===== + send_file(filename="mytext.txt", testing=True) + + # ===== ensurance ===== + sock.assert_called_once() + sock.return_value.bind.assert_called_once() + sock.return_value.listen.assert_called_once() + sock.return_value.accept.assert_called_once() + conn.recv.assert_called_once() + + file.return_value.__enter__.assert_called_once() + file.return_value.__enter__.return_value.read.assert_called() + + conn.send.assert_called_once() + conn.close.assert_called_once() + sock.return_value.shutdown.assert_called_once() + sock.return_value.close.assert_called_once() diff --git a/python-mega-algo/fractals/koch_snowflake.py b/python-mega-algo/fractals/koch_snowflake.py new file mode 100644 index 00000000..07c1835b --- /dev/null +++ b/python-mega-algo/fractals/koch_snowflake.py @@ -0,0 +1,116 @@ +""" +Description + The Koch snowflake is a fractal curve and one of the earliest fractals to + have been described. The Koch snowflake can be built up iteratively, in a + sequence of stages. The first stage is an equilateral triangle, and each + successive stage is formed by adding outward bends to each side of the + previous stage, making smaller equilateral triangles. + This can be achieved through the following steps for each line: + 1. divide the line segment into three segments of equal length. + 2. draw an equilateral triangle that has the middle segment from step 1 + as its base and points outward. + 3. remove the line segment that is the base of the triangle from step 2. + (description adapted from https://en.wikipedia.org/wiki/Koch_snowflake ) + (for a more detailed explanation and an implementation in the + Processing language, see https://natureofcode.com/book/chapter-8-fractals/ + #84-the-koch-curve-and-the-arraylist-technique ) + +Requirements (pip): + - matplotlib + - numpy +""" + + +from __future__ import annotations + +import matplotlib.pyplot as plt # type: ignore +import numpy + +# initial triangle of Koch snowflake +VECTOR_1 = numpy.array([0, 0]) +VECTOR_2 = numpy.array([0.5, 0.8660254]) +VECTOR_3 = numpy.array([1, 0]) +INITIAL_VECTORS = [VECTOR_1, VECTOR_2, VECTOR_3, VECTOR_1] + +# uncomment for simple Koch curve instead of Koch snowflake +# INITIAL_VECTORS = [VECTOR_1, VECTOR_3] + + +def iterate(initial_vectors: list[numpy.ndarray], steps: int) -> list[numpy.ndarray]: + """ + Go through the number of iterations determined by the argument "steps". + Be careful with high values (above 5) since the time to calculate increases + exponentially. + >>> iterate([numpy.array([0, 0]), numpy.array([1, 0])], 1) + [array([0, 0]), array([0.33333333, 0. ]), array([0.5 , \ +0.28867513]), array([0.66666667, 0. ]), array([1, 0])] + """ + vectors = initial_vectors + for i in range(steps): + vectors = iteration_step(vectors) + return vectors + + +def iteration_step(vectors: list[numpy.ndarray]) -> list[numpy.ndarray]: + """ + Loops through each pair of adjacent vectors. Each line between two adjacent + vectors is divided into 4 segments by adding 3 additional vectors in-between + the original two vectors. The vector in the middle is constructed through a + 60 degree rotation so it is bent outwards. + >>> iteration_step([numpy.array([0, 0]), numpy.array([1, 0])]) + [array([0, 0]), array([0.33333333, 0. ]), array([0.5 , \ +0.28867513]), array([0.66666667, 0. ]), array([1, 0])] + """ + new_vectors = [] + for i, start_vector in enumerate(vectors[:-1]): + end_vector = vectors[i + 1] + new_vectors.append(start_vector) + difference_vector = end_vector - start_vector + new_vectors.append(start_vector + difference_vector / 3) + new_vectors.append( + start_vector + difference_vector / 3 + rotate(difference_vector / 3, 60) + ) + new_vectors.append(start_vector + difference_vector * 2 / 3) + new_vectors.append(vectors[-1]) + return new_vectors + + +def rotate(vector: numpy.ndarray, angle_in_degrees: float) -> numpy.ndarray: + """ + Standard rotation of a 2D vector with a rotation matrix + (see https://en.wikipedia.org/wiki/Rotation_matrix ) + >>> rotate(numpy.array([1, 0]), 60) + array([0.5 , 0.8660254]) + >>> rotate(numpy.array([1, 0]), 90) + array([6.123234e-17, 1.000000e+00]) + """ + theta = numpy.radians(angle_in_degrees) + c, s = numpy.cos(theta), numpy.sin(theta) + rotation_matrix = numpy.array(((c, -s), (s, c))) + return numpy.dot(rotation_matrix, vector) + + +def plot(vectors: list[numpy.ndarray]) -> None: + """ + Utility function to plot the vectors using matplotlib.pyplot + No doctest was implemented since this function does not have a return value + """ + # avoid stretched display of graph + axes = plt.gca() + axes.set_aspect("equal") + + # matplotlib.pyplot.plot takes a list of all x-coordinates and a list of all + # y-coordinates as inputs, which are constructed from the vector-list using + # zip() + x_coordinates, y_coordinates = zip(*vectors) + plt.plot(x_coordinates, y_coordinates) + plt.show() + + +if __name__ == "__main__": + import doctest + + doctest.testmod() + + processed_vectors = iterate(INITIAL_VECTORS, 5) + plot(processed_vectors) diff --git a/python-mega-algo/fractals/mandelbrot.py b/python-mega-algo/fractals/mandelbrot.py new file mode 100644 index 00000000..e828e3a3 --- /dev/null +++ b/python-mega-algo/fractals/mandelbrot.py @@ -0,0 +1,150 @@ +""" +The Mandelbrot set is the set of complex numbers "c" for which the series +"z_(n+1) = z_n * z_n + c" does not diverge, i.e. remains bounded. Thus, a +complex number "c" is a member of the Mandelbrot set if, when starting with +"z_0 = 0" and applying the iteration repeatedly, the absolute value of +"z_n" remains bounded for all "n > 0". Complex numbers can be written as +"a + b*i": "a" is the real component, usually drawn on the x-axis, and "b*i" +is the imaginary component, usually drawn on the y-axis. Most visualizations +of the Mandelbrot set use a color-coding to indicate after how many steps in +the series the numbers outside the set diverge. Images of the Mandelbrot set +exhibit an elaborate and infinitely complicated boundary that reveals +progressively ever-finer recursive detail at increasing magnifications, making +the boundary of the Mandelbrot set a fractal curve. +(description adapted from https://en.wikipedia.org/wiki/Mandelbrot_set ) +(see also https://en.wikipedia.org/wiki/Plotting_algorithms_for_the_Mandelbrot_set ) +""" + + +import colorsys + +from PIL import Image # type: ignore + + +def get_distance(x: float, y: float, max_step: int) -> float: + """ + Return the relative distance (= step/max_step) after which the complex number + constituted by this x-y-pair diverges. Members of the Mandelbrot set do not + diverge so their distance is 1. + + >>> get_distance(0, 0, 50) + 1.0 + >>> get_distance(0.5, 0.5, 50) + 0.061224489795918366 + >>> get_distance(2, 0, 50) + 0.0 + """ + a = x + b = y + for step in range(max_step): + a_new = a * a - b * b + x + b = 2 * a * b + y + a = a_new + + # divergence happens for all complex number with an absolute value + # greater than 4 + if a * a + b * b > 4: + break + return step / (max_step - 1) + + +def get_black_and_white_rgb(distance: float) -> tuple: + """ + Black&white color-coding that ignores the relative distance. The Mandelbrot + set is black, everything else is white. + + >>> get_black_and_white_rgb(0) + (255, 255, 255) + >>> get_black_and_white_rgb(0.5) + (255, 255, 255) + >>> get_black_and_white_rgb(1) + (0, 0, 0) + """ + if distance == 1: + return (0, 0, 0) + else: + return (255, 255, 255) + + +def get_color_coded_rgb(distance: float) -> tuple: + """ + Color-coding taking the relative distance into account. The Mandelbrot set + is black. + + >>> get_color_coded_rgb(0) + (255, 0, 0) + >>> get_color_coded_rgb(0.5) + (0, 255, 255) + >>> get_color_coded_rgb(1) + (0, 0, 0) + """ + if distance == 1: + return (0, 0, 0) + else: + return tuple(round(i * 255) for i in colorsys.hsv_to_rgb(distance, 1, 1)) + + +def get_image( + image_width: int = 800, + image_height: int = 600, + figure_center_x: float = -0.6, + figure_center_y: float = 0, + figure_width: float = 3.2, + max_step: int = 50, + use_distance_color_coding: bool = True, +) -> Image.Image: + """ + Function to generate the image of the Mandelbrot set. Two types of coordinates + are used: image-coordinates that refer to the pixels and figure-coordinates + that refer to the complex numbers inside and outside the Mandelbrot set. The + figure-coordinates in the arguments of this function determine which section + of the Mandelbrot set is viewed. The main area of the Mandelbrot set is + roughly between "-1.5 < x < 0.5" and "-1 < y < 1" in the figure-coordinates. + + >>> get_image().load()[0,0] + (255, 0, 0) + >>> get_image(use_distance_color_coding = False).load()[0,0] + (255, 255, 255) + """ + img = Image.new("RGB", (image_width, image_height)) + pixels = img.load() + + # loop through the image-coordinates + for image_x in range(image_width): + for image_y in range(image_height): + + # determine the figure-coordinates based on the image-coordinates + figure_height = figure_width / image_width * image_height + figure_x = figure_center_x + (image_x / image_width - 0.5) * figure_width + figure_y = figure_center_y + (image_y / image_height - 0.5) * figure_height + + distance = get_distance(figure_x, figure_y, max_step) + + # color the corresponding pixel based on the selected coloring-function + if use_distance_color_coding: + pixels[image_x, image_y] = get_color_coded_rgb(distance) + else: + pixels[image_x, image_y] = get_black_and_white_rgb(distance) + + return img + + +if __name__ == "__main__": + import doctest + + doctest.testmod() + + # colored version, full figure + img = get_image() + + # uncomment for colored version, different section, zoomed in + # img = get_image(figure_center_x = -0.6, figure_center_y = -0.4, + # figure_width = 0.8) + + # uncomment for black and white version, full figure + # img = get_image(use_distance_color_coding = False) + + # uncomment to save the image + # img.save("mandelbrot.png") + + img.show() diff --git a/python-mega-algo/fractals/right.html b/python-mega-algo/fractals/right.html new file mode 100644 index 00000000..8719f214 --- /dev/null +++ b/python-mega-algo/fractals/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/fractals + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    koch_snowflake.py mandelbrot.py sierpinsk...gle.py 
    + +

    +Folders: 1
    +Files: 3
    +Size of all files: 11852 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/fractals/sierpinski_triangle.py b/python-mega-algo/fractals/sierpinski_triangle.py new file mode 100644 index 00000000..cf41ffa5 --- /dev/null +++ b/python-mega-algo/fractals/sierpinski_triangle.py @@ -0,0 +1,76 @@ +#!/usr/bin/python + +"""Author Anurag Kumar | anuragkumarak95@gmail.com | git/anuragkumarak95 + +Simple example of Fractal generation using recursive function. + +What is Sierpinski Triangle? +>>The Sierpinski triangle (also with the original orthography Sierpinski), also called +the Sierpinski gasket or the Sierpinski Sieve, is a fractal and attractive fixed set +with the overall shape of an equilateral triangle, subdivided recursively into smaller +equilateral triangles. Originally constructed as a curve, this is one of the basic +examples of self-similar sets, i.e., it is a mathematically generated pattern that can +be reproducible at any magnification or reduction. It is named after the Polish +mathematician Wacław Sierpinski, but appeared as a decorative pattern many centuries +prior to the work of Sierpinski. + +Requirements(pip): + - turtle + +Python: + - 2.6 + +Usage: + - $python sierpinski_triangle.py + +Credits: This code was written by editing the code from +http://www.riannetrujillo.com/blog/python-fractal/ + +""" +import sys +import turtle + +PROGNAME = "Sierpinski Triangle" + +points = [[-175, -125], [0, 175], [175, -125]] # size of triangle + + +def getMid(p1, p2): + return ((p1[0] + p2[0]) / 2, (p1[1] + p2[1]) / 2) # find midpoint + + +def triangle(points, depth): + + myPen.up() + myPen.goto(points[0][0], points[0][1]) + myPen.down() + myPen.goto(points[1][0], points[1][1]) + myPen.goto(points[2][0], points[2][1]) + myPen.goto(points[0][0], points[0][1]) + + if depth > 0: + triangle( + [points[0], getMid(points[0], points[1]), getMid(points[0], points[2])], + depth - 1, + ) + triangle( + [points[1], getMid(points[0], points[1]), getMid(points[1], points[2])], + depth - 1, + ) + triangle( + [points[2], getMid(points[2], points[1]), getMid(points[0], points[2])], + depth - 1, + ) + + +if __name__ == "__main__": + if len(sys.argv) != 2: + raise ValueError( + "right format for using this script: " + "$python fractals.py " + ) + myPen = turtle.Turtle() + myPen.ht() + myPen.speed(5) + myPen.pencolor("red") + triangle(points, int(sys.argv[1])) diff --git a/python-mega-algo/fuzzy_logic/__init__.py b/python-mega-algo/fuzzy_logic/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/fuzzy_logic/fuzzy_operations.py b/python-mega-algo/fuzzy_logic/fuzzy_operations.py new file mode 100644 index 00000000..0f573f15 --- /dev/null +++ b/python-mega-algo/fuzzy_logic/fuzzy_operations.py @@ -0,0 +1,102 @@ +"""README, Author - Jigyasa Gandhi(mailto:jigsgandhi97@gmail.com) +Requirements: + - scikit-fuzzy + - numpy + - matplotlib +Python: + - 3.5 +""" +import numpy as np +import skfuzzy as fuzz + +if __name__ == "__main__": + # Create universe of discourse in Python using linspace () + X = np.linspace(start=0, stop=75, num=75, endpoint=True, retstep=False) + + # Create two fuzzy sets by defining any membership function + # (trapmf(), gbellmf(), gaussmf(), etc). + abc1 = [0, 25, 50] + abc2 = [25, 50, 75] + young = fuzz.membership.trimf(X, abc1) + middle_aged = fuzz.membership.trimf(X, abc2) + + # Compute the different operations using inbuilt functions. + one = np.ones(75) + zero = np.zeros((75,)) + # 1. Union = max(µA(x), µB(x)) + union = fuzz.fuzzy_or(X, young, X, middle_aged)[1] + # 2. Intersection = min(µA(x), µB(x)) + intersection = fuzz.fuzzy_and(X, young, X, middle_aged)[1] + # 3. Complement (A) = (1- min(µA(x)) + complement_a = fuzz.fuzzy_not(young) + # 4. Difference (A/B) = min(µA(x),(1- µB(x))) + difference = fuzz.fuzzy_and(X, young, X, fuzz.fuzzy_not(middle_aged)[1])[1] + # 5. Algebraic Sum = [µA(x) + µB(x) – (µA(x) * µB(x))] + alg_sum = young + middle_aged - (young * middle_aged) + # 6. Algebraic Product = (µA(x) * µB(x)) + alg_product = young * middle_aged + # 7. Bounded Sum = min[1,(µA(x), µB(x))] + bdd_sum = fuzz.fuzzy_and(X, one, X, young + middle_aged)[1] + # 8. Bounded difference = min[0,(µA(x), µB(x))] + bdd_difference = fuzz.fuzzy_or(X, zero, X, young - middle_aged)[1] + + # max-min composition + # max-product composition + + # Plot each set A, set B and each operation result using plot() and subplot(). + from matplotlib import pyplot as plt + + plt.figure() + + plt.subplot(4, 3, 1) + plt.plot(X, young) + plt.title("Young") + plt.grid(True) + + plt.subplot(4, 3, 2) + plt.plot(X, middle_aged) + plt.title("Middle aged") + plt.grid(True) + + plt.subplot(4, 3, 3) + plt.plot(X, union) + plt.title("union") + plt.grid(True) + + plt.subplot(4, 3, 4) + plt.plot(X, intersection) + plt.title("intersection") + plt.grid(True) + + plt.subplot(4, 3, 5) + plt.plot(X, complement_a) + plt.title("complement_a") + plt.grid(True) + + plt.subplot(4, 3, 6) + plt.plot(X, difference) + plt.title("difference a/b") + plt.grid(True) + + plt.subplot(4, 3, 7) + plt.plot(X, alg_sum) + plt.title("alg_sum") + plt.grid(True) + + plt.subplot(4, 3, 8) + plt.plot(X, alg_product) + plt.title("alg_product") + plt.grid(True) + + plt.subplot(4, 3, 9) + plt.plot(X, bdd_sum) + plt.title("bdd_sum") + plt.grid(True) + + plt.subplot(4, 3, 10) + plt.plot(X, bdd_difference) + plt.title("bdd_difference") + plt.grid(True) + + plt.subplots_adjust(hspace=0.5) + plt.show() diff --git a/python-mega-algo/fuzzy_logic/right.html b/python-mega-algo/fuzzy_logic/right.html new file mode 100644 index 00000000..903f68e5 --- /dev/null +++ b/python-mega-algo/fuzzy_logic/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/fuzzy_logic + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    fuzzy_ope...ons.py __init__.py 
    + +

    +Folders: 1
    +Files: 2
    +Size of all files: 2827 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/genetic_algorithm/__init__.py b/python-mega-algo/genetic_algorithm/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/genetic_algorithm/basic_string.py b/python-mega-algo/genetic_algorithm/basic_string.py new file mode 100644 index 00000000..97dbe182 --- /dev/null +++ b/python-mega-algo/genetic_algorithm/basic_string.py @@ -0,0 +1,175 @@ +""" +Simple multithreaded algorithm to show how the 4 phases of a genetic algorithm works +(Evaluation, Selection, Crossover and Mutation) +https://en.wikipedia.org/wiki/Genetic_algorithm +Author: D4rkia +""" + +from __future__ import annotations + +import random + +# Maximum size of the population. bigger could be faster but is more memory expensive +N_POPULATION = 200 +# Number of elements selected in every generation for evolution the selection takes +# place from the best to the worst of that generation must be smaller than N_POPULATION +N_SELECTED = 50 +# Probability that an element of a generation can mutate changing one of its genes this +# guarantees that all genes will be used during evolution +MUTATION_PROBABILITY = 0.4 +# just a seed to improve randomness required by the algorithm +random.seed(random.randint(0, 1000)) + + +def basic(target: str, genes: list[str], debug: bool = True) -> tuple[int, int, str]: + """ + Verify that the target contains no genes besides the ones inside genes variable. + + >>> from string import ascii_lowercase + >>> basic("doctest", ascii_lowercase, debug=False)[2] + 'doctest' + >>> genes = list(ascii_lowercase) + >>> genes.remove("e") + >>> basic("test", genes) + Traceback (most recent call last): + ... + ValueError: ['e'] is not in genes list, evolution cannot converge + >>> genes.remove("s") + >>> basic("test", genes) + Traceback (most recent call last): + ... + ValueError: ['e', 's'] is not in genes list, evolution cannot converge + >>> genes.remove("t") + >>> basic("test", genes) + Traceback (most recent call last): + ... + ValueError: ['e', 's', 't'] is not in genes list, evolution cannot converge + """ + + # Verify if N_POPULATION is bigger than N_SELECTED + if N_POPULATION < N_SELECTED: + raise ValueError(f"{N_POPULATION} must be bigger than {N_SELECTED}") + # Verify that the target contains no genes besides the ones inside genes variable. + not_in_genes_list = sorted({c for c in target if c not in genes}) + if not_in_genes_list: + raise ValueError( + f"{not_in_genes_list} is not in genes list, evolution cannot converge" + ) + + # Generate random starting population + population = [] + for _ in range(N_POPULATION): + population.append("".join([random.choice(genes) for i in range(len(target))])) + + # Just some logs to know what the algorithms is doing + generation, total_population = 0, 0 + + # This loop will end when we will find a perfect match for our target + while True: + generation += 1 + total_population += len(population) + + # Random population created now it's time to evaluate + def evaluate(item: str, main_target: str = target) -> tuple[str, float]: + """ + Evaluate how similar the item is with the target by just + counting each char in the right position + >>> evaluate("Helxo Worlx", Hello World) + ["Helxo Worlx", 9] + """ + score = len( + [g for position, g in enumerate(item) if g == main_target[position]] + ) + return (item, float(score)) + + # Adding a bit of concurrency can make everything faster, + # + # import concurrent.futures + # population_score: list[tuple[str, float]] = [] + # with concurrent.futures.ThreadPoolExecutor( + # max_workers=NUM_WORKERS) as executor: + # futures = {executor.submit(evaluate, item) for item in population} + # concurrent.futures.wait(futures) + # population_score = [item.result() for item in futures] + # + # but with a simple algorithm like this will probably be slower + # we just need to call evaluate for every item inside population + population_score = [evaluate(item) for item in population] + + # Check if there is a matching evolution + population_score = sorted(population_score, key=lambda x: x[1], reverse=True) + if population_score[0][0] == target: + return (generation, total_population, population_score[0][0]) + + # Print the Best result every 10 generation + # just to know that the algorithm is working + if debug and generation % 10 == 0: + print( + f"\nGeneration: {generation}" + f"\nTotal Population:{total_population}" + f"\nBest score: {population_score[0][1]}" + f"\nBest string: {population_score[0][0]}" + ) + + # Flush the old population keeping some of the best evolutions + # Keeping this avoid regression of evolution + population_best = population[: int(N_POPULATION / 3)] + population.clear() + population.extend(population_best) + # Normalize population score from 0 to 1 + population_score = [ + (item, score / len(target)) for item, score in population_score + ] + + # Select, Crossover and Mutate a new population + def select(parent_1: tuple[str, float]) -> list[str]: + """Select the second parent and generate new population""" + pop = [] + # Generate more child proportionally to the fitness score + child_n = int(parent_1[1] * 100) + 1 + child_n = 10 if child_n >= 10 else child_n + for _ in range(child_n): + parent_2 = population_score[random.randint(0, N_SELECTED)][0] + child_1, child_2 = crossover(parent_1[0], parent_2) + # Append new string to the population list + pop.append(mutate(child_1)) + pop.append(mutate(child_2)) + return pop + + def crossover(parent_1: str, parent_2: str) -> tuple[str, str]: + """Slice and combine two string in a random point""" + random_slice = random.randint(0, len(parent_1) - 1) + child_1 = parent_1[:random_slice] + parent_2[random_slice:] + child_2 = parent_2[:random_slice] + parent_1[random_slice:] + return (child_1, child_2) + + def mutate(child: str) -> str: + """Mutate a random gene of a child with another one from the list""" + child_list = list(child) + if random.uniform(0, 1) < MUTATION_PROBABILITY: + child_list[random.randint(0, len(child)) - 1] = random.choice(genes) + return "".join(child_list) + + # This is Selection + for i in range(N_SELECTED): + population.extend(select(population_score[int(i)])) + # Check if the population has already reached the maximum value and if so, + # break the cycle. if this check is disabled the algorithm will take + # forever to compute large strings but will also calculate small string in + # a lot fewer generations + if len(population) > N_POPULATION: + break + + +if __name__ == "__main__": + target_str = ( + "This is a genetic algorithm to evaluate, combine, evolve, and mutate a string!" + ) + genes_list = list( + " ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklm" + "nopqrstuvwxyz.,;!?+-*#@^'èéòà€ù=)(&%$£/\\" + ) + print( + "\nGeneration: %s\nTotal Population: %s\nTarget: %s" + % basic(target_str, genes_list) + ) diff --git a/python-mega-algo/genetic_algorithm/right.html b/python-mega-algo/genetic_algorithm/right.html new file mode 100644 index 00000000..59599483 --- /dev/null +++ b/python-mega-algo/genetic_algorithm/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/genetic_algorithm + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    basic_string.py __init__.py 
    + +

    +Folders: 1
    +Files: 2
    +Size of all files: 7313 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/geodesy/__init__.py b/python-mega-algo/geodesy/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/geodesy/haversine_distance.py b/python-mega-algo/geodesy/haversine_distance.py new file mode 100644 index 00000000..de8ac7f8 --- /dev/null +++ b/python-mega-algo/geodesy/haversine_distance.py @@ -0,0 +1,56 @@ +from math import asin, atan, cos, radians, sin, sqrt, tan + + +def haversine_distance(lat1: float, lon1: float, lat2: float, lon2: float) -> float: + """ + Calculate great circle distance between two points in a sphere, + given longitudes and latitudes https://en.wikipedia.org/wiki/Haversine_formula + + We know that the globe is "sort of" spherical, so a path between two points + isn't exactly a straight line. We need to account for the Earth's curvature + when calculating distance from point A to B. This effect is negligible for + small distances but adds up as distance increases. The Haversine method treats + the earth as a sphere which allows us to "project" the two points A and B + onto the surface of that sphere and approximate the spherical distance between + them. Since the Earth is not a perfect sphere, other methods which model the + Earth's ellipsoidal nature are more accurate but a quick and modifiable + computation like Haversine can be handy for shorter range distances. + + Args: + lat1, lon1: latitude and longitude of coordinate 1 + lat2, lon2: latitude and longitude of coordinate 2 + Returns: + geographical distance between two points in metres + >>> from collections import namedtuple + >>> point_2d = namedtuple("point_2d", "lat lon") + >>> SAN_FRANCISCO = point_2d(37.774856, -122.424227) + >>> YOSEMITE = point_2d(37.864742, -119.537521) + >>> f"{haversine_distance(*SAN_FRANCISCO, *YOSEMITE):0,.0f} meters" + '254,352 meters' + """ + # CONSTANTS per WGS84 https://en.wikipedia.org/wiki/World_Geodetic_System + # Distance in metres(m) + AXIS_A = 6378137.0 + AXIS_B = 6356752.314245 + RADIUS = 6378137 + # Equation parameters + # Equation https://en.wikipedia.org/wiki/Haversine_formula#Formulation + flattening = (AXIS_A - AXIS_B) / AXIS_A + phi_1 = atan((1 - flattening) * tan(radians(lat1))) + phi_2 = atan((1 - flattening) * tan(radians(lat2))) + lambda_1 = radians(lon1) + lambda_2 = radians(lon2) + # Equation + sin_sq_phi = sin((phi_2 - phi_1) / 2) + sin_sq_lambda = sin((lambda_2 - lambda_1) / 2) + # Square both values + sin_sq_phi *= sin_sq_phi + sin_sq_lambda *= sin_sq_lambda + h_value = sqrt(sin_sq_phi + (cos(phi_1) * cos(phi_2) * sin_sq_lambda)) + return 2 * RADIUS * asin(h_value) + + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/geodesy/lamberts_ellipsoidal_distance.py b/python-mega-algo/geodesy/lamberts_ellipsoidal_distance.py new file mode 100644 index 00000000..bf8f1b9a --- /dev/null +++ b/python-mega-algo/geodesy/lamberts_ellipsoidal_distance.py @@ -0,0 +1,86 @@ +from math import atan, cos, radians, sin, tan + +from .haversine_distance import haversine_distance + + +def lamberts_ellipsoidal_distance( + lat1: float, lon1: float, lat2: float, lon2: float +) -> float: + + """ + Calculate the shortest distance along the surface of an ellipsoid between + two points on the surface of earth given longitudes and latitudes + https://en.wikipedia.org/wiki/Geographical_distance#Lambert's_formula_for_long_lines + + NOTE: This algorithm uses geodesy/haversine_distance.py to compute central angle, + sigma + + Representing the earth as an ellipsoid allows us to approximate distances between + points on the surface much better than a sphere. Ellipsoidal formulas treat the + Earth as an oblate ellipsoid which means accounting for the flattening that happens + at the North and South poles. Lambert's formulae provide accuracy on the order of + 10 meteres over thousands of kilometeres. Other methods can provide + millimeter-level accuracy but this is a simpler method to calculate long range + distances without increasing computational intensity. + + Args: + lat1, lon1: latitude and longitude of coordinate 1 + lat2, lon2: latitude and longitude of coordinate 2 + Returns: + geographical distance between two points in metres + + >>> from collections import namedtuple + >>> point_2d = namedtuple("point_2d", "lat lon") + >>> SAN_FRANCISCO = point_2d(37.774856, -122.424227) + >>> YOSEMITE = point_2d(37.864742, -119.537521) + >>> NEW_YORK = point_2d(40.713019, -74.012647) + >>> VENICE = point_2d(45.443012, 12.313071) + >>> f"{lamberts_ellipsoidal_distance(*SAN_FRANCISCO, *YOSEMITE):0,.0f} meters" + '254,351 meters' + >>> f"{lamberts_ellipsoidal_distance(*SAN_FRANCISCO, *NEW_YORK):0,.0f} meters" + '4,138,992 meters' + >>> f"{lamberts_ellipsoidal_distance(*SAN_FRANCISCO, *VENICE):0,.0f} meters" + '9,737,326 meters' + """ + + # CONSTANTS per WGS84 https://en.wikipedia.org/wiki/World_Geodetic_System + # Distance in metres(m) + AXIS_A = 6378137.0 + AXIS_B = 6356752.314245 + EQUATORIAL_RADIUS = 6378137 + + # Equation Parameters + # https://en.wikipedia.org/wiki/Geographical_distance#Lambert's_formula_for_long_lines + flattening = (AXIS_A - AXIS_B) / AXIS_A + # Parametric latitudes + # https://en.wikipedia.org/wiki/Latitude#Parametric_(or_reduced)_latitude + b_lat1 = atan((1 - flattening) * tan(radians(lat1))) + b_lat2 = atan((1 - flattening) * tan(radians(lat2))) + + # Compute central angle between two points + # using haversine theta. sigma = haversine_distance / equatorial radius + sigma = haversine_distance(lat1, lon1, lat2, lon2) / EQUATORIAL_RADIUS + + # Intermediate P and Q values + P_value = (b_lat1 + b_lat2) / 2 + Q_value = (b_lat2 - b_lat1) / 2 + + # Intermediate X value + # X = (sigma - sin(sigma)) * sin^2Pcos^2Q / cos^2(sigma/2) + X_numerator = (sin(P_value) ** 2) * (cos(Q_value) ** 2) + X_demonimator = cos(sigma / 2) ** 2 + X_value = (sigma - sin(sigma)) * (X_numerator / X_demonimator) + + # Intermediate Y value + # Y = (sigma + sin(sigma)) * cos^2Psin^2Q / sin^2(sigma/2) + Y_numerator = (cos(P_value) ** 2) * (sin(Q_value) ** 2) + Y_denominator = sin(sigma / 2) ** 2 + Y_value = (sigma + sin(sigma)) * (Y_numerator / Y_denominator) + + return EQUATORIAL_RADIUS * (sigma - ((flattening / 2) * (X_value + Y_value))) + + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/geodesy/right.html b/python-mega-algo/geodesy/right.html new file mode 100644 index 00000000..24b670c0 --- /dev/null +++ b/python-mega-algo/geodesy/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/geodesy + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    haversine...nce.py lamberts_...nce.py __init__.py 
    + +

    +Folders: 1
    +Files: 3
    +Size of all files: 5882 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/graphics/__init__.py b/python-mega-algo/graphics/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/graphics/bezier_curve.py b/python-mega-algo/graphics/bezier_curve.py new file mode 100644 index 00000000..2bb764fd --- /dev/null +++ b/python-mega-algo/graphics/bezier_curve.py @@ -0,0 +1,114 @@ +# https://en.wikipedia.org/wiki/B%C3%A9zier_curve +# https://www.tutorialspoint.com/computer_graphics/computer_graphics_curves.htm +from __future__ import annotations + +from scipy.special import comb # type: ignore + + +class BezierCurve: + """ + Bezier curve is a weighted sum of a set of control points. + Generate Bezier curves from a given set of control points. + This implementation works only for 2d coordinates in the xy plane. + """ + + def __init__(self, list_of_points: list[tuple[float, float]]): + """ + list_of_points: Control points in the xy plane on which to interpolate. These + points control the behavior (shape) of the Bezier curve. + """ + self.list_of_points = list_of_points + # Degree determines the flexibility of the curve. + # Degree = 1 will produce a straight line. + self.degree = len(list_of_points) - 1 + + def basis_function(self, t: float) -> list[float]: + """ + The basis function determines the weight of each control point at time t. + t: time value between 0 and 1 inclusive at which to evaluate the basis of + the curve. + returns the x, y values of basis function at time t + + >>> curve = BezierCurve([(1,1), (1,2)]) + >>> curve.basis_function(0) + [1.0, 0.0] + >>> curve.basis_function(1) + [0.0, 1.0] + """ + assert 0 <= t <= 1, "Time t must be between 0 and 1." + output_values: list[float] = [] + for i in range(len(self.list_of_points)): + # basis function for each i + output_values.append( + comb(self.degree, i) * ((1 - t) ** (self.degree - i)) * (t ** i) + ) + # the basis must sum up to 1 for it to produce a valid Bezier curve. + assert round(sum(output_values), 5) == 1 + return output_values + + def bezier_curve_function(self, t: float) -> tuple[float, float]: + """ + The function to produce the values of the Bezier curve at time t. + t: the value of time t at which to evaluate the Bezier function + Returns the x, y coordinates of the Bezier curve at time t. + The first point in the curve is when t = 0. + The last point in the curve is when t = 1. + + >>> curve = BezierCurve([(1,1), (1,2)]) + >>> curve.bezier_curve_function(0) + (1.0, 1.0) + >>> curve.bezier_curve_function(1) + (1.0, 2.0) + """ + + assert 0 <= t <= 1, "Time t must be between 0 and 1." + + basis_function = self.basis_function(t) + x = 0.0 + y = 0.0 + for i in range(len(self.list_of_points)): + # For all points, sum up the product of i-th basis function and i-th point. + x += basis_function[i] * self.list_of_points[i][0] + y += basis_function[i] * self.list_of_points[i][1] + return (x, y) + + def plot_curve(self, step_size: float = 0.01): + """ + Plots the Bezier curve using matplotlib plotting capabilities. + step_size: defines the step(s) at which to evaluate the Bezier curve. + The smaller the step size, the finer the curve produced. + """ + from matplotlib import pyplot as plt # type: ignore + + to_plot_x: list[float] = [] # x coordinates of points to plot + to_plot_y: list[float] = [] # y coordinates of points to plot + + t = 0.0 + while t <= 1: + value = self.bezier_curve_function(t) + to_plot_x.append(value[0]) + to_plot_y.append(value[1]) + t += step_size + + x = [i[0] for i in self.list_of_points] + y = [i[1] for i in self.list_of_points] + + plt.plot( + to_plot_x, + to_plot_y, + color="blue", + label="Curve of Degree " + str(self.degree), + ) + plt.scatter(x, y, color="red", label="Control Points") + plt.legend() + plt.show() + + +if __name__ == "__main__": + import doctest + + doctest.testmod() + + BezierCurve([(1, 2), (3, 5)]).plot_curve() # degree 1 + BezierCurve([(0, 0), (5, 5), (5, 0)]).plot_curve() # degree 2 + BezierCurve([(0, 0), (5, 5), (5, 0), (2.5, -2.5)]).plot_curve() # degree 3 diff --git a/python-mega-algo/graphics/right.html b/python-mega-algo/graphics/right.html new file mode 100644 index 00000000..c223dd7b --- /dev/null +++ b/python-mega-algo/graphics/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/graphics + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    bezier_curve.py vector3_f...ing.py __init__.py 
    + +

    +Folders: 1
    +Files: 3
    +Size of all files: 7471 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/graphics/vector3_for_2d_rendering.py b/python-mega-algo/graphics/vector3_for_2d_rendering.py new file mode 100644 index 00000000..dfa22262 --- /dev/null +++ b/python-mega-algo/graphics/vector3_for_2d_rendering.py @@ -0,0 +1,102 @@ +""" +render 3d points for 2d surfaces. +""" + +from __future__ import annotations + +import math + +__version__ = "2020.9.26" +__author__ = "xcodz-dot, cclaus, dhruvmanila" + + +def convert_to_2d( + x: float, y: float, z: float, scale: float, distance: float +) -> tuple[float, float]: + """ + Converts 3d point to a 2d drawable point + + >>> convert_to_2d(1.0, 2.0, 3.0, 10.0, 10.0) + (7.6923076923076925, 15.384615384615385) + + >>> convert_to_2d(1, 2, 3, 10, 10) + (7.6923076923076925, 15.384615384615385) + + >>> convert_to_2d("1", 2, 3, 10, 10) # '1' is str + Traceback (most recent call last): + ... + TypeError: Input values must either be float or int: ['1', 2, 3, 10, 10] + """ + if not all(isinstance(val, (float, int)) for val in locals().values()): + raise TypeError( + "Input values must either be float or int: " f"{list(locals().values())}" + ) + projected_x = ((x * distance) / (z + distance)) * scale + projected_y = ((y * distance) / (z + distance)) * scale + return projected_x, projected_y + + +def rotate( + x: float, y: float, z: float, axis: str, angle: float +) -> tuple[float, float, float]: + """ + rotate a point around a certain axis with a certain angle + angle can be any integer between 1, 360 and axis can be any one of + 'x', 'y', 'z' + + >>> rotate(1.0, 2.0, 3.0, 'y', 90.0) + (3.130524675073759, 2.0, 0.4470070007889556) + + >>> rotate(1, 2, 3, "z", 180) + (0.999736015495891, -2.0001319704760485, 3) + + >>> rotate('1', 2, 3, "z", 90.0) # '1' is str + Traceback (most recent call last): + ... + TypeError: Input values except axis must either be float or int: ['1', 2, 3, 90.0] + + >>> rotate(1, 2, 3, "n", 90) # 'n' is not a valid axis + Traceback (most recent call last): + ... + ValueError: not a valid axis, choose one of 'x', 'y', 'z' + + >>> rotate(1, 2, 3, "x", -90) + (1, -2.5049096187183877, -2.5933429780983657) + + >>> rotate(1, 2, 3, "x", 450) # 450 wrap around to 90 + (1, 3.5776792428178217, -0.44744970165427644) + """ + if not isinstance(axis, str): + raise TypeError("Axis must be a str") + input_variables = locals() + del input_variables["axis"] + if not all(isinstance(val, (float, int)) for val in input_variables.values()): + raise TypeError( + "Input values except axis must either be float or int: " + f"{list(input_variables.values())}" + ) + angle = (angle % 360) / 450 * 180 / math.pi + if axis == "z": + new_x = x * math.cos(angle) - y * math.sin(angle) + new_y = y * math.cos(angle) + x * math.sin(angle) + new_z = z + elif axis == "x": + new_y = y * math.cos(angle) - z * math.sin(angle) + new_z = z * math.cos(angle) + y * math.sin(angle) + new_x = x + elif axis == "y": + new_x = x * math.cos(angle) - z * math.sin(angle) + new_z = z * math.cos(angle) + x * math.sin(angle) + new_y = y + else: + raise ValueError("not a valid axis, choose one of 'x', 'y', 'z'") + + return new_x, new_y, new_z + + +if __name__ == "__main__": + import doctest + + doctest.testmod() + print(f"{convert_to_2d(1.0, 2.0, 3.0, 10.0, 10.0) = }") + print(f"{rotate(1.0, 2.0, 3.0, 'y', 90.0) = }") diff --git a/python-mega-algo/graphs/__init__.py b/python-mega-algo/graphs/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/graphs/a_star.py b/python-mega-algo/graphs/a_star.py new file mode 100644 index 00000000..cb5b2fcd --- /dev/null +++ b/python-mega-algo/graphs/a_star.py @@ -0,0 +1,100 @@ +grid = [ + [0, 1, 0, 0, 0, 0], + [0, 1, 0, 0, 0, 0], # 0 are free path whereas 1's are obstacles + [0, 1, 0, 0, 0, 0], + [0, 1, 0, 0, 1, 0], + [0, 0, 0, 0, 1, 0], +] + +""" +heuristic = [[9, 8, 7, 6, 5, 4], + [8, 7, 6, 5, 4, 3], + [7, 6, 5, 4, 3, 2], + [6, 5, 4, 3, 2, 1], + [5, 4, 3, 2, 1, 0]]""" + +init = [0, 0] +goal = [len(grid) - 1, len(grid[0]) - 1] # all coordinates are given in format [y,x] +cost = 1 + +# the cost map which pushes the path closer to the goal +heuristic = [[0 for row in range(len(grid[0]))] for col in range(len(grid))] +for i in range(len(grid)): + for j in range(len(grid[0])): + heuristic[i][j] = abs(i - goal[0]) + abs(j - goal[1]) + if grid[i][j] == 1: + heuristic[i][j] = 99 # added extra penalty in the heuristic map + + +# the actions we can take +delta = [[-1, 0], [0, -1], [1, 0], [0, 1]] # go up # go left # go down # go right + + +# function to search the path +def search(grid, init, goal, cost, heuristic): + + closed = [ + [0 for col in range(len(grid[0]))] for row in range(len(grid)) + ] # the reference grid + closed[init[0]][init[1]] = 1 + action = [ + [0 for col in range(len(grid[0]))] for row in range(len(grid)) + ] # the action grid + + x = init[0] + y = init[1] + g = 0 + f = g + heuristic[init[0]][init[0]] + cell = [[f, g, x, y]] + + found = False # flag that is set when search is complete + resign = False # flag set if we can't find expand + + while not found and not resign: + if len(cell) == 0: + return "FAIL" + else: # to choose the least costliest action so as to move closer to the goal + cell.sort() + cell.reverse() + next = cell.pop() + x = next[2] + y = next[3] + g = next[1] + + if x == goal[0] and y == goal[1]: + found = True + else: + for i in range(len(delta)): # to try out different valid actions + x2 = x + delta[i][0] + y2 = y + delta[i][1] + if x2 >= 0 and x2 < len(grid) and y2 >= 0 and y2 < len(grid[0]): + if closed[x2][y2] == 0 and grid[x2][y2] == 0: + g2 = g + cost + f2 = g2 + heuristic[x2][y2] + cell.append([f2, g2, x2, y2]) + closed[x2][y2] = 1 + action[x2][y2] = i + invpath = [] + x = goal[0] + y = goal[1] + invpath.append([x, y]) # we get the reverse path from here + while x != init[0] or y != init[1]: + x2 = x - delta[action[x][y]][0] + y2 = y - delta[action[x][y]][1] + x = x2 + y = y2 + invpath.append([x, y]) + + path = [] + for i in range(len(invpath)): + path.append(invpath[len(invpath) - 1 - i]) + print("ACTION MAP") + for i in range(len(action)): + print(action[i]) + + return path + + +a = search(grid, init, goal, cost, heuristic) +for i in range(len(a)): + print(a[i]) diff --git a/python-mega-algo/graphs/articulation_points.py b/python-mega-algo/graphs/articulation_points.py new file mode 100644 index 00000000..7197369d --- /dev/null +++ b/python-mega-algo/graphs/articulation_points.py @@ -0,0 +1,55 @@ +# Finding Articulation Points in Undirected Graph +def computeAP(l): # noqa: E741 + n = len(l) + outEdgeCount = 0 + low = [0] * n + visited = [False] * n + isArt = [False] * n + + def dfs(root, at, parent, outEdgeCount): + if parent == root: + outEdgeCount += 1 + visited[at] = True + low[at] = at + + for to in l[at]: + if to == parent: + pass + elif not visited[to]: + outEdgeCount = dfs(root, to, at, outEdgeCount) + low[at] = min(low[at], low[to]) + + # AP found via bridge + if at < low[to]: + isArt[at] = True + # AP found via cycle + if at == low[to]: + isArt[at] = True + else: + low[at] = min(low[at], to) + return outEdgeCount + + for i in range(n): + if not visited[i]: + outEdgeCount = 0 + outEdgeCount = dfs(i, i, -1, outEdgeCount) + isArt[i] = outEdgeCount > 1 + + for x in range(len(isArt)): + if isArt[x] is True: + print(x) + + +# Adjacency list of graph +data = { + 0: [1, 2], + 1: [0, 2], + 2: [0, 1, 3, 5], + 3: [2, 4], + 4: [3], + 5: [2, 6, 8], + 6: [5, 7], + 7: [6, 8], + 8: [5, 7], +} +computeAP(data) diff --git a/python-mega-algo/graphs/basic_graphs.py b/python-mega-algo/graphs/basic_graphs.py new file mode 100644 index 00000000..0f73d8d0 --- /dev/null +++ b/python-mega-algo/graphs/basic_graphs.py @@ -0,0 +1,283 @@ +from collections import deque + +if __name__ == "__main__": + # Accept No. of Nodes and edges + n, m = map(int, input().split(" ")) + + # Initialising Dictionary of edges + g = {} + for i in range(n): + g[i + 1] = [] + + """ + ---------------------------------------------------------------------------- + Accepting edges of Unweighted Directed Graphs + ---------------------------------------------------------------------------- + """ + for _ in range(m): + x, y = map(int, input().strip().split(" ")) + g[x].append(y) + + """ + ---------------------------------------------------------------------------- + Accepting edges of Unweighted Undirected Graphs + ---------------------------------------------------------------------------- + """ + for _ in range(m): + x, y = map(int, input().strip().split(" ")) + g[x].append(y) + g[y].append(x) + + """ + ---------------------------------------------------------------------------- + Accepting edges of Weighted Undirected Graphs + ---------------------------------------------------------------------------- + """ + for _ in range(m): + x, y, r = map(int, input().strip().split(" ")) + g[x].append([y, r]) + g[y].append([x, r]) + +""" +-------------------------------------------------------------------------------- + Depth First Search. + Args : G - Dictionary of edges + s - Starting Node + Vars : vis - Set of visited nodes + S - Traversal Stack +-------------------------------------------------------------------------------- +""" + + +def dfs(G, s): + vis, S = {s}, [s] + print(s) + while S: + flag = 0 + for i in G[S[-1]]: + if i not in vis: + S.append(i) + vis.add(i) + flag = 1 + print(i) + break + if not flag: + S.pop() + + +""" +-------------------------------------------------------------------------------- + Breadth First Search. + Args : G - Dictionary of edges + s - Starting Node + Vars : vis - Set of visited nodes + Q - Traversal Stack +-------------------------------------------------------------------------------- +""" + + +def bfs(G, s): + vis, Q = {s}, deque([s]) + print(s) + while Q: + u = Q.popleft() + for v in G[u]: + if v not in vis: + vis.add(v) + Q.append(v) + print(v) + + +""" +-------------------------------------------------------------------------------- + Dijkstra's shortest path Algorithm + Args : G - Dictionary of edges + s - Starting Node + Vars : dist - Dictionary storing shortest distance from s to every other node + known - Set of knows nodes + path - Preceding node in path +-------------------------------------------------------------------------------- +""" + + +def dijk(G, s): + dist, known, path = {s: 0}, set(), {s: 0} + while True: + if len(known) == len(G) - 1: + break + mini = 100000 + for i in dist: + if i not in known and dist[i] < mini: + mini = dist[i] + u = i + known.add(u) + for v in G[u]: + if v[0] not in known: + if dist[u] + v[1] < dist.get(v[0], 100000): + dist[v[0]] = dist[u] + v[1] + path[v[0]] = u + for i in dist: + if i != s: + print(dist[i]) + + +""" +-------------------------------------------------------------------------------- + Topological Sort +-------------------------------------------------------------------------------- +""" + + +def topo(G, ind=None, Q=None): + if Q is None: + Q = [1] + if ind is None: + ind = [0] * (len(G) + 1) # SInce oth Index is ignored + for u in G: + for v in G[u]: + ind[v] += 1 + Q = deque() + for i in G: + if ind[i] == 0: + Q.append(i) + if len(Q) == 0: + return + v = Q.popleft() + print(v) + for w in G[v]: + ind[w] -= 1 + if ind[w] == 0: + Q.append(w) + topo(G, ind, Q) + + +""" +-------------------------------------------------------------------------------- + Reading an Adjacency matrix +-------------------------------------------------------------------------------- +""" + + +def adjm(): + n = input().strip() + a = [] + for i in range(n): + a.append(map(int, input().strip().split())) + return a, n + + +""" +-------------------------------------------------------------------------------- + Floyd Warshall's algorithm + Args : G - Dictionary of edges + s - Starting Node + Vars : dist - Dictionary storing shortest distance from s to every other node + known - Set of knows nodes + path - Preceding node in path + +-------------------------------------------------------------------------------- +""" + + +def floy(A_and_n): + (A, n) = A_and_n + dist = list(A) + path = [[0] * n for i in range(n)] + for k in range(n): + for i in range(n): + for j in range(n): + if dist[i][j] > dist[i][k] + dist[k][j]: + dist[i][j] = dist[i][k] + dist[k][j] + path[i][k] = k + print(dist) + + +""" +-------------------------------------------------------------------------------- + Prim's MST Algorithm + Args : G - Dictionary of edges + s - Starting Node + Vars : dist - Dictionary storing shortest distance from s to nearest node + known - Set of knows nodes + path - Preceding node in path +-------------------------------------------------------------------------------- +""" + + +def prim(G, s): + dist, known, path = {s: 0}, set(), {s: 0} + while True: + if len(known) == len(G) - 1: + break + mini = 100000 + for i in dist: + if i not in known and dist[i] < mini: + mini = dist[i] + u = i + known.add(u) + for v in G[u]: + if v[0] not in known: + if v[1] < dist.get(v[0], 100000): + dist[v[0]] = v[1] + path[v[0]] = u + return dist + + +""" +-------------------------------------------------------------------------------- + Accepting Edge list + Vars : n - Number of nodes + m - Number of edges + Returns : l - Edge list + n - Number of Nodes +-------------------------------------------------------------------------------- +""" + + +def edglist(): + n, m = map(int, input().split(" ")) + edges = [] + for i in range(m): + edges.append(map(int, input().split(" "))) + return edges, n + + +""" +-------------------------------------------------------------------------------- + Kruskal's MST Algorithm + Args : E - Edge list + n - Number of Nodes + Vars : s - Set of all nodes as unique disjoint sets (initially) +-------------------------------------------------------------------------------- +""" + + +def krusk(E_and_n): + # Sort edges on the basis of distance + (E, n) = E_and_n + E.sort(reverse=True, key=lambda x: x[2]) + s = [{i} for i in range(1, n + 1)] + while True: + if len(s) == 1: + break + print(s) + x = E.pop() + for i in range(len(s)): + if x[0] in s[i]: + break + for j in range(len(s)): + if x[1] in s[j]: + if i == j: + break + s[j].update(s[i]) + s.pop(i) + break + + +# find the isolated node in the graph +def find_isolated_nodes(graph): + isolated = [] + for node in graph: + if not graph[node]: + isolated.append(node) + return isolated diff --git a/python-mega-algo/graphs/bellman_ford.py b/python-mega-algo/graphs/bellman_ford.py new file mode 100644 index 00000000..ace79856 --- /dev/null +++ b/python-mega-algo/graphs/bellman_ford.py @@ -0,0 +1,56 @@ +from __future__ import annotations + + +def printDist(dist, V): + print("Vertex Distance") + distances = ("INF" if d == float("inf") else d for d in dist) + print("\t".join(f"{i}\t{d}" for i, d in enumerate(distances))) + + +def BellmanFord(graph: list[dict[str, int]], V: int, E: int, src: int) -> int: + """ + Returns shortest paths from a vertex src to all + other vertices. + """ + mdist = [float("inf") for i in range(V)] + mdist[src] = 0.0 + + for i in range(V - 1): + for j in range(E): + u = graph[j]["src"] + v = graph[j]["dst"] + w = graph[j]["weight"] + + if mdist[u] != float("inf") and mdist[u] + w < mdist[v]: + mdist[v] = mdist[u] + w + for j in range(E): + u = graph[j]["src"] + v = graph[j]["dst"] + w = graph[j]["weight"] + + if mdist[u] != float("inf") and mdist[u] + w < mdist[v]: + print("Negative cycle found. Solution not possible.") + return + + printDist(mdist, V) + return src + + +if __name__ == "__main__": + V = int(input("Enter number of vertices: ").strip()) + E = int(input("Enter number of edges: ").strip()) + + graph = [dict() for j in range(E)] + + for i in range(E): + graph[i][i] = 0.0 + + for i in range(E): + print("\nEdge ", i + 1) + src = int(input("Enter source:").strip()) + dst = int(input("Enter destination:").strip()) + weight = float(input("Enter weight:").strip()) + graph[i] = {"src": src, "dst": dst, "weight": weight} + + gsrc = int(input("\nEnter shortest path source:").strip()) + BellmanFord(graph, V, E, gsrc) diff --git a/python-mega-algo/graphs/bfs_shortest_path.py b/python-mega-algo/graphs/bfs_shortest_path.py new file mode 100644 index 00000000..754ba403 --- /dev/null +++ b/python-mega-algo/graphs/bfs_shortest_path.py @@ -0,0 +1,106 @@ +"""Breadth-first search shortest path implementations. + doctest: + python -m doctest -v bfs_shortest_path.py + Manual test: + python bfs_shortest_path.py +""" +graph = { + "A": ["B", "C", "E"], + "B": ["A", "D", "E"], + "C": ["A", "F", "G"], + "D": ["B"], + "E": ["A", "B", "D"], + "F": ["C"], + "G": ["C"], +} + + +def bfs_shortest_path(graph: dict, start, goal) -> str: + """Find shortest path between `start` and `goal` nodes. + Args: + graph (dict): node/list of neighboring nodes key/value pairs. + start: start node. + goal: target node. + Returns: + Shortest path between `start` and `goal` nodes as a string of nodes. + 'Not found' string if no path found. + Example: + >>> bfs_shortest_path(graph, "G", "D") + ['G', 'C', 'A', 'B', 'D'] + """ + # keep track of explored nodes + explored = set() + # keep track of all the paths to be checked + queue = [[start]] + + # return path if start is goal + if start == goal: + return "That was easy! Start = goal" + + # keeps looping until all possible paths have been checked + while queue: + # pop the first path from the queue + path = queue.pop(0) + # get the last node from the path + node = path[-1] + if node not in explored: + neighbours = graph[node] + # go through all neighbour nodes, construct a new path and + # push it into the queue + for neighbour in neighbours: + new_path = list(path) + new_path.append(neighbour) + queue.append(new_path) + # return path if neighbour is goal + if neighbour == goal: + return new_path + + # mark node as explored + explored.add(node) + + # in case there's no path between the 2 nodes + return "So sorry, but a connecting path doesn't exist :(" + + +def bfs_shortest_path_distance(graph: dict, start, target) -> int: + """Find shortest path distance between `start` and `target` nodes. + Args: + graph: node/list of neighboring nodes key/value pairs. + start: node to start search from. + target: node to search for. + Returns: + Number of edges in shortest path between `start` and `target` nodes. + -1 if no path exists. + Example: + >>> bfs_shortest_path_distance(graph, "G", "D") + 4 + >>> bfs_shortest_path_distance(graph, "A", "A") + 0 + >>> bfs_shortest_path_distance(graph, "A", "H") + -1 + """ + if not graph or start not in graph or target not in graph: + return -1 + if start == target: + return 0 + queue = [start] + visited = set(start) + # Keep tab on distances from `start` node. + dist = {start: 0, target: -1} + while queue: + node = queue.pop(0) + if node == target: + dist[target] = ( + dist[node] if dist[target] == -1 else min(dist[target], dist[node]) + ) + for adjacent in graph[node]: + if adjacent not in visited: + visited.add(adjacent) + queue.append(adjacent) + dist[adjacent] = dist[node] + 1 + return dist[target] + + +if __name__ == "__main__": + print(bfs_shortest_path(graph, "G", "D")) # returns ['G', 'C', 'A', 'B', 'D'] + print(bfs_shortest_path_distance(graph, "G", "D")) # returns 4 diff --git a/python-mega-algo/graphs/bfs_zero_one_shortest_path.py b/python-mega-algo/graphs/bfs_zero_one_shortest_path.py new file mode 100644 index 00000000..a725fae7 --- /dev/null +++ b/python-mega-algo/graphs/bfs_zero_one_shortest_path.py @@ -0,0 +1,138 @@ +from collections import deque +from dataclasses import dataclass +from typing import Iterator, List + +""" +Finding the shortest path in 0-1-graph in O(E + V) which is faster than dijkstra. +0-1-graph is the weighted graph with the weights equal to 0 or 1. +Link: https://codeforces.com/blog/entry/22276 +""" + + +@dataclass +class Edge: + """Weighted directed graph edge.""" + + destination_vertex: int + weight: int + + +class AdjacencyList: + """Graph adjacency list.""" + + def __init__(self, size: int): + self._graph: List[List[Edge]] = [[] for _ in range(size)] + self._size = size + + def __getitem__(self, vertex: int) -> Iterator[Edge]: + """Get all the vertices adjacent to the given one.""" + return iter(self._graph[vertex]) + + @property + def size(self): + return self._size + + def add_edge(self, from_vertex: int, to_vertex: int, weight: int): + """ + >>> g = AdjacencyList(2) + >>> g.add_edge(0, 1, 0) + >>> g.add_edge(1, 0, 1) + >>> list(g[0]) + [Edge(destination_vertex=1, weight=0)] + >>> list(g[1]) + [Edge(destination_vertex=0, weight=1)] + >>> g.add_edge(0, 1, 2) + Traceback (most recent call last): + ... + ValueError: Edge weight must be either 0 or 1. + >>> g.add_edge(0, 2, 1) + Traceback (most recent call last): + ... + ValueError: Vertex indexes must be in [0; size). + """ + if weight not in (0, 1): + raise ValueError("Edge weight must be either 0 or 1.") + + if to_vertex < 0 or to_vertex >= self.size: + raise ValueError("Vertex indexes must be in [0; size).") + + self._graph[from_vertex].append(Edge(to_vertex, weight)) + + def get_shortest_path(self, start_vertex: int, finish_vertex: int) -> int: + """ + Return the shortest distance from start_vertex to finish_vertex in 0-1-graph. + 1 1 1 + 0--------->3 6--------7>------->8 + | ^ ^ ^ |1 + | | | |0 v + 0| |0 1| 9-------->10 + | | | ^ 1 + v | | |0 + 1--------->2<-------4------->5 + 0 1 1 + >>> g = AdjacencyList(11) + >>> g.add_edge(0, 1, 0) + >>> g.add_edge(0, 3, 1) + >>> g.add_edge(1, 2, 0) + >>> g.add_edge(2, 3, 0) + >>> g.add_edge(4, 2, 1) + >>> g.add_edge(4, 5, 1) + >>> g.add_edge(4, 6, 1) + >>> g.add_edge(5, 9, 0) + >>> g.add_edge(6, 7, 1) + >>> g.add_edge(7, 8, 1) + >>> g.add_edge(8, 10, 1) + >>> g.add_edge(9, 7, 0) + >>> g.add_edge(9, 10, 1) + >>> g.add_edge(1, 2, 2) + Traceback (most recent call last): + ... + ValueError: Edge weight must be either 0 or 1. + >>> g.get_shortest_path(0, 3) + 0 + >>> g.get_shortest_path(0, 4) + Traceback (most recent call last): + ... + ValueError: No path from start_vertex to finish_vertex. + >>> g.get_shortest_path(4, 10) + 2 + >>> g.get_shortest_path(4, 8) + 2 + >>> g.get_shortest_path(0, 1) + 0 + >>> g.get_shortest_path(1, 0) + Traceback (most recent call last): + ... + ValueError: No path from start_vertex to finish_vertex. + """ + queue = deque([start_vertex]) + distances = [None for i in range(self.size)] + distances[start_vertex] = 0 + + while queue: + current_vertex = queue.popleft() + current_distance = distances[current_vertex] + + for edge in self[current_vertex]: + new_distance = current_distance + edge.weight + if ( + distances[edge.destination_vertex] is not None + and new_distance >= distances[edge.destination_vertex] + ): + continue + distances[edge.destination_vertex] = new_distance + if edge.weight == 0: + queue.appendleft(edge.destination_vertex) + else: + queue.append(edge.destination_vertex) + + if distances[finish_vertex] is None: + raise ValueError("No path from start_vertex to finish_vertex.") + + return distances[finish_vertex] + + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/graphs/bidirectional_a_star.py b/python-mega-algo/graphs/bidirectional_a_star.py new file mode 100644 index 00000000..72ff4fa6 --- /dev/null +++ b/python-mega-algo/graphs/bidirectional_a_star.py @@ -0,0 +1,257 @@ +""" +https://en.wikipedia.org/wiki/Bidirectional_search +""" + +from __future__ import annotations + +import time +from math import sqrt + +# 1 for manhattan, 0 for euclidean +HEURISTIC = 0 + +grid = [ + [0, 0, 0, 0, 0, 0, 0], + [0, 1, 0, 0, 0, 0, 0], # 0 are free path whereas 1's are obstacles + [0, 0, 0, 0, 0, 0, 0], + [0, 0, 1, 0, 0, 0, 0], + [1, 0, 1, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 1, 0, 0], +] + +delta = [[-1, 0], [0, -1], [1, 0], [0, 1]] # up, left, down, right + + +class Node: + """ + >>> k = Node(0, 0, 4, 3, 0, None) + >>> k.calculate_heuristic() + 5.0 + >>> n = Node(1, 4, 3, 4, 2, None) + >>> n.calculate_heuristic() + 2.0 + >>> l = [k, n] + >>> n == l[0] + False + >>> l.sort() + >>> n == l[0] + True + """ + + def __init__(self, pos_x, pos_y, goal_x, goal_y, g_cost, parent): + self.pos_x = pos_x + self.pos_y = pos_y + self.pos = (pos_y, pos_x) + self.goal_x = goal_x + self.goal_y = goal_y + self.g_cost = g_cost + self.parent = parent + self.h_cost = self.calculate_heuristic() + self.f_cost = self.g_cost + self.h_cost + + def calculate_heuristic(self) -> float: + """ + Heuristic for the A* + """ + dy = self.pos_x - self.goal_x + dx = self.pos_y - self.goal_y + if HEURISTIC == 1: + return abs(dx) + abs(dy) + else: + return sqrt(dy ** 2 + dx ** 2) + + def __lt__(self, other) -> bool: + return self.f_cost < other.f_cost + + +class AStar: + """ + >>> astar = AStar((0, 0), (len(grid) - 1, len(grid[0]) - 1)) + >>> (astar.start.pos_y + delta[3][0], astar.start.pos_x + delta[3][1]) + (0, 1) + >>> [x.pos for x in astar.get_successors(astar.start)] + [(1, 0), (0, 1)] + >>> (astar.start.pos_y + delta[2][0], astar.start.pos_x + delta[2][1]) + (1, 0) + >>> astar.retrace_path(astar.start) + [(0, 0)] + >>> astar.search() # doctest: +NORMALIZE_WHITESPACE + [(0, 0), (1, 0), (2, 0), (2, 1), (2, 2), (2, 3), (3, 3), + (4, 3), (4, 4), (5, 4), (5, 5), (6, 5), (6, 6)] + """ + + def __init__(self, start, goal): + self.start = Node(start[1], start[0], goal[1], goal[0], 0, None) + self.target = Node(goal[1], goal[0], goal[1], goal[0], 99999, None) + + self.open_nodes = [self.start] + self.closed_nodes = [] + + self.reached = False + + def search(self) -> list[tuple[int]]: + while self.open_nodes: + # Open Nodes are sorted using __lt__ + self.open_nodes.sort() + current_node = self.open_nodes.pop(0) + + if current_node.pos == self.target.pos: + self.reached = True + return self.retrace_path(current_node) + + self.closed_nodes.append(current_node) + successors = self.get_successors(current_node) + + for child_node in successors: + if child_node in self.closed_nodes: + continue + + if child_node not in self.open_nodes: + self.open_nodes.append(child_node) + else: + # retrieve the best current path + better_node = self.open_nodes.pop(self.open_nodes.index(child_node)) + + if child_node.g_cost < better_node.g_cost: + self.open_nodes.append(child_node) + else: + self.open_nodes.append(better_node) + + if not (self.reached): + return [(self.start.pos)] + + def get_successors(self, parent: Node) -> list[Node]: + """ + Returns a list of successors (both in the grid and free spaces) + """ + successors = [] + for action in delta: + pos_x = parent.pos_x + action[1] + pos_y = parent.pos_y + action[0] + if not (0 <= pos_x <= len(grid[0]) - 1 and 0 <= pos_y <= len(grid) - 1): + continue + + if grid[pos_y][pos_x] != 0: + continue + + successors.append( + Node( + pos_x, + pos_y, + self.target.pos_y, + self.target.pos_x, + parent.g_cost + 1, + parent, + ) + ) + return successors + + def retrace_path(self, node: Node) -> list[tuple[int]]: + """ + Retrace the path from parents to parents until start node + """ + current_node = node + path = [] + while current_node is not None: + path.append((current_node.pos_y, current_node.pos_x)) + current_node = current_node.parent + path.reverse() + return path + + +class BidirectionalAStar: + """ + >>> bd_astar = BidirectionalAStar((0, 0), (len(grid) - 1, len(grid[0]) - 1)) + >>> bd_astar.fwd_astar.start.pos == bd_astar.bwd_astar.target.pos + True + >>> bd_astar.retrace_bidirectional_path(bd_astar.fwd_astar.start, + ... bd_astar.bwd_astar.start) + [(0, 0)] + >>> bd_astar.search() # doctest: +NORMALIZE_WHITESPACE + [(0, 0), (0, 1), (0, 2), (1, 2), (1, 3), (2, 3), (2, 4), + (2, 5), (3, 5), (4, 5), (5, 5), (5, 6), (6, 6)] + """ + + def __init__(self, start, goal): + self.fwd_astar = AStar(start, goal) + self.bwd_astar = AStar(goal, start) + self.reached = False + + def search(self) -> list[tuple[int]]: + while self.fwd_astar.open_nodes or self.bwd_astar.open_nodes: + self.fwd_astar.open_nodes.sort() + self.bwd_astar.open_nodes.sort() + current_fwd_node = self.fwd_astar.open_nodes.pop(0) + current_bwd_node = self.bwd_astar.open_nodes.pop(0) + + if current_bwd_node.pos == current_fwd_node.pos: + self.reached = True + return self.retrace_bidirectional_path( + current_fwd_node, current_bwd_node + ) + + self.fwd_astar.closed_nodes.append(current_fwd_node) + self.bwd_astar.closed_nodes.append(current_bwd_node) + + self.fwd_astar.target = current_bwd_node + self.bwd_astar.target = current_fwd_node + + successors = { + self.fwd_astar: self.fwd_astar.get_successors(current_fwd_node), + self.bwd_astar: self.bwd_astar.get_successors(current_bwd_node), + } + + for astar in [self.fwd_astar, self.bwd_astar]: + for child_node in successors[astar]: + if child_node in astar.closed_nodes: + continue + + if child_node not in astar.open_nodes: + astar.open_nodes.append(child_node) + else: + # retrieve the best current path + better_node = astar.open_nodes.pop( + astar.open_nodes.index(child_node) + ) + + if child_node.g_cost < better_node.g_cost: + astar.open_nodes.append(child_node) + else: + astar.open_nodes.append(better_node) + + if not self.reached: + return [self.fwd_astar.start.pos] + + def retrace_bidirectional_path( + self, fwd_node: Node, bwd_node: Node + ) -> list[tuple[int]]: + fwd_path = self.fwd_astar.retrace_path(fwd_node) + bwd_path = self.bwd_astar.retrace_path(bwd_node) + bwd_path.pop() + bwd_path.reverse() + path = fwd_path + bwd_path + return path + + +if __name__ == "__main__": + # all coordinates are given in format [y,x] + import doctest + + doctest.testmod() + init = (0, 0) + goal = (len(grid) - 1, len(grid[0]) - 1) + for elem in grid: + print(elem) + + start_time = time.time() + a_star = AStar(init, goal) + path = a_star.search() + end_time = time.time() - start_time + print(f"AStar execution time = {end_time:f} seconds") + + bd_start_time = time.time() + bidir_astar = BidirectionalAStar(init, goal) + path = bidir_astar.search() + bd_end_time = time.time() - bd_start_time + print(f"BidirectionalAStar execution time = {bd_end_time:f} seconds") diff --git a/python-mega-algo/graphs/bidirectional_breadth_first_search.py b/python-mega-algo/graphs/bidirectional_breadth_first_search.py new file mode 100644 index 00000000..39d8dc7d --- /dev/null +++ b/python-mega-algo/graphs/bidirectional_breadth_first_search.py @@ -0,0 +1,181 @@ +""" +https://en.wikipedia.org/wiki/Bidirectional_search +""" + +from __future__ import annotations + +import time + +grid = [ + [0, 0, 0, 0, 0, 0, 0], + [0, 1, 0, 0, 0, 0, 0], # 0 are free path whereas 1's are obstacles + [0, 0, 0, 0, 0, 0, 0], + [0, 0, 1, 0, 0, 0, 0], + [1, 0, 1, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 1, 0, 0], +] + +delta = [[-1, 0], [0, -1], [1, 0], [0, 1]] # up, left, down, right + + +class Node: + def __init__(self, pos_x, pos_y, goal_x, goal_y, parent): + self.pos_x = pos_x + self.pos_y = pos_y + self.pos = (pos_y, pos_x) + self.goal_x = goal_x + self.goal_y = goal_y + self.parent = parent + + +class BreadthFirstSearch: + """ + >>> bfs = BreadthFirstSearch((0, 0), (len(grid) - 1, len(grid[0]) - 1)) + >>> (bfs.start.pos_y + delta[3][0], bfs.start.pos_x + delta[3][1]) + (0, 1) + >>> [x.pos for x in bfs.get_successors(bfs.start)] + [(1, 0), (0, 1)] + >>> (bfs.start.pos_y + delta[2][0], bfs.start.pos_x + delta[2][1]) + (1, 0) + >>> bfs.retrace_path(bfs.start) + [(0, 0)] + >>> bfs.search() # doctest: +NORMALIZE_WHITESPACE + [(0, 0), (1, 0), (2, 0), (3, 0), (3, 1), (4, 1), + (5, 1), (5, 2), (5, 3), (5, 4), (5, 5), (6, 5), (6, 6)] + """ + + def __init__(self, start, goal): + self.start = Node(start[1], start[0], goal[1], goal[0], None) + self.target = Node(goal[1], goal[0], goal[1], goal[0], None) + + self.node_queue = [self.start] + self.reached = False + + def search(self) -> list[tuple[int]]: + while self.node_queue: + current_node = self.node_queue.pop(0) + + if current_node.pos == self.target.pos: + self.reached = True + return self.retrace_path(current_node) + + successors = self.get_successors(current_node) + + for node in successors: + self.node_queue.append(node) + + if not (self.reached): + return [(self.start.pos)] + + def get_successors(self, parent: Node) -> list[Node]: + """ + Returns a list of successors (both in the grid and free spaces) + """ + successors = [] + for action in delta: + pos_x = parent.pos_x + action[1] + pos_y = parent.pos_y + action[0] + if not (0 <= pos_x <= len(grid[0]) - 1 and 0 <= pos_y <= len(grid) - 1): + continue + + if grid[pos_y][pos_x] != 0: + continue + + successors.append( + Node(pos_x, pos_y, self.target.pos_y, self.target.pos_x, parent) + ) + return successors + + def retrace_path(self, node: Node) -> list[tuple[int]]: + """ + Retrace the path from parents to parents until start node + """ + current_node = node + path = [] + while current_node is not None: + path.append((current_node.pos_y, current_node.pos_x)) + current_node = current_node.parent + path.reverse() + return path + + +class BidirectionalBreadthFirstSearch: + """ + >>> bd_bfs = BidirectionalBreadthFirstSearch((0, 0), (len(grid) - 1, + ... len(grid[0]) - 1)) + >>> bd_bfs.fwd_bfs.start.pos == bd_bfs.bwd_bfs.target.pos + True + >>> bd_bfs.retrace_bidirectional_path(bd_bfs.fwd_bfs.start, + ... bd_bfs.bwd_bfs.start) + [(0, 0)] + >>> bd_bfs.search() # doctest: +NORMALIZE_WHITESPACE + [(0, 0), (0, 1), (0, 2), (1, 2), (2, 2), (2, 3), + (2, 4), (3, 4), (3, 5), (3, 6), (4, 6), (5, 6), (6, 6)] + """ + + def __init__(self, start, goal): + self.fwd_bfs = BreadthFirstSearch(start, goal) + self.bwd_bfs = BreadthFirstSearch(goal, start) + self.reached = False + + def search(self) -> list[tuple[int]]: + while self.fwd_bfs.node_queue or self.bwd_bfs.node_queue: + current_fwd_node = self.fwd_bfs.node_queue.pop(0) + current_bwd_node = self.bwd_bfs.node_queue.pop(0) + + if current_bwd_node.pos == current_fwd_node.pos: + self.reached = True + return self.retrace_bidirectional_path( + current_fwd_node, current_bwd_node + ) + + self.fwd_bfs.target = current_bwd_node + self.bwd_bfs.target = current_fwd_node + + successors = { + self.fwd_bfs: self.fwd_bfs.get_successors(current_fwd_node), + self.bwd_bfs: self.bwd_bfs.get_successors(current_bwd_node), + } + + for bfs in [self.fwd_bfs, self.bwd_bfs]: + for node in successors[bfs]: + bfs.node_queue.append(node) + + if not self.reached: + return [self.fwd_bfs.start.pos] + + def retrace_bidirectional_path( + self, fwd_node: Node, bwd_node: Node + ) -> list[tuple[int]]: + fwd_path = self.fwd_bfs.retrace_path(fwd_node) + bwd_path = self.bwd_bfs.retrace_path(bwd_node) + bwd_path.pop() + bwd_path.reverse() + path = fwd_path + bwd_path + return path + + +if __name__ == "__main__": + # all coordinates are given in format [y,x] + import doctest + + doctest.testmod() + init = (0, 0) + goal = (len(grid) - 1, len(grid[0]) - 1) + for elem in grid: + print(elem) + + start_bfs_time = time.time() + bfs = BreadthFirstSearch(init, goal) + path = bfs.search() + bfs_time = time.time() - start_bfs_time + + print("Unidirectional BFS computation time : ", bfs_time) + + start_bd_bfs_time = time.time() + bd_bfs = BidirectionalBreadthFirstSearch(init, goal) + bd_path = bd_bfs.search() + bd_bfs_time = time.time() - start_bd_bfs_time + + print("Bidirectional BFS computation time : ", bd_bfs_time) diff --git a/python-mega-algo/graphs/breadth_first_search.py b/python-mega-algo/graphs/breadth_first_search.py new file mode 100644 index 00000000..ee9855bd --- /dev/null +++ b/python-mega-algo/graphs/breadth_first_search.py @@ -0,0 +1,91 @@ +#!/usr/bin/python + +""" Author: OMKAR PATHAK """ + +from typing import Set + + +class Graph: + def __init__(self) -> None: + self.vertices = {} + + def print_graph(self) -> None: + """ + prints adjacency list representation of graaph + >>> g = Graph() + >>> g.print_graph() + >>> g.add_edge(0, 1) + >>> g.print_graph() + 0 : 1 + """ + for i in self.vertices: + print(i, " : ", " -> ".join([str(j) for j in self.vertices[i]])) + + def add_edge(self, from_vertex: int, to_vertex: int) -> None: + """ + adding the edge between two vertices + >>> g = Graph() + >>> g.print_graph() + >>> g.add_edge(0, 1) + >>> g.print_graph() + 0 : 1 + """ + if from_vertex in self.vertices: + self.vertices[from_vertex].append(to_vertex) + else: + self.vertices[from_vertex] = [to_vertex] + + def bfs(self, start_vertex: int) -> Set[int]: + """ + >>> g = Graph() + >>> g.add_edge(0, 1) + >>> g.add_edge(0, 1) + >>> g.add_edge(0, 2) + >>> g.add_edge(1, 2) + >>> g.add_edge(2, 0) + >>> g.add_edge(2, 3) + >>> g.add_edge(3, 3) + >>> sorted(g.bfs(2)) + [0, 1, 2, 3] + """ + # initialize set for storing already visited vertices + visited = set() + + # create a first in first out queue to store all the vertices for BFS + queue = [] + + # mark the source node as visited and enqueue it + visited.add(start_vertex) + queue.append(start_vertex) + + while queue: + vertex = queue.pop(0) + + # loop through all adjacent vertex and enqueue it if not yet visited + for adjacent_vertex in self.vertices[vertex]: + if adjacent_vertex not in visited: + queue.append(adjacent_vertex) + visited.add(adjacent_vertex) + return visited + + +if __name__ == "__main__": + from doctest import testmod + + testmod(verbose=True) + + g = Graph() + g.add_edge(0, 1) + g.add_edge(0, 2) + g.add_edge(1, 2) + g.add_edge(2, 0) + g.add_edge(2, 3) + g.add_edge(3, 3) + + g.print_graph() + # 0 : 1 -> 2 + # 1 : 2 + # 2 : 0 -> 3 + # 3 : 3 + + assert sorted(g.bfs(2)) == [0, 1, 2, 3] diff --git a/python-mega-algo/graphs/breadth_first_search_2.py b/python-mega-algo/graphs/breadth_first_search_2.py new file mode 100644 index 00000000..a90e963a --- /dev/null +++ b/python-mega-algo/graphs/breadth_first_search_2.py @@ -0,0 +1,44 @@ +""" +https://en.wikipedia.org/wiki/Breadth-first_search +pseudo-code: +breadth_first_search(graph G, start vertex s): +// all nodes initially unexplored +mark s as explored +let Q = queue data structure, initialized with s +while Q is non-empty: + remove the first node of Q, call it v + for each edge(v, w): // for w in graph[v] + if w unexplored: + mark w as explored + add w to Q (at the end) +""" +from __future__ import annotations + +G = { + "A": ["B", "C"], + "B": ["A", "D", "E"], + "C": ["A", "F"], + "D": ["B"], + "E": ["B", "F"], + "F": ["C", "E"], +} + + +def breadth_first_search(graph: dict, start: str) -> set[str]: + """ + >>> ''.join(sorted(breadth_first_search(G, 'A'))) + 'ABCDEF' + """ + explored = {start} + queue = [start] + while queue: + v = queue.pop(0) # queue.popleft() + for w in graph[v]: + if w not in explored: + explored.add(w) + queue.append(w) + return explored + + +if __name__ == "__main__": + print(breadth_first_search(G, "A")) diff --git a/python-mega-algo/graphs/breadth_first_search_shortest_path.py b/python-mega-algo/graphs/breadth_first_search_shortest_path.py new file mode 100644 index 00000000..b43479d4 --- /dev/null +++ b/python-mega-algo/graphs/breadth_first_search_shortest_path.py @@ -0,0 +1,82 @@ +"""Breath First Search (BFS) can be used when finding the shortest path +from a given source node to a target node in an unweighted graph. +""" +from __future__ import annotations + +graph = { + "A": ["B", "C", "E"], + "B": ["A", "D", "E"], + "C": ["A", "F", "G"], + "D": ["B"], + "E": ["A", "B", "D"], + "F": ["C"], + "G": ["C"], +} + + +class Graph: + def __init__(self, graph: dict[str, str], source_vertex: str) -> None: + """Graph is implemented as dictionary of adjacency lists. Also, + Source vertex have to be defined upon initialization. + """ + self.graph = graph + # mapping node to its parent in resulting breadth first tree + self.parent = {} + self.source_vertex = source_vertex + + def breath_first_search(self) -> None: + """This function is a helper for running breath first search on this graph. + >>> g = Graph(graph, "G") + >>> g.breath_first_search() + >>> g.parent + {'G': None, 'C': 'G', 'A': 'C', 'F': 'C', 'B': 'A', 'E': 'A', 'D': 'B'} + """ + visited = {self.source_vertex} + self.parent[self.source_vertex] = None + queue = [self.source_vertex] # first in first out queue + + while queue: + vertex = queue.pop(0) + for adjacent_vertex in self.graph[vertex]: + if adjacent_vertex not in visited: + visited.add(adjacent_vertex) + self.parent[adjacent_vertex] = vertex + queue.append(adjacent_vertex) + + def shortest_path(self, target_vertex: str) -> str: + """This shortest path function returns a string, describing the result: + 1.) No path is found. The string is a human readable message to indicate this. + 2.) The shortest path is found. The string is in the form + `v1(->v2->v3->...->vn)`, where v1 is the source vertex and vn is the target + vertex, if it exists separately. + + >>> g = Graph(graph, "G") + >>> g.breath_first_search() + + Case 1 - No path is found. + >>> g.shortest_path("Foo") + 'No path from vertex:G to vertex:Foo' + + Case 2 - The path is found. + >>> g.shortest_path("D") + 'G->C->A->B->D' + >>> g.shortest_path("G") + 'G' + """ + if target_vertex == self.source_vertex: + return f"{self.source_vertex}" + elif not self.parent.get(target_vertex): + return f"No path from vertex:{self.source_vertex} to vertex:{target_vertex}" + else: + return self.shortest_path(self.parent[target_vertex]) + f"->{target_vertex}" + + +if __name__ == "__main__": + import doctest + + doctest.testmod() + g = Graph(graph, "G") + g.breath_first_search() + print(g.shortest_path("D")) + print(g.shortest_path("G")) + print(g.shortest_path("Foo")) diff --git a/python-mega-algo/graphs/check_bipartite_graph_bfs.py b/python-mega-algo/graphs/check_bipartite_graph_bfs.py new file mode 100644 index 00000000..00b77164 --- /dev/null +++ b/python-mega-algo/graphs/check_bipartite_graph_bfs.py @@ -0,0 +1,45 @@ +# Check whether Graph is Bipartite or Not using BFS + + +# A Bipartite Graph is a graph whose vertices can be divided into two independent sets, +# U and V such that every edge (u, v) either connects a vertex from U to V or a vertex +# from V to U. In other words, for every edge (u, v), either u belongs to U and v to V, +# or u belongs to V and v to U. We can also say that there is no edge that connects +# vertices of same set. +def checkBipartite(graph): + queue = [] + visited = [False] * len(graph) + color = [-1] * len(graph) + + def bfs(): + while queue: + u = queue.pop(0) + visited[u] = True + + for neighbour in graph[u]: + + if neighbour == u: + return False + + if color[neighbour] == -1: + color[neighbour] = 1 - color[u] + queue.append(neighbour) + + elif color[neighbour] == color[u]: + return False + + return True + + for i in range(len(graph)): + if not visited[i]: + queue.append(i) + color[i] = 0 + if bfs() is False: + return False + + return True + + +if __name__ == "__main__": + # Adjacency List of graph + print(checkBipartite({0: [1, 3], 1: [0, 2], 2: [1, 3], 3: [0, 2]})) diff --git a/python-mega-algo/graphs/check_bipartite_graph_dfs.py b/python-mega-algo/graphs/check_bipartite_graph_dfs.py new file mode 100644 index 00000000..fd644230 --- /dev/null +++ b/python-mega-algo/graphs/check_bipartite_graph_dfs.py @@ -0,0 +1,34 @@ +# Check whether Graph is Bipartite or Not using DFS + + +# A Bipartite Graph is a graph whose vertices can be divided into two independent sets, +# U and V such that every edge (u, v) either connects a vertex from U to V or a vertex +# from V to U. In other words, for every edge (u, v), either u belongs to U and v to V, +# or u belongs to V and v to U. We can also say that there is no edge that connects +# vertices of same set. +def check_bipartite_dfs(graph): + visited = [False] * len(graph) + color = [-1] * len(graph) + + def dfs(v, c): + visited[v] = True + color[v] = c + for u in graph[v]: + if not visited[u]: + dfs(u, 1 - c) + + for i in range(len(graph)): + if not visited[i]: + dfs(i, 0) + + for i in range(len(graph)): + for j in graph[i]: + if color[i] == color[j]: + return False + + return True + + +# Adjacency list of graph +graph = {0: [1, 3], 1: [0, 2], 2: [1, 3], 3: [0, 2], 4: []} +print(check_bipartite_dfs(graph)) diff --git a/python-mega-algo/graphs/connected_components.py b/python-mega-algo/graphs/connected_components.py new file mode 100644 index 00000000..4af7803d --- /dev/null +++ b/python-mega-algo/graphs/connected_components.py @@ -0,0 +1,58 @@ +""" +https://en.wikipedia.org/wiki/Component_(graph_theory) + +Finding connected components in graph + +""" + +test_graph_1 = {0: [1, 2], 1: [0, 3], 2: [0], 3: [1], 4: [5, 6], 5: [4, 6], 6: [4, 5]} + +test_graph_2 = {0: [1, 2, 3], 1: [0, 3], 2: [0], 3: [0, 1], 4: [], 5: []} + + +def dfs(graph: dict, vert: int, visited: list) -> list: + """ + Use depth first search to find all vertices + being in the same component as initial vertex + >>> dfs(test_graph_1, 0, 5 * [False]) + [0, 1, 3, 2] + >>> dfs(test_graph_2, 0, 6 * [False]) + [0, 1, 3, 2] + """ + + visited[vert] = True + connected_verts = [] + + for neighbour in graph[vert]: + if not visited[neighbour]: + connected_verts += dfs(graph, neighbour, visited) + + return [vert] + connected_verts + + +def connected_components(graph: dict) -> list: + """ + This function takes graph as a parameter + and then returns the list of connected components + >>> connected_components(test_graph_1) + [[0, 1, 3, 2], [4, 5, 6]] + >>> connected_components(test_graph_2) + [[0, 1, 3, 2], [4], [5]] + """ + + graph_size = len(graph) + visited = graph_size * [False] + components_list = [] + + for i in range(graph_size): + if not visited[i]: + i_connected = dfs(graph, i, visited) + components_list.append(i_connected) + + return components_list + + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/graphs/depth_first_search.py b/python-mega-algo/graphs/depth_first_search.py new file mode 100644 index 00000000..907cc172 --- /dev/null +++ b/python-mega-algo/graphs/depth_first_search.py @@ -0,0 +1,49 @@ +"""Non recursive implementation of a DFS algorithm.""" + +from __future__ import annotations + + +def depth_first_search(graph: dict, start: str) -> set[int]: + """Depth First Search on Graph + :param graph: directed graph in dictionary format + :param vertex: starting vertex as a string + :returns: the trace of the search + >>> G = { "A": ["B", "C", "D"], "B": ["A", "D", "E"], + ... "C": ["A", "F"], "D": ["B", "D"], "E": ["B", "F"], + ... "F": ["C", "E", "G"], "G": ["F"] } + >>> start = "A" + >>> output_G = list({'A', 'B', 'C', 'D', 'E', 'F', 'G'}) + >>> all(x in output_G for x in list(depth_first_search(G, "A"))) + True + >>> all(x in output_G for x in list(depth_first_search(G, "G"))) + True + """ + explored, stack = set(start), [start] + + while stack: + v = stack.pop() + explored.add(v) + # Differences from BFS: + # 1) pop last element instead of first one + # 2) add adjacent elements to stack without exploring them + for adj in reversed(graph[v]): + if adj not in explored: + stack.append(adj) + return explored + + +G = { + "A": ["B", "C", "D"], + "B": ["A", "D", "E"], + "C": ["A", "F"], + "D": ["B", "D"], + "E": ["B", "F"], + "F": ["C", "E", "G"], + "G": ["F"], +} + +if __name__ == "__main__": + import doctest + + doctest.testmod() + print(depth_first_search(G, "A")) diff --git a/python-mega-algo/graphs/depth_first_search_2.py b/python-mega-algo/graphs/depth_first_search_2.py new file mode 100644 index 00000000..3072d527 --- /dev/null +++ b/python-mega-algo/graphs/depth_first_search_2.py @@ -0,0 +1,65 @@ +#!/usr/bin/python + +""" Author: OMKAR PATHAK """ + + +class Graph: + def __init__(self): + self.vertex = {} + + # for printing the Graph vertices + def print_graph(self) -> None: + print(self.vertex) + for i in self.vertex: + print(i, " -> ", " -> ".join([str(j) for j in self.vertex[i]])) + + # for adding the edge between two vertices + def add_edge(self, from_vertex: int, to_vertex: int) -> None: + # check if vertex is already present, + if from_vertex in self.vertex: + self.vertex[from_vertex].append(to_vertex) + else: + # else make a new vertex + self.vertex[from_vertex] = [to_vertex] + + def dfs(self) -> None: + # visited array for storing already visited nodes + visited = [False] * len(self.vertex) + + # call the recursive helper function + for i in range(len(self.vertex)): + if not visited[i]: + self.dfs_recursive(i, visited) + + def dfs_recursive(self, start_vertex: int, visited: list) -> None: + # mark start vertex as visited + visited[start_vertex] = True + + print(start_vertex, end=" ") + + # Recur for all the vertices that are adjacent to this node + for i in self.vertex: + if not visited[i]: + self.dfs_recursive(i, visited) + + +if __name__ == "__main__": + g = Graph() + g.add_edge(0, 1) + g.add_edge(0, 2) + g.add_edge(1, 2) + g.add_edge(2, 0) + g.add_edge(2, 3) + g.add_edge(3, 3) + + g.print_graph() + print("DFS:") + g.dfs() + + # OUTPUT: + # 0 -> 1 -> 2 + # 1 -> 2 + # 2 -> 0 -> 3 + # 3 -> 3 + # DFS: + # 0 1 2 3 diff --git a/python-mega-algo/graphs/dijkstra.py b/python-mega-algo/graphs/dijkstra.py new file mode 100644 index 00000000..d15fcbbf --- /dev/null +++ b/python-mega-algo/graphs/dijkstra.py @@ -0,0 +1,118 @@ +""" +pseudo-code + +DIJKSTRA(graph G, start vertex s, destination vertex d): + +//all nodes initially unexplored + +1 - let H = min heap data structure, initialized with 0 and s [here 0 indicates + the distance from start vertex s] +2 - while H is non-empty: +3 - remove the first node and cost of H, call it U and cost +4 - if U has been previously explored: +5 - go to the while loop, line 2 //Once a node is explored there is no need + to make it again +6 - mark U as explored +7 - if U is d: +8 - return cost // total cost from start to destination vertex +9 - for each edge(U, V): c=cost of edge(U,V) // for V in graph[U] +10 - if V explored: +11 - go to next V in line 9 +12 - total_cost = cost + c +13 - add (total_cost,V) to H + +You can think at cost as a distance where Dijkstra finds the shortest distance +between vertices s and v in a graph G. The use of a min heap as H guarantees +that if a vertex has already been explored there will be no other path with +shortest distance, that happens because heapq.heappop will always return the +next vertex with the shortest distance, considering that the heap stores not +only the distance between previous vertex and current vertex but the entire +distance between each vertex that makes up the path from start vertex to target +vertex. +""" +import heapq + + +def dijkstra(graph, start, end): + """Return the cost of the shortest path between vertices start and end. + + >>> dijkstra(G, "E", "C") + 6 + >>> dijkstra(G2, "E", "F") + 3 + >>> dijkstra(G3, "E", "F") + 3 + """ + + heap = [(0, start)] # cost from start node,end node + visited = set() + while heap: + (cost, u) = heapq.heappop(heap) + if u in visited: + continue + visited.add(u) + if u == end: + return cost + for v, c in graph[u]: + if v in visited: + continue + next = cost + c + heapq.heappush(heap, (next, v)) + return -1 + + +G = { + "A": [["B", 2], ["C", 5]], + "B": [["A", 2], ["D", 3], ["E", 1], ["F", 1]], + "C": [["A", 5], ["F", 3]], + "D": [["B", 3]], + "E": [["B", 4], ["F", 3]], + "F": [["C", 3], ["E", 3]], +} + +r""" +Layout of G2: + +E -- 1 --> B -- 1 --> C -- 1 --> D -- 1 --> F + \ /\ + \ || + ----------------- 3 -------------------- +""" +G2 = { + "B": [["C", 1]], + "C": [["D", 1]], + "D": [["F", 1]], + "E": [["B", 1], ["F", 3]], + "F": [], +} + +r""" +Layout of G3: + +E -- 1 --> B -- 1 --> C -- 1 --> D -- 1 --> F + \ /\ + \ || + -------- 2 ---------> G ------- 1 ------ +""" +G3 = { + "B": [["C", 1]], + "C": [["D", 1]], + "D": [["F", 1]], + "E": [["B", 1], ["G", 2]], + "F": [], + "G": [["F", 1]], +} + +shortDistance = dijkstra(G, "E", "C") +print(shortDistance) # E -- 3 --> F -- 3 --> C == 6 + +shortDistance = dijkstra(G2, "E", "F") +print(shortDistance) # E -- 3 --> F == 3 + +shortDistance = dijkstra(G3, "E", "F") +print(shortDistance) # E -- 2 --> G -- 1 --> F == 3 + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/graphs/dijkstra_2.py b/python-mega-algo/graphs/dijkstra_2.py new file mode 100644 index 00000000..76288413 --- /dev/null +++ b/python-mega-algo/graphs/dijkstra_2.py @@ -0,0 +1,58 @@ +def printDist(dist, V): + print("\nVertex Distance") + for i in range(V): + if dist[i] != float("inf"): + print(i, "\t", int(dist[i]), end="\t") + else: + print(i, "\t", "INF", end="\t") + print() + + +def minDist(mdist, vset, V): + minVal = float("inf") + minInd = -1 + for i in range(V): + if (not vset[i]) and mdist[i] < minVal: + minInd = i + minVal = mdist[i] + return minInd + + +def Dijkstra(graph, V, src): + mdist = [float("inf") for i in range(V)] + vset = [False for i in range(V)] + mdist[src] = 0.0 + + for i in range(V - 1): + u = minDist(mdist, vset, V) + vset[u] = True + + for v in range(V): + if ( + (not vset[v]) + and graph[u][v] != float("inf") + and mdist[u] + graph[u][v] < mdist[v] + ): + mdist[v] = mdist[u] + graph[u][v] + + printDist(mdist, V) + + +if __name__ == "__main__": + V = int(input("Enter number of vertices: ").strip()) + E = int(input("Enter number of edges: ").strip()) + + graph = [[float("inf") for i in range(V)] for j in range(V)] + + for i in range(V): + graph[i][i] = 0.0 + + for i in range(E): + print("\nEdge ", i + 1) + src = int(input("Enter source:").strip()) + dst = int(input("Enter destination:").strip()) + weight = float(input("Enter weight:").strip()) + graph[src][dst] = weight + + gsrc = int(input("\nEnter shortest path source:").strip()) + Dijkstra(graph, V, gsrc) diff --git a/python-mega-algo/graphs/dijkstra_algorithm.py b/python-mega-algo/graphs/dijkstra_algorithm.py new file mode 100644 index 00000000..6b64834a --- /dev/null +++ b/python-mega-algo/graphs/dijkstra_algorithm.py @@ -0,0 +1,211 @@ +# Title: Dijkstra's Algorithm for finding single source shortest path from scratch +# Author: Shubham Malik +# References: https://en.wikipedia.org/wiki/Dijkstra%27s_algorithm + +import math +import sys + +# For storing the vertex set to retrieve node with the lowest distance + + +class PriorityQueue: + # Based on Min Heap + def __init__(self): + self.cur_size = 0 + self.array = [] + self.pos = {} # To store the pos of node in array + + def isEmpty(self): + return self.cur_size == 0 + + def min_heapify(self, idx): + lc = self.left(idx) + rc = self.right(idx) + if lc < self.cur_size and self.array(lc)[0] < self.array(idx)[0]: + smallest = lc + else: + smallest = idx + if rc < self.cur_size and self.array(rc)[0] < self.array(smallest)[0]: + smallest = rc + if smallest != idx: + self.swap(idx, smallest) + self.min_heapify(smallest) + + def insert(self, tup): + # Inserts a node into the Priority Queue + self.pos[tup[1]] = self.cur_size + self.cur_size += 1 + self.array.append((sys.maxsize, tup[1])) + self.decrease_key((sys.maxsize, tup[1]), tup[0]) + + def extract_min(self): + # Removes and returns the min element at top of priority queue + min_node = self.array[0][1] + self.array[0] = self.array[self.cur_size - 1] + self.cur_size -= 1 + self.min_heapify(1) + del self.pos[min_node] + return min_node + + def left(self, i): + # returns the index of left child + return 2 * i + 1 + + def right(self, i): + # returns the index of right child + return 2 * i + 2 + + def par(self, i): + # returns the index of parent + return math.floor(i / 2) + + def swap(self, i, j): + # swaps array elements at indices i and j + # update the pos{} + self.pos[self.array[i][1]] = j + self.pos[self.array[j][1]] = i + temp = self.array[i] + self.array[i] = self.array[j] + self.array[j] = temp + + def decrease_key(self, tup, new_d): + idx = self.pos[tup[1]] + # assuming the new_d is atmost old_d + self.array[idx] = (new_d, tup[1]) + while idx > 0 and self.array[self.par(idx)][0] > self.array[idx][0]: + self.swap(idx, self.par(idx)) + idx = self.par(idx) + + +class Graph: + def __init__(self, num): + self.adjList = {} # To store graph: u -> (v,w) + self.num_nodes = num # Number of nodes in graph + # To store the distance from source vertex + self.dist = [0] * self.num_nodes + self.par = [-1] * self.num_nodes # To store the path + + def add_edge(self, u, v, w): + # Edge going from node u to v and v to u with weight w + # u (w)-> v, v (w) -> u + # Check if u already in graph + if u in self.adjList.keys(): + self.adjList[u].append((v, w)) + else: + self.adjList[u] = [(v, w)] + + # Assuming undirected graph + if v in self.adjList.keys(): + self.adjList[v].append((u, w)) + else: + self.adjList[v] = [(u, w)] + + def show_graph(self): + # u -> v(w) + for u in self.adjList: + print(u, "->", " -> ".join(str(f"{v}({w})") for v, w in self.adjList[u])) + + def dijkstra(self, src): + # Flush old junk values in par[] + self.par = [-1] * self.num_nodes + # src is the source node + self.dist[src] = 0 + Q = PriorityQueue() + Q.insert((0, src)) # (dist from src, node) + for u in self.adjList.keys(): + if u != src: + self.dist[u] = sys.maxsize # Infinity + self.par[u] = -1 + + while not Q.isEmpty(): + u = Q.extract_min() # Returns node with the min dist from source + # Update the distance of all the neighbours of u and + # if their prev dist was INFINITY then push them in Q + for v, w in self.adjList[u]: + new_dist = self.dist[u] + w + if self.dist[v] > new_dist: + if self.dist[v] == sys.maxsize: + Q.insert((new_dist, v)) + else: + Q.decrease_key((self.dist[v], v), new_dist) + self.dist[v] = new_dist + self.par[v] = u + + # Show the shortest distances from src + self.show_distances(src) + + def show_distances(self, src): + print(f"Distance from node: {src}") + for u in range(self.num_nodes): + print(f"Node {u} has distance: {self.dist[u]}") + + def show_path(self, src, dest): + # To show the shortest path from src to dest + # WARNING: Use it *after* calling dijkstra + path = [] + cost = 0 + temp = dest + # Backtracking from dest to src + while self.par[temp] != -1: + path.append(temp) + if temp != src: + for v, w in self.adjList[temp]: + if v == self.par[temp]: + cost += w + break + temp = self.par[temp] + path.append(src) + path.reverse() + + print(f"----Path to reach {dest} from {src}----") + for u in path: + print(f"{u}", end=" ") + if u != dest: + print("-> ", end="") + + print("\nTotal cost of path: ", cost) + + +if __name__ == "__main__": + graph = Graph(9) + graph.add_edge(0, 1, 4) + graph.add_edge(0, 7, 8) + graph.add_edge(1, 2, 8) + graph.add_edge(1, 7, 11) + graph.add_edge(2, 3, 7) + graph.add_edge(2, 8, 2) + graph.add_edge(2, 5, 4) + graph.add_edge(3, 4, 9) + graph.add_edge(3, 5, 14) + graph.add_edge(4, 5, 10) + graph.add_edge(5, 6, 2) + graph.add_edge(6, 7, 1) + graph.add_edge(6, 8, 6) + graph.add_edge(7, 8, 7) + graph.show_graph() + graph.dijkstra(0) + graph.show_path(0, 4) + +# OUTPUT +# 0 -> 1(4) -> 7(8) +# 1 -> 0(4) -> 2(8) -> 7(11) +# 7 -> 0(8) -> 1(11) -> 6(1) -> 8(7) +# 2 -> 1(8) -> 3(7) -> 8(2) -> 5(4) +# 3 -> 2(7) -> 4(9) -> 5(14) +# 8 -> 2(2) -> 6(6) -> 7(7) +# 5 -> 2(4) -> 3(14) -> 4(10) -> 6(2) +# 4 -> 3(9) -> 5(10) +# 6 -> 5(2) -> 7(1) -> 8(6) +# Distance from node: 0 +# Node 0 has distance: 0 +# Node 1 has distance: 4 +# Node 2 has distance: 12 +# Node 3 has distance: 19 +# Node 4 has distance: 21 +# Node 5 has distance: 11 +# Node 6 has distance: 9 +# Node 7 has distance: 8 +# Node 8 has distance: 14 +# ----Path to reach 4 from 0---- +# 0 -> 7 -> 6 -> 5 -> 4 +# Total cost of path: 21 diff --git a/python-mega-algo/graphs/dinic.py b/python-mega-algo/graphs/dinic.py new file mode 100644 index 00000000..aaf3a119 --- /dev/null +++ b/python-mega-algo/graphs/dinic.py @@ -0,0 +1,94 @@ +INF = float("inf") + + +class Dinic: + def __init__(self, n): + self.lvl = [0] * n + self.ptr = [0] * n + self.q = [0] * n + self.adj = [[] for _ in range(n)] + + """ + Here we will add our edges containing with the following parameters: + vertex closest to source, vertex closest to sink and flow capacity + through that edge ... + """ + + def add_edge(self, a, b, c, rcap=0): + self.adj[a].append([b, len(self.adj[b]), c, 0]) + self.adj[b].append([a, len(self.adj[a]) - 1, rcap, 0]) + + # This is a sample depth first search to be used at max_flow + def depth_first_search(self, vertex, sink, flow): + if vertex == sink or not flow: + return flow + + for i in range(self.ptr[vertex], len(self.adj[vertex])): + e = self.adj[vertex][i] + if self.lvl[e[0]] == self.lvl[vertex] + 1: + p = self.depth_first_search(e[0], sink, min(flow, e[2] - e[3])) + if p: + self.adj[vertex][i][3] += p + self.adj[e[0]][e[1]][3] -= p + return p + self.ptr[vertex] = self.ptr[vertex] + 1 + return 0 + + # Here we calculate the flow that reaches the sink + def max_flow(self, source, sink): + flow, self.q[0] = 0, source + for l in range(31): # noqa: E741 l = 30 maybe faster for random data + while True: + self.lvl, self.ptr = [0] * len(self.q), [0] * len(self.q) + qi, qe, self.lvl[source] = 0, 1, 1 + while qi < qe and not self.lvl[sink]: + v = self.q[qi] + qi += 1 + for e in self.adj[v]: + if not self.lvl[e[0]] and (e[2] - e[3]) >> (30 - l): + self.q[qe] = e[0] + qe += 1 + self.lvl[e[0]] = self.lvl[v] + 1 + + p = self.depth_first_search(source, sink, INF) + while p: + flow += p + p = self.depth_first_search(source, sink, INF) + + if not self.lvl[sink]: + break + + return flow + + +# Example to use + +""" +Will be a bipartite graph, than it has the vertices near the source(4) +and the vertices near the sink(4) +""" +# Here we make a graphs with 10 vertex(source and sink includes) +graph = Dinic(10) +source = 0 +sink = 9 +""" +Now we add the vertices next to the font in the font with 1 capacity in this edge +(source -> source vertices) +""" +for vertex in range(1, 5): + graph.add_edge(source, vertex, 1) +""" +We will do the same thing for the vertices near the sink, but from vertex to sink +(sink vertices -> sink) +""" +for vertex in range(5, 9): + graph.add_edge(vertex, sink, 1) +""" +Finally we add the verices near the sink to the vertices near the source. +(source vertices -> sink vertices) +""" +for vertex in range(1, 5): + graph.add_edge(vertex, vertex + 4, 1) + +# Now we can know that is the maximum flow(source -> sink) +print(graph.max_flow(source, sink)) diff --git a/python-mega-algo/graphs/directed_and_undirected_(weighted)_graph.py b/python-mega-algo/graphs/directed_and_undirected_(weighted)_graph.py new file mode 100644 index 00000000..5cfa9e13 --- /dev/null +++ b/python-mega-algo/graphs/directed_and_undirected_(weighted)_graph.py @@ -0,0 +1,496 @@ +from collections import deque +from math import floor +from random import random +from time import time + +# the default weight is 1 if not assigned but all the implementation is weighted + + +class DirectedGraph: + def __init__(self): + self.graph = {} + + # adding vertices and edges + # adding the weight is optional + # handles repetition + def add_pair(self, u, v, w=1): + if self.graph.get(u): + if self.graph[u].count([w, v]) == 0: + self.graph[u].append([w, v]) + else: + self.graph[u] = [[w, v]] + if not self.graph.get(v): + self.graph[v] = [] + + def all_nodes(self): + return list(self.graph) + + # handles if the input does not exist + def remove_pair(self, u, v): + if self.graph.get(u): + for _ in self.graph[u]: + if _[1] == v: + self.graph[u].remove(_) + + # if no destination is meant the default value is -1 + def dfs(self, s=-2, d=-1): + if s == d: + return [] + stack = [] + visited = [] + if s == -2: + s = list(self.graph)[0] + stack.append(s) + visited.append(s) + ss = s + + while True: + # check if there is any non isolated nodes + if len(self.graph[s]) != 0: + ss = s + for node in self.graph[s]: + if visited.count(node[1]) < 1: + if node[1] == d: + visited.append(d) + return visited + else: + stack.append(node[1]) + visited.append(node[1]) + ss = node[1] + break + + # check if all the children are visited + if s == ss: + stack.pop() + if len(stack) != 0: + s = stack[len(stack) - 1] + else: + s = ss + + # check if se have reached the starting point + if len(stack) == 0: + return visited + + # c is the count of nodes you want and if you leave it or pass -1 to the function + # the count will be random from 10 to 10000 + def fill_graph_randomly(self, c=-1): + if c == -1: + c = floor(random() * 10000) + 10 + for i in range(c): + # every vertex has max 100 edges + for _ in range(floor(random() * 102) + 1): + n = floor(random() * c) + 1 + if n != i: + self.add_pair(i, n, 1) + + def bfs(self, s=-2): + d = deque() + visited = [] + if s == -2: + s = list(self.graph)[0] + d.append(s) + visited.append(s) + while d: + s = d.popleft() + if len(self.graph[s]) != 0: + for node in self.graph[s]: + if visited.count(node[1]) < 1: + d.append(node[1]) + visited.append(node[1]) + return visited + + def in_degree(self, u): + count = 0 + for x in self.graph: + for y in self.graph[x]: + if y[1] == u: + count += 1 + return count + + def out_degree(self, u): + return len(self.graph[u]) + + def topological_sort(self, s=-2): + stack = [] + visited = [] + if s == -2: + s = list(self.graph)[0] + stack.append(s) + visited.append(s) + ss = s + sorted_nodes = [] + + while True: + # check if there is any non isolated nodes + if len(self.graph[s]) != 0: + ss = s + for node in self.graph[s]: + if visited.count(node[1]) < 1: + stack.append(node[1]) + visited.append(node[1]) + ss = node[1] + break + + # check if all the children are visited + if s == ss: + sorted_nodes.append(stack.pop()) + if len(stack) != 0: + s = stack[len(stack) - 1] + else: + s = ss + + # check if se have reached the starting point + if len(stack) == 0: + return sorted_nodes + + def cycle_nodes(self): + stack = [] + visited = [] + s = list(self.graph)[0] + stack.append(s) + visited.append(s) + parent = -2 + indirect_parents = [] + ss = s + on_the_way_back = False + anticipating_nodes = set() + + while True: + # check if there is any non isolated nodes + if len(self.graph[s]) != 0: + ss = s + for node in self.graph[s]: + if ( + visited.count(node[1]) > 0 + and node[1] != parent + and indirect_parents.count(node[1]) > 0 + and not on_the_way_back + ): + len_stack = len(stack) - 1 + while True and len_stack >= 0: + if stack[len_stack] == node[1]: + anticipating_nodes.add(node[1]) + break + else: + anticipating_nodes.add(stack[len_stack]) + len_stack -= 1 + if visited.count(node[1]) < 1: + stack.append(node[1]) + visited.append(node[1]) + ss = node[1] + break + + # check if all the children are visited + if s == ss: + stack.pop() + on_the_way_back = True + if len(stack) != 0: + s = stack[len(stack) - 1] + else: + on_the_way_back = False + indirect_parents.append(parent) + parent = s + s = ss + + # check if se have reached the starting point + if len(stack) == 0: + return list(anticipating_nodes) + + def has_cycle(self): + stack = [] + visited = [] + s = list(self.graph)[0] + stack.append(s) + visited.append(s) + parent = -2 + indirect_parents = [] + ss = s + on_the_way_back = False + anticipating_nodes = set() + + while True: + # check if there is any non isolated nodes + if len(self.graph[s]) != 0: + ss = s + for node in self.graph[s]: + if ( + visited.count(node[1]) > 0 + and node[1] != parent + and indirect_parents.count(node[1]) > 0 + and not on_the_way_back + ): + len_stack_minus_one = len(stack) - 1 + while True and len_stack_minus_one >= 0: + if stack[len_stack_minus_one] == node[1]: + anticipating_nodes.add(node[1]) + break + else: + return True + # TODO:The following code is unreachable. + anticipating_nodes.add(stack[len_stack_minus_one]) + len_stack_minus_one -= 1 + if visited.count(node[1]) < 1: + stack.append(node[1]) + visited.append(node[1]) + ss = node[1] + break + + # check if all the children are visited + if s == ss: + stack.pop() + on_the_way_back = True + if len(stack) != 0: + s = stack[len(stack) - 1] + else: + on_the_way_back = False + indirect_parents.append(parent) + parent = s + s = ss + + # check if se have reached the starting point + if len(stack) == 0: + return False + + def dfs_time(self, s=-2, e=-1): + begin = time() + self.dfs(s, e) + end = time() + return end - begin + + def bfs_time(self, s=-2): + begin = time() + self.bfs(s) + end = time() + return end - begin + + +class Graph: + def __init__(self): + self.graph = {} + + # adding vertices and edges + # adding the weight is optional + # handles repetition + def add_pair(self, u, v, w=1): + # check if the u exists + if self.graph.get(u): + # if there already is a edge + if self.graph[u].count([w, v]) == 0: + self.graph[u].append([w, v]) + else: + # if u does not exist + self.graph[u] = [[w, v]] + # add the other way + if self.graph.get(v): + # if there already is a edge + if self.graph[v].count([w, u]) == 0: + self.graph[v].append([w, u]) + else: + # if u does not exist + self.graph[v] = [[w, u]] + + # handles if the input does not exist + def remove_pair(self, u, v): + if self.graph.get(u): + for _ in self.graph[u]: + if _[1] == v: + self.graph[u].remove(_) + # the other way round + if self.graph.get(v): + for _ in self.graph[v]: + if _[1] == u: + self.graph[v].remove(_) + + # if no destination is meant the default value is -1 + def dfs(self, s=-2, d=-1): + if s == d: + return [] + stack = [] + visited = [] + if s == -2: + s = list(self.graph)[0] + stack.append(s) + visited.append(s) + ss = s + + while True: + # check if there is any non isolated nodes + if len(self.graph[s]) != 0: + ss = s + for node in self.graph[s]: + if visited.count(node[1]) < 1: + if node[1] == d: + visited.append(d) + return visited + else: + stack.append(node[1]) + visited.append(node[1]) + ss = node[1] + break + + # check if all the children are visited + if s == ss: + stack.pop() + if len(stack) != 0: + s = stack[len(stack) - 1] + else: + s = ss + + # check if se have reached the starting point + if len(stack) == 0: + return visited + + # c is the count of nodes you want and if you leave it or pass -1 to the function + # the count will be random from 10 to 10000 + def fill_graph_randomly(self, c=-1): + if c == -1: + c = floor(random() * 10000) + 10 + for i in range(c): + # every vertex has max 100 edges + for _ in range(floor(random() * 102) + 1): + n = floor(random() * c) + 1 + if n != i: + self.add_pair(i, n, 1) + + def bfs(self, s=-2): + d = deque() + visited = [] + if s == -2: + s = list(self.graph)[0] + d.append(s) + visited.append(s) + while d: + s = d.popleft() + if len(self.graph[s]) != 0: + for node in self.graph[s]: + if visited.count(node[1]) < 1: + d.append(node[1]) + visited.append(node[1]) + return visited + + def degree(self, u): + return len(self.graph[u]) + + def cycle_nodes(self): + stack = [] + visited = [] + s = list(self.graph)[0] + stack.append(s) + visited.append(s) + parent = -2 + indirect_parents = [] + ss = s + on_the_way_back = False + anticipating_nodes = set() + + while True: + # check if there is any non isolated nodes + if len(self.graph[s]) != 0: + ss = s + for node in self.graph[s]: + if ( + visited.count(node[1]) > 0 + and node[1] != parent + and indirect_parents.count(node[1]) > 0 + and not on_the_way_back + ): + len_stack = len(stack) - 1 + while True and len_stack >= 0: + if stack[len_stack] == node[1]: + anticipating_nodes.add(node[1]) + break + else: + anticipating_nodes.add(stack[len_stack]) + len_stack -= 1 + if visited.count(node[1]) < 1: + stack.append(node[1]) + visited.append(node[1]) + ss = node[1] + break + + # check if all the children are visited + if s == ss: + stack.pop() + on_the_way_back = True + if len(stack) != 0: + s = stack[len(stack) - 1] + else: + on_the_way_back = False + indirect_parents.append(parent) + parent = s + s = ss + + # check if se have reached the starting point + if len(stack) == 0: + return list(anticipating_nodes) + + def has_cycle(self): + stack = [] + visited = [] + s = list(self.graph)[0] + stack.append(s) + visited.append(s) + parent = -2 + indirect_parents = [] + ss = s + on_the_way_back = False + anticipating_nodes = set() + + while True: + # check if there is any non isolated nodes + if len(self.graph[s]) != 0: + ss = s + for node in self.graph[s]: + if ( + visited.count(node[1]) > 0 + and node[1] != parent + and indirect_parents.count(node[1]) > 0 + and not on_the_way_back + ): + len_stack_minus_one = len(stack) - 1 + while True and len_stack_minus_one >= 0: + if stack[len_stack_minus_one] == node[1]: + anticipating_nodes.add(node[1]) + break + else: + return True + # TODO: the following code is unreachable + # is this meant to be called in the else ? + anticipating_nodes.add(stack[len_stack_minus_one]) + len_stack_minus_one -= 1 + if visited.count(node[1]) < 1: + stack.append(node[1]) + visited.append(node[1]) + ss = node[1] + break + + # check if all the children are visited + if s == ss: + stack.pop() + on_the_way_back = True + if len(stack) != 0: + s = stack[len(stack) - 1] + else: + on_the_way_back = False + indirect_parents.append(parent) + parent = s + s = ss + + # check if se have reached the starting point + if len(stack) == 0: + return False + + def all_nodes(self): + return list(self.graph) + + def dfs_time(self, s=-2, e=-1): + begin = time() + self.dfs(s, e) + end = time() + return end - begin + + def bfs_time(self, s=-2): + begin = time() + self.bfs(s) + end = time() + return end - begin diff --git a/python-mega-algo/graphs/edmonds_karp_multiple_source_and_sink.py b/python-mega-algo/graphs/edmonds_karp_multiple_source_and_sink.py new file mode 100644 index 00000000..0f359ff1 --- /dev/null +++ b/python-mega-algo/graphs/edmonds_karp_multiple_source_and_sink.py @@ -0,0 +1,193 @@ +class FlowNetwork: + def __init__(self, graph, sources, sinks): + self.sourceIndex = None + self.sinkIndex = None + self.graph = graph + + self._normalizeGraph(sources, sinks) + self.verticesCount = len(graph) + self.maximumFlowAlgorithm = None + + # make only one source and one sink + def _normalizeGraph(self, sources, sinks): + if sources is int: + sources = [sources] + if sinks is int: + sinks = [sinks] + + if len(sources) == 0 or len(sinks) == 0: + return + + self.sourceIndex = sources[0] + self.sinkIndex = sinks[0] + + # make fake vertex if there are more + # than one source or sink + if len(sources) > 1 or len(sinks) > 1: + maxInputFlow = 0 + for i in sources: + maxInputFlow += sum(self.graph[i]) + + size = len(self.graph) + 1 + for room in self.graph: + room.insert(0, 0) + self.graph.insert(0, [0] * size) + for i in sources: + self.graph[0][i + 1] = maxInputFlow + self.sourceIndex = 0 + + size = len(self.graph) + 1 + for room in self.graph: + room.append(0) + self.graph.append([0] * size) + for i in sinks: + self.graph[i + 1][size - 1] = maxInputFlow + self.sinkIndex = size - 1 + + def findMaximumFlow(self): + if self.maximumFlowAlgorithm is None: + raise Exception("You need to set maximum flow algorithm before.") + if self.sourceIndex is None or self.sinkIndex is None: + return 0 + + self.maximumFlowAlgorithm.execute() + return self.maximumFlowAlgorithm.getMaximumFlow() + + def setMaximumFlowAlgorithm(self, Algorithm): + self.maximumFlowAlgorithm = Algorithm(self) + + +class FlowNetworkAlgorithmExecutor: + def __init__(self, flowNetwork): + self.flowNetwork = flowNetwork + self.verticesCount = flowNetwork.verticesCount + self.sourceIndex = flowNetwork.sourceIndex + self.sinkIndex = flowNetwork.sinkIndex + # it's just a reference, so you shouldn't change + # it in your algorithms, use deep copy before doing that + self.graph = flowNetwork.graph + self.executed = False + + def execute(self): + if not self.executed: + self._algorithm() + self.executed = True + + # You should override it + def _algorithm(self): + pass + + +class MaximumFlowAlgorithmExecutor(FlowNetworkAlgorithmExecutor): + def __init__(self, flowNetwork): + super().__init__(flowNetwork) + # use this to save your result + self.maximumFlow = -1 + + def getMaximumFlow(self): + if not self.executed: + raise Exception("You should execute algorithm before using its result!") + + return self.maximumFlow + + +class PushRelabelExecutor(MaximumFlowAlgorithmExecutor): + def __init__(self, flowNetwork): + super().__init__(flowNetwork) + + self.preflow = [[0] * self.verticesCount for i in range(self.verticesCount)] + + self.heights = [0] * self.verticesCount + self.excesses = [0] * self.verticesCount + + def _algorithm(self): + self.heights[self.sourceIndex] = self.verticesCount + + # push some substance to graph + for nextVertexIndex, bandwidth in enumerate(self.graph[self.sourceIndex]): + self.preflow[self.sourceIndex][nextVertexIndex] += bandwidth + self.preflow[nextVertexIndex][self.sourceIndex] -= bandwidth + self.excesses[nextVertexIndex] += bandwidth + + # Relabel-to-front selection rule + verticesList = [ + i + for i in range(self.verticesCount) + if i != self.sourceIndex and i != self.sinkIndex + ] + + # move through list + i = 0 + while i < len(verticesList): + vertexIndex = verticesList[i] + previousHeight = self.heights[vertexIndex] + self.processVertex(vertexIndex) + if self.heights[vertexIndex] > previousHeight: + # if it was relabeled, swap elements + # and start from 0 index + verticesList.insert(0, verticesList.pop(i)) + i = 0 + else: + i += 1 + + self.maximumFlow = sum(self.preflow[self.sourceIndex]) + + def processVertex(self, vertexIndex): + while self.excesses[vertexIndex] > 0: + for neighbourIndex in range(self.verticesCount): + # if it's neighbour and current vertex is higher + if ( + self.graph[vertexIndex][neighbourIndex] + - self.preflow[vertexIndex][neighbourIndex] + > 0 + and self.heights[vertexIndex] > self.heights[neighbourIndex] + ): + self.push(vertexIndex, neighbourIndex) + + self.relabel(vertexIndex) + + def push(self, fromIndex, toIndex): + preflowDelta = min( + self.excesses[fromIndex], + self.graph[fromIndex][toIndex] - self.preflow[fromIndex][toIndex], + ) + self.preflow[fromIndex][toIndex] += preflowDelta + self.preflow[toIndex][fromIndex] -= preflowDelta + self.excesses[fromIndex] -= preflowDelta + self.excesses[toIndex] += preflowDelta + + def relabel(self, vertexIndex): + minHeight = None + for toIndex in range(self.verticesCount): + if ( + self.graph[vertexIndex][toIndex] - self.preflow[vertexIndex][toIndex] + > 0 + ): + if minHeight is None or self.heights[toIndex] < minHeight: + minHeight = self.heights[toIndex] + + if minHeight is not None: + self.heights[vertexIndex] = minHeight + 1 + + +if __name__ == "__main__": + entrances = [0] + exits = [3] + # graph = [ + # [0, 0, 4, 6, 0, 0], + # [0, 0, 5, 2, 0, 0], + # [0, 0, 0, 0, 4, 4], + # [0, 0, 0, 0, 6, 6], + # [0, 0, 0, 0, 0, 0], + # [0, 0, 0, 0, 0, 0], + # ] + graph = [[0, 7, 0, 0], [0, 0, 6, 0], [0, 0, 0, 8], [9, 0, 0, 0]] + + # prepare our network + flowNetwork = FlowNetwork(graph, entrances, exits) + # set algorithm + flowNetwork.setMaximumFlowAlgorithm(PushRelabelExecutor) + # and calculate + maximumFlow = flowNetwork.findMaximumFlow() + + print(f"maximum flow is {maximumFlow}") diff --git a/python-mega-algo/graphs/eulerian_path_and_circuit_for_undirected_graph.py b/python-mega-algo/graphs/eulerian_path_and_circuit_for_undirected_graph.py new file mode 100644 index 00000000..7850933b --- /dev/null +++ b/python-mega-algo/graphs/eulerian_path_and_circuit_for_undirected_graph.py @@ -0,0 +1,71 @@ +# Eulerian Path is a path in graph that visits every edge exactly once. +# Eulerian Circuit is an Eulerian Path which starts and ends on the same +# vertex. +# time complexity is O(V+E) +# space complexity is O(VE) + + +# using dfs for finding eulerian path traversal +def dfs(u, graph, visited_edge, path=[]): + path = path + [u] + for v in graph[u]: + if visited_edge[u][v] is False: + visited_edge[u][v], visited_edge[v][u] = True, True + path = dfs(v, graph, visited_edge, path) + return path + + +# for checking in graph has euler path or circuit +def check_circuit_or_path(graph, max_node): + odd_degree_nodes = 0 + odd_node = -1 + for i in range(max_node): + if i not in graph.keys(): + continue + if len(graph[i]) % 2 == 1: + odd_degree_nodes += 1 + odd_node = i + if odd_degree_nodes == 0: + return 1, odd_node + if odd_degree_nodes == 2: + return 2, odd_node + return 3, odd_node + + +def check_euler(graph, max_node): + visited_edge = [[False for _ in range(max_node + 1)] for _ in range(max_node + 1)] + check, odd_node = check_circuit_or_path(graph, max_node) + if check == 3: + print("graph is not Eulerian") + print("no path") + return + start_node = 1 + if check == 2: + start_node = odd_node + print("graph has a Euler path") + if check == 1: + print("graph has a Euler cycle") + path = dfs(start_node, graph, visited_edge) + print(path) + + +def main(): + G1 = {1: [2, 3, 4], 2: [1, 3], 3: [1, 2], 4: [1, 5], 5: [4]} + G2 = {1: [2, 3, 4, 5], 2: [1, 3], 3: [1, 2], 4: [1, 5], 5: [1, 4]} + G3 = {1: [2, 3, 4], 2: [1, 3, 4], 3: [1, 2], 4: [1, 2, 5], 5: [4]} + G4 = {1: [2, 3], 2: [1, 3], 3: [1, 2]} + G5 = { + 1: [], + 2: [] + # all degree is zero + } + max_node = 10 + check_euler(G1, max_node) + check_euler(G2, max_node) + check_euler(G3, max_node) + check_euler(G4, max_node) + check_euler(G5, max_node) + + +if __name__ == "__main__": + main() diff --git a/python-mega-algo/graphs/even_tree.py b/python-mega-algo/graphs/even_tree.py new file mode 100644 index 00000000..c9aef6e7 --- /dev/null +++ b/python-mega-algo/graphs/even_tree.py @@ -0,0 +1,59 @@ +""" +You are given a tree(a simple connected graph with no cycles). The tree has N +nodes numbered from 1 to N and is rooted at node 1. + +Find the maximum number of edges you can remove from the tree to get a forest +such that each connected component of the forest contains an even number of +nodes. + +Constraints +2 <= 2 <= 100 + +Note: The tree input will be such that it can always be decomposed into +components containing an even number of nodes. +""" +# pylint: disable=invalid-name +from collections import defaultdict + + +def dfs(start): + """DFS traversal""" + # pylint: disable=redefined-outer-name + ret = 1 + visited[start] = True + for v in tree.get(start): + if v not in visited: + ret += dfs(v) + if ret % 2 == 0: + cuts.append(start) + return ret + + +def even_tree(): + """ + 2 1 + 3 1 + 4 3 + 5 2 + 6 1 + 7 2 + 8 6 + 9 8 + 10 8 + On removing edges (1,3) and (1,6), we can get the desired result 2. + """ + dfs(1) + + +if __name__ == "__main__": + n, m = 10, 9 + tree = defaultdict(list) + visited = {} + cuts = [] + count = 0 + edges = [(2, 1), (3, 1), (4, 3), (5, 2), (6, 1), (7, 2), (8, 6), (9, 8), (10, 8)] + for u, v in edges: + tree[u].append(v) + tree[v].append(u) + even_tree() + print(len(cuts) - 1) diff --git a/python-mega-algo/graphs/finding_bridges.py b/python-mega-algo/graphs/finding_bridges.py new file mode 100644 index 00000000..6555dd7b --- /dev/null +++ b/python-mega-algo/graphs/finding_bridges.py @@ -0,0 +1,42 @@ +# Finding Bridges in Undirected Graph +def computeBridges(graph): + id = 0 + n = len(graph) # No of vertices in graph + low = [0] * n + visited = [False] * n + + def dfs(at, parent, bridges, id): + visited[at] = True + low[at] = id + id += 1 + for to in graph[at]: + if to == parent: + pass + elif not visited[to]: + dfs(to, at, bridges, id) + low[at] = min(low[at], low[to]) + if at < low[to]: + bridges.append([at, to]) + else: + # This edge is a back edge and cannot be a bridge + low[at] = min(low[at], to) + + bridges = [] + for i in range(n): + if not visited[i]: + dfs(i, -1, bridges, id) + print(bridges) + + +graph = { + 0: [1, 2], + 1: [0, 2], + 2: [0, 1, 3, 5], + 3: [2, 4], + 4: [3], + 5: [2, 6, 8], + 6: [5, 7], + 7: [6, 8], + 8: [5, 7], +} +computeBridges(graph) diff --git a/python-mega-algo/graphs/frequent_pattern_graph_miner.py b/python-mega-algo/graphs/frequent_pattern_graph_miner.py new file mode 100644 index 00000000..aae18441 --- /dev/null +++ b/python-mega-algo/graphs/frequent_pattern_graph_miner.py @@ -0,0 +1,232 @@ +""" +FP-GraphMiner - A Fast Frequent Pattern Mining Algorithm for Network Graphs + +A novel Frequent Pattern Graph Mining algorithm, FP-GraphMiner, that compactly +represents a set of network graphs as a Frequent Pattern Graph (or FP-Graph). +This graph can be used to efficiently mine frequent subgraphs including maximal +frequent subgraphs and maximum common subgraphs. + +URL: https://www.researchgate.net/publication/235255851 +""" +# fmt: off +edge_array = [ + ['ab-e1', 'ac-e3', 'ad-e5', 'bc-e4', 'bd-e2', 'be-e6', 'bh-e12', 'cd-e2', 'ce-e4', + 'de-e1', 'df-e8', 'dg-e5', 'dh-e10', 'ef-e3', 'eg-e2', 'fg-e6', 'gh-e6', 'hi-e3'], + ['ab-e1', 'ac-e3', 'ad-e5', 'bc-e4', 'bd-e2', 'be-e6', 'cd-e2', 'de-e1', 'df-e8', + 'ef-e3', 'eg-e2', 'fg-e6'], + ['ab-e1', 'ac-e3', 'bc-e4', 'bd-e2', 'de-e1', 'df-e8', 'dg-e5', 'ef-e3', 'eg-e2', + 'eh-e12', 'fg-e6', 'fh-e10', 'gh-e6'], + ['ab-e1', 'ac-e3', 'bc-e4', 'bd-e2', 'bh-e12', 'cd-e2', 'df-e8', 'dh-e10'], + ['ab-e1', 'ac-e3', 'ad-e5', 'bc-e4', 'bd-e2', 'cd-e2', 'ce-e4', 'de-e1', 'df-e8', + 'dg-e5', 'ef-e3', 'eg-e2', 'fg-e6'] +] +# fmt: on + + +def get_distinct_edge(edge_array): + """ + Return Distinct edges from edge array of multiple graphs + >>> sorted(get_distinct_edge(edge_array)) + ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'] + """ + distinct_edge = set() + for row in edge_array: + for item in row: + distinct_edge.add(item[0]) + return list(distinct_edge) + + +def get_bitcode(edge_array, distinct_edge): + """ + Return bitcode of distinct_edge + """ + bitcode = ["0"] * len(edge_array) + for i, row in enumerate(edge_array): + for item in row: + if distinct_edge in item[0]: + bitcode[i] = "1" + break + return "".join(bitcode) + + +def get_frequency_table(edge_array): + """ + Returns Frequency Table + """ + distinct_edge = get_distinct_edge(edge_array) + frequency_table = dict() + + for item in distinct_edge: + bit = get_bitcode(edge_array, item) + # print('bit',bit) + # bt=''.join(bit) + s = bit.count("1") + frequency_table[item] = [s, bit] + # Store [Distinct edge, WT(Bitcode), Bitcode] in descending order + sorted_frequency_table = [ + [k, v[0], v[1]] + for k, v in sorted(frequency_table.items(), key=lambda v: v[1][0], reverse=True) + ] + return sorted_frequency_table + + +def get_nodes(frequency_table): + """ + Returns nodes + format nodes={bitcode:edges that represent the bitcode} + >>> get_nodes([['ab', 5, '11111'], ['ac', 5, '11111'], ['df', 5, '11111'], + ... ['bd', 5, '11111'], ['bc', 5, '11111']]) + {'11111': ['ab', 'ac', 'df', 'bd', 'bc']} + """ + nodes = {} + for i, item in enumerate(frequency_table): + nodes.setdefault(item[2], []).append(item[0]) + return nodes + + +def get_cluster(nodes): + """ + Returns cluster + format cluster:{WT(bitcode):nodes with same WT} + """ + cluster = {} + for key, value in nodes.items(): + cluster.setdefault(key.count("1"), {})[key] = value + return cluster + + +def get_support(cluster): + """ + Returns support + >>> get_support({5: {'11111': ['ab', 'ac', 'df', 'bd', 'bc']}, + ... 4: {'11101': ['ef', 'eg', 'de', 'fg'], '11011': ['cd']}, + ... 3: {'11001': ['ad'], '10101': ['dg']}, + ... 2: {'10010': ['dh', 'bh'], '11000': ['be'], '10100': ['gh'], + ... '10001': ['ce']}, + ... 1: {'00100': ['fh', 'eh'], '10000': ['hi']}}) + [100.0, 80.0, 60.0, 40.0, 20.0] + """ + return [i * 100 / len(cluster) for i in cluster] + + +def print_all() -> None: + print("\nNodes\n") + for key, value in nodes.items(): + print(key, value) + print("\nSupport\n") + print(support) + print("\n Cluster \n") + for key, value in sorted(cluster.items(), reverse=True): + print(key, value) + print("\n Graph\n") + for key, value in graph.items(): + print(key, value) + print("\n Edge List of Frequent subgraphs \n") + for edge_list in freq_subgraph_edge_list: + print(edge_list) + + +def create_edge(nodes, graph, cluster, c1): + """ + create edge between the nodes + """ + for i in cluster[c1].keys(): + count = 0 + c2 = c1 + 1 + while c2 < max(cluster.keys()): + for j in cluster[c2].keys(): + """ + creates edge only if the condition satisfies + """ + if int(i, 2) & int(j, 2) == int(i, 2): + if tuple(nodes[i]) in graph: + graph[tuple(nodes[i])].append(nodes[j]) + else: + graph[tuple(nodes[i])] = [nodes[j]] + count += 1 + if count == 0: + c2 = c2 + 1 + else: + break + + +def construct_graph(cluster, nodes): + X = cluster[max(cluster.keys())] + cluster[max(cluster.keys()) + 1] = "Header" + graph = {} + for i in X: + if tuple(["Header"]) in graph: + graph[tuple(["Header"])].append(X[i]) + else: + graph[tuple(["Header"])] = [X[i]] + for i in X: + graph[tuple(X[i])] = [["Header"]] + i = 1 + while i < max(cluster) - 1: + create_edge(nodes, graph, cluster, i) + i = i + 1 + return graph + + +def myDFS(graph, start, end, path=[]): + """ + find different DFS walk from given node to Header node + """ + path = path + [start] + if start == end: + paths.append(path) + for node in graph[start]: + if tuple(node) not in path: + myDFS(graph, tuple(node), end, path) + + +def find_freq_subgraph_given_support(s, cluster, graph): + """ + find edges of multiple frequent subgraphs + """ + k = int(s / 100 * (len(cluster) - 1)) + for i in cluster[k].keys(): + myDFS(graph, tuple(cluster[k][i]), tuple(["Header"])) + + +def freq_subgraphs_edge_list(paths): + """ + returns Edge list for frequent subgraphs + """ + freq_sub_EL = [] + for edges in paths: + EL = [] + for j in range(len(edges) - 1): + temp = list(edges[j]) + for e in temp: + edge = (e[0], e[1]) + EL.append(edge) + freq_sub_EL.append(EL) + return freq_sub_EL + + +def preprocess(edge_array): + """ + Preprocess the edge array + >>> preprocess([['ab-e1', 'ac-e3', 'ad-e5', 'bc-e4', 'bd-e2', 'be-e6', 'bh-e12', + ... 'cd-e2', 'ce-e4', 'de-e1', 'df-e8', 'dg-e5', 'dh-e10', 'ef-e3', + ... 'eg-e2', 'fg-e6', 'gh-e6', 'hi-e3']]) + + """ + for i in range(len(edge_array)): + for j in range(len(edge_array[i])): + t = edge_array[i][j].split("-") + edge_array[i][j] = t + + +if __name__ == "__main__": + preprocess(edge_array) + frequency_table = get_frequency_table(edge_array) + nodes = get_nodes(frequency_table) + cluster = get_cluster(nodes) + support = get_support(cluster) + graph = construct_graph(cluster, nodes) + find_freq_subgraph_given_support(60, cluster, graph) + paths = [] + freq_subgraph_edge_list = freq_subgraphs_edge_list(paths) + print_all() diff --git a/python-mega-algo/graphs/g_topological_sort.py b/python-mega-algo/graphs/g_topological_sort.py new file mode 100644 index 00000000..77543d51 --- /dev/null +++ b/python-mega-algo/graphs/g_topological_sort.py @@ -0,0 +1,47 @@ +# Author: Phyllipe Bezerra (https://github.com/pmba) + +clothes = { + 0: "underwear", + 1: "pants", + 2: "belt", + 3: "suit", + 4: "shoe", + 5: "socks", + 6: "shirt", + 7: "tie", + 8: "watch", +} + +graph = [[1, 4], [2, 4], [3], [], [], [4], [2, 7], [3], []] + +visited = [0 for x in range(len(graph))] +stack = [] + + +def print_stack(stack, clothes): + order = 1 + while stack: + current_clothing = stack.pop() + print(order, clothes[current_clothing]) + order += 1 + + +def depth_first_search(u, visited, graph): + visited[u] = 1 + for v in graph[u]: + if not visited[v]: + depth_first_search(v, visited, graph) + + stack.append(u) + + +def topological_sort(graph, visited): + for v in range(len(graph)): + if not visited[v]: + depth_first_search(v, visited, graph) + + +if __name__ == "__main__": + topological_sort(graph, visited) + print(stack) + print_stack(stack, clothes) diff --git a/python-mega-algo/graphs/gale_shapley_bigraph.py b/python-mega-algo/graphs/gale_shapley_bigraph.py new file mode 100644 index 00000000..59baf829 --- /dev/null +++ b/python-mega-algo/graphs/gale_shapley_bigraph.py @@ -0,0 +1,44 @@ +from __future__ import annotations + + +def stable_matching(donor_pref: list[int], recipient_pref: list[int]) -> list[int]: + """ + Finds the stable match in any bipartite graph, i.e a pairing where no 2 objects + prefer each other over their partner. The function accepts the preferences of + oegan donors and recipients (where both are assigned numbers from 0 to n-1) and + returns a list where the index position corresponds to the donor and value at the + index is the organ recipient. + + To better understand the algorithm, see also: + https://github.com/akashvshroff/Gale_Shapley_Stable_Matching (README). + https://www.youtube.com/watch?v=Qcv1IqHWAzg&t=13s (Numberphile YouTube). + + >>> donor_pref = [[0, 1, 3, 2], [0, 2, 3, 1], [1, 0, 2, 3], [0, 3, 1, 2]] + >>> recipient_pref = [[3, 1, 2, 0], [3, 1, 0, 2], [0, 3, 1, 2], [1, 0, 3, 2]] + >>> print(stable_matching(donor_pref, recipient_pref)) + [1, 2, 3, 0] + """ + assert len(donor_pref) == len(recipient_pref) + n = len(donor_pref) + unmatched_donors = list(range(n)) + donor_record = [-1] * n # who the donor has donated to + rec_record = [-1] * n # who the recipient has received from + num_donations = [0] * n + while unmatched_donors: + donor = unmatched_donors[0] + donor_preference = donor_pref[donor] + recipient = donor_preference[num_donations[donor]] + num_donations[donor] += 1 + rec_preference = recipient_pref[recipient] + prev_donor = rec_record[recipient] + if prev_donor != -1: + if rec_preference.index(prev_donor) > rec_preference.index(donor): + rec_record[recipient] = donor + donor_record[donor] = recipient + unmatched_donors.append(prev_donor) + unmatched_donors.remove(donor) + else: + rec_record[recipient] = donor + donor_record[donor] = recipient + unmatched_donors.remove(donor) + return donor_record diff --git a/python-mega-algo/graphs/graph_list.py b/python-mega-algo/graphs/graph_list.py new file mode 100644 index 00000000..bab6d689 --- /dev/null +++ b/python-mega-algo/graphs/graph_list.py @@ -0,0 +1,143 @@ +#!/usr/bin/env python3 + +# Author: OMKAR PATHAK, Nwachukwu Chidiebere + +# Use a Python dictionary to construct the graph. + +from pprint import pformat + + +class GraphAdjacencyList: + """ + Adjacency List type Graph Data Structure that accounts for directed and undirected + Graphs. Initialize graph object indicating whether it's directed or undirected. + + Directed graph example: + >>> d_graph = GraphAdjacencyList() + >>> d_graph + {} + >>> d_graph.add_edge(0, 1) + {0: [1], 1: []} + >>> d_graph.add_edge(1, 2).add_edge(1, 4).add_edge(1, 5) + {0: [1], 1: [2, 4, 5], 2: [], 4: [], 5: []} + >>> d_graph.add_edge(2, 0).add_edge(2, 6).add_edge(2, 7) + {0: [1], 1: [2, 4, 5], 2: [0, 6, 7], 4: [], 5: [], 6: [], 7: []} + >>> print(d_graph) + {0: [1], 1: [2, 4, 5], 2: [0, 6, 7], 4: [], 5: [], 6: [], 7: []} + >>> print(repr(d_graph)) + {0: [1], 1: [2, 4, 5], 2: [0, 6, 7], 4: [], 5: [], 6: [], 7: []} + + Undirected graph example: + >>> u_graph = GraphAdjacencyList(directed=False) + >>> u_graph.add_edge(0, 1) + {0: [1], 1: [0]} + >>> u_graph.add_edge(1, 2).add_edge(1, 4).add_edge(1, 5) + {0: [1], 1: [0, 2, 4, 5], 2: [1], 4: [1], 5: [1]} + >>> u_graph.add_edge(2, 0).add_edge(2, 6).add_edge(2, 7) + {0: [1, 2], 1: [0, 2, 4, 5], 2: [1, 0, 6, 7], 4: [1], 5: [1], 6: [2], 7: [2]} + >>> u_graph.add_edge(4, 5) + {0: [1, 2], + 1: [0, 2, 4, 5], + 2: [1, 0, 6, 7], + 4: [1, 5], + 5: [1, 4], + 6: [2], + 7: [2]} + >>> print(u_graph) + {0: [1, 2], + 1: [0, 2, 4, 5], + 2: [1, 0, 6, 7], + 4: [1, 5], + 5: [1, 4], + 6: [2], + 7: [2]} + >>> print(repr(u_graph)) + {0: [1, 2], + 1: [0, 2, 4, 5], + 2: [1, 0, 6, 7], + 4: [1, 5], + 5: [1, 4], + 6: [2], + 7: [2]} + """ + + def __init__(self, directed: bool = True): + """ + Parameters: + directed: (bool) Indicates if graph is directed or undirected. Default is True. + """ + + self.adj_list = {} # dictionary of lists + self.directed = directed + + def add_edge(self, source_vertex: int, destination_vertex: int) -> object: + """ + Connects vertices together. Creates and Edge from source vertex to destination + vertex. + Vertices will be created if not found in graph + """ + + if not self.directed: # For undirected graphs + # if both source vertex and destination vertex are both present in the + # adjacency list, add destination vertex to source vertex list of adjacent + # vertices and add source vertex to destination vertex list of adjacent + # vertices. + if source_vertex in self.adj_list and destination_vertex in self.adj_list: + self.adj_list[source_vertex].append(destination_vertex) + self.adj_list[destination_vertex].append(source_vertex) + # if only source vertex is present in adjacency list, add destination vertex + # to source vertex list of adjacent vertices, then create a new vertex with + # destination vertex as key and assign a list containing the source vertex + # as it's first adjacent vertex. + elif source_vertex in self.adj_list: + self.adj_list[source_vertex].append(destination_vertex) + self.adj_list[destination_vertex] = [source_vertex] + # if only destination vertex is present in adjacency list, add source vertex + # to destination vertex list of adjacent vertices, then create a new vertex + # with source vertex as key and assign a list containing the source vertex + # as it's first adjacent vertex. + elif destination_vertex in self.adj_list: + self.adj_list[destination_vertex].append(source_vertex) + self.adj_list[source_vertex] = [destination_vertex] + # if both source vertex and destination vertex are not present in adjacency + # list, create a new vertex with source vertex as key and assign a list + # containing the destination vertex as it's first adjacent vertex also + # create a new vertex with destination vertex as key and assign a list + # containing the source vertex as it's first adjacent vertex. + else: + self.adj_list[source_vertex] = [destination_vertex] + self.adj_list[destination_vertex] = [source_vertex] + else: # For directed graphs + # if both source vertex and destination vertex are present in adjacency + # list, add destination vertex to source vertex list of adjacent vertices. + if source_vertex in self.adj_list and destination_vertex in self.adj_list: + self.adj_list[source_vertex].append(destination_vertex) + # if only source vertex is present in adjacency list, add destination + # vertex to source vertex list of adjacent vertices and create a new vertex + # with destination vertex as key, which has no adjacent vertex + elif source_vertex in self.adj_list: + self.adj_list[source_vertex].append(destination_vertex) + self.adj_list[destination_vertex] = [] + # if only destination vertex is present in adjacency list, create a new + # vertex with source vertex as key and assign a list containing destination + # vertex as first adjacent vertex + elif destination_vertex in self.adj_list: + self.adj_list[source_vertex] = [destination_vertex] + # if both source vertex and destination vertex are not present in adjacency + # list, create a new vertex with source vertex as key and a list containing + # destination vertex as it's first adjacent vertex. Then create a new vertex + # with destination vertex as key, which has no adjacent vertex + else: + self.adj_list[source_vertex] = [destination_vertex] + self.adj_list[destination_vertex] = [] + + return self + + def __repr__(self) -> str: + return pformat(self.adj_list) + + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/graphs/graph_matrix.py b/python-mega-algo/graphs/graph_matrix.py new file mode 100644 index 00000000..98716842 --- /dev/null +++ b/python-mega-algo/graphs/graph_matrix.py @@ -0,0 +1,25 @@ +class Graph: + def __init__(self, vertex): + self.vertex = vertex + self.graph = [[0] * vertex for i in range(vertex)] + + def add_edge(self, u, v): + self.graph[u - 1][v - 1] = 1 + self.graph[v - 1][u - 1] = 1 + + def show(self): + + for i in self.graph: + for j in i: + print(j, end=" ") + print(" ") + + +g = Graph(100) + +g.add_edge(1, 4) +g.add_edge(4, 2) +g.add_edge(4, 5) +g.add_edge(2, 5) +g.add_edge(5, 3) +g.show() diff --git a/python-mega-algo/graphs/graphs_floyd_warshall.py b/python-mega-algo/graphs/graphs_floyd_warshall.py new file mode 100644 index 00000000..56cf8b9e --- /dev/null +++ b/python-mega-algo/graphs/graphs_floyd_warshall.py @@ -0,0 +1,102 @@ +# floyd_warshall.py +""" + The problem is to find the shortest distance between all pairs of vertices in a + weighted directed graph that can have negative edge weights. +""" + + +def _print_dist(dist, v): + print("\nThe shortest path matrix using Floyd Warshall algorithm\n") + for i in range(v): + for j in range(v): + if dist[i][j] != float("inf"): + print(int(dist[i][j]), end="\t") + else: + print("INF", end="\t") + print() + + +def floyd_warshall(graph, v): + """ + :param graph: 2D array calculated from weight[edge[i, j]] + :type graph: List[List[float]] + :param v: number of vertices + :type v: int + :return: shortest distance between all vertex pairs + distance[u][v] will contain the shortest distance from vertex u to v. + + 1. For all edges from v to n, distance[i][j] = weight(edge(i, j)). + 3. The algorithm then performs distance[i][j] = min(distance[i][j], distance[i][k] + + distance[k][j]) for each possible pair i, j of vertices. + 4. The above is repeated for each vertex k in the graph. + 5. Whenever distance[i][j] is given a new minimum value, next vertex[i][j] is + updated to the next vertex[i][k]. + """ + + dist = [[float("inf") for _ in range(v)] for _ in range(v)] + + for i in range(v): + for j in range(v): + dist[i][j] = graph[i][j] + + # check vertex k against all other vertices (i, j) + for k in range(v): + # looping through rows of graph array + for i in range(v): + # looping through columns of graph array + for j in range(v): + if ( + dist[i][k] != float("inf") + and dist[k][j] != float("inf") + and dist[i][k] + dist[k][j] < dist[i][j] + ): + dist[i][j] = dist[i][k] + dist[k][j] + + _print_dist(dist, v) + return dist, v + + +if __name__ == "__main__": + v = int(input("Enter number of vertices: ")) + e = int(input("Enter number of edges: ")) + + graph = [[float("inf") for i in range(v)] for j in range(v)] + + for i in range(v): + graph[i][i] = 0.0 + + # src and dst are indices that must be within the array size graph[e][v] + # failure to follow this will result in an error + for i in range(e): + print("\nEdge ", i + 1) + src = int(input("Enter source:")) + dst = int(input("Enter destination:")) + weight = float(input("Enter weight:")) + graph[src][dst] = weight + + floyd_warshall(graph, v) + + # Example Input + # Enter number of vertices: 3 + # Enter number of edges: 2 + + # # generated graph from vertex and edge inputs + # [[inf, inf, inf], [inf, inf, inf], [inf, inf, inf]] + # [[0.0, inf, inf], [inf, 0.0, inf], [inf, inf, 0.0]] + + # specify source, destination and weight for edge #1 + # Edge 1 + # Enter source:1 + # Enter destination:2 + # Enter weight:2 + + # specify source, destination and weight for edge #2 + # Edge 2 + # Enter source:2 + # Enter destination:1 + # Enter weight:1 + + # # Expected Output from the vertice, edge and src, dst, weight inputs!! + # 0 INF INF + # INF 0 2 + # INF 1 0 diff --git a/python-mega-algo/graphs/greedy_best_first.py b/python-mega-algo/graphs/greedy_best_first.py new file mode 100644 index 00000000..4b80a685 --- /dev/null +++ b/python-mega-algo/graphs/greedy_best_first.py @@ -0,0 +1,174 @@ +""" +https://en.wikipedia.org/wiki/Best-first_search#Greedy_BFS +""" + +from __future__ import annotations + +grid = [ + [0, 0, 0, 0, 0, 0, 0], + [0, 1, 0, 0, 0, 0, 0], # 0 are free path whereas 1's are obstacles + [0, 0, 0, 0, 0, 0, 0], + [0, 0, 1, 0, 0, 0, 0], + [1, 0, 1, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 1, 0, 0], +] + +delta = ([-1, 0], [0, -1], [1, 0], [0, 1]) # up, left, down, right + + +class Node: + """ + >>> k = Node(0, 0, 4, 5, 0, None) + >>> k.calculate_heuristic() + 9 + >>> n = Node(1, 4, 3, 4, 2, None) + >>> n.calculate_heuristic() + 2 + >>> l = [k, n] + >>> n == l[0] + False + >>> l.sort() + >>> n == l[0] + True + """ + + def __init__(self, pos_x, pos_y, goal_x, goal_y, g_cost, parent): + self.pos_x = pos_x + self.pos_y = pos_y + self.pos = (pos_y, pos_x) + self.goal_x = goal_x + self.goal_y = goal_y + self.g_cost = g_cost + self.parent = parent + self.f_cost = self.calculate_heuristic() + + def calculate_heuristic(self) -> float: + """ + The heuristic here is the Manhattan Distance + Could elaborate to offer more than one choice + """ + dy = abs(self.pos_x - self.goal_x) + dx = abs(self.pos_y - self.goal_y) + return dx + dy + + def __lt__(self, other) -> bool: + return self.f_cost < other.f_cost + + +class GreedyBestFirst: + """ + >>> gbf = GreedyBestFirst((0, 0), (len(grid) - 1, len(grid[0]) - 1)) + >>> [x.pos for x in gbf.get_successors(gbf.start)] + [(1, 0), (0, 1)] + >>> (gbf.start.pos_y + delta[3][0], gbf.start.pos_x + delta[3][1]) + (0, 1) + >>> (gbf.start.pos_y + delta[2][0], gbf.start.pos_x + delta[2][1]) + (1, 0) + >>> gbf.retrace_path(gbf.start) + [(0, 0)] + >>> gbf.search() # doctest: +NORMALIZE_WHITESPACE + [(0, 0), (1, 0), (2, 0), (3, 0), (3, 1), (4, 1), (5, 1), (6, 1), + (6, 2), (6, 3), (5, 3), (5, 4), (5, 5), (6, 5), (6, 6)] + """ + + def __init__(self, start, goal): + self.start = Node(start[1], start[0], goal[1], goal[0], 0, None) + self.target = Node(goal[1], goal[0], goal[1], goal[0], 99999, None) + + self.open_nodes = [self.start] + self.closed_nodes = [] + + self.reached = False + + def search(self) -> list[tuple[int]]: + """ + Search for the path, + if a path is not found, only the starting position is returned + """ + while self.open_nodes: + # Open Nodes are sorted using __lt__ + self.open_nodes.sort() + current_node = self.open_nodes.pop(0) + + if current_node.pos == self.target.pos: + self.reached = True + return self.retrace_path(current_node) + + self.closed_nodes.append(current_node) + successors = self.get_successors(current_node) + + for child_node in successors: + if child_node in self.closed_nodes: + continue + + if child_node not in self.open_nodes: + self.open_nodes.append(child_node) + else: + # retrieve the best current path + better_node = self.open_nodes.pop(self.open_nodes.index(child_node)) + + if child_node.g_cost < better_node.g_cost: + self.open_nodes.append(child_node) + else: + self.open_nodes.append(better_node) + + if not (self.reached): + return [self.start.pos] + + def get_successors(self, parent: Node) -> list[Node]: + """ + Returns a list of successors (both in the grid and free spaces) + """ + successors = [] + for action in delta: + pos_x = parent.pos_x + action[1] + pos_y = parent.pos_y + action[0] + + if not (0 <= pos_x <= len(grid[0]) - 1 and 0 <= pos_y <= len(grid) - 1): + continue + + if grid[pos_y][pos_x] != 0: + continue + + successors.append( + Node( + pos_x, + pos_y, + self.target.pos_y, + self.target.pos_x, + parent.g_cost + 1, + parent, + ) + ) + return successors + + def retrace_path(self, node: Node) -> list[tuple[int]]: + """ + Retrace the path from parents to parents until start node + """ + current_node = node + path = [] + while current_node is not None: + path.append((current_node.pos_y, current_node.pos_x)) + current_node = current_node.parent + path.reverse() + return path + + +if __name__ == "__main__": + init = (0, 0) + goal = (len(grid) - 1, len(grid[0]) - 1) + for elem in grid: + print(elem) + + print("------") + + greedy_bf = GreedyBestFirst(init, goal) + path = greedy_bf.search() + + for elem in path: + grid[elem[0]][elem[1]] = 2 + + for elem in grid: + print(elem) diff --git a/python-mega-algo/graphs/kahns_algorithm_long.py b/python-mega-algo/graphs/kahns_algorithm_long.py new file mode 100644 index 00000000..fed7517a --- /dev/null +++ b/python-mega-algo/graphs/kahns_algorithm_long.py @@ -0,0 +1,31 @@ +# Finding longest distance in Directed Acyclic Graph using KahnsAlgorithm +def longestDistance(graph): + indegree = [0] * len(graph) + queue = [] + longDist = [1] * len(graph) + + for key, values in graph.items(): + for i in values: + indegree[i] += 1 + + for i in range(len(indegree)): + if indegree[i] == 0: + queue.append(i) + + while queue: + vertex = queue.pop(0) + for x in graph[vertex]: + indegree[x] -= 1 + + if longDist[vertex] + 1 > longDist[x]: + longDist[x] = longDist[vertex] + 1 + + if indegree[x] == 0: + queue.append(x) + + print(max(longDist)) + + +# Adjacency list of Graph +graph = {0: [2, 3, 4], 1: [2, 7], 2: [5], 3: [5, 7], 4: [7], 5: [6], 6: [7], 7: []} +longestDistance(graph) diff --git a/python-mega-algo/graphs/kahns_algorithm_topo.py b/python-mega-algo/graphs/kahns_algorithm_topo.py new file mode 100644 index 00000000..bf9f9029 --- /dev/null +++ b/python-mega-algo/graphs/kahns_algorithm_topo.py @@ -0,0 +1,36 @@ +def topologicalSort(graph): + """ + Kahn's Algorithm is used to find Topological ordering of Directed Acyclic Graph + using BFS + """ + indegree = [0] * len(graph) + queue = [] + topo = [] + cnt = 0 + + for key, values in graph.items(): + for i in values: + indegree[i] += 1 + + for i in range(len(indegree)): + if indegree[i] == 0: + queue.append(i) + + while queue: + vertex = queue.pop(0) + cnt += 1 + topo.append(vertex) + for x in graph[vertex]: + indegree[x] -= 1 + if indegree[x] == 0: + queue.append(x) + + if cnt != len(graph): + print("Cycle exists") + else: + print(topo) + + +# Adjacency List of Graph +graph = {0: [1, 2], 1: [3], 2: [3], 3: [4, 5], 4: [], 5: []} +topologicalSort(graph) diff --git a/python-mega-algo/graphs/karger.py b/python-mega-algo/graphs/karger.py new file mode 100644 index 00000000..f72128c8 --- /dev/null +++ b/python-mega-algo/graphs/karger.py @@ -0,0 +1,86 @@ +""" +An implementation of Karger's Algorithm for partitioning a graph. +""" + +from __future__ import annotations + +import random + +# Adjacency list representation of this graph: +# https://en.wikipedia.org/wiki/File:Single_run_of_Karger%E2%80%99s_Mincut_algorithm.svg +TEST_GRAPH = { + "1": ["2", "3", "4", "5"], + "2": ["1", "3", "4", "5"], + "3": ["1", "2", "4", "5", "10"], + "4": ["1", "2", "3", "5", "6"], + "5": ["1", "2", "3", "4", "7"], + "6": ["7", "8", "9", "10", "4"], + "7": ["6", "8", "9", "10", "5"], + "8": ["6", "7", "9", "10"], + "9": ["6", "7", "8", "10"], + "10": ["6", "7", "8", "9", "3"], +} + + +def partition_graph(graph: dict[str, list[str]]) -> set[tuple[str, str]]: + """ + Partitions a graph using Karger's Algorithm. Implemented from + pseudocode found here: + https://en.wikipedia.org/wiki/Karger%27s_algorithm. + This function involves random choices, meaning it will not give + consistent outputs. + + Args: + graph: A dictionary containing adacency lists for the graph. + Nodes must be strings. + + Returns: + The cutset of the cut found by Karger's Algorithm. + + >>> graph = {'0':['1'], '1':['0']} + >>> partition_graph(graph) + {('0', '1')} + """ + # Dict that maps contracted nodes to a list of all the nodes it "contains." + contracted_nodes = {node: {node} for node in graph} + + graph_copy = {node: graph[node][:] for node in graph} + + while len(graph_copy) > 2: + + # Choose a random edge. + u = random.choice(list(graph_copy.keys())) + v = random.choice(graph_copy[u]) + + # Contract edge (u, v) to new node uv + uv = u + v + uv_neighbors = list(set(graph_copy[u] + graph_copy[v])) + uv_neighbors.remove(u) + uv_neighbors.remove(v) + graph_copy[uv] = uv_neighbors + for neighbor in uv_neighbors: + graph_copy[neighbor].append(uv) + + contracted_nodes[uv] = set(contracted_nodes[u].union(contracted_nodes[v])) + + # Remove nodes u and v. + del graph_copy[u] + del graph_copy[v] + for neighbor in uv_neighbors: + if u in graph_copy[neighbor]: + graph_copy[neighbor].remove(u) + if v in graph_copy[neighbor]: + graph_copy[neighbor].remove(v) + + # Find cutset. + groups = [contracted_nodes[node] for node in graph_copy] + return { + (node, neighbor) + for node in groups[0] + for neighbor in graph[node] + if neighbor in groups[1] + } + + +if __name__ == "__main__": + print(partition_graph(TEST_GRAPH)) diff --git a/python-mega-algo/graphs/markov_chain.py b/python-mega-algo/graphs/markov_chain.py new file mode 100644 index 00000000..b93c408c --- /dev/null +++ b/python-mega-algo/graphs/markov_chain.py @@ -0,0 +1,83 @@ +from __future__ import annotations + +from collections import Counter +from random import random + + +class MarkovChainGraphUndirectedUnweighted: + """ + Undirected Unweighted Graph for running Markov Chain Algorithm + """ + + def __init__(self): + self.connections = {} + + def add_node(self, node: str) -> None: + self.connections[node] = {} + + def add_transition_probability( + self, node1: str, node2: str, probability: float + ) -> None: + if node1 not in self.connections: + self.add_node(node1) + if node2 not in self.connections: + self.add_node(node2) + self.connections[node1][node2] = probability + + def get_nodes(self) -> list[str]: + return list(self.connections) + + def transition(self, node: str) -> str: + current_probability = 0 + random_value = random() + + for dest in self.connections[node]: + current_probability += self.connections[node][dest] + if current_probability > random_value: + return dest + + +def get_transitions( + start: str, transitions: list[tuple[str, str, float]], steps: int +) -> dict[str, int]: + """ + Running Markov Chain algorithm and calculating the number of times each node is + visited + + >>> transitions = [ + ... ('a', 'a', 0.9), + ... ('a', 'b', 0.075), + ... ('a', 'c', 0.025), + ... ('b', 'a', 0.15), + ... ('b', 'b', 0.8), + ... ('b', 'c', 0.05), + ... ('c', 'a', 0.25), + ... ('c', 'b', 0.25), + ... ('c', 'c', 0.5) + ... ] + + >>> result = get_transitions('a', transitions, 5000) + + >>> result['a'] > result['b'] > result['c'] + True + """ + + graph = MarkovChainGraphUndirectedUnweighted() + + for node1, node2, probability in transitions: + graph.add_transition_probability(node1, node2, probability) + + visited = Counter(graph.get_nodes()) + node = start + + for _ in range(steps): + node = graph.transition(node) + visited[node] += 1 + + return visited + + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/graphs/minimum_spanning_tree_boruvka.py b/python-mega-algo/graphs/minimum_spanning_tree_boruvka.py new file mode 100644 index 00000000..f73d0759 --- /dev/null +++ b/python-mega-algo/graphs/minimum_spanning_tree_boruvka.py @@ -0,0 +1,196 @@ +class Graph: + """ + Data structure to store graphs (based on adjacency lists) + """ + + def __init__(self): + + self.num_vertices = 0 + self.num_edges = 0 + self.adjacency = {} + + def add_vertex(self, vertex): + """ + Adds a vertex to the graph + + """ + if vertex not in self.adjacency: + self.adjacency[vertex] = {} + self.num_vertices += 1 + + def add_edge(self, head, tail, weight): + """ + Adds an edge to the graph + + """ + + self.add_vertex(head) + self.add_vertex(tail) + + if head == tail: + return + + self.adjacency[head][tail] = weight + self.adjacency[tail][head] = weight + + def distinct_weight(self): + """ + For Boruvks's algorithm the weights should be distinct + Converts the weights to be distinct + + """ + edges = self.get_edges() + for edge in edges: + head, tail, weight = edge + edges.remove((tail, head, weight)) + for i in range(len(edges)): + edges[i] = list(edges[i]) + + edges.sort(key=lambda e: e[2]) + for i in range(len(edges) - 1): + if edges[i][2] >= edges[i + 1][2]: + edges[i + 1][2] = edges[i][2] + 1 + for edge in edges: + head, tail, weight = edge + self.adjacency[head][tail] = weight + self.adjacency[tail][head] = weight + + def __str__(self): + """ + Returns string representation of the graph + """ + string = "" + for tail in self.adjacency: + for head in self.adjacency[tail]: + weight = self.adjacency[head][tail] + string += "%d -> %d == %d\n" % (head, tail, weight) + return string.rstrip("\n") + + def get_edges(self): + """ + Returna all edges in the graph + """ + output = [] + for tail in self.adjacency: + for head in self.adjacency[tail]: + output.append((tail, head, self.adjacency[head][tail])) + return output + + def get_vertices(self): + """ + Returns all vertices in the graph + """ + return self.adjacency.keys() + + @staticmethod + def build(vertices=None, edges=None): + """ + Builds a graph from the given set of vertices and edges + + """ + g = Graph() + if vertices is None: + vertices = [] + if edges is None: + edge = [] + for vertex in vertices: + g.add_vertex(vertex) + for edge in edges: + g.add_edge(*edge) + return g + + class UnionFind: + """ + Disjoint set Union and Find for Boruvka's algorithm + """ + + def __init__(self): + self.parent = {} + self.rank = {} + + def __len__(self): + return len(self.parent) + + def make_set(self, item): + if item in self.parent: + return self.find(item) + + self.parent[item] = item + self.rank[item] = 0 + return item + + def find(self, item): + if item not in self.parent: + return self.make_set(item) + if item != self.parent[item]: + self.parent[item] = self.find(self.parent[item]) + return self.parent[item] + + def union(self, item1, item2): + root1 = self.find(item1) + root2 = self.find(item2) + + if root1 == root2: + return root1 + + if self.rank[root1] > self.rank[root2]: + self.parent[root2] = root1 + return root1 + + if self.rank[root1] < self.rank[root2]: + self.parent[root1] = root2 + return root2 + + if self.rank[root1] == self.rank[root2]: + self.rank[root1] += 1 + self.parent[root2] = root1 + return root1 + + @staticmethod + def boruvka_mst(graph): + """ + Implementation of Boruvka's algorithm + >>> g = Graph() + >>> g = Graph.build([0, 1, 2, 3], [[0, 1, 1], [0, 2, 1],[2, 3, 1]]) + >>> g.distinct_weight() + >>> bg = Graph.boruvka_mst(g) + >>> print(bg) + 1 -> 0 == 1 + 2 -> 0 == 2 + 0 -> 1 == 1 + 0 -> 2 == 2 + 3 -> 2 == 3 + 2 -> 3 == 3 + """ + num_components = graph.num_vertices + + union_find = Graph.UnionFind() + mst_edges = [] + while num_components > 1: + cheap_edge = {} + for vertex in graph.get_vertices(): + cheap_edge[vertex] = -1 + + edges = graph.get_edges() + for edge in edges: + head, tail, weight = edge + edges.remove((tail, head, weight)) + for edge in edges: + head, tail, weight = edge + set1 = union_find.find(head) + set2 = union_find.find(tail) + if set1 != set2: + if cheap_edge[set1] == -1 or cheap_edge[set1][2] > weight: + cheap_edge[set1] = [head, tail, weight] + + if cheap_edge[set2] == -1 or cheap_edge[set2][2] > weight: + cheap_edge[set2] = [head, tail, weight] + for vertex in cheap_edge: + if cheap_edge[vertex] != -1: + head, tail, weight = cheap_edge[vertex] + if union_find.find(head) != union_find.find(tail): + union_find.union(head, tail) + mst_edges.append(cheap_edge[vertex]) + num_components = num_components - 1 + mst = Graph.build(edges=mst_edges) + return mst diff --git a/python-mega-algo/graphs/minimum_spanning_tree_kruskal.py b/python-mega-algo/graphs/minimum_spanning_tree_kruskal.py new file mode 100644 index 00000000..a51f9703 --- /dev/null +++ b/python-mega-algo/graphs/minimum_spanning_tree_kruskal.py @@ -0,0 +1,47 @@ +from typing import List, Tuple + + +def kruskal(num_nodes: int, num_edges: int, edges: List[Tuple[int, int, int]]) -> int: + """ + >>> kruskal(4, 3, [(0, 1, 3), (1, 2, 5), (2, 3, 1)]) + [(2, 3, 1), (0, 1, 3), (1, 2, 5)] + + >>> kruskal(4, 5, [(0, 1, 3), (1, 2, 5), (2, 3, 1), (0, 2, 1), (0, 3, 2)]) + [(2, 3, 1), (0, 2, 1), (0, 1, 3)] + + >>> kruskal(4, 6, [(0, 1, 3), (1, 2, 5), (2, 3, 1), (0, 2, 1), (0, 3, 2), + ... (2, 1, 1)]) + [(2, 3, 1), (0, 2, 1), (2, 1, 1)] + """ + edges = sorted(edges, key=lambda edge: edge[2]) + + parent = list(range(num_nodes)) + + def find_parent(i): + if i != parent[i]: + parent[i] = find_parent(parent[i]) + return parent[i] + + minimum_spanning_tree_cost = 0 + minimum_spanning_tree = [] + + for edge in edges: + parent_a = find_parent(edge[0]) + parent_b = find_parent(edge[1]) + if parent_a != parent_b: + minimum_spanning_tree_cost += edge[2] + minimum_spanning_tree.append(edge) + parent[parent_a] = parent_b + + return minimum_spanning_tree + + +if __name__ == "__main__": # pragma: no cover + num_nodes, num_edges = list(map(int, input().strip().split())) + edges = [] + + for _ in range(num_edges): + node1, node2, cost = [int(x) for x in input().strip().split()] + edges.append((node1, node2, cost)) + + kruskal(num_nodes, num_edges, edges) diff --git a/python-mega-algo/graphs/minimum_spanning_tree_kruskal2.py b/python-mega-algo/graphs/minimum_spanning_tree_kruskal2.py new file mode 100644 index 00000000..dfb87efe --- /dev/null +++ b/python-mega-algo/graphs/minimum_spanning_tree_kruskal2.py @@ -0,0 +1,109 @@ +from __future__ import annotations + + +class DisjointSetTreeNode: + # Disjoint Set Node to store the parent and rank + def __init__(self, key: int) -> None: + self.key = key + self.parent = self + self.rank = 0 + + +class DisjointSetTree: + # Disjoint Set DataStructure + def __init__(self): + # map from node name to the node object + self.map = {} + + def make_set(self, x: int) -> None: + # create a new set with x as its member + self.map[x] = DisjointSetTreeNode(x) + + def find_set(self, x: int) -> DisjointSetTreeNode: + # find the set x belongs to (with path-compression) + elem_ref = self.map[x] + if elem_ref != elem_ref.parent: + elem_ref.parent = self.find_set(elem_ref.parent.key) + return elem_ref.parent + + def link(self, x: int, y: int) -> None: + # helper function for union operation + if x.rank > y.rank: + y.parent = x + else: + x.parent = y + if x.rank == y.rank: + y.rank += 1 + + def union(self, x: int, y: int) -> None: + # merge 2 disjoint sets + self.link(self.find_set(x), self.find_set(y)) + + +class GraphUndirectedWeighted: + def __init__(self): + # connections: map from the node to the neighbouring nodes (with weights) + self.connections = {} + + def add_node(self, node: int) -> None: + # add a node ONLY if its not present in the graph + if node not in self.connections: + self.connections[node] = {} + + def add_edge(self, node1: int, node2: int, weight: int) -> None: + # add an edge with the given weight + self.add_node(node1) + self.add_node(node2) + self.connections[node1][node2] = weight + self.connections[node2][node1] = weight + + def kruskal(self) -> GraphUndirectedWeighted: + # Kruskal's Algorithm to generate a Minimum Spanning Tree (MST) of a graph + """ + Details: https://en.wikipedia.org/wiki/Kruskal%27s_algorithm + + Example: + + >>> graph = GraphUndirectedWeighted() + >>> graph.add_edge(1, 2, 1) + >>> graph.add_edge(2, 3, 2) + >>> graph.add_edge(3, 4, 1) + >>> graph.add_edge(3, 5, 100) # Removed in MST + >>> graph.add_edge(4, 5, 5) + >>> assert 5 in graph.connections[3] + >>> mst = graph.kruskal() + >>> assert 5 not in mst.connections[3] + """ + + # getting the edges in ascending order of weights + edges = [] + seen = set() + for start in self.connections: + for end in self.connections[start]: + if (start, end) not in seen: + seen.add((end, start)) + edges.append((start, end, self.connections[start][end])) + edges.sort(key=lambda x: x[2]) + # creating the disjoint set + disjoint_set = DisjointSetTree() + [disjoint_set.make_set(node) for node in self.connections] + # MST generation + num_edges = 0 + index = 0 + graph = GraphUndirectedWeighted() + while num_edges < len(self.connections) - 1: + u, v, w = edges[index] + index += 1 + parentu = disjoint_set.find_set(u) + parentv = disjoint_set.find_set(v) + if parentu != parentv: + num_edges += 1 + graph.add_edge(u, v, w) + disjoint_set.union(u, v) + return graph + + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/graphs/minimum_spanning_tree_prims.py b/python-mega-algo/graphs/minimum_spanning_tree_prims.py new file mode 100644 index 00000000..16b42861 --- /dev/null +++ b/python-mega-algo/graphs/minimum_spanning_tree_prims.py @@ -0,0 +1,116 @@ +import sys +from collections import defaultdict + + +def PrimsAlgorithm(l): # noqa: E741 + + nodePosition = [] + + def get_position(vertex): + return nodePosition[vertex] + + def set_position(vertex, pos): + nodePosition[vertex] = pos + + def top_to_bottom(heap, start, size, positions): + if start > size // 2 - 1: + return + else: + if 2 * start + 2 >= size: + m = 2 * start + 1 + else: + if heap[2 * start + 1] < heap[2 * start + 2]: + m = 2 * start + 1 + else: + m = 2 * start + 2 + if heap[m] < heap[start]: + temp, temp1 = heap[m], positions[m] + heap[m], positions[m] = heap[start], positions[start] + heap[start], positions[start] = temp, temp1 + + temp = get_position(positions[m]) + set_position(positions[m], get_position(positions[start])) + set_position(positions[start], temp) + + top_to_bottom(heap, m, size, positions) + + # Update function if value of any node in min-heap decreases + def bottom_to_top(val, index, heap, position): + temp = position[index] + + while index != 0: + if index % 2 == 0: + parent = int((index - 2) / 2) + else: + parent = int((index - 1) / 2) + + if val < heap[parent]: + heap[index] = heap[parent] + position[index] = position[parent] + set_position(position[parent], index) + else: + heap[index] = val + position[index] = temp + set_position(temp, index) + break + index = parent + else: + heap[0] = val + position[0] = temp + set_position(temp, 0) + + def heapify(heap, positions): + start = len(heap) // 2 - 1 + for i in range(start, -1, -1): + top_to_bottom(heap, i, len(heap), positions) + + def deleteMinimum(heap, positions): + temp = positions[0] + heap[0] = sys.maxsize + top_to_bottom(heap, 0, len(heap), positions) + return temp + + visited = [0 for i in range(len(l))] + Nbr_TV = [-1 for i in range(len(l))] # Neighboring Tree Vertex of selected vertex + # Minimum Distance of explored vertex with neighboring vertex of partial tree + # formed in graph + Distance_TV = [] # Heap of Distance of vertices from their neighboring vertex + Positions = [] + + for x in range(len(l)): + p = sys.maxsize + Distance_TV.append(p) + Positions.append(x) + nodePosition.append(x) + + TreeEdges = [] + visited[0] = 1 + Distance_TV[0] = sys.maxsize + for x in l[0]: + Nbr_TV[x[0]] = 0 + Distance_TV[x[0]] = x[1] + heapify(Distance_TV, Positions) + + for i in range(1, len(l)): + vertex = deleteMinimum(Distance_TV, Positions) + if visited[vertex] == 0: + TreeEdges.append((Nbr_TV[vertex], vertex)) + visited[vertex] = 1 + for v in l[vertex]: + if visited[v[0]] == 0 and v[1] < Distance_TV[get_position(v[0])]: + Distance_TV[get_position(v[0])] = v[1] + bottom_to_top(v[1], get_position(v[0]), Distance_TV, Positions) + Nbr_TV[v[0]] = vertex + return TreeEdges + + +if __name__ == "__main__": # pragma: no cover + # < --------- Prims Algorithm --------- > + n = int(input("Enter number of vertices: ").strip()) + e = int(input("Enter number of edges: ").strip()) + adjlist = defaultdict(list) + for x in range(e): + l = [int(x) for x in input().strip().split()] # noqa: E741 + adjlist[l[0]].append([l[1], l[2]]) + adjlist[l[1]].append([l[0], l[2]]) + print(PrimsAlgorithm(adjlist)) diff --git a/python-mega-algo/graphs/minimum_spanning_tree_prims2.py b/python-mega-algo/graphs/minimum_spanning_tree_prims2.py new file mode 100644 index 00000000..10ed736c --- /dev/null +++ b/python-mega-algo/graphs/minimum_spanning_tree_prims2.py @@ -0,0 +1,271 @@ +""" +Prim's (also known as Jarník's) algorithm is a greedy algorithm that finds a minimum +spanning tree for a weighted undirected graph. This means it finds a subset of the +edges that forms a tree that includes every vertex, where the total weight of all the +edges in the tree is minimized. The algorithm operates by building this tree one vertex +at a time, from an arbitrary starting vertex, at each step adding the cheapest possible +connection from the tree to another vertex. +""" + +from sys import maxsize +from typing import Dict, Optional, Tuple, Union + + +def get_parent_position(position: int) -> int: + """ + heap helper function get the position of the parent of the current node + + >>> get_parent_position(1) + 0 + >>> get_parent_position(2) + 0 + """ + return (position - 1) // 2 + + +def get_child_left_position(position: int) -> int: + """ + heap helper function get the position of the left child of the current node + + >>> get_child_left_position(0) + 1 + """ + return (2 * position) + 1 + + +def get_child_right_position(position: int) -> int: + """ + heap helper function get the position of the right child of the current node + + >>> get_child_right_position(0) + 2 + """ + return (2 * position) + 2 + + +class MinPriorityQueue: + """ + Minimum Priority Queue Class + + Functions: + is_empty: function to check if the priority queue is empty + push: function to add an element with given priority to the queue + extract_min: function to remove and return the element with lowest weight (highest + priority) + update_key: function to update the weight of the given key + _bubble_up: helper function to place a node at the proper position (upward + movement) + _bubble_down: helper function to place a node at the proper position (downward + movement) + _swap_nodes: helper function to swap the nodes at the given positions + + >>> queue = MinPriorityQueue() + + >>> queue.push(1, 1000) + >>> queue.push(2, 100) + >>> queue.push(3, 4000) + >>> queue.push(4, 3000) + + >>> print(queue.extract_min()) + 2 + + >>> queue.update_key(4, 50) + + >>> print(queue.extract_min()) + 4 + >>> print(queue.extract_min()) + 1 + >>> print(queue.extract_min()) + 3 + """ + + def __init__(self) -> None: + self.heap = [] + self.position_map = {} + self.elements = 0 + + def __len__(self) -> int: + return self.elements + + def __repr__(self) -> str: + return str(self.heap) + + def is_empty(self) -> bool: + # Check if the priority queue is empty + return self.elements == 0 + + def push(self, elem: Union[int, str], weight: int) -> None: + # Add an element with given priority to the queue + self.heap.append((elem, weight)) + self.position_map[elem] = self.elements + self.elements += 1 + self._bubble_up(elem) + + def extract_min(self) -> Union[int, str]: + # Remove and return the element with lowest weight (highest priority) + if self.elements > 1: + self._swap_nodes(0, self.elements - 1) + elem, _ = self.heap.pop() + del self.position_map[elem] + self.elements -= 1 + if self.elements > 0: + bubble_down_elem, _ = self.heap[0] + self._bubble_down(bubble_down_elem) + return elem + + def update_key(self, elem: Union[int, str], weight: int) -> None: + # Update the weight of the given key + position = self.position_map[elem] + self.heap[position] = (elem, weight) + if position > 0: + parent_position = get_parent_position(position) + _, parent_weight = self.heap[parent_position] + if parent_weight > weight: + self._bubble_up(elem) + else: + self._bubble_down(elem) + else: + self._bubble_down(elem) + + def _bubble_up(self, elem: Union[int, str]) -> None: + # Place a node at the proper position (upward movement) [to be used internally + # only] + curr_pos = self.position_map[elem] + if curr_pos == 0: + return + parent_position = get_parent_position(curr_pos) + _, weight = self.heap[curr_pos] + _, parent_weight = self.heap[parent_position] + if parent_weight > weight: + self._swap_nodes(parent_position, curr_pos) + return self._bubble_up(elem) + return + + def _bubble_down(self, elem: Union[int, str]) -> None: + # Place a node at the proper position (downward movement) [to be used + # internally only] + curr_pos = self.position_map[elem] + _, weight = self.heap[curr_pos] + child_left_position = get_child_left_position(curr_pos) + child_right_position = get_child_right_position(curr_pos) + if child_left_position < self.elements and child_right_position < self.elements: + _, child_left_weight = self.heap[child_left_position] + _, child_right_weight = self.heap[child_right_position] + if child_right_weight < child_left_weight: + if child_right_weight < weight: + self._swap_nodes(child_right_position, curr_pos) + return self._bubble_down(elem) + if child_left_position < self.elements: + _, child_left_weight = self.heap[child_left_position] + if child_left_weight < weight: + self._swap_nodes(child_left_position, curr_pos) + return self._bubble_down(elem) + else: + return + if child_right_position < self.elements: + _, child_right_weight = self.heap[child_right_position] + if child_right_weight < weight: + self._swap_nodes(child_right_position, curr_pos) + return self._bubble_down(elem) + else: + return + + def _swap_nodes(self, node1_pos: int, node2_pos: int) -> None: + # Swap the nodes at the given positions + node1_elem = self.heap[node1_pos][0] + node2_elem = self.heap[node2_pos][0] + self.heap[node1_pos], self.heap[node2_pos] = ( + self.heap[node2_pos], + self.heap[node1_pos], + ) + self.position_map[node1_elem] = node2_pos + self.position_map[node2_elem] = node1_pos + + +class GraphUndirectedWeighted: + """ + Graph Undirected Weighted Class + + Functions: + add_node: function to add a node in the graph + add_edge: function to add an edge between 2 nodes in the graph + """ + + def __init__(self) -> None: + self.connections = {} + self.nodes = 0 + + def __repr__(self) -> str: + return str(self.connections) + + def __len__(self) -> int: + return self.nodes + + def add_node(self, node: Union[int, str]) -> None: + # Add a node in the graph if it is not in the graph + if node not in self.connections: + self.connections[node] = {} + self.nodes += 1 + + def add_edge( + self, node1: Union[int, str], node2: Union[int, str], weight: int + ) -> None: + # Add an edge between 2 nodes in the graph + self.add_node(node1) + self.add_node(node2) + self.connections[node1][node2] = weight + self.connections[node2][node1] = weight + + +def prims_algo( + graph: GraphUndirectedWeighted, +) -> Tuple[Dict[str, int], Dict[str, Optional[str]]]: + """ + >>> graph = GraphUndirectedWeighted() + + >>> graph.add_edge("a", "b", 3) + >>> graph.add_edge("b", "c", 10) + >>> graph.add_edge("c", "d", 5) + >>> graph.add_edge("a", "c", 15) + >>> graph.add_edge("b", "d", 100) + + >>> dist, parent = prims_algo(graph) + + >>> abs(dist["a"] - dist["b"]) + 3 + >>> abs(dist["d"] - dist["b"]) + 15 + >>> abs(dist["a"] - dist["c"]) + 13 + """ + # prim's algorithm for minimum spanning tree + dist = {node: maxsize for node in graph.connections} + parent = {node: None for node in graph.connections} + priority_queue = MinPriorityQueue() + [priority_queue.push(node, weight) for node, weight in dist.items()] + if priority_queue.is_empty(): + return dist, parent + + # initialization + node = priority_queue.extract_min() + dist[node] = 0 + for neighbour in graph.connections[node]: + if dist[neighbour] > dist[node] + graph.connections[node][neighbour]: + dist[neighbour] = dist[node] + graph.connections[node][neighbour] + priority_queue.update_key(neighbour, dist[neighbour]) + parent[neighbour] = node + # running prim's algorithm + while not priority_queue.is_empty(): + node = priority_queue.extract_min() + for neighbour in graph.connections[node]: + if dist[neighbour] > dist[node] + graph.connections[node][neighbour]: + dist[neighbour] = dist[node] + graph.connections[node][neighbour] + priority_queue.update_key(neighbour, dist[neighbour]) + parent[neighbour] = node + return dist, parent + + +if __name__ == "__main__": + from doctest import testmod + + testmod() diff --git a/python-mega-algo/graphs/multi_heuristic_astar.py b/python-mega-algo/graphs/multi_heuristic_astar.py new file mode 100644 index 00000000..77ca5760 --- /dev/null +++ b/python-mega-algo/graphs/multi_heuristic_astar.py @@ -0,0 +1,313 @@ +import heapq + +import numpy as np + + +class PriorityQueue: + def __init__(self): + self.elements = [] + self.set = set() + + def minkey(self): + if not self.empty(): + return self.elements[0][0] + else: + return float("inf") + + def empty(self): + return len(self.elements) == 0 + + def put(self, item, priority): + if item not in self.set: + heapq.heappush(self.elements, (priority, item)) + self.set.add(item) + else: + # update + # print("update", item) + temp = [] + (pri, x) = heapq.heappop(self.elements) + while x != item: + temp.append((pri, x)) + (pri, x) = heapq.heappop(self.elements) + temp.append((priority, item)) + for (pro, xxx) in temp: + heapq.heappush(self.elements, (pro, xxx)) + + def remove_element(self, item): + if item in self.set: + self.set.remove(item) + temp = [] + (pro, x) = heapq.heappop(self.elements) + while x != item: + temp.append((pro, x)) + (pro, x) = heapq.heappop(self.elements) + for (prito, yyy) in temp: + heapq.heappush(self.elements, (prito, yyy)) + + def top_show(self): + return self.elements[0][1] + + def get(self): + (priority, item) = heapq.heappop(self.elements) + self.set.remove(item) + return (priority, item) + + +def consistent_heuristic(P, goal): + # euclidean distance + a = np.array(P) + b = np.array(goal) + return np.linalg.norm(a - b) + + +def heuristic_2(P, goal): + # integer division by time variable + return consistent_heuristic(P, goal) // t + + +def heuristic_1(P, goal): + # manhattan distance + return abs(P[0] - goal[0]) + abs(P[1] - goal[1]) + + +def key(start, i, goal, g_function): + ans = g_function[start] + W1 * heuristics[i](start, goal) + return ans + + +def do_something(back_pointer, goal, start): + grid = np.chararray((n, n)) + for i in range(n): + for j in range(n): + grid[i][j] = "*" + + for i in range(n): + for j in range(n): + if (j, (n - 1) - i) in blocks: + grid[i][j] = "#" + + grid[0][(n - 1)] = "-" + x = back_pointer[goal] + while x != start: + (x_c, y_c) = x + # print(x) + grid[(n - 1) - y_c][x_c] = "-" + x = back_pointer[x] + grid[(n - 1)][0] = "-" + + for i in range(n): + for j in range(n): + if (i, j) == (0, n - 1): + print(grid[i][j], end=" ") + print("<-- End position", end=" ") + else: + print(grid[i][j], end=" ") + print() + print("^") + print("Start position") + print() + print("# is an obstacle") + print("- is the path taken by algorithm") + print("PATH TAKEN BY THE ALGORITHM IS:-") + x = back_pointer[goal] + while x != start: + print(x, end=" ") + x = back_pointer[x] + print(x) + quit() + + +def valid(p): + if p[0] < 0 or p[0] > n - 1: + return False + if p[1] < 0 or p[1] > n - 1: + return False + return True + + +def expand_state( + s, + j, + visited, + g_function, + close_list_anchor, + close_list_inad, + open_list, + back_pointer, +): + for itera in range(n_heuristic): + open_list[itera].remove_element(s) + # print("s", s) + # print("j", j) + (x, y) = s + left = (x - 1, y) + right = (x + 1, y) + up = (x, y + 1) + down = (x, y - 1) + + for neighbours in [left, right, up, down]: + if neighbours not in blocks: + if valid(neighbours) and neighbours not in visited: + # print("neighbour", neighbours) + visited.add(neighbours) + back_pointer[neighbours] = -1 + g_function[neighbours] = float("inf") + + if valid(neighbours) and g_function[neighbours] > g_function[s] + 1: + g_function[neighbours] = g_function[s] + 1 + back_pointer[neighbours] = s + if neighbours not in close_list_anchor: + open_list[0].put(neighbours, key(neighbours, 0, goal, g_function)) + if neighbours not in close_list_inad: + for var in range(1, n_heuristic): + if key(neighbours, var, goal, g_function) <= W2 * key( + neighbours, 0, goal, g_function + ): + open_list[j].put( + neighbours, key(neighbours, var, goal, g_function) + ) + + +def make_common_ground(): + some_list = [] + for x in range(1, 5): + for y in range(1, 6): + some_list.append((x, y)) + + for x in range(15, 20): + some_list.append((x, 17)) + + for x in range(10, 19): + for y in range(1, 15): + some_list.append((x, y)) + + # L block + for x in range(1, 4): + for y in range(12, 19): + some_list.append((x, y)) + for x in range(3, 13): + for y in range(16, 19): + some_list.append((x, y)) + return some_list + + +heuristics = {0: consistent_heuristic, 1: heuristic_1, 2: heuristic_2} + +blocks_blk = [ + (0, 1), + (1, 1), + (2, 1), + (3, 1), + (4, 1), + (5, 1), + (6, 1), + (7, 1), + (8, 1), + (9, 1), + (10, 1), + (11, 1), + (12, 1), + (13, 1), + (14, 1), + (15, 1), + (16, 1), + (17, 1), + (18, 1), + (19, 1), +] +blocks_no = [] +blocks_all = make_common_ground() + + +blocks = blocks_blk +# hyper parameters +W1 = 1 +W2 = 1 +n = 20 +n_heuristic = 3 # one consistent and two other inconsistent + +# start and end destination +start = (0, 0) +goal = (n - 1, n - 1) + +t = 1 + + +def multi_a_star(start, goal, n_heuristic): + g_function = {start: 0, goal: float("inf")} + back_pointer = {start: -1, goal: -1} + open_list = [] + visited = set() + + for i in range(n_heuristic): + open_list.append(PriorityQueue()) + open_list[i].put(start, key(start, i, goal, g_function)) + + close_list_anchor = [] + close_list_inad = [] + while open_list[0].minkey() < float("inf"): + for i in range(1, n_heuristic): + # print(open_list[0].minkey(), open_list[i].minkey()) + if open_list[i].minkey() <= W2 * open_list[0].minkey(): + global t + t += 1 + if g_function[goal] <= open_list[i].minkey(): + if g_function[goal] < float("inf"): + do_something(back_pointer, goal, start) + else: + _, get_s = open_list[i].top_show() + visited.add(get_s) + expand_state( + get_s, + i, + visited, + g_function, + close_list_anchor, + close_list_inad, + open_list, + back_pointer, + ) + close_list_inad.append(get_s) + else: + if g_function[goal] <= open_list[0].minkey(): + if g_function[goal] < float("inf"): + do_something(back_pointer, goal, start) + else: + get_s = open_list[0].top_show() + visited.add(get_s) + expand_state( + get_s, + 0, + visited, + g_function, + close_list_anchor, + close_list_inad, + open_list, + back_pointer, + ) + close_list_anchor.append(get_s) + print("No path found to goal") + print() + for i in range(n - 1, -1, -1): + for j in range(n): + if (j, i) in blocks: + print("#", end=" ") + elif (j, i) in back_pointer: + if (j, i) == (n - 1, n - 1): + print("*", end=" ") + else: + print("-", end=" ") + else: + print("*", end=" ") + if (j, i) == (n - 1, n - 1): + print("<-- End position", end=" ") + print() + print("^") + print("Start position") + print() + print("# is an obstacle") + print("- is the path taken by algorithm") + + +if __name__ == "__main__": + multi_a_star(start, goal, n_heuristic) diff --git a/python-mega-algo/graphs/page_rank.py b/python-mega-algo/graphs/page_rank.py new file mode 100644 index 00000000..0f512914 --- /dev/null +++ b/python-mega-algo/graphs/page_rank.py @@ -0,0 +1,70 @@ +""" +Author: https://github.com/bhushan-borole +""" +""" +The input graph for the algorithm is: + + A B C +A 0 1 1 +B 0 0 1 +C 1 0 0 + +""" + +graph = [[0, 1, 1], [0, 0, 1], [1, 0, 0]] + + +class Node: + def __init__(self, name): + self.name = name + self.inbound = [] + self.outbound = [] + + def add_inbound(self, node): + self.inbound.append(node) + + def add_outbound(self, node): + self.outbound.append(node) + + def __repr__(self): + return f"Node {self.name}: Inbound: {self.inbound} ; Outbound: {self.outbound}" + + +def page_rank(nodes, limit=3, d=0.85): + ranks = {} + for node in nodes: + ranks[node.name] = 1 + + outbounds = {} + for node in nodes: + outbounds[node.name] = len(node.outbound) + + for i in range(limit): + print(f"======= Iteration {i + 1} =======") + for j, node in enumerate(nodes): + ranks[node.name] = (1 - d) + d * sum( + [ranks[ib] / outbounds[ib] for ib in node.inbound] + ) + print(ranks) + + +def main(): + names = list(input("Enter Names of the Nodes: ").split()) + + nodes = [Node(name) for name in names] + + for ri, row in enumerate(graph): + for ci, col in enumerate(row): + if col == 1: + nodes[ci].add_inbound(names[ri]) + nodes[ri].add_outbound(names[ci]) + + print("======= Nodes =======") + for node in nodes: + print(node) + + page_rank(nodes) + + +if __name__ == "__main__": + main() diff --git a/python-mega-algo/graphs/prim.py b/python-mega-algo/graphs/prim.py new file mode 100644 index 00000000..70329da7 --- /dev/null +++ b/python-mega-algo/graphs/prim.py @@ -0,0 +1,152 @@ +"""Prim's Algorithm. + + Determines the minimum spanning tree(MST) of a graph using the Prim's Algorithm. + + Details: https://en.wikipedia.org/wiki/Prim%27s_algorithm +""" + +import heapq as hq +import math +from typing import Iterator + + +class Vertex: + """Class Vertex.""" + + def __init__(self, id): + """ + Arguments: + id - input an id to identify the vertex + Attributes: + neighbors - a list of the vertices it is linked to + edges - a dict to store the edges's weight + """ + self.id = str(id) + self.key = None + self.pi = None + self.neighbors = [] + self.edges = {} # {vertex:distance} + + def __lt__(self, other): + """Comparison rule to < operator.""" + return self.key < other.key + + def __repr__(self): + """Return the vertex id.""" + return self.id + + def add_neighbor(self, vertex): + """Add a pointer to a vertex at neighbor's list.""" + self.neighbors.append(vertex) + + def add_edge(self, vertex, weight): + """Destination vertex and weight.""" + self.edges[vertex.id] = weight + + +def connect(graph, a, b, edge): + # add the neighbors: + graph[a - 1].add_neighbor(graph[b - 1]) + graph[b - 1].add_neighbor(graph[a - 1]) + # add the edges: + graph[a - 1].add_edge(graph[b - 1], edge) + graph[b - 1].add_edge(graph[a - 1], edge) + + +def prim(graph: list, root: Vertex) -> list: + """Prim's Algorithm. + + Runtime: + O(mn) with `m` edges and `n` vertices + + Return: + List with the edges of a Minimum Spanning Tree + + Usage: + prim(graph, graph[0]) + """ + a = [] + for u in graph: + u.key = math.inf + u.pi = None + root.key = 0 + q = graph[:] + while q: + u = min(q) + q.remove(u) + for v in u.neighbors: + if (v in q) and (u.edges[v.id] < v.key): + v.pi = u + v.key = u.edges[v.id] + for i in range(1, len(graph)): + a.append((int(graph[i].id) + 1, int(graph[i].pi.id) + 1)) + return a + + +def prim_heap(graph: list, root: Vertex) -> Iterator[tuple]: + """Prim's Algorithm with min heap. + + Runtime: + O((m + n)log n) with `m` edges and `n` vertices + + Yield: + Edges of a Minimum Spanning Tree + + Usage: + prim(graph, graph[0]) + """ + for u in graph: + u.key = math.inf + u.pi = None + root.key = 0 + + h = list(graph) + hq.heapify(h) + + while h: + u = hq.heappop(h) + for v in u.neighbors: + if (v in h) and (u.edges[v.id] < v.key): + v.pi = u + v.key = u.edges[v.id] + hq.heapify(h) + + for i in range(1, len(graph)): + yield (int(graph[i].id) + 1, int(graph[i].pi.id) + 1) + + +def test_vector() -> None: + """ + # Creates a list to store x vertices. + >>> x = 5 + >>> G = [Vertex(n) for n in range(x)] + + >>> connect(G, 1, 2, 15) + >>> connect(G, 1, 3, 12) + >>> connect(G, 2, 4, 13) + >>> connect(G, 2, 5, 5) + >>> connect(G, 3, 2, 6) + >>> connect(G, 3, 4, 6) + >>> connect(G, 0, 0, 0) # Generate the minimum spanning tree: + >>> G_heap = G[:] + >>> MST = prim(G, G[0]) + >>> MST_heap = prim_heap(G, G[0]) + >>> for i in MST: + ... print(i) + (2, 3) + (3, 1) + (4, 3) + (5, 2) + >>> for i in MST_heap: + ... print(i) + (2, 3) + (3, 1) + (4, 3) + (5, 2) + """ + + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/graphs/right.html b/python-mega-algo/graphs/right.html new file mode 100644 index 00000000..6babfcca --- /dev/null +++ b/python-mega-algo/graphs/right.html @@ -0,0 +1,40 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/graphs + + + + + + + + +
    Folders
    <Go Back> tests
    +
    + + + + + + + + + + + + + + + +
    FileFileFileFile
    articulat...nts.py check_bip...dfs.py finding_bridges.py minimum_s...vka.py 
    a_star.py connected...nts.py frequent_...ner.py minimum_s...kal.py 
    basic_graphs.py depth_fir...rch.py gale_shap...aph.py minimum_s...al2.py 
    bellman_ford.py depth_fir...h_2.py graphs_fl...all.py minimum_s...ims.py 
    bfs_short...ath.py dijkstra.py graph_list.py minimum_s...ms2.py 
    bfs_zero_...ath.py dijkstra_2.py graph_matrix.py multi_heu...tar.py 
    bidirecti...tar.py dijkstra_...thm.py greedy_be...rst.py page_rank.py 
    bidirecti...rch.py dinic.py g_topolog...ort.py prim.py 
    breadth_f...rch.py directed_...aph.py kahns_alg...ong.py scc_kosaraju.py 
    breadth_f...h_2.py edmonds_k...ink.py kahns_alg...opo.py strongly_...nts.py 
    breadth_f...ath.py eulerian_...aph.py karger.py tarjans_scc.py 
    check_bip...bfs.py even_tree.py markov_chain.py __init__.py 
    + +

    +Folders: 2
    +Files: 48
    +Size of all files: 164863 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/graphs/scc_kosaraju.py b/python-mega-algo/graphs/scc_kosaraju.py new file mode 100644 index 00000000..573c1bf5 --- /dev/null +++ b/python-mega-algo/graphs/scc_kosaraju.py @@ -0,0 +1,51 @@ +def dfs(u): + global g, r, scc, component, visit, stack + if visit[u]: + return + visit[u] = True + for v in g[u]: + dfs(v) + stack.append(u) + + +def dfs2(u): + global g, r, scc, component, visit, stack + if visit[u]: + return + visit[u] = True + component.append(u) + for v in r[u]: + dfs2(v) + + +def kosaraju(): + global g, r, scc, component, visit, stack + for i in range(n): + dfs(i) + visit = [False] * n + for i in stack[::-1]: + if visit[i]: + continue + component = [] + dfs2(i) + scc.append(component) + return scc + + +if __name__ == "__main__": + # n - no of nodes, m - no of edges + n, m = list(map(int, input().strip().split())) + + g = [[] for i in range(n)] # graph + r = [[] for i in range(n)] # reversed graph + # input graph data (edges) + for i in range(m): + u, v = list(map(int, input().strip().split())) + g[u].append(v) + r[v].append(u) + + stack = [] + visit = [False] * n + scc = [] + component = [] + print(kosaraju()) diff --git a/python-mega-algo/graphs/strongly_connected_components.py b/python-mega-algo/graphs/strongly_connected_components.py new file mode 100644 index 00000000..d469df0c --- /dev/null +++ b/python-mega-algo/graphs/strongly_connected_components.py @@ -0,0 +1,92 @@ +""" +https://en.wikipedia.org/wiki/Strongly_connected_component + +Finding strongly connected components in directed graph + +""" + +test_graph_1 = {0: [2, 3], 1: [0], 2: [1], 3: [4], 4: []} + +test_graph_2 = {0: [1, 2, 3], 1: [2], 2: [0], 3: [4], 4: [5], 5: [3]} + + +def topology_sort(graph: dict, vert: int, visited: list) -> list: + """ + Use depth first search to sort graph + At this time graph is the same as input + >>> topology_sort(test_graph_1, 0, 5 * [False]) + [1, 2, 4, 3, 0] + >>> topology_sort(test_graph_2, 0, 6 * [False]) + [2, 1, 5, 4, 3, 0] + """ + + visited[vert] = True + order = [] + + for neighbour in graph[vert]: + if not visited[neighbour]: + order += topology_sort(graph, neighbour, visited) + + order.append(vert) + + return order + + +def find_components(reversed_graph: dict, vert: int, visited: list) -> list: + """ + Use depth first search to find strongliy connected + vertices. Now graph is reversed + >>> find_components({0: [1], 1: [2], 2: [0]}, 0, 5 * [False]) + [0, 1, 2] + >>> find_components({0: [2], 1: [0], 2: [0, 1]}, 0, 6 * [False]) + [0, 2, 1] + """ + + visited[vert] = True + component = [vert] + + for neighbour in reversed_graph[vert]: + if not visited[neighbour]: + component += find_components(reversed_graph, neighbour, visited) + + return component + + +def strongly_connected_components(graph: dict) -> list: + """ + This function takes graph as a parameter + and then returns the list of strongly connected components + >>> strongly_connected_components(test_graph_1) + [[0, 1, 2], [3], [4]] + >>> strongly_connected_components(test_graph_2) + [[0, 2, 1], [3, 5, 4]] + """ + + visited = len(graph) * [False] + reversed_graph = {vert: [] for vert in range(len(graph))} + + for vert, neighbours in graph.items(): + for neighbour in neighbours: + reversed_graph[neighbour].append(vert) + + order = [] + for i, was_visited in enumerate(visited): + if not was_visited: + order += topology_sort(graph, i, visited) + + components_list = [] + visited = len(graph) * [False] + + for i in range(len(graph)): + vert = order[len(graph) - i - 1] + if not visited[vert]: + component = find_components(reversed_graph, vert, visited) + components_list.append(component) + + return components_list + + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/graphs/tarjans_scc.py b/python-mega-algo/graphs/tarjans_scc.py new file mode 100644 index 00000000..30f8ca8a --- /dev/null +++ b/python-mega-algo/graphs/tarjans_scc.py @@ -0,0 +1,83 @@ +from collections import deque + + +def tarjan(g): + """ + Tarjan's algo for finding strongly connected components in a directed graph + + Uses two main attributes of each node to track reachability, the index of that node + within a component(index), and the lowest index reachable from that node(lowlink). + + We then perform a dfs of the each component making sure to update these parameters + for each node and saving the nodes we visit on the way. + + If ever we find that the lowest reachable node from a current node is equal to the + index of the current node then it must be the root of a strongly connected + component and so we save it and it's equireachable vertices as a strongly + connected component. + + Complexity: strong_connect() is called at most once for each node and has a + complexity of O(|E|) as it is DFS. + Therefore this has complexity O(|V| + |E|) for a graph G = (V, E) + """ + + n = len(g) + stack = deque() + on_stack = [False for _ in range(n)] + index_of = [-1 for _ in range(n)] + lowlink_of = index_of[:] + + def strong_connect(v, index, components): + index_of[v] = index # the number when this node is seen + lowlink_of[v] = index # lowest rank node reachable from here + index += 1 + stack.append(v) + on_stack[v] = True + + for w in g[v]: + if index_of[w] == -1: + index = strong_connect(w, index, components) + lowlink_of[v] = ( + lowlink_of[w] if lowlink_of[w] < lowlink_of[v] else lowlink_of[v] + ) + elif on_stack[w]: + lowlink_of[v] = ( + lowlink_of[w] if lowlink_of[w] < lowlink_of[v] else lowlink_of[v] + ) + + if lowlink_of[v] == index_of[v]: + component = [] + w = stack.pop() + on_stack[w] = False + component.append(w) + while w != v: + w = stack.pop() + on_stack[w] = False + component.append(w) + components.append(component) + return index + + components = [] + for v in range(n): + if index_of[v] == -1: + strong_connect(v, 0, components) + + return components + + +def create_graph(n, edges): + g = [[] for _ in range(n)] + for u, v in edges: + g[u].append(v) + return g + + +if __name__ == "__main__": + # Test + n_vertices = 7 + source = [0, 0, 1, 2, 3, 3, 4, 4, 6] + target = [1, 3, 2, 0, 1, 4, 5, 6, 5] + edges = [(u, v) for u, v in zip(source, target)] + g = create_graph(n_vertices, edges) + + assert [[5], [6], [4], [3, 2, 1, 0]] == tarjan(g) diff --git a/python-mega-algo/graphs/tests/right.html b/python-mega-algo/graphs/tests/right.html new file mode 100644 index 00000000..2480e0b9 --- /dev/null +++ b/python-mega-algo/graphs/tests/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/graphs/tests + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    test_min_...kal.py test_min_...rim.py 
    + +

    +Folders: 1
    +Files: 2
    +Size of all files: 1696 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/graphs/tests/test_min_spanning_tree_kruskal.py b/python-mega-algo/graphs/tests/test_min_spanning_tree_kruskal.py new file mode 100644 index 00000000..3a527aef --- /dev/null +++ b/python-mega-algo/graphs/tests/test_min_spanning_tree_kruskal.py @@ -0,0 +1,36 @@ +from graphs.minimum_spanning_tree_kruskal import kruskal + + +def test_kruskal_successful_result(): + num_nodes, num_edges = 9, 14 + edges = [ + [0, 1, 4], + [0, 7, 8], + [1, 2, 8], + [7, 8, 7], + [7, 6, 1], + [2, 8, 2], + [8, 6, 6], + [2, 3, 7], + [2, 5, 4], + [6, 5, 2], + [3, 5, 14], + [3, 4, 9], + [5, 4, 10], + [1, 7, 11], + ] + + result = kruskal(num_nodes, num_edges, edges) + + expected = [ + [7, 6, 1], + [2, 8, 2], + [6, 5, 2], + [0, 1, 4], + [2, 5, 4], + [2, 3, 7], + [0, 7, 8], + [3, 4, 9], + ] + + assert sorted(expected) == sorted(result) diff --git a/python-mega-algo/graphs/tests/test_min_spanning_tree_prim.py b/python-mega-algo/graphs/tests/test_min_spanning_tree_prim.py new file mode 100644 index 00000000..048fbf59 --- /dev/null +++ b/python-mega-algo/graphs/tests/test_min_spanning_tree_prim.py @@ -0,0 +1,46 @@ +from collections import defaultdict + +from graphs.minimum_spanning_tree_prims import PrimsAlgorithm as mst + + +def test_prim_successful_result(): + num_nodes, num_edges = 9, 14 # noqa: F841 + edges = [ + [0, 1, 4], + [0, 7, 8], + [1, 2, 8], + [7, 8, 7], + [7, 6, 1], + [2, 8, 2], + [8, 6, 6], + [2, 3, 7], + [2, 5, 4], + [6, 5, 2], + [3, 5, 14], + [3, 4, 9], + [5, 4, 10], + [1, 7, 11], + ] + + adjancency = defaultdict(list) + for node1, node2, cost in edges: + adjancency[node1].append([node2, cost]) + adjancency[node2].append([node1, cost]) + + result = mst(adjancency) + + expected = [ + [7, 6, 1], + [2, 8, 2], + [6, 5, 2], + [0, 1, 4], + [2, 5, 4], + [2, 3, 7], + [0, 7, 8], + [3, 4, 9], + ] + + for answer in expected: + edge = tuple(answer[:2]) + reverse = tuple(edge[::-1]) + assert edge in result or reverse in result diff --git a/python-mega-algo/hashes/__init__.py b/python-mega-algo/hashes/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/hashes/adler32.py b/python-mega-algo/hashes/adler32.py new file mode 100644 index 00000000..4a61b97e --- /dev/null +++ b/python-mega-algo/hashes/adler32.py @@ -0,0 +1,29 @@ +""" + Adler-32 is a checksum algorithm which was invented by Mark Adler in 1995. + Compared to a cyclic redundancy check of the same length, it trades reliability for + speed (preferring the latter). + Adler-32 is more reliable than Fletcher-16, and slightly less reliable than + Fletcher-32.[2] + + source: https://en.wikipedia.org/wiki/Adler-32 +""" + + +def adler32(plain_text: str) -> int: + """ + Function implements adler-32 hash. + Iterates and evaluates a new value for each character + + >>> adler32('Algorithms') + 363791387 + + >>> adler32('go adler em all') + 708642122 + """ + MOD_ADLER = 65521 + a = 1 + b = 0 + for plain_chr in plain_text: + a = (a + ord(plain_chr)) % MOD_ADLER + b = (b + a) % MOD_ADLER + return (b << 16) | a diff --git a/python-mega-algo/hashes/chaos_machine.py b/python-mega-algo/hashes/chaos_machine.py new file mode 100644 index 00000000..7ef4fdb3 --- /dev/null +++ b/python-mega-algo/hashes/chaos_machine.py @@ -0,0 +1,102 @@ +"""example of simple chaos machine""" + +# Chaos Machine (K, t, m) +K = [0.33, 0.44, 0.55, 0.44, 0.33] +t = 3 +m = 5 + +# Buffer Space (with Parameters Space) +buffer_space: list[float] = [] +params_space: list[float] = [] + +# Machine Time +machine_time = 0 + + +def push(seed): + global buffer_space, params_space, machine_time, K, m, t + + # Choosing Dynamical Systems (All) + for key, value in enumerate(buffer_space): + # Evolution Parameter + e = float(seed / value) + + # Control Theory: Orbit Change + value = (buffer_space[(key + 1) % m] + e) % 1 + + # Control Theory: Trajectory Change + r = (params_space[key] + e) % 1 + 3 + + # Modification (Transition Function) - Jumps + buffer_space[key] = round(float(r * value * (1 - value)), 10) + params_space[key] = r # Saving to Parameters Space + + # Logistic Map + assert max(buffer_space) < 1 + assert max(params_space) < 4 + + # Machine Time + machine_time += 1 + + +def pull(): + global buffer_space, params_space, machine_time, K, m, t + + # PRNG (Xorshift by George Marsaglia) + def xorshift(X, Y): + X ^= Y >> 13 + Y ^= X << 17 + X ^= Y >> 5 + return X + + # Choosing Dynamical Systems (Increment) + key = machine_time % m + + # Evolution (Time Length) + for i in range(0, t): + # Variables (Position + Parameters) + r = params_space[key] + value = buffer_space[key] + + # Modification (Transition Function) - Flow + buffer_space[key] = round(float(r * value * (1 - value)), 10) + params_space[key] = (machine_time * 0.01 + r * 1.01) % 1 + 3 + + # Choosing Chaotic Data + X = int(buffer_space[(key + 2) % m] * (10 ** 10)) + Y = int(buffer_space[(key - 2) % m] * (10 ** 10)) + + # Machine Time + machine_time += 1 + + return xorshift(X, Y) % 0xFFFFFFFF + + +def reset(): + global buffer_space, params_space, machine_time, K, m, t + + buffer_space = K + params_space = [0] * m + machine_time = 0 + + +if __name__ == "__main__": + # Initialization + reset() + + # Pushing Data (Input) + import random + + message = random.sample(range(0xFFFFFFFF), 100) + for chunk in message: + push(chunk) + + # for controlling + inp = "" + + # Pulling Data (Output) + while inp in ("e", "E"): + print("%s" % format(pull(), "#04x")) + print(buffer_space) + print(params_space) + inp = input("(e)exit? ").strip() diff --git a/python-mega-algo/hashes/djb2.py b/python-mega-algo/hashes/djb2.py new file mode 100644 index 00000000..2d1c9aab --- /dev/null +++ b/python-mega-algo/hashes/djb2.py @@ -0,0 +1,35 @@ +""" +This algorithm (k=33) was first reported by Dan Bernstein many years ago in comp.lang.c +Another version of this algorithm (now favored by Bernstein) uses xor: + hash(i) = hash(i - 1) * 33 ^ str[i]; + + First Magic constant 33: + It has never been adequately explained. + It's magic because it works better than many other constants, prime or not. + + Second Magic Constant 5381: + + 1. odd number + 2. prime number + 3. deficient number + 4. 001/010/100/000/101 b + + source: http://www.cse.yorku.ca/~oz/hash.html +""" + + +def djb2(s: str) -> int: + """ + Implementation of djb2 hash algorithm that + is popular because of it's magic constants. + + >>> djb2('Algorithms') + 3782405311 + + >>> djb2('scramble bits') + 1609059040 + """ + hash = 5381 + for x in s: + hash = ((hash << 5) + hash) + ord(x) + return hash & 0xFFFFFFFF diff --git a/python-mega-algo/hashes/enigma_machine.py b/python-mega-algo/hashes/enigma_machine.py new file mode 100644 index 00000000..d1cb6efc --- /dev/null +++ b/python-mega-algo/hashes/enigma_machine.py @@ -0,0 +1,59 @@ +alphabets = [chr(i) for i in range(32, 126)] +gear_one = [i for i in range(len(alphabets))] +gear_two = [i for i in range(len(alphabets))] +gear_three = [i for i in range(len(alphabets))] +reflector = [i for i in reversed(range(len(alphabets)))] +code = [] +gear_one_pos = gear_two_pos = gear_three_pos = 0 + + +def rotator(): + global gear_one_pos + global gear_two_pos + global gear_three_pos + i = gear_one[0] + gear_one.append(i) + del gear_one[0] + gear_one_pos += 1 + if gear_one_pos % int(len(alphabets)) == 0: + i = gear_two[0] + gear_two.append(i) + del gear_two[0] + gear_two_pos += 1 + if gear_two_pos % int(len(alphabets)) == 0: + i = gear_three[0] + gear_three.append(i) + del gear_three[0] + gear_three_pos += 1 + + +def engine(input_character): + target = alphabets.index(input_character) + target = gear_one[target] + target = gear_two[target] + target = gear_three[target] + target = reflector[target] + target = gear_three.index(target) + target = gear_two.index(target) + target = gear_one.index(target) + code.append(alphabets[target]) + rotator() + + +if __name__ == "__main__": + decode = list(input("Type your message:\n")) + while True: + try: + token = int(input("Please set token:(must be only digits)\n")) + break + except Exception as error: + print(error) + for i in range(token): + rotator() + for j in decode: + engine(j) + print("\n" + "".join(code)) + print( + f"\nYour Token is {token} please write it down.\nIf you want to decode " + f"this message again you should input same digits as token!" + ) diff --git a/python-mega-algo/hashes/hamming_code.py b/python-mega-algo/hashes/hamming_code.py new file mode 100644 index 00000000..4a32bae1 --- /dev/null +++ b/python-mega-algo/hashes/hamming_code.py @@ -0,0 +1,296 @@ +# Author: João Gustavo A. Amorim & Gabriel Kunz +# Author email: joaogustavoamorim@gmail.com and gabriel-kunz@uergs.edu.br +# Coding date: apr 2019 +# Black: True + +""" + * This code implement the Hamming code: + https://en.wikipedia.org/wiki/Hamming_code - In telecommunication, + Hamming codes are a family of linear error-correcting codes. Hamming + codes can detect up to two-bit errors or correct one-bit errors + without detection of uncorrected errors. By contrast, the simple + parity code cannot correct errors, and can detect only an odd number + of bits in error. Hamming codes are perfect codes, that is, they + achieve the highest possible rate for codes with their block length + and minimum distance of three. + + * the implemented code consists of: + * a function responsible for encoding the message (emitterConverter) + * return the encoded message + * a function responsible for decoding the message (receptorConverter) + * return the decoded message and a ack of data integrity + + * how to use: + to be used you must declare how many parity bits (sizePari) + you want to include in the message. + it is desired (for test purposes) to select a bit to be set + as an error. This serves to check whether the code is working correctly. + Lastly, the variable of the message/word that must be desired to be + encoded (text). + + * how this work: + declaration of variables (sizePari, be, text) + + converts the message/word (text) to binary using the + text_to_bits function + encodes the message using the rules of hamming encoding + decodes the message using the rules of hamming encoding + print the original message, the encoded message and the + decoded message + + forces an error in the coded text variable + decodes the message that was forced the error + print the original message, the encoded message, the bit changed + message and the decoded message +""" + +# Imports +import numpy as np + + +# Functions of binary conversion-------------------------------------- +def text_to_bits(text, encoding="utf-8", errors="surrogatepass"): + """ + >>> text_to_bits("msg") + '011011010111001101100111' + """ + bits = bin(int.from_bytes(text.encode(encoding, errors), "big"))[2:] + return bits.zfill(8 * ((len(bits) + 7) // 8)) + + +def text_from_bits(bits, encoding="utf-8", errors="surrogatepass"): + """ + >>> text_from_bits('011011010111001101100111') + 'msg' + """ + n = int(bits, 2) + return n.to_bytes((n.bit_length() + 7) // 8, "big").decode(encoding, errors) or "\0" + + +# Functions of hamming code------------------------------------------- +def emitterConverter(sizePar, data): + """ + :param sizePar: how many parity bits the message must have + :param data: information bits + :return: message to be transmitted by unreliable medium + - bits of information merged with parity bits + + >>> emitterConverter(4, "101010111111") + ['1', '1', '1', '1', '0', '1', '0', '0', '1', '0', '1', '1', '1', '1', '1', '1'] + """ + if sizePar + len(data) <= 2 ** sizePar - (len(data) - 1): + print("ERROR - size of parity don't match with size of data") + exit(0) + + dataOut = [] + parity = [] + binPos = [bin(x)[2:] for x in range(1, sizePar + len(data) + 1)] + + # sorted information data for the size of the output data + dataOrd = [] + # data position template + parity + dataOutGab = [] + # parity bit counter + qtdBP = 0 + # counter position of data bits + contData = 0 + + for x in range(1, sizePar + len(data) + 1): + # Performs a template of bit positions - who should be given, + # and who should be parity + if qtdBP < sizePar: + if (np.log(x) / np.log(2)).is_integer(): + dataOutGab.append("P") + qtdBP = qtdBP + 1 + else: + dataOutGab.append("D") + else: + dataOutGab.append("D") + + # Sorts the data to the new output size + if dataOutGab[-1] == "D": + dataOrd.append(data[contData]) + contData += 1 + else: + dataOrd.append(None) + + # Calculates parity + qtdBP = 0 # parity bit counter + for bp in range(1, sizePar + 1): + # Bit counter one for a given parity + contBO = 0 + # counter to control the loop reading + contLoop = 0 + for x in dataOrd: + if x is not None: + try: + aux = (binPos[contLoop])[-1 * (bp)] + except IndexError: + aux = "0" + if aux == "1": + if x == "1": + contBO += 1 + contLoop += 1 + parity.append(contBO % 2) + + qtdBP += 1 + + # Mount the message + ContBP = 0 # parity bit counter + for x in range(0, sizePar + len(data)): + if dataOrd[x] is None: + dataOut.append(str(parity[ContBP])) + ContBP += 1 + else: + dataOut.append(dataOrd[x]) + + return dataOut + + +def receptorConverter(sizePar, data): + """ + >>> receptorConverter(4, "1111010010111111") + (['1', '0', '1', '0', '1', '0', '1', '1', '1', '1', '1', '1'], True) + """ + # data position template + parity + dataOutGab = [] + # Parity bit counter + qtdBP = 0 + # Counter p data bit reading + contData = 0 + # list of parity received + parityReceived = [] + dataOutput = [] + + for x in range(1, len(data) + 1): + # Performs a template of bit positions - who should be given, + # and who should be parity + if qtdBP < sizePar and (np.log(x) / np.log(2)).is_integer(): + dataOutGab.append("P") + qtdBP = qtdBP + 1 + else: + dataOutGab.append("D") + + # Sorts the data to the new output size + if dataOutGab[-1] == "D": + dataOutput.append(data[contData]) + else: + parityReceived.append(data[contData]) + contData += 1 + + # -----------calculates the parity with the data + dataOut = [] + parity = [] + binPos = [bin(x)[2:] for x in range(1, sizePar + len(dataOutput) + 1)] + + # sorted information data for the size of the output data + dataOrd = [] + # Data position feedback + parity + dataOutGab = [] + # Parity bit counter + qtdBP = 0 + # Counter p data bit reading + contData = 0 + + for x in range(1, sizePar + len(dataOutput) + 1): + # Performs a template position of bits - who should be given, + # and who should be parity + if qtdBP < sizePar and (np.log(x) / np.log(2)).is_integer(): + dataOutGab.append("P") + qtdBP = qtdBP + 1 + else: + dataOutGab.append("D") + + # Sorts the data to the new output size + if dataOutGab[-1] == "D": + dataOrd.append(dataOutput[contData]) + contData += 1 + else: + dataOrd.append(None) + + # Calculates parity + qtdBP = 0 # parity bit counter + for bp in range(1, sizePar + 1): + # Bit counter one for a certain parity + contBO = 0 + # Counter to control loop reading + contLoop = 0 + for x in dataOrd: + if x is not None: + try: + aux = (binPos[contLoop])[-1 * (bp)] + except IndexError: + aux = "0" + if aux == "1" and x == "1": + contBO += 1 + contLoop += 1 + parity.append(str(contBO % 2)) + + qtdBP += 1 + + # Mount the message + ContBP = 0 # Parity bit counter + for x in range(0, sizePar + len(dataOutput)): + if dataOrd[x] is None: + dataOut.append(str(parity[ContBP])) + ContBP += 1 + else: + dataOut.append(dataOrd[x]) + + ack = parityReceived == parity + return dataOutput, ack + + +# --------------------------------------------------------------------- +""" +# Example how to use + +# number of parity bits +sizePari = 4 + +# location of the bit that will be forced an error +be = 2 + +# Message/word to be encoded and decoded with hamming +# text = input("Enter the word to be read: ") +text = "Message01" + +# Convert the message to binary +binaryText = text_to_bits(text) + +# Prints the binary of the string +print("Text input in binary is '" + binaryText + "'") + +# total transmitted bits +totalBits = len(binaryText) + sizePari +print("Size of data is " + str(totalBits)) + +print("\n --Message exchange--") +print("Data to send ------------> " + binaryText) +dataOut = emitterConverter(sizePari, binaryText) +print("Data converted ----------> " + "".join(dataOut)) +dataReceiv, ack = receptorConverter(sizePari, dataOut) +print( + "Data receive ------------> " + + "".join(dataReceiv) + + "\t\t -- Data integrity: " + + str(ack) +) + + +print("\n --Force error--") +print("Data to send ------------> " + binaryText) +dataOut = emitterConverter(sizePari, binaryText) +print("Data converted ----------> " + "".join(dataOut)) + +# forces error +dataOut[-be] = "1" * (dataOut[-be] == "0") + "0" * (dataOut[-be] == "1") +print("Data after transmission -> " + "".join(dataOut)) +dataReceiv, ack = receptorConverter(sizePari, dataOut) +print( + "Data receive ------------> " + + "".join(dataReceiv) + + "\t\t -- Data integrity: " + + str(ack) +) +""" diff --git a/python-mega-algo/hashes/md5.py b/python-mega-algo/hashes/md5.py new file mode 100644 index 00000000..b08ab957 --- /dev/null +++ b/python-mega-algo/hashes/md5.py @@ -0,0 +1,238 @@ +import math + + +def rearrange(bitString32): + """[summary] + Regroups the given binary string. + + Arguments: + bitString32 {[string]} -- [32 bit binary] + + Raises: + ValueError -- [if the given string not are 32 bit binary string] + + Returns: + [string] -- [32 bit binary string] + >>> rearrange('1234567890abcdfghijklmnopqrstuvw') + 'pqrstuvwhijklmno90abcdfg12345678' + """ + + if len(bitString32) != 32: + raise ValueError("Need length 32") + newString = "" + for i in [3, 2, 1, 0]: + newString += bitString32[8 * i : 8 * i + 8] + return newString + + +def reformatHex(i): + """[summary] + Converts the given integer into 8-digit hex number. + + Arguments: + i {[int]} -- [integer] + >>> reformatHex(666) + '9a020000' + """ + + hexrep = format(i, "08x") + thing = "" + for i in [3, 2, 1, 0]: + thing += hexrep[2 * i : 2 * i + 2] + return thing + + +def pad(bitString): + """[summary] + Fills up the binary string to a 512 bit binary string + + Arguments: + bitString {[string]} -- [binary string] + + Returns: + [string] -- [binary string] + """ + startLength = len(bitString) + bitString += "1" + while len(bitString) % 512 != 448: + bitString += "0" + lastPart = format(startLength, "064b") + bitString += rearrange(lastPart[32:]) + rearrange(lastPart[:32]) + return bitString + + +def getBlock(bitString): + """[summary] + Iterator: + Returns by each call a list of length 16 with the 32 bit + integer blocks. + + Arguments: + bitString {[string]} -- [binary string >= 512] + """ + + currPos = 0 + while currPos < len(bitString): + currPart = bitString[currPos : currPos + 512] + mySplits = [] + for i in range(16): + mySplits.append(int(rearrange(currPart[32 * i : 32 * i + 32]), 2)) + yield mySplits + currPos += 512 + + +def not32(i): + """ + >>> not32(34) + 4294967261 + """ + i_str = format(i, "032b") + new_str = "" + for c in i_str: + new_str += "1" if c == "0" else "0" + return int(new_str, 2) + + +def sum32(a, b): + return (a + b) % 2 ** 32 + + +def leftrot32(i, s): + return (i << s) ^ (i >> (32 - s)) + + +def md5me(testString): + """[summary] + Returns a 32-bit hash code of the string 'testString' + + Arguments: + testString {[string]} -- [message] + """ + + bs = "" + for i in testString: + bs += format(ord(i), "08b") + bs = pad(bs) + + tvals = [int(2 ** 32 * abs(math.sin(i + 1))) for i in range(64)] + + a0 = 0x67452301 + b0 = 0xEFCDAB89 + c0 = 0x98BADCFE + d0 = 0x10325476 + + s = [ + 7, + 12, + 17, + 22, + 7, + 12, + 17, + 22, + 7, + 12, + 17, + 22, + 7, + 12, + 17, + 22, + 5, + 9, + 14, + 20, + 5, + 9, + 14, + 20, + 5, + 9, + 14, + 20, + 5, + 9, + 14, + 20, + 4, + 11, + 16, + 23, + 4, + 11, + 16, + 23, + 4, + 11, + 16, + 23, + 4, + 11, + 16, + 23, + 6, + 10, + 15, + 21, + 6, + 10, + 15, + 21, + 6, + 10, + 15, + 21, + 6, + 10, + 15, + 21, + ] + + for m in getBlock(bs): + A = a0 + B = b0 + C = c0 + D = d0 + for i in range(64): + if i <= 15: + # f = (B & C) | (not32(B) & D) + f = D ^ (B & (C ^ D)) + g = i + elif i <= 31: + # f = (D & B) | (not32(D) & C) + f = C ^ (D & (B ^ C)) + g = (5 * i + 1) % 16 + elif i <= 47: + f = B ^ C ^ D + g = (3 * i + 5) % 16 + else: + f = C ^ (B | not32(D)) + g = (7 * i) % 16 + dtemp = D + D = C + C = B + B = sum32(B, leftrot32((A + f + tvals[i] + m[g]) % 2 ** 32, s[i])) + A = dtemp + a0 = sum32(a0, A) + b0 = sum32(b0, B) + c0 = sum32(c0, C) + d0 = sum32(d0, D) + + digest = reformatHex(a0) + reformatHex(b0) + reformatHex(c0) + reformatHex(d0) + return digest + + +def test(): + assert md5me("") == "d41d8cd98f00b204e9800998ecf8427e" + assert ( + md5me("The quick brown fox jumps over the lazy dog") + == "9e107d9d372bb6826bd81d3542a419d6" + ) + print("Success.") + + +if __name__ == "__main__": + test() + import doctest + + doctest.testmod() diff --git a/python-mega-algo/hashes/right.html b/python-mega-algo/hashes/right.html new file mode 100644 index 00000000..1632d386 --- /dev/null +++ b/python-mega-algo/hashes/right.html @@ -0,0 +1,31 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/hashes + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + + + +
    FileFileFileFile
    adler32.py enigma_machine.py md5.py sha1.py 
    chaos_machine.py hamming_code.py sdbm.py __init__.py 
    djb2.py 
    + +

    +Folders: 1
    +Files: 9
    +Size of all files: 27696 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/hashes/sdbm.py b/python-mega-algo/hashes/sdbm.py new file mode 100644 index 00000000..daf29271 --- /dev/null +++ b/python-mega-algo/hashes/sdbm.py @@ -0,0 +1,37 @@ +""" + This algorithm was created for sdbm (a public-domain reimplementation of ndbm) + database library. + It was found to do well in scrambling bits, causing better distribution of the keys + and fewer splits. + It also happens to be a good general hashing function with good distribution. + The actual function (pseudo code) is: + for i in i..len(str): + hash(i) = hash(i - 1) * 65599 + str[i]; + + What is included below is the faster version used in gawk. [there is even a faster, + duff-device version] + The magic constant 65599 was picked out of thin air while experimenting with + different constants. + It turns out to be a prime. + This is one of the algorithms used in berkeley db (see sleepycat) and elsewhere. + + source: http://www.cse.yorku.ca/~oz/hash.html +""" + + +def sdbm(plain_text: str) -> int: + """ + Function implements sdbm hash, easy to use, great for bits scrambling. + iterates over each character in the given string and applies function to each of + them. + + >>> sdbm('Algorithms') + 1462174910723540325254304520539387479031000036 + + >>> sdbm('scramble bits') + 730247649148944819640658295400555317318720608290373040936089 + """ + hash = 0 + for plain_chr in plain_text: + hash = ord(plain_chr) + (hash << 6) + (hash << 16) - hash + return hash diff --git a/python-mega-algo/hashes/sha1.py b/python-mega-algo/hashes/sha1.py new file mode 100644 index 00000000..cca38b7c --- /dev/null +++ b/python-mega-algo/hashes/sha1.py @@ -0,0 +1,171 @@ +""" +Demonstrates implementation of SHA1 Hash function in a Python class and gives utilities +to find hash of string or hash of text from a file. +Usage: python sha1.py --string "Hello World!!" + python sha1.py --file "hello_world.txt" + When run without any arguments, it prints the hash of the string "Hello World!! + Welcome to Cryptography" +Also contains a Test class to verify that the generated Hash is same as that +returned by the hashlib library + +SHA1 hash or SHA1 sum of a string is a cryptographic function which means it is easy +to calculate forwards but extremely difficult to calculate backwards. What this means +is, you can easily calculate the hash of a string, but it is extremely difficult to +know the original string if you have its hash. This property is useful to communicate +securely, send encrypted messages and is very useful in payment systems, blockchain +and cryptocurrency etc. +The Algorithm as described in the reference: +First we start with a message. The message is padded and the length of the message +is added to the end. It is then split into blocks of 512 bits or 64 bytes. The blocks +are then processed one at a time. Each block must be expanded and compressed. +The value after each compression is added to a 160bit buffer called the current hash +state. After the last block is processed the current hash state is returned as +the final hash. +Reference: https://deadhacker.com/2006/02/21/sha-1-illustrated/ +""" +import argparse +import hashlib # hashlib is only used inside the Test class +import struct +import unittest + + +class SHA1Hash: + """ + Class to contain the entire pipeline for SHA1 Hashing Algorithm + >>> SHA1Hash(bytes('Allan', 'utf-8')).final_hash() + '872af2d8ac3d8695387e7c804bf0e02c18df9e6e' + """ + + def __init__(self, data): + """ + Inititates the variables data and h. h is a list of 5 8-digit Hexadecimal + numbers corresponding to + (1732584193, 4023233417, 2562383102, 271733878, 3285377520) + respectively. We will start with this as a message digest. 0x is how you write + Hexadecimal numbers in Python + """ + self.data = data + self.h = [0x67452301, 0xEFCDAB89, 0x98BADCFE, 0x10325476, 0xC3D2E1F0] + + @staticmethod + def rotate(n, b): + """ + Static method to be used inside other methods. Left rotates n by b. + >>> SHA1Hash('').rotate(12,2) + 48 + """ + return ((n << b) | (n >> (32 - b))) & 0xFFFFFFFF + + def padding(self): + """ + Pads the input message with zeros so that padded_data has 64 bytes or 512 bits + """ + padding = b"\x80" + b"\x00" * (63 - (len(self.data) + 8) % 64) + padded_data = self.data + padding + struct.pack(">Q", 8 * len(self.data)) + return padded_data + + def split_blocks(self): + """ + Returns a list of bytestrings each of length 64 + """ + return [ + self.padded_data[i : i + 64] for i in range(0, len(self.padded_data), 64) + ] + + # @staticmethod + def expand_block(self, block): + """ + Takes a bytestring-block of length 64, unpacks it to a list of integers and + returns a list of 80 integers after some bit operations + """ + w = list(struct.unpack(">16L", block)) + [0] * 64 + for i in range(16, 80): + w[i] = self.rotate((w[i - 3] ^ w[i - 8] ^ w[i - 14] ^ w[i - 16]), 1) + return w + + def final_hash(self): + """ + Calls all the other methods to process the input. Pads the data, then splits + into blocks and then does a series of operations for each block (including + expansion). + For each block, the variable h that was initialized is copied to a,b,c,d,e + and these 5 variables a,b,c,d,e undergo several changes. After all the blocks + are processed, these 5 variables are pairwise added to h ie a to h[0], b to h[1] + and so on. This h becomes our final hash which is returned. + """ + self.padded_data = self.padding() + self.blocks = self.split_blocks() + for block in self.blocks: + expanded_block = self.expand_block(block) + a, b, c, d, e = self.h + for i in range(0, 80): + if 0 <= i < 20: + f = (b & c) | ((~b) & d) + k = 0x5A827999 + elif 20 <= i < 40: + f = b ^ c ^ d + k = 0x6ED9EBA1 + elif 40 <= i < 60: + f = (b & c) | (b & d) | (c & d) + k = 0x8F1BBCDC + elif 60 <= i < 80: + f = b ^ c ^ d + k = 0xCA62C1D6 + a, b, c, d, e = ( + self.rotate(a, 5) + f + e + k + expanded_block[i] & 0xFFFFFFFF, + a, + self.rotate(b, 30), + c, + d, + ) + self.h = ( + self.h[0] + a & 0xFFFFFFFF, + self.h[1] + b & 0xFFFFFFFF, + self.h[2] + c & 0xFFFFFFFF, + self.h[3] + d & 0xFFFFFFFF, + self.h[4] + e & 0xFFFFFFFF, + ) + return "%08x%08x%08x%08x%08x" % tuple(self.h) + + +class SHA1HashTest(unittest.TestCase): + """ + Test class for the SHA1Hash class. Inherits the TestCase class from unittest + """ + + def testMatchHashes(self): + msg = bytes("Test String", "utf-8") + self.assertEqual(SHA1Hash(msg).final_hash(), hashlib.sha1(msg).hexdigest()) + + +def main(): + """ + Provides option 'string' or 'file' to take input and prints the calculated SHA1 + hash. unittest.main() has been commented because we probably don't want to run + the test each time. + """ + # unittest.main() + parser = argparse.ArgumentParser(description="Process some strings or files") + parser.add_argument( + "--string", + dest="input_string", + default="Hello World!! Welcome to Cryptography", + help="Hash the string", + ) + parser.add_argument("--file", dest="input_file", help="Hash contents of a file") + args = parser.parse_args() + input_string = args.input_string + # In any case hash input should be a bytestring + if args.input_file: + with open(args.input_file, "rb") as f: + hash_input = f.read() + else: + hash_input = bytes(input_string, "utf-8") + print(SHA1Hash(hash_input).final_hash()) + + +if __name__ == "__main__": + main() + import doctest + + doctest.testmod() diff --git a/python-mega-algo/knapsack/README.md b/python-mega-algo/knapsack/README.md new file mode 100644 index 00000000..6041c1e4 --- /dev/null +++ b/python-mega-algo/knapsack/README.md @@ -0,0 +1,32 @@ +# A naive recursive implementation of 0-1 Knapsack Problem + +This overview is taken from: + + https://en.wikipedia.org/wiki/Knapsack_problem + +--- + +## Overview + +The knapsack problem is a problem in combinatorial optimization: Given a set of items, each with a weight and a value, determine the number of each item to include in a collection so that the total weight is less than or equal to a given limit and the total value is as large as possible. It derives its name from the problem faced by someone who is constrained by a fixed-size knapsack and must fill it with the most valuable items. The problem often arises in resource allocation where the decision makers have to choose from a set of non-divisible projects or tasks under a fixed budget or time constraint, respectively. + +The knapsack problem has been studied for more than a century, with early works dating as far back as 1897 The name "knapsack problem" dates back to the early works of mathematician Tobias Dantzig (1884–1956), and refers to the commonplace problem of packing the most valuable or useful items without overloading the luggage. + +--- + +## Documentation + +This module uses docstrings to enable the use of Python's in-built `help(...)` function. +For instance, try `help(Vector)`, `help(unitBasisVector)`, and `help(CLASSNAME.METHODNAME)`. + +--- + +## Usage + +Import the module `knapsack.py` from the **.** directory into your project. + +--- + +## Tests + +`.` contains Python unit tests which can be run with `python3 -m unittest -v`. diff --git a/python-mega-algo/knapsack/__init__.py b/python-mega-algo/knapsack/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/knapsack/greedy_knapsack.py b/python-mega-algo/knapsack/greedy_knapsack.py new file mode 100644 index 00000000..ed6399c7 --- /dev/null +++ b/python-mega-algo/knapsack/greedy_knapsack.py @@ -0,0 +1,98 @@ +# To get an insight into Greedy Algorithm through the Knapsack problem + + +""" +A shopkeeper has bags of wheat that each have different weights and different profits. +eg. +profit 5 8 7 1 12 3 4 +weight 2 7 1 6 4 2 5 +max_weight 100 + +Constraints: +max_weight > 0 +profit[i] >= 0 +weight[i] >= 0 +Calculate the maximum profit that the shopkeeper can make given maxmum weight that can +be carried. +""" + + +def calc_profit(profit: list, weight: list, max_weight: int) -> int: + """ + Function description is as follows- + :param profit: Take a list of profits + :param weight: Take a list of weight if bags corresponding to the profits + :param max_weight: Maximum weight that could be carried + :return: Maximum expected gain + + >>> calc_profit([1, 2, 3], [3, 4, 5], 15) + 6 + >>> calc_profit([10, 9 , 8], [3 ,4 , 5], 25) + 27 + """ + if len(profit) != len(weight): + raise ValueError("The length of profit and weight must be same.") + if max_weight <= 0: + raise ValueError("max_weight must greater than zero.") + if any(p < 0 for p in profit): + raise ValueError("Profit can not be negative.") + if any(w < 0 for w in weight): + raise ValueError("Weight can not be negative.") + + # List created to store profit gained for the 1kg in case of each weight + # respectively. Calculate and append profit/weight for each element. + profit_by_weight = [p / w for p, w in zip(profit, weight)] + + # Creating a copy of the list and sorting profit/weight in ascending order + sorted_profit_by_weight = sorted(profit_by_weight) + + # declaring useful variables + length = len(sorted_profit_by_weight) + limit = 0 + gain = 0 + i = 0 + + # loop till the total weight do not reach max limit e.g. 15 kg and till i= weight[index]: + limit += weight[index] + # Adding profit gained for the given weight 1 === + # weight[index]/weight[index] + gain += 1 * profit[index] + else: + # Since the weight encountered is greater than limit, therefore take the + # required number of remaining kgs and calculate profit for it. + # weight remaining / weight[index] + gain += (max_weight - limit) / weight[index] * profit[index] + break + i += 1 + return gain + + +if __name__ == "__main__": + print( + "Input profits, weights, and then max_weight (all positive ints) separated by " + "spaces." + ) + + profit = [int(x) for x in input("Input profits separated by spaces: ").split()] + weight = [int(x) for x in input("Input weights separated by spaces: ").split()] + max_weight = int(input("Max weight allowed: ")) + + # Function Call + calc_profit(profit, weight, max_weight) diff --git a/python-mega-algo/knapsack/knapsack.py b/python-mega-algo/knapsack/knapsack.py new file mode 100644 index 00000000..756443ea --- /dev/null +++ b/python-mega-algo/knapsack/knapsack.py @@ -0,0 +1,47 @@ +from typing import List + +""" A naive recursive implementation of 0-1 Knapsack Problem + https://en.wikipedia.org/wiki/Knapsack_problem +""" + + +def knapsack(capacity: int, weights: List[int], values: List[int], counter: int) -> int: + """ + Returns the maximum value that can be put in a knapsack of a capacity cap, + whereby each weight w has a specific value val. + + >>> cap = 50 + >>> val = [60, 100, 120] + >>> w = [10, 20, 30] + >>> c = len(val) + >>> knapsack(cap, w, val, c) + 220 + + The result is 220 cause the values of 100 and 120 got the weight of 50 + which is the limit of the capacity. + """ + + # Base Case + if counter == 0 or capacity == 0: + return 0 + + # If weight of the nth item is more than Knapsack of capacity, + # then this item cannot be included in the optimal solution, + # else return the maximum of two cases: + # (1) nth item included + # (2) not included + if weights[counter - 1] > capacity: + return knapsack(capacity, weights, values, counter - 1) + else: + left_capacity = capacity - weights[counter - 1] + new_value_included = values[counter - 1] + knapsack( + left_capacity, weights, values, counter - 1 + ) + without_new_value = knapsack(capacity, weights, values, counter - 1) + return max(new_value_included, without_new_value) + + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/knapsack/right.html b/python-mega-algo/knapsack/right.html new file mode 100644 index 00000000..e1f792dc --- /dev/null +++ b/python-mega-algo/knapsack/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/knapsack + + + + + + + + +
    Folders
    <Go Back> tests
    +
    + + + + +
    FileFileFileFile
    README.md greedy_knapsack.py knapsack.py __init__.py 
    + +

    +Folders: 2
    +Files: 4
    +Size of all files: 6655 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/knapsack/tests/__init__.py b/python-mega-algo/knapsack/tests/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/knapsack/tests/right.html b/python-mega-algo/knapsack/tests/right.html new file mode 100644 index 00000000..24e77777 --- /dev/null +++ b/python-mega-algo/knapsack/tests/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/knapsack/tests + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    test_gree...ack.py test_knapsack.py __init__.py 
    + +

    +Folders: 1
    +Files: 3
    +Size of all files: 3424 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/knapsack/tests/test_greedy_knapsack.py b/python-mega-algo/knapsack/tests/test_greedy_knapsack.py new file mode 100644 index 00000000..b7b62d5d --- /dev/null +++ b/python-mega-algo/knapsack/tests/test_greedy_knapsack.py @@ -0,0 +1,75 @@ +import unittest + +from knapsack import greedy_knapsack as kp + + +class TestClass(unittest.TestCase): + """ + Test cases for knapsack + """ + + def test_sorted(self): + """ + kp.calc_profit takes the required argument (profit, weight, max_weight) + and returns whether the answer matches to the expected ones + """ + profit = [10, 20, 30, 40, 50, 60] + weight = [2, 4, 6, 8, 10, 12] + max_weight = 100 + self.assertEqual(kp.calc_profit(profit, weight, max_weight), 210) + + def test_negative_max_weight(self): + """ + Returns ValueError for any negative max_weight value + :return: ValueError + """ + # profit = [10, 20, 30, 40, 50, 60] + # weight = [2, 4, 6, 8, 10, 12] + # max_weight = -15 + self.assertRaisesRegex(ValueError, "max_weight must greater than zero.") + + def test_negative_profit_value(self): + """ + Returns ValueError for any negative profit value in the list + :return: ValueError + """ + # profit = [10, -20, 30, 40, 50, 60] + # weight = [2, 4, 6, 8, 10, 12] + # max_weight = 15 + self.assertRaisesRegex(ValueError, "Weight can not be negative.") + + def test_negative_weight_value(self): + """ + Returns ValueError for any negative weight value in the list + :return: ValueError + """ + # profit = [10, 20, 30, 40, 50, 60] + # weight = [2, -4, 6, -8, 10, 12] + # max_weight = 15 + self.assertRaisesRegex(ValueError, "Profit can not be negative.") + + def test_null_max_weight(self): + """ + Returns ValueError for any zero max_weight value + :return: ValueError + """ + # profit = [10, 20, 30, 40, 50, 60] + # weight = [2, 4, 6, 8, 10, 12] + # max_weight = null + self.assertRaisesRegex(ValueError, "max_weight must greater than zero.") + + def test_unequal_list_length(self): + """ + Returns IndexError if length of lists (profit and weight) are unequal. + :return: IndexError + """ + # profit = [10, 20, 30, 40, 50] + # weight = [2, 4, 6, 8, 10, 12] + # max_weight = 100 + self.assertRaisesRegex( + IndexError, "The length of profit and weight must be same." + ) + + +if __name__ == "__main__": + unittest.main() diff --git a/python-mega-algo/knapsack/tests/test_knapsack.py b/python-mega-algo/knapsack/tests/test_knapsack.py new file mode 100644 index 00000000..248855fb --- /dev/null +++ b/python-mega-algo/knapsack/tests/test_knapsack.py @@ -0,0 +1,52 @@ +""" +Created on Fri Oct 16 09:31:07 2020 + +@author: Dr. Tobias Schröder +@license: MIT-license + +This file contains the test-suite for the knapsack problem. +""" +import unittest + +from knapsack import knapsack as k + + +class Test(unittest.TestCase): + def test_base_case(self): + """ + test for the base case + """ + cap = 0 + val = [0] + w = [0] + c = len(val) + self.assertEqual(k.knapsack(cap, w, val, c), 0) + + val = [60] + w = [10] + c = len(val) + self.assertEqual(k.knapsack(cap, w, val, c), 0) + + def test_easy_case(self): + """ + test for the base case + """ + cap = 3 + val = [1, 2, 3] + w = [3, 2, 1] + c = len(val) + self.assertEqual(k.knapsack(cap, w, val, c), 5) + + def test_knapsack(self): + """ + test for the knapsack + """ + cap = 50 + val = [60, 100, 120] + w = [10, 20, 30] + c = len(val) + self.assertEqual(k.knapsack(cap, w, val, c), 220) + + +if __name__ == "__main__": + unittest.main() diff --git a/python-mega-algo/linear_algebra/README.md b/python-mega-algo/linear_algebra/README.md new file mode 100644 index 00000000..dc608509 --- /dev/null +++ b/python-mega-algo/linear_algebra/README.md @@ -0,0 +1,75 @@ +# Linear algebra library for Python + +This module contains classes and functions for doing linear algebra. + +--- + +## Overview + +### class Vector +- + - This class represents a vector of arbitrary size and related operations. + + **Overview about the methods:** + + - constructor(components : list) : init the vector + - set(components : list) : changes the vector components. + - \_\_str\_\_() : toString method + - component(i : int): gets the i-th component (start by 0) + - \_\_len\_\_() : gets the size / length of the vector (number of components) + - euclidLength() : returns the eulidean length of the vector. + - operator + : vector addition + - operator - : vector subtraction + - operator * : scalar multiplication and dot product + - copy() : copies this vector and returns it. + - changeComponent(pos,value) : changes the specified component. + +- function zeroVector(dimension) + - returns a zero vector of 'dimension' +- function unitBasisVector(dimension,pos) + - returns a unit basis vector with a One at index 'pos' (indexing at 0) +- function axpy(scalar,vector1,vector2) + - computes the axpy operation +- function randomVector(N,a,b) + - returns a random vector of size N, with random integer components between 'a' and 'b'. + +### class Matrix +- + - This class represents a matrix of arbitrary size and operations on it. + + **Overview about the methods:** + + - \_\_str\_\_() : returns a string representation + - operator * : implements the matrix vector multiplication + implements the matrix-scalar multiplication. + - changeComponent(x,y,value) : changes the specified component. + - component(x,y) : returns the specified component. + - width() : returns the width of the matrix + - height() : returns the height of the matrix + - determinate() : returns the determinate of the matrix if it is square + - operator + : implements the matrix-addition. + - operator - _ implements the matrix-subtraction + +- function squareZeroMatrix(N) + - returns a square zero-matrix of dimension NxN +- function randomMatrix(W,H,a,b) + - returns a random matrix WxH with integer components between 'a' and 'b' +--- + +## Documentation + +This module uses docstrings to enable the use of Python's in-built `help(...)` function. +For instance, try `help(Vector)`, `help(unitBasisVector)`, and `help(CLASSNAME.METHODNAME)`. + +--- + +## Usage + +Import the module `lib.py` from the **src** directory into your project. +Alternatively, you can directly use the Python bytecode file `lib.pyc`. + +--- + +## Tests + +`src/tests.py` contains Python unit tests which can be run with `python3 -m unittest -v`. diff --git a/python-mega-algo/linear_algebra/__init__.py b/python-mega-algo/linear_algebra/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/linear_algebra/right.html b/python-mega-algo/linear_algebra/right.html new file mode 100644 index 00000000..8c787250 --- /dev/null +++ b/python-mega-algo/linear_algebra/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/linear_algebra + + + + + + + + +
    Folders
    <Go Back> src
    +
    + + + + +
    FileFileFileFile
    README.md __init__.py 
    + +

    +Folders: 2
    +Files: 2
    +Size of all files: 2654 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/linear_algebra/src/__init__.py b/python-mega-algo/linear_algebra/src/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/linear_algebra/src/conjugate_gradient.py b/python-mega-algo/linear_algebra/src/conjugate_gradient.py new file mode 100644 index 00000000..418ae88a --- /dev/null +++ b/python-mega-algo/linear_algebra/src/conjugate_gradient.py @@ -0,0 +1,178 @@ +""" +Resources: +- https://en.wikipedia.org/wiki/Conjugate_gradient_method +- https://en.wikipedia.org/wiki/Definite_symmetric_matrix +""" +from typing import Any + +import numpy as np + + +def _is_matrix_spd(matrix: np.ndarray) -> bool: + """ + Returns True if input matrix is symmetric positive definite. + Returns False otherwise. + + For a matrix to be SPD, all eigenvalues must be positive. + + >>> import numpy as np + >>> matrix = np.array([ + ... [4.12401784, -5.01453636, -0.63865857], + ... [-5.01453636, 12.33347422, -3.40493586], + ... [-0.63865857, -3.40493586, 5.78591885]]) + >>> _is_matrix_spd(matrix) + True + >>> matrix = np.array([ + ... [0.34634879, 1.96165514, 2.18277744], + ... [0.74074469, -1.19648894, -1.34223498], + ... [-0.7687067 , 0.06018373, -1.16315631]]) + >>> _is_matrix_spd(matrix) + False + """ + # Ensure matrix is square. + assert np.shape(matrix)[0] == np.shape(matrix)[1] + + # If matrix not symmetric, exit right away. + if np.allclose(matrix, matrix.T) is False: + return False + + # Get eigenvalues and eignevectors for a symmetric matrix. + eigen_values, _ = np.linalg.eigh(matrix) + + # Check sign of all eigenvalues. + # np.all returns a value of type np.bool_ + return bool(np.all(eigen_values > 0)) + + +def _create_spd_matrix(dimension: int) -> Any: + """ + Returns a symmetric positive definite matrix given a dimension. + + Input: + dimension gives the square matrix dimension. + + Output: + spd_matrix is an diminesion x dimensions symmetric positive definite (SPD) matrix. + + >>> import numpy as np + >>> dimension = 3 + >>> spd_matrix = _create_spd_matrix(dimension) + >>> _is_matrix_spd(spd_matrix) + True + """ + random_matrix = np.random.randn(dimension, dimension) + spd_matrix = np.dot(random_matrix, random_matrix.T) + assert _is_matrix_spd(spd_matrix) + return spd_matrix + + +def conjugate_gradient( + spd_matrix: np.ndarray, + load_vector: np.ndarray, + max_iterations: int = 1000, + tol: float = 1e-8, +) -> Any: + """ + Returns solution to the linear system np.dot(spd_matrix, x) = b. + + Input: + spd_matrix is an NxN Symmetric Positive Definite (SPD) matrix. + load_vector is an Nx1 vector. + + Output: + x is an Nx1 vector that is the solution vector. + + >>> import numpy as np + >>> spd_matrix = np.array([ + ... [8.73256573, -5.02034289, -2.68709226], + ... [-5.02034289, 3.78188322, 0.91980451], + ... [-2.68709226, 0.91980451, 1.94746467]]) + >>> b = np.array([ + ... [-5.80872761], + ... [ 3.23807431], + ... [ 1.95381422]]) + >>> conjugate_gradient(spd_matrix, b) + array([[-0.63114139], + [-0.01561498], + [ 0.13979294]]) + """ + # Ensure proper dimensionality. + assert np.shape(spd_matrix)[0] == np.shape(spd_matrix)[1] + assert np.shape(load_vector)[0] == np.shape(spd_matrix)[0] + assert _is_matrix_spd(spd_matrix) + + # Initialize solution guess, residual, search direction. + x0 = np.zeros((np.shape(load_vector)[0], 1)) + r0 = np.copy(load_vector) + p0 = np.copy(r0) + + # Set initial errors in solution guess and residual. + error_residual = 1e9 + error_x_solution = 1e9 + error = 1e9 + + # Set iteration counter to threshold number of iterations. + iterations = 0 + + while error > tol: + + # Save this value so we only calculate the matrix-vector product once. + w = np.dot(spd_matrix, p0) + + # The main algorithm. + + # Update search direction magnitude. + alpha = np.dot(r0.T, r0) / np.dot(p0.T, w) + # Update solution guess. + x = x0 + alpha * p0 + # Calculate new residual. + r = r0 - alpha * w + # Calculate new Krylov subspace scale. + beta = np.dot(r.T, r) / np.dot(r0.T, r0) + # Calculate new A conjuage search direction. + p = r + beta * p0 + + # Calculate errors. + error_residual = np.linalg.norm(r - r0) + error_x_solution = np.linalg.norm(x - x0) + error = np.maximum(error_residual, error_x_solution) + + # Update variables. + x0 = np.copy(x) + r0 = np.copy(r) + p0 = np.copy(p) + + # Update number of iterations. + iterations += 1 + if iterations > max_iterations: + break + + return x + + +def test_conjugate_gradient() -> None: + """ + >>> test_conjugate_gradient() # self running tests + """ + # Create linear system with SPD matrix and known solution x_true. + dimension = 3 + spd_matrix = _create_spd_matrix(dimension) + x_true = np.random.randn(dimension, 1) + b = np.dot(spd_matrix, x_true) + + # Numpy solution. + x_numpy = np.linalg.solve(spd_matrix, b) + + # Our implementation. + x_conjugate_gradient = conjugate_gradient(spd_matrix, b) + + # Ensure both solutions are close to x_true (and therefore one another). + assert np.linalg.norm(x_numpy - x_true) <= 1e-6 + assert np.linalg.norm(x_conjugate_gradient - x_true) <= 1e-6 + + +if __name__ == "__main__": + import doctest + + doctest.testmod() + test_conjugate_gradient() diff --git a/python-mega-algo/linear_algebra/src/lib.py b/python-mega-algo/linear_algebra/src/lib.py new file mode 100644 index 00000000..5e2f8201 --- /dev/null +++ b/python-mega-algo/linear_algebra/src/lib.py @@ -0,0 +1,398 @@ +""" +Created on Mon Feb 26 14:29:11 2018 + +@author: Christian Bender +@license: MIT-license + +This module contains some useful classes and functions for dealing +with linear algebra in python. + +Overview: + +- class Vector +- function zeroVector(dimension) +- function unitBasisVector(dimension,pos) +- function axpy(scalar,vector1,vector2) +- function randomVector(N,a,b) +- class Matrix +- function squareZeroMatrix(N) +- function randomMatrix(W,H,a,b) +""" + + +import math +import random +from typing import Collection, Optional, Union, overload + + +class Vector: + """ + This class represents a vector of arbitrary size. + You need to give the vector components. + + Overview about the methods: + + constructor(components : list) : init the vector + set(components : list) : changes the vector components. + __str__() : toString method + component(i : int): gets the i-th component (start by 0) + __len__() : gets the size of the vector (number of components) + euclidLength() : returns the euclidean length of the vector. + operator + : vector addition + operator - : vector subtraction + operator * : scalar multiplication and dot product + copy() : copies this vector and returns it. + changeComponent(pos,value) : changes the specified component. + TODO: compare-operator + """ + + def __init__(self, components: Optional[Collection[float]] = None) -> None: + """ + input: components or nothing + simple constructor for init the vector + """ + if components is None: + components = [] + self.__components = list(components) + + def set(self, components: Collection[float]) -> None: + """ + input: new components + changes the components of the vector. + replace the components with newer one. + """ + if len(components) > 0: + self.__components = list(components) + else: + raise Exception("please give any vector") + + def __str__(self) -> str: + """ + returns a string representation of the vector + """ + return "(" + ",".join(map(str, self.__components)) + ")" + + def component(self, i: int) -> float: + """ + input: index (start at 0) + output: the i-th component of the vector. + """ + if type(i) is int and -len(self.__components) <= i < len(self.__components): + return self.__components[i] + else: + raise Exception("index out of range") + + def __len__(self) -> int: + """ + returns the size of the vector + """ + return len(self.__components) + + def euclidLength(self) -> float: + """ + returns the euclidean length of the vector + """ + summe: float = 0 + for c in self.__components: + summe += c ** 2 + return math.sqrt(summe) + + def __add__(self, other: "Vector") -> "Vector": + """ + input: other vector + assumes: other vector has the same size + returns a new vector that represents the sum. + """ + size = len(self) + if size == len(other): + result = [self.__components[i] + other.component(i) for i in range(size)] + return Vector(result) + else: + raise Exception("must have the same size") + + def __sub__(self, other: "Vector") -> "Vector": + """ + input: other vector + assumes: other vector has the same size + returns a new vector that represents the difference. + """ + size = len(self) + if size == len(other): + result = [self.__components[i] - other.component(i) for i in range(size)] + return Vector(result) + else: # error case + raise Exception("must have the same size") + + @overload + def __mul__(self, other: float) -> "Vector": + ... + + @overload + def __mul__(self, other: "Vector") -> float: + ... + + def __mul__(self, other: Union[float, "Vector"]) -> Union[float, "Vector"]: + """ + mul implements the scalar multiplication + and the dot-product + """ + if isinstance(other, float) or isinstance(other, int): + ans = [c * other for c in self.__components] + return Vector(ans) + elif isinstance(other, Vector) and (len(self) == len(other)): + size = len(self) + summe: float = 0 + for i in range(size): + summe += self.__components[i] * other.component(i) + return summe + else: # error case + raise Exception("invalid operand!") + + def copy(self) -> "Vector": + """ + copies this vector and returns it. + """ + return Vector(self.__components) + + def changeComponent(self, pos: int, value: float) -> None: + """ + input: an index (pos) and a value + changes the specified component (pos) with the + 'value' + """ + # precondition + assert -len(self.__components) <= pos < len(self.__components) + self.__components[pos] = value + + +def zeroVector(dimension: int) -> Vector: + """ + returns a zero-vector of size 'dimension' + """ + # precondition + assert isinstance(dimension, int) + return Vector([0] * dimension) + + +def unitBasisVector(dimension: int, pos: int) -> Vector: + """ + returns a unit basis vector with a One + at index 'pos' (indexing at 0) + """ + # precondition + assert isinstance(dimension, int) and (isinstance(pos, int)) + ans = [0] * dimension + ans[pos] = 1 + return Vector(ans) + + +def axpy(scalar: float, x: Vector, y: Vector) -> Vector: + """ + input: a 'scalar' and two vectors 'x' and 'y' + output: a vector + computes the axpy operation + """ + # precondition + assert ( + isinstance(x, Vector) + and (isinstance(y, Vector)) + and (isinstance(scalar, int) or isinstance(scalar, float)) + ) + return x * scalar + y + + +def randomVector(N: int, a: int, b: int) -> Vector: + """ + input: size (N) of the vector. + random range (a,b) + output: returns a random vector of size N, with + random integer components between 'a' and 'b'. + """ + random.seed(None) + ans = [random.randint(a, b) for _ in range(N)] + return Vector(ans) + + +class Matrix: + """ + class: Matrix + This class represents a arbitrary matrix. + + Overview about the methods: + + __str__() : returns a string representation + operator * : implements the matrix vector multiplication + implements the matrix-scalar multiplication. + changeComponent(x,y,value) : changes the specified component. + component(x,y) : returns the specified component. + width() : returns the width of the matrix + height() : returns the height of the matrix + operator + : implements the matrix-addition. + operator - _ implements the matrix-subtraction + """ + + def __init__(self, matrix: list[list[float]], w: int, h: int) -> None: + """ + simple constructor for initializing + the matrix with components. + """ + self.__matrix = matrix + self.__width = w + self.__height = h + + def __str__(self) -> str: + """ + returns a string representation of this + matrix. + """ + ans = "" + for i in range(self.__height): + ans += "|" + for j in range(self.__width): + if j < self.__width - 1: + ans += str(self.__matrix[i][j]) + "," + else: + ans += str(self.__matrix[i][j]) + "|\n" + return ans + + def changeComponent(self, x: int, y: int, value: float) -> None: + """ + changes the x-y component of this matrix + """ + if 0 <= x < self.__height and 0 <= y < self.__width: + self.__matrix[x][y] = value + else: + raise Exception("changeComponent: indices out of bounds") + + def component(self, x: int, y: int) -> float: + """ + returns the specified (x,y) component + """ + if 0 <= x < self.__height and 0 <= y < self.__width: + return self.__matrix[x][y] + else: + raise Exception("changeComponent: indices out of bounds") + + def width(self) -> int: + """ + getter for the width + """ + return self.__width + + def height(self) -> int: + """ + getter for the height + """ + return self.__height + + def determinate(self) -> float: + """ + returns the determinate of an nxn matrix using Laplace expansion + """ + if self.__height == self.__width and self.__width >= 2: + total = 0 + if self.__width > 2: + for x in range(0, self.__width): + for y in range(0, self.__height): + total += ( + self.__matrix[x][y] + * (-1) ** (x + y) + * Matrix( + self.__matrix[0:x] + self.__matrix[x + 1 :], + self.__width - 1, + self.__height - 1, + ).determinate() + ) + else: + return ( + self.__matrix[0][0] * self.__matrix[1][1] + - self.__matrix[0][1] * self.__matrix[1][0] + ) + return total + else: + raise Exception("matrix is not square") + + @overload + def __mul__(self, other: float) -> "Matrix": + ... + + @overload + def __mul__(self, other: Vector) -> Vector: + ... + + def __mul__(self, other: Union[float, Vector]) -> Union[Vector, "Matrix"]: + """ + implements the matrix-vector multiplication. + implements the matrix-scalar multiplication + """ + if isinstance(other, Vector): # vector-matrix + if len(other) == self.__width: + ans = zeroVector(self.__height) + for i in range(self.__height): + summe: float = 0 + for j in range(self.__width): + summe += other.component(j) * self.__matrix[i][j] + ans.changeComponent(i, summe) + summe = 0 + return ans + else: + raise Exception( + "vector must have the same size as the " + + "number of columns of the matrix!" + ) + elif isinstance(other, int) or isinstance(other, float): # matrix-scalar + matrix = [ + [self.__matrix[i][j] * other for j in range(self.__width)] + for i in range(self.__height) + ] + return Matrix(matrix, self.__width, self.__height) + + def __add__(self, other: "Matrix") -> "Matrix": + """ + implements the matrix-addition. + """ + if self.__width == other.width() and self.__height == other.height(): + matrix = [] + for i in range(self.__height): + row = [] + for j in range(self.__width): + row.append(self.__matrix[i][j] + other.component(i, j)) + matrix.append(row) + return Matrix(matrix, self.__width, self.__height) + else: + raise Exception("matrix must have the same dimension!") + + def __sub__(self, other: "Matrix") -> "Matrix": + """ + implements the matrix-subtraction. + """ + if self.__width == other.width() and self.__height == other.height(): + matrix = [] + for i in range(self.__height): + row = [] + for j in range(self.__width): + row.append(self.__matrix[i][j] - other.component(i, j)) + matrix.append(row) + return Matrix(matrix, self.__width, self.__height) + else: + raise Exception("matrix must have the same dimension!") + + +def squareZeroMatrix(N: int) -> Matrix: + """ + returns a square zero-matrix of dimension NxN + """ + ans: list[list[float]] = [[0] * N for _ in range(N)] + return Matrix(ans, N, N) + + +def randomMatrix(W: int, H: int, a: int, b: int) -> Matrix: + """ + returns a random matrix WxH with integer components + between 'a' and 'b' + """ + random.seed(None) + matrix: list[list[float]] = [ + [random.randint(a, b) for _ in range(W)] for _ in range(H) + ] + return Matrix(matrix, W, H) diff --git a/python-mega-algo/linear_algebra/src/polynom_for_points.py b/python-mega-algo/linear_algebra/src/polynom_for_points.py new file mode 100644 index 00000000..09184954 --- /dev/null +++ b/python-mega-algo/linear_algebra/src/polynom_for_points.py @@ -0,0 +1,129 @@ +def points_to_polynomial(coordinates: list[list[int]]) -> str: + """ + coordinates is a two dimensional matrix: [[x, y], [x, y], ...] + number of points you want to use + + >>> print(points_to_polynomial([])) + The program cannot work out a fitting polynomial. + >>> print(points_to_polynomial([[]])) + The program cannot work out a fitting polynomial. + >>> print(points_to_polynomial([[1, 0], [2, 0], [3, 0]])) + f(x)=x^2*0.0+x^1*-0.0+x^0*0.0 + >>> print(points_to_polynomial([[1, 1], [2, 1], [3, 1]])) + f(x)=x^2*0.0+x^1*-0.0+x^0*1.0 + >>> print(points_to_polynomial([[1, 3], [2, 3], [3, 3]])) + f(x)=x^2*0.0+x^1*-0.0+x^0*3.0 + >>> print(points_to_polynomial([[1, 1], [2, 2], [3, 3]])) + f(x)=x^2*0.0+x^1*1.0+x^0*0.0 + >>> print(points_to_polynomial([[1, 1], [2, 4], [3, 9]])) + f(x)=x^2*1.0+x^1*-0.0+x^0*0.0 + >>> print(points_to_polynomial([[1, 3], [2, 6], [3, 11]])) + f(x)=x^2*1.0+x^1*-0.0+x^0*2.0 + >>> print(points_to_polynomial([[1, -3], [2, -6], [3, -11]])) + f(x)=x^2*-1.0+x^1*-0.0+x^0*-2.0 + >>> print(points_to_polynomial([[1, 5], [2, 2], [3, 9]])) + f(x)=x^2*5.0+x^1*-18.0+x^0*18.0 + """ + try: + check = 1 + more_check = 0 + d = coordinates[0][0] + for j in range(len(coordinates)): + if j == 0: + continue + if d == coordinates[j][0]: + more_check += 1 + solved = "x=" + str(coordinates[j][0]) + if more_check == len(coordinates) - 1: + check = 2 + break + elif more_check > 0 and more_check != len(coordinates) - 1: + check = 3 + else: + check = 1 + + if len(coordinates) == 1 and coordinates[0][0] == 0: + check = 2 + solved = "x=0" + except Exception: + check = 3 + + x = len(coordinates) + + if check == 1: + count_of_line = 0 + matrix: list[list[float]] = [] + # put the x and x to the power values in a matrix + while count_of_line < x: + count_in_line = 0 + a = coordinates[count_of_line][0] + count_line: list[float] = [] + while count_in_line < x: + count_line.append(a ** (x - (count_in_line + 1))) + count_in_line += 1 + matrix.append(count_line) + count_of_line += 1 + + count_of_line = 0 + # put the y values into a vector + vector: list[float] = [] + while count_of_line < x: + vector.append(coordinates[count_of_line][1]) + count_of_line += 1 + + count = 0 + + while count < x: + zahlen = 0 + while zahlen < x: + if count == zahlen: + zahlen += 1 + if zahlen == x: + break + bruch = matrix[zahlen][count] / matrix[count][count] + for counting_columns, item in enumerate(matrix[count]): + # manipulating all the values in the matrix + matrix[zahlen][counting_columns] -= item * bruch + # manipulating the values in the vector + vector[zahlen] -= vector[count] * bruch + zahlen += 1 + count += 1 + + count = 0 + # make solutions + solution: list[str] = [] + while count < x: + solution.append(str(vector[count] / matrix[count][count])) + count += 1 + + count = 0 + solved = "f(x)=" + + while count < x: + remove_e: list[str] = solution[count].split("E") + if len(remove_e) > 1: + solution[count] = remove_e[0] + "*10^" + remove_e[1] + solved += "x^" + str(x - (count + 1)) + "*" + str(solution[count]) + if count + 1 != x: + solved += "+" + count += 1 + + return solved + + elif check == 2: + return solved + else: + return "The program cannot work out a fitting polynomial." + + +if __name__ == "__main__": + print(points_to_polynomial([])) + print(points_to_polynomial([[]])) + print(points_to_polynomial([[1, 0], [2, 0], [3, 0]])) + print(points_to_polynomial([[1, 1], [2, 1], [3, 1]])) + print(points_to_polynomial([[1, 3], [2, 3], [3, 3]])) + print(points_to_polynomial([[1, 1], [2, 2], [3, 3]])) + print(points_to_polynomial([[1, 1], [2, 4], [3, 9]])) + print(points_to_polynomial([[1, 3], [2, 6], [3, 11]])) + print(points_to_polynomial([[1, -3], [2, -6], [3, -11]])) + print(points_to_polynomial([[1, 5], [2, 2], [3, 9]])) diff --git a/python-mega-algo/linear_algebra/src/power_iteration.py b/python-mega-algo/linear_algebra/src/power_iteration.py new file mode 100644 index 00000000..2cf22838 --- /dev/null +++ b/python-mega-algo/linear_algebra/src/power_iteration.py @@ -0,0 +1,104 @@ +import numpy as np + + +def power_iteration( + input_matrix: np.ndarray, + vector: np.ndarray, + error_tol: float = 1e-12, + max_iterations: int = 100, +) -> tuple[float, np.ndarray]: + """ + Power Iteration. + Find the largest eignevalue and corresponding eigenvector + of matrix input_matrix given a random vector in the same space. + Will work so long as vector has component of largest eigenvector. + input_matrix must be symmetric. + + Input + input_matrix: input matrix whose largest eigenvalue we will find. + Numpy array. np.shape(input_matrix) == (N,N). + vector: random initial vector in same space as matrix. + Numpy array. np.shape(vector) == (N,) or (N,1) + + Output + largest_eigenvalue: largest eigenvalue of the matrix input_matrix. + Float. Scalar. + largest_eigenvector: eigenvector corresponding to largest_eigenvalue. + Numpy array. np.shape(largest_eigenvector) == (N,) or (N,1). + + >>> import numpy as np + >>> input_matrix = np.array([ + ... [41, 4, 20], + ... [ 4, 26, 30], + ... [20, 30, 50] + ... ]) + >>> vector = np.array([41,4,20]) + >>> power_iteration(input_matrix,vector) + (79.66086378788381, array([0.44472726, 0.46209842, 0.76725662])) + """ + + # Ensure matrix is square. + assert np.shape(input_matrix)[0] == np.shape(input_matrix)[1] + # Ensure proper dimensionality. + assert np.shape(input_matrix)[0] == np.shape(vector)[0] + + # Set convergence to False. Will define convergence when we exceed max_iterations + # or when we have small changes from one iteration to next. + + convergence = False + lamda_previous = 0 + iterations = 0 + error = 1e12 + + while not convergence: + # Multiple matrix by the vector. + w = np.dot(input_matrix, vector) + # Normalize the resulting output vector. + vector = w / np.linalg.norm(w) + # Find rayleigh quotient + # (faster than usual b/c we know vector is normalized already) + lamda = np.dot(vector.T, np.dot(input_matrix, vector)) + + # Check convergence. + error = np.abs(lamda - lamda_previous) / lamda + iterations += 1 + + if error <= error_tol or iterations >= max_iterations: + convergence = True + + lamda_previous = lamda + + return lamda, vector + + +def test_power_iteration() -> None: + """ + >>> test_power_iteration() # self running tests + """ + # Our implementation. + input_matrix = np.array([[41, 4, 20], [4, 26, 30], [20, 30, 50]]) + vector = np.array([41, 4, 20]) + eigen_value, eigen_vector = power_iteration(input_matrix, vector) + + # Numpy implementation. + + # Get eigen values and eigen vectors using built in numpy + # eigh (eigh used for symmetric or hermetian matrices). + eigen_values, eigen_vectors = np.linalg.eigh(input_matrix) + # Last eigen value is the maximum one. + eigen_value_max = eigen_values[-1] + # Last column in this matrix is eigen vector corresponding to largest eigen value. + eigen_vector_max = eigen_vectors[:, -1] + + # Check our implementation and numpy gives close answers. + assert np.abs(eigen_value - eigen_value_max) <= 1e-6 + # Take absolute values element wise of each eigenvector. + # as they are only unique to a minus sign. + assert np.linalg.norm(np.abs(eigen_vector) - np.abs(eigen_vector_max)) <= 1e-6 + + +if __name__ == "__main__": + import doctest + + doctest.testmod() + test_power_iteration() diff --git a/python-mega-algo/linear_algebra/src/rayleigh_quotient.py b/python-mega-algo/linear_algebra/src/rayleigh_quotient.py new file mode 100644 index 00000000..78083aa7 --- /dev/null +++ b/python-mega-algo/linear_algebra/src/rayleigh_quotient.py @@ -0,0 +1,68 @@ +""" +https://en.wikipedia.org/wiki/Rayleigh_quotient +""" +from typing import Any + +import numpy as np + + +def is_hermitian(matrix: np.ndarray) -> bool: + """ + Checks if a matrix is Hermitian. + >>> import numpy as np + >>> A = np.array([ + ... [2, 2+1j, 4], + ... [2-1j, 3, 1j], + ... [4, -1j, 1]]) + >>> is_hermitian(A) + True + >>> A = np.array([ + ... [2, 2+1j, 4+1j], + ... [2-1j, 3, 1j], + ... [4, -1j, 1]]) + >>> is_hermitian(A) + False + """ + return np.array_equal(matrix, matrix.conjugate().T) + + +def rayleigh_quotient(A: np.ndarray, v: np.ndarray) -> Any: + """ + Returns the Rayleigh quotient of a Hermitian matrix A and + vector v. + >>> import numpy as np + >>> A = np.array([ + ... [1, 2, 4], + ... [2, 3, -1], + ... [4, -1, 1] + ... ]) + >>> v = np.array([ + ... [1], + ... [2], + ... [3] + ... ]) + >>> rayleigh_quotient(A, v) + array([[3.]]) + """ + v_star = v.conjugate().T + v_star_dot = v_star.dot(A) + assert isinstance(v_star_dot, np.ndarray) + return (v_star_dot.dot(v)) / (v_star.dot(v)) + + +def tests() -> None: + A = np.array([[2, 2 + 1j, 4], [2 - 1j, 3, 1j], [4, -1j, 1]]) + v = np.array([[1], [2], [3]]) + assert is_hermitian(A), f"{A} is not hermitian." + print(rayleigh_quotient(A, v)) + + A = np.array([[1, 2, 4], [2, 3, -1], [4, -1, 1]]) + assert is_hermitian(A), f"{A} is not hermitian." + assert rayleigh_quotient(A, v) == float(3) + + +if __name__ == "__main__": + import doctest + + doctest.testmod() + tests() diff --git a/python-mega-algo/linear_algebra/src/right.html b/python-mega-algo/linear_algebra/src/right.html new file mode 100644 index 00000000..6ca87182 --- /dev/null +++ b/python-mega-algo/linear_algebra/src/right.html @@ -0,0 +1,30 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/linear_algebra/src + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + + +
    FileFileFileFile
    conjugate...ent.py polynom_f...nts.py rayleigh_...ent.py transform..._2d.py 
    lib.py power_iteration.py test_line...bra.py __init__.py 
    + +

    +Folders: 1
    +Files: 8
    +Size of all files: 33790 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/linear_algebra/src/test_linear_algebra.py b/python-mega-algo/linear_algebra/src/test_linear_algebra.py new file mode 100644 index 00000000..0954a2d9 --- /dev/null +++ b/python-mega-algo/linear_algebra/src/test_linear_algebra.py @@ -0,0 +1,156 @@ +""" +Created on Mon Feb 26 15:40:07 2018 + +@author: Christian Bender +@license: MIT-license + +This file contains the test-suite for the linear algebra library. +""" +import unittest + +from .lib import Matrix, Vector, axpy, squareZeroMatrix, unitBasisVector, zeroVector + + +class Test(unittest.TestCase): + def test_component(self) -> None: + """ + test for method component + """ + x = Vector([1, 2, 3]) + self.assertEqual(x.component(0), 1) + self.assertEqual(x.component(2), 3) + _ = Vector() + + def test_str(self) -> None: + """ + test for toString() method + """ + x = Vector([0, 0, 0, 0, 0, 1]) + self.assertEqual(str(x), "(0,0,0,0,0,1)") + + def test_size(self) -> None: + """ + test for size()-method + """ + x = Vector([1, 2, 3, 4]) + self.assertEqual(len(x), 4) + + def test_euclidLength(self) -> None: + """ + test for the eulidean length + """ + x = Vector([1, 2]) + self.assertAlmostEqual(x.euclidLength(), 2.236, 3) + + def test_add(self) -> None: + """ + test for + operator + """ + x = Vector([1, 2, 3]) + y = Vector([1, 1, 1]) + self.assertEqual((x + y).component(0), 2) + self.assertEqual((x + y).component(1), 3) + self.assertEqual((x + y).component(2), 4) + + def test_sub(self) -> None: + """ + test for - operator + """ + x = Vector([1, 2, 3]) + y = Vector([1, 1, 1]) + self.assertEqual((x - y).component(0), 0) + self.assertEqual((x - y).component(1), 1) + self.assertEqual((x - y).component(2), 2) + + def test_mul(self) -> None: + """ + test for * operator + """ + x = Vector([1, 2, 3]) + a = Vector([2, -1, 4]) # for test of dot-product + b = Vector([1, -2, -1]) + self.assertEqual(str(x * 3.0), "(3.0,6.0,9.0)") + self.assertEqual((a * b), 0) + + def test_zeroVector(self) -> None: + """ + test for the global function zeroVector(...) + """ + self.assertTrue(str(zeroVector(10)).count("0") == 10) + + def test_unitBasisVector(self) -> None: + """ + test for the global function unitBasisVector(...) + """ + self.assertEqual(str(unitBasisVector(3, 1)), "(0,1,0)") + + def test_axpy(self) -> None: + """ + test for the global function axpy(...) (operation) + """ + x = Vector([1, 2, 3]) + y = Vector([1, 0, 1]) + self.assertEqual(str(axpy(2, x, y)), "(3,4,7)") + + def test_copy(self) -> None: + """ + test for the copy()-method + """ + x = Vector([1, 0, 0, 0, 0, 0]) + y = x.copy() + self.assertEqual(str(x), str(y)) + + def test_changeComponent(self) -> None: + """ + test for the changeComponent(...)-method + """ + x = Vector([1, 0, 0]) + x.changeComponent(0, 0) + x.changeComponent(1, 1) + self.assertEqual(str(x), "(0,1,0)") + + def test_str_matrix(self) -> None: + A = Matrix([[1, 2, 3], [2, 4, 5], [6, 7, 8]], 3, 3) + self.assertEqual("|1,2,3|\n|2,4,5|\n|6,7,8|\n", str(A)) + + def test_determinate(self) -> None: + """ + test for determinate() + """ + A = Matrix([[1, 1, 4, 5], [3, 3, 3, 2], [5, 1, 9, 0], [9, 7, 7, 9]], 4, 4) + self.assertEqual(-376, A.determinate()) + + def test__mul__matrix(self) -> None: + A = Matrix([[1, 2, 3], [4, 5, 6], [7, 8, 9]], 3, 3) + x = Vector([1, 2, 3]) + self.assertEqual("(14,32,50)", str(A * x)) + self.assertEqual("|2,4,6|\n|8,10,12|\n|14,16,18|\n", str(A * 2)) + + def test_changeComponent_matrix(self) -> None: + A = Matrix([[1, 2, 3], [2, 4, 5], [6, 7, 8]], 3, 3) + A.changeComponent(0, 2, 5) + self.assertEqual("|1,2,5|\n|2,4,5|\n|6,7,8|\n", str(A)) + + def test_component_matrix(self) -> None: + A = Matrix([[1, 2, 3], [2, 4, 5], [6, 7, 8]], 3, 3) + self.assertEqual(7, A.component(2, 1), 0.01) + + def test__add__matrix(self) -> None: + A = Matrix([[1, 2, 3], [2, 4, 5], [6, 7, 8]], 3, 3) + B = Matrix([[1, 2, 7], [2, 4, 5], [6, 7, 10]], 3, 3) + self.assertEqual("|2,4,10|\n|4,8,10|\n|12,14,18|\n", str(A + B)) + + def test__sub__matrix(self) -> None: + A = Matrix([[1, 2, 3], [2, 4, 5], [6, 7, 8]], 3, 3) + B = Matrix([[1, 2, 7], [2, 4, 5], [6, 7, 10]], 3, 3) + self.assertEqual("|0,0,-4|\n|0,0,0|\n|0,0,-2|\n", str(A - B)) + + def test_squareZeroMatrix(self) -> None: + self.assertEqual( + "|0,0,0,0,0|\n|0,0,0,0,0|\n|0,0,0,0,0|\n|0,0,0,0,0|" + "\n|0,0,0,0,0|\n", + str(squareZeroMatrix(5)), + ) + + +if __name__ == "__main__": + unittest.main() diff --git a/python-mega-algo/linear_algebra/src/transformations_2d.py b/python-mega-algo/linear_algebra/src/transformations_2d.py new file mode 100644 index 00000000..cdf42100 --- /dev/null +++ b/python-mega-algo/linear_algebra/src/transformations_2d.py @@ -0,0 +1,61 @@ +""" +2D Transformations are regularly used in Linear Algebra. + +I have added the codes for reflection, projection, scaling and rotation 2D matrices. + + scaling(5) = [[5.0, 0.0], [0.0, 5.0]] + rotation(45) = [[0.5253219888177297, -0.8509035245341184], + [0.8509035245341184, 0.5253219888177297]] +projection(45) = [[0.27596319193541496, 0.446998331800279], + [0.446998331800279, 0.7240368080645851]] +reflection(45) = [[0.05064397763545947, 0.893996663600558], + [0.893996663600558, 0.7018070490682369]] +""" +from math import cos, sin + + +def scaling(scaling_factor: float) -> list[list[float]]: + """ + >>> scaling(5) + [[5.0, 0.0], [0.0, 5.0]] + """ + scaling_factor = float(scaling_factor) + return [[scaling_factor * int(x == y) for x in range(2)] for y in range(2)] + + +def rotation(angle: float) -> list[list[float]]: + """ + >>> rotation(45) # doctest: +NORMALIZE_WHITESPACE + [[0.5253219888177297, -0.8509035245341184], + [0.8509035245341184, 0.5253219888177297]] + """ + c, s = cos(angle), sin(angle) + return [[c, -s], [s, c]] + + +def projection(angle: float) -> list[list[float]]: + """ + >>> projection(45) # doctest: +NORMALIZE_WHITESPACE + [[0.27596319193541496, 0.446998331800279], + [0.446998331800279, 0.7240368080645851]] + """ + c, s = cos(angle), sin(angle) + cs = c * s + return [[c * c, cs], [cs, s * s]] + + +def reflection(angle: float) -> list[list[float]]: + """ + >>> reflection(45) # doctest: +NORMALIZE_WHITESPACE + [[0.05064397763545947, 0.893996663600558], + [0.893996663600558, 0.7018070490682369]] + """ + c, s = cos(angle), sin(angle) + cs = c * s + return [[2 * c - 1, 2 * cs], [2 * cs, 2 * s - 1]] + + +print(f" {scaling(5) = }") +print(f" {rotation(45) = }") +print(f"{projection(45) = }") +print(f"{reflection(45) = }") diff --git a/python-mega-algo/machine_learning/__init__.py b/python-mega-algo/machine_learning/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/machine_learning/astar.py b/python-mega-algo/machine_learning/astar.py new file mode 100644 index 00000000..ee3fcff0 --- /dev/null +++ b/python-mega-algo/machine_learning/astar.py @@ -0,0 +1,150 @@ +""" +The A* algorithm combines features of uniform-cost search and pure +heuristic search to efficiently compute optimal solutions. +A* algorithm is a best-first search algorithm in which the cost +associated with a node is f(n) = g(n) + h(n), +where g(n) is the cost of the path from the initial state to node n and +h(n) is the heuristic estimate or the cost or a path +from node n to a goal.A* algorithm introduces a heuristic into a +regular graph-searching algorithm, +essentially planning ahead at each step so a more optimal decision +is made.A* also known as the algorithm with brains +""" +import numpy as np + + +class Cell: + """ + Class cell represents a cell in the world which have the property + position : The position of the represented by tupleof x and y + coordinates initially set to (0,0) + parent : This contains the parent cell object which we visited + before arrinving this cell + g,h,f : The parameters for constructing the heuristic function + which can be any function. for simplicity used line + distance + """ + + def __init__(self): + self.position = (0, 0) + self.parent = None + + self.g = 0 + self.h = 0 + self.f = 0 + + """ + overrides equals method because otherwise cell assign will give + wrong results + """ + + def __eq__(self, cell): + return self.position == cell.position + + def showcell(self): + print(self.position) + + +class Gridworld: + """ + Gridworld class represents the external world here a grid M*M + matrix + world_size: create a numpy array with the given world_size default is 5 + """ + + def __init__(self, world_size=(5, 5)): + self.w = np.zeros(world_size) + self.world_x_limit = world_size[0] + self.world_y_limit = world_size[1] + + def show(self): + print(self.w) + + def get_neigbours(self, cell): + """ + Return the neighbours of cell + """ + neughbour_cord = [ + (-1, -1), + (-1, 0), + (-1, 1), + (0, -1), + (0, 1), + (1, -1), + (1, 0), + (1, 1), + ] + current_x = cell.position[0] + current_y = cell.position[1] + neighbours = [] + for n in neughbour_cord: + x = current_x + n[0] + y = current_y + n[1] + if 0 <= x < self.world_x_limit and 0 <= y < self.world_y_limit: + c = Cell() + c.position = (x, y) + c.parent = cell + neighbours.append(c) + return neighbours + + +def astar(world, start, goal): + """ + Implementation of a start algorithm + world : Object of the world object + start : Object of the cell as start position + stop : Object of the cell as goal position + + >>> p = Gridworld() + >>> start = Cell() + >>> start.position = (0,0) + >>> goal = Cell() + >>> goal.position = (4,4) + >>> astar(p, start, goal) + [(0, 0), (1, 1), (2, 2), (3, 3), (4, 4)] + """ + _open = [] + _closed = [] + _open.append(start) + + while _open: + min_f = np.argmin([n.f for n in _open]) + current = _open[min_f] + _closed.append(_open.pop(min_f)) + if current == goal: + break + for n in world.get_neigbours(current): + for c in _closed: + if c == n: + continue + n.g = current.g + 1 + x1, y1 = n.position + x2, y2 = goal.position + n.h = (y2 - y1) ** 2 + (x2 - x1) ** 2 + n.f = n.h + n.g + + for c in _open: + if c == n and c.f < n.f: + continue + _open.append(n) + path = [] + while current.parent is not None: + path.append(current.position) + current = current.parent + path.append(current.position) + return path[::-1] + + +if __name__ == "__main__": + world = Gridworld() + # stat position and Goal + start = Cell() + start.position = (0, 0) + goal = Cell() + goal.position = (4, 4) + print(f"path from {start.position} to {goal.position}") + s = astar(world, start, goal) + # Just for visual reasons + for i in s: + world.w[i] = 1 + print(world.w) diff --git a/python-mega-algo/machine_learning/data_transformations.py b/python-mega-algo/machine_learning/data_transformations.py new file mode 100644 index 00000000..9e0d747e --- /dev/null +++ b/python-mega-algo/machine_learning/data_transformations.py @@ -0,0 +1,62 @@ +""" +Normalization Wikipedia: https://en.wikipedia.org/wiki/Normalization +Normalization is the process of converting numerical data to a standard range of values. +This range is typically between [0, 1] or [-1, 1]. The equation for normalization is +x_norm = (x - x_min)/(x_max - x_min) where x_norm is the normalized value, x is the +value, x_min is the minimum value within the column or list of data, and x_max is the +maximum value within the column or list of data. Normalization is used to speed up the +training of data and put all of the data on a similar scale. This is useful because +variance in the range of values of a dataset can heavily impact optimization +(particularly Gradient Descent). + +Standardization Wikipedia: https://en.wikipedia.org/wiki/Standardization +Standardization is the process of converting numerical data to a normally distributed +range of values. This range will have a mean of 0 and standard deviation of 1. This is +also known as z-score normalization. The equation for standardization is +x_std = (x - mu)/(sigma) where mu is the mean of the column or list of values and sigma +is the standard deviation of the column or list of values. + +Choosing between Normalization & Standardization is more of an art of a science, but it +is often recommended to run experiments with both to see which performs better. +Additionally, a few rules of thumb are: + 1. gaussian (normal) distributions work better with standardization + 2. non-gaussian (non-normal) distributions work better with normalization + 3. If a column or list of values has extreme values / outliers, use standardization +""" +from statistics import mean, stdev + + +def normalization(data: list, ndigits: int = 3) -> list: + """ + Returns a normalized list of values + @params: data, a list of values to normalize + @returns: a list of normalized values (rounded to ndigits decimal places) + @examples: + >>> normalization([2, 7, 10, 20, 30, 50]) + [0.0, 0.104, 0.167, 0.375, 0.583, 1.0] + >>> normalization([5, 10, 15, 20, 25]) + [0.0, 0.25, 0.5, 0.75, 1.0] + """ + # variables for calculation + x_min = min(data) + x_max = max(data) + # normalize data + return [round((x - x_min) / (x_max - x_min), ndigits) for x in data] + + +def standardization(data: list, ndigits: int = 3) -> list: + """ + Returns a standardized list of values + @params: data, a list of values to standardize + @returns: a list of standardized values (rounded to ndigits decimal places) + @examples: + >>> standardization([2, 7, 10, 20, 30, 50]) + [-0.999, -0.719, -0.551, 0.009, 0.57, 1.69] + >>> standardization([5, 10, 15, 20, 25]) + [-1.265, -0.632, 0.0, 0.632, 1.265] + """ + # variables for calculation + mu = mean(data) + sigma = stdev(data) + # standardize data + return [round((x - mu) / (sigma), ndigits) for x in data] diff --git a/python-mega-algo/machine_learning/decision_tree.py b/python-mega-algo/machine_learning/decision_tree.py new file mode 100644 index 00000000..ace6fb0f --- /dev/null +++ b/python-mega-algo/machine_learning/decision_tree.py @@ -0,0 +1,181 @@ +""" +Implementation of a basic regression decision tree. +Input data set: The input data set must be 1-dimensional with continuous labels. +Output: The decision tree maps a real number input to a real number output. +""" +import numpy as np + + +class Decision_Tree: + def __init__(self, depth=5, min_leaf_size=5): + self.depth = depth + self.decision_boundary = 0 + self.left = None + self.right = None + self.min_leaf_size = min_leaf_size + self.prediction = None + + def mean_squared_error(self, labels, prediction): + """ + mean_squared_error: + @param labels: a one dimensional numpy array + @param prediction: a floating point value + return value: mean_squared_error calculates the error if prediction is used to + estimate the labels + >>> tester = Decision_Tree() + >>> test_labels = np.array([1,2,3,4,5,6,7,8,9,10]) + >>> test_prediction = np.float(6) + >>> tester.mean_squared_error(test_labels, test_prediction) == ( + ... Test_Decision_Tree.helper_mean_squared_error_test(test_labels, + ... test_prediction)) + True + >>> test_labels = np.array([1,2,3]) + >>> test_prediction = np.float(2) + >>> tester.mean_squared_error(test_labels, test_prediction) == ( + ... Test_Decision_Tree.helper_mean_squared_error_test(test_labels, + ... test_prediction)) + True + """ + if labels.ndim != 1: + print("Error: Input labels must be one dimensional") + + return np.mean((labels - prediction) ** 2) + + def train(self, X, y): + """ + train: + @param X: a one dimensional numpy array + @param y: a one dimensional numpy array. + The contents of y are the labels for the corresponding X values + + train does not have a return value + """ + + """ + this section is to check that the inputs conform to our dimensionality + constraints + """ + if X.ndim != 1: + print("Error: Input data set must be one dimensional") + return + if len(X) != len(y): + print("Error: X and y have different lengths") + return + if y.ndim != 1: + print("Error: Data set labels must be one dimensional") + return + + if len(X) < 2 * self.min_leaf_size: + self.prediction = np.mean(y) + return + + if self.depth == 1: + self.prediction = np.mean(y) + return + + best_split = 0 + min_error = self.mean_squared_error(X, np.mean(y)) * 2 + + """ + loop over all possible splits for the decision tree. find the best split. + if no split exists that is less than 2 * error for the entire array + then the data set is not split and the average for the entire array is used as + the predictor + """ + for i in range(len(X)): + if len(X[:i]) < self.min_leaf_size: + continue + elif len(X[i:]) < self.min_leaf_size: + continue + else: + error_left = self.mean_squared_error(X[:i], np.mean(y[:i])) + error_right = self.mean_squared_error(X[i:], np.mean(y[i:])) + error = error_left + error_right + if error < min_error: + best_split = i + min_error = error + + if best_split != 0: + left_X = X[:best_split] + left_y = y[:best_split] + right_X = X[best_split:] + right_y = y[best_split:] + + self.decision_boundary = X[best_split] + self.left = Decision_Tree( + depth=self.depth - 1, min_leaf_size=self.min_leaf_size + ) + self.right = Decision_Tree( + depth=self.depth - 1, min_leaf_size=self.min_leaf_size + ) + self.left.train(left_X, left_y) + self.right.train(right_X, right_y) + else: + self.prediction = np.mean(y) + + return + + def predict(self, x): + """ + predict: + @param x: a floating point value to predict the label of + the prediction function works by recursively calling the predict function + of the appropriate subtrees based on the tree's decision boundary + """ + if self.prediction is not None: + return self.prediction + elif self.left or self.right is not None: + if x >= self.decision_boundary: + return self.right.predict(x) + else: + return self.left.predict(x) + else: + print("Error: Decision tree not yet trained") + return None + + +class Test_Decision_Tree: + """Decision Tres test class""" + + @staticmethod + def helper_mean_squared_error_test(labels, prediction): + """ + helper_mean_squared_error_test: + @param labels: a one dimensional numpy array + @param prediction: a floating point value + return value: helper_mean_squared_error_test calculates the mean squared error + """ + squared_error_sum = np.float(0) + for label in labels: + squared_error_sum += (label - prediction) ** 2 + + return np.float(squared_error_sum / labels.size) + + +def main(): + """ + In this demonstration we're generating a sample data set from the sin function in + numpy. We then train a decision tree on the data set and use the decision tree to + predict the label of 10 different test values. Then the mean squared error over + this test is displayed. + """ + X = np.arange(-1.0, 1.0, 0.005) + y = np.sin(X) + + tree = Decision_Tree(depth=10, min_leaf_size=10) + tree.train(X, y) + + test_cases = (np.random.rand(10) * 2) - 1 + predictions = np.array([tree.predict(x) for x in test_cases]) + avg_error = np.mean((predictions - test_cases) ** 2) + + print("Test values: " + str(test_cases)) + print("Predictions: " + str(predictions)) + print("Average error: " + str(avg_error)) + + +if __name__ == "__main__": + main() + import doctest + + doctest.testmod(name="mean_squarred_error", verbose=True) diff --git a/python-mega-algo/machine_learning/forecasting/__init__.py b/python-mega-algo/machine_learning/forecasting/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/machine_learning/forecasting/ex_data.csv b/python-mega-algo/machine_learning/forecasting/ex_data.csv new file mode 100644 index 00000000..1c429e64 --- /dev/null +++ b/python-mega-algo/machine_learning/forecasting/ex_data.csv @@ -0,0 +1,114 @@ +total_user,total_events,days +18231,0.0,1 +22621,1.0,2 +15675,0.0,3 +23583,1.0,4 +68351,5.0,5 +34338,3.0,6 +19238,0.0,0 +24192,0.0,1 +70349,0.0,2 +103510,0.0,3 +128355,1.0,4 +148484,6.0,5 +153489,3.0,6 +162667,1.0,0 +311430,3.0,1 +435663,7.0,2 +273526,0.0,3 +628588,2.0,4 +454989,13.0,5 +539040,3.0,6 +52974,1.0,0 +103451,2.0,1 +810020,5.0,2 +580982,3.0,3 +216515,0.0,4 +134694,10.0,5 +93563,1.0,6 +55432,1.0,0 +169634,1.0,1 +254908,4.0,2 +315285,3.0,3 +191764,0.0,4 +514284,7.0,5 +181214,4.0,6 +78459,2.0,0 +161620,3.0,1 +245610,4.0,2 +326722,5.0,3 +214578,0.0,4 +312365,5.0,5 +232454,4.0,6 +178368,1.0,0 +97152,1.0,1 +222813,4.0,2 +285852,4.0,3 +192149,1.0,4 +142241,1.0,5 +173011,2.0,6 +56488,3.0,0 +89572,2.0,1 +356082,2.0,2 +172799,0.0,3 +142300,1.0,4 +78432,2.0,5 +539023,9.0,6 +62389,1.0,0 +70247,1.0,1 +89229,0.0,2 +94583,1.0,3 +102455,0.0,4 +129270,0.0,5 +311409,1.0,6 +1837026,0.0,0 +361824,0.0,1 +111379,2.0,2 +76337,2.0,3 +96747,0.0,4 +92058,0.0,5 +81929,2.0,6 +143423,0.0,0 +82939,0.0,1 +74403,1.0,2 +68234,0.0,3 +94556,1.0,4 +80311,0.0,5 +75283,3.0,6 +77724,0.0,0 +49229,2.0,1 +65708,2.0,2 +273864,1.0,3 +1711281,0.0,4 +1900253,5.0,5 +343071,1.0,6 +1551326,0.0,0 +56636,1.0,1 +272782,2.0,2 +1785678,0.0,3 +241866,0.0,4 +461904,0.0,5 +2191901,2.0,6 +102925,0.0,0 +242778,1.0,1 +298608,0.0,2 +322458,10.0,3 +216027,9.0,4 +916052,12.0,5 +193278,12.0,6 +263207,8.0,0 +672948,10.0,1 +281909,1.0,2 +384562,1.0,3 +1027375,2.0,4 +828905,9.0,5 +624188,22.0,6 +392218,8.0,0 +292581,10.0,1 +299869,12.0,2 +769455,20.0,3 +316443,8.0,4 +1212864,24.0,5 +1397338,28.0,6 +223249,8.0,0 +191264,14.0,1 diff --git a/python-mega-algo/machine_learning/forecasting/right.html b/python-mega-algo/machine_learning/forecasting/right.html new file mode 100644 index 00000000..b7d6a28b --- /dev/null +++ b/python-mega-algo/machine_learning/forecasting/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/machine_learning/forecasting + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    ex_data.csv run.py __init__.py 
    + +

    +Folders: 1
    +Files: 3
    +Size of all files: 7124 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/machine_learning/forecasting/run.py b/python-mega-algo/machine_learning/forecasting/run.py new file mode 100644 index 00000000..b11a2301 --- /dev/null +++ b/python-mega-algo/machine_learning/forecasting/run.py @@ -0,0 +1,156 @@ +""" +this is code for forecasting +but i modified it and used it for safety checker of data +for ex: you have a online shop and for some reason some data are +missing (the amount of data that u expected are not supposed to be) + then we can use it +*ps : 1. ofc we can use normal statistic method but in this case + the data is quite absurd and only a little^^ + 2. ofc u can use this and modified it for forecasting purpose + for the next 3 months sales or something, + u can just adjust it for ur own purpose +""" + +import numpy as np +import pandas as pd +from sklearn.preprocessing import Normalizer +from sklearn.svm import SVR +from statsmodels.tsa.statespace.sarimax import SARIMAX + + +def linear_regression_prediction( + train_dt: list, train_usr: list, train_mtch: list, test_dt: list, test_mtch: list +) -> float: + """ + First method: linear regression + input : training data (date, total_user, total_event) in list of float + output : list of total user prediction in float + >>> n = linear_regression_prediction([2,3,4,5], [5,3,4,6], [3,1,2,4], [2,1], [2,2]) + >>> abs(n - 5.0) < 1e-6 # Checking precision because of floating point errors + True + """ + x = np.array([[1, item, train_mtch[i]] for i, item in enumerate(train_dt)]) + y = np.array(train_usr) + beta = np.dot(np.dot(np.linalg.inv(np.dot(x.transpose(), x)), x.transpose()), y) + return abs(beta[0] + test_dt[0] * beta[1] + test_mtch[0] + beta[2]) + + +def sarimax_predictor(train_user: list, train_match: list, test_match: list) -> float: + """ + second method: Sarimax + sarimax is a statistic method which using previous input + and learn its pattern to predict future data + input : training data (total_user, with exog data = total_event) in list of float + output : list of total user prediction in float + >>> sarimax_predictor([4,2,6,8], [3,1,2,4], [2]) + 6.6666671111109626 + """ + order = (1, 2, 1) + seasonal_order = (1, 1, 0, 7) + model = SARIMAX( + train_user, exog=train_match, order=order, seasonal_order=seasonal_order + ) + model_fit = model.fit(disp=False, maxiter=600, method="nm") + result = model_fit.predict(1, len(test_match), exog=[test_match]) + return result[0] + + +def support_vector_regressor(x_train: list, x_test: list, train_user: list) -> float: + """ + Third method: Support vector regressor + svr is quite the same with svm(support vector machine) + it uses the same principles as the SVM for classification, + with only a few minor differences and the only different is that + it suits better for regression purpose + input : training data (date, total_user, total_event) in list of float + where x = list of set (date and total event) + output : list of total user prediction in float + >>> support_vector_regressor([[5,2],[1,5],[6,2]], [[3,2]], [2,1,4]) + 1.634932078116079 + """ + regressor = SVR(kernel="rbf", C=1, gamma=0.1, epsilon=0.1) + regressor.fit(x_train, train_user) + y_pred = regressor.predict(x_test) + return y_pred[0] + + +def interquartile_range_checker(train_user: list) -> float: + """ + Optional method: interquatile range + input : list of total user in float + output : low limit of input in float + this method can be used to check whether some data is outlier or not + >>> interquartile_range_checker([1,2,3,4,5,6,7,8,9,10]) + 2.8 + """ + train_user.sort() + q1 = np.percentile(train_user, 25) + q3 = np.percentile(train_user, 75) + iqr = q3 - q1 + low_lim = q1 - (iqr * 0.1) + return low_lim + + +def data_safety_checker(list_vote: list, actual_result: float) -> None: + """ + Used to review all the votes (list result prediction) + and compare it to the actual result. + input : list of predictions + output : print whether it's safe or not + >>> data_safety_checker([2,3,4],5.0) + Today's data is not safe. + """ + safe = 0 + not_safe = 0 + for i in list_vote: + if i > actual_result: + safe = not_safe + 1 + else: + if abs(abs(i) - abs(actual_result)) <= 0.1: + safe = safe + 1 + else: + not_safe = not_safe + 1 + print(f"Today's data is {'not ' if safe <= not_safe else ''}safe.") + + +# data_input_df = pd.read_csv("ex_data.csv", header=None) +data_input = [[18231, 0.0, 1], [22621, 1.0, 2], [15675, 0.0, 3], [23583, 1.0, 4]] +data_input_df = pd.DataFrame(data_input, columns=["total_user", "total_even", "days"]) + +""" +data column = total user in a day, how much online event held in one day, +what day is that(sunday-saturday) +""" + +# start normalization +normalize_df = Normalizer().fit_transform(data_input_df.values) +# split data +total_date = normalize_df[:, 2].tolist() +total_user = normalize_df[:, 0].tolist() +total_match = normalize_df[:, 1].tolist() + +# for svr (input variable = total date and total match) +x = normalize_df[:, [1, 2]].tolist() +x_train = x[: len(x) - 1] +x_test = x[len(x) - 1 :] + +# for linear reression & sarimax +trn_date = total_date[: len(total_date) - 1] +trn_user = total_user[: len(total_user) - 1] +trn_match = total_match[: len(total_match) - 1] + +tst_date = total_date[len(total_date) - 1 :] +tst_user = total_user[len(total_user) - 1 :] +tst_match = total_match[len(total_match) - 1 :] + + +# voting system with forecasting +res_vote = [] +res_vote.append( + linear_regression_prediction(trn_date, trn_user, trn_match, tst_date, tst_match) +) +res_vote.append(sarimax_predictor(trn_user, trn_match, tst_match)) +res_vote.append(support_vector_regressor(x_train, x_test, trn_user)) + +# check the safety of todays'data^^ +data_safety_checker(res_vote, tst_user) diff --git a/python-mega-algo/machine_learning/gaussian_naive_bayes.py b/python-mega-algo/machine_learning/gaussian_naive_bayes.py new file mode 100644 index 00000000..c200aa5a --- /dev/null +++ b/python-mega-algo/machine_learning/gaussian_naive_bayes.py @@ -0,0 +1,44 @@ +# Gaussian Naive Bayes Example +from matplotlib import pyplot as plt +from sklearn.datasets import load_iris +from sklearn.metrics import plot_confusion_matrix +from sklearn.model_selection import train_test_split +from sklearn.naive_bayes import GaussianNB + + +def main(): + + """ + Gaussian Naive Bayes Example using sklearn function. + Iris type dataset is used to demonstrate algorithm. + """ + + # Load Iris dataset + iris = load_iris() + + # Split dataset into train and test data + X = iris["data"] # features + Y = iris["target"] + x_train, x_test, y_train, y_test = train_test_split( + X, Y, test_size=0.3, random_state=1 + ) + + # Gaussian Naive Bayes + NB_model = GaussianNB() + NB_model.fit(x_train, y_train) + + # Display Confusion Matrix + plot_confusion_matrix( + NB_model, + x_test, + y_test, + display_labels=iris["target_names"], + cmap="Blues", + normalize="true", + ) + plt.title("Normalized Confusion Matrix - IRIS Dataset") + plt.show() + + +if __name__ == "__main__": + main() diff --git a/python-mega-algo/machine_learning/gradient_boosting_regressor.py b/python-mega-algo/machine_learning/gradient_boosting_regressor.py new file mode 100644 index 00000000..0aa0e7a1 --- /dev/null +++ b/python-mega-algo/machine_learning/gradient_boosting_regressor.py @@ -0,0 +1,66 @@ +"""Implementation of GradientBoostingRegressor in sklearn using the + boston dataset which is very popular for regression problem to + predict house price. +""" + +import matplotlib.pyplot as plt +import pandas as pd +from sklearn.datasets import load_boston +from sklearn.ensemble import GradientBoostingRegressor +from sklearn.metrics import mean_squared_error, r2_score +from sklearn.model_selection import train_test_split + + +def main(): + + # loading the dataset from the sklearn + df = load_boston() + print(df.keys()) + # now let construct a data frame + df_boston = pd.DataFrame(df.data, columns=df.feature_names) + # let add the target to the dataframe + df_boston["Price"] = df.target + # print the first five rows using the head function + print(df_boston.head()) + # Summary statistics + print(df_boston.describe().T) + # Feature selection + + X = df_boston.iloc[:, :-1] + y = df_boston.iloc[:, -1] # target variable + # split the data with 75% train and 25% test sets. + X_train, X_test, y_train, y_test = train_test_split( + X, y, random_state=0, test_size=0.25 + ) + + model = GradientBoostingRegressor( + n_estimators=500, max_depth=5, min_samples_split=4, learning_rate=0.01 + ) + # training the model + model.fit(X_train, y_train) + # to see how good the model fit the data + training_score = model.score(X_train, y_train).round(3) + test_score = model.score(X_test, y_test).round(3) + print("Training score of GradientBoosting is :", training_score) + print("The test score of GradientBoosting is :", test_score) + # Let us evaluation the model by finding the errors + y_pred = model.predict(X_test) + + # The mean squared error + print("Mean squared error: %.2f" % mean_squared_error(y_test, y_pred)) + # Explained variance score: 1 is perfect prediction + print("Test Variance score: %.2f" % r2_score(y_test, y_pred)) + + # So let's run the model against the test data + fig, ax = plt.subplots() + ax.scatter(y_test, y_pred, edgecolors=(0, 0, 0)) + ax.plot([y_test.min(), y_test.max()], [y_test.min(), y_test.max()], "k--", lw=4) + ax.set_xlabel("Actual") + ax.set_ylabel("Predicted") + ax.set_title("Truth vs Predicted") + # this show function will display the plotting + plt.show() + + +if __name__ == "__main__": + main() diff --git a/python-mega-algo/machine_learning/gradient_descent.py b/python-mega-algo/machine_learning/gradient_descent.py new file mode 100644 index 00000000..9fa460a0 --- /dev/null +++ b/python-mega-algo/machine_learning/gradient_descent.py @@ -0,0 +1,136 @@ +""" +Implementation of gradient descent algorithm for minimizing cost of a linear hypothesis +function. +""" +import numpy + +# List of input, output pairs +train_data = ( + ((5, 2, 3), 15), + ((6, 5, 9), 25), + ((11, 12, 13), 41), + ((1, 1, 1), 8), + ((11, 12, 13), 41), +) +test_data = (((515, 22, 13), 555), ((61, 35, 49), 150)) +parameter_vector = [2, 4, 1, 5] +m = len(train_data) +LEARNING_RATE = 0.009 + + +def _error(example_no, data_set="train"): + """ + :param data_set: train data or test data + :param example_no: example number whose error has to be checked + :return: error in example pointed by example number. + """ + return calculate_hypothesis_value(example_no, data_set) - output( + example_no, data_set + ) + + +def _hypothesis_value(data_input_tuple): + """ + Calculates hypothesis function value for a given input + :param data_input_tuple: Input tuple of a particular example + :return: Value of hypothesis function at that point. + Note that there is an 'biased input' whose value is fixed as 1. + It is not explicitly mentioned in input data.. But, ML hypothesis functions use it. + So, we have to take care of it separately. Line 36 takes care of it. + """ + hyp_val = 0 + for i in range(len(parameter_vector) - 1): + hyp_val += data_input_tuple[i] * parameter_vector[i + 1] + hyp_val += parameter_vector[0] + return hyp_val + + +def output(example_no, data_set): + """ + :param data_set: test data or train data + :param example_no: example whose output is to be fetched + :return: output for that example + """ + if data_set == "train": + return train_data[example_no][1] + elif data_set == "test": + return test_data[example_no][1] + + +def calculate_hypothesis_value(example_no, data_set): + """ + Calculates hypothesis value for a given example + :param data_set: test data or train_data + :param example_no: example whose hypothesis value is to be calculated + :return: hypothesis value for that example + """ + if data_set == "train": + return _hypothesis_value(train_data[example_no][0]) + elif data_set == "test": + return _hypothesis_value(test_data[example_no][0]) + + +def summation_of_cost_derivative(index, end=m): + """ + Calculates the sum of cost function derivative + :param index: index wrt derivative is being calculated + :param end: value where summation ends, default is m, number of examples + :return: Returns the summation of cost derivative + Note: If index is -1, this means we are calculating summation wrt to biased + parameter. + """ + summation_value = 0 + for i in range(end): + if index == -1: + summation_value += _error(i) + else: + summation_value += _error(i) * train_data[i][0][index] + return summation_value + + +def get_cost_derivative(index): + """ + :param index: index of the parameter vector wrt to derivative is to be calculated + :return: derivative wrt to that index + Note: If index is -1, this means we are calculating summation wrt to biased + parameter. + """ + cost_derivative_value = summation_of_cost_derivative(index, m) / m + return cost_derivative_value + + +def run_gradient_descent(): + global parameter_vector + # Tune these values to set a tolerance value for predicted output + absolute_error_limit = 0.000002 + relative_error_limit = 0 + j = 0 + while True: + j += 1 + temp_parameter_vector = [0, 0, 0, 0] + for i in range(0, len(parameter_vector)): + cost_derivative = get_cost_derivative(i - 1) + temp_parameter_vector[i] = ( + parameter_vector[i] - LEARNING_RATE * cost_derivative + ) + if numpy.allclose( + parameter_vector, + temp_parameter_vector, + atol=absolute_error_limit, + rtol=relative_error_limit, + ): + break + parameter_vector = temp_parameter_vector + print(("Number of iterations:", j)) + + +def test_gradient_descent(): + for i in range(len(test_data)): + print(("Actual output value:", output(i, "test"))) + print(("Hypothesis output:", calculate_hypothesis_value(i, "test"))) + + +if __name__ == "__main__": + run_gradient_descent() + print("\nTesting gradient descent for a linear hypothesis function.\n") + test_gradient_descent() diff --git a/python-mega-algo/machine_learning/k_means_clust.py b/python-mega-algo/machine_learning/k_means_clust.py new file mode 100644 index 00000000..c45be8a4 --- /dev/null +++ b/python-mega-algo/machine_learning/k_means_clust.py @@ -0,0 +1,353 @@ +"""README, Author - Anurag Kumar(mailto:anuragkumarak95@gmail.com) +Requirements: + - sklearn + - numpy + - matplotlib +Python: + - 3.5 +Inputs: + - X , a 2D numpy array of features. + - k , number of clusters to create. + - initial_centroids , initial centroid values generated by utility function(mentioned + in usage). + - maxiter , maximum number of iterations to process. + - heterogeneity , empty list that will be filled with hetrogeneity values if passed + to kmeans func. +Usage: + 1. define 'k' value, 'X' features array and 'hetrogeneity' empty list + 2. create initial_centroids, + initial_centroids = get_initial_centroids( + X, + k, + seed=0 # seed value for initial centroid generation, + # None for randomness(default=None) + ) + 3. find centroids and clusters using kmeans function. + centroids, cluster_assignment = kmeans( + X, + k, + initial_centroids, + maxiter=400, + record_heterogeneity=heterogeneity, + verbose=True # whether to print logs in console or not.(default=False) + ) + 4. Plot the loss function, hetrogeneity values for every iteration saved in + hetrogeneity list. + plot_heterogeneity( + heterogeneity, + k + ) + 5. Transfers Dataframe into excel format it must have feature called + 'Clust' with k means clustering numbers in it. +""" +import warnings + +import numpy as np +import pandas as pd +from matplotlib import pyplot as plt +from sklearn.metrics import pairwise_distances + +warnings.filterwarnings("ignore") + +TAG = "K-MEANS-CLUST/ " + + +def get_initial_centroids(data, k, seed=None): + """Randomly choose k data points as initial centroids""" + if seed is not None: # useful for obtaining consistent results + np.random.seed(seed) + n = data.shape[0] # number of data points + + # Pick K indices from range [0, N). + rand_indices = np.random.randint(0, n, k) + + # Keep centroids as dense format, as many entries will be nonzero due to averaging. + # As long as at least one document in a cluster contains a word, + # it will carry a nonzero weight in the TF-IDF vector of the centroid. + centroids = data[rand_indices, :] + + return centroids + + +def centroid_pairwise_dist(X, centroids): + return pairwise_distances(X, centroids, metric="euclidean") + + +def assign_clusters(data, centroids): + + # Compute distances between each data point and the set of centroids: + # Fill in the blank (RHS only) + distances_from_centroids = centroid_pairwise_dist(data, centroids) + + # Compute cluster assignments for each data point: + # Fill in the blank (RHS only) + cluster_assignment = np.argmin(distances_from_centroids, axis=1) + + return cluster_assignment + + +def revise_centroids(data, k, cluster_assignment): + new_centroids = [] + for i in range(k): + # Select all data points that belong to cluster i. Fill in the blank (RHS only) + member_data_points = data[cluster_assignment == i] + # Compute the mean of the data points. Fill in the blank (RHS only) + centroid = member_data_points.mean(axis=0) + new_centroids.append(centroid) + new_centroids = np.array(new_centroids) + + return new_centroids + + +def compute_heterogeneity(data, k, centroids, cluster_assignment): + + heterogeneity = 0.0 + for i in range(k): + + # Select all data points that belong to cluster i. Fill in the blank (RHS only) + member_data_points = data[cluster_assignment == i, :] + + if member_data_points.shape[0] > 0: # check if i-th cluster is non-empty + # Compute distances from centroid to data points (RHS only) + distances = pairwise_distances( + member_data_points, [centroids[i]], metric="euclidean" + ) + squared_distances = distances ** 2 + heterogeneity += np.sum(squared_distances) + + return heterogeneity + + +def plot_heterogeneity(heterogeneity, k): + plt.figure(figsize=(7, 4)) + plt.plot(heterogeneity, linewidth=4) + plt.xlabel("# Iterations") + plt.ylabel("Heterogeneity") + plt.title(f"Heterogeneity of clustering over time, K={k:d}") + plt.rcParams.update({"font.size": 16}) + plt.show() + + +def kmeans( + data, k, initial_centroids, maxiter=500, record_heterogeneity=None, verbose=False +): + """This function runs k-means on given data and initial set of centroids. + maxiter: maximum number of iterations to run.(default=500) + record_heterogeneity: (optional) a list, to store the history of heterogeneity + as function of iterations + if None, do not store the history. + verbose: if True, print how many data points changed their cluster labels in + each iteration""" + centroids = initial_centroids[:] + prev_cluster_assignment = None + + for itr in range(maxiter): + if verbose: + print(itr, end="") + + # 1. Make cluster assignments using nearest centroids + cluster_assignment = assign_clusters(data, centroids) + + # 2. Compute a new centroid for each of the k clusters, averaging all data + # points assigned to that cluster. + centroids = revise_centroids(data, k, cluster_assignment) + + # Check for convergence: if none of the assignments changed, stop + if ( + prev_cluster_assignment is not None + and (prev_cluster_assignment == cluster_assignment).all() + ): + break + + # Print number of new assignments + if prev_cluster_assignment is not None: + num_changed = np.sum(prev_cluster_assignment != cluster_assignment) + if verbose: + print( + " {:5d} elements changed their cluster assignment.".format( + num_changed + ) + ) + + # Record heterogeneity convergence metric + if record_heterogeneity is not None: + # YOUR CODE HERE + score = compute_heterogeneity(data, k, centroids, cluster_assignment) + record_heterogeneity.append(score) + + prev_cluster_assignment = cluster_assignment[:] + + return centroids, cluster_assignment + + +# Mock test below +if False: # change to true to run this test case. + from sklearn import datasets as ds + + dataset = ds.load_iris() + k = 3 + heterogeneity = [] + initial_centroids = get_initial_centroids(dataset["data"], k, seed=0) + centroids, cluster_assignment = kmeans( + dataset["data"], + k, + initial_centroids, + maxiter=400, + record_heterogeneity=heterogeneity, + verbose=True, + ) + plot_heterogeneity(heterogeneity, k) + + +def ReportGenerator( + df: pd.DataFrame, ClusteringVariables: np.ndarray, FillMissingReport=None +) -> pd.DataFrame: + """ + Function generates easy-erading clustering report. It takes 2 arguments as an input: + DataFrame - dataframe with predicted cluester column; + FillMissingReport - dictionary of rules how we are going to fill missing + values of for final report generate (not included in modeling); + in order to run the function following libraries must be imported: + import pandas as pd + import numpy as np + >>> data = pd.DataFrame() + >>> data['numbers'] = [1, 2, 3] + >>> data['col1'] = [0.5, 2.5, 4.5] + >>> data['col2'] = [100, 200, 300] + >>> data['col3'] = [10, 20, 30] + >>> data['Cluster'] = [1, 1, 2] + >>> ReportGenerator(data, ['col1', 'col2'], 0) + Features Type Mark 1 2 + 0 # of Customers ClusterSize False 2.000000 1.000000 + 1 % of Customers ClusterProportion False 0.666667 0.333333 + 2 col1 mean_with_zeros True 1.500000 4.500000 + 3 col2 mean_with_zeros True 150.000000 300.000000 + 4 numbers mean_with_zeros False 1.500000 3.000000 + .. ... ... ... ... ... + 99 dummy 5% False 1.000000 1.000000 + 100 dummy 95% False 1.000000 1.000000 + 101 dummy stdev False 0.000000 NaN + 102 dummy mode False 1.000000 1.000000 + 103 dummy median False 1.000000 1.000000 + + [104 rows x 5 columns] + """ + # Fill missing values with given rules + if FillMissingReport: + df.fillna(value=FillMissingReport, inplace=True) + df["dummy"] = 1 + numeric_cols = df.select_dtypes(np.number).columns + report = ( + df.groupby(["Cluster"])[ # construct report dataframe + numeric_cols + ] # group by cluster number + .agg( + [ + ("sum", np.sum), + ("mean_with_zeros", lambda x: np.mean(np.nan_to_num(x))), + ("mean_without_zeros", lambda x: x.replace(0, np.NaN).mean()), + ( + "mean_25-75", + lambda x: np.mean( + np.nan_to_num( + sorted(x)[ + round(len(x) * 25 / 100) : round(len(x) * 75 / 100) + ] + ) + ), + ), + ("mean_with_na", np.mean), + ("min", lambda x: x.min()), + ("5%", lambda x: x.quantile(0.05)), + ("25%", lambda x: x.quantile(0.25)), + ("50%", lambda x: x.quantile(0.50)), + ("75%", lambda x: x.quantile(0.75)), + ("95%", lambda x: x.quantile(0.95)), + ("max", lambda x: x.max()), + ("count", lambda x: x.count()), + ("stdev", lambda x: x.std()), + ("mode", lambda x: x.mode()[0]), + ("median", lambda x: x.median()), + ("# > 0", lambda x: (x > 0).sum()), + ] + ) + .T.reset_index() + .rename(index=str, columns={"level_0": "Features", "level_1": "Type"}) + ) # rename columns + # calculate the size of cluster(count of clientID's) + clustersize = report[ + (report["Features"] == "dummy") & (report["Type"] == "count") + ].copy() # avoid SettingWithCopyWarning + clustersize.Type = ( + "ClusterSize" # rename created cluster df to match report column names + ) + clustersize.Features = "# of Customers" + clusterproportion = pd.DataFrame( + clustersize.iloc[:, 2:].values + / clustersize.iloc[:, 2:].values.sum() # calculating the proportion of cluster + ) + clusterproportion[ + "Type" + ] = "% of Customers" # rename created cluster df to match report column names + clusterproportion["Features"] = "ClusterProportion" + cols = clusterproportion.columns.tolist() + cols = cols[-2:] + cols[:-2] + clusterproportion = clusterproportion[cols] # rearrange columns to match report + clusterproportion.columns = report.columns + a = pd.DataFrame( + abs( + report[report["Type"] == "count"].iloc[:, 2:].values + - clustersize.iloc[:, 2:].values + ) + ) # generating df with count of nan values + a["Features"] = 0 + a["Type"] = "# of nan" + a.Features = report[ + report["Type"] == "count" + ].Features.tolist() # filling values in order to match report + cols = a.columns.tolist() + cols = cols[-2:] + cols[:-2] + a = a[cols] # rearrange columns to match report + a.columns = report.columns # rename columns to match report + report = report.drop( + report[report.Type == "count"].index + ) # drop count values except cluster size + report = pd.concat( + [report, a, clustersize, clusterproportion], axis=0 + ) # concat report with clustert size and nan values + report["Mark"] = report["Features"].isin(ClusteringVariables) + cols = report.columns.tolist() + cols = cols[0:2] + cols[-1:] + cols[2:-1] + report = report[cols] + sorter1 = { + "ClusterSize": 9, + "ClusterProportion": 8, + "mean_with_zeros": 7, + "mean_with_na": 6, + "max": 5, + "50%": 4, + "min": 3, + "25%": 2, + "75%": 1, + "# of nan": 0, + "# > 0": -1, + "sum_with_na": -2, + } + report = ( + report.assign( + Sorter1=lambda x: x.Type.map(sorter1), + Sorter2=lambda x: list(reversed(range(len(x)))), + ) + .sort_values(["Sorter1", "Mark", "Sorter2"], ascending=False) + .drop(["Sorter1", "Sorter2"], axis=1) + ) + report.columns.name = "" + report = report.reset_index() + report.drop(columns=["index"], inplace=True) + return report + + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/machine_learning/k_nearest_neighbours.py b/python-mega-algo/machine_learning/k_nearest_neighbours.py new file mode 100644 index 00000000..2a90cfe5 --- /dev/null +++ b/python-mega-algo/machine_learning/k_nearest_neighbours.py @@ -0,0 +1,58 @@ +from collections import Counter + +import numpy as np +from sklearn import datasets +from sklearn.model_selection import train_test_split + +data = datasets.load_iris() + +X = np.array(data["data"]) +y = np.array(data["target"]) +classes = data["target_names"] + +X_train, X_test, y_train, y_test = train_test_split(X, y) + + +def euclidean_distance(a, b): + """ + Gives the euclidean distance between two points + >>> euclidean_distance([0, 0], [3, 4]) + 5.0 + >>> euclidean_distance([1, 2, 3], [1, 8, 11]) + 10.0 + """ + return np.linalg.norm(np.array(a) - np.array(b)) + + +def classifier(train_data, train_target, classes, point, k=5): + """ + Classifies the point using the KNN algorithm + k closest points are found (ranked in ascending order of euclidean distance) + Params: + :train_data: Set of points that are classified into two or more classes + :train_target: List of classes in the order of train_data points + :classes: Labels of the classes + :point: The data point that needs to be classified + + >>> X_train = [[0, 0], [1, 0], [0, 1], [0.5, 0.5], [3, 3], [2, 3], [3, 2]] + >>> y_train = [0, 0, 0, 0, 1, 1, 1] + >>> classes = ['A','B']; point = [1.2,1.2] + >>> classifier(X_train, y_train, classes,point) + 'A' + """ + data = zip(train_data, train_target) + # List of distances of all points from the point to be classified + distances = [] + for data_point in data: + distance = euclidean_distance(data_point[0], point) + distances.append((distance, data_point[1])) + # Choosing 'k' points with the least distances. + votes = [i[1] for i in sorted(distances)[:k]] + # Most commonly occurring class among them + # is the class into which the point is classified + result = Counter(votes).most_common(1)[0][0] + return classes[result] + + +if __name__ == "__main__": + print(classifier(X_train, y_train, classes, [4.4, 3.1, 1.3, 1.4])) diff --git a/python-mega-algo/machine_learning/knn_sklearn.py b/python-mega-algo/machine_learning/knn_sklearn.py new file mode 100644 index 00000000..4a621a42 --- /dev/null +++ b/python-mega-algo/machine_learning/knn_sklearn.py @@ -0,0 +1,31 @@ +from sklearn.datasets import load_iris +from sklearn.model_selection import train_test_split +from sklearn.neighbors import KNeighborsClassifier + +# Load iris file +iris = load_iris() +iris.keys() + + +print(f"Target names: \n {iris.target_names} ") +print(f"\n Features: \n {iris.feature_names}") + +# Train set e Test set +X_train, X_test, y_train, y_test = train_test_split( + iris["data"], iris["target"], random_state=4 +) + +# KNN + +knn = KNeighborsClassifier(n_neighbors=1) +knn.fit(X_train, y_train) + +# new array to test +X_new = [[1, 2, 1, 4], [2, 3, 4, 5]] + +prediction = knn.predict(X_new) + +print( + f"\nNew array: \n {X_new}\n\nTarget Names Prediction: \n" + f" {iris['target_names'][prediction]}" +) diff --git a/python-mega-algo/machine_learning/linear_discriminant_analysis.py b/python-mega-algo/machine_learning/linear_discriminant_analysis.py new file mode 100644 index 00000000..18553a77 --- /dev/null +++ b/python-mega-algo/machine_learning/linear_discriminant_analysis.py @@ -0,0 +1,405 @@ +""" + Linear Discriminant Analysis + + + + Assumptions About Data : + 1. The input variables has a gaussian distribution. + 2. The variance calculated for each input variables by class grouping is the + same. + 3. The mix of classes in your training set is representative of the problem. + + + Learning The Model : + The LDA model requires the estimation of statistics from the training data : + 1. Mean of each input value for each class. + 2. Probability of an instance belong to each class. + 3. Covariance for the input data for each class + + Calculate the class means : + mean(x) = 1/n ( for i = 1 to i = n --> sum(xi)) + + Calculate the class probabilities : + P(y = 0) = count(y = 0) / (count(y = 0) + count(y = 1)) + P(y = 1) = count(y = 1) / (count(y = 0) + count(y = 1)) + + Calculate the variance : + We can calculate the variance for dataset in two steps : + 1. Calculate the squared difference for each input variable from the + group mean. + 2. Calculate the mean of the squared difference. + ------------------------------------------------ + Squared_Difference = (x - mean(k)) ** 2 + Variance = (1 / (count(x) - count(classes))) * + (for i = 1 to i = n --> sum(Squared_Difference(xi))) + + Making Predictions : + discriminant(x) = x * (mean / variance) - + ((mean ** 2) / (2 * variance)) + Ln(probability) + --------------------------------------------------------------------------- + After calculating the discriminant value for each class, the class with the + largest discriminant value is taken as the prediction. + + Author: @EverLookNeverSee +""" +from math import log +from os import name, system +from random import gauss, seed +from typing import Callable, TypeVar + + +# Make a training dataset drawn from a gaussian distribution +def gaussian_distribution(mean: float, std_dev: float, instance_count: int) -> list: + """ + Generate gaussian distribution instances based-on given mean and standard deviation + :param mean: mean value of class + :param std_dev: value of standard deviation entered by usr or default value of it + :param instance_count: instance number of class + :return: a list containing generated values based-on given mean, std_dev and + instance_count + + >>> gaussian_distribution(5.0, 1.0, 20) # doctest: +NORMALIZE_WHITESPACE + [6.288184753155463, 6.4494456086997705, 5.066335808938262, 4.235456349028368, + 3.9078267848958586, 5.031334516831717, 3.977896829989127, 3.56317055489747, + 5.199311976483754, 5.133374604658605, 5.546468300338232, 4.086029056264687, + 5.005005283626573, 4.935258239627312, 3.494170998739258, 5.537997178661033, + 5.320711100998849, 7.3891120432406865, 5.202969177309964, 4.855297691835079] + """ + seed(1) + return [gauss(mean, std_dev) for _ in range(instance_count)] + + +# Make corresponding Y flags to detecting classes +def y_generator(class_count: int, instance_count: list) -> list: + """ + Generate y values for corresponding classes + :param class_count: Number of classes(data groupings) in dataset + :param instance_count: number of instances in class + :return: corresponding values for data groupings in dataset + + >>> y_generator(1, [10]) + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0] + >>> y_generator(2, [5, 10]) + [0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + >>> y_generator(4, [10, 5, 15, 20]) # doctest: +NORMALIZE_WHITESPACE + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3] + """ + + return [k for k in range(class_count) for _ in range(instance_count[k])] + + +# Calculate the class means +def calculate_mean(instance_count: int, items: list) -> float: + """ + Calculate given class mean + :param instance_count: Number of instances in class + :param items: items that related to specific class(data grouping) + :return: calculated actual mean of considered class + + >>> items = gaussian_distribution(5.0, 1.0, 20) + >>> calculate_mean(len(items), items) + 5.011267842911003 + """ + # the sum of all items divided by number of instances + return sum(items) / instance_count + + +# Calculate the class probabilities +def calculate_probabilities(instance_count: int, total_count: int) -> float: + """ + Calculate the probability that a given instance will belong to which class + :param instance_count: number of instances in class + :param total_count: the number of all instances + :return: value of probability for considered class + + >>> calculate_probabilities(20, 60) + 0.3333333333333333 + >>> calculate_probabilities(30, 100) + 0.3 + """ + # number of instances in specific class divided by number of all instances + return instance_count / total_count + + +# Calculate the variance +def calculate_variance(items: list, means: list, total_count: int) -> float: + """ + Calculate the variance + :param items: a list containing all items(gaussian distribution of all classes) + :param means: a list containing real mean values of each class + :param total_count: the number of all instances + :return: calculated variance for considered dataset + + >>> items = gaussian_distribution(5.0, 1.0, 20) + >>> means = [5.011267842911003] + >>> total_count = 20 + >>> calculate_variance([items], means, total_count) + 0.9618530973487491 + """ + squared_diff = [] # An empty list to store all squared differences + # iterate over number of elements in items + for i in range(len(items)): + # for loop iterates over number of elements in inner layer of items + for j in range(len(items[i])): + # appending squared differences to 'squared_diff' list + squared_diff.append((items[i][j] - means[i]) ** 2) + + # one divided by (the number of all instances - number of classes) multiplied by + # sum of all squared differences + n_classes = len(means) # Number of classes in dataset + return 1 / (total_count - n_classes) * sum(squared_diff) + + +# Making predictions +def predict_y_values( + x_items: list, means: list, variance: float, probabilities: list +) -> list: + """This function predicts new indexes(groups for our data) + :param x_items: a list containing all items(gaussian distribution of all classes) + :param means: a list containing real mean values of each class + :param variance: calculated value of variance by calculate_variance function + :param probabilities: a list containing all probabilities of classes + :return: a list containing predicted Y values + + >>> x_items = [[6.288184753155463, 6.4494456086997705, 5.066335808938262, + ... 4.235456349028368, 3.9078267848958586, 5.031334516831717, + ... 3.977896829989127, 3.56317055489747, 5.199311976483754, + ... 5.133374604658605, 5.546468300338232, 4.086029056264687, + ... 5.005005283626573, 4.935258239627312, 3.494170998739258, + ... 5.537997178661033, 5.320711100998849, 7.3891120432406865, + ... 5.202969177309964, 4.855297691835079], [11.288184753155463, + ... 11.44944560869977, 10.066335808938263, 9.235456349028368, + ... 8.907826784895859, 10.031334516831716, 8.977896829989128, + ... 8.56317055489747, 10.199311976483754, 10.133374604658606, + ... 10.546468300338232, 9.086029056264687, 10.005005283626572, + ... 9.935258239627313, 8.494170998739259, 10.537997178661033, + ... 10.320711100998848, 12.389112043240686, 10.202969177309964, + ... 9.85529769183508], [16.288184753155463, 16.449445608699772, + ... 15.066335808938263, 14.235456349028368, 13.907826784895859, + ... 15.031334516831716, 13.977896829989128, 13.56317055489747, + ... 15.199311976483754, 15.133374604658606, 15.546468300338232, + ... 14.086029056264687, 15.005005283626572, 14.935258239627313, + ... 13.494170998739259, 15.537997178661033, 15.320711100998848, + ... 17.389112043240686, 15.202969177309964, 14.85529769183508]] + + >>> means = [5.011267842911003, 10.011267842911003, 15.011267842911002] + >>> variance = 0.9618530973487494 + >>> probabilities = [0.3333333333333333, 0.3333333333333333, 0.3333333333333333] + >>> predict_y_values(x_items, means, variance, + ... probabilities) # doctest: +NORMALIZE_WHITESPACE + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2] + + """ + # An empty list to store generated discriminant values of all items in dataset for + # each class + results = [] + # for loop iterates over number of elements in list + for i in range(len(x_items)): + # for loop iterates over number of inner items of each element + for j in range(len(x_items[i])): + temp = [] # to store all discriminant values of each item as a list + # for loop iterates over number of classes we have in our dataset + for k in range(len(x_items)): + # appending values of discriminants for each class to 'temp' list + temp.append( + x_items[i][j] * (means[k] / variance) + - (means[k] ** 2 / (2 * variance)) + + log(probabilities[k]) + ) + # appending discriminant values of each item to 'results' list + results.append(temp) + + return [result.index(max(result)) for result in results] + + +# Calculating Accuracy +def accuracy(actual_y: list, predicted_y: list) -> float: + """ + Calculate the value of accuracy based-on predictions + :param actual_y:a list containing initial Y values generated by 'y_generator' + function + :param predicted_y: a list containing predicted Y values generated by + 'predict_y_values' function + :return: percentage of accuracy + + >>> actual_y = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, + ... 1, 1 ,1 ,1 ,1 ,1 ,1] + >>> predicted_y = [0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, + ... 0, 0, 1, 1, 1, 0, 1, 1, 1] + >>> accuracy(actual_y, predicted_y) + 50.0 + + >>> actual_y = [0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, + ... 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2] + >>> predicted_y = [0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, + ... 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2] + >>> accuracy(actual_y, predicted_y) + 100.0 + """ + # iterate over one element of each list at a time (zip mode) + # prediction is correct if actual Y value equals to predicted Y value + correct = sum(1 for i, j in zip(actual_y, predicted_y) if i == j) + # percentage of accuracy equals to number of correct predictions divided by number + # of all data and multiplied by 100 + return (correct / len(actual_y)) * 100 + + +num = TypeVar("num") + + +def valid_input( + input_type: Callable[[object], num], # Usually float or int + input_msg: str, + err_msg: str, + condition: Callable[[num], bool] = lambda x: True, + default: str = None, +) -> num: + """ + Ask for user value and validate that it fulfill a condition. + + :input_type: user input expected type of value + :input_msg: message to show user in the screen + :err_msg: message to show in the screen in case of error + :condition: function that represents the condition that user input is valid. + :default: Default value in case the user does not type anything + :return: user's input + """ + while True: + try: + user_input = input_type(input(input_msg).strip() or default) + if condition(user_input): + return user_input + else: + print(f"{user_input}: {err_msg}") + continue + except ValueError: + print( + f"{user_input}: Incorrect input type, expected {input_type.__name__!r}" + ) + + +# Main Function +def main(): + """This function starts execution phase""" + while True: + print(" Linear Discriminant Analysis ".center(50, "*")) + print("*" * 50, "\n") + print("First of all we should specify the number of classes that") + print("we want to generate as training dataset") + # Trying to get number of classes + n_classes = valid_input( + input_type=int, + condition=lambda x: x > 0, + input_msg="Enter the number of classes (Data Groupings): ", + err_msg="Number of classes should be positive!", + ) + + print("-" * 100) + + # Trying to get the value of standard deviation + std_dev = valid_input( + input_type=float, + condition=lambda x: x >= 0, + input_msg=( + "Enter the value of standard deviation" + "(Default value is 1.0 for all classes): " + ), + err_msg="Standard deviation should not be negative!", + default="1.0", + ) + + print("-" * 100) + + # Trying to get number of instances in classes and theirs means to generate + # dataset + counts = [] # An empty list to store instance counts of classes in dataset + for i in range(n_classes): + user_count = valid_input( + input_type=int, + condition=lambda x: x > 0, + input_msg=(f"Enter The number of instances for class_{i+1}: "), + err_msg="Number of instances should be positive!", + ) + counts.append(user_count) + print("-" * 100) + + # An empty list to store values of user-entered means of classes + user_means = [] + for a in range(n_classes): + user_mean = valid_input( + input_type=float, + input_msg=(f"Enter the value of mean for class_{a+1}: "), + err_msg="This is an invalid value.", + ) + user_means.append(user_mean) + print("-" * 100) + + print("Standard deviation: ", std_dev) + # print out the number of instances in classes in separated line + for i, count in enumerate(counts, 1): + print(f"Number of instances in class_{i} is: {count}") + print("-" * 100) + + # print out mean values of classes separated line + for i, user_mean in enumerate(user_means, 1): + print(f"Mean of class_{i} is: {user_mean}") + print("-" * 100) + + # Generating training dataset drawn from gaussian distribution + x = [ + gaussian_distribution(user_means[j], std_dev, counts[j]) + for j in range(n_classes) + ] + print("Generated Normal Distribution: \n", x) + print("-" * 100) + + # Generating Ys to detecting corresponding classes + y = y_generator(n_classes, counts) + print("Generated Corresponding Ys: \n", y) + print("-" * 100) + + # Calculating the value of actual mean for each class + actual_means = [calculate_mean(counts[k], x[k]) for k in range(n_classes)] + # for loop iterates over number of elements in 'actual_means' list and print + # out them in separated line + for i, actual_mean in enumerate(actual_means, 1): + print(f"Actual(Real) mean of class_{i} is: {actual_mean}") + print("-" * 100) + + # Calculating the value of probabilities for each class + probabilities = [ + calculate_probabilities(counts[i], sum(counts)) for i in range(n_classes) + ] + + # for loop iterates over number of elements in 'probabilities' list and print + # out them in separated line + for i, probability in enumerate(probabilities, 1): + print(f"Probability of class_{i} is: {probability}") + print("-" * 100) + + # Calculating the values of variance for each class + variance = calculate_variance(x, actual_means, sum(counts)) + print("Variance: ", variance) + print("-" * 100) + + # Predicting Y values + # storing predicted Y values in 'pre_indexes' variable + pre_indexes = predict_y_values(x, actual_means, variance, probabilities) + print("-" * 100) + + # Calculating Accuracy of the model + print(f"Accuracy: {accuracy(y, pre_indexes)}") + print("-" * 100) + print(" DONE ".center(100, "+")) + + if input("Press any key to restart or 'q' for quit: ").strip().lower() == "q": + print("\n" + "GoodBye!".center(100, "-") + "\n") + break + system("cls" if name == "nt" else "clear") + + +if __name__ == "__main__": + main() diff --git a/python-mega-algo/machine_learning/linear_regression.py b/python-mega-algo/machine_learning/linear_regression.py new file mode 100644 index 00000000..b0bbc7b9 --- /dev/null +++ b/python-mega-algo/machine_learning/linear_regression.py @@ -0,0 +1,106 @@ +""" +Linear regression is the most basic type of regression commonly used for +predictive analysis. The idea is pretty simple: we have a dataset and we have +features associated with it. Features should be chosen very cautiously +as they determine how much our model will be able to make future predictions. +We try to set the weight of these features, over many iterations, so that they best +fit our dataset. In this particular code, I had used a CSGO dataset (ADR vs +Rating). We try to best fit a line through dataset and estimate the parameters. +""" +import numpy as np +import requests + + +def collect_dataset(): + """Collect dataset of CSGO + The dataset contains ADR vs Rating of a Player + :return : dataset obtained from the link, as matrix + """ + response = requests.get( + "https://raw.githubusercontent.com/yashLadha/" + + "The_Math_of_Intelligence/master/Week1/ADRvs" + + "Rating.csv" + ) + lines = response.text.splitlines() + data = [] + for item in lines: + item = item.split(",") + data.append(item) + data.pop(0) # This is for removing the labels from the list + dataset = np.matrix(data) + return dataset + + +def run_steep_gradient_descent(data_x, data_y, len_data, alpha, theta): + """Run steep gradient descent and updates the Feature vector accordingly_ + :param data_x : contains the dataset + :param data_y : contains the output associated with each data-entry + :param len_data : length of the data_ + :param alpha : Learning rate of the model + :param theta : Feature vector (weight's for our model) + ;param return : Updated Feature's, using + curr_features - alpha_ * gradient(w.r.t. feature) + """ + n = len_data + + prod = np.dot(theta, data_x.transpose()) + prod -= data_y.transpose() + sum_grad = np.dot(prod, data_x) + theta = theta - (alpha / n) * sum_grad + return theta + + +def sum_of_square_error(data_x, data_y, len_data, theta): + """Return sum of square error for error calculation + :param data_x : contains our dataset + :param data_y : contains the output (result vector) + :param len_data : len of the dataset + :param theta : contains the feature vector + :return : sum of square error computed from given feature's + """ + prod = np.dot(theta, data_x.transpose()) + prod -= data_y.transpose() + sum_elem = np.sum(np.square(prod)) + error = sum_elem / (2 * len_data) + return error + + +def run_linear_regression(data_x, data_y): + """Implement Linear regression over the dataset + :param data_x : contains our dataset + :param data_y : contains the output (result vector) + :return : feature for line of best fit (Feature vector) + """ + iterations = 100000 + alpha = 0.0001550 + + no_features = data_x.shape[1] + len_data = data_x.shape[0] - 1 + + theta = np.zeros((1, no_features)) + + for i in range(0, iterations): + theta = run_steep_gradient_descent(data_x, data_y, len_data, alpha, theta) + error = sum_of_square_error(data_x, data_y, len_data, theta) + print("At Iteration %d - Error is %.5f " % (i + 1, error)) + + return theta + + +def main(): + """Driver function""" + data = collect_dataset() + + len_data = data.shape[0] + data_x = np.c_[np.ones(len_data), data[:, :-1]].astype(float) + data_y = data[:, -1].astype(float) + + theta = run_linear_regression(data_x, data_y) + len_result = theta.shape[1] + print("Resultant Feature vector : ") + for i in range(0, len_result): + print("%.5f" % (theta[0, i])) + + +if __name__ == "__main__": + main() diff --git a/python-mega-algo/machine_learning/logistic_regression.py b/python-mega-algo/machine_learning/logistic_regression.py new file mode 100644 index 00000000..48d88ef6 --- /dev/null +++ b/python-mega-algo/machine_learning/logistic_regression.py @@ -0,0 +1,87 @@ +#!/usr/bin/python + +# Logistic Regression from scratch + +# In[62]: + +# In[63]: + +# importing all the required libraries + +""" +Implementing logistic regression for classification problem +Helpful resources: +Coursera ML course +https://medium.com/@martinpella/logistic-regression-from-scratch-in-python-124c5636b8ac +""" +import numpy as np +from matplotlib import pyplot as plt +from sklearn import datasets + +# get_ipython().run_line_magic('matplotlib', 'inline') + + +# In[67]: + +# sigmoid function or logistic function is used as a hypothesis function in +# classification problems + + +def sigmoid_function(z): + return 1 / (1 + np.exp(-z)) + + +def cost_function(h, y): + return (-y * np.log(h) - (1 - y) * np.log(1 - h)).mean() + + +def log_likelihood(X, Y, weights): + scores = np.dot(X, weights) + return np.sum(Y * scores - np.log(1 + np.exp(scores))) + + +# here alpha is the learning rate, X is the feature matrix,y is the target matrix +def logistic_reg(alpha, X, y, max_iterations=70000): + theta = np.zeros(X.shape[1]) + + for iterations in range(max_iterations): + z = np.dot(X, theta) + h = sigmoid_function(z) + gradient = np.dot(X.T, h - y) / y.size + theta = theta - alpha * gradient # updating the weights + z = np.dot(X, theta) + h = sigmoid_function(z) + J = cost_function(h, y) + if iterations % 100 == 0: + print(f"loss: {J} \t") # printing the loss after every 100 iterations + return theta + + +# In[68]: + +if __name__ == "__main__": + iris = datasets.load_iris() + X = iris.data[:, :2] + y = (iris.target != 0) * 1 + + alpha = 0.1 + theta = logistic_reg(alpha, X, y, max_iterations=70000) + print("theta: ", theta) # printing the theta i.e our weights vector + + def predict_prob(X): + return sigmoid_function( + np.dot(X, theta) + ) # predicting the value of probability from the logistic regression algorithm + + plt.figure(figsize=(10, 6)) + plt.scatter(X[y == 0][:, 0], X[y == 0][:, 1], color="b", label="0") + plt.scatter(X[y == 1][:, 0], X[y == 1][:, 1], color="r", label="1") + (x1_min, x1_max) = (X[:, 0].min(), X[:, 0].max()) + (x2_min, x2_max) = (X[:, 1].min(), X[:, 1].max()) + (xx1, xx2) = np.meshgrid(np.linspace(x1_min, x1_max), np.linspace(x2_min, x2_max)) + grid = np.c_[xx1.ravel(), xx2.ravel()] + probs = predict_prob(grid).reshape(xx1.shape) + plt.contour(xx1, xx2, probs, [0.5], linewidths=1, colors="black") + + plt.legend() + plt.show() diff --git a/python-mega-algo/machine_learning/lstm/__init__.py b/python-mega-algo/machine_learning/lstm/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/machine_learning/lstm/lstm_prediction.py b/python-mega-algo/machine_learning/lstm/lstm_prediction.py new file mode 100644 index 00000000..6fd3cf29 --- /dev/null +++ b/python-mega-algo/machine_learning/lstm/lstm_prediction.py @@ -0,0 +1,54 @@ +""" + Create a Long Short Term Memory (LSTM) network model + An LSTM is a type of Recurrent Neural Network (RNN) as discussed at: + * http://colah.github.io/posts/2015-08-Understanding-LSTMs + * https://en.wikipedia.org/wiki/Long_short-term_memory +""" +import numpy as np +import pandas as pd +from sklearn.preprocessing import MinMaxScaler +from tensorflow.keras.layers import LSTM, Dense +from tensorflow.keras.models import Sequential + +if __name__ == "__main__": + """ + First part of building a model is to get the data and prepare + it for our model. You can use any dataset for stock prediction + make sure you set the price column on line number 21. Here we + use a dataset which have the price on 3rd column. + """ + df = pd.read_csv("sample_data.csv", header=None) + len_data = df.shape[:1][0] + # If you're using some other dataset input the target column + actual_data = df.iloc[:, 1:2] + actual_data = actual_data.values.reshape(len_data, 1) + actual_data = MinMaxScaler().fit_transform(actual_data) + look_back = 10 + forward_days = 5 + periods = 20 + division = len_data - periods * look_back + train_data = actual_data[:division] + test_data = actual_data[division - look_back :] + train_x, train_y = [], [] + test_x, test_y = [], [] + + for i in range(0, len(train_data) - forward_days - look_back + 1): + train_x.append(train_data[i : i + look_back]) + train_y.append(train_data[i + look_back : i + look_back + forward_days]) + for i in range(0, len(test_data) - forward_days - look_back + 1): + test_x.append(test_data[i : i + look_back]) + test_y.append(test_data[i + look_back : i + look_back + forward_days]) + x_train = np.array(train_x) + x_test = np.array(test_x) + y_train = np.array([list(i.ravel()) for i in train_y]) + y_test = np.array([list(i.ravel()) for i in test_y]) + + model = Sequential() + model.add(LSTM(128, input_shape=(look_back, 1), return_sequences=True)) + model.add(LSTM(64, input_shape=(128, 1))) + model.add(Dense(forward_days)) + model.compile(loss="mean_squared_error", optimizer="adam") + history = model.fit( + x_train, y_train, epochs=150, verbose=1, shuffle=True, batch_size=4 + ) + pred = model.predict(x_test) diff --git a/python-mega-algo/machine_learning/lstm/right.html b/python-mega-algo/machine_learning/lstm/right.html new file mode 100644 index 00000000..5ecd47dd --- /dev/null +++ b/python-mega-algo/machine_learning/lstm/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/machine_learning/lstm + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    sample_data.csv lstm_prediction.py __init__.py 
    + +

    +Folders: 1
    +Files: 3
    +Size of all files: 73928 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/machine_learning/lstm/sample_data.csv b/python-mega-algo/machine_learning/lstm/sample_data.csv new file mode 100644 index 00000000..f94db621 --- /dev/null +++ b/python-mega-algo/machine_learning/lstm/sample_data.csv @@ -0,0 +1,1259 @@ +04/24/2020, 1279.31, 1640394, 1261.17, 1280.4, 1249.45 +04/23/2020, 1276.31, 1566203, 1271.55, 1293.31, 1265.67 +04/22/2020, 1263.21, 2093140, 1245.54, 1285.6133, 1242 +04/21/2020, 1216.34, 2153003, 1247, 1254.27, 1209.71 +04/20/2020, 1266.61, 1695488, 1271, 1281.6, 1261.37 +04/17/2020, 1283.25, 1949042, 1284.85, 1294.43, 1271.23 +04/16/2020, 1263.47, 2518099, 1274.1, 1279, 1242.62 +04/15/2020, 1262.47, 1671703, 1245.61, 1280.46, 1240.4 +04/14/2020, 1269.23, 2470353, 1245.09, 1282.07, 1236.93 +04/13/2020, 1217.56, 1739828, 1209.18, 1220.51, 1187.5984 +04/09/2020, 1211.45, 2175421, 1224.08, 1225.57, 1196.7351 +04/08/2020, 1210.28, 1975135, 1206.5, 1219.07, 1188.16 +04/07/2020, 1186.51, 2387329, 1221, 1225, 1182.23 +04/06/2020, 1186.92, 2664723, 1138, 1194.66, 1130.94 +04/03/2020, 1097.88, 2313400, 1119.015, 1123.54, 1079.81 +04/02/2020, 1120.84, 1964881, 1098.26, 1126.86, 1096.4 +04/01/2020, 1105.62, 2344173, 1122, 1129.69, 1097.45 +03/31/2020, 1162.81, 2487983, 1147.3, 1175.31, 1138.14 +03/30/2020, 1146.82, 2574061, 1125.04, 1151.63, 1096.48 +03/27/2020, 1110.71, 3208495, 1125.67, 1150.6702, 1105.91 +03/26/2020, 1161.75, 3573755, 1111.8, 1169.97, 1093.53 +03/25/2020, 1102.49, 4081528, 1126.47, 1148.9, 1086.01 +03/24/2020, 1134.46, 3344450, 1103.77, 1135, 1090.62 +03/23/2020, 1056.62, 4044137, 1061.32, 1071.32, 1013.5361 +03/20/2020, 1072.32, 3601750, 1135.72, 1143.99, 1065.49 +03/19/2020, 1115.29, 3651106, 1093.05, 1157.9699, 1060.1075 +03/18/2020, 1096.8, 4233435, 1056.51, 1106.5, 1037.28 +03/17/2020, 1119.8, 3861489, 1093.11, 1130.86, 1056.01 +03/16/2020, 1084.33, 4252365, 1096, 1152.2665, 1074.44 +03/13/2020, 1219.73, 3700125, 1179, 1219.76, 1117.1432 +03/12/2020, 1114.91, 4226748, 1126, 1193.87, 1113.3 +03/11/2020, 1215.41, 2611229, 1249.7, 1260.96, 1196.07 +03/10/2020, 1280.39, 2611373, 1260, 1281.15, 1218.77 +03/09/2020, 1215.56, 3365365, 1205.3, 1254.7599, 1200 +03/06/2020, 1298.41, 2660628, 1277.06, 1306.22, 1261.05 +03/05/2020, 1319.04, 2561288, 1350.2, 1358.91, 1305.1 +03/04/2020, 1386.52, 1913315, 1359.23, 1388.09, 1343.11 +03/03/2020, 1341.39, 2402326, 1399.42, 1410.15, 1332 +03/02/2020, 1389.11, 2431468, 1351.61, 1390.87, 1326.815 +02/28/2020, 1339.33, 3790618, 1277.5, 1341.14, 1271 +02/27/2020, 1318.09, 2978300, 1362.06, 1371.7037, 1317.17 +02/26/2020, 1393.18, 2204037, 1396.14, 1415.7, 1379 +02/25/2020, 1388.45, 2478278, 1433, 1438.14, 1382.4 +02/24/2020, 1421.59, 2867053, 1426.11, 1436.97, 1411.39 +02/21/2020, 1485.11, 1732273, 1508.03, 1512.215, 1480.44 +02/20/2020, 1518.15, 1096552, 1522, 1529.64, 1506.82 +02/19/2020, 1526.69, 949268, 1525.07, 1532.1063, 1521.4 +02/18/2020, 1519.67, 1121140, 1515, 1531.63, 1512.59 +02/14/2020, 1520.74, 1197836, 1515.6, 1520.74, 1507.34 +02/13/2020, 1514.66, 929730, 1512.69, 1527.18, 1504.6 +02/12/2020, 1518.27, 1167565, 1514.48, 1520.695, 1508.11 +02/11/2020, 1508.79, 1344633, 1511.81, 1529.63, 1505.6378 +02/10/2020, 1508.68, 1419876, 1474.32, 1509.5, 1474.32 +02/07/2020, 1479.23, 1172270, 1467.3, 1485.84, 1466.35 +02/06/2020, 1476.23, 1679384, 1450.33, 1481.9997, 1449.57 +02/05/2020, 1448.23, 1986157, 1462.42, 1463.84, 1430.56 +02/04/2020, 1447.07, 3932954, 1457.07, 1469.5, 1426.3 +02/03/2020, 1485.94, 3055216, 1462, 1490, 1458.99 +01/31/2020, 1434.23, 2417214, 1468.9, 1470.13, 1428.53 +01/30/2020, 1455.84, 1339421, 1439.96, 1457.28, 1436.4 +01/29/2020, 1458.63, 1078667, 1458.8, 1465.43, 1446.74 +01/28/2020, 1452.56, 1577422, 1443, 1456, 1432.47 +01/27/2020, 1433.9, 1755201, 1431, 1438.07, 1421.2 +01/24/2020, 1466.71, 1784644, 1493.59, 1495.495, 1465.25 +01/23/2020, 1486.65, 1351354, 1487.64, 1495.52, 1482.1 +01/22/2020, 1485.95, 1610846, 1491, 1503.2143, 1484.93 +01/21/2020, 1484.4, 2036780, 1479.12, 1491.85, 1471.2 +01/17/2020, 1480.39, 2396215, 1462.91, 1481.2954, 1458.22 +01/16/2020, 1451.7, 1173688, 1447.44, 1451.99, 1440.92 +01/15/2020, 1439.2, 1282685, 1430.21, 1441.395, 1430.21 +01/14/2020, 1430.88, 1560453, 1439.01, 1441.8, 1428.37 +01/13/2020, 1439.23, 1653482, 1436.13, 1440.52, 1426.02 +01/10/2020, 1429.73, 1821566, 1427.56, 1434.9292, 1418.35 +01/09/2020, 1419.83, 1502664, 1420.57, 1427.33, 1410.27 +01/08/2020, 1404.32, 1529177, 1392.08, 1411.58, 1390.84 +01/07/2020, 1393.34, 1511693, 1397.94, 1402.99, 1390.38 +01/06/2020, 1394.21, 1733149, 1350, 1396.5, 1350 +01/03/2020, 1360.66, 1187006, 1347.86, 1372.5, 1345.5436 +01/02/2020, 1367.37, 1406731, 1341.55, 1368.14, 1341.55 +12/31/2019, 1337.02, 962468, 1330.11, 1338, 1329.085 +12/30/2019, 1336.14, 1051323, 1350, 1353, 1334.02 +12/27/2019, 1351.89, 1038718, 1362.99, 1364.53, 1349.31 +12/26/2019, 1360.4, 667754, 1346.17, 1361.3269, 1344.47 +12/24/2019, 1343.56, 347518, 1348.5, 1350.26, 1342.78 +12/23/2019, 1348.84, 883200, 1355.87, 1359.7999, 1346.51 +12/20/2019, 1349.59, 3316905, 1363.35, 1363.64, 1349 +12/19/2019, 1356.04, 1470112, 1351.82, 1358.1, 1348.985 +12/18/2019, 1352.62, 1657069, 1356.6, 1360.47, 1351 +12/17/2019, 1355.12, 1855259, 1362.89, 1365, 1351.3231 +12/16/2019, 1361.17, 1397451, 1356.5, 1364.68, 1352.67 +12/13/2019, 1347.83, 1550028, 1347.95, 1353.0931, 1343.87 +12/12/2019, 1350.27, 1281722, 1345.94, 1355.775, 1340.5 +12/11/2019, 1345.02, 850796, 1350.84, 1351.2, 1342.67 +12/10/2019, 1344.66, 1094653, 1341.5, 1349.975, 1336.04 +12/09/2019, 1343.56, 1355795, 1338.04, 1359.45, 1337.84 +12/06/2019, 1340.62, 1315510, 1333.44, 1344, 1333.44 +12/05/2019, 1328.13, 1212818, 1328, 1329.3579, 1316.44 +12/04/2019, 1320.54, 1538110, 1307.01, 1325.8, 1304.87 +12/03/2019, 1295.28, 1268647, 1279.57, 1298.461, 1279 +12/02/2019, 1289.92, 1511851, 1301, 1305.83, 1281 +11/29/2019, 1304.96, 586981, 1307.12, 1310.205, 1303.97 +11/27/2019, 1312.99, 996329, 1315, 1318.36, 1309.63 +11/26/2019, 1313.55, 1069795, 1309.86, 1314.8, 1305.09 +11/25/2019, 1306.69, 1036487, 1299.18, 1311.31, 1298.13 +11/22/2019, 1295.34, 1386506, 1305.62, 1308.73, 1291.41 +11/21/2019, 1301.35, 995499, 1301.48, 1312.59, 1293 +11/20/2019, 1303.05, 1309835, 1311.74, 1315, 1291.15 +11/19/2019, 1315.46, 1269372, 1327.7, 1327.7, 1312.8 +11/18/2019, 1320.7, 1488083, 1332.22, 1335.5288, 1317.5 +11/15/2019, 1334.87, 1782955, 1318.94, 1334.88, 1314.2796 +11/14/2019, 1311.46, 1194305, 1297.5, 1317, 1295.65 +11/13/2019, 1298, 853861, 1294.07, 1304.3, 1293.51 +11/12/2019, 1298.8, 1085859, 1300, 1310, 1295.77 +11/11/2019, 1299.19, 1012429, 1303.18, 1306.425, 1297.41 +11/08/2019, 1311.37, 1251916, 1305.28, 1318, 1304.365 +11/07/2019, 1308.86, 2029970, 1294.28, 1323.74, 1294.245 +11/06/2019, 1291.8, 1152977, 1289.46, 1293.73, 1282.5 +11/05/2019, 1292.03, 1282711, 1292.89, 1298.93, 1291.2289 +11/04/2019, 1291.37, 1500964, 1276.45, 1294.13, 1276.355 +11/01/2019, 1273.74, 1670072, 1265, 1274.62, 1260.5 +10/31/2019, 1260.11, 1455651, 1261.28, 1267.67, 1250.8428 +10/30/2019, 1261.29, 1408851, 1252.97, 1269.36, 1252 +10/29/2019, 1262.62, 1886380, 1276.23, 1281.59, 1257.2119 +10/28/2019, 1290, 2613237, 1275.45, 1299.31, 1272.54 +10/25/2019, 1265.13, 1213051, 1251.03, 1269.6, 1250.01 +10/24/2019, 1260.99, 1039868, 1260.9, 1264, 1253.715 +10/23/2019, 1259.13, 928595, 1242.36, 1259.89, 1242.36 +10/22/2019, 1242.8, 1047851, 1247.85, 1250.6, 1241.38 +10/21/2019, 1246.15, 1038042, 1252.26, 1254.6287, 1240.6 +10/18/2019, 1245.49, 1352839, 1253.46, 1258.89, 1241.08 +10/17/2019, 1253.07, 980510, 1250.93, 1263.325, 1249.94 +10/16/2019, 1243.64, 1168174, 1241.17, 1254.74, 1238.45 +10/15/2019, 1243.01, 1395259, 1220.4, 1247.33, 1220.4 +10/14/2019, 1217.14, 882039, 1212.34, 1226.33, 1211.76 +10/11/2019, 1215.45, 1277144, 1222.21, 1228.39, 1213.74 +10/10/2019, 1208.67, 932531, 1198.58, 1215, 1197.34 +10/09/2019, 1202.31, 876632, 1199.35, 1208.35, 1197.63 +10/08/2019, 1189.13, 1141784, 1197.59, 1206.08, 1189.01 +10/07/2019, 1207.68, 867149, 1204.4, 1218.2036, 1203.75 +10/04/2019, 1209, 1183264, 1191.89, 1211.44, 1189.17 +10/03/2019, 1187.83, 1663656, 1180, 1189.06, 1162.43 +10/02/2019, 1176.63, 1639237, 1196.98, 1196.99, 1171.29 +10/01/2019, 1205.1, 1358279, 1219, 1231.23, 1203.58 +09/30/2019, 1219, 1419676, 1220.97, 1226, 1212.3 +09/27/2019, 1225.09, 1354432, 1243.01, 1244.02, 1214.45 +09/26/2019, 1241.39, 1561882, 1241.96, 1245, 1232.268 +09/25/2019, 1246.52, 1593875, 1215.82, 1248.3, 1210.09 +09/24/2019, 1218.76, 1591786, 1240, 1246.74, 1210.68 +09/23/2019, 1234.03, 1075253, 1226, 1239.09, 1224.17 +09/20/2019, 1229.93, 2337269, 1233.12, 1243.32, 1223.08 +09/19/2019, 1238.71, 1000155, 1232.06, 1244.44, 1232.02 +09/18/2019, 1232.41, 1144333, 1227.51, 1235.61, 1216.53 +09/17/2019, 1229.15, 958112, 1230.4, 1235, 1223.69 +09/16/2019, 1231.3, 1053299, 1229.52, 1239.56, 1225.61 +09/13/2019, 1239.56, 1301350, 1231.35, 1240.88, 1227.01 +09/12/2019, 1234.25, 1725908, 1224.3, 1241.86, 1223.02 +09/11/2019, 1220.17, 1307033, 1203.41, 1222.6, 1202.2 +09/10/2019, 1206, 1260115, 1195.15, 1210, 1194.58 +09/09/2019, 1204.41, 1471880, 1204, 1220, 1192.62 +09/06/2019, 1204.93, 1072143, 1208.13, 1212.015, 1202.5222 +09/05/2019, 1211.38, 1408601, 1191.53, 1213.04, 1191.53 +09/04/2019, 1181.41, 1068968, 1176.71, 1183.48, 1171 +09/03/2019, 1168.39, 1480420, 1177.03, 1186.89, 1163.2 +08/30/2019, 1188.1, 1129959, 1198.5, 1198.5, 1183.8026 +08/29/2019, 1192.85, 1088858, 1181.12, 1196.06, 1181.12 +08/28/2019, 1171.02, 802243, 1161.71, 1176.4199, 1157.3 +08/27/2019, 1167.84, 1077452, 1180.53, 1182.4, 1161.45 +08/26/2019, 1168.89, 1226441, 1157.26, 1169.47, 1152.96 +08/23/2019, 1151.29, 1688271, 1181.99, 1194.08, 1147.75 +08/22/2019, 1189.53, 947906, 1194.07, 1198.0115, 1178.58 +08/21/2019, 1191.25, 741053, 1193.15, 1199, 1187.43 +08/20/2019, 1182.69, 915605, 1195.25, 1196.06, 1182.11 +08/19/2019, 1198.45, 1232517, 1190.09, 1206.99, 1190.09 +08/16/2019, 1177.6, 1349436, 1179.55, 1182.72, 1171.81 +08/15/2019, 1167.26, 1224739, 1163.5, 1175.84, 1162.11 +08/14/2019, 1164.29, 1578668, 1176.31, 1182.3, 1160.54 +08/13/2019, 1197.27, 1318009, 1171.46, 1204.78, 1171.46 +08/12/2019, 1174.71, 1003187, 1179.21, 1184.96, 1167.6723 +08/09/2019, 1188.01, 1065658, 1197.99, 1203.88, 1183.603 +08/08/2019, 1204.8, 1467997, 1182.83, 1205.01, 1173.02 +08/07/2019, 1173.99, 1444324, 1156, 1178.4451, 1149.6239 +08/06/2019, 1169.95, 1709374, 1163.31, 1179.96, 1160 +08/05/2019, 1152.32, 2597455, 1170.04, 1175.24, 1140.14 +08/02/2019, 1193.99, 1645067, 1200.74, 1206.9, 1188.94 +08/01/2019, 1209.01, 1698510, 1214.03, 1234.11, 1205.72 +07/31/2019, 1216.68, 1725454, 1223, 1234, 1207.7635 +07/30/2019, 1225.14, 1453263, 1225.41, 1234.87, 1223.3 +07/29/2019, 1239.41, 2223731, 1241.05, 1247.37, 1228.23 +07/26/2019, 1250.41, 4805752, 1224.04, 1265.5499, 1224 +07/25/2019, 1132.12, 2209823, 1137.82, 1141.7, 1120.92 +07/24/2019, 1137.81, 1590101, 1131.9, 1144, 1126.99 +07/23/2019, 1146.21, 1093688, 1144, 1146.9, 1131.8 +07/22/2019, 1138.07, 1301846, 1133.45, 1139.25, 1124.24 +07/19/2019, 1130.1, 1647245, 1148.19, 1151.14, 1129.62 +07/18/2019, 1146.33, 1291281, 1141.74, 1147.605, 1132.73 +07/17/2019, 1146.35, 1170047, 1150.97, 1158.36, 1145.77 +07/16/2019, 1153.58, 1238807, 1146, 1158.58, 1145 +07/15/2019, 1150.34, 903780, 1146.86, 1150.82, 1139.4 +07/12/2019, 1144.9, 863973, 1143.99, 1147.34, 1138.78 +07/11/2019, 1144.21, 1195569, 1143.25, 1153.07, 1139.58 +07/10/2019, 1140.48, 1209466, 1131.22, 1142.05, 1130.97 +07/09/2019, 1124.83, 1330370, 1111.8, 1128.025, 1107.17 +07/08/2019, 1116.35, 1236419, 1125.17, 1125.98, 1111.21 +07/05/2019, 1131.59, 1264540, 1117.8, 1132.88, 1116.14 +07/03/2019, 1121.58, 767011, 1117.41, 1126.76, 1113.86 +07/02/2019, 1111.25, 991755, 1102.24, 1111.77, 1098.17 +07/01/2019, 1097.95, 1438504, 1098, 1107.58, 1093.703 +06/28/2019, 1080.91, 1693450, 1076.39, 1081, 1073.37 +06/27/2019, 1076.01, 1004477, 1084, 1087.1, 1075.29 +06/26/2019, 1079.8, 1810869, 1086.5, 1092.97, 1072.24 +06/25/2019, 1086.35, 1546913, 1112.66, 1114.35, 1083.8 +06/24/2019, 1115.52, 1395696, 1119.61, 1122, 1111.01 +06/21/2019, 1121.88, 1947591, 1109.24, 1124.11, 1108.08 +06/20/2019, 1111.42, 1262011, 1119.99, 1120.12, 1104.74 +06/19/2019, 1102.33, 1339218, 1105.6, 1107, 1093.48 +06/18/2019, 1103.6, 1386684, 1109.69, 1116.39, 1098.99 +06/17/2019, 1092.5, 941602, 1086.28, 1099.18, 1086.28 +06/14/2019, 1085.35, 1111643, 1086.42, 1092.69, 1080.1721 +06/13/2019, 1088.77, 1058000, 1083.64, 1094.17, 1080.15 +06/12/2019, 1077.03, 1061255, 1078, 1080.93, 1067.54 +06/11/2019, 1078.72, 1437063, 1093.98, 1101.99, 1077.6025 +06/10/2019, 1080.38, 1464248, 1072.98, 1092.66, 1072.3216 +06/07/2019, 1066.04, 1802370, 1050.63, 1070.92, 1048.4 +06/06/2019, 1044.34, 1703244, 1044.99, 1047.49, 1033.7 +06/05/2019, 1042.22, 2168439, 1051.54, 1053.55, 1030.49 +06/04/2019, 1053.05, 2833483, 1042.9, 1056.05, 1033.69 +06/03/2019, 1036.23, 5130576, 1065.5, 1065.5, 1025 +05/31/2019, 1103.63, 1508203, 1101.29, 1109.6, 1100.18 +05/30/2019, 1117.95, 951873, 1115.54, 1123.13, 1112.12 +05/29/2019, 1116.46, 1538212, 1127.52, 1129.1, 1108.2201 +05/28/2019, 1134.15, 1365166, 1134, 1151.5871, 1133.12 +05/24/2019, 1133.47, 1112341, 1147.36, 1149.765, 1131.66 +05/23/2019, 1140.77, 1199300, 1140.5, 1145.9725, 1129.224 +05/22/2019, 1151.42, 914839, 1146.75, 1158.52, 1145.89 +05/21/2019, 1149.63, 1160158, 1148.49, 1152.7077, 1137.94 +05/20/2019, 1138.85, 1353292, 1144.5, 1146.7967, 1131.4425 +05/17/2019, 1162.3, 1208623, 1168.47, 1180.15, 1160.01 +05/16/2019, 1178.98, 1531404, 1164.51, 1188.16, 1162.84 +05/15/2019, 1164.21, 2289302, 1117.87, 1171.33, 1116.6657 +05/14/2019, 1120.44, 1836604, 1137.21, 1140.42, 1119.55 +05/13/2019, 1132.03, 1860648, 1141.96, 1147.94, 1122.11 +05/10/2019, 1164.27, 1314546, 1163.59, 1172.6, 1142.5 +05/09/2019, 1162.38, 1185973, 1159.03, 1169.66, 1150.85 +05/08/2019, 1166.27, 1309514, 1172.01, 1180.4243, 1165.74 +05/07/2019, 1174.1, 1551368, 1180.47, 1190.44, 1161.04 +05/06/2019, 1189.39, 1563943, 1166.26, 1190.85, 1166.26 +05/03/2019, 1185.4, 1980653, 1173.65, 1186.8, 1169 +05/02/2019, 1162.61, 1944817, 1167.76, 1174.1895, 1155.0018 +05/01/2019, 1168.08, 2642983, 1188.05, 1188.05, 1167.18 +04/30/2019, 1188.48, 6194691, 1185, 1192.81, 1175 +04/29/2019, 1287.58, 2412788, 1274, 1289.27, 1266.2949 +04/26/2019, 1272.18, 1228276, 1269, 1273.07, 1260.32 +04/25/2019, 1263.45, 1099614, 1264.77, 1267.4083, 1252.03 +04/24/2019, 1256, 1015006, 1264.12, 1268.01, 1255 +04/23/2019, 1264.55, 1271195, 1250.69, 1269, 1246.38 +04/22/2019, 1248.84, 806577, 1235.99, 1249.09, 1228.31 +04/18/2019, 1236.37, 1315676, 1239.18, 1242, 1234.61 +04/17/2019, 1236.34, 1211866, 1233, 1240.56, 1227.82 +04/16/2019, 1227.13, 855258, 1225, 1230.82, 1220.12 +04/15/2019, 1221.1, 1187353, 1218, 1224.2, 1209.1101 +04/12/2019, 1217.87, 926799, 1210, 1218.35, 1208.11 +04/11/2019, 1204.62, 709417, 1203.96, 1207.96, 1200.13 +04/10/2019, 1202.16, 724524, 1200.68, 1203.785, 1196.435 +04/09/2019, 1197.25, 865416, 1196, 1202.29, 1193.08 +04/08/2019, 1203.84, 859969, 1207.89, 1208.69, 1199.86 +04/05/2019, 1207.15, 900950, 1214.99, 1216.22, 1205.03 +04/04/2019, 1215, 949962, 1205.94, 1215.67, 1204.13 +04/03/2019, 1205.92, 1014195, 1207.48, 1216.3, 1200.5 +04/02/2019, 1200.49, 800820, 1195.32, 1201.35, 1185.71 +04/01/2019, 1194.43, 1188235, 1184.1, 1196.66, 1182 +03/29/2019, 1173.31, 1269573, 1174.9, 1178.99, 1162.88 +03/28/2019, 1168.49, 966843, 1171.54, 1171.565, 1159.4312 +03/27/2019, 1173.02, 1362217, 1185.5, 1187.559, 1159.37 +03/26/2019, 1184.62, 1894639, 1198.53, 1202.83, 1176.72 +03/25/2019, 1193, 1493841, 1196.93, 1206.3975, 1187.04 +03/22/2019, 1205.5, 1668910, 1226.32, 1230, 1202.825 +03/21/2019, 1231.54, 1195899, 1216, 1231.79, 1213.15 +03/20/2019, 1223.97, 2089367, 1197.35, 1227.14, 1196.17 +03/19/2019, 1198.85, 1404863, 1188.81, 1200, 1185.87 +03/18/2019, 1184.26, 1212506, 1183.3, 1190, 1177.4211 +03/15/2019, 1184.46, 2457597, 1193.38, 1196.57, 1182.61 +03/14/2019, 1185.55, 1150950, 1194.51, 1197.88, 1184.48 +03/13/2019, 1193.32, 1434816, 1200.645, 1200.93, 1191.94 +03/12/2019, 1193.2, 2012306, 1178.26, 1200, 1178.26 +03/11/2019, 1175.76, 1569332, 1144.45, 1176.19, 1144.45 +03/08/2019, 1142.32, 1212271, 1126.73, 1147.08, 1123.3 +03/07/2019, 1143.3, 1166076, 1155.72, 1156.755, 1134.91 +03/06/2019, 1157.86, 1094100, 1162.49, 1167.5658, 1155.49 +03/05/2019, 1162.03, 1422357, 1150.06, 1169.61, 1146.195 +03/04/2019, 1147.8, 1444774, 1146.99, 1158.2804, 1130.69 +03/01/2019, 1140.99, 1447454, 1124.9, 1142.97, 1124.75 +02/28/2019, 1119.92, 1541068, 1111.3, 1127.65, 1111.01 +02/27/2019, 1116.05, 968362, 1106.95, 1117.98, 1101 +02/26/2019, 1115.13, 1469761, 1105.75, 1119.51, 1099.92 +02/25/2019, 1109.4, 1395281, 1116, 1118.54, 1107.27 +02/22/2019, 1110.37, 1048361, 1100.9, 1111.24, 1095.6 +02/21/2019, 1096.97, 1414744, 1110.84, 1111.94, 1092.52 +02/20/2019, 1113.8, 1080144, 1119.99, 1123.41, 1105.28 +02/19/2019, 1118.56, 1046315, 1110, 1121.89, 1110 +02/15/2019, 1113.65, 1442461, 1130.08, 1131.67, 1110.65 +02/14/2019, 1121.67, 941678, 1118.05, 1128.23, 1110.445 +02/13/2019, 1120.16, 1048630, 1124.99, 1134.73, 1118.5 +02/12/2019, 1121.37, 1608658, 1106.8, 1125.295, 1105.85 +02/11/2019, 1095.01, 1063825, 1096.95, 1105.945, 1092.86 +02/08/2019, 1095.06, 1072031, 1087, 1098.91, 1086.55 +02/07/2019, 1098.71, 2040615, 1104.16, 1104.84, 1086 +02/06/2019, 1115.23, 2101674, 1139.57, 1147, 1112.77 +02/05/2019, 1145.99, 3529974, 1124.84, 1146.85, 1117.248 +02/04/2019, 1132.8, 2518184, 1112.66, 1132.8, 1109.02 +02/01/2019, 1110.75, 1455609, 1112.4, 1125, 1104.89 +01/31/2019, 1116.37, 1531463, 1103, 1117.33, 1095.41 +01/30/2019, 1089.06, 1241760, 1068.43, 1091, 1066.85 +01/29/2019, 1060.62, 1006731, 1072.68, 1075.15, 1055.8647 +01/28/2019, 1070.08, 1277745, 1080.11, 1083, 1063.8 +01/25/2019, 1090.99, 1114785, 1085, 1094, 1081.82 +01/24/2019, 1073.9, 1317718, 1076.48, 1079.475, 1060.7 +01/23/2019, 1075.57, 956526, 1077.35, 1084.93, 1059.75 +01/22/2019, 1070.52, 1607398, 1088, 1091.51, 1063.47 +01/18/2019, 1098.26, 1933754, 1100, 1108.352, 1090.9 +01/17/2019, 1089.9, 1223674, 1079.47, 1091.8, 1073.5 +01/16/2019, 1080.97, 1320530, 1080, 1092.375, 1079.34 +01/15/2019, 1077.15, 1452238, 1050.17, 1080.05, 1047.34 +01/14/2019, 1044.69, 1127417, 1046.92, 1051.53, 1041.255 +01/11/2019, 1057.19, 1512651, 1063.18, 1063.775, 1048.48 +01/10/2019, 1070.33, 1444976, 1067.66, 1071.15, 1057.71 +01/09/2019, 1074.66, 1198369, 1081.65, 1082.63, 1066.4 +01/08/2019, 1076.28, 1748371, 1076.11, 1084.56, 1060.53 +01/07/2019, 1068.39, 1978077, 1071.5, 1073.9999, 1054.76 +01/04/2019, 1070.71, 2080144, 1032.59, 1070.84, 1027.4179 +01/03/2019, 1016.06, 1829379, 1041, 1056.98, 1014.07 +01/02/2019, 1045.85, 1516681, 1016.57, 1052.32, 1015.71 +12/31/2018, 1035.61, 1492541, 1050.96, 1052.7, 1023.59 +12/28/2018, 1037.08, 1399218, 1049.62, 1055.56, 1033.1 +12/27/2018, 1043.88, 2102069, 1017.15, 1043.89, 997 +12/26/2018, 1039.46, 2337212, 989.01, 1040, 983 +12/24/2018, 976.22, 1590328, 973.9, 1003.54, 970.11 +12/21/2018, 979.54, 4560424, 1015.3, 1024.02, 973.69 +12/20/2018, 1009.41, 2659047, 1018.13, 1034.22, 996.36 +12/19/2018, 1023.01, 2419322, 1033.99, 1062, 1008.05 +12/18/2018, 1028.71, 2101854, 1026.09, 1049.48, 1021.44 +12/17/2018, 1016.53, 2337631, 1037.51, 1053.15, 1007.9 +12/14/2018, 1042.1, 1685802, 1049.98, 1062.6, 1040.79 +12/13/2018, 1061.9, 1329198, 1068.07, 1079.7597, 1053.93 +12/12/2018, 1063.68, 1523276, 1068, 1081.65, 1062.79 +12/11/2018, 1051.75, 1354751, 1056.49, 1060.6, 1039.84 +12/10/2018, 1039.55, 1793465, 1035.05, 1048.45, 1023.29 +12/07/2018, 1036.58, 2098526, 1060.01, 1075.26, 1028.5 +12/06/2018, 1068.73, 2758098, 1034.26, 1071.2, 1030.7701 +12/04/2018, 1050.82, 2278200, 1103.12, 1104.42, 1049.98 +12/03/2018, 1106.43, 1900355, 1123.14, 1124.65, 1103.6645 +11/30/2018, 1094.43, 2554416, 1089.07, 1095.57, 1077.88 +11/29/2018, 1088.3, 1403540, 1076.08, 1094.245, 1076 +11/28/2018, 1086.23, 2399374, 1048.76, 1086.84, 1035.76 +11/27/2018, 1044.41, 1801334, 1041, 1057.58, 1038.49 +11/26/2018, 1048.62, 1846430, 1038.35, 1049.31, 1033.91 +11/23/2018, 1023.88, 691462, 1030, 1037.59, 1022.3992 +11/21/2018, 1037.61, 1531676, 1036.76, 1048.56, 1033.47 +11/20/2018, 1025.76, 2447254, 1000, 1031.74, 996.02 +11/19/2018, 1020, 1837207, 1057.2, 1060.79, 1016.2601 +11/16/2018, 1061.49, 1641232, 1059.41, 1067, 1048.98 +11/15/2018, 1064.71, 1819132, 1044.71, 1071.85, 1031.78 +11/14/2018, 1043.66, 1561656, 1050, 1054.5643, 1031 +11/13/2018, 1036.05, 1496534, 1043.29, 1056.605, 1031.15 +11/12/2018, 1038.63, 1429319, 1061.39, 1062.12, 1031 +11/09/2018, 1066.15, 1343154, 1073.99, 1075.56, 1053.11 +11/08/2018, 1082.4, 1463022, 1091.38, 1093.27, 1072.2048 +11/07/2018, 1093.39, 2057155, 1069, 1095.46, 1065.9 +11/06/2018, 1055.81, 1225197, 1039.48, 1064.345, 1038.07 +11/05/2018, 1040.09, 2436742, 1055, 1058.47, 1021.24 +11/02/2018, 1057.79, 1829295, 1073.73, 1082.975, 1054.61 +11/01/2018, 1070, 1456222, 1075.8, 1083.975, 1062.46 +10/31/2018, 1076.77, 2528584, 1059.81, 1091.94, 1057 +10/30/2018, 1036.21, 3209126, 1008.46, 1037.49, 1000.75 +10/29/2018, 1020.08, 3873644, 1082.47, 1097.04, 995.83 +10/26/2018, 1071.47, 4185201, 1037.03, 1106.53, 1034.09 +10/25/2018, 1095.57, 2511884, 1071.79, 1110.98, 1069.55 +10/24/2018, 1050.71, 1910060, 1104.25, 1106.12, 1048.74 +10/23/2018, 1103.69, 1847798, 1080.89, 1107.89, 1070 +10/22/2018, 1101.16, 1494285, 1103.06, 1112.23, 1091 +10/19/2018, 1096.46, 1264605, 1093.37, 1110.36, 1087.75 +10/18/2018, 1087.97, 2056606, 1121.84, 1121.84, 1077.09 +10/17/2018, 1115.69, 1397613, 1126.46, 1128.99, 1102.19 +10/16/2018, 1121.28, 1845491, 1104.59, 1124.22, 1102.5 +10/15/2018, 1092.25, 1343231, 1108.91, 1113.4464, 1089 +10/12/2018, 1110.08, 2029872, 1108, 1115, 1086.402 +10/11/2018, 1079.32, 2939514, 1072.94, 1106.4, 1068.27 +10/10/2018, 1081.22, 2574985, 1131.08, 1132.17, 1081.13 +10/09/2018, 1138.82, 1308706, 1146.15, 1154.35, 1137.572 +10/08/2018, 1148.97, 1877142, 1150.11, 1168, 1127.3636 +10/05/2018, 1157.35, 1184245, 1167.5, 1173.4999, 1145.12 +10/04/2018, 1168.19, 2151762, 1195.33, 1197.51, 1155.576 +10/03/2018, 1202.95, 1207280, 1205, 1206.41, 1193.83 +10/02/2018, 1200.11, 1655602, 1190.96, 1209.96, 1186.63 +10/01/2018, 1195.31, 1345250, 1199.89, 1209.9, 1190.3 +09/28/2018, 1193.47, 1306822, 1191.87, 1195.41, 1184.5 +09/27/2018, 1194.64, 1244278, 1186.73, 1202.1, 1183.63 +09/26/2018, 1180.49, 1346434, 1185.15, 1194.23, 1174.765 +09/25/2018, 1184.65, 937577, 1176.15, 1186.88, 1168 +09/24/2018, 1173.37, 1218532, 1157.17, 1178, 1146.91 +09/21/2018, 1166.09, 4363929, 1192, 1192.21, 1166.04 +09/20/2018, 1186.87, 1209855, 1179.99, 1189.89, 1173.36 +09/19/2018, 1171.09, 1185321, 1164.98, 1173.21, 1154.58 +09/18/2018, 1161.22, 1184407, 1157.09, 1176.08, 1157.09 +09/17/2018, 1156.05, 1279147, 1170.14, 1177.24, 1154.03 +09/14/2018, 1172.53, 934300, 1179.1, 1180.425, 1168.3295 +09/13/2018, 1175.33, 1402005, 1170.74, 1178.61, 1162.85 +09/12/2018, 1162.82, 1291304, 1172.72, 1178.61, 1158.36 +09/11/2018, 1177.36, 1209171, 1161.63, 1178.68, 1156.24 +09/10/2018, 1164.64, 1115259, 1172.19, 1174.54, 1160.11 +09/07/2018, 1164.83, 1401034, 1158.67, 1175.26, 1157.215 +09/06/2018, 1171.44, 1886690, 1186.3, 1186.3, 1152 +09/05/2018, 1186.48, 2043732, 1193.8, 1199.0096, 1162 +09/04/2018, 1197, 1800509, 1204.27, 1212.99, 1192.5 +08/31/2018, 1218.19, 1812366, 1234.98, 1238.66, 1211.2854 +08/30/2018, 1239.12, 1320261, 1244.23, 1253.635, 1232.59 +08/29/2018, 1249.3, 1295939, 1237.45, 1250.66, 1236.3588 +08/28/2018, 1231.15, 1296532, 1241.29, 1242.545, 1228.69 +08/27/2018, 1241.82, 1154962, 1227.6, 1243.09, 1225.716 +08/24/2018, 1220.65, 946529, 1208.82, 1221.65, 1206.3588 +08/23/2018, 1205.38, 988509, 1207.14, 1221.28, 1204.24 +08/22/2018, 1207.33, 881463, 1200, 1211.84, 1199 +08/21/2018, 1201.62, 1187884, 1208, 1217.26, 1200.3537 +08/20/2018, 1207.77, 864462, 1205.02, 1211, 1194.6264 +08/17/2018, 1200.96, 1381724, 1202.03, 1209.02, 1188.24 +08/16/2018, 1206.49, 1319985, 1224.73, 1225.9999, 1202.55 +08/15/2018, 1214.38, 1815642, 1229.26, 1235.24, 1209.51 +08/14/2018, 1242.1, 1342534, 1235.19, 1245.8695, 1225.11 +08/13/2018, 1235.01, 957153, 1236.98, 1249.2728, 1233.6405 +08/10/2018, 1237.61, 1107323, 1243, 1245.695, 1232 +08/09/2018, 1249.1, 805227, 1249.9, 1255.542, 1246.01 +08/08/2018, 1245.61, 1369650, 1240.47, 1256.5, 1238.0083 +08/07/2018, 1242.22, 1493073, 1237, 1251.17, 1236.17 +08/06/2018, 1224.77, 1080923, 1225, 1226.0876, 1215.7965 +08/03/2018, 1223.71, 1072524, 1229.62, 1230, 1215.06 +08/02/2018, 1226.15, 1520488, 1205.9, 1229.88, 1204.79 +08/01/2018, 1220.01, 1567142, 1228, 1233.47, 1210.21 +07/31/2018, 1217.26, 1632823, 1220.01, 1227.5877, 1205.6 +07/30/2018, 1219.74, 1822782, 1228.01, 1234.916, 1211.47 +07/27/2018, 1238.5, 2115802, 1271, 1273.89, 1231 +07/26/2018, 1268.33, 2334881, 1251, 1269.7707, 1249.02 +07/25/2018, 1263.7, 2115890, 1239.13, 1265.86, 1239.13 +07/24/2018, 1248.08, 3303268, 1262.59, 1266, 1235.56 +07/23/2018, 1205.5, 2584034, 1181.01, 1206.49, 1181 +07/20/2018, 1184.91, 1246898, 1186.96, 1196.86, 1184.22 +07/19/2018, 1186.96, 1256113, 1191, 1200, 1183.32 +07/18/2018, 1195.88, 1391232, 1196.56, 1204.5, 1190.34 +07/17/2018, 1198.8, 1585091, 1172.22, 1203.04, 1170.6 +07/16/2018, 1183.86, 1049560, 1189.39, 1191, 1179.28 +07/13/2018, 1188.82, 1221687, 1185, 1195.4173, 1180 +07/12/2018, 1183.48, 1251083, 1159.89, 1184.41, 1155.935 +07/11/2018, 1153.9, 1094301, 1144.59, 1164.29, 1141.0003 +07/10/2018, 1152.84, 789249, 1156.98, 1159.59, 1149.59 +07/09/2018, 1154.05, 906073, 1148.48, 1154.67, 1143.42 +07/06/2018, 1140.17, 966155, 1123.58, 1140.93, 1120.7371 +07/05/2018, 1124.27, 1060752, 1110.53, 1127.5, 1108.48 +07/03/2018, 1102.89, 679034, 1135.82, 1135.82, 1100.02 +07/02/2018, 1127.46, 1188616, 1099, 1128, 1093.8 +06/29/2018, 1115.65, 1275979, 1120, 1128.2265, 1115 +06/28/2018, 1114.22, 1072438, 1102.09, 1122.31, 1096.01 +06/27/2018, 1103.98, 1287698, 1121.34, 1131.8362, 1103.62 +06/26/2018, 1118.46, 1559791, 1128, 1133.21, 1116.6589 +06/25/2018, 1124.81, 2155276, 1143.6, 1143.91, 1112.78 +06/22/2018, 1155.48, 1310164, 1159.14, 1162.4965, 1147.26 +06/21/2018, 1157.66, 1232352, 1174.85, 1177.295, 1152.232 +06/20/2018, 1169.84, 1648248, 1175.31, 1186.2856, 1169.16 +06/19/2018, 1168.06, 1616125, 1158.5, 1171.27, 1154.01 +06/18/2018, 1173.46, 1400641, 1143.65, 1174.31, 1143.59 +06/15/2018, 1152.26, 2119134, 1148.86, 1153.42, 1143.485 +06/14/2018, 1152.12, 1350085, 1143.85, 1155.47, 1140.64 +06/13/2018, 1134.79, 1490017, 1141.12, 1146.5, 1133.38 +06/12/2018, 1139.32, 899231, 1131.07, 1139.79, 1130.735 +06/11/2018, 1129.99, 1071114, 1118.6, 1137.26, 1118.6 +06/08/2018, 1120.87, 1289859, 1118.18, 1126.67, 1112.15 +06/07/2018, 1123.86, 1519860, 1131.32, 1135.82, 1116.52 +06/06/2018, 1136.88, 1697489, 1142.17, 1143, 1125.7429 +06/05/2018, 1139.66, 1538169, 1140.99, 1145.738, 1133.19 +06/04/2018, 1139.29, 1881046, 1122.33, 1141.89, 1122.005 +06/01/2018, 1119.5, 2416755, 1099.35, 1120, 1098.5 +05/31/2018, 1084.99, 3085325, 1067.56, 1097.19, 1067.56 +05/30/2018, 1067.8, 1129958, 1063.03, 1069.21, 1056.83 +05/29/2018, 1060.32, 1858676, 1064.89, 1073.37, 1055.22 +05/25/2018, 1075.66, 878903, 1079.02, 1082.56, 1073.775 +05/24/2018, 1079.24, 757752, 1079, 1080.47, 1066.15 +05/23/2018, 1079.69, 1057712, 1065.13, 1080.78, 1061.71 +05/22/2018, 1069.73, 1088700, 1083.56, 1086.59, 1066.69 +05/21/2018, 1079.58, 1012258, 1074.06, 1088, 1073.65 +05/18/2018, 1066.36, 1496448, 1061.86, 1069.94, 1060.68 +05/17/2018, 1078.59, 1031190, 1079.89, 1086.87, 1073.5 +05/16/2018, 1081.77, 989819, 1077.31, 1089.27, 1076.26 +05/15/2018, 1079.23, 1494306, 1090, 1090.05, 1073.47 +05/14/2018, 1100.2, 1450140, 1100, 1110.75, 1099.11 +05/11/2018, 1098.26, 1253205, 1093.6, 1101.3295, 1090.91 +05/10/2018, 1097.57, 1441456, 1086.03, 1100.44, 1085.64 +05/09/2018, 1082.76, 2032319, 1058.1, 1085.44, 1056.365 +05/08/2018, 1053.91, 1217260, 1058.54, 1060.55, 1047.145 +05/07/2018, 1054.79, 1464008, 1049.23, 1061.68, 1047.1 +05/04/2018, 1048.21, 1936797, 1016.9, 1048.51, 1016.9 +05/03/2018, 1023.72, 1813623, 1019, 1029.675, 1006.29 +05/02/2018, 1024.38, 1534094, 1028.1, 1040.389, 1022.87 +05/01/2018, 1037.31, 1427171, 1013.66, 1038.47, 1008.21 +04/30/2018, 1017.33, 1664084, 1030.01, 1037, 1016.85 +04/27/2018, 1030.05, 1617452, 1046, 1049.5, 1025.59 +04/26/2018, 1040.04, 1984448, 1029.51, 1047.98, 1018.19 +04/25/2018, 1021.18, 2225495, 1025.52, 1032.49, 1015.31 +04/24/2018, 1019.98, 4750851, 1052, 1057, 1010.59 +04/23/2018, 1067.45, 2278846, 1077.86, 1082.72, 1060.7 +04/20/2018, 1072.96, 1887698, 1082, 1092.35, 1069.57 +04/19/2018, 1087.7, 1741907, 1069.4, 1094.165, 1068.18 +04/18/2018, 1072.08, 1336678, 1077.43, 1077.43, 1066.225 +04/17/2018, 1074.16, 2311903, 1051.37, 1077.88, 1048.26 +04/16/2018, 1037.98, 1194144, 1037, 1043.24, 1026.74 +04/13/2018, 1029.27, 1175754, 1040.88, 1046.42, 1022.98 +04/12/2018, 1032.51, 1357599, 1025.04, 1040.69, 1021.4347 +04/11/2018, 1019.97, 1476133, 1027.99, 1031.3641, 1015.87 +04/10/2018, 1031.64, 1983510, 1026.44, 1036.28, 1011.34 +04/09/2018, 1015.45, 1738682, 1016.8, 1039.6, 1014.08 +04/06/2018, 1007.04, 1740896, 1020, 1031.42, 1003.03 +04/05/2018, 1027.81, 1345681, 1041.33, 1042.79, 1020.1311 +04/04/2018, 1025.14, 2464418, 993.41, 1028.7175, 993 +04/03/2018, 1013.41, 2271858, 1013.91, 1020.99, 994.07 +04/02/2018, 1006.47, 2679214, 1022.82, 1034.8, 990.37 +03/29/2018, 1031.79, 2714402, 1011.63, 1043, 1002.9 +03/28/2018, 1004.56, 3345046, 998, 1024.23, 980.64 +03/27/2018, 1005.1, 3081612, 1063, 1064.8393, 996.92 +03/26/2018, 1053.21, 2593808, 1046, 1055.63, 1008.4 +03/23/2018, 1021.57, 2147097, 1047.03, 1063.36, 1021.22 +03/22/2018, 1049.08, 2584639, 1081.88, 1082.9, 1045.91 +03/21/2018, 1090.88, 1878294, 1092.74, 1106.2999, 1085.15 +03/20/2018, 1097.71, 1802209, 1099, 1105.2, 1083.46 +03/19/2018, 1099.82, 2355186, 1120.01, 1121.99, 1089.01 +03/16/2018, 1135.73, 2614871, 1154.14, 1155.88, 1131.96 +03/15/2018, 1149.58, 1397767, 1149.96, 1161.08, 1134.54 +03/14/2018, 1149.49, 1290638, 1145.21, 1158.59, 1141.44 +03/13/2018, 1138.17, 1874176, 1170, 1176.76, 1133.33 +03/12/2018, 1164.5, 2106548, 1163.85, 1177.05, 1157.42 +03/09/2018, 1160.04, 2121425, 1136, 1160.8, 1132.4606 +03/08/2018, 1126, 1393529, 1115.32, 1127.6, 1112.8 +03/07/2018, 1109.64, 1277439, 1089.19, 1112.22, 1085.4823 +03/06/2018, 1095.06, 1497087, 1099.22, 1101.85, 1089.775 +03/05/2018, 1090.93, 1141932, 1075.14, 1097.1, 1069.0001 +03/02/2018, 1078.92, 2271394, 1053.08, 1081.9986, 1048.115 +03/01/2018, 1069.52, 2511872, 1107.87, 1110.12, 1067.001 +02/28/2018, 1104.73, 1873737, 1123.03, 1127.53, 1103.24 +02/27/2018, 1118.29, 1772866, 1141.24, 1144.04, 1118 +02/26/2018, 1143.75, 1514920, 1127.8, 1143.96, 1126.695 +02/23/2018, 1126.79, 1190432, 1112.64, 1127.28, 1104.7135 +02/22/2018, 1106.63, 1309536, 1116.19, 1122.82, 1102.59 +02/21/2018, 1111.34, 1507152, 1106.47, 1133.97, 1106.33 +02/20/2018, 1102.46, 1389491, 1090.57, 1113.95, 1088.52 +02/16/2018, 1094.8, 1680283, 1088.41, 1104.67, 1088.3134 +02/15/2018, 1089.52, 1785552, 1079.07, 1091.4794, 1064.34 +02/14/2018, 1069.7, 1547665, 1048.95, 1071.72, 1046.75 +02/13/2018, 1052.1, 1213800, 1045, 1058.37, 1044.0872 +02/12/2018, 1051.94, 2054002, 1048, 1061.5, 1040.928 +02/09/2018, 1037.78, 3503970, 1017.25, 1043.97, 992.56 +02/08/2018, 1001.52, 2809890, 1055.41, 1058.62, 1000.66 +02/07/2018, 1048.58, 2353003, 1081.54, 1081.78, 1048.26 +02/06/2018, 1080.6, 3432313, 1027.18, 1081.71, 1023.1367 +02/05/2018, 1055.8, 3769453, 1090.6, 1110, 1052.03 +02/02/2018, 1111.9, 4837979, 1122, 1123.07, 1107.2779 +02/01/2018, 1167.7, 2380221, 1162.61, 1174, 1157.52 +01/31/2018, 1169.94, 1523820, 1170.57, 1173, 1159.13 +01/30/2018, 1163.69, 1541771, 1167.83, 1176.52, 1163.52 +01/29/2018, 1175.58, 1337324, 1176.48, 1186.89, 1171.98 +01/26/2018, 1175.84, 1981173, 1175.08, 1175.84, 1158.11 +01/25/2018, 1170.37, 1461518, 1172.53, 1175.94, 1162.76 +01/24/2018, 1164.24, 1382904, 1177.33, 1179.86, 1161.05 +01/23/2018, 1169.97, 1309862, 1159.85, 1171.6266, 1158.75 +01/22/2018, 1155.81, 1616120, 1137.49, 1159.88, 1135.1101 +01/19/2018, 1137.51, 1390118, 1131.83, 1137.86, 1128.3 +01/18/2018, 1129.79, 1194943, 1131.41, 1132.51, 1117.5 +01/17/2018, 1131.98, 1200476, 1126.22, 1132.6, 1117.01 +01/16/2018, 1121.76, 1566662, 1132.51, 1139.91, 1117.8316 +01/12/2018, 1122.26, 1718491, 1102.41, 1124.29, 1101.15 +01/11/2018, 1105.52, 977727, 1106.3, 1106.525, 1099.59 +01/10/2018, 1102.61, 1042273, 1097.1, 1104.6, 1096.11 +01/09/2018, 1106.26, 900089, 1109.4, 1110.57, 1101.2307 +01/08/2018, 1106.94, 1046767, 1102.23, 1111.27, 1101.62 +01/05/2018, 1102.23, 1279990, 1094, 1104.25, 1092 +01/04/2018, 1086.4, 1002945, 1088, 1093.5699, 1084.0017 +01/03/2018, 1082.48, 1429757, 1064.31, 1086.29, 1063.21 +01/02/2018, 1065, 1236401, 1048.34, 1066.94, 1045.23 +12/29/2017, 1046.4, 886845, 1046.72, 1049.7, 1044.9 +12/28/2017, 1048.14, 833011, 1051.6, 1054.75, 1044.77 +12/27/2017, 1049.37, 1271780, 1057.39, 1058.37, 1048.05 +12/26/2017, 1056.74, 761097, 1058.07, 1060.12, 1050.2 +12/22/2017, 1060.12, 755089, 1061.11, 1064.2, 1059.44 +12/21/2017, 1063.63, 986548, 1064.95, 1069.33, 1061.7938 +12/20/2017, 1064.95, 1268285, 1071.78, 1073.38, 1061.52 +12/19/2017, 1070.68, 1307894, 1075.2, 1076.84, 1063.55 +12/18/2017, 1077.14, 1552016, 1066.08, 1078.49, 1062 +12/15/2017, 1064.19, 3275091, 1054.61, 1067.62, 1049.5 +12/14/2017, 1049.15, 1558684, 1045, 1058.5, 1043.11 +12/13/2017, 1040.61, 1220364, 1046.12, 1046.665, 1038.38 +12/12/2017, 1040.48, 1279511, 1039.63, 1050.31, 1033.6897 +12/11/2017, 1041.1, 1190527, 1035.5, 1043.8, 1032.0504 +12/08/2017, 1037.05, 1288419, 1037.49, 1042.05, 1032.5222 +12/07/2017, 1030.93, 1458145, 1020.43, 1034.24, 1018.071 +12/06/2017, 1018.38, 1258496, 1001.5, 1024.97, 1001.14 +12/05/2017, 1005.15, 2066247, 995.94, 1020.61, 988.28 +12/04/2017, 998.68, 1906058, 1012.66, 1016.1, 995.57 +12/01/2017, 1010.17, 1908962, 1015.8, 1022.4897, 1002.02 +11/30/2017, 1021.41, 1723003, 1022.37, 1028.4899, 1015 +11/29/2017, 1021.66, 2442974, 1042.68, 1044.08, 1015.65 +11/28/2017, 1047.41, 1421027, 1055.09, 1062.375, 1040 +11/27/2017, 1054.21, 1307471, 1040, 1055.46, 1038.44 +11/24/2017, 1040.61, 536996, 1035.87, 1043.178, 1035 +11/22/2017, 1035.96, 746351, 1035, 1039.706, 1031.43 +11/21/2017, 1034.49, 1096161, 1023.31, 1035.11, 1022.655 +11/20/2017, 1018.38, 898389, 1020.26, 1022.61, 1017.5 +11/17/2017, 1019.09, 1366936, 1034.01, 1034.42, 1017.75 +11/16/2017, 1032.5, 1129424, 1022.52, 1035.92, 1022.52 +11/15/2017, 1020.91, 847932, 1019.21, 1024.09, 1015.42 +11/14/2017, 1026, 958708, 1022.59, 1026.81, 1014.15 +11/13/2017, 1025.75, 885565, 1023.42, 1031.58, 1022.57 +11/10/2017, 1028.07, 720674, 1026.46, 1030.76, 1025.28 +11/09/2017, 1031.26, 1244701, 1033.99, 1033.99, 1019.6656 +11/08/2017, 1039.85, 1088395, 1030.52, 1043.522, 1028.45 +11/07/2017, 1033.33, 1112123, 1027.27, 1033.97, 1025.13 +11/06/2017, 1025.9, 1124757, 1028.99, 1034.87, 1025 +11/03/2017, 1032.48, 1075134, 1022.11, 1032.65, 1020.31 +11/02/2017, 1025.58, 1048584, 1021.76, 1028.09, 1013.01 +11/01/2017, 1025.5, 1371619, 1017.21, 1029.67, 1016.95 +10/31/2017, 1016.64, 1331265, 1015.22, 1024, 1010.42 +10/30/2017, 1017.11, 2083490, 1014, 1024.97, 1007.5 +10/27/2017, 1019.27, 5165922, 1009.19, 1048.39, 1008.2 +10/26/2017, 972.56, 2027218, 980, 987.6, 972.2 +10/25/2017, 973.33, 1210368, 968.37, 976.09, 960.5201 +10/24/2017, 970.54, 1206074, 970, 972.23, 961 +10/23/2017, 968.45, 1471544, 989.52, 989.52, 966.12 +10/20/2017, 988.2, 1176177, 989.44, 991, 984.58 +10/19/2017, 984.45, 1312706, 986, 988.88, 978.39 +10/18/2017, 992.81, 1057285, 991.77, 996.72, 986.9747 +10/17/2017, 992.18, 1290152, 990.29, 996.44, 988.59 +10/16/2017, 992, 910246, 992.1, 993.9065, 984 +10/13/2017, 989.68, 1169584, 992, 997.21, 989 +10/12/2017, 987.83, 1278357, 987.45, 994.12, 985 +10/11/2017, 989.25, 1692843, 973.72, 990.71, 972.25 +10/10/2017, 972.6, 968113, 980, 981.57, 966.0801 +10/09/2017, 977, 890620, 980, 985.425, 976.11 +10/06/2017, 978.89, 1146207, 966.7, 979.46, 963.36 +10/05/2017, 969.96, 1210427, 955.49, 970.91, 955.18 +10/04/2017, 951.68, 951766, 957, 960.39, 950.69 +10/03/2017, 957.79, 888303, 954, 958, 949.14 +10/02/2017, 953.27, 1282850, 959.98, 962.54, 947.84 +09/29/2017, 959.11, 1576365, 952, 959.7864, 951.51 +09/28/2017, 949.5, 997036, 941.36, 950.69, 940.55 +09/27/2017, 944.49, 2237538, 927.74, 949.9, 927.74 +09/26/2017, 924.86, 1666749, 923.72, 930.82, 921.14 +09/25/2017, 920.97, 1855742, 925.45, 926.4, 909.7 +09/22/2017, 928.53, 1052170, 927.75, 934.73, 926.48 +09/21/2017, 932.45, 1227059, 933, 936.53, 923.83 +09/20/2017, 931.58, 1535626, 922.98, 933.88, 922 +09/19/2017, 921.81, 912967, 917.42, 922.4199, 912.55 +09/18/2017, 915, 1300759, 920.01, 922.08, 910.6 +09/15/2017, 920.29, 2499466, 924.66, 926.49, 916.36 +09/14/2017, 925.11, 1395497, 931.25, 932.77, 924 +09/13/2017, 935.09, 1101145, 930.66, 937.25, 929.86 +09/12/2017, 932.07, 1133638, 932.59, 933.48, 923.861 +09/11/2017, 929.08, 1266020, 934.25, 938.38, 926.92 +09/08/2017, 926.5, 997699, 936.49, 936.99, 924.88 +09/07/2017, 935.95, 1211472, 931.73, 936.41, 923.62 +09/06/2017, 927.81, 1526209, 930.15, 930.915, 919.27 +09/05/2017, 928.45, 1346791, 933.08, 937, 921.96 +09/01/2017, 937.34, 943657, 941.13, 942.48, 935.15 +08/31/2017, 939.33, 1566888, 931.76, 941.98, 931.76 +08/30/2017, 929.57, 1300616, 920.05, 930.819, 919.65 +08/29/2017, 921.29, 1181391, 905.1, 923.33, 905 +08/28/2017, 913.81, 1085014, 916, 919.245, 911.87 +08/25/2017, 915.89, 1052764, 923.49, 925.555, 915.5 +08/24/2017, 921.28, 1266191, 928.66, 930.84, 915.5 +08/23/2017, 927, 1088575, 921.93, 929.93, 919.36 +08/22/2017, 924.69, 1166320, 912.72, 925.86, 911.4751 +08/21/2017, 906.66, 942328, 910, 913, 903.4 +08/18/2017, 910.67, 1341990, 910.31, 915.275, 907.1543 +08/17/2017, 910.98, 1241782, 925.78, 926.86, 910.98 +08/16/2017, 926.96, 1005261, 925.29, 932.7, 923.445 +08/15/2017, 922.22, 882479, 924.23, 926.5499, 919.82 +08/14/2017, 922.67, 1063404, 922.53, 924.668, 918.19 +08/11/2017, 914.39, 1205652, 907.97, 917.78, 905.58 +08/10/2017, 907.24, 1755521, 917.55, 919.26, 906.13 +08/09/2017, 922.9, 1191332, 920.61, 925.98, 917.2501 +08/08/2017, 926.79, 1057351, 927.09, 935.814, 925.6095 +08/07/2017, 929.36, 1031710, 929.06, 931.7, 926.5 +08/04/2017, 927.96, 1081814, 926.75, 930.3068, 923.03 +08/03/2017, 923.65, 1201519, 930.34, 932.24, 922.24 +08/02/2017, 930.39, 1822272, 928.61, 932.6, 916.68 +08/01/2017, 930.83, 1234612, 932.38, 937.447, 929.26 +07/31/2017, 930.5, 1964748, 941.89, 943.59, 926.04 +07/28/2017, 941.53, 1802343, 929.4, 943.83, 927.5 +07/27/2017, 934.09, 3128819, 951.78, 951.78, 920 +07/26/2017, 947.8, 2069349, 954.68, 955, 942.2788 +07/25/2017, 950.7, 4656609, 953.81, 959.7, 945.4 +07/24/2017, 980.34, 3205374, 972.22, 986.2, 970.77 +07/21/2017, 972.92, 1697190, 962.25, 973.23, 960.15 +07/20/2017, 968.15, 1620636, 975, 975.9, 961.51 +07/19/2017, 970.89, 1221155, 967.84, 973.04, 964.03 +07/18/2017, 965.4, 1152741, 953, 968.04, 950.6 +07/17/2017, 953.42, 1164141, 957, 960.74, 949.2407 +07/14/2017, 955.99, 1052855, 952, 956.91, 948.005 +07/13/2017, 947.16, 1294674, 946.29, 954.45, 943.01 +07/12/2017, 943.83, 1517168, 938.68, 946.3, 934.47 +07/11/2017, 930.09, 1112417, 929.54, 931.43, 922 +07/10/2017, 928.8, 1190237, 921.77, 930.38, 919.59 +07/07/2017, 918.59, 1590456, 908.85, 921.54, 908.85 +07/06/2017, 906.69, 1424290, 904.12, 914.9444, 899.7 +07/05/2017, 911.71, 1813309, 901.76, 914.51, 898.5 +07/03/2017, 898.7, 1710373, 912.18, 913.94, 894.79 +06/30/2017, 908.73, 2086340, 926.05, 926.05, 908.31 +06/29/2017, 917.79, 3287991, 929.92, 931.26, 910.62 +06/28/2017, 940.49, 2719213, 929, 942.75, 916 +06/27/2017, 927.33, 2566047, 942.46, 948.29, 926.85 +06/26/2017, 952.27, 1596664, 969.9, 973.31, 950.79 +06/23/2017, 965.59, 1527513, 956.83, 966, 954.2 +06/22/2017, 957.09, 941639, 958.7, 960.72, 954.55 +06/21/2017, 959.45, 1201971, 953.64, 960.1, 950.76 +06/20/2017, 950.63, 1125520, 957.52, 961.62, 950.01 +06/19/2017, 957.37, 1520715, 949.96, 959.99, 949.05 +06/16/2017, 939.78, 3061794, 940, 942.04, 931.595 +06/15/2017, 942.31, 2065271, 933.97, 943.339, 924.44 +06/14/2017, 950.76, 1487378, 959.92, 961.15, 942.25 +06/13/2017, 953.4, 2012980, 951.91, 959.98, 944.09 +06/12/2017, 942.9, 3762434, 939.56, 949.355, 915.2328 +06/09/2017, 949.83, 3305545, 984.5, 984.5, 935.63 +06/08/2017, 983.41, 1477151, 982.35, 984.57, 977.2 +06/07/2017, 981.08, 1447172, 979.65, 984.15, 975.77 +06/06/2017, 976.57, 1814323, 983.16, 988.25, 975.14 +06/05/2017, 983.68, 1251903, 976.55, 986.91, 975.1 +06/02/2017, 975.6, 1750723, 969.46, 975.88, 966 +06/01/2017, 966.95, 1408958, 968.95, 971.5, 960.01 +05/31/2017, 964.86, 2447176, 975.02, 979.27, 960.18 +05/30/2017, 975.88, 1466288, 970.31, 976.2, 969.49 +05/26/2017, 971.47, 1251425, 969.7, 974.98, 965.03 +05/25/2017, 969.54, 1659422, 957.33, 972.629, 955.47 +05/24/2017, 954.96, 1031408, 952.98, 955.09, 949.5 +05/23/2017, 948.82, 1269438, 947.92, 951.4666, 942.575 +05/22/2017, 941.86, 1118456, 935, 941.8828, 935 +05/19/2017, 934.01, 1389848, 931.47, 937.755, 931 +05/18/2017, 930.24, 1596058, 921, 933.17, 918.75 +05/17/2017, 919.62, 2357922, 935.67, 939.3325, 918.14 +05/16/2017, 943, 968288, 940, 943.11, 937.58 +05/15/2017, 937.08, 1104595, 932.95, 938.25, 929.34 +05/12/2017, 932.22, 1050377, 931.53, 933.44, 927.85 +05/11/2017, 930.6, 834997, 925.32, 932.53, 923.0301 +05/10/2017, 928.78, 1173887, 931.98, 932, 925.16 +05/09/2017, 932.17, 1581236, 936.95, 937.5, 929.53 +05/08/2017, 934.3, 1328885, 926.12, 936.925, 925.26 +05/05/2017, 927.13, 1910317, 933.54, 934.9, 925.2 +05/04/2017, 931.66, 1421938, 926.07, 935.93, 924.59 +05/03/2017, 927.04, 1497565, 914.86, 928.1, 912.5426 +05/02/2017, 916.44, 1543696, 909.62, 920.77, 909.4526 +05/01/2017, 912.57, 2114629, 901.94, 915.68, 901.45 +04/28/2017, 905.96, 3223850, 910.66, 916.85, 905.77 +04/27/2017, 874.25, 2009509, 873.6, 875.4, 870.38 +04/26/2017, 871.73, 1233724, 874.23, 876.05, 867.7481 +04/25/2017, 872.3, 1670095, 865, 875, 862.81 +04/24/2017, 862.76, 1371722, 851.2, 863.45, 849.86 +04/21/2017, 843.19, 1323364, 842.88, 843.88, 840.6 +04/20/2017, 841.65, 957994, 841.44, 845.2, 839.32 +04/19/2017, 838.21, 954324, 839.79, 842.22, 836.29 +04/18/2017, 836.82, 835433, 834.22, 838.93, 832.71 +04/17/2017, 837.17, 894540, 825.01, 837.75, 824.47 +04/13/2017, 823.56, 1118221, 822.14, 826.38, 821.44 +04/12/2017, 824.32, 900059, 821.93, 826.66, 821.02 +04/11/2017, 823.35, 1078951, 824.71, 827.4267, 817.0201 +04/10/2017, 824.73, 978825, 825.39, 829.35, 823.77 +04/07/2017, 824.67, 1056692, 827.96, 828.485, 820.5127 +04/06/2017, 827.88, 1254235, 832.4, 836.39, 826.46 +04/05/2017, 831.41, 1553163, 835.51, 842.45, 830.72 +04/04/2017, 834.57, 1044455, 831.36, 835.18, 829.0363 +04/03/2017, 838.55, 1670349, 829.22, 840.85, 829.22 +03/31/2017, 829.56, 1401756, 828.97, 831.64, 827.39 +03/30/2017, 831.5, 1055263, 833.5, 833.68, 829 +03/29/2017, 831.41, 1785006, 825, 832.765, 822.3801 +03/28/2017, 820.92, 1620532, 820.41, 825.99, 814.027 +03/27/2017, 819.51, 1894735, 806.95, 821.63, 803.37 +03/24/2017, 814.43, 1980415, 820.08, 821.93, 808.89 +03/23/2017, 817.58, 3485390, 821, 822.57, 812.257 +03/22/2017, 829.59, 1399409, 831.91, 835.55, 827.1801 +03/21/2017, 830.46, 2461375, 851.4, 853.5, 829.02 +03/20/2017, 848.4, 1217560, 850.01, 850.22, 845.15 +03/17/2017, 852.12, 1712397, 851.61, 853.4, 847.11 +03/16/2017, 848.78, 977384, 849.03, 850.85, 846.13 +03/15/2017, 847.2, 1381328, 847.59, 848.63, 840.77 +03/14/2017, 845.62, 779920, 843.64, 847.24, 840.8 +03/13/2017, 845.54, 1149928, 844, 848.685, 843.25 +03/10/2017, 843.25, 1702731, 843.28, 844.91, 839.5 +03/09/2017, 838.68, 1261393, 836, 842, 834.21 +03/08/2017, 835.37, 988900, 833.51, 838.15, 831.79 +03/07/2017, 831.91, 1037573, 827.4, 833.41, 826.52 +03/06/2017, 827.78, 1108799, 826.95, 828.88, 822.4 +03/03/2017, 829.08, 890640, 830.56, 831.36, 825.751 +03/02/2017, 830.63, 937824, 833.85, 834.51, 829.64 +03/01/2017, 835.24, 1495934, 828.85, 836.255, 827.26 +02/28/2017, 823.21, 2258695, 825.61, 828.54, 820.2 +02/27/2017, 829.28, 1101120, 824.55, 830.5, 824 +02/24/2017, 828.64, 1392039, 827.73, 829, 824.2 +02/23/2017, 831.33, 1471342, 830.12, 832.46, 822.88 +02/22/2017, 830.76, 983058, 828.66, 833.25, 828.64 +02/21/2017, 831.66, 1259841, 828.66, 833.45, 828.35 +02/17/2017, 828.07, 1602549, 823.02, 828.07, 821.655 +02/16/2017, 824.16, 1285919, 819.93, 824.4, 818.98 +02/15/2017, 818.98, 1311316, 819.36, 823, 818.47 +02/14/2017, 820.45, 1054472, 819, 823, 816 +02/13/2017, 819.24, 1205835, 816, 820.959, 815.49 +02/10/2017, 813.67, 1134701, 811.7, 815.25, 809.78 +02/09/2017, 809.56, 990260, 809.51, 810.66, 804.54 +02/08/2017, 808.38, 1155892, 807, 811.84, 803.1903 +02/07/2017, 806.97, 1240257, 803.99, 810.5, 801.78 +02/06/2017, 801.34, 1182882, 799.7, 801.67, 795.2501 +02/03/2017, 801.49, 1461217, 802.99, 806, 800.37 +02/02/2017, 798.53, 1530827, 793.8, 802.7, 792 +02/01/2017, 795.695, 2027708, 799.68, 801.19, 791.19 +01/31/2017, 796.79, 2153957, 796.86, 801.25, 790.52 +01/30/2017, 802.32, 3243568, 814.66, 815.84, 799.8 +01/27/2017, 823.31, 2964989, 834.71, 841.95, 820.44 +01/26/2017, 832.15, 2944642, 837.81, 838, 827.01 +01/25/2017, 835.67, 1612854, 829.62, 835.77, 825.06 +01/24/2017, 823.87, 1472228, 822.3, 825.9, 817.821 +01/23/2017, 819.31, 1962506, 807.25, 820.87, 803.74 +01/20/2017, 805.02, 1668638, 806.91, 806.91, 801.69 +01/19/2017, 802.175, 917085, 805.12, 809.48, 801.8 +01/18/2017, 806.07, 1293893, 805.81, 806.205, 800.99 +01/17/2017, 804.61, 1361935, 807.08, 807.14, 800.37 +01/13/2017, 807.88, 1098154, 807.48, 811.2244, 806.69 +01/12/2017, 806.36, 1352872, 807.14, 807.39, 799.17 +01/11/2017, 807.91, 1065360, 805, 808.15, 801.37 +01/10/2017, 804.79, 1176637, 807.86, 809.1299, 803.51 +01/09/2017, 806.65, 1274318, 806.4, 809.9664, 802.83 +01/06/2017, 806.15, 1639246, 795.26, 807.9, 792.2041 +01/05/2017, 794.02, 1334028, 786.08, 794.48, 785.02 +01/04/2017, 786.9, 1071198, 788.36, 791.34, 783.16 +01/03/2017, 786.14, 1657291, 778.81, 789.63, 775.8 +12/30/2016, 771.82, 1769809, 782.75, 782.78, 770.41 +12/29/2016, 782.79, 743808, 783.33, 785.93, 778.92 +12/28/2016, 785.05, 1142148, 793.7, 794.23, 783.2 +12/27/2016, 791.55, 789151, 790.68, 797.86, 787.657 +12/23/2016, 789.91, 623682, 790.9, 792.74, 787.28 +12/22/2016, 791.26, 972147, 792.36, 793.32, 788.58 +12/21/2016, 794.56, 1208770, 795.84, 796.6757, 787.1 +12/20/2016, 796.42, 950345, 796.76, 798.65, 793.27 +12/19/2016, 794.2, 1231966, 790.22, 797.66, 786.27 +12/16/2016, 790.8, 2435100, 800.4, 800.8558, 790.29 +12/15/2016, 797.85, 1623709, 797.34, 803, 792.92 +12/14/2016, 797.07, 1700875, 797.4, 804, 794.01 +12/13/2016, 796.1, 2122735, 793.9, 804.3799, 793.34 +12/12/2016, 789.27, 2102288, 785.04, 791.25, 784.3554 +12/09/2016, 789.29, 1821146, 780, 789.43, 779.021 +12/08/2016, 776.42, 1487517, 772.48, 778.18, 767.23 +12/07/2016, 771.19, 1757710, 761, 771.36, 755.8 +12/06/2016, 759.11, 1690365, 764.73, 768.83, 757.34 +12/05/2016, 762.52, 1393566, 757.71, 763.9, 752.9 +12/02/2016, 750.5, 1452181, 744.59, 754, 743.1 +12/01/2016, 747.92, 3017001, 757.44, 759.85, 737.0245 +11/30/2016, 758.04, 2386628, 770.07, 772.99, 754.83 +11/29/2016, 770.84, 1616427, 771.53, 778.5, 768.24 +11/28/2016, 768.24, 2177039, 760, 779.53, 759.8 +11/25/2016, 761.68, 587421, 764.26, 765, 760.52 +11/23/2016, 760.99, 1477501, 767.73, 768.2825, 755.25 +11/22/2016, 768.27, 1592372, 772.63, 776.96, 767 +11/21/2016, 769.2, 1324431, 762.61, 769.7, 760.6 +11/18/2016, 760.54, 1528555, 771.37, 775, 760 +11/17/2016, 771.23, 1298484, 766.92, 772.7, 764.23 +11/16/2016, 764.48, 1468196, 755.2, 766.36, 750.51 +11/15/2016, 758.49, 2375056, 746.97, 764.4162, 746.97 +11/14/2016, 736.08, 3644965, 755.6, 757.85, 727.54 +11/11/2016, 754.02, 2421889, 756.54, 760.78, 750.38 +11/10/2016, 762.56, 4733916, 791.17, 791.17, 752.18 +11/09/2016, 785.31, 2603860, 779.94, 791.2265, 771.67 +11/08/2016, 790.51, 1361472, 783.4, 795.633, 780.19 +11/07/2016, 782.52, 1574426, 774.5, 785.19, 772.55 +11/04/2016, 762.02, 2131948, 750.66, 770.36, 750.5611 +11/03/2016, 762.13, 1933937, 767.25, 769.95, 759.03 +11/02/2016, 768.7, 1905814, 778.2, 781.65, 763.4496 +11/01/2016, 783.61, 2404898, 782.89, 789.49, 775.54 +10/31/2016, 784.54, 2420892, 795.47, 796.86, 784 +10/28/2016, 795.37, 4261912, 808.35, 815.49, 793.59 +10/27/2016, 795.35, 2723097, 801, 803.49, 791.5 +10/26/2016, 799.07, 1645403, 806.34, 806.98, 796.32 +10/25/2016, 807.67, 1575020, 816.68, 816.68, 805.14 +10/24/2016, 813.11, 1693162, 804.9, 815.18, 804.82 +10/21/2016, 799.37, 1262042, 795, 799.5, 794 +10/20/2016, 796.97, 1755546, 803.3, 803.97, 796.03 +10/19/2016, 801.56, 1762990, 798.86, 804.63, 797.635 +10/18/2016, 795.26, 2046338, 787.85, 801.61, 785.565 +10/17/2016, 779.96, 1091524, 779.8, 785.85, 777.5 +10/14/2016, 778.53, 851512, 781.65, 783.95, 776 +10/13/2016, 778.19, 1360619, 781.22, 781.22, 773 +10/12/2016, 786.14, 935138, 783.76, 788.13, 782.06 +10/11/2016, 783.07, 1371461, 786.66, 792.28, 780.58 +10/10/2016, 785.94, 1161410, 777.71, 789.38, 775.87 +10/07/2016, 775.08, 932444, 779.66, 779.66, 770.75 +10/06/2016, 776.86, 1066910, 779, 780.48, 775.54 +10/05/2016, 776.47, 1457661, 779.31, 782.07, 775.65 +10/04/2016, 776.43, 1198361, 776.03, 778.71, 772.89 +10/03/2016, 772.56, 1276614, 774.25, 776.065, 769.5 +09/30/2016, 777.29, 1583293, 776.33, 780.94, 774.09 +09/29/2016, 775.01, 1310252, 781.44, 785.8, 774.232 +09/28/2016, 781.56, 1108249, 777.85, 781.81, 774.97 +09/27/2016, 783.01, 1152760, 775.5, 785.9899, 774.308 +09/26/2016, 774.21, 1531788, 782.74, 782.74, 773.07 +09/23/2016, 786.9, 1411439, 786.59, 788.93, 784.15 +09/22/2016, 787.21, 1483899, 780, 789.85, 778.44 +09/21/2016, 776.22, 1166290, 772.66, 777.16, 768.301 +09/20/2016, 771.41, 975434, 769, 773.33, 768.53 +09/19/2016, 765.7, 1171969, 772.42, 774, 764.4406 +09/16/2016, 768.88, 2047036, 769.75, 769.75, 764.66 +09/15/2016, 771.76, 1344945, 762.89, 773.8, 759.96 +09/14/2016, 762.49, 1093723, 759.61, 767.68, 759.11 +09/13/2016, 759.69, 1394158, 764.48, 766.2195, 755.8 +09/12/2016, 769.02, 1310493, 755.13, 770.29, 754.0001 +09/09/2016, 759.66, 1879903, 770.1, 773.245, 759.66 +09/08/2016, 775.32, 1268663, 778.59, 780.35, 773.58 +09/07/2016, 780.35, 893874, 780, 782.73, 776.2 +09/06/2016, 780.08, 1441864, 773.45, 782, 771 +09/02/2016, 771.46, 1070725, 773.01, 773.9199, 768.41 +09/01/2016, 768.78, 925019, 769.25, 771.02, 764.3 +08/31/2016, 767.05, 1247937, 767.01, 769.09, 765.38 +08/30/2016, 769.09, 1129932, 769.33, 774.466, 766.84 +08/29/2016, 772.15, 847537, 768.74, 774.99, 766.615 +08/26/2016, 769.54, 1164713, 769, 776.0799, 765.85 +08/25/2016, 769.41, 926856, 767, 771.89, 763.1846 +08/24/2016, 769.64, 1071569, 770.58, 774.5, 767.07 +08/23/2016, 772.08, 925356, 775.48, 776.44, 771.785 +08/22/2016, 772.15, 950417, 773.27, 774.54, 770.0502 +08/19/2016, 775.42, 860899, 775, 777.1, 773.13 +08/18/2016, 777.5, 718882, 780.01, 782.86, 777 +08/17/2016, 779.91, 921666, 777.32, 780.81, 773.53 +08/16/2016, 777.14, 1027836, 780.3, 780.98, 773.444 +08/15/2016, 782.44, 938183, 783.75, 787.49, 780.11 +08/12/2016, 783.22, 739761, 781.5, 783.395, 780.4 +08/11/2016, 784.85, 971742, 785, 789.75, 782.97 +08/10/2016, 784.68, 784559, 783.75, 786.8123, 782.778 +08/09/2016, 784.26, 1318457, 781.1, 788.94, 780.57 +08/08/2016, 781.76, 1106693, 782, 782.63, 778.091 +08/05/2016, 782.22, 1799478, 773.78, 783.04, 772.34 +08/04/2016, 771.61, 1139972, 772.22, 774.07, 768.795 +08/03/2016, 773.18, 1283186, 767.18, 773.21, 766.82 +08/02/2016, 771.07, 1782822, 768.69, 775.84, 767.85 +08/01/2016, 772.88, 2697699, 761.09, 780.43, 761.09 +07/29/2016, 768.79, 3830103, 772.71, 778.55, 766.77 +07/28/2016, 745.91, 3473040, 747.04, 748.65, 739.3 +07/27/2016, 741.77, 1509133, 738.28, 744.46, 737 +07/26/2016, 738.42, 1182993, 739.04, 741.69, 734.27 +07/25/2016, 739.77, 1031643, 740.67, 742.61, 737.5 +07/22/2016, 742.74, 1256741, 741.86, 743.24, 736.56 +07/21/2016, 738.63, 1022229, 740.36, 741.69, 735.831 +07/20/2016, 741.19, 1283931, 737.33, 742.13, 737.1 +07/19/2016, 736.96, 1225467, 729.89, 736.99, 729 +07/18/2016, 733.78, 1284740, 722.71, 736.13, 721.19 +07/15/2016, 719.85, 1277514, 725.73, 725.74, 719.055 +07/14/2016, 720.95, 949456, 721.58, 722.21, 718.03 +07/13/2016, 716.98, 933352, 723.62, 724, 716.85 +07/12/2016, 720.64, 1336112, 719.12, 722.94, 715.91 +07/11/2016, 715.09, 1107039, 708.05, 716.51, 707.24 +07/08/2016, 705.63, 1573909, 699.5, 705.71, 696.435 +07/07/2016, 695.36, 1303661, 698.08, 698.2, 688.215 +07/06/2016, 697.77, 1411080, 689.98, 701.68, 689.09 +07/05/2016, 694.49, 1462879, 696.06, 696.94, 688.88 +07/01/2016, 699.21, 1344387, 692.2, 700.65, 692.1301 +06/30/2016, 692.1, 1597298, 685.47, 692.32, 683.65 +06/29/2016, 684.11, 1931436, 683, 687.4292, 681.41 +06/28/2016, 680.04, 2169704, 678.97, 680.33, 673 +06/27/2016, 668.26, 2632011, 671, 672.3, 663.284 +06/24/2016, 675.22, 4442943, 675.17, 689.4, 673.45 +06/23/2016, 701.87, 2166183, 697.45, 701.95, 687 +06/22/2016, 697.46, 1182161, 699.06, 700.86, 693.0819 +06/21/2016, 695.94, 1464836, 698.4, 702.77, 692.01 +06/20/2016, 693.71, 2080645, 698.77, 702.48, 693.41 +06/17/2016, 691.72, 3397720, 708.65, 708.82, 688.4515 +06/16/2016, 710.36, 1981657, 714.91, 716.65, 703.26 +06/15/2016, 718.92, 1213386, 719, 722.98, 717.31 +06/14/2016, 718.27, 1303808, 716.48, 722.47, 713.12 +06/13/2016, 718.36, 1255199, 716.51, 725.44, 716.51 +06/10/2016, 719.41, 1213989, 719.47, 725.89, 716.43 +06/09/2016, 728.58, 987635, 722.87, 729.54, 722.3361 +06/08/2016, 728.28, 1583325, 723.96, 728.57, 720.58 +06/07/2016, 716.65, 1336348, 719.84, 721.98, 716.55 +06/06/2016, 716.55, 1565955, 724.91, 724.91, 714.61 +06/03/2016, 722.34, 1225924, 729.27, 729.49, 720.56 +06/02/2016, 730.4, 1340664, 732.5, 733.02, 724.17 +06/01/2016, 734.15, 1251468, 734.53, 737.21, 730.66 +05/31/2016, 735.72, 2128358, 731.74, 739.73, 731.26 +05/27/2016, 732.66, 1974425, 724.01, 733.936, 724 +05/26/2016, 724.12, 1573635, 722.87, 728.33, 720.28 +05/25/2016, 725.27, 1629790, 720.76, 727.51, 719.7047 +05/24/2016, 720.09, 1926828, 706.86, 720.97, 706.86 +05/23/2016, 704.24, 1326386, 706.53, 711.4781, 704.18 +05/20/2016, 709.74, 1825830, 701.62, 714.58, 700.52 +05/19/2016, 700.32, 1668887, 702.36, 706, 696.8 +05/18/2016, 706.63, 1765632, 703.67, 711.6, 700.63 +05/17/2016, 706.23, 1999883, 715.99, 721.52, 704.11 +05/16/2016, 716.49, 1316719, 709.13, 718.48, 705.65 +05/13/2016, 710.83, 1307559, 711.93, 716.6619, 709.26 +05/12/2016, 713.31, 1361170, 717.06, 719.25, 709 +05/11/2016, 715.29, 1690862, 723.41, 724.48, 712.8 +05/10/2016, 723.18, 1568621, 716.75, 723.5, 715.72 +05/09/2016, 712.9, 1509892, 712, 718.71, 710 +05/06/2016, 711.12, 1828508, 698.38, 711.86, 698.1067 +05/05/2016, 701.43, 1680220, 697.7, 702.3199, 695.72 +05/04/2016, 695.7, 1692757, 690.49, 699.75, 689.01 +05/03/2016, 692.36, 1541297, 696.87, 697.84, 692 +05/02/2016, 698.21, 1645013, 697.63, 700.64, 691 +04/29/2016, 693.01, 2486584, 690.7, 697.62, 689 +04/28/2016, 691.02, 2859790, 708.26, 714.17, 689.55 +04/27/2016, 705.84, 3094905, 707.29, 708.98, 692.3651 +04/26/2016, 708.14, 2739133, 725.42, 725.766, 703.0264 +04/25/2016, 723.15, 1956956, 716.1, 723.93, 715.59 +04/22/2016, 718.77, 5949699, 726.3, 736.12, 713.61 +04/21/2016, 759.14, 2995094, 755.38, 760.45, 749.55 +04/20/2016, 752.67, 1526776, 758, 758.1315, 750.01 +04/19/2016, 753.93, 2027962, 769.51, 769.9, 749.33 +04/18/2016, 766.61, 1557199, 760.46, 768.05, 757.3 +04/15/2016, 759, 1807062, 753.98, 761, 752.6938 +04/14/2016, 753.2, 1134056, 754.01, 757.31, 752.705 +04/13/2016, 751.72, 1707397, 749.16, 754.38, 744.261 +04/12/2016, 743.09, 1349780, 738, 743.83, 731.01 +04/11/2016, 736.1, 1218789, 743.02, 745, 736.05 +04/08/2016, 739.15, 1289869, 743.97, 745.45, 735.55 +04/07/2016, 740.28, 1452369, 745.37, 746.9999, 736.28 +04/06/2016, 745.69, 1052171, 735.77, 746.24, 735.56 +04/05/2016, 737.8, 1130817, 738, 742.8, 735.37 +04/04/2016, 745.29, 1134214, 750.06, 752.8, 742.43 +04/01/2016, 749.91, 1576240, 738.6, 750.34, 737 +03/31/2016, 744.95, 1718638, 749.25, 750.85, 740.94 +03/30/2016, 750.53, 1782278, 750.1, 757.88, 748.74 +03/29/2016, 744.77, 1902254, 734.59, 747.25, 728.76 +03/28/2016, 733.53, 1300817, 736.79, 738.99, 732.5 +03/24/2016, 735.3, 1570474, 732.01, 737.747, 731 +03/23/2016, 738.06, 1431130, 742.36, 745.7199, 736.15 +03/22/2016, 740.75, 1269263, 737.46, 745, 737.46 +03/21/2016, 742.09, 1835963, 736.5, 742.5, 733.5157 +03/18/2016, 737.6, 2982194, 741.86, 742, 731.83 +03/17/2016, 737.78, 1859562, 736.45, 743.07, 736 +03/16/2016, 736.09, 1621412, 726.37, 737.47, 724.51 +03/15/2016, 728.33, 1720790, 726.92, 732.29, 724.77 +03/14/2016, 730.49, 1717002, 726.81, 735.5, 725.15 +03/11/2016, 726.82, 1968164, 720, 726.92, 717.125 +03/10/2016, 712.82, 2830630, 708.12, 716.44, 703.36 +03/09/2016, 705.24, 1419661, 698.47, 705.68, 694 +03/08/2016, 693.97, 2075305, 688.59, 703.79, 685.34 +03/07/2016, 695.16, 2986064, 706.9, 708.0912, 686.9 +03/04/2016, 710.89, 1971379, 714.99, 716.49, 706.02 +03/03/2016, 712.42, 1956958, 718.68, 719.45, 706.02 +03/02/2016, 718.85, 1629501, 719, 720, 712 +03/01/2016, 718.81, 2148608, 703.62, 718.81, 699.77 +02/29/2016, 697.77, 2478214, 700.32, 710.89, 697.68 +02/26/2016, 705.07, 2241785, 708.58, 713.43, 700.86 +02/25/2016, 705.75, 1640430, 700.01, 705.98, 690.585 +02/24/2016, 699.56, 1961258, 688.92, 700, 680.78 +02/23/2016, 695.85, 2006572, 701.45, 708.4, 693.58 +02/22/2016, 706.46, 1949046, 707.45, 713.24, 702.51 +02/19/2016, 700.91, 1585152, 695.03, 703.0805, 694.05 +02/18/2016, 697.35, 1880306, 710, 712.35, 696.03 +02/17/2016, 708.4, 2490021, 699, 709.75, 691.38 +02/16/2016, 691, 2517324, 692.98, 698, 685.05 +02/12/2016, 682.4, 2138937, 690.26, 693.75, 678.6 +02/11/2016, 683.11, 3021587, 675, 689.35, 668.8675 +02/10/2016, 684.12, 2629130, 686.86, 701.31, 682.13 +02/09/2016, 678.11, 3605792, 672.32, 699.9, 668.77 +02/08/2016, 682.74, 4241416, 667.85, 684.03, 663.06 +02/05/2016, 683.57, 5098357, 703.87, 703.99, 680.15 +02/04/2016, 708.01, 5157988, 722.81, 727, 701.86 +02/03/2016, 726.95, 6166731, 770.22, 774.5, 720.5 +02/02/2016, 764.65, 6340548, 784.5, 789.8699, 764.65 +02/01/2016, 752, 5065235, 750.46, 757.86, 743.27 +01/29/2016, 742.95, 3464432, 731.53, 744.9899, 726.8 +01/28/2016, 730.96, 2664956, 722.22, 733.69, 712.35 +01/27/2016, 699.99, 2175913, 713.67, 718.235, 694.39 +01/26/2016, 713.04, 1329141, 713.85, 718.28, 706.48 +01/25/2016, 711.67, 1709777, 723.58, 729.68, 710.01 +01/22/2016, 725.25, 2009951, 723.6, 728.13, 720.121 +01/21/2016, 706.59, 2411079, 702.18, 719.19, 694.46 +01/20/2016, 698.45, 3441642, 688.61, 706.85, 673.26 +01/19/2016, 701.79, 2264747, 703.3, 709.98, 693.4101 +01/15/2016, 694.45, 3604137, 692.29, 706.74, 685.37 +01/14/2016, 714.72, 2225495, 705.38, 721.925, 689.1 +01/13/2016, 700.56, 2497086, 730.85, 734.74, 698.61 +01/12/2016, 726.07, 2010026, 721.68, 728.75, 717.3165 +01/11/2016, 716.03, 2089495, 716.61, 718.855, 703.54 +01/08/2016, 714.47, 2449420, 731.45, 733.23, 713 +01/07/2016, 726.39, 2960578, 730.31, 738.5, 719.06 +01/06/2016, 743.62, 1943685, 730, 747.18, 728.92 +01/05/2016, 742.58, 1949386, 746.45, 752, 738.64 +01/04/2016, 741.84, 3271348, 743, 744.06, 731.2577 +12/31/2015, 758.88, 1500129, 769.5, 769.5, 758.34 +12/30/2015, 771, 1293514, 776.6, 777.6, 766.9 +12/29/2015, 776.6, 1764044, 766.69, 779.98, 766.43 +12/28/2015, 762.51, 1515574, 752.92, 762.99, 749.52 +12/24/2015, 748.4, 527223, 749.55, 751.35, 746.62 +12/23/2015, 750.31, 1566723, 753.47, 754.21, 744 +12/22/2015, 750, 1365420, 751.65, 754.85, 745.53 +12/21/2015, 747.77, 1524535, 746.13, 750, 740 +12/18/2015, 739.31, 3140906, 746.51, 754.13, 738.15 +12/17/2015, 749.43, 1551087, 762.42, 762.68, 749 +12/16/2015, 758.09, 1986319, 750, 760.59, 739.435 +12/15/2015, 743.4, 2661199, 753, 758.08, 743.01 +12/14/2015, 747.77, 2417778, 741.79, 748.73, 724.17 +12/11/2015, 738.87, 2223284, 741.16, 745.71, 736.75 +12/10/2015, 749.46, 1988035, 752.85, 755.85, 743.83 +12/09/2015, 751.61, 2697978, 759.17, 764.23, 737.001 +12/08/2015, 762.37, 1829004, 757.89, 764.8, 754.2 +12/07/2015, 763.25, 1811336, 767.77, 768.73, 755.09 +12/04/2015, 766.81, 2756194, 753.1, 768.49, 750 +12/03/2015, 752.54, 2589641, 766.01, 768.995, 745.63 +12/02/2015, 762.38, 2196721, 768.9, 775.955, 758.96 +12/01/2015, 767.04, 2131827, 747.11, 768.95, 746.7 +11/30/2015, 742.6, 2045584, 748.81, 754.93, 741.27 +11/27/2015, 750.26, 838528, 748.46, 753.41, 747.49 +11/25/2015, 748.15, 1122224, 748.14, 752, 746.06 +11/24/2015, 748.28, 2333700, 752, 755.279, 737.63 +11/23/2015, 755.98, 1414640, 757.45, 762.7075, 751.82 +11/20/2015, 756.6, 2212934, 746.53, 757.92, 743 +11/19/2015, 738.41, 1327265, 738.74, 742, 737.43 +11/18/2015, 740, 1683978, 727.58, 741.41, 727 +11/17/2015, 725.3, 1507449, 729.29, 731.845, 723.027 +11/16/2015, 728.96, 1904395, 715.6, 729.49, 711.33 +11/13/2015, 717, 2072392, 729.17, 731.15, 716.73 +11/12/2015, 731.23, 1836567, 731, 737.8, 728.645 +11/11/2015, 735.4, 1366611, 732.46, 741, 730.23 +11/10/2015, 728.32, 1606499, 724.4, 730.59, 718.5001 +11/09/2015, 724.89, 2068920, 730.2, 734.71, 719.43 +11/06/2015, 733.76, 1510586, 731.5, 735.41, 727.01 +11/05/2015, 731.25, 1861100, 729.47, 739.48, 729.47 +11/04/2015, 728.11, 1705745, 722, 733.1, 721.9 +11/03/2015, 722.16, 1565355, 718.86, 724.65, 714.72 +11/02/2015, 721.11, 1885155, 711.06, 721.62, 705.85 +10/30/2015, 710.81, 1907732, 715.73, 718, 710.05 +10/29/2015, 716.92, 1455508, 710.5, 718.26, 710.01 +10/28/2015, 712.95, 2178841, 707.33, 712.98, 703.08 +10/27/2015, 708.49, 2232183, 707.38, 713.62, 704.55 +10/26/2015, 712.78, 2709292, 701.55, 719.15, 701.26 +10/23/2015, 702, 6651909, 727.5, 730, 701.5 +10/22/2015, 651.79, 3994360, 646.7, 657.8, 644.01 +10/21/2015, 642.61, 1792869, 654.15, 655.87, 641.73 +10/20/2015, 650.28, 2498077, 664.04, 664.7197, 644.195 +10/19/2015, 666.1, 1465691, 661.18, 666.82, 659.58 +10/16/2015, 662.2, 1610712, 664.11, 664.97, 657.2 +10/15/2015, 661.74, 1832832, 654.66, 663.13, 654.46 +10/14/2015, 651.16, 1413798, 653.21, 659.39, 648.85 +10/13/2015, 652.3, 1806003, 643.15, 657.8125, 643.15 +10/12/2015, 646.67, 1275565, 642.09, 648.5, 639.01 +10/09/2015, 643.61, 1648656, 640, 645.99, 635.318 +10/08/2015, 639.16, 2181990, 641.36, 644.45, 625.56 +10/07/2015, 642.36, 2092536, 649.24, 650.609, 632.15 +10/06/2015, 645.44, 2235078, 638.84, 649.25, 636.5295 +10/05/2015, 641.47, 1802263, 632, 643.01, 627 +10/02/2015, 626.91, 2681241, 607.2, 627.34, 603.13 +10/01/2015, 611.29, 1866223, 608.37, 612.09, 599.85 +09/30/2015, 608.42, 2412754, 603.28, 608.76, 600.73 +09/29/2015, 594.97, 2310065, 597.28, 605, 590.22 +09/28/2015, 594.89, 3118693, 610.34, 614.605, 589.38 +09/25/2015, 611.97, 2173134, 629.77, 629.77, 611 +09/24/2015, 625.8, 2238097, 616.64, 627.32, 612.4 +09/23/2015, 622.36, 1470633, 622.05, 628.93, 620 +09/22/2015, 622.69, 2561551, 627, 627.55, 615.43 +09/21/2015, 635.44, 1786543, 634.4, 636.49, 625.94 +09/18/2015, 629.25, 5123314, 636.79, 640, 627.02 +09/17/2015, 642.9, 2259404, 637.79, 650.9, 635.02 +09/16/2015, 635.98, 1276250, 635.47, 637.95, 632.32 +09/15/2015, 635.14, 2082426, 626.7, 638.7, 623.78 +09/14/2015, 623.24, 1701618, 625.7, 625.86, 619.43 +09/11/2015, 625.77, 1372803, 619.75, 625.78, 617.42 +09/10/2015, 621.35, 1903334, 613.1, 624.16, 611.43 +09/09/2015, 612.72, 1699686, 621.22, 626.52, 609.6 +09/08/2015, 614.66, 2277487, 612.49, 616.31, 604.12 +09/04/2015, 600.7, 2087028, 600, 603.47, 595.25 +09/03/2015, 606.25, 1757851, 617, 619.71, 602.8213 +09/02/2015, 614.34, 2573982, 605.59, 614.34, 599.71 +09/01/2015, 597.79, 3699844, 602.36, 612.86, 594.1 +08/31/2015, 618.25, 2172168, 627.54, 635.8, 617.68 +08/28/2015, 630.38, 1975818, 632.82, 636.88, 624.56 +08/27/2015, 637.61, 3485906, 639.4, 643.59, 622 +08/26/2015, 628.62, 4187276, 610.35, 631.71, 599.05 +08/25/2015, 582.06, 3521916, 614.91, 617.45, 581.11 +08/24/2015, 589.61, 5727282, 573, 614, 565.05 +08/21/2015, 612.48, 4261666, 639.78, 640.05, 612.33 +08/20/2015, 646.83, 2854028, 655.46, 662.99, 642.9 +08/19/2015, 660.9, 2132265, 656.6, 667, 654.19 +08/18/2015, 656.13, 1455664, 661.9, 664, 653.46 +08/17/2015, 660.87, 1050553, 656.8, 661.38, 651.24 +08/14/2015, 657.12, 1071333, 655.01, 659.855, 652.66 +08/13/2015, 656.45, 1807182, 659.323, 664.5, 651.661 +08/12/2015, 659.56, 2938651, 663.08, 665, 652.29 +08/11/2015, 660.78, 5016425, 669.2, 674.9, 654.27 +08/10/2015, 633.73, 1653836, 639.48, 643.44, 631.249 +08/07/2015, 635.3, 1403441, 640.23, 642.68, 629.71 +08/06/2015, 642.68, 1572150, 645, 645.379, 632.25 +08/05/2015, 643.78, 2331720, 634.33, 647.86, 633.16 +08/04/2015, 629.25, 1486858, 628.42, 634.81, 627.16 +08/03/2015, 631.21, 1301439, 625.34, 633.0556, 625.34 +07/31/2015, 625.61, 1705286, 631.38, 632.91, 625.5 +07/30/2015, 632.59, 1472286, 630, 635.22, 622.05 +07/29/2015, 631.93, 1573146, 628.8, 633.36, 622.65 +07/28/2015, 628, 1713684, 632.83, 632.83, 623.31 +07/27/2015, 627.26, 2673801, 621, 634.3, 620.5 +07/24/2015, 623.56, 3622089, 647, 648.17, 622.52 +07/23/2015, 644.28, 3014035, 661.27, 663.63, 641 +07/22/2015, 662.1, 3707818, 660.89, 678.64, 659 +07/21/2015, 662.3, 3363342, 655.21, 673, 654.3 +07/20/2015, 663.02, 5857092, 659.24, 668.88, 653.01 +07/17/2015, 672.93, 11153500, 649, 674.468, 645 +07/16/2015, 579.85, 4559712, 565.12, 580.68, 565 +07/15/2015, 560.22, 1782264, 560.13, 566.5029, 556.79 +07/14/2015, 561.1, 3231284, 546.76, 565.8487, 546.71 +07/13/2015, 546.55, 2204610, 532.88, 547.11, 532.4001 +07/10/2015, 530.13, 1954951, 526.29, 532.56, 525.55 +07/09/2015, 520.68, 1840155, 523.12, 523.77, 520.35 +07/08/2015, 516.83, 1293372, 521.05, 522.734, 516.11 +07/07/2015, 525.02, 1595672, 523.13, 526.18, 515.18 +07/06/2015, 522.86, 1278587, 519.5, 525.25, 519 +07/02/2015, 523.4, 1235773, 521.08, 524.65, 521.08 +07/01/2015, 521.84, 1961197, 524.73, 525.69, 518.2305 +06/30/2015, 520.51, 2234284, 526.02, 526.25, 520.5 +06/29/2015, 521.52, 1935361, 525.01, 528.61, 520.54 +06/26/2015, 531.69, 2108629, 537.26, 537.76, 531.35 +06/25/2015, 535.23, 1332412, 538.87, 540.9, 535.23 +06/24/2015, 537.84, 1286576, 540, 540, 535.66 +06/23/2015, 540.48, 1196115, 539.64, 541.499, 535.25 +06/22/2015, 538.19, 1243535, 539.59, 543.74, 537.53 +06/19/2015, 536.69, 1890916, 537.21, 538.25, 533.01 +06/18/2015, 536.73, 1832450, 531, 538.15, 530.79 +06/17/2015, 529.26, 1269113, 529.37, 530.98, 525.1 +06/16/2015, 528.15, 1071728, 528.4, 529.6399, 525.56 +06/15/2015, 527.2, 1632675, 528, 528.3, 524 +06/12/2015, 532.33, 955489, 531.6, 533.12, 530.16 +06/11/2015, 534.61, 1208632, 538.425, 538.98, 533.02 +06/10/2015, 536.69, 1813775, 529.36, 538.36, 529.35 +06/09/2015, 526.69, 1454172, 527.56, 529.2, 523.01 +06/08/2015, 526.83, 1523960, 533.31, 534.12, 526.24 +06/05/2015, 533.33, 1375008, 536.35, 537.2, 532.52 +06/04/2015, 536.7, 1346044, 537.76, 540.59, 534.32 +06/03/2015, 540.31, 1716836, 539.91, 543.5, 537.11 +06/02/2015, 539.18, 1936721, 532.93, 543, 531.33 +06/01/2015, 533.99, 1900257, 536.79, 536.79, 529.76 +05/29/2015, 532.11, 2590445, 537.37, 538.63, 531.45 +05/28/2015, 539.78, 1029764, 538.01, 540.61, 536.25 +05/27/2015, 539.79, 1524783, 532.8, 540.55, 531.71 +05/26/2015, 532.32, 2404462, 538.12, 539, 529.88 +05/22/2015, 540.11, 1175065, 540.15, 544.19, 539.51 +05/21/2015, 542.51, 1461431, 537.95, 543.8399, 535.98 +05/20/2015, 539.27, 1430565, 538.49, 542.92, 532.972 +05/19/2015, 537.36, 1964037, 533.98, 540.66, 533.04 +05/18/2015, 532.3, 2001117, 532.01, 534.82, 528.85 +05/15/2015, 533.85, 1965088, 539.18, 539.2743, 530.38 +05/14/2015, 538.4, 1401005, 533.77, 539, 532.41 +05/13/2015, 529.62, 1253005, 530.56, 534.3215, 528.655 +05/12/2015, 529.04, 1633180, 531.6, 533.2089, 525.26 +05/11/2015, 535.7, 904465, 538.37, 541.98, 535.4 +05/08/2015, 538.22, 1527181, 536.65, 541.15, 536 +05/07/2015, 530.7, 1543986, 523.99, 533.46, 521.75 +05/06/2015, 524.22, 1566865, 531.24, 532.38, 521.085 +05/05/2015, 530.8, 1380519, 538.21, 539.74, 530.3906 +05/04/2015, 540.78, 1303830, 538.53, 544.07, 535.06 +05/01/2015, 537.9, 1758085, 538.43, 539.54, 532.1 +04/30/2015, 537.34, 2080834, 547.87, 548.59, 535.05 +04/29/2015, 549.08, 1696886, 550.47, 553.68, 546.905 +04/28/2015, 553.68, 1490735, 554.64, 556.02, 550.366 +04/27/2015, 555.37, 2390696, 563.39, 565.95, 553.2001 diff --git a/python-mega-algo/machine_learning/multilayer_perceptron_classifier.py b/python-mega-algo/machine_learning/multilayer_perceptron_classifier.py new file mode 100644 index 00000000..ce54ee51 --- /dev/null +++ b/python-mega-algo/machine_learning/multilayer_perceptron_classifier.py @@ -0,0 +1,29 @@ +from sklearn.neural_network import MLPClassifier + +X = [[0.0, 0.0], [1.0, 1.0], [1.0, 0.0], [0.0, 1.0]] +y = [0, 1, 0, 0] + + +clf = MLPClassifier( + solver="lbfgs", alpha=1e-5, hidden_layer_sizes=(5, 2), random_state=1 +) + +clf.fit(X, y) + + +test = [[0.0, 0.0], [0.0, 1.0], [1.0, 1.0]] +Y = clf.predict(test) + + +def wrapper(Y): + """ + >>> wrapper(Y) + [0, 0, 1] + """ + return list(Y) + + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/machine_learning/polymonial_regression.py b/python-mega-algo/machine_learning/polymonial_regression.py new file mode 100644 index 00000000..374c35f7 --- /dev/null +++ b/python-mega-algo/machine_learning/polymonial_regression.py @@ -0,0 +1,45 @@ +import pandas as pd +from matplotlib import pyplot as plt +from sklearn.linear_model import LinearRegression + +# Splitting the dataset into the Training set and Test set +from sklearn.model_selection import train_test_split + +# Fitting Polynomial Regression to the dataset +from sklearn.preprocessing import PolynomialFeatures + +# Importing the dataset +dataset = pd.read_csv( + "https://s3.us-west-2.amazonaws.com/public.gamelab.fun/dataset/" + "position_salaries.csv" +) +X = dataset.iloc[:, 1:2].values +y = dataset.iloc[:, 2].values + + +X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0) + + +poly_reg = PolynomialFeatures(degree=4) +X_poly = poly_reg.fit_transform(X) +pol_reg = LinearRegression() +pol_reg.fit(X_poly, y) + + +# Visualizing the Polymonial Regression results +def viz_polymonial(): + plt.scatter(X, y, color="red") + plt.plot(X, pol_reg.predict(poly_reg.fit_transform(X)), color="blue") + plt.title("Truth or Bluff (Linear Regression)") + plt.xlabel("Position level") + plt.ylabel("Salary") + plt.show() + return + + +if __name__ == "__main__": + viz_polymonial() + + # Predicting a new result with Polymonial Regression + pol_reg.predict(poly_reg.fit_transform([[5.5]])) + # output should be 132148.43750003 diff --git a/python-mega-algo/machine_learning/random_forest_classifier.py b/python-mega-algo/machine_learning/random_forest_classifier.py new file mode 100644 index 00000000..63702540 --- /dev/null +++ b/python-mega-algo/machine_learning/random_forest_classifier.py @@ -0,0 +1,44 @@ +# Random Forest Classifier Example +from matplotlib import pyplot as plt +from sklearn.datasets import load_iris +from sklearn.ensemble import RandomForestClassifier +from sklearn.metrics import plot_confusion_matrix +from sklearn.model_selection import train_test_split + + +def main(): + + """ + Random Forest Classifier Example using sklearn function. + Iris type dataset is used to demonstrate algorithm. + """ + + # Load Iris dataset + iris = load_iris() + + # Split dataset into train and test data + X = iris["data"] # features + Y = iris["target"] + x_train, x_test, y_train, y_test = train_test_split( + X, Y, test_size=0.3, random_state=1 + ) + + # Random Forest Classifier + rand_for = RandomForestClassifier(random_state=42, n_estimators=100) + rand_for.fit(x_train, y_train) + + # Display Confusion Matrix of Classifier + plot_confusion_matrix( + rand_for, + x_test, + y_test, + display_labels=iris["target_names"], + cmap="Blues", + normalize="true", + ) + plt.title("Normalized Confusion Matrix - IRIS Dataset") + plt.show() + + +if __name__ == "__main__": + main() diff --git a/python-mega-algo/machine_learning/random_forest_regressor.py b/python-mega-algo/machine_learning/random_forest_regressor.py new file mode 100644 index 00000000..0aade626 --- /dev/null +++ b/python-mega-algo/machine_learning/random_forest_regressor.py @@ -0,0 +1,40 @@ +# Random Forest Regressor Example +from sklearn.datasets import load_boston +from sklearn.ensemble import RandomForestRegressor +from sklearn.metrics import mean_absolute_error, mean_squared_error +from sklearn.model_selection import train_test_split + + +def main(): + + """ + Random Forest Regressor Example using sklearn function. + Boston house price dataset is used to demonstrate the algorithm. + """ + + # Load Boston house price dataset + boston = load_boston() + print(boston.keys()) + + # Split dataset into train and test data + X = boston["data"] # features + Y = boston["target"] + x_train, x_test, y_train, y_test = train_test_split( + X, Y, test_size=0.3, random_state=1 + ) + + # Random Forest Regressor + rand_for = RandomForestRegressor(random_state=42, n_estimators=300) + rand_for.fit(x_train, y_train) + + # Predict target for test data + predictions = rand_for.predict(x_test) + predictions = predictions.reshape(len(predictions), 1) + + # Error printing + print(f"Mean Absolute Error:\t {mean_absolute_error(y_test, predictions)}") + print(f"Mean Square Error :\t {mean_squared_error(y_test, predictions)}") + + +if __name__ == "__main__": + main() diff --git a/python-mega-algo/machine_learning/right.html b/python-mega-algo/machine_learning/right.html new file mode 100644 index 00000000..dd8310b3 --- /dev/null +++ b/python-mega-algo/machine_learning/right.html @@ -0,0 +1,34 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/machine_learning + + + + + + + + +
    Folders
    <Go Back> forecasting lstm
    +
    + + + + + + + + + +
    FileFileFileFile
    astar.py knn_sklearn.py multilaye...ier.py sequentia...ion.py 
    data_tran...ons.py k_means_clust.py polymonia...ion.py similarit...rch.py 
    decision_tree.py k_nearest...urs.py random_fo...ier.py support_v...nes.py 
    gaussian_...yes.py linear_di...sis.py random_fo...sor.py word_freq...ons.py 
    gradient_...sor.py linear_re...ion.py scoring_f...ons.py __init__.py 
    gradient_...ent.py logistic_...ion.py 
    + +

    +Folders: 3
    +Files: 22
    +Size of all files: 99527 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/machine_learning/scoring_functions.py b/python-mega-algo/machine_learning/scoring_functions.py new file mode 100644 index 00000000..08b969a9 --- /dev/null +++ b/python-mega-algo/machine_learning/scoring_functions.py @@ -0,0 +1,141 @@ +import numpy as np + +""" Here I implemented the scoring functions. + MAE, MSE, RMSE, RMSLE are included. + + Those are used for calculating differences between + predicted values and actual values. + + Metrics are slightly differentiated. Sometimes squared, rooted, + even log is used. + + Using log and roots can be perceived as tools for penalizing big + errors. However, using appropriate metrics depends on the situations, + and types of data +""" + + +# Mean Absolute Error +def mae(predict, actual): + """ + Examples(rounded for precision): + >>> actual = [1,2,3];predict = [1,4,3] + >>> np.around(mae(predict,actual),decimals = 2) + 0.67 + + >>> actual = [1,1,1];predict = [1,1,1] + >>> mae(predict,actual) + 0.0 + """ + predict = np.array(predict) + actual = np.array(actual) + + difference = abs(predict - actual) + score = difference.mean() + + return score + + +# Mean Squared Error +def mse(predict, actual): + """ + Examples(rounded for precision): + >>> actual = [1,2,3];predict = [1,4,3] + >>> np.around(mse(predict,actual),decimals = 2) + 1.33 + + >>> actual = [1,1,1];predict = [1,1,1] + >>> mse(predict,actual) + 0.0 + """ + predict = np.array(predict) + actual = np.array(actual) + + difference = predict - actual + square_diff = np.square(difference) + + score = square_diff.mean() + return score + + +# Root Mean Squared Error +def rmse(predict, actual): + """ + Examples(rounded for precision): + >>> actual = [1,2,3];predict = [1,4,3] + >>> np.around(rmse(predict,actual),decimals = 2) + 1.15 + + >>> actual = [1,1,1];predict = [1,1,1] + >>> rmse(predict,actual) + 0.0 + """ + predict = np.array(predict) + actual = np.array(actual) + + difference = predict - actual + square_diff = np.square(difference) + mean_square_diff = square_diff.mean() + score = np.sqrt(mean_square_diff) + return score + + +# Root Mean Square Logarithmic Error +def rmsle(predict, actual): + """ + Examples(rounded for precision): + >>> actual = [10,10,30];predict = [10,2,30] + >>> np.around(rmsle(predict,actual),decimals = 2) + 0.75 + + >>> actual = [1,1,1];predict = [1,1,1] + >>> rmsle(predict,actual) + 0.0 + """ + predict = np.array(predict) + actual = np.array(actual) + + log_predict = np.log(predict + 1) + log_actual = np.log(actual + 1) + + difference = log_predict - log_actual + square_diff = np.square(difference) + mean_square_diff = square_diff.mean() + + score = np.sqrt(mean_square_diff) + + return score + + +# Mean Bias Deviation +def mbd(predict, actual): + """ + This value is Negative, if the model underpredicts, + positive, if it overpredicts. + + Example(rounded for precision): + + Here the model overpredicts + >>> actual = [1,2,3];predict = [2,3,4] + >>> np.around(mbd(predict,actual),decimals = 2) + 50.0 + + Here the model underpredicts + >>> actual = [1,2,3];predict = [0,1,1] + >>> np.around(mbd(predict,actual),decimals = 2) + -66.67 + """ + predict = np.array(predict) + actual = np.array(actual) + + difference = predict - actual + numerator = np.sum(difference) / len(predict) + denumerator = np.sum(actual) / len(predict) + # print(numerator, denumerator) + score = float(numerator) / denumerator * 100 + + return score + + +def manual_accuracy(predict, actual): + return np.mean(np.array(actual) == np.array(predict)) diff --git a/python-mega-algo/machine_learning/sequential_minimum_optimization.py b/python-mega-algo/machine_learning/sequential_minimum_optimization.py new file mode 100644 index 00000000..1ea37d33 --- /dev/null +++ b/python-mega-algo/machine_learning/sequential_minimum_optimization.py @@ -0,0 +1,632 @@ +""" + Implementation of sequential minimal optimization (SMO) for support vector machines + (SVM). + + Sequential minimal optimization (SMO) is an algorithm for solving the quadratic + programming (QP) problem that arises during the training of support vector + machines. + It was invented by John Platt in 1998. + +Input: + 0: type: numpy.ndarray. + 1: first column of ndarray must be tags of samples, must be 1 or -1. + 2: rows of ndarray represent samples. + +Usage: + Command: + python3 sequential_minimum_optimization.py + Code: + from sequential_minimum_optimization import SmoSVM, Kernel + + kernel = Kernel(kernel='poly', degree=3., coef0=1., gamma=0.5) + init_alphas = np.zeros(train.shape[0]) + SVM = SmoSVM(train=train, alpha_list=init_alphas, kernel_func=kernel, cost=0.4, + b=0.0, tolerance=0.001) + SVM.fit() + predict = SVM.predict(test_samples) + +Reference: + https://www.microsoft.com/en-us/research/wp-content/uploads/2016/02/smo-book.pdf + https://www.microsoft.com/en-us/research/wp-content/uploads/2016/02/tr-98-14.pdf + http://web.cs.iastate.edu/~honavar/smo-svm.pdf +""" + + +import os +import sys +import urllib.request + +import numpy as np +import pandas as pd +from matplotlib import pyplot as plt +from sklearn.datasets import make_blobs, make_circles +from sklearn.preprocessing import StandardScaler + +CANCER_DATASET_URL = ( + "http://archive.ics.uci.edu/ml/machine-learning-databases/" + "breast-cancer-wisconsin/wdbc.data" +) + + +class SmoSVM: + def __init__( + self, + train, + kernel_func, + alpha_list=None, + cost=0.4, + b=0.0, + tolerance=0.001, + auto_norm=True, + ): + self._init = True + self._auto_norm = auto_norm + self._c = np.float64(cost) + self._b = np.float64(b) + self._tol = np.float64(tolerance) if tolerance > 0.0001 else np.float64(0.001) + + self.tags = train[:, 0] + self.samples = self._norm(train[:, 1:]) if self._auto_norm else train[:, 1:] + self.alphas = alpha_list if alpha_list is not None else np.zeros(train.shape[0]) + self.Kernel = kernel_func + + self._eps = 0.001 + self._all_samples = list(range(self.length)) + self._K_matrix = self._calculate_k_matrix() + self._error = np.zeros(self.length) + self._unbound = [] + + self.choose_alpha = self._choose_alphas() + + # Calculate alphas using SMO algorithm + def fit(self): + K = self._k + state = None + while True: + + # 1: Find alpha1, alpha2 + try: + i1, i2 = self.choose_alpha.send(state) + state = None + except StopIteration: + print("Optimization done!\nEvery sample satisfy the KKT condition!") + break + + # 2: calculate new alpha2 and new alpha1 + y1, y2 = self.tags[i1], self.tags[i2] + a1, a2 = self.alphas[i1].copy(), self.alphas[i2].copy() + e1, e2 = self._e(i1), self._e(i2) + args = (i1, i2, a1, a2, e1, e2, y1, y2) + a1_new, a2_new = self._get_new_alpha(*args) + if not a1_new and not a2_new: + state = False + continue + self.alphas[i1], self.alphas[i2] = a1_new, a2_new + + # 3: update threshold(b) + b1_new = np.float64( + -e1 + - y1 * K(i1, i1) * (a1_new - a1) + - y2 * K(i2, i1) * (a2_new - a2) + + self._b + ) + b2_new = np.float64( + -e2 + - y2 * K(i2, i2) * (a2_new - a2) + - y1 * K(i1, i2) * (a1_new - a1) + + self._b + ) + if 0.0 < a1_new < self._c: + b = b1_new + if 0.0 < a2_new < self._c: + b = b2_new + if not (np.float64(0) < a2_new < self._c) and not ( + np.float64(0) < a1_new < self._c + ): + b = (b1_new + b2_new) / 2.0 + b_old = self._b + self._b = b + + # 4: update error value,here we only calculate those non-bound samples' + # error + self._unbound = [i for i in self._all_samples if self._is_unbound(i)] + for s in self.unbound: + if s == i1 or s == i2: + continue + self._error[s] += ( + y1 * (a1_new - a1) * K(i1, s) + + y2 * (a2_new - a2) * K(i2, s) + + (self._b - b_old) + ) + + # if i1 or i2 is non-bound,update there error value to zero + if self._is_unbound(i1): + self._error[i1] = 0 + if self._is_unbound(i2): + self._error[i2] = 0 + + # Predict test samles + def predict(self, test_samples, classify=True): + + if test_samples.shape[1] > self.samples.shape[1]: + raise ValueError( + "Test samples' feature length does not equal to that of train samples" + ) + + if self._auto_norm: + test_samples = self._norm(test_samples) + + results = [] + for test_sample in test_samples: + result = self._predict(test_sample) + if classify: + results.append(1 if result > 0 else -1) + else: + results.append(result) + return np.array(results) + + # Check if alpha violate KKT condition + def _check_obey_kkt(self, index): + alphas = self.alphas + tol = self._tol + r = self._e(index) * self.tags[index] + c = self._c + + return (r < -tol and alphas[index] < c) or (r > tol and alphas[index] > 0.0) + + # Get value calculated from kernel function + def _k(self, i1, i2): + # for test samples,use Kernel function + if isinstance(i2, np.ndarray): + return self.Kernel(self.samples[i1], i2) + # for train samples,Kernel values have been saved in matrix + else: + return self._K_matrix[i1, i2] + + # Get sample's error + def _e(self, index): + """ + Two cases: + 1:Sample[index] is non-bound,Fetch error from list: _error + 2:sample[index] is bound,Use predicted value deduct true value: g(xi) - yi + + """ + # get from error data + if self._is_unbound(index): + return self._error[index] + # get by g(xi) - yi + else: + gx = np.dot(self.alphas * self.tags, self._K_matrix[:, index]) + self._b + yi = self.tags[index] + return gx - yi + + # Calculate Kernel matrix of all possible i1,i2 ,saving time + def _calculate_k_matrix(self): + k_matrix = np.zeros([self.length, self.length]) + for i in self._all_samples: + for j in self._all_samples: + k_matrix[i, j] = np.float64( + self.Kernel(self.samples[i, :], self.samples[j, :]) + ) + return k_matrix + + # Predict test sample's tag + def _predict(self, sample): + k = self._k + predicted_value = ( + np.sum( + [ + self.alphas[i1] * self.tags[i1] * k(i1, sample) + for i1 in self._all_samples + ] + ) + + self._b + ) + return predicted_value + + # Choose alpha1 and alpha2 + def _choose_alphas(self): + locis = yield from self._choose_a1() + if not locis: + return + return locis + + def _choose_a1(self): + """ + Choose first alpha ;steps: + 1:First loop over all sample + 2:Second loop over all non-bound samples till all non-bound samples does not + voilate kkt condition. + 3:Repeat this two process endlessly,till all samples does not voilate kkt + condition samples after first loop. + """ + while True: + all_not_obey = True + # all sample + print("scanning all sample!") + for i1 in [i for i in self._all_samples if self._check_obey_kkt(i)]: + all_not_obey = False + yield from self._choose_a2(i1) + + # non-bound sample + print("scanning non-bound sample!") + while True: + not_obey = True + for i1 in [ + i + for i in self._all_samples + if self._check_obey_kkt(i) and self._is_unbound(i) + ]: + not_obey = False + yield from self._choose_a2(i1) + if not_obey: + print("all non-bound samples fit the KKT condition!") + break + if all_not_obey: + print("all samples fit the KKT condition! Optimization done!") + break + return False + + def _choose_a2(self, i1): + """ + Choose the second alpha by using heuristic algorithm ;steps: + 1: Choose alpha2 which gets the maximum step size (|E1 - E2|). + 2: Start in a random point,loop over all non-bound samples till alpha1 and + alpha2 are optimized. + 3: Start in a random point,loop over all samples till alpha1 and alpha2 are + optimized. + """ + self._unbound = [i for i in self._all_samples if self._is_unbound(i)] + + if len(self.unbound) > 0: + tmp_error = self._error.copy().tolist() + tmp_error_dict = { + index: value + for index, value in enumerate(tmp_error) + if self._is_unbound(index) + } + if self._e(i1) >= 0: + i2 = min(tmp_error_dict, key=lambda index: tmp_error_dict[index]) + else: + i2 = max(tmp_error_dict, key=lambda index: tmp_error_dict[index]) + cmd = yield i1, i2 + if cmd is None: + return + + for i2 in np.roll(self.unbound, np.random.choice(self.length)): + cmd = yield i1, i2 + if cmd is None: + return + + for i2 in np.roll(self._all_samples, np.random.choice(self.length)): + cmd = yield i1, i2 + if cmd is None: + return + + # Get the new alpha2 and new alpha1 + def _get_new_alpha(self, i1, i2, a1, a2, e1, e2, y1, y2): + K = self._k + if i1 == i2: + return None, None + + # calculate L and H which bound the new alpha2 + s = y1 * y2 + if s == -1: + L, H = max(0.0, a2 - a1), min(self._c, self._c + a2 - a1) + else: + L, H = max(0.0, a2 + a1 - self._c), min(self._c, a2 + a1) + if L == H: + return None, None + + # calculate eta + k11 = K(i1, i1) + k22 = K(i2, i2) + k12 = K(i1, i2) + eta = k11 + k22 - 2.0 * k12 + + # select the new alpha2 which could get the minimal objectives + if eta > 0.0: + a2_new_unc = a2 + (y2 * (e1 - e2)) / eta + # a2_new has a boundary + if a2_new_unc >= H: + a2_new = H + elif a2_new_unc <= L: + a2_new = L + else: + a2_new = a2_new_unc + else: + b = self._b + l1 = a1 + s * (a2 - L) + h1 = a1 + s * (a2 - H) + + # way 1 + f1 = y1 * (e1 + b) - a1 * K(i1, i1) - s * a2 * K(i1, i2) + f2 = y2 * (e2 + b) - a2 * K(i2, i2) - s * a1 * K(i1, i2) + ol = ( + l1 * f1 + + L * f2 + + 1 / 2 * l1 ** 2 * K(i1, i1) + + 1 / 2 * L ** 2 * K(i2, i2) + + s * L * l1 * K(i1, i2) + ) + oh = ( + h1 * f1 + + H * f2 + + 1 / 2 * h1 ** 2 * K(i1, i1) + + 1 / 2 * H ** 2 * K(i2, i2) + + s * H * h1 * K(i1, i2) + ) + """ + # way 2 + Use objective function check which alpha2 new could get the minimal + objectives + """ + if ol < (oh - self._eps): + a2_new = L + elif ol > oh + self._eps: + a2_new = H + else: + a2_new = a2 + + # a1_new has a boundary too + a1_new = a1 + s * (a2 - a2_new) + if a1_new < 0: + a2_new += s * a1_new + a1_new = 0 + if a1_new > self._c: + a2_new += s * (a1_new - self._c) + a1_new = self._c + + return a1_new, a2_new + + # Normalise data using min_max way + def _norm(self, data): + if self._init: + self._min = np.min(data, axis=0) + self._max = np.max(data, axis=0) + self._init = False + return (data - self._min) / (self._max - self._min) + else: + return (data - self._min) / (self._max - self._min) + + def _is_unbound(self, index): + if 0.0 < self.alphas[index] < self._c: + return True + else: + return False + + def _is_support(self, index): + if self.alphas[index] > 0: + return True + else: + return False + + @property + def unbound(self): + return self._unbound + + @property + def support(self): + return [i for i in range(self.length) if self._is_support(i)] + + @property + def length(self): + return self.samples.shape[0] + + +class Kernel: + def __init__(self, kernel, degree=1.0, coef0=0.0, gamma=1.0): + self.degree = np.float64(degree) + self.coef0 = np.float64(coef0) + self.gamma = np.float64(gamma) + self._kernel_name = kernel + self._kernel = self._get_kernel(kernel_name=kernel) + self._check() + + def _polynomial(self, v1, v2): + return (self.gamma * np.inner(v1, v2) + self.coef0) ** self.degree + + def _linear(self, v1, v2): + return np.inner(v1, v2) + self.coef0 + + def _rbf(self, v1, v2): + return np.exp(-1 * (self.gamma * np.linalg.norm(v1 - v2) ** 2)) + + def _check(self): + if self._kernel == self._rbf: + if self.gamma < 0: + raise ValueError("gamma value must greater than 0") + + def _get_kernel(self, kernel_name): + maps = {"linear": self._linear, "poly": self._polynomial, "rbf": self._rbf} + return maps[kernel_name] + + def __call__(self, v1, v2): + return self._kernel(v1, v2) + + def __repr__(self): + return self._kernel_name + + +def count_time(func): + def call_func(*args, **kwargs): + import time + + start_time = time.time() + func(*args, **kwargs) + end_time = time.time() + print(f"smo algorithm cost {end_time - start_time} seconds") + + return call_func + + +@count_time +def test_cancel_data(): + print("Hello!\nStart test svm by smo algorithm!") + # 0: download dataset and load into pandas' dataframe + if not os.path.exists(r"cancel_data.csv"): + request = urllib.request.Request( + CANCER_DATASET_URL, + headers={"User-Agent": "Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)"}, + ) + response = urllib.request.urlopen(request) + content = response.read().decode("utf-8") + with open(r"cancel_data.csv", "w") as f: + f.write(content) + + data = pd.read_csv(r"cancel_data.csv", header=None) + + # 1: pre-processing data + del data[data.columns.tolist()[0]] + data = data.dropna(axis=0) + data = data.replace({"M": np.float64(1), "B": np.float64(-1)}) + samples = np.array(data)[:, :] + + # 2: dividing data into train_data data and test_data data + train_data, test_data = samples[:328, :], samples[328:, :] + test_tags, test_samples = test_data[:, 0], test_data[:, 1:] + + # 3: choose kernel function,and set initial alphas to zero(optional) + mykernel = Kernel(kernel="rbf", degree=5, coef0=1, gamma=0.5) + al = np.zeros(train_data.shape[0]) + + # 4: calculating best alphas using SMO algorithm and predict test_data samples + mysvm = SmoSVM( + train=train_data, + kernel_func=mykernel, + alpha_list=al, + cost=0.4, + b=0.0, + tolerance=0.001, + ) + mysvm.fit() + predict = mysvm.predict(test_samples) + + # 5: check accuracy + score = 0 + test_num = test_tags.shape[0] + for i in range(test_tags.shape[0]): + if test_tags[i] == predict[i]: + score += 1 + print(f"\nall: {test_num}\nright: {score}\nfalse: {test_num - score}") + print(f"Rough Accuracy: {score / test_tags.shape[0]}") + + +def test_demonstration(): + # change stdout + print("\nStart plot,please wait!!!") + sys.stdout = open(os.devnull, "w") + + ax1 = plt.subplot2grid((2, 2), (0, 0)) + ax2 = plt.subplot2grid((2, 2), (0, 1)) + ax3 = plt.subplot2grid((2, 2), (1, 0)) + ax4 = plt.subplot2grid((2, 2), (1, 1)) + ax1.set_title("linear svm,cost:0.1") + test_linear_kernel(ax1, cost=0.1) + ax2.set_title("linear svm,cost:500") + test_linear_kernel(ax2, cost=500) + ax3.set_title("rbf kernel svm,cost:0.1") + test_rbf_kernel(ax3, cost=0.1) + ax4.set_title("rbf kernel svm,cost:500") + test_rbf_kernel(ax4, cost=500) + + sys.stdout = sys.__stdout__ + print("Plot done!!!") + + +def test_linear_kernel(ax, cost): + train_x, train_y = make_blobs( + n_samples=500, centers=2, n_features=2, random_state=1 + ) + train_y[train_y == 0] = -1 + scaler = StandardScaler() + train_x_scaled = scaler.fit_transform(train_x, train_y) + train_data = np.hstack((train_y.reshape(500, 1), train_x_scaled)) + mykernel = Kernel(kernel="linear", degree=5, coef0=1, gamma=0.5) + mysvm = SmoSVM( + train=train_data, + kernel_func=mykernel, + cost=cost, + tolerance=0.001, + auto_norm=False, + ) + mysvm.fit() + plot_partition_boundary(mysvm, train_data, ax=ax) + + +def test_rbf_kernel(ax, cost): + train_x, train_y = make_circles( + n_samples=500, noise=0.1, factor=0.1, random_state=1 + ) + train_y[train_y == 0] = -1 + scaler = StandardScaler() + train_x_scaled = scaler.fit_transform(train_x, train_y) + train_data = np.hstack((train_y.reshape(500, 1), train_x_scaled)) + mykernel = Kernel(kernel="rbf", degree=5, coef0=1, gamma=0.5) + mysvm = SmoSVM( + train=train_data, + kernel_func=mykernel, + cost=cost, + tolerance=0.001, + auto_norm=False, + ) + mysvm.fit() + plot_partition_boundary(mysvm, train_data, ax=ax) + + +def plot_partition_boundary( + model, train_data, ax, resolution=100, colors=("b", "k", "r") +): + """ + We can not get the optimum w of our kernel svm model which is different from linear + svm. For this reason, we generate randomly distributed points with high desity and + prediced values of these points are calculated by using our tained model. Then we + could use this prediced values to draw contour map. + And this contour map can represent svm's partition boundary. + """ + train_data_x = train_data[:, 1] + train_data_y = train_data[:, 2] + train_data_tags = train_data[:, 0] + xrange = np.linspace(train_data_x.min(), train_data_x.max(), resolution) + yrange = np.linspace(train_data_y.min(), train_data_y.max(), resolution) + test_samples = np.array([(x, y) for x in xrange for y in yrange]).reshape( + resolution * resolution, 2 + ) + + test_tags = model.predict(test_samples, classify=False) + grid = test_tags.reshape((len(xrange), len(yrange))) + + # Plot contour map which represents the partition boundary + ax.contour( + xrange, + yrange, + np.mat(grid).T, + levels=(-1, 0, 1), + linestyles=("--", "-", "--"), + linewidths=(1, 1, 1), + colors=colors, + ) + # Plot all train samples + ax.scatter( + train_data_x, + train_data_y, + c=train_data_tags, + cmap=plt.cm.Dark2, + lw=0, + alpha=0.5, + ) + + # Plot support vectors + support = model.support + ax.scatter( + train_data_x[support], + train_data_y[support], + c=train_data_tags[support], + cmap=plt.cm.Dark2, + ) + + +if __name__ == "__main__": + test_cancel_data() + test_demonstration() + plt.show() diff --git a/python-mega-algo/machine_learning/similarity_search.py b/python-mega-algo/machine_learning/similarity_search.py new file mode 100644 index 00000000..af845c91 --- /dev/null +++ b/python-mega-algo/machine_learning/similarity_search.py @@ -0,0 +1,140 @@ +""" +Similarity Search : https://en.wikipedia.org/wiki/Similarity_search +Similarity search is a search algorithm for finding the nearest vector from +vectors, used in natural language processing. +In this algorithm, it calculates distance with euclidean distance and +returns a list containing two data for each vector: + 1. the nearest vector + 2. distance between the vector and the nearest vector (float) +""" +import math +from typing import List, Union + +import numpy as np + + +def euclidean(input_a: np.ndarray, input_b: np.ndarray) -> float: + """ + Calculates euclidean distance between two data. + :param input_a: ndarray of first vector. + :param input_b: ndarray of second vector. + :return: Euclidean distance of input_a and input_b. By using math.sqrt(), + result will be float. + + >>> euclidean(np.array([0]), np.array([1])) + 1.0 + >>> euclidean(np.array([0, 1]), np.array([1, 1])) + 1.0 + >>> euclidean(np.array([0, 0, 0]), np.array([0, 0, 1])) + 1.0 + """ + return math.sqrt(sum(pow(a - b, 2) for a, b in zip(input_a, input_b))) + + +def similarity_search( + dataset: np.ndarray, value_array: np.ndarray +) -> List[List[Union[List[float], float]]]: + """ + :param dataset: Set containing the vectors. Should be ndarray. + :param value_array: vector/vectors we want to know the nearest vector from dataset. + :return: Result will be a list containing + 1. the nearest vector + 2. distance from the vector + + >>> dataset = np.array([[0], [1], [2]]) + >>> value_array = np.array([[0]]) + >>> similarity_search(dataset, value_array) + [[[0], 0.0]] + + >>> dataset = np.array([[0, 0], [1, 1], [2, 2]]) + >>> value_array = np.array([[0, 1]]) + >>> similarity_search(dataset, value_array) + [[[0, 0], 1.0]] + + >>> dataset = np.array([[0, 0, 0], [1, 1, 1], [2, 2, 2]]) + >>> value_array = np.array([[0, 0, 1]]) + >>> similarity_search(dataset, value_array) + [[[0, 0, 0], 1.0]] + + >>> dataset = np.array([[0, 0, 0], [1, 1, 1], [2, 2, 2]]) + >>> value_array = np.array([[0, 0, 0], [0, 0, 1]]) + >>> similarity_search(dataset, value_array) + [[[0, 0, 0], 0.0], [[0, 0, 0], 1.0]] + + These are the errors that might occur: + + 1. If dimensions are different. + For example, dataset has 2d array and value_array has 1d array: + >>> dataset = np.array([[1]]) + >>> value_array = np.array([1]) + >>> similarity_search(dataset, value_array) + Traceback (most recent call last): + ... + ValueError: Wrong input data's dimensions... dataset : 2, value_array : 1 + + 2. If data's shapes are different. + For example, dataset has shape of (3, 2) and value_array has (2, 3). + We are expecting same shapes of two arrays, so it is wrong. + >>> dataset = np.array([[0, 0], [1, 1], [2, 2]]) + >>> value_array = np.array([[0, 0, 0], [0, 0, 1]]) + >>> similarity_search(dataset, value_array) + Traceback (most recent call last): + ... + ValueError: Wrong input data's shape... dataset : 2, value_array : 3 + + 3. If data types are different. + When trying to compare, we are expecting same types so they should be same. + If not, it'll come up with errors. + >>> dataset = np.array([[0, 0], [1, 1], [2, 2]], dtype=np.float32) + >>> value_array = np.array([[0, 0], [0, 1]], dtype=np.int32) + >>> similarity_search(dataset, value_array) # doctest: +NORMALIZE_WHITESPACE + Traceback (most recent call last): + ... + TypeError: Input data have different datatype... + dataset : float32, value_array : int32 + """ + + if dataset.ndim != value_array.ndim: + raise ValueError( + f"Wrong input data's dimensions... dataset : {dataset.ndim}, " + f"value_array : {value_array.ndim}" + ) + + try: + if dataset.shape[1] != value_array.shape[1]: + raise ValueError( + f"Wrong input data's shape... dataset : {dataset.shape[1]}, " + f"value_array : {value_array.shape[1]}" + ) + except IndexError: + if dataset.ndim != value_array.ndim: + raise TypeError("Wrong shape") + + if dataset.dtype != value_array.dtype: + raise TypeError( + f"Input data have different datatype... dataset : {dataset.dtype}, " + f"value_array : {value_array.dtype}" + ) + + answer = [] + + for value in value_array: + dist = euclidean(value, dataset[0]) + vector = dataset[0].tolist() + + for dataset_value in dataset[1:]: + temp_dist = euclidean(value, dataset_value) + + if dist > temp_dist: + dist = temp_dist + vector = dataset_value.tolist() + + answer.append([vector, dist]) + + return answer + + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/machine_learning/support_vector_machines.py b/python-mega-algo/machine_learning/support_vector_machines.py new file mode 100644 index 00000000..c5e5085d --- /dev/null +++ b/python-mega-algo/machine_learning/support_vector_machines.py @@ -0,0 +1,58 @@ +from sklearn import svm +from sklearn.datasets import load_iris +from sklearn.model_selection import train_test_split + + +# different functions implementing different types of SVM's +def NuSVC(train_x, train_y): + svc_NuSVC = svm.NuSVC() + svc_NuSVC.fit(train_x, train_y) + return svc_NuSVC + + +def Linearsvc(train_x, train_y): + svc_linear = svm.LinearSVC(tol=10e-2) + svc_linear.fit(train_x, train_y) + return svc_linear + + +def SVC(train_x, train_y): + # svm.SVC(C=1.0, kernel='rbf', degree=3, gamma=0.0, coef0=0.0, shrinking=True, + # probability=False,tol=0.001, cache_size=200, class_weight=None, verbose=False, + # max_iter=1000, random_state=None) + # various parameters like "kernel","gamma","C" can effectively tuned for a given + # machine learning model. + SVC = svm.SVC(gamma="auto") + SVC.fit(train_x, train_y) + return SVC + + +def test(X_new): + """ + 3 test cases to be passed + an array containing the sepal length (cm), sepal width (cm), petal length (cm), + petal width (cm) based on which the target name will be predicted + >>> test([1,2,1,4]) + 'virginica' + >>> test([5, 2, 4, 1]) + 'versicolor' + >>> test([6,3,4,1]) + 'versicolor' + """ + iris = load_iris() + # splitting the dataset to test and train + train_x, test_x, train_y, test_y = train_test_split( + iris["data"], iris["target"], random_state=4 + ) + # any of the 3 types of SVM can be used + # current_model=SVC(train_x, train_y) + # current_model=NuSVC(train_x, train_y) + current_model = Linearsvc(train_x, train_y) + prediction = current_model.predict([X_new]) + return iris["target_names"][prediction][0] + + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/machine_learning/word_frequency_functions.py b/python-mega-algo/machine_learning/word_frequency_functions.py new file mode 100644 index 00000000..3e8faf39 --- /dev/null +++ b/python-mega-algo/machine_learning/word_frequency_functions.py @@ -0,0 +1,137 @@ +import string +from math import log10 + +""" + tf-idf Wikipedia: https://en.wikipedia.org/wiki/Tf%E2%80%93idf + tf-idf and other word frequency algorithms are often used + as a weighting factor in information retrieval and text + mining. 83% of text-based recommender systems use + tf-idf for term weighting. In Layman's terms, tf-idf + is a statistic intended to reflect how important a word + is to a document in a corpus (a collection of documents) + + + Here I've implemented several word frequency algorithms + that are commonly used in information retrieval: Term Frequency, + Document Frequency, and TF-IDF (Term-Frequency*Inverse-Document-Frequency) + are included. + + Term Frequency is a statistical function that + returns a number representing how frequently + an expression occurs in a document. This + indicates how significant a particular term is in + a given document. + + Document Frequency is a statistical function that returns + an integer representing the number of documents in a + corpus that a term occurs in (where the max number returned + would be the number of documents in the corpus). + + Inverse Document Frequency is mathematically written as + log10(N/df), where N is the number of documents in your + corpus and df is the Document Frequency. If df is 0, a + ZeroDivisionError will be thrown. + + Term-Frequency*Inverse-Document-Frequency is a measure + of the originality of a term. It is mathematically written + as tf*log10(N/df). It compares the number of times + a term appears in a document with the number of documents + the term appears in. If df is 0, a ZeroDivisionError will be thrown. +""" + + +def term_frequency(term: str, document: str) -> int: + """ + Return the number of times a term occurs within + a given document. + @params: term, the term to search a document for, and document, + the document to search within + @returns: an integer representing the number of times a term is + found within the document + + @examples: + >>> term_frequency("to", "To be, or not to be") + 2 + """ + # strip all punctuation and newlines and replace it with '' + document_without_punctuation = document.translate( + str.maketrans("", "", string.punctuation) + ).replace("\n", "") + tokenize_document = document_without_punctuation.split(" ") # word tokenization + return len([word for word in tokenize_document if word.lower() == term.lower()]) + + +def document_frequency(term: str, corpus: str) -> tuple[int, int]: + """ + Calculate the number of documents in a corpus that contain a + given term + @params : term, the term to search each document for, and corpus, a collection of + documents. Each document should be separated by a newline. + @returns : the number of documents in the corpus that contain the term you are + searching for and the number of documents in the corpus + @examples : + >>> document_frequency("first", "This is the first document in the corpus.\\nThIs\ +is the second document in the corpus.\\nTHIS is \ +the third document in the corpus.") + (1, 3) + """ + corpus_without_punctuation = corpus.lower().translate( + str.maketrans("", "", string.punctuation) + ) # strip all punctuation and replace it with '' + docs = corpus_without_punctuation.split("\n") + term = term.lower() + return (len([doc for doc in docs if term in doc]), len(docs)) + + +def inverse_document_frequency(df: int, N: int, smoothing=False) -> float: + """ + Return an integer denoting the importance + of a word. This measure of importance is + calculated by log10(N/df), where N is the + number of documents and df is + the Document Frequency. + @params : df, the Document Frequency, N, + the number of documents in the corpus and + smoothing, if True return the idf-smooth + @returns : log10(N/df) or 1+log10(N/1+df) + @examples : + >>> inverse_document_frequency(3, 0) + Traceback (most recent call last): + ... + ValueError: log10(0) is undefined. + >>> inverse_document_frequency(1, 3) + 0.477 + >>> inverse_document_frequency(0, 3) + Traceback (most recent call last): + ... + ZeroDivisionError: df must be > 0 + >>> inverse_document_frequency(0, 3,True) + 1.477 + """ + if smoothing: + if N == 0: + raise ValueError("log10(0) is undefined.") + return round(1 + log10(N / (1 + df)), 3) + + if df == 0: + raise ZeroDivisionError("df must be > 0") + elif N == 0: + raise ValueError("log10(0) is undefined.") + return round(log10(N / df), 3) + + +def tf_idf(tf: int, idf: int) -> float: + """ + Combine the term frequency + and inverse document frequency functions to + calculate the originality of a term. This + 'originality' is calculated by multiplying + the term frequency and the inverse document + frequency : tf-idf = TF * IDF + @params : tf, the term frequency, and idf, the inverse document + frequency + @examples : + >>> tf_idf(2, 0.477) + 0.954 + """ + return round(tf * idf, 3) diff --git a/python-mega-algo/maths/3n_plus_1.py b/python-mega-algo/maths/3n_plus_1.py new file mode 100644 index 00000000..e455a158 --- /dev/null +++ b/python-mega-algo/maths/3n_plus_1.py @@ -0,0 +1,149 @@ +from __future__ import annotations + + +def n31(a: int) -> tuple[list[int], int]: + """ + Returns the Collatz sequence and its length of any positive integer. + >>> n31(4) + ([4, 2, 1], 3) + """ + + if not isinstance(a, int): + raise TypeError(f"Must be int, not {type(a).__name__}") + if a < 1: + raise ValueError(f"Given integer must be greater than 1, not {a}") + + path = [a] + while a != 1: + if a % 2 == 0: + a = a // 2 + else: + a = 3 * a + 1 + path += [a] + return path, len(path) + + +def test_n31(): + """ + >>> test_n31() + """ + assert n31(4) == ([4, 2, 1], 3) + assert n31(11) == ([11, 34, 17, 52, 26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1], 15) + assert n31(31) == ( + [ + 31, + 94, + 47, + 142, + 71, + 214, + 107, + 322, + 161, + 484, + 242, + 121, + 364, + 182, + 91, + 274, + 137, + 412, + 206, + 103, + 310, + 155, + 466, + 233, + 700, + 350, + 175, + 526, + 263, + 790, + 395, + 1186, + 593, + 1780, + 890, + 445, + 1336, + 668, + 334, + 167, + 502, + 251, + 754, + 377, + 1132, + 566, + 283, + 850, + 425, + 1276, + 638, + 319, + 958, + 479, + 1438, + 719, + 2158, + 1079, + 3238, + 1619, + 4858, + 2429, + 7288, + 3644, + 1822, + 911, + 2734, + 1367, + 4102, + 2051, + 6154, + 3077, + 9232, + 4616, + 2308, + 1154, + 577, + 1732, + 866, + 433, + 1300, + 650, + 325, + 976, + 488, + 244, + 122, + 61, + 184, + 92, + 46, + 23, + 70, + 35, + 106, + 53, + 160, + 80, + 40, + 20, + 10, + 5, + 16, + 8, + 4, + 2, + 1, + ], + 107, + ) + + +if __name__ == "__main__": + num = 4 + path, length = n31(num) + print(f"The Collatz sequence of {num} took {length} steps. \nPath: {path}") diff --git a/python-mega-algo/maths/__init__.py b/python-mega-algo/maths/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/maths/abs.py b/python-mega-algo/maths/abs.py new file mode 100644 index 00000000..68c99a1d --- /dev/null +++ b/python-mega-algo/maths/abs.py @@ -0,0 +1,28 @@ +"""Absolute Value.""" + + +def abs_val(num): + """ + Find the absolute value of a number. + + >>> abs_val(-5.1) + 5.1 + >>> abs_val(-5) == abs_val(5) + True + >>> abs_val(0) + 0 + """ + return -num if num < 0 else num + + +def test_abs_val(): + """ + >>> test_abs_val() + """ + assert 0 == abs_val(0) + assert 34 == abs_val(34) + assert 100000000000 == abs_val(-100000000000) + + +if __name__ == "__main__": + print(abs_val(-34)) # --> 34 diff --git a/python-mega-algo/maths/abs_max.py b/python-mega-algo/maths/abs_max.py new file mode 100644 index 00000000..e5a82196 --- /dev/null +++ b/python-mega-algo/maths/abs_max.py @@ -0,0 +1,35 @@ +from __future__ import annotations + + +def abs_max(x: list[int]) -> int: + """ + >>> abs_max([0,5,1,11]) + 11 + >>> abs_max([3,-10,-2]) + -10 + """ + j = x[0] + for i in x: + if abs(i) > abs(j): + j = i + return j + + +def abs_max_sort(x): + """ + >>> abs_max_sort([0,5,1,11]) + 11 + >>> abs_max_sort([3,-10,-2]) + -10 + """ + return sorted(x, key=abs)[-1] + + +def main(): + a = [1, 2, -11] + assert abs_max(a) == -11 + assert abs_max_sort(a) == -11 + + +if __name__ == "__main__": + main() diff --git a/python-mega-algo/maths/abs_min.py b/python-mega-algo/maths/abs_min.py new file mode 100644 index 00000000..eb84de37 --- /dev/null +++ b/python-mega-algo/maths/abs_min.py @@ -0,0 +1,24 @@ +from .abs import abs_val + + +def absMin(x): + """ + >>> absMin([0,5,1,11]) + 0 + >>> absMin([3,-10,-2]) + -2 + """ + j = x[0] + for i in x: + if abs_val(i) < abs_val(j): + j = i + return j + + +def main(): + a = [-3, -1, 2, -11] + print(absMin(a)) # = -1 + + +if __name__ == "__main__": + main() diff --git a/python-mega-algo/maths/add.py b/python-mega-algo/maths/add.py new file mode 100644 index 00000000..0bc7da96 --- /dev/null +++ b/python-mega-algo/maths/add.py @@ -0,0 +1,19 @@ +""" +Just to check +""" + + +def add(a, b): + """ + >>> add(2, 2) + 4 + >>> add(2, -2) + 0 + """ + return a + b + + +if __name__ == "__main__": + a = 5 + b = 6 + print(f"The sum of {a} + {b} is {add(a, b)}") diff --git a/python-mega-algo/maths/aliquot_sum.py b/python-mega-algo/maths/aliquot_sum.py new file mode 100644 index 00000000..9c58aa61 --- /dev/null +++ b/python-mega-algo/maths/aliquot_sum.py @@ -0,0 +1,48 @@ +def aliquot_sum(input_num: int) -> int: + """ + Finds the aliquot sum of an input integer, where the + aliquot sum of a number n is defined as the sum of all + natural numbers less than n that divide n evenly. For + example, the aliquot sum of 15 is 1 + 3 + 5 = 9. This is + a simple O(n) implementation. + @param input_num: a positive integer whose aliquot sum is to be found + @return: the aliquot sum of input_num, if input_num is positive. + Otherwise, raise a ValueError + Wikipedia Explanation: https://en.wikipedia.org/wiki/Aliquot_sum + + >>> aliquot_sum(15) + 9 + >>> aliquot_sum(6) + 6 + >>> aliquot_sum(-1) + Traceback (most recent call last): + ... + ValueError: Input must be positive + >>> aliquot_sum(0) + Traceback (most recent call last): + ... + ValueError: Input must be positive + >>> aliquot_sum(1.6) + Traceback (most recent call last): + ... + ValueError: Input must be an integer + >>> aliquot_sum(12) + 16 + >>> aliquot_sum(1) + 0 + >>> aliquot_sum(19) + 1 + """ + if not isinstance(input_num, int): + raise ValueError("Input must be an integer") + if input_num <= 0: + raise ValueError("Input must be positive") + return sum( + divisor for divisor in range(1, input_num // 2 + 1) if input_num % divisor == 0 + ) + + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/maths/allocation_number.py b/python-mega-algo/maths/allocation_number.py new file mode 100644 index 00000000..d419e74d --- /dev/null +++ b/python-mega-algo/maths/allocation_number.py @@ -0,0 +1,49 @@ +""" +In a multi-threaded download, this algorithm could be used to provide +each worker thread with a block of non-overlapping bytes to download. +For example: + for i in allocation_list: + requests.get(url,headers={'Range':f'bytes={i}'}) +""" +from __future__ import annotations + + +def allocation_num(number_of_bytes: int, partitions: int) -> list[str]: + """ + Divide a number of bytes into x partitions. + :param number_of_bytes: the total of bytes. + :param partitions: the number of partition need to be allocated. + :return: list of bytes to be assigned to each worker thread + + >>> allocation_num(16647, 4) + ['1-4161', '4162-8322', '8323-12483', '12484-16647'] + >>> allocation_num(50000, 5) + ['1-10000', '10001-20000', '20001-30000', '30001-40000', '40001-50000'] + >>> allocation_num(888, 999) + Traceback (most recent call last): + ... + ValueError: partitions can not > number_of_bytes! + >>> allocation_num(888, -4) + Traceback (most recent call last): + ... + ValueError: partitions must be a positive number! + """ + if partitions <= 0: + raise ValueError("partitions must be a positive number!") + if partitions > number_of_bytes: + raise ValueError("partitions can not > number_of_bytes!") + bytes_per_partition = number_of_bytes // partitions + allocation_list = [] + for i in range(partitions): + start_bytes = i * bytes_per_partition + 1 + end_bytes = ( + number_of_bytes if i == partitions - 1 else (i + 1) * bytes_per_partition + ) + allocation_list.append(f"{start_bytes}-{end_bytes}") + return allocation_list + + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/maths/area.py b/python-mega-algo/maths/area.py new file mode 100644 index 00000000..add1ecb7 --- /dev/null +++ b/python-mega-algo/maths/area.py @@ -0,0 +1,288 @@ +""" +Find the area of various geometric shapes +""" +from math import pi, sqrt + + +def surface_area_cube(side_length: float) -> float: + """ + Calculate the Surface Area of a Cube. + + >>> surface_area_cube(1) + 6 + >>> surface_area_cube(3) + 54 + >>> surface_area_cube(-1) + Traceback (most recent call last): + ... + ValueError: surface_area_cube() only accepts non-negative values + """ + if side_length < 0: + raise ValueError("surface_area_cube() only accepts non-negative values") + return 6 * side_length ** 2 + + +def surface_area_sphere(radius: float) -> float: + """ + Calculate the Surface Area of a Sphere. + Wikipedia reference: https://en.wikipedia.org/wiki/Sphere + Formula: 4 * pi * r^2 + + >>> surface_area_sphere(5) + 314.1592653589793 + >>> surface_area_sphere(1) + 12.566370614359172 + >>> surface_area_sphere(-1) + Traceback (most recent call last): + ... + ValueError: surface_area_sphere() only accepts non-negative values + """ + if radius < 0: + raise ValueError("surface_area_sphere() only accepts non-negative values") + return 4 * pi * radius ** 2 + + +def area_rectangle(length: float, width: float) -> float: + """ + Calculate the area of a rectangle. + + >>> area_rectangle(10, 20) + 200 + >>> area_rectangle(-1, -2) + Traceback (most recent call last): + ... + ValueError: area_rectangle() only accepts non-negative values + >>> area_rectangle(1, -2) + Traceback (most recent call last): + ... + ValueError: area_rectangle() only accepts non-negative values + >>> area_rectangle(-1, 2) + Traceback (most recent call last): + ... + ValueError: area_rectangle() only accepts non-negative values + """ + if length < 0 or width < 0: + raise ValueError("area_rectangle() only accepts non-negative values") + return length * width + + +def area_square(side_length: float) -> float: + """ + Calculate the area of a square. + + >>> area_square(10) + 100 + >>> area_square(-1) + Traceback (most recent call last): + ... + ValueError: area_square() only accepts non-negative values + """ + if side_length < 0: + raise ValueError("area_square() only accepts non-negative values") + return side_length ** 2 + + +def area_triangle(base: float, height: float) -> float: + """ + Calculate the area of a triangle given the base and height. + + >>> area_triangle(10, 10) + 50.0 + >>> area_triangle(-1, -2) + Traceback (most recent call last): + ... + ValueError: area_triangle() only accepts non-negative values + >>> area_triangle(1, -2) + Traceback (most recent call last): + ... + ValueError: area_triangle() only accepts non-negative values + >>> area_triangle(-1, 2) + Traceback (most recent call last): + ... + ValueError: area_triangle() only accepts non-negative values + """ + if base < 0 or height < 0: + raise ValueError("area_triangle() only accepts non-negative values") + return (base * height) / 2 + + +def area_triangle_three_sides(side1: float, side2: float, side3: float) -> float: + """ + Calculate area of triangle when the length of 3 sides are known. + + This function uses Heron's formula: https://en.wikipedia.org/wiki/Heron%27s_formula + + >>> area_triangle_three_sides(5, 12, 13) + 30.0 + >>> area_triangle_three_sides(10, 11, 12) + 51.521233486786784 + >>> area_triangle_three_sides(-1, -2, -1) + Traceback (most recent call last): + ... + ValueError: area_triangle_three_sides() only accepts non-negative values + >>> area_triangle_three_sides(1, -2, 1) + Traceback (most recent call last): + ... + ValueError: area_triangle_three_sides() only accepts non-negative values + """ + if side1 < 0 or side2 < 0 or side3 < 0: + raise ValueError("area_triangle_three_sides() only accepts non-negative values") + elif side1 + side2 < side3 or side1 + side3 < side2 or side2 + side3 < side1: + raise ValueError("Given three sides do not form a triangle") + semi_perimeter = (side1 + side2 + side3) / 2 + area = sqrt( + semi_perimeter + * (semi_perimeter - side1) + * (semi_perimeter - side2) + * (semi_perimeter - side3) + ) + return area + + +def area_parallelogram(base: float, height: float) -> float: + """ + Calculate the area of a parallelogram. + + >>> area_parallelogram(10, 20) + 200 + >>> area_parallelogram(-1, -2) + Traceback (most recent call last): + ... + ValueError: area_parallelogram() only accepts non-negative values + >>> area_parallelogram(1, -2) + Traceback (most recent call last): + ... + ValueError: area_parallelogram() only accepts non-negative values + >>> area_parallelogram(-1, 2) + Traceback (most recent call last): + ... + ValueError: area_parallelogram() only accepts non-negative values + """ + if base < 0 or height < 0: + raise ValueError("area_parallelogram() only accepts non-negative values") + return base * height + + +def area_trapezium(base1: float, base2: float, height: float) -> float: + """ + Calculate the area of a trapezium. + + >>> area_trapezium(10, 20, 30) + 450.0 + >>> area_trapezium(-1, -2, -3) + Traceback (most recent call last): + ... + ValueError: area_trapezium() only accepts non-negative values + >>> area_trapezium(-1, 2, 3) + Traceback (most recent call last): + ... + ValueError: area_trapezium() only accepts non-negative values + >>> area_trapezium(1, -2, 3) + Traceback (most recent call last): + ... + ValueError: area_trapezium() only accepts non-negative values + >>> area_trapezium(1, 2, -3) + Traceback (most recent call last): + ... + ValueError: area_trapezium() only accepts non-negative values + >>> area_trapezium(-1, -2, 3) + Traceback (most recent call last): + ... + ValueError: area_trapezium() only accepts non-negative values + >>> area_trapezium(1, -2, -3) + Traceback (most recent call last): + ... + ValueError: area_trapezium() only accepts non-negative values + >>> area_trapezium(-1, 2, -3) + Traceback (most recent call last): + ... + ValueError: area_trapezium() only accepts non-negative values + """ + if base1 < 0 or base2 < 0 or height < 0: + raise ValueError("area_trapezium() only accepts non-negative values") + return 1 / 2 * (base1 + base2) * height + + +def area_circle(radius: float) -> float: + """ + Calculate the area of a circle. + + >>> area_circle(20) + 1256.6370614359173 + >>> area_circle(-1) + Traceback (most recent call last): + ... + ValueError: area_circle() only accepts non-negative values + """ + if radius < 0: + raise ValueError("area_circle() only accepts non-negative values") + return pi * radius ** 2 + + +def area_ellipse(radius_x: float, radius_y: float) -> float: + """ + Calculate the area of a ellipse. + + >>> area_ellipse(10, 10) + 314.1592653589793 + >>> area_ellipse(10, 20) + 628.3185307179587 + >>> area_ellipse(-10, 20) + Traceback (most recent call last): + ... + ValueError: area_ellipse() only accepts non-negative values + >>> area_ellipse(10, -20) + Traceback (most recent call last): + ... + ValueError: area_ellipse() only accepts non-negative values + >>> area_ellipse(-10, -20) + Traceback (most recent call last): + ... + ValueError: area_ellipse() only accepts non-negative values + """ + if radius_x < 0 or radius_y < 0: + raise ValueError("area_ellipse() only accepts non-negative values") + return pi * radius_x * radius_y + + +def area_rhombus(diagonal_1: float, diagonal_2: float) -> float: + """ + Calculate the area of a rhombus. + + >>> area_rhombus(10, 20) + 100.0 + >>> area_rhombus(-1, -2) + Traceback (most recent call last): + ... + ValueError: area_rhombus() only accepts non-negative values + >>> area_rhombus(1, -2) + Traceback (most recent call last): + ... + ValueError: area_rhombus() only accepts non-negative values + >>> area_rhombus(-1, 2) + Traceback (most recent call last): + ... + ValueError: area_rhombus() only accepts non-negative values + """ + if diagonal_1 < 0 or diagonal_2 < 0: + raise ValueError("area_rhombus() only accepts non-negative values") + return 1 / 2 * diagonal_1 * diagonal_2 + + +if __name__ == "__main__": + import doctest + + doctest.testmod(verbose=True) # verbose so we can see methods missing tests + + print("[DEMO] Areas of various geometric shapes: \n") + print(f"Rectangle: {area_rectangle(10, 20) = }") + print(f"Square: {area_square(10) = }") + print(f"Triangle: {area_triangle(10, 10) = }") + print(f"Triangle: {area_triangle_three_sides(5, 12, 13) = }") + print(f"Parallelogram: {area_parallelogram(10, 20) = }") + print(f"Trapezium: {area_trapezium(10, 20, 30) = }") + print(f"Circle: {area_circle(20) = }") + print("\nSurface Areas of various geometric shapes: \n") + print(f"Cube: {surface_area_cube(20) = }") + print(f"Sphere: {surface_area_sphere(20) = }") + print(f"Rhombus: {area_rhombus(10, 20) = }") diff --git a/python-mega-algo/maths/area_under_curve.py b/python-mega-algo/maths/area_under_curve.py new file mode 100644 index 00000000..2d01e414 --- /dev/null +++ b/python-mega-algo/maths/area_under_curve.py @@ -0,0 +1,59 @@ +""" +Approximates the area under the curve using the trapezoidal rule +""" + +from typing import Callable, Union + + +def trapezoidal_area( + fnc: Callable[[Union[int, float]], Union[int, float]], + x_start: Union[int, float], + x_end: Union[int, float], + steps: int = 100, +) -> float: + """ + Treats curve as a collection of linear lines and sums the area of the + trapezium shape they form + :param fnc: a function which defines a curve + :param x_start: left end point to indicate the start of line segment + :param x_end: right end point to indicate end of line segment + :param steps: an accuracy gauge; more steps increases the accuracy + :return: a float representing the length of the curve + + >>> def f(x): + ... return 5 + >>> f"{trapezoidal_area(f, 12.0, 14.0, 1000):.3f}" + '10.000' + >>> def f(x): + ... return 9*x**2 + >>> f"{trapezoidal_area(f, -4.0, 0, 10000):.4f}" + '192.0000' + >>> f"{trapezoidal_area(f, -4.0, 4.0, 10000):.4f}" + '384.0000' + """ + x1 = x_start + fx1 = fnc(x_start) + area = 0.0 + for i in range(steps): + # Approximates small segments of curve as linear and solve + # for trapezoidal area + x2 = (x_end - x_start) / steps + x1 + fx2 = fnc(x2) + area += abs(fx2 + fx1) * (x2 - x1) / 2 + # Increment step + x1 = x2 + fx1 = fx2 + return area + + +if __name__ == "__main__": + + def f(x): + return x ** 3 + x ** 2 + + print("f(x) = x^3 + x^2") + print("The area between the curve, x = -5, x = 5 and the x axis is:") + i = 10 + while i <= 100000: + print(f"with {i} steps: {trapezoidal_area(f, -5, 5, i)}") + i *= 10 diff --git a/python-mega-algo/maths/armstrong_numbers.py b/python-mega-algo/maths/armstrong_numbers.py new file mode 100644 index 00000000..51df129d --- /dev/null +++ b/python-mega-algo/maths/armstrong_numbers.py @@ -0,0 +1,69 @@ +""" +An Armstrong number is equal to the sum of the cubes of its digits. +For example, 370 is an Armstrong number because 3*3*3 + 7*7*7 + 0*0*0 = 370. +An Armstrong number is often called Narcissistic number. +""" + + +def armstrong_number(n: int) -> bool: + """ + Return True if n is an Armstrong number or False if it is not. + + >>> armstrong_number(153) + True + >>> armstrong_number(200) + False + >>> armstrong_number(1634) + True + >>> armstrong_number(0) + False + >>> armstrong_number(-1) + False + >>> armstrong_number(1.2) + False + """ + if not isinstance(n, int) or n < 1: + return False + + # Initialization of sum and number of digits. + sum = 0 + number_of_digits = 0 + temp = n + # Calculation of digits of the number + while temp > 0: + number_of_digits += 1 + temp //= 10 + # Dividing number into separate digits and find Armstrong number + temp = n + while temp > 0: + rem = temp % 10 + sum += rem ** number_of_digits + temp //= 10 + return n == sum + + +def narcissistic_number(n: int) -> bool: + """Return True if n is a narcissistic number or False if it is not""" + + expo = len(str(n)) # power, all number will be raised to + # each digit will be multiplied expo times + temp = [(int(i) ** expo) for i in str(n)] + + # check if sum of cube of each digit is equal to number + return n == sum(temp) + + +def main(): + """ + Request that user input an integer and tell them if it is Armstrong number. + """ + num = int(input("Enter an integer to see if it is an Armstrong number: ").strip()) + print(f"{num} is {'' if armstrong_number(num) else 'not '}an Armstrong number.") + print(f"{num} is {'' if narcissistic_number(num) else 'not '}an Armstrong number.") + + +if __name__ == "__main__": + import doctest + + doctest.testmod() + main() diff --git a/python-mega-algo/maths/average_mean.py b/python-mega-algo/maths/average_mean.py new file mode 100644 index 00000000..4beca1f7 --- /dev/null +++ b/python-mega-algo/maths/average_mean.py @@ -0,0 +1,20 @@ +"""Find mean of a list of numbers.""" + + +def average(nums): + """Find mean of a list of numbers.""" + return sum(nums) / len(nums) + + +def test_average(): + """ + >>> test_average() + """ + assert 12.0 == average([3, 6, 9, 12, 15, 18, 21]) + assert 20 == average([5, 10, 15, 20, 25, 30, 35]) + assert 4.5 == average([1, 2, 3, 4, 5, 6, 7, 8]) + + +if __name__ == "__main__": + """Call average module to find mean of a specific list of numbers.""" + print(average([2, 4, 6, 8, 20, 50, 70])) diff --git a/python-mega-algo/maths/average_median.py b/python-mega-algo/maths/average_median.py new file mode 100644 index 00000000..0257e3f7 --- /dev/null +++ b/python-mega-algo/maths/average_median.py @@ -0,0 +1,35 @@ +def median(nums): + """ + Find median of a list of numbers. + + >>> median([0]) + 0 + >>> median([4,1,3,2]) + 2.5 + >>> median([2, 70, 6, 50, 20, 8, 4]) + 8 + + Args: + nums: List of nums + + Returns: + Median. + """ + sorted_list = sorted(nums) + length = len(sorted_list) + mid_index = length >> 1 + return ( + (sorted_list[mid_index] + sorted_list[mid_index - 1]) / 2 + if length % 2 == 0 + else sorted_list[mid_index] + ) + + +def main(): + import doctest + + doctest.testmod() + + +if __name__ == "__main__": + main() diff --git a/python-mega-algo/maths/average_mode.py b/python-mega-algo/maths/average_mode.py new file mode 100644 index 00000000..b84a990f --- /dev/null +++ b/python-mega-algo/maths/average_mode.py @@ -0,0 +1,31 @@ +import statistics + + +def mode(input_list): # Defining function "mode." + """This function returns the mode(Mode as in the measures of + central tendency) of the input data. + + The input list may contain any Datastructure or any Datatype. + + >>> input_list = [2, 3, 4, 5, 3, 4, 2, 5, 2, 2, 4, 2, 2, 2] + >>> mode(input_list) + 2 + >>> input_list = [2, 3, 4, 5, 3, 4, 2, 5, 2, 2, 4, 2, 2, 2] + >>> mode(input_list) == statistics.mode(input_list) + True + """ + # Copying input_list to check with the index number later. + check_list = input_list.copy() + result = list() # Empty list to store the counts of elements in input_list + for x in input_list: + result.append(input_list.count(x)) + input_list.remove(x) + y = max(result) # Gets the maximum value in the result list. + # Returns the value with the maximum number of repetitions. + return check_list[result.index(y)] + + +if __name__ == "__main__": + data = [2, 3, 4, 5, 3, 4, 2, 5, 2, 2, 4, 2, 2, 2] + print(mode(data)) + print(statistics.mode(data)) diff --git a/python-mega-algo/maths/bailey_borwein_plouffe.py b/python-mega-algo/maths/bailey_borwein_plouffe.py new file mode 100644 index 00000000..b647ae56 --- /dev/null +++ b/python-mega-algo/maths/bailey_borwein_plouffe.py @@ -0,0 +1,89 @@ +def bailey_borwein_plouffe(digit_position: int, precision: int = 1000) -> str: + """ + Implement a popular pi-digit-extraction algorithm known as the + Bailey-Borwein-Plouffe (BBP) formula to calculate the nth hex digit of pi. + Wikipedia page: + https://en.wikipedia.org/wiki/Bailey%E2%80%93Borwein%E2%80%93Plouffe_formula + @param digit_position: a positive integer representing the position of the digit to + extract. + The digit immediately after the decimal point is located at position 1. + @param precision: number of terms in the second summation to calculate. + A higher number reduces the chance of an error but increases the runtime. + @return: a hexadecimal digit representing the digit at the nth position + in pi's decimal expansion. + + >>> "".join(bailey_borwein_plouffe(i) for i in range(1, 11)) + '243f6a8885' + >>> bailey_borwein_plouffe(5, 10000) + '6' + >>> bailey_borwein_plouffe(-10) + Traceback (most recent call last): + ... + ValueError: Digit position must be a positive integer + >>> bailey_borwein_plouffe(0) + Traceback (most recent call last): + ... + ValueError: Digit position must be a positive integer + >>> bailey_borwein_plouffe(1.7) + Traceback (most recent call last): + ... + ValueError: Digit position must be a positive integer + >>> bailey_borwein_plouffe(2, -10) + Traceback (most recent call last): + ... + ValueError: Precision must be a nonnegative integer + >>> bailey_borwein_plouffe(2, 1.6) + Traceback (most recent call last): + ... + ValueError: Precision must be a nonnegative integer + """ + if (not isinstance(digit_position, int)) or (digit_position <= 0): + raise ValueError("Digit position must be a positive integer") + elif (not isinstance(precision, int)) or (precision < 0): + raise ValueError("Precision must be a nonnegative integer") + + # compute an approximation of (16 ** (n - 1)) * pi whose fractional part is mostly + # accurate + sum_result = ( + 4 * _subsum(digit_position, 1, precision) + - 2 * _subsum(digit_position, 4, precision) + - _subsum(digit_position, 5, precision) + - _subsum(digit_position, 6, precision) + ) + + # return the first hex digit of the fractional part of the result + return hex(int((sum_result % 1) * 16))[2:] + + +def _subsum( + digit_pos_to_extract: int, denominator_addend: int, precision: int +) -> float: + # only care about first digit of fractional part; don't need decimal + """ + Private helper function to implement the summation + functionality. + @param digit_pos_to_extract: digit position to extract + @param denominator_addend: added to denominator of fractions in the formula + @param precision: same as precision in main function + @return: floating-point number whose integer part is not important + """ + sum = 0.0 + for sum_index in range(digit_pos_to_extract + precision): + denominator = 8 * sum_index + denominator_addend + if sum_index < digit_pos_to_extract: + # if the exponential term is an integer and we mod it by the denominator + # before dividing, only the integer part of the sum will change; + # the fractional part will not + exponential_term = pow( + 16, digit_pos_to_extract - 1 - sum_index, denominator + ) + else: + exponential_term = pow(16, digit_pos_to_extract - 1 - sum_index) + sum += exponential_term / denominator + return sum + + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/maths/basic_maths.py b/python-mega-algo/maths/basic_maths.py new file mode 100644 index 00000000..c6d14585 --- /dev/null +++ b/python-mega-algo/maths/basic_maths.py @@ -0,0 +1,80 @@ +"""Implementation of Basic Math in Python.""" +import math + + +def prime_factors(n: int) -> list: + """Find Prime Factors. + >>> prime_factors(100) + [2, 2, 5, 5] + """ + pf = [] + while n % 2 == 0: + pf.append(2) + n = int(n / 2) + for i in range(3, int(math.sqrt(n)) + 1, 2): + while n % i == 0: + pf.append(i) + n = int(n / i) + if n > 2: + pf.append(n) + return pf + + +def number_of_divisors(n: int) -> int: + """Calculate Number of Divisors of an Integer. + >>> number_of_divisors(100) + 9 + """ + div = 1 + temp = 1 + while n % 2 == 0: + temp += 1 + n = int(n / 2) + div *= temp + for i in range(3, int(math.sqrt(n)) + 1, 2): + temp = 1 + while n % i == 0: + temp += 1 + n = int(n / i) + div *= temp + return div + + +def sum_of_divisors(n: int) -> int: + """Calculate Sum of Divisors. + >>> sum_of_divisors(100) + 217 + """ + s = 1 + temp = 1 + while n % 2 == 0: + temp += 1 + n = int(n / 2) + if temp > 1: + s *= (2 ** temp - 1) / (2 - 1) + for i in range(3, int(math.sqrt(n)) + 1, 2): + temp = 1 + while n % i == 0: + temp += 1 + n = int(n / i) + if temp > 1: + s *= (i ** temp - 1) / (i - 1) + return int(s) + + +def euler_phi(n: int) -> int: + """Calculate Euler's Phi Function. + >>> euler_phi(100) + 40 + """ + s = n + for x in set(prime_factors(n)): + s *= (x - 1) / x + return int(s) + + +if __name__ == "__main__": + print(prime_factors(100)) + print(number_of_divisors(100)) + print(sum_of_divisors(100)) + print(euler_phi(100)) diff --git a/python-mega-algo/maths/binary_exp_mod.py b/python-mega-algo/maths/binary_exp_mod.py new file mode 100644 index 00000000..67dd1e72 --- /dev/null +++ b/python-mega-algo/maths/binary_exp_mod.py @@ -0,0 +1,28 @@ +def bin_exp_mod(a, n, b): + """ + >>> bin_exp_mod(3, 4, 5) + 1 + >>> bin_exp_mod(7, 13, 10) + 7 + """ + # mod b + assert not (b == 0), "This cannot accept modulo that is == 0" + if n == 0: + return 1 + + if n % 2 == 1: + return (bin_exp_mod(a, n - 1, b) * a) % b + + r = bin_exp_mod(a, n / 2, b) + return (r * r) % b + + +if __name__ == "__main__": + try: + BASE = int(input("Enter Base : ").strip()) + POWER = int(input("Enter Power : ").strip()) + MODULO = int(input("Enter Modulo : ").strip()) + except ValueError: + print("Invalid literal for integer") + + print(bin_exp_mod(BASE, POWER, MODULO)) diff --git a/python-mega-algo/maths/binary_exponentiation.py b/python-mega-algo/maths/binary_exponentiation.py new file mode 100644 index 00000000..8dda5245 --- /dev/null +++ b/python-mega-algo/maths/binary_exponentiation.py @@ -0,0 +1,28 @@ +"""Binary Exponentiation.""" + +# Author : Junth Basnet +# Time Complexity : O(logn) + + +def binary_exponentiation(a, n): + + if n == 0: + return 1 + + elif n % 2 == 1: + return binary_exponentiation(a, n - 1) * a + + else: + b = binary_exponentiation(a, n / 2) + return b * b + + +if __name__ == "__main__": + try: + BASE = int(input("Enter Base : ").strip()) + POWER = int(input("Enter Power : ").strip()) + except ValueError: + print("Invalid literal for integer") + + RESULT = binary_exponentiation(BASE, POWER) + print(f"{BASE}^({POWER}) : {RESULT}") diff --git a/python-mega-algo/maths/binary_exponentiation_2.py b/python-mega-algo/maths/binary_exponentiation_2.py new file mode 100644 index 00000000..51ec4baf --- /dev/null +++ b/python-mega-algo/maths/binary_exponentiation_2.py @@ -0,0 +1,50 @@ +""" +* Binary Exponentiation with Multiplication +* This is a method to find a*b in a time complexity of O(log b) +* This is one of the most commonly used methods of finding result of multiplication. +* Also useful in cases where solution to (a*b)%c is required, +* where a,b,c can be numbers over the computers calculation limits. +* Done using iteration, can also be done using recursion + +* @author chinmoy159 +* @version 1.0 dated 10/08/2017 +""" + + +def b_expo(a, b): + res = 0 + while b > 0: + if b & 1: + res += a + + a += a + b >>= 1 + + return res + + +def b_expo_mod(a, b, c): + res = 0 + while b > 0: + if b & 1: + res = ((res % c) + (a % c)) % c + + a += a + b >>= 1 + + return res + + +""" +* Wondering how this method works ! +* It's pretty simple. +* Let's say you need to calculate a ^ b +* RULE 1 : a * b = (a+a) * (b/2) ---- example : 4 * 4 = (4+4) * (4/2) = 8 * 2 +* RULE 2 : IF b is ODD, then ---- a * b = a + (a * (b - 1)) :: where (b - 1) is even. +* Once b is even, repeat the process to get a * b +* Repeat the process till b = 1 OR b = 0, because a*1 = a AND a*0 = 0 +* +* As far as the modulo is concerned, +* the fact : (a+b) % c = ((a%c) + (b%c)) % c +* Now apply RULE 1 OR 2, whichever is required. +""" diff --git a/python-mega-algo/maths/binary_exponentiation_3.py b/python-mega-algo/maths/binary_exponentiation_3.py new file mode 100644 index 00000000..dd4e70e7 --- /dev/null +++ b/python-mega-algo/maths/binary_exponentiation_3.py @@ -0,0 +1,50 @@ +""" +* Binary Exponentiation for Powers +* This is a method to find a^b in a time complexity of O(log b) +* This is one of the most commonly used methods of finding powers. +* Also useful in cases where solution to (a^b)%c is required, +* where a,b,c can be numbers over the computers calculation limits. +* Done using iteration, can also be done using recursion + +* @author chinmoy159 +* @version 1.0 dated 10/08/2017 +""" + + +def b_expo(a, b): + res = 1 + while b > 0: + if b & 1: + res *= a + + a *= a + b >>= 1 + + return res + + +def b_expo_mod(a, b, c): + res = 1 + while b > 0: + if b & 1: + res = ((res % c) * (a % c)) % c + + a *= a + b >>= 1 + + return res + + +""" +* Wondering how this method works ! +* It's pretty simple. +* Let's say you need to calculate a ^ b +* RULE 1 : a ^ b = (a*a) ^ (b/2) ---- example : 4 ^ 4 = (4*4) ^ (4/2) = 16 ^ 2 +* RULE 2 : IF b is ODD, then ---- a ^ b = a * (a ^ (b - 1)) :: where (b - 1) is even. +* Once b is even, repeat the process to get a ^ b +* Repeat the process till b = 1 OR b = 0, because a^1 = a AND a^0 = 1 +* +* As far as the modulo is concerned, +* the fact : (a*b) % c = ((a%c) * (b%c)) % c +* Now apply RULE 1 OR 2 whichever is required. +""" diff --git a/python-mega-algo/maths/binomial_coefficient.py b/python-mega-algo/maths/binomial_coefficient.py new file mode 100644 index 00000000..4def0414 --- /dev/null +++ b/python-mega-algo/maths/binomial_coefficient.py @@ -0,0 +1,20 @@ +def binomial_coefficient(n, r): + """ + Find binomial coefficient using pascals triangle. + + >>> binomial_coefficient(10, 5) + 252 + """ + C = [0 for i in range(r + 1)] + # nc0 = 1 + C[0] = 1 + for i in range(1, n + 1): + # to compute current row from previous row. + j = min(i, r) + while j > 0: + C[j] += C[j - 1] + j -= 1 + return C[r] + + +print(binomial_coefficient(n=10, r=5)) diff --git a/python-mega-algo/maths/binomial_distribution.py b/python-mega-algo/maths/binomial_distribution.py new file mode 100644 index 00000000..6c338fc4 --- /dev/null +++ b/python-mega-algo/maths/binomial_distribution.py @@ -0,0 +1,40 @@ +"""For more information about the Binomial Distribution - + https://en.wikipedia.org/wiki/Binomial_distribution""" +from math import factorial + + +def binomial_distribution(successes: int, trials: int, prob: float) -> float: + """ + Return probability of k successes out of n tries, with p probability for one + success + + The function uses the factorial function in order to calculate the binomial + coefficient + + >>> binomial_distribution(3, 5, 0.7) + 0.30870000000000003 + >>> binomial_distribution (2, 4, 0.5) + 0.375 + """ + if successes > trials: + raise ValueError("""successes must be lower or equal to trials""") + if trials < 0 or successes < 0: + raise ValueError("the function is defined for non-negative integers") + if not isinstance(successes, int) or not isinstance(trials, int): + raise ValueError("the function is defined for non-negative integers") + if not 0 < prob < 1: + raise ValueError("prob has to be in range of 1 - 0") + probability = (prob ** successes) * ((1 - prob) ** (trials - successes)) + # Calculate the binomial coefficient: n! / k!(n-k)! + coefficient = float(factorial(trials)) + coefficient /= factorial(successes) * factorial(trials - successes) + return probability * coefficient + + +if __name__ == "__main__": + from doctest import testmod + + testmod() + print("Probability of 2 successes out of 4 trails") + print("with probability of 0.75 is:", end=" ") + print(binomial_distribution(2, 4, 0.75)) diff --git a/python-mega-algo/maths/bisection.py b/python-mega-algo/maths/bisection.py new file mode 100644 index 00000000..93cc2247 --- /dev/null +++ b/python-mega-algo/maths/bisection.py @@ -0,0 +1,63 @@ +""" +Given a function on floating number f(x) and two floating numbers ‘a’ and ‘b’ such that +f(a) * f(b) < 0 and f(x) is continuous in [a, b]. +Here f(x) represents algebraic or transcendental equation. +Find root of function in interval [a, b] (Or find a value of x such that f(x) is 0) + +https://en.wikipedia.org/wiki/Bisection_method +""" + + +def equation(x: float) -> float: + """ + >>> equation(5) + -15 + >>> equation(0) + 10 + >>> equation(-5) + -15 + >>> equation(0.1) + 9.99 + >>> equation(-0.1) + 9.99 + """ + return 10 - x * x + + +def bisection(a: float, b: float) -> float: + """ + >>> bisection(-2, 5) + 3.1611328125 + >>> bisection(0, 6) + 3.158203125 + >>> bisection(2, 3) + Traceback (most recent call last): + ... + ValueError: Wrong space! + """ + # Bolzano theory in order to find if there is a root between a and b + if equation(a) * equation(b) >= 0: + raise ValueError("Wrong space!") + + c = a + while (b - a) >= 0.01: + # Find middle point + c = (a + b) / 2 + # Check if middle point is root + if equation(c) == 0.0: + break + # Decide the side to repeat the steps + if equation(c) * equation(a) < 0: + b = c + else: + a = c + return c + + +if __name__ == "__main__": + import doctest + + doctest.testmod() + + print(bisection(-2, 5)) + print(bisection(0, 6)) diff --git a/python-mega-algo/maths/ceil.py b/python-mega-algo/maths/ceil.py new file mode 100644 index 00000000..97578265 --- /dev/null +++ b/python-mega-algo/maths/ceil.py @@ -0,0 +1,24 @@ +""" +https://en.wikipedia.org/wiki/Floor_and_ceiling_functions +""" + + +def ceil(x) -> int: + """ + Return the ceiling of x as an Integral. + + :param x: the number + :return: the smallest integer >= x. + + >>> import math + >>> all(ceil(n) == math.ceil(n) for n + ... in (1, -1, 0, -0, 1.1, -1.1, 1.0, -1.0, 1_000_000_000)) + True + """ + return int(x) if x - int(x) <= 0 else int(x) + 1 + + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/maths/chudnovsky_algorithm.py b/python-mega-algo/maths/chudnovsky_algorithm.py new file mode 100644 index 00000000..aaee7462 --- /dev/null +++ b/python-mega-algo/maths/chudnovsky_algorithm.py @@ -0,0 +1,60 @@ +from decimal import Decimal, getcontext +from math import ceil, factorial + + +def pi(precision: int) -> str: + """ + The Chudnovsky algorithm is a fast method for calculating the digits of PI, + based on Ramanujan’s PI formulae. + + https://en.wikipedia.org/wiki/Chudnovsky_algorithm + + PI = constant_term / ((multinomial_term * linear_term) / exponential_term) + where constant_term = 426880 * sqrt(10005) + + The linear_term and the exponential_term can be defined iteratively as follows: + L_k+1 = L_k + 545140134 where L_0 = 13591409 + X_k+1 = X_k * -262537412640768000 where X_0 = 1 + + The multinomial_term is defined as follows: + 6k! / ((3k)! * (k!) ^ 3) + where k is the k_th iteration. + + This algorithm correctly calculates around 14 digits of PI per iteration + + >>> pi(10) + '3.14159265' + >>> pi(100) + '3.14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706' + >>> pi('hello') + Traceback (most recent call last): + ... + TypeError: Undefined for non-integers + >>> pi(-1) + Traceback (most recent call last): + ... + ValueError: Undefined for non-natural numbers + """ + + if not isinstance(precision, int): + raise TypeError("Undefined for non-integers") + elif precision < 1: + raise ValueError("Undefined for non-natural numbers") + + getcontext().prec = precision + num_iterations = ceil(precision / 14) + constant_term = 426880 * Decimal(10005).sqrt() + exponential_term = 1 + linear_term = 13591409 + partial_sum = Decimal(linear_term) + for k in range(1, num_iterations): + multinomial_term = factorial(6 * k) // (factorial(3 * k) * factorial(k) ** 3) + linear_term += 545140134 + exponential_term *= -262537412640768000 + partial_sum += Decimal(multinomial_term * linear_term) / exponential_term + return str(constant_term / partial_sum)[:-1] + + +if __name__ == "__main__": + n = 50 + print(f"The first {n} digits of pi is: {pi(n)}") diff --git a/python-mega-algo/maths/collatz_sequence.py b/python-mega-algo/maths/collatz_sequence.py new file mode 100644 index 00000000..7b3636de --- /dev/null +++ b/python-mega-algo/maths/collatz_sequence.py @@ -0,0 +1,44 @@ +from __future__ import annotations + + +def collatz_sequence(n: int) -> list[int]: + """ + Collatz conjecture: start with any positive integer n. The next term is + obtained as follows: + If n term is even, the next term is: n / 2 . + If n is odd, the next term is: 3 * n + 1. + + The conjecture states the sequence will always reach 1 for any starting value n. + Example: + >>> collatz_sequence(2.1) + Traceback (most recent call last): + ... + Exception: Sequence only defined for natural numbers + >>> collatz_sequence(0) + Traceback (most recent call last): + ... + Exception: Sequence only defined for natural numbers + >>> collatz_sequence(43) # doctest: +NORMALIZE_WHITESPACE + [43, 130, 65, 196, 98, 49, 148, 74, 37, 112, 56, 28, 14, 7, + 22, 11, 34, 17, 52, 26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1] + """ + + if not isinstance(n, int) or n < 1: + raise Exception("Sequence only defined for natural numbers") + + sequence = [n] + while n != 1: + n = 3 * n + 1 if n & 1 else n // 2 + sequence.append(n) + return sequence + + +def main(): + n = 43 + sequence = collatz_sequence(n) + print(sequence) + print(f"collatz sequence from {n} took {len(sequence)} steps.") + + +if __name__ == "__main__": + main() diff --git a/python-mega-algo/maths/combinations.py b/python-mega-algo/maths/combinations.py new file mode 100644 index 00000000..40f4f7a9 --- /dev/null +++ b/python-mega-algo/maths/combinations.py @@ -0,0 +1,58 @@ +""" +https://en.wikipedia.org/wiki/Combination +""" +from math import factorial + + +def combinations(n: int, k: int) -> int: + """ + Returns the number of different combinations of k length which can + be made from n values, where n >= k. + + Examples: + >>> combinations(10,5) + 252 + + >>> combinations(6,3) + 20 + + >>> combinations(20,5) + 15504 + + >>> combinations(52, 5) + 2598960 + + >>> combinations(0, 0) + 1 + + >>> combinations(-4, -5) + ... + Traceback (most recent call last): + ValueError: Please enter positive integers for n and k where n >= k + """ + + # If either of the conditions are true, the function is being asked + # to calculate a factorial of a negative number, which is not possible + if n < k or k < 0: + raise ValueError("Please enter positive integers for n and k where n >= k") + return int(factorial(n) / ((factorial(k)) * (factorial(n - k)))) + + +if __name__ == "__main__": + + print( + "\nThe number of five-card hands possible from a standard", + f"fifty-two card deck is: {combinations(52, 5)}", + ) + + print( + "\nIf a class of 40 students must be arranged into groups of", + f"4 for group projects, there are {combinations(40, 4)} ways", + "to arrange them.\n", + ) + + print( + "If 10 teams are competing in a Formula One race, there", + f"are {combinations(10, 3)} ways that first, second and", + "third place can be awarded.\n", + ) diff --git a/python-mega-algo/maths/decimal_isolate.py b/python-mega-algo/maths/decimal_isolate.py new file mode 100644 index 00000000..0e3967a4 --- /dev/null +++ b/python-mega-algo/maths/decimal_isolate.py @@ -0,0 +1,45 @@ +""" +Isolate the Decimal part of a Number +https://stackoverflow.com/questions/3886402/how-to-get-numbers-after-decimal-point +""" + + +def decimal_isolate(number, digitAmount): + + """ + Isolates the decimal part of a number. + If digitAmount > 0 round to that decimal place, else print the entire decimal. + >>> decimal_isolate(1.53, 0) + 0.53 + >>> decimal_isolate(35.345, 1) + 0.3 + >>> decimal_isolate(35.345, 2) + 0.34 + >>> decimal_isolate(35.345, 3) + 0.345 + >>> decimal_isolate(-14.789, 3) + -0.789 + >>> decimal_isolate(0, 2) + 0 + >>> decimal_isolate(-14.123, 1) + -0.1 + >>> decimal_isolate(-14.123, 2) + -0.12 + >>> decimal_isolate(-14.123, 3) + -0.123 + """ + if digitAmount > 0: + return round(number - int(number), digitAmount) + return number - int(number) + + +if __name__ == "__main__": + print(decimal_isolate(1.53, 0)) + print(decimal_isolate(35.345, 1)) + print(decimal_isolate(35.345, 2)) + print(decimal_isolate(35.345, 3)) + print(decimal_isolate(-14.789, 3)) + print(decimal_isolate(0, 2)) + print(decimal_isolate(-14.123, 1)) + print(decimal_isolate(-14.123, 2)) + print(decimal_isolate(-14.123, 3)) diff --git a/python-mega-algo/maths/entropy.py b/python-mega-algo/maths/entropy.py new file mode 100644 index 00000000..43bb3860 --- /dev/null +++ b/python-mega-algo/maths/entropy.py @@ -0,0 +1,131 @@ +#!/usr/bin/env python3 + +""" +Implementation of entropy of information +https://en.wikipedia.org/wiki/Entropy_(information_theory) +""" +from __future__ import annotations + +import math +from collections import Counter +from string import ascii_lowercase + + +def calculate_prob(text: str) -> None: + """ + This method takes path and two dict as argument + and than calculates entropy of them. + :param dict: + :param dict: + :return: Prints + 1) Entropy of information based on 1 alphabet + 2) Entropy of information based on couples of 2 alphabet + 3) print Entropy of H(X n∣Xn−1) + + Text from random books. Also, random quotes. + >>> text = ("Behind Winston’s back the voice " + ... "from the telescreen was still " + ... "babbling and the overfulfilment") + >>> calculate_prob(text) + 4.0 + 6.0 + 2.0 + + >>> text = ("The Ministry of Truth—Minitrue, in Newspeak [Newspeak was the official" + ... "face in elegant lettering, the three") + >>> calculate_prob(text) + 4.0 + 5.0 + 1.0 + >>> text = ("Had repulsive dashwoods suspicion sincerity but advantage now him. " + ... "Remark easily garret nor nay. Civil those mrs enjoy shy fat merry. " + ... "You greatest jointure saw horrible. He private he on be imagine " + ... "suppose. Fertile beloved evident through no service elderly is. Blind " + ... "there if every no so at. Own neglected you preferred way sincerity " + ... "delivered his attempted. To of message cottage windows do besides " + ... "against uncivil. Delightful unreserved impossible few estimating " + ... "men favourable see entreaties. She propriety immediate was improving. " + ... "He or entrance humoured likewise moderate. Much nor game son say " + ... "feel. Fat make met can must form into gate. Me we offending prevailed " + ... "discovery.") + >>> calculate_prob(text) + 4.0 + 7.0 + 3.0 + """ + single_char_strings, two_char_strings = analyze_text(text) + my_alphas = list(" " + ascii_lowercase) + # what is our total sum of probabilities. + all_sum = sum(single_char_strings.values()) + + # one length string + my_fir_sum = 0 + # for each alpha we go in our dict and if it is in it we calculate entropy + for ch in my_alphas: + if ch in single_char_strings: + my_str = single_char_strings[ch] + prob = my_str / all_sum + my_fir_sum += prob * math.log2(prob) # entropy formula. + + # print entropy + print("{:.1f}".format(round(-1 * my_fir_sum))) + + # two len string + all_sum = sum(two_char_strings.values()) + my_sec_sum = 0 + # for each alpha (two in size) calculate entropy. + for ch0 in my_alphas: + for ch1 in my_alphas: + sequence = ch0 + ch1 + if sequence in two_char_strings: + my_str = two_char_strings[sequence] + prob = int(my_str) / all_sum + my_sec_sum += prob * math.log2(prob) + + # print second entropy + print("{:.1f}".format(round(-1 * my_sec_sum))) + + # print the difference between them + print("{:.1f}".format(round((-1 * my_sec_sum) - (-1 * my_fir_sum)))) + + +def analyze_text(text: str) -> tuple[dict, dict]: + """ + Convert text input into two dicts of counts. + The first dictionary stores the frequency of single character strings. + The second dictionary stores the frequency of two character strings. + """ + single_char_strings = Counter() # type: ignore + two_char_strings = Counter() # type: ignore + single_char_strings[text[-1]] += 1 + + # first case when we have space at start. + two_char_strings[" " + text[0]] += 1 + for i in range(0, len(text) - 1): + single_char_strings[text[i]] += 1 + two_char_strings[text[i : i + 2]] += 1 + return single_char_strings, two_char_strings + + +def main(): + import doctest + + doctest.testmod() + # text = ( + # "Had repulsive dashwoods suspicion sincerity but advantage now him. Remark " + # "easily garret nor nay. Civil those mrs enjoy shy fat merry. You greatest " + # "jointure saw horrible. He private he on be imagine suppose. Fertile " + # "beloved evident through no service elderly is. Blind there if every no so " + # "at. Own neglected you preferred way sincerity delivered his attempted. To " + # "of message cottage windows do besides against uncivil. Delightful " + # "unreserved impossible few estimating men favourable see entreaties. She " + # "propriety immediate was improving. He or entrance humoured likewise " + # "moderate. Much nor game son say feel. Fat make met can must form into " + # "gate. Me we offending prevailed discovery. " + # ) + + # calculate_prob(text) + + +if __name__ == "__main__": + main() diff --git a/python-mega-algo/maths/euclidean_distance.py b/python-mega-algo/maths/euclidean_distance.py new file mode 100644 index 00000000..6e0da637 --- /dev/null +++ b/python-mega-algo/maths/euclidean_distance.py @@ -0,0 +1,62 @@ +from typing import Iterable, Union + +import numpy as np + +Vector = Union[Iterable[float], Iterable[int], np.ndarray] +VectorOut = Union[np.float64, int, float] + + +def euclidean_distance(vector_1: Vector, vector_2: Vector) -> VectorOut: + """ + Calculate the distance between the two endpoints of two vectors. + A vector is defined as a list, tuple, or numpy 1D array. + >>> euclidean_distance((0, 0), (2, 2)) + 2.8284271247461903 + >>> euclidean_distance(np.array([0, 0, 0]), np.array([2, 2, 2])) + 3.4641016151377544 + >>> euclidean_distance(np.array([1, 2, 3, 4]), np.array([5, 6, 7, 8])) + 8.0 + >>> euclidean_distance([1, 2, 3, 4], [5, 6, 7, 8]) + 8.0 + """ + return np.sqrt(np.sum((np.asarray(vector_1) - np.asarray(vector_2)) ** 2)) + + +def euclidean_distance_no_np(vector_1: Vector, vector_2: Vector) -> VectorOut: + """ + Calculate the distance between the two endpoints of two vectors without numpy. + A vector is defined as a list, tuple, or numpy 1D array. + >>> euclidean_distance_no_np((0, 0), (2, 2)) + 2.8284271247461903 + >>> euclidean_distance_no_np([1, 2, 3, 4], [5, 6, 7, 8]) + 8.0 + """ + return sum((v1 - v2) ** 2 for v1, v2 in zip(vector_1, vector_2)) ** (1 / 2) + + +if __name__ == "__main__": + + def benchmark() -> None: + """ + Benchmarks + """ + from timeit import timeit + + print("Without Numpy") + print( + timeit( + "euclidean_distance_no_np([1, 2, 3], [4, 5, 6])", + number=10000, + globals=globals(), + ) + ) + print("With Numpy") + print( + timeit( + "euclidean_distance([1, 2, 3], [4, 5, 6])", + number=10000, + globals=globals(), + ) + ) + + benchmark() diff --git a/python-mega-algo/maths/euclidean_gcd.py b/python-mega-algo/maths/euclidean_gcd.py new file mode 100644 index 00000000..de4b2502 --- /dev/null +++ b/python-mega-algo/maths/euclidean_gcd.py @@ -0,0 +1,47 @@ +""" https://en.wikipedia.org/wiki/Euclidean_algorithm """ + + +def euclidean_gcd(a: int, b: int) -> int: + """ + Examples: + >>> euclidean_gcd(3, 5) + 1 + + >>> euclidean_gcd(6, 3) + 3 + """ + while b: + a, b = b, a % b + return a + + +def euclidean_gcd_recursive(a: int, b: int) -> int: + """ + Recursive method for euclicedan gcd algorithm + + Examples: + >>> euclidean_gcd_recursive(3, 5) + 1 + + >>> euclidean_gcd_recursive(6, 3) + 3 + """ + return a if b == 0 else euclidean_gcd_recursive(b, a % b) + + +def main(): + print(f"euclidean_gcd(3, 5) = {euclidean_gcd(3, 5)}") + print(f"euclidean_gcd(5, 3) = {euclidean_gcd(5, 3)}") + print(f"euclidean_gcd(1, 3) = {euclidean_gcd(1, 3)}") + print(f"euclidean_gcd(3, 6) = {euclidean_gcd(3, 6)}") + print(f"euclidean_gcd(6, 3) = {euclidean_gcd(6, 3)}") + + print(f"euclidean_gcd_recursive(3, 5) = {euclidean_gcd_recursive(3, 5)}") + print(f"euclidean_gcd_recursive(5, 3) = {euclidean_gcd_recursive(5, 3)}") + print(f"euclidean_gcd_recursive(1, 3) = {euclidean_gcd_recursive(1, 3)}") + print(f"euclidean_gcd_recursive(3, 6) = {euclidean_gcd_recursive(3, 6)}") + print(f"euclidean_gcd_recursive(6, 3) = {euclidean_gcd_recursive(6, 3)}") + + +if __name__ == "__main__": + main() diff --git a/python-mega-algo/maths/euler_method.py b/python-mega-algo/maths/euler_method.py new file mode 100644 index 00000000..7c780198 --- /dev/null +++ b/python-mega-algo/maths/euler_method.py @@ -0,0 +1,40 @@ +import numpy as np + + +def explicit_euler(ode_func, y0, x0, step_size, x_end): + """ + Calculate numeric solution at each step to an ODE using Euler's Method + + https://en.wikipedia.org/wiki/Euler_method + + Arguments: + ode_func -- The ode as a function of x and y + y0 -- the initial value for y + x0 -- the initial value for x + stepsize -- the increment value for x + x_end -- the end value for x + + >>> # the exact solution is math.exp(x) + >>> def f(x, y): + ... return y + >>> y0 = 1 + >>> y = explicit_euler(f, y0, 0.0, 0.01, 5) + >>> y[-1] + 144.77277243257308 + """ + N = int(np.ceil((x_end - x0) / step_size)) + y = np.zeros((N + 1,)) + y[0] = y0 + x = x0 + + for k in range(N): + y[k + 1] = y[k] + step_size * ode_func(x, y[k]) + x += step_size + + return y + + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/maths/eulers_totient.py b/python-mega-algo/maths/eulers_totient.py new file mode 100644 index 00000000..6a35e69b --- /dev/null +++ b/python-mega-algo/maths/eulers_totient.py @@ -0,0 +1,45 @@ +# Eulers Totient function finds the number of relative primes of a number n from 1 to n +def totient(n: int) -> list: + is_prime = [True for i in range(n + 1)] + totients = [i - 1 for i in range(n + 1)] + primes = [] + for i in range(2, n + 1): + if is_prime[i]: + primes.append(i) + for j in range(0, len(primes)): + if i * primes[j] >= n: + break + is_prime[i * primes[j]] = False + + if i % primes[j] == 0: + totients[i * primes[j]] = totients[i] * primes[j] + break + + totients[i * primes[j]] = totients[i] * (primes[j] - 1) + + return totients + + +def test_totient() -> None: + """ + >>> n = 10 + >>> totient_calculation = totient(n) + >>> for i in range(1, n): + ... print(f"{i} has {totient_calculation[i]} relative primes.") + 1 has 0 relative primes. + 2 has 1 relative primes. + 3 has 2 relative primes. + 4 has 2 relative primes. + 5 has 4 relative primes. + 6 has 2 relative primes. + 7 has 6 relative primes. + 8 has 4 relative primes. + 9 has 6 relative primes. + """ + pass + + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/maths/extended_euclidean_algorithm.py b/python-mega-algo/maths/extended_euclidean_algorithm.py new file mode 100644 index 00000000..e7087636 --- /dev/null +++ b/python-mega-algo/maths/extended_euclidean_algorithm.py @@ -0,0 +1,85 @@ +""" +Extended Euclidean Algorithm. + +Finds 2 numbers a and b such that it satisfies +the equation am + bn = gcd(m, n) (a.k.a Bezout's Identity) + +https://en.wikipedia.org/wiki/Extended_Euclidean_algorithm +""" + +# @Author: S. Sharma +# @Date: 2019-02-25T12:08:53-06:00 +# @Email: silentcat@protonmail.com +# @Last modified by: pikulet +# @Last modified time: 2020-10-02 + +import sys +from typing import Tuple + + +def extended_euclidean_algorithm(a: int, b: int) -> Tuple[int, int]: + """ + Extended Euclidean Algorithm. + + Finds 2 numbers a and b such that it satisfies + the equation am + bn = gcd(m, n) (a.k.a Bezout's Identity) + + >>> extended_euclidean_algorithm(1, 24) + (1, 0) + + >>> extended_euclidean_algorithm(8, 14) + (2, -1) + + >>> extended_euclidean_algorithm(240, 46) + (-9, 47) + + >>> extended_euclidean_algorithm(1, -4) + (1, 0) + + >>> extended_euclidean_algorithm(-2, -4) + (-1, 0) + + >>> extended_euclidean_algorithm(0, -4) + (0, -1) + + >>> extended_euclidean_algorithm(2, 0) + (1, 0) + + """ + # base cases + if abs(a) == 1: + return a, 0 + elif abs(b) == 1: + return 0, b + + old_remainder, remainder = a, b + old_coeff_a, coeff_a = 1, 0 + old_coeff_b, coeff_b = 0, 1 + + while remainder != 0: + quotient = old_remainder // remainder + old_remainder, remainder = remainder, old_remainder - quotient * remainder + old_coeff_a, coeff_a = coeff_a, old_coeff_a - quotient * coeff_a + old_coeff_b, coeff_b = coeff_b, old_coeff_b - quotient * coeff_b + + # sign correction for negative numbers + if a < 0: + old_coeff_a = -old_coeff_a + if b < 0: + old_coeff_b = -old_coeff_b + + return old_coeff_a, old_coeff_b + + +def main(): + """Call Extended Euclidean Algorithm.""" + if len(sys.argv) < 3: + print("2 integer arguments required") + exit(1) + a = int(sys.argv[1]) + b = int(sys.argv[2]) + print(extended_euclidean_algorithm(a, b)) + + +if __name__ == "__main__": + main() diff --git a/python-mega-algo/maths/factorial_iterative.py b/python-mega-algo/maths/factorial_iterative.py new file mode 100644 index 00000000..64314790 --- /dev/null +++ b/python-mega-algo/maths/factorial_iterative.py @@ -0,0 +1,30 @@ +# factorial of a positive integer -- https://en.wikipedia.org/wiki/Factorial + + +def factorial(n: int) -> int: + """ + >>> import math + >>> all(factorial(i) == math.factorial(i) for i in range(20)) + True + >>> factorial(0.1) + Traceback (most recent call last): + ... + ValueError: factorial() only accepts integral values + >>> factorial(-1) + Traceback (most recent call last): + ... + ValueError: factorial() not defined for negative values + """ + if n != int(n): + raise ValueError("factorial() only accepts integral values") + if n < 0: + raise ValueError("factorial() not defined for negative values") + value = 1 + for i in range(1, n + 1): + value *= i + return value + + +if __name__ == "__main__": + n = int(input("Enter a positive integer: ").strip() or 0) + print(f"factorial{n} is {factorial(n)}") diff --git a/python-mega-algo/maths/factorial_python.py b/python-mega-algo/maths/factorial_python.py new file mode 100644 index 00000000..46688261 --- /dev/null +++ b/python-mega-algo/maths/factorial_python.py @@ -0,0 +1,34 @@ +def factorial(input_number: int) -> int: + """ + Calculate the factorial of specified number + + >>> factorial(1) + 1 + >>> factorial(6) + 720 + >>> factorial(0) + 1 + >>> factorial(-1) + Traceback (most recent call last): + ... + ValueError: factorial() not defined for negative values + >>> factorial(0.1) + Traceback (most recent call last): + ... + ValueError: factorial() only accepts integral values + """ + + if input_number < 0: + raise ValueError("factorial() not defined for negative values") + if not isinstance(input_number, int): + raise ValueError("factorial() only accepts integral values") + result = 1 + for i in range(1, input_number): + result = result * (i + 1) + return result + + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/maths/factorial_recursive.py b/python-mega-algo/maths/factorial_recursive.py new file mode 100644 index 00000000..13711273 --- /dev/null +++ b/python-mega-algo/maths/factorial_recursive.py @@ -0,0 +1,28 @@ +def factorial(n: int) -> int: + """ + Calculate the factorial of a positive integer + https://en.wikipedia.org/wiki/Factorial + + >>> import math + >>> all(factorial(i) == math.factorial(i) for i in range(20)) + True + >>> factorial(0.1) + Traceback (most recent call last): + ... + ValueError: factorial() only accepts integral values + >>> factorial(-1) + Traceback (most recent call last): + ... + ValueError: factorial() not defined for negative values + """ + if not isinstance(n, int): + raise ValueError("factorial() only accepts integral values") + if n < 0: + raise ValueError("factorial() not defined for negative values") + return 1 if n == 0 or n == 1 else n * factorial(n - 1) + + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/maths/factors.py b/python-mega-algo/maths/factors.py new file mode 100644 index 00000000..e2fdc406 --- /dev/null +++ b/python-mega-algo/maths/factors.py @@ -0,0 +1,18 @@ +def factors_of_a_number(num: int) -> list: + """ + >>> factors_of_a_number(1) + [1] + >>> factors_of_a_number(5) + [1, 5] + >>> factors_of_a_number(24) + [1, 2, 3, 4, 6, 8, 12, 24] + >>> factors_of_a_number(-24) + [] + """ + return [i for i in range(1, num + 1) if num % i == 0] + + +if __name__ == "__main__": + num = int(input("Enter a number to find its factors: ")) + factors = factors_of_a_number(num) + print(f"{num} has {len(factors)} factors: {', '.join(str(f) for f in factors)}") diff --git a/python-mega-algo/maths/fermat_little_theorem.py b/python-mega-algo/maths/fermat_little_theorem.py new file mode 100644 index 00000000..73af3e28 --- /dev/null +++ b/python-mega-algo/maths/fermat_little_theorem.py @@ -0,0 +1,31 @@ +# Python program to show the usage of Fermat's little theorem in a division +# According to Fermat's little theorem, (a / b) mod p always equals +# a * (b ^ (p - 2)) mod p +# Here we assume that p is a prime number, b divides a, and p doesn't divide b +# Wikipedia reference: https://en.wikipedia.org/wiki/Fermat%27s_little_theorem + + +def binary_exponentiation(a, n, mod): + + if n == 0: + return 1 + + elif n % 2 == 1: + return (binary_exponentiation(a, n - 1, mod) * a) % mod + + else: + b = binary_exponentiation(a, n / 2, mod) + return (b * b) % mod + + +# a prime number +p = 701 + +a = 1000000000 +b = 10 + +# using binary exponentiation function, O(log(p)): +print((a / b) % p == (a * binary_exponentiation(b, p - 2, p)) % p) + +# using Python operators: +print((a / b) % p == (a * b ** (p - 2)) % p) diff --git a/python-mega-algo/maths/fibonacci.py b/python-mega-algo/maths/fibonacci.py new file mode 100644 index 00000000..10555c8b --- /dev/null +++ b/python-mega-algo/maths/fibonacci.py @@ -0,0 +1,130 @@ +# fibonacci.py +""" +1. Calculates the iterative fibonacci sequence + +2. Calculates the fibonacci sequence with a formula + an = [ Phin - (phi)n ]/Sqrt[5] + reference-->Su, Francis E., et al. "Fibonacci Number Formula." Math Fun Facts. + +""" +import functools +import math +import time +from decimal import Decimal, getcontext + +getcontext().prec = 100 + + +def timer_decorator(func): + @functools.wraps(func) + def timer_wrapper(*args, **kwargs): + start = time.time() + func(*args, **kwargs) + end = time.time() + if int(end - start) > 0: + print(f"Run time for {func.__name__}: {(end - start):0.2f}s") + else: + print(f"Run time for {func.__name__}: {(end - start)*1000:0.2f}ms") + return func(*args, **kwargs) + + return timer_wrapper + + +# define Python user-defined exceptions +class Error(Exception): + """Base class for other exceptions""" + + +class ValueTooLargeError(Error): + """Raised when the input value is too large""" + + +class ValueTooSmallError(Error): + """Raised when the input value is not greater than one""" + + +class ValueLessThanZero(Error): + """Raised when the input value is less than zero""" + + +def _check_number_input(n, min_thresh, max_thresh=None): + """ + :param n: single integer + :type n: int + :param min_thresh: min threshold, single integer + :type min_thresh: int + :param max_thresh: max threshold, single integer + :type max_thresh: int + :return: boolean + """ + try: + if n >= min_thresh and max_thresh is None: + return True + elif min_thresh <= n <= max_thresh: + return True + elif n < 0: + raise ValueLessThanZero + elif n < min_thresh: + raise ValueTooSmallError + elif n > max_thresh: + raise ValueTooLargeError + except ValueLessThanZero: + print("Incorrect Input: number must not be less than 0") + except ValueTooSmallError: + print( + f"Incorrect Input: input number must be > {min_thresh} for the recursive " + "calculation" + ) + except ValueTooLargeError: + print( + f"Incorrect Input: input number must be < {max_thresh} for the recursive " + "calculation" + ) + return False + + +@timer_decorator +def fib_iterative(n): + """ + :param n: calculate Fibonacci to the nth integer + :type n:int + :return: Fibonacci sequence as a list + """ + n = int(n) + if _check_number_input(n, 2): + seq_out = [0, 1] + a, b = 0, 1 + for _ in range(n - len(seq_out)): + a, b = b, a + b + seq_out.append(b) + return seq_out + + +@timer_decorator +def fib_formula(n): + """ + :param n: calculate Fibonacci to the nth integer + :type n:int + :return: Fibonacci sequence as a list + """ + seq_out = [0, 1] + n = int(n) + if _check_number_input(n, 2, 1000000): + sqrt = Decimal(math.sqrt(5)) + phi_1 = Decimal(1 + sqrt) / Decimal(2) + phi_2 = Decimal(1 - sqrt) / Decimal(2) + for i in range(2, n): + temp_out = ((phi_1 ** Decimal(i)) - (phi_2 ** Decimal(i))) * ( + Decimal(sqrt) ** Decimal(-1) + ) + seq_out.append(int(temp_out)) + return seq_out + + +if __name__ == "__main__": + num = 20 + # print(f'{fib_recursive(num)}\n') + # print(f'{fib_iterative(num)}\n') + # print(f'{fib_formula(num)}\n') + fib_iterative(num) + fib_formula(num) diff --git a/python-mega-algo/maths/fibonacci_sequence_recursion.py b/python-mega-algo/maths/fibonacci_sequence_recursion.py new file mode 100644 index 00000000..794b9fc0 --- /dev/null +++ b/python-mega-algo/maths/fibonacci_sequence_recursion.py @@ -0,0 +1,22 @@ +# Fibonacci Sequence Using Recursion + + +def recur_fibo(n: int) -> int: + """ + >>> [recur_fibo(i) for i in range(12)] + [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89] + """ + return n if n <= 1 else recur_fibo(n - 1) + recur_fibo(n - 2) + + +def main() -> None: + limit = int(input("How many terms to include in fibonacci series: ")) + if limit > 0: + print(f"The first {limit} terms of the fibonacci series are as follows:") + print([recur_fibo(n) for n in range(limit)]) + else: + print("Please enter a positive integer: ") + + +if __name__ == "__main__": + main() diff --git a/python-mega-algo/maths/find_max.py b/python-mega-algo/maths/find_max.py new file mode 100644 index 00000000..4d92e37e --- /dev/null +++ b/python-mega-algo/maths/find_max.py @@ -0,0 +1,25 @@ +# NguyenU + + +def find_max(nums): + """ + >>> for nums in ([3, 2, 1], [-3, -2, -1], [3, -3, 0], [3.0, 3.1, 2.9]): + ... find_max(nums) == max(nums) + True + True + True + True + """ + max_num = nums[0] + for x in nums: + if x > max_num: + max_num = x + return max_num + + +def main(): + print(find_max([2, 4, 9, 7, 19, 94, 5])) # 94 + + +if __name__ == "__main__": + main() diff --git a/python-mega-algo/maths/find_max_recursion.py b/python-mega-algo/maths/find_max_recursion.py new file mode 100644 index 00000000..03fb8195 --- /dev/null +++ b/python-mega-algo/maths/find_max_recursion.py @@ -0,0 +1,25 @@ +# Divide and Conquer algorithm +def find_max(nums, left, right): + """ + find max value in list + :param nums: contains elements + :param left: index of first element + :param right: index of last element + :return: max in nums + + >>> nums = [1, 3, 5, 7, 9, 2, 4, 6, 8, 10] + >>> find_max(nums, 0, len(nums) - 1) == max(nums) + True + """ + if left == right: + return nums[left] + mid = (left + right) >> 1 # the middle + left_max = find_max(nums, left, mid) # find max in range[left, mid] + right_max = find_max(nums, mid + 1, right) # find max in range[mid + 1, right] + + return left_max if left_max >= right_max else right_max + + +if __name__ == "__main__": + nums = [1, 3, 5, 7, 9, 2, 4, 6, 8, 10] + assert find_max(nums, 0, len(nums) - 1) == 10 diff --git a/python-mega-algo/maths/find_min.py b/python-mega-algo/maths/find_min.py new file mode 100644 index 00000000..2af2e44b --- /dev/null +++ b/python-mega-algo/maths/find_min.py @@ -0,0 +1,26 @@ +def find_min(nums): + """ + Find Minimum Number in a List + :param nums: contains elements + :return: min number in list + + >>> for nums in ([3, 2, 1], [-3, -2, -1], [3, -3, 0], [3.0, 3.1, 2.9]): + ... find_min(nums) == min(nums) + True + True + True + True + """ + min_num = nums[0] + for num in nums: + if min_num > num: + min_num = num + return min_num + + +def main(): + assert find_min([0, 1, 2, 3, 4, 5, -3, 24, -56]) == -56 + + +if __name__ == "__main__": + main() diff --git a/python-mega-algo/maths/find_min_recursion.py b/python-mega-algo/maths/find_min_recursion.py new file mode 100644 index 00000000..4488967c --- /dev/null +++ b/python-mega-algo/maths/find_min_recursion.py @@ -0,0 +1,25 @@ +# Divide and Conquer algorithm +def find_min(nums, left, right): + """ + find min value in list + :param nums: contains elements + :param left: index of first element + :param right: index of last element + :return: min in nums + + >>> nums = [1, 3, 5, 7, 9, 2, 4, 6, 8, 10] + >>> find_min(nums, 0, len(nums) - 1) == min(nums) + True + """ + if left == right: + return nums[left] + mid = (left + right) >> 1 # the middle + left_min = find_min(nums, left, mid) # find min in range[left, mid] + right_min = find_min(nums, mid + 1, right) # find min in range[mid + 1, right] + + return left_min if left_min <= right_min else right_min + + +if __name__ == "__main__": + nums = [1, 3, 5, 7, 9, 2, 4, 6, 8, 10] + assert find_min(nums, 0, len(nums) - 1) == 1 diff --git a/python-mega-algo/maths/floor.py b/python-mega-algo/maths/floor.py new file mode 100644 index 00000000..482250f5 --- /dev/null +++ b/python-mega-algo/maths/floor.py @@ -0,0 +1,22 @@ +""" +https://en.wikipedia.org/wiki/Floor_and_ceiling_functions +""" + + +def floor(x) -> int: + """ + Return the floor of x as an Integral. + :param x: the number + :return: the largest integer <= x. + >>> import math + >>> all(floor(n) == math.floor(n) for n + ... in (1, -1, 0, -0, 1.1, -1.1, 1.0, -1.0, 1_000_000_000)) + True + """ + return int(x) if x - int(x) >= 0 else int(x) - 1 + + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/maths/gamma.py b/python-mega-algo/maths/gamma.py new file mode 100644 index 00000000..69cd819e --- /dev/null +++ b/python-mega-algo/maths/gamma.py @@ -0,0 +1,63 @@ +import math + +from numpy import inf +from scipy.integrate import quad + + +def gamma(num: float) -> float: + """ + https://en.wikipedia.org/wiki/Gamma_function + In mathematics, the gamma function is one commonly + used extension of the factorial function to complex numbers. + The gamma function is defined for all complex numbers except the non-positive + integers + + + >>> gamma(-1) + Traceback (most recent call last): + ... + ValueError: math domain error + + + + >>> gamma(0) + Traceback (most recent call last): + ... + ValueError: math domain error + + + >>> gamma(9) + 40320.0 + + >>> from math import gamma as math_gamma + >>> all(.99999999 < gamma(i) / math_gamma(i) <= 1.000000001 + ... for i in range(1, 50)) + True + + + >>> from math import gamma as math_gamma + >>> gamma(-1)/math_gamma(-1) <= 1.000000001 + Traceback (most recent call last): + ... + ValueError: math domain error + + + >>> from math import gamma as math_gamma + >>> gamma(3.3) - math_gamma(3.3) <= 0.00000001 + True + """ + + if num <= 0: + raise ValueError("math domain error") + + return quad(integrand, 0, inf, args=(num))[0] + + +def integrand(x: float, z: float) -> float: + return math.pow(x, z - 1) * math.exp(-x) + + +if __name__ == "__main__": + from doctest import testmod + + testmod() diff --git a/python-mega-algo/maths/gaussian.py b/python-mega-algo/maths/gaussian.py new file mode 100644 index 00000000..a5dba50a --- /dev/null +++ b/python-mega-algo/maths/gaussian.py @@ -0,0 +1,61 @@ +""" +Reference: https://en.wikipedia.org/wiki/Gaussian_function +""" +from numpy import exp, pi, sqrt + + +def gaussian(x, mu: float = 0.0, sigma: float = 1.0) -> int: + """ + >>> gaussian(1) + 0.24197072451914337 + + >>> gaussian(24) + 3.342714441794458e-126 + + >>> gaussian(1, 4, 2) + 0.06475879783294587 + + >>> gaussian(1, 5, 3) + 0.05467002489199788 + + Supports NumPy Arrays + Use numpy.meshgrid with this to generate gaussian blur on images. + >>> import numpy as np + >>> x = np.arange(15) + >>> gaussian(x) + array([3.98942280e-01, 2.41970725e-01, 5.39909665e-02, 4.43184841e-03, + 1.33830226e-04, 1.48671951e-06, 6.07588285e-09, 9.13472041e-12, + 5.05227108e-15, 1.02797736e-18, 7.69459863e-23, 2.11881925e-27, + 2.14638374e-32, 7.99882776e-38, 1.09660656e-43]) + + >>> gaussian(15) + 5.530709549844416e-50 + + >>> gaussian([1,2, 'string']) + Traceback (most recent call last): + ... + TypeError: unsupported operand type(s) for -: 'list' and 'float' + + >>> gaussian('hello world') + Traceback (most recent call last): + ... + TypeError: unsupported operand type(s) for -: 'str' and 'float' + + >>> gaussian(10**234) # doctest: +IGNORE_EXCEPTION_DETAIL + Traceback (most recent call last): + ... + OverflowError: (34, 'Result too large') + + >>> gaussian(10**-326) + 0.3989422804014327 + + >>> gaussian(2523, mu=234234, sigma=3425) + 0.0 + """ + return 1 / sqrt(2 * pi * sigma ** 2) * exp(-((x - mu) ** 2) / (2 * sigma ** 2)) + + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/maths/greatest_common_divisor.py b/python-mega-algo/maths/greatest_common_divisor.py new file mode 100644 index 00000000..a2174a8e --- /dev/null +++ b/python-mega-algo/maths/greatest_common_divisor.py @@ -0,0 +1,77 @@ +""" +Greatest Common Divisor. + +Wikipedia reference: https://en.wikipedia.org/wiki/Greatest_common_divisor + +gcd(a, b) = gcd(a, -b) = gcd(-a, b) = gcd(-a, -b) by definition of divisibility +""" + + +def greatest_common_divisor(a: int, b: int) -> int: + """ + Calculate Greatest Common Divisor (GCD). + >>> greatest_common_divisor(24, 40) + 8 + >>> greatest_common_divisor(1, 1) + 1 + >>> greatest_common_divisor(1, 800) + 1 + >>> greatest_common_divisor(11, 37) + 1 + >>> greatest_common_divisor(3, 5) + 1 + >>> greatest_common_divisor(16, 4) + 4 + >>> greatest_common_divisor(-3, 9) + 3 + >>> greatest_common_divisor(9, -3) + 3 + >>> greatest_common_divisor(3, -9) + 3 + >>> greatest_common_divisor(-3, -9) + 3 + """ + return abs(b) if a == 0 else greatest_common_divisor(b % a, a) + + +def gcd_by_iterative(x: int, y: int) -> int: + """ + Below method is more memory efficient because it does not create additional + stack frames for recursive functions calls (as done in the above method). + >>> gcd_by_iterative(24, 40) + 8 + >>> greatest_common_divisor(24, 40) == gcd_by_iterative(24, 40) + True + >>> gcd_by_iterative(-3, -9) + 3 + >>> gcd_by_iterative(3, -9) + 3 + >>> gcd_by_iterative(1, -800) + 1 + >>> gcd_by_iterative(11, 37) + 1 + """ + while y: # --> when y=0 then loop will terminate and return x as final GCD. + x, y = y, x % y + return abs(x) + + +def main(): + """ + Call Greatest Common Divisor function. + """ + try: + nums = input("Enter two integers separated by comma (,): ").split(",") + num_1 = int(nums[0]) + num_2 = int(nums[1]) + print( + f"greatest_common_divisor({num_1}, {num_2}) = " + f"{greatest_common_divisor(num_1, num_2)}" + ) + print(f"By iterative gcd({num_1}, {num_2}) = {gcd_by_iterative(num_1, num_2)}") + except (IndexError, UnboundLocalError, ValueError): + print("Wrong input") + + +if __name__ == "__main__": + main() diff --git a/python-mega-algo/maths/greedy_coin_change.py b/python-mega-algo/maths/greedy_coin_change.py new file mode 100644 index 00000000..5a7d9e8d --- /dev/null +++ b/python-mega-algo/maths/greedy_coin_change.py @@ -0,0 +1,102 @@ +""" +Test cases: +Do you want to enter your denominations ? (Y/N) :N +Enter the change you want to make in Indian Currency: 987 +Following is minimal change for 987 : +500 100 100 100 100 50 20 10 5 2 + +Do you want to enter your denominations ? (Y/N) :Y +Enter number of denomination:10 +1 +5 +10 +20 +50 +100 +200 +500 +1000 +2000 +Enter the change you want to make: 18745 +Following is minimal change for 18745 : +2000 2000 2000 2000 2000 2000 2000 2000 2000 500 200 20 20 5 + +Do you want to enter your denominations ? (Y/N) :N +Enter the change you want to make: 0 +The total value cannot be zero or negative. +Do you want to enter your denominations ? (Y/N) :N +Enter the change you want to make: -98 +The total value cannot be zero or negative. + +Do you want to enter your denominations ? (Y/N) :Y +Enter number of denomination:5 +1 +5 +100 +500 +1000 +Enter the change you want to make: 456 +Following is minimal change for 456 : +100 100 100 100 5 5 5 5 5 5 5 5 5 5 5 1 +""" + + +def find_minimum_change(denominations: list[int], value: int) -> list[int]: + """ + Find the minimum change from the given denominations and value + >>> find_minimum_change([1, 5, 10, 20, 50, 100, 200, 500, 1000,2000], 18745) + [2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 500, 200, 20, 20, 5] + >>> find_minimum_change([1, 2, 5, 10, 20, 50, 100, 500, 2000], 987) + [500, 100, 100, 100, 100, 50, 20, 10, 5, 2] + >>> find_minimum_change([1, 2, 5, 10, 20, 50, 100, 500, 2000], 0) + [] + >>> find_minimum_change([1, 2, 5, 10, 20, 50, 100, 500, 2000], -98) + [] + >>> find_minimum_change([1, 5, 100, 500, 1000], 456) + [100, 100, 100, 100, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 1] + """ + total_value = int(value) + + # Initialize Result + answer = [] + + # Traverse through all denomination + for denomination in reversed(denominations): + + # Find denominations + while int(total_value) >= int(denomination): + total_value -= int(denomination) + answer.append(denomination) # Append the "answers" array + + return answer + + +# Driver Code +if __name__ == "__main__": + + denominations = list() + value = 0 + + if ( + input("Do you want to enter your denominations ? (yY/n): ").strip().lower() + == "y" + ): + n = int(input("Enter the number of denominations you want to add: ").strip()) + + for i in range(0, n): + denominations.append(int(input(f"Denomination {i}: ").strip())) + value = input("Enter the change you want to make in Indian Currency: ").strip() + else: + # All denominations of Indian Currency if user does not enter + denominations = [1, 2, 5, 10, 20, 50, 100, 500, 2000] + value = input("Enter the change you want to make: ").strip() + + if int(value) == 0 or int(value) < 0: + print("The total value cannot be zero or negative.") + + else: + print(f"Following is minimal change for {value}: ") + answer = find_minimum_change(denominations, value) + # Print result + for i in range(len(answer)): + print(answer[i], end=" ") diff --git a/python-mega-algo/maths/hardy_ramanujanalgo.py b/python-mega-algo/maths/hardy_ramanujanalgo.py new file mode 100644 index 00000000..90e4913c --- /dev/null +++ b/python-mega-algo/maths/hardy_ramanujanalgo.py @@ -0,0 +1,45 @@ +# This theorem states that the number of prime factors of n +# will be approximately log(log(n)) for most natural numbers n + +import math + + +def exactPrimeFactorCount(n): + """ + >>> exactPrimeFactorCount(51242183) + 3 + """ + count = 0 + if n % 2 == 0: + count += 1 + while n % 2 == 0: + n = int(n / 2) + # the n input value must be odd so that + # we can skip one element (ie i += 2) + + i = 3 + + while i <= int(math.sqrt(n)): + if n % i == 0: + count += 1 + while n % i == 0: + n = int(n / i) + i = i + 2 + + # this condition checks the prime + # number n is greater than 2 + + if n > 2: + count += 1 + return count + + +if __name__ == "__main__": + n = 51242183 + print(f"The number of distinct prime factors is/are {exactPrimeFactorCount(n)}") + print("The value of log(log(n)) is {:.4f}".format(math.log(math.log(n)))) + + """ + The number of distinct prime factors is/are 3 + The value of log(log(n)) is 2.8765 + """ diff --git a/python-mega-algo/maths/images/__init__.py b/python-mega-algo/maths/images/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/maths/images/gaussian.png b/python-mega-algo/maths/images/gaussian.png new file mode 100644 index 0000000000000000000000000000000000000000..eb007c7e21b2296c17a11ebf4dee30cfa2e2f6b1 GIT binary patch literal 53511 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%0AAvI%JD6*Pf82X=-HgWCAtm5l0EcOP$} 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
    ;4ezTavNR-C+3r01oyA!&>=G;l}TUUnc$sZ1M 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 *fc}kRb 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 literal 0 HcmV?d00001 diff --git a/python-mega-algo/maths/images/right.html b/python-mega-algo/maths/images/right.html new file mode 100644 index 00000000..cbd9d5ba --- /dev/null +++ b/python-mega-algo/maths/images/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/maths/images + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    gaussian.png __init__.py 
    + +

    +Folders: 1
    +Files: 2
    +Size of all files: 53511 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/maths/integration_by_simpson_approx.py b/python-mega-algo/maths/integration_by_simpson_approx.py new file mode 100644 index 00000000..da0e1cff --- /dev/null +++ b/python-mega-algo/maths/integration_by_simpson_approx.py @@ -0,0 +1,126 @@ +""" +Author : Syed Faizan ( 3rd Year IIIT Pune ) +Github : faizan2700 + +Purpose : You have one function f(x) which takes float integer and returns +float you have to integrate the function in limits a to b. +The approximation proposed by Thomas Simpsons in 1743 is one way to calculate +integration. + +( read article : https://cp-algorithms.com/num_methods/simpson-integration.html ) + +simpson_integration() takes function,lower_limit=a,upper_limit=b,precision and +returns the integration of function in given limit. +""" + +# constants +# the more the number of steps the more accurate +N_STEPS = 1000 + + +def f(x: float) -> float: + return x * x + + +""" +Summary of Simpson Approximation : + +By simpsons integration : +1. integration of fxdx with limit a to b is = + f(x0) + 4 * f(x1) + 2 * f(x2) + 4 * f(x3) + 2 * f(x4)..... + f(xn) +where x0 = a +xi = a + i * h +xn = b +""" + + +def simpson_integration(function, a: float, b: float, precision: int = 4) -> float: + + """ + Args: + function : the function which's integration is desired + a : the lower limit of integration + b : upper limit of integraion + precision : precision of the result,error required default is 4 + + Returns: + result : the value of the approximated integration of function in range a to b + + Raises: + AssertionError: function is not callable + AssertionError: a is not float or integer + AssertionError: function should return float or integer + AssertionError: b is not float or integer + AssertionError: precision is not positive integer + + >>> simpson_integration(lambda x : x*x,1,2,3) + 2.333 + + >>> simpson_integration(lambda x : x*x,'wrong_input',2,3) + Traceback (most recent call last): + ... + AssertionError: a should be float or integer your input : wrong_input + + >>> simpson_integration(lambda x : x*x,1,'wrong_input',3) + Traceback (most recent call last): + ... + AssertionError: b should be float or integer your input : wrong_input + + >>> simpson_integration(lambda x : x*x,1,2,'wrong_input') + Traceback (most recent call last): + ... + AssertionError: precision should be positive integer your input : wrong_input + >>> simpson_integration('wrong_input',2,3,4) + Traceback (most recent call last): + ... + AssertionError: the function(object) passed should be callable your input : ... + + >>> simpson_integration(lambda x : x*x,3.45,3.2,1) + -2.8 + + >>> simpson_integration(lambda x : x*x,3.45,3.2,0) + Traceback (most recent call last): + ... + AssertionError: precision should be positive integer your input : 0 + + >>> simpson_integration(lambda x : x*x,3.45,3.2,-1) + Traceback (most recent call last): + ... + AssertionError: precision should be positive integer your input : -1 + + """ + assert callable( + function + ), f"the function(object) passed should be callable your input : {function}" + assert isinstance(a, float) or isinstance( + a, int + ), f"a should be float or integer your input : {a}" + assert isinstance(function(a), float) or isinstance(function(a), int), ( + "the function should return integer or float return type of your function, " + f"{type(a)}" + ) + assert isinstance(b, float) or isinstance( + b, int + ), f"b should be float or integer your input : {b}" + assert ( + isinstance(precision, int) and precision > 0 + ), f"precision should be positive integer your input : {precision}" + + # just applying the formula of simpson for approximate integraion written in + # mentioned article in first comment of this file and above this function + + h = (b - a) / N_STEPS + result = function(a) + function(b) + + for i in range(1, N_STEPS): + a1 = a + h * i + result += function(a1) * (4 if i % 2 else 2) + + result *= h / 3 + return round(result, precision) + + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/maths/is_square_free.py b/python-mega-algo/maths/is_square_free.py new file mode 100644 index 00000000..2c06dc1d --- /dev/null +++ b/python-mega-algo/maths/is_square_free.py @@ -0,0 +1,39 @@ +""" +References: wikipedia:square free number +python/black : True +flake8 : True +""" +from __future__ import annotations + + +def is_square_free(factors: list[int]) -> bool: + """ + # doctest: +NORMALIZE_WHITESPACE + This functions takes a list of prime factors as input. + returns True if the factors are square free. + >>> is_square_free([1, 1, 2, 3, 4]) + False + + These are wrong but should return some value + it simply checks for repition in the numbers. + >>> is_square_free([1, 3, 4, 'sd', 0.0]) + True + + >>> is_square_free([1, 0.5, 2, 0.0]) + True + >>> is_square_free([1, 2, 2, 5]) + False + >>> is_square_free('asd') + True + >>> is_square_free(24) + Traceback (most recent call last): + ... + TypeError: 'int' object is not iterable + """ + return len(set(factors)) == len(factors) + + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/maths/jaccard_similarity.py b/python-mega-algo/maths/jaccard_similarity.py new file mode 100644 index 00000000..4f24d308 --- /dev/null +++ b/python-mega-algo/maths/jaccard_similarity.py @@ -0,0 +1,80 @@ +""" +The Jaccard similarity coefficient is a commonly used indicator of the +similarity between two sets. Let U be a set and A and B be subsets of U, +then the Jaccard index/similarity is defined to be the ratio of the number +of elements of their intersection and the number of elements of their union. + +Inspired from Wikipedia and +the book Mining of Massive Datasets [MMDS 2nd Edition, Chapter 3] + +https://en.wikipedia.org/wiki/Jaccard_index +https://mmds.org + +Jaccard similarity is widely used with MinHashing. +""" + + +def jaccard_similariy(setA, setB, alternativeUnion=False): + """ + Finds the jaccard similarity between two sets. + Essentially, its intersection over union. + + The alternative way to calculate this is to take union as sum of the + number of items in the two sets. This will lead to jaccard similarity + of a set with itself be 1/2 instead of 1. [MMDS 2nd Edition, Page 77] + + Parameters: + :setA (set,list,tuple): A non-empty set/list + :setB (set,list,tuple): A non-empty set/list + :alternativeUnion (boolean): If True, use sum of number of + items as union + + Output: + (float) The jaccard similarity between the two sets. + + Examples: + >>> setA = {'a', 'b', 'c', 'd', 'e'} + >>> setB = {'c', 'd', 'e', 'f', 'h', 'i'} + >>> jaccard_similariy(setA,setB) + 0.375 + + >>> jaccard_similariy(setA,setA) + 1.0 + + >>> jaccard_similariy(setA,setA,True) + 0.5 + + >>> setA = ['a', 'b', 'c', 'd', 'e'] + >>> setB = ('c', 'd', 'e', 'f', 'h', 'i') + >>> jaccard_similariy(setA,setB) + 0.375 + """ + + if isinstance(setA, set) and isinstance(setB, set): + + intersection = len(setA.intersection(setB)) + + if alternativeUnion: + union = len(setA) + len(setB) + else: + union = len(setA.union(setB)) + + return intersection / union + + if isinstance(setA, (list, tuple)) and isinstance(setB, (list, tuple)): + + intersection = [element for element in setA if element in setB] + + if alternativeUnion: + union = len(setA) + len(setB) + else: + union = setA + [element for element in setB if element not in setA] + + return len(intersection) / len(union) + + +if __name__ == "__main__": + + setA = {"a", "b", "c", "d", "e"} + setB = {"c", "d", "e", "f", "h", "i"} + print(jaccard_similariy(setA, setB)) diff --git a/python-mega-algo/maths/kadanes.py b/python-mega-algo/maths/kadanes.py new file mode 100644 index 00000000..201b4257 --- /dev/null +++ b/python-mega-algo/maths/kadanes.py @@ -0,0 +1,65 @@ +""" +Kadane's algorithm to get maximum subarray sum +https://medium.com/@rsinghal757/kadanes-algorithm-dynamic-programming-how-and-why-does-it-work-3fd8849ed73d +https://en.wikipedia.org/wiki/Maximum_subarray_problem +""" +test_data: tuple = ([-2, -8, -9], [2, 8, 9], [-1, 0, 1], [0, 0], []) + + +def negative_exist(arr: list) -> int: + """ + >>> negative_exist([-2,-8,-9]) + -2 + >>> [negative_exist(arr) for arr in test_data] + [-2, 0, 0, 0, 0] + """ + arr = arr or [0] + max = arr[0] + for i in arr: + if i >= 0: + return 0 + elif max <= i: + max = i + return max + + +def kadanes(arr: list) -> int: + """ + If negative_exist() returns 0 than this function will execute + else it will return the value return by negative_exist function + + For example: arr = [2, 3, -9, 8, -2] + Initially we set value of max_sum to 0 and max_till_element to 0 than when + max_sum is less than max_till particular element it will assign that value to + max_sum and when value of max_till_sum is less than 0 it will assign 0 to i + and after that whole process, return the max_sum + So the output for above arr is 8 + + >>> kadanes([2, 3, -9, 8, -2]) + 8 + >>> [kadanes(arr) for arr in test_data] + [-2, 19, 1, 0, 0] + """ + max_sum = negative_exist(arr) + if max_sum < 0: + return max_sum + + max_sum = 0 + max_till_element = 0 + + for i in arr: + max_till_element += i + if max_sum <= max_till_element: + max_sum = max_till_element + if max_till_element < 0: + max_till_element = 0 + return max_sum + + +if __name__ == "__main__": + try: + print("Enter integer values sepatated by spaces") + arr = [int(x) for x in input().split()] + print(f"Maximum subarray sum of {arr} is {kadanes(arr)}") + except ValueError: + print("Please enter integer values.") diff --git a/python-mega-algo/maths/karatsuba.py b/python-mega-algo/maths/karatsuba.py new file mode 100644 index 00000000..df29c77a --- /dev/null +++ b/python-mega-algo/maths/karatsuba.py @@ -0,0 +1,32 @@ +""" Multiply two numbers using Karatsuba algorithm """ + + +def karatsuba(a, b): + """ + >>> karatsuba(15463, 23489) == 15463 * 23489 + True + >>> karatsuba(3, 9) == 3 * 9 + True + """ + if len(str(a)) == 1 or len(str(b)) == 1: + return a * b + else: + m1 = max(len(str(a)), len(str(b))) + m2 = m1 // 2 + + a1, a2 = divmod(a, 10 ** m2) + b1, b2 = divmod(b, 10 ** m2) + + x = karatsuba(a2, b2) + y = karatsuba((a1 + a2), (b1 + b2)) + z = karatsuba(a1, b1) + + return (z * 10 ** (2 * m2)) + ((y - z - x) * 10 ** (m2)) + (x) + + +def main(): + print(karatsuba(15463, 23489)) + + +if __name__ == "__main__": + main() diff --git a/python-mega-algo/maths/krishnamurthy_number.py b/python-mega-algo/maths/krishnamurthy_number.py new file mode 100644 index 00000000..c88f68a0 --- /dev/null +++ b/python-mega-algo/maths/krishnamurthy_number.py @@ -0,0 +1,49 @@ +""" + == Krishnamurthy Number == +It is also known as Peterson Number +A Krishnamurthy Number is a number whose sum of the +factorial of the digits equals to the original +number itself. + +For example: 145 = 1! + 4! + 5! + So, 145 is a Krishnamurthy Number +""" + + +def factorial(digit: int) -> int: + """ + >>> factorial(3) + 6 + >>> factorial(0) + 1 + >>> factorial(5) + 120 + """ + + return 1 if digit in (0, 1) else (digit * factorial(digit - 1)) + + +def krishnamurthy(number: int) -> bool: + """ + >>> krishnamurthy(145) + True + >>> krishnamurthy(240) + False + >>> krishnamurthy(1) + True + """ + + factSum = 0 + duplicate = number + while duplicate > 0: + duplicate, digit = divmod(duplicate, 10) + factSum += factorial(digit) + return factSum == number + + +if __name__ == "__main__": + print("Program to check whether a number is a Krisnamurthy Number or not.") + number = int(input("Enter number: ").strip()) + print( + f"{number} is {'' if krishnamurthy(number) else 'not '}a Krishnamurthy Number." + ) diff --git a/python-mega-algo/maths/kth_lexicographic_permutation.py b/python-mega-algo/maths/kth_lexicographic_permutation.py new file mode 100644 index 00000000..b7888392 --- /dev/null +++ b/python-mega-algo/maths/kth_lexicographic_permutation.py @@ -0,0 +1,40 @@ +def kthPermutation(k, n): + """ + Finds k'th lexicographic permutation (in increasing order) of + 0,1,2,...n-1 in O(n^2) time. + + Examples: + First permutation is always 0,1,2,...n + >>> kthPermutation(0,5) + [0, 1, 2, 3, 4] + + The order of permutation of 0,1,2,3 is [0,1,2,3], [0,1,3,2], [0,2,1,3], + [0,2,3,1], [0,3,1,2], [0,3,2,1], [1,0,2,3], [1,0,3,2], [1,2,0,3], + [1,2,3,0], [1,3,0,2] + >>> kthPermutation(10,4) + [1, 3, 0, 2] + """ + # Factorails from 1! to (n-1)! + factorials = [1] + for i in range(2, n): + factorials.append(factorials[-1] * i) + assert 0 <= k < factorials[-1] * n, "k out of bounds" + + permutation = [] + elements = list(range(n)) + + # Find permutation + while factorials: + factorial = factorials.pop() + number, k = divmod(k, factorial) + permutation.append(elements[number]) + elements.remove(elements[number]) + permutation.append(elements[0]) + + return permutation + + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/maths/largest_of_very_large_numbers.py b/python-mega-algo/maths/largest_of_very_large_numbers.py new file mode 100644 index 00000000..d2dc0af1 --- /dev/null +++ b/python-mega-algo/maths/largest_of_very_large_numbers.py @@ -0,0 +1,35 @@ +# Author: Abhijeeth S + +import math + + +def res(x, y): + if 0 not in (x, y): + # We use the relation x^y = y*log10(x), where 10 is the base. + return y * math.log10(x) + else: + if x == 0: # 0 raised to any number is 0 + return 0 + elif y == 0: + return 1 # any number raised to 0 is 1 + + +if __name__ == "__main__": # Main function + # Read two numbers from input and typecast them to int using map function. + # Here x is the base and y is the power. + prompt = "Enter the base and the power separated by a comma: " + x1, y1 = map(int, input(prompt).split(",")) + x2, y2 = map(int, input(prompt).split(",")) + + # We find the log of each number, using the function res(), which takes two + # arguments. + res1 = res(x1, y1) + res2 = res(x2, y2) + + # We check for the largest number + if res1 > res2: + print("Largest number is", x1, "^", y1) + elif res2 > res1: + print("Largest number is", x2, "^", y2) + else: + print("Both are equal") diff --git a/python-mega-algo/maths/largest_subarray_sum.py b/python-mega-algo/maths/largest_subarray_sum.py new file mode 100644 index 00000000..0449e72e --- /dev/null +++ b/python-mega-algo/maths/largest_subarray_sum.py @@ -0,0 +1,23 @@ +from sys import maxsize + + +def max_sub_array_sum(a: list, size: int = 0): + """ + >>> max_sub_array_sum([-13, -3, -25, -20, -3, -16, -23, -12, -5, -22, -15, -4, -7]) + -3 + """ + size = size or len(a) + max_so_far = -maxsize - 1 + max_ending_here = 0 + for i in range(0, size): + max_ending_here = max_ending_here + a[i] + if max_so_far < max_ending_here: + max_so_far = max_ending_here + if max_ending_here < 0: + max_ending_here = 0 + return max_so_far + + +if __name__ == "__main__": + a = [-13, -3, -25, -20, 1, -16, -23, -12, -5, -22, -15, -4, -7] + print(("Maximum contiguous sum is", max_sub_array_sum(a, len(a)))) diff --git a/python-mega-algo/maths/least_common_multiple.py b/python-mega-algo/maths/least_common_multiple.py new file mode 100644 index 00000000..0d087643 --- /dev/null +++ b/python-mega-algo/maths/least_common_multiple.py @@ -0,0 +1,95 @@ +import unittest +from timeit import timeit + + +def least_common_multiple_slow(first_num: int, second_num: int) -> int: + """ + Find the least common multiple of two numbers. + + Learn more: https://en.wikipedia.org/wiki/Least_common_multiple + + >>> least_common_multiple_slow(5, 2) + 10 + >>> least_common_multiple_slow(12, 76) + 228 + """ + max_num = first_num if first_num >= second_num else second_num + common_mult = max_num + while (common_mult % first_num > 0) or (common_mult % second_num > 0): + common_mult += max_num + return common_mult + + +def greatest_common_divisor(a: int, b: int) -> int: + """ + Calculate Greatest Common Divisor (GCD). + see greatest_common_divisor.py + >>> greatest_common_divisor(24, 40) + 8 + >>> greatest_common_divisor(1, 1) + 1 + >>> greatest_common_divisor(1, 800) + 1 + >>> greatest_common_divisor(11, 37) + 1 + >>> greatest_common_divisor(3, 5) + 1 + >>> greatest_common_divisor(16, 4) + 4 + """ + return b if a == 0 else greatest_common_divisor(b % a, a) + + +def least_common_multiple_fast(first_num: int, second_num: int) -> int: + """ + Find the least common multiple of two numbers. + https://en.wikipedia.org/wiki/Least_common_multiple#Using_the_greatest_common_divisor + >>> least_common_multiple_fast(5,2) + 10 + >>> least_common_multiple_fast(12,76) + 228 + """ + return first_num // greatest_common_divisor(first_num, second_num) * second_num + + +def benchmark(): + setup = ( + "from __main__ import least_common_multiple_slow, least_common_multiple_fast" + ) + print( + "least_common_multiple_slow():", + timeit("least_common_multiple_slow(1000, 999)", setup=setup), + ) + print( + "least_common_multiple_fast():", + timeit("least_common_multiple_fast(1000, 999)", setup=setup), + ) + + +class TestLeastCommonMultiple(unittest.TestCase): + + test_inputs = [ + (10, 20), + (13, 15), + (4, 31), + (10, 42), + (43, 34), + (5, 12), + (12, 25), + (10, 25), + (6, 9), + ] + expected_results = [20, 195, 124, 210, 1462, 60, 300, 50, 18] + + def test_lcm_function(self): + for i, (first_num, second_num) in enumerate(self.test_inputs): + slow_result = least_common_multiple_slow(first_num, second_num) + fast_result = least_common_multiple_fast(first_num, second_num) + with self.subTest(i=i): + self.assertEqual(slow_result, self.expected_results[i]) + self.assertEqual(fast_result, self.expected_results[i]) + + +if __name__ == "__main__": + benchmark() + unittest.main() diff --git a/python-mega-algo/maths/line_length.py b/python-mega-algo/maths/line_length.py new file mode 100644 index 00000000..1d386b44 --- /dev/null +++ b/python-mega-algo/maths/line_length.py @@ -0,0 +1,65 @@ +import math +from typing import Callable, Union + + +def line_length( + fnc: Callable[[Union[int, float]], Union[int, float]], + x_start: Union[int, float], + x_end: Union[int, float], + steps: int = 100, +) -> float: + + """ + Approximates the arc length of a line segment by treating the curve as a + sequence of linear lines and summing their lengths + :param fnc: a function which defines a curve + :param x_start: left end point to indicate the start of line segment + :param x_end: right end point to indicate end of line segment + :param steps: an accuracy gauge; more steps increases accuracy + :return: a float representing the length of the curve + + >>> def f(x): + ... return x + >>> f"{line_length(f, 0, 1, 10):.6f}" + '1.414214' + + >>> def f(x): + ... return 1 + >>> f"{line_length(f, -5.5, 4.5):.6f}" + '10.000000' + + >>> def f(x): + ... return math.sin(5 * x) + math.cos(10 * x) + x * x/10 + >>> f"{line_length(f, 0.0, 10.0, 10000):.6f}" + '69.534930' + """ + + x1 = x_start + fx1 = fnc(x_start) + length = 0.0 + + for i in range(steps): + + # Approximates curve as a sequence of linear lines and sums their length + x2 = (x_end - x_start) / steps + x1 + fx2 = fnc(x2) + length += math.hypot(x2 - x1, fx2 - fx1) + + # Increment step + x1 = x2 + fx1 = fx2 + + return length + + +if __name__ == "__main__": + + def f(x): + return math.sin(10 * x) + + print("f(x) = sin(10 * x)") + print("The length of the curve from x = -10 to x = 10 is:") + i = 10 + while i <= 100000: + print(f"With {i} steps: {line_length(f, -10, 10, i)}") + i *= 10 diff --git a/python-mega-algo/maths/lucas_lehmer_primality_test.py b/python-mega-algo/maths/lucas_lehmer_primality_test.py new file mode 100644 index 00000000..15e25cbf --- /dev/null +++ b/python-mega-algo/maths/lucas_lehmer_primality_test.py @@ -0,0 +1,41 @@ +""" + In mathematics, the Lucas–Lehmer test (LLT) is a primality test for Mersenne + numbers. https://en.wikipedia.org/wiki/Lucas%E2%80%93Lehmer_primality_test + + A Mersenne number is a number that is one less than a power of two. + That is M_p = 2^p - 1 + https://en.wikipedia.org/wiki/Mersenne_prime + + The Lucas–Lehmer test is the primality test used by the + Great Internet Mersenne Prime Search (GIMPS) to locate large primes. +""" + + +# Primality test 2^p - 1 +# Return true if 2^p - 1 is prime +def lucas_lehmer_test(p: int) -> bool: + """ + >>> lucas_lehmer_test(p=7) + True + + >>> lucas_lehmer_test(p=11) + False + + # M_11 = 2^11 - 1 = 2047 = 23 * 89 + """ + + if p < 2: + raise ValueError("p should not be less than 2!") + elif p == 2: + return True + + s = 4 + M = (1 << p) - 1 + for i in range(p - 2): + s = ((s * s) - 2) % M + return s == 0 + + +if __name__ == "__main__": + print(lucas_lehmer_test(7)) + print(lucas_lehmer_test(11)) diff --git a/python-mega-algo/maths/lucas_series.py b/python-mega-algo/maths/lucas_series.py new file mode 100644 index 00000000..6b32c202 --- /dev/null +++ b/python-mega-algo/maths/lucas_series.py @@ -0,0 +1,66 @@ +""" +https://en.wikipedia.org/wiki/Lucas_number +""" + + +def recursive_lucas_number(n_th_number: int) -> int: + """ + Returns the nth lucas number + >>> recursive_lucas_number(1) + 1 + >>> recursive_lucas_number(20) + 15127 + >>> recursive_lucas_number(0) + 2 + >>> recursive_lucas_number(25) + 167761 + >>> recursive_lucas_number(-1.5) + Traceback (most recent call last): + ... + TypeError: recursive_lucas_number accepts only integer arguments. + """ + if not isinstance(n_th_number, int): + raise TypeError("recursive_lucas_number accepts only integer arguments.") + if n_th_number == 0: + return 2 + if n_th_number == 1: + return 1 + + return recursive_lucas_number(n_th_number - 1) + recursive_lucas_number( + n_th_number - 2 + ) + + +def dynamic_lucas_number(n_th_number: int) -> int: + """ + Returns the nth lucas number + >>> dynamic_lucas_number(1) + 1 + >>> dynamic_lucas_number(20) + 15127 + >>> dynamic_lucas_number(0) + 2 + >>> dynamic_lucas_number(25) + 167761 + >>> dynamic_lucas_number(-1.5) + Traceback (most recent call last): + ... + TypeError: dynamic_lucas_number accepts only integer arguments. + """ + if not isinstance(n_th_number, int): + raise TypeError("dynamic_lucas_number accepts only integer arguments.") + a, b = 2, 1 + for i in range(n_th_number): + a, b = b, a + b + return a + + +if __name__ == "__main__": + from doctest import testmod + + testmod() + n = int(input("Enter the number of terms in lucas series:\n").strip()) + print("Using recursive function to calculate lucas series:") + print(" ".join(str(recursive_lucas_number(i)) for i in range(n))) + print("\nUsing dynamic function to calculate lucas series:") + print(" ".join(str(dynamic_lucas_number(i)) for i in range(n))) diff --git a/python-mega-algo/maths/matrix_exponentiation.py b/python-mega-algo/maths/matrix_exponentiation.py new file mode 100644 index 00000000..033ceb3f --- /dev/null +++ b/python-mega-algo/maths/matrix_exponentiation.py @@ -0,0 +1,100 @@ +"""Matrix Exponentiation""" + +import timeit + +""" +Matrix Exponentiation is a technique to solve linear recurrences in logarithmic time. +You read more about it here: +http://zobayer.blogspot.com/2010/11/matrix-exponentiation.html +https://www.hackerearth.com/practice/notes/matrix-exponentiation-1/ +""" + + +class Matrix: + def __init__(self, arg): + if isinstance(arg, list): # Initializes a matrix identical to the one provided. + self.t = arg + self.n = len(arg) + else: # Initializes a square matrix of the given size and set values to zero. + self.n = arg + self.t = [[0 for _ in range(self.n)] for _ in range(self.n)] + + def __mul__(self, b): + matrix = Matrix(self.n) + for i in range(self.n): + for j in range(self.n): + for k in range(self.n): + matrix.t[i][j] += self.t[i][k] * b.t[k][j] + return matrix + + +def modular_exponentiation(a, b): + matrix = Matrix([[1, 0], [0, 1]]) + while b > 0: + if b & 1: + matrix *= a + a *= a + b >>= 1 + return matrix + + +def fibonacci_with_matrix_exponentiation(n, f1, f2): + # Trivial Cases + if n == 1: + return f1 + elif n == 2: + return f2 + matrix = Matrix([[1, 1], [1, 0]]) + matrix = modular_exponentiation(matrix, n - 2) + return f2 * matrix.t[0][0] + f1 * matrix.t[0][1] + + +def simple_fibonacci(n, f1, f2): + # Trivial Cases + if n == 1: + return f1 + elif n == 2: + return f2 + + fn_1 = f1 + fn_2 = f2 + n -= 2 + + while n > 0: + fn_1, fn_2 = fn_1 + fn_2, fn_1 + n -= 1 + + return fn_1 + + +def matrix_exponentiation_time(): + setup = """ +from random import randint +from __main__ import fibonacci_with_matrix_exponentiation +""" + code = "fibonacci_with_matrix_exponentiation(randint(1,70000), 1, 1)" + exec_time = timeit.timeit(setup=setup, stmt=code, number=100) + print("With matrix exponentiation the average execution time is ", exec_time / 100) + return exec_time + + +def simple_fibonacci_time(): + setup = """ +from random import randint +from __main__ import simple_fibonacci +""" + code = "simple_fibonacci(randint(1,70000), 1, 1)" + exec_time = timeit.timeit(setup=setup, stmt=code, number=100) + print( + "Without matrix exponentiation the average execution time is ", exec_time / 100 + ) + return exec_time + + +def main(): + matrix_exponentiation_time() + simple_fibonacci_time() + + +if __name__ == "__main__": + main() diff --git a/python-mega-algo/maths/max_sum_sliding_window.py b/python-mega-algo/maths/max_sum_sliding_window.py new file mode 100644 index 00000000..593cb5c8 --- /dev/null +++ b/python-mega-algo/maths/max_sum_sliding_window.py @@ -0,0 +1,45 @@ +""" +Given an array of integer elements and an integer 'k', we are required to find the +maximum sum of 'k' consecutive elements in the array. + +Instead of using a nested for loop, in a Brute force approach we will use a technique +called 'Window sliding technique' where the nested loops can be converted to a single +loop to reduce time complexity. +""" +from typing import List + + +def max_sum_in_array(array: List[int], k: int) -> int: + """ + Returns the maximum sum of k consecutive elements + >>> arr = [1, 4, 2, 10, 2, 3, 1, 0, 20] + >>> k = 4 + >>> max_sum_in_array(arr, k) + 24 + >>> k = 10 + >>> max_sum_in_array(arr,k) + Traceback (most recent call last): + ... + ValueError: Invalid Input + >>> arr = [1, 4, 2, 10, 2, 13, 1, 0, 2] + >>> k = 4 + >>> max_sum_in_array(arr, k) + 27 + """ + if len(array) < k or k < 0: + raise ValueError("Invalid Input") + max_sum = current_sum = sum(array[:k]) + for i in range(len(array) - k): + current_sum = current_sum - array[i] + array[i + k] + max_sum = max(max_sum, current_sum) + return max_sum + + +if __name__ == "__main__": + from doctest import testmod + from random import randint + + testmod() + array = [randint(-1000, 1000) for i in range(100)] + k = randint(0, 110) + print(f"The maximum sum of {k} consecutive elements is {max_sum_in_array(array,k)}") diff --git a/python-mega-algo/maths/median_of_two_arrays.py b/python-mega-algo/maths/median_of_two_arrays.py new file mode 100644 index 00000000..cde12f5d --- /dev/null +++ b/python-mega-algo/maths/median_of_two_arrays.py @@ -0,0 +1,33 @@ +from typing import List + + +def median_of_two_arrays(nums1: List[float], nums2: List[float]) -> float: + """ + >>> median_of_two_arrays([1, 2], [3]) + 2 + >>> median_of_two_arrays([0, -1.1], [2.5, 1]) + 0.5 + >>> median_of_two_arrays([], [2.5, 1]) + 1.75 + >>> median_of_two_arrays([], [0]) + 0 + >>> median_of_two_arrays([], []) + Traceback (most recent call last): + ... + IndexError: list index out of range + """ + all_numbers = sorted(nums1 + nums2) + div, mod = divmod(len(all_numbers), 2) + if mod == 1: + return all_numbers[div] + else: + return (all_numbers[div] + all_numbers[div - 1]) / 2 + + +if __name__ == "__main__": + import doctest + + doctest.testmod() + array_1 = [float(x) for x in input("Enter the elements of first array: ").split()] + array_2 = [float(x) for x in input("Enter the elements of second array: ").split()] + print(f"The median of two arrays is: {median_of_two_arrays(array_1, array_2)}") diff --git a/python-mega-algo/maths/miller_rabin.py b/python-mega-algo/maths/miller_rabin.py new file mode 100644 index 00000000..fe992027 --- /dev/null +++ b/python-mega-algo/maths/miller_rabin.py @@ -0,0 +1,50 @@ +import random + +from .binary_exp_mod import bin_exp_mod + + +# This is a probabilistic check to test primality, useful for big numbers! +# if it's a prime, it will return true +# if it's not a prime, the chance of it returning true is at most 1/4**prec +def is_prime(n, prec=1000): + """ + >>> from .prime_check import prime_check + >>> all(is_prime(i) == prime_check(i) for i in range(1000)) + True + """ + if n < 2: + return False + + if n % 2 == 0: + return n == 2 + + # this means n is odd + d = n - 1 + exp = 0 + while d % 2 == 0: + d /= 2 + exp += 1 + + # n - 1=d*(2**exp) + count = 0 + while count < prec: + a = random.randint(2, n - 1) + b = bin_exp_mod(a, d, n) + if b != 1: + flag = True + for i in range(exp): + if b == n - 1: + flag = False + break + b = b * b + b %= n + if flag: + return False + count += 1 + return True + + +if __name__ == "__main__": + n = abs(int(input("Enter bound : ").strip())) + print("Here's the list of primes:") + print(", ".join(str(i) for i in range(n + 1) if is_prime(i))) diff --git a/python-mega-algo/maths/mobius_function.py b/python-mega-algo/maths/mobius_function.py new file mode 100644 index 00000000..9fd91777 --- /dev/null +++ b/python-mega-algo/maths/mobius_function.py @@ -0,0 +1,43 @@ +""" +References: https://en.wikipedia.org/wiki/M%C3%B6bius_function +References: wikipedia:square free number +python/black : True +flake8 : True +""" + +from maths.is_square_free import is_square_free +from maths.prime_factors import prime_factors + + +def mobius(n: int) -> int: + """ + Mobius function + >>> mobius(24) + 0 + >>> mobius(-1) + 1 + >>> mobius('asd') + Traceback (most recent call last): + ... + TypeError: '<=' not supported between instances of 'int' and 'str' + >>> mobius(10**400) + 0 + >>> mobius(10**-400) + 1 + >>> mobius(-1424) + 1 + >>> mobius([1, '2', 2.0]) + Traceback (most recent call last): + ... + TypeError: '<=' not supported between instances of 'int' and 'list' + """ + factors = prime_factors(n) + if is_square_free(factors): + return -1 if len(factors) % 2 else 1 + return 0 + + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/maths/modular_exponential.py b/python-mega-algo/maths/modular_exponential.py new file mode 100644 index 00000000..42987dbf --- /dev/null +++ b/python-mega-algo/maths/modular_exponential.py @@ -0,0 +1,45 @@ +""" + Modular Exponential. + Modular exponentiation is a type of exponentiation performed over a modulus. + For more explanation, please check + https://en.wikipedia.org/wiki/Modular_exponentiation +""" + +"""Calculate Modular Exponential.""" + + +def modular_exponential(base: int, power: int, mod: int): + """ + >>> modular_exponential(5, 0, 10) + 1 + >>> modular_exponential(2, 8, 7) + 4 + >>> modular_exponential(3, -2, 9) + -1 + """ + + if power < 0: + return -1 + base %= mod + result = 1 + + while power > 0: + if power & 1: + result = (result * base) % mod + power = power >> 1 + base = (base * base) % mod + + return result + + +def main(): + """Call Modular Exponential Function.""" + print(modular_exponential(3, 200, 13)) + + +if __name__ == "__main__": + import doctest + + doctest.testmod() + + main() diff --git a/python-mega-algo/maths/monte_carlo.py b/python-mega-algo/maths/monte_carlo.py new file mode 100644 index 00000000..28027cbe --- /dev/null +++ b/python-mega-algo/maths/monte_carlo.py @@ -0,0 +1,129 @@ +""" +@author: MatteoRaso +""" +from math import pi, sqrt +from random import uniform +from statistics import mean +from typing import Callable + + +def pi_estimator(iterations: int): + """ + An implementation of the Monte Carlo method used to find pi. + 1. Draw a 2x2 square centred at (0,0). + 2. Inscribe a circle within the square. + 3. For each iteration, place a dot anywhere in the square. + a. Record the number of dots within the circle. + 4. After all the dots are placed, divide the dots in the circle by the total. + 5. Multiply this value by 4 to get your estimate of pi. + 6. Print the estimated and numpy value of pi + """ + # A local function to see if a dot lands in the circle. + def is_in_circle(x: float, y: float) -> bool: + distance_from_centre = sqrt((x ** 2) + (y ** 2)) + # Our circle has a radius of 1, so a distance + # greater than 1 would land outside the circle. + return distance_from_centre <= 1 + + # The proportion of guesses that landed in the circle + proportion = mean( + int(is_in_circle(uniform(-1.0, 1.0), uniform(-1.0, 1.0))) + for _ in range(iterations) + ) + # The ratio of the area for circle to square is pi/4. + pi_estimate = proportion * 4 + print(f"The estimated value of pi is {pi_estimate}") + print(f"The numpy value of pi is {pi}") + print(f"The total error is {abs(pi - pi_estimate)}") + + +def area_under_curve_estimator( + iterations: int, + function_to_integrate: Callable[[float], float], + min_value: float = 0.0, + max_value: float = 1.0, +) -> float: + """ + An implementation of the Monte Carlo method to find area under + a single variable non-negative real-valued continuous function, + say f(x), where x lies within a continuous bounded interval, + say [min_value, max_value], where min_value and max_value are + finite numbers + 1. Let x be a uniformly distributed random variable between min_value to + max_value + 2. Expected value of f(x) = + (integrate f(x) from min_value to max_value)/(max_value - min_value) + 3. Finding expected value of f(x): + a. Repeatedly draw x from uniform distribution + b. Evaluate f(x) at each of the drawn x values + c. Expected value = average of the function evaluations + 4. Estimated value of integral = Expected value * (max_value - min_value) + 5. Returns estimated value + """ + + return mean( + function_to_integrate(uniform(min_value, max_value)) for _ in range(iterations) + ) * (max_value - min_value) + + +def area_under_line_estimator_check( + iterations: int, min_value: float = 0.0, max_value: float = 1.0 +) -> None: + """ + Checks estimation error for area_under_curve_estimator function + for f(x) = x where x lies within min_value to max_value + 1. Calls "area_under_curve_estimator" function + 2. Compares with the expected value + 3. Prints estimated, expected and error value + """ + + def identity_function(x: float) -> float: + """ + Represents identity function + >>> [function_to_integrate(x) for x in [-2.0, -1.0, 0.0, 1.0, 2.0]] + [-2.0, -1.0, 0.0, 1.0, 2.0] + """ + return x + + estimated_value = area_under_curve_estimator( + iterations, identity_function, min_value, max_value + ) + expected_value = (max_value * max_value - min_value * min_value) / 2 + + print("******************") + print(f"Estimating area under y=x where x varies from {min_value} to {max_value}") + print(f"Estimated value is {estimated_value}") + print(f"Expected value is {expected_value}") + print(f"Total error is {abs(estimated_value - expected_value)}") + print("******************") + + +def pi_estimator_using_area_under_curve(iterations: int) -> None: + """ + Area under curve y = sqrt(4 - x^2) where x lies in 0 to 2 is equal to pi + """ + + def function_to_integrate(x: float) -> float: + """ + Represents semi-circle with radius 2 + >>> [function_to_integrate(x) for x in [-2.0, 0.0, 2.0]] + [0.0, 2.0, 0.0] + """ + return sqrt(4.0 - x * x) + + estimated_value = area_under_curve_estimator( + iterations, function_to_integrate, 0.0, 2.0 + ) + + print("******************") + print("Estimating pi using area_under_curve_estimator") + print(f"Estimated value is {estimated_value}") + print(f"Expected value is {pi}") + print(f"Total error is {abs(estimated_value - pi)}") + print("******************") + + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/maths/monte_carlo_dice.py b/python-mega-algo/maths/monte_carlo_dice.py new file mode 100644 index 00000000..17cedbdb --- /dev/null +++ b/python-mega-algo/maths/monte_carlo_dice.py @@ -0,0 +1,47 @@ +from __future__ import annotations + +import random + + +class Dice: + NUM_SIDES = 6 + + def __init__(self): + """Initialize a six sided dice""" + self.sides = list(range(1, Dice.NUM_SIDES + 1)) + + def roll(self): + return random.choice(self.sides) + + def _str_(self): + return "Fair Dice" + + +def throw_dice(num_throws: int, num_dice: int = 2) -> list[float]: + """ + Return probability list of all possible sums when throwing dice. + + >>> random.seed(0) + >>> throw_dice(10, 1) + [10.0, 0.0, 30.0, 50.0, 10.0, 0.0] + >>> throw_dice(100, 1) + [19.0, 17.0, 17.0, 11.0, 23.0, 13.0] + >>> throw_dice(1000, 1) + [18.8, 15.5, 16.3, 17.6, 14.2, 17.6] + >>> throw_dice(10000, 1) + [16.35, 16.89, 16.93, 16.6, 16.52, 16.71] + >>> throw_dice(10000, 2) + [2.74, 5.6, 7.99, 11.26, 13.92, 16.7, 14.44, 10.63, 8.05, 5.92, 2.75] + """ + dices = [Dice() for i in range(num_dice)] + count_of_sum = [0] * (len(dices) * Dice.NUM_SIDES + 1) + for i in range(num_throws): + count_of_sum[sum(dice.roll() for dice in dices)] += 1 + probability = [round((count * 100) / num_throws, 2) for count in count_of_sum] + return probability[num_dice:] # remove probability of sums that never appear + + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/maths/newton_raphson.py b/python-mega-algo/maths/newton_raphson.py new file mode 100644 index 00000000..f2b7cb97 --- /dev/null +++ b/python-mega-algo/maths/newton_raphson.py @@ -0,0 +1,54 @@ +""" + Author: P Shreyas Shetty + Implementation of Newton-Raphson method for solving equations of kind + f(x) = 0. It is an iterative method where solution is found by the expression + x[n+1] = x[n] + f(x[n])/f'(x[n]) + If no solution exists, then either the solution will not be found when iteration + limit is reached or the gradient f'(x[n]) approaches zero. In both cases, exception + is raised. If iteration limit is reached, try increasing maxiter. + """ +import math as m + + +def calc_derivative(f, a, h=0.001): + """ + Calculates derivative at point a for function f using finite difference + method + """ + return (f(a + h) - f(a - h)) / (2 * h) + + +def newton_raphson(f, x0=0, maxiter=100, step=0.0001, maxerror=1e-6, logsteps=False): + + a = x0 # set the initial guess + steps = [a] + error = abs(f(a)) + f1 = lambda x: calc_derivative(f, x, h=step) # noqa: E731 Derivative of f(x) + for _ in range(maxiter): + if f1(a) == 0: + raise ValueError("No converging solution found") + a = a - f(a) / f1(a) # Calculate the next estimate + if logsteps: + steps.append(a) + if error < maxerror: + break + else: + raise ValueError("Iteration limit reached, no converging solution found") + if logsteps: + # If logstep is true, then log intermediate steps + return a, error, steps + return a, error + + +if __name__ == "__main__": + from matplotlib import pyplot as plt + + f = lambda x: m.tanh(x) ** 2 - m.exp(3 * x) # noqa: E731 + solution, error, steps = newton_raphson( + f, x0=10, maxiter=1000, step=1e-6, logsteps=True + ) + plt.plot([abs(f(x)) for x in steps]) + plt.xlabel("step") + plt.ylabel("error") + plt.show() + print(f"solution = {{{solution:f}}}, error = {{{error:f}}}") diff --git a/python-mega-algo/maths/number_of_digits.py b/python-mega-algo/maths/number_of_digits.py new file mode 100644 index 00000000..3c0eb7b3 --- /dev/null +++ b/python-mega-algo/maths/number_of_digits.py @@ -0,0 +1,159 @@ +import math +from timeit import timeit + + +def num_digits(n: int) -> int: + """ + Find the number of digits in a number. + + >>> num_digits(12345) + 5 + >>> num_digits(123) + 3 + >>> num_digits(0) + 1 + >>> num_digits(-1) + 1 + >>> num_digits(-123456) + 6 + """ + digits = 0 + n = abs(n) + while True: + n = n // 10 + digits += 1 + if n == 0: + break + return digits + + +def num_digits_fast(n: int) -> int: + """ + Find the number of digits in a number. + abs() is used as logarithm for negative numbers is not defined. + + >>> num_digits_fast(12345) + 5 + >>> num_digits_fast(123) + 3 + >>> num_digits_fast(0) + 1 + >>> num_digits_fast(-1) + 1 + >>> num_digits_fast(-123456) + 6 + """ + return 1 if n == 0 else math.floor(math.log(abs(n), 10) + 1) + + +def num_digits_faster(n: int) -> int: + """ + Find the number of digits in a number. + abs() is used for negative numbers + + >>> num_digits_faster(12345) + 5 + >>> num_digits_faster(123) + 3 + >>> num_digits_faster(0) + 1 + >>> num_digits_faster(-1) + 1 + >>> num_digits_faster(-123456) + 6 + """ + return len(str(abs(n))) + + +def benchmark() -> None: + """ + Benchmark code for comparing 3 functions, + with 3 different length int values. + """ + print("\nFor small_num = ", small_num, ":") + print( + "> num_digits()", + "\t\tans =", + num_digits(small_num), + "\ttime =", + timeit("z.num_digits(z.small_num)", setup="import __main__ as z"), + "seconds", + ) + print( + "> num_digits_fast()", + "\tans =", + num_digits_fast(small_num), + "\ttime =", + timeit("z.num_digits_fast(z.small_num)", setup="import __main__ as z"), + "seconds", + ) + print( + "> num_digits_faster()", + "\tans =", + num_digits_faster(small_num), + "\ttime =", + timeit("z.num_digits_faster(z.small_num)", setup="import __main__ as z"), + "seconds", + ) + + print("\nFor medium_num = ", medium_num, ":") + print( + "> num_digits()", + "\t\tans =", + num_digits(medium_num), + "\ttime =", + timeit("z.num_digits(z.medium_num)", setup="import __main__ as z"), + "seconds", + ) + print( + "> num_digits_fast()", + "\tans =", + num_digits_fast(medium_num), + "\ttime =", + timeit("z.num_digits_fast(z.medium_num)", setup="import __main__ as z"), + "seconds", + ) + print( + "> num_digits_faster()", + "\tans =", + num_digits_faster(medium_num), + "\ttime =", + timeit("z.num_digits_faster(z.medium_num)", setup="import __main__ as z"), + "seconds", + ) + + print("\nFor large_num = ", large_num, ":") + print( + "> num_digits()", + "\t\tans =", + num_digits(large_num), + "\ttime =", + timeit("z.num_digits(z.large_num)", setup="import __main__ as z"), + "seconds", + ) + print( + "> num_digits_fast()", + "\tans =", + num_digits_fast(large_num), + "\ttime =", + timeit("z.num_digits_fast(z.large_num)", setup="import __main__ as z"), + "seconds", + ) + print( + "> num_digits_faster()", + "\tans =", + num_digits_faster(large_num), + "\ttime =", + timeit("z.num_digits_faster(z.large_num)", setup="import __main__ as z"), + "seconds", + ) + + +if __name__ == "__main__": + small_num = 262144 + medium_num = 1125899906842624 + large_num = 1267650600228229401496703205376 + benchmark() + import doctest + + doctest.testmod() diff --git a/python-mega-algo/maths/numerical_integration.py b/python-mega-algo/maths/numerical_integration.py new file mode 100644 index 00000000..87184a76 --- /dev/null +++ b/python-mega-algo/maths/numerical_integration.py @@ -0,0 +1,66 @@ +""" +Approximates the area under the curve using the trapezoidal rule +""" + +from typing import Callable, Union + + +def trapezoidal_area( + fnc: Callable[[Union[int, float]], Union[int, float]], + x_start: Union[int, float], + x_end: Union[int, float], + steps: int = 100, +) -> float: + + """ + Treats curve as a collection of linear lines and sums the area of the + trapezium shape they form + :param fnc: a function which defines a curve + :param x_start: left end point to indicate the start of line segment + :param x_end: right end point to indicate end of line segment + :param steps: an accuracy gauge; more steps increases the accuracy + :return: a float representing the length of the curve + + >>> def f(x): + ... return 5 + >>> '%.3f' % trapezoidal_area(f, 12.0, 14.0, 1000) + '10.000' + + >>> def f(x): + ... return 9*x**2 + >>> '%.4f' % trapezoidal_area(f, -4.0, 0, 10000) + '192.0000' + + >>> '%.4f' % trapezoidal_area(f, -4.0, 4.0, 10000) + '384.0000' + """ + x1 = x_start + fx1 = fnc(x_start) + area = 0.0 + + for i in range(steps): + + # Approximates small segments of curve as linear and solve + # for trapezoidal area + x2 = (x_end - x_start) / steps + x1 + fx2 = fnc(x2) + area += abs(fx2 + fx1) * (x2 - x1) / 2 + + # Increment step + x1 = x2 + fx1 = fx2 + return area + + +if __name__ == "__main__": + + def f(x): + return x ** 3 + + print("f(x) = x^3") + print("The area between the curve, x = -10, x = 10 and the x axis is:") + i = 10 + while i <= 100000: + area = trapezoidal_area(f, -5, 5, i) + print(f"with {i} steps: {area}") + i *= 10 diff --git a/python-mega-algo/maths/perfect_cube.py b/python-mega-algo/maths/perfect_cube.py new file mode 100644 index 00000000..9ad287e4 --- /dev/null +++ b/python-mega-algo/maths/perfect_cube.py @@ -0,0 +1,16 @@ +def perfect_cube(n: int) -> bool: + """ + Check if a number is a perfect cube or not. + + >>> perfect_cube(27) + True + >>> perfect_cube(4) + False + """ + val = n ** (1 / 3) + return (val * val * val) == n + + +if __name__ == "__main__": + print(perfect_cube(27)) + print(perfect_cube(4)) diff --git a/python-mega-algo/maths/perfect_number.py b/python-mega-algo/maths/perfect_number.py new file mode 100644 index 00000000..148e988f --- /dev/null +++ b/python-mega-algo/maths/perfect_number.py @@ -0,0 +1,34 @@ +""" +== Perfect Number == +In number theory, a perfect number is a positive integer that is equal to the sum of +its positive divisors, excluding the number itself. +For example: 6 ==> divisors[1, 2, 3, 6] + Excluding 6, the sum(divisors) is 1 + 2 + 3 = 6 + So, 6 is a Perfect Number + +Other examples of Perfect Numbers: 28, 486, ... + +https://en.wikipedia.org/wiki/Perfect_number +""" + + +def perfect(number: int) -> bool: + """ + >>> perfect(27) + False + >>> perfect(28) + True + >>> perfect(29) + False + + Start from 1 because dividing by 0 will raise ZeroDivisionError. + A number at most can be divisible by the half of the number except the number + itself. For example, 6 is at most can be divisible by 3 except by 6 itself. + """ + return sum(i for i in range(1, number // 2 + 1) if number % i == 0) == number + + +if __name__ == "__main__": + print("Program to check whether a number is a Perfect number or not...") + number = int(input("Enter number: ").strip()) + print(f"{number} is {'' if perfect(number) else 'not '}a Perfect Number.") diff --git a/python-mega-algo/maths/perfect_square.py b/python-mega-algo/maths/perfect_square.py new file mode 100644 index 00000000..4393dcfb --- /dev/null +++ b/python-mega-algo/maths/perfect_square.py @@ -0,0 +1,73 @@ +import math + + +def perfect_square(num: int) -> bool: + """ + Check if a number is perfect square number or not + :param num: the number to be checked + :return: True if number is square number, otherwise False + + >>> perfect_square(9) + True + >>> perfect_square(16) + True + >>> perfect_square(1) + True + >>> perfect_square(0) + True + >>> perfect_square(10) + False + """ + return math.sqrt(num) * math.sqrt(num) == num + + +def perfect_square_binary_search(n: int) -> bool: + """ + Check if a number is perfect square using binary search. + Time complexity : O(Log(n)) + Space complexity: O(1) + + >>> perfect_square_binary_search(9) + True + >>> perfect_square_binary_search(16) + True + >>> perfect_square_binary_search(1) + True + >>> perfect_square_binary_search(0) + True + >>> perfect_square_binary_search(10) + False + >>> perfect_square_binary_search(-1) + False + >>> perfect_square_binary_search(1.1) + False + >>> perfect_square_binary_search("a") + Traceback (most recent call last): + ... + TypeError: '<=' not supported between instances of 'int' and 'str' + >>> perfect_square_binary_search(None) + Traceback (most recent call last): + ... + TypeError: '<=' not supported between instances of 'int' and 'NoneType' + >>> perfect_square_binary_search([]) + Traceback (most recent call last): + ... + TypeError: '<=' not supported between instances of 'int' and 'list' + """ + left = 0 + right = n + while left <= right: + mid = (left + right) // 2 + if mid ** 2 == n: + return True + elif mid ** 2 > n: + right = mid - 1 + else: + left = mid + 1 + return False + + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/maths/pi_monte_carlo_estimation.py b/python-mega-algo/maths/pi_monte_carlo_estimation.py new file mode 100644 index 00000000..20b46ddd --- /dev/null +++ b/python-mega-algo/maths/pi_monte_carlo_estimation.py @@ -0,0 +1,67 @@ +import random + + +class Point: + def __init__(self, x: float, y: float) -> None: + self.x = x + self.y = y + + def is_in_unit_circle(self) -> bool: + """ + True, if the point lies in the unit circle + False, otherwise + """ + return (self.x ** 2 + self.y ** 2) <= 1 + + @classmethod + def random_unit_square(cls): + """ + Generates a point randomly drawn from the unit square [0, 1) x [0, 1). + """ + return cls(x=random.random(), y=random.random()) + + +def estimate_pi(number_of_simulations: int) -> float: + """ + Generates an estimate of the mathematical constant PI. + See https://en.wikipedia.org/wiki/Monte_Carlo_method#Overview + + The estimate is generated by Monte Carlo simulations. Let U be uniformly drawn from + the unit square [0, 1) x [0, 1). The probability that U lies in the unit circle is: + + P[U in unit circle] = 1/4 PI + + and therefore + + PI = 4 * P[U in unit circle] + + We can get an estimate of the probability P[U in unit circle]. + See https://en.wikipedia.org/wiki/Empirical_probability by: + + 1. Draw a point uniformly from the unit square. + 2. Repeat the first step n times and count the number of points in the unit + circle, which is called m. + 3. An estimate of P[U in unit circle] is m/n + """ + if number_of_simulations < 1: + raise ValueError("At least one simulation is necessary to estimate PI.") + + number_in_unit_circle = 0 + for simulation_index in range(number_of_simulations): + random_point = Point.random_unit_square() + + if random_point.is_in_unit_circle(): + number_in_unit_circle += 1 + + return 4 * number_in_unit_circle / number_of_simulations + + +if __name__ == "__main__": + # import doctest + + # doctest.testmod() + from math import pi + + prompt = "Please enter the desired number of Monte Carlo simulations: " + my_pi = estimate_pi(int(input(prompt).strip())) + print(f"An estimate of PI is {my_pi} with an error of {abs(my_pi - pi)}") diff --git a/python-mega-algo/maths/polynomial_evaluation.py b/python-mega-algo/maths/polynomial_evaluation.py new file mode 100644 index 00000000..68ff97dd --- /dev/null +++ b/python-mega-algo/maths/polynomial_evaluation.py @@ -0,0 +1,54 @@ +from typing import Sequence + + +def evaluate_poly(poly: Sequence[float], x: float) -> float: + """Evaluate a polynomial f(x) at specified point x and return the value. + + Arguments: + poly -- the coefficients of a polynomial as an iterable in order of + ascending degree + x -- the point at which to evaluate the polynomial + + >>> evaluate_poly((0.0, 0.0, 5.0, 9.3, 7.0), 10.0) + 79800.0 + """ + return sum(c * (x ** i) for i, c in enumerate(poly)) + + +def horner(poly: Sequence[float], x: float) -> float: + """Evaluate a polynomial at specified point using Horner's method. + + In terms of computational complexity, Horner's method is an efficient method + of evaluating a polynomial. It avoids the use of expensive exponentiation, + and instead uses only multiplication and addition to evaluate the polynomial + in O(n), where n is the degree of the polynomial. + + https://en.wikipedia.org/wiki/Horner's_method + + Arguments: + poly -- the coefficients of a polynomial as an iterable in order of + ascending degree + x -- the point at which to evaluate the polynomial + + >>> horner((0.0, 0.0, 5.0, 9.3, 7.0), 10.0) + 79800.0 + """ + result = 0.0 + for coeff in reversed(poly): + result = result * x + coeff + return result + + +if __name__ == "__main__": + """ + Example: + >>> poly = (0.0, 0.0, 5.0, 9.3, 7.0) # f(x) = 7.0x^4 + 9.3x^3 + 5.0x^2 + >>> x = -13.0 + >>> # f(-13) = 7.0(-13)^4 + 9.3(-13)^3 + 5.0(-13)^2 = 180339.9 + >>> print(evaluate_poly(poly, x)) + 180339.9 + """ + poly = (0.0, 0.0, 5.0, 9.3, 7.0) + x = 10.0 + print(evaluate_poly(poly, x)) + print(horner(poly, x)) diff --git a/python-mega-algo/maths/power_using_recursion.py b/python-mega-algo/maths/power_using_recursion.py new file mode 100644 index 00000000..f82097f6 --- /dev/null +++ b/python-mega-algo/maths/power_using_recursion.py @@ -0,0 +1,36 @@ +""" +== Raise base to the power of exponent using recursion == + Input --> + Enter the base: 3 + Enter the exponent: 4 + Output --> + 3 to the power of 4 is 81 + Input --> + Enter the base: 2 + Enter the exponent: 0 + Output --> + 2 to the power of 0 is 1 +""" + + +def power(base: int, exponent: int) -> float: + """ + power(3, 4) + 81 + >>> power(2, 0) + 1 + >>> all(power(base, exponent) == pow(base, exponent) + ... for base in range(-10, 10) for exponent in range(10)) + True + """ + return base * power(base, (exponent - 1)) if exponent else 1 + + +if __name__ == "__main__": + print("Raise base to the power of exponent using recursion...") + base = int(input("Enter the base: ").strip()) + exponent = int(input("Enter the exponent: ").strip()) + result = power(base, abs(exponent)) + if exponent < 0: # power() does not properly deal w/ negative exponents + result = 1 / result + print(f"{base} to the power of {exponent} is {result}") diff --git a/python-mega-algo/maths/prime_check.py b/python-mega-algo/maths/prime_check.py new file mode 100644 index 00000000..e2bcb7b8 --- /dev/null +++ b/python-mega-algo/maths/prime_check.py @@ -0,0 +1,58 @@ +"""Prime Check.""" + +import math +import unittest + + +def prime_check(number: int) -> bool: + """Checks to see if a number is a prime. + + A number is prime if it has exactly two factors: 1 and itself. + """ + + if 1 < number < 4: + # 2 and 3 are primes + return True + elif number < 2 or not number % 2: + # Negatives, 0, 1 and all even numbers are not primes + return False + + odd_numbers = range(3, int(math.sqrt(number) + 1), 2) + return not any(not number % i for i in odd_numbers) + + +class Test(unittest.TestCase): + def test_primes(self): + self.assertTrue(prime_check(2)) + self.assertTrue(prime_check(3)) + self.assertTrue(prime_check(5)) + self.assertTrue(prime_check(7)) + self.assertTrue(prime_check(11)) + self.assertTrue(prime_check(13)) + self.assertTrue(prime_check(17)) + self.assertTrue(prime_check(19)) + self.assertTrue(prime_check(23)) + self.assertTrue(prime_check(29)) + + def test_not_primes(self): + self.assertFalse( + prime_check(-19), + "Negative numbers are excluded by definition of prime numbers.", + ) + self.assertFalse( + prime_check(0), + "Zero doesn't have any positive factors, primes must have exactly two.", + ) + self.assertFalse( + prime_check(1), + "One only has 1 positive factor, primes must have exactly two.", + ) + self.assertFalse(prime_check(2 * 2)) + self.assertFalse(prime_check(2 * 3)) + self.assertFalse(prime_check(3 * 3)) + self.assertFalse(prime_check(3 * 5)) + self.assertFalse(prime_check(3 * 5 * 7)) + + +if __name__ == "__main__": + unittest.main() diff --git a/python-mega-algo/maths/prime_factors.py b/python-mega-algo/maths/prime_factors.py new file mode 100644 index 00000000..e520ae3a --- /dev/null +++ b/python-mega-algo/maths/prime_factors.py @@ -0,0 +1,52 @@ +""" +python/black : True +""" +from __future__ import annotations + + +def prime_factors(n: int) -> list[int]: + """ + Returns prime factors of n as a list. + + >>> prime_factors(0) + [] + >>> prime_factors(100) + [2, 2, 5, 5] + >>> prime_factors(2560) + [2, 2, 2, 2, 2, 2, 2, 2, 2, 5] + >>> prime_factors(10**-2) + [] + >>> prime_factors(0.02) + [] + >>> x = prime_factors(10**241) # doctest: +NORMALIZE_WHITESPACE + >>> x == [2]*241 + [5]*241 + True + >>> prime_factors(10**-354) + [] + >>> prime_factors('hello') + Traceback (most recent call last): + ... + TypeError: '<=' not supported between instances of 'int' and 'str' + >>> prime_factors([1,2,'hello']) + Traceback (most recent call last): + ... + TypeError: '<=' not supported between instances of 'int' and 'list' + + """ + i = 2 + factors = [] + while i * i <= n: + if n % i: + i += 1 + else: + n //= i + factors.append(i) + if n > 1: + factors.append(n) + return factors + + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/maths/prime_numbers.py b/python-mega-algo/maths/prime_numbers.py new file mode 100644 index 00000000..38bebdde --- /dev/null +++ b/python-mega-algo/maths/prime_numbers.py @@ -0,0 +1,70 @@ +import math +from typing import Generator + + +def slow_primes(max: int) -> Generator[int, None, None]: + """ + Return a list of all primes numbers up to max. + >>> list(slow_primes(0)) + [] + >>> list(slow_primes(-1)) + [] + >>> list(slow_primes(-10)) + [] + >>> list(slow_primes(25)) + [2, 3, 5, 7, 11, 13, 17, 19, 23] + >>> list(slow_primes(11)) + [2, 3, 5, 7, 11] + >>> list(slow_primes(33)) + [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31] + >>> list(slow_primes(10000))[-1] + 9973 + """ + numbers: Generator = (i for i in range(1, (max + 1))) + for i in (n for n in numbers if n > 1): + for j in range(2, i): + if (i % j) == 0: + break + else: + yield i + + +def primes(max: int) -> Generator[int, None, None]: + """ + Return a list of all primes numbers up to max. + >>> list(primes(0)) + [] + >>> list(primes(-1)) + [] + >>> list(primes(-10)) + [] + >>> list(primes(25)) + [2, 3, 5, 7, 11, 13, 17, 19, 23] + >>> list(primes(11)) + [2, 3, 5, 7, 11] + >>> list(primes(33)) + [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31] + >>> list(primes(10000))[-1] + 9973 + """ + numbers: Generator = (i for i in range(1, (max + 1))) + for i in (n for n in numbers if n > 1): + # only need to check for factors up to sqrt(i) + bound = int(math.sqrt(i)) + 1 + for j in range(2, bound): + if (i % j) == 0: + break + else: + yield i + + +if __name__ == "__main__": + number = int(input("Calculate primes up to:\n>> ").strip()) + for ret in primes(number): + print(ret) + + # Let's benchmark them side-by-side... + from timeit import timeit + + print(timeit("slow_primes(1_000_000)", setup="from __main__ import slow_primes")) + print(timeit("primes(1_000_000)", setup="from __main__ import primes")) diff --git a/python-mega-algo/maths/prime_sieve_eratosthenes.py b/python-mega-algo/maths/prime_sieve_eratosthenes.py new file mode 100644 index 00000000..8d60e48c --- /dev/null +++ b/python-mega-algo/maths/prime_sieve_eratosthenes.py @@ -0,0 +1,47 @@ +# flake8: noqa + +""" +Sieve of Eratosthenes + +Input : n =10 +Output: 2 3 5 7 + +Input : n = 20 +Output: 2 3 5 7 11 13 17 19 + +you can read in detail about this at +https://en.wikipedia.org/wiki/Sieve_of_Eratosthenes +""" + + +def prime_sieve_eratosthenes(num): + """ + print the prime numbers up to n + + >>> prime_sieve_eratosthenes(10) + 2,3,5,7, + >>> prime_sieve_eratosthenes(20) + 2,3,5,7,11,13,17,19, + """ + + primes = [True for i in range(num + 1)] + p = 2 + + while p * p <= num: + if primes[p]: + for i in range(p * p, num + 1, p): + primes[i] = False + p += 1 + + for prime in range(2, num + 1): + if primes[prime]: + print(prime, end=",") + + +if __name__ == "__main__": + import doctest + + doctest.testmod() + num = int(input()) + + prime_sieve_eratosthenes(num) diff --git a/python-mega-algo/maths/primelib.py b/python-mega-algo/maths/primelib.py new file mode 100644 index 00000000..37883d9c --- /dev/null +++ b/python-mega-algo/maths/primelib.py @@ -0,0 +1,644 @@ +""" +Created on Thu Oct 5 16:44:23 2017 + +@author: Christian Bender + +This Python library contains some useful functions to deal with +prime numbers and whole numbers. + +Overview: + +isPrime(number) +sieveEr(N) +getPrimeNumbers(N) +primeFactorization(number) +greatestPrimeFactor(number) +smallestPrimeFactor(number) +getPrime(n) +getPrimesBetween(pNumber1, pNumber2) + +---- + +isEven(number) +isOdd(number) +gcd(number1, number2) // greatest common divisor +kgV(number1, number2) // least common multiple +getDivisors(number) // all divisors of 'number' inclusive 1, number +isPerfectNumber(number) + +NEW-FUNCTIONS + +simplifyFraction(numerator, denominator) +factorial (n) // n! +fib (n) // calculate the n-th fibonacci term. + +----- + +goldbach(number) // Goldbach's assumption + +""" + +from math import sqrt + + +def isPrime(number): + """ + input: positive integer 'number' + returns true if 'number' is prime otherwise false. + """ + + # precondition + assert isinstance(number, int) and ( + number >= 0 + ), "'number' must been an int and positive" + + status = True + + # 0 and 1 are none primes. + if number <= 1: + status = False + + for divisor in range(2, int(round(sqrt(number))) + 1): + + # if 'number' divisible by 'divisor' then sets 'status' + # of false and break up the loop. + if number % divisor == 0: + status = False + break + + # precondition + assert isinstance(status, bool), "'status' must been from type bool" + + return status + + +# ------------------------------------------ + + +def sieveEr(N): + """ + input: positive integer 'N' > 2 + returns a list of prime numbers from 2 up to N. + + This function implements the algorithm called + sieve of erathostenes. + + """ + + # precondition + assert isinstance(N, int) and (N > 2), "'N' must been an int and > 2" + + # beginList: contains all natural numbers from 2 up to N + beginList = [x for x in range(2, N + 1)] + + ans = [] # this list will be returns. + + # actual sieve of erathostenes + for i in range(len(beginList)): + + for j in range(i + 1, len(beginList)): + + if (beginList[i] != 0) and (beginList[j] % beginList[i] == 0): + beginList[j] = 0 + + # filters actual prime numbers. + ans = [x for x in beginList if x != 0] + + # precondition + assert isinstance(ans, list), "'ans' must been from type list" + + return ans + + +# -------------------------------- + + +def getPrimeNumbers(N): + """ + input: positive integer 'N' > 2 + returns a list of prime numbers from 2 up to N (inclusive) + This function is more efficient as function 'sieveEr(...)' + """ + + # precondition + assert isinstance(N, int) and (N > 2), "'N' must been an int and > 2" + + ans = [] + + # iterates over all numbers between 2 up to N+1 + # if a number is prime then appends to list 'ans' + for number in range(2, N + 1): + + if isPrime(number): + + ans.append(number) + + # precondition + assert isinstance(ans, list), "'ans' must been from type list" + + return ans + + +# ----------------------------------------- + + +def primeFactorization(number): + """ + input: positive integer 'number' + returns a list of the prime number factors of 'number' + """ + + # precondition + assert isinstance(number, int) and number >= 0, "'number' must been an int and >= 0" + + ans = [] # this list will be returns of the function. + + # potential prime number factors. + + factor = 2 + + quotient = number + + if number == 0 or number == 1: + + ans.append(number) + + # if 'number' not prime then builds the prime factorization of 'number' + elif not isPrime(number): + + while quotient != 1: + + if isPrime(factor) and (quotient % factor == 0): + ans.append(factor) + quotient /= factor + else: + factor += 1 + + else: + ans.append(number) + + # precondition + assert isinstance(ans, list), "'ans' must been from type list" + + return ans + + +# ----------------------------------------- + + +def greatestPrimeFactor(number): + """ + input: positive integer 'number' >= 0 + returns the greatest prime number factor of 'number' + """ + + # precondition + assert isinstance(number, int) and ( + number >= 0 + ), "'number' bust been an int and >= 0" + + ans = 0 + + # prime factorization of 'number' + primeFactors = primeFactorization(number) + + ans = max(primeFactors) + + # precondition + assert isinstance(ans, int), "'ans' must been from type int" + + return ans + + +# ---------------------------------------------- + + +def smallestPrimeFactor(number): + """ + input: integer 'number' >= 0 + returns the smallest prime number factor of 'number' + """ + + # precondition + assert isinstance(number, int) and ( + number >= 0 + ), "'number' bust been an int and >= 0" + + ans = 0 + + # prime factorization of 'number' + primeFactors = primeFactorization(number) + + ans = min(primeFactors) + + # precondition + assert isinstance(ans, int), "'ans' must been from type int" + + return ans + + +# ---------------------- + + +def isEven(number): + """ + input: integer 'number' + returns true if 'number' is even, otherwise false. + """ + + # precondition + assert isinstance(number, int), "'number' must been an int" + assert isinstance(number % 2 == 0, bool), "compare bust been from type bool" + + return number % 2 == 0 + + +# ------------------------ + + +def isOdd(number): + """ + input: integer 'number' + returns true if 'number' is odd, otherwise false. + """ + + # precondition + assert isinstance(number, int), "'number' must been an int" + assert isinstance(number % 2 != 0, bool), "compare bust been from type bool" + + return number % 2 != 0 + + +# ------------------------ + + +def goldbach(number): + """ + Goldbach's assumption + input: a even positive integer 'number' > 2 + returns a list of two prime numbers whose sum is equal to 'number' + """ + + # precondition + assert ( + isinstance(number, int) and (number > 2) and isEven(number) + ), "'number' must been an int, even and > 2" + + ans = [] # this list will returned + + # creates a list of prime numbers between 2 up to 'number' + primeNumbers = getPrimeNumbers(number) + lenPN = len(primeNumbers) + + # run variable for while-loops. + i = 0 + j = None + + # exit variable. for break up the loops + loop = True + + while i < lenPN and loop: + + j = i + 1 + + while j < lenPN and loop: + + if primeNumbers[i] + primeNumbers[j] == number: + loop = False + ans.append(primeNumbers[i]) + ans.append(primeNumbers[j]) + + j += 1 + + i += 1 + + # precondition + assert ( + isinstance(ans, list) + and (len(ans) == 2) + and (ans[0] + ans[1] == number) + and isPrime(ans[0]) + and isPrime(ans[1]) + ), "'ans' must contains two primes. And sum of elements must been eq 'number'" + + return ans + + +# ---------------------------------------------- + + +def gcd(number1, number2): + """ + Greatest common divisor + input: two positive integer 'number1' and 'number2' + returns the greatest common divisor of 'number1' and 'number2' + """ + + # precondition + assert ( + isinstance(number1, int) + and isinstance(number2, int) + and (number1 >= 0) + and (number2 >= 0) + ), "'number1' and 'number2' must been positive integer." + + rest = 0 + + while number2 != 0: + + rest = number1 % number2 + number1 = number2 + number2 = rest + + # precondition + assert isinstance(number1, int) and ( + number1 >= 0 + ), "'number' must been from type int and positive" + + return number1 + + +# ---------------------------------------------------- + + +def kgV(number1, number2): + """ + Least common multiple + input: two positive integer 'number1' and 'number2' + returns the least common multiple of 'number1' and 'number2' + """ + + # precondition + assert ( + isinstance(number1, int) + and isinstance(number2, int) + and (number1 >= 1) + and (number2 >= 1) + ), "'number1' and 'number2' must been positive integer." + + ans = 1 # actual answer that will be return. + + # for kgV (x,1) + if number1 > 1 and number2 > 1: + + # builds the prime factorization of 'number1' and 'number2' + primeFac1 = primeFactorization(number1) + primeFac2 = primeFactorization(number2) + + elif number1 == 1 or number2 == 1: + + primeFac1 = [] + primeFac2 = [] + ans = max(number1, number2) + + count1 = 0 + count2 = 0 + + done = [] # captured numbers int both 'primeFac1' and 'primeFac2' + + # iterates through primeFac1 + for n in primeFac1: + + if n not in done: + + if n in primeFac2: + + count1 = primeFac1.count(n) + count2 = primeFac2.count(n) + + for i in range(max(count1, count2)): + ans *= n + + else: + + count1 = primeFac1.count(n) + + for i in range(count1): + ans *= n + + done.append(n) + + # iterates through primeFac2 + for n in primeFac2: + + if n not in done: + + count2 = primeFac2.count(n) + + for i in range(count2): + ans *= n + + done.append(n) + + # precondition + assert isinstance(ans, int) and ( + ans >= 0 + ), "'ans' must been from type int and positive" + + return ans + + +# ---------------------------------- + + +def getPrime(n): + """ + Gets the n-th prime number. + input: positive integer 'n' >= 0 + returns the n-th prime number, beginning at index 0 + """ + + # precondition + assert isinstance(n, int) and (n >= 0), "'number' must been a positive int" + + index = 0 + ans = 2 # this variable holds the answer + + while index < n: + + index += 1 + + ans += 1 # counts to the next number + + # if ans not prime then + # runs to the next prime number. + while not isPrime(ans): + ans += 1 + + # precondition + assert isinstance(ans, int) and isPrime( + ans + ), "'ans' must been a prime number and from type int" + + return ans + + +# --------------------------------------------------- + + +def getPrimesBetween(pNumber1, pNumber2): + """ + input: prime numbers 'pNumber1' and 'pNumber2' + pNumber1 < pNumber2 + returns a list of all prime numbers between 'pNumber1' (exclusive) + and 'pNumber2' (exclusive) + """ + + # precondition + assert ( + isPrime(pNumber1) and isPrime(pNumber2) and (pNumber1 < pNumber2) + ), "The arguments must been prime numbers and 'pNumber1' < 'pNumber2'" + + number = pNumber1 + 1 # jump to the next number + + ans = [] # this list will be returns. + + # if number is not prime then + # fetch the next prime number. + while not isPrime(number): + number += 1 + + while number < pNumber2: + + ans.append(number) + + number += 1 + + # fetch the next prime number. + while not isPrime(number): + number += 1 + + # precondition + assert ( + isinstance(ans, list) and ans[0] != pNumber1 and ans[len(ans) - 1] != pNumber2 + ), "'ans' must been a list without the arguments" + + # 'ans' contains not 'pNumber1' and 'pNumber2' ! + return ans + + +# ---------------------------------------------------- + + +def getDivisors(n): + """ + input: positive integer 'n' >= 1 + returns all divisors of n (inclusive 1 and 'n') + """ + + # precondition + assert isinstance(n, int) and (n >= 1), "'n' must been int and >= 1" + + ans = [] # will be returned. + + for divisor in range(1, n + 1): + + if n % divisor == 0: + ans.append(divisor) + + # precondition + assert ans[0] == 1 and ans[len(ans) - 1] == n, "Error in function getDivisiors(...)" + + return ans + + +# ---------------------------------------------------- + + +def isPerfectNumber(number): + """ + input: positive integer 'number' > 1 + returns true if 'number' is a perfect number otherwise false. + """ + + # precondition + assert isinstance(number, int) and ( + number > 1 + ), "'number' must been an int and >= 1" + + divisors = getDivisors(number) + + # precondition + assert ( + isinstance(divisors, list) + and (divisors[0] == 1) + and (divisors[len(divisors) - 1] == number) + ), "Error in help-function getDivisiors(...)" + + # summed all divisors up to 'number' (exclusive), hence [:-1] + return sum(divisors[:-1]) == number + + +# ------------------------------------------------------------ + + +def simplifyFraction(numerator, denominator): + """ + input: two integer 'numerator' and 'denominator' + assumes: 'denominator' != 0 + returns: a tuple with simplify numerator and denominator. + """ + + # precondition + assert ( + isinstance(numerator, int) + and isinstance(denominator, int) + and (denominator != 0) + ), "The arguments must been from type int and 'denominator' != 0" + + # build the greatest common divisor of numerator and denominator. + gcdOfFraction = gcd(abs(numerator), abs(denominator)) + + # precondition + assert ( + isinstance(gcdOfFraction, int) + and (numerator % gcdOfFraction == 0) + and (denominator % gcdOfFraction == 0) + ), "Error in function gcd(...,...)" + + return (numerator // gcdOfFraction, denominator // gcdOfFraction) + + +# ----------------------------------------------------------------- + + +def factorial(n): + """ + input: positive integer 'n' + returns the factorial of 'n' (n!) + """ + + # precondition + assert isinstance(n, int) and (n >= 0), "'n' must been a int and >= 0" + + ans = 1 # this will be return. + + for factor in range(1, n + 1): + ans *= factor + + return ans + + +# ------------------------------------------------------------------- + + +def fib(n): + """ + input: positive integer 'n' + returns the n-th fibonacci term , indexing by 0 + """ + + # precondition + assert isinstance(n, int) and (n >= 0), "'n' must been an int and >= 0" + + tmp = 0 + fib1 = 1 + ans = 1 # this will be return + + for i in range(n - 1): + + tmp = ans + ans += fib1 + fib1 = tmp + + return ans diff --git a/python-mega-algo/maths/pythagoras.py b/python-mega-algo/maths/pythagoras.py new file mode 100644 index 00000000..69a17731 --- /dev/null +++ b/python-mega-algo/maths/pythagoras.py @@ -0,0 +1,33 @@ +"""Uses Pythagoras theorem to calculate the distance between two points in space.""" + +import math + + +class Point: + def __init__(self, x, y, z): + self.x = x + self.y = y + self.z = z + + def __repr__(self) -> str: + return f"Point({self.x}, {self.y}, {self.z})" + + +def distance(a: Point, b: Point) -> float: + return math.sqrt(abs((b.x - a.x) ** 2 + (b.y - a.y) ** 2 + (b.z - a.z) ** 2)) + + +def test_distance() -> None: + """ + >>> point1 = Point(2, -1, 7) + >>> point2 = Point(1, -3, 5) + >>> print(f"Distance from {point1} to {point2} is {distance(point1, point2)}") + Distance from Point(2, -1, 7) to Point(1, -3, 5) is 3.0 + """ + pass + + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/maths/qr_decomposition.py b/python-mega-algo/maths/qr_decomposition.py new file mode 100644 index 00000000..5e15fede --- /dev/null +++ b/python-mega-algo/maths/qr_decomposition.py @@ -0,0 +1,71 @@ +import numpy as np + + +def qr_householder(A): + """Return a QR-decomposition of the matrix A using Householder reflection. + + The QR-decomposition decomposes the matrix A of shape (m, n) into an + orthogonal matrix Q of shape (m, m) and an upper triangular matrix R of + shape (m, n). Note that the matrix A does not have to be square. This + method of decomposing A uses the Householder reflection, which is + numerically stable and of complexity O(n^3). + + https://en.wikipedia.org/wiki/QR_decomposition#Using_Householder_reflections + + Arguments: + A -- a numpy.ndarray of shape (m, n) + + Note: several optimizations can be made for numeric efficiency, but this is + intended to demonstrate how it would be represented in a mathematics + textbook. In cases where efficiency is particularly important, an optimized + version from BLAS should be used. + + >>> A = np.array([[12, -51, 4], [6, 167, -68], [-4, 24, -41]], dtype=float) + >>> Q, R = qr_householder(A) + + >>> # check that the decomposition is correct + >>> np.allclose(Q@R, A) + True + + >>> # check that Q is orthogonal + >>> np.allclose(Q@Q.T, np.eye(A.shape[0])) + True + >>> np.allclose(Q.T@Q, np.eye(A.shape[0])) + True + + >>> # check that R is upper triangular + >>> np.allclose(np.triu(R), R) + True + """ + m, n = A.shape + t = min(m, n) + Q = np.eye(m) + R = A.copy() + + for k in range(t - 1): + # select a column of modified matrix A': + x = R[k:, [k]] + # construct first basis vector + e1 = np.zeros_like(x) + e1[0] = 1.0 + # determine scaling factor + alpha = np.linalg.norm(x) + # construct vector v for Householder reflection + v = x + np.sign(x[0]) * alpha * e1 + v /= np.linalg.norm(v) + + # construct the Householder matrix + Q_k = np.eye(m - k) - 2.0 * v @ v.T + # pad with ones and zeros as necessary + Q_k = np.block([[np.eye(k), np.zeros((k, m - k))], [np.zeros((m - k, k)), Q_k]]) + + Q = Q @ Q_k.T + R = Q_k @ R + + return Q, R + + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/maths/quadratic_equations_complex_numbers.py b/python-mega-algo/maths/quadratic_equations_complex_numbers.py new file mode 100644 index 00000000..1035171e --- /dev/null +++ b/python-mega-algo/maths/quadratic_equations_complex_numbers.py @@ -0,0 +1,38 @@ +from __future__ import annotations + +from cmath import sqrt + + +def quadratic_roots(a: int, b: int, c: int) -> tuple[complex, complex]: + """ + Given the numerical coefficients a, b and c, + calculates the roots for any quadratic equation of the form ax^2 + bx + c + + >>> quadratic_roots(a=1, b=3, c=-4) + (1.0, -4.0) + >>> quadratic_roots(5, 6, 1) + (-0.2, -1.0) + >>> quadratic_roots(1, -6, 25) + ((3+4j), (3-4j)) + """ + + if a == 0: + raise ValueError("Coefficient 'a' must not be zero.") + delta = b * b - 4 * a * c + + root_1 = (-b + sqrt(delta)) / (2 * a) + root_2 = (-b - sqrt(delta)) / (2 * a) + + return ( + root_1.real if not root_1.imag else root_1, + root_2.real if not root_2.imag else root_2, + ) + + +def main(): + solution1, solution2 = quadratic_roots(a=5, b=6, c=1) + print(f"The solutions are: {solution1} and {solution2}") + + +if __name__ == "__main__": + main() diff --git a/python-mega-algo/maths/radians.py b/python-mega-algo/maths/radians.py new file mode 100644 index 00000000..465467a3 --- /dev/null +++ b/python-mega-algo/maths/radians.py @@ -0,0 +1,29 @@ +from math import pi + + +def radians(degree: float) -> float: + """ + Coverts the given angle from degrees to radians + https://en.wikipedia.org/wiki/Radian + + >>> radians(180) + 3.141592653589793 + >>> radians(92) + 1.6057029118347832 + >>> radians(274) + 4.782202150464463 + >>> radians(109.82) + 1.9167205845401725 + + >>> from math import radians as math_radians + >>> all(abs(radians(i)-math_radians(i)) <= 0.00000001 for i in range(-2, 361)) + True + """ + + return degree / (180 / pi) + + +if __name__ == "__main__": + from doctest import testmod + + testmod() diff --git a/python-mega-algo/maths/radix2_fft.py b/python-mega-algo/maths/radix2_fft.py new file mode 100644 index 00000000..b9675fa3 --- /dev/null +++ b/python-mega-algo/maths/radix2_fft.py @@ -0,0 +1,180 @@ +""" +Fast Polynomial Multiplication using radix-2 fast Fourier Transform. +""" + +import mpmath # for roots of unity +import numpy as np + + +class FFT: + """ + Fast Polynomial Multiplication using radix-2 fast Fourier Transform. + + Reference: + https://en.wikipedia.org/wiki/Cooley%E2%80%93Tukey_FFT_algorithm#The_radix-2_DIT_case + + For polynomials of degree m and n the algorithms has complexity + O(n*logn + m*logm) + + The main part of the algorithm is split in two parts: + 1) __DFT: We compute the discrete fourier transform (DFT) of A and B using a + bottom-up dynamic approach - + 2) __multiply: Once we obtain the DFT of A*B, we can similarly + invert it to obtain A*B + + The class FFT takes two polynomials A and B with complex coefficients as arguments; + The two polynomials should be represented as a sequence of coefficients starting + from the free term. Thus, for instance x + 2*x^3 could be represented as + [0,1,0,2] or (0,1,0,2). The constructor adds some zeros at the end so that the + polynomials have the same length which is a power of 2 at least the length of + their product. + + Example: + + Create two polynomials as sequences + >>> A = [0, 1, 0, 2] # x+2x^3 + >>> B = (2, 3, 4, 0) # 2+3x+4x^2 + + Create an FFT object with them + >>> x = FFT(A, B) + + Print product + >>> print(x.product) # 2x + 3x^2 + 8x^3 + 4x^4 + 6x^5 + [(-0+0j), (2+0j), (3+0j), (8+0j), (6+0j), (8+0j)] + + __str__ test + >>> print(x) + A = 0*x^0 + 1*x^1 + 2*x^0 + 3*x^2 + B = 0*x^2 + 1*x^3 + 2*x^4 + A*B = 0*x^(-0+0j) + 1*x^(2+0j) + 2*x^(3+0j) + 3*x^(8+0j) + 4*x^(6+0j) + 5*x^(8+0j) + """ + + def __init__(self, polyA=[0], polyB=[0]): + # Input as list + self.polyA = list(polyA)[:] + self.polyB = list(polyB)[:] + + # Remove leading zero coefficients + while self.polyA[-1] == 0: + self.polyA.pop() + self.len_A = len(self.polyA) + + while self.polyB[-1] == 0: + self.polyB.pop() + self.len_B = len(self.polyB) + + # Add 0 to make lengths equal a power of 2 + self.C_max_length = int( + 2 ** np.ceil(np.log2(len(self.polyA) + len(self.polyB) - 1)) + ) + + while len(self.polyA) < self.C_max_length: + self.polyA.append(0) + while len(self.polyB) < self.C_max_length: + self.polyB.append(0) + # A complex root used for the fourier transform + self.root = complex(mpmath.root(x=1, n=self.C_max_length, k=1)) + + # The product + self.product = self.__multiply() + + # Discrete fourier transform of A and B + def __DFT(self, which): + if which == "A": + dft = [[x] for x in self.polyA] + else: + dft = [[x] for x in self.polyB] + # Corner case + if len(dft) <= 1: + return dft[0] + # + next_ncol = self.C_max_length // 2 + while next_ncol > 0: + new_dft = [[] for i in range(next_ncol)] + root = self.root ** next_ncol + + # First half of next step + current_root = 1 + for j in range(self.C_max_length // (next_ncol * 2)): + for i in range(next_ncol): + new_dft[i].append(dft[i][j] + current_root * dft[i + next_ncol][j]) + current_root *= root + # Second half of next step + current_root = 1 + for j in range(self.C_max_length // (next_ncol * 2)): + for i in range(next_ncol): + new_dft[i].append(dft[i][j] - current_root * dft[i + next_ncol][j]) + current_root *= root + # Update + dft = new_dft + next_ncol = next_ncol // 2 + return dft[0] + + # multiply the DFTs of A and B and find A*B + def __multiply(self): + dftA = self.__DFT("A") + dftB = self.__DFT("B") + inverseC = [[dftA[i] * dftB[i] for i in range(self.C_max_length)]] + del dftA + del dftB + + # Corner Case + if len(inverseC[0]) <= 1: + return inverseC[0] + # Inverse DFT + next_ncol = 2 + while next_ncol <= self.C_max_length: + new_inverseC = [[] for i in range(next_ncol)] + root = self.root ** (next_ncol // 2) + current_root = 1 + # First half of next step + for j in range(self.C_max_length // next_ncol): + for i in range(next_ncol // 2): + # Even positions + new_inverseC[i].append( + ( + inverseC[i][j] + + inverseC[i][j + self.C_max_length // next_ncol] + ) + / 2 + ) + # Odd positions + new_inverseC[i + next_ncol // 2].append( + ( + inverseC[i][j] + - inverseC[i][j + self.C_max_length // next_ncol] + ) + / (2 * current_root) + ) + current_root *= root + # Update + inverseC = new_inverseC + next_ncol *= 2 + # Unpack + inverseC = [round(x[0].real, 8) + round(x[0].imag, 8) * 1j for x in inverseC] + + # Remove leading 0's + while inverseC[-1] == 0: + inverseC.pop() + return inverseC + + # Overwrite __str__ for print(); Shows A, B and A*B + def __str__(self): + A = "A = " + " + ".join( + f"{coef}*x^{i}" for coef, i in enumerate(self.polyA[: self.len_A]) + ) + B = "B = " + " + ".join( + f"{coef}*x^{i}" for coef, i in enumerate(self.polyB[: self.len_B]) + ) + C = "A*B = " + " + ".join( + f"{coef}*x^{i}" for coef, i in enumerate(self.product) + ) + + return "\n".join((A, B, C)) + + +# Unit tests +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/maths/relu.py b/python-mega-algo/maths/relu.py new file mode 100644 index 00000000..458c6bd5 --- /dev/null +++ b/python-mega-algo/maths/relu.py @@ -0,0 +1,40 @@ +""" +This script demonstrates the implementation of the ReLU function. + +It's a kind of activation function defined as the positive part of its argument in the +context of neural network. +The function takes a vector of K real numbers as input and then argmax(x, 0). +After through ReLU, the element of the vector always 0 or real number. + +Script inspired from its corresponding Wikipedia article +https://en.wikipedia.org/wiki/Rectifier_(neural_networks) +""" +from __future__ import annotations + +import numpy as np + + +def relu(vector: list[float]): + """ + Implements the relu function + + Parameters: + vector (np.array,list,tuple): A numpy array of shape (1,n) + consisting of real values or a similar list,tuple + + + Returns: + relu_vec (np.array): The input numpy array, after applying + relu. + + >>> vec = np.array([-1, 0, 5]) + >>> relu(vec) + array([0, 0, 5]) + """ + + # compare two arrays and then return element-wise maxima. + return np.maximum(0, vector) + + +if __name__ == "__main__": + print(np.array(relu([-1, 0, 5]))) # --> [0, 0, 5] diff --git a/python-mega-algo/maths/right.html b/python-mega-algo/maths/right.html new file mode 100644 index 00000000..3d8ce683 --- /dev/null +++ b/python-mega-algo/maths/right.html @@ -0,0 +1,56 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/maths + + + + + + + + +
    Folders
    <Go Back> images series
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    FileFileFileFile
    3n_plus_1.py euclidean...nce.py kth_lexic...ion.py prime_numbers.py 
    abs.py euclidean_gcd.py largest_o...ers.py prime_sie...nes.py 
    abs_max.py eulers_totient.py largest_s...sum.py pythagoras.py 
    abs_min.py euler_method.py least_com...ple.py qr_decomp...ion.py 
    add.py extended_...thm.py line_length.py quadratic...ers.py 
    aliquot_sum.py factorial...ive.py lucas_leh...est.py radians.py 
    allocatio...ber.py factorial...hon.py lucas_series.py radix2_fft.py 
    area.py factorial...ive.py matrix_ex...ion.py relu.py 
    area_unde...rve.py factors.py max_sum_s...dow.py runge_kutta.py 
    armstrong...ers.py fermat_li...rem.py median_of...ays.py segmented_sieve.py 
    average_mean.py fibonacci.py miller_rabin.py sieve_of_...nes.py 
    average_median.py fibonacci...ion.py mobius_function.py sigmoid.py 
    average_mode.py find_max.py modular_e...ial.py simpson_rule.py 
    bailey_bo...ffe.py find_max_...ion.py monte_carlo.py softmax.py 
    basic_maths.py find_min.py monte_car...ice.py square_root.py 
    binary_ex...ion.py find_min_...ion.py newton_raphson.py sum_of_ar...ies.py 
    binary_ex...n_2.py floor.py number_of...its.py sum_of_digits.py 
    binary_ex...n_3.py gamma.py numerical...ion.py sum_of_ge...ion.py 
    binary_exp_mod.py gaussian.py perfect_cube.py test_prim...eck.py 
    binomial_...ent.py greatest_...sor.py perfect_number.py trapezoid...ule.py 
    binomial_...ion.py greedy_co...nge.py perfect_square.py triplet_sum.py 
    bisection.py hardy_ram...lgo.py pi_monte_...ion.py two_pointer.py 
    ceil.py integrati...rox.py polynomia...ion.py two_sum.py 
    chudnovsk...thm.py is_square_free.py power_usi...ion.py ugly_numbers.py 
    collatz_s...nce.py jaccard_s...ity.py primelib.py volume.py 
    combinations.py kadanes.py prime_check.py zellers_c...nce.py 
    decimal_isolate.py karatsuba.py prime_factors.py __init__.py 
    entropy.py krishnamu...ber.py 
    + +

    +Folders: 3
    +Files: 110
    +Size of all files: 184211 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/maths/runge_kutta.py b/python-mega-algo/maths/runge_kutta.py new file mode 100644 index 00000000..383797da --- /dev/null +++ b/python-mega-algo/maths/runge_kutta.py @@ -0,0 +1,44 @@ +import numpy as np + + +def runge_kutta(f, y0, x0, h, x_end): + """ + Calculate the numeric solution at each step to the ODE f(x, y) using RK4 + + https://en.wikipedia.org/wiki/Runge-Kutta_methods + + Arguments: + f -- The ode as a function of x and y + y0 -- the initial value for y + x0 -- the initial value for x + h -- the stepsize + x_end -- the end value for x + + >>> # the exact solution is math.exp(x) + >>> def f(x, y): + ... return y + >>> y0 = 1 + >>> y = runge_kutta(f, y0, 0.0, 0.01, 5) + >>> y[-1] + 148.41315904125113 + """ + N = int(np.ceil((x_end - x0) / h)) + y = np.zeros((N + 1,)) + y[0] = y0 + x = x0 + + for k in range(N): + k1 = f(x, y[k]) + k2 = f(x + 0.5 * h, y[k] + 0.5 * h * k1) + k3 = f(x + 0.5 * h, y[k] + 0.5 * h * k2) + k4 = f(x + h, y[k] + h * k3) + y[k + 1] = y[k] + (1 / 6) * h * (k1 + 2 * k2 + 2 * k3 + k4) + x += h + + return y + + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/maths/segmented_sieve.py b/python-mega-algo/maths/segmented_sieve.py new file mode 100644 index 00000000..77cc4402 --- /dev/null +++ b/python-mega-algo/maths/segmented_sieve.py @@ -0,0 +1,51 @@ +"""Segmented Sieve.""" + +import math + + +def sieve(n): + """Segmented Sieve.""" + in_prime = [] + start = 2 + end = int(math.sqrt(n)) # Size of every segment + temp = [True] * (end + 1) + prime = [] + + while start <= end: + if temp[start] is True: + in_prime.append(start) + for i in range(start * start, end + 1, start): + if temp[i] is True: + temp[i] = False + start += 1 + prime += in_prime + + low = end + 1 + high = low + end - 1 + if high > n: + high = n + + while low <= n: + temp = [True] * (high - low + 1) + for each in in_prime: + + t = math.floor(low / each) * each + if t < low: + t += each + + for j in range(t, high + 1, each): + temp[j - low] = False + + for j in range(len(temp)): + if temp[j] is True: + prime.append(j + low) + + low = high + 1 + high = low + end - 1 + if high > n: + high = n + + return prime + + +print(sieve(10 ** 6)) diff --git a/python-mega-algo/maths/series/__init__.py b/python-mega-algo/maths/series/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/maths/series/arithmetic_mean.py b/python-mega-algo/maths/series/arithmetic_mean.py new file mode 100644 index 00000000..b5d64b63 --- /dev/null +++ b/python-mega-algo/maths/series/arithmetic_mean.py @@ -0,0 +1,66 @@ +""" +ARITHMETIC MEAN : https://en.wikipedia.org/wiki/Arithmetic_mean + +""" + + +def is_arithmetic_series(series: list) -> bool: + """ + checking whether the input series is arithmetic series or not + + >>> is_arithmetic_series([2, 4, 6]) + True + >>> is_arithmetic_series([3, 6, 12, 24]) + False + >>> is_arithmetic_series([1, 2, 3]) + True + """ + if len(series) == 1: + return True + common_diff = series[1] - series[0] + for index in range(len(series) - 1): + if series[index + 1] - series[index] != common_diff: + return False + return True + + +def arithmetic_mean(series: list) -> float: + """ + return the arithmetic mean of series + + >>> arithmetic_mean([2, 4, 6]) + 4.0 + >>> arithmetic_mean([3, 6, 9, 12]) + 7.5 + >>> arithmetic_mean(4) + Traceback (most recent call last): + ... + ValueError: Input series is not valid, valid series - [2, 4, 6] + >>> arithmetic_mean([4, 8, 1]) + Traceback (most recent call last): + ... + ValueError: Input list is not an arithmetic series + >>> arithmetic_mean([1, 2, 3]) + 2.0 + >>> arithmetic_mean([]) + Traceback (most recent call last): + ... + ValueError: Input list must be a non empty list + + """ + if not isinstance(series, list): + raise ValueError("Input series is not valid, valid series - [2, 4, 6]") + if len(series) == 0: + raise ValueError("Input list must be a non empty list") + if not is_arithmetic_series(series): + raise ValueError("Input list is not an arithmetic series") + answer = 0 + for val in series: + answer += val + return answer / len(series) + + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/maths/series/geometric_mean.py b/python-mega-algo/maths/series/geometric_mean.py new file mode 100644 index 00000000..50ae54ad --- /dev/null +++ b/python-mega-algo/maths/series/geometric_mean.py @@ -0,0 +1,75 @@ +""" +GEOMETRIC MEAN : https://en.wikipedia.org/wiki/Geometric_mean +""" + + +def is_geometric_series(series: list) -> bool: + """ + checking whether the input series is geometric series or not + + >>> is_geometric_series([2, 4, 8]) + True + >>> is_geometric_series([3, 6, 12, 24]) + True + >>> is_geometric_series([1, 2, 3]) + False + >>> is_geometric_series([0, 0, 3]) + False + + """ + if len(series) == 1: + return True + try: + common_ratio = series[1] / series[0] + for index in range(len(series) - 1): + if series[index + 1] / series[index] != common_ratio: + return False + except ZeroDivisionError: + return False + return True + + +def geometric_mean(series: list) -> float: + """ + return the geometric mean of series + + >>> geometric_mean([2, 4, 8]) + 3.9999999999999996 + >>> geometric_mean([3, 6, 12, 24]) + 8.48528137423857 + >>> geometric_mean([4, 8, 16]) + 7.999999999999999 + >>> geometric_mean(4) + Traceback (most recent call last): + ... + ValueError: Input series is not valid, valid series - [2, 4, 8] + >>> geometric_mean([1, 2, 3]) + Traceback (most recent call last): + ... + ValueError: Input list is not a geometric series + >>> geometric_mean([0, 2, 3]) + Traceback (most recent call last): + ... + ValueError: Input list is not a geometric series + >>> geometric_mean([]) + Traceback (most recent call last): + ... + ValueError: Input list must be a non empty list + + """ + if not isinstance(series, list): + raise ValueError("Input series is not valid, valid series - [2, 4, 8]") + if len(series) == 0: + raise ValueError("Input list must be a non empty list") + if not is_geometric_series(series): + raise ValueError("Input list is not a geometric series") + answer = 1 + for value in series: + answer *= value + return pow(answer, 1 / len(series)) + + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/maths/series/geometric_series.py b/python-mega-algo/maths/series/geometric_series.py new file mode 100644 index 00000000..d12382e6 --- /dev/null +++ b/python-mega-algo/maths/series/geometric_series.py @@ -0,0 +1,63 @@ +""" +This is a pure Python implementation of the Geometric Series algorithm +https://en.wikipedia.org/wiki/Geometric_series + +Run the doctests with the following command: +python3 -m doctest -v geometric_series.py +or +python -m doctest -v geometric_series.py +For manual testing run: +python3 geometric_series.py +""" + + +def geometric_series(nth_term: int, start_term_a: int, common_ratio_r: int) -> list: + """Pure Python implementation of Geometric Series algorithm + :param nth_term: The last term (nth term of Geometric Series) + :param start_term_a : The first term of Geometric Series + :param common_ratio_r : The common ratio between all the terms + :return: The Geometric Series starting from first term a and multiple of common + ration with first term with increase in power till last term (nth term) + Examples: + >>> geometric_series(4, 2, 2) + [2, '4.0', '8.0', '16.0'] + >>> geometric_series(4.0, 2.0, 2.0) + [2.0, '4.0', '8.0', '16.0'] + >>> geometric_series(4.1, 2.1, 2.1) + [2.1, '4.41', '9.261000000000001', '19.448100000000004'] + >>> geometric_series(4, 2, -2) + [2, '-4.0', '8.0', '-16.0'] + >>> geometric_series(4, -2, 2) + [-2, '-4.0', '-8.0', '-16.0'] + >>> geometric_series(-4, 2, 2) + [] + >>> geometric_series(0, 100, 500) + [] + >>> geometric_series(1, 1, 1) + [1] + >>> geometric_series(0, 0, 0) + [] + """ + if "" in (nth_term, start_term_a, common_ratio_r): + return "" + series = [] + power = 1 + multiple = common_ratio_r + for _ in range(int(nth_term)): + if series == []: + series.append(start_term_a) + else: + power += 1 + series.append(str(float(start_term_a) * float(multiple))) + multiple = pow(float(common_ratio_r), power) + return series + + +if __name__ == "__main__": + nth_term = input("Enter the last number (n term) of the Geometric Series") + start_term_a = input("Enter the starting term (a) of the Geometric Series") + common_ratio_r = input( + "Enter the common ratio between two terms (r) of the Geometric Series" + ) + print("Formula of Geometric Series => a + ar + ar^2 ... +ar^n") + print(geometric_series(nth_term, start_term_a, common_ratio_r)) diff --git a/python-mega-algo/maths/series/harmonic_series.py b/python-mega-algo/maths/series/harmonic_series.py new file mode 100644 index 00000000..91b59445 --- /dev/null +++ b/python-mega-algo/maths/series/harmonic_series.py @@ -0,0 +1,46 @@ +""" +This is a pure Python implementation of the Harmonic Series algorithm +https://en.wikipedia.org/wiki/Harmonic_series_(mathematics) + +For doctests run following command: +python -m doctest -v harmonic_series.py +or +python3 -m doctest -v harmonic_series.py + +For manual testing run: +python3 harmonic_series.py +""" + + +def harmonic_series(n_term: str) -> list: + """Pure Python implementation of Harmonic Series algorithm + + :param n_term: The last (nth) term of Harmonic Series + :return: The Harmonic Series starting from 1 to last (nth) term + + Examples: + >>> harmonic_series(5) + ['1', '1/2', '1/3', '1/4', '1/5'] + >>> harmonic_series(5.0) + ['1', '1/2', '1/3', '1/4', '1/5'] + >>> harmonic_series(5.1) + ['1', '1/2', '1/3', '1/4', '1/5'] + >>> harmonic_series(-5) + [] + >>> harmonic_series(0) + [] + >>> harmonic_series(1) + ['1'] + """ + if n_term == "": + return n_term + series = [] + for temp in range(int(n_term)): + series.append(f"1/{temp + 1}" if series else "1") + return series + + +if __name__ == "__main__": + nth_term = input("Enter the last number (nth term) of the Harmonic Series") + print("Formula of Harmonic Series => 1+1/2+1/3 ..... 1/n") + print(harmonic_series(nth_term)) diff --git a/python-mega-algo/maths/series/p_series.py b/python-mega-algo/maths/series/p_series.py new file mode 100644 index 00000000..04019aed --- /dev/null +++ b/python-mega-algo/maths/series/p_series.py @@ -0,0 +1,48 @@ +""" +This is a pure Python implementation of the P-Series algorithm +https://en.wikipedia.org/wiki/Harmonic_series_(mathematics)#P-series + +For doctests run following command: +python -m doctest -v p_series.py +or +python3 -m doctest -v p_series.py + +For manual testing run: +python3 p_series.py +""" + + +def p_series(nth_term: int, power: int) -> list: + """Pure Python implementation of P-Series algorithm + + :return: The P-Series starting from 1 to last (nth) term + + Examples: + >>> p_series(5, 2) + [1, '1/4', '1/9', '1/16', '1/25'] + >>> p_series(-5, 2) + [] + >>> p_series(5, -2) + [1, '1/0.25', '1/0.1111111111111111', '1/0.0625', '1/0.04'] + >>> p_series("", 1000) + '' + >>> p_series(0, 0) + [] + >>> p_series(1, 1) + [1] + """ + if nth_term == "": + return nth_term + nth_term = int(nth_term) + power = int(power) + series = [] + for temp in range(int(nth_term)): + series.append(f"1/{pow(temp + 1, int(power))}" if series else 1) + return series + + +if __name__ == "__main__": + nth_term = input("Enter the last number (nth term) of the P-Series") + power = input("Enter the power for P-Series") + print("Formula of P-Series => 1+1/2^p+1/3^p ..... 1/n^p") + print(p_series(nth_term, power)) diff --git a/python-mega-algo/maths/series/right.html b/python-mega-algo/maths/series/right.html new file mode 100644 index 00000000..5b3533b9 --- /dev/null +++ b/python-mega-algo/maths/series/right.html @@ -0,0 +1,30 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/maths/series + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + + +
    FileFileFileFile
    arithmetic_mean.py geometric...ies.py p_series.py __init__.py 
    geometric_mean.py harmonic_series.py 
    + +

    +Folders: 1
    +Files: 6
    +Size of all files: 8486 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/maths/sieve_of_eratosthenes.py b/python-mega-algo/maths/sieve_of_eratosthenes.py new file mode 100644 index 00000000..410c2601 --- /dev/null +++ b/python-mega-algo/maths/sieve_of_eratosthenes.py @@ -0,0 +1,65 @@ +""" +Sieve of Eratosthones + +The sieve of Eratosthenes is an algorithm used to find prime numbers, less than or +equal to a given value. +Illustration: +https://upload.wikimedia.org/wikipedia/commons/b/b9/Sieve_of_Eratosthenes_animation.gif +Reference: https://en.wikipedia.org/wiki/Sieve_of_Eratosthenes + +doctest provider: Bruno Simas Hadlich (https://github.com/brunohadlich) +Also thanks to Dmitry (https://github.com/LizardWizzard) for finding the problem +""" + + +import math +from typing import List + + +def prime_sieve(num: int) -> List[int]: + """ + Returns a list with all prime numbers up to n. + + >>> prime_sieve(50) + [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47] + >>> prime_sieve(25) + [2, 3, 5, 7, 11, 13, 17, 19, 23] + >>> prime_sieve(10) + [2, 3, 5, 7] + >>> prime_sieve(9) + [2, 3, 5, 7] + >>> prime_sieve(2) + [2] + >>> prime_sieve(1) + [] + """ + + if num <= 0: + raise ValueError(f"{num}: Invalid input, please enter a positive integer.") + + sieve = [True] * (num + 1) + prime = [] + start = 2 + end = int(math.sqrt(num)) + + while start <= end: + # If start is a prime + if sieve[start] is True: + prime.append(start) + + # Set multiples of start be False + for i in range(start * start, num + 1, start): + if sieve[i] is True: + sieve[i] = False + + start += 1 + + for j in range(end + 1, num + 1): + if sieve[j] is True: + prime.append(j) + + return prime + + +if __name__ == "__main__": + print(prime_sieve(int(input("Enter a positive integer: ").strip()))) diff --git a/python-mega-algo/maths/sigmoid.py b/python-mega-algo/maths/sigmoid.py new file mode 100644 index 00000000..147588e8 --- /dev/null +++ b/python-mega-algo/maths/sigmoid.py @@ -0,0 +1,39 @@ +""" +This script demonstrates the implementation of the Sigmoid function. + +The function takes a vector of K real numbers as input and then 1 / (1 + exp(-x)). +After through Sigmoid, the element of the vector mostly 0 between 1. or 1 between -1. + +Script inspired from its corresponding Wikipedia article +https://en.wikipedia.org/wiki/Sigmoid_function +""" + +import numpy as np + + +def sigmoid(vector: np.array) -> np.array: + """ + Implements the sigmoid function + + Parameters: + vector (np.array): A numpy array of shape (1,n) + consisting of real values + + Returns: + sigmoid_vec (np.array): The input numpy array, after applying + sigmoid. + + Examples: + >>> sigmoid(np.array([-1.0, 1.0, 2.0])) + array([0.26894142, 0.73105858, 0.88079708]) + + >>> sigmoid(np.array([0.0])) + array([0.5]) + """ + return 1 / (1 + np.exp(-vector)) + + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/maths/simpson_rule.py b/python-mega-algo/maths/simpson_rule.py new file mode 100644 index 00000000..d66dc39a --- /dev/null +++ b/python-mega-algo/maths/simpson_rule.py @@ -0,0 +1,51 @@ +""" +Numerical integration or quadrature for a smooth function f with known values at x_i + +This method is the classical approach of suming 'Equally Spaced Abscissas' + +method 2: +"Simpson Rule" + +""" + + +def method_2(boundary, steps): + # "Simpson Rule" + # int(f) = delta_x/2 * (b-a)/3*(f1 + 4f2 + 2f_3 + ... + fn) + h = (boundary[1] - boundary[0]) / steps + a = boundary[0] + b = boundary[1] + x_i = make_points(a, b, h) + y = 0.0 + y += (h / 3.0) * f(a) + cnt = 2 + for i in x_i: + y += (h / 3) * (4 - 2 * (cnt % 2)) * f(i) + cnt += 1 + y += (h / 3.0) * f(b) + return y + + +def make_points(a, b, h): + x = a + h + while x < (b - h): + yield x + x = x + h + + +def f(x): # enter your function here + y = (x - 0) * (x - 0) + return y + + +def main(): + a = 0.0 # Lower bound of integration + b = 1.0 # Upper bound of integration + steps = 10.0 # define number of steps or resolution + boundary = [a, b] # define boundary of integration + y = method_2(boundary, steps) + print(f"y = {y}") + + +if __name__ == "__main__": + main() diff --git a/python-mega-algo/maths/softmax.py b/python-mega-algo/maths/softmax.py new file mode 100644 index 00000000..e021a7f8 --- /dev/null +++ b/python-mega-algo/maths/softmax.py @@ -0,0 +1,56 @@ +""" +This script demonstrates the implementation of the Softmax function. + +Its a function that takes as input a vector of K real numbers, and normalizes +it into a probability distribution consisting of K probabilities proportional +to the exponentials of the input numbers. After softmax, the elements of the +vector always sum up to 1. + +Script inspired from its corresponding Wikipedia article +https://en.wikipedia.org/wiki/Softmax_function +""" + +import numpy as np + + +def softmax(vector): + """ + Implements the softmax function + + Parameters: + vector (np.array,list,tuple): A numpy array of shape (1,n) + consisting of real values or a similar list,tuple + + + Returns: + softmax_vec (np.array): The input numpy array after applying + softmax. + + The softmax vector adds up to one. We need to ceil to mitigate for + precision + >>> np.ceil(np.sum(softmax([1,2,3,4]))) + 1.0 + + >>> vec = np.array([5,5]) + >>> softmax(vec) + array([0.5, 0.5]) + + >>> softmax([0]) + array([1.]) + """ + + # Calculate e^x for each x in your vector where e is Euler's + # number (approximately 2.718) + exponentVector = np.exp(vector) + + # Add up the all the exponentials + sumOfExponents = np.sum(exponentVector) + + # Divide every exponent by the sum of all exponents + softmax_vector = exponentVector / sumOfExponents + + return softmax_vector + + +if __name__ == "__main__": + print(softmax((0,))) diff --git a/python-mega-algo/maths/square_root.py b/python-mega-algo/maths/square_root.py new file mode 100644 index 00000000..b324c723 --- /dev/null +++ b/python-mega-algo/maths/square_root.py @@ -0,0 +1,64 @@ +import math + + +def fx(x: float, a: float) -> float: + return math.pow(x, 2) - a + + +def fx_derivative(x: float) -> float: + return 2 * x + + +def get_initial_point(a: float) -> float: + start = 2.0 + + while start <= a: + start = math.pow(start, 2) + + return start + + +def square_root_iterative( + a: float, max_iter: int = 9999, tolerance: float = 0.00000000000001 +) -> float: + """ + Square root is aproximated using Newtons method. + https://en.wikipedia.org/wiki/Newton%27s_method + + >>> all(abs(square_root_iterative(i)-math.sqrt(i)) <= .00000000000001 + ... for i in range(500)) + True + + >>> square_root_iterative(-1) + Traceback (most recent call last): + ... + ValueError: math domain error + + >>> square_root_iterative(4) + 2.0 + + >>> square_root_iterative(3.2) + 1.788854381999832 + + >>> square_root_iterative(140) + 11.832159566199232 + """ + + if a < 0: + raise ValueError("math domain error") + + value = get_initial_point(a) + + for i in range(max_iter): + prev_value = value + value = value - fx(value, a) / fx_derivative(value) + if abs(prev_value - value) < tolerance: + return value + + return value + + +if __name__ == "__main__": + from doctest import testmod + + testmod() diff --git a/python-mega-algo/maths/sum_of_arithmetic_series.py b/python-mega-algo/maths/sum_of_arithmetic_series.py new file mode 100644 index 00000000..74eef0f1 --- /dev/null +++ b/python-mega-algo/maths/sum_of_arithmetic_series.py @@ -0,0 +1,23 @@ +# DarkCoder +def sum_of_series(first_term, common_diff, num_of_terms): + """ + Find the sum of n terms in an arithmetic progression. + + >>> sum_of_series(1, 1, 10) + 55.0 + >>> sum_of_series(1, 10, 100) + 49600.0 + """ + sum = (num_of_terms / 2) * (2 * first_term + (num_of_terms - 1) * common_diff) + # formula for sum of series + return sum + + +def main(): + print(sum_of_series(1, 1, 10)) + + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/maths/sum_of_digits.py b/python-mega-algo/maths/sum_of_digits.py new file mode 100644 index 00000000..64da00d4 --- /dev/null +++ b/python-mega-algo/maths/sum_of_digits.py @@ -0,0 +1,149 @@ +from timeit import timeit + + +def sum_of_digits(n: int) -> int: + """ + Find the sum of digits of a number. + + >>> sum_of_digits(12345) + 15 + >>> sum_of_digits(123) + 6 + >>> sum_of_digits(-123) + 6 + >>> sum_of_digits(0) + 0 + """ + n = -n if n < 0 else n + res = 0 + while n > 0: + res += n % 10 + n = n // 10 + return res + + +def sum_of_digits_recursion(n: int) -> int: + """ + Find the sum of digits of a number using recursion + + >>> sum_of_digits_recursion(12345) + 15 + >>> sum_of_digits_recursion(123) + 6 + >>> sum_of_digits_recursion(-123) + 6 + >>> sum_of_digits_recursion(0) + 0 + """ + n = -n if n < 0 else n + return n if n < 10 else n % 10 + sum_of_digits(n // 10) + + +def sum_of_digits_compact(n: int) -> int: + """ + Find the sum of digits of a number + + >>> sum_of_digits_compact(12345) + 15 + >>> sum_of_digits_compact(123) + 6 + >>> sum_of_digits_compact(-123) + 6 + >>> sum_of_digits_compact(0) + 0 + """ + return sum(int(c) for c in str(abs(n))) + + +def benchmark() -> None: + """ + Benchmark code for comparing 3 functions, + with 3 different length int values. + """ + print("\nFor small_num = ", small_num, ":") + print( + "> sum_of_digits()", + "\t\tans =", + sum_of_digits(small_num), + "\ttime =", + timeit("z.sum_of_digits(z.small_num)", setup="import __main__ as z"), + "seconds", + ) + print( + "> sum_of_digits_recursion()", + "\tans =", + sum_of_digits_recursion(small_num), + "\ttime =", + timeit("z.sum_of_digits_recursion(z.small_num)", setup="import __main__ as z"), + "seconds", + ) + print( + "> sum_of_digits_compact()", + "\tans =", + sum_of_digits_compact(small_num), + "\ttime =", + timeit("z.sum_of_digits_compact(z.small_num)", setup="import __main__ as z"), + "seconds", + ) + + print("\nFor medium_num = ", medium_num, ":") + print( + "> sum_of_digits()", + "\t\tans =", + sum_of_digits(medium_num), + "\ttime =", + timeit("z.sum_of_digits(z.medium_num)", setup="import __main__ as z"), + "seconds", + ) + print( + "> sum_of_digits_recursion()", + "\tans =", + sum_of_digits_recursion(medium_num), + "\ttime =", + timeit("z.sum_of_digits_recursion(z.medium_num)", setup="import __main__ as z"), + "seconds", + ) + print( + "> sum_of_digits_compact()", + "\tans =", + sum_of_digits_compact(medium_num), + "\ttime =", + timeit("z.sum_of_digits_compact(z.medium_num)", setup="import __main__ as z"), + "seconds", + ) + + print("\nFor large_num = ", large_num, ":") + print( + "> sum_of_digits()", + "\t\tans =", + sum_of_digits(large_num), + "\ttime =", + timeit("z.sum_of_digits(z.large_num)", setup="import __main__ as z"), + "seconds", + ) + print( + "> sum_of_digits_recursion()", + "\tans =", + sum_of_digits_recursion(large_num), + "\ttime =", + timeit("z.sum_of_digits_recursion(z.large_num)", setup="import __main__ as z"), + "seconds", + ) + print( + "> sum_of_digits_compact()", + "\tans =", + sum_of_digits_compact(large_num), + "\ttime =", + timeit("z.sum_of_digits_compact(z.large_num)", setup="import __main__ as z"), + "seconds", + ) + + +if __name__ == "__main__": + small_num = 262144 + medium_num = 1125899906842624 + large_num = 1267650600228229401496703205376 + benchmark() + import doctest + + doctest.testmod() diff --git a/python-mega-algo/maths/sum_of_geometric_progression.py b/python-mega-algo/maths/sum_of_geometric_progression.py new file mode 100644 index 00000000..2fb158d3 --- /dev/null +++ b/python-mega-algo/maths/sum_of_geometric_progression.py @@ -0,0 +1,28 @@ +def sum_of_geometric_progression( + first_term: int, common_ratio: int, num_of_terms: int +) -> float: + """ " + Return the sum of n terms in a geometric progression. + >>> sum_of_geometric_progression(1, 2, 10) + 1023.0 + >>> sum_of_geometric_progression(1, 10, 5) + 11111.0 + >>> sum_of_geometric_progression(0, 2, 10) + 0.0 + >>> sum_of_geometric_progression(1, 0, 10) + 1.0 + >>> sum_of_geometric_progression(1, 2, 0) + -0.0 + >>> sum_of_geometric_progression(-1, 2, 10) + -1023.0 + >>> sum_of_geometric_progression(1, -2, 10) + -341.0 + >>> sum_of_geometric_progression(1, 2, -10) + -0.9990234375 + """ + if common_ratio == 1: + # Formula for sum if common ratio is 1 + return num_of_terms * first_term + + # Formula for finding sum of n terms of a GeometricProgression + return (first_term / (1 - common_ratio)) * (1 - common_ratio ** num_of_terms) diff --git a/python-mega-algo/maths/test_prime_check.py b/python-mega-algo/maths/test_prime_check.py new file mode 100644 index 00000000..b6389684 --- /dev/null +++ b/python-mega-algo/maths/test_prime_check.py @@ -0,0 +1,8 @@ +""" +Minimalist file that allows pytest to find and run the Test unittest. For details, see: +http://doc.pytest.org/en/latest/goodpractices.html#conventions-for-python-test-discovery +""" + +from .prime_check import Test + +Test() diff --git a/python-mega-algo/maths/trapezoidal_rule.py b/python-mega-algo/maths/trapezoidal_rule.py new file mode 100644 index 00000000..9a4ddc8a --- /dev/null +++ b/python-mega-algo/maths/trapezoidal_rule.py @@ -0,0 +1,50 @@ +""" +Numerical integration or quadrature for a smooth function f with known values at x_i + +This method is the classical approach of suming 'Equally Spaced Abscissas' + +method 1: +"extended trapezoidal rule" + +""" + + +def method_1(boundary, steps): + # "extended trapezoidal rule" + # int(f) = dx/2 * (f1 + 2f2 + ... + fn) + h = (boundary[1] - boundary[0]) / steps + a = boundary[0] + b = boundary[1] + x_i = make_points(a, b, h) + y = 0.0 + y += (h / 2.0) * f(a) + for i in x_i: + # print(i) + y += h * f(i) + y += (h / 2.0) * f(b) + return y + + +def make_points(a, b, h): + x = a + h + while x < (b - h): + yield x + x = x + h + + +def f(x): # enter your function here + y = (x - 0) * (x - 0) + return y + + +def main(): + a = 0.0 # Lower bound of integration + b = 1.0 # Upper bound of integration + steps = 10.0 # define number of steps or resolution + boundary = [a, b] # define boundary of integration + y = method_1(boundary, steps) + print(f"y = {y}") + + +if __name__ == "__main__": + main() diff --git a/python-mega-algo/maths/triplet_sum.py b/python-mega-algo/maths/triplet_sum.py new file mode 100644 index 00000000..22fab17d --- /dev/null +++ b/python-mega-algo/maths/triplet_sum.py @@ -0,0 +1,89 @@ +""" +Given an array of integers and another integer target, +we are required to find a triplet from the array such that it's sum is equal to +the target. +""" +from __future__ import annotations + +from itertools import permutations +from random import randint +from timeit import repeat + + +def make_dataset() -> tuple[list[int], int]: + arr = [randint(-1000, 1000) for i in range(10)] + r = randint(-5000, 5000) + return (arr, r) + + +dataset = make_dataset() + + +def triplet_sum1(arr: list[int], target: int) -> tuple[int, int, int]: + """ + Returns a triplet in the array with sum equal to target, + else (0, 0, 0). + >>> triplet_sum1([13, 29, 7, 23, 5], 35) + (5, 7, 23) + >>> triplet_sum1([37, 9, 19, 50, 44], 65) + (9, 19, 37) + >>> arr = [6, 47, 27, 1, 15] + >>> target = 11 + >>> triplet_sum1(arr, target) + (0, 0, 0) + """ + for triplet in permutations(arr, 3): + if sum(triplet) == target: + return tuple(sorted(triplet)) + return (0, 0, 0) + + +def triplet_sum2(arr: list[int], target: int) -> tuple[int, int, int]: + """ + Returns a triplet in the array with sum equal to target, + else (0, 0, 0). + >>> triplet_sum2([13, 29, 7, 23, 5], 35) + (5, 7, 23) + >>> triplet_sum2([37, 9, 19, 50, 44], 65) + (9, 19, 37) + >>> arr = [6, 47, 27, 1, 15] + >>> target = 11 + >>> triplet_sum2(arr, target) + (0, 0, 0) + """ + arr.sort() + n = len(arr) + for i in range(n - 1): + left, right = i + 1, n - 1 + while left < right: + if arr[i] + arr[left] + arr[right] == target: + return (arr[i], arr[left], arr[right]) + elif arr[i] + arr[left] + arr[right] < target: + left += 1 + elif arr[i] + arr[left] + arr[right] > target: + right -= 1 + return (0, 0, 0) + + +def solution_times() -> tuple[float, float]: + setup_code = """ +from __main__ import dataset, triplet_sum1, triplet_sum2 +""" + test_code1 = """ +triplet_sum1(*dataset) +""" + test_code2 = """ +triplet_sum2(*dataset) +""" + times1 = repeat(setup=setup_code, stmt=test_code1, repeat=5, number=10000) + times2 = repeat(setup=setup_code, stmt=test_code2, repeat=5, number=10000) + return (min(times1), min(times2)) + + +if __name__ == "__main__": + from doctest import testmod + + testmod() + times = solution_times() + print(f"The time for naive implementation is {times[0]}.") + print(f"The time for optimized implementation is {times[1]}.") diff --git a/python-mega-algo/maths/two_pointer.py b/python-mega-algo/maths/two_pointer.py new file mode 100644 index 00000000..ff234cdd --- /dev/null +++ b/python-mega-algo/maths/two_pointer.py @@ -0,0 +1,61 @@ +""" +Given a sorted array of integers, return indices of the two numbers such +that they add up to a specific target using the two pointers technique. + +You may assume that each input would have exactly one solution, and you +may not use the same element twice. + +This is an alternative solution of the two-sum problem, which uses a +map to solve the problem. Hence can not solve the issue if there is a +constraint not use the same index twice. [1] + +Example: +Given nums = [2, 7, 11, 15], target = 9, + +Because nums[0] + nums[1] = 2 + 7 = 9, +return [0, 1]. + +[1]: https://github.com/TheAlgorithms/Python/blob/master/other/two_sum.py +""" +from __future__ import annotations + + +def two_pointer(nums: list[int], target: int) -> list[int]: + """ + >>> two_pointer([2, 7, 11, 15], 9) + [0, 1] + >>> two_pointer([2, 7, 11, 15], 17) + [0, 3] + >>> two_pointer([2, 7, 11, 15], 18) + [1, 2] + >>> two_pointer([2, 7, 11, 15], 26) + [2, 3] + >>> two_pointer([1, 3, 3], 6) + [1, 2] + >>> two_pointer([2, 7, 11, 15], 8) + [] + >>> two_pointer([3 * i for i in range(10)], 19) + [] + >>> two_pointer([1, 2, 3], 6) + [] + """ + i = 0 + j = len(nums) - 1 + + while i < j: + + if nums[i] + nums[j] == target: + return [i, j] + elif nums[i] + nums[j] < target: + i = i + 1 + else: + j = j - 1 + + return [] + + +if __name__ == "__main__": + import doctest + + doctest.testmod() + print(f"{two_pointer([2, 7, 11, 15], 9) = }") diff --git a/python-mega-algo/maths/two_sum.py b/python-mega-algo/maths/two_sum.py new file mode 100644 index 00000000..5209acbc --- /dev/null +++ b/python-mega-algo/maths/two_sum.py @@ -0,0 +1,47 @@ +""" +Given an array of integers, return indices of the two numbers such that they add up to +a specific target. + +You may assume that each input would have exactly one solution, and you may not use the +same element twice. + +Example: +Given nums = [2, 7, 11, 15], target = 9, + +Because nums[0] + nums[1] = 2 + 7 = 9, +return [0, 1]. +""" +from __future__ import annotations + + +def two_sum(nums: list[int], target: int) -> list[int]: + """ + >>> two_sum([2, 7, 11, 15], 9) + [0, 1] + >>> two_sum([15, 2, 11, 7], 13) + [1, 2] + >>> two_sum([2, 7, 11, 15], 17) + [0, 3] + >>> two_sum([7, 15, 11, 2], 18) + [0, 2] + >>> two_sum([2, 7, 11, 15], 26) + [2, 3] + >>> two_sum([2, 7, 11, 15], 8) + [] + >>> two_sum([3 * i for i in range(10)], 19) + [] + """ + chk_map = {} + for index, val in enumerate(nums): + compl = target - val + if compl in chk_map: + return [chk_map[compl], index] + chk_map[val] = index + return [] + + +if __name__ == "__main__": + import doctest + + doctest.testmod() + print(f"{two_sum([2, 7, 11, 15], 9) = }") diff --git a/python-mega-algo/maths/ugly_numbers.py b/python-mega-algo/maths/ugly_numbers.py new file mode 100644 index 00000000..c5737f7d --- /dev/null +++ b/python-mega-algo/maths/ugly_numbers.py @@ -0,0 +1,54 @@ +""" +Ugly numbers are numbers whose only prime factors are 2, 3 or 5. The sequence +1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 15, … shows the first 11 ugly numbers. By convention, +1 is included. +Given an integer n, we have to find the nth ugly number. + +For more details, refer this article +https://www.geeksforgeeks.org/ugly-numbers/ +""" + + +def ugly_numbers(n: int) -> int: + """ + Returns the nth ugly number. + >>> ugly_numbers(100) + 1536 + >>> ugly_numbers(0) + 1 + >>> ugly_numbers(20) + 36 + >>> ugly_numbers(-5) + 1 + >>> ugly_numbers(-5.5) + Traceback (most recent call last): + ... + TypeError: 'float' object cannot be interpreted as an integer + """ + ugly_nums = [1] + + i2, i3, i5 = 0, 0, 0 + next_2 = ugly_nums[i2] * 2 + next_3 = ugly_nums[i3] * 3 + next_5 = ugly_nums[i5] * 5 + + for i in range(1, n): + next_num = min(next_2, next_3, next_5) + ugly_nums.append(next_num) + if next_num == next_2: + i2 += 1 + next_2 = ugly_nums[i2] * 2 + if next_num == next_3: + i3 += 1 + next_3 = ugly_nums[i3] * 3 + if next_num == next_5: + i5 += 1 + next_5 = ugly_nums[i5] * 5 + return ugly_nums[-1] + + +if __name__ == "__main__": + from doctest import testmod + + testmod(verbose=True) + print(f"{ugly_numbers(200) = }") diff --git a/python-mega-algo/maths/volume.py b/python-mega-algo/maths/volume.py new file mode 100644 index 00000000..41d2331d --- /dev/null +++ b/python-mega-algo/maths/volume.py @@ -0,0 +1,132 @@ +""" +Find Volumes of Various Shapes. + +Wikipedia reference: https://en.wikipedia.org/wiki/Volume +""" +from math import pi, pow +from typing import Union + + +def vol_cube(side_length: Union[int, float]) -> float: + """ + Calculate the Volume of a Cube. + + >>> vol_cube(1) + 1.0 + >>> vol_cube(3) + 27.0 + """ + return pow(side_length, 3) + + +def vol_cuboid(width: float, height: float, length: float) -> float: + """ + Calculate the Volume of a Cuboid. + :return multiple of width, length and height + + >>> vol_cuboid(1, 1, 1) + 1.0 + >>> vol_cuboid(1, 2, 3) + 6.0 + """ + return float(width * height * length) + + +def vol_cone(area_of_base: float, height: float) -> float: + """ + Calculate the Volume of a Cone. + + Wikipedia reference: https://en.wikipedia.org/wiki/Cone + :return (1/3) * area_of_base * height + + >>> vol_cone(10, 3) + 10.0 + >>> vol_cone(1, 1) + 0.3333333333333333 + """ + return area_of_base * height / 3.0 + + +def vol_right_circ_cone(radius: float, height: float) -> float: + """ + Calculate the Volume of a Right Circular Cone. + + Wikipedia reference: https://en.wikipedia.org/wiki/Cone + :return (1/3) * pi * radius^2 * height + + >>> vol_right_circ_cone(2, 3) + 12.566370614359172 + """ + return pi * pow(radius, 2) * height / 3.0 + + +def vol_prism(area_of_base: float, height: float) -> float: + """ + Calculate the Volume of a Prism. + Wikipedia reference: https://en.wikipedia.org/wiki/Prism_(geometry) + :return V = Bh + + >>> vol_prism(10, 2) + 20.0 + >>> vol_prism(11, 1) + 11.0 + """ + return float(area_of_base * height) + + +def vol_pyramid(area_of_base: float, height: float) -> float: + """ + Calculate the Volume of a Pyramid. + Wikipedia reference: https://en.wikipedia.org/wiki/Pyramid_(geometry) + :return (1/3) * Bh + + >>> vol_pyramid(10, 3) + 10.0 + >>> vol_pyramid(1.5, 3) + 1.5 + """ + return area_of_base * height / 3.0 + + +def vol_sphere(radius: float) -> float: + """ + Calculate the Volume of a Sphere. + Wikipedia reference: https://en.wikipedia.org/wiki/Sphere + :return (4/3) * pi * r^3 + + >>> vol_sphere(5) + 523.5987755982989 + >>> vol_sphere(1) + 4.1887902047863905 + """ + return 4 / 3 * pi * pow(radius, 3) + + +def vol_circular_cylinder(radius: float, height: float) -> float: + """Calculate the Volume of a Circular Cylinder. + Wikipedia reference: https://en.wikipedia.org/wiki/Cylinder + :return pi * radius^2 * height + + >>> vol_circular_cylinder(1, 1) + 3.141592653589793 + >>> vol_circular_cylinder(4, 3) + 150.79644737231007 + """ + return pi * pow(radius, 2) * height + + +def main(): + """Print the Results of Various Volume Calculations.""" + print("Volumes:") + print("Cube: " + str(vol_cube(2))) # = 8 + print("Cuboid: " + str(vol_cuboid(2, 2, 2))) # = 8 + print("Cone: " + str(vol_cone(2, 2))) # ~= 1.33 + print("Right Circular Cone: " + str(vol_right_circ_cone(2, 2))) # ~= 8.38 + print("Prism: " + str(vol_prism(2, 2))) # = 4 + print("Pyramid: " + str(vol_pyramid(2, 2))) # ~= 1.33 + print("Sphere: " + str(vol_sphere(2))) # ~= 33.5 + print("Circular Cylinder: " + str(vol_circular_cylinder(2, 2))) # ~= 25.1 + + +if __name__ == "__main__": + main() diff --git a/python-mega-algo/maths/zellers_congruence.py b/python-mega-algo/maths/zellers_congruence.py new file mode 100644 index 00000000..2d4a22a0 --- /dev/null +++ b/python-mega-algo/maths/zellers_congruence.py @@ -0,0 +1,158 @@ +import argparse +import datetime + + +def zeller(date_input: str) -> str: + + """ + Zellers Congruence Algorithm + Find the day of the week for nearly any Gregorian or Julian calendar date + + >>> zeller('01-31-2010') + 'Your date 01-31-2010, is a Sunday!' + + Validate out of range month + >>> zeller('13-31-2010') + Traceback (most recent call last): + ... + ValueError: Month must be between 1 - 12 + >>> zeller('.2-31-2010') + Traceback (most recent call last): + ... + ValueError: invalid literal for int() with base 10: '.2' + + Validate out of range date: + >>> zeller('01-33-2010') + Traceback (most recent call last): + ... + ValueError: Date must be between 1 - 31 + >>> zeller('01-.4-2010') + Traceback (most recent call last): + ... + ValueError: invalid literal for int() with base 10: '.4' + + Validate second separator: + >>> zeller('01-31*2010') + Traceback (most recent call last): + ... + ValueError: Date separator must be '-' or '/' + + Validate first separator: + >>> zeller('01^31-2010') + Traceback (most recent call last): + ... + ValueError: Date separator must be '-' or '/' + + Validate out of range year: + >>> zeller('01-31-8999') + Traceback (most recent call last): + ... + ValueError: Year out of range. There has to be some sort of limit...right? + + Test null input: + >>> zeller() + Traceback (most recent call last): + ... + TypeError: zeller() missing 1 required positional argument: 'date_input' + + Test length of date_input: + >>> zeller('') + Traceback (most recent call last): + ... + ValueError: Must be 10 characters long + >>> zeller('01-31-19082939') + Traceback (most recent call last): + ... + ValueError: Must be 10 characters long""" + + # Days of the week for response + days = { + "0": "Sunday", + "1": "Monday", + "2": "Tuesday", + "3": "Wednesday", + "4": "Thursday", + "5": "Friday", + "6": "Saturday", + } + + convert_datetime_days = {0: 1, 1: 2, 2: 3, 3: 4, 4: 5, 5: 6, 6: 0} + + # Validate + if not 0 < len(date_input) < 11: + raise ValueError("Must be 10 characters long") + + # Get month + m: int = int(date_input[0] + date_input[1]) + # Validate + if not 0 < m < 13: + raise ValueError("Month must be between 1 - 12") + + sep_1: str = date_input[2] + # Validate + if sep_1 not in ["-", "/"]: + raise ValueError("Date separator must be '-' or '/'") + + # Get day + d: int = int(date_input[3] + date_input[4]) + # Validate + if not 0 < d < 32: + raise ValueError("Date must be between 1 - 31") + + # Get second separator + sep_2: str = date_input[5] + # Validate + if sep_2 not in ["-", "/"]: + raise ValueError("Date separator must be '-' or '/'") + + # Get year + y: int = int(date_input[6] + date_input[7] + date_input[8] + date_input[9]) + # Arbitrary year range + if not 45 < y < 8500: + raise ValueError( + "Year out of range. There has to be some sort of limit...right?" + ) + + # Get datetime obj for validation + dt_ck = datetime.date(int(y), int(m), int(d)) + + # Start math + if m <= 2: + y = y - 1 + m = m + 12 + # maths var + c: int = int(str(y)[:2]) + k: int = int(str(y)[2:]) + t: int = int(2.6 * m - 5.39) + u: int = int(c / 4) + v: int = int(k / 4) + x: int = int(d + k) + z: int = int(t + u + v + x) + w: int = int(z - (2 * c)) + f: int = round(w % 7) + # End math + + # Validate math + if f != convert_datetime_days[dt_ck.weekday()]: + raise AssertionError("The date was evaluated incorrectly. Contact developer.") + + # Response + response: str = f"Your date {date_input}, is a {days[str(f)]}!" + return response + + +if __name__ == "__main__": + import doctest + + doctest.testmod() + parser = argparse.ArgumentParser( + description=( + "Find out what day of the week nearly any date is or was. Enter " + "date as a string in the mm-dd-yyyy or mm/dd/yyyy format" + ) + ) + parser.add_argument( + "date_input", type=str, help="Date as a string (mm-dd-yyyy or mm/dd/yyyy)" + ) + args = parser.parse_args() + zeller(args.date_input) diff --git a/python-mega-algo/matrix/__init__.py b/python-mega-algo/matrix/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/matrix/count_islands_in_matrix.py b/python-mega-algo/matrix/count_islands_in_matrix.py new file mode 100644 index 00000000..ad9c67fb --- /dev/null +++ b/python-mega-algo/matrix/count_islands_in_matrix.py @@ -0,0 +1,36 @@ +# An island in matrix is a group of linked areas, all having the same value. +# This code counts number of islands in a given matrix, with including diagonal +# connections. + + +class matrix: # Public class to implement a graph + def __init__(self, row: int, col: int, graph: list): + self.ROW = row + self.COL = col + self.graph = graph + + def is_safe(self, i, j, visited) -> bool: + return ( + 0 <= i < self.ROW + and 0 <= j < self.COL + and not visited[i][j] + and self.graph[i][j] + ) + + def diffs(self, i, j, visited): # Checking all 8 elements surrounding nth element + rowNbr = [-1, -1, -1, 0, 0, 1, 1, 1] # Coordinate order + colNbr = [-1, 0, 1, -1, 1, -1, 0, 1] + visited[i][j] = True # Make those cells visited + for k in range(8): + if self.is_safe(i + rowNbr[k], j + colNbr[k], visited): + self.diffs(i + rowNbr[k], j + colNbr[k], visited) + + def count_islands(self) -> int: # And finally, count all islands. + visited = [[False for j in range(self.COL)] for i in range(self.ROW)] + count = 0 + for i in range(self.ROW): + for j in range(self.COL): + if visited[i][j] is False and self.graph[i][j] == 1: + self.diffs(i, j, visited) + count += 1 + return count diff --git a/python-mega-algo/matrix/inverse_of_matrix.py b/python-mega-algo/matrix/inverse_of_matrix.py new file mode 100644 index 00000000..f7020e83 --- /dev/null +++ b/python-mega-algo/matrix/inverse_of_matrix.py @@ -0,0 +1,40 @@ +from __future__ import annotations + +from decimal import Decimal + + +def inverse_of_matrix(matrix: list[list[float]]) -> list[list[float]]: + """ + A matrix multiplied with its inverse gives the identity matrix. + This function finds the inverse of a 2x2 matrix. + If the determinant of a matrix is 0, its inverse does not exist. + + Sources for fixing inaccurate float arithmetic: + https://stackoverflow.com/questions/6563058/how-do-i-use-accurate-float-arithmetic-in-python + https://docs.python.org/3/library/decimal.html + + >>> inverse_of_matrix([[2, 5], [2, 0]]) + [[0.0, 0.5], [0.2, -0.2]] + >>> inverse_of_matrix([[2.5, 5], [1, 2]]) + Traceback (most recent call last): + ... + ValueError: This matrix has no inverse. + >>> inverse_of_matrix([[12, -16], [-9, 0]]) + [[0.0, -0.1111111111111111], [-0.0625, -0.08333333333333333]] + >>> inverse_of_matrix([[12, 3], [16, 8]]) + [[0.16666666666666666, -0.0625], [-0.3333333333333333, 0.25]] + >>> inverse_of_matrix([[10, 5], [3, 2.5]]) + [[0.25, -0.5], [-0.3, 1.0]] + """ + + D = Decimal # An abbreviation to be conciseness + # Calculate the determinant of the matrix + determinant = D(matrix[0][0]) * D(matrix[1][1]) - D(matrix[1][0]) * D(matrix[0][1]) + if determinant == 0: + raise ValueError("This matrix has no inverse.") + # Creates a copy of the matrix with swapped positions of the elements + swapped_matrix = [[0.0, 0.0], [0.0, 0.0]] + swapped_matrix[0][0], swapped_matrix[1][1] = matrix[1][1], matrix[0][0] + swapped_matrix[1][0], swapped_matrix[0][1] = -matrix[1][0], -matrix[0][1] + # Calculate the inverse of the matrix + return [[float(D(n) / determinant) or 0.0 for n in row] for row in swapped_matrix] diff --git a/python-mega-algo/matrix/matrix_class.py b/python-mega-algo/matrix/matrix_class.py new file mode 100644 index 00000000..cd3c752d --- /dev/null +++ b/python-mega-algo/matrix/matrix_class.py @@ -0,0 +1,358 @@ +# An OOP approach to representing and manipulating matrices + + +class Matrix: + """ + Matrix object generated from a 2D array where each element is an array representing + a row. + Rows can contain type int or float. + Common operations and information available. + >>> rows = [ + ... [1, 2, 3], + ... [4, 5, 6], + ... [7, 8, 9] + ... ] + >>> matrix = Matrix(rows) + >>> print(matrix) + [[1. 2. 3.] + [4. 5. 6.] + [7. 8. 9.]] + + Matrix rows and columns are available as 2D arrays + >>> print(matrix.rows) + [[1, 2, 3], [4, 5, 6], [7, 8, 9]] + >>> print(matrix.columns()) + [[1, 4, 7], [2, 5, 8], [3, 6, 9]] + + Order is returned as a tuple + >>> matrix.order + (3, 3) + + Squareness and invertability are represented as bool + >>> matrix.is_square + True + >>> matrix.is_invertable() + False + + Identity, Minors, Cofactors and Adjugate are returned as Matrices. Inverse can be + a Matrix or Nonetype + >>> print(matrix.identity()) + [[1. 0. 0.] + [0. 1. 0.] + [0. 0. 1.]] + >>> print(matrix.minors()) + [[-3. -6. -3.] + [-6. -12. -6.] + [-3. -6. -3.]] + >>> print(matrix.cofactors()) + [[-3. 6. -3.] + [6. -12. 6.] + [-3. 6. -3.]] + >>> # won't be apparent due to the nature of the cofactor matrix + >>> print(matrix.adjugate()) + [[-3. 6. -3.] + [6. -12. 6.] + [-3. 6. -3.]] + >>> print(matrix.inverse()) + None + + Determinant is an int, float, or Nonetype + >>> matrix.determinant() + 0 + + Negation, scalar multiplication, addition, subtraction, multiplication and + exponentiation are available and all return a Matrix + >>> print(-matrix) + [[-1. -2. -3.] + [-4. -5. -6.] + [-7. -8. -9.]] + >>> matrix2 = matrix * 3 + >>> print(matrix2) + [[3. 6. 9.] + [12. 15. 18.] + [21. 24. 27.]] + >>> print(matrix + matrix2) + [[4. 8. 12.] + [16. 20. 24.] + [28. 32. 36.]] + >>> print(matrix - matrix2) + [[-2. -4. -6.] + [-8. -10. -12.] + [-14. -16. -18.]] + >>> print(matrix ** 3) + [[468. 576. 684.] + [1062. 1305. 1548.] + [1656. 2034. 2412.]] + + Matrices can also be modified + >>> matrix.add_row([10, 11, 12]) + >>> print(matrix) + [[1. 2. 3.] + [4. 5. 6.] + [7. 8. 9.] + [10. 11. 12.]] + >>> matrix2.add_column([8, 16, 32]) + >>> print(matrix2) + [[3. 6. 9. 8.] + [12. 15. 18. 16.] + [21. 24. 27. 32.]] + >>> print(matrix * matrix2) + [[90. 108. 126. 136.] + [198. 243. 288. 304.] + [306. 378. 450. 472.] + [414. 513. 612. 640.]] + + """ + + def __init__(self, rows): + error = TypeError( + "Matrices must be formed from a list of zero or more lists containing at " + "least one and the same number of values, each of which must be of type " + "int or float." + ) + if len(rows) != 0: + cols = len(rows[0]) + if cols == 0: + raise error + for row in rows: + if len(row) != cols: + raise error + for value in row: + if not isinstance(value, (int, float)): + raise error + self.rows = rows + else: + self.rows = [] + + # MATRIX INFORMATION + def columns(self): + return [[row[i] for row in self.rows] for i in range(len(self.rows[0]))] + + @property + def num_rows(self): + return len(self.rows) + + @property + def num_columns(self): + return len(self.rows[0]) + + @property + def order(self): + return (self.num_rows, self.num_columns) + + @property + def is_square(self): + return self.order[0] == self.order[1] + + def identity(self): + values = [ + [0 if column_num != row_num else 1 for column_num in range(self.num_rows)] + for row_num in range(self.num_rows) + ] + return Matrix(values) + + def determinant(self): + if not self.is_square: + return None + if self.order == (0, 0): + return 1 + if self.order == (1, 1): + return self.rows[0][0] + if self.order == (2, 2): + return (self.rows[0][0] * self.rows[1][1]) - ( + self.rows[0][1] * self.rows[1][0] + ) + else: + return sum( + self.rows[0][column] * self.cofactors().rows[0][column] + for column in range(self.num_columns) + ) + + def is_invertable(self): + return bool(self.determinant()) + + def get_minor(self, row, column): + values = [ + [ + self.rows[other_row][other_column] + for other_column in range(self.num_columns) + if other_column != column + ] + for other_row in range(self.num_rows) + if other_row != row + ] + return Matrix(values).determinant() + + def get_cofactor(self, row, column): + if (row + column) % 2 == 0: + return self.get_minor(row, column) + return -1 * self.get_minor(row, column) + + def minors(self): + return Matrix( + [ + [self.get_minor(row, column) for column in range(self.num_columns)] + for row in range(self.num_rows) + ] + ) + + def cofactors(self): + return Matrix( + [ + [ + self.minors().rows[row][column] + if (row + column) % 2 == 0 + else self.minors().rows[row][column] * -1 + for column in range(self.minors().num_columns) + ] + for row in range(self.minors().num_rows) + ] + ) + + def adjugate(self): + values = [ + [self.cofactors().rows[column][row] for column in range(self.num_columns)] + for row in range(self.num_rows) + ] + return Matrix(values) + + def inverse(self): + determinant = self.determinant() + return None if not determinant else self.adjugate() * (1 / determinant) + + def __repr__(self): + return str(self.rows) + + def __str__(self): + if self.num_rows == 0: + return "[]" + if self.num_rows == 1: + return "[[" + ". ".join(self.rows[0]) + "]]" + return ( + "[" + + "\n ".join( + [ + "[" + ". ".join([str(value) for value in row]) + ".]" + for row in self.rows + ] + ) + + "]" + ) + + # MATRIX MANIPULATION + def add_row(self, row, position=None): + type_error = TypeError("Row must be a list containing all ints and/or floats") + if not isinstance(row, list): + raise type_error + for value in row: + if not isinstance(value, (int, float)): + raise type_error + if len(row) != self.num_columns: + raise ValueError( + "Row must be equal in length to the other rows in the matrix" + ) + if position is None: + self.rows.append(row) + else: + self.rows = self.rows[0:position] + [row] + self.rows[position:] + + def add_column(self, column, position=None): + type_error = TypeError( + "Column must be a list containing all ints and/or floats" + ) + if not isinstance(column, list): + raise type_error + for value in column: + if not isinstance(value, (int, float)): + raise type_error + if len(column) != self.num_rows: + raise ValueError( + "Column must be equal in length to the other columns in the matrix" + ) + if position is None: + self.rows = [self.rows[i] + [column[i]] for i in range(self.num_rows)] + else: + self.rows = [ + self.rows[i][0:position] + [column[i]] + self.rows[i][position:] + for i in range(self.num_rows) + ] + + # MATRIX OPERATIONS + def __eq__(self, other): + if not isinstance(other, Matrix): + raise TypeError("A Matrix can only be compared with another Matrix") + return self.rows == other.rows + + def __ne__(self, other): + return not self == other + + def __neg__(self): + return self * -1 + + def __add__(self, other): + if self.order != other.order: + raise ValueError("Addition requires matrices of the same order") + return Matrix( + [ + [self.rows[i][j] + other.rows[i][j] for j in range(self.num_columns)] + for i in range(self.num_rows) + ] + ) + + def __sub__(self, other): + if self.order != other.order: + raise ValueError("Subtraction requires matrices of the same order") + return Matrix( + [ + [self.rows[i][j] - other.rows[i][j] for j in range(self.num_columns)] + for i in range(self.num_rows) + ] + ) + + def __mul__(self, other): + if isinstance(other, (int, float)): + return Matrix([[element * other for element in row] for row in self.rows]) + elif isinstance(other, Matrix): + if self.num_columns != other.num_rows: + raise ValueError( + "The number of columns in the first matrix must " + "be equal to the number of rows in the second" + ) + return Matrix( + [ + [Matrix.dot_product(row, column) for column in other.columns()] + for row in self.rows + ] + ) + else: + raise TypeError( + "A Matrix can only be multiplied by an int, float, or another matrix" + ) + + def __pow__(self, other): + if not isinstance(other, int): + raise TypeError("A Matrix can only be raised to the power of an int") + if not self.is_square: + raise ValueError("Only square matrices can be raised to a power") + if other == 0: + return self.identity() + if other < 0: + if self.is_invertable: + return self.inverse() ** (-other) + raise ValueError( + "Only invertable matrices can be raised to a negative power" + ) + result = self + for i in range(other - 1): + result *= self + return result + + @classmethod + def dot_product(cls, row, column): + return sum(row[i] * column[i] for i in range(len(row))) + + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/matrix/matrix_operation.py b/python-mega-algo/matrix/matrix_operation.py new file mode 100644 index 00000000..dca01f9c --- /dev/null +++ b/python-mega-algo/matrix/matrix_operation.py @@ -0,0 +1,184 @@ +""" +Functions for 2D matrix operations +""" + +from __future__ import annotations + + +def add(*matrix_s: list[list]) -> list[list]: + """ + >>> add([[1,2],[3,4]],[[2,3],[4,5]]) + [[3, 5], [7, 9]] + >>> add([[1.2,2.4],[3,4]],[[2,3],[4,5]]) + [[3.2, 5.4], [7, 9]] + >>> add([[1, 2], [4, 5]], [[3, 7], [3, 4]], [[3, 5], [5, 7]]) + [[7, 14], [12, 16]] + """ + if all(_check_not_integer(m) for m in matrix_s): + for i in matrix_s[1:]: + _verify_matrix_sizes(matrix_s[0], i) + return [[sum(t) for t in zip(*m)] for m in zip(*matrix_s)] + + +def subtract(matrix_a: list[list], matrix_b: list[list]) -> list[list]: + """ + >>> subtract([[1,2],[3,4]],[[2,3],[4,5]]) + [[-1, -1], [-1, -1]] + >>> subtract([[1,2.5],[3,4]],[[2,3],[4,5.5]]) + [[-1, -0.5], [-1, -1.5]] + """ + if ( + _check_not_integer(matrix_a) + and _check_not_integer(matrix_b) + and _verify_matrix_sizes(matrix_a, matrix_b) + ): + return [[i - j for i, j in zip(*m)] for m in zip(matrix_a, matrix_b)] + + +def scalar_multiply(matrix: list[list], n: int) -> list[list]: + """ + >>> scalar_multiply([[1,2],[3,4]],5) + [[5, 10], [15, 20]] + >>> scalar_multiply([[1.4,2.3],[3,4]],5) + [[7.0, 11.5], [15, 20]] + """ + return [[x * n for x in row] for row in matrix] + + +def multiply(matrix_a: list[list], matrix_b: list[list]) -> list[list]: + """ + >>> multiply([[1,2],[3,4]],[[5,5],[7,5]]) + [[19, 15], [43, 35]] + >>> multiply([[1,2.5],[3,4.5]],[[5,5],[7,5]]) + [[22.5, 17.5], [46.5, 37.5]] + >>> multiply([[1, 2, 3]], [[2], [3], [4]]) + [[20]] + """ + if _check_not_integer(matrix_a) and _check_not_integer(matrix_b): + rows, cols = _verify_matrix_sizes(matrix_a, matrix_b) + + if cols[0] != rows[1]: + raise ValueError( + f"Cannot multiply matrix of dimensions ({rows[0]},{cols[0]}) " + f"and ({rows[1]},{cols[1]})" + ) + return [ + [sum(m * n for m, n in zip(i, j)) for j in zip(*matrix_b)] for i in matrix_a + ] + + +def identity(n: int) -> list[list]: + """ + :param n: dimension for nxn matrix + :type n: int + :return: Identity matrix of shape [n, n] + >>> identity(3) + [[1, 0, 0], [0, 1, 0], [0, 0, 1]] + """ + n = int(n) + return [[int(row == column) for column in range(n)] for row in range(n)] + + +def transpose(matrix: list[list], return_map: bool = True) -> list[list]: + """ + >>> transpose([[1,2],[3,4]]) # doctest: +ELLIPSIS + >> transpose([[1,2],[3,4]], return_map=False) + [[1, 3], [2, 4]] + """ + if _check_not_integer(matrix): + if return_map: + return map(list, zip(*matrix)) + else: + return list(map(list, zip(*matrix))) + + +def minor(matrix: list[list], row: int, column: int) -> list[list]: + """ + >>> minor([[1, 2], [3, 4]], 1, 1) + [[1]] + """ + minor = matrix[:row] + matrix[row + 1 :] + return [row[:column] + row[column + 1 :] for row in minor] + + +def determinant(matrix: list[list]) -> int: + """ + >>> determinant([[1, 2], [3, 4]]) + -2 + >>> determinant([[1.5, 2.5], [3, 4]]) + -1.5 + """ + if len(matrix) == 1: + return matrix[0][0] + + return sum( + x * determinant(minor(matrix, 0, i)) * (-1) ** i + for i, x in enumerate(matrix[0]) + ) + + +def inverse(matrix: list[list]) -> list[list]: + """ + >>> inverse([[1, 2], [3, 4]]) + [[-2.0, 1.0], [1.5, -0.5]] + >>> inverse([[1, 1], [1, 1]]) + """ + # https://stackoverflow.com/questions/20047519/python-doctests-test-for-none + det = determinant(matrix) + if det == 0: + return None + + matrix_minor = [ + [determinant(minor(matrix, i, j)) for j in range(len(matrix))] + for i in range(len(matrix)) + ] + + cofactors = [ + [x * (-1) ** (row + col) for col, x in enumerate(matrix_minor[row])] + for row in range(len(matrix)) + ] + adjugate = transpose(cofactors) + return scalar_multiply(adjugate, 1 / det) + + +def _check_not_integer(matrix: list[list]) -> bool: + if not isinstance(matrix, int) and not isinstance(matrix[0], int): + return True + raise TypeError("Expected a matrix, got int/list instead") + + +def _shape(matrix: list[list]) -> list: + return len(matrix), len(matrix[0]) + + +def _verify_matrix_sizes(matrix_a: list[list], matrix_b: list[list]) -> tuple[list]: + shape = _shape(matrix_a) + _shape(matrix_b) + if shape[0] != shape[3] or shape[1] != shape[2]: + raise ValueError( + f"operands could not be broadcast together with shape " + f"({shape[0], shape[1]}), ({shape[2], shape[3]})" + ) + return (shape[0], shape[2]), (shape[1], shape[3]) + + +def main(): + matrix_a = [[12, 10], [3, 9]] + matrix_b = [[3, 4], [7, 4]] + matrix_c = [[11, 12, 13, 14], [21, 22, 23, 24], [31, 32, 33, 34], [41, 42, 43, 44]] + matrix_d = [[3, 0, 2], [2, 0, -2], [0, 1, 1]] + print(f"Add Operation, {add(matrix_a, matrix_b) = } \n") + print( + f"Multiply Operation, {multiply(matrix_a, matrix_b) = } \n", + ) + print(f"Identity: {identity(5)}\n") + print(f"Minor of {matrix_c} = {minor(matrix_c, 1, 2)} \n") + print(f"Determinant of {matrix_b} = {determinant(matrix_b)} \n") + print(f"Inverse of {matrix_d} = {inverse(matrix_d)}\n") + + +if __name__ == "__main__": + import doctest + + doctest.testmod() + main() diff --git a/python-mega-algo/matrix/nth_fibonacci_using_matrix_exponentiation.py b/python-mega-algo/matrix/nth_fibonacci_using_matrix_exponentiation.py new file mode 100644 index 00000000..8c39de0f --- /dev/null +++ b/python-mega-algo/matrix/nth_fibonacci_using_matrix_exponentiation.py @@ -0,0 +1,91 @@ +""" +Implementation of finding nth fibonacci number using matrix exponentiation. +Time Complexity is about O(log(n)*8), where 8 is the complexity of matrix +multiplication of size 2 by 2. +And on the other hand complexity of bruteforce solution is O(n). +As we know + f[n] = f[n-1] + f[n-1] +Converting to matrix, + [f(n),f(n-1)] = [[1,1],[1,0]] * [f(n-1),f(n-2)] +-> [f(n),f(n-1)] = [[1,1],[1,0]]^2 * [f(n-2),f(n-3)] + ... + ... +-> [f(n),f(n-1)] = [[1,1],[1,0]]^(n-1) * [f(1),f(0)] +So we just need the n times multiplication of the matrix [1,1],[1,0]]. +We can decrease the n times multiplication by following the divide and conquer approach. +""" + + +def multiply(matrix_a, matrix_b): + matrix_c = [] + n = len(matrix_a) + for i in range(n): + list_1 = [] + for j in range(n): + val = 0 + for k in range(n): + val = val + matrix_a[i][k] * matrix_b[k][j] + list_1.append(val) + matrix_c.append(list_1) + return matrix_c + + +def identity(n): + return [[int(row == column) for column in range(n)] for row in range(n)] + + +def nth_fibonacci_matrix(n): + """ + >>> nth_fibonacci_matrix(100) + 354224848179261915075 + >>> nth_fibonacci_matrix(-100) + -100 + """ + if n <= 1: + return n + res_matrix = identity(2) + fibonacci_matrix = [[1, 1], [1, 0]] + n = n - 1 + while n > 0: + if n % 2 == 1: + res_matrix = multiply(res_matrix, fibonacci_matrix) + fibonacci_matrix = multiply(fibonacci_matrix, fibonacci_matrix) + n = int(n / 2) + return res_matrix[0][0] + + +def nth_fibonacci_bruteforce(n): + """ + >>> nth_fibonacci_bruteforce(100) + 354224848179261915075 + >>> nth_fibonacci_bruteforce(-100) + -100 + """ + if n <= 1: + return n + fib0 = 0 + fib1 = 1 + for i in range(2, n + 1): + fib0, fib1 = fib1, fib0 + fib1 + return fib1 + + +def main(): + for ordinal in "0th 1st 2nd 3rd 10th 100th 1000th".split(): + n = int("".join(c for c in ordinal if c in "0123456789")) # 1000th --> 1000 + print( + f"{ordinal} fibonacci number using matrix exponentiation is " + f"{nth_fibonacci_matrix(n)} and using bruteforce is " + f"{nth_fibonacci_bruteforce(n)}\n" + ) + # from timeit import timeit + # print(timeit("nth_fibonacci_matrix(1000000)", + # "from main import nth_fibonacci_matrix", number=5)) + # print(timeit("nth_fibonacci_bruteforce(1000000)", + # "from main import nth_fibonacci_bruteforce", number=5)) + # 2.3342058970001744 + # 57.256506615000035 + + +if __name__ == "__main__": + main() diff --git a/python-mega-algo/matrix/right.html b/python-mega-algo/matrix/right.html new file mode 100644 index 00000000..ac9142eb --- /dev/null +++ b/python-mega-algo/matrix/right.html @@ -0,0 +1,31 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/matrix + + + + + + + + +
    Folders
    <Go Back> tests
    +
    + + + + + + +
    FileFileFileFile
    count_isl...rix.py matrix_op...ion.py searching...rix.py spiral_print.py 
    inverse_o...rix.py nth_fibon...ion.py sherman_m...son.py __init__.py 
    matrix_class.py rotate_matrix.py 
    + +

    +Folders: 2
    +Files: 10
    +Size of all files: 35730 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/matrix/rotate_matrix.py b/python-mega-algo/matrix/rotate_matrix.py new file mode 100644 index 00000000..f638597a --- /dev/null +++ b/python-mega-algo/matrix/rotate_matrix.py @@ -0,0 +1,101 @@ +""" +In this problem, we want to rotate the matrix elements by 90, 180, 270 +(counterclockwise) +Discussion in stackoverflow: +https://stackoverflow.com/questions/42519/how-do-you-rotate-a-two-dimensional-array +""" + +from __future__ import annotations + + +def make_matrix(row_size: int = 4) -> list[list]: + """ + >>> make_matrix() + [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15, 16]] + >>> make_matrix(1) + [[1]] + >>> make_matrix(-2) + [[1, 2], [3, 4]] + >>> make_matrix(3) + [[1, 2, 3], [4, 5, 6], [7, 8, 9]] + >>> make_matrix() == make_matrix(4) + True + """ + row_size = abs(row_size) or 4 + return [[1 + x + y * row_size for x in range(row_size)] for y in range(row_size)] + + +def rotate_90(matrix: list[list]) -> list[list]: + """ + >>> rotate_90(make_matrix()) + [[4, 8, 12, 16], [3, 7, 11, 15], [2, 6, 10, 14], [1, 5, 9, 13]] + >>> rotate_90(make_matrix()) == transpose(reverse_column(make_matrix())) + True + """ + + return reverse_row(transpose(matrix)) + # OR.. transpose(reverse_column(matrix)) + + +def rotate_180(matrix: list[list]) -> list[list]: + """ + >>> rotate_180(make_matrix()) + [[16, 15, 14, 13], [12, 11, 10, 9], [8, 7, 6, 5], [4, 3, 2, 1]] + >>> rotate_180(make_matrix()) == reverse_column(reverse_row(make_matrix())) + True + """ + + return reverse_row(reverse_column(matrix)) + # OR.. reverse_column(reverse_row(matrix)) + + +def rotate_270(matrix: list[list]) -> list[list]: + """ + >>> rotate_270(make_matrix()) + [[13, 9, 5, 1], [14, 10, 6, 2], [15, 11, 7, 3], [16, 12, 8, 4]] + >>> rotate_270(make_matrix()) == transpose(reverse_row(make_matrix())) + True + """ + + return reverse_column(transpose(matrix)) + # OR.. transpose(reverse_row(matrix)) + + +def transpose(matrix: list[list]) -> list[list]: + matrix[:] = [list(x) for x in zip(*matrix)] + return matrix + + +def reverse_row(matrix: list[list]) -> list[list]: + matrix[:] = matrix[::-1] + return matrix + + +def reverse_column(matrix: list[list]) -> list[list]: + matrix[:] = [x[::-1] for x in matrix] + return matrix + + +def print_matrix(matrix: list[list]) -> None: + for i in matrix: + print(*i) + + +if __name__ == "__main__": + matrix = make_matrix() + print("\norigin:\n") + print_matrix(matrix) + print("\nrotate 90 counterclockwise:\n") + print_matrix(rotate_90(matrix)) + + matrix = make_matrix() + print("\norigin:\n") + print_matrix(matrix) + print("\nrotate 180:\n") + print_matrix(rotate_180(matrix)) + + matrix = make_matrix() + print("\norigin:\n") + print_matrix(matrix) + print("\nrotate 270 counterclockwise:\n") + print_matrix(rotate_270(matrix)) diff --git a/python-mega-algo/matrix/searching_in_sorted_matrix.py b/python-mega-algo/matrix/searching_in_sorted_matrix.py new file mode 100644 index 00000000..ca6263a3 --- /dev/null +++ b/python-mega-algo/matrix/searching_in_sorted_matrix.py @@ -0,0 +1,46 @@ +from __future__ import annotations + +from typing import Union + + +def search_in_a_sorted_matrix( + mat: list[list], m: int, n: int, key: Union[int, float] +) -> None: + """ + >>> search_in_a_sorted_matrix( + ... [[2, 5, 7], [4, 8, 13], [9, 11, 15], [12, 17, 20]], 3, 3, 5) + Key 5 found at row- 1 column- 2 + >>> search_in_a_sorted_matrix( + ... [[2, 5, 7], [4, 8, 13], [9, 11, 15], [12, 17, 20]], 3, 3, 21) + Key 21 not found + >>> search_in_a_sorted_matrix( + ... [[2.1, 5, 7], [4, 8, 13], [9, 11, 15], [12, 17, 20]], 3, 3, 2.1) + Key 2.1 found at row- 1 column- 1 + >>> search_in_a_sorted_matrix( + ... [[2.1, 5, 7], [4, 8, 13], [9, 11, 15], [12, 17, 20]], 3, 3, 2.2) + Key 2.2 not found + """ + i, j = m - 1, 0 + while i >= 0 and j < n: + if key == mat[i][j]: + print(f"Key {key} found at row- {i + 1} column- {j + 1}") + return + if key < mat[i][j]: + i -= 1 + else: + j += 1 + print(f"Key {key} not found") + + +def main(): + mat = [[2, 5, 7], [4, 8, 13], [9, 11, 15], [12, 17, 20]] + x = int(input("Enter the element to be searched:")) + print(mat) + search_in_a_sorted_matrix(mat, len(mat), len(mat[0]), x) + + +if __name__ == "__main__": + import doctest + + doctest.testmod() + main() diff --git a/python-mega-algo/matrix/sherman_morrison.py b/python-mega-algo/matrix/sherman_morrison.py new file mode 100644 index 00000000..3466b3d4 --- /dev/null +++ b/python-mega-algo/matrix/sherman_morrison.py @@ -0,0 +1,268 @@ +class Matrix: + """ + + Matrix structure. + """ + + def __init__(self, row: int, column: int, default_value: float = 0): + """ + + Initialize matrix with given size and default value. + + Example: + >>> a = Matrix(2, 3, 1) + >>> a + Matrix consist of 2 rows and 3 columns + [1, 1, 1] + [1, 1, 1] + """ + + self.row, self.column = row, column + self.array = [[default_value for c in range(column)] for r in range(row)] + + def __str__(self): + """ + + Return string representation of this matrix. + """ + + # Prefix + s = "Matrix consist of %d rows and %d columns\n" % (self.row, self.column) + + # Make string identifier + max_element_length = 0 + for row_vector in self.array: + for obj in row_vector: + max_element_length = max(max_element_length, len(str(obj))) + string_format_identifier = "%%%ds" % (max_element_length,) + + # Make string and return + def single_line(row_vector): + nonlocal string_format_identifier + line = "[" + line += ", ".join(string_format_identifier % (obj,) for obj in row_vector) + line += "]" + return line + + s += "\n".join(single_line(row_vector) for row_vector in self.array) + return s + + def __repr__(self): + return str(self) + + def validateIndices(self, loc: tuple): + """ + + Check if given indices are valid to pick element from matrix. + + Example: + >>> a = Matrix(2, 6, 0) + >>> a.validateIndices((2, 7)) + False + >>> a.validateIndices((0, 0)) + True + """ + if not (isinstance(loc, (list, tuple)) and len(loc) == 2): + return False + elif not (0 <= loc[0] < self.row and 0 <= loc[1] < self.column): + return False + else: + return True + + def __getitem__(self, loc: tuple): + """ + + Return array[row][column] where loc = (row, column). + + Example: + >>> a = Matrix(3, 2, 7) + >>> a[1, 0] + 7 + """ + assert self.validateIndices(loc) + return self.array[loc[0]][loc[1]] + + def __setitem__(self, loc: tuple, value: float): + """ + + Set array[row][column] = value where loc = (row, column). + + Example: + >>> a = Matrix(2, 3, 1) + >>> a[1, 2] = 51 + >>> a + Matrix consist of 2 rows and 3 columns + [ 1, 1, 1] + [ 1, 1, 51] + """ + assert self.validateIndices(loc) + self.array[loc[0]][loc[1]] = value + + def __add__(self, another): + """ + + Return self + another. + + Example: + >>> a = Matrix(2, 1, -4) + >>> b = Matrix(2, 1, 3) + >>> a+b + Matrix consist of 2 rows and 1 columns + [-1] + [-1] + """ + + # Validation + assert isinstance(another, Matrix) + assert self.row == another.row and self.column == another.column + + # Add + result = Matrix(self.row, self.column) + for r in range(self.row): + for c in range(self.column): + result[r, c] = self[r, c] + another[r, c] + return result + + def __neg__(self): + """ + + Return -self. + + Example: + >>> a = Matrix(2, 2, 3) + >>> a[0, 1] = a[1, 0] = -2 + >>> -a + Matrix consist of 2 rows and 2 columns + [-3, 2] + [ 2, -3] + """ + + result = Matrix(self.row, self.column) + for r in range(self.row): + for c in range(self.column): + result[r, c] = -self[r, c] + return result + + def __sub__(self, another): + return self + (-another) + + def __mul__(self, another): + """ + + Return self * another. + + Example: + >>> a = Matrix(2, 3, 1) + >>> a[0,2] = a[1,2] = 3 + >>> a * -2 + Matrix consist of 2 rows and 3 columns + [-2, -2, -6] + [-2, -2, -6] + """ + + if isinstance(another, (int, float)): # Scalar multiplication + result = Matrix(self.row, self.column) + for r in range(self.row): + for c in range(self.column): + result[r, c] = self[r, c] * another + return result + elif isinstance(another, Matrix): # Matrix multiplication + assert self.column == another.row + result = Matrix(self.row, another.column) + for r in range(self.row): + for c in range(another.column): + for i in range(self.column): + result[r, c] += self[r, i] * another[i, c] + return result + else: + raise TypeError(f"Unsupported type given for another ({type(another)})") + + def transpose(self): + """ + + Return self^T. + + Example: + >>> a = Matrix(2, 3) + >>> for r in range(2): + ... for c in range(3): + ... a[r,c] = r*c + ... + >>> a.transpose() + Matrix consist of 3 rows and 2 columns + [0, 0] + [0, 1] + [0, 2] + """ + + result = Matrix(self.column, self.row) + for r in range(self.row): + for c in range(self.column): + result[c, r] = self[r, c] + return result + + def ShermanMorrison(self, u, v): + """ + + Apply Sherman-Morrison formula in O(n^2). + To learn this formula, please look this: + https://en.wikipedia.org/wiki/Sherman%E2%80%93Morrison_formula + This method returns (A + uv^T)^(-1) where A^(-1) is self. Returns None if it's + impossible to calculate. + Warning: This method doesn't check if self is invertible. + Make sure self is invertible before execute this method. + + Example: + >>> ainv = Matrix(3, 3, 0) + >>> for i in range(3): ainv[i,i] = 1 + ... + >>> u = Matrix(3, 1, 0) + >>> u[0,0], u[1,0], u[2,0] = 1, 2, -3 + >>> v = Matrix(3, 1, 0) + >>> v[0,0], v[1,0], v[2,0] = 4, -2, 5 + >>> ainv.ShermanMorrison(u, v) + Matrix consist of 3 rows and 3 columns + [ 1.2857142857142856, -0.14285714285714285, 0.3571428571428571] + [ 0.5714285714285714, 0.7142857142857143, 0.7142857142857142] + [ -0.8571428571428571, 0.42857142857142855, -0.0714285714285714] + """ + + # Size validation + assert isinstance(u, Matrix) and isinstance(v, Matrix) + assert self.row == self.column == u.row == v.row # u, v should be column vector + assert u.column == v.column == 1 # u, v should be column vector + + # Calculate + vT = v.transpose() + numerator_factor = (vT * self * u)[0, 0] + 1 + if numerator_factor == 0: + return None # It's not invertable + return self - ((self * u) * (vT * self) * (1.0 / numerator_factor)) + + +# Testing +if __name__ == "__main__": + + def test1(): + # a^(-1) + ainv = Matrix(3, 3, 0) + for i in range(3): + ainv[i, i] = 1 + print(f"a^(-1) is {ainv}") + # u, v + u = Matrix(3, 1, 0) + u[0, 0], u[1, 0], u[2, 0] = 1, 2, -3 + v = Matrix(3, 1, 0) + v[0, 0], v[1, 0], v[2, 0] = 4, -2, 5 + print(f"u is {u}") + print(f"v is {v}") + print("uv^T is %s" % (u * v.transpose())) + # Sherman Morrison + print(f"(a + uv^T)^(-1) is {ainv.ShermanMorrison(u, v)}") + + def test2(): + import doctest + + doctest.testmod() + + test2() diff --git a/python-mega-algo/matrix/spiral_print.py b/python-mega-algo/matrix/spiral_print.py new file mode 100644 index 00000000..21dab761 --- /dev/null +++ b/python-mega-algo/matrix/spiral_print.py @@ -0,0 +1,68 @@ +""" +This program print the matrix in spiral form. +This problem has been solved through recursive way. + + Matrix must satisfy below conditions + i) matrix should be only one or two dimensional + ii)column of all the row should be equal +""" + + +def checkMatrix(a): + # must be + if type(a) == list and len(a) > 0: + if type(a[0]) == list: + prevLen = 0 + for i in a: + if prevLen == 0: + prevLen = len(i) + result = True + elif prevLen == len(i): + result = True + else: + result = False + else: + result = True + else: + result = False + return result + + +def spiralPrint(a): + + if checkMatrix(a) and len(a) > 0: + + matRow = len(a) + if type(a[0]) == list: + matCol = len(a[0]) + else: + for dat in a: + print(dat), + return + + # horizotal printing increasing + for i in range(0, matCol): + print(a[0][i]), + # vertical printing down + for i in range(1, matRow): + print(a[i][matCol - 1]), + # horizotal printing decreasing + if matRow > 1: + for i in range(matCol - 2, -1, -1): + print(a[matRow - 1][i]), + # vertical printing up + for i in range(matRow - 2, 0, -1): + print(a[i][0]), + remainMat = [row[1 : matCol - 1] for row in a[1 : matRow - 1]] + if len(remainMat) > 0: + spiralPrint(remainMat) + else: + return + else: + print("Not a valid matrix") + return + + +# driver code +a = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]] +spiralPrint(a) diff --git a/python-mega-algo/matrix/tests/__init__.py b/python-mega-algo/matrix/tests/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/matrix/tests/pytest.ini b/python-mega-algo/matrix/tests/pytest.ini new file mode 100644 index 00000000..8a978b56 --- /dev/null +++ b/python-mega-algo/matrix/tests/pytest.ini @@ -0,0 +1,3 @@ +[pytest] +markers = + mat_ops: tests for matrix operations diff --git a/python-mega-algo/matrix/tests/right.html b/python-mega-algo/matrix/tests/right.html new file mode 100644 index 00000000..9dfe7d9e --- /dev/null +++ b/python-mega-algo/matrix/tests/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/matrix/tests + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    pytest.ini test_matr...ion.py __init__.py 
    + +

    +Folders: 1
    +Files: 3
    +Size of all files: 4093 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/matrix/tests/test_matrix_operation.py b/python-mega-algo/matrix/tests/test_matrix_operation.py new file mode 100644 index 00000000..65b35fd7 --- /dev/null +++ b/python-mega-algo/matrix/tests/test_matrix_operation.py @@ -0,0 +1,120 @@ +""" +Testing here assumes that numpy and linalg is ALWAYS correct!!!! + +If running from PyCharm you can place the following line in "Additional Arguments" for +the pytest run configuration +-vv -m mat_ops -p no:cacheprovider +""" + +import logging + +# standard libraries +import sys + +import numpy as np +import pytest # type: ignore + +# Custom/local libraries +from matrix import matrix_operation as matop + +mat_a = [[12, 10], [3, 9]] +mat_b = [[3, 4], [7, 4]] +mat_c = [[3, 0, 2], [2, 0, -2], [0, 1, 1]] +mat_d = [[3, 0, -2], [2, 0, 2], [0, 1, 1]] +mat_e = [[3, 0, 2], [2, 0, -2], [0, 1, 1], [2, 0, -2]] +mat_f = [1] +mat_h = [2] + +logger = logging.getLogger() +logger.level = logging.DEBUG +stream_handler = logging.StreamHandler(sys.stdout) +logger.addHandler(stream_handler) + + +@pytest.mark.mat_ops +@pytest.mark.parametrize( + ("mat1", "mat2"), [(mat_a, mat_b), (mat_c, mat_d), (mat_d, mat_e), (mat_f, mat_h)] +) +def test_addition(mat1, mat2): + if (np.array(mat1)).shape < (2, 2) or (np.array(mat2)).shape < (2, 2): + with pytest.raises(TypeError): + logger.info(f"\n\t{test_addition.__name__} returned integer") + matop.add(mat1, mat2) + elif (np.array(mat1)).shape == (np.array(mat2)).shape: + logger.info(f"\n\t{test_addition.__name__} with same matrix dims") + act = (np.array(mat1) + np.array(mat2)).tolist() + theo = matop.add(mat1, mat2) + assert theo == act + else: + with pytest.raises(ValueError): + logger.info(f"\n\t{test_addition.__name__} with different matrix dims") + matop.add(mat1, mat2) + + +@pytest.mark.mat_ops +@pytest.mark.parametrize( + ("mat1", "mat2"), [(mat_a, mat_b), (mat_c, mat_d), (mat_d, mat_e), (mat_f, mat_h)] +) +def test_subtraction(mat1, mat2): + if (np.array(mat1)).shape < (2, 2) or (np.array(mat2)).shape < (2, 2): + with pytest.raises(TypeError): + logger.info(f"\n\t{test_subtraction.__name__} returned integer") + matop.subtract(mat1, mat2) + elif (np.array(mat1)).shape == (np.array(mat2)).shape: + logger.info(f"\n\t{test_subtraction.__name__} with same matrix dims") + act = (np.array(mat1) - np.array(mat2)).tolist() + theo = matop.subtract(mat1, mat2) + assert theo == act + else: + with pytest.raises(ValueError): + logger.info(f"\n\t{test_subtraction.__name__} with different matrix dims") + assert matop.subtract(mat1, mat2) + + +@pytest.mark.mat_ops +@pytest.mark.parametrize( + ("mat1", "mat2"), [(mat_a, mat_b), (mat_c, mat_d), (mat_d, mat_e), (mat_f, mat_h)] +) +def test_multiplication(mat1, mat2): + if (np.array(mat1)).shape < (2, 2) or (np.array(mat2)).shape < (2, 2): + logger.info(f"\n\t{test_multiplication.__name__} returned integer") + with pytest.raises(TypeError): + matop.add(mat1, mat2) + elif (np.array(mat1)).shape == (np.array(mat2)).shape: + logger.info(f"\n\t{test_multiplication.__name__} meets dim requirements") + act = (np.matmul(mat1, mat2)).tolist() + theo = matop.multiply(mat1, mat2) + assert theo == act + else: + with pytest.raises(ValueError): + logger.info( + f"\n\t{test_multiplication.__name__} does not meet dim requirements" + ) + assert matop.subtract(mat1, mat2) + + +@pytest.mark.mat_ops +def test_scalar_multiply(): + act = (3.5 * np.array(mat_a)).tolist() + theo = matop.scalar_multiply(mat_a, 3.5) + assert theo == act + + +@pytest.mark.mat_ops +def test_identity(): + act = (np.identity(5)).tolist() + theo = matop.identity(5) + assert theo == act + + +@pytest.mark.mat_ops +@pytest.mark.parametrize("mat", [mat_a, mat_b, mat_c, mat_d, mat_e, mat_f]) +def test_transpose(mat): + if (np.array(mat)).shape < (2, 2): + with pytest.raises(TypeError): + logger.info(f"\n\t{test_transpose.__name__} returned integer") + matop.transpose(mat) + else: + act = (np.transpose(mat)).tolist() + theo = matop.transpose(mat, return_map=False) + assert theo == act diff --git a/python-mega-algo/mypy.ini b/python-mega-algo/mypy.ini new file mode 100644 index 00000000..9eec22e2 --- /dev/null +++ b/python-mega-algo/mypy.ini @@ -0,0 +1,5 @@ +[mypy] +ignore_missing_imports = True + +; FIXME: #4052 fix mypy errors in the exclude directories and remove them below +exclude = (data_structures|dynamic_programming|graphs|maths|matrix|other|project_euler|searches|strings*)/$ diff --git a/python-mega-algo/networking_flow/__init__.py b/python-mega-algo/networking_flow/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/networking_flow/ford_fulkerson.py b/python-mega-algo/networking_flow/ford_fulkerson.py new file mode 100644 index 00000000..96b78264 --- /dev/null +++ b/python-mega-algo/networking_flow/ford_fulkerson.py @@ -0,0 +1,61 @@ +# Ford-Fulkerson Algorithm for Maximum Flow Problem +""" +Description: + (1) Start with initial flow as 0; + (2) Choose augmenting path from source to sink and add path to flow; +""" + + +def BFS(graph, s, t, parent): + # Return True if there is node that has not iterated. + visited = [False] * len(graph) + queue = [] + queue.append(s) + visited[s] = True + + while queue: + u = queue.pop(0) + for ind in range(len(graph[u])): + if visited[ind] is False and graph[u][ind] > 0: + queue.append(ind) + visited[ind] = True + parent[ind] = u + + return True if visited[t] else False + + +def FordFulkerson(graph, source, sink): + # This array is filled by BFS and to store path + parent = [-1] * (len(graph)) + max_flow = 0 + while BFS(graph, source, sink, parent): + path_flow = float("Inf") + s = sink + + while s != source: + # Find the minimum value in select path + path_flow = min(path_flow, graph[parent[s]][s]) + s = parent[s] + + max_flow += path_flow + v = sink + + while v != source: + u = parent[v] + graph[u][v] -= path_flow + graph[v][u] += path_flow + v = parent[v] + return max_flow + + +graph = [ + [0, 16, 13, 0, 0, 0], + [0, 0, 10, 12, 0, 0], + [0, 4, 0, 0, 14, 0], + [0, 0, 9, 0, 0, 20], + [0, 0, 0, 7, 0, 4], + [0, 0, 0, 0, 0, 0], +] + +source, sink = 0, 5 +print(FordFulkerson(graph, source, sink)) diff --git a/python-mega-algo/networking_flow/minimum_cut.py b/python-mega-algo/networking_flow/minimum_cut.py new file mode 100644 index 00000000..d79f3619 --- /dev/null +++ b/python-mega-algo/networking_flow/minimum_cut.py @@ -0,0 +1,66 @@ +# Minimum cut on Ford_Fulkerson algorithm. + +test_graph = [ + [0, 16, 13, 0, 0, 0], + [0, 0, 10, 12, 0, 0], + [0, 4, 0, 0, 14, 0], + [0, 0, 9, 0, 0, 20], + [0, 0, 0, 7, 0, 4], + [0, 0, 0, 0, 0, 0], +] + + +def BFS(graph, s, t, parent): + # Return True if there is node that has not iterated. + visited = [False] * len(graph) + queue = [s] + visited[s] = True + + while queue: + u = queue.pop(0) + for ind in range(len(graph[u])): + if visited[ind] is False and graph[u][ind] > 0: + queue.append(ind) + visited[ind] = True + parent[ind] = u + + return True if visited[t] else False + + +def mincut(graph, source, sink): + """This array is filled by BFS and to store path + >>> mincut(test_graph, source=0, sink=5) + [(1, 3), (4, 3), (4, 5)] + """ + parent = [-1] * (len(graph)) + max_flow = 0 + res = [] + temp = [i[:] for i in graph] # Record original cut, copy. + while BFS(graph, source, sink, parent): + path_flow = float("Inf") + s = sink + + while s != source: + # Find the minimum value in select path + path_flow = min(path_flow, graph[parent[s]][s]) + s = parent[s] + + max_flow += path_flow + v = sink + + while v != source: + u = parent[v] + graph[u][v] -= path_flow + graph[v][u] += path_flow + v = parent[v] + + for i in range(len(graph)): + for j in range(len(graph[0])): + if graph[i][j] == 0 and temp[i][j] > 0: + res.append((i, j)) + + return res + + +if __name__ == "__main__": + print(mincut(test_graph, source=0, sink=5)) diff --git a/python-mega-algo/networking_flow/right.html b/python-mega-algo/networking_flow/right.html new file mode 100644 index 00000000..5ee5e2c8 --- /dev/null +++ b/python-mega-algo/networking_flow/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/networking_flow + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    ford_fulkerson.py minimum_cut.py __init__.py 
    + +

    +Folders: 1
    +Files: 3
    +Size of all files: 3179 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/neural_network/2_hidden_layers_neural_network.py b/python-mega-algo/neural_network/2_hidden_layers_neural_network.py new file mode 100644 index 00000000..1cf78ec4 --- /dev/null +++ b/python-mega-algo/neural_network/2_hidden_layers_neural_network.py @@ -0,0 +1,295 @@ +""" +References: + - http://neuralnetworksanddeeplearning.com/chap2.html (Backpropagation) + - https://en.wikipedia.org/wiki/Sigmoid_function (Sigmoid activation function) + - https://en.wikipedia.org/wiki/Feedforward_neural_network (Feedforward) +""" + +import numpy + + +class TwoHiddenLayerNeuralNetwork: + def __init__(self, input_array: numpy.ndarray, output_array: numpy.ndarray) -> None: + """ + This function initializes the TwoHiddenLayerNeuralNetwork class with random + weights for every layer and initializes predicted output with zeroes. + + input_array : input values for training the neural network (i.e training data) . + output_array : expected output values of the given inputs. + """ + + # Input values provided for training the model. + self.input_array = input_array + + # Random initial weights are assigned where first argument is the + # number of nodes in previous layer and second argument is the + # number of nodes in the next layer. + + # Random initial weights are assigned. + # self.input_array.shape[1] is used to represent number of nodes in input layer. + # First hidden layer consists of 4 nodes. + self.input_layer_and_first_hidden_layer_weights = numpy.random.rand( + self.input_array.shape[1], 4 + ) + + # Random initial values for the first hidden layer. + # First hidden layer has 4 nodes. + # Second hidden layer has 3 nodes. + self.first_hidden_layer_and_second_hidden_layer_weights = numpy.random.rand( + 4, 3 + ) + + # Random initial values for the second hidden layer. + # Second hidden layer has 3 nodes. + # Output layer has 1 node. + self.second_hidden_layer_and_output_layer_weights = numpy.random.rand(3, 1) + + # Real output values provided. + self.output_array = output_array + + # Predicted output values by the neural network. + # Predicted_output array initially consists of zeroes. + self.predicted_output = numpy.zeros(output_array.shape) + + def feedforward(self) -> numpy.ndarray: + """ + The information moves in only one direction i.e. forward from the input nodes, + through the two hidden nodes and to the output nodes. + There are no cycles or loops in the network. + + Return layer_between_second_hidden_layer_and_output + (i.e the last layer of the neural network). + + >>> input_val = numpy.array(([0, 0, 0], [0, 0, 0], [0, 0, 0]), dtype=float) + >>> output_val = numpy.array(([0], [0], [0]), dtype=float) + >>> nn = TwoHiddenLayerNeuralNetwork(input_val, output_val) + >>> res = nn.feedforward() + >>> array_sum = numpy.sum(res) + >>> numpy.isnan(array_sum) + False + """ + # Layer_between_input_and_first_hidden_layer is the layer connecting the + # input nodes with the first hidden layer nodes. + self.layer_between_input_and_first_hidden_layer = sigmoid( + numpy.dot(self.input_array, self.input_layer_and_first_hidden_layer_weights) + ) + + # layer_between_first_hidden_layer_and_second_hidden_layer is the layer + # connecting the first hidden set of nodes with the second hidden set of nodes. + self.layer_between_first_hidden_layer_and_second_hidden_layer = sigmoid( + numpy.dot( + self.layer_between_input_and_first_hidden_layer, + self.first_hidden_layer_and_second_hidden_layer_weights, + ) + ) + + # layer_between_second_hidden_layer_and_output is the layer connecting + # second hidden layer with the output node. + self.layer_between_second_hidden_layer_and_output = sigmoid( + numpy.dot( + self.layer_between_first_hidden_layer_and_second_hidden_layer, + self.second_hidden_layer_and_output_layer_weights, + ) + ) + + return self.layer_between_second_hidden_layer_and_output + + def back_propagation(self) -> None: + """ + Function for fine-tuning the weights of the neural net based on the + error rate obtained in the previous epoch (i.e., iteration). + Updation is done using derivative of sogmoid activation function. + + >>> input_val = numpy.array(([0, 0, 0], [0, 0, 0], [0, 0, 0]), dtype=float) + >>> output_val = numpy.array(([0], [0], [0]), dtype=float) + >>> nn = TwoHiddenLayerNeuralNetwork(input_val, output_val) + >>> res = nn.feedforward() + >>> nn.back_propagation() + >>> updated_weights = nn.second_hidden_layer_and_output_layer_weights + >>> (res == updated_weights).all() + False + """ + + updated_second_hidden_layer_and_output_layer_weights = numpy.dot( + self.layer_between_first_hidden_layer_and_second_hidden_layer.T, + 2 + * (self.output_array - self.predicted_output) + * sigmoid_derivative(self.predicted_output), + ) + updated_first_hidden_layer_and_second_hidden_layer_weights = numpy.dot( + self.layer_between_input_and_first_hidden_layer.T, + numpy.dot( + 2 + * (self.output_array - self.predicted_output) + * sigmoid_derivative(self.predicted_output), + self.second_hidden_layer_and_output_layer_weights.T, + ) + * sigmoid_derivative( + self.layer_between_first_hidden_layer_and_second_hidden_layer + ), + ) + updated_input_layer_and_first_hidden_layer_weights = numpy.dot( + self.input_array.T, + numpy.dot( + numpy.dot( + 2 + * (self.output_array - self.predicted_output) + * sigmoid_derivative(self.predicted_output), + self.second_hidden_layer_and_output_layer_weights.T, + ) + * sigmoid_derivative( + self.layer_between_first_hidden_layer_and_second_hidden_layer + ), + self.first_hidden_layer_and_second_hidden_layer_weights.T, + ) + * sigmoid_derivative(self.layer_between_input_and_first_hidden_layer), + ) + + self.input_layer_and_first_hidden_layer_weights += ( + updated_input_layer_and_first_hidden_layer_weights + ) + self.first_hidden_layer_and_second_hidden_layer_weights += ( + updated_first_hidden_layer_and_second_hidden_layer_weights + ) + self.second_hidden_layer_and_output_layer_weights += ( + updated_second_hidden_layer_and_output_layer_weights + ) + + def train(self, output: numpy.ndarray, iterations: int, give_loss: bool) -> None: + """ + Performs the feedforwarding and back propagation process for the + given number of iterations. + Every iteration will update the weights of neural network. + + output : real output values,required for calculating loss. + iterations : number of times the weights are to be updated. + give_loss : boolean value, If True then prints loss for each iteration, + If False then nothing is printed + + >>> input_val = numpy.array(([0, 0, 0], [0, 1, 0], [0, 0, 1]), dtype=float) + >>> output_val = numpy.array(([0], [1], [1]), dtype=float) + >>> nn = TwoHiddenLayerNeuralNetwork(input_val, output_val) + >>> first_iteration_weights = nn.feedforward() + >>> nn.back_propagation() + >>> updated_weights = nn.second_hidden_layer_and_output_layer_weights + >>> (first_iteration_weights == updated_weights).all() + False + """ + for iteration in range(1, iterations + 1): + self.output = self.feedforward() + self.back_propagation() + if give_loss: + loss = numpy.mean(numpy.square(output - self.feedforward())) + print(f"Iteration {iteration} Loss: {loss}") + + def predict(self, input: numpy.ndarray) -> int: + """ + Predict's the output for the given input values using + the trained neural network. + + The output value given by the model ranges in-between 0 and 1. + The predict function returns 1 if the model value is greater + than the threshold value else returns 0, + as the real output values are in binary. + + >>> input_val = numpy.array(([0, 0, 0], [0, 1, 0], [0, 0, 1]), dtype=float) + >>> output_val = numpy.array(([0], [1], [1]), dtype=float) + >>> nn = TwoHiddenLayerNeuralNetwork(input_val, output_val) + >>> nn.train(output_val, 1000, False) + >>> nn.predict([0,1,0]) in (0, 1) + True + """ + + # Input values for which the predictions are to be made. + self.array = input + + self.layer_between_input_and_first_hidden_layer = sigmoid( + numpy.dot(self.array, self.input_layer_and_first_hidden_layer_weights) + ) + + self.layer_between_first_hidden_layer_and_second_hidden_layer = sigmoid( + numpy.dot( + self.layer_between_input_and_first_hidden_layer, + self.first_hidden_layer_and_second_hidden_layer_weights, + ) + ) + + self.layer_between_second_hidden_layer_and_output = sigmoid( + numpy.dot( + self.layer_between_first_hidden_layer_and_second_hidden_layer, + self.second_hidden_layer_and_output_layer_weights, + ) + ) + + return int(self.layer_between_second_hidden_layer_and_output > 0.6) + + +def sigmoid(value: numpy.ndarray) -> numpy.ndarray: + """ + Applies sigmoid activation function. + + return normalized values + + >>> sigmoid(numpy.array(([1, 0, 2], [1, 0, 0]), dtype=numpy.float64)) + array([[0.73105858, 0.5 , 0.88079708], + [0.73105858, 0.5 , 0.5 ]]) + """ + return 1 / (1 + numpy.exp(-value)) + + +def sigmoid_derivative(value: numpy.ndarray) -> numpy.ndarray: + """ + Provides the derivative value of the sigmoid function. + + returns derivative of the sigmoid value + + >>> sigmoid_derivative(numpy.array(([1, 0, 2], [1, 0, 0]), dtype=numpy.float64)) + array([[ 0., 0., -2.], + [ 0., 0., 0.]]) + """ + return (value) * (1 - (value)) + + +def example() -> int: + """ + Example for "how to use the neural network class and use the + respected methods for the desired output". + Calls the TwoHiddenLayerNeuralNetwork class and + provides the fixed input output values to the model. + Model is trained for a fixed amount of iterations then the predict method is called. + In this example the output is divided into 2 classes i.e. binary classification, + the two classes are represented by '0' and '1'. + + >>> example() in (0, 1) + True + """ + # Input values. + input = numpy.array( + ( + [0, 0, 0], + [0, 0, 1], + [0, 1, 0], + [0, 1, 1], + [1, 0, 0], + [1, 0, 1], + [1, 1, 0], + [1, 1, 1], + ), + dtype=numpy.float64, + ) + + # True output values for the given input values. + output = numpy.array(([0], [1], [1], [0], [1], [0], [0], [1]), dtype=numpy.float64) + + # Calling neural network class. + neural_network = TwoHiddenLayerNeuralNetwork(input_array=input, output_array=output) + + # Calling training function. + # Set give_loss to True if you want to see loss in every iteration. + neural_network.train(output=output, iterations=10, give_loss=False) + + return neural_network.predict(numpy.array(([1, 1, 1]), dtype=numpy.float64)) + + +if __name__ == "__main__": + example() diff --git a/python-mega-algo/neural_network/__init__.py b/python-mega-algo/neural_network/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/neural_network/back_propagation_neural_network.py b/python-mega-algo/neural_network/back_propagation_neural_network.py new file mode 100644 index 00000000..43e796e7 --- /dev/null +++ b/python-mega-algo/neural_network/back_propagation_neural_network.py @@ -0,0 +1,199 @@ +#!/usr/bin/python + +""" + +A Framework of Back Propagation Neural Network(BP) model + +Easy to use: + * add many layers as you want ï¼ï¼ï¼ + * clearly see how the loss decreasing +Easy to expand: + * more activation functions + * more loss functions + * more optimization method + +Author: Stephen Lee +Github : https://github.com/RiptideBo +Date: 2017.11.23 + +""" +import numpy as np +from matplotlib import pyplot as plt + + +def sigmoid(x): + return 1 / (1 + np.exp(-1 * x)) + + +class DenseLayer: + """ + Layers of BP neural network + """ + + def __init__( + self, units, activation=None, learning_rate=None, is_input_layer=False + ): + """ + common connected layer of bp network + :param units: numbers of neural units + :param activation: activation function + :param learning_rate: learning rate for paras + :param is_input_layer: whether it is input layer or not + """ + self.units = units + self.weight = None + self.bias = None + self.activation = activation + if learning_rate is None: + learning_rate = 0.3 + self.learn_rate = learning_rate + self.is_input_layer = is_input_layer + + def initializer(self, back_units): + self.weight = np.asmatrix(np.random.normal(0, 0.5, (self.units, back_units))) + self.bias = np.asmatrix(np.random.normal(0, 0.5, self.units)).T + if self.activation is None: + self.activation = sigmoid + + def cal_gradient(self): + # activation function may be sigmoid or linear + if self.activation == sigmoid: + gradient_mat = np.dot(self.output, (1 - self.output).T) + gradient_activation = np.diag(np.diag(gradient_mat)) + else: + gradient_activation = 1 + return gradient_activation + + def forward_propagation(self, xdata): + self.xdata = xdata + if self.is_input_layer: + # input layer + self.wx_plus_b = xdata + self.output = xdata + return xdata + else: + self.wx_plus_b = np.dot(self.weight, self.xdata) - self.bias + self.output = self.activation(self.wx_plus_b) + return self.output + + def back_propagation(self, gradient): + gradient_activation = self.cal_gradient() # i * i ç»´ + gradient = np.asmatrix(np.dot(gradient.T, gradient_activation)) + + self._gradient_weight = np.asmatrix(self.xdata) + self._gradient_bias = -1 + self._gradient_x = self.weight + + self.gradient_weight = np.dot(gradient.T, self._gradient_weight.T) + self.gradient_bias = gradient * self._gradient_bias + self.gradient = np.dot(gradient, self._gradient_x).T + # upgrade: the Negative gradient direction + self.weight = self.weight - self.learn_rate * self.gradient_weight + self.bias = self.bias - self.learn_rate * self.gradient_bias.T + # updates the weights and bias according to learning rate (0.3 if undefined) + return self.gradient + + +class BPNN: + """ + Back Propagation Neural Network model + """ + + def __init__(self): + self.layers = [] + self.train_mse = [] + self.fig_loss = plt.figure() + self.ax_loss = self.fig_loss.add_subplot(1, 1, 1) + + def add_layer(self, layer): + self.layers.append(layer) + + def build(self): + for i, layer in enumerate(self.layers[:]): + if i < 1: + layer.is_input_layer = True + else: + layer.initializer(self.layers[i - 1].units) + + def summary(self): + for i, layer in enumerate(self.layers[:]): + print("------- layer %d -------" % i) + print("weight.shape ", np.shape(layer.weight)) + print("bias.shape ", np.shape(layer.bias)) + + def train(self, xdata, ydata, train_round, accuracy): + self.train_round = train_round + self.accuracy = accuracy + + self.ax_loss.hlines(self.accuracy, 0, self.train_round * 1.1) + + x_shape = np.shape(xdata) + for round_i in range(train_round): + all_loss = 0 + for row in range(x_shape[0]): + _xdata = np.asmatrix(xdata[row, :]).T + _ydata = np.asmatrix(ydata[row, :]).T + + # forward propagation + for layer in self.layers: + _xdata = layer.forward_propagation(_xdata) + + loss, gradient = self.cal_loss(_ydata, _xdata) + all_loss = all_loss + loss + + # back propagation: the input_layer does not upgrade + for layer in self.layers[:0:-1]: + gradient = layer.back_propagation(gradient) + + mse = all_loss / x_shape[0] + self.train_mse.append(mse) + + self.plot_loss() + + if mse < self.accuracy: + print("----达到精度----") + return mse + + def cal_loss(self, ydata, ydata_): + self.loss = np.sum(np.power((ydata - ydata_), 2)) + self.loss_gradient = 2 * (ydata_ - ydata) + # vector (shape is the same as _ydata.shape) + return self.loss, self.loss_gradient + + def plot_loss(self): + if self.ax_loss.lines: + self.ax_loss.lines.remove(self.ax_loss.lines[0]) + self.ax_loss.plot(self.train_mse, "r-") + plt.ion() + plt.xlabel("step") + plt.ylabel("loss") + plt.show() + plt.pause(0.1) + + +def example(): + x = np.random.randn(10, 10) + y = np.asarray( + [ + [0.8, 0.4], + [0.4, 0.3], + [0.34, 0.45], + [0.67, 0.32], + [0.88, 0.67], + [0.78, 0.77], + [0.55, 0.66], + [0.55, 0.43], + [0.54, 0.1], + [0.1, 0.5], + ] + ) + model = BPNN() + for i in (10, 20, 30, 2): + model.add_layer(DenseLayer(i)) + model.build() + model.summary() + model.train(xdata=x, ydata=y, train_round=100, accuracy=0.01) + + +if __name__ == "__main__": + example() diff --git a/python-mega-algo/neural_network/convolution_neural_network.py b/python-mega-algo/neural_network/convolution_neural_network.py new file mode 100644 index 00000000..d8214880 --- /dev/null +++ b/python-mega-algo/neural_network/convolution_neural_network.py @@ -0,0 +1,355 @@ +""" + - - - - - -- - - - - - - - - - - - - - - - - - - - - - - + Name - - CNN - Convolution Neural Network For Photo Recognizing + Goal - - Recognize Handing Writing Word Photo + Detail:Total 5 layers neural network + * Convolution layer + * Pooling layer + * Input layer layer of BP + * Hidden layer of BP + * Output layer of BP + Author: Stephen Lee + Github: 245885195@qq.com + Date: 2017.9.20 + - - - - - -- - - - - - - - - - - - - - - - - - - - - - - +""" +import pickle + +import numpy as np +from matplotlib import pyplot as plt + + +class CNN: + def __init__( + self, conv1_get, size_p1, bp_num1, bp_num2, bp_num3, rate_w=0.2, rate_t=0.2 + ): + """ + :param conv1_get: [a,c,d],size, number, step of convolution kernel + :param size_p1: pooling size + :param bp_num1: units number of flatten layer + :param bp_num2: units number of hidden layer + :param bp_num3: units number of output layer + :param rate_w: rate of weight learning + :param rate_t: rate of threshold learning + """ + self.num_bp1 = bp_num1 + self.num_bp2 = bp_num2 + self.num_bp3 = bp_num3 + self.conv1 = conv1_get[:2] + self.step_conv1 = conv1_get[2] + self.size_pooling1 = size_p1 + self.rate_weight = rate_w + self.rate_thre = rate_t + self.w_conv1 = [ + np.mat(-1 * np.random.rand(self.conv1[0], self.conv1[0]) + 0.5) + for i in range(self.conv1[1]) + ] + self.wkj = np.mat(-1 * np.random.rand(self.num_bp3, self.num_bp2) + 0.5) + self.vji = np.mat(-1 * np.random.rand(self.num_bp2, self.num_bp1) + 0.5) + self.thre_conv1 = -2 * np.random.rand(self.conv1[1]) + 1 + self.thre_bp2 = -2 * np.random.rand(self.num_bp2) + 1 + self.thre_bp3 = -2 * np.random.rand(self.num_bp3) + 1 + + def save_model(self, save_path): + # save model dict with pickle + model_dic = { + "num_bp1": self.num_bp1, + "num_bp2": self.num_bp2, + "num_bp3": self.num_bp3, + "conv1": self.conv1, + "step_conv1": self.step_conv1, + "size_pooling1": self.size_pooling1, + "rate_weight": self.rate_weight, + "rate_thre": self.rate_thre, + "w_conv1": self.w_conv1, + "wkj": self.wkj, + "vji": self.vji, + "thre_conv1": self.thre_conv1, + "thre_bp2": self.thre_bp2, + "thre_bp3": self.thre_bp3, + } + with open(save_path, "wb") as f: + pickle.dump(model_dic, f) + + print("Model saved: %s" % save_path) + + @classmethod + def ReadModel(cls, model_path): + # read saved model + with open(model_path, "rb") as f: + model_dic = pickle.load(f) + + conv_get = model_dic.get("conv1") + conv_get.append(model_dic.get("step_conv1")) + size_p1 = model_dic.get("size_pooling1") + bp1 = model_dic.get("num_bp1") + bp2 = model_dic.get("num_bp2") + bp3 = model_dic.get("num_bp3") + r_w = model_dic.get("rate_weight") + r_t = model_dic.get("rate_thre") + # create model instance + conv_ins = CNN(conv_get, size_p1, bp1, bp2, bp3, r_w, r_t) + # modify model parameter + conv_ins.w_conv1 = model_dic.get("w_conv1") + conv_ins.wkj = model_dic.get("wkj") + conv_ins.vji = model_dic.get("vji") + conv_ins.thre_conv1 = model_dic.get("thre_conv1") + conv_ins.thre_bp2 = model_dic.get("thre_bp2") + conv_ins.thre_bp3 = model_dic.get("thre_bp3") + return conv_ins + + def sig(self, x): + return 1 / (1 + np.exp(-1 * x)) + + def do_round(self, x): + return round(x, 3) + + def convolute(self, data, convs, w_convs, thre_convs, conv_step): + # convolution process + size_conv = convs[0] + num_conv = convs[1] + size_data = np.shape(data)[0] + # get the data slice of original image data, data_focus + data_focus = [] + for i_focus in range(0, size_data - size_conv + 1, conv_step): + for j_focus in range(0, size_data - size_conv + 1, conv_step): + focus = data[ + i_focus : i_focus + size_conv, j_focus : j_focus + size_conv + ] + data_focus.append(focus) + # calculate the feature map of every single kernel, and saved as list of matrix + data_featuremap = [] + Size_FeatureMap = int((size_data - size_conv) / conv_step + 1) + for i_map in range(num_conv): + featuremap = [] + for i_focus in range(len(data_focus)): + net_focus = ( + np.sum(np.multiply(data_focus[i_focus], w_convs[i_map])) + - thre_convs[i_map] + ) + featuremap.append(self.sig(net_focus)) + featuremap = np.asmatrix(featuremap).reshape( + Size_FeatureMap, Size_FeatureMap + ) + data_featuremap.append(featuremap) + + # expanding the data slice to One dimenssion + focus1_list = [] + for each_focus in data_focus: + focus1_list.extend(self.Expand_Mat(each_focus)) + focus_list = np.asarray(focus1_list) + return focus_list, data_featuremap + + def pooling(self, featuremaps, size_pooling, type="average_pool"): + # pooling process + size_map = len(featuremaps[0]) + size_pooled = int(size_map / size_pooling) + featuremap_pooled = [] + for i_map in range(len(featuremaps)): + map = featuremaps[i_map] + map_pooled = [] + for i_focus in range(0, size_map, size_pooling): + for j_focus in range(0, size_map, size_pooling): + focus = map[ + i_focus : i_focus + size_pooling, + j_focus : j_focus + size_pooling, + ] + if type == "average_pool": + # average pooling + map_pooled.append(np.average(focus)) + elif type == "max_pooling": + # max pooling + map_pooled.append(np.max(focus)) + map_pooled = np.asmatrix(map_pooled).reshape(size_pooled, size_pooled) + featuremap_pooled.append(map_pooled) + return featuremap_pooled + + def _expand(self, data): + # expanding three dimension data to one dimension list + data_expanded = [] + for i in range(len(data)): + shapes = np.shape(data[i]) + data_listed = data[i].reshape(1, shapes[0] * shapes[1]) + data_listed = data_listed.getA().tolist()[0] + data_expanded.extend(data_listed) + data_expanded = np.asarray(data_expanded) + return data_expanded + + def _expand_mat(self, data_mat): + # expanding matrix to one dimension list + data_mat = np.asarray(data_mat) + shapes = np.shape(data_mat) + data_expanded = data_mat.reshape(1, shapes[0] * shapes[1]) + return data_expanded + + def _calculate_gradient_from_pool( + self, out_map, pd_pool, num_map, size_map, size_pooling + ): + """ + calculate the gradient from the data slice of pool layer + pd_pool: list of matrix + out_map: the shape of data slice(size_map*size_map) + return: pd_all: list of matrix, [num, size_map, size_map] + """ + pd_all = [] + i_pool = 0 + for i_map in range(num_map): + pd_conv1 = np.ones((size_map, size_map)) + for i in range(0, size_map, size_pooling): + for j in range(0, size_map, size_pooling): + pd_conv1[i : i + size_pooling, j : j + size_pooling] = pd_pool[ + i_pool + ] + i_pool = i_pool + 1 + pd_conv2 = np.multiply( + pd_conv1, np.multiply(out_map[i_map], (1 - out_map[i_map])) + ) + pd_all.append(pd_conv2) + return pd_all + + def train( + self, patterns, datas_train, datas_teach, n_repeat, error_accuracy, draw_e=bool + ): + # model traning + print("----------------------Start Training-------------------------") + print((" - - Shape: Train_Data ", np.shape(datas_train))) + print((" - - Shape: Teach_Data ", np.shape(datas_teach))) + rp = 0 + all_mse = [] + mse = 10000 + while rp < n_repeat and mse >= error_accuracy: + error_count = 0 + print("-------------Learning Time %d--------------" % rp) + for p in range(len(datas_train)): + # print('------------Learning Image: %d--------------'%p) + data_train = np.asmatrix(datas_train[p]) + data_teach = np.asarray(datas_teach[p]) + data_focus1, data_conved1 = self.convolute( + data_train, + self.conv1, + self.w_conv1, + self.thre_conv1, + conv_step=self.step_conv1, + ) + data_pooled1 = self.pooling(data_conved1, self.size_pooling1) + shape_featuremap1 = np.shape(data_conved1) + """ + print(' -----original shape ', np.shape(data_train)) + print(' ---- after convolution ',np.shape(data_conv1)) + print(' -----after pooling ',np.shape(data_pooled1)) + """ + data_bp_input = self._expand(data_pooled1) + bp_out1 = data_bp_input + + bp_net_j = np.dot(bp_out1, self.vji.T) - self.thre_bp2 + bp_out2 = self.sig(bp_net_j) + bp_net_k = np.dot(bp_out2, self.wkj.T) - self.thre_bp3 + bp_out3 = self.sig(bp_net_k) + + # --------------Model Leaning ------------------------ + # calculate error and gradient--------------- + pd_k_all = np.multiply( + (data_teach - bp_out3), np.multiply(bp_out3, (1 - bp_out3)) + ) + pd_j_all = np.multiply( + np.dot(pd_k_all, self.wkj), np.multiply(bp_out2, (1 - bp_out2)) + ) + pd_i_all = np.dot(pd_j_all, self.vji) + + pd_conv1_pooled = pd_i_all / (self.size_pooling1 * self.size_pooling1) + pd_conv1_pooled = pd_conv1_pooled.T.getA().tolist() + pd_conv1_all = self._calculate_gradient_from_pool( + data_conved1, + pd_conv1_pooled, + shape_featuremap1[0], + shape_featuremap1[1], + self.size_pooling1, + ) + # weight and threshold learning process--------- + # convolution layer + for k_conv in range(self.conv1[1]): + pd_conv_list = self._expand_mat(pd_conv1_all[k_conv]) + delta_w = self.rate_weight * np.dot(pd_conv_list, data_focus1) + + self.w_conv1[k_conv] = self.w_conv1[k_conv] + delta_w.reshape( + (self.conv1[0], self.conv1[0]) + ) + + self.thre_conv1[k_conv] = ( + self.thre_conv1[k_conv] + - np.sum(pd_conv1_all[k_conv]) * self.rate_thre + ) + # all connected layer + self.wkj = self.wkj + pd_k_all.T * bp_out2 * self.rate_weight + self.vji = self.vji + pd_j_all.T * bp_out1 * self.rate_weight + self.thre_bp3 = self.thre_bp3 - pd_k_all * self.rate_thre + self.thre_bp2 = self.thre_bp2 - pd_j_all * self.rate_thre + # calculate the sum error of all single image + errors = np.sum(abs(data_teach - bp_out3)) + error_count += errors + # print(' ----Teach ',data_teach) + # print(' ----BP_output ',bp_out3) + rp = rp + 1 + mse = error_count / patterns + all_mse.append(mse) + + def draw_error(): + yplot = [error_accuracy for i in range(int(n_repeat * 1.2))] + plt.plot(all_mse, "+-") + plt.plot(yplot, "r--") + plt.xlabel("Learning Times") + plt.ylabel("All_mse") + plt.grid(True, alpha=0.5) + plt.show() + + print("------------------Training Complished---------------------") + print((" - - Training epoch: ", rp, " - - Mse: %.6f" % mse)) + if draw_e: + draw_error() + return mse + + def predict(self, datas_test): + # model predict + produce_out = [] + print("-------------------Start Testing-------------------------") + print((" - - Shape: Test_Data ", np.shape(datas_test))) + for p in range(len(datas_test)): + data_test = np.asmatrix(datas_test[p]) + data_focus1, data_conved1 = self.convolute( + data_test, + self.conv1, + self.w_conv1, + self.thre_conv1, + conv_step=self.step_conv1, + ) + data_pooled1 = self.pooling(data_conved1, self.size_pooling1) + data_bp_input = self._expand(data_pooled1) + + bp_out1 = data_bp_input + bp_net_j = bp_out1 * self.vji.T - self.thre_bp2 + bp_out2 = self.sig(bp_net_j) + bp_net_k = bp_out2 * self.wkj.T - self.thre_bp3 + bp_out3 = self.sig(bp_net_k) + produce_out.extend(bp_out3.getA().tolist()) + res = [list(map(self.do_round, each)) for each in produce_out] + return np.asarray(res) + + def convolution(self, data): + # return the data of image after convoluting process so we can check it out + data_test = np.asmatrix(data) + data_focus1, data_conved1 = self.convolute( + data_test, + self.conv1, + self.w_conv1, + self.thre_conv1, + conv_step=self.step_conv1, + ) + data_pooled1 = self.pooling(data_conved1, self.size_pooling1) + + return data_conved1, data_pooled1 + + +if __name__ == "__main__": + """ + I will put the example on other file + """ diff --git a/python-mega-algo/neural_network/gan.py_tf b/python-mega-algo/neural_network/gan.py_tf new file mode 100644 index 00000000..deb062c4 --- /dev/null +++ b/python-mega-algo/neural_network/gan.py_tf @@ -0,0 +1,506 @@ +import matplotlib.gridspec as gridspec +import matplotlib.pyplot as plt +import numpy as np +from sklearn.utils import shuffle +import input_data + +random_numer = 42 + +np.random.seed(random_numer) + + +def ReLu(x): + mask = (x > 0) * 1.0 + return mask * x + + +def d_ReLu(x): + mask = (x > 0) * 1.0 + return mask + + +def arctan(x): + return np.arctan(x) + + +def d_arctan(x): + return 1 / (1 + x ** 2) + + +def log(x): + return 1 / (1 + np.exp(-1 * x)) + + +def d_log(x): + return log(x) * (1 - log(x)) + + +def tanh(x): + return np.tanh(x) + + +def d_tanh(x): + return 1 - np.tanh(x) ** 2 + + +def plot(samples): + fig = plt.figure(figsize=(4, 4)) + gs = gridspec.GridSpec(4, 4) + gs.update(wspace=0.05, hspace=0.05) + + for i, sample in enumerate(samples): + ax = plt.subplot(gs[i]) + plt.axis("off") + ax.set_xticklabels([]) + ax.set_yticklabels([]) + ax.set_aspect("equal") + plt.imshow(sample.reshape(28, 28), cmap="Greys_r") + + return fig + + +if __name__ == "__main__": + # 1. Load Data and declare hyper + print("--------- Load Data ----------") + mnist = input_data.read_data_sets("MNIST_data", one_hot=False) + temp = mnist.test + images, labels = temp.images, temp.labels + images, labels = shuffle(np.asarray(images), np.asarray(labels)) + num_epoch = 10 + learing_rate = 0.00009 + G_input = 100 + hidden_input, hidden_input2, hidden_input3 = 128, 256, 346 + hidden_input4, hidden_input5, hidden_input6 = 480, 560, 686 + + print("--------- Declare Hyper Parameters ----------") + # 2. Declare Weights + D_W1 = ( + np.random.normal(size=(784, hidden_input), scale=(1.0 / np.sqrt(784 / 2.0))) + * 0.002 + ) + # D_b1 = np.random.normal(size=(128),scale=(1. / np.sqrt(128 / 2.))) *0.002 + D_b1 = np.zeros(hidden_input) + + D_W2 = ( + np.random.normal( + size=(hidden_input, 1), scale=(1.0 / np.sqrt(hidden_input / 2.0)) + ) + * 0.002 + ) + # D_b2 = np.random.normal(size=(1),scale=(1. / np.sqrt(1 / 2.))) *0.002 + D_b2 = np.zeros(1) + + G_W1 = ( + np.random.normal( + size=(G_input, hidden_input), scale=(1.0 / np.sqrt(G_input / 2.0)) + ) + * 0.002 + ) + # G_b1 = np.random.normal(size=(128),scale=(1. / np.sqrt(128 / 2.))) *0.002 + G_b1 = np.zeros(hidden_input) + + G_W2 = ( + np.random.normal( + size=(hidden_input, hidden_input2), + scale=(1.0 / np.sqrt(hidden_input / 2.0)), + ) + * 0.002 + ) + # G_b1 = np.random.normal(size=(128),scale=(1. / np.sqrt(128 / 2.))) *0.002 + G_b2 = np.zeros(hidden_input2) + + G_W3 = ( + np.random.normal( + size=(hidden_input2, hidden_input3), + scale=(1.0 / np.sqrt(hidden_input2 / 2.0)), + ) + * 0.002 + ) + # G_b1 = np.random.normal(size=(128),scale=(1. / np.sqrt(128 / 2.))) *0.002 + G_b3 = np.zeros(hidden_input3) + + G_W4 = ( + np.random.normal( + size=(hidden_input3, hidden_input4), + scale=(1.0 / np.sqrt(hidden_input3 / 2.0)), + ) + * 0.002 + ) + # G_b1 = np.random.normal(size=(128),scale=(1. / np.sqrt(128 / 2.))) *0.002 + G_b4 = np.zeros(hidden_input4) + + G_W5 = ( + np.random.normal( + size=(hidden_input4, hidden_input5), + scale=(1.0 / np.sqrt(hidden_input4 / 2.0)), + ) + * 0.002 + ) + # G_b1 = np.random.normal(size=(128),scale=(1. / np.sqrt(128 / 2.))) *0.002 + G_b5 = np.zeros(hidden_input5) + + G_W6 = ( + np.random.normal( + size=(hidden_input5, hidden_input6), + scale=(1.0 / np.sqrt(hidden_input5 / 2.0)), + ) + * 0.002 + ) + # G_b1 = np.random.normal(size=(128),scale=(1. / np.sqrt(128 / 2.))) *0.002 + G_b6 = np.zeros(hidden_input6) + + G_W7 = ( + np.random.normal( + size=(hidden_input6, 784), scale=(1.0 / np.sqrt(hidden_input6 / 2.0)) + ) + * 0.002 + ) + # G_b2 = np.random.normal(size=(784),scale=(1. / np.sqrt(784 / 2.))) *0.002 + G_b7 = np.zeros(784) + + # 3. For Adam Optimzier + v1, m1 = 0, 0 + v2, m2 = 0, 0 + v3, m3 = 0, 0 + v4, m4 = 0, 0 + + v5, m5 = 0, 0 + v6, m6 = 0, 0 + v7, m7 = 0, 0 + v8, m8 = 0, 0 + v9, m9 = 0, 0 + v10, m10 = 0, 0 + v11, m11 = 0, 0 + v12, m12 = 0, 0 + + v13, m13 = 0, 0 + v14, m14 = 0, 0 + + v15, m15 = 0, 0 + v16, m16 = 0, 0 + + v17, m17 = 0, 0 + v18, m18 = 0, 0 + + beta_1, beta_2, eps = 0.9, 0.999, 0.00000001 + + print("--------- Started Training ----------") + for iter in range(num_epoch): + + random_int = np.random.randint(len(images) - 5) + current_image = np.expand_dims(images[random_int], axis=0) + + # Func: Generate The first Fake Data + Z = np.random.uniform(-1.0, 1.0, size=[1, G_input]) + Gl1 = Z.dot(G_W1) + G_b1 + Gl1A = arctan(Gl1) + Gl2 = Gl1A.dot(G_W2) + G_b2 + Gl2A = ReLu(Gl2) + Gl3 = Gl2A.dot(G_W3) + G_b3 + Gl3A = arctan(Gl3) + + Gl4 = Gl3A.dot(G_W4) + G_b4 + Gl4A = ReLu(Gl4) + Gl5 = Gl4A.dot(G_W5) + G_b5 + Gl5A = tanh(Gl5) + Gl6 = Gl5A.dot(G_W6) + G_b6 + Gl6A = ReLu(Gl6) + Gl7 = Gl6A.dot(G_W7) + G_b7 + + current_fake_data = log(Gl7) + + # Func: Forward Feed for Real data + Dl1_r = current_image.dot(D_W1) + D_b1 + Dl1_rA = ReLu(Dl1_r) + Dl2_r = Dl1_rA.dot(D_W2) + D_b2 + Dl2_rA = log(Dl2_r) + + # Func: Forward Feed for Fake Data + Dl1_f = current_fake_data.dot(D_W1) + D_b1 + Dl1_fA = ReLu(Dl1_f) + Dl2_f = Dl1_fA.dot(D_W2) + D_b2 + Dl2_fA = log(Dl2_f) + + # Func: Cost D + D_cost = -np.log(Dl2_rA) + np.log(1.0 - Dl2_fA) + + # Func: Gradient + grad_f_w2_part_1 = 1 / (1.0 - Dl2_fA) + grad_f_w2_part_2 = d_log(Dl2_f) + grad_f_w2_part_3 = Dl1_fA + grad_f_w2 = grad_f_w2_part_3.T.dot(grad_f_w2_part_1 * grad_f_w2_part_2) + grad_f_b2 = grad_f_w2_part_1 * grad_f_w2_part_2 + + grad_f_w1_part_1 = (grad_f_w2_part_1 * grad_f_w2_part_2).dot(D_W2.T) + grad_f_w1_part_2 = d_ReLu(Dl1_f) + grad_f_w1_part_3 = current_fake_data + grad_f_w1 = grad_f_w1_part_3.T.dot(grad_f_w1_part_1 * grad_f_w1_part_2) + grad_f_b1 = grad_f_w1_part_1 * grad_f_w1_part_2 + + grad_r_w2_part_1 = -1 / Dl2_rA + grad_r_w2_part_2 = d_log(Dl2_r) + grad_r_w2_part_3 = Dl1_rA + grad_r_w2 = grad_r_w2_part_3.T.dot(grad_r_w2_part_1 * grad_r_w2_part_2) + grad_r_b2 = grad_r_w2_part_1 * grad_r_w2_part_2 + + grad_r_w1_part_1 = (grad_r_w2_part_1 * grad_r_w2_part_2).dot(D_W2.T) + grad_r_w1_part_2 = d_ReLu(Dl1_r) + grad_r_w1_part_3 = current_image + grad_r_w1 = grad_r_w1_part_3.T.dot(grad_r_w1_part_1 * grad_r_w1_part_2) + grad_r_b1 = grad_r_w1_part_1 * grad_r_w1_part_2 + + grad_w1 = grad_f_w1 + grad_r_w1 + grad_b1 = grad_f_b1 + grad_r_b1 + + grad_w2 = grad_f_w2 + grad_r_w2 + grad_b2 = grad_f_b2 + grad_r_b2 + + # ---- Update Gradient ---- + m1 = beta_1 * m1 + (1 - beta_1) * grad_w1 + v1 = beta_2 * v1 + (1 - beta_2) * grad_w1 ** 2 + + m2 = beta_1 * m2 + (1 - beta_1) * grad_b1 + v2 = beta_2 * v2 + (1 - beta_2) * grad_b1 ** 2 + + m3 = beta_1 * m3 + (1 - beta_1) * grad_w2 + v3 = beta_2 * v3 + (1 - beta_2) * grad_w2 ** 2 + + m4 = beta_1 * m4 + (1 - beta_1) * grad_b2 + v4 = beta_2 * v4 + (1 - beta_2) * grad_b2 ** 2 + + D_W1 = D_W1 - (learing_rate / (np.sqrt(v1 / (1 - beta_2)) + eps)) * ( + m1 / (1 - beta_1) + ) + D_b1 = D_b1 - (learing_rate / (np.sqrt(v2 / (1 - beta_2)) + eps)) * ( + m2 / (1 - beta_1) + ) + + D_W2 = D_W2 - (learing_rate / (np.sqrt(v3 / (1 - beta_2)) + eps)) * ( + m3 / (1 - beta_1) + ) + D_b2 = D_b2 - (learing_rate / (np.sqrt(v4 / (1 - beta_2)) + eps)) * ( + m4 / (1 - beta_1) + ) + + # Func: Forward Feed for G + Z = np.random.uniform(-1.0, 1.0, size=[1, G_input]) + Gl1 = Z.dot(G_W1) + G_b1 + Gl1A = arctan(Gl1) + Gl2 = Gl1A.dot(G_W2) + G_b2 + Gl2A = ReLu(Gl2) + Gl3 = Gl2A.dot(G_W3) + G_b3 + Gl3A = arctan(Gl3) + + Gl4 = Gl3A.dot(G_W4) + G_b4 + Gl4A = ReLu(Gl4) + Gl5 = Gl4A.dot(G_W5) + G_b5 + Gl5A = tanh(Gl5) + Gl6 = Gl5A.dot(G_W6) + G_b6 + Gl6A = ReLu(Gl6) + Gl7 = Gl6A.dot(G_W7) + G_b7 + + current_fake_data = log(Gl7) + + Dl1 = current_fake_data.dot(D_W1) + D_b1 + Dl1_A = ReLu(Dl1) + Dl2 = Dl1_A.dot(D_W2) + D_b2 + Dl2_A = log(Dl2) + + # Func: Cost G + G_cost = -np.log(Dl2_A) + + # Func: Gradient + grad_G_w7_part_1 = ((-1 / Dl2_A) * d_log(Dl2).dot(D_W2.T) * (d_ReLu(Dl1))).dot( + D_W1.T + ) + grad_G_w7_part_2 = d_log(Gl7) + grad_G_w7_part_3 = Gl6A + grad_G_w7 = grad_G_w7_part_3.T.dot(grad_G_w7_part_1 * grad_G_w7_part_1) + grad_G_b7 = grad_G_w7_part_1 * grad_G_w7_part_2 + + grad_G_w6_part_1 = (grad_G_w7_part_1 * grad_G_w7_part_2).dot(G_W7.T) + grad_G_w6_part_2 = d_ReLu(Gl6) + grad_G_w6_part_3 = Gl5A + grad_G_w6 = grad_G_w6_part_3.T.dot(grad_G_w6_part_1 * grad_G_w6_part_2) + grad_G_b6 = grad_G_w6_part_1 * grad_G_w6_part_2 + + grad_G_w5_part_1 = (grad_G_w6_part_1 * grad_G_w6_part_2).dot(G_W6.T) + grad_G_w5_part_2 = d_tanh(Gl5) + grad_G_w5_part_3 = Gl4A + grad_G_w5 = grad_G_w5_part_3.T.dot(grad_G_w5_part_1 * grad_G_w5_part_2) + grad_G_b5 = grad_G_w5_part_1 * grad_G_w5_part_2 + + grad_G_w4_part_1 = (grad_G_w5_part_1 * grad_G_w5_part_2).dot(G_W5.T) + grad_G_w4_part_2 = d_ReLu(Gl4) + grad_G_w4_part_3 = Gl3A + grad_G_w4 = grad_G_w4_part_3.T.dot(grad_G_w4_part_1 * grad_G_w4_part_2) + grad_G_b4 = grad_G_w4_part_1 * grad_G_w4_part_2 + + grad_G_w3_part_1 = (grad_G_w4_part_1 * grad_G_w4_part_2).dot(G_W4.T) + grad_G_w3_part_2 = d_arctan(Gl3) + grad_G_w3_part_3 = Gl2A + grad_G_w3 = grad_G_w3_part_3.T.dot(grad_G_w3_part_1 * grad_G_w3_part_2) + grad_G_b3 = grad_G_w3_part_1 * grad_G_w3_part_2 + + grad_G_w2_part_1 = (grad_G_w3_part_1 * grad_G_w3_part_2).dot(G_W3.T) + grad_G_w2_part_2 = d_ReLu(Gl2) + grad_G_w2_part_3 = Gl1A + grad_G_w2 = grad_G_w2_part_3.T.dot(grad_G_w2_part_1 * grad_G_w2_part_2) + grad_G_b2 = grad_G_w2_part_1 * grad_G_w2_part_2 + + grad_G_w1_part_1 = (grad_G_w2_part_1 * grad_G_w2_part_2).dot(G_W2.T) + grad_G_w1_part_2 = d_arctan(Gl1) + grad_G_w1_part_3 = Z + grad_G_w1 = grad_G_w1_part_3.T.dot(grad_G_w1_part_1 * grad_G_w1_part_2) + grad_G_b1 = grad_G_w1_part_1 * grad_G_w1_part_2 + + # ---- Update Gradient ---- + m5 = beta_1 * m5 + (1 - beta_1) * grad_G_w1 + v5 = beta_2 * v5 + (1 - beta_2) * grad_G_w1 ** 2 + + m6 = beta_1 * m6 + (1 - beta_1) * grad_G_b1 + v6 = beta_2 * v6 + (1 - beta_2) * grad_G_b1 ** 2 + + m7 = beta_1 * m7 + (1 - beta_1) * grad_G_w2 + v7 = beta_2 * v7 + (1 - beta_2) * grad_G_w2 ** 2 + + m8 = beta_1 * m8 + (1 - beta_1) * grad_G_b2 + v8 = beta_2 * v8 + (1 - beta_2) * grad_G_b2 ** 2 + + m9 = beta_1 * m9 + (1 - beta_1) * grad_G_w3 + v9 = beta_2 * v9 + (1 - beta_2) * grad_G_w3 ** 2 + + m10 = beta_1 * m10 + (1 - beta_1) * grad_G_b3 + v10 = beta_2 * v10 + (1 - beta_2) * grad_G_b3 ** 2 + + m11 = beta_1 * m11 + (1 - beta_1) * grad_G_w4 + v11 = beta_2 * v11 + (1 - beta_2) * grad_G_w4 ** 2 + + m12 = beta_1 * m12 + (1 - beta_1) * grad_G_b4 + v12 = beta_2 * v12 + (1 - beta_2) * grad_G_b4 ** 2 + + m13 = beta_1 * m13 + (1 - beta_1) * grad_G_w5 + v13 = beta_2 * v13 + (1 - beta_2) * grad_G_w5 ** 2 + + m14 = beta_1 * m14 + (1 - beta_1) * grad_G_b5 + v14 = beta_2 * v14 + (1 - beta_2) * grad_G_b5 ** 2 + + m15 = beta_1 * m15 + (1 - beta_1) * grad_G_w6 + v15 = beta_2 * v15 + (1 - beta_2) * grad_G_w6 ** 2 + + m16 = beta_1 * m16 + (1 - beta_1) * grad_G_b6 + v16 = beta_2 * v16 + (1 - beta_2) * grad_G_b6 ** 2 + + m17 = beta_1 * m17 + (1 - beta_1) * grad_G_w7 + v17 = beta_2 * v17 + (1 - beta_2) * grad_G_w7 ** 2 + + m18 = beta_1 * m18 + (1 - beta_1) * grad_G_b7 + v18 = beta_2 * v18 + (1 - beta_2) * grad_G_b7 ** 2 + + G_W1 = G_W1 - (learing_rate / (np.sqrt(v5 / (1 - beta_2)) + eps)) * ( + m5 / (1 - beta_1) + ) + G_b1 = G_b1 - (learing_rate / (np.sqrt(v6 / (1 - beta_2)) + eps)) * ( + m6 / (1 - beta_1) + ) + + G_W2 = G_W2 - (learing_rate / (np.sqrt(v7 / (1 - beta_2)) + eps)) * ( + m7 / (1 - beta_1) + ) + G_b2 = G_b2 - (learing_rate / (np.sqrt(v8 / (1 - beta_2)) + eps)) * ( + m8 / (1 - beta_1) + ) + + G_W3 = G_W3 - (learing_rate / (np.sqrt(v9 / (1 - beta_2)) + eps)) * ( + m9 / (1 - beta_1) + ) + G_b3 = G_b3 - (learing_rate / (np.sqrt(v10 / (1 - beta_2)) + eps)) * ( + m10 / (1 - beta_1) + ) + + G_W4 = G_W4 - (learing_rate / (np.sqrt(v11 / (1 - beta_2)) + eps)) * ( + m11 / (1 - beta_1) + ) + G_b4 = G_b4 - (learing_rate / (np.sqrt(v12 / (1 - beta_2)) + eps)) * ( + m12 / (1 - beta_1) + ) + + G_W5 = G_W5 - (learing_rate / (np.sqrt(v13 / (1 - beta_2)) + eps)) * ( + m13 / (1 - beta_1) + ) + G_b5 = G_b5 - (learing_rate / (np.sqrt(v14 / (1 - beta_2)) + eps)) * ( + m14 / (1 - beta_1) + ) + + G_W6 = G_W6 - (learing_rate / (np.sqrt(v15 / (1 - beta_2)) + eps)) * ( + m15 / (1 - beta_1) + ) + G_b6 = G_b6 - (learing_rate / (np.sqrt(v16 / (1 - beta_2)) + eps)) * ( + m16 / (1 - beta_1) + ) + + G_W7 = G_W7 - (learing_rate / (np.sqrt(v17 / (1 - beta_2)) + eps)) * ( + m17 / (1 - beta_1) + ) + G_b7 = G_b7 - (learing_rate / (np.sqrt(v18 / (1 - beta_2)) + eps)) * ( + m18 / (1 - beta_1) + ) + + # --- Print Error ---- + # print("Current Iter: ",iter, " Current D cost:",D_cost, " Current G cost: ", G_cost,end='\r') + + if iter == 0: + learing_rate = learing_rate * 0.01 + if iter == 40: + learing_rate = learing_rate * 0.01 + + # ---- Print to Out put ---- + if iter % 10 == 0: + + print( + "Current Iter: ", + iter, + " Current D cost:", + D_cost, + " Current G cost: ", + G_cost, + end="\r", + ) + print("--------- Show Example Result See Tab Above ----------") + print("--------- Wait for the image to load ---------") + Z = np.random.uniform(-1.0, 1.0, size=[16, G_input]) + + Gl1 = Z.dot(G_W1) + G_b1 + Gl1A = arctan(Gl1) + Gl2 = Gl1A.dot(G_W2) + G_b2 + Gl2A = ReLu(Gl2) + Gl3 = Gl2A.dot(G_W3) + G_b3 + Gl3A = arctan(Gl3) + + Gl4 = Gl3A.dot(G_W4) + G_b4 + Gl4A = ReLu(Gl4) + Gl5 = Gl4A.dot(G_W5) + G_b5 + Gl5A = tanh(Gl5) + Gl6 = Gl5A.dot(G_W6) + G_b6 + Gl6A = ReLu(Gl6) + Gl7 = Gl6A.dot(G_W7) + G_b7 + + current_fake_data = log(Gl7) + + fig = plot(current_fake_data) + fig.savefig( + "Click_Me_{}.png".format( + str(iter).zfill(3) + + "_Ginput_" + + str(G_input) + + "_hiddenone" + + str(hidden_input) + + "_hiddentwo" + + str(hidden_input2) + + "_LR_" + + str(learing_rate) + ), + bbox_inches="tight", + ) + # for complete explanation visit https://towardsdatascience.com/only-numpy-implementing-gan-general-adversarial-networks-and-adam-optimizer-using-numpy-with-2a7e4e032021 + # -- end code -- diff --git a/python-mega-algo/neural_network/input_data.py_tf b/python-mega-algo/neural_network/input_data.py_tf new file mode 100644 index 00000000..0e22ac0b --- /dev/null +++ b/python-mega-algo/neural_network/input_data.py_tf @@ -0,0 +1,345 @@ +# Copyright 2016 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Functions for downloading and reading MNIST data (deprecated). + +This module and all its submodules are deprecated. +""" + + +import collections +import gzip +import os + +import numpy +from six.moves import urllib +from six.moves import xrange # pylint: disable=redefined-builtin + +from tensorflow.python.framework import dtypes +from tensorflow.python.framework import random_seed +from tensorflow.python.platform import gfile +from tensorflow.python.util.deprecation import deprecated + +_Datasets = collections.namedtuple("_Datasets", ["train", "validation", "test"]) + +# CVDF mirror of http://yann.lecun.com/exdb/mnist/ +DEFAULT_SOURCE_URL = "https://storage.googleapis.com/cvdf-datasets/mnist/" + + +def _read32(bytestream): + dt = numpy.dtype(numpy.uint32).newbyteorder(">") + return numpy.frombuffer(bytestream.read(4), dtype=dt)[0] + + +@deprecated(None, "Please use tf.data to implement this functionality.") +def _extract_images(f): + """Extract the images into a 4D uint8 numpy array [index, y, x, depth]. + + Args: + f: A file object that can be passed into a gzip reader. + + Returns: + data: A 4D uint8 numpy array [index, y, x, depth]. + + Raises: + ValueError: If the bytestream does not start with 2051. + + """ + print("Extracting", f.name) + with gzip.GzipFile(fileobj=f) as bytestream: + magic = _read32(bytestream) + if magic != 2051: + raise ValueError( + "Invalid magic number %d in MNIST image file: %s" % (magic, f.name) + ) + num_images = _read32(bytestream) + rows = _read32(bytestream) + cols = _read32(bytestream) + buf = bytestream.read(rows * cols * num_images) + data = numpy.frombuffer(buf, dtype=numpy.uint8) + data = data.reshape(num_images, rows, cols, 1) + return data + + +@deprecated(None, "Please use tf.one_hot on tensors.") +def _dense_to_one_hot(labels_dense, num_classes): + """Convert class labels from scalars to one-hot vectors.""" + num_labels = labels_dense.shape[0] + index_offset = numpy.arange(num_labels) * num_classes + labels_one_hot = numpy.zeros((num_labels, num_classes)) + labels_one_hot.flat[index_offset + labels_dense.ravel()] = 1 + return labels_one_hot + + +@deprecated(None, "Please use tf.data to implement this functionality.") +def _extract_labels(f, one_hot=False, num_classes=10): + """Extract the labels into a 1D uint8 numpy array [index]. + + Args: + f: A file object that can be passed into a gzip reader. + one_hot: Does one hot encoding for the result. + num_classes: Number of classes for the one hot encoding. + + Returns: + labels: a 1D uint8 numpy array. + + Raises: + ValueError: If the bystream doesn't start with 2049. + """ + print("Extracting", f.name) + with gzip.GzipFile(fileobj=f) as bytestream: + magic = _read32(bytestream) + if magic != 2049: + raise ValueError( + "Invalid magic number %d in MNIST label file: %s" % (magic, f.name) + ) + num_items = _read32(bytestream) + buf = bytestream.read(num_items) + labels = numpy.frombuffer(buf, dtype=numpy.uint8) + if one_hot: + return _dense_to_one_hot(labels, num_classes) + return labels + + +class _DataSet: + """Container class for a _DataSet (deprecated). + + THIS CLASS IS DEPRECATED. + """ + + @deprecated( + None, + "Please use alternatives such as official/mnist/_DataSet.py" + " from tensorflow/models.", + ) + def __init__( + self, + images, + labels, + fake_data=False, + one_hot=False, + dtype=dtypes.float32, + reshape=True, + seed=None, + ): + """Construct a _DataSet. + + one_hot arg is used only if fake_data is true. `dtype` can be either + `uint8` to leave the input as `[0, 255]`, or `float32` to rescale into + `[0, 1]`. Seed arg provides for convenient deterministic testing. + + Args: + images: The images + labels: The labels + fake_data: Ignore inages and labels, use fake data. + one_hot: Bool, return the labels as one hot vectors (if True) or ints (if + False). + dtype: Output image dtype. One of [uint8, float32]. `uint8` output has + range [0,255]. float32 output has range [0,1]. + reshape: Bool. If True returned images are returned flattened to vectors. + seed: The random seed to use. + """ + seed1, seed2 = random_seed.get_seed(seed) + # If op level seed is not set, use whatever graph level seed is returned + numpy.random.seed(seed1 if seed is None else seed2) + dtype = dtypes.as_dtype(dtype).base_dtype + if dtype not in (dtypes.uint8, dtypes.float32): + raise TypeError("Invalid image dtype %r, expected uint8 or float32" % dtype) + if fake_data: + self._num_examples = 10000 + self.one_hot = one_hot + else: + assert ( + images.shape[0] == labels.shape[0] + ), f"images.shape: {images.shape} labels.shape: {labels.shape}" + self._num_examples = images.shape[0] + + # Convert shape from [num examples, rows, columns, depth] + # to [num examples, rows*columns] (assuming depth == 1) + if reshape: + assert images.shape[3] == 1 + images = images.reshape( + images.shape[0], images.shape[1] * images.shape[2] + ) + if dtype == dtypes.float32: + # Convert from [0, 255] -> [0.0, 1.0]. + images = images.astype(numpy.float32) + images = numpy.multiply(images, 1.0 / 255.0) + self._images = images + self._labels = labels + self._epochs_completed = 0 + self._index_in_epoch = 0 + + @property + def images(self): + return self._images + + @property + def labels(self): + return self._labels + + @property + def num_examples(self): + return self._num_examples + + @property + def epochs_completed(self): + return self._epochs_completed + + def next_batch(self, batch_size, fake_data=False, shuffle=True): + """Return the next `batch_size` examples from this data set.""" + if fake_data: + fake_image = [1] * 784 + if self.one_hot: + fake_label = [1] + [0] * 9 + else: + fake_label = 0 + return ( + [fake_image for _ in xrange(batch_size)], + [fake_label for _ in xrange(batch_size)], + ) + start = self._index_in_epoch + # Shuffle for the first epoch + if self._epochs_completed == 0 and start == 0 and shuffle: + perm0 = numpy.arange(self._num_examples) + numpy.random.shuffle(perm0) + self._images = self.images[perm0] + self._labels = self.labels[perm0] + # Go to the next epoch + if start + batch_size > self._num_examples: + # Finished epoch + self._epochs_completed += 1 + # Get the rest examples in this epoch + rest_num_examples = self._num_examples - start + images_rest_part = self._images[start : self._num_examples] + labels_rest_part = self._labels[start : self._num_examples] + # Shuffle the data + if shuffle: + perm = numpy.arange(self._num_examples) + numpy.random.shuffle(perm) + self._images = self.images[perm] + self._labels = self.labels[perm] + # Start next epoch + start = 0 + self._index_in_epoch = batch_size - rest_num_examples + end = self._index_in_epoch + images_new_part = self._images[start:end] + labels_new_part = self._labels[start:end] + return ( + numpy.concatenate((images_rest_part, images_new_part), axis=0), + numpy.concatenate((labels_rest_part, labels_new_part), axis=0), + ) + else: + self._index_in_epoch += batch_size + end = self._index_in_epoch + return self._images[start:end], self._labels[start:end] + + +@deprecated(None, "Please write your own downloading logic.") +def _maybe_download(filename, work_directory, source_url): + """Download the data from source url, unless it's already here. + + Args: + filename: string, name of the file in the directory. + work_directory: string, path to working directory. + source_url: url to download from if file doesn't exist. + + Returns: + Path to resulting file. + """ + if not gfile.Exists(work_directory): + gfile.MakeDirs(work_directory) + filepath = os.path.join(work_directory, filename) + if not gfile.Exists(filepath): + urllib.request.urlretrieve(source_url, filepath) + with gfile.GFile(filepath) as f: + size = f.size() + print("Successfully downloaded", filename, size, "bytes.") + return filepath + + +@deprecated( + None, "Please use alternatives such as:" " tensorflow_datasets.load('mnist')" +) +def read_data_sets( + train_dir, + fake_data=False, + one_hot=False, + dtype=dtypes.float32, + reshape=True, + validation_size=5000, + seed=None, + source_url=DEFAULT_SOURCE_URL, +): + if fake_data: + + def fake(): + return _DataSet( + [], [], fake_data=True, one_hot=one_hot, dtype=dtype, seed=seed + ) + + train = fake() + validation = fake() + test = fake() + return _Datasets(train=train, validation=validation, test=test) + + if not source_url: # empty string check + source_url = DEFAULT_SOURCE_URL + + train_images_file = "train-images-idx3-ubyte.gz" + train_labels_file = "train-labels-idx1-ubyte.gz" + test_images_file = "t10k-images-idx3-ubyte.gz" + test_labels_file = "t10k-labels-idx1-ubyte.gz" + + local_file = _maybe_download( + train_images_file, train_dir, source_url + train_images_file + ) + with gfile.Open(local_file, "rb") as f: + train_images = _extract_images(f) + + local_file = _maybe_download( + train_labels_file, train_dir, source_url + train_labels_file + ) + with gfile.Open(local_file, "rb") as f: + train_labels = _extract_labels(f, one_hot=one_hot) + + local_file = _maybe_download( + test_images_file, train_dir, source_url + test_images_file + ) + with gfile.Open(local_file, "rb") as f: + test_images = _extract_images(f) + + local_file = _maybe_download( + test_labels_file, train_dir, source_url + test_labels_file + ) + with gfile.Open(local_file, "rb") as f: + test_labels = _extract_labels(f, one_hot=one_hot) + + if not 0 <= validation_size <= len(train_images): + raise ValueError( + f"Validation size should be between 0 and {len(train_images)}. Received: {validation_size}." + ) + + validation_images = train_images[:validation_size] + validation_labels = train_labels[:validation_size] + train_images = train_images[validation_size:] + train_labels = train_labels[validation_size:] + + options = dict(dtype=dtype, reshape=reshape, seed=seed) + + train = _DataSet(train_images, train_labels, **options) + validation = _DataSet(validation_images, validation_labels, **options) + test = _DataSet(test_images, test_labels, **options) + + return _Datasets(train=train, validation=validation, test=test) diff --git a/python-mega-algo/neural_network/perceptron.py b/python-mega-algo/neural_network/perceptron.py new file mode 100644 index 00000000..063be5ea --- /dev/null +++ b/python-mega-algo/neural_network/perceptron.py @@ -0,0 +1,238 @@ +""" + Perceptron + w = w + N * (d(k) - y) * x(k) + + Using perceptron network for oil analysis, with Measuring of 3 parameters + that represent chemical characteristics we can classify the oil, in p1 or p2 + p1 = -1 + p2 = 1 +""" +import random + + +class Perceptron: + def __init__( + self, + sample: list[list[float]], + target: list[int], + learning_rate: float = 0.01, + epoch_number: int = 1000, + bias: float = -1, + ) -> None: + """ + Initializes a Perceptron network for oil analysis + :param sample: sample dataset of 3 parameters with shape [30,3] + :param target: variable for classification with two possible states -1 or 1 + :param learning_rate: learning rate used in optimizing. + :param epoch_number: number of epochs to train network on. + :param bias: bias value for the network. + + >>> p = Perceptron([], (0, 1, 2)) + Traceback (most recent call last): + ... + ValueError: Sample data can not be empty + >>> p = Perceptron(([0], 1, 2), []) + Traceback (most recent call last): + ... + ValueError: Target data can not be empty + >>> p = Perceptron(([0], 1, 2), (0, 1)) + Traceback (most recent call last): + ... + ValueError: Sample data and Target data do not have matching lengths + """ + self.sample = sample + if len(self.sample) == 0: + raise ValueError("Sample data can not be empty") + self.target = target + if len(self.target) == 0: + raise ValueError("Target data can not be empty") + if len(self.sample) != len(self.target): + raise ValueError("Sample data and Target data do not have matching lengths") + self.learning_rate = learning_rate + self.epoch_number = epoch_number + self.bias = bias + self.number_sample = len(sample) + self.col_sample = len(sample[0]) # number of columns in dataset + self.weight: list = [] + + def training(self) -> None: + """ + Trains perceptron for epochs <= given number of epochs + :return: None + >>> data = [[2.0149, 0.6192, 10.9263]] + >>> targets = [-1] + >>> perceptron = Perceptron(data,targets) + >>> perceptron.training() # doctest: +ELLIPSIS + ('\\nEpoch:\\n', ...) + ... + """ + for sample in self.sample: + sample.insert(0, self.bias) + + for i in range(self.col_sample): + self.weight.append(random.random()) + + self.weight.insert(0, self.bias) + + epoch_count = 0 + + while True: + has_misclassified = False + for i in range(self.number_sample): + u = 0 + for j in range(self.col_sample + 1): + u = u + self.weight[j] * self.sample[i][j] + y = self.sign(u) + if y != self.target[i]: + for j in range(self.col_sample + 1): + self.weight[j] = ( + self.weight[j] + + self.learning_rate + * (self.target[i] - y) + * self.sample[i][j] + ) + has_misclassified = True + # print('Epoch: \n',epoch_count) + epoch_count = epoch_count + 1 + # if you want control the epoch or just by error + if not has_misclassified: + print(("\nEpoch:\n", epoch_count)) + print("------------------------\n") + # if epoch_count > self.epoch_number or not error: + break + + def sort(self, sample: list[float]) -> None: + """ + :param sample: example row to classify as P1 or P2 + :return: None + >>> data = [[2.0149, 0.6192, 10.9263]] + >>> targets = [-1] + >>> perceptron = Perceptron(data,targets) + >>> perceptron.training() # doctest: +ELLIPSIS + ('\\nEpoch:\\n', ...) + ... + >>> perceptron.sort([-0.6508, 0.1097, 4.0009]) # doctest: +ELLIPSIS + ('Sample: ', ...) + classification: P... + """ + if len(self.sample) == 0: + raise ValueError("Sample data can not be empty") + sample.insert(0, self.bias) + u = 0 + for i in range(self.col_sample + 1): + u = u + self.weight[i] * sample[i] + + y = self.sign(u) + + if y == -1: + print(("Sample: ", sample)) + print("classification: P1") + else: + print(("Sample: ", sample)) + print("classification: P2") + + def sign(self, u: float) -> int: + """ + threshold function for classification + :param u: input number + :return: 1 if the input is greater than 0, otherwise -1 + >>> data = [[0],[-0.5],[0.5]] + >>> targets = [1,-1,1] + >>> perceptron = Perceptron(data,targets) + >>> perceptron.sign(0) + 1 + >>> perceptron.sign(-0.5) + -1 + >>> perceptron.sign(0.5) + 1 + """ + return 1 if u >= 0 else -1 + + +samples = [ + [-0.6508, 0.1097, 4.0009], + [-1.4492, 0.8896, 4.4005], + [2.0850, 0.6876, 12.0710], + [0.2626, 1.1476, 7.7985], + [0.6418, 1.0234, 7.0427], + [0.2569, 0.6730, 8.3265], + [1.1155, 0.6043, 7.4446], + [0.0914, 0.3399, 7.0677], + [0.0121, 0.5256, 4.6316], + [-0.0429, 0.4660, 5.4323], + [0.4340, 0.6870, 8.2287], + [0.2735, 1.0287, 7.1934], + [0.4839, 0.4851, 7.4850], + [0.4089, -0.1267, 5.5019], + [1.4391, 0.1614, 8.5843], + [-0.9115, -0.1973, 2.1962], + [0.3654, 1.0475, 7.4858], + [0.2144, 0.7515, 7.1699], + [0.2013, 1.0014, 6.5489], + [0.6483, 0.2183, 5.8991], + [-0.1147, 0.2242, 7.2435], + [-0.7970, 0.8795, 3.8762], + [-1.0625, 0.6366, 2.4707], + [0.5307, 0.1285, 5.6883], + [-1.2200, 0.7777, 1.7252], + [0.3957, 0.1076, 5.6623], + [-0.1013, 0.5989, 7.1812], + [2.4482, 0.9455, 11.2095], + [2.0149, 0.6192, 10.9263], + [0.2012, 0.2611, 5.4631], +] + +exit = [ + -1, + -1, + -1, + 1, + 1, + -1, + 1, + -1, + 1, + 1, + -1, + 1, + -1, + -1, + -1, + -1, + 1, + 1, + 1, + 1, + -1, + 1, + 1, + 1, + 1, + -1, + -1, + 1, + -1, + 1, +] + + +if __name__ == "__main__": + import doctest + + doctest.testmod() + + network = Perceptron( + sample=samples, target=exit, learning_rate=0.01, epoch_number=1000, bias=-1 + ) + network.training() + print("Finished training perceptron") + print("Enter values to predict or q to exit") + while True: + sample: list = [] + for i in range(len(samples[0])): + user_input = input("value: ").strip() + if user_input == "q": + break + observation = float(user_input) + sample.insert(i, observation) + network.sort(sample) diff --git a/python-mega-algo/neural_network/right.html b/python-mega-algo/neural_network/right.html new file mode 100644 index 00000000..f6e1cc15 --- /dev/null +++ b/python-mega-algo/neural_network/right.html @@ -0,0 +1,30 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/neural_network + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + + +
    FileFileFileFile
    2_hidden_...ork.py convoluti...ork.py __init__.py input_data.py_tf 
    back_prop...ork.py perceptron.py gan.py_tf 
    + +

    +Folders: 1
    +Files: 7
    +Size of all files: 66935 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/other/__init__.py b/python-mega-algo/other/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/other/activity_selection.py b/python-mega-algo/other/activity_selection.py new file mode 100644 index 00000000..c03956cc --- /dev/null +++ b/python-mega-algo/other/activity_selection.py @@ -0,0 +1,46 @@ +# flake8: noqa + +"""The following implementation assumes that the activities +are already sorted according to their finish time""" + +"""Prints a maximum set of activities that can be done by a +single person, one at a time""" +# n --> Total number of activities +# start[]--> An array that contains start time of all activities +# finish[] --> An array that contains finish time of all activities + + +def printMaxActivities(start, finish): + """ + >>> start = [1, 3, 0, 5, 8, 5] + >>> finish = [2, 4, 6, 7, 9, 9] + >>> printMaxActivities(start, finish) + The following activities are selected: + 0,1,3,4, + """ + n = len(finish) + print("The following activities are selected:") + + # The first activity is always selected + i = 0 + print(i, end=",") + + # Consider rest of the activities + for j in range(n): + + # If this activity has start time greater than + # or equal to the finish time of previously + # selected activity, then select it + if start[j] >= finish[i]: + print(j, end=",") + i = j + + +if __name__ == "__main__": + import doctest + + doctest.testmod() + + start = [1, 3, 0, 5, 8, 5] + finish = [2, 4, 6, 7, 9, 9] + printMaxActivities(start, finish) diff --git "a/python-mega-algo/other/davis\342\200\223putnam\342\200\223logemann\342\200\223loveland.py" "b/python-mega-algo/other/davis\342\200\223putnam\342\200\223logemann\342\200\223loveland.py" new file mode 100644 index 00000000..d16de6dd --- /dev/null +++ "b/python-mega-algo/other/davis\342\200\223putnam\342\200\223logemann\342\200\223loveland.py" @@ -0,0 +1,357 @@ +#!/usr/bin/env python3 + +""" +Davis–Putnam–Logemann–Loveland (DPLL) algorithm is a complete, backtracking-based +search algorithm for deciding the satisfiability of propositional logic formulae in +conjunctive normal form, i.e, for solving the Conjunctive Normal Form SATisfiability +(CNF-SAT) problem. + +For more information about the algorithm: https://en.wikipedia.org/wiki/DPLL_algorithm +""" + +import random +from typing import Dict, List + + +class Clause: + """ + A clause represented in Conjunctive Normal Form. + A clause is a set of literals, either complemented or otherwise. + For example: + {A1, A2, A3'} is the clause (A1 v A2 v A3') + {A5', A2', A1} is the clause (A5' v A2' v A1) + + Create model + >>> clause = Clause(["A1", "A2'", "A3"]) + >>> clause.evaluate({"A1": True}) + True + """ + + def __init__(self, literals: List[int]) -> None: + """ + Represent the literals and an assignment in a clause." + """ + # Assign all literals to None initially + self.literals = {literal: None for literal in literals} + + def __str__(self) -> str: + """ + To print a clause as in Conjunctive Normal Form. + >>> str(Clause(["A1", "A2'", "A3"])) + "{A1 , A2' , A3}" + """ + return "{" + " , ".join(self.literals) + "}" + + def __len__(self) -> int: + """ + To print a clause as in Conjunctive Normal Form. + >>> len(Clause([])) + 0 + >>> len(Clause(["A1", "A2'", "A3"])) + 3 + """ + return len(self.literals) + + def assign(self, model: Dict[str, bool]) -> None: + """ + Assign values to literals of the clause as given by model. + """ + for literal in self.literals: + symbol = literal[:2] + if symbol in model: + value = model[symbol] + else: + continue + if value is not None: + # Complement assignment if literal is in complemented form + if literal.endswith("'"): + value = not value + self.literals[literal] = value + + def evaluate(self, model: Dict[str, bool]) -> bool: + """ + Evaluates the clause with the assignments in model. + This has the following steps: + 1. Return True if both a literal and its complement exist in the clause. + 2. Return True if a single literal has the assignment True. + 3. Return None(unable to complete evaluation) if a literal has no assignment. + 4. Compute disjunction of all values assigned in clause. + """ + for literal in self.literals: + symbol = literal.rstrip("'") if literal.endswith("'") else literal + "'" + if symbol in self.literals: + return True + + self.assign(model) + for value in self.literals.values(): + if value in (True, None): + return value + return any(self.literals.values()) + + +class Formula: + """ + A formula represented in Conjunctive Normal Form. + A formula is a set of clauses. + For example, + {{A1, A2, A3'}, {A5', A2', A1}} is ((A1 v A2 v A3') and (A5' v A2' v A1)) + """ + + def __init__(self, clauses: List[Clause]) -> None: + """ + Represent the number of clauses and the clauses themselves. + """ + self.clauses = list(clauses) + + def __str__(self) -> str: + """ + To print a formula as in Conjunctive Normal Form. + str(Formula([Clause(["A1", "A2'", "A3"]), Clause(["A5'", "A2'", "A1"])])) + "{{A1 , A2' , A3} , {A5' , A2' , A1}}" + """ + return "{" + " , ".join(str(clause) for clause in self.clauses) + "}" + + +def generate_clause() -> Clause: + """ + Randomly generate a clause. + All literals have the name Ax, where x is an integer from 1 to 5. + """ + literals = [] + no_of_literals = random.randint(1, 5) + base_var = "A" + i = 0 + while i < no_of_literals: + var_no = random.randint(1, 5) + var_name = base_var + str(var_no) + var_complement = random.randint(0, 1) + if var_complement == 1: + var_name += "'" + if var_name in literals: + i -= 1 + else: + literals.append(var_name) + i += 1 + return Clause(literals) + + +def generate_formula() -> Formula: + """ + Randomly generate a formula. + """ + clauses = set() + no_of_clauses = random.randint(1, 10) + while len(clauses) < no_of_clauses: + clauses.add(generate_clause()) + return Formula(set(clauses)) + + +def generate_parameters(formula: Formula) -> (List[Clause], List[str]): + """ + Return the clauses and symbols from a formula. + A symbol is the uncomplemented form of a literal. + For example, + Symbol of A3 is A3. + Symbol of A5' is A5. + + >>> formula = Formula([Clause(["A1", "A2'", "A3"]), Clause(["A5'", "A2'", "A1"])]) + >>> clauses, symbols = generate_parameters(formula) + >>> clauses_list = [str(i) for i in clauses] + >>> clauses_list + ["{A1 , A2' , A3}", "{A5' , A2' , A1}"] + >>> symbols + ['A1', 'A2', 'A3', 'A5'] + """ + clauses = formula.clauses + symbols_set = [] + for clause in formula.clauses: + for literal in clause.literals: + symbol = literal[:2] + if symbol not in symbols_set: + symbols_set.append(symbol) + return clauses, symbols_set + + +def find_pure_symbols( + clauses: List[Clause], symbols: List[str], model: Dict[str, bool] +) -> (List[str], Dict[str, bool]): + """ + Return pure symbols and their values to satisfy clause. + Pure symbols are symbols in a formula that exist only + in one form, either complemented or otherwise. + For example, + { { A4 , A3 , A5' , A1 , A3' } , { A4 } , { A3 } } has + pure symbols A4, A5' and A1. + This has the following steps: + 1. Ignore clauses that have already evaluated to be True. + 2. Find symbols that occur only in one form in the rest of the clauses. + 3. Assign value True or False depending on whether the symbols occurs + in normal or complemented form respectively. + + >>> formula = Formula([Clause(["A1", "A2'", "A3"]), Clause(["A5'", "A2'", "A1"])]) + >>> clauses, symbols = generate_parameters(formula) + + >>> pure_symbols, values = find_pure_symbols(clauses, symbols, {}) + >>> pure_symbols + ['A1', 'A2', 'A3', 'A5'] + >>> values + {'A1': True, 'A2': False, 'A3': True, 'A5': False} + """ + pure_symbols = [] + assignment = dict() + literals = [] + + for clause in clauses: + if clause.evaluate(model) is True: + continue + for literal in clause.literals: + literals.append(literal) + + for s in symbols: + sym = s + "'" + if (s in literals and sym not in literals) or ( + s not in literals and sym in literals + ): + pure_symbols.append(s) + for p in pure_symbols: + assignment[p] = None + for s in pure_symbols: + sym = s + "'" + if s in literals: + assignment[s] = True + elif sym in literals: + assignment[s] = False + return pure_symbols, assignment + + +def find_unit_clauses( + clauses: List[Clause], model: Dict[str, bool] +) -> (List[str], Dict[str, bool]): + """ + Returns the unit symbols and their values to satisfy clause. + Unit symbols are symbols in a formula that are: + - Either the only symbol in a clause + - Or all other literals in that clause have been assigned False + This has the following steps: + 1. Find symbols that are the only occurrences in a clause. + 2. Find symbols in a clause where all other literals are assigned False. + 3. Assign True or False depending on whether the symbols occurs in + normal or complemented form respectively. + + >>> clause1 = Clause(["A4", "A3", "A5'", "A1", "A3'"]) + >>> clause2 = Clause(["A4"]) + >>> clause3 = Clause(["A3"]) + >>> clauses, symbols = generate_parameters(Formula([clause1, clause2, clause3])) + + >>> unit_clauses, values = find_unit_clauses(clauses, {}) + >>> unit_clauses + ['A4', 'A3'] + >>> values + {'A4': True, 'A3': True} + """ + unit_symbols = [] + for clause in clauses: + if len(clause) == 1: + unit_symbols.append(list(clause.literals.keys())[0]) + else: + Fcount, Ncount = 0, 0 + for literal, value in clause.literals.items(): + if value is False: + Fcount += 1 + elif value is None: + sym = literal + Ncount += 1 + if Fcount == len(clause) - 1 and Ncount == 1: + unit_symbols.append(sym) + assignment = dict() + for i in unit_symbols: + symbol = i[:2] + assignment[symbol] = len(i) == 2 + unit_symbols = [i[:2] for i in unit_symbols] + + return unit_symbols, assignment + + +def dpll_algorithm( + clauses: List[Clause], symbols: List[str], model: Dict[str, bool] +) -> (bool, Dict[str, bool]): + """ + Returns the model if the formula is satisfiable, else None + This has the following steps: + 1. If every clause in clauses is True, return True. + 2. If some clause in clauses is False, return False. + 3. Find pure symbols. + 4. Find unit symbols. + + >>> formula = Formula([Clause(["A4", "A3", "A5'", "A1", "A3'"]), Clause(["A4"])]) + >>> clauses, symbols = generate_parameters(formula) + + >>> soln, model = dpll_algorithm(clauses, symbols, {}) + >>> soln + True + >>> model + {'A4': True} + """ + check_clause_all_true = True + for clause in clauses: + clause_check = clause.evaluate(model) + if clause_check is False: + return False, None + elif clause_check is None: + check_clause_all_true = False + continue + + if check_clause_all_true: + return True, model + + try: + pure_symbols, assignment = find_pure_symbols(clauses, symbols, model) + except RecursionError: + print("raises a RecursionError and is") + return None, {} + P = None + if len(pure_symbols) > 0: + P, value = pure_symbols[0], assignment[pure_symbols[0]] + + if P: + tmp_model = model + tmp_model[P] = value + tmp_symbols = [i for i in symbols] + if P in tmp_symbols: + tmp_symbols.remove(P) + return dpll_algorithm(clauses, tmp_symbols, tmp_model) + + unit_symbols, assignment = find_unit_clauses(clauses, model) + P = None + if len(unit_symbols) > 0: + P, value = unit_symbols[0], assignment[unit_symbols[0]] + if P: + tmp_model = model + tmp_model[P] = value + tmp_symbols = [i for i in symbols] + if P in tmp_symbols: + tmp_symbols.remove(P) + return dpll_algorithm(clauses, tmp_symbols, tmp_model) + P = symbols[0] + rest = symbols[1:] + tmp1, tmp2 = model, model + tmp1[P], tmp2[P] = True, False + + return dpll_algorithm(clauses, rest, tmp1) or dpll_algorithm(clauses, rest, tmp2) + + +if __name__ == "__main__": + import doctest + + doctest.testmod() + + formula = generate_formula() + print(f"The formula {formula} is", end=" ") + + clauses, symbols = generate_parameters(formula) + solution, model = dpll_algorithm(clauses, symbols, {}) + + if solution: + print(f"satisfiable with the assignment {model}.") + else: + print("not satisfiable.") diff --git a/python-mega-algo/other/dijkstra_bankers_algorithm.py b/python-mega-algo/other/dijkstra_bankers_algorithm.py new file mode 100644 index 00000000..be7bceba --- /dev/null +++ b/python-mega-algo/other/dijkstra_bankers_algorithm.py @@ -0,0 +1,225 @@ +# A Python implementation of the Banker's Algorithm in Operating Systems using +# Processes and Resources +# { +# "Author: "Biney Kingsley (bluedistro@github.io), bineykingsley36@gmail.com", +# "Date": 28-10-2018 +# } +""" +The Banker's algorithm is a resource allocation and deadlock avoidance algorithm +developed by Edsger Dijkstra that tests for safety by simulating the allocation of +predetermined maximum possible amounts of all resources, and then makes a "s-state" +check to test for possible deadlock conditions for all other pending activities, +before deciding whether allocation should be allowed to continue. +[Source] Wikipedia +[Credit] Rosetta Code C implementation helped very much. + (https://rosettacode.org/wiki/Banker%27s_algorithm) +""" + +from __future__ import annotations + +import time + +import numpy as np + +test_claim_vector = [8, 5, 9, 7] +test_allocated_res_table = [ + [2, 0, 1, 1], + [0, 1, 2, 1], + [4, 0, 0, 3], + [0, 2, 1, 0], + [1, 0, 3, 0], +] +test_maximum_claim_table = [ + [3, 2, 1, 4], + [0, 2, 5, 2], + [5, 1, 0, 5], + [1, 5, 3, 0], + [3, 0, 3, 3], +] + + +class BankersAlgorithm: + def __init__( + self, + claim_vector: list[int], + allocated_resources_table: list[list[int]], + maximum_claim_table: list[list[int]], + ) -> None: + """ + :param claim_vector: A nxn/nxm list depicting the amount of each resources + (eg. memory, interface, semaphores, etc.) available. + :param allocated_resources_table: A nxn/nxm list depicting the amount of each + resource each process is currently holding + :param maximum_claim_table: A nxn/nxm list depicting how much of each resource + the system currently has available + """ + self.__claim_vector = claim_vector + self.__allocated_resources_table = allocated_resources_table + self.__maximum_claim_table = maximum_claim_table + + def __processes_resource_summation(self) -> list[int]: + """ + Check for allocated resources in line with each resource in the claim vector + """ + return [ + sum(p_item[i] for p_item in self.__allocated_resources_table) + for i in range(len(self.__allocated_resources_table[0])) + ] + + def __available_resources(self) -> list[int]: + """ + Check for available resources in line with each resource in the claim vector + """ + return np.array(self.__claim_vector) - np.array( + self.__processes_resource_summation() + ) + + def __need(self) -> list[list[int]]: + """ + Implement safety checker that calculates the needs by ensuring that + max_claim[i][j] - alloc_table[i][j] <= avail[j] + """ + return [ + list(np.array(self.__maximum_claim_table[i]) - np.array(allocated_resource)) + for i, allocated_resource in enumerate(self.__allocated_resources_table) + ] + + def __need_index_manager(self) -> dict[int, list[int]]: + """ + This function builds an index control dictionary to track original ids/indices + of processes when altered during execution of method "main" + Return: {0: [a: int, b: int], 1: [c: int, d: int]} + >>> (BankersAlgorithm(test_claim_vector, test_allocated_res_table, + ... test_maximum_claim_table)._BankersAlgorithm__need_index_manager() + ... ) # doctest: +NORMALIZE_WHITESPACE + {0: [1, 2, 0, 3], 1: [0, 1, 3, 1], 2: [1, 1, 0, 2], 3: [1, 3, 2, 0], + 4: [2, 0, 0, 3]} + """ + return {self.__need().index(i): i for i in self.__need()} + + def main(self, **kwargs) -> None: + """ + Utilize various methods in this class to simulate the Banker's algorithm + Return: None + >>> BankersAlgorithm(test_claim_vector, test_allocated_res_table, + ... test_maximum_claim_table).main(describe=True) + Allocated Resource Table + P1 2 0 1 1 + + P2 0 1 2 1 + + P3 4 0 0 3 + + P4 0 2 1 0 + + P5 1 0 3 0 + + System Resource Table + P1 3 2 1 4 + + P2 0 2 5 2 + + P3 5 1 0 5 + + P4 1 5 3 0 + + P5 3 0 3 3 + + Current Usage by Active Processes: 8 5 9 7 + Initial Available Resources: 1 2 2 2 + __________________________________________________ + + Process 3 is executing. + Updated available resource stack for processes: 5 2 2 5 + The process is in a safe state. + + Process 1 is executing. + Updated available resource stack for processes: 7 2 3 6 + The process is in a safe state. + + Process 2 is executing. + Updated available resource stack for processes: 7 3 5 7 + The process is in a safe state. + + Process 4 is executing. + Updated available resource stack for processes: 7 5 6 7 + The process is in a safe state. + + Process 5 is executing. + Updated available resource stack for processes: 8 5 9 7 + The process is in a safe state. + + """ + need_list = self.__need() + alloc_resources_table = self.__allocated_resources_table + available_resources = self.__available_resources() + need_index_manager = self.__need_index_manager() + for kw, val in kwargs.items(): + if kw and val is True: + self.__pretty_data() + print("_" * 50 + "\n") + while need_list: + safe = False + for each_need in need_list: + execution = True + for index, need in enumerate(each_need): + if need > available_resources[index]: + execution = False + break + if execution: + safe = True + # get the original index of the process from ind_ctrl db + for original_need_index, need_clone in need_index_manager.items(): + if each_need == need_clone: + process_number = original_need_index + print(f"Process {process_number + 1} is executing.") + # remove the process run from stack + need_list.remove(each_need) + # update available/freed resources stack + available_resources = np.array(available_resources) + np.array( + alloc_resources_table[process_number] + ) + print( + "Updated available resource stack for processes: " + + " ".join([str(x) for x in available_resources]) + ) + break + if safe: + print("The process is in a safe state.\n") + else: + print("System in unsafe state. Aborting...\n") + break + + def __pretty_data(self): + """ + Properly align display of the algorithm's solution + """ + print(" " * 9 + "Allocated Resource Table") + for item in self.__allocated_resources_table: + print( + f"P{self.__allocated_resources_table.index(item) + 1}" + + " ".join(f"{it:>8}" for it in item) + + "\n" + ) + print(" " * 9 + "System Resource Table") + for item in self.__maximum_claim_table: + print( + f"P{self.__maximum_claim_table.index(item) + 1}" + + " ".join(f"{it:>8}" for it in item) + + "\n" + ) + print( + "Current Usage by Active Processes: " + + " ".join(str(x) for x in self.__claim_vector) + ) + print( + "Initial Available Resources: " + + " ".join(str(x) for x in self.__available_resources()) + ) + time.sleep(1) + + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/other/doomsday.py b/python-mega-algo/other/doomsday.py new file mode 100644 index 00000000..d8fe2611 --- /dev/null +++ b/python-mega-algo/other/doomsday.py @@ -0,0 +1,59 @@ +#!/bin/python3 +# Doomsday algorithm info: https://en.wikipedia.org/wiki/Doomsday_rule + +DOOMSDAY_LEAP = [4, 1, 7, 4, 2, 6, 4, 1, 5, 3, 7, 5] +DOOMSDAY_NOT_LEAP = [3, 7, 7, 4, 2, 6, 4, 1, 5, 3, 7, 5] +WEEK_DAY_NAMES = { + 0: "Sunday", + 1: "Monday", + 2: "Tuesday", + 3: "Wednesday", + 4: "Thursday", + 5: "Friday", + 6: "Saturday", +} + + +def get_week_day(year: int, month: int, day: int) -> str: + """Returns the week-day name out of a given date. + + >>> get_week_day(2020, 10, 24) + 'Saturday' + >>> get_week_day(2017, 10, 24) + 'Tuesday' + >>> get_week_day(2019, 5, 3) + 'Friday' + >>> get_week_day(1970, 9, 16) + 'Wednesday' + >>> get_week_day(1870, 8, 13) + 'Saturday' + >>> get_week_day(2040, 3, 14) + 'Wednesday' + + """ + # minimal input check: + assert len(str(year)) > 2, "year should be in YYYY format" + assert 1 <= month <= 12, "month should be between 1 to 12" + assert 1 <= day <= 31, "day should be between 1 to 31" + + # Doomsday algorithm: + century = year // 100 + century_anchor = (5 * (century % 4) + 2) % 7 + centurian = year % 100 + centurian_m = centurian % 12 + dooms_day = ( + (centurian // 12) + centurian_m + (centurian_m // 4) + century_anchor + ) % 7 + day_anchor = ( + DOOMSDAY_NOT_LEAP[month - 1] + if (year % 4 != 0) or (centurian == 0 and (year % 400) == 0) + else DOOMSDAY_LEAP[month - 1] + ) + week_day = (dooms_day + day - day_anchor) % 7 + return WEEK_DAY_NAMES[week_day] + + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/other/fischer_yates_shuffle.py b/python-mega-algo/other/fischer_yates_shuffle.py new file mode 100644 index 00000000..6eec738c --- /dev/null +++ b/python-mega-algo/other/fischer_yates_shuffle.py @@ -0,0 +1,24 @@ +#!/usr/bin/python +""" +The Fisher–Yates shuffle is an algorithm for generating a random permutation of a +finite sequence. +For more details visit +wikipedia/Fischer-Yates-Shuffle. +""" +import random + + +def FYshuffle(list): + for i in range(len(list)): + a = random.randint(0, len(list) - 1) + b = random.randint(0, len(list) - 1) + list[a], list[b] = list[b], list[a] + return list + + +if __name__ == "__main__": + integers = [0, 1, 2, 3, 4, 5, 6, 7] + strings = ["python", "says", "hello", "!"] + print("Fisher-Yates Shuffle:") + print("List", integers, strings) + print("FY Shuffle", FYshuffle(integers), FYshuffle(strings)) diff --git a/python-mega-algo/other/gauss_easter.py b/python-mega-algo/other/gauss_easter.py new file mode 100644 index 00000000..4447d4ab --- /dev/null +++ b/python-mega-algo/other/gauss_easter.py @@ -0,0 +1,59 @@ +""" +https://en.wikipedia.org/wiki/Computus#Gauss'_Easter_algorithm +""" +import math +from datetime import datetime, timedelta + + +def gauss_easter(year: int) -> datetime: + """ + Calculation Gregorian easter date for given year + + >>> gauss_easter(2007) + datetime.datetime(2007, 4, 8, 0, 0) + + >>> gauss_easter(2008) + datetime.datetime(2008, 3, 23, 0, 0) + + >>> gauss_easter(2020) + datetime.datetime(2020, 4, 12, 0, 0) + + >>> gauss_easter(2021) + datetime.datetime(2021, 4, 4, 0, 0) + """ + metonic_cycle = year % 19 + julian_leap_year = year % 4 + non_leap_year = year % 7 + leap_day_inhibits = math.floor(year / 100) + lunar_orbit_correction = math.floor((13 + 8 * leap_day_inhibits) / 25) + leap_day_reinstall_number = leap_day_inhibits / 4 + secular_moon_shift = ( + 15 - lunar_orbit_correction + leap_day_inhibits - leap_day_reinstall_number + ) % 30 + century_starting_point = (4 + leap_day_inhibits - leap_day_reinstall_number) % 7 + + # days to be added to March 21 + days_to_add = (19 * metonic_cycle + secular_moon_shift) % 30 + + # PHM -> Paschal Full Moon + days_from_phm_to_sunday = ( + 2 * julian_leap_year + + 4 * non_leap_year + + 6 * days_to_add + + century_starting_point + ) % 7 + + if days_to_add == 29 and days_from_phm_to_sunday == 6: + return datetime(year, 4, 19) + elif days_to_add == 28 and days_from_phm_to_sunday == 6: + return datetime(year, 4, 18) + else: + return datetime(year, 3, 22) + timedelta( + days=int(days_to_add + days_from_phm_to_sunday) + ) + + +if __name__ == "__main__": + for year in (1994, 2000, 2010, 2021, 2023): + tense = "will be" if year > datetime.now().year else "was" + print(f"Easter in {year} {tense} {gauss_easter(year)}") diff --git a/python-mega-algo/other/graham_scan.py b/python-mega-algo/other/graham_scan.py new file mode 100644 index 00000000..67c5cd8a --- /dev/null +++ b/python-mega-algo/other/graham_scan.py @@ -0,0 +1,171 @@ +""" +This is a pure Python implementation of the merge-insertion sort algorithm +Source: https://en.wikipedia.org/wiki/Graham_scan + +For doctests run following command: +python3 -m doctest -v graham_scan.py +""" + +from __future__ import annotations + +from collections import deque +from enum import Enum +from math import atan2, degrees +from sys import maxsize + + +def graham_scan(points: list[list[int, int]]) -> list[list[int, int]]: + """Pure implementation of graham scan algorithm in Python + + :param points: The unique points on coordinates. + :return: The points on convex hell. + + Examples: + >>> graham_scan([(9, 6), (3, 1), (0, 0), (5, 5), (5, 2), (7, 0), (3, 3), (1, 4)]) + [(0, 0), (7, 0), (9, 6), (5, 5), (1, 4)] + + >>> graham_scan([(0, 0), (1, 0), (1, 1), (0, 1)]) + [(0, 0), (1, 0), (1, 1), (0, 1)] + + >>> graham_scan([(0, 0), (1, 1), (2, 2), (3, 3), (-1, 2)]) + [(0, 0), (1, 1), (2, 2), (3, 3), (-1, 2)] + + >>> graham_scan([(-100, 20), (99, 3), (1, 10000001), (5133186, -25), (-66, -4)]) + [(5133186, -25), (1, 10000001), (-100, 20), (-66, -4)] + """ + + if len(points) <= 2: + # There is no convex hull + raise ValueError("graham_scan: argument must contain more than 3 points.") + if len(points) == 3: + return points + # find the lowest and the most left point + minidx = 0 + miny, minx = maxsize, maxsize + for i, point in enumerate(points): + x = point[0] + y = point[1] + if y < miny: + miny = y + minx = x + minidx = i + if y == miny: + if x < minx: + minx = x + minidx = i + + # remove the lowest and the most left point from points for preparing for sort + points.pop(minidx) + + def angle_comparer(point: list[int, int], minx: int, miny: int) -> float: + """Return the angle toward to point from (minx, miny) + + :param point: The target point + minx: The starting point's x + miny: The starting point's y + :return: the angle + + Examples: + >>> angle_comparer([1,1], 0, 0) + 45.0 + + >>> angle_comparer([100,1], 10, 10) + -5.710593137499642 + + >>> angle_comparer([5,5], 2, 3) + 33.690067525979785 + """ + # sort the points accorgind to the angle from the lowest and the most left point + x = point[0] + y = point[1] + angle = degrees(atan2(y - miny, x - minx)) + return angle + + sorted_points = sorted(points, key=lambda point: angle_comparer(point, minx, miny)) + # This insert actually costs complexity, + # and you should insteadly add (minx, miny) into stack later. + # I'm using insert just for easy understanding. + sorted_points.insert(0, (minx, miny)) + + # traversal from the lowest and the most left point in anti-clockwise direction + # if direction gets right, the previous point is not the convex hull. + class Direction(Enum): + left = 1 + straight = 2 + right = 3 + + def check_direction( + starting: list[int, int], via: list[int, int], target: list[int, int] + ) -> Direction: + """Return the direction toward to the line from via to target from starting + + :param starting: The starting point + via: The via point + target: The target point + :return: the Direction + + Examples: + >>> check_direction([1,1], [2,2], [3,3]) + Direction.straight + + >>> check_direction([60,1], [-50,199], [30,2]) + Direction.left + + >>> check_direction([0,0], [5,5], [10,0]) + Direction.right + """ + x0, y0 = starting + x1, y1 = via + x2, y2 = target + via_angle = degrees(atan2(y1 - y0, x1 - x0)) + if via_angle < 0: + via_angle += 360 + target_angle = degrees(atan2(y2 - y0, x2 - x0)) + if target_angle < 0: + target_angle += 360 + # t- + # \ \ + # \ v + # \| + # s + # via_angle is always lower than target_angle, if direction is left. + # If they are same, it means they are on a same line of convex hull. + if target_angle > via_angle: + return Direction.left + if target_angle == via_angle: + return Direction.straight + if target_angle < via_angle: + return Direction.right + + stack = deque() + stack.append(sorted_points[0]) + stack.append(sorted_points[1]) + stack.append(sorted_points[2]) + # In any ways, the first 3 points line are towards left. + # Because we sort them the angle from minx, miny. + current_direction = Direction.left + + for i in range(3, len(sorted_points)): + while True: + starting = stack[-2] + via = stack[-1] + target = sorted_points[i] + next_direction = check_direction(starting, via, target) + + if next_direction == Direction.left: + current_direction = Direction.left + break + if next_direction == Direction.straight: + if current_direction == Direction.left: + # We keep current_direction as left. + # Because if the straight line keeps as straight, + # we want to know if this straight line is towards left. + break + elif current_direction == Direction.right: + # If the straight line is towards right, + # every previous points on those straigh line is not convex hull. + stack.pop() + if next_direction == Direction.right: + stack.pop() + stack.append(sorted_points[i]) + return list(stack) diff --git a/python-mega-algo/other/greedy.py b/python-mega-algo/other/greedy.py new file mode 100644 index 00000000..4b78bf1c --- /dev/null +++ b/python-mega-algo/other/greedy.py @@ -0,0 +1,63 @@ +class things: + def __init__(self, name, value, weight): + self.name = name + self.value = value + self.weight = weight + + def __repr__(self): + return f"{self.__class__.__name__}({self.name}, {self.value}, {self.weight})" + + def get_value(self): + return self.value + + def get_name(self): + return self.name + + def get_weight(self): + return self.weight + + def value_Weight(self): + return self.value / self.weight + + +def build_menu(name, value, weight): + menu = [] + for i in range(len(value)): + menu.append(things(name[i], value[i], weight[i])) + return menu + + +def greedy(item, maxCost, keyFunc): + itemsCopy = sorted(item, key=keyFunc, reverse=True) + result = [] + totalValue, total_cost = 0.0, 0.0 + for i in range(len(itemsCopy)): + if (total_cost + itemsCopy[i].get_weight()) <= maxCost: + result.append(itemsCopy[i]) + total_cost += itemsCopy[i].get_weight() + totalValue += itemsCopy[i].get_value() + return (result, totalValue) + + +def test_greedy(): + """ + >>> food = ["Burger", "Pizza", "Coca Cola", "Rice", + ... "Sambhar", "Chicken", "Fries", "Milk"] + >>> value = [80, 100, 60, 70, 50, 110, 90, 60] + >>> weight = [40, 60, 40, 70, 100, 85, 55, 70] + >>> foods = build_menu(food, value, weight) + >>> foods # doctest: +NORMALIZE_WHITESPACE + [things(Burger, 80, 40), things(Pizza, 100, 60), things(Coca Cola, 60, 40), + things(Rice, 70, 70), things(Sambhar, 50, 100), things(Chicken, 110, 85), + things(Fries, 90, 55), things(Milk, 60, 70)] + >>> greedy(foods, 500, things.get_value) # doctest: +NORMALIZE_WHITESPACE + ([things(Chicken, 110, 85), things(Pizza, 100, 60), things(Fries, 90, 55), + things(Burger, 80, 40), things(Rice, 70, 70), things(Coca Cola, 60, 40), + things(Milk, 60, 70)], 570.0) + """ + + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/other/least_recently_used.py b/python-mega-algo/other/least_recently_used.py new file mode 100644 index 00000000..d0e27efc --- /dev/null +++ b/python-mega-algo/other/least_recently_used.py @@ -0,0 +1,64 @@ +import sys +from abc import abstractmethod +from collections import deque + + +class LRUCache: + """Page Replacement Algorithm, Least Recently Used (LRU) Caching.""" + + dq_store = object() # Cache store of keys + key_reference_map = object() # References of the keys in cache + _MAX_CAPACITY: int = 10 # Maximum capacity of cache + + @abstractmethod + def __init__(self, n: int): + """Creates an empty store and map for the keys. + The LRUCache is set the size n. + """ + self.dq_store = deque() + self.key_reference_map = set() + if not n: + LRUCache._MAX_CAPACITY = sys.maxsize + elif n < 0: + raise ValueError("n should be an integer greater than 0.") + else: + LRUCache._MAX_CAPACITY = n + + def refer(self, x): + """ + Looks for a page in the cache store and adds reference to the set. + Remove the least recently used key if the store is full. + Update store to reflect recent access. + """ + if x not in self.key_reference_map: + if len(self.dq_store) == LRUCache._MAX_CAPACITY: + last_element = self.dq_store.pop() + self.key_reference_map.remove(last_element) + else: + index_remove = 0 + for idx, key in enumerate(self.dq_store): + if key == x: + index_remove = idx + break + self.dq_store.remove(index_remove) + + self.dq_store.appendleft(x) + self.key_reference_map.add(x) + + def display(self): + """ + Prints all the elements in the store. + """ + for k in self.dq_store: + print(k) + + +if __name__ == "__main__": + lru_cache = LRUCache(4) + lru_cache.refer(1) + lru_cache.refer(2) + lru_cache.refer(3) + lru_cache.refer(1) + lru_cache.refer(4) + lru_cache.refer(5) + lru_cache.display() diff --git a/python-mega-algo/other/lfu_cache.py b/python-mega-algo/other/lfu_cache.py new file mode 100644 index 00000000..40268242 --- /dev/null +++ b/python-mega-algo/other/lfu_cache.py @@ -0,0 +1,187 @@ +from typing import Callable, Optional + + +class DoubleLinkedListNode: + """ + Double Linked List Node built specifically for LFU Cache + """ + + def __init__(self, key: int, val: int): + self.key = key + self.val = val + self.freq = 0 + self.next = None + self.prev = None + + +class DoubleLinkedList: + """ + Double Linked List built specifically for LFU Cache + """ + + def __init__(self): + self.head = DoubleLinkedListNode(None, None) + self.rear = DoubleLinkedListNode(None, None) + self.head.next, self.rear.prev = self.rear, self.head + + def add(self, node: DoubleLinkedListNode) -> None: + """ + Adds the given node at the head of the list and shifting it to proper position + """ + + temp = self.rear.prev + + self.rear.prev, node.next = node, self.rear + temp.next, node.prev = node, temp + node.freq += 1 + self._position_node(node) + + def _position_node(self, node: DoubleLinkedListNode) -> None: + while node.prev.key and node.prev.freq > node.freq: + node1, node2 = node, node.prev + node1.prev, node2.next = node2.prev, node1.prev + node1.next, node2.prev = node2, node1 + + def remove(self, node: DoubleLinkedListNode) -> DoubleLinkedListNode: + """ + Removes and returns the given node from the list + """ + + temp_last, temp_next = node.prev, node.next + node.prev, node.next = None, None + temp_last.next, temp_next.prev = temp_next, temp_last + return node + + +class LFUCache: + """ + LFU Cache to store a given capacity of data. Can be used as a stand-alone object + or as a function decorator. + + >>> cache = LFUCache(2) + >>> cache.set(1, 1) + >>> cache.set(2, 2) + >>> cache.get(1) + 1 + >>> cache.set(3, 3) + >>> cache.get(2) # None is returned + >>> cache.set(4, 4) + >>> cache.get(1) # None is returned + >>> cache.get(3) + 3 + >>> cache.get(4) + 4 + >>> cache + CacheInfo(hits=3, misses=2, capacity=2, current_size=2) + >>> @LFUCache.decorator(100) + ... def fib(num): + ... if num in (1, 2): + ... return 1 + ... return fib(num - 1) + fib(num - 2) + + >>> for i in range(1, 101): + ... res = fib(i) + + >>> fib.cache_info() + CacheInfo(hits=196, misses=100, capacity=100, current_size=100) + """ + + # class variable to map the decorator functions to their respective instance + decorator_function_to_instance_map = {} + + def __init__(self, capacity: int): + self.list = DoubleLinkedList() + self.capacity = capacity + self.num_keys = 0 + self.hits = 0 + self.miss = 0 + self.cache = {} + + def __repr__(self) -> str: + """ + Return the details for the cache instance + [hits, misses, capacity, current_size] + """ + + return ( + f"CacheInfo(hits={self.hits}, misses={self.miss}, " + f"capacity={self.capacity}, current_size={self.num_keys})" + ) + + def __contains__(self, key: int) -> bool: + """ + >>> cache = LFUCache(1) + >>> 1 in cache + False + >>> cache.set(1, 1) + >>> 1 in cache + True + """ + return key in self.cache + + def get(self, key: int) -> Optional[int]: + """ + Returns the value for the input key and updates the Double Linked List. Returns + None if key is not present in cache + """ + + if key in self.cache: + self.hits += 1 + self.list.add(self.list.remove(self.cache[key])) + return self.cache[key].val + self.miss += 1 + return None + + def set(self, key: int, value: int) -> None: + """ + Sets the value for the input key and updates the Double Linked List + """ + + if key not in self.cache: + if self.num_keys >= self.capacity: + key_to_delete = self.list.head.next.key + self.list.remove(self.cache[key_to_delete]) + del self.cache[key_to_delete] + self.num_keys -= 1 + self.cache[key] = DoubleLinkedListNode(key, value) + self.list.add(self.cache[key]) + self.num_keys += 1 + + else: + node = self.list.remove(self.cache[key]) + node.val = value + self.list.add(node) + + @staticmethod + def decorator(size: int = 128): + """ + Decorator version of LFU Cache + """ + + def cache_decorator_inner(func: Callable): + def cache_decorator_wrapper(*args, **kwargs): + if func not in LFUCache.decorator_function_to_instance_map: + LFUCache.decorator_function_to_instance_map[func] = LFUCache(size) + + result = LFUCache.decorator_function_to_instance_map[func].get(args[0]) + if result is None: + result = func(*args, **kwargs) + LFUCache.decorator_function_to_instance_map[func].set( + args[0], result + ) + return result + + def cache_info(): + return LFUCache.decorator_function_to_instance_map[func] + + cache_decorator_wrapper.cache_info = cache_info + + return cache_decorator_wrapper + + return cache_decorator_inner + + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/other/linear_congruential_generator.py b/python-mega-algo/other/linear_congruential_generator.py new file mode 100644 index 00000000..f8b604b8 --- /dev/null +++ b/python-mega-algo/other/linear_congruential_generator.py @@ -0,0 +1,37 @@ +__author__ = "Tobias Carryer" + +from time import time + + +class LinearCongruentialGenerator: + """ + A pseudorandom number generator. + """ + + def __init__(self, multiplier, increment, modulo, seed=int(time())): + """ + These parameters are saved and used when nextNumber() is called. + + modulo is the largest number that can be generated (exclusive). The most + efficient values are powers of 2. 2^32 is a common value. + """ + self.multiplier = multiplier + self.increment = increment + self.modulo = modulo + self.seed = seed + + def next_number(self): + """ + The smallest number that can be generated is zero. + The largest number that can be generated is modulo-1. modulo is set in the + constructor. + """ + self.seed = (self.multiplier * self.seed + self.increment) % self.modulo + return self.seed + + +if __name__ == "__main__": + # Show the LCG in action. + lcg = LinearCongruentialGenerator(1664525, 1013904223, 2 << 31) + while True: + print(lcg.next_number()) diff --git a/python-mega-algo/other/lru_cache.py b/python-mega-algo/other/lru_cache.py new file mode 100644 index 00000000..2a9d7e49 --- /dev/null +++ b/python-mega-algo/other/lru_cache.py @@ -0,0 +1,193 @@ +from typing import Callable, Optional + + +class DoubleLinkedListNode: + """ + Double Linked List Node built specifically for LRU Cache + """ + + def __init__(self, key: int, val: int): + self.key = key + self.val = val + self.next = None + self.prev = None + + +class DoubleLinkedList: + """ + Double Linked List built specifically for LRU Cache + """ + + def __init__(self): + self.head = DoubleLinkedListNode(None, None) + self.rear = DoubleLinkedListNode(None, None) + self.head.next, self.rear.prev = self.rear, self.head + + def add(self, node: DoubleLinkedListNode) -> None: + """ + Adds the given node to the end of the list (before rear) + """ + + temp = self.rear.prev + temp.next, node.prev = node, temp + self.rear.prev, node.next = node, self.rear + + def remove(self, node: DoubleLinkedListNode) -> DoubleLinkedListNode: + """ + Removes and returns the given node from the list + """ + + temp_last, temp_next = node.prev, node.next + node.prev, node.next = None, None + temp_last.next, temp_next.prev = temp_next, temp_last + + return node + + +class LRUCache: + """ + LRU Cache to store a given capacity of data. Can be used as a stand-alone object + or as a function decorator. + + >>> cache = LRUCache(2) + + >>> cache.set(1, 1) + + >>> cache.set(2, 2) + + >>> cache.get(1) + 1 + + >>> cache.set(3, 3) + + >>> cache.get(2) # None returned + + >>> cache.set(4, 4) + + >>> cache.get(1) # None returned + + >>> cache.get(3) + 3 + + >>> cache.get(4) + 4 + + >>> cache + CacheInfo(hits=3, misses=2, capacity=2, current size=2) + + >>> @LRUCache.decorator(100) + ... def fib(num): + ... if num in (1, 2): + ... return 1 + ... return fib(num - 1) + fib(num - 2) + + >>> for i in range(1, 100): + ... res = fib(i) + + >>> fib.cache_info() + CacheInfo(hits=194, misses=99, capacity=100, current size=99) + """ + + # class variable to map the decorator functions to their respective instance + decorator_function_to_instance_map = {} + + def __init__(self, capacity: int): + self.list = DoubleLinkedList() + self.capacity = capacity + self.num_keys = 0 + self.hits = 0 + self.miss = 0 + self.cache = {} + + def __repr__(self) -> str: + """ + Return the details for the cache instance + [hits, misses, capacity, current_size] + """ + + return ( + f"CacheInfo(hits={self.hits}, misses={self.miss}, " + f"capacity={self.capacity}, current size={self.num_keys})" + ) + + def __contains__(self, key: int) -> bool: + """ + >>> cache = LRUCache(1) + + >>> 1 in cache + False + + >>> cache.set(1, 1) + + >>> 1 in cache + True + """ + + return key in self.cache + + def get(self, key: int) -> Optional[int]: + """ + Returns the value for the input key and updates the Double Linked List. Returns + None if key is not present in cache + """ + + if key in self.cache: + self.hits += 1 + self.list.add(self.list.remove(self.cache[key])) + return self.cache[key].val + self.miss += 1 + return None + + def set(self, key: int, value: int) -> None: + """ + Sets the value for the input key and updates the Double Linked List + """ + + if key not in self.cache: + if self.num_keys >= self.capacity: + key_to_delete = self.list.head.next.key + self.list.remove(self.cache[key_to_delete]) + del self.cache[key_to_delete] + self.num_keys -= 1 + self.cache[key] = DoubleLinkedListNode(key, value) + self.list.add(self.cache[key]) + self.num_keys += 1 + + else: + node = self.list.remove(self.cache[key]) + node.val = value + self.list.add(node) + + @staticmethod + def decorator(size: int = 128): + """ + Decorator version of LRU Cache + """ + + def cache_decorator_inner(func: Callable): + def cache_decorator_wrapper(*args, **kwargs): + if func not in LRUCache.decorator_function_to_instance_map: + LRUCache.decorator_function_to_instance_map[func] = LRUCache(size) + + result = LRUCache.decorator_function_to_instance_map[func].get(args[0]) + if result is None: + result = func(*args, **kwargs) + LRUCache.decorator_function_to_instance_map[func].set( + args[0], result + ) + return result + + def cache_info(): + return LRUCache.decorator_function_to_instance_map[func] + + cache_decorator_wrapper.cache_info = cache_info + + return cache_decorator_wrapper + + return cache_decorator_inner + + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/other/magicdiamondpattern.py b/python-mega-algo/other/magicdiamondpattern.py new file mode 100644 index 00000000..27912889 --- /dev/null +++ b/python-mega-algo/other/magicdiamondpattern.py @@ -0,0 +1,55 @@ +# Python program for generating diamond pattern in Python 3.7+ + + +# Function to print upper half of diamond (pyramid) +def floyd(n): + """ + Parameters: + n : size of pattern + """ + for i in range(0, n): + for j in range(0, n - i - 1): # printing spaces + print(" ", end="") + for k in range(0, i + 1): # printing stars + print("* ", end="") + print() + + +# Function to print lower half of diamond (pyramid) +def reverse_floyd(n): + """ + Parameters: + n : size of pattern + """ + for i in range(n, 0, -1): + for j in range(i, 0, -1): # printing stars + print("* ", end="") + print() + for k in range(n - i + 1, 0, -1): # printing spaces + print(" ", end="") + + +# Function to print complete diamond pattern of "*" +def pretty_print(n): + """ + Parameters: + n : size of pattern + """ + if n <= 0: + print(" ... .... nothing printing :(") + return + floyd(n) # upper half + reverse_floyd(n) # lower half + + +if __name__ == "__main__": + print(r"| /\ | |- | |- |--| |\ /| |-") + print(r"|/ \| |- |_ |_ |__| | \/ | |_") + K = 1 + while K: + user_number = int(input("enter the number and , and see the magic : ")) + print() + pretty_print(user_number) + K = int(input("press 0 to exit... and 1 to continue...")) + + print("Good Bye...") diff --git a/python-mega-algo/other/nested_brackets.py b/python-mega-algo/other/nested_brackets.py new file mode 100644 index 00000000..99e2f3a3 --- /dev/null +++ b/python-mega-algo/other/nested_brackets.py @@ -0,0 +1,47 @@ +""" +The nested brackets problem is a problem that determines if a sequence of +brackets are properly nested. A sequence of brackets s is considered properly nested +if any of the following conditions are true: + + - s is empty + - s has the form (U) or [U] or {U} where U is a properly nested string + - s has the form VW where V and W are properly nested strings + +For example, the string "()()[()]" is properly nested but "[(()]" is not. + +The function called is_balanced takes as input a string S which is a sequence of +brackets and returns true if S is nested and false otherwise. +""" + + +def is_balanced(S): + + stack = [] + open_brackets = set({"(", "[", "{"}) + closed_brackets = set({")", "]", "}"}) + open_to_closed = dict({"{": "}", "[": "]", "(": ")"}) + + for i in range(len(S)): + + if S[i] in open_brackets: + stack.append(S[i]) + + elif S[i] in closed_brackets: + if len(stack) == 0 or ( + len(stack) > 0 and open_to_closed[stack.pop()] != S[i] + ): + return False + + return len(stack) == 0 + + +def main(): + s = input("Enter sequence of brackets: ") + if is_balanced(s): + print(s, "is balanced") + else: + print(s, "is not balanced") + + +if __name__ == "__main__": + main() diff --git a/python-mega-algo/other/password_generator.py b/python-mega-algo/other/password_generator.py new file mode 100644 index 00000000..cf7250c8 --- /dev/null +++ b/python-mega-algo/other/password_generator.py @@ -0,0 +1,77 @@ +"""Password generator allows you to generate a random password of length N.""" +from random import choice, shuffle +from string import ascii_letters, digits, punctuation + + +def password_generator(length=8): + """ + >>> len(password_generator()) + 8 + >>> len(password_generator(length=16)) + 16 + >>> len(password_generator(257)) + 257 + >>> len(password_generator(length=0)) + 0 + >>> len(password_generator(-1)) + 0 + """ + chars = ascii_letters + digits + punctuation + return "".join(choice(chars) for x in range(length)) + + +# ALTERNATIVE METHODS +# ctbi= characters that must be in password +# i= how many letters or characters the password length will be +def alternative_password_generator(ctbi, i): + # Password generator = full boot with random_number, random_letters, and + # random_character FUNCTIONS + # Put your code here... + i = i - len(ctbi) + quotient = int(i / 3) + remainder = i % 3 + # chars = ctbi + random_letters(ascii_letters, i / 3 + remainder) + + # random_number(digits, i / 3) + random_characters(punctuation, i / 3) + chars = ( + ctbi + + random(ascii_letters, quotient + remainder) + + random(digits, quotient) + + random(punctuation, quotient) + ) + chars = list(chars) + shuffle(chars) + return "".join(chars) + + # random is a generalised function for letters, characters and numbers + + +def random(ctbi, i): + return "".join(choice(ctbi) for x in range(i)) + + +def random_number(ctbi, i): + pass # Put your code here... + + +def random_letters(ctbi, i): + pass # Put your code here... + + +def random_characters(ctbi, i): + pass # Put your code here... + + +def main(): + length = int(input("Please indicate the max length of your password: ").strip()) + ctbi = input( + "Please indicate the characters that must be in your password: " + ).strip() + print("Password generated:", password_generator(length)) + print( + "Alternative Password generated:", alternative_password_generator(ctbi, length) + ) + print("[If you are thinking of using this passsword, You better save it.]") + + +if __name__ == "__main__": + main() diff --git a/python-mega-algo/other/right.html b/python-mega-algo/other/right.html new file mode 100644 index 00000000..5e00d649 --- /dev/null +++ b/python-mega-algo/other/right.html @@ -0,0 +1,33 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/other + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + + + + + +
    FileFileFileFile
    activity_...ion.py gauss_easter.py linear_co...tor.py scoring_a...thm.py 
    davis–put...and.py graham_scan.py lru_cache.py sdes.py 
    dijkstra_...thm.py greedy.py magicdiam...ern.py tower_of_hanoi.py 
    doomsday.py least_rec...sed.py nested_brackets.py __init__.py 
    fischer_y...fle.py lfu_cache.py password_...tor.py 
    + +

    +Folders: 1
    +Files: 19
    +Size of all files: 57132 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/other/scoring_algorithm.py b/python-mega-algo/other/scoring_algorithm.py new file mode 100644 index 00000000..77e614e2 --- /dev/null +++ b/python-mega-algo/other/scoring_algorithm.py @@ -0,0 +1,89 @@ +""" +developed by: markmelnic +original repo: https://github.com/markmelnic/Scoring-Algorithm + +Analyse data using a range based percentual proximity algorithm +and calculate the linear maximum likelihood estimation. +The basic principle is that all values supplied will be broken +down to a range from 0 to 1 and each column's score will be added +up to get the total score. + +========== +Example for data of vehicles +price|mileage|registration_year +20k |60k |2012 +22k |50k |2011 +23k |90k |2015 +16k |210k |2010 + +We want the vehicle with the lowest price, +lowest mileage but newest registration year. +Thus the weights for each column are as follows: +[0, 0, 1] + +>>> procentual_proximity([[20, 60, 2012],[23, 90, 2015],[22, 50, 2011]], [0, 0, 1]) +[[20, 60, 2012, 2.0], [23, 90, 2015, 1.0], [22, 50, 2011, 1.3333333333333335]] +""" + + +def procentual_proximity(source_data: list, weights: list) -> list: + + """ + weights - int list + possible values - 0 / 1 + 0 if lower values have higher weight in the data set + 1 if higher values have higher weight in the data set + """ + + # getting data + data_lists = [] + for item in source_data: + for i in range(len(item)): + try: + data_lists[i].append(float(item[i])) + except IndexError: + # generate corresponding number of lists + data_lists.append([]) + data_lists[i].append(float(item[i])) + + score_lists = [] + # calculating each score + for dlist, weight in zip(data_lists, weights): + mind = min(dlist) + maxd = max(dlist) + + score = [] + # for weight 0 score is 1 - actual score + if weight == 0: + for item in dlist: + try: + score.append(1 - ((item - mind) / (maxd - mind))) + except ZeroDivisionError: + score.append(1) + + elif weight == 1: + for item in dlist: + try: + score.append((item - mind) / (maxd - mind)) + except ZeroDivisionError: + score.append(0) + + # weight not 0 or 1 + else: + raise ValueError("Invalid weight of %f provided" % (weight)) + + score_lists.append(score) + + # initialize final scores + final_scores = [0 for i in range(len(score_lists[0]))] + + # generate final scores + for i, slist in enumerate(score_lists): + for j, ele in enumerate(slist): + final_scores[j] = final_scores[j] + ele + + # append scores to source data + for i, ele in enumerate(final_scores): + source_data[i].append(ele) + + return source_data diff --git a/python-mega-algo/other/sdes.py b/python-mega-algo/other/sdes.py new file mode 100644 index 00000000..f35e5119 --- /dev/null +++ b/python-mega-algo/other/sdes.py @@ -0,0 +1,97 @@ +def apply_table(inp, table): + """ + >>> apply_table("0123456789", list(range(10))) + '9012345678' + >>> apply_table("0123456789", list(range(9, -1, -1))) + '8765432109' + """ + res = "" + for i in table: + res += inp[i - 1] + return res + + +def left_shift(data): + """ + >>> left_shift("0123456789") + '1234567890' + """ + return data[1:] + data[0] + + +def XOR(a, b): + """ + >>> XOR("01010101", "00001111") + '01011010' + """ + res = "" + for i in range(len(a)): + if a[i] == b[i]: + res += "0" + else: + res += "1" + return res + + +def apply_sbox(s, data): + row = int("0b" + data[0] + data[-1], 2) + col = int("0b" + data[1:3], 2) + return bin(s[row][col])[2:] + + +def function(expansion, s0, s1, key, message): + left = message[:4] + right = message[4:] + temp = apply_table(right, expansion) + temp = XOR(temp, key) + l = apply_sbox(s0, temp[:4]) # noqa: E741 + r = apply_sbox(s1, temp[4:]) + l = "0" * (2 - len(l)) + l # noqa: E741 + r = "0" * (2 - len(r)) + r + temp = apply_table(l + r, p4_table) + temp = XOR(left, temp) + return temp + right + + +if __name__ == "__main__": + + key = input("Enter 10 bit key: ") + message = input("Enter 8 bit message: ") + + p8_table = [6, 3, 7, 4, 8, 5, 10, 9] + p10_table = [3, 5, 2, 7, 4, 10, 1, 9, 8, 6] + p4_table = [2, 4, 3, 1] + IP = [2, 6, 3, 1, 4, 8, 5, 7] + IP_inv = [4, 1, 3, 5, 7, 2, 8, 6] + expansion = [4, 1, 2, 3, 2, 3, 4, 1] + s0 = [[1, 0, 3, 2], [3, 2, 1, 0], [0, 2, 1, 3], [3, 1, 3, 2]] + s1 = [[0, 1, 2, 3], [2, 0, 1, 3], [3, 0, 1, 0], [2, 1, 0, 3]] + + # key generation + temp = apply_table(key, p10_table) + left = temp[:5] + right = temp[5:] + left = left_shift(left) + right = left_shift(right) + key1 = apply_table(left + right, p8_table) + left = left_shift(left) + right = left_shift(right) + left = left_shift(left) + right = left_shift(right) + key2 = apply_table(left + right, p8_table) + + # encryption + temp = apply_table(message, IP) + temp = function(expansion, s0, s1, key1, temp) + temp = temp[4:] + temp[:4] + temp = function(expansion, s0, s1, key2, temp) + CT = apply_table(temp, IP_inv) + print("Cipher text is:", CT) + + # decryption + temp = apply_table(CT, IP) + temp = function(expansion, s0, s1, key2, temp) + temp = temp[4:] + temp[:4] + temp = function(expansion, s0, s1, key1, temp) + PT = apply_table(temp, IP_inv) + print("Plain text after decypting is:", PT) diff --git a/python-mega-algo/other/tower_of_hanoi.py b/python-mega-algo/other/tower_of_hanoi.py new file mode 100644 index 00000000..3cc0e40b --- /dev/null +++ b/python-mega-algo/other/tower_of_hanoi.py @@ -0,0 +1,28 @@ +def moveTower(height, fromPole, toPole, withPole): + """ + >>> moveTower(3, 'A', 'B', 'C') + moving disk from A to B + moving disk from A to C + moving disk from B to C + moving disk from A to B + moving disk from C to A + moving disk from C to B + moving disk from A to B + """ + if height >= 1: + moveTower(height - 1, fromPole, withPole, toPole) + moveDisk(fromPole, toPole) + moveTower(height - 1, withPole, toPole, fromPole) + + +def moveDisk(fp, tp): + print("moving disk from", fp, "to", tp) + + +def main(): + height = int(input("Height of hanoi: ").strip()) + moveTower(height, "A", "B", "C") + + +if __name__ == "__main__": + main() diff --git a/python-mega-algo/physics/n_body_simulation.py b/python-mega-algo/physics/n_body_simulation.py new file mode 100644 index 00000000..ccacd6b1 --- /dev/null +++ b/python-mega-algo/physics/n_body_simulation.py @@ -0,0 +1,348 @@ +""" +In physics and astronomy, a gravitational N-body simulation is a simulation of a +dynamical system of particles under the influence of gravity. The system +consists of a number of bodies, each of which exerts a gravitational force on all +other bodies. These forces are calculated using Newton's law of universal +gravitation. The Euler method is used at each time-step to calculate the change in +velocity and position brought about by these forces. Softening is used to prevent +numerical divergences when a particle comes too close to another (and the force +goes to infinity). +(Description adapted from https://en.wikipedia.org/wiki/N-body_simulation ) +(See also http://www.shodor.org/refdesk/Resources/Algorithms/EulersMethod/ ) +""" + + +from __future__ import annotations + +import random + +from matplotlib import animation +from matplotlib import pyplot as plt + + +class Body: + def __init__( + self, + position_x: float, + position_y: float, + velocity_x: float, + velocity_y: float, + mass: float = 1.0, + size: float = 1.0, + color: str = "blue", + ) -> None: + """ + The parameters "size" & "color" are not relevant for the simulation itself, + they are only used for plotting. + """ + self.position_x = position_x + self.position_y = position_y + self.velocity_x = velocity_x + self.velocity_y = velocity_y + self.mass = mass + self.size = size + self.color = color + + @property + def position(self) -> tuple[float, float]: + return self.position_x, self.position_y + + @property + def velocity(self) -> tuple[float, float]: + return self.velocity_x, self.velocity_y + + def update_velocity( + self, force_x: float, force_y: float, delta_time: float + ) -> None: + """ + Euler algorithm for velocity + + >>> body_1 = Body(0.,0.,0.,0.) + >>> body_1.update_velocity(1.,0.,1.) + >>> body_1.velocity + (1.0, 0.0) + + >>> body_1.update_velocity(1.,0.,1.) + >>> body_1.velocity + (2.0, 0.0) + + >>> body_2 = Body(0.,0.,5.,0.) + >>> body_2.update_velocity(0.,-10.,10.) + >>> body_2.velocity + (5.0, -100.0) + + >>> body_2.update_velocity(0.,-10.,10.) + >>> body_2.velocity + (5.0, -200.0) + """ + self.velocity_x += force_x * delta_time + self.velocity_y += force_y * delta_time + + def update_position(self, delta_time: float) -> None: + """ + Euler algorithm for position + + >>> body_1 = Body(0.,0.,1.,0.) + >>> body_1.update_position(1.) + >>> body_1.position + (1.0, 0.0) + + >>> body_1.update_position(1.) + >>> body_1.position + (2.0, 0.0) + + >>> body_2 = Body(10.,10.,0.,-2.) + >>> body_2.update_position(1.) + >>> body_2.position + (10.0, 8.0) + + >>> body_2.update_position(1.) + >>> body_2.position + (10.0, 6.0) + """ + self.position_x += self.velocity_x * delta_time + self.position_y += self.velocity_y * delta_time + + +class BodySystem: + """ + This class is used to hold the bodies, the gravitation constant, the time + factor and the softening factor. The time factor is used to control the speed + of the simulation. The softening factor is used for softening, a numerical + trick for N-body simulations to prevent numerical divergences when two bodies + get too close to each other. + """ + + def __init__( + self, + bodies: list[Body], + gravitation_constant: float = 1.0, + time_factor: float = 1.0, + softening_factor: float = 0.0, + ) -> None: + self.bodies = bodies + self.gravitation_constant = gravitation_constant + self.time_factor = time_factor + self.softening_factor = softening_factor + + def __len__(self) -> int: + return len(self.bodies) + + def update_system(self, delta_time: float) -> None: + """ + For each body, loop through all other bodies to calculate the total + force they exert on it. Use that force to update the body's velocity. + + >>> body_system_1 = BodySystem([Body(0,0,0,0), Body(10,0,0,0)]) + >>> len(body_system_1) + 2 + >>> body_system_1.update_system(1) + >>> body_system_1.bodies[0].position + (0.01, 0.0) + >>> body_system_1.bodies[0].velocity + (0.01, 0.0) + + >>> body_system_2 = BodySystem([Body(-10,0,0,0), Body(10,0,0,0, mass=4)], 1, 10) + >>> body_system_2.update_system(1) + >>> body_system_2.bodies[0].position + (-9.0, 0.0) + >>> body_system_2.bodies[0].velocity + (0.1, 0.0) + """ + for body1 in self.bodies: + force_x = 0.0 + force_y = 0.0 + for body2 in self.bodies: + if body1 != body2: + dif_x = body2.position_x - body1.position_x + dif_y = body2.position_y - body1.position_y + + # Calculation of the distance using Pythagoras's theorem + # Extra factor due to the softening technique + distance = (dif_x ** 2 + dif_y ** 2 + self.softening_factor) ** ( + 1 / 2 + ) + + # Newton's law of universal gravitation. + force_x += ( + self.gravitation_constant * body2.mass * dif_x / distance ** 3 + ) + force_y += ( + self.gravitation_constant * body2.mass * dif_y / distance ** 3 + ) + + # Update the body's velocity once all the force components have been added + body1.update_velocity(force_x, force_y, delta_time * self.time_factor) + + # Update the positions only after all the velocities have been updated + for body in self.bodies: + body.update_position(delta_time * self.time_factor) + + +def update_step( + body_system: BodySystem, delta_time: float, patches: list[plt.Circle] +) -> None: + """ + Updates the body-system and applies the change to the patch-list used for plotting + + >>> body_system_1 = BodySystem([Body(0,0,0,0), Body(10,0,0,0)]) + >>> patches_1 = [plt.Circle((body.position_x, body.position_y), body.size, + ... fc=body.color)for body in body_system_1.bodies] #doctest: +ELLIPSIS + >>> update_step(body_system_1, 1, patches_1) + >>> patches_1[0].center + (0.01, 0.0) + + >>> body_system_2 = BodySystem([Body(-10,0,0,0), Body(10,0,0,0, mass=4)], 1, 10) + >>> patches_2 = [plt.Circle((body.position_x, body.position_y), body.size, + ... fc=body.color)for body in body_system_2.bodies] #doctest: +ELLIPSIS + >>> update_step(body_system_2, 1, patches_2) + >>> patches_2[0].center + (-9.0, 0.0) + """ + # Update the positions of the bodies + body_system.update_system(delta_time) + + # Update the positions of the patches + for patch, body in zip(patches, body_system.bodies): + patch.center = (body.position_x, body.position_y) + + +def plot( + title: str, + body_system: BodySystem, + x_start: float = -1, + x_end: float = 1, + y_start: float = -1, + y_end: float = 1, +) -> None: + """ + Utility function to plot how the given body-system evolves over time. + No doctest provided since this function does not have a return value. + """ + + INTERVAL = 20 # Frame rate of the animation + DELTA_TIME = INTERVAL / 1000 # Time between time steps in seconds + + fig = plt.figure() + fig.canvas.set_window_title(title) + ax = plt.axes( + xlim=(x_start, x_end), ylim=(y_start, y_end) + ) # Set section to be plotted + plt.gca().set_aspect("equal") # Fix aspect ratio + + # Each body is drawn as a patch by the plt-function + patches = [ + plt.Circle((body.position_x, body.position_y), body.size, fc=body.color) + for body in body_system.bodies + ] + + for patch in patches: + ax.add_patch(patch) + + # Function called at each step of the animation + def update(frame: int) -> list[plt.Circle]: + update_step(body_system, DELTA_TIME, patches) + return patches + + anim = animation.FuncAnimation( # noqa: F841 + fig, update, interval=INTERVAL, blit=True + ) + + plt.show() + + +def example_1() -> BodySystem: + """ + Example 1: figure-8 solution to the 3-body-problem + This example can be seen as a test of the implementation: given the right + initial conditions, the bodies should move in a figure-8. + (initial conditions taken from http://www.artcompsci.org/vol_1/v1_web/node56.html) + >>> body_system = example_1() + >>> len(body_system) + 3 + """ + + position_x = 0.9700436 + position_y = -0.24308753 + velocity_x = 0.466203685 + velocity_y = 0.43236573 + + bodies1 = [ + Body(position_x, position_y, velocity_x, velocity_y, size=0.2, color="red"), + Body(-position_x, -position_y, velocity_x, velocity_y, size=0.2, color="green"), + Body(0, 0, -2 * velocity_x, -2 * velocity_y, size=0.2, color="blue"), + ] + return BodySystem(bodies1, time_factor=3) + + +def example_2() -> BodySystem: + """ + Example 2: Moon's orbit around the earth + This example can be seen as a test of the implementation: given the right + initial conditions, the moon should orbit around the earth as it actually does. + (mass, velocity and distance taken from https://en.wikipedia.org/wiki/Earth + and https://en.wikipedia.org/wiki/Moon) + No doctest provided since this function does not have a return value. + """ + + moon_mass = 7.3476e22 + earth_mass = 5.972e24 + velocity_dif = 1022 + earth_moon_distance = 384399000 + gravitation_constant = 6.674e-11 + + # Calculation of the respective velocities so that total impulse is zero, + # i.e. the two bodies together don't move + moon_velocity = earth_mass * velocity_dif / (earth_mass + moon_mass) + earth_velocity = moon_velocity - velocity_dif + + moon = Body(-earth_moon_distance, 0, 0, moon_velocity, moon_mass, 10000000, "grey") + earth = Body(0, 0, 0, earth_velocity, earth_mass, 50000000, "blue") + return BodySystem([earth, moon], gravitation_constant, time_factor=1000000) + + +def example_3() -> BodySystem: + """ + Example 3: Random system with many bodies. + No doctest provided since this function does not have a return value. + """ + + bodies = [] + for i in range(10): + velocity_x = random.uniform(-0.5, 0.5) + velocity_y = random.uniform(-0.5, 0.5) + + # Bodies are created pairwise with opposite velocities so that the + # total impulse remains zero + bodies.append( + Body( + random.uniform(-0.5, 0.5), + random.uniform(-0.5, 0.5), + velocity_x, + velocity_y, + size=0.05, + ) + ) + bodies.append( + Body( + random.uniform(-0.5, 0.5), + random.uniform(-0.5, 0.5), + -velocity_x, + -velocity_y, + size=0.05, + ) + ) + return BodySystem(bodies, 0.01, 10, 0.1) + + +if __name__ == "__main__": + plot("Figure-8 solution to the 3-body-problem", example_1(), -2, 2, -2, 2) + plot( + "Moon's orbit around the earth", + example_2(), + -430000000, + 430000000, + -430000000, + 430000000, + ) + plot("Random system with many bodies", example_3(), -1.5, 1.5, -1.5, 1.5) diff --git a/python-mega-algo/physics/right.html b/python-mega-algo/physics/right.html new file mode 100644 index 00000000..b0b90f05 --- /dev/null +++ b/python-mega-algo/physics/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/physics + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    n_body_si...ion.py 
    + +

    +Folders: 1
    +Files: 1
    +Size of all files: 11829 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/project_euler/README.md b/python-mega-algo/project_euler/README.md new file mode 100644 index 00000000..1cc6f815 --- /dev/null +++ b/python-mega-algo/project_euler/README.md @@ -0,0 +1,118 @@ +# Project Euler + +Problems are taken from https://projecteuler.net/, the Project Euler. [Problems are licensed under CC BY-NC-SA 4.0](https://projecteuler.net/copyright). + +Project Euler is a series of challenging mathematical/computer programming problems that require more than just mathematical +insights to solve. Project Euler is ideal for mathematicians who are learning to code. + +The solutions will be checked by our [automated testing on Travis CI](https://travis-ci.com/github/TheAlgorithms/Python/pull_requests) with the help of [this script](https://github.com/TheAlgorithms/Python/blob/master/scripts/validate_solutions.py). The efficiency of your code is also checked. You can view the top 10 slowest solutions on Travis CI logs (under `slowest 10 durations`) and open a pull request to improve those solutions. + + +## Solution Guidelines + +Welcome to [TheAlgorithms/Python](https://github.com/TheAlgorithms/Python)! Before reading the solution guidelines, make sure you read the whole [Contributing Guidelines](https://github.com/TheAlgorithms/Python/blob/master/CONTRIBUTING.md) as it won't be repeated in here. If you have any doubt on the guidelines, please feel free to [state it clearly in an issue](https://github.com/TheAlgorithms/Python/issues/new) or ask the community in [Gitter](https://gitter.im/TheAlgorithms). You can use the [template](https://github.com/TheAlgorithms/Python/blob/master/project_euler/README.md#solution-template) we have provided below as your starting point but be sure to read the [Coding Style](https://github.com/TheAlgorithms/Python/blob/master/project_euler/README.md#coding-style) part first. + +### Coding Style + +* Please maintain consistency in project directory and solution file names. Keep the following points in mind: + * Create a new directory only for the problems which do not exist yet. + * If you create a new directory, please create an empty `__init__.py` file inside it as well. + * Please name the project **directory** as `problem_` where `problem_number` should be filled with 0s so as to occupy 3 digits. Example: `problem_001`, `problem_002`, `problem_067`, `problem_145`, and so on. + +* Please provide a link to the problem and other references, if used, in the **module-level docstring**. + +* All imports should come ***after*** the module-level docstring. + +* You can have as many helper functions as you want but there should be one main function called `solution` which should satisfy the conditions as stated below: + * It should contain positional argument(s) whose default value is the question input. Example: Please take a look at [Problem 1](https://projecteuler.net/problem=1) where the question is to *Find the sum of all the multiples of 3 or 5 below 1000.* In this case the main solution function will be `solution(limit: int = 1000)`. + * When the `solution` function is called without any arguments like so: `solution()`, it should return the answer to the problem. + +* Every function, which includes all the helper functions, if any, and the main solution function, should have `doctest` in the function docstring along with a brief statement mentioning what the function is about. + * There should not be a `doctest` for testing the answer as that is done by our Travis CI build using this [script](https://github.com/TheAlgorithms/Python/blob/master/project_euler/validate_solutions.py). Keeping in mind the above example of [Problem 1](https://projecteuler.net/problem=1): + + ```python + def solution(limit: int = 1000): + """ + A brief statement mentioning what the function is about. + + You can have a detailed explanation about the solution method in the + module-level docstring. + + >>> solution(1) + ... + >>> solution(16) + ... + >>> solution(100) + ... + """ + ``` + +### Solution Template + +You can use the below template as your starting point but please read the [Coding Style](https://github.com/TheAlgorithms/Python/blob/master/project_euler/README.md#coding-style) first to understand how the template works. + +Please change the name of the helper functions accordingly, change the parameter names with a descriptive one, replace the content within `[square brackets]` (including the brackets) with the appropriate content. + +```python +""" +Project Euler Problem [problem number]: [link to the original problem] + +... [Entire problem statement] ... + +... [Solution explanation - Optional] ... + +References [Optional]: +- [Wikipedia link to the topic] +- [Stackoverflow link] +... + +""" +import module1 +import module2 +... + +def helper1(arg1: [type hint], arg2: [type hint], ...) -> [Return type hint]: + """ + A brief statement explaining what the function is about. + + ... A more elaborate description ... [Optional] + + ... + [Doctest] + ... + + """ + ... + # calculations + ... + + return + + +# You can have multiple helper functions but the solution function should be +# after all the helper functions ... + + +def solution(arg1: [type hint], arg2: [type hint], ...) -> [Return type hint]: + """ + A brief statement mentioning what the function is about. + + You can have a detailed explanation about the solution in the + module-level docstring. + + ... + [Doctest as mentioned above] + ... + + """ + + ... + # calculations + ... + + return answer + + +if __name__ == "__main__": + print(f"{solution() = }") +``` diff --git a/python-mega-algo/project_euler/__init__.py b/python-mega-algo/project_euler/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/project_euler/problem_001/__init__.py b/python-mega-algo/project_euler/problem_001/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/project_euler/problem_001/right.html b/python-mega-algo/project_euler/problem_001/right.html new file mode 100644 index 00000000..7c6e8f52 --- /dev/null +++ b/python-mega-algo/project_euler/problem_001/right.html @@ -0,0 +1,30 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/project_euler/problem_001 + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + + +
    FileFileFileFile
    sol1.py sol3.py sol5.py sol7.py 
    sol2.py sol4.py sol6.py __init__.py 
    + +

    +Folders: 1
    +Files: 8
    +Size of all files: 5984 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/project_euler/problem_001/sol1.py b/python-mega-algo/project_euler/problem_001/sol1.py new file mode 100644 index 00000000..85ad3229 --- /dev/null +++ b/python-mega-algo/project_euler/problem_001/sol1.py @@ -0,0 +1,33 @@ +""" +Project Euler Problem 1: https://projecteuler.net/problem=1 + +Multiples of 3 and 5 + +If we list all the natural numbers below 10 that are multiples of 3 or 5, +we get 3, 5, 6 and 9. The sum of these multiples is 23. + +Find the sum of all the multiples of 3 or 5 below 1000. +""" + + +def solution(n: int = 1000) -> int: + """ + Returns the sum of all the multiples of 3 or 5 below n. + + >>> solution(3) + 0 + >>> solution(4) + 3 + >>> solution(10) + 23 + >>> solution(600) + 83700 + >>> solution(-7) + 0 + """ + + return sum([e for e in range(3, n) if e % 3 == 0 or e % 5 == 0]) + + +if __name__ == "__main__": + print(f"{solution() = }") diff --git a/python-mega-algo/project_euler/problem_001/sol2.py b/python-mega-algo/project_euler/problem_001/sol2.py new file mode 100644 index 00000000..7093d351 --- /dev/null +++ b/python-mega-algo/project_euler/problem_001/sol2.py @@ -0,0 +1,38 @@ +""" +Project Euler Problem 1: https://projecteuler.net/problem=1 + +Multiples of 3 and 5 + +If we list all the natural numbers below 10 that are multiples of 3 or 5, +we get 3, 5, 6 and 9. The sum of these multiples is 23. + +Find the sum of all the multiples of 3 or 5 below 1000. +""" + + +def solution(n: int = 1000) -> int: + """ + Returns the sum of all the multiples of 3 or 5 below n. + + >>> solution(3) + 0 + >>> solution(4) + 3 + >>> solution(10) + 23 + >>> solution(600) + 83700 + """ + + total = 0 + terms = (n - 1) // 3 + total += ((terms) * (6 + (terms - 1) * 3)) // 2 # total of an A.P. + terms = (n - 1) // 5 + total += ((terms) * (10 + (terms - 1) * 5)) // 2 + terms = (n - 1) // 15 + total -= ((terms) * (30 + (terms - 1) * 15)) // 2 + return total + + +if __name__ == "__main__": + print(f"{solution() = }") diff --git a/python-mega-algo/project_euler/problem_001/sol3.py b/python-mega-algo/project_euler/problem_001/sol3.py new file mode 100644 index 00000000..8267fec8 --- /dev/null +++ b/python-mega-algo/project_euler/problem_001/sol3.py @@ -0,0 +1,64 @@ +""" +Project Euler Problem 1: https://projecteuler.net/problem=1 + +Multiples of 3 and 5 + +If we list all the natural numbers below 10 that are multiples of 3 or 5, +we get 3, 5, 6 and 9. The sum of these multiples is 23. + +Find the sum of all the multiples of 3 or 5 below 1000. +""" + + +def solution(n: int = 1000) -> int: + """ + This solution is based on the pattern that the successive numbers in the + series follow: 0+3,+2,+1,+3,+1,+2,+3. + Returns the sum of all the multiples of 3 or 5 below n. + + >>> solution(3) + 0 + >>> solution(4) + 3 + >>> solution(10) + 23 + >>> solution(600) + 83700 + """ + + total = 0 + num = 0 + while 1: + num += 3 + if num >= n: + break + total += num + num += 2 + if num >= n: + break + total += num + num += 1 + if num >= n: + break + total += num + num += 3 + if num >= n: + break + total += num + num += 1 + if num >= n: + break + total += num + num += 2 + if num >= n: + break + total += num + num += 3 + if num >= n: + break + total += num + return total + + +if __name__ == "__main__": + print(f"{solution() = }") diff --git a/python-mega-algo/project_euler/problem_001/sol4.py b/python-mega-algo/project_euler/problem_001/sol4.py new file mode 100644 index 00000000..a0643c05 --- /dev/null +++ b/python-mega-algo/project_euler/problem_001/sol4.py @@ -0,0 +1,52 @@ +""" +Project Euler Problem 1: https://projecteuler.net/problem=1 + +Multiples of 3 and 5 + +If we list all the natural numbers below 10 that are multiples of 3 or 5, +we get 3, 5, 6 and 9. The sum of these multiples is 23. + +Find the sum of all the multiples of 3 or 5 below 1000. +""" + + +def solution(n: int = 1000) -> int: + """ + Returns the sum of all the multiples of 3 or 5 below n. + + >>> solution(3) + 0 + >>> solution(4) + 3 + >>> solution(10) + 23 + >>> solution(600) + 83700 + """ + + xmulti = [] + zmulti = [] + z = 3 + x = 5 + temp = 1 + while True: + result = z * temp + if result < n: + zmulti.append(result) + temp += 1 + else: + temp = 1 + break + while True: + result = x * temp + if result < n: + xmulti.append(result) + temp += 1 + else: + break + collection = list(set(xmulti + zmulti)) + return sum(collection) + + +if __name__ == "__main__": + print(f"{solution() = }") diff --git a/python-mega-algo/project_euler/problem_001/sol5.py b/python-mega-algo/project_euler/problem_001/sol5.py new file mode 100644 index 00000000..7f0b0bd1 --- /dev/null +++ b/python-mega-algo/project_euler/problem_001/sol5.py @@ -0,0 +1,32 @@ +""" +Project Euler Problem 1: https://projecteuler.net/problem=1 + +Multiples of 3 and 5 + +If we list all the natural numbers below 10 that are multiples of 3 or 5, +we get 3, 5, 6 and 9. The sum of these multiples is 23. + +Find the sum of all the multiples of 3 or 5 below 1000. +""" + + +def solution(n: int = 1000) -> int: + """ + Returns the sum of all the multiples of 3 or 5 below n. + A straightforward pythonic solution using list comprehension. + + >>> solution(3) + 0 + >>> solution(4) + 3 + >>> solution(10) + 23 + >>> solution(600) + 83700 + """ + + return sum([i for i in range(n) if i % 3 == 0 or i % 5 == 0]) + + +if __name__ == "__main__": + print(f"{solution() = }") diff --git a/python-mega-algo/project_euler/problem_001/sol6.py b/python-mega-algo/project_euler/problem_001/sol6.py new file mode 100644 index 00000000..8ddce18c --- /dev/null +++ b/python-mega-algo/project_euler/problem_001/sol6.py @@ -0,0 +1,39 @@ +""" +Project Euler Problem 1: https://projecteuler.net/problem=1 + +Multiples of 3 and 5 + +If we list all the natural numbers below 10 that are multiples of 3 or 5, +we get 3, 5, 6 and 9. The sum of these multiples is 23. + +Find the sum of all the multiples of 3 or 5 below 1000. +""" + + +def solution(n: int = 1000) -> int: + """ + Returns the sum of all the multiples of 3 or 5 below n. + + >>> solution(3) + 0 + >>> solution(4) + 3 + >>> solution(10) + 23 + >>> solution(600) + 83700 + """ + + a = 3 + result = 0 + while a < n: + if a % 3 == 0 or a % 5 == 0: + result += a + elif a % 15 == 0: + result -= a + a += 1 + return result + + +if __name__ == "__main__": + print(f"{solution() = }") diff --git a/python-mega-algo/project_euler/problem_001/sol7.py b/python-mega-algo/project_euler/problem_001/sol7.py new file mode 100644 index 00000000..8f5d1977 --- /dev/null +++ b/python-mega-algo/project_euler/problem_001/sol7.py @@ -0,0 +1,37 @@ +""" +Project Euler Problem 1: https://projecteuler.net/problem=1 + +Multiples of 3 and 5 + +If we list all the natural numbers below 10 that are multiples of 3 or 5, +we get 3, 5, 6 and 9. The sum of these multiples is 23. + +Find the sum of all the multiples of 3 or 5 below 1000. +""" + + +def solution(n: int = 1000) -> int: + """ + Returns the sum of all the multiples of 3 or 5 below n. + + >>> solution(3) + 0 + >>> solution(4) + 3 + >>> solution(10) + 23 + >>> solution(600) + 83700 + """ + + result = 0 + for i in range(n): + if i % 3 == 0: + result += i + elif i % 5 == 0: + result += i + return result + + +if __name__ == "__main__": + print(f"{solution() = }") diff --git a/python-mega-algo/project_euler/problem_002/__init__.py b/python-mega-algo/project_euler/problem_002/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/project_euler/problem_002/right.html b/python-mega-algo/project_euler/problem_002/right.html new file mode 100644 index 00000000..4779e643 --- /dev/null +++ b/python-mega-algo/project_euler/problem_002/right.html @@ -0,0 +1,30 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/project_euler/problem_002 + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + + +
    FileFileFileFile
    sol1.py sol3.py sol5.py __init__.py 
    sol2.py sol4.py 
    + +

    +Folders: 1
    +Files: 6
    +Size of all files: 5943 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/project_euler/problem_002/sol1.py b/python-mega-algo/project_euler/problem_002/sol1.py new file mode 100644 index 00000000..539f68fb --- /dev/null +++ b/python-mega-algo/project_euler/problem_002/sol1.py @@ -0,0 +1,48 @@ +""" +Project Euler Problem 2: https://projecteuler.net/problem=2 + +Even Fibonacci Numbers + +Each new term in the Fibonacci sequence is generated by adding the previous +two terms. By starting with 1 and 2, the first 10 terms will be: + +1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ... + +By considering the terms in the Fibonacci sequence whose values do not exceed +four million, find the sum of the even-valued terms. + +References: + - https://en.wikipedia.org/wiki/Fibonacci_number +""" + + +def solution(n: int = 4000000) -> int: + """ + Returns the sum of all even fibonacci sequence elements that are lower + or equal to n. + + >>> solution(10) + 10 + >>> solution(15) + 10 + >>> solution(2) + 2 + >>> solution(1) + 0 + >>> solution(34) + 44 + """ + + i = 1 + j = 2 + total = 0 + while j <= n: + if j % 2 == 0: + total += j + i, j = j, i + j + + return total + + +if __name__ == "__main__": + print(f"{solution() = }") diff --git a/python-mega-algo/project_euler/problem_002/sol2.py b/python-mega-algo/project_euler/problem_002/sol2.py new file mode 100644 index 00000000..9033d0a6 --- /dev/null +++ b/python-mega-algo/project_euler/problem_002/sol2.py @@ -0,0 +1,46 @@ +""" +Project Euler Problem 2: https://projecteuler.net/problem=2 + +Even Fibonacci Numbers + +Each new term in the Fibonacci sequence is generated by adding the previous +two terms. By starting with 1 and 2, the first 10 terms will be: + +1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ... + +By considering the terms in the Fibonacci sequence whose values do not exceed +four million, find the sum of the even-valued terms. + +References: + - https://en.wikipedia.org/wiki/Fibonacci_number +""" + + +def solution(n: int = 4000000) -> int: + """ + Returns the sum of all even fibonacci sequence elements that are lower + or equal to n. + + >>> solution(10) + 10 + >>> solution(15) + 10 + >>> solution(2) + 2 + >>> solution(1) + 0 + >>> solution(34) + 44 + """ + + even_fibs = [] + a, b = 0, 1 + while b <= n: + if b % 2 == 0: + even_fibs.append(b) + a, b = b, a + b + return sum(even_fibs) + + +if __name__ == "__main__": + print(f"{solution() = }") diff --git a/python-mega-algo/project_euler/problem_002/sol3.py b/python-mega-algo/project_euler/problem_002/sol3.py new file mode 100644 index 00000000..3ae175a9 --- /dev/null +++ b/python-mega-algo/project_euler/problem_002/sol3.py @@ -0,0 +1,48 @@ +""" +Project Euler Problem 2: https://projecteuler.net/problem=2 + +Even Fibonacci Numbers + +Each new term in the Fibonacci sequence is generated by adding the previous +two terms. By starting with 1 and 2, the first 10 terms will be: + +1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ... + +By considering the terms in the Fibonacci sequence whose values do not exceed +four million, find the sum of the even-valued terms. + +References: + - https://en.wikipedia.org/wiki/Fibonacci_number +""" + + +def solution(n: int = 4000000) -> int: + """ + Returns the sum of all even fibonacci sequence elements that are lower + or equal to n. + + >>> solution(10) + 10 + >>> solution(15) + 10 + >>> solution(2) + 2 + >>> solution(1) + 0 + >>> solution(34) + 44 + """ + + if n <= 1: + return 0 + a = 0 + b = 2 + count = 0 + while 4 * b + a <= n: + a, b = b, 4 * b + a + count += a + return count + b + + +if __name__ == "__main__": + print(f"{solution() = }") diff --git a/python-mega-algo/project_euler/problem_002/sol4.py b/python-mega-algo/project_euler/problem_002/sol4.py new file mode 100644 index 00000000..70b7d6a8 --- /dev/null +++ b/python-mega-algo/project_euler/problem_002/sol4.py @@ -0,0 +1,72 @@ +""" +Project Euler Problem 2: https://projecteuler.net/problem=2 + +Even Fibonacci Numbers + +Each new term in the Fibonacci sequence is generated by adding the previous +two terms. By starting with 1 and 2, the first 10 terms will be: + +1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ... + +By considering the terms in the Fibonacci sequence whose values do not exceed +four million, find the sum of the even-valued terms. + +References: + - https://en.wikipedia.org/wiki/Fibonacci_number +""" +import math +from decimal import Decimal, getcontext + + +def solution(n: int = 4000000) -> int: + """ + Returns the sum of all even fibonacci sequence elements that are lower + or equal to n. + + >>> solution(10) + 10 + >>> solution(15) + 10 + >>> solution(2) + 2 + >>> solution(1) + 0 + >>> solution(34) + 44 + >>> solution(3.4) + 2 + >>> solution(0) + Traceback (most recent call last): + ... + ValueError: Parameter n must be greater than or equal to one. + >>> solution(-17) + Traceback (most recent call last): + ... + ValueError: Parameter n must be greater than or equal to one. + >>> solution([]) + Traceback (most recent call last): + ... + TypeError: Parameter n must be int or castable to int. + >>> solution("asd") + Traceback (most recent call last): + ... + TypeError: Parameter n must be int or castable to int. + """ + + try: + n = int(n) + except (TypeError, ValueError): + raise TypeError("Parameter n must be int or castable to int.") + if n <= 0: + raise ValueError("Parameter n must be greater than or equal to one.") + getcontext().prec = 100 + phi = (Decimal(5) ** Decimal(0.5) + 1) / Decimal(2) + + index = (math.floor(math.log(n * (phi + 2), phi) - 1) // 3) * 3 + 2 + num = Decimal(round(phi ** Decimal(index + 1))) / (phi + 2) + total = num // 2 + return int(total) + + +if __name__ == "__main__": + print(f"{solution() = }") diff --git a/python-mega-algo/project_euler/problem_002/sol5.py b/python-mega-algo/project_euler/problem_002/sol5.py new file mode 100644 index 00000000..390fd19e --- /dev/null +++ b/python-mega-algo/project_euler/problem_002/sol5.py @@ -0,0 +1,52 @@ +""" +Project Euler Problem 2: https://projecteuler.net/problem=2 + +Even Fibonacci Numbers + +Each new term in the Fibonacci sequence is generated by adding the previous +two terms. By starting with 1 and 2, the first 10 terms will be: + +1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ... + +By considering the terms in the Fibonacci sequence whose values do not exceed +four million, find the sum of the even-valued terms. + +References: + - https://en.wikipedia.org/wiki/Fibonacci_number +""" + + +def solution(n: int = 4000000) -> int: + """ + Returns the sum of all even fibonacci sequence elements that are lower + or equal to n. + + >>> solution(10) + 10 + >>> solution(15) + 10 + >>> solution(2) + 2 + >>> solution(1) + 0 + >>> solution(34) + 44 + """ + + fib = [0, 1] + i = 0 + while fib[i] <= n: + fib.append(fib[i] + fib[i + 1]) + if fib[i + 2] > n: + break + i += 1 + total = 0 + for j in range(len(fib) - 1): + if fib[j] % 2 == 0: + total += fib[j] + + return total + + +if __name__ == "__main__": + print(f"{solution() = }") diff --git a/python-mega-algo/project_euler/problem_003/__init__.py b/python-mega-algo/project_euler/problem_003/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/project_euler/problem_003/right.html b/python-mega-algo/project_euler/problem_003/right.html new file mode 100644 index 00000000..fc6e2a13 --- /dev/null +++ b/python-mega-algo/project_euler/problem_003/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/project_euler/problem_003 + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    sol1.py sol2.py sol3.py __init__.py 
    + +

    +Folders: 1
    +Files: 4
    +Size of all files: 5628 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/project_euler/problem_003/sol1.py b/python-mega-algo/project_euler/problem_003/sol1.py new file mode 100644 index 00000000..3441dbf9 --- /dev/null +++ b/python-mega-algo/project_euler/problem_003/sol1.py @@ -0,0 +1,104 @@ +""" +Project Euler Problem 3: https://projecteuler.net/problem=3 + +Largest prime factor + +The prime factors of 13195 are 5, 7, 13 and 29. + +What is the largest prime factor of the number 600851475143? + +References: + - https://en.wikipedia.org/wiki/Prime_number#Unique_factorization +""" +import math + + +def isprime(num: int) -> bool: + """ + Returns boolean representing primality of given number num. + + >>> isprime(2) + True + >>> isprime(3) + True + >>> isprime(27) + False + >>> isprime(2999) + True + >>> isprime(0) + Traceback (most recent call last): + ... + ValueError: Parameter num must be greater than or equal to two. + >>> isprime(1) + Traceback (most recent call last): + ... + ValueError: Parameter num must be greater than or equal to two. + """ + + if num <= 1: + raise ValueError("Parameter num must be greater than or equal to two.") + if num == 2: + return True + elif num % 2 == 0: + return False + for i in range(3, int(math.sqrt(num)) + 1, 2): + if num % i == 0: + return False + return True + + +def solution(n: int = 600851475143) -> int: + """ + Returns the largest prime factor of a given number n. + + >>> solution(13195) + 29 + >>> solution(10) + 5 + >>> solution(17) + 17 + >>> solution(3.4) + 3 + >>> solution(0) + Traceback (most recent call last): + ... + ValueError: Parameter n must be greater than or equal to one. + >>> solution(-17) + Traceback (most recent call last): + ... + ValueError: Parameter n must be greater than or equal to one. + >>> solution([]) + Traceback (most recent call last): + ... + TypeError: Parameter n must be int or castable to int. + >>> solution("asd") + Traceback (most recent call last): + ... + TypeError: Parameter n must be int or castable to int. + """ + + try: + n = int(n) + except (TypeError, ValueError): + raise TypeError("Parameter n must be int or castable to int.") + if n <= 0: + raise ValueError("Parameter n must be greater than or equal to one.") + max_number = 0 + if isprime(n): + return n + while n % 2 == 0: + n //= 2 + if isprime(n): + return n + for i in range(3, int(math.sqrt(n)) + 1, 2): + if n % i == 0: + if isprime(n / i): + max_number = n / i + break + elif isprime(i): + max_number = i + return max_number + + +if __name__ == "__main__": + print(f"{solution() = }") diff --git a/python-mega-algo/project_euler/problem_003/sol2.py b/python-mega-algo/project_euler/problem_003/sol2.py new file mode 100644 index 00000000..0af0dace --- /dev/null +++ b/python-mega-algo/project_euler/problem_003/sol2.py @@ -0,0 +1,64 @@ +""" +Project Euler Problem 3: https://projecteuler.net/problem=3 + +Largest prime factor + +The prime factors of 13195 are 5, 7, 13 and 29. + +What is the largest prime factor of the number 600851475143? + +References: + - https://en.wikipedia.org/wiki/Prime_number#Unique_factorization +""" + + +def solution(n: int = 600851475143) -> int: + """ + Returns the largest prime factor of a given number n. + + >>> solution(13195) + 29 + >>> solution(10) + 5 + >>> solution(17) + 17 + >>> solution(3.4) + 3 + >>> solution(0) + Traceback (most recent call last): + ... + ValueError: Parameter n must be greater than or equal to one. + >>> solution(-17) + Traceback (most recent call last): + ... + ValueError: Parameter n must be greater than or equal to one. + >>> solution([]) + Traceback (most recent call last): + ... + TypeError: Parameter n must be int or castable to int. + >>> solution("asd") + Traceback (most recent call last): + ... + TypeError: Parameter n must be int or castable to int. + """ + + try: + n = int(n) + except (TypeError, ValueError): + raise TypeError("Parameter n must be int or castable to int.") + if n <= 0: + raise ValueError("Parameter n must be greater than or equal to one.") + prime = 1 + i = 2 + while i * i <= n: + while n % i == 0: + prime = i + n //= i + i += 1 + if n > 1: + prime = n + return int(prime) + + +if __name__ == "__main__": + print(f"{solution() = }") diff --git a/python-mega-algo/project_euler/problem_003/sol3.py b/python-mega-algo/project_euler/problem_003/sol3.py new file mode 100644 index 00000000..bc6f1d2f --- /dev/null +++ b/python-mega-algo/project_euler/problem_003/sol3.py @@ -0,0 +1,66 @@ +""" +Project Euler Problem 3: https://projecteuler.net/problem=3 + +Largest prime factor + +The prime factors of 13195 are 5, 7, 13 and 29. + +What is the largest prime factor of the number 600851475143? + +References: + - https://en.wikipedia.org/wiki/Prime_number#Unique_factorization +""" + + +def solution(n: int = 600851475143) -> int: + """ + Returns the largest prime factor of a given number n. + + >>> solution(13195) + 29 + >>> solution(10) + 5 + >>> solution(17) + 17 + >>> solution(3.4) + 3 + >>> solution(0) + Traceback (most recent call last): + ... + ValueError: Parameter n must be greater than or equal to one. + >>> solution(-17) + Traceback (most recent call last): + ... + ValueError: Parameter n must be greater than or equal to one. + >>> solution([]) + Traceback (most recent call last): + ... + TypeError: Parameter n must be int or castable to int. + >>> solution("asd") + Traceback (most recent call last): + ... + TypeError: Parameter n must be int or castable to int. + """ + + try: + n = int(n) + except (TypeError, ValueError): + raise TypeError("Parameter n must be int or castable to int.") + if n <= 0: + raise ValueError("Parameter n must be greater than or equal to one.") + i = 2 + ans = 0 + if n == 2: + return 2 + while n > 2: + while n % i != 0: + i += 1 + ans = i + while n % i == 0: + n = n / i + i += 1 + return int(ans) + + +if __name__ == "__main__": + print(f"{solution() = }") diff --git a/python-mega-algo/project_euler/problem_004/__init__.py b/python-mega-algo/project_euler/problem_004/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/project_euler/problem_004/right.html b/python-mega-algo/project_euler/problem_004/right.html new file mode 100644 index 00000000..27fb8e35 --- /dev/null +++ b/python-mega-algo/project_euler/problem_004/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/project_euler/problem_004 + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    sol1.py sol2.py __init__.py 
    + +

    +Folders: 1
    +Files: 3
    +Size of all files: 2456 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/project_euler/problem_004/sol1.py b/python-mega-algo/project_euler/problem_004/sol1.py new file mode 100644 index 00000000..db6133a1 --- /dev/null +++ b/python-mega-algo/project_euler/problem_004/sol1.py @@ -0,0 +1,53 @@ +""" +Project Euler Problem 4: https://projecteuler.net/problem=4 + +Largest palindrome product + +A palindromic number reads the same both ways. The largest palindrome made +from the product of two 2-digit numbers is 9009 = 91 × 99. + +Find the largest palindrome made from the product of two 3-digit numbers. + +References: + - https://en.wikipedia.org/wiki/Palindromic_number +""" + + +def solution(n: int = 998001) -> int: + """ + Returns the largest palindrome made from the product of two 3-digit + numbers which is less than n. + + >>> solution(20000) + 19591 + >>> solution(30000) + 29992 + >>> solution(40000) + 39893 + >>> solution(10000) + Traceback (most recent call last): + ... + ValueError: That number is larger than our acceptable range. + """ + + # fetches the next number + for number in range(n - 1, 9999, -1): + + str_number = str(number) + + # checks whether 'str_number' is a palindrome. + if str_number == str_number[::-1]: + + divisor = 999 + + # if 'number' is a product of two 3-digit numbers + # then number is the answer otherwise fetch next number. + while divisor != 99: + if (number % divisor == 0) and (len(str(number // divisor)) == 3.0): + return number + divisor -= 1 + raise ValueError("That number is larger than our acceptable range.") + + +if __name__ == "__main__": + print(f"{solution() = }") diff --git a/python-mega-algo/project_euler/problem_004/sol2.py b/python-mega-algo/project_euler/problem_004/sol2.py new file mode 100644 index 00000000..abc88096 --- /dev/null +++ b/python-mega-algo/project_euler/problem_004/sol2.py @@ -0,0 +1,39 @@ +""" +Project Euler Problem 4: https://projecteuler.net/problem=4 + +Largest palindrome product + +A palindromic number reads the same both ways. The largest palindrome made +from the product of two 2-digit numbers is 9009 = 91 × 99. + +Find the largest palindrome made from the product of two 3-digit numbers. + +References: + - https://en.wikipedia.org/wiki/Palindromic_number +""" + + +def solution(n: int = 998001) -> int: + """ + Returns the largest palindrome made from the product of two 3-digit + numbers which is less than n. + + >>> solution(20000) + 19591 + >>> solution(30000) + 29992 + >>> solution(40000) + 39893 + """ + + answer = 0 + for i in range(999, 99, -1): # 3 digit numbers range from 999 down to 100 + for j in range(999, 99, -1): + product_string = str(i * j) + if product_string == product_string[::-1] and i * j < n: + answer = max(answer, i * j) + return answer + + +if __name__ == "__main__": + print(f"{solution() = }") diff --git a/python-mega-algo/project_euler/problem_005/__init__.py b/python-mega-algo/project_euler/problem_005/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/project_euler/problem_005/right.html b/python-mega-algo/project_euler/problem_005/right.html new file mode 100644 index 00000000..46c4a7ad --- /dev/null +++ b/python-mega-algo/project_euler/problem_005/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/project_euler/problem_005 + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    sol1.py sol2.py __init__.py 
    + +

    +Folders: 1
    +Files: 3
    +Size of all files: 3198 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/project_euler/problem_005/sol1.py b/python-mega-algo/project_euler/problem_005/sol1.py new file mode 100644 index 00000000..f272c102 --- /dev/null +++ b/python-mega-algo/project_euler/problem_005/sol1.py @@ -0,0 +1,69 @@ +""" +Project Euler Problem 5: https://projecteuler.net/problem=5 + +Smallest multiple + +2520 is the smallest number that can be divided by each of the numbers +from 1 to 10 without any remainder. + +What is the smallest positive number that is _evenly divisible_ by all +of the numbers from 1 to 20? + +References: + - https://en.wiktionary.org/wiki/evenly_divisible +""" + + +def solution(n: int = 20) -> int: + """ + Returns the smallest positive number that is evenly divisible (divisible + with no remainder) by all of the numbers from 1 to n. + + >>> solution(10) + 2520 + >>> solution(15) + 360360 + >>> solution(22) + 232792560 + >>> solution(3.4) + 6 + >>> solution(0) + Traceback (most recent call last): + ... + ValueError: Parameter n must be greater than or equal to one. + >>> solution(-17) + Traceback (most recent call last): + ... + ValueError: Parameter n must be greater than or equal to one. + >>> solution([]) + Traceback (most recent call last): + ... + TypeError: Parameter n must be int or castable to int. + >>> solution("asd") + Traceback (most recent call last): + ... + TypeError: Parameter n must be int or castable to int. + """ + + try: + n = int(n) + except (TypeError, ValueError): + raise TypeError("Parameter n must be int or castable to int.") + if n <= 0: + raise ValueError("Parameter n must be greater than or equal to one.") + i = 0 + while 1: + i += n * (n - 1) + nfound = 0 + for j in range(2, n): + if i % j != 0: + nfound = 1 + break + if nfound == 0: + if i == 0: + i = 1 + return i + + +if __name__ == "__main__": + print(f"{solution() = }") diff --git a/python-mega-algo/project_euler/problem_005/sol2.py b/python-mega-algo/project_euler/problem_005/sol2.py new file mode 100644 index 00000000..c8804448 --- /dev/null +++ b/python-mega-algo/project_euler/problem_005/sol2.py @@ -0,0 +1,75 @@ +""" +Project Euler Problem 5: https://projecteuler.net/problem=5 + +Smallest multiple + +2520 is the smallest number that can be divided by each of the numbers +from 1 to 10 without any remainder. + +What is the smallest positive number that is _evenly divisible_ by all +of the numbers from 1 to 20? + +References: + - https://en.wiktionary.org/wiki/evenly_divisible + - https://en.wikipedia.org/wiki/Euclidean_algorithm + - https://en.wikipedia.org/wiki/Least_common_multiple +""" + + +def gcd(x: int, y: int) -> int: + """ + Euclidean GCD algorithm (Greatest Common Divisor) + + >>> gcd(0, 0) + 0 + >>> gcd(23, 42) + 1 + >>> gcd(15, 33) + 3 + >>> gcd(12345, 67890) + 15 + """ + + return x if y == 0 else gcd(y, x % y) + + +def lcm(x: int, y: int) -> int: + """ + Least Common Multiple. + + Using the property that lcm(a, b) * gcd(a, b) = a*b + + >>> lcm(3, 15) + 15 + >>> lcm(1, 27) + 27 + >>> lcm(13, 27) + 351 + >>> lcm(64, 48) + 192 + """ + + return (x * y) // gcd(x, y) + + +def solution(n: int = 20) -> int: + """ + Returns the smallest positive number that is evenly divisible (divisible + with no remainder) by all of the numbers from 1 to n. + + >>> solution(10) + 2520 + >>> solution(15) + 360360 + >>> solution(22) + 232792560 + """ + + g = 1 + for i in range(1, n + 1): + g = lcm(g, i) + return g + + +if __name__ == "__main__": + print(f"{solution() = }") diff --git a/python-mega-algo/project_euler/problem_006/__init__.py b/python-mega-algo/project_euler/problem_006/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/project_euler/problem_006/right.html b/python-mega-algo/project_euler/problem_006/right.html new file mode 100644 index 00000000..38a61ad4 --- /dev/null +++ b/python-mega-algo/project_euler/problem_006/right.html @@ -0,0 +1,30 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/project_euler/problem_006 + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + + +
    FileFileFileFile
    sol1.py sol3.py sol4.py __init__.py 
    sol2.py 
    + +

    +Folders: 1
    +Files: 5
    +Size of all files: 4201 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/project_euler/problem_006/sol1.py b/python-mega-algo/project_euler/problem_006/sol1.py new file mode 100644 index 00000000..61dd7a32 --- /dev/null +++ b/python-mega-algo/project_euler/problem_006/sol1.py @@ -0,0 +1,44 @@ +""" +Project Euler Problem 6: https://projecteuler.net/problem=6 + +Sum square difference + +The sum of the squares of the first ten natural numbers is, + 1^2 + 2^2 + ... + 10^2 = 385 + +The square of the sum of the first ten natural numbers is, + (1 + 2 + ... + 10)^2 = 55^2 = 3025 + +Hence the difference between the sum of the squares of the first ten +natural numbers and the square of the sum is 3025 - 385 = 2640. + +Find the difference between the sum of the squares of the first one +hundred natural numbers and the square of the sum. +""" + + +def solution(n: int = 100) -> int: + """ + Returns the difference between the sum of the squares of the first n + natural numbers and the square of the sum. + + >>> solution(10) + 2640 + >>> solution(15) + 13160 + >>> solution(20) + 41230 + >>> solution(50) + 1582700 + """ + + sum_of_squares = 0 + sum_of_ints = 0 + for i in range(1, n + 1): + sum_of_squares += i ** 2 + sum_of_ints += i + return sum_of_ints ** 2 - sum_of_squares + + +if __name__ == "__main__": + print(f"{solution() = }") diff --git a/python-mega-algo/project_euler/problem_006/sol2.py b/python-mega-algo/project_euler/problem_006/sol2.py new file mode 100644 index 00000000..cd1bc507 --- /dev/null +++ b/python-mega-algo/project_euler/problem_006/sol2.py @@ -0,0 +1,41 @@ +""" +Project Euler Problem 6: https://projecteuler.net/problem=6 + +Sum square difference + +The sum of the squares of the first ten natural numbers is, + 1^2 + 2^2 + ... + 10^2 = 385 + +The square of the sum of the first ten natural numbers is, + (1 + 2 + ... + 10)^2 = 55^2 = 3025 + +Hence the difference between the sum of the squares of the first ten +natural numbers and the square of the sum is 3025 - 385 = 2640. + +Find the difference between the sum of the squares of the first one +hundred natural numbers and the square of the sum. +""" + + +def solution(n: int = 100) -> int: + """ + Returns the difference between the sum of the squares of the first n + natural numbers and the square of the sum. + + >>> solution(10) + 2640 + >>> solution(15) + 13160 + >>> solution(20) + 41230 + >>> solution(50) + 1582700 + """ + + sum_cubes = (n * (n + 1) // 2) ** 2 + sum_squares = n * (n + 1) * (2 * n + 1) // 6 + return sum_cubes - sum_squares + + +if __name__ == "__main__": + print(f"{solution() = }") diff --git a/python-mega-algo/project_euler/problem_006/sol3.py b/python-mega-algo/project_euler/problem_006/sol3.py new file mode 100644 index 00000000..c8793130 --- /dev/null +++ b/python-mega-algo/project_euler/problem_006/sol3.py @@ -0,0 +1,42 @@ +""" +Project Euler Problem 6: https://projecteuler.net/problem=6 + +Sum square difference + +The sum of the squares of the first ten natural numbers is, + 1^2 + 2^2 + ... + 10^2 = 385 + +The square of the sum of the first ten natural numbers is, + (1 + 2 + ... + 10)^2 = 55^2 = 3025 + +Hence the difference between the sum of the squares of the first ten +natural numbers and the square of the sum is 3025 - 385 = 2640. + +Find the difference between the sum of the squares of the first one +hundred natural numbers and the square of the sum. +""" +import math + + +def solution(n: int = 100) -> int: + """ + Returns the difference between the sum of the squares of the first n + natural numbers and the square of the sum. + + >>> solution(10) + 2640 + >>> solution(15) + 13160 + >>> solution(20) + 41230 + >>> solution(50) + 1582700 + """ + + sum_of_squares = sum([i * i for i in range(1, n + 1)]) + square_of_sum = int(math.pow(sum(range(1, n + 1)), 2)) + return square_of_sum - sum_of_squares + + +if __name__ == "__main__": + print(f"{solution() = }") diff --git a/python-mega-algo/project_euler/problem_006/sol4.py b/python-mega-algo/project_euler/problem_006/sol4.py new file mode 100644 index 00000000..748b1414 --- /dev/null +++ b/python-mega-algo/project_euler/problem_006/sol4.py @@ -0,0 +1,41 @@ +""" +Project Euler Problem 6: https://projecteuler.net/problem=6 + +Sum square difference + +The sum of the squares of the first ten natural numbers is, + 1^2 + 2^2 + ... + 10^2 = 385 + +The square of the sum of the first ten natural numbers is, + (1 + 2 + ... + 10)^2 = 55^2 = 3025 + +Hence the difference between the sum of the squares of the first ten +natural numbers and the square of the sum is 3025 - 385 = 2640. + +Find the difference between the sum of the squares of the first one +hundred natural numbers and the square of the sum. +""" + + +def solution(n: int = 100) -> int: + """ + Returns the difference between the sum of the squares of the first n + natural numbers and the square of the sum. + + >>> solution(10) + 2640 + >>> solution(15) + 13160 + >>> solution(20) + 41230 + >>> solution(50) + 1582700 + """ + + sum_of_squares = n * (n + 1) * (2 * n + 1) / 6 + square_of_sum = (n * (n + 1) / 2) ** 2 + return int(square_of_sum - sum_of_squares) + + +if __name__ == "__main__": + print(f"{solution() = }") diff --git a/python-mega-algo/project_euler/problem_007/__init__.py b/python-mega-algo/project_euler/problem_007/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/project_euler/problem_007/right.html b/python-mega-algo/project_euler/problem_007/right.html new file mode 100644 index 00000000..78760756 --- /dev/null +++ b/python-mega-algo/project_euler/problem_007/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/project_euler/problem_007 + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    sol1.py sol2.py sol3.py __init__.py 
    + +

    +Folders: 1
    +Files: 4
    +Size of all files: 4502 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/project_euler/problem_007/sol1.py b/python-mega-algo/project_euler/problem_007/sol1.py new file mode 100644 index 00000000..78fbcb51 --- /dev/null +++ b/python-mega-algo/project_euler/problem_007/sol1.py @@ -0,0 +1,76 @@ +""" +Project Euler Problem 7: https://projecteuler.net/problem=7 + +10001st prime + +By listing the first six prime numbers: 2, 3, 5, 7, 11, and 13, we +can see that the 6th prime is 13. + +What is the 10001st prime number? + +References: + - https://en.wikipedia.org/wiki/Prime_number +""" + +from math import sqrt + + +def is_prime(num: int) -> bool: + """ + Determines whether the given number is prime or not + + >>> is_prime(2) + True + >>> is_prime(15) + False + >>> is_prime(29) + True + >>> is_prime(0) + False + """ + + if num == 2: + return True + elif num % 2 == 0: + return False + else: + sq = int(sqrt(num)) + 1 + for i in range(3, sq, 2): + if num % i == 0: + return False + return True + + +def solution(nth: int = 10001) -> int: + """ + Returns the n-th prime number. + + >>> solution(6) + 13 + >>> solution(1) + 2 + >>> solution(3) + 5 + >>> solution(20) + 71 + >>> solution(50) + 229 + >>> solution(100) + 541 + """ + + count = 0 + number = 1 + while count != nth and number < 3: + number += 1 + if is_prime(number): + count += 1 + while count != nth: + number += 2 + if is_prime(number): + count += 1 + return number + + +if __name__ == "__main__": + print(f"{solution() = }") diff --git a/python-mega-algo/project_euler/problem_007/sol2.py b/python-mega-algo/project_euler/problem_007/sol2.py new file mode 100644 index 00000000..b395c631 --- /dev/null +++ b/python-mega-algo/project_euler/problem_007/sol2.py @@ -0,0 +1,88 @@ +""" +Project Euler Problem 7: https://projecteuler.net/problem=7 + +10001st prime + +By listing the first six prime numbers: 2, 3, 5, 7, 11, and 13, we +can see that the 6th prime is 13. + +What is the 10001st prime number? + +References: + - https://en.wikipedia.org/wiki/Prime_number +""" + + +def isprime(number: int) -> bool: + """ + Determines whether the given number is prime or not + + >>> isprime(2) + True + >>> isprime(15) + False + >>> isprime(29) + True + """ + + for i in range(2, int(number ** 0.5) + 1): + if number % i == 0: + return False + return True + + +def solution(nth: int = 10001) -> int: + """ + Returns the n-th prime number. + + >>> solution(6) + 13 + >>> solution(1) + 2 + >>> solution(3) + 5 + >>> solution(20) + 71 + >>> solution(50) + 229 + >>> solution(100) + 541 + >>> solution(3.4) + 5 + >>> solution(0) + Traceback (most recent call last): + ... + ValueError: Parameter nth must be greater than or equal to one. + >>> solution(-17) + Traceback (most recent call last): + ... + ValueError: Parameter nth must be greater than or equal to one. + >>> solution([]) + Traceback (most recent call last): + ... + TypeError: Parameter nth must be int or castable to int. + >>> solution("asd") + Traceback (most recent call last): + ... + TypeError: Parameter nth must be int or castable to int. + """ + + try: + nth = int(nth) + except (TypeError, ValueError): + raise TypeError("Parameter nth must be int or castable to int.") from None + if nth <= 0: + raise ValueError("Parameter nth must be greater than or equal to one.") + primes = [] + num = 2 + while len(primes) < nth: + if isprime(num): + primes.append(num) + num += 1 + else: + num += 1 + return primes[len(primes) - 1] + + +if __name__ == "__main__": + print(f"{solution() = }") diff --git a/python-mega-algo/project_euler/problem_007/sol3.py b/python-mega-algo/project_euler/problem_007/sol3.py new file mode 100644 index 00000000..7911fa3e --- /dev/null +++ b/python-mega-algo/project_euler/problem_007/sol3.py @@ -0,0 +1,68 @@ +""" +Project Euler Problem 7: https://projecteuler.net/problem=7 + +10001st prime + +By listing the first six prime numbers: 2, 3, 5, 7, 11, and 13, we +can see that the 6th prime is 13. + +What is the 10001st prime number? + +References: + - https://en.wikipedia.org/wiki/Prime_number +""" +import itertools +import math + + +def prime_check(number: int) -> bool: + """ + Determines whether a given number is prime or not + + >>> prime_check(2) + True + >>> prime_check(15) + False + >>> prime_check(29) + True + """ + + if number % 2 == 0 and number > 2: + return False + return all(number % i for i in range(3, int(math.sqrt(number)) + 1, 2)) + + +def prime_generator(): + """ + Generate a sequence of prime numbers + """ + + num = 2 + while True: + if prime_check(num): + yield num + num += 1 + + +def solution(nth: int = 10001) -> int: + """ + Returns the n-th prime number. + + >>> solution(6) + 13 + >>> solution(1) + 2 + >>> solution(3) + 5 + >>> solution(20) + 71 + >>> solution(50) + 229 + >>> solution(100) + 541 + """ + return next(itertools.islice(prime_generator(), nth - 1, nth)) + + +if __name__ == "__main__": + print(f"{solution() = }") diff --git a/python-mega-algo/project_euler/problem_008/__init__.py b/python-mega-algo/project_euler/problem_008/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/project_euler/problem_008/right.html b/python-mega-algo/project_euler/problem_008/right.html new file mode 100644 index 00000000..a6e61d28 --- /dev/null +++ b/python-mega-algo/project_euler/problem_008/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/project_euler/problem_008 + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    sol1.py sol2.py sol3.py __init__.py 
    + +

    +Folders: 1
    +Files: 4
    +Size of all files: 9754 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/project_euler/problem_008/sol1.py b/python-mega-algo/project_euler/problem_008/sol1.py new file mode 100644 index 00000000..79608012 --- /dev/null +++ b/python-mega-algo/project_euler/problem_008/sol1.py @@ -0,0 +1,82 @@ +""" +Project Euler Problem 8: https://projecteuler.net/problem=8 + +Largest product in a series + +The four adjacent digits in the 1000-digit number that have the greatest +product are 9 × 9 × 8 × 9 = 5832. + + 73167176531330624919225119674426574742355349194934 + 96983520312774506326239578318016984801869478851843 + 85861560789112949495459501737958331952853208805511 + 12540698747158523863050715693290963295227443043557 + 66896648950445244523161731856403098711121722383113 + 62229893423380308135336276614282806444486645238749 + 30358907296290491560440772390713810515859307960866 + 70172427121883998797908792274921901699720888093776 + 65727333001053367881220235421809751254540594752243 + 52584907711670556013604839586446706324415722155397 + 53697817977846174064955149290862569321978468622482 + 83972241375657056057490261407972968652414535100474 + 82166370484403199890008895243450658541227588666881 + 16427171479924442928230863465674813919123162824586 + 17866458359124566529476545682848912883142607690042 + 24219022671055626321111109370544217506941658960408 + 07198403850962455444362981230987879927244284909188 + 84580156166097919133875499200524063689912560717606 + 05886116467109405077541002256983155200055935729725 + 71636269561882670428252483600823257530420752963450 + +Find the thirteen adjacent digits in the 1000-digit number that have the +greatest product. What is the value of this product? +""" + +import sys + +N = """73167176531330624919225119674426574742355349194934\ +96983520312774506326239578318016984801869478851843\ +85861560789112949495459501737958331952853208805511\ +12540698747158523863050715693290963295227443043557\ +66896648950445244523161731856403098711121722383113\ +62229893423380308135336276614282806444486645238749\ +30358907296290491560440772390713810515859307960866\ +70172427121883998797908792274921901699720888093776\ +65727333001053367881220235421809751254540594752243\ +52584907711670556013604839586446706324415722155397\ +53697817977846174064955149290862569321978468622482\ +83972241375657056057490261407972968652414535100474\ +82166370484403199890008895243450658541227588666881\ +16427171479924442928230863465674813919123162824586\ +17866458359124566529476545682848912883142607690042\ +24219022671055626321111109370544217506941658960408\ +07198403850962455444362981230987879927244284909188\ +84580156166097919133875499200524063689912560717606\ +05886116467109405077541002256983155200055935729725\ +71636269561882670428252483600823257530420752963450""" + + +def solution(n: str = N) -> int: + """ + Find the thirteen adjacent digits in the 1000-digit number n that have + the greatest product and returns it. + + >>> solution("13978431290823798458352374") + 609638400 + >>> solution("13978431295823798458352374") + 2612736000 + >>> solution("1397843129582379841238352374") + 209018880 + """ + + largest_product = -sys.maxsize - 1 + for i in range(len(n) - 12): + product = 1 + for j in range(13): + product *= int(n[i + j]) + if product > largest_product: + largest_product = product + return largest_product + + +if __name__ == "__main__": + print(f"{solution() = }") diff --git a/python-mega-algo/project_euler/problem_008/sol2.py b/python-mega-algo/project_euler/problem_008/sol2.py new file mode 100644 index 00000000..d2c1b4f7 --- /dev/null +++ b/python-mega-algo/project_euler/problem_008/sol2.py @@ -0,0 +1,81 @@ +""" +Project Euler Problem 8: https://projecteuler.net/problem=8 + +Largest product in a series + +The four adjacent digits in the 1000-digit number that have the greatest +product are 9 × 9 × 8 × 9 = 5832. + + 73167176531330624919225119674426574742355349194934 + 96983520312774506326239578318016984801869478851843 + 85861560789112949495459501737958331952853208805511 + 12540698747158523863050715693290963295227443043557 + 66896648950445244523161731856403098711121722383113 + 62229893423380308135336276614282806444486645238749 + 30358907296290491560440772390713810515859307960866 + 70172427121883998797908792274921901699720888093776 + 65727333001053367881220235421809751254540594752243 + 52584907711670556013604839586446706324415722155397 + 53697817977846174064955149290862569321978468622482 + 83972241375657056057490261407972968652414535100474 + 82166370484403199890008895243450658541227588666881 + 16427171479924442928230863465674813919123162824586 + 17866458359124566529476545682848912883142607690042 + 24219022671055626321111109370544217506941658960408 + 07198403850962455444362981230987879927244284909188 + 84580156166097919133875499200524063689912560717606 + 05886116467109405077541002256983155200055935729725 + 71636269561882670428252483600823257530420752963450 + +Find the thirteen adjacent digits in the 1000-digit number that have the +greatest product. What is the value of this product? +""" +from functools import reduce + +N = ( + "73167176531330624919225119674426574742355349194934" + "96983520312774506326239578318016984801869478851843" + "85861560789112949495459501737958331952853208805511" + "12540698747158523863050715693290963295227443043557" + "66896648950445244523161731856403098711121722383113" + "62229893423380308135336276614282806444486645238749" + "30358907296290491560440772390713810515859307960866" + "70172427121883998797908792274921901699720888093776" + "65727333001053367881220235421809751254540594752243" + "52584907711670556013604839586446706324415722155397" + "53697817977846174064955149290862569321978468622482" + "83972241375657056057490261407972968652414535100474" + "82166370484403199890008895243450658541227588666881" + "16427171479924442928230863465674813919123162824586" + "17866458359124566529476545682848912883142607690042" + "24219022671055626321111109370544217506941658960408" + "07198403850962455444362981230987879927244284909188" + "84580156166097919133875499200524063689912560717606" + "05886116467109405077541002256983155200055935729725" + "71636269561882670428252483600823257530420752963450" +) + + +def solution(n: str = N) -> int: + """ + Find the thirteen adjacent digits in the 1000-digit number n that have + the greatest product and returns it. + + >>> solution("13978431290823798458352374") + 609638400 + >>> solution("13978431295823798458352374") + 2612736000 + >>> solution("1397843129582379841238352374") + 209018880 + """ + + return max( + [ + reduce(lambda x, y: int(x) * int(y), n[i : i + 13]) + for i in range(len(n) - 12) + ] + ) + + +if __name__ == "__main__": + print(f"{solution() = }") diff --git a/python-mega-algo/project_euler/problem_008/sol3.py b/python-mega-algo/project_euler/problem_008/sol3.py new file mode 100644 index 00000000..4b99d0ea --- /dev/null +++ b/python-mega-algo/project_euler/problem_008/sol3.py @@ -0,0 +1,94 @@ +""" +Project Euler Problem 8: https://projecteuler.net/problem=8 + +Largest product in a series + +The four adjacent digits in the 1000-digit number that have the greatest +product are 9 × 9 × 8 × 9 = 5832. + + 73167176531330624919225119674426574742355349194934 + 96983520312774506326239578318016984801869478851843 + 85861560789112949495459501737958331952853208805511 + 12540698747158523863050715693290963295227443043557 + 66896648950445244523161731856403098711121722383113 + 62229893423380308135336276614282806444486645238749 + 30358907296290491560440772390713810515859307960866 + 70172427121883998797908792274921901699720888093776 + 65727333001053367881220235421809751254540594752243 + 52584907711670556013604839586446706324415722155397 + 53697817977846174064955149290862569321978468622482 + 83972241375657056057490261407972968652414535100474 + 82166370484403199890008895243450658541227588666881 + 16427171479924442928230863465674813919123162824586 + 17866458359124566529476545682848912883142607690042 + 24219022671055626321111109370544217506941658960408 + 07198403850962455444362981230987879927244284909188 + 84580156166097919133875499200524063689912560717606 + 05886116467109405077541002256983155200055935729725 + 71636269561882670428252483600823257530420752963450 + +Find the thirteen adjacent digits in the 1000-digit number that have the +greatest product. What is the value of this product? +""" +import sys + +N = """73167176531330624919225119674426574742355349194934\ +96983520312774506326239578318016984801869478851843\ +85861560789112949495459501737958331952853208805511\ +12540698747158523863050715693290963295227443043557\ +66896648950445244523161731856403098711121722383113\ +62229893423380308135336276614282806444486645238749\ +30358907296290491560440772390713810515859307960866\ +70172427121883998797908792274921901699720888093776\ +65727333001053367881220235421809751254540594752243\ +52584907711670556013604839586446706324415722155397\ +53697817977846174064955149290862569321978468622482\ +83972241375657056057490261407972968652414535100474\ +82166370484403199890008895243450658541227588666881\ +16427171479924442928230863465674813919123162824586\ +17866458359124566529476545682848912883142607690042\ +24219022671055626321111109370544217506941658960408\ +07198403850962455444362981230987879927244284909188\ +84580156166097919133875499200524063689912560717606\ +05886116467109405077541002256983155200055935729725\ +71636269561882670428252483600823257530420752963450""" + + +def str_eval(s: str) -> int: + """ + Returns product of digits in given string n + + >>> str_eval("987654321") + 362880 + >>> str_eval("22222222") + 256 + """ + + product = 1 + for digit in s: + product *= int(digit) + return product + + +def solution(n: str = N) -> int: + """ + Find the thirteen adjacent digits in the 1000-digit number n that have + the greatest product and returns it. + """ + + largest_product = -sys.maxsize - 1 + substr = n[:13] + cur_index = 13 + while cur_index < len(n) - 13: + if int(n[cur_index]) >= int(substr[0]): + substr = substr[1:] + n[cur_index] + cur_index += 1 + else: + largest_product = max(largest_product, str_eval(substr)) + substr = n[cur_index : cur_index + 13] + cur_index += 13 + return largest_product + + +if __name__ == "__main__": + print(f"{solution() = }") diff --git a/python-mega-algo/project_euler/problem_009/__init__.py b/python-mega-algo/project_euler/problem_009/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/project_euler/problem_009/right.html b/python-mega-algo/project_euler/problem_009/right.html new file mode 100644 index 00000000..0f0f6420 --- /dev/null +++ b/python-mega-algo/project_euler/problem_009/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/project_euler/problem_009 + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    sol1.py sol2.py sol3.py __init__.py 
    + +

    +Folders: 1
    +Files: 4
    +Size of all files: 4019 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/project_euler/problem_009/sol1.py b/python-mega-algo/project_euler/problem_009/sol1.py new file mode 100644 index 00000000..a58ea943 --- /dev/null +++ b/python-mega-algo/project_euler/problem_009/sol1.py @@ -0,0 +1,79 @@ +""" +Project Euler Problem 9: https://projecteuler.net/problem=9 + +Special Pythagorean triplet + +A Pythagorean triplet is a set of three natural numbers, a < b < c, for which, + + a^2 + b^2 = c^2 + +For example, 3^2 + 4^2 = 9 + 16 = 25 = 5^2. + +There exists exactly one Pythagorean triplet for which a + b + c = 1000. +Find the product a*b*c. + +References: + - https://en.wikipedia.org/wiki/Pythagorean_triple +""" + + +def solution() -> int: + """ + Returns the product of a,b,c which are Pythagorean Triplet that satisfies + the following: + 1. a < b < c + 2. a**2 + b**2 = c**2 + 3. a + b + c = 1000 + + # The code below has been commented due to slow execution affecting Travis. + # >>> solution() + # 31875000 + """ + + for a in range(300): + for b in range(400): + for c in range(500): + if a < b < c: + if (a ** 2) + (b ** 2) == (c ** 2): + if (a + b + c) == 1000: + return a * b * c + + +def solution_fast() -> int: + """ + Returns the product of a,b,c which are Pythagorean Triplet that satisfies + the following: + 1. a < b < c + 2. a**2 + b**2 = c**2 + 3. a + b + c = 1000 + + # The code below has been commented due to slow execution affecting Travis. + # >>> solution_fast() + # 31875000 + """ + + for a in range(300): + for b in range(400): + c = 1000 - a - b + if a < b < c and (a ** 2) + (b ** 2) == (c ** 2): + return a * b * c + + +def benchmark() -> None: + """ + Benchmark code comparing two different version function. + """ + import timeit + + print( + timeit.timeit("solution()", setup="from __main__ import solution", number=1000) + ) + print( + timeit.timeit( + "solution_fast()", setup="from __main__ import solution_fast", number=1000 + ) + ) + + +if __name__ == "__main__": + print(f"{solution() = }") diff --git a/python-mega-algo/project_euler/problem_009/sol2.py b/python-mega-algo/project_euler/problem_009/sol2.py new file mode 100644 index 00000000..722ad522 --- /dev/null +++ b/python-mega-algo/project_euler/problem_009/sol2.py @@ -0,0 +1,48 @@ +""" +Project Euler Problem 9: https://projecteuler.net/problem=9 + +Special Pythagorean triplet + +A Pythagorean triplet is a set of three natural numbers, a < b < c, for which, + + a^2 + b^2 = c^2 + +For example, 3^2 + 4^2 = 9 + 16 = 25 = 5^2. + +There exists exactly one Pythagorean triplet for which a + b + c = 1000. +Find the product a*b*c. + +References: + - https://en.wikipedia.org/wiki/Pythagorean_triple +""" + + +def solution(n: int = 1000) -> int: + """ + Return the product of a,b,c which are Pythagorean Triplet that satisfies + the following: + 1. a < b < c + 2. a**2 + b**2 = c**2 + 3. a + b + c = n + + >>> solution(36) + 1620 + >>> solution(126) + 66780 + """ + + product = -1 + candidate = 0 + for a in range(1, n // 3): + # Solving the two equations a**2+b**2=c**2 and a+b+c=N eliminating c + b = (n * n - 2 * a * n) // (2 * n - 2 * a) + c = n - a - b + if c * c == (a * a + b * b): + candidate = a * b * c + if candidate >= product: + product = candidate + return product + + +if __name__ == "__main__": + print(f"{solution() = }") diff --git a/python-mega-algo/project_euler/problem_009/sol3.py b/python-mega-algo/project_euler/problem_009/sol3.py new file mode 100644 index 00000000..03aed4b7 --- /dev/null +++ b/python-mega-algo/project_euler/problem_009/sol3.py @@ -0,0 +1,41 @@ +""" +Project Euler Problem 9: https://projecteuler.net/problem=9 + +Special Pythagorean triplet + +A Pythagorean triplet is a set of three natural numbers, a < b < c, for which, + + a^2 + b^2 = c^2 + +For example, 3^2 + 4^2 = 9 + 16 = 25 = 5^2. + +There exists exactly one Pythagorean triplet for which a + b + c = 1000. +Find the product a*b*c. + +References: + - https://en.wikipedia.org/wiki/Pythagorean_triple +""" + + +def solution() -> int: + """ + Returns the product of a,b,c which are Pythagorean Triplet that satisfies + the following: + 1. a**2 + b**2 = c**2 + 2. a + b + c = 1000 + + # The code below has been commented due to slow execution affecting Travis. + # >>> solution() + # 31875000 + """ + + return [ + a * b * (1000 - a - b) + for a in range(1, 999) + for b in range(a, 999) + if (a * a + b * b == (1000 - a - b) ** 2) + ][0] + + +if __name__ == "__main__": + print(f"{solution() = }") diff --git a/python-mega-algo/project_euler/problem_010/__init__.py b/python-mega-algo/project_euler/problem_010/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/project_euler/problem_010/right.html b/python-mega-algo/project_euler/problem_010/right.html new file mode 100644 index 00000000..1805d9d6 --- /dev/null +++ b/python-mega-algo/project_euler/problem_010/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/project_euler/problem_010 + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    sol1.py sol2.py sol3.py __init__.py 
    + +

    +Folders: 1
    +Files: 4
    +Size of all files: 4015 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/project_euler/problem_010/sol1.py b/python-mega-algo/project_euler/problem_010/sol1.py new file mode 100644 index 00000000..bd49b352 --- /dev/null +++ b/python-mega-algo/project_euler/problem_010/sol1.py @@ -0,0 +1,65 @@ +""" +Project Euler Problem 10: https://projecteuler.net/problem=10 + +Summation of primes + +The sum of the primes below 10 is 2 + 3 + 5 + 7 = 17. + +Find the sum of all the primes below two million. + +References: + - https://en.wikipedia.org/wiki/Prime_number +""" + +from math import sqrt + + +def is_prime(n: int) -> bool: + """ + Returns boolean representing primality of given number num. + + >>> is_prime(2) + True + >>> is_prime(3) + True + >>> is_prime(27) + False + >>> is_prime(2999) + True + """ + + for i in range(2, int(sqrt(n)) + 1): + if n % i == 0: + return False + + return True + + +def solution(n: int = 2000000) -> int: + """ + Returns the sum of all the primes below n. + + >>> solution(1000) + 76127 + >>> solution(5000) + 1548136 + >>> solution(10000) + 5736396 + >>> solution(7) + 10 + """ + + if n > 2: + sum_of_primes = 2 + else: + return 0 + + for i in range(3, n, 2): + if is_prime(i): + sum_of_primes += i + + return sum_of_primes + + +if __name__ == "__main__": + print(f"{solution() = }") diff --git a/python-mega-algo/project_euler/problem_010/sol2.py b/python-mega-algo/project_euler/problem_010/sol2.py new file mode 100644 index 00000000..3a2f485d --- /dev/null +++ b/python-mega-algo/project_euler/problem_010/sol2.py @@ -0,0 +1,67 @@ +""" +Project Euler Problem 10: https://projecteuler.net/problem=10 + +Summation of primes + +The sum of the primes below 10 is 2 + 3 + 5 + 7 = 17. + +Find the sum of all the primes below two million. + +References: + - https://en.wikipedia.org/wiki/Prime_number +""" +import math +from itertools import takewhile +from typing import Iterator + + +def is_prime(number: int) -> bool: + """ + Returns boolean representing primality of given number num. + + >>> is_prime(2) + True + >>> is_prime(3) + True + >>> is_prime(27) + False + >>> is_prime(2999) + True + """ + + if number % 2 == 0 and number > 2: + return False + return all(number % i for i in range(3, int(math.sqrt(number)) + 1, 2)) + + +def prime_generator() -> Iterator[int]: + """ + Generate a list sequence of prime numbers + """ + + num = 2 + while True: + if is_prime(num): + yield num + num += 1 + + +def solution(n: int = 2000000) -> int: + """ + Returns the sum of all the primes below n. + + >>> solution(1000) + 76127 + >>> solution(5000) + 1548136 + >>> solution(10000) + 5736396 + >>> solution(7) + 10 + """ + + return sum(takewhile(lambda x: x < n, prime_generator())) + + +if __name__ == "__main__": + print(f"{solution() = }") diff --git a/python-mega-algo/project_euler/problem_010/sol3.py b/python-mega-algo/project_euler/problem_010/sol3.py new file mode 100644 index 00000000..f49d9393 --- /dev/null +++ b/python-mega-algo/project_euler/problem_010/sol3.py @@ -0,0 +1,61 @@ +""" +Project Euler Problem 10: https://projecteuler.net/problem=10 + +Summation of primes + +The sum of the primes below 10 is 2 + 3 + 5 + 7 = 17. + +Find the sum of all the primes below two million. + +References: + - https://en.wikipedia.org/wiki/Prime_number + - https://en.wikipedia.org/wiki/Sieve_of_Eratosthenes +""" + + +def solution(n: int = 2000000) -> int: + """ + Returns the sum of all the primes below n using Sieve of Eratosthenes: + + The sieve of Eratosthenes is one of the most efficient ways to find all primes + smaller than n when n is smaller than 10 million. Only for positive numbers. + + >>> solution(1000) + 76127 + >>> solution(5000) + 1548136 + >>> solution(10000) + 5736396 + >>> solution(7) + 10 + >>> solution(7.1) # doctest: +ELLIPSIS + Traceback (most recent call last): + ... + TypeError: 'float' object cannot be interpreted as an integer + >>> solution(-7) # doctest: +ELLIPSIS + Traceback (most recent call last): + ... + IndexError: list assignment index out of range + >>> solution("seven") # doctest: +ELLIPSIS + Traceback (most recent call last): + ... + TypeError: can only concatenate str (not "int") to str + """ + + primality_list = [0 for i in range(n + 1)] + primality_list[0] = 1 + primality_list[1] = 1 + + for i in range(2, int(n ** 0.5) + 1): + if primality_list[i] == 0: + for j in range(i * i, n + 1, i): + primality_list[j] = 1 + sum_of_primes = 0 + for i in range(n): + if primality_list[i] == 0: + sum_of_primes += i + return sum_of_primes + + +if __name__ == "__main__": + print(f"{solution() = }") diff --git a/python-mega-algo/project_euler/problem_011/__init__.py b/python-mega-algo/project_euler/problem_011/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/project_euler/problem_011/grid.txt b/python-mega-algo/project_euler/problem_011/grid.txt new file mode 100644 index 00000000..4ac24518 --- /dev/null +++ b/python-mega-algo/project_euler/problem_011/grid.txt @@ -0,0 +1,20 @@ +08 02 22 97 38 15 00 40 00 75 04 05 07 78 52 12 50 77 91 08 +49 49 99 40 17 81 18 57 60 87 17 40 98 43 69 48 04 56 62 00 +81 49 31 73 55 79 14 29 93 71 40 67 53 88 30 03 49 13 36 65 +52 70 95 23 04 60 11 42 69 24 68 56 01 32 56 71 37 02 36 91 +22 31 16 71 51 67 63 89 41 92 36 54 22 40 40 28 66 33 13 80 +24 47 32 60 99 03 45 02 44 75 33 53 78 36 84 20 35 17 12 50 +32 98 81 28 64 23 67 10 26 38 40 67 59 54 70 66 18 38 64 70 +67 26 20 68 02 62 12 20 95 63 94 39 63 08 40 91 66 49 94 21 +24 55 58 05 66 73 99 26 97 17 78 78 96 83 14 88 34 89 63 72 +21 36 23 09 75 00 76 44 20 45 35 14 00 61 33 97 34 31 33 95 +78 17 53 28 22 75 31 67 15 94 03 80 04 62 16 14 09 53 56 92 +16 39 05 42 96 35 31 47 55 58 88 24 00 17 54 24 36 29 85 57 +86 56 00 48 35 71 89 07 05 44 44 37 44 60 21 58 51 54 17 58 +19 80 81 68 05 94 47 69 28 73 92 13 86 52 17 77 04 89 55 40 +04 52 08 83 97 35 99 16 07 97 57 32 16 26 26 79 33 27 98 66 +88 36 68 87 57 62 20 72 03 46 33 67 46 55 12 32 63 93 53 69 +04 42 16 73 38 25 39 11 24 94 72 18 08 46 29 32 40 62 76 36 +20 69 36 41 72 30 23 88 34 62 99 69 82 67 59 85 74 04 36 16 +20 73 35 29 78 31 90 01 74 31 49 71 48 86 81 16 23 57 05 54 +01 70 54 71 83 51 54 69 16 92 33 48 61 43 52 01 89 19 67 48 diff --git a/python-mega-algo/project_euler/problem_011/right.html b/python-mega-algo/project_euler/problem_011/right.html new file mode 100644 index 00000000..bb56166c --- /dev/null +++ b/python-mega-algo/project_euler/problem_011/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/project_euler/problem_011 + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    sol1.py sol2.py __init__.py grid.txt 
    + +

    +Folders: 1
    +Files: 4
    +Size of all files: 6932 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/project_euler/problem_011/sol1.py b/python-mega-algo/project_euler/problem_011/sol1.py new file mode 100644 index 00000000..9dea73e8 --- /dev/null +++ b/python-mega-algo/project_euler/problem_011/sol1.py @@ -0,0 +1,88 @@ +""" +What is the greatest product of four adjacent numbers (horizontally, +vertically, or diagonally) in this 20x20 array? + +08 02 22 97 38 15 00 40 00 75 04 05 07 78 52 12 50 77 91 08 +49 49 99 40 17 81 18 57 60 87 17 40 98 43 69 48 04 56 62 00 +81 49 31 73 55 79 14 29 93 71 40 67 53 88 30 03 49 13 36 65 +52 70 95 23 04 60 11 42 69 24 68 56 01 32 56 71 37 02 36 91 +22 31 16 71 51 67 63 89 41 92 36 54 22 40 40 28 66 33 13 80 +24 47 32 60 99 03 45 02 44 75 33 53 78 36 84 20 35 17 12 50 +32 98 81 28 64 23 67 10 26 38 40 67 59 54 70 66 18 38 64 70 +67 26 20 68 02 62 12 20 95 63 94 39 63 08 40 91 66 49 94 21 +24 55 58 05 66 73 99 26 97 17 78 78 96 83 14 88 34 89 63 72 +21 36 23 09 75 00 76 44 20 45 35 14 00 61 33 97 34 31 33 95 +78 17 53 28 22 75 31 67 15 94 03 80 04 62 16 14 09 53 56 92 +16 39 05 42 96 35 31 47 55 58 88 24 00 17 54 24 36 29 85 57 +86 56 00 48 35 71 89 07 05 44 44 37 44 60 21 58 51 54 17 58 +19 80 81 68 05 94 47 69 28 73 92 13 86 52 17 77 04 89 55 40 +04 52 08 83 97 35 99 16 07 97 57 32 16 26 26 79 33 27 98 66 +88 36 68 87 57 62 20 72 03 46 33 67 46 55 12 32 63 93 53 69 +04 42 16 73 38 25 39 11 24 94 72 18 08 46 29 32 40 62 76 36 +20 69 36 41 72 30 23 88 34 62 99 69 82 67 59 85 74 04 36 16 +20 73 35 29 78 31 90 01 74 31 49 71 48 86 81 16 23 57 05 54 +01 70 54 71 83 51 54 69 16 92 33 48 61 43 52 01 89 19 67 48 +""" + +import os + + +def largest_product(grid): + nColumns = len(grid[0]) + nRows = len(grid) + + largest = 0 + lrDiagProduct = 0 + rlDiagProduct = 0 + + # Check vertically, horizontally, diagonally at the same time (only works + # for nxn grid) + for i in range(nColumns): + for j in range(nRows - 3): + vertProduct = grid[j][i] * grid[j + 1][i] * grid[j + 2][i] * grid[j + 3][i] + horzProduct = grid[i][j] * grid[i][j + 1] * grid[i][j + 2] * grid[i][j + 3] + + # Left-to-right diagonal (\) product + if i < nColumns - 3: + lrDiagProduct = ( + grid[i][j] + * grid[i + 1][j + 1] + * grid[i + 2][j + 2] + * grid[i + 3][j + 3] + ) + + # Right-to-left diagonal(/) product + if i > 2: + rlDiagProduct = ( + grid[i][j] + * grid[i - 1][j + 1] + * grid[i - 2][j + 2] + * grid[i - 3][j + 3] + ) + + maxProduct = max(vertProduct, horzProduct, lrDiagProduct, rlDiagProduct) + if maxProduct > largest: + largest = maxProduct + + return largest + + +def solution(): + """Returns the greatest product of four adjacent numbers (horizontally, + vertically, or diagonally). + + >>> solution() + 70600674 + """ + grid = [] + with open(os.path.dirname(__file__) + "/grid.txt") as file: + for line in file: + grid.append(line.strip("\n").split(" ")) + + grid = [[int(i) for i in grid[j]] for j in range(len(grid))] + + return largest_product(grid) + + +if __name__ == "__main__": + print(solution()) diff --git a/python-mega-algo/project_euler/problem_011/sol2.py b/python-mega-algo/project_euler/problem_011/sol2.py new file mode 100644 index 00000000..839ca671 --- /dev/null +++ b/python-mega-algo/project_euler/problem_011/sol2.py @@ -0,0 +1,75 @@ +""" +What is the greatest product of four adjacent numbers (horizontally, +vertically, or diagonally) in this 20x20 array? + +08 02 22 97 38 15 00 40 00 75 04 05 07 78 52 12 50 77 91 08 +49 49 99 40 17 81 18 57 60 87 17 40 98 43 69 48 04 56 62 00 +81 49 31 73 55 79 14 29 93 71 40 67 53 88 30 03 49 13 36 65 +52 70 95 23 04 60 11 42 69 24 68 56 01 32 56 71 37 02 36 91 +22 31 16 71 51 67 63 89 41 92 36 54 22 40 40 28 66 33 13 80 +24 47 32 60 99 03 45 02 44 75 33 53 78 36 84 20 35 17 12 50 +32 98 81 28 64 23 67 10 26 38 40 67 59 54 70 66 18 38 64 70 +67 26 20 68 02 62 12 20 95 63 94 39 63 08 40 91 66 49 94 21 +24 55 58 05 66 73 99 26 97 17 78 78 96 83 14 88 34 89 63 72 +21 36 23 09 75 00 76 44 20 45 35 14 00 61 33 97 34 31 33 95 +78 17 53 28 22 75 31 67 15 94 03 80 04 62 16 14 09 53 56 92 +16 39 05 42 96 35 31 47 55 58 88 24 00 17 54 24 36 29 85 57 +86 56 00 48 35 71 89 07 05 44 44 37 44 60 21 58 51 54 17 58 +19 80 81 68 05 94 47 69 28 73 92 13 86 52 17 77 04 89 55 40 +04 52 08 83 97 35 99 16 07 97 57 32 16 26 26 79 33 27 98 66 +88 36 68 87 57 62 20 72 03 46 33 67 46 55 12 32 63 93 53 69 +04 42 16 73 38 25 39 11 24 94 72 18 08 46 29 32 40 62 76 36 +20 69 36 41 72 30 23 88 34 62 99 69 82 67 59 85 74 04 36 16 +20 73 35 29 78 31 90 01 74 31 49 71 48 86 81 16 23 57 05 54 +01 70 54 71 83 51 54 69 16 92 33 48 61 43 52 01 89 19 67 48 +""" + +import os + + +def solution(): + """Returns the greatest product of four adjacent numbers (horizontally, + vertically, or diagonally). + + >>> solution() + 70600674 + """ + with open(os.path.dirname(__file__) + "/grid.txt") as f: + l = [] # noqa: E741 + for i in range(20): + l.append([int(x) for x in f.readline().split()]) + + maximum = 0 + + # right + for i in range(20): + for j in range(17): + temp = l[i][j] * l[i][j + 1] * l[i][j + 2] * l[i][j + 3] + if temp > maximum: + maximum = temp + + # down + for i in range(17): + for j in range(20): + temp = l[i][j] * l[i + 1][j] * l[i + 2][j] * l[i + 3][j] + if temp > maximum: + maximum = temp + + # diagonal 1 + for i in range(17): + for j in range(17): + temp = l[i][j] * l[i + 1][j + 1] * l[i + 2][j + 2] * l[i + 3][j + 3] + if temp > maximum: + maximum = temp + + # diagonal 2 + for i in range(17): + for j in range(3, 20): + temp = l[i][j] * l[i + 1][j - 1] * l[i + 2][j - 2] * l[i + 3][j - 3] + if temp > maximum: + maximum = temp + return maximum + + +if __name__ == "__main__": + print(solution()) diff --git a/python-mega-algo/project_euler/problem_012/__init__.py b/python-mega-algo/project_euler/problem_012/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/project_euler/problem_012/right.html b/python-mega-algo/project_euler/problem_012/right.html new file mode 100644 index 00000000..754f6dbb --- /dev/null +++ b/python-mega-algo/project_euler/problem_012/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/project_euler/problem_012 + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    sol1.py sol2.py __init__.py 
    + +

    +Folders: 1
    +Files: 3
    +Size of all files: 2441 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/project_euler/problem_012/sol1.py b/python-mega-algo/project_euler/problem_012/sol1.py new file mode 100644 index 00000000..7e080c4e --- /dev/null +++ b/python-mega-algo/project_euler/problem_012/sol1.py @@ -0,0 +1,60 @@ +""" +Highly divisible triangular numbers +Problem 12 +The sequence of triangle numbers is generated by adding the natural numbers. So +the 7th triangle number would be 1 + 2 + 3 + 4 + 5 + 6 + 7 = 28. The first ten +terms would be: + +1, 3, 6, 10, 15, 21, 28, 36, 45, 55, ... + +Let us list the factors of the first seven triangle numbers: + + 1: 1 + 3: 1,3 + 6: 1,2,3,6 +10: 1,2,5,10 +15: 1,3,5,15 +21: 1,3,7,21 +28: 1,2,4,7,14,28 +We can see that 28 is the first triangle number to have over five divisors. + +What is the value of the first triangle number to have over five hundred +divisors? +""" +from math import sqrt + + +def count_divisors(n): + nDivisors = 0 + for i in range(1, int(sqrt(n)) + 1): + if n % i == 0: + nDivisors += 2 + # check if n is perfect square + if n ** 0.5 == int(n ** 0.5): + nDivisors -= 1 + return nDivisors + + +def solution(): + """Returns the value of the first triangle number to have over five hundred + divisors. + + # The code below has been commented due to slow execution affecting Travis. + # >>> solution() + # 76576500 + """ + tNum = 1 + i = 1 + + while True: + i += 1 + tNum += i + + if count_divisors(tNum) > 500: + break + + return tNum + + +if __name__ == "__main__": + print(solution()) diff --git a/python-mega-algo/project_euler/problem_012/sol2.py b/python-mega-algo/project_euler/problem_012/sol2.py new file mode 100644 index 00000000..5ff0d834 --- /dev/null +++ b/python-mega-algo/project_euler/problem_012/sol2.py @@ -0,0 +1,47 @@ +""" +Highly divisible triangular numbers +Problem 12 +The sequence of triangle numbers is generated by adding the natural numbers. So +the 7th triangle number would be 1 + 2 + 3 + 4 + 5 + 6 + 7 = 28. The first ten +terms would be: + +1, 3, 6, 10, 15, 21, 28, 36, 45, 55, ... + +Let us list the factors of the first seven triangle numbers: + + 1: 1 + 3: 1,3 + 6: 1,2,3,6 +10: 1,2,5,10 +15: 1,3,5,15 +21: 1,3,7,21 +28: 1,2,4,7,14,28 +We can see that 28 is the first triangle number to have over five divisors. + +What is the value of the first triangle number to have over five hundred +divisors? +""" + + +def triangle_number_generator(): + for n in range(1, 1000000): + yield n * (n + 1) // 2 + + +def count_divisors(n): + return sum([2 for i in range(1, int(n ** 0.5) + 1) if n % i == 0 and i * i != n]) + + +def solution(): + """Returns the value of the first triangle number to have over five hundred + divisors. + + # The code below has been commented due to slow execution affecting Travis. + # >>> solution() + # 76576500 + """ + return next(i for i in triangle_number_generator() if count_divisors(i) > 500) + + +if __name__ == "__main__": + print(solution()) diff --git a/python-mega-algo/project_euler/problem_013/__init__.py b/python-mega-algo/project_euler/problem_013/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/project_euler/problem_013/num.txt b/python-mega-algo/project_euler/problem_013/num.txt new file mode 100644 index 00000000..43b568e8 --- /dev/null +++ b/python-mega-algo/project_euler/problem_013/num.txt @@ -0,0 +1,100 @@ +37107287533902102798797998220837590246510135740250 +46376937677490009712648124896970078050417018260538 +74324986199524741059474233309513058123726617309629 +91942213363574161572522430563301811072406154908250 +23067588207539346171171980310421047513778063246676 +89261670696623633820136378418383684178734361726757 +28112879812849979408065481931592621691275889832738 +44274228917432520321923589422876796487670272189318 +47451445736001306439091167216856844588711603153276 +70386486105843025439939619828917593665686757934951 +62176457141856560629502157223196586755079324193331 +64906352462741904929101432445813822663347944758178 +92575867718337217661963751590579239728245598838407 +58203565325359399008402633568948830189458628227828 +80181199384826282014278194139940567587151170094390 +35398664372827112653829987240784473053190104293586 +86515506006295864861532075273371959191420517255829 +71693888707715466499115593487603532921714970056938 +54370070576826684624621495650076471787294438377604 +53282654108756828443191190634694037855217779295145 +36123272525000296071075082563815656710885258350721 +45876576172410976447339110607218265236877223636045 +17423706905851860660448207621209813287860733969412 +81142660418086830619328460811191061556940512689692 +51934325451728388641918047049293215058642563049483 +62467221648435076201727918039944693004732956340691 +15732444386908125794514089057706229429197107928209 +55037687525678773091862540744969844508330393682126 +18336384825330154686196124348767681297534375946515 +80386287592878490201521685554828717201219257766954 +78182833757993103614740356856449095527097864797581 +16726320100436897842553539920931837441497806860984 +48403098129077791799088218795327364475675590848030 +87086987551392711854517078544161852424320693150332 +59959406895756536782107074926966537676326235447210 +69793950679652694742597709739166693763042633987085 +41052684708299085211399427365734116182760315001271 +65378607361501080857009149939512557028198746004375 +35829035317434717326932123578154982629742552737307 +94953759765105305946966067683156574377167401875275 +88902802571733229619176668713819931811048770190271 +25267680276078003013678680992525463401061632866526 +36270218540497705585629946580636237993140746255962 +24074486908231174977792365466257246923322810917141 +91430288197103288597806669760892938638285025333403 +34413065578016127815921815005561868836468420090470 +23053081172816430487623791969842487255036638784583 +11487696932154902810424020138335124462181441773470 +63783299490636259666498587618221225225512486764533 +67720186971698544312419572409913959008952310058822 +95548255300263520781532296796249481641953868218774 +76085327132285723110424803456124867697064507995236 +37774242535411291684276865538926205024910326572967 +23701913275725675285653248258265463092207058596522 +29798860272258331913126375147341994889534765745501 +18495701454879288984856827726077713721403798879715 +38298203783031473527721580348144513491373226651381 +34829543829199918180278916522431027392251122869539 +40957953066405232632538044100059654939159879593635 +29746152185502371307642255121183693803580388584903 +41698116222072977186158236678424689157993532961922 +62467957194401269043877107275048102390895523597457 +23189706772547915061505504953922979530901129967519 +86188088225875314529584099251203829009407770775672 +11306739708304724483816533873502340845647058077308 +82959174767140363198008187129011875491310547126581 +97623331044818386269515456334926366572897563400500 +42846280183517070527831839425882145521227251250327 +55121603546981200581762165212827652751691296897789 +32238195734329339946437501907836945765883352399886 +75506164965184775180738168837861091527357929701337 +62177842752192623401942399639168044983993173312731 +32924185707147349566916674687634660915035914677504 +99518671430235219628894890102423325116913619626622 +73267460800591547471830798392868535206946944540724 +76841822524674417161514036427982273348055556214818 +97142617910342598647204516893989422179826088076852 +87783646182799346313767754307809363333018982642090 +10848802521674670883215120185883543223812876952786 +71329612474782464538636993009049310363619763878039 +62184073572399794223406235393808339651327408011116 +66627891981488087797941876876144230030984490851411 +60661826293682836764744779239180335110989069790714 +85786944089552990653640447425576083659976645795096 +66024396409905389607120198219976047599490197230297 +64913982680032973156037120041377903785566085089252 +16730939319872750275468906903707539413042652315011 +94809377245048795150954100921645863754710598436791 +78639167021187492431995700641917969777599028300699 +15368713711936614952811305876380278410754449733078 +40789923115535562561142322423255033685442488917353 +44889911501440648020369068063960672322193204149535 +41503128880339536053299340368006977710650566631954 +81234880673210146739058568557934581403627822703280 +82616570773948327592232845941706525094512325230608 +22918802058777319719839450180888072429661980811197 +77158542502016545090413245809786882778948721859617 +72107838435069186155435662884062257473692284509516 +20849603980134001723930671666823555245252804609722 +53503534226472524250874054075591789781264330331690 diff --git a/python-mega-algo/project_euler/problem_013/right.html b/python-mega-algo/project_euler/problem_013/right.html new file mode 100644 index 00000000..b99ac3ae --- /dev/null +++ b/python-mega-algo/project_euler/problem_013/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/project_euler/problem_013 + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    sol1.py __init__.py num.txt 
    + +

    +Folders: 1
    +Files: 3
    +Size of all files: 5658 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/project_euler/problem_013/sol1.py b/python-mega-algo/project_euler/problem_013/sol1.py new file mode 100644 index 00000000..1ea08b12 --- /dev/null +++ b/python-mega-algo/project_euler/problem_013/sol1.py @@ -0,0 +1,25 @@ +""" +Problem 13: https://projecteuler.net/problem=13 + +Problem Statement: +Work out the first ten digits of the sum of the following one-hundred 50-digit +numbers. +""" +import os + + +def solution(): + """ + Returns the first ten digits of the sum of the array elements + from the file num.txt + + >>> solution() + '5537376230' + """ + file_path = os.path.join(os.path.dirname(__file__), "num.txt") + with open(file_path) as file_hand: + return str(sum([int(line) for line in file_hand]))[:10] + + +if __name__ == "__main__": + print(solution()) diff --git a/python-mega-algo/project_euler/problem_014/__init__.py b/python-mega-algo/project_euler/problem_014/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/project_euler/problem_014/right.html b/python-mega-algo/project_euler/problem_014/right.html new file mode 100644 index 00000000..9ec73993 --- /dev/null +++ b/python-mega-algo/project_euler/problem_014/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/project_euler/problem_014 + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    sol1.py sol2.py __init__.py 
    + +

    +Folders: 1
    +Files: 3
    +Size of all files: 3324 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/project_euler/problem_014/sol1.py b/python-mega-algo/project_euler/problem_014/sol1.py new file mode 100644 index 00000000..1745ec93 --- /dev/null +++ b/python-mega-algo/project_euler/problem_014/sol1.py @@ -0,0 +1,60 @@ +""" +Problem 14: https://projecteuler.net/problem=14 + +Problem Statement: +The following iterative sequence is defined for the set of positive integers: + + n → n/2 (n is even) + n → 3n + 1 (n is odd) + +Using the rule above and starting with 13, we generate the following sequence: + + 13 → 40 → 20 → 10 → 5 → 16 → 8 → 4 → 2 → 1 + +It can be seen that this sequence (starting at 13 and finishing at 1) contains +10 terms. Although it has not been proved yet (Collatz Problem), it is thought +that all starting numbers finish at 1. + +Which starting number, under one million, produces the longest chain? +""" + + +def solution(n: int = 1000000) -> int: + """Returns the number under n that generates the longest sequence using the + formula: + n → n/2 (n is even) + n → 3n + 1 (n is odd) + + # The code below has been commented due to slow execution affecting Travis. + # >>> solution(1000000) + # 837799 + >>> solution(200) + 171 + >>> solution(5000) + 3711 + >>> solution(15000) + 13255 + """ + largest_number = 0 + pre_counter = 0 + + for input1 in range(n): + counter = 1 + number = input1 + + while number > 1: + if number % 2 == 0: + number /= 2 + counter += 1 + else: + number = (3 * number) + 1 + counter += 1 + + if counter > pre_counter: + largest_number = input1 + pre_counter = counter + return largest_number + + +if __name__ == "__main__": + print(solution(int(input().strip()))) diff --git a/python-mega-algo/project_euler/problem_014/sol2.py b/python-mega-algo/project_euler/problem_014/sol2.py new file mode 100644 index 00000000..20ad9632 --- /dev/null +++ b/python-mega-algo/project_euler/problem_014/sol2.py @@ -0,0 +1,62 @@ +""" +Problem 14: https://projecteuler.net/problem=14 + +Collatz conjecture: start with any positive integer n. Next term obtained from +the previous term as follows: + +If the previous term is even, the next term is one half the previous term. +If the previous term is odd, the next term is 3 times the previous term plus 1. +The conjecture states the sequence will always reach 1 regardless of starting +n. + +Problem Statement: +The following iterative sequence is defined for the set of positive integers: + + n → n/2 (n is even) + n → 3n + 1 (n is odd) + +Using the rule above and starting with 13, we generate the following sequence: + + 13 → 40 → 20 → 10 → 5 → 16 → 8 → 4 → 2 → 1 + +It can be seen that this sequence (starting at 13 and finishing at 1) contains +10 terms. Although it has not been proved yet (Collatz Problem), it is thought +that all starting numbers finish at 1. + +Which starting number, under one million, produces the longest chain? +""" +from typing import List + + +def collatz_sequence(n: int) -> List[int]: + """Returns the Collatz sequence for n.""" + sequence = [n] + while n != 1: + if n % 2 == 0: + n //= 2 + else: + n = 3 * n + 1 + sequence.append(n) + return sequence + + +def solution(n: int = 1000000) -> int: + """Returns the number under n that generates the longest Collatz sequence. + + # The code below has been commented due to slow execution affecting Travis. + # >>> solution(1000000) + # 837799 + >>> solution(200) + 171 + >>> solution(5000) + 3711 + >>> solution(15000) + 13255 + """ + + result = max([(len(collatz_sequence(i)), i) for i in range(1, n)]) + return result[1] + + +if __name__ == "__main__": + print(solution(int(input().strip()))) diff --git a/python-mega-algo/project_euler/problem_015/__init__.py b/python-mega-algo/project_euler/problem_015/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/project_euler/problem_015/right.html b/python-mega-algo/project_euler/problem_015/right.html new file mode 100644 index 00000000..0c823036 --- /dev/null +++ b/python-mega-algo/project_euler/problem_015/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/project_euler/problem_015 + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    sol1.py __init__.py 
    + +

    +Folders: 1
    +Files: 2
    +Size of all files: 1145 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/project_euler/problem_015/sol1.py b/python-mega-algo/project_euler/problem_015/sol1.py new file mode 100644 index 00000000..da079d26 --- /dev/null +++ b/python-mega-algo/project_euler/problem_015/sol1.py @@ -0,0 +1,44 @@ +""" +Problem 15: https://projecteuler.net/problem=15 + +Starting in the top left corner of a 2×2 grid, and only being able to move to +the right and down, there are exactly 6 routes to the bottom right corner. +How many such routes are there through a 20×20 grid? +""" +from math import factorial + + +def solution(n: int = 20) -> int: + """ + Returns the number of paths possible in a n x n grid starting at top left + corner going to bottom right corner and being able to move right and down + only. + >>> solution(25) + 126410606437752 + >>> solution(23) + 8233430727600 + >>> solution(20) + 137846528820 + >>> solution(15) + 155117520 + >>> solution(1) + 2 + """ + n = 2 * n # middle entry of odd rows starting at row 3 is the solution for n = 1, + # 2, 3,... + k = n / 2 + + return int(factorial(n) / (factorial(k) * factorial(n - k))) + + +if __name__ == "__main__": + import sys + + if len(sys.argv) == 1: + print(solution(20)) + else: + try: + n = int(sys.argv[1]) + print(solution(n)) + except ValueError: + print("Invalid entry - please enter a number.") diff --git a/python-mega-algo/project_euler/problem_016/__init__.py b/python-mega-algo/project_euler/problem_016/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/project_euler/problem_016/right.html b/python-mega-algo/project_euler/problem_016/right.html new file mode 100644 index 00000000..aac66529 --- /dev/null +++ b/python-mega-algo/project_euler/problem_016/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/project_euler/problem_016 + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    sol1.py sol2.py __init__.py 
    + +

    +Folders: 1
    +Files: 3
    +Size of all files: 1348 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/project_euler/problem_016/sol1.py b/python-mega-algo/project_euler/problem_016/sol1.py new file mode 100644 index 00000000..f6620aa9 --- /dev/null +++ b/python-mega-algo/project_euler/problem_016/sol1.py @@ -0,0 +1,36 @@ +""" +Problem 16: https://projecteuler.net/problem=16 + +2^15 = 32768 and the sum of its digits is 3 + 2 + 7 + 6 + 8 = 26. + +What is the sum of the digits of the number 2^1000? +""" + + +def solution(power: int = 1000) -> int: + """Returns the sum of the digits of the number 2^power. + >>> solution(1000) + 1366 + >>> solution(50) + 76 + >>> solution(20) + 31 + >>> solution(15) + 26 + """ + num = 2 ** power + string_num = str(num) + list_num = list(string_num) + sum_of_num = 0 + + for i in list_num: + sum_of_num += int(i) + + return sum_of_num + + +if __name__ == "__main__": + power = int(input("Enter the power of 2: ").strip()) + print("2 ^ ", power, " = ", 2 ** power) + result = solution(power) + print("Sum of the digits is: ", result) diff --git a/python-mega-algo/project_euler/problem_016/sol2.py b/python-mega-algo/project_euler/problem_016/sol2.py new file mode 100644 index 00000000..304d27d1 --- /dev/null +++ b/python-mega-algo/project_euler/problem_016/sol2.py @@ -0,0 +1,30 @@ +""" +Problem 16: https://projecteuler.net/problem=16 + +2^15 = 32768 and the sum of its digits is 3 + 2 + 7 + 6 + 8 = 26. + +What is the sum of the digits of the number 2^1000? +""" + + +def solution(power: int = 1000) -> int: + """Returns the sum of the digits of the number 2^power. + + >>> solution(1000) + 1366 + >>> solution(50) + 76 + >>> solution(20) + 31 + >>> solution(15) + 26 + """ + n = 2 ** power + r = 0 + while n: + r, n = r + n % 10, n // 10 + return r + + +if __name__ == "__main__": + print(solution(int(str(input()).strip()))) diff --git a/python-mega-algo/project_euler/problem_017/__init__.py b/python-mega-algo/project_euler/problem_017/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/project_euler/problem_017/right.html b/python-mega-algo/project_euler/problem_017/right.html new file mode 100644 index 00000000..2fa389f0 --- /dev/null +++ b/python-mega-algo/project_euler/problem_017/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/project_euler/problem_017 + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    sol1.py __init__.py 
    + +

    +Folders: 1
    +Files: 2
    +Size of all files: 2153 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/project_euler/problem_017/sol1.py b/python-mega-algo/project_euler/problem_017/sol1.py new file mode 100644 index 00000000..d4db1beb --- /dev/null +++ b/python-mega-algo/project_euler/problem_017/sol1.py @@ -0,0 +1,63 @@ +""" +Number letter counts +Problem 17: https://projecteuler.net/problem=17 + +If the numbers 1 to 5 are written out in words: one, two, three, four, five, +then there are 3 + 3 + 5 + 4 + 4 = 19 letters used in total. + +If all the numbers from 1 to 1000 (one thousand) inclusive were written out in +words, how many letters would be used? + + +NOTE: Do not count spaces or hyphens. For example, 342 (three hundred and +forty-two) contains 23 letters and 115 (one hundred and fifteen) contains 20 +letters. The use of "and" when writing out numbers is in compliance withBritish +usage. +""" + + +def solution(n: int = 1000) -> int: + """Returns the number of letters used to write all numbers from 1 to n. + where n is lower or equals to 1000. + >>> solution(1000) + 21124 + >>> solution(5) + 19 + """ + # number of letters in zero, one, two, ..., nineteen (0 for zero since it's + # never said aloud) + ones_counts = [0, 3, 3, 5, 4, 4, 3, 5, 5, 4, 3, 6, 6, 8, 8, 7, 7, 9, 8, 8] + # number of letters in twenty, thirty, ..., ninety (0 for numbers less than + # 20 due to inconsistency in teens) + tens_counts = [0, 0, 6, 6, 5, 5, 5, 7, 6, 6] + + count = 0 + + for i in range(1, n + 1): + if i < 1000: + if i >= 100: + # add number of letters for "n hundred" + count += ones_counts[i // 100] + 7 + + if i % 100 != 0: + # add number of letters for "and" if number is not multiple + # of 100 + count += 3 + + if 0 < i % 100 < 20: + # add number of letters for one, two, three, ..., nineteen + # (could be combined with below if not for inconsistency in + # teens) + count += ones_counts[i % 100] + else: + # add number of letters for twenty, twenty one, ..., ninety + # nine + count += ones_counts[i % 10] + count += tens_counts[(i % 100 - i % 10) // 10] + else: + count += ones_counts[i // 1000] + 8 + return count + + +if __name__ == "__main__": + print(solution(int(input().strip()))) diff --git a/python-mega-algo/project_euler/problem_018/__init__.py b/python-mega-algo/project_euler/problem_018/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/project_euler/problem_018/right.html b/python-mega-algo/project_euler/problem_018/right.html new file mode 100644 index 00000000..ca937bf4 --- /dev/null +++ b/python-mega-algo/project_euler/problem_018/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/project_euler/problem_018 + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    solution.py __init__.py triangle.txt 
    + +

    +Folders: 1
    +Files: 3
    +Size of all files: 1818 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/project_euler/problem_018/solution.py b/python-mega-algo/project_euler/problem_018/solution.py new file mode 100644 index 00000000..82fc3ce3 --- /dev/null +++ b/python-mega-algo/project_euler/problem_018/solution.py @@ -0,0 +1,64 @@ +""" +By starting at the top of the triangle below and moving to adjacent numbers on +the row below, the maximum total from top to bottom is 23. + +3 +7 4 +2 4 6 +8 5 9 3 + +That is, 3 + 7 + 4 + 9 = 23. + +Find the maximum total from top to bottom of the triangle below: + +75 +95 64 +17 47 82 +18 35 87 10 +20 04 82 47 65 +19 01 23 75 03 34 +88 02 77 73 07 63 67 +99 65 04 28 06 16 70 92 +41 41 26 56 83 40 80 70 33 +41 48 72 33 47 32 37 16 94 29 +53 71 44 65 25 43 91 52 97 51 14 +70 11 33 28 77 73 17 78 39 68 17 57 +91 71 52 38 17 14 91 43 58 50 27 29 48 +63 66 04 68 89 53 67 30 73 16 69 87 40 31 +04 62 98 27 23 09 70 98 73 93 38 53 60 04 23 +""" +import os + + +def solution(): + """ + Finds the maximum total in a triangle as described by the problem statement + above. + + >>> solution() + 1074 + """ + script_dir = os.path.dirname(os.path.realpath(__file__)) + triangle = os.path.join(script_dir, "triangle.txt") + + with open(triangle) as f: + triangle = f.readlines() + + a = [[int(y) for y in x.rstrip("\r\n").split(" ")] for x in triangle] + + for i in range(1, len(a)): + for j in range(len(a[i])): + if j != len(a[i - 1]): + number1 = a[i - 1][j] + else: + number1 = 0 + if j > 0: + number2 = a[i - 1][j - 1] + else: + number2 = 0 + a[i][j] += max(number1, number2) + return max(a[-1]) + + +if __name__ == "__main__": + print(solution()) diff --git a/python-mega-algo/project_euler/problem_018/triangle.txt b/python-mega-algo/project_euler/problem_018/triangle.txt new file mode 100644 index 00000000..e236c2ff --- /dev/null +++ b/python-mega-algo/project_euler/problem_018/triangle.txt @@ -0,0 +1,15 @@ +75 +95 64 +17 47 82 +18 35 87 10 +20 04 82 47 65 +19 01 23 75 03 34 +88 02 77 73 07 63 67 +99 65 04 28 06 16 70 92 +41 41 26 56 83 40 80 70 33 +41 48 72 33 47 32 37 16 94 29 +53 71 44 65 25 43 91 52 97 51 14 +70 11 33 28 77 73 17 78 39 68 17 57 +91 71 52 38 17 14 91 43 58 50 27 29 48 +63 66 04 68 89 53 67 30 73 16 69 87 40 31 +04 62 98 27 23 09 70 98 73 93 38 53 60 04 23 diff --git a/python-mega-algo/project_euler/problem_019/__init__.py b/python-mega-algo/project_euler/problem_019/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/project_euler/problem_019/right.html b/python-mega-algo/project_euler/problem_019/right.html new file mode 100644 index 00000000..5d95c3a4 --- /dev/null +++ b/python-mega-algo/project_euler/problem_019/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/project_euler/problem_019 + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    sol1.py __init__.py 
    + +

    +Folders: 1
    +Files: 2
    +Size of all files: 1570 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/project_euler/problem_019/sol1.py b/python-mega-algo/project_euler/problem_019/sol1.py new file mode 100644 index 00000000..ab593658 --- /dev/null +++ b/python-mega-algo/project_euler/problem_019/sol1.py @@ -0,0 +1,64 @@ +""" +Counting Sundays +Problem 19 + +You are given the following information, but you may prefer to do some research +for yourself. + +1 Jan 1900 was a Monday. +Thirty days has September, +April, June and November. +All the rest have thirty-one, +Saving February alone, +Which has twenty-eight, rain or shine. +And on leap years, twenty-nine. + +A leap year occurs on any year evenly divisible by 4, but not on a century +unless it is divisible by 400. + +How many Sundays fell on the first of the month during the twentieth century +(1 Jan 1901 to 31 Dec 2000)? +""" + + +def solution(): + """Returns the number of mondays that fall on the first of the month during + the twentieth century (1 Jan 1901 to 31 Dec 2000)? + + >>> solution() + 171 + """ + days_per_month = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] + + day = 6 + month = 1 + year = 1901 + + sundays = 0 + + while year < 2001: + day += 7 + + if (year % 4 == 0 and not year % 100 == 0) or (year % 400 == 0): + if day > days_per_month[month - 1] and month != 2: + month += 1 + day = day - days_per_month[month - 2] + elif day > 29 and month == 2: + month += 1 + day = day - 29 + else: + if day > days_per_month[month - 1]: + month += 1 + day = day - days_per_month[month - 2] + + if month > 12: + year += 1 + month = 1 + + if year < 2001 and day == 1: + sundays += 1 + return sundays + + +if __name__ == "__main__": + print(solution()) diff --git a/python-mega-algo/project_euler/problem_020/__init__.py b/python-mega-algo/project_euler/problem_020/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/project_euler/problem_020/right.html b/python-mega-algo/project_euler/problem_020/right.html new file mode 100644 index 00000000..4377a3f3 --- /dev/null +++ b/python-mega-algo/project_euler/problem_020/right.html @@ -0,0 +1,30 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/project_euler/problem_020 + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + + +
    FileFileFileFile
    sol1.py sol3.py sol4.py __init__.py 
    sol2.py 
    + +

    +Folders: 1
    +Files: 5
    +Size of all files: 3654 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/project_euler/problem_020/sol1.py b/python-mega-algo/project_euler/problem_020/sol1.py new file mode 100644 index 00000000..b472024e --- /dev/null +++ b/python-mega-algo/project_euler/problem_020/sol1.py @@ -0,0 +1,54 @@ +""" +Problem 20: https://projecteuler.net/problem=20 + +n! means n × (n − 1) × ... × 3 × 2 × 1 + +For example, 10! = 10 × 9 × ... × 3 × 2 × 1 = 3628800, +and the sum of the digits in the number 10! is 3 + 6 + 2 + 8 + 8 + 0 + 0 = 27. + +Find the sum of the digits in the number 100! +""" + + +def factorial(num: int) -> int: + """Find the factorial of a given number n""" + fact = 1 + for i in range(1, num + 1): + fact *= i + return fact + + +def split_and_add(number: int) -> int: + """Split number digits and add them.""" + sum_of_digits = 0 + while number > 0: + last_digit = number % 10 + sum_of_digits += last_digit + number = number // 10 # Removing the last_digit from the given number + return sum_of_digits + + +def solution(num: int = 100) -> int: + """Returns the sum of the digits in the factorial of num + >>> solution(100) + 648 + >>> solution(50) + 216 + >>> solution(10) + 27 + >>> solution(5) + 3 + >>> solution(3) + 6 + >>> solution(2) + 2 + >>> solution(1) + 1 + """ + nfact = factorial(num) + result = split_and_add(nfact) + return result + + +if __name__ == "__main__": + print(solution(int(input("Enter the Number: ").strip()))) diff --git a/python-mega-algo/project_euler/problem_020/sol2.py b/python-mega-algo/project_euler/problem_020/sol2.py new file mode 100644 index 00000000..92e1e724 --- /dev/null +++ b/python-mega-algo/project_euler/problem_020/sol2.py @@ -0,0 +1,35 @@ +""" +Problem 20: https://projecteuler.net/problem=20 + +n! means n × (n − 1) × ... × 3 × 2 × 1 + +For example, 10! = 10 × 9 × ... × 3 × 2 × 1 = 3628800, +and the sum of the digits in the number 10! is 3 + 6 + 2 + 8 + 8 + 0 + 0 = 27. + +Find the sum of the digits in the number 100! +""" +from math import factorial + + +def solution(num: int = 100) -> int: + """Returns the sum of the digits in the factorial of num + >>> solution(100) + 648 + >>> solution(50) + 216 + >>> solution(10) + 27 + >>> solution(5) + 3 + >>> solution(3) + 6 + >>> solution(2) + 2 + >>> solution(1) + 1 + """ + return sum([int(x) for x in str(factorial(num))]) + + +if __name__ == "__main__": + print(solution(int(input("Enter the Number: ").strip()))) diff --git a/python-mega-algo/project_euler/problem_020/sol3.py b/python-mega-algo/project_euler/problem_020/sol3.py new file mode 100644 index 00000000..4f28ac5f --- /dev/null +++ b/python-mega-algo/project_euler/problem_020/sol3.py @@ -0,0 +1,41 @@ +""" +Problem 20: https://projecteuler.net/problem=20 + +n! means n × (n − 1) × ... × 3 × 2 × 1 + +For example, 10! = 10 × 9 × ... × 3 × 2 × 1 = 3628800, +and the sum of the digits in the number 10! is 3 + 6 + 2 + 8 + 8 + 0 + 0 = 27. + +Find the sum of the digits in the number 100! +""" +from math import factorial + + +def solution(num: int = 100) -> int: + """Returns the sum of the digits in the factorial of num + >>> solution(1000) + 10539 + >>> solution(200) + 1404 + >>> solution(100) + 648 + >>> solution(50) + 216 + >>> solution(10) + 27 + >>> solution(5) + 3 + >>> solution(3) + 6 + >>> solution(2) + 2 + >>> solution(1) + 1 + >>> solution(0) + 1 + """ + return sum(map(int, str(factorial(num)))) + + +if __name__ == "__main__": + print(solution(int(input("Enter the Number: ").strip()))) diff --git a/python-mega-algo/project_euler/problem_020/sol4.py b/python-mega-algo/project_euler/problem_020/sol4.py new file mode 100644 index 00000000..b32ce309 --- /dev/null +++ b/python-mega-algo/project_euler/problem_020/sol4.py @@ -0,0 +1,42 @@ +""" +Problem 20: https://projecteuler.net/problem=20 + +n! means n × (n − 1) × ... × 3 × 2 × 1 + +For example, 10! = 10 × 9 × ... × 3 × 2 × 1 = 3628800, +and the sum of the digits in the number 10! is 3 + 6 + 2 + 8 + 8 + 0 + 0 = 27. + +Find the sum of the digits in the number 100! +""" + + +def solution(num: int = 100) -> int: + """Returns the sum of the digits in the factorial of num + >>> solution(100) + 648 + >>> solution(50) + 216 + >>> solution(10) + 27 + >>> solution(5) + 3 + >>> solution(3) + 6 + >>> solution(2) + 2 + >>> solution(1) + 1 + """ + fact = 1 + result = 0 + for i in range(1, num + 1): + fact *= i + + for j in str(fact): + result += int(j) + + return result + + +if __name__ == "__main__": + print(solution(int(input("Enter the Number: ").strip()))) diff --git a/python-mega-algo/project_euler/problem_021/__init__.py b/python-mega-algo/project_euler/problem_021/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/project_euler/problem_021/right.html b/python-mega-algo/project_euler/problem_021/right.html new file mode 100644 index 00000000..b2dd994f --- /dev/null +++ b/python-mega-algo/project_euler/problem_021/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/project_euler/problem_021 + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    sol1.py __init__.py 
    + +

    +Folders: 1
    +Files: 2
    +Size of all files: 1292 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/project_euler/problem_021/sol1.py b/python-mega-algo/project_euler/problem_021/sol1.py new file mode 100644 index 00000000..3fac7915 --- /dev/null +++ b/python-mega-algo/project_euler/problem_021/sol1.py @@ -0,0 +1,54 @@ +""" +Amicable Numbers +Problem 21 + +Let d(n) be defined as the sum of proper divisors of n (numbers less than n +which divide evenly into n). +If d(a) = b and d(b) = a, where a ≠ b, then a and b are an amicable pair and +each of a and b are called amicable numbers. + +For example, the proper divisors of 220 are 1, 2, 4, 5, 10, 11, 20, 22, 44, 55 +and 110; therefore d(220) = 284. The proper divisors of 284 are 1, 2, 4, 71 and +142; so d(284) = 220. + +Evaluate the sum of all the amicable numbers under 10000. +""" +from math import sqrt + + +def sum_of_divisors(n: int) -> int: + total = 0 + for i in range(1, int(sqrt(n) + 1)): + if n % i == 0 and i != sqrt(n): + total += i + n // i + elif i == sqrt(n): + total += i + return total - n + + +def solution(n: int = 10000) -> int: + """Returns the sum of all the amicable numbers under n. + + >>> solution(10000) + 31626 + >>> solution(5000) + 8442 + >>> solution(1000) + 504 + >>> solution(100) + 0 + >>> solution(50) + 0 + """ + total = sum( + [ + i + for i in range(1, n) + if sum_of_divisors(sum_of_divisors(i)) == i and sum_of_divisors(i) != i + ] + ) + return total + + +if __name__ == "__main__": + print(solution(int(str(input()).strip()))) diff --git a/python-mega-algo/project_euler/problem_022/__init__.py b/python-mega-algo/project_euler/problem_022/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/project_euler/problem_022/p022_names.txt b/python-mega-algo/project_euler/problem_022/p022_names.txt new file mode 100644 index 00000000..7b8986bf --- /dev/null +++ b/python-mega-algo/project_euler/problem_022/p022_names.txt @@ -0,0 +1 @@ +"MARY","PATRICIA","LINDA","BARBARA","ELIZABETH","JENNIFER","MARIA","SUSAN","MARGARET","DOROTHY","LISA","NANCY","KAREN","BETTY","HELEN","SANDRA","DONNA","CAROL","RUTH","SHARON","MICHELLE","LAURA","SARAH","KIMBERLY","DEBORAH","JESSICA","SHIRLEY","CYNTHIA","ANGELA","MELISSA","BRENDA","AMY","ANNA","REBECCA","VIRGINIA","KATHLEEN","PAMELA","MARTHA","DEBRA","AMANDA","STEPHANIE","CAROLYN","CHRISTINE","MARIE","JANET","CATHERINE","FRANCES","ANN","JOYCE","DIANE","ALICE","JULIE","HEATHER","TERESA","DORIS","GLORIA","EVELYN","JEAN","CHERYL","MILDRED","KATHERINE","JOAN","ASHLEY","JUDITH","ROSE","JANICE","KELLY","NICOLE","JUDY","CHRISTINA","KATHY","THERESA","BEVERLY","DENISE","TAMMY","IRENE","JANE","LORI","RACHEL","MARILYN","ANDREA","KATHRYN","LOUISE","SARA","ANNE","JACQUELINE","WANDA","BONNIE","JULIA","RUBY","LOIS","TINA","PHYLLIS","NORMA","PAULA","DIANA","ANNIE","LILLIAN","EMILY","ROBIN","PEGGY","CRYSTAL","GLADYS","RITA","DAWN","CONNIE","FLORENCE","TRACY","EDNA","TIFFANY","CARMEN","ROSA","CINDY","GRACE","WENDY","VICTORIA","EDITH","KIM","SHERRY","SYLVIA","JOSEPHINE","THELMA","SHANNON","SHEILA","ETHEL","ELLEN","ELAINE","MARJORIE","CARRIE","CHARLOTTE","MONICA","ESTHER","PAULINE","EMMA","JUANITA","ANITA","RHONDA","HAZEL","AMBER","EVA","DEBBIE","APRIL","LESLIE","CLARA","LUCILLE","JAMIE","JOANNE","ELEANOR","VALERIE","DANIELLE","MEGAN","ALICIA","SUZANNE","MICHELE","GAIL","BERTHA","DARLENE","VERONICA","JILL","ERIN","GERALDINE","LAUREN","CATHY","JOANN","LORRAINE","LYNN","SALLY","REGINA","ERICA","BEATRICE","DOLORES","BERNICE","AUDREY","YVONNE","ANNETTE","JUNE","SAMANTHA","MARION","DANA","STACY","ANA","RENEE","IDA","VIVIAN","ROBERTA","HOLLY","BRITTANY","MELANIE","LORETTA","YOLANDA","JEANETTE","LAURIE","KATIE","KRISTEN","VANESSA","ALMA","SUE","ELSIE","BETH","JEANNE","VICKI","CARLA","TARA","ROSEMARY","EILEEN","TERRI","GERTRUDE","LUCY","TONYA","ELLA","STACEY","WILMA","GINA","KRISTIN","JESSIE","NATALIE","AGNES","VERA","WILLIE","CHARLENE","BESSIE","DELORES","MELINDA","PEARL","ARLENE","MAUREEN","COLLEEN","ALLISON","TAMARA","JOY","GEORGIA","CONSTANCE","LILLIE","CLAUDIA","JACKIE","MARCIA","TANYA","NELLIE","MINNIE","MARLENE","HEIDI","GLENDA","LYDIA","VIOLA","COURTNEY","MARIAN","STELLA","CAROLINE","DORA","JO","VICKIE","MATTIE","TERRY","MAXINE","IRMA","MABEL","MARSHA","MYRTLE","LENA","CHRISTY","DEANNA","PATSY","HILDA","GWENDOLYN","JENNIE","NORA","MARGIE","NINA","CASSANDRA","LEAH","PENNY","KAY","PRISCILLA","NAOMI","CAROLE","BRANDY","OLGA","BILLIE","DIANNE","TRACEY","LEONA","JENNY","FELICIA","SONIA","MIRIAM","VELMA","BECKY","BOBBIE","VIOLET","KRISTINA","TONI","MISTY","MAE","SHELLY","DAISY","RAMONA","SHERRI","ERIKA","KATRINA","CLAIRE","LINDSEY","LINDSAY","GENEVA","GUADALUPE","BELINDA","MARGARITA","SHERYL","CORA","FAYE","ADA","NATASHA","SABRINA","ISABEL","MARGUERITE","HATTIE","HARRIET","MOLLY","CECILIA","KRISTI","BRANDI","BLANCHE","SANDY","ROSIE","JOANNA","IRIS","EUNICE","ANGIE","INEZ","LYNDA","MADELINE","AMELIA","ALBERTA","GENEVIEVE","MONIQUE","JODI","JANIE","MAGGIE","KAYLA","SONYA","JAN","LEE","KRISTINE","CANDACE","FANNIE","MARYANN","OPAL","ALISON","YVETTE","MELODY","LUZ","SUSIE","OLIVIA","FLORA","SHELLEY","KRISTY","MAMIE","LULA","LOLA","VERNA","BEULAH","ANTOINETTE","CANDICE","JUANA","JEANNETTE","PAM","KELLI","HANNAH","WHITNEY","BRIDGET","KARLA","CELIA","LATOYA","PATTY","SHELIA","GAYLE","DELLA","VICKY","LYNNE","SHERI","MARIANNE","KARA","JACQUELYN","ERMA","BLANCA","MYRA","LETICIA","PAT","KRISTA","ROXANNE","ANGELICA","JOHNNIE","ROBYN","FRANCIS","ADRIENNE","ROSALIE","ALEXANDRA","BROOKE","BETHANY","SADIE","BERNADETTE","TRACI","JODY","KENDRA","JASMINE","NICHOLE","RACHAEL","CHELSEA","MABLE","ERNESTINE","MURIEL","MARCELLA","ELENA","KRYSTAL","ANGELINA","NADINE","KARI","ESTELLE","DIANNA","PAULETTE","LORA","MONA","DOREEN","ROSEMARIE","ANGEL","DESIREE","ANTONIA","HOPE","GINGER","JANIS","BETSY","CHRISTIE","FREDA","MERCEDES","MEREDITH","LYNETTE","TERI","CRISTINA","EULA","LEIGH","MEGHAN","SOPHIA","ELOISE","ROCHELLE","GRETCHEN","CECELIA","RAQUEL","HENRIETTA","ALYSSA","JANA","KELLEY","GWEN","KERRY","JENNA","TRICIA","LAVERNE","OLIVE","ALEXIS","TASHA","SILVIA","ELVIRA","CASEY","DELIA","SOPHIE","KATE","PATTI","LORENA","KELLIE","SONJA","LILA","LANA","DARLA","MAY","MINDY","ESSIE","MANDY","LORENE","ELSA","JOSEFINA","JEANNIE","MIRANDA","DIXIE","LUCIA","MARTA","FAITH","LELA","JOHANNA","SHARI","CAMILLE","TAMI","SHAWNA","ELISA","EBONY","MELBA","ORA","NETTIE","TABITHA","OLLIE","JAIME","WINIFRED","KRISTIE","MARINA","ALISHA","AIMEE","RENA","MYRNA","MARLA","TAMMIE","LATASHA","BONITA","PATRICE","RONDA","SHERRIE","ADDIE","FRANCINE","DELORIS","STACIE","ADRIANA","CHERI","SHELBY","ABIGAIL","CELESTE","JEWEL","CARA","ADELE","REBEKAH","LUCINDA","DORTHY","CHRIS","EFFIE","TRINA","REBA","SHAWN","SALLIE","AURORA","LENORA","ETTA","LOTTIE","KERRI","TRISHA","NIKKI","ESTELLA","FRANCISCA","JOSIE","TRACIE","MARISSA","KARIN","BRITTNEY","JANELLE","LOURDES","LAUREL","HELENE","FERN","ELVA","CORINNE","KELSEY","INA","BETTIE","ELISABETH","AIDA","CAITLIN","INGRID","IVA","EUGENIA","CHRISTA","GOLDIE","CASSIE","MAUDE","JENIFER","THERESE","FRANKIE","DENA","LORNA","JANETTE","LATONYA","CANDY","MORGAN","CONSUELO","TAMIKA","ROSETTA","DEBORA","CHERIE","POLLY","DINA","JEWELL","FAY","JILLIAN","DOROTHEA","NELL","TRUDY","ESPERANZA","PATRICA","KIMBERLEY","SHANNA","HELENA","CAROLINA","CLEO","STEFANIE","ROSARIO","OLA","JANINE","MOLLIE","LUPE","ALISA","LOU","MARIBEL","SUSANNE","BETTE","SUSANA","ELISE","CECILE","ISABELLE","LESLEY","JOCELYN","PAIGE","JONI","RACHELLE","LEOLA","DAPHNE","ALTA","ESTER","PETRA","GRACIELA","IMOGENE","JOLENE","KEISHA","LACEY","GLENNA","GABRIELA","KERI","URSULA","LIZZIE","KIRSTEN","SHANA","ADELINE","MAYRA","JAYNE","JACLYN","GRACIE","SONDRA","CARMELA","MARISA","ROSALIND","CHARITY","TONIA","BEATRIZ","MARISOL","CLARICE","JEANINE","SHEENA","ANGELINE","FRIEDA","LILY","ROBBIE","SHAUNA","MILLIE","CLAUDETTE","CATHLEEN","ANGELIA","GABRIELLE","AUTUMN","KATHARINE","SUMMER","JODIE","STACI","LEA","CHRISTI","JIMMIE","JUSTINE","ELMA","LUELLA","MARGRET","DOMINIQUE","SOCORRO","RENE","MARTINA","MARGO","MAVIS","CALLIE","BOBBI","MARITZA","LUCILE","LEANNE","JEANNINE","DEANA","AILEEN","LORIE","LADONNA","WILLA","MANUELA","GALE","SELMA","DOLLY","SYBIL","ABBY","LARA","DALE","IVY","DEE","WINNIE","MARCY","LUISA","JERI","MAGDALENA","OFELIA","MEAGAN","AUDRA","MATILDA","LEILA","CORNELIA","BIANCA","SIMONE","BETTYE","RANDI","VIRGIE","LATISHA","BARBRA","GEORGINA","ELIZA","LEANN","BRIDGETTE","RHODA","HALEY","ADELA","NOLA","BERNADINE","FLOSSIE","ILA","GRETA","RUTHIE","NELDA","MINERVA","LILLY","TERRIE","LETHA","HILARY","ESTELA","VALARIE","BRIANNA","ROSALYN","EARLINE","CATALINA","AVA","MIA","CLARISSA","LIDIA","CORRINE","ALEXANDRIA","CONCEPCION","TIA","SHARRON","RAE","DONA","ERICKA","JAMI","ELNORA","CHANDRA","LENORE","NEVA","MARYLOU","MELISA","TABATHA","SERENA","AVIS","ALLIE","SOFIA","JEANIE","ODESSA","NANNIE","HARRIETT","LORAINE","PENELOPE","MILAGROS","EMILIA","BENITA","ALLYSON","ASHLEE","TANIA","TOMMIE","ESMERALDA","KARINA","EVE","PEARLIE","ZELMA","MALINDA","NOREEN","TAMEKA","SAUNDRA","HILLARY","AMIE","ALTHEA","ROSALINDA","JORDAN","LILIA","ALANA","GAY","CLARE","ALEJANDRA","ELINOR","MICHAEL","LORRIE","JERRI","DARCY","EARNESTINE","CARMELLA","TAYLOR","NOEMI","MARCIE","LIZA","ANNABELLE","LOUISA","EARLENE","MALLORY","CARLENE","NITA","SELENA","TANISHA","KATY","JULIANNE","JOHN","LAKISHA","EDWINA","MARICELA","MARGERY","KENYA","DOLLIE","ROXIE","ROSLYN","KATHRINE","NANETTE","CHARMAINE","LAVONNE","ILENE","KRIS","TAMMI","SUZETTE","CORINE","KAYE","JERRY","MERLE","CHRYSTAL","LINA","DEANNE","LILIAN","JULIANA","ALINE","LUANN","KASEY","MARYANNE","EVANGELINE","COLETTE","MELVA","LAWANDA","YESENIA","NADIA","MADGE","KATHIE","EDDIE","OPHELIA","VALERIA","NONA","MITZI","MARI","GEORGETTE","CLAUDINE","FRAN","ALISSA","ROSEANN","LAKEISHA","SUSANNA","REVA","DEIDRE","CHASITY","SHEREE","CARLY","JAMES","ELVIA","ALYCE","DEIRDRE","GENA","BRIANA","ARACELI","KATELYN","ROSANNE","WENDI","TESSA","BERTA","MARVA","IMELDA","MARIETTA","MARCI","LEONOR","ARLINE","SASHA","MADELYN","JANNA","JULIETTE","DEENA","AURELIA","JOSEFA","AUGUSTA","LILIANA","YOUNG","CHRISTIAN","LESSIE","AMALIA","SAVANNAH","ANASTASIA","VILMA","NATALIA","ROSELLA","LYNNETTE","CORINA","ALFREDA","LEANNA","CAREY","AMPARO","COLEEN","TAMRA","AISHA","WILDA","KARYN","CHERRY","QUEEN","MAURA","MAI","EVANGELINA","ROSANNA","HALLIE","ERNA","ENID","MARIANA","LACY","JULIET","JACKLYN","FREIDA","MADELEINE","MARA","HESTER","CATHRYN","LELIA","CASANDRA","BRIDGETT","ANGELITA","JANNIE","DIONNE","ANNMARIE","KATINA","BERYL","PHOEBE","MILLICENT","KATHERYN","DIANN","CARISSA","MARYELLEN","LIZ","LAURI","HELGA","GILDA","ADRIAN","RHEA","MARQUITA","HOLLIE","TISHA","TAMERA","ANGELIQUE","FRANCESCA","BRITNEY","KAITLIN","LOLITA","FLORINE","ROWENA","REYNA","TWILA","FANNY","JANELL","INES","CONCETTA","BERTIE","ALBA","BRIGITTE","ALYSON","VONDA","PANSY","ELBA","NOELLE","LETITIA","KITTY","DEANN","BRANDIE","LOUELLA","LETA","FELECIA","SHARLENE","LESA","BEVERLEY","ROBERT","ISABELLA","HERMINIA","TERRA","CELINA","TORI","OCTAVIA","JADE","DENICE","GERMAINE","SIERRA","MICHELL","CORTNEY","NELLY","DORETHA","SYDNEY","DEIDRA","MONIKA","LASHONDA","JUDI","CHELSEY","ANTIONETTE","MARGOT","BOBBY","ADELAIDE","NAN","LEEANN","ELISHA","DESSIE","LIBBY","KATHI","GAYLA","LATANYA","MINA","MELLISA","KIMBERLEE","JASMIN","RENAE","ZELDA","ELDA","MA","JUSTINA","GUSSIE","EMILIE","CAMILLA","ABBIE","ROCIO","KAITLYN","JESSE","EDYTHE","ASHLEIGH","SELINA","LAKESHA","GERI","ALLENE","PAMALA","MICHAELA","DAYNA","CARYN","ROSALIA","SUN","JACQULINE","REBECA","MARYBETH","KRYSTLE","IOLA","DOTTIE","BENNIE","BELLE","AUBREY","GRISELDA","ERNESTINA","ELIDA","ADRIANNE","DEMETRIA","DELMA","CHONG","JAQUELINE","DESTINY","ARLEEN","VIRGINA","RETHA","FATIMA","TILLIE","ELEANORE","CARI","TREVA","BIRDIE","WILHELMINA","ROSALEE","MAURINE","LATRICE","YONG","JENA","TARYN","ELIA","DEBBY","MAUDIE","JEANNA","DELILAH","CATRINA","SHONDA","HORTENCIA","THEODORA","TERESITA","ROBBIN","DANETTE","MARYJANE","FREDDIE","DELPHINE","BRIANNE","NILDA","DANNA","CINDI","BESS","IONA","HANNA","ARIEL","WINONA","VIDA","ROSITA","MARIANNA","WILLIAM","RACHEAL","GUILLERMINA","ELOISA","CELESTINE","CAREN","MALISSA","LONA","CHANTEL","SHELLIE","MARISELA","LEORA","AGATHA","SOLEDAD","MIGDALIA","IVETTE","CHRISTEN","ATHENA","JANEL","CHLOE","VEDA","PATTIE","TESSIE","TERA","MARILYNN","LUCRETIA","KARRIE","DINAH","DANIELA","ALECIA","ADELINA","VERNICE","SHIELA","PORTIA","MERRY","LASHAWN","DEVON","DARA","TAWANA","OMA","VERDA","CHRISTIN","ALENE","ZELLA","SANDI","RAFAELA","MAYA","KIRA","CANDIDA","ALVINA","SUZAN","SHAYLA","LYN","LETTIE","ALVA","SAMATHA","ORALIA","MATILDE","MADONNA","LARISSA","VESTA","RENITA","INDIA","DELOIS","SHANDA","PHILLIS","LORRI","ERLINDA","CRUZ","CATHRINE","BARB","ZOE","ISABELL","IONE","GISELA","CHARLIE","VALENCIA","ROXANNA","MAYME","KISHA","ELLIE","MELLISSA","DORRIS","DALIA","BELLA","ANNETTA","ZOILA","RETA","REINA","LAURETTA","KYLIE","CHRISTAL","PILAR","CHARLA","ELISSA","TIFFANI","TANA","PAULINA","LEOTA","BREANNA","JAYME","CARMEL","VERNELL","TOMASA","MANDI","DOMINGA","SANTA","MELODIE","LURA","ALEXA","TAMELA","RYAN","MIRNA","KERRIE","VENUS","NOEL","FELICITA","CRISTY","CARMELITA","BERNIECE","ANNEMARIE","TIARA","ROSEANNE","MISSY","CORI","ROXANA","PRICILLA","KRISTAL","JUNG","ELYSE","HAYDEE","ALETHA","BETTINA","MARGE","GILLIAN","FILOMENA","CHARLES","ZENAIDA","HARRIETTE","CARIDAD","VADA","UNA","ARETHA","PEARLINE","MARJORY","MARCELA","FLOR","EVETTE","ELOUISE","ALINA","TRINIDAD","DAVID","DAMARIS","CATHARINE","CARROLL","BELVA","NAKIA","MARLENA","LUANNE","LORINE","KARON","DORENE","DANITA","BRENNA","TATIANA","SAMMIE","LOUANN","LOREN","JULIANNA","ANDRIA","PHILOMENA","LUCILA","LEONORA","DOVIE","ROMONA","MIMI","JACQUELIN","GAYE","TONJA","MISTI","JOE","GENE","CHASTITY","STACIA","ROXANN","MICAELA","NIKITA","MEI","VELDA","MARLYS","JOHNNA","AURA","LAVERN","IVONNE","HAYLEY","NICKI","MAJORIE","HERLINDA","GEORGE","ALPHA","YADIRA","PERLA","GREGORIA","DANIEL","ANTONETTE","SHELLI","MOZELLE","MARIAH","JOELLE","CORDELIA","JOSETTE","CHIQUITA","TRISTA","LOUIS","LAQUITA","GEORGIANA","CANDI","SHANON","LONNIE","HILDEGARD","CECIL","VALENTINA","STEPHANY","MAGDA","KAROL","GERRY","GABRIELLA","TIANA","ROMA","RICHELLE","RAY","PRINCESS","OLETA","JACQUE","IDELLA","ALAINA","SUZANNA","JOVITA","BLAIR","TOSHA","RAVEN","NEREIDA","MARLYN","KYLA","JOSEPH","DELFINA","TENA","STEPHENIE","SABINA","NATHALIE","MARCELLE","GERTIE","DARLEEN","THEA","SHARONDA","SHANTEL","BELEN","VENESSA","ROSALINA","ONA","GENOVEVA","COREY","CLEMENTINE","ROSALBA","RENATE","RENATA","MI","IVORY","GEORGIANNA","FLOY","DORCAS","ARIANA","TYRA","THEDA","MARIAM","JULI","JESICA","DONNIE","VIKKI","VERLA","ROSELYN","MELVINA","JANNETTE","GINNY","DEBRAH","CORRIE","ASIA","VIOLETA","MYRTIS","LATRICIA","COLLETTE","CHARLEEN","ANISSA","VIVIANA","TWYLA","PRECIOUS","NEDRA","LATONIA","LAN","HELLEN","FABIOLA","ANNAMARIE","ADELL","SHARYN","CHANTAL","NIKI","MAUD","LIZETTE","LINDY","KIA","KESHA","JEANA","DANELLE","CHARLINE","CHANEL","CARROL","VALORIE","LIA","DORTHA","CRISTAL","SUNNY","LEONE","LEILANI","GERRI","DEBI","ANDRA","KESHIA","IMA","EULALIA","EASTER","DULCE","NATIVIDAD","LINNIE","KAMI","GEORGIE","CATINA","BROOK","ALDA","WINNIFRED","SHARLA","RUTHANN","MEAGHAN","MAGDALENE","LISSETTE","ADELAIDA","VENITA","TRENA","SHIRLENE","SHAMEKA","ELIZEBETH","DIAN","SHANTA","MICKEY","LATOSHA","CARLOTTA","WINDY","SOON","ROSINA","MARIANN","LEISA","JONNIE","DAWNA","CATHIE","BILLY","ASTRID","SIDNEY","LAUREEN","JANEEN","HOLLI","FAWN","VICKEY","TERESSA","SHANTE","RUBYE","MARCELINA","CHANDA","CARY","TERESE","SCARLETT","MARTY","MARNIE","LULU","LISETTE","JENIFFER","ELENOR","DORINDA","DONITA","CARMAN","BERNITA","ALTAGRACIA","ALETA","ADRIANNA","ZORAIDA","RONNIE","NICOLA","LYNDSEY","KENDALL","JANINA","CHRISSY","AMI","STARLA","PHYLIS","PHUONG","KYRA","CHARISSE","BLANCH","SANJUANITA","RONA","NANCI","MARILEE","MARANDA","CORY","BRIGETTE","SANJUANA","MARITA","KASSANDRA","JOYCELYN","IRA","FELIPA","CHELSIE","BONNY","MIREYA","LORENZA","KYONG","ILEANA","CANDELARIA","TONY","TOBY","SHERIE","OK","MARK","LUCIE","LEATRICE","LAKESHIA","GERDA","EDIE","BAMBI","MARYLIN","LAVON","HORTENSE","GARNET","EVIE","TRESSA","SHAYNA","LAVINA","KYUNG","JEANETTA","SHERRILL","SHARA","PHYLISS","MITTIE","ANABEL","ALESIA","THUY","TAWANDA","RICHARD","JOANIE","TIFFANIE","LASHANDA","KARISSA","ENRIQUETA","DARIA","DANIELLA","CORINNA","ALANNA","ABBEY","ROXANE","ROSEANNA","MAGNOLIA","LIDA","KYLE","JOELLEN","ERA","CORAL","CARLEEN","TRESA","PEGGIE","NOVELLA","NILA","MAYBELLE","JENELLE","CARINA","NOVA","MELINA","MARQUERITE","MARGARETTE","JOSEPHINA","EVONNE","DEVIN","CINTHIA","ALBINA","TOYA","TAWNYA","SHERITA","SANTOS","MYRIAM","LIZABETH","LISE","KEELY","JENNI","GISELLE","CHERYLE","ARDITH","ARDIS","ALESHA","ADRIANE","SHAINA","LINNEA","KAROLYN","HONG","FLORIDA","FELISHA","DORI","DARCI","ARTIE","ARMIDA","ZOLA","XIOMARA","VERGIE","SHAMIKA","NENA","NANNETTE","MAXIE","LOVIE","JEANE","JAIMIE","INGE","FARRAH","ELAINA","CAITLYN","STARR","FELICITAS","CHERLY","CARYL","YOLONDA","YASMIN","TEENA","PRUDENCE","PENNIE","NYDIA","MACKENZIE","ORPHA","MARVEL","LIZBETH","LAURETTE","JERRIE","HERMELINDA","CAROLEE","TIERRA","MIRIAN","META","MELONY","KORI","JENNETTE","JAMILA","ENA","ANH","YOSHIKO","SUSANNAH","SALINA","RHIANNON","JOLEEN","CRISTINE","ASHTON","ARACELY","TOMEKA","SHALONDA","MARTI","LACIE","KALA","JADA","ILSE","HAILEY","BRITTANI","ZONA","SYBLE","SHERRYL","RANDY","NIDIA","MARLO","KANDICE","KANDI","DEB","DEAN","AMERICA","ALYCIA","TOMMY","RONNA","NORENE","MERCY","JOSE","INGEBORG","GIOVANNA","GEMMA","CHRISTEL","AUDRY","ZORA","VITA","VAN","TRISH","STEPHAINE","SHIRLEE","SHANIKA","MELONIE","MAZIE","JAZMIN","INGA","HOA","HETTIE","GERALYN","FONDA","ESTRELLA","ADELLA","SU","SARITA","RINA","MILISSA","MARIBETH","GOLDA","EVON","ETHELYN","ENEDINA","CHERISE","CHANA","VELVA","TAWANNA","SADE","MIRTA","LI","KARIE","JACINTA","ELNA","DAVINA","CIERRA","ASHLIE","ALBERTHA","TANESHA","STEPHANI","NELLE","MINDI","LU","LORINDA","LARUE","FLORENE","DEMETRA","DEDRA","CIARA","CHANTELLE","ASHLY","SUZY","ROSALVA","NOELIA","LYDA","LEATHA","KRYSTYNA","KRISTAN","KARRI","DARLINE","DARCIE","CINDA","CHEYENNE","CHERRIE","AWILDA","ALMEDA","ROLANDA","LANETTE","JERILYN","GISELE","EVALYN","CYNDI","CLETA","CARIN","ZINA","ZENA","VELIA","TANIKA","PAUL","CHARISSA","THOMAS","TALIA","MARGARETE","LAVONDA","KAYLEE","KATHLENE","JONNA","IRENA","ILONA","IDALIA","CANDIS","CANDANCE","BRANDEE","ANITRA","ALIDA","SIGRID","NICOLETTE","MARYJO","LINETTE","HEDWIG","CHRISTIANA","CASSIDY","ALEXIA","TRESSIE","MODESTA","LUPITA","LITA","GLADIS","EVELIA","DAVIDA","CHERRI","CECILY","ASHELY","ANNABEL","AGUSTINA","WANITA","SHIRLY","ROSAURA","HULDA","EUN","BAILEY","YETTA","VERONA","THOMASINA","SIBYL","SHANNAN","MECHELLE","LUE","LEANDRA","LANI","KYLEE","KANDY","JOLYNN","FERNE","EBONI","CORENE","ALYSIA","ZULA","NADA","MOIRA","LYNDSAY","LORRETTA","JUAN","JAMMIE","HORTENSIA","GAYNELL","CAMERON","ADRIA","VINA","VICENTA","TANGELA","STEPHINE","NORINE","NELLA","LIANA","LESLEE","KIMBERELY","ILIANA","GLORY","FELICA","EMOGENE","ELFRIEDE","EDEN","EARTHA","CARMA","BEA","OCIE","MARRY","LENNIE","KIARA","JACALYN","CARLOTA","ARIELLE","YU","STAR","OTILIA","KIRSTIN","KACEY","JOHNETTA","JOEY","JOETTA","JERALDINE","JAUNITA","ELANA","DORTHEA","CAMI","AMADA","ADELIA","VERNITA","TAMAR","SIOBHAN","RENEA","RASHIDA","OUIDA","ODELL","NILSA","MERYL","KRISTYN","JULIETA","DANICA","BREANNE","AUREA","ANGLEA","SHERRON","ODETTE","MALIA","LORELEI","LIN","LEESA","KENNA","KATHLYN","FIONA","CHARLETTE","SUZIE","SHANTELL","SABRA","RACQUEL","MYONG","MIRA","MARTINE","LUCIENNE","LAVADA","JULIANN","JOHNIE","ELVERA","DELPHIA","CLAIR","CHRISTIANE","CHAROLETTE","CARRI","AUGUSTINE","ASHA","ANGELLA","PAOLA","NINFA","LEDA","LAI","EDA","SUNSHINE","STEFANI","SHANELL","PALMA","MACHELLE","LISSA","KECIA","KATHRYNE","KARLENE","JULISSA","JETTIE","JENNIFFER","HUI","CORRINA","CHRISTOPHER","CAROLANN","ALENA","TESS","ROSARIA","MYRTICE","MARYLEE","LIANE","KENYATTA","JUDIE","JANEY","IN","ELMIRA","ELDORA","DENNA","CRISTI","CATHI","ZAIDA","VONNIE","VIVA","VERNIE","ROSALINE","MARIELA","LUCIANA","LESLI","KARAN","FELICE","DENEEN","ADINA","WYNONA","TARSHA","SHERON","SHASTA","SHANITA","SHANI","SHANDRA","RANDA","PINKIE","PARIS","NELIDA","MARILOU","LYLA","LAURENE","LACI","JOI","JANENE","DOROTHA","DANIELE","DANI","CAROLYNN","CARLYN","BERENICE","AYESHA","ANNELIESE","ALETHEA","THERSA","TAMIKO","RUFINA","OLIVA","MOZELL","MARYLYN","MADISON","KRISTIAN","KATHYRN","KASANDRA","KANDACE","JANAE","GABRIEL","DOMENICA","DEBBRA","DANNIELLE","CHUN","BUFFY","BARBIE","ARCELIA","AJA","ZENOBIA","SHAREN","SHAREE","PATRICK","PAGE","MY","LAVINIA","KUM","KACIE","JACKELINE","HUONG","FELISA","EMELIA","ELEANORA","CYTHIA","CRISTIN","CLYDE","CLARIBEL","CARON","ANASTACIA","ZULMA","ZANDRA","YOKO","TENISHA","SUSANN","SHERILYN","SHAY","SHAWANDA","SABINE","ROMANA","MATHILDA","LINSEY","KEIKO","JOANA","ISELA","GRETTA","GEORGETTA","EUGENIE","DUSTY","DESIRAE","DELORA","CORAZON","ANTONINA","ANIKA","WILLENE","TRACEE","TAMATHA","REGAN","NICHELLE","MICKIE","MAEGAN","LUANA","LANITA","KELSIE","EDELMIRA","BREE","AFTON","TEODORA","TAMIE","SHENA","MEG","LINH","KELI","KACI","DANYELLE","BRITT","ARLETTE","ALBERTINE","ADELLE","TIFFINY","STORMY","SIMONA","NUMBERS","NICOLASA","NICHOL","NIA","NAKISHA","MEE","MAIRA","LOREEN","KIZZY","JOHNNY","JAY","FALLON","CHRISTENE","BOBBYE","ANTHONY","YING","VINCENZA","TANJA","RUBIE","RONI","QUEENIE","MARGARETT","KIMBERLI","IRMGARD","IDELL","HILMA","EVELINA","ESTA","EMILEE","DENNISE","DANIA","CARL","CARIE","ANTONIO","WAI","SANG","RISA","RIKKI","PARTICIA","MUI","MASAKO","MARIO","LUVENIA","LOREE","LONI","LIEN","KEVIN","GIGI","FLORENCIA","DORIAN","DENITA","DALLAS","CHI","BILLYE","ALEXANDER","TOMIKA","SHARITA","RANA","NIKOLE","NEOMA","MARGARITE","MADALYN","LUCINA","LAILA","KALI","JENETTE","GABRIELE","EVELYNE","ELENORA","CLEMENTINA","ALEJANDRINA","ZULEMA","VIOLETTE","VANNESSA","THRESA","RETTA","PIA","PATIENCE","NOELLA","NICKIE","JONELL","DELTA","CHUNG","CHAYA","CAMELIA","BETHEL","ANYA","ANDREW","THANH","SUZANN","SPRING","SHU","MILA","LILLA","LAVERNA","KEESHA","KATTIE","GIA","GEORGENE","EVELINE","ESTELL","ELIZBETH","VIVIENNE","VALLIE","TRUDIE","STEPHANE","MICHEL","MAGALY","MADIE","KENYETTA","KARREN","JANETTA","HERMINE","HARMONY","DRUCILLA","DEBBI","CELESTINA","CANDIE","BRITNI","BECKIE","AMINA","ZITA","YUN","YOLANDE","VIVIEN","VERNETTA","TRUDI","SOMMER","PEARLE","PATRINA","OSSIE","NICOLLE","LOYCE","LETTY","LARISA","KATHARINA","JOSELYN","JONELLE","JENELL","IESHA","HEIDE","FLORINDA","FLORENTINA","FLO","ELODIA","DORINE","BRUNILDA","BRIGID","ASHLI","ARDELLA","TWANA","THU","TARAH","SUNG","SHEA","SHAVON","SHANE","SERINA","RAYNA","RAMONITA","NGA","MARGURITE","LUCRECIA","KOURTNEY","KATI","JESUS","JESENIA","DIAMOND","CRISTA","AYANA","ALICA","ALIA","VINNIE","SUELLEN","ROMELIA","RACHELL","PIPER","OLYMPIA","MICHIKO","KATHALEEN","JOLIE","JESSI","JANESSA","HANA","HA","ELEASE","CARLETTA","BRITANY","SHONA","SALOME","ROSAMOND","REGENA","RAINA","NGOC","NELIA","LOUVENIA","LESIA","LATRINA","LATICIA","LARHONDA","JINA","JACKI","HOLLIS","HOLLEY","EMMY","DEEANN","CORETTA","ARNETTA","VELVET","THALIA","SHANICE","NETA","MIKKI","MICKI","LONNA","LEANA","LASHUNDA","KILEY","JOYE","JACQULYN","IGNACIA","HYUN","HIROKO","HENRY","HENRIETTE","ELAYNE","DELINDA","DARNELL","DAHLIA","COREEN","CONSUELA","CONCHITA","CELINE","BABETTE","AYANNA","ANETTE","ALBERTINA","SKYE","SHAWNEE","SHANEKA","QUIANA","PAMELIA","MIN","MERRI","MERLENE","MARGIT","KIESHA","KIERA","KAYLENE","JODEE","JENISE","ERLENE","EMMIE","ELSE","DARYL","DALILA","DAISEY","CODY","CASIE","BELIA","BABARA","VERSIE","VANESA","SHELBA","SHAWNDA","SAM","NORMAN","NIKIA","NAOMA","MARNA","MARGERET","MADALINE","LAWANA","KINDRA","JUTTA","JAZMINE","JANETT","HANNELORE","GLENDORA","GERTRUD","GARNETT","FREEDA","FREDERICA","FLORANCE","FLAVIA","DENNIS","CARLINE","BEVERLEE","ANJANETTE","VALDA","TRINITY","TAMALA","STEVIE","SHONNA","SHA","SARINA","ONEIDA","MICAH","MERILYN","MARLEEN","LURLINE","LENNA","KATHERIN","JIN","JENI","HAE","GRACIA","GLADY","FARAH","ERIC","ENOLA","EMA","DOMINQUE","DEVONA","DELANA","CECILA","CAPRICE","ALYSHA","ALI","ALETHIA","VENA","THERESIA","TAWNY","SONG","SHAKIRA","SAMARA","SACHIKO","RACHELE","PAMELLA","NICKY","MARNI","MARIEL","MAREN","MALISA","LIGIA","LERA","LATORIA","LARAE","KIMBER","KATHERN","KAREY","JENNEFER","JANETH","HALINA","FREDIA","DELISA","DEBROAH","CIERA","CHIN","ANGELIKA","ANDREE","ALTHA","YEN","VIVAN","TERRESA","TANNA","SUK","SUDIE","SOO","SIGNE","SALENA","RONNI","REBBECCA","MYRTIE","MCKENZIE","MALIKA","MAIDA","LOAN","LEONARDA","KAYLEIGH","FRANCE","ETHYL","ELLYN","DAYLE","CAMMIE","BRITTNI","BIRGIT","AVELINA","ASUNCION","ARIANNA","AKIKO","VENICE","TYESHA","TONIE","TIESHA","TAKISHA","STEFFANIE","SINDY","SANTANA","MEGHANN","MANDA","MACIE","LADY","KELLYE","KELLEE","JOSLYN","JASON","INGER","INDIRA","GLINDA","GLENNIS","FERNANDA","FAUSTINA","ENEIDA","ELICIA","DOT","DIGNA","DELL","ARLETTA","ANDRE","WILLIA","TAMMARA","TABETHA","SHERRELL","SARI","REFUGIO","REBBECA","PAULETTA","NIEVES","NATOSHA","NAKITA","MAMMIE","KENISHA","KAZUKO","KASSIE","GARY","EARLEAN","DAPHINE","CORLISS","CLOTILDE","CAROLYNE","BERNETTA","AUGUSTINA","AUDREA","ANNIS","ANNABELL","YAN","TENNILLE","TAMICA","SELENE","SEAN","ROSANA","REGENIA","QIANA","MARKITA","MACY","LEEANNE","LAURINE","KYM","JESSENIA","JANITA","GEORGINE","GENIE","EMIKO","ELVIE","DEANDRA","DAGMAR","CORIE","COLLEN","CHERISH","ROMAINE","PORSHA","PEARLENE","MICHELINE","MERNA","MARGORIE","MARGARETTA","LORE","KENNETH","JENINE","HERMINA","FREDERICKA","ELKE","DRUSILLA","DORATHY","DIONE","DESIRE","CELENA","BRIGIDA","ANGELES","ALLEGRA","THEO","TAMEKIA","SYNTHIA","STEPHEN","SOOK","SLYVIA","ROSANN","REATHA","RAYE","MARQUETTA","MARGART","LING","LAYLA","KYMBERLY","KIANA","KAYLEEN","KATLYN","KARMEN","JOELLA","IRINA","EMELDA","ELENI","DETRA","CLEMMIE","CHERYLL","CHANTELL","CATHEY","ARNITA","ARLA","ANGLE","ANGELIC","ALYSE","ZOFIA","THOMASINE","TENNIE","SON","SHERLY","SHERLEY","SHARYL","REMEDIOS","PETRINA","NICKOLE","MYUNG","MYRLE","MOZELLA","LOUANNE","LISHA","LATIA","LANE","KRYSTA","JULIENNE","JOEL","JEANENE","JACQUALINE","ISAURA","GWENDA","EARLEEN","DONALD","CLEOPATRA","CARLIE","AUDIE","ANTONIETTA","ALISE","ALEX","VERDELL","VAL","TYLER","TOMOKO","THAO","TALISHA","STEVEN","SO","SHEMIKA","SHAUN","SCARLET","SAVANNA","SANTINA","ROSIA","RAEANN","ODILIA","NANA","MINNA","MAGAN","LYNELLE","LE","KARMA","JOEANN","IVANA","INELL","ILANA","HYE","HONEY","HEE","GUDRUN","FRANK","DREAMA","CRISSY","CHANTE","CARMELINA","ARVILLA","ARTHUR","ANNAMAE","ALVERA","ALEIDA","AARON","YEE","YANIRA","VANDA","TIANNA","TAM","STEFANIA","SHIRA","PERRY","NICOL","NANCIE","MONSERRATE","MINH","MELYNDA","MELANY","MATTHEW","LOVELLA","LAURE","KIRBY","KACY","JACQUELYNN","HYON","GERTHA","FRANCISCO","ELIANA","CHRISTENA","CHRISTEEN","CHARISE","CATERINA","CARLEY","CANDYCE","ARLENA","AMMIE","YANG","WILLETTE","VANITA","TUYET","TINY","SYREETA","SILVA","SCOTT","RONALD","PENNEY","NYLA","MICHAL","MAURICE","MARYAM","MARYA","MAGEN","LUDIE","LOMA","LIVIA","LANELL","KIMBERLIE","JULEE","DONETTA","DIEDRA","DENISHA","DEANE","DAWNE","CLARINE","CHERRYL","BRONWYN","BRANDON","ALLA","VALERY","TONDA","SUEANN","SORAYA","SHOSHANA","SHELA","SHARLEEN","SHANELLE","NERISSA","MICHEAL","MERIDITH","MELLIE","MAYE","MAPLE","MAGARET","LUIS","LILI","LEONILA","LEONIE","LEEANNA","LAVONIA","LAVERA","KRISTEL","KATHEY","KATHE","JUSTIN","JULIAN","JIMMY","JANN","ILDA","HILDRED","HILDEGARDE","GENIA","FUMIKO","EVELIN","ERMELINDA","ELLY","DUNG","DOLORIS","DIONNA","DANAE","BERNEICE","ANNICE","ALIX","VERENA","VERDIE","TRISTAN","SHAWNNA","SHAWANA","SHAUNNA","ROZELLA","RANDEE","RANAE","MILAGRO","LYNELL","LUISE","LOUIE","LOIDA","LISBETH","KARLEEN","JUNITA","JONA","ISIS","HYACINTH","HEDY","GWENN","ETHELENE","ERLINE","EDWARD","DONYA","DOMONIQUE","DELICIA","DANNETTE","CICELY","BRANDA","BLYTHE","BETHANN","ASHLYN","ANNALEE","ALLINE","YUKO","VELLA","TRANG","TOWANDA","TESHA","SHERLYN","NARCISA","MIGUELINA","MERI","MAYBELL","MARLANA","MARGUERITA","MADLYN","LUNA","LORY","LORIANN","LIBERTY","LEONORE","LEIGHANN","LAURICE","LATESHA","LARONDA","KATRICE","KASIE","KARL","KALEY","JADWIGA","GLENNIE","GEARLDINE","FRANCINA","EPIFANIA","DYAN","DORIE","DIEDRE","DENESE","DEMETRICE","DELENA","DARBY","CRISTIE","CLEORA","CATARINA","CARISA","BERNIE","BARBERA","ALMETA","TRULA","TEREASA","SOLANGE","SHEILAH","SHAVONNE","SANORA","ROCHELL","MATHILDE","MARGARETA","MAIA","LYNSEY","LAWANNA","LAUNA","KENA","KEENA","KATIA","JAMEY","GLYNDA","GAYLENE","ELVINA","ELANOR","DANUTA","DANIKA","CRISTEN","CORDIE","COLETTA","CLARITA","CARMON","BRYNN","AZUCENA","AUNDREA","ANGELE","YI","WALTER","VERLIE","VERLENE","TAMESHA","SILVANA","SEBRINA","SAMIRA","REDA","RAYLENE","PENNI","PANDORA","NORAH","NOMA","MIREILLE","MELISSIA","MARYALICE","LARAINE","KIMBERY","KARYL","KARINE","KAM","JOLANDA","JOHANA","JESUSA","JALEESA","JAE","JACQUELYNE","IRISH","ILUMINADA","HILARIA","HANH","GENNIE","FRANCIE","FLORETTA","EXIE","EDDA","DREMA","DELPHA","BEV","BARBAR","ASSUNTA","ARDELL","ANNALISA","ALISIA","YUKIKO","YOLANDO","WONDA","WEI","WALTRAUD","VETA","TEQUILA","TEMEKA","TAMEIKA","SHIRLEEN","SHENITA","PIEDAD","OZELLA","MIRTHA","MARILU","KIMIKO","JULIANE","JENICE","JEN","JANAY","JACQUILINE","HILDE","FE","FAE","EVAN","EUGENE","ELOIS","ECHO","DEVORAH","CHAU","BRINDA","BETSEY","ARMINDA","ARACELIS","APRYL","ANNETT","ALISHIA","VEOLA","USHA","TOSHIKO","THEOLA","TASHIA","TALITHA","SHERY","RUDY","RENETTA","REIKO","RASHEEDA","OMEGA","OBDULIA","MIKA","MELAINE","MEGGAN","MARTIN","MARLEN","MARGET","MARCELINE","MANA","MAGDALEN","LIBRADA","LEZLIE","LEXIE","LATASHIA","LASANDRA","KELLE","ISIDRA","ISA","INOCENCIA","GWYN","FRANCOISE","ERMINIA","ERINN","DIMPLE","DEVORA","CRISELDA","ARMANDA","ARIE","ARIANE","ANGELO","ANGELENA","ALLEN","ALIZA","ADRIENE","ADALINE","XOCHITL","TWANNA","TRAN","TOMIKO","TAMISHA","TAISHA","SUSY","SIU","RUTHA","ROXY","RHONA","RAYMOND","OTHA","NORIKO","NATASHIA","MERRIE","MELVIN","MARINDA","MARIKO","MARGERT","LORIS","LIZZETTE","LEISHA","KAILA","KA","JOANNIE","JERRICA","JENE","JANNET","JANEE","JACINDA","HERTA","ELENORE","DORETTA","DELAINE","DANIELL","CLAUDIE","CHINA","BRITTA","APOLONIA","AMBERLY","ALEASE","YURI","YUK","WEN","WANETA","UTE","TOMI","SHARRI","SANDIE","ROSELLE","REYNALDA","RAGUEL","PHYLICIA","PATRIA","OLIMPIA","ODELIA","MITZIE","MITCHELL","MISS","MINDA","MIGNON","MICA","MENDY","MARIVEL","MAILE","LYNETTA","LAVETTE","LAURYN","LATRISHA","LAKIESHA","KIERSTEN","KARY","JOSPHINE","JOLYN","JETTA","JANISE","JACQUIE","IVELISSE","GLYNIS","GIANNA","GAYNELLE","EMERALD","DEMETRIUS","DANYELL","DANILLE","DACIA","CORALEE","CHER","CEOLA","BRETT","BELL","ARIANNE","ALESHIA","YUNG","WILLIEMAE","TROY","TRINH","THORA","TAI","SVETLANA","SHERIKA","SHEMEKA","SHAUNDA","ROSELINE","RICKI","MELDA","MALLIE","LAVONNA","LATINA","LARRY","LAQUANDA","LALA","LACHELLE","KLARA","KANDIS","JOHNA","JEANMARIE","JAYE","HANG","GRAYCE","GERTUDE","EMERITA","EBONIE","CLORINDA","CHING","CHERY","CAROLA","BREANN","BLOSSOM","BERNARDINE","BECKI","ARLETHA","ARGELIA","ARA","ALITA","YULANDA","YON","YESSENIA","TOBI","TASIA","SYLVIE","SHIRL","SHIRELY","SHERIDAN","SHELLA","SHANTELLE","SACHA","ROYCE","REBECKA","REAGAN","PROVIDENCIA","PAULENE","MISHA","MIKI","MARLINE","MARICA","LORITA","LATOYIA","LASONYA","KERSTIN","KENDA","KEITHA","KATHRIN","JAYMIE","JACK","GRICELDA","GINETTE","ERYN","ELINA","ELFRIEDA","DANYEL","CHEREE","CHANELLE","BARRIE","AVERY","AURORE","ANNAMARIA","ALLEEN","AILENE","AIDE","YASMINE","VASHTI","VALENTINE","TREASA","TORY","TIFFANEY","SHERYLL","SHARIE","SHANAE","SAU","RAISA","PA","NEDA","MITSUKO","MIRELLA","MILDA","MARYANNA","MARAGRET","MABELLE","LUETTA","LORINA","LETISHA","LATARSHA","LANELLE","LAJUANA","KRISSY","KARLY","KARENA","JON","JESSIKA","JERICA","JEANELLE","JANUARY","JALISA","JACELYN","IZOLA","IVEY","GREGORY","EUNA","ETHA","DREW","DOMITILA","DOMINICA","DAINA","CREOLA","CARLI","CAMIE","BUNNY","BRITTNY","ASHANTI","ANISHA","ALEEN","ADAH","YASUKO","WINTER","VIKI","VALRIE","TONA","TINISHA","THI","TERISA","TATUM","TANEKA","SIMONNE","SHALANDA","SERITA","RESSIE","REFUGIA","PAZ","OLENE","NA","MERRILL","MARGHERITA","MANDIE","MAN","MAIRE","LYNDIA","LUCI","LORRIANE","LORETA","LEONIA","LAVONA","LASHAWNDA","LAKIA","KYOKO","KRYSTINA","KRYSTEN","KENIA","KELSI","JUDE","JEANICE","ISOBEL","GEORGIANN","GENNY","FELICIDAD","EILENE","DEON","DELOISE","DEEDEE","DANNIE","CONCEPTION","CLORA","CHERILYN","CHANG","CALANDRA","BERRY","ARMANDINA","ANISA","ULA","TIMOTHY","TIERA","THERESSA","STEPHANIA","SIMA","SHYLA","SHONTA","SHERA","SHAQUITA","SHALA","SAMMY","ROSSANA","NOHEMI","NERY","MORIAH","MELITA","MELIDA","MELANI","MARYLYNN","MARISHA","MARIETTE","MALORIE","MADELENE","LUDIVINA","LORIA","LORETTE","LORALEE","LIANNE","LEON","LAVENIA","LAURINDA","LASHON","KIT","KIMI","KEILA","KATELYNN","KAI","JONE","JOANE","JI","JAYNA","JANELLA","JA","HUE","HERTHA","FRANCENE","ELINORE","DESPINA","DELSIE","DEEDRA","CLEMENCIA","CARRY","CAROLIN","CARLOS","BULAH","BRITTANIE","BOK","BLONDELL","BIBI","BEAULAH","BEATA","ANNITA","AGRIPINA","VIRGEN","VALENE","UN","TWANDA","TOMMYE","TOI","TARRA","TARI","TAMMERA","SHAKIA","SADYE","RUTHANNE","ROCHEL","RIVKA","PURA","NENITA","NATISHA","MING","MERRILEE","MELODEE","MARVIS","LUCILLA","LEENA","LAVETA","LARITA","LANIE","KEREN","ILEEN","GEORGEANN","GENNA","GENESIS","FRIDA","EWA","EUFEMIA","EMELY","ELA","EDYTH","DEONNA","DEADRA","DARLENA","CHANELL","CHAN","CATHERN","CASSONDRA","CASSAUNDRA","BERNARDA","BERNA","ARLINDA","ANAMARIA","ALBERT","WESLEY","VERTIE","VALERI","TORRI","TATYANA","STASIA","SHERISE","SHERILL","SEASON","SCOTTIE","SANDA","RUTHE","ROSY","ROBERTO","ROBBI","RANEE","QUYEN","PEARLY","PALMIRA","ONITA","NISHA","NIESHA","NIDA","NEVADA","NAM","MERLYN","MAYOLA","MARYLOUISE","MARYLAND","MARX","MARTH","MARGENE","MADELAINE","LONDA","LEONTINE","LEOMA","LEIA","LAWRENCE","LAURALEE","LANORA","LAKITA","KIYOKO","KETURAH","KATELIN","KAREEN","JONIE","JOHNETTE","JENEE","JEANETT","IZETTA","HIEDI","HEIKE","HASSIE","HAROLD","GIUSEPPINA","GEORGANN","FIDELA","FERNANDE","ELWANDA","ELLAMAE","ELIZ","DUSTI","DOTTY","CYNDY","CORALIE","CELESTA","ARGENTINA","ALVERTA","XENIA","WAVA","VANETTA","TORRIE","TASHINA","TANDY","TAMBRA","TAMA","STEPANIE","SHILA","SHAUNTA","SHARAN","SHANIQUA","SHAE","SETSUKO","SERAFINA","SANDEE","ROSAMARIA","PRISCILA","OLINDA","NADENE","MUOI","MICHELINA","MERCEDEZ","MARYROSE","MARIN","MARCENE","MAO","MAGALI","MAFALDA","LOGAN","LINN","LANNIE","KAYCE","KAROLINE","KAMILAH","KAMALA","JUSTA","JOLINE","JENNINE","JACQUETTA","IRAIDA","GERALD","GEORGEANNA","FRANCHESCA","FAIRY","EMELINE","ELANE","EHTEL","EARLIE","DULCIE","DALENE","CRIS","CLASSIE","CHERE","CHARIS","CAROYLN","CARMINA","CARITA","BRIAN","BETHANIE","AYAKO","ARICA","AN","ALYSA","ALESSANDRA","AKILAH","ADRIEN","ZETTA","YOULANDA","YELENA","YAHAIRA","XUAN","WENDOLYN","VICTOR","TIJUANA","TERRELL","TERINA","TERESIA","SUZI","SUNDAY","SHERELL","SHAVONDA","SHAUNTE","SHARDA","SHAKITA","SENA","RYANN","RUBI","RIVA","REGINIA","REA","RACHAL","PARTHENIA","PAMULA","MONNIE","MONET","MICHAELE","MELIA","MARINE","MALKA","MAISHA","LISANDRA","LEO","LEKISHA","LEAN","LAURENCE","LAKENDRA","KRYSTIN","KORTNEY","KIZZIE","KITTIE","KERA","KENDAL","KEMBERLY","KANISHA","JULENE","JULE","JOSHUA","JOHANNE","JEFFREY","JAMEE","HAN","HALLEY","GIDGET","GALINA","FREDRICKA","FLETA","FATIMAH","EUSEBIA","ELZA","ELEONORE","DORTHEY","DORIA","DONELLA","DINORAH","DELORSE","CLARETHA","CHRISTINIA","CHARLYN","BONG","BELKIS","AZZIE","ANDERA","AIKO","ADENA","YER","YAJAIRA","WAN","VANIA","ULRIKE","TOSHIA","TIFANY","STEFANY","SHIZUE","SHENIKA","SHAWANNA","SHAROLYN","SHARILYN","SHAQUANA","SHANTAY","SEE","ROZANNE","ROSELEE","RICKIE","REMONA","REANNA","RAELENE","QUINN","PHUNG","PETRONILA","NATACHA","NANCEY","MYRL","MIYOKO","MIESHA","MERIDETH","MARVELLA","MARQUITTA","MARHTA","MARCHELLE","LIZETH","LIBBIE","LAHOMA","LADAWN","KINA","KATHELEEN","KATHARYN","KARISA","KALEIGH","JUNIE","JULIEANN","JOHNSIE","JANEAN","JAIMEE","JACKQUELINE","HISAKO","HERMA","HELAINE","GWYNETH","GLENN","GITA","EUSTOLIA","EMELINA","ELIN","EDRIS","DONNETTE","DONNETTA","DIERDRE","DENAE","DARCEL","CLAUDE","CLARISA","CINDERELLA","CHIA","CHARLESETTA","CHARITA","CELSA","CASSY","CASSI","CARLEE","BRUNA","BRITTANEY","BRANDE","BILLI","BAO","ANTONETTA","ANGLA","ANGELYN","ANALISA","ALANE","WENONA","WENDIE","VERONIQUE","VANNESA","TOBIE","TEMPIE","SUMIKO","SULEMA","SPARKLE","SOMER","SHEBA","SHAYNE","SHARICE","SHANEL","SHALON","SAGE","ROY","ROSIO","ROSELIA","RENAY","REMA","REENA","PORSCHE","PING","PEG","OZIE","ORETHA","ORALEE","ODA","NU","NGAN","NAKESHA","MILLY","MARYBELLE","MARLIN","MARIS","MARGRETT","MARAGARET","MANIE","LURLENE","LILLIA","LIESELOTTE","LAVELLE","LASHAUNDA","LAKEESHA","KEITH","KAYCEE","KALYN","JOYA","JOETTE","JENAE","JANIECE","ILLA","GRISEL","GLAYDS","GENEVIE","GALA","FREDDA","FRED","ELMER","ELEONOR","DEBERA","DEANDREA","DAN","CORRINNE","CORDIA","CONTESSA","COLENE","CLEOTILDE","CHARLOTT","CHANTAY","CECILLE","BEATRIS","AZALEE","ARLEAN","ARDATH","ANJELICA","ANJA","ALFREDIA","ALEISHA","ADAM","ZADA","YUONNE","XIAO","WILLODEAN","WHITLEY","VENNIE","VANNA","TYISHA","TOVA","TORIE","TONISHA","TILDA","TIEN","TEMPLE","SIRENA","SHERRIL","SHANTI","SHAN","SENAIDA","SAMELLA","ROBBYN","RENDA","REITA","PHEBE","PAULITA","NOBUKO","NGUYET","NEOMI","MOON","MIKAELA","MELANIA","MAXIMINA","MARG","MAISIE","LYNNA","LILLI","LAYNE","LASHAUN","LAKENYA","LAEL","KIRSTIE","KATHLINE","KASHA","KARLYN","KARIMA","JOVAN","JOSEFINE","JENNELL","JACQUI","JACKELYN","HYO","HIEN","GRAZYNA","FLORRIE","FLORIA","ELEONORA","DWANA","DORLA","DONG","DELMY","DEJA","DEDE","DANN","CRYSTA","CLELIA","CLARIS","CLARENCE","CHIEKO","CHERLYN","CHERELLE","CHARMAIN","CHARA","CAMMY","BEE","ARNETTE","ARDELLE","ANNIKA","AMIEE","AMEE","ALLENA","YVONE","YUKI","YOSHIE","YEVETTE","YAEL","WILLETTA","VONCILE","VENETTA","TULA","TONETTE","TIMIKA","TEMIKA","TELMA","TEISHA","TAREN","TA","STACEE","SHIN","SHAWNTA","SATURNINA","RICARDA","POK","PASTY","ONIE","NUBIA","MORA","MIKE","MARIELLE","MARIELLA","MARIANELA","MARDELL","MANY","LUANNA","LOISE","LISABETH","LINDSY","LILLIANA","LILLIAM","LELAH","LEIGHA","LEANORA","LANG","KRISTEEN","KHALILAH","KEELEY","KANDRA","JUNKO","JOAQUINA","JERLENE","JANI","JAMIKA","JAME","HSIU","HERMILA","GOLDEN","GENEVIVE","EVIA","EUGENA","EMMALINE","ELFREDA","ELENE","DONETTE","DELCIE","DEEANNA","DARCEY","CUC","CLARINDA","CIRA","CHAE","CELINDA","CATHERYN","CATHERIN","CASIMIRA","CARMELIA","CAMELLIA","BREANA","BOBETTE","BERNARDINA","BEBE","BASILIA","ARLYNE","AMAL","ALAYNA","ZONIA","ZENIA","YURIKO","YAEKO","WYNELL","WILLOW","WILLENA","VERNIA","TU","TRAVIS","TORA","TERRILYN","TERICA","TENESHA","TAWNA","TAJUANA","TAINA","STEPHNIE","SONA","SOL","SINA","SHONDRA","SHIZUKO","SHERLENE","SHERICE","SHARIKA","ROSSIE","ROSENA","RORY","RIMA","RIA","RHEBA","RENNA","PETER","NATALYA","NANCEE","MELODI","MEDA","MAXIMA","MATHA","MARKETTA","MARICRUZ","MARCELENE","MALVINA","LUBA","LOUETTA","LEIDA","LECIA","LAURAN","LASHAWNA","LAINE","KHADIJAH","KATERINE","KASI","KALLIE","JULIETTA","JESUSITA","JESTINE","JESSIA","JEREMY","JEFFIE","JANYCE","ISADORA","GEORGIANNE","FIDELIA","EVITA","EURA","EULAH","ESTEFANA","ELSY","ELIZABET","ELADIA","DODIE","DION","DIA","DENISSE","DELORAS","DELILA","DAYSI","DAKOTA","CURTIS","CRYSTLE","CONCHA","COLBY","CLARETTA","CHU","CHRISTIA","CHARLSIE","CHARLENA","CARYLON","BETTYANN","ASLEY","ASHLEA","AMIRA","AI","AGUEDA","AGNUS","YUETTE","VINITA","VICTORINA","TYNISHA","TREENA","TOCCARA","TISH","THOMASENA","TEGAN","SOILA","SHILOH","SHENNA","SHARMAINE","SHANTAE","SHANDI","SEPTEMBER","SARAN","SARAI","SANA","SAMUEL","SALLEY","ROSETTE","ROLANDE","REGINE","OTELIA","OSCAR","OLEVIA","NICHOLLE","NECOLE","NAIDA","MYRTA","MYESHA","MITSUE","MINTA","MERTIE","MARGY","MAHALIA","MADALENE","LOVE","LOURA","LOREAN","LEWIS","LESHA","LEONIDA","LENITA","LAVONE","LASHELL","LASHANDRA","LAMONICA","KIMBRA","KATHERINA","KARRY","KANESHA","JULIO","JONG","JENEVA","JAQUELYN","HWA","GILMA","GHISLAINE","GERTRUDIS","FRANSISCA","FERMINA","ETTIE","ETSUKO","ELLIS","ELLAN","ELIDIA","EDRA","DORETHEA","DOREATHA","DENYSE","DENNY","DEETTA","DAINE","CYRSTAL","CORRIN","CAYLA","CARLITA","CAMILA","BURMA","BULA","BUENA","BLAKE","BARABARA","AVRIL","AUSTIN","ALAINE","ZANA","WILHEMINA","WANETTA","VIRGIL","VI","VERONIKA","VERNON","VERLINE","VASILIKI","TONITA","TISA","TEOFILA","TAYNA","TAUNYA","TANDRA","TAKAKO","SUNNI","SUANNE","SIXTA","SHARELL","SEEMA","RUSSELL","ROSENDA","ROBENA","RAYMONDE","PEI","PAMILA","OZELL","NEIDA","NEELY","MISTIE","MICHA","MERISSA","MAURITA","MARYLN","MARYETTA","MARSHALL","MARCELL","MALENA","MAKEDA","MADDIE","LOVETTA","LOURIE","LORRINE","LORILEE","LESTER","LAURENA","LASHAY","LARRAINE","LAREE","LACRESHA","KRISTLE","KRISHNA","KEVA","KEIRA","KAROLE","JOIE","JINNY","JEANNETTA","JAMA","HEIDY","GILBERTE","GEMA","FAVIOLA","EVELYNN","ENDA","ELLI","ELLENA","DIVINA","DAGNY","COLLENE","CODI","CINDIE","CHASSIDY","CHASIDY","CATRICE","CATHERINA","CASSEY","CAROLL","CARLENA","CANDRA","CALISTA","BRYANNA","BRITTENY","BEULA","BARI","AUDRIE","AUDRIA","ARDELIA","ANNELLE","ANGILA","ALONA","ALLYN","DOUGLAS","ROGER","JONATHAN","RALPH","NICHOLAS","BENJAMIN","BRUCE","HARRY","WAYNE","STEVE","HOWARD","ERNEST","PHILLIP","TODD","CRAIG","ALAN","PHILIP","EARL","DANNY","BRYAN","STANLEY","LEONARD","NATHAN","MANUEL","RODNEY","MARVIN","VINCENT","JEFFERY","JEFF","CHAD","JACOB","ALFRED","BRADLEY","HERBERT","FREDERICK","EDWIN","DON","RICKY","RANDALL","BARRY","BERNARD","LEROY","MARCUS","THEODORE","CLIFFORD","MIGUEL","JIM","TOM","CALVIN","BILL","LLOYD","DEREK","WARREN","DARRELL","JEROME","FLOYD","ALVIN","TIM","GORDON","GREG","JORGE","DUSTIN","PEDRO","DERRICK","ZACHARY","HERMAN","GLEN","HECTOR","RICARDO","RICK","BRENT","RAMON","GILBERT","MARC","REGINALD","RUBEN","NATHANIEL","RAFAEL","EDGAR","MILTON","RAUL","BEN","CHESTER","DUANE","FRANKLIN","BRAD","RON","ROLAND","ARNOLD","HARVEY","JARED","ERIK","DARRYL","NEIL","JAVIER","FERNANDO","CLINTON","TED","MATHEW","TYRONE","DARREN","LANCE","KURT","ALLAN","NELSON","GUY","CLAYTON","HUGH","MAX","DWAYNE","DWIGHT","ARMANDO","FELIX","EVERETT","IAN","WALLACE","KEN","BOB","ALFREDO","ALBERTO","DAVE","IVAN","BYRON","ISAAC","MORRIS","CLIFTON","WILLARD","ROSS","ANDY","SALVADOR","KIRK","SERGIO","SETH","KENT","TERRANCE","EDUARDO","TERRENCE","ENRIQUE","WADE","STUART","FREDRICK","ARTURO","ALEJANDRO","NICK","LUTHER","WENDELL","JEREMIAH","JULIUS","OTIS","TREVOR","OLIVER","LUKE","HOMER","GERARD","DOUG","KENNY","HUBERT","LYLE","MATT","ALFONSO","ORLANDO","REX","CARLTON","ERNESTO","NEAL","PABLO","LORENZO","OMAR","WILBUR","GRANT","HORACE","RODERICK","ABRAHAM","WILLIS","RICKEY","ANDRES","CESAR","JOHNATHAN","MALCOLM","RUDOLPH","DAMON","KELVIN","PRESTON","ALTON","ARCHIE","MARCO","WM","PETE","RANDOLPH","GARRY","GEOFFREY","JONATHON","FELIPE","GERARDO","ED","DOMINIC","DELBERT","COLIN","GUILLERMO","EARNEST","LUCAS","BENNY","SPENCER","RODOLFO","MYRON","EDMUND","GARRETT","SALVATORE","CEDRIC","LOWELL","GREGG","SHERMAN","WILSON","SYLVESTER","ROOSEVELT","ISRAEL","JERMAINE","FORREST","WILBERT","LELAND","SIMON","CLARK","IRVING","BRYANT","OWEN","RUFUS","WOODROW","KRISTOPHER","MACK","LEVI","MARCOS","GUSTAVO","JAKE","LIONEL","GILBERTO","CLINT","NICOLAS","ISMAEL","ORVILLE","ERVIN","DEWEY","AL","WILFRED","JOSH","HUGO","IGNACIO","CALEB","TOMAS","SHELDON","ERICK","STEWART","DOYLE","DARREL","ROGELIO","TERENCE","SANTIAGO","ALONZO","ELIAS","BERT","ELBERT","RAMIRO","CONRAD","NOAH","GRADY","PHIL","CORNELIUS","LAMAR","ROLANDO","CLAY","PERCY","DEXTER","BRADFORD","DARIN","AMOS","MOSES","IRVIN","SAUL","ROMAN","RANDAL","TIMMY","DARRIN","WINSTON","BRENDAN","ABEL","DOMINICK","BOYD","EMILIO","ELIJAH","DOMINGO","EMMETT","MARLON","EMANUEL","JERALD","EDMOND","EMIL","DEWAYNE","WILL","OTTO","TEDDY","REYNALDO","BRET","JESS","TRENT","HUMBERTO","EMMANUEL","STEPHAN","VICENTE","LAMONT","GARLAND","MILES","EFRAIN","HEATH","RODGER","HARLEY","ETHAN","ELDON","ROCKY","PIERRE","JUNIOR","FREDDY","ELI","BRYCE","ANTOINE","STERLING","CHASE","GROVER","ELTON","CLEVELAND","DYLAN","CHUCK","DAMIAN","REUBEN","STAN","AUGUST","LEONARDO","JASPER","RUSSEL","ERWIN","BENITO","HANS","MONTE","BLAINE","ERNIE","CURT","QUENTIN","AGUSTIN","MURRAY","JAMAL","ADOLFO","HARRISON","TYSON","BURTON","BRADY","ELLIOTT","WILFREDO","BART","JARROD","VANCE","DENIS","DAMIEN","JOAQUIN","HARLAN","DESMOND","ELLIOT","DARWIN","GREGORIO","BUDDY","XAVIER","KERMIT","ROSCOE","ESTEBAN","ANTON","SOLOMON","SCOTTY","NORBERT","ELVIN","WILLIAMS","NOLAN","ROD","QUINTON","HAL","BRAIN","ROB","ELWOOD","KENDRICK","DARIUS","MOISES","FIDEL","THADDEUS","CLIFF","MARCEL","JACKSON","RAPHAEL","BRYON","ARMAND","ALVARO","JEFFRY","DANE","JOESPH","THURMAN","NED","RUSTY","MONTY","FABIAN","REGGIE","MASON","GRAHAM","ISAIAH","VAUGHN","GUS","LOYD","DIEGO","ADOLPH","NORRIS","MILLARD","ROCCO","GONZALO","DERICK","RODRIGO","WILEY","RIGOBERTO","ALPHONSO","TY","NOE","VERN","REED","JEFFERSON","ELVIS","BERNARDO","MAURICIO","HIRAM","DONOVAN","BASIL","RILEY","NICKOLAS","MAYNARD","SCOT","VINCE","QUINCY","EDDY","SEBASTIAN","FEDERICO","ULYSSES","HERIBERTO","DONNELL","COLE","DAVIS","GAVIN","EMERY","WARD","ROMEO","JAYSON","DANTE","CLEMENT","COY","MAXWELL","JARVIS","BRUNO","ISSAC","DUDLEY","BROCK","SANFORD","CARMELO","BARNEY","NESTOR","STEFAN","DONNY","ART","LINWOOD","BEAU","WELDON","GALEN","ISIDRO","TRUMAN","DELMAR","JOHNATHON","SILAS","FREDERIC","DICK","IRWIN","MERLIN","CHARLEY","MARCELINO","HARRIS","CARLO","TRENTON","KURTIS","HUNTER","AURELIO","WINFRED","VITO","COLLIN","DENVER","CARTER","LEONEL","EMORY","PASQUALE","MOHAMMAD","MARIANO","DANIAL","LANDON","DIRK","BRANDEN","ADAN","BUFORD","GERMAN","WILMER","EMERSON","ZACHERY","FLETCHER","JACQUES","ERROL","DALTON","MONROE","JOSUE","EDWARDO","BOOKER","WILFORD","SONNY","SHELTON","CARSON","THERON","RAYMUNDO","DAREN","HOUSTON","ROBBY","LINCOLN","GENARO","BENNETT","OCTAVIO","CORNELL","HUNG","ARRON","ANTONY","HERSCHEL","GIOVANNI","GARTH","CYRUS","CYRIL","RONNY","LON","FREEMAN","DUNCAN","KENNITH","CARMINE","ERICH","CHADWICK","WILBURN","RUSS","REID","MYLES","ANDERSON","MORTON","JONAS","FOREST","MITCHEL","MERVIN","ZANE","RICH","JAMEL","LAZARO","ALPHONSE","RANDELL","MAJOR","JARRETT","BROOKS","ABDUL","LUCIANO","SEYMOUR","EUGENIO","MOHAMMED","VALENTIN","CHANCE","ARNULFO","LUCIEN","FERDINAND","THAD","EZRA","ALDO","RUBIN","ROYAL","MITCH","EARLE","ABE","WYATT","MARQUIS","LANNY","KAREEM","JAMAR","BORIS","ISIAH","EMILE","ELMO","ARON","LEOPOLDO","EVERETTE","JOSEF","ELOY","RODRICK","REINALDO","LUCIO","JERROD","WESTON","HERSHEL","BARTON","PARKER","LEMUEL","BURT","JULES","GIL","ELISEO","AHMAD","NIGEL","EFREN","ANTWAN","ALDEN","MARGARITO","COLEMAN","DINO","OSVALDO","LES","DEANDRE","NORMAND","KIETH","TREY","NORBERTO","NAPOLEON","JEROLD","FRITZ","ROSENDO","MILFORD","CHRISTOPER","ALFONZO","LYMAN","JOSIAH","BRANT","WILTON","RICO","JAMAAL","DEWITT","BRENTON","OLIN","FOSTER","FAUSTINO","CLAUDIO","JUDSON","GINO","EDGARDO","ALEC","TANNER","JARRED","DONN","TAD","PRINCE","PORFIRIO","ODIS","LENARD","CHAUNCEY","TOD","MEL","MARCELO","KORY","AUGUSTUS","KEVEN","HILARIO","BUD","SAL","ORVAL","MAURO","ZACHARIAH","OLEN","ANIBAL","MILO","JED","DILLON","AMADO","NEWTON","LENNY","RICHIE","HORACIO","BRICE","MOHAMED","DELMER","DARIO","REYES","MAC","JONAH","JERROLD","ROBT","HANK","RUPERT","ROLLAND","KENTON","DAMION","ANTONE","WALDO","FREDRIC","BRADLY","KIP","BURL","WALKER","TYREE","JEFFEREY","AHMED","WILLY","STANFORD","OREN","NOBLE","MOSHE","MIKEL","ENOCH","BRENDON","QUINTIN","JAMISON","FLORENCIO","DARRICK","TOBIAS","HASSAN","GIUSEPPE","DEMARCUS","CLETUS","TYRELL","LYNDON","KEENAN","WERNER","GERALDO","COLUMBUS","CHET","BERTRAM","MARKUS","HUEY","HILTON","DWAIN","DONTE","TYRON","OMER","ISAIAS","HIPOLITO","FERMIN","ADALBERTO","BO","BARRETT","TEODORO","MCKINLEY","MAXIMO","GARFIELD","RALEIGH","LAWERENCE","ABRAM","RASHAD","KING","EMMITT","DARON","SAMUAL","MIQUEL","EUSEBIO","DOMENIC","DARRON","BUSTER","WILBER","RENATO","JC","HOYT","HAYWOOD","EZEKIEL","CHAS","FLORENTINO","ELROY","CLEMENTE","ARDEN","NEVILLE","EDISON","DESHAWN","NATHANIAL","JORDON","DANILO","CLAUD","SHERWOOD","RAYMON","RAYFORD","CRISTOBAL","AMBROSE","TITUS","HYMAN","FELTON","EZEQUIEL","ERASMO","STANTON","LONNY","LEN","IKE","MILAN","LINO","JAROD","HERB","ANDREAS","WALTON","RHETT","PALMER","DOUGLASS","CORDELL","OSWALDO","ELLSWORTH","VIRGILIO","TONEY","NATHANAEL","DEL","BENEDICT","MOSE","JOHNSON","ISREAL","GARRET","FAUSTO","ASA","ARLEN","ZACK","WARNER","MODESTO","FRANCESCO","MANUAL","GAYLORD","GASTON","FILIBERTO","DEANGELO","MICHALE","GRANVILLE","WES","MALIK","ZACKARY","TUAN","ELDRIDGE","CRISTOPHER","CORTEZ","ANTIONE","MALCOM","LONG","KOREY","JOSPEH","COLTON","WAYLON","VON","HOSEA","SHAD","SANTO","RUDOLF","ROLF","REY","RENALDO","MARCELLUS","LUCIUS","KRISTOFER","BOYCE","BENTON","HAYDEN","HARLAND","ARNOLDO","RUEBEN","LEANDRO","KRAIG","JERRELL","JEROMY","HOBERT","CEDRICK","ARLIE","WINFORD","WALLY","LUIGI","KENETH","JACINTO","GRAIG","FRANKLYN","EDMUNDO","SID","PORTER","LEIF","JERAMY","BUCK","WILLIAN","VINCENZO","SHON","LYNWOOD","JERE","HAI","ELDEN","DORSEY","DARELL","BRODERICK","ALONSO" \ No newline at end of file diff --git a/python-mega-algo/project_euler/problem_022/right.html b/python-mega-algo/project_euler/problem_022/right.html new file mode 100644 index 00000000..86baab62 --- /dev/null +++ b/python-mega-algo/project_euler/problem_022/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/project_euler/problem_022 + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    sol1.py sol2.py __init__.py p022_names.txt 
    + +

    +Folders: 1
    +Files: 4
    +Size of all files: 48799 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/project_euler/problem_022/sol1.py b/python-mega-algo/project_euler/problem_022/sol1.py new file mode 100644 index 00000000..98290624 --- /dev/null +++ b/python-mega-algo/project_euler/problem_022/sol1.py @@ -0,0 +1,45 @@ +""" +Name scores +Problem 22 + +Using names.txt (right click and 'Save Link/Target As...'), a 46K text file +containing over five-thousand first names, begin by sorting it into +alphabetical order. Then working out the alphabetical value for each name, +multiply this value by its alphabetical position in the list to obtain a name +score. + +For example, when the list is sorted into alphabetical order, COLIN, which is +worth 3 + 15 + 12 + 9 + 14 = 53, is the 938th name in the list. So, COLIN would +obtain a score of 938 × 53 = 49714. + +What is the total of all the name scores in the file? +""" +import os + + +def solution(): + """Returns the total of all the name scores in the file. + + >>> solution() + 871198282 + """ + with open(os.path.dirname(__file__) + "/p022_names.txt") as file: + names = str(file.readlines()[0]) + names = names.replace('"', "").split(",") + + names.sort() + + name_score = 0 + total_score = 0 + + for i, name in enumerate(names): + for letter in name: + name_score += ord(letter) - 64 + + total_score += (i + 1) * name_score + name_score = 0 + return total_score + + +if __name__ == "__main__": + print(solution()) diff --git a/python-mega-algo/project_euler/problem_022/sol2.py b/python-mega-algo/project_euler/problem_022/sol2.py new file mode 100644 index 00000000..5ae41c84 --- /dev/null +++ b/python-mega-algo/project_euler/problem_022/sol2.py @@ -0,0 +1,42 @@ +""" +Name scores +Problem 22 + +Using names.txt (right click and 'Save Link/Target As...'), a 46K text file +containing over five-thousand first names, begin by sorting it into +alphabetical order. Then working out the alphabetical value for each name, +multiply this value by its alphabetical position in the list to obtain a name +score. + +For example, when the list is sorted into alphabetical order, COLIN, which is +worth 3 + 15 + 12 + 9 + 14 = 53, is the 938th name in the list. So, COLIN would +obtain a score of 938 × 53 = 49714. + +What is the total of all the name scores in the file? +""" +import os + + +def solution(): + """Returns the total of all the name scores in the file. + + >>> solution() + 871198282 + """ + total_sum = 0 + temp_sum = 0 + with open(os.path.dirname(__file__) + "/p022_names.txt") as file: + name = str(file.readlines()[0]) + name = name.replace('"', "").split(",") + + name.sort() + for i in range(len(name)): + for j in name[i]: + temp_sum += ord(j) - ord("A") + 1 + total_sum += (i + 1) * temp_sum + temp_sum = 0 + return total_sum + + +if __name__ == "__main__": + print(solution()) diff --git a/python-mega-algo/project_euler/problem_023/__init__.py b/python-mega-algo/project_euler/problem_023/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/project_euler/problem_023/right.html b/python-mega-algo/project_euler/problem_023/right.html new file mode 100644 index 00000000..24732128 --- /dev/null +++ b/python-mega-algo/project_euler/problem_023/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/project_euler/problem_023 + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    sol1.py __init__.py 
    + +

    +Folders: 1
    +Files: 2
    +Size of all files: 1640 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/project_euler/problem_023/sol1.py b/python-mega-algo/project_euler/problem_023/sol1.py new file mode 100644 index 00000000..a72b6123 --- /dev/null +++ b/python-mega-algo/project_euler/problem_023/sol1.py @@ -0,0 +1,52 @@ +""" +A perfect number is a number for which the sum of its proper divisors is exactly +equal to the number. For example, the sum of the proper divisors of 28 would be +1 + 2 + 4 + 7 + 14 = 28, which means that 28 is a perfect number. + +A number n is called deficient if the sum of its proper divisors is less than n +and it is called abundant if this sum exceeds n. + +As 12 is the smallest abundant number, 1 + 2 + 3 + 4 + 6 = 16, the smallest +number that can be written as the sum of two abundant numbers is 24. By +mathematical analysis, it can be shown that all integers greater than 28123 +can be written as the sum of two abundant numbers. However, this upper limit +cannot be reduced any further by analysis even though it is known that the +greatest number that cannot be expressed as the sum of two abundant numbers +is less than this limit. + +Find the sum of all the positive integers which cannot be written as the sum +of two abundant numbers. +""" + + +def solution(limit=28123): + """ + Finds the sum of all the positive integers which cannot be written as + the sum of two abundant numbers + as described by the statement above. + + >>> solution() + 4179871 + """ + sumDivs = [1] * (limit + 1) + + for i in range(2, int(limit ** 0.5) + 1): + sumDivs[i * i] += i + for k in range(i + 1, limit // i + 1): + sumDivs[k * i] += k + i + + abundants = set() + res = 0 + + for n in range(1, limit + 1): + if sumDivs[n] > n: + abundants.add(n) + + if not any((n - a in abundants) for a in abundants): + res += n + + return res + + +if __name__ == "__main__": + print(solution()) diff --git a/python-mega-algo/project_euler/problem_024/__init__.py b/python-mega-algo/project_euler/problem_024/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/project_euler/problem_024/right.html b/python-mega-algo/project_euler/problem_024/right.html new file mode 100644 index 00000000..a0e09137 --- /dev/null +++ b/python-mega-algo/project_euler/problem_024/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/project_euler/problem_024 + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    sol1.py __init__.py 
    + +

    +Folders: 1
    +Files: 2
    +Size of all files: 762 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/project_euler/problem_024/sol1.py b/python-mega-algo/project_euler/problem_024/sol1.py new file mode 100644 index 00000000..1c6378b3 --- /dev/null +++ b/python-mega-algo/project_euler/problem_024/sol1.py @@ -0,0 +1,27 @@ +""" +A permutation is an ordered arrangement of objects. For example, 3124 is one +possible permutation of the digits 1, 2, 3 and 4. If all of the permutations +are listed numerically or alphabetically, we call it lexicographic order. The +lexicographic permutations of 0, 1 and 2 are: + + 012 021 102 120 201 210 + +What is the millionth lexicographic permutation of the digits 0, 1, 2, 3, 4, 5, +6, 7, 8 and 9? +""" +from itertools import permutations + + +def solution(): + """Returns the millionth lexicographic permutation of the digits 0, 1, 2, + 3, 4, 5, 6, 7, 8 and 9. + + >>> solution() + '2783915460' + """ + result = list(map("".join, permutations("0123456789"))) + return result[999999] + + +if __name__ == "__main__": + print(solution()) diff --git a/python-mega-algo/project_euler/problem_025/__init__.py b/python-mega-algo/project_euler/problem_025/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/project_euler/problem_025/right.html b/python-mega-algo/project_euler/problem_025/right.html new file mode 100644 index 00000000..58900d04 --- /dev/null +++ b/python-mega-algo/project_euler/problem_025/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/project_euler/problem_025 + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    sol1.py sol2.py sol3.py __init__.py 
    + +

    +Folders: 1
    +Files: 4
    +Size of all files: 4320 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/project_euler/problem_025/sol1.py b/python-mega-algo/project_euler/problem_025/sol1.py new file mode 100644 index 00000000..c30a74a4 --- /dev/null +++ b/python-mega-algo/project_euler/problem_025/sol1.py @@ -0,0 +1,101 @@ +""" +The Fibonacci sequence is defined by the recurrence relation: + + Fn = Fn−1 + Fn−2, where F1 = 1 and F2 = 1. + +Hence the first 12 terms will be: + + F1 = 1 + F2 = 1 + F3 = 2 + F4 = 3 + F5 = 5 + F6 = 8 + F7 = 13 + F8 = 21 + F9 = 34 + F10 = 55 + F11 = 89 + F12 = 144 + +The 12th term, F12, is the first term to contain three digits. + +What is the index of the first term in the Fibonacci sequence to contain 1000 +digits? +""" + + +def fibonacci(n: int) -> int: + """ + Computes the Fibonacci number for input n by iterating through n numbers + and creating an array of ints using the Fibonacci formula. + Returns the nth element of the array. + + >>> fibonacci(2) + 1 + >>> fibonacci(3) + 2 + >>> fibonacci(5) + 5 + >>> fibonacci(10) + 55 + >>> fibonacci(12) + 144 + + """ + if n == 1 or type(n) is not int: + return 0 + elif n == 2: + return 1 + else: + sequence = [0, 1] + for i in range(2, n + 1): + sequence.append(sequence[i - 1] + sequence[i - 2]) + + return sequence[n] + + +def fibonacci_digits_index(n: int) -> int: + """ + Computes incrementing Fibonacci numbers starting from 3 until the length + of the resulting Fibonacci result is the input value n. Returns the term + of the Fibonacci sequence where this occurs. + + >>> fibonacci_digits_index(1000) + 4782 + >>> fibonacci_digits_index(100) + 476 + >>> fibonacci_digits_index(50) + 237 + >>> fibonacci_digits_index(3) + 12 + """ + digits = 0 + index = 2 + + while digits < n: + index += 1 + digits = len(str(fibonacci(index))) + + return index + + +def solution(n: int = 1000) -> int: + """ + Returns the index of the first term in the Fibonacci sequence to contain + n digits. + + >>> solution(1000) + 4782 + >>> solution(100) + 476 + >>> solution(50) + 237 + >>> solution(3) + 12 + """ + return fibonacci_digits_index(n) + + +if __name__ == "__main__": + print(solution(int(str(input()).strip()))) diff --git a/python-mega-algo/project_euler/problem_025/sol2.py b/python-mega-algo/project_euler/problem_025/sol2.py new file mode 100644 index 00000000..ed3b54bb --- /dev/null +++ b/python-mega-algo/project_euler/problem_025/sol2.py @@ -0,0 +1,71 @@ +""" +The Fibonacci sequence is defined by the recurrence relation: + + Fn = Fn−1 + Fn−2, where F1 = 1 and F2 = 1. + +Hence the first 12 terms will be: + + F1 = 1 + F2 = 1 + F3 = 2 + F4 = 3 + F5 = 5 + F6 = 8 + F7 = 13 + F8 = 21 + F9 = 34 + F10 = 55 + F11 = 89 + F12 = 144 + +The 12th term, F12, is the first term to contain three digits. + +What is the index of the first term in the Fibonacci sequence to contain 1000 +digits? +""" + + +def fibonacci_generator() -> int: + """ + A generator that produces numbers in the Fibonacci sequence + + >>> generator = fibonacci_generator() + >>> next(generator) + 1 + >>> next(generator) + 2 + >>> next(generator) + 3 + >>> next(generator) + 5 + >>> next(generator) + 8 + """ + a, b = 0, 1 + while True: + a, b = b, a + b + yield b + + +def solution(n: int = 1000) -> int: + """Returns the index of the first term in the Fibonacci sequence to contain + n digits. + + >>> solution(1000) + 4782 + >>> solution(100) + 476 + >>> solution(50) + 237 + >>> solution(3) + 12 + """ + answer = 1 + gen = fibonacci_generator() + while len(str(next(gen))) < n: + answer += 1 + return answer + 1 + + +if __name__ == "__main__": + print(solution(int(str(input()).strip()))) diff --git a/python-mega-algo/project_euler/problem_025/sol3.py b/python-mega-algo/project_euler/problem_025/sol3.py new file mode 100644 index 00000000..c66411dc --- /dev/null +++ b/python-mega-algo/project_euler/problem_025/sol3.py @@ -0,0 +1,56 @@ +""" +The Fibonacci sequence is defined by the recurrence relation: + + Fn = Fn−1 + Fn−2, where F1 = 1 and F2 = 1. + +Hence the first 12 terms will be: + + F1 = 1 + F2 = 1 + F3 = 2 + F4 = 3 + F5 = 5 + F6 = 8 + F7 = 13 + F8 = 21 + F9 = 34 + F10 = 55 + F11 = 89 + F12 = 144 + +The 12th term, F12, is the first term to contain three digits. + +What is the index of the first term in the Fibonacci sequence to contain 1000 +digits? +""" + + +def solution(n: int = 1000) -> int: + """Returns the index of the first term in the Fibonacci sequence to contain + n digits. + + >>> solution(1000) + 4782 + >>> solution(100) + 476 + >>> solution(50) + 237 + >>> solution(3) + 12 + """ + f1, f2 = 1, 1 + index = 2 + while True: + i = 0 + f = f1 + f2 + f1, f2 = f2, f + index += 1 + for j in str(f): + i += 1 + if i == n: + break + return index + + +if __name__ == "__main__": + print(solution(int(str(input()).strip()))) diff --git a/python-mega-algo/project_euler/problem_026/__init__.py b/python-mega-algo/project_euler/problem_026/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/project_euler/problem_026/right.html b/python-mega-algo/project_euler/problem_026/right.html new file mode 100644 index 00000000..86a38f6e --- /dev/null +++ b/python-mega-algo/project_euler/problem_026/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/project_euler/problem_026 + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    sol1.py __init__.py 
    + +

    +Folders: 1
    +Files: 2
    +Size of all files: 1507 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/project_euler/problem_026/sol1.py b/python-mega-algo/project_euler/problem_026/sol1.py new file mode 100644 index 00000000..64e0bbfe --- /dev/null +++ b/python-mega-algo/project_euler/problem_026/sol1.py @@ -0,0 +1,60 @@ +""" +Euler Problem 26 +https://projecteuler.net/problem=26 + +Problem Statement: + +A unit fraction contains 1 in the numerator. The decimal representation of the +unit fractions with denominators 2 to 10 are given: + +1/2 = 0.5 +1/3 = 0.(3) +1/4 = 0.25 +1/5 = 0.2 +1/6 = 0.1(6) +1/7 = 0.(142857) +1/8 = 0.125 +1/9 = 0.(1) +1/10 = 0.1 +Where 0.1(6) means 0.166666..., and has a 1-digit recurring cycle. It can be +seen that 1/7 has a 6-digit recurring cycle. + +Find the value of d < 1000 for which 1/d contains the longest recurring cycle +in its decimal fraction part. +""" + + +def solution(numerator: int = 1, digit: int = 1000) -> int: + """ + Considering any range can be provided, + because as per the problem, the digit d < 1000 + >>> solution(1, 10) + 7 + >>> solution(10, 100) + 97 + >>> solution(10, 1000) + 983 + """ + the_digit = 1 + longest_list_length = 0 + + for divide_by_number in range(numerator, digit + 1): + has_been_divided = [] + now_divide = numerator + for division_cycle in range(1, digit + 1): + if now_divide in has_been_divided: + if longest_list_length < len(has_been_divided): + longest_list_length = len(has_been_divided) + the_digit = divide_by_number + else: + has_been_divided.append(now_divide) + now_divide = now_divide * 10 % divide_by_number + + return the_digit + + +# Tests +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/project_euler/problem_027/__init__.py b/python-mega-algo/project_euler/problem_027/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/project_euler/problem_027/right.html b/python-mega-algo/project_euler/problem_027/right.html new file mode 100644 index 00000000..7620ad91 --- /dev/null +++ b/python-mega-algo/project_euler/problem_027/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/project_euler/problem_027 + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    sol1.py __init__.py 
    + +

    +Folders: 1
    +Files: 2
    +Size of all files: 2062 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/project_euler/problem_027/sol1.py b/python-mega-algo/project_euler/problem_027/sol1.py new file mode 100644 index 00000000..6f28b925 --- /dev/null +++ b/python-mega-algo/project_euler/problem_027/sol1.py @@ -0,0 +1,74 @@ +""" +Project Euler Problem 27 +https://projecteuler.net/problem=27 + +Problem Statement: + +Euler discovered the remarkable quadratic formula: +n2 + n + 41 +It turns out that the formula will produce 40 primes for the consecutive values +n = 0 to 39. However, when n = 40, 402 + 40 + 41 = 40(40 + 1) + 41 is divisible +by 41, and certainly when n = 41, 412 + 41 + 41 is clearly divisible by 41. +The incredible formula n2 − 79n + 1601 was discovered, which produces 80 primes +for the consecutive values n = 0 to 79. The product of the coefficients, −79 and +1601, is −126479. +Considering quadratics of the form: +n² + an + b, where |a| < 1000 and |b| < 1000 +where |n| is the modulus/absolute value of ne.g. |11| = 11 and |−4| = 4 +Find the product of the coefficients, a and b, for the quadratic expression that +produces the maximum number of primes for consecutive values of n, starting with +n = 0. +""" + +import math + + +def is_prime(k: int) -> bool: + """ + Determine if a number is prime + >>> is_prime(10) + False + >>> is_prime(11) + True + """ + if k < 2 or k % 2 == 0: + return False + elif k == 2: + return True + else: + for x in range(3, int(math.sqrt(k) + 1), 2): + if k % x == 0: + return False + return True + + +def solution(a_limit: int = 1000, b_limit: int = 1000) -> int: + """ + >>> solution(1000, 1000) + -59231 + >>> solution(200, 1000) + -59231 + >>> solution(200, 200) + -4925 + >>> solution(-1000, 1000) + 0 + >>> solution(-1000, -1000) + 0 + """ + longest = [0, 0, 0] # length, a, b + for a in range((a_limit * -1) + 1, a_limit): + for b in range(2, b_limit): + if is_prime(b): + count = 0 + n = 0 + while is_prime((n ** 2) + (a * n) + b): + count += 1 + n += 1 + if count > longest[0]: + longest = [count, a, b] + ans = longest[1] * longest[2] + return ans + + +if __name__ == "__main__": + print(solution(1000, 1000)) diff --git a/python-mega-algo/project_euler/problem_028/__init__.py b/python-mega-algo/project_euler/problem_028/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/project_euler/problem_028/right.html b/python-mega-algo/project_euler/problem_028/right.html new file mode 100644 index 00000000..6193d727 --- /dev/null +++ b/python-mega-algo/project_euler/problem_028/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/project_euler/problem_028 + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    sol1.py __init__.py 
    + +

    +Folders: 1
    +Files: 2
    +Size of all files: 1229 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/project_euler/problem_028/sol1.py b/python-mega-algo/project_euler/problem_028/sol1.py new file mode 100644 index 00000000..cbc7de6b --- /dev/null +++ b/python-mega-algo/project_euler/problem_028/sol1.py @@ -0,0 +1,58 @@ +""" +Problem 28 +Url: https://projecteuler.net/problem=28 +Statement: +Starting with the number 1 and moving to the right in a clockwise direction a 5 +by 5 spiral is formed as follows: + + 21 22 23 24 25 + 20 7 8 9 10 + 19 6 1 2 11 + 18 5 4 3 12 + 17 16 15 14 13 + +It can be verified that the sum of the numbers on the diagonals is 101. + +What is the sum of the numbers on the diagonals in a 1001 by 1001 spiral formed +in the same way? +""" + +from math import ceil + + +def solution(n: int = 1001) -> int: + """Returns the sum of the numbers on the diagonals in a n by n spiral + formed in the same way. + + >>> solution(1001) + 669171001 + >>> solution(500) + 82959497 + >>> solution(100) + 651897 + >>> solution(50) + 79697 + >>> solution(10) + 537 + """ + total = 1 + + for i in range(1, int(ceil(n / 2.0))): + odd = 2 * i + 1 + even = 2 * i + total = total + 4 * odd ** 2 - 6 * even + + return total + + +if __name__ == "__main__": + import sys + + if len(sys.argv) == 1: + print(solution()) + else: + try: + n = int(sys.argv[1]) + print(solution(n)) + except ValueError: + print("Invalid entry - please enter a number") diff --git a/python-mega-algo/project_euler/problem_029/__init__.py b/python-mega-algo/project_euler/problem_029/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/project_euler/problem_029/right.html b/python-mega-algo/project_euler/problem_029/right.html new file mode 100644 index 00000000..8e765ae3 --- /dev/null +++ b/python-mega-algo/project_euler/problem_029/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/project_euler/problem_029 + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    sol1.py __init__.py 
    + +

    +Folders: 1
    +Files: 2
    +Size of all files: 1235 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/project_euler/problem_029/sol1.py b/python-mega-algo/project_euler/problem_029/sol1.py new file mode 100644 index 00000000..726bcaf6 --- /dev/null +++ b/python-mega-algo/project_euler/problem_029/sol1.py @@ -0,0 +1,50 @@ +""" +Consider all integer combinations of ab for 2 <= a <= 5 and 2 <= b <= 5: + +2^2=4, 2^3=8, 2^4=16, 2^5=32 +3^2=9, 3^3=27, 3^4=81, 3^5=243 +4^2=16, 4^3=64, 4^4=256, 4^5=1024 +5^2=25, 5^3=125, 5^4=625, 5^5=3125 + +If they are then placed in numerical order, with any repeats removed, we get +the following sequence of 15 distinct terms: + +4, 8, 9, 16, 25, 27, 32, 64, 81, 125, 243, 256, 625, 1024, 3125 + +How many distinct terms are in the sequence generated by ab +for 2 <= a <= 100 and 2 <= b <= 100? +""" + + +def solution(n: int = 100) -> int: + """Returns the number of distinct terms in the sequence generated by a^b + for 2 <= a <= 100 and 2 <= b <= 100. + + >>> solution(100) + 9183 + >>> solution(50) + 2184 + >>> solution(20) + 324 + >>> solution(5) + 15 + >>> solution(2) + 1 + >>> solution(1) + 0 + """ + collectPowers = set() + + currentPow = 0 + + N = n + 1 # maximum limit + + for a in range(2, N): + for b in range(2, N): + currentPow = a ** b # calculates the current power + collectPowers.add(currentPow) # adds the result to the set + return len(collectPowers) + + +if __name__ == "__main__": + print("Number of terms ", solution(int(str(input()).strip()))) diff --git a/python-mega-algo/project_euler/problem_030/__init__.py b/python-mega-algo/project_euler/problem_030/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/project_euler/problem_030/right.html b/python-mega-algo/project_euler/problem_030/right.html new file mode 100644 index 00000000..2ec26236 --- /dev/null +++ b/python-mega-algo/project_euler/problem_030/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/project_euler/problem_030 + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    sol1.py __init__.py 
    + +

    +Folders: 1
    +Files: 2
    +Size of all files: 1063 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/project_euler/problem_030/sol1.py b/python-mega-algo/project_euler/problem_030/sol1.py new file mode 100644 index 00000000..c9f2d719 --- /dev/null +++ b/python-mega-algo/project_euler/problem_030/sol1.py @@ -0,0 +1,39 @@ +""" Problem Statement (Digit Fifth Power ): https://projecteuler.net/problem=30 + +Surprisingly there are only three numbers that can be written as the sum of fourth +powers of their digits: + +1634 = 1^4 + 6^4 + 3^4 + 4^4 +8208 = 8^4 + 2^4 + 0^4 + 8^4 +9474 = 9^4 + 4^4 + 7^4 + 4^4 +As 1 = 1^4 is not a sum it is not included. + +The sum of these numbers is 1634 + 8208 + 9474 = 19316. + +Find the sum of all the numbers that can be written as the sum of fifth powers of their +digits. + +(9^5)=59,049‬ +59049*7=4,13,343 (which is only 6 digit number ) +So, number greater than 9,99,999 are rejected +and also 59049*3=1,77,147 (which exceeds the criteria of number being 3 digit) +So, n>999 +and hence a bound between (1000,1000000) +""" + + +def digitsum(s: str) -> int: + """ + >>> all(digitsum(str(i)) == (1 if i == 1 else 0) for i in range(100)) + True + """ + i = sum(pow(int(c), 5) for c in s) + return i if i == int(s) else 0 + + +def solution() -> int: + return sum(digitsum(str(i)) for i in range(1000, 1000000)) + + +if __name__ == "__main__": + print(solution()) diff --git a/python-mega-algo/project_euler/problem_031/__init__.py b/python-mega-algo/project_euler/problem_031/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/project_euler/problem_031/right.html b/python-mega-algo/project_euler/problem_031/right.html new file mode 100644 index 00000000..abab182d --- /dev/null +++ b/python-mega-algo/project_euler/problem_031/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/project_euler/problem_031 + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    sol1.py sol2.py __init__.py 
    + +

    +Folders: 1
    +Files: 3
    +Size of all files: 2983 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/project_euler/problem_031/sol1.py b/python-mega-algo/project_euler/problem_031/sol1.py new file mode 100644 index 00000000..ba40cf38 --- /dev/null +++ b/python-mega-algo/project_euler/problem_031/sol1.py @@ -0,0 +1,65 @@ +""" +Coin sums +Problem 31: https://projecteuler.net/problem=31 + +In England the currency is made up of pound, £, and pence, p, and there are +eight coins in general circulation: + +1p, 2p, 5p, 10p, 20p, 50p, £1 (100p) and £2 (200p). +It is possible to make £2 in the following way: + +1×£1 + 1×50p + 2×20p + 1×5p + 1×2p + 3×1p +How many different ways can £2 be made using any number of coins? +""" + + +def one_pence() -> int: + return 1 + + +def two_pence(x: int) -> int: + return 0 if x < 0 else two_pence(x - 2) + one_pence() + + +def five_pence(x: int) -> int: + return 0 if x < 0 else five_pence(x - 5) + two_pence(x) + + +def ten_pence(x: int) -> int: + return 0 if x < 0 else ten_pence(x - 10) + five_pence(x) + + +def twenty_pence(x: int) -> int: + return 0 if x < 0 else twenty_pence(x - 20) + ten_pence(x) + + +def fifty_pence(x: int) -> int: + return 0 if x < 0 else fifty_pence(x - 50) + twenty_pence(x) + + +def one_pound(x: int) -> int: + return 0 if x < 0 else one_pound(x - 100) + fifty_pence(x) + + +def two_pound(x: int) -> int: + return 0 if x < 0 else two_pound(x - 200) + one_pound(x) + + +def solution(n: int = 200) -> int: + """Returns the number of different ways can n pence be made using any number of + coins? + + >>> solution(500) + 6295434 + >>> solution(200) + 73682 + >>> solution(50) + 451 + >>> solution(10) + 11 + """ + return two_pound(n) + + +if __name__ == "__main__": + print(solution(int(input().strip()))) diff --git a/python-mega-algo/project_euler/problem_031/sol2.py b/python-mega-algo/project_euler/problem_031/sol2.py new file mode 100644 index 00000000..f9e4dc38 --- /dev/null +++ b/python-mega-algo/project_euler/problem_031/sol2.py @@ -0,0 +1,59 @@ +""" +Problem 31: https://projecteuler.net/problem=31 + +Coin sums + +In England the currency is made up of pound, £, and pence, p, and there are +eight coins in general circulation: + +1p, 2p, 5p, 10p, 20p, 50p, £1 (100p) and £2 (200p). +It is possible to make £2 in the following way: + +1×£1 + 1×50p + 2×20p + 1×5p + 1×2p + 3×1p +How many different ways can £2 be made using any number of coins? + +Hint: + > There are 100 pence in a pound (£1 = 100p) + > There are coins(in pence) are available: 1, 2, 5, 10, 20, 50, 100 and 200. + > how many different ways you can combine these values to create 200 pence. + +Example: + to make 6p there are 5 ways + 1,1,1,1,1,1 + 1,1,1,1,2 + 1,1,2,2 + 2,2,2 + 1,5 + to make 5p there are 4 ways + 1,1,1,1,1 + 1,1,1,2 + 1,2,2 + 5 +""" + + +def solution(pence: int = 200) -> int: + """Returns the number of different ways to make X pence using any number of coins. + The solution is based on dynamic programming paradigm in a bottom-up fashion. + + >>> solution(500) + 6295434 + >>> solution(200) + 73682 + >>> solution(50) + 451 + >>> solution(10) + 11 + """ + coins = [1, 2, 5, 10, 20, 50, 100, 200] + number_of_ways = [0] * (pence + 1) + number_of_ways[0] = 1 # base case: 1 way to make 0 pence + + for coin in coins: + for i in range(coin, pence + 1, 1): + number_of_ways[i] += number_of_ways[i - coin] + return number_of_ways[pence] + + +if __name__ == "__main__": + assert solution(200) == 73682 diff --git a/python-mega-algo/project_euler/problem_032/__init__.py b/python-mega-algo/project_euler/problem_032/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/project_euler/problem_032/right.html b/python-mega-algo/project_euler/problem_032/right.html new file mode 100644 index 00000000..dfeac92a --- /dev/null +++ b/python-mega-algo/project_euler/problem_032/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/project_euler/problem_032 + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    sol32.py __init__.py 
    + +

    +Folders: 1
    +Files: 2
    +Size of all files: 1569 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/project_euler/problem_032/sol32.py b/python-mega-algo/project_euler/problem_032/sol32.py new file mode 100644 index 00000000..39321833 --- /dev/null +++ b/python-mega-algo/project_euler/problem_032/sol32.py @@ -0,0 +1,58 @@ +""" +We shall say that an n-digit number is pandigital if it makes use of all the +digits 1 to n exactly once; for example, the 5-digit number, 15234, is 1 through +5 pandigital. + +The product 7254 is unusual, as the identity, 39 × 186 = 7254, containing +multiplicand, multiplier, and product is 1 through 9 pandigital. + +Find the sum of all products whose multiplicand/multiplier/product identity can +be written as a 1 through 9 pandigital. + +HINT: Some products can be obtained in more than one way so be sure to only +include it once in your sum. +""" +import itertools + + +def isCombinationValid(combination): + """ + Checks if a combination (a tuple of 9 digits) + is a valid product equation. + + >>> isCombinationValid(('3', '9', '1', '8', '6', '7', '2', '5', '4')) + True + + >>> isCombinationValid(('1', '2', '3', '4', '5', '6', '7', '8', '9')) + False + + """ + return ( + int("".join(combination[0:2])) * int("".join(combination[2:5])) + == int("".join(combination[5:9])) + ) or ( + int("".join(combination[0])) * int("".join(combination[1:5])) + == int("".join(combination[5:9])) + ) + + +def solution(): + """ + Finds the sum of all products whose multiplicand/multiplier/product identity + can be written as a 1 through 9 pandigital + + >>> solution() + 45228 + """ + + return sum( + { + int("".join(pandigital[5:9])) + for pandigital in itertools.permutations("123456789") + if isCombinationValid(pandigital) + } + ) + + +if __name__ == "__main__": + print(solution()) diff --git a/python-mega-algo/project_euler/problem_033/__init__.py b/python-mega-algo/project_euler/problem_033/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/project_euler/problem_033/right.html b/python-mega-algo/project_euler/problem_033/right.html new file mode 100644 index 00000000..150e44f1 --- /dev/null +++ b/python-mega-algo/project_euler/problem_033/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/project_euler/problem_033 + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    sol1.py __init__.py 
    + +

    +Folders: 1
    +Files: 2
    +Size of all files: 1920 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/project_euler/problem_033/sol1.py b/python-mega-algo/project_euler/problem_033/sol1.py new file mode 100644 index 00000000..ba6e553d --- /dev/null +++ b/python-mega-algo/project_euler/problem_033/sol1.py @@ -0,0 +1,68 @@ +""" +Problem 33: https://projecteuler.net/problem=33 + +The fraction 49/98 is a curious fraction, as an inexperienced +mathematician in attempting to simplify it may incorrectly believe +that 49/98 = 4/8, which is correct, is obtained by cancelling the 9s. + +We shall consider fractions like, 30/50 = 3/5, to be trivial examples. + +There are exactly four non-trivial examples of this type of fraction, +less than one in value, and containing two digits in the numerator +and denominator. + +If the product of these four fractions is given in its lowest common +terms, find the value of the denominator. +""" +from fractions import Fraction +from typing import List + + +def is_digit_cancelling(num: int, den: int) -> bool: + if num != den: + if num % 10 == den // 10: + if (num // 10) / (den % 10) == num / den: + return True + return False + + +def fraction_list(digit_len: int) -> List[str]: + """ + >>> fraction_list(2) + ['16/64', '19/95', '26/65', '49/98'] + >>> fraction_list(3) + ['16/64', '19/95', '26/65', '49/98'] + >>> fraction_list(4) + ['16/64', '19/95', '26/65', '49/98'] + >>> fraction_list(0) + [] + >>> fraction_list(5) + ['16/64', '19/95', '26/65', '49/98'] + """ + solutions = [] + den = 11 + last_digit = int("1" + "0" * digit_len) + for num in range(den, last_digit): + while den <= 99: + if (num != den) and (num % 10 == den // 10) and (den % 10 != 0): + if is_digit_cancelling(num, den): + solutions.append(f"{num}/{den}") + den += 1 + num += 1 + den = 10 + return solutions + + +def solution(n: int = 2) -> int: + """ + Return the solution to the problem + """ + result = 1.0 + for fraction in fraction_list(n): + frac = Fraction(fraction) + result *= frac.denominator / frac.numerator + return int(result) + + +if __name__ == "__main__": + print(solution()) diff --git a/python-mega-algo/project_euler/problem_034/__init__.py b/python-mega-algo/project_euler/problem_034/__init__.py new file mode 100644 index 00000000..792d6005 --- /dev/null +++ b/python-mega-algo/project_euler/problem_034/__init__.py @@ -0,0 +1 @@ +# diff --git a/python-mega-algo/project_euler/problem_034/right.html b/python-mega-algo/project_euler/problem_034/right.html new file mode 100644 index 00000000..82247721 --- /dev/null +++ b/python-mega-algo/project_euler/problem_034/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/project_euler/problem_034 + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    sol1.py __init__.py 
    + +

    +Folders: 1
    +Files: 2
    +Size of all files: 930 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/project_euler/problem_034/sol1.py b/python-mega-algo/project_euler/problem_034/sol1.py new file mode 100644 index 00000000..2466fa34 --- /dev/null +++ b/python-mega-algo/project_euler/problem_034/sol1.py @@ -0,0 +1,36 @@ +""" +Problem 34: https://projecteuler.net/problem=34 + +145 is a curious number, as 1! + 4! + 5! = 1 + 24 + 120 = 145. +Find the sum of all numbers which are equal to the sum of the factorial of their digits. +Note: As 1! = 1 and 2! = 2 are not sums they are not included. +""" + +from math import factorial + + +def sum_of_digit_factorial(n: int) -> int: + """ + Returns the sum of the digits in n + >>> sum_of_digit_factorial(15) + 121 + >>> sum_of_digit_factorial(0) + 1 + """ + return sum(factorial(int(char)) for char in str(n)) + + +def solution() -> int: + """ + Returns the sum of all numbers whose + sum of the factorials of all digits + add up to the number itself. + >>> solution() + 40730 + """ + limit = 7 * factorial(9) + 1 + return sum(i for i in range(3, limit) if sum_of_digit_factorial(i) == i) + + +if __name__ == "__main__": + print(f"{solution()} = ") diff --git a/python-mega-algo/project_euler/problem_035/__init__.py b/python-mega-algo/project_euler/problem_035/__init__.py new file mode 100644 index 00000000..792d6005 --- /dev/null +++ b/python-mega-algo/project_euler/problem_035/__init__.py @@ -0,0 +1 @@ +# diff --git a/python-mega-algo/project_euler/problem_035/right.html b/python-mega-algo/project_euler/problem_035/right.html new file mode 100644 index 00000000..5803fcfc --- /dev/null +++ b/python-mega-algo/project_euler/problem_035/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/project_euler/problem_035 + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    sol1.py __init__.py 
    + +

    +Folders: 1
    +Files: 2
    +Size of all files: 2249 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/project_euler/problem_035/sol1.py b/python-mega-algo/project_euler/problem_035/sol1.py new file mode 100644 index 00000000..fe69a9dc --- /dev/null +++ b/python-mega-algo/project_euler/problem_035/sol1.py @@ -0,0 +1,82 @@ +""" +Project Euler Problem 35 +https://projecteuler.net/problem=35 + +Problem Statement: + +The number 197 is called a circular prime because all rotations of the digits: +197, 971, and 719, are themselves prime. +There are thirteen such primes below 100: 2, 3, 5, 7, 11, 13, 17, 31, 37, 71, 73, +79, and 97. +How many circular primes are there below one million? + +To solve this problem in an efficient manner, we will first mark all the primes +below 1 million using the Seive of Eratosthenes. Then, out of all these primes, +we will rule out the numbers which contain an even digit. After this we will +generate each circular combination of the number and check if all are prime. +""" +from __future__ import annotations + +seive = [True] * 1000001 +i = 2 +while i * i <= 1000000: + if seive[i]: + for j in range(i * i, 1000001, i): + seive[j] = False + i += 1 + + +def is_prime(n: int) -> bool: + """ + For 2 <= n <= 1000000, return True if n is prime. + >>> is_prime(87) + False + >>> is_prime(23) + True + >>> is_prime(25363) + False + """ + return seive[n] + + +def contains_an_even_digit(n: int) -> bool: + """ + Return True if n contains an even digit. + >>> contains_an_even_digit(0) + True + >>> contains_an_even_digit(975317933) + False + >>> contains_an_even_digit(-245679) + True + """ + return any(digit in "02468" for digit in str(n)) + + +def find_circular_primes(limit: int = 1000000) -> list[int]: + """ + Return circular primes below limit. + >>> len(find_circular_primes(100)) + 13 + >>> len(find_circular_primes(1000000)) + 55 + """ + result = [2] # result already includes the number 2. + for num in range(3, limit + 1, 2): + if is_prime(num) and not contains_an_even_digit(num): + str_num = str(num) + list_nums = [int(str_num[j:] + str_num[:j]) for j in range(len(str_num))] + if all(is_prime(i) for i in list_nums): + result.append(num) + return result + + +def solution() -> int: + """ + >>> solution() + 55 + """ + return len(find_circular_primes()) + + +if __name__ == "__main__": + print(f"{len(find_circular_primes()) = }") diff --git a/python-mega-algo/project_euler/problem_036/__init__.py b/python-mega-algo/project_euler/problem_036/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/project_euler/problem_036/right.html b/python-mega-algo/project_euler/problem_036/right.html new file mode 100644 index 00000000..b117574a --- /dev/null +++ b/python-mega-algo/project_euler/problem_036/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/project_euler/problem_036 + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    sol1.py __init__.py 
    + +

    +Folders: 1
    +Files: 2
    +Size of all files: 1426 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/project_euler/problem_036/sol1.py b/python-mega-algo/project_euler/problem_036/sol1.py new file mode 100644 index 00000000..13a74986 --- /dev/null +++ b/python-mega-algo/project_euler/problem_036/sol1.py @@ -0,0 +1,69 @@ +""" +Project Euler Problem 36 +https://projecteuler.net/problem=36 + +Problem Statement: + +Double-base palindromes +Problem 36 +The decimal number, 585 = 10010010012 (binary), is palindromic in both bases. + +Find the sum of all numbers, less than one million, which are palindromic in +base 10 and base 2. + +(Please note that the palindromic number, in either base, may not include +leading zeros.) +""" + +from typing import Union + + +def is_palindrome(n: Union[int, str]) -> bool: + """ + Return true if the input n is a palindrome. + Otherwise return false. n can be an integer or a string. + + >>> is_palindrome(909) + True + >>> is_palindrome(908) + False + >>> is_palindrome('10101') + True + >>> is_palindrome('10111') + False + """ + n = str(n) + return True if n == n[::-1] else False + + +def solution(n: int = 1000000): + """Return the sum of all numbers, less than n , which are palindromic in + base 10 and base 2. + + >>> solution(1000000) + 872187 + >>> solution(500000) + 286602 + >>> solution(100000) + 286602 + >>> solution(1000) + 1772 + >>> solution(100) + 157 + >>> solution(10) + 25 + >>> solution(2) + 1 + >>> solution(1) + 0 + """ + total = 0 + + for i in range(1, n): + if is_palindrome(i) and is_palindrome(bin(i).split("b")[1]): + total += i + return total + + +if __name__ == "__main__": + print(solution(int(str(input().strip())))) diff --git a/python-mega-algo/project_euler/problem_037/__init__.py b/python-mega-algo/project_euler/problem_037/__init__.py new file mode 100644 index 00000000..792d6005 --- /dev/null +++ b/python-mega-algo/project_euler/problem_037/__init__.py @@ -0,0 +1 @@ +# diff --git a/python-mega-algo/project_euler/problem_037/right.html b/python-mega-algo/project_euler/problem_037/right.html new file mode 100644 index 00000000..ec700111 --- /dev/null +++ b/python-mega-algo/project_euler/problem_037/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/project_euler/problem_037 + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    sol1.py __init__.py 
    + +

    +Folders: 1
    +Files: 2
    +Size of all files: 2646 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/project_euler/problem_037/sol1.py b/python-mega-algo/project_euler/problem_037/sol1.py new file mode 100644 index 00000000..c36b5324 --- /dev/null +++ b/python-mega-algo/project_euler/problem_037/sol1.py @@ -0,0 +1,98 @@ +""" +The number 3797 has an interesting property. Being prime itself, it is possible +to continuously remove digits from left to right, and remain prime at each stage: +3797, 797, 97, and 7. Similarly we can work from right to left: 3797, 379, 37, and 3. + +Find the sum of the only eleven primes that are both truncatable from left to right +and right to left. + +NOTE: 2, 3, 5, and 7 are not considered to be truncatable primes. +""" + +from __future__ import annotations + +seive = [True] * 1000001 +seive[1] = False +i = 2 +while i * i <= 1000000: + if seive[i]: + for j in range(i * i, 1000001, i): + seive[j] = False + i += 1 + + +def is_prime(n: int) -> bool: + """ + Returns True if n is prime, + False otherwise, for 1 <= n <= 1000000 + >>> is_prime(87) + False + >>> is_prime(1) + False + >>> is_prime(25363) + False + """ + return seive[n] + + +def list_truncated_nums(n: int) -> list[int]: + """ + Returns a list of all left and right truncated numbers of n + >>> list_truncated_nums(927628) + [927628, 27628, 92762, 7628, 9276, 628, 927, 28, 92, 8, 9] + >>> list_truncated_nums(467) + [467, 67, 46, 7, 4] + >>> list_truncated_nums(58) + [58, 8, 5] + """ + str_num = str(n) + list_nums = [n] + for i in range(1, len(str_num)): + list_nums.append(int(str_num[i:])) + list_nums.append(int(str_num[:-i])) + return list_nums + + +def validate(n: int) -> bool: + """ + To optimize the approach, we will rule out the numbers above 1000, + whose first or last three digits are not prime + >>> validate(74679) + False + >>> validate(235693) + False + >>> validate(3797) + True + """ + if len(str(n)) > 3: + if not is_prime(int(str(n)[-3:])) or not is_prime(int(str(n)[:3])): + return False + return True + + +def compute_truncated_primes(count: int = 11) -> list[int]: + """ + Returns the list of truncated primes + >>> compute_truncated_primes(11) + [23, 37, 53, 73, 313, 317, 373, 797, 3137, 3797, 739397] + """ + list_truncated_primes = [] + num = 13 + while len(list_truncated_primes) != count: + if validate(num): + list_nums = list_truncated_nums(num) + if all(is_prime(i) for i in list_nums): + list_truncated_primes.append(num) + num += 2 + return list_truncated_primes + + +def solution() -> int: + """ + Returns the sum of truncated primes + """ + return sum(compute_truncated_primes(11)) + + +if __name__ == "__main__": + print(f"{sum(compute_truncated_primes(11)) = }") diff --git a/python-mega-algo/project_euler/problem_038/__init__.py b/python-mega-algo/project_euler/problem_038/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/project_euler/problem_038/right.html b/python-mega-algo/project_euler/problem_038/right.html new file mode 100644 index 00000000..3561248c --- /dev/null +++ b/python-mega-algo/project_euler/problem_038/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/project_euler/problem_038 + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    sol1.py __init__.py 
    + +

    +Folders: 1
    +Files: 2
    +Size of all files: 2380 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/project_euler/problem_038/sol1.py b/python-mega-algo/project_euler/problem_038/sol1.py new file mode 100644 index 00000000..6d54f6df --- /dev/null +++ b/python-mega-algo/project_euler/problem_038/sol1.py @@ -0,0 +1,77 @@ +""" +Project Euler Problem 38: https://projecteuler.net/problem=38 + +Take the number 192 and multiply it by each of 1, 2, and 3: + +192 × 1 = 192 +192 × 2 = 384 +192 × 3 = 576 + +By concatenating each product we get the 1 to 9 pandigital, 192384576. We will call +192384576 the concatenated product of 192 and (1,2,3) + +The same can be achieved by starting with 9 and multiplying by 1, 2, 3, 4, and 5, +giving the pandigital, 918273645, which is the concatenated product of 9 and +(1,2,3,4,5). + +What is the largest 1 to 9 pandigital 9-digit number that can be formed as the +concatenated product of an integer with (1,2, ... , n) where n > 1? + +Solution: +Since n>1, the largest candidate for the solution will be a concactenation of +a 4-digit number and its double, a 5-digit number. +Let a be the 4-digit number. +a has 4 digits => 1000 <= a < 10000 +2a has 5 digits => 10000 <= 2a < 100000 +=> 5000 <= a < 10000 + +The concatenation of a with 2a = a * 10^5 + 2a +so our candidate for a given a is 100002 * a. +We iterate through the search space 5000 <= a < 10000 in reverse order, +calculating the candidates for each a and checking if they are 1-9 pandigital. + +In case there are no 4-digit numbers that satisfy this property, we check +the 3-digit numbers with a similar formula (the example a=192 gives a lower +bound on the length of a): +a has 3 digits, etc... +=> 100 <= a < 334, candidate = a * 10^6 + 2a * 10^3 + 3a + = 1002003 * a +""" + +from typing import Union + + +def is_9_pandigital(n: int) -> bool: + """ + Checks whether n is a 9-digit 1 to 9 pandigital number. + >>> is_9_pandigital(12345) + False + >>> is_9_pandigital(156284973) + True + >>> is_9_pandigital(1562849733) + False + """ + s = str(n) + return len(s) == 9 and set(s) == set("123456789") + + +def solution() -> Union[int, None]: + """ + Return the largest 1 to 9 pandigital 9-digital number that can be formed as the + concatenated product of an integer with (1,2,...,n) where n > 1. + """ + for base_num in range(9999, 4999, -1): + candidate = 100002 * base_num + if is_9_pandigital(candidate): + return candidate + + for base_num in range(333, 99, -1): + candidate = 1002003 * base_num + if is_9_pandigital(candidate): + return candidate + + return None + + +if __name__ == "__main__": + print(f"{solution() = }") diff --git a/python-mega-algo/project_euler/problem_039/__init__.py b/python-mega-algo/project_euler/problem_039/__init__.py new file mode 100644 index 00000000..792d6005 --- /dev/null +++ b/python-mega-algo/project_euler/problem_039/__init__.py @@ -0,0 +1 @@ +# diff --git a/python-mega-algo/project_euler/problem_039/right.html b/python-mega-algo/project_euler/problem_039/right.html new file mode 100644 index 00000000..dc311808 --- /dev/null +++ b/python-mega-algo/project_euler/problem_039/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/project_euler/problem_039 + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    sol1.py __init__.py 
    + +

    +Folders: 1
    +Files: 2
    +Size of all files: 1707 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/project_euler/problem_039/sol1.py b/python-mega-algo/project_euler/problem_039/sol1.py new file mode 100644 index 00000000..4800833d --- /dev/null +++ b/python-mega-algo/project_euler/problem_039/sol1.py @@ -0,0 +1,55 @@ +""" +Problem 39: https://projecteuler.net/problem=39 + +If p is the perimeter of a right angle triangle with integral length sides, +{a,b,c}, there are exactly three solutions for p = 120. +{20,48,52}, {24,45,51}, {30,40,50} + +For which value of p ≤ 1000, is the number of solutions maximised? +""" + +from __future__ import annotations + +import typing +from collections import Counter + + +def pythagorean_triple(max_perimeter: int) -> typing.Counter[int]: + """ + Returns a dictionary with keys as the perimeter of a right angled triangle + and value as the number of corresponding triplets. + >>> pythagorean_triple(15) + Counter({12: 1}) + >>> pythagorean_triple(40) + Counter({12: 1, 30: 1, 24: 1, 40: 1, 36: 1}) + >>> pythagorean_triple(50) + Counter({12: 1, 30: 1, 24: 1, 40: 1, 36: 1, 48: 1}) + """ + triplets: typing.Counter[int] = Counter() + for base in range(1, max_perimeter + 1): + for perpendicular in range(base, max_perimeter + 1): + hypotenuse = (base * base + perpendicular * perpendicular) ** 0.5 + if hypotenuse == int(hypotenuse): + perimeter = int(base + perpendicular + hypotenuse) + if perimeter > max_perimeter: + continue + triplets[perimeter] += 1 + return triplets + + +def solution(n: int = 1000) -> int: + """ + Returns perimeter with maximum solutions. + >>> solution(100) + 90 + >>> solution(200) + 180 + >>> solution(1000) + 840 + """ + triplets = pythagorean_triple(n) + return triplets.most_common(1)[0][0] + + +if __name__ == "__main__": + print(f"Perimeter {solution()} has maximum solutions") diff --git a/python-mega-algo/project_euler/problem_040/__init__.py b/python-mega-algo/project_euler/problem_040/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/project_euler/problem_040/right.html b/python-mega-algo/project_euler/problem_040/right.html new file mode 100644 index 00000000..758ff73e --- /dev/null +++ b/python-mega-algo/project_euler/problem_040/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/project_euler/problem_040 + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    sol1.py __init__.py 
    + +

    +Folders: 1
    +Files: 2
    +Size of all files: 874 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/project_euler/problem_040/sol1.py b/python-mega-algo/project_euler/problem_040/sol1.py new file mode 100644 index 00000000..69be3777 --- /dev/null +++ b/python-mega-algo/project_euler/problem_040/sol1.py @@ -0,0 +1,45 @@ +""" +Champernowne's constant +Problem 40 +An irrational decimal fraction is created by concatenating the positive +integers: + +0.123456789101112131415161718192021... + +It can be seen that the 12th digit of the fractional part is 1. + +If dn represents the nth digit of the fractional part, find the value of the +following expression. + +d1 × d10 × d100 × d1000 × d10000 × d100000 × d1000000 +""" + + +def solution(): + """Returns + + >>> solution() + 210 + """ + constant = [] + i = 1 + + while len(constant) < 1e6: + constant.append(str(i)) + i += 1 + + constant = "".join(constant) + + return ( + int(constant[0]) + * int(constant[9]) + * int(constant[99]) + * int(constant[999]) + * int(constant[9999]) + * int(constant[99999]) + * int(constant[999999]) + ) + + +if __name__ == "__main__": + print(solution()) diff --git a/python-mega-algo/project_euler/problem_041/__init__.py b/python-mega-algo/project_euler/problem_041/__init__.py new file mode 100644 index 00000000..792d6005 --- /dev/null +++ b/python-mega-algo/project_euler/problem_041/__init__.py @@ -0,0 +1 @@ +# diff --git a/python-mega-algo/project_euler/problem_041/right.html b/python-mega-algo/project_euler/problem_041/right.html new file mode 100644 index 00000000..b2392235 --- /dev/null +++ b/python-mega-algo/project_euler/problem_041/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/project_euler/problem_041 + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    sol1.py __init__.py 
    + +

    +Folders: 1
    +Files: 2
    +Size of all files: 1527 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/project_euler/problem_041/sol1.py b/python-mega-algo/project_euler/problem_041/sol1.py new file mode 100644 index 00000000..c5f2bee4 --- /dev/null +++ b/python-mega-algo/project_euler/problem_041/sol1.py @@ -0,0 +1,56 @@ +""" +Pandigital prime +Problem 41: https://projecteuler.net/problem=41 + +We shall say that an n-digit number is pandigital if it makes use of all the digits +1 to n exactly once. For example, 2143 is a 4-digit pandigital and is also prime. +What is the largest n-digit pandigital prime that exists? + +All pandigital numbers except for 1, 4 ,7 pandigital numbers are divisible by 3. +So we will check only 7 digit pandigital numbers to obtain the largest possible +pandigital prime. +""" +from __future__ import annotations + +from itertools import permutations +from math import sqrt + + +def is_prime(n: int) -> bool: + """ + Returns True if n is prime, + False otherwise. + >>> is_prime(67483) + False + >>> is_prime(563) + True + >>> is_prime(87) + False + """ + if n % 2 == 0: + return False + for i in range(3, int(sqrt(n) + 1), 2): + if n % i == 0: + return False + return True + + +def solution(n: int = 7) -> int: + """ + Returns the maximum pandigital prime number of length n. + If there are none, then it will return 0. + >>> solution(2) + 0 + >>> solution(4) + 4231 + >>> solution(7) + 7652413 + """ + pandigital_str = "".join(str(i) for i in range(1, n + 1)) + perm_list = [int("".join(i)) for i in permutations(pandigital_str, n)] + pandigitals = [num for num in perm_list if is_prime(num)] + return max(pandigitals) if pandigitals else 0 + + +if __name__ == "__main__": + print(f"{solution() = }") diff --git a/python-mega-algo/project_euler/problem_042/__init__.py b/python-mega-algo/project_euler/problem_042/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/project_euler/problem_042/right.html b/python-mega-algo/project_euler/problem_042/right.html new file mode 100644 index 00000000..73e32f64 --- /dev/null +++ b/python-mega-algo/project_euler/problem_042/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/project_euler/problem_042 + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    solution42.py __init__.py words.txt 
    + +

    +Folders: 1
    +Files: 3
    +Size of all files: 17752 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/project_euler/problem_042/solution42.py b/python-mega-algo/project_euler/problem_042/solution42.py new file mode 100644 index 00000000..b3aecf4c --- /dev/null +++ b/python-mega-algo/project_euler/problem_042/solution42.py @@ -0,0 +1,47 @@ +""" +The nth term of the sequence of triangle numbers is given by, tn = ½n(n+1); so +the first ten triangle numbers are: + +1, 3, 6, 10, 15, 21, 28, 36, 45, 55, ... + +By converting each letter in a word to a number corresponding to its +alphabetical position and adding these values we form a word value. For example, +the word value for SKY is 19 + 11 + 25 = 55 = t10. If the word value is a +triangle number then we shall call the word a triangle word. + +Using words.txt (right click and 'Save Link/Target As...'), a 16K text file +containing nearly two-thousand common English words, how many are triangle +words? +""" +import os + +# Precomputes a list of the 100 first triangular numbers +TRIANGULAR_NUMBERS = [int(0.5 * n * (n + 1)) for n in range(1, 101)] + + +def solution(): + """ + Finds the amount of triangular words in the words file. + + >>> solution() + 162 + """ + script_dir = os.path.dirname(os.path.realpath(__file__)) + wordsFilePath = os.path.join(script_dir, "words.txt") + + words = "" + with open(wordsFilePath) as f: + words = f.readline() + + words = list(map(lambda word: word.strip('"'), words.strip("\r\n").split(","))) + words = list( + filter( + lambda word: word in TRIANGULAR_NUMBERS, + map(lambda word: sum(map(lambda x: ord(x) - 64, word)), words), + ) + ) + return len(words) + + +if __name__ == "__main__": + print(solution()) diff --git a/python-mega-algo/project_euler/problem_042/words.txt b/python-mega-algo/project_euler/problem_042/words.txt new file mode 100644 index 00000000..af3aeb42 --- /dev/null +++ b/python-mega-algo/project_euler/problem_042/words.txt @@ -0,0 +1 @@ +"A","ABILITY","ABLE","ABOUT","ABOVE","ABSENCE","ABSOLUTELY","ACADEMIC","ACCEPT","ACCESS","ACCIDENT","ACCOMPANY","ACCORDING","ACCOUNT","ACHIEVE","ACHIEVEMENT","ACID","ACQUIRE","ACROSS","ACT","ACTION","ACTIVE","ACTIVITY","ACTUAL","ACTUALLY","ADD","ADDITION","ADDITIONAL","ADDRESS","ADMINISTRATION","ADMIT","ADOPT","ADULT","ADVANCE","ADVANTAGE","ADVICE","ADVISE","AFFAIR","AFFECT","AFFORD","AFRAID","AFTER","AFTERNOON","AFTERWARDS","AGAIN","AGAINST","AGE","AGENCY","AGENT","AGO","AGREE","AGREEMENT","AHEAD","AID","AIM","AIR","AIRCRAFT","ALL","ALLOW","ALMOST","ALONE","ALONG","ALREADY","ALRIGHT","ALSO","ALTERNATIVE","ALTHOUGH","ALWAYS","AMONG","AMONGST","AMOUNT","AN","ANALYSIS","ANCIENT","AND","ANIMAL","ANNOUNCE","ANNUAL","ANOTHER","ANSWER","ANY","ANYBODY","ANYONE","ANYTHING","ANYWAY","APART","APPARENT","APPARENTLY","APPEAL","APPEAR","APPEARANCE","APPLICATION","APPLY","APPOINT","APPOINTMENT","APPROACH","APPROPRIATE","APPROVE","AREA","ARGUE","ARGUMENT","ARISE","ARM","ARMY","AROUND","ARRANGE","ARRANGEMENT","ARRIVE","ART","ARTICLE","ARTIST","AS","ASK","ASPECT","ASSEMBLY","ASSESS","ASSESSMENT","ASSET","ASSOCIATE","ASSOCIATION","ASSUME","ASSUMPTION","AT","ATMOSPHERE","ATTACH","ATTACK","ATTEMPT","ATTEND","ATTENTION","ATTITUDE","ATTRACT","ATTRACTIVE","AUDIENCE","AUTHOR","AUTHORITY","AVAILABLE","AVERAGE","AVOID","AWARD","AWARE","AWAY","AYE","BABY","BACK","BACKGROUND","BAD","BAG","BALANCE","BALL","BAND","BANK","BAR","BASE","BASIC","BASIS","BATTLE","BE","BEAR","BEAT","BEAUTIFUL","BECAUSE","BECOME","BED","BEDROOM","BEFORE","BEGIN","BEGINNING","BEHAVIOUR","BEHIND","BELIEF","BELIEVE","BELONG","BELOW","BENEATH","BENEFIT","BESIDE","BEST","BETTER","BETWEEN","BEYOND","BIG","BILL","BIND","BIRD","BIRTH","BIT","BLACK","BLOCK","BLOOD","BLOODY","BLOW","BLUE","BOARD","BOAT","BODY","BONE","BOOK","BORDER","BOTH","BOTTLE","BOTTOM","BOX","BOY","BRAIN","BRANCH","BREAK","BREATH","BRIDGE","BRIEF","BRIGHT","BRING","BROAD","BROTHER","BUDGET","BUILD","BUILDING","BURN","BUS","BUSINESS","BUSY","BUT","BUY","BY","CABINET","CALL","CAMPAIGN","CAN","CANDIDATE","CAPABLE","CAPACITY","CAPITAL","CAR","CARD","CARE","CAREER","CAREFUL","CAREFULLY","CARRY","CASE","CASH","CAT","CATCH","CATEGORY","CAUSE","CELL","CENTRAL","CENTRE","CENTURY","CERTAIN","CERTAINLY","CHAIN","CHAIR","CHAIRMAN","CHALLENGE","CHANCE","CHANGE","CHANNEL","CHAPTER","CHARACTER","CHARACTERISTIC","CHARGE","CHEAP","CHECK","CHEMICAL","CHIEF","CHILD","CHOICE","CHOOSE","CHURCH","CIRCLE","CIRCUMSTANCE","CITIZEN","CITY","CIVIL","CLAIM","CLASS","CLEAN","CLEAR","CLEARLY","CLIENT","CLIMB","CLOSE","CLOSELY","CLOTHES","CLUB","COAL","CODE","COFFEE","COLD","COLLEAGUE","COLLECT","COLLECTION","COLLEGE","COLOUR","COMBINATION","COMBINE","COME","COMMENT","COMMERCIAL","COMMISSION","COMMIT","COMMITMENT","COMMITTEE","COMMON","COMMUNICATION","COMMUNITY","COMPANY","COMPARE","COMPARISON","COMPETITION","COMPLETE","COMPLETELY","COMPLEX","COMPONENT","COMPUTER","CONCENTRATE","CONCENTRATION","CONCEPT","CONCERN","CONCERNED","CONCLUDE","CONCLUSION","CONDITION","CONDUCT","CONFERENCE","CONFIDENCE","CONFIRM","CONFLICT","CONGRESS","CONNECT","CONNECTION","CONSEQUENCE","CONSERVATIVE","CONSIDER","CONSIDERABLE","CONSIDERATION","CONSIST","CONSTANT","CONSTRUCTION","CONSUMER","CONTACT","CONTAIN","CONTENT","CONTEXT","CONTINUE","CONTRACT","CONTRAST","CONTRIBUTE","CONTRIBUTION","CONTROL","CONVENTION","CONVERSATION","COPY","CORNER","CORPORATE","CORRECT","COS","COST","COULD","COUNCIL","COUNT","COUNTRY","COUNTY","COUPLE","COURSE","COURT","COVER","CREATE","CREATION","CREDIT","CRIME","CRIMINAL","CRISIS","CRITERION","CRITICAL","CRITICISM","CROSS","CROWD","CRY","CULTURAL","CULTURE","CUP","CURRENT","CURRENTLY","CURRICULUM","CUSTOMER","CUT","DAMAGE","DANGER","DANGEROUS","DARK","DATA","DATE","DAUGHTER","DAY","DEAD","DEAL","DEATH","DEBATE","DEBT","DECADE","DECIDE","DECISION","DECLARE","DEEP","DEFENCE","DEFENDANT","DEFINE","DEFINITION","DEGREE","DELIVER","DEMAND","DEMOCRATIC","DEMONSTRATE","DENY","DEPARTMENT","DEPEND","DEPUTY","DERIVE","DESCRIBE","DESCRIPTION","DESIGN","DESIRE","DESK","DESPITE","DESTROY","DETAIL","DETAILED","DETERMINE","DEVELOP","DEVELOPMENT","DEVICE","DIE","DIFFERENCE","DIFFERENT","DIFFICULT","DIFFICULTY","DINNER","DIRECT","DIRECTION","DIRECTLY","DIRECTOR","DISAPPEAR","DISCIPLINE","DISCOVER","DISCUSS","DISCUSSION","DISEASE","DISPLAY","DISTANCE","DISTINCTION","DISTRIBUTION","DISTRICT","DIVIDE","DIVISION","DO","DOCTOR","DOCUMENT","DOG","DOMESTIC","DOOR","DOUBLE","DOUBT","DOWN","DRAW","DRAWING","DREAM","DRESS","DRINK","DRIVE","DRIVER","DROP","DRUG","DRY","DUE","DURING","DUTY","EACH","EAR","EARLY","EARN","EARTH","EASILY","EAST","EASY","EAT","ECONOMIC","ECONOMY","EDGE","EDITOR","EDUCATION","EDUCATIONAL","EFFECT","EFFECTIVE","EFFECTIVELY","EFFORT","EGG","EITHER","ELDERLY","ELECTION","ELEMENT","ELSE","ELSEWHERE","EMERGE","EMPHASIS","EMPLOY","EMPLOYEE","EMPLOYER","EMPLOYMENT","EMPTY","ENABLE","ENCOURAGE","END","ENEMY","ENERGY","ENGINE","ENGINEERING","ENJOY","ENOUGH","ENSURE","ENTER","ENTERPRISE","ENTIRE","ENTIRELY","ENTITLE","ENTRY","ENVIRONMENT","ENVIRONMENTAL","EQUAL","EQUALLY","EQUIPMENT","ERROR","ESCAPE","ESPECIALLY","ESSENTIAL","ESTABLISH","ESTABLISHMENT","ESTATE","ESTIMATE","EVEN","EVENING","EVENT","EVENTUALLY","EVER","EVERY","EVERYBODY","EVERYONE","EVERYTHING","EVIDENCE","EXACTLY","EXAMINATION","EXAMINE","EXAMPLE","EXCELLENT","EXCEPT","EXCHANGE","EXECUTIVE","EXERCISE","EXHIBITION","EXIST","EXISTENCE","EXISTING","EXPECT","EXPECTATION","EXPENDITURE","EXPENSE","EXPENSIVE","EXPERIENCE","EXPERIMENT","EXPERT","EXPLAIN","EXPLANATION","EXPLORE","EXPRESS","EXPRESSION","EXTEND","EXTENT","EXTERNAL","EXTRA","EXTREMELY","EYE","FACE","FACILITY","FACT","FACTOR","FACTORY","FAIL","FAILURE","FAIR","FAIRLY","FAITH","FALL","FAMILIAR","FAMILY","FAMOUS","FAR","FARM","FARMER","FASHION","FAST","FATHER","FAVOUR","FEAR","FEATURE","FEE","FEEL","FEELING","FEMALE","FEW","FIELD","FIGHT","FIGURE","FILE","FILL","FILM","FINAL","FINALLY","FINANCE","FINANCIAL","FIND","FINDING","FINE","FINGER","FINISH","FIRE","FIRM","FIRST","FISH","FIT","FIX","FLAT","FLIGHT","FLOOR","FLOW","FLOWER","FLY","FOCUS","FOLLOW","FOLLOWING","FOOD","FOOT","FOOTBALL","FOR","FORCE","FOREIGN","FOREST","FORGET","FORM","FORMAL","FORMER","FORWARD","FOUNDATION","FREE","FREEDOM","FREQUENTLY","FRESH","FRIEND","FROM","FRONT","FRUIT","FUEL","FULL","FULLY","FUNCTION","FUND","FUNNY","FURTHER","FUTURE","GAIN","GAME","GARDEN","GAS","GATE","GATHER","GENERAL","GENERALLY","GENERATE","GENERATION","GENTLEMAN","GET","GIRL","GIVE","GLASS","GO","GOAL","GOD","GOLD","GOOD","GOVERNMENT","GRANT","GREAT","GREEN","GREY","GROUND","GROUP","GROW","GROWING","GROWTH","GUEST","GUIDE","GUN","HAIR","HALF","HALL","HAND","HANDLE","HANG","HAPPEN","HAPPY","HARD","HARDLY","HATE","HAVE","HE","HEAD","HEALTH","HEAR","HEART","HEAT","HEAVY","HELL","HELP","HENCE","HER","HERE","HERSELF","HIDE","HIGH","HIGHLY","HILL","HIM","HIMSELF","HIS","HISTORICAL","HISTORY","HIT","HOLD","HOLE","HOLIDAY","HOME","HOPE","HORSE","HOSPITAL","HOT","HOTEL","HOUR","HOUSE","HOUSEHOLD","HOUSING","HOW","HOWEVER","HUGE","HUMAN","HURT","HUSBAND","I","IDEA","IDENTIFY","IF","IGNORE","ILLUSTRATE","IMAGE","IMAGINE","IMMEDIATE","IMMEDIATELY","IMPACT","IMPLICATION","IMPLY","IMPORTANCE","IMPORTANT","IMPOSE","IMPOSSIBLE","IMPRESSION","IMPROVE","IMPROVEMENT","IN","INCIDENT","INCLUDE","INCLUDING","INCOME","INCREASE","INCREASED","INCREASINGLY","INDEED","INDEPENDENT","INDEX","INDICATE","INDIVIDUAL","INDUSTRIAL","INDUSTRY","INFLUENCE","INFORM","INFORMATION","INITIAL","INITIATIVE","INJURY","INSIDE","INSIST","INSTANCE","INSTEAD","INSTITUTE","INSTITUTION","INSTRUCTION","INSTRUMENT","INSURANCE","INTEND","INTENTION","INTEREST","INTERESTED","INTERESTING","INTERNAL","INTERNATIONAL","INTERPRETATION","INTERVIEW","INTO","INTRODUCE","INTRODUCTION","INVESTIGATE","INVESTIGATION","INVESTMENT","INVITE","INVOLVE","IRON","IS","ISLAND","ISSUE","IT","ITEM","ITS","ITSELF","JOB","JOIN","JOINT","JOURNEY","JUDGE","JUMP","JUST","JUSTICE","KEEP","KEY","KID","KILL","KIND","KING","KITCHEN","KNEE","KNOW","KNOWLEDGE","LABOUR","LACK","LADY","LAND","LANGUAGE","LARGE","LARGELY","LAST","LATE","LATER","LATTER","LAUGH","LAUNCH","LAW","LAWYER","LAY","LEAD","LEADER","LEADERSHIP","LEADING","LEAF","LEAGUE","LEAN","LEARN","LEAST","LEAVE","LEFT","LEG","LEGAL","LEGISLATION","LENGTH","LESS","LET","LETTER","LEVEL","LIABILITY","LIBERAL","LIBRARY","LIE","LIFE","LIFT","LIGHT","LIKE","LIKELY","LIMIT","LIMITED","LINE","LINK","LIP","LIST","LISTEN","LITERATURE","LITTLE","LIVE","LIVING","LOAN","LOCAL","LOCATION","LONG","LOOK","LORD","LOSE","LOSS","LOT","LOVE","LOVELY","LOW","LUNCH","MACHINE","MAGAZINE","MAIN","MAINLY","MAINTAIN","MAJOR","MAJORITY","MAKE","MALE","MAN","MANAGE","MANAGEMENT","MANAGER","MANNER","MANY","MAP","MARK","MARKET","MARRIAGE","MARRIED","MARRY","MASS","MASTER","MATCH","MATERIAL","MATTER","MAY","MAYBE","ME","MEAL","MEAN","MEANING","MEANS","MEANWHILE","MEASURE","MECHANISM","MEDIA","MEDICAL","MEET","MEETING","MEMBER","MEMBERSHIP","MEMORY","MENTAL","MENTION","MERELY","MESSAGE","METAL","METHOD","MIDDLE","MIGHT","MILE","MILITARY","MILK","MIND","MINE","MINISTER","MINISTRY","MINUTE","MISS","MISTAKE","MODEL","MODERN","MODULE","MOMENT","MONEY","MONTH","MORE","MORNING","MOST","MOTHER","MOTION","MOTOR","MOUNTAIN","MOUTH","MOVE","MOVEMENT","MUCH","MURDER","MUSEUM","MUSIC","MUST","MY","MYSELF","NAME","NARROW","NATION","NATIONAL","NATURAL","NATURE","NEAR","NEARLY","NECESSARILY","NECESSARY","NECK","NEED","NEGOTIATION","NEIGHBOUR","NEITHER","NETWORK","NEVER","NEVERTHELESS","NEW","NEWS","NEWSPAPER","NEXT","NICE","NIGHT","NO","NOBODY","NOD","NOISE","NONE","NOR","NORMAL","NORMALLY","NORTH","NORTHERN","NOSE","NOT","NOTE","NOTHING","NOTICE","NOTION","NOW","NUCLEAR","NUMBER","NURSE","OBJECT","OBJECTIVE","OBSERVATION","OBSERVE","OBTAIN","OBVIOUS","OBVIOUSLY","OCCASION","OCCUR","ODD","OF","OFF","OFFENCE","OFFER","OFFICE","OFFICER","OFFICIAL","OFTEN","OIL","OKAY","OLD","ON","ONCE","ONE","ONLY","ONTO","OPEN","OPERATE","OPERATION","OPINION","OPPORTUNITY","OPPOSITION","OPTION","OR","ORDER","ORDINARY","ORGANISATION","ORGANISE","ORGANIZATION","ORIGIN","ORIGINAL","OTHER","OTHERWISE","OUGHT","OUR","OURSELVES","OUT","OUTCOME","OUTPUT","OUTSIDE","OVER","OVERALL","OWN","OWNER","PACKAGE","PAGE","PAIN","PAINT","PAINTING","PAIR","PANEL","PAPER","PARENT","PARK","PARLIAMENT","PART","PARTICULAR","PARTICULARLY","PARTLY","PARTNER","PARTY","PASS","PASSAGE","PAST","PATH","PATIENT","PATTERN","PAY","PAYMENT","PEACE","PENSION","PEOPLE","PER","PERCENT","PERFECT","PERFORM","PERFORMANCE","PERHAPS","PERIOD","PERMANENT","PERSON","PERSONAL","PERSUADE","PHASE","PHONE","PHOTOGRAPH","PHYSICAL","PICK","PICTURE","PIECE","PLACE","PLAN","PLANNING","PLANT","PLASTIC","PLATE","PLAY","PLAYER","PLEASE","PLEASURE","PLENTY","PLUS","POCKET","POINT","POLICE","POLICY","POLITICAL","POLITICS","POOL","POOR","POPULAR","POPULATION","POSITION","POSITIVE","POSSIBILITY","POSSIBLE","POSSIBLY","POST","POTENTIAL","POUND","POWER","POWERFUL","PRACTICAL","PRACTICE","PREFER","PREPARE","PRESENCE","PRESENT","PRESIDENT","PRESS","PRESSURE","PRETTY","PREVENT","PREVIOUS","PREVIOUSLY","PRICE","PRIMARY","PRIME","PRINCIPLE","PRIORITY","PRISON","PRISONER","PRIVATE","PROBABLY","PROBLEM","PROCEDURE","PROCESS","PRODUCE","PRODUCT","PRODUCTION","PROFESSIONAL","PROFIT","PROGRAM","PROGRAMME","PROGRESS","PROJECT","PROMISE","PROMOTE","PROPER","PROPERLY","PROPERTY","PROPORTION","PROPOSE","PROPOSAL","PROSPECT","PROTECT","PROTECTION","PROVE","PROVIDE","PROVIDED","PROVISION","PUB","PUBLIC","PUBLICATION","PUBLISH","PULL","PUPIL","PURPOSE","PUSH","PUT","QUALITY","QUARTER","QUESTION","QUICK","QUICKLY","QUIET","QUITE","RACE","RADIO","RAILWAY","RAIN","RAISE","RANGE","RAPIDLY","RARE","RATE","RATHER","REACH","REACTION","READ","READER","READING","READY","REAL","REALISE","REALITY","REALIZE","REALLY","REASON","REASONABLE","RECALL","RECEIVE","RECENT","RECENTLY","RECOGNISE","RECOGNITION","RECOGNIZE","RECOMMEND","RECORD","RECOVER","RED","REDUCE","REDUCTION","REFER","REFERENCE","REFLECT","REFORM","REFUSE","REGARD","REGION","REGIONAL","REGULAR","REGULATION","REJECT","RELATE","RELATION","RELATIONSHIP","RELATIVE","RELATIVELY","RELEASE","RELEVANT","RELIEF","RELIGION","RELIGIOUS","RELY","REMAIN","REMEMBER","REMIND","REMOVE","REPEAT","REPLACE","REPLY","REPORT","REPRESENT","REPRESENTATION","REPRESENTATIVE","REQUEST","REQUIRE","REQUIREMENT","RESEARCH","RESOURCE","RESPECT","RESPOND","RESPONSE","RESPONSIBILITY","RESPONSIBLE","REST","RESTAURANT","RESULT","RETAIN","RETURN","REVEAL","REVENUE","REVIEW","REVOLUTION","RICH","RIDE","RIGHT","RING","RISE","RISK","RIVER","ROAD","ROCK","ROLE","ROLL","ROOF","ROOM","ROUND","ROUTE","ROW","ROYAL","RULE","RUN","RURAL","SAFE","SAFETY","SALE","SAME","SAMPLE","SATISFY","SAVE","SAY","SCALE","SCENE","SCHEME","SCHOOL","SCIENCE","SCIENTIFIC","SCIENTIST","SCORE","SCREEN","SEA","SEARCH","SEASON","SEAT","SECOND","SECONDARY","SECRETARY","SECTION","SECTOR","SECURE","SECURITY","SEE","SEEK","SEEM","SELECT","SELECTION","SELL","SEND","SENIOR","SENSE","SENTENCE","SEPARATE","SEQUENCE","SERIES","SERIOUS","SERIOUSLY","SERVANT","SERVE","SERVICE","SESSION","SET","SETTLE","SETTLEMENT","SEVERAL","SEVERE","SEX","SEXUAL","SHAKE","SHALL","SHAPE","SHARE","SHE","SHEET","SHIP","SHOE","SHOOT","SHOP","SHORT","SHOT","SHOULD","SHOULDER","SHOUT","SHOW","SHUT","SIDE","SIGHT","SIGN","SIGNAL","SIGNIFICANCE","SIGNIFICANT","SILENCE","SIMILAR","SIMPLE","SIMPLY","SINCE","SING","SINGLE","SIR","SISTER","SIT","SITE","SITUATION","SIZE","SKILL","SKIN","SKY","SLEEP","SLIGHTLY","SLIP","SLOW","SLOWLY","SMALL","SMILE","SO","SOCIAL","SOCIETY","SOFT","SOFTWARE","SOIL","SOLDIER","SOLICITOR","SOLUTION","SOME","SOMEBODY","SOMEONE","SOMETHING","SOMETIMES","SOMEWHAT","SOMEWHERE","SON","SONG","SOON","SORRY","SORT","SOUND","SOURCE","SOUTH","SOUTHERN","SPACE","SPEAK","SPEAKER","SPECIAL","SPECIES","SPECIFIC","SPEECH","SPEED","SPEND","SPIRIT","SPORT","SPOT","SPREAD","SPRING","STAFF","STAGE","STAND","STANDARD","STAR","START","STATE","STATEMENT","STATION","STATUS","STAY","STEAL","STEP","STICK","STILL","STOCK","STONE","STOP","STORE","STORY","STRAIGHT","STRANGE","STRATEGY","STREET","STRENGTH","STRIKE","STRONG","STRONGLY","STRUCTURE","STUDENT","STUDIO","STUDY","STUFF","STYLE","SUBJECT","SUBSTANTIAL","SUCCEED","SUCCESS","SUCCESSFUL","SUCH","SUDDENLY","SUFFER","SUFFICIENT","SUGGEST","SUGGESTION","SUITABLE","SUM","SUMMER","SUN","SUPPLY","SUPPORT","SUPPOSE","SURE","SURELY","SURFACE","SURPRISE","SURROUND","SURVEY","SURVIVE","SWITCH","SYSTEM","TABLE","TAKE","TALK","TALL","TAPE","TARGET","TASK","TAX","TEA","TEACH","TEACHER","TEACHING","TEAM","TEAR","TECHNICAL","TECHNIQUE","TECHNOLOGY","TELEPHONE","TELEVISION","TELL","TEMPERATURE","TEND","TERM","TERMS","TERRIBLE","TEST","TEXT","THAN","THANK","THANKS","THAT","THE","THEATRE","THEIR","THEM","THEME","THEMSELVES","THEN","THEORY","THERE","THEREFORE","THESE","THEY","THIN","THING","THINK","THIS","THOSE","THOUGH","THOUGHT","THREAT","THREATEN","THROUGH","THROUGHOUT","THROW","THUS","TICKET","TIME","TINY","TITLE","TO","TODAY","TOGETHER","TOMORROW","TONE","TONIGHT","TOO","TOOL","TOOTH","TOP","TOTAL","TOTALLY","TOUCH","TOUR","TOWARDS","TOWN","TRACK","TRADE","TRADITION","TRADITIONAL","TRAFFIC","TRAIN","TRAINING","TRANSFER","TRANSPORT","TRAVEL","TREAT","TREATMENT","TREATY","TREE","TREND","TRIAL","TRIP","TROOP","TROUBLE","TRUE","TRUST","TRUTH","TRY","TURN","TWICE","TYPE","TYPICAL","UNABLE","UNDER","UNDERSTAND","UNDERSTANDING","UNDERTAKE","UNEMPLOYMENT","UNFORTUNATELY","UNION","UNIT","UNITED","UNIVERSITY","UNLESS","UNLIKELY","UNTIL","UP","UPON","UPPER","URBAN","US","USE","USED","USEFUL","USER","USUAL","USUALLY","VALUE","VARIATION","VARIETY","VARIOUS","VARY","VAST","VEHICLE","VERSION","VERY","VIA","VICTIM","VICTORY","VIDEO","VIEW","VILLAGE","VIOLENCE","VISION","VISIT","VISITOR","VITAL","VOICE","VOLUME","VOTE","WAGE","WAIT","WALK","WALL","WANT","WAR","WARM","WARN","WASH","WATCH","WATER","WAVE","WAY","WE","WEAK","WEAPON","WEAR","WEATHER","WEEK","WEEKEND","WEIGHT","WELCOME","WELFARE","WELL","WEST","WESTERN","WHAT","WHATEVER","WHEN","WHERE","WHEREAS","WHETHER","WHICH","WHILE","WHILST","WHITE","WHO","WHOLE","WHOM","WHOSE","WHY","WIDE","WIDELY","WIFE","WILD","WILL","WIN","WIND","WINDOW","WINE","WING","WINNER","WINTER","WISH","WITH","WITHDRAW","WITHIN","WITHOUT","WOMAN","WONDER","WONDERFUL","WOOD","WORD","WORK","WORKER","WORKING","WORKS","WORLD","WORRY","WORTH","WOULD","WRITE","WRITER","WRITING","WRONG","YARD","YEAH","YEAR","YES","YESTERDAY","YET","YOU","YOUNG","YOUR","YOURSELF","YOUTH" diff --git a/python-mega-algo/project_euler/problem_043/__init__.py b/python-mega-algo/project_euler/problem_043/__init__.py new file mode 100644 index 00000000..792d6005 --- /dev/null +++ b/python-mega-algo/project_euler/problem_043/__init__.py @@ -0,0 +1 @@ +# diff --git a/python-mega-algo/project_euler/problem_043/right.html b/python-mega-algo/project_euler/problem_043/right.html new file mode 100644 index 00000000..f066ee1b --- /dev/null +++ b/python-mega-algo/project_euler/problem_043/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/project_euler/problem_043 + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    sol1.py __init__.py 
    + +

    +Folders: 1
    +Files: 2
    +Size of all files: 1669 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/project_euler/problem_043/sol1.py b/python-mega-algo/project_euler/problem_043/sol1.py new file mode 100644 index 00000000..cff121b7 --- /dev/null +++ b/python-mega-algo/project_euler/problem_043/sol1.py @@ -0,0 +1,60 @@ +""" +Problem 43: https://projecteuler.net/problem=43 + +The number, 1406357289, is a 0 to 9 pandigital number because it is made up of +each of the digits 0 to 9 in some order, but it also has a rather interesting +sub-string divisibility property. + +Let d1 be the 1st digit, d2 be the 2nd digit, and so on. In this way, we note +the following: + +d2d3d4=406 is divisible by 2 +d3d4d5=063 is divisible by 3 +d4d5d6=635 is divisible by 5 +d5d6d7=357 is divisible by 7 +d6d7d8=572 is divisible by 11 +d7d8d9=728 is divisible by 13 +d8d9d10=289 is divisible by 17 +Find the sum of all 0 to 9 pandigital numbers with this property. +""" + + +from itertools import permutations + + +def is_substring_divisible(num: tuple) -> bool: + """ + Returns True if the pandigital number passes + all the divisibility tests. + >>> is_substring_divisible((0, 1, 2, 4, 6, 5, 7, 3, 8, 9)) + False + >>> is_substring_divisible((5, 1, 2, 4, 6, 0, 7, 8, 3, 9)) + False + >>> is_substring_divisible((1, 4, 0, 6, 3, 5, 7, 2, 8, 9)) + True + """ + tests = [2, 3, 5, 7, 11, 13, 17] + for i, test in enumerate(tests): + if (num[i + 1] * 100 + num[i + 2] * 10 + num[i + 3]) % test != 0: + return False + return True + + +def solution(n: int = 10) -> int: + """ + Returns the sum of all pandigital numbers which pass the + divisiility tests. + >>> solution(10) + 16695334890 + """ + list_nums = [ + int("".join(map(str, num))) + for num in permutations(range(n)) + if is_substring_divisible(num) + ] + + return sum(list_nums) + + +if __name__ == "__main__": + print(f"{solution() = }") diff --git a/python-mega-algo/project_euler/problem_044/__init__.py b/python-mega-algo/project_euler/problem_044/__init__.py new file mode 100644 index 00000000..792d6005 --- /dev/null +++ b/python-mega-algo/project_euler/problem_044/__init__.py @@ -0,0 +1 @@ +# diff --git a/python-mega-algo/project_euler/problem_044/right.html b/python-mega-algo/project_euler/problem_044/right.html new file mode 100644 index 00000000..fe7d9e6b --- /dev/null +++ b/python-mega-algo/project_euler/problem_044/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/project_euler/problem_044 + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    sol1.py __init__.py 
    + +

    +Folders: 1
    +Files: 2
    +Size of all files: 1482 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/project_euler/problem_044/sol1.py b/python-mega-algo/project_euler/problem_044/sol1.py new file mode 100644 index 00000000..940a2d04 --- /dev/null +++ b/python-mega-algo/project_euler/problem_044/sol1.py @@ -0,0 +1,47 @@ +""" +Problem 44: https://projecteuler.net/problem=44 + +Pentagonal numbers are generated by the formula, Pn=n(3n−1)/2. The first ten +pentagonal numbers are: +1, 5, 12, 22, 35, 51, 70, 92, 117, 145, ... +It can be seen that P4 + P7 = 22 + 70 = 92 = P8. However, their difference, +70 − 22 = 48, is not pentagonal. + +Find the pair of pentagonal numbers, Pj and Pk, for which their sum and difference +are pentagonal and D = |Pk − Pj| is minimised; what is the value of D? +""" + + +def is_pentagonal(n: int) -> bool: + """ + Returns True if n is pentagonal, False otherwise. + >>> is_pentagonal(330) + True + >>> is_pentagonal(7683) + False + >>> is_pentagonal(2380) + True + """ + root = (1 + 24 * n) ** 0.5 + return ((1 + root) / 6) % 1 == 0 + + +def solution(limit: int = 5000) -> int: + """ + Returns the minimum difference of two pentagonal numbers P1 and P2 such that + P1 + P2 is pentagonal and P2 - P1 is pentagonal. + >>> solution(5000) + 5482660 + """ + pentagonal_nums = [(i * (3 * i - 1)) // 2 for i in range(1, limit)] + for i, pentagonal_i in enumerate(pentagonal_nums): + for j in range(i, len(pentagonal_nums)): + pentagonal_j = pentagonal_nums[j] + a = pentagonal_i + pentagonal_j + b = pentagonal_j - pentagonal_i + if is_pentagonal(a) and is_pentagonal(b): + return b + + +if __name__ == "__main__": + print(f"{solution() = }") diff --git a/python-mega-algo/project_euler/problem_045/__init__.py b/python-mega-algo/project_euler/problem_045/__init__.py new file mode 100644 index 00000000..792d6005 --- /dev/null +++ b/python-mega-algo/project_euler/problem_045/__init__.py @@ -0,0 +1 @@ +# diff --git a/python-mega-algo/project_euler/problem_045/right.html b/python-mega-algo/project_euler/problem_045/right.html new file mode 100644 index 00000000..259de52e --- /dev/null +++ b/python-mega-algo/project_euler/problem_045/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/project_euler/problem_045 + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    sol1.py __init__.py 
    + +

    +Folders: 1
    +Files: 2
    +Size of all files: 1535 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/project_euler/problem_045/sol1.py b/python-mega-algo/project_euler/problem_045/sol1.py new file mode 100644 index 00000000..5a0201aa --- /dev/null +++ b/python-mega-algo/project_euler/problem_045/sol1.py @@ -0,0 +1,59 @@ +""" +Problem 45: https://projecteuler.net/problem=45 + +Triangle, pentagonal, and hexagonal numbers are generated by the following formulae: +Triangle T(n) = (n * (n + 1)) / 2 1, 3, 6, 10, 15, ... +Pentagonal P(n) = (n * (3 * n − 1)) / 2 1, 5, 12, 22, 35, ... +Hexagonal H(n) = n * (2 * n − 1) 1, 6, 15, 28, 45, ... +It can be verified that T(285) = P(165) = H(143) = 40755. + +Find the next triangle number that is also pentagonal and hexagonal. +All trinagle numbers are hexagonal numbers. +T(2n-1) = n * (2 * n - 1) = H(n) +So we shall check only for hexagonal numbers which are also pentagonal. +""" + + +def hexagonal_num(n: int) -> int: + """ + Returns nth hexagonal number + >>> hexagonal_num(143) + 40755 + >>> hexagonal_num(21) + 861 + >>> hexagonal_num(10) + 190 + """ + return n * (2 * n - 1) + + +def is_pentagonal(n: int) -> bool: + """ + Returns True if n is pentagonal, False otherwise. + >>> is_pentagonal(330) + True + >>> is_pentagonal(7683) + False + >>> is_pentagonal(2380) + True + """ + root = (1 + 24 * n) ** 0.5 + return ((1 + root) / 6) % 1 == 0 + + +def solution(start: int = 144) -> int: + """ + Returns the next number which is traingular, pentagonal and hexagonal. + >>> solution(144) + 1533776805 + """ + n = start + num = hexagonal_num(n) + while not is_pentagonal(num): + n += 1 + num = hexagonal_num(n) + return num + + +if __name__ == "__main__": + print(f"{solution()} = ") diff --git a/python-mega-algo/project_euler/problem_046/__init__.py b/python-mega-algo/project_euler/problem_046/__init__.py new file mode 100644 index 00000000..792d6005 --- /dev/null +++ b/python-mega-algo/project_euler/problem_046/__init__.py @@ -0,0 +1 @@ +# diff --git a/python-mega-algo/project_euler/problem_046/right.html b/python-mega-algo/project_euler/problem_046/right.html new file mode 100644 index 00000000..059a7bb8 --- /dev/null +++ b/python-mega-algo/project_euler/problem_046/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/project_euler/problem_046 + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    sol1.py __init__.py 
    + +

    +Folders: 1
    +Files: 2
    +Size of all files: 2274 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/project_euler/problem_046/sol1.py b/python-mega-algo/project_euler/problem_046/sol1.py new file mode 100644 index 00000000..4b56f44d --- /dev/null +++ b/python-mega-algo/project_euler/problem_046/sol1.py @@ -0,0 +1,95 @@ +""" +Problem 46: https://projecteuler.net/problem=46 + +It was proposed by Christian Goldbach that every odd composite number can be +written as the sum of a prime and twice a square. + +9 = 7 + 2 × 12 +15 = 7 + 2 × 22 +21 = 3 + 2 × 32 +25 = 7 + 2 × 32 +27 = 19 + 2 × 22 +33 = 31 + 2 × 12 + +It turns out that the conjecture was false. + +What is the smallest odd composite that cannot be written as the sum of a +prime and twice a square? +""" + +from __future__ import annotations + +seive = [True] * 100001 +i = 2 +while i * i <= 100000: + if seive[i]: + for j in range(i * i, 100001, i): + seive[j] = False + i += 1 + + +def is_prime(n: int) -> bool: + """ + Returns True if n is prime, + False otherwise, for 2 <= n <= 100000 + >>> is_prime(87) + False + >>> is_prime(23) + True + >>> is_prime(25363) + False + """ + return seive[n] + + +odd_composites = [num for num in range(3, len(seive), 2) if not is_prime(num)] + + +def compute_nums(n: int) -> list[int]: + """ + Returns a list of first n odd composite numbers which do + not follow the conjecture. + >>> compute_nums(1) + [5777] + >>> compute_nums(2) + [5777, 5993] + >>> compute_nums(0) + Traceback (most recent call last): + ... + ValueError: n must be >= 0 + >>> compute_nums("a") + Traceback (most recent call last): + ... + ValueError: n must be an integer + >>> compute_nums(1.1) + Traceback (most recent call last): + ... + ValueError: n must be an integer + + """ + if not isinstance(n, int): + raise ValueError("n must be an integer") + if n <= 0: + raise ValueError("n must be >= 0") + + list_nums = [] + for num in range(len(odd_composites)): + i = 0 + while 2 * i * i <= odd_composites[num]: + rem = odd_composites[num] - 2 * i * i + if is_prime(rem): + break + i += 1 + else: + list_nums.append(odd_composites[num]) + if len(list_nums) == n: + return list_nums + + +def solution() -> int: + """Return the solution to the problem""" + return compute_nums(1)[0] + + +if __name__ == "__main__": + print(f"{solution() = }") diff --git a/python-mega-algo/project_euler/problem_047/__init__.py b/python-mega-algo/project_euler/problem_047/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/project_euler/problem_047/right.html b/python-mega-algo/project_euler/problem_047/right.html new file mode 100644 index 00000000..0d874e92 --- /dev/null +++ b/python-mega-algo/project_euler/problem_047/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/project_euler/problem_047 + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    sol1.py __init__.py 
    + +

    +Folders: 1
    +Files: 2
    +Size of all files: 2565 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/project_euler/problem_047/sol1.py b/python-mega-algo/project_euler/problem_047/sol1.py new file mode 100644 index 00000000..1287e0d9 --- /dev/null +++ b/python-mega-algo/project_euler/problem_047/sol1.py @@ -0,0 +1,112 @@ +""" +Combinatoric selections + +Problem 47 + +The first two consecutive numbers to have two distinct prime factors are: + +14 = 2 × 7 +15 = 3 × 5 + +The first three consecutive numbers to have three distinct prime factors are: + +644 = 2² × 7 × 23 +645 = 3 × 5 × 43 +646 = 2 × 17 × 19. + +Find the first four consecutive integers to have four distinct prime factors each. +What is the first of these numbers? +""" + +from functools import lru_cache + + +def unique_prime_factors(n: int) -> set: + """ + Find unique prime factors of an integer. + Tests include sorting because only the set really matters, + not the order in which it is produced. + >>> sorted(set(unique_prime_factors(14))) + [2, 7] + >>> sorted(set(unique_prime_factors(644))) + [2, 7, 23] + >>> sorted(set(unique_prime_factors(646))) + [2, 17, 19] + """ + i = 2 + factors = set() + while i * i <= n: + if n % i: + i += 1 + else: + n //= i + factors.add(i) + if n > 1: + factors.add(n) + return factors + + +@lru_cache +def upf_len(num: int) -> int: + """ + Memoize upf() length results for a given value. + >>> upf_len(14) + 2 + """ + return len(unique_prime_factors(num)) + + +def equality(iterable: list) -> bool: + """ + Check equality of ALL elements in an interable. + >>> equality([1, 2, 3, 4]) + False + >>> equality([2, 2, 2, 2]) + True + >>> equality([1, 2, 3, 2, 1]) + False + """ + return len(set(iterable)) in (0, 1) + + +def run(n: int) -> list: + """ + Runs core process to find problem solution. + >>> run(3) + [644, 645, 646] + """ + + # Incrementor variable for our group list comprehension. + # This serves as the first number in each list of values + # to test. + base = 2 + + while True: + # Increment each value of a generated range + group = [base + i for i in range(n)] + + # Run elements through out unique_prime_factors function + # Append our target number to the end. + checker = [upf_len(x) for x in group] + checker.append(n) + + # If all numbers in the list are equal, return the group variable. + if equality(checker): + return group + + # Increment our base variable by 1 + base += 1 + + +def solution(n: int = 4) -> int: + """Return the first value of the first four consecutive integers to have four + distinct prime factors each. + >>> solution() + 134043 + """ + results = run(n) + return results[0] if len(results) else None + + +if __name__ == "__main__": + print(solution()) diff --git a/python-mega-algo/project_euler/problem_048/__init__.py b/python-mega-algo/project_euler/problem_048/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/project_euler/problem_048/right.html b/python-mega-algo/project_euler/problem_048/right.html new file mode 100644 index 00000000..d25c4ea2 --- /dev/null +++ b/python-mega-algo/project_euler/problem_048/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/project_euler/problem_048 + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    sol1.py __init__.py 
    + +

    +Folders: 1
    +Files: 2
    +Size of all files: 463 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/project_euler/problem_048/sol1.py b/python-mega-algo/project_euler/problem_048/sol1.py new file mode 100644 index 00000000..01ff702d --- /dev/null +++ b/python-mega-algo/project_euler/problem_048/sol1.py @@ -0,0 +1,25 @@ +""" +Self Powers +Problem 48 + +The series, 1^1 + 2^2 + 3^3 + ... + 10^10 = 10405071317. + +Find the last ten digits of the series, 1^1 + 2^2 + 3^3 + ... + 1000^1000. +""" + + +def solution(): + """ + Returns the last 10 digits of the series, 1^1 + 2^2 + 3^3 + ... + 1000^1000. + + >>> solution() + '9110846700' + """ + total = 0 + for i in range(1, 1001): + total += i ** i + return str(total)[-10:] + + +if __name__ == "__main__": + print(solution()) diff --git a/python-mega-algo/project_euler/problem_049/__init__.py b/python-mega-algo/project_euler/problem_049/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/project_euler/problem_049/right.html b/python-mega-algo/project_euler/problem_049/right.html new file mode 100644 index 00000000..ab8f9727 --- /dev/null +++ b/python-mega-algo/project_euler/problem_049/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/project_euler/problem_049 + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    sol1.py __init__.py 
    + +

    +Folders: 1
    +Files: 2
    +Size of all files: 3584 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/project_euler/problem_049/sol1.py b/python-mega-algo/project_euler/problem_049/sol1.py new file mode 100644 index 00000000..c0d0715b --- /dev/null +++ b/python-mega-algo/project_euler/problem_049/sol1.py @@ -0,0 +1,139 @@ +""" +Prime permutations + +Problem 49 + +The arithmetic sequence, 1487, 4817, 8147, in which each of +the terms increases by 3330, is unusual in two ways: +(i) each of the three terms are prime, +(ii) each of the 4-digit numbers are permutations of one another. + +There are no arithmetic sequences made up of three 1-, 2-, or 3-digit primes, +exhibiting this property, but there is one other 4-digit increasing sequence. + +What 12-digit number do you form by concatenating the three terms in this sequence? + +Solution: + +First, we need to generate all 4 digits prime numbers. Then greedy +all of them and use permutation to form new numbers. Use binary search +to check if the permutated numbers is in our prime list and include +them in a candidate list. + +After that, bruteforce all passed candidates sequences using +3 nested loops since we know the answer will be 12 digits. +The bruteforce of this solution will be about 1 sec. +""" + +from itertools import permutations +from math import floor, sqrt + + +def is_prime(number: int) -> bool: + """ + function to check whether the number is prime or not. + >>> is_prime(2) + True + >>> is_prime(6) + False + >>> is_prime(1) + False + >>> is_prime(-800) + False + >>> is_prime(104729) + True + """ + + if number < 2: + return False + + for i in range(2, floor(sqrt(number)) + 1): + if number % i == 0: + return False + + return True + + +def search(target: int, prime_list: list) -> bool: + """ + function to search a number in a list using Binary Search. + >>> search(3, [1, 2, 3]) + True + >>> search(4, [1, 2, 3]) + False + >>> search(101, list(range(-100, 100))) + False + """ + + left, right = 0, len(prime_list) - 1 + while left <= right: + middle = (left + right) // 2 + if prime_list[middle] == target: + return True + elif prime_list[middle] < target: + left = middle + 1 + else: + right = middle - 1 + + return False + + +def solution(): + """ + Return the solution of the problem. + >>> solution() + 296962999629 + """ + prime_list = [n for n in range(1001, 10000, 2) if is_prime(n)] + candidates = [] + + for number in prime_list: + tmp_numbers = [] + + for prime_member in permutations(list(str(number))): + prime = int("".join(prime_member)) + + if prime % 2 == 0: + continue + + if search(prime, prime_list): + tmp_numbers.append(prime) + + tmp_numbers.sort() + if len(tmp_numbers) >= 3: + candidates.append(tmp_numbers) + + passed = [] + for candidate in candidates: + length = len(candidate) + found = False + + for i in range(length): + for j in range(i + 1, length): + for k in range(j + 1, length): + if ( + abs(candidate[i] - candidate[j]) + == abs(candidate[j] - candidate[k]) + and len({candidate[i], candidate[j], candidate[k]}) == 3 + ): + passed.append( + sorted([candidate[i], candidate[j], candidate[k]]) + ) + found = True + + if found: + break + if found: + break + if found: + break + + answer = set() + for seq in passed: + answer.add("".join([str(i) for i in seq])) + + return max([int(x) for x in answer]) + + +if __name__ == "__main__": + print(solution()) diff --git a/python-mega-algo/project_euler/problem_050/__init__.py b/python-mega-algo/project_euler/problem_050/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/project_euler/problem_050/right.html b/python-mega-algo/project_euler/problem_050/right.html new file mode 100644 index 00000000..f87d833b --- /dev/null +++ b/python-mega-algo/project_euler/problem_050/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/project_euler/problem_050 + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    sol1.py __init__.py 
    + +

    +Folders: 1
    +Files: 2
    +Size of all files: 1931 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/project_euler/problem_050/sol1.py b/python-mega-algo/project_euler/problem_050/sol1.py new file mode 100644 index 00000000..7d142e5f --- /dev/null +++ b/python-mega-algo/project_euler/problem_050/sol1.py @@ -0,0 +1,85 @@ +""" +Project Euler Problem 50: https://projecteuler.net/problem=50 + +Consecutive prime sum + +The prime 41, can be written as the sum of six consecutive primes: +41 = 2 + 3 + 5 + 7 + 11 + 13 + +This is the longest sum of consecutive primes that adds to a prime below +one-hundred. + +The longest sum of consecutive primes below one-thousand that adds to a prime, +contains 21 terms, and is equal to 953. + +Which prime, below one-million, can be written as the sum of the most +consecutive primes? +""" +from typing import List + + +def prime_sieve(limit: int) -> List[int]: + """ + Sieve of Erotosthenes + Function to return all the prime numbers up to a number 'limit' + https://en.wikipedia.org/wiki/Sieve_of_Eratosthenes + + >>> prime_sieve(3) + [2] + + >>> prime_sieve(50) + [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47] + """ + is_prime = [True] * limit + is_prime[0] = False + is_prime[1] = False + is_prime[2] = True + + for i in range(3, int(limit ** 0.5 + 1), 2): + index = i * 2 + while index < limit: + is_prime[index] = False + index = index + i + + primes = [2] + + for i in range(3, limit, 2): + if is_prime[i]: + primes.append(i) + + return primes + + +def solution(ceiling: int = 1_000_000) -> int: + """ + Returns the biggest prime, below the celing, that can be written as the sum + of consecutive the most consecutive primes. + + >>> solution(500) + 499 + + >>> solution(1_000) + 953 + + >>> solution(10_000) + 9521 + """ + primes = prime_sieve(ceiling) + length = 0 + largest = 0 + + for i in range(len(primes)): + for j in range(i + length, len(primes)): + sol = sum(primes[i:j]) + if sol >= ceiling: + break + + if sol in primes: + length = j - i + largest = sol + + return largest + + +if __name__ == "__main__": + print(f"{solution() = }") diff --git a/python-mega-algo/project_euler/problem_051/__init__.py b/python-mega-algo/project_euler/problem_051/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/project_euler/problem_051/right.html b/python-mega-algo/project_euler/problem_051/right.html new file mode 100644 index 00000000..db7f9186 --- /dev/null +++ b/python-mega-algo/project_euler/problem_051/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/project_euler/problem_051 + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    sol1.py __init__.py 
    + +

    +Folders: 1
    +Files: 2
    +Size of all files: 2982 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/project_euler/problem_051/sol1.py b/python-mega-algo/project_euler/problem_051/sol1.py new file mode 100644 index 00000000..b160b5a2 --- /dev/null +++ b/python-mega-algo/project_euler/problem_051/sol1.py @@ -0,0 +1,111 @@ +""" +https://projecteuler.net/problem=51 +Prime digit replacements +Problem 51 + +By replacing the 1st digit of the 2-digit number *3, it turns out that six of +the nine possible values: 13, 23, 43, 53, 73, and 83, are all prime. + +By replacing the 3rd and 4th digits of 56**3 with the same digit, this 5-digit +number is the first example having seven primes among the ten generated numbers, +yielding the family: 56003, 56113, 56333, 56443, 56663, 56773, and 56993. +Consequently 56003, being the first member of this family, is the smallest prime +with this property. + +Find the smallest prime which, by replacing part of the number (not necessarily +adjacent digits) with the same digit, is part of an eight prime value family. +""" + +from collections import Counter +from typing import List + + +def prime_sieve(n: int) -> List[int]: + """ + Sieve of Erotosthenes + Function to return all the prime numbers up to a certain number + https://en.wikipedia.org/wiki/Sieve_of_Eratosthenes + + >>> prime_sieve(3) + [2] + + >>> prime_sieve(50) + [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47] + """ + is_prime = [True] * n + is_prime[0] = False + is_prime[1] = False + is_prime[2] = True + + for i in range(3, int(n ** 0.5 + 1), 2): + index = i * 2 + while index < n: + is_prime[index] = False + index = index + i + + primes = [2] + + for i in range(3, n, 2): + if is_prime[i]: + primes.append(i) + + return primes + + +def digit_replacements(number: int) -> List[List[int]]: + """ + Returns all the possible families of digit replacements in a number which + contains at least one repeating digit + + >>> digit_replacements(544) + [[500, 511, 522, 533, 544, 555, 566, 577, 588, 599]] + + >>> digit_replacements(3112) + [[3002, 3112, 3222, 3332, 3442, 3552, 3662, 3772, 3882, 3992]] + """ + number = str(number) + replacements = [] + digits = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"] + + for duplicate in Counter(number) - Counter(set(number)): + family = [int(number.replace(duplicate, digit)) for digit in digits] + replacements.append(family) + + return replacements + + +def solution(family_length: int = 8) -> int: + """ + Returns the solution of the problem + + >>> solution(2) + 229399 + + >>> solution(3) + 221311 + """ + numbers_checked = set() + + # Filter primes with less than 3 replaceable digits + primes = { + x for x in set(prime_sieve(1_000_000)) if len(str(x)) - len(set(str(x))) >= 3 + } + + for prime in primes: + if prime in numbers_checked: + continue + + replacements = digit_replacements(prime) + + for family in replacements: + numbers_checked.update(family) + primes_in_family = primes.intersection(family) + + if len(primes_in_family) != family_length: + continue + + return min(primes_in_family) + + +if __name__ == "__main__": + print(solution()) diff --git a/python-mega-algo/project_euler/problem_052/__init__.py b/python-mega-algo/project_euler/problem_052/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/project_euler/problem_052/right.html b/python-mega-algo/project_euler/problem_052/right.html new file mode 100644 index 00000000..7855082b --- /dev/null +++ b/python-mega-algo/project_euler/problem_052/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/project_euler/problem_052 + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    sol1.py __init__.py 
    + +

    +Folders: 1
    +Files: 2
    +Size of all files: 802 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/project_euler/problem_052/sol1.py b/python-mega-algo/project_euler/problem_052/sol1.py new file mode 100644 index 00000000..df5c46ae --- /dev/null +++ b/python-mega-algo/project_euler/problem_052/sol1.py @@ -0,0 +1,37 @@ +""" +Permuted multiples +Problem 52 + +It can be seen that the number, 125874, and its double, 251748, contain exactly +the same digits, but in a different order. + +Find the smallest positive integer, x, such that 2x, 3x, 4x, 5x, and 6x, +contain the same digits. +""" + + +def solution(): + """Returns the smallest positive integer, x, such that 2x, 3x, 4x, 5x, and + 6x, contain the same digits. + + >>> solution() + 142857 + """ + i = 1 + + while True: + if ( + sorted(list(str(i))) + == sorted(list(str(2 * i))) + == sorted(list(str(3 * i))) + == sorted(list(str(4 * i))) + == sorted(list(str(5 * i))) + == sorted(list(str(6 * i))) + ): + return i + + i += 1 + + +if __name__ == "__main__": + print(solution()) diff --git a/python-mega-algo/project_euler/problem_053/__init__.py b/python-mega-algo/project_euler/problem_053/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/project_euler/problem_053/right.html b/python-mega-algo/project_euler/problem_053/right.html new file mode 100644 index 00000000..4e6417d1 --- /dev/null +++ b/python-mega-algo/project_euler/problem_053/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/project_euler/problem_053 + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    sol1.py __init__.py 
    + +

    +Folders: 1
    +Files: 2
    +Size of all files: 967 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/project_euler/problem_053/sol1.py b/python-mega-algo/project_euler/problem_053/sol1.py new file mode 100644 index 00000000..0692bbe0 --- /dev/null +++ b/python-mega-algo/project_euler/problem_053/sol1.py @@ -0,0 +1,43 @@ +""" +Combinatoric selections +Problem 53 + +There are exactly ten ways of selecting three from five, 12345: + + 123, 124, 125, 134, 135, 145, 234, 235, 245, and 345 + +In combinatorics, we use the notation, 5C3 = 10. + +In general, + +nCr = n!/(r!(n−r)!),where r ≤ n, n! = n×(n−1)×...×3×2×1, and 0! = 1. +It is not until n = 23, that a value exceeds one-million: 23C10 = 1144066. + +How many, not necessarily distinct, values of nCr, for 1 ≤ n ≤ 100, are greater +than one-million? +""" +from math import factorial + + +def combinations(n, r): + return factorial(n) / (factorial(r) * factorial(n - r)) + + +def solution(): + """Returns the number of values of nCr, for 1 ≤ n ≤ 100, are greater than + one-million + + >>> solution() + 4075 + """ + total = 0 + + for i in range(1, 101): + for j in range(1, i + 1): + if combinations(i, j) > 1e6: + total += 1 + return total + + +if __name__ == "__main__": + print(solution()) diff --git a/python-mega-algo/project_euler/problem_054/__init__.py b/python-mega-algo/project_euler/problem_054/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/project_euler/problem_054/poker_hands.txt b/python-mega-algo/project_euler/problem_054/poker_hands.txt new file mode 100644 index 00000000..9ab00248 --- /dev/null +++ b/python-mega-algo/project_euler/problem_054/poker_hands.txt @@ -0,0 +1,1000 @@ +8C TS KC 9H 4S 7D 2S 5D 3S AC +5C AD 5D AC 9C 7C 5H 8D TD KS +3H 7H 6S KC JS QH TD JC 2D 8S +TH 8H 5C QS TC 9H 4D JC KS JS +7C 5H KC QH JD AS KH 4C AD 4S +5H KS 9C 7D 9H 8D 3S 5D 5C AH +6H 4H 5C 3H 2H 3S QH 5S 6S AS +TD 8C 4H 7C TC KC 4C 3H 7S KS +7C 9C 6D KD 3H 4C QS QC AC KH +JC 6S 5H 2H 2D KD 9D 7C AS JS +AD QH TH 9D 8H TS 6D 3S AS AC +2H 4S 5C 5S TC KC JD 6C TS 3C +QD AS 6H JS 2C 3D 9H KC 4H 8S +KD 8S 9S 7C 2S 3S 6D 6S 4H KC +3C 8C 2D 7D 4D 9S 4S QH 4H JD +8C KC 7S TC 2D TS 8H QD AC 5C +3D KH QD 6C 6S AD AS 8H 2H QS +6S 8D 4C 8S 6C QH TC 6D 7D 9D +2S 8D 8C 4C TS 9S 9D 9C AC 3D +3C QS 2S 4H JH 3D 2D TD 8S 9H +5H QS 8S 6D 3C 8C JD AS 7H 7D +6H TD 9D AS JH 6C QC 9S KD JC +AH 8S QS 4D TH AC TS 3C 3D 5C +5S 4D JS 3D 8H 6C TS 3S AD 8C +6D 7C 5D 5H 3S 5C JC 2H 5S 3D +5H 6H 2S KS 3D 5D JD 7H JS 8H +KH 4H AS JS QS QC TC 6D 7C KS +3D QS TS 2H JS 4D AS 9S JC KD +QD 5H 4D 5D KH 7H 3D JS KD 4H +2C 9H 6H 5C 9D 6C JC 2D TH 9S +7D 6D AS QD JH 4D JS 7C QS 5C +3H KH QD AD 8C 8H 3S TH 9D 5S +AH 9S 4D 9D 8S 4H JS 3C TC 8D +2C KS 5H QD 3S TS 9H AH AD 8S +5C 7H 5D KD 9H 4D 3D 2D KS AD +KS KC 9S 6D 2C QH 9D 9H TS TC +9C 6H 5D QH 4D AD 6D QC JS KH +9S 3H 9D JD 5C 4D 9H AS TC QH +2C 6D JC 9C 3C AD 9S KH 9D 7D +KC 9C 7C JC JS KD 3H AS 3C 7D +QD KH QS 2C 3S 8S 8H 9H 9C JC +QH 8D 3C KC 4C 4H 6D AD 9H 9D +3S KS QS 7H KH 7D 5H 5D JD AD +2H 2C 6H TH TC 7D 8D 4H 8C AS +4S 2H AC QC 3S 6D TH 4D 4C KH +4D TC KS AS 7C 3C 6D 2D 9H 6C +8C TD 5D QS 2C 7H 4C 9C 3H 9H +5H JH TS 7S TD 6H AD QD 8H 8S +5S AD 9C 8C 7C 8D 5H 9D 8S 2S +4H KH KS 9S 2S KC 5S AD 4S 7D +QS 9C QD 6H JS 5D AC 8D 2S AS +KH AC JC 3S 9D 9S 3C 9C 5S JS +AD 3C 3D KS 3S 5C 9C 8C TS 4S +JH 8D 5D 6H KD QS QD 3D 6C KC +8S JD 6C 3S 8C TC QC 3C QH JS +KC JC 8H 2S 9H 9C JH 8S 8C 9S +8S 2H QH 4D QC 9D KC AS TH 3C +8S 6H TH 7C 2H 6S 3C 3H AS 7S +QH 5S JS 4H 5H TS 8H AH AC JC +9D 8H 2S 4S TC JC 3C 7H 3H 5C +3D AD 3C 3S 4C QC AS 5D TH 8C +6S 9D 4C JS KH AH TS JD 8H AD +4C 6S 9D 7S AC 4D 3D 3S TC JD +AD 7H 6H 4H JH KC TD TS 7D 6S +8H JH TC 3S 8D 8C 9S 2C 5C 4D +2C 9D KC QH TH QS JC 9C 4H TS +QS 3C QD 8H KH 4H 8D TD 8S AC +7C 3C TH 5S 8H 8C 9C JD TC KD +QC TC JD TS 8C 3H 6H KD 7C TD +JH QS KS 9C 6D 6S AS 9H KH 6H +2H 4D AH 2D JH 6H TD 5D 4H JD +KD 8C 9S JH QD JS 2C QS 5C 7C +4S TC 7H 8D 2S 6H 7S 9C 7C KC +8C 5D 7H 4S TD QC 8S JS 4H KS +AD 8S JH 6D TD KD 7C 6C 2D 7D +JC 6H 6S JS 4H QH 9H AH 4C 3C +6H 5H AS 7C 7S 3D KH KC 5D 5C +JC 3D TD AS 4D 6D 6S QH JD KS +8C 7S 8S QH 2S JD 5C 7H AH QD +8S 3C 6H 6C 2C 8D TD 7D 4C 4D +5D QH KH 7C 2S 7H JS 6D QC QD +AD 6C 6S 7D TH 6H 2H 8H KH 4H +KS JS KD 5D 2D KH 7D 9C 8C 3D +9C 6D QD 3C KS 3S 7S AH JD 2D +AH QH AS JC 8S 8H 4C KC TH 7D +JC 5H TD 7C 5D KD 4C AD 8H JS +KC 2H AC AH 7D JH KH 5D 7S 6D +9S 5S 9C 6H 8S TD JD 9H 6C AC +7D 8S 6D TS KD 7H AC 5S 7C 5D +AH QC JC 4C TC 8C 2H TS 2C 7D +KD KC 6S 3D 7D 2S 8S 3H 5S 5C +8S 5D 8H 4C 6H KC 3H 7C 5S KD +JH 8C 3D 3C 6C KC TD 7H 7C 4C +JC KC 6H TS QS TD KS 8H 8C 9S +6C 5S 9C QH 7D AH KS KC 9S 2C +4D 4S 8H TD 9C 3S 7D 9D AS TH +6S 7D 3C 6H 5D KD 2C 5C 9D 9C +2H KC 3D AD 3H QD QS 8D JC 4S +8C 3H 9C 7C AD 5D JC 9D JS AS +5D 9H 5C 7H 6S 6C QC JC QD 9S +JC QS JH 2C 6S 9C QC 3D 4S TC +4H 5S 8D 3D 4D 2S KC 2H JS 2C +TD 3S TH KD 4D 7H JH JS KS AC +7S 8C 9S 2D 8S 7D 5C AD 9D AS +8C 7H 2S 6C TH 3H 4C 3S 8H AC +KD 5H JC 8H JD 2D 4H TD JH 5C +3D AS QH KS 7H JD 8S 5S 6D 5H +9S 6S TC QS JC 5C 5D 9C TH 8C +5H 3S JH 9H 2S 2C 6S 7S AS KS +8C QD JC QS TC QC 4H AC KH 6C +TC 5H 7D JH 4H 2H 8D JC KS 4D +5S 9C KH KD 9H 5C TS 3D 7D 2D +5H AS TC 4D 8C 2C TS 9D 3H 8D +6H 8D 2D 9H JD 6C 4S 5H 5S 6D +AD 9C JC 7D 6H 9S 6D JS 9H 3C +AD JH TC QS 4C 5D 9S 7C 9C AH +KD 6H 2H TH 8S QD KS 9D 9H AS +4H 8H 8D 5H 6C AH 5S AS AD 8S +QS 5D 4S 2H TD KS 5H AC 3H JC +9C 7D QD KD AC 6D 5H QH 6H 5S +KC AH QH 2H 7D QS 3H KS 7S JD +6C 8S 3H 6D KS QD 5D 5C 8H TC +9H 4D 4S 6S 9D KH QC 4H 6C JD +TD 2D QH 4S 6H JH KD 3C QD 8C +4S 6H 7C QD 9D AS AH 6S AD 3C +2C KC TH 6H 8D AH 5C 6D 8S 5D +TD TS 7C AD JC QD 9H 3C KC 7H +5D 4D 5S 8H 4H 7D 3H JD KD 2D +JH TD 6H QS 4S KD 5C 8S 7D 8H +AC 3D AS 8C TD 7H KH 5D 6C JD +9D KS 7C 6D QH TC JD KD AS KC +JH 8S 5S 7S 7D AS 2D 3D AD 2H +2H 5D AS 3C QD KC 6H 9H 9S 2C +9D 5D TH 4C JH 3H 8D TC 8H 9H +6H KD 2C TD 2H 6C 9D 2D JS 8C +KD 7S 3C 7C AS QH TS AD 8C 2S +QS 8H 6C JS 4C 9S QC AD TD TS +2H 7C TS TC 8C 3C 9H 2D 6D JC +TC 2H 8D JH KS 6D 3H TD TH 8H +9D TD 9H QC 5D 6C 8H 8C KC TS +2H 8C 3D AH 4D TH TC 7D 8H KC +TS 5C 2D 8C 6S KH AH 5H 6H KC +5S 5D AH TC 4C JD 8D 6H 8C 6C +KC QD 3D 8H 2D JC 9H 4H AD 2S +TD 6S 7D JS KD 4H QS 2S 3S 8C +4C 9H JH TS 3S 4H QC 5S 9S 9C +2C KD 9H JS 9S 3H JC TS 5D AC +AS 2H 5D AD 5H JC 7S TD JS 4C +2D 4S 8H 3D 7D 2C AD KD 9C TS +7H QD JH 5H JS AC 3D TH 4C 8H +6D KH KC QD 5C AD 7C 2D 4H AC +3D 9D TC 8S QD 2C JC 4H JD AH +6C TD 5S TC 8S AH 2C 5D AS AC +TH 7S 3D AS 6C 4C 7H 7D 4H AH +5C 2H KS 6H 7S 4H 5H 3D 3C 7H +3C 9S AC 7S QH 2H 3D 6S 3S 3H +2D 3H AS 2C 6H TC JS 6S 9C 6C +QH KD QD 6D AC 6H KH 2C TS 8C +8H 7D 3S 9H 5D 3H 4S QC 9S 5H +2D 9D 7H 6H 3C 8S 5H 4D 3S 4S +KD 9S 4S TC 7S QC 3S 8S 2H 7H +TC 3D 8C 3H 6C 2H 6H KS KD 4D +KC 3D 9S 3H JS 4S 8H 2D 6C 8S +6H QS 6C TC QD 9H 7D 7C 5H 4D +TD 9D 8D 6S 6C TC 5D TS JS 8H +4H KC JD 9H TC 2C 6S 5H 8H AS +JS 9C 5C 6S 9D JD 8H KC 4C 6D +4D 8D 8S 6C 7C 6H 7H 8H 5C KC +TC 3D JC 6D KS 9S 6H 7S 9C 2C +6C 3S KD 5H TS 7D 9H 9S 6H KH +3D QD 4C 6H TS AC 3S 5C 2H KD +4C AS JS 9S 7C TS 7H 9H JC KS +4H 8C JD 3H 6H AD 9S 4S 5S KS +4C 2C 7D 3D AS 9C 2S QS KC 6C +8S 5H 3D 2S AC 9D 6S 3S 4D TD +QD TH 7S TS 3D AC 7H 6C 5D QC +TC QD AD 9C QS 5C 8D KD 3D 3C +9D 8H AS 3S 7C 8S JD 2D 8D KC +4C TH AC QH JS 8D 7D 7S 9C KH +9D 8D 4C JH 2C 2S QD KD TS 4H +4D 6D 5D 2D JH 3S 8S 3H TC KH +AD 4D 2C QS 8C KD JH JD AH 5C +5C 6C 5H 2H JH 4H KS 7C TC 3H +3C 4C QC 5D JH 9C QD KH 8D TC +3H 9C JS 7H QH AS 7C 9H 5H JC +2D 5S QD 4S 3C KC 6S 6C 5C 4C +5D KH 2D TS 8S 9C AS 9S 7C 4C +7C AH 8C 8D 5S KD QH QS JH 2C +8C 9D AH 2H AC QC 5S 8H 7H 2C +QD 9H 5S QS QC 9C 5H JC TH 4H +6C 6S 3H 5H 3S 6H KS 8D AC 7S +AC QH 7H 8C 4S KC 6C 3D 3S TC +9D 3D JS TH AC 5H 3H 8S 3S TC +QD KH JS KS 9S QC 8D AH 3C AC +5H 6C KH 3S 9S JH 2D QD AS 8C +6C 4D 7S 7H 5S JC 6S 9H 4H JH +AH 5S 6H 9S AD 3S TH 2H 9D 8C +4C 8D 9H 7C QC AD 4S 9C KC 5S +9D 6H 4D TC 4C JH 2S 5D 3S AS +2H 6C 7C KH 5C AD QS TH JD 8S +3S 4S 7S AH AS KC JS 2S AD TH +JS KC 2S 7D 8C 5C 9C TS 5H 9D +7S 9S 4D TD JH JS KH 6H 5D 2C +JD JS JC TH 2D 3D QD 8C AC 5H +7S KH 5S 9D 5D TD 4S 6H 3C 2D +4S 5D AC 8D 4D 7C AD AS AH 9C +6S TH TS KS 2C QC AH AS 3C 4S +2H 8C 3S JC 5C 7C 3H 3C KH JH +7S 3H JC 5S 6H 4C 2S 4D KC 7H +4D 7C 4H 9S 8S 6S AD TC 6C JC +KH QS 3S TC 4C 8H 8S AC 3C TS +QD QS TH 3C TS 7H 7D AH TD JC +TD JD QC 4D 9S 7S TS AD 7D AC +AH 7H 4S 6D 7C 2H 9D KS JC TD +7C AH JD 4H 6D QS TS 2H 2C 5C +TC KC 8C 9S 4C JS 3C JC 6S AH +AS 7D QC 3D 5S JC JD 9D TD KH +TH 3C 2S 6H AH AC 5H 5C 7S 8H +QC 2D AC QD 2S 3S JD QS 6S 8H +KC 4H 3C 9D JS 6H 3S 8S AS 8C +7H KC 7D JD 2H JC QH 5S 3H QS +9H TD 3S 8H 7S AC 5C 6C AH 7C +8D 9H AH JD TD QS 7D 3S 9C 8S +AH QH 3C JD KC 4S 5S 5D TD KS +9H 7H 6S JH TH 4C 7C AD 5C 2D +7C KD 5S TC 9D 6S 6C 5D 2S TH +KC 9H 8D 5H 7H 4H QC 3D 7C AS +6S 8S QC TD 4S 5C TH QS QD 2S +8S 5H TH QC 9H 6S KC 7D 7C 5C +7H KD AH 4D KH 5C 4S 2D KC QH +6S 2C TD JC AS 4D 6C 8C 4H 5S +JC TC JD 5S 6S 8D AS 9D AD 3S +6D 6H 5D 5S TC 3D 7D QS 9D QD +4S 6C 8S 3S 7S AD KS 2D 7D 7C +KC QH JC AC QD 5D 8D QS 7H 7D +JS AH 8S 5H 3D TD 3H 4S 6C JH +4S QS 7D AS 9H JS KS 6D TC 5C +2D 5C 6H TC 4D QH 3D 9H 8S 6C +6D 7H TC TH 5S JD 5C 9C KS KD +8D TD QH 6S 4S 6C 8S KC 5C TC +5S 3D KS AC 4S 7D QD 4C TH 2S +TS 8H 9S 6S 7S QH 3C AH 7H 8C +4C 8C TS JS QC 3D 7D 5D 7S JH +8S 7S 9D QC AC 7C 6D 2H JH KC +JS KD 3C 6S 4S 7C AH QC KS 5H +KS 6S 4H JD QS TC 8H KC 6H AS +KH 7C TC 6S TD JC 5C 7D AH 3S +3H 4C 4H TC TH 6S 7H 6D 9C QH +7D 5H 4S 8C JS 4D 3D 8S QH KC +3H 6S AD 7H 3S QC 8S 4S 7S JS +3S JD KH TH 6H QS 9C 6C 2D QD +4S QH 4D 5H KC 7D 6D 8D TH 5S +TD AD 6S 7H KD KH 9H 5S KC JC +3H QC AS TS 4S QD KS 9C 7S KC +TS 6S QC 6C TH TC 9D 5C 5D KD +JS 3S 4H KD 4C QD 6D 9S JC 9D +8S JS 6D 4H JH 6H 6S 6C KS KH +AC 7D 5D TC 9S KH 6S QD 6H AS +AS 7H 6D QH 8D TH 2S KH 5C 5H +4C 7C 3D QC TC 4S KH 8C 2D JS +6H 5D 7S 5H 9C 9H JH 8S TH 7H +AS JS 2S QD KH 8H 4S AC 8D 8S +3H 4C TD KD 8C JC 5C QS 2D JD +TS 7D 5D 6C 2C QS 2H 3C AH KS +4S 7C 9C 7D JH 6C 5C 8H 9D QD +2S TD 7S 6D 9C 9S QS KH QH 5C +JC 6S 9C QH JH 8D 7S JS KH 2H +8D 5H TH KC 4D 4S 3S 6S 3D QS +2D JD 4C TD 7C 6D TH 7S JC AH +QS 7S 4C TH 9D TS AD 4D 3H 6H +2D 3H 7D JD 3D AS 2S 9C QC 8S +4H 9H 9C 2C 7S JH KD 5C 5D 6H +TC 9H 8H JC 3C 9S 8D KS AD KC +TS 5H JD QS QH QC 8D 5D KH AH +5D AS 8S 6S 4C AH QC QD TH 7H +3H 4H 7D 6S 4S 9H AS 8H JS 9D +JD 8C 2C 9D 7D 5H 5S 9S JC KD +KD 9C 4S QD AH 7C AD 9D AC TD +6S 4H 4S 9C 8D KS TC 9D JH 7C +5S JC 5H 4S QH AC 2C JS 2S 9S +8C 5H AS QD AD 5C 7D 8S QC TD +JC 4C 8D 5C KH QS 4D 6H 2H 2C +TH 4S 2D KC 3H QD AC 7H AD 9D +KH QD AS 8H TH KC 8D 7S QH 8C +JC 6C 7D 8C KH AD QS 2H 6S 2D +JC KH 2D 7D JS QC 5H 4C 5D AD +TS 3S AD 4S TD 2D TH 6S 9H JH +9H 2D QS 2C 4S 3D KH AS AC 9D +KH 6S 8H 4S KD 7D 9D TS QD QC +JH 5H AH KS AS AD JC QC 5S KH +5D 7D 6D KS KD 3D 7C 4D JD 3S +AC JS 8D 5H 9C 3H 4H 4D TS 2C +6H KS KH 9D 7C 2S 6S 8S 2H 3D +6H AC JS 7S 3S TD 8H 3H 4H TH +9H TC QC KC 5C KS 6H 4H AC 8S +TC 7D QH 4S JC TS 6D 6C AC KH +QH 7D 7C JH QS QD TH 3H 5D KS +3D 5S 8D JS 4C 2C KS 7H 9C 4H +5H 8S 4H TD 2C 3S QD QC 3H KC +QC JS KD 9C AD 5S 9D 7D 7H TS +8C JC KH 7C 7S 6C TS 2C QD TH +5S 9D TH 3C 7S QH 8S 9C 2H 5H +5D 9H 6H 2S JS KH 3H 7C 2H 5S +JD 5D 5S 2C TC 2S 6S 6C 3C 8S +4D KH 8H 4H 2D KS 3H 5C 2S 9H +3S 2D TD 7H 8S 6H JD KC 9C 8D +6S QD JH 7C 9H 5H 8S 8H TH TD +QS 7S TD 7D TS JC KD 7C 3C 2C +3C JD 8S 4H 2D 2S TD AS 4D AC +AH KS 6C 4C 4S 7D 8C 9H 6H AS +5S 3C 9S 2C QS KD 4D 4S AC 5D +2D TS 2C JS KH QH 5D 8C AS KC +KD 3H 6C TH 8S 7S KH 6H 9S AC +6H 7S 6C QS AH 2S 2H 4H 5D 5H +5H JC QD 2C 2S JD AS QC 6S 7D +6C TC AS KD 8H 9D 2C 7D JH 9S +2H 4C 6C AH 8S TD 3H TH 7C TS +KD 4S TS 6C QH 8D 9D 9C AH 7D +6D JS 5C QD QC 9C 5D 8C 2H KD +3C QH JH AD 6S AH KC 8S 6D 6H +3D 7C 4C 7S 5S 3S 6S 5H JC 3C +QH 7C 5H 3C 3S 8C TS 4C KD 9C +QD 3S 7S 5H 7H QH JC 7C 8C KD +3C KD KH 2S 4C TS AC 6S 2C 7C +2C KH 3C 4C 6H 4D 5H 5S 7S QD +4D 7C 8S QD TS 9D KS 6H KD 3C +QS 4D TS 7S 4C 3H QD 8D 9S TC +TS QH AC 6S 3C 9H 9D QS 8S 6H +3S 7S 5D 4S JS 2D 6C QH 6S TH +4C 4H AS JS 5D 3D TS 9C AC 8S +6S 9C 7C 3S 5C QS AD AS 6H 3C +9S 8C 7H 3H 6S 7C AS 9H JD KH +3D 3H 7S 4D 6C 7C AC 2H 9C TH +4H 5S 3H AC TC TH 9C 9H 9S 8D +8D 9H 5H 4D 6C 2H QD 6S 5D 3S +4C 5C JD QS 4D 3H TH AC QH 8C +QC 5S 3C 7H AD 4C KS 4H JD 6D +QS AH 3H KS 9H 2S JS JH 5H 2H +2H 5S TH 6S TS 3S KS 3C 5H JS +2D 9S 7H 3D KC JH 6D 7D JS TD +AC JS 8H 2C 8C JH JC 2D TH 7S +5D 9S 8H 2H 3D TC AH JC KD 9C +9D QD JC 2H 6D KH TS 9S QH TH +2C 8D 4S JD 5H 3H TH TC 9C KC +AS 3D 9H 7D 4D TH KH 2H 7S 3H +4H 7S KS 2S JS TS 8S 2H QD 8D +5S 6H JH KS 8H 2S QC AC 6S 3S +JC AS AD QS 8H 6C KH 4C 4D QD +2S 3D TS TD 9S KS 6S QS 5C 8D +3C 6D 4S QC KC JH QD TH KH AD +9H AH 4D KS 2S 8D JH JC 7C QS +2D 6C TH 3C 8H QD QH 2S 3S KS +6H 5D 9S 4C TS TD JS QD 9D JD +5H 8H KH 8S KS 7C TD AD 4S KD +2C 7C JC 5S AS 6C 7D 8S 5H 9C +6S QD 9S TS KH QS 5S QH 3C KC +7D 3H 3C KD 5C AS JH 7H 6H JD +9D 5C 9H KC 8H KS 4S AD 4D 2S +3S JD QD 8D 2S 7C 5S 6S 5H TS +6D 9S KC TD 3S 6H QD JD 5C 8D +5H 9D TS KD 8D 6H TD QC 4C 7D +6D 4S JD 9D AH 9S AS TD 9H QD +2D 5S 2H 9C 6H 9S TD QC 7D TC +3S 2H KS TS 2C 9C 8S JS 9D 7D +3C KC 6D 5D 6C 6H 8S AS 7S QS +JH 9S 2H 8D 4C 8H 9H AD TH KH +QC AS 2S JS 5C 6H KD 3H 7H 2C +QD 8H 2S 8D 3S 6D AH 2C TC 5C +JD JS TS 8S 3H 5D TD KC JC 6H +6S QS TC 3H 5D AH JC 7C 7D 4H +7C 5D 8H 9C 2H 9H JH KH 5S 2C +9C 7H 6S TH 3S QC QD 4C AC JD +2H 5D 9S 7D KC 3S QS 2D AS KH +2S 4S 2H 7D 5C TD TH QH 9S 4D +6D 3S TS 6H 4H KS 9D 8H 5S 2D +9H KS 4H 3S 5C 5D KH 6H 6S JS +KC AS 8C 4C JC KH QC TH QD AH +6S KH 9S 2C 5H TC 3C 7H JC 4D +JD 4S 6S 5S 8D 7H 7S 4D 4C 2H +7H 9H 5D KH 9C 7C TS TC 7S 5H +4C 8D QC TS 4S 9H 3D AD JS 7C +8C QS 5C 5D 3H JS AH KC 4S 9D +TS JD 8S QS TH JH KH 2D QD JS +JD QC 5D 6S 9H 3S 2C 8H 9S TS +2S 4C AD 7H JC 5C 2D 6D 4H 3D +7S JS 2C 4H 8C AD QD 9C 3S TD +JD TS 4C 6H 9H 7D QD 6D 3C AS +AS 7C 4C 6S 5D 5S 5C JS QC 4S +KD 6S 9S 7C 3C 5S 7D JH QD JS +4S 7S JH 2C 8S 5D 7H 3D QH AD +TD 6H 2H 8D 4H 2D 7C AD KH 5D +TS 3S 5H 2C QD AH 2S 5C KH TD +KC 4D 8C 5D AS 6C 2H 2S 9H 7C +KD JS QC TS QS KH JH 2C 5D AD +3S 5H KC 6C 9H 3H 2H AD 7D 7S +7S JS JH KD 8S 7D 2S 9H 7C 2H +9H 2D 8D QC 6S AD AS 8H 5H 6C +2S 7H 6C 6D 7D 8C 5D 9D JC 3C +7C 9C 7H JD 2H KD 3S KH AD 4S +QH AS 9H 4D JD KS KD TS KH 5H +4C 8H 5S 3S 3D 7D TD AD 7S KC +JS 8S 5S JC 8H TH 9C 4D 5D KC +7C 5S 9C QD 2C QH JS 5H 8D KH +TD 2S KS 3D AD KC 7S TC 3C 5D +4C 2S AD QS 6C 9S QD TH QH 5C +8C AD QS 2D 2S KC JD KS 6C JC +8D 4D JS 2H 5D QD 7S 7D QH TS +6S 7H 3S 8C 8S 9D QS 8H 6C 9S +4S TC 2S 5C QD 4D QS 6D TH 6S +3S 5C 9D 6H 8D 4C 7D TC 7C TD +AH 6S AS 7H 5S KD 3H 5H AC 4C +8D 8S AH KS QS 2C AD 6H 7D 5D +6H 9H 9S 2H QS 8S 9C 5D 2D KD +TS QC 5S JH 7D 7S TH 9S 9H AC +7H 3H 6S KC 4D 6D 5C 4S QD TS +TD 2S 7C QD 3H JH 9D 4H 7S 7H +KS 3D 4H 5H TC 2S AS 2D 6D 7D +8H 3C 7H TD 3H AD KC TH 9C KH +TC 4C 2C 9S 9D 9C 5C 2H JD 3C +3H AC TS 5D AD 8D 6H QC 6S 8C +2S TS 3S JD 7H 8S QH 4C 5S 8D +AC 4S 6C 3C KH 3D 7C 2D 8S 2H +4H 6C 8S TH 2H 4S 8H 9S 3H 7S +7C 4C 9C 2C 5C AS 5D KD 4D QH +9H 4H TS AS 7D 8D 5D 9S 8C 2H +QC KD AC AD 2H 7S AS 3S 2D 9S +2H QC 8H TC 6D QD QS 5D KH 3C +TH JD QS 4C 2S 5S AD 7H 3S AS +7H JS 3D 6C 3S 6D AS 9S AC QS +9C TS AS 8C TC 8S 6H 9D 8D 6C +4D JD 9C KC 7C 6D KS 3S 8C AS +3H 6S TC 8D TS 3S KC 9S 7C AS +8C QC 4H 4S 8S 6C 3S TC AH AC +4D 7D 5C AS 2H 6S TS QC AD TC +QD QC 8S 4S TH 3D AH TS JH 4H +5C 2D 9S 2C 3H 3C 9D QD QH 7D +KC 9H 6C KD 7S 3C 4D AS TC 2D +3D JS 4D 9D KS 7D TH QC 3H 3C +8D 5S 2H 9D 3H 8C 4C 4H 3C TH +JC TH 4S 6S JD 2D 4D 6C 3D 4C +TS 3S 2D 4H AC 2C 6S 2H JH 6H +TD 8S AD TC AH AC JH 9S 6S 7S +6C KC 4S JD 8D 9H 5S 7H QH AH +KD 8D TS JH 5C 5H 3H AD AS JS +2D 4H 3D 6C 8C 7S AD 5D 5C 8S +TD 5D 7S 9C 4S 5H 6C 8C 4C 8S +JS QH 9C AS 5C QS JC 3D QC 7C +JC 9C KH JH QS QC 2C TS 3D AD +5D JH AC 5C 9S TS 4C JD 8C KS +KC AS 2D KH 9H 2C 5S 4D 3D 6H +TH AH 2D 8S JC 3D 8C QH 7S 3S +8H QD 4H JC AS KH KS 3C 9S 6D +9S QH 7D 9C 4S AC 7H KH 4D KD +AH AD TH 6D 9C 9S KD KS QH 4H +QD 6H 9C 7C QS 6D 6S 9D 5S JH +AH 8D 5H QD 2H JC KS 4H KH 5S +5C 2S JS 8D 9C 8C 3D AS KC AH +JD 9S 2H QS 8H 5S 8C TH 5C 4C +QC QS 8C 2S 2C 3S 9C 4C KS KH +2D 5D 8S AH AD TD 2C JS KS 8C +TC 5S 5H 8H QC 9H 6H JD 4H 9S +3C JH 4H 9H AH 4S 2H 4C 8D AC +8S TH 4D 7D 6D QD QS 7S TC 7C +KH 6D 2D JD 5H JS QD JH 4H 4S +9C 7S JH 4S 3S TS QC 8C TC 4H +QH 9D 4D JH QS 3S 2C 7C 6C 2D +4H 9S JD 5C 5H AH 9D TS 2D 4C +KS JH TS 5D 2D AH JS 7H AS 8D +JS AH 8C AD KS 5S 8H 2C 6C TH +2H 5D AD AC KS 3D 8H TS 6H QC +6D 4H TS 9C 5H JS JH 6S JD 4C +JH QH 4H 2C 6D 3C 5D 4C QS KC +6H 4H 6C 7H 6S 2S 8S KH QC 8C +3H 3D 5D KS 4H TD AD 3S 4D TS +5S 7C 8S 7D 2C KS 7S 6C 8C JS +5D 2H 3S 7C 5C QD 5H 6D 9C 9H +JS 2S KD 9S 8D TD TS AC 8C 9D +5H QD 2S AC 8C 9H KS 7C 4S 3C +KH AS 3H 8S 9C JS QS 4S AD 4D +AS 2S TD AD 4D 9H JC 4C 5H QS +5D 7C 4H TC 2D 6C JS 4S KC 3S +4C 2C 5D AC 9H 3D JD 8S QS QH +2C 8S 6H 3C QH 6D TC KD AC AH +QC 6C 3S QS 4S AC 8D 5C AD KH +5S 4C AC KH AS QC 2C 5C 8D 9C +8H JD 3C KH 8D 5C 9C QD QH 9D +7H TS 2C 8C 4S TD JC 9C 5H QH +JS 4S 2C 7C TH 6C AS KS 7S JD +JH 7C 9H 7H TC 5H 3D 6D 5D 4D +2C QD JH 2H 9D 5S 3D TD AD KS +JD QH 3S 4D TH 7D 6S QS KS 4H +TC KS 5S 8D 8H AD 2S 2D 4C JH +5S JH TC 3S 2D QS 9D 4C KD 9S +AC KH 3H AS 9D KC 9H QD 6C 6S +9H 7S 3D 5C 7D KC TD 8H 4H 6S +3C 7H 8H TC QD 4D 7S 6S QH 6C +6D AD 4C QD 6C 5D 7D 9D KS TS +JH 2H JD 9S 7S TS KH 8D 5D 8H +2D 9S 4C 7D 9D 5H QD 6D AC 6S +7S 6D JC QD JH 4C 6S QS 2H 7D +8C TD JH KD 2H 5C QS 2C JS 7S +TC 5H 4H JH QD 3S 5S 5D 8S KH +KS KH 7C 2C 5D JH 6S 9C 6D JC +5H AH JD 9C JS KC 2H 6H 4D 5S +AS 3C TH QC 6H 9C 8S 8C TD 7C +KC 2C QD 9C KH 4D 7S 3C TS 9H +9C QC 2S TS 8C TD 9S QD 3S 3C +4D 9D TH JH AH 6S 2S JD QH JS +QD 9H 6C KD 7D 7H 5D 6S 8H AH +8H 3C 4S 2H 5H QS QH 7S 4H AC +QS 3C 7S 9S 4H 3S AH KS 9D 7C +AD 5S 6S 2H 2D 5H TC 4S 3C 8C +QH TS 6S 4D JS KS JH AS 8S 6D +2C 8S 2S TD 5H AS TC TS 6C KC +KC TS 8H 2H 3H 7C 4C 5S TH TD +KD AD KH 7H 7S 5D 5H 5S 2D 9C +AD 9S 3D 7S 8C QC 7C 9C KD KS +3C QC 9S 8C 4D 5C AS QD 6C 2C +2H KC 8S JD 7S AC 8D 5C 2S 4D +9D QH 3D 2S TC 3S KS 3C 9H TD +KD 6S AC 2C 7H 5H 3S 6C 6H 8C +QH TC 8S 6S KH TH 4H 5D TS 4D +8C JS 4H 6H 2C 2H 7D AC QD 3D +QS KC 6S 2D 5S 4H TD 3H JH 4C +7S 5H 7H 8H KH 6H QS TH KD 7D +5H AD KD 7C KH 5S TD 6D 3C 6C +8C 9C 5H JD 7C KC KH 7H 2H 3S +7S 4H AD 4D 8S QS TH 3D 7H 5S +8D TC KS KD 9S 6D AD JD 5C 2S +7H 8H 6C QD 2H 6H 9D TC 9S 7C +8D 6D 4C 7C 6C 3C TH KH JS JH +5S 3S 8S JS 9H AS AD 8H 7S KD +JH 7C 2C KC 5H AS AD 9C 9S JS +AD AC 2C 6S QD 7C 3H TH KS KD +9D JD 4H 8H 4C KH 7S TS 8C KC +3S 5S 2H 7S 6H 7D KS 5C 6D AD +5S 8C 9H QS 7H 7S 2H 6C 7D TD +QS 5S TD AC 9D KC 3D TC 2D 4D +TD 2H 7D JD QD 4C 7H 5D KC 3D +4C 3H 8S KD QH 5S QC 9H TC 5H +9C QD TH 5H TS 5C 9H AH QH 2C +4D 6S 3C AC 6C 3D 2C 2H TD TH +AC 9C 5D QC 4D AD 8D 6D 8C KC +AD 3C 4H AC 8D 8H 7S 9S TD JC +4H 9H QH JS 2D TH TD TC KD KS +5S 6S 9S 8D TH AS KH 5H 5C 8S +JD 2S 9S 6S 5S 8S 5D 7S 7H 9D +5D 8C 4C 9D AD TS 2C 7D KD TC +8S QS 4D KC 5C 8D 4S KH JD KD +AS 5C AD QH 7D 2H 9S 7H 7C TC +2S 8S JD KH 7S 6C 6D AD 5D QC +9H 6H 3S 8C 8H AH TC 4H JS TD +2C TS 4D 7H 2D QC 9C 5D TH 7C +6C 8H QC 5D TS JH 5C 5H 9H 4S +2D QC 7H AS JS 8S 2H 4C 4H 8D +JS 6S AC KD 3D 3C 4S 7H TH KC +QH KH 6S QS 5S 4H 3C QD 3S 3H +7H AS KH 8C 4H 9C 5S 3D 6S TS +9C 7C 3H 5S QD 2C 3D AD AC 5H +JH TD 2D 4C TS 3H KH AD 3S 7S +AS 4C 5H 4D 6S KD JC 3C 6H 2D +3H 6S 8C 2D TH 4S AH QH AD 5H +7C 2S 9H 7H KC 5C 6D 5S 3H JC +3C TC 9C 4H QD TD JH 6D 9H 5S +7C 6S 5C 5D 6C 4S 7H 9H 6H AH +AD 2H 7D KC 2C 4C 2S 9S 7H 3S +TH 4C 8S 6S 3S AD KS AS JH TD +5C TD 4S 4D AD 6S 5D TC 9C 7D +8H 3S 4D 4S 5S 6H 5C AC 3H 3D +9H 3C AC 4S QS 8S 9D QH 5H 4D +JC 6C 5H TS AC 9C JD 8C 7C QD +8S 8H 9C JD 2D QC QH 6H 3C 8D +KS JS 2H 6H 5H QH QS 3H 7C 6D +TC 3H 4S 7H QC 2H 3S 8C JS KH +AH 8H 5S 4C 9H JD 3H 7S JC AC +3C 2D 4C 5S 6C 4S QS 3S JD 3D +5H 2D TC AH KS 6D 7H AD 8C 6H +6C 7S 3C JD 7C 8H KS KH AH 6D +AH 7D 3H 8H 8S 7H QS 5H 9D 2D +JD AC 4H 7S 8S 9S KS AS 9D QH +7S 2C 8S 5S JH QS JC AH KD 4C +AH 2S 9H 4H 8D TS TD 6H QH JD +4H JC 3H QS 6D 7S 9C 8S 9D 8D +5H TD 4S 9S 4C 8C 8D 7H 3H 3D +QS KH 3S 2C 2S 3C 7S TD 4S QD +7C TD 4D 5S KH AC AS 7H 4C 6C +2S 5H 6D JD 9H QS 8S 2C 2H TD +2S TS 6H 9H 7S 4H JC 4C 5D 5S +2C 5H 7D 4H 3S QH JC JS 6D 8H +4C QH 7C QD 3S AD TH 8S 5S TS +9H TC 2S TD JC 7D 3S 3D TH QH +7D 4C 8S 5C JH 8H 6S 3S KC 3H +JC 3H KH TC QH TH 6H 2C AC 5H +QS 2H 9D 2C AS 6S 6C 2S 8C 8S +9H 7D QC TH 4H KD QS AC 7S 3C +4D JH 6S 5S 8H KS 9S QC 3S AS +JD 2D 6S 7S TC 9H KC 3H 7D KD +2H KH 7C 4D 4S 3H JS QD 7D KC +4C JC AS 9D 3C JS 6C 8H QD 4D +AH JS 3S 6C 4C 3D JH 6D 9C 9H +9H 2D 8C 7H 5S KS 6H 9C 2S TC +6C 8C AD 7H 6H 3D KH AS 5D TH +KS 8C 3S TS 8S 4D 5S 9S 6C 4H +9H 4S 4H 5C 7D KC 2D 2H 9D JH +5C JS TC 9D 9H 5H 7S KH JC 6S +7C 9H 8H 4D JC KH JD 2H TD TC +8H 6C 2H 2C KH 6H 9D QS QH 5H +AC 7D 2S 3D QD JC 2D 8D JD JH +2H JC 2D 7H 2C 3C 8D KD TD 4H +3S 4H 6D 8D TS 3H TD 3D 6H TH +JH JC 3S AC QH 9H 7H 8S QC 2C +7H TD QS 4S 8S 9C 2S 5D 4D 2H +3D TS 3H 2S QC 8H 6H KC JC KS +5D JD 7D TC 8C 6C 9S 3D 8D AC +8H 6H JH 6C 5D 8D 8S 4H AD 2C +9D 4H 2D 2C 3S TS AS TC 3C 5D +4D TH 5H KS QS 6C 4S 2H 3D AD +5C KC 6H 2C 5S 3C 4D 2D 9H 9S +JD 4C 3H TH QH 9H 5S AH 8S AC +7D 9S 6S 2H TD 9C 4H 8H QS 4C +3C 6H 5D 4H 8C 9C KC 6S QD QS +3S 9H KD TC 2D JS 8C 6S 4H 4S +2S 4C 8S QS 6H KH 3H TH 8C 5D +2C KH 5S 3S 7S 7H 6C 9D QD 8D +8H KS AC 2D KH TS 6C JS KC 7H +9C KS 5C TD QC AH 6C 5H 9S 7C +5D 4D 3H 4H 6S 7C 7S AH QD TD +2H 7D QC 6S TC TS AH 7S 9D 3H +TH 5H QD 9S KS 7S 7C 6H 8C TD +TH 2D 4D QC 5C 7D JD AH 9C 4H +4H 3H AH 8D 6H QC QH 9H 2H 2C +2D AD 4C TS 6H 7S TH 4H QS TD +3C KD 2H 3H QS JD TC QC 5D 8H +KS JC QD TH 9S KD 8D 8C 2D 9C +3C QD KD 6D 4D 8D AH AD QC 8S +8H 3S 9D 2S 3H KS 6H 4C 7C KC +TH 9S 5C 3D 7D 6H AC 7S 4D 2C +5C 3D JD 4D 2D 6D 5H 9H 4C KH +AS 7H TD 6C 2H 3D QD KS 4C 4S +JC 3C AC 7C JD JS 8H 9S QC 5D +JD 6S 5S 2H AS 8C 7D 5H JH 3D +8D TC 5S 9S 8S 3H JC 5H 7S AS +5C TD 3D 7D 4H 8D 7H 4D 5D JS +QS 9C KS TD 2S 8S 5C 2H 4H AS +TH 7S 4H 7D 3H JD KD 5D 2S KC +JD 7H 4S 8H 4C JS 6H QH 5S 4H +2C QS 8C 5S 3H QC 2S 6C QD AD +8C 3D JD TC 4H 2H AD 5S AC 2S +5D 2C JS 2D AD 9D 3D 4C 4S JH +8D 5H 5D 6H 7S 4D KS 9D TD JD +3D 6D 9C 2S AS 7D 5S 5C 8H JD +7C 8S 3S 6S 5H JD TC AD 7H 7S +2S 9D TS 4D AC 8D 6C QD JD 3H +9S KH 2C 3C AC 3D 5H 6H 8D 5D +KS 3D 2D 6S AS 4C 2S 7C 7H KH +AC 2H 3S JC 5C QH 4D 2D 5H 7S +TS AS JD 8C 6H JC 8S 5S 2C 5D +7S QH 7H 6C QC 8H 2D 7C JD 2S +2C QD 2S 2H JC 9C 5D 2D JD JH +7C 5C 9C 8S 7D 6D 8D 6C 9S JH +2C AD 6S 5H 3S KS 7S 9D KH 4C +7H 6C 2C 5C TH 9D 8D 3S QC AH +5S KC 6H TC 5H 8S TH 6D 3C AH +9C KD 4H AD TD 9S 4S 7D 6H 5D +7H 5C 5H 6D AS 4C KD KH 4H 9D +3C 2S 5C 6C JD QS 2H 9D 7D 3H +AC 2S 6S 7S JS QD 5C QS 6H AD +5H TH QC 7H TC 3S 7C 6D KC 3D +4H 3D QC 9S 8H 2C 3S JC KS 5C +4S 6S 2C 6H 8S 3S 3D 9H 3H JS +4S 8C 4D 2D 8H 9H 7D 9D AH TS +9S 2C 9H 4C 8D AS 7D 3D 6D 5S +6S 4C 7H 8C 3H 5H JC AH 9D 9C +2S 7C 5S JD 8C 3S 3D 4D 7D 6S +3C KC 4S 5D 7D 3D JD 7H 3H 4H +9C 9H 4H 4D TH 6D QD 8S 9S 7S +2H AC 8S 4S AD 8C 2C AH 7D TC +TS 9H 3C AD KS TC 3D 8C 8H JD +QC 8D 2C 3C 7D 7C JD 9H 9C 6C +AH 6S JS JH 5D AS QC 2C JD TD +9H KD 2H 5D 2D 3S 7D TC AH TS +TD 8H AS 5D AH QC AC 6S TC 5H +KS 4S 7H 4D 8D 9C TC 2H 6H 3H +3H KD 4S QD QH 3D 8H 8C TD 7S +8S JD TC AH JS QS 2D KH KS 4D +3C AD JC KD JS KH 4S TH 9H 2C +QC 5S JS 9S KS AS 7C QD 2S JD +KC 5S QS 3S 2D AC 5D 9H 8H KS +6H 9C TC AD 2C 6D 5S JD 6C 7C +QS KH TD QD 2C 3H 8S 2S QC AH +9D 9H JH TC QH 3C 2S JS 5C 7H +6C 3S 3D 2S 4S QD 2D TH 5D 2C +2D 6H 6D 2S JC QH AS 7H 4H KH +5H 6S KS AD TC TS 7C AC 4S 4H +AD 3C 4H QS 8C 9D KS 2H 2D 4D +4S 9D 6C 6D 9C AC 8D 3H 7H KD +JC AH 6C TS JD 6D AD 3S 5D QD +JC JH JD 3S 7S 8S JS QC 3H 4S +JD TH 5C 2C AD JS 7H 9S 2H 7S +8D 3S JH 4D QC AS JD 2C KC 6H +2C AC 5H KD 5S 7H QD JH AH 2D +JC QH 8D 8S TC 5H 5C AH 8C 6C +3H JS 8S QD JH 3C 4H 6D 5C 3S +6D 4S 4C AH 5H 5S 3H JD 7C 8D +8H AH 2H 3H JS 3C 7D QC 4H KD +6S 2H KD 5H 8H 2D 3C 8S 7S QD +2S 7S KC QC AH TC QS 6D 4C 8D +5S 9H 2C 3S QD 7S 6C 2H 7C 9D +3C 6C 5C 5S JD JC KS 3S 5D TS +7C KS 6S 5S 2S 2D TC 2H 5H QS +AS 7H 6S TS 5H 9S 9D 3C KD 2H +4S JS QS 3S 4H 7C 2S AC 6S 9D +8C JH 2H 5H 7C 5D QH QS KH QC +3S TD 3H 7C KC 8D 5H 8S KH 8C +4H KH JD TS 3C 7H AS QC JS 5S +AH 9D 2C 8D 4D 2D 6H 6C KC 6S +2S 6H 9D 3S 7H 4D KH 8H KD 3D +9C TC AC JH KH 4D JD 5H TD 3S +7S 4H 9D AS 4C 7D QS 9S 2S KH +3S 8D 8S KS 8C JC 5C KH 2H 5D +8S QH 2C 4D KC JS QC 9D AC 6H +8S 8C 7C JS JD 6S 4C 9C AC 4S +QH 5D 2C 7D JC 8S 2D JS JH 4C +JS 4C 7S TS JH KC KH 5H QD 4S +QD 8C 8D 2D 6S TD 9D AC QH 5S +QH QC JS 3D 3C 5C 4H KH 8S 7H +7C 2C 5S JC 8S 3H QC 5D 2H KC +5S 8D KD 6H 4H QD QH 6D AH 3D +7S KS 6C 2S 4D AC QS 5H TS JD +7C 2D TC 5D QS AC JS QC 6C KC +2C KS 4D 3H TS 8S AD 4H 7S 9S +QD 9H QH 5H 4H 4D KH 3S JC AD +4D AC KC 8D 6D 4C 2D KH 2C JD +2C 9H 2D AH 3H 6D 9C 7D TC KS +8C 3H KD 7C 5C 2S 4S 5H AS AH +TH JD 4H KD 3H TC 5C 3S AC KH +6D 7H AH 7S QC 6H 2D TD JD AS +JH 5D 7H TC 9S 7D JC AS 5S KH +2H 8C AD TH 6H QD KD 9H 6S 6C +QH KC 9D 4D 3S JS JH 4H 2C 9H +TC 7H KH 4H JC 7D 9S 3H QS 7S +AD 7D JH 6C 7H 4H 3S 3H 4D QH +JD 2H 5C AS 6C QC 4D 3C TC JH +AC JD 3H 6H 4C JC AD 7D 7H 9H +4H TC TS 2C 8C 6S KS 2H JD 9S +4C 3H QS QC 9S 9H 6D KC 9D 9C +5C AD 8C 2C QH TH QD JC 8D 8H +QC 2C 2S QD 9C 4D 3S 8D JH QS +9D 3S 2C 7S 7C JC TD 3C TC 9H +3C TS 8H 5C 4C 2C 6S 8D 7C 4H +KS 7H 2H TC 4H 2C 3S AS AH QS +8C 2D 2H 2C 4S 4C 6S 7D 5S 3S +TH QC 5D TD 3C QS KD KC KS AS +4D AH KD 9H KS 5C 4C 6H JC 7S +KC 4H 5C QS TC 2H JC 9S AH QH +4S 9H 3H 5H 3C QD 2H QC JH 8H +5D AS 7H 2C 3D JH 6H 4C 6S 7D +9C JD 9H AH JS 8S QH 3H KS 8H +3S AC QC TS 4D AD 3D AH 8S 9H +7H 3H QS 9C 9S 5H JH JS AH AC +8D 3C JD 2H AC 9C 7H 5S 4D 8H +7C JH 9H 6C JS 9S 7H 8C 9D 4H +2D AS 9S 6H 4D JS JH 9H AD QD +6H 7S JH KH AH 7H TD 5S 6S 2C +8H JH 6S 5H 5S 9D TC 4C QC 9S +7D 2C KD 3H 5H AS QD 7H JS 4D +TS QH 6C 8H TH 5H 3C 3H 9C 9D +AD KH JS 5D 3H AS AC 9S 5C KC +2C KH 8C JC QS 6D AH 2D KC TC +9D 3H 2S 7C 4D 6D KH KS 8D 7D +9H 2S TC JH AC QC 3H 5S 3S 8H +3S AS KD 8H 4C 3H 7C JH QH TS +7S 6D 7H 9D JH 4C 3D 3S 6C AS +4S 2H 2C 4C 8S 5H KC 8C QC QD +3H 3S 6C QS QC 2D 6S 5D 2C 9D +2H 8D JH 2S 3H 2D 6C 5C 7S AD +9H JS 5D QH 8S TS 2H 7S 6S AD +6D QC 9S 7H 5H 5C 7D KC JD 4H +QC 5S 9H 9C 4D 6S KS 2S 4C 7C +9H 7C 4H 8D 3S 6H 5C 8H JS 7S +2D 6H JS TD 4H 4D JC TH 5H KC +AC 7C 8D TH 3H 9S 2D 4C KC 4D +KD QS 9C 7S 3D KS AD TS 4C 4H +QH 9C 8H 2S 7D KS 7H 5D KD 4C +9C 2S 2H JC 6S 6C TC QC JH 5C +7S AC 8H KC 8S 6H QS JC 3D 6S +JS 2D JH 8C 4S 6H 8H 6D 5D AD +6H 7D 2S 4H 9H 7C AS AC 8H 5S +3C JS 4S 6D 5H 2S QH 6S 9C 2C +3D 5S 6S 9S 4C QS 8D QD 8S TC +9C 3D AH 9H 5S 2C 7D AD JC 3S +7H TC AS 3C 6S 6D 7S KH KC 9H +3S TC 8H 6S 5H JH 8C 7D AC 2S +QD 9D 9C 3S JC 8C KS 8H 5D 4D +JS AH JD 6D 9D 8C 9H 9S 8H 3H +2D 6S 4C 4D 8S AD 4S TC AH 9H +TS AC QC TH KC 6D 4H 7S 8C 2H +3C QD JS 9D 5S JC AH 2H TS 9H +3H 4D QH 5D 9C 5H 7D 4S JC 3S +8S TH 3H 7C 2H JD JS TS AC 8D +9C 2H TD KC JD 2S 8C 5S AD 2C +3D KD 7C 5H 4D QH QD TC 6H 7D +7H 2C KC 5S KD 6H AH QC 7S QH +6H 5C AC 5H 2C 9C 2D 7C TD 2S +4D 9D AH 3D 7C JD 4H 8C 4C KS +TH 3C JS QH 8H 4C AS 3D QS QC +4D 7S 5H JH 6D 7D 6H JS KH 3C +QD 8S 7D 2H 2C 7C JC 2S 5H 8C +QH 8S 9D TC 2H AD 7C 8D QD 6S +3S 7C AD 9H 2H 9S JD TS 4C 2D +3S AS 4H QC 2C 8H 8S 7S TD TC +JH TH TD 3S 4D 4H 5S 5D QS 2C +8C QD QH TC 6D 4S 9S 9D 4H QC +8C JS 9D 6H JD 3H AD 6S TD QC +KC 8S 3D 7C TD 7D 8D 9H 4S 3S +6C 4S 3D 9D KD TC KC KS AC 5S +7C 6S QH 3D JS KD 6H 6D 2D 8C +JD 2S 5S 4H 8S AC 2D 6S TS 5C +5H 8C 5S 3C 4S 3D 7C 8D AS 3H +AS TS 7C 3H AD 7D JC QS 6C 6H +3S 9S 4C AC QH 5H 5D 9H TS 4H +6C 5C 7H 7S TD AD JD 5S 2H 2S +7D 6C KC 3S JD 8D 8S TS QS KH +8S QS 8D 6C TH AC AH 2C 8H 9S +7H TD KH QH 8S 3D 4D AH JD AS +TS 3D 2H JC 2S JH KH 6C QC JS +KC TH 2D 6H 7S 2S TC 8C 9D QS +3C 9D 6S KH 8H 6D 5D TH 2C 2H +6H TC 7D AD 4D 8S TS 9H TD 7S +JS 6D JD JC 2H AC 6C 3D KH 8D +KH JD 9S 5D 4H 4C 3H 7S QS 5C +4H JD 5D 3S 3C 4D KH QH QS 7S +JD TS 8S QD AH 4C 6H 3S 5S 2C +QS 3D JD AS 8D TH 7C 6S QC KS +7S 2H 8C QC 7H AC 6D 2D TH KH +5S 6C 7H KH 7D AH 8C 5C 7S 3D +3C KD AD 7D 6C 4D KS 2D 8C 4S +7C 8D 5S 2D 2S AH AD 2C 9D TD +3C AD 4S KS JH 7C 5C 8C 9C TH +AS TD 4D 7C JD 8C QH 3C 5H 9S +3H 9C 8S 9S 6S QD KS AH 5H JH +QC 9C 5S 4H 2H TD 7D AS 8C 9D +8C 2C 9D KD TC 7S 3D KH QC 3C +4D AS 4C QS 5S 9D 6S JD QH KS +6D AH 6C 4C 5H TS 9H 7D 3D 5S +QS JD 7C 8D 9C AC 3S 6S 6C KH +8H JH 5D 9S 6D AS 6S 3S QC 7H +QD AD 5C JH 2H AH 4H AS KC 2C +JH 9C 2C 6H 2D JS 5D 9H KC 6D +7D 9D KD TH 3H AS 6S QC 6H AD +JD 4H 7D KC 3H JS 3C TH 3D QS +4C 3H 8C QD 5H 6H AS 8H AD JD +TH 8S KD 5D QC 7D JS 5S 5H TS +7D KC 9D QS 3H 3C 6D TS 7S AH +7C 4H 7H AH QC AC 4D 5D 6D TH +3C 4H 2S KD 8H 5H JH TC 6C JD +4S 8C 3D 4H JS TD 7S JH QS KD +7C QC KD 4D 7H 6S AD TD TC KH +5H 9H KC 3H 4D 3D AD 6S QD 6H +TH 7C 6H TS QH 5S 2C KC TD 6S +7C 4D 5S JD JH 7D AC KD KH 4H +7D 6C 8D 8H 5C JH 8S QD TH JD +8D 7D 6C 7C 9D KD AS 5C QH JH +9S 2C 8C 3C 4C KS JH 2D 8D 4H +7S 6C JH KH 8H 3H 9D 2D AH 6D +4D TC 9C 8D 7H TD KS TH KD 3C +JD 9H 8D QD AS KD 9D 2C 2S 9C +8D 3H 5C 7H KS 5H QH 2D 8C 9H +2D TH 6D QD 6C KC 3H 3S AD 4C +4H 3H JS 9D 3C TC 5H QH QC JC +3D 5C 6H 3S 3C JC 5S 7S 2S QH +AC 5C 8C 4D 5D 4H 2S QD 3C 3H +2C TD AH 9C KD JS 6S QD 4C QC +QS 8C 3S 4H TC JS 3H 7C JC AD +5H 4D 9C KS JC TD 9S TS 8S 9H +QD TS 7D AS AC 2C TD 6H 8H AH +6S AD 8C 4S 9H 8D 9D KH 8S 3C +QS 4D 2D 7S KH JS JC AD 4C 3C +QS 9S 7H KC TD TH 5H JS AC JH +6D AC 2S QS 7C AS KS 6S KH 5S +6D 8H KH 3C QS 2H 5C 9C 9D 6C +JS 2C 4C 6H 7D JC AC QD TD 3H +4H QC 8H JD 4C KD KS 5C KC 7S +6D 2D 3H 2S QD 5S 7H AS TH 6S +AS 6D 8D 2C 8S TD 8H QD JC AH +9C 9H 2D TD QH 2H 5C TC 3D 8H +KC 8S 3D KH 2S TS TC 6S 4D JH +9H 9D QS AC KC 6H 5D 4D 8D AH +9S 5C QS 4H 7C 7D 2H 8S AD JS +3D AC 9S AS 2C 2D 2H 3H JC KH +7H QH KH JD TC KS 5S 8H 4C 8D +2H 7H 3S 2S 5H QS 3C AS 9H KD +AD 3D JD 6H 5S 9C 6D AC 9S 3S +3D 5D 9C 2D AC 4S 2S AD 6C 6S +QC 4C 2D 3H 6S KC QH QD 2H JH +QC 3C 8S 4D 9S 2H 5C 8H QS QD +6D KD 6S 7H 3S KH 2H 5C JC 6C +3S 9S TC 6S 8H 2D AD 7S 8S TS +3C 6H 9C 3H 5C JC 8H QH TD QD +3C JS QD 5D TD 2C KH 9H TH AS +9S TC JD 3D 5C 5H AD QH 9H KC +TC 7H 4H 8H 3H TD 6S AC 7C 2S +QS 9D 5D 3C JC KS 4D 6C JH 2S +9S 6S 3C 7H TS 4C KD 6D 3D 9C +2D 9H AH AC 7H 2S JH 3S 7C QC +QD 9H 3C 2H AC AS 8S KD 8C KH +2D 7S TD TH 6D JD 8D 4D 2H 5S +8S QH KD JD QS JH 4D KC 5H 3S +3C KH QC 6D 8H 3S AH 7D TD 2D +5S 9H QH 4S 6S 6C 6D TS TH 7S +6C 4C 6D QS JS 9C TS 3H 8D 8S +JS 5C 7S AS 2C AH 2H AD 5S TC +KD 6C 9C 9D TS 2S JC 4H 2C QD +QS 9H TC 3H KC KS 4H 3C AD TH +KH 9C 2H KD 9D TC 7S KC JH 2D +7C 3S KC AS 8C 5D 9C 9S QH 3H +2D 8C TD 4C 2H QC 5D TC 2C 7D +KS 4D 6C QH TD KH 5D 7C AD 8D +2S 9S 8S 4C 8C 3D 6H QD 7C 7H +6C 8S QH 5H TS 5C 3C 4S 2S 2H +8S 6S 2H JC 3S 3H 9D 8C 2S 7H +QC 2C 8H 9C AC JD 4C 4H 6S 3S +3H 3S 7D 4C 9S 5H 8H JC 3D TC +QH 2S 2D 9S KD QD 9H AD 6D 9C +8D 2D KS 9S JC 4C JD KC 4S TH +KH TS 6D 4D 5C KD 5H AS 9H AD +QD JS 7C 6D 5D 5C TH 5H QH QS +9D QH KH 5H JH 4C 4D TC TH 6C +KH AS TS 9D KD 9C 7S 4D 8H 5S +KH AS 2S 7D 9D 4C TS TH AH 7C +KS 4D AC 8S 9S 8D TH QH 9D 5C +5D 5C 8C QS TC 4C 3D 3S 2C 8D +9D KS 2D 3C KC 4S 8C KH 6C JC +8H AH 6H 7D 7S QD 3C 4C 6C KC +3H 2C QH 8H AS 7D 4C 8C 4H KC +QD 5S 4H 2C TD AH JH QH 4C 8S +3H QS 5S JS 8H 2S 9H 9C 3S 2C +6H TS 7S JC QD AC TD KC 5S 3H +QH AS QS 7D JC KC 2C 4C 5C 5S +QH 3D AS JS 4H 8D 7H JC 2S 9C +5D 4D 2S 4S 9D 9C 2D QS 8H 7H +6D 7H 3H JS TS AC 2D JH 7C 8S +JH 5H KC 3C TC 5S 9H 4C 8H 9D +8S KC 5H 9H AD KS 9D KH 8D AH +JC 2H 9H KS 6S 3H QC 5H AH 9C +5C KH 5S AD 6C JC 9H QC 9C TD +5S 5D JC QH 2D KS 8H QS 2H TS +JH 5H 5S AH 7H 3C 8S AS TD KH +6H 3D JD 2C 4C KC 7S AH 6C JH +4C KS 9D AD 7S KC 7D 8H 3S 9C +7H 5C 5H 3C 8H QC 3D KH 6D JC +2D 4H 5D 7D QC AD AH 9H QH 8H +KD 8C JS 9D 3S 3C 2H 5D 6D 2S +8S 6S TS 3C 6H 8D 5S 3H TD 6C +KS 3D JH 9C 7C 9S QS 5S 4H 6H +7S 6S TH 4S KC KD 3S JC JH KS +7C 3C 2S 6D QH 2C 7S 5H 8H AH +KC 8D QD 6D KH 5C 7H 9D 3D 9C +6H 2D 8S JS 9S 2S 6D KC 7C TC +KD 9C JH 7H KC 8S 2S 7S 3D 6H +4H 9H 2D 4C 8H 7H 5S 8S 2H 8D +AD 7C 3C 7S 5S 4D 9H 3D JC KH +5D AS 7D 6D 9C JC 4C QH QS KH +KD JD 7D 3D QS QC 8S 6D JS QD +6S 8C 5S QH TH 9H AS AC 2C JD +QC KS QH 7S 3C 4C 5C KC 5D AH +6C 4H 9D AH 2C 3H KD 3D TS 5C +TD 8S QS AS JS 3H KD AC 4H KS +7D 5D TS 9H 4H 4C 9C 2H 8C QC +2C 7D 9H 4D KS 4C QH AD KD JS +QD AD AH KH 9D JS 9H JC KD JD +8S 3C 4S TS 7S 4D 5C 2S 6H 7C +JS 7S 5C KD 6D QH 8S TD 2H 6S +QH 6C TC 6H TD 4C 9D 2H QC 8H +3D TS 4D 2H 6H 6S 2C 7H 8S 6C +9H 9D JD JH 3S AH 2C 6S 3H 8S +2C QS 8C 5S 3H 2S 7D 3C AD 4S +5C QC QH AS TS 4S 6S 4C 5H JS +JH 5C TD 4C 6H JS KD KH QS 4H +TC KH JC 4D 9H 9D 8D KC 3C 8H +2H TC 8S AD 9S 4H TS 7H 2C 5C +4H 2S 6C 5S KS AH 9C 7C 8H KD +TS QH TD QS 3C JH AH 2C 8D 7D +5D KC 3H 5S AC 4S 7H QS 4C 2H +3D 7D QC KH JH 6D 6C TD TH KD +5S 8D TH 6C 9D 7D KH 8C 9S 6D +JD QS 7S QC 2S QH JC 4S KS 8D +7S 5S 9S JD KD 9C JC AD 2D 7C +4S 5H AH JH 9C 5D TD 7C 2D 6S +KC 6C 7H 6S 9C QD 5S 4H KS TD +6S 8D KS 2D TH TD 9H JD TS 3S +KH JS 4H 5D 9D TC TD QC JD TS +QS QD AC AD 4C 6S 2D AS 3H KC +4C 7C 3C TD QS 9C KC AS 8D AD +KC 7H QC 6D 8H 6S 5S AH 7S 8C +3S AD 9H JC 6D JD AS KH 6S JH +AD 3D TS KS 7H JH 2D JS QD AC +9C JD 7C 6D TC 6H 6C JC 3D 3S +QC KC 3S JC KD 2C 8D AH QS TS +AS KD 3D JD 8H 7C 8C 5C QD 6C diff --git a/python-mega-algo/project_euler/problem_054/right.html b/python-mega-algo/project_euler/problem_054/right.html new file mode 100644 index 00000000..08ba1f1d --- /dev/null +++ b/python-mega-algo/project_euler/problem_054/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/project_euler/problem_054 + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    sol1.py test_poker_hand.py __init__.py poker_hands.txt 
    + +

    +Folders: 1
    +Files: 4
    +Size of all files: 51388 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/project_euler/problem_054/sol1.py b/python-mega-algo/project_euler/problem_054/sol1.py new file mode 100644 index 00000000..d2fd810d --- /dev/null +++ b/python-mega-algo/project_euler/problem_054/sol1.py @@ -0,0 +1,381 @@ +""" +Problem: https://projecteuler.net/problem=54 + +In the card game poker, a hand consists of five cards and are ranked, +from lowest to highest, in the following way: + +High Card: Highest value card. +One Pair: Two cards of the same value. +Two Pairs: Two different pairs. +Three of a Kind: Three cards of the same value. +Straight: All cards are consecutive values. +Flush: All cards of the same suit. +Full House: Three of a kind and a pair. +Four of a Kind: Four cards of the same value. +Straight Flush: All cards are consecutive values of same suit. +Royal Flush: Ten, Jack, Queen, King, Ace, in same suit. + +The cards are valued in the order: +2, 3, 4, 5, 6, 7, 8, 9, 10, Jack, Queen, King, Ace. + +If two players have the same ranked hands then the rank made up of the highest +value wins; for example, a pair of eights beats a pair of fives. +But if two ranks tie, for example, both players have a pair of queens, then highest +cards in each hand are compared; if the highest cards tie then the next highest +cards are compared, and so on. + +The file, poker.txt, contains one-thousand random hands dealt to two players. +Each line of the file contains ten cards (separated by a single space): the +first five are Player 1's cards and the last five are Player 2's cards. +You can assume that all hands are valid (no invalid characters or repeated cards), +each player's hand is in no specific order, and in each hand there is a clear winner. + +How many hands does Player 1 win? + +Resources used: +https://en.wikipedia.org/wiki/Texas_hold_%27em +https://en.wikipedia.org/wiki/List_of_poker_hands + +Similar problem on codewars: +https://www.codewars.com/kata/ranking-poker-hands +https://www.codewars.com/kata/sortable-poker-hands +""" +from __future__ import annotations + +import os + + +class PokerHand: + """Create an object representing a Poker Hand based on an input of a + string which represents the best 5 card combination from the player's hand + and board cards. + + Attributes: (read-only) + hand: string representing the hand consisting of five cards + + Methods: + compare_with(opponent): takes in player's hand (self) and + opponent's hand (opponent) and compares both hands according to + the rules of Texas Hold'em. + Returns one of 3 strings (Win, Loss, Tie) based on whether + player's hand is better than opponent's hand. + + hand_name(): Returns a string made up of two parts: hand name + and high card. + + Supported operators: + Rich comparison operators: <, >, <=, >=, ==, != + + Supported builtin methods and functions: + list.sort(), sorted() + """ + + _HAND_NAME = [ + "High card", + "One pair", + "Two pairs", + "Three of a kind", + "Straight", + "Flush", + "Full house", + "Four of a kind", + "Straight flush", + "Royal flush", + ] + + _CARD_NAME = [ + "", # placeholder as lists are zero indexed + "One", + "Two", + "Three", + "Four", + "Five", + "Six", + "Seven", + "Eight", + "Nine", + "Ten", + "Jack", + "Queen", + "King", + "Ace", + ] + + def __init__(self, hand: str) -> None: + """ + Initialize hand. + Hand should of type str and should contain only five cards each + separated by a space. + + The cards should be of the following format: + [card value][card suit] + + The first character is the value of the card: + 2, 3, 4, 5, 6, 7, 8, 9, T(en), J(ack), Q(ueen), K(ing), A(ce) + + The second character represents the suit: + S(pades), H(earts), D(iamonds), C(lubs) + + For example: "6S 4C KC AS TH" + """ + if not isinstance(hand, str): + raise TypeError(f"Hand should be of type 'str': {hand!r}") + # split removes duplicate whitespaces so no need of strip + if len(hand.split(" ")) != 5: + raise ValueError(f"Hand should contain only 5 cards: {hand!r}") + self._hand = hand + self._first_pair = 0 + self._second_pair = 0 + self._card_values, self._card_suit = self._internal_state() + self._hand_type = self._get_hand_type() + self._high_card = self._card_values[0] + + @property + def hand(self): + """Returns the self hand""" + return self._hand + + def compare_with(self, other: "PokerHand") -> str: + """ + Determines the outcome of comparing self hand with other hand. + Returns the output as 'Win', 'Loss', 'Tie' according to the rules of + Texas Hold'em. + + Here are some examples: + >>> player = PokerHand("2H 3H 4H 5H 6H") # Stright flush + >>> opponent = PokerHand("KS AS TS QS JS") # Royal flush + >>> player.compare_with(opponent) + 'Loss' + + >>> player = PokerHand("2S AH 2H AS AC") # Full house + >>> opponent = PokerHand("2H 3H 5H 6H 7H") # Flush + >>> player.compare_with(opponent) + 'Win' + + >>> player = PokerHand("2S AH 4H 5S 6C") # High card + >>> opponent = PokerHand("AD 4C 5H 6H 2C") # High card + >>> player.compare_with(opponent) + 'Tie' + """ + # Breaking the tie works on the following order of precedence: + # 1. First pair (default 0) + # 2. Second pair (default 0) + # 3. Compare all cards in reverse order because they are sorted. + + # First pair and second pair will only be a non-zero value if the card + # type is either from the following: + # 21: Four of a kind + # 20: Full house + # 17: Three of a kind + # 16: Two pairs + # 15: One pair + if self._hand_type > other._hand_type: + return "Win" + elif self._hand_type < other._hand_type: + return "Loss" + elif self._first_pair == other._first_pair: + if self._second_pair == other._second_pair: + return self._compare_cards(other) + else: + return "Win" if self._second_pair > other._second_pair else "Loss" + return "Win" if self._first_pair > other._first_pair else "Loss" + + # This function is not part of the problem, I did it just for fun + def hand_name(self) -> str: + """ + Return the name of the hand in the following format: + 'hand name, high card' + + Here are some examples: + >>> PokerHand("KS AS TS QS JS").hand_name() + 'Royal flush' + + >>> PokerHand("2D 6D 3D 4D 5D").hand_name() + 'Straight flush, Six-high' + + >>> PokerHand("JC 6H JS JD JH").hand_name() + 'Four of a kind, Jacks' + + >>> PokerHand("3D 2H 3H 2C 2D").hand_name() + 'Full house, Twos over Threes' + + >>> PokerHand("2H 4D 3C AS 5S").hand_name() # Low ace + 'Straight, Five-high' + + Source: https://en.wikipedia.org/wiki/List_of_poker_hands + """ + name = PokerHand._HAND_NAME[self._hand_type - 14] + high = PokerHand._CARD_NAME[self._high_card] + pair1 = PokerHand._CARD_NAME[self._first_pair] + pair2 = PokerHand._CARD_NAME[self._second_pair] + if self._hand_type in [22, 19, 18]: + return name + f", {high}-high" + elif self._hand_type in [21, 17, 15]: + return name + f", {pair1}s" + elif self._hand_type in [20, 16]: + join = "over" if self._hand_type == 20 else "and" + return name + f", {pair1}s {join} {pair2}s" + elif self._hand_type == 23: + return name + else: + return name + f", {high}" + + def _compare_cards(self, other: "PokerHand") -> str: + # Enumerate gives us the index as well as the element of a list + for index, card_value in enumerate(self._card_values): + if card_value != other._card_values[index]: + return "Win" if card_value > other._card_values[index] else "Loss" + return "Tie" + + def _get_hand_type(self) -> int: + # Number representing the type of hand internally: + # 23: Royal flush + # 22: Straight flush + # 21: Four of a kind + # 20: Full house + # 19: Flush + # 18: Straight + # 17: Three of a kind + # 16: Two pairs + # 15: One pair + # 14: High card + if self._is_flush(): + if self._is_five_high_straight() or self._is_straight(): + return 23 if sum(self._card_values) == 60 else 22 + return 19 + elif self._is_five_high_straight() or self._is_straight(): + return 18 + return 14 + self._is_same_kind() + + def _is_flush(self) -> bool: + return len(self._card_suit) == 1 + + def _is_five_high_straight(self) -> bool: + # If a card is a five high straight (low ace) change the location of + # ace from the start of the list to the end. Check whether the first + # element is ace or not. (Don't want to change again) + # Five high straight (low ace): AH 2H 3S 4C 5D + # Why use sorted here? One call to this function will mutate the list to + # [5, 4, 3, 2, 14] and so for subsequent calls (which will be rare) we + # need to compare the sorted version. + # Refer test_multiple_calls_five_high_straight in test_poker_hand.py + if sorted(self._card_values) == [2, 3, 4, 5, 14]: + if self._card_values[0] == 14: + # Remember, our list is sorted in reverse order + ace_card = self._card_values.pop(0) + self._card_values.append(ace_card) + return True + return False + + def _is_straight(self) -> bool: + for i in range(4): + if self._card_values[i] - self._card_values[i + 1] != 1: + return False + return True + + def _is_same_kind(self) -> int: + # Kind Values for internal use: + # 7: Four of a kind + # 6: Full house + # 3: Three of a kind + # 2: Two pairs + # 1: One pair + # 0: False + kind = val1 = val2 = 0 + for i in range(4): + # Compare two cards at a time, if they are same increase 'kind', + # add the value of the card to val1, if it is repeating again we + # will add 2 to 'kind' as there are now 3 cards with same value. + # If we get card of different value than val1, we will do the same + # thing with val2 + if self._card_values[i] == self._card_values[i + 1]: + if not val1: + val1 = self._card_values[i] + kind += 1 + elif val1 == self._card_values[i]: + kind += 2 + elif not val2: + val2 = self._card_values[i] + kind += 1 + elif val2 == self._card_values[i]: + kind += 2 + # For consistency in hand type (look at note in _get_hand_type function) + kind = kind + 2 if kind in [4, 5] else kind + # first meaning first pair to compare in 'compare_with' + first = max(val1, val2) + second = min(val1, val2) + # If it's full house (three count pair + two count pair), make sure + # first pair is three count and if not then switch them both. + if kind == 6 and self._card_values.count(first) != 3: + first, second = second, first + self._first_pair = first + self._second_pair = second + return kind + + def _internal_state(self) -> tuple[list[int], set[str]]: + # Internal representation of hand as a list of card values and + # a set of card suit + trans: dict = {"T": "10", "J": "11", "Q": "12", "K": "13", "A": "14"} + new_hand = self._hand.translate(str.maketrans(trans)).split() + card_values = [int(card[:-1]) for card in new_hand] + card_suit = {card[-1] for card in new_hand} + return sorted(card_values, reverse=True), card_suit + + def __repr__(self): + return f'{self.__class__}("{self._hand}")' + + def __str__(self): + return self._hand + + # Rich comparison operators (used in list.sort() and sorted() builtin functions) + # Note that this is not part of the problem but another extra feature where + # if you have a list of PokerHand objects, you can sort them just through + # the builtin functions. + def __eq__(self, other): + if isinstance(other, PokerHand): + return self.compare_with(other) == "Tie" + return NotImplemented + + def __lt__(self, other): + if isinstance(other, PokerHand): + return self.compare_with(other) == "Loss" + return NotImplemented + + def __le__(self, other): + if isinstance(other, PokerHand): + return self < other or self == other + return NotImplemented + + def __gt__(self, other): + if isinstance(other, PokerHand): + return not self < other and self != other + return NotImplemented + + def __ge__(self, other): + if isinstance(other, PokerHand): + return not self < other + return NotImplemented + + def __hash__(self): + return object.__hash__(self) + + +def solution() -> int: + # Solution for problem number 54 from Project Euler + # Input from poker_hands.txt file + answer = 0 + script_dir = os.path.abspath(os.path.dirname(__file__)) + poker_hands = os.path.join(script_dir, "poker_hands.txt") + with open(poker_hands) as file_hand: + for line in file_hand: + player_hand = line[:14].strip() + opponent_hand = line[15:].strip() + player, opponent = PokerHand(player_hand), PokerHand(opponent_hand) + output = player.compare_with(opponent) + if output == "Win": + answer += 1 + return answer + + +if __name__ == "__main__": + solution() diff --git a/python-mega-algo/project_euler/problem_054/test_poker_hand.py b/python-mega-algo/project_euler/problem_054/test_poker_hand.py new file mode 100644 index 00000000..96317fc7 --- /dev/null +++ b/python-mega-algo/project_euler/problem_054/test_poker_hand.py @@ -0,0 +1,228 @@ +import os +from itertools import chain +from random import randrange, shuffle + +import pytest + +from .sol1 import PokerHand + +SORTED_HANDS = ( + "4S 3H 2C 7S 5H", + "9D 8H 2C 6S 7H", + "2D 6D 9D TH 7D", + "TC 8C 2S JH 6C", + "JH 8S TH AH QH", + "TS KS 5S 9S AC", + "KD 6S 9D TH AD", + "KS 8D 4D 9S 4S", # pair + "8C 4S KH JS 4D", # pair + "QH 8H KD JH 8S", # pair + "KC 4H KS 2H 8D", # pair + "KD 4S KC 3H 8S", # pair + "AH 8S AS KC JH", # pair + "3H 4C 4H 3S 2H", # 2 pairs + "5S 5D 2C KH KH", # 2 pairs + "3C KH 5D 5S KH", # 2 pairs + "AS 3C KH AD KH", # 2 pairs + "7C 7S 3S 7H 5S", # 3 of a kind + "7C 7S KH 2H 7H", # 3 of a kind + "AC KH QH AH AS", # 3 of a kind + "2H 4D 3C AS 5S", # straight (low ace) + "3C 5C 4C 2C 6H", # straight + "6S 8S 7S 5H 9H", # straight + "JS QS 9H TS KH", # straight + "QC KH TS JS AH", # straight (high ace) + "8C 9C 5C 3C TC", # flush + "3S 8S 9S 5S KS", # flush + "4C 5C 9C 8C KC", # flush + "JH 8H AH KH QH", # flush + "3D 2H 3H 2C 2D", # full house + "2H 2C 3S 3H 3D", # full house + "KH KC 3S 3H 3D", # full house + "JC 6H JS JD JH", # 4 of a kind + "JC 7H JS JD JH", # 4 of a kind + "JC KH JS JD JH", # 4 of a kind + "2S AS 4S 5S 3S", # straight flush (low ace) + "2D 6D 3D 4D 5D", # straight flush + "5C 6C 3C 7C 4C", # straight flush + "JH 9H TH KH QH", # straight flush + "JH AH TH KH QH", # royal flush (high ace straight flush) +) + +TEST_COMPARE = ( + ("2H 3H 4H 5H 6H", "KS AS TS QS JS", "Loss"), + ("2H 3H 4H 5H 6H", "AS AD AC AH JD", "Win"), + ("AS AH 2H AD AC", "JS JD JC JH 3D", "Win"), + ("2S AH 2H AS AC", "JS JD JC JH AD", "Loss"), + ("2S AH 2H AS AC", "2H 3H 5H 6H 7H", "Win"), + ("AS 3S 4S 8S 2S", "2H 3H 5H 6H 7H", "Win"), + ("2H 3H 5H 6H 7H", "2S 3H 4H 5S 6C", "Win"), + ("2S 3H 4H 5S 6C", "3D 4C 5H 6H 2S", "Tie"), + ("2S 3H 4H 5S 6C", "AH AC 5H 6H AS", "Win"), + ("2S 2H 4H 5S 4C", "AH AC 5H 6H AS", "Loss"), + ("2S 2H 4H 5S 4C", "AH AC 5H 6H 7S", "Win"), + ("6S AD 7H 4S AS", "AH AC 5H 6H 7S", "Loss"), + ("2S AH 4H 5S KC", "AH AC 5H 6H 7S", "Loss"), + ("2S 3H 6H 7S 9C", "7H 3C TH 6H 9S", "Loss"), + ("4S 5H 6H TS AC", "3S 5H 6H TS AC", "Win"), + ("2S AH 4H 5S 6C", "AD 4C 5H 6H 2C", "Tie"), + ("AS AH 3H AD AC", "AS AH 2H AD AC", "Win"), + ("AH AC 5H 5C QS", "AH AC 5H 5C KS", "Loss"), + ("AH AC 5H 5C QS", "KH KC 5H 5C QS", "Win"), + ("7C 7S KH 2H 7H", "3C 3S AH 2H 3H", "Win"), + ("3C 3S AH 2H 3H", "7C 7S KH 2H 7H", "Loss"), + ("6H 5H 4H 3H 2H", "5H 4H 3H 2H AH", "Win"), + ("5H 4H 3H 2H AH", "5H 4H 3H 2H AH", "Tie"), + ("5H 4H 3H 2H AH", "6H 5H 4H 3H 2H", "Loss"), + ("AH AD KS KC AC", "AH KD KH AC KC", "Win"), + ("2H 4D 3C AS 5S", "2H 4D 3C 6S 5S", "Loss"), + ("2H 3S 3C 3H 2S", "3S 3C 2S 2H 2D", "Win"), + ("4D 6D 5D 2D JH", "3S 8S 3H TC KH", "Loss"), + ("4S 6C 8S 3S 7S", "AD KS 2D 7D 7C", "Loss"), + ("6S 4C 7H 8C 3H", "5H JC AH 9D 9C", "Loss"), + ("9D 9H JH TC QH", "3C 2S JS 5C 7H", "Win"), + ("2H TC 8S AD 9S", "4H TS 7H 2C 5C", "Win"), + ("9D 3S 2C 7S 7C", "JC TD 3C TC 9H", "Loss"), +) + +TEST_FLUSH = ( + ("2H 3H 4H 5H 6H", True), + ("AS AH 2H AD AC", False), + ("2H 3H 5H 6H 7H", True), + ("KS AS TS QS JS", True), + ("8H 9H QS JS TH", False), + ("AS 3S 4S 8S 2S", True), +) + +TEST_STRAIGHT = ( + ("2H 3H 4H 5H 6H", True), + ("AS AH 2H AD AC", False), + ("2H 3H 5H 6H 7H", False), + ("KS AS TS QS JS", True), + ("8H 9H QS JS TH", True), +) + +TEST_FIVE_HIGH_STRAIGHT = ( + ("2H 4D 3C AS 5S", True, [5, 4, 3, 2, 14]), + ("2H 5D 3C AS 5S", False, [14, 5, 5, 3, 2]), + ("JH QD KC AS TS", False, [14, 13, 12, 11, 10]), + ("9D 3S 2C 7S 7C", False, [9, 7, 7, 3, 2]), +) + +TEST_KIND = ( + ("JH AH TH KH QH", 0), + ("JH 9H TH KH QH", 0), + ("JC KH JS JD JH", 7), + ("KH KC 3S 3H 3D", 6), + ("8C 9C 5C 3C TC", 0), + ("JS QS 9H TS KH", 0), + ("7C 7S KH 2H 7H", 3), + ("3C KH 5D 5S KH", 2), + ("QH 8H KD JH 8S", 1), + ("2D 6D 9D TH 7D", 0), +) + +TEST_TYPES = ( + ("JH AH TH KH QH", 23), + ("JH 9H TH KH QH", 22), + ("JC KH JS JD JH", 21), + ("KH KC 3S 3H 3D", 20), + ("8C 9C 5C 3C TC", 19), + ("JS QS 9H TS KH", 18), + ("7C 7S KH 2H 7H", 17), + ("3C KH 5D 5S KH", 16), + ("QH 8H KD JH 8S", 15), + ("2D 6D 9D TH 7D", 14), +) + + +def generate_random_hand(): + play, oppo = randrange(len(SORTED_HANDS)), randrange(len(SORTED_HANDS)) + expected = ["Loss", "Tie", "Win"][(play >= oppo) + (play > oppo)] + hand, other = SORTED_HANDS[play], SORTED_HANDS[oppo] + return hand, other, expected + + +def generate_random_hands(number_of_hands: int = 100): + return (generate_random_hand() for _ in range(number_of_hands)) + + +@pytest.mark.parametrize("hand, expected", TEST_FLUSH) +def test_hand_is_flush(hand, expected): + assert PokerHand(hand)._is_flush() == expected + + +@pytest.mark.parametrize("hand, expected", TEST_STRAIGHT) +def test_hand_is_straight(hand, expected): + assert PokerHand(hand)._is_straight() == expected + + +@pytest.mark.parametrize("hand, expected, card_values", TEST_FIVE_HIGH_STRAIGHT) +def test_hand_is_five_high_straight(hand, expected, card_values): + player = PokerHand(hand) + assert player._is_five_high_straight() == expected + assert player._card_values == card_values + + +@pytest.mark.parametrize("hand, expected", TEST_KIND) +def test_hand_is_same_kind(hand, expected): + assert PokerHand(hand)._is_same_kind() == expected + + +@pytest.mark.parametrize("hand, expected", TEST_TYPES) +def test_hand_values(hand, expected): + assert PokerHand(hand)._hand_type == expected + + +@pytest.mark.parametrize("hand, other, expected", TEST_COMPARE) +def test_compare_simple(hand, other, expected): + assert PokerHand(hand).compare_with(PokerHand(other)) == expected + + +@pytest.mark.parametrize("hand, other, expected", generate_random_hands()) +def test_compare_random(hand, other, expected): + assert PokerHand(hand).compare_with(PokerHand(other)) == expected + + +def test_hand_sorted(): + POKER_HANDS = [PokerHand(hand) for hand in SORTED_HANDS] + list_copy = POKER_HANDS.copy() + shuffle(list_copy) + user_sorted = chain(sorted(list_copy)) + for index, hand in enumerate(user_sorted): + assert hand == POKER_HANDS[index] + + +def test_custom_sort_five_high_straight(): + # Test that five high straights are compared correctly. + pokerhands = [PokerHand("2D AC 3H 4H 5S"), PokerHand("2S 3H 4H 5S 6C")] + pokerhands.sort(reverse=True) + assert pokerhands[0].__str__() == "2S 3H 4H 5S 6C" + + +def test_multiple_calls_five_high_straight(): + # Multiple calls to five_high_straight function should still return True + # and shouldn't mutate the list in every call other than the first. + pokerhand = PokerHand("2C 4S AS 3D 5C") + expected = True + expected_card_values = [5, 4, 3, 2, 14] + for _ in range(10): + assert pokerhand._is_five_high_straight() == expected + assert pokerhand._card_values == expected_card_values + + +def test_euler_project(): + # Problem number 54 from Project Euler + # Testing from poker_hands.txt file + answer = 0 + script_dir = os.path.abspath(os.path.dirname(__file__)) + poker_hands = os.path.join(script_dir, "poker_hands.txt") + with open(poker_hands) as file_hand: + for line in file_hand: + player_hand = line[:14].strip() + opponent_hand = line[15:].strip() + player, opponent = PokerHand(player_hand), PokerHand(opponent_hand) + output = player.compare_with(opponent) + if output == "Win": + answer += 1 + assert answer == 376 diff --git a/python-mega-algo/project_euler/problem_055/__init__.py b/python-mega-algo/project_euler/problem_055/__init__.py new file mode 100644 index 00000000..792d6005 --- /dev/null +++ b/python-mega-algo/project_euler/problem_055/__init__.py @@ -0,0 +1 @@ +# diff --git a/python-mega-algo/project_euler/problem_055/right.html b/python-mega-algo/project_euler/problem_055/right.html new file mode 100644 index 00000000..0f4700eb --- /dev/null +++ b/python-mega-algo/project_euler/problem_055/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/project_euler/problem_055 + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    sol1.py __init__.py 
    + +

    +Folders: 1
    +Files: 2
    +Size of all files: 2411 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/project_euler/problem_055/sol1.py b/python-mega-algo/project_euler/problem_055/sol1.py new file mode 100644 index 00000000..ff98de5e --- /dev/null +++ b/python-mega-algo/project_euler/problem_055/sol1.py @@ -0,0 +1,81 @@ +""" +Lychrel numbers +Problem 55: https://projecteuler.net/problem=55 + +If we take 47, reverse and add, 47 + 74 = 121, which is palindromic. + +Not all numbers produce palindromes so quickly. For example, +349 + 943 = 1292, +1292 + 2921 = 4213 +4213 + 3124 = 7337 +That is, 349 took three iterations to arrive at a palindrome. + +Although no one has proved it yet, it is thought that some numbers, like 196, +never produce a palindrome. A number that never forms a palindrome through the +reverse and add process is called a Lychrel number. Due to the theoretical nature +of these numbers, and for the purpose of this problem, we shall assume that a number +is Lychrel until proven otherwise. In addition you are given that for every number +below ten-thousand, it will either (i) become a palindrome in less than fifty +iterations, or, (ii) no one, with all the computing power that exists, has managed +so far to map it to a palindrome. In fact, 10677 is the first number to be shown +to require over fifty iterations before producing a palindrome: +4668731596684224866951378664 (53 iterations, 28-digits). + +Surprisingly, there are palindromic numbers that are themselves Lychrel numbers; +the first example is 4994. +How many Lychrel numbers are there below ten-thousand? +""" + + +def is_palindrome(n: int) -> bool: + """ + Returns True if a number is palindrome. + >>> is_palindrome(12567321) + False + >>> is_palindrome(1221) + True + >>> is_palindrome(9876789) + True + """ + return str(n) == str(n)[::-1] + + +def sum_reverse(n: int) -> int: + """ + Returns the sum of n and reverse of n. + >>> sum_reverse(123) + 444 + >>> sum_reverse(3478) + 12221 + >>> sum_reverse(12) + 33 + """ + return int(n) + int(str(n)[::-1]) + + +def solution(limit: int = 10000) -> int: + """ + Returns the count of all lychrel numbers below limit. + >>> solution(10000) + 249 + >>> solution(5000) + 76 + >>> solution(1000) + 13 + """ + lychrel_nums = [] + for num in range(1, limit): + iterations = 0 + a = num + while iterations < 50: + num = sum_reverse(num) + iterations += 1 + if is_palindrome(num): + break + else: + lychrel_nums.append(a) + return len(lychrel_nums) + + +if __name__ == "__main__": + print(f"{solution() = }") diff --git a/python-mega-algo/project_euler/problem_056/__init__.py b/python-mega-algo/project_euler/problem_056/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/project_euler/problem_056/right.html b/python-mega-algo/project_euler/problem_056/right.html new file mode 100644 index 00000000..abad5edd --- /dev/null +++ b/python-mega-algo/project_euler/problem_056/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/project_euler/problem_056 + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    sol1.py __init__.py 
    + +

    +Folders: 1
    +Files: 2
    +Size of all files: 1061 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/project_euler/problem_056/sol1.py b/python-mega-algo/project_euler/problem_056/sol1.py new file mode 100644 index 00000000..8eaa6e55 --- /dev/null +++ b/python-mega-algo/project_euler/problem_056/sol1.py @@ -0,0 +1,45 @@ +""" +Project Euler Problem 56: https://projecteuler.net/problem=56 + +A googol (10^100) is a massive number: one followed by one-hundred zeros; +100^100 is almost unimaginably large: one followed by two-hundred zeros. +Despite their size, the sum of the digits in each number is only 1. + +Considering natural numbers of the form, ab, where a, b < 100, +what is the maximum digital sum? +""" + + +def solution(a: int = 100, b: int = 100) -> int: + """ + Considering natural numbers of the form, a**b, where a, b < 100, + what is the maximum digital sum? + :param a: + :param b: + :return: + >>> solution(10,10) + 45 + + >>> solution(100,100) + 972 + + >>> solution(100,200) + 1872 + """ + + # RETURN the MAXIMUM from the list of SUMs of the list of INT converted from STR of + # BASE raised to the POWER + return max( + [ + sum([int(x) for x in str(base ** power)]) + for base in range(a) + for power in range(b) + ] + ) + + +# Tests +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/project_euler/problem_057/__init__.py b/python-mega-algo/project_euler/problem_057/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/project_euler/problem_057/right.html b/python-mega-algo/project_euler/problem_057/right.html new file mode 100644 index 00000000..2078e7db --- /dev/null +++ b/python-mega-algo/project_euler/problem_057/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/project_euler/problem_057 + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    sol1.py __init__.py 
    + +

    +Folders: 1
    +Files: 2
    +Size of all files: 1493 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/project_euler/problem_057/sol1.py b/python-mega-algo/project_euler/problem_057/sol1.py new file mode 100644 index 00000000..04b6199f --- /dev/null +++ b/python-mega-algo/project_euler/problem_057/sol1.py @@ -0,0 +1,48 @@ +""" +Project Euler Problem 57: https://projecteuler.net/problem=57 +It is possible to show that the square root of two can be expressed as an infinite +continued fraction. + +sqrt(2) = 1 + 1 / (2 + 1 / (2 + 1 / (2 + ...))) + +By expanding this for the first four iterations, we get: +1 + 1 / 2 = 3 / 2 = 1.5 +1 + 1 / (2 + 1 / 2} = 7 / 5 = 1.4 +1 + 1 / (2 + 1 / (2 + 1 / 2)) = 17 / 12 = 1.41666... +1 + 1 / (2 + 1 / (2 + 1 / (2 + 1 / 2))) = 41/ 29 = 1.41379... + +The next three expansions are 99/70, 239/169, and 577/408, but the eighth expansion, +1393/985, is the first example where the number of digits in the numerator exceeds +the number of digits in the denominator. + +In the first one-thousand expansions, how many fractions contain a numerator with +more digits than the denominator? +""" + + +def solution(n: int = 1000) -> int: + """ + returns number of fractions containing a numerator with more digits than + the denominator in the first n expansions. + >>> solution(14) + 2 + >>> solution(100) + 15 + >>> solution(10000) + 1508 + """ + prev_numerator, prev_denominator = 1, 1 + result = [] + for i in range(1, n + 1): + numerator = prev_numerator + 2 * prev_denominator + denominator = prev_numerator + prev_denominator + if len(str(numerator)) > len(str(denominator)): + result.append(i) + prev_numerator = numerator + prev_denominator = denominator + + return len(result) + + +if __name__ == "__main__": + print(f"{solution() = }") diff --git a/python-mega-algo/project_euler/problem_058/__init__.py b/python-mega-algo/project_euler/problem_058/__init__.py new file mode 100644 index 00000000..792d6005 --- /dev/null +++ b/python-mega-algo/project_euler/problem_058/__init__.py @@ -0,0 +1 @@ +# diff --git a/python-mega-algo/project_euler/problem_058/right.html b/python-mega-algo/project_euler/problem_058/right.html new file mode 100644 index 00000000..b1a37281 --- /dev/null +++ b/python-mega-algo/project_euler/problem_058/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/project_euler/problem_058 + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    sol1.py __init__.py 
    + +

    +Folders: 1
    +Files: 2
    +Size of all files: 2224 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/project_euler/problem_058/sol1.py b/python-mega-algo/project_euler/problem_058/sol1.py new file mode 100644 index 00000000..d3b15157 --- /dev/null +++ b/python-mega-algo/project_euler/problem_058/sol1.py @@ -0,0 +1,86 @@ +""" +Project Euler Problem 58:https://projecteuler.net/problem=58 + + +Starting with 1 and spiralling anticlockwise in the following way, +a square spiral with side length 7 is formed. + +37 36 35 34 33 32 31 +38 17 16 15 14 13 30 +39 18 5 4 3 12 29 +40 19 6 1 2 11 28 +41 20 7 8 9 10 27 +42 21 22 23 24 25 26 +43 44 45 46 47 48 49 + +It is interesting to note that the odd squares lie along the bottom right +diagonal ,but what is more interesting is that 8 out of the 13 numbers +lying along both diagonals are prime; that is, a ratio of 8/13 ≈ 62%. + +If one complete new layer is wrapped around the spiral above, +a square spiral with side length 9 will be formed. +If this process is continued, +what is the side length of the square spiral for which +the ratio of primes along both diagonals first falls below 10%? + +Solution: We have to find an odd length side for which square falls below +10%. With every layer we add 4 elements are being added to the diagonals +,lets say we have a square spiral of odd length with side length j, +then if we move from j to j+2, we are adding j*j+j+1,j*j+2*(j+1),j*j+3*(j+1) +j*j+4*(j+1). Out of these 4 only the first three can become prime +because last one reduces to (j+2)*(j+2). +So we check individually each one of these before incrementing our +count of current primes. + +""" + + +def isprime(d: int) -> int: + """ + returns whether the given digit is prime or not + >>> isprime(1) + 0 + >>> isprime(17) + 1 + >>> isprime(10000) + 0 + """ + if d == 1: + return 0 + + i = 2 + while i * i <= d: + if d % i == 0: + return 0 + i = i + 1 + return 1 + + +def solution(ratio: float = 0.1) -> int: + """ + returns the side length of the square spiral of odd length greater + than 1 for which the ratio of primes along both diagonals + first falls below the given ratio. + >>> solution(.5) + 11 + >>> solution(.2) + 309 + >>> solution(.111) + 11317 + """ + + j = 3 + primes = 3 + + while primes / (2 * j - 1) >= ratio: + for i in range(j * j + j + 1, (j + 2) * (j + 2), j + 1): + primes = primes + isprime(i) + + j = j + 2 + return j + + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/project_euler/problem_059/__init__.py b/python-mega-algo/project_euler/problem_059/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/project_euler/problem_059/p059_cipher.txt b/python-mega-algo/project_euler/problem_059/p059_cipher.txt new file mode 100644 index 00000000..b3b32472 --- /dev/null +++ b/python-mega-algo/project_euler/problem_059/p059_cipher.txt @@ -0,0 +1 @@ +36,22,80,0,0,4,23,25,19,17,88,4,4,19,21,11,88,22,23,23,29,69,12,24,0,88,25,11,12,2,10,28,5,6,12,25,10,22,80,10,30,80,10,22,21,69,23,22,69,61,5,9,29,2,66,11,80,8,23,3,17,88,19,0,20,21,7,10,17,17,29,20,69,8,17,21,29,2,22,84,80,71,60,21,69,11,5,8,21,25,22,88,3,0,10,25,0,10,5,8,88,2,0,27,25,21,10,31,6,25,2,16,21,82,69,35,63,11,88,4,13,29,80,22,13,29,22,88,31,3,88,3,0,10,25,0,11,80,10,30,80,23,29,19,12,8,2,10,27,17,9,11,45,95,88,57,69,16,17,19,29,80,23,29,19,0,22,4,9,1,80,3,23,5,11,28,92,69,9,5,12,12,21,69,13,30,0,0,0,0,27,4,0,28,28,28,84,80,4,22,80,0,20,21,2,25,30,17,88,21,29,8,2,0,11,3,12,23,30,69,30,31,23,88,4,13,29,80,0,22,4,12,10,21,69,11,5,8,88,31,3,88,4,13,17,3,69,11,21,23,17,21,22,88,65,69,83,80,84,87,68,69,83,80,84,87,73,69,83,80,84,87,65,83,88,91,69,29,4,6,86,92,69,15,24,12,27,24,69,28,21,21,29,30,1,11,80,10,22,80,17,16,21,69,9,5,4,28,2,4,12,5,23,29,80,10,30,80,17,16,21,69,27,25,23,27,28,0,84,80,22,23,80,17,16,17,17,88,25,3,88,4,13,29,80,17,10,5,0,88,3,16,21,80,10,30,80,17,16,25,22,88,3,0,10,25,0,11,80,12,11,80,10,26,4,4,17,30,0,28,92,69,30,2,10,21,80,12,12,80,4,12,80,10,22,19,0,88,4,13,29,80,20,13,17,1,10,17,17,13,2,0,88,31,3,88,4,13,29,80,6,17,2,6,20,21,69,30,31,9,20,31,18,11,94,69,54,17,8,29,28,28,84,80,44,88,24,4,14,21,69,30,31,16,22,20,69,12,24,4,12,80,17,16,21,69,11,5,8,88,31,3,88,4,13,17,3,69,11,21,23,17,21,22,88,25,22,88,17,69,11,25,29,12,24,69,8,17,23,12,80,10,30,80,17,16,21,69,11,1,16,25,2,0,88,31,3,88,4,13,29,80,21,29,2,12,21,21,17,29,2,69,23,22,69,12,24,0,88,19,12,10,19,9,29,80,18,16,31,22,29,80,1,17,17,8,29,4,0,10,80,12,11,80,84,67,80,10,10,80,7,1,80,21,13,4,17,17,30,2,88,4,13,29,80,22,13,29,69,23,22,69,12,24,12,11,80,22,29,2,12,29,3,69,29,1,16,25,28,69,12,31,69,11,92,69,17,4,69,16,17,22,88,4,13,29,80,23,25,4,12,23,80,22,9,2,17,80,70,76,88,29,16,20,4,12,8,28,12,29,20,69,26,9,69,11,80,17,23,80,84,88,31,3,88,4,13,29,80,21,29,2,12,21,21,17,29,2,69,12,31,69,12,24,0,88,20,12,25,29,0,12,21,23,86,80,44,88,7,12,20,28,69,11,31,10,22,80,22,16,31,18,88,4,13,25,4,69,12,24,0,88,3,16,21,80,10,30,80,17,16,25,22,88,3,0,10,25,0,11,80,17,23,80,7,29,80,4,8,0,23,23,8,12,21,17,17,29,28,28,88,65,75,78,68,81,65,67,81,72,70,83,64,68,87,74,70,81,75,70,81,67,80,4,22,20,69,30,2,10,21,80,8,13,28,17,17,0,9,1,25,11,31,80,17,16,25,22,88,30,16,21,18,0,10,80,7,1,80,22,17,8,73,88,17,11,28,80,17,16,21,11,88,4,4,19,25,11,31,80,17,16,21,69,11,1,16,25,2,0,88,2,10,23,4,73,88,4,13,29,80,11,13,29,7,29,2,69,75,94,84,76,65,80,65,66,83,77,67,80,64,73,82,65,67,87,75,72,69,17,3,69,17,30,1,29,21,1,88,0,23,23,20,16,27,21,1,84,80,18,16,25,6,16,80,0,0,0,23,29,3,22,29,3,69,12,24,0,88,0,0,10,25,8,29,4,0,10,80,10,30,80,4,88,19,12,10,19,9,29,80,18,16,31,22,29,80,1,17,17,8,29,4,0,10,80,12,11,80,84,86,80,35,23,28,9,23,7,12,22,23,69,25,23,4,17,30,69,12,24,0,88,3,4,21,21,69,11,4,0,8,3,69,26,9,69,15,24,12,27,24,69,49,80,13,25,20,69,25,2,23,17,6,0,28,80,4,12,80,17,16,25,22,88,3,16,21,92,69,49,80,13,25,6,0,88,20,12,11,19,10,14,21,23,29,20,69,12,24,4,12,80,17,16,21,69,11,5,8,88,31,3,88,4,13,29,80,22,29,2,12,29,3,69,73,80,78,88,65,74,73,70,69,83,80,84,87,72,84,88,91,69,73,95,87,77,70,69,83,80,84,87,70,87,77,80,78,88,21,17,27,94,69,25,28,22,23,80,1,29,0,0,22,20,22,88,31,11,88,4,13,29,80,20,13,17,1,10,17,17,13,2,0,88,31,3,88,4,13,29,80,6,17,2,6,20,21,75,88,62,4,21,21,9,1,92,69,12,24,0,88,3,16,21,80,10,30,80,17,16,25,22,88,29,16,20,4,12,8,28,12,29,20,69,26,9,69,65,64,69,31,25,19,29,3,69,12,24,0,88,18,12,9,5,4,28,2,4,12,21,69,80,22,10,13,2,17,16,80,21,23,7,0,10,89,69,23,22,69,12,24,0,88,19,12,10,19,16,21,22,0,10,21,11,27,21,69,23,22,69,12,24,0,88,0,0,10,25,8,29,4,0,10,80,10,30,80,4,88,19,12,10,19,9,29,80,18,16,31,22,29,80,1,17,17,8,29,4,0,10,80,12,11,80,84,86,80,36,22,20,69,26,9,69,11,25,8,17,28,4,10,80,23,29,17,22,23,30,12,22,23,69,49,80,13,25,6,0,88,28,12,19,21,18,17,3,0,88,18,0,29,30,69,25,18,9,29,80,17,23,80,1,29,4,0,10,29,12,22,21,69,12,24,0,88,3,16,21,3,69,23,22,69,12,24,0,88,3,16,26,3,0,9,5,0,22,4,69,11,21,23,17,21,22,88,25,11,88,7,13,17,19,13,88,4,13,29,80,0,0,0,10,22,21,11,12,3,69,25,2,0,88,21,19,29,30,69,22,5,8,26,21,23,11,94 \ No newline at end of file diff --git a/python-mega-algo/project_euler/problem_059/right.html b/python-mega-algo/project_euler/problem_059/right.html new file mode 100644 index 00000000..81b35125 --- /dev/null +++ b/python-mega-algo/project_euler/problem_059/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/project_euler/problem_059 + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    sol1.py __init__.py p059_cipher.txt test_cipher.txt 
    + +

    +Folders: 1
    +Files: 4
    +Size of all files: 9065 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/project_euler/problem_059/sol1.py b/python-mega-algo/project_euler/problem_059/sol1.py new file mode 100644 index 00000000..1f55029b --- /dev/null +++ b/python-mega-algo/project_euler/problem_059/sol1.py @@ -0,0 +1,128 @@ +""" +Each character on a computer is assigned a unique code and the preferred standard is +ASCII (American Standard Code for Information Interchange). +For example, uppercase A = 65, asterisk (*) = 42, and lowercase k = 107. + +A modern encryption method is to take a text file, convert the bytes to ASCII, then +XOR each byte with a given value, taken from a secret key. The advantage with the +XOR function is that using the same encryption key on the cipher text, restores +the plain text; for example, 65 XOR 42 = 107, then 107 XOR 42 = 65. + +For unbreakable encryption, the key is the same length as the plain text message, and +the key is made up of random bytes. The user would keep the encrypted message and the +encryption key in different locations, and without both "halves", it is impossible to +decrypt the message. + +Unfortunately, this method is impractical for most users, so the modified method is +to use a password as a key. If the password is shorter than the message, which is +likely, the key is repeated cyclically throughout the message. The balance for this +method is using a sufficiently long password key for security, but short enough to +be memorable. + +Your task has been made easy, as the encryption key consists of three lower case +characters. Using p059_cipher.txt (right click and 'Save Link/Target As...'), a +file containing the encrypted ASCII codes, and the knowledge that the plain text +must contain common English words, decrypt the message and find the sum of the ASCII +values in the original text. +""" + + +import string +from itertools import cycle, product +from pathlib import Path +from typing import List, Optional, Set, Tuple + +VALID_CHARS: str = ( + string.ascii_letters + string.digits + string.punctuation + string.whitespace +) +LOWERCASE_INTS: List[int] = [ord(letter) for letter in string.ascii_lowercase] +VALID_INTS: Set[int] = {ord(char) for char in VALID_CHARS} + +COMMON_WORDS: List[str] = ["the", "be", "to", "of", "and", "in", "that", "have"] + + +def try_key(ciphertext: List[int], key: Tuple[int, ...]) -> Optional[str]: + """ + Given an encrypted message and a possible 3-character key, decrypt the message. + If the decrypted message contains a invalid character, i.e. not an ASCII letter, + a digit, punctuation or whitespace, then we know the key is incorrect, so return + None. + >>> try_key([0, 17, 20, 4, 27], (104, 116, 120)) + 'hello' + >>> try_key([68, 10, 300, 4, 27], (104, 116, 120)) is None + True + """ + decoded: str = "" + keychar: int + cipherchar: int + decodedchar: int + + for keychar, cipherchar in zip(cycle(key), ciphertext): + decodedchar = cipherchar ^ keychar + if decodedchar not in VALID_INTS: + return None + decoded += chr(decodedchar) + + return decoded + + +def filter_valid_chars(ciphertext: List[int]) -> List[str]: + """ + Given an encrypted message, test all 3-character strings to try and find the + key. Return a list of the possible decrypted messages. + >>> from itertools import cycle + >>> text = "The enemy's gate is down" + >>> key = "end" + >>> encoded = [ord(k) ^ ord(c) for k,c in zip(cycle(key), text)] + >>> text in filter_valid_chars(encoded) + True + """ + possibles: List[str] = [] + for key in product(LOWERCASE_INTS, repeat=3): + encoded = try_key(ciphertext, key) + if encoded is not None: + possibles.append(encoded) + return possibles + + +def filter_common_word(possibles: List[str], common_word: str) -> List[str]: + """ + Given a list of possible decoded messages, narrow down the possibilities + for checking for the presence of a specified common word. Only decoded messages + containing common_word will be returned. + >>> filter_common_word(['asfla adf', 'I am here', ' !?! #a'], 'am') + ['I am here'] + >>> filter_common_word(['athla amf', 'I am here', ' !?! #a'], 'am') + ['athla amf', 'I am here'] + """ + return [possible for possible in possibles if common_word in possible.lower()] + + +def solution(filename: str = "p059_cipher.txt") -> int: + """ + Test the ciphertext against all possible 3-character keys, then narrow down the + possibilities by filtering using common words until there's only one possible + decoded message. + >>> solution("test_cipher.txt") + 3000 + """ + ciphertext: List[int] + possibles: List[str] + common_word: str + decoded_text: str + data: str = Path(__file__).parent.joinpath(filename).read_text(encoding="utf-8") + + ciphertext = [int(number) for number in data.strip().split(",")] + + possibles = filter_valid_chars(ciphertext) + for common_word in COMMON_WORDS: + possibles = filter_common_word(possibles, common_word) + if len(possibles) == 1: + break + + decoded_text = possibles[0] + return sum([ord(char) for char in decoded_text]) + + +if __name__ == "__main__": + print(f"{solution() = }") diff --git a/python-mega-algo/project_euler/problem_059/test_cipher.txt b/python-mega-algo/project_euler/problem_059/test_cipher.txt new file mode 100644 index 00000000..27c53740 --- /dev/null +++ b/python-mega-algo/project_euler/problem_059/test_cipher.txt @@ -0,0 +1 @@ +63,13,28,75,0,23,14,8,0,76,22,89,12,4,13,14,69,16,24,69,29,4,18,23,69,69,59,14,69,11,14,4,29,18 diff --git a/python-mega-algo/project_euler/problem_062/__init__.py b/python-mega-algo/project_euler/problem_062/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/project_euler/problem_062/right.html b/python-mega-algo/project_euler/problem_062/right.html new file mode 100644 index 00000000..9c32837a --- /dev/null +++ b/python-mega-algo/project_euler/problem_062/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/project_euler/problem_062 + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    sol1.py __init__.py 
    + +

    +Folders: 1
    +Files: 2
    +Size of all files: 1622 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/project_euler/problem_062/sol1.py b/python-mega-algo/project_euler/problem_062/sol1.py new file mode 100644 index 00000000..83286c80 --- /dev/null +++ b/python-mega-algo/project_euler/problem_062/sol1.py @@ -0,0 +1,62 @@ +""" +Project Euler 62 +https://projecteuler.net/problem=62 + +The cube, 41063625 (345^3), can be permuted to produce two other cubes: +56623104 (384^3) and 66430125 (405^3). In fact, 41063625 is the smallest cube +which has exactly three permutations of its digits which are also cube. + +Find the smallest cube for which exactly five permutations of its digits are +cube. +""" + +from collections import defaultdict + + +def solution(max_base: int = 5) -> int: + """ + Iterate through every possible cube and sort the cube's digits in + ascending order. Sorting maintains an ordering of the digits that allows + you to compare permutations. Store each sorted sequence of digits in a + dictionary, whose key is the sequence of digits and value is a list of + numbers that are the base of the cube. + + Once you find 5 numbers that produce the same sequence of digits, return + the smallest one, which is at index 0 since we insert each base number in + ascending order. + + >>> solution(2) + 125 + >>> solution(3) + 41063625 + """ + freqs = defaultdict(list) + num = 0 + + while True: + digits = get_digits(num) + freqs[digits].append(num) + + if len(freqs[digits]) == max_base: + base = freqs[digits][0] ** 3 + return base + + num += 1 + + +def get_digits(num: int) -> str: + """ + Computes the sorted sequence of digits of the cube of num. + + >>> get_digits(3) + '27' + >>> get_digits(99) + '027999' + >>> get_digits(123) + '0166788' + """ + return "".join(sorted(list(str(num ** 3)))) + + +if __name__ == "__main__": + print(f"{solution() = }") diff --git a/python-mega-algo/project_euler/problem_063/__init__.py b/python-mega-algo/project_euler/problem_063/__init__.py new file mode 100644 index 00000000..792d6005 --- /dev/null +++ b/python-mega-algo/project_euler/problem_063/__init__.py @@ -0,0 +1 @@ +# diff --git a/python-mega-algo/project_euler/problem_063/right.html b/python-mega-algo/project_euler/problem_063/right.html new file mode 100644 index 00000000..8b9211dd --- /dev/null +++ b/python-mega-algo/project_euler/problem_063/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/project_euler/problem_063 + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    sol1.py __init__.py 
    + +

    +Folders: 1
    +Files: 2
    +Size of all files: 913 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/project_euler/problem_063/sol1.py b/python-mega-algo/project_euler/problem_063/sol1.py new file mode 100644 index 00000000..bfc642be --- /dev/null +++ b/python-mega-algo/project_euler/problem_063/sol1.py @@ -0,0 +1,34 @@ +""" +The 5-digit number, 16807=75, is also a fifth power. Similarly, the 9-digit number, +134217728=89, is a ninth power. +How many n-digit positive integers exist which are also an nth power? +""" + +""" +The maximum base can be 9 because all n-digit numbers < 10^n. +Now 9**23 has 22 digits so the maximum power can be 22. +Using these conclusions, we will calculate the result. +""" + + +def solution(max_base: int = 10, max_power: int = 22) -> int: + """ + Returns the count of all n-digit numbers which are nth power + >>> solution(10, 22) + 49 + >>> solution(0, 0) + 0 + >>> solution(1, 1) + 0 + >>> solution(-1, -1) + 0 + """ + bases = range(1, max_base) + powers = range(1, max_power) + return sum( + 1 for power in powers for base in bases if len(str(base ** power)) == power + ) + + +if __name__ == "__main__": + print(f"{solution(10, 22) = }") diff --git a/python-mega-algo/project_euler/problem_064/__init__.py b/python-mega-algo/project_euler/problem_064/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/project_euler/problem_064/right.html b/python-mega-algo/project_euler/problem_064/right.html new file mode 100644 index 00000000..5a232338 --- /dev/null +++ b/python-mega-algo/project_euler/problem_064/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/project_euler/problem_064 + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    sol1.py __init__.py 
    + +

    +Folders: 1
    +Files: 2
    +Size of all files: 2082 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/project_euler/problem_064/sol1.py b/python-mega-algo/project_euler/problem_064/sol1.py new file mode 100644 index 00000000..69e3f6d9 --- /dev/null +++ b/python-mega-algo/project_euler/problem_064/sol1.py @@ -0,0 +1,77 @@ +""" +Project Euler Problem 64: https://projecteuler.net/problem=64 + +All square roots are periodic when written as continued fractions. +For example, let us consider sqrt(23). +It can be seen that the sequence is repeating. +For conciseness, we use the notation sqrt(23)=[4;(1,3,1,8)], +to indicate that the block (1,3,1,8) repeats indefinitely. +Exactly four continued fractions, for N<=13, have an odd period. +How many continued fractions for N<=10000 have an odd period? + +References: +- https://en.wikipedia.org/wiki/Continued_fraction +""" + +from math import floor, sqrt + + +def continuous_fraction_period(n: int) -> int: + """ + Returns the continued fraction period of a number n. + + >>> continuous_fraction_period(2) + 1 + >>> continuous_fraction_period(5) + 1 + >>> continuous_fraction_period(7) + 4 + >>> continuous_fraction_period(11) + 2 + >>> continuous_fraction_period(13) + 5 + """ + numerator = 0.0 + denominator = 1.0 + ROOT = int(sqrt(n)) + integer_part = ROOT + period = 0 + while integer_part != 2 * ROOT: + numerator = denominator * integer_part - numerator + denominator = (n - numerator ** 2) / denominator + integer_part = int((ROOT + numerator) / denominator) + period += 1 + return period + + +def solution(n: int = 10000) -> int: + """ + Returns the count of numbers <= 10000 with odd periods. + This function calls continuous_fraction_period for numbers which are + not perfect squares. + This is checked in if sr - floor(sr) != 0 statement. + If an odd period is returned by continuous_fraction_period, + count_odd_periods is increased by 1. + + >>> solution(2) + 1 + >>> solution(5) + 2 + >>> solution(7) + 2 + >>> solution(11) + 3 + >>> solution(13) + 4 + """ + count_odd_periods = 0 + for i in range(2, n + 1): + sr = sqrt(i) + if sr - floor(sr) != 0: + if continuous_fraction_period(i) % 2 == 1: + count_odd_periods += 1 + return count_odd_periods + + +if __name__ == "__main__": + print(f"{solution(int(input().strip()))}") diff --git a/python-mega-algo/project_euler/problem_065/__init__.py b/python-mega-algo/project_euler/problem_065/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/project_euler/problem_065/right.html b/python-mega-algo/project_euler/problem_065/right.html new file mode 100644 index 00000000..5ffea13d --- /dev/null +++ b/python-mega-algo/project_euler/problem_065/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/project_euler/problem_065 + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    sol1.py __init__.py 
    + +

    +Folders: 1
    +Files: 2
    +Size of all files: 2569 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/project_euler/problem_065/sol1.py b/python-mega-algo/project_euler/problem_065/sol1.py new file mode 100644 index 00000000..229769a7 --- /dev/null +++ b/python-mega-algo/project_euler/problem_065/sol1.py @@ -0,0 +1,99 @@ +""" +Project Euler Problem 65: https://projecteuler.net/problem=65 + +The square root of 2 can be written as an infinite continued fraction. + +sqrt(2) = 1 + 1 / (2 + 1 / (2 + 1 / (2 + 1 / (2 + ...)))) + +The infinite continued fraction can be written, sqrt(2) = [1;(2)], (2) +indicates that 2 repeats ad infinitum. In a similar way, sqrt(23) = +[4;(1,3,1,8)]. + +It turns out that the sequence of partial values of continued +fractions for square roots provide the best rational approximations. +Let us consider the convergents for sqrt(2). + +1 + 1 / 2 = 3/2 +1 + 1 / (2 + 1 / 2) = 7/5 +1 + 1 / (2 + 1 / (2 + 1 / 2)) = 17/12 +1 + 1 / (2 + 1 / (2 + 1 / (2 + 1 / 2))) = 41/29 + +Hence the sequence of the first ten convergents for sqrt(2) are: +1, 3/2, 7/5, 17/12, 41/29, 99/70, 239/169, 577/408, 1393/985, 3363/2378, ... + +What is most surprising is that the important mathematical constant, +e = [2;1,2,1,1,4,1,1,6,1,...,1,2k,1,...]. + +The first ten terms in the sequence of convergents for e are: +2, 3, 8/3, 11/4, 19/7, 87/32, 106/39, 193/71, 1264/465, 1457/536, ... + +The sum of digits in the numerator of the 10th convergent is +1 + 4 + 5 + 7 = 17. + +Find the sum of the digits in the numerator of the 100th convergent +of the continued fraction for e. + +----- + +The solution mostly comes down to finding an equation that will generate +the numerator of the continued fraction. For the i-th numerator, the +pattern is: + +n_i = m_i * n_(i-1) + n_(i-2) + +for m_i = the i-th index of the continued fraction representation of e, +n_0 = 1, and n_1 = 2 as the first 2 numbers of the representation. + +For example: +n_9 = 6 * 193 + 106 = 1264 +1 + 2 + 6 + 4 = 13 + +n_10 = 1 * 193 + 1264 = 1457 +1 + 4 + 5 + 7 = 17 +""" + + +def sum_digits(num: int) -> int: + """ + Returns the sum of every digit in num. + + >>> sum_digits(1) + 1 + >>> sum_digits(12345) + 15 + >>> sum_digits(999001) + 28 + """ + digit_sum = 0 + while num > 0: + digit_sum += num % 10 + num //= 10 + return digit_sum + + +def solution(max: int = 100) -> int: + """ + Returns the sum of the digits in the numerator of the max-th convergent of + the continued fraction for e. + + >>> solution(9) + 13 + >>> solution(10) + 17 + >>> solution(50) + 91 + """ + pre_numerator = 1 + cur_numerator = 2 + + for i in range(2, max + 1): + temp = pre_numerator + e_cont = 2 * i // 3 if i % 3 == 0 else 1 + pre_numerator = cur_numerator + cur_numerator = e_cont * pre_numerator + temp + + return sum_digits(cur_numerator) + + +if __name__ == "__main__": + print(f"{solution() = }") diff --git a/python-mega-algo/project_euler/problem_067/__init__.py b/python-mega-algo/project_euler/problem_067/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/project_euler/problem_067/right.html b/python-mega-algo/project_euler/problem_067/right.html new file mode 100644 index 00000000..5e590f6f --- /dev/null +++ b/python-mega-algo/project_euler/problem_067/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/project_euler/problem_067 + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    sol1.py __init__.py triangle.txt 
    + +

    +Folders: 1
    +Files: 3
    +Size of all files: 16411 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/project_euler/problem_067/sol1.py b/python-mega-algo/project_euler/problem_067/sol1.py new file mode 100644 index 00000000..ebfa865a --- /dev/null +++ b/python-mega-algo/project_euler/problem_067/sol1.py @@ -0,0 +1,49 @@ +""" +Problem Statement: +By starting at the top of the triangle below and moving to adjacent numbers on +the row below, the maximum total from top to bottom is 23. +3 +7 4 +2 4 6 +8 5 9 3 +That is, 3 + 7 + 4 + 9 = 23. +Find the maximum total from top to bottom in triangle.txt (right click and +'Save Link/Target As...'), a 15K text file containing a triangle with +one-hundred rows. +""" +import os + + +def solution(): + """ + Finds the maximum total in a triangle as described by the problem statement + above. + + >>> solution() + 7273 + """ + script_dir = os.path.dirname(os.path.realpath(__file__)) + triangle = os.path.join(script_dir, "triangle.txt") + + with open(triangle) as f: + triangle = f.readlines() + + a = map(lambda x: x.rstrip("\r\n").split(" "), triangle) + a = list(map(lambda x: list(map(lambda y: int(y), x)), a)) + + for i in range(1, len(a)): + for j in range(len(a[i])): + if j != len(a[i - 1]): + number1 = a[i - 1][j] + else: + number1 = 0 + if j > 0: + number2 = a[i - 1][j - 1] + else: + number2 = 0 + a[i][j] += max(number1, number2) + return max(a[-1]) + + +if __name__ == "__main__": + print(solution()) diff --git a/python-mega-algo/project_euler/problem_067/triangle.txt b/python-mega-algo/project_euler/problem_067/triangle.txt new file mode 100644 index 00000000..00aa2bc6 --- /dev/null +++ b/python-mega-algo/project_euler/problem_067/triangle.txt @@ -0,0 +1,100 @@ +59 +73 41 +52 40 09 +26 53 06 34 +10 51 87 86 81 +61 95 66 57 25 68 +90 81 80 38 92 67 73 +30 28 51 76 81 18 75 44 +84 14 95 87 62 81 17 78 58 +21 46 71 58 02 79 62 39 31 09 +56 34 35 53 78 31 81 18 90 93 15 +78 53 04 21 84 93 32 13 97 11 37 51 +45 03 81 79 05 18 78 86 13 30 63 99 95 +39 87 96 28 03 38 42 17 82 87 58 07 22 57 +06 17 51 17 07 93 09 07 75 97 95 78 87 08 53 +67 66 59 60 88 99 94 65 55 77 55 34 27 53 78 28 +76 40 41 04 87 16 09 42 75 69 23 97 30 60 10 79 87 +12 10 44 26 21 36 32 84 98 60 13 12 36 16 63 31 91 35 +70 39 06 05 55 27 38 48 28 22 34 35 62 62 15 14 94 89 86 +66 56 68 84 96 21 34 34 34 81 62 40 65 54 62 05 98 03 02 60 +38 89 46 37 99 54 34 53 36 14 70 26 02 90 45 13 31 61 83 73 47 +36 10 63 96 60 49 41 05 37 42 14 58 84 93 96 17 09 43 05 43 06 59 +66 57 87 57 61 28 37 51 84 73 79 15 39 95 88 87 43 39 11 86 77 74 18 +54 42 05 79 30 49 99 73 46 37 50 02 45 09 54 52 27 95 27 65 19 45 26 45 +71 39 17 78 76 29 52 90 18 99 78 19 35 62 71 19 23 65 93 85 49 33 75 09 02 +33 24 47 61 60 55 32 88 57 55 91 54 46 57 07 77 98 52 80 99 24 25 46 78 79 05 +92 09 13 55 10 67 26 78 76 82 63 49 51 31 24 68 05 57 07 54 69 21 67 43 17 63 12 +24 59 06 08 98 74 66 26 61 60 13 03 09 09 24 30 71 08 88 70 72 70 29 90 11 82 41 34 +66 82 67 04 36 60 92 77 91 85 62 49 59 61 30 90 29 94 26 41 89 04 53 22 83 41 09 74 90 +48 28 26 37 28 52 77 26 51 32 18 98 79 36 62 13 17 08 19 54 89 29 73 68 42 14 08 16 70 37 +37 60 69 70 72 71 09 59 13 60 38 13 57 36 09 30 43 89 30 39 15 02 44 73 05 73 26 63 56 86 12 +55 55 85 50 62 99 84 77 28 85 03 21 27 22 19 26 82 69 54 04 13 07 85 14 01 15 70 59 89 95 10 19 +04 09 31 92 91 38 92 86 98 75 21 05 64 42 62 84 36 20 73 42 21 23 22 51 51 79 25 45 85 53 03 43 22 +75 63 02 49 14 12 89 14 60 78 92 16 44 82 38 30 72 11 46 52 90 27 08 65 78 03 85 41 57 79 39 52 33 48 +78 27 56 56 39 13 19 43 86 72 58 95 39 07 04 34 21 98 39 15 39 84 89 69 84 46 37 57 59 35 59 50 26 15 93 +42 89 36 27 78 91 24 11 17 41 05 94 07 69 51 96 03 96 47 90 90 45 91 20 50 56 10 32 36 49 04 53 85 92 25 65 +52 09 61 30 61 97 66 21 96 92 98 90 06 34 96 60 32 69 68 33 75 84 18 31 71 50 84 63 03 03 19 11 28 42 75 45 45 +61 31 61 68 96 34 49 39 05 71 76 59 62 67 06 47 96 99 34 21 32 47 52 07 71 60 42 72 94 56 82 83 84 40 94 87 82 46 +01 20 60 14 17 38 26 78 66 81 45 95 18 51 98 81 48 16 53 88 37 52 69 95 72 93 22 34 98 20 54 27 73 61 56 63 60 34 63 +93 42 94 83 47 61 27 51 79 79 45 01 44 73 31 70 83 42 88 25 53 51 30 15 65 94 80 44 61 84 12 77 02 62 02 65 94 42 14 94 +32 73 09 67 68 29 74 98 10 19 85 48 38 31 85 67 53 93 93 77 47 67 39 72 94 53 18 43 77 40 78 32 29 59 24 06 02 83 50 60 66 +32 01 44 30 16 51 15 81 98 15 10 62 86 79 50 62 45 60 70 38 31 85 65 61 64 06 69 84 14 22 56 43 09 48 66 69 83 91 60 40 36 61 +92 48 22 99 15 95 64 43 01 16 94 02 99 19 17 69 11 58 97 56 89 31 77 45 67 96 12 73 08 20 36 47 81 44 50 64 68 85 40 81 85 52 09 +91 35 92 45 32 84 62 15 19 64 21 66 06 01 52 80 62 59 12 25 88 28 91 50 40 16 22 99 92 79 87 51 21 77 74 77 07 42 38 42 74 83 02 05 +46 19 77 66 24 18 05 32 02 84 31 99 92 58 96 72 91 36 62 99 55 29 53 42 12 37 26 58 89 50 66 19 82 75 12 48 24 87 91 85 02 07 03 76 86 +99 98 84 93 07 17 33 61 92 20 66 60 24 66 40 30 67 05 37 29 24 96 03 27 70 62 13 04 45 47 59 88 43 20 66 15 46 92 30 04 71 66 78 70 53 99 +67 60 38 06 88 04 17 72 10 99 71 07 42 25 54 05 26 64 91 50 45 71 06 30 67 48 69 82 08 56 80 67 18 46 66 63 01 20 08 80 47 07 91 16 03 79 87 +18 54 78 49 80 48 77 40 68 23 60 88 58 80 33 57 11 69 55 53 64 02 94 49 60 92 16 35 81 21 82 96 25 24 96 18 02 05 49 03 50 77 06 32 84 27 18 38 +68 01 50 04 03 21 42 94 53 24 89 05 92 26 52 36 68 11 85 01 04 42 02 45 15 06 50 04 53 73 25 74 81 88 98 21 67 84 79 97 99 20 95 04 40 46 02 58 87 +94 10 02 78 88 52 21 03 88 60 06 53 49 71 20 91 12 65 07 49 21 22 11 41 58 99 36 16 09 48 17 24 52 36 23 15 72 16 84 56 02 99 43 76 81 71 29 39 49 17 +64 39 59 84 86 16 17 66 03 09 43 06 64 18 63 29 68 06 23 07 87 14 26 35 17 12 98 41 53 64 78 18 98 27 28 84 80 67 75 62 10 11 76 90 54 10 05 54 41 39 66 +43 83 18 37 32 31 52 29 95 47 08 76 35 11 04 53 35 43 34 10 52 57 12 36 20 39 40 55 78 44 07 31 38 26 08 15 56 88 86 01 52 62 10 24 32 05 60 65 53 28 57 99 +03 50 03 52 07 73 49 92 66 80 01 46 08 67 25 36 73 93 07 42 25 53 13 96 76 83 87 90 54 89 78 22 78 91 73 51 69 09 79 94 83 53 09 40 69 62 10 79 49 47 03 81 30 +71 54 73 33 51 76 59 54 79 37 56 45 84 17 62 21 98 69 41 95 65 24 39 37 62 03 24 48 54 64 46 82 71 78 33 67 09 16 96 68 52 74 79 68 32 21 13 78 96 60 09 69 20 36 +73 26 21 44 46 38 17 83 65 98 07 23 52 46 61 97 33 13 60 31 70 15 36 77 31 58 56 93 75 68 21 36 69 53 90 75 25 82 39 50 65 94 29 30 11 33 11 13 96 02 56 47 07 49 02 +76 46 73 30 10 20 60 70 14 56 34 26 37 39 48 24 55 76 84 91 39 86 95 61 50 14 53 93 64 67 37 31 10 84 42 70 48 20 10 72 60 61 84 79 69 65 99 73 89 25 85 48 92 56 97 16 +03 14 80 27 22 30 44 27 67 75 79 32 51 54 81 29 65 14 19 04 13 82 04 91 43 40 12 52 29 99 07 76 60 25 01 07 61 71 37 92 40 47 99 66 57 01 43 44 22 40 53 53 09 69 26 81 07 +49 80 56 90 93 87 47 13 75 28 87 23 72 79 32 18 27 20 28 10 37 59 21 18 70 04 79 96 03 31 45 71 81 06 14 18 17 05 31 50 92 79 23 47 09 39 47 91 43 54 69 47 42 95 62 46 32 85 +37 18 62 85 87 28 64 05 77 51 47 26 30 65 05 70 65 75 59 80 42 52 25 20 44 10 92 17 71 95 52 14 77 13 24 55 11 65 26 91 01 30 63 15 49 48 41 17 67 47 03 68 20 90 98 32 04 40 68 +90 51 58 60 06 55 23 68 05 19 76 94 82 36 96 43 38 90 87 28 33 83 05 17 70 83 96 93 06 04 78 47 80 06 23 84 75 23 87 72 99 14 50 98 92 38 90 64 61 58 76 94 36 66 87 80 51 35 61 38 +57 95 64 06 53 36 82 51 40 33 47 14 07 98 78 65 39 58 53 06 50 53 04 69 40 68 36 69 75 78 75 60 03 32 39 24 74 47 26 90 13 40 44 71 90 76 51 24 36 50 25 45 70 80 61 80 61 43 90 64 11 +18 29 86 56 68 42 79 10 42 44 30 12 96 18 23 18 52 59 02 99 67 46 60 86 43 38 55 17 44 93 42 21 55 14 47 34 55 16 49 24 23 29 96 51 55 10 46 53 27 92 27 46 63 57 30 65 43 27 21 20 24 83 +81 72 93 19 69 52 48 01 13 83 92 69 20 48 69 59 20 62 05 42 28 89 90 99 32 72 84 17 08 87 36 03 60 31 36 36 81 26 97 36 48 54 56 56 27 16 91 08 23 11 87 99 33 47 02 14 44 73 70 99 43 35 33 +90 56 61 86 56 12 70 59 63 32 01 15 81 47 71 76 95 32 65 80 54 70 34 51 40 45 33 04 64 55 78 68 88 47 31 47 68 87 03 84 23 44 89 72 35 08 31 76 63 26 90 85 96 67 65 91 19 14 17 86 04 71 32 95 +37 13 04 22 64 37 37 28 56 62 86 33 07 37 10 44 52 82 52 06 19 52 57 75 90 26 91 24 06 21 14 67 76 30 46 14 35 89 89 41 03 64 56 97 87 63 22 34 03 79 17 45 11 53 25 56 96 61 23 18 63 31 37 37 47 +77 23 26 70 72 76 77 04 28 64 71 69 14 85 96 54 95 48 06 62 99 83 86 77 97 75 71 66 30 19 57 90 33 01 60 61 14 12 90 99 32 77 56 41 18 14 87 49 10 14 90 64 18 50 21 74 14 16 88 05 45 73 82 47 74 44 +22 97 41 13 34 31 54 61 56 94 03 24 59 27 98 77 04 09 37 40 12 26 87 09 71 70 07 18 64 57 80 21 12 71 83 94 60 39 73 79 73 19 97 32 64 29 41 07 48 84 85 67 12 74 95 20 24 52 41 67 56 61 29 93 35 72 69 +72 23 63 66 01 11 07 30 52 56 95 16 65 26 83 90 50 74 60 18 16 48 43 77 37 11 99 98 30 94 91 26 62 73 45 12 87 73 47 27 01 88 66 99 21 41 95 80 02 53 23 32 61 48 32 43 43 83 14 66 95 91 19 81 80 67 25 88 +08 62 32 18 92 14 83 71 37 96 11 83 39 99 05 16 23 27 10 67 02 25 44 11 55 31 46 64 41 56 44 74 26 81 51 31 45 85 87 09 81 95 22 28 76 69 46 48 64 87 67 76 27 89 31 11 74 16 62 03 60 94 42 47 09 34 94 93 72 +56 18 90 18 42 17 42 32 14 86 06 53 33 95 99 35 29 15 44 20 49 59 25 54 34 59 84 21 23 54 35 90 78 16 93 13 37 88 54 19 86 67 68 55 66 84 65 42 98 37 87 56 33 28 58 38 28 38 66 27 52 21 81 15 08 22 97 32 85 27 +91 53 40 28 13 34 91 25 01 63 50 37 22 49 71 58 32 28 30 18 68 94 23 83 63 62 94 76 80 41 90 22 82 52 29 12 18 56 10 08 35 14 37 57 23 65 67 40 72 39 93 39 70 89 40 34 07 46 94 22 20 05 53 64 56 30 05 56 61 88 27 +23 95 11 12 37 69 68 24 66 10 87 70 43 50 75 07 62 41 83 58 95 93 89 79 45 39 02 22 05 22 95 43 62 11 68 29 17 40 26 44 25 71 87 16 70 85 19 25 59 94 90 41 41 80 61 70 55 60 84 33 95 76 42 63 15 09 03 40 38 12 03 32 +09 84 56 80 61 55 85 97 16 94 82 94 98 57 84 30 84 48 93 90 71 05 95 90 73 17 30 98 40 64 65 89 07 79 09 19 56 36 42 30 23 69 73 72 07 05 27 61 24 31 43 48 71 84 21 28 26 65 65 59 65 74 77 20 10 81 61 84 95 08 52 23 70 +47 81 28 09 98 51 67 64 35 51 59 36 92 82 77 65 80 24 72 53 22 07 27 10 21 28 30 22 48 82 80 48 56 20 14 43 18 25 50 95 90 31 77 08 09 48 44 80 90 22 93 45 82 17 13 96 25 26 08 73 34 99 06 49 24 06 83 51 40 14 15 10 25 01 +54 25 10 81 30 64 24 74 75 80 36 75 82 60 22 69 72 91 45 67 03 62 79 54 89 74 44 83 64 96 66 73 44 30 74 50 37 05 09 97 70 01 60 46 37 91 39 75 75 18 58 52 72 78 51 81 86 52 08 97 01 46 43 66 98 62 81 18 70 93 73 08 32 46 34 +96 80 82 07 59 71 92 53 19 20 88 66 03 26 26 10 24 27 50 82 94 73 63 08 51 33 22 45 19 13 58 33 90 15 22 50 36 13 55 06 35 47 82 52 33 61 36 27 28 46 98 14 73 20 73 32 16 26 80 53 47 66 76 38 94 45 02 01 22 52 47 96 64 58 52 39 +88 46 23 39 74 63 81 64 20 90 33 33 76 55 58 26 10 46 42 26 74 74 12 83 32 43 09 02 73 55 86 54 85 34 28 23 29 79 91 62 47 41 82 87 99 22 48 90 20 05 96 75 95 04 43 28 81 39 81 01 28 42 78 25 39 77 90 57 58 98 17 36 73 22 63 74 51 +29 39 74 94 95 78 64 24 38 86 63 87 93 06 70 92 22 16 80 64 29 52 20 27 23 50 14 13 87 15 72 96 81 22 08 49 72 30 70 24 79 31 16 64 59 21 89 34 96 91 48 76 43 53 88 01 57 80 23 81 90 79 58 01 80 87 17 99 86 90 72 63 32 69 14 28 88 69 +37 17 71 95 56 93 71 35 43 45 04 98 92 94 84 96 11 30 31 27 31 60 92 03 48 05 98 91 86 94 35 90 90 08 48 19 33 28 68 37 59 26 65 96 50 68 22 07 09 49 34 31 77 49 43 06 75 17 81 87 61 79 52 26 27 72 29 50 07 98 86 01 17 10 46 64 24 18 56 +51 30 25 94 88 85 79 91 40 33 63 84 49 67 98 92 15 26 75 19 82 05 18 78 65 93 61 48 91 43 59 41 70 51 22 15 92 81 67 91 46 98 11 11 65 31 66 10 98 65 83 21 05 56 05 98 73 67 46 74 69 34 08 30 05 52 07 98 32 95 30 94 65 50 24 63 28 81 99 57 +19 23 61 36 09 89 71 98 65 17 30 29 89 26 79 74 94 11 44 48 97 54 81 55 39 66 69 45 28 47 13 86 15 76 74 70 84 32 36 33 79 20 78 14 41 47 89 28 81 05 99 66 81 86 38 26 06 25 13 60 54 55 23 53 27 05 89 25 23 11 13 54 59 54 56 34 16 24 53 44 06 +13 40 57 72 21 15 60 08 04 19 11 98 34 45 09 97 86 71 03 15 56 19 15 44 97 31 90 04 87 87 76 08 12 30 24 62 84 28 12 85 82 53 99 52 13 94 06 65 97 86 09 50 94 68 69 74 30 67 87 94 63 07 78 27 80 36 69 41 06 92 32 78 37 82 30 05 18 87 99 72 19 99 +44 20 55 77 69 91 27 31 28 81 80 27 02 07 97 23 95 98 12 25 75 29 47 71 07 47 78 39 41 59 27 76 13 15 66 61 68 35 69 86 16 53 67 63 99 85 41 56 08 28 33 40 94 76 90 85 31 70 24 65 84 65 99 82 19 25 54 37 21 46 33 02 52 99 51 33 26 04 87 02 08 18 96 +54 42 61 45 91 06 64 79 80 82 32 16 83 63 42 49 19 78 65 97 40 42 14 61 49 34 04 18 25 98 59 30 82 72 26 88 54 36 21 75 03 88 99 53 46 51 55 78 22 94 34 40 68 87 84 25 30 76 25 08 92 84 42 61 40 38 09 99 40 23 29 39 46 55 10 90 35 84 56 70 63 23 91 39 +52 92 03 71 89 07 09 37 68 66 58 20 44 92 51 56 13 71 79 99 26 37 02 06 16 67 36 52 58 16 79 73 56 60 59 27 44 77 94 82 20 50 98 33 09 87 94 37 40 83 64 83 58 85 17 76 53 02 83 52 22 27 39 20 48 92 45 21 09 42 24 23 12 37 52 28 50 78 79 20 86 62 73 20 59 +54 96 80 15 91 90 99 70 10 09 58 90 93 50 81 99 54 38 36 10 30 11 35 84 16 45 82 18 11 97 36 43 96 79 97 65 40 48 23 19 17 31 64 52 65 65 37 32 65 76 99 79 34 65 79 27 55 33 03 01 33 27 61 28 66 08 04 70 49 46 48 83 01 45 19 96 13 81 14 21 31 79 93 85 50 05 +92 92 48 84 59 98 31 53 23 27 15 22 79 95 24 76 05 79 16 93 97 89 38 89 42 83 02 88 94 95 82 21 01 97 48 39 31 78 09 65 50 56 97 61 01 07 65 27 21 23 14 15 80 97 44 78 49 35 33 45 81 74 34 05 31 57 09 38 94 07 69 54 69 32 65 68 46 68 78 90 24 28 49 51 45 86 35 +41 63 89 76 87 31 86 09 46 14 87 82 22 29 47 16 13 10 70 72 82 95 48 64 58 43 13 75 42 69 21 12 67 13 64 85 58 23 98 09 37 76 05 22 31 12 66 50 29 99 86 72 45 25 10 28 19 06 90 43 29 31 67 79 46 25 74 14 97 35 76 37 65 46 23 82 06 22 30 76 93 66 94 17 96 13 20 72 +63 40 78 08 52 09 90 41 70 28 36 14 46 44 85 96 24 52 58 15 87 37 05 98 99 39 13 61 76 38 44 99 83 74 90 22 53 80 56 98 30 51 63 39 44 30 91 91 04 22 27 73 17 35 53 18 35 45 54 56 27 78 48 13 69 36 44 38 71 25 30 56 15 22 73 43 32 69 59 25 93 83 45 11 34 94 44 39 92 +12 36 56 88 13 96 16 12 55 54 11 47 19 78 17 17 68 81 77 51 42 55 99 85 66 27 81 79 93 42 65 61 69 74 14 01 18 56 12 01 58 37 91 22 42 66 83 25 19 04 96 41 25 45 18 69 96 88 36 93 10 12 98 32 44 83 83 04 72 91 04 27 73 07 34 37 71 60 59 31 01 54 54 44 96 93 83 36 04 45 +30 18 22 20 42 96 65 79 17 41 55 69 94 81 29 80 91 31 85 25 47 26 43 49 02 99 34 67 99 76 16 14 15 93 08 32 99 44 61 77 67 50 43 55 87 55 53 72 17 46 62 25 50 99 73 05 93 48 17 31 70 80 59 09 44 59 45 13 74 66 58 94 87 73 16 14 85 38 74 99 64 23 79 28 71 42 20 37 82 31 23 +51 96 39 65 46 71 56 13 29 68 53 86 45 33 51 49 12 91 21 21 76 85 02 17 98 15 46 12 60 21 88 30 92 83 44 59 42 50 27 88 46 86 94 73 45 54 23 24 14 10 94 21 20 34 23 51 04 83 99 75 90 63 60 16 22 33 83 70 11 32 10 50 29 30 83 46 11 05 31 17 86 42 49 01 44 63 28 60 07 78 95 40 +44 61 89 59 04 49 51 27 69 71 46 76 44 04 09 34 56 39 15 06 94 91 75 90 65 27 56 23 74 06 23 33 36 69 14 39 05 34 35 57 33 22 76 46 56 10 61 65 98 09 16 69 04 62 65 18 99 76 49 18 72 66 73 83 82 40 76 31 89 91 27 88 17 35 41 35 32 51 32 67 52 68 74 85 80 57 07 11 62 66 47 22 67 +65 37 19 97 26 17 16 24 24 17 50 37 64 82 24 36 32 11 68 34 69 31 32 89 79 93 96 68 49 90 14 23 04 04 67 99 81 74 70 74 36 96 68 09 64 39 88 35 54 89 96 58 66 27 88 97 32 14 06 35 78 20 71 06 85 66 57 02 58 91 72 05 29 56 73 48 86 52 09 93 22 57 79 42 12 01 31 68 17 59 63 76 07 77 +73 81 14 13 17 20 11 09 01 83 08 85 91 70 84 63 62 77 37 07 47 01 59 95 39 69 39 21 99 09 87 02 97 16 92 36 74 71 90 66 33 73 73 75 52 91 11 12 26 53 05 26 26 48 61 50 90 65 01 87 42 47 74 35 22 73 24 26 56 70 52 05 48 41 31 18 83 27 21 39 80 85 26 08 44 02 71 07 63 22 05 52 19 08 20 +17 25 21 11 72 93 33 49 64 23 53 82 03 13 91 65 85 02 40 05 42 31 77 42 05 36 06 54 04 58 07 76 87 83 25 57 66 12 74 33 85 37 74 32 20 69 03 97 91 68 82 44 19 14 89 28 85 85 80 53 34 87 58 98 88 78 48 65 98 40 11 57 10 67 70 81 60 79 74 72 97 59 79 47 30 20 54 80 89 91 14 05 33 36 79 39 +60 85 59 39 60 07 57 76 77 92 06 35 15 72 23 41 45 52 95 18 64 79 86 53 56 31 69 11 91 31 84 50 44 82 22 81 41 40 30 42 30 91 48 94 74 76 64 58 74 25 96 57 14 19 03 99 28 83 15 75 99 01 89 85 79 50 03 95 32 67 44 08 07 41 62 64 29 20 14 76 26 55 48 71 69 66 19 72 44 25 14 01 48 74 12 98 07 +64 66 84 24 18 16 27 48 20 14 47 69 30 86 48 40 23 16 61 21 51 50 26 47 35 33 91 28 78 64 43 68 04 79 51 08 19 60 52 95 06 68 46 86 35 97 27 58 04 65 30 58 99 12 12 75 91 39 50 31 42 64 70 04 46 07 98 73 98 93 37 89 77 91 64 71 64 65 66 21 78 62 81 74 42 20 83 70 73 95 78 45 92 27 34 53 71 15 +30 11 85 31 34 71 13 48 05 14 44 03 19 67 23 73 19 57 06 90 94 72 57 69 81 62 59 68 88 57 55 69 49 13 07 87 97 80 89 05 71 05 05 26 38 40 16 62 45 99 18 38 98 24 21 26 62 74 69 04 85 57 77 35 58 67 91 79 79 57 86 28 66 34 72 51 76 78 36 95 63 90 08 78 47 63 45 31 22 70 52 48 79 94 15 77 61 67 68 +23 33 44 81 80 92 93 75 94 88 23 61 39 76 22 03 28 94 32 06 49 65 41 34 18 23 08 47 62 60 03 63 33 13 80 52 31 54 73 43 70 26 16 69 57 87 83 31 03 93 70 81 47 95 77 44 29 68 39 51 56 59 63 07 25 70 07 77 43 53 64 03 94 42 95 39 18 01 66 21 16 97 20 50 90 16 70 10 95 69 29 06 25 61 41 26 15 59 63 35 diff --git a/python-mega-algo/project_euler/problem_069/__init__.py b/python-mega-algo/project_euler/problem_069/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/project_euler/problem_069/right.html b/python-mega-algo/project_euler/problem_069/right.html new file mode 100644 index 00000000..e9764366 --- /dev/null +++ b/python-mega-algo/project_euler/problem_069/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/project_euler/problem_069 + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    sol1.py __init__.py 
    + +

    +Folders: 1
    +Files: 2
    +Size of all files: 1778 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/project_euler/problem_069/sol1.py b/python-mega-algo/project_euler/problem_069/sol1.py new file mode 100644 index 00000000..d148dd79 --- /dev/null +++ b/python-mega-algo/project_euler/problem_069/sol1.py @@ -0,0 +1,66 @@ +""" +Totient maximum +Problem 69: https://projecteuler.net/problem=69 + +Euler's Totient function, φ(n) [sometimes called the phi function], +is used to determine the number of numbers less than n which are relatively prime to n. +For example, as 1, 2, 4, 5, 7, and 8, +are all less than nine and relatively prime to nine, φ(9)=6. + +n Relatively Prime φ(n) n/φ(n) +2 1 1 2 +3 1,2 2 1.5 +4 1,3 2 2 +5 1,2,3,4 4 1.25 +6 1,5 2 3 +7 1,2,3,4,5,6 6 1.1666... +8 1,3,5,7 4 2 +9 1,2,4,5,7,8 6 1.5 +10 1,3,7,9 4 2.5 + +It can be seen that n=6 produces a maximum n/φ(n) for n ≤ 10. + +Find the value of n ≤ 1,000,000 for which n/φ(n) is a maximum. +""" + + +def solution(n: int = 10 ** 6) -> int: + """ + Returns solution to problem. + Algorithm: + 1. Precompute φ(k) for all natural k, k <= n using product formula (wikilink below) + https://en.wikipedia.org/wiki/Euler%27s_totient_function#Euler's_product_formula + + 2. Find k/φ(k) for all k ≤ n and return the k that attains maximum + + >>> solution(10) + 6 + + >>> solution(100) + 30 + + >>> solution(9973) + 2310 + + """ + + if n <= 0: + raise ValueError("Please enter an integer greater than 0") + + phi = list(range(n + 1)) + for number in range(2, n + 1): + if phi[number] == number: + phi[number] -= 1 + for multiple in range(number * 2, n + 1, number): + phi[multiple] = (phi[multiple] // number) * (number - 1) + + answer = 1 + for number in range(1, n + 1): + if (answer / phi[answer]) < (number / phi[number]): + answer = number + + return answer + + +if __name__ == "__main__": + print(solution()) diff --git a/python-mega-algo/project_euler/problem_070/__init__.py b/python-mega-algo/project_euler/problem_070/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/project_euler/problem_070/right.html b/python-mega-algo/project_euler/problem_070/right.html new file mode 100644 index 00000000..26baa05b --- /dev/null +++ b/python-mega-algo/project_euler/problem_070/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/project_euler/problem_070 + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    sol1.py __init__.py 
    + +

    +Folders: 1
    +Files: 2
    +Size of all files: 3189 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/project_euler/problem_070/sol1.py b/python-mega-algo/project_euler/problem_070/sol1.py new file mode 100644 index 00000000..9d27119b --- /dev/null +++ b/python-mega-algo/project_euler/problem_070/sol1.py @@ -0,0 +1,119 @@ +""" +Project Euler Problem 70: https://projecteuler.net/problem=70 + +Euler's Totient function, φ(n) [sometimes called the phi function], is used to +determine the number of positive numbers less than or equal to n which are +relatively prime to n. For example, as 1, 2, 4, 5, 7, and 8, are all less than +nine and relatively prime to nine, φ(9)=6. + +The number 1 is considered to be relatively prime to every positive number, so +φ(1)=1. + +Interestingly, φ(87109)=79180, and it can be seen that 87109 is a permutation +of 79180. + +Find the value of n, 1 < n < 10^7, for which φ(n) is a permutation of n and +the ratio n/φ(n) produces a minimum. + +----- + +This is essentially brute force. Calculate all totients up to 10^7 and +find the minimum ratio of n/φ(n) that way. To minimize the ratio, we want +to minimize n and maximize φ(n) as much as possible, so we can store the +minimum fraction's numerator and denominator and calculate new fractions +with each totient to compare against. To avoid dividing by zero, I opt to +use cross multiplication. + +References: +Finding totients +https://en.wikipedia.org/wiki/Euler's_totient_function#Euler's_product_formula +""" +from typing import List + + +def get_totients(max_one: int) -> List[int]: + """ + Calculates a list of totients from 0 to max_one exclusive, using the + definition of Euler's product formula. + + >>> get_totients(5) + [0, 1, 1, 2, 2] + + >>> get_totients(10) + [0, 1, 1, 2, 2, 4, 2, 6, 4, 6] + """ + totients = [0] * max_one + + for i in range(0, max_one): + totients[i] = i + + for i in range(2, max_one): + if totients[i] == i: + for j in range(i, max_one, i): + totients[j] -= totients[j] // i + + return totients + + +def has_same_digits(num1: int, num2: int) -> bool: + """ + Return True if num1 and num2 have the same frequency of every digit, False + otherwise. + + digits[] is a frequency table where the index represents the digit from + 0-9, and the element stores the number of appearances. Increment the + respective index every time you see the digit in num1, and decrement if in + num2. At the end, if the numbers have the same digits, every index must + contain 0. + + >>> has_same_digits(123456789, 987654321) + True + + >>> has_same_digits(123, 12) + False + + >>> has_same_digits(1234566, 123456) + False + """ + digits = [0] * 10 + + while num1 > 0 and num2 > 0: + digits[num1 % 10] += 1 + digits[num2 % 10] -= 1 + num1 //= 10 + num2 //= 10 + + for digit in digits: + if digit != 0: + return False + + return True + + +def solution(max: int = 10000000) -> int: + """ + Finds the value of n from 1 to max such that n/φ(n) produces a minimum. + + >>> solution(100) + 21 + + >>> solution(10000) + 4435 + """ + + min_numerator = 1 # i + min_denominator = 0 # φ(i) + totients = get_totients(max + 1) + + for i in range(2, max + 1): + t = totients[i] + + if i * min_denominator < min_numerator * t and has_same_digits(i, t): + min_numerator = i + min_denominator = t + + return min_numerator + + +if __name__ == "__main__": + print(f"{solution() = }") diff --git a/python-mega-algo/project_euler/problem_071/__init__.py b/python-mega-algo/project_euler/problem_071/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/project_euler/problem_071/right.html b/python-mega-algo/project_euler/problem_071/right.html new file mode 100644 index 00000000..fc95a0c1 --- /dev/null +++ b/python-mega-algo/project_euler/problem_071/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/project_euler/problem_071 + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    sol1.py __init__.py 
    + +

    +Folders: 1
    +Files: 2
    +Size of all files: 1568 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/project_euler/problem_071/sol1.py b/python-mega-algo/project_euler/problem_071/sol1.py new file mode 100644 index 00000000..415b127e --- /dev/null +++ b/python-mega-algo/project_euler/problem_071/sol1.py @@ -0,0 +1,48 @@ +""" +Ordered fractions +Problem 71 +https://projecteuler.net/problem=71 + +Consider the fraction n/d, where n and d are positive +integers. If n int: + """ + Returns the closest numerator of the fraction immediately to the + left of given fraction (numerator/denominator) from a list of reduced + proper fractions. + >>> solution() + 428570 + >>> solution(3, 7, 8) + 2 + >>> solution(6, 7, 60) + 47 + """ + max_numerator = 0 + max_denominator = 1 + + for current_denominator in range(1, limit + 1): + current_numerator = current_denominator * numerator // denominator + if current_denominator % denominator == 0: + current_numerator -= 1 + if current_numerator * max_denominator > current_denominator * max_numerator: + max_numerator = current_numerator + max_denominator = current_denominator + return max_numerator + + +if __name__ == "__main__": + print(solution(numerator=3, denominator=7, limit=1000000)) diff --git a/python-mega-algo/project_euler/problem_072/__init__.py b/python-mega-algo/project_euler/problem_072/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/project_euler/problem_072/right.html b/python-mega-algo/project_euler/problem_072/right.html new file mode 100644 index 00000000..8ec961a4 --- /dev/null +++ b/python-mega-algo/project_euler/problem_072/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/project_euler/problem_072 + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    sol1.py sol2.py __init__.py 
    + +

    +Folders: 1
    +Files: 3
    +Size of all files: 2496 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/project_euler/problem_072/sol1.py b/python-mega-algo/project_euler/problem_072/sol1.py new file mode 100644 index 00000000..846396ab --- /dev/null +++ b/python-mega-algo/project_euler/problem_072/sol1.py @@ -0,0 +1,46 @@ +""" +Problem 72 Counting fractions: https://projecteuler.net/problem=72 + +Description: + +Consider the fraction, n/d, where n and d are positive integers. If n int: + """ + Returns an integer, the solution to the problem + >>> solution(10) + 31 + >>> solution(100) + 3043 + >>> solution(1_000) + 304191 + """ + + phi = [i - 1 for i in range(limit + 1)] + + for i in range(2, limit + 1): + for j in range(2 * i, limit + 1, i): + phi[j] -= phi[i] + + return sum(phi[2 : limit + 1]) + + +if __name__ == "__main__": + print(solution()) diff --git a/python-mega-algo/project_euler/problem_072/sol2.py b/python-mega-algo/project_euler/problem_072/sol2.py new file mode 100644 index 00000000..08e92c18 --- /dev/null +++ b/python-mega-algo/project_euler/problem_072/sol2.py @@ -0,0 +1,45 @@ +""" +Project Euler Problem 72: https://projecteuler.net/problem=72 + +Consider the fraction, n/d, where n and d are positive integers. If n int: + """ + Return the number of reduced proper fractions with denominator less than limit. + >>> solution(8) + 21 + >>> solution(1000) + 304191 + """ + primes = set(range(3, limit, 2)) + primes.add(2) + for p in range(3, limit, 2): + if p not in primes: + continue + primes.difference_update(set(range(p * p, limit, p))) + + phi = [float(n) for n in range(limit + 1)] + + for p in primes: + for n in range(p, limit + 1, p): + phi[n] *= 1 - 1 / p + + return int(sum(phi[2:])) + + +if __name__ == "__main__": + print(f"{solution() = }") diff --git a/python-mega-algo/project_euler/problem_074/__init__.py b/python-mega-algo/project_euler/problem_074/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/project_euler/problem_074/right.html b/python-mega-algo/project_euler/problem_074/right.html new file mode 100644 index 00000000..3bb1155f --- /dev/null +++ b/python-mega-algo/project_euler/problem_074/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/project_euler/problem_074 + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    sol1.py sol2.py __init__.py 
    + +

    +Folders: 1
    +Files: 3
    +Size of all files: 6332 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/project_euler/problem_074/sol1.py b/python-mega-algo/project_euler/problem_074/sol1.py new file mode 100644 index 00000000..38d4e143 --- /dev/null +++ b/python-mega-algo/project_euler/problem_074/sol1.py @@ -0,0 +1,110 @@ +""" +Project Euler Problem 74: https://projecteuler.net/problem=74 + +The number 145 is well known for the property that the sum of the factorial of its +digits is equal to 145: + +1! + 4! + 5! = 1 + 24 + 120 = 145 + +Perhaps less well known is 169, in that it produces the longest chain of numbers that +link back to 169; it turns out that there are only three such loops that exist: + +169 → 363601 → 1454 → 169 +871 → 45361 → 871 +872 → 45362 → 872 + +It is not difficult to prove that EVERY starting number will eventually get stuck in +a loop. For example, + +69 → 363600 → 1454 → 169 → 363601 (→ 1454) +78 → 45360 → 871 → 45361 (→ 871) +540 → 145 (→ 145) + +Starting with 69 produces a chain of five non-repeating terms, but the longest +non-repeating chain with a starting number below one million is sixty terms. + +How many chains, with a starting number below one million, contain exactly sixty +non-repeating terms? +""" + + +DIGIT_FACTORIALS = { + "0": 1, + "1": 1, + "2": 2, + "3": 6, + "4": 24, + "5": 120, + "6": 720, + "7": 5040, + "8": 40320, + "9": 362880, +} + +CACHE_SUM_DIGIT_FACTORIALS = {145: 145} + +CHAIN_LENGTH_CACHE = { + 145: 0, + 169: 3, + 36301: 3, + 1454: 3, + 871: 2, + 45361: 2, + 872: 2, +} + + +def sum_digit_factorials(n: int) -> int: + """ + Return the sum of the factorial of the digits of n. + >>> sum_digit_factorials(145) + 145 + >>> sum_digit_factorials(45361) + 871 + >>> sum_digit_factorials(540) + 145 + """ + if n in CACHE_SUM_DIGIT_FACTORIALS: + return CACHE_SUM_DIGIT_FACTORIALS[n] + ret = sum([DIGIT_FACTORIALS[let] for let in str(n)]) + CACHE_SUM_DIGIT_FACTORIALS[n] = ret + return ret + + +def chain_length(n: int, previous: set = None) -> int: + """ + Calculate the length of the chain of non-repeating terms starting with n. + Previous is a set containing the previous member of the chain. + >>> chain_length(10101) + 11 + >>> chain_length(555) + 20 + >>> chain_length(178924) + 39 + """ + previous = previous or set() + if n in CHAIN_LENGTH_CACHE: + return CHAIN_LENGTH_CACHE[n] + next_number = sum_digit_factorials(n) + if next_number in previous: + CHAIN_LENGTH_CACHE[n] = 0 + return 0 + else: + previous.add(n) + ret = 1 + chain_length(next_number, previous) + CHAIN_LENGTH_CACHE[n] = ret + return ret + + +def solution(num_terms: int = 60, max_start: int = 1000000) -> int: + """ + Return the number of chains with a starting number below one million which + contain exactly n non-repeating terms. + >>> solution(10,1000) + 28 + """ + return sum(1 for i in range(1, max_start) if chain_length(i) == num_terms) + + +if __name__ == "__main__": + print(f"{solution() = }") diff --git a/python-mega-algo/project_euler/problem_074/sol2.py b/python-mega-algo/project_euler/problem_074/sol2.py new file mode 100644 index 00000000..68959327 --- /dev/null +++ b/python-mega-algo/project_euler/problem_074/sol2.py @@ -0,0 +1,126 @@ +""" + Project Euler Problem 074: https://projecteuler.net/problem=74 + + Starting from any positive integer number + it is possible to attain another one summing the factorial of its digits. + + Repeating this step, we can build chains of numbers. + It is not difficult to prove that EVERY starting number + will eventually get stuck in a loop. + + The request is to find how many numbers less than one million + produce a chain with exactly 60 non repeating items. + + Solution approach: + This solution simply consists in a loop that generates + the chains of non repeating items. + The generation of the chain stops before a repeating item + or if the size of the chain is greater then the desired one. + After generating each chain, the length is checked and the + counter increases. +""" + +factorial_cache = {} +factorial_sum_cache = {} + + +def factorial(a: int) -> int: + """Returns the factorial of the input a + >>> factorial(5) + 120 + + >>> factorial(6) + 720 + + >>> factorial(0) + 1 + """ + + # The factorial function is not defined for negative numbers + if a < 0: + raise ValueError("Invalid negative input!", a) + + if a in factorial_cache: + return factorial_cache[a] + + # The case of 0! is handled separately + if a == 0: + factorial_cache[a] = 1 + else: + # use a temporary support variable to store the computation + temporary_number = a + temporary_computation = 1 + + while temporary_number > 0: + temporary_computation *= temporary_number + temporary_number -= 1 + + factorial_cache[a] = temporary_computation + return factorial_cache[a] + + +def factorial_sum(a: int) -> int: + """Function to perform the sum of the factorial + of all the digits in a + + >>> factorial_sum(69) + 363600 + """ + if a in factorial_sum_cache: + return factorial_sum_cache[a] + # Prepare a variable to hold the computation + fact_sum = 0 + + """ Convert a in string to iterate on its digits + convert the digit back into an int + and add its factorial to fact_sum. + """ + for i in str(a): + fact_sum += factorial(int(i)) + factorial_sum_cache[a] = fact_sum + return fact_sum + + +def solution(chain_length: int = 60, number_limit: int = 1000000) -> int: + """Returns the number of numbers that produce + chains with exactly 60 non repeating elements. + >>> solution(10, 1000) + 26 + """ + + # the counter for the chains with the exact desired length + chain_counter = 0 + + for i in range(1, number_limit + 1): + + # The temporary list will contain the elements of the chain + chain_set = {i} + len_chain_set = 1 + last_chain_element = i + + # The new element of the chain + new_chain_element = factorial_sum(last_chain_element) + + # Stop computing the chain when you find a repeating item + # or the length it greater then the desired one. + + while new_chain_element not in chain_set and len_chain_set <= chain_length: + chain_set.add(new_chain_element) + + len_chain_set += 1 + last_chain_element = new_chain_element + new_chain_element = factorial_sum(last_chain_element) + + # If the while exited because the chain list contains the exact amount + # of elements increase the counter + if len_chain_set == chain_length: + chain_counter += 1 + + return chain_counter + + +if __name__ == "__main__": + import doctest + + doctest.testmod() + print(f"{solution()}") diff --git a/python-mega-algo/project_euler/problem_075/__init__.py b/python-mega-algo/project_euler/problem_075/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/project_euler/problem_075/right.html b/python-mega-algo/project_euler/problem_075/right.html new file mode 100644 index 00000000..ca1b2bde --- /dev/null +++ b/python-mega-algo/project_euler/problem_075/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/project_euler/problem_075 + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    sol1.py __init__.py 
    + +

    +Folders: 1
    +Files: 2
    +Size of all files: 2019 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/project_euler/problem_075/sol1.py b/python-mega-algo/project_euler/problem_075/sol1.py new file mode 100644 index 00000000..b57604d7 --- /dev/null +++ b/python-mega-algo/project_euler/problem_075/sol1.py @@ -0,0 +1,60 @@ +""" +Project Euler Problem 75: https://projecteuler.net/problem=75 + +It turns out that 12 cm is the smallest length of wire that can be bent to form an +integer sided right angle triangle in exactly one way, but there are many more examples. + +12 cm: (3,4,5) +24 cm: (6,8,10) +30 cm: (5,12,13) +36 cm: (9,12,15) +40 cm: (8,15,17) +48 cm: (12,16,20) + +In contrast, some lengths of wire, like 20 cm, cannot be bent to form an integer sided +right angle triangle, and other lengths allow more than one solution to be found; for +example, using 120 cm it is possible to form exactly three different integer sided +right angle triangles. + +120 cm: (30,40,50), (20,48,52), (24,45,51) + +Given that L is the length of the wire, for how many values of L ≤ 1,500,000 can +exactly one integer sided right angle triangle be formed? + +Solution: we generate all pythagorean triples using Euclid's formula and +keep track of the frequencies of the perimeters. + +Reference: https://en.wikipedia.org/wiki/Pythagorean_triple#Generating_a_triple +""" + +from collections import defaultdict +from math import gcd +from typing import DefaultDict + + +def solution(limit: int = 1500000) -> int: + """ + Return the number of values of L <= limit such that a wire of length L can be + formmed into an integer sided right angle triangle in exactly one way. + >>> solution(50) + 6 + >>> solution(1000) + 112 + >>> solution(50000) + 5502 + """ + frequencies: DefaultDict = defaultdict(int) + euclid_m = 2 + while 2 * euclid_m * (euclid_m + 1) <= limit: + for euclid_n in range((euclid_m % 2) + 1, euclid_m, 2): + if gcd(euclid_m, euclid_n) > 1: + continue + primitive_perimeter = 2 * euclid_m * (euclid_m + euclid_n) + for perimeter in range(primitive_perimeter, limit + 1, primitive_perimeter): + frequencies[perimeter] += 1 + euclid_m += 1 + return sum(1 for frequency in frequencies.values() if frequency == 1) + + +if __name__ == "__main__": + print(f"{solution() = }") diff --git a/python-mega-algo/project_euler/problem_076/__init__.py b/python-mega-algo/project_euler/problem_076/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/project_euler/problem_076/right.html b/python-mega-algo/project_euler/problem_076/right.html new file mode 100644 index 00000000..150023f0 --- /dev/null +++ b/python-mega-algo/project_euler/problem_076/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/project_euler/problem_076 + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    sol1.py __init__.py 
    + +

    +Folders: 1
    +Files: 2
    +Size of all files: 1105 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/project_euler/problem_076/sol1.py b/python-mega-algo/project_euler/problem_076/sol1.py new file mode 100644 index 00000000..60bb8708 --- /dev/null +++ b/python-mega-algo/project_euler/problem_076/sol1.py @@ -0,0 +1,55 @@ +""" +Counting Summations +Problem 76: https://projecteuler.net/problem=76 + +It is possible to write five as a sum in exactly six different ways: + +4 + 1 +3 + 2 +3 + 1 + 1 +2 + 2 + 1 +2 + 1 + 1 + 1 +1 + 1 + 1 + 1 + 1 + +How many different ways can one hundred be written as a sum of at least two +positive integers? +""" + + +def solution(m: int = 100) -> int: + """ + Returns the number of different ways the number m can be written as a + sum of at least two positive integers. + + >>> solution(100) + 190569291 + >>> solution(50) + 204225 + >>> solution(30) + 5603 + >>> solution(10) + 41 + >>> solution(5) + 6 + >>> solution(3) + 2 + >>> solution(2) + 1 + >>> solution(1) + 0 + """ + memo = [[0 for _ in range(m)] for _ in range(m + 1)] + for i in range(m + 1): + memo[i][0] = 1 + + for n in range(m + 1): + for k in range(1, m): + memo[n][k] += memo[n][k - 1] + if n > k: + memo[n][k] += memo[n - k - 1][k] + + return memo[m][m - 1] - 1 + + +if __name__ == "__main__": + print(solution(int(input("Enter a number: ").strip()))) diff --git a/python-mega-algo/project_euler/problem_077/__init__.py b/python-mega-algo/project_euler/problem_077/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/project_euler/problem_077/right.html b/python-mega-algo/project_euler/problem_077/right.html new file mode 100644 index 00000000..90ca1817 --- /dev/null +++ b/python-mega-algo/project_euler/problem_077/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/project_euler/problem_077 + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    sol1.py __init__.py 
    + +

    +Folders: 1
    +Files: 2
    +Size of all files: 2000 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/project_euler/problem_077/sol1.py b/python-mega-algo/project_euler/problem_077/sol1.py new file mode 100644 index 00000000..e92992a9 --- /dev/null +++ b/python-mega-algo/project_euler/problem_077/sol1.py @@ -0,0 +1,81 @@ +""" +Project Euler Problem 77: https://projecteuler.net/problem=77 + +It is possible to write ten as the sum of primes in exactly five different ways: + +7 + 3 +5 + 5 +5 + 3 + 2 +3 + 3 + 2 + 2 +2 + 2 + 2 + 2 + 2 + +What is the first value which can be written as the sum of primes in over +five thousand different ways? +""" + +from functools import lru_cache +from math import ceil +from typing import Optional, Set + +NUM_PRIMES = 100 + +primes = set(range(3, NUM_PRIMES, 2)) +primes.add(2) +prime: int + +for prime in range(3, ceil(NUM_PRIMES ** 0.5), 2): + if prime not in primes: + continue + primes.difference_update(set(range(prime * prime, NUM_PRIMES, prime))) + + +@lru_cache(maxsize=100) +def partition(number_to_partition: int) -> Set[int]: + """ + Return a set of integers corresponding to unique prime partitions of n. + The unique prime partitions can be represented as unique prime decompositions, + e.g. (7+3) <-> 7*3 = 12, (3+3+2+2) = 3*3*2*2 = 36 + >>> partition(10) + {32, 36, 21, 25, 30} + >>> partition(15) + {192, 160, 105, 44, 112, 243, 180, 150, 216, 26, 125, 126} + >>> len(partition(20)) + 26 + """ + if number_to_partition < 0: + return set() + elif number_to_partition == 0: + return {1} + + ret: Set[int] = set() + prime: int + sub: int + + for prime in primes: + if prime > number_to_partition: + continue + for sub in partition(number_to_partition - prime): + ret.add(sub * prime) + + return ret + + +def solution(number_unique_partitions: int = 5000) -> Optional[int]: + """ + Return the smallest integer that can be written as the sum of primes in over + m unique ways. + >>> solution(4) + 10 + >>> solution(500) + 45 + >>> solution(1000) + 53 + """ + for number_to_partition in range(1, NUM_PRIMES): + if len(partition(number_to_partition)) > number_unique_partitions: + return number_to_partition + return None + + +if __name__ == "__main__": + print(f"{solution() = }") diff --git a/python-mega-algo/project_euler/problem_080/__init__.py b/python-mega-algo/project_euler/problem_080/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/project_euler/problem_080/right.html b/python-mega-algo/project_euler/problem_080/right.html new file mode 100644 index 00000000..0f3aed02 --- /dev/null +++ b/python-mega-algo/project_euler/problem_080/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/project_euler/problem_080 + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    sol1.py __init__.py 
    + +

    +Folders: 1
    +Files: 2
    +Size of all files: 1066 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/project_euler/problem_080/sol1.py b/python-mega-algo/project_euler/problem_080/sol1.py new file mode 100644 index 00000000..db69d7e8 --- /dev/null +++ b/python-mega-algo/project_euler/problem_080/sol1.py @@ -0,0 +1,37 @@ +""" +Project Euler Problem 80: https://projecteuler.net/problem=80 +Author: Sandeep Gupta +Problem statement: For the first one hundred natural numbers, find the total of +the digital sums of the first one hundred decimal digits for all the irrational +square roots. +Time: 5 October 2020, 18:30 +""" +import decimal + + +def solution() -> int: + """ + To evaluate the sum, Used decimal python module to calculate the decimal + places up to 100, the most important thing would be take calculate + a few extra places for decimal otherwise there will be rounding + error. + + >>> solution() + 40886 + """ + answer = 0 + decimal_context = decimal.Context(prec=105) + for i in range(2, 100): + number = decimal.Decimal(i) + sqrt_number = number.sqrt(decimal_context) + if len(str(sqrt_number)) > 1: + answer += int(str(sqrt_number)[0]) + sqrt_number = str(sqrt_number)[2:101] + answer += sum([int(x) for x in sqrt_number]) + return answer + + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/project_euler/problem_081/__init__.py b/python-mega-algo/project_euler/problem_081/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/project_euler/problem_081/matrix.txt b/python-mega-algo/project_euler/problem_081/matrix.txt new file mode 100644 index 00000000..f65322a7 --- /dev/null +++ b/python-mega-algo/project_euler/problem_081/matrix.txt @@ -0,0 +1,80 @@ +4445,2697,5115,718,2209,2212,654,4348,3079,6821,7668,3276,8874,4190,3785,2752,9473,7817,9137,496,7338,3434,7152,4355,4552,7917,7827,2460,2350,691,3514,5880,3145,7633,7199,3783,5066,7487,3285,1084,8985,760,872,8609,8051,1134,9536,5750,9716,9371,7619,5617,275,9721,2997,2698,1887,8825,6372,3014,2113,7122,7050,6775,5948,2758,1219,3539,348,7989,2735,9862,1263,8089,6401,9462,3168,2758,3748,5870 +1096,20,1318,7586,5167,2642,1443,5741,7621,7030,5526,4244,2348,4641,9827,2448,6918,5883,3737,300,7116,6531,567,5997,3971,6623,820,6148,3287,1874,7981,8424,7672,7575,6797,6717,1078,5008,4051,8795,5820,346,1851,6463,2117,6058,3407,8211,117,4822,1317,4377,4434,5925,8341,4800,1175,4173,690,8978,7470,1295,3799,8724,3509,9849,618,3320,7068,9633,2384,7175,544,6583,1908,9983,481,4187,9353,9377 +9607,7385,521,6084,1364,8983,7623,1585,6935,8551,2574,8267,4781,3834,2764,2084,2669,4656,9343,7709,2203,9328,8004,6192,5856,3555,2260,5118,6504,1839,9227,1259,9451,1388,7909,5733,6968,8519,9973,1663,5315,7571,3035,4325,4283,2304,6438,3815,9213,9806,9536,196,5542,6907,2475,1159,5820,9075,9470,2179,9248,1828,4592,9167,3713,4640,47,3637,309,7344,6955,346,378,9044,8635,7466,5036,9515,6385,9230 +7206,3114,7760,1094,6150,5182,7358,7387,4497,955,101,1478,7777,6966,7010,8417,6453,4955,3496,107,449,8271,131,2948,6185,784,5937,8001,6104,8282,4165,3642,710,2390,575,715,3089,6964,4217,192,5949,7006,715,3328,1152,66,8044,4319,1735,146,4818,5456,6451,4113,1063,4781,6799,602,1504,6245,6550,1417,1343,2363,3785,5448,4545,9371,5420,5068,4613,4882,4241,5043,7873,8042,8434,3939,9256,2187 +3620,8024,577,9997,7377,7682,1314,1158,6282,6310,1896,2509,5436,1732,9480,706,496,101,6232,7375,2207,2306,110,6772,3433,2878,8140,5933,8688,1399,2210,7332,6172,6403,7333,4044,2291,1790,2446,7390,8698,5723,3678,7104,1825,2040,140,3982,4905,4160,2200,5041,2512,1488,2268,1175,7588,8321,8078,7312,977,5257,8465,5068,3453,3096,1651,7906,253,9250,6021,8791,8109,6651,3412,345,4778,5152,4883,7505 +1074,5438,9008,2679,5397,5429,2652,3403,770,9188,4248,2493,4361,8327,9587,707,9525,5913,93,1899,328,2876,3604,673,8576,6908,7659,2544,3359,3883,5273,6587,3065,1749,3223,604,9925,6941,2823,8767,7039,3290,3214,1787,7904,3421,7137,9560,8451,2669,9219,6332,1576,5477,6755,8348,4164,4307,2984,4012,6629,1044,2874,6541,4942,903,1404,9125,5160,8836,4345,2581,460,8438,1538,5507,668,3352,2678,6942 +4295,1176,5596,1521,3061,9868,7037,7129,8933,6659,5947,5063,3653,9447,9245,2679,767,714,116,8558,163,3927,8779,158,5093,2447,5782,3967,1716,931,7772,8164,1117,9244,5783,7776,3846,8862,6014,2330,6947,1777,3112,6008,3491,1906,5952,314,4602,8994,5919,9214,3995,5026,7688,6809,5003,3128,2509,7477,110,8971,3982,8539,2980,4689,6343,5411,2992,5270,5247,9260,2269,7474,1042,7162,5206,1232,4556,4757 +510,3556,5377,1406,5721,4946,2635,7847,4251,8293,8281,6351,4912,287,2870,3380,3948,5322,3840,4738,9563,1906,6298,3234,8959,1562,6297,8835,7861,239,6618,1322,2553,2213,5053,5446,4402,6500,5182,8585,6900,5756,9661,903,5186,7687,5998,7997,8081,8955,4835,6069,2621,1581,732,9564,1082,1853,5442,1342,520,1737,3703,5321,4793,2776,1508,1647,9101,2499,6891,4336,7012,3329,3212,1442,9993,3988,4930,7706 +9444,3401,5891,9716,1228,7107,109,3563,2700,6161,5039,4992,2242,8541,7372,2067,1294,3058,1306,320,8881,5756,9326,411,8650,8824,5495,8282,8397,2000,1228,7817,2099,6473,3571,5994,4447,1299,5991,543,7874,2297,1651,101,2093,3463,9189,6872,6118,872,1008,1779,2805,9084,4048,2123,5877,55,3075,1737,9459,4535,6453,3644,108,5982,4437,5213,1340,6967,9943,5815,669,8074,1838,6979,9132,9315,715,5048 +3327,4030,7177,6336,9933,5296,2621,4785,2755,4832,2512,2118,2244,4407,2170,499,7532,9742,5051,7687,970,6924,3527,4694,5145,1306,2165,5940,2425,8910,3513,1909,6983,346,6377,4304,9330,7203,6605,3709,3346,970,369,9737,5811,4427,9939,3693,8436,5566,1977,3728,2399,3985,8303,2492,5366,9802,9193,7296,1033,5060,9144,2766,1151,7629,5169,5995,58,7619,7565,4208,1713,6279,3209,4908,9224,7409,1325,8540 +6882,1265,1775,3648,4690,959,5837,4520,5394,1378,9485,1360,4018,578,9174,2932,9890,3696,116,1723,1178,9355,7063,1594,1918,8574,7594,7942,1547,6166,7888,354,6932,4651,1010,7759,6905,661,7689,6092,9292,3845,9605,8443,443,8275,5163,7720,7265,6356,7779,1798,1754,5225,6661,1180,8024,5666,88,9153,1840,3508,1193,4445,2648,3538,6243,6375,8107,5902,5423,2520,1122,5015,6113,8859,9370,966,8673,2442 +7338,3423,4723,6533,848,8041,7921,8277,4094,5368,7252,8852,9166,2250,2801,6125,8093,5738,4038,9808,7359,9494,601,9116,4946,2702,5573,2921,9862,1462,1269,2410,4171,2709,7508,6241,7522,615,2407,8200,4189,5492,5649,7353,2590,5203,4274,710,7329,9063,956,8371,3722,4253,4785,1194,4828,4717,4548,940,983,2575,4511,2938,1827,2027,2700,1236,841,5760,1680,6260,2373,3851,1841,4968,1172,5179,7175,3509 +4420,1327,3560,2376,6260,2988,9537,4064,4829,8872,9598,3228,1792,7118,9962,9336,4368,9189,6857,1829,9863,6287,7303,7769,2707,8257,2391,2009,3975,4993,3068,9835,3427,341,8412,2134,4034,8511,6421,3041,9012,2983,7289,100,1355,7904,9186,6920,5856,2008,6545,8331,3655,5011,839,8041,9255,6524,3862,8788,62,7455,3513,5003,8413,3918,2076,7960,6108,3638,6999,3436,1441,4858,4181,1866,8731,7745,3744,1000 +356,8296,8325,1058,1277,4743,3850,2388,6079,6462,2815,5620,8495,5378,75,4324,3441,9870,1113,165,1544,1179,2834,562,6176,2313,6836,8839,2986,9454,5199,6888,1927,5866,8760,320,1792,8296,7898,6121,7241,5886,5814,2815,8336,1576,4314,3109,2572,6011,2086,9061,9403,3947,5487,9731,7281,3159,1819,1334,3181,5844,5114,9898,4634,2531,4412,6430,4262,8482,4546,4555,6804,2607,9421,686,8649,8860,7794,6672 +9870,152,1558,4963,8750,4754,6521,6256,8818,5208,5691,9659,8377,9725,5050,5343,2539,6101,1844,9700,7750,8114,5357,3001,8830,4438,199,9545,8496,43,2078,327,9397,106,6090,8181,8646,6414,7499,5450,4850,6273,5014,4131,7639,3913,6571,8534,9703,4391,7618,445,1320,5,1894,6771,7383,9191,4708,9706,6939,7937,8726,9382,5216,3685,2247,9029,8154,1738,9984,2626,9438,4167,6351,5060,29,1218,1239,4785 +192,5213,8297,8974,4032,6966,5717,1179,6523,4679,9513,1481,3041,5355,9303,9154,1389,8702,6589,7818,6336,3539,5538,3094,6646,6702,6266,2759,4608,4452,617,9406,8064,6379,444,5602,4950,1810,8391,1536,316,8714,1178,5182,5863,5110,5372,4954,1978,2971,5680,4863,2255,4630,5723,2168,538,1692,1319,7540,440,6430,6266,7712,7385,5702,620,641,3136,7350,1478,3155,2820,9109,6261,1122,4470,14,8493,2095 +1046,4301,6082,474,4974,7822,2102,5161,5172,6946,8074,9716,6586,9962,9749,5015,2217,995,5388,4402,7652,6399,6539,1349,8101,3677,1328,9612,7922,2879,231,5887,2655,508,4357,4964,3554,5930,6236,7384,4614,280,3093,9600,2110,7863,2631,6626,6620,68,1311,7198,7561,1768,5139,1431,221,230,2940,968,5283,6517,2146,1646,869,9402,7068,8645,7058,1765,9690,4152,2926,9504,2939,7504,6074,2944,6470,7859 +4659,736,4951,9344,1927,6271,8837,8711,3241,6579,7660,5499,5616,3743,5801,4682,9748,8796,779,1833,4549,8138,4026,775,4170,2432,4174,3741,7540,8017,2833,4027,396,811,2871,1150,9809,2719,9199,8504,1224,540,2051,3519,7982,7367,2761,308,3358,6505,2050,4836,5090,7864,805,2566,2409,6876,3361,8622,5572,5895,3280,441,7893,8105,1634,2929,274,3926,7786,6123,8233,9921,2674,5340,1445,203,4585,3837 +5759,338,7444,7968,7742,3755,1591,4839,1705,650,7061,2461,9230,9391,9373,2413,1213,431,7801,4994,2380,2703,6161,6878,8331,2538,6093,1275,5065,5062,2839,582,1014,8109,3525,1544,1569,8622,7944,2905,6120,1564,1839,5570,7579,1318,2677,5257,4418,5601,7935,7656,5192,1864,5886,6083,5580,6202,8869,1636,7907,4759,9082,5854,3185,7631,6854,5872,5632,5280,1431,2077,9717,7431,4256,8261,9680,4487,4752,4286 +1571,1428,8599,1230,7772,4221,8523,9049,4042,8726,7567,6736,9033,2104,4879,4967,6334,6716,3994,1269,8995,6539,3610,7667,6560,6065,874,848,4597,1711,7161,4811,6734,5723,6356,6026,9183,2586,5636,1092,7779,7923,8747,6887,7505,9909,1792,3233,4526,3176,1508,8043,720,5212,6046,4988,709,5277,8256,3642,1391,5803,1468,2145,3970,6301,7767,2359,8487,9771,8785,7520,856,1605,8972,2402,2386,991,1383,5963 +1822,4824,5957,6511,9868,4113,301,9353,6228,2881,2966,6956,9124,9574,9233,1601,7340,973,9396,540,4747,8590,9535,3650,7333,7583,4806,3593,2738,8157,5215,8472,2284,9473,3906,6982,5505,6053,7936,6074,7179,6688,1564,1103,6860,5839,2022,8490,910,7551,7805,881,7024,1855,9448,4790,1274,3672,2810,774,7623,4223,4850,6071,9975,4935,1915,9771,6690,3846,517,463,7624,4511,614,6394,3661,7409,1395,8127 +8738,3850,9555,3695,4383,2378,87,6256,6740,7682,9546,4255,6105,2000,1851,4073,8957,9022,6547,5189,2487,303,9602,7833,1628,4163,6678,3144,8589,7096,8913,5823,4890,7679,1212,9294,5884,2972,3012,3359,7794,7428,1579,4350,7246,4301,7779,7790,3294,9547,4367,3549,1958,8237,6758,3497,3250,3456,6318,1663,708,7714,6143,6890,3428,6853,9334,7992,591,6449,9786,1412,8500,722,5468,1371,108,3939,4199,2535 +7047,4323,1934,5163,4166,461,3544,2767,6554,203,6098,2265,9078,2075,4644,6641,8412,9183,487,101,7566,5622,1975,5726,2920,5374,7779,5631,3753,3725,2672,3621,4280,1162,5812,345,8173,9785,1525,955,5603,2215,2580,5261,2765,2990,5979,389,3907,2484,1232,5933,5871,3304,1138,1616,5114,9199,5072,7442,7245,6472,4760,6359,9053,7876,2564,9404,3043,9026,2261,3374,4460,7306,2326,966,828,3274,1712,3446 +3975,4565,8131,5800,4570,2306,8838,4392,9147,11,3911,7118,9645,4994,2028,6062,5431,2279,8752,2658,7836,994,7316,5336,7185,3289,1898,9689,2331,5737,3403,1124,2679,3241,7748,16,2724,5441,6640,9368,9081,5618,858,4969,17,2103,6035,8043,7475,2181,939,415,1617,8500,8253,2155,7843,7974,7859,1746,6336,3193,2617,8736,4079,6324,6645,8891,9396,5522,6103,1857,8979,3835,2475,1310,7422,610,8345,7615 +9248,5397,5686,2988,3446,4359,6634,9141,497,9176,6773,7448,1907,8454,916,1596,2241,1626,1384,2741,3649,5362,8791,7170,2903,2475,5325,6451,924,3328,522,90,4813,9737,9557,691,2388,1383,4021,1609,9206,4707,5200,7107,8104,4333,9860,5013,1224,6959,8527,1877,4545,7772,6268,621,4915,9349,5970,706,9583,3071,4127,780,8231,3017,9114,3836,7503,2383,1977,4870,8035,2379,9704,1037,3992,3642,1016,4303 +5093,138,4639,6609,1146,5565,95,7521,9077,2272,974,4388,2465,2650,722,4998,3567,3047,921,2736,7855,173,2065,4238,1048,5,6847,9548,8632,9194,5942,4777,7910,8971,6279,7253,2516,1555,1833,3184,9453,9053,6897,7808,8629,4877,1871,8055,4881,7639,1537,7701,2508,7564,5845,5023,2304,5396,3193,2955,1088,3801,6203,1748,3737,1276,13,4120,7715,8552,3047,2921,106,7508,304,1280,7140,2567,9135,5266 +6237,4607,7527,9047,522,7371,4883,2540,5867,6366,5301,1570,421,276,3361,527,6637,4861,2401,7522,5808,9371,5298,2045,5096,5447,7755,5115,7060,8529,4078,1943,1697,1764,5453,7085,960,2405,739,2100,5800,728,9737,5704,5693,1431,8979,6428,673,7540,6,7773,5857,6823,150,5869,8486,684,5816,9626,7451,5579,8260,3397,5322,6920,1879,2127,2884,5478,4977,9016,6165,6292,3062,5671,5968,78,4619,4763 +9905,7127,9390,5185,6923,3721,9164,9705,4341,1031,1046,5127,7376,6528,3248,4941,1178,7889,3364,4486,5358,9402,9158,8600,1025,874,1839,1783,309,9030,1843,845,8398,1433,7118,70,8071,2877,3904,8866,6722,4299,10,1929,5897,4188,600,1889,3325,2485,6473,4474,7444,6992,4846,6166,4441,2283,2629,4352,7775,1101,2214,9985,215,8270,9750,2740,8361,7103,5930,8664,9690,8302,9267,344,2077,1372,1880,9550 +5825,8517,7769,2405,8204,1060,3603,7025,478,8334,1997,3692,7433,9101,7294,7498,9415,5452,3850,3508,6857,9213,6807,4412,7310,854,5384,686,4978,892,8651,3241,2743,3801,3813,8588,6701,4416,6990,6490,3197,6838,6503,114,8343,5844,8646,8694,65,791,5979,2687,2621,2019,8097,1423,3644,9764,4921,3266,3662,5561,2476,8271,8138,6147,1168,3340,1998,9874,6572,9873,6659,5609,2711,3931,9567,4143,7833,8887 +6223,2099,2700,589,4716,8333,1362,5007,2753,2848,4441,8397,7192,8191,4916,9955,6076,3370,6396,6971,3156,248,3911,2488,4930,2458,7183,5455,170,6809,6417,3390,1956,7188,577,7526,2203,968,8164,479,8699,7915,507,6393,4632,1597,7534,3604,618,3280,6061,9793,9238,8347,568,9645,2070,5198,6482,5000,9212,6655,5961,7513,1323,3872,6170,3812,4146,2736,67,3151,5548,2781,9679,7564,5043,8587,1893,4531 +5826,3690,6724,2121,9308,6986,8106,6659,2142,1642,7170,2877,5757,6494,8026,6571,8387,9961,6043,9758,9607,6450,8631,8334,7359,5256,8523,2225,7487,1977,9555,8048,5763,2414,4948,4265,2427,8978,8088,8841,9208,9601,5810,9398,8866,9138,4176,5875,7212,3272,6759,5678,7649,4922,5422,1343,8197,3154,3600,687,1028,4579,2084,9467,4492,7262,7296,6538,7657,7134,2077,1505,7332,6890,8964,4879,7603,7400,5973,739 +1861,1613,4879,1884,7334,966,2000,7489,2123,4287,1472,3263,4726,9203,1040,4103,6075,6049,330,9253,4062,4268,1635,9960,577,1320,3195,9628,1030,4092,4979,6474,6393,2799,6967,8687,7724,7392,9927,2085,3200,6466,8702,265,7646,8665,7986,7266,4574,6587,612,2724,704,3191,8323,9523,3002,704,5064,3960,8209,2027,2758,8393,4875,4641,9584,6401,7883,7014,768,443,5490,7506,1852,2005,8850,5776,4487,4269 +4052,6687,4705,7260,6645,6715,3706,5504,8672,2853,1136,8187,8203,4016,871,1809,1366,4952,9294,5339,6872,2645,6083,7874,3056,5218,7485,8796,7401,3348,2103,426,8572,4163,9171,3176,948,7654,9344,3217,1650,5580,7971,2622,76,2874,880,2034,9929,1546,2659,5811,3754,7096,7436,9694,9960,7415,2164,953,2360,4194,2397,1047,2196,6827,575,784,2675,8821,6802,7972,5996,6699,2134,7577,2887,1412,4349,4380 +4629,2234,6240,8132,7592,3181,6389,1214,266,1910,2451,8784,2790,1127,6932,1447,8986,2492,5476,397,889,3027,7641,5083,5776,4022,185,3364,5701,2442,2840,4160,9525,4828,6602,2614,7447,3711,4505,7745,8034,6514,4907,2605,7753,6958,7270,6936,3006,8968,439,2326,4652,3085,3425,9863,5049,5361,8688,297,7580,8777,7916,6687,8683,7141,306,9569,2384,1500,3346,4601,7329,9040,6097,2727,6314,4501,4974,2829 +8316,4072,2025,6884,3027,1808,5714,7624,7880,8528,4205,8686,7587,3230,1139,7273,6163,6986,3914,9309,1464,9359,4474,7095,2212,7302,2583,9462,7532,6567,1606,4436,8981,5612,6796,4385,5076,2007,6072,3678,8331,1338,3299,8845,4783,8613,4071,1232,6028,2176,3990,2148,3748,103,9453,538,6745,9110,926,3125,473,5970,8728,7072,9062,1404,1317,5139,9862,6496,6062,3338,464,1600,2532,1088,8232,7739,8274,3873 +2341,523,7096,8397,8301,6541,9844,244,4993,2280,7689,4025,4196,5522,7904,6048,2623,9258,2149,9461,6448,8087,7245,1917,8340,7127,8466,5725,6996,3421,5313,512,9164,9837,9794,8369,4185,1488,7210,1524,1016,4620,9435,2478,7765,8035,697,6677,3724,6988,5853,7662,3895,9593,1185,4727,6025,5734,7665,3070,138,8469,6748,6459,561,7935,8646,2378,462,7755,3115,9690,8877,3946,2728,8793,244,6323,8666,4271 +6430,2406,8994,56,1267,3826,9443,7079,7579,5232,6691,3435,6718,5698,4144,7028,592,2627,217,734,6194,8156,9118,58,2640,8069,4127,3285,694,3197,3377,4143,4802,3324,8134,6953,7625,3598,3584,4289,7065,3434,2106,7132,5802,7920,9060,7531,3321,1725,1067,3751,444,5503,6785,7937,6365,4803,198,6266,8177,1470,6390,1606,2904,7555,9834,8667,2033,1723,5167,1666,8546,8152,473,4475,6451,7947,3062,3281 +2810,3042,7759,1741,2275,2609,7676,8640,4117,1958,7500,8048,1757,3954,9270,1971,4796,2912,660,5511,3553,1012,5757,4525,6084,7198,8352,5775,7726,8591,7710,9589,3122,4392,6856,5016,749,2285,3356,7482,9956,7348,2599,8944,495,3462,3578,551,4543,7207,7169,7796,1247,4278,6916,8176,3742,8385,2310,1345,8692,2667,4568,1770,8319,3585,4920,3890,4928,7343,5385,9772,7947,8786,2056,9266,3454,2807,877,2660 +6206,8252,5928,5837,4177,4333,207,7934,5581,9526,8906,1498,8411,2984,5198,5134,2464,8435,8514,8674,3876,599,5327,826,2152,4084,2433,9327,9697,4800,2728,3608,3849,3861,3498,9943,1407,3991,7191,9110,5666,8434,4704,6545,5944,2357,1163,4995,9619,6754,4200,9682,6654,4862,4744,5953,6632,1054,293,9439,8286,2255,696,8709,1533,1844,6441,430,1999,6063,9431,7018,8057,2920,6266,6799,356,3597,4024,6665 +3847,6356,8541,7225,2325,2946,5199,469,5450,7508,2197,9915,8284,7983,6341,3276,3321,16,1321,7608,5015,3362,8491,6968,6818,797,156,2575,706,9516,5344,5457,9210,5051,8099,1617,9951,7663,8253,9683,2670,1261,4710,1068,8753,4799,1228,2621,3275,6188,4699,1791,9518,8701,5932,4275,6011,9877,2933,4182,6059,2930,6687,6682,9771,654,9437,3169,8596,1827,5471,8909,2352,123,4394,3208,8756,5513,6917,2056 +5458,8173,3138,3290,4570,4892,3317,4251,9699,7973,1163,1935,5477,6648,9614,5655,9592,975,9118,2194,7322,8248,8413,3462,8560,1907,7810,6650,7355,2939,4973,6894,3933,3784,3200,2419,9234,4747,2208,2207,1945,2899,1407,6145,8023,3484,5688,7686,2737,3828,3704,9004,5190,9740,8643,8650,5358,4426,1522,1707,3613,9887,6956,2447,2762,833,1449,9489,2573,1080,4167,3456,6809,2466,227,7125,2759,6250,6472,8089 +3266,7025,9756,3914,1265,9116,7723,9788,6805,5493,2092,8688,6592,9173,4431,4028,6007,7131,4446,4815,3648,6701,759,3312,8355,4485,4187,5188,8746,7759,3528,2177,5243,8379,3838,7233,4607,9187,7216,2190,6967,2920,6082,7910,5354,3609,8958,6949,7731,494,8753,8707,1523,4426,3543,7085,647,6771,9847,646,5049,824,8417,5260,2730,5702,2513,9275,4279,2767,8684,1165,9903,4518,55,9682,8963,6005,2102,6523 +1998,8731,936,1479,5259,7064,4085,91,7745,7136,3773,3810,730,8255,2705,2653,9790,6807,2342,355,9344,2668,3690,2028,9679,8102,574,4318,6481,9175,5423,8062,2867,9657,7553,3442,3920,7430,3945,7639,3714,3392,2525,4995,4850,2867,7951,9667,486,9506,9888,781,8866,1702,3795,90,356,1483,4200,2131,6969,5931,486,6880,4404,1084,5169,4910,6567,8335,4686,5043,2614,3352,2667,4513,6472,7471,5720,1616 +8878,1613,1716,868,1906,2681,564,665,5995,2474,7496,3432,9491,9087,8850,8287,669,823,347,6194,2264,2592,7871,7616,8508,4827,760,2676,4660,4881,7572,3811,9032,939,4384,929,7525,8419,5556,9063,662,8887,7026,8534,3111,1454,2082,7598,5726,6687,9647,7608,73,3014,5063,670,5461,5631,3367,9796,8475,7908,5073,1565,5008,5295,4457,1274,4788,1728,338,600,8415,8535,9351,7750,6887,5845,1741,125 +3637,6489,9634,9464,9055,2413,7824,9517,7532,3577,7050,6186,6980,9365,9782,191,870,2497,8498,2218,2757,5420,6468,586,3320,9230,1034,1393,9886,5072,9391,1178,8464,8042,6869,2075,8275,3601,7715,9470,8786,6475,8373,2159,9237,2066,3264,5000,679,355,3069,4073,494,2308,5512,4334,9438,8786,8637,9774,1169,1949,6594,6072,4270,9158,7916,5752,6794,9391,6301,5842,3285,2141,3898,8027,4310,8821,7079,1307 +8497,6681,4732,7151,7060,5204,9030,7157,833,5014,8723,3207,9796,9286,4913,119,5118,7650,9335,809,3675,2597,5144,3945,5090,8384,187,4102,1260,2445,2792,4422,8389,9290,50,1765,1521,6921,8586,4368,1565,5727,7855,2003,4834,9897,5911,8630,5070,1330,7692,7557,7980,6028,5805,9090,8265,3019,3802,698,9149,5748,1965,9658,4417,5994,5584,8226,2937,272,5743,1278,5698,8736,2595,6475,5342,6596,1149,6920 +8188,8009,9546,6310,8772,2500,9846,6592,6872,3857,1307,8125,7042,1544,6159,2330,643,4604,7899,6848,371,8067,2062,3200,7295,1857,9505,6936,384,2193,2190,301,8535,5503,1462,7380,5114,4824,8833,1763,4974,8711,9262,6698,3999,2645,6937,7747,1128,2933,3556,7943,2885,3122,9105,5447,418,2899,5148,3699,9021,9501,597,4084,175,1621,1,1079,6067,5812,4326,9914,6633,5394,4233,6728,9084,1864,5863,1225 +9935,8793,9117,1825,9542,8246,8437,3331,9128,9675,6086,7075,319,1334,7932,3583,7167,4178,1726,7720,695,8277,7887,6359,5912,1719,2780,8529,1359,2013,4498,8072,1129,9998,1147,8804,9405,6255,1619,2165,7491,1,8882,7378,3337,503,5758,4109,3577,985,3200,7615,8058,5032,1080,6410,6873,5496,1466,2412,9885,5904,4406,3605,8770,4361,6205,9193,1537,9959,214,7260,9566,1685,100,4920,7138,9819,5637,976 +3466,9854,985,1078,7222,8888,5466,5379,3578,4540,6853,8690,3728,6351,7147,3134,6921,9692,857,3307,4998,2172,5783,3931,9417,2541,6299,13,787,2099,9131,9494,896,8600,1643,8419,7248,2660,2609,8579,91,6663,5506,7675,1947,6165,4286,1972,9645,3805,1663,1456,8853,5705,9889,7489,1107,383,4044,2969,3343,152,7805,4980,9929,5033,1737,9953,7197,9158,4071,1324,473,9676,3984,9680,3606,8160,7384,5432 +1005,4512,5186,3953,2164,3372,4097,3247,8697,3022,9896,4101,3871,6791,3219,2742,4630,6967,7829,5991,6134,1197,1414,8923,8787,1394,8852,5019,7768,5147,8004,8825,5062,9625,7988,1110,3992,7984,9966,6516,6251,8270,421,3723,1432,4830,6935,8095,9059,2214,6483,6846,3120,1587,6201,6691,9096,9627,6671,4002,3495,9939,7708,7465,5879,6959,6634,3241,3401,2355,9061,2611,7830,3941,2177,2146,5089,7079,519,6351 +7280,8586,4261,2831,7217,3141,9994,9940,5462,2189,4005,6942,9848,5350,8060,6665,7519,4324,7684,657,9453,9296,2944,6843,7499,7847,1728,9681,3906,6353,5529,2822,3355,3897,7724,4257,7489,8672,4356,3983,1948,6892,7415,4153,5893,4190,621,1736,4045,9532,7701,3671,1211,1622,3176,4524,9317,7800,5638,6644,6943,5463,3531,2821,1347,5958,3436,1438,2999,994,850,4131,2616,1549,3465,5946,690,9273,6954,7991 +9517,399,3249,2596,7736,2142,1322,968,7350,1614,468,3346,3265,7222,6086,1661,5317,2582,7959,4685,2807,2917,1037,5698,1529,3972,8716,2634,3301,3412,8621,743,8001,4734,888,7744,8092,3671,8941,1487,5658,7099,2781,99,1932,4443,4756,4652,9328,1581,7855,4312,5976,7255,6480,3996,2748,1973,9731,4530,2790,9417,7186,5303,3557,351,7182,9428,1342,9020,7599,1392,8304,2070,9138,7215,2008,9937,1106,7110 +7444,769,9688,632,1571,6820,8743,4338,337,3366,3073,1946,8219,104,4210,6986,249,5061,8693,7960,6546,1004,8857,5997,9352,4338,6105,5008,2556,6518,6694,4345,3727,7956,20,3954,8652,4424,9387,2035,8358,5962,5304,5194,8650,8282,1256,1103,2138,6679,1985,3653,2770,2433,4278,615,2863,1715,242,3790,2636,6998,3088,1671,2239,957,5411,4595,6282,2881,9974,2401,875,7574,2987,4587,3147,6766,9885,2965 +3287,3016,3619,6818,9073,6120,5423,557,2900,2015,8111,3873,1314,4189,1846,4399,7041,7583,2427,2864,3525,5002,2069,748,1948,6015,2684,438,770,8367,1663,7887,7759,1885,157,7770,4520,4878,3857,1137,3525,3050,6276,5569,7649,904,4533,7843,2199,5648,7628,9075,9441,3600,7231,2388,5640,9096,958,3058,584,5899,8150,1181,9616,1098,8162,6819,8171,1519,1140,7665,8801,2632,1299,9192,707,9955,2710,7314 +1772,2963,7578,3541,3095,1488,7026,2634,6015,4633,4370,2762,1650,2174,909,8158,2922,8467,4198,4280,9092,8856,8835,5457,2790,8574,9742,5054,9547,4156,7940,8126,9824,7340,8840,6574,3547,1477,3014,6798,7134,435,9484,9859,3031,4,1502,4133,1738,1807,4825,463,6343,9701,8506,9822,9555,8688,8168,3467,3234,6318,1787,5591,419,6593,7974,8486,9861,6381,6758,194,3061,4315,2863,4665,3789,2201,1492,4416 +126,8927,6608,5682,8986,6867,1715,6076,3159,788,3140,4744,830,9253,5812,5021,7616,8534,1546,9590,1101,9012,9821,8132,7857,4086,1069,7491,2988,1579,2442,4321,2149,7642,6108,250,6086,3167,24,9528,7663,2685,1220,9196,1397,5776,1577,1730,5481,977,6115,199,6326,2183,3767,5928,5586,7561,663,8649,9688,949,5913,9160,1870,5764,9887,4477,6703,1413,4995,5494,7131,2192,8969,7138,3997,8697,646,1028 +8074,1731,8245,624,4601,8706,155,8891,309,2552,8208,8452,2954,3124,3469,4246,3352,1105,4509,8677,9901,4416,8191,9283,5625,7120,2952,8881,7693,830,4580,8228,9459,8611,4499,1179,4988,1394,550,2336,6089,6872,269,7213,1848,917,6672,4890,656,1478,6536,3165,4743,4990,1176,6211,7207,5284,9730,4738,1549,4986,4942,8645,3698,9429,1439,2175,6549,3058,6513,1574,6988,8333,3406,5245,5431,7140,7085,6407 +7845,4694,2530,8249,290,5948,5509,1588,5940,4495,5866,5021,4626,3979,3296,7589,4854,1998,5627,3926,8346,6512,9608,1918,7070,4747,4182,2858,2766,4606,6269,4107,8982,8568,9053,4244,5604,102,2756,727,5887,2566,7922,44,5986,621,1202,374,6988,4130,3627,6744,9443,4568,1398,8679,397,3928,9159,367,2917,6127,5788,3304,8129,911,2669,1463,9749,264,4478,8940,1109,7309,2462,117,4692,7724,225,2312 +4164,3637,2000,941,8903,39,3443,7172,1031,3687,4901,8082,4945,4515,7204,9310,9349,9535,9940,218,1788,9245,2237,1541,5670,6538,6047,5553,9807,8101,1925,8714,445,8332,7309,6830,5786,5736,7306,2710,3034,1838,7969,6318,7912,2584,2080,7437,6705,2254,7428,820,782,9861,7596,3842,3631,8063,5240,6666,394,4565,7865,4895,9890,6028,6117,4724,9156,4473,4552,602,470,6191,4927,5387,884,3146,1978,3000 +4258,6880,1696,3582,5793,4923,2119,1155,9056,9698,6603,3768,5514,9927,9609,6166,6566,4536,4985,4934,8076,9062,6741,6163,7399,4562,2337,5600,2919,9012,8459,1308,6072,1225,9306,8818,5886,7243,7365,8792,6007,9256,6699,7171,4230,7002,8720,7839,4533,1671,478,7774,1607,2317,5437,4705,7886,4760,6760,7271,3081,2997,3088,7675,6208,3101,6821,6840,122,9633,4900,2067,8546,4549,2091,7188,5605,8599,6758,5229 +7854,5243,9155,3556,8812,7047,2202,1541,5993,4600,4760,713,434,7911,7426,7414,8729,322,803,7960,7563,4908,6285,6291,736,3389,9339,4132,8701,7534,5287,3646,592,3065,7582,2592,8755,6068,8597,1982,5782,1894,2900,6236,4039,6569,3037,5837,7698,700,7815,2491,7272,5878,3083,6778,6639,3589,5010,8313,2581,6617,5869,8402,6808,2951,2321,5195,497,2190,6187,1342,1316,4453,7740,4154,2959,1781,1482,8256 +7178,2046,4419,744,8312,5356,6855,8839,319,2962,5662,47,6307,8662,68,4813,567,2712,9931,1678,3101,8227,6533,4933,6656,92,5846,4780,6256,6361,4323,9985,1231,2175,7178,3034,9744,6155,9165,7787,5836,9318,7860,9644,8941,6480,9443,8188,5928,161,6979,2352,5628,6991,1198,8067,5867,6620,3778,8426,2994,3122,3124,6335,3918,8897,2655,9670,634,1088,1576,8935,7255,474,8166,7417,9547,2886,5560,3842 +6957,3111,26,7530,7143,1295,1744,6057,3009,1854,8098,5405,2234,4874,9447,2620,9303,27,7410,969,40,2966,5648,7596,8637,4238,3143,3679,7187,690,9980,7085,7714,9373,5632,7526,6707,3951,9734,4216,2146,3602,5371,6029,3039,4433,4855,4151,1449,3376,8009,7240,7027,4602,2947,9081,4045,8424,9352,8742,923,2705,4266,3232,2264,6761,363,2651,3383,7770,6730,7856,7340,9679,2158,610,4471,4608,910,6241 +4417,6756,1013,8797,658,8809,5032,8703,7541,846,3357,2920,9817,1745,9980,7593,4667,3087,779,3218,6233,5568,4296,2289,2654,7898,5021,9461,5593,8214,9173,4203,2271,7980,2983,5952,9992,8399,3468,1776,3188,9314,1720,6523,2933,621,8685,5483,8986,6163,3444,9539,4320,155,3992,2828,2150,6071,524,2895,5468,8063,1210,3348,9071,4862,483,9017,4097,6186,9815,3610,5048,1644,1003,9865,9332,2145,1944,2213 +9284,3803,4920,1927,6706,4344,7383,4786,9890,2010,5228,1224,3158,6967,8580,8990,8883,5213,76,8306,2031,4980,5639,9519,7184,5645,7769,3259,8077,9130,1317,3096,9624,3818,1770,695,2454,947,6029,3474,9938,3527,5696,4760,7724,7738,2848,6442,5767,6845,8323,4131,2859,7595,2500,4815,3660,9130,8580,7016,8231,4391,8369,3444,4069,4021,556,6154,627,2778,1496,4206,6356,8434,8491,3816,8231,3190,5575,1015 +3787,7572,1788,6803,5641,6844,1961,4811,8535,9914,9999,1450,8857,738,4662,8569,6679,2225,7839,8618,286,2648,5342,2294,3205,4546,176,8705,3741,6134,8324,8021,7004,5205,7032,6637,9442,5539,5584,4819,5874,5807,8589,6871,9016,983,1758,3786,1519,6241,185,8398,495,3370,9133,3051,4549,9674,7311,9738,3316,9383,2658,2776,9481,7558,619,3943,3324,6491,4933,153,9738,4623,912,3595,7771,7939,1219,4405 +2650,3883,4154,5809,315,7756,4430,1788,4451,1631,6461,7230,6017,5751,138,588,5282,2442,9110,9035,6349,2515,1570,6122,4192,4174,3530,1933,4186,4420,4609,5739,4135,2963,6308,1161,8809,8619,2796,3819,6971,8228,4188,1492,909,8048,2328,6772,8467,7671,9068,2226,7579,6422,7056,8042,3296,2272,3006,2196,7320,3238,3490,3102,37,1293,3212,4767,5041,8773,5794,4456,6174,7279,7054,2835,7053,9088,790,6640 +3101,1057,7057,3826,6077,1025,2955,1224,1114,6729,5902,4698,6239,7203,9423,1804,4417,6686,1426,6941,8071,1029,4985,9010,6122,6597,1622,1574,3513,1684,7086,5505,3244,411,9638,4150,907,9135,829,981,1707,5359,8781,9751,5,9131,3973,7159,1340,6955,7514,7993,6964,8198,1933,2797,877,3993,4453,8020,9349,8646,2779,8679,2961,3547,3374,3510,1129,3568,2241,2625,9138,5974,8206,7669,7678,1833,8700,4480 +4865,9912,8038,8238,782,3095,8199,1127,4501,7280,2112,2487,3626,2790,9432,1475,6312,8277,4827,2218,5806,7132,8752,1468,7471,6386,739,8762,8323,8120,5169,9078,9058,3370,9560,7987,8585,8531,5347,9312,1058,4271,1159,5286,5404,6925,8606,9204,7361,2415,560,586,4002,2644,1927,2824,768,4409,2942,3345,1002,808,4941,6267,7979,5140,8643,7553,9438,7320,4938,2666,4609,2778,8158,6730,3748,3867,1866,7181 +171,3771,7134,8927,4778,2913,3326,2004,3089,7853,1378,1729,4777,2706,9578,1360,5693,3036,1851,7248,2403,2273,8536,6501,9216,613,9671,7131,7719,6425,773,717,8803,160,1114,7554,7197,753,4513,4322,8499,4533,2609,4226,8710,6627,644,9666,6260,4870,5744,7385,6542,6203,7703,6130,8944,5589,2262,6803,6381,7414,6888,5123,7320,9392,9061,6780,322,8975,7050,5089,1061,2260,3199,1150,1865,5386,9699,6501 +3744,8454,6885,8277,919,1923,4001,6864,7854,5519,2491,6057,8794,9645,1776,5714,9786,9281,7538,6916,3215,395,2501,9618,4835,8846,9708,2813,3303,1794,8309,7176,2206,1602,1838,236,4593,2245,8993,4017,10,8215,6921,5206,4023,5932,6997,7801,262,7640,3107,8275,4938,7822,2425,3223,3886,2105,8700,9526,2088,8662,8034,7004,5710,2124,7164,3574,6630,9980,4242,2901,9471,1491,2117,4562,1130,9086,4117,6698 +2810,2280,2331,1170,4554,4071,8387,1215,2274,9848,6738,1604,7281,8805,439,1298,8318,7834,9426,8603,6092,7944,1309,8828,303,3157,4638,4439,9175,1921,4695,7716,1494,1015,1772,5913,1127,1952,1950,8905,4064,9890,385,9357,7945,5035,7082,5369,4093,6546,5187,5637,2041,8946,1758,7111,6566,1027,1049,5148,7224,7248,296,6169,375,1656,7993,2816,3717,4279,4675,1609,3317,42,6201,3100,3144,163,9530,4531 +7096,6070,1009,4988,3538,5801,7149,3063,2324,2912,7911,7002,4338,7880,2481,7368,3516,2016,7556,2193,1388,3865,8125,4637,4096,8114,750,3144,1938,7002,9343,4095,1392,4220,3455,6969,9647,1321,9048,1996,1640,6626,1788,314,9578,6630,2813,6626,4981,9908,7024,4355,3201,3521,3864,3303,464,1923,595,9801,3391,8366,8084,9374,1041,8807,9085,1892,9431,8317,9016,9221,8574,9981,9240,5395,2009,6310,2854,9255 +8830,3145,2960,9615,8220,6061,3452,2918,6481,9278,2297,3385,6565,7066,7316,5682,107,7646,4466,68,1952,9603,8615,54,7191,791,6833,2560,693,9733,4168,570,9127,9537,1925,8287,5508,4297,8452,8795,6213,7994,2420,4208,524,5915,8602,8330,2651,8547,6156,1812,6271,7991,9407,9804,1553,6866,1128,2119,4691,9711,8315,5879,9935,6900,482,682,4126,1041,428,6247,3720,5882,7526,2582,4327,7725,3503,2631 +2738,9323,721,7434,1453,6294,2957,3786,5722,6019,8685,4386,3066,9057,6860,499,5315,3045,5194,7111,3137,9104,941,586,3066,755,4177,8819,7040,5309,3583,3897,4428,7788,4721,7249,6559,7324,825,7311,3760,6064,6070,9672,4882,584,1365,9739,9331,5783,2624,7889,1604,1303,1555,7125,8312,425,8936,3233,7724,1480,403,7440,1784,1754,4721,1569,652,3893,4574,5692,9730,4813,9844,8291,9199,7101,3391,8914 +6044,2928,9332,3328,8588,447,3830,1176,3523,2705,8365,6136,5442,9049,5526,8575,8869,9031,7280,706,2794,8814,5767,4241,7696,78,6570,556,5083,1426,4502,3336,9518,2292,1885,3740,3153,9348,9331,8051,2759,5407,9028,7840,9255,831,515,2612,9747,7435,8964,4971,2048,4900,5967,8271,1719,9670,2810,6777,1594,6367,6259,8316,3815,1689,6840,9437,4361,822,9619,3065,83,6344,7486,8657,8228,9635,6932,4864 +8478,4777,6334,4678,7476,4963,6735,3096,5860,1405,5127,7269,7793,4738,227,9168,2996,8928,765,733,1276,7677,6258,1528,9558,3329,302,8901,1422,8277,6340,645,9125,8869,5952,141,8141,1816,9635,4025,4184,3093,83,2344,2747,9352,7966,1206,1126,1826,218,7939,2957,2729,810,8752,5247,4174,4038,8884,7899,9567,301,5265,5752,7524,4381,1669,3106,8270,6228,6373,754,2547,4240,2313,5514,3022,1040,9738 +2265,8192,1763,1369,8469,8789,4836,52,1212,6690,5257,8918,6723,6319,378,4039,2421,8555,8184,9577,1432,7139,8078,5452,9628,7579,4161,7490,5159,8559,1011,81,478,5840,1964,1334,6875,8670,9900,739,1514,8692,522,9316,6955,1345,8132,2277,3193,9773,3923,4177,2183,1236,6747,6575,4874,6003,6409,8187,745,8776,9440,7543,9825,2582,7381,8147,7236,5185,7564,6125,218,7991,6394,391,7659,7456,5128,5294 +2132,8992,8160,5782,4420,3371,3798,5054,552,5631,7546,4716,1332,6486,7892,7441,4370,6231,4579,2121,8615,1145,9391,1524,1385,2400,9437,2454,7896,7467,2928,8400,3299,4025,7458,4703,7206,6358,792,6200,725,4275,4136,7390,5984,4502,7929,5085,8176,4600,119,3568,76,9363,6943,2248,9077,9731,6213,5817,6729,4190,3092,6910,759,2682,8380,1254,9604,3011,9291,5329,9453,9746,2739,6522,3765,5634,1113,5789 +5304,5499,564,2801,679,2653,1783,3608,7359,7797,3284,796,3222,437,7185,6135,8571,2778,7488,5746,678,6140,861,7750,803,9859,9918,2425,3734,2698,9005,4864,9818,6743,2475,132,9486,3825,5472,919,292,4411,7213,7699,6435,9019,6769,1388,802,2124,1345,8493,9487,8558,7061,8777,8833,2427,2238,5409,4957,8503,3171,7622,5779,6145,2417,5873,5563,5693,9574,9491,1937,7384,4563,6842,5432,2751,3406,7981 diff --git a/python-mega-algo/project_euler/problem_081/right.html b/python-mega-algo/project_euler/problem_081/right.html new file mode 100644 index 00000000..8deb12e2 --- /dev/null +++ b/python-mega-algo/project_euler/problem_081/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/project_euler/problem_081 + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    sol1.py __init__.py matrix.txt 
    + +

    +Folders: 1
    +Files: 3
    +Size of all files: 32821 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/project_euler/problem_081/sol1.py b/python-mega-algo/project_euler/problem_081/sol1.py new file mode 100644 index 00000000..afa143f2 --- /dev/null +++ b/python-mega-algo/project_euler/problem_081/sol1.py @@ -0,0 +1,47 @@ +""" +Problem 81: https://projecteuler.net/problem=81 +In the 5 by 5 matrix below, the minimal path sum from the top left to the bottom right, +by only moving to the right and down, is indicated in bold red and is equal to 2427. + + [131] 673 234 103 18 + [201] [96] [342] 965 150 + 630 803 [746] [422] 111 + 537 699 497 [121] 956 + 805 732 524 [37] [331] + +Find the minimal path sum from the top left to the bottom right by only moving right +and down in matrix.txt (https://projecteuler.net/project/resources/p081_matrix.txt), +a 31K text file containing an 80 by 80 matrix. +""" +import os + + +def solution(filename: str = "matrix.txt") -> int: + """ + Returns the minimal path sum from the top left to the bottom right of the matrix. + >>> solution() + 427337 + """ + with open(os.path.join(os.path.dirname(__file__), filename), "r") as in_file: + data = in_file.read() + + grid = [[int(cell) for cell in row.split(",")] for row in data.strip().splitlines()] + dp = [[0 for cell in row] for row in grid] + n = len(grid[0]) + + dp = [[0 for i in range(n)] for j in range(n)] + dp[0][0] = grid[0][0] + for i in range(1, n): + dp[0][i] = grid[0][i] + dp[0][i - 1] + for i in range(1, n): + dp[i][0] = grid[i][0] + dp[i - 1][0] + + for i in range(1, n): + for j in range(1, n): + dp[i][j] = grid[i][j] + min(dp[i - 1][j], dp[i][j - 1]) + + return dp[-1][-1] + + +if __name__ == "__main__": + print(f"{solution() = }") diff --git a/python-mega-algo/project_euler/problem_085/__init__.py b/python-mega-algo/project_euler/problem_085/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/project_euler/problem_085/right.html b/python-mega-algo/project_euler/problem_085/right.html new file mode 100644 index 00000000..cda84fba --- /dev/null +++ b/python-mega-algo/project_euler/problem_085/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/project_euler/problem_085 + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    sol1.py __init__.py 
    + +

    +Folders: 1
    +Files: 2
    +Size of all files: 4244 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/project_euler/problem_085/sol1.py b/python-mega-algo/project_euler/problem_085/sol1.py new file mode 100644 index 00000000..74e36b13 --- /dev/null +++ b/python-mega-algo/project_euler/problem_085/sol1.py @@ -0,0 +1,108 @@ +""" +Project Euler Problem 85: https://projecteuler.net/problem=85 + +By counting carefully it can be seen that a rectangular grid measuring 3 by 2 +contains eighteen rectangles. + +Although there exists no rectangular grid that contains exactly two million +rectangles, find the area of the grid with the nearest solution. + +Solution: + + For a grid with side-lengths a and b, the number of rectangles contained in the grid + is [a*(a+1)/2] * [b*(b+1)/2)], which happens to be the product of the a-th and b-th + triangle numbers. So to find the solution grid (a,b), we need to find the two + triangle numbers whose product is closest to two million. + + Denote these two triangle numbers Ta and Tb. We want their product Ta*Tb to be + as close as possible to 2m. Assuming that the best solution is fairly close to 2m, + We can assume that both Ta and Tb are roughly bounded by 2m. Since Ta = a(a+1)/2, + we can assume that a (and similarly b) are roughly bounded by sqrt(2 * 2m) = 2000. + Since this is a rough bound, to be on the safe side we add 10%. Therefore we start + by generating all the triangle numbers Ta for 1 <= a <= 2200. This can be done + iteratively since the ith triangle number is the sum of 1,2, ... ,i, and so + T(i) = T(i-1) + i. + + We then search this list of triangle numbers for the two that give a product + closest to our target of two million. Rather than testing every combination of 2 + elements of the list, which would find the result in quadratic time, we can find + the best pair in linear time. + + We iterate through the list of triangle numbers using enumerate() so we have a + and Ta. Since we want Ta * Tb to be as close as possible to 2m, we know that Tb + needs to be roughly 2m / Ta. Using the formula Tb = b*(b+1)/2 as well as the + quadratic formula, we can solve for b: + b is roughly (-1 + sqrt(1 + 8 * 2m / Ta)) / 2. + + Since the closest integers to this estimate will give product closest to 2m, + we only need to consider the integers above and below. It's then a simple matter + to get the triangle numbers corresponding to those integers, calculate the product + Ta * Tb, compare that product to our target 2m, and keep track of the (a,b) pair + that comes the closest. + + +Reference: https://en.wikipedia.org/wiki/Triangular_number + https://en.wikipedia.org/wiki/Quadratic_formula +""" + + +from math import ceil, floor, sqrt +from typing import List + + +def solution(target: int = 2000000) -> int: + """ + Find the area of the grid which contains as close to two million rectangles + as possible. + >>> solution(20) + 6 + >>> solution(2000) + 72 + >>> solution(2000000000) + 86595 + """ + triangle_numbers: List[int] = [0] + idx: int + + for idx in range(1, ceil(sqrt(target * 2) * 1.1)): + triangle_numbers.append(triangle_numbers[-1] + idx) + + # we want this to be as close as possible to target + best_product: int = 0 + # the area corresponding to the grid that gives the product closest to target + area: int = 0 + # an estimate of b, using the quadratic formula + b_estimate: float + # the largest integer less than b_estimate + b_floor: int + # the largest integer less than b_estimate + b_ceil: int + # the triangle number corresponding to b_floor + triangle_b_first_guess: int + # the triangle number corresponding to b_ceil + triangle_b_second_guess: int + + for idx_a, triangle_a in enumerate(triangle_numbers[1:], 1): + b_estimate = (-1 + sqrt(1 + 8 * target / triangle_a)) / 2 + b_floor = floor(b_estimate) + b_ceil = ceil(b_estimate) + triangle_b_first_guess = triangle_numbers[b_floor] + triangle_b_second_guess = triangle_numbers[b_ceil] + + if abs(target - triangle_b_first_guess * triangle_a) < abs( + target - best_product + ): + best_product = triangle_b_first_guess * triangle_a + area = idx_a * b_floor + + if abs(target - triangle_b_second_guess * triangle_a) < abs( + target - best_product + ): + best_product = triangle_b_second_guess * triangle_a + area = idx_a * b_ceil + + return area + + +if __name__ == "__main__": + print(f"{solution() = }") diff --git a/python-mega-algo/project_euler/problem_086/__init__.py b/python-mega-algo/project_euler/problem_086/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/project_euler/problem_086/right.html b/python-mega-algo/project_euler/problem_086/right.html new file mode 100644 index 00000000..99b640e0 --- /dev/null +++ b/python-mega-algo/project_euler/problem_086/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/project_euler/problem_086 + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    sol1.py __init__.py 
    + +

    +Folders: 1
    +Files: 2
    +Size of all files: 4230 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/project_euler/problem_086/sol1.py b/python-mega-algo/project_euler/problem_086/sol1.py new file mode 100644 index 00000000..0bf66e6b --- /dev/null +++ b/python-mega-algo/project_euler/problem_086/sol1.py @@ -0,0 +1,105 @@ +""" +Project Euler Problem 86: https://projecteuler.net/problem=86 + +A spider, S, sits in one corner of a cuboid room, measuring 6 by 5 by 3, and a fly, F, +sits in the opposite corner. By travelling on the surfaces of the room the shortest +"straight line" distance from S to F is 10 and the path is shown on the diagram. + +However, there are up to three "shortest" path candidates for any given cuboid and the +shortest route doesn't always have integer length. + +It can be shown that there are exactly 2060 distinct cuboids, ignoring rotations, with +integer dimensions, up to a maximum size of M by M by M, for which the shortest route +has integer length when M = 100. This is the least value of M for which the number of +solutions first exceeds two thousand; the number of solutions when M = 99 is 1975. + +Find the least value of M such that the number of solutions first exceeds one million. + +Solution: + Label the 3 side-lengths of the cuboid a,b,c such that 1 <= a <= b <= c <= M. + By conceptually "opening up" the cuboid and laying out its faces on a plane, + it can be seen that the shortest distance between 2 opposite corners is + sqrt((a+b)^2 + c^2). This distance is an integer if and only if (a+b),c make up + the first 2 sides of a pythagorean triplet. + + The second useful insight is rather than calculate the number of cuboids + with integral shortest distance for each maximum cuboid side-length M, + we can calculate this number iteratively each time we increase M, as follows. + The set of cuboids satisfying this property with maximum side-length M-1 is a + subset of the cuboids satisfying the property with maximum side-length M + (since any cuboids with side lengths <= M-1 are also <= M). To calculate the + number of cuboids in the larger set (corresponding to M) we need only consider + the cuboids which have at least one side of length M. Since we have ordered the + side lengths a <= b <= c, we can assume that c = M. Then we just need to count + the number of pairs a,b satisfying the conditions: + sqrt((a+b)^2 + M^2) is integer + 1 <= a <= b <= M + + To count the number of pairs (a,b) satisfying these conditions, write d = a+b. + Now we have: + 1 <= a <= b <= M => 2 <= d <= 2*M + we can actually make the second equality strict, + since d = 2*M => d^2 + M^2 = 5M^2 + => shortest distance = M * sqrt(5) + => not integral. + a + b = d => b = d - a + and a <= b + => a <= d/2 + also a <= M + => a <= min(M, d//2) + + a + b = d => a = d - b + and b <= M + => a >= d - M + also a >= 1 + => a >= max(1, d - M) + + So a is in range(max(1, d - M), min(M, d // 2) + 1) + + For a given d, the number of cuboids satisfying the required property with c = M + and a + b = d is the length of this range, which is + min(M, d // 2) + 1 - max(1, d - M). + + In the code below, d is sum_shortest_sides + and M is max_cuboid_size. + + +""" + + +from math import sqrt + + +def solution(limit: int = 1000000) -> int: + """ + Return the least value of M such that there are more than one million cuboids + of side lengths 1 <= a,b,c <= M such that the shortest distance between two + opposite vertices of the cuboid is integral. + >>> solution(100) + 24 + >>> solution(1000) + 72 + >>> solution(2000) + 100 + >>> solution(20000) + 288 + """ + num_cuboids: int = 0 + max_cuboid_size: int = 0 + sum_shortest_sides: int + + while num_cuboids <= limit: + max_cuboid_size += 1 + for sum_shortest_sides in range(2, 2 * max_cuboid_size + 1): + if sqrt(sum_shortest_sides ** 2 + max_cuboid_size ** 2).is_integer(): + num_cuboids += ( + min(max_cuboid_size, sum_shortest_sides // 2) + - max(1, sum_shortest_sides - max_cuboid_size) + + 1 + ) + + return max_cuboid_size + + +if __name__ == "__main__": + print(f"{solution() = }") diff --git a/python-mega-algo/project_euler/problem_087/__init__.py b/python-mega-algo/project_euler/problem_087/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/project_euler/problem_087/right.html b/python-mega-algo/project_euler/problem_087/right.html new file mode 100644 index 00000000..00c4268c --- /dev/null +++ b/python-mega-algo/project_euler/problem_087/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/project_euler/problem_087 + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    sol1.py __init__.py 
    + +

    +Folders: 1
    +Files: 2
    +Size of all files: 1519 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/project_euler/problem_087/sol1.py b/python-mega-algo/project_euler/problem_087/sol1.py new file mode 100644 index 00000000..f444481c --- /dev/null +++ b/python-mega-algo/project_euler/problem_087/sol1.py @@ -0,0 +1,52 @@ +""" +Project Euler Problem 87: https://projecteuler.net/problem=87 + +The smallest number expressible as the sum of a prime square, prime cube, and prime +fourth power is 28. In fact, there are exactly four numbers below fifty that can be +expressed in such a way: + +28 = 22 + 23 + 24 +33 = 32 + 23 + 24 +49 = 52 + 23 + 24 +47 = 22 + 33 + 24 + +How many numbers below fifty million can be expressed as the sum of a prime square, +prime cube, and prime fourth power? +""" + + +def solution(limit: int = 50000000) -> int: + """ + Return the number of integers less than limit which can be expressed as the sum + of a prime square, prime cube, and prime fourth power. + >>> solution(50) + 4 + """ + ret = set() + prime_square_limit = int((limit - 24) ** (1 / 2)) + + primes = set(range(3, prime_square_limit + 1, 2)) + primes.add(2) + for p in range(3, prime_square_limit + 1, 2): + if p not in primes: + continue + primes.difference_update(set(range(p * p, prime_square_limit + 1, p))) + + for prime1 in primes: + square = prime1 * prime1 + for prime2 in primes: + cube = prime2 * prime2 * prime2 + if square + cube >= limit - 16: + break + for prime3 in primes: + tetr = prime3 * prime3 * prime3 * prime3 + total = square + cube + tetr + if total >= limit: + break + ret.add(total) + + return len(ret) + + +if __name__ == "__main__": + print(f"{solution() = }") diff --git a/python-mega-algo/project_euler/problem_089/__init__.py b/python-mega-algo/project_euler/problem_089/__init__.py new file mode 100644 index 00000000..792d6005 --- /dev/null +++ b/python-mega-algo/project_euler/problem_089/__init__.py @@ -0,0 +1 @@ +# diff --git a/python-mega-algo/project_euler/problem_089/numeralcleanup_test.txt b/python-mega-algo/project_euler/problem_089/numeralcleanup_test.txt new file mode 100644 index 00000000..06142142 --- /dev/null +++ b/python-mega-algo/project_euler/problem_089/numeralcleanup_test.txt @@ -0,0 +1,5 @@ +IIII +IV +IIIIIIIIII +X +VIIIII diff --git a/python-mega-algo/project_euler/problem_089/p089_roman.txt b/python-mega-algo/project_euler/problem_089/p089_roman.txt new file mode 100644 index 00000000..50651c35 --- /dev/null +++ b/python-mega-algo/project_euler/problem_089/p089_roman.txt @@ -0,0 +1,1000 @@ +MMMMDCLXXII +MMDCCCLXXXIII +MMMDLXVIIII +MMMMDXCV +DCCCLXXII +MMCCCVI +MMMCDLXXXVII +MMMMCCXXI +MMMCCXX +MMMMDCCCLXXIII +MMMCCXXXVII +MMCCCLXXXXIX +MDCCCXXIIII +MMCXCVI +CCXCVIII +MMMCCCXXXII +MDCCXXX +MMMDCCCL +MMMMCCLXXXVI +MMDCCCXCVI +MMMDCII +MMMCCXII +MMMMDCCCCI +MMDCCCXCII +MDCXX +CMLXXXVII +MMMXXI +MMMMCCCXIV +MLXXII +MCCLXXVIIII +MMMMCCXXXXI +MMDCCCLXXII +MMMMXXXI +MMMDCCLXXX +MMDCCCLXXIX +MMMMLXXXV +MCXXI +MDCCCXXXVII +MMCCCLXVII +MCDXXXV +CCXXXIII +CMXX +MMMCLXIV +MCCCLXXXVI +DCCCXCVIII +MMMDCCCCXXXIV +CDXVIIII +MMCCXXXV +MDCCCXXXII +MMMMD +MMDCCLXIX +MMMMCCCLXXXXVI +MMDCCXLII +MMMDCCCVIIII +DCCLXXXIIII +MDCCCCXXXII +MMCXXVII +DCCCXXX +CCLXIX +MMMXI +MMMMCMLXXXXVIII +MMMMDLXXXVII +MMMMDCCCLX +MMCCLIV +CMIX +MMDCCCLXXXIIII +CLXXXII +MMCCCCXXXXV +MMMMDLXXXVIIII +MMMDCCCXXI +MMDCCCCLXXVI +MCCCCLXX +MMCDLVIIII +MMMDCCCLIX +MMMMCCCCXIX +MMMDCCCLXXV +XXXI +CDLXXXIII +MMMCXV +MMDCCLXIII +MMDXXX +MMMMCCCLVII +MMMDCI +MMMMCDLXXXIIII +MMMMCCCXVI +CCCLXXXVIII +MMMMCML +MMMMXXIV +MMMCCCCXXX +DCCX +MMMCCLX +MMDXXXIII +CCCLXIII +MMDCCXIII +MMMCCCXLIV +CLXXXXI +CXVI +MMMMCXXXIII +CLXX +DCCCXVIII +MLXVII +DLXXXX +MMDXXI +MMMMDLXXXXVIII +MXXII +LXI +DCCCCXLIII +MMMMDV +MMMMXXXIV +MDCCCLVIII +MMMCCLXXII +MMMMDCCXXXVI +MMMMLXXXIX +MDCCCLXXXI +MMMMDCCCXV +MMMMCCCCXI +MMMMCCCLIII +MDCCCLXXI +MMCCCCXI +MLXV +MMCDLXII +MMMMDXXXXII +MMMMDCCCXL +MMMMCMLVI +CCLXXXIV +MMMDCCLXXXVI +MMCLII +MMMCCCCXV +MMLXXXIII +MMMV +MMMV +DCCLXII +MMDCCCCXVI +MMDCXLVIII +CCLIIII +CCCXXV +MMDCCLXXXVIIII +MMMMDCLXXVIII +MMMMDCCCXCI +MMMMCCCXX +MMCCXLV +MMMDCCCLXIX +MMCCLXIIII +MMMDCCCXLIX +MMMMCCCLXIX +CMLXXXXI +MCMLXXXIX +MMCDLXI +MMDCLXXVIII +MMMMDCCLXI +MCDXXV +DL +CCCLXXII +MXVIIII +MCCCCLXVIII +CIII +MMMDCCLXXIIII +MMMDVIII +MMMMCCCLXXXXVII +MMDXXVII +MMDCCLXXXXV +MMMMCXLVI +MMMDCCLXXXII +MMMDXXXVI +MCXXII +CLI +DCLXXXIX +MMMCLI +MDCLXIII +MMMMDCCXCVII +MMCCCLXXXV +MMMDCXXVIII +MMMCDLX +MMMCMLII +MMMIV +MMMMDCCCLVIII +MMMDLXXXVIII +MCXXIV +MMMMLXXVI +CLXXIX +MMMCCCCXXVIIII +DCCLXXXV +MMMDCCCVI +LI +CLXXXVI +MMMMCCCLXXVI +MCCCLXVI +CCXXXIX +MMDXXXXI +MMDCCCXLI +DCCCLXXXVIII +MMMMDCCCIV +MDCCCCXV +MMCMVI +MMMMCMLXXXXV +MMDCCLVI +MMMMCCXLVIII +DCCCCIIII +MMCCCCIII +MMMDCCLXXXVIIII +MDCCCLXXXXV +DVII +MMMV +DCXXV +MMDCCCXCV +DCVIII +MMCDLXVI +MCXXVIII +MDCCXCVIII +MMDCLX +MMMDCCLXIV +MMCDLXXVII +MMDLXXXIIII +MMMMCCCXXII +MMMDCCCXLIIII +DCCCCLXVII +MMMCLXXXXIII +MCCXV +MMMMDCXI +MMMMDCLXXXXV +MMMCCCLII +MMCMIX +MMDCCXXV +MMDLXXXVI +MMMMDCXXVIIII +DCCCCXXXVIIII +MMCCXXXIIII +MMDCCLXXVIII +MDCCLXVIIII +MMCCLXXXV +MMMMDCCCLXXXVIII +MMCMXCI +MDXLII +MMMMDCCXIV +MMMMLI +DXXXXIII +MMDCCXI +MMMMCCLXXXIII +MMMDCCCLXXIII +MDCLVII +MMCD +MCCCXXVII +MMMMDCCIIII +MMMDCCXLVI +MMMCLXXXVII +MMMCCVIIII +MCCCCLXXIX +DL +DCCCLXXVI +MMDXCI +MMMMDCCCCXXXVI +MMCII +MMMDCCCXXXXV +MMMCDXLV +MMDCXXXXIV +MMD +MDCCCLXXXX +MMDCXLIII +MMCCXXXII +MMDCXXXXVIIII +DCCCLXXI +MDXCVIIII +MMMMCCLXXVIII +MDCLVIIII +MMMCCCLXXXIX +MDCLXXXV +MDLVIII +MMMMCCVII +MMMMDCXIV +MMMCCCLXIIII +MMIIII +MMMMCCCLXXIII +CCIII +MMMCCLV +MMMDXIII +MMMCCCXC +MMMDCCCXXI +MMMMCCCCXXXII +CCCLVI +MMMCCCLXXXVI +MXVIIII +MMMCCCCXIIII +CLXVII +MMMCCLXX +CCCCLXIV +MMXXXXII +MMMMCCLXXXX +MXL +CCXVI +CCCCLVIIII +MMCCCII +MCCCLVIII +MMMMCCCX +MCDLXXXXIV +MDCCCXIII +MMDCCCXL +MMMMCCCXXIII +DXXXIV +CVI +MMMMDCLXXX +DCCCVII +MMCMLXIIII +MMMDCCCXXXIII +DCCC +MDIII +MMCCCLXVI +MMMCCCCLXXI +MMDCCCCXVIII +CCXXXVII +CCCXXV +MDCCCXII +MMMCMV +MMMMCMXV +MMMMDCXCI +DXXI +MMCCXLVIIII +MMMMCMLII +MDLXXX +MMDCLXVI +CXXI +MMMDCCCLIIII +MMMCXXI +MCCIII +MMDCXXXXI +CCXCII +MMMMDXXXV +MMMCCCLXV +MMMMDLXV +MMMCCCCXXXII +MMMCCCVIII +DCCCCLXXXXII +MMCLXIV +MMMMCXI +MLXXXXVII +MMMCDXXXVIII +MDXXII +MLV +MMMMDLXVI +MMMCXII +XXXIII +MMMMDCCCXXVI +MMMLXVIIII +MMMLX +MMMCDLXVII +MDCCCLVII +MMCXXXVII +MDCCCCXXX +MMDCCCLXIII +MMMMDCXLIX +MMMMCMXLVIII +DCCCLXXVIIII +MDCCCLIII +MMMCMLXI +MMMMCCLXI +MMDCCCLIII +MMMDCCCVI +MMDXXXXIX +MMCLXXXXV +MMDXXX +MMMXIII +DCLXXIX +DCCLXII +MMMMDCCLXVIII +MDCCXXXXIII +CCXXXII +MMMMDCXXV +MMMCCCXXVIII +MDCVIII +MMMCLXXXXIIII +CLXXXI +MDCCCCXXXIII +MMMMDCXXX +MMMDCXXIV +MMMCCXXXVII +MCCCXXXXIIII +CXVIII +MMDCCCCIV +MMMMCDLXXV +MMMDLXIV +MDXCIII +MCCLXXXI +MMMDCCCXXIV +MCXLIII +MMMDCCCI +MCCLXXX +CCXV +MMDCCLXXI +MMDLXXXIII +MMMMDCXVII +MMMCMLXV +MCLXVIII +MMMMCCLXXVI +MMMDCCLXVIIII +MMMMDCCCIX +DLXXXXIX +DCCCXXII +MMMMIII +MMMMCCCLXXVI +DCCCXCIII +DXXXI +MXXXIIII +CCXII +MMMDCCLXXXIIII +MMMCXX +MMMCMXXVII +DCCCXXXX +MMCDXXXVIIII +MMMMDCCXVIII +LV +MMMDCCCCVI +MCCCII +MMCMLXVIIII +MDCCXI +MMMMDLXVII +MMCCCCLXI +MMDCCV +MMMCCCXXXIIII +MMMMDI +MMMDCCCXCV +MMDCCLXXXXI +MMMDXXVI +MMMDCCCLVI +MMDCXXX +MCCCVII +MMMMCCCLXII +MMMMXXV +MMCMXXV +MMLVI +MMDXXX +MMMMCVII +MDC +MCCIII +MMMMDCC +MMCCLXXV +MMDCCCXXXXVI +MMMMCCCLXV +CDXIIII +MLXIIII +CCV +MMMCMXXXI +CCCCLXVI +MDXXXII +MMMMCCCLVIII +MMV +MMMCLII +MCMLI +MMDCCXX +MMMMCCCCXXXVI +MCCLXXXI +MMMCMVI +DCCXXX +MMMMCCCLXV +DCCCXI +MMMMDCCCXIV +CCCXXI +MMDLXXV +CCCCLXXXX +MCCCLXXXXII +MMDCIX +DCCXLIIII +DXIV +MMMMCLII +CDLXI +MMMCXXVII +MMMMDCCCCLXIII +MMMDCLIIII +MCCCCXXXXII +MMCCCLX +CCCCLIII +MDCCLXXVI +MCMXXIII +MMMMDLXXVIII +MMDCCCCLX +MMMCCCLXXXX +MMMCDXXVI +MMMDLVIII +CCCLXI +MMMMDCXXII +MMDCCCXXI +MMDCCXIII +MMMMCLXXXVI +MDCCCCXXVI +MDV +MMDCCCCLXXVI +MMMMCCXXXVII +MMMDCCLXXVIIII +MMMCCCCLXVII +DCCXLI +MMCLXXXVIII +MCCXXXVI +MMDCXLVIII +MMMMCXXXII +MMMMDCCLXVI +MMMMCMLI +MMMMCLXV +MMMMDCCCXCIV +MCCLXXVII +LXXVIIII +DCCLII +MMMCCCXCVI +MMMCLV +MMDCCCXXXXVIII +DCCCXV +MXC +MMDCCLXXXXVII +MMMMCML +MMDCCCLXXVIII +DXXI +MCCCXLI +DCLXXXXI +MMCCCLXXXXVIII +MDCCCCLXXVIII +MMMMDXXV +MMMDCXXXVI +MMMCMXCVII +MMXVIIII +MMMDCCLXXIV +MMMCXXV +DXXXVIII +MMMMCLXVI +MDXII +MMCCCLXX +CCLXXI +DXIV +MMMCLIII +DLII +MMMCCCXLIX +MMCCCCXXVI +MMDCXLIII +MXXXXII +CCCLXXXV +MDCLXXVI +MDCXII +MMMCCCLXXXIII +MMDCCCCLXXXII +MMMMCCCLXXXV +MMDCXXI +DCCCXXX +MMMDCCCCLII +MMMDCCXXII +MMMMCDXCVIII +MMMCCLXVIIII +MMXXV +MMMMCDXIX +MMMMCCCX +MMMCCCCLXVI +MMMMDCLXXVIIII +MMMMDCXXXXIV +MMMCMXII +MMMMXXXIII +MMMMDLXXXII +DCCCLIV +MDXVIIII +MMMCLXXXXV +CCCCXX +MMDIX +MMCMLXXXVIII +DCCXLIII +DCCLX +D +MCCCVII +MMMMCCCLXXXIII +MDCCCLXXIIII +MMMDCCCCLXXXVII +MMMMCCCVII +MMMDCCLXXXXVI +CDXXXIV +MCCLXVIII +MMMMDLX +MMMMDXII +MMMMCCCCLIIII +MCMLXXXXIII +MMMMDCCCIII +MMDCLXXXIII +MDCCCXXXXIV +XXXXVII +MMMDCCCXXXII +MMMDCCCXLII +MCXXXV +MDCXXVIIII +MMMCXXXXIIII +MMMMCDXVII +MMMDXXIII +MMMMCCCCLXI +DCLXXXXVIIII +LXXXXI +CXXXIII +MCDX +MCCLVII +MDCXXXXII +MMMCXXIV +MMMMLXXXX +MMDCCCCXLV +MLXXX +MMDCCCCLX +MCDLIII +MMMCCCLXVII +MMMMCCCLXXIV +MMMDCVIII +DCCCCXXIII +MMXCI +MMDCCIV +MMMMDCCCXXXIV +CCCLXXI +MCCLXXXII +MCMIII +CCXXXI +DCCXXXVIII +MMMMDCCXLVIIII +MMMMCMXXXV +DCCCLXXV +DCCXCI +MMMMDVII +MMMMDCCCLXVIIII +CCCXCV +MMMMDCCXX +MCCCCII +MMMCCCXC +MMMCCCII +MMDCCLXXVII +MMDCLIIII +CCXLIII +MMMDCXVIII +MMMCCCIX +MCXV +MMCCXXV +MLXXIIII +MDCCXXVI +MMMCCCXX +MMDLXX +MMCCCCVI +MMDCCXX +MMMMDCCCCXCV +MDCCCXXXII +MMMMDCCCCXXXX +XCIV +MMCCCCLX +MMXVII +MLXXI +MMMDXXVIII +MDCCCCII +MMMCMLVII +MMCLXXXXVIII +MDCCCCLV +MCCCCLXXIIII +MCCCLII +MCDXLVI +MMMMDXVIII +DCCLXXXIX +MMMDCCLXIV +MDCCCCXLIII +CLXXXXV +MMMMCCXXXVI +MMMDCCCXXI +MMMMCDLXXVII +MCDLIII +MMCCXLVI +DCCCLV +MCDLXX +DCLXXVIII +MMDCXXXIX +MMMMDCLX +MMDCCLI +MMCXXXV +MMMCCXII +MMMMCMLXII +MMMMCCV +MCCCCLXIX +MMMMCCIII +CLXVII +MCCCLXXXXIIII +MMMMDCVIII +MMDCCCLXI +MMLXXIX +CMLXIX +MMDCCCXLVIIII +DCLXII +MMMCCCXLVII +MDCCCXXXV +MMMMDCCXCVI +DCXXX +XXVI +MMLXIX +MMCXI +DCXXXVII +MMMMCCCXXXXVIII +MMMMDCLXI +MMMMDCLXXIIII +MMMMVIII +MMMMDCCCLXII +MDCXCI +MMCCCXXIIII +CCCCXXXXV +MMDCCCXXI +MCVI +MMDCCLXVIII +MMMMCXL +MLXVIII +CMXXVII +CCCLV +MDCCLXXXIX +MMMCCCCLXV +MMDCCLXII +MDLXVI +MMMCCCXVIII +MMMMCCLXXXI +MMCXXVII +MMDCCCLXVIII +MMMCXCII +MMMMDCLVIII +MMMMDCCCXXXXII +MMDCCCCLXXXXVI +MDCCXL +MDCCLVII +MMMMDCCCLXXXVI +DCCXXXIII +MMMMDCCCCLXXXV +MMCCXXXXVIII +MMMCCLXXVIII +MMMDCLXXVIII +DCCCI +MMMMLXXXXVIIII +MMMCCCCLXXII +MMCLXXXVII +CCLXVI +MCDXLIII +MMCXXVIII +MDXIV +CCCXCVIII +CLXXVIII +MMCXXXXVIIII +MMMDCLXXXIV +CMLVIII +MCDLIX +MMMMDCCCXXXII +MMMMDCXXXIIII +MDCXXI +MMMDCXLV +MCLXXVIII +MCDXXII +IV +MCDLXXXXIII +MMMMDCCLXV +CCLI +MMMMDCCCXXXVIII +DCLXII +MCCCLXVII +MMMMDCCCXXXVI +MMDCCXLI +MLXI +MMMCDLXVIII +MCCCCXCIII +XXXIII +MMMDCLXIII +MMMMDCL +DCCCXXXXIIII +MMDLVII +DXXXVII +MCCCCXXIIII +MCVII +MMMMDCCXL +MMMMCXXXXIIII +MCCCCXXIV +MMCLXVIII +MMXCIII +MDCCLXXX +MCCCLIIII +MMDCLXXI +MXI +MCMLIV +MMMCCIIII +DCCLXXXVIIII +MDCLIV +MMMDCXIX +CMLXXXI +DCCLXXXVII +XXV +MMMXXXVI +MDVIIII +CLXIII +MMMCDLVIIII +MMCCCCVII +MMMLXX +MXXXXII +MMMMCCCLXVIII +MMDCCCXXVIII +MMMMDCXXXXI +MMMMDCCCXXXXV +MMMXV +MMMMCCXVIIII +MMDCCXIIII +MMMXXVII +MDCCLVIIII +MMCXXIIII +MCCCLXXIV +DCLVIII +MMMLVII +MMMCXLV +MMXCVII +MMMCCCLXXXVII +MMMMCCXXII +DXII +MMMDLV +MCCCLXXVIII +MMMCLIIII +MMMMCLXXXX +MMMCLXXXIIII +MDCXXIII +MMMMCCXVI +MMMMDLXXXIII +MMMDXXXXIII +MMMMCCCCLV +MMMDLXXXI +MMMCCLXXVI +MMMMXX +MMMMDLVI +MCCCCLXXX +MMMXXII +MMXXII +MMDCCCCXXXI +MMMDXXV +MMMDCLXXXVIIII +MMMDLXXXXVII +MDLXIIII +CMXC +MMMXXXVIII +MDLXXXVIII +MCCCLXXVI +MMCDLIX +MMDCCCXVIII +MDCCCXXXXVI +MMMMCMIV +MMMMDCIIII +MMCCXXXV +XXXXVI +MMMMCCXVII +MMCCXXIV +MCMLVIIII +MLXXXIX +MMMMLXXXIX +CLXXXXIX +MMMDCCCCLVIII +MMMMCCLXXIII +MCCCC +DCCCLIX +MMMCCCLXXXII +MMMCCLXVIIII +MCLXXXV +CDLXXXVII +DCVI +MMX +MMCCXIII +MMMMDCXX +MMMMXXVIII +DCCCLXII +MMMMCCCXLIII +MMMMCLXV +DXCI +MMMMCLXXX +MMMDCCXXXXI +MMMMXXXXVI +DCLX +MMMCCCXI +MCCLXXX +MMCDLXXII +DCCLXXI +MMMCCCXXXVI +MCCCCLXXXVIIII +CDLVIII +DCCLVI +MMMMDCXXXVIII +MMCCCLXXXIII +MMMMDCCLXXV +MMMXXXVI +CCCLXXXXIX +CV +CCCCXIII +CCCCXVI +MDCCCLXXXIIII +MMDCCLXXXII +MMMMCCCCLXXXI +MXXV +MMCCCLXXVIIII +MMMCCXII +MMMMCCXXXIII +MMCCCLXXXVI +MMMDCCCLVIIII +MCCXXXVII +MDCLXXV +XXXV +MMDLI +MMMCCXXX +MMMMCXXXXV +CCCCLIX +MMMMDCCCLXXIII +MMCCCXVII +DCCCXVI +MMMCCCXXXXV +MDCCCCXCV +CLXXXI +MMMMDCCLXX +MMMDCCCIII +MMCLXXVII +MMMDCCXXIX +MMDCCCXCIIII +MMMCDXXIIII +MMMMXXVIII +MMMMDCCCCLXVIII +MDCCCXX +MMMMCDXXI +MMMMDLXXXIX +CCXVI +MDVIII +MMCCLXXI +MMMDCCCLXXI +MMMCCCLXXVI +MMCCLXI +MMMMDCCCXXXIV +DLXXXVI +MMMMDXXXII +MMMXXIIII +MMMMCDIV +MMMMCCCXLVIII +MMMMCXXXVIII +MMMCCCLXVI +MDCCXVIII +MMCXX +CCCLIX +MMMMDCCLXXII +MDCCCLXXV +MMMMDCCCXXIV +DCCCXXXXVIII +MMMDCCCCXXXVIIII +MMMMCCXXXV +MDCLXXXIII +MMCCLXXXIV +MCLXXXXIIII +DXXXXIII +MCCCXXXXVIII +MMCLXXIX +MMMMCCLXIV +MXXII +MMMCXIX +MDCXXXVII +MMDCCVI +MCLXXXXVIII +MMMCXVI +MCCCLX +MMMCDX +CCLXVIIII +MMMCCLX +MCXXVIII +LXXXII +MCCCCLXXXI +MMMI +MMMCCCLXIV +MMMCCCXXVIIII +CXXXVIII +MMCCCXX +MMMCCXXVIIII +MCCLXVI +MMMCCCCXXXXVI +MMDCCXCIX +MCMLXXI +MMCCLXVIII +CDLXXXXIII +MMMMDCCXXII +MMMMDCCLXXXVII +MMMDCCLIV +MMCCLXIII +MDXXXVII +DCCXXXIIII +MCII +MMMDCCCLXXI +MMMLXXIII +MDCCCLIII +MMXXXVIII +MDCCXVIIII +MDCCCCXXXVII +MMCCCXVI +MCMXXII +MMMCCCLVIII +MMMMDCCCXX +MCXXIII +MMMDLXI +MMMMDXXII +MDCCCX +MMDXCVIIII +MMMDCCCCVIII +MMMMDCCCCXXXXVI +MMDCCCXXXV +MMCXCIV +MCMLXXXXIII +MMMCCCLXXVI +MMMMDCLXXXV +CMLXIX +DCXCII +MMXXVIII +MMMMCCCXXX +XXXXVIIII \ No newline at end of file diff --git a/python-mega-algo/project_euler/problem_089/right.html b/python-mega-algo/project_euler/problem_089/right.html new file mode 100644 index 00000000..c9bebb49 --- /dev/null +++ b/python-mega-algo/project_euler/problem_089/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/project_euler/problem_089 + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    sol1.py __init__.py numeralcl...st.txt p089_roman.txt 
    + +

    +Folders: 1
    +Files: 4
    +Size of all files: 13357 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/project_euler/problem_089/sol1.py b/python-mega-algo/project_euler/problem_089/sol1.py new file mode 100644 index 00000000..11582aa4 --- /dev/null +++ b/python-mega-algo/project_euler/problem_089/sol1.py @@ -0,0 +1,141 @@ +""" +Project Euler Problem 89: https://projecteuler.net/problem=89 + +For a number written in Roman numerals to be considered valid there are basic rules +which must be followed. Even though the rules allow some numbers to be expressed in +more than one way there is always a "best" way of writing a particular number. + +For example, it would appear that there are at least six ways of writing the number +sixteen: + +IIIIIIIIIIIIIIII +VIIIIIIIIIII +VVIIIIII +XIIIIII +VVVI +XVI + +However, according to the rules only XIIIIII and XVI are valid, and the last example +is considered to be the most efficient, as it uses the least number of numerals. + +The 11K text file, roman.txt (right click and 'Save Link/Target As...'), contains one +thousand numbers written in valid, but not necessarily minimal, Roman numerals; see +About... Roman Numerals for the definitive rules for this problem. + +Find the number of characters saved by writing each of these in their minimal form. + +Note: You can assume that all the Roman numerals in the file contain no more than four +consecutive identical units. +""" + +import os + +SYMBOLS = {"I": 1, "V": 5, "X": 10, "L": 50, "C": 100, "D": 500, "M": 1000} + + +def parse_roman_numerals(numerals: str) -> int: + """ + Converts a string of roman numerals to an integer. + e.g. + >>> parse_roman_numerals("LXXXIX") + 89 + >>> parse_roman_numerals("IIII") + 4 + """ + + total_value = 0 + + index = 0 + while index < len(numerals) - 1: + current_value = SYMBOLS[numerals[index]] + next_value = SYMBOLS[numerals[index + 1]] + if current_value < next_value: + total_value -= current_value + else: + total_value += current_value + index += 1 + total_value += SYMBOLS[numerals[index]] + + return total_value + + +def generate_roman_numerals(num: int) -> str: + """ + Generates a string of roman numerals for a given integer. + e.g. + >>> generate_roman_numerals(89) + 'LXXXIX' + >>> generate_roman_numerals(4) + 'IV' + """ + + numerals = "" + + m_count = num // 1000 + numerals += m_count * "M" + num %= 1000 + + c_count = num // 100 + if c_count == 9: + numerals += "CM" + c_count -= 9 + elif c_count == 4: + numerals += "CD" + c_count -= 4 + if c_count >= 5: + numerals += "D" + c_count -= 5 + numerals += c_count * "C" + num %= 100 + + x_count = num // 10 + if x_count == 9: + numerals += "XC" + x_count -= 9 + elif x_count == 4: + numerals += "XL" + x_count -= 4 + if x_count >= 5: + numerals += "L" + x_count -= 5 + numerals += x_count * "X" + num %= 10 + + if num == 9: + numerals += "IX" + num -= 9 + elif num == 4: + numerals += "IV" + num -= 4 + if num >= 5: + numerals += "V" + num -= 5 + numerals += num * "I" + + return numerals + + +def solution(roman_numerals_filename: str = "/p089_roman.txt") -> int: + """ + Calculates and returns the answer to project euler problem 89. + + >>> solution("/numeralcleanup_test.txt") + 16 + """ + + savings = 0 + + file1 = open(os.path.dirname(__file__) + roman_numerals_filename, "r") + lines = file1.readlines() + for line in lines: + original = line.strip() + num = parse_roman_numerals(original) + shortened = generate_roman_numerals(num) + savings += len(original) - len(shortened) + + return savings + + +if __name__ == "__main__": + + print(f"{solution() = }") diff --git a/python-mega-algo/project_euler/problem_091/__init__.py b/python-mega-algo/project_euler/problem_091/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/project_euler/problem_091/right.html b/python-mega-algo/project_euler/problem_091/right.html new file mode 100644 index 00000000..d3a95d6a --- /dev/null +++ b/python-mega-algo/project_euler/problem_091/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/project_euler/problem_091 + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    sol1.py __init__.py 
    + +

    +Folders: 1
    +Files: 2
    +Size of all files: 1679 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/project_euler/problem_091/sol1.py b/python-mega-algo/project_euler/problem_091/sol1.py new file mode 100644 index 00000000..6c9aa3fa --- /dev/null +++ b/python-mega-algo/project_euler/problem_091/sol1.py @@ -0,0 +1,59 @@ +""" +Project Euler Problem 91: https://projecteuler.net/problem=91 + +The points P (x1, y1) and Q (x2, y2) are plotted at integer coordinates and +are joined to the origin, O(0,0), to form ΔOPQ. + +There are exactly fourteen triangles containing a right angle that can be formed +when each coordinate lies between 0 and 2 inclusive; that is, +0 ≤ x1, y1, x2, y2 ≤ 2. + +Given that 0 ≤ x1, y1, x2, y2 ≤ 50, how many right triangles can be formed? +""" + + +from itertools import combinations, product + + +def is_right(x1: int, y1: int, x2: int, y2: int) -> bool: + """ + Check if the triangle described by P(x1,y1), Q(x2,y2) and O(0,0) is right-angled. + Note: this doesn't check if P and Q are equal, but that's handled by the use of + itertools.combinations in the solution function. + + >>> is_right(0, 1, 2, 0) + True + >>> is_right(1, 0, 2, 2) + False + """ + if x1 == y1 == 0 or x2 == y2 == 0: + return False + a_square = x1 * x1 + y1 * y1 + b_square = x2 * x2 + y2 * y2 + c_square = (x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2) + return ( + a_square + b_square == c_square + or a_square + c_square == b_square + or b_square + c_square == a_square + ) + + +def solution(limit: int = 50) -> int: + """ + Return the number of right triangles OPQ that can be formed by two points P, Q + which have both x- and y- coordinates between 0 and limit inclusive. + + >>> solution(2) + 14 + >>> solution(10) + 448 + """ + return sum( + 1 + for pt1, pt2 in combinations(product(range(limit + 1), repeat=2), 2) + if is_right(*pt1, *pt2) + ) + + +if __name__ == "__main__": + print(f"{solution() = }") diff --git a/python-mega-algo/project_euler/problem_097/__init__.py b/python-mega-algo/project_euler/problem_097/__init__.py new file mode 100644 index 00000000..792d6005 --- /dev/null +++ b/python-mega-algo/project_euler/problem_097/__init__.py @@ -0,0 +1 @@ +# diff --git a/python-mega-algo/project_euler/problem_097/right.html b/python-mega-algo/project_euler/problem_097/right.html new file mode 100644 index 00000000..881af5ad --- /dev/null +++ b/python-mega-algo/project_euler/problem_097/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/project_euler/problem_097 + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    sol1.py __init__.py 
    + +

    +Folders: 1
    +Files: 2
    +Size of all files: 1302 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/project_euler/problem_097/sol1.py b/python-mega-algo/project_euler/problem_097/sol1.py new file mode 100644 index 00000000..2007ef58 --- /dev/null +++ b/python-mega-algo/project_euler/problem_097/sol1.py @@ -0,0 +1,46 @@ +""" +The first known prime found to exceed one million digits was discovered in 1999, +and is a Mersenne prime of the form 2**6972593 − 1; it contains exactly 2,098,960 +digits. Subsequently other Mersenne primes, of the form 2**p − 1, have been found +which contain more digits. +However, in 2004 there was found a massive non-Mersenne prime which contains +2,357,207 digits: (28433 * (2 ** 7830457 + 1)). + +Find the last ten digits of this prime number. +""" + + +def solution(n: int = 10) -> str: + """ + Returns the last n digits of NUMBER. + >>> solution() + '8739992577' + >>> solution(8) + '39992577' + >>> solution(1) + '7' + >>> solution(-1) + Traceback (most recent call last): + ... + ValueError: Invalid input + >>> solution(8.3) + Traceback (most recent call last): + ... + ValueError: Invalid input + >>> solution("a") + Traceback (most recent call last): + ... + ValueError: Invalid input + """ + if not isinstance(n, int) or n < 0: + raise ValueError("Invalid input") + MODULUS = 10 ** n + NUMBER = 28433 * (pow(2, 7830457, MODULUS)) + 1 + return str(NUMBER % MODULUS) + + +if __name__ == "__main__": + from doctest import testmod + + testmod() + print(f"{solution(10) = }") diff --git a/python-mega-algo/project_euler/problem_099/__init__.py b/python-mega-algo/project_euler/problem_099/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/project_euler/problem_099/base_exp.txt b/python-mega-algo/project_euler/problem_099/base_exp.txt new file mode 100644 index 00000000..e4b2d015 --- /dev/null +++ b/python-mega-algo/project_euler/problem_099/base_exp.txt @@ -0,0 +1,1000 @@ +519432,525806 +632382,518061 +78864,613712 +466580,530130 +780495,510032 +525895,525320 +15991,714883 +960290,502358 +760018,511029 +166800,575487 +210884,564478 +555151,523163 +681146,515199 +563395,522587 +738250,512126 +923525,503780 +595148,520429 +177108,572629 +750923,511482 +440902,532446 +881418,505504 +422489,534197 +979858,501616 +685893,514935 +747477,511661 +167214,575367 +234140,559696 +940238,503122 +728969,512609 +232083,560102 +900971,504694 +688801,514772 +189664,569402 +891022,505104 +445689,531996 +119570,591871 +821453,508118 +371084,539600 +911745,504251 +623655,518600 +144361,582486 +352442,541775 +420726,534367 +295298,549387 +6530,787777 +468397,529976 +672336,515696 +431861,533289 +84228,610150 +805376,508857 +444409,532117 +33833,663511 +381850,538396 +402931,536157 +92901,604930 +304825,548004 +731917,512452 +753734,511344 +51894,637373 +151578,580103 +295075,549421 +303590,548183 +333594,544123 +683952,515042 +60090,628880 +951420,502692 +28335,674991 +714940,513349 +343858,542826 +549279,523586 +804571,508887 +260653,554881 +291399,549966 +402342,536213 +408889,535550 +40328,652524 +375856,539061 +768907,510590 +165993,575715 +976327,501755 +898500,504795 +360404,540830 +478714,529095 +694144,514472 +488726,528258 +841380,507226 +328012,544839 +22389,690868 +604053,519852 +329514,544641 +772965,510390 +492798,527927 +30125,670983 +895603,504906 +450785,531539 +840237,507276 +380711,538522 +63577,625673 +76801,615157 +502694,527123 +597706,520257 +310484,547206 +944468,502959 +121283,591152 +451131,531507 +566499,522367 +425373,533918 +40240,652665 +39130,654392 +714926,513355 +469219,529903 +806929,508783 +287970,550487 +92189,605332 +103841,599094 +671839,515725 +452048,531421 +987837,501323 +935192,503321 +88585,607450 +613883,519216 +144551,582413 +647359,517155 +213902,563816 +184120,570789 +258126,555322 +502546,527130 +407655,535678 +401528,536306 +477490,529193 +841085,507237 +732831,512408 +833000,507595 +904694,504542 +581435,521348 +455545,531110 +873558,505829 +94916,603796 +720176,513068 +545034,523891 +246348,557409 +556452,523079 +832015,507634 +173663,573564 +502634,527125 +250732,556611 +569786,522139 +216919,563178 +521815,525623 +92304,605270 +164446,576167 +753413,511364 +11410,740712 +448845,531712 +925072,503725 +564888,522477 +7062,780812 +641155,517535 +738878,512100 +636204,517828 +372540,539436 +443162,532237 +571192,522042 +655350,516680 +299741,548735 +581914,521307 +965471,502156 +513441,526277 +808682,508700 +237589,559034 +543300,524025 +804712,508889 +247511,557192 +543486,524008 +504383,526992 +326529,545039 +792493,509458 +86033,609017 +126554,589005 +579379,521481 +948026,502823 +404777,535969 +265767,554022 +266876,553840 +46631,643714 +492397,527958 +856106,506581 +795757,509305 +748946,511584 +294694,549480 +409781,535463 +775887,510253 +543747,523991 +210592,564536 +517119,525990 +520253,525751 +247926,557124 +592141,520626 +346580,542492 +544969,523902 +506501,526817 +244520,557738 +144745,582349 +69274,620858 +292620,549784 +926027,503687 +736320,512225 +515528,526113 +407549,535688 +848089,506927 +24141,685711 +9224,757964 +980684,501586 +175259,573121 +489160,528216 +878970,505604 +969546,502002 +525207,525365 +690461,514675 +156510,578551 +659778,516426 +468739,529945 +765252,510770 +76703,615230 +165151,575959 +29779,671736 +928865,503569 +577538,521605 +927555,503618 +185377,570477 +974756,501809 +800130,509093 +217016,563153 +365709,540216 +774508,510320 +588716,520851 +631673,518104 +954076,502590 +777828,510161 +990659,501222 +597799,520254 +786905,509727 +512547,526348 +756449,511212 +869787,505988 +653747,516779 +84623,609900 +839698,507295 +30159,670909 +797275,509234 +678136,515373 +897144,504851 +989554,501263 +413292,535106 +55297,633667 +788650,509637 +486748,528417 +150724,580377 +56434,632490 +77207,614869 +588631,520859 +611619,519367 +100006,601055 +528924,525093 +190225,569257 +851155,506789 +682593,515114 +613043,519275 +514673,526183 +877634,505655 +878905,505602 +1926,914951 +613245,519259 +152481,579816 +841774,507203 +71060,619442 +865335,506175 +90244,606469 +302156,548388 +399059,536557 +478465,529113 +558601,522925 +69132,620966 +267663,553700 +988276,501310 +378354,538787 +529909,525014 +161733,576968 +758541,511109 +823425,508024 +149821,580667 +269258,553438 +481152,528891 +120871,591322 +972322,501901 +981350,501567 +676129,515483 +950860,502717 +119000,592114 +392252,537272 +191618,568919 +946699,502874 +289555,550247 +799322,509139 +703886,513942 +194812,568143 +261823,554685 +203052,566221 +217330,563093 +734748,512313 +391759,537328 +807052,508777 +564467,522510 +59186,629748 +113447,594545 +518063,525916 +905944,504492 +613922,519213 +439093,532607 +445946,531981 +230530,560399 +297887,549007 +459029,530797 +403692,536075 +855118,506616 +963127,502245 +841711,507208 +407411,535699 +924729,503735 +914823,504132 +333725,544101 +176345,572832 +912507,504225 +411273,535308 +259774,555036 +632853,518038 +119723,591801 +163902,576321 +22691,689944 +402427,536212 +175769,572988 +837260,507402 +603432,519893 +313679,546767 +538165,524394 +549026,523608 +61083,627945 +898345,504798 +992556,501153 +369999,539727 +32847,665404 +891292,505088 +152715,579732 +824104,507997 +234057,559711 +730507,512532 +960529,502340 +388395,537687 +958170,502437 +57105,631806 +186025,570311 +993043,501133 +576770,521664 +215319,563513 +927342,503628 +521353,525666 +39563,653705 +752516,511408 +110755,595770 +309749,547305 +374379,539224 +919184,503952 +990652,501226 +647780,517135 +187177,570017 +168938,574877 +649558,517023 +278126,552016 +162039,576868 +658512,516499 +498115,527486 +896583,504868 +561170,522740 +747772,511647 +775093,510294 +652081,516882 +724905,512824 +499707,527365 +47388,642755 +646668,517204 +571700,522007 +180430,571747 +710015,513617 +435522,532941 +98137,602041 +759176,511070 +486124,528467 +526942,525236 +878921,505604 +408313,535602 +926980,503640 +882353,505459 +566887,522345 +3326,853312 +911981,504248 +416309,534800 +392991,537199 +622829,518651 +148647,581055 +496483,527624 +666314,516044 +48562,641293 +672618,515684 +443676,532187 +274065,552661 +265386,554079 +347668,542358 +31816,667448 +181575,571446 +961289,502320 +365689,540214 +987950,501317 +932299,503440 +27388,677243 +746701,511701 +492258,527969 +147823,581323 +57918,630985 +838849,507333 +678038,515375 +27852,676130 +850241,506828 +818403,508253 +131717,587014 +850216,506834 +904848,504529 +189758,569380 +392845,537217 +470876,529761 +925353,503711 +285431,550877 +454098,531234 +823910,508003 +318493,546112 +766067,510730 +261277,554775 +421530,534289 +694130,514478 +120439,591498 +213308,563949 +854063,506662 +365255,540263 +165437,575872 +662240,516281 +289970,550181 +847977,506933 +546083,523816 +413252,535113 +975829,501767 +361540,540701 +235522,559435 +224643,561577 +736350,512229 +328303,544808 +35022,661330 +307838,547578 +474366,529458 +873755,505819 +73978,617220 +827387,507845 +670830,515791 +326511,545034 +309909,547285 +400970,536363 +884827,505352 +718307,513175 +28462,674699 +599384,520150 +253565,556111 +284009,551093 +343403,542876 +446557,531921 +992372,501160 +961601,502308 +696629,514342 +919537,503945 +894709,504944 +892201,505051 +358160,541097 +448503,531745 +832156,507636 +920045,503924 +926137,503675 +416754,534757 +254422,555966 +92498,605151 +826833,507873 +660716,516371 +689335,514746 +160045,577467 +814642,508425 +969939,501993 +242856,558047 +76302,615517 +472083,529653 +587101,520964 +99066,601543 +498005,527503 +709800,513624 +708000,513716 +20171,698134 +285020,550936 +266564,553891 +981563,501557 +846502,506991 +334,1190800 +209268,564829 +9844,752610 +996519,501007 +410059,535426 +432931,533188 +848012,506929 +966803,502110 +983434,501486 +160700,577267 +504374,526989 +832061,507640 +392825,537214 +443842,532165 +440352,532492 +745125,511776 +13718,726392 +661753,516312 +70500,619875 +436952,532814 +424724,533973 +21954,692224 +262490,554567 +716622,513264 +907584,504425 +60086,628882 +837123,507412 +971345,501940 +947162,502855 +139920,584021 +68330,621624 +666452,516038 +731446,512481 +953350,502619 +183157,571042 +845400,507045 +651548,516910 +20399,697344 +861779,506331 +629771,518229 +801706,509026 +189207,569512 +737501,512168 +719272,513115 +479285,529045 +136046,585401 +896746,504860 +891735,505067 +684771,514999 +865309,506184 +379066,538702 +503117,527090 +621780,518717 +209518,564775 +677135,515423 +987500,501340 +197049,567613 +329315,544673 +236756,559196 +357092,541226 +520440,525733 +213471,563911 +956852,502490 +702223,514032 +404943,535955 +178880,572152 +689477,514734 +691351,514630 +866669,506128 +370561,539656 +739805,512051 +71060,619441 +624861,518534 +261660,554714 +366137,540160 +166054,575698 +601878,519990 +153445,579501 +279899,551729 +379166,538691 +423209,534125 +675310,515526 +145641,582050 +691353,514627 +917468,504026 +284778,550976 +81040,612235 +161699,576978 +616394,519057 +767490,510661 +156896,578431 +427408,533714 +254849,555884 +737217,512182 +897133,504851 +203815,566051 +270822,553189 +135854,585475 +778805,510111 +784373,509847 +305426,547921 +733418,512375 +732087,512448 +540668,524215 +702898,513996 +628057,518328 +640280,517587 +422405,534204 +10604,746569 +746038,511733 +839808,507293 +457417,530938 +479030,529064 +341758,543090 +620223,518824 +251661,556451 +561790,522696 +497733,527521 +724201,512863 +489217,528217 +415623,534867 +624610,518548 +847541,506953 +432295,533249 +400391,536421 +961158,502319 +139173,584284 +421225,534315 +579083,521501 +74274,617000 +701142,514087 +374465,539219 +217814,562985 +358972,540995 +88629,607424 +288597,550389 +285819,550812 +538400,524385 +809930,508645 +738326,512126 +955461,502535 +163829,576343 +826475,507891 +376488,538987 +102234,599905 +114650,594002 +52815,636341 +434037,533082 +804744,508880 +98385,601905 +856620,506559 +220057,562517 +844734,507078 +150677,580387 +558697,522917 +621751,518719 +207067,565321 +135297,585677 +932968,503404 +604456,519822 +579728,521462 +244138,557813 +706487,513800 +711627,513523 +853833,506674 +497220,527562 +59428,629511 +564845,522486 +623621,518603 +242689,558077 +125091,589591 +363819,540432 +686453,514901 +656813,516594 +489901,528155 +386380,537905 +542819,524052 +243987,557841 +693412,514514 +488484,528271 +896331,504881 +336730,543721 +728298,512647 +604215,519840 +153729,579413 +595687,520398 +540360,524240 +245779,557511 +924873,503730 +509628,526577 +528523,525122 +3509,847707 +522756,525555 +895447,504922 +44840,646067 +45860,644715 +463487,530404 +398164,536654 +894483,504959 +619415,518874 +966306,502129 +990922,501212 +835756,507474 +548881,523618 +453578,531282 +474993,529410 +80085,612879 +737091,512193 +50789,638638 +979768,501620 +792018,509483 +665001,516122 +86552,608694 +462772,530469 +589233,520821 +891694,505072 +592605,520594 +209645,564741 +42531,649269 +554376,523226 +803814,508929 +334157,544042 +175836,572970 +868379,506051 +658166,516520 +278203,551995 +966198,502126 +627162,518387 +296774,549165 +311803,547027 +843797,507118 +702304,514032 +563875,522553 +33103,664910 +191932,568841 +543514,524006 +506835,526794 +868368,506052 +847025,506971 +678623,515342 +876139,505726 +571997,521984 +598632,520198 +213590,563892 +625404,518497 +726508,512738 +689426,514738 +332495,544264 +411366,535302 +242546,558110 +315209,546555 +797544,509219 +93889,604371 +858879,506454 +124906,589666 +449072,531693 +235960,559345 +642403,517454 +720567,513047 +705534,513858 +603692,519870 +488137,528302 +157370,578285 +63515,625730 +666326,516041 +619226,518883 +443613,532186 +597717,520257 +96225,603069 +86940,608450 +40725,651929 +460976,530625 +268875,553508 +270671,553214 +363254,540500 +384248,538137 +762889,510892 +377941,538833 +278878,551890 +176615,572755 +860008,506412 +944392,502967 +608395,519571 +225283,561450 +45095,645728 +333798,544090 +625733,518476 +995584,501037 +506135,526853 +238050,558952 +557943,522972 +530978,524938 +634244,517949 +177168,572616 +85200,609541 +953043,502630 +523661,525484 +999295,500902 +840803,507246 +961490,502312 +471747,529685 +380705,538523 +911180,504275 +334149,544046 +478992,529065 +325789,545133 +335884,543826 +426976,533760 +749007,511582 +667067,516000 +607586,519623 +674054,515599 +188534,569675 +565185,522464 +172090,573988 +87592,608052 +907432,504424 +8912,760841 +928318,503590 +757917,511138 +718693,513153 +315141,546566 +728326,512645 +353492,541647 +638429,517695 +628892,518280 +877286,505672 +620895,518778 +385878,537959 +423311,534113 +633501,517997 +884833,505360 +883402,505416 +999665,500894 +708395,513697 +548142,523667 +756491,511205 +987352,501340 +766520,510705 +591775,520647 +833758,507563 +843890,507108 +925551,503698 +74816,616598 +646942,517187 +354923,541481 +256291,555638 +634470,517942 +930904,503494 +134221,586071 +282663,551304 +986070,501394 +123636,590176 +123678,590164 +481717,528841 +423076,534137 +866246,506145 +93313,604697 +783632,509880 +317066,546304 +502977,527103 +141272,583545 +71708,618938 +617748,518975 +581190,521362 +193824,568382 +682368,515131 +352956,541712 +351375,541905 +505362,526909 +905165,504518 +128645,588188 +267143,553787 +158409,577965 +482776,528754 +628896,518282 +485233,528547 +563606,522574 +111001,595655 +115920,593445 +365510,540237 +959724,502374 +938763,503184 +930044,503520 +970959,501956 +913658,504176 +68117,621790 +989729,501253 +567697,522288 +820427,508163 +54236,634794 +291557,549938 +124961,589646 +403177,536130 +405421,535899 +410233,535417 +815111,508403 +213176,563974 +83099,610879 +998588,500934 +513640,526263 +129817,587733 +1820,921851 +287584,550539 +299160,548820 +860621,506386 +529258,525059 +586297,521017 +953406,502616 +441234,532410 +986217,501386 +781938,509957 +461247,530595 +735424,512277 +146623,581722 +839838,507288 +510667,526494 +935085,503327 +737523,512167 +303455,548204 +992779,501145 +60240,628739 +939095,503174 +794368,509370 +501825,527189 +459028,530798 +884641,505363 +512287,526364 +835165,507499 +307723,547590 +160587,577304 +735043,512300 +493289,527887 +110717,595785 +306480,547772 +318593,546089 +179810,571911 +200531,566799 +314999,546580 +197020,567622 +301465,548487 +237808,559000 +131944,586923 +882527,505449 +468117,530003 +711319,513541 +156240,578628 +965452,502162 +992756,501148 +437959,532715 +739938,512046 +614249,519196 +391496,537356 +62746,626418 +688215,514806 +75501,616091 +883573,505412 +558824,522910 +759371,511061 +173913,573489 +891351,505089 +727464,512693 +164833,576051 +812317,508529 +540320,524243 +698061,514257 +69149,620952 +471673,529694 +159092,577753 +428134,533653 +89997,606608 +711061,513557 +779403,510081 +203327,566155 +798176,509187 +667688,515963 +636120,517833 +137410,584913 +217615,563034 +556887,523038 +667229,515991 +672276,515708 +325361,545187 +172115,573985 +13846,725685 diff --git a/python-mega-algo/project_euler/problem_099/right.html b/python-mega-algo/project_euler/problem_099/right.html new file mode 100644 index 00000000..4e3b6fb4 --- /dev/null +++ b/python-mega-algo/project_euler/problem_099/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/project_euler/problem_099 + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    sol1.py __init__.py base_exp.txt 
    + +

    +Folders: 1
    +Files: 3
    +Size of all files: 14885 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/project_euler/problem_099/sol1.py b/python-mega-algo/project_euler/problem_099/sol1.py new file mode 100644 index 00000000..88912e1f --- /dev/null +++ b/python-mega-algo/project_euler/problem_099/sol1.py @@ -0,0 +1,34 @@ +""" +Problem: + +Comparing two numbers written in index form like 2'11 and 3'7 is not difficult, as any +calculator would confirm that 2^11 = 2048 < 3^7 = 2187. + +However, confirming that 632382^518061 > 519432^525806 would be much more difficult, as +both numbers contain over three million digits. + +Using base_exp.txt, a 22K text file containing one thousand lines with a base/exponent +pair on each line, determine which line number has the greatest numerical value. + +NOTE: The first two lines in the file represent the numbers in the example given above. +""" + +import os +from math import log10 + + +def solution(data_file: str = "base_exp.txt") -> int: + """ + >>> solution() + 709 + """ + largest = [0, 0] + for i, line in enumerate(open(os.path.join(os.path.dirname(__file__), data_file))): + a, x = list(map(int, line.split(","))) + if x * log10(a) > largest[0]: + largest = [x * log10(a), i + 1] + return largest[1] + + +if __name__ == "__main__": + print(solution()) diff --git a/python-mega-algo/project_euler/problem_101/__init__.py b/python-mega-algo/project_euler/problem_101/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/project_euler/problem_101/right.html b/python-mega-algo/project_euler/problem_101/right.html new file mode 100644 index 00000000..d21997ab --- /dev/null +++ b/python-mega-algo/project_euler/problem_101/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/project_euler/problem_101 + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    sol1.py __init__.py 
    + +

    +Folders: 1
    +Files: 2
    +Size of all files: 6432 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/project_euler/problem_101/sol1.py b/python-mega-algo/project_euler/problem_101/sol1.py new file mode 100644 index 00000000..e6631609 --- /dev/null +++ b/python-mega-algo/project_euler/problem_101/sol1.py @@ -0,0 +1,219 @@ +""" +If we are presented with the first k terms of a sequence it is impossible to say with +certainty the value of the next term, as there are infinitely many polynomial functions +that can model the sequence. + +As an example, let us consider the sequence of cube +numbers. This is defined by the generating function, +u(n) = n3: 1, 8, 27, 64, 125, 216, ... + +Suppose we were only given the first two terms of this sequence. Working on the +principle that "simple is best" we should assume a linear relationship and predict the +next term to be 15 (common difference 7). Even if we were presented with the first three +terms, by the same principle of simplicity, a quadratic relationship should be +assumed. + +We shall define OP(k, n) to be the nth term of the optimum polynomial +generating function for the first k terms of a sequence. It should be clear that +OP(k, n) will accurately generate the terms of the sequence for n ≤ k, and potentially +the first incorrect term (FIT) will be OP(k, k+1); in which case we shall call it a +bad OP (BOP). + +As a basis, if we were only given the first term of sequence, it would be most +sensible to assume constancy; that is, for n ≥ 2, OP(1, n) = u(1). + +Hence we obtain the +following OPs for the cubic sequence: + +OP(1, n) = 1 1, 1, 1, 1, ... +OP(2, n) = 7n-6 1, 8, 15, ... +OP(3, n) = 6n^2-11n+6 1, 8, 27, 58, ... +OP(4, n) = n^3 1, 8, 27, 64, 125, ... + +Clearly no BOPs exist for k ≥ 4. + +By considering the sum of FITs generated by the BOPs (indicated in red above), we +obtain 1 + 15 + 58 = 74. + +Consider the following tenth degree polynomial generating function: + +1 - n + n^2 - n^3 + n^4 - n^5 + n^6 - n^7 + n^8 - n^9 + n^10 + +Find the sum of FITs for the BOPs. +""" + + +from typing import Callable, List, Union + +Matrix = List[List[Union[float, int]]] + + +def solve(matrix: Matrix, vector: Matrix) -> Matrix: + """ + Solve the linear system of equations Ax = b (A = "matrix", b = "vector") + for x using Gaussian elimination and back substitution. We assume that A + is an invertible square matrix and that b is a column vector of the + same height. + >>> solve([[1, 0], [0, 1]], [[1],[2]]) + [[1.0], [2.0]] + >>> solve([[2, 1, -1],[-3, -1, 2],[-2, 1, 2]],[[8], [-11],[-3]]) + [[2.0], [3.0], [-1.0]] + """ + size: int = len(matrix) + augmented: Matrix = [[0 for _ in range(size + 1)] for _ in range(size)] + row: int + row2: int + col: int + col2: int + pivot_row: int + ratio: float + + for row in range(size): + for col in range(size): + augmented[row][col] = matrix[row][col] + + augmented[row][size] = vector[row][0] + + row = 0 + col = 0 + while row < size and col < size: + # pivoting + pivot_row = max( + [(abs(augmented[row2][col]), row2) for row2 in range(col, size)] + )[1] + if augmented[pivot_row][col] == 0: + col += 1 + continue + else: + augmented[row], augmented[pivot_row] = augmented[pivot_row], augmented[row] + + for row2 in range(row + 1, size): + ratio = augmented[row2][col] / augmented[row][col] + augmented[row2][col] = 0 + for col2 in range(col + 1, size + 1): + augmented[row2][col2] -= augmented[row][col2] * ratio + + row += 1 + col += 1 + + # back substitution + for col in range(1, size): + for row in range(col): + ratio = augmented[row][col] / augmented[col][col] + for col2 in range(col, size + 1): + augmented[row][col2] -= augmented[col][col2] * ratio + + # round to get rid of numbers like 2.000000000000004 + return [ + [round(augmented[row][size] / augmented[row][row], 10)] for row in range(size) + ] + + +def interpolate(y_list: List[int]) -> Callable[[int], int]: + """ + Given a list of data points (1,y0),(2,y1), ..., return a function that + interpolates the data points. We find the coefficients of the interpolating + polynomial by solving a system of linear equations corresponding to + x = 1, 2, 3... + + >>> interpolate([1])(3) + 1 + >>> interpolate([1, 8])(3) + 15 + >>> interpolate([1, 8, 27])(4) + 58 + >>> interpolate([1, 8, 27, 64])(6) + 216 + """ + + size: int = len(y_list) + matrix: Matrix = [[0 for _ in range(size)] for _ in range(size)] + vector: Matrix = [[0] for _ in range(size)] + coeffs: Matrix + x_val: int + y_val: int + col: int + + for x_val, y_val in enumerate(y_list): + for col in range(size): + matrix[x_val][col] = (x_val + 1) ** (size - col - 1) + vector[x_val][0] = y_val + + coeffs = solve(matrix, vector) + + def interpolated_func(var: int) -> int: + """ + >>> interpolate([1])(3) + 1 + >>> interpolate([1, 8])(3) + 15 + >>> interpolate([1, 8, 27])(4) + 58 + >>> interpolate([1, 8, 27, 64])(6) + 216 + """ + return sum( + round(coeffs[x_val][0]) * (var ** (size - x_val - 1)) + for x_val in range(size) + ) + + return interpolated_func + + +def question_function(variable: int) -> int: + """ + The generating function u as specified in the question. + >>> question_function(0) + 1 + >>> question_function(1) + 1 + >>> question_function(5) + 8138021 + >>> question_function(10) + 9090909091 + """ + return ( + 1 + - variable + + variable ** 2 + - variable ** 3 + + variable ** 4 + - variable ** 5 + + variable ** 6 + - variable ** 7 + + variable ** 8 + - variable ** 9 + + variable ** 10 + ) + + +def solution(func: Callable[[int], int] = question_function, order: int = 10) -> int: + """ + Find the sum of the FITs of the BOPS. For each interpolating polynomial of order + 1, 2, ... , 10, find the first x such that the value of the polynomial at x does + not equal u(x). + >>> solution(lambda n: n ** 3, 3) + 74 + """ + data_points: List[int] = [func(x_val) for x_val in range(1, order + 1)] + + polynomials: List[Callable[[int], int]] = [ + interpolate(data_points[:max_coeff]) for max_coeff in range(1, order + 1) + ] + + ret: int = 0 + poly: int + x_val: int + + for poly in polynomials: + x_val = 1 + while func(x_val) == poly(x_val): + x_val += 1 + + ret += poly(x_val) + + return ret + + +if __name__ == "__main__": + print(f"{solution() = }") diff --git a/python-mega-algo/project_euler/problem_102/__init__.py b/python-mega-algo/project_euler/problem_102/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/project_euler/problem_102/p102_triangles.txt b/python-mega-algo/project_euler/problem_102/p102_triangles.txt new file mode 100644 index 00000000..3f01a1ac --- /dev/null +++ b/python-mega-algo/project_euler/problem_102/p102_triangles.txt @@ -0,0 +1,1000 @@ +-340,495,-153,-910,835,-947 +-175,41,-421,-714,574,-645 +-547,712,-352,579,951,-786 +419,-864,-83,650,-399,171 +-429,-89,-357,-930,296,-29 +-734,-702,823,-745,-684,-62 +-971,762,925,-776,-663,-157 +162,570,628,485,-807,-896 +641,91,-65,700,887,759 +215,-496,46,-931,422,-30 +-119,359,668,-609,-358,-494 +440,929,968,214,760,-857 +-700,785,838,29,-216,411 +-770,-458,-325,-53,-505,633 +-752,-805,349,776,-799,687 +323,5,561,-36,919,-560 +-907,358,264,320,204,274 +-728,-466,350,969,292,-345 +940,836,272,-533,748,185 +411,998,813,520,316,-949 +-152,326,658,-762,148,-651 +330,507,-9,-628,101,174 +551,-496,772,-541,-702,-45 +-164,-489,-90,322,631,-59 +673,366,-4,-143,-606,-704 +428,-609,801,-449,740,-269 +453,-924,-785,-346,-853,111 +-738,555,-181,467,-426,-20 +958,-692,784,-343,505,-569 +620,27,263,54,-439,-726 +804,87,998,859,871,-78 +-119,-453,-709,-292,-115,-56 +-626,138,-940,-476,-177,-274 +-11,160,142,588,446,158 +538,727,550,787,330,810 +420,-689,854,-546,337,516 +872,-998,-607,748,473,-192 +653,440,-516,-985,808,-857 +374,-158,331,-940,-338,-641 +137,-925,-179,771,734,-715 +-314,198,-115,29,-641,-39 +759,-574,-385,355,590,-603 +-189,-63,-168,204,289,305 +-182,-524,-715,-621,911,-255 +331,-816,-833,471,168,126 +-514,581,-855,-220,-731,-507 +129,169,576,651,-87,-458 +783,-444,-881,658,-266,298 +603,-430,-598,585,368,899 +43,-724,962,-376,851,409 +-610,-646,-883,-261,-482,-881 +-117,-237,978,641,101,-747 +579,125,-715,-712,208,534 +672,-214,-762,372,874,533 +-564,965,38,715,367,242 +500,951,-700,-981,-61,-178 +-382,-224,-959,903,-282,-60 +-355,295,426,-331,-591,655 +892,128,958,-271,-993,274 +-454,-619,302,138,-790,-874 +-642,601,-574,159,-290,-318 +266,-109,257,-686,54,975 +162,628,-478,840,264,-266 +466,-280,982,1,904,-810 +721,839,730,-807,777,981 +-129,-430,748,263,943,96 +434,-94,410,-990,249,-704 +237,42,122,-732,44,-51 +909,-116,-229,545,292,717 +824,-768,-807,-370,-262,30 +675,58,332,-890,-651,791 +363,825,-717,254,684,240 +405,-715,900,166,-589,422 +-476,686,-830,-319,634,-807 +633,837,-971,917,-764,207 +-116,-44,-193,-70,908,809 +-26,-252,998,408,70,-713 +-601,645,-462,842,-644,-591 +-160,653,274,113,-138,687 +369,-273,-181,925,-167,-693 +-338,135,480,-967,-13,-840 +-90,-270,-564,695,161,907 +607,-430,869,-713,461,-469 +919,-165,-776,522,606,-708 +-203,465,288,207,-339,-458 +-453,-534,-715,975,838,-677 +-973,310,-350,934,546,-805 +-835,385,708,-337,-594,-772 +-14,914,900,-495,-627,594 +833,-713,-213,578,-296,699 +-27,-748,484,455,915,291 +270,889,739,-57,442,-516 +119,811,-679,905,184,130 +-678,-469,925,553,612,482 +101,-571,-732,-842,644,588 +-71,-737,566,616,957,-663 +-634,-356,90,-207,936,622 +598,443,964,-895,-58,529 +847,-467,929,-742,91,10 +-633,829,-780,-408,222,-30 +-818,57,275,-38,-746,198 +-722,-825,-549,597,-391,99 +-570,908,430,873,-103,-360 +342,-681,512,434,542,-528 +297,850,479,609,543,-357 +9,784,212,548,56,859 +-152,560,-240,-969,-18,713 +140,-133,34,-635,250,-163 +-272,-22,-169,-662,989,-604 +471,-765,355,633,-742,-118 +-118,146,942,663,547,-376 +583,16,162,264,715,-33 +-230,-446,997,-838,561,555 +372,397,-729,-318,-276,649 +92,982,-970,-390,-922,922 +-981,713,-951,-337,-669,670 +-999,846,-831,-504,7,-128 +455,-954,-370,682,-510,45 +822,-960,-892,-385,-662,314 +-668,-686,-367,-246,530,-341 +-723,-720,-926,-836,-142,757 +-509,-134,384,-221,-873,-639 +-803,-52,-706,-669,373,-339 +933,578,631,-616,770,555 +741,-564,-33,-605,-576,275 +-715,445,-233,-730,734,-704 +120,-10,-266,-685,-490,-17 +-232,-326,-457,-946,-457,-116 +811,52,639,826,-200,147 +-329,279,293,612,943,955 +-721,-894,-393,-969,-642,453 +-688,-826,-352,-75,371,79 +-809,-979,407,497,858,-248 +-485,-232,-242,-582,-81,849 +141,-106,123,-152,806,-596 +-428,57,-992,811,-192,478 +864,393,122,858,255,-876 +-284,-780,240,457,354,-107 +956,605,-477,44,26,-678 +86,710,-533,-815,439,327 +-906,-626,-834,763,426,-48 +201,-150,-904,652,475,412 +-247,149,81,-199,-531,-148 +923,-76,-353,175,-121,-223 +427,-674,453,472,-410,585 +931,776,-33,85,-962,-865 +-655,-908,-902,208,869,792 +-316,-102,-45,-436,-222,885 +-309,768,-574,653,745,-975 +896,27,-226,993,332,198 +323,655,-89,260,240,-902 +501,-763,-424,793,813,616 +993,375,-938,-621,672,-70 +-880,-466,-283,770,-824,143 +63,-283,886,-142,879,-116 +-964,-50,-521,-42,-306,-161 +724,-22,866,-871,933,-383 +-344,135,282,966,-80,917 +-281,-189,420,810,362,-582 +-515,455,-588,814,162,332 +555,-436,-123,-210,869,-943 +589,577,232,286,-554,876 +-773,127,-58,-171,-452,125 +-428,575,906,-232,-10,-224 +437,276,-335,-348,605,878 +-964,511,-386,-407,168,-220 +307,513,912,-463,-423,-416 +-445,539,273,886,-18,760 +-396,-585,-670,414,47,364 +143,-506,754,906,-971,-203 +-544,472,-180,-541,869,-465 +-779,-15,-396,890,972,-220 +-430,-564,503,182,-119,456 +89,-10,-739,399,506,499 +954,162,-810,-973,127,870 +890,952,-225,158,828,237 +-868,952,349,465,574,750 +-915,369,-975,-596,-395,-134 +-135,-601,575,582,-667,640 +413,890,-560,-276,-555,-562 +-633,-269,561,-820,-624,499 +371,-92,-784,-593,864,-717 +-971,655,-439,367,754,-951 +172,-347,36,279,-247,-402 +633,-301,364,-349,-683,-387 +-780,-211,-713,-948,-648,543 +72,58,762,-465,-66,462 +78,502,781,-832,713,836 +-431,-64,-484,-392,208,-343 +-64,101,-29,-860,-329,844 +398,391,828,-858,700,395 +578,-896,-326,-604,314,180 +97,-321,-695,185,-357,852 +854,839,283,-375,951,-209 +194,96,-564,-847,162,524 +-354,532,494,621,580,560 +419,-678,-450,926,-5,-924 +-661,905,519,621,-143,394 +-573,268,296,-562,-291,-319 +-211,266,-196,158,564,-183 +18,-585,-398,777,-581,864 +790,-894,-745,-604,-418,70 +848,-339,150,773,11,851 +-954,-809,-53,-20,-648,-304 +658,-336,-658,-905,853,407 +-365,-844,350,-625,852,-358 +986,-315,-230,-159,21,180 +-15,599,45,-286,-941,847 +-613,-68,184,639,-987,550 +334,675,-56,-861,923,340 +-848,-596,960,231,-28,-34 +707,-811,-994,-356,-167,-171 +-470,-764,72,576,-600,-204 +379,189,-542,-576,585,800 +440,540,-445,-563,379,-334 +-155,64,514,-288,853,106 +-304,751,481,-520,-708,-694 +-709,132,594,126,-844,63 +723,471,421,-138,-962,892 +-440,-263,39,513,-672,-954 +775,809,-581,330,752,-107 +-376,-158,335,-708,-514,578 +-343,-769,456,-187,25,413 +548,-877,-172,300,-500,928 +938,-102,423,-488,-378,-969 +-36,564,-55,131,958,-800 +-322,511,-413,503,700,-847 +-966,547,-88,-17,-359,-67 +637,-341,-437,-181,527,-153 +-74,449,-28,3,485,189 +-997,658,-224,-948,702,-807 +-224,736,-896,127,-945,-850 +-395,-106,439,-553,-128,124 +-841,-445,-758,-572,-489,212 +633,-327,13,-512,952,771 +-940,-171,-6,-46,-923,-425 +-142,-442,-817,-998,843,-695 +340,847,-137,-920,-988,-658 +-653,217,-679,-257,651,-719 +-294,365,-41,342,74,-892 +690,-236,-541,494,408,-516 +180,-807,225,790,494,59 +707,605,-246,656,284,271 +65,294,152,824,442,-442 +-321,781,-540,341,316,415 +420,371,-2,545,995,248 +56,-191,-604,971,615,449 +-981,-31,510,592,-390,-362 +-317,-968,913,365,97,508 +832,63,-864,-510,86,202 +-483,456,-636,340,-310,676 +981,-847,751,-508,-962,-31 +-157,99,73,797,63,-172 +220,858,872,924,866,-381 +996,-169,805,321,-164,971 +896,11,-625,-973,-782,76 +578,-280,730,-729,307,-905 +-580,-749,719,-698,967,603 +-821,874,-103,-623,662,-491 +-763,117,661,-644,672,-607 +592,787,-798,-169,-298,690 +296,644,-526,-762,-447,665 +534,-818,852,-120,57,-379 +-986,-549,-329,294,954,258 +-133,352,-660,-77,904,-356 +748,343,215,500,317,-277 +311,7,910,-896,-809,795 +763,-602,-753,313,-352,917 +668,619,-474,-597,-650,650 +-297,563,-701,-987,486,-902 +-461,-740,-657,233,-482,-328 +-446,-250,-986,-458,-629,520 +542,-49,-327,-469,257,-947 +121,-575,-634,-143,-184,521 +30,504,455,-645,-229,-945 +-12,-295,377,764,771,125 +-686,-133,225,-25,-376,-143 +-6,-46,338,270,-405,-872 +-623,-37,582,467,963,898 +-804,869,-477,420,-475,-303 +94,41,-842,-193,-768,720 +-656,-918,415,645,-357,460 +-47,-486,-911,468,-608,-686 +-158,251,419,-394,-655,-895 +272,-695,979,508,-358,959 +-776,650,-918,-467,-690,-534 +-85,-309,-626,167,-366,-429 +-880,-732,-186,-924,970,-875 +517,645,-274,962,-804,544 +721,402,104,640,478,-499 +198,684,-134,-723,-452,-905 +-245,745,239,238,-826,441 +-217,206,-32,462,-981,-895 +-51,989,526,-173,560,-676 +-480,-659,-976,-580,-727,466 +-996,-90,-995,158,-239,642 +302,288,-194,-294,17,924 +-943,969,-326,114,-500,103 +-619,163,339,-880,230,421 +-344,-601,-795,557,565,-779 +590,345,-129,-202,-125,-58 +-777,-195,159,674,775,411 +-939,312,-665,810,121,855 +-971,254,712,815,452,581 +442,-9,327,-750,61,757 +-342,869,869,-160,390,-772 +620,601,565,-169,-69,-183 +-25,924,-817,964,321,-970 +-64,-6,-133,978,825,-379 +601,436,-24,98,-115,940 +-97,502,614,-574,922,513 +-125,262,-946,695,99,-220 +429,-721,719,-694,197,-558 +326,689,-70,-908,-673,338 +-468,-856,-902,-254,-358,305 +-358,530,542,355,-253,-47 +-438,-74,-362,963,988,788 +137,717,467,622,319,-380 +-86,310,-336,851,918,-288 +721,395,646,-53,255,-425 +255,175,912,84,-209,878 +-632,-485,-400,-357,991,-608 +235,-559,992,-297,857,-591 +87,-71,148,130,647,578 +-290,-584,-639,-788,-21,592 +386,984,625,-731,-993,-336 +-538,634,-209,-828,-150,-774 +-754,-387,607,-781,976,-199 +412,-798,-664,295,709,-537 +-412,932,-880,-232,561,852 +-656,-358,-198,-964,-433,-848 +-762,-668,-632,186,-673,-11 +-876,237,-282,-312,-83,682 +403,73,-57,-436,-622,781 +-587,873,798,976,-39,329 +-369,-622,553,-341,817,794 +-108,-616,920,-849,-679,96 +290,-974,234,239,-284,-321 +-22,394,-417,-419,264,58 +-473,-551,69,923,591,-228 +-956,662,-113,851,-581,-794 +-258,-681,413,-471,-637,-817 +-866,926,992,-653,-7,794 +556,-350,602,917,831,-610 +188,245,-906,361,492,174 +-720,384,-818,329,638,-666 +-246,846,890,-325,-59,-850 +-118,-509,620,-762,-256,15 +-787,-536,-452,-338,-399,813 +458,560,525,-311,-608,-419 +494,-811,-825,-127,-812,894 +-801,890,-629,-860,574,925 +-709,-193,-213,138,-410,-403 +861,91,708,-187,5,-222 +789,646,777,154,90,-49 +-267,-830,-114,531,591,-698 +-126,-82,881,-418,82,652 +-894,130,-726,-935,393,-815 +-142,563,654,638,-712,-597 +-759,60,-23,977,100,-765 +-305,595,-570,-809,482,762 +-161,-267,53,963,998,-529 +-300,-57,798,353,703,486 +-990,696,-764,699,-565,719 +-232,-205,566,571,977,369 +740,865,151,-817,-204,-293 +94,445,-768,229,537,-406 +861,620,37,-424,-36,656 +390,-369,952,733,-464,569 +-482,-604,959,554,-705,-626 +-396,-615,-991,108,272,-723 +143,780,535,142,-917,-147 +138,-629,-217,-908,905,115 +915,103,-852,64,-468,-642 +570,734,-785,-268,-326,-759 +738,531,-332,586,-779,24 +870,440,-217,473,-383,415 +-296,-333,-330,-142,-924,950 +118,120,-35,-245,-211,-652 +61,634,153,-243,838,789 +726,-582,210,105,983,537 +-313,-323,758,234,29,848 +-847,-172,-593,733,-56,617 +54,255,-512,156,-575,675 +-873,-956,-148,623,95,200 +700,-370,926,649,-978,157 +-639,-202,719,130,747,222 +194,-33,955,943,505,114 +-226,-790,28,-930,827,783 +-392,-74,-28,714,218,-612 +209,626,-888,-683,-912,495 +487,751,614,933,631,445 +-348,-34,-411,-106,835,321 +-689,872,-29,-800,312,-542 +-52,566,827,570,-862,-77 +471,992,309,-402,389,912 +24,520,-83,-51,555,503 +-265,-317,283,-970,-472,690 +606,526,137,71,-651,150 +217,-518,663,66,-605,-331 +-562,232,-76,-503,205,-323 +842,-521,546,285,625,-186 +997,-927,344,909,-546,974 +-677,419,81,121,-705,771 +719,-379,-944,-797,784,-155 +-378,286,-317,-797,-111,964 +-288,-573,784,80,-532,-646 +-77,407,-248,-797,769,-816 +-24,-637,287,-858,-927,-333 +-902,37,894,-823,141,684 +125,467,-177,-516,686,399 +-321,-542,641,-590,527,-224 +-400,-712,-876,-208,632,-543 +-676,-429,664,-242,-269,922 +-608,-273,-141,930,687,380 +786,-12,498,494,310,326 +-739,-617,606,-960,804,188 +384,-368,-243,-350,-459,31 +-550,397,320,-868,328,-279 +969,-179,853,864,-110,514 +910,793,302,-822,-285,488 +-605,-128,218,-283,-17,-227 +16,324,667,708,750,3 +485,-813,19,585,71,930 +-218,816,-687,-97,-732,-360 +-497,-151,376,-23,3,315 +-412,-989,-610,-813,372,964 +-878,-280,87,381,-311,69 +-609,-90,-731,-679,150,585 +889,27,-162,605,75,-770 +448,617,-988,0,-103,-504 +-800,-537,-69,627,608,-668 +534,686,-664,942,830,920 +-238,775,495,932,-793,497 +-343,958,-914,-514,-691,651 +568,-136,208,359,728,28 +286,912,-794,683,556,-102 +-638,-629,-484,445,-64,-497 +58,505,-801,-110,872,632 +-390,777,353,267,976,369 +-993,515,105,-133,358,-572 +964,996,355,-212,-667,38 +-725,-614,-35,365,132,-196 +237,-536,-416,-302,312,477 +-664,574,-210,224,48,-925 +869,-261,-256,-240,-3,-698 +712,385,32,-34,916,-315 +895,-409,-100,-346,728,-624 +-806,327,-450,889,-781,-939 +-586,-403,698,318,-939,899 +557,-57,-920,659,333,-51 +-441,232,-918,-205,246,1 +783,167,-797,-595,245,-736 +-36,-531,-486,-426,-813,-160 +777,-843,817,313,-228,-572 +735,866,-309,-564,-81,190 +-413,645,101,719,-719,218 +-83,164,767,796,-430,-459 +122,779,-15,-295,-96,-892 +462,379,70,548,834,-312 +-630,-534,124,187,-737,114 +-299,-604,318,-591,936,826 +-879,218,-642,-483,-318,-866 +-691,62,-658,761,-895,-854 +-822,493,687,569,910,-202 +-223,784,304,-5,541,925 +-914,541,737,-662,-662,-195 +-622,615,414,358,881,-878 +339,745,-268,-968,-280,-227 +-364,855,148,-709,-827,472 +-890,-532,-41,664,-612,577 +-702,-859,971,-722,-660,-920 +-539,-605,737,149,973,-802 +800,42,-448,-811,152,511 +-933,377,-110,-105,-374,-937 +-766,152,482,120,-308,390 +-568,775,-292,899,732,890 +-177,-317,-502,-259,328,-511 +612,-696,-574,-660,132,31 +-119,563,-805,-864,179,-672 +425,-627,183,-331,839,318 +-711,-976,-749,152,-916,261 +181,-63,497,211,262,406 +-537,700,-859,-765,-928,77 +892,832,231,-749,-82,613 +816,216,-642,-216,-669,-912 +-6,624,-937,-370,-344,268 +737,-710,-869,983,-324,-274 +565,952,-547,-158,374,-444 +51,-683,645,-845,515,636 +-953,-631,114,-377,-764,-144 +-8,470,-242,-399,-675,-730 +-540,689,-20,47,-607,590 +-329,-710,-779,942,-388,979 +123,829,674,122,203,563 +46,782,396,-33,386,610 +872,-846,-523,-122,-55,-190 +388,-994,-525,974,127,596 +781,-680,796,-34,-959,-62 +-749,173,200,-384,-745,-446 +379,618,136,-250,-224,970 +-58,240,-921,-760,-901,-626 +366,-185,565,-100,515,688 +489,999,-893,-263,-637,816 +838,-496,-316,-513,419,479 +107,676,-15,882,98,-397 +-999,941,-903,-424,670,-325 +171,-979,835,178,169,-984 +-609,-607,378,-681,184,402 +-316,903,-575,-800,224,983 +591,-18,-460,551,-167,918 +-756,405,-117,441,163,-320 +456,24,6,881,-836,-539 +-489,-585,915,651,-892,-382 +-177,-122,73,-711,-386,591 +181,724,530,686,-131,241 +737,288,886,216,233,33 +-548,-386,-749,-153,-85,-982 +-835,227,904,160,-99,25 +-9,-42,-162,728,840,-963 +217,-763,870,771,47,-846 +-595,808,-491,556,337,-900 +-134,281,-724,441,-134,708 +-789,-508,651,-962,661,315 +-839,-923,339,402,41,-487 +300,-790,48,703,-398,-811 +955,-51,462,-685,960,-717 +910,-880,592,-255,-51,-776 +-885,169,-793,368,-565,458 +-905,940,-492,-630,-535,-988 +245,797,763,869,-82,550 +-310,38,-933,-367,-650,824 +-95,32,-83,337,226,990 +-218,-975,-191,-208,-785,-293 +-672,-953,517,-901,-247,465 +681,-148,261,-857,544,-923 +640,341,446,-618,195,769 +384,398,-846,365,671,815 +578,576,-911,907,762,-859 +548,-428,144,-630,-759,-146 +710,-73,-700,983,-97,-889 +-46,898,-973,-362,-817,-717 +151,-81,-125,-900,-478,-154 +483,615,-537,-932,181,-68 +786,-223,518,25,-306,-12 +-422,268,-809,-683,635,468 +983,-734,-694,-608,-110,4 +-786,-196,749,-354,137,-8 +-181,36,668,-200,691,-973 +-629,-838,692,-736,437,-871 +-208,-536,-159,-596,8,197 +-3,370,-686,170,913,-376 +44,-998,-149,-993,-200,512 +-519,136,859,497,536,434 +77,-985,972,-340,-705,-837 +-381,947,250,360,344,322 +-26,131,699,750,707,384 +-914,655,299,193,406,955 +-883,-921,220,595,-546,794 +-599,577,-569,-404,-704,489 +-594,-963,-624,-460,880,-760 +-603,88,-99,681,55,-328 +976,472,139,-453,-531,-860 +192,-290,513,-89,666,432 +417,487,575,293,567,-668 +655,711,-162,449,-980,972 +-505,664,-685,-239,603,-592 +-625,-802,-67,996,384,-636 +365,-593,522,-666,-200,-431 +-868,708,560,-860,-630,-355 +-702,785,-637,-611,-597,960 +-137,-696,-93,-803,408,406 +891,-123,-26,-609,-610,518 +133,-832,-198,555,708,-110 +791,617,-69,487,696,315 +-900,694,-565,517,-269,-416 +914,135,-781,600,-71,-600 +991,-915,-422,-351,-837,313 +-840,-398,-302,21,590,146 +62,-558,-702,-384,-625,831 +-363,-426,-924,-496,792,-908 +73,361,-817,-466,400,922 +-626,-164,-626,860,-524,286 +255,26,-944,809,-606,986 +-457,-256,-103,50,-867,-871 +-223,803,196,480,612,136 +-820,-928,700,780,-977,721 +717,332,53,-933,-128,793 +-602,-648,562,593,890,702 +-469,-875,-527,911,-475,-222 +110,-281,-552,-536,-816,596 +-981,654,413,-981,-75,-95 +-754,-742,-515,894,-220,-344 +795,-52,156,408,-603,76 +474,-157,423,-499,-807,-791 +260,688,40,-52,702,-122 +-584,-517,-390,-881,302,-504 +61,797,665,708,14,668 +366,166,458,-614,564,-983 +72,539,-378,796,381,-824 +-485,201,-588,842,736,379 +-149,-894,-298,705,-303,-406 +660,-935,-580,521,93,633 +-382,-282,-375,-841,-828,171 +-567,743,-100,43,144,122 +-281,-786,-749,-551,296,304 +11,-426,-792,212,857,-175 +594,143,-699,289,315,137 +341,596,-390,107,-631,-804 +-751,-636,-424,-854,193,651 +-145,384,749,675,-786,517 +224,-865,-323,96,-916,258 +-309,403,-388,826,35,-270 +-942,709,222,158,-699,-103 +-589,842,-997,29,-195,-210 +264,426,566,145,-217,623 +217,965,507,-601,-453,507 +-206,307,-982,4,64,-292 +676,-49,-38,-701,550,883 +5,-850,-438,659,745,-773 +933,238,-574,-570,91,-33 +-866,121,-928,358,459,-843 +-568,-631,-352,-580,-349,189 +-737,849,-963,-486,-662,970 +135,334,-967,-71,-365,-792 +789,21,-227,51,990,-275 +240,412,-886,230,591,256 +-609,472,-853,-754,959,661 +401,521,521,314,929,982 +-499,784,-208,71,-302,296 +-557,-948,-553,-526,-864,793 +270,-626,828,44,37,14 +-412,224,617,-593,502,699 +41,-908,81,562,-849,163 +165,917,761,-197,331,-341 +-687,314,799,755,-969,648 +-164,25,578,439,-334,-576 +213,535,874,-177,-551,24 +-689,291,-795,-225,-496,-125 +465,461,558,-118,-568,-909 +567,660,-810,46,-485,878 +-147,606,685,-690,-774,984 +568,-886,-43,854,-738,616 +-800,386,-614,585,764,-226 +-518,23,-225,-732,-79,440 +-173,-291,-689,636,642,-447 +-598,-16,227,410,496,211 +-474,-930,-656,-321,-420,36 +-435,165,-819,555,540,144 +-969,149,828,568,394,648 +65,-848,257,720,-625,-851 +981,899,275,635,465,-877 +80,290,792,760,-191,-321 +-605,-858,594,33,706,593 +585,-472,318,-35,354,-927 +-365,664,803,581,-965,-814 +-427,-238,-480,146,-55,-606 +879,-193,250,-890,336,117 +-226,-322,-286,-765,-836,-218 +-913,564,-667,-698,937,283 +872,-901,810,-623,-52,-709 +473,171,717,38,-429,-644 +225,824,-219,-475,-180,234 +-530,-797,-948,238,851,-623 +85,975,-363,529,598,28 +-799,166,-804,210,-769,851 +-687,-158,885,736,-381,-461 +447,592,928,-514,-515,-661 +-399,-777,-493,80,-544,-78 +-884,631,171,-825,-333,551 +191,268,-577,676,137,-33 +212,-853,709,798,583,-56 +-908,-172,-540,-84,-135,-56 +303,311,406,-360,-240,811 +798,-708,824,59,234,-57 +491,693,-74,585,-85,877 +509,-65,-936,329,-51,722 +-122,858,-52,467,-77,-609 +850,760,547,-495,-953,-952 +-460,-541,890,910,286,724 +-914,843,-579,-983,-387,-460 +989,-171,-877,-326,-899,458 +846,175,-915,540,-1000,-982 +-852,-920,-306,496,530,-18 +338,-991,160,85,-455,-661 +-186,-311,-460,-563,-231,-414 +-932,-302,959,597,793,748 +-366,-402,-788,-279,514,53 +-940,-956,447,-956,211,-285 +564,806,-911,-914,934,754 +575,-858,-277,15,409,-714 +848,462,100,-381,135,242 +330,718,-24,-190,860,-78 +479,458,941,108,-866,-653 +212,980,962,-962,115,841 +-827,-474,-206,881,323,765 +506,-45,-30,-293,524,-133 +832,-173,547,-852,-561,-842 +-397,-661,-708,819,-545,-228 +521,51,-489,852,36,-258 +227,-164,189,465,-987,-882 +-73,-997,641,-995,449,-615 +151,-995,-638,415,257,-400 +-663,-297,-748,537,-734,198 +-585,-401,-81,-782,-80,-105 +99,-21,238,-365,-704,-368 +45,416,849,-211,-371,-1 +-404,-443,795,-406,36,-933 +272,-363,981,-491,-380,77 +713,-342,-366,-849,643,911 +-748,671,-537,813,961,-200 +-194,-909,703,-662,-601,188 +281,500,724,286,267,197 +-832,847,-595,820,-316,637 +520,521,-54,261,923,-10 +4,-808,-682,-258,441,-695 +-793,-107,-969,905,798,446 +-108,-739,-590,69,-855,-365 +380,-623,-930,817,468,713 +759,-849,-236,433,-723,-931 +95,-320,-686,124,-69,-329 +-655,518,-210,-523,284,-866 +144,303,639,70,-171,269 +173,-333,947,-304,55,40 +274,878,-482,-888,-835,375 +-982,-854,-36,-218,-114,-230 +905,-979,488,-485,-479,114 +877,-157,553,-530,-47,-321 +350,664,-881,442,-220,-284 +434,-423,-365,878,-726,584 +535,909,-517,-447,-660,-141 +-966,191,50,353,182,-642 +-785,-634,123,-907,-162,511 +146,-850,-214,814,-704,25 +692,1,521,492,-637,274 +-662,-372,-313,597,983,-647 +-962,-526,68,-549,-819,231 +740,-890,-318,797,-666,948 +-190,-12,-468,-455,948,284 +16,478,-506,-888,628,-154 +272,630,-976,308,433,3 +-169,-391,-132,189,302,-388 +109,-784,474,-167,-265,-31 +-177,-532,283,464,421,-73 +650,635,592,-138,1,-387 +-932,703,-827,-492,-355,686 +586,-311,340,-618,645,-434 +-951,736,647,-127,-303,590 +188,444,903,718,-931,500 +-872,-642,-296,-571,337,241 +23,65,152,125,880,470 +512,823,-42,217,823,-263 +180,-831,-380,886,607,762 +722,443,-149,-216,-115,759 +-19,660,-36,901,923,231 +562,-322,-626,-968,194,-825 +204,-920,938,784,362,150 +-410,-266,-715,559,-672,124 +-198,446,-140,454,-461,-447 +83,-346,830,-493,-759,-382 +-881,601,581,234,-134,-925 +-494,914,-42,899,235,629 +-390,50,956,437,774,-700 +-514,514,44,-512,-576,-313 +63,-688,808,-534,-570,-399 +-726,572,-896,102,-294,-28 +-688,757,401,406,955,-511 +-283,423,-485,480,-767,908 +-541,952,-594,116,-854,451 +-273,-796,236,625,-626,257 +-407,-493,373,826,-309,297 +-750,955,-476,641,-809,713 +8,415,695,226,-111,2 +733,209,152,-920,401,995 +921,-103,-919,66,871,-947 +-907,89,-869,-214,851,-559 +-307,748,524,-755,314,-711 +188,897,-72,-763,482,103 +545,-821,-232,-596,-334,-754 +-217,-788,-820,388,-200,-662 +779,160,-723,-975,-142,-998 +-978,-519,-78,-981,842,904 +-504,-736,-295,21,-472,-482 +391,115,-705,574,652,-446 +813,-988,865,830,-263,487 +194,80,774,-493,-761,-872 +-415,-284,-803,7,-810,670 +-484,-4,881,-872,55,-852 +-379,822,-266,324,-48,748 +-304,-278,406,-60,959,-89 +404,756,577,-643,-332,658 +291,460,125,491,-312,83 +311,-734,-141,582,282,-557 +-450,-661,-981,710,-177,794 +328,264,-787,971,-743,-407 +-622,518,993,-241,-738,229 +273,-826,-254,-917,-710,-111 +809,770,96,368,-818,725 +-488,773,502,-342,534,745 +-28,-414,236,-315,-484,363 +179,-466,-566,713,-683,56 +560,-240,-597,619,916,-940 +893,473,872,-868,-642,-461 +799,489,383,-321,-776,-833 +980,490,-508,764,-512,-426 +917,961,-16,-675,440,559 +-812,212,784,-987,-132,554 +-886,454,747,806,190,231 +910,341,21,-66,708,725 +29,929,-831,-494,-303,389 +-103,492,-271,-174,-515,529 +-292,119,419,788,247,-951 +483,543,-347,-673,664,-549 +-926,-871,-437,337,162,-877 +299,472,-771,5,-88,-643 +-103,525,-725,-998,264,22 +-505,708,550,-545,823,347 +-738,931,59,147,-156,-259 +456,968,-162,889,132,-911 +535,120,968,-517,-864,-541 +24,-395,-593,-766,-565,-332 +834,611,825,-576,280,629 +211,-548,140,-278,-592,929 +-999,-240,-63,-78,793,573 +-573,160,450,987,529,322 +63,353,315,-187,-461,577 +189,-950,-247,656,289,241 +209,-297,397,664,-805,484 +-655,452,435,-556,917,874 +253,-756,262,-888,-778,-214 +793,-451,323,-251,-401,-458 +-396,619,-651,-287,-668,-781 +698,720,-349,742,-807,546 +738,280,680,279,-540,858 +-789,387,530,-36,-551,-491 +162,579,-427,-272,228,710 +689,356,917,-580,729,217 +-115,-638,866,424,-82,-194 +411,-338,-917,172,227,-29 +-612,63,630,-976,-64,-204 +-200,911,583,-571,682,-579 +91,298,396,-183,788,-955 +141,-873,-277,149,-396,916 +321,958,-136,573,541,-777 +797,-909,-469,-877,988,-653 +784,-198,129,883,-203,399 +-68,-810,223,-423,-467,-512 +531,-445,-603,-997,-841,641 +-274,-242,174,261,-636,-158 +-574,494,-796,-798,-798,99 +95,-82,-613,-954,-753,986 +-883,-448,-864,-401,938,-392 +913,930,-542,-988,310,410 +506,-99,43,512,790,-222 +724,31,49,-950,260,-134 +-287,-947,-234,-700,56,588 +-33,782,-144,948,105,-791 +548,-546,-652,-293,881,-520 +691,-91,76,991,-631,742 +-520,-429,-244,-296,724,-48 +778,646,377,50,-188,56 +-895,-507,-898,-165,-674,652 +654,584,-634,177,-349,-620 +114,-980,355,62,182,975 +516,9,-442,-298,274,-579 +-238,262,-431,-896,506,-850 +47,748,846,821,-537,-293 +839,726,593,285,-297,840 +634,-486,468,-304,-887,-567 +-864,914,296,-124,335,233 +88,-253,-523,-956,-554,803 +-587,417,281,-62,-409,-363 +-136,-39,-292,-768,-264,876 +-127,506,-891,-331,-744,-430 +778,584,-750,-129,-479,-94 +-876,-771,-987,-757,180,-641 +-777,-694,411,-87,329,190 +-347,-999,-882,158,-754,232 +-105,918,188,237,-110,-591 +-209,703,-838,77,838,909 +-995,-339,-762,750,860,472 +185,271,-289,173,811,-300 +2,65,-656,-22,36,-139 +765,-210,883,974,961,-905 +-212,295,-615,-840,77,474 +211,-910,-440,703,-11,859 +-559,-4,-196,841,-277,969 +-73,-159,-887,126,978,-371 +-569,633,-423,-33,512,-393 +503,143,-383,-109,-649,-998 +-663,339,-317,-523,-2,596 +690,-380,570,378,-652,132 +72,-744,-930,399,-525,935 +865,-983,115,37,995,826 +594,-621,-872,443,188,-241 +-1000,291,754,234,-435,-869 +-868,901,654,-907,59,181 +-868,-793,-431,596,-446,-564 +900,-944,-680,-796,902,-366 +331,430,943,853,-851,-942 +315,-538,-354,-909,139,721 +170,-884,-225,-818,-808,-657 +-279,-34,-533,-871,-972,552 +691,-986,-800,-950,654,-747 +603,988,899,841,-630,591 +876,-949,809,562,602,-536 +-693,363,-189,495,738,-1000 +-383,431,-633,297,665,959 +-740,686,-207,-803,188,-520 +-820,226,31,-339,10,121 +-312,-844,624,-516,483,621 +-822,-529,69,-278,800,328 +834,-82,-759,420,811,-264 +-960,-240,-921,561,173,46 +-324,909,-790,-814,-2,-785 +976,334,-290,-891,704,-581 +150,-798,689,-823,237,-639 +-551,-320,876,-502,-622,-628 +-136,845,904,595,-702,-261 +-857,-377,-522,-101,-943,-805 +-682,-787,-888,-459,-752,-985 +-571,-81,623,-133,447,643 +-375,-158,72,-387,-324,-696 +-660,-650,340,188,569,526 +727,-218,16,-7,-595,-988 +-966,-684,802,-783,-272,-194 +115,-566,-888,47,712,180 +-237,-69,45,-272,981,-812 +48,897,439,417,50,325 +348,616,180,254,104,-784 +-730,811,-548,612,-736,790 +138,-810,123,930,65,865 +-768,-299,-49,-895,-692,-418 +487,-531,802,-159,-12,634 +808,-179,552,-73,470,717 +720,-644,886,-141,625,144 +-485,-505,-347,-244,-916,66 +600,-565,995,-5,324,227 +-771,-35,904,-482,753,-303 +-701,65,426,-763,-504,-479 +409,733,-823,475,64,718 +865,975,368,893,-413,-433 +812,-597,-970,819,813,624 +193,-642,-381,-560,545,398 +711,28,-316,771,717,-865 +-509,462,809,-136,786,635 +618,-49,484,169,635,547 +-747,685,-882,-496,-332,82 +-501,-851,870,563,290,570 +-279,-829,-509,397,457,816 +-508,80,850,-188,483,-326 +860,-100,360,119,-205,787 +-870,21,-39,-827,-185,932 +826,284,-136,-866,-330,-97 +-944,-82,745,899,-97,365 +929,262,564,632,-115,632 +244,-276,713,330,-897,-214 +-890,-109,664,876,-974,-907 +716,249,816,489,723,141 +-96,-560,-272,45,-70,645 +762,-503,414,-828,-254,-646 +909,-13,903,-422,-344,-10 +658,-486,743,545,50,674 +-241,507,-367,18,-48,-241 +886,-268,884,-762,120,-486 +-412,-528,879,-647,223,-393 +851,810,234,937,-726,797 +-999,942,839,-134,-996,-189 +100,979,-527,-521,378,800 +544,-844,-832,-530,-77,-641 +43,889,31,442,-934,-503 +-330,-370,-309,-439,173,547 +169,945,62,-753,-542,-597 +208,751,-372,-647,-520,70 +765,-840,907,-257,379,918 +334,-135,-689,730,-427,618 +137,-508,66,-695,78,169 +-962,-123,400,-417,151,969 +328,689,666,427,-555,-642 +-907,343,605,-341,-647,582 +-667,-363,-571,818,-265,-399 +525,-938,904,898,725,692 +-176,-802,-858,-9,780,275 +580,170,-740,287,691,-97 +365,557,-375,361,-288,859 +193,737,842,-808,520,282 +-871,65,-799,836,179,-720 +958,-144,744,-789,797,-48 +122,582,662,912,68,757 +595,241,-801,513,388,186 +-103,-677,-259,-731,-281,-857 +921,319,-696,683,-88,-997 +775,200,78,858,648,768 +316,821,-763,68,-290,-741 +564,664,691,504,760,787 +694,-119,973,-385,309,-760 +777,-947,-57,990,74,19 +971,626,-496,-781,-602,-239 +-651,433,11,-339,939,294 +-965,-728,560,569,-708,-247 diff --git a/python-mega-algo/project_euler/problem_102/right.html b/python-mega-algo/project_euler/problem_102/right.html new file mode 100644 index 00000000..32cb0a92 --- /dev/null +++ b/python-mega-algo/project_euler/problem_102/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/project_euler/problem_102 + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    sol1.py __init__.py p102_triangles.txt test_triangles.txt 
    + +

    +Folders: 1
    +Files: 4
    +Size of all files: 28823 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/project_euler/problem_102/sol1.py b/python-mega-algo/project_euler/problem_102/sol1.py new file mode 100644 index 00000000..00af7266 --- /dev/null +++ b/python-mega-algo/project_euler/problem_102/sol1.py @@ -0,0 +1,81 @@ +""" +Three distinct points are plotted at random on a Cartesian plane, +for which -1000 ≤ x, y ≤ 1000, such that a triangle is formed. + +Consider the following two triangles: + +A(-340,495), B(-153,-910), C(835,-947) + +X(-175,41), Y(-421,-714), Z(574,-645) + +It can be verified that triangle ABC contains the origin, whereas +triangle XYZ does not. + +Using triangles.txt (right click and 'Save Link/Target As...'), a 27K text +file containing the coordinates of one thousand "random" triangles, find +the number of triangles for which the interior contains the origin. + +NOTE: The first two examples in the file represent the triangles in the +example given above. +""" + +from pathlib import Path +from typing import List, Tuple + + +def vector_product(point1: Tuple[int, int], point2: Tuple[int, int]) -> int: + """ + Return the 2-d vector product of two vectors. + >>> vector_product((1, 2), (-5, 0)) + 10 + >>> vector_product((3, 1), (6, 10)) + 24 + """ + return point1[0] * point2[1] - point1[1] * point2[0] + + +def contains_origin(x1: int, y1: int, x2: int, y2: int, x3: int, y3: int) -> bool: + """ + Check if the triangle given by the points A(x1, y1), B(x2, y2), C(x3, y3) + contains the origin. + >>> contains_origin(-340, 495, -153, -910, 835, -947) + True + >>> contains_origin(-175, 41, -421, -714, 574, -645) + False + """ + point_a: Tuple[int, int] = (x1, y1) + point_a_to_b: Tuple[int, int] = (x2 - x1, y2 - y1) + point_a_to_c: Tuple[int, int] = (x3 - x1, y3 - y1) + a: float = -vector_product(point_a, point_a_to_b) / vector_product( + point_a_to_c, point_a_to_b + ) + b: float = +vector_product(point_a, point_a_to_c) / vector_product( + point_a_to_c, point_a_to_b + ) + + return a > 0 and b > 0 and a + b < 1 + + +def solution(filename: str = "p102_triangles.txt") -> int: + """ + Find the number of triangles whose interior contains the origin. + >>> solution("test_triangles.txt") + 1 + """ + data: str = Path(__file__).parent.joinpath(filename).read_text(encoding="utf-8") + + triangles: List[List[int]] = [] + for line in data.strip().split("\n"): + triangles.append([int(number) for number in line.split(",")]) + + ret: int = 0 + triangle: List[int] + + for triangle in triangles: + ret += contains_origin(*triangle) + + return ret + + +if __name__ == "__main__": + print(f"{solution() = }") diff --git a/python-mega-algo/project_euler/problem_102/test_triangles.txt b/python-mega-algo/project_euler/problem_102/test_triangles.txt new file mode 100644 index 00000000..5c10cd65 --- /dev/null +++ b/python-mega-algo/project_euler/problem_102/test_triangles.txt @@ -0,0 +1,2 @@ +-340,495,-153,-910,835,-947 +-175,41,-421,-714,574,-645 diff --git a/python-mega-algo/project_euler/problem_107/__init__.py b/python-mega-algo/project_euler/problem_107/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/project_euler/problem_107/p107_network.txt b/python-mega-algo/project_euler/problem_107/p107_network.txt new file mode 100644 index 00000000..fcc3c419 --- /dev/null +++ b/python-mega-algo/project_euler/problem_107/p107_network.txt @@ -0,0 +1,40 @@ +-,-,-,427,668,495,377,678,-,177,-,-,870,-,869,624,300,609,131,-,251,-,-,-,856,221,514,-,591,762,182,56,-,884,412,273,636,-,-,774 +-,-,262,-,-,508,472,799,-,956,578,363,940,143,-,162,122,910,-,729,802,941,922,573,531,539,667,607,-,920,-,-,315,649,937,-,185,102,636,289 +-,262,-,-,926,-,958,158,647,47,621,264,81,-,402,813,649,386,252,391,264,637,349,-,-,-,108,-,727,225,578,699,-,898,294,-,575,168,432,833 +427,-,-,-,366,-,-,635,-,32,962,468,893,854,718,427,448,916,258,-,760,909,529,311,404,-,-,588,680,875,-,615,-,409,758,221,-,-,76,257 +668,-,926,366,-,-,-,250,268,-,503,944,-,677,-,727,793,457,981,191,-,-,-,351,969,925,987,328,282,589,-,873,477,-,-,19,450,-,-,- +495,508,-,-,-,-,-,765,711,819,305,302,926,-,-,582,-,861,-,683,293,-,-,66,-,27,-,-,290,-,786,-,554,817,33,-,54,506,386,381 +377,472,958,-,-,-,-,-,-,120,42,-,134,219,457,639,538,374,-,-,-,966,-,-,-,-,-,449,120,797,358,232,550,-,305,997,662,744,686,239 +678,799,158,635,250,765,-,-,-,35,-,106,385,652,160,-,890,812,605,953,-,-,-,79,-,712,613,312,452,-,978,900,-,901,-,-,225,533,770,722 +-,-,647,-,268,711,-,-,-,283,-,172,-,663,236,36,403,286,986,-,-,810,761,574,53,793,-,-,777,330,936,883,286,-,174,-,-,-,828,711 +177,956,47,32,-,819,120,35,283,-,50,-,565,36,767,684,344,489,565,-,-,103,810,463,733,665,494,644,863,25,385,-,342,470,-,-,-,730,582,468 +-,578,621,962,503,305,42,-,-,50,-,155,519,-,-,256,990,801,154,53,474,650,402,-,-,-,966,-,-,406,989,772,932,7,-,823,391,-,-,933 +-,363,264,468,944,302,-,106,172,-,155,-,-,-,380,438,-,41,266,-,-,104,867,609,-,270,861,-,-,165,-,675,250,686,995,366,191,-,433,- +870,940,81,893,-,926,134,385,-,565,519,-,-,313,851,-,-,-,248,220,-,826,359,829,-,234,198,145,409,68,359,-,814,218,186,-,-,929,203,- +-,143,-,854,677,-,219,652,663,36,-,-,313,-,132,-,433,598,-,-,168,870,-,-,-,128,437,-,383,364,966,227,-,-,807,993,-,-,526,17 +869,-,402,718,-,-,457,160,236,767,-,380,851,132,-,-,596,903,613,730,-,261,-,142,379,885,89,-,848,258,112,-,900,-,-,818,639,268,600,- +624,162,813,427,727,582,639,-,36,684,256,438,-,-,-,-,539,379,664,561,542,-,999,585,-,-,321,398,-,-,950,68,193,-,697,-,390,588,848,- +300,122,649,448,793,-,538,890,403,344,990,-,-,433,596,539,-,-,73,-,318,-,-,500,-,968,-,291,-,-,765,196,504,757,-,542,-,395,227,148 +609,910,386,916,457,861,374,812,286,489,801,41,-,598,903,379,-,-,-,946,136,399,-,941,707,156,757,258,251,-,807,-,-,-,461,501,-,-,616,- +131,-,252,258,981,-,-,605,986,565,154,266,248,-,613,664,73,-,-,686,-,-,575,627,817,282,-,698,398,222,-,649,-,-,-,-,-,654,-,- +-,729,391,-,191,683,-,953,-,-,53,-,220,-,730,561,-,946,686,-,-,389,729,553,304,703,455,857,260,-,991,182,351,477,867,-,-,889,217,853 +251,802,264,760,-,293,-,-,-,-,474,-,-,168,-,542,318,136,-,-,-,-,392,-,-,-,267,407,27,651,80,927,-,974,977,-,-,457,117,- +-,941,637,909,-,-,966,-,810,103,650,104,826,870,261,-,-,399,-,389,-,-,-,202,-,-,-,-,867,140,403,962,785,-,511,-,1,-,707,- +-,922,349,529,-,-,-,-,761,810,402,867,359,-,-,999,-,-,575,729,392,-,-,388,939,-,959,-,83,463,361,-,-,512,931,-,224,690,369,- +-,573,-,311,351,66,-,79,574,463,-,609,829,-,142,585,500,941,627,553,-,202,388,-,164,829,-,620,523,639,936,-,-,490,-,695,-,505,109,- +856,531,-,404,969,-,-,-,53,733,-,-,-,-,379,-,-,707,817,304,-,-,939,164,-,-,616,716,728,-,889,349,-,963,150,447,-,292,586,264 +221,539,-,-,925,27,-,712,793,665,-,270,234,128,885,-,968,156,282,703,-,-,-,829,-,-,-,822,-,-,-,736,576,-,697,946,443,-,205,194 +514,667,108,-,987,-,-,613,-,494,966,861,198,437,89,321,-,757,-,455,267,-,959,-,616,-,-,-,349,156,339,-,102,790,359,-,439,938,809,260 +-,607,-,588,328,-,449,312,-,644,-,-,145,-,-,398,291,258,698,857,407,-,-,620,716,822,-,-,293,486,943,-,779,-,6,880,116,775,-,947 +591,-,727,680,282,290,120,452,777,863,-,-,409,383,848,-,-,251,398,260,27,867,83,523,728,-,349,293,-,212,684,505,341,384,9,992,507,48,-,- +762,920,225,875,589,-,797,-,330,25,406,165,68,364,258,-,-,-,222,-,651,140,463,639,-,-,156,486,212,-,-,349,723,-,-,186,-,36,240,752 +182,-,578,-,-,786,358,978,936,385,989,-,359,966,112,950,765,807,-,991,80,403,361,936,889,-,339,943,684,-,-,965,302,676,725,-,327,134,-,147 +56,-,699,615,873,-,232,900,883,-,772,675,-,227,-,68,196,-,649,182,927,962,-,-,349,736,-,-,505,349,965,-,474,178,833,-,-,555,853,- +-,315,-,-,477,554,550,-,286,342,932,250,814,-,900,193,504,-,-,351,-,785,-,-,-,576,102,779,341,723,302,474,-,689,-,-,-,451,-,- +884,649,898,409,-,817,-,901,-,470,7,686,218,-,-,-,757,-,-,477,974,-,512,490,963,-,790,-,384,-,676,178,689,-,245,596,445,-,-,343 +412,937,294,758,-,33,305,-,174,-,-,995,186,807,-,697,-,461,-,867,977,511,931,-,150,697,359,6,9,-,725,833,-,245,-,949,-,270,-,112 +273,-,-,221,19,-,997,-,-,-,823,366,-,993,818,-,542,501,-,-,-,-,-,695,447,946,-,880,992,186,-,-,-,596,949,-,91,-,768,273 +636,185,575,-,450,54,662,225,-,-,391,191,-,-,639,390,-,-,-,-,-,1,224,-,-,443,439,116,507,-,327,-,-,445,-,91,-,248,-,344 +-,102,168,-,-,506,744,533,-,730,-,-,929,-,268,588,395,-,654,889,457,-,690,505,292,-,938,775,48,36,134,555,451,-,270,-,248,-,371,680 +-,636,432,76,-,386,686,770,828,582,-,433,203,526,600,848,227,616,-,217,117,707,369,109,586,205,809,-,-,240,-,853,-,-,-,768,-,371,-,540 +774,289,833,257,-,381,239,722,711,468,933,-,-,17,-,-,148,-,-,853,-,-,-,-,264,194,260,947,-,752,147,-,-,343,112,273,344,680,540,- diff --git a/python-mega-algo/project_euler/problem_107/right.html b/python-mega-algo/project_euler/problem_107/right.html new file mode 100644 index 00000000..fc98541e --- /dev/null +++ b/python-mega-algo/project_euler/problem_107/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/project_euler/problem_107 + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    sol1.py __init__.py p107_network.txt test_network.txt 
    + +

    +Folders: 1
    +Files: 4
    +Size of all files: 9536 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/project_euler/problem_107/sol1.py b/python-mega-algo/project_euler/problem_107/sol1.py new file mode 100644 index 00000000..80a10e49 --- /dev/null +++ b/python-mega-algo/project_euler/problem_107/sol1.py @@ -0,0 +1,128 @@ +""" +The following undirected network consists of seven vertices and twelve edges +with a total weight of 243. + +The same network can be represented by the matrix below. + + A B C D E F G +A - 16 12 21 - - - +B 16 - - 17 20 - - +C 12 - - 28 - 31 - +D 21 17 28 - 18 19 23 +E - 20 - 18 - - 11 +F - - 31 19 - - 27 +G - - - 23 11 27 - + +However, it is possible to optimise the network by removing some edges and still +ensure that all points on the network remain connected. The network which achieves +the maximum saving is shown below. It has a weight of 93, representing a saving of +243 - 93 = 150 from the original network. + +Using network.txt (right click and 'Save Link/Target As...'), a 6K text file +containing a network with forty vertices, and given in matrix form, find the maximum +saving which can be achieved by removing redundant edges whilst ensuring that the +network remains connected. + +Solution: + We use Prim's algorithm to find a Minimum Spanning Tree. + Reference: https://en.wikipedia.org/wiki/Prim%27s_algorithm +""" + +import os +from typing import Dict, List, Mapping, Set, Tuple + +EdgeT = Tuple[int, int] + + +class Graph: + """ + A class representing an undirected weighted graph. + """ + + def __init__(self, vertices: Set[int], edges: Mapping[EdgeT, int]) -> None: + self.vertices: Set[int] = vertices + self.edges: Dict[EdgeT, int] = { + (min(edge), max(edge)): weight for edge, weight in edges.items() + } + + def add_edge(self, edge: EdgeT, weight: int) -> None: + """ + Add a new edge to the graph. + >>> graph = Graph({1, 2}, {(2, 1): 4}) + >>> graph.add_edge((3, 1), 5) + >>> sorted(graph.vertices) + [1, 2, 3] + >>> sorted([(v,k) for k,v in graph.edges.items()]) + [(4, (1, 2)), (5, (1, 3))] + """ + self.vertices.add(edge[0]) + self.vertices.add(edge[1]) + self.edges[(min(edge), max(edge))] = weight + + def prims_algorithm(self) -> "Graph": + """ + Run Prim's algorithm to find the minimum spanning tree. + Reference: https://en.wikipedia.org/wiki/Prim%27s_algorithm + >>> graph = Graph({1,2,3,4},{(1,2):5, (1,3):10, (1,4):20, (2,4):30, (3,4):1}) + >>> mst = graph.prims_algorithm() + >>> sorted(mst.vertices) + [1, 2, 3, 4] + >>> sorted(mst.edges) + [(1, 2), (1, 3), (3, 4)] + """ + subgraph: Graph = Graph({min(self.vertices)}, {}) + min_edge: EdgeT + min_weight: int + edge: EdgeT + weight: int + + while len(subgraph.vertices) < len(self.vertices): + min_weight = max(self.edges.values()) + 1 + for edge, weight in self.edges.items(): + if (edge[0] in subgraph.vertices) ^ (edge[1] in subgraph.vertices): + if weight < min_weight: + min_edge = edge + min_weight = weight + + subgraph.add_edge(min_edge, min_weight) + + return subgraph + + +def solution(filename: str = "p107_network.txt") -> int: + """ + Find the maximum saving which can be achieved by removing redundant edges + whilst ensuring that the network remains connected. + >>> solution("test_network.txt") + 150 + """ + script_dir: str = os.path.abspath(os.path.dirname(__file__)) + network_file: str = os.path.join(script_dir, filename) + adjacency_matrix: List[List[str]] + edges: Dict[EdgeT, int] = dict() + data: List[str] + edge1: int + edge2: int + + with open(network_file, "r") as f: + data = f.read().strip().split("\n") + + adjaceny_matrix = [line.split(",") for line in data] + + for edge1 in range(1, len(adjaceny_matrix)): + for edge2 in range(edge1): + if adjaceny_matrix[edge1][edge2] != "-": + edges[(edge2, edge1)] = int(adjaceny_matrix[edge1][edge2]) + + graph: Graph = Graph(set(range(len(adjaceny_matrix))), edges) + + subgraph: Graph = graph.prims_algorithm() + + initial_total: int = sum(graph.edges.values()) + optimal_total: int = sum(subgraph.edges.values()) + + return initial_total - optimal_total + + +if __name__ == "__main__": + print(f"{solution() = }") diff --git a/python-mega-algo/project_euler/problem_107/test_network.txt b/python-mega-algo/project_euler/problem_107/test_network.txt new file mode 100644 index 00000000..f5f2accb --- /dev/null +++ b/python-mega-algo/project_euler/problem_107/test_network.txt @@ -0,0 +1,7 @@ +-,16,12,21,-,-,- +16,-,-,17,20,-,- +12,-,-,28,-,31,- +21,17,28,-,18,19,23 +-,20,-,18,-,-,11 +-,-,31,19,-,-,27 +-,-,-,23,11,27,- diff --git a/python-mega-algo/project_euler/problem_109/__init__.py b/python-mega-algo/project_euler/problem_109/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/project_euler/problem_109/right.html b/python-mega-algo/project_euler/problem_109/right.html new file mode 100644 index 00000000..d94af7f9 --- /dev/null +++ b/python-mega-algo/project_euler/problem_109/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/project_euler/problem_109 + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    sol1.py __init__.py 
    + +

    +Folders: 1
    +Files: 2
    +Size of all files: 3075 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/project_euler/problem_109/sol1.py b/python-mega-algo/project_euler/problem_109/sol1.py new file mode 100644 index 00000000..91c71eb9 --- /dev/null +++ b/python-mega-algo/project_euler/problem_109/sol1.py @@ -0,0 +1,89 @@ +""" +In the game of darts a player throws three darts at a target board which is +split into twenty equal sized sections numbered one to twenty. + +The score of a dart is determined by the number of the region that the dart +lands in. A dart landing outside the red/green outer ring scores zero. The black +and cream regions inside this ring represent single scores. However, the red/green +outer ring and middle ring score double and treble scores respectively. + +At the centre of the board are two concentric circles called the bull region, or +bulls-eye. The outer bull is worth 25 points and the inner bull is a double, +worth 50 points. + +There are many variations of rules but in the most popular game the players will +begin with a score 301 or 501 and the first player to reduce their running total +to zero is a winner. However, it is normal to play a "doubles out" system, which +means that the player must land a double (including the double bulls-eye at the +centre of the board) on their final dart to win; any other dart that would reduce +their running total to one or lower means the score for that set of three darts +is "bust". + +When a player is able to finish on their current score it is called a "checkout" +and the highest checkout is 170: T20 T20 D25 (two treble 20s and double bull). + +There are exactly eleven distinct ways to checkout on a score of 6: + +D3 +D1 D2 +S2 D2 +D2 D1 +S4 D1 +S1 S1 D2 +S1 T1 D1 +S1 S3 D1 +D1 D1 D1 +D1 S2 D1 +S2 S2 D1 + +Note that D1 D2 is considered different to D2 D1 as they finish on different +doubles. However, the combination S1 T1 D1 is considered the same as T1 S1 D1. + +In addition we shall not include misses in considering combinations; for example, +D3 is the same as 0 D3 and 0 0 D3. + +Incredibly there are 42336 distinct ways of checking out in total. + +How many distinct ways can a player checkout with a score less than 100? + +Solution: + We first construct a list of the possible dart values, separated by type. + We then iterate through the doubles, followed by the possible 2 following throws. + If the total of these three darts is less than the given limit, we increment + the counter. +""" + +from itertools import combinations_with_replacement + + +def solution(limit: int = 100) -> int: + """ + Count the number of distinct ways a player can checkout with a score + less than limit. + >>> solution(171) + 42336 + >>> solution(50) + 12577 + """ + singles: list[int] = [x for x in range(1, 21)] + [25] + doubles: list[int] = [2 * x for x in range(1, 21)] + [50] + triples: list[int] = [3 * x for x in range(1, 21)] + all_values: list[int] = singles + doubles + triples + [0] + + num_checkouts: int = 0 + double: int + throw1: int + throw2: int + checkout_total: int + + for double in doubles: + for throw1, throw2 in combinations_with_replacement(all_values, 2): + checkout_total = double + throw1 + throw2 + if checkout_total < limit: + num_checkouts += 1 + + return num_checkouts + + +if __name__ == "__main__": + print(f"{solution() = }") diff --git a/python-mega-algo/project_euler/problem_112/__init__.py b/python-mega-algo/project_euler/problem_112/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/project_euler/problem_112/right.html b/python-mega-algo/project_euler/problem_112/right.html new file mode 100644 index 00000000..b93f03bd --- /dev/null +++ b/python-mega-algo/project_euler/problem_112/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/project_euler/problem_112 + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    sol1.py __init__.py 
    + +

    +Folders: 1
    +Files: 2
    +Size of all files: 2750 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/project_euler/problem_112/sol1.py b/python-mega-algo/project_euler/problem_112/sol1.py new file mode 100644 index 00000000..450dc516 --- /dev/null +++ b/python-mega-algo/project_euler/problem_112/sol1.py @@ -0,0 +1,89 @@ +""" +Problem 112: https://projecteuler.net/problem=112 + +Working from left-to-right if no digit is exceeded by the digit to its left it is +called an increasing number; for example, 134468. +Similarly if no digit is exceeded by the digit to its right it is called a decreasing +number; for example, 66420. +We shall call a positive integer that is neither increasing nor decreasing a "bouncy" +number, for example, 155349. +Clearly there cannot be any bouncy numbers below one-hundred, but just over half of +the numbers below one-thousand (525) are bouncy. In fact, the least number for which +the proportion of bouncy numbers first reaches 50% is 538. +Surprisingly, bouncy numbers become more and more common and by the time we reach +21780 the proportion of bouncy numbers is equal to 90%. + +Find the least number for which the proportion of bouncy numbers is exactly 99%. +""" + + +def check_bouncy(n: int) -> bool: + """ + Returns True if number is bouncy, False otherwise + >>> check_bouncy(6789) + False + >>> check_bouncy(-12345) + False + >>> check_bouncy(0) + False + >>> check_bouncy(6.74) + Traceback (most recent call last): + ... + ValueError: check_bouncy() accepts only integer arguments + >>> check_bouncy(132475) + True + >>> check_bouncy(34) + False + >>> check_bouncy(341) + True + >>> check_bouncy(47) + False + >>> check_bouncy(-12.54) + Traceback (most recent call last): + ... + ValueError: check_bouncy() accepts only integer arguments + >>> check_bouncy(-6548) + True + """ + if not isinstance(n, int): + raise ValueError("check_bouncy() accepts only integer arguments") + return "".join(sorted(str(n))) != str(n) and "".join(sorted(str(n)))[::-1] != str(n) + + +def solution(percent: float = 99) -> int: + """ + Returns the least number for which the proportion of bouncy numbers is + exactly 'percent' + >>> solution(50) + 538 + >>> solution(90) + 21780 + >>> solution(80) + 4770 + >>> solution(105) + Traceback (most recent call last): + ... + ValueError: solution() only accepts values from 0 to 100 + >>> solution(100.011) + Traceback (most recent call last): + ... + ValueError: solution() only accepts values from 0 to 100 + """ + if not 0 < percent < 100: + raise ValueError("solution() only accepts values from 0 to 100") + bouncy_num = 0 + num = 1 + + while True: + if check_bouncy(num): + bouncy_num += 1 + if (bouncy_num / num) * 100 >= percent: + return num + num += 1 + + +if __name__ == "__main__": + from doctest import testmod + + testmod() + print(f"{solution(99)}") diff --git a/python-mega-algo/project_euler/problem_113/__init__.py b/python-mega-algo/project_euler/problem_113/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/project_euler/problem_113/right.html b/python-mega-algo/project_euler/problem_113/right.html new file mode 100644 index 00000000..2e3fc894 --- /dev/null +++ b/python-mega-algo/project_euler/problem_113/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/project_euler/problem_113 + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    sol1.py __init__.py 
    + +

    +Folders: 1
    +Files: 2
    +Size of all files: 1872 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/project_euler/problem_113/sol1.py b/python-mega-algo/project_euler/problem_113/sol1.py new file mode 100644 index 00000000..951d9b49 --- /dev/null +++ b/python-mega-algo/project_euler/problem_113/sol1.py @@ -0,0 +1,75 @@ +""" +Project Euler Problem 113: https://projecteuler.net/problem=113 + +Working from left-to-right if no digit is exceeded by the digit to its left it is +called an increasing number; for example, 134468. + +Similarly if no digit is exceeded by the digit to its right it is called a decreasing +number; for example, 66420. + +We shall call a positive integer that is neither increasing nor decreasing a +"bouncy" number; for example, 155349. + +As n increases, the proportion of bouncy numbers below n increases such that there +are only 12951 numbers below one-million that are not bouncy and only 277032 +non-bouncy numbers below 10^10. + +How many numbers below a googol (10^100) are not bouncy? +""" + + +def choose(n: int, r: int) -> int: + """ + Calculate the binomial coefficient c(n,r) using the multiplicative formula. + >>> choose(4,2) + 6 + >>> choose(5,3) + 10 + >>> choose(20,6) + 38760 + """ + ret = 1.0 + for i in range(1, r + 1): + ret *= (n + 1 - i) / i + return round(ret) + + +def non_bouncy_exact(n: int) -> int: + """ + Calculate the number of non-bouncy numbers with at most n digits. + >>> non_bouncy_exact(1) + 9 + >>> non_bouncy_exact(6) + 7998 + >>> non_bouncy_exact(10) + 136126 + """ + return choose(8 + n, n) + choose(9 + n, n) - 10 + + +def non_bouncy_upto(n: int) -> int: + """ + Calculate the number of non-bouncy numbers with at most n digits. + >>> non_bouncy_upto(1) + 9 + >>> non_bouncy_upto(6) + 12951 + >>> non_bouncy_upto(10) + 277032 + """ + return sum(non_bouncy_exact(i) for i in range(1, n + 1)) + + +def solution(num_digits: int = 100) -> int: + """ + Caclulate the number of non-bouncy numbers less than a googol. + >>> solution(6) + 12951 + >>> solution(10) + 277032 + """ + return non_bouncy_upto(num_digits) + + +if __name__ == "__main__": + print(f"{solution() = }") diff --git a/python-mega-algo/project_euler/problem_119/__init__.py b/python-mega-algo/project_euler/problem_119/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/project_euler/problem_119/right.html b/python-mega-algo/project_euler/problem_119/right.html new file mode 100644 index 00000000..d075341e --- /dev/null +++ b/python-mega-algo/project_euler/problem_119/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/project_euler/problem_119 + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    sol1.py __init__.py 
    + +

    +Folders: 1
    +Files: 2
    +Size of all files: 1240 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/project_euler/problem_119/sol1.py b/python-mega-algo/project_euler/problem_119/sol1.py new file mode 100644 index 00000000..7f343ac2 --- /dev/null +++ b/python-mega-algo/project_euler/problem_119/sol1.py @@ -0,0 +1,51 @@ +""" +Problem 119: https://projecteuler.net/problem=119 + +Name: Digit power sum + +The number 512 is interesting because it is equal to the sum of its digits +raised to some power: 5 + 1 + 2 = 8, and 8^3 = 512. Another example of a number +with this property is 614656 = 28^4. We shall define an to be the nth term of +this sequence and insist that a number must contain at least two digits to have a sum. +You are given that a2 = 512 and a10 = 614656. Find a30 +""" + +import math + + +def digit_sum(n: int) -> int: + """ + Returns the sum of the digits of the number. + >>> digit_sum(123) + 6 + >>> digit_sum(456) + 15 + >>> digit_sum(78910) + 25 + """ + return sum([int(digit) for digit in str(n)]) + + +def solution(n: int = 30) -> int: + """ + Returns the value of 30th digit power sum. + >>> solution(2) + 512 + >>> solution(5) + 5832 + >>> solution(10) + 614656 + """ + digit_to_powers = [] + for digit in range(2, 100): + for power in range(2, 100): + number = int(math.pow(digit, power)) + if digit == digit_sum(number): + digit_to_powers.append(number) + + digit_to_powers.sort() + return digit_to_powers[n - 1] + + +if __name__ == "__main__": + print(solution()) diff --git a/python-mega-algo/project_euler/problem_120/__init__.py b/python-mega-algo/project_euler/problem_120/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/project_euler/problem_120/right.html b/python-mega-algo/project_euler/problem_120/right.html new file mode 100644 index 00000000..9ddfae20 --- /dev/null +++ b/python-mega-algo/project_euler/problem_120/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/project_euler/problem_120 + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    sol1.py __init__.py 
    + +

    +Folders: 1
    +Files: 2
    +Size of all files: 826 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/project_euler/problem_120/sol1.py b/python-mega-algo/project_euler/problem_120/sol1.py new file mode 100644 index 00000000..0e682121 --- /dev/null +++ b/python-mega-algo/project_euler/problem_120/sol1.py @@ -0,0 +1,32 @@ +""" +Problem 120 Square remainders: https://projecteuler.net/problem=120 + +Description: + +Let r be the remainder when (a−1)^n + (a+1)^n is divided by a^2. +For example, if a = 7 and n = 3, then r = 42: 6^3 + 8^3 = 728 ≡ 42 mod 49. +And as n varies, so too will r, but for a = 7 it turns out that r_max = 42. +For 3 ≤ a ≤ 1000, find ∑ r_max. + +Solution: + +On expanding the terms, we get 2 if n is even and 2an if n is odd. +For maximizing the value, 2an < a*a => n <= (a - 1)/2 (integer division) +""" + + +def solution(n: int = 1000) -> int: + """ + Returns ∑ r_max for 3 <= a <= n as explained above + >>> solution(10) + 300 + >>> solution(100) + 330750 + >>> solution(1000) + 333082500 + """ + return sum(2 * a * ((a - 1) // 2) for a in range(3, n + 1)) + + +if __name__ == "__main__": + print(solution()) diff --git a/python-mega-algo/project_euler/problem_121/__init__.py b/python-mega-algo/project_euler/problem_121/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/project_euler/problem_121/right.html b/python-mega-algo/project_euler/problem_121/right.html new file mode 100644 index 00000000..2eb475c3 --- /dev/null +++ b/python-mega-algo/project_euler/problem_121/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/project_euler/problem_121 + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    sol1.py __init__.py 
    + +

    +Folders: 1
    +Files: 2
    +Size of all files: 2066 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/project_euler/problem_121/sol1.py b/python-mega-algo/project_euler/problem_121/sol1.py new file mode 100644 index 00000000..93679cf4 --- /dev/null +++ b/python-mega-algo/project_euler/problem_121/sol1.py @@ -0,0 +1,64 @@ +""" +A bag contains one red disc and one blue disc. In a game of chance a player takes a +disc at random and its colour is noted. After each turn the disc is returned to the +bag, an extra red disc is added, and another disc is taken at random. + +The player pays £1 to play and wins if they have taken more blue discs than red +discs at the end of the game. + +If the game is played for four turns, the probability of a player winning is exactly +11/120, and so the maximum prize fund the banker should allocate for winning in this +game would be £10 before they would expect to incur a loss. Note that any payout will +be a whole number of pounds and also includes the original £1 paid to play the game, +so in the example given the player actually wins £9. + +Find the maximum prize fund that should be allocated to a single game in which +fifteen turns are played. + + +Solution: + For each 15-disc sequence of red and blue for which there are more red than blue, + we calculate the probability of that sequence and add it to the total probability + of the player winning. The inverse of this probability gives an upper bound for + the prize if the banker wants to avoid an expected loss. +""" + +from itertools import product + + +def solution(num_turns: int = 15) -> int: + """ + Find the maximum prize fund that should be allocated to a single game in which + fifteen turns are played. + >>> solution(4) + 10 + >>> solution(10) + 225 + """ + total_prob: float = 0.0 + prob: float + num_blue: int + num_red: int + ind: int + col: int + series: tuple[int, ...] + + for series in product(range(2), repeat=num_turns): + num_blue = series.count(1) + num_red = num_turns - num_blue + if num_red >= num_blue: + continue + prob = 1.0 + for ind, col in enumerate(series, 2): + if col == 0: + prob *= (ind - 1) / ind + else: + prob *= 1 / ind + + total_prob += prob + + return int(1 / total_prob) + + +if __name__ == "__main__": + print(f"{solution() = }") diff --git a/python-mega-algo/project_euler/problem_123/__init__.py b/python-mega-algo/project_euler/problem_123/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/project_euler/problem_123/right.html b/python-mega-algo/project_euler/problem_123/right.html new file mode 100644 index 00000000..441d1bcd --- /dev/null +++ b/python-mega-algo/project_euler/problem_123/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/project_euler/problem_123 + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    sol1.py __init__.py 
    + +

    +Folders: 1
    +Files: 2
    +Size of all files: 2273 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/project_euler/problem_123/sol1.py b/python-mega-algo/project_euler/problem_123/sol1.py new file mode 100644 index 00000000..85350c8b --- /dev/null +++ b/python-mega-algo/project_euler/problem_123/sol1.py @@ -0,0 +1,99 @@ +""" +Problem 123: https://projecteuler.net/problem=123 + +Name: Prime square remainders + +Let pn be the nth prime: 2, 3, 5, 7, 11, ..., and +let r be the remainder when (pn−1)^n + (pn+1)^n is divided by pn^2. + +For example, when n = 3, p3 = 5, and 43 + 63 = 280 ≡ 5 mod 25. +The least value of n for which the remainder first exceeds 10^9 is 7037. + +Find the least value of n for which the remainder first exceeds 10^10. + + +Solution: + +n=1: (p-1) + (p+1) = 2p +n=2: (p-1)^2 + (p+1)^2 + = p^2 + 1 - 2p + p^2 + 1 + 2p (Using (p+b)^2 = (p^2 + b^2 + 2pb), + (p-b)^2 = (p^2 + b^2 - 2pb) and b = 1) + = 2p^2 + 2 +n=3: (p-1)^3 + (p+1)^3 (Similarly using (p+b)^3 & (p-b)^3 formula and so on) + = 2p^3 + 6p +n=4: 2p^4 + 12p^2 + 2 +n=5: 2p^5 + 20p^3 + 10p + +As you could see, when the expression is divided by p^2. +Except for the last term, the rest will result in the remainder 0. + +n=1: 2p +n=2: 2 +n=3: 6p +n=4: 2 +n=5: 10p + +So it could be simplified as, + r = 2pn when n is odd + r = 2 when n is even. +""" + +from typing import Dict, Generator + + +def sieve() -> Generator[int, None, None]: + """ + Returns a prime number generator using sieve method. + >>> type(sieve()) + + >>> primes = sieve() + >>> next(primes) + 2 + >>> next(primes) + 3 + >>> next(primes) + 5 + >>> next(primes) + 7 + >>> next(primes) + 11 + >>> next(primes) + 13 + """ + factor_map: Dict[int, int] = {} + prime = 2 + while True: + factor = factor_map.pop(prime, None) + if factor: + x = factor + prime + while x in factor_map: + x += factor + factor_map[x] = factor + else: + factor_map[prime * prime] = prime + yield prime + prime += 1 + + +def solution(limit: float = 1e10) -> int: + """ + Returns the least value of n for which the remainder first exceeds 10^10. + >>> solution(1e8) + 2371 + >>> solution(1e9) + 7037 + """ + primes = sieve() + + n = 1 + while True: + prime = next(primes) + if (2 * prime * n) > limit: + return n + # Ignore the next prime as the reminder will be 2. + next(primes) + n += 2 + + +if __name__ == "__main__": + print(solution()) diff --git a/python-mega-algo/project_euler/problem_125/__init__.py b/python-mega-algo/project_euler/problem_125/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/project_euler/problem_125/right.html b/python-mega-algo/project_euler/problem_125/right.html new file mode 100644 index 00000000..1aff6bee --- /dev/null +++ b/python-mega-algo/project_euler/problem_125/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/project_euler/problem_125 + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    sol1.py __init__.py 
    + +

    +Folders: 1
    +Files: 2
    +Size of all files: 1566 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/project_euler/problem_125/sol1.py b/python-mega-algo/project_euler/problem_125/sol1.py new file mode 100644 index 00000000..afc1f289 --- /dev/null +++ b/python-mega-algo/project_euler/problem_125/sol1.py @@ -0,0 +1,56 @@ +""" +Problem 125: https://projecteuler.net/problem=125 + +The palindromic number 595 is interesting because it can be written as the sum +of consecutive squares: 6^2 + 7^2 + 8^2 + 9^2 + 10^2 + 11^2 + 12^2. + +There are exactly eleven palindromes below one-thousand that can be written as +consecutive square sums, and the sum of these palindromes is 4164. Note that +1 = 0^2 + 1^2 has not been included as this problem is concerned with the +squares of positive integers. + +Find the sum of all the numbers less than 10^8 that are both palindromic and can +be written as the sum of consecutive squares. +""" + + +def is_palindrome(n: int) -> bool: + """ + Check if an integer is palindromic. + >>> is_palindrome(12521) + True + >>> is_palindrome(12522) + False + >>> is_palindrome(12210) + False + """ + if n % 10 == 0: + return False + s = str(n) + return s == s[::-1] + + +def solution() -> int: + """ + Returns the sum of all numbers less than 1e8 that are both palindromic and + can be written as the sum of consecutive squares. + """ + LIMIT = 10 ** 8 + answer = set() + first_square = 1 + sum_squares = 5 + while sum_squares < LIMIT: + last_square = first_square + 1 + while sum_squares < LIMIT: + if is_palindrome(sum_squares): + answer.add(sum_squares) + last_square += 1 + sum_squares += last_square ** 2 + first_square += 1 + sum_squares = first_square ** 2 + (first_square + 1) ** 2 + + return sum(answer) + + +if __name__ == "__main__": + print(solution()) diff --git a/python-mega-algo/project_euler/problem_129/__init__.py b/python-mega-algo/project_euler/problem_129/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/project_euler/problem_129/right.html b/python-mega-algo/project_euler/problem_129/right.html new file mode 100644 index 00000000..19ec5621 --- /dev/null +++ b/python-mega-algo/project_euler/problem_129/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/project_euler/problem_129 + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    sol1.py __init__.py 
    + +

    +Folders: 1
    +Files: 2
    +Size of all files: 1538 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/project_euler/problem_129/sol1.py b/python-mega-algo/project_euler/problem_129/sol1.py new file mode 100644 index 00000000..8afe82df --- /dev/null +++ b/python-mega-algo/project_euler/problem_129/sol1.py @@ -0,0 +1,57 @@ +""" +Project Euler Problem 129: https://projecteuler.net/problem=129 + +A number consisting entirely of ones is called a repunit. We shall define R(k) to be +a repunit of length k; for example, R(6) = 111111. + +Given that n is a positive integer and GCD(n, 10) = 1, it can be shown that there +always exists a value, k, for which R(k) is divisible by n, and let A(n) be the least +such value of k; for example, A(7) = 6 and A(41) = 5. + +The least value of n for which A(n) first exceeds ten is 17. + +Find the least value of n for which A(n) first exceeds one-million. +""" + + +def least_divisible_repunit(divisor: int) -> int: + """ + Return the least value k such that the Repunit of length k is divisible by divisor. + >>> least_divisible_repunit(7) + 6 + >>> least_divisible_repunit(41) + 5 + >>> least_divisible_repunit(1234567) + 34020 + """ + if divisor % 5 == 0 or divisor % 2 == 0: + return 0 + repunit = 1 + repunit_index = 1 + while repunit: + repunit = (10 * repunit + 1) % divisor + repunit_index += 1 + return repunit_index + + +def solution(limit: int = 1000000) -> int: + """ + Return the least value of n for which least_divisible_repunit(n) + first exceeds limit. + >>> solution(10) + 17 + >>> solution(100) + 109 + >>> solution(1000) + 1017 + """ + divisor = limit - 1 + if divisor % 2 == 0: + divisor += 1 + while least_divisible_repunit(divisor) <= limit: + divisor += 2 + return divisor + + +if __name__ == "__main__": + print(f"{solution() = }") diff --git a/python-mega-algo/project_euler/problem_135/__init__.py b/python-mega-algo/project_euler/problem_135/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/project_euler/problem_135/right.html b/python-mega-algo/project_euler/problem_135/right.html new file mode 100644 index 00000000..2314dc80 --- /dev/null +++ b/python-mega-algo/project_euler/problem_135/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/project_euler/problem_135 + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    sol1.py __init__.py 
    + +

    +Folders: 1
    +Files: 2
    +Size of all files: 1768 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/project_euler/problem_135/sol1.py b/python-mega-algo/project_euler/problem_135/sol1.py new file mode 100644 index 00000000..d71a0439 --- /dev/null +++ b/python-mega-algo/project_euler/problem_135/sol1.py @@ -0,0 +1,61 @@ +""" +Project Euler Problem 135: https://projecteuler.net/problem=135 + +Given the positive integers, x, y, and z, +are consecutive terms of an arithmetic progression, +the least value of the positive integer, n, +for which the equation, +x2 − y2 − z2 = n, has exactly two solutions is n = 27: + +342 − 272 − 202 = 122 − 92 − 62 = 27 + +It turns out that n = 1155 is the least value +which has exactly ten solutions. + +How many values of n less than one million +have exactly ten distinct solutions? + + +Taking x,y,z of the form a+d,a,a-d respectively, +the given equation reduces to a*(4d-a)=n. +Calculating no of solutions for every n till 1 million by fixing a +,and n must be multiple of a. +Total no of steps=n*(1/1+1/2+1/3+1/4..+1/n) +,so roughly O(nlogn) time complexity. + +""" + + +def solution(limit: int = 1000000) -> int: + """ + returns the values of n less than or equal to the limit + have exactly ten distinct solutions. + >>> solution(100) + 0 + >>> solution(10000) + 45 + >>> solution(50050) + 292 + """ + limit = limit + 1 + frequency = [0] * limit + for first_term in range(1, limit): + for n in range(first_term, limit, first_term): + common_difference = first_term + n / first_term + if common_difference % 4: # d must be divisble by 4 + continue + else: + common_difference /= 4 + if ( + first_term > common_difference + and first_term < 4 * common_difference + ): # since x,y,z are positive integers + frequency[n] += 1 # so z>0 and a>d ,also 4d
    + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/project_euler/problem_173 + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    sol1.py __init__.py 
    + +

    +Folders: 1
    +Files: 2
    +Size of all files: 1231 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/project_euler/problem_173/sol1.py b/python-mega-algo/project_euler/problem_173/sol1.py new file mode 100644 index 00000000..d539b143 --- /dev/null +++ b/python-mega-algo/project_euler/problem_173/sol1.py @@ -0,0 +1,41 @@ +""" +Project Euler Problem 173: https://projecteuler.net/problem=173 + +We shall define a square lamina to be a square outline with a square "hole" so that +the shape possesses vertical and horizontal symmetry. For example, using exactly +thirty-two square tiles we can form two different square laminae: + +With one-hundred tiles, and not necessarily using all of the tiles at one time, it is +possible to form forty-one different square laminae. + +Using up to one million tiles how many different square laminae can be formed? +""" + + +from math import ceil, sqrt + + +def solution(limit: int = 1000000) -> int: + """ + Return the number of different square laminae that can be formed using up to + one million tiles. + >>> solution(100) + 41 + """ + answer = 0 + + for outer_width in range(3, (limit // 4) + 2): + if outer_width ** 2 > limit: + hole_width_lower_bound = max(ceil(sqrt(outer_width ** 2 - limit)), 1) + else: + hole_width_lower_bound = 1 + if (outer_width - hole_width_lower_bound) % 2: + hole_width_lower_bound += 1 + + answer += (outer_width - hole_width_lower_bound - 2) // 2 + 1 + + return answer + + +if __name__ == "__main__": + print(f"{solution() = }") diff --git a/python-mega-algo/project_euler/problem_174/__init__.py b/python-mega-algo/project_euler/problem_174/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/project_euler/problem_174/right.html b/python-mega-algo/project_euler/problem_174/right.html new file mode 100644 index 00000000..97e02d15 --- /dev/null +++ b/python-mega-algo/project_euler/problem_174/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/project_euler/problem_174 + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    sol1.py __init__.py 
    + +

    +Folders: 1
    +Files: 2
    +Size of all files: 1573 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/project_euler/problem_174/sol1.py b/python-mega-algo/project_euler/problem_174/sol1.py new file mode 100644 index 00000000..cbc0df5a --- /dev/null +++ b/python-mega-algo/project_euler/problem_174/sol1.py @@ -0,0 +1,52 @@ +""" +Project Euler Problem 174: https://projecteuler.net/problem=174 + +We shall define a square lamina to be a square outline with a square "hole" so that +the shape possesses vertical and horizontal symmetry. + +Given eight tiles it is possible to form a lamina in only one way: 3x3 square with a +1x1 hole in the middle. However, using thirty-two tiles it is possible to form two +distinct laminae. + +If t represents the number of tiles used, we shall say that t = 8 is type L(1) and +t = 32 is type L(2). + +Let N(n) be the number of t ≤ 1000000 such that t is type L(n); for example, +N(15) = 832. + +What is ∑ N(n) for 1 ≤ n ≤ 10? +""" + +from collections import defaultdict +from math import ceil, sqrt + + +def solution(t_limit: int = 1000000, n_limit: int = 10) -> int: + """ + Return the sum of N(n) for 1 <= n <= n_limit. + + >>> solution(1000,5) + 249 + >>> solution(10000,10) + 2383 + """ + count: defaultdict = defaultdict(int) + + for outer_width in range(3, (t_limit // 4) + 2): + if outer_width * outer_width > t_limit: + hole_width_lower_bound = max( + ceil(sqrt(outer_width * outer_width - t_limit)), 1 + ) + else: + hole_width_lower_bound = 1 + + hole_width_lower_bound += (outer_width - hole_width_lower_bound) % 2 + + for hole_width in range(hole_width_lower_bound, outer_width - 1, 2): + count[outer_width * outer_width - hole_width * hole_width] += 1 + + return sum(1 for n in count.values() if 1 <= n <= 10) + + +if __name__ == "__main__": + print(f"{solution() = }") diff --git a/python-mega-algo/project_euler/problem_180/__init__.py b/python-mega-algo/project_euler/problem_180/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/project_euler/problem_180/right.html b/python-mega-algo/project_euler/problem_180/right.html new file mode 100644 index 00000000..e01470f1 --- /dev/null +++ b/python-mega-algo/project_euler/problem_180/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/project_euler/problem_180 + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    sol1.py __init__.py 
    + +

    +Folders: 1
    +Files: 2
    +Size of all files: 5757 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/project_euler/problem_180/sol1.py b/python-mega-algo/project_euler/problem_180/sol1.py new file mode 100644 index 00000000..6112db2e --- /dev/null +++ b/python-mega-algo/project_euler/problem_180/sol1.py @@ -0,0 +1,174 @@ +""" +Project Euler Problem 234: https://projecteuler.net/problem=234 + +For any integer n, consider the three functions + +f1,n(x,y,z) = x^(n+1) + y^(n+1) - z^(n+1) +f2,n(x,y,z) = (xy + yz + zx)*(x^(n-1) + y^(n-1) - z^(n-1)) +f3,n(x,y,z) = xyz*(xn-2 + yn-2 - zn-2) + +and their combination + +fn(x,y,z) = f1,n(x,y,z) + f2,n(x,y,z) - f3,n(x,y,z) + +We call (x,y,z) a golden triple of order k if x, y, and z are all rational numbers +of the form a / b with 0 < a < b ≤ k and there is (at least) one integer n, +so that fn(x,y,z) = 0. + +Let s(x,y,z) = x + y + z. +Let t = u / v be the sum of all distinct s(x,y,z) for all golden triples +(x,y,z) of order 35. +All the s(x,y,z) and t must be in reduced form. + +Find u + v. + + +Solution: + +By expanding the brackets it is easy to show that +fn(x, y, z) = (x + y + z) * (x^n + y^n - z^n). + +Since x,y,z are positive, the requirement fn(x, y, z) = 0 is fulfilled if and +only if x^n + y^n = z^n. + +By Fermat's Last Theorem, this means that the absolute value of n can not +exceed 2, i.e. n is in {-2, -1, 0, 1, 2}. We can eliminate n = 0 since then the +equation would reduce to 1 + 1 = 1, for which there are no solutions. + +So all we have to do is iterate through the possible numerators and denominators +of x and y, calculate the corresponding z, and check if the corresponding numerator and +denominator are integer and satisfy 0 < z_num < z_den <= 0. We use a set "uniquq_s" +to make sure there are no duplicates, and the fractions.Fraction class to make sure +we get the right numerator and denominator. + +Reference: +https://en.wikipedia.org/wiki/Fermat%27s_Last_Theorem +""" + + +from fractions import Fraction +from math import gcd, sqrt +from typing import Tuple + + +def is_sq(number: int) -> bool: + """ + Check if number is a perfect square. + + >>> is_sq(1) + True + >>> is_sq(1000001) + False + >>> is_sq(1000000) + True + """ + sq: int = int(number ** 0.5) + return number == sq * sq + + +def add_three( + x_num: int, x_den: int, y_num: int, y_den: int, z_num: int, z_den: int +) -> Tuple[int, int]: + """ + Given the numerators and denominators of three fractions, return the + numerator and denominator of their sum in lowest form. + >>> add_three(1, 3, 1, 3, 1, 3) + (1, 1) + >>> add_three(2, 5, 4, 11, 12, 3) + (262, 55) + """ + top: int = x_num * y_den * z_den + y_num * x_den * z_den + z_num * x_den * y_den + bottom: int = x_den * y_den * z_den + hcf: int = gcd(top, bottom) + top //= hcf + bottom //= hcf + return top, bottom + + +def solution(order: int = 35) -> int: + """ + Find the sum of the numerator and denominator of the sum of all s(x,y,z) for + golden triples (x,y,z) of the given order. + + >>> solution(5) + 296 + >>> solution(10) + 12519 + >>> solution(20) + 19408891927 + """ + unique_s: set = set() + hcf: int + total: Fraction = Fraction(0) + fraction_sum: Tuple[int, int] + + for x_num in range(1, order + 1): + for x_den in range(x_num + 1, order + 1): + for y_num in range(1, order + 1): + for y_den in range(y_num + 1, order + 1): + # n=1 + z_num = x_num * y_den + x_den * y_num + z_den = x_den * y_den + hcf = gcd(z_num, z_den) + z_num //= hcf + z_den //= hcf + if 0 < z_num < z_den <= order: + fraction_sum = add_three( + x_num, x_den, y_num, y_den, z_num, z_den + ) + unique_s.add(fraction_sum) + + # n=2 + z_num = ( + x_num * x_num * y_den * y_den + x_den * x_den * y_num * y_num + ) + z_den = x_den * x_den * y_den * y_den + if is_sq(z_num) and is_sq(z_den): + z_num = int(sqrt(z_num)) + z_den = int(sqrt(z_den)) + hcf = gcd(z_num, z_den) + z_num //= hcf + z_den //= hcf + if 0 < z_num < z_den <= order: + fraction_sum = add_three( + x_num, x_den, y_num, y_den, z_num, z_den + ) + unique_s.add(fraction_sum) + + # n=-1 + z_num = x_num * y_num + z_den = x_den * y_num + x_num * y_den + hcf = gcd(z_num, z_den) + z_num //= hcf + z_den //= hcf + if 0 < z_num < z_den <= order: + fraction_sum = add_three( + x_num, x_den, y_num, y_den, z_num, z_den + ) + unique_s.add(fraction_sum) + + # n=2 + z_num = x_num * x_num * y_num * y_num + z_den = ( + x_den * x_den * y_num * y_num + x_num * x_num * y_den * y_den + ) + if is_sq(z_num) and is_sq(z_den): + z_num = int(sqrt(z_num)) + z_den = int(sqrt(z_den)) + hcf = gcd(z_num, z_den) + z_num //= hcf + z_den //= hcf + if 0 < z_num < z_den <= order: + fraction_sum = add_three( + x_num, x_den, y_num, y_den, z_num, z_den + ) + unique_s.add(fraction_sum) + + for num, den in unique_s: + total += Fraction(num, den) + + return total.denominator + total.numerator + + +if __name__ == "__main__": + print(f"{solution() = }") diff --git a/python-mega-algo/project_euler/problem_188/__init__.py b/python-mega-algo/project_euler/problem_188/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/project_euler/problem_188/right.html b/python-mega-algo/project_euler/problem_188/right.html new file mode 100644 index 00000000..e7ff9f81 --- /dev/null +++ b/python-mega-algo/project_euler/problem_188/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/project_euler/problem_188 + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    sol1.py __init__.py 
    + +

    +Folders: 1
    +Files: 2
    +Size of all files: 1802 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/project_euler/problem_188/sol1.py b/python-mega-algo/project_euler/problem_188/sol1.py new file mode 100644 index 00000000..6473c636 --- /dev/null +++ b/python-mega-algo/project_euler/problem_188/sol1.py @@ -0,0 +1,68 @@ +""" +Project Euler Problem 188: https://projecteuler.net/problem=188 + +The hyperexponentiation of a number + +The hyperexponentiation or tetration of a number a by a positive integer b, +denoted by a↑↑b or b^a, is recursively defined by: + +a↑↑1 = a, +a↑↑(k+1) = a(a↑↑k). + +Thus we have e.g. 3↑↑2 = 3^3 = 27, hence 3↑↑3 = 3^27 = 7625597484987 and +3↑↑4 is roughly 103.6383346400240996*10^12. + +Find the last 8 digits of 1777↑↑1855. + +References: + - https://en.wikipedia.org/wiki/Tetration +""" + + +# small helper function for modular exponentiation +def _modexpt(base: int, exponent: int, modulo_value: int) -> int: + """ + Returns the modular exponentiation, that is the value + of `base ** exponent % modulo_value`, without calculating + the actual number. + >>> _modexpt(2, 4, 10) + 6 + >>> _modexpt(2, 1024, 100) + 16 + >>> _modexpt(13, 65535, 7) + 6 + """ + + if exponent == 1: + return base + if exponent % 2 == 0: + x = _modexpt(base, exponent / 2, modulo_value) % modulo_value + return (x * x) % modulo_value + else: + return (base * _modexpt(base, exponent - 1, modulo_value)) % modulo_value + + +def solution(base: int = 1777, height: int = 1855, digits: int = 8) -> int: + """ + Returns the last 8 digits of the hyperexponentiation of base by + height, i.e. the number base↑↑height: + + >>> solution(base=3, height=2) + 27 + >>> solution(base=3, height=3) + 97484987 + >>> solution(base=123, height=456, digits=4) + 2547 + """ + + # calculate base↑↑height by right-assiciative repeated modular + # exponentiation + result = base + for i in range(1, height): + result = _modexpt(base, result, 10 ** digits) + + return result + + +if __name__ == "__main__": + print(f"{solution() = }") diff --git a/python-mega-algo/project_euler/problem_191/__init__.py b/python-mega-algo/project_euler/problem_191/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/project_euler/problem_191/right.html b/python-mega-algo/project_euler/problem_191/right.html new file mode 100644 index 00000000..14b22a2d --- /dev/null +++ b/python-mega-algo/project_euler/problem_191/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/project_euler/problem_191 + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    sol1.py __init__.py 
    + +

    +Folders: 1
    +Files: 2
    +Size of all files: 3193 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/project_euler/problem_191/sol1.py b/python-mega-algo/project_euler/problem_191/sol1.py new file mode 100644 index 00000000..38325b36 --- /dev/null +++ b/python-mega-algo/project_euler/problem_191/sol1.py @@ -0,0 +1,105 @@ +""" +Prize Strings +Problem 191 + +A particular school offers cash rewards to children with good attendance and +punctuality. If they are absent for three consecutive days or late on more +than one occasion then they forfeit their prize. + +During an n-day period a trinary string is formed for each child consisting +of L's (late), O's (on time), and A's (absent). + +Although there are eighty-one trinary strings for a 4-day period that can be +formed, exactly forty-three strings would lead to a prize: + +OOOO OOOA OOOL OOAO OOAA OOAL OOLO OOLA OAOO OAOA +OAOL OAAO OAAL OALO OALA OLOO OLOA OLAO OLAA AOOO +AOOA AOOL AOAO AOAA AOAL AOLO AOLA AAOO AAOA AAOL +AALO AALA ALOO ALOA ALAO ALAA LOOO LOOA LOAO LOAA +LAOO LAOA LAAO + +How many "prize" strings exist over a 30-day period? + +References: + - The original Project Euler project page: + https://projecteuler.net/problem=191 +""" + + +cache = {} + + +def _calculate(days: int, absent: int, late: int) -> int: + """ + A small helper function for the recursion, mainly to have + a clean interface for the solution() function below. + + It should get called with the number of days (corresponding + to the desired length of the 'prize strings'), and the + initial values for the number of consecutive absent days and + number of total late days. + + >>> _calculate(days=4, absent=0, late=0) + 43 + >>> _calculate(days=30, absent=2, late=0) + 0 + >>> _calculate(days=30, absent=1, late=0) + 98950096 + """ + + # if we are absent twice, or late 3 consecutive days, + # no further prize strings are possible + if late == 3 or absent == 2: + return 0 + + # if we have no days left, and have not failed any other rules, + # we have a prize string + if days == 0: + return 1 + + # No easy solution, so now we need to do the recursive calculation + + # First, check if the combination is already in the cache, and + # if yes, return the stored value from there since we already + # know the number of possible prize strings from this point on + key = (days, absent, late) + if key in cache: + return cache[key] + + # now we calculate the three possible ways that can unfold from + # this point on, depending on our attendance today + + # 1) if we are late (but not absent), the "absent" counter stays as + # it is, but the "late" counter increases by one + state_late = _calculate(days - 1, absent, late + 1) + + # 2) if we are absent, the "absent" counter increases by 1, and the + # "late" counter resets to 0 + state_absent = _calculate(days - 1, absent + 1, 0) + + # 3) if we are on time, this resets the "late" counter and keeps the + # absent counter + state_ontime = _calculate(days - 1, absent, 0) + + prizestrings = state_late + state_absent + state_ontime + + cache[key] = prizestrings + return prizestrings + + +def solution(days: int = 30) -> int: + """ + Returns the number of possible prize strings for a particular number + of days, using a simple recursive function with caching to speed it up. + + >>> solution() + 1918080160 + >>> solution(4) + 43 + """ + + return _calculate(days, absent=0, late=0) + + +if __name__ == "__main__": + print(solution()) diff --git a/python-mega-algo/project_euler/problem_203/__init__.py b/python-mega-algo/project_euler/problem_203/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/project_euler/problem_203/right.html b/python-mega-algo/project_euler/problem_203/right.html new file mode 100644 index 00000000..4ee550d6 --- /dev/null +++ b/python-mega-algo/project_euler/problem_203/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/project_euler/problem_203 + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    sol1.py __init__.py 
    + +

    +Folders: 1
    +Files: 2
    +Size of all files: 5797 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/project_euler/problem_203/sol1.py b/python-mega-algo/project_euler/problem_203/sol1.py new file mode 100644 index 00000000..227b476d --- /dev/null +++ b/python-mega-algo/project_euler/problem_203/sol1.py @@ -0,0 +1,188 @@ +""" +Project Euler Problem 203: https://projecteuler.net/problem=203 + +The binomial coefficients (n k) can be arranged in triangular form, Pascal's +triangle, like this: + 1 + 1 1 + 1 2 1 + 1 3 3 1 + 1 4 6 4 1 + 1 5 10 10 5 1 + 1 6 15 20 15 6 1 +1 7 21 35 35 21 7 1 + ......... + +It can be seen that the first eight rows of Pascal's triangle contain twelve +distinct numbers: 1, 2, 3, 4, 5, 6, 7, 10, 15, 20, 21 and 35. + +A positive integer n is called squarefree if no square of a prime divides n. +Of the twelve distinct numbers in the first eight rows of Pascal's triangle, +all except 4 and 20 are squarefree. The sum of the distinct squarefree numbers +in the first eight rows is 105. + +Find the sum of the distinct squarefree numbers in the first 51 rows of +Pascal's triangle. + +References: +- https://en.wikipedia.org/wiki/Pascal%27s_triangle +""" + +import math +from typing import List, Set + + +def get_pascal_triangle_unique_coefficients(depth: int) -> Set[int]: + """ + Returns the unique coefficients of a Pascal's triangle of depth "depth". + + The coefficients of this triangle are symmetric. A further improvement to this + method could be to calculate the coefficients once per level. Nonetheless, + the current implementation is fast enough for the original problem. + + >>> get_pascal_triangle_unique_coefficients(1) + {1} + >>> get_pascal_triangle_unique_coefficients(2) + {1} + >>> get_pascal_triangle_unique_coefficients(3) + {1, 2} + >>> get_pascal_triangle_unique_coefficients(8) + {1, 2, 3, 4, 5, 6, 7, 35, 10, 15, 20, 21} + """ + coefficients = {1} + previous_coefficients = [1] + for step in range(2, depth + 1): + coefficients_begins_one = previous_coefficients + [0] + coefficients_ends_one = [0] + previous_coefficients + previous_coefficients = [] + for x, y in zip(coefficients_begins_one, coefficients_ends_one): + coefficients.add(x + y) + previous_coefficients.append(x + y) + return coefficients + + +def get_primes_squared(max_number: int) -> List[int]: + """ + Calculates all primes between 2 and round(sqrt(max_number)) and returns + them squared up. + + >>> get_primes_squared(2) + [] + >>> get_primes_squared(4) + [4] + >>> get_primes_squared(10) + [4, 9] + >>> get_primes_squared(100) + [4, 9, 25, 49] + """ + max_prime = round(math.sqrt(max_number)) + non_primes = set() + primes = [] + for num in range(2, max_prime + 1): + if num in non_primes: + continue + + counter = 2 + while num * counter <= max_prime: + non_primes.add(num * counter) + counter += 1 + + primes.append(num ** 2) + return primes + + +def get_squared_primes_to_use( + num_to_look: int, squared_primes: List[int], previous_index: int +) -> int: + """ + Returns an int indicating the last index on which squares of primes + in primes are lower than num_to_look. + + This method supposes that squared_primes is sorted in ascending order and that + each num_to_look is provided in ascending order as well. Under these + assumptions, it needs a previous_index parameter that tells what was + the index returned by the method for the previous num_to_look. + + If all the elements in squared_primes are greater than num_to_look, then the + method returns -1. + + >>> get_squared_primes_to_use(1, [4, 9, 16, 25], 0) + -1 + >>> get_squared_primes_to_use(4, [4, 9, 16, 25], 0) + 1 + >>> get_squared_primes_to_use(16, [4, 9, 16, 25], 1) + 3 + """ + idx = max(previous_index, 0) + + while idx < len(squared_primes) and squared_primes[idx] <= num_to_look: + idx += 1 + + if idx == 0 and squared_primes[idx] > num_to_look: + return -1 + + if idx == len(squared_primes) and squared_primes[-1] > num_to_look: + return -1 + + return idx + + +def get_squarefree( + unique_coefficients: Set[int], squared_primes: List[int] +) -> Set[int]: + """ + Calculates the squarefree numbers inside unique_coefficients given a + list of square of primes. + + Based on the definition of a non-squarefree number, then any non-squarefree + n can be decomposed as n = p*p*r, where p is positive prime number and r + is a positive integer. + + Under the previous formula, any coefficient that is lower than p*p is + squarefree as r cannot be negative. On the contrary, if any r exists such + that n = p*p*r, then the number is non-squarefree. + + >>> get_squarefree({1}, []) + set() + >>> get_squarefree({1, 2}, []) + set() + >>> get_squarefree({1, 2, 3, 4, 5, 6, 7, 35, 10, 15, 20, 21}, [4, 9, 25]) + {1, 2, 3, 5, 6, 7, 35, 10, 15, 21} + """ + + if len(squared_primes) == 0: + return set() + + non_squarefrees = set() + prime_squared_idx = 0 + for num in sorted(unique_coefficients): + prime_squared_idx = get_squared_primes_to_use( + num, squared_primes, prime_squared_idx + ) + if prime_squared_idx == -1: + continue + if any(num % prime == 0 for prime in squared_primes[:prime_squared_idx]): + non_squarefrees.add(num) + + return unique_coefficients.difference(non_squarefrees) + + +def solution(n: int = 51) -> int: + """ + Returns the sum of squarefrees for a given Pascal's Triangle of depth n. + + >>> solution(1) + 0 + >>> solution(8) + 105 + >>> solution(9) + 175 + """ + unique_coefficients = get_pascal_triangle_unique_coefficients(n) + primes = get_primes_squared(max(unique_coefficients)) + squarefrees = get_squarefree(unique_coefficients, primes) + return sum(squarefrees) + + +if __name__ == "__main__": + print(f"{solution() = }") diff --git a/python-mega-algo/project_euler/problem_206/__init__.py b/python-mega-algo/project_euler/problem_206/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/project_euler/problem_206/right.html b/python-mega-algo/project_euler/problem_206/right.html new file mode 100644 index 00000000..66edd5e8 --- /dev/null +++ b/python-mega-algo/project_euler/problem_206/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/project_euler/problem_206 + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    sol1.py __init__.py 
    + +

    +Folders: 1
    +Files: 2
    +Size of all files: 2182 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/project_euler/problem_206/sol1.py b/python-mega-algo/project_euler/problem_206/sol1.py new file mode 100644 index 00000000..ffac2b32 --- /dev/null +++ b/python-mega-algo/project_euler/problem_206/sol1.py @@ -0,0 +1,74 @@ +""" +Project Euler Problem 206: https://projecteuler.net/problem=206 + +Find the unique positive integer whose square has the form 1_2_3_4_5_6_7_8_9_0, +where each “_†is a single digit. + +----- + +Instead of computing every single permutation of that number and going +through a 10^9 search space, we can narrow it down considerably. + +If the square ends in a 0, then the square root must also end in a 0. Thus, +the last missing digit must be 0 and the square root is a multiple of 10. +We can narrow the search space down to the first 8 digits and multiply the +result of that by 10 at the end. + +Now the last digit is a 9, which can only happen if the square root ends +in a 3 or 7. From this point, we can try one of two different methods to find +the answer: + +1. Start at the lowest possible base number whose square would be in the +format, and count up. The base we would start at is 101010103, whose square is +the closest number to 10203040506070809. Alternate counting up by 4 and 6 so +the last digit of the base is always a 3 or 7. + +2. Start at the highest possible base number whose square would be in the +format, and count down. That base would be 138902663, whose square is the +closest number to 1929394959697989. Alternate counting down by 6 and 4 so the +last digit of the base is always a 3 or 7. + +The solution does option 2 because the answer happens to be much closer to the +starting point. +""" + + +def is_square_form(num: int) -> bool: + """ + Determines if num is in the form 1_2_3_4_5_6_7_8_9 + + >>> is_square_form(1) + False + >>> is_square_form(112233445566778899) + True + >>> is_square_form(123456789012345678) + False + """ + digit = 9 + + while num > 0: + if num % 10 != digit: + return False + num //= 100 + digit -= 1 + + return True + + +def solution() -> int: + """ + Returns the first integer whose square is of the form 1_2_3_4_5_6_7_8_9_0 + """ + num = 138902663 + + while not is_square_form(num * num): + if num % 10 == 3: + num -= 6 # (3 - 6) % 10 = 7 + else: + num -= 4 # (7 - 4) % 10 = 3 + + return num * 10 + + +if __name__ == "__main__": + print(f"{solution() = }") diff --git a/python-mega-algo/project_euler/problem_207/__init__.py b/python-mega-algo/project_euler/problem_207/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/project_euler/problem_207/right.html b/python-mega-algo/project_euler/problem_207/right.html new file mode 100644 index 00000000..3b077882 --- /dev/null +++ b/python-mega-algo/project_euler/problem_207/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/project_euler/problem_207 + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    sol1.py __init__.py 
    + +

    +Folders: 1
    +Files: 2
    +Size of all files: 2805 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/project_euler/problem_207/sol1.py b/python-mega-algo/project_euler/problem_207/sol1.py new file mode 100644 index 00000000..fb901fde --- /dev/null +++ b/python-mega-algo/project_euler/problem_207/sol1.py @@ -0,0 +1,98 @@ +""" + +Project Euler Problem 207: https://projecteuler.net/problem=207 + +Problem Statement: +For some positive integers k, there exists an integer partition of the form +4**t = 2**t + k, where 4**t, 2**t, and k are all positive integers and t is a real +number. The first two such partitions are 4**1 = 2**1 + 2 and +4**1.5849625... = 2**1.5849625... + 6. +Partitions where t is also an integer are called perfect. +For any m ≥ 1 let P(m) be the proportion of such partitions that are perfect with +k ≤ m. +Thus P(6) = 1/2. +In the following table are listed some values of P(m) + + P(5) = 1/1 + P(10) = 1/2 + P(15) = 2/3 + P(20) = 1/2 + P(25) = 1/2 + P(30) = 2/5 + ... + P(180) = 1/4 + P(185) = 3/13 + +Find the smallest m for which P(m) < 1/12345 + +Solution: +Equation 4**t = 2**t + k solved for t gives: + t = log2(sqrt(4*k+1)/2 + 1/2) +For t to be real valued, sqrt(4*k+1) must be an integer which is implemented in +function check_t_real(k). For a perfect partition t must be an integer. +To speed up significantly the search for partitions, instead of incrementing k by one +per iteration, the next valid k is found by k = (i**2 - 1) / 4 with an integer i and +k has to be a positive integer. If this is the case a partition is found. The partition +is perfect if t os an integer. The integer i is increased with increment 1 until the +proportion perfect partitions / total partitions drops under the given value. + +""" + +import math + + +def check_partition_perfect(positive_integer: int) -> bool: + """ + + Check if t = f(positive_integer) = log2(sqrt(4*positive_integer+1)/2 + 1/2) is a + real number. + + >>> check_partition_perfect(2) + True + + >>> check_partition_perfect(6) + False + + """ + + exponent = math.log2(math.sqrt(4 * positive_integer + 1) / 2 + 1 / 2) + + return exponent == int(exponent) + + +def solution(max_proportion: float = 1 / 12345) -> int: + """ + Find m for which the proportion of perfect partitions to total partitions is lower + than max_proportion + + >>> solution(1) > 5 + True + + >>> solution(1/2) > 10 + True + + >>> solution(3 / 13) > 185 + True + + """ + + total_partitions = 0 + perfect_partitions = 0 + + integer = 3 + while True: + partition_candidate = (integer ** 2 - 1) / 4 + # if candidate is an integer, then there is a partition for k + if partition_candidate == int(partition_candidate): + partition_candidate = int(partition_candidate) + total_partitions += 1 + if check_partition_perfect(partition_candidate): + perfect_partitions += 1 + if perfect_partitions > 0: + if perfect_partitions / total_partitions < max_proportion: + return partition_candidate + integer += 1 + + +if __name__ == "__main__": + print(f"{solution() = }") diff --git a/python-mega-algo/project_euler/problem_234/__init__.py b/python-mega-algo/project_euler/problem_234/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/project_euler/problem_234/right.html b/python-mega-algo/project_euler/problem_234/right.html new file mode 100644 index 00000000..c7f8fee4 --- /dev/null +++ b/python-mega-algo/project_euler/problem_234/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/project_euler/problem_234 + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    sol1.py __init__.py 
    + +

    +Folders: 1
    +Files: 2
    +Size of all files: 3277 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/project_euler/problem_234/sol1.py b/python-mega-algo/project_euler/problem_234/sol1.py new file mode 100644 index 00000000..7516b164 --- /dev/null +++ b/python-mega-algo/project_euler/problem_234/sol1.py @@ -0,0 +1,119 @@ +""" +https://projecteuler.net/problem=234 + +For an integer n ≥ 4, we define the lower prime square root of n, denoted by +lps(n), as the largest prime ≤ √n and the upper prime square root of n, ups(n), +as the smallest prime ≥ √n. + +So, for example, lps(4) = 2 = ups(4), lps(1000) = 31, ups(1000) = 37. Let us +call an integer n ≥ 4 semidivisible, if one of lps(n) and ups(n) divides n, +but not both. + +The sum of the semidivisible numbers not exceeding 15 is 30, the numbers are 8, +10 and 12. 15 is not semidivisible because it is a multiple of both lps(15) = 3 +and ups(15) = 5. As a further example, the sum of the 92 semidivisible numbers +up to 1000 is 34825. + +What is the sum of all semidivisible numbers not exceeding 999966663333 ? +""" + +import math + + +def prime_sieve(n: int) -> list: + """ + Sieve of Erotosthenes + Function to return all the prime numbers up to a certain number + https://en.wikipedia.org/wiki/Sieve_of_Eratosthenes + >>> prime_sieve(3) + [2] + >>> prime_sieve(50) + [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47] + """ + is_prime = [True] * n + is_prime[0] = False + is_prime[1] = False + is_prime[2] = True + + for i in range(3, int(n ** 0.5 + 1), 2): + index = i * 2 + while index < n: + is_prime[index] = False + index = index + i + + primes = [2] + + for i in range(3, n, 2): + if is_prime[i]: + primes.append(i) + + return primes + + +def solution(limit: int = 999_966_663_333) -> int: + """ + Computes the solution to the problem up to the specified limit + >>> solution(1000) + 34825 + + >>> solution(10_000) + 1134942 + + >>> solution(100_000) + 36393008 + """ + primes_upper_bound = math.floor(math.sqrt(limit)) + 100 + primes = prime_sieve(primes_upper_bound) + + matches_sum = 0 + prime_index = 0 + last_prime = primes[prime_index] + + while (last_prime ** 2) <= limit: + next_prime = primes[prime_index + 1] + + lower_bound = last_prime ** 2 + upper_bound = next_prime ** 2 + + # Get numbers divisible by lps(current) + current = lower_bound + last_prime + while upper_bound > current <= limit: + matches_sum += current + current += last_prime + + # Reset the upper_bound + while (upper_bound - next_prime) > limit: + upper_bound -= next_prime + + # Add the numbers divisible by ups(current) + current = upper_bound - next_prime + while current > lower_bound: + matches_sum += current + current -= next_prime + + # Remove the numbers divisible by both ups and lps + current = 0 + while upper_bound > current <= limit: + if current <= lower_bound: + # Increment the current number + current += last_prime * next_prime + continue + + if current > limit: + break + + # Remove twice since it was added by both ups and lps + matches_sum -= current * 2 + + # Increment the current number + current += last_prime * next_prime + + # Setup for next pair + last_prime = next_prime + prime_index += 1 + + return matches_sum + + +if __name__ == "__main__": + print(solution()) diff --git a/python-mega-algo/project_euler/problem_301/__init__.py b/python-mega-algo/project_euler/problem_301/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/project_euler/problem_301/right.html b/python-mega-algo/project_euler/problem_301/right.html new file mode 100644 index 00000000..327fd65d --- /dev/null +++ b/python-mega-algo/project_euler/problem_301/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/project_euler/problem_301 + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    sol1.py __init__.py 
    + +

    +Folders: 1
    +Files: 2
    +Size of all files: 2093 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/project_euler/problem_301/sol1.py b/python-mega-algo/project_euler/problem_301/sol1.py new file mode 100644 index 00000000..b1d434c1 --- /dev/null +++ b/python-mega-algo/project_euler/problem_301/sol1.py @@ -0,0 +1,58 @@ +""" +Project Euler Problem 301: https://projecteuler.net/problem=301 + +Problem Statement: +Nim is a game played with heaps of stones, where two players take +it in turn to remove any number of stones from any heap until no stones remain. + +We'll consider the three-heap normal-play version of +Nim, which works as follows: +- At the start of the game there are three heaps of stones. +- On each player's turn, the player may remove any positive + number of stones from any single heap. +- The first player unable to move (because no stones remain) loses. + +If (n1, n2, n3) indicates a Nim position consisting of heaps of size +n1, n2, and n3, then there is a simple function, which you may look up +or attempt to deduce for yourself, X(n1, n2, n3) that returns: +- zero if, with perfect strategy, the player about to + move will eventually lose; or +- non-zero if, with perfect strategy, the player about + to move will eventually win. + +For example X(1,2,3) = 0 because, no matter what the current player does, +the opponent can respond with a move that leaves two heaps of equal size, +at which point every move by the current player can be mirrored by the +opponent until no stones remain; so the current player loses. To illustrate: +- current player moves to (1,2,1) +- opponent moves to (1,0,1) +- current player moves to (0,0,1) +- opponent moves to (0,0,0), and so wins. + +For how many positive integers n <= 2^30 does X(n,2n,3n) = 0? +""" + + +def solution(exponent: int = 30) -> int: + """ + For any given exponent x >= 0, 1 <= n <= 2^x. + This function returns how many Nim games are lost given that + each Nim game has three heaps of the form (n, 2*n, 3*n). + >>> solution(0) + 1 + >>> solution(2) + 3 + >>> solution(10) + 144 + """ + # To find how many total games were lost for a given exponent x, + # we need to find the Fibonacci number F(x+2). + fibonacci_index = exponent + 2 + phi = (1 + 5 ** 0.5) / 2 + fibonacci = (phi ** fibonacci_index - (phi - 1) ** fibonacci_index) / 5 ** 0.5 + + return int(fibonacci) + + +if __name__ == "__main__": + print(f"{solution() = }") diff --git a/python-mega-algo/project_euler/problem_551/__init__.py b/python-mega-algo/project_euler/problem_551/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/project_euler/problem_551/right.html b/python-mega-algo/project_euler/problem_551/right.html new file mode 100644 index 00000000..fd9a6f9d --- /dev/null +++ b/python-mega-algo/project_euler/problem_551/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/project_euler/problem_551 + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    sol1.py __init__.py 
    + +

    +Folders: 1
    +Files: 2
    +Size of all files: 5137 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/project_euler/problem_551/sol1.py b/python-mega-algo/project_euler/problem_551/sol1.py new file mode 100644 index 00000000..71956691 --- /dev/null +++ b/python-mega-algo/project_euler/problem_551/sol1.py @@ -0,0 +1,200 @@ +""" +Sum of digits sequence +Problem 551 + +Let a(0), a(1),... be an integer sequence defined by: + a(0) = 1 + for n >= 1, a(n) is the sum of the digits of all preceding terms + +The sequence starts with 1, 1, 2, 4, 8, ... +You are given a(10^6) = 31054319. + +Find a(10^15) +""" + +ks = [k for k in range(2, 20 + 1)] +base = [10 ** k for k in range(ks[-1] + 1)] +memo = {} + + +def next_term(a_i, k, i, n): + """ + Calculates and updates a_i in-place to either the n-th term or the + smallest term for which c > 10^k when the terms are written in the form: + a(i) = b * 10^k + c + + For any a(i), if digitsum(b) and c have the same value, the difference + between subsequent terms will be the same until c >= 10^k. This difference + is cached to greatly speed up the computation. + + Arguments: + a_i -- array of digits starting from the one's place that represent + the i-th term in the sequence + k -- k when terms are written in the from a(i) = b*10^k + c. + Term are calulcated until c > 10^k or the n-th term is reached. + i -- position along the sequence + n -- term to calculate up to if k is large enough + + Return: a tuple of difference between ending term and starting term, and + the number of terms calculated. ex. if starting term is a_0=1, and + ending term is a_10=62, then (61, 9) is returned. + """ + # ds_b - digitsum(b) + ds_b = sum(a_i[j] for j in range(k, len(a_i))) + c = sum(a_i[j] * base[j] for j in range(min(len(a_i), k))) + + diff, dn = 0, 0 + max_dn = n - i + + sub_memo = memo.get(ds_b) + + if sub_memo is not None: + jumps = sub_memo.get(c) + + if jumps is not None and len(jumps) > 0: + # find and make the largest jump without going over + max_jump = -1 + for _k in range(len(jumps) - 1, -1, -1): + if jumps[_k][2] <= k and jumps[_k][1] <= max_dn: + max_jump = _k + break + + if max_jump >= 0: + diff, dn, _kk = jumps[max_jump] + # since the difference between jumps is cached, add c + new_c = diff + c + for j in range(min(k, len(a_i))): + new_c, a_i[j] = divmod(new_c, 10) + if new_c > 0: + add(a_i, k, new_c) + + else: + sub_memo[c] = [] + else: + sub_memo = {c: []} + memo[ds_b] = sub_memo + + if dn >= max_dn or c + diff >= base[k]: + return diff, dn + + if k > ks[0]: + while True: + # keep doing smaller jumps + _diff, terms_jumped = next_term(a_i, k - 1, i + dn, n) + diff += _diff + dn += terms_jumped + + if dn >= max_dn or c + diff >= base[k]: + break + else: + # would be too small a jump, just compute sequential terms instead + _diff, terms_jumped = compute(a_i, k, i + dn, n) + diff += _diff + dn += terms_jumped + + jumps = sub_memo[c] + + # keep jumps sorted by # of terms skipped + j = 0 + while j < len(jumps): + if jumps[j][1] > dn: + break + j += 1 + + # cache the jump for this value digitsum(b) and c + sub_memo[c].insert(j, (diff, dn, k)) + return (diff, dn) + + +def compute(a_i, k, i, n): + """ + same as next_term(a_i, k, i, n) but computes terms without memoizing results. + """ + if i >= n: + return 0, i + if k > len(a_i): + a_i.extend([0 for _ in range(k - len(a_i))]) + + # note: a_i -> b * 10^k + c + # ds_b -> digitsum(b) + # ds_c -> digitsum(c) + start_i = i + ds_b, ds_c, diff = 0, 0, 0 + for j in range(len(a_i)): + if j >= k: + ds_b += a_i[j] + else: + ds_c += a_i[j] + + while i < n: + i += 1 + addend = ds_c + ds_b + diff += addend + ds_c = 0 + for j in range(k): + s = a_i[j] + addend + addend, a_i[j] = divmod(s, 10) + + ds_c += a_i[j] + + if addend > 0: + break + + if addend > 0: + add(a_i, k, addend) + return diff, i - start_i + + +def add(digits, k, addend): + """ + adds addend to digit array given in digits + starting at index k + """ + for j in range(k, len(digits)): + s = digits[j] + addend + if s >= 10: + quotient, digits[j] = divmod(s, 10) + addend = addend // 10 + quotient + else: + digits[j] = s + addend = addend // 10 + + if addend == 0: + break + + while addend > 0: + addend, digit = divmod(addend, 10) + digits.append(digit) + + +def solution(n: int = 10 ** 15) -> int: + """ + returns n-th term of sequence + + >>> solution(10) + 62 + + >>> solution(10**6) + 31054319 + + >>> solution(10**15) + 73597483551591773 + """ + + digits = [1] + i = 1 + dn = 0 + while True: + diff, terms_jumped = next_term(digits, 20, i + dn, n) + dn += terms_jumped + if dn == n - i: + break + + a_n = 0 + for j in range(len(digits)): + a_n += digits[j] * 10 ** j + return a_n + + +if __name__ == "__main__": + print(f"{solution() = }") diff --git a/python-mega-algo/project_euler/right.html b/python-mega-algo/project_euler/right.html new file mode 100644 index 00000000..aa141623 --- /dev/null +++ b/python-mega-algo/project_euler/right.html @@ -0,0 +1,55 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/project_euler + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Folders
    <Go Back> problem_027 problem_054 problem_097
    problem_001 problem_028 problem_055 problem_099
    problem_002 problem_029 problem_056 problem_101
    problem_003 problem_030 problem_057 problem_102
    problem_004 problem_031 problem_058 problem_107
    problem_005 problem_032 problem_059 problem_109
    problem_006 problem_033 problem_062 problem_112
    problem_007 problem_034 problem_063 problem_113
    problem_008 problem_035 problem_064 problem_119
    problem_009 problem_036 problem_065 problem_120
    problem_010 problem_037 problem_067 problem_121
    problem_011 problem_038 problem_069 problem_123
    problem_012 problem_039 problem_070 problem_125
    problem_013 problem_040 problem_071 problem_129
    problem_014 problem_041 problem_072 problem_135
    problem_015 problem_042 problem_074 problem_173
    problem_016 problem_043 problem_075 problem_174
    problem_017 problem_044 problem_076 problem_180
    problem_018 problem_045 problem_077 problem_188
    problem_019 problem_046 problem_080 problem_191
    problem_020 problem_047 problem_081 problem_203
    problem_021 problem_048 problem_085 problem_206
    problem_022 problem_049 problem_086 problem_207
    problem_023 problem_050 problem_087 problem_234
    problem_024 problem_051 problem_089 problem_301
    problem_025 problem_052 problem_091 problem_551
    problem_026 problem_053
    +
    + + + + +
    FileFileFileFile
    README.md __init__.py 
    + +

    +Folders: 106
    +Files: 2
    +Size of all files: 5391 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/pytest.ini b/python-mega-algo/pytest.ini new file mode 100644 index 00000000..48837927 --- /dev/null +++ b/python-mega-algo/pytest.ini @@ -0,0 +1,5 @@ +# Setup for pytest +[pytest] +markers = + mat_ops: mark a test as utilizing matrix operations. +addopts = --durations=10 diff --git a/python-mega-algo/quantum/README.md b/python-mega-algo/quantum/README.md new file mode 100644 index 00000000..423d34fa --- /dev/null +++ b/python-mega-algo/quantum/README.md @@ -0,0 +1,15 @@ +# Welcome to Quantum Algorithms + +Started at https://github.com/TheAlgorithms/Python/issues/1831 + +* D-Wave: https://www.dwavesys.com and https://github.com/dwavesystems +* Google: https://research.google/teams/applied-science/quantum +* IBM: https://qiskit.org and https://github.com/Qiskit +* Rigetti: https://rigetti.com and https://github.com/rigetti + +## IBM Qiskit +- Start using by installing `pip install qiskit`, refer the [docs](https://qiskit.org/documentation/install.html) for more info. +- Tutorials & References + - https://github.com/Qiskit/qiskit-tutorials + - https://quantum-computing.ibm.com/docs/iql/first-circuit + - https://medium.com/qiskit/how-to-program-a-quantum-computer-982a9329ed02 diff --git a/python-mega-algo/quantum/__init__.py b/python-mega-algo/quantum/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/quantum/deutsch_jozsa.py b/python-mega-algo/quantum/deutsch_jozsa.py new file mode 100644 index 00000000..304eea19 --- /dev/null +++ b/python-mega-algo/quantum/deutsch_jozsa.py @@ -0,0 +1,122 @@ +#!/usr/bin/env python3 +""" +Deutsch-Josza Algorithm is one of the first examples of a quantum +algorithm that is exponentially faster than any possible deterministic +classical algorithm + +Premise: +We are given a hidden Boolean function f, +which takes as input a string of bits, and returns either 0 or 1: + +f({x0,x1,x2,...}) -> 0 or 1, where xn is 0 or 1 + +The property of the given Boolean function is that it is guaranteed to +either be balanced or constant. A constant function returns all 0's +or all 1's for any input, while a balanced function returns 0's for +exactly half of all inputs and 1's for the other half. Our task is to +determine whether the given function is balanced or constant. + +References: +- https://en.wikipedia.org/wiki/Deutsch-Jozsa_algorithm +- https://qiskit.org/textbook/ch-algorithms/deutsch-jozsa.html +""" + +import numpy as np +import qiskit as q + + +def dj_oracle(case: str, num_qubits: int) -> q.QuantumCircuit: + """ + Returns a Quantum Circuit for the Oracle function. + The circuit returned can represent balanced or constant function, + according to the arguments passed + """ + # This circuit has num_qubits+1 qubits: the size of the input, + # plus one output qubit + oracle_qc = q.QuantumCircuit(num_qubits + 1) + + # First, let's deal with the case in which oracle is balanced + if case == "balanced": + # First generate a random number that tells us which CNOTs to + # wrap in X-gates: + b = np.random.randint(1, 2 ** num_qubits) + # Next, format 'b' as a binary string of length 'n', padded with zeros: + b_str = format(b, f"0{num_qubits}b") + # Next, we place the first X-gates. Each digit in our binary string + # correspopnds to a qubit, if the digit is 0, we do nothing, if it's 1 + # we apply an X-gate to that qubit: + for index, bit in enumerate(b_str): + if bit == "1": + oracle_qc.x(index) + # Do the controlled-NOT gates for each qubit, using the output qubit + # as the target: + for index in range(num_qubits): + oracle_qc.cx(index, num_qubits) + # Next, place the final X-gates + for index, bit in enumerate(b_str): + if bit == "1": + oracle_qc.x(index) + + # Case in which oracle is constant + if case == "constant": + # First decide what the fixed output of the oracle will be + # (either always 0 or always 1) + output = np.random.randint(2) + if output == 1: + oracle_qc.x(num_qubits) + + oracle_gate = oracle_qc.to_gate() + oracle_gate.name = "Oracle" # To show when we display the circuit + return oracle_gate + + +def dj_algorithm(oracle: q.QuantumCircuit, num_qubits: int) -> q.QuantumCircuit: + """ + Returns the complete Deustch-Jozsa Quantum Circuit, + adding Input & Output registers and Hadamard & Measurement Gates, + to the Oracle Circuit passed in arguments + """ + dj_circuit = q.QuantumCircuit(num_qubits + 1, num_qubits) + # Set up the output qubit: + dj_circuit.x(num_qubits) + dj_circuit.h(num_qubits) + # And set up the input register: + for qubit in range(num_qubits): + dj_circuit.h(qubit) + # Let's append the oracle gate to our circuit: + dj_circuit.append(oracle, range(num_qubits + 1)) + # Finally, perform the H-gates again and measure: + for qubit in range(num_qubits): + dj_circuit.h(qubit) + + for i in range(num_qubits): + dj_circuit.measure(i, i) + + return dj_circuit + + +def deutsch_jozsa(case: str, num_qubits: int) -> q.result.counts.Counts: + """ + Main function that builds the circuit using other helper functions, + runs the experiment 1000 times & returns the resultant qubit counts + >>> deutsch_jozsa("constant", 3) + {'000': 1000} + >>> deutsch_jozsa("balanced", 3) + {'111': 1000} + """ + # Use Aer's qasm_simulator + simulator = q.Aer.get_backend("qasm_simulator") + + oracle_gate = dj_oracle(case, num_qubits) + dj_circuit = dj_algorithm(oracle_gate, num_qubits) + + # Execute the circuit on the qasm simulator + job = q.execute(dj_circuit, simulator, shots=1000) + + # Return the histogram data of the results of the experiment. + return job.result().get_counts(dj_circuit) + + +if __name__ == "__main__": + print(f"Deutsch Jozsa - Constant Oracle: {deutsch_jozsa('constant', 3)}") + print(f"Deutsch Jozsa - Balanced Oracle: {deutsch_jozsa('balanced', 3)}") diff --git a/python-mega-algo/quantum/half_adder.py b/python-mega-algo/quantum/half_adder.py new file mode 100644 index 00000000..4af704e6 --- /dev/null +++ b/python-mega-algo/quantum/half_adder.py @@ -0,0 +1,59 @@ +#!/usr/bin/env python3 +""" +Build a half-adder quantum circuit that takes two bits as input, +encodes them into qubits, then runs the half-adder circuit calculating +the sum and carry qubits, observed over 1000 runs of the experiment +. + +References: +https://en.wikipedia.org/wiki/Adder_(electronics) +https://qiskit.org/textbook/ch-states/atoms-computation.html#4.2-Remembering-how-to-add- +""" + +import qiskit as q + + +def half_adder(bit0: int, bit1: int) -> q.result.counts.Counts: + """ + >>> half_adder(0, 0) + {'00': 1000} + >>> half_adder(0, 1) + {'01': 1000} + >>> half_adder(1, 0) + {'01': 1000} + >>> half_adder(1, 1) + {'10': 1000} + """ + # Use Aer's qasm_simulator + simulator = q.Aer.get_backend("qasm_simulator") + + qc_ha = q.QuantumCircuit(4, 2) + # encode inputs in qubits 0 and 1 + if bit0 == 1: + qc_ha.x(0) + if bit1 == 1: + qc_ha.x(1) + qc_ha.barrier() + + # use cnots to write XOR of the inputs on qubit2 + qc_ha.cx(0, 2) + qc_ha.cx(1, 2) + + # use ccx / toffoli gate to write AND of the inputs on qubit3 + qc_ha.ccx(0, 1, 3) + qc_ha.barrier() + + # extract outputs + qc_ha.measure(2, 0) # extract XOR value + qc_ha.measure(3, 1) # extract AND value + + # Execute the circuit on the qasm simulator + job = q.execute(qc_ha, simulator, shots=1000) + + # Return the histogram data of the results of the experiment. + return job.result().get_counts(qc_ha) + + +if __name__ == "__main__": + counts = half_adder(1, 1) + print(f"Half Adder Output Qubit Counts: {counts}") diff --git a/python-mega-algo/quantum/not_gate.py b/python-mega-algo/quantum/not_gate.py new file mode 100644 index 00000000..e68a7800 --- /dev/null +++ b/python-mega-algo/quantum/not_gate.py @@ -0,0 +1,41 @@ +#!/usr/bin/env python3 +""" +Build a simple bare-minimum quantum circuit that starts with a single +qubit (by default, in state 0) and inverts it. Run the experiment 1000 +times and print the total count of the states finally observed. +Qiskit Docs: https://qiskit.org/documentation/getting_started.html +""" + +import qiskit as q + + +def single_qubit_measure(qubits: int, classical_bits: int) -> q.result.counts.Counts: + """ + >>> single_qubit_measure(2, 2) + {'11': 1000} + >>> single_qubit_measure(4, 4) + {'0011': 1000} + """ + # Use Aer's qasm_simulator + simulator = q.Aer.get_backend("qasm_simulator") + + # Create a Quantum Circuit acting on the q register + circuit = q.QuantumCircuit(qubits, classical_bits) + + # Apply X (NOT) Gate to Qubits 0 & 1 + circuit.x(0) + circuit.x(1) + + # Map the quantum measurement to the classical bits + circuit.measure([0, 1], [0, 1]) + + # Execute the circuit on the qasm simulator + job = q.execute(circuit, simulator, shots=1000) + + # Return the histogram data of the results of the experiment. + return job.result().get_counts(circuit) + + +if __name__ == "__main__": + counts = single_qubit_measure(2, 2) + print(f"Total count for various states are: {counts}") diff --git a/python-mega-algo/quantum/quantum_entanglement.py b/python-mega-algo/quantum/quantum_entanglement.py new file mode 100644 index 00000000..3d8e2771 --- /dev/null +++ b/python-mega-algo/quantum/quantum_entanglement.py @@ -0,0 +1,58 @@ +#!/usr/bin/env python3 +""" +Build a quantum circuit with pair or group of qubits to perform +quantum entanglement. +Quantum entanglement is a phenomenon observed at the quantum scale +where entangled particles stay connected (in some sense) so that +the actions performed on one of the particles affects the other, +no matter the distance between two particles. +""" + +import qiskit + + +def quantum_entanglement(qubits: int = 2) -> qiskit.result.counts.Counts: + """ + # >>> quantum_entanglement(2) + # {'00': 500, '11': 500} + # ┌───┠┌─┠+ # q_0: ┤ H ├──■──┤M├─── + # └───┘┌─┴─â”└╥┘┌─┠+ # q_1: ─────┤ X ├─╫─┤M├ + # └───┘ â•‘ └╥┘ + # c: 2/â•â•â•â•â•â•â•â•â•â•â•â•©â•â•â•©â• + # 0 1 + Args: + qubits (int): number of quibits to use. Defaults to 2 + Returns: + qiskit.result.counts.Counts: mapping of states to its counts + """ + classical_bits = qubits + + # Using Aer's qasm_simulator + simulator = qiskit.Aer.get_backend("qasm_simulator") + + # Creating a Quantum Circuit acting on the q register + circuit = qiskit.QuantumCircuit(qubits, classical_bits) + + # Adding a H gate on qubit 0 (now q0 in superposition) + circuit.h(0) + + for i in range(1, qubits): + # Adding CX (CNOT) gate + circuit.cx(i - 1, i) + + # Mapping the quantum measurement to the classical bits + circuit.measure(list(range(qubits)), list(range(classical_bits))) + + # Now measuring any one qubit would affect other qubits to collapse + # their super position and have same state as the measured one. + + # Executing the circuit on the qasm simulator + job = qiskit.execute(circuit, simulator, shots=1000) + + return job.result().get_counts(circuit) + + +if __name__ == "__main__": + print(f"Total count for various states are: {quantum_entanglement(3)}") diff --git a/python-mega-algo/quantum/right.html b/python-mega-algo/quantum/right.html new file mode 100644 index 00000000..5d1e5dee --- /dev/null +++ b/python-mega-algo/quantum/right.html @@ -0,0 +1,30 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/quantum + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + + +
    FileFileFileFile
    README.md half_adder.py quantum_e...ent.py single_qu...ure.py 
    deutsch_jozsa.py not_gate.py ripple_ad...sic.py __init__.py 
    + +

    +Folders: 1
    +Files: 8
    +Size of all files: 14220 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/quantum/ripple_adder_classic.py b/python-mega-algo/quantum/ripple_adder_classic.py new file mode 100644 index 00000000..dc0c2103 --- /dev/null +++ b/python-mega-algo/quantum/ripple_adder_classic.py @@ -0,0 +1,108 @@ +# https://github.com/rupansh/QuantumComputing/blob/master/rippleadd.py +# https://en.wikipedia.org/wiki/Adder_(electronics)#Full_adder +# https://en.wikipedia.org/wiki/Controlled_NOT_gate + +from qiskit import Aer, QuantumCircuit, execute +from qiskit.providers import BaseBackend + + +def store_two_classics(val1: int, val2: int) -> tuple[QuantumCircuit, str, str]: + """ + Generates a Quantum Circuit which stores two classical integers + Returns the circuit and binary representation of the integers + """ + x, y = bin(val1)[2:], bin(val2)[2:] # Remove leading '0b' + + # Ensure that both strings are of the same length + if len(x) > len(y): + y = y.zfill(len(x)) + else: + x = x.zfill(len(y)) + + # We need (3 * number of bits in the larger number)+1 qBits + # The second parameter is the number of classical registers, to measure the result + circuit = QuantumCircuit((len(x) * 3) + 1, len(x) + 1) + + # We are essentially "not-ing" the bits that are 1 + # Reversed because its easier to perform ops on more significant bits + for i in range(len(x)): + if x[::-1][i] == "1": + circuit.x(i) + for j in range(len(y)): + if y[::-1][j] == "1": + circuit.x(len(x) + j) + + return circuit, x, y + + +def full_adder( + circuit: QuantumCircuit, + input1_loc: int, + input2_loc: int, + carry_in: int, + carry_out: int, +): + """ + Quantum Equivalent of a Full Adder Circuit + CX/CCX is like 2-way/3-way XOR + """ + circuit.ccx(input1_loc, input2_loc, carry_out) + circuit.cx(input1_loc, input2_loc) + circuit.ccx(input2_loc, carry_in, carry_out) + circuit.cx(input2_loc, carry_in) + circuit.cx(input1_loc, input2_loc) + + +def ripple_adder( + val1: int, val2: int, backend: BaseBackend = Aer.get_backend("qasm_simulator") +) -> int: + """ + Quantum Equivalent of a Ripple Adder Circuit + Uses qasm_simulator backend by default + + Currently only adds 'emulated' Classical Bits + but nothing prevents us from doing this with hadamard'd bits :) + + Only supports adding +ve Integers + + >>> ripple_adder(3, 4) + 7 + >>> ripple_adder(10, 4) + 14 + >>> ripple_adder(-1, 10) + Traceback (most recent call last): + ... + ValueError: Both Integers must be positive! + """ + + if val1 < 0 or val2 < 0: + raise ValueError("Both Integers must be positive!") + + # Store the Integers + circuit, x, y = store_two_classics(val1, val2) + + """ + We are essentially using each bit of x & y respectively as full_adder's input + the carry_input is used from the previous circuit (for circuit num > 1) + + the carry_out is just below carry_input because + it will be essentially the carry_input for the next full_adder + """ + for i in range(len(x)): + full_adder(circuit, i, len(x) + i, len(x) + len(y) + i, len(x) + len(y) + i + 1) + circuit.barrier() # Optional, just for aesthetics + + # Measure the resultant qBits + for i in range(len(x) + 1): + circuit.measure([(len(x) * 2) + i], [i]) + + res = execute(circuit, backend, shots=1).result() + + # The result is in binary. Convert it back to int + return int(list(res.get_counts().keys())[0], 2) + + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/quantum/single_qubit_measure.py b/python-mega-algo/quantum/single_qubit_measure.py new file mode 100644 index 00000000..7f058c21 --- /dev/null +++ b/python-mega-algo/quantum/single_qubit_measure.py @@ -0,0 +1,34 @@ +#!/usr/bin/env python3 +""" +Build a simple bare-minimum quantum circuit that starts with a single +qubit (by default, in state 0), runs the experiment 1000 times, and +finally prints the total count of the states finally observed. +Qiskit Docs: https://qiskit.org/documentation/getting_started.html +""" + +import qiskit as q + + +def single_qubit_measure(qubits: int, classical_bits: int) -> q.result.counts.Counts: + """ + >>> single_qubit_measure(1, 1) + {'0': 1000} + """ + # Use Aer's qasm_simulator + simulator = q.Aer.get_backend("qasm_simulator") + + # Create a Quantum Circuit acting on the q register + circuit = q.QuantumCircuit(qubits, classical_bits) + + # Map the quantum measurement to the classical bits + circuit.measure([0], [0]) + + # Execute the circuit on the qasm simulator + job = q.execute(circuit, simulator, shots=1000) + + # Return the histogram data of the results of the experiment. + return job.result().get_counts(circuit) + + +if __name__ == "__main__": + print(f"Total count for various states are: {single_qubit_measure(1, 1)}") diff --git a/python-mega-algo/requirements.txt b/python-mega-algo/requirements.txt new file mode 100644 index 00000000..8bbb8d52 --- /dev/null +++ b/python-mega-algo/requirements.txt @@ -0,0 +1,17 @@ +beautifulsoup4 +fake_useragent +keras +lxml +matplotlib +numpy +opencv-python +pandas +pillow +qiskit +requests +scikit-fuzzy +sklearn +statsmodels +sympy +tensorflow +xgboost diff --git a/python-mega-algo/right.html b/python-mega-algo/right.html new file mode 100644 index 00000000..53f75cac --- /dev/null +++ b/python-mega-algo/right.html @@ -0,0 +1,39 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo + + + + + + + + + + + + + + + + + + +
    Folders
    <Go Back> data_structures graphics other
    arithmeti...alysis digital_i...essing graphs physics
    backtracking divide_and_conquer hashes project_euler
    bit_manipulation dynamic_p...amming knapsack quantum
    blockchain electronics linear_algebra scheduling
    boolean_algebra file_transfer machine_learning scripts
    cellular_automata fractals maths searches
    ciphers fuzzy_logic matrix sorts
    compression genetic_algorithm networking_flow strings
    computer_vision geodesy neural_network web_programming
    conversions
    +
    + + + + +
    FileFileFileFile
    mypy.ini pytest.ini README.md requirements.txt 
    + +

    +Folders: 41
    +Files: 4
    +Size of all files: 82237 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/scheduling/__init__.py b/python-mega-algo/scheduling/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/scheduling/first_come_first_served.py b/python-mega-algo/scheduling/first_come_first_served.py new file mode 100644 index 00000000..b51fc9fe --- /dev/null +++ b/python-mega-algo/scheduling/first_come_first_served.py @@ -0,0 +1,108 @@ +# Implementation of First Come First Served scheduling algorithm +# In this Algorithm we just care about the order that the processes arrived +# without carring about their duration time +# https://en.wikipedia.org/wiki/Scheduling_(computing)#First_come,_first_served +from typing import List + + +def calculate_waiting_times(duration_times: List[int]) -> List[int]: + """ + This function calculates the waiting time of some processes that have a + specified duration time. + Return: The waiting time for each process. + >>> calculate_waiting_times([5, 10, 15]) + [0, 5, 15] + >>> calculate_waiting_times([1, 2, 3, 4, 5]) + [0, 1, 3, 6, 10] + >>> calculate_waiting_times([10, 3]) + [0, 10] + """ + waiting_times = [0] * len(duration_times) + for i in range(1, len(duration_times)): + waiting_times[i] = duration_times[i - 1] + waiting_times[i - 1] + return waiting_times + + +def calculate_turnaround_times( + duration_times: List[int], waiting_times: List[int] +) -> List[int]: + """ + This function calculates the turnaround time of some processes. + Return: The time difference between the completion time and the + arrival time. + Practically waiting_time + duration_time + >>> calculate_turnaround_times([5, 10, 15], [0, 5, 15]) + [5, 15, 30] + >>> calculate_turnaround_times([1, 2, 3, 4, 5], [0, 1, 3, 6, 10]) + [1, 3, 6, 10, 15] + >>> calculate_turnaround_times([10, 3], [0, 10]) + [10, 13] + """ + return [ + duration_time + waiting_times[i] + for i, duration_time in enumerate(duration_times) + ] + + +def calculate_average_turnaround_time(turnaround_times: List[int]) -> float: + """ + This function calculates the average of the turnaround times + Return: The average of the turnaround times. + >>> calculate_average_turnaround_time([0, 5, 16]) + 7.0 + >>> calculate_average_turnaround_time([1, 5, 8, 12]) + 6.5 + >>> calculate_average_turnaround_time([10, 24]) + 17.0 + """ + return sum(turnaround_times) / len(turnaround_times) + + +def calculate_average_waiting_time(waiting_times: List[int]) -> float: + """ + This function calculates the average of the waiting times + Return: The average of the waiting times. + >>> calculate_average_waiting_time([0, 5, 16]) + 7.0 + >>> calculate_average_waiting_time([1, 5, 8, 12]) + 6.5 + >>> calculate_average_waiting_time([10, 24]) + 17.0 + """ + return sum(waiting_times) / len(waiting_times) + + +if __name__ == "__main__": + # process id's + processes = [1, 2, 3] + + # ensure that we actually have processes + if len(processes) == 0: + print("Zero amount of processes") + exit() + + # duration time of all processes + duration_times = [19, 8, 9] + + # ensure we can match each id to a duration time + if len(duration_times) != len(processes): + print("Unable to match all id's with their duration time") + exit() + + # get the waiting times and the turnaround times + waiting_times = calculate_waiting_times(duration_times) + turnaround_times = calculate_turnaround_times(duration_times, waiting_times) + + # get the average times + average_waiting_time = calculate_average_waiting_time(waiting_times) + average_turnaround_time = calculate_average_turnaround_time(turnaround_times) + + # print all the results + print("Process ID\tDuration Time\tWaiting Time\tTurnaround Time") + for i, process in enumerate(processes): + print( + f"{process}\t\t{duration_times[i]}\t\t{waiting_times[i]}\t\t" + f"{turnaround_times[i]}" + ) + print(f"Average waiting time = {average_waiting_time}") + print(f"Average turn around time = {average_turnaround_time}") diff --git a/python-mega-algo/scheduling/right.html b/python-mega-algo/scheduling/right.html new file mode 100644 index 00000000..fe894345 --- /dev/null +++ b/python-mega-algo/scheduling/right.html @@ -0,0 +1,29 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/scheduling + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + +
    FileFileFileFile
    first_com...ved.py round_robin.py shortest_...rst.py __init__.py 
    + +

    +Folders: 1
    +Files: 4
    +Size of all files: 10713 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/scheduling/round_robin.py b/python-mega-algo/scheduling/round_robin.py new file mode 100644 index 00000000..f20ebdff --- /dev/null +++ b/python-mega-algo/scheduling/round_robin.py @@ -0,0 +1,65 @@ +""" +Round Robin is a scheduling algorithm. +In Round Robin each process is assigned a fixed time slot in a cyclic way. +https://en.wikipedia.org/wiki/Round-robin_scheduling +""" +from statistics import mean +from typing import List + + +def calculate_waiting_times(burst_times: List[int]) -> List[int]: + """ + Calculate the waiting times of a list of processes that have a specified duration. + + Return: The waiting time for each process. + >>> calculate_waiting_times([10, 5, 8]) + [13, 10, 13] + >>> calculate_waiting_times([4, 6, 3, 1]) + [5, 8, 9, 6] + >>> calculate_waiting_times([12, 2, 10]) + [12, 2, 12] + """ + quantum = 2 + rem_burst_times = list(burst_times) + waiting_times = [0] * len(burst_times) + t = 0 + while True: + done = True + for i, burst_time in enumerate(burst_times): + if rem_burst_times[i] > 0: + done = False + if rem_burst_times[i] > quantum: + t += quantum + rem_burst_times[i] -= quantum + else: + t += rem_burst_times[i] + waiting_times[i] = t - burst_time + rem_burst_times[i] = 0 + if done is True: + return waiting_times + + +def calculate_turn_around_times( + burst_times: List[int], waiting_times: List[int] +) -> List[int]: + """ + >>> calculate_turn_around_times([1, 2, 3, 4], [0, 1, 3]) + [1, 3, 6] + >>> calculate_turn_around_times([10, 3, 7], [10, 6, 11]) + [20, 9, 18] + """ + return [burst + waiting for burst, waiting in zip(burst_times, waiting_times)] + + +if __name__ == "__main__": + burst_times = [3, 5, 7] + waiting_times = calculate_waiting_times(burst_times) + turn_around_times = calculate_turn_around_times(burst_times, waiting_times) + print("Process ID \tBurst Time \tWaiting Time \tTurnaround Time") + for i, burst_time in enumerate(burst_times): + print( + f" {i + 1}\t\t {burst_time}\t\t {waiting_times[i]}\t\t " + f"{turn_around_times[i]}" + ) + print(f"\nAverage waiting time = {mean(waiting_times):.5f}") + print(f"Average turn around time = {mean(turn_around_times):.5f}") diff --git a/python-mega-algo/scheduling/shortest_job_first.py b/python-mega-algo/scheduling/shortest_job_first.py new file mode 100644 index 00000000..a49d037d --- /dev/null +++ b/python-mega-algo/scheduling/shortest_job_first.py @@ -0,0 +1,151 @@ +""" +Shortest job remaining first +Please note arrival time and burst +Please use spaces to separate times entered. +""" +from typing import List + +import pandas as pd + + +def calculate_waitingtime( + arrival_time: List[int], burst_time: List[int], no_of_processes: int +) -> List[int]: + """ + Calculate the waiting time of each processes + Return: List of waiting times. + >>> calculate_waitingtime([1,2,3,4],[3,3,5,1],4) + [0, 3, 5, 0] + >>> calculate_waitingtime([1,2,3],[2,5,1],3) + [0, 2, 0] + >>> calculate_waitingtime([2,3],[5,1],2) + [1, 0] + """ + remaining_time = [0] * no_of_processes + waiting_time = [0] * no_of_processes + # Copy the burst time into remaining_time[] + for i in range(no_of_processes): + remaining_time[i] = burst_time[i] + + complete = 0 + increment_time = 0 + minm = 999999999 + short = 0 + check = False + + # Process until all processes are completed + while complete != no_of_processes: + for j in range(no_of_processes): + if arrival_time[j] <= increment_time: + if remaining_time[j] > 0: + if remaining_time[j] < minm: + minm = remaining_time[j] + short = j + check = True + + if not check: + increment_time += 1 + continue + remaining_time[short] -= 1 + + minm = remaining_time[short] + if minm == 0: + minm = 999999999 + + if remaining_time[short] == 0: + complete += 1 + check = False + + # Find finish time of current process + finish_time = increment_time + 1 + + # Calculate waiting time + finar = finish_time - arrival_time[short] + waiting_time[short] = finar - burst_time[short] + + if waiting_time[short] < 0: + waiting_time[short] = 0 + + # Increment time + increment_time += 1 + return waiting_time + + +def calculate_turnaroundtime( + burst_time: List[int], no_of_processes: int, waiting_time: List[int] +) -> List[int]: + """ + Calculate the turn around time of each Processes + Return: list of turn around times. + >>> calculate_turnaroundtime([3,3,5,1], 4, [0,3,5,0]) + [3, 6, 10, 1] + >>> calculate_turnaroundtime([3,3], 2, [0,3]) + [3, 6] + >>> calculate_turnaroundtime([8,10,1], 3, [1,0,3]) + [9, 10, 4] + """ + turn_around_time = [0] * no_of_processes + for i in range(no_of_processes): + turn_around_time[i] = burst_time[i] + waiting_time[i] + return turn_around_time + + +def calculate_average_times( + waiting_time: List[int], turn_around_time: List[int], no_of_processes: int +) -> None: + """ + This function calculates the average of the waiting & turnaround times + Prints: Average Waiting time & Average Turn Around Time + >>> calculate_average_times([0,3,5,0],[3,6,10,1],4) + Average waiting time = 2.00000 + Average turn around time = 5.0 + >>> calculate_average_times([2,3],[3,6],2) + Average waiting time = 2.50000 + Average turn around time = 4.5 + >>> calculate_average_times([10,4,3],[2,7,6],3) + Average waiting time = 5.66667 + Average turn around time = 5.0 + """ + total_waiting_time = 0 + total_turn_around_time = 0 + for i in range(no_of_processes): + total_waiting_time = total_waiting_time + waiting_time[i] + total_turn_around_time = total_turn_around_time + turn_around_time[i] + print("Average waiting time = %.5f" % (total_waiting_time / no_of_processes)) + print("Average turn around time =", total_turn_around_time / no_of_processes) + + +if __name__ == "__main__": + print("Enter how many process you want to analyze") + no_of_processes = int(input()) + burst_time = [0] * no_of_processes + arrival_time = [0] * no_of_processes + processes = list(range(1, no_of_processes + 1)) + + for i in range(no_of_processes): + print("Enter the arrival time and brust time for process:--" + str(i + 1)) + arrival_time[i], burst_time[i] = map(int, input().split()) + + waiting_time = calculate_waitingtime(arrival_time, burst_time, no_of_processes) + + bt = burst_time + n = no_of_processes + wt = waiting_time + turn_around_time = calculate_turnaroundtime(bt, n, wt) + + calculate_average_times(waiting_time, turn_around_time, no_of_processes) + + fcfs = pd.DataFrame( + list(zip(processes, burst_time, arrival_time, waiting_time, turn_around_time)), + columns=[ + "Process", + "BurstTime", + "ArrivalTime", + "WaitingTime", + "TurnAroundTime", + ], + ) + + # Printing the dataFrame + pd.set_option("display.max_rows", fcfs.shape[0] + 1) + print(fcfs) diff --git a/python-mega-algo/scripts/__init__.py b/python-mega-algo/scripts/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/scripts/build_directory_md.py b/python-mega-algo/scripts/build_directory_md.py new file mode 100644 index 00000000..7a4bc3a4 --- /dev/null +++ b/python-mega-algo/scripts/build_directory_md.py @@ -0,0 +1,45 @@ +#!/usr/bin/env python3 + +import os +from typing import Iterator + +URL_BASE = "https://github.com/TheAlgorithms/Python/blob/master" + + +def good_file_paths(top_dir: str = ".") -> Iterator[str]: + for dir_path, dir_names, filenames in os.walk(top_dir): + dir_names[:] = [d for d in dir_names if d != "scripts" and d[0] not in "._"] + for filename in filenames: + if filename == "__init__.py": + continue + if os.path.splitext(filename)[1] in (".py", ".ipynb"): + yield os.path.join(dir_path, filename).lstrip("./") + + +def md_prefix(i): + return f"{i * ' '}*" if i else "\n##" + + +def print_path(old_path: str, new_path: str) -> str: + old_parts = old_path.split(os.sep) + for i, new_part in enumerate(new_path.split(os.sep)): + if i + 1 > len(old_parts) or old_parts[i] != new_part: + if new_part: + print(f"{md_prefix(i)} {new_part.replace('_', ' ').title()}") + return new_path + + +def print_directory_md(top_dir: str = ".") -> None: + old_path = "" + for filepath in sorted(good_file_paths(top_dir)): + filepath, filename = os.path.split(filepath) + if filepath != old_path: + old_path = print_path(old_path, filepath) + indent = (filepath.count(os.sep) + 1) if filepath else 0 + url = "/".join((URL_BASE, filepath, filename)).replace(" ", "%20") + filename = os.path.splitext(filename.replace("_", " ").title())[0] + print(f"{md_prefix(indent)} [{filename}]({url})") + + +if __name__ == "__main__": + print_directory_md(".") diff --git a/python-mega-algo/scripts/project_euler_answers.json b/python-mega-algo/scripts/project_euler_answers.json new file mode 100644 index 00000000..6d354363 --- /dev/null +++ b/python-mega-algo/scripts/project_euler_answers.json @@ -0,0 +1,727 @@ +{ + "001": "c0b20f4665d0388d564f0b6ecf3edc9f9480cb15fff87198b95701d9f5fe1f7b", + "002": "1f5882e19314ac13acca52ad5503184b3cb1fd8dbeea82e0979d799af2361704", + "003": "5c09f0554518a413e58e6bc5964ba90655713483d0b2bbc94572ad6b0b4dda28", + "004": "aa74f52b4c428d89606b411bc165eb81a6266821ecc9b4f30cdb70c5c930f4d9", + "005": "1ba90ab11bfb2d2400545337212b0de2a5c7f399215175ade6396e91388912b1", + "006": "537942be3eb323c507623a6a73fa87bf5aeb97b7c7422993a82aa7c15f6d9cd6", + "007": "ecbe74e25cfa4763dbc304ccac2ffb9912e9625cd9993a84bd0dd6d7dc0ca021", + "008": "b9fb30b6553415e9150051ce5710a93d0f55b22557c0068d8e16619a388f145a", + "009": "d912d9d473ef86f12da1fb2011c5c0c155bd3a0ebdb4bbd7ea275cecdcb63731", + "010": "bed2d160e02f0540f19a64ca738aacb79cfcd08ba7e2421567b16cb6e7e3e90e", + "011": "9ded5bc849d33e477aa9c944138d34f0aacc485a372e84464e8a572712a5b7da", + "012": "3e7be445b6c19e6db58c2482005c1f78cb74011a4279249ca632011a9f1b61a2", + "013": "3cb265a96c5645a9ad11d47551f015c25f3f99792c951617656d84626fbc4868", + "014": "78a262dd40eba0f7195686ec7f3891a39437523456f8d16fa9065a34409eeac6", + "015": "7b8f812ca89e311e1b16b903de76fa7b0800a939b3028d9dc4d35f6fa4050281", + "016": "a6f988d30328bd706c66f8ac0d92aac21dd732149cdd69cb31f459dca20c5abe", + "017": "1a455b216c6e916943acf3fa4c7e57a7a5cac66d97cc51befca810c223ef9c23", + "018": "fde3f2e7127f6810eb4160bf7bb0563240d78c9d75a9a590b6d6244748a7f4ff", + "019": "284de502c9847342318c17d474733ef468fbdbe252cddf6e4b4be0676706d9d0", + "020": "c86a2932e1c79343a3c16fb218b9944791aaeedd3e30c87d1c7f505c0e588f7c", + "021": "e8c6ef4a1736a245b5682e0262c5c43862cfb233ca5e286be2f5bb4d8a974ecf", + "022": "85148c096c25e3ed3da55c7e9c89448018b0f5f53ad8d042129c33d9beac6736", + "023": "42e2552a2f589e021824339e2508629ffa00b3489ea467f47e77a1ea97e735c9", + "024": "4677b3d9daa3b30a9665e4558f826e04f7833dda886b8ef24f7176519a0db537", + "025": "7d398da8791745001b3d1c41030676d1c036687eb1ab32e0b5a1832e7579c073", + "026": "fbe10beedf9d29cf53137ba38859ffd1dbe7642cedb7ef0a102a3ab109b47842", + "027": "e4110e0852a2f70703f0081fc91c4a20f595919a038729cb37c564d68b875c6f", + "028": "261171a770d594f6a7fc76c1a839eda7f6dd4e9495e00e75048578fc86d8adf0", + "029": "a207c35d8417aeed4c9e78bcf83f936cd8191c702893be62aa690ce16bc909ca", + "030": "46e68e4199ab0a663ab306651528b06756556c9f0d8b819095af45e036dfbe6b", + "031": "8de34b4ba97b184c7a2096b9266776175242b87d67bc8d77d7289be6f70cd105", + "032": "0d246750daa7f1b367a21f55da454ddc8f62e0a95d163062e9b9273320d5130f", + "033": "ad57366865126e55649ecb23ae1d48887544976efea46a48eb5d85a6eeb4d306", + "034": "728b8d7d6d5d34cad9cbb7c3ea15f807ae57144594b1740b3c73b82314ccd1ed", + "035": "02d20bbd7e394ad5999a4cebabac9619732c343a4cac99470c03e23ba2bdc2bc", + "036": "9480c0160719234b57defc0681c0949a175ffb3ff4a3bf5e8163ac843f383f35", + "037": "e9800abda89919edac504e90dac91f95e0778e3ba0f21a0bac4e77a84766eaaf", + "038": "b2004522103364a6e842b9d042c0707d79af68dec7810078729d061fb7948912", + "039": "fd0f7e53c5b02b688a57ee37f3d52065cb168a7b9fd5a3abd93d37e1559fbd30", + "040": "d29d53701d3c859e29e1b90028eec1ca8e2f29439198b6e036c60951fb458aa1", + "041": "bf05020e70de94e26dba112bb6fb7b0755db5ca88c7225e99187c5a08c8a0428", + "042": "79d6eaa2676189eb927f2e16a70091474078e2117c3fc607d35cdc6b591ef355", + "043": "6512f20c244844b6130204379601855098826afa1b55ff91c293c853ddf67db5", + "044": "97e2524fd3796e83b06c0f89fdcb16e4c544e76e9c0496f57ac84834869f4cc3", + "045": "8b0300d71656b9cf0716318be9453c99a13bb8644d227fd683d06124e6a28b35", + "046": "8485ee802cc628b8cbd82476133d11b57af87e00711516a703525a9af0193b12", + "047": "c7274da71333bd93201fa1e05b1ed54e0074d83f259bd7148c70ddc43082bde1", + "048": "743d17cbff06ab458b99ecbb32e1d6bb9a7ff2ac804118f7743177dd969cfc61", + "049": "47c6094ff1ff6e37788def89190c8256619ef1511681c503fea02c171569d16e", + "050": "6ee74ef623df9fb69facd30b91ed78fe70370462bb267097f0dfeef9d9b057bb", + "051": "d17cec28356b4f9a7f1ec0f20cca4c89e270aeb0e75d70d485b05bb1f28e9f6d", + "052": "ebd72b510911af3e254a030cd891cb804e1902189eee7a0f6199472eb5e4dba2", + "053": "9705cc6128a60cc22581217b715750a6053b2ddda67cc3af7e14803b27cf0c1f", + "054": "12e2c8df501501b2bb531e941a737ffa7a2a491e849c5c5841e3b6132291bc35", + "055": "9f484139a27415ae2e8612bf6c65a8101a18eb5e9b7809e74ca63a45a65f17f4", + "056": "3658d7fa3c43456f3c9c87db0490e872039516e6375336254560167cc3db2ea2", + "057": "620c9c332101a5bae955c66ae72268fbcd3972766179522c8deede6a249addb7", + "058": "196f327021627b6a48db9c6e0a3388d110909d4bb957eb3fbc90ff1ecbda42cb", + "059": "0295239a9d71f7452b93e920b7e0e462f712af5444579d25e06b9614ed77de74", + "060": "ad7c26db722221bfb1bf7e3c36b501bedf8be857b1cfa8664fccb074b54354f9", + "061": "94e4fb283c1abcccae4b8b28e39a294a323cdc9732c3d3ce1133c518d0a286f6", + "062": "d25a595036aa8722157aca38f90084acb369b00df1070f49e203d5a3b7a0736d", + "063": "0e17daca5f3e175f448bacace3bc0da47d0655a74c8dd0dc497a3afbdad95f1f", + "064": "6d62aa4b52071e39f064a930d190b85ab327eb1a5045a8050ac538666ee765ca", + "065": "1c6c0bb2c7ecdc3be8e134f79b9de45155258c1f554ae7542dce48f5cc8d63f0", + "066": "316c0f93c7fe125865d85d6e7e7a31b79e9a46c414c45078b732080fa22ef2a3", + "067": "53f66b6783cb7552d83015df01b0d5229569fce1dd7d1856335c7244b9a3ded6", + "068": "4bf689d09a156621220881a2264dc031b2bfb181213b26d6ff2c338408cf94c3", + "069": "79555e4b891e2885525c136f8b834cc0b1e9416960b12e371111a5cb2da0479f", + "070": "08c6a7c8c06a01d2b17993ada398084b0707652bcfbd580f9173bcddf120ac2c", + "071": "63f032489227c969135c6a6571fe9b33d6970dc6eca32c2086c61a4a099c98fa", + "072": "9ef8a4249d4b8f24147ab6e9ad2536eb04f10fb886a8099e88e0e7c41cf7c616", + "073": "ae9f9c786cd0f24fe03196d5061545862d87a208580570d46e2cfb371319aa68", + "074": "b7c7470e59e2a2df1bfd0a4705488ee6fe0c5c125de15cccdfab0e00d6c03dc0", + "075": "8a426e100572b8e2ea7c1b404a1ee694699346632cf4942705c54f05162bc07a", + "076": "81c54809c3bdfc23f844fde21ae645525817b6e1bee1525270f49282888a5546", + "077": "7f2253d7e228b22a08bda1f09c516f6fead81df6536eb02fa991a34bb38d9be8", + "078": "71374036b661ac8ffe4b78c191050c3ccd1c956ca8a5f465ea1956f7ce571f63", + "079": "2df095aea1862ebfed8df7fb26e8c4a518ca1a8f604a31cfba9da991fc1d6422", + "080": "58bfe3a44f8ae452aaa6ef6267bafc3e841cfe7f9672bdfeb841d2e3a62c1587", + "081": "04bad90d08bdf11010267ec9d1c9bbb49a813194dace245868ea8140aec9a1f7", + "082": "52c42c55daea3131d5357498b8a0ddcf99d1babd16f6ccaee67cb3d0a665b772", + "083": "a825281bc5ce8fe70d66a04e96314e7de070f11fed0f78bc81e007ca7c92e8b0", + "084": "692a776beae0e92d1121fed36427c10d0860344614ead6b4760d1b7091a6ab1f", + "085": "7b2e7211fb4f4d8352c9215c591252344775c56d58b9a5ff88bda8358628ec4e", + "086": "8ffe8459134b46975acd31df13a50c51dbeacf1c19a764bf1602ba7c73ffc8fb", + "087": "cec1917df3b3ee1f43b3468596ed3042df700dc7a752fefc06c4142a2832995d", + "088": "c06356fdcaff01810e1f794263f3e44a75f28e8902a145a0d01a1fff77614722", + "089": "0df5486b7bca884d5f00c502e216f734b2865b202397f24bca25ac9b8a95ab4a", + "090": "cb69775effd93fc34ef38dfbfcdc4c593b1a3d8e7ab70c0f05d627dbc5cbd298", + "091": "327f057e054d1e6a9a1be4ac6acc4b1dedc63d8a88222396ffe98b3194067347", + "092": "538cd20a275b610698691d714b2adf4e4c321915def05667f4d25d97413ec076", + "093": "d8ed8ca27d83a63df6982905ea53b4613b9d7974edcee06f301cf43d63177f47", + "094": "d1b79281d95ce5bfa848060de4e0c80af2c3cae1ff7453cca31ff31e2d67ac14", + "095": "0a3ddcd71cf30a567070630f947ab79fc168865ba0bf112aed9b71fb4e76c32f", + "096": "9c527d233befbf357335e18e6dd5b14ef3a62e19ef34f90bd3fb9e5a2a0a0111", + "097": "f0e2911e303617c9648692ee8056beeb045d89e469315716abed47cd94a3cd56", + "098": "ededac5db280586f534cde4f69ce2c134d2360d6b5da3c3ebc400494cc016e78", + "099": "92c5fd0421c1d619cbf1bdba83a207261f2c5f764aed46db9b4d2de03b72b654", + "100": "993189cbf49fef4c913aa081f2ef44d360b84bf33d19df93fce4663ac34e9927", + "101": "e8539f8b271851cad65d551354874d3086fa9ff7b6f6a2ab9890d63f5ba16c68", + "102": "9d693eeee1d1899cbc50b6d45df953d3835acf28ee869879b45565fccc814765", + "103": "1f17277005b8d58ad32f2cbee4c482cb8c0f3687c3cfe764ec30ee99827c3b1d", + "104": "87dfcf5471e77980d098ff445701dbada0f6f7bac2fa5e43fa7685ec435040e1", + "105": "a76f4e7fa1357a955743d5c0acb2e641c50bcaf0eec27eb4aaffebb45fe12994", + "106": "197f5e68d1e83af7e40a7c7717acc6a99767bf8c53eece9253131a3790a02063", + "107": "bf13bc90121776d7de3c4c3ca4c400a4c12284c3da684b3d530113236813ce81", + "108": "3dea386e2c4a8a0633b667fdd4beacd8bb3fe27c282f886c828ad7d6b42c2d73", + "109": "735cc3e619b9a1e3ac503ba5195c43c02d968113fd3795373ca085ed7777b54d", + "110": "01b4e8163485356b46f612c9d40ed4b8602621d4d02289623e7dbb3dcbe03395", + "111": "97c1b054c094337ec1397cd5ccdf6c9efe1067ad16f531824a94eaadb3c0953b", + "112": "c99c843e0f6d6566132d97c829780332218e005efc14b633e25a5badb912d63a", + "113": "8dbc8319e5d8923ef7ab42108341ee2c32a34ffc0d19d5ae5677f1564813314a", + "114": "b3b9ebc9f9ddadb6b630eeef5d7ba724b3bb4d071b249318093eb7547949bbb9", + "115": "80c3cd40fa35f9088b8741bd8be6153de05f661cfeeb4625ffbf5f4a6c3c02c4", + "116": "a39208d7130682b772d6206acd746bc3779cc1bc0033f0a472e97993d0a32d5b", + "117": "54201fbc7a70d21c1b0acede7708f1658d8e87032ab666001e888e7887c67d50", + "118": "834e6235764ae632737ebf7cd0be66634c4fb70fe1e55e858efd260a66a0e3a9", + "119": "bcabd9609d7293a3a3f1640c2937e302fa52ff03a95c117f87f2c465817eba5e", + "120": "2bd8cabf5aecfcadde03beda142ac26c00b6ccfc59fdcb685672cd79a92f63a6", + "121": "5292478e83f6b244c7c7c5c1fe272121abdc2982f66ed11fcbc6ea7e73af124d", + "122": "6d78b19a042a64f08cc4df0d42fb91cd757829718e60e82a54e3498f03f3ef32", + "123": "057b9b6e49d03958b3f38e812d2cfdd0f500e35e537b4fa9afedd2f3444db8a2", + "124": "d251170c5287da10bffc1ac8af344e0c434ef5f649fd430fcf1049f90d45cf45", + "125": "e9b7a676dc359ffce7075886373af79e3348ddbf344502614d9940eecd0532c1", + "126": "38752ed2e711a3c001d5139cb3c945c0f780939db4ea80d68f31e6763b11cfba", + "127": "e707d9f315269a34d94d9d9fa4f8b29328e66b53447ef38419c6033e57d5d123", + "128": "5e15922fba7f61ddccb2ee579b5ec35034cc32def25ff156ae2b0a3e98c4414e", + "129": "3cc4ad1254491787f52a66e595dbb573e13ceb554c51d81e42d5490a575da070", + "130": "7a6e9899cccb6a01e05013c622422717f54853f7f2581bc3b88a78b25981da08", + "131": "4a8596a7790b5ca9e067da401c018b3206befbcf95c38121854d1a0158e7678a", + "132": "ed77e05f47f7f19f09cae9b272bfd6daa1682b426d39dcb7f473234c0c9381c5", + "133": "e456d3fec55d88653dd88c3f8bbde1f8240c8ceb7882016d19e6f329e412a4ae", + "134": "b144116982f4f0930038299efbdd56afc1528ef59047fb75bade8777309fde4b", + "135": "0709e1008834c2ca8648376ac62d74ac8df5457069cbfedf2b0776dab07a3c5b", + "136": "84692ebaa4fc17e9cfce27126b3fc5a92c1e33e1d94658de0544f8b35a597592", + "137": "6eca481578c967fb9373fe4ce7930b39d8eefe1c0c9c7cb5af241a766bd4dfbc", + "138": "1b5f0f504917592dea2e878497b0e12655366f2a7a163e0a081d785124982d2c", + "139": "0d2f26ec4004c99171fc415282ec714afa617208480b45aeb104c039dc653f5d", + "140": "78ceab5e434a86a6a6bb4f486707bffaf536ef6cb2cc5b45a90b3edd89a03283", + "141": "d74ae4b07f05779065fb038b35d85a21444ed3bed2373f51d9e22d85a16a704c", + "142": "f59af8b0b63a3d0eb580405092c1539261aec18890ea5b6d6e2d93697d67cd38", + "143": "66e9d1093f00eef9a32e704232219f462138f13c493cc0775c507cf51cb231ed", + "144": "09a1b036b82baba3177d83c27c1f7d0beacaac6de1c5fdcc9680c49f638c5fb9", + "145": "b910b9b7bf3c3f071e410e0474958931a022d20c717a298a568308250ed2b0da", + "146": "5292f0166523ea1a89c9f7f2d69064dee481a7d3c119841442cd36f03c42b657", + "147": "cdb162a8a376b1df385dac44ce7b10777c9fea049961cb303078ebbd08d70de8", + "148": "54f631973f7bc002a958b818a1e99e2fc1a91c41eafe19b9136fac9a4eb8d7b8", + "149": "c49382eb9fc41e750239ac7b209513a266e80a268c83cf4d0c79f571629bac48", + "150": "c89b0574a2e2f4a63845fe0fd9d51122d9d4149d887995051c3e53d2244bba41", + "151": "5d09e3b57ced9fd215acc96186743e422ce48900b8992c9b6c74d3e4117e4140", + "152": "c3ea99f86b2f8a74ef4145bb245155ff5f91cd856f287523481c15a1959d5fd1", + "153": "fb57f89f289ee59c36cede64d2d13828b8997766b49aa4530aabfc18ff4a4f17", + "154": "c877d90a178511a52ae2b2119e99e0b8b643cec44d5fd864bd3ef3e0d7f1f4bb", + "155": "58801bebc14c905b79c209affab74e176e2e971c1d9799a1a342ae6a3c2afbc1", + "156": "983d2222220ab7ffa243f48274f6eb82f92258445b93b23724770995575d77fe", + "157": "023344e94ad747fbc529e3e68b95e596badcc445c85c1c7c8fa590e3d492779a", + "158": "d1b58f4c07d1db5eb97785807b6d97a0d1ee1340e7dbcc7bb289f3547559f2fc", + "159": "cd3a3d2cf8973c5f2c97ebed2460784818513e7d0fee8f98f4fdcf510295e159", + "160": "3a926519b024ea9df5e7ad79d0b1c4400f78f58d07834f5ecd7be522112b676d", + "161": "2b3d09a4c76b282db1428342c82c5a55c0ab57c7a7640e0850d82021164477e9", + "162": "d50ce1ab3a25a5c5e020517092128ab3ec4a3bd5b58673b2e6cda86bcc0c48a0", + "163": "7e17ce0fca5d559f76015765c652d76b8468f9ddc91c2069d7799867b9d52769", + "164": "5c680d0b2c4dfac8aade87be60cb4d04a4c3d4db398f51e2cbf131d699b630a8", + "165": "304de2e63f91f8f74faaebae7a7ec2e0c6e0d8d322d8a747e4e3be88de2d3505", + "166": "14212843872dab188a86eb1f0f7012e1b72ea1097545f29377b3b9b52822af76", + "167": "18c18f8710f831a82eb74ae979bd36d609bee818c972ff88f8d8fa065270f951", + "168": "66640021d592f79b510f9d6101bd8eca89893187d23919c8edff4075e73ae390", + "169": "819b01e0394727fd089f84b9351243176920f03d0c6e33e5ff136016da5d8d4e", + "170": "e68fadd33a8c41d9a259577a278d8518aeb8b81c67b8cf03ccf43fc451ec8bd8", + "171": "33bf9ed4714b0e5da8828f8b3d9d3e9d0cf55c1d496324acb04a3f195252749c", + "172": "b9a27b513dc15448772cac5e914de61f02efe323f528892c0bff86d19913a6bd", + "173": "1b2a5e44fda5dfee3ce230f44fe73c672249f6620cdbaa343ba0ba808034958c", + "174": "98aabf085c6c8647f5e8a4775dc1d036513742d8e03b8c5c51e41bdfc9c3e7ae", + "175": "c03dcb22b7faf121d99542018dd10a07a778abee2678d35c03394a8d207b826b", + "176": "4fff1a7beda4291446d76e5ed5177c3f36e52a10481009fdaf2976da39e802ae", + "177": "614d3df0ba5fdffab2328eff8e9ca2d76b09bbc447c06bf1fab0419ae278fae9", + "178": "094a2ba3011118efdd9d4c1f839e6747dee8ba953b52e9012fe2977e32599375", + "179": "9f5563a5ea90ca7023f0304acba78005ee6b7351245a8a668a94dfef160f8d29", + "180": "dbef09115a57784ea4ea14c1fe35571301b0d6139bea29d1b9e0babf2c2aae05", + "181": "3920627e86db42beb1cdf61d026f9f7798082f1221db25a17fb7feb6c1d49027", + "182": "58096166bb8199abf4e07a9ef0f960065e5a635443c1937a1a3c527ade51d594", + "183": "bdf84a73b16a5dd5ece189dc970ab2c8f0cb5334c96bdd1d6ba2bad6e7f8a213", + "184": "c1e8c0f1b1eb3c258923e9daa46ef055bd79512b485c7dc73a9c5e395d5e6911", + "185": "0ea72907eb6c1120740cd80ee6b9a935cd754edcf69379328f24dfc3f09b9986", + "186": "3c0078aeae0362b6b7561518d3eb28400193fec73aab35980f138c28b6579433", + "187": "f2bc655b33e35669ee9adc841cbda98e0834083eb0657d10f7170e70081db7e0", + "188": "38e0291a3f5438779b157e5efcae6cef9db21cbac5607cd08882844cf981febd", + "189": "9b2a65ac4c35f6b392501dee2a28221a3975aac5f0866b476f5e6a5a59f3fcc2", + "190": "606fe2cb6525dabfcdab93afb594dbc8399cb967fc05f0ca93f6084d3f8fb591", + "191": "ea1977e7b22df383de61bded2a4bb3064cf17fcc0170be452330256f938b8d55", + "192": "91d614f139082168d730003f04b87135c64e13709ced2a96001ed60796867825", + "193": "65648f18a50a7f9195fe56bb8cb9e25421c6d777ad2447a3b566dc8c54f3399a", + "194": "cdd31847c6138853597261756d5e795884566220a9361217daa5ba7f87560404", + "195": "d12224510de6c98076f6289cbe342a7ec7ea3c5453f6e3cf8d37d9eea74bd07e", + "196": "1349b472d2821dff215e54d683dbfca49f0b490ade6a30b1db9667bc94e5312d", + "197": "e2aa8f7cb3ba893af8bddbffa6240e7eb71a4f4c4498f2a360f3db7b513094df", + "198": "a29d9edd0dceca9a72d2238a50dbb728846cd06594baec35a1b2c053faeab93d", + "199": "50a6b9725ef854537a554584ca74612a4d37d0ec35d85d04812c3ae730a4c8cc", + "200": "5b439098a3081d99496a7b1b2df6500ca5f66c2f170c709a57b27c6be717538a", + "201": "b4e86186652a11df0b9ec8f601c68b4823ae0bafd96357051371fde5d11a25ed", + "202": "057243f52fd25fa90a16219d945950ed5523ddb7eb6f2f361b33f8b85af25930", + "203": "2742f7af8ce9e20185e940bb4e27afc5fefe8cd7d01d7d8e16c7a5aaf3ad47aa", + "204": "15f5e9ae4636a6bf8bdd52f582774b9696b485671f4a64ab8c717166dc085205", + "205": "e03c2f4ceabf677ec502d235064a62271ce2ee91132b33f57382c4150c295784", + "206": "16bb96da8f20d738bbd735404ea148818ef5942d4d1bc4c707171f9e5e476b1e", + "207": "133fea765d0b055894d8aba573f47891c1f7f715f53edeefb200fbda758a1884", + "208": "90831cd89b4cceacaf099c9bae2452132cfa2f2b5553c651ef4948460e53d1f3", + "209": "570fab1574a3fd9aca6404083dec1c150e858e137692ee0c8011e702ec3e902f", + "210": "ae9a76ce3418c06d0eac3375a82744fb4250a2f380e723c404334d8572faead0", + "211": "aa4b2bc3a136b27bf10a858ac6a8d48f41e40f769182c444df89c5b9f0ed84e5", + "212": "81489bf56605b69cc48f0bce22615d4415b2eea882a11a33e1b317c4facba6eb", + "213": "a497e789f49b77d647de0e80cd2699acd3d384cc29c534d6609c700968124d14", + "214": "409520c6a94de382003db04a3dfee85a6dbb71324f8bd033e566e510ad47e747", + "215": "0eccb27846f417380a12dfd588a353e151b328425ecf3794c9cf7b7eec1a1110", + "216": "f735b4b441635ecded989bdc2862e35c75f5179d118d0533ae827a84ed29e81b", + "217": "9aa88ac109aefaa7ce79c7b085495863a70679058b106a5deb76b2772a531faa", + "218": "5feceb66ffc86f38d952786c6d696c79c2dbc239dd4e91b46729d73a27fb57e9", + "219": "9da1307fd12f4c9a21a34e612920cec286d937418a2d5040676408ba0c47f3d8", + "220": "a262318d02a14747ed2137c701f94248bf8651a23d1f82826952e66c25029588", + "221": "bfb4e53578fa42f83eda027da0467a351298dd65e3e8e84a987d69fc275e9f2d", + "222": "4308f4374b84e657aa7a21e5f5fe42ed16386b6dc7a74bff0d24d08ad62acd26", + "223": "3790f82f65ce7bc071b4096ca22544548b3413a755f58bfc401eff3ddf487a86", + "224": "96356c050fa66d919c75212d789544db81b012bbaf1f7915b053cb9ba2d67de7", + "225": "f37f3f2b0dc57a86dee4ba6ff855283bb4d2f0dea1c5bd1b708853444c2ffcec", + "226": "49bd28d97a79875007a6713aa9700df14464217c28a6e76bc93ded57b75a33f5", + "227": "b1f73471a3e6ea1dfb04610bd89ccb110994780084280fae872d42a2786f9131", + "228": "e38da154f6cccd06cd0001924ec2dad8de5bdcd0b78b68e8d8347768d99ac0bd", + "229": "098ffc6baaa32734053275ce38f4bbe58efe0ff946bf31e0e2df4c6a169e23d8", + "230": "2c72b887a8638941b85765645b45c5cdb73255427e14d5114f6830f847a6b861", + "231": "4aa0c92e77eeed08994650ac6129d77db9f026ae2aee78ad5c9fde132fac0505", + "232": "5f7905b71cb897bc7cc6db7e29cc38ee459e2fd8f5d58ba4746d3acd4e46d444", + "233": "8d986e287ad21475728b0dbd9e935623d69db4e5fdca0d42bc32d70eda48985b", + "234": "2d9d03b778af897e305caa8a1a14a117737bbdd549003c6d7477dd3be8331694", + "235": "7168cff545d365b09e8997bb9450343c7090913876c8f7eb9f0e9849c6fc7dd5", + "236": "ceb3002bad36c22c5da82fd422b36bad91b97a7d3f5409ed5d16aa9b42dc137a", + "237": "c857d8fa78c8fde91f29b3fbe332c2e781f7e8b54532f4c352693d6676fda2a8", + "238": "3e2edae8b8ddbcfaecd5aa6c69cb5960b84cc16f7b3232f3386aae9ecbd23f20", + "239": "49df3a63ca6509687cabb3d208e92b057630231e66b87fe8c781baabb12a55f8", + "240": "5034a21557b2de1c5c2d2aadfe8ffe62162c23f42d1aaabc705ed8519e91a3c1", + "241": "85abbe1913df41c57d1e6f00cecea416edb19c64681d1bb43fb5024e2f48d409", + "242": "4da30e6198a3d9ae6a538c2366e08ee218de6efe2c5b8f231493e21489c21a7e", + "243": "7404bb7881a010271831847e71162ee7a393843922ee93cf7cf3455a0074279c", + "244": "21aa3213adeb0a562ec7161e1cfcb5f1701303f1c9f03ed726c536283e080db6", + "245": "22b9cfa9ab97c84eb64e3478a43acd4d95b90cae8c3453c968457a89c6387a81", + "246": "729e3de7687fc597be2eb4c592d697ff29c78cff6945c9690cfb1ee67550eeed", + "247": "f49b98df95a1f826c24cf622ba4d80427a0e0767dffcc28a9206c58508863cca", + "248": "44b8116c29dafbdfa984b3751c1dfd057b3e93fc57c8cd18495f1c0f605496bc", + "249": "49e96b6ba41e88901dbd118139ef6f013b4fc59e2347058a7e726cf6a2f14067", + "250": "f0e0dc05fb555ae5ba9820586bef3bb8a3a82905ece3d8a998a3015fc91c1c3e", + "251": "8c1ece1b350c210380456da2bab70054f717731b0dfb34bc3cf4abfacf696f15", + "252": "ad20a49374f9176bd26460d35f96f30d734df3cf6fc63b4642380b4e866848de", + "253": "ba1a2bbccabbcddbf29ee0b56d0d56b4f026e8a7b97e97de2d48c133ccbdf2a1", + "254": "381a2eac64a984a81671722bd95ca5b8b6508a6f490af46780e9f393c6797223", + "255": "5e6ece13372bad4a6ea011c933389dfaefedad5860aefba2ab97fe5f59156c42", + "256": "068d4a3c845803bf66a9e5320261a0fd7b6292a8230b271a6a83f0dc8c73e907", + "257": "d80ac9215ffa7adacb22711cc88f5b580272d0d65c49e1ea48e69d17e264d91a", + "258": "256c4d399703b7f16dadef9201efc0ef9f6aa6ee05ddfa2d3e26ff6efe09704d", + "259": "275a4e84039a1596ac7e8bbe186163dcfb02bfa99c209653ff5d505a29b4cb10", + "260": "f461ff2df66653be1a2e579b1aea515d4a84f2ae5ebea3aa21fb2477a53699f4", + "261": "178ecd56cd79c7aaec1353093571ce89845130991d64c5a715a02da83a2705ab", + "262": "2e0cb5e8fc8ef04c50a5b9ab9a9eecad446598ebc2527b19c447143e5ae09736", + "263": "c870fd75ed0d5ed92ec35789c522d029f364328a16282a1c5eb9b3b7e121eff3", + "264": "da5d6bdd89eacf70a88810935f80e4725da4feaf2aa86adb13985d7d9e1c247f", + "265": "13f16351c3971c286fae5e9cfbaf6f0a128a6507804fd280971a600019e352e8", + "266": "4f39cdd293598de9259231592e99bfc5fde82a0bc1820a4c5faeb54f96037f00", + "267": "3e054d92034d3d32c3d4e7acadf1c09232e468fc2520d23d2c7d183ec0735aa3", + "268": "2d47c47a2b19178cef9e4eba1a53dd39b5f8657bbe011a71c8d402d294d50132", + "269": "4448f310ab9bff796ca70c7b7d0cd3b9c517f72744a8615112f65ba30a6d61f7", + "270": "ce71f5bd1db540762e4bc6c4798d8b7f3d2b7068e91c300fd271a46298aea2aa", + "271": "5a05e212b9b6ccf6092081f567aa73d27da399d45418f674628a8154f9182b6b", + "272": "a326c2d7121d80861aaf110826615e560aa4efdec0cc9fdfce051c6b9038e781", + "273": "d32b75411f407c5da6a9a6b4a3907b9a9ebbca6b651324c03432d549671bb837", + "274": "b5740ac928d58f53537b05ecc80b7463dc1fd5a53400f57aa55573ecbd5faa56", + "275": "e1c843ff0e97692a180e384c1a9c03c7de06ef92ccad5aa6157fabf0dbe5b804", + "276": "2edf523574e0a062cacf21f51ed6f81128537f27a3cd27b84a8b5d2478d0092d", + "277": "130c990ad499345b7638e57dce365442e2ab2d2571546aae60a9fa6ed3834b8d", + "278": "2204d89df74e664621dfe8892277d50e7774f60613561d70ae06ee0eb4c483d4", + "279": "4618456c7239784964b8fcd27155e01cf5417a16cdca7b163cc885d598ba93f4", + "280": "4b2d9501483d450371ec4413519b0b3461502aabb970fb2b07766d0a3d3a3f85", + "281": "b04a4a02fa0ae20b657dcfe3f80ef84fd446daa1521aabae006b61bb8fa5a7da", + "282": "6dab2ee10b0dc8db525aeaa2f000f3bd35580ba91e71fe92bcd120ad83cf82c5", + "283": "c964c01082a258f4c6bb66a983615686cb4ae363f4d25bd0bdad14cd628cfce8", + "284": "df960dabff27b2404555d6b83aed7a58ef9a887104d85b6d5296f1c379b28494", + "285": "087de77e5f379e7733505f196e483390596050c75dad56a999b1079ea89246ed", + "286": "8f3e5fda508a37403238471d09494dde8c206beadfa0a71381bd8c6ac93abaf4", + "287": "5d834d4c0ca68d0dca107ffe9dbaddac7fc038b0ad6ccc7ba3cfb53920236103", + "288": "20a3ef9e411065c7265deff5e9b4d398cab6f71faa134353ccea35d2b279af04", + "289": "9dda7eb623939f599551ad1d39dbf405211352ae4e65ddd87fe3e31899ca571b", + "290": "a629c35ad526f4a6c0bb42f35f3e3fa1077c34e1898eac658775072730c40d6b", + "291": "81b1e5196bec98afe72f4412cf907a2816515bad0680bd4062f2b2c715643088", + "292": "614950a1cff05f4cf403f55393ed9d7807febbae49522ef83b97e0390038ae03", + "293": "9e4067ac93c6febda554d724d453d78bf3e28a7742cdec57ee47c5c706fbe940", + "294": "9ac900bf0fbb4c3c7e26986ac33698c46c6c3e8102ab75b40b8df94fc3a0c7a1", + "295": "2fdcd631f3c68bef3c90f8679b7aef685fa33f20c2d6eb5965cd2a62267c2ffa", + "296": "dfc947e61ea2138ebe47234ba503cf5246ecec530b12e363acb240822ddf0b34", + "297": "4d5af88ba8a28b49a79773d3e6521e8731ff07d49765203b157481469e6ae6d0", + "298": "94aa77eadafaad7327acb8e653888f00e114cca2fbe04691dabdafa2a0c8cd64", + "299": "0f221ba58a8ea417e13847ef91af9ff029561ac18c74bbeeb3f5509af81a3b03", + "300": "50a79fb6e417fb4a34e155a9af683aa9a74ee922a6c156a58bfedd22cf3185c4", + "301": "eb09a0097a47e7a95b892ad7230475a1a28343b47db4faeb3e47f227aeb04738", + "302": "fcf9736fe8c20a6d02f00e9b1e719de06aff4afa99d2eba166592aeff1b8f3b7", + "303": "e6266f575c94d805a67fcd3f2391d0961b4b121b8a66afbfbae76dfc34e5c06b", + "304": "189bd2a8daf5b638ede7c50035fcf426d125de87a401382f66ab75f35b2ac1f7", + "305": "0ac58c6eb8513f4ffe911bf0f044e0153862ee89c04939fd9b294860a37ec9ce", + "306": "335998d7e2a3fae2da75a5192d62c37dd006be96831fd37e7438ec6d84451c44", + "307": "4f1f2695b1b6b1660f3ef6ac31a81630ca74da9368eafbfb214ec1980705c13c", + "308": "bc5ae127f8690ba7f6e9ddad98a49137acb45abf4e187eaf3648f197c72fbe90", + "309": "6b78ed4c4bfc942b9b5dc340961f19c690d56f9d721b6b764d1db31da53139db", + "310": "0d183ec2ff1cbc768a9eb7eb06c2a354f6c8bab00e64ca2aed2da00825f33c05", + "311": "3ae7fdad095eed78e0c63cfe4e28ab7ba2b977259590ed38722e9c44727e598b", + "312": "329d107b5743a96e3551084832587a6346e410aa89641d83f03f1242a7244473", + "313": "ecc63ee12cbe487e5390007271890b8aa5df2cf48b8e692404895d3c2af20758", + "314": "5fa65495795c52818aea910c24e4d3176c71817f5268c34e1cb259b256737352", + "315": "95bd03b9913be37d24809d30e7bfd31a1b7a127d03d65e52086857bb3a364b5d", + "316": "ca6ec6c9159e10719cd8d2cfcfaf2fe2d3637fb3d497e2c80866de6b593632e6", + "317": "5b0d72d34b406ce20714a59f1c4d5340c5559285e340497dbcad68729a9db786", + "318": "3e2b479fafb86b8ab097588b8fa12ae8a078f8b5801e15c7faa1ef23d87a631b", + "319": "e04b18947b36771937dea491f47b75fedf42a6db684035f5690e6c2bd7e6031e", + "320": "e546e4a4c9020669c78a095aa5c5038242dd78e0f98517c0e23c43aefeb58138", + "321": "3da0198df2f98a7306ee6d2e12b96ba9a6ad837a6c2d4f316d3cd8589b6af308", + "322": "07e511e9002147c33739c924c17a61126d12823d143069535a615a97f86d936f", + "323": "be514911dd6258f860c2773253f6df6c22ca975a10c4e34db5903269f2975faf", + "324": "53ed94369b59a84d003ff3155edbf481a0eef362325539d6ab1a7f370ce919c8", + "325": "43c8dc1907d3e1eb30deb565475ec1ad4f807baf6ef34178508ec85071722f0a", + "326": "b08d72606988ea5a82e0caf15e68d81b4f2e8dbb4af6a22437916f3fc53e3dea", + "327": "f70bb9cb351daf610a91a3c769d84bbb3f3b8f1169b10839196b65b8585e7c38", + "328": "6e26ed661a0add2e583229066d304f7e765a0ea337b6a93bf979e4027b70b94e", + "329": "89d8b56a1e05d90ccde0df482ff2fec3d44270739810f3c5d06856c38d801380", + "330": "2dfac8e04d08dc5eefcbba4e475164103d339f844896a75ef3af2229185118f9", + "331": "a20f9b06c126f4ee65e3f3a0bf345007b35ecb69d035dd0ad848e09300130fcb", + "332": "6593d40f4e3f53a73191c704d388c7cd1639403da6e679c8e4169b26ade19f3f", + "333": "7499bc84f6bd2211365fec34943d64f6be80a53ee2efb21c099c1c910ca29967", + "334": "f24dd99fe5b46bb7a7a30c5eff61e71cab21e05f1b03132d7da9c943f65713f6", + "335": "8e2111c24160d92b1b29dd010b8b3a0a4f9af55f1d30bd5892756c58ffaec201", + "336": "eed2e8d970c1c5031220476e6b700d16e5065d7893a2766a53600825b4ad3ae5", + "337": "44e298d1b55c51c9f127989da1149ccf6bda24c40041f777d35d5b8f192753d2", + "338": "b3a60e80296f79cfdfc02354acc674162faefcb3fb78b9672254c9cfc6eb113f", + "339": "2b55688ba27d72202632783186211ee24ea39c53915066578291fffd9db73128", + "340": "15765221271275022a6ef57634d836b052ffbab6d7d5a6899992972143841e3c", + "341": "f7340563f85e057709a2fcc71bd448fed8d6de6907d8ba5f91fefa2abffda6cf", + "342": "f252eec230c2e92ed1fa04834bc0738b79597c3b0d2a66c787fdd520e63cb3d3", + "343": "1d65c53a04f7eea94ebf76d797c0f79fe3d251bd33e5edc16c780715531b4345", + "344": "86d3fb095439bddbc0d6e6e8e433d54aff04350e2da2ad05f53d607113075c8b", + "345": "21db551743591f9cd20fffcedf3bda17f9f178bc9fbca528a56c2c61b9e7c731", + "346": "f326e2241b7e57320914aa279f9ba2e155ea77f809a188958e0b590bea9c3ada", + "347": "0fb6749b98280cc8c26950a2cb9c9dbecac18f8760e161e9bab887dcb0077653", + "348": "0cdb77330ae73fbbd0f287240f82b7547a0ef42d37004003a9c759f86b686d61", + "349": "690ad38e4357b34368966b9de08d89e0c095246bf55969842f373f1976f86062", + "350": "5b427d47f98e296cb78875619fe67d42f41868b78886d560d8fcac89043fe945", + "351": "93dcda27a0c12f0c32cc35f0de161e7f7792d11abe5d4c50d7fd5192ab8b11c0", + "352": "d01c0cd49e7649289a1f13162757de494bb9104b20ac8bdb30a4180df5225889", + "353": "3d856f38821d7b221aaaa9baa3d7927f6e360919e8f8505d7499f9bbd85c44b8", + "354": "36dd3030dec4a8050d2079678250c9c6c86c66c64fdbe7f5b82e79024bb8d5a7", + "355": "b0a915b700e415ba3acc3ef261128680b921b5df9bd6fb1d35c2d1180e7f61d7", + "356": "a309814f13708f2eb5ee8dd1a3114e8f8b15646b8c797bc7119ceaa3f6911f0e", + "357": "61c9c81a41fd294a8f07033c8373706694faab4df3652d310e84904356cf5e6c", + "358": "7d59500b8883d81040173b88462a73849e0d386a53830d599e6a042f4c1c165f", + "359": "0793805920db4896155cbce40fb58570a3cc952d0c15ee57393fa3c6ca7a8222", + "360": "ee8cacd40fb7515e510cbbe7deb6005369ce7d9800ecff897f3fd8721fd6ef71", + "361": "e96f225fa470174b4ac787b21579ad1556804de85c0c83da99a92ddc2c56c7ac", + "362": "9a4ce079c1a882a306e21e0c145dab75a2698cba3860152f03dafc802ad9006e", + "363": "258a6e6ea10385ca3c0cf08377d13ef31135bd9479d5a4983beadf158e19ccc6", + "364": "13aefde214541fab44d2a3013c532637a3da82199fb6c0a1a941c3108f76b9cf", + "365": "0cd978902035027c6898d6b5fc11fb5931f06f8e8ec9c24b4706143c91de9450", + "366": "47495a92574a6d7b150eb3f4338748ba03672ff93162139f98e03847f96551cb", + "367": "fad9203cd26fccb99f0f89fdc569c230eda46cd72ed3fb7e5f6fbcce78ced1a9", + "368": "a237e13fa6c32b66695b8c8de6472d5c93c7650989f047f62a17438c07036845", + "369": "da4c450ba0c4f76556fce54bc3f6b2a754a626cf1f87ba3280f545e023942640", + "370": "5000899cd3070e1937d42a68766c840bdb9629a49c6112bea5cff52fdb4e9f7a", + "371": "7afb55ee21c0447f7b961265abe7ccf87f59af6206949bb1da19fd36334b09df", + "372": "fcf734716ed1fa724e7228a489304e3c55e813734fb5792a83f806ab04e40485", + "373": "83c98f0431cf944440dfe0a9831275ed451b0d16856aba4100f53170c55c2e6c", + "374": "d998ea6616a5a7a9f7beb3ec02f8cbed4a9c5f17be978c31f32ac0f9f4e4460d", + "375": "6a72aba5c61e27e281235b1f001ab68b840f6e8bef0e6bbd7bfd8eec1abf844e", + "376": "980dce9435a9fc03250df4e809c2f68c48601b64c30d32c6e67bf1faa35fe274", + "377": "7b4a0b6958cf23951636b5e27af8041dd9901256c53de44c9be313ffd0a01ea0", + "378": "a1b13bda78da3ccab1af6c330d3e768fce62841f924933285e7b1f7a8b7dcd5f", + "379": "c957fcbb90e1afe9a342e95608ca035596a7dfd4cef398ada55e05a2462aba14", + "380": "b794fae83475a77832f46e69799419f9881bd774e1bfda56773b587c42591039", + "381": "e7208f3630a20b01a5e1bf5d0537be9dae9fd7529773cac12b96c4ac2b0f8dbf", + "382": "70480c0d26a6d76eba0faf3ee047d6214b2ca4d1442070ae5e79893192ffa699", + "383": "3c814d251089cb2a92a78ec3424b2a729cfbbfc6a996fd48148261312364a9a8", + "384": "f709015ae0f8ad20bd2efd94d01af3858234e381942b5b15391ff7f77211b116", + "385": "0bca6cad1f4ff336b93c9f86c4ac872bda67ee0cd41b1862a7a663852717535d", + "386": "3e1748647b60bbf292aacae65b3608ccce8e55e203a36ff062ee787cd8c14480", + "387": "cf592fa81780e727a56553df32410beba6de9c33543dd1ef1155b368ba9a9b9f", + "388": "911326fcfb0638154f69eabb87e4c0c141df09e56274c8522e9c13b7b577f00f", + "389": "cdd56fb06838a10149f2c7229bbc76f78b4a5a58945fb70a47261f1bf635c404", + "390": "07dde4848eb878808635fb7b366261b1e9cb158635e76577eecc48ccf941323f", + "391": "76cd3def1eea8e2631d333798f4d282bf40f6254b2d18c02c78cb56b33462093", + "392": "c4f7ecf21a8738c3ad0114a1ee6a2d16668e71b499741381f30827ed451dc817", + "393": "7bbc419f89fde57d2862bfb3678ddab96614693dfca109d0f444e4762a2b7a8f", + "394": "7781ca3332d6da18b1b9be5e2eff634b526ae9e8088f6e479b49d657f4f41525", + "395": "5b5de0def2c4a989a54ae3e748362c78cd018778d5adc4dec13c1bde6ffdc139", + "396": "d42c389d6abc7d8102b8cd1b906e4600da08394388d4dcd432ec955e6d8b311d", + "397": "629e23dc358ed2a8c202e1b870e270e401aecc5d726a679b542df8e6becb4200", + "398": "c30114e73097c3fa4efb203915f3b828b1b8c432ddeab2b7e1ba3fe63c50e190", + "399": "a681ef7bdb22145a3e051ecf7bfb694c18b255c80dae6fb8d49f187d28f3c58f", + "400": "c993a792804e09c9f60313f4144953eec072ca6a8a27f44d8718ce53d9429585", + "401": "074b576ae2054cd030ffcfa132b1465f8f49b836f505cd4bb01af4a98f4f5337", + "402": "d45f88fc3c00673ef7e628d867a54a4ea281b3b2620735cea85a8da3b06321df", + "403": "a09086d3cdab7d6ff8a9fba1746c5d236e0ad0abe088be99bb172e80c6f0f8f3", + "404": "55a774ac3423440dda50d73e472887195940d5e9df605b30deeb0f2528b001a4", + "405": "ee9fa61ae8153df7979be3afe6377e584fbdad624833424a5cff64f6ea94c9da", + "406": "584cba4abd5711b8f558fde97620b8ff0fe91586bad052ccff87c49c13f72555", + "407": "ac50b37409f7ea91f90856bbfa716731013deffb5f5b51540a99736e08e5378e", + "408": "2c12c3cf062c3d9cf2c53e6e4dafce70ca5c7a38c97479c3b013cd91076ecf4a", + "409": "5a55b5fb584c359f4b6ee2d21deb62923b0b25e1b4c3da0a6f351079ce657173", + "410": "9e224b6ab0b7f20759b63d1799b426a8652c9e637b1f38d3eaf8beff73c80c67", + "411": "66c0c1ab79e9887b5daf2c510f2c2c4097044b69fee6bd4ffcff73ad4816b8c7", + "412": "27f1768d99e22f8b55d010b8b7acd904e8b66751d5310d32c4d017a0ad34d650", + "413": "7c99634a1161e424a14d60b516291655096eb90ed055326325d7f5de7a44a3e7", + "414": "4e03e038e99870b1faf45a0a29d6124379d05a0a3553a11aaaa91b8ba56eac5f", + "415": "955e433ea745016af2a5df015f1cc223ddd84ddccaee60d5302b7ad61542d9e1", + "416": "8d07a87b9012a166f5bec4dcd646d5957c9b3633a1a37c40c584ede75cb7ad22", + "417": "3f738338cef45597e3b839536953104186f11d94d16877c77abd8a067c152dc3", + "418": "0c813356b30108f89fb37e8774a98af4f9eca3df49e963f985ecea82a88b1437", + "419": "8ea8d93a9e874f8c8ceeb240f1f1245a077a7c0a62287d3044feaf855b5dae78", + "420": "af7ac1e90e07f189afbb284ae24614d9e713e32098bc39bb81d6484d47351444", + "421": "f45e155846624f37cf2ee08be2a63cb1ca35bf795fb0f770b4c91ab549f22b25", + "422": "69d728f7e25055dbebd41684bc6de61be6b4db4119d7ecdcef5b5d8ead976537", + "423": "3e78c62395be704a59a3a6a65e457725105619e0a6f9f3aa6b311c4f7762b0a0", + "424": "fbd6edb36c3754a35e7de936839c4fd0564db873924ba97b35cd43e065835582", + "425": "ee5bb631b2a9edf8ed05781b192f42e24ae748f3aa4ba5e635374c094d28ddac", + "426": "3e913e088a689d2d33bc797040cea94512bf54a61f96501f60576ab22ed0304b", + "427": "415e6da4c7f92da36e2d8c43fa8056d0050ae127e648451e2fada49bf2c936d1", + "428": "389bded7b0c14212fb69b559fd1ade4f5b235b976c9655365c45481c3afda486", + "429": "3007beefa50c509b89b86c54f53757ff701f795dc5f7ed47a1520c2b092455f7", + "430": "59ec8ec2866ca502ad558ade9f8a06a9ff815a1ed649bd1cb513f417f1d4727c", + "431": "d3f28dffa4e22b3bed74c3c2c9ded1e4a8be49d3757368e4e3efaf7f79affb15", + "432": "59fd80dbc8eb4af9596e4ce8a87313d363da41313351a69ab3525faeb905c27e", + "433": "471a7ddde597fbaaaed1941f42ca1fc0f4f047e17f2197f8999dea98b38213f3", + "434": "319cb430c66d9f418aa90a3d6f9c2dfc8171383d6f4af5803a73684afcf18e15", + "435": "aa29c0119ca84133617c8bc7455afdfcf5b05a569393ff21ebcb10d32ffde2c8", + "436": "928f772ad7a9fc501f71cdef6dfe60e2d8cb5d5c5800b519d01afeae0681dd08", + "437": "ea70162a014b8294ede65af6fcdc11fb365ab2b126aef8d47983d58816fd6a54", + "438": "43633662392854b5d9f9f0fa564605212d016c9ea9377d2a6ab52137238d4191", + "439": "42f7e88fab5c9cb31d4bb34403d7958abd5023e9cf9ac05cd29626c5df763584", + "440": "cd08ef4f14b804e3106ee88f9d2b24864d5e2fec6c7cd7dddfa2713e1431375a", + "441": "daa69bac44ce5f57b4b43ab6ece3b2b3561292c0f4c6e82a506ce2973713f749", + "442": "910d2abf184cfd7b1964cec906a79f3e45f59e3d42ec20b22f56de59c9018927", + "443": "7a14ac86724d318e6d40464e710c17625d441d1e7adf83d3062305de2f85d445", + "444": "390877dded07897360921e8d0d126bf45d6a379d47292c90826d775bd1897f2f", + "445": "5ee5723341b0b81c9e0172fcb654f8b24322244bc2d1b55afcb78b180ada180b", + "446": "8b2dcb0168e8701dc9da286489a1e68e43e1b17638e5990edd882196d7fd5a29", + "447": "179af1c75faa5f42e89ce3b41496a64b2d2846361f76dd5d87f4ce97ec2bec07", + "448": "18173b14e0c0bf403b5f0d4aa23515ecf44622b3a860d80e866cd498f107123c", + "449": "22d7739bccf54ea1159ce6aca3e215482deba85a4db0676cf86d82a760c44a6c", + "450": "938bf7cdedab94bd7208b69047014e3d9ab7b54d1223bd649eb3de0bd61ab47e", + "451": "abd88e378f54b649e818d6e1d8e06c9f8cf225ac96b4085523acbb1f0c1df24b", + "452": "4119701c51dd8c457b74a19ed7ae3bdf069f5fd915c8085e9a15d909a39db036", + "453": "381ba093e8ece9e14efc965ee94bb8adbd1c0bf140875ef95f8f11050d5ed489", + "454": "b7613128b0401fdbc07a4015eb3935f6677b84dff936fc5e7e9f424d0ba1006e", + "455": "35ee11c9763f48a68f2b60b4b9c3919d3a895afc7071e8dcac5abd5845dfe79f", + "456": "8b129a3c7163dae86f1f43c18557296240a02bdac70ad29538eb5dce00e51f4d", + "457": "629c99f9af0e962f00b812057c0967861a9b6db9dd652233ac4b37f368d09206", + "458": "02df8a1d11130bde8af932dfc5cafe7d8e6c2fc12b82df5d222a91e4eed8e2f8", + "459": "062b225facc7a897e0e42e6b0f95deeb8b02de64267bf5cea4cb5280ccec1562", + "460": "a05f9a7cb049c40760ea2196eb41df1826ad492e6e5fc4696ce7bfcf7a842811", + "461": "95e5e99da04c0cd73e1818a62be3fc0de98c76d5cbdc81261672824ed5b8c1a7", + "462": "69eafed1b3d4022fc245a8416c1120bdcd039716db8cd43351a96e6c7d10691d", + "463": "018efbd353bb456112cf2c760b4d96aef02aa899ef74d4aadfb3dcf374a22987", + "464": "cd4447e836cdbed7f6a3998b50c4ab467aedaeb8e54c377da34245e90fddbe12", + "465": "da0612471988c89ea2fb190838f9f5e9029fd106330a801e66280c967ff1c52b", + "466": "8d16100c0148ed7bd41003b4a0612cbc5fa150ddabe5f9916ed6eac3fcfdefa4", + "467": "d6ea164cb91d14d6aba2d482926cb6cbd1a3644737a0530abac635083a97b8a4", + "468": "8d0e3f6bff322ff11d1267f1f8303a8ce1e2d796b7dc2d9eb3e3da939dd850b5", + "469": "35e2072f22c7cb980fbe797e30c25e9224328813eb81d07d3c88820492ce9a1f", + "470": "4993f275946ae0d444410821faa3ef4a448f10888c50ff59f7ae01d0b50328d9", + "471": "b9af9323a0237fbf88fdb14b8bce95c084351325249629ffd4fbb32fe9d6da5d", + "472": "5b278c08ab97d82c1779411fb1018b07feac7ddf38a69e4d398240a495c54271", + "473": "4448b03417a784f554c44eb15ad2d4cc022bd9cb5abe2547811eb8085355aaaa", + "474": "1c64fc4076d6b00aff86a180fd9af927b7c1c9ba87a2ca3c83dd80ba5e5ea973", + "475": "e571b4b8218a2961ed2b04f62f816eb18686d82b7f2693694b9c774acef4a0ff", + "476": "a6383ed918d7851ed7503921a64201a032a33c9e1cbd4e08d1233f543bd21be9", + "477": "c871da03e684e099190c4ce787a9588ae85841246ad7bcc9cb4c302d617f881d", + "478": "96d8bec6b787a7aea2da8dfa8a1226e00881afc218c211fc59da830775d55acb", + "479": "b35720df96afbd98c6a4f081ae1173fdce21d63f75f7b455f4c2b9fc0aa672c2", + "480": "2db876e9625c8638c66103ad0206c9a51b68d4c6a3222f403b195a81837856e3", + "481": "bac35824e79af403a2058b08cbc84f8e4df93a21d1766e4ea1de6414e2a8a926", + "482": "0f9797e2f3691bc7291d81d1ddd5d88cb4e10b0be555e2ebfbd3c5b12b7cd2b2", + "483": "8f3348df383ec9ee00e18d41c419370d42ca6ebf71c510690aa5435a679b7e4f", + "484": "3b3bac32669c5b66faaa42b89a2dcb4de0bb9aa0bd279d60061dbe9e7039f5dc", + "485": "25d0335a0576f974617351ef5aec889f311fc8d7cddb997862b10b2496842d4d", + "486": "93b9a59a937594d2196271416ea3b2221d32b3b40a04bbebbdf97e8bdc557e0a", + "487": "a643c75a8d062b87a1c8635fdf439c04d949ce01f75dde10ab6edba90cbaee77", + "488": "984593c12abbff5d009091cd3c1883c87efc535f760727ed12f06df0902bfa75", + "489": "926ac61244f94e10270a2d40169de025be6db342b3de7f0db33a50b07176c143", + "490": "e2c8142e501b0b0b808d2d36f5f38266f99cd3aaca7d2f70f4bba386ae1d2025", + "491": "1a1c8b472424f8057c94a9f5e0c0b673551fbe9ea4cde5ca2d90df1de76a5c76", + "492": "345a83966ead821efa2a9de93aeb0fd5bd60a8f50e162caae2447f1f4d9462bd", + "493": "ee7018d63b08bc7226d6f77c2345a87e09fc7cc87b0a003aaf3a4a3f622edffd", + "494": "3d69e540997d79f21f249d4d8f73cd75119d81bcfb8bd80782863249f0d7c62c", + "495": "b717f1088b0ce24851c30d54bc8dad9f3ae93402b91c874e385e5c699323a5e2", + "496": "fbe77ec1978ad86e73e5a3f494fa7c198fe334b511298f5a0f2d04d6a7f51d01", + "497": "a4a66d6c7c555a2997ca59a8dbab512388adf20902293a5617132a16df76d954", + "498": "d71813b8175fa2d70181d87ae8f839e79792516a1cfa99a7e6b29500c057617f", + "499": "477d5b817df8c0b6f0928d02a58fc39fde2224493cec89393bd6dc349e5235bf", + "500": "3ac8e26d4864c538936efa7c5920435107a50c01306adaee5a4aeaa2ef378f7d", + "501": "766448b05b248ac3d6e991baa3e4b2d53b02aac426bda312c2299b2b983e145e", + "502": "50218b55f5b7207438137f2b0c71e3f6d37afd76aa5b1f2106111f3432b4cef8", + "503": "1d7c24799a287d42e97dd4ccc5bbd3713ce139e6294896cc5fe2efb80a1be7ad", + "504": "9878db5eb2218b18568dc8cfa13bc8363a1c93e6a59a05cc76da0588fd54af46", + "505": "872fc20275833f09c8aaef277abfe77f67be6bd443b489e0cb8bdf9d4ca9fac7", + "506": "d66834cc7ebe58cce2ee1c02bb11ae69672d711ead6a0a58ab592339cddbf02e", + "507": "ae955394665befbbc89e2ba85b5e520cb293b8d03209b1f71d78ce2cc807a437", + "508": "3917ce4173af47bfaf8525f0917736bde3f4bee0ed5fae721c3e2fa957ab1675", + "509": "2f64571cd71f0e59006da84808abf3d3ccff9a38884321533d448b3e8e3cae05", + "510": "41ce72f4701e786427413b68fb70bd77d921c06648ca15033ce1926a9f1224cb", + "511": "c9fc787389265492e60d5503f279714d5b19760ea7b2e1a720e6fc0251fe087c", + "512": "a8af6acf3744af13cde63540e37bb9bc722ea19a012656e3a3c5bfff8292c423", + "513": "506b90816555d1083be7d211f02a5db364e5c2337fc85b1ba845c1a806689373", + "514": "e4e9536766181eda627721723bfbdbca85859a3ba92d439f58ac0009c102430c", + "515": "16daaa62fa87776bc4843d226988cc83ee846ceef7b885ab63e10789b30071ae", + "516": "44b6de4eb51dd8f762142f284b154d3153592549cdea3b94467fa95484a4f172", + "517": "bb72c6d437197a8c1f1132626b3b47adb9827f4f9b912d1069cfcc75575371b5", + "518": "ff57c1f518651af805bb4b258130c7c5b0726422c3390327217562088785b4ba", + "519": "159b59f1261b7a31d7172cdc28d9515d0731e5117cb30f34a497bc3bd0496da2", + "520": "bdfb7f17c8c841c0b61ee7f00e51f09e4c78c90f7977548b72050a7aa12dfa3f", + "521": "bd27ca9292c19160cbb0568f750b247fbb805b85f4a2316fcf2c3a35d3ae031d", + "522": "98e0ef155297aac8a4060d204614753f26f6ba5357deb78c683783dc7ae30191", + "523": "9bfc344c80d1200fe12bea3ba4cacf8d5ac9693258962f2f15f42b30ce8ef3ef", + "524": "8df22d8716d7ca6354ea42b8e522d286ff9362cfa5881f527efcf1a953ed1151", + "525": "13dc6d869fbe2c3d95f715e55f02bc3d5787874b4c88d7da1d05360afd2025fa", + "526": "dfbe442040ce9afba654773fb14f307d67ab614267d3feb6b18df03182b5b60f", + "527": "ba634833af68fcf0ca7bcb08fa699b2c5fab934eb81ecd85e7464b01bca131ca", + "528": "016f7b569dc1c3466c97754c7dcc0f76c2a32a76c22357cc521bcc330d86daf5", + "529": "4960ff863e3d21a58f9e81c3d94075cb7a4daea5fcf396812382111e462fc57f", + "530": "6a2e45fdfcad65e0ee84d206d59cbac998026d7415d16a5c0b8c55e4a7d6bb3f", + "531": "95ec72fa8c409255d43e7c8d4e957bcb9239534973187b3b4cc2557b09bdba98", + "532": "fee6802490757983c499a08831d9bdc75a9eff08700bd29e8e5c134583ee07b3", + "533": "8a056666bd75d853a12d22b8317042a3f5500cfb21f6698d90ab41e01edcf81d", + "534": "8f65c9feb935e09a04c87143d1b2c63e38f08738199ebcc2758f67ee914d8a48", + "535": "ed8970f8ef1e2374289fc735aedff90b010c311a3b80d16df6bca2d3c250fdeb", + "536": "f82635851b442ec0ee95c5c2b7377ba382aa364cc49ff4e981d509ef324bb356", + "537": "54fc97bb6f3d7c724d4e245df37111c20334972300297fe38b590354fb9dfe92", + "538": "650c7f5f382c295cf6e7fb092db6fdfff164c861bcfcfe1fb38a50268f53f50a", + "539": "0bfb3df290912d8a70dc5e1e2761151cdf2c4b75d4b37c8fdcbed7483ada85fd", + "540": "08f1b2bffa88a9d01eecb8c9da6636b5e668a5478d8876a63ec3a74d7f932205", + "541": "5e59cf440336e86b67c17ed61f7bee7e548c434f475c415294b3b652d1aec606", + "542": "1257b6a3ad900df97f5aabc1e18b9f7ddae8c7d7ad60216ae21b5b7310cbda84", + "543": "8a783bfbe11c7f7b24431a15a0eb582f6fe5f75d1d21a3d55f8d8d81ba6b411c", + "544": "ce93bedef94ffbf62ad449cb0c68e8103a0bd005563ab854daa5e470664b4d7b", + "545": "40c253003d601fd2c90908bffcd8133e77489fe247e74ec03901895318fe69de", + "546": "d40739115f18fee96817266232ff1b8845e7966778fdcc644028fe5c759469be", + "547": "fa32a8de8fdcfc551d808c5dd0ff5545a199027acd32e380959b91f3b3d04643", + "548": "72e66168068b6ffcd2988e24124c8b1dba9a5b52a383a937397575e3c1e3f031", + "549": "a23baaa745a976b4f212836beb81a0a7b42d9f2e923c2412e2c07c63ff660ceb", + "550": "f58ff320639b2c47c76ed8aba487e31da0fd4656c3be6e33807cd00f77456e5d", + "551": "0449ec4d6d5b2e88603e62f3ec0287ed711cff682bbdfe298a197144ab24e80b", + "552": "f125761e8a0d02b17b1dc4be40216f2791727fd4e4bc56f60ebea1925c2fbf36", + "553": "dbb93b2a6cbf972bb1f94d1f8656cd113a09a02cbc44f25737e7d75c986646e1", + "554": "dcfd1e7a4a32ff0fae296b8211b5c9e91ab81844a0308933f598c712c1bc313d", + "555": "cebbca914f917f990202f110e77285132d2a5a3ba9a7475c93e3561d8ba88ea0", + "556": "0d5518ef165979b758fcc8df9c8cf536861f376f8640541ba6112ee7610ed82e", + "557": "0547c86b57c7c8c590f6d7a5131778f5b6ab2eeccc5e819e5fd095a6d4e68b08", + "558": "e763aa1dd494e097251484381ddb057c7d79b739c3f8644b1759e786e12f5b40", + "559": "e48eea4c3b4c9d58fe02739accf31bb64dd9c31623ad4cc06c740463d664c098", + "560": "77a09dc1ea6f1ae669004b8c9429dd83ead1148c62e0d945173edac45d9000a4", + "561": "756d226727e611d4bd22aa33747da2f635eeec070906dbc3262ef29e341e2a6d", + "562": "29de450d6e440c528287b98bcb4b76fb5155ab573df4721467446114661936ed", + "563": "7703d943dbbfdccb90acad65ed7c0eb13a10034ad01809472a55eb3162b7e53b", + "564": "65712c105411e6fc0ed35b9347de8cbaea33b0c5e57cf162f48dc257dd4f05b5", + "565": "2945ef4779089c9e49a9a9f5e2a67ba7e393aa20a955ed9302da6677cb03a9cd", + "566": "95d936e1d454df2e1e7d486c43af387b39a50cb57e57c7712d967bc9ec556f41", + "567": "2abe8af9ee20c6b8ad5034bc31fc1f4f16769595d5b4fc2837db3e76a90ac405", + "568": "fdc104338866e50ae2bffc1ea19719136f639df6c25f38a8680a70e9375a9378", + "569": "25677266de2b900788dfa047cb53f5585c37b564b3a711243fad52e186ec184a", + "570": "9101edb48d98c3742ceb713de591d261b79e90481d28f83f2d2c74d7034f4b46", + "571": "c364dde8cce2080d073eb1f9666cca97ccdeba61b2bf19ca0c84987e6f8d3576", + "572": "9cc3049e9464376b95fb88d6fff4331e0e40196f92a0a9aa1c5d10dfe33079f7", + "573": "2ade73491e183608b340f312d08cfd39c10ecb581c87b873443590452580a43e", + "574": "96325b210d18a7a1d6873e00a859648c4754bd4c91c324aa812ed78bd047118b", + "575": "33942a261a9150e2b5ce2ffe5b934a81f3972cf5aa5a9414a9d5f63f6b55324b", + "576": "7fca01a835681914b5fe5014d5649b5170faf459375ccc2bf9ad71ebaa73940c", + "577": "2bdc7a0e8adacf885c6ea0f6534b935b8a9dd338c5dcff05a74c162c3e9dd531", + "578": "ce6b6de1d907c8839b84f5f3967f6af7e9a3644a0bd7dffe80cfe531de08f8ca", + "579": "03dbff2575902a3c56a64483c8e8ca38d9888f72c6a71a6236eb07b808fb24ab", + "580": "96892003c30358ed55a39e13e6159fad09ebc3916e34492b91d63832fa86f731", + "581": "4fc5533c52133e54f8b54dcbfc4555638ae809676dbfec9d1400ab032f30648d", + "582": "7ba9b154acf699c8a123df5471fd40ad556cf6fc630136c686c87b09c88ff546", + "583": "ec10ea6801eadac9ae8ead5f222e0580f419b67d2ad5cd5c8ac914dcf5cfd69f", + "584": "510001c4104c80517a13f967df6ee071f15fb7b65e97229bc91b2925cbe4e93e", + "585": "ced737da53940337c5dff81720024fbaf4cee38aed1d3514d2a75c7b1271acf8", + "586": "9ab074d1d480d718930c9abac8b616a0bc5c30846381d6d9bce1741e9bca1991", + "587": "ec3fdcd8136188e3b476270894351cdc05dc44a4df50d1c4ed727294fb89430f", + "588": "31400607f95129fcc531604b7b0478a748d2495746280dc07ff30e39cd6f4a97", + "589": "3051de9b2a7ced941140aa1074952029f532e133beb41c18bfd990f43bfbd9ae", + "590": "4af295f83800334d77a04d56be7524ff6241e3d8b2f23820c9c54580b7996086", + "591": "2ecf2c1ab8d9e5cef5224842732af17bd2259598e4363e1d46cb172dccc39022", + "592": "2e71a26370d45781f31ede0c7810c2705706ce63291a52d5cd6f060ae16aeb01", + "593": "423867f77b64f725f823204796301ae09b427190cdbb62d472bc1395507da9a2", + "594": "6c28830e35913c59000dfce4432db255f7dd34809285881f05a9e9749f5d8452", + "595": "53fc00ae32e0b0d701175ac17ac0b91e05859ae6d7f3e5bf0548dad36e3d68f9", + "596": "9ccbee33387383d458e7ffa2c9c0cb9e4f5bbe3d1b949463a98232ae67d29956", + "597": "921102754e24e8ba99480e77652d88764020202e6dcd67adddbb1660204e8e78", + "598": "430f975f490ce37df74bc346556cb2186f7a47a58d3b282ab42f35b33a812f7c", + "599": "b603988248769444a1566b058ef3660cac528086b8193efd6d0be4080b834780", + "600": "dd539cd38fade63aa0d14899c7c75ff459ab839148b15b4efacd4bdfa0408dae", + "601": "571c5ade4cd89b460b7d2568a44d1efb05e2927ec840d8ecf149dc9e0ff09734", + "602": "edef32d6c2c7193b4b30a0e2c7d3ab37e0ec21db62543f4bf78169b683792e41", + "603": "cce7491b7ddf0e3ebde191e0e57614e61602cfaa2b52be5c2d657d9ae5e1f1b1", + "604": "d08fe0e5c0fc10640043f9d645446e23fa8efbfdf29c93c87794e5b6405ff51e", + "605": "1bdd74af73e2434db6149fd8089bd294defe3cedfaaf92f532568ddc6c48e2ea", + "606": "30e44b49f18048323d1c1bf4631587df8f0dbd477ebc79b7ef860a792953d932", + "607": "2d9b6a1b4810a39471e5dae85eadf595fc108097eeda746c8925a7be057464de", + "608": "cd3fdc5ee5b6e606349b9e5775d6e632e0424d6190f632632bd7435d5622b20d", + "609": "8b86933e27e64e6840bedc8087fa31326d9527a424c63ecc61823894c81f867d", + "610": "a781fd7cb6970e8f6f679296be5bb0fe7ea62207caa7ce86635257186a5a70d9", + "611": "4a3a0b9877d68deb8d7db624ec2d7f4b1c467fe337f803a220292ac6131acc05", + "612": "6e95bb170c3a521fc7befa446cad879a36b7b3d0e0e8eab1df6ddbd753156ab7", + "613": "afe8c7002c5e15859be829b4b69f0da00c1298971d5afa469b050016fc021978", + "614": "f85495a58ad9d5c4d16167084bbc3581ea22e6dfc39423b70d7fe486e316d951", + "615": "8da9fc3356df220081c71ccfc9c67251e6dd7058fb11258ecfc88ea9b8c00c92", + "616": "0fadf4975e2c27aae12447e080505d604258102f61c8667a5c2594ee033567e8", + "617": "06d9e8723de7ffd20129f1d8b5993926a97cad1261dc0cf01a37d8fa728ee996", + "618": "04d0dc62694f26c61871d8129259540884ad2296a3cf455f6b92fc911f98c336", + "619": "a93d0ec83cbbd4ec0866c97b372e4374a9d6724cc3767f5230e8316734cbb0eb", + "620": "071da5dc1dd87c2558b45247c29a92092bc5a00ef3cd46d70d08e18b791d2926", + "621": "458ca388a6b74c57ae13d1233984d5b66abb1f18dbfa12aa14ba868a9b5a708d", + "622": "1ad0227dc5f8c259ada5120d9db05ac7a013bd1bd84cbbca2f0ae6b174dac129", + "623": "d82d0401e10767b022417dbb64d348bc6c03ed4bb7e4553493e8d9e65525d229", + "624": "1d25005c86a9635d3483ea63ce95fa097f95792ebab86319c12bc66ea1d2ac83", + "625": "3fc397ed884cabc16bf30bb7487c8211424a08279a166d4fa4da6dc151a02cd1", + "626": "7c42e09e504cb269512dae989ee7fffe1f3bfea499c990e8edea796761331ccb", + "627": "5062b75aa39c974a579b0a3360c4da32e481d2242de72106f651c7d7de631cf1", + "628": "dc656eef13928f18d14a9265be6a923bc7d76048b861cdf1523e397801a8ef52", + "629": "9eefedc5b5995658be337f48146e37020db4ed3bb61e2af1fc57f698bd398b0d", + "630": "6e17ecc4a4d07ffbd67c49a59d31b7efeabd3bfead49fdf1ec005836e6030ebf", + "631": "781372694518c122f62566aec8867772e492fefef32c00e24b5604297dc1d44c", + "632": "c978055ae1d71dfdfd8bb4e845bb82fc4211b14560bf6001edefa4367e1d4403", + "633": "af4ff4b546369974642b3f68d4d3e90f0a0496b3b5d1572b638378fb49c7b4fa", + "634": "f6af89331ee087a2fc03e0bddd738e2716b49ed616ceb3b47743cf3806c6d8c2", + "635": "e4251ea6989571d8b83993560b537b7a9d0777ba54e6941757580cbfc14aab5f", + "636": "dc15b5ccabd8fd3141c244b7dbc6fe95078299ea3ce3016cbb483893fcdd4236", + "637": "053571be83ed06ab23a96d4e8fa129a4ce7e740de17dc35b000fb56c35a5ab80", + "638": "df57e1f418a24e38b39011048084c6b5cc91a56c1deb643ab605e0350f329b4b", + "639": "56930902baea90d1a8e505a227e5d7ac4da6b60f6c370ab75a0011cb3746818f", + "640": "c105d171242fa8e35f26491ba2f932d1577dfab2a4a6e75034ae69f062e8aa71", + "641": "0f6c3873a87ce630accf7f3b19feb764aac3fa0c3933042a817a82e6a9963aea", + "642": "c20081830b70a00d1bcc6f4b6572d511d534986c10ea3c057db304a1f26df2da", + "643": "143de023a92c7c8ce5fc0b839644e897267c44c8ba4e715743dc99686415a8b5", + "644": "7a8c9f1db1b1bce9a3b8d91e5b1a39a92a478029d975f5e45d593b7ca81a7134", + "645": "932a51e4c0cc5e30041ca5db1fd0674820638563a9df1300bece7df12c23017e", + "646": "a49cbd2966ea8248816b0a53b6eedea4aef2525aac45272b862d7d52e604625a", + "647": "40ad98735f3b5417ea1916f6146b69b7659963263caed186abf0790de0d9dae9", + "648": "53b288529a83c376f2399e986e5ca25c5993a6640063386fdb2de491afba2e81", + "649": "c0bebda0473186148087feb9828a418ab8d50726a1ff5c39ec69c4a6232c6b67", + "650": "98ac68d2bc42f89dbe97b3392ac691ed6c2c4f36a44665555bf7f816ca97cd27", + "651": "81f8287532f504b4f4a21e6d6ed573845bff197c479fb52e4c5b6f2fc1cfc40f", + "652": "fa32d8e7c1c766a6126b0f1cdd9d752cad55f54d0c05839e89d4da238615d9ed", + "653": "311cec39a42837f803ce8cfa5e6df32cc27fe541de108e3e7cf7ba3242e414ee", + "654": "f2b3d205c2da66cdf9a596e2caa1098132b832758eea2b14da071b8dd9584ec9", + "655": "39517ea688972769cccd46ad15b4f06ac2a6175d053dc97f849fa11a63a163e8", + "656": "2a21e5e89d9b019c1195c50af7c6e1864cbab05068d10e11519fb6d4766ceae5", + "657": "bbf54db41dc18753a3caa5001aae99c0c998e8a07b6e7390932054d7882498e3", + "658": "ca8e7b53b095939e5fafefa56e9b45b40c396145acf2a767f9f2430fbba75a79", + "659": "3d6c8492fbfe1c76e3f9d66485a7447489b89763623127deb6ed327a0c2a011b", + "660": "23d754ebe35981ad5de850f66bb2294a22280a8ad0b4160b1c29dfb5487505d9", + "661": "fd7eaca9690ee0384770e855ed600c96080c5c23565bfdae01c6045a87d9550a", + "662": "b93bc0a52860ee0a1fdc28adeca7b39288b1119e0f318467f0a193236e00f99c", + "663": "f73e3335b21c11b78987deb5a6eace1cef327981322f53a070adfbe31b56e7d0", + "664": "f3f0de955603850bd411690d11a5391e63f515a29e31e9241c66c62d688bcf72", + "665": "f2650e75f39098e5a114077b6e07bc15325adce22e1ab4b20569a4eeda5c6ca6", + "666": "a01a34d1c29aff5618a96046605adb74fa49b834975051d4ac82672567727a21", + "667": "2db51646a4038b38c88512738f79bb21776d39c7bfa3086538cccba0b63024db", + "668": "2f3336b7f1211fcc180cd76dc6442fecb412771aa45ef1a7675aa437d04e582b", + "669": "28bf022d827392eff1ec8ec121767ec24778f1b69da8605b4ab059023b8ad28a", + "670": "38db5dbb2a3ce2d31d1958f5b3ca4c3555eb0ac4193ebffa3f42ffd6bb4806e3", + "671": "0580cf2ef8abd3afbf91fba2032c2d51e43306bebb7f979bb750c3d7bd14c961", + "672": "394f1b74ccfac5a4fa958d813b5932371c5f8c2f3dbd1eb7202af2223aa08afb", + "673": "61c90400cd197b8ea6d7de90fcd1af0959fc37625fe163363fdae0ac4a724bfd", + "674": "6037c38f696b10fb531c26396890cd3b48d5408c5b37e61d03a72ae2f7b64ed6", + "675": "39c8b1bd1d534381b811bd8050e54b753106c1bfaf5d3cc63d8fe92a94471915", + "676": "346d1e2de9915fa2f4ce3675ccebadccb8e9d14239f1e53b6d08d09f5c26297d", + "677": "36841bba8f77d669e9d8f4e09ec580ce2c7a36c37da719815e65cc641eb1fdeb", + "678": "09532ddbaffb710f02964e270f8658bd8a09149744726a82f618708b35a5fa26", + "679": "774f8d6f89a5875342b21e8337aa5e3ab0539960a5b42554bc8d8a0fffce7d65", + "680": "48d62baa62c2a9c561612192ec39a7dbcecc8badadc0ddc755191648597a42f9", + "681": "7adc09dd86f3e73979d9f8a4b3232102ca52bc41d043614fe989cd908ed88c76", + "682": "522f0ff3ae2f1761dca78207dec1c9b52556eba2db7503ca03441abf62f65c76", + "683": "376e3c3e4b88ee76cb0f02390751a7248fcf1562013b1390b1e276a3f3d7da63", + "684": "6363f306f081683781908acd4bedd92b3a75c796243cdacadc4b9896d8cfaaaa", + "685": "29f2c4c5325cf626b392a910e6e22b6d2a989bfbb38439c20162b7b786b5e2f8", + "686": "990ae3583a1f7a32b7581a8ace626511c812e0bd910b8064fefb31e625b9c22d", + "687": "7e78b4b91851b976f5cc2a1341b9389ae7bdd0248ae7f7c53e7ebb2d86bbc73c", + "688": "1ada92e769892b4bb540d75cbf40017a24b5b309b28a097ed62eb7f2727518e7", + "689": "17a0ba5b100d0a92f3f82e2e6f31c71a6ca53a0f043094a6419331e22036150b", + "690": "f9658a8f0687d69f420f655c500304c3c0888f298a68075ab6a2165a3bc47c53", + "691": "3ff8aa53eb2f7e700fdc7cb838ca7f7b495948bb997ef70d196c10592fa64680", + "692": "c01c3e579b2743866cd3d0c1d9039871356143a99c572593d2702f387e9f629f", + "693": "c08e2dd3686459c2989cd6a367d2cc64b2bc2af460417102e9856e91b5f78fa4", + "694": "063e59bfd9cbed08afa508954ac9c1c313b80331d6a917fd2202e15e1eeb00e9", + "695": "c3259eeed96a5837a6630fd9d1245de7c77e10d0733b6129a3dc99548bd92800", + "696": "9ab20a4d8c3c0de897a1c8afa95733d0f7f79870c6379064ef4cf1f5baae67e6", + "697": "62c07adf4da24a20a723f6c32e35a51f2b942e363dc9fa35070e34991a5a9c1d", + "698": "632f1a4eba12f5c80401d82c4bad7c5679f55ccc89bf2da3e3930ff3d6671ba1", + "699": "8c40c5c92fad7ed2774080ddd39f62cdc94ca05dde4273344497ab4206499484", + "700": "3dccee8e873d2c9c2f8359417e666b702f97b60b90b229e3c41190909ff9388b", + "701": "65a57fc7ebcdab77821276a1eba1c1a625bf2bae575b025359de492592ded205", + "702": "c1b0ade78aadbf0d5576489c2200439ef825fe74452115edbc908e9ff955efc0", + "703": "1e5ea7fffdcdbca5fc91694b200db8e2e3737e829b7694e4dcf3b937b41be330", + "704": "9ddf38880f294ac1a759c764c394cacd4635735880f326a0b5e4a896e4fdce8c", + "705": "2bb033d9eeb9157fc6ae835e99b9523bfb1d61173cfb34941cbfdc4c0d3ea67e", + "706": "51a0e8daacbd6537efd583c48c5815a9bd22fef0eb9b8e15dbe2ee87c76e2a6b", + "707": "9f50d3b52dc4ebae279c6f6021258ca8cd60b8cd13e358f29a2879caa390a774", + "708": "42e0a9be7737aaab1fd27543c0273f4c97dd3bd6471e6ec04b1fc7b79542db71", + "709": "ac2605c16873ea2b5f0ce5008089a55e37588f45313ad06ccc7dfd96f407eb8a", + "710": "09214942caed4184e7155b4016b1e0de37c0a142deaebee3879c770438a28276", + "711": "8d8ea19a78bcb10e502f91a057bac1b200ab17db66e11cdf42b63ec65a8e6c18", + "712": "001493340cc232a48125f958308be6d0567ff2684e0625e55af8b0a024c4ccca", + "713": "98a124df4ffa11cca86fbd959f4d091665fc871a4a86cc1024429d1c116b556e", + "714": "cd175b00873a9a3369c628861c1f20df57a4ca75074530ebf5b974d04b8b93c4", + "715": "cdb954d8620ad2d95915f94243cdcf71170cfc363334b2f831544f55f0d15746", + "716": "abb62293fb9df9bc7a6e80ea24f0da1049f894ade937367e24563a3277f953ef", + "717": "319369720bf1831be4c73600c26f5d08dcf6cf85fd32340c28263e39c1dda5e6", + "718": "412ce061b1ae228d2226fdb3bf2cb68421870465d6a8cf7ae58515c02fe54684", + "719": "c461587d4f3a41c375628e94fb9f971cc2829b8608d3c7aca840e62a6c8f1929", + "720": "3651d0d1f023c90e42be5c6ccf28ca71203d1c67d85249323d35db28f146786f", + "721": "8430fc43038ba44efb6e9ecbd5aa3dfeaeaf73f2d04a2d5596855c7de5de9c20", + "722": "9687101dfe209fd65f57a10603baa38ba83c9152e43a8b802b96f1e07f568e0e", + "723": "74832787e7d4e0cb7991256c8f6d02775dffec0684de234786f25f898003f2de", + "724": "fa05e2b497e7eafa64574017a4c45aadef6b163d907b03d63ba3f4021096d329", + "725": "005c873563f51bbebfdb1f8dbc383259e9a98e506bc87ae8d8c9044b81fc6418" +} diff --git a/python-mega-algo/scripts/right.html b/python-mega-algo/scripts/right.html new file mode 100644 index 00000000..853e0632 --- /dev/null +++ b/python-mega-algo/scripts/right.html @@ -0,0 +1,30 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/scripts + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + + +
    FileFileFileFile
    project_e...s.json validate_...mes.py validate_...ons.py __init__.py 
    build_dir..._md.py 
    + +

    +Folders: 1
    +Files: 5
    +Size of all files: 62007 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/scripts/validate_filenames.py b/python-mega-algo/scripts/validate_filenames.py new file mode 100644 index 00000000..ed23f390 --- /dev/null +++ b/python-mega-algo/scripts/validate_filenames.py @@ -0,0 +1,36 @@ +#!/usr/bin/env python3 +import os + +try: + from .build_directory_md import good_file_paths +except ImportError: + from build_directory_md import good_file_paths # type: ignore + +filepaths = list(good_file_paths()) +assert filepaths, "good_file_paths() failed!" + +upper_files = [file for file in filepaths if file != file.lower()] +if upper_files: + print(f"{len(upper_files)} files contain uppercase characters:") + print("\n".join(upper_files) + "\n") + +space_files = [file for file in filepaths if " " in file] +if space_files: + print(f"{len(space_files)} files contain space characters:") + print("\n".join(space_files) + "\n") + +hyphen_files = [file for file in filepaths if "-" in file] +if hyphen_files: + print(f"{len(hyphen_files)} files contain hyphen characters:") + print("\n".join(hyphen_files) + "\n") + +nodir_files = [file for file in filepaths if os.sep not in file] +if nodir_files: + print(f"{len(nodir_files)} files are not in a directory:") + print("\n".join(nodir_files) + "\n") + +bad_files = len(upper_files + space_files + hyphen_files + nodir_files) +if bad_files: + import sys + + sys.exit(bad_files) diff --git a/python-mega-algo/scripts/validate_solutions.py b/python-mega-algo/scripts/validate_solutions.py new file mode 100644 index 00000000..68461dca --- /dev/null +++ b/python-mega-algo/scripts/validate_solutions.py @@ -0,0 +1,96 @@ +#!/usr/bin/env python3 +import hashlib +import importlib.util +import json +import os +import pathlib +from types import ModuleType + +import pytest +import requests + +PROJECT_EULER_DIR_PATH = pathlib.Path.cwd().joinpath("project_euler") +PROJECT_EULER_ANSWERS_PATH = pathlib.Path.cwd().joinpath( + "scripts", "project_euler_answers.json" +) + +with open(PROJECT_EULER_ANSWERS_PATH) as file_handle: + PROBLEM_ANSWERS: dict[str, str] = json.load(file_handle) + + +def convert_path_to_module(file_path: pathlib.Path) -> ModuleType: + """Converts a file path to a Python module""" + spec = importlib.util.spec_from_file_location(file_path.name, str(file_path)) + module = importlib.util.module_from_spec(spec) + spec.loader.exec_module(module) # type: ignore + return module + + +def all_solution_file_paths() -> list[pathlib.Path]: + """Collects all the solution file path in the Project Euler directory""" + solution_file_paths = [] + for problem_dir_path in PROJECT_EULER_DIR_PATH.iterdir(): + if problem_dir_path.is_file() or problem_dir_path.name.startswith("_"): + continue + for file_path in problem_dir_path.iterdir(): + if file_path.suffix != ".py" or file_path.name.startswith(("_", "test")): + continue + solution_file_paths.append(file_path) + return solution_file_paths + + +def get_files_url() -> str: + """Return the pull request number which triggered this action.""" + with open(os.environ["GITHUB_EVENT_PATH"]) as file: + event = json.load(file) + return event["pull_request"]["url"] + "/files" + + +def added_solution_file_path() -> list[pathlib.Path]: + """Collects only the solution file path which got added in the current + pull request. + + This will only be triggered if the script is ran from GitHub Actions. + """ + solution_file_paths = [] + headers = { + "Accept": "application/vnd.github.v3+json", + "Authorization": "token " + os.environ["GITHUB_TOKEN"], + } + files = requests.get(get_files_url(), headers=headers).json() + for file in files: + filepath = pathlib.Path.cwd().joinpath(file["filename"]) + if ( + filepath.suffix != ".py" + or filepath.name.startswith(("_", "test")) + or not filepath.name.startswith("sol") + ): + continue + solution_file_paths.append(filepath) + return solution_file_paths + + +def collect_solution_file_paths() -> list[pathlib.Path]: + if os.environ.get("CI") and os.environ.get("GITHUB_EVENT_NAME") == "pull_request": + # Return only if there are any, otherwise default to all solutions + if filepaths := added_solution_file_path(): + return filepaths + return all_solution_file_paths() + + +@pytest.mark.parametrize( + "solution_path", + collect_solution_file_paths(), + ids=lambda path: f"{path.parent.name}/{path.name}", +) +def test_project_euler(solution_path: pathlib.Path) -> None: + """Testing for all Project Euler solutions""" + # problem_[extract this part] and pad it with zeroes for width 3 + problem_number: str = solution_path.parent.name[8:].zfill(3) + expected: str = PROBLEM_ANSWERS[problem_number] + solution_module = convert_path_to_module(solution_path) + answer = str(solution_module.solution()) # type: ignore + answer = hashlib.sha256(answer.encode()).hexdigest() + assert ( + answer == expected + ), f"Expected solution to {problem_number} to have hash {expected}, got {answer}" diff --git a/python-mega-algo/searches/__init__.py b/python-mega-algo/searches/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/searches/binary_search.py b/python-mega-algo/searches/binary_search.py new file mode 100644 index 00000000..35e0dd05 --- /dev/null +++ b/python-mega-algo/searches/binary_search.py @@ -0,0 +1,308 @@ +#!/usr/bin/env python3 + +""" +This is pure Python implementation of binary search algorithms + +For doctests run following command: +python3 -m doctest -v binary_search.py + +For manual testing run: +python3 binary_search.py +""" +import bisect +from typing import List, Optional + + +def bisect_left( + sorted_collection: List[int], item: int, lo: int = 0, hi: int = -1 +) -> int: + """ + Locates the first element in a sorted array that is larger or equal to a given + value. + + It has the same interface as + https://docs.python.org/3/library/bisect.html#bisect.bisect_left . + + :param sorted_collection: some ascending sorted collection with comparable items + :param item: item to bisect + :param lo: lowest index to consider (as in sorted_collection[lo:hi]) + :param hi: past the highest index to consider (as in sorted_collection[lo:hi]) + :return: index i such that all values in sorted_collection[lo:i] are < item and all + values in sorted_collection[i:hi] are >= item. + + Examples: + >>> bisect_left([0, 5, 7, 10, 15], 0) + 0 + + >>> bisect_left([0, 5, 7, 10, 15], 6) + 2 + + >>> bisect_left([0, 5, 7, 10, 15], 20) + 5 + + >>> bisect_left([0, 5, 7, 10, 15], 15, 1, 3) + 3 + + >>> bisect_left([0, 5, 7, 10, 15], 6, 2) + 2 + """ + if hi < 0: + hi = len(sorted_collection) + + while lo < hi: + mid = (lo + hi) // 2 + if sorted_collection[mid] < item: + lo = mid + 1 + else: + hi = mid + + return lo + + +def bisect_right( + sorted_collection: List[int], item: int, lo: int = 0, hi: int = -1 +) -> int: + """ + Locates the first element in a sorted array that is larger than a given value. + + It has the same interface as + https://docs.python.org/3/library/bisect.html#bisect.bisect_right . + + :param sorted_collection: some ascending sorted collection with comparable items + :param item: item to bisect + :param lo: lowest index to consider (as in sorted_collection[lo:hi]) + :param hi: past the highest index to consider (as in sorted_collection[lo:hi]) + :return: index i such that all values in sorted_collection[lo:i] are <= item and + all values in sorted_collection[i:hi] are > item. + + Examples: + >>> bisect_right([0, 5, 7, 10, 15], 0) + 1 + + >>> bisect_right([0, 5, 7, 10, 15], 15) + 5 + + >>> bisect_right([0, 5, 7, 10, 15], 6) + 2 + + >>> bisect_right([0, 5, 7, 10, 15], 15, 1, 3) + 3 + + >>> bisect_right([0, 5, 7, 10, 15], 6, 2) + 2 + """ + if hi < 0: + hi = len(sorted_collection) + + while lo < hi: + mid = (lo + hi) // 2 + if sorted_collection[mid] <= item: + lo = mid + 1 + else: + hi = mid + + return lo + + +def insort_left( + sorted_collection: List[int], item: int, lo: int = 0, hi: int = -1 +) -> None: + """ + Inserts a given value into a sorted array before other values with the same value. + + It has the same interface as + https://docs.python.org/3/library/bisect.html#bisect.insort_left . + + :param sorted_collection: some ascending sorted collection with comparable items + :param item: item to insert + :param lo: lowest index to consider (as in sorted_collection[lo:hi]) + :param hi: past the highest index to consider (as in sorted_collection[lo:hi]) + + Examples: + >>> sorted_collection = [0, 5, 7, 10, 15] + >>> insort_left(sorted_collection, 6) + >>> sorted_collection + [0, 5, 6, 7, 10, 15] + + >>> sorted_collection = [(0, 0), (5, 5), (7, 7), (10, 10), (15, 15)] + >>> item = (5, 5) + >>> insort_left(sorted_collection, item) + >>> sorted_collection + [(0, 0), (5, 5), (5, 5), (7, 7), (10, 10), (15, 15)] + >>> item is sorted_collection[1] + True + >>> item is sorted_collection[2] + False + + >>> sorted_collection = [0, 5, 7, 10, 15] + >>> insort_left(sorted_collection, 20) + >>> sorted_collection + [0, 5, 7, 10, 15, 20] + + >>> sorted_collection = [0, 5, 7, 10, 15] + >>> insort_left(sorted_collection, 15, 1, 3) + >>> sorted_collection + [0, 5, 7, 15, 10, 15] + """ + sorted_collection.insert(bisect_left(sorted_collection, item, lo, hi), item) + + +def insort_right( + sorted_collection: List[int], item: int, lo: int = 0, hi: int = -1 +) -> None: + """ + Inserts a given value into a sorted array after other values with the same value. + + It has the same interface as + https://docs.python.org/3/library/bisect.html#bisect.insort_right . + + :param sorted_collection: some ascending sorted collection with comparable items + :param item: item to insert + :param lo: lowest index to consider (as in sorted_collection[lo:hi]) + :param hi: past the highest index to consider (as in sorted_collection[lo:hi]) + + Examples: + >>> sorted_collection = [0, 5, 7, 10, 15] + >>> insort_right(sorted_collection, 6) + >>> sorted_collection + [0, 5, 6, 7, 10, 15] + + >>> sorted_collection = [(0, 0), (5, 5), (7, 7), (10, 10), (15, 15)] + >>> item = (5, 5) + >>> insort_right(sorted_collection, item) + >>> sorted_collection + [(0, 0), (5, 5), (5, 5), (7, 7), (10, 10), (15, 15)] + >>> item is sorted_collection[1] + False + >>> item is sorted_collection[2] + True + + >>> sorted_collection = [0, 5, 7, 10, 15] + >>> insort_right(sorted_collection, 20) + >>> sorted_collection + [0, 5, 7, 10, 15, 20] + + >>> sorted_collection = [0, 5, 7, 10, 15] + >>> insort_right(sorted_collection, 15, 1, 3) + >>> sorted_collection + [0, 5, 7, 15, 10, 15] + """ + sorted_collection.insert(bisect_right(sorted_collection, item, lo, hi), item) + + +def binary_search(sorted_collection: List[int], item: int) -> Optional[int]: + """Pure implementation of binary search algorithm in Python + + Be careful collection must be ascending sorted, otherwise result will be + unpredictable + + :param sorted_collection: some ascending sorted collection with comparable items + :param item: item value to search + :return: index of found item or None if item is not found + + Examples: + >>> binary_search([0, 5, 7, 10, 15], 0) + 0 + + >>> binary_search([0, 5, 7, 10, 15], 15) + 4 + + >>> binary_search([0, 5, 7, 10, 15], 5) + 1 + + >>> binary_search([0, 5, 7, 10, 15], 6) + + """ + left = 0 + right = len(sorted_collection) - 1 + + while left <= right: + midpoint = left + (right - left) // 2 + current_item = sorted_collection[midpoint] + if current_item == item: + return midpoint + elif item < current_item: + right = midpoint - 1 + else: + left = midpoint + 1 + return None + + +def binary_search_std_lib(sorted_collection: List[int], item: int) -> Optional[int]: + """Pure implementation of binary search algorithm in Python using stdlib + + Be careful collection must be ascending sorted, otherwise result will be + unpredictable + + :param sorted_collection: some ascending sorted collection with comparable items + :param item: item value to search + :return: index of found item or None if item is not found + + Examples: + >>> binary_search_std_lib([0, 5, 7, 10, 15], 0) + 0 + + >>> binary_search_std_lib([0, 5, 7, 10, 15], 15) + 4 + + >>> binary_search_std_lib([0, 5, 7, 10, 15], 5) + 1 + + >>> binary_search_std_lib([0, 5, 7, 10, 15], 6) + + """ + index = bisect.bisect_left(sorted_collection, item) + if index != len(sorted_collection) and sorted_collection[index] == item: + return index + return None + + +def binary_search_by_recursion( + sorted_collection: List[int], item: int, left: int, right: int +) -> Optional[int]: + + """Pure implementation of binary search algorithm in Python by recursion + + Be careful collection must be ascending sorted, otherwise result will be + unpredictable + First recursion should be started with left=0 and right=(len(sorted_collection)-1) + + :param sorted_collection: some ascending sorted collection with comparable items + :param item: item value to search + :return: index of found item or None if item is not found + + Examples: + >>> binary_search_by_recursion([0, 5, 7, 10, 15], 0, 0, 4) + 0 + + >>> binary_search_by_recursion([0, 5, 7, 10, 15], 15, 0, 4) + 4 + + >>> binary_search_by_recursion([0, 5, 7, 10, 15], 5, 0, 4) + 1 + + >>> binary_search_by_recursion([0, 5, 7, 10, 15], 6, 0, 4) + + """ + if right < left: + return None + + midpoint = left + (right - left) // 2 + + if sorted_collection[midpoint] == item: + return midpoint + elif sorted_collection[midpoint] > item: + return binary_search_by_recursion(sorted_collection, item, left, midpoint - 1) + else: + return binary_search_by_recursion(sorted_collection, item, midpoint + 1, right) + + +if __name__ == "__main__": + user_input = input("Enter numbers separated by comma:\n").strip() + collection = sorted(int(item) for item in user_input.split(",")) + target = int(input("Enter a single number to be found in the list:\n")) + result = binary_search(collection, target) + if result is None: + print(f"{target} was not found in {collection}.") + else: + print(f"{target} was found at position {result} in {collection}.") diff --git a/python-mega-algo/searches/binary_tree_traversal.py b/python-mega-algo/searches/binary_tree_traversal.py new file mode 100644 index 00000000..f919a296 --- /dev/null +++ b/python-mega-algo/searches/binary_tree_traversal.py @@ -0,0 +1,307 @@ +# flake8: noqa + +""" +This is pure Python implementation of tree traversal algorithms +""" +from __future__ import annotations + +import queue + + +class TreeNode: + def __init__(self, data): + self.data = data + self.right = None + self.left = None + + +def build_tree(): + print("\n********Press N to stop entering at any point of time********\n") + check = input("Enter the value of the root node: ").strip().lower() or "n" + if check == "n": + return None + q: queue.Queue = queue.Queue() + tree_node = TreeNode(int(check)) + q.put(tree_node) + while not q.empty(): + node_found = q.get() + msg = "Enter the left node of %s: " % node_found.data + check = input(msg).strip().lower() or "n" + if check == "n": + return tree_node + left_node = TreeNode(int(check)) + node_found.left = left_node + q.put(left_node) + msg = "Enter the right node of %s: " % node_found.data + check = input(msg).strip().lower() or "n" + if check == "n": + return tree_node + right_node = TreeNode(int(check)) + node_found.right = right_node + q.put(right_node) + + +def pre_order(node: TreeNode) -> None: + """ + >>> root = TreeNode(1) + >>> tree_node2 = TreeNode(2) + >>> tree_node3 = TreeNode(3) + >>> tree_node4 = TreeNode(4) + >>> tree_node5 = TreeNode(5) + >>> tree_node6 = TreeNode(6) + >>> tree_node7 = TreeNode(7) + >>> root.left, root.right = tree_node2, tree_node3 + >>> tree_node2.left, tree_node2.right = tree_node4 , tree_node5 + >>> tree_node3.left, tree_node3.right = tree_node6 , tree_node7 + >>> pre_order(root) + 1,2,4,5,3,6,7, + """ + if not isinstance(node, TreeNode) or not node: + return + print(node.data, end=",") + pre_order(node.left) + pre_order(node.right) + + +def in_order(node: TreeNode) -> None: + """ + >>> root = TreeNode(1) + >>> tree_node2 = TreeNode(2) + >>> tree_node3 = TreeNode(3) + >>> tree_node4 = TreeNode(4) + >>> tree_node5 = TreeNode(5) + >>> tree_node6 = TreeNode(6) + >>> tree_node7 = TreeNode(7) + >>> root.left, root.right = tree_node2, tree_node3 + >>> tree_node2.left, tree_node2.right = tree_node4 , tree_node5 + >>> tree_node3.left, tree_node3.right = tree_node6 , tree_node7 + >>> in_order(root) + 4,2,5,1,6,3,7, + """ + if not isinstance(node, TreeNode) or not node: + return + in_order(node.left) + print(node.data, end=",") + in_order(node.right) + + +def post_order(node: TreeNode) -> None: + """ + >>> root = TreeNode(1) + >>> tree_node2 = TreeNode(2) + >>> tree_node3 = TreeNode(3) + >>> tree_node4 = TreeNode(4) + >>> tree_node5 = TreeNode(5) + >>> tree_node6 = TreeNode(6) + >>> tree_node7 = TreeNode(7) + >>> root.left, root.right = tree_node2, tree_node3 + >>> tree_node2.left, tree_node2.right = tree_node4 , tree_node5 + >>> tree_node3.left, tree_node3.right = tree_node6 , tree_node7 + >>> post_order(root) + 4,5,2,6,7,3,1, + """ + if not isinstance(node, TreeNode) or not node: + return + post_order(node.left) + post_order(node.right) + print(node.data, end=",") + + +def level_order(node: TreeNode) -> None: + """ + >>> root = TreeNode(1) + >>> tree_node2 = TreeNode(2) + >>> tree_node3 = TreeNode(3) + >>> tree_node4 = TreeNode(4) + >>> tree_node5 = TreeNode(5) + >>> tree_node6 = TreeNode(6) + >>> tree_node7 = TreeNode(7) + >>> root.left, root.right = tree_node2, tree_node3 + >>> tree_node2.left, tree_node2.right = tree_node4 , tree_node5 + >>> tree_node3.left, tree_node3.right = tree_node6 , tree_node7 + >>> level_order(root) + 1,2,3,4,5,6,7, + """ + if not isinstance(node, TreeNode) or not node: + return + q: queue.Queue = queue.Queue() + q.put(node) + while not q.empty(): + node_dequeued = q.get() + print(node_dequeued.data, end=",") + if node_dequeued.left: + q.put(node_dequeued.left) + if node_dequeued.right: + q.put(node_dequeued.right) + + +def level_order_actual(node: TreeNode) -> None: + """ + >>> root = TreeNode(1) + >>> tree_node2 = TreeNode(2) + >>> tree_node3 = TreeNode(3) + >>> tree_node4 = TreeNode(4) + >>> tree_node5 = TreeNode(5) + >>> tree_node6 = TreeNode(6) + >>> tree_node7 = TreeNode(7) + >>> root.left, root.right = tree_node2, tree_node3 + >>> tree_node2.left, tree_node2.right = tree_node4 , tree_node5 + >>> tree_node3.left, tree_node3.right = tree_node6 , tree_node7 + >>> level_order_actual(root) + 1, + 2,3, + 4,5,6,7, + """ + if not isinstance(node, TreeNode) or not node: + return + q: queue.Queue = queue.Queue() + q.put(node) + while not q.empty(): + list = [] + while not q.empty(): + node_dequeued = q.get() + print(node_dequeued.data, end=",") + if node_dequeued.left: + list.append(node_dequeued.left) + if node_dequeued.right: + list.append(node_dequeued.right) + print() + for node in list: + q.put(node) + + +# iteration version +def pre_order_iter(node: TreeNode) -> None: + """ + >>> root = TreeNode(1) + >>> tree_node2 = TreeNode(2) + >>> tree_node3 = TreeNode(3) + >>> tree_node4 = TreeNode(4) + >>> tree_node5 = TreeNode(5) + >>> tree_node6 = TreeNode(6) + >>> tree_node7 = TreeNode(7) + >>> root.left, root.right = tree_node2, tree_node3 + >>> tree_node2.left, tree_node2.right = tree_node4 , tree_node5 + >>> tree_node3.left, tree_node3.right = tree_node6 , tree_node7 + >>> pre_order_iter(root) + 1,2,4,5,3,6,7, + """ + if not isinstance(node, TreeNode) or not node: + return + stack: list[TreeNode] = [] + n = node + while n or stack: + while n: # start from root node, find its left child + print(n.data, end=",") + stack.append(n) + n = n.left + # end of while means current node doesn't have left child + n = stack.pop() + # start to traverse its right child + n = n.right + + +def in_order_iter(node: TreeNode) -> None: + """ + >>> root = TreeNode(1) + >>> tree_node2 = TreeNode(2) + >>> tree_node3 = TreeNode(3) + >>> tree_node4 = TreeNode(4) + >>> tree_node5 = TreeNode(5) + >>> tree_node6 = TreeNode(6) + >>> tree_node7 = TreeNode(7) + >>> root.left, root.right = tree_node2, tree_node3 + >>> tree_node2.left, tree_node2.right = tree_node4 , tree_node5 + >>> tree_node3.left, tree_node3.right = tree_node6 , tree_node7 + >>> in_order_iter(root) + 4,2,5,1,6,3,7, + """ + if not isinstance(node, TreeNode) or not node: + return + stack: list[TreeNode] = [] + n = node + while n or stack: + while n: + stack.append(n) + n = n.left + n = stack.pop() + print(n.data, end=",") + n = n.right + + +def post_order_iter(node: TreeNode) -> None: + """ + >>> root = TreeNode(1) + >>> tree_node2 = TreeNode(2) + >>> tree_node3 = TreeNode(3) + >>> tree_node4 = TreeNode(4) + >>> tree_node5 = TreeNode(5) + >>> tree_node6 = TreeNode(6) + >>> tree_node7 = TreeNode(7) + >>> root.left, root.right = tree_node2, tree_node3 + >>> tree_node2.left, tree_node2.right = tree_node4 , tree_node5 + >>> tree_node3.left, tree_node3.right = tree_node6 , tree_node7 + >>> post_order_iter(root) + 4,5,2,6,7,3,1, + """ + if not isinstance(node, TreeNode) or not node: + return + stack1, stack2 = [], [] + n = node + stack1.append(n) + while stack1: # to find the reversed order of post order, store it in stack2 + n = stack1.pop() + if n.left: + stack1.append(n.left) + if n.right: + stack1.append(n.right) + stack2.append(n) + while stack2: # pop up from stack2 will be the post order + print(stack2.pop().data, end=",") + + +def prompt(s: str = "", width=50, char="*") -> str: + if not s: + return "\n" + width * char + left, extra = divmod(width - len(s) - 2, 2) + return f"{left * char} {s} {(left + extra) * char}" + + +if __name__ == "__main__": + import doctest + + doctest.testmod() + print(prompt("Binary Tree Traversals")) + + node = build_tree() + print(prompt("Pre Order Traversal")) + pre_order(node) + print(prompt() + "\n") + + print(prompt("In Order Traversal")) + in_order(node) + print(prompt() + "\n") + + print(prompt("Post Order Traversal")) + post_order(node) + print(prompt() + "\n") + + print(prompt("Level Order Traversal")) + level_order(node) + print(prompt() + "\n") + + print(prompt("Actual Level Order Traversal")) + level_order_actual(node) + print("*" * 50 + "\n") + + print(prompt("Pre Order Traversal - Iteration Version")) + pre_order_iter(node) + print(prompt() + "\n") + + print(prompt("In Order Traversal - Iteration Version")) + in_order_iter(node) + print(prompt() + "\n") + + print(prompt("Post Order Traversal - Iteration Version")) + post_order_iter(node) + print(prompt()) diff --git a/python-mega-algo/searches/double_linear_search.py b/python-mega-algo/searches/double_linear_search.py new file mode 100644 index 00000000..c86993c0 --- /dev/null +++ b/python-mega-algo/searches/double_linear_search.py @@ -0,0 +1,37 @@ +from __future__ import annotations + + +def double_linear_search(array: list[int], search_item: int) -> int: + """ + Iterate through the array from both sides to find the index of search_item. + + :param array: the array to be searched + :param search_item: the item to be searched + :return the index of search_item, if search_item is in array, else -1 + + Examples: + >>> double_linear_search([1, 5, 5, 10], 1) + 0 + >>> double_linear_search([1, 5, 5, 10], 5) + 1 + >>> double_linear_search([1, 5, 5, 10], 100) + -1 + >>> double_linear_search([1, 5, 5, 10], 10) + 3 + """ + # define the start and end index of the given array + start_ind, end_ind = 0, len(array) - 1 + while start_ind <= end_ind: + if array[start_ind] == search_item: + return start_ind + elif array[end_ind] == search_item: + return end_ind + else: + start_ind += 1 + end_ind -= 1 + # returns -1 if search_item is not found in array + return -1 + + +if __name__ == "__main__": + print(double_linear_search(list(range(100)), 40)) diff --git a/python-mega-algo/searches/double_linear_search_recursion.py b/python-mega-algo/searches/double_linear_search_recursion.py new file mode 100644 index 00000000..1c483e97 --- /dev/null +++ b/python-mega-algo/searches/double_linear_search_recursion.py @@ -0,0 +1,35 @@ +def search(list_data: list, key: int, left: int = 0, right: int = 0) -> int: + """ + Iterate through the array to find the index of key using recursion. + :param list_data: the list to be searched + :param key: the key to be searched + :param left: the index of first element + :param right: the index of last element + :return: the index of key value if found, -1 otherwise. + + >>> search(list(range(0, 11)), 5) + 5 + >>> search([1, 2, 4, 5, 3], 4) + 2 + >>> search([1, 2, 4, 5, 3], 6) + -1 + >>> search([5], 5) + 0 + >>> search([], 1) + -1 + """ + right = right or len(list_data) - 1 + if left > right: + return -1 + elif list_data[left] == key: + return left + elif list_data[right] == key: + return right + else: + return search(list_data, key, left + 1, right - 1) + + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/searches/fibonacci_search.py b/python-mega-algo/searches/fibonacci_search.py new file mode 100644 index 00000000..ac8ecc99 --- /dev/null +++ b/python-mega-algo/searches/fibonacci_search.py @@ -0,0 +1,132 @@ +""" +This is pure Python implementation of fibonacci search. + +Resources used: +https://en.wikipedia.org/wiki/Fibonacci_search_technique + +For doctests run following command: +python3 -m doctest -v fibonacci_search.py + +For manual testing run: +python3 fibonacci_search.py +""" +from functools import lru_cache + + +@lru_cache() +def fibonacci(k: int) -> int: + """Finds fibonacci number in index k. + + Parameters + ---------- + k : + Index of fibonacci. + + Returns + ------- + int + Fibonacci number in position k. + + >>> fibonacci(0) + 0 + >>> fibonacci(2) + 1 + >>> fibonacci(5) + 5 + >>> fibonacci(15) + 610 + >>> fibonacci('a') + Traceback (most recent call last): + TypeError: k must be an integer. + >>> fibonacci(-5) + Traceback (most recent call last): + ValueError: k integer must be greater or equal to zero. + """ + if not isinstance(k, int): + raise TypeError("k must be an integer.") + if k < 0: + raise ValueError("k integer must be greater or equal to zero.") + if k == 0: + return 0 + elif k == 1: + return 1 + else: + return fibonacci(k - 1) + fibonacci(k - 2) + + +def fibonacci_search(arr: list, val: int) -> int: + """A pure Python implementation of a fibonacci search algorithm. + + Parameters + ---------- + arr + List of sorted elements. + val + Element to search in list. + + Returns + ------- + int + The index of the element in the array. + -1 if the element is not found. + + >>> fibonacci_search([4, 5, 6, 7], 4) + 0 + >>> fibonacci_search([4, 5, 6, 7], -10) + -1 + >>> fibonacci_search([-18, 2], -18) + 0 + >>> fibonacci_search([5], 5) + 0 + >>> fibonacci_search(['a', 'c', 'd'], 'c') + 1 + >>> fibonacci_search(['a', 'c', 'd'], 'f') + -1 + >>> fibonacci_search([], 1) + -1 + >>> fibonacci_search([.1, .4 , 7], .4) + 1 + >>> fibonacci_search([], 9) + -1 + >>> fibonacci_search(list(range(100)), 63) + 63 + >>> fibonacci_search(list(range(100)), 99) + 99 + >>> fibonacci_search(list(range(-100, 100, 3)), -97) + 1 + >>> fibonacci_search(list(range(-100, 100, 3)), 0) + -1 + >>> fibonacci_search(list(range(-100, 100, 5)), 0) + 20 + >>> fibonacci_search(list(range(-100, 100, 5)), 95) + 39 + """ + len_list = len(arr) + # Find m such that F_m >= n where F_i is the i_th fibonacci number. + i = 0 + while True: + if fibonacci(i) >= len_list: + fibb_k = i + break + i += 1 + offset = 0 + while fibb_k > 0: + index_k = min( + offset + fibonacci(fibb_k - 1), len_list - 1 + ) # Prevent out of range + item_k_1 = arr[index_k] + if item_k_1 == val: + return index_k + elif val < item_k_1: + fibb_k -= 1 + elif val > item_k_1: + offset += fibonacci(fibb_k - 1) + fibb_k -= 2 + else: + return -1 + + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/searches/hill_climbing.py b/python-mega-algo/searches/hill_climbing.py new file mode 100644 index 00000000..bb24e781 --- /dev/null +++ b/python-mega-algo/searches/hill_climbing.py @@ -0,0 +1,197 @@ +# https://en.wikipedia.org/wiki/Hill_climbing +import math + + +class SearchProblem: + """ + An interface to define search problems. + The interface will be illustrated using the example of mathematical function. + """ + + def __init__(self, x: int, y: int, step_size: int, function_to_optimize): + """ + The constructor of the search problem. + + x: the x coordinate of the current search state. + y: the y coordinate of the current search state. + step_size: size of the step to take when looking for neighbors. + function_to_optimize: a function to optimize having the signature f(x, y). + """ + self.x = x + self.y = y + self.step_size = step_size + self.function = function_to_optimize + + def score(self) -> int: + """ + Returns the output of the function called with current x and y coordinates. + >>> def test_function(x, y): + ... return x + y + >>> SearchProblem(0, 0, 1, test_function).score() # 0 + 0 = 0 + 0 + >>> SearchProblem(5, 7, 1, test_function).score() # 5 + 7 = 12 + 12 + """ + return self.function(self.x, self.y) + + def get_neighbors(self): + """ + Returns a list of coordinates of neighbors adjacent to the current coordinates. + + Neighbors: + | 0 | 1 | 2 | + | 3 | _ | 4 | + | 5 | 6 | 7 | + """ + step_size = self.step_size + return [ + SearchProblem(x, y, step_size, self.function) + for x, y in ( + (self.x - step_size, self.y - step_size), + (self.x - step_size, self.y), + (self.x - step_size, self.y + step_size), + (self.x, self.y - step_size), + (self.x, self.y + step_size), + (self.x + step_size, self.y - step_size), + (self.x + step_size, self.y), + (self.x + step_size, self.y + step_size), + ) + ] + + def __hash__(self): + """ + hash the string representation of the current search state. + """ + return hash(str(self)) + + def __eq__(self, obj): + """ + Check if the 2 objects are equal. + """ + if isinstance(obj, SearchProblem): + return hash(str(self)) == hash(str(obj)) + return False + + def __str__(self): + """ + string representation of the current search state. + >>> str(SearchProblem(0, 0, 1, None)) + 'x: 0 y: 0' + >>> str(SearchProblem(2, 5, 1, None)) + 'x: 2 y: 5' + """ + return f"x: {self.x} y: {self.y}" + + +def hill_climbing( + search_prob, + find_max: bool = True, + max_x: float = math.inf, + min_x: float = -math.inf, + max_y: float = math.inf, + min_y: float = -math.inf, + visualization: bool = False, + max_iter: int = 10000, +) -> SearchProblem: + """ + Implementation of the hill climbling algorithm. + We start with a given state, find all its neighbors, + move towards the neighbor which provides the maximum (or minimum) change. + We keep doing this until we are at a state where we do not have any + neighbors which can improve the solution. + Args: + search_prob: The search state at the start. + find_max: If True, the algorithm should find the maximum else the minimum. + max_x, min_x, max_y, min_y: the maximum and minimum bounds of x and y. + visualization: If True, a matplotlib graph is displayed. + max_iter: number of times to run the iteration. + Returns a search state having the maximum (or minimum) score. + """ + current_state = search_prob + scores = [] # list to store the current score at each iteration + iterations = 0 + solution_found = False + visited = set() + while not solution_found and iterations < max_iter: + visited.add(current_state) + iterations += 1 + current_score = current_state.score() + scores.append(current_score) + neighbors = current_state.get_neighbors() + max_change = -math.inf + min_change = math.inf + next_state = None # to hold the next best neighbor + for neighbor in neighbors: + if neighbor in visited: + continue # do not want to visit the same state again + if ( + neighbor.x > max_x + or neighbor.x < min_x + or neighbor.y > max_y + or neighbor.y < min_y + ): + continue # neighbor outside our bounds + change = neighbor.score() - current_score + if find_max: # finding max + # going to direction with greatest ascent + if change > max_change and change > 0: + max_change = change + next_state = neighbor + else: # finding min + # to direction with greatest descent + if change < min_change and change < 0: + min_change = change + next_state = neighbor + if next_state is not None: + # we found at least one neighbor which improved the current state + current_state = next_state + else: + # since we have no neighbor that improves the solution we stop the search + solution_found = True + + if visualization: + from matplotlib import pyplot as plt + + plt.plot(range(iterations), scores) + plt.xlabel("Iterations") + plt.ylabel("Function values") + plt.show() + + return current_state + + +if __name__ == "__main__": + import doctest + + doctest.testmod() + + def test_f1(x, y): + return (x ** 2) + (y ** 2) + + # starting the problem with initial coordinates (3, 4) + prob = SearchProblem(x=3, y=4, step_size=1, function_to_optimize=test_f1) + local_min = hill_climbing(prob, find_max=False) + print( + "The minimum score for f(x, y) = x^2 + y^2 found via hill climbing: " + f"{local_min.score()}" + ) + + # starting the problem with initial coordinates (12, 47) + prob = SearchProblem(x=12, y=47, step_size=1, function_to_optimize=test_f1) + local_min = hill_climbing( + prob, find_max=False, max_x=100, min_x=5, max_y=50, min_y=-5, visualization=True + ) + print( + "The minimum score for f(x, y) = x^2 + y^2 with the domain 100 > x > 5 " + f"and 50 > y > - 5 found via hill climbing: {local_min.score()}" + ) + + def test_f2(x, y): + return (3 * x ** 2) - (6 * y) + + prob = SearchProblem(x=3, y=4, step_size=1, function_to_optimize=test_f1) + local_min = hill_climbing(prob, find_max=True) + print( + "The maximum score for f(x, y) = x^2 + y^2 found via hill climbing: " + f"{local_min.score()}" + ) diff --git a/python-mega-algo/searches/interpolation_search.py b/python-mega-algo/searches/interpolation_search.py new file mode 100644 index 00000000..f4fa8e12 --- /dev/null +++ b/python-mega-algo/searches/interpolation_search.py @@ -0,0 +1,140 @@ +""" +This is pure Python implementation of interpolation search algorithm +""" + + +def interpolation_search(sorted_collection, item): + """Pure implementation of interpolation search algorithm in Python + Be careful collection must be ascending sorted, otherwise result will be + unpredictable + :param sorted_collection: some ascending sorted collection with comparable items + :param item: item value to search + :return: index of found item or None if item is not found + """ + left = 0 + right = len(sorted_collection) - 1 + + while left <= right: + # avoid divided by 0 during interpolation + if sorted_collection[left] == sorted_collection[right]: + if sorted_collection[left] == item: + return left + else: + return None + + point = left + ((item - sorted_collection[left]) * (right - left)) // ( + sorted_collection[right] - sorted_collection[left] + ) + + # out of range check + if point < 0 or point >= len(sorted_collection): + return None + + current_item = sorted_collection[point] + if current_item == item: + return point + else: + if point < left: + right = left + left = point + elif point > right: + left = right + right = point + else: + if item < current_item: + right = point - 1 + else: + left = point + 1 + return None + + +def interpolation_search_by_recursion(sorted_collection, item, left, right): + + """Pure implementation of interpolation search algorithm in Python by recursion + Be careful collection must be ascending sorted, otherwise result will be + unpredictable + First recursion should be started with left=0 and right=(len(sorted_collection)-1) + :param sorted_collection: some ascending sorted collection with comparable items + :param item: item value to search + :return: index of found item or None if item is not found + """ + + # avoid divided by 0 during interpolation + if sorted_collection[left] == sorted_collection[right]: + if sorted_collection[left] == item: + return left + else: + return None + + point = left + ((item - sorted_collection[left]) * (right - left)) // ( + sorted_collection[right] - sorted_collection[left] + ) + + # out of range check + if point < 0 or point >= len(sorted_collection): + return None + + if sorted_collection[point] == item: + return point + elif point < left: + return interpolation_search_by_recursion(sorted_collection, item, point, left) + elif point > right: + return interpolation_search_by_recursion(sorted_collection, item, right, left) + else: + if sorted_collection[point] > item: + return interpolation_search_by_recursion( + sorted_collection, item, left, point - 1 + ) + else: + return interpolation_search_by_recursion( + sorted_collection, item, point + 1, right + ) + + +def __assert_sorted(collection): + """Check if collection is ascending sorted, if not - raises :py:class:`ValueError` + :param collection: collection + :return: True if collection is ascending sorted + :raise: :py:class:`ValueError` if collection is not ascending sorted + Examples: + >>> __assert_sorted([0, 1, 2, 4]) + True + >>> __assert_sorted([10, -1, 5]) + Traceback (most recent call last): + ... + ValueError: Collection must be ascending sorted + """ + if collection != sorted(collection): + raise ValueError("Collection must be ascending sorted") + return True + + +if __name__ == "__main__": + import sys + + """ + user_input = input('Enter numbers separated by comma:\n').strip() + collection = [int(item) for item in user_input.split(',')] + try: + __assert_sorted(collection) + except ValueError: + sys.exit('Sequence must be ascending sorted to apply interpolation search') + + target_input = input('Enter a single number to be found in the list:\n') + target = int(target_input) + """ + + debug = 0 + if debug == 1: + collection = [10, 30, 40, 45, 50, 66, 77, 93] + try: + __assert_sorted(collection) + except ValueError: + sys.exit("Sequence must be ascending sorted to apply interpolation search") + target = 67 + + result = interpolation_search(collection, target) + if result is not None: + print(f"{target} found at positions: {result}") + else: + print("Not found") diff --git a/python-mega-algo/searches/jump_search.py b/python-mega-algo/searches/jump_search.py new file mode 100644 index 00000000..31a9656c --- /dev/null +++ b/python-mega-algo/searches/jump_search.py @@ -0,0 +1,52 @@ +""" +Pure Python implementation of the jump search algorithm. +This algorithm iterates through a sorted collection with a step of n^(1/2), +until the element compared is bigger than the one searched. +It will then perform a linear search until it matches the wanted number. +If not found, it returns -1. +""" + +import math + + +def jump_search(arr: list, x: int) -> int: + """ + Pure Python implementation of the jump search algorithm. + Examples: + >>> jump_search([0, 1, 2, 3, 4, 5], 3) + 3 + >>> jump_search([-5, -2, -1], -1) + 2 + >>> jump_search([0, 5, 10, 20], 8) + -1 + >>> jump_search([0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610], 55) + 10 + """ + + n = len(arr) + step = int(math.floor(math.sqrt(n))) + prev = 0 + while arr[min(step, n) - 1] < x: + prev = step + step += int(math.floor(math.sqrt(n))) + if prev >= n: + return -1 + + while arr[prev] < x: + prev = prev + 1 + if prev == min(step, n): + return -1 + if arr[prev] == x: + return prev + return -1 + + +if __name__ == "__main__": + user_input = input("Enter numbers separated by a comma:\n").strip() + arr = [int(item) for item in user_input.split(",")] + x = int(input("Enter the number to be searched:\n")) + res = jump_search(arr, x) + if res == -1: + print("Number not found!") + else: + print(f"Number {x} is at index {res}") diff --git a/python-mega-algo/searches/linear_search.py b/python-mega-algo/searches/linear_search.py new file mode 100644 index 00000000..777080d1 --- /dev/null +++ b/python-mega-algo/searches/linear_search.py @@ -0,0 +1,77 @@ +""" +This is pure Python implementation of linear search algorithm + +For doctests run following command: +python3 -m doctest -v linear_search.py + +For manual testing run: +python3 linear_search.py +""" + + +def linear_search(sequence: list, target: int) -> int: + """A pure Python implementation of a linear search algorithm + + :param sequence: a collection with comparable items (as sorted items not required + in Linear Search) + :param target: item value to search + :return: index of found item or None if item is not found + + Examples: + >>> linear_search([0, 5, 7, 10, 15], 0) + 0 + >>> linear_search([0, 5, 7, 10, 15], 15) + 4 + >>> linear_search([0, 5, 7, 10, 15], 5) + 1 + >>> linear_search([0, 5, 7, 10, 15], 6) + -1 + """ + for index, item in enumerate(sequence): + if item == target: + return index + return -1 + + +def rec_linear_search(sequence: list, low: int, high: int, target: int) -> int: + """ + A pure Python implementation of a recursive linear search algorithm + + :param sequence: a collection with comparable items (as sorted items not required + in Linear Search) + :param low: Lower bound of the array + :param high: Higher bound of the array + :param target: The element to be found + :return: Index of the key or -1 if key not found + + Examples: + >>> rec_linear_search([0, 30, 500, 100, 700], 0, 4, 0) + 0 + >>> rec_linear_search([0, 30, 500, 100, 700], 0, 4, 700) + 4 + >>> rec_linear_search([0, 30, 500, 100, 700], 0, 4, 30) + 1 + >>> rec_linear_search([0, 30, 500, 100, 700], 0, 4, -6) + -1 + """ + if not (0 <= high < len(sequence) and 0 <= low < len(sequence)): + raise Exception("Invalid upper or lower bound!") + if high < low: + return -1 + if sequence[low] == target: + return low + if sequence[high] == target: + return high + return rec_linear_search(sequence, low + 1, high - 1, target) + + +if __name__ == "__main__": + user_input = input("Enter numbers separated by comma:\n").strip() + sequence = [int(item.strip()) for item in user_input.split(",")] + + target = int(input("Enter a single number to be found in the list:\n").strip()) + result = linear_search(sequence, target) + if result != -1: + print(f"linear_search({sequence}, {target}) = {result}") + else: + print(f"{target} was not found in {sequence}") diff --git a/python-mega-algo/searches/quick_select.py b/python-mega-algo/searches/quick_select.py new file mode 100644 index 00000000..5ede8c4d --- /dev/null +++ b/python-mega-algo/searches/quick_select.py @@ -0,0 +1,61 @@ +""" +A Python implementation of the quick select algorithm, which is efficient for +calculating the value that would appear in the index of a list if it would be +sorted, even if it is not already sorted +https://en.wikipedia.org/wiki/Quickselect +""" +import random + + +def _partition(data: list, pivot) -> tuple: + """ + Three way partition the data into smaller, equal and greater lists, + in relationship to the pivot + :param data: The data to be sorted (a list) + :param pivot: The value to partition the data on + :return: Three list: smaller, equal and greater + """ + less, equal, greater = [], [], [] + for element in data: + if element < pivot: + less.append(element) + elif element > pivot: + greater.append(element) + else: + equal.append(element) + return less, equal, greater + + +def quick_select(items: list, index: int): + """ + >>> quick_select([2, 4, 5, 7, 899, 54, 32], 5) + 54 + >>> quick_select([2, 4, 5, 7, 899, 54, 32], 1) + 4 + >>> quick_select([5, 4, 3, 2], 2) + 4 + >>> quick_select([3, 5, 7, 10, 2, 12], 3) + 7 + """ + # index = len(items) // 2 when trying to find the median + # (value of index when items is sorted) + + # invalid input + if index >= len(items) or index < 0: + return None + + pivot = items[random.randint(0, len(items) - 1)] + count = 0 + smaller, equal, larger = _partition(items, pivot) + count = len(equal) + m = len(smaller) + + # index is the pivot + if m <= index < m + count: + return pivot + # must be in smaller + elif m > index: + return quick_select(smaller, index) + # must be in larger + else: + return quick_select(larger, index - (m + count)) diff --git a/python-mega-algo/searches/right.html b/python-mega-algo/searches/right.html new file mode 100644 index 00000000..ed345018 --- /dev/null +++ b/python-mega-algo/searches/right.html @@ -0,0 +1,33 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/searches + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + + + + + +
    FileFileFileFile
    binary_search.py hill_climbing.py quick_select.py tabu_search.py 
    binary_tr...sal.py interpola...rch.py sentinel_...rch.py ternary_search.py 
    double_li...rch.py jump_search.py simple_bi...rch.py __init__.py 
    double_li...ion.py linear_search.py simulated...ing.py tabu_test_data.txt 
    fibonacci...rch.py 
    + +

    +Folders: 1
    +Files: 17
    +Size of all files: 64456 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/searches/sentinel_linear_search.py b/python-mega-algo/searches/sentinel_linear_search.py new file mode 100644 index 00000000..69c1cf9f --- /dev/null +++ b/python-mega-algo/searches/sentinel_linear_search.py @@ -0,0 +1,58 @@ +""" +This is pure Python implementation of sentinel linear search algorithm + +For doctests run following command: +python -m doctest -v sentinel_linear_search.py +or +python3 -m doctest -v sentinel_linear_search.py + +For manual testing run: +python sentinel_linear_search.py +""" + + +def sentinel_linear_search(sequence, target): + """Pure implementation of sentinel linear search algorithm in Python + + :param sequence: some sequence with comparable items + :param target: item value to search + :return: index of found item or None if item is not found + + Examples: + >>> sentinel_linear_search([0, 5, 7, 10, 15], 0) + 0 + + >>> sentinel_linear_search([0, 5, 7, 10, 15], 15) + 4 + + >>> sentinel_linear_search([0, 5, 7, 10, 15], 5) + 1 + + >>> sentinel_linear_search([0, 5, 7, 10, 15], 6) + + """ + sequence.append(target) + + index = 0 + while sequence[index] != target: + index += 1 + + sequence.pop() + + if index == len(sequence): + return None + + return index + + +if __name__ == "__main__": + user_input = input("Enter numbers separated by comma:\n").strip() + sequence = [int(item) for item in user_input.split(",")] + + target_input = input("Enter a single number to be found in the list:\n") + target = int(target_input) + result = sentinel_linear_search(sequence, target) + if result is not None: + print(f"{target} found at positions: {result}") + else: + print("Not found") diff --git a/python-mega-algo/searches/simple_binary_search.py b/python-mega-algo/searches/simple_binary_search.py new file mode 100644 index 00000000..d1f7f7a5 --- /dev/null +++ b/python-mega-algo/searches/simple_binary_search.py @@ -0,0 +1,59 @@ +""" +Pure Python implementation of a binary search algorithm. + +For doctests run following command: +python3 -m doctest -v simple_binary_search.py + +For manual testing run: +python3 simple_binary_search.py +""" +from __future__ import annotations + + +def binary_search(a_list: list[int], item: int) -> bool: + """ + >>> test_list = [0, 1, 2, 8, 13, 17, 19, 32, 42] + >>> print(binary_search(test_list, 3)) + False + >>> print(binary_search(test_list, 13)) + True + >>> print(binary_search([4, 4, 5, 6, 7], 4)) + True + >>> print(binary_search([4, 4, 5, 6, 7], -10)) + False + >>> print(binary_search([-18, 2], -18)) + True + >>> print(binary_search([5], 5)) + True + >>> print(binary_search(['a', 'c', 'd'], 'c')) + True + >>> print(binary_search(['a', 'c', 'd'], 'f')) + False + >>> print(binary_search([], 1)) + False + >>> print(binary_search([-.1, .1 , .8], .1)) + True + >>> binary_search(range(-5000, 5000, 10), 80) + True + >>> binary_search(range(-5000, 5000, 10), 1255) + False + >>> binary_search(range(0, 10000, 5), 2) + False + """ + if len(a_list) == 0: + return False + midpoint = len(a_list) // 2 + if a_list[midpoint] == item: + return True + if item < a_list[midpoint]: + return binary_search(a_list[:midpoint], item) + else: + return binary_search(a_list[midpoint + 1 :], item) + + +if __name__ == "__main__": + user_input = input("Enter numbers separated by comma:\n").strip() + sequence = [int(item.strip()) for item in user_input.split(",")] + target = int(input("Enter the number to be found in the list:\n").strip()) + not_str = "" if binary_search(sequence, target) else "not " + print(f"{target} was {not_str}found in {sequence}") diff --git a/python-mega-algo/searches/simulated_annealing.py b/python-mega-algo/searches/simulated_annealing.py new file mode 100644 index 00000000..2aa980be --- /dev/null +++ b/python-mega-algo/searches/simulated_annealing.py @@ -0,0 +1,136 @@ +# https://en.wikipedia.org/wiki/Simulated_annealing +import math +import random + +from .hill_climbing import SearchProblem + + +def simulated_annealing( + search_prob, + find_max: bool = True, + max_x: float = math.inf, + min_x: float = -math.inf, + max_y: float = math.inf, + min_y: float = -math.inf, + visualization: bool = False, + start_temperate: float = 100, + rate_of_decrease: float = 0.01, + threshold_temp: float = 1, +) -> SearchProblem: + """ + Implementation of the simulated annealing algorithm. We start with a given state, + find all its neighbors. Pick a random neighbor, if that neighbor improves the + solution, we move in that direction, if that neighbor does not improve the solution, + we generate a random real number between 0 and 1, if the number is within a certain + range (calculated using temperature) we move in that direction, else we pick + another neighbor randomly and repeat the process. + + Args: + search_prob: The search state at the start. + find_max: If True, the algorithm should find the minimum else the minimum. + max_x, min_x, max_y, min_y: the maximum and minimum bounds of x and y. + visualization: If True, a matplotlib graph is displayed. + start_temperate: the initial temperate of the system when the program starts. + rate_of_decrease: the rate at which the temperate decreases in each iteration. + threshold_temp: the threshold temperature below which we end the search + Returns a search state having the maximum (or minimum) score. + """ + search_end = False + current_state = search_prob + current_temp = start_temperate + scores = [] + iterations = 0 + best_state = None + + while not search_end: + current_score = current_state.score() + if best_state is None or current_score > best_state.score(): + best_state = current_state + scores.append(current_score) + iterations += 1 + next_state = None + neighbors = current_state.get_neighbors() + while ( + next_state is None and neighbors + ): # till we do not find a neighbor that we can move to + index = random.randint(0, len(neighbors) - 1) # picking a random neighbor + picked_neighbor = neighbors.pop(index) + change = picked_neighbor.score() - current_score + + if ( + picked_neighbor.x > max_x + or picked_neighbor.x < min_x + or picked_neighbor.y > max_y + or picked_neighbor.y < min_y + ): + continue # neighbor outside our bounds + + if not find_max: + change = change * -1 # in case we are finding minimum + if change > 0: # improves the solution + next_state = picked_neighbor + else: + probability = (math.e) ** ( + change / current_temp + ) # probability generation function + if random.random() < probability: # random number within probability + next_state = picked_neighbor + current_temp = current_temp - (current_temp * rate_of_decrease) + + if current_temp < threshold_temp or next_state is None: + # temperature below threshold, or could not find a suitable neighbor + search_end = True + else: + current_state = next_state + + if visualization: + from matplotlib import pyplot as plt + + plt.plot(range(iterations), scores) + plt.xlabel("Iterations") + plt.ylabel("Function values") + plt.show() + return best_state + + +if __name__ == "__main__": + + def test_f1(x, y): + return (x ** 2) + (y ** 2) + + # starting the problem with initial coordinates (12, 47) + prob = SearchProblem(x=12, y=47, step_size=1, function_to_optimize=test_f1) + local_min = simulated_annealing( + prob, find_max=False, max_x=100, min_x=5, max_y=50, min_y=-5, visualization=True + ) + print( + "The minimum score for f(x, y) = x^2 + y^2 with the domain 100 > x > 5 " + f"and 50 > y > - 5 found via hill climbing: {local_min.score()}" + ) + + # starting the problem with initial coordinates (12, 47) + prob = SearchProblem(x=12, y=47, step_size=1, function_to_optimize=test_f1) + local_min = simulated_annealing( + prob, find_max=True, max_x=100, min_x=5, max_y=50, min_y=-5, visualization=True + ) + print( + "The maximum score for f(x, y) = x^2 + y^2 with the domain 100 > x > 5 " + f"and 50 > y > - 5 found via hill climbing: {local_min.score()}" + ) + + def test_f2(x, y): + return (3 * x ** 2) - (6 * y) + + prob = SearchProblem(x=3, y=4, step_size=1, function_to_optimize=test_f1) + local_min = simulated_annealing(prob, find_max=False, visualization=True) + print( + "The minimum score for f(x, y) = 3*x^2 - 6*y found via hill climbing: " + f"{local_min.score()}" + ) + + prob = SearchProblem(x=3, y=4, step_size=1, function_to_optimize=test_f1) + local_min = simulated_annealing(prob, find_max=True, visualization=True) + print( + "The maximum score for f(x, y) = 3*x^2 - 6*y found via hill climbing: " + f"{local_min.score()}" + ) diff --git a/python-mega-algo/searches/tabu_search.py b/python-mega-algo/searches/tabu_search.py new file mode 100644 index 00000000..24d0dbf6 --- /dev/null +++ b/python-mega-algo/searches/tabu_search.py @@ -0,0 +1,292 @@ +""" +This is pure Python implementation of Tabu search algorithm for a Travelling Salesman +Problem, that the distances between the cities are symmetric (the distance between city +'a' and city 'b' is the same between city 'b' and city 'a'). +The TSP can be represented into a graph. The cities are represented by nodes and the +distance between them is represented by the weight of the ark between the nodes. + +The .txt file with the graph has the form: + +node1 node2 distance_between_node1_and_node2 +node1 node3 distance_between_node1_and_node3 +... + +Be careful node1, node2 and the distance between them, must exist only once. This means +in the .txt file should not exist: +node1 node2 distance_between_node1_and_node2 +node2 node1 distance_between_node2_and_node1 + +For pytests run following command: +pytest + +For manual testing run: +python tabu_search.py -f your_file_name.txt -number_of_iterations_of_tabu_search \ + -s size_of_tabu_search +e.g. python tabu_search.py -f tabudata2.txt -i 4 -s 3 +""" +import argparse +import copy + + +def generate_neighbours(path): + """ + Pure implementation of generating a dictionary of neighbors and the cost with each + neighbor, given a path file that includes a graph. + + :param path: The path to the .txt file that includes the graph (e.g.tabudata2.txt) + :return dict_of_neighbours: Dictionary with key each node and value a list of lists + with the neighbors of the node and the cost (distance) for each neighbor. + + Example of dict_of_neighbours: + >>) dict_of_neighbours[a] + [[b,20],[c,18],[d,22],[e,26]] + + This indicates the neighbors of node (city) 'a', which has neighbor the node 'b' + with distance 20, the node 'c' with distance 18, the node 'd' with distance 22 and + the node 'e' with distance 26. + """ + + dict_of_neighbours = {} + + with open(path) as f: + for line in f: + if line.split()[0] not in dict_of_neighbours: + _list = list() + _list.append([line.split()[1], line.split()[2]]) + dict_of_neighbours[line.split()[0]] = _list + else: + dict_of_neighbours[line.split()[0]].append( + [line.split()[1], line.split()[2]] + ) + if line.split()[1] not in dict_of_neighbours: + _list = list() + _list.append([line.split()[0], line.split()[2]]) + dict_of_neighbours[line.split()[1]] = _list + else: + dict_of_neighbours[line.split()[1]].append( + [line.split()[0], line.split()[2]] + ) + + return dict_of_neighbours + + +def generate_first_solution(path, dict_of_neighbours): + """ + Pure implementation of generating the first solution for the Tabu search to start, + with the redundant resolution strategy. That means that we start from the starting + node (e.g. node 'a'), then we go to the city nearest (lowest distance) to this node + (let's assume is node 'c'), then we go to the nearest city of the node 'c', etc. + till we have visited all cities and return to the starting node. + + :param path: The path to the .txt file that includes the graph (e.g.tabudata2.txt) + :param dict_of_neighbours: Dictionary with key each node and value a list of lists + with the neighbors of the node and the cost (distance) for each neighbor. + :return first_solution: The solution for the first iteration of Tabu search using + the redundant resolution strategy in a list. + :return distance_of_first_solution: The total distance that Travelling Salesman + will travel, if he follows the path in first_solution. + """ + + with open(path) as f: + start_node = f.read(1) + end_node = start_node + + first_solution = [] + + visiting = start_node + + distance_of_first_solution = 0 + while visiting not in first_solution: + minim = 10000 + for k in dict_of_neighbours[visiting]: + if int(k[1]) < int(minim) and k[0] not in first_solution: + minim = k[1] + best_node = k[0] + + first_solution.append(visiting) + distance_of_first_solution = distance_of_first_solution + int(minim) + visiting = best_node + + first_solution.append(end_node) + + position = 0 + for k in dict_of_neighbours[first_solution[-2]]: + if k[0] == start_node: + break + position += 1 + + distance_of_first_solution = ( + distance_of_first_solution + + int(dict_of_neighbours[first_solution[-2]][position][1]) + - 10000 + ) + return first_solution, distance_of_first_solution + + +def find_neighborhood(solution, dict_of_neighbours): + """ + Pure implementation of generating the neighborhood (sorted by total distance of + each solution from lowest to highest) of a solution with 1-1 exchange method, that + means we exchange each node in a solution with each other node and generating a + number of solution named neighborhood. + + :param solution: The solution in which we want to find the neighborhood. + :param dict_of_neighbours: Dictionary with key each node and value a list of lists + with the neighbors of the node and the cost (distance) for each neighbor. + :return neighborhood_of_solution: A list that includes the solutions and the total + distance of each solution (in form of list) that are produced with 1-1 exchange + from the solution that the method took as an input + + Example: + >>> find_neighborhood(['a', 'c', 'b', 'd', 'e', 'a'], + ... {'a': [['b', '20'], ['c', '18'], ['d', '22'], ['e', '26']], + ... 'c': [['a', '18'], ['b', '10'], ['d', '23'], ['e', '24']], + ... 'b': [['a', '20'], ['c', '10'], ['d', '11'], ['e', '12']], + ... 'e': [['a', '26'], ['b', '12'], ['c', '24'], ['d', '40']], + ... 'd': [['a', '22'], ['b', '11'], ['c', '23'], ['e', '40']]} + ... ) # doctest: +NORMALIZE_WHITESPACE + [['a', 'e', 'b', 'd', 'c', 'a', 90], + ['a', 'c', 'd', 'b', 'e', 'a', 90], + ['a', 'd', 'b', 'c', 'e', 'a', 93], + ['a', 'c', 'b', 'e', 'd', 'a', 102], + ['a', 'c', 'e', 'd', 'b', 'a', 113], + ['a', 'b', 'c', 'd', 'e', 'a', 119]] + """ + + neighborhood_of_solution = [] + + for n in solution[1:-1]: + idx1 = solution.index(n) + for kn in solution[1:-1]: + idx2 = solution.index(kn) + if n == kn: + continue + + _tmp = copy.deepcopy(solution) + _tmp[idx1] = kn + _tmp[idx2] = n + + distance = 0 + + for k in _tmp[:-1]: + next_node = _tmp[_tmp.index(k) + 1] + for i in dict_of_neighbours[k]: + if i[0] == next_node: + distance = distance + int(i[1]) + _tmp.append(distance) + + if _tmp not in neighborhood_of_solution: + neighborhood_of_solution.append(_tmp) + + indexOfLastItemInTheList = len(neighborhood_of_solution[0]) - 1 + + neighborhood_of_solution.sort(key=lambda x: x[indexOfLastItemInTheList]) + return neighborhood_of_solution + + +def tabu_search( + first_solution, distance_of_first_solution, dict_of_neighbours, iters, size +): + """ + Pure implementation of Tabu search algorithm for a Travelling Salesman Problem in + Python. + + :param first_solution: The solution for the first iteration of Tabu search using + the redundant resolution strategy in a list. + :param distance_of_first_solution: The total distance that Travelling Salesman will + travel, if he follows the path in first_solution. + :param dict_of_neighbours: Dictionary with key each node and value a list of lists + with the neighbors of the node and the cost (distance) for each neighbor. + :param iters: The number of iterations that Tabu search will execute. + :param size: The size of Tabu List. + :return best_solution_ever: The solution with the lowest distance that occurred + during the execution of Tabu search. + :return best_cost: The total distance that Travelling Salesman will travel, if he + follows the path in best_solution ever. + """ + count = 1 + solution = first_solution + tabu_list = list() + best_cost = distance_of_first_solution + best_solution_ever = solution + + while count <= iters: + neighborhood = find_neighborhood(solution, dict_of_neighbours) + index_of_best_solution = 0 + best_solution = neighborhood[index_of_best_solution] + best_cost_index = len(best_solution) - 1 + + found = False + while not found: + i = 0 + while i < len(best_solution): + + if best_solution[i] != solution[i]: + first_exchange_node = best_solution[i] + second_exchange_node = solution[i] + break + i = i + 1 + + if [first_exchange_node, second_exchange_node] not in tabu_list and [ + second_exchange_node, + first_exchange_node, + ] not in tabu_list: + tabu_list.append([first_exchange_node, second_exchange_node]) + found = True + solution = best_solution[:-1] + cost = neighborhood[index_of_best_solution][best_cost_index] + if cost < best_cost: + best_cost = cost + best_solution_ever = solution + else: + index_of_best_solution = index_of_best_solution + 1 + best_solution = neighborhood[index_of_best_solution] + + if len(tabu_list) >= size: + tabu_list.pop(0) + + count = count + 1 + + return best_solution_ever, best_cost + + +def main(args=None): + dict_of_neighbours = generate_neighbours(args.File) + + first_solution, distance_of_first_solution = generate_first_solution( + args.File, dict_of_neighbours + ) + + best_sol, best_cost = tabu_search( + first_solution, + distance_of_first_solution, + dict_of_neighbours, + args.Iterations, + args.Size, + ) + + print(f"Best solution: {best_sol}, with total distance: {best_cost}.") + + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description="Tabu Search") + parser.add_argument( + "-f", + "--File", + type=str, + help="Path to the file containing the data", + required=True, + ) + parser.add_argument( + "-i", + "--Iterations", + type=int, + help="How many iterations the algorithm should perform", + required=True, + ) + parser.add_argument( + "-s", "--Size", type=int, help="Size of the tabu list", required=True + ) + + # Pass the arguments to main method + main(parser.parse_args()) diff --git a/python-mega-algo/searches/tabu_test_data.txt b/python-mega-algo/searches/tabu_test_data.txt new file mode 100644 index 00000000..f797ff1c --- /dev/null +++ b/python-mega-algo/searches/tabu_test_data.txt @@ -0,0 +1,10 @@ +a b 20 +a c 18 +a d 22 +a e 26 +b c 10 +b d 11 +b e 12 +c d 23 +c e 24 +d e 40 diff --git a/python-mega-algo/searches/ternary_search.py b/python-mega-algo/searches/ternary_search.py new file mode 100644 index 00000000..9422a4cc --- /dev/null +++ b/python-mega-algo/searches/ternary_search.py @@ -0,0 +1,170 @@ +""" +This is a type of divide and conquer algorithm which divides the search space into +3 parts and finds the target value based on the property of the array or list +(usually monotonic property). + +Time Complexity : O(log3 N) +Space Complexity : O(1) +""" +from typing import List + +# This is the precision for this function which can be altered. +# It is recommended for users to keep this number greater than or equal to 10. +precision = 10 + + +# This is the linear search that will occur after the search space has become smaller. + + +def lin_search(left: int, right: int, array: List[int], target: int) -> int: + """Perform linear search in list. Returns -1 if element is not found. + + Parameters + ---------- + left : int + left index bound. + right : int + right index bound. + array : List[int] + List of elements to be searched on + target : int + Element that is searched + + Returns + ------- + int + index of element that is looked for. + + Examples + -------- + >>> lin_search(0, 4, [4, 5, 6, 7], 7) + 3 + >>> lin_search(0, 3, [4, 5, 6, 7], 7) + -1 + >>> lin_search(0, 2, [-18, 2], -18) + 0 + >>> lin_search(0, 1, [5], 5) + 0 + >>> lin_search(0, 3, ['a', 'c', 'd'], 'c') + 1 + >>> lin_search(0, 3, [.1, .4 , -.1], .1) + 0 + >>> lin_search(0, 3, [.1, .4 , -.1], -.1) + 2 + """ + for i in range(left, right): + if array[i] == target: + return i + return -1 + + +def ite_ternary_search(array: List[int], target: int) -> int: + """Iterative method of the ternary search algorithm. + >>> test_list = [0, 1, 2, 8, 13, 17, 19, 32, 42] + >>> ite_ternary_search(test_list, 3) + -1 + >>> ite_ternary_search(test_list, 13) + 4 + >>> ite_ternary_search([4, 5, 6, 7], 4) + 0 + >>> ite_ternary_search([4, 5, 6, 7], -10) + -1 + >>> ite_ternary_search([-18, 2], -18) + 0 + >>> ite_ternary_search([5], 5) + 0 + >>> ite_ternary_search(['a', 'c', 'd'], 'c') + 1 + >>> ite_ternary_search(['a', 'c', 'd'], 'f') + -1 + >>> ite_ternary_search([], 1) + -1 + >>> ite_ternary_search([.1, .4 , -.1], .1) + 0 + """ + + left = 0 + right = len(array) + while left <= right: + if right - left < precision: + return lin_search(left, right, array, target) + + one_third = (left + right) / 3 + 1 + two_third = 2 * (left + right) / 3 + 1 + + if array[one_third] == target: + return one_third + elif array[two_third] == target: + return two_third + + elif target < array[one_third]: + right = one_third - 1 + elif array[two_third] < target: + left = two_third + 1 + + else: + + left = one_third + 1 + right = two_third - 1 + else: + return -1 + + +def rec_ternary_search(left: int, right: int, array: List[int], target: int) -> int: + """Recursive method of the ternary search algorithm. + + >>> test_list = [0, 1, 2, 8, 13, 17, 19, 32, 42] + >>> rec_ternary_search(0, len(test_list), test_list, 3) + -1 + >>> rec_ternary_search(4, len(test_list), test_list, 42) + 8 + >>> rec_ternary_search(0, 2, [4, 5, 6, 7], 4) + 0 + >>> rec_ternary_search(0, 3, [4, 5, 6, 7], -10) + -1 + >>> rec_ternary_search(0, 1, [-18, 2], -18) + 0 + >>> rec_ternary_search(0, 1, [5], 5) + 0 + >>> rec_ternary_search(0, 2, ['a', 'c', 'd'], 'c') + 1 + >>> rec_ternary_search(0, 2, ['a', 'c', 'd'], 'f') + -1 + >>> rec_ternary_search(0, 0, [], 1) + -1 + >>> rec_ternary_search(0, 3, [.1, .4 , -.1], .1) + 0 + """ + if left < right: + if right - left < precision: + return lin_search(left, right, array, target) + one_third = (left + right) / 3 + 1 + two_third = 2 * (left + right) / 3 + 1 + + if array[one_third] == target: + return one_third + elif array[two_third] == target: + return two_third + + elif target < array[one_third]: + return rec_ternary_search(left, one_third - 1, array, target) + elif array[two_third] < target: + return rec_ternary_search(two_third + 1, right, array, target) + else: + return rec_ternary_search(one_third + 1, two_third - 1, array, target) + else: + return -1 + + +if __name__ == "__main__": + user_input = input("Enter numbers separated by comma:\n").strip() + collection = [int(item.strip()) for item in user_input.split(",")] + assert collection == sorted(collection), f"List must be ordered.\n{collection}." + target = int(input("Enter the number to be found in the list:\n").strip()) + result1 = ite_ternary_search(collection, target) + result2 = rec_ternary_search(0, len(collection) - 1, collection, target) + if result2 != -1: + print(f"Iterative search: {target} found at positions: {result1}") + print(f"Recursive search: {target} found at positions: {result2}") + else: + print("Not found") diff --git a/python-mega-algo/sorts/__init__.py b/python-mega-algo/sorts/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/sorts/bead_sort.py b/python-mega-algo/sorts/bead_sort.py new file mode 100644 index 00000000..3767e842 --- /dev/null +++ b/python-mega-algo/sorts/bead_sort.py @@ -0,0 +1,43 @@ +""" +Bead sort only works for sequences of nonegative integers. +https://en.wikipedia.org/wiki/Bead_sort +""" + + +def bead_sort(sequence: list) -> list: + """ + >>> bead_sort([6, 11, 12, 4, 1, 5]) + [1, 4, 5, 6, 11, 12] + + >>> bead_sort([9, 8, 7, 6, 5, 4 ,3, 2, 1]) + [1, 2, 3, 4, 5, 6, 7, 8, 9] + + >>> bead_sort([5, 0, 4, 3]) + [0, 3, 4, 5] + + >>> bead_sort([8, 2, 1]) + [1, 2, 8] + + >>> bead_sort([1, .9, 0.0, 0, -1, -.9]) + Traceback (most recent call last): + ... + TypeError: Sequence must be list of nonnegative integers + + >>> bead_sort("Hello world") + Traceback (most recent call last): + ... + TypeError: Sequence must be list of nonnegative integers + """ + if any(not isinstance(x, int) or x < 0 for x in sequence): + raise TypeError("Sequence must be list of nonnegative integers") + for _ in range(len(sequence)): + for i, (rod_upper, rod_lower) in enumerate(zip(sequence, sequence[1:])): + if rod_upper > rod_lower: + sequence[i] -= rod_upper - rod_lower + sequence[i + 1] += rod_upper - rod_lower + return sequence + + +if __name__ == "__main__": + assert bead_sort([5, 4, 3, 2, 1]) == [1, 2, 3, 4, 5] + assert bead_sort([7, 9, 4, 3, 5]) == [3, 4, 5, 7, 9] diff --git a/python-mega-algo/sorts/bitonic_sort.py b/python-mega-algo/sorts/bitonic_sort.py new file mode 100644 index 00000000..c718973e --- /dev/null +++ b/python-mega-algo/sorts/bitonic_sort.py @@ -0,0 +1,96 @@ +""" +Python program for Bitonic Sort. + +Note that this program works only when size of input is a power of 2. +""" +from typing import List + + +def comp_and_swap(array: List[int], index1: int, index2: int, direction: int) -> None: + """Compare the value at given index1 and index2 of the array and swap them as per + the given direction. + + The parameter direction indicates the sorting direction, ASCENDING(1) or + DESCENDING(0); if (a[i] > a[j]) agrees with the direction, then a[i] and a[j] are + interchanged. + + >>> arr = [12, 42, -21, 1] + >>> comp_and_swap(arr, 1, 2, 1) + >>> print(arr) + [12, -21, 42, 1] + + >>> comp_and_swap(arr, 1, 2, 0) + >>> print(arr) + [12, 42, -21, 1] + + >>> comp_and_swap(arr, 0, 3, 1) + >>> print(arr) + [1, 42, -21, 12] + + >>> comp_and_swap(arr, 0, 3, 0) + >>> print(arr) + [12, 42, -21, 1] + """ + if (direction == 1 and array[index1] > array[index2]) or ( + direction == 0 and array[index1] < array[index2] + ): + array[index1], array[index2] = array[index2], array[index1] + + +def bitonic_merge(array: List[int], low: int, length: int, direction: int) -> None: + """ + It recursively sorts a bitonic sequence in ascending order, if direction = 1, and in + descending if direction = 0. + The sequence to be sorted starts at index position low, the parameter length is the + number of elements to be sorted. + + >>> arr = [12, 42, -21, 1] + >>> bitonic_merge(arr, 0, 4, 1) + >>> print(arr) + [-21, 1, 12, 42] + + >>> bitonic_merge(arr, 0, 4, 0) + >>> print(arr) + [42, 12, 1, -21] + """ + if length > 1: + middle = int(length / 2) + for i in range(low, low + middle): + comp_and_swap(array, i, i + middle, direction) + bitonic_merge(array, low, middle, direction) + bitonic_merge(array, low + middle, middle, direction) + + +def bitonic_sort(array: List[int], low: int, length: int, direction: int) -> None: + """ + This function first produces a bitonic sequence by recursively sorting its two + halves in opposite sorting orders, and then calls bitonic_merge to make them in the + same order. + + >>> arr = [12, 34, 92, -23, 0, -121, -167, 145] + >>> bitonic_sort(arr, 0, 8, 1) + >>> arr + [-167, -121, -23, 0, 12, 34, 92, 145] + + >>> bitonic_sort(arr, 0, 8, 0) + >>> arr + [145, 92, 34, 12, 0, -23, -121, -167] + """ + if length > 1: + middle = int(length / 2) + bitonic_sort(array, low, middle, 1) + bitonic_sort(array, low + middle, middle, 0) + bitonic_merge(array, low, length, direction) + + +if __name__ == "__main__": + user_input = input("Enter numbers separated by a comma:\n").strip() + unsorted = [int(item.strip()) for item in user_input.split(",")] + + bitonic_sort(unsorted, 0, len(unsorted), 1) + print("\nSorted array in ascending order is: ", end="") + print(*unsorted, sep=", ") + + bitonic_merge(unsorted, 0, len(unsorted), 0) + print("Sorted array in descending order is: ", end="") + print(*unsorted, sep=", ") diff --git a/python-mega-algo/sorts/bogo_sort.py b/python-mega-algo/sorts/bogo_sort.py new file mode 100644 index 00000000..b72f2089 --- /dev/null +++ b/python-mega-algo/sorts/bogo_sort.py @@ -0,0 +1,49 @@ +""" +This is a pure Python implementation of the bogosort algorithm, +also known as permutation sort, stupid sort, slowsort, shotgun sort, or monkey sort. +Bogosort generates random permutations until it guesses the correct one. + +More info on: https://en.wikipedia.org/wiki/Bogosort + +For doctests run following command: +python -m doctest -v bogo_sort.py +or +python3 -m doctest -v bogo_sort.py +For manual testing run: +python bogo_sort.py +""" + +import random + + +def bogo_sort(collection): + """Pure implementation of the bogosort algorithm in Python + :param collection: some mutable ordered collection with heterogeneous + comparable items inside + :return: the same collection ordered by ascending + Examples: + >>> bogo_sort([0, 5, 3, 2, 2]) + [0, 2, 2, 3, 5] + >>> bogo_sort([]) + [] + >>> bogo_sort([-2, -5, -45]) + [-45, -5, -2] + """ + + def is_sorted(collection): + if len(collection) < 2: + return True + for i in range(len(collection) - 1): + if collection[i] > collection[i + 1]: + return False + return True + + while not is_sorted(collection): + random.shuffle(collection) + return collection + + +if __name__ == "__main__": + user_input = input("Enter numbers separated by a comma:\n").strip() + unsorted = [int(item) for item in user_input.split(",")] + print(bogo_sort(unsorted)) diff --git a/python-mega-algo/sorts/bubble_sort.py b/python-mega-algo/sorts/bubble_sort.py new file mode 100644 index 00000000..d4f0d25c --- /dev/null +++ b/python-mega-algo/sorts/bubble_sort.py @@ -0,0 +1,52 @@ +def bubble_sort(collection): + """Pure implementation of bubble sort algorithm in Python + + :param collection: some mutable ordered collection with heterogeneous + comparable items inside + :return: the same collection ordered by ascending + + Examples: + >>> bubble_sort([0, 5, 2, 3, 2]) + [0, 2, 2, 3, 5] + >>> bubble_sort([0, 5, 2, 3, 2]) == sorted([0, 5, 2, 3, 2]) + True + >>> bubble_sort([]) == sorted([]) + True + >>> bubble_sort([-2, -45, -5]) == sorted([-2, -45, -5]) + True + >>> bubble_sort([-23, 0, 6, -4, 34]) == sorted([-23, 0, 6, -4, 34]) + True + >>> bubble_sort(['d', 'a', 'b', 'e', 'c']) == sorted(['d', 'a', 'b', 'e', 'c']) + True + >>> import random + >>> collection = random.sample(range(-50, 50), 100) + >>> bubble_sort(collection) == sorted(collection) + True + >>> import string + >>> collection = random.choices(string.ascii_letters + string.digits, k=100) + >>> bubble_sort(collection) == sorted(collection) + True + """ + length = len(collection) + for i in range(length - 1): + swapped = False + for j in range(length - 1 - i): + if collection[j] > collection[j + 1]: + swapped = True + collection[j], collection[j + 1] = collection[j + 1], collection[j] + if not swapped: + break # Stop iteration if the collection is sorted. + return collection + + +if __name__ == "__main__": + import doctest + import time + + doctest.testmod() + + user_input = input("Enter numbers separated by a comma:").strip() + unsorted = [int(item) for item in user_input.split(",")] + start = time.process_time() + print(*bubble_sort(unsorted), sep=",") + print(f"Processing time: {time.process_time() - start}") diff --git a/python-mega-algo/sorts/bucket_sort.py b/python-mega-algo/sorts/bucket_sort.py new file mode 100644 index 00000000..1ac76774 --- /dev/null +++ b/python-mega-algo/sorts/bucket_sort.py @@ -0,0 +1,68 @@ +#!/usr/bin/env python3 +""" +Illustrate how to implement bucket sort algorithm. + +Author: OMKAR PATHAK +This program will illustrate how to implement bucket sort algorithm + +Wikipedia says: Bucket sort, or bin sort, is a sorting algorithm that works +by distributing the elements of an array into a number of buckets. +Each bucket is then sorted individually, either using a different sorting +algorithm, or by recursively applying the bucket sorting algorithm. It is a +distribution sort, and is a cousin of radix sort in the most to least +significant digit flavour. +Bucket sort is a generalization of pigeonhole sort. Bucket sort can be +implemented with comparisons and therefore can also be considered a +comparison sort algorithm. The computational complexity estimates involve the +number of buckets. + +Time Complexity of Solution: +Worst case scenario occurs when all the elements are placed in a single bucket. +The overall performance would then be dominated by the algorithm used to sort each +bucket. In this case, O(n log n), because of TimSort + +Average Case O(n + (n^2)/k + k), where k is the number of buckets + +If k = O(n), time complexity is O(n) + +Source: https://en.wikipedia.org/wiki/Bucket_sort +""" +from typing import List + + +def bucket_sort(my_list: list) -> list: + """ + >>> data = [-1, 2, -5, 0] + >>> bucket_sort(data) == sorted(data) + True + >>> data = [9, 8, 7, 6, -12] + >>> bucket_sort(data) == sorted(data) + True + >>> data = [.4, 1.2, .1, .2, -.9] + >>> bucket_sort(data) == sorted(data) + True + >>> bucket_sort([]) == sorted([]) + True + >>> import random + >>> collection = random.sample(range(-50, 50), 50) + >>> bucket_sort(collection) == sorted(collection) + True + """ + if len(my_list) == 0: + return [] + min_value, max_value = min(my_list), max(my_list) + bucket_count = int(max_value - min_value) + 1 + buckets: List[list] = [[] for _ in range(bucket_count)] + + for i in range(len(my_list)): + buckets[(int(my_list[i] - min_value) // bucket_count)].append(my_list[i]) + + return [v for bucket in buckets for v in sorted(bucket)] + + +if __name__ == "__main__": + from doctest import testmod + + testmod() + assert bucket_sort([4, 5, 3, 2, 1]) == [1, 2, 3, 4, 5] + assert bucket_sort([0, 1, -10, 15, 2, -2]) == [-10, -2, 0, 1, 2, 15] diff --git a/python-mega-algo/sorts/cocktail_shaker_sort.py b/python-mega-algo/sorts/cocktail_shaker_sort.py new file mode 100644 index 00000000..b738ff31 --- /dev/null +++ b/python-mega-algo/sorts/cocktail_shaker_sort.py @@ -0,0 +1,46 @@ +""" https://en.wikipedia.org/wiki/Cocktail_shaker_sort """ + + +def cocktail_shaker_sort(unsorted: list) -> list: + """ + Pure implementation of the cocktail shaker sort algorithm in Python. + >>> cocktail_shaker_sort([4, 5, 2, 1, 2]) + [1, 2, 2, 4, 5] + + >>> cocktail_shaker_sort([-4, 5, 0, 1, 2, 11]) + [-4, 0, 1, 2, 5, 11] + + >>> cocktail_shaker_sort([0.1, -2.4, 4.4, 2.2]) + [-2.4, 0.1, 2.2, 4.4] + + >>> cocktail_shaker_sort([1, 2, 3, 4, 5]) + [1, 2, 3, 4, 5] + + >>> cocktail_shaker_sort([-4, -5, -24, -7, -11]) + [-24, -11, -7, -5, -4] + """ + for i in range(len(unsorted) - 1, 0, -1): + swapped = False + + for j in range(i, 0, -1): + if unsorted[j] < unsorted[j - 1]: + unsorted[j], unsorted[j - 1] = unsorted[j - 1], unsorted[j] + swapped = True + + for j in range(i): + if unsorted[j] > unsorted[j + 1]: + unsorted[j], unsorted[j + 1] = unsorted[j + 1], unsorted[j] + swapped = True + + if not swapped: + break + return unsorted + + +if __name__ == "__main__": + import doctest + + doctest.testmod() + user_input = input("Enter numbers separated by a comma:\n").strip() + unsorted = [int(item) for item in user_input.split(",")] + print(f"{cocktail_shaker_sort(unsorted) = }") diff --git a/python-mega-algo/sorts/comb_sort.py b/python-mega-algo/sorts/comb_sort.py new file mode 100644 index 00000000..16bd10c7 --- /dev/null +++ b/python-mega-algo/sorts/comb_sort.py @@ -0,0 +1,64 @@ +""" +This is pure Python implementation of comb sort algorithm. +Comb sort is a relatively simple sorting algorithm originally designed by Wlodzimierz +Dobosiewicz in 1980. It was rediscovered by Stephen Lacey and Richard Box in 1991. +Comb sort improves on bubble sort algorithm. +In bubble sort, distance (or gap) between two compared elements is always one. +Comb sort improvement is that gap can be much more than 1, in order to prevent slowing +down by small values +at the end of a list. + +More info on: https://en.wikipedia.org/wiki/Comb_sort + +For doctests run following command: +python -m doctest -v comb_sort.py +or +python3 -m doctest -v comb_sort.py + +For manual testing run: +python comb_sort.py +""" + + +def comb_sort(data: list) -> list: + """Pure implementation of comb sort algorithm in Python + :param data: mutable collection with comparable items + :return: the same collection in ascending order + Examples: + >>> comb_sort([0, 5, 3, 2, 2]) + [0, 2, 2, 3, 5] + >>> comb_sort([]) + [] + >>> comb_sort([99, 45, -7, 8, 2, 0, -15, 3]) + [-15, -7, 0, 2, 3, 8, 45, 99] + """ + shrink_factor = 1.3 + gap = len(data) + completed = False + + while not completed: + + # Update the gap value for a next comb + gap = int(gap / shrink_factor) + if gap <= 1: + completed = True + + index = 0 + while index + gap < len(data): + if data[index] > data[index + gap]: + # Swap values + data[index], data[index + gap] = data[index + gap], data[index] + completed = False + index += 1 + + return data + + +if __name__ == "__main__": + import doctest + + doctest.testmod() + + user_input = input("Enter numbers separated by a comma:\n").strip() + unsorted = [int(item) for item in user_input.split(",")] + print(comb_sort(unsorted)) diff --git a/python-mega-algo/sorts/counting_sort.py b/python-mega-algo/sorts/counting_sort.py new file mode 100644 index 00000000..892ec5d5 --- /dev/null +++ b/python-mega-algo/sorts/counting_sort.py @@ -0,0 +1,73 @@ +""" +This is pure Python implementation of counting sort algorithm +For doctests run following command: +python -m doctest -v counting_sort.py +or +python3 -m doctest -v counting_sort.py +For manual testing run: +python counting_sort.py +""" + + +def counting_sort(collection): + """Pure implementation of counting sort algorithm in Python + :param collection: some mutable ordered collection with heterogeneous + comparable items inside + :return: the same collection ordered by ascending + Examples: + >>> counting_sort([0, 5, 3, 2, 2]) + [0, 2, 2, 3, 5] + >>> counting_sort([]) + [] + >>> counting_sort([-2, -5, -45]) + [-45, -5, -2] + """ + # if the collection is empty, returns empty + if collection == []: + return [] + + # get some information about the collection + coll_len = len(collection) + coll_max = max(collection) + coll_min = min(collection) + + # create the counting array + counting_arr_length = coll_max + 1 - coll_min + counting_arr = [0] * counting_arr_length + + # count how much a number appears in the collection + for number in collection: + counting_arr[number - coll_min] += 1 + + # sum each position with it's predecessors. now, counting_arr[i] tells + # us how many elements <= i has in the collection + for i in range(1, counting_arr_length): + counting_arr[i] = counting_arr[i] + counting_arr[i - 1] + + # create the output collection + ordered = [0] * coll_len + + # place the elements in the output, respecting the original order (stable + # sort) from end to begin, updating counting_arr + for i in reversed(range(0, coll_len)): + ordered[counting_arr[collection[i] - coll_min] - 1] = collection[i] + counting_arr[collection[i] - coll_min] -= 1 + + return ordered + + +def counting_sort_string(string): + """ + >>> counting_sort_string("thisisthestring") + 'eghhiiinrsssttt' + """ + return "".join([chr(i) for i in counting_sort([ord(c) for c in string])]) + + +if __name__ == "__main__": + # Test string sort + assert "eghhiiinrsssttt" == counting_sort_string("thisisthestring") + + user_input = input("Enter numbers separated by a comma:\n").strip() + unsorted = [int(item) for item in user_input.split(",")] + print(counting_sort(unsorted)) diff --git a/python-mega-algo/sorts/cycle_sort.py b/python-mega-algo/sorts/cycle_sort.py new file mode 100644 index 00000000..806f4044 --- /dev/null +++ b/python-mega-algo/sorts/cycle_sort.py @@ -0,0 +1,53 @@ +""" +Code contributed by Honey Sharma +Source: https://en.wikipedia.org/wiki/Cycle_sort +""" + + +def cycle_sort(array: list) -> list: + """ + >>> cycle_sort([4, 3, 2, 1]) + [1, 2, 3, 4] + + >>> cycle_sort([-4, 20, 0, -50, 100, -1]) + [-50, -4, -1, 0, 20, 100] + + >>> cycle_sort([-.1, -.2, 1.3, -.8]) + [-0.8, -0.2, -0.1, 1.3] + + >>> cycle_sort([]) + [] + """ + array_len = len(array) + for cycle_start in range(0, array_len - 1): + item = array[cycle_start] + + pos = cycle_start + for i in range(cycle_start + 1, array_len): + if array[i] < item: + pos += 1 + + if pos == cycle_start: + continue + + while item == array[pos]: + pos += 1 + + array[pos], item = item, array[pos] + while pos != cycle_start: + pos = cycle_start + for i in range(cycle_start + 1, array_len): + if array[i] < item: + pos += 1 + + while item == array[pos]: + pos += 1 + + array[pos], item = item, array[pos] + + return array + + +if __name__ == "__main__": + assert cycle_sort([4, 5, 3, 2, 1]) == [1, 2, 3, 4, 5] + assert cycle_sort([0, 1, -10, 15, 2, -2]) == [-10, -2, 0, 1, 2, 15] diff --git a/python-mega-algo/sorts/double_sort.py b/python-mega-algo/sorts/double_sort.py new file mode 100644 index 00000000..6ab16254 --- /dev/null +++ b/python-mega-algo/sorts/double_sort.py @@ -0,0 +1,42 @@ +def double_sort(lst): + """this sorting algorithm sorts an array using the principle of bubble sort, + but does it both from left to right and right to left, + hence i decided to call it "double sort" + :param collection: mutable ordered sequence of elements + :return: the same collection in ascending order + Examples: + >>> double_sort([-1 ,-2 ,-3 ,-4 ,-5 ,-6 ,-7]) + [-7, -6, -5, -4, -3, -2, -1] + >>> double_sort([]) + [] + >>> double_sort([-1 ,-2 ,-3 ,-4 ,-5 ,-6]) + [-6, -5, -4, -3, -2, -1] + >>> double_sort([-3, 10, 16, -42, 29]) == sorted([-3, 10, 16, -42, 29]) + True + """ + no_of_elements = len(lst) + for i in range( + 0, int(((no_of_elements - 1) / 2) + 1) + ): # we don't need to traverse to end of list as + for j in range(0, no_of_elements - 1): + if ( + lst[j + 1] < lst[j] + ): # applying bubble sort algorithm from left to right (or forwards) + temp = lst[j + 1] + lst[j + 1] = lst[j] + lst[j] = temp + if ( + lst[no_of_elements - 1 - j] < lst[no_of_elements - 2 - j] + ): # applying bubble sort algorithm from right to left (or backwards) + temp = lst[no_of_elements - 1 - j] + lst[no_of_elements - 1 - j] = lst[no_of_elements - 2 - j] + lst[no_of_elements - 2 - j] = temp + return lst + + +if __name__ == "__main__": + print("enter the list to be sorted") + lst = [int(x) for x in input().split()] # inputing elements of the list in one line + sorted_lst = double_sort(lst) + print("the sorted list is") + print(sorted_lst) diff --git a/python-mega-algo/sorts/external_sort.py b/python-mega-algo/sorts/external_sort.py new file mode 100644 index 00000000..060e67ad --- /dev/null +++ b/python-mega-algo/sorts/external_sort.py @@ -0,0 +1,157 @@ +#!/usr/bin/env python + +# +# Sort large text files in a minimum amount of memory +# +import argparse +import os + + +class FileSplitter: + BLOCK_FILENAME_FORMAT = "block_{0}.dat" + + def __init__(self, filename): + self.filename = filename + self.block_filenames = [] + + def write_block(self, data, block_number): + filename = self.BLOCK_FILENAME_FORMAT.format(block_number) + with open(filename, "w") as file: + file.write(data) + self.block_filenames.append(filename) + + def get_block_filenames(self): + return self.block_filenames + + def split(self, block_size, sort_key=None): + i = 0 + with open(self.filename) as file: + while True: + lines = file.readlines(block_size) + + if lines == []: + break + + if sort_key is None: + lines.sort() + else: + lines.sort(key=sort_key) + + self.write_block("".join(lines), i) + i += 1 + + def cleanup(self): + map(lambda f: os.remove(f), self.block_filenames) + + +class NWayMerge: + def select(self, choices): + min_index = -1 + min_str = None + + for i in range(len(choices)): + if min_str is None or choices[i] < min_str: + min_index = i + + return min_index + + +class FilesArray: + def __init__(self, files): + self.files = files + self.empty = set() + self.num_buffers = len(files) + self.buffers = {i: None for i in range(self.num_buffers)} + + def get_dict(self): + return { + i: self.buffers[i] for i in range(self.num_buffers) if i not in self.empty + } + + def refresh(self): + for i in range(self.num_buffers): + if self.buffers[i] is None and i not in self.empty: + self.buffers[i] = self.files[i].readline() + + if self.buffers[i] == "": + self.empty.add(i) + self.files[i].close() + + if len(self.empty) == self.num_buffers: + return False + + return True + + def unshift(self, index): + value = self.buffers[index] + self.buffers[index] = None + + return value + + +class FileMerger: + def __init__(self, merge_strategy): + self.merge_strategy = merge_strategy + + def merge(self, filenames, outfilename, buffer_size): + buffers = FilesArray(self.get_file_handles(filenames, buffer_size)) + with open(outfilename, "w", buffer_size) as outfile: + while buffers.refresh(): + min_index = self.merge_strategy.select(buffers.get_dict()) + outfile.write(buffers.unshift(min_index)) + + def get_file_handles(self, filenames, buffer_size): + files = {} + + for i in range(len(filenames)): + files[i] = open(filenames[i], "r", buffer_size) + + return files + + +class ExternalSort: + def __init__(self, block_size): + self.block_size = block_size + + def sort(self, filename, sort_key=None): + num_blocks = self.get_number_blocks(filename, self.block_size) + splitter = FileSplitter(filename) + splitter.split(self.block_size, sort_key) + + merger = FileMerger(NWayMerge()) + buffer_size = self.block_size / (num_blocks + 1) + merger.merge(splitter.get_block_filenames(), filename + ".out", buffer_size) + + splitter.cleanup() + + def get_number_blocks(self, filename, block_size): + return (os.stat(filename).st_size / block_size) + 1 + + +def parse_memory(string): + if string[-1].lower() == "k": + return int(string[:-1]) * 1024 + elif string[-1].lower() == "m": + return int(string[:-1]) * 1024 * 1024 + elif string[-1].lower() == "g": + return int(string[:-1]) * 1024 * 1024 * 1024 + else: + return int(string) + + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument( + "-m", "--mem", help="amount of memory to use for sorting", default="100M" + ) + parser.add_argument( + "filename", metavar="", nargs=1, help="name of file to sort" + ) + args = parser.parse_args() + + sorter = ExternalSort(parse_memory(args.mem)) + sorter.sort(args.filename[0]) + + +if __name__ == "__main__": + main() diff --git a/python-mega-algo/sorts/gnome_sort.py b/python-mega-algo/sorts/gnome_sort.py new file mode 100644 index 00000000..ea96e0a9 --- /dev/null +++ b/python-mega-algo/sorts/gnome_sort.py @@ -0,0 +1,56 @@ +""" +Gnome Sort Algorithm (A.K.A. Stupid Sort) + +This algorithm iterates over a list comparing an element with the previous one. +If order is not respected, it swaps element backward until order is respected with +previous element. It resumes the initial iteration from element new position. + +For doctests run following command: +python3 -m doctest -v gnome_sort.py + +For manual testing run: +python3 gnome_sort.py +""" + + +def gnome_sort(lst: list) -> list: + """ + Pure implementation of the gnome sort algorithm in Python + + Take some mutable ordered collection with heterogeneous comparable items inside as + arguments, return the same collection ordered by ascending. + + Examples: + >>> gnome_sort([0, 5, 3, 2, 2]) + [0, 2, 2, 3, 5] + + >>> gnome_sort([]) + [] + + >>> gnome_sort([-2, -5, -45]) + [-45, -5, -2] + + >>> "".join(gnome_sort(list(set("Gnomes are stupid!")))) + ' !Gadeimnoprstu' + """ + if len(lst) <= 1: + return lst + + i = 1 + + while i < len(lst): + if lst[i - 1] <= lst[i]: + i += 1 + else: + lst[i - 1], lst[i] = lst[i], lst[i - 1] + i -= 1 + if i == 0: + i = 1 + + return lst + + +if __name__ == "__main__": + user_input = input("Enter numbers separated by a comma:\n").strip() + unsorted = [int(item) for item in user_input.split(",")] + print(gnome_sort(unsorted)) diff --git a/python-mega-algo/sorts/heap_sort.py b/python-mega-algo/sorts/heap_sort.py new file mode 100644 index 00000000..4dca879b --- /dev/null +++ b/python-mega-algo/sorts/heap_sort.py @@ -0,0 +1,58 @@ +""" +This is a pure Python implementation of the heap sort algorithm. + +For doctests run following command: +python -m doctest -v heap_sort.py +or +python3 -m doctest -v heap_sort.py + +For manual testing run: +python heap_sort.py +""" + + +def heapify(unsorted, index, heap_size): + largest = index + left_index = 2 * index + 1 + right_index = 2 * index + 2 + if left_index < heap_size and unsorted[left_index] > unsorted[largest]: + largest = left_index + + if right_index < heap_size and unsorted[right_index] > unsorted[largest]: + largest = right_index + + if largest != index: + unsorted[largest], unsorted[index] = unsorted[index], unsorted[largest] + heapify(unsorted, largest, heap_size) + + +def heap_sort(unsorted): + """ + Pure implementation of the heap sort algorithm in Python + :param collection: some mutable ordered collection with heterogeneous + comparable items inside + :return: the same collection ordered by ascending + + Examples: + >>> heap_sort([0, 5, 3, 2, 2]) + [0, 2, 2, 3, 5] + + >>> heap_sort([]) + [] + + >>> heap_sort([-2, -5, -45]) + [-45, -5, -2] + """ + n = len(unsorted) + for i in range(n // 2 - 1, -1, -1): + heapify(unsorted, i, n) + for i in range(n - 1, 0, -1): + unsorted[0], unsorted[i] = unsorted[i], unsorted[0] + heapify(unsorted, 0, i) + return unsorted + + +if __name__ == "__main__": + user_input = input("Enter numbers separated by a comma:\n").strip() + unsorted = [int(item) for item in user_input.split(",")] + print(heap_sort(unsorted)) diff --git a/python-mega-algo/sorts/insertion_sort.py b/python-mega-algo/sorts/insertion_sort.py new file mode 100644 index 00000000..6d5bb2b4 --- /dev/null +++ b/python-mega-algo/sorts/insertion_sort.py @@ -0,0 +1,60 @@ +""" +A pure Python implementation of the insertion sort algorithm + +This algorithm sorts a collection by comparing adjacent elements. +When it finds that order is not respected, it moves the element compared +backward until the order is correct. It then goes back directly to the +element's initial position resuming forward comparison. + +For doctests run following command: +python3 -m doctest -v insertion_sort.py + +For manual testing run: +python3 insertion_sort.py +""" + + +def insertion_sort(collection: list) -> list: + """A pure Python implementation of the insertion sort algorithm + + :param collection: some mutable ordered collection with heterogeneous + comparable items inside + :return: the same collection ordered by ascending + + Examples: + >>> insertion_sort([0, 5, 3, 2, 2]) + [0, 2, 2, 3, 5] + >>> insertion_sort([]) == sorted([]) + True + >>> insertion_sort([-2, -5, -45]) == sorted([-2, -5, -45]) + True + >>> insertion_sort(['d', 'a', 'b', 'e', 'c']) == sorted(['d', 'a', 'b', 'e', 'c']) + True + >>> import random + >>> collection = random.sample(range(-50, 50), 100) + >>> insertion_sort(collection) == sorted(collection) + True + >>> import string + >>> collection = random.choices(string.ascii_letters + string.digits, k=100) + >>> insertion_sort(collection) == sorted(collection) + True + """ + + for insert_index, insert_value in enumerate(collection[1:]): + temp_index = insert_index + while insert_index >= 0 and insert_value < collection[insert_index]: + collection[insert_index + 1] = collection[insert_index] + insert_index -= 1 + if insert_index != temp_index: + collection[insert_index + 1] = insert_value + return collection + + +if __name__ == "__main__": + from doctest import testmod + + testmod() + + user_input = input("Enter numbers separated by a comma:\n").strip() + unsorted = [int(item) for item in user_input.split(",")] + print(f"{insertion_sort(unsorted) = }") diff --git a/python-mega-algo/sorts/intro_sort.py b/python-mega-algo/sorts/intro_sort.py new file mode 100644 index 00000000..f0e3645a --- /dev/null +++ b/python-mega-algo/sorts/intro_sort.py @@ -0,0 +1,173 @@ +""" +Introspective Sort is hybrid sort (Quick Sort + Heap Sort + Insertion Sort) +if the size of the list is under 16, use insertion sort +https://en.wikipedia.org/wiki/Introsort +""" +import math + + +def insertion_sort(array: list, start: int = 0, end: int = 0) -> list: + """ + >>> array = [4, 2, 6, 8, 1, 7, 8, 22, 14, 56, 27, 79, 23, 45, 14, 12] + + >>> insertion_sort(array, 0, len(array)) + [1, 2, 4, 6, 7, 8, 8, 12, 14, 14, 22, 23, 27, 45, 56, 79] + """ + end = end or len(array) + for i in range(start, end): + temp_index = i + temp_index_value = array[i] + while temp_index != start and temp_index_value < array[temp_index - 1]: + array[temp_index] = array[temp_index - 1] + temp_index -= 1 + array[temp_index] = temp_index_value + return array + + +def heapify(array: list, index: int, heap_size: int) -> None: # Max Heap + """ + >>> array = [4, 2, 6, 8, 1, 7, 8, 22, 14, 56, 27, 79, 23, 45, 14, 12] + + >>> heapify(array, len(array) // 2 ,len(array)) + """ + largest = index + left_index = 2 * index + 1 # Left Node + right_index = 2 * index + 2 # Right Node + + if left_index < heap_size and array[largest] < array[left_index]: + largest = left_index + + if right_index < heap_size and array[largest] < array[right_index]: + largest = right_index + + if largest != index: + array[index], array[largest] = array[largest], array[index] + heapify(array, largest, heap_size) + + +def heap_sort(array: list) -> list: + """ + >>> array = [4, 2, 6, 8, 1, 7, 8, 22, 14, 56, 27, 79, 23, 45, 14, 12] + + >>> heap_sort(array) + [1, 2, 4, 6, 7, 8, 8, 12, 14, 14, 22, 23, 27, 45, 56, 79] + """ + n = len(array) + + for i in range(n // 2, -1, -1): + heapify(array, i, n) + + for i in range(n - 1, 0, -1): + array[i], array[0] = array[0], array[i] + heapify(array, 0, i) + + return array + + +def median_of_3( + array: list, first_index: int, middle_index: int, last_index: int +) -> int: + """ + >>> array = [4, 2, 6, 8, 1, 7, 8, 22, 14, 56, 27, 79, 23, 45, 14, 12] + + >>> median_of_3(array, 0, 0 + ((len(array) - 0) // 2) + 1, len(array) - 1) + 12 + """ + if (array[first_index] > array[middle_index]) != ( + array[first_index] > array[last_index] + ): + return array[first_index] + elif (array[middle_index] > array[first_index]) != ( + array[middle_index] > array[last_index] + ): + return array[middle_index] + else: + return array[last_index] + + +def partition(array: list, low: int, high: int, pivot: int) -> int: + """ + >>> array = [4, 2, 6, 8, 1, 7, 8, 22, 14, 56, 27, 79, 23, 45, 14, 12] + + >>> partition(array, 0, len(array), 12) + 8 + """ + i = low + j = high + while True: + while array[i] < pivot: + i += 1 + j -= 1 + while pivot < array[j]: + j -= 1 + if i >= j: + return i + array[i], array[j] = array[j], array[i] + i += 1 + + +def sort(array: list) -> list: + """ + :param collection: some mutable ordered collection with heterogeneous + comparable items inside + :return: the same collection ordered by ascending + + Examples: + >>> sort([4, 2, 6, 8, 1, 7, 8, 22, 14, 56, 27, 79, 23, 45, 14, 12]) + [1, 2, 4, 6, 7, 8, 8, 12, 14, 14, 22, 23, 27, 45, 56, 79] + + >>> sort([-1, -5, -3, -13, -44]) + [-44, -13, -5, -3, -1] + + >>> sort([]) + [] + + >>> sort([5]) + [5] + + >>> sort([-3, 0, -7, 6, 23, -34]) + [-34, -7, -3, 0, 6, 23] + + >>> sort([1.7, 1.0, 3.3, 2.1, 0.3 ]) + [0.3, 1.0, 1.7, 2.1, 3.3] + + >>> sort(['d', 'a', 'b', 'e', 'c']) + ['a', 'b', 'c', 'd', 'e'] + """ + if len(array) == 0: + return array + max_depth = 2 * math.ceil(math.log2(len(array))) + size_threshold = 16 + return intro_sort(array, 0, len(array), size_threshold, max_depth) + + +def intro_sort( + array: list, start: int, end: int, size_threshold: int, max_depth: int +) -> list: + """ + >>> array = [4, 2, 6, 8, 1, 7, 8, 22, 14, 56, 27, 79, 23, 45, 14, 12] + + >>> max_depth = 2 * math.ceil(math.log2(len(array))) + + >>> intro_sort(array, 0, len(array), 16, max_depth) + [1, 2, 4, 6, 7, 8, 8, 12, 14, 14, 22, 23, 27, 45, 56, 79] + """ + while end - start > size_threshold: + if max_depth == 0: + return heap_sort(array) + max_depth -= 1 + pivot = median_of_3(array, start, start + ((end - start) // 2) + 1, end - 1) + p = partition(array, start, end, pivot) + intro_sort(array, p, end, size_threshold, max_depth) + end = p + return insertion_sort(array, start, end) + + +if __name__ == "__main__": + import doctest + + doctest.testmod() + + user_input = input("Enter numbers separated by a comma : ").strip() + unsorted = [float(item) for item in user_input.split(",")] + print(sort(unsorted)) diff --git a/python-mega-algo/sorts/iterative_merge_sort.py b/python-mega-algo/sorts/iterative_merge_sort.py new file mode 100644 index 00000000..5ee0bada --- /dev/null +++ b/python-mega-algo/sorts/iterative_merge_sort.py @@ -0,0 +1,73 @@ +""" +Implementation of iterative merge sort in Python +Author: Aman Gupta + +For doctests run following command: +python3 -m doctest -v iterative_merge_sort.py + +For manual testing run: +python3 iterative_merge_sort.py +""" + +from __future__ import annotations + + +def merge(input_list: list, low: int, mid: int, high: int) -> list: + """ + sorting left-half and right-half individually + then merging them into result + """ + result = [] + left, right = input_list[low:mid], input_list[mid : high + 1] + while left and right: + result.append((left if left[0] <= right[0] else right).pop(0)) + input_list[low : high + 1] = result + left + right + return input_list + + +# iteration over the unsorted list +def iter_merge_sort(input_list: list) -> list: + """ + Return a sorted copy of the input list + + >>> iter_merge_sort([5, 9, 8, 7, 1, 2, 7]) + [1, 2, 5, 7, 7, 8, 9] + >>> iter_merge_sort([6]) + [6] + >>> iter_merge_sort([]) + [] + >>> iter_merge_sort([-2, -9, -1, -4]) + [-9, -4, -2, -1] + >>> iter_merge_sort([1.1, 1, 0.0, -1, -1.1]) + [-1.1, -1, 0.0, 1, 1.1] + >>> iter_merge_sort(['c', 'b', 'a']) + ['a', 'b', 'c'] + >>> iter_merge_sort('cba') + ['a', 'b', 'c'] + """ + if len(input_list) <= 1: + return input_list + input_list = list(input_list) + + # iteration for two-way merging + p = 2 + while p < len(input_list): + # getting low, high and middle value for merge-sort of single list + for i in range(0, len(input_list), p): + low = i + high = i + p - 1 + mid = (low + high + 1) // 2 + input_list = merge(input_list, low, mid, high) + # final merge of last two parts + if p * 2 >= len(input_list): + mid = i + input_list = merge(input_list, 0, mid, len(input_list) - 1) + p *= 2 + + return input_list + + +if __name__ == "__main__": + user_input = input("Enter numbers separated by a comma:\n").strip() + unsorted = [int(item.strip()) for item in user_input.split(",")] + print(iter_merge_sort(unsorted)) diff --git a/python-mega-algo/sorts/merge_insertion_sort.py b/python-mega-algo/sorts/merge_insertion_sort.py new file mode 100644 index 00000000..fb71d84a --- /dev/null +++ b/python-mega-algo/sorts/merge_insertion_sort.py @@ -0,0 +1,179 @@ +""" +This is a pure Python implementation of the merge-insertion sort algorithm +Source: https://en.wikipedia.org/wiki/Merge-insertion_sort + +For doctests run following command: +python3 -m doctest -v merge_insertion_sort.py +or +python -m doctest -v merge_insertion_sort.py + +For manual testing run: +python3 merge_insertion_sort.py +""" + +from __future__ import annotations + + +def merge_insertion_sort(collection: list[int]) -> list[int]: + """Pure implementation of merge-insertion sort algorithm in Python + + :param collection: some mutable ordered collection with heterogeneous + comparable items inside + :return: the same collection ordered by ascending + + Examples: + >>> merge_insertion_sort([0, 5, 3, 2, 2]) + [0, 2, 2, 3, 5] + + >>> merge_insertion_sort([99]) + [99] + + >>> merge_insertion_sort([-2, -5, -45]) + [-45, -5, -2] + """ + + def binary_search_insertion(sorted_list, item): + left = 0 + right = len(sorted_list) - 1 + while left <= right: + middle = (left + right) // 2 + if left == right: + if sorted_list[middle] < item: + left = middle + 1 + break + elif sorted_list[middle] < item: + left = middle + 1 + else: + right = middle - 1 + sorted_list.insert(left, item) + return sorted_list + + def sortlist_2d(list_2d): + def merge(left, right): + result = [] + while left and right: + if left[0][0] < right[0][0]: + result.append(left.pop(0)) + else: + result.append(right.pop(0)) + return result + left + right + + length = len(list_2d) + if length <= 1: + return list_2d + middle = length // 2 + return merge(sortlist_2d(list_2d[:middle]), sortlist_2d(list_2d[middle:])) + + if len(collection) <= 1: + return collection + + """ + Group the items into two pairs, and leave one element if there is a last odd item. + + Example: [999, 100, 75, 40, 10000] + -> [999, 100], [75, 40]. Leave 10000. + """ + two_paired_list = [] + has_last_odd_item = False + for i in range(0, len(collection), 2): + if i == len(collection) - 1: + has_last_odd_item = True + else: + """ + Sort two-pairs in each groups. + + Example: [999, 100], [75, 40] + -> [100, 999], [40, 75] + """ + if collection[i] < collection[i + 1]: + two_paired_list.append([collection[i], collection[i + 1]]) + else: + two_paired_list.append([collection[i + 1], collection[i]]) + + """ + Sort two_paired_list. + + Example: [100, 999], [40, 75] + -> [40, 75], [100, 999] + """ + sorted_list_2d = sortlist_2d(two_paired_list) + + """ + 40 < 100 is sure because it has already been sorted. + Generate the sorted_list of them so that you can avoid unnecessary comparison. + + Example: + group0 group1 + 40 100 + 75 999 + -> + group0 group1 + [40, 100] + 75 999 + """ + result = [i[0] for i in sorted_list_2d] + + """ + 100 < 999 is sure because it has already been sorted. + Put 999 in last of the sorted_list so that you can avoid unnecessary comparison. + + Example: + group0 group1 + [40, 100] + 75 999 + -> + group0 group1 + [40, 100, 999] + 75 + """ + result.append(sorted_list_2d[-1][1]) + + """ + Insert the last odd item left if there is. + + Example: + group0 group1 + [40, 100, 999] + 75 + -> + group0 group1 + [40, 100, 999, 10000] + 75 + """ + if has_last_odd_item: + pivot = collection[-1] + result = binary_search_insertion(result, pivot) + + """ + Insert the remaining items. + In this case, 40 < 75 is sure because it has already been sorted. + Therefore, you only need to insert 75 into [100, 999, 10000], + so that you can avoid unnecessary comparison. + + Example: + group0 group1 + [40, 100, 999, 10000] + ^ You don't need to compare with this as 40 < 75 is already sure. + 75 + -> + [40, 75, 100, 999, 10000] + """ + is_last_odd_item_inserted_before_this_index = False + for i in range(len(sorted_list_2d) - 1): + if result[i] == collection[-i]: + is_last_odd_item_inserted_before_this_index = True + pivot = sorted_list_2d[i][1] + # If last_odd_item is inserted before the item's index, + # you should forward index one more. + if is_last_odd_item_inserted_before_this_index: + result = result[: i + 2] + binary_search_insertion(result[i + 2 :], pivot) + else: + result = result[: i + 1] + binary_search_insertion(result[i + 1 :], pivot) + + return result + + +if __name__ == "__main__": + user_input = input("Enter numbers separated by a comma:\n").strip() + unsorted = [int(item) for item in user_input.split(",")] + print(merge_insertion_sort(unsorted)) diff --git a/python-mega-algo/sorts/merge_sort.py b/python-mega-algo/sorts/merge_sort.py new file mode 100644 index 00000000..4da29f32 --- /dev/null +++ b/python-mega-algo/sorts/merge_sort.py @@ -0,0 +1,53 @@ +""" +This is a pure Python implementation of the merge sort algorithm +For doctests run following command: +python -m doctest -v merge_sort.py +or +python3 -m doctest -v merge_sort.py +For manual testing run: +python merge_sort.py +""" + + +def merge_sort(collection: list) -> list: + """Pure implementation of the merge sort algorithm in Python + :param collection: some mutable ordered collection with heterogeneous + comparable items inside + :return: the same collection ordered by ascending + Examples: + >>> merge_sort([0, 5, 3, 2, 2]) + [0, 2, 2, 3, 5] + >>> merge_sort([]) + [] + >>> merge_sort([-2, -5, -45]) + [-45, -5, -2] + """ + + def merge(left: list, right: list) -> list: + """merge left and right + :param left: left collection + :param right: right collection + :return: merge result + """ + + def _merge(): + while left and right: + yield (left if left[0] <= right[0] else right).pop(0) + yield from left + yield from right + + return list(_merge()) + + if len(collection) <= 1: + return collection + mid = len(collection) // 2 + return merge(merge_sort(collection[:mid]), merge_sort(collection[mid:])) + + +if __name__ == "__main__": + import doctest + + doctest.testmod() + user_input = input("Enter numbers separated by a comma:\n").strip() + unsorted = [int(item) for item in user_input.split(",")] + print(*merge_sort(unsorted), sep=",") diff --git a/python-mega-algo/sorts/msd_radix_sort.py b/python-mega-algo/sorts/msd_radix_sort.py new file mode 100644 index 00000000..4c3cea30 --- /dev/null +++ b/python-mega-algo/sorts/msd_radix_sort.py @@ -0,0 +1,160 @@ +""" +Python implementation of the MSD radix sort algorithm. +It used the binary representation of the integers to sort +them. +https://en.wikipedia.org/wiki/Radix_sort +""" +from typing import List + + +def msd_radix_sort(list_of_ints: List[int]) -> List[int]: + """ + Implementation of the MSD radix sort algorithm. Only works + with positive integers + :param list_of_ints: A list of integers + :return: Returns the sorted list + >>> msd_radix_sort([40, 12, 1, 100, 4]) + [1, 4, 12, 40, 100] + >>> msd_radix_sort([]) + [] + >>> msd_radix_sort([123, 345, 123, 80]) + [80, 123, 123, 345] + >>> msd_radix_sort([1209, 834598, 1, 540402, 45]) + [1, 45, 1209, 540402, 834598] + >>> msd_radix_sort([-1, 34, 45]) + Traceback (most recent call last): + ... + ValueError: All numbers must be positive + """ + if not list_of_ints: + return [] + + if min(list_of_ints) < 0: + raise ValueError("All numbers must be positive") + + most_bits = max(len(bin(x)[2:]) for x in list_of_ints) + return _msd_radix_sort(list_of_ints, most_bits) + + +def _msd_radix_sort(list_of_ints: List[int], bit_position: int) -> List[int]: + """ + Sort the given list based on the bit at bit_position. Numbers with a + 0 at that position will be at the start of the list, numbers with a + 1 at the end. + :param list_of_ints: A list of integers + :param bit_position: the position of the bit that gets compared + :return: Returns a partially sorted list + >>> _msd_radix_sort([45, 2, 32], 1) + [2, 32, 45] + >>> _msd_radix_sort([10, 4, 12], 2) + [4, 12, 10] + """ + if bit_position == 0 or len(list_of_ints) in [0, 1]: + return list_of_ints + + zeros = list() + ones = list() + # Split numbers based on bit at bit_position from the right + for number in list_of_ints: + if (number >> (bit_position - 1)) & 1: + # number has a one at bit bit_position + ones.append(number) + else: + # number has a zero at bit bit_position + zeros.append(number) + + # recursively split both lists further + zeros = _msd_radix_sort(zeros, bit_position - 1) + ones = _msd_radix_sort(ones, bit_position - 1) + + # recombine lists + res = zeros + res.extend(ones) + + return res + + +def msd_radix_sort_inplace(list_of_ints: List[int]): + """ + Inplace implementation of the MSD radix sort algorithm. + Sorts based on the binary representation of the integers. + >>> lst = [1, 345, 23, 89, 0, 3] + >>> msd_radix_sort_inplace(lst) + >>> lst == sorted(lst) + True + >>> lst = [1, 43, 0, 0, 0, 24, 3, 3] + >>> msd_radix_sort_inplace(lst) + >>> lst == sorted(lst) + True + >>> lst = [] + >>> msd_radix_sort_inplace(lst) + >>> lst == [] + True + >>> lst = [-1, 34, 23, 4, -42] + >>> msd_radix_sort_inplace(lst) + Traceback (most recent call last): + ... + ValueError: All numbers must be positive + """ + + length = len(list_of_ints) + if not list_of_ints or length == 1: + return + + if min(list_of_ints) < 0: + raise ValueError("All numbers must be positive") + + most_bits = max(len(bin(x)[2:]) for x in list_of_ints) + _msd_radix_sort_inplace(list_of_ints, most_bits, 0, length) + + +def _msd_radix_sort_inplace( + list_of_ints: List[int], bit_position: int, begin_index: int, end_index: int +): + """ + Sort the given list based on the bit at bit_position. Numbers with a + 0 at that position will be at the start of the list, numbers with a + 1 at the end. + >>> lst = [45, 2, 32, 24, 534, 2932] + >>> _msd_radix_sort_inplace(lst, 1, 0, 3) + >>> lst == [32, 2, 45, 24, 534, 2932] + True + >>> lst = [0, 2, 1, 3, 12, 10, 4, 90, 54, 2323, 756] + >>> _msd_radix_sort_inplace(lst, 2, 4, 7) + >>> lst == [0, 2, 1, 3, 12, 4, 10, 90, 54, 2323, 756] + True + """ + if bit_position == 0 or end_index - begin_index <= 1: + return + + bit_position -= 1 + + i = begin_index + j = end_index - 1 + while i <= j: + changed = False + if not ((list_of_ints[i] >> bit_position) & 1): + # found zero at the beginning + i += 1 + changed = True + if (list_of_ints[j] >> bit_position) & 1: + # found one at the end + j -= 1 + changed = True + + if changed: + continue + + list_of_ints[i], list_of_ints[j] = list_of_ints[j], list_of_ints[i] + j -= 1 + if not j == i: + i += 1 + + _msd_radix_sort_inplace(list_of_ints, bit_position, begin_index, i) + _msd_radix_sort_inplace(list_of_ints, bit_position, i, end_index) + + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/sorts/natural_sort.py b/python-mega-algo/sorts/natural_sort.py new file mode 100644 index 00000000..001ff2cf --- /dev/null +++ b/python-mega-algo/sorts/natural_sort.py @@ -0,0 +1,36 @@ +from __future__ import annotations + +import re + + +def natural_sort(input_list: list[str]) -> list[str]: + """ + Sort the given list of strings in the way that humans expect. + + The normal Python sort algorithm sorts lexicographically, + so you might not get the results that you expect... + + >>> example1 = ['2 ft 7 in', '1 ft 5 in', '10 ft 2 in', '2 ft 11 in', '7 ft 6 in'] + >>> sorted(example1) + ['1 ft 5 in', '10 ft 2 in', '2 ft 11 in', '2 ft 7 in', '7 ft 6 in'] + >>> # The natural sort algorithm sort based on meaning and not computer code point. + >>> natural_sort(example1) + ['1 ft 5 in', '2 ft 7 in', '2 ft 11 in', '7 ft 6 in', '10 ft 2 in'] + + >>> example2 = ['Elm11', 'Elm12', 'Elm2', 'elm0', 'elm1', 'elm10', 'elm13', 'elm9'] + >>> sorted(example2) + ['Elm11', 'Elm12', 'Elm2', 'elm0', 'elm1', 'elm10', 'elm13', 'elm9'] + >>> natural_sort(example2) + ['elm0', 'elm1', 'Elm2', 'elm9', 'elm10', 'Elm11', 'Elm12', 'elm13'] + """ + + def alphanum_key(key): + return [int(s) if s.isdigit() else s.lower() for s in re.split("([0-9]+)", key)] + + return sorted(input_list, key=alphanum_key) + + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/sorts/normal_distribution_quick_sort.md b/python-mega-algo/sorts/normal_distribution_quick_sort.md new file mode 100644 index 00000000..2a9f77b3 --- /dev/null +++ b/python-mega-algo/sorts/normal_distribution_quick_sort.md @@ -0,0 +1,75 @@ +# Normal Distribution QuickSort + + +Algorithm implementing QuickSort Algorithm where the pivot element is chosen randomly between first and last elements of the array and the array elements are taken from a Standard Normal Distribution. +This is different from the ordinary quicksort in the sense, that it applies more to real life problems , where elements usually follow a normal distribution. Also the pivot is randomized to make it a more generic one. + + +## Array Elements + +The array elements are taken from a Standard Normal Distribution , having mean = 0 and standard deviation 1. + +#### The code + +```python + +>>> import numpy as np +>>> from tempfile import TemporaryFile +>>> outfile = TemporaryFile() +>>> p = 100 # 100 elements are to be sorted +>>> mu, sigma = 0, 1 # mean and standard deviation +>>> X = np.random.normal(mu, sigma, p) +>>> np.save(outfile, X) +>>> print('The array is') +>>> print(X) + +``` + +------ + +#### The Distribution of the Array elements. + +```python +>>> mu, sigma = 0, 1 # mean and standard deviation +>>> s = np.random.normal(mu, sigma, p) +>>> count, bins, ignored = plt.hist(s, 30, normed=True) +>>> plt.plot(bins , 1/(sigma * np.sqrt(2 * np.pi)) *np.exp( - (bins - mu)**2 / (2 * sigma**2) ),linewidth=2, color='r') +>>> plt.show() + +``` + + +----- + + + + +![](https://www.mathsisfun.com/data/images/normal-distrubution-large.gif) + +--- + +--------------------- + +-- + +## Plotting the function for Checking 'The Number of Comparisons' taking place between Normal Distribution QuickSort and Ordinary QuickSort + +```python +>>>import matplotlib.pyplot as plt + + + # Normal Disrtibution QuickSort is red +>>> plt.plot([1,2,4,16,32,64,128,256,512,1024,2048],[1,1,6,15,43,136,340,800,2156,6821,16325],linewidth=2, color='r') + + #Ordinary QuickSort is green +>>> plt.plot([1,2,4,16,32,64,128,256,512,1024,2048],[1,1,4,16,67,122,362,949,2131,5086,12866],linewidth=2, color='g') + +>>> plt.show() + +``` + + +---- + + +------------------ diff --git a/python-mega-algo/sorts/odd_even_sort.py b/python-mega-algo/sorts/odd_even_sort.py new file mode 100644 index 00000000..557337ee --- /dev/null +++ b/python-mega-algo/sorts/odd_even_sort.py @@ -0,0 +1,47 @@ +"""For reference +https://en.wikipedia.org/wiki/Odd%E2%80%93even_sort +""" + + +def odd_even_sort(input_list: list) -> list: + """this algorithm uses the same idea of bubblesort, + but by first dividing in two phase (odd and even). + Originally developed for use on parallel processors + with local interconnections. + :param collection: mutable ordered sequence of elements + :return: same collection in ascending order + Examples: + >>> odd_even_sort([5 , 4 ,3 ,2 ,1]) + [1, 2, 3, 4, 5] + >>> odd_even_sort([]) + [] + >>> odd_even_sort([-10 ,-1 ,10 ,2]) + [-10, -1, 2, 10] + >>> odd_even_sort([1 ,2 ,3 ,4]) + [1, 2, 3, 4] + """ + sorted = False + while sorted is False: # Until all the indices are traversed keep looping + sorted = True + for i in range(0, len(input_list) - 1, 2): # iterating over all even indices + if input_list[i] > input_list[i + 1]: + + input_list[i], input_list[i + 1] = input_list[i + 1], input_list[i] + # swapping if elements not in order + sorted = False + + for i in range(1, len(input_list) - 1, 2): # iterating over all odd indices + if input_list[i] > input_list[i + 1]: + input_list[i], input_list[i + 1] = input_list[i + 1], input_list[i] + # swapping if elements not in order + sorted = False + return input_list + + +if __name__ == "__main__": + print("Enter list to be sorted") + input_list = [int(x) for x in input().split()] + # inputing elements of the list in one line + sorted_list = odd_even_sort(input_list) + print("The sorted list is") + print(sorted_list) diff --git a/python-mega-algo/sorts/odd_even_transposition_parallel.py b/python-mega-algo/sorts/odd_even_transposition_parallel.py new file mode 100644 index 00000000..5de7a016 --- /dev/null +++ b/python-mega-algo/sorts/odd_even_transposition_parallel.py @@ -0,0 +1,144 @@ +""" +This is an implementation of odd-even transposition sort. + +It works by performing a series of parallel swaps between odd and even pairs of +variables in the list. + +This implementation represents each variable in the list with a process and +each process communicates with its neighboring processes in the list to perform +comparisons. +They are synchronized with locks and message passing but other forms of +synchronization could be used. +""" +from multiprocessing import Lock, Pipe, Process + +# lock used to ensure that two processes do not access a pipe at the same time +processLock = Lock() + +""" +The function run by the processes that sorts the list + +position = the position in the list the process represents, used to know which + neighbor we pass our value to +value = the initial value at list[position] +LSend, RSend = the pipes we use to send to our left and right neighbors +LRcv, RRcv = the pipes we use to receive from our left and right neighbors +resultPipe = the pipe used to send results back to main +""" + + +def oeProcess(position, value, LSend, RSend, LRcv, RRcv, resultPipe): + global processLock + + # we perform n swaps since after n swaps we know we are sorted + # we *could* stop early if we are sorted already, but it takes as long to + # find out we are sorted as it does to sort the list with this algorithm + for i in range(0, 10): + + if (i + position) % 2 == 0 and RSend is not None: + # send your value to your right neighbor + processLock.acquire() + RSend[1].send(value) + processLock.release() + + # receive your right neighbor's value + processLock.acquire() + temp = RRcv[0].recv() + processLock.release() + + # take the lower value since you are on the left + value = min(value, temp) + elif (i + position) % 2 != 0 and LSend is not None: + # send your value to your left neighbor + processLock.acquire() + LSend[1].send(value) + processLock.release() + + # receive your left neighbor's value + processLock.acquire() + temp = LRcv[0].recv() + processLock.release() + + # take the higher value since you are on the right + value = max(value, temp) + # after all swaps are performed, send the values back to main + resultPipe[1].send(value) + + +""" +the function which creates the processes that perform the parallel swaps + +arr = the list to be sorted +""" + + +def OddEvenTransposition(arr): + processArray = [] + resultPipe = [] + # initialize the list of pipes where the values will be retrieved + for _ in arr: + resultPipe.append(Pipe()) + # creates the processes + # the first and last process only have one neighbor so they are made outside + # of the loop + tempRs = Pipe() + tempRr = Pipe() + processArray.append( + Process( + target=oeProcess, + args=(0, arr[0], None, tempRs, None, tempRr, resultPipe[0]), + ) + ) + tempLr = tempRs + tempLs = tempRr + + for i in range(1, len(arr) - 1): + tempRs = Pipe() + tempRr = Pipe() + processArray.append( + Process( + target=oeProcess, + args=(i, arr[i], tempLs, tempRs, tempLr, tempRr, resultPipe[i]), + ) + ) + tempLr = tempRs + tempLs = tempRr + + processArray.append( + Process( + target=oeProcess, + args=( + len(arr) - 1, + arr[len(arr) - 1], + tempLs, + None, + tempLr, + None, + resultPipe[len(arr) - 1], + ), + ) + ) + + # start the processes + for p in processArray: + p.start() + + # wait for the processes to end and write their values to the list + for p in range(0, len(resultPipe)): + arr[p] = resultPipe[p][0].recv() + processArray[p].join() + return arr + + +# creates a reverse sorted list and sorts it +def main(): + arr = list(range(10, 0, -1)) + print("Initial List") + print(*arr) + arr = OddEvenTransposition(arr) + print("Sorted List\n") + print(*arr) + + +if __name__ == "__main__": + main() diff --git a/python-mega-algo/sorts/odd_even_transposition_single_threaded.py b/python-mega-algo/sorts/odd_even_transposition_single_threaded.py new file mode 100644 index 00000000..fe06459e --- /dev/null +++ b/python-mega-algo/sorts/odd_even_transposition_single_threaded.py @@ -0,0 +1,33 @@ +""" +Source: https://en.wikipedia.org/wiki/Odd%E2%80%93even_sort + +This is a non-parallelized implementation of odd-even transpostiion sort. + +Normally the swaps in each set happen simultaneously, without that the algorithm +is no better than bubble sort. +""" + + +def odd_even_transposition(arr: list) -> list: + """ + >>> odd_even_transposition([5, 4, 3, 2, 1]) + [1, 2, 3, 4, 5] + + >>> odd_even_transposition([13, 11, 18, 0, -1]) + [-1, 0, 11, 13, 18] + + >>> odd_even_transposition([-.1, 1.1, .1, -2.9]) + [-2.9, -0.1, 0.1, 1.1] + """ + arr_size = len(arr) + for _ in range(arr_size): + for i in range(_ % 2, arr_size - 1, 2): + if arr[i + 1] < arr[i]: + arr[i], arr[i + 1] = arr[i + 1], arr[i] + + return arr + + +if __name__ == "__main__": + arr = list(range(10, 0, -1)) + print(f"Original: {arr}. Sorted: {odd_even_transposition(arr)}") diff --git a/python-mega-algo/sorts/pancake_sort.py b/python-mega-algo/sorts/pancake_sort.py new file mode 100644 index 00000000..e5d60073 --- /dev/null +++ b/python-mega-algo/sorts/pancake_sort.py @@ -0,0 +1,39 @@ +""" +This is a pure Python implementation of the pancake sort algorithm +For doctests run following command: +python3 -m doctest -v pancake_sort.py +or +python -m doctest -v pancake_sort.py +For manual testing run: +python pancake_sort.py +""" + + +def pancake_sort(arr): + """Sort Array with Pancake Sort. + :param arr: Collection containing comparable items + :return: Collection ordered in ascending order of items + Examples: + >>> pancake_sort([0, 5, 3, 2, 2]) + [0, 2, 2, 3, 5] + >>> pancake_sort([]) + [] + >>> pancake_sort([-2, -5, -45]) + [-45, -5, -2] + """ + cur = len(arr) + while cur > 1: + # Find the maximum number in arr + mi = arr.index(max(arr[0:cur])) + # Reverse from 0 to mi + arr = arr[mi::-1] + arr[mi + 1 : len(arr)] + # Reverse whole list + arr = arr[cur - 1 :: -1] + arr[cur : len(arr)] + cur -= 1 + return arr + + +if __name__ == "__main__": + user_input = input("Enter numbers separated by a comma:\n").strip() + unsorted = [int(item) for item in user_input.split(",")] + print(pancake_sort(unsorted)) diff --git a/python-mega-algo/sorts/patience_sort.py b/python-mega-algo/sorts/patience_sort.py new file mode 100644 index 00000000..87f5a407 --- /dev/null +++ b/python-mega-algo/sorts/patience_sort.py @@ -0,0 +1,65 @@ +from bisect import bisect_left +from functools import total_ordering +from heapq import merge +from typing import List + +""" +A pure Python implementation of the patience sort algorithm + +For more information: https://en.wikipedia.org/wiki/Patience_sorting + +This algorithm is based on the card game patience + +For doctests run following command: +python3 -m doctest -v patience_sort.py + +For manual testing run: +python3 patience_sort.py +""" + + +@total_ordering +class Stack(list): + def __lt__(self, other): + return self[-1] < other[-1] + + def __eq__(self, other): + return self[-1] == other[-1] + + +def patience_sort(collection: list) -> list: + """A pure implementation of quick sort algorithm in Python + + :param collection: some mutable ordered collection with heterogeneous + comparable items inside + :return: the same collection ordered by ascending + + Examples: + >>> patience_sort([1, 9, 5, 21, 17, 6]) + [1, 5, 6, 9, 17, 21] + + >>> patience_sort([]) + [] + + >>> patience_sort([-3, -17, -48]) + [-48, -17, -3] + """ + stacks: List[Stack] = [] + # sort into stacks + for element in collection: + new_stacks = Stack([element]) + i = bisect_left(stacks, new_stacks) + if i != len(stacks): + stacks[i].append(element) + else: + stacks.append(new_stacks) + + # use a heap-based merge to merge stack efficiently + collection[:] = merge(*[reversed(stack) for stack in stacks]) + return collection + + +if __name__ == "__main__": + user_input = input("Enter numbers separated by a comma:\n").strip() + unsorted = [int(item) for item in user_input.split(",")] + print(patience_sort(unsorted)) diff --git a/python-mega-algo/sorts/pigeon_sort.py b/python-mega-algo/sorts/pigeon_sort.py new file mode 100644 index 00000000..3d81f064 --- /dev/null +++ b/python-mega-algo/sorts/pigeon_sort.py @@ -0,0 +1,60 @@ +""" + This is an implementation of Pigeon Hole Sort. + For doctests run following command: + + python3 -m doctest -v pigeon_sort.py + or + python -m doctest -v pigeon_sort.py + + For manual testing run: + python pigeon_sort.py +""" +from typing import List + + +def pigeon_sort(array: List[int]) -> List[int]: + """ + Implementation of pigeon hole sort algorithm + :param array: Collection of comparable items + :return: Collection sorted in ascending order + >>> pigeon_sort([0, 5, 3, 2, 2]) + [0, 2, 2, 3, 5] + >>> pigeon_sort([]) + [] + >>> pigeon_sort([-2, -5, -45]) + [-45, -5, -2] + """ + if len(array) == 0: + return array + + _min, _max = min(array), max(array) + + # Compute the variables + holes_range = _max - _min + 1 + holes, holes_repeat = [0] * holes_range, [0] * holes_range + + # Make the sorting. + for i in array: + index = i - _min + holes[index] = i + holes_repeat[index] += 1 + + # Makes the array back by replacing the numbers. + index = 0 + for i in range(holes_range): + while holes_repeat[i] > 0: + array[index] = holes[i] + index += 1 + holes_repeat[i] -= 1 + + # Returns the sorted array. + return array + + +if __name__ == "__main__": + import doctest + + doctest.testmod() + user_input = input("Enter numbers separated by comma:\n") + unsorted = [int(x) for x in user_input.split(",")] + print(pigeon_sort(unsorted)) diff --git a/python-mega-algo/sorts/pigeonhole_sort.py b/python-mega-algo/sorts/pigeonhole_sort.py new file mode 100644 index 00000000..bfa9bb11 --- /dev/null +++ b/python-mega-algo/sorts/pigeonhole_sort.py @@ -0,0 +1,45 @@ +# Python program to implement Pigeonhole Sorting in python + +# Algorithm for the pigeonhole sorting + + +def pigeonhole_sort(a): + """ + >>> a = [8, 3, 2, 7, 4, 6, 8] + >>> b = sorted(a) # a nondestructive sort + >>> pigeonhole_sort(a) # a destructive sort + >>> a == b + True + """ + # size of range of values in the list (ie, number of pigeonholes we need) + + min_val = min(a) # min() finds the minimum value + max_val = max(a) # max() finds the maximum value + + size = max_val - min_val + 1 # size is difference of max and min values plus one + + # list of pigeonholes of size equal to the variable size + holes = [0] * size + + # Populate the pigeonholes. + for x in a: + assert isinstance(x, int), "integers only please" + holes[x - min_val] += 1 + + # Putting the elements back into the array in an order. + i = 0 + for count in range(size): + while holes[count] > 0: + holes[count] -= 1 + a[i] = count + min_val + i += 1 + + +def main(): + a = [8, 3, 2, 7, 4, 6, 8] + pigeonhole_sort(a) + print("Sorted order is:", " ".join(a)) + + +if __name__ == "__main__": + main() diff --git a/python-mega-algo/sorts/quick_sort.py b/python-mega-algo/sorts/quick_sort.py new file mode 100644 index 00000000..6f51f6ec --- /dev/null +++ b/python-mega-algo/sorts/quick_sort.py @@ -0,0 +1,40 @@ +""" +A pure Python implementation of the quick sort algorithm + +For doctests run following command: +python3 -m doctest -v quick_sort.py + +For manual testing run: +python3 quick_sort.py +""" +from typing import List + + +def quick_sort(collection: list) -> list: + """A pure Python implementation of quick sort algorithm + + :param collection: a mutable collection of comparable items + :return: the same collection ordered by ascending + + Examples: + >>> quick_sort([0, 5, 3, 2, 2]) + [0, 2, 2, 3, 5] + >>> quick_sort([]) + [] + >>> quick_sort([-2, 5, 0, -45]) + [-45, -2, 0, 5] + """ + if len(collection) < 2: + return collection + pivot = collection.pop() # Use the last element as the first pivot + greater: List[int] = [] # All elements greater than pivot + lesser: List[int] = [] # All elements less than or equal to pivot + for element in collection: + (greater if element > pivot else lesser).append(element) + return quick_sort(lesser) + [pivot] + quick_sort(greater) + + +if __name__ == "__main__": + user_input = input("Enter numbers separated by a comma:\n").strip() + unsorted = [int(item) for item in user_input.split(",")] + print(quick_sort(unsorted)) diff --git a/python-mega-algo/sorts/quick_sort_3_partition.py b/python-mega-algo/sorts/quick_sort_3_partition.py new file mode 100644 index 00000000..1a6db6a3 --- /dev/null +++ b/python-mega-algo/sorts/quick_sort_3_partition.py @@ -0,0 +1,101 @@ +def quick_sort_3partition(sorting: list, left: int, right: int) -> None: + if right <= left: + return + a = i = left + b = right + pivot = sorting[left] + while i <= b: + if sorting[i] < pivot: + sorting[a], sorting[i] = sorting[i], sorting[a] + a += 1 + i += 1 + elif sorting[i] > pivot: + sorting[b], sorting[i] = sorting[i], sorting[b] + b -= 1 + else: + i += 1 + quick_sort_3partition(sorting, left, a - 1) + quick_sort_3partition(sorting, b + 1, right) + + +def quick_sort_lomuto_partition(sorting: list, left: int, right: int) -> None: + """ + A pure Python implementation of quick sort algorithm(in-place) + with Lomuto partition scheme: + https://en.wikipedia.org/wiki/Quicksort#Lomuto_partition_scheme + + :param sorting: sort list + :param left: left endpoint of sorting + :param right: right endpoint of sorting + :return: None + + Examples: + >>> nums1 = [0, 5, 3, 1, 2] + >>> quick_sort_lomuto_partition(nums1, 0, 4) + >>> nums1 + [0, 1, 2, 3, 5] + >>> nums2 = [] + >>> quick_sort_lomuto_partition(nums2, 0, 0) + >>> nums2 + [] + >>> nums3 = [-2, 5, 0, -4] + >>> quick_sort_lomuto_partition(nums3, 0, 3) + >>> nums3 + [-4, -2, 0, 5] + """ + if left < right: + pivot_index = lomuto_partition(sorting, left, right) + quick_sort_lomuto_partition(sorting, left, pivot_index - 1) + quick_sort_lomuto_partition(sorting, pivot_index + 1, right) + + +def lomuto_partition(sorting: list, left: int, right: int) -> int: + """ + Example: + >>> lomuto_partition([1,5,7,6], 0, 3) + 2 + """ + pivot = sorting[right] + store_index = left + for i in range(left, right): + if sorting[i] < pivot: + sorting[store_index], sorting[i] = sorting[i], sorting[store_index] + store_index += 1 + sorting[right], sorting[store_index] = sorting[store_index], sorting[right] + return store_index + + +def three_way_radix_quicksort(sorting: list) -> list: + """ + Three-way radix quicksort: + https://en.wikipedia.org/wiki/Quicksort#Three-way_radix_quicksort + First divide the list into three parts. + Then recursively sort the "less than" and "greater than" partitions. + + >>> three_way_radix_quicksort([]) + [] + >>> three_way_radix_quicksort([1]) + [1] + >>> three_way_radix_quicksort([-5, -2, 1, -2, 0, 1]) + [-5, -2, -2, 0, 1, 1] + >>> three_way_radix_quicksort([1, 2, 5, 1, 2, 0, 0, 5, 2, -1]) + [-1, 0, 0, 1, 1, 2, 2, 2, 5, 5] + """ + if len(sorting) <= 1: + return sorting + return ( + three_way_radix_quicksort([i for i in sorting if i < sorting[0]]) + + [i for i in sorting if i == sorting[0]] + + three_way_radix_quicksort([i for i in sorting if i > sorting[0]]) + ) + + +if __name__ == "__main__": + import doctest + + doctest.testmod(verbose=True) + + user_input = input("Enter numbers separated by a comma:\n").strip() + unsorted = [int(item) for item in user_input.split(",")] + quick_sort_3partition(unsorted, 0, len(unsorted) - 1) + print(unsorted) diff --git a/python-mega-algo/sorts/radix_sort.py b/python-mega-algo/sorts/radix_sort.py new file mode 100644 index 00000000..b802b527 --- /dev/null +++ b/python-mega-algo/sorts/radix_sort.py @@ -0,0 +1,52 @@ +""" +This is a pure Python implementation of the quick sort algorithm +For doctests run following command: +python -m doctest -v radix_sort.py +or +python3 -m doctest -v radix_sort.py +For manual testing run: +python radix_sort.py +""" +from __future__ import annotations + +from typing import List + + +def radix_sort(list_of_ints: List[int]) -> List[int]: + """ + Examples: + >>> radix_sort([0, 5, 3, 2, 2]) + [0, 2, 2, 3, 5] + + >>> radix_sort(list(range(15))) == sorted(range(15)) + True + >>> radix_sort(list(range(14,-1,-1))) == sorted(range(15)) + True + >>> radix_sort([1,100,10,1000]) == sorted([1,100,10,1000]) + True + """ + RADIX = 10 + placement = 1 + max_digit = max(list_of_ints) + while placement <= max_digit: + # declare and initialize empty buckets + buckets: List[list] = [list() for _ in range(RADIX)] + # split list_of_ints between the buckets + for i in list_of_ints: + tmp = int((i / placement) % RADIX) + buckets[tmp].append(i) + # put each buckets' contents into list_of_ints + a = 0 + for b in range(RADIX): + for i in buckets[b]: + list_of_ints[a] = i + a += 1 + # move to next + placement *= RADIX + return list_of_ints + + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/sorts/random_normal_distribution_quicksort.py b/python-mega-algo/sorts/random_normal_distribution_quicksort.py new file mode 100644 index 00000000..73eb70be --- /dev/null +++ b/python-mega-algo/sorts/random_normal_distribution_quicksort.py @@ -0,0 +1,64 @@ +from random import randint +from tempfile import TemporaryFile + +import numpy as np + + +def _inPlaceQuickSort(A, start, end): + count = 0 + if start < end: + pivot = randint(start, end) + temp = A[end] + A[end] = A[pivot] + A[pivot] = temp + + p, count = _inPlacePartition(A, start, end) + count += _inPlaceQuickSort(A, start, p - 1) + count += _inPlaceQuickSort(A, p + 1, end) + return count + + +def _inPlacePartition(A, start, end): + + count = 0 + pivot = randint(start, end) + temp = A[end] + A[end] = A[pivot] + A[pivot] = temp + newPivotIndex = start - 1 + for index in range(start, end): + + count += 1 + if A[index] < A[end]: # check if current val is less than pivot value + newPivotIndex = newPivotIndex + 1 + temp = A[newPivotIndex] + A[newPivotIndex] = A[index] + A[index] = temp + + temp = A[newPivotIndex + 1] + A[newPivotIndex + 1] = A[end] + A[end] = temp + return newPivotIndex + 1, count + + +outfile = TemporaryFile() +p = 100 # 1000 elements are to be sorted + + +mu, sigma = 0, 1 # mean and standard deviation +X = np.random.normal(mu, sigma, p) +np.save(outfile, X) +print("The array is") +print(X) + + +outfile.seek(0) # using the same array +M = np.load(outfile) +r = len(M) - 1 +z = _inPlaceQuickSort(M, 0, r) + +print( + "No of Comparisons for 100 elements selected from a standard normal distribution" + "is :" +) +print(z) diff --git a/python-mega-algo/sorts/random_pivot_quick_sort.py b/python-mega-algo/sorts/random_pivot_quick_sort.py new file mode 100644 index 00000000..57c8d25e --- /dev/null +++ b/python-mega-algo/sorts/random_pivot_quick_sort.py @@ -0,0 +1,44 @@ +""" +Picks the random index as the pivot +""" +import random + + +def partition(A, left_index, right_index): + pivot = A[left_index] + i = left_index + 1 + for j in range(left_index + 1, right_index): + if A[j] < pivot: + A[j], A[i] = A[i], A[j] + i += 1 + A[left_index], A[i - 1] = A[i - 1], A[left_index] + return i - 1 + + +def quick_sort_random(A, left, right): + if left < right: + pivot = random.randint(left, right - 1) + A[pivot], A[left] = ( + A[left], + A[pivot], + ) # switches the pivot with the left most bound + pivot_index = partition(A, left, right) + quick_sort_random( + A, left, pivot_index + ) # recursive quicksort to the left of the pivot point + quick_sort_random( + A, pivot_index + 1, right + ) # recursive quicksort to the right of the pivot point + + +def main(): + user_input = input("Enter numbers separated by a comma:\n").strip() + arr = [int(item) for item in user_input.split(",")] + + quick_sort_random(arr, 0, len(arr)) + + print(arr) + + +if __name__ == "__main__": + main() diff --git a/python-mega-algo/sorts/recursive_bubble_sort.py b/python-mega-algo/sorts/recursive_bubble_sort.py new file mode 100644 index 00000000..3bbe94b8 --- /dev/null +++ b/python-mega-algo/sorts/recursive_bubble_sort.py @@ -0,0 +1,42 @@ +def bubble_sort(list_data: list, length: int = 0) -> list: + """ + It is similar is bubble sort but recursive. + :param list_data: mutable ordered sequence of elements + :param length: length of list data + :return: the same list in ascending order + + >>> bubble_sort([0, 5, 2, 3, 2], 5) + [0, 2, 2, 3, 5] + + >>> bubble_sort([], 0) + [] + + >>> bubble_sort([-2, -45, -5], 3) + [-45, -5, -2] + + >>> bubble_sort([-23, 0, 6, -4, 34], 5) + [-23, -4, 0, 6, 34] + + >>> bubble_sort([-23, 0, 6, -4, 34], 5) == sorted([-23, 0, 6, -4, 34]) + True + + >>> bubble_sort(['z','a','y','b','x','c'], 6) + ['a', 'b', 'c', 'x', 'y', 'z'] + + >>> bubble_sort([1.1, 3.3, 5.5, 7.7, 2.2, 4.4, 6.6]) + [1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7] + """ + length = length or len(list_data) + swapped = False + for i in range(length - 1): + if list_data[i] > list_data[i + 1]: + list_data[i], list_data[i + 1] = list_data[i + 1], list_data[i] + swapped = True + + return list_data if not swapped else bubble_sort(list_data, length - 1) + + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/sorts/recursive_insertion_sort.py b/python-mega-algo/sorts/recursive_insertion_sort.py new file mode 100644 index 00000000..89f88b4a --- /dev/null +++ b/python-mega-algo/sorts/recursive_insertion_sort.py @@ -0,0 +1,77 @@ +""" +A recursive implementation of the insertion sort algorithm +""" + +from __future__ import annotations + +from typing import List + + +def rec_insertion_sort(collection: list, n: int): + """ + Given a collection of numbers and its length, sorts the collections + in ascending order + + :param collection: A mutable collection of comparable elements + :param n: The length of collections + + >>> col = [1, 2, 1] + >>> rec_insertion_sort(col, len(col)) + >>> print(col) + [1, 1, 2] + + >>> col = [2, 1, 0, -1, -2] + >>> rec_insertion_sort(col, len(col)) + >>> print(col) + [-2, -1, 0, 1, 2] + + >>> col = [1] + >>> rec_insertion_sort(col, len(col)) + >>> print(col) + [1] + """ + # Checks if the entire collection has been sorted + if len(collection) <= 1 or n <= 1: + return + + insert_next(collection, n - 1) + rec_insertion_sort(collection, n - 1) + + +def insert_next(collection: list, index: int): + """ + Inserts the '(index-1)th' element into place + + >>> col = [3, 2, 4, 2] + >>> insert_next(col, 1) + >>> print(col) + [2, 3, 4, 2] + + >>> col = [3, 2, 3] + >>> insert_next(col, 2) + >>> print(col) + [3, 2, 3] + + >>> col = [] + >>> insert_next(col, 1) + >>> print(col) + [] + """ + # Checks order between adjacent elements + if index >= len(collection) or collection[index - 1] <= collection[index]: + return + + # Swaps adjacent elements since they are not in ascending order + collection[index - 1], collection[index] = ( + collection[index], + collection[index - 1], + ) + + insert_next(collection, index + 1) + + +if __name__ == "__main__": + numbers = input("Enter integers separated by spaces: ") + number_list: List[int] = [int(num) for num in numbers.split()] + rec_insertion_sort(number_list, len(number_list)) + print(number_list) diff --git a/python-mega-algo/sorts/recursive_mergesort_array.py b/python-mega-algo/sorts/recursive_mergesort_array.py new file mode 100644 index 00000000..f714d023 --- /dev/null +++ b/python-mega-algo/sorts/recursive_mergesort_array.py @@ -0,0 +1,64 @@ +"""A merge sort which accepts an array as input and recursively +splits an array in half and sorts and combines them. +""" + +"""https://en.wikipedia.org/wiki/Merge_sort """ + + +def merge(arr: list[int]) -> list[int]: + """Return a sorted array. + >>> merge([10,9,8,7,6,5,4,3,2,1]) + [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] + >>> merge([1,2,3,4,5,6,7,8,9,10]) + [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] + >>> merge([10,22,1,2,3,9,15,23]) + [1, 2, 3, 9, 10, 15, 22, 23] + >>> merge([100]) + [100] + >>> merge([]) + [] + """ + if len(arr) > 1: + middle_length = len(arr) // 2 # Finds the middle of the array + left_array = arr[ + :middle_length + ] # Creates an array of the elements in the first half. + right_array = arr[ + middle_length: + ] # Creates an array of the elements in the second half. + left_size = len(left_array) + right_size = len(right_array) + merge(left_array) # Starts sorting the left. + merge(right_array) # Starts sorting the right + left_index = 0 # Left Counter + right_index = 0 # Right Counter + index = 0 # Position Counter + while ( + left_index < left_size and right_index < right_size + ): # Runs until the lowers size of the left and right are sorted. + if left_array[left_index] < right_array[right_index]: + arr[index] = left_array[left_index] + left_index = left_index + 1 + else: + arr[index] = right_array[right_index] + right_index = right_index + 1 + index = index + 1 + while ( + left_index < left_size + ): # Adds the left over elements in the left half of the array + arr[index] = left_array[left_index] + left_index = left_index + 1 + index = index + 1 + while ( + right_index < right_size + ): # Adds the left over elements in the right half of the array + arr[index] = right_array[right_index] + right_index = right_index + 1 + index = index + 1 + return arr + + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/sorts/recursive_quick_sort.py b/python-mega-algo/sorts/recursive_quick_sort.py new file mode 100644 index 00000000..c28a14e3 --- /dev/null +++ b/python-mega-algo/sorts/recursive_quick_sort.py @@ -0,0 +1,22 @@ +def quick_sort(data: list) -> list: + """ + >>> for data in ([2, 1, 0], [2.2, 1.1, 0], "quick_sort"): + ... quick_sort(data) == sorted(data) + True + True + True + """ + if len(data) <= 1: + return data + else: + return ( + quick_sort([e for e in data[1:] if e <= data[0]]) + + [data[0]] + + quick_sort([e for e in data[1:] if e > data[0]]) + ) + + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/sorts/right.html b/python-mega-algo/sorts/right.html new file mode 100644 index 00000000..a7ce9b8e --- /dev/null +++ b/python-mega-algo/sorts/right.html @@ -0,0 +1,40 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/sorts + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + + + + + + + + + + + + +
    FileFileFileFile
    normal_di...ort.md gnome_sort.py pancake_sort.py recursive...ort.py 
    bead_sort.py heap_sort.py patience_sort.py selection_sort.py 
    bitonic_sort.py insertion_sort.py pigeonhole_sort.py shell_sort.py 
    bogo_sort.py intro_sort.py pigeon_sort.py slowsort.py 
    bubble_sort.py iterative...ort.py quick_sort.py stooge_sort.py 
    bucket_sort.py merge_ins...ort.py quick_sor...ion.py strand_sort.py 
    cocktail_...ort.py merge_sort.py radix_sort.py tim_sort.py 
    comb_sort.py msd_radix_sort.py random_no...ort.py topologic...ort.py 
    counting_sort.py natural_sort.py random_pi...ort.py tree_sort.py 
    cycle_sort.py odd_even_sort.py recursive...ort.py unknown_sort.py 
    double_sort.py odd_even_...lel.py recursive...ort.py wiggle_sort.py 
    external_sort.py odd_even_...ded.py recursive...ray.py __init__.py 
    + +

    +Folders: 1
    +Files: 48
    +Size of all files: 87527 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/sorts/selection_sort.py b/python-mega-algo/sorts/selection_sort.py new file mode 100644 index 00000000..f3beb31b --- /dev/null +++ b/python-mega-algo/sorts/selection_sort.py @@ -0,0 +1,46 @@ +""" +This is a pure Python implementation of the selection sort algorithm + +For doctests run following command: +python -m doctest -v selection_sort.py +or +python3 -m doctest -v selection_sort.py + +For manual testing run: +python selection_sort.py +""" + + +def selection_sort(collection): + """Pure implementation of the selection sort algorithm in Python + :param collection: some mutable ordered collection with heterogeneous + comparable items inside + :return: the same collection ordered by ascending + + + Examples: + >>> selection_sort([0, 5, 3, 2, 2]) + [0, 2, 2, 3, 5] + + >>> selection_sort([]) + [] + + >>> selection_sort([-2, -5, -45]) + [-45, -5, -2] + """ + + length = len(collection) + for i in range(length - 1): + least = i + for k in range(i + 1, length): + if collection[k] < collection[least]: + least = k + if least != i: + collection[least], collection[i] = (collection[i], collection[least]) + return collection + + +if __name__ == "__main__": + user_input = input("Enter numbers separated by a comma:\n").strip() + unsorted = [int(item) for item in user_input.split(",")] + print(selection_sort(unsorted)) diff --git a/python-mega-algo/sorts/shell_sort.py b/python-mega-algo/sorts/shell_sort.py new file mode 100644 index 00000000..10ae9ba4 --- /dev/null +++ b/python-mega-algo/sorts/shell_sort.py @@ -0,0 +1,40 @@ +""" +https://en.wikipedia.org/wiki/Shellsort#Pseudocode +""" + + +def shell_sort(collection): + """Pure implementation of shell sort algorithm in Python + :param collection: Some mutable ordered collection with heterogeneous + comparable items inside + :return: the same collection ordered by ascending + + >>> shell_sort([0, 5, 3, 2, 2]) + [0, 2, 2, 3, 5] + >>> shell_sort([]) + [] + >>> shell_sort([-2, -5, -45]) + [-45, -5, -2] + """ + # Marcin Ciura's gap sequence + + gaps = [701, 301, 132, 57, 23, 10, 4, 1] + for gap in gaps: + for i in range(gap, len(collection)): + insert_value = collection[i] + j = i + while j >= gap and collection[j - gap] > insert_value: + collection[j] = collection[j - gap] + j -= gap + if j != i: + collection[j] = insert_value + return collection + + +if __name__ == "__main__": + from doctest import testmod + + testmod() + user_input = input("Enter numbers separated by a comma:\n").strip() + unsorted = [int(item) for item in user_input.split(",")] + print(shell_sort(unsorted)) diff --git a/python-mega-algo/sorts/slowsort.py b/python-mega-algo/sorts/slowsort.py new file mode 100644 index 00000000..53bb1455 --- /dev/null +++ b/python-mega-algo/sorts/slowsort.py @@ -0,0 +1,63 @@ +""" +Slowsort is a sorting algorithm. It is of humorous nature and not useful. +It's based on the principle of multiply and surrender, +a tongue-in-cheek joke of divide and conquer. +It was published in 1986 by Andrei Broder and Jorge Stolfi +in their paper Pessimal Algorithms and Simplexity Analysis +(a parody of optimal algorithms and complexity analysis). + +Source: https://en.wikipedia.org/wiki/Slowsort +""" + +from typing import Optional + + +def slowsort( + sequence: list, start: Optional[int] = None, end: Optional[int] = None +) -> None: + """ + Sorts sequence[start..end] (both inclusive) in-place. + start defaults to 0 if not given. + end defaults to len(sequence) - 1 if not given. + It returns None. + >>> seq = [1, 6, 2, 5, 3, 4, 4, 5]; slowsort(seq); seq + [1, 2, 3, 4, 4, 5, 5, 6] + >>> seq = []; slowsort(seq); seq + [] + >>> seq = [2]; slowsort(seq); seq + [2] + >>> seq = [1, 2, 3, 4]; slowsort(seq); seq + [1, 2, 3, 4] + >>> seq = [4, 3, 2, 1]; slowsort(seq); seq + [1, 2, 3, 4] + >>> seq = [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]; slowsort(seq, 2, 7); seq + [9, 8, 2, 3, 4, 5, 6, 7, 1, 0] + >>> seq = [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]; slowsort(seq, end = 4); seq + [5, 6, 7, 8, 9, 4, 3, 2, 1, 0] + >>> seq = [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]; slowsort(seq, start = 5); seq + [9, 8, 7, 6, 5, 0, 1, 2, 3, 4] + """ + if start is None: + start = 0 + + if end is None: + end = len(sequence) - 1 + + if start >= end: + return + + mid = (start + end) // 2 + + slowsort(sequence, start, mid) + slowsort(sequence, mid + 1, end) + + if sequence[end] < sequence[mid]: + sequence[end], sequence[mid] = sequence[mid], sequence[end] + + slowsort(sequence, start, end - 1) + + +if __name__ == "__main__": + from doctest import testmod + + testmod() diff --git a/python-mega-algo/sorts/stooge_sort.py b/python-mega-algo/sorts/stooge_sort.py new file mode 100644 index 00000000..da70347c --- /dev/null +++ b/python-mega-algo/sorts/stooge_sort.py @@ -0,0 +1,40 @@ +def stooge_sort(arr): + """ + Examples: + >>> stooge_sort([18.1, 0, -7.1, -1, 2, 2]) + [-7.1, -1, 0, 2, 2, 18.1] + + >>> stooge_sort([]) + [] + """ + stooge(arr, 0, len(arr) - 1) + return arr + + +def stooge(arr, i, h): + + if i >= h: + return + + # If first element is smaller than the last then swap them + if arr[i] > arr[h]: + arr[i], arr[h] = arr[h], arr[i] + + # If there are more than 2 elements in the array + if h - i + 1 > 2: + t = (int)((h - i + 1) / 3) + + # Recursively sort first 2/3 elements + stooge(arr, i, (h - t)) + + # Recursively sort last 2/3 elements + stooge(arr, i + t, (h)) + + # Recursively sort first 2/3 elements + stooge(arr, i, (h - t)) + + +if __name__ == "__main__": + user_input = input("Enter numbers separated by a comma:\n").strip() + unsorted = [int(item) for item in user_input.split(",")] + print(stooge_sort(unsorted)) diff --git a/python-mega-algo/sorts/strand_sort.py b/python-mega-algo/sorts/strand_sort.py new file mode 100644 index 00000000..a89135a0 --- /dev/null +++ b/python-mega-algo/sorts/strand_sort.py @@ -0,0 +1,51 @@ +import operator + + +def strand_sort(arr: list, reverse: bool = False, solution: list = None) -> list: + """ + Strand sort implementation + source: https://en.wikipedia.org/wiki/Strand_sort + + :param arr: Unordered input list + :param reverse: Descent ordering flag + :param solution: Ordered items container + + Examples: + >>> strand_sort([4, 2, 5, 3, 0, 1]) + [0, 1, 2, 3, 4, 5] + + >>> strand_sort([4, 2, 5, 3, 0, 1], reverse=True) + [5, 4, 3, 2, 1, 0] + """ + _operator = operator.lt if reverse else operator.gt + solution = solution or [] + + if not arr: + return solution + + sublist = [arr.pop(0)] + for i, item in enumerate(arr): + if _operator(item, sublist[-1]): + sublist.append(item) + arr.pop(i) + + # merging sublist into solution list + if not solution: + solution.extend(sublist) + else: + while sublist: + item = sublist.pop(0) + for i, xx in enumerate(solution): + if not _operator(item, xx): + solution.insert(i, item) + break + else: + solution.append(item) + + strand_sort(arr, reverse, solution) + return solution + + +if __name__ == "__main__": + assert strand_sort([4, 3, 5, 1, 2]) == [1, 2, 3, 4, 5] + assert strand_sort([4, 3, 5, 1, 2], reverse=True) == [5, 4, 3, 2, 1] diff --git a/python-mega-algo/sorts/tim_sort.py b/python-mega-algo/sorts/tim_sort.py new file mode 100644 index 00000000..b95ff34c --- /dev/null +++ b/python-mega-algo/sorts/tim_sort.py @@ -0,0 +1,83 @@ +def binary_search(lst, item, start, end): + if start == end: + return start if lst[start] > item else start + 1 + if start > end: + return start + + mid = (start + end) // 2 + if lst[mid] < item: + return binary_search(lst, item, mid + 1, end) + elif lst[mid] > item: + return binary_search(lst, item, start, mid - 1) + else: + return mid + + +def insertion_sort(lst): + length = len(lst) + + for index in range(1, length): + value = lst[index] + pos = binary_search(lst, value, 0, index - 1) + lst = lst[:pos] + [value] + lst[pos:index] + lst[index + 1 :] + + return lst + + +def merge(left, right): + if not left: + return right + + if not right: + return left + + if left[0] < right[0]: + return [left[0]] + merge(left[1:], right) + + return [right[0]] + merge(left, right[1:]) + + +def tim_sort(lst): + """ + >>> tim_sort("Python") + ['P', 'h', 'n', 'o', 't', 'y'] + >>> tim_sort((1.1, 1, 0, -1, -1.1)) + [-1.1, -1, 0, 1, 1.1] + >>> tim_sort(list(reversed(list(range(7))))) + [0, 1, 2, 3, 4, 5, 6] + >>> tim_sort([3, 2, 1]) == insertion_sort([3, 2, 1]) + True + >>> tim_sort([3, 2, 1]) == sorted([3, 2, 1]) + True + """ + length = len(lst) + runs, sorted_runs = [], [] + new_run = [lst[0]] + sorted_array = [] + i = 1 + while i < length: + if lst[i] < lst[i - 1]: + runs.append(new_run) + new_run = [lst[i]] + else: + new_run.append(lst[i]) + i += 1 + runs.append(new_run) + + for run in runs: + sorted_runs.append(insertion_sort(run)) + for run in sorted_runs: + sorted_array = merge(sorted_array, run) + + return sorted_array + + +def main(): + + lst = [5, 9, 10, 3, -4, 5, 178, 92, 46, -18, 0, 7] + sorted_lst = tim_sort(lst) + print(sorted_lst) + + +if __name__ == "__main__": + main() diff --git a/python-mega-algo/sorts/topological_sort.py b/python-mega-algo/sorts/topological_sort.py new file mode 100644 index 00000000..e7a52f7c --- /dev/null +++ b/python-mega-algo/sorts/topological_sort.py @@ -0,0 +1,35 @@ +"""Topological Sort.""" + +# a +# / \ +# b c +# / \ +# d e +edges = {"a": ["c", "b"], "b": ["d", "e"], "c": [], "d": [], "e": []} +vertices = ["a", "b", "c", "d", "e"] + + +def topological_sort(start, visited, sort): + """Perform topolical sort on a directed acyclic graph.""" + current = start + # add current to visited + visited.append(current) + neighbors = edges[current] + for neighbor in neighbors: + # if neighbor not in visited, visit + if neighbor not in visited: + sort = topological_sort(neighbor, visited, sort) + # if all neighbors visited add current to sort + sort.append(current) + # if all vertices haven't been visited select a new one to visit + if len(visited) != len(vertices): + for vertice in vertices: + if vertice not in visited: + sort = topological_sort(vertice, visited, sort) + # return sort + return sort + + +if __name__ == "__main__": + sort = topological_sort("a", [], []) + print(sort) diff --git a/python-mega-algo/sorts/tree_sort.py b/python-mega-algo/sorts/tree_sort.py new file mode 100644 index 00000000..e445fb45 --- /dev/null +++ b/python-mega-algo/sorts/tree_sort.py @@ -0,0 +1,53 @@ +""" +Tree_sort algorithm. + +Build a BST and in order traverse. +""" + + +class node: + # BST data structure + def __init__(self, val): + self.val = val + self.left = None + self.right = None + + def insert(self, val): + if self.val: + if val < self.val: + if self.left is None: + self.left = node(val) + else: + self.left.insert(val) + elif val > self.val: + if self.right is None: + self.right = node(val) + else: + self.right.insert(val) + else: + self.val = val + + +def inorder(root, res): + # Recursive traversal + if root: + inorder(root.left, res) + res.append(root.val) + inorder(root.right, res) + + +def tree_sort(arr): + # Build BST + if len(arr) == 0: + return arr + root = node(arr[0]) + for i in range(1, len(arr)): + root.insert(arr[i]) + # Traverse BST in order. + res = [] + inorder(root, res) + return res + + +if __name__ == "__main__": + print(tree_sort([10, 1, 3, 2, 9, 14, 13])) diff --git a/python-mega-algo/sorts/unknown_sort.py b/python-mega-algo/sorts/unknown_sort.py new file mode 100644 index 00000000..9fa9d22f --- /dev/null +++ b/python-mega-algo/sorts/unknown_sort.py @@ -0,0 +1,40 @@ +""" +Python implementation of a sort algorithm. +Best Case Scenario : O(n) +Worst Case Scenario : O(n^2) because native Python functions:min, max and remove are +already O(n) +""" + + +def merge_sort(collection): + """Pure implementation of the fastest merge sort algorithm in Python + + :param collection: some mutable ordered collection with heterogeneous + comparable items inside + :return: a collection ordered by ascending + + Examples: + >>> merge_sort([0, 5, 3, 2, 2]) + [0, 2, 2, 3, 5] + + >>> merge_sort([]) + [] + + >>> merge_sort([-2, -5, -45]) + [-45, -5, -2] + """ + start, end = [], [] + while len(collection) > 1: + min_one, max_one = min(collection), max(collection) + start.append(min_one) + end.append(max_one) + collection.remove(min_one) + collection.remove(max_one) + end.reverse() + return start + collection + end + + +if __name__ == "__main__": + user_input = input("Enter numbers separated by a comma:\n").strip() + unsorted = [int(item) for item in user_input.split(",")] + print(*merge_sort(unsorted), sep=",") diff --git a/python-mega-algo/sorts/wiggle_sort.py b/python-mega-algo/sorts/wiggle_sort.py new file mode 100644 index 00000000..13bc3ce9 --- /dev/null +++ b/python-mega-algo/sorts/wiggle_sort.py @@ -0,0 +1,38 @@ +""" +Wiggle Sort. + +Given an unsorted array nums, reorder it such +that nums[0] < nums[1] > nums[2] < nums[3].... +For example: +if input numbers = [3, 5, 2, 1, 6, 4] +one possible Wiggle Sorted answer is [3, 5, 1, 6, 2, 4]. +""" + + +def wiggle_sort(nums: list) -> list: + """ + Python implementation of wiggle. + Example: + >>> wiggle_sort([0, 5, 3, 2, 2]) + [0, 5, 2, 3, 2] + >>> wiggle_sort([]) + [] + >>> wiggle_sort([-2, -5, -45]) + [-45, -2, -5] + >>> wiggle_sort([-2.1, -5.68, -45.11]) + [-45.11, -2.1, -5.68] + """ + for i, _ in enumerate(nums): + if (i % 2 == 1) == (nums[i - 1] > nums[i]): + nums[i - 1], nums[i] = nums[i], nums[i - 1] + + return nums + + +if __name__ == "__main__": + print("Enter the array elements:") + array = list(map(int, input().split())) + print("The unsorted array is:") + print(array) + print("Array after Wiggle sort:") + print(wiggle_sort(array)) diff --git a/python-mega-algo/strings/__init__.py b/python-mega-algo/strings/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/strings/aho_corasick.py b/python-mega-algo/strings/aho_corasick.py new file mode 100644 index 00000000..b959dbd5 --- /dev/null +++ b/python-mega-algo/strings/aho_corasick.py @@ -0,0 +1,93 @@ +from collections import deque +from typing import Dict, List, Union + + +class Automaton: + def __init__(self, keywords: List[str]): + self.adlist = list() + self.adlist.append( + {"value": "", "next_states": [], "fail_state": 0, "output": []} + ) + + for keyword in keywords: + self.add_keyword(keyword) + self.set_fail_transitions() + + def find_next_state(self, current_state: int, char: str) -> Union[int, None]: + for state in self.adlist[current_state]["next_states"]: + if char == self.adlist[state]["value"]: + return state + return None + + def add_keyword(self, keyword: str) -> None: + current_state = 0 + for character in keyword: + if self.find_next_state(current_state, character): + current_state = self.find_next_state(current_state, character) + else: + self.adlist.append( + { + "value": character, + "next_states": [], + "fail_state": 0, + "output": [], + } + ) + self.adlist[current_state]["next_states"].append(len(self.adlist) - 1) + current_state = len(self.adlist) - 1 + self.adlist[current_state]["output"].append(keyword) + + def set_fail_transitions(self) -> None: + q = deque() + for node in self.adlist[0]["next_states"]: + q.append(node) + self.adlist[node]["fail_state"] = 0 + while q: + r = q.popleft() + for child in self.adlist[r]["next_states"]: + q.append(child) + state = self.adlist[r]["fail_state"] + while ( + self.find_next_state(state, self.adlist[child]["value"]) is None + and state != 0 + ): + state = self.adlist[state]["fail_state"] + self.adlist[child]["fail_state"] = self.find_next_state( + state, self.adlist[child]["value"] + ) + if self.adlist[child]["fail_state"] is None: + self.adlist[child]["fail_state"] = 0 + self.adlist[child]["output"] = ( + self.adlist[child]["output"] + + self.adlist[self.adlist[child]["fail_state"]]["output"] + ) + + def search_in(self, string: str) -> Dict[str, List[int]]: + """ + >>> A = Automaton(["what", "hat", "ver", "er"]) + >>> A.search_in("whatever, err ... , wherever") + {'what': [0], 'hat': [1], 'ver': [5, 25], 'er': [6, 10, 22, 26]} + """ + result = dict() # returns a dict with keywords and list of its occurrences + current_state = 0 + for i in range(len(string)): + while ( + self.find_next_state(current_state, string[i]) is None + and current_state != 0 + ): + current_state = self.adlist[current_state]["fail_state"] + current_state = self.find_next_state(current_state, string[i]) + if current_state is None: + current_state = 0 + else: + for key in self.adlist[current_state]["output"]: + if not (key in result): + result[key] = [] + result[key].append(i - len(key) + 1) + return result + + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/strings/anagrams.py b/python-mega-algo/strings/anagrams.py new file mode 100644 index 00000000..1a7c675d --- /dev/null +++ b/python-mega-algo/strings/anagrams.py @@ -0,0 +1,35 @@ +import collections +import os +import pprint +import time + +start_time = time.time() +print("creating word list...") +path = os.path.split(os.path.realpath(__file__)) +with open(path[0] + "/words.txt") as f: + word_list = sorted(list({word.strip().lower() for word in f})) + + +def signature(word): + return "".join(sorted(word)) + + +word_bysig = collections.defaultdict(list) +for word in word_list: + word_bysig[signature(word)].append(word) + + +def anagram(my_word): + return word_bysig[signature(my_word)] + + +print("finding anagrams...") +all_anagrams = {word: anagram(word) for word in word_list if len(anagram(word)) > 1} + +print("writing anagrams to file...") +with open("anagrams.txt", "w") as file: + file.write("all_anagrams = ") + file.write(pprint.pformat(all_anagrams)) + +total_time = round(time.time() - start_time, 2) +print(("Done [", total_time, "seconds ]")) diff --git a/python-mega-algo/strings/autocomplete_using_trie.py b/python-mega-algo/strings/autocomplete_using_trie.py new file mode 100644 index 00000000..8aa0dc22 --- /dev/null +++ b/python-mega-algo/strings/autocomplete_using_trie.py @@ -0,0 +1,64 @@ +END = "#" + + +class Trie: + def __init__(self): + self._trie = {} + + def insert_word(self, text): + trie = self._trie + for char in text: + if char not in trie: + trie[char] = {} + trie = trie[char] + trie[END] = True + + def find_word(self, prefix): + trie = self._trie + for char in prefix: + if char in trie: + trie = trie[char] + else: + return [] + return self._elements(trie) + + def _elements(self, d): + result = [] + for c, v in d.items(): + if c == END: + sub_result = [" "] + else: + sub_result = [c + s for s in self._elements(v)] + result.extend(sub_result) + return tuple(result) + + +trie = Trie() +words = ("depart", "detergent", "daring", "dog", "deer", "deal") +for word in words: + trie.insert_word(word) + + +def autocomplete_using_trie(s): + """ + >>> trie = Trie() + >>> for word in words: + ... trie.insert_word(word) + ... + >>> matches = autocomplete_using_trie("de") + + "detergent " in matches + True + "dog " in matches + False + """ + suffixes = trie.find_word(s) + return tuple(s + w for w in suffixes) + + +def main(): + print(autocomplete_using_trie("de")) + + +if __name__ == "__main__": + main() diff --git a/python-mega-algo/strings/boyer_moore_search.py b/python-mega-algo/strings/boyer_moore_search.py new file mode 100644 index 00000000..a3e6cf61 --- /dev/null +++ b/python-mega-algo/strings/boyer_moore_search.py @@ -0,0 +1,86 @@ +""" +The algorithm finds the pattern in given text using following rule. + +The bad-character rule considers the mismatched character in Text. +The next occurrence of that character to the left in Pattern is found, + +If the mismatched character occurs to the left in Pattern, +a shift is proposed that aligns text block and pattern. + +If the mismatched character does not occur to the left in Pattern, +a shift is proposed that moves the entirety of Pattern past +the point of mismatch in the text. + +If there no mismatch then the pattern matches with text block. + +Time Complexity : O(n/m) + n=length of main string + m=length of pattern string +""" +from typing import List + + +class BoyerMooreSearch: + def __init__(self, text: str, pattern: str): + self.text, self.pattern = text, pattern + self.textLen, self.patLen = len(text), len(pattern) + + def match_in_pattern(self, char: str) -> int: + """finds the index of char in pattern in reverse order + + Parameters : + char (chr): character to be searched + + Returns : + i (int): index of char from last in pattern + -1 (int): if char is not found in pattern + """ + + for i in range(self.patLen - 1, -1, -1): + if char == self.pattern[i]: + return i + return -1 + + def mismatch_in_text(self, currentPos: int) -> int: + """ + find the index of mis-matched character in text when compared with pattern + from last + + Parameters : + currentPos (int): current index position of text + + Returns : + i (int): index of mismatched char from last in text + -1 (int): if there is no mismatch between pattern and text block + """ + + for i in range(self.patLen - 1, -1, -1): + if self.pattern[i] != self.text[currentPos + i]: + return currentPos + i + return -1 + + def bad_character_heuristic(self) -> List[int]: + # searches pattern in text and returns index positions + positions = [] + for i in range(self.textLen - self.patLen + 1): + mismatch_index = self.mismatch_in_text(i) + if mismatch_index == -1: + positions.append(i) + else: + match_index = self.match_in_pattern(self.text[mismatch_index]) + i = ( + mismatch_index - match_index + ) # shifting index lgtm [py/multiple-definition] + return positions + + +text = "ABAABA" +pattern = "AB" +bms = BoyerMooreSearch(text, pattern) +positions = bms.bad_character_heuristic() + +if len(positions) == 0: + print("No match found") +else: + print("Pattern found in following positions: ") + print(positions) diff --git a/python-mega-algo/strings/can_string_be_rearranged_as_palindrome.py b/python-mega-algo/strings/can_string_be_rearranged_as_palindrome.py new file mode 100644 index 00000000..7fedc587 --- /dev/null +++ b/python-mega-algo/strings/can_string_be_rearranged_as_palindrome.py @@ -0,0 +1,115 @@ +# Created by susmith98 + +from collections import Counter +from timeit import timeit + +# Problem Description: +# Check if characters of the given string can be rearranged to form a palindrome. +# Counter is faster for long strings and non-Counter is faster for short strings. + + +def can_string_be_rearranged_as_palindrome_counter( + input_str: str = "", +) -> bool: + """ + A Palindrome is a String that reads the same forward as it does backwards. + Examples of Palindromes mom, dad, malayalam + >>> can_string_be_rearranged_as_palindrome_counter("Momo") + True + >>> can_string_be_rearranged_as_palindrome_counter("Mother") + False + >>> can_string_be_rearranged_as_palindrome_counter("Father") + False + >>> can_string_be_rearranged_as_palindrome_counter("A man a plan a canal Panama") + True + """ + return sum(c % 2 for c in Counter(input_str.replace(" ", "").lower()).values()) < 2 + + +def can_string_be_rearranged_as_palindrome(input_str: str = "") -> bool: + """ + A Palindrome is a String that reads the same forward as it does backwards. + Examples of Palindromes mom, dad, malayalam + >>> can_string_be_rearranged_as_palindrome("Momo") + True + >>> can_string_be_rearranged_as_palindrome("Mother") + False + >>> can_string_be_rearranged_as_palindrome("Father") + False + >>> can_string_be_rearranged_as_palindrome_counter("A man a plan a canal Panama") + True + """ + if len(input_str) == 0: + return True + lower_case_input_str = input_str.replace(" ", "").lower() + # character_freq_dict: Stores the frequency of every character in the input string + character_freq_dict = {} + + for character in lower_case_input_str: + character_freq_dict[character] = character_freq_dict.get(character, 0) + 1 + """ + Above line of code is equivalent to: + 1) Getting the frequency of current character till previous index + >>> character_freq = character_freq_dict.get(character, 0) + 2) Incrementing the frequency of current character by 1 + >>> character_freq = character_freq + 1 + 3) Updating the frequency of current character + >>> character_freq_dict[character] = character_freq + """ + """ + OBSERVATIONS: + Even length palindrome + -> Every character appears even no.of times. + Odd length palindrome + -> Every character appears even no.of times except for one character. + LOGIC: + Step 1: We'll count number of characters that appear odd number of times i.e oddChar + Step 2:If we find more than 1 character that appears odd number of times, + It is not possible to rearrange as a palindrome + """ + oddChar = 0 + + for character_count in character_freq_dict.values(): + if character_count % 2: + oddChar += 1 + if oddChar > 1: + return False + return True + + +def benchmark(input_str: str = "") -> None: + """ + Benchmark code for comparing above 2 functions + """ + print("\nFor string = ", input_str, ":") + print( + "> can_string_be_rearranged_as_palindrome_counter()", + "\tans =", + can_string_be_rearranged_as_palindrome_counter(input_str), + "\ttime =", + timeit( + "z.can_string_be_rearranged_as_palindrome_counter(z.check_str)", + setup="import __main__ as z", + ), + "seconds", + ) + print( + "> can_string_be_rearranged_as_palindrome()", + "\tans =", + can_string_be_rearranged_as_palindrome(input_str), + "\ttime =", + timeit( + "z.can_string_be_rearranged_as_palindrome(z.check_str)", + setup="import __main__ as z", + ), + "seconds", + ) + + +if __name__ == "__main__": + check_str = input( + "Enter string to determine if it can be rearranged as a palindrome or not: " + ).strip() + benchmark(check_str) + status = can_string_be_rearranged_as_palindrome_counter(check_str) + print(f"{check_str} can {'' if status else 'not '}be rearranged as a palindrome") diff --git a/python-mega-algo/strings/capitalize.py b/python-mega-algo/strings/capitalize.py new file mode 100644 index 00000000..63603aa0 --- /dev/null +++ b/python-mega-algo/strings/capitalize.py @@ -0,0 +1,27 @@ +from string import ascii_lowercase, ascii_uppercase + + +def capitalize(sentence: str) -> str: + """ + This function will capitalize the first letter of a sentence or a word + >>> capitalize("hello world") + 'Hello world' + >>> capitalize("123 hello world") + '123 hello world' + >>> capitalize(" hello world") + ' hello world' + >>> capitalize("a") + 'A' + >>> capitalize("") + '' + """ + if not sentence: + return "" + lower_to_upper = {lc: uc for lc, uc in zip(ascii_lowercase, ascii_uppercase)} + return lower_to_upper.get(sentence[0], sentence[0]) + sentence[1:] + + +if __name__ == "__main__": + from doctest import testmod + + testmod() diff --git a/python-mega-algo/strings/check_anagrams.py b/python-mega-algo/strings/check_anagrams.py new file mode 100644 index 00000000..91222508 --- /dev/null +++ b/python-mega-algo/strings/check_anagrams.py @@ -0,0 +1,33 @@ +""" +wiki: https://en.wikipedia.org/wiki/Anagram +""" + + +def check_anagrams(first_str: str, second_str: str) -> bool: + """ + Two strings are anagrams if they are made of the same letters + arranged differently (ignoring the case). + >>> check_anagrams('Silent', 'Listen') + True + >>> check_anagrams('This is a string', 'Is this a string') + True + >>> check_anagrams('This is a string', 'Is this a string') + True + >>> check_anagrams('There', 'Their') + False + """ + return ( + "".join(sorted(first_str.lower())).strip() + == "".join(sorted(second_str.lower())).strip() + ) + + +if __name__ == "__main__": + from doctest import testmod + + testmod() + input_A = input("Enter the first string ").strip() + input_B = input("Enter the second string ").strip() + + status = check_anagrams(input_A, input_B) + print(f"{input_A} and {input_B} are {'' if status else 'not '}anagrams.") diff --git a/python-mega-algo/strings/check_pangram.py b/python-mega-algo/strings/check_pangram.py new file mode 100644 index 00000000..81384bfd --- /dev/null +++ b/python-mega-algo/strings/check_pangram.py @@ -0,0 +1,74 @@ +""" +wiki: https://en.wikipedia.org/wiki/Pangram +""" + + +def check_pangram( + input_str: str = "The quick brown fox jumps over the lazy dog", +) -> bool: + """ + A Pangram String contains all the alphabets at least once. + >>> check_pangram("The quick brown fox jumps over the lazy dog") + True + >>> check_pangram("Waltz, bad nymph, for quick jigs vex.") + True + >>> check_pangram("Jived fox nymph grabs quick waltz.") + True + >>> check_pangram("My name is Unknown") + False + >>> check_pangram("The quick brown fox jumps over the la_y dog") + False + >>> check_pangram() + True + """ + frequency = set() + input_str = input_str.replace( + " ", "" + ) # Replacing all the Whitespaces in our sentence + for alpha in input_str: + if "a" <= alpha.lower() <= "z": + frequency.add(alpha.lower()) + + return True if len(frequency) == 26 else False + + +def check_pangram_faster( + input_str: str = "The quick brown fox jumps over the lazy dog", +) -> bool: + """ + >>> check_pangram_faster("The quick brown fox jumps over the lazy dog") + True + >>> check_pangram_faster("Waltz, bad nymph, for quick jigs vex.") + True + >>> check_pangram_faster("Jived fox nymph grabs quick waltz.") + True + >>> check_pangram_faster("The quick brown fox jumps over the la_y dog") + False + >>> check_pangram_faster() + True + """ + flag = [False] * 26 + for char in input_str: + if char.islower(): + flag[ord(char) - 97] = True + elif char.isupper(): + flag[ord(char) - 65] = True + return all(flag) + + +def benchmark() -> None: + """ + Benchmark code comparing different version. + """ + from timeit import timeit + + setup = "from __main__ import check_pangram, check_pangram_faster" + print(timeit("check_pangram()", setup=setup)) + print(timeit("check_pangram_faster()", setup=setup)) + + +if __name__ == "__main__": + import doctest + + doctest.testmod() + benchmark() diff --git a/python-mega-algo/strings/detecting_english_programmatically.py b/python-mega-algo/strings/detecting_english_programmatically.py new file mode 100644 index 00000000..44fb7191 --- /dev/null +++ b/python-mega-algo/strings/detecting_english_programmatically.py @@ -0,0 +1,61 @@ +import os + +UPPERLETTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" +LETTERS_AND_SPACE = UPPERLETTERS + UPPERLETTERS.lower() + " \t\n" + + +def loadDictionary(): + path = os.path.split(os.path.realpath(__file__)) + englishWords = {} + with open(path[0] + "/dictionary.txt") as dictionaryFile: + for word in dictionaryFile.read().split("\n"): + englishWords[word] = None + return englishWords + + +ENGLISH_WORDS = loadDictionary() + + +def getEnglishCount(message): + message = message.upper() + message = removeNonLetters(message) + possibleWords = message.split() + + if possibleWords == []: + return 0.0 + + matches = 0 + for word in possibleWords: + if word in ENGLISH_WORDS: + matches += 1 + + return float(matches) / len(possibleWords) + + +def removeNonLetters(message): + lettersOnly = [] + for symbol in message: + if symbol in LETTERS_AND_SPACE: + lettersOnly.append(symbol) + return "".join(lettersOnly) + + +def isEnglish(message, wordPercentage=20, letterPercentage=85): + """ + >>> isEnglish('Hello World') + True + + >>> isEnglish('llold HorWd') + False + """ + wordsMatch = getEnglishCount(message) * 100 >= wordPercentage + numLetters = len(removeNonLetters(message)) + messageLettersPercentage = (float(numLetters) / len(message)) * 100 + lettersMatch = messageLettersPercentage >= letterPercentage + return wordsMatch and lettersMatch + + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/strings/dictionary.txt b/python-mega-algo/strings/dictionary.txt new file mode 100644 index 00000000..75838996 --- /dev/null +++ b/python-mega-algo/strings/dictionary.txt @@ -0,0 +1,45334 @@ +AARHUS +AARON +ABABA +ABACK +ABAFT +ABANDON +ABANDONED +ABANDONING +ABANDONMENT +ABANDONS +ABASE +ABASED +ABASEMENT +ABASEMENTS +ABASES +ABASH +ABASHED +ABASHES +ABASHING +ABASING +ABATE +ABATED +ABATEMENT +ABATEMENTS +ABATER +ABATES +ABATING +ABBA +ABBE +ABBEY +ABBEYS +ABBOT +ABBOTS +ABBOTT +ABBREVIATE +ABBREVIATED +ABBREVIATES +ABBREVIATING +ABBREVIATION +ABBREVIATIONS +ABBY +ABDOMEN +ABDOMENS +ABDOMINAL +ABDUCT +ABDUCTED +ABDUCTION +ABDUCTIONS +ABDUCTOR +ABDUCTORS +ABDUCTS +ABE +ABED +ABEL +ABELIAN +ABELSON +ABERDEEN +ABERNATHY +ABERRANT +ABERRATION +ABERRATIONS +ABET +ABETS +ABETTED +ABETTER +ABETTING +ABEYANCE +ABHOR +ABHORRED +ABHORRENT +ABHORRER +ABHORRING +ABHORS +ABIDE +ABIDED +ABIDES +ABIDING +ABIDJAN +ABIGAIL +ABILENE +ABILITIES +ABILITY +ABJECT +ABJECTION +ABJECTIONS +ABJECTLY +ABJECTNESS +ABJURE +ABJURED +ABJURES +ABJURING +ABLATE +ABLATED +ABLATES +ABLATING +ABLATION +ABLATIVE +ABLAZE +ABLE +ABLER +ABLEST +ABLY +ABNER +ABNORMAL +ABNORMALITIES +ABNORMALITY +ABNORMALLY +ABO +ABOARD +ABODE +ABODES +ABOLISH +ABOLISHED +ABOLISHER +ABOLISHERS +ABOLISHES +ABOLISHING +ABOLISHMENT +ABOLISHMENTS +ABOLITION +ABOLITIONIST +ABOLITIONISTS +ABOMINABLE +ABOMINATE +ABORIGINAL +ABORIGINE +ABORIGINES +ABORT +ABORTED +ABORTING +ABORTION +ABORTIONS +ABORTIVE +ABORTIVELY +ABORTS +ABOS +ABOUND +ABOUNDED +ABOUNDING +ABOUNDS +ABOUT +ABOVE +ABOVEBOARD +ABOVEGROUND +ABOVEMENTIONED +ABRADE +ABRADED +ABRADES +ABRADING +ABRAHAM +ABRAM +ABRAMS +ABRAMSON +ABRASION +ABRASIONS +ABRASIVE +ABREACTION +ABREACTIONS +ABREAST +ABRIDGE +ABRIDGED +ABRIDGES +ABRIDGING +ABRIDGMENT +ABROAD +ABROGATE +ABROGATED +ABROGATES +ABROGATING +ABRUPT +ABRUPTLY +ABRUPTNESS +ABSCESS +ABSCESSED +ABSCESSES +ABSCISSA +ABSCISSAS +ABSCOND +ABSCONDED +ABSCONDING +ABSCONDS +ABSENCE +ABSENCES +ABSENT +ABSENTED +ABSENTEE +ABSENTEEISM +ABSENTEES +ABSENTIA +ABSENTING +ABSENTLY +ABSENTMINDED +ABSENTS +ABSINTHE +ABSOLUTE +ABSOLUTELY +ABSOLUTENESS +ABSOLUTES +ABSOLUTION +ABSOLVE +ABSOLVED +ABSOLVES +ABSOLVING +ABSORB +ABSORBED +ABSORBENCY +ABSORBENT +ABSORBER +ABSORBING +ABSORBS +ABSORPTION +ABSORPTIONS +ABSORPTIVE +ABSTAIN +ABSTAINED +ABSTAINER +ABSTAINING +ABSTAINS +ABSTENTION +ABSTENTIONS +ABSTINENCE +ABSTRACT +ABSTRACTED +ABSTRACTING +ABSTRACTION +ABSTRACTIONISM +ABSTRACTIONIST +ABSTRACTIONS +ABSTRACTLY +ABSTRACTNESS +ABSTRACTOR +ABSTRACTORS +ABSTRACTS +ABSTRUSE +ABSTRUSENESS +ABSURD +ABSURDITIES +ABSURDITY +ABSURDLY +ABU +ABUNDANCE +ABUNDANT +ABUNDANTLY +ABUSE +ABUSED +ABUSES +ABUSING +ABUSIVE +ABUT +ABUTMENT +ABUTS +ABUTTED +ABUTTER +ABUTTERS +ABUTTING +ABYSMAL +ABYSMALLY +ABYSS +ABYSSES +ABYSSINIA +ABYSSINIAN +ABYSSINIANS +ACACIA +ACADEMIA +ACADEMIC +ACADEMICALLY +ACADEMICS +ACADEMIES +ACADEMY +ACADIA +ACAPULCO +ACCEDE +ACCEDED +ACCEDES +ACCELERATE +ACCELERATED +ACCELERATES +ACCELERATING +ACCELERATION +ACCELERATIONS +ACCELERATOR +ACCELERATORS +ACCELEROMETER +ACCELEROMETERS +ACCENT +ACCENTED +ACCENTING +ACCENTS +ACCENTUAL +ACCENTUATE +ACCENTUATED +ACCENTUATES +ACCENTUATING +ACCENTUATION +ACCEPT +ACCEPTABILITY +ACCEPTABLE +ACCEPTABLY +ACCEPTANCE +ACCEPTANCES +ACCEPTED +ACCEPTER +ACCEPTERS +ACCEPTING +ACCEPTOR +ACCEPTORS +ACCEPTS +ACCESS +ACCESSED +ACCESSES +ACCESSIBILITY +ACCESSIBLE +ACCESSIBLY +ACCESSING +ACCESSION +ACCESSIONS +ACCESSORIES +ACCESSORS +ACCESSORY +ACCIDENT +ACCIDENTAL +ACCIDENTALLY +ACCIDENTLY +ACCIDENTS +ACCLAIM +ACCLAIMED +ACCLAIMING +ACCLAIMS +ACCLAMATION +ACCLIMATE +ACCLIMATED +ACCLIMATES +ACCLIMATING +ACCLIMATIZATION +ACCLIMATIZED +ACCOLADE +ACCOLADES +ACCOMMODATE +ACCOMMODATED +ACCOMMODATES +ACCOMMODATING +ACCOMMODATION +ACCOMMODATIONS +ACCOMPANIED +ACCOMPANIES +ACCOMPANIMENT +ACCOMPANIMENTS +ACCOMPANIST +ACCOMPANISTS +ACCOMPANY +ACCOMPANYING +ACCOMPLICE +ACCOMPLICES +ACCOMPLISH +ACCOMPLISHED +ACCOMPLISHER +ACCOMPLISHERS +ACCOMPLISHES +ACCOMPLISHING +ACCOMPLISHMENT +ACCOMPLISHMENTS +ACCORD +ACCORDANCE +ACCORDED +ACCORDER +ACCORDERS +ACCORDING +ACCORDINGLY +ACCORDION +ACCORDIONS +ACCORDS +ACCOST +ACCOSTED +ACCOSTING +ACCOSTS +ACCOUNT +ACCOUNTABILITY +ACCOUNTABLE +ACCOUNTABLY +ACCOUNTANCY +ACCOUNTANT +ACCOUNTANTS +ACCOUNTED +ACCOUNTING +ACCOUNTS +ACCRA +ACCREDIT +ACCREDITATION +ACCREDITATIONS +ACCREDITED +ACCRETION +ACCRETIONS +ACCRUE +ACCRUED +ACCRUES +ACCRUING +ACCULTURATE +ACCULTURATED +ACCULTURATES +ACCULTURATING +ACCULTURATION +ACCUMULATE +ACCUMULATED +ACCUMULATES +ACCUMULATING +ACCUMULATION +ACCUMULATIONS +ACCUMULATOR +ACCUMULATORS +ACCURACIES +ACCURACY +ACCURATE +ACCURATELY +ACCURATENESS +ACCURSED +ACCUSAL +ACCUSATION +ACCUSATIONS +ACCUSATIVE +ACCUSE +ACCUSED +ACCUSER +ACCUSES +ACCUSING +ACCUSINGLY +ACCUSTOM +ACCUSTOMED +ACCUSTOMING +ACCUSTOMS +ACE +ACES +ACETATE +ACETONE +ACETYLENE +ACHAEAN +ACHAEANS +ACHE +ACHED +ACHES +ACHIEVABLE +ACHIEVE +ACHIEVED +ACHIEVEMENT +ACHIEVEMENTS +ACHIEVER +ACHIEVERS +ACHIEVES +ACHIEVING +ACHILLES +ACHING +ACID +ACIDIC +ACIDITIES +ACIDITY +ACIDLY +ACIDS +ACIDULOUS +ACKERMAN +ACKLEY +ACKNOWLEDGE +ACKNOWLEDGEABLE +ACKNOWLEDGED +ACKNOWLEDGEMENT +ACKNOWLEDGEMENTS +ACKNOWLEDGER +ACKNOWLEDGERS +ACKNOWLEDGES +ACKNOWLEDGING +ACKNOWLEDGMENT +ACKNOWLEDGMENTS +ACME +ACNE +ACOLYTE +ACOLYTES +ACORN +ACORNS +ACOUSTIC +ACOUSTICAL +ACOUSTICALLY +ACOUSTICIAN +ACOUSTICS +ACQUAINT +ACQUAINTANCE +ACQUAINTANCES +ACQUAINTED +ACQUAINTING +ACQUAINTS +ACQUIESCE +ACQUIESCED +ACQUIESCENCE +ACQUIESCENT +ACQUIESCES +ACQUIESCING +ACQUIRABLE +ACQUIRE +ACQUIRED +ACQUIRES +ACQUIRING +ACQUISITION +ACQUISITIONS +ACQUISITIVE +ACQUISITIVENESS +ACQUIT +ACQUITS +ACQUITTAL +ACQUITTED +ACQUITTER +ACQUITTING +ACRE +ACREAGE +ACRES +ACRID +ACRIMONIOUS +ACRIMONY +ACROBAT +ACROBATIC +ACROBATICS +ACROBATS +ACRONYM +ACRONYMS +ACROPOLIS +ACROSS +ACRYLIC +ACT +ACTA +ACTAEON +ACTED +ACTING +ACTINIUM +ACTINOMETER +ACTINOMETERS +ACTION +ACTIONS +ACTIVATE +ACTIVATED +ACTIVATES +ACTIVATING +ACTIVATION +ACTIVATIONS +ACTIVATOR +ACTIVATORS +ACTIVE +ACTIVELY +ACTIVISM +ACTIVIST +ACTIVISTS +ACTIVITIES +ACTIVITY +ACTON +ACTOR +ACTORS +ACTRESS +ACTRESSES +ACTS +ACTUAL +ACTUALITIES +ACTUALITY +ACTUALIZATION +ACTUALLY +ACTUALS +ACTUARIAL +ACTUARIALLY +ACTUATE +ACTUATED +ACTUATES +ACTUATING +ACTUATOR +ACTUATORS +ACUITY +ACUMEN +ACUTE +ACUTELY +ACUTENESS +ACYCLIC +ACYCLICALLY +ADA +ADAGE +ADAGES +ADAGIO +ADAGIOS +ADAIR +ADAM +ADAMANT +ADAMANTLY +ADAMS +ADAMSON +ADAPT +ADAPTABILITY +ADAPTABLE +ADAPTATION +ADAPTATIONS +ADAPTED +ADAPTER +ADAPTERS +ADAPTING +ADAPTIVE +ADAPTIVELY +ADAPTOR +ADAPTORS +ADAPTS +ADD +ADDED +ADDEND +ADDENDA +ADDENDUM +ADDER +ADDERS +ADDICT +ADDICTED +ADDICTING +ADDICTION +ADDICTIONS +ADDICTS +ADDING +ADDIS +ADDISON +ADDITION +ADDITIONAL +ADDITIONALLY +ADDITIONS +ADDITIVE +ADDITIVES +ADDITIVITY +ADDRESS +ADDRESSABILITY +ADDRESSABLE +ADDRESSED +ADDRESSEE +ADDRESSEES +ADDRESSER +ADDRESSERS +ADDRESSES +ADDRESSING +ADDRESSOGRAPH +ADDS +ADDUCE +ADDUCED +ADDUCES +ADDUCIBLE +ADDUCING +ADDUCT +ADDUCTED +ADDUCTING +ADDUCTION +ADDUCTOR +ADDUCTS +ADELAIDE +ADELE +ADELIA +ADEN +ADEPT +ADEQUACIES +ADEQUACY +ADEQUATE +ADEQUATELY +ADHERE +ADHERED +ADHERENCE +ADHERENT +ADHERENTS +ADHERER +ADHERERS +ADHERES +ADHERING +ADHESION +ADHESIONS +ADHESIVE +ADHESIVES +ADIABATIC +ADIABATICALLY +ADIEU +ADIRONDACK +ADIRONDACKS +ADJACENCY +ADJACENT +ADJECTIVE +ADJECTIVES +ADJOIN +ADJOINED +ADJOINING +ADJOINS +ADJOURN +ADJOURNED +ADJOURNING +ADJOURNMENT +ADJOURNS +ADJUDGE +ADJUDGED +ADJUDGES +ADJUDGING +ADJUDICATE +ADJUDICATED +ADJUDICATES +ADJUDICATING +ADJUDICATION +ADJUDICATIONS +ADJUNCT +ADJUNCTS +ADJURE +ADJURED +ADJURES +ADJURING +ADJUST +ADJUSTABLE +ADJUSTABLY +ADJUSTED +ADJUSTER +ADJUSTERS +ADJUSTING +ADJUSTMENT +ADJUSTMENTS +ADJUSTOR +ADJUSTORS +ADJUSTS +ADJUTANT +ADJUTANTS +ADKINS +ADLER +ADLERIAN +ADMINISTER +ADMINISTERED +ADMINISTERING +ADMINISTERINGS +ADMINISTERS +ADMINISTRABLE +ADMINISTRATE +ADMINISTRATION +ADMINISTRATIONS +ADMINISTRATIVE +ADMINISTRATIVELY +ADMINISTRATOR +ADMINISTRATORS +ADMIRABLE +ADMIRABLY +ADMIRAL +ADMIRALS +ADMIRALTY +ADMIRATION +ADMIRATIONS +ADMIRE +ADMIRED +ADMIRER +ADMIRERS +ADMIRES +ADMIRING +ADMIRINGLY +ADMISSIBILITY +ADMISSIBLE +ADMISSION +ADMISSIONS +ADMIT +ADMITS +ADMITTANCE +ADMITTED +ADMITTEDLY +ADMITTER +ADMITTERS +ADMITTING +ADMIX +ADMIXED +ADMIXES +ADMIXTURE +ADMONISH +ADMONISHED +ADMONISHES +ADMONISHING +ADMONISHMENT +ADMONISHMENTS +ADMONITION +ADMONITIONS +ADO +ADOBE +ADOLESCENCE +ADOLESCENT +ADOLESCENTS +ADOLPH +ADOLPHUS +ADONIS +ADOPT +ADOPTED +ADOPTER +ADOPTERS +ADOPTING +ADOPTION +ADOPTIONS +ADOPTIVE +ADOPTS +ADORABLE +ADORATION +ADORE +ADORED +ADORES +ADORN +ADORNED +ADORNMENT +ADORNMENTS +ADORNS +ADRENAL +ADRENALINE +ADRIAN +ADRIATIC +ADRIENNE +ADRIFT +ADROIT +ADROITNESS +ADS +ADSORB +ADSORBED +ADSORBING +ADSORBS +ADSORPTION +ADULATE +ADULATING +ADULATION +ADULT +ADULTERATE +ADULTERATED +ADULTERATES +ADULTERATING +ADULTERER +ADULTERERS +ADULTEROUS +ADULTEROUSLY +ADULTERY +ADULTHOOD +ADULTS +ADUMBRATE +ADUMBRATED +ADUMBRATES +ADUMBRATING +ADUMBRATION +ADVANCE +ADVANCED +ADVANCEMENT +ADVANCEMENTS +ADVANCES +ADVANCING +ADVANTAGE +ADVANTAGED +ADVANTAGEOUS +ADVANTAGEOUSLY +ADVANTAGES +ADVENT +ADVENTIST +ADVENTISTS +ADVENTITIOUS +ADVENTURE +ADVENTURED +ADVENTURER +ADVENTURERS +ADVENTURES +ADVENTURING +ADVENTUROUS +ADVERB +ADVERBIAL +ADVERBS +ADVERSARIES +ADVERSARY +ADVERSE +ADVERSELY +ADVERSITIES +ADVERSITY +ADVERT +ADVERTISE +ADVERTISED +ADVERTISEMENT +ADVERTISEMENTS +ADVERTISER +ADVERTISERS +ADVERTISES +ADVERTISING +ADVICE +ADVISABILITY +ADVISABLE +ADVISABLY +ADVISE +ADVISED +ADVISEDLY +ADVISEE +ADVISEES +ADVISEMENT +ADVISEMENTS +ADVISER +ADVISERS +ADVISES +ADVISING +ADVISOR +ADVISORS +ADVISORY +ADVOCACY +ADVOCATE +ADVOCATED +ADVOCATES +ADVOCATING +AEGEAN +AEGIS +AENEAS +AENEID +AEOLUS +AERATE +AERATED +AERATES +AERATING +AERATION +AERATOR +AERATORS +AERIAL +AERIALS +AEROACOUSTIC +AEROBACTER +AEROBIC +AEROBICS +AERODYNAMIC +AERODYNAMICS +AERONAUTIC +AERONAUTICAL +AERONAUTICS +AEROSOL +AEROSOLIZE +AEROSOLS +AEROSPACE +AESCHYLUS +AESOP +AESTHETIC +AESTHETICALLY +AESTHETICS +AFAR +AFFABLE +AFFAIR +AFFAIRS +AFFECT +AFFECTATION +AFFECTATIONS +AFFECTED +AFFECTING +AFFECTINGLY +AFFECTION +AFFECTIONATE +AFFECTIONATELY +AFFECTIONS +AFFECTIVE +AFFECTS +AFFERENT +AFFIANCED +AFFIDAVIT +AFFIDAVITS +AFFILIATE +AFFILIATED +AFFILIATES +AFFILIATING +AFFILIATION +AFFILIATIONS +AFFINITIES +AFFINITY +AFFIRM +AFFIRMATION +AFFIRMATIONS +AFFIRMATIVE +AFFIRMATIVELY +AFFIRMED +AFFIRMING +AFFIRMS +AFFIX +AFFIXED +AFFIXES +AFFIXING +AFFLICT +AFFLICTED +AFFLICTING +AFFLICTION +AFFLICTIONS +AFFLICTIVE +AFFLICTS +AFFLUENCE +AFFLUENT +AFFORD +AFFORDABLE +AFFORDED +AFFORDING +AFFORDS +AFFRICATE +AFFRICATES +AFFRIGHT +AFFRONT +AFFRONTED +AFFRONTING +AFFRONTS +AFGHAN +AFGHANISTAN +AFGHANS +AFICIONADO +AFIELD +AFIRE +AFLAME +AFLOAT +AFOOT +AFORE +AFOREMENTIONED +AFORESAID +AFORETHOUGHT +AFOUL +AFRAID +AFRESH +AFRICA +AFRICAN +AFRICANIZATION +AFRICANIZATIONS +AFRICANIZE +AFRICANIZED +AFRICANIZES +AFRICANIZING +AFRICANS +AFRIKAANS +AFRIKANER +AFRIKANERS +AFT +AFTER +AFTEREFFECT +AFTERGLOW +AFTERIMAGE +AFTERLIFE +AFTERMATH +AFTERMOST +AFTERNOON +AFTERNOONS +AFTERSHOCK +AFTERSHOCKS +AFTERTHOUGHT +AFTERTHOUGHTS +AFTERWARD +AFTERWARDS +AGAIN +AGAINST +AGAMEMNON +AGAPE +AGAR +AGATE +AGATES +AGATHA +AGE +AGED +AGEE +AGELESS +AGENCIES +AGENCY +AGENDA +AGENDAS +AGENT +AGENTS +AGER +AGERS +AGES +AGGIE +AGGIES +AGGLOMERATE +AGGLOMERATED +AGGLOMERATES +AGGLOMERATION +AGGLUTINATE +AGGLUTINATED +AGGLUTINATES +AGGLUTINATING +AGGLUTINATION +AGGLUTININ +AGGLUTININS +AGGRANDIZE +AGGRAVATE +AGGRAVATED +AGGRAVATES +AGGRAVATION +AGGREGATE +AGGREGATED +AGGREGATELY +AGGREGATES +AGGREGATING +AGGREGATION +AGGREGATIONS +AGGRESSION +AGGRESSIONS +AGGRESSIVE +AGGRESSIVELY +AGGRESSIVENESS +AGGRESSOR +AGGRESSORS +AGGRIEVE +AGGRIEVED +AGGRIEVES +AGGRIEVING +AGHAST +AGILE +AGILELY +AGILITY +AGING +AGITATE +AGITATED +AGITATES +AGITATING +AGITATION +AGITATIONS +AGITATOR +AGITATORS +AGLEAM +AGLOW +AGNES +AGNEW +AGNOSTIC +AGNOSTICS +AGO +AGOG +AGONIES +AGONIZE +AGONIZED +AGONIZES +AGONIZING +AGONIZINGLY +AGONY +AGRARIAN +AGREE +AGREEABLE +AGREEABLY +AGREED +AGREEING +AGREEMENT +AGREEMENTS +AGREER +AGREERS +AGREES +AGRICOLA +AGRICULTURAL +AGRICULTURALLY +AGRICULTURE +AGUE +AGWAY +AHEAD +AHMADABAD +AHMEDABAD +AID +AIDA +AIDE +AIDED +AIDES +AIDING +AIDS +AIKEN +AIL +AILEEN +AILERON +AILERONS +AILING +AILMENT +AILMENTS +AIM +AIMED +AIMER +AIMERS +AIMING +AIMLESS +AIMLESSLY +AIMS +AINU +AINUS +AIR +AIRBAG +AIRBAGS +AIRBORNE +AIRBUS +AIRCRAFT +AIRDROP +AIRDROPS +AIRED +AIREDALE +AIRER +AIRERS +AIRES +AIRFARE +AIRFIELD +AIRFIELDS +AIRFLOW +AIRFOIL +AIRFOILS +AIRFRAME +AIRFRAMES +AIRILY +AIRING +AIRINGS +AIRLESS +AIRLIFT +AIRLIFTS +AIRLINE +AIRLINER +AIRLINES +AIRLOCK +AIRLOCKS +AIRMAIL +AIRMAILS +AIRMAN +AIRMEN +AIRPLANE +AIRPLANES +AIRPORT +AIRPORTS +AIRS +AIRSHIP +AIRSHIPS +AIRSPACE +AIRSPEED +AIRSTRIP +AIRSTRIPS +AIRTIGHT +AIRWAY +AIRWAYS +AIRY +AISLE +AITKEN +AJAR +AJAX +AKERS +AKIMBO +AKIN +AKRON +ALABAMA +ALABAMANS +ALABAMIAN +ALABASTER +ALACRITY +ALADDIN +ALAMEDA +ALAMO +ALAMOS +ALAN +ALAR +ALARM +ALARMED +ALARMING +ALARMINGLY +ALARMIST +ALARMS +ALAS +ALASKA +ALASKAN +ALASTAIR +ALBA +ALBACORE +ALBANIA +ALBANIAN +ALBANIANS +ALBANY +ALBATROSS +ALBEIT +ALBERICH +ALBERT +ALBERTA +ALBERTO +ALBRECHT +ALBRIGHT +ALBUM +ALBUMIN +ALBUMS +ALBUQUERQUE +ALCESTIS +ALCHEMY +ALCIBIADES +ALCMENA +ALCOA +ALCOHOL +ALCOHOLIC +ALCOHOLICS +ALCOHOLISM +ALCOHOLS +ALCOTT +ALCOVE +ALCOVES +ALDEBARAN +ALDEN +ALDER +ALDERMAN +ALDERMEN +ALDRICH +ALE +ALEC +ALECK +ALEE +ALERT +ALERTED +ALERTEDLY +ALERTER +ALERTERS +ALERTING +ALERTLY +ALERTNESS +ALERTS +ALEUT +ALEUTIAN +ALEX +ALEXANDER +ALEXANDRA +ALEXANDRE +ALEXANDRIA +ALEXANDRINE +ALEXEI +ALEXIS +ALFA +ALFALFA +ALFONSO +ALFRED +ALFREDO +ALFRESCO +ALGA +ALGAE +ALGAECIDE +ALGEBRA +ALGEBRAIC +ALGEBRAICALLY +ALGEBRAS +ALGENIB +ALGER +ALGERIA +ALGERIAN +ALGIERS +ALGINATE +ALGOL +ALGOL +ALGONQUIAN +ALGONQUIN +ALGORITHM +ALGORITHMIC +ALGORITHMICALLY +ALGORITHMS +ALHAMBRA +ALI +ALIAS +ALIASED +ALIASES +ALIASING +ALIBI +ALIBIS +ALICE +ALICIA +ALIEN +ALIENATE +ALIENATED +ALIENATES +ALIENATING +ALIENATION +ALIENS +ALIGHT +ALIGN +ALIGNED +ALIGNING +ALIGNMENT +ALIGNMENTS +ALIGNS +ALIKE +ALIMENT +ALIMENTS +ALIMONY +ALISON +ALISTAIR +ALIVE +ALKALI +ALKALINE +ALKALIS +ALKALOID +ALKALOIDS +ALKYL +ALL +ALLAH +ALLAN +ALLAY +ALLAYED +ALLAYING +ALLAYS +ALLEGATION +ALLEGATIONS +ALLEGE +ALLEGED +ALLEGEDLY +ALLEGES +ALLEGHENIES +ALLEGHENY +ALLEGIANCE +ALLEGIANCES +ALLEGING +ALLEGORIC +ALLEGORICAL +ALLEGORICALLY +ALLEGORIES +ALLEGORY +ALLEGRA +ALLEGRETTO +ALLEGRETTOS +ALLELE +ALLELES +ALLEMANDE +ALLEN +ALLENDALE +ALLENTOWN +ALLERGIC +ALLERGIES +ALLERGY +ALLEVIATE +ALLEVIATED +ALLEVIATES +ALLEVIATING +ALLEVIATION +ALLEY +ALLEYS +ALLEYWAY +ALLEYWAYS +ALLIANCE +ALLIANCES +ALLIED +ALLIES +ALLIGATOR +ALLIGATORS +ALLIS +ALLISON +ALLITERATION +ALLITERATIONS +ALLITERATIVE +ALLOCATABLE +ALLOCATE +ALLOCATED +ALLOCATES +ALLOCATING +ALLOCATION +ALLOCATIONS +ALLOCATOR +ALLOCATORS +ALLOPHONE +ALLOPHONES +ALLOPHONIC +ALLOT +ALLOTMENT +ALLOTMENTS +ALLOTS +ALLOTTED +ALLOTTER +ALLOTTING +ALLOW +ALLOWABLE +ALLOWABLY +ALLOWANCE +ALLOWANCES +ALLOWED +ALLOWING +ALLOWS +ALLOY +ALLOYS +ALLSTATE +ALLUDE +ALLUDED +ALLUDES +ALLUDING +ALLURE +ALLUREMENT +ALLURING +ALLUSION +ALLUSIONS +ALLUSIVE +ALLUSIVENESS +ALLY +ALLYING +ALLYN +ALMA +ALMADEN +ALMANAC +ALMANACS +ALMIGHTY +ALMOND +ALMONDS +ALMONER +ALMOST +ALMS +ALMSMAN +ALNICO +ALOE +ALOES +ALOFT +ALOHA +ALONE +ALONENESS +ALONG +ALONGSIDE +ALOOF +ALOOFNESS +ALOUD +ALPERT +ALPHA +ALPHABET +ALPHABETIC +ALPHABETICAL +ALPHABETICALLY +ALPHABETICS +ALPHABETIZE +ALPHABETIZED +ALPHABETIZES +ALPHABETIZING +ALPHABETS +ALPHANUMERIC +ALPHERATZ +ALPHONSE +ALPINE +ALPS +ALREADY +ALSATIAN +ALSATIANS +ALSO +ALSOP +ALTAIR +ALTAR +ALTARS +ALTER +ALTERABLE +ALTERATION +ALTERATIONS +ALTERCATION +ALTERCATIONS +ALTERED +ALTERER +ALTERERS +ALTERING +ALTERNATE +ALTERNATED +ALTERNATELY +ALTERNATES +ALTERNATING +ALTERNATION +ALTERNATIONS +ALTERNATIVE +ALTERNATIVELY +ALTERNATIVES +ALTERNATOR +ALTERNATORS +ALTERS +ALTHAEA +ALTHOUGH +ALTITUDE +ALTITUDES +ALTOGETHER +ALTON +ALTOS +ALTRUISM +ALTRUIST +ALTRUISTIC +ALTRUISTICALLY +ALUM +ALUMINUM +ALUMNA +ALUMNAE +ALUMNI +ALUMNUS +ALUNDUM +ALVA +ALVAREZ +ALVEOLAR +ALVEOLI +ALVEOLUS +ALVIN +ALWAYS +ALYSSA +AMADEUS +AMAIN +AMALGAM +AMALGAMATE +AMALGAMATED +AMALGAMATES +AMALGAMATING +AMALGAMATION +AMALGAMS +AMANDA +AMANUENSIS +AMARETTO +AMARILLO +AMASS +AMASSED +AMASSES +AMASSING +AMATEUR +AMATEURISH +AMATEURISHNESS +AMATEURISM +AMATEURS +AMATORY +AMAZE +AMAZED +AMAZEDLY +AMAZEMENT +AMAZER +AMAZERS +AMAZES +AMAZING +AMAZINGLY +AMAZON +AMAZONS +AMBASSADOR +AMBASSADORS +AMBER +AMBIANCE +AMBIDEXTROUS +AMBIDEXTROUSLY +AMBIENT +AMBIGUITIES +AMBIGUITY +AMBIGUOUS +AMBIGUOUSLY +AMBITION +AMBITIONS +AMBITIOUS +AMBITIOUSLY +AMBIVALENCE +AMBIVALENT +AMBIVALENTLY +AMBLE +AMBLED +AMBLER +AMBLES +AMBLING +AMBROSIAL +AMBULANCE +AMBULANCES +AMBULATORY +AMBUSCADE +AMBUSH +AMBUSHED +AMBUSHES +AMDAHL +AMELIA +AMELIORATE +AMELIORATED +AMELIORATING +AMELIORATION +AMEN +AMENABLE +AMEND +AMENDED +AMENDING +AMENDMENT +AMENDMENTS +AMENDS +AMENITIES +AMENITY +AMENORRHEA +AMERADA +AMERICA +AMERICAN +AMERICANA +AMERICANISM +AMERICANIZATION +AMERICANIZATIONS +AMERICANIZE +AMERICANIZER +AMERICANIZERS +AMERICANIZES +AMERICANS +AMERICAS +AMERICIUM +AMES +AMHARIC +AMHERST +AMIABLE +AMICABLE +AMICABLY +AMID +AMIDE +AMIDST +AMIGA +AMIGO +AMINO +AMISS +AMITY +AMMAN +AMMERMAN +AMMO +AMMONIA +AMMONIAC +AMMONIUM +AMMUNITION +AMNESTY +AMOCO +AMOEBA +AMOEBAE +AMOEBAS +AMOK +AMONG +AMONGST +AMONTILLADO +AMORAL +AMORALITY +AMORIST +AMOROUS +AMORPHOUS +AMORPHOUSLY +AMORTIZE +AMORTIZED +AMORTIZES +AMORTIZING +AMOS +AMOUNT +AMOUNTED +AMOUNTER +AMOUNTERS +AMOUNTING +AMOUNTS +AMOUR +AMPERAGE +AMPERE +AMPERES +AMPERSAND +AMPERSANDS +AMPEX +AMPHETAMINE +AMPHETAMINES +AMPHIBIAN +AMPHIBIANS +AMPHIBIOUS +AMPHIBIOUSLY +AMPHIBOLOGY +AMPHITHEATER +AMPHITHEATERS +AMPLE +AMPLIFICATION +AMPLIFIED +AMPLIFIER +AMPLIFIERS +AMPLIFIES +AMPLIFY +AMPLIFYING +AMPLITUDE +AMPLITUDES +AMPLY +AMPOULE +AMPOULES +AMPUTATE +AMPUTATED +AMPUTATES +AMPUTATING +AMSTERDAM +AMTRAK +AMULET +AMULETS +AMUSE +AMUSED +AMUSEDLY +AMUSEMENT +AMUSEMENTS +AMUSER +AMUSERS +AMUSES +AMUSING +AMUSINGLY +AMY +AMYL +ANABAPTIST +ANABAPTISTS +ANABEL +ANACHRONISM +ANACHRONISMS +ANACHRONISTICALLY +ANACONDA +ANACONDAS +ANACREON +ANAEROBIC +ANAGRAM +ANAGRAMS +ANAHEIM +ANAL +ANALECTS +ANALOG +ANALOGICAL +ANALOGIES +ANALOGOUS +ANALOGOUSLY +ANALOGUE +ANALOGUES +ANALOGY +ANALYSES +ANALYSIS +ANALYST +ANALYSTS +ANALYTIC +ANALYTICAL +ANALYTICALLY +ANALYTICITIES +ANALYTICITY +ANALYZABLE +ANALYZE +ANALYZED +ANALYZER +ANALYZERS +ANALYZES +ANALYZING +ANAPHORA +ANAPHORIC +ANAPHORICALLY +ANAPLASMOSIS +ANARCHIC +ANARCHICAL +ANARCHISM +ANARCHIST +ANARCHISTS +ANARCHY +ANASTASIA +ANASTOMOSES +ANASTOMOSIS +ANASTOMOTIC +ANATHEMA +ANATOLE +ANATOLIA +ANATOLIAN +ANATOMIC +ANATOMICAL +ANATOMICALLY +ANATOMY +ANCESTOR +ANCESTORS +ANCESTRAL +ANCESTRY +ANCHOR +ANCHORAGE +ANCHORAGES +ANCHORED +ANCHORING +ANCHORITE +ANCHORITISM +ANCHORS +ANCHOVIES +ANCHOVY +ANCIENT +ANCIENTLY +ANCIENTS +ANCILLARY +AND +ANDALUSIA +ANDALUSIAN +ANDALUSIANS +ANDEAN +ANDERS +ANDERSEN +ANDERSON +ANDES +ANDING +ANDORRA +ANDOVER +ANDRE +ANDREA +ANDREI +ANDREW +ANDREWS +ANDROMACHE +ANDROMEDA +ANDY +ANECDOTAL +ANECDOTE +ANECDOTES +ANECHOIC +ANEMIA +ANEMIC +ANEMOMETER +ANEMOMETERS +ANEMOMETRY +ANEMONE +ANESTHESIA +ANESTHETIC +ANESTHETICALLY +ANESTHETICS +ANESTHETIZE +ANESTHETIZED +ANESTHETIZES +ANESTHETIZING +ANEW +ANGEL +ANGELA +ANGELENO +ANGELENOS +ANGELES +ANGELIC +ANGELICA +ANGELINA +ANGELINE +ANGELO +ANGELS +ANGER +ANGERED +ANGERING +ANGERS +ANGIE +ANGIOGRAPHY +ANGLE +ANGLED +ANGLER +ANGLERS +ANGLES +ANGLIA +ANGLICAN +ANGLICANISM +ANGLICANIZE +ANGLICANIZES +ANGLICANS +ANGLING +ANGLO +ANGLOPHILIA +ANGLOPHOBIA +ANGOLA +ANGORA +ANGRIER +ANGRIEST +ANGRILY +ANGRY +ANGST +ANGSTROM +ANGUISH +ANGUISHED +ANGULAR +ANGULARLY +ANGUS +ANHEUSER +ANHYDROUS +ANHYDROUSLY +ANILINE +ANIMAL +ANIMALS +ANIMATE +ANIMATED +ANIMATEDLY +ANIMATELY +ANIMATENESS +ANIMATES +ANIMATING +ANIMATION +ANIMATIONS +ANIMATOR +ANIMATORS +ANIMISM +ANIMIZED +ANIMOSITY +ANION +ANIONIC +ANIONS +ANISE +ANISEIKONIC +ANISOTROPIC +ANISOTROPY +ANITA +ANKARA +ANKLE +ANKLES +ANN +ANNA +ANNAL +ANNALIST +ANNALISTIC +ANNALS +ANNAPOLIS +ANNE +ANNETTE +ANNEX +ANNEXATION +ANNEXED +ANNEXES +ANNEXING +ANNIE +ANNIHILATE +ANNIHILATED +ANNIHILATES +ANNIHILATING +ANNIHILATION +ANNIVERSARIES +ANNIVERSARY +ANNOTATE +ANNOTATED +ANNOTATES +ANNOTATING +ANNOTATION +ANNOTATIONS +ANNOUNCE +ANNOUNCED +ANNOUNCEMENT +ANNOUNCEMENTS +ANNOUNCER +ANNOUNCERS +ANNOUNCES +ANNOUNCING +ANNOY +ANNOYANCE +ANNOYANCES +ANNOYED +ANNOYER +ANNOYERS +ANNOYING +ANNOYINGLY +ANNOYS +ANNUAL +ANNUALLY +ANNUALS +ANNUITY +ANNUL +ANNULAR +ANNULI +ANNULLED +ANNULLING +ANNULMENT +ANNULMENTS +ANNULS +ANNULUS +ANNUM +ANNUNCIATE +ANNUNCIATED +ANNUNCIATES +ANNUNCIATING +ANNUNCIATOR +ANNUNCIATORS +ANODE +ANODES +ANODIZE +ANODIZED +ANODIZES +ANOINT +ANOINTED +ANOINTING +ANOINTS +ANOMALIES +ANOMALOUS +ANOMALOUSLY +ANOMALY +ANOMIC +ANOMIE +ANON +ANONYMITY +ANONYMOUS +ANONYMOUSLY +ANOREXIA +ANOTHER +ANSELM +ANSELMO +ANSI +ANSWER +ANSWERABLE +ANSWERED +ANSWERER +ANSWERERS +ANSWERING +ANSWERS +ANT +ANTAEUS +ANTAGONISM +ANTAGONISMS +ANTAGONIST +ANTAGONISTIC +ANTAGONISTICALLY +ANTAGONISTS +ANTAGONIZE +ANTAGONIZED +ANTAGONIZES +ANTAGONIZING +ANTARCTIC +ANTARCTICA +ANTARES +ANTE +ANTEATER +ANTEATERS +ANTECEDENT +ANTECEDENTS +ANTEDATE +ANTELOPE +ANTELOPES +ANTENNA +ANTENNAE +ANTENNAS +ANTERIOR +ANTHEM +ANTHEMS +ANTHER +ANTHOLOGIES +ANTHOLOGY +ANTHONY +ANTHRACITE +ANTHROPOLOGICAL +ANTHROPOLOGICALLY +ANTHROPOLOGIST +ANTHROPOLOGISTS +ANTHROPOLOGY +ANTHROPOMORPHIC +ANTHROPOMORPHICALLY +ANTI +ANTIBACTERIAL +ANTIBIOTIC +ANTIBIOTICS +ANTIBODIES +ANTIBODY +ANTIC +ANTICIPATE +ANTICIPATED +ANTICIPATES +ANTICIPATING +ANTICIPATION +ANTICIPATIONS +ANTICIPATORY +ANTICOAGULATION +ANTICOMPETITIVE +ANTICS +ANTIDISESTABLISHMENTARIANISM +ANTIDOTE +ANTIDOTES +ANTIETAM +ANTIFORMANT +ANTIFUNDAMENTALIST +ANTIGEN +ANTIGENS +ANTIGONE +ANTIHISTORICAL +ANTILLES +ANTIMICROBIAL +ANTIMONY +ANTINOMIAN +ANTINOMY +ANTIOCH +ANTIPATHY +ANTIPHONAL +ANTIPODE +ANTIPODES +ANTIQUARIAN +ANTIQUARIANS +ANTIQUATE +ANTIQUATED +ANTIQUE +ANTIQUES +ANTIQUITIES +ANTIQUITY +ANTIREDEPOSITION +ANTIRESONANCE +ANTIRESONATOR +ANTISEMITIC +ANTISEMITISM +ANTISEPTIC +ANTISERA +ANTISERUM +ANTISLAVERY +ANTISOCIAL +ANTISUBMARINE +ANTISYMMETRIC +ANTISYMMETRY +ANTITHESIS +ANTITHETICAL +ANTITHYROID +ANTITOXIN +ANTITOXINS +ANTITRUST +ANTLER +ANTLERED +ANTOINE +ANTOINETTE +ANTON +ANTONIO +ANTONOVICS +ANTONY +ANTS +ANTWERP +ANUS +ANVIL +ANVILS +ANXIETIES +ANXIETY +ANXIOUS +ANXIOUSLY +ANY +ANYBODY +ANYHOW +ANYMORE +ANYONE +ANYPLACE +ANYTHING +ANYTIME +ANYWAY +ANYWHERE +AORTA +APACE +APACHES +APALACHICOLA +APART +APARTMENT +APARTMENTS +APATHETIC +APATHY +APE +APED +APERIODIC +APERIODICITY +APERTURE +APES +APETALOUS +APEX +APHASIA +APHASIC +APHELION +APHID +APHIDS +APHONIC +APHORISM +APHORISMS +APHRODITE +APIARIES +APIARY +APICAL +APIECE +APING +APISH +APLENTY +APLOMB +APOCALYPSE +APOCALYPTIC +APOCRYPHA +APOCRYPHAL +APOGEE +APOGEES +APOLLINAIRE +APOLLO +APOLLONIAN +APOLOGETIC +APOLOGETICALLY +APOLOGIA +APOLOGIES +APOLOGIST +APOLOGISTS +APOLOGIZE +APOLOGIZED +APOLOGIZES +APOLOGIZING +APOLOGY +APOSTATE +APOSTLE +APOSTLES +APOSTOLIC +APOSTROPHE +APOSTROPHES +APOTHECARY +APOTHEGM +APOTHEOSES +APOTHEOSIS +APPALACHIA +APPALACHIAN +APPALACHIANS +APPALL +APPALLED +APPALLING +APPALLINGLY +APPALOOSAS +APPANAGE +APPARATUS +APPAREL +APPARELED +APPARENT +APPARENTLY +APPARITION +APPARITIONS +APPEAL +APPEALED +APPEALER +APPEALERS +APPEALING +APPEALINGLY +APPEALS +APPEAR +APPEARANCE +APPEARANCES +APPEARED +APPEARER +APPEARERS +APPEARING +APPEARS +APPEASE +APPEASED +APPEASEMENT +APPEASES +APPEASING +APPELLANT +APPELLANTS +APPELLATE +APPELLATION +APPEND +APPENDAGE +APPENDAGES +APPENDED +APPENDER +APPENDERS +APPENDICES +APPENDICITIS +APPENDING +APPENDIX +APPENDIXES +APPENDS +APPERTAIN +APPERTAINS +APPETITE +APPETITES +APPETIZER +APPETIZING +APPIA +APPIAN +APPLAUD +APPLAUDED +APPLAUDING +APPLAUDS +APPLAUSE +APPLE +APPLEBY +APPLEJACK +APPLES +APPLETON +APPLIANCE +APPLIANCES +APPLICABILITY +APPLICABLE +APPLICANT +APPLICANTS +APPLICATION +APPLICATIONS +APPLICATIVE +APPLICATIVELY +APPLICATOR +APPLICATORS +APPLIED +APPLIER +APPLIERS +APPLIES +APPLIQUE +APPLY +APPLYING +APPOINT +APPOINTED +APPOINTEE +APPOINTEES +APPOINTER +APPOINTERS +APPOINTING +APPOINTIVE +APPOINTMENT +APPOINTMENTS +APPOINTS +APPOMATTOX +APPORTION +APPORTIONED +APPORTIONING +APPORTIONMENT +APPORTIONMENTS +APPORTIONS +APPOSITE +APPRAISAL +APPRAISALS +APPRAISE +APPRAISED +APPRAISER +APPRAISERS +APPRAISES +APPRAISING +APPRAISINGLY +APPRECIABLE +APPRECIABLY +APPRECIATE +APPRECIATED +APPRECIATES +APPRECIATING +APPRECIATION +APPRECIATIONS +APPRECIATIVE +APPRECIATIVELY +APPREHEND +APPREHENDED +APPREHENSIBLE +APPREHENSION +APPREHENSIONS +APPREHENSIVE +APPREHENSIVELY +APPREHENSIVENESS +APPRENTICE +APPRENTICED +APPRENTICES +APPRENTICESHIP +APPRISE +APPRISED +APPRISES +APPRISING +APPROACH +APPROACHABILITY +APPROACHABLE +APPROACHED +APPROACHER +APPROACHERS +APPROACHES +APPROACHING +APPROBATE +APPROBATION +APPROPRIATE +APPROPRIATED +APPROPRIATELY +APPROPRIATENESS +APPROPRIATES +APPROPRIATING +APPROPRIATION +APPROPRIATIONS +APPROPRIATOR +APPROPRIATORS +APPROVAL +APPROVALS +APPROVE +APPROVED +APPROVER +APPROVERS +APPROVES +APPROVING +APPROVINGLY +APPROXIMATE +APPROXIMATED +APPROXIMATELY +APPROXIMATES +APPROXIMATING +APPROXIMATION +APPROXIMATIONS +APPURTENANCE +APPURTENANCES +APRICOT +APRICOTS +APRIL +APRILS +APRON +APRONS +APROPOS +APSE +APSIS +APT +APTITUDE +APTITUDES +APTLY +APTNESS +AQUA +AQUARIA +AQUARIUM +AQUARIUS +AQUATIC +AQUEDUCT +AQUEDUCTS +AQUEOUS +AQUIFER +AQUIFERS +AQUILA +AQUINAS +ARAB +ARABESQUE +ARABIA +ARABIAN +ARABIANIZE +ARABIANIZES +ARABIANS +ARABIC +ARABICIZE +ARABICIZES +ARABLE +ARABS +ARABY +ARACHNE +ARACHNID +ARACHNIDS +ARAMCO +ARAPAHO +ARBITER +ARBITERS +ARBITRARILY +ARBITRARINESS +ARBITRARY +ARBITRATE +ARBITRATED +ARBITRATES +ARBITRATING +ARBITRATION +ARBITRATOR +ARBITRATORS +ARBOR +ARBOREAL +ARBORS +ARC +ARCADE +ARCADED +ARCADES +ARCADIA +ARCADIAN +ARCANE +ARCED +ARCH +ARCHAIC +ARCHAICALLY +ARCHAICNESS +ARCHAISM +ARCHAIZE +ARCHANGEL +ARCHANGELS +ARCHBISHOP +ARCHDIOCESE +ARCHDIOCESES +ARCHED +ARCHENEMY +ARCHEOLOGICAL +ARCHEOLOGIST +ARCHEOLOGY +ARCHER +ARCHERS +ARCHERY +ARCHES +ARCHETYPE +ARCHFOOL +ARCHIBALD +ARCHIE +ARCHIMEDES +ARCHING +ARCHIPELAGO +ARCHIPELAGOES +ARCHITECT +ARCHITECTONIC +ARCHITECTS +ARCHITECTURAL +ARCHITECTURALLY +ARCHITECTURE +ARCHITECTURES +ARCHIVAL +ARCHIVE +ARCHIVED +ARCHIVER +ARCHIVERS +ARCHIVES +ARCHIVING +ARCHIVIST +ARCHLY +ARCING +ARCLIKE +ARCO +ARCS +ARCSINE +ARCTANGENT +ARCTIC +ARCTURUS +ARDEN +ARDENT +ARDENTLY +ARDOR +ARDUOUS +ARDUOUSLY +ARDUOUSNESS +ARE +AREA +AREAS +ARENA +ARENAS +AREQUIPA +ARES +ARGENTINA +ARGENTINIAN +ARGIVE +ARGO +ARGON +ARGONAUT +ARGONAUTS +ARGONNE +ARGOS +ARGOT +ARGUABLE +ARGUABLY +ARGUE +ARGUED +ARGUER +ARGUERS +ARGUES +ARGUING +ARGUMENT +ARGUMENTATION +ARGUMENTATIVE +ARGUMENTS +ARGUS +ARIADNE +ARIANISM +ARIANIST +ARIANISTS +ARID +ARIDITY +ARIES +ARIGHT +ARISE +ARISEN +ARISER +ARISES +ARISING +ARISINGS +ARISTOCRACY +ARISTOCRAT +ARISTOCRATIC +ARISTOCRATICALLY +ARISTOCRATS +ARISTOTELIAN +ARISTOTLE +ARITHMETIC +ARITHMETICAL +ARITHMETICALLY +ARITHMETICS +ARITHMETIZE +ARITHMETIZED +ARITHMETIZES +ARIZONA +ARK +ARKANSAN +ARKANSAS +ARLEN +ARLENE +ARLINGTON +ARM +ARMADA +ARMADILLO +ARMADILLOS +ARMAGEDDON +ARMAGNAC +ARMAMENT +ARMAMENTS +ARMATA +ARMCHAIR +ARMCHAIRS +ARMCO +ARMED +ARMENIA +ARMENIAN +ARMER +ARMERS +ARMFUL +ARMHOLE +ARMIES +ARMING +ARMISTICE +ARMLOAD +ARMONK +ARMOR +ARMORED +ARMORER +ARMORY +ARMOUR +ARMPIT +ARMPITS +ARMS +ARMSTRONG +ARMY +ARNOLD +AROMA +AROMAS +AROMATIC +AROSE +AROUND +AROUSAL +AROUSE +AROUSED +AROUSES +AROUSING +ARPA +ARPANET +ARPANET +ARPEGGIO +ARPEGGIOS +ARRACK +ARRAGON +ARRAIGN +ARRAIGNED +ARRAIGNING +ARRAIGNMENT +ARRAIGNMENTS +ARRAIGNS +ARRANGE +ARRANGED +ARRANGEMENT +ARRANGEMENTS +ARRANGER +ARRANGERS +ARRANGES +ARRANGING +ARRANT +ARRAY +ARRAYED +ARRAYS +ARREARS +ARREST +ARRESTED +ARRESTER +ARRESTERS +ARRESTING +ARRESTINGLY +ARRESTOR +ARRESTORS +ARRESTS +ARRHENIUS +ARRIVAL +ARRIVALS +ARRIVE +ARRIVED +ARRIVES +ARRIVING +ARROGANCE +ARROGANT +ARROGANTLY +ARROGATE +ARROGATED +ARROGATES +ARROGATING +ARROGATION +ARROW +ARROWED +ARROWHEAD +ARROWHEADS +ARROWS +ARROYO +ARROYOS +ARSENAL +ARSENALS +ARSENIC +ARSINE +ARSON +ART +ARTEMIA +ARTEMIS +ARTERIAL +ARTERIES +ARTERIOLAR +ARTERIOLE +ARTERIOLES +ARTERIOSCLEROSIS +ARTERY +ARTFUL +ARTFULLY +ARTFULNESS +ARTHRITIS +ARTHROPOD +ARTHROPODS +ARTHUR +ARTICHOKE +ARTICHOKES +ARTICLE +ARTICLES +ARTICULATE +ARTICULATED +ARTICULATELY +ARTICULATENESS +ARTICULATES +ARTICULATING +ARTICULATION +ARTICULATIONS +ARTICULATOR +ARTICULATORS +ARTICULATORY +ARTIE +ARTIFACT +ARTIFACTS +ARTIFICE +ARTIFICER +ARTIFICES +ARTIFICIAL +ARTIFICIALITIES +ARTIFICIALITY +ARTIFICIALLY +ARTIFICIALNESS +ARTILLERIST +ARTILLERY +ARTISAN +ARTISANS +ARTIST +ARTISTIC +ARTISTICALLY +ARTISTRY +ARTISTS +ARTLESS +ARTS +ARTURO +ARTWORK +ARUBA +ARYAN +ARYANS +ASBESTOS +ASCEND +ASCENDANCY +ASCENDANT +ASCENDED +ASCENDENCY +ASCENDENT +ASCENDER +ASCENDERS +ASCENDING +ASCENDS +ASCENSION +ASCENSIONS +ASCENT +ASCERTAIN +ASCERTAINABLE +ASCERTAINED +ASCERTAINING +ASCERTAINS +ASCETIC +ASCETICISM +ASCETICS +ASCII +ASCOT +ASCRIBABLE +ASCRIBE +ASCRIBED +ASCRIBES +ASCRIBING +ASCRIPTION +ASEPTIC +ASH +ASHAMED +ASHAMEDLY +ASHEN +ASHER +ASHES +ASHEVILLE +ASHLAND +ASHLEY +ASHMAN +ASHMOLEAN +ASHORE +ASHTRAY +ASHTRAYS +ASIA +ASIAN +ASIANS +ASIATIC +ASIATICIZATION +ASIATICIZATIONS +ASIATICIZE +ASIATICIZES +ASIATICS +ASIDE +ASILOMAR +ASININE +ASK +ASKANCE +ASKED +ASKER +ASKERS +ASKEW +ASKING +ASKS +ASLEEP +ASOCIAL +ASP +ASPARAGUS +ASPECT +ASPECTS +ASPEN +ASPERSION +ASPERSIONS +ASPHALT +ASPHYXIA +ASPIC +ASPIRANT +ASPIRANTS +ASPIRATE +ASPIRATED +ASPIRATES +ASPIRATING +ASPIRATION +ASPIRATIONS +ASPIRATOR +ASPIRATORS +ASPIRE +ASPIRED +ASPIRES +ASPIRIN +ASPIRING +ASPIRINS +ASS +ASSAIL +ASSAILANT +ASSAILANTS +ASSAILED +ASSAILING +ASSAILS +ASSAM +ASSASSIN +ASSASSINATE +ASSASSINATED +ASSASSINATES +ASSASSINATING +ASSASSINATION +ASSASSINATIONS +ASSASSINS +ASSAULT +ASSAULTED +ASSAULTING +ASSAULTS +ASSAY +ASSAYED +ASSAYING +ASSEMBLAGE +ASSEMBLAGES +ASSEMBLE +ASSEMBLED +ASSEMBLER +ASSEMBLERS +ASSEMBLES +ASSEMBLIES +ASSEMBLING +ASSEMBLY +ASSENT +ASSENTED +ASSENTER +ASSENTING +ASSENTS +ASSERT +ASSERTED +ASSERTER +ASSERTERS +ASSERTING +ASSERTION +ASSERTIONS +ASSERTIVE +ASSERTIVELY +ASSERTIVENESS +ASSERTS +ASSES +ASSESS +ASSESSED +ASSESSES +ASSESSING +ASSESSMENT +ASSESSMENTS +ASSESSOR +ASSESSORS +ASSET +ASSETS +ASSIDUITY +ASSIDUOUS +ASSIDUOUSLY +ASSIGN +ASSIGNABLE +ASSIGNED +ASSIGNEE +ASSIGNEES +ASSIGNER +ASSIGNERS +ASSIGNING +ASSIGNMENT +ASSIGNMENTS +ASSIGNS +ASSIMILATE +ASSIMILATED +ASSIMILATES +ASSIMILATING +ASSIMILATION +ASSIMILATIONS +ASSIST +ASSISTANCE +ASSISTANCES +ASSISTANT +ASSISTANTS +ASSISTANTSHIP +ASSISTANTSHIPS +ASSISTED +ASSISTING +ASSISTS +ASSOCIATE +ASSOCIATED +ASSOCIATES +ASSOCIATING +ASSOCIATION +ASSOCIATIONAL +ASSOCIATIONS +ASSOCIATIVE +ASSOCIATIVELY +ASSOCIATIVITY +ASSOCIATOR +ASSOCIATORS +ASSONANCE +ASSONANT +ASSORT +ASSORTED +ASSORTMENT +ASSORTMENTS +ASSORTS +ASSUAGE +ASSUAGED +ASSUAGES +ASSUME +ASSUMED +ASSUMES +ASSUMING +ASSUMPTION +ASSUMPTIONS +ASSURANCE +ASSURANCES +ASSURE +ASSURED +ASSUREDLY +ASSURER +ASSURERS +ASSURES +ASSURING +ASSURINGLY +ASSYRIA +ASSYRIAN +ASSYRIANIZE +ASSYRIANIZES +ASSYRIOLOGY +ASTAIRE +ASTAIRES +ASTARTE +ASTATINE +ASTER +ASTERISK +ASTERISKS +ASTEROID +ASTEROIDAL +ASTEROIDS +ASTERS +ASTHMA +ASTON +ASTONISH +ASTONISHED +ASTONISHES +ASTONISHING +ASTONISHINGLY +ASTONISHMENT +ASTOR +ASTORIA +ASTOUND +ASTOUNDED +ASTOUNDING +ASTOUNDS +ASTRAL +ASTRAY +ASTRIDE +ASTRINGENCY +ASTRINGENT +ASTROLOGY +ASTRONAUT +ASTRONAUTICS +ASTRONAUTS +ASTRONOMER +ASTRONOMERS +ASTRONOMICAL +ASTRONOMICALLY +ASTRONOMY +ASTROPHYSICAL +ASTROPHYSICS +ASTUTE +ASTUTELY +ASTUTENESS +ASUNCION +ASUNDER +ASYLUM +ASYMMETRIC +ASYMMETRICALLY +ASYMMETRY +ASYMPTOMATICALLY +ASYMPTOTE +ASYMPTOTES +ASYMPTOTIC +ASYMPTOTICALLY +ASYNCHRONISM +ASYNCHRONOUS +ASYNCHRONOUSLY +ASYNCHRONY +ATALANTA +ATARI +ATAVISTIC +ATCHISON +ATE +ATEMPORAL +ATHABASCAN +ATHEISM +ATHEIST +ATHEISTIC +ATHEISTS +ATHENA +ATHENIAN +ATHENIANS +ATHENS +ATHEROSCLEROSIS +ATHLETE +ATHLETES +ATHLETIC +ATHLETICISM +ATHLETICS +ATKINS +ATKINSON +ATLANTA +ATLANTIC +ATLANTICA +ATLANTIS +ATLAS +ATMOSPHERE +ATMOSPHERES +ATMOSPHERIC +ATOLL +ATOLLS +ATOM +ATOMIC +ATOMICALLY +ATOMICS +ATOMIZATION +ATOMIZE +ATOMIZED +ATOMIZES +ATOMIZING +ATOMS +ATONAL +ATONALLY +ATONE +ATONED +ATONEMENT +ATONES +ATOP +ATREUS +ATROCIOUS +ATROCIOUSLY +ATROCITIES +ATROCITY +ATROPHIC +ATROPHIED +ATROPHIES +ATROPHY +ATROPHYING +ATROPOS +ATTACH +ATTACHE +ATTACHED +ATTACHER +ATTACHERS +ATTACHES +ATTACHING +ATTACHMENT +ATTACHMENTS +ATTACK +ATTACKABLE +ATTACKED +ATTACKER +ATTACKERS +ATTACKING +ATTACKS +ATTAIN +ATTAINABLE +ATTAINABLY +ATTAINED +ATTAINER +ATTAINERS +ATTAINING +ATTAINMENT +ATTAINMENTS +ATTAINS +ATTEMPT +ATTEMPTED +ATTEMPTER +ATTEMPTERS +ATTEMPTING +ATTEMPTS +ATTEND +ATTENDANCE +ATTENDANCES +ATTENDANT +ATTENDANTS +ATTENDED +ATTENDEE +ATTENDEES +ATTENDER +ATTENDERS +ATTENDING +ATTENDS +ATTENTION +ATTENTIONAL +ATTENTIONALITY +ATTENTIONS +ATTENTIVE +ATTENTIVELY +ATTENTIVENESS +ATTENUATE +ATTENUATED +ATTENUATES +ATTENUATING +ATTENUATION +ATTENUATOR +ATTENUATORS +ATTEST +ATTESTED +ATTESTING +ATTESTS +ATTIC +ATTICA +ATTICS +ATTIRE +ATTIRED +ATTIRES +ATTIRING +ATTITUDE +ATTITUDES +ATTITUDINAL +ATTLEE +ATTORNEY +ATTORNEYS +ATTRACT +ATTRACTED +ATTRACTING +ATTRACTION +ATTRACTIONS +ATTRACTIVE +ATTRACTIVELY +ATTRACTIVENESS +ATTRACTOR +ATTRACTORS +ATTRACTS +ATTRIBUTABLE +ATTRIBUTE +ATTRIBUTED +ATTRIBUTES +ATTRIBUTING +ATTRIBUTION +ATTRIBUTIONS +ATTRIBUTIVE +ATTRIBUTIVELY +ATTRITION +ATTUNE +ATTUNED +ATTUNES +ATTUNING +ATWATER +ATWOOD +ATYPICAL +ATYPICALLY +AUBERGE +AUBREY +AUBURN +AUCKLAND +AUCTION +AUCTIONEER +AUCTIONEERS +AUDACIOUS +AUDACIOUSLY +AUDACIOUSNESS +AUDACITY +AUDIBLE +AUDIBLY +AUDIENCE +AUDIENCES +AUDIO +AUDIOGRAM +AUDIOGRAMS +AUDIOLOGICAL +AUDIOLOGIST +AUDIOLOGISTS +AUDIOLOGY +AUDIOMETER +AUDIOMETERS +AUDIOMETRIC +AUDIOMETRY +AUDIT +AUDITED +AUDITING +AUDITION +AUDITIONED +AUDITIONING +AUDITIONS +AUDITOR +AUDITORIUM +AUDITORS +AUDITORY +AUDITS +AUDREY +AUDUBON +AUERBACH +AUGEAN +AUGER +AUGERS +AUGHT +AUGMENT +AUGMENTATION +AUGMENTED +AUGMENTING +AUGMENTS +AUGUR +AUGURS +AUGUST +AUGUSTA +AUGUSTAN +AUGUSTINE +AUGUSTLY +AUGUSTNESS +AUGUSTUS +AUNT +AUNTS +AURA +AURAL +AURALLY +AURAS +AURELIUS +AUREOLE +AUREOMYCIN +AURIGA +AURORA +AUSCHWITZ +AUSCULTATE +AUSCULTATED +AUSCULTATES +AUSCULTATING +AUSCULTATION +AUSCULTATIONS +AUSPICE +AUSPICES +AUSPICIOUS +AUSPICIOUSLY +AUSTERE +AUSTERELY +AUSTERITY +AUSTIN +AUSTRALIA +AUSTRALIAN +AUSTRALIANIZE +AUSTRALIANIZES +AUSTRALIS +AUSTRIA +AUSTRIAN +AUSTRIANIZE +AUSTRIANIZES +AUTHENTIC +AUTHENTICALLY +AUTHENTICATE +AUTHENTICATED +AUTHENTICATES +AUTHENTICATING +AUTHENTICATION +AUTHENTICATIONS +AUTHENTICATOR +AUTHENTICATORS +AUTHENTICITY +AUTHOR +AUTHORED +AUTHORING +AUTHORITARIAN +AUTHORITARIANISM +AUTHORITATIVE +AUTHORITATIVELY +AUTHORITIES +AUTHORITY +AUTHORIZATION +AUTHORIZATIONS +AUTHORIZE +AUTHORIZED +AUTHORIZER +AUTHORIZERS +AUTHORIZES +AUTHORIZING +AUTHORS +AUTHORSHIP +AUTISM +AUTISTIC +AUTO +AUTOBIOGRAPHIC +AUTOBIOGRAPHICAL +AUTOBIOGRAPHIES +AUTOBIOGRAPHY +AUTOCOLLIMATOR +AUTOCORRELATE +AUTOCORRELATION +AUTOCRACIES +AUTOCRACY +AUTOCRAT +AUTOCRATIC +AUTOCRATICALLY +AUTOCRATS +AUTODECREMENT +AUTODECREMENTED +AUTODECREMENTS +AUTODIALER +AUTOFLUORESCENCE +AUTOGRAPH +AUTOGRAPHED +AUTOGRAPHING +AUTOGRAPHS +AUTOINCREMENT +AUTOINCREMENTED +AUTOINCREMENTS +AUTOINDEX +AUTOINDEXING +AUTOMATA +AUTOMATE +AUTOMATED +AUTOMATES +AUTOMATIC +AUTOMATICALLY +AUTOMATING +AUTOMATION +AUTOMATON +AUTOMOBILE +AUTOMOBILES +AUTOMOTIVE +AUTONAVIGATOR +AUTONAVIGATORS +AUTONOMIC +AUTONOMOUS +AUTONOMOUSLY +AUTONOMY +AUTOPILOT +AUTOPILOTS +AUTOPSIED +AUTOPSIES +AUTOPSY +AUTOREGRESSIVE +AUTOS +AUTOSUGGESTIBILITY +AUTOTRANSFORMER +AUTUMN +AUTUMNAL +AUTUMNS +AUXILIARIES +AUXILIARY +AVAIL +AVAILABILITIES +AVAILABILITY +AVAILABLE +AVAILABLY +AVAILED +AVAILER +AVAILERS +AVAILING +AVAILS +AVALANCHE +AVALANCHED +AVALANCHES +AVALANCHING +AVANT +AVARICE +AVARICIOUS +AVARICIOUSLY +AVENGE +AVENGED +AVENGER +AVENGES +AVENGING +AVENTINE +AVENTINO +AVENUE +AVENUES +AVER +AVERAGE +AVERAGED +AVERAGES +AVERAGING +AVERNUS +AVERRED +AVERRER +AVERRING +AVERS +AVERSE +AVERSION +AVERSIONS +AVERT +AVERTED +AVERTING +AVERTS +AVERY +AVESTA +AVIAN +AVIARIES +AVIARY +AVIATION +AVIATOR +AVIATORS +AVID +AVIDITY +AVIDLY +AVIGNON +AVIONIC +AVIONICS +AVIS +AVIV +AVOCADO +AVOCADOS +AVOCATION +AVOCATIONS +AVOGADRO +AVOID +AVOIDABLE +AVOIDABLY +AVOIDANCE +AVOIDED +AVOIDER +AVOIDERS +AVOIDING +AVOIDS +AVON +AVOUCH +AVOW +AVOWAL +AVOWED +AVOWS +AWAIT +AWAITED +AWAITING +AWAITS +AWAKE +AWAKEN +AWAKENED +AWAKENING +AWAKENS +AWAKES +AWAKING +AWARD +AWARDED +AWARDER +AWARDERS +AWARDING +AWARDS +AWARE +AWARENESS +AWASH +AWAY +AWE +AWED +AWESOME +AWFUL +AWFULLY +AWFULNESS +AWHILE +AWKWARD +AWKWARDLY +AWKWARDNESS +AWL +AWLS +AWNING +AWNINGS +AWOKE +AWRY +AXED +AXEL +AXER +AXERS +AXES +AXIAL +AXIALLY +AXING +AXIOLOGICAL +AXIOM +AXIOMATIC +AXIOMATICALLY +AXIOMATIZATION +AXIOMATIZATIONS +AXIOMATIZE +AXIOMATIZED +AXIOMATIZES +AXIOMATIZING +AXIOMS +AXIS +AXLE +AXLES +AXOLOTL +AXOLOTLS +AXON +AXONS +AYE +AYERS +AYES +AYLESBURY +AZALEA +AZALEAS +AZERBAIJAN +AZIMUTH +AZIMUTHS +AZORES +AZTEC +AZTECAN +AZURE +BABBAGE +BABBLE +BABBLED +BABBLES +BABBLING +BABCOCK +BABE +BABEL +BABELIZE +BABELIZES +BABES +BABIED +BABIES +BABKA +BABOON +BABOONS +BABUL +BABY +BABYHOOD +BABYING +BABYISH +BABYLON +BABYLONIAN +BABYLONIANS +BABYLONIZE +BABYLONIZES +BABYSIT +BABYSITTING +BACCALAUREATE +BACCHUS +BACH +BACHELOR +BACHELORS +BACILLI +BACILLUS +BACK +BACKACHE +BACKACHES +BACKARROW +BACKBEND +BACKBENDS +BACKBOARD +BACKBONE +BACKBONES +BACKDROP +BACKDROPS +BACKED +BACKER +BACKERS +BACKFILL +BACKFIRING +BACKGROUND +BACKGROUNDS +BACKHAND +BACKING +BACKLASH +BACKLOG +BACKLOGGED +BACKLOGS +BACKORDER +BACKPACK +BACKPACKS +BACKPLANE +BACKPLANES +BACKPLATE +BACKS +BACKSCATTER +BACKSCATTERED +BACKSCATTERING +BACKSCATTERS +BACKSIDE +BACKSLASH +BACKSLASHES +BACKSPACE +BACKSPACED +BACKSPACES +BACKSPACING +BACKSTAGE +BACKSTAIRS +BACKSTITCH +BACKSTITCHED +BACKSTITCHES +BACKSTITCHING +BACKSTOP +BACKTRACK +BACKTRACKED +BACKTRACKER +BACKTRACKERS +BACKTRACKING +BACKTRACKS +BACKUP +BACKUPS +BACKUS +BACKWARD +BACKWARDNESS +BACKWARDS +BACKWATER +BACKWATERS +BACKWOODS +BACKYARD +BACKYARDS +BACON +BACTERIA +BACTERIAL +BACTERIUM +BAD +BADE +BADEN +BADGE +BADGER +BADGERED +BADGERING +BADGERS +BADGES +BADLANDS +BADLY +BADMINTON +BADNESS +BAFFIN +BAFFLE +BAFFLED +BAFFLER +BAFFLERS +BAFFLING +BAG +BAGATELLE +BAGATELLES +BAGEL +BAGELS +BAGGAGE +BAGGED +BAGGER +BAGGERS +BAGGING +BAGGY +BAGHDAD +BAGLEY +BAGPIPE +BAGPIPES +BAGRODIA +BAGRODIAS +BAGS +BAH +BAHAMA +BAHAMAS +BAHREIN +BAIL +BAILEY +BAILEYS +BAILIFF +BAILIFFS +BAILING +BAIRD +BAIRDI +BAIRN +BAIT +BAITED +BAITER +BAITING +BAITS +BAJA +BAKE +BAKED +BAKELITE +BAKER +BAKERIES +BAKERS +BAKERSFIELD +BAKERY +BAKES +BAKHTIARI +BAKING +BAKLAVA +BAKU +BALALAIKA +BALALAIKAS +BALANCE +BALANCED +BALANCER +BALANCERS +BALANCES +BALANCING +BALBOA +BALCONIES +BALCONY +BALD +BALDING +BALDLY +BALDNESS +BALDWIN +BALE +BALEFUL +BALER +BALES +BALFOUR +BALI +BALINESE +BALK +BALKAN +BALKANIZATION +BALKANIZATIONS +BALKANIZE +BALKANIZED +BALKANIZES +BALKANIZING +BALKANS +BALKED +BALKINESS +BALKING +BALKS +BALKY +BALL +BALLAD +BALLADS +BALLARD +BALLARDS +BALLAST +BALLASTS +BALLED +BALLER +BALLERINA +BALLERINAS +BALLERS +BALLET +BALLETS +BALLGOWN +BALLING +BALLISTIC +BALLISTICS +BALLOON +BALLOONED +BALLOONER +BALLOONERS +BALLOONING +BALLOONS +BALLOT +BALLOTS +BALLPARK +BALLPARKS +BALLPLAYER +BALLPLAYERS +BALLROOM +BALLROOMS +BALLS +BALLYHOO +BALM +BALMS +BALMY +BALSA +BALSAM +BALTIC +BALTIMORE +BALTIMOREAN +BALUSTRADE +BALUSTRADES +BALZAC +BAMAKO +BAMBERGER +BAMBI +BAMBOO +BAN +BANACH +BANAL +BANALLY +BANANA +BANANAS +BANBURY +BANCROFT +BAND +BANDAGE +BANDAGED +BANDAGES +BANDAGING +BANDED +BANDIED +BANDIES +BANDING +BANDIT +BANDITS +BANDPASS +BANDS +BANDSTAND +BANDSTANDS +BANDWAGON +BANDWAGONS +BANDWIDTH +BANDWIDTHS +BANDY +BANDYING +BANE +BANEFUL +BANG +BANGED +BANGING +BANGLADESH +BANGLE +BANGLES +BANGOR +BANGS +BANGUI +BANISH +BANISHED +BANISHES +BANISHING +BANISHMENT +BANISTER +BANISTERS +BANJO +BANJOS +BANK +BANKED +BANKER +BANKERS +BANKING +BANKRUPT +BANKRUPTCIES +BANKRUPTCY +BANKRUPTED +BANKRUPTING +BANKRUPTS +BANKS +BANNED +BANNER +BANNERS +BANNING +BANQUET +BANQUETING +BANQUETINGS +BANQUETS +BANS +BANSHEE +BANSHEES +BANTAM +BANTER +BANTERED +BANTERING +BANTERS +BANTU +BANTUS +BAPTISM +BAPTISMAL +BAPTISMS +BAPTIST +BAPTISTE +BAPTISTERY +BAPTISTRIES +BAPTISTRY +BAPTISTS +BAPTIZE +BAPTIZED +BAPTIZES +BAPTIZING +BAR +BARB +BARBADOS +BARBARA +BARBARIAN +BARBARIANS +BARBARIC +BARBARISM +BARBARITIES +BARBARITY +BARBAROUS +BARBAROUSLY +BARBECUE +BARBECUED +BARBECUES +BARBED +BARBELL +BARBELLS +BARBER +BARBITAL +BARBITURATE +BARBITURATES +BARBOUR +BARBS +BARCELONA +BARCLAY +BARD +BARDS +BARE +BARED +BAREFACED +BAREFOOT +BAREFOOTED +BARELY +BARENESS +BARER +BARES +BAREST +BARFLIES +BARFLY +BARGAIN +BARGAINED +BARGAINING +BARGAINS +BARGE +BARGES +BARGING +BARHOP +BARING +BARITONE +BARITONES +BARIUM +BARK +BARKED +BARKER +BARKERS +BARKING +BARKS +BARLEY +BARLOW +BARN +BARNABAS +BARNARD +BARNES +BARNET +BARNETT +BARNEY +BARNHARD +BARNS +BARNSTORM +BARNSTORMED +BARNSTORMING +BARNSTORMS +BARNUM +BARNYARD +BARNYARDS +BAROMETER +BAROMETERS +BAROMETRIC +BARON +BARONESS +BARONIAL +BARONIES +BARONS +BARONY +BAROQUE +BAROQUENESS +BARR +BARRACK +BARRACKS +BARRAGE +BARRAGES +BARRED +BARREL +BARRELLED +BARRELLING +BARRELS +BARREN +BARRENNESS +BARRETT +BARRICADE +BARRICADES +BARRIER +BARRIERS +BARRING +BARRINGER +BARRINGTON +BARRON +BARROW +BARRY +BARRYMORE +BARRYMORES +BARS +BARSTOW +BART +BARTENDER +BARTENDERS +BARTER +BARTERED +BARTERING +BARTERS +BARTH +BARTHOLOMEW +BARTLETT +BARTOK +BARTON +BASAL +BASALT +BASCOM +BASE +BASEBALL +BASEBALLS +BASEBAND +BASEBOARD +BASEBOARDS +BASED +BASEL +BASELESS +BASELINE +BASELINES +BASELY +BASEMAN +BASEMENT +BASEMENTS +BASENESS +BASER +BASES +BASH +BASHED +BASHES +BASHFUL +BASHFULNESS +BASHING +BASIC +BASIC +BASIC +BASICALLY +BASICS +BASIE +BASIL +BASIN +BASING +BASINS +BASIS +BASK +BASKED +BASKET +BASKETBALL +BASKETBALLS +BASKETS +BASKING +BASQUE +BASS +BASSES +BASSET +BASSETT +BASSINET +BASSINETS +BASTARD +BASTARDS +BASTE +BASTED +BASTES +BASTING +BASTION +BASTIONS +BAT +BATAVIA +BATCH +BATCHED +BATCHELDER +BATCHES +BATEMAN +BATES +BATH +BATHE +BATHED +BATHER +BATHERS +BATHES +BATHING +BATHOS +BATHROBE +BATHROBES +BATHROOM +BATHROOMS +BATHS +BATHTUB +BATHTUBS +BATHURST +BATISTA +BATON +BATONS +BATOR +BATS +BATTALION +BATTALIONS +BATTED +BATTELLE +BATTEN +BATTENS +BATTER +BATTERED +BATTERIES +BATTERING +BATTERS +BATTERY +BATTING +BATTLE +BATTLED +BATTLEFIELD +BATTLEFIELDS +BATTLEFRONT +BATTLEFRONTS +BATTLEGROUND +BATTLEGROUNDS +BATTLEMENT +BATTLEMENTS +BATTLER +BATTLERS +BATTLES +BATTLESHIP +BATTLESHIPS +BATTLING +BAUBLE +BAUBLES +BAUD +BAUDELAIRE +BAUER +BAUHAUS +BAUSCH +BAUXITE +BAVARIA +BAVARIAN +BAWDY +BAWL +BAWLED +BAWLING +BAWLS +BAXTER +BAY +BAYDA +BAYED +BAYES +BAYESIAN +BAYING +BAYLOR +BAYONET +BAYONETS +BAYONNE +BAYOU +BAYOUS +BAYPORT +BAYREUTH +BAYS +BAZAAR +BAZAARS +BEACH +BEACHED +BEACHES +BEACHHEAD +BEACHHEADS +BEACHING +BEACON +BEACONS +BEAD +BEADED +BEADING +BEADLE +BEADLES +BEADS +BEADY +BEAGLE +BEAGLES +BEAK +BEAKED +BEAKER +BEAKERS +BEAKS +BEAM +BEAMED +BEAMER +BEAMERS +BEAMING +BEAMS +BEAN +BEANBAG +BEANED +BEANER +BEANERS +BEANING +BEANS +BEAR +BEARABLE +BEARABLY +BEARD +BEARDED +BEARDLESS +BEARDS +BEARDSLEY +BEARER +BEARERS +BEARING +BEARINGS +BEARISH +BEARS +BEAST +BEASTLY +BEASTS +BEAT +BEATABLE +BEATABLY +BEATEN +BEATER +BEATERS +BEATIFIC +BEATIFICATION +BEATIFY +BEATING +BEATINGS +BEATITUDE +BEATITUDES +BEATNIK +BEATNIKS +BEATRICE +BEATS +BEAU +BEAUCHAMPS +BEAUJOLAIS +BEAUMONT +BEAUREGARD +BEAUS +BEAUTEOUS +BEAUTEOUSLY +BEAUTIES +BEAUTIFICATIONS +BEAUTIFIED +BEAUTIFIER +BEAUTIFIERS +BEAUTIFIES +BEAUTIFUL +BEAUTIFULLY +BEAUTIFY +BEAUTIFYING +BEAUTY +BEAVER +BEAVERS +BEAVERTON +BECALM +BECALMED +BECALMING +BECALMS +BECAME +BECAUSE +BECHTEL +BECK +BECKER +BECKMAN +BECKON +BECKONED +BECKONING +BECKONS +BECKY +BECOME +BECOMES +BECOMING +BECOMINGLY +BED +BEDAZZLE +BEDAZZLED +BEDAZZLEMENT +BEDAZZLES +BEDAZZLING +BEDBUG +BEDBUGS +BEDDED +BEDDER +BEDDERS +BEDDING +BEDEVIL +BEDEVILED +BEDEVILING +BEDEVILS +BEDFAST +BEDFORD +BEDLAM +BEDPOST +BEDPOSTS +BEDRAGGLE +BEDRAGGLED +BEDRIDDEN +BEDROCK +BEDROOM +BEDROOMS +BEDS +BEDSIDE +BEDSPREAD +BEDSPREADS +BEDSPRING +BEDSPRINGS +BEDSTEAD +BEDSTEADS +BEDTIME +BEE +BEEBE +BEECH +BEECHAM +BEECHEN +BEECHER +BEEF +BEEFED +BEEFER +BEEFERS +BEEFING +BEEFS +BEEFSTEAK +BEEFY +BEEHIVE +BEEHIVES +BEEN +BEEP +BEEPS +BEER +BEERS +BEES +BEET +BEETHOVEN +BEETLE +BEETLED +BEETLES +BEETLING +BEETS +BEFALL +BEFALLEN +BEFALLING +BEFALLS +BEFELL +BEFIT +BEFITS +BEFITTED +BEFITTING +BEFOG +BEFOGGED +BEFOGGING +BEFORE +BEFOREHAND +BEFOUL +BEFOULED +BEFOULING +BEFOULS +BEFRIEND +BEFRIENDED +BEFRIENDING +BEFRIENDS +BEFUDDLE +BEFUDDLED +BEFUDDLES +BEFUDDLING +BEG +BEGAN +BEGET +BEGETS +BEGETTING +BEGGAR +BEGGARLY +BEGGARS +BEGGARY +BEGGED +BEGGING +BEGIN +BEGINNER +BEGINNERS +BEGINNING +BEGINNINGS +BEGINS +BEGOT +BEGOTTEN +BEGRUDGE +BEGRUDGED +BEGRUDGES +BEGRUDGING +BEGRUDGINGLY +BEGS +BEGUILE +BEGUILED +BEGUILES +BEGUILING +BEGUN +BEHALF +BEHAVE +BEHAVED +BEHAVES +BEHAVING +BEHAVIOR +BEHAVIORAL +BEHAVIORALLY +BEHAVIORISM +BEHAVIORISTIC +BEHAVIORS +BEHEAD +BEHEADING +BEHELD +BEHEMOTH +BEHEMOTHS +BEHEST +BEHIND +BEHOLD +BEHOLDEN +BEHOLDER +BEHOLDERS +BEHOLDING +BEHOLDS +BEHOOVE +BEHOOVES +BEIGE +BEIJING +BEING +BEINGS +BEIRUT +BELA +BELABOR +BELABORED +BELABORING +BELABORS +BELATED +BELATEDLY +BELAY +BELAYED +BELAYING +BELAYS +BELCH +BELCHED +BELCHES +BELCHING +BELFAST +BELFRIES +BELFRY +BELGIAN +BELGIANS +BELGIUM +BELGRADE +BELIE +BELIED +BELIEF +BELIEFS +BELIES +BELIEVABLE +BELIEVABLY +BELIEVE +BELIEVED +BELIEVER +BELIEVERS +BELIEVES +BELIEVING +BELITTLE +BELITTLED +BELITTLES +BELITTLING +BELIZE +BELL +BELLA +BELLAMY +BELLATRIX +BELLBOY +BELLBOYS +BELLE +BELLES +BELLEVILLE +BELLHOP +BELLHOPS +BELLICOSE +BELLICOSITY +BELLIES +BELLIGERENCE +BELLIGERENT +BELLIGERENTLY +BELLIGERENTS +BELLINGHAM +BELLINI +BELLMAN +BELLMEN +BELLOVIN +BELLOW +BELLOWED +BELLOWING +BELLOWS +BELLS +BELLUM +BELLWETHER +BELLWETHERS +BELLWOOD +BELLY +BELLYACHE +BELLYFULL +BELMONT +BELOIT +BELONG +BELONGED +BELONGING +BELONGINGS +BELONGS +BELOVED +BELOW +BELSHAZZAR +BELT +BELTED +BELTING +BELTON +BELTS +BELTSVILLE +BELUSHI +BELY +BELYING +BEMOAN +BEMOANED +BEMOANING +BEMOANS +BEN +BENARES +BENCH +BENCHED +BENCHES +BENCHMARK +BENCHMARKING +BENCHMARKS +BEND +BENDABLE +BENDER +BENDERS +BENDING +BENDIX +BENDS +BENEATH +BENEDICT +BENEDICTINE +BENEDICTION +BENEDICTIONS +BENEDIKT +BENEFACTOR +BENEFACTORS +BENEFICENCE +BENEFICENCES +BENEFICENT +BENEFICIAL +BENEFICIALLY +BENEFICIARIES +BENEFICIARY +BENEFIT +BENEFITED +BENEFITING +BENEFITS +BENEFITTED +BENEFITTING +BENELUX +BENEVOLENCE +BENEVOLENT +BENGAL +BENGALI +BENIGHTED +BENIGN +BENIGNLY +BENJAMIN +BENNETT +BENNINGTON +BENNY +BENSON +BENT +BENTHAM +BENTLEY +BENTLEYS +BENTON +BENZ +BENZEDRINE +BENZENE +BEOGRAD +BEOWULF +BEQUEATH +BEQUEATHAL +BEQUEATHED +BEQUEATHING +BEQUEATHS +BEQUEST +BEQUESTS +BERATE +BERATED +BERATES +BERATING +BEREA +BEREAVE +BEREAVED +BEREAVEMENT +BEREAVEMENTS +BEREAVES +BEREAVING +BEREFT +BERENICES +BERESFORD +BERET +BERETS +BERGEN +BERGLAND +BERGLUND +BERGMAN +BERGSON +BERGSTEN +BERGSTROM +BERIBBONED +BERIBERI +BERINGER +BERKELEY +BERKELIUM +BERKOWITZ +BERKSHIRE +BERKSHIRES +BERLIN +BERLINER +BERLINERS +BERLINIZE +BERLINIZES +BERLIOZ +BERLITZ +BERMAN +BERMUDA +BERN +BERNADINE +BERNARD +BERNARDINE +BERNARDINO +BERNARDO +BERNE +BERNET +BERNHARD +BERNICE +BERNIE +BERNIECE +BERNINI +BERNOULLI +BERNSTEIN +BERRA +BERRIES +BERRY +BERSERK +BERT +BERTH +BERTHA +BERTHS +BERTIE +BERTRAM +BERTRAND +BERWICK +BERYL +BERYLLIUM +BESEECH +BESEECHES +BESEECHING +BESET +BESETS +BESETTING +BESIDE +BESIDES +BESIEGE +BESIEGED +BESIEGER +BESIEGERS +BESIEGING +BESMIRCH +BESMIRCHED +BESMIRCHES +BESMIRCHING +BESOTTED +BESOTTER +BESOTTING +BESOUGHT +BESPEAK +BESPEAKS +BESPECTACLED +BESPOKE +BESS +BESSEL +BESSEMER +BESSEMERIZE +BESSEMERIZES +BESSIE +BEST +BESTED +BESTIAL +BESTING +BESTIR +BESTIRRING +BESTOW +BESTOWAL +BESTOWED +BESTS +BESTSELLER +BESTSELLERS +BESTSELLING +BET +BETA +BETATRON +BETEL +BETELGEUSE +BETHESDA +BETHLEHEM +BETIDE +BETRAY +BETRAYAL +BETRAYED +BETRAYER +BETRAYING +BETRAYS +BETROTH +BETROTHAL +BETROTHED +BETS +BETSEY +BETSY +BETTE +BETTER +BETTERED +BETTERING +BETTERMENT +BETTERMENTS +BETTERS +BETTIES +BETTING +BETTY +BETWEEN +BETWIXT +BEVEL +BEVELED +BEVELING +BEVELS +BEVERAGE +BEVERAGES +BEVERLY +BEVY +BEWAIL +BEWAILED +BEWAILING +BEWAILS +BEWARE +BEWHISKERED +BEWILDER +BEWILDERED +BEWILDERING +BEWILDERINGLY +BEWILDERMENT +BEWILDERS +BEWITCH +BEWITCHED +BEWITCHES +BEWITCHING +BEYOND +BHUTAN +BIALYSTOK +BIANCO +BIANNUAL +BIAS +BIASED +BIASES +BIASING +BIB +BIBBED +BIBBING +BIBLE +BIBLES +BIBLICAL +BIBLICALLY +BIBLIOGRAPHIC +BIBLIOGRAPHICAL +BIBLIOGRAPHIES +BIBLIOGRAPHY +BIBLIOPHILE +BIBS +BICAMERAL +BICARBONATE +BICENTENNIAL +BICEP +BICEPS +BICKER +BICKERED +BICKERING +BICKERS +BICONCAVE +BICONNECTED +BICONVEX +BICYCLE +BICYCLED +BICYCLER +BICYCLERS +BICYCLES +BICYCLING +BID +BIDDABLE +BIDDEN +BIDDER +BIDDERS +BIDDIES +BIDDING +BIDDLE +BIDDY +BIDE +BIDIRECTIONAL +BIDS +BIEN +BIENNIAL +BIENNIUM +BIENVILLE +BIER +BIERCE +BIFOCAL +BIFOCALS +BIFURCATE +BIG +BIGELOW +BIGGER +BIGGEST +BIGGS +BIGHT +BIGHTS +BIGNESS +BIGOT +BIGOTED +BIGOTRY +BIGOTS +BIHARMONIC +BIJECTION +BIJECTIONS +BIJECTIVE +BIJECTIVELY +BIKE +BIKES +BIKING +BIKINI +BIKINIS +BILABIAL +BILATERAL +BILATERALLY +BILBAO +BILBO +BILE +BILGE +BILGES +BILINEAR +BILINGUAL +BILK +BILKED +BILKING +BILKS +BILL +BILLBOARD +BILLBOARDS +BILLED +BILLER +BILLERS +BILLET +BILLETED +BILLETING +BILLETS +BILLIARD +BILLIARDS +BILLIE +BILLIKEN +BILLIKENS +BILLING +BILLINGS +BILLION +BILLIONS +BILLIONTH +BILLOW +BILLOWED +BILLOWS +BILLS +BILTMORE +BIMETALLIC +BIMETALLISM +BIMINI +BIMODAL +BIMOLECULAR +BIMONTHLIES +BIMONTHLY +BIN +BINARIES +BINARY +BINAURAL +BIND +BINDER +BINDERS +BINDING +BINDINGS +BINDS +BING +BINGE +BINGES +BINGHAM +BINGHAMTON +BINGO +BINI +BINOCULAR +BINOCULARS +BINOMIAL +BINS +BINUCLEAR +BIOCHEMICAL +BIOCHEMIST +BIOCHEMISTRY +BIOFEEDBACK +BIOGRAPHER +BIOGRAPHERS +BIOGRAPHIC +BIOGRAPHICAL +BIOGRAPHICALLY +BIOGRAPHIES +BIOGRAPHY +BIOLOGICAL +BIOLOGICALLY +BIOLOGIST +BIOLOGISTS +BIOLOGY +BIOMEDICAL +BIOMEDICINE +BIOPHYSICAL +BIOPHYSICIST +BIOPHYSICS +BIOPSIES +BIOPSY +BIOSCIENCE +BIOSPHERE +BIOSTATISTIC +BIOSYNTHESIZE +BIOTA +BIOTIC +BIPARTISAN +BIPARTITE +BIPED +BIPEDS +BIPLANE +BIPLANES +BIPOLAR +BIRACIAL +BIRCH +BIRCHEN +BIRCHES +BIRD +BIRDBATH +BIRDBATHS +BIRDIE +BIRDIED +BIRDIES +BIRDLIKE +BIRDS +BIREFRINGENCE +BIREFRINGENT +BIRGIT +BIRMINGHAM +BIRMINGHAMIZE +BIRMINGHAMIZES +BIRTH +BIRTHDAY +BIRTHDAYS +BIRTHED +BIRTHPLACE +BIRTHPLACES +BIRTHRIGHT +BIRTHRIGHTS +BIRTHS +BISCAYNE +BISCUIT +BISCUITS +BISECT +BISECTED +BISECTING +BISECTION +BISECTIONS +BISECTOR +BISECTORS +BISECTS +BISHOP +BISHOPS +BISMARCK +BISMARK +BISMUTH +BISON +BISONS +BISQUE +BISQUES +BISSAU +BISTABLE +BISTATE +BIT +BITCH +BITCHES +BITE +BITER +BITERS +BITES +BITING +BITINGLY +BITMAP +BITNET +BITS +BITTEN +BITTER +BITTERER +BITTEREST +BITTERLY +BITTERNESS +BITTERNUT +BITTERROOT +BITTERS +BITTERSWEET +BITUMEN +BITUMINOUS +BITWISE +BIVALVE +BIVALVES +BIVARIATE +BIVOUAC +BIVOUACS +BIWEEKLY +BIZARRE +BIZET +BLAB +BLABBED +BLABBERMOUTH +BLABBERMOUTHS +BLABBING +BLABS +BLACK +BLACKBERRIES +BLACKBERRY +BLACKBIRD +BLACKBIRDS +BLACKBOARD +BLACKBOARDS +BLACKBURN +BLACKED +BLACKEN +BLACKENED +BLACKENING +BLACKENS +BLACKER +BLACKEST +BLACKFEET +BLACKFOOT +BLACKFOOTS +BLACKING +BLACKJACK +BLACKJACKS +BLACKLIST +BLACKLISTED +BLACKLISTING +BLACKLISTS +BLACKLY +BLACKMAIL +BLACKMAILED +BLACKMAILER +BLACKMAILERS +BLACKMAILING +BLACKMAILS +BLACKMAN +BLACKMER +BLACKNESS +BLACKOUT +BLACKOUTS +BLACKS +BLACKSMITH +BLACKSMITHS +BLACKSTONE +BLACKWELL +BLACKWELLS +BLADDER +BLADDERS +BLADE +BLADES +BLAINE +BLAIR +BLAKE +BLAKEY +BLAMABLE +BLAME +BLAMED +BLAMELESS +BLAMELESSNESS +BLAMER +BLAMERS +BLAMES +BLAMEWORTHY +BLAMING +BLANCH +BLANCHARD +BLANCHE +BLANCHED +BLANCHES +BLANCHING +BLAND +BLANDLY +BLANDNESS +BLANK +BLANKED +BLANKER +BLANKEST +BLANKET +BLANKETED +BLANKETER +BLANKETERS +BLANKETING +BLANKETS +BLANKING +BLANKLY +BLANKNESS +BLANKS +BLANTON +BLARE +BLARED +BLARES +BLARING +BLASE +BLASPHEME +BLASPHEMED +BLASPHEMES +BLASPHEMIES +BLASPHEMING +BLASPHEMOUS +BLASPHEMOUSLY +BLASPHEMOUSNESS +BLASPHEMY +BLAST +BLASTED +BLASTER +BLASTERS +BLASTING +BLASTS +BLATANT +BLATANTLY +BLATZ +BLAZE +BLAZED +BLAZER +BLAZERS +BLAZES +BLAZING +BLEACH +BLEACHED +BLEACHER +BLEACHERS +BLEACHES +BLEACHING +BLEAK +BLEAKER +BLEAKLY +BLEAKNESS +BLEAR +BLEARY +BLEAT +BLEATING +BLEATS +BLED +BLEED +BLEEDER +BLEEDING +BLEEDINGS +BLEEDS +BLEEKER +BLEMISH +BLEMISHES +BLEND +BLENDED +BLENDER +BLENDING +BLENDS +BLENHEIM +BLESS +BLESSED +BLESSING +BLESSINGS +BLEW +BLIGHT +BLIGHTED +BLIMP +BLIMPS +BLIND +BLINDED +BLINDER +BLINDERS +BLINDFOLD +BLINDFOLDED +BLINDFOLDING +BLINDFOLDS +BLINDING +BLINDINGLY +BLINDLY +BLINDNESS +BLINDS +BLINK +BLINKED +BLINKER +BLINKERS +BLINKING +BLINKS +BLINN +BLIP +BLIPS +BLISS +BLISSFUL +BLISSFULLY +BLISTER +BLISTERED +BLISTERING +BLISTERS +BLITHE +BLITHELY +BLITZ +BLITZES +BLITZKRIEG +BLIZZARD +BLIZZARDS +BLOAT +BLOATED +BLOATER +BLOATING +BLOATS +BLOB +BLOBS +BLOC +BLOCH +BLOCK +BLOCKADE +BLOCKADED +BLOCKADES +BLOCKADING +BLOCKAGE +BLOCKAGES +BLOCKED +BLOCKER +BLOCKERS +BLOCKHOUSE +BLOCKHOUSES +BLOCKING +BLOCKS +BLOCS +BLOKE +BLOKES +BLOMBERG +BLOMQUIST +BLOND +BLONDE +BLONDES +BLONDS +BLOOD +BLOODBATH +BLOODED +BLOODHOUND +BLOODHOUNDS +BLOODIED +BLOODIEST +BLOODLESS +BLOODS +BLOODSHED +BLOODSHOT +BLOODSTAIN +BLOODSTAINED +BLOODSTAINS +BLOODSTREAM +BLOODY +BLOOM +BLOOMED +BLOOMERS +BLOOMFIELD +BLOOMING +BLOOMINGTON +BLOOMS +BLOOPER +BLOSSOM +BLOSSOMED +BLOSSOMS +BLOT +BLOTS +BLOTTED +BLOTTING +BLOUSE +BLOUSES +BLOW +BLOWER +BLOWERS +BLOWFISH +BLOWING +BLOWN +BLOWOUT +BLOWS +BLOWUP +BLUBBER +BLUDGEON +BLUDGEONED +BLUDGEONING +BLUDGEONS +BLUE +BLUEBERRIES +BLUEBERRY +BLUEBIRD +BLUEBIRDS +BLUEBONNET +BLUEBONNETS +BLUEFISH +BLUENESS +BLUEPRINT +BLUEPRINTS +BLUER +BLUES +BLUEST +BLUESTOCKING +BLUFF +BLUFFING +BLUFFS +BLUING +BLUISH +BLUM +BLUMENTHAL +BLUNDER +BLUNDERBUSS +BLUNDERED +BLUNDERING +BLUNDERINGS +BLUNDERS +BLUNT +BLUNTED +BLUNTER +BLUNTEST +BLUNTING +BLUNTLY +BLUNTNESS +BLUNTS +BLUR +BLURB +BLURRED +BLURRING +BLURRY +BLURS +BLURT +BLURTED +BLURTING +BLURTS +BLUSH +BLUSHED +BLUSHES +BLUSHING +BLUSTER +BLUSTERED +BLUSTERING +BLUSTERS +BLUSTERY +BLYTHE +BOA +BOAR +BOARD +BOARDED +BOARDER +BOARDERS +BOARDING +BOARDINGHOUSE +BOARDINGHOUSES +BOARDS +BOARSH +BOAST +BOASTED +BOASTER +BOASTERS +BOASTFUL +BOASTFULLY +BOASTING +BOASTINGS +BOASTS +BOAT +BOATER +BOATERS +BOATHOUSE +BOATHOUSES +BOATING +BOATLOAD +BOATLOADS +BOATMAN +BOATMEN +BOATS +BOATSMAN +BOATSMEN +BOATSWAIN +BOATSWAINS +BOATYARD +BOATYARDS +BOB +BOBBED +BOBBIE +BOBBIN +BOBBING +BOBBINS +BOBBSEY +BOBBY +BOBOLINK +BOBOLINKS +BOBROW +BOBS +BOBWHITE +BOBWHITES +BOCA +BODE +BODENHEIM +BODES +BODICE +BODIED +BODIES +BODILY +BODLEIAN +BODY +BODYBUILDER +BODYBUILDERS +BODYBUILDING +BODYGUARD +BODYGUARDS +BODYWEIGHT +BOEING +BOEOTIA +BOEOTIAN +BOER +BOERS +BOG +BOGART +BOGARTIAN +BOGEYMEN +BOGGED +BOGGLE +BOGGLED +BOGGLES +BOGGLING +BOGOTA +BOGS +BOGUS +BOHEME +BOHEMIA +BOHEMIAN +BOHEMIANISM +BOHR +BOIL +BOILED +BOILER +BOILERPLATE +BOILERS +BOILING +BOILS +BOIS +BOISE +BOISTEROUS +BOISTEROUSLY +BOLD +BOLDER +BOLDEST +BOLDFACE +BOLDLY +BOLDNESS +BOLIVIA +BOLIVIAN +BOLL +BOLOGNA +BOLSHEVIK +BOLSHEVIKS +BOLSHEVISM +BOLSHEVIST +BOLSHEVISTIC +BOLSHOI +BOLSTER +BOLSTERED +BOLSTERING +BOLSTERS +BOLT +BOLTED +BOLTING +BOLTON +BOLTS +BOLTZMANN +BOMB +BOMBARD +BOMBARDED +BOMBARDING +BOMBARDMENT +BOMBARDS +BOMBAST +BOMBASTIC +BOMBAY +BOMBED +BOMBER +BOMBERS +BOMBING +BOMBINGS +BOMBPROOF +BOMBS +BONANZA +BONANZAS +BONAPARTE +BONAVENTURE +BOND +BONDAGE +BONDED +BONDER +BONDERS +BONDING +BONDS +BONDSMAN +BONDSMEN +BONE +BONED +BONER +BONERS +BONES +BONFIRE +BONFIRES +BONG +BONHAM +BONIFACE +BONING +BONN +BONNET +BONNETED +BONNETS +BONNEVILLE +BONNIE +BONNY +BONTEMPO +BONUS +BONUSES +BONY +BOO +BOOB +BOOBOO +BOOBY +BOOK +BOOKCASE +BOOKCASES +BOOKED +BOOKER +BOOKERS +BOOKIE +BOOKIES +BOOKING +BOOKINGS +BOOKISH +BOOKKEEPER +BOOKKEEPERS +BOOKKEEPING +BOOKLET +BOOKLETS +BOOKMARK +BOOKS +BOOKSELLER +BOOKSELLERS +BOOKSHELF +BOOKSHELVES +BOOKSTORE +BOOKSTORES +BOOKWORM +BOOLEAN +BOOLEANS +BOOM +BOOMED +BOOMERANG +BOOMERANGS +BOOMING +BOOMS +BOON +BOONE +BOONTON +BOOR +BOORISH +BOORS +BOOS +BOOST +BOOSTED +BOOSTER +BOOSTING +BOOSTS +BOOT +BOOTABLE +BOOTED +BOOTES +BOOTH +BOOTHS +BOOTING +BOOTLE +BOOTLEG +BOOTLEGGED +BOOTLEGGER +BOOTLEGGERS +BOOTLEGGING +BOOTLEGS +BOOTS +BOOTSTRAP +BOOTSTRAPPED +BOOTSTRAPPING +BOOTSTRAPS +BOOTY +BOOZE +BORATE +BORATES +BORAX +BORDEAUX +BORDELLO +BORDELLOS +BORDEN +BORDER +BORDERED +BORDERING +BORDERINGS +BORDERLAND +BORDERLANDS +BORDERLINE +BORDERS +BORE +BOREALIS +BOREAS +BORED +BOREDOM +BORER +BORES +BORG +BORIC +BORING +BORIS +BORN +BORNE +BORNEO +BORON +BOROUGH +BOROUGHS +BORROUGHS +BORROW +BORROWED +BORROWER +BORROWERS +BORROWING +BORROWS +BOSCH +BOSE +BOSOM +BOSOMS +BOSPORUS +BOSS +BOSSED +BOSSES +BOSTITCH +BOSTON +BOSTONIAN +BOSTONIANS +BOSUN +BOSWELL +BOSWELLIZE +BOSWELLIZES +BOTANICAL +BOTANIST +BOTANISTS +BOTANY +BOTCH +BOTCHED +BOTCHER +BOTCHERS +BOTCHES +BOTCHING +BOTH +BOTHER +BOTHERED +BOTHERING +BOTHERS +BOTHERSOME +BOTSWANA +BOTTLE +BOTTLED +BOTTLENECK +BOTTLENECKS +BOTTLER +BOTTLERS +BOTTLES +BOTTLING +BOTTOM +BOTTOMED +BOTTOMING +BOTTOMLESS +BOTTOMS +BOTULINUS +BOTULISM +BOUCHER +BOUFFANT +BOUGH +BOUGHS +BOUGHT +BOULDER +BOULDERS +BOULEVARD +BOULEVARDS +BOUNCE +BOUNCED +BOUNCER +BOUNCES +BOUNCING +BOUNCY +BOUND +BOUNDARIES +BOUNDARY +BOUNDED +BOUNDEN +BOUNDING +BOUNDLESS +BOUNDLESSNESS +BOUNDS +BOUNTEOUS +BOUNTEOUSLY +BOUNTIES +BOUNTIFUL +BOUNTY +BOUQUET +BOUQUETS +BOURBAKI +BOURBON +BOURGEOIS +BOURGEOISIE +BOURNE +BOUSTROPHEDON +BOUSTROPHEDONIC +BOUT +BOUTIQUE +BOUTS +BOUVIER +BOVINE +BOVINES +BOW +BOWDITCH +BOWDLERIZE +BOWDLERIZED +BOWDLERIZES +BOWDLERIZING +BOWDOIN +BOWED +BOWEL +BOWELS +BOWEN +BOWER +BOWERS +BOWES +BOWING +BOWL +BOWLED +BOWLER +BOWLERS +BOWLINE +BOWLINES +BOWLING +BOWLS +BOWMAN +BOWS +BOWSTRING +BOWSTRINGS +BOX +BOXCAR +BOXCARS +BOXED +BOXER +BOXERS +BOXES +BOXFORD +BOXING +BOXTOP +BOXTOPS +BOXWOOD +BOY +BOYCE +BOYCOTT +BOYCOTTED +BOYCOTTS +BOYD +BOYFRIEND +BOYFRIENDS +BOYHOOD +BOYISH +BOYISHNESS +BOYLE +BOYLSTON +BOYS +BRA +BRACE +BRACED +BRACELET +BRACELETS +BRACES +BRACING +BRACKET +BRACKETED +BRACKETING +BRACKETS +BRACKISH +BRADBURY +BRADFORD +BRADLEY +BRADSHAW +BRADY +BRAE +BRAES +BRAG +BRAGG +BRAGGED +BRAGGER +BRAGGING +BRAGS +BRAHMAPUTRA +BRAHMS +BRAHMSIAN +BRAID +BRAIDED +BRAIDING +BRAIDS +BRAILLE +BRAIN +BRAINARD +BRAINARDS +BRAINCHILD +BRAINED +BRAINING +BRAINS +BRAINSTEM +BRAINSTEMS +BRAINSTORM +BRAINSTORMS +BRAINWASH +BRAINWASHED +BRAINWASHES +BRAINWASHING +BRAINY +BRAKE +BRAKED +BRAKEMAN +BRAKES +BRAKING +BRAMBLE +BRAMBLES +BRAMBLY +BRAN +BRANCH +BRANCHED +BRANCHES +BRANCHING +BRANCHINGS +BRANCHVILLE +BRAND +BRANDED +BRANDEIS +BRANDEL +BRANDENBURG +BRANDING +BRANDISH +BRANDISHES +BRANDISHING +BRANDON +BRANDS +BRANDT +BRANDY +BRANDYWINE +BRANIFF +BRANNON +BRAS +BRASH +BRASHLY +BRASHNESS +BRASILIA +BRASS +BRASSES +BRASSIERE +BRASSTOWN +BRASSY +BRAT +BRATS +BRAUN +BRAVADO +BRAVE +BRAVED +BRAVELY +BRAVENESS +BRAVER +BRAVERY +BRAVES +BRAVEST +BRAVING +BRAVO +BRAVOS +BRAWL +BRAWLER +BRAWLING +BRAWN +BRAY +BRAYED +BRAYER +BRAYING +BRAYS +BRAZE +BRAZED +BRAZEN +BRAZENLY +BRAZENNESS +BRAZES +BRAZIER +BRAZIERS +BRAZIL +BRAZILIAN +BRAZING +BRAZZAVILLE +BREACH +BREACHED +BREACHER +BREACHERS +BREACHES +BREACHING +BREAD +BREADBOARD +BREADBOARDS +BREADBOX +BREADBOXES +BREADED +BREADING +BREADS +BREADTH +BREADWINNER +BREADWINNERS +BREAK +BREAKABLE +BREAKABLES +BREAKAGE +BREAKAWAY +BREAKDOWN +BREAKDOWNS +BREAKER +BREAKERS +BREAKFAST +BREAKFASTED +BREAKFASTER +BREAKFASTERS +BREAKFASTING +BREAKFASTS +BREAKING +BREAKPOINT +BREAKPOINTS +BREAKS +BREAKTHROUGH +BREAKTHROUGHES +BREAKTHROUGHS +BREAKUP +BREAKWATER +BREAKWATERS +BREAST +BREASTED +BREASTS +BREASTWORK +BREASTWORKS +BREATH +BREATHABLE +BREATHE +BREATHED +BREATHER +BREATHERS +BREATHES +BREATHING +BREATHLESS +BREATHLESSLY +BREATHS +BREATHTAKING +BREATHTAKINGLY +BREATHY +BRED +BREECH +BREECHES +BREED +BREEDER +BREEDING +BREEDS +BREEZE +BREEZES +BREEZILY +BREEZY +BREMEN +BREMSSTRAHLUNG +BRENDA +BRENDAN +BRENNAN +BRENNER +BRENT +BRESENHAM +BREST +BRETHREN +BRETON +BRETONS +BRETT +BREVE +BREVET +BREVETED +BREVETING +BREVETS +BREVITY +BREW +BREWED +BREWER +BREWERIES +BREWERS +BREWERY +BREWING +BREWS +BREWSTER +BRIAN +BRIAR +BRIARS +BRIBE +BRIBED +BRIBER +BRIBERS +BRIBERY +BRIBES +BRIBING +BRICE +BRICK +BRICKBAT +BRICKED +BRICKER +BRICKLAYER +BRICKLAYERS +BRICKLAYING +BRICKS +BRIDAL +BRIDE +BRIDEGROOM +BRIDES +BRIDESMAID +BRIDESMAIDS +BRIDEWELL +BRIDGE +BRIDGEABLE +BRIDGED +BRIDGEHEAD +BRIDGEHEADS +BRIDGEPORT +BRIDGES +BRIDGET +BRIDGETOWN +BRIDGEWATER +BRIDGEWORK +BRIDGING +BRIDLE +BRIDLED +BRIDLES +BRIDLING +BRIE +BRIEF +BRIEFCASE +BRIEFCASES +BRIEFED +BRIEFER +BRIEFEST +BRIEFING +BRIEFINGS +BRIEFLY +BRIEFNESS +BRIEFS +BRIEN +BRIER +BRIG +BRIGADE +BRIGADES +BRIGADIER +BRIGADIERS +BRIGADOON +BRIGANTINE +BRIGGS +BRIGHAM +BRIGHT +BRIGHTEN +BRIGHTENED +BRIGHTENER +BRIGHTENERS +BRIGHTENING +BRIGHTENS +BRIGHTER +BRIGHTEST +BRIGHTLY +BRIGHTNESS +BRIGHTON +BRIGS +BRILLIANCE +BRILLIANCY +BRILLIANT +BRILLIANTLY +BRILLOUIN +BRIM +BRIMFUL +BRIMMED +BRIMMING +BRIMSTONE +BRINDISI +BRINDLE +BRINDLED +BRINE +BRING +BRINGER +BRINGERS +BRINGING +BRINGS +BRINK +BRINKLEY +BRINKMANSHIP +BRINY +BRISBANE +BRISK +BRISKER +BRISKLY +BRISKNESS +BRISTLE +BRISTLED +BRISTLES +BRISTLING +BRISTOL +BRITAIN +BRITANNIC +BRITANNICA +BRITCHES +BRITISH +BRITISHER +BRITISHLY +BRITON +BRITONS +BRITTANY +BRITTEN +BRITTLE +BRITTLENESS +BROACH +BROACHED +BROACHES +BROACHING +BROAD +BROADBAND +BROADCAST +BROADCASTED +BROADCASTER +BROADCASTERS +BROADCASTING +BROADCASTINGS +BROADCASTS +BROADEN +BROADENED +BROADENER +BROADENERS +BROADENING +BROADENINGS +BROADENS +BROADER +BROADEST +BROADLY +BROADNESS +BROADSIDE +BROADWAY +BROCADE +BROCADED +BROCCOLI +BROCHURE +BROCHURES +BROCK +BROGLIE +BROIL +BROILED +BROILER +BROILERS +BROILING +BROILS +BROKE +BROKEN +BROKENLY +BROKENNESS +BROKER +BROKERAGE +BROKERS +BROMFIELD +BROMIDE +BROMIDES +BROMINE +BROMLEY +BRONCHI +BRONCHIAL +BRONCHIOLE +BRONCHIOLES +BRONCHITIS +BRONCHUS +BRONTOSAURUS +BRONX +BRONZE +BRONZED +BRONZES +BROOCH +BROOCHES +BROOD +BROODER +BROODING +BROODS +BROOK +BROOKDALE +BROOKE +BROOKED +BROOKFIELD +BROOKHAVEN +BROOKLINE +BROOKLYN +BROOKMONT +BROOKS +BROOM +BROOMS +BROOMSTICK +BROOMSTICKS +BROTH +BROTHEL +BROTHELS +BROTHER +BROTHERHOOD +BROTHERLINESS +BROTHERLY +BROTHERS +BROUGHT +BROW +BROWBEAT +BROWBEATEN +BROWBEATING +BROWBEATS +BROWN +BROWNE +BROWNED +BROWNELL +BROWNER +BROWNEST +BROWNIAN +BROWNIE +BROWNIES +BROWNING +BROWNISH +BROWNNESS +BROWNS +BROWS +BROWSE +BROWSING +BRUCE +BRUCKNER +BRUEGEL +BRUISE +BRUISED +BRUISES +BRUISING +BRUMIDI +BRUNCH +BRUNCHES +BRUNETTE +BRUNHILDE +BRUNO +BRUNSWICK +BRUNT +BRUSH +BRUSHED +BRUSHES +BRUSHFIRE +BRUSHFIRES +BRUSHING +BRUSHLIKE +BRUSHY +BRUSQUE +BRUSQUELY +BRUSSELS +BRUTAL +BRUTALITIES +BRUTALITY +BRUTALIZE +BRUTALIZED +BRUTALIZES +BRUTALIZING +BRUTALLY +BRUTE +BRUTES +BRUTISH +BRUXELLES +BRYAN +BRYANT +BRYCE +BRYN +BUBBLE +BUBBLED +BUBBLES +BUBBLING +BUBBLY +BUCHANAN +BUCHAREST +BUCHENWALD +BUCHWALD +BUCK +BUCKBOARD +BUCKBOARDS +BUCKED +BUCKET +BUCKETS +BUCKING +BUCKLE +BUCKLED +BUCKLER +BUCKLES +BUCKLEY +BUCKLING +BUCKNELL +BUCKS +BUCKSHOT +BUCKSKIN +BUCKSKINS +BUCKWHEAT +BUCKY +BUCOLIC +BUD +BUDAPEST +BUDD +BUDDED +BUDDHA +BUDDHISM +BUDDHIST +BUDDHISTS +BUDDIES +BUDDING +BUDDY +BUDGE +BUDGED +BUDGES +BUDGET +BUDGETARY +BUDGETED +BUDGETER +BUDGETERS +BUDGETING +BUDGETS +BUDGING +BUDS +BUDWEISER +BUDWEISERS +BUEHRING +BUENA +BUENOS +BUFF +BUFFALO +BUFFALOES +BUFFER +BUFFERED +BUFFERING +BUFFERS +BUFFET +BUFFETED +BUFFETING +BUFFETINGS +BUFFETS +BUFFOON +BUFFOONS +BUFFS +BUG +BUGABOO +BUGATTI +BUGEYED +BUGGED +BUGGER +BUGGERS +BUGGIES +BUGGING +BUGGY +BUGLE +BUGLED +BUGLER +BUGLES +BUGLING +BUGS +BUICK +BUILD +BUILDER +BUILDERS +BUILDING +BUILDINGS +BUILDS +BUILDUP +BUILDUPS +BUILT +BUILTIN +BUJUMBURA +BULB +BULBA +BULBS +BULGARIA +BULGARIAN +BULGE +BULGED +BULGING +BULK +BULKED +BULKHEAD +BULKHEADS +BULKS +BULKY +BULL +BULLDOG +BULLDOGS +BULLDOZE +BULLDOZED +BULLDOZER +BULLDOZES +BULLDOZING +BULLED +BULLET +BULLETIN +BULLETINS +BULLETS +BULLFROG +BULLIED +BULLIES +BULLING +BULLION +BULLISH +BULLOCK +BULLS +BULLSEYE +BULLY +BULLYING +BULWARK +BUM +BUMBLE +BUMBLEBEE +BUMBLEBEES +BUMBLED +BUMBLER +BUMBLERS +BUMBLES +BUMBLING +BUMBRY +BUMMED +BUMMING +BUMP +BUMPED +BUMPER +BUMPERS +BUMPING +BUMPS +BUMPTIOUS +BUMPTIOUSLY +BUMPTIOUSNESS +BUMS +BUN +BUNCH +BUNCHED +BUNCHES +BUNCHING +BUNDESTAG +BUNDLE +BUNDLED +BUNDLES +BUNDLING +BUNDOORA +BUNDY +BUNGALOW +BUNGALOWS +BUNGLE +BUNGLED +BUNGLER +BUNGLERS +BUNGLES +BUNGLING +BUNION +BUNIONS +BUNK +BUNKER +BUNKERED +BUNKERS +BUNKHOUSE +BUNKHOUSES +BUNKMATE +BUNKMATES +BUNKS +BUNNIES +BUNNY +BUNS +BUNSEN +BUNT +BUNTED +BUNTER +BUNTERS +BUNTING +BUNTS +BUNYAN +BUOY +BUOYANCY +BUOYANT +BUOYED +BUOYS +BURBANK +BURCH +BURDEN +BURDENED +BURDENING +BURDENS +BURDENSOME +BUREAU +BUREAUCRACIES +BUREAUCRACY +BUREAUCRAT +BUREAUCRATIC +BUREAUCRATS +BUREAUS +BURGEON +BURGEONED +BURGEONING +BURGESS +BURGESSES +BURGHER +BURGHERS +BURGLAR +BURGLARIES +BURGLARIZE +BURGLARIZED +BURGLARIZES +BURGLARIZING +BURGLARPROOF +BURGLARPROOFED +BURGLARPROOFING +BURGLARPROOFS +BURGLARS +BURGLARY +BURGUNDIAN +BURGUNDIES +BURGUNDY +BURIAL +BURIED +BURIES +BURKE +BURKES +BURL +BURLESQUE +BURLESQUES +BURLINGAME +BURLINGTON +BURLY +BURMA +BURMESE +BURN +BURNE +BURNED +BURNER +BURNERS +BURNES +BURNETT +BURNHAM +BURNING +BURNINGLY +BURNINGS +BURNISH +BURNISHED +BURNISHES +BURNISHING +BURNS +BURNSIDE +BURNSIDES +BURNT +BURNTLY +BURNTNESS +BURP +BURPED +BURPING +BURPS +BURR +BURROUGHS +BURROW +BURROWED +BURROWER +BURROWING +BURROWS +BURRS +BURSA +BURSITIS +BURST +BURSTINESS +BURSTING +BURSTS +BURSTY +BURT +BURTON +BURTT +BURUNDI +BURY +BURYING +BUS +BUSBOY +BUSBOYS +BUSCH +BUSED +BUSES +BUSH +BUSHEL +BUSHELS +BUSHES +BUSHING +BUSHNELL +BUSHWHACK +BUSHWHACKED +BUSHWHACKING +BUSHWHACKS +BUSHY +BUSIED +BUSIER +BUSIEST +BUSILY +BUSINESS +BUSINESSES +BUSINESSLIKE +BUSINESSMAN +BUSINESSMEN +BUSING +BUSS +BUSSED +BUSSES +BUSSING +BUST +BUSTARD +BUSTARDS +BUSTED +BUSTER +BUSTLE +BUSTLING +BUSTS +BUSY +BUT +BUTANE +BUTCHER +BUTCHERED +BUTCHERS +BUTCHERY +BUTLER +BUTLERS +BUTT +BUTTE +BUTTED +BUTTER +BUTTERBALL +BUTTERCUP +BUTTERED +BUTTERER +BUTTERERS +BUTTERFAT +BUTTERFIELD +BUTTERFLIES +BUTTERFLY +BUTTERING +BUTTERMILK +BUTTERNUT +BUTTERS +BUTTERY +BUTTES +BUTTING +BUTTOCK +BUTTOCKS +BUTTON +BUTTONED +BUTTONHOLE +BUTTONHOLES +BUTTONING +BUTTONS +BUTTRESS +BUTTRESSED +BUTTRESSES +BUTTRESSING +BUTTRICK +BUTTS +BUTYL +BUTYRATE +BUXOM +BUXTEHUDE +BUXTON +BUY +BUYER +BUYERS +BUYING +BUYS +BUZZ +BUZZARD +BUZZARDS +BUZZED +BUZZER +BUZZES +BUZZING +BUZZWORD +BUZZWORDS +BUZZY +BYE +BYERS +BYGONE +BYLAW +BYLAWS +BYLINE +BYLINES +BYPASS +BYPASSED +BYPASSES +BYPASSING +BYPRODUCT +BYPRODUCTS +BYRD +BYRNE +BYRON +BYRONIC +BYRONISM +BYRONIZE +BYRONIZES +BYSTANDER +BYSTANDERS +BYTE +BYTES +BYWAY +BYWAYS +BYWORD +BYWORDS +BYZANTINE +BYZANTINIZE +BYZANTINIZES +BYZANTIUM +CAB +CABAL +CABANA +CABARET +CABBAGE +CABBAGES +CABDRIVER +CABIN +CABINET +CABINETS +CABINS +CABLE +CABLED +CABLES +CABLING +CABOOSE +CABOT +CABS +CACHE +CACHED +CACHES +CACHING +CACKLE +CACKLED +CACKLER +CACKLES +CACKLING +CACTI +CACTUS +CADAVER +CADENCE +CADENCED +CADILLAC +CADILLACS +CADRES +CADY +CAESAR +CAESARIAN +CAESARIZE +CAESARIZES +CAFE +CAFES +CAFETERIA +CAGE +CAGED +CAGER +CAGERS +CAGES +CAGING +CAHILL +CAIMAN +CAIN +CAINE +CAIRN +CAIRO +CAJOLE +CAJOLED +CAJOLES +CAJOLING +CAJUN +CAJUNS +CAKE +CAKED +CAKES +CAKING +CALAIS +CALAMITIES +CALAMITOUS +CALAMITY +CALCEOLARIA +CALCIFY +CALCIUM +CALCOMP +CALCOMP +CALCOMP +CALCULATE +CALCULATED +CALCULATES +CALCULATING +CALCULATION +CALCULATIONS +CALCULATIVE +CALCULATOR +CALCULATORS +CALCULI +CALCULUS +CALCUTTA +CALDER +CALDERA +CALDWELL +CALEB +CALENDAR +CALENDARS +CALF +CALFSKIN +CALGARY +CALHOUN +CALIBER +CALIBERS +CALIBRATE +CALIBRATED +CALIBRATES +CALIBRATING +CALIBRATION +CALIBRATIONS +CALICO +CALIFORNIA +CALIFORNIAN +CALIFORNIANS +CALIGULA +CALIPH +CALIPHS +CALKINS +CALL +CALLABLE +CALLAGHAN +CALLAHAN +CALLAN +CALLED +CALLER +CALLERS +CALLING +CALLIOPE +CALLISTO +CALLOUS +CALLOUSED +CALLOUSLY +CALLOUSNESS +CALLS +CALLUS +CALM +CALMED +CALMER +CALMEST +CALMING +CALMINGLY +CALMLY +CALMNESS +CALMS +CALORIC +CALORIE +CALORIES +CALORIMETER +CALORIMETRIC +CALORIMETRY +CALTECH +CALUMNY +CALVARY +CALVE +CALVERT +CALVES +CALVIN +CALVINIST +CALVINIZE +CALVINIZES +CALYPSO +CAM +CAMBODIA +CAMBRIAN +CAMBRIDGE +CAMDEN +CAME +CAMEL +CAMELOT +CAMELS +CAMEMBERT +CAMERA +CAMERAMAN +CAMERAMEN +CAMERAS +CAMERON +CAMEROON +CAMEROUN +CAMILLA +CAMILLE +CAMINO +CAMOUFLAGE +CAMOUFLAGED +CAMOUFLAGES +CAMOUFLAGING +CAMP +CAMPAIGN +CAMPAIGNED +CAMPAIGNER +CAMPAIGNERS +CAMPAIGNING +CAMPAIGNS +CAMPBELL +CAMPBELLSPORT +CAMPED +CAMPER +CAMPERS +CAMPFIRE +CAMPGROUND +CAMPING +CAMPS +CAMPSITE +CAMPUS +CAMPUSES +CAN +CANAAN +CANADA +CANADIAN +CANADIANIZATION +CANADIANIZATIONS +CANADIANIZE +CANADIANIZES +CANADIANS +CANAL +CANALS +CANARIES +CANARY +CANAVERAL +CANBERRA +CANCEL +CANCELED +CANCELING +CANCELLATION +CANCELLATIONS +CANCELS +CANCER +CANCEROUS +CANCERS +CANDACE +CANDID +CANDIDACY +CANDIDATE +CANDIDATES +CANDIDE +CANDIDLY +CANDIDNESS +CANDIED +CANDIES +CANDLE +CANDLELIGHT +CANDLER +CANDLES +CANDLESTICK +CANDLESTICKS +CANDLEWICK +CANDOR +CANDY +CANE +CANER +CANFIELD +CANINE +CANIS +CANISTER +CANKER +CANKERWORM +CANNABIS +CANNED +CANNEL +CANNER +CANNERS +CANNERY +CANNIBAL +CANNIBALIZE +CANNIBALIZED +CANNIBALIZES +CANNIBALIZING +CANNIBALS +CANNING +CANNISTER +CANNISTERS +CANNON +CANNONBALL +CANNONS +CANNOT +CANNY +CANOE +CANOES +CANOGA +CANON +CANONIC +CANONICAL +CANONICALIZATION +CANONICALIZE +CANONICALIZED +CANONICALIZES +CANONICALIZING +CANONICALLY +CANONICALS +CANONS +CANOPUS +CANOPY +CANS +CANT +CANTABRIGIAN +CANTALOUPE +CANTANKEROUS +CANTANKEROUSLY +CANTEEN +CANTERBURY +CANTILEVER +CANTO +CANTON +CANTONESE +CANTONS +CANTOR +CANTORS +CANUTE +CANVAS +CANVASES +CANVASS +CANVASSED +CANVASSER +CANVASSERS +CANVASSES +CANVASSING +CANYON +CANYONS +CAP +CAPABILITIES +CAPABILITY +CAPABLE +CAPABLY +CAPACIOUS +CAPACIOUSLY +CAPACIOUSNESS +CAPACITANCE +CAPACITANCES +CAPACITIES +CAPACITIVE +CAPACITOR +CAPACITORS +CAPACITY +CAPE +CAPER +CAPERS +CAPES +CAPET +CAPETOWN +CAPILLARY +CAPISTRANO +CAPITA +CAPITAL +CAPITALISM +CAPITALIST +CAPITALISTS +CAPITALIZATION +CAPITALIZATIONS +CAPITALIZE +CAPITALIZED +CAPITALIZER +CAPITALIZERS +CAPITALIZES +CAPITALIZING +CAPITALLY +CAPITALS +CAPITAN +CAPITOL +CAPITOLINE +CAPITOLS +CAPPED +CAPPING +CAPPY +CAPRICE +CAPRICIOUS +CAPRICIOUSLY +CAPRICIOUSNESS +CAPRICORN +CAPS +CAPSICUM +CAPSTAN +CAPSTONE +CAPSULE +CAPTAIN +CAPTAINED +CAPTAINING +CAPTAINS +CAPTION +CAPTIONS +CAPTIVATE +CAPTIVATED +CAPTIVATES +CAPTIVATING +CAPTIVATION +CAPTIVE +CAPTIVES +CAPTIVITY +CAPTOR +CAPTORS +CAPTURE +CAPTURED +CAPTURER +CAPTURERS +CAPTURES +CAPTURING +CAPUTO +CAPYBARA +CAR +CARACAS +CARAMEL +CARAVAN +CARAVANS +CARAWAY +CARBOHYDRATE +CARBOLIC +CARBOLOY +CARBON +CARBONATE +CARBONATES +CARBONATION +CARBONDALE +CARBONE +CARBONES +CARBONIC +CARBONIZATION +CARBONIZE +CARBONIZED +CARBONIZER +CARBONIZERS +CARBONIZES +CARBONIZING +CARBONS +CARBORUNDUM +CARBUNCLE +CARCASS +CARCASSES +CARCINOGEN +CARCINOGENIC +CARCINOMA +CARD +CARDBOARD +CARDER +CARDIAC +CARDIFF +CARDINAL +CARDINALITIES +CARDINALITY +CARDINALLY +CARDINALS +CARDIOD +CARDIOLOGY +CARDIOVASCULAR +CARDS +CARE +CARED +CAREEN +CAREER +CAREERS +CAREFREE +CAREFUL +CAREFULLY +CAREFULNESS +CARELESS +CARELESSLY +CARELESSNESS +CARES +CARESS +CARESSED +CARESSER +CARESSES +CARESSING +CARET +CARETAKER +CAREY +CARGILL +CARGO +CARGOES +CARIB +CARIBBEAN +CARIBOU +CARICATURE +CARING +CARL +CARLA +CARLETON +CARLETONIAN +CARLIN +CARLISLE +CARLO +CARLOAD +CARLSBAD +CARLSBADS +CARLSON +CARLTON +CARLYLE +CARMELA +CARMEN +CARMICHAEL +CARNAGE +CARNAL +CARNATION +CARNEGIE +CARNIVAL +CARNIVALS +CARNIVOROUS +CARNIVOROUSLY +CAROL +CAROLINA +CAROLINAS +CAROLINE +CAROLINGIAN +CAROLINIAN +CAROLINIANS +CAROLS +CAROLYN +CARP +CARPATHIA +CARPATHIANS +CARPENTER +CARPENTERS +CARPENTRY +CARPET +CARPETED +CARPETING +CARPETS +CARPORT +CARR +CARRARA +CARRIAGE +CARRIAGES +CARRIE +CARRIED +CARRIER +CARRIERS +CARRIES +CARRION +CARROLL +CARROT +CARROTS +CARRUTHERS +CARRY +CARRYING +CARRYOVER +CARRYOVERS +CARS +CARSON +CART +CARTED +CARTEL +CARTER +CARTERS +CARTESIAN +CARTHAGE +CARTHAGINIAN +CARTILAGE +CARTING +CARTOGRAPHER +CARTOGRAPHIC +CARTOGRAPHY +CARTON +CARTONS +CARTOON +CARTOONS +CARTRIDGE +CARTRIDGES +CARTS +CARTWHEEL +CARTY +CARUSO +CARVE +CARVED +CARVER +CARVES +CARVING +CARVINGS +CASANOVA +CASCADABLE +CASCADE +CASCADED +CASCADES +CASCADING +CASE +CASED +CASEMENT +CASEMENTS +CASES +CASEWORK +CASEY +CASH +CASHED +CASHER +CASHERS +CASHES +CASHEW +CASHIER +CASHIERS +CASHING +CASHMERE +CASING +CASINGS +CASINO +CASK +CASKET +CASKETS +CASKS +CASPIAN +CASSANDRA +CASSEROLE +CASSEROLES +CASSETTE +CASSIOPEIA +CASSITE +CASSITES +CASSIUS +CASSOCK +CAST +CASTE +CASTER +CASTERS +CASTES +CASTIGATE +CASTILLO +CASTING +CASTLE +CASTLED +CASTLES +CASTOR +CASTRO +CASTROISM +CASTS +CASUAL +CASUALLY +CASUALNESS +CASUALS +CASUALTIES +CASUALTY +CAT +CATACLYSMIC +CATALAN +CATALINA +CATALOG +CATALOGED +CATALOGER +CATALOGING +CATALOGS +CATALONIA +CATALYST +CATALYSTS +CATALYTIC +CATAPULT +CATARACT +CATASTROPHE +CATASTROPHES +CATASTROPHIC +CATAWBA +CATCH +CATCHABLE +CATCHER +CATCHERS +CATCHES +CATCHING +CATEGORICAL +CATEGORICALLY +CATEGORIES +CATEGORIZATION +CATEGORIZE +CATEGORIZED +CATEGORIZER +CATEGORIZERS +CATEGORIZES +CATEGORIZING +CATEGORY +CATER +CATERED +CATERER +CATERING +CATERPILLAR +CATERPILLARS +CATERS +CATHEDRAL +CATHEDRALS +CATHERINE +CATHERWOOD +CATHETER +CATHETERS +CATHODE +CATHODES +CATHOLIC +CATHOLICISM +CATHOLICISMS +CATHOLICS +CATHY +CATLIKE +CATNIP +CATS +CATSKILL +CATSKILLS +CATSUP +CATTAIL +CATTLE +CATTLEMAN +CATTLEMEN +CAUCASIAN +CAUCASIANS +CAUCASUS +CAUCHY +CAUCUS +CAUGHT +CAULDRON +CAULDRONS +CAULIFLOWER +CAULK +CAUSAL +CAUSALITY +CAUSALLY +CAUSATION +CAUSATIONS +CAUSE +CAUSED +CAUSER +CAUSES +CAUSEWAY +CAUSEWAYS +CAUSING +CAUSTIC +CAUSTICLY +CAUSTICS +CAUTION +CAUTIONED +CAUTIONER +CAUTIONERS +CAUTIONING +CAUTIONINGS +CAUTIONS +CAUTIOUS +CAUTIOUSLY +CAUTIOUSNESS +CAVALIER +CAVALIERLY +CAVALIERNESS +CAVALRY +CAVE +CAVEAT +CAVEATS +CAVED +CAVEMAN +CAVEMEN +CAVENDISH +CAVERN +CAVERNOUS +CAVERNS +CAVES +CAVIAR +CAVIL +CAVINESS +CAVING +CAVITIES +CAVITY +CAW +CAWING +CAYLEY +CAYUGA +CEASE +CEASED +CEASELESS +CEASELESSLY +CEASELESSNESS +CEASES +CEASING +CECIL +CECILIA +CECROPIA +CEDAR +CEDE +CEDED +CEDING +CEDRIC +CEILING +CEILINGS +CELANESE +CELEBES +CELEBRATE +CELEBRATED +CELEBRATES +CELEBRATING +CELEBRATION +CELEBRATIONS +CELEBRITIES +CELEBRITY +CELERITY +CELERY +CELESTE +CELESTIAL +CELESTIALLY +CELIA +CELL +CELLAR +CELLARS +CELLED +CELLIST +CELLISTS +CELLOPHANE +CELLS +CELLULAR +CELLULOSE +CELSIUS +CELT +CELTIC +CELTICIZE +CELTICIZES +CEMENT +CEMENTED +CEMENTING +CEMENTS +CEMETERIES +CEMETERY +CENOZOIC +CENSOR +CENSORED +CENSORING +CENSORS +CENSORSHIP +CENSURE +CENSURED +CENSURER +CENSURES +CENSUS +CENSUSES +CENT +CENTAUR +CENTENARY +CENTENNIAL +CENTER +CENTERED +CENTERING +CENTERPIECE +CENTERPIECES +CENTERS +CENTIGRADE +CENTIMETER +CENTIMETERS +CENTIPEDE +CENTIPEDES +CENTRAL +CENTRALIA +CENTRALISM +CENTRALIST +CENTRALIZATION +CENTRALIZE +CENTRALIZED +CENTRALIZES +CENTRALIZING +CENTRALLY +CENTREX +CENTREX +CENTRIFUGAL +CENTRIFUGE +CENTRIPETAL +CENTRIST +CENTROID +CENTS +CENTURIES +CENTURY +CEPHEUS +CERAMIC +CERBERUS +CEREAL +CEREALS +CEREBELLUM +CEREBRAL +CEREMONIAL +CEREMONIALLY +CEREMONIALNESS +CEREMONIES +CEREMONY +CERES +CERN +CERTAIN +CERTAINLY +CERTAINTIES +CERTAINTY +CERTIFIABLE +CERTIFICATE +CERTIFICATES +CERTIFICATION +CERTIFICATIONS +CERTIFIED +CERTIFIER +CERTIFIERS +CERTIFIES +CERTIFY +CERTIFYING +CERVANTES +CESARE +CESSATION +CESSATIONS +CESSNA +CETUS +CEYLON +CEZANNE +CEZANNES +CHABLIS +CHABLISES +CHAD +CHADWICK +CHAFE +CHAFER +CHAFF +CHAFFER +CHAFFEY +CHAFFING +CHAFING +CHAGRIN +CHAIN +CHAINED +CHAINING +CHAINS +CHAIR +CHAIRED +CHAIRING +CHAIRLADY +CHAIRMAN +CHAIRMEN +CHAIRPERSON +CHAIRPERSONS +CHAIRS +CHAIRWOMAN +CHAIRWOMEN +CHALICE +CHALICES +CHALK +CHALKED +CHALKING +CHALKS +CHALLENGE +CHALLENGED +CHALLENGER +CHALLENGERS +CHALLENGES +CHALLENGING +CHALMERS +CHAMBER +CHAMBERED +CHAMBERLAIN +CHAMBERLAINS +CHAMBERMAID +CHAMBERS +CHAMELEON +CHAMPAGNE +CHAMPAIGN +CHAMPION +CHAMPIONED +CHAMPIONING +CHAMPIONS +CHAMPIONSHIP +CHAMPIONSHIPS +CHAMPLAIN +CHANCE +CHANCED +CHANCELLOR +CHANCELLORSVILLE +CHANCERY +CHANCES +CHANCING +CHANDELIER +CHANDELIERS +CHANDIGARH +CHANG +CHANGE +CHANGEABILITY +CHANGEABLE +CHANGEABLY +CHANGED +CHANGEOVER +CHANGER +CHANGERS +CHANGES +CHANGING +CHANNEL +CHANNELED +CHANNELING +CHANNELLED +CHANNELLER +CHANNELLERS +CHANNELLING +CHANNELS +CHANNING +CHANT +CHANTED +CHANTER +CHANTICLEER +CHANTICLEERS +CHANTILLY +CHANTING +CHANTS +CHAO +CHAOS +CHAOTIC +CHAP +CHAPEL +CHAPELS +CHAPERON +CHAPERONE +CHAPERONED +CHAPLAIN +CHAPLAINS +CHAPLIN +CHAPMAN +CHAPS +CHAPTER +CHAPTERS +CHAR +CHARACTER +CHARACTERISTIC +CHARACTERISTICALLY +CHARACTERISTICS +CHARACTERIZABLE +CHARACTERIZATION +CHARACTERIZATIONS +CHARACTERIZE +CHARACTERIZED +CHARACTERIZER +CHARACTERIZERS +CHARACTERIZES +CHARACTERIZING +CHARACTERS +CHARCOAL +CHARCOALED +CHARGE +CHARGEABLE +CHARGED +CHARGER +CHARGERS +CHARGES +CHARGING +CHARIOT +CHARIOTS +CHARISMA +CHARISMATIC +CHARITABLE +CHARITABLENESS +CHARITIES +CHARITY +CHARLEMAGNE +CHARLEMAGNES +CHARLES +CHARLESTON +CHARLEY +CHARLIE +CHARLOTTE +CHARLOTTESVILLE +CHARM +CHARMED +CHARMER +CHARMERS +CHARMING +CHARMINGLY +CHARMS +CHARON +CHARS +CHART +CHARTA +CHARTABLE +CHARTED +CHARTER +CHARTERED +CHARTERING +CHARTERS +CHARTING +CHARTINGS +CHARTRES +CHARTREUSE +CHARTS +CHARYBDIS +CHASE +CHASED +CHASER +CHASERS +CHASES +CHASING +CHASM +CHASMS +CHASSIS +CHASTE +CHASTELY +CHASTENESS +CHASTISE +CHASTISED +CHASTISER +CHASTISERS +CHASTISES +CHASTISING +CHASTITY +CHAT +CHATEAU +CHATEAUS +CHATHAM +CHATTAHOOCHEE +CHATTANOOGA +CHATTEL +CHATTER +CHATTERED +CHATTERER +CHATTERING +CHATTERS +CHATTING +CHATTY +CHAUCER +CHAUFFEUR +CHAUFFEURED +CHAUNCEY +CHAUTAUQUA +CHEAP +CHEAPEN +CHEAPENED +CHEAPENING +CHEAPENS +CHEAPER +CHEAPEST +CHEAPLY +CHEAPNESS +CHEAT +CHEATED +CHEATER +CHEATERS +CHEATING +CHEATS +CHECK +CHECKABLE +CHECKBOOK +CHECKBOOKS +CHECKED +CHECKER +CHECKERBOARD +CHECKERBOARDED +CHECKERBOARDING +CHECKERS +CHECKING +CHECKLIST +CHECKOUT +CHECKPOINT +CHECKPOINTS +CHECKS +CHECKSUM +CHECKSUMMED +CHECKSUMMING +CHECKSUMS +CHECKUP +CHEEK +CHEEKBONE +CHEEKS +CHEEKY +CHEER +CHEERED +CHEERER +CHEERFUL +CHEERFULLY +CHEERFULNESS +CHEERILY +CHEERINESS +CHEERING +CHEERLEADER +CHEERLESS +CHEERLESSLY +CHEERLESSNESS +CHEERS +CHEERY +CHEESE +CHEESECLOTH +CHEESES +CHEESY +CHEETAH +CHEF +CHEFS +CHEKHOV +CHELSEA +CHEMICAL +CHEMICALLY +CHEMICALS +CHEMISE +CHEMIST +CHEMISTRIES +CHEMISTRY +CHEMISTS +CHEN +CHENEY +CHENG +CHERISH +CHERISHED +CHERISHES +CHERISHING +CHERITON +CHEROKEE +CHEROKEES +CHERRIES +CHERRY +CHERUB +CHERUBIM +CHERUBS +CHERYL +CHESAPEAKE +CHESHIRE +CHESS +CHEST +CHESTER +CHESTERFIELD +CHESTERTON +CHESTNUT +CHESTNUTS +CHESTS +CHEVROLET +CHEVY +CHEW +CHEWED +CHEWER +CHEWERS +CHEWING +CHEWS +CHEYENNE +CHEYENNES +CHIANG +CHIC +CHICAGO +CHICAGOAN +CHICAGOANS +CHICANA +CHICANAS +CHICANERY +CHICANO +CHICANOS +CHICK +CHICKADEE +CHICKADEES +CHICKASAWS +CHICKEN +CHICKENS +CHICKS +CHIDE +CHIDED +CHIDES +CHIDING +CHIEF +CHIEFLY +CHIEFS +CHIEFTAIN +CHIEFTAINS +CHIFFON +CHILD +CHILDBIRTH +CHILDHOOD +CHILDISH +CHILDISHLY +CHILDISHNESS +CHILDLIKE +CHILDREN +CHILE +CHILEAN +CHILES +CHILI +CHILL +CHILLED +CHILLER +CHILLERS +CHILLIER +CHILLINESS +CHILLING +CHILLINGLY +CHILLS +CHILLY +CHIME +CHIMERA +CHIMES +CHIMNEY +CHIMNEYS +CHIMPANZEE +CHIN +CHINA +CHINAMAN +CHINAMEN +CHINAS +CHINATOWN +CHINESE +CHING +CHINK +CHINKED +CHINKS +CHINNED +CHINNER +CHINNERS +CHINNING +CHINOOK +CHINS +CHINTZ +CHIP +CHIPMUNK +CHIPMUNKS +CHIPPENDALE +CHIPPEWA +CHIPS +CHIROPRACTOR +CHIRP +CHIRPED +CHIRPING +CHIRPS +CHISEL +CHISELED +CHISELER +CHISELS +CHISHOLM +CHIT +CHIVALROUS +CHIVALROUSLY +CHIVALROUSNESS +CHIVALRY +CHLOE +CHLORINE +CHLOROFORM +CHLOROPHYLL +CHLOROPLAST +CHLOROPLASTS +CHOCK +CHOCKS +CHOCOLATE +CHOCOLATES +CHOCTAW +CHOCTAWS +CHOICE +CHOICES +CHOICEST +CHOIR +CHOIRS +CHOKE +CHOKED +CHOKER +CHOKERS +CHOKES +CHOKING +CHOLERA +CHOMSKY +CHOOSE +CHOOSER +CHOOSERS +CHOOSES +CHOOSING +CHOP +CHOPIN +CHOPPED +CHOPPER +CHOPPERS +CHOPPING +CHOPPY +CHOPS +CHORAL +CHORD +CHORDATE +CHORDED +CHORDING +CHORDS +CHORE +CHOREOGRAPH +CHOREOGRAPHY +CHORES +CHORING +CHORTLE +CHORUS +CHORUSED +CHORUSES +CHOSE +CHOSEN +CHOU +CHOWDER +CHRIS +CHRIST +CHRISTEN +CHRISTENDOM +CHRISTENED +CHRISTENING +CHRISTENS +CHRISTENSEN +CHRISTENSON +CHRISTIAN +CHRISTIANA +CHRISTIANITY +CHRISTIANIZATION +CHRISTIANIZATIONS +CHRISTIANIZE +CHRISTIANIZER +CHRISTIANIZERS +CHRISTIANIZES +CHRISTIANIZING +CHRISTIANS +CHRISTIANSEN +CHRISTIANSON +CHRISTIE +CHRISTINA +CHRISTINE +CHRISTLIKE +CHRISTMAS +CHRISTOFFEL +CHRISTOPH +CHRISTOPHER +CHRISTY +CHROMATOGRAM +CHROMATOGRAPH +CHROMATOGRAPHY +CHROME +CHROMIUM +CHROMOSPHERE +CHRONIC +CHRONICLE +CHRONICLED +CHRONICLER +CHRONICLERS +CHRONICLES +CHRONOGRAPH +CHRONOGRAPHY +CHRONOLOGICAL +CHRONOLOGICALLY +CHRONOLOGIES +CHRONOLOGY +CHRYSANTHEMUM +CHRYSLER +CHUBBIER +CHUBBIEST +CHUBBINESS +CHUBBY +CHUCK +CHUCKLE +CHUCKLED +CHUCKLES +CHUCKS +CHUM +CHUNGKING +CHUNK +CHUNKS +CHUNKY +CHURCH +CHURCHES +CHURCHGOER +CHURCHGOING +CHURCHILL +CHURCHILLIAN +CHURCHLY +CHURCHMAN +CHURCHMEN +CHURCHWOMAN +CHURCHWOMEN +CHURCHYARD +CHURCHYARDS +CHURN +CHURNED +CHURNING +CHURNS +CHUTE +CHUTES +CHUTZPAH +CICADA +CICERO +CICERONIAN +CICERONIANIZE +CICERONIANIZES +CIDER +CIGAR +CIGARETTE +CIGARETTES +CIGARS +CILIA +CINCINNATI +CINDER +CINDERELLA +CINDERS +CINDY +CINEMA +CINEMATIC +CINERAMA +CINNAMON +CIPHER +CIPHERS +CIPHERTEXT +CIPHERTEXTS +CIRCA +CIRCE +CIRCLE +CIRCLED +CIRCLES +CIRCLET +CIRCLING +CIRCUIT +CIRCUITOUS +CIRCUITOUSLY +CIRCUITRY +CIRCUITS +CIRCULANT +CIRCULAR +CIRCULARITY +CIRCULARLY +CIRCULATE +CIRCULATED +CIRCULATES +CIRCULATING +CIRCULATION +CIRCUMCISE +CIRCUMCISION +CIRCUMFERENCE +CIRCUMFLEX +CIRCUMLOCUTION +CIRCUMLOCUTIONS +CIRCUMNAVIGATE +CIRCUMNAVIGATED +CIRCUMNAVIGATES +CIRCUMPOLAR +CIRCUMSCRIBE +CIRCUMSCRIBED +CIRCUMSCRIBING +CIRCUMSCRIPTION +CIRCUMSPECT +CIRCUMSPECTION +CIRCUMSPECTLY +CIRCUMSTANCE +CIRCUMSTANCED +CIRCUMSTANCES +CIRCUMSTANTIAL +CIRCUMSTANTIALLY +CIRCUMVENT +CIRCUMVENTABLE +CIRCUMVENTED +CIRCUMVENTING +CIRCUMVENTS +CIRCUS +CIRCUSES +CISTERN +CISTERNS +CITADEL +CITADELS +CITATION +CITATIONS +CITE +CITED +CITES +CITIES +CITING +CITIZEN +CITIZENS +CITIZENSHIP +CITROEN +CITRUS +CITY +CITYSCAPE +CITYWIDE +CIVET +CIVIC +CIVICS +CIVIL +CIVILIAN +CIVILIANS +CIVILITY +CIVILIZATION +CIVILIZATIONS +CIVILIZE +CIVILIZED +CIVILIZES +CIVILIZING +CIVILLY +CLAD +CLADDING +CLAIM +CLAIMABLE +CLAIMANT +CLAIMANTS +CLAIMED +CLAIMING +CLAIMS +CLAIRE +CLAIRVOYANT +CLAIRVOYANTLY +CLAM +CLAMBER +CLAMBERED +CLAMBERING +CLAMBERS +CLAMOR +CLAMORED +CLAMORING +CLAMOROUS +CLAMORS +CLAMP +CLAMPED +CLAMPING +CLAMPS +CLAMS +CLAN +CLANDESTINE +CLANG +CLANGED +CLANGING +CLANGS +CLANK +CLANNISH +CLAP +CLAPBOARD +CLAPEYRON +CLAPPING +CLAPS +CLARA +CLARE +CLAREMONT +CLARENCE +CLARENDON +CLARIFICATION +CLARIFICATIONS +CLARIFIED +CLARIFIES +CLARIFY +CLARIFYING +CLARINET +CLARITY +CLARK +CLARKE +CLARRIDGE +CLASH +CLASHED +CLASHES +CLASHING +CLASP +CLASPED +CLASPING +CLASPS +CLASS +CLASSED +CLASSES +CLASSIC +CLASSICAL +CLASSICALLY +CLASSICS +CLASSIFIABLE +CLASSIFICATION +CLASSIFICATIONS +CLASSIFIED +CLASSIFIER +CLASSIFIERS +CLASSIFIES +CLASSIFY +CLASSIFYING +CLASSMATE +CLASSMATES +CLASSROOM +CLASSROOMS +CLASSY +CLATTER +CLATTERED +CLATTERING +CLAUDE +CLAUDIA +CLAUDIO +CLAUS +CLAUSE +CLAUSEN +CLAUSES +CLAUSIUS +CLAUSTROPHOBIA +CLAUSTROPHOBIC +CLAW +CLAWED +CLAWING +CLAWS +CLAY +CLAYS +CLAYTON +CLEAN +CLEANED +CLEANER +CLEANERS +CLEANEST +CLEANING +CLEANLINESS +CLEANLY +CLEANNESS +CLEANS +CLEANSE +CLEANSED +CLEANSER +CLEANSERS +CLEANSES +CLEANSING +CLEANUP +CLEAR +CLEARANCE +CLEARANCES +CLEARED +CLEARER +CLEAREST +CLEARING +CLEARINGS +CLEARLY +CLEARNESS +CLEARS +CLEARWATER +CLEAVAGE +CLEAVE +CLEAVED +CLEAVER +CLEAVERS +CLEAVES +CLEAVING +CLEFT +CLEFTS +CLEMENCY +CLEMENS +CLEMENT +CLEMENTE +CLEMSON +CLENCH +CLENCHED +CLENCHES +CLERGY +CLERGYMAN +CLERGYMEN +CLERICAL +CLERK +CLERKED +CLERKING +CLERKS +CLEVELAND +CLEVER +CLEVERER +CLEVEREST +CLEVERLY +CLEVERNESS +CLICHE +CLICHES +CLICK +CLICKED +CLICKING +CLICKS +CLIENT +CLIENTELE +CLIENTS +CLIFF +CLIFFORD +CLIFFS +CLIFTON +CLIMATE +CLIMATES +CLIMATIC +CLIMATICALLY +CLIMATOLOGY +CLIMAX +CLIMAXED +CLIMAXES +CLIMB +CLIMBED +CLIMBER +CLIMBERS +CLIMBING +CLIMBS +CLIME +CLIMES +CLINCH +CLINCHED +CLINCHER +CLINCHES +CLING +CLINGING +CLINGS +CLINIC +CLINICAL +CLINICALLY +CLINICIAN +CLINICS +CLINK +CLINKED +CLINKER +CLINT +CLINTON +CLIO +CLIP +CLIPBOARD +CLIPPED +CLIPPER +CLIPPERS +CLIPPING +CLIPPINGS +CLIPS +CLIQUE +CLIQUES +CLITORIS +CLIVE +CLOAK +CLOAKROOM +CLOAKS +CLOBBER +CLOBBERED +CLOBBERING +CLOBBERS +CLOCK +CLOCKED +CLOCKER +CLOCKERS +CLOCKING +CLOCKINGS +CLOCKS +CLOCKWATCHER +CLOCKWISE +CLOCKWORK +CLOD +CLODS +CLOG +CLOGGED +CLOGGING +CLOGS +CLOISTER +CLOISTERS +CLONE +CLONED +CLONES +CLONING +CLOSE +CLOSED +CLOSELY +CLOSENESS +CLOSENESSES +CLOSER +CLOSERS +CLOSES +CLOSEST +CLOSET +CLOSETED +CLOSETS +CLOSEUP +CLOSING +CLOSURE +CLOSURES +CLOT +CLOTH +CLOTHE +CLOTHED +CLOTHES +CLOTHESHORSE +CLOTHESLINE +CLOTHING +CLOTHO +CLOTTING +CLOTURE +CLOUD +CLOUDBURST +CLOUDED +CLOUDIER +CLOUDIEST +CLOUDINESS +CLOUDING +CLOUDLESS +CLOUDS +CLOUDY +CLOUT +CLOVE +CLOVER +CLOVES +CLOWN +CLOWNING +CLOWNS +CLUB +CLUBBED +CLUBBING +CLUBHOUSE +CLUBROOM +CLUBS +CLUCK +CLUCKED +CLUCKING +CLUCKS +CLUE +CLUES +CLUJ +CLUMP +CLUMPED +CLUMPING +CLUMPS +CLUMSILY +CLUMSINESS +CLUMSY +CLUNG +CLUSTER +CLUSTERED +CLUSTERING +CLUSTERINGS +CLUSTERS +CLUTCH +CLUTCHED +CLUTCHES +CLUTCHING +CLUTTER +CLUTTERED +CLUTTERING +CLUTTERS +CLYDE +CLYTEMNESTRA +COACH +COACHED +COACHER +COACHES +COACHING +COACHMAN +COACHMEN +COAGULATE +COAL +COALESCE +COALESCED +COALESCES +COALESCING +COALITION +COALS +COARSE +COARSELY +COARSEN +COARSENED +COARSENESS +COARSER +COARSEST +COAST +COASTAL +COASTED +COASTER +COASTERS +COASTING +COASTLINE +COASTS +COAT +COATED +COATES +COATING +COATINGS +COATS +COATTAIL +COAUTHOR +COAX +COAXED +COAXER +COAXES +COAXIAL +COAXING +COBALT +COBB +COBBLE +COBBLER +COBBLERS +COBBLESTONE +COBOL +COBOL +COBRA +COBWEB +COBWEBS +COCA +COCAINE +COCHISE +COCHRAN +COCHRANE +COCK +COCKED +COCKING +COCKPIT +COCKROACH +COCKS +COCKTAIL +COCKTAILS +COCKY +COCO +COCOA +COCONUT +COCONUTS +COCOON +COCOONS +COD +CODDINGTON +CODDLE +CODE +CODED +CODEINE +CODER +CODERS +CODES +CODEWORD +CODEWORDS +CODFISH +CODICIL +CODIFICATION +CODIFICATIONS +CODIFIED +CODIFIER +CODIFIERS +CODIFIES +CODIFY +CODIFYING +CODING +CODINGS +CODPIECE +CODY +COED +COEDITOR +COEDUCATION +COEFFICIENT +COEFFICIENTS +COEQUAL +COERCE +COERCED +COERCES +COERCIBLE +COERCING +COERCION +COERCIVE +COEXIST +COEXISTED +COEXISTENCE +COEXISTING +COEXISTS +COFACTOR +COFFEE +COFFEECUP +COFFEEPOT +COFFEES +COFFER +COFFERS +COFFEY +COFFIN +COFFINS +COFFMAN +COG +COGENT +COGENTLY +COGITATE +COGITATED +COGITATES +COGITATING +COGITATION +COGNAC +COGNITION +COGNITIVE +COGNITIVELY +COGNIZANCE +COGNIZANT +COGS +COHABITATION +COHABITATIONS +COHEN +COHERE +COHERED +COHERENCE +COHERENT +COHERENTLY +COHERES +COHERING +COHESION +COHESIVE +COHESIVELY +COHESIVENESS +COHN +COHORT +COIL +COILED +COILING +COILS +COIN +COINAGE +COINCIDE +COINCIDED +COINCIDENCE +COINCIDENCES +COINCIDENT +COINCIDENTAL +COINCIDES +COINCIDING +COINED +COINER +COINING +COINS +COKE +COKES +COLANDER +COLBY +COLD +COLDER +COLDEST +COLDLY +COLDNESS +COLDS +COLE +COLEMAN +COLERIDGE +COLETTE +COLGATE +COLICKY +COLIFORM +COLISEUM +COLLABORATE +COLLABORATED +COLLABORATES +COLLABORATING +COLLABORATION +COLLABORATIONS +COLLABORATIVE +COLLABORATOR +COLLABORATORS +COLLAGEN +COLLAPSE +COLLAPSED +COLLAPSES +COLLAPSIBLE +COLLAPSING +COLLAR +COLLARBONE +COLLARED +COLLARING +COLLARS +COLLATE +COLLATERAL +COLLEAGUE +COLLEAGUES +COLLECT +COLLECTED +COLLECTIBLE +COLLECTING +COLLECTION +COLLECTIONS +COLLECTIVE +COLLECTIVELY +COLLECTIVES +COLLECTOR +COLLECTORS +COLLECTS +COLLEGE +COLLEGES +COLLEGIAN +COLLEGIATE +COLLIDE +COLLIDED +COLLIDES +COLLIDING +COLLIE +COLLIER +COLLIES +COLLINS +COLLISION +COLLISIONS +COLLOIDAL +COLLOQUIA +COLLOQUIAL +COLLOQUIUM +COLLOQUY +COLLUSION +COLOGNE +COLOMBIA +COLOMBIAN +COLOMBIANS +COLOMBO +COLON +COLONEL +COLONELS +COLONIAL +COLONIALLY +COLONIALS +COLONIES +COLONIST +COLONISTS +COLONIZATION +COLONIZE +COLONIZED +COLONIZER +COLONIZERS +COLONIZES +COLONIZING +COLONS +COLONY +COLOR +COLORADO +COLORED +COLORER +COLORERS +COLORFUL +COLORING +COLORINGS +COLORLESS +COLORS +COLOSSAL +COLOSSEUM +COLT +COLTS +COLUMBIA +COLUMBIAN +COLUMBUS +COLUMN +COLUMNIZE +COLUMNIZED +COLUMNIZES +COLUMNIZING +COLUMNS +COMANCHE +COMB +COMBAT +COMBATANT +COMBATANTS +COMBATED +COMBATING +COMBATIVE +COMBATS +COMBED +COMBER +COMBERS +COMBINATION +COMBINATIONAL +COMBINATIONS +COMBINATOR +COMBINATORIAL +COMBINATORIALLY +COMBINATORIC +COMBINATORICS +COMBINATORS +COMBINE +COMBINED +COMBINES +COMBING +COMBINGS +COMBINING +COMBS +COMBUSTIBLE +COMBUSTION +COMDEX +COME +COMEBACK +COMEDIAN +COMEDIANS +COMEDIC +COMEDIES +COMEDY +COMELINESS +COMELY +COMER +COMERS +COMES +COMESTIBLE +COMET +COMETARY +COMETS +COMFORT +COMFORTABILITIES +COMFORTABILITY +COMFORTABLE +COMFORTABLY +COMFORTED +COMFORTER +COMFORTERS +COMFORTING +COMFORTINGLY +COMFORTS +COMIC +COMICAL +COMICALLY +COMICS +COMINFORM +COMING +COMINGS +COMMA +COMMAND +COMMANDANT +COMMANDANTS +COMMANDED +COMMANDEER +COMMANDER +COMMANDERS +COMMANDING +COMMANDINGLY +COMMANDMENT +COMMANDMENTS +COMMANDO +COMMANDS +COMMAS +COMMEMORATE +COMMEMORATED +COMMEMORATES +COMMEMORATING +COMMEMORATION +COMMEMORATIVE +COMMENCE +COMMENCED +COMMENCEMENT +COMMENCEMENTS +COMMENCES +COMMENCING +COMMEND +COMMENDATION +COMMENDATIONS +COMMENDED +COMMENDING +COMMENDS +COMMENSURATE +COMMENT +COMMENTARIES +COMMENTARY +COMMENTATOR +COMMENTATORS +COMMENTED +COMMENTING +COMMENTS +COMMERCE +COMMERCIAL +COMMERCIALLY +COMMERCIALNESS +COMMERCIALS +COMMISSION +COMMISSIONED +COMMISSIONER +COMMISSIONERS +COMMISSIONING +COMMISSIONS +COMMIT +COMMITMENT +COMMITMENTS +COMMITS +COMMITTED +COMMITTEE +COMMITTEEMAN +COMMITTEEMEN +COMMITTEES +COMMITTEEWOMAN +COMMITTEEWOMEN +COMMITTING +COMMODITIES +COMMODITY +COMMODORE +COMMODORES +COMMON +COMMONALITIES +COMMONALITY +COMMONER +COMMONERS +COMMONEST +COMMONLY +COMMONNESS +COMMONPLACE +COMMONPLACES +COMMONS +COMMONWEALTH +COMMONWEALTHS +COMMOTION +COMMUNAL +COMMUNALLY +COMMUNE +COMMUNES +COMMUNICANT +COMMUNICANTS +COMMUNICATE +COMMUNICATED +COMMUNICATES +COMMUNICATING +COMMUNICATION +COMMUNICATIONS +COMMUNICATIVE +COMMUNICATOR +COMMUNICATORS +COMMUNION +COMMUNIST +COMMUNISTS +COMMUNITIES +COMMUNITY +COMMUTATIVE +COMMUTATIVITY +COMMUTE +COMMUTED +COMMUTER +COMMUTERS +COMMUTES +COMMUTING +COMPACT +COMPACTED +COMPACTER +COMPACTEST +COMPACTING +COMPACTION +COMPACTLY +COMPACTNESS +COMPACTOR +COMPACTORS +COMPACTS +COMPANIES +COMPANION +COMPANIONABLE +COMPANIONS +COMPANIONSHIP +COMPANY +COMPARABILITY +COMPARABLE +COMPARABLY +COMPARATIVE +COMPARATIVELY +COMPARATIVES +COMPARATOR +COMPARATORS +COMPARE +COMPARED +COMPARES +COMPARING +COMPARISON +COMPARISONS +COMPARTMENT +COMPARTMENTALIZE +COMPARTMENTALIZED +COMPARTMENTALIZES +COMPARTMENTALIZING +COMPARTMENTED +COMPARTMENTS +COMPASS +COMPASSION +COMPASSIONATE +COMPASSIONATELY +COMPATIBILITIES +COMPATIBILITY +COMPATIBLE +COMPATIBLES +COMPATIBLY +COMPEL +COMPELLED +COMPELLING +COMPELLINGLY +COMPELS +COMPENDIUM +COMPENSATE +COMPENSATED +COMPENSATES +COMPENSATING +COMPENSATION +COMPENSATIONS +COMPENSATORY +COMPETE +COMPETED +COMPETENCE +COMPETENCY +COMPETENT +COMPETENTLY +COMPETES +COMPETING +COMPETITION +COMPETITIONS +COMPETITIVE +COMPETITIVELY +COMPETITOR +COMPETITORS +COMPILATION +COMPILATIONS +COMPILE +COMPILED +COMPILER +COMPILERS +COMPILES +COMPILING +COMPLACENCY +COMPLAIN +COMPLAINED +COMPLAINER +COMPLAINERS +COMPLAINING +COMPLAINS +COMPLAINT +COMPLAINTS +COMPLEMENT +COMPLEMENTARY +COMPLEMENTED +COMPLEMENTER +COMPLEMENTERS +COMPLEMENTING +COMPLEMENTS +COMPLETE +COMPLETED +COMPLETELY +COMPLETENESS +COMPLETES +COMPLETING +COMPLETION +COMPLETIONS +COMPLEX +COMPLEXES +COMPLEXION +COMPLEXITIES +COMPLEXITY +COMPLEXLY +COMPLIANCE +COMPLIANT +COMPLICATE +COMPLICATED +COMPLICATES +COMPLICATING +COMPLICATION +COMPLICATIONS +COMPLICATOR +COMPLICATORS +COMPLICITY +COMPLIED +COMPLIMENT +COMPLIMENTARY +COMPLIMENTED +COMPLIMENTER +COMPLIMENTERS +COMPLIMENTING +COMPLIMENTS +COMPLY +COMPLYING +COMPONENT +COMPONENTRY +COMPONENTS +COMPONENTWISE +COMPOSE +COMPOSED +COMPOSEDLY +COMPOSER +COMPOSERS +COMPOSES +COMPOSING +COMPOSITE +COMPOSITES +COMPOSITION +COMPOSITIONAL +COMPOSITIONS +COMPOST +COMPOSURE +COMPOUND +COMPOUNDED +COMPOUNDING +COMPOUNDS +COMPREHEND +COMPREHENDED +COMPREHENDING +COMPREHENDS +COMPREHENSIBILITY +COMPREHENSIBLE +COMPREHENSION +COMPREHENSIVE +COMPREHENSIVELY +COMPRESS +COMPRESSED +COMPRESSES +COMPRESSIBLE +COMPRESSING +COMPRESSION +COMPRESSIVE +COMPRESSOR +COMPRISE +COMPRISED +COMPRISES +COMPRISING +COMPROMISE +COMPROMISED +COMPROMISER +COMPROMISERS +COMPROMISES +COMPROMISING +COMPROMISINGLY +COMPTON +COMPTROLLER +COMPTROLLERS +COMPULSION +COMPULSIONS +COMPULSIVE +COMPULSORY +COMPUNCTION +COMPUSERVE +COMPUTABILITY +COMPUTABLE +COMPUTATION +COMPUTATIONAL +COMPUTATIONALLY +COMPUTATIONS +COMPUTE +COMPUTED +COMPUTER +COMPUTERIZE +COMPUTERIZED +COMPUTERIZES +COMPUTERIZING +COMPUTERS +COMPUTES +COMPUTING +COMRADE +COMRADELY +COMRADES +COMRADESHIP +CON +CONAKRY +CONANT +CONCATENATE +CONCATENATED +CONCATENATES +CONCATENATING +CONCATENATION +CONCATENATIONS +CONCAVE +CONCEAL +CONCEALED +CONCEALER +CONCEALERS +CONCEALING +CONCEALMENT +CONCEALS +CONCEDE +CONCEDED +CONCEDES +CONCEDING +CONCEIT +CONCEITED +CONCEITS +CONCEIVABLE +CONCEIVABLY +CONCEIVE +CONCEIVED +CONCEIVES +CONCEIVING +CONCENTRATE +CONCENTRATED +CONCENTRATES +CONCENTRATING +CONCENTRATION +CONCENTRATIONS +CONCENTRATOR +CONCENTRATORS +CONCENTRIC +CONCEPT +CONCEPTION +CONCEPTIONS +CONCEPTS +CONCEPTUAL +CONCEPTUALIZATION +CONCEPTUALIZATIONS +CONCEPTUALIZE +CONCEPTUALIZED +CONCEPTUALIZES +CONCEPTUALIZING +CONCEPTUALLY +CONCERN +CONCERNED +CONCERNEDLY +CONCERNING +CONCERNS +CONCERT +CONCERTED +CONCERTMASTER +CONCERTO +CONCERTS +CONCESSION +CONCESSIONS +CONCILIATE +CONCILIATORY +CONCISE +CONCISELY +CONCISENESS +CONCLAVE +CONCLUDE +CONCLUDED +CONCLUDES +CONCLUDING +CONCLUSION +CONCLUSIONS +CONCLUSIVE +CONCLUSIVELY +CONCOCT +CONCOMITANT +CONCORD +CONCORDANT +CONCORDE +CONCORDIA +CONCOURSE +CONCRETE +CONCRETELY +CONCRETENESS +CONCRETES +CONCRETION +CONCUBINE +CONCUR +CONCURRED +CONCURRENCE +CONCURRENCIES +CONCURRENCY +CONCURRENT +CONCURRENTLY +CONCURRING +CONCURS +CONCUSSION +CONDEMN +CONDEMNATION +CONDEMNATIONS +CONDEMNED +CONDEMNER +CONDEMNERS +CONDEMNING +CONDEMNS +CONDENSATION +CONDENSE +CONDENSED +CONDENSER +CONDENSES +CONDENSING +CONDESCEND +CONDESCENDING +CONDITION +CONDITIONAL +CONDITIONALLY +CONDITIONALS +CONDITIONED +CONDITIONER +CONDITIONERS +CONDITIONING +CONDITIONS +CONDOM +CONDONE +CONDONED +CONDONES +CONDONING +CONDUCE +CONDUCIVE +CONDUCIVENESS +CONDUCT +CONDUCTANCE +CONDUCTED +CONDUCTING +CONDUCTION +CONDUCTIVE +CONDUCTIVITY +CONDUCTOR +CONDUCTORS +CONDUCTS +CONDUIT +CONE +CONES +CONESTOGA +CONFECTIONERY +CONFEDERACY +CONFEDERATE +CONFEDERATES +CONFEDERATION +CONFEDERATIONS +CONFER +CONFEREE +CONFERENCE +CONFERENCES +CONFERRED +CONFERRER +CONFERRERS +CONFERRING +CONFERS +CONFESS +CONFESSED +CONFESSES +CONFESSING +CONFESSION +CONFESSIONS +CONFESSOR +CONFESSORS +CONFIDANT +CONFIDANTS +CONFIDE +CONFIDED +CONFIDENCE +CONFIDENCES +CONFIDENT +CONFIDENTIAL +CONFIDENTIALITY +CONFIDENTIALLY +CONFIDENTLY +CONFIDES +CONFIDING +CONFIDINGLY +CONFIGURABLE +CONFIGURATION +CONFIGURATIONS +CONFIGURE +CONFIGURED +CONFIGURES +CONFIGURING +CONFINE +CONFINED +CONFINEMENT +CONFINEMENTS +CONFINER +CONFINES +CONFINING +CONFIRM +CONFIRMATION +CONFIRMATIONS +CONFIRMATORY +CONFIRMED +CONFIRMING +CONFIRMS +CONFISCATE +CONFISCATED +CONFISCATES +CONFISCATING +CONFISCATION +CONFISCATIONS +CONFLAGRATION +CONFLICT +CONFLICTED +CONFLICTING +CONFLICTS +CONFLUENT +CONFOCAL +CONFORM +CONFORMAL +CONFORMANCE +CONFORMED +CONFORMING +CONFORMITY +CONFORMS +CONFOUND +CONFOUNDED +CONFOUNDING +CONFOUNDS +CONFRONT +CONFRONTATION +CONFRONTATIONS +CONFRONTED +CONFRONTER +CONFRONTERS +CONFRONTING +CONFRONTS +CONFUCIAN +CONFUCIANISM +CONFUCIUS +CONFUSE +CONFUSED +CONFUSER +CONFUSERS +CONFUSES +CONFUSING +CONFUSINGLY +CONFUSION +CONFUSIONS +CONGENIAL +CONGENIALLY +CONGENITAL +CONGEST +CONGESTED +CONGESTION +CONGESTIVE +CONGLOMERATE +CONGO +CONGOLESE +CONGRATULATE +CONGRATULATED +CONGRATULATION +CONGRATULATIONS +CONGRATULATORY +CONGREGATE +CONGREGATED +CONGREGATES +CONGREGATING +CONGREGATION +CONGREGATIONS +CONGRESS +CONGRESSES +CONGRESSIONAL +CONGRESSIONALLY +CONGRESSMAN +CONGRESSMEN +CONGRESSWOMAN +CONGRESSWOMEN +CONGRUENCE +CONGRUENT +CONIC +CONIFER +CONIFEROUS +CONJECTURE +CONJECTURED +CONJECTURES +CONJECTURING +CONJOINED +CONJUGAL +CONJUGATE +CONJUNCT +CONJUNCTED +CONJUNCTION +CONJUNCTIONS +CONJUNCTIVE +CONJUNCTIVELY +CONJUNCTS +CONJUNCTURE +CONJURE +CONJURED +CONJURER +CONJURES +CONJURING +CONKLIN +CONLEY +CONNALLY +CONNECT +CONNECTED +CONNECTEDNESS +CONNECTICUT +CONNECTING +CONNECTION +CONNECTIONLESS +CONNECTIONS +CONNECTIVE +CONNECTIVES +CONNECTIVITY +CONNECTOR +CONNECTORS +CONNECTS +CONNELLY +CONNER +CONNIE +CONNIVANCE +CONNIVE +CONNOISSEUR +CONNOISSEURS +CONNORS +CONNOTATION +CONNOTATIVE +CONNOTE +CONNOTED +CONNOTES +CONNOTING +CONNUBIAL +CONQUER +CONQUERABLE +CONQUERED +CONQUERER +CONQUERERS +CONQUERING +CONQUEROR +CONQUERORS +CONQUERS +CONQUEST +CONQUESTS +CONRAD +CONRAIL +CONSCIENCE +CONSCIENCES +CONSCIENTIOUS +CONSCIENTIOUSLY +CONSCIOUS +CONSCIOUSLY +CONSCIOUSNESS +CONSCRIPT +CONSCRIPTION +CONSECRATE +CONSECRATION +CONSECUTIVE +CONSECUTIVELY +CONSENSUAL +CONSENSUS +CONSENT +CONSENTED +CONSENTER +CONSENTERS +CONSENTING +CONSENTS +CONSEQUENCE +CONSEQUENCES +CONSEQUENT +CONSEQUENTIAL +CONSEQUENTIALITIES +CONSEQUENTIALITY +CONSEQUENTLY +CONSEQUENTS +CONSERVATION +CONSERVATIONIST +CONSERVATIONISTS +CONSERVATIONS +CONSERVATISM +CONSERVATIVE +CONSERVATIVELY +CONSERVATIVES +CONSERVATOR +CONSERVE +CONSERVED +CONSERVES +CONSERVING +CONSIDER +CONSIDERABLE +CONSIDERABLY +CONSIDERATE +CONSIDERATELY +CONSIDERATION +CONSIDERATIONS +CONSIDERED +CONSIDERING +CONSIDERS +CONSIGN +CONSIGNED +CONSIGNING +CONSIGNS +CONSIST +CONSISTED +CONSISTENCY +CONSISTENT +CONSISTENTLY +CONSISTING +CONSISTS +CONSOLABLE +CONSOLATION +CONSOLATIONS +CONSOLE +CONSOLED +CONSOLER +CONSOLERS +CONSOLES +CONSOLIDATE +CONSOLIDATED +CONSOLIDATES +CONSOLIDATING +CONSOLIDATION +CONSOLING +CONSOLINGLY +CONSONANT +CONSONANTS +CONSORT +CONSORTED +CONSORTING +CONSORTIUM +CONSORTS +CONSPICUOUS +CONSPICUOUSLY +CONSPIRACIES +CONSPIRACY +CONSPIRATOR +CONSPIRATORS +CONSPIRE +CONSPIRED +CONSPIRES +CONSPIRING +CONSTABLE +CONSTABLES +CONSTANCE +CONSTANCY +CONSTANT +CONSTANTINE +CONSTANTINOPLE +CONSTANTLY +CONSTANTS +CONSTELLATION +CONSTELLATIONS +CONSTERNATION +CONSTITUENCIES +CONSTITUENCY +CONSTITUENT +CONSTITUENTS +CONSTITUTE +CONSTITUTED +CONSTITUTES +CONSTITUTING +CONSTITUTION +CONSTITUTIONAL +CONSTITUTIONALITY +CONSTITUTIONALLY +CONSTITUTIONS +CONSTITUTIVE +CONSTRAIN +CONSTRAINED +CONSTRAINING +CONSTRAINS +CONSTRAINT +CONSTRAINTS +CONSTRICT +CONSTRUCT +CONSTRUCTED +CONSTRUCTIBILITY +CONSTRUCTIBLE +CONSTRUCTING +CONSTRUCTION +CONSTRUCTIONS +CONSTRUCTIVE +CONSTRUCTIVELY +CONSTRUCTOR +CONSTRUCTORS +CONSTRUCTS +CONSTRUE +CONSTRUED +CONSTRUING +CONSUL +CONSULAR +CONSULATE +CONSULATES +CONSULS +CONSULT +CONSULTANT +CONSULTANTS +CONSULTATION +CONSULTATIONS +CONSULTATIVE +CONSULTED +CONSULTING +CONSULTS +CONSUMABLE +CONSUME +CONSUMED +CONSUMER +CONSUMERS +CONSUMES +CONSUMING +CONSUMMATE +CONSUMMATED +CONSUMMATELY +CONSUMMATION +CONSUMPTION +CONSUMPTIONS +CONSUMPTIVE +CONSUMPTIVELY +CONTACT +CONTACTED +CONTACTING +CONTACTS +CONTAGION +CONTAGIOUS +CONTAGIOUSLY +CONTAIN +CONTAINABLE +CONTAINED +CONTAINER +CONTAINERS +CONTAINING +CONTAINMENT +CONTAINMENTS +CONTAINS +CONTAMINATE +CONTAMINATED +CONTAMINATES +CONTAMINATING +CONTAMINATION +CONTEMPLATE +CONTEMPLATED +CONTEMPLATES +CONTEMPLATING +CONTEMPLATION +CONTEMPLATIONS +CONTEMPLATIVE +CONTEMPORARIES +CONTEMPORARINESS +CONTEMPORARY +CONTEMPT +CONTEMPTIBLE +CONTEMPTUOUS +CONTEMPTUOUSLY +CONTEND +CONTENDED +CONTENDER +CONTENDERS +CONTENDING +CONTENDS +CONTENT +CONTENTED +CONTENTING +CONTENTION +CONTENTIONS +CONTENTLY +CONTENTMENT +CONTENTS +CONTEST +CONTESTABLE +CONTESTANT +CONTESTED +CONTESTER +CONTESTERS +CONTESTING +CONTESTS +CONTEXT +CONTEXTS +CONTEXTUAL +CONTEXTUALLY +CONTIGUITY +CONTIGUOUS +CONTIGUOUSLY +CONTINENT +CONTINENTAL +CONTINENTALLY +CONTINENTS +CONTINGENCIES +CONTINGENCY +CONTINGENT +CONTINGENTS +CONTINUAL +CONTINUALLY +CONTINUANCE +CONTINUANCES +CONTINUATION +CONTINUATIONS +CONTINUE +CONTINUED +CONTINUES +CONTINUING +CONTINUITIES +CONTINUITY +CONTINUOUS +CONTINUOUSLY +CONTINUUM +CONTORTIONS +CONTOUR +CONTOURED +CONTOURING +CONTOURS +CONTRABAND +CONTRACEPTION +CONTRACEPTIVE +CONTRACT +CONTRACTED +CONTRACTING +CONTRACTION +CONTRACTIONS +CONTRACTOR +CONTRACTORS +CONTRACTS +CONTRACTUAL +CONTRACTUALLY +CONTRADICT +CONTRADICTED +CONTRADICTING +CONTRADICTION +CONTRADICTIONS +CONTRADICTORY +CONTRADICTS +CONTRADISTINCTION +CONTRADISTINCTIONS +CONTRAPOSITIVE +CONTRAPOSITIVES +CONTRAPTION +CONTRAPTIONS +CONTRARINESS +CONTRARY +CONTRAST +CONTRASTED +CONTRASTER +CONTRASTERS +CONTRASTING +CONTRASTINGLY +CONTRASTS +CONTRIBUTE +CONTRIBUTED +CONTRIBUTES +CONTRIBUTING +CONTRIBUTION +CONTRIBUTIONS +CONTRIBUTOR +CONTRIBUTORILY +CONTRIBUTORS +CONTRIBUTORY +CONTRITE +CONTRITION +CONTRIVANCE +CONTRIVANCES +CONTRIVE +CONTRIVED +CONTRIVER +CONTRIVES +CONTRIVING +CONTROL +CONTROLLABILITY +CONTROLLABLE +CONTROLLABLY +CONTROLLED +CONTROLLER +CONTROLLERS +CONTROLLING +CONTROLS +CONTROVERSIAL +CONTROVERSIES +CONTROVERSY +CONTROVERTIBLE +CONTUMACIOUS +CONTUMACY +CONUNDRUM +CONUNDRUMS +CONVAIR +CONVALESCENT +CONVECT +CONVENE +CONVENED +CONVENES +CONVENIENCE +CONVENIENCES +CONVENIENT +CONVENIENTLY +CONVENING +CONVENT +CONVENTION +CONVENTIONAL +CONVENTIONALLY +CONVENTIONS +CONVENTS +CONVERGE +CONVERGED +CONVERGENCE +CONVERGENT +CONVERGES +CONVERGING +CONVERSANT +CONVERSANTLY +CONVERSATION +CONVERSATIONAL +CONVERSATIONALLY +CONVERSATIONS +CONVERSE +CONVERSED +CONVERSELY +CONVERSES +CONVERSING +CONVERSION +CONVERSIONS +CONVERT +CONVERTED +CONVERTER +CONVERTERS +CONVERTIBILITY +CONVERTIBLE +CONVERTING +CONVERTS +CONVEX +CONVEY +CONVEYANCE +CONVEYANCES +CONVEYED +CONVEYER +CONVEYERS +CONVEYING +CONVEYOR +CONVEYS +CONVICT +CONVICTED +CONVICTING +CONVICTION +CONVICTIONS +CONVICTS +CONVINCE +CONVINCED +CONVINCER +CONVINCERS +CONVINCES +CONVINCING +CONVINCINGLY +CONVIVIAL +CONVOKE +CONVOLUTED +CONVOLUTION +CONVOY +CONVOYED +CONVOYING +CONVOYS +CONVULSE +CONVULSION +CONVULSIONS +CONWAY +COO +COOING +COOK +COOKBOOK +COOKE +COOKED +COOKERY +COOKIE +COOKIES +COOKING +COOKS +COOKY +COOL +COOLED +COOLER +COOLERS +COOLEST +COOLEY +COOLIDGE +COOLIE +COOLIES +COOLING +COOLLY +COOLNESS +COOLS +COON +COONS +COOP +COOPED +COOPER +COOPERATE +COOPERATED +COOPERATES +COOPERATING +COOPERATION +COOPERATIONS +COOPERATIVE +COOPERATIVELY +COOPERATIVES +COOPERATOR +COOPERATORS +COOPERS +COOPS +COORDINATE +COORDINATED +COORDINATES +COORDINATING +COORDINATION +COORDINATIONS +COORDINATOR +COORDINATORS +COORS +COP +COPE +COPED +COPELAND +COPENHAGEN +COPERNICAN +COPERNICUS +COPES +COPIED +COPIER +COPIERS +COPIES +COPING +COPINGS +COPIOUS +COPIOUSLY +COPIOUSNESS +COPLANAR +COPPER +COPPERFIELD +COPPERHEAD +COPPERS +COPRA +COPROCESSOR +COPS +COPSE +COPY +COPYING +COPYRIGHT +COPYRIGHTABLE +COPYRIGHTED +COPYRIGHTS +COPYWRITER +COQUETTE +CORAL +CORBETT +CORCORAN +CORD +CORDED +CORDER +CORDIAL +CORDIALITY +CORDIALLY +CORDS +CORE +CORED +CORER +CORERS +CORES +COREY +CORIANDER +CORING +CORINTH +CORINTHIAN +CORINTHIANIZE +CORINTHIANIZES +CORINTHIANS +CORIOLANUS +CORK +CORKED +CORKER +CORKERS +CORKING +CORKS +CORKSCREW +CORMORANT +CORN +CORNEA +CORNELIA +CORNELIAN +CORNELIUS +CORNELL +CORNER +CORNERED +CORNERS +CORNERSTONE +CORNERSTONES +CORNET +CORNFIELD +CORNFIELDS +CORNING +CORNISH +CORNMEAL +CORNS +CORNSTARCH +CORNUCOPIA +CORNWALL +CORNWALLIS +CORNY +COROLLARIES +COROLLARY +CORONADO +CORONARIES +CORONARY +CORONATION +CORONER +CORONET +CORONETS +COROUTINE +COROUTINES +CORPORAL +CORPORALS +CORPORATE +CORPORATELY +CORPORATION +CORPORATIONS +CORPS +CORPSE +CORPSES +CORPULENT +CORPUS +CORPUSCULAR +CORRAL +CORRECT +CORRECTABLE +CORRECTED +CORRECTING +CORRECTION +CORRECTIONS +CORRECTIVE +CORRECTIVELY +CORRECTIVES +CORRECTLY +CORRECTNESS +CORRECTOR +CORRECTS +CORRELATE +CORRELATED +CORRELATES +CORRELATING +CORRELATION +CORRELATIONS +CORRELATIVE +CORRESPOND +CORRESPONDED +CORRESPONDENCE +CORRESPONDENCES +CORRESPONDENT +CORRESPONDENTS +CORRESPONDING +CORRESPONDINGLY +CORRESPONDS +CORRIDOR +CORRIDORS +CORRIGENDA +CORRIGENDUM +CORRIGIBLE +CORROBORATE +CORROBORATED +CORROBORATES +CORROBORATING +CORROBORATION +CORROBORATIONS +CORROBORATIVE +CORRODE +CORROSION +CORROSIVE +CORRUGATE +CORRUPT +CORRUPTED +CORRUPTER +CORRUPTIBLE +CORRUPTING +CORRUPTION +CORRUPTIONS +CORRUPTS +CORSET +CORSICA +CORSICAN +CORTEX +CORTEZ +CORTICAL +CORTLAND +CORVALLIS +CORVUS +CORYDORAS +COSGROVE +COSINE +COSINES +COSMETIC +COSMETICS +COSMIC +COSMOLOGY +COSMOPOLITAN +COSMOS +COSPONSOR +COSSACK +COST +COSTA +COSTED +COSTELLO +COSTING +COSTLY +COSTS +COSTUME +COSTUMED +COSTUMER +COSTUMES +COSTUMING +COSY +COT +COTANGENT +COTILLION +COTS +COTTAGE +COTTAGER +COTTAGES +COTTON +COTTONMOUTH +COTTONS +COTTONSEED +COTTONWOOD +COTTRELL +COTYLEDON +COTYLEDONS +COUCH +COUCHED +COUCHES +COUCHING +COUGAR +COUGH +COUGHED +COUGHING +COUGHS +COULD +COULOMB +COULTER +COUNCIL +COUNCILLOR +COUNCILLORS +COUNCILMAN +COUNCILMEN +COUNCILS +COUNCILWOMAN +COUNCILWOMEN +COUNSEL +COUNSELED +COUNSELING +COUNSELLED +COUNSELLING +COUNSELLOR +COUNSELLORS +COUNSELOR +COUNSELORS +COUNSELS +COUNT +COUNTABLE +COUNTABLY +COUNTED +COUNTENANCE +COUNTER +COUNTERACT +COUNTERACTED +COUNTERACTING +COUNTERACTIVE +COUNTERARGUMENT +COUNTERATTACK +COUNTERBALANCE +COUNTERCLOCKWISE +COUNTERED +COUNTEREXAMPLE +COUNTEREXAMPLES +COUNTERFEIT +COUNTERFEITED +COUNTERFEITER +COUNTERFEITING +COUNTERFLOW +COUNTERING +COUNTERINTUITIVE +COUNTERMAN +COUNTERMEASURE +COUNTERMEASURES +COUNTERMEN +COUNTERPART +COUNTERPARTS +COUNTERPOINT +COUNTERPOINTING +COUNTERPOISE +COUNTERPRODUCTIVE +COUNTERPROPOSAL +COUNTERREVOLUTION +COUNTERS +COUNTERSINK +COUNTERSUNK +COUNTESS +COUNTIES +COUNTING +COUNTLESS +COUNTRIES +COUNTRY +COUNTRYMAN +COUNTRYMEN +COUNTRYSIDE +COUNTRYWIDE +COUNTS +COUNTY +COUNTYWIDE +COUPLE +COUPLED +COUPLER +COUPLERS +COUPLES +COUPLING +COUPLINGS +COUPON +COUPONS +COURAGE +COURAGEOUS +COURAGEOUSLY +COURIER +COURIERS +COURSE +COURSED +COURSER +COURSES +COURSING +COURT +COURTED +COURTEOUS +COURTEOUSLY +COURTER +COURTERS +COURTESAN +COURTESIES +COURTESY +COURTHOUSE +COURTHOUSES +COURTIER +COURTIERS +COURTING +COURTLY +COURTNEY +COURTROOM +COURTROOMS +COURTS +COURTSHIP +COURTYARD +COURTYARDS +COUSIN +COUSINS +COVALENT +COVARIANT +COVE +COVENANT +COVENANTS +COVENT +COVENTRY +COVER +COVERABLE +COVERAGE +COVERED +COVERING +COVERINGS +COVERLET +COVERLETS +COVERS +COVERT +COVERTLY +COVES +COVET +COVETED +COVETING +COVETOUS +COVETOUSNESS +COVETS +COW +COWAN +COWARD +COWARDICE +COWARDLY +COWBOY +COWBOYS +COWED +COWER +COWERED +COWERER +COWERERS +COWERING +COWERINGLY +COWERS +COWHERD +COWHIDE +COWING +COWL +COWLICK +COWLING +COWLS +COWORKER +COWS +COWSLIP +COWSLIPS +COYOTE +COYOTES +COYPU +COZIER +COZINESS +COZY +CRAB +CRABAPPLE +CRABS +CRACK +CRACKED +CRACKER +CRACKERS +CRACKING +CRACKLE +CRACKLED +CRACKLES +CRACKLING +CRACKPOT +CRACKS +CRADLE +CRADLED +CRADLES +CRAFT +CRAFTED +CRAFTER +CRAFTINESS +CRAFTING +CRAFTS +CRAFTSMAN +CRAFTSMEN +CRAFTSPEOPLE +CRAFTSPERSON +CRAFTY +CRAG +CRAGGY +CRAGS +CRAIG +CRAM +CRAMER +CRAMMING +CRAMP +CRAMPS +CRAMS +CRANBERRIES +CRANBERRY +CRANDALL +CRANE +CRANES +CRANFORD +CRANIA +CRANIUM +CRANK +CRANKCASE +CRANKED +CRANKIER +CRANKIEST +CRANKILY +CRANKING +CRANKS +CRANKSHAFT +CRANKY +CRANNY +CRANSTON +CRASH +CRASHED +CRASHER +CRASHERS +CRASHES +CRASHING +CRASS +CRATE +CRATER +CRATERS +CRATES +CRAVAT +CRAVATS +CRAVE +CRAVED +CRAVEN +CRAVES +CRAVING +CRAWFORD +CRAWL +CRAWLED +CRAWLER +CRAWLERS +CRAWLING +CRAWLS +CRAY +CRAYON +CRAYS +CRAZE +CRAZED +CRAZES +CRAZIER +CRAZIEST +CRAZILY +CRAZINESS +CRAZING +CRAZY +CREAK +CREAKED +CREAKING +CREAKS +CREAKY +CREAM +CREAMED +CREAMER +CREAMERS +CREAMERY +CREAMING +CREAMS +CREAMY +CREASE +CREASED +CREASES +CREASING +CREATE +CREATED +CREATES +CREATING +CREATION +CREATIONS +CREATIVE +CREATIVELY +CREATIVENESS +CREATIVITY +CREATOR +CREATORS +CREATURE +CREATURES +CREDENCE +CREDENTIAL +CREDIBILITY +CREDIBLE +CREDIBLY +CREDIT +CREDITABLE +CREDITABLY +CREDITED +CREDITING +CREDITOR +CREDITORS +CREDITS +CREDULITY +CREDULOUS +CREDULOUSNESS +CREE +CREED +CREEDS +CREEK +CREEKS +CREEP +CREEPER +CREEPERS +CREEPING +CREEPS +CREEPY +CREIGHTON +CREMATE +CREMATED +CREMATES +CREMATING +CREMATION +CREMATIONS +CREMATORY +CREOLE +CREON +CREPE +CREPT +CRESCENT +CRESCENTS +CREST +CRESTED +CRESTFALLEN +CRESTS +CRESTVIEW +CRETACEOUS +CRETACEOUSLY +CRETAN +CRETE +CRETIN +CREVICE +CREVICES +CREW +CREWCUT +CREWED +CREWING +CREWS +CRIB +CRIBS +CRICKET +CRICKETS +CRIED +CRIER +CRIERS +CRIES +CRIME +CRIMEA +CRIMEAN +CRIMES +CRIMINAL +CRIMINALLY +CRIMINALS +CRIMINATE +CRIMSON +CRIMSONING +CRINGE +CRINGED +CRINGES +CRINGING +CRIPPLE +CRIPPLED +CRIPPLES +CRIPPLING +CRISES +CRISIS +CRISP +CRISPIN +CRISPLY +CRISPNESS +CRISSCROSS +CRITERIA +CRITERION +CRITIC +CRITICAL +CRITICALLY +CRITICISM +CRITICISMS +CRITICIZE +CRITICIZED +CRITICIZES +CRITICIZING +CRITICS +CRITIQUE +CRITIQUES +CRITIQUING +CRITTER +CROAK +CROAKED +CROAKING +CROAKS +CROATIA +CROATIAN +CROCHET +CROCHETS +CROCK +CROCKERY +CROCKETT +CROCKS +CROCODILE +CROCUS +CROFT +CROIX +CROMWELL +CROMWELLIAN +CROOK +CROOKED +CROOKS +CROP +CROPPED +CROPPER +CROPPERS +CROPPING +CROPS +CROSBY +CROSS +CROSSABLE +CROSSBAR +CROSSBARS +CROSSED +CROSSER +CROSSERS +CROSSES +CROSSING +CROSSINGS +CROSSLY +CROSSOVER +CROSSOVERS +CROSSPOINT +CROSSROAD +CROSSTALK +CROSSWALK +CROSSWORD +CROSSWORDS +CROTCH +CROTCHETY +CROUCH +CROUCHED +CROUCHING +CROW +CROWD +CROWDED +CROWDER +CROWDING +CROWDS +CROWED +CROWING +CROWLEY +CROWN +CROWNED +CROWNING +CROWNS +CROWS +CROYDON +CRUCIAL +CRUCIALLY +CRUCIBLE +CRUCIFIED +CRUCIFIES +CRUCIFIX +CRUCIFIXION +CRUCIFY +CRUCIFYING +CRUD +CRUDDY +CRUDE +CRUDELY +CRUDENESS +CRUDER +CRUDEST +CRUEL +CRUELER +CRUELEST +CRUELLY +CRUELTY +CRUICKSHANK +CRUISE +CRUISER +CRUISERS +CRUISES +CRUISING +CRUMB +CRUMBLE +CRUMBLED +CRUMBLES +CRUMBLING +CRUMBLY +CRUMBS +CRUMMY +CRUMPLE +CRUMPLED +CRUMPLES +CRUMPLING +CRUNCH +CRUNCHED +CRUNCHES +CRUNCHIER +CRUNCHIEST +CRUNCHING +CRUNCHY +CRUSADE +CRUSADER +CRUSADERS +CRUSADES +CRUSADING +CRUSH +CRUSHABLE +CRUSHED +CRUSHER +CRUSHERS +CRUSHES +CRUSHING +CRUSHINGLY +CRUSOE +CRUST +CRUSTACEAN +CRUSTACEANS +CRUSTS +CRUTCH +CRUTCHES +CRUX +CRUXES +CRUZ +CRY +CRYING +CRYOGENIC +CRYPT +CRYPTANALYSIS +CRYPTANALYST +CRYPTANALYTIC +CRYPTIC +CRYPTOGRAM +CRYPTOGRAPHER +CRYPTOGRAPHIC +CRYPTOGRAPHICALLY +CRYPTOGRAPHY +CRYPTOLOGIST +CRYPTOLOGY +CRYSTAL +CRYSTALLINE +CRYSTALLIZE +CRYSTALLIZED +CRYSTALLIZES +CRYSTALLIZING +CRYSTALS +CUB +CUBA +CUBAN +CUBANIZE +CUBANIZES +CUBANS +CUBBYHOLE +CUBE +CUBED +CUBES +CUBIC +CUBS +CUCKOO +CUCKOOS +CUCUMBER +CUCUMBERS +CUDDLE +CUDDLED +CUDDLY +CUDGEL +CUDGELS +CUE +CUED +CUES +CUFF +CUFFLINK +CUFFS +CUISINE +CULBERTSON +CULINARY +CULL +CULLED +CULLER +CULLING +CULLS +CULMINATE +CULMINATED +CULMINATES +CULMINATING +CULMINATION +CULPA +CULPABLE +CULPRIT +CULPRITS +CULT +CULTIVABLE +CULTIVATE +CULTIVATED +CULTIVATES +CULTIVATING +CULTIVATION +CULTIVATIONS +CULTIVATOR +CULTIVATORS +CULTS +CULTURAL +CULTURALLY +CULTURE +CULTURED +CULTURES +CULTURING +CULVER +CULVERS +CUMBERLAND +CUMBERSOME +CUMMINGS +CUMMINS +CUMULATIVE +CUMULATIVELY +CUNARD +CUNNILINGUS +CUNNING +CUNNINGHAM +CUNNINGLY +CUP +CUPBOARD +CUPBOARDS +CUPERTINO +CUPFUL +CUPID +CUPPED +CUPPING +CUPS +CURABLE +CURABLY +CURB +CURBING +CURBS +CURD +CURDLE +CURE +CURED +CURES +CURFEW +CURFEWS +CURING +CURIOSITIES +CURIOSITY +CURIOUS +CURIOUSER +CURIOUSEST +CURIOUSLY +CURL +CURLED +CURLER +CURLERS +CURLICUE +CURLING +CURLS +CURLY +CURRAN +CURRANT +CURRANTS +CURRENCIES +CURRENCY +CURRENT +CURRENTLY +CURRENTNESS +CURRENTS +CURRICULAR +CURRICULUM +CURRICULUMS +CURRIED +CURRIES +CURRY +CURRYING +CURS +CURSE +CURSED +CURSES +CURSING +CURSIVE +CURSOR +CURSORILY +CURSORS +CURSORY +CURT +CURTAIL +CURTAILED +CURTAILS +CURTAIN +CURTAINED +CURTAINS +CURTATE +CURTIS +CURTLY +CURTNESS +CURTSIES +CURTSY +CURVACEOUS +CURVATURE +CURVE +CURVED +CURVES +CURVILINEAR +CURVING +CUSHING +CUSHION +CUSHIONED +CUSHIONING +CUSHIONS +CUSHMAN +CUSP +CUSPS +CUSTARD +CUSTER +CUSTODIAL +CUSTODIAN +CUSTODIANS +CUSTODY +CUSTOM +CUSTOMARILY +CUSTOMARY +CUSTOMER +CUSTOMERS +CUSTOMIZABLE +CUSTOMIZATION +CUSTOMIZATIONS +CUSTOMIZE +CUSTOMIZED +CUSTOMIZER +CUSTOMIZERS +CUSTOMIZES +CUSTOMIZING +CUSTOMS +CUT +CUTANEOUS +CUTBACK +CUTE +CUTEST +CUTLASS +CUTLET +CUTOFF +CUTOUT +CUTOVER +CUTS +CUTTER +CUTTERS +CUTTHROAT +CUTTING +CUTTINGLY +CUTTINGS +CUTTLEFISH +CUVIER +CUZCO +CYANAMID +CYANIDE +CYBERNETIC +CYBERNETICS +CYBERSPACE +CYCLADES +CYCLE +CYCLED +CYCLES +CYCLIC +CYCLICALLY +CYCLING +CYCLOID +CYCLOIDAL +CYCLOIDS +CYCLONE +CYCLONES +CYCLOPS +CYCLOTRON +CYCLOTRONS +CYGNUS +CYLINDER +CYLINDERS +CYLINDRICAL +CYMBAL +CYMBALS +CYNIC +CYNICAL +CYNICALLY +CYNTHIA +CYPRESS +CYPRIAN +CYPRIOT +CYPRUS +CYRIL +CYRILLIC +CYRUS +CYST +CYSTS +CYTOLOGY +CYTOPLASM +CZAR +CZECH +CZECHIZATION +CZECHIZATIONS +CZECHOSLOVAKIA +CZERNIAK +DABBLE +DABBLED +DABBLER +DABBLES +DABBLING +DACCA +DACRON +DACTYL +DACTYLIC +DAD +DADA +DADAISM +DADAIST +DADAISTIC +DADDY +DADE +DADS +DAEDALUS +DAEMON +DAEMONS +DAFFODIL +DAFFODILS +DAGGER +DAHL +DAHLIA +DAHOMEY +DAILEY +DAILIES +DAILY +DAIMLER +DAINTILY +DAINTINESS +DAINTY +DAIRY +DAIRYLEA +DAISIES +DAISY +DAKAR +DAKOTA +DALE +DALES +DALEY +DALHOUSIE +DALI +DALLAS +DALTON +DALY +DALZELL +DAM +DAMAGE +DAMAGED +DAMAGER +DAMAGERS +DAMAGES +DAMAGING +DAMASCUS +DAMASK +DAME +DAMMING +DAMN +DAMNATION +DAMNED +DAMNING +DAMNS +DAMOCLES +DAMON +DAMP +DAMPEN +DAMPENS +DAMPER +DAMPING +DAMPNESS +DAMS +DAMSEL +DAMSELS +DAN +DANA +DANBURY +DANCE +DANCED +DANCER +DANCERS +DANCES +DANCING +DANDELION +DANDELIONS +DANDY +DANE +DANES +DANGER +DANGEROUS +DANGEROUSLY +DANGERS +DANGLE +DANGLED +DANGLES +DANGLING +DANIEL +DANIELS +DANIELSON +DANISH +DANIZATION +DANIZATIONS +DANIZE +DANIZES +DANNY +DANTE +DANUBE +DANUBIAN +DANVILLE +DANZIG +DAPHNE +DAR +DARE +DARED +DARER +DARERS +DARES +DARESAY +DARING +DARINGLY +DARIUS +DARK +DARKEN +DARKER +DARKEST +DARKLY +DARKNESS +DARKROOM +DARLENE +DARLING +DARLINGS +DARLINGTON +DARN +DARNED +DARNER +DARNING +DARNS +DARPA +DARRELL +DARROW +DARRY +DART +DARTED +DARTER +DARTING +DARTMOUTH +DARTS +DARWIN +DARWINIAN +DARWINISM +DARWINISTIC +DARWINIZE +DARWINIZES +DASH +DASHBOARD +DASHED +DASHER +DASHERS +DASHES +DASHING +DASHINGLY +DATA +DATABASE +DATABASES +DATAGRAM +DATAGRAMS +DATAMATION +DATAMEDIA +DATE +DATED +DATELINE +DATER +DATES +DATING +DATIVE +DATSUN +DATUM +DAUGHERTY +DAUGHTER +DAUGHTERLY +DAUGHTERS +DAUNT +DAUNTED +DAUNTLESS +DAVE +DAVID +DAVIDSON +DAVIE +DAVIES +DAVINICH +DAVIS +DAVISON +DAVY +DAWN +DAWNED +DAWNING +DAWNS +DAWSON +DAY +DAYBREAK +DAYDREAM +DAYDREAMING +DAYDREAMS +DAYLIGHT +DAYLIGHTS +DAYS +DAYTIME +DAYTON +DAYTONA +DAZE +DAZED +DAZZLE +DAZZLED +DAZZLER +DAZZLES +DAZZLING +DAZZLINGLY +DEACON +DEACONS +DEACTIVATE +DEAD +DEADEN +DEADLINE +DEADLINES +DEADLOCK +DEADLOCKED +DEADLOCKING +DEADLOCKS +DEADLY +DEADNESS +DEADWOOD +DEAF +DEAFEN +DEAFER +DEAFEST +DEAFNESS +DEAL +DEALER +DEALERS +DEALERSHIP +DEALING +DEALINGS +DEALLOCATE +DEALLOCATED +DEALLOCATING +DEALLOCATION +DEALLOCATIONS +DEALS +DEALT +DEAN +DEANE +DEANNA +DEANS +DEAR +DEARBORN +DEARER +DEAREST +DEARLY +DEARNESS +DEARTH +DEARTHS +DEATH +DEATHBED +DEATHLY +DEATHS +DEBACLE +DEBAR +DEBASE +DEBATABLE +DEBATE +DEBATED +DEBATER +DEBATERS +DEBATES +DEBATING +DEBAUCH +DEBAUCHERY +DEBBIE +DEBBY +DEBILITATE +DEBILITATED +DEBILITATES +DEBILITATING +DEBILITY +DEBIT +DEBITED +DEBORAH +DEBRA +DEBRIEF +DEBRIS +DEBT +DEBTOR +DEBTS +DEBUG +DEBUGGED +DEBUGGER +DEBUGGERS +DEBUGGING +DEBUGS +DEBUNK +DEBUSSY +DEBUTANTE +DEC +DECADE +DECADENCE +DECADENT +DECADENTLY +DECADES +DECAL +DECATHLON +DECATUR +DECAY +DECAYED +DECAYING +DECAYS +DECCA +DECEASE +DECEASED +DECEASES +DECEASING +DECEDENT +DECEIT +DECEITFUL +DECEITFULLY +DECEITFULNESS +DECEIVE +DECEIVED +DECEIVER +DECEIVERS +DECEIVES +DECEIVING +DECELERATE +DECELERATED +DECELERATES +DECELERATING +DECELERATION +DECEMBER +DECEMBERS +DECENCIES +DECENCY +DECENNIAL +DECENT +DECENTLY +DECENTRALIZATION +DECENTRALIZED +DECEPTION +DECEPTIONS +DECEPTIVE +DECEPTIVELY +DECERTIFY +DECIBEL +DECIDABILITY +DECIDABLE +DECIDE +DECIDED +DECIDEDLY +DECIDES +DECIDING +DECIDUOUS +DECIMAL +DECIMALS +DECIMATE +DECIMATED +DECIMATES +DECIMATING +DECIMATION +DECIPHER +DECIPHERED +DECIPHERER +DECIPHERING +DECIPHERS +DECISION +DECISIONS +DECISIVE +DECISIVELY +DECISIVENESS +DECK +DECKED +DECKER +DECKING +DECKINGS +DECKS +DECLARATION +DECLARATIONS +DECLARATIVE +DECLARATIVELY +DECLARATIVES +DECLARATOR +DECLARATORY +DECLARE +DECLARED +DECLARER +DECLARERS +DECLARES +DECLARING +DECLASSIFY +DECLINATION +DECLINATIONS +DECLINE +DECLINED +DECLINER +DECLINERS +DECLINES +DECLINING +DECNET +DECODE +DECODED +DECODER +DECODERS +DECODES +DECODING +DECODINGS +DECOLLETAGE +DECOLLIMATE +DECOMPILE +DECOMPOSABILITY +DECOMPOSABLE +DECOMPOSE +DECOMPOSED +DECOMPOSES +DECOMPOSING +DECOMPOSITION +DECOMPOSITIONS +DECOMPRESS +DECOMPRESSION +DECORATE +DECORATED +DECORATES +DECORATING +DECORATION +DECORATIONS +DECORATIVE +DECORUM +DECOUPLE +DECOUPLED +DECOUPLES +DECOUPLING +DECOY +DECOYS +DECREASE +DECREASED +DECREASES +DECREASING +DECREASINGLY +DECREE +DECREED +DECREEING +DECREES +DECREMENT +DECREMENTED +DECREMENTING +DECREMENTS +DECRYPT +DECRYPTED +DECRYPTING +DECRYPTION +DECRYPTS +DECSTATION +DECSYSTEM +DECTAPE +DEDICATE +DEDICATED +DEDICATES +DEDICATING +DEDICATION +DEDUCE +DEDUCED +DEDUCER +DEDUCES +DEDUCIBLE +DEDUCING +DEDUCT +DEDUCTED +DEDUCTIBLE +DEDUCTING +DEDUCTION +DEDUCTIONS +DEDUCTIVE +DEE +DEED +DEEDED +DEEDING +DEEDS +DEEM +DEEMED +DEEMING +DEEMPHASIZE +DEEMPHASIZED +DEEMPHASIZES +DEEMPHASIZING +DEEMS +DEEP +DEEPEN +DEEPENED +DEEPENING +DEEPENS +DEEPER +DEEPEST +DEEPLY +DEEPS +DEER +DEERE +DEFACE +DEFAULT +DEFAULTED +DEFAULTER +DEFAULTING +DEFAULTS +DEFEAT +DEFEATED +DEFEATING +DEFEATS +DEFECATE +DEFECT +DEFECTED +DEFECTING +DEFECTION +DEFECTIONS +DEFECTIVE +DEFECTS +DEFEND +DEFENDANT +DEFENDANTS +DEFENDED +DEFENDER +DEFENDERS +DEFENDING +DEFENDS +DEFENESTRATE +DEFENESTRATED +DEFENESTRATES +DEFENESTRATING +DEFENESTRATION +DEFENSE +DEFENSELESS +DEFENSES +DEFENSIBLE +DEFENSIVE +DEFER +DEFERENCE +DEFERMENT +DEFERMENTS +DEFERRABLE +DEFERRED +DEFERRER +DEFERRERS +DEFERRING +DEFERS +DEFIANCE +DEFIANT +DEFIANTLY +DEFICIENCIES +DEFICIENCY +DEFICIENT +DEFICIT +DEFICITS +DEFIED +DEFIES +DEFILE +DEFILING +DEFINABLE +DEFINE +DEFINED +DEFINER +DEFINES +DEFINING +DEFINITE +DEFINITELY +DEFINITENESS +DEFINITION +DEFINITIONAL +DEFINITIONS +DEFINITIVE +DEFLATE +DEFLATER +DEFLECT +DEFOCUS +DEFOE +DEFOREST +DEFORESTATION +DEFORM +DEFORMATION +DEFORMATIONS +DEFORMED +DEFORMITIES +DEFORMITY +DEFRAUD +DEFRAY +DEFROST +DEFTLY +DEFUNCT +DEFY +DEFYING +DEGENERACY +DEGENERATE +DEGENERATED +DEGENERATES +DEGENERATING +DEGENERATION +DEGENERATIVE +DEGRADABLE +DEGRADATION +DEGRADATIONS +DEGRADE +DEGRADED +DEGRADES +DEGRADING +DEGREE +DEGREES +DEHUMIDIFY +DEHYDRATE +DEIFY +DEIGN +DEIGNED +DEIGNING +DEIGNS +DEIMOS +DEIRDRE +DEIRDRES +DEITIES +DEITY +DEJECTED +DEJECTEDLY +DEKALB +DEKASTERE +DEL +DELANEY +DELANO +DELAWARE +DELAY +DELAYED +DELAYING +DELAYS +DELEGATE +DELEGATED +DELEGATES +DELEGATING +DELEGATION +DELEGATIONS +DELETE +DELETED +DELETER +DELETERIOUS +DELETES +DELETING +DELETION +DELETIONS +DELFT +DELHI +DELIA +DELIBERATE +DELIBERATED +DELIBERATELY +DELIBERATENESS +DELIBERATES +DELIBERATING +DELIBERATION +DELIBERATIONS +DELIBERATIVE +DELIBERATOR +DELIBERATORS +DELICACIES +DELICACY +DELICATE +DELICATELY +DELICATESSEN +DELICIOUS +DELICIOUSLY +DELIGHT +DELIGHTED +DELIGHTEDLY +DELIGHTFUL +DELIGHTFULLY +DELIGHTING +DELIGHTS +DELILAH +DELIMIT +DELIMITATION +DELIMITED +DELIMITER +DELIMITERS +DELIMITING +DELIMITS +DELINEAMENT +DELINEATE +DELINEATED +DELINEATES +DELINEATING +DELINEATION +DELINQUENCY +DELINQUENT +DELIRIOUS +DELIRIOUSLY +DELIRIUM +DELIVER +DELIVERABLE +DELIVERABLES +DELIVERANCE +DELIVERED +DELIVERER +DELIVERERS +DELIVERIES +DELIVERING +DELIVERS +DELIVERY +DELL +DELLA +DELLS +DELLWOOD +DELMARVA +DELPHI +DELPHIC +DELPHICALLY +DELPHINUS +DELTA +DELTAS +DELUDE +DELUDED +DELUDES +DELUDING +DELUGE +DELUGED +DELUGES +DELUSION +DELUSIONS +DELUXE +DELVE +DELVES +DELVING +DEMAGNIFY +DEMAGOGUE +DEMAND +DEMANDED +DEMANDER +DEMANDING +DEMANDINGLY +DEMANDS +DEMARCATE +DEMEANOR +DEMENTED +DEMERIT +DEMETER +DEMIGOD +DEMISE +DEMO +DEMOCRACIES +DEMOCRACY +DEMOCRAT +DEMOCRATIC +DEMOCRATICALLY +DEMOCRATS +DEMODULATE +DEMODULATOR +DEMOGRAPHIC +DEMOLISH +DEMOLISHED +DEMOLISHES +DEMOLITION +DEMON +DEMONIAC +DEMONIC +DEMONS +DEMONSTRABLE +DEMONSTRATE +DEMONSTRATED +DEMONSTRATES +DEMONSTRATING +DEMONSTRATION +DEMONSTRATIONS +DEMONSTRATIVE +DEMONSTRATIVELY +DEMONSTRATOR +DEMONSTRATORS +DEMORALIZE +DEMORALIZED +DEMORALIZES +DEMORALIZING +DEMORGAN +DEMOTE +DEMOUNTABLE +DEMPSEY +DEMULTIPLEX +DEMULTIPLEXED +DEMULTIPLEXER +DEMULTIPLEXERS +DEMULTIPLEXING +DEMUR +DEMYTHOLOGIZE +DEN +DENATURE +DENEB +DENEBOLA +DENEEN +DENIABLE +DENIAL +DENIALS +DENIED +DENIER +DENIES +DENIGRATE +DENIGRATED +DENIGRATES +DENIGRATING +DENIZEN +DENMARK +DENNIS +DENNY +DENOMINATE +DENOMINATION +DENOMINATIONS +DENOMINATOR +DENOMINATORS +DENOTABLE +DENOTATION +DENOTATIONAL +DENOTATIONALLY +DENOTATIONS +DENOTATIVE +DENOTE +DENOTED +DENOTES +DENOTING +DENOUNCE +DENOUNCED +DENOUNCES +DENOUNCING +DENS +DENSE +DENSELY +DENSENESS +DENSER +DENSEST +DENSITIES +DENSITY +DENT +DENTAL +DENTALLY +DENTED +DENTING +DENTIST +DENTISTRY +DENTISTS +DENTON +DENTS +DENTURE +DENUDE +DENUMERABLE +DENUNCIATE +DENUNCIATION +DENVER +DENY +DENYING +DEODORANT +DEOXYRIBONUCLEIC +DEPART +DEPARTED +DEPARTING +DEPARTMENT +DEPARTMENTAL +DEPARTMENTS +DEPARTS +DEPARTURE +DEPARTURES +DEPEND +DEPENDABILITY +DEPENDABLE +DEPENDABLY +DEPENDED +DEPENDENCE +DEPENDENCIES +DEPENDENCY +DEPENDENT +DEPENDENTLY +DEPENDENTS +DEPENDING +DEPENDS +DEPICT +DEPICTED +DEPICTING +DEPICTS +DEPLETE +DEPLETED +DEPLETES +DEPLETING +DEPLETION +DEPLETIONS +DEPLORABLE +DEPLORE +DEPLORED +DEPLORES +DEPLORING +DEPLOY +DEPLOYED +DEPLOYING +DEPLOYMENT +DEPLOYMENTS +DEPLOYS +DEPORT +DEPORTATION +DEPORTEE +DEPORTMENT +DEPOSE +DEPOSED +DEPOSES +DEPOSIT +DEPOSITARY +DEPOSITED +DEPOSITING +DEPOSITION +DEPOSITIONS +DEPOSITOR +DEPOSITORS +DEPOSITORY +DEPOSITS +DEPOT +DEPOTS +DEPRAVE +DEPRAVED +DEPRAVITY +DEPRECATE +DEPRECIATE +DEPRECIATED +DEPRECIATES +DEPRECIATION +DEPRESS +DEPRESSED +DEPRESSES +DEPRESSING +DEPRESSION +DEPRESSIONS +DEPRIVATION +DEPRIVATIONS +DEPRIVE +DEPRIVED +DEPRIVES +DEPRIVING +DEPTH +DEPTHS +DEPUTIES +DEPUTY +DEQUEUE +DEQUEUED +DEQUEUES +DEQUEUING +DERAIL +DERAILED +DERAILING +DERAILS +DERBY +DERBYSHIRE +DEREFERENCE +DEREGULATE +DEREGULATED +DEREK +DERIDE +DERISION +DERIVABLE +DERIVATION +DERIVATIONS +DERIVATIVE +DERIVATIVES +DERIVE +DERIVED +DERIVES +DERIVING +DEROGATORY +DERRICK +DERRIERE +DERVISH +DES +DESCARTES +DESCEND +DESCENDANT +DESCENDANTS +DESCENDED +DESCENDENT +DESCENDER +DESCENDERS +DESCENDING +DESCENDS +DESCENT +DESCENTS +DESCRIBABLE +DESCRIBE +DESCRIBED +DESCRIBER +DESCRIBES +DESCRIBING +DESCRIPTION +DESCRIPTIONS +DESCRIPTIVE +DESCRIPTIVELY +DESCRIPTIVES +DESCRIPTOR +DESCRIPTORS +DESCRY +DESECRATE +DESEGREGATE +DESERT +DESERTED +DESERTER +DESERTERS +DESERTING +DESERTION +DESERTIONS +DESERTS +DESERVE +DESERVED +DESERVES +DESERVING +DESERVINGLY +DESERVINGS +DESIDERATA +DESIDERATUM +DESIGN +DESIGNATE +DESIGNATED +DESIGNATES +DESIGNATING +DESIGNATION +DESIGNATIONS +DESIGNATOR +DESIGNATORS +DESIGNED +DESIGNER +DESIGNERS +DESIGNING +DESIGNS +DESIRABILITY +DESIRABLE +DESIRABLY +DESIRE +DESIRED +DESIRES +DESIRING +DESIROUS +DESIST +DESK +DESKS +DESKTOP +DESMOND +DESOLATE +DESOLATELY +DESOLATION +DESOLATIONS +DESPAIR +DESPAIRED +DESPAIRING +DESPAIRINGLY +DESPAIRS +DESPATCH +DESPATCHED +DESPERADO +DESPERATE +DESPERATELY +DESPERATION +DESPICABLE +DESPISE +DESPISED +DESPISES +DESPISING +DESPITE +DESPOIL +DESPONDENT +DESPOT +DESPOTIC +DESPOTISM +DESPOTS +DESSERT +DESSERTS +DESSICATE +DESTABILIZE +DESTINATION +DESTINATIONS +DESTINE +DESTINED +DESTINIES +DESTINY +DESTITUTE +DESTITUTION +DESTROY +DESTROYED +DESTROYER +DESTROYERS +DESTROYING +DESTROYS +DESTRUCT +DESTRUCTION +DESTRUCTIONS +DESTRUCTIVE +DESTRUCTIVELY +DESTRUCTIVENESS +DESTRUCTOR +DESTUFF +DESTUFFING +DESTUFFS +DESUETUDE +DESULTORY +DESYNCHRONIZE +DETACH +DETACHED +DETACHER +DETACHES +DETACHING +DETACHMENT +DETACHMENTS +DETAIL +DETAILED +DETAILING +DETAILS +DETAIN +DETAINED +DETAINING +DETAINS +DETECT +DETECTABLE +DETECTABLY +DETECTED +DETECTING +DETECTION +DETECTIONS +DETECTIVE +DETECTIVES +DETECTOR +DETECTORS +DETECTS +DETENTE +DETENTION +DETER +DETERGENT +DETERIORATE +DETERIORATED +DETERIORATES +DETERIORATING +DETERIORATION +DETERMINABLE +DETERMINACY +DETERMINANT +DETERMINANTS +DETERMINATE +DETERMINATELY +DETERMINATION +DETERMINATIONS +DETERMINATIVE +DETERMINE +DETERMINED +DETERMINER +DETERMINERS +DETERMINES +DETERMINING +DETERMINISM +DETERMINISTIC +DETERMINISTICALLY +DETERRED +DETERRENT +DETERRING +DETEST +DETESTABLE +DETESTED +DETOUR +DETRACT +DETRACTOR +DETRACTORS +DETRACTS +DETRIMENT +DETRIMENTAL +DETROIT +DEUCE +DEUS +DEUTERIUM +DEUTSCH +DEVASTATE +DEVASTATED +DEVASTATES +DEVASTATING +DEVASTATION +DEVELOP +DEVELOPED +DEVELOPER +DEVELOPERS +DEVELOPING +DEVELOPMENT +DEVELOPMENTAL +DEVELOPMENTS +DEVELOPS +DEVIANT +DEVIANTS +DEVIATE +DEVIATED +DEVIATES +DEVIATING +DEVIATION +DEVIATIONS +DEVICE +DEVICES +DEVIL +DEVILISH +DEVILISHLY +DEVILS +DEVIOUS +DEVISE +DEVISED +DEVISES +DEVISING +DEVISINGS +DEVOID +DEVOLVE +DEVON +DEVONSHIRE +DEVOTE +DEVOTED +DEVOTEDLY +DEVOTEE +DEVOTEES +DEVOTES +DEVOTING +DEVOTION +DEVOTIONS +DEVOUR +DEVOURED +DEVOURER +DEVOURS +DEVOUT +DEVOUTLY +DEVOUTNESS +DEW +DEWDROP +DEWDROPS +DEWEY +DEWITT +DEWY +DEXEDRINE +DEXTERITY +DHABI +DIABETES +DIABETIC +DIABOLIC +DIACHRONIC +DIACRITICAL +DIADEM +DIAGNOSABLE +DIAGNOSE +DIAGNOSED +DIAGNOSES +DIAGNOSING +DIAGNOSIS +DIAGNOSTIC +DIAGNOSTICIAN +DIAGNOSTICS +DIAGONAL +DIAGONALLY +DIAGONALS +DIAGRAM +DIAGRAMMABLE +DIAGRAMMATIC +DIAGRAMMATICALLY +DIAGRAMMED +DIAGRAMMER +DIAGRAMMERS +DIAGRAMMING +DIAGRAMS +DIAL +DIALECT +DIALECTIC +DIALECTS +DIALED +DIALER +DIALERS +DIALING +DIALOG +DIALOGS +DIALOGUE +DIALOGUES +DIALS +DIALUP +DIALYSIS +DIAMAGNETIC +DIAMETER +DIAMETERS +DIAMETRIC +DIAMETRICALLY +DIAMOND +DIAMONDS +DIANA +DIANE +DIANNE +DIAPER +DIAPERS +DIAPHRAGM +DIAPHRAGMS +DIARIES +DIARRHEA +DIARY +DIATRIBE +DIATRIBES +DIBBLE +DICE +DICHOTOMIZE +DICHOTOMY +DICKENS +DICKERSON +DICKINSON +DICKSON +DICKY +DICTATE +DICTATED +DICTATES +DICTATING +DICTATION +DICTATIONS +DICTATOR +DICTATORIAL +DICTATORS +DICTATORSHIP +DICTION +DICTIONARIES +DICTIONARY +DICTUM +DICTUMS +DID +DIDACTIC +DIDDLE +DIDO +DIE +DIEBOLD +DIED +DIEGO +DIEHARD +DIELECTRIC +DIELECTRICS +DIEM +DIES +DIESEL +DIET +DIETARY +DIETER +DIETERS +DIETETIC +DIETICIAN +DIETITIAN +DIETITIANS +DIETRICH +DIETS +DIETZ +DIFFER +DIFFERED +DIFFERENCE +DIFFERENCES +DIFFERENT +DIFFERENTIABLE +DIFFERENTIAL +DIFFERENTIALS +DIFFERENTIATE +DIFFERENTIATED +DIFFERENTIATES +DIFFERENTIATING +DIFFERENTIATION +DIFFERENTIATIONS +DIFFERENTIATORS +DIFFERENTLY +DIFFERER +DIFFERERS +DIFFERING +DIFFERS +DIFFICULT +DIFFICULTIES +DIFFICULTLY +DIFFICULTY +DIFFRACT +DIFFUSE +DIFFUSED +DIFFUSELY +DIFFUSER +DIFFUSERS +DIFFUSES +DIFFUSIBLE +DIFFUSING +DIFFUSION +DIFFUSIONS +DIFFUSIVE +DIG +DIGEST +DIGESTED +DIGESTIBLE +DIGESTING +DIGESTION +DIGESTIVE +DIGESTS +DIGGER +DIGGERS +DIGGING +DIGGINGS +DIGIT +DIGITAL +DIGITALIS +DIGITALLY +DIGITIZATION +DIGITIZE +DIGITIZED +DIGITIZES +DIGITIZING +DIGITS +DIGNIFIED +DIGNIFY +DIGNITARY +DIGNITIES +DIGNITY +DIGRAM +DIGRESS +DIGRESSED +DIGRESSES +DIGRESSING +DIGRESSION +DIGRESSIONS +DIGRESSIVE +DIGS +DIHEDRAL +DIJKSTRA +DIJON +DIKE +DIKES +DILAPIDATE +DILATATION +DILATE +DILATED +DILATES +DILATING +DILATION +DILDO +DILEMMA +DILEMMAS +DILIGENCE +DILIGENT +DILIGENTLY +DILL +DILLON +DILOGARITHM +DILUTE +DILUTED +DILUTES +DILUTING +DILUTION +DIM +DIMAGGIO +DIME +DIMENSION +DIMENSIONAL +DIMENSIONALITY +DIMENSIONALLY +DIMENSIONED +DIMENSIONING +DIMENSIONS +DIMES +DIMINISH +DIMINISHED +DIMINISHES +DIMINISHING +DIMINUTION +DIMINUTIVE +DIMLY +DIMMED +DIMMER +DIMMERS +DIMMEST +DIMMING +DIMNESS +DIMPLE +DIMS +DIN +DINAH +DINE +DINED +DINER +DINERS +DINES +DING +DINGHY +DINGINESS +DINGO +DINGY +DINING +DINNER +DINNERS +DINNERTIME +DINNERWARE +DINOSAUR +DINT +DIOCLETIAN +DIODE +DIODES +DIOGENES +DION +DIONYSIAN +DIONYSUS +DIOPHANTINE +DIOPTER +DIORAMA +DIOXIDE +DIP +DIPHTHERIA +DIPHTHONG +DIPLOMA +DIPLOMACY +DIPLOMAS +DIPLOMAT +DIPLOMATIC +DIPLOMATS +DIPOLE +DIPPED +DIPPER +DIPPERS +DIPPING +DIPPINGS +DIPS +DIRAC +DIRE +DIRECT +DIRECTED +DIRECTING +DIRECTION +DIRECTIONAL +DIRECTIONALITY +DIRECTIONALLY +DIRECTIONS +DIRECTIVE +DIRECTIVES +DIRECTLY +DIRECTNESS +DIRECTOR +DIRECTORATE +DIRECTORIES +DIRECTORS +DIRECTORY +DIRECTRICES +DIRECTRIX +DIRECTS +DIRGE +DIRGES +DIRICHLET +DIRT +DIRTIER +DIRTIEST +DIRTILY +DIRTINESS +DIRTS +DIRTY +DIS +DISABILITIES +DISABILITY +DISABLE +DISABLED +DISABLER +DISABLERS +DISABLES +DISABLING +DISADVANTAGE +DISADVANTAGEOUS +DISADVANTAGES +DISAFFECTED +DISAFFECTION +DISAGREE +DISAGREEABLE +DISAGREED +DISAGREEING +DISAGREEMENT +DISAGREEMENTS +DISAGREES +DISALLOW +DISALLOWED +DISALLOWING +DISALLOWS +DISAMBIGUATE +DISAMBIGUATED +DISAMBIGUATES +DISAMBIGUATING +DISAMBIGUATION +DISAMBIGUATIONS +DISAPPEAR +DISAPPEARANCE +DISAPPEARANCES +DISAPPEARED +DISAPPEARING +DISAPPEARS +DISAPPOINT +DISAPPOINTED +DISAPPOINTING +DISAPPOINTMENT +DISAPPOINTMENTS +DISAPPROVAL +DISAPPROVE +DISAPPROVED +DISAPPROVES +DISARM +DISARMAMENT +DISARMED +DISARMING +DISARMS +DISASSEMBLE +DISASSEMBLED +DISASSEMBLES +DISASSEMBLING +DISASSEMBLY +DISASTER +DISASTERS +DISASTROUS +DISASTROUSLY +DISBAND +DISBANDED +DISBANDING +DISBANDS +DISBURSE +DISBURSED +DISBURSEMENT +DISBURSEMENTS +DISBURSES +DISBURSING +DISC +DISCARD +DISCARDED +DISCARDING +DISCARDS +DISCERN +DISCERNED +DISCERNIBILITY +DISCERNIBLE +DISCERNIBLY +DISCERNING +DISCERNINGLY +DISCERNMENT +DISCERNS +DISCHARGE +DISCHARGED +DISCHARGES +DISCHARGING +DISCIPLE +DISCIPLES +DISCIPLINARY +DISCIPLINE +DISCIPLINED +DISCIPLINES +DISCIPLINING +DISCLAIM +DISCLAIMED +DISCLAIMER +DISCLAIMS +DISCLOSE +DISCLOSED +DISCLOSES +DISCLOSING +DISCLOSURE +DISCLOSURES +DISCOMFORT +DISCONCERT +DISCONCERTING +DISCONCERTINGLY +DISCONNECT +DISCONNECTED +DISCONNECTING +DISCONNECTION +DISCONNECTS +DISCONTENT +DISCONTENTED +DISCONTINUANCE +DISCONTINUE +DISCONTINUED +DISCONTINUES +DISCONTINUITIES +DISCONTINUITY +DISCONTINUOUS +DISCORD +DISCORDANT +DISCOUNT +DISCOUNTED +DISCOUNTING +DISCOUNTS +DISCOURAGE +DISCOURAGED +DISCOURAGEMENT +DISCOURAGES +DISCOURAGING +DISCOURSE +DISCOURSES +DISCOVER +DISCOVERED +DISCOVERER +DISCOVERERS +DISCOVERIES +DISCOVERING +DISCOVERS +DISCOVERY +DISCREDIT +DISCREDITED +DISCREET +DISCREETLY +DISCREPANCIES +DISCREPANCY +DISCRETE +DISCRETELY +DISCRETENESS +DISCRETION +DISCRETIONARY +DISCRIMINANT +DISCRIMINATE +DISCRIMINATED +DISCRIMINATES +DISCRIMINATING +DISCRIMINATION +DISCRIMINATORY +DISCS +DISCUSS +DISCUSSANT +DISCUSSED +DISCUSSES +DISCUSSING +DISCUSSION +DISCUSSIONS +DISDAIN +DISDAINING +DISDAINS +DISEASE +DISEASED +DISEASES +DISEMBOWEL +DISENGAGE +DISENGAGED +DISENGAGES +DISENGAGING +DISENTANGLE +DISENTANGLING +DISFIGURE +DISFIGURED +DISFIGURES +DISFIGURING +DISGORGE +DISGRACE +DISGRACED +DISGRACEFUL +DISGRACEFULLY +DISGRACES +DISGRUNTLE +DISGRUNTLED +DISGUISE +DISGUISED +DISGUISES +DISGUST +DISGUSTED +DISGUSTEDLY +DISGUSTFUL +DISGUSTING +DISGUSTINGLY +DISGUSTS +DISH +DISHEARTEN +DISHEARTENING +DISHED +DISHES +DISHEVEL +DISHING +DISHONEST +DISHONESTLY +DISHONESTY +DISHONOR +DISHONORABLE +DISHONORED +DISHONORING +DISHONORS +DISHWASHER +DISHWASHERS +DISHWASHING +DISHWATER +DISILLUSION +DISILLUSIONED +DISILLUSIONING +DISILLUSIONMENT +DISILLUSIONMENTS +DISINCLINED +DISINGENUOUS +DISINTERESTED +DISINTERESTEDNESS +DISJOINT +DISJOINTED +DISJOINTLY +DISJOINTNESS +DISJUNCT +DISJUNCTION +DISJUNCTIONS +DISJUNCTIVE +DISJUNCTIVELY +DISJUNCTS +DISK +DISKETTE +DISKETTES +DISKS +DISLIKE +DISLIKED +DISLIKES +DISLIKING +DISLOCATE +DISLOCATED +DISLOCATES +DISLOCATING +DISLOCATION +DISLOCATIONS +DISLODGE +DISLODGED +DISMAL +DISMALLY +DISMAY +DISMAYED +DISMAYING +DISMEMBER +DISMEMBERED +DISMEMBERMENT +DISMEMBERS +DISMISS +DISMISSAL +DISMISSALS +DISMISSED +DISMISSER +DISMISSERS +DISMISSES +DISMISSING +DISMOUNT +DISMOUNTED +DISMOUNTING +DISMOUNTS +DISNEY +DISNEYLAND +DISOBEDIENCE +DISOBEDIENT +DISOBEY +DISOBEYED +DISOBEYING +DISOBEYS +DISORDER +DISORDERED +DISORDERLY +DISORDERS +DISORGANIZED +DISOWN +DISOWNED +DISOWNING +DISOWNS +DISPARAGE +DISPARATE +DISPARITIES +DISPARITY +DISPASSIONATE +DISPATCH +DISPATCHED +DISPATCHER +DISPATCHERS +DISPATCHES +DISPATCHING +DISPEL +DISPELL +DISPELLED +DISPELLING +DISPELS +DISPENSARY +DISPENSATION +DISPENSE +DISPENSED +DISPENSER +DISPENSERS +DISPENSES +DISPENSING +DISPERSAL +DISPERSE +DISPERSED +DISPERSES +DISPERSING +DISPERSION +DISPERSIONS +DISPLACE +DISPLACED +DISPLACEMENT +DISPLACEMENTS +DISPLACES +DISPLACING +DISPLAY +DISPLAYABLE +DISPLAYED +DISPLAYER +DISPLAYING +DISPLAYS +DISPLEASE +DISPLEASED +DISPLEASES +DISPLEASING +DISPLEASURE +DISPOSABLE +DISPOSAL +DISPOSALS +DISPOSE +DISPOSED +DISPOSER +DISPOSES +DISPOSING +DISPOSITION +DISPOSITIONS +DISPOSSESSED +DISPROPORTIONATE +DISPROVE +DISPROVED +DISPROVES +DISPROVING +DISPUTE +DISPUTED +DISPUTER +DISPUTERS +DISPUTES +DISPUTING +DISQUALIFICATION +DISQUALIFIED +DISQUALIFIES +DISQUALIFY +DISQUALIFYING +DISQUIET +DISQUIETING +DISRAELI +DISREGARD +DISREGARDED +DISREGARDING +DISREGARDS +DISRESPECTFUL +DISRUPT +DISRUPTED +DISRUPTING +DISRUPTION +DISRUPTIONS +DISRUPTIVE +DISRUPTS +DISSATISFACTION +DISSATISFACTIONS +DISSATISFACTORY +DISSATISFIED +DISSECT +DISSECTS +DISSEMBLE +DISSEMINATE +DISSEMINATED +DISSEMINATES +DISSEMINATING +DISSEMINATION +DISSENSION +DISSENSIONS +DISSENT +DISSENTED +DISSENTER +DISSENTERS +DISSENTING +DISSENTS +DISSERTATION +DISSERTATIONS +DISSERVICE +DISSIDENT +DISSIDENTS +DISSIMILAR +DISSIMILARITIES +DISSIMILARITY +DISSIPATE +DISSIPATED +DISSIPATES +DISSIPATING +DISSIPATION +DISSOCIATE +DISSOCIATED +DISSOCIATES +DISSOCIATING +DISSOCIATION +DISSOLUTION +DISSOLUTIONS +DISSOLVE +DISSOLVED +DISSOLVES +DISSOLVING +DISSONANT +DISSUADE +DISTAFF +DISTAL +DISTALLY +DISTANCE +DISTANCES +DISTANT +DISTANTLY +DISTASTE +DISTASTEFUL +DISTASTEFULLY +DISTASTES +DISTEMPER +DISTEMPERED +DISTEMPERS +DISTILL +DISTILLATION +DISTILLED +DISTILLER +DISTILLERS +DISTILLERY +DISTILLING +DISTILLS +DISTINCT +DISTINCTION +DISTINCTIONS +DISTINCTIVE +DISTINCTIVELY +DISTINCTIVENESS +DISTINCTLY +DISTINCTNESS +DISTINGUISH +DISTINGUISHABLE +DISTINGUISHED +DISTINGUISHES +DISTINGUISHING +DISTORT +DISTORTED +DISTORTING +DISTORTION +DISTORTIONS +DISTORTS +DISTRACT +DISTRACTED +DISTRACTING +DISTRACTION +DISTRACTIONS +DISTRACTS +DISTRAUGHT +DISTRESS +DISTRESSED +DISTRESSES +DISTRESSING +DISTRIBUTE +DISTRIBUTED +DISTRIBUTES +DISTRIBUTING +DISTRIBUTION +DISTRIBUTIONAL +DISTRIBUTIONS +DISTRIBUTIVE +DISTRIBUTIVITY +DISTRIBUTOR +DISTRIBUTORS +DISTRICT +DISTRICTS +DISTRUST +DISTRUSTED +DISTURB +DISTURBANCE +DISTURBANCES +DISTURBED +DISTURBER +DISTURBING +DISTURBINGLY +DISTURBS +DISUSE +DITCH +DITCHES +DITHER +DITTO +DITTY +DITZEL +DIURNAL +DIVAN +DIVANS +DIVE +DIVED +DIVER +DIVERGE +DIVERGED +DIVERGENCE +DIVERGENCES +DIVERGENT +DIVERGES +DIVERGING +DIVERS +DIVERSE +DIVERSELY +DIVERSIFICATION +DIVERSIFIED +DIVERSIFIES +DIVERSIFY +DIVERSIFYING +DIVERSION +DIVERSIONARY +DIVERSIONS +DIVERSITIES +DIVERSITY +DIVERT +DIVERTED +DIVERTING +DIVERTS +DIVES +DIVEST +DIVESTED +DIVESTING +DIVESTITURE +DIVESTS +DIVIDE +DIVIDED +DIVIDEND +DIVIDENDS +DIVIDER +DIVIDERS +DIVIDES +DIVIDING +DIVINE +DIVINELY +DIVINER +DIVING +DIVINING +DIVINITIES +DIVINITY +DIVISIBILITY +DIVISIBLE +DIVISION +DIVISIONAL +DIVISIONS +DIVISIVE +DIVISOR +DIVISORS +DIVORCE +DIVORCED +DIVORCEE +DIVULGE +DIVULGED +DIVULGES +DIVULGING +DIXIE +DIXIECRATS +DIXIELAND +DIXON +DIZZINESS +DIZZY +DJAKARTA +DMITRI +DNIEPER +DOBBIN +DOBBS +DOBERMAN +DOC +DOCILE +DOCK +DOCKED +DOCKET +DOCKS +DOCKSIDE +DOCKYARD +DOCTOR +DOCTORAL +DOCTORATE +DOCTORATES +DOCTORED +DOCTORS +DOCTRINAIRE +DOCTRINAL +DOCTRINE +DOCTRINES +DOCUMENT +DOCUMENTARIES +DOCUMENTARY +DOCUMENTATION +DOCUMENTATIONS +DOCUMENTED +DOCUMENTER +DOCUMENTERS +DOCUMENTING +DOCUMENTS +DODD +DODECAHEDRA +DODECAHEDRAL +DODECAHEDRON +DODGE +DODGED +DODGER +DODGERS +DODGING +DODINGTON +DODSON +DOE +DOER +DOERS +DOES +DOG +DOGE +DOGGED +DOGGEDLY +DOGGEDNESS +DOGGING +DOGHOUSE +DOGMA +DOGMAS +DOGMATIC +DOGMATISM +DOGS +DOGTOWN +DOHERTY +DOING +DOINGS +DOLAN +DOLDRUM +DOLE +DOLED +DOLEFUL +DOLEFULLY +DOLES +DOLL +DOLLAR +DOLLARS +DOLLIES +DOLLS +DOLLY +DOLORES +DOLPHIN +DOLPHINS +DOMAIN +DOMAINS +DOME +DOMED +DOMENICO +DOMES +DOMESDAY +DOMESTIC +DOMESTICALLY +DOMESTICATE +DOMESTICATED +DOMESTICATES +DOMESTICATING +DOMESTICATION +DOMICILE +DOMINANCE +DOMINANT +DOMINANTLY +DOMINATE +DOMINATED +DOMINATES +DOMINATING +DOMINATION +DOMINEER +DOMINEERING +DOMINGO +DOMINIC +DOMINICAN +DOMINICANS +DOMINICK +DOMINION +DOMINIQUE +DOMINO +DON +DONAHUE +DONALD +DONALDSON +DONATE +DONATED +DONATES +DONATING +DONATION +DONE +DONECK +DONKEY +DONKEYS +DONNA +DONNELLY +DONNER +DONNYBROOK +DONOR +DONOVAN +DONS +DOODLE +DOOLEY +DOOLITTLE +DOOM +DOOMED +DOOMING +DOOMS +DOOMSDAY +DOOR +DOORBELL +DOORKEEPER +DOORMAN +DOORMEN +DOORS +DOORSTEP +DOORSTEPS +DOORWAY +DOORWAYS +DOPE +DOPED +DOPER +DOPERS +DOPES +DOPING +DOPPLER +DORA +DORADO +DORCAS +DORCHESTER +DOREEN +DORIA +DORIC +DORICIZE +DORICIZES +DORIS +DORMANT +DORMITORIES +DORMITORY +DOROTHEA +DOROTHY +DORSET +DORTMUND +DOSAGE +DOSE +DOSED +DOSES +DOSSIER +DOSSIERS +DOSTOEVSKY +DOT +DOTE +DOTED +DOTES +DOTING +DOTINGLY +DOTS +DOTTED +DOTTING +DOUBLE +DOUBLED +DOUBLEDAY +DOUBLEHEADER +DOUBLER +DOUBLERS +DOUBLES +DOUBLET +DOUBLETON +DOUBLETS +DOUBLING +DOUBLOON +DOUBLY +DOUBT +DOUBTABLE +DOUBTED +DOUBTER +DOUBTERS +DOUBTFUL +DOUBTFULLY +DOUBTING +DOUBTLESS +DOUBTLESSLY +DOUBTS +DOUG +DOUGH +DOUGHERTY +DOUGHNUT +DOUGHNUTS +DOUGLAS +DOUGLASS +DOVE +DOVER +DOVES +DOVETAIL +DOW +DOWAGER +DOWEL +DOWLING +DOWN +DOWNCAST +DOWNED +DOWNERS +DOWNEY +DOWNFALL +DOWNFALLEN +DOWNGRADE +DOWNHILL +DOWNING +DOWNLINK +DOWNLINKS +DOWNLOAD +DOWNLOADED +DOWNLOADING +DOWNLOADS +DOWNPLAY +DOWNPLAYED +DOWNPLAYING +DOWNPLAYS +DOWNPOUR +DOWNRIGHT +DOWNS +DOWNSIDE +DOWNSTAIRS +DOWNSTREAM +DOWNTOWN +DOWNTOWNS +DOWNTRODDEN +DOWNTURN +DOWNWARD +DOWNWARDS +DOWNY +DOWRY +DOYLE +DOZE +DOZED +DOZEN +DOZENS +DOZENTH +DOZES +DOZING +DRAB +DRACO +DRACONIAN +DRAFT +DRAFTED +DRAFTEE +DRAFTER +DRAFTERS +DRAFTING +DRAFTS +DRAFTSMAN +DRAFTSMEN +DRAFTY +DRAG +DRAGGED +DRAGGING +DRAGNET +DRAGON +DRAGONFLY +DRAGONHEAD +DRAGONS +DRAGOON +DRAGOONED +DRAGOONS +DRAGS +DRAIN +DRAINAGE +DRAINED +DRAINER +DRAINING +DRAINS +DRAKE +DRAM +DRAMA +DRAMAMINE +DRAMAS +DRAMATIC +DRAMATICALLY +DRAMATICS +DRAMATIST +DRAMATISTS +DRANK +DRAPE +DRAPED +DRAPER +DRAPERIES +DRAPERS +DRAPERY +DRAPES +DRASTIC +DRASTICALLY +DRAUGHT +DRAUGHTS +DRAVIDIAN +DRAW +DRAWBACK +DRAWBACKS +DRAWBRIDGE +DRAWBRIDGES +DRAWER +DRAWERS +DRAWING +DRAWINGS +DRAWL +DRAWLED +DRAWLING +DRAWLS +DRAWN +DRAWNLY +DRAWNNESS +DRAWS +DREAD +DREADED +DREADFUL +DREADFULLY +DREADING +DREADNOUGHT +DREADS +DREAM +DREAMBOAT +DREAMED +DREAMER +DREAMERS +DREAMILY +DREAMING +DREAMLIKE +DREAMS +DREAMT +DREAMY +DREARINESS +DREARY +DREDGE +DREGS +DRENCH +DRENCHED +DRENCHES +DRENCHING +DRESS +DRESSED +DRESSER +DRESSERS +DRESSES +DRESSING +DRESSINGS +DRESSMAKER +DRESSMAKERS +DREW +DREXEL +DREYFUSS +DRIED +DRIER +DRIERS +DRIES +DRIEST +DRIFT +DRIFTED +DRIFTER +DRIFTERS +DRIFTING +DRIFTS +DRILL +DRILLED +DRILLER +DRILLING +DRILLS +DRILY +DRINK +DRINKABLE +DRINKER +DRINKERS +DRINKING +DRINKS +DRIP +DRIPPING +DRIPPY +DRIPS +DRISCOLL +DRIVE +DRIVEN +DRIVER +DRIVERS +DRIVES +DRIVEWAY +DRIVEWAYS +DRIVING +DRIZZLE +DRIZZLY +DROLL +DROMEDARY +DRONE +DRONES +DROOL +DROOP +DROOPED +DROOPING +DROOPS +DROOPY +DROP +DROPLET +DROPOUT +DROPPED +DROPPER +DROPPERS +DROPPING +DROPPINGS +DROPS +DROSOPHILA +DROUGHT +DROUGHTS +DROVE +DROVER +DROVERS +DROVES +DROWN +DROWNED +DROWNING +DROWNINGS +DROWNS +DROWSINESS +DROWSY +DRUBBING +DRUDGE +DRUDGERY +DRUG +DRUGGIST +DRUGGISTS +DRUGS +DRUGSTORE +DRUM +DRUMHEAD +DRUMMED +DRUMMER +DRUMMERS +DRUMMING +DRUMMOND +DRUMS +DRUNK +DRUNKARD +DRUNKARDS +DRUNKEN +DRUNKENNESS +DRUNKER +DRUNKLY +DRUNKS +DRURY +DRY +DRYDEN +DRYING +DRYLY +DUAL +DUALISM +DUALITIES +DUALITY +DUANE +DUB +DUBBED +DUBHE +DUBIOUS +DUBIOUSLY +DUBIOUSNESS +DUBLIN +DUBS +DUBUQUE +DUCHESS +DUCHESSES +DUCHY +DUCK +DUCKED +DUCKING +DUCKLING +DUCKS +DUCT +DUCTS +DUD +DUDLEY +DUE +DUEL +DUELING +DUELS +DUES +DUET +DUFFY +DUG +DUGAN +DUKE +DUKES +DULL +DULLED +DULLER +DULLES +DULLEST +DULLING +DULLNESS +DULLS +DULLY +DULUTH +DULY +DUMB +DUMBBELL +DUMBBELLS +DUMBER +DUMBEST +DUMBLY +DUMBNESS +DUMMIES +DUMMY +DUMP +DUMPED +DUMPER +DUMPING +DUMPS +DUMPTY +DUNBAR +DUNCAN +DUNCE +DUNCES +DUNDEE +DUNE +DUNEDIN +DUNES +DUNG +DUNGEON +DUNGEONS +DUNHAM +DUNK +DUNKIRK +DUNLAP +DUNLOP +DUNN +DUNNE +DUPE +DUPLEX +DUPLICABLE +DUPLICATE +DUPLICATED +DUPLICATES +DUPLICATING +DUPLICATION +DUPLICATIONS +DUPLICATOR +DUPLICATORS +DUPLICITY +DUPONT +DUPONT +DUPONTS +DUPONTS +DUQUESNE +DURABILITIES +DURABILITY +DURABLE +DURABLY +DURANGO +DURATION +DURATIONS +DURER +DURERS +DURESS +DURHAM +DURING +DURKEE +DURKIN +DURRELL +DURWARD +DUSENBERG +DUSENBURY +DUSK +DUSKINESS +DUSKY +DUSSELDORF +DUST +DUSTBIN +DUSTED +DUSTER +DUSTERS +DUSTIER +DUSTIEST +DUSTIN +DUSTING +DUSTS +DUSTY +DUTCH +DUTCHESS +DUTCHMAN +DUTCHMEN +DUTIES +DUTIFUL +DUTIFULLY +DUTIFULNESS +DUTTON +DUTY +DVORAK +DWARF +DWARFED +DWARFS +DWARVES +DWELL +DWELLED +DWELLER +DWELLERS +DWELLING +DWELLINGS +DWELLS +DWELT +DWIGHT +DWINDLE +DWINDLED +DWINDLING +DWYER +DYAD +DYADIC +DYE +DYED +DYEING +DYER +DYERS +DYES +DYING +DYKE +DYLAN +DYNAMIC +DYNAMICALLY +DYNAMICS +DYNAMISM +DYNAMITE +DYNAMITED +DYNAMITES +DYNAMITING +DYNAMO +DYNASTIC +DYNASTIES +DYNASTY +DYNE +DYSENTERY +DYSPEPTIC +DYSTROPHY +EACH +EAGAN +EAGER +EAGERLY +EAGERNESS +EAGLE +EAGLES +EAR +EARDRUM +EARED +EARL +EARLIER +EARLIEST +EARLINESS +EARLS +EARLY +EARMARK +EARMARKED +EARMARKING +EARMARKINGS +EARMARKS +EARN +EARNED +EARNER +EARNERS +EARNEST +EARNESTLY +EARNESTNESS +EARNING +EARNINGS +EARNS +EARP +EARPHONE +EARRING +EARRINGS +EARS +EARSPLITTING +EARTH +EARTHEN +EARTHENWARE +EARTHLINESS +EARTHLING +EARTHLY +EARTHMAN +EARTHMEN +EARTHMOVER +EARTHQUAKE +EARTHQUAKES +EARTHS +EARTHWORM +EARTHWORMS +EARTHY +EASE +EASED +EASEL +EASEMENT +EASEMENTS +EASES +EASIER +EASIEST +EASILY +EASINESS +EASING +EAST +EASTBOUND +EASTER +EASTERN +EASTERNER +EASTERNERS +EASTERNMOST +EASTHAMPTON +EASTLAND +EASTMAN +EASTWARD +EASTWARDS +EASTWICK +EASTWOOD +EASY +EASYGOING +EAT +EATEN +EATER +EATERS +EATING +EATINGS +EATON +EATS +EAVES +EAVESDROP +EAVESDROPPED +EAVESDROPPER +EAVESDROPPERS +EAVESDROPPING +EAVESDROPS +EBB +EBBING +EBBS +EBEN +EBONY +ECCENTRIC +ECCENTRICITIES +ECCENTRICITY +ECCENTRICS +ECCLES +ECCLESIASTICAL +ECHELON +ECHO +ECHOED +ECHOES +ECHOING +ECLECTIC +ECLIPSE +ECLIPSED +ECLIPSES +ECLIPSING +ECLIPTIC +ECOLE +ECOLOGY +ECONOMETRIC +ECONOMETRICA +ECONOMIC +ECONOMICAL +ECONOMICALLY +ECONOMICS +ECONOMIES +ECONOMIST +ECONOMISTS +ECONOMIZE +ECONOMIZED +ECONOMIZER +ECONOMIZERS +ECONOMIZES +ECONOMIZING +ECONOMY +ECOSYSTEM +ECSTASY +ECSTATIC +ECUADOR +ECUADORIAN +EDDIE +EDDIES +EDDY +EDEN +EDENIZATION +EDENIZATIONS +EDENIZE +EDENIZES +EDGAR +EDGE +EDGED +EDGERTON +EDGES +EDGEWATER +EDGEWOOD +EDGING +EDIBLE +EDICT +EDICTS +EDIFICE +EDIFICES +EDINBURGH +EDISON +EDIT +EDITED +EDITH +EDITING +EDITION +EDITIONS +EDITOR +EDITORIAL +EDITORIALLY +EDITORIALS +EDITORS +EDITS +EDMONDS +EDMONDSON +EDMONTON +EDMUND +EDNA +EDSGER +EDUARD +EDUARDO +EDUCABLE +EDUCATE +EDUCATED +EDUCATES +EDUCATING +EDUCATION +EDUCATIONAL +EDUCATIONALLY +EDUCATIONS +EDUCATOR +EDUCATORS +EDWARD +EDWARDIAN +EDWARDINE +EDWARDS +EDWIN +EDWINA +EEL +EELGRASS +EELS +EERIE +EERILY +EFFECT +EFFECTED +EFFECTING +EFFECTIVE +EFFECTIVELY +EFFECTIVENESS +EFFECTOR +EFFECTORS +EFFECTS +EFFECTUALLY +EFFECTUATE +EFFEMINATE +EFFICACY +EFFICIENCIES +EFFICIENCY +EFFICIENT +EFFICIENTLY +EFFIE +EFFIGY +EFFORT +EFFORTLESS +EFFORTLESSLY +EFFORTLESSNESS +EFFORTS +EGALITARIAN +EGAN +EGG +EGGED +EGGHEAD +EGGING +EGGPLANT +EGGS +EGGSHELL +EGO +EGOCENTRIC +EGOS +EGOTISM +EGOTIST +EGYPT +EGYPTIAN +EGYPTIANIZATION +EGYPTIANIZATIONS +EGYPTIANIZE +EGYPTIANIZES +EGYPTIANS +EGYPTIZE +EGYPTIZES +EGYPTOLOGY +EHRLICH +EICHMANN +EIFFEL +EIGENFUNCTION +EIGENSTATE +EIGENVALUE +EIGENVALUES +EIGENVECTOR +EIGHT +EIGHTEEN +EIGHTEENS +EIGHTEENTH +EIGHTFOLD +EIGHTH +EIGHTHES +EIGHTIES +EIGHTIETH +EIGHTS +EIGHTY +EILEEN +EINSTEIN +EINSTEINIAN +EIRE +EISENHOWER +EISNER +EITHER +EJACULATE +EJACULATED +EJACULATES +EJACULATING +EJACULATION +EJACULATIONS +EJECT +EJECTED +EJECTING +EJECTS +EKBERG +EKE +EKED +EKES +EKSTROM +EKTACHROME +ELABORATE +ELABORATED +ELABORATELY +ELABORATENESS +ELABORATES +ELABORATING +ELABORATION +ELABORATIONS +ELABORATORS +ELAINE +ELAPSE +ELAPSED +ELAPSES +ELAPSING +ELASTIC +ELASTICALLY +ELASTICITY +ELBA +ELBOW +ELBOWING +ELBOWS +ELDER +ELDERLY +ELDERS +ELDEST +ELDON +ELEANOR +ELEAZAR +ELECT +ELECTED +ELECTING +ELECTION +ELECTIONS +ELECTIVE +ELECTIVES +ELECTOR +ELECTORAL +ELECTORATE +ELECTORS +ELECTRA +ELECTRIC +ELECTRICAL +ELECTRICALLY +ELECTRICALNESS +ELECTRICIAN +ELECTRICITY +ELECTRIFICATION +ELECTRIFY +ELECTRIFYING +ELECTRO +ELECTROCARDIOGRAM +ELECTROCARDIOGRAPH +ELECTROCUTE +ELECTROCUTED +ELECTROCUTES +ELECTROCUTING +ELECTROCUTION +ELECTROCUTIONS +ELECTRODE +ELECTRODES +ELECTROENCEPHALOGRAM +ELECTROENCEPHALOGRAPH +ELECTROENCEPHALOGRAPHY +ELECTROLYSIS +ELECTROLYTE +ELECTROLYTES +ELECTROLYTIC +ELECTROMAGNETIC +ELECTROMECHANICAL +ELECTRON +ELECTRONIC +ELECTRONICALLY +ELECTRONICS +ELECTRONS +ELECTROPHORESIS +ELECTROPHORUS +ELECTS +ELEGANCE +ELEGANT +ELEGANTLY +ELEGY +ELEMENT +ELEMENTAL +ELEMENTALS +ELEMENTARY +ELEMENTS +ELENA +ELEPHANT +ELEPHANTS +ELEVATE +ELEVATED +ELEVATES +ELEVATION +ELEVATOR +ELEVATORS +ELEVEN +ELEVENS +ELEVENTH +ELF +ELGIN +ELI +ELICIT +ELICITED +ELICITING +ELICITS +ELIDE +ELIGIBILITY +ELIGIBLE +ELIJAH +ELIMINATE +ELIMINATED +ELIMINATES +ELIMINATING +ELIMINATION +ELIMINATIONS +ELIMINATOR +ELIMINATORS +ELINOR +ELIOT +ELISABETH +ELISHA +ELISION +ELITE +ELITIST +ELIZABETH +ELIZABETHAN +ELIZABETHANIZE +ELIZABETHANIZES +ELIZABETHANS +ELK +ELKHART +ELKS +ELLA +ELLEN +ELLIE +ELLIOT +ELLIOTT +ELLIPSE +ELLIPSES +ELLIPSIS +ELLIPSOID +ELLIPSOIDAL +ELLIPSOIDS +ELLIPTIC +ELLIPTICAL +ELLIPTICALLY +ELLIS +ELLISON +ELLSWORTH +ELLWOOD +ELM +ELMER +ELMHURST +ELMIRA +ELMS +ELMSFORD +ELOISE +ELOPE +ELOQUENCE +ELOQUENT +ELOQUENTLY +ELROY +ELSE +ELSEVIER +ELSEWHERE +ELSIE +ELSINORE +ELTON +ELUCIDATE +ELUCIDATED +ELUCIDATES +ELUCIDATING +ELUCIDATION +ELUDE +ELUDED +ELUDES +ELUDING +ELUSIVE +ELUSIVELY +ELUSIVENESS +ELVES +ELVIS +ELY +ELYSEE +ELYSEES +ELYSIUM +EMACIATE +EMACIATED +EMACS +EMANATE +EMANATING +EMANCIPATE +EMANCIPATION +EMANUEL +EMASCULATE +EMBALM +EMBARGO +EMBARGOES +EMBARK +EMBARKED +EMBARKS +EMBARRASS +EMBARRASSED +EMBARRASSES +EMBARRASSING +EMBARRASSMENT +EMBASSIES +EMBASSY +EMBED +EMBEDDED +EMBEDDING +EMBEDS +EMBELLISH +EMBELLISHED +EMBELLISHES +EMBELLISHING +EMBELLISHMENT +EMBELLISHMENTS +EMBER +EMBEZZLE +EMBLEM +EMBODIED +EMBODIES +EMBODIMENT +EMBODIMENTS +EMBODY +EMBODYING +EMBOLDEN +EMBRACE +EMBRACED +EMBRACES +EMBRACING +EMBROIDER +EMBROIDERED +EMBROIDERIES +EMBROIDERS +EMBROIDERY +EMBROIL +EMBRYO +EMBRYOLOGY +EMBRYOS +EMERALD +EMERALDS +EMERGE +EMERGED +EMERGENCE +EMERGENCIES +EMERGENCY +EMERGENT +EMERGES +EMERGING +EMERITUS +EMERSON +EMERY +EMIGRANT +EMIGRANTS +EMIGRATE +EMIGRATED +EMIGRATES +EMIGRATING +EMIGRATION +EMIL +EMILE +EMILIO +EMILY +EMINENCE +EMINENT +EMINENTLY +EMISSARY +EMISSION +EMIT +EMITS +EMITTED +EMITTER +EMITTING +EMMA +EMMANUEL +EMMETT +EMORY +EMOTION +EMOTIONAL +EMOTIONALLY +EMOTIONS +EMPATHY +EMPEROR +EMPERORS +EMPHASES +EMPHASIS +EMPHASIZE +EMPHASIZED +EMPHASIZES +EMPHASIZING +EMPHATIC +EMPHATICALLY +EMPIRE +EMPIRES +EMPIRICAL +EMPIRICALLY +EMPIRICIST +EMPIRICISTS +EMPLOY +EMPLOYABLE +EMPLOYED +EMPLOYEE +EMPLOYEES +EMPLOYER +EMPLOYERS +EMPLOYING +EMPLOYMENT +EMPLOYMENTS +EMPLOYS +EMPORIUM +EMPOWER +EMPOWERED +EMPOWERING +EMPOWERS +EMPRESS +EMPTIED +EMPTIER +EMPTIES +EMPTIEST +EMPTILY +EMPTINESS +EMPTY +EMPTYING +EMULATE +EMULATED +EMULATES +EMULATING +EMULATION +EMULATIONS +EMULATOR +EMULATORS +ENABLE +ENABLED +ENABLER +ENABLERS +ENABLES +ENABLING +ENACT +ENACTED +ENACTING +ENACTMENT +ENACTS +ENAMEL +ENAMELED +ENAMELING +ENAMELS +ENCAMP +ENCAMPED +ENCAMPING +ENCAMPS +ENCAPSULATE +ENCAPSULATED +ENCAPSULATES +ENCAPSULATING +ENCAPSULATION +ENCASED +ENCHANT +ENCHANTED +ENCHANTER +ENCHANTING +ENCHANTMENT +ENCHANTRESS +ENCHANTS +ENCIPHER +ENCIPHERED +ENCIPHERING +ENCIPHERS +ENCIRCLE +ENCIRCLED +ENCIRCLES +ENCLOSE +ENCLOSED +ENCLOSES +ENCLOSING +ENCLOSURE +ENCLOSURES +ENCODE +ENCODED +ENCODER +ENCODERS +ENCODES +ENCODING +ENCODINGS +ENCOMPASS +ENCOMPASSED +ENCOMPASSES +ENCOMPASSING +ENCORE +ENCOUNTER +ENCOUNTERED +ENCOUNTERING +ENCOUNTERS +ENCOURAGE +ENCOURAGED +ENCOURAGEMENT +ENCOURAGEMENTS +ENCOURAGES +ENCOURAGING +ENCOURAGINGLY +ENCROACH +ENCRUST +ENCRYPT +ENCRYPTED +ENCRYPTING +ENCRYPTION +ENCRYPTIONS +ENCRYPTS +ENCUMBER +ENCUMBERED +ENCUMBERING +ENCUMBERS +ENCYCLOPEDIA +ENCYCLOPEDIAS +ENCYCLOPEDIC +END +ENDANGER +ENDANGERED +ENDANGERING +ENDANGERS +ENDEAR +ENDEARED +ENDEARING +ENDEARS +ENDEAVOR +ENDEAVORED +ENDEAVORING +ENDEAVORS +ENDED +ENDEMIC +ENDER +ENDERS +ENDGAME +ENDICOTT +ENDING +ENDINGS +ENDLESS +ENDLESSLY +ENDLESSNESS +ENDORSE +ENDORSED +ENDORSEMENT +ENDORSES +ENDORSING +ENDOW +ENDOWED +ENDOWING +ENDOWMENT +ENDOWMENTS +ENDOWS +ENDPOINT +ENDS +ENDURABLE +ENDURABLY +ENDURANCE +ENDURE +ENDURED +ENDURES +ENDURING +ENDURINGLY +ENEMA +ENEMAS +ENEMIES +ENEMY +ENERGETIC +ENERGIES +ENERGIZE +ENERGY +ENERVATE +ENFEEBLE +ENFIELD +ENFORCE +ENFORCEABLE +ENFORCED +ENFORCEMENT +ENFORCER +ENFORCERS +ENFORCES +ENFORCING +ENFRANCHISE +ENG +ENGAGE +ENGAGED +ENGAGEMENT +ENGAGEMENTS +ENGAGES +ENGAGING +ENGAGINGLY +ENGEL +ENGELS +ENGENDER +ENGENDERED +ENGENDERING +ENGENDERS +ENGINE +ENGINEER +ENGINEERED +ENGINEERING +ENGINEERS +ENGINES +ENGLAND +ENGLANDER +ENGLANDERS +ENGLE +ENGLEWOOD +ENGLISH +ENGLISHIZE +ENGLISHIZES +ENGLISHMAN +ENGLISHMEN +ENGRAVE +ENGRAVED +ENGRAVER +ENGRAVES +ENGRAVING +ENGRAVINGS +ENGROSS +ENGROSSED +ENGROSSING +ENGULF +ENHANCE +ENHANCED +ENHANCEMENT +ENHANCEMENTS +ENHANCES +ENHANCING +ENID +ENIGMA +ENIGMATIC +ENJOIN +ENJOINED +ENJOINING +ENJOINS +ENJOY +ENJOYABLE +ENJOYABLY +ENJOYED +ENJOYING +ENJOYMENT +ENJOYS +ENLARGE +ENLARGED +ENLARGEMENT +ENLARGEMENTS +ENLARGER +ENLARGERS +ENLARGES +ENLARGING +ENLIGHTEN +ENLIGHTENED +ENLIGHTENING +ENLIGHTENMENT +ENLIST +ENLISTED +ENLISTMENT +ENLISTS +ENLIVEN +ENLIVENED +ENLIVENING +ENLIVENS +ENMITIES +ENMITY +ENNOBLE +ENNOBLED +ENNOBLES +ENNOBLING +ENNUI +ENOCH +ENORMITIES +ENORMITY +ENORMOUS +ENORMOUSLY +ENOS +ENOUGH +ENQUEUE +ENQUEUED +ENQUEUES +ENQUIRE +ENQUIRED +ENQUIRER +ENQUIRES +ENQUIRY +ENRAGE +ENRAGED +ENRAGES +ENRAGING +ENRAPTURE +ENRICH +ENRICHED +ENRICHES +ENRICHING +ENRICO +ENROLL +ENROLLED +ENROLLING +ENROLLMENT +ENROLLMENTS +ENROLLS +ENSEMBLE +ENSEMBLES +ENSIGN +ENSIGNS +ENSLAVE +ENSLAVED +ENSLAVES +ENSLAVING +ENSNARE +ENSNARED +ENSNARES +ENSNARING +ENSOLITE +ENSUE +ENSUED +ENSUES +ENSUING +ENSURE +ENSURED +ENSURER +ENSURERS +ENSURES +ENSURING +ENTAIL +ENTAILED +ENTAILING +ENTAILS +ENTANGLE +ENTER +ENTERED +ENTERING +ENTERPRISE +ENTERPRISES +ENTERPRISING +ENTERS +ENTERTAIN +ENTERTAINED +ENTERTAINER +ENTERTAINERS +ENTERTAINING +ENTERTAININGLY +ENTERTAINMENT +ENTERTAINMENTS +ENTERTAINS +ENTHUSIASM +ENTHUSIASMS +ENTHUSIAST +ENTHUSIASTIC +ENTHUSIASTICALLY +ENTHUSIASTS +ENTICE +ENTICED +ENTICER +ENTICERS +ENTICES +ENTICING +ENTIRE +ENTIRELY +ENTIRETIES +ENTIRETY +ENTITIES +ENTITLE +ENTITLED +ENTITLES +ENTITLING +ENTITY +ENTOMB +ENTRANCE +ENTRANCED +ENTRANCES +ENTRAP +ENTREAT +ENTREATED +ENTREATY +ENTREE +ENTRENCH +ENTRENCHED +ENTRENCHES +ENTRENCHING +ENTREPRENEUR +ENTREPRENEURIAL +ENTREPRENEURS +ENTRIES +ENTROPY +ENTRUST +ENTRUSTED +ENTRUSTING +ENTRUSTS +ENTRY +ENUMERABLE +ENUMERATE +ENUMERATED +ENUMERATES +ENUMERATING +ENUMERATION +ENUMERATIVE +ENUMERATOR +ENUMERATORS +ENUNCIATION +ENVELOP +ENVELOPE +ENVELOPED +ENVELOPER +ENVELOPES +ENVELOPING +ENVELOPS +ENVIED +ENVIES +ENVIOUS +ENVIOUSLY +ENVIOUSNESS +ENVIRON +ENVIRONING +ENVIRONMENT +ENVIRONMENTAL +ENVIRONMENTS +ENVIRONS +ENVISAGE +ENVISAGED +ENVISAGES +ENVISION +ENVISIONED +ENVISIONING +ENVISIONS +ENVOY +ENVOYS +ENVY +ENZYME +EOCENE +EPAULET +EPAULETS +EPHEMERAL +EPHESIAN +EPHESIANS +EPHESUS +EPHRAIM +EPIC +EPICENTER +EPICS +EPICUREAN +EPICURIZE +EPICURIZES +EPICURUS +EPIDEMIC +EPIDEMICS +EPIDERMIS +EPIGRAM +EPILEPTIC +EPILOGUE +EPIPHANY +EPISCOPAL +EPISCOPALIAN +EPISCOPALIANIZE +EPISCOPALIANIZES +EPISODE +EPISODES +EPISTEMOLOGICAL +EPISTEMOLOGY +EPISTLE +EPISTLES +EPITAPH +EPITAPHS +EPITAXIAL +EPITAXIALLY +EPITHET +EPITHETS +EPITOMIZE +EPITOMIZED +EPITOMIZES +EPITOMIZING +EPOCH +EPOCHS +EPSILON +EPSOM +EPSTEIN +EQUAL +EQUALED +EQUALING +EQUALITIES +EQUALITY +EQUALIZATION +EQUALIZE +EQUALIZED +EQUALIZER +EQUALIZERS +EQUALIZES +EQUALIZING +EQUALLY +EQUALS +EQUATE +EQUATED +EQUATES +EQUATING +EQUATION +EQUATIONS +EQUATOR +EQUATORIAL +EQUATORS +EQUESTRIAN +EQUIDISTANT +EQUILATERAL +EQUILIBRATE +EQUILIBRIA +EQUILIBRIUM +EQUILIBRIUMS +EQUINOX +EQUIP +EQUIPMENT +EQUIPOISE +EQUIPPED +EQUIPPING +EQUIPS +EQUITABLE +EQUITABLY +EQUITY +EQUIVALENCE +EQUIVALENCES +EQUIVALENT +EQUIVALENTLY +EQUIVALENTS +EQUIVOCAL +EQUIVOCALLY +ERA +ERADICATE +ERADICATED +ERADICATES +ERADICATING +ERADICATION +ERAS +ERASABLE +ERASE +ERASED +ERASER +ERASERS +ERASES +ERASING +ERASMUS +ERASTUS +ERASURE +ERATO +ERATOSTHENES +ERE +ERECT +ERECTED +ERECTING +ERECTION +ERECTIONS +ERECTOR +ERECTORS +ERECTS +ERG +ERGO +ERGODIC +ERIC +ERICH +ERICKSON +ERICSSON +ERIE +ERIK +ERIKSON +ERIS +ERLANG +ERLENMEYER +ERLENMEYERS +ERMINE +ERMINES +ERNE +ERNEST +ERNESTINE +ERNIE +ERNST +ERODE +EROS +EROSION +EROTIC +EROTICA +ERR +ERRAND +ERRANT +ERRATA +ERRATIC +ERRATUM +ERRED +ERRING +ERRINGLY +ERROL +ERRONEOUS +ERRONEOUSLY +ERRONEOUSNESS +ERROR +ERRORS +ERRS +ERSATZ +ERSKINE +ERUDITE +ERUPT +ERUPTION +ERVIN +ERWIN +ESCALATE +ESCALATED +ESCALATES +ESCALATING +ESCALATION +ESCAPABLE +ESCAPADE +ESCAPADES +ESCAPE +ESCAPED +ESCAPEE +ESCAPEES +ESCAPES +ESCAPING +ESCHERICHIA +ESCHEW +ESCHEWED +ESCHEWING +ESCHEWS +ESCORT +ESCORTED +ESCORTING +ESCORTS +ESCROW +ESKIMO +ESKIMOIZED +ESKIMOIZEDS +ESKIMOS +ESMARK +ESOTERIC +ESPAGNOL +ESPECIAL +ESPECIALLY +ESPIONAGE +ESPOSITO +ESPOUSE +ESPOUSED +ESPOUSES +ESPOUSING +ESPRIT +ESPY +ESQUIRE +ESQUIRES +ESSAY +ESSAYED +ESSAYS +ESSEN +ESSENCE +ESSENCES +ESSENIZE +ESSENIZES +ESSENTIAL +ESSENTIALLY +ESSENTIALS +ESSEX +ESTABLISH +ESTABLISHED +ESTABLISHES +ESTABLISHING +ESTABLISHMENT +ESTABLISHMENTS +ESTATE +ESTATES +ESTEEM +ESTEEMED +ESTEEMING +ESTEEMS +ESTELLA +ESTES +ESTHER +ESTHETICS +ESTIMATE +ESTIMATED +ESTIMATES +ESTIMATING +ESTIMATION +ESTIMATIONS +ESTONIA +ESTONIAN +ETCH +ETCHING +ETERNAL +ETERNALLY +ETERNITIES +ETERNITY +ETHAN +ETHEL +ETHER +ETHEREAL +ETHEREALLY +ETHERNET +ETHERNETS +ETHERS +ETHIC +ETHICAL +ETHICALLY +ETHICS +ETHIOPIA +ETHIOPIANS +ETHNIC +ETIQUETTE +ETRURIA +ETRUSCAN +ETYMOLOGY +EUCALYPTUS +EUCHARIST +EUCLID +EUCLIDEAN +EUGENE +EUGENIA +EULER +EULERIAN +EUMENIDES +EUNICE +EUNUCH +EUNUCHS +EUPHEMISM +EUPHEMISMS +EUPHORIA +EUPHORIC +EUPHRATES +EURASIA +EURASIAN +EUREKA +EURIPIDES +EUROPA +EUROPE +EUROPEAN +EUROPEANIZATION +EUROPEANIZATIONS +EUROPEANIZE +EUROPEANIZED +EUROPEANIZES +EUROPEANS +EURYDICE +EUTERPE +EUTHANASIA +EVA +EVACUATE +EVACUATED +EVACUATION +EVADE +EVADED +EVADES +EVADING +EVALUATE +EVALUATED +EVALUATES +EVALUATING +EVALUATION +EVALUATIONS +EVALUATIVE +EVALUATOR +EVALUATORS +EVANGELINE +EVANS +EVANSTON +EVANSVILLE +EVAPORATE +EVAPORATED +EVAPORATING +EVAPORATION +EVAPORATIVE +EVASION +EVASIVE +EVE +EVELYN +EVEN +EVENED +EVENHANDED +EVENHANDEDLY +EVENHANDEDNESS +EVENING +EVENINGS +EVENLY +EVENNESS +EVENS +EVENSEN +EVENT +EVENTFUL +EVENTFULLY +EVENTS +EVENTUAL +EVENTUALITIES +EVENTUALITY +EVENTUALLY +EVER +EVEREADY +EVEREST +EVERETT +EVERGLADE +EVERGLADES +EVERGREEN +EVERHART +EVERLASTING +EVERLASTINGLY +EVERMORE +EVERY +EVERYBODY +EVERYDAY +EVERYONE +EVERYTHING +EVERYWHERE +EVICT +EVICTED +EVICTING +EVICTION +EVICTIONS +EVICTS +EVIDENCE +EVIDENCED +EVIDENCES +EVIDENCING +EVIDENT +EVIDENTLY +EVIL +EVILLER +EVILLY +EVILS +EVINCE +EVINCED +EVINCES +EVOKE +EVOKED +EVOKES +EVOKING +EVOLUTE +EVOLUTES +EVOLUTION +EVOLUTIONARY +EVOLUTIONS +EVOLVE +EVOLVED +EVOLVES +EVOLVING +EWE +EWEN +EWES +EWING +EXACERBATE +EXACERBATED +EXACERBATES +EXACERBATING +EXACERBATION +EXACERBATIONS +EXACT +EXACTED +EXACTING +EXACTINGLY +EXACTION +EXACTIONS +EXACTITUDE +EXACTLY +EXACTNESS +EXACTS +EXAGGERATE +EXAGGERATED +EXAGGERATES +EXAGGERATING +EXAGGERATION +EXAGGERATIONS +EXALT +EXALTATION +EXALTED +EXALTING +EXALTS +EXAM +EXAMINATION +EXAMINATIONS +EXAMINE +EXAMINED +EXAMINER +EXAMINERS +EXAMINES +EXAMINING +EXAMPLE +EXAMPLES +EXAMS +EXASPERATE +EXASPERATED +EXASPERATES +EXASPERATING +EXASPERATION +EXCAVATE +EXCAVATED +EXCAVATES +EXCAVATING +EXCAVATION +EXCAVATIONS +EXCEED +EXCEEDED +EXCEEDING +EXCEEDINGLY +EXCEEDS +EXCEL +EXCELLED +EXCELLENCE +EXCELLENCES +EXCELLENCY +EXCELLENT +EXCELLENTLY +EXCELLING +EXCELS +EXCEPT +EXCEPTED +EXCEPTING +EXCEPTION +EXCEPTIONABLE +EXCEPTIONAL +EXCEPTIONALLY +EXCEPTIONS +EXCEPTS +EXCERPT +EXCERPTED +EXCERPTS +EXCESS +EXCESSES +EXCESSIVE +EXCESSIVELY +EXCHANGE +EXCHANGEABLE +EXCHANGED +EXCHANGES +EXCHANGING +EXCHEQUER +EXCHEQUERS +EXCISE +EXCISED +EXCISES +EXCISING +EXCISION +EXCITABLE +EXCITATION +EXCITATIONS +EXCITE +EXCITED +EXCITEDLY +EXCITEMENT +EXCITES +EXCITING +EXCITINGLY +EXCITON +EXCLAIM +EXCLAIMED +EXCLAIMER +EXCLAIMERS +EXCLAIMING +EXCLAIMS +EXCLAMATION +EXCLAMATIONS +EXCLAMATORY +EXCLUDE +EXCLUDED +EXCLUDES +EXCLUDING +EXCLUSION +EXCLUSIONARY +EXCLUSIONS +EXCLUSIVE +EXCLUSIVELY +EXCLUSIVENESS +EXCLUSIVITY +EXCOMMUNICATE +EXCOMMUNICATED +EXCOMMUNICATES +EXCOMMUNICATING +EXCOMMUNICATION +EXCRETE +EXCRETED +EXCRETES +EXCRETING +EXCRETION +EXCRETIONS +EXCRETORY +EXCRUCIATE +EXCURSION +EXCURSIONS +EXCUSABLE +EXCUSABLY +EXCUSE +EXCUSED +EXCUSES +EXCUSING +EXEC +EXECUTABLE +EXECUTE +EXECUTED +EXECUTES +EXECUTING +EXECUTION +EXECUTIONAL +EXECUTIONER +EXECUTIONS +EXECUTIVE +EXECUTIVES +EXECUTOR +EXECUTORS +EXEMPLAR +EXEMPLARY +EXEMPLIFICATION +EXEMPLIFIED +EXEMPLIFIER +EXEMPLIFIERS +EXEMPLIFIES +EXEMPLIFY +EXEMPLIFYING +EXEMPT +EXEMPTED +EXEMPTING +EXEMPTION +EXEMPTS +EXERCISE +EXERCISED +EXERCISER +EXERCISERS +EXERCISES +EXERCISING +EXERT +EXERTED +EXERTING +EXERTION +EXERTIONS +EXERTS +EXETER +EXHALE +EXHALED +EXHALES +EXHALING +EXHAUST +EXHAUSTED +EXHAUSTEDLY +EXHAUSTING +EXHAUSTION +EXHAUSTIVE +EXHAUSTIVELY +EXHAUSTS +EXHIBIT +EXHIBITED +EXHIBITING +EXHIBITION +EXHIBITIONS +EXHIBITOR +EXHIBITORS +EXHIBITS +EXHILARATE +EXHORT +EXHORTATION +EXHORTATIONS +EXHUME +EXIGENCY +EXILE +EXILED +EXILES +EXILING +EXIST +EXISTED +EXISTENCE +EXISTENT +EXISTENTIAL +EXISTENTIALISM +EXISTENTIALIST +EXISTENTIALISTS +EXISTENTIALLY +EXISTING +EXISTS +EXIT +EXITED +EXITING +EXITS +EXODUS +EXORBITANT +EXORBITANTLY +EXORCISM +EXORCIST +EXOSKELETON +EXOTIC +EXPAND +EXPANDABLE +EXPANDED +EXPANDER +EXPANDERS +EXPANDING +EXPANDS +EXPANSE +EXPANSES +EXPANSIBLE +EXPANSION +EXPANSIONISM +EXPANSIONS +EXPANSIVE +EXPECT +EXPECTANCY +EXPECTANT +EXPECTANTLY +EXPECTATION +EXPECTATIONS +EXPECTED +EXPECTEDLY +EXPECTING +EXPECTINGLY +EXPECTS +EXPEDIENCY +EXPEDIENT +EXPEDIENTLY +EXPEDITE +EXPEDITED +EXPEDITES +EXPEDITING +EXPEDITION +EXPEDITIONS +EXPEDITIOUS +EXPEDITIOUSLY +EXPEL +EXPELLED +EXPELLING +EXPELS +EXPEND +EXPENDABLE +EXPENDED +EXPENDING +EXPENDITURE +EXPENDITURES +EXPENDS +EXPENSE +EXPENSES +EXPENSIVE +EXPENSIVELY +EXPERIENCE +EXPERIENCED +EXPERIENCES +EXPERIENCING +EXPERIMENT +EXPERIMENTAL +EXPERIMENTALLY +EXPERIMENTATION +EXPERIMENTATIONS +EXPERIMENTED +EXPERIMENTER +EXPERIMENTERS +EXPERIMENTING +EXPERIMENTS +EXPERT +EXPERTISE +EXPERTLY +EXPERTNESS +EXPERTS +EXPIRATION +EXPIRATIONS +EXPIRE +EXPIRED +EXPIRES +EXPIRING +EXPLAIN +EXPLAINABLE +EXPLAINED +EXPLAINER +EXPLAINERS +EXPLAINING +EXPLAINS +EXPLANATION +EXPLANATIONS +EXPLANATORY +EXPLETIVE +EXPLICIT +EXPLICITLY +EXPLICITNESS +EXPLODE +EXPLODED +EXPLODES +EXPLODING +EXPLOIT +EXPLOITABLE +EXPLOITATION +EXPLOITATIONS +EXPLOITED +EXPLOITER +EXPLOITERS +EXPLOITING +EXPLOITS +EXPLORATION +EXPLORATIONS +EXPLORATORY +EXPLORE +EXPLORED +EXPLORER +EXPLORERS +EXPLORES +EXPLORING +EXPLOSION +EXPLOSIONS +EXPLOSIVE +EXPLOSIVELY +EXPLOSIVES +EXPONENT +EXPONENTIAL +EXPONENTIALLY +EXPONENTIALS +EXPONENTIATE +EXPONENTIATED +EXPONENTIATES +EXPONENTIATING +EXPONENTIATION +EXPONENTIATIONS +EXPONENTS +EXPORT +EXPORTATION +EXPORTED +EXPORTER +EXPORTERS +EXPORTING +EXPORTS +EXPOSE +EXPOSED +EXPOSER +EXPOSERS +EXPOSES +EXPOSING +EXPOSITION +EXPOSITIONS +EXPOSITORY +EXPOSURE +EXPOSURES +EXPOUND +EXPOUNDED +EXPOUNDER +EXPOUNDING +EXPOUNDS +EXPRESS +EXPRESSED +EXPRESSES +EXPRESSIBILITY +EXPRESSIBLE +EXPRESSIBLY +EXPRESSING +EXPRESSION +EXPRESSIONS +EXPRESSIVE +EXPRESSIVELY +EXPRESSIVENESS +EXPRESSLY +EXPULSION +EXPUNGE +EXPUNGED +EXPUNGES +EXPUNGING +EXPURGATE +EXQUISITE +EXQUISITELY +EXQUISITENESS +EXTANT +EXTEMPORANEOUS +EXTEND +EXTENDABLE +EXTENDED +EXTENDING +EXTENDS +EXTENSIBILITY +EXTENSIBLE +EXTENSION +EXTENSIONS +EXTENSIVE +EXTENSIVELY +EXTENT +EXTENTS +EXTENUATE +EXTENUATED +EXTENUATING +EXTENUATION +EXTERIOR +EXTERIORS +EXTERMINATE +EXTERMINATED +EXTERMINATES +EXTERMINATING +EXTERMINATION +EXTERNAL +EXTERNALLY +EXTINCT +EXTINCTION +EXTINGUISH +EXTINGUISHED +EXTINGUISHER +EXTINGUISHES +EXTINGUISHING +EXTIRPATE +EXTOL +EXTORT +EXTORTED +EXTORTION +EXTRA +EXTRACT +EXTRACTED +EXTRACTING +EXTRACTION +EXTRACTIONS +EXTRACTOR +EXTRACTORS +EXTRACTS +EXTRACURRICULAR +EXTRAMARITAL +EXTRANEOUS +EXTRANEOUSLY +EXTRANEOUSNESS +EXTRAORDINARILY +EXTRAORDINARINESS +EXTRAORDINARY +EXTRAPOLATE +EXTRAPOLATED +EXTRAPOLATES +EXTRAPOLATING +EXTRAPOLATION +EXTRAPOLATIONS +EXTRAS +EXTRATERRESTRIAL +EXTRAVAGANCE +EXTRAVAGANT +EXTRAVAGANTLY +EXTRAVAGANZA +EXTREMAL +EXTREME +EXTREMELY +EXTREMES +EXTREMIST +EXTREMISTS +EXTREMITIES +EXTREMITY +EXTRICATE +EXTRINSIC +EXTROVERT +EXUBERANCE +EXULT +EXULTATION +EXXON +EYE +EYEBALL +EYEBROW +EYEBROWS +EYED +EYEFUL +EYEGLASS +EYEGLASSES +EYEING +EYELASH +EYELID +EYELIDS +EYEPIECE +EYEPIECES +EYER +EYERS +EYES +EYESIGHT +EYEWITNESS +EYEWITNESSES +EYING +EZEKIEL +EZRA +FABER +FABIAN +FABLE +FABLED +FABLES +FABRIC +FABRICATE +FABRICATED +FABRICATES +FABRICATING +FABRICATION +FABRICS +FABULOUS +FABULOUSLY +FACADE +FACADED +FACADES +FACE +FACED +FACES +FACET +FACETED +FACETS +FACIAL +FACILE +FACILELY +FACILITATE +FACILITATED +FACILITATES +FACILITATING +FACILITIES +FACILITY +FACING +FACINGS +FACSIMILE +FACSIMILES +FACT +FACTION +FACTIONS +FACTIOUS +FACTO +FACTOR +FACTORED +FACTORIAL +FACTORIES +FACTORING +FACTORIZATION +FACTORIZATIONS +FACTORS +FACTORY +FACTS +FACTUAL +FACTUALLY +FACULTIES +FACULTY +FADE +FADED +FADEOUT +FADER +FADERS +FADES +FADING +FAFNIR +FAG +FAGIN +FAGS +FAHEY +FAHRENHEIT +FAHRENHEITS +FAIL +FAILED +FAILING +FAILINGS +FAILS +FAILSOFT +FAILURE +FAILURES +FAIN +FAINT +FAINTED +FAINTER +FAINTEST +FAINTING +FAINTLY +FAINTNESS +FAINTS +FAIR +FAIRBANKS +FAIRCHILD +FAIRER +FAIREST +FAIRFAX +FAIRFIELD +FAIRIES +FAIRING +FAIRLY +FAIRMONT +FAIRNESS +FAIRPORT +FAIRS +FAIRVIEW +FAIRY +FAIRYLAND +FAITH +FAITHFUL +FAITHFULLY +FAITHFULNESS +FAITHLESS +FAITHLESSLY +FAITHLESSNESS +FAITHS +FAKE +FAKED +FAKER +FAKES +FAKING +FALCON +FALCONER +FALCONS +FALK +FALKLAND +FALKLANDS +FALL +FALLACIES +FALLACIOUS +FALLACY +FALLEN +FALLIBILITY +FALLIBLE +FALLING +FALLOPIAN +FALLOUT +FALLOW +FALLS +FALMOUTH +FALSE +FALSEHOOD +FALSEHOODS +FALSELY +FALSENESS +FALSIFICATION +FALSIFIED +FALSIFIES +FALSIFY +FALSIFYING +FALSITY +FALSTAFF +FALTER +FALTERED +FALTERS +FAME +FAMED +FAMES +FAMILIAL +FAMILIAR +FAMILIARITIES +FAMILIARITY +FAMILIARIZATION +FAMILIARIZE +FAMILIARIZED +FAMILIARIZES +FAMILIARIZING +FAMILIARLY +FAMILIARNESS +FAMILIES +FAMILISM +FAMILY +FAMINE +FAMINES +FAMISH +FAMOUS +FAMOUSLY +FAN +FANATIC +FANATICISM +FANATICS +FANCIED +FANCIER +FANCIERS +FANCIES +FANCIEST +FANCIFUL +FANCIFULLY +FANCILY +FANCINESS +FANCY +FANCYING +FANFARE +FANFOLD +FANG +FANGLED +FANGS +FANNED +FANNIES +FANNING +FANNY +FANOUT +FANS +FANTASIES +FANTASIZE +FANTASTIC +FANTASY +FAQ +FAR +FARAD +FARADAY +FARAWAY +FARBER +FARCE +FARCES +FARE +FARED +FARES +FAREWELL +FAREWELLS +FARFETCHED +FARGO +FARINA +FARING +FARKAS +FARLEY +FARM +FARMED +FARMER +FARMERS +FARMHOUSE +FARMHOUSES +FARMING +FARMINGTON +FARMLAND +FARMS +FARMYARD +FARMYARDS +FARNSWORTH +FARRELL +FARSIGHTED +FARTHER +FARTHEST +FARTHING +FASCICLE +FASCINATE +FASCINATED +FASCINATES +FASCINATING +FASCINATION +FASCISM +FASCIST +FASHION +FASHIONABLE +FASHIONABLY +FASHIONED +FASHIONING +FASHIONS +FAST +FASTED +FASTEN +FASTENED +FASTENER +FASTENERS +FASTENING +FASTENINGS +FASTENS +FASTER +FASTEST +FASTIDIOUS +FASTING +FASTNESS +FASTS +FAT +FATAL +FATALITIES +FATALITY +FATALLY +FATALS +FATE +FATED +FATEFUL +FATES +FATHER +FATHERED +FATHERLAND +FATHERLY +FATHERS +FATHOM +FATHOMED +FATHOMING +FATHOMS +FATIGUE +FATIGUED +FATIGUES +FATIGUING +FATIMA +FATNESS +FATS +FATTEN +FATTENED +FATTENER +FATTENERS +FATTENING +FATTENS +FATTER +FATTEST +FATTY +FAUCET +FAULKNER +FAULKNERIAN +FAULT +FAULTED +FAULTING +FAULTLESS +FAULTLESSLY +FAULTS +FAULTY +FAUN +FAUNA +FAUNTLEROY +FAUST +FAUSTIAN +FAUSTUS +FAVOR +FAVORABLE +FAVORABLY +FAVORED +FAVORER +FAVORING +FAVORITE +FAVORITES +FAVORITISM +FAVORS +FAWKES +FAWN +FAWNED +FAWNING +FAWNS +FAYETTE +FAYETTEVILLE +FAZE +FEAR +FEARED +FEARFUL +FEARFULLY +FEARING +FEARLESS +FEARLESSLY +FEARLESSNESS +FEARS +FEARSOME +FEASIBILITY +FEASIBLE +FEAST +FEASTED +FEASTING +FEASTS +FEAT +FEATHER +FEATHERBED +FEATHERBEDDING +FEATHERED +FEATHERER +FEATHERERS +FEATHERING +FEATHERMAN +FEATHERS +FEATHERWEIGHT +FEATHERY +FEATS +FEATURE +FEATURED +FEATURES +FEATURING +FEBRUARIES +FEBRUARY +FECUND +FED +FEDDERS +FEDERAL +FEDERALIST +FEDERALLY +FEDERALS +FEDERATION +FEDORA +FEE +FEEBLE +FEEBLENESS +FEEBLER +FEEBLEST +FEEBLY +FEED +FEEDBACK +FEEDER +FEEDERS +FEEDING +FEEDINGS +FEEDS +FEEL +FEELER +FEELERS +FEELING +FEELINGLY +FEELINGS +FEELS +FEENEY +FEES +FEET +FEIGN +FEIGNED +FEIGNING +FELDER +FELDMAN +FELICE +FELICIA +FELICITIES +FELICITY +FELINE +FELIX +FELL +FELLATIO +FELLED +FELLING +FELLINI +FELLOW +FELLOWS +FELLOWSHIP +FELLOWSHIPS +FELON +FELONIOUS +FELONY +FELT +FELTS +FEMALE +FEMALES +FEMININE +FEMININITY +FEMINISM +FEMINIST +FEMUR +FEMURS +FEN +FENCE +FENCED +FENCER +FENCERS +FENCES +FENCING +FEND +FENTON +FENWICK +FERBER +FERDINAND +FERDINANDO +FERGUSON +FERMAT +FERMENT +FERMENTATION +FERMENTATIONS +FERMENTED +FERMENTING +FERMENTS +FERMI +FERN +FERNANDO +FERNS +FEROCIOUS +FEROCIOUSLY +FEROCIOUSNESS +FEROCITY +FERREIRA +FERRER +FERRET +FERRIED +FERRIES +FERRITE +FERRY +FERTILE +FERTILELY +FERTILITY +FERTILIZATION +FERTILIZE +FERTILIZED +FERTILIZER +FERTILIZERS +FERTILIZES +FERTILIZING +FERVENT +FERVENTLY +FERVOR +FERVORS +FESS +FESTIVAL +FESTIVALS +FESTIVE +FESTIVELY +FESTIVITIES +FESTIVITY +FETAL +FETCH +FETCHED +FETCHES +FETCHING +FETCHINGLY +FETID +FETISH +FETTER +FETTERED +FETTERS +FETTLE +FETUS +FEUD +FEUDAL +FEUDALISM +FEUDS +FEVER +FEVERED +FEVERISH +FEVERISHLY +FEVERS +FEW +FEWER +FEWEST +FEWNESS +FIANCE +FIANCEE +FIASCO +FIAT +FIB +FIBBING +FIBER +FIBERGLAS +FIBERS +FIBONACCI +FIBROSITIES +FIBROSITY +FIBROUS +FIBROUSLY +FICKLE +FICKLENESS +FICTION +FICTIONAL +FICTIONALLY +FICTIONS +FICTITIOUS +FICTITIOUSLY +FIDDLE +FIDDLED +FIDDLER +FIDDLES +FIDDLESTICK +FIDDLESTICKS +FIDDLING +FIDEL +FIDELITY +FIDGET +FIDUCIAL +FIEF +FIEFDOM +FIELD +FIELDED +FIELDER +FIELDERS +FIELDING +FIELDS +FIELDWORK +FIEND +FIENDISH +FIERCE +FIERCELY +FIERCENESS +FIERCER +FIERCEST +FIERY +FIFE +FIFTEEN +FIFTEENS +FIFTEENTH +FIFTH +FIFTIES +FIFTIETH +FIFTY +FIG +FIGARO +FIGHT +FIGHTER +FIGHTERS +FIGHTING +FIGHTS +FIGS +FIGURATIVE +FIGURATIVELY +FIGURE +FIGURED +FIGURES +FIGURING +FIGURINGS +FIJI +FIJIAN +FIJIANS +FILAMENT +FILAMENTS +FILE +FILED +FILENAME +FILENAMES +FILER +FILES +FILIAL +FILIBUSTER +FILING +FILINGS +FILIPINO +FILIPINOS +FILIPPO +FILL +FILLABLE +FILLED +FILLER +FILLERS +FILLING +FILLINGS +FILLMORE +FILLS +FILLY +FILM +FILMED +FILMING +FILMS +FILTER +FILTERED +FILTERING +FILTERS +FILTH +FILTHIER +FILTHIEST +FILTHINESS +FILTHY +FIN +FINAL +FINALITY +FINALIZATION +FINALIZE +FINALIZED +FINALIZES +FINALIZING +FINALLY +FINALS +FINANCE +FINANCED +FINANCES +FINANCIAL +FINANCIALLY +FINANCIER +FINANCIERS +FINANCING +FIND +FINDER +FINDERS +FINDING +FINDINGS +FINDS +FINE +FINED +FINELY +FINENESS +FINER +FINES +FINESSE +FINESSED +FINESSING +FINEST +FINGER +FINGERED +FINGERING +FINGERINGS +FINGERNAIL +FINGERPRINT +FINGERPRINTS +FINGERS +FINGERTIP +FINICKY +FINING +FINISH +FINISHED +FINISHER +FINISHERS +FINISHES +FINISHING +FINITE +FINITELY +FINITENESS +FINK +FINLAND +FINLEY +FINN +FINNEGAN +FINNISH +FINNS +FINNY +FINS +FIORELLO +FIORI +FIR +FIRE +FIREARM +FIREARMS +FIREBOAT +FIREBREAK +FIREBUG +FIRECRACKER +FIRED +FIREFLIES +FIREFLY +FIREHOUSE +FIRELIGHT +FIREMAN +FIREMEN +FIREPLACE +FIREPLACES +FIREPOWER +FIREPROOF +FIRER +FIRERS +FIRES +FIRESIDE +FIRESTONE +FIREWALL +FIREWOOD +FIREWORKS +FIRING +FIRINGS +FIRM +FIRMAMENT +FIRMED +FIRMER +FIRMEST +FIRMING +FIRMLY +FIRMNESS +FIRMS +FIRMWARE +FIRST +FIRSTHAND +FIRSTLY +FIRSTS +FISCAL +FISCALLY +FISCHBEIN +FISCHER +FISH +FISHED +FISHER +FISHERMAN +FISHERMEN +FISHERS +FISHERY +FISHES +FISHING +FISHKILL +FISHMONGER +FISHPOND +FISHY +FISK +FISKE +FISSION +FISSURE +FISSURED +FIST +FISTED +FISTICUFF +FISTS +FIT +FITCH +FITCHBURG +FITFUL +FITFULLY +FITLY +FITNESS +FITS +FITTED +FITTER +FITTERS +FITTING +FITTINGLY +FITTINGS +FITZGERALD +FITZPATRICK +FITZROY +FIVE +FIVEFOLD +FIVES +FIX +FIXATE +FIXATED +FIXATES +FIXATING +FIXATION +FIXATIONS +FIXED +FIXEDLY +FIXEDNESS +FIXER +FIXERS +FIXES +FIXING +FIXINGS +FIXTURE +FIXTURES +FIZEAU +FIZZLE +FIZZLED +FLABBERGAST +FLABBERGASTED +FLACK +FLAG +FLAGELLATE +FLAGGED +FLAGGING +FLAGLER +FLAGPOLE +FLAGRANT +FLAGRANTLY +FLAGS +FLAGSTAFF +FLAIL +FLAIR +FLAK +FLAKE +FLAKED +FLAKES +FLAKING +FLAKY +FLAM +FLAMBOYANT +FLAME +FLAMED +FLAMER +FLAMERS +FLAMES +FLAMING +FLAMMABLE +FLANAGAN +FLANDERS +FLANK +FLANKED +FLANKER +FLANKING +FLANKS +FLANNEL +FLANNELS +FLAP +FLAPS +FLARE +FLARED +FLARES +FLARING +FLASH +FLASHBACK +FLASHED +FLASHER +FLASHERS +FLASHES +FLASHING +FLASHLIGHT +FLASHLIGHTS +FLASHY +FLASK +FLAT +FLATBED +FLATLY +FLATNESS +FLATS +FLATTEN +FLATTENED +FLATTENING +FLATTER +FLATTERED +FLATTERER +FLATTERING +FLATTERY +FLATTEST +FLATULENT +FLATUS +FLATWORM +FLAUNT +FLAUNTED +FLAUNTING +FLAUNTS +FLAVOR +FLAVORED +FLAVORING +FLAVORINGS +FLAVORS +FLAW +FLAWED +FLAWLESS +FLAWLESSLY +FLAWS +FLAX +FLAXEN +FLEA +FLEAS +FLED +FLEDERMAUS +FLEDGED +FLEDGLING +FLEDGLINGS +FLEE +FLEECE +FLEECES +FLEECY +FLEEING +FLEES +FLEET +FLEETEST +FLEETING +FLEETLY +FLEETNESS +FLEETS +FLEISCHMAN +FLEISHER +FLEMING +FLEMINGS +FLEMISH +FLEMISHED +FLEMISHES +FLEMISHING +FLESH +FLESHED +FLESHES +FLESHING +FLESHLY +FLESHY +FLETCHER +FLETCHERIZE +FLETCHERIZES +FLEW +FLEX +FLEXIBILITIES +FLEXIBILITY +FLEXIBLE +FLEXIBLY +FLICK +FLICKED +FLICKER +FLICKERING +FLICKING +FLICKS +FLIER +FLIERS +FLIES +FLIGHT +FLIGHTS +FLIMSY +FLINCH +FLINCHED +FLINCHES +FLINCHING +FLING +FLINGS +FLINT +FLINTY +FLIP +FLIPFLOP +FLIPPED +FLIPS +FLIRT +FLIRTATION +FLIRTATIOUS +FLIRTED +FLIRTING +FLIRTS +FLIT +FLITTING +FLO +FLOAT +FLOATED +FLOATER +FLOATING +FLOATS +FLOCK +FLOCKED +FLOCKING +FLOCKS +FLOG +FLOGGING +FLOOD +FLOODED +FLOODING +FLOODLIGHT +FLOODLIT +FLOODS +FLOOR +FLOORED +FLOORING +FLOORINGS +FLOORS +FLOP +FLOPPIES +FLOPPILY +FLOPPING +FLOPPY +FLOPS +FLORA +FLORAL +FLORENCE +FLORENTINE +FLORID +FLORIDA +FLORIDIAN +FLORIDIANS +FLORIN +FLORIST +FLOSS +FLOSSED +FLOSSES +FLOSSING +FLOTATION +FLOTILLA +FLOUNDER +FLOUNDERED +FLOUNDERING +FLOUNDERS +FLOUR +FLOURED +FLOURISH +FLOURISHED +FLOURISHES +FLOURISHING +FLOW +FLOWCHART +FLOWCHARTING +FLOWCHARTS +FLOWED +FLOWER +FLOWERED +FLOWERINESS +FLOWERING +FLOWERPOT +FLOWERS +FLOWERY +FLOWING +FLOWN +FLOWS +FLOYD +FLU +FLUCTUATE +FLUCTUATES +FLUCTUATING +FLUCTUATION +FLUCTUATIONS +FLUE +FLUENCY +FLUENT +FLUENTLY +FLUFF +FLUFFIER +FLUFFIEST +FLUFFY +FLUID +FLUIDITY +FLUIDLY +FLUIDS +FLUKE +FLUNG +FLUNKED +FLUORESCE +FLUORESCENT +FLURRIED +FLURRY +FLUSH +FLUSHED +FLUSHES +FLUSHING +FLUTE +FLUTED +FLUTING +FLUTTER +FLUTTERED +FLUTTERING +FLUTTERS +FLUX +FLY +FLYABLE +FLYER +FLYERS +FLYING +FLYNN +FOAL +FOAM +FOAMED +FOAMING +FOAMS +FOAMY +FOB +FOBBING +FOCAL +FOCALLY +FOCI +FOCUS +FOCUSED +FOCUSES +FOCUSING +FOCUSSED +FODDER +FOE +FOES +FOG +FOGARTY +FOGGED +FOGGIER +FOGGIEST +FOGGILY +FOGGING +FOGGY +FOGS +FOGY +FOIBLE +FOIL +FOILED +FOILING +FOILS +FOIST +FOLD +FOLDED +FOLDER +FOLDERS +FOLDING +FOLDOUT +FOLDS +FOLEY +FOLIAGE +FOLK +FOLKLORE +FOLKS +FOLKSONG +FOLKSY +FOLLIES +FOLLOW +FOLLOWED +FOLLOWER +FOLLOWERS +FOLLOWING +FOLLOWINGS +FOLLOWS +FOLLY +FOLSOM +FOMALHAUT +FOND +FONDER +FONDLE +FONDLED +FONDLES +FONDLING +FONDLY +FONDNESS +FONT +FONTAINE +FONTAINEBLEAU +FONTANA +FONTS +FOOD +FOODS +FOODSTUFF +FOODSTUFFS +FOOL +FOOLED +FOOLHARDY +FOOLING +FOOLISH +FOOLISHLY +FOOLISHNESS +FOOLPROOF +FOOLS +FOOT +FOOTAGE +FOOTBALL +FOOTBALLS +FOOTBRIDGE +FOOTE +FOOTED +FOOTER +FOOTERS +FOOTFALL +FOOTHILL +FOOTHOLD +FOOTING +FOOTMAN +FOOTNOTE +FOOTNOTES +FOOTPATH +FOOTPRINT +FOOTPRINTS +FOOTSTEP +FOOTSTEPS +FOR +FORAGE +FORAGED +FORAGES +FORAGING +FORAY +FORAYS +FORBADE +FORBEAR +FORBEARANCE +FORBEARS +FORBES +FORBID +FORBIDDEN +FORBIDDING +FORBIDS +FORCE +FORCED +FORCEFUL +FORCEFULLY +FORCEFULNESS +FORCER +FORCES +FORCIBLE +FORCIBLY +FORCING +FORD +FORDHAM +FORDS +FORE +FOREARM +FOREARMS +FOREBODING +FORECAST +FORECASTED +FORECASTER +FORECASTERS +FORECASTING +FORECASTLE +FORECASTS +FOREFATHER +FOREFATHERS +FOREFINGER +FOREFINGERS +FOREGO +FOREGOES +FOREGOING +FOREGONE +FOREGROUND +FOREHEAD +FOREHEADS +FOREIGN +FOREIGNER +FOREIGNERS +FOREIGNS +FOREMAN +FOREMOST +FORENOON +FORENSIC +FORERUNNERS +FORESEE +FORESEEABLE +FORESEEN +FORESEES +FORESIGHT +FORESIGHTED +FOREST +FORESTALL +FORESTALLED +FORESTALLING +FORESTALLMENT +FORESTALLS +FORESTED +FORESTER +FORESTERS +FORESTRY +FORESTS +FORETELL +FORETELLING +FORETELLS +FORETOLD +FOREVER +FOREWARN +FOREWARNED +FOREWARNING +FOREWARNINGS +FOREWARNS +FORFEIT +FORFEITED +FORFEITURE +FORGAVE +FORGE +FORGED +FORGER +FORGERIES +FORGERY +FORGES +FORGET +FORGETFUL +FORGETFULNESS +FORGETS +FORGETTABLE +FORGETTABLY +FORGETTING +FORGING +FORGIVABLE +FORGIVABLY +FORGIVE +FORGIVEN +FORGIVENESS +FORGIVES +FORGIVING +FORGIVINGLY +FORGOT +FORGOTTEN +FORK +FORKED +FORKING +FORKLIFT +FORKS +FORLORN +FORLORNLY +FORM +FORMAL +FORMALISM +FORMALISMS +FORMALITIES +FORMALITY +FORMALIZATION +FORMALIZATIONS +FORMALIZE +FORMALIZED +FORMALIZES +FORMALIZING +FORMALLY +FORMANT +FORMANTS +FORMAT +FORMATION +FORMATIONS +FORMATIVE +FORMATIVELY +FORMATS +FORMATTED +FORMATTER +FORMATTERS +FORMATTING +FORMED +FORMER +FORMERLY +FORMICA +FORMICAS +FORMIDABLE +FORMING +FORMOSA +FORMOSAN +FORMS +FORMULA +FORMULAE +FORMULAS +FORMULATE +FORMULATED +FORMULATES +FORMULATING +FORMULATION +FORMULATIONS +FORMULATOR +FORMULATORS +FORNICATION +FORREST +FORSAKE +FORSAKEN +FORSAKES +FORSAKING +FORSYTHE +FORT +FORTE +FORTESCUE +FORTH +FORTHCOMING +FORTHRIGHT +FORTHWITH +FORTIER +FORTIES +FORTIETH +FORTIFICATION +FORTIFICATIONS +FORTIFIED +FORTIFIES +FORTIFY +FORTIFYING +FORTIORI +FORTITUDE +FORTNIGHT +FORTNIGHTLY +FORTRAN +FORTRAN +FORTRESS +FORTRESSES +FORTS +FORTUITOUS +FORTUITOUSLY +FORTUNATE +FORTUNATELY +FORTUNE +FORTUNES +FORTY +FORUM +FORUMS +FORWARD +FORWARDED +FORWARDER +FORWARDING +FORWARDNESS +FORWARDS +FOSS +FOSSIL +FOSTER +FOSTERED +FOSTERING +FOSTERS +FOUGHT +FOUL +FOULED +FOULEST +FOULING +FOULLY +FOULMOUTH +FOULNESS +FOULS +FOUND +FOUNDATION +FOUNDATIONS +FOUNDED +FOUNDER +FOUNDERED +FOUNDERS +FOUNDING +FOUNDLING +FOUNDRIES +FOUNDRY +FOUNDS +FOUNT +FOUNTAIN +FOUNTAINS +FOUNTS +FOUR +FOURFOLD +FOURIER +FOURS +FOURSCORE +FOURSOME +FOURSQUARE +FOURTEEN +FOURTEENS +FOURTEENTH +FOURTH +FOWL +FOWLER +FOWLS +FOX +FOXES +FOXHALL +FRACTION +FRACTIONAL +FRACTIONALLY +FRACTIONS +FRACTURE +FRACTURED +FRACTURES +FRACTURING +FRAGILE +FRAGMENT +FRAGMENTARY +FRAGMENTATION +FRAGMENTED +FRAGMENTING +FRAGMENTS +FRAGRANCE +FRAGRANCES +FRAGRANT +FRAGRANTLY +FRAIL +FRAILEST +FRAILTY +FRAME +FRAMED +FRAMER +FRAMES +FRAMEWORK +FRAMEWORKS +FRAMING +FRAN +FRANC +FRANCAISE +FRANCE +FRANCES +FRANCESCA +FRANCESCO +FRANCHISE +FRANCHISES +FRANCIE +FRANCINE +FRANCIS +FRANCISCAN +FRANCISCANS +FRANCISCO +FRANCIZE +FRANCIZES +FRANCO +FRANCOIS +FRANCOISE +FRANCS +FRANK +FRANKED +FRANKEL +FRANKER +FRANKEST +FRANKFORT +FRANKFURT +FRANKIE +FRANKING +FRANKLINIZATION +FRANKLINIZATIONS +FRANKLY +FRANKNESS +FRANKS +FRANNY +FRANTIC +FRANTICALLY +FRANZ +FRASER +FRATERNAL +FRATERNALLY +FRATERNITIES +FRATERNITY +FRAU +FRAUD +FRAUDS +FRAUDULENT +FRAUGHT +FRAY +FRAYED +FRAYING +FRAYNE +FRAYS +FRAZIER +FRAZZLE +FREAK +FREAKISH +FREAKS +FRECKLE +FRECKLED +FRECKLES +FRED +FREDDIE +FREDDY +FREDERIC +FREDERICK +FREDERICKS +FREDERICKSBURG +FREDERICO +FREDERICTON +FREDHOLM +FREDRICK +FREDRICKSON +FREE +FREED +FREEDMAN +FREEDOM +FREEDOMS +FREEING +FREEINGS +FREELY +FREEMAN +FREEMASON +FREEMASONRY +FREEMASONS +FREENESS +FREEPORT +FREER +FREES +FREEST +FREESTYLE +FREETOWN +FREEWAY +FREEWHEEL +FREEZE +FREEZER +FREEZERS +FREEZES +FREEZING +FREIDA +FREIGHT +FREIGHTED +FREIGHTER +FREIGHTERS +FREIGHTING +FREIGHTS +FRENCH +FRENCHIZE +FRENCHIZES +FRENCHMAN +FRENCHMEN +FRENETIC +FRENZIED +FRENZY +FREON +FREQUENCIES +FREQUENCY +FREQUENT +FREQUENTED +FREQUENTER +FREQUENTERS +FREQUENTING +FREQUENTLY +FREQUENTS +FRESCO +FRESCOES +FRESH +FRESHEN +FRESHENED +FRESHENER +FRESHENERS +FRESHENING +FRESHENS +FRESHER +FRESHEST +FRESHLY +FRESHMAN +FRESHMEN +FRESHNESS +FRESHWATER +FRESNEL +FRESNO +FRET +FRETFUL +FRETFULLY +FRETFULNESS +FREUD +FREUDIAN +FREUDIANISM +FREUDIANISMS +FREUDIANS +FREY +FREYA +FRIAR +FRIARS +FRICATIVE +FRICATIVES +FRICK +FRICTION +FRICTIONLESS +FRICTIONS +FRIDAY +FRIDAYS +FRIED +FRIEDMAN +FRIEDRICH +FRIEND +FRIENDLESS +FRIENDLIER +FRIENDLIEST +FRIENDLINESS +FRIENDLY +FRIENDS +FRIENDSHIP +FRIENDSHIPS +FRIES +FRIESLAND +FRIEZE +FRIEZES +FRIGATE +FRIGATES +FRIGGA +FRIGHT +FRIGHTEN +FRIGHTENED +FRIGHTENING +FRIGHTENINGLY +FRIGHTENS +FRIGHTFUL +FRIGHTFULLY +FRIGHTFULNESS +FRIGID +FRIGIDAIRE +FRILL +FRILLS +FRINGE +FRINGED +FRISBEE +FRISIA +FRISIAN +FRISK +FRISKED +FRISKING +FRISKS +FRISKY +FRITO +FRITTER +FRITZ +FRIVOLITY +FRIVOLOUS +FRIVOLOUSLY +FRO +FROCK +FROCKS +FROG +FROGS +FROLIC +FROLICS +FROM +FRONT +FRONTAGE +FRONTAL +FRONTED +FRONTIER +FRONTIERS +FRONTIERSMAN +FRONTIERSMEN +FRONTING +FRONTS +FROST +FROSTBELT +FROSTBITE +FROSTBITTEN +FROSTED +FROSTING +FROSTS +FROSTY +FROTH +FROTHING +FROTHY +FROWN +FROWNED +FROWNING +FROWNS +FROZE +FROZEN +FROZENLY +FRUEHAUF +FRUGAL +FRUGALLY +FRUIT +FRUITFUL +FRUITFULLY +FRUITFULNESS +FRUITION +FRUITLESS +FRUITLESSLY +FRUITS +FRUSTRATE +FRUSTRATED +FRUSTRATES +FRUSTRATING +FRUSTRATION +FRUSTRATIONS +FRY +FRYE +FUCHS +FUCHSIA +FUDGE +FUEL +FUELED +FUELING +FUELS +FUGITIVE +FUGITIVES +FUGUE +FUJI +FUJITSU +FULBRIGHT +FULBRIGHTS +FULCRUM +FULFILL +FULFILLED +FULFILLING +FULFILLMENT +FULFILLMENTS +FULFILLS +FULL +FULLER +FULLERTON +FULLEST +FULLNESS +FULLY +FULMINATE +FULTON +FUMBLE +FUMBLED +FUMBLING +FUME +FUMED +FUMES +FUMING +FUN +FUNCTION +FUNCTIONAL +FUNCTIONALITIES +FUNCTIONALITY +FUNCTIONALLY +FUNCTIONALS +FUNCTIONARY +FUNCTIONED +FUNCTIONING +FUNCTIONS +FUNCTOR +FUNCTORS +FUND +FUNDAMENTAL +FUNDAMENTALLY +FUNDAMENTALS +FUNDED +FUNDER +FUNDERS +FUNDING +FUNDS +FUNERAL +FUNERALS +FUNEREAL +FUNGAL +FUNGI +FUNGIBLE +FUNGICIDE +FUNGUS +FUNK +FUNNEL +FUNNELED +FUNNELING +FUNNELS +FUNNIER +FUNNIEST +FUNNILY +FUNNINESS +FUNNY +FUR +FURIES +FURIOUS +FURIOUSER +FURIOUSLY +FURLONG +FURLOUGH +FURMAN +FURNACE +FURNACES +FURNISH +FURNISHED +FURNISHES +FURNISHING +FURNISHINGS +FURNITURE +FURRIER +FURROW +FURROWED +FURROWS +FURRY +FURS +FURTHER +FURTHERED +FURTHERING +FURTHERMORE +FURTHERMOST +FURTHERS +FURTHEST +FURTIVE +FURTIVELY +FURTIVENESS +FURY +FUSE +FUSED +FUSES +FUSING +FUSION +FUSS +FUSSING +FUSSY +FUTILE +FUTILITY +FUTURE +FUTURES +FUTURISTIC +FUZZ +FUZZIER +FUZZINESS +FUZZY +GAB +GABARDINE +GABBING +GABERONES +GABLE +GABLED +GABLER +GABLES +GABON +GABORONE +GABRIEL +GABRIELLE +GAD +GADFLY +GADGET +GADGETRY +GADGETS +GAELIC +GAELICIZATION +GAELICIZATIONS +GAELICIZE +GAELICIZES +GAG +GAGGED +GAGGING +GAGING +GAGS +GAIETIES +GAIETY +GAIL +GAILY +GAIN +GAINED +GAINER +GAINERS +GAINES +GAINESVILLE +GAINFUL +GAINING +GAINS +GAIT +GAITED +GAITER +GAITERS +GAITHERSBURG +GALACTIC +GALAHAD +GALAPAGOS +GALATEA +GALATEAN +GALATEANS +GALATIA +GALATIANS +GALAXIES +GALAXY +GALBREATH +GALE +GALEN +GALILEAN +GALILEE +GALILEO +GALL +GALLAGHER +GALLANT +GALLANTLY +GALLANTRY +GALLANTS +GALLED +GALLERIED +GALLERIES +GALLERY +GALLEY +GALLEYS +GALLING +GALLON +GALLONS +GALLOP +GALLOPED +GALLOPER +GALLOPING +GALLOPS +GALLOWAY +GALLOWS +GALLS +GALLSTONE +GALLUP +GALOIS +GALT +GALVESTON +GALVIN +GALWAY +GAMBIA +GAMBIT +GAMBLE +GAMBLED +GAMBLER +GAMBLERS +GAMBLES +GAMBLING +GAMBOL +GAME +GAMED +GAMELY +GAMENESS +GAMES +GAMING +GAMMA +GANDER +GANDHI +GANDHIAN +GANG +GANGES +GANGLAND +GANGLING +GANGPLANK +GANGRENE +GANGS +GANGSTER +GANGSTERS +GANNETT +GANTRY +GANYMEDE +GAP +GAPE +GAPED +GAPES +GAPING +GAPS +GARAGE +GARAGED +GARAGES +GARB +GARBAGE +GARBAGES +GARBED +GARBLE +GARBLED +GARCIA +GARDEN +GARDENED +GARDENER +GARDENERS +GARDENING +GARDENS +GARDNER +GARFIELD +GARFUNKEL +GARGANTUAN +GARGLE +GARGLED +GARGLES +GARGLING +GARIBALDI +GARLAND +GARLANDED +GARLIC +GARMENT +GARMENTS +GARNER +GARNERED +GARNETT +GARNISH +GARRETT +GARRISON +GARRISONED +GARRISONIAN +GARRY +GARTER +GARTERS +GARTH +GARVEY +GARY +GAS +GASCONY +GASEOUS +GASEOUSLY +GASES +GASH +GASHES +GASKET +GASLIGHT +GASOLINE +GASP +GASPED +GASPEE +GASPING +GASPS +GASSED +GASSER +GASSET +GASSING +GASSINGS +GASSY +GASTON +GASTRIC +GASTROINTESTINAL +GASTRONOME +GASTRONOMY +GATE +GATED +GATES +GATEWAY +GATEWAYS +GATHER +GATHERED +GATHERER +GATHERERS +GATHERING +GATHERINGS +GATHERS +GATING +GATLINBURG +GATOR +GATSBY +GAUCHE +GAUDINESS +GAUDY +GAUGE +GAUGED +GAUGES +GAUGUIN +GAUL +GAULLE +GAULS +GAUNT +GAUNTLEY +GAUNTNESS +GAUSSIAN +GAUTAMA +GAUZE +GAVE +GAVEL +GAVIN +GAWK +GAWKY +GAY +GAYER +GAYEST +GAYETY +GAYLOR +GAYLORD +GAYLY +GAYNESS +GAYNOR +GAZE +GAZED +GAZELLE +GAZER +GAZERS +GAZES +GAZETTE +GAZING +GEAR +GEARED +GEARING +GEARS +GEARY +GECKO +GEESE +GEHRIG +GEIGER +GEIGY +GEISHA +GEL +GELATIN +GELATINE +GELATINOUS +GELD +GELLED +GELLING +GELS +GEM +GEMINI +GEMINID +GEMMA +GEMS +GENDER +GENDERS +GENE +GENEALOGY +GENERAL +GENERALIST +GENERALISTS +GENERALITIES +GENERALITY +GENERALIZATION +GENERALIZATIONS +GENERALIZE +GENERALIZED +GENERALIZER +GENERALIZERS +GENERALIZES +GENERALIZING +GENERALLY +GENERALS +GENERATE +GENERATED +GENERATES +GENERATING +GENERATION +GENERATIONS +GENERATIVE +GENERATOR +GENERATORS +GENERIC +GENERICALLY +GENEROSITIES +GENEROSITY +GENEROUS +GENEROUSLY +GENEROUSNESS +GENES +GENESCO +GENESIS +GENETIC +GENETICALLY +GENEVA +GENEVIEVE +GENIAL +GENIALLY +GENIE +GENIUS +GENIUSES +GENOA +GENRE +GENRES +GENT +GENTEEL +GENTILE +GENTLE +GENTLEMAN +GENTLEMANLY +GENTLEMEN +GENTLENESS +GENTLER +GENTLEST +GENTLEWOMAN +GENTLY +GENTRY +GENUINE +GENUINELY +GENUINENESS +GENUS +GEOCENTRIC +GEODESIC +GEODESY +GEODETIC +GEOFF +GEOFFREY +GEOGRAPHER +GEOGRAPHIC +GEOGRAPHICAL +GEOGRAPHICALLY +GEOGRAPHY +GEOLOGICAL +GEOLOGIST +GEOLOGISTS +GEOLOGY +GEOMETRIC +GEOMETRICAL +GEOMETRICALLY +GEOMETRICIAN +GEOMETRIES +GEOMETRY +GEOPHYSICAL +GEOPHYSICS +GEORGE +GEORGES +GEORGETOWN +GEORGIA +GEORGIAN +GEORGIANS +GEOSYNCHRONOUS +GERALD +GERALDINE +GERANIUM +GERARD +GERBER +GERBIL +GERHARD +GERHARDT +GERIATRIC +GERM +GERMAN +GERMANE +GERMANIA +GERMANIC +GERMANS +GERMANTOWN +GERMANY +GERMICIDE +GERMINAL +GERMINATE +GERMINATED +GERMINATES +GERMINATING +GERMINATION +GERMS +GEROME +GERRY +GERSHWIN +GERSHWINS +GERTRUDE +GERUND +GESTAPO +GESTURE +GESTURED +GESTURES +GESTURING +GET +GETAWAY +GETS +GETTER +GETTERS +GETTING +GETTY +GETTYSBURG +GEYSER +GHANA +GHANIAN +GHASTLY +GHENT +GHETTO +GHOST +GHOSTED +GHOSTLY +GHOSTS +GIACOMO +GIANT +GIANTS +GIBBERISH +GIBBONS +GIBBS +GIBBY +GIBRALTAR +GIBSON +GIDDINESS +GIDDINGS +GIDDY +GIDEON +GIFFORD +GIFT +GIFTED +GIFTS +GIG +GIGABIT +GIGABITS +GIGABYTE +GIGABYTES +GIGACYCLE +GIGAHERTZ +GIGANTIC +GIGAVOLT +GIGAWATT +GIGGLE +GIGGLED +GIGGLES +GIGGLING +GIL +GILBERTSON +GILCHRIST +GILD +GILDED +GILDING +GILDS +GILEAD +GILES +GILKSON +GILL +GILLESPIE +GILLETTE +GILLIGAN +GILLS +GILMORE +GILT +GIMBEL +GIMMICK +GIMMICKS +GIN +GINA +GINGER +GINGERBREAD +GINGERLY +GINGHAM +GINGHAMS +GINN +GINO +GINS +GINSBERG +GINSBURG +GIOCONDA +GIORGIO +GIOVANNI +GIPSIES +GIPSY +GIRAFFE +GIRAFFES +GIRD +GIRDER +GIRDERS +GIRDLE +GIRL +GIRLFRIEND +GIRLIE +GIRLISH +GIRLS +GIRT +GIRTH +GIST +GIULIANO +GIUSEPPE +GIVE +GIVEAWAY +GIVEN +GIVER +GIVERS +GIVES +GIVING +GLACIAL +GLACIER +GLACIERS +GLAD +GLADDEN +GLADDER +GLADDEST +GLADE +GLADIATOR +GLADLY +GLADNESS +GLADSTONE +GLADYS +GLAMOR +GLAMOROUS +GLAMOUR +GLANCE +GLANCED +GLANCES +GLANCING +GLAND +GLANDS +GLANDULAR +GLARE +GLARED +GLARES +GLARING +GLARINGLY +GLASGOW +GLASS +GLASSED +GLASSES +GLASSY +GLASWEGIAN +GLAUCOMA +GLAZE +GLAZED +GLAZER +GLAZES +GLAZING +GLEAM +GLEAMED +GLEAMING +GLEAMS +GLEAN +GLEANED +GLEANER +GLEANING +GLEANINGS +GLEANS +GLEASON +GLEE +GLEEFUL +GLEEFULLY +GLEES +GLEN +GLENDA +GLENDALE +GLENN +GLENS +GLIDDEN +GLIDE +GLIDED +GLIDER +GLIDERS +GLIDES +GLIMMER +GLIMMERED +GLIMMERING +GLIMMERS +GLIMPSE +GLIMPSED +GLIMPSES +GLINT +GLINTED +GLINTING +GLINTS +GLISTEN +GLISTENED +GLISTENING +GLISTENS +GLITCH +GLITTER +GLITTERED +GLITTERING +GLITTERS +GLOAT +GLOBAL +GLOBALLY +GLOBE +GLOBES +GLOBULAR +GLOBULARITY +GLOOM +GLOOMILY +GLOOMY +GLORIA +GLORIANA +GLORIES +GLORIFICATION +GLORIFIED +GLORIFIES +GLORIFY +GLORIOUS +GLORIOUSLY +GLORY +GLORYING +GLOSS +GLOSSARIES +GLOSSARY +GLOSSED +GLOSSES +GLOSSING +GLOSSY +GLOTTAL +GLOUCESTER +GLOVE +GLOVED +GLOVER +GLOVERS +GLOVES +GLOVING +GLOW +GLOWED +GLOWER +GLOWERS +GLOWING +GLOWINGLY +GLOWS +GLUE +GLUED +GLUES +GLUING +GLUT +GLUTTON +GLYNN +GNASH +GNAT +GNATS +GNAW +GNAWED +GNAWING +GNAWS +GNOME +GNOMON +GNU +GOA +GOAD +GOADED +GOAL +GOALS +GOAT +GOATEE +GOATEES +GOATS +GOBBLE +GOBBLED +GOBBLER +GOBBLERS +GOBBLES +GOBI +GOBLET +GOBLETS +GOBLIN +GOBLINS +GOD +GODDARD +GODDESS +GODDESSES +GODFATHER +GODFREY +GODHEAD +GODLIKE +GODLY +GODMOTHER +GODMOTHERS +GODOT +GODPARENT +GODS +GODSEND +GODSON +GODWIN +GODZILLA +GOES +GOETHE +GOFF +GOGGLES +GOGH +GOING +GOINGS +GOLD +GOLDA +GOLDBERG +GOLDEN +GOLDENLY +GOLDENNESS +GOLDENROD +GOLDFIELD +GOLDFISH +GOLDING +GOLDMAN +GOLDS +GOLDSMITH +GOLDSTEIN +GOLDSTINE +GOLDWATER +GOLETA +GOLF +GOLFER +GOLFERS +GOLFING +GOLIATH +GOLLY +GOMEZ +GONDOLA +GONE +GONER +GONG +GONGS +GONZALES +GONZALEZ +GOOD +GOODBY +GOODBYE +GOODE +GOODIES +GOODLY +GOODMAN +GOODNESS +GOODRICH +GOODS +GOODWILL +GOODWIN +GOODY +GOODYEAR +GOOF +GOOFED +GOOFS +GOOFY +GOOSE +GOPHER +GORDIAN +GORDON +GORE +GOREN +GORGE +GORGEOUS +GORGEOUSLY +GORGES +GORGING +GORHAM +GORILLA +GORILLAS +GORKY +GORTON +GORY +GOSH +GOSPEL +GOSPELERS +GOSPELS +GOSSIP +GOSSIPED +GOSSIPING +GOSSIPS +GOT +GOTHAM +GOTHIC +GOTHICALLY +GOTHICISM +GOTHICIZE +GOTHICIZED +GOTHICIZER +GOTHICIZERS +GOTHICIZES +GOTHICIZING +GOTO +GOTOS +GOTTEN +GOTTFRIED +GOUCHER +GOUDA +GOUGE +GOUGED +GOUGES +GOUGING +GOULD +GOURD +GOURMET +GOUT +GOVERN +GOVERNANCE +GOVERNED +GOVERNESS +GOVERNING +GOVERNMENT +GOVERNMENTAL +GOVERNMENTALLY +GOVERNMENTS +GOVERNOR +GOVERNORS +GOVERNS +GOWN +GOWNED +GOWNS +GRAB +GRABBED +GRABBER +GRABBERS +GRABBING +GRABBINGS +GRABS +GRACE +GRACED +GRACEFUL +GRACEFULLY +GRACEFULNESS +GRACES +GRACIE +GRACING +GRACIOUS +GRACIOUSLY +GRACIOUSNESS +GRAD +GRADATION +GRADATIONS +GRADE +GRADED +GRADER +GRADERS +GRADES +GRADIENT +GRADIENTS +GRADING +GRADINGS +GRADUAL +GRADUALLY +GRADUATE +GRADUATED +GRADUATES +GRADUATING +GRADUATION +GRADUATIONS +GRADY +GRAFF +GRAFT +GRAFTED +GRAFTER +GRAFTING +GRAFTON +GRAFTS +GRAHAM +GRAHAMS +GRAIL +GRAIN +GRAINED +GRAINING +GRAINS +GRAM +GRAMMAR +GRAMMARIAN +GRAMMARS +GRAMMATIC +GRAMMATICAL +GRAMMATICALLY +GRAMS +GRANARIES +GRANARY +GRAND +GRANDCHILD +GRANDCHILDREN +GRANDDAUGHTER +GRANDER +GRANDEST +GRANDEUR +GRANDFATHER +GRANDFATHERS +GRANDIOSE +GRANDLY +GRANDMA +GRANDMOTHER +GRANDMOTHERS +GRANDNEPHEW +GRANDNESS +GRANDNIECE +GRANDPA +GRANDPARENT +GRANDS +GRANDSON +GRANDSONS +GRANDSTAND +GRANGE +GRANITE +GRANNY +GRANOLA +GRANT +GRANTED +GRANTEE +GRANTER +GRANTING +GRANTOR +GRANTS +GRANULARITY +GRANULATE +GRANULATED +GRANULATES +GRANULATING +GRANVILLE +GRAPE +GRAPEFRUIT +GRAPES +GRAPEVINE +GRAPH +GRAPHED +GRAPHIC +GRAPHICAL +GRAPHICALLY +GRAPHICS +GRAPHING +GRAPHITE +GRAPHS +GRAPPLE +GRAPPLED +GRAPPLING +GRASP +GRASPABLE +GRASPED +GRASPING +GRASPINGLY +GRASPS +GRASS +GRASSED +GRASSERS +GRASSES +GRASSIER +GRASSIEST +GRASSLAND +GRASSY +GRATE +GRATED +GRATEFUL +GRATEFULLY +GRATEFULNESS +GRATER +GRATES +GRATIFICATION +GRATIFIED +GRATIFY +GRATIFYING +GRATING +GRATINGS +GRATIS +GRATITUDE +GRATUITIES +GRATUITOUS +GRATUITOUSLY +GRATUITOUSNESS +GRATUITY +GRAVE +GRAVEL +GRAVELLY +GRAVELY +GRAVEN +GRAVENESS +GRAVER +GRAVES +GRAVEST +GRAVESTONE +GRAVEYARD +GRAVITATE +GRAVITATION +GRAVITATIONAL +GRAVITY +GRAVY +GRAY +GRAYED +GRAYER +GRAYEST +GRAYING +GRAYNESS +GRAYSON +GRAZE +GRAZED +GRAZER +GRAZING +GREASE +GREASED +GREASES +GREASY +GREAT +GREATER +GREATEST +GREATLY +GREATNESS +GRECIAN +GRECIANIZE +GRECIANIZES +GREECE +GREED +GREEDILY +GREEDINESS +GREEDY +GREEK +GREEKIZE +GREEKIZES +GREEKS +GREEN +GREENBELT +GREENBERG +GREENBLATT +GREENBRIAR +GREENE +GREENER +GREENERY +GREENEST +GREENFELD +GREENFIELD +GREENGROCER +GREENHOUSE +GREENHOUSES +GREENING +GREENISH +GREENLAND +GREENLY +GREENNESS +GREENS +GREENSBORO +GREENSVILLE +GREENTREE +GREENVILLE +GREENWARE +GREENWICH +GREER +GREET +GREETED +GREETER +GREETING +GREETINGS +GREETS +GREG +GREGARIOUS +GREGG +GREGORIAN +GREGORY +GRENADE +GRENADES +GRENDEL +GRENIER +GRENOBLE +GRENVILLE +GRESHAM +GRETA +GRETCHEN +GREW +GREY +GREYEST +GREYHOUND +GREYING +GRID +GRIDDLE +GRIDIRON +GRIDS +GRIEF +GRIEFS +GRIEVANCE +GRIEVANCES +GRIEVE +GRIEVED +GRIEVER +GRIEVERS +GRIEVES +GRIEVING +GRIEVINGLY +GRIEVOUS +GRIEVOUSLY +GRIFFITH +GRILL +GRILLED +GRILLING +GRILLS +GRIM +GRIMACE +GRIMALDI +GRIME +GRIMED +GRIMES +GRIMLY +GRIMM +GRIMNESS +GRIN +GRIND +GRINDER +GRINDERS +GRINDING +GRINDINGS +GRINDS +GRINDSTONE +GRINDSTONES +GRINNING +GRINS +GRIP +GRIPE +GRIPED +GRIPES +GRIPING +GRIPPED +GRIPPING +GRIPPINGLY +GRIPS +GRIS +GRISLY +GRIST +GRISWOLD +GRIT +GRITS +GRITTY +GRIZZLY +GROAN +GROANED +GROANER +GROANERS +GROANING +GROANS +GROCER +GROCERIES +GROCERS +GROCERY +GROGGY +GROIN +GROOM +GROOMED +GROOMING +GROOMS +GROOT +GROOVE +GROOVED +GROOVES +GROPE +GROPED +GROPES +GROPING +GROSS +GROSSED +GROSSER +GROSSES +GROSSEST +GROSSET +GROSSING +GROSSLY +GROSSMAN +GROSSNESS +GROSVENOR +GROTESQUE +GROTESQUELY +GROTESQUES +GROTON +GROTTO +GROTTOS +GROUND +GROUNDED +GROUNDER +GROUNDERS +GROUNDING +GROUNDS +GROUNDWORK +GROUP +GROUPED +GROUPING +GROUPINGS +GROUPS +GROUSE +GROVE +GROVEL +GROVELED +GROVELING +GROVELS +GROVER +GROVERS +GROVES +GROW +GROWER +GROWERS +GROWING +GROWL +GROWLED +GROWLING +GROWLS +GROWN +GROWNUP +GROWNUPS +GROWS +GROWTH +GROWTHS +GRUB +GRUBBY +GRUBS +GRUDGE +GRUDGES +GRUDGINGLY +GRUESOME +GRUFF +GRUFFLY +GRUMBLE +GRUMBLED +GRUMBLES +GRUMBLING +GRUMMAN +GRUNT +GRUNTED +GRUNTING +GRUNTS +GRUSKY +GRUYERE +GUADALUPE +GUAM +GUANO +GUARANTEE +GUARANTEED +GUARANTEEING +GUARANTEER +GUARANTEERS +GUARANTEES +GUARANTY +GUARD +GUARDED +GUARDEDLY +GUARDHOUSE +GUARDIA +GUARDIAN +GUARDIANS +GUARDIANSHIP +GUARDING +GUARDS +GUATEMALA +GUATEMALAN +GUBERNATORIAL +GUELPH +GUENTHER +GUERRILLA +GUERRILLAS +GUESS +GUESSED +GUESSES +GUESSING +GUESSWORK +GUEST +GUESTS +GUGGENHEIM +GUHLEMAN +GUIANA +GUIDANCE +GUIDE +GUIDEBOOK +GUIDEBOOKS +GUIDED +GUIDELINE +GUIDELINES +GUIDES +GUIDING +GUILD +GUILDER +GUILDERS +GUILE +GUILFORD +GUILT +GUILTIER +GUILTIEST +GUILTILY +GUILTINESS +GUILTLESS +GUILTLESSLY +GUILTY +GUINEA +GUINEVERE +GUISE +GUISES +GUITAR +GUITARS +GUJARAT +GUJARATI +GULCH +GULCHES +GULF +GULFS +GULL +GULLAH +GULLED +GULLIES +GULLING +GULLS +GULLY +GULP +GULPED +GULPS +GUM +GUMMING +GUMPTION +GUMS +GUN +GUNDERSON +GUNFIRE +GUNMAN +GUNMEN +GUNNAR +GUNNED +GUNNER +GUNNERS +GUNNERY +GUNNING +GUNNY +GUNPLAY +GUNPOWDER +GUNS +GUNSHOT +GUNTHER +GURGLE +GURKHA +GURU +GUS +GUSH +GUSHED +GUSHER +GUSHES +GUSHING +GUST +GUSTAFSON +GUSTAV +GUSTAVE +GUSTAVUS +GUSTO +GUSTS +GUSTY +GUT +GUTENBERG +GUTHRIE +GUTS +GUTSY +GUTTER +GUTTERED +GUTTERS +GUTTING +GUTTURAL +GUY +GUYANA +GUYED +GUYER +GUYERS +GUYING +GUYS +GWEN +GWYN +GYMNASIUM +GYMNASIUMS +GYMNAST +GYMNASTIC +GYMNASTICS +GYMNASTS +GYPSIES +GYPSY +GYRO +GYROCOMPASS +GYROSCOPE +GYROSCOPES +HAAG +HAAS +HABEAS +HABERMAN +HABIB +HABIT +HABITAT +HABITATION +HABITATIONS +HABITATS +HABITS +HABITUAL +HABITUALLY +HABITUALNESS +HACK +HACKED +HACKER +HACKERS +HACKETT +HACKING +HACKNEYED +HACKS +HACKSAW +HAD +HADAMARD +HADDAD +HADDOCK +HADES +HADLEY +HADRIAN +HAFIZ +HAG +HAGEN +HAGER +HAGGARD +HAGGARDLY +HAGGLE +HAGSTROM +HAGUE +HAHN +HAIFA +HAIL +HAILED +HAILING +HAILS +HAILSTONE +HAILSTORM +HAINES +HAIR +HAIRCUT +HAIRCUTS +HAIRIER +HAIRINESS +HAIRLESS +HAIRPIN +HAIRS +HAIRY +HAITI +HAITIAN +HAL +HALCYON +HALE +HALER +HALEY +HALF +HALFHEARTED +HALFWAY +HALIFAX +HALL +HALLEY +HALLINAN +HALLMARK +HALLMARKS +HALLOW +HALLOWED +HALLOWEEN +HALLS +HALLUCINATE +HALLWAY +HALLWAYS +HALOGEN +HALPERN +HALSEY +HALSTEAD +HALT +HALTED +HALTER +HALTERS +HALTING +HALTINGLY +HALTS +HALVE +HALVED +HALVERS +HALVERSON +HALVES +HALVING +HAM +HAMAL +HAMBURG +HAMBURGER +HAMBURGERS +HAMEY +HAMILTON +HAMILTONIAN +HAMILTONIANS +HAMLET +HAMLETS +HAMLIN +HAMMER +HAMMERED +HAMMERING +HAMMERS +HAMMETT +HAMMING +HAMMOCK +HAMMOCKS +HAMMOND +HAMPER +HAMPERED +HAMPERS +HAMPSHIRE +HAMPTON +HAMS +HAMSTER +HAN +HANCOCK +HAND +HANDBAG +HANDBAGS +HANDBOOK +HANDBOOKS +HANDCUFF +HANDCUFFED +HANDCUFFING +HANDCUFFS +HANDED +HANDEL +HANDFUL +HANDFULS +HANDGUN +HANDICAP +HANDICAPPED +HANDICAPS +HANDIER +HANDIEST +HANDILY +HANDINESS +HANDING +HANDIWORK +HANDKERCHIEF +HANDKERCHIEFS +HANDLE +HANDLED +HANDLER +HANDLERS +HANDLES +HANDLING +HANDMAID +HANDOUT +HANDS +HANDSHAKE +HANDSHAKES +HANDSHAKING +HANDSOME +HANDSOMELY +HANDSOMENESS +HANDSOMER +HANDSOMEST +HANDWRITING +HANDWRITTEN +HANDY +HANEY +HANFORD +HANG +HANGAR +HANGARS +HANGED +HANGER +HANGERS +HANGING +HANGMAN +HANGMEN +HANGOUT +HANGOVER +HANGOVERS +HANGS +HANKEL +HANLEY +HANLON +HANNA +HANNAH +HANNIBAL +HANOI +HANOVER +HANOVERIAN +HANOVERIANIZE +HANOVERIANIZES +HANOVERIZE +HANOVERIZES +HANS +HANSEL +HANSEN +HANSON +HANUKKAH +HAP +HAPGOOD +HAPHAZARD +HAPHAZARDLY +HAPHAZARDNESS +HAPLESS +HAPLESSLY +HAPLESSNESS +HAPLY +HAPPEN +HAPPENED +HAPPENING +HAPPENINGS +HAPPENS +HAPPIER +HAPPIEST +HAPPILY +HAPPINESS +HAPPY +HAPSBURG +HARASS +HARASSED +HARASSES +HARASSING +HARASSMENT +HARBIN +HARBINGER +HARBOR +HARBORED +HARBORING +HARBORS +HARCOURT +HARD +HARDBOILED +HARDCOPY +HARDEN +HARDER +HARDEST +HARDHAT +HARDIN +HARDINESS +HARDING +HARDLY +HARDNESS +HARDSCRABBLE +HARDSHIP +HARDSHIPS +HARDWARE +HARDWIRED +HARDWORKING +HARDY +HARE +HARELIP +HAREM +HARES +HARK +HARKEN +HARLAN +HARLEM +HARLEY +HARLOT +HARLOTS +HARM +HARMED +HARMFUL +HARMFULLY +HARMFULNESS +HARMING +HARMLESS +HARMLESSLY +HARMLESSNESS +HARMON +HARMONIC +HARMONICS +HARMONIES +HARMONIOUS +HARMONIOUSLY +HARMONIOUSNESS +HARMONIST +HARMONISTIC +HARMONISTICALLY +HARMONIZE +HARMONY +HARMS +HARNESS +HARNESSED +HARNESSING +HAROLD +HARP +HARPER +HARPERS +HARPING +HARPY +HARRIED +HARRIER +HARRIET +HARRIMAN +HARRINGTON +HARRIS +HARRISBURG +HARRISON +HARRISONBURG +HARROW +HARROWED +HARROWING +HARROWS +HARRY +HARSH +HARSHER +HARSHLY +HARSHNESS +HART +HARTFORD +HARTLEY +HARTMAN +HARVARD +HARVARDIZE +HARVARDIZES +HARVEST +HARVESTED +HARVESTER +HARVESTING +HARVESTS +HARVEY +HARVEYIZE +HARVEYIZES +HARVEYS +HAS +HASH +HASHED +HASHER +HASHES +HASHING +HASHISH +HASKELL +HASKINS +HASSLE +HASTE +HASTEN +HASTENED +HASTENING +HASTENS +HASTILY +HASTINESS +HASTINGS +HASTY +HAT +HATCH +HATCHED +HATCHET +HATCHETS +HATCHING +HATCHURE +HATE +HATED +HATEFUL +HATEFULLY +HATEFULNESS +HATER +HATES +HATFIELD +HATHAWAY +HATING +HATRED +HATS +HATTERAS +HATTIE +HATTIESBURG +HATTIZE +HATTIZES +HAUGEN +HAUGHTILY +HAUGHTINESS +HAUGHTY +HAUL +HAULED +HAULER +HAULING +HAULS +HAUNCH +HAUNCHES +HAUNT +HAUNTED +HAUNTER +HAUNTING +HAUNTS +HAUSA +HAUSDORFF +HAUSER +HAVANA +HAVE +HAVEN +HAVENS +HAVES +HAVILLAND +HAVING +HAVOC +HAWAII +HAWAIIAN +HAWK +HAWKED +HAWKER +HAWKERS +HAWKINS +HAWKS +HAWLEY +HAWTHORNE +HAY +HAYDEN +HAYDN +HAYES +HAYING +HAYNES +HAYS +HAYSTACK +HAYWARD +HAYWOOD +HAZARD +HAZARDOUS +HAZARDS +HAZE +HAZEL +HAZES +HAZINESS +HAZY +HEAD +HEADACHE +HEADACHES +HEADED +HEADER +HEADERS +HEADGEAR +HEADING +HEADINGS +HEADLAND +HEADLANDS +HEADLIGHT +HEADLINE +HEADLINED +HEADLINES +HEADLINING +HEADLONG +HEADMASTER +HEADPHONE +HEADQUARTERS +HEADROOM +HEADS +HEADSET +HEADWAY +HEAL +HEALED +HEALER +HEALERS +HEALEY +HEALING +HEALS +HEALTH +HEALTHFUL +HEALTHFULLY +HEALTHFULNESS +HEALTHIER +HEALTHIEST +HEALTHILY +HEALTHINESS +HEALTHY +HEALY +HEAP +HEAPED +HEAPING +HEAPS +HEAR +HEARD +HEARER +HEARERS +HEARING +HEARINGS +HEARKEN +HEARS +HEARSAY +HEARST +HEART +HEARTBEAT +HEARTBREAK +HEARTEN +HEARTIEST +HEARTILY +HEARTINESS +HEARTLESS +HEARTS +HEARTWOOD +HEARTY +HEAT +HEATABLE +HEATED +HEATEDLY +HEATER +HEATERS +HEATH +HEATHEN +HEATHER +HEATHKIT +HEATHMAN +HEATING +HEATS +HEAVE +HEAVED +HEAVEN +HEAVENLY +HEAVENS +HEAVER +HEAVERS +HEAVES +HEAVIER +HEAVIEST +HEAVILY +HEAVINESS +HEAVING +HEAVY +HEAVYWEIGHT +HEBE +HEBRAIC +HEBRAICIZE +HEBRAICIZES +HEBREW +HEBREWS +HEBRIDES +HECATE +HECK +HECKLE +HECKMAN +HECTIC +HECUBA +HEDDA +HEDGE +HEDGED +HEDGEHOG +HEDGEHOGS +HEDGES +HEDONISM +HEDONIST +HEED +HEEDED +HEEDLESS +HEEDLESSLY +HEEDLESSNESS +HEEDS +HEEL +HEELED +HEELERS +HEELING +HEELS +HEFTY +HEGEL +HEGELIAN +HEGELIANIZE +HEGELIANIZES +HEGEMONY +HEIDEGGER +HEIDELBERG +HEIFER +HEIGHT +HEIGHTEN +HEIGHTENED +HEIGHTENING +HEIGHTENS +HEIGHTS +HEINE +HEINLEIN +HEINOUS +HEINOUSLY +HEINRICH +HEINZ +HEINZE +HEIR +HEIRESS +HEIRESSES +HEIRS +HEISENBERG +HEISER +HELD +HELEN +HELENA +HELENE +HELGA +HELICAL +HELICOPTER +HELIOCENTRIC +HELIOPOLIS +HELIUM +HELIX +HELL +HELLENIC +HELLENIZATION +HELLENIZATIONS +HELLENIZE +HELLENIZED +HELLENIZES +HELLENIZING +HELLESPONT +HELLFIRE +HELLISH +HELLMAN +HELLO +HELLS +HELM +HELMET +HELMETS +HELMHOLTZ +HELMSMAN +HELMUT +HELP +HELPED +HELPER +HELPERS +HELPFUL +HELPFULLY +HELPFULNESS +HELPING +HELPLESS +HELPLESSLY +HELPLESSNESS +HELPMATE +HELPS +HELSINKI +HELVETICA +HEM +HEMINGWAY +HEMISPHERE +HEMISPHERES +HEMLOCK +HEMLOCKS +HEMOGLOBIN +HEMORRHOID +HEMOSTAT +HEMOSTATS +HEMP +HEMPEN +HEMPSTEAD +HEMS +HEN +HENCE +HENCEFORTH +HENCHMAN +HENCHMEN +HENDERSON +HENDRICK +HENDRICKS +HENDRICKSON +HENDRIX +HENLEY +HENNESSEY +HENNESSY +HENNING +HENPECK +HENRI +HENRIETTA +HENS +HEPATITIS +HEPBURN +HER +HERA +HERACLITUS +HERALD +HERALDED +HERALDING +HERALDS +HERB +HERBERT +HERBIVORE +HERBIVOROUS +HERBS +HERCULEAN +HERCULES +HERD +HERDED +HERDER +HERDING +HERDS +HERE +HEREABOUT +HEREABOUTS +HEREAFTER +HEREBY +HEREDITARY +HEREDITY +HEREFORD +HEREIN +HEREINAFTER +HEREOF +HERES +HERESY +HERETIC +HERETICS +HERETO +HERETOFORE +HEREUNDER +HEREWITH +HERITAGE +HERITAGES +HERKIMER +HERMAN +HERMANN +HERMES +HERMETIC +HERMETICALLY +HERMIT +HERMITE +HERMITIAN +HERMITS +HERMOSA +HERNANDEZ +HERO +HERODOTUS +HEROES +HEROIC +HEROICALLY +HEROICS +HEROIN +HEROINE +HEROINES +HEROISM +HERON +HERONS +HERPES +HERR +HERRING +HERRINGS +HERRINGTON +HERS +HERSCHEL +HERSELF +HERSEY +HERSHEL +HERSHEY +HERTZ +HERTZOG +HESITANT +HESITANTLY +HESITATE +HESITATED +HESITATES +HESITATING +HESITATINGLY +HESITATION +HESITATIONS +HESPERUS +HESS +HESSE +HESSIAN +HESSIANS +HESTER +HETEROGENEITY +HETEROGENEOUS +HETEROGENEOUSLY +HETEROGENEOUSNESS +HETEROGENOUS +HETEROSEXUAL +HETMAN +HETTIE +HETTY +HEUBLEIN +HEURISTIC +HEURISTICALLY +HEURISTICS +HEUSEN +HEUSER +HEW +HEWED +HEWER +HEWETT +HEWITT +HEWLETT +HEWS +HEX +HEXADECIMAL +HEXAGON +HEXAGONAL +HEXAGONALLY +HEXAGONS +HEY +HEYWOOD +HIATT +HIAWATHA +HIBBARD +HIBERNATE +HIBERNIA +HICK +HICKEY +HICKEYS +HICKMAN +HICKOK +HICKORY +HICKS +HID +HIDDEN +HIDE +HIDEOUS +HIDEOUSLY +HIDEOUSNESS +HIDEOUT +HIDEOUTS +HIDES +HIDING +HIERARCHAL +HIERARCHIC +HIERARCHICAL +HIERARCHICALLY +HIERARCHIES +HIERARCHY +HIERONYMUS +HIGGINS +HIGH +HIGHER +HIGHEST +HIGHFIELD +HIGHLAND +HIGHLANDER +HIGHLANDS +HIGHLIGHT +HIGHLIGHTED +HIGHLIGHTING +HIGHLIGHTS +HIGHLY +HIGHNESS +HIGHNESSES +HIGHWAY +HIGHWAYMAN +HIGHWAYMEN +HIGHWAYS +HIJACK +HIJACKED +HIKE +HIKED +HIKER +HIKES +HIKING +HILARIOUS +HILARIOUSLY +HILARITY +HILBERT +HILDEBRAND +HILL +HILLARY +HILLBILLY +HILLCREST +HILLEL +HILLOCK +HILLS +HILLSBORO +HILLSDALE +HILLSIDE +HILLSIDES +HILLTOP +HILLTOPS +HILT +HILTON +HILTS +HIM +HIMALAYA +HIMALAYAS +HIMMLER +HIMSELF +HIND +HINDER +HINDERED +HINDERING +HINDERS +HINDI +HINDRANCE +HINDRANCES +HINDSIGHT +HINDU +HINDUISM +HINDUS +HINDUSTAN +HINES +HINGE +HINGED +HINGES +HINKLE +HINMAN +HINSDALE +HINT +HINTED +HINTING +HINTS +HIP +HIPPO +HIPPOCRATES +HIPPOCRATIC +HIPPOPOTAMUS +HIPS +HIRAM +HIRE +HIRED +HIRER +HIRERS +HIRES +HIREY +HIRING +HIRINGS +HIROSHI +HIROSHIMA +HIRSCH +HIS +HISPANIC +HISPANICIZE +HISPANICIZES +HISPANICS +HISS +HISSED +HISSES +HISSING +HISTOGRAM +HISTOGRAMS +HISTORIAN +HISTORIANS +HISTORIC +HISTORICAL +HISTORICALLY +HISTORIES +HISTORY +HIT +HITACHI +HITCH +HITCHCOCK +HITCHED +HITCHHIKE +HITCHHIKED +HITCHHIKER +HITCHHIKERS +HITCHHIKES +HITCHHIKING +HITCHING +HITHER +HITHERTO +HITLER +HITLERIAN +HITLERISM +HITLERITE +HITLERITES +HITS +HITTER +HITTERS +HITTING +HIVE +HOAGLAND +HOAR +HOARD +HOARDER +HOARDING +HOARINESS +HOARSE +HOARSELY +HOARSENESS +HOARY +HOBART +HOBBES +HOBBIES +HOBBLE +HOBBLED +HOBBLES +HOBBLING +HOBBS +HOBBY +HOBBYHORSE +HOBBYIST +HOBBYISTS +HOBDAY +HOBOKEN +HOCKEY +HODGEPODGE +HODGES +HODGKIN +HOE +HOES +HOFF +HOFFMAN +HOG +HOGGING +HOGS +HOIST +HOISTED +HOISTING +HOISTS +HOKAN +HOLBROOK +HOLCOMB +HOLD +HOLDEN +HOLDER +HOLDERS +HOLDING +HOLDINGS +HOLDS +HOLE +HOLED +HOLES +HOLIDAY +HOLIDAYS +HOLIES +HOLINESS +HOLISTIC +HOLLAND +HOLLANDAISE +HOLLANDER +HOLLERITH +HOLLINGSWORTH +HOLLISTER +HOLLOW +HOLLOWAY +HOLLOWED +HOLLOWING +HOLLOWLY +HOLLOWNESS +HOLLOWS +HOLLY +HOLLYWOOD +HOLLYWOODIZE +HOLLYWOODIZES +HOLM +HOLMAN +HOLMDEL +HOLMES +HOLOCAUST +HOLOCENE +HOLOGRAM +HOLOGRAMS +HOLST +HOLSTEIN +HOLY +HOLYOKE +HOLZMAN +HOM +HOMAGE +HOME +HOMED +HOMELESS +HOMELY +HOMEMADE +HOMEMAKER +HOMEMAKERS +HOMEOMORPHIC +HOMEOMORPHISM +HOMEOMORPHISMS +HOMEOPATH +HOMEOWNER +HOMER +HOMERIC +HOMERS +HOMES +HOMESICK +HOMESICKNESS +HOMESPUN +HOMESTEAD +HOMESTEADER +HOMESTEADERS +HOMESTEADS +HOMEWARD +HOMEWARDS +HOMEWORK +HOMICIDAL +HOMICIDE +HOMING +HOMO +HOMOGENEITIES +HOMOGENEITY +HOMOGENEOUS +HOMOGENEOUSLY +HOMOGENEOUSNESS +HOMOMORPHIC +HOMOMORPHISM +HOMOMORPHISMS +HOMOSEXUAL +HONDA +HONDO +HONDURAS +HONE +HONED +HONER +HONES +HONEST +HONESTLY +HONESTY +HONEY +HONEYBEE +HONEYCOMB +HONEYCOMBED +HONEYDEW +HONEYMOON +HONEYMOONED +HONEYMOONER +HONEYMOONERS +HONEYMOONING +HONEYMOONS +HONEYSUCKLE +HONEYWELL +HONING +HONOLULU +HONOR +HONORABLE +HONORABLENESS +HONORABLY +HONORARIES +HONORARIUM +HONORARY +HONORED +HONORER +HONORING +HONORS +HONSHU +HOOD +HOODED +HOODLUM +HOODS +HOODWINK +HOODWINKED +HOODWINKING +HOODWINKS +HOOF +HOOFS +HOOK +HOOKED +HOOKER +HOOKERS +HOOKING +HOOKS +HOOKUP +HOOKUPS +HOOP +HOOPER +HOOPS +HOOSIER +HOOSIERIZE +HOOSIERIZES +HOOT +HOOTED +HOOTER +HOOTING +HOOTS +HOOVER +HOOVERIZE +HOOVERIZES +HOOVES +HOP +HOPE +HOPED +HOPEFUL +HOPEFULLY +HOPEFULNESS +HOPEFULS +HOPELESS +HOPELESSLY +HOPELESSNESS +HOPES +HOPI +HOPING +HOPKINS +HOPKINSIAN +HOPPER +HOPPERS +HOPPING +HOPS +HORACE +HORATIO +HORDE +HORDES +HORIZON +HORIZONS +HORIZONTAL +HORIZONTALLY +HORMONE +HORMONES +HORN +HORNBLOWER +HORNED +HORNET +HORNETS +HORNS +HORNY +HOROWITZ +HORRENDOUS +HORRENDOUSLY +HORRIBLE +HORRIBLENESS +HORRIBLY +HORRID +HORRIDLY +HORRIFIED +HORRIFIES +HORRIFY +HORRIFYING +HORROR +HORRORS +HORSE +HORSEBACK +HORSEFLESH +HORSEFLY +HORSEMAN +HORSEPLAY +HORSEPOWER +HORSES +HORSESHOE +HORSESHOER +HORTICULTURE +HORTON +HORUS +HOSE +HOSES +HOSPITABLE +HOSPITABLY +HOSPITAL +HOSPITALITY +HOSPITALIZE +HOSPITALIZED +HOSPITALIZES +HOSPITALIZING +HOSPITALS +HOST +HOSTAGE +HOSTAGES +HOSTED +HOSTESS +HOSTESSES +HOSTILE +HOSTILELY +HOSTILITIES +HOSTILITY +HOSTING +HOSTS +HOT +HOTEL +HOTELS +HOTLY +HOTNESS +HOTTENTOT +HOTTER +HOTTEST +HOUDAILLE +HOUDINI +HOUGHTON +HOUND +HOUNDED +HOUNDING +HOUNDS +HOUR +HOURGLASS +HOURLY +HOURS +HOUSE +HOUSEBOAT +HOUSEBROKEN +HOUSED +HOUSEFLIES +HOUSEFLY +HOUSEHOLD +HOUSEHOLDER +HOUSEHOLDERS +HOUSEHOLDS +HOUSEKEEPER +HOUSEKEEPERS +HOUSEKEEPING +HOUSES +HOUSETOP +HOUSETOPS +HOUSEWIFE +HOUSEWIFELY +HOUSEWIVES +HOUSEWORK +HOUSING +HOUSTON +HOVEL +HOVELS +HOVER +HOVERED +HOVERING +HOVERS +HOW +HOWARD +HOWE +HOWELL +HOWEVER +HOWL +HOWLED +HOWLER +HOWLING +HOWLS +HOYT +HROTHGAR +HUB +HUBBARD +HUBBELL +HUBER +HUBERT +HUBRIS +HUBS +HUCK +HUDDLE +HUDDLED +HUDDLING +HUDSON +HUE +HUES +HUEY +HUFFMAN +HUG +HUGE +HUGELY +HUGENESS +HUGGING +HUGGINS +HUGH +HUGHES +HUGO +HUH +HULL +HULLS +HUM +HUMAN +HUMANE +HUMANELY +HUMANENESS +HUMANITARIAN +HUMANITIES +HUMANITY +HUMANLY +HUMANNESS +HUMANS +HUMBLE +HUMBLED +HUMBLENESS +HUMBLER +HUMBLEST +HUMBLING +HUMBLY +HUMBOLDT +HUMBUG +HUME +HUMERUS +HUMID +HUMIDIFICATION +HUMIDIFIED +HUMIDIFIER +HUMIDIFIERS +HUMIDIFIES +HUMIDIFY +HUMIDIFYING +HUMIDITY +HUMIDLY +HUMILIATE +HUMILIATED +HUMILIATES +HUMILIATING +HUMILIATION +HUMILIATIONS +HUMILITY +HUMMED +HUMMEL +HUMMING +HUMMINGBIRD +HUMOR +HUMORED +HUMORER +HUMORERS +HUMORING +HUMOROUS +HUMOROUSLY +HUMOROUSNESS +HUMORS +HUMP +HUMPBACK +HUMPED +HUMPHREY +HUMPTY +HUMS +HUN +HUNCH +HUNCHED +HUNCHES +HUNDRED +HUNDREDFOLD +HUNDREDS +HUNDREDTH +HUNG +HUNGARIAN +HUNGARY +HUNGER +HUNGERED +HUNGERING +HUNGERS +HUNGRIER +HUNGRIEST +HUNGRILY +HUNGRY +HUNK +HUNKS +HUNS +HUNT +HUNTED +HUNTER +HUNTERS +HUNTING +HUNTINGTON +HUNTLEY +HUNTS +HUNTSMAN +HUNTSVILLE +HURD +HURDLE +HURL +HURLED +HURLER +HURLERS +HURLING +HURON +HURONS +HURRAH +HURRICANE +HURRICANES +HURRIED +HURRIEDLY +HURRIES +HURRY +HURRYING +HURST +HURT +HURTING +HURTLE +HURTLING +HURTS +HURWITZ +HUSBAND +HUSBANDRY +HUSBANDS +HUSH +HUSHED +HUSHES +HUSHING +HUSK +HUSKED +HUSKER +HUSKINESS +HUSKING +HUSKS +HUSKY +HUSTLE +HUSTLED +HUSTLER +HUSTLES +HUSTLING +HUSTON +HUT +HUTCH +HUTCHINS +HUTCHINSON +HUTCHISON +HUTS +HUXLEY +HUXTABLE +HYACINTH +HYADES +HYANNIS +HYBRID +HYDE +HYDRA +HYDRANT +HYDRAULIC +HYDRO +HYDRODYNAMIC +HYDRODYNAMICS +HYDROGEN +HYDROGENS +HYENA +HYGIENE +HYMAN +HYMEN +HYMN +HYMNS +HYPER +HYPERBOLA +HYPERBOLIC +HYPERTEXT +HYPHEN +HYPHENATE +HYPHENS +HYPNOSIS +HYPNOTIC +HYPOCRISIES +HYPOCRISY +HYPOCRITE +HYPOCRITES +HYPODERMIC +HYPODERMICS +HYPOTHESES +HYPOTHESIS +HYPOTHESIZE +HYPOTHESIZED +HYPOTHESIZER +HYPOTHESIZES +HYPOTHESIZING +HYPOTHETICAL +HYPOTHETICALLY +HYSTERESIS +HYSTERICAL +HYSTERICALLY +IAN +IBERIA +IBERIAN +IBEX +IBID +IBIS +IBN +IBSEN +ICARUS +ICE +ICEBERG +ICEBERGS +ICEBOX +ICED +ICELAND +ICELANDIC +ICES +ICICLE +ICINESS +ICING +ICINGS +ICON +ICONOCLASM +ICONOCLAST +ICONS +ICOSAHEDRA +ICOSAHEDRAL +ICOSAHEDRON +ICY +IDA +IDAHO +IDEA +IDEAL +IDEALISM +IDEALISTIC +IDEALIZATION +IDEALIZATIONS +IDEALIZE +IDEALIZED +IDEALIZES +IDEALIZING +IDEALLY +IDEALS +IDEAS +IDEM +IDEMPOTENCY +IDEMPOTENT +IDENTICAL +IDENTICALLY +IDENTIFIABLE +IDENTIFIABLY +IDENTIFICATION +IDENTIFICATIONS +IDENTIFIED +IDENTIFIER +IDENTIFIERS +IDENTIFIES +IDENTIFY +IDENTIFYING +IDENTITIES +IDENTITY +IDEOLOGICAL +IDEOLOGICALLY +IDEOLOGY +IDIOCY +IDIOM +IDIOSYNCRASIES +IDIOSYNCRASY +IDIOSYNCRATIC +IDIOT +IDIOTIC +IDIOTS +IDLE +IDLED +IDLENESS +IDLER +IDLERS +IDLES +IDLEST +IDLING +IDLY +IDOL +IDOLATRY +IDOLS +IFNI +IGLOO +IGNITE +IGNITION +IGNOBLE +IGNOMINIOUS +IGNORAMUS +IGNORANCE +IGNORANT +IGNORANTLY +IGNORE +IGNORED +IGNORES +IGNORING +IGOR +IKE +ILIAD +ILIADIZE +ILIADIZES +ILL +ILLEGAL +ILLEGALITIES +ILLEGALITY +ILLEGALLY +ILLEGITIMATE +ILLICIT +ILLICITLY +ILLINOIS +ILLITERACY +ILLITERATE +ILLNESS +ILLNESSES +ILLOGICAL +ILLOGICALLY +ILLS +ILLUMINATE +ILLUMINATED +ILLUMINATES +ILLUMINATING +ILLUMINATION +ILLUMINATIONS +ILLUSION +ILLUSIONS +ILLUSIVE +ILLUSIVELY +ILLUSORY +ILLUSTRATE +ILLUSTRATED +ILLUSTRATES +ILLUSTRATING +ILLUSTRATION +ILLUSTRATIONS +ILLUSTRATIVE +ILLUSTRATIVELY +ILLUSTRATOR +ILLUSTRATORS +ILLUSTRIOUS +ILLUSTRIOUSNESS +ILLY +ILONA +ILYUSHIN +IMAGE +IMAGEN +IMAGERY +IMAGES +IMAGINABLE +IMAGINABLY +IMAGINARY +IMAGINATION +IMAGINATIONS +IMAGINATIVE +IMAGINATIVELY +IMAGINE +IMAGINED +IMAGINES +IMAGING +IMAGINING +IMAGININGS +IMBALANCE +IMBALANCES +IMBECILE +IMBIBE +IMBRIUM +IMITATE +IMITATED +IMITATES +IMITATING +IMITATION +IMITATIONS +IMITATIVE +IMMACULATE +IMMACULATELY +IMMATERIAL +IMMATERIALLY +IMMATURE +IMMATURITY +IMMEDIACIES +IMMEDIACY +IMMEDIATE +IMMEDIATELY +IMMEMORIAL +IMMENSE +IMMENSELY +IMMERSE +IMMERSED +IMMERSES +IMMERSION +IMMIGRANT +IMMIGRANTS +IMMIGRATE +IMMIGRATED +IMMIGRATES +IMMIGRATING +IMMIGRATION +IMMINENT +IMMINENTLY +IMMODERATE +IMMODEST +IMMORAL +IMMORTAL +IMMORTALITY +IMMORTALLY +IMMOVABILITY +IMMOVABLE +IMMOVABLY +IMMUNE +IMMUNITIES +IMMUNITY +IMMUNIZATION +IMMUTABLE +IMP +IMPACT +IMPACTED +IMPACTING +IMPACTION +IMPACTOR +IMPACTORS +IMPACTS +IMPAIR +IMPAIRED +IMPAIRING +IMPAIRS +IMPALE +IMPART +IMPARTED +IMPARTIAL +IMPARTIALLY +IMPARTS +IMPASSE +IMPASSIVE +IMPATIENCE +IMPATIENT +IMPATIENTLY +IMPEACH +IMPEACHABLE +IMPEACHED +IMPEACHMENT +IMPECCABLE +IMPEDANCE +IMPEDANCES +IMPEDE +IMPEDED +IMPEDES +IMPEDIMENT +IMPEDIMENTS +IMPEDING +IMPEL +IMPELLED +IMPELLING +IMPEND +IMPENDING +IMPENETRABILITY +IMPENETRABLE +IMPENETRABLY +IMPERATIVE +IMPERATIVELY +IMPERATIVES +IMPERCEIVABLE +IMPERCEPTIBLE +IMPERFECT +IMPERFECTION +IMPERFECTIONS +IMPERFECTLY +IMPERIAL +IMPERIALISM +IMPERIALIST +IMPERIALISTS +IMPERIL +IMPERILED +IMPERIOUS +IMPERIOUSLY +IMPERMANENCE +IMPERMANENT +IMPERMEABLE +IMPERMISSIBLE +IMPERSONAL +IMPERSONALLY +IMPERSONATE +IMPERSONATED +IMPERSONATES +IMPERSONATING +IMPERSONATION +IMPERSONATIONS +IMPERTINENT +IMPERTINENTLY +IMPERVIOUS +IMPERVIOUSLY +IMPETUOUS +IMPETUOUSLY +IMPETUS +IMPINGE +IMPINGED +IMPINGES +IMPINGING +IMPIOUS +IMPLACABLE +IMPLANT +IMPLANTED +IMPLANTING +IMPLANTS +IMPLAUSIBLE +IMPLEMENT +IMPLEMENTABLE +IMPLEMENTATION +IMPLEMENTATIONS +IMPLEMENTED +IMPLEMENTER +IMPLEMENTING +IMPLEMENTOR +IMPLEMENTORS +IMPLEMENTS +IMPLICANT +IMPLICANTS +IMPLICATE +IMPLICATED +IMPLICATES +IMPLICATING +IMPLICATION +IMPLICATIONS +IMPLICIT +IMPLICITLY +IMPLICITNESS +IMPLIED +IMPLIES +IMPLORE +IMPLORED +IMPLORING +IMPLY +IMPLYING +IMPOLITE +IMPORT +IMPORTANCE +IMPORTANT +IMPORTANTLY +IMPORTATION +IMPORTED +IMPORTER +IMPORTERS +IMPORTING +IMPORTS +IMPOSE +IMPOSED +IMPOSES +IMPOSING +IMPOSITION +IMPOSITIONS +IMPOSSIBILITIES +IMPOSSIBILITY +IMPOSSIBLE +IMPOSSIBLY +IMPOSTOR +IMPOSTORS +IMPOTENCE +IMPOTENCY +IMPOTENT +IMPOUND +IMPOVERISH +IMPOVERISHED +IMPOVERISHMENT +IMPRACTICABLE +IMPRACTICAL +IMPRACTICALITY +IMPRACTICALLY +IMPRECISE +IMPRECISELY +IMPRECISION +IMPREGNABLE +IMPREGNATE +IMPRESS +IMPRESSED +IMPRESSER +IMPRESSES +IMPRESSIBLE +IMPRESSING +IMPRESSION +IMPRESSIONABLE +IMPRESSIONIST +IMPRESSIONISTIC +IMPRESSIONS +IMPRESSIVE +IMPRESSIVELY +IMPRESSIVENESS +IMPRESSMENT +IMPRIMATUR +IMPRINT +IMPRINTED +IMPRINTING +IMPRINTS +IMPRISON +IMPRISONED +IMPRISONING +IMPRISONMENT +IMPRISONMENTS +IMPRISONS +IMPROBABILITY +IMPROBABLE +IMPROMPTU +IMPROPER +IMPROPERLY +IMPROPRIETY +IMPROVE +IMPROVED +IMPROVEMENT +IMPROVEMENTS +IMPROVES +IMPROVING +IMPROVISATION +IMPROVISATIONAL +IMPROVISATIONS +IMPROVISE +IMPROVISED +IMPROVISER +IMPROVISERS +IMPROVISES +IMPROVISING +IMPRUDENT +IMPS +IMPUDENT +IMPUDENTLY +IMPUGN +IMPULSE +IMPULSES +IMPULSION +IMPULSIVE +IMPUNITY +IMPURE +IMPURITIES +IMPURITY +IMPUTE +IMPUTED +INABILITY +INACCESSIBLE +INACCURACIES +INACCURACY +INACCURATE +INACTION +INACTIVATE +INACTIVE +INACTIVITY +INADEQUACIES +INADEQUACY +INADEQUATE +INADEQUATELY +INADEQUATENESS +INADMISSIBILITY +INADMISSIBLE +INADVERTENT +INADVERTENTLY +INADVISABLE +INALIENABLE +INALTERABLE +INANE +INANIMATE +INANIMATELY +INANNA +INAPPLICABLE +INAPPROACHABLE +INAPPROPRIATE +INAPPROPRIATENESS +INASMUCH +INATTENTION +INAUDIBLE +INAUGURAL +INAUGURATE +INAUGURATED +INAUGURATING +INAUGURATION +INAUSPICIOUS +INBOARD +INBOUND +INBREED +INCA +INCALCULABLE +INCANDESCENT +INCANTATION +INCAPABLE +INCAPACITATE +INCAPACITATING +INCARCERATE +INCARNATION +INCARNATIONS +INCAS +INCENDIARIES +INCENDIARY +INCENSE +INCENSED +INCENSES +INCENTIVE +INCENTIVES +INCEPTION +INCESSANT +INCESSANTLY +INCEST +INCESTUOUS +INCH +INCHED +INCHES +INCHING +INCIDENCE +INCIDENT +INCIDENTAL +INCIDENTALLY +INCIDENTALS +INCIDENTS +INCINERATE +INCIPIENT +INCISIVE +INCITE +INCITED +INCITEMENT +INCITES +INCITING +INCLEMENT +INCLINATION +INCLINATIONS +INCLINE +INCLINED +INCLINES +INCLINING +INCLOSE +INCLOSED +INCLOSES +INCLOSING +INCLUDE +INCLUDED +INCLUDES +INCLUDING +INCLUSION +INCLUSIONS +INCLUSIVE +INCLUSIVELY +INCLUSIVENESS +INCOHERENCE +INCOHERENT +INCOHERENTLY +INCOME +INCOMES +INCOMING +INCOMMENSURABLE +INCOMMENSURATE +INCOMMUNICABLE +INCOMPARABLE +INCOMPARABLY +INCOMPATIBILITIES +INCOMPATIBILITY +INCOMPATIBLE +INCOMPATIBLY +INCOMPETENCE +INCOMPETENT +INCOMPETENTS +INCOMPLETE +INCOMPLETELY +INCOMPLETENESS +INCOMPREHENSIBILITY +INCOMPREHENSIBLE +INCOMPREHENSIBLY +INCOMPREHENSION +INCOMPRESSIBLE +INCOMPUTABLE +INCONCEIVABLE +INCONCLUSIVE +INCONGRUITY +INCONGRUOUS +INCONSEQUENTIAL +INCONSEQUENTIALLY +INCONSIDERABLE +INCONSIDERATE +INCONSIDERATELY +INCONSIDERATENESS +INCONSISTENCIES +INCONSISTENCY +INCONSISTENT +INCONSISTENTLY +INCONSPICUOUS +INCONTESTABLE +INCONTROVERTIBLE +INCONTROVERTIBLY +INCONVENIENCE +INCONVENIENCED +INCONVENIENCES +INCONVENIENCING +INCONVENIENT +INCONVENIENTLY +INCONVERTIBLE +INCORPORATE +INCORPORATED +INCORPORATES +INCORPORATING +INCORPORATION +INCORRECT +INCORRECTLY +INCORRECTNESS +INCORRIGIBLE +INCREASE +INCREASED +INCREASES +INCREASING +INCREASINGLY +INCREDIBLE +INCREDIBLY +INCREDULITY +INCREDULOUS +INCREDULOUSLY +INCREMENT +INCREMENTAL +INCREMENTALLY +INCREMENTED +INCREMENTER +INCREMENTING +INCREMENTS +INCRIMINATE +INCUBATE +INCUBATED +INCUBATES +INCUBATING +INCUBATION +INCUBATOR +INCUBATORS +INCULCATE +INCUMBENT +INCUR +INCURABLE +INCURRED +INCURRING +INCURS +INCURSION +INDEBTED +INDEBTEDNESS +INDECENT +INDECIPHERABLE +INDECISION +INDECISIVE +INDEED +INDEFATIGABLE +INDEFENSIBLE +INDEFINITE +INDEFINITELY +INDEFINITENESS +INDELIBLE +INDEMNIFY +INDEMNITY +INDENT +INDENTATION +INDENTATIONS +INDENTED +INDENTING +INDENTS +INDENTURE +INDEPENDENCE +INDEPENDENT +INDEPENDENTLY +INDESCRIBABLE +INDESTRUCTIBLE +INDETERMINACIES +INDETERMINACY +INDETERMINATE +INDETERMINATELY +INDEX +INDEXABLE +INDEXED +INDEXES +INDEXING +INDIA +INDIAN +INDIANA +INDIANAPOLIS +INDIANS +INDICATE +INDICATED +INDICATES +INDICATING +INDICATION +INDICATIONS +INDICATIVE +INDICATOR +INDICATORS +INDICES +INDICT +INDICTMENT +INDICTMENTS +INDIES +INDIFFERENCE +INDIFFERENT +INDIFFERENTLY +INDIGENOUS +INDIGENOUSLY +INDIGENOUSNESS +INDIGESTIBLE +INDIGESTION +INDIGNANT +INDIGNANTLY +INDIGNATION +INDIGNITIES +INDIGNITY +INDIGO +INDIRA +INDIRECT +INDIRECTED +INDIRECTING +INDIRECTION +INDIRECTIONS +INDIRECTLY +INDIRECTS +INDISCREET +INDISCRETION +INDISCRIMINATE +INDISCRIMINATELY +INDISPENSABILITY +INDISPENSABLE +INDISPENSABLY +INDISPUTABLE +INDISTINCT +INDISTINGUISHABLE +INDIVIDUAL +INDIVIDUALISM +INDIVIDUALISTIC +INDIVIDUALITY +INDIVIDUALIZE +INDIVIDUALIZED +INDIVIDUALIZES +INDIVIDUALIZING +INDIVIDUALLY +INDIVIDUALS +INDIVISIBILITY +INDIVISIBLE +INDO +INDOCHINA +INDOCHINESE +INDOCTRINATE +INDOCTRINATED +INDOCTRINATES +INDOCTRINATING +INDOCTRINATION +INDOEUROPEAN +INDOLENT +INDOLENTLY +INDOMITABLE +INDONESIA +INDONESIAN +INDOOR +INDOORS +INDUBITABLE +INDUCE +INDUCED +INDUCEMENT +INDUCEMENTS +INDUCER +INDUCES +INDUCING +INDUCT +INDUCTANCE +INDUCTANCES +INDUCTED +INDUCTEE +INDUCTING +INDUCTION +INDUCTIONS +INDUCTIVE +INDUCTIVELY +INDUCTOR +INDUCTORS +INDUCTS +INDULGE +INDULGED +INDULGENCE +INDULGENCES +INDULGENT +INDULGING +INDUS +INDUSTRIAL +INDUSTRIALISM +INDUSTRIALIST +INDUSTRIALISTS +INDUSTRIALIZATION +INDUSTRIALIZED +INDUSTRIALLY +INDUSTRIALS +INDUSTRIES +INDUSTRIOUS +INDUSTRIOUSLY +INDUSTRIOUSNESS +INDUSTRY +INDY +INEFFECTIVE +INEFFECTIVELY +INEFFECTIVENESS +INEFFECTUAL +INEFFICIENCIES +INEFFICIENCY +INEFFICIENT +INEFFICIENTLY +INELEGANT +INELIGIBLE +INEPT +INEQUALITIES +INEQUALITY +INEQUITABLE +INEQUITY +INERT +INERTIA +INERTIAL +INERTLY +INERTNESS +INESCAPABLE +INESCAPABLY +INESSENTIAL +INESTIMABLE +INEVITABILITIES +INEVITABILITY +INEVITABLE +INEVITABLY +INEXACT +INEXCUSABLE +INEXCUSABLY +INEXHAUSTIBLE +INEXORABLE +INEXORABLY +INEXPENSIVE +INEXPENSIVELY +INEXPERIENCE +INEXPERIENCED +INEXPLICABLE +INFALLIBILITY +INFALLIBLE +INFALLIBLY +INFAMOUS +INFAMOUSLY +INFAMY +INFANCY +INFANT +INFANTILE +INFANTRY +INFANTRYMAN +INFANTRYMEN +INFANTS +INFARCT +INFATUATE +INFEASIBLE +INFECT +INFECTED +INFECTING +INFECTION +INFECTIONS +INFECTIOUS +INFECTIOUSLY +INFECTIVE +INFECTS +INFER +INFERENCE +INFERENCES +INFERENTIAL +INFERIOR +INFERIORITY +INFERIORS +INFERNAL +INFERNALLY +INFERNO +INFERNOS +INFERRED +INFERRING +INFERS +INFERTILE +INFEST +INFESTED +INFESTING +INFESTS +INFIDEL +INFIDELITY +INFIDELS +INFIGHTING +INFILTRATE +INFINITE +INFINITELY +INFINITENESS +INFINITESIMAL +INFINITIVE +INFINITIVES +INFINITUDE +INFINITUM +INFINITY +INFIRM +INFIRMARY +INFIRMITY +INFIX +INFLAME +INFLAMED +INFLAMMABLE +INFLAMMATION +INFLAMMATORY +INFLATABLE +INFLATE +INFLATED +INFLATER +INFLATES +INFLATING +INFLATION +INFLATIONARY +INFLEXIBILITY +INFLEXIBLE +INFLICT +INFLICTED +INFLICTING +INFLICTS +INFLOW +INFLUENCE +INFLUENCED +INFLUENCES +INFLUENCING +INFLUENTIAL +INFLUENTIALLY +INFLUENZA +INFORM +INFORMAL +INFORMALITY +INFORMALLY +INFORMANT +INFORMANTS +INFORMATICA +INFORMATION +INFORMATIONAL +INFORMATIVE +INFORMATIVELY +INFORMED +INFORMER +INFORMERS +INFORMING +INFORMS +INFRA +INFRARED +INFRASTRUCTURE +INFREQUENT +INFREQUENTLY +INFRINGE +INFRINGED +INFRINGEMENT +INFRINGEMENTS +INFRINGES +INFRINGING +INFURIATE +INFURIATED +INFURIATES +INFURIATING +INFURIATION +INFUSE +INFUSED +INFUSES +INFUSING +INFUSION +INFUSIONS +INGENIOUS +INGENIOUSLY +INGENIOUSNESS +INGENUITY +INGENUOUS +INGERSOLL +INGEST +INGESTION +INGLORIOUS +INGOT +INGRAM +INGRATE +INGRATIATE +INGRATITUDE +INGREDIENT +INGREDIENTS +INGROWN +INHABIT +INHABITABLE +INHABITANCE +INHABITANT +INHABITANTS +INHABITED +INHABITING +INHABITS +INHALE +INHALED +INHALER +INHALES +INHALING +INHERE +INHERENT +INHERENTLY +INHERES +INHERIT +INHERITABLE +INHERITANCE +INHERITANCES +INHERITED +INHERITING +INHERITOR +INHERITORS +INHERITRESS +INHERITRESSES +INHERITRICES +INHERITRIX +INHERITS +INHIBIT +INHIBITED +INHIBITING +INHIBITION +INHIBITIONS +INHIBITOR +INHIBITORS +INHIBITORY +INHIBITS +INHOMOGENEITIES +INHOMOGENEITY +INHOMOGENEOUS +INHOSPITABLE +INHUMAN +INHUMANE +INIMICAL +INIMITABLE +INIQUITIES +INIQUITY +INITIAL +INITIALED +INITIALING +INITIALIZATION +INITIALIZATIONS +INITIALIZE +INITIALIZED +INITIALIZER +INITIALIZERS +INITIALIZES +INITIALIZING +INITIALLY +INITIALS +INITIATE +INITIATED +INITIATES +INITIATING +INITIATION +INITIATIONS +INITIATIVE +INITIATIVES +INITIATOR +INITIATORS +INJECT +INJECTED +INJECTING +INJECTION +INJECTIONS +INJECTIVE +INJECTS +INJUDICIOUS +INJUN +INJUNCTION +INJUNCTIONS +INJUNS +INJURE +INJURED +INJURES +INJURIES +INJURING +INJURIOUS +INJURY +INJUSTICE +INJUSTICES +INK +INKED +INKER +INKERS +INKING +INKINGS +INKLING +INKLINGS +INKS +INLAID +INLAND +INLAY +INLET +INLETS +INLINE +INMAN +INMATE +INMATES +INN +INNARDS +INNATE +INNATELY +INNER +INNERMOST +INNING +INNINGS +INNOCENCE +INNOCENT +INNOCENTLY +INNOCENTS +INNOCUOUS +INNOCUOUSLY +INNOCUOUSNESS +INNOVATE +INNOVATION +INNOVATIONS +INNOVATIVE +INNS +INNUENDO +INNUMERABILITY +INNUMERABLE +INNUMERABLY +INOCULATE +INOPERABLE +INOPERATIVE +INOPPORTUNE +INORDINATE +INORDINATELY +INORGANIC +INPUT +INPUTS +INQUEST +INQUIRE +INQUIRED +INQUIRER +INQUIRERS +INQUIRES +INQUIRIES +INQUIRING +INQUIRY +INQUISITION +INQUISITIONS +INQUISITIVE +INQUISITIVELY +INQUISITIVENESS +INROAD +INROADS +INSANE +INSANELY +INSANITY +INSATIABLE +INSCRIBE +INSCRIBED +INSCRIBES +INSCRIBING +INSCRIPTION +INSCRIPTIONS +INSCRUTABLE +INSECT +INSECTICIDE +INSECTS +INSECURE +INSECURELY +INSEMINATE +INSENSIBLE +INSENSITIVE +INSENSITIVELY +INSENSITIVITY +INSEPARABLE +INSERT +INSERTED +INSERTING +INSERTION +INSERTIONS +INSERTS +INSET +INSIDE +INSIDER +INSIDERS +INSIDES +INSIDIOUS +INSIDIOUSLY +INSIDIOUSNESS +INSIGHT +INSIGHTFUL +INSIGHTS +INSIGNIA +INSIGNIFICANCE +INSIGNIFICANT +INSINCERE +INSINCERITY +INSINUATE +INSINUATED +INSINUATES +INSINUATING +INSINUATION +INSINUATIONS +INSIPID +INSIST +INSISTED +INSISTENCE +INSISTENT +INSISTENTLY +INSISTING +INSISTS +INSOFAR +INSOLENCE +INSOLENT +INSOLENTLY +INSOLUBLE +INSOLVABLE +INSOLVENT +INSOMNIA +INSOMNIAC +INSPECT +INSPECTED +INSPECTING +INSPECTION +INSPECTIONS +INSPECTOR +INSPECTORS +INSPECTS +INSPIRATION +INSPIRATIONS +INSPIRE +INSPIRED +INSPIRER +INSPIRES +INSPIRING +INSTABILITIES +INSTABILITY +INSTALL +INSTALLATION +INSTALLATIONS +INSTALLED +INSTALLER +INSTALLERS +INSTALLING +INSTALLMENT +INSTALLMENTS +INSTALLS +INSTANCE +INSTANCES +INSTANT +INSTANTANEOUS +INSTANTANEOUSLY +INSTANTER +INSTANTIATE +INSTANTIATED +INSTANTIATES +INSTANTIATING +INSTANTIATION +INSTANTIATIONS +INSTANTLY +INSTANTS +INSTEAD +INSTIGATE +INSTIGATED +INSTIGATES +INSTIGATING +INSTIGATOR +INSTIGATORS +INSTILL +INSTINCT +INSTINCTIVE +INSTINCTIVELY +INSTINCTS +INSTINCTUAL +INSTITUTE +INSTITUTED +INSTITUTER +INSTITUTERS +INSTITUTES +INSTITUTING +INSTITUTION +INSTITUTIONAL +INSTITUTIONALIZE +INSTITUTIONALIZED +INSTITUTIONALIZES +INSTITUTIONALIZING +INSTITUTIONALLY +INSTITUTIONS +INSTRUCT +INSTRUCTED +INSTRUCTING +INSTRUCTION +INSTRUCTIONAL +INSTRUCTIONS +INSTRUCTIVE +INSTRUCTIVELY +INSTRUCTOR +INSTRUCTORS +INSTRUCTS +INSTRUMENT +INSTRUMENTAL +INSTRUMENTALIST +INSTRUMENTALISTS +INSTRUMENTALLY +INSTRUMENTALS +INSTRUMENTATION +INSTRUMENTED +INSTRUMENTING +INSTRUMENTS +INSUBORDINATE +INSUFFERABLE +INSUFFICIENT +INSUFFICIENTLY +INSULAR +INSULATE +INSULATED +INSULATES +INSULATING +INSULATION +INSULATOR +INSULATORS +INSULIN +INSULT +INSULTED +INSULTING +INSULTS +INSUPERABLE +INSUPPORTABLE +INSURANCE +INSURE +INSURED +INSURER +INSURERS +INSURES +INSURGENT +INSURGENTS +INSURING +INSURMOUNTABLE +INSURRECTION +INSURRECTIONS +INTACT +INTANGIBLE +INTANGIBLES +INTEGER +INTEGERS +INTEGRABLE +INTEGRAL +INTEGRALS +INTEGRAND +INTEGRATE +INTEGRATED +INTEGRATES +INTEGRATING +INTEGRATION +INTEGRATIONS +INTEGRATIVE +INTEGRITY +INTEL +INTELLECT +INTELLECTS +INTELLECTUAL +INTELLECTUALLY +INTELLECTUALS +INTELLIGENCE +INTELLIGENT +INTELLIGENTLY +INTELLIGENTSIA +INTELLIGIBILITY +INTELLIGIBLE +INTELLIGIBLY +INTELSAT +INTEMPERATE +INTEND +INTENDED +INTENDING +INTENDS +INTENSE +INTENSELY +INTENSIFICATION +INTENSIFIED +INTENSIFIER +INTENSIFIERS +INTENSIFIES +INTENSIFY +INTENSIFYING +INTENSITIES +INTENSITY +INTENSIVE +INTENSIVELY +INTENT +INTENTION +INTENTIONAL +INTENTIONALLY +INTENTIONED +INTENTIONS +INTENTLY +INTENTNESS +INTENTS +INTER +INTERACT +INTERACTED +INTERACTING +INTERACTION +INTERACTIONS +INTERACTIVE +INTERACTIVELY +INTERACTIVITY +INTERACTS +INTERCEPT +INTERCEPTED +INTERCEPTING +INTERCEPTION +INTERCEPTOR +INTERCEPTS +INTERCHANGE +INTERCHANGEABILITY +INTERCHANGEABLE +INTERCHANGEABLY +INTERCHANGED +INTERCHANGER +INTERCHANGES +INTERCHANGING +INTERCHANGINGS +INTERCHANNEL +INTERCITY +INTERCOM +INTERCOMMUNICATE +INTERCOMMUNICATED +INTERCOMMUNICATES +INTERCOMMUNICATING +INTERCOMMUNICATION +INTERCONNECT +INTERCONNECTED +INTERCONNECTING +INTERCONNECTION +INTERCONNECTIONS +INTERCONNECTS +INTERCONTINENTAL +INTERCOURSE +INTERDATA +INTERDEPENDENCE +INTERDEPENDENCIES +INTERDEPENDENCY +INTERDEPENDENT +INTERDICT +INTERDICTION +INTERDISCIPLINARY +INTEREST +INTERESTED +INTERESTING +INTERESTINGLY +INTERESTS +INTERFACE +INTERFACED +INTERFACER +INTERFACES +INTERFACING +INTERFERE +INTERFERED +INTERFERENCE +INTERFERENCES +INTERFERES +INTERFERING +INTERFERINGLY +INTERFEROMETER +INTERFEROMETRIC +INTERFEROMETRY +INTERFRAME +INTERGROUP +INTERIM +INTERIOR +INTERIORS +INTERJECT +INTERLACE +INTERLACED +INTERLACES +INTERLACING +INTERLEAVE +INTERLEAVED +INTERLEAVES +INTERLEAVING +INTERLINK +INTERLINKED +INTERLINKS +INTERLISP +INTERMEDIARY +INTERMEDIATE +INTERMEDIATES +INTERMINABLE +INTERMINGLE +INTERMINGLED +INTERMINGLES +INTERMINGLING +INTERMISSION +INTERMITTENT +INTERMITTENTLY +INTERMIX +INTERMIXED +INTERMODULE +INTERN +INTERNAL +INTERNALIZE +INTERNALIZED +INTERNALIZES +INTERNALIZING +INTERNALLY +INTERNALS +INTERNATIONAL +INTERNATIONALITY +INTERNATIONALLY +INTERNED +INTERNET +INTERNET +INTERNETWORK +INTERNING +INTERNS +INTERNSHIP +INTEROFFICE +INTERPERSONAL +INTERPLAY +INTERPOL +INTERPOLATE +INTERPOLATED +INTERPOLATES +INTERPOLATING +INTERPOLATION +INTERPOLATIONS +INTERPOSE +INTERPOSED +INTERPOSES +INTERPOSING +INTERPRET +INTERPRETABLE +INTERPRETATION +INTERPRETATIONS +INTERPRETED +INTERPRETER +INTERPRETERS +INTERPRETING +INTERPRETIVE +INTERPRETIVELY +INTERPRETS +INTERPROCESS +INTERRELATE +INTERRELATED +INTERRELATES +INTERRELATING +INTERRELATION +INTERRELATIONS +INTERRELATIONSHIP +INTERRELATIONSHIPS +INTERROGATE +INTERROGATED +INTERROGATES +INTERROGATING +INTERROGATION +INTERROGATIONS +INTERROGATIVE +INTERRUPT +INTERRUPTED +INTERRUPTIBLE +INTERRUPTING +INTERRUPTION +INTERRUPTIONS +INTERRUPTIVE +INTERRUPTS +INTERSECT +INTERSECTED +INTERSECTING +INTERSECTION +INTERSECTIONS +INTERSECTS +INTERSPERSE +INTERSPERSED +INTERSPERSES +INTERSPERSING +INTERSPERSION +INTERSTAGE +INTERSTATE +INTERTWINE +INTERTWINED +INTERTWINES +INTERTWINING +INTERVAL +INTERVALS +INTERVENE +INTERVENED +INTERVENES +INTERVENING +INTERVENTION +INTERVENTIONS +INTERVIEW +INTERVIEWED +INTERVIEWEE +INTERVIEWER +INTERVIEWERS +INTERVIEWING +INTERVIEWS +INTERWOVEN +INTESTATE +INTESTINAL +INTESTINE +INTESTINES +INTIMACY +INTIMATE +INTIMATED +INTIMATELY +INTIMATING +INTIMATION +INTIMATIONS +INTIMIDATE +INTIMIDATED +INTIMIDATES +INTIMIDATING +INTIMIDATION +INTO +INTOLERABLE +INTOLERABLY +INTOLERANCE +INTOLERANT +INTONATION +INTONATIONS +INTONE +INTOXICANT +INTOXICATE +INTOXICATED +INTOXICATING +INTOXICATION +INTRACTABILITY +INTRACTABLE +INTRACTABLY +INTRAGROUP +INTRALINE +INTRAMURAL +INTRAMUSCULAR +INTRANSIGENT +INTRANSITIVE +INTRANSITIVELY +INTRAOFFICE +INTRAPROCESS +INTRASTATE +INTRAVENOUS +INTREPID +INTRICACIES +INTRICACY +INTRICATE +INTRICATELY +INTRIGUE +INTRIGUED +INTRIGUES +INTRIGUING +INTRINSIC +INTRINSICALLY +INTRODUCE +INTRODUCED +INTRODUCES +INTRODUCING +INTRODUCTION +INTRODUCTIONS +INTRODUCTORY +INTROSPECT +INTROSPECTION +INTROSPECTIONS +INTROSPECTIVE +INTROVERT +INTROVERTED +INTRUDE +INTRUDED +INTRUDER +INTRUDERS +INTRUDES +INTRUDING +INTRUSION +INTRUSIONS +INTRUST +INTUBATE +INTUBATED +INTUBATES +INTUBATION +INTUITION +INTUITIONIST +INTUITIONS +INTUITIVE +INTUITIVELY +INUNDATE +INVADE +INVADED +INVADER +INVADERS +INVADES +INVADING +INVALID +INVALIDATE +INVALIDATED +INVALIDATES +INVALIDATING +INVALIDATION +INVALIDATIONS +INVALIDITIES +INVALIDITY +INVALIDLY +INVALIDS +INVALUABLE +INVARIABLE +INVARIABLY +INVARIANCE +INVARIANT +INVARIANTLY +INVARIANTS +INVASION +INVASIONS +INVECTIVE +INVENT +INVENTED +INVENTING +INVENTION +INVENTIONS +INVENTIVE +INVENTIVELY +INVENTIVENESS +INVENTOR +INVENTORIES +INVENTORS +INVENTORY +INVENTS +INVERNESS +INVERSE +INVERSELY +INVERSES +INVERSION +INVERSIONS +INVERT +INVERTEBRATE +INVERTEBRATES +INVERTED +INVERTER +INVERTERS +INVERTIBLE +INVERTING +INVERTS +INVEST +INVESTED +INVESTIGATE +INVESTIGATED +INVESTIGATES +INVESTIGATING +INVESTIGATION +INVESTIGATIONS +INVESTIGATIVE +INVESTIGATOR +INVESTIGATORS +INVESTIGATORY +INVESTING +INVESTMENT +INVESTMENTS +INVESTOR +INVESTORS +INVESTS +INVETERATE +INVIGORATE +INVINCIBLE +INVISIBILITY +INVISIBLE +INVISIBLY +INVITATION +INVITATIONS +INVITE +INVITED +INVITES +INVITING +INVOCABLE +INVOCATION +INVOCATIONS +INVOICE +INVOICED +INVOICES +INVOICING +INVOKE +INVOKED +INVOKER +INVOKES +INVOKING +INVOLUNTARILY +INVOLUNTARY +INVOLVE +INVOLVED +INVOLVEMENT +INVOLVEMENTS +INVOLVES +INVOLVING +INWARD +INWARDLY +INWARDNESS +INWARDS +IODINE +ION +IONIAN +IONIANS +IONICIZATION +IONICIZATIONS +IONICIZE +IONICIZES +IONOSPHERE +IONOSPHERIC +IONS +IOTA +IOWA +IRA +IRAN +IRANIAN +IRANIANS +IRANIZE +IRANIZES +IRAQ +IRAQI +IRAQIS +IRATE +IRATELY +IRATENESS +IRE +IRELAND +IRENE +IRES +IRIS +IRISH +IRISHIZE +IRISHIZES +IRISHMAN +IRISHMEN +IRK +IRKED +IRKING +IRKS +IRKSOME +IRMA +IRON +IRONED +IRONIC +IRONICAL +IRONICALLY +IRONIES +IRONING +IRONINGS +IRONS +IRONY +IROQUOIS +IRRADIATE +IRRATIONAL +IRRATIONALLY +IRRATIONALS +IRRAWADDY +IRRECONCILABLE +IRRECOVERABLE +IRREDUCIBLE +IRREDUCIBLY +IRREFLEXIVE +IRREFUTABLE +IRREGULAR +IRREGULARITIES +IRREGULARITY +IRREGULARLY +IRREGULARS +IRRELEVANCE +IRRELEVANCES +IRRELEVANT +IRRELEVANTLY +IRREPLACEABLE +IRREPRESSIBLE +IRREPRODUCIBILITY +IRREPRODUCIBLE +IRRESISTIBLE +IRRESPECTIVE +IRRESPECTIVELY +IRRESPONSIBLE +IRRESPONSIBLY +IRRETRIEVABLY +IRREVERENT +IRREVERSIBILITY +IRREVERSIBLE +IRREVERSIBLY +IRREVOCABLE +IRREVOCABLY +IRRIGATE +IRRIGATED +IRRIGATES +IRRIGATING +IRRIGATION +IRRITABLE +IRRITANT +IRRITATE +IRRITATED +IRRITATES +IRRITATING +IRRITATION +IRRITATIONS +IRVIN +IRVINE +IRVING +IRWIN +ISAAC +ISAACS +ISAACSON +ISABEL +ISABELLA +ISADORE +ISAIAH +ISFAHAN +ISING +ISIS +ISLAM +ISLAMABAD +ISLAMIC +ISLAMIZATION +ISLAMIZATIONS +ISLAMIZE +ISLAMIZES +ISLAND +ISLANDER +ISLANDERS +ISLANDIA +ISLANDS +ISLE +ISLES +ISLET +ISLETS +ISOLATE +ISOLATED +ISOLATES +ISOLATING +ISOLATION +ISOLATIONS +ISOLDE +ISOMETRIC +ISOMORPHIC +ISOMORPHICALLY +ISOMORPHISM +ISOMORPHISMS +ISOTOPE +ISOTOPES +ISRAEL +ISRAELI +ISRAELIS +ISRAELITE +ISRAELITES +ISRAELITIZE +ISRAELITIZES +ISSUANCE +ISSUE +ISSUED +ISSUER +ISSUERS +ISSUES +ISSUING +ISTANBUL +ISTHMUS +ISTVAN +ITALIAN +ITALIANIZATION +ITALIANIZATIONS +ITALIANIZE +ITALIANIZER +ITALIANIZERS +ITALIANIZES +ITALIANS +ITALIC +ITALICIZE +ITALICIZED +ITALICS +ITALY +ITCH +ITCHES +ITCHING +ITEL +ITEM +ITEMIZATION +ITEMIZATIONS +ITEMIZE +ITEMIZED +ITEMIZES +ITEMIZING +ITEMS +ITERATE +ITERATED +ITERATES +ITERATING +ITERATION +ITERATIONS +ITERATIVE +ITERATIVELY +ITERATOR +ITERATORS +ITHACA +ITHACAN +ITINERARIES +ITINERARY +ITO +ITS +ITSELF +IVAN +IVANHOE +IVERSON +IVIES +IVORY +IVY +IZAAK +IZVESTIA +JAB +JABBED +JABBING +JABLONSKY +JABS +JACK +JACKASS +JACKET +JACKETED +JACKETS +JACKIE +JACKING +JACKKNIFE +JACKMAN +JACKPOT +JACKSON +JACKSONIAN +JACKSONS +JACKSONVILLE +JACKY +JACOB +JACOBEAN +JACOBI +JACOBIAN +JACOBINIZE +JACOBITE +JACOBS +JACOBSEN +JACOBSON +JACOBUS +JACOBY +JACQUELINE +JACQUES +JADE +JADED +JAEGER +JAGUAR +JAIL +JAILED +JAILER +JAILERS +JAILING +JAILS +JAIME +JAKARTA +JAKE +JAKES +JAM +JAMAICA +JAMAICAN +JAMES +JAMESON +JAMESTOWN +JAMMED +JAMMING +JAMS +JANE +JANEIRO +JANESVILLE +JANET +JANICE +JANIS +JANITOR +JANITORS +JANOS +JANSEN +JANSENIST +JANUARIES +JANUARY +JANUS +JAPAN +JAPANESE +JAPANIZATION +JAPANIZATIONS +JAPANIZE +JAPANIZED +JAPANIZES +JAPANIZING +JAR +JARGON +JARRED +JARRING +JARRINGLY +JARS +JARVIN +JASON +JASTROW +JAUNDICE +JAUNT +JAUNTINESS +JAUNTS +JAUNTY +JAVA +JAVANESE +JAVELIN +JAVELINS +JAW +JAWBONE +JAWS +JAY +JAYCEE +JAYCEES +JAZZ +JAZZY +JEALOUS +JEALOUSIES +JEALOUSLY +JEALOUSY +JEAN +JEANNE +JEANNIE +JEANS +JED +JEEP +JEEPS +JEER +JEERS +JEFF +JEFFERSON +JEFFERSONIAN +JEFFERSONIANS +JEFFREY +JEHOVAH +JELLIES +JELLO +JELLY +JELLYFISH +JENKINS +JENNIE +JENNIFER +JENNINGS +JENNY +JENSEN +JEOPARDIZE +JEOPARDIZED +JEOPARDIZES +JEOPARDIZING +JEOPARDY +JEREMIAH +JEREMY +JERES +JERICHO +JERK +JERKED +JERKINESS +JERKING +JERKINGS +JERKS +JERKY +JEROBOAM +JEROME +JERRY +JERSEY +JERSEYS +JERUSALEM +JESSE +JESSICA +JESSIE +JESSY +JEST +JESTED +JESTER +JESTING +JESTS +JESUIT +JESUITISM +JESUITIZE +JESUITIZED +JESUITIZES +JESUITIZING +JESUITS +JESUS +JET +JETLINER +JETS +JETTED +JETTING +JEW +JEWEL +JEWELED +JEWELER +JEWELL +JEWELLED +JEWELRIES +JEWELRY +JEWELS +JEWETT +JEWISH +JEWISHNESS +JEWS +JIFFY +JIG +JIGS +JIGSAW +JILL +JIM +JIMENEZ +JIMMIE +JINGLE +JINGLED +JINGLING +JINNY +JITTER +JITTERBUG +JITTERY +JOAN +JOANNA +JOANNE +JOAQUIN +JOB +JOBREL +JOBS +JOCKEY +JOCKSTRAP +JOCUND +JODY +JOE +JOEL +JOES +JOG +JOGGING +JOGS +JOHANN +JOHANNA +JOHANNES +JOHANNESBURG +JOHANSEN +JOHANSON +JOHN +JOHNNIE +JOHNNY +JOHNS +JOHNSEN +JOHNSON +JOHNSTON +JOHNSTOWN +JOIN +JOINED +JOINER +JOINERS +JOINING +JOINS +JOINT +JOINTLY +JOINTS +JOKE +JOKED +JOKER +JOKERS +JOKES +JOKING +JOKINGLY +JOLIET +JOLLA +JOLLY +JOLT +JOLTED +JOLTING +JOLTS +JON +JONAS +JONATHAN +JONATHANIZATION +JONATHANIZATIONS +JONES +JONESES +JONQUIL +JOPLIN +JORDAN +JORDANIAN +JORGE +JORGENSEN +JORGENSON +JOSE +JOSEF +JOSEPH +JOSEPHINE +JOSEPHSON +JOSEPHUS +JOSHUA +JOSIAH +JOSTLE +JOSTLED +JOSTLES +JOSTLING +JOT +JOTS +JOTTED +JOTTING +JOULE +JOURNAL +JOURNALISM +JOURNALIST +JOURNALISTS +JOURNALIZE +JOURNALIZED +JOURNALIZES +JOURNALIZING +JOURNALS +JOURNEY +JOURNEYED +JOURNEYING +JOURNEYINGS +JOURNEYMAN +JOURNEYMEN +JOURNEYS +JOUST +JOUSTED +JOUSTING +JOUSTS +JOVANOVICH +JOVE +JOVIAL +JOVIAN +JOY +JOYCE +JOYFUL +JOYFULLY +JOYOUS +JOYOUSLY +JOYOUSNESS +JOYRIDE +JOYS +JOYSTICK +JUAN +JUANITA +JUBAL +JUBILEE +JUDAICA +JUDAISM +JUDAS +JUDD +JUDDER +JUDDERED +JUDDERING +JUDDERS +JUDE +JUDEA +JUDGE +JUDGED +JUDGES +JUDGING +JUDGMENT +JUDGMENTS +JUDICIAL +JUDICIARY +JUDICIOUS +JUDICIOUSLY +JUDITH +JUDO +JUDSON +JUDY +JUG +JUGGLE +JUGGLER +JUGGLERS +JUGGLES +JUGGLING +JUGOSLAVIA +JUGS +JUICE +JUICES +JUICIEST +JUICY +JUKES +JULES +JULIA +JULIAN +JULIE +JULIES +JULIET +JULIO +JULIUS +JULY +JUMBLE +JUMBLED +JUMBLES +JUMBO +JUMP +JUMPED +JUMPER +JUMPERS +JUMPING +JUMPS +JUMPY +JUNCTION +JUNCTIONS +JUNCTURE +JUNCTURES +JUNE +JUNEAU +JUNES +JUNG +JUNGIAN +JUNGLE +JUNGLES +JUNIOR +JUNIORS +JUNIPER +JUNK +JUNKER +JUNKERS +JUNKS +JUNKY +JUNO +JUNTA +JUPITER +JURA +JURAS +JURASSIC +JURE +JURIES +JURISDICTION +JURISDICTIONS +JURISPRUDENCE +JURIST +JUROR +JURORS +JURY +JUST +JUSTICE +JUSTICES +JUSTIFIABLE +JUSTIFIABLY +JUSTIFICATION +JUSTIFICATIONS +JUSTIFIED +JUSTIFIER +JUSTIFIERS +JUSTIFIES +JUSTIFY +JUSTIFYING +JUSTINE +JUSTINIAN +JUSTLY +JUSTNESS +JUT +JUTISH +JUTLAND +JUTTING +JUVENILE +JUVENILES +JUXTAPOSE +JUXTAPOSED +JUXTAPOSES +JUXTAPOSING +KABUKI +KABUL +KADDISH +KAFKA +KAFKAESQUE +KAHN +KAJAR +KALAMAZOO +KALI +KALMUK +KAMCHATKA +KAMIKAZE +KAMIKAZES +KAMPALA +KAMPUCHEA +KANARESE +KANE +KANGAROO +KANJI +KANKAKEE +KANNADA +KANSAS +KANT +KANTIAN +KAPLAN +KAPPA +KARACHI +KARAMAZOV +KARATE +KAREN +KARL +KAROL +KARP +KASHMIR +KASKASKIA +KATE +KATHARINE +KATHERINE +KATHLEEN +KATHY +KATIE +KATMANDU +KATOWICE +KATZ +KAUFFMAN +KAUFMAN +KAY +KEATON +KEATS +KEEGAN +KEEL +KEELED +KEELING +KEELS +KEEN +KEENAN +KEENER +KEENEST +KEENLY +KEENNESS +KEEP +KEEPER +KEEPERS +KEEPING +KEEPS +KEITH +KELLER +KELLEY +KELLOGG +KELLY +KELSEY +KELVIN +KEMP +KEN +KENDALL +KENILWORTH +KENNAN +KENNECOTT +KENNEDY +KENNEL +KENNELS +KENNETH +KENNEY +KENNING +KENNY +KENOSHA +KENSINGTON +KENT +KENTON +KENTUCKY +KENYA +KENYON +KEPLER +KEPT +KERCHIEF +KERCHIEFS +KERMIT +KERN +KERNEL +KERNELS +KERNIGHAN +KEROSENE +KEROUAC +KERR +KESSLER +KETCHUP +KETTERING +KETTLE +KETTLES +KEVIN +KEWASKUM +KEWAUNEE +KEY +KEYBOARD +KEYBOARDS +KEYED +KEYES +KEYHOLE +KEYING +KEYNES +KEYNESIAN +KEYNOTE +KEYPAD +KEYPADS +KEYS +KEYSTROKE +KEYSTROKES +KEYWORD +KEYWORDS +KHARTOUM +KHMER +KHRUSHCHEV +KHRUSHCHEVS +KICK +KICKAPOO +KICKED +KICKER +KICKERS +KICKING +KICKOFF +KICKS +KID +KIDDE +KIDDED +KIDDIE +KIDDING +KIDNAP +KIDNAPPER +KIDNAPPERS +KIDNAPPING +KIDNAPPINGS +KIDNAPS +KIDNEY +KIDNEYS +KIDS +KIEFFER +KIEL +KIEV +KIEWIT +KIGALI +KIKUYU +KILGORE +KILIMANJARO +KILL +KILLEBREW +KILLED +KILLER +KILLERS +KILLING +KILLINGLY +KILLINGS +KILLJOY +KILLS +KILOBIT +KILOBITS +KILOBLOCK +KILOBYTE +KILOBYTES +KILOGRAM +KILOGRAMS +KILOHERTZ +KILOHM +KILOJOULE +KILOMETER +KILOMETERS +KILOTON +KILOVOLT +KILOWATT +KILOWORD +KIM +KIMBALL +KIMBERLY +KIMONO +KIN +KIND +KINDER +KINDERGARTEN +KINDEST +KINDHEARTED +KINDLE +KINDLED +KINDLES +KINDLING +KINDLY +KINDNESS +KINDRED +KINDS +KINETIC +KING +KINGDOM +KINGDOMS +KINGLY +KINGPIN +KINGS +KINGSBURY +KINGSLEY +KINGSTON +KINGSTOWN +KINGWOOD +KINK +KINKY +KINNEY +KINNICKINNIC +KINSEY +KINSHASHA +KINSHIP +KINSMAN +KIOSK +KIOWA +KIPLING +KIRBY +KIRCHNER +KIRCHOFF +KIRK +KIRKLAND +KIRKPATRICK +KIRKWOOD +KIROV +KISS +KISSED +KISSER +KISSERS +KISSES +KISSING +KIT +KITAKYUSHU +KITCHEN +KITCHENETTE +KITCHENS +KITE +KITED +KITES +KITING +KITS +KITTEN +KITTENISH +KITTENS +KITTY +KIWANIS +KLAN +KLAUS +KLAXON +KLEIN +KLEINROCK +KLINE +KLUDGE +KLUDGES +KLUX +KLYSTRON +KNACK +KNAPP +KNAPSACK +KNAPSACKS +KNAUER +KNAVE +KNAVES +KNEAD +KNEADS +KNEE +KNEECAP +KNEED +KNEEING +KNEEL +KNEELED +KNEELING +KNEELS +KNEES +KNELL +KNELLS +KNELT +KNEW +KNICKERBOCKER +KNICKERBOCKERS +KNIFE +KNIFED +KNIFES +KNIFING +KNIGHT +KNIGHTED +KNIGHTHOOD +KNIGHTING +KNIGHTLY +KNIGHTS +KNIGHTSBRIDGE +KNIT +KNITS +KNIVES +KNOB +KNOBELOCH +KNOBS +KNOCK +KNOCKDOWN +KNOCKED +KNOCKER +KNOCKERS +KNOCKING +KNOCKOUT +KNOCKS +KNOLL +KNOLLS +KNOSSOS +KNOT +KNOTS +KNOTT +KNOTTED +KNOTTING +KNOW +KNOWABLE +KNOWER +KNOWHOW +KNOWING +KNOWINGLY +KNOWLEDGE +KNOWLEDGEABLE +KNOWLES +KNOWLTON +KNOWN +KNOWS +KNOX +KNOXVILLE +KNUCKLE +KNUCKLED +KNUCKLES +KNUDSEN +KNUDSON +KNUTH +KNUTSEN +KNUTSON +KOALA +KOBAYASHI +KOCH +KOCHAB +KODACHROME +KODAK +KODIAK +KOENIG +KOENIGSBERG +KOHLER +KONG +KONRAD +KOPPERS +KORAN +KOREA +KOREAN +KOREANS +KOSHER +KOVACS +KOWALEWSKI +KOWALSKI +KOWLOON +KOWTOW +KRAEMER +KRAKATOA +KRAKOW +KRAMER +KRAUSE +KREBS +KREMLIN +KRESGE +KRIEGER +KRISHNA +KRISTIN +KRONECKER +KRUEGER +KRUGER +KRUSE +KUALA +KUDO +KUENNING +KUHN +KUMAR +KURD +KURDISH +KURT +KUWAIT +KUWAITI +KYOTO +LAB +LABAN +LABEL +LABELED +LABELING +LABELLED +LABELLER +LABELLERS +LABELLING +LABELS +LABOR +LABORATORIES +LABORATORY +LABORED +LABORER +LABORERS +LABORING +LABORINGS +LABORIOUS +LABORIOUSLY +LABORS +LABRADOR +LABS +LABYRINTH +LABYRINTHS +LAC +LACE +LACED +LACERATE +LACERATED +LACERATES +LACERATING +LACERATION +LACERATIONS +LACERTA +LACES +LACEY +LACHESIS +LACING +LACK +LACKAWANNA +LACKED +LACKEY +LACKING +LACKS +LACQUER +LACQUERED +LACQUERS +LACROSSE +LACY +LAD +LADDER +LADEN +LADIES +LADING +LADLE +LADS +LADY +LADYLIKE +LAFAYETTE +LAG +LAGER +LAGERS +LAGOON +LAGOONS +LAGOS +LAGRANGE +LAGRANGIAN +LAGS +LAGUERRE +LAGUNA +LAHORE +LAID +LAIDLAW +LAIN +LAIR +LAIRS +LAISSEZ +LAKE +LAKEHURST +LAKES +LAKEWOOD +LAMAR +LAMARCK +LAMB +LAMBDA +LAMBDAS +LAMBERT +LAMBS +LAME +LAMED +LAMELY +LAMENESS +LAMENT +LAMENTABLE +LAMENTATION +LAMENTATIONS +LAMENTED +LAMENTING +LAMENTS +LAMES +LAMINAR +LAMING +LAMP +LAMPLIGHT +LAMPOON +LAMPORT +LAMPREY +LAMPS +LANA +LANCASHIRE +LANCASTER +LANCE +LANCED +LANCELOT +LANCER +LANCES +LAND +LANDED +LANDER +LANDERS +LANDFILL +LANDING +LANDINGS +LANDIS +LANDLADIES +LANDLADY +LANDLORD +LANDLORDS +LANDMARK +LANDMARKS +LANDOWNER +LANDOWNERS +LANDS +LANDSCAPE +LANDSCAPED +LANDSCAPES +LANDSCAPING +LANDSLIDE +LANDWEHR +LANE +LANES +LANG +LANGE +LANGELAND +LANGFORD +LANGLEY +LANGMUIR +LANGUAGE +LANGUAGES +LANGUID +LANGUIDLY +LANGUIDNESS +LANGUISH +LANGUISHED +LANGUISHES +LANGUISHING +LANKA +LANSING +LANTERN +LANTERNS +LAO +LAOCOON +LAOS +LAOTIAN +LAOTIANS +LAP +LAPEL +LAPELS +LAPLACE +LAPLACIAN +LAPPING +LAPS +LAPSE +LAPSED +LAPSES +LAPSING +LARAMIE +LARD +LARDER +LAREDO +LARES +LARGE +LARGELY +LARGENESS +LARGER +LARGEST +LARK +LARKIN +LARKS +LARRY +LARS +LARSEN +LARSON +LARVA +LARVAE +LARYNX +LASCIVIOUS +LASER +LASERS +LASH +LASHED +LASHES +LASHING +LASHINGS +LASS +LASSES +LASSO +LAST +LASTED +LASTING +LASTLY +LASTS +LASZLO +LATCH +LATCHED +LATCHES +LATCHING +LATE +LATELY +LATENCY +LATENESS +LATENT +LATER +LATERAL +LATERALLY +LATERAN +LATEST +LATEX +LATHE +LATHROP +LATIN +LATINATE +LATINITY +LATINIZATION +LATINIZATIONS +LATINIZE +LATINIZED +LATINIZER +LATINIZERS +LATINIZES +LATINIZING +LATITUDE +LATITUDES +LATRINE +LATRINES +LATROBE +LATTER +LATTERLY +LATTICE +LATTICES +LATTIMER +LATVIA +LAUDABLE +LAUDERDALE +LAUE +LAUGH +LAUGHABLE +LAUGHABLY +LAUGHED +LAUGHING +LAUGHINGLY +LAUGHINGSTOCK +LAUGHLIN +LAUGHS +LAUGHTER +LAUNCH +LAUNCHED +LAUNCHER +LAUNCHES +LAUNCHING +LAUNCHINGS +LAUNDER +LAUNDERED +LAUNDERER +LAUNDERING +LAUNDERINGS +LAUNDERS +LAUNDROMAT +LAUNDROMATS +LAUNDRY +LAUREATE +LAUREL +LAURELS +LAUREN +LAURENCE +LAURENT +LAURENTIAN +LAURIE +LAUSANNE +LAVA +LAVATORIES +LAVATORY +LAVENDER +LAVISH +LAVISHED +LAVISHING +LAVISHLY +LAVOISIER +LAW +LAWBREAKER +LAWFORD +LAWFUL +LAWFULLY +LAWGIVER +LAWLESS +LAWLESSNESS +LAWN +LAWNS +LAWRENCE +LAWRENCEVILLE +LAWS +LAWSON +LAWSUIT +LAWSUITS +LAWYER +LAWYERS +LAX +LAXATIVE +LAY +LAYER +LAYERED +LAYERING +LAYERS +LAYING +LAYMAN +LAYMEN +LAYOFF +LAYOFFS +LAYOUT +LAYOUTS +LAYS +LAYTON +LAZARUS +LAZED +LAZIER +LAZIEST +LAZILY +LAZINESS +LAZING +LAZY +LAZYBONES +LEAD +LEADED +LEADEN +LEADER +LEADERS +LEADERSHIP +LEADERSHIPS +LEADING +LEADINGS +LEADS +LEAF +LEAFED +LEAFIEST +LEAFING +LEAFLESS +LEAFLET +LEAFLETS +LEAFY +LEAGUE +LEAGUED +LEAGUER +LEAGUERS +LEAGUES +LEAK +LEAKAGE +LEAKAGES +LEAKED +LEAKING +LEAKS +LEAKY +LEAN +LEANDER +LEANED +LEANER +LEANEST +LEANING +LEANNESS +LEANS +LEAP +LEAPED +LEAPFROG +LEAPING +LEAPS +LEAPT +LEAR +LEARN +LEARNED +LEARNER +LEARNERS +LEARNING +LEARNS +LEARY +LEASE +LEASED +LEASES +LEASH +LEASHES +LEASING +LEAST +LEATHER +LEATHERED +LEATHERN +LEATHERNECK +LEATHERS +LEAVE +LEAVED +LEAVEN +LEAVENED +LEAVENING +LEAVENWORTH +LEAVES +LEAVING +LEAVINGS +LEBANESE +LEBANON +LEBESGUE +LECHERY +LECTURE +LECTURED +LECTURER +LECTURERS +LECTURES +LECTURING +LED +LEDGE +LEDGER +LEDGERS +LEDGES +LEE +LEECH +LEECHES +LEEDS +LEEK +LEER +LEERY +LEES +LEEUWENHOEK +LEEWARD +LEEWAY +LEFT +LEFTIST +LEFTISTS +LEFTMOST +LEFTOVER +LEFTOVERS +LEFTWARD +LEG +LEGACIES +LEGACY +LEGAL +LEGALITY +LEGALIZATION +LEGALIZE +LEGALIZED +LEGALIZES +LEGALIZING +LEGALLY +LEGEND +LEGENDARY +LEGENDRE +LEGENDS +LEGER +LEGERS +LEGGED +LEGGINGS +LEGIBILITY +LEGIBLE +LEGIBLY +LEGION +LEGIONS +LEGISLATE +LEGISLATED +LEGISLATES +LEGISLATING +LEGISLATION +LEGISLATIVE +LEGISLATOR +LEGISLATORS +LEGISLATURE +LEGISLATURES +LEGITIMACY +LEGITIMATE +LEGITIMATELY +LEGS +LEGUME +LEHIGH +LEHMAN +LEIBNIZ +LEIDEN +LEIGH +LEIGHTON +LEILA +LEIPZIG +LEISURE +LEISURELY +LELAND +LEMKE +LEMMA +LEMMAS +LEMMING +LEMMINGS +LEMON +LEMONADE +LEMONS +LEMUEL +LEN +LENA +LEND +LENDER +LENDERS +LENDING +LENDS +LENGTH +LENGTHEN +LENGTHENED +LENGTHENING +LENGTHENS +LENGTHLY +LENGTHS +LENGTHWISE +LENGTHY +LENIENCY +LENIENT +LENIENTLY +LENIN +LENINGRAD +LENINISM +LENINIST +LENNOX +LENNY +LENORE +LENS +LENSES +LENT +LENTEN +LENTIL +LENTILS +LEO +LEON +LEONA +LEONARD +LEONARDO +LEONE +LEONID +LEOPARD +LEOPARDS +LEOPOLD +LEOPOLDVILLE +LEPER +LEPROSY +LEROY +LESBIAN +LESBIANS +LESLIE +LESOTHO +LESS +LESSEN +LESSENED +LESSENING +LESSENS +LESSER +LESSON +LESSONS +LESSOR +LEST +LESTER +LET +LETHAL +LETHE +LETITIA +LETS +LETTER +LETTERED +LETTERER +LETTERHEAD +LETTERING +LETTERS +LETTING +LETTUCE +LEUKEMIA +LEV +LEVEE +LEVEES +LEVEL +LEVELED +LEVELER +LEVELING +LEVELLED +LEVELLER +LEVELLEST +LEVELLING +LEVELLY +LEVELNESS +LEVELS +LEVER +LEVERAGE +LEVERS +LEVI +LEVIABLE +LEVIED +LEVIES +LEVIN +LEVINE +LEVIS +LEVITICUS +LEVITT +LEVITY +LEVY +LEVYING +LEW +LEWD +LEWDLY +LEWDNESS +LEWELLYN +LEXICAL +LEXICALLY +LEXICOGRAPHIC +LEXICOGRAPHICAL +LEXICOGRAPHICALLY +LEXICON +LEXICONS +LEXINGTON +LEYDEN +LIABILITIES +LIABILITY +LIABLE +LIAISON +LIAISONS +LIAR +LIARS +LIBEL +LIBELOUS +LIBERACE +LIBERAL +LIBERALIZE +LIBERALIZED +LIBERALIZES +LIBERALIZING +LIBERALLY +LIBERALS +LIBERATE +LIBERATED +LIBERATES +LIBERATING +LIBERATION +LIBERATOR +LIBERATORS +LIBERIA +LIBERTARIAN +LIBERTIES +LIBERTY +LIBIDO +LIBRARIAN +LIBRARIANS +LIBRARIES +LIBRARY +LIBRETTO +LIBREVILLE +LIBYA +LIBYAN +LICE +LICENSE +LICENSED +LICENSEE +LICENSES +LICENSING +LICENSOR +LICENTIOUS +LICHEN +LICHENS +LICHTER +LICK +LICKED +LICKING +LICKS +LICORICE +LID +LIDS +LIE +LIEBERMAN +LIECHTENSTEIN +LIED +LIEGE +LIEN +LIENS +LIES +LIEU +LIEUTENANT +LIEUTENANTS +LIFE +LIFEBLOOD +LIFEBOAT +LIFEGUARD +LIFELESS +LIFELESSNESS +LIFELIKE +LIFELONG +LIFER +LIFESPAN +LIFESTYLE +LIFESTYLES +LIFETIME +LIFETIMES +LIFT +LIFTED +LIFTER +LIFTERS +LIFTING +LIFTS +LIGAMENT +LIGATURE +LIGGET +LIGGETT +LIGHT +LIGHTED +LIGHTEN +LIGHTENS +LIGHTER +LIGHTERS +LIGHTEST +LIGHTFACE +LIGHTHEARTED +LIGHTHOUSE +LIGHTHOUSES +LIGHTING +LIGHTLY +LIGHTNESS +LIGHTNING +LIGHTNINGS +LIGHTS +LIGHTWEIGHT +LIKE +LIKED +LIKELIER +LIKELIEST +LIKELIHOOD +LIKELIHOODS +LIKELINESS +LIKELY +LIKEN +LIKENED +LIKENESS +LIKENESSES +LIKENING +LIKENS +LIKES +LIKEWISE +LIKING +LILA +LILAC +LILACS +LILIAN +LILIES +LILLIAN +LILLIPUT +LILLIPUTIAN +LILLIPUTIANIZE +LILLIPUTIANIZES +LILLY +LILY +LIMA +LIMAN +LIMB +LIMBER +LIMBO +LIMBS +LIME +LIMELIGHT +LIMERICK +LIMES +LIMESTONE +LIMIT +LIMITABILITY +LIMITABLY +LIMITATION +LIMITATIONS +LIMITED +LIMITER +LIMITERS +LIMITING +LIMITLESS +LIMITS +LIMOUSINE +LIMP +LIMPED +LIMPING +LIMPLY +LIMPNESS +LIMPS +LIN +LINCOLN +LIND +LINDA +LINDBERG +LINDBERGH +LINDEN +LINDHOLM +LINDQUIST +LINDSAY +LINDSEY +LINDSTROM +LINDY +LINE +LINEAR +LINEARITIES +LINEARITY +LINEARIZABLE +LINEARIZE +LINEARIZED +LINEARIZES +LINEARIZING +LINEARLY +LINED +LINEN +LINENS +LINER +LINERS +LINES +LINEUP +LINGER +LINGERED +LINGERIE +LINGERING +LINGERS +LINGO +LINGUA +LINGUIST +LINGUISTIC +LINGUISTICALLY +LINGUISTICS +LINGUISTS +LINING +LININGS +LINK +LINKAGE +LINKAGES +LINKED +LINKER +LINKERS +LINKING +LINKS +LINNAEUS +LINOLEUM +LINOTYPE +LINSEED +LINT +LINTON +LINUS +LINUX +LION +LIONEL +LIONESS +LIONESSES +LIONS +LIP +LIPPINCOTT +LIPS +LIPSCHITZ +LIPSCOMB +LIPSTICK +LIPTON +LIQUID +LIQUIDATE +LIQUIDATION +LIQUIDATIONS +LIQUIDITY +LIQUIDS +LIQUOR +LIQUORS +LISA +LISBON +LISE +LISP +LISPED +LISPING +LISPS +LISS +LISSAJOUS +LIST +LISTED +LISTEN +LISTENED +LISTENER +LISTENERS +LISTENING +LISTENS +LISTER +LISTERIZE +LISTERIZES +LISTERS +LISTING +LISTINGS +LISTLESS +LISTON +LISTS +LIT +LITANY +LITER +LITERACY +LITERAL +LITERALLY +LITERALNESS +LITERALS +LITERARY +LITERATE +LITERATURE +LITERATURES +LITERS +LITHE +LITHOGRAPH +LITHOGRAPHY +LITHUANIA +LITHUANIAN +LITIGANT +LITIGATE +LITIGATION +LITIGIOUS +LITMUS +LITTER +LITTERBUG +LITTERED +LITTERING +LITTERS +LITTLE +LITTLENESS +LITTLER +LITTLEST +LITTLETON +LITTON +LIVABLE +LIVABLY +LIVE +LIVED +LIVELIHOOD +LIVELY +LIVENESS +LIVER +LIVERIED +LIVERMORE +LIVERPOOL +LIVERPUDLIAN +LIVERS +LIVERY +LIVES +LIVESTOCK +LIVID +LIVING +LIVINGSTON +LIZ +LIZARD +LIZARDS +LIZZIE +LIZZY +LLOYD +LOAD +LOADED +LOADER +LOADERS +LOADING +LOADINGS +LOADS +LOAF +LOAFED +LOAFER +LOAN +LOANED +LOANING +LOANS +LOATH +LOATHE +LOATHED +LOATHING +LOATHLY +LOATHSOME +LOAVES +LOBBIED +LOBBIES +LOBBY +LOBBYING +LOBE +LOBES +LOBSTER +LOBSTERS +LOCAL +LOCALITIES +LOCALITY +LOCALIZATION +LOCALIZE +LOCALIZED +LOCALIZES +LOCALIZING +LOCALLY +LOCALS +LOCATE +LOCATED +LOCATES +LOCATING +LOCATION +LOCATIONS +LOCATIVE +LOCATIVES +LOCATOR +LOCATORS +LOCI +LOCK +LOCKE +LOCKED +LOCKER +LOCKERS +LOCKHART +LOCKHEED +LOCKIAN +LOCKING +LOCKINGS +LOCKOUT +LOCKOUTS +LOCKS +LOCKSMITH +LOCKSTEP +LOCKUP +LOCKUPS +LOCKWOOD +LOCOMOTION +LOCOMOTIVE +LOCOMOTIVES +LOCUS +LOCUST +LOCUSTS +LODGE +LODGED +LODGER +LODGES +LODGING +LODGINGS +LODOWICK +LOEB +LOFT +LOFTINESS +LOFTS +LOFTY +LOGAN +LOGARITHM +LOGARITHMIC +LOGARITHMICALLY +LOGARITHMS +LOGGED +LOGGER +LOGGERS +LOGGING +LOGIC +LOGICAL +LOGICALLY +LOGICIAN +LOGICIANS +LOGICS +LOGIN +LOGINS +LOGISTIC +LOGISTICS +LOGJAM +LOGO +LOGS +LOIN +LOINCLOTH +LOINS +LOIRE +LOIS +LOITER +LOITERED +LOITERER +LOITERING +LOITERS +LOKI +LOLA +LOMB +LOMBARD +LOMBARDY +LOME +LONDON +LONDONDERRY +LONDONER +LONDONIZATION +LONDONIZATIONS +LONDONIZE +LONDONIZES +LONE +LONELIER +LONELIEST +LONELINESS +LONELY +LONER +LONERS +LONESOME +LONG +LONGED +LONGER +LONGEST +LONGEVITY +LONGFELLOW +LONGHAND +LONGING +LONGINGS +LONGITUDE +LONGITUDES +LONGS +LONGSTANDING +LONGSTREET +LOOK +LOOKAHEAD +LOOKED +LOOKER +LOOKERS +LOOKING +LOOKOUT +LOOKS +LOOKUP +LOOKUPS +LOOM +LOOMED +LOOMING +LOOMIS +LOOMS +LOON +LOOP +LOOPED +LOOPHOLE +LOOPHOLES +LOOPING +LOOPS +LOOSE +LOOSED +LOOSELEAF +LOOSELY +LOOSEN +LOOSENED +LOOSENESS +LOOSENING +LOOSENS +LOOSER +LOOSES +LOOSEST +LOOSING +LOOT +LOOTED +LOOTER +LOOTING +LOOTS +LOPEZ +LOPSIDED +LORD +LORDLY +LORDS +LORDSHIP +LORE +LORELEI +LOREN +LORENTZIAN +LORENZ +LORETTA +LORINDA +LORRAINE +LORRY +LOS +LOSE +LOSER +LOSERS +LOSES +LOSING +LOSS +LOSSES +LOSSIER +LOSSIEST +LOSSY +LOST +LOT +LOTHARIO +LOTION +LOTS +LOTTE +LOTTERY +LOTTIE +LOTUS +LOU +LOUD +LOUDER +LOUDEST +LOUDLY +LOUDNESS +LOUDSPEAKER +LOUDSPEAKERS +LOUIS +LOUISA +LOUISE +LOUISIANA +LOUISIANAN +LOUISVILLE +LOUNGE +LOUNGED +LOUNGES +LOUNGING +LOUNSBURY +LOURDES +LOUSE +LOUSY +LOUT +LOUVRE +LOVABLE +LOVABLY +LOVE +LOVED +LOVEJOY +LOVELACE +LOVELAND +LOVELIER +LOVELIES +LOVELIEST +LOVELINESS +LOVELORN +LOVELY +LOVER +LOVERS +LOVES +LOVING +LOVINGLY +LOW +LOWE +LOWELL +LOWER +LOWERED +LOWERING +LOWERS +LOWEST +LOWLAND +LOWLANDS +LOWLIEST +LOWLY +LOWNESS +LOWRY +LOWS +LOY +LOYAL +LOYALLY +LOYALTIES +LOYALTY +LOYOLA +LUBBOCK +LUBELL +LUBRICANT +LUBRICATE +LUBRICATION +LUCAS +LUCERNE +LUCIA +LUCIAN +LUCID +LUCIEN +LUCIFER +LUCILLE +LUCIUS +LUCK +LUCKED +LUCKIER +LUCKIEST +LUCKILY +LUCKLESS +LUCKS +LUCKY +LUCRATIVE +LUCRETIA +LUCRETIUS +LUCY +LUDICROUS +LUDICROUSLY +LUDICROUSNESS +LUDLOW +LUDMILLA +LUDWIG +LUFTHANSA +LUFTWAFFE +LUGGAGE +LUIS +LUKE +LUKEWARM +LULL +LULLABY +LULLED +LULLS +LUMBER +LUMBERED +LUMBERING +LUMINOUS +LUMINOUSLY +LUMMOX +LUMP +LUMPED +LUMPING +LUMPS +LUMPUR +LUMPY +LUNAR +LUNATIC +LUNCH +LUNCHED +LUNCHEON +LUNCHEONS +LUNCHES +LUNCHING +LUND +LUNDBERG +LUNDQUIST +LUNG +LUNGED +LUNGS +LURA +LURCH +LURCHED +LURCHES +LURCHING +LURE +LURED +LURES +LURING +LURK +LURKED +LURKING +LURKS +LUSAKA +LUSCIOUS +LUSCIOUSLY +LUSCIOUSNESS +LUSH +LUST +LUSTER +LUSTFUL +LUSTILY +LUSTINESS +LUSTROUS +LUSTS +LUSTY +LUTE +LUTES +LUTHER +LUTHERAN +LUTHERANIZE +LUTHERANIZER +LUTHERANIZERS +LUTHERANIZES +LUTZ +LUXEMBOURG +LUXEMBURG +LUXURIANT +LUXURIANTLY +LUXURIES +LUXURIOUS +LUXURIOUSLY +LUXURY +LUZON +LYDIA +LYING +LYKES +LYLE +LYMAN +LYMPH +LYNCH +LYNCHBURG +LYNCHED +LYNCHER +LYNCHES +LYNDON +LYNN +LYNX +LYNXES +LYON +LYONS +LYRA +LYRE +LYRIC +LYRICS +LYSENKO +MABEL +MAC +MACADAMIA +MACARTHUR +MACARTHUR +MACASSAR +MACAULAY +MACAULAYAN +MACAULAYISM +MACAULAYISMS +MACBETH +MACDONALD +MACDONALD +MACDOUGALL +MACDOUGALL +MACDRAW +MACE +MACED +MACEDON +MACEDONIA +MACEDONIAN +MACES +MACGREGOR +MACGREGOR +MACH +MACHIAVELLI +MACHIAVELLIAN +MACHINATION +MACHINE +MACHINED +MACHINELIKE +MACHINERY +MACHINES +MACHINING +MACHO +MACINTOSH +MACINTOSH +MACINTOSH +MACKENZIE +MACKENZIE +MACKEREL +MACKEY +MACKINAC +MACKINAW +MACMAHON +MACMILLAN +MACMILLAN +MACON +MACPAINT +MACRO +MACROECONOMICS +MACROMOLECULE +MACROMOLECULES +MACROPHAGE +MACROS +MACROSCOPIC +MAD +MADAGASCAR +MADAM +MADAME +MADAMES +MADDEN +MADDENING +MADDER +MADDEST +MADDOX +MADE +MADEIRA +MADELEINE +MADELINE +MADHOUSE +MADHYA +MADISON +MADLY +MADMAN +MADMEN +MADNESS +MADONNA +MADONNAS +MADRAS +MADRID +MADSEN +MAE +MAELSTROM +MAESTRO +MAFIA +MAFIOSI +MAGAZINE +MAGAZINES +MAGDALENE +MAGELLAN +MAGELLANIC +MAGENTA +MAGGIE +MAGGOT +MAGGOTS +MAGIC +MAGICAL +MAGICALLY +MAGICIAN +MAGICIANS +MAGILL +MAGISTRATE +MAGISTRATES +MAGNA +MAGNESIUM +MAGNET +MAGNETIC +MAGNETICALLY +MAGNETISM +MAGNETISMS +MAGNETIZABLE +MAGNETIZED +MAGNETO +MAGNIFICATION +MAGNIFICENCE +MAGNIFICENT +MAGNIFICENTLY +MAGNIFIED +MAGNIFIER +MAGNIFIES +MAGNIFY +MAGNIFYING +MAGNITUDE +MAGNITUDES +MAGNOLIA +MAGNUM +MAGNUSON +MAGOG +MAGPIE +MAGRUDER +MAGUIRE +MAGUIRES +MAHARASHTRA +MAHAYANA +MAHAYANIST +MAHOGANY +MAHONEY +MAID +MAIDEN +MAIDENS +MAIDS +MAIER +MAIL +MAILABLE +MAILBOX +MAILBOXES +MAILED +MAILER +MAILING +MAILINGS +MAILMAN +MAILMEN +MAILS +MAIM +MAIMED +MAIMING +MAIMS +MAIN +MAINE +MAINFRAME +MAINFRAMES +MAINLAND +MAINLINE +MAINLY +MAINS +MAINSTAY +MAINSTREAM +MAINTAIN +MAINTAINABILITY +MAINTAINABLE +MAINTAINED +MAINTAINER +MAINTAINERS +MAINTAINING +MAINTAINS +MAINTENANCE +MAINTENANCES +MAIZE +MAJESTIC +MAJESTIES +MAJESTY +MAJOR +MAJORCA +MAJORED +MAJORING +MAJORITIES +MAJORITY +MAJORS +MAKABLE +MAKE +MAKER +MAKERS +MAKES +MAKESHIFT +MAKEUP +MAKEUPS +MAKING +MAKINGS +MALABAR +MALADIES +MALADY +MALAGASY +MALAMUD +MALARIA +MALAWI +MALAY +MALAYIZE +MALAYIZES +MALAYSIA +MALAYSIAN +MALCOLM +MALCONTENT +MALDEN +MALDIVE +MALE +MALEFACTOR +MALEFACTORS +MALENESS +MALES +MALEVOLENT +MALFORMED +MALFUNCTION +MALFUNCTIONED +MALFUNCTIONING +MALFUNCTIONS +MALI +MALIBU +MALICE +MALICIOUS +MALICIOUSLY +MALICIOUSNESS +MALIGN +MALIGNANT +MALIGNANTLY +MALL +MALLARD +MALLET +MALLETS +MALLORY +MALNUTRITION +MALONE +MALONEY +MALPRACTICE +MALRAUX +MALT +MALTA +MALTED +MALTESE +MALTHUS +MALTHUSIAN +MALTON +MALTS +MAMA +MAMMA +MAMMAL +MAMMALIAN +MAMMALS +MAMMAS +MAMMOTH +MAN +MANAGE +MANAGEABLE +MANAGEABLENESS +MANAGED +MANAGEMENT +MANAGEMENTS +MANAGER +MANAGERIAL +MANAGERS +MANAGES +MANAGING +MANAGUA +MANAMA +MANCHESTER +MANCHURIA +MANDARIN +MANDATE +MANDATED +MANDATES +MANDATING +MANDATORY +MANDELBROT +MANDIBLE +MANE +MANES +MANEUVER +MANEUVERED +MANEUVERING +MANEUVERS +MANFRED +MANGER +MANGERS +MANGLE +MANGLED +MANGLER +MANGLES +MANGLING +MANHATTAN +MANHATTANIZE +MANHATTANIZES +MANHOLE +MANHOOD +MANIA +MANIAC +MANIACAL +MANIACS +MANIC +MANICURE +MANICURED +MANICURES +MANICURING +MANIFEST +MANIFESTATION +MANIFESTATIONS +MANIFESTED +MANIFESTING +MANIFESTLY +MANIFESTS +MANIFOLD +MANIFOLDS +MANILA +MANIPULABILITY +MANIPULABLE +MANIPULATABLE +MANIPULATE +MANIPULATED +MANIPULATES +MANIPULATING +MANIPULATION +MANIPULATIONS +MANIPULATIVE +MANIPULATOR +MANIPULATORS +MANIPULATORY +MANITOBA +MANITOWOC +MANKIND +MANKOWSKI +MANLEY +MANLY +MANN +MANNED +MANNER +MANNERED +MANNERLY +MANNERS +MANNING +MANOMETER +MANOMETERS +MANOR +MANORS +MANPOWER +MANS +MANSFIELD +MANSION +MANSIONS +MANSLAUGHTER +MANTEL +MANTELS +MANTIS +MANTISSA +MANTISSAS +MANTLE +MANTLEPIECE +MANTLES +MANUAL +MANUALLY +MANUALS +MANUEL +MANUFACTURE +MANUFACTURED +MANUFACTURER +MANUFACTURERS +MANUFACTURES +MANUFACTURING +MANURE +MANUSCRIPT +MANUSCRIPTS +MANVILLE +MANY +MAO +MAORI +MAP +MAPLE +MAPLECREST +MAPLES +MAPPABLE +MAPPED +MAPPING +MAPPINGS +MAPS +MARATHON +MARBLE +MARBLES +MARBLING +MARC +MARCEAU +MARCEL +MARCELLO +MARCH +MARCHED +MARCHER +MARCHES +MARCHING +MARCIA +MARCO +MARCOTTE +MARCUS +MARCY +MARDI +MARDIS +MARE +MARES +MARGARET +MARGARINE +MARGERY +MARGIN +MARGINAL +MARGINALLY +MARGINS +MARGO +MARGUERITE +MARIANNE +MARIE +MARIETTA +MARIGOLD +MARIJUANA +MARILYN +MARIN +MARINA +MARINADE +MARINATE +MARINE +MARINER +MARINES +MARINO +MARIO +MARION +MARIONETTE +MARITAL +MARITIME +MARJORIE +MARJORY +MARK +MARKABLE +MARKED +MARKEDLY +MARKER +MARKERS +MARKET +MARKETABILITY +MARKETABLE +MARKETED +MARKETING +MARKETINGS +MARKETPLACE +MARKETPLACES +MARKETS +MARKHAM +MARKING +MARKINGS +MARKISM +MARKOV +MARKOVIAN +MARKOVITZ +MARKS +MARLBORO +MARLBOROUGH +MARLENE +MARLOWE +MARMALADE +MARMOT +MAROON +MARQUETTE +MARQUIS +MARRIAGE +MARRIAGEABLE +MARRIAGES +MARRIED +MARRIES +MARRIOTT +MARROW +MARRY +MARRYING +MARS +MARSEILLES +MARSH +MARSHA +MARSHAL +MARSHALED +MARSHALING +MARSHALL +MARSHALLED +MARSHALLING +MARSHALS +MARSHES +MARSHMALLOW +MART +MARTEN +MARTHA +MARTIAL +MARTIAN +MARTIANS +MARTINEZ +MARTINGALE +MARTINI +MARTINIQUE +MARTINSON +MARTS +MARTY +MARTYR +MARTYRDOM +MARTYRS +MARVEL +MARVELED +MARVELLED +MARVELLING +MARVELOUS +MARVELOUSLY +MARVELOUSNESS +MARVELS +MARVIN +MARX +MARXIAN +MARXISM +MARXISMS +MARXIST +MARY +MARYLAND +MARYLANDERS +MASCARA +MASCULINE +MASCULINELY +MASCULINITY +MASERU +MASH +MASHED +MASHES +MASHING +MASK +MASKABLE +MASKED +MASKER +MASKING +MASKINGS +MASKS +MASOCHIST +MASOCHISTS +MASON +MASONIC +MASONITE +MASONRY +MASONS +MASQUERADE +MASQUERADER +MASQUERADES +MASQUERADING +MASS +MASSACHUSETTS +MASSACRE +MASSACRED +MASSACRES +MASSAGE +MASSAGES +MASSAGING +MASSED +MASSES +MASSEY +MASSING +MASSIVE +MAST +MASTED +MASTER +MASTERED +MASTERFUL +MASTERFULLY +MASTERING +MASTERINGS +MASTERLY +MASTERMIND +MASTERPIECE +MASTERPIECES +MASTERS +MASTERY +MASTODON +MASTS +MASTURBATE +MASTURBATED +MASTURBATES +MASTURBATING +MASTURBATION +MAT +MATCH +MATCHABLE +MATCHED +MATCHER +MATCHERS +MATCHES +MATCHING +MATCHINGS +MATCHLESS +MATE +MATED +MATEO +MATER +MATERIAL +MATERIALIST +MATERIALIZE +MATERIALIZED +MATERIALIZES +MATERIALIZING +MATERIALLY +MATERIALS +MATERNAL +MATERNALLY +MATERNITY +MATES +MATH +MATHEMATICA +MATHEMATICAL +MATHEMATICALLY +MATHEMATICIAN +MATHEMATICIANS +MATHEMATICS +MATHEMATIK +MATHEWSON +MATHIAS +MATHIEU +MATILDA +MATING +MATINGS +MATISSE +MATISSES +MATRIARCH +MATRIARCHAL +MATRICES +MATRICULATE +MATRICULATION +MATRIMONIAL +MATRIMONY +MATRIX +MATROID +MATRON +MATRONLY +MATS +MATSON +MATSUMOTO +MATT +MATTED +MATTER +MATTERED +MATTERS +MATTHEW +MATTHEWS +MATTIE +MATTRESS +MATTRESSES +MATTSON +MATURATION +MATURE +MATURED +MATURELY +MATURES +MATURING +MATURITIES +MATURITY +MAUDE +MAUL +MAUREEN +MAURICE +MAURICIO +MAURINE +MAURITANIA +MAURITIUS +MAUSOLEUM +MAVERICK +MAVIS +MAWR +MAX +MAXIM +MAXIMA +MAXIMAL +MAXIMALLY +MAXIMILIAN +MAXIMIZE +MAXIMIZED +MAXIMIZER +MAXIMIZERS +MAXIMIZES +MAXIMIZING +MAXIMS +MAXIMUM +MAXIMUMS +MAXINE +MAXTOR +MAXWELL +MAXWELLIAN +MAY +MAYA +MAYANS +MAYBE +MAYER +MAYFAIR +MAYFLOWER +MAYHAP +MAYHEM +MAYNARD +MAYO +MAYONNAISE +MAYOR +MAYORAL +MAYORS +MAZDA +MAZE +MAZES +MBABANE +MCADAM +MCADAMS +MCALLISTER +MCBRIDE +MCCABE +MCCALL +MCCALLUM +MCCANN +MCCARTHY +MCCARTY +MCCAULEY +MCCLAIN +MCCLELLAN +MCCLURE +MCCLUSKEY +MCCONNEL +MCCONNELL +MCCORMICK +MCCOY +MCCRACKEN +MCCULLOUGH +MCDANIEL +MCDERMOTT +MCDONALD +MCDONNELL +MCDOUGALL +MCDOWELL +MCELHANEY +MCELROY +MCFADDEN +MCFARLAND +MCGEE +MCGILL +MCGINNIS +MCGOVERN +MCGOWAN +MCGRATH +MCGRAW +MCGREGOR +MCGUIRE +MCHUGH +MCINTOSH +MCINTYRE +MCKAY +MCKEE +MCKENNA +MCKENZIE +MCKEON +MCKESSON +MCKINLEY +MCKINNEY +MCKNIGHT +MCLANAHAN +MCLAUGHLIN +MCLEAN +MCLEOD +MCMAHON +MCMARTIN +MCMILLAN +MCMULLEN +MCNALLY +MCNAUGHTON +MCNEIL +MCNULTY +MCPHERSON +MEAD +MEADOW +MEADOWS +MEAGER +MEAGERLY +MEAGERNESS +MEAL +MEALS +MEALTIME +MEALY +MEAN +MEANDER +MEANDERED +MEANDERING +MEANDERS +MEANER +MEANEST +MEANING +MEANINGFUL +MEANINGFULLY +MEANINGFULNESS +MEANINGLESS +MEANINGLESSLY +MEANINGLESSNESS +MEANINGS +MEANLY +MEANNESS +MEANS +MEANT +MEANTIME +MEANWHILE +MEASLE +MEASLES +MEASURABLE +MEASURABLY +MEASURE +MEASURED +MEASUREMENT +MEASUREMENTS +MEASURER +MEASURES +MEASURING +MEAT +MEATS +MEATY +MECCA +MECHANIC +MECHANICAL +MECHANICALLY +MECHANICS +MECHANISM +MECHANISMS +MECHANIZATION +MECHANIZATIONS +MECHANIZE +MECHANIZED +MECHANIZES +MECHANIZING +MEDAL +MEDALLION +MEDALLIONS +MEDALS +MEDDLE +MEDDLED +MEDDLER +MEDDLES +MEDDLING +MEDEA +MEDFIELD +MEDFORD +MEDIA +MEDIAN +MEDIANS +MEDIATE +MEDIATED +MEDIATES +MEDIATING +MEDIATION +MEDIATIONS +MEDIATOR +MEDIC +MEDICAID +MEDICAL +MEDICALLY +MEDICARE +MEDICI +MEDICINAL +MEDICINALLY +MEDICINE +MEDICINES +MEDICIS +MEDICS +MEDIEVAL +MEDIOCRE +MEDIOCRITY +MEDITATE +MEDITATED +MEDITATES +MEDITATING +MEDITATION +MEDITATIONS +MEDITATIVE +MEDITERRANEAN +MEDITERRANEANIZATION +MEDITERRANEANIZATIONS +MEDITERRANEANIZE +MEDITERRANEANIZES +MEDIUM +MEDIUMS +MEDLEY +MEDUSA +MEDUSAN +MEEK +MEEKER +MEEKEST +MEEKLY +MEEKNESS +MEET +MEETING +MEETINGHOUSE +MEETINGS +MEETS +MEG +MEGABAUD +MEGABIT +MEGABITS +MEGABYTE +MEGABYTES +MEGAHERTZ +MEGALOMANIA +MEGATON +MEGAVOLT +MEGAWATT +MEGAWORD +MEGAWORDS +MEGOHM +MEIER +MEIJI +MEISTER +MEISTERSINGER +MEKONG +MEL +MELAMPUS +MELANCHOLY +MELANESIA +MELANESIAN +MELANIE +MELBOURNE +MELCHER +MELINDA +MELISANDE +MELISSA +MELLON +MELLOW +MELLOWED +MELLOWING +MELLOWNESS +MELLOWS +MELODIES +MELODIOUS +MELODIOUSLY +MELODIOUSNESS +MELODRAMA +MELODRAMAS +MELODRAMATIC +MELODY +MELON +MELONS +MELPOMENE +MELT +MELTED +MELTING +MELTINGLY +MELTS +MELVILLE +MELVIN +MEMBER +MEMBERS +MEMBERSHIP +MEMBERSHIPS +MEMBRANE +MEMENTO +MEMO +MEMOIR +MEMOIRS +MEMORABILIA +MEMORABLE +MEMORABLENESS +MEMORANDA +MEMORANDUM +MEMORIAL +MEMORIALLY +MEMORIALS +MEMORIES +MEMORIZATION +MEMORIZE +MEMORIZED +MEMORIZER +MEMORIZES +MEMORIZING +MEMORY +MEMORYLESS +MEMOS +MEMPHIS +MEN +MENACE +MENACED +MENACING +MENAGERIE +MENARCHE +MENCKEN +MEND +MENDACIOUS +MENDACITY +MENDED +MENDEL +MENDELIAN +MENDELIZE +MENDELIZES +MENDELSSOHN +MENDER +MENDING +MENDOZA +MENDS +MENELAUS +MENIAL +MENIALS +MENLO +MENNONITE +MENNONITES +MENOMINEE +MENORCA +MENS +MENSCH +MENSTRUATE +MENSURABLE +MENSURATION +MENTAL +MENTALITIES +MENTALITY +MENTALLY +MENTION +MENTIONABLE +MENTIONED +MENTIONER +MENTIONERS +MENTIONING +MENTIONS +MENTOR +MENTORS +MENU +MENUS +MENZIES +MEPHISTOPHELES +MERCANTILE +MERCATOR +MERCEDES +MERCENARIES +MERCENARINESS +MERCENARY +MERCHANDISE +MERCHANDISER +MERCHANDISING +MERCHANT +MERCHANTS +MERCIFUL +MERCIFULLY +MERCILESS +MERCILESSLY +MERCK +MERCURIAL +MERCURY +MERCY +MERE +MEREDITH +MERELY +MEREST +MERGE +MERGED +MERGER +MERGERS +MERGES +MERGING +MERIDIAN +MERINGUE +MERIT +MERITED +MERITING +MERITORIOUS +MERITORIOUSLY +MERITORIOUSNESS +MERITS +MERIWETHER +MERLE +MERMAID +MERRIAM +MERRICK +MERRIEST +MERRILL +MERRILY +MERRIMAC +MERRIMACK +MERRIMENT +MERRITT +MERRY +MERRYMAKE +MERVIN +MESCALINE +MESH +MESON +MESOPOTAMIA +MESOZOIC +MESQUITE +MESS +MESSAGE +MESSAGES +MESSED +MESSENGER +MESSENGERS +MESSES +MESSIAH +MESSIAHS +MESSIER +MESSIEST +MESSILY +MESSINESS +MESSING +MESSY +MET +META +METABOLIC +METABOLISM +METACIRCULAR +METACIRCULARITY +METAL +METALANGUAGE +METALLIC +METALLIZATION +METALLIZATIONS +METALLURGY +METALS +METAMATHEMATICAL +METAMORPHOSIS +METAPHOR +METAPHORICAL +METAPHORICALLY +METAPHORS +METAPHYSICAL +METAPHYSICALLY +METAPHYSICS +METAVARIABLE +METCALF +METE +METED +METEOR +METEORIC +METEORITE +METEORITIC +METEOROLOGY +METEORS +METER +METERING +METERS +METES +METHANE +METHOD +METHODICAL +METHODICALLY +METHODICALNESS +METHODISM +METHODIST +METHODISTS +METHODOLOGICAL +METHODOLOGICALLY +METHODOLOGIES +METHODOLOGISTS +METHODOLOGY +METHODS +METHUEN +METHUSELAH +METHUSELAHS +METICULOUSLY +METING +METRECAL +METRIC +METRICAL +METRICS +METRO +METRONOME +METROPOLIS +METROPOLITAN +METS +METTLE +METTLESOME +METZLER +MEW +MEWED +MEWS +MEXICAN +MEXICANIZE +MEXICANIZES +MEXICANS +MEXICO +MEYER +MEYERS +MIAMI +MIASMA +MICA +MICE +MICHAEL +MICHAELS +MICHEL +MICHELANGELO +MICHELE +MICHELIN +MICHELSON +MICHIGAN +MICK +MICKEY +MICKIE +MICKY +MICRO +MICROARCHITECTS +MICROARCHITECTURE +MICROARCHITECTURES +MICROBIAL +MICROBICIDAL +MICROBICIDE +MICROCODE +MICROCODED +MICROCODES +MICROCODING +MICROCOMPUTER +MICROCOMPUTERS +MICROCOSM +MICROCYCLE +MICROCYCLES +MICROECONOMICS +MICROELECTRONICS +MICROFILM +MICROFILMS +MICROFINANCE +MICROGRAMMING +MICROINSTRUCTION +MICROINSTRUCTIONS +MICROJUMP +MICROJUMPS +MICROLEVEL +MICRON +MICRONESIA +MICRONESIAN +MICROOPERATIONS +MICROPHONE +MICROPHONES +MICROPHONING +MICROPORT +MICROPROCEDURE +MICROPROCEDURES +MICROPROCESSING +MICROPROCESSOR +MICROPROCESSORS +MICROPROGRAM +MICROPROGRAMMABLE +MICROPROGRAMMED +MICROPROGRAMMER +MICROPROGRAMMING +MICROPROGRAMS +MICROS +MICROSCOPE +MICROSCOPES +MICROSCOPIC +MICROSCOPY +MICROSECOND +MICROSECONDS +MICROSOFT +MICROSTORE +MICROSYSTEMS +MICROVAX +MICROVAXES +MICROWAVE +MICROWAVES +MICROWORD +MICROWORDS +MID +MIDAS +MIDDAY +MIDDLE +MIDDLEBURY +MIDDLEMAN +MIDDLEMEN +MIDDLES +MIDDLESEX +MIDDLETON +MIDDLETOWN +MIDDLING +MIDGET +MIDLANDIZE +MIDLANDIZES +MIDNIGHT +MIDNIGHTS +MIDPOINT +MIDPOINTS +MIDRANGE +MIDSCALE +MIDSECTION +MIDSHIPMAN +MIDSHIPMEN +MIDST +MIDSTREAM +MIDSTS +MIDSUMMER +MIDWAY +MIDWEEK +MIDWEST +MIDWESTERN +MIDWESTERNER +MIDWESTERNERS +MIDWIFE +MIDWINTER +MIDWIVES +MIEN +MIGHT +MIGHTIER +MIGHTIEST +MIGHTILY +MIGHTINESS +MIGHTY +MIGRANT +MIGRATE +MIGRATED +MIGRATES +MIGRATING +MIGRATION +MIGRATIONS +MIGRATORY +MIGUEL +MIKE +MIKHAIL +MIKOYAN +MILAN +MILD +MILDER +MILDEST +MILDEW +MILDLY +MILDNESS +MILDRED +MILE +MILEAGE +MILES +MILESTONE +MILESTONES +MILITANT +MILITANTLY +MILITARILY +MILITARISM +MILITARY +MILITIA +MILK +MILKED +MILKER +MILKERS +MILKINESS +MILKING +MILKMAID +MILKMAIDS +MILKS +MILKY +MILL +MILLARD +MILLED +MILLENNIUM +MILLER +MILLET +MILLIAMMETER +MILLIAMPERE +MILLIE +MILLIJOULE +MILLIKAN +MILLIMETER +MILLIMETERS +MILLINERY +MILLING +MILLINGTON +MILLION +MILLIONAIRE +MILLIONAIRES +MILLIONS +MILLIONTH +MILLIPEDE +MILLIPEDES +MILLISECOND +MILLISECONDS +MILLIVOLT +MILLIVOLTMETER +MILLIWATT +MILLS +MILLSTONE +MILLSTONES +MILNE +MILQUETOAST +MILQUETOASTS +MILTON +MILTONIAN +MILTONIC +MILTONISM +MILTONIST +MILTONIZE +MILTONIZED +MILTONIZES +MILTONIZING +MILWAUKEE +MIMEOGRAPH +MIMI +MIMIC +MIMICKED +MIMICKING +MIMICS +MINARET +MINCE +MINCED +MINCEMEAT +MINCES +MINCING +MIND +MINDANAO +MINDED +MINDFUL +MINDFULLY +MINDFULNESS +MINDING +MINDLESS +MINDLESSLY +MINDS +MINE +MINED +MINEFIELD +MINER +MINERAL +MINERALS +MINERS +MINERVA +MINES +MINESWEEPER +MINGLE +MINGLED +MINGLES +MINGLING +MINI +MINIATURE +MINIATURES +MINIATURIZATION +MINIATURIZE +MINIATURIZED +MINIATURIZES +MINIATURIZING +MINICOMPUTER +MINICOMPUTERS +MINIMA +MINIMAL +MINIMALLY +MINIMAX +MINIMIZATION +MINIMIZATIONS +MINIMIZE +MINIMIZED +MINIMIZER +MINIMIZERS +MINIMIZES +MINIMIZING +MINIMUM +MINING +MINION +MINIS +MINISTER +MINISTERED +MINISTERING +MINISTERS +MINISTRIES +MINISTRY +MINK +MINKS +MINNEAPOLIS +MINNESOTA +MINNIE +MINNOW +MINNOWS +MINOAN +MINOR +MINORING +MINORITIES +MINORITY +MINORS +MINOS +MINOTAUR +MINSK +MINSKY +MINSTREL +MINSTRELS +MINT +MINTED +MINTER +MINTING +MINTS +MINUEND +MINUET +MINUS +MINUSCULE +MINUTE +MINUTELY +MINUTEMAN +MINUTEMEN +MINUTENESS +MINUTER +MINUTES +MIOCENE +MIPS +MIRA +MIRACLE +MIRACLES +MIRACULOUS +MIRACULOUSLY +MIRAGE +MIRANDA +MIRE +MIRED +MIRES +MIRFAK +MIRIAM +MIRROR +MIRRORED +MIRRORING +MIRRORS +MIRTH +MISANTHROPE +MISBEHAVING +MISCALCULATION +MISCALCULATIONS +MISCARRIAGE +MISCARRY +MISCEGENATION +MISCELLANEOUS +MISCELLANEOUSLY +MISCELLANEOUSNESS +MISCHIEF +MISCHIEVOUS +MISCHIEVOUSLY +MISCHIEVOUSNESS +MISCONCEPTION +MISCONCEPTIONS +MISCONDUCT +MISCONSTRUE +MISCONSTRUED +MISCONSTRUES +MISDEMEANORS +MISER +MISERABLE +MISERABLENESS +MISERABLY +MISERIES +MISERLY +MISERS +MISERY +MISFIT +MISFITS +MISFORTUNE +MISFORTUNES +MISGIVING +MISGIVINGS +MISGUIDED +MISHAP +MISHAPS +MISINFORMED +MISJUDGED +MISJUDGMENT +MISLEAD +MISLEADING +MISLEADS +MISLED +MISMANAGEMENT +MISMATCH +MISMATCHED +MISMATCHES +MISMATCHING +MISNOMER +MISPLACE +MISPLACED +MISPLACES +MISPLACING +MISPRONUNCIATION +MISREPRESENTATION +MISREPRESENTATIONS +MISS +MISSED +MISSES +MISSHAPEN +MISSILE +MISSILES +MISSING +MISSION +MISSIONARIES +MISSIONARY +MISSIONER +MISSIONS +MISSISSIPPI +MISSISSIPPIAN +MISSISSIPPIANS +MISSIVE +MISSOULA +MISSOURI +MISSPELL +MISSPELLED +MISSPELLING +MISSPELLINGS +MISSPELLS +MISSY +MIST +MISTAKABLE +MISTAKE +MISTAKEN +MISTAKENLY +MISTAKES +MISTAKING +MISTED +MISTER +MISTERS +MISTINESS +MISTING +MISTLETOE +MISTRESS +MISTRUST +MISTRUSTED +MISTS +MISTY +MISTYPE +MISTYPED +MISTYPES +MISTYPING +MISUNDERSTAND +MISUNDERSTANDER +MISUNDERSTANDERS +MISUNDERSTANDING +MISUNDERSTANDINGS +MISUNDERSTOOD +MISUSE +MISUSED +MISUSES +MISUSING +MITCH +MITCHELL +MITER +MITIGATE +MITIGATED +MITIGATES +MITIGATING +MITIGATION +MITIGATIVE +MITRE +MITRES +MITTEN +MITTENS +MIX +MIXED +MIXER +MIXERS +MIXES +MIXING +MIXTURE +MIXTURES +MIXUP +MIZAR +MNEMONIC +MNEMONICALLY +MNEMONICS +MOAN +MOANED +MOANS +MOAT +MOATS +MOB +MOBIL +MOBILE +MOBILITY +MOBS +MOBSTER +MOCCASIN +MOCCASINS +MOCK +MOCKED +MOCKER +MOCKERY +MOCKING +MOCKINGBIRD +MOCKS +MOCKUP +MODAL +MODALITIES +MODALITY +MODALLY +MODE +MODEL +MODELED +MODELING +MODELINGS +MODELS +MODEM +MODEMS +MODERATE +MODERATED +MODERATELY +MODERATENESS +MODERATES +MODERATING +MODERATION +MODERN +MODERNITY +MODERNIZE +MODERNIZED +MODERNIZER +MODERNIZING +MODERNLY +MODERNNESS +MODERNS +MODES +MODEST +MODESTLY +MODESTO +MODESTY +MODICUM +MODIFIABILITY +MODIFIABLE +MODIFICATION +MODIFICATIONS +MODIFIED +MODIFIER +MODIFIERS +MODIFIES +MODIFY +MODIFYING +MODULA +MODULAR +MODULARITY +MODULARIZATION +MODULARIZE +MODULARIZED +MODULARIZES +MODULARIZING +MODULARLY +MODULATE +MODULATED +MODULATES +MODULATING +MODULATION +MODULATIONS +MODULATOR +MODULATORS +MODULE +MODULES +MODULI +MODULO +MODULUS +MODUS +MOE +MOEN +MOGADISCIO +MOGADISHU +MOGHUL +MOHAMMED +MOHAMMEDAN +MOHAMMEDANISM +MOHAMMEDANIZATION +MOHAMMEDANIZATIONS +MOHAMMEDANIZE +MOHAMMEDANIZES +MOHAWK +MOHR +MOINES +MOISEYEV +MOIST +MOISTEN +MOISTLY +MOISTNESS +MOISTURE +MOLAR +MOLASSES +MOLD +MOLDAVIA +MOLDED +MOLDER +MOLDING +MOLDS +MOLE +MOLECULAR +MOLECULE +MOLECULES +MOLEHILL +MOLES +MOLEST +MOLESTED +MOLESTING +MOLESTS +MOLIERE +MOLINE +MOLL +MOLLIE +MOLLIFY +MOLLUSK +MOLLY +MOLLYCODDLE +MOLOCH +MOLOCHIZE +MOLOCHIZES +MOLOTOV +MOLTEN +MOLUCCAS +MOMENT +MOMENTARILY +MOMENTARINESS +MOMENTARY +MOMENTOUS +MOMENTOUSLY +MOMENTOUSNESS +MOMENTS +MOMENTUM +MOMMY +MONA +MONACO +MONADIC +MONARCH +MONARCHIES +MONARCHS +MONARCHY +MONASH +MONASTERIES +MONASTERY +MONASTIC +MONDAY +MONDAYS +MONET +MONETARISM +MONETARY +MONEY +MONEYED +MONEYS +MONFORT +MONGOLIA +MONGOLIAN +MONGOLIANISM +MONGOOSE +MONICA +MONITOR +MONITORED +MONITORING +MONITORS +MONK +MONKEY +MONKEYED +MONKEYING +MONKEYS +MONKISH +MONKS +MONMOUTH +MONOALPHABETIC +MONOCEROS +MONOCHROMATIC +MONOCHROME +MONOCOTYLEDON +MONOCULAR +MONOGAMOUS +MONOGAMY +MONOGRAM +MONOGRAMS +MONOGRAPH +MONOGRAPHES +MONOGRAPHS +MONOLITH +MONOLITHIC +MONOLOGUE +MONONGAHELA +MONOPOLIES +MONOPOLIZE +MONOPOLIZED +MONOPOLIZING +MONOPOLY +MONOPROGRAMMED +MONOPROGRAMMING +MONOSTABLE +MONOTHEISM +MONOTONE +MONOTONIC +MONOTONICALLY +MONOTONICITY +MONOTONOUS +MONOTONOUSLY +MONOTONOUSNESS +MONOTONY +MONROE +MONROVIA +MONSANTO +MONSOON +MONSTER +MONSTERS +MONSTROSITY +MONSTROUS +MONSTROUSLY +MONT +MONTAGUE +MONTAIGNE +MONTANA +MONTANAN +MONTCLAIR +MONTENEGRIN +MONTENEGRO +MONTEREY +MONTEVERDI +MONTEVIDEO +MONTGOMERY +MONTH +MONTHLY +MONTHS +MONTICELLO +MONTMARTRE +MONTPELIER +MONTRACHET +MONTREAL +MONTY +MONUMENT +MONUMENTAL +MONUMENTALLY +MONUMENTS +MOO +MOOD +MOODINESS +MOODS +MOODY +MOON +MOONED +MOONEY +MOONING +MOONLIGHT +MOONLIGHTER +MOONLIGHTING +MOONLIKE +MOONLIT +MOONS +MOONSHINE +MOOR +MOORE +MOORED +MOORING +MOORINGS +MOORISH +MOORS +MOOSE +MOOT +MOP +MOPED +MOPS +MORAINE +MORAL +MORALE +MORALITIES +MORALITY +MORALLY +MORALS +MORAN +MORASS +MORATORIUM +MORAVIA +MORAVIAN +MORAVIANIZED +MORAVIANIZEDS +MORBID +MORBIDLY +MORBIDNESS +MORE +MOREHOUSE +MORELAND +MOREOVER +MORES +MORESBY +MORGAN +MORIARTY +MORIBUND +MORLEY +MORMON +MORN +MORNING +MORNINGS +MOROCCAN +MOROCCO +MORON +MOROSE +MORPHINE +MORPHISM +MORPHISMS +MORPHOLOGICAL +MORPHOLOGY +MORRILL +MORRIS +MORRISON +MORRISSEY +MORRISTOWN +MORROW +MORSE +MORSEL +MORSELS +MORTAL +MORTALITY +MORTALLY +MORTALS +MORTAR +MORTARED +MORTARING +MORTARS +MORTEM +MORTGAGE +MORTGAGES +MORTICIAN +MORTIFICATION +MORTIFIED +MORTIFIES +MORTIFY +MORTIFYING +MORTIMER +MORTON +MOSAIC +MOSAICS +MOSCONE +MOSCOW +MOSER +MOSES +MOSLEM +MOSLEMIZE +MOSLEMIZES +MOSLEMS +MOSQUE +MOSQUITO +MOSQUITOES +MOSS +MOSSBERG +MOSSES +MOSSY +MOST +MOSTLY +MOTEL +MOTELS +MOTH +MOTHBALL +MOTHBALLS +MOTHER +MOTHERED +MOTHERER +MOTHERERS +MOTHERHOOD +MOTHERING +MOTHERLAND +MOTHERLY +MOTHERS +MOTIF +MOTIFS +MOTION +MOTIONED +MOTIONING +MOTIONLESS +MOTIONLESSLY +MOTIONLESSNESS +MOTIONS +MOTIVATE +MOTIVATED +MOTIVATES +MOTIVATING +MOTIVATION +MOTIVATIONS +MOTIVE +MOTIVES +MOTLEY +MOTOR +MOTORCAR +MOTORCARS +MOTORCYCLE +MOTORCYCLES +MOTORING +MOTORIST +MOTORISTS +MOTORIZE +MOTORIZED +MOTORIZES +MOTORIZING +MOTOROLA +MOTORS +MOTTO +MOTTOES +MOULD +MOULDING +MOULTON +MOUND +MOUNDED +MOUNDS +MOUNT +MOUNTABLE +MOUNTAIN +MOUNTAINEER +MOUNTAINEERING +MOUNTAINEERS +MOUNTAINOUS +MOUNTAINOUSLY +MOUNTAINS +MOUNTED +MOUNTER +MOUNTING +MOUNTINGS +MOUNTS +MOURN +MOURNED +MOURNER +MOURNERS +MOURNFUL +MOURNFULLY +MOURNFULNESS +MOURNING +MOURNS +MOUSE +MOUSER +MOUSES +MOUSETRAP +MOUSY +MOUTH +MOUTHE +MOUTHED +MOUTHES +MOUTHFUL +MOUTHING +MOUTHPIECE +MOUTHS +MOUTON +MOVABLE +MOVE +MOVED +MOVEMENT +MOVEMENTS +MOVER +MOVERS +MOVES +MOVIE +MOVIES +MOVING +MOVINGS +MOW +MOWED +MOWER +MOWS +MOYER +MOZART +MUCH +MUCK +MUCKER +MUCKING +MUCUS +MUD +MUDD +MUDDIED +MUDDINESS +MUDDLE +MUDDLED +MUDDLEHEAD +MUDDLER +MUDDLERS +MUDDLES +MUDDLING +MUDDY +MUELLER +MUENSTER +MUFF +MUFFIN +MUFFINS +MUFFLE +MUFFLED +MUFFLER +MUFFLES +MUFFLING +MUFFS +MUG +MUGGING +MUGS +MUHAMMAD +MUIR +MUKDEN +MULATTO +MULBERRIES +MULBERRY +MULE +MULES +MULL +MULLAH +MULLEN +MULTI +MULTIBIT +MULTIBUS +MULTIBYTE +MULTICAST +MULTICASTING +MULTICASTS +MULTICELLULAR +MULTICOMPUTER +MULTICS +MULTICS +MULTIDIMENSIONAL +MULTILATERAL +MULTILAYER +MULTILAYERED +MULTILEVEL +MULTIMEDIA +MULTINATIONAL +MULTIPLE +MULTIPLES +MULTIPLEX +MULTIPLEXED +MULTIPLEXER +MULTIPLEXERS +MULTIPLEXES +MULTIPLEXING +MULTIPLEXOR +MULTIPLEXORS +MULTIPLICAND +MULTIPLICANDS +MULTIPLICATION +MULTIPLICATIONS +MULTIPLICATIVE +MULTIPLICATIVES +MULTIPLICITY +MULTIPLIED +MULTIPLIER +MULTIPLIERS +MULTIPLIES +MULTIPLY +MULTIPLYING +MULTIPROCESS +MULTIPROCESSING +MULTIPROCESSOR +MULTIPROCESSORS +MULTIPROGRAM +MULTIPROGRAMMED +MULTIPROGRAMMING +MULTISTAGE +MULTITUDE +MULTITUDES +MULTIUSER +MULTIVARIATE +MULTIWORD +MUMBLE +MUMBLED +MUMBLER +MUMBLERS +MUMBLES +MUMBLING +MUMBLINGS +MUMFORD +MUMMIES +MUMMY +MUNCH +MUNCHED +MUNCHING +MUNCIE +MUNDANE +MUNDANELY +MUNDT +MUNG +MUNICH +MUNICIPAL +MUNICIPALITIES +MUNICIPALITY +MUNICIPALLY +MUNITION +MUNITIONS +MUNROE +MUNSEY +MUNSON +MUONG +MURAL +MURDER +MURDERED +MURDERER +MURDERERS +MURDERING +MURDEROUS +MURDEROUSLY +MURDERS +MURIEL +MURKY +MURMUR +MURMURED +MURMURER +MURMURING +MURMURS +MURPHY +MURRAY +MURROW +MUSCAT +MUSCLE +MUSCLED +MUSCLES +MUSCLING +MUSCOVITE +MUSCOVY +MUSCULAR +MUSCULATURE +MUSE +MUSED +MUSES +MUSEUM +MUSEUMS +MUSH +MUSHROOM +MUSHROOMED +MUSHROOMING +MUSHROOMS +MUSHY +MUSIC +MUSICAL +MUSICALLY +MUSICALS +MUSICIAN +MUSICIANLY +MUSICIANS +MUSICOLOGY +MUSING +MUSINGS +MUSK +MUSKEGON +MUSKET +MUSKETS +MUSKOX +MUSKOXEN +MUSKRAT +MUSKRATS +MUSKS +MUSLIM +MUSLIMS +MUSLIN +MUSSEL +MUSSELS +MUSSOLINI +MUSSOLINIS +MUSSORGSKY +MUST +MUSTACHE +MUSTACHED +MUSTACHES +MUSTARD +MUSTER +MUSTINESS +MUSTS +MUSTY +MUTABILITY +MUTABLE +MUTABLENESS +MUTANDIS +MUTANT +MUTATE +MUTATED +MUTATES +MUTATING +MUTATION +MUTATIONS +MUTATIS +MUTATIVE +MUTE +MUTED +MUTELY +MUTENESS +MUTILATE +MUTILATED +MUTILATES +MUTILATING +MUTILATION +MUTINIES +MUTINY +MUTT +MUTTER +MUTTERED +MUTTERER +MUTTERERS +MUTTERING +MUTTERS +MUTTON +MUTUAL +MUTUALLY +MUZAK +MUZO +MUZZLE +MUZZLES +MYCENAE +MYCENAEAN +MYERS +MYNHEER +MYRA +MYRIAD +MYRON +MYRTLE +MYSELF +MYSORE +MYSTERIES +MYSTERIOUS +MYSTERIOUSLY +MYSTERIOUSNESS +MYSTERY +MYSTIC +MYSTICAL +MYSTICS +MYSTIFY +MYTH +MYTHICAL +MYTHOLOGIES +MYTHOLOGY +NAB +NABISCO +NABLA +NABLAS +NADIA +NADINE +NADIR +NAG +NAGASAKI +NAGGED +NAGGING +NAGOYA +NAGS +NAGY +NAIL +NAILED +NAILING +NAILS +NAIR +NAIROBI +NAIVE +NAIVELY +NAIVENESS +NAIVETE +NAKAMURA +NAKAYAMA +NAKED +NAKEDLY +NAKEDNESS +NAKOMA +NAME +NAMEABLE +NAMED +NAMELESS +NAMELESSLY +NAMELY +NAMER +NAMERS +NAMES +NAMESAKE +NAMESAKES +NAMING +NAN +NANCY +NANETTE +NANKING +NANOINSTRUCTION +NANOINSTRUCTIONS +NANOOK +NANOPROGRAM +NANOPROGRAMMING +NANOSECOND +NANOSECONDS +NANOSTORE +NANOSTORES +NANTUCKET +NAOMI +NAP +NAPKIN +NAPKINS +NAPLES +NAPOLEON +NAPOLEONIC +NAPOLEONIZE +NAPOLEONIZES +NAPS +NARBONNE +NARCISSUS +NARCOTIC +NARCOTICS +NARRAGANSETT +NARRATE +NARRATION +NARRATIVE +NARRATIVES +NARROW +NARROWED +NARROWER +NARROWEST +NARROWING +NARROWLY +NARROWNESS +NARROWS +NARY +NASA +NASAL +NASALLY +NASAS +NASH +NASHUA +NASHVILLE +NASSAU +NASTIER +NASTIEST +NASTILY +NASTINESS +NASTY +NAT +NATAL +NATALIE +NATCHEZ +NATE +NATHAN +NATHANIEL +NATION +NATIONAL +NATIONALIST +NATIONALISTS +NATIONALITIES +NATIONALITY +NATIONALIZATION +NATIONALIZE +NATIONALIZED +NATIONALIZES +NATIONALIZING +NATIONALLY +NATIONALS +NATIONHOOD +NATIONS +NATIONWIDE +NATIVE +NATIVELY +NATIVES +NATIVITY +NATO +NATOS +NATURAL +NATURALISM +NATURALIST +NATURALIZATION +NATURALLY +NATURALNESS +NATURALS +NATURE +NATURED +NATURES +NAUGHT +NAUGHTIER +NAUGHTINESS +NAUGHTY +NAUR +NAUSEA +NAUSEATE +NAUSEUM +NAVAHO +NAVAJO +NAVAL +NAVALLY +NAVEL +NAVIES +NAVIGABLE +NAVIGATE +NAVIGATED +NAVIGATES +NAVIGATING +NAVIGATION +NAVIGATOR +NAVIGATORS +NAVONA +NAVY +NAY +NAZARENE +NAZARETH +NAZI +NAZIS +NAZISM +NDJAMENA +NEAL +NEANDERTHAL +NEAPOLITAN +NEAR +NEARBY +NEARED +NEARER +NEAREST +NEARING +NEARLY +NEARNESS +NEARS +NEARSIGHTED +NEAT +NEATER +NEATEST +NEATLY +NEATNESS +NEBRASKA +NEBRASKAN +NEBUCHADNEZZAR +NEBULA +NEBULAR +NEBULOUS +NECESSARIES +NECESSARILY +NECESSARY +NECESSITATE +NECESSITATED +NECESSITATES +NECESSITATING +NECESSITATION +NECESSITIES +NECESSITY +NECK +NECKING +NECKLACE +NECKLACES +NECKLINE +NECKS +NECKTIE +NECKTIES +NECROSIS +NECTAR +NED +NEED +NEEDED +NEEDFUL +NEEDHAM +NEEDING +NEEDLE +NEEDLED +NEEDLER +NEEDLERS +NEEDLES +NEEDLESS +NEEDLESSLY +NEEDLESSNESS +NEEDLEWORK +NEEDLING +NEEDS +NEEDY +NEFF +NEGATE +NEGATED +NEGATES +NEGATING +NEGATION +NEGATIONS +NEGATIVE +NEGATIVELY +NEGATIVES +NEGATOR +NEGATORS +NEGLECT +NEGLECTED +NEGLECTING +NEGLECTS +NEGLIGEE +NEGLIGENCE +NEGLIGENT +NEGLIGIBLE +NEGOTIABLE +NEGOTIATE +NEGOTIATED +NEGOTIATES +NEGOTIATING +NEGOTIATION +NEGOTIATIONS +NEGRO +NEGROES +NEGROID +NEGROIZATION +NEGROIZATIONS +NEGROIZE +NEGROIZES +NEHRU +NEIGH +NEIGHBOR +NEIGHBORHOOD +NEIGHBORHOODS +NEIGHBORING +NEIGHBORLY +NEIGHBORS +NEIL +NEITHER +NELL +NELLIE +NELSEN +NELSON +NEMESIS +NEOCLASSIC +NEON +NEONATAL +NEOPHYTE +NEOPHYTES +NEPAL +NEPALI +NEPHEW +NEPHEWS +NEPTUNE +NERO +NERVE +NERVES +NERVOUS +NERVOUSLY +NERVOUSNESS +NESS +NEST +NESTED +NESTER +NESTING +NESTLE +NESTLED +NESTLES +NESTLING +NESTOR +NESTS +NET +NETHER +NETHERLANDS +NETS +NETTED +NETTING +NETTLE +NETTLED +NETWORK +NETWORKED +NETWORKING +NETWORKS +NEUMANN +NEURAL +NEURITIS +NEUROLOGICAL +NEUROLOGISTS +NEURON +NEURONS +NEUROSES +NEUROSIS +NEUROTIC +NEUTER +NEUTRAL +NEUTRALITIES +NEUTRALITY +NEUTRALIZE +NEUTRALIZED +NEUTRALIZING +NEUTRALLY +NEUTRINO +NEUTRINOS +NEUTRON +NEVA +NEVADA +NEVER +NEVERTHELESS +NEVINS +NEW +NEWARK +NEWBOLD +NEWBORN +NEWBURY +NEWBURYPORT +NEWCASTLE +NEWCOMER +NEWCOMERS +NEWELL +NEWER +NEWEST +NEWFOUNDLAND +NEWLY +NEWLYWED +NEWMAN +NEWMANIZE +NEWMANIZES +NEWNESS +NEWPORT +NEWS +NEWSCAST +NEWSGROUP +NEWSLETTER +NEWSLETTERS +NEWSMAN +NEWSMEN +NEWSPAPER +NEWSPAPERS +NEWSSTAND +NEWSWEEK +NEWSWEEKLY +NEWT +NEWTON +NEWTONIAN +NEXT +NGUYEN +NIAGARA +NIAMEY +NIBBLE +NIBBLED +NIBBLER +NIBBLERS +NIBBLES +NIBBLING +NIBELUNG +NICARAGUA +NICCOLO +NICE +NICELY +NICENESS +NICER +NICEST +NICHE +NICHOLAS +NICHOLLS +NICHOLS +NICHOLSON +NICK +NICKED +NICKEL +NICKELS +NICKER +NICKING +NICKLAUS +NICKNAME +NICKNAMED +NICKNAMES +NICKS +NICODEMUS +NICOSIA +NICOTINE +NIECE +NIECES +NIELSEN +NIELSON +NIETZSCHE +NIFTY +NIGER +NIGERIA +NIGERIAN +NIGH +NIGHT +NIGHTCAP +NIGHTCLUB +NIGHTFALL +NIGHTGOWN +NIGHTINGALE +NIGHTINGALES +NIGHTLY +NIGHTMARE +NIGHTMARES +NIGHTMARISH +NIGHTS +NIGHTTIME +NIHILISM +NIJINSKY +NIKKO +NIKOLAI +NIL +NILE +NILSEN +NILSSON +NIMBLE +NIMBLENESS +NIMBLER +NIMBLY +NIMBUS +NINA +NINE +NINEFOLD +NINES +NINETEEN +NINETEENS +NINETEENTH +NINETIES +NINETIETH +NINETY +NINEVEH +NINTH +NIOBE +NIP +NIPPLE +NIPPON +NIPPONIZE +NIPPONIZES +NIPS +NITRIC +NITROGEN +NITROUS +NITTY +NIXON +NOAH +NOBEL +NOBILITY +NOBLE +NOBLEMAN +NOBLENESS +NOBLER +NOBLES +NOBLEST +NOBLY +NOBODY +NOCTURNAL +NOCTURNALLY +NOD +NODAL +NODDED +NODDING +NODE +NODES +NODS +NODULAR +NODULE +NOEL +NOETHERIAN +NOISE +NOISELESS +NOISELESSLY +NOISES +NOISIER +NOISILY +NOISINESS +NOISY +NOLAN +NOLL +NOMENCLATURE +NOMINAL +NOMINALLY +NOMINATE +NOMINATED +NOMINATING +NOMINATION +NOMINATIVE +NOMINEE +NON +NONADAPTIVE +NONBIODEGRADABLE +NONBLOCKING +NONCE +NONCHALANT +NONCOMMERCIAL +NONCOMMUNICATION +NONCONSECUTIVELY +NONCONSERVATIVE +NONCRITICAL +NONCYCLIC +NONDECREASING +NONDESCRIPT +NONDESCRIPTLY +NONDESTRUCTIVELY +NONDETERMINACY +NONDETERMINATE +NONDETERMINATELY +NONDETERMINISM +NONDETERMINISTIC +NONDETERMINISTICALLY +NONE +NONEMPTY +NONETHELESS +NONEXISTENCE +NONEXISTENT +NONEXTENSIBLE +NONFUNCTIONAL +NONGOVERNMENTAL +NONIDEMPOTENT +NONINTERACTING +NONINTERFERENCE +NONINTERLEAVED +NONINTRUSIVE +NONINTUITIVE +NONINVERTING +NONLINEAR +NONLINEARITIES +NONLINEARITY +NONLINEARLY +NONLOCAL +NONMASKABLE +NONMATHEMATICAL +NONMILITARY +NONNEGATIVE +NONNEGLIGIBLE +NONNUMERICAL +NONOGENARIAN +NONORTHOGONAL +NONORTHOGONALITY +NONPERISHABLE +NONPERSISTENT +NONPORTABLE +NONPROCEDURAL +NONPROCEDURALLY +NONPROFIT +NONPROGRAMMABLE +NONPROGRAMMER +NONSEGMENTED +NONSENSE +NONSENSICAL +NONSEQUENTIAL +NONSPECIALIST +NONSPECIALISTS +NONSTANDARD +NONSYNCHRONOUS +NONTECHNICAL +NONTERMINAL +NONTERMINALS +NONTERMINATING +NONTERMINATION +NONTHERMAL +NONTRANSPARENT +NONTRIVIAL +NONUNIFORM +NONUNIFORMITY +NONZERO +NOODLE +NOOK +NOOKS +NOON +NOONDAY +NOONS +NOONTIDE +NOONTIME +NOOSE +NOR +NORA +NORDHOFF +NORDIC +NORDSTROM +NOREEN +NORFOLK +NORM +NORMA +NORMAL +NORMALCY +NORMALITY +NORMALIZATION +NORMALIZE +NORMALIZED +NORMALIZES +NORMALIZING +NORMALLY +NORMALS +NORMAN +NORMANDY +NORMANIZATION +NORMANIZATIONS +NORMANIZE +NORMANIZER +NORMANIZERS +NORMANIZES +NORMATIVE +NORMS +NORRIS +NORRISTOWN +NORSE +NORTH +NORTHAMPTON +NORTHBOUND +NORTHEAST +NORTHEASTER +NORTHEASTERN +NORTHERLY +NORTHERN +NORTHERNER +NORTHERNERS +NORTHERNLY +NORTHFIELD +NORTHROP +NORTHRUP +NORTHUMBERLAND +NORTHWARD +NORTHWARDS +NORTHWEST +NORTHWESTERN +NORTON +NORWALK +NORWAY +NORWEGIAN +NORWICH +NOSE +NOSED +NOSES +NOSING +NOSTALGIA +NOSTALGIC +NOSTRADAMUS +NOSTRAND +NOSTRIL +NOSTRILS +NOT +NOTABLE +NOTABLES +NOTABLY +NOTARIZE +NOTARIZED +NOTARIZES +NOTARIZING +NOTARY +NOTATION +NOTATIONAL +NOTATIONS +NOTCH +NOTCHED +NOTCHES +NOTCHING +NOTE +NOTEBOOK +NOTEBOOKS +NOTED +NOTES +NOTEWORTHY +NOTHING +NOTHINGNESS +NOTHINGS +NOTICE +NOTICEABLE +NOTICEABLY +NOTICED +NOTICES +NOTICING +NOTIFICATION +NOTIFICATIONS +NOTIFIED +NOTIFIER +NOTIFIERS +NOTIFIES +NOTIFY +NOTIFYING +NOTING +NOTION +NOTIONS +NOTORIETY +NOTORIOUS +NOTORIOUSLY +NOTRE +NOTTINGHAM +NOTWITHSTANDING +NOUAKCHOTT +NOUN +NOUNS +NOURISH +NOURISHED +NOURISHES +NOURISHING +NOURISHMENT +NOVAK +NOVEL +NOVELIST +NOVELISTS +NOVELS +NOVELTIES +NOVELTY +NOVEMBER +NOVEMBERS +NOVICE +NOVICES +NOVOSIBIRSK +NOW +NOWADAYS +NOWHERE +NOXIOUS +NOYES +NOZZLE +NUANCE +NUANCES +NUBIA +NUBIAN +NUBILE +NUCLEAR +NUCLEI +NUCLEIC +NUCLEOTIDE +NUCLEOTIDES +NUCLEUS +NUCLIDE +NUDE +NUDGE +NUDGED +NUDITY +NUGENT +NUGGET +NUISANCE +NUISANCES +NULL +NULLARY +NULLED +NULLIFIED +NULLIFIERS +NULLIFIES +NULLIFY +NULLIFYING +NULLS +NUMB +NUMBED +NUMBER +NUMBERED +NUMBERER +NUMBERING +NUMBERLESS +NUMBERS +NUMBING +NUMBLY +NUMBNESS +NUMBS +NUMERABLE +NUMERAL +NUMERALS +NUMERATOR +NUMERATORS +NUMERIC +NUMERICAL +NUMERICALLY +NUMERICS +NUMEROUS +NUMISMATIC +NUMISMATIST +NUN +NUNS +NUPTIAL +NURSE +NURSED +NURSERIES +NURSERY +NURSES +NURSING +NURTURE +NURTURED +NURTURES +NURTURING +NUT +NUTATE +NUTRIA +NUTRIENT +NUTRITION +NUTRITIOUS +NUTS +NUTSHELL +NUTSHELLS +NUZZLE +NYLON +NYMPH +NYMPHOMANIA +NYMPHOMANIAC +NYMPHS +NYQUIST +OAF +OAK +OAKEN +OAKLAND +OAKLEY +OAKMONT +OAKS +OAR +OARS +OASES +OASIS +OAT +OATEN +OATH +OATHS +OATMEAL +OATS +OBEDIENCE +OBEDIENCES +OBEDIENT +OBEDIENTLY +OBELISK +OBERLIN +OBERON +OBESE +OBEY +OBEYED +OBEYING +OBEYS +OBFUSCATE +OBFUSCATORY +OBITUARY +OBJECT +OBJECTED +OBJECTING +OBJECTION +OBJECTIONABLE +OBJECTIONS +OBJECTIVE +OBJECTIVELY +OBJECTIVES +OBJECTOR +OBJECTORS +OBJECTS +OBLIGATED +OBLIGATION +OBLIGATIONS +OBLIGATORY +OBLIGE +OBLIGED +OBLIGES +OBLIGING +OBLIGINGLY +OBLIQUE +OBLIQUELY +OBLIQUENESS +OBLITERATE +OBLITERATED +OBLITERATES +OBLITERATING +OBLITERATION +OBLIVION +OBLIVIOUS +OBLIVIOUSLY +OBLIVIOUSNESS +OBLONG +OBNOXIOUS +OBOE +OBSCENE +OBSCURE +OBSCURED +OBSCURELY +OBSCURER +OBSCURES +OBSCURING +OBSCURITIES +OBSCURITY +OBSEQUIOUS +OBSERVABLE +OBSERVANCE +OBSERVANCES +OBSERVANT +OBSERVATION +OBSERVATIONS +OBSERVATORY +OBSERVE +OBSERVED +OBSERVER +OBSERVERS +OBSERVES +OBSERVING +OBSESSION +OBSESSIONS +OBSESSIVE +OBSOLESCENCE +OBSOLESCENT +OBSOLETE +OBSOLETED +OBSOLETES +OBSOLETING +OBSTACLE +OBSTACLES +OBSTINACY +OBSTINATE +OBSTINATELY +OBSTRUCT +OBSTRUCTED +OBSTRUCTING +OBSTRUCTION +OBSTRUCTIONS +OBSTRUCTIVE +OBTAIN +OBTAINABLE +OBTAINABLY +OBTAINED +OBTAINING +OBTAINS +OBVIATE +OBVIATED +OBVIATES +OBVIATING +OBVIATION +OBVIATIONS +OBVIOUS +OBVIOUSLY +OBVIOUSNESS +OCCAM +OCCASION +OCCASIONAL +OCCASIONALLY +OCCASIONED +OCCASIONING +OCCASIONINGS +OCCASIONS +OCCIDENT +OCCIDENTAL +OCCIDENTALIZATION +OCCIDENTALIZATIONS +OCCIDENTALIZE +OCCIDENTALIZED +OCCIDENTALIZES +OCCIDENTALIZING +OCCIDENTALS +OCCIPITAL +OCCLUDE +OCCLUDED +OCCLUDES +OCCLUSION +OCCLUSIONS +OCCULT +OCCUPANCIES +OCCUPANCY +OCCUPANT +OCCUPANTS +OCCUPATION +OCCUPATIONAL +OCCUPATIONALLY +OCCUPATIONS +OCCUPIED +OCCUPIER +OCCUPIES +OCCUPY +OCCUPYING +OCCUR +OCCURRED +OCCURRENCE +OCCURRENCES +OCCURRING +OCCURS +OCEAN +OCEANIA +OCEANIC +OCEANOGRAPHY +OCEANS +OCONOMOWOC +OCTAGON +OCTAGONAL +OCTAHEDRA +OCTAHEDRAL +OCTAHEDRON +OCTAL +OCTANE +OCTAVE +OCTAVES +OCTAVIA +OCTET +OCTETS +OCTOBER +OCTOBERS +OCTOGENARIAN +OCTOPUS +ODD +ODDER +ODDEST +ODDITIES +ODDITY +ODDLY +ODDNESS +ODDS +ODE +ODERBERG +ODERBERGS +ODES +ODESSA +ODIN +ODIOUS +ODIOUSLY +ODIOUSNESS +ODIUM +ODOR +ODOROUS +ODOROUSLY +ODOROUSNESS +ODORS +ODYSSEUS +ODYSSEY +OEDIPAL +OEDIPALLY +OEDIPUS +OFF +OFFENBACH +OFFEND +OFFENDED +OFFENDER +OFFENDERS +OFFENDING +OFFENDS +OFFENSE +OFFENSES +OFFENSIVE +OFFENSIVELY +OFFENSIVENESS +OFFER +OFFERED +OFFERER +OFFERERS +OFFERING +OFFERINGS +OFFERS +OFFHAND +OFFICE +OFFICEMATE +OFFICER +OFFICERS +OFFICES +OFFICIAL +OFFICIALDOM +OFFICIALLY +OFFICIALS +OFFICIATE +OFFICIO +OFFICIOUS +OFFICIOUSLY +OFFICIOUSNESS +OFFING +OFFLOAD +OFFS +OFFSET +OFFSETS +OFFSETTING +OFFSHORE +OFFSPRING +OFT +OFTEN +OFTENTIMES +OGDEN +OHIO +OHM +OHMMETER +OIL +OILCLOTH +OILED +OILER +OILERS +OILIER +OILIEST +OILING +OILS +OILY +OINTMENT +OJIBWA +OKAMOTO +OKAY +OKINAWA +OKLAHOMA +OKLAHOMAN +OLAF +OLAV +OLD +OLDEN +OLDENBURG +OLDER +OLDEST +OLDNESS +OLDSMOBILE +OLDUVAI +OLDY +OLEANDER +OLEG +OLEOMARGARINE +OLGA +OLIGARCHY +OLIGOCENE +OLIN +OLIVE +OLIVER +OLIVERS +OLIVES +OLIVETTI +OLIVIA +OLIVIER +OLSEN +OLSON +OLYMPIA +OLYMPIAN +OLYMPIANIZE +OLYMPIANIZES +OLYMPIC +OLYMPICS +OLYMPUS +OMAHA +OMAN +OMEGA +OMELET +OMEN +OMENS +OMICRON +OMINOUS +OMINOUSLY +OMINOUSNESS +OMISSION +OMISSIONS +OMIT +OMITS +OMITTED +OMITTING +OMNIBUS +OMNIDIRECTIONAL +OMNIPOTENT +OMNIPRESENT +OMNISCIENT +OMNISCIENTLY +OMNIVORE +ONANISM +ONCE +ONCOLOGY +ONE +ONEIDA +ONENESS +ONEROUS +ONES +ONESELF +ONETIME +ONGOING +ONION +ONIONS +ONLINE +ONLOOKER +ONLY +ONONDAGA +ONRUSH +ONSET +ONSETS +ONSLAUGHT +ONTARIO +ONTO +ONTOLOGY +ONUS +ONWARD +ONWARDS +ONYX +OOZE +OOZED +OPACITY +OPAL +OPALS +OPAQUE +OPAQUELY +OPAQUENESS +OPCODE +OPEC +OPEL +OPEN +OPENED +OPENER +OPENERS +OPENING +OPENINGS +OPENLY +OPENNESS +OPENS +OPERA +OPERABLE +OPERAND +OPERANDI +OPERANDS +OPERAS +OPERATE +OPERATED +OPERATES +OPERATING +OPERATION +OPERATIONAL +OPERATIONALLY +OPERATIONS +OPERATIVE +OPERATIVES +OPERATOR +OPERATORS +OPERETTA +OPHIUCHUS +OPHIUCUS +OPIATE +OPINION +OPINIONS +OPIUM +OPOSSUM +OPPENHEIMER +OPPONENT +OPPONENTS +OPPORTUNE +OPPORTUNELY +OPPORTUNISM +OPPORTUNISTIC +OPPORTUNITIES +OPPORTUNITY +OPPOSABLE +OPPOSE +OPPOSED +OPPOSES +OPPOSING +OPPOSITE +OPPOSITELY +OPPOSITENESS +OPPOSITES +OPPOSITION +OPPRESS +OPPRESSED +OPPRESSES +OPPRESSING +OPPRESSION +OPPRESSIVE +OPPRESSOR +OPPRESSORS +OPPROBRIUM +OPT +OPTED +OPTHALMIC +OPTIC +OPTICAL +OPTICALLY +OPTICS +OPTIMA +OPTIMAL +OPTIMALITY +OPTIMALLY +OPTIMISM +OPTIMIST +OPTIMISTIC +OPTIMISTICALLY +OPTIMIZATION +OPTIMIZATIONS +OPTIMIZE +OPTIMIZED +OPTIMIZER +OPTIMIZERS +OPTIMIZES +OPTIMIZING +OPTIMUM +OPTING +OPTION +OPTIONAL +OPTIONALLY +OPTIONS +OPTOACOUSTIC +OPTOMETRIST +OPTOMETRY +OPTS +OPULENCE +OPULENT +OPUS +ORACLE +ORACLES +ORAL +ORALLY +ORANGE +ORANGES +ORANGUTAN +ORATION +ORATIONS +ORATOR +ORATORIES +ORATORS +ORATORY +ORB +ORBIT +ORBITAL +ORBITALLY +ORBITED +ORBITER +ORBITERS +ORBITING +ORBITS +ORCHARD +ORCHARDS +ORCHESTRA +ORCHESTRAL +ORCHESTRAS +ORCHESTRATE +ORCHID +ORCHIDS +ORDAIN +ORDAINED +ORDAINING +ORDAINS +ORDEAL +ORDER +ORDERED +ORDERING +ORDERINGS +ORDERLIES +ORDERLY +ORDERS +ORDINAL +ORDINANCE +ORDINANCES +ORDINARILY +ORDINARINESS +ORDINARY +ORDINATE +ORDINATES +ORDINATION +ORE +OREGANO +OREGON +OREGONIANS +ORES +ORESTEIA +ORESTES +ORGAN +ORGANIC +ORGANISM +ORGANISMS +ORGANIST +ORGANISTS +ORGANIZABLE +ORGANIZATION +ORGANIZATIONAL +ORGANIZATIONALLY +ORGANIZATIONS +ORGANIZE +ORGANIZED +ORGANIZER +ORGANIZERS +ORGANIZES +ORGANIZING +ORGANS +ORGASM +ORGIASTIC +ORGIES +ORGY +ORIENT +ORIENTAL +ORIENTALIZATION +ORIENTALIZATIONS +ORIENTALIZE +ORIENTALIZED +ORIENTALIZES +ORIENTALIZING +ORIENTALS +ORIENTATION +ORIENTATIONS +ORIENTED +ORIENTING +ORIENTS +ORIFICE +ORIFICES +ORIGIN +ORIGINAL +ORIGINALITY +ORIGINALLY +ORIGINALS +ORIGINATE +ORIGINATED +ORIGINATES +ORIGINATING +ORIGINATION +ORIGINATOR +ORIGINATORS +ORIGINS +ORIN +ORINOCO +ORIOLE +ORION +ORKNEY +ORLANDO +ORLEANS +ORLICK +ORLY +ORNAMENT +ORNAMENTAL +ORNAMENTALLY +ORNAMENTATION +ORNAMENTED +ORNAMENTING +ORNAMENTS +ORNATE +ORNERY +ORONO +ORPHAN +ORPHANAGE +ORPHANED +ORPHANS +ORPHEUS +ORPHIC +ORPHICALLY +ORR +ORTEGA +ORTHANT +ORTHODONTIST +ORTHODOX +ORTHODOXY +ORTHOGONAL +ORTHOGONALITY +ORTHOGONALLY +ORTHOPEDIC +ORVILLE +ORWELL +ORWELLIAN +OSAKA +OSBERT +OSBORN +OSBORNE +OSCAR +OSCILLATE +OSCILLATED +OSCILLATES +OSCILLATING +OSCILLATION +OSCILLATIONS +OSCILLATOR +OSCILLATORS +OSCILLATORY +OSCILLOSCOPE +OSCILLOSCOPES +OSGOOD +OSHKOSH +OSIRIS +OSLO +OSMOSIS +OSMOTIC +OSSIFY +OSTENSIBLE +OSTENSIBLY +OSTENTATIOUS +OSTEOPATH +OSTEOPATHIC +OSTEOPATHY +OSTEOPOROSIS +OSTRACISM +OSTRANDER +OSTRICH +OSTRICHES +OSWALD +OTHELLO +OTHER +OTHERS +OTHERWISE +OTHERWORLDLY +OTIS +OTT +OTTAWA +OTTER +OTTERS +OTTO +OTTOMAN +OTTOMANIZATION +OTTOMANIZATIONS +OTTOMANIZE +OTTOMANIZES +OUAGADOUGOU +OUCH +OUGHT +OUNCE +OUNCES +OUR +OURS +OURSELF +OURSELVES +OUST +OUT +OUTBOUND +OUTBREAK +OUTBREAKS +OUTBURST +OUTBURSTS +OUTCAST +OUTCASTS +OUTCOME +OUTCOMES +OUTCRIES +OUTCRY +OUTDATED +OUTDO +OUTDOOR +OUTDOORS +OUTER +OUTERMOST +OUTFIT +OUTFITS +OUTFITTED +OUTGOING +OUTGREW +OUTGROW +OUTGROWING +OUTGROWN +OUTGROWS +OUTGROWTH +OUTING +OUTLANDISH +OUTLAST +OUTLASTS +OUTLAW +OUTLAWED +OUTLAWING +OUTLAWS +OUTLAY +OUTLAYS +OUTLET +OUTLETS +OUTLINE +OUTLINED +OUTLINES +OUTLINING +OUTLIVE +OUTLIVED +OUTLIVES +OUTLIVING +OUTLOOK +OUTLYING +OUTNUMBERED +OUTPERFORM +OUTPERFORMED +OUTPERFORMING +OUTPERFORMS +OUTPOST +OUTPOSTS +OUTPUT +OUTPUTS +OUTPUTTING +OUTRAGE +OUTRAGED +OUTRAGEOUS +OUTRAGEOUSLY +OUTRAGES +OUTRIGHT +OUTRUN +OUTRUNS +OUTS +OUTSET +OUTSIDE +OUTSIDER +OUTSIDERS +OUTSKIRTS +OUTSTANDING +OUTSTANDINGLY +OUTSTRETCHED +OUTSTRIP +OUTSTRIPPED +OUTSTRIPPING +OUTSTRIPS +OUTVOTE +OUTVOTED +OUTVOTES +OUTVOTING +OUTWARD +OUTWARDLY +OUTWEIGH +OUTWEIGHED +OUTWEIGHING +OUTWEIGHS +OUTWIT +OUTWITS +OUTWITTED +OUTWITTING +OVAL +OVALS +OVARIES +OVARY +OVEN +OVENS +OVER +OVERALL +OVERALLS +OVERBOARD +OVERCAME +OVERCOAT +OVERCOATS +OVERCOME +OVERCOMES +OVERCOMING +OVERCROWD +OVERCROWDED +OVERCROWDING +OVERCROWDS +OVERDONE +OVERDOSE +OVERDRAFT +OVERDRAFTS +OVERDUE +OVEREMPHASIS +OVEREMPHASIZED +OVERESTIMATE +OVERESTIMATED +OVERESTIMATES +OVERESTIMATING +OVERESTIMATION +OVERFLOW +OVERFLOWED +OVERFLOWING +OVERFLOWS +OVERGROWN +OVERHANG +OVERHANGING +OVERHANGS +OVERHAUL +OVERHAULING +OVERHEAD +OVERHEADS +OVERHEAR +OVERHEARD +OVERHEARING +OVERHEARS +OVERJOY +OVERJOYED +OVERKILL +OVERLAND +OVERLAP +OVERLAPPED +OVERLAPPING +OVERLAPS +OVERLAY +OVERLAYING +OVERLAYS +OVERLOAD +OVERLOADED +OVERLOADING +OVERLOADS +OVERLOOK +OVERLOOKED +OVERLOOKING +OVERLOOKS +OVERLY +OVERNIGHT +OVERNIGHTER +OVERNIGHTERS +OVERPOWER +OVERPOWERED +OVERPOWERING +OVERPOWERS +OVERPRINT +OVERPRINTED +OVERPRINTING +OVERPRINTS +OVERPRODUCTION +OVERRIDDEN +OVERRIDE +OVERRIDES +OVERRIDING +OVERRODE +OVERRULE +OVERRULED +OVERRULES +OVERRUN +OVERRUNNING +OVERRUNS +OVERSEAS +OVERSEE +OVERSEEING +OVERSEER +OVERSEERS +OVERSEES +OVERSHADOW +OVERSHADOWED +OVERSHADOWING +OVERSHADOWS +OVERSHOOT +OVERSHOT +OVERSIGHT +OVERSIGHTS +OVERSIMPLIFIED +OVERSIMPLIFIES +OVERSIMPLIFY +OVERSIMPLIFYING +OVERSIZED +OVERSTATE +OVERSTATED +OVERSTATEMENT +OVERSTATEMENTS +OVERSTATES +OVERSTATING +OVERSTOCKS +OVERSUBSCRIBED +OVERT +OVERTAKE +OVERTAKEN +OVERTAKER +OVERTAKERS +OVERTAKES +OVERTAKING +OVERTHREW +OVERTHROW +OVERTHROWN +OVERTIME +OVERTLY +OVERTONE +OVERTONES +OVERTOOK +OVERTURE +OVERTURES +OVERTURN +OVERTURNED +OVERTURNING +OVERTURNS +OVERUSE +OVERVIEW +OVERVIEWS +OVERWHELM +OVERWHELMED +OVERWHELMING +OVERWHELMINGLY +OVERWHELMS +OVERWORK +OVERWORKED +OVERWORKING +OVERWORKS +OVERWRITE +OVERWRITES +OVERWRITING +OVERWRITTEN +OVERZEALOUS +OVID +OWE +OWED +OWEN +OWENS +OWES +OWING +OWL +OWLS +OWN +OWNED +OWNER +OWNERS +OWNERSHIP +OWNERSHIPS +OWNING +OWNS +OXEN +OXFORD +OXIDE +OXIDES +OXIDIZE +OXIDIZED +OXNARD +OXONIAN +OXYGEN +OYSTER +OYSTERS +OZARK +OZARKS +OZONE +OZZIE +PABLO +PABST +PACE +PACED +PACEMAKER +PACER +PACERS +PACES +PACIFIC +PACIFICATION +PACIFIED +PACIFIER +PACIFIES +PACIFISM +PACIFIST +PACIFY +PACING +PACK +PACKAGE +PACKAGED +PACKAGER +PACKAGERS +PACKAGES +PACKAGING +PACKAGINGS +PACKARD +PACKARDS +PACKED +PACKER +PACKERS +PACKET +PACKETS +PACKING +PACKS +PACKWOOD +PACT +PACTS +PAD +PADDED +PADDING +PADDLE +PADDOCK +PADDY +PADLOCK +PADS +PAGAN +PAGANINI +PAGANS +PAGE +PAGEANT +PAGEANTRY +PAGEANTS +PAGED +PAGER +PAGERS +PAGES +PAGINATE +PAGINATED +PAGINATES +PAGINATING +PAGINATION +PAGING +PAGODA +PAID +PAIL +PAILS +PAIN +PAINE +PAINED +PAINFUL +PAINFULLY +PAINLESS +PAINS +PAINSTAKING +PAINSTAKINGLY +PAINT +PAINTED +PAINTER +PAINTERS +PAINTING +PAINTINGS +PAINTS +PAIR +PAIRED +PAIRING +PAIRINGS +PAIRS +PAIRWISE +PAJAMA +PAJAMAS +PAKISTAN +PAKISTANI +PAKISTANIS +PAL +PALACE +PALACES +PALATE +PALATES +PALATINE +PALE +PALED +PALELY +PALENESS +PALEOLITHIC +PALEOZOIC +PALER +PALERMO +PALES +PALEST +PALESTINE +PALESTINIAN +PALFREY +PALINDROME +PALINDROMIC +PALING +PALL +PALLADIAN +PALLADIUM +PALLIATE +PALLIATIVE +PALLID +PALM +PALMED +PALMER +PALMING +PALMOLIVE +PALMS +PALMYRA +PALO +PALOMAR +PALPABLE +PALS +PALSY +PAM +PAMELA +PAMPER +PAMPHLET +PAMPHLETS +PAN +PANACEA +PANACEAS +PANAMA +PANAMANIAN +PANCAKE +PANCAKES +PANCHO +PANDA +PANDANUS +PANDAS +PANDEMIC +PANDEMONIUM +PANDER +PANDORA +PANE +PANEL +PANELED +PANELING +PANELIST +PANELISTS +PANELS +PANES +PANG +PANGAEA +PANGS +PANIC +PANICKED +PANICKING +PANICKY +PANICS +PANNED +PANNING +PANORAMA +PANORAMIC +PANS +PANSIES +PANSY +PANT +PANTED +PANTHEISM +PANTHEIST +PANTHEON +PANTHER +PANTHERS +PANTIES +PANTING +PANTOMIME +PANTRIES +PANTRY +PANTS +PANTY +PANTYHOSE +PAOLI +PAPA +PAPAL +PAPER +PAPERBACK +PAPERBACKS +PAPERED +PAPERER +PAPERERS +PAPERING +PAPERINGS +PAPERS +PAPERWEIGHT +PAPERWORK +PAPOOSE +PAPPAS +PAPUA +PAPYRUS +PAR +PARABOLA +PARABOLIC +PARABOLOID +PARABOLOIDAL +PARACHUTE +PARACHUTED +PARACHUTES +PARADE +PARADED +PARADES +PARADIGM +PARADIGMS +PARADING +PARADISE +PARADOX +PARADOXES +PARADOXICAL +PARADOXICALLY +PARAFFIN +PARAGON +PARAGONS +PARAGRAPH +PARAGRAPHING +PARAGRAPHS +PARAGUAY +PARAGUAYAN +PARAGUAYANS +PARAKEET +PARALLAX +PARALLEL +PARALLELED +PARALLELING +PARALLELISM +PARALLELIZE +PARALLELIZED +PARALLELIZES +PARALLELIZING +PARALLELOGRAM +PARALLELOGRAMS +PARALLELS +PARALYSIS +PARALYZE +PARALYZED +PARALYZES +PARALYZING +PARAMETER +PARAMETERIZABLE +PARAMETERIZATION +PARAMETERIZATIONS +PARAMETERIZE +PARAMETERIZED +PARAMETERIZES +PARAMETERIZING +PARAMETERLESS +PARAMETERS +PARAMETRIC +PARAMETRIZED +PARAMILITARY +PARAMOUNT +PARAMUS +PARANOIA +PARANOIAC +PARANOID +PARANORMAL +PARAPET +PARAPETS +PARAPHERNALIA +PARAPHRASE +PARAPHRASED +PARAPHRASES +PARAPHRASING +PARAPSYCHOLOGY +PARASITE +PARASITES +PARASITIC +PARASITICS +PARASOL +PARBOIL +PARC +PARCEL +PARCELED +PARCELING +PARCELS +PARCH +PARCHED +PARCHMENT +PARDON +PARDONABLE +PARDONABLY +PARDONED +PARDONER +PARDONERS +PARDONING +PARDONS +PARE +PAREGORIC +PARENT +PARENTAGE +PARENTAL +PARENTHESES +PARENTHESIS +PARENTHESIZED +PARENTHESIZES +PARENTHESIZING +PARENTHETIC +PARENTHETICAL +PARENTHETICALLY +PARENTHOOD +PARENTS +PARES +PARETO +PARIAH +PARIMUTUEL +PARING +PARINGS +PARIS +PARISH +PARISHES +PARISHIONER +PARISIAN +PARISIANIZATION +PARISIANIZATIONS +PARISIANIZE +PARISIANIZES +PARITY +PARK +PARKE +PARKED +PARKER +PARKERS +PARKERSBURG +PARKHOUSE +PARKING +PARKINSON +PARKINSONIAN +PARKLAND +PARKLIKE +PARKS +PARKWAY +PARLAY +PARLEY +PARLIAMENT +PARLIAMENTARIAN +PARLIAMENTARY +PARLIAMENTS +PARLOR +PARLORS +PARMESAN +PAROCHIAL +PARODY +PAROLE +PAROLED +PAROLES +PAROLING +PARR +PARRIED +PARRISH +PARROT +PARROTING +PARROTS +PARRS +PARRY +PARS +PARSE +PARSED +PARSER +PARSERS +PARSES +PARSI +PARSIFAL +PARSIMONY +PARSING +PARSINGS +PARSLEY +PARSON +PARSONS +PART +PARTAKE +PARTAKER +PARTAKES +PARTAKING +PARTED +PARTER +PARTERS +PARTHENON +PARTHIA +PARTIAL +PARTIALITY +PARTIALLY +PARTICIPANT +PARTICIPANTS +PARTICIPATE +PARTICIPATED +PARTICIPATES +PARTICIPATING +PARTICIPATION +PARTICIPLE +PARTICLE +PARTICLES +PARTICULAR +PARTICULARLY +PARTICULARS +PARTICULATE +PARTIES +PARTING +PARTINGS +PARTISAN +PARTISANS +PARTITION +PARTITIONED +PARTITIONING +PARTITIONS +PARTLY +PARTNER +PARTNERED +PARTNERS +PARTNERSHIP +PARTOOK +PARTRIDGE +PARTRIDGES +PARTS +PARTY +PASADENA +PASCAL +PASCAL +PASO +PASS +PASSAGE +PASSAGES +PASSAGEWAY +PASSAIC +PASSE +PASSED +PASSENGER +PASSENGERS +PASSER +PASSERS +PASSES +PASSING +PASSION +PASSIONATE +PASSIONATELY +PASSIONS +PASSIVATE +PASSIVE +PASSIVELY +PASSIVENESS +PASSIVITY +PASSOVER +PASSPORT +PASSPORTS +PASSWORD +PASSWORDS +PAST +PASTE +PASTED +PASTEL +PASTERNAK +PASTES +PASTEUR +PASTIME +PASTIMES +PASTING +PASTNESS +PASTOR +PASTORAL +PASTORS +PASTRY +PASTS +PASTURE +PASTURES +PAT +PATAGONIA +PATAGONIANS +PATCH +PATCHED +PATCHES +PATCHING +PATCHWORK +PATCHY +PATE +PATEN +PATENT +PATENTABLE +PATENTED +PATENTER +PATENTERS +PATENTING +PATENTLY +PATENTS +PATERNAL +PATERNALLY +PATERNOSTER +PATERSON +PATH +PATHETIC +PATHNAME +PATHNAMES +PATHOGEN +PATHOGENESIS +PATHOLOGICAL +PATHOLOGY +PATHOS +PATHS +PATHWAY +PATHWAYS +PATIENCE +PATIENT +PATIENTLY +PATIENTS +PATINA +PATIO +PATRIARCH +PATRIARCHAL +PATRIARCHS +PATRIARCHY +PATRICE +PATRICIA +PATRICIAN +PATRICIANS +PATRICK +PATRIMONIAL +PATRIMONY +PATRIOT +PATRIOTIC +PATRIOTISM +PATRIOTS +PATROL +PATROLLED +PATROLLING +PATROLMAN +PATROLMEN +PATROLS +PATRON +PATRONAGE +PATRONIZE +PATRONIZED +PATRONIZES +PATRONIZING +PATRONS +PATS +PATSIES +PATSY +PATTER +PATTERED +PATTERING +PATTERINGS +PATTERN +PATTERNED +PATTERNING +PATTERNS +PATTERS +PATTERSON +PATTI +PATTIES +PATTON +PATTY +PAUCITY +PAUL +PAULA +PAULETTE +PAULI +PAULINE +PAULING +PAULINIZE +PAULINIZES +PAULO +PAULSEN +PAULSON +PAULUS +PAUNCH +PAUNCHY +PAUPER +PAUSE +PAUSED +PAUSES +PAUSING +PAVE +PAVED +PAVEMENT +PAVEMENTS +PAVES +PAVILION +PAVILIONS +PAVING +PAVLOV +PAVLOVIAN +PAW +PAWING +PAWN +PAWNS +PAWNSHOP +PAWS +PAWTUCKET +PAY +PAYABLE +PAYCHECK +PAYCHECKS +PAYED +PAYER +PAYERS +PAYING +PAYMENT +PAYMENTS +PAYNE +PAYNES +PAYNIZE +PAYNIZES +PAYOFF +PAYOFFS +PAYROLL +PAYS +PAYSON +PAZ +PEA +PEABODY +PEACE +PEACEABLE +PEACEFUL +PEACEFULLY +PEACEFULNESS +PEACETIME +PEACH +PEACHES +PEACHTREE +PEACOCK +PEACOCKS +PEAK +PEAKED +PEAKS +PEAL +PEALE +PEALED +PEALING +PEALS +PEANUT +PEANUTS +PEAR +PEARCE +PEARL +PEARLS +PEARLY +PEARS +PEARSON +PEAS +PEASANT +PEASANTRY +PEASANTS +PEASE +PEAT +PEBBLE +PEBBLES +PECCARY +PECK +PECKED +PECKING +PECKS +PECOS +PECTORAL +PECULIAR +PECULIARITIES +PECULIARITY +PECULIARLY +PECUNIARY +PEDAGOGIC +PEDAGOGICAL +PEDAGOGICALLY +PEDAGOGY +PEDAL +PEDANT +PEDANTIC +PEDANTRY +PEDDLE +PEDDLER +PEDDLERS +PEDESTAL +PEDESTRIAN +PEDESTRIANS +PEDIATRIC +PEDIATRICIAN +PEDIATRICS +PEDIGREE +PEDRO +PEEK +PEEKED +PEEKING +PEEKS +PEEL +PEELED +PEELING +PEELS +PEEP +PEEPED +PEEPER +PEEPHOLE +PEEPING +PEEPS +PEER +PEERED +PEERING +PEERLESS +PEERS +PEG +PEGASUS +PEGBOARD +PEGGY +PEGS +PEIPING +PEJORATIVE +PEKING +PELHAM +PELICAN +PELLAGRA +PELOPONNESE +PELT +PELTING +PELTS +PELVIC +PELVIS +PEMBROKE +PEN +PENAL +PENALIZE +PENALIZED +PENALIZES +PENALIZING +PENALTIES +PENALTY +PENANCE +PENCE +PENCHANT +PENCIL +PENCILED +PENCILS +PEND +PENDANT +PENDED +PENDING +PENDLETON +PENDS +PENDULUM +PENDULUMS +PENELOPE +PENETRABLE +PENETRATE +PENETRATED +PENETRATES +PENETRATING +PENETRATINGLY +PENETRATION +PENETRATIONS +PENETRATIVE +PENETRATOR +PENETRATORS +PENGUIN +PENGUINS +PENH +PENICILLIN +PENINSULA +PENINSULAS +PENIS +PENISES +PENITENT +PENITENTIARY +PENN +PENNED +PENNIES +PENNILESS +PENNING +PENNSYLVANIA +PENNY +PENROSE +PENS +PENSACOLA +PENSION +PENSIONER +PENSIONS +PENSIVE +PENT +PENTAGON +PENTAGONS +PENTATEUCH +PENTECOST +PENTECOSTAL +PENTHOUSE +PENULTIMATE +PENUMBRA +PEONY +PEOPLE +PEOPLED +PEOPLES +PEORIA +PEP +PEPPER +PEPPERED +PEPPERING +PEPPERMINT +PEPPERONI +PEPPERS +PEPPERY +PEPPY +PEPSI +PEPSICO +PEPSICO +PEPTIDE +PER +PERCEIVABLE +PERCEIVABLY +PERCEIVE +PERCEIVED +PERCEIVER +PERCEIVERS +PERCEIVES +PERCEIVING +PERCENT +PERCENTAGE +PERCENTAGES +PERCENTILE +PERCENTILES +PERCENTS +PERCEPTIBLE +PERCEPTIBLY +PERCEPTION +PERCEPTIONS +PERCEPTIVE +PERCEPTIVELY +PERCEPTUAL +PERCEPTUALLY +PERCH +PERCHANCE +PERCHED +PERCHES +PERCHING +PERCIVAL +PERCUSSION +PERCUTANEOUS +PERCY +PEREMPTORY +PERENNIAL +PERENNIALLY +PEREZ +PERFECT +PERFECTED +PERFECTIBLE +PERFECTING +PERFECTION +PERFECTIONIST +PERFECTIONISTS +PERFECTLY +PERFECTNESS +PERFECTS +PERFORCE +PERFORM +PERFORMANCE +PERFORMANCES +PERFORMED +PERFORMER +PERFORMERS +PERFORMING +PERFORMS +PERFUME +PERFUMED +PERFUMES +PERFUMING +PERFUNCTORY +PERGAMON +PERHAPS +PERICLEAN +PERICLES +PERIHELION +PERIL +PERILLA +PERILOUS +PERILOUSLY +PERILS +PERIMETER +PERIOD +PERIODIC +PERIODICAL +PERIODICALLY +PERIODICALS +PERIODS +PERIPHERAL +PERIPHERALLY +PERIPHERALS +PERIPHERIES +PERIPHERY +PERISCOPE +PERISH +PERISHABLE +PERISHABLES +PERISHED +PERISHER +PERISHERS +PERISHES +PERISHING +PERJURE +PERJURY +PERK +PERKINS +PERKY +PERLE +PERMANENCE +PERMANENT +PERMANENTLY +PERMEABLE +PERMEATE +PERMEATED +PERMEATES +PERMEATING +PERMEATION +PERMIAN +PERMISSIBILITY +PERMISSIBLE +PERMISSIBLY +PERMISSION +PERMISSIONS +PERMISSIVE +PERMISSIVELY +PERMIT +PERMITS +PERMITTED +PERMITTING +PERMUTATION +PERMUTATIONS +PERMUTE +PERMUTED +PERMUTES +PERMUTING +PERNICIOUS +PERNOD +PEROXIDE +PERPENDICULAR +PERPENDICULARLY +PERPENDICULARS +PERPETRATE +PERPETRATED +PERPETRATES +PERPETRATING +PERPETRATION +PERPETRATIONS +PERPETRATOR +PERPETRATORS +PERPETUAL +PERPETUALLY +PERPETUATE +PERPETUATED +PERPETUATES +PERPETUATING +PERPETUATION +PERPETUITY +PERPLEX +PERPLEXED +PERPLEXING +PERPLEXITY +PERRY +PERSECUTE +PERSECUTED +PERSECUTES +PERSECUTING +PERSECUTION +PERSECUTOR +PERSECUTORS +PERSEID +PERSEPHONE +PERSEUS +PERSEVERANCE +PERSEVERE +PERSEVERED +PERSEVERES +PERSEVERING +PERSHING +PERSIA +PERSIAN +PERSIANIZATION +PERSIANIZATIONS +PERSIANIZE +PERSIANIZES +PERSIANS +PERSIST +PERSISTED +PERSISTENCE +PERSISTENT +PERSISTENTLY +PERSISTING +PERSISTS +PERSON +PERSONAGE +PERSONAGES +PERSONAL +PERSONALITIES +PERSONALITY +PERSONALIZATION +PERSONALIZE +PERSONALIZED +PERSONALIZES +PERSONALIZING +PERSONALLY +PERSONIFICATION +PERSONIFIED +PERSONIFIES +PERSONIFY +PERSONIFYING +PERSONNEL +PERSONS +PERSPECTIVE +PERSPECTIVES +PERSPICUOUS +PERSPICUOUSLY +PERSPIRATION +PERSPIRE +PERSUADABLE +PERSUADE +PERSUADED +PERSUADER +PERSUADERS +PERSUADES +PERSUADING +PERSUASION +PERSUASIONS +PERSUASIVE +PERSUASIVELY +PERSUASIVENESS +PERTAIN +PERTAINED +PERTAINING +PERTAINS +PERTH +PERTINENT +PERTURB +PERTURBATION +PERTURBATIONS +PERTURBED +PERU +PERUSAL +PERUSE +PERUSED +PERUSER +PERUSERS +PERUSES +PERUSING +PERUVIAN +PERUVIANIZE +PERUVIANIZES +PERUVIANS +PERVADE +PERVADED +PERVADES +PERVADING +PERVASIVE +PERVASIVELY +PERVERSION +PERVERT +PERVERTED +PERVERTS +PESSIMISM +PESSIMIST +PESSIMISTIC +PEST +PESTER +PESTICIDE +PESTILENCE +PESTILENT +PESTS +PET +PETAL +PETALS +PETE +PETER +PETERS +PETERSBURG +PETERSEN +PETERSON +PETITION +PETITIONED +PETITIONER +PETITIONING +PETITIONS +PETKIEWICZ +PETRI +PETROLEUM +PETS +PETTED +PETTER +PETTERS +PETTIBONE +PETTICOAT +PETTICOATS +PETTINESS +PETTING +PETTY +PETULANCE +PETULANT +PEUGEOT +PEW +PEWAUKEE +PEWS +PEWTER +PFIZER +PHAEDRA +PHANTOM +PHANTOMS +PHARMACEUTIC +PHARMACIST +PHARMACOLOGY +PHARMACOPOEIA +PHARMACY +PHASE +PHASED +PHASER +PHASERS +PHASES +PHASING +PHEASANT +PHEASANTS +PHELPS +PHENOMENA +PHENOMENAL +PHENOMENALLY +PHENOMENOLOGICAL +PHENOMENOLOGICALLY +PHENOMENOLOGIES +PHENOMENOLOGY +PHENOMENON +PHI +PHIGS +PHIL +PHILADELPHIA +PHILANTHROPY +PHILCO +PHILHARMONIC +PHILIP +PHILIPPE +PHILIPPIANS +PHILIPPINE +PHILIPPINES +PHILISTINE +PHILISTINES +PHILISTINIZE +PHILISTINIZES +PHILLIES +PHILLIP +PHILLIPS +PHILLY +PHILOSOPHER +PHILOSOPHERS +PHILOSOPHIC +PHILOSOPHICAL +PHILOSOPHICALLY +PHILOSOPHIES +PHILOSOPHIZE +PHILOSOPHIZED +PHILOSOPHIZER +PHILOSOPHIZERS +PHILOSOPHIZES +PHILOSOPHIZING +PHILOSOPHY +PHIPPS +PHOBOS +PHOENICIA +PHOENIX +PHONE +PHONED +PHONEME +PHONEMES +PHONEMIC +PHONES +PHONETIC +PHONETICS +PHONING +PHONOGRAPH +PHONOGRAPHS +PHONY +PHOSGENE +PHOSPHATE +PHOSPHATES +PHOSPHOR +PHOSPHORESCENT +PHOSPHORIC +PHOSPHORUS +PHOTO +PHOTOCOPIED +PHOTOCOPIER +PHOTOCOPIERS +PHOTOCOPIES +PHOTOCOPY +PHOTOCOPYING +PHOTODIODE +PHOTODIODES +PHOTOGENIC +PHOTOGRAPH +PHOTOGRAPHED +PHOTOGRAPHER +PHOTOGRAPHERS +PHOTOGRAPHIC +PHOTOGRAPHING +PHOTOGRAPHS +PHOTOGRAPHY +PHOTON +PHOTOS +PHOTOSENSITIVE +PHOTOTYPESETTER +PHOTOTYPESETTERS +PHRASE +PHRASED +PHRASEOLOGY +PHRASES +PHRASING +PHRASINGS +PHYLA +PHYLLIS +PHYLUM +PHYSIC +PHYSICAL +PHYSICALLY +PHYSICALNESS +PHYSICALS +PHYSICIAN +PHYSICIANS +PHYSICIST +PHYSICISTS +PHYSICS +PHYSIOLOGICAL +PHYSIOLOGICALLY +PHYSIOLOGY +PHYSIOTHERAPIST +PHYSIOTHERAPY +PHYSIQUE +PHYTOPLANKTON +PIANIST +PIANO +PIANOS +PICA +PICAS +PICASSO +PICAYUNE +PICCADILLY +PICCOLO +PICK +PICKAXE +PICKED +PICKER +PICKERING +PICKERS +PICKET +PICKETED +PICKETER +PICKETERS +PICKETING +PICKETS +PICKETT +PICKFORD +PICKING +PICKINGS +PICKLE +PICKLED +PICKLES +PICKLING +PICKMAN +PICKS +PICKUP +PICKUPS +PICKY +PICNIC +PICNICKED +PICNICKING +PICNICS +PICOFARAD +PICOJOULE +PICOSECOND +PICT +PICTORIAL +PICTORIALLY +PICTURE +PICTURED +PICTURES +PICTURESQUE +PICTURESQUENESS +PICTURING +PIDDLE +PIDGIN +PIE +PIECE +PIECED +PIECEMEAL +PIECES +PIECEWISE +PIECING +PIEDFORT +PIEDMONT +PIER +PIERCE +PIERCED +PIERCES +PIERCING +PIERRE +PIERS +PIERSON +PIES +PIETY +PIEZOELECTRIC +PIG +PIGEON +PIGEONHOLE +PIGEONS +PIGGISH +PIGGY +PIGGYBACK +PIGGYBACKED +PIGGYBACKING +PIGGYBACKS +PIGMENT +PIGMENTATION +PIGMENTED +PIGMENTS +PIGPEN +PIGS +PIGSKIN +PIGTAIL +PIKE +PIKER +PIKES +PILATE +PILE +PILED +PILERS +PILES +PILFER +PILFERAGE +PILGRIM +PILGRIMAGE +PILGRIMAGES +PILGRIMS +PILING +PILINGS +PILL +PILLAGE +PILLAGED +PILLAR +PILLARED +PILLARS +PILLORY +PILLOW +PILLOWS +PILLS +PILLSBURY +PILOT +PILOTING +PILOTS +PIMP +PIMPLE +PIN +PINAFORE +PINBALL +PINCH +PINCHED +PINCHES +PINCHING +PINCUSHION +PINE +PINEAPPLE +PINEAPPLES +PINED +PINEHURST +PINES +PING +PINHEAD +PINHOLE +PINING +PINION +PINK +PINKER +PINKEST +PINKIE +PINKISH +PINKLY +PINKNESS +PINKS +PINNACLE +PINNACLES +PINNED +PINNING +PINNINGS +PINOCHLE +PINPOINT +PINPOINTING +PINPOINTS +PINS +PINSCHER +PINSKY +PINT +PINTO +PINTS +PINWHEEL +PION +PIONEER +PIONEERED +PIONEERING +PIONEERS +PIOTR +PIOUS +PIOUSLY +PIP +PIPE +PIPED +PIPELINE +PIPELINED +PIPELINES +PIPELINING +PIPER +PIPERS +PIPES +PIPESTONE +PIPETTE +PIPING +PIQUE +PIRACY +PIRAEUS +PIRATE +PIRATES +PISA +PISCATAWAY +PISCES +PISS +PISTACHIO +PISTIL +PISTILS +PISTOL +PISTOLS +PISTON +PISTONS +PIT +PITCH +PITCHED +PITCHER +PITCHERS +PITCHES +PITCHFORK +PITCHING +PITEOUS +PITEOUSLY +PITFALL +PITFALLS +PITH +PITHED +PITHES +PITHIER +PITHIEST +PITHINESS +PITHING +PITHY +PITIABLE +PITIED +PITIER +PITIERS +PITIES +PITIFUL +PITIFULLY +PITILESS +PITILESSLY +PITNEY +PITS +PITT +PITTED +PITTSBURGH +PITTSBURGHERS +PITTSFIELD +PITTSTON +PITUITARY +PITY +PITYING +PITYINGLY +PIUS +PIVOT +PIVOTAL +PIVOTING +PIVOTS +PIXEL +PIXELS +PIZARRO +PIZZA +PLACARD +PLACARDS +PLACATE +PLACE +PLACEBO +PLACED +PLACEHOLDER +PLACEMENT +PLACEMENTS +PLACENTA +PLACENTAL +PLACER +PLACES +PLACID +PLACIDLY +PLACING +PLAGIARISM +PLAGIARIST +PLAGUE +PLAGUED +PLAGUES +PLAGUING +PLAID +PLAIDS +PLAIN +PLAINER +PLAINEST +PLAINFIELD +PLAINLY +PLAINNESS +PLAINS +PLAINTEXT +PLAINTEXTS +PLAINTIFF +PLAINTIFFS +PLAINTIVE +PLAINTIVELY +PLAINTIVENESS +PLAINVIEW +PLAIT +PLAITS +PLAN +PLANAR +PLANARITY +PLANCK +PLANE +PLANED +PLANELOAD +PLANER +PLANERS +PLANES +PLANET +PLANETARIA +PLANETARIUM +PLANETARY +PLANETESIMAL +PLANETOID +PLANETS +PLANING +PLANK +PLANKING +PLANKS +PLANKTON +PLANNED +PLANNER +PLANNERS +PLANNING +PLANOCONCAVE +PLANOCONVEX +PLANS +PLANT +PLANTATION +PLANTATIONS +PLANTED +PLANTER +PLANTERS +PLANTING +PLANTINGS +PLANTS +PLAQUE +PLASMA +PLASTER +PLASTERED +PLASTERER +PLASTERING +PLASTERS +PLASTIC +PLASTICITY +PLASTICS +PLATE +PLATEAU +PLATEAUS +PLATED +PLATELET +PLATELETS +PLATEN +PLATENS +PLATES +PLATFORM +PLATFORMS +PLATING +PLATINUM +PLATITUDE +PLATO +PLATONIC +PLATONISM +PLATONIST +PLATOON +PLATTE +PLATTER +PLATTERS +PLATTEVILLE +PLAUSIBILITY +PLAUSIBLE +PLAY +PLAYABLE +PLAYBACK +PLAYBOY +PLAYED +PLAYER +PLAYERS +PLAYFUL +PLAYFULLY +PLAYFULNESS +PLAYGROUND +PLAYGROUNDS +PLAYHOUSE +PLAYING +PLAYMATE +PLAYMATES +PLAYOFF +PLAYROOM +PLAYS +PLAYTHING +PLAYTHINGS +PLAYTIME +PLAYWRIGHT +PLAYWRIGHTS +PLAYWRITING +PLAZA +PLEA +PLEAD +PLEADED +PLEADER +PLEADING +PLEADS +PLEAS +PLEASANT +PLEASANTLY +PLEASANTNESS +PLEASE +PLEASED +PLEASES +PLEASING +PLEASINGLY +PLEASURE +PLEASURES +PLEAT +PLEBEIAN +PLEBIAN +PLEBISCITE +PLEBISCITES +PLEDGE +PLEDGED +PLEDGES +PLEIADES +PLEISTOCENE +PLENARY +PLENIPOTENTIARY +PLENTEOUS +PLENTIFUL +PLENTIFULLY +PLENTY +PLETHORA +PLEURISY +PLEXIGLAS +PLIABLE +PLIANT +PLIED +PLIERS +PLIES +PLIGHT +PLINY +PLIOCENE +PLOD +PLODDING +PLOT +PLOTS +PLOTTED +PLOTTER +PLOTTERS +PLOTTING +PLOW +PLOWED +PLOWER +PLOWING +PLOWMAN +PLOWS +PLOWSHARE +PLOY +PLOYS +PLUCK +PLUCKED +PLUCKING +PLUCKS +PLUCKY +PLUG +PLUGGABLE +PLUGGED +PLUGGING +PLUGS +PLUM +PLUMAGE +PLUMB +PLUMBED +PLUMBING +PLUMBS +PLUME +PLUMED +PLUMES +PLUMMET +PLUMMETING +PLUMP +PLUMPED +PLUMPNESS +PLUMS +PLUNDER +PLUNDERED +PLUNDERER +PLUNDERERS +PLUNDERING +PLUNDERS +PLUNGE +PLUNGED +PLUNGER +PLUNGERS +PLUNGES +PLUNGING +PLUNK +PLURAL +PLURALITY +PLURALS +PLUS +PLUSES +PLUSH +PLUTARCH +PLUTO +PLUTONIUM +PLY +PLYMOUTH +PLYWOOD +PNEUMATIC +PNEUMONIA +POACH +POACHER +POACHES +POCAHONTAS +POCKET +POCKETBOOK +POCKETBOOKS +POCKETED +POCKETFUL +POCKETING +POCKETS +POCONO +POCONOS +POD +PODIA +PODIUM +PODS +PODUNK +POE +POEM +POEMS +POET +POETIC +POETICAL +POETICALLY +POETICS +POETRIES +POETRY +POETS +POGO +POGROM +POIGNANCY +POIGNANT +POINCARE +POINDEXTER +POINT +POINTED +POINTEDLY +POINTER +POINTERS +POINTING +POINTLESS +POINTS +POINTY +POISE +POISED +POISES +POISON +POISONED +POISONER +POISONING +POISONOUS +POISONOUSNESS +POISONS +POISSON +POKE +POKED +POKER +POKERFACE +POKES +POKING +POLAND +POLAR +POLARIS +POLARITIES +POLARITY +POLAROID +POLE +POLECAT +POLED +POLEMIC +POLEMICS +POLES +POLICE +POLICED +POLICEMAN +POLICEMEN +POLICES +POLICIES +POLICING +POLICY +POLING +POLIO +POLISH +POLISHED +POLISHER +POLISHERS +POLISHES +POLISHING +POLITBURO +POLITE +POLITELY +POLITENESS +POLITER +POLITEST +POLITIC +POLITICAL +POLITICALLY +POLITICIAN +POLITICIANS +POLITICKING +POLITICS +POLK +POLKA +POLL +POLLARD +POLLED +POLLEN +POLLING +POLLOI +POLLS +POLLUTANT +POLLUTE +POLLUTED +POLLUTES +POLLUTING +POLLUTION +POLLUX +POLO +POLYALPHABETIC +POLYGON +POLYGONS +POLYHYMNIA +POLYMER +POLYMERS +POLYMORPHIC +POLYNESIA +POLYNESIAN +POLYNOMIAL +POLYNOMIALS +POLYPHEMUS +POLYTECHNIC +POLYTHEIST +POMERANIA +POMERANIAN +POMONA +POMP +POMPADOUR +POMPEII +POMPEY +POMPOSITY +POMPOUS +POMPOUSLY +POMPOUSNESS +PONCE +PONCHARTRAIN +PONCHO +POND +PONDER +PONDERED +PONDERING +PONDEROUS +PONDERS +PONDS +PONG +PONIES +PONTIAC +PONTIFF +PONTIFIC +PONTIFICATE +PONY +POOCH +POODLE +POOL +POOLE +POOLED +POOLING +POOLS +POOR +POORER +POOREST +POORLY +POORNESS +POP +POPCORN +POPE +POPEK +POPEKS +POPISH +POPLAR +POPLIN +POPPED +POPPIES +POPPING +POPPY +POPS +POPSICLE +POPSICLES +POPULACE +POPULAR +POPULARITY +POPULARIZATION +POPULARIZE +POPULARIZED +POPULARIZES +POPULARIZING +POPULARLY +POPULATE +POPULATED +POPULATES +POPULATING +POPULATION +POPULATIONS +POPULOUS +POPULOUSNESS +PORCELAIN +PORCH +PORCHES +PORCINE +PORCUPINE +PORCUPINES +PORE +PORED +PORES +PORING +PORK +PORKER +PORNOGRAPHER +PORNOGRAPHIC +PORNOGRAPHY +POROUS +PORPOISE +PORRIDGE +PORT +PORTABILITY +PORTABLE +PORTAGE +PORTAL +PORTALS +PORTE +PORTED +PORTEND +PORTENDED +PORTENDING +PORTENDS +PORTENT +PORTENTOUS +PORTER +PORTERHOUSE +PORTERS +PORTFOLIO +PORTFOLIOS +PORTIA +PORTICO +PORTING +PORTION +PORTIONS +PORTLAND +PORTLY +PORTMANTEAU +PORTO +PORTRAIT +PORTRAITS +PORTRAY +PORTRAYAL +PORTRAYED +PORTRAYING +PORTRAYS +PORTS +PORTSMOUTH +PORTUGAL +PORTUGUESE +POSE +POSED +POSEIDON +POSER +POSERS +POSES +POSH +POSING +POSIT +POSITED +POSITING +POSITION +POSITIONAL +POSITIONED +POSITIONING +POSITIONS +POSITIVE +POSITIVELY +POSITIVENESS +POSITIVES +POSITRON +POSITS +POSNER +POSSE +POSSESS +POSSESSED +POSSESSES +POSSESSING +POSSESSION +POSSESSIONAL +POSSESSIONS +POSSESSIVE +POSSESSIVELY +POSSESSIVENESS +POSSESSOR +POSSESSORS +POSSIBILITIES +POSSIBILITY +POSSIBLE +POSSIBLY +POSSUM +POSSUMS +POST +POSTAGE +POSTAL +POSTCARD +POSTCONDITION +POSTDOCTORAL +POSTED +POSTER +POSTERIOR +POSTERIORI +POSTERITY +POSTERS +POSTFIX +POSTGRADUATE +POSTING +POSTLUDE +POSTMAN +POSTMARK +POSTMASTER +POSTMASTERS +POSTMORTEM +POSTOPERATIVE +POSTORDER +POSTPONE +POSTPONED +POSTPONING +POSTPROCESS +POSTPROCESSOR +POSTS +POSTSCRIPT +POSTSCRIPTS +POSTULATE +POSTULATED +POSTULATES +POSTULATING +POSTULATION +POSTULATIONS +POSTURE +POSTURES +POT +POTABLE +POTASH +POTASSIUM +POTATO +POTATOES +POTBELLY +POTEMKIN +POTENT +POTENTATE +POTENTATES +POTENTIAL +POTENTIALITIES +POTENTIALITY +POTENTIALLY +POTENTIALS +POTENTIATING +POTENTIOMETER +POTENTIOMETERS +POTHOLE +POTION +POTLATCH +POTOMAC +POTPOURRI +POTS +POTSDAM +POTTAWATOMIE +POTTED +POTTER +POTTERS +POTTERY +POTTING +POTTS +POUCH +POUCHES +POUGHKEEPSIE +POULTICE +POULTRY +POUNCE +POUNCED +POUNCES +POUNCING +POUND +POUNDED +POUNDER +POUNDERS +POUNDING +POUNDS +POUR +POURED +POURER +POURERS +POURING +POURS +POUSSIN +POUSSINS +POUT +POUTED +POUTING +POUTS +POVERTY +POWDER +POWDERED +POWDERING +POWDERPUFF +POWDERS +POWDERY +POWELL +POWER +POWERED +POWERFUL +POWERFULLY +POWERFULNESS +POWERING +POWERLESS +POWERLESSLY +POWERLESSNESS +POWERS +POX +POYNTING +PRACTICABLE +PRACTICABLY +PRACTICAL +PRACTICALITY +PRACTICALLY +PRACTICE +PRACTICED +PRACTICES +PRACTICING +PRACTITIONER +PRACTITIONERS +PRADESH +PRADO +PRAGMATIC +PRAGMATICALLY +PRAGMATICS +PRAGMATISM +PRAGMATIST +PRAGUE +PRAIRIE +PRAISE +PRAISED +PRAISER +PRAISERS +PRAISES +PRAISEWORTHY +PRAISING +PRAISINGLY +PRANCE +PRANCED +PRANCER +PRANCING +PRANK +PRANKS +PRATE +PRATT +PRATTVILLE +PRAVDA +PRAY +PRAYED +PRAYER +PRAYERS +PRAYING +PREACH +PREACHED +PREACHER +PREACHERS +PREACHES +PREACHING +PREALLOCATE +PREALLOCATED +PREALLOCATING +PREAMBLE +PREAMBLES +PREASSIGN +PREASSIGNED +PREASSIGNING +PREASSIGNS +PRECAMBRIAN +PRECARIOUS +PRECARIOUSLY +PRECARIOUSNESS +PRECAUTION +PRECAUTIONS +PRECEDE +PRECEDED +PRECEDENCE +PRECEDENCES +PRECEDENT +PRECEDENTED +PRECEDENTS +PRECEDES +PRECEDING +PRECEPT +PRECEPTS +PRECESS +PRECESSION +PRECINCT +PRECINCTS +PRECIOUS +PRECIOUSLY +PRECIOUSNESS +PRECIPICE +PRECIPITABLE +PRECIPITATE +PRECIPITATED +PRECIPITATELY +PRECIPITATENESS +PRECIPITATES +PRECIPITATING +PRECIPITATION +PRECIPITOUS +PRECIPITOUSLY +PRECISE +PRECISELY +PRECISENESS +PRECISION +PRECISIONS +PRECLUDE +PRECLUDED +PRECLUDES +PRECLUDING +PRECOCIOUS +PRECOCIOUSLY +PRECOCITY +PRECOMPUTE +PRECOMPUTED +PRECOMPUTING +PRECONCEIVE +PRECONCEIVED +PRECONCEPTION +PRECONCEPTIONS +PRECONDITION +PRECONDITIONED +PRECONDITIONS +PRECURSOR +PRECURSORS +PREDATE +PREDATED +PREDATES +PREDATING +PREDATORY +PREDECESSOR +PREDECESSORS +PREDEFINE +PREDEFINED +PREDEFINES +PREDEFINING +PREDEFINITION +PREDEFINITIONS +PREDETERMINATION +PREDETERMINE +PREDETERMINED +PREDETERMINES +PREDETERMINING +PREDICAMENT +PREDICATE +PREDICATED +PREDICATES +PREDICATING +PREDICATION +PREDICATIONS +PREDICT +PREDICTABILITY +PREDICTABLE +PREDICTABLY +PREDICTED +PREDICTING +PREDICTION +PREDICTIONS +PREDICTIVE +PREDICTOR +PREDICTS +PREDILECTION +PREDILECTIONS +PREDISPOSITION +PREDOMINANT +PREDOMINANTLY +PREDOMINATE +PREDOMINATED +PREDOMINATELY +PREDOMINATES +PREDOMINATING +PREDOMINATION +PREEMINENCE +PREEMINENT +PREEMPT +PREEMPTED +PREEMPTING +PREEMPTION +PREEMPTIVE +PREEMPTOR +PREEMPTS +PREEN +PREEXISTING +PREFAB +PREFABRICATE +PREFACE +PREFACED +PREFACES +PREFACING +PREFER +PREFERABLE +PREFERABLY +PREFERENCE +PREFERENCES +PREFERENTIAL +PREFERENTIALLY +PREFERRED +PREFERRING +PREFERS +PREFIX +PREFIXED +PREFIXES +PREFIXING +PREGNANCY +PREGNANT +PREHISTORIC +PREINITIALIZE +PREINITIALIZED +PREINITIALIZES +PREINITIALIZING +PREJUDGE +PREJUDGED +PREJUDICE +PREJUDICED +PREJUDICES +PREJUDICIAL +PRELATE +PRELIMINARIES +PRELIMINARY +PRELUDE +PRELUDES +PREMATURE +PREMATURELY +PREMATURITY +PREMEDITATED +PREMEDITATION +PREMIER +PREMIERS +PREMISE +PREMISES +PREMIUM +PREMIUMS +PREMONITION +PRENATAL +PRENTICE +PRENTICED +PRENTICING +PREOCCUPATION +PREOCCUPIED +PREOCCUPIES +PREOCCUPY +PREP +PREPARATION +PREPARATIONS +PREPARATIVE +PREPARATIVES +PREPARATORY +PREPARE +PREPARED +PREPARES +PREPARING +PREPEND +PREPENDED +PREPENDING +PREPOSITION +PREPOSITIONAL +PREPOSITIONS +PREPOSTEROUS +PREPOSTEROUSLY +PREPROCESSED +PREPROCESSING +PREPROCESSOR +PREPROCESSORS +PREPRODUCTION +PREPROGRAMMED +PREREQUISITE +PREREQUISITES +PREROGATIVE +PREROGATIVES +PRESBYTERIAN +PRESBYTERIANISM +PRESBYTERIANIZE +PRESBYTERIANIZES +PRESCOTT +PRESCRIBE +PRESCRIBED +PRESCRIBES +PRESCRIPTION +PRESCRIPTIONS +PRESCRIPTIVE +PRESELECT +PRESELECTED +PRESELECTING +PRESELECTS +PRESENCE +PRESENCES +PRESENT +PRESENTATION +PRESENTATIONS +PRESENTED +PRESENTER +PRESENTING +PRESENTLY +PRESENTNESS +PRESENTS +PRESERVATION +PRESERVATIONS +PRESERVE +PRESERVED +PRESERVER +PRESERVERS +PRESERVES +PRESERVING +PRESET +PRESIDE +PRESIDED +PRESIDENCY +PRESIDENT +PRESIDENTIAL +PRESIDENTS +PRESIDES +PRESIDING +PRESLEY +PRESS +PRESSED +PRESSER +PRESSES +PRESSING +PRESSINGS +PRESSURE +PRESSURED +PRESSURES +PRESSURING +PRESSURIZE +PRESSURIZED +PRESTIDIGITATE +PRESTIGE +PRESTIGIOUS +PRESTON +PRESUMABLY +PRESUME +PRESUMED +PRESUMES +PRESUMING +PRESUMPTION +PRESUMPTIONS +PRESUMPTIVE +PRESUMPTUOUS +PRESUMPTUOUSNESS +PRESUPPOSE +PRESUPPOSED +PRESUPPOSES +PRESUPPOSING +PRESUPPOSITION +PRETEND +PRETENDED +PRETENDER +PRETENDERS +PRETENDING +PRETENDS +PRETENSE +PRETENSES +PRETENSION +PRETENSIONS +PRETENTIOUS +PRETENTIOUSLY +PRETENTIOUSNESS +PRETEXT +PRETEXTS +PRETORIA +PRETORIAN +PRETTIER +PRETTIEST +PRETTILY +PRETTINESS +PRETTY +PREVAIL +PREVAILED +PREVAILING +PREVAILINGLY +PREVAILS +PREVALENCE +PREVALENT +PREVALENTLY +PREVENT +PREVENTABLE +PREVENTABLY +PREVENTED +PREVENTING +PREVENTION +PREVENTIVE +PREVENTIVES +PREVENTS +PREVIEW +PREVIEWED +PREVIEWING +PREVIEWS +PREVIOUS +PREVIOUSLY +PREY +PREYED +PREYING +PREYS +PRIAM +PRICE +PRICED +PRICELESS +PRICER +PRICERS +PRICES +PRICING +PRICK +PRICKED +PRICKING +PRICKLY +PRICKS +PRIDE +PRIDED +PRIDES +PRIDING +PRIEST +PRIESTLEY +PRIGGISH +PRIM +PRIMA +PRIMACY +PRIMAL +PRIMARIES +PRIMARILY +PRIMARY +PRIMATE +PRIME +PRIMED +PRIMENESS +PRIMER +PRIMERS +PRIMES +PRIMEVAL +PRIMING +PRIMITIVE +PRIMITIVELY +PRIMITIVENESS +PRIMITIVES +PRIMROSE +PRINCE +PRINCELY +PRINCES +PRINCESS +PRINCESSES +PRINCETON +PRINCIPAL +PRINCIPALITIES +PRINCIPALITY +PRINCIPALLY +PRINCIPALS +PRINCIPIA +PRINCIPLE +PRINCIPLED +PRINCIPLES +PRINT +PRINTABLE +PRINTABLY +PRINTED +PRINTER +PRINTERS +PRINTING +PRINTOUT +PRINTS +PRIOR +PRIORI +PRIORITIES +PRIORITY +PRIORY +PRISCILLA +PRISM +PRISMS +PRISON +PRISONER +PRISONERS +PRISONS +PRISTINE +PRITCHARD +PRIVACIES +PRIVACY +PRIVATE +PRIVATELY +PRIVATES +PRIVATION +PRIVATIONS +PRIVIES +PRIVILEGE +PRIVILEGED +PRIVILEGES +PRIVY +PRIZE +PRIZED +PRIZER +PRIZERS +PRIZES +PRIZEWINNING +PRIZING +PRO +PROBABILISTIC +PROBABILISTICALLY +PROBABILITIES +PROBABILITY +PROBABLE +PROBABLY +PROBATE +PROBATED +PROBATES +PROBATING +PROBATION +PROBATIVE +PROBE +PROBED +PROBES +PROBING +PROBINGS +PROBITY +PROBLEM +PROBLEMATIC +PROBLEMATICAL +PROBLEMATICALLY +PROBLEMS +PROCAINE +PROCEDURAL +PROCEDURALLY +PROCEDURE +PROCEDURES +PROCEED +PROCEEDED +PROCEEDING +PROCEEDINGS +PROCEEDS +PROCESS +PROCESSED +PROCESSES +PROCESSING +PROCESSION +PROCESSOR +PROCESSORS +PROCLAIM +PROCLAIMED +PROCLAIMER +PROCLAIMERS +PROCLAIMING +PROCLAIMS +PROCLAMATION +PROCLAMATIONS +PROCLIVITIES +PROCLIVITY +PROCOTOLS +PROCRASTINATE +PROCRASTINATED +PROCRASTINATES +PROCRASTINATING +PROCRASTINATION +PROCREATE +PROCRUSTEAN +PROCRUSTEANIZE +PROCRUSTEANIZES +PROCRUSTES +PROCTER +PROCURE +PROCURED +PROCUREMENT +PROCUREMENTS +PROCURER +PROCURERS +PROCURES +PROCURING +PROCYON +PROD +PRODIGAL +PRODIGALLY +PRODIGIOUS +PRODIGY +PRODUCE +PRODUCED +PRODUCER +PRODUCERS +PRODUCES +PRODUCIBLE +PRODUCING +PRODUCT +PRODUCTION +PRODUCTIONS +PRODUCTIVE +PRODUCTIVELY +PRODUCTIVITY +PRODUCTS +PROFANE +PROFANELY +PROFESS +PROFESSED +PROFESSES +PROFESSING +PROFESSION +PROFESSIONAL +PROFESSIONALISM +PROFESSIONALLY +PROFESSIONALS +PROFESSIONS +PROFESSOR +PROFESSORIAL +PROFESSORS +PROFFER +PROFFERED +PROFFERS +PROFICIENCY +PROFICIENT +PROFICIENTLY +PROFILE +PROFILED +PROFILES +PROFILING +PROFIT +PROFITABILITY +PROFITABLE +PROFITABLY +PROFITED +PROFITEER +PROFITEERS +PROFITING +PROFITS +PROFITTED +PROFLIGATE +PROFOUND +PROFOUNDEST +PROFOUNDLY +PROFUNDITY +PROFUSE +PROFUSION +PROGENITOR +PROGENY +PROGNOSIS +PROGNOSTICATE +PROGRAM +PROGRAMMABILITY +PROGRAMMABLE +PROGRAMMED +PROGRAMMER +PROGRAMMERS +PROGRAMMING +PROGRAMS +PROGRESS +PROGRESSED +PROGRESSES +PROGRESSING +PROGRESSION +PROGRESSIONS +PROGRESSIVE +PROGRESSIVELY +PROHIBIT +PROHIBITED +PROHIBITING +PROHIBITION +PROHIBITIONS +PROHIBITIVE +PROHIBITIVELY +PROHIBITORY +PROHIBITS +PROJECT +PROJECTED +PROJECTILE +PROJECTING +PROJECTION +PROJECTIONS +PROJECTIVE +PROJECTIVELY +PROJECTOR +PROJECTORS +PROJECTS +PROKOFIEFF +PROKOFIEV +PROLATE +PROLEGOMENA +PROLETARIAT +PROLIFERATE +PROLIFERATED +PROLIFERATES +PROLIFERATING +PROLIFERATION +PROLIFIC +PROLIX +PROLOG +PROLOGUE +PROLONG +PROLONGATE +PROLONGED +PROLONGING +PROLONGS +PROMENADE +PROMENADES +PROMETHEAN +PROMETHEUS +PROMINENCE +PROMINENT +PROMINENTLY +PROMISCUOUS +PROMISE +PROMISED +PROMISES +PROMISING +PROMONTORY +PROMOTE +PROMOTED +PROMOTER +PROMOTERS +PROMOTES +PROMOTING +PROMOTION +PROMOTIONAL +PROMOTIONS +PROMPT +PROMPTED +PROMPTER +PROMPTEST +PROMPTING +PROMPTINGS +PROMPTLY +PROMPTNESS +PROMPTS +PROMULGATE +PROMULGATED +PROMULGATES +PROMULGATING +PROMULGATION +PRONE +PRONENESS +PRONG +PRONGED +PRONGS +PRONOUN +PRONOUNCE +PRONOUNCEABLE +PRONOUNCED +PRONOUNCEMENT +PRONOUNCEMENTS +PRONOUNCES +PRONOUNCING +PRONOUNS +PRONUNCIATION +PRONUNCIATIONS +PROOF +PROOFREAD +PROOFREADER +PROOFS +PROP +PROPAGANDA +PROPAGANDIST +PROPAGATE +PROPAGATED +PROPAGATES +PROPAGATING +PROPAGATION +PROPAGATIONS +PROPANE +PROPEL +PROPELLANT +PROPELLED +PROPELLER +PROPELLERS +PROPELLING +PROPELS +PROPENSITY +PROPER +PROPERLY +PROPERNESS +PROPERTIED +PROPERTIES +PROPERTY +PROPHECIES +PROPHECY +PROPHESIED +PROPHESIER +PROPHESIES +PROPHESY +PROPHET +PROPHETIC +PROPHETS +PROPITIOUS +PROPONENT +PROPONENTS +PROPORTION +PROPORTIONAL +PROPORTIONALLY +PROPORTIONATELY +PROPORTIONED +PROPORTIONING +PROPORTIONMENT +PROPORTIONS +PROPOS +PROPOSAL +PROPOSALS +PROPOSE +PROPOSED +PROPOSER +PROPOSES +PROPOSING +PROPOSITION +PROPOSITIONAL +PROPOSITIONALLY +PROPOSITIONED +PROPOSITIONING +PROPOSITIONS +PROPOUND +PROPOUNDED +PROPOUNDING +PROPOUNDS +PROPRIETARY +PROPRIETOR +PROPRIETORS +PROPRIETY +PROPS +PROPULSION +PROPULSIONS +PRORATE +PRORATED +PRORATES +PROS +PROSCENIUM +PROSCRIBE +PROSCRIPTION +PROSE +PROSECUTE +PROSECUTED +PROSECUTES +PROSECUTING +PROSECUTION +PROSECUTIONS +PROSECUTOR +PROSELYTIZE +PROSELYTIZED +PROSELYTIZES +PROSELYTIZING +PROSERPINE +PROSODIC +PROSODICS +PROSPECT +PROSPECTED +PROSPECTING +PROSPECTION +PROSPECTIONS +PROSPECTIVE +PROSPECTIVELY +PROSPECTIVES +PROSPECTOR +PROSPECTORS +PROSPECTS +PROSPECTUS +PROSPER +PROSPERED +PROSPERING +PROSPERITY +PROSPEROUS +PROSPERS +PROSTATE +PROSTHETIC +PROSTITUTE +PROSTITUTION +PROSTRATE +PROSTRATION +PROTAGONIST +PROTEAN +PROTECT +PROTECTED +PROTECTING +PROTECTION +PROTECTIONS +PROTECTIVE +PROTECTIVELY +PROTECTIVENESS +PROTECTOR +PROTECTORATE +PROTECTORS +PROTECTS +PROTEGE +PROTEGES +PROTEIN +PROTEINS +PROTEST +PROTESTANT +PROTESTANTISM +PROTESTANTIZE +PROTESTANTIZES +PROTESTATION +PROTESTATIONS +PROTESTED +PROTESTING +PROTESTINGLY +PROTESTOR +PROTESTS +PROTISTA +PROTOCOL +PROTOCOLS +PROTON +PROTONS +PROTOPHYTA +PROTOPLASM +PROTOTYPE +PROTOTYPED +PROTOTYPES +PROTOTYPICAL +PROTOTYPICALLY +PROTOTYPING +PROTOZOA +PROTOZOAN +PROTRACT +PROTRUDE +PROTRUDED +PROTRUDES +PROTRUDING +PROTRUSION +PROTRUSIONS +PROTUBERANT +PROUD +PROUDER +PROUDEST +PROUDLY +PROUST +PROVABILITY +PROVABLE +PROVABLY +PROVE +PROVED +PROVEN +PROVENANCE +PROVENCE +PROVER +PROVERB +PROVERBIAL +PROVERBS +PROVERS +PROVES +PROVIDE +PROVIDED +PROVIDENCE +PROVIDENT +PROVIDER +PROVIDERS +PROVIDES +PROVIDING +PROVINCE +PROVINCES +PROVINCIAL +PROVING +PROVISION +PROVISIONAL +PROVISIONALLY +PROVISIONED +PROVISIONING +PROVISIONS +PROVISO +PROVOCATION +PROVOKE +PROVOKED +PROVOKES +PROVOST +PROW +PROWESS +PROWL +PROWLED +PROWLER +PROWLERS +PROWLING +PROWS +PROXIMAL +PROXIMATE +PROXIMITY +PROXMIRE +PROXY +PRUDENCE +PRUDENT +PRUDENTIAL +PRUDENTLY +PRUNE +PRUNED +PRUNER +PRUNERS +PRUNES +PRUNING +PRURIENT +PRUSSIA +PRUSSIAN +PRUSSIANIZATION +PRUSSIANIZATIONS +PRUSSIANIZE +PRUSSIANIZER +PRUSSIANIZERS +PRUSSIANIZES +PRY +PRYING +PSALM +PSALMS +PSEUDO +PSEUDOFILES +PSEUDOINSTRUCTION +PSEUDOINSTRUCTIONS +PSEUDONYM +PSEUDOPARALLELISM +PSILOCYBIN +PSYCH +PSYCHE +PSYCHEDELIC +PSYCHES +PSYCHIATRIC +PSYCHIATRIST +PSYCHIATRISTS +PSYCHIATRY +PSYCHIC +PSYCHO +PSYCHOANALYSIS +PSYCHOANALYST +PSYCHOANALYTIC +PSYCHOBIOLOGY +PSYCHOLOGICAL +PSYCHOLOGICALLY +PSYCHOLOGIST +PSYCHOLOGISTS +PSYCHOLOGY +PSYCHOPATH +PSYCHOPATHIC +PSYCHOPHYSIC +PSYCHOSES +PSYCHOSIS +PSYCHOSOCIAL +PSYCHOSOMATIC +PSYCHOTHERAPEUTIC +PSYCHOTHERAPIST +PSYCHOTHERAPY +PSYCHOTIC +PTOLEMAIC +PTOLEMAISTS +PTOLEMY +PUB +PUBERTY +PUBLIC +PUBLICATION +PUBLICATIONS +PUBLICITY +PUBLICIZE +PUBLICIZED +PUBLICIZES +PUBLICIZING +PUBLICLY +PUBLISH +PUBLISHED +PUBLISHER +PUBLISHERS +PUBLISHES +PUBLISHING +PUBS +PUCCINI +PUCKER +PUCKERED +PUCKERING +PUCKERS +PUDDING +PUDDINGS +PUDDLE +PUDDLES +PUDDLING +PUERTO +PUFF +PUFFED +PUFFIN +PUFFING +PUFFS +PUGH +PUKE +PULASKI +PULITZER +PULL +PULLED +PULLER +PULLEY +PULLEYS +PULLING +PULLINGS +PULLMAN +PULLMANIZE +PULLMANIZES +PULLMANS +PULLOVER +PULLS +PULMONARY +PULP +PULPING +PULPIT +PULPITS +PULSAR +PULSATE +PULSATION +PULSATIONS +PULSE +PULSED +PULSES +PULSING +PUMA +PUMICE +PUMMEL +PUMP +PUMPED +PUMPING +PUMPKIN +PUMPKINS +PUMPS +PUN +PUNCH +PUNCHED +PUNCHER +PUNCHES +PUNCHING +PUNCTUAL +PUNCTUALLY +PUNCTUATION +PUNCTURE +PUNCTURED +PUNCTURES +PUNCTURING +PUNDIT +PUNGENT +PUNIC +PUNISH +PUNISHABLE +PUNISHED +PUNISHES +PUNISHING +PUNISHMENT +PUNISHMENTS +PUNITIVE +PUNJAB +PUNJABI +PUNS +PUNT +PUNTED +PUNTING +PUNTS +PUNY +PUP +PUPA +PUPIL +PUPILS +PUPPET +PUPPETEER +PUPPETS +PUPPIES +PUPPY +PUPS +PURCELL +PURCHASE +PURCHASED +PURCHASER +PURCHASERS +PURCHASES +PURCHASING +PURDUE +PURE +PURELY +PURER +PUREST +PURGATORY +PURGE +PURGED +PURGES +PURGING +PURIFICATION +PURIFICATIONS +PURIFIED +PURIFIER +PURIFIERS +PURIFIES +PURIFY +PURIFYING +PURINA +PURIST +PURITAN +PURITANIC +PURITANIZE +PURITANIZER +PURITANIZERS +PURITANIZES +PURITY +PURPLE +PURPLER +PURPLEST +PURPORT +PURPORTED +PURPORTEDLY +PURPORTER +PURPORTERS +PURPORTING +PURPORTS +PURPOSE +PURPOSED +PURPOSEFUL +PURPOSEFULLY +PURPOSELY +PURPOSES +PURPOSIVE +PURR +PURRED +PURRING +PURRS +PURSE +PURSED +PURSER +PURSES +PURSUANT +PURSUE +PURSUED +PURSUER +PURSUERS +PURSUES +PURSUING +PURSUIT +PURSUITS +PURVEYOR +PURVIEW +PUS +PUSAN +PUSEY +PUSH +PUSHBUTTON +PUSHDOWN +PUSHED +PUSHER +PUSHERS +PUSHES +PUSHING +PUSS +PUSSY +PUSSYCAT +PUT +PUTNAM +PUTS +PUTT +PUTTER +PUTTERING +PUTTERS +PUTTING +PUTTY +PUZZLE +PUZZLED +PUZZLEMENT +PUZZLER +PUZZLERS +PUZZLES +PUZZLING +PUZZLINGS +PYGMALION +PYGMIES +PYGMY +PYLE +PYONGYANG +PYOTR +PYRAMID +PYRAMIDS +PYRE +PYREX +PYRRHIC +PYTHAGORAS +PYTHAGOREAN +PYTHAGOREANIZE +PYTHAGOREANIZES +PYTHAGOREANS +PYTHON +QATAR +QUA +QUACK +QUACKED +QUACKERY +QUACKS +QUAD +QUADRANGLE +QUADRANGULAR +QUADRANT +QUADRANTS +QUADRATIC +QUADRATICAL +QUADRATICALLY +QUADRATICS +QUADRATURE +QUADRATURES +QUADRENNIAL +QUADRILATERAL +QUADRILLION +QUADRUPLE +QUADRUPLED +QUADRUPLES +QUADRUPLING +QUADRUPOLE +QUAFF +QUAGMIRE +QUAGMIRES +QUAHOG +QUAIL +QUAILS +QUAINT +QUAINTLY +QUAINTNESS +QUAKE +QUAKED +QUAKER +QUAKERESS +QUAKERIZATION +QUAKERIZATIONS +QUAKERIZE +QUAKERIZES +QUAKERS +QUAKES +QUAKING +QUALIFICATION +QUALIFICATIONS +QUALIFIED +QUALIFIER +QUALIFIERS +QUALIFIES +QUALIFY +QUALIFYING +QUALITATIVE +QUALITATIVELY +QUALITIES +QUALITY +QUALM +QUANDARIES +QUANDARY +QUANTA +QUANTICO +QUANTIFIABLE +QUANTIFICATION +QUANTIFICATIONS +QUANTIFIED +QUANTIFIER +QUANTIFIERS +QUANTIFIES +QUANTIFY +QUANTIFYING +QUANTILE +QUANTITATIVE +QUANTITATIVELY +QUANTITIES +QUANTITY +QUANTIZATION +QUANTIZE +QUANTIZED +QUANTIZES +QUANTIZING +QUANTUM +QUARANTINE +QUARANTINES +QUARANTINING +QUARK +QUARREL +QUARRELED +QUARRELING +QUARRELS +QUARRELSOME +QUARRIES +QUARRY +QUART +QUARTER +QUARTERBACK +QUARTERED +QUARTERING +QUARTERLY +QUARTERMASTER +QUARTERS +QUARTET +QUARTETS +QUARTILE +QUARTS +QUARTZ +QUARTZITE +QUASAR +QUASH +QUASHED +QUASHES +QUASHING +QUASI +QUASIMODO +QUATERNARY +QUAVER +QUAVERED +QUAVERING +QUAVERS +QUAY +QUEASY +QUEBEC +QUEEN +QUEENLY +QUEENS +QUEENSLAND +QUEER +QUEERER +QUEEREST +QUEERLY +QUEERNESS +QUELL +QUELLING +QUENCH +QUENCHED +QUENCHES +QUENCHING +QUERIED +QUERIES +QUERY +QUERYING +QUEST +QUESTED +QUESTER +QUESTERS +QUESTING +QUESTION +QUESTIONABLE +QUESTIONABLY +QUESTIONED +QUESTIONER +QUESTIONERS +QUESTIONING +QUESTIONINGLY +QUESTIONINGS +QUESTIONNAIRE +QUESTIONNAIRES +QUESTIONS +QUESTS +QUEUE +QUEUED +QUEUEING +QUEUER +QUEUERS +QUEUES +QUEUING +QUEZON +QUIBBLE +QUICHUA +QUICK +QUICKEN +QUICKENED +QUICKENING +QUICKENS +QUICKER +QUICKEST +QUICKIE +QUICKLIME +QUICKLY +QUICKNESS +QUICKSAND +QUICKSILVER +QUIESCENT +QUIET +QUIETED +QUIETER +QUIETEST +QUIETING +QUIETLY +QUIETNESS +QUIETS +QUIETUDE +QUILL +QUILT +QUILTED +QUILTING +QUILTS +QUINCE +QUININE +QUINN +QUINT +QUINTET +QUINTILLION +QUIP +QUIRINAL +QUIRK +QUIRKY +QUIT +QUITE +QUITO +QUITS +QUITTER +QUITTERS +QUITTING +QUIVER +QUIVERED +QUIVERING +QUIVERS +QUIXOTE +QUIXOTIC +QUIXOTISM +QUIZ +QUIZZED +QUIZZES +QUIZZICAL +QUIZZING +QUO +QUONSET +QUORUM +QUOTA +QUOTAS +QUOTATION +QUOTATIONS +QUOTE +QUOTED +QUOTES +QUOTH +QUOTIENT +QUOTIENTS +QUOTING +RABAT +RABBI +RABBIT +RABBITS +RABBLE +RABID +RABIES +RABIN +RACCOON +RACCOONS +RACE +RACED +RACER +RACERS +RACES +RACETRACK +RACHEL +RACHMANINOFF +RACIAL +RACIALLY +RACINE +RACING +RACK +RACKED +RACKET +RACKETEER +RACKETEERING +RACKETEERS +RACKETS +RACKING +RACKS +RADAR +RADARS +RADCLIFFE +RADIAL +RADIALLY +RADIAN +RADIANCE +RADIANT +RADIANTLY +RADIATE +RADIATED +RADIATES +RADIATING +RADIATION +RADIATIONS +RADIATOR +RADIATORS +RADICAL +RADICALLY +RADICALS +RADICES +RADII +RADIO +RADIOACTIVE +RADIOASTRONOMY +RADIOED +RADIOGRAPHY +RADIOING +RADIOLOGY +RADIOS +RADISH +RADISHES +RADIUM +RADIUS +RADIX +RADON +RAE +RAFAEL +RAFFERTY +RAFT +RAFTER +RAFTERS +RAFTS +RAG +RAGE +RAGED +RAGES +RAGGED +RAGGEDLY +RAGGEDNESS +RAGING +RAGS +RAGUSAN +RAGWEED +RAID +RAIDED +RAIDER +RAIDERS +RAIDING +RAIDS +RAIL +RAILED +RAILER +RAILERS +RAILING +RAILROAD +RAILROADED +RAILROADER +RAILROADERS +RAILROADING +RAILROADS +RAILS +RAILWAY +RAILWAYS +RAIMENT +RAIN +RAINBOW +RAINCOAT +RAINCOATS +RAINDROP +RAINDROPS +RAINED +RAINFALL +RAINIER +RAINIEST +RAINING +RAINS +RAINSTORM +RAINY +RAISE +RAISED +RAISER +RAISERS +RAISES +RAISIN +RAISING +RAKE +RAKED +RAKES +RAKING +RALEIGH +RALLIED +RALLIES +RALLY +RALLYING +RALPH +RALSTON +RAM +RAMADA +RAMAN +RAMBLE +RAMBLER +RAMBLES +RAMBLING +RAMBLINGS +RAMIFICATION +RAMIFICATIONS +RAMIREZ +RAMO +RAMONA +RAMP +RAMPAGE +RAMPANT +RAMPART +RAMPS +RAMROD +RAMS +RAMSEY +RAN +RANCH +RANCHED +RANCHER +RANCHERS +RANCHES +RANCHING +RANCID +RAND +RANDALL +RANDOLPH +RANDOM +RANDOMIZATION +RANDOMIZE +RANDOMIZED +RANDOMIZES +RANDOMLY +RANDOMNESS +RANDY +RANG +RANGE +RANGED +RANGELAND +RANGER +RANGERS +RANGES +RANGING +RANGOON +RANGY +RANIER +RANK +RANKED +RANKER +RANKERS +RANKEST +RANKIN +RANKINE +RANKING +RANKINGS +RANKLE +RANKLY +RANKNESS +RANKS +RANSACK +RANSACKED +RANSACKING +RANSACKS +RANSOM +RANSOMER +RANSOMING +RANSOMS +RANT +RANTED +RANTER +RANTERS +RANTING +RANTS +RAOUL +RAP +RAPACIOUS +RAPE +RAPED +RAPER +RAPES +RAPHAEL +RAPID +RAPIDITY +RAPIDLY +RAPIDS +RAPIER +RAPING +RAPPORT +RAPPROCHEMENT +RAPS +RAPT +RAPTLY +RAPTURE +RAPTURES +RAPTUROUS +RAPUNZEL +RARE +RARELY +RARENESS +RARER +RAREST +RARITAN +RARITY +RASCAL +RASCALLY +RASCALS +RASH +RASHER +RASHLY +RASHNESS +RASMUSSEN +RASP +RASPBERRY +RASPED +RASPING +RASPS +RASTER +RASTUS +RAT +RATE +RATED +RATER +RATERS +RATES +RATFOR +RATHER +RATIFICATION +RATIFIED +RATIFIES +RATIFY +RATIFYING +RATING +RATINGS +RATIO +RATION +RATIONAL +RATIONALE +RATIONALES +RATIONALITIES +RATIONALITY +RATIONALIZATION +RATIONALIZATIONS +RATIONALIZE +RATIONALIZED +RATIONALIZES +RATIONALIZING +RATIONALLY +RATIONALS +RATIONING +RATIONS +RATIOS +RATS +RATTLE +RATTLED +RATTLER +RATTLERS +RATTLES +RATTLESNAKE +RATTLESNAKES +RATTLING +RAUCOUS +RAUL +RAVAGE +RAVAGED +RAVAGER +RAVAGERS +RAVAGES +RAVAGING +RAVE +RAVED +RAVEN +RAVENING +RAVENOUS +RAVENOUSLY +RAVENS +RAVES +RAVINE +RAVINES +RAVING +RAVINGS +RAW +RAWER +RAWEST +RAWLINGS +RAWLINS +RAWLINSON +RAWLY +RAWNESS +RAWSON +RAY +RAYBURN +RAYLEIGH +RAYMOND +RAYMONDVILLE +RAYS +RAYTHEON +RAZE +RAZOR +RAZORS +REABBREVIATE +REABBREVIATED +REABBREVIATES +REABBREVIATING +REACH +REACHABILITY +REACHABLE +REACHABLY +REACHED +REACHER +REACHES +REACHING +REACQUIRED +REACT +REACTED +REACTING +REACTION +REACTIONARIES +REACTIONARY +REACTIONS +REACTIVATE +REACTIVATED +REACTIVATES +REACTIVATING +REACTIVATION +REACTIVE +REACTIVELY +REACTIVITY +REACTOR +REACTORS +REACTS +READ +READABILITY +READABLE +READER +READERS +READIED +READIER +READIES +READIEST +READILY +READINESS +READING +READINGS +READJUSTED +READOUT +READOUTS +READS +READY +READYING +REAGAN +REAL +REALEST +REALIGN +REALIGNED +REALIGNING +REALIGNS +REALISM +REALIST +REALISTIC +REALISTICALLY +REALISTS +REALITIES +REALITY +REALIZABLE +REALIZABLY +REALIZATION +REALIZATIONS +REALIZE +REALIZED +REALIZES +REALIZING +REALLOCATE +REALLY +REALM +REALMS +REALNESS +REALS +REALTOR +REAM +REANALYZE +REANALYZES +REANALYZING +REAP +REAPED +REAPER +REAPING +REAPPEAR +REAPPEARED +REAPPEARING +REAPPEARS +REAPPRAISAL +REAPPRAISALS +REAPS +REAR +REARED +REARING +REARRANGE +REARRANGEABLE +REARRANGED +REARRANGEMENT +REARRANGEMENTS +REARRANGES +REARRANGING +REARREST +REARRESTED +REARS +REASON +REASONABLE +REASONABLENESS +REASONABLY +REASONED +REASONER +REASONING +REASONINGS +REASONS +REASSEMBLE +REASSEMBLED +REASSEMBLES +REASSEMBLING +REASSEMBLY +REASSESSMENT +REASSESSMENTS +REASSIGN +REASSIGNED +REASSIGNING +REASSIGNMENT +REASSIGNMENTS +REASSIGNS +REASSURE +REASSURED +REASSURES +REASSURING +REAWAKEN +REAWAKENED +REAWAKENING +REAWAKENS +REBATE +REBATES +REBECCA +REBEL +REBELLED +REBELLING +REBELLION +REBELLIONS +REBELLIOUS +REBELLIOUSLY +REBELLIOUSNESS +REBELS +REBIND +REBINDING +REBINDS +REBOOT +REBOOTED +REBOOTING +REBOOTS +REBOUND +REBOUNDED +REBOUNDING +REBOUNDS +REBROADCAST +REBROADCASTING +REBROADCASTS +REBUFF +REBUFFED +REBUILD +REBUILDING +REBUILDS +REBUILT +REBUKE +REBUKED +REBUKES +REBUKING +REBUTTAL +REBUTTED +REBUTTING +RECALCITRANT +RECALCULATE +RECALCULATED +RECALCULATES +RECALCULATING +RECALCULATION +RECALCULATIONS +RECALIBRATE +RECALIBRATED +RECALIBRATES +RECALIBRATING +RECALL +RECALLED +RECALLING +RECALLS +RECANT +RECAPITULATE +RECAPITULATED +RECAPITULATES +RECAPITULATION +RECAPTURE +RECAPTURED +RECAPTURES +RECAPTURING +RECAST +RECASTING +RECASTS +RECEDE +RECEDED +RECEDES +RECEDING +RECEIPT +RECEIPTS +RECEIVABLE +RECEIVE +RECEIVED +RECEIVER +RECEIVERS +RECEIVES +RECEIVING +RECENT +RECENTLY +RECENTNESS +RECEPTACLE +RECEPTACLES +RECEPTION +RECEPTIONIST +RECEPTIONS +RECEPTIVE +RECEPTIVELY +RECEPTIVENESS +RECEPTIVITY +RECEPTOR +RECESS +RECESSED +RECESSES +RECESSION +RECESSIVE +RECIFE +RECIPE +RECIPES +RECIPIENT +RECIPIENTS +RECIPROCAL +RECIPROCALLY +RECIPROCATE +RECIPROCATED +RECIPROCATES +RECIPROCATING +RECIPROCATION +RECIPROCITY +RECIRCULATE +RECIRCULATED +RECIRCULATES +RECIRCULATING +RECITAL +RECITALS +RECITATION +RECITATIONS +RECITE +RECITED +RECITER +RECITES +RECITING +RECKLESS +RECKLESSLY +RECKLESSNESS +RECKON +RECKONED +RECKONER +RECKONING +RECKONINGS +RECKONS +RECLAIM +RECLAIMABLE +RECLAIMED +RECLAIMER +RECLAIMERS +RECLAIMING +RECLAIMS +RECLAMATION +RECLAMATIONS +RECLASSIFICATION +RECLASSIFIED +RECLASSIFIES +RECLASSIFY +RECLASSIFYING +RECLINE +RECLINING +RECODE +RECODED +RECODES +RECODING +RECOGNITION +RECOGNITIONS +RECOGNIZABILITY +RECOGNIZABLE +RECOGNIZABLY +RECOGNIZE +RECOGNIZED +RECOGNIZER +RECOGNIZERS +RECOGNIZES +RECOGNIZING +RECOIL +RECOILED +RECOILING +RECOILS +RECOLLECT +RECOLLECTED +RECOLLECTING +RECOLLECTION +RECOLLECTIONS +RECOMBINATION +RECOMBINE +RECOMBINED +RECOMBINES +RECOMBINING +RECOMMEND +RECOMMENDATION +RECOMMENDATIONS +RECOMMENDED +RECOMMENDER +RECOMMENDING +RECOMMENDS +RECOMPENSE +RECOMPILE +RECOMPILED +RECOMPILES +RECOMPILING +RECOMPUTE +RECOMPUTED +RECOMPUTES +RECOMPUTING +RECONCILE +RECONCILED +RECONCILER +RECONCILES +RECONCILIATION +RECONCILING +RECONFIGURABLE +RECONFIGURATION +RECONFIGURATIONS +RECONFIGURE +RECONFIGURED +RECONFIGURER +RECONFIGURES +RECONFIGURING +RECONNECT +RECONNECTED +RECONNECTING +RECONNECTION +RECONNECTS +RECONSIDER +RECONSIDERATION +RECONSIDERED +RECONSIDERING +RECONSIDERS +RECONSTITUTED +RECONSTRUCT +RECONSTRUCTED +RECONSTRUCTING +RECONSTRUCTION +RECONSTRUCTS +RECONVERTED +RECONVERTS +RECORD +RECORDED +RECORDER +RECORDERS +RECORDING +RECORDINGS +RECORDS +RECOUNT +RECOUNTED +RECOUNTING +RECOUNTS +RECOURSE +RECOVER +RECOVERABLE +RECOVERED +RECOVERIES +RECOVERING +RECOVERS +RECOVERY +RECREATE +RECREATED +RECREATES +RECREATING +RECREATION +RECREATIONAL +RECREATIONS +RECREATIVE +RECRUIT +RECRUITED +RECRUITER +RECRUITING +RECRUITS +RECTA +RECTANGLE +RECTANGLES +RECTANGULAR +RECTIFY +RECTOR +RECTORS +RECTUM +RECTUMS +RECUPERATE +RECUR +RECURRENCE +RECURRENCES +RECURRENT +RECURRENTLY +RECURRING +RECURS +RECURSE +RECURSED +RECURSES +RECURSING +RECURSION +RECURSIONS +RECURSIVE +RECURSIVELY +RECYCLABLE +RECYCLE +RECYCLED +RECYCLES +RECYCLING +RED +REDBREAST +REDCOAT +REDDEN +REDDENED +REDDER +REDDEST +REDDISH +REDDISHNESS +REDECLARE +REDECLARED +REDECLARES +REDECLARING +REDEEM +REDEEMED +REDEEMER +REDEEMERS +REDEEMING +REDEEMS +REDEFINE +REDEFINED +REDEFINES +REDEFINING +REDEFINITION +REDEFINITIONS +REDEMPTION +REDESIGN +REDESIGNED +REDESIGNING +REDESIGNS +REDEVELOPMENT +REDFORD +REDHEAD +REDHOOK +REDIRECT +REDIRECTED +REDIRECTING +REDIRECTION +REDIRECTIONS +REDISPLAY +REDISPLAYED +REDISPLAYING +REDISPLAYS +REDISTRIBUTE +REDISTRIBUTED +REDISTRIBUTES +REDISTRIBUTING +REDLY +REDMOND +REDNECK +REDNESS +REDO +REDONE +REDOUBLE +REDOUBLED +REDRAW +REDRAWN +REDRESS +REDRESSED +REDRESSES +REDRESSING +REDS +REDSTONE +REDUCE +REDUCED +REDUCER +REDUCERS +REDUCES +REDUCIBILITY +REDUCIBLE +REDUCIBLY +REDUCING +REDUCTION +REDUCTIONS +REDUNDANCIES +REDUNDANCY +REDUNDANT +REDUNDANTLY +REDWOOD +REED +REEDS +REEDUCATION +REEDVILLE +REEF +REEFER +REEFS +REEL +REELECT +REELECTED +REELECTING +REELECTS +REELED +REELER +REELING +REELS +REEMPHASIZE +REEMPHASIZED +REEMPHASIZES +REEMPHASIZING +REENABLED +REENFORCEMENT +REENTER +REENTERED +REENTERING +REENTERS +REENTRANT +REESE +REESTABLISH +REESTABLISHED +REESTABLISHES +REESTABLISHING +REEVALUATE +REEVALUATED +REEVALUATES +REEVALUATING +REEVALUATION +REEVES +REEXAMINE +REEXAMINED +REEXAMINES +REEXAMINING +REEXECUTED +REFER +REFEREE +REFEREED +REFEREEING +REFEREES +REFERENCE +REFERENCED +REFERENCER +REFERENCES +REFERENCING +REFERENDA +REFERENDUM +REFERENDUMS +REFERENT +REFERENTIAL +REFERENTIALITY +REFERENTIALLY +REFERENTS +REFERRAL +REFERRALS +REFERRED +REFERRING +REFERS +REFILL +REFILLABLE +REFILLED +REFILLING +REFILLS +REFINE +REFINED +REFINEMENT +REFINEMENTS +REFINER +REFINERY +REFINES +REFINING +REFLECT +REFLECTED +REFLECTING +REFLECTION +REFLECTIONS +REFLECTIVE +REFLECTIVELY +REFLECTIVITY +REFLECTOR +REFLECTORS +REFLECTS +REFLEX +REFLEXES +REFLEXIVE +REFLEXIVELY +REFLEXIVENESS +REFLEXIVITY +REFORESTATION +REFORM +REFORMABLE +REFORMAT +REFORMATION +REFORMATORY +REFORMATS +REFORMATTED +REFORMATTING +REFORMED +REFORMER +REFORMERS +REFORMING +REFORMS +REFORMULATE +REFORMULATED +REFORMULATES +REFORMULATING +REFORMULATION +REFRACT +REFRACTED +REFRACTION +REFRACTORY +REFRAGMENT +REFRAIN +REFRAINED +REFRAINING +REFRAINS +REFRESH +REFRESHED +REFRESHER +REFRESHERS +REFRESHES +REFRESHING +REFRESHINGLY +REFRESHMENT +REFRESHMENTS +REFRIGERATE +REFRIGERATOR +REFRIGERATORS +REFUEL +REFUELED +REFUELING +REFUELS +REFUGE +REFUGEE +REFUGEES +REFUSAL +REFUSE +REFUSED +REFUSES +REFUSING +REFUTABLE +REFUTATION +REFUTE +REFUTED +REFUTER +REFUTES +REFUTING +REGAIN +REGAINED +REGAINING +REGAINS +REGAL +REGALED +REGALLY +REGARD +REGARDED +REGARDING +REGARDLESS +REGARDS +REGATTA +REGENERATE +REGENERATED +REGENERATES +REGENERATING +REGENERATION +REGENERATIVE +REGENERATOR +REGENERATORS +REGENT +REGENTS +REGIME +REGIMEN +REGIMENT +REGIMENTATION +REGIMENTED +REGIMENTS +REGIMES +REGINA +REGINALD +REGION +REGIONAL +REGIONALLY +REGIONS +REGIS +REGISTER +REGISTERED +REGISTERING +REGISTERS +REGISTRAR +REGISTRATION +REGISTRATIONS +REGISTRY +REGRESS +REGRESSED +REGRESSES +REGRESSING +REGRESSION +REGRESSIONS +REGRESSIVE +REGRET +REGRETFUL +REGRETFULLY +REGRETS +REGRETTABLE +REGRETTABLY +REGRETTED +REGRETTING +REGROUP +REGROUPED +REGROUPING +REGULAR +REGULARITIES +REGULARITY +REGULARLY +REGULARS +REGULATE +REGULATED +REGULATES +REGULATING +REGULATION +REGULATIONS +REGULATIVE +REGULATOR +REGULATORS +REGULATORY +REGULUS +REHABILITATE +REHEARSAL +REHEARSALS +REHEARSE +REHEARSED +REHEARSER +REHEARSES +REHEARSING +REICH +REICHENBERG +REICHSTAG +REID +REIGN +REIGNED +REIGNING +REIGNS +REILLY +REIMBURSABLE +REIMBURSE +REIMBURSED +REIMBURSEMENT +REIMBURSEMENTS +REIN +REINCARNATE +REINCARNATED +REINCARNATION +REINDEER +REINED +REINFORCE +REINFORCED +REINFORCEMENT +REINFORCEMENTS +REINFORCER +REINFORCES +REINFORCING +REINHARD +REINHARDT +REINHOLD +REINITIALIZE +REINITIALIZED +REINITIALIZING +REINS +REINSERT +REINSERTED +REINSERTING +REINSERTS +REINSTATE +REINSTATED +REINSTATEMENT +REINSTATES +REINSTATING +REINTERPRET +REINTERPRETED +REINTERPRETING +REINTERPRETS +REINTRODUCE +REINTRODUCED +REINTRODUCES +REINTRODUCING +REINVENT +REINVENTED +REINVENTING +REINVENTS +REITERATE +REITERATED +REITERATES +REITERATING +REITERATION +REJECT +REJECTED +REJECTING +REJECTION +REJECTIONS +REJECTOR +REJECTORS +REJECTS +REJOICE +REJOICED +REJOICER +REJOICES +REJOICING +REJOIN +REJOINDER +REJOINED +REJOINING +REJOINS +RELABEL +RELABELED +RELABELING +RELABELLED +RELABELLING +RELABELS +RELAPSE +RELATE +RELATED +RELATER +RELATES +RELATING +RELATION +RELATIONAL +RELATIONALLY +RELATIONS +RELATIONSHIP +RELATIONSHIPS +RELATIVE +RELATIVELY +RELATIVENESS +RELATIVES +RELATIVISM +RELATIVISTIC +RELATIVISTICALLY +RELATIVITY +RELAX +RELAXATION +RELAXATIONS +RELAXED +RELAXER +RELAXES +RELAXING +RELAY +RELAYED +RELAYING +RELAYS +RELEASE +RELEASED +RELEASES +RELEASING +RELEGATE +RELEGATED +RELEGATES +RELEGATING +RELENT +RELENTED +RELENTING +RELENTLESS +RELENTLESSLY +RELENTLESSNESS +RELENTS +RELEVANCE +RELEVANCES +RELEVANT +RELEVANTLY +RELIABILITY +RELIABLE +RELIABLY +RELIANCE +RELIANT +RELIC +RELICS +RELIED +RELIEF +RELIES +RELIEVE +RELIEVED +RELIEVER +RELIEVERS +RELIEVES +RELIEVING +RELIGION +RELIGIONS +RELIGIOUS +RELIGIOUSLY +RELIGIOUSNESS +RELINK +RELINQUISH +RELINQUISHED +RELINQUISHES +RELINQUISHING +RELISH +RELISHED +RELISHES +RELISHING +RELIVE +RELIVES +RELIVING +RELOAD +RELOADED +RELOADER +RELOADING +RELOADS +RELOCATABLE +RELOCATE +RELOCATED +RELOCATES +RELOCATING +RELOCATION +RELOCATIONS +RELUCTANCE +RELUCTANT +RELUCTANTLY +RELY +RELYING +REMAIN +REMAINDER +REMAINDERS +REMAINED +REMAINING +REMAINS +REMARK +REMARKABLE +REMARKABLENESS +REMARKABLY +REMARKED +REMARKING +REMARKS +REMBRANDT +REMEDIAL +REMEDIED +REMEDIES +REMEDY +REMEDYING +REMEMBER +REMEMBERED +REMEMBERING +REMEMBERS +REMEMBRANCE +REMEMBRANCES +REMIND +REMINDED +REMINDER +REMINDERS +REMINDING +REMINDS +REMINGTON +REMINISCENCE +REMINISCENCES +REMINISCENT +REMINISCENTLY +REMISS +REMISSION +REMIT +REMITTANCE +REMNANT +REMNANTS +REMODEL +REMODELED +REMODELING +REMODELS +REMONSTRATE +REMONSTRATED +REMONSTRATES +REMONSTRATING +REMONSTRATION +REMONSTRATIVE +REMORSE +REMORSEFUL +REMOTE +REMOTELY +REMOTENESS +REMOTEST +REMOVABLE +REMOVAL +REMOVALS +REMOVE +REMOVED +REMOVER +REMOVES +REMOVING +REMUNERATE +REMUNERATION +REMUS +REMY +RENA +RENAISSANCE +RENAL +RENAME +RENAMED +RENAMES +RENAMING +RENAULT +RENAULTS +REND +RENDER +RENDERED +RENDERING +RENDERINGS +RENDERS +RENDEZVOUS +RENDING +RENDITION +RENDITIONS +RENDS +RENE +RENEE +RENEGADE +RENEGOTIABLE +RENEW +RENEWABLE +RENEWAL +RENEWED +RENEWER +RENEWING +RENEWS +RENO +RENOIR +RENOUNCE +RENOUNCES +RENOUNCING +RENOVATE +RENOVATED +RENOVATION +RENOWN +RENOWNED +RENSSELAER +RENT +RENTAL +RENTALS +RENTED +RENTING +RENTS +RENUMBER +RENUMBERING +RENUMBERS +RENUNCIATE +RENUNCIATION +RENVILLE +REOCCUR +REOPEN +REOPENED +REOPENING +REOPENS +REORDER +REORDERED +REORDERING +REORDERS +REORGANIZATION +REORGANIZATIONS +REORGANIZE +REORGANIZED +REORGANIZES +REORGANIZING +REPACKAGE +REPAID +REPAIR +REPAIRED +REPAIRER +REPAIRING +REPAIRMAN +REPAIRMEN +REPAIRS +REPARATION +REPARATIONS +REPARTEE +REPARTITION +REPAST +REPASTS +REPAY +REPAYING +REPAYS +REPEAL +REPEALED +REPEALER +REPEALING +REPEALS +REPEAT +REPEATABLE +REPEATED +REPEATEDLY +REPEATER +REPEATERS +REPEATING +REPEATS +REPEL +REPELLED +REPELLENT +REPELS +REPENT +REPENTANCE +REPENTED +REPENTING +REPENTS +REPERCUSSION +REPERCUSSIONS +REPERTOIRE +REPERTORY +REPETITION +REPETITIONS +REPETITIOUS +REPETITIVE +REPETITIVELY +REPETITIVENESS +REPHRASE +REPHRASED +REPHRASES +REPHRASING +REPINE +REPLACE +REPLACEABLE +REPLACED +REPLACEMENT +REPLACEMENTS +REPLACER +REPLACES +REPLACING +REPLAY +REPLAYED +REPLAYING +REPLAYS +REPLENISH +REPLENISHED +REPLENISHES +REPLENISHING +REPLETE +REPLETENESS +REPLETION +REPLICA +REPLICAS +REPLICATE +REPLICATED +REPLICATES +REPLICATING +REPLICATION +REPLICATIONS +REPLIED +REPLIES +REPLY +REPLYING +REPORT +REPORTED +REPORTEDLY +REPORTER +REPORTERS +REPORTING +REPORTS +REPOSE +REPOSED +REPOSES +REPOSING +REPOSITION +REPOSITIONED +REPOSITIONING +REPOSITIONS +REPOSITORIES +REPOSITORY +REPREHENSIBLE +REPRESENT +REPRESENTABLE +REPRESENTABLY +REPRESENTATION +REPRESENTATIONAL +REPRESENTATIONALLY +REPRESENTATIONS +REPRESENTATIVE +REPRESENTATIVELY +REPRESENTATIVENESS +REPRESENTATIVES +REPRESENTED +REPRESENTING +REPRESENTS +REPRESS +REPRESSED +REPRESSES +REPRESSING +REPRESSION +REPRESSIONS +REPRESSIVE +REPRIEVE +REPRIEVED +REPRIEVES +REPRIEVING +REPRIMAND +REPRINT +REPRINTED +REPRINTING +REPRINTS +REPRISAL +REPRISALS +REPROACH +REPROACHED +REPROACHES +REPROACHING +REPROBATE +REPRODUCE +REPRODUCED +REPRODUCER +REPRODUCERS +REPRODUCES +REPRODUCIBILITIES +REPRODUCIBILITY +REPRODUCIBLE +REPRODUCIBLY +REPRODUCING +REPRODUCTION +REPRODUCTIONS +REPROGRAM +REPROGRAMMED +REPROGRAMMING +REPROGRAMS +REPROOF +REPROVE +REPROVER +REPTILE +REPTILES +REPTILIAN +REPUBLIC +REPUBLICAN +REPUBLICANS +REPUBLICS +REPUDIATE +REPUDIATED +REPUDIATES +REPUDIATING +REPUDIATION +REPUDIATIONS +REPUGNANT +REPULSE +REPULSED +REPULSES +REPULSING +REPULSION +REPULSIONS +REPULSIVE +REPUTABLE +REPUTABLY +REPUTATION +REPUTATIONS +REPUTE +REPUTED +REPUTEDLY +REPUTES +REQUEST +REQUESTED +REQUESTER +REQUESTERS +REQUESTING +REQUESTS +REQUIRE +REQUIRED +REQUIREMENT +REQUIREMENTS +REQUIRES +REQUIRING +REQUISITE +REQUISITES +REQUISITION +REQUISITIONED +REQUISITIONING +REQUISITIONS +REREAD +REREGISTER +REROUTE +REROUTED +REROUTES +REROUTING +RERUN +RERUNS +RESCHEDULE +RESCIND +RESCUE +RESCUED +RESCUER +RESCUERS +RESCUES +RESCUING +RESEARCH +RESEARCHED +RESEARCHER +RESEARCHERS +RESEARCHES +RESEARCHING +RESELECT +RESELECTED +RESELECTING +RESELECTS +RESELL +RESELLING +RESEMBLANCE +RESEMBLANCES +RESEMBLE +RESEMBLED +RESEMBLES +RESEMBLING +RESENT +RESENTED +RESENTFUL +RESENTFULLY +RESENTING +RESENTMENT +RESENTS +RESERPINE +RESERVATION +RESERVATIONS +RESERVE +RESERVED +RESERVER +RESERVES +RESERVING +RESERVOIR +RESERVOIRS +RESET +RESETS +RESETTING +RESETTINGS +RESIDE +RESIDED +RESIDENCE +RESIDENCES +RESIDENT +RESIDENTIAL +RESIDENTIALLY +RESIDENTS +RESIDES +RESIDING +RESIDUAL +RESIDUE +RESIDUES +RESIGN +RESIGNATION +RESIGNATIONS +RESIGNED +RESIGNING +RESIGNS +RESILIENT +RESIN +RESINS +RESIST +RESISTABLE +RESISTANCE +RESISTANCES +RESISTANT +RESISTANTLY +RESISTED +RESISTIBLE +RESISTING +RESISTIVE +RESISTIVITY +RESISTOR +RESISTORS +RESISTS +RESOLUTE +RESOLUTELY +RESOLUTENESS +RESOLUTION +RESOLUTIONS +RESOLVABLE +RESOLVE +RESOLVED +RESOLVER +RESOLVERS +RESOLVES +RESOLVING +RESONANCE +RESONANCES +RESONANT +RESONATE +RESORT +RESORTED +RESORTING +RESORTS +RESOUND +RESOUNDING +RESOUNDS +RESOURCE +RESOURCEFUL +RESOURCEFULLY +RESOURCEFULNESS +RESOURCES +RESPECT +RESPECTABILITY +RESPECTABLE +RESPECTABLY +RESPECTED +RESPECTER +RESPECTFUL +RESPECTFULLY +RESPECTFULNESS +RESPECTING +RESPECTIVE +RESPECTIVELY +RESPECTS +RESPIRATION +RESPIRATOR +RESPIRATORY +RESPITE +RESPLENDENT +RESPLENDENTLY +RESPOND +RESPONDED +RESPONDENT +RESPONDENTS +RESPONDER +RESPONDING +RESPONDS +RESPONSE +RESPONSES +RESPONSIBILITIES +RESPONSIBILITY +RESPONSIBLE +RESPONSIBLENESS +RESPONSIBLY +RESPONSIVE +RESPONSIVELY +RESPONSIVENESS +REST +RESTART +RESTARTED +RESTARTING +RESTARTS +RESTATE +RESTATED +RESTATEMENT +RESTATES +RESTATING +RESTAURANT +RESTAURANTS +RESTAURATEUR +RESTED +RESTFUL +RESTFULLY +RESTFULNESS +RESTING +RESTITUTION +RESTIVE +RESTLESS +RESTLESSLY +RESTLESSNESS +RESTORATION +RESTORATIONS +RESTORE +RESTORED +RESTORER +RESTORERS +RESTORES +RESTORING +RESTRAIN +RESTRAINED +RESTRAINER +RESTRAINERS +RESTRAINING +RESTRAINS +RESTRAINT +RESTRAINTS +RESTRICT +RESTRICTED +RESTRICTING +RESTRICTION +RESTRICTIONS +RESTRICTIVE +RESTRICTIVELY +RESTRICTS +RESTROOM +RESTRUCTURE +RESTRUCTURED +RESTRUCTURES +RESTRUCTURING +RESTS +RESULT +RESULTANT +RESULTANTLY +RESULTANTS +RESULTED +RESULTING +RESULTS +RESUMABLE +RESUME +RESUMED +RESUMES +RESUMING +RESUMPTION +RESUMPTIONS +RESURGENT +RESURRECT +RESURRECTED +RESURRECTING +RESURRECTION +RESURRECTIONS +RESURRECTOR +RESURRECTORS +RESURRECTS +RESUSCITATE +RESYNCHRONIZATION +RESYNCHRONIZE +RESYNCHRONIZED +RESYNCHRONIZING +RETAIL +RETAILER +RETAILERS +RETAILING +RETAIN +RETAINED +RETAINER +RETAINERS +RETAINING +RETAINMENT +RETAINS +RETALIATE +RETALIATION +RETALIATORY +RETARD +RETARDED +RETARDER +RETARDING +RETCH +RETENTION +RETENTIONS +RETENTIVE +RETENTIVELY +RETENTIVENESS +RETICLE +RETICLES +RETICULAR +RETICULATE +RETICULATED +RETICULATELY +RETICULATES +RETICULATING +RETICULATION +RETINA +RETINAL +RETINAS +RETINUE +RETIRE +RETIRED +RETIREE +RETIREMENT +RETIREMENTS +RETIRES +RETIRING +RETORT +RETORTED +RETORTS +RETRACE +RETRACED +RETRACES +RETRACING +RETRACT +RETRACTED +RETRACTING +RETRACTION +RETRACTIONS +RETRACTS +RETRAIN +RETRAINED +RETRAINING +RETRAINS +RETRANSLATE +RETRANSLATED +RETRANSMISSION +RETRANSMISSIONS +RETRANSMIT +RETRANSMITS +RETRANSMITTED +RETRANSMITTING +RETREAT +RETREATED +RETREATING +RETREATS +RETRIBUTION +RETRIED +RETRIER +RETRIERS +RETRIES +RETRIEVABLE +RETRIEVAL +RETRIEVALS +RETRIEVE +RETRIEVED +RETRIEVER +RETRIEVERS +RETRIEVES +RETRIEVING +RETROACTIVE +RETROACTIVELY +RETROFIT +RETROFITTING +RETROGRADE +RETROSPECT +RETROSPECTION +RETROSPECTIVE +RETRY +RETRYING +RETURN +RETURNABLE +RETURNED +RETURNER +RETURNING +RETURNS +RETYPE +RETYPED +RETYPES +RETYPING +REUB +REUBEN +REUNION +REUNIONS +REUNITE +REUNITED +REUNITING +REUSABLE +REUSE +REUSED +REUSES +REUSING +REUTERS +REUTHER +REVAMP +REVAMPED +REVAMPING +REVAMPS +REVEAL +REVEALED +REVEALING +REVEALS +REVEL +REVELATION +REVELATIONS +REVELED +REVELER +REVELING +REVELRY +REVELS +REVENGE +REVENGER +REVENUE +REVENUERS +REVENUES +REVERBERATE +REVERE +REVERED +REVERENCE +REVEREND +REVERENDS +REVERENT +REVERENTLY +REVERES +REVERIE +REVERIFIED +REVERIFIES +REVERIFY +REVERIFYING +REVERING +REVERSAL +REVERSALS +REVERSE +REVERSED +REVERSELY +REVERSER +REVERSES +REVERSIBLE +REVERSING +REVERSION +REVERT +REVERTED +REVERTING +REVERTS +REVIEW +REVIEWED +REVIEWER +REVIEWERS +REVIEWING +REVIEWS +REVILE +REVILED +REVILER +REVILING +REVISE +REVISED +REVISER +REVISES +REVISING +REVISION +REVISIONARY +REVISIONS +REVISIT +REVISITED +REVISITING +REVISITS +REVIVAL +REVIVALS +REVIVE +REVIVED +REVIVER +REVIVES +REVIVING +REVOCABLE +REVOCATION +REVOKE +REVOKED +REVOKER +REVOKES +REVOKING +REVOLT +REVOLTED +REVOLTER +REVOLTING +REVOLTINGLY +REVOLTS +REVOLUTION +REVOLUTIONARIES +REVOLUTIONARY +REVOLUTIONIZE +REVOLUTIONIZED +REVOLUTIONIZER +REVOLUTIONS +REVOLVE +REVOLVED +REVOLVER +REVOLVERS +REVOLVES +REVOLVING +REVULSION +REWARD +REWARDED +REWARDING +REWARDINGLY +REWARDS +REWIND +REWINDING +REWINDS +REWIRE +REWORK +REWORKED +REWORKING +REWORKS +REWOUND +REWRITE +REWRITES +REWRITING +REWRITTEN +REX +REYKJAVIK +REYNOLDS +RHAPSODY +RHEA +RHEIMS +RHEINHOLDT +RHENISH +RHESUS +RHETORIC +RHEUMATIC +RHEUMATISM +RHINE +RHINESTONE +RHINO +RHINOCEROS +RHO +RHODA +RHODE +RHODES +RHODESIA +RHODODENDRON +RHOMBIC +RHOMBUS +RHUBARB +RHYME +RHYMED +RHYMES +RHYMING +RHYTHM +RHYTHMIC +RHYTHMICALLY +RHYTHMS +RIB +RIBALD +RIBBED +RIBBING +RIBBON +RIBBONS +RIBOFLAVIN +RIBONUCLEIC +RIBS +RICA +RICAN +RICANISM +RICANS +RICE +RICH +RICHARD +RICHARDS +RICHARDSON +RICHER +RICHES +RICHEST +RICHEY +RICHFIELD +RICHLAND +RICHLY +RICHMOND +RICHNESS +RICHTER +RICK +RICKENBAUGH +RICKETS +RICKETTSIA +RICKETY +RICKSHAW +RICKSHAWS +RICO +RICOCHET +RID +RIDDANCE +RIDDEN +RIDDING +RIDDLE +RIDDLED +RIDDLES +RIDDLING +RIDE +RIDER +RIDERS +RIDES +RIDGE +RIDGEFIELD +RIDGEPOLE +RIDGES +RIDGWAY +RIDICULE +RIDICULED +RIDICULES +RIDICULING +RIDICULOUS +RIDICULOUSLY +RIDICULOUSNESS +RIDING +RIDS +RIEMANN +RIEMANNIAN +RIFLE +RIFLED +RIFLEMAN +RIFLER +RIFLES +RIFLING +RIFT +RIG +RIGA +RIGEL +RIGGING +RIGGS +RIGHT +RIGHTED +RIGHTEOUS +RIGHTEOUSLY +RIGHTEOUSNESS +RIGHTER +RIGHTFUL +RIGHTFULLY +RIGHTFULNESS +RIGHTING +RIGHTLY +RIGHTMOST +RIGHTNESS +RIGHTS +RIGHTWARD +RIGID +RIGIDITY +RIGIDLY +RIGOR +RIGOROUS +RIGOROUSLY +RIGORS +RIGS +RILEY +RILKE +RILL +RIM +RIME +RIMS +RIND +RINDS +RINEHART +RING +RINGED +RINGER +RINGERS +RINGING +RINGINGLY +RINGINGS +RINGS +RINGSIDE +RINK +RINSE +RINSED +RINSER +RINSES +RINSING +RIO +RIORDAN +RIOT +RIOTED +RIOTER +RIOTERS +RIOTING +RIOTOUS +RIOTS +RIP +RIPE +RIPELY +RIPEN +RIPENESS +RIPLEY +RIPOFF +RIPPED +RIPPING +RIPPLE +RIPPLED +RIPPLES +RIPPLING +RIPS +RISC +RISE +RISEN +RISER +RISERS +RISES +RISING +RISINGS +RISK +RISKED +RISKING +RISKS +RISKY +RITCHIE +RITE +RITES +RITTER +RITUAL +RITUALLY +RITUALS +RITZ +RIVAL +RIVALED +RIVALLED +RIVALLING +RIVALRIES +RIVALRY +RIVALS +RIVER +RIVERBANK +RIVERFRONT +RIVERS +RIVERSIDE +RIVERVIEW +RIVET +RIVETER +RIVETS +RIVIERA +RIVULET +RIVULETS +RIYADH +ROACH +ROAD +ROADBED +ROADBLOCK +ROADS +ROADSIDE +ROADSTER +ROADSTERS +ROADWAY +ROADWAYS +ROAM +ROAMED +ROAMING +ROAMS +ROAR +ROARED +ROARER +ROARING +ROARS +ROAST +ROASTED +ROASTER +ROASTING +ROASTS +ROB +ROBBED +ROBBER +ROBBERIES +ROBBERS +ROBBERY +ROBBIE +ROBBIN +ROBBING +ROBBINS +ROBE +ROBED +ROBERT +ROBERTA +ROBERTO +ROBERTS +ROBERTSON +ROBERTSONS +ROBES +ROBIN +ROBING +ROBINS +ROBINSON +ROBINSONVILLE +ROBOT +ROBOTIC +ROBOTICS +ROBOTS +ROBS +ROBUST +ROBUSTLY +ROBUSTNESS +ROCCO +ROCHESTER +ROCHFORD +ROCK +ROCKABYE +ROCKAWAY +ROCKAWAYS +ROCKED +ROCKEFELLER +ROCKER +ROCKERS +ROCKET +ROCKETED +ROCKETING +ROCKETS +ROCKFORD +ROCKIES +ROCKING +ROCKLAND +ROCKS +ROCKVILLE +ROCKWELL +ROCKY +ROD +RODE +RODENT +RODENTS +RODEO +RODGERS +RODNEY +RODRIGUEZ +RODS +ROE +ROENTGEN +ROGER +ROGERS +ROGUE +ROGUES +ROLAND +ROLE +ROLES +ROLL +ROLLBACK +ROLLED +ROLLER +ROLLERS +ROLLIE +ROLLING +ROLLINS +ROLLS +ROMAN +ROMANCE +ROMANCER +ROMANCERS +ROMANCES +ROMANCING +ROMANESQUE +ROMANIA +ROMANIZATIONS +ROMANIZER +ROMANIZERS +ROMANIZES +ROMANO +ROMANS +ROMANTIC +ROMANTICS +ROME +ROMELDALE +ROMEO +ROMP +ROMPED +ROMPER +ROMPING +ROMPS +ROMULUS +RON +RONALD +RONNIE +ROOF +ROOFED +ROOFER +ROOFING +ROOFS +ROOFTOP +ROOK +ROOKIE +ROOM +ROOMED +ROOMER +ROOMERS +ROOMFUL +ROOMING +ROOMMATE +ROOMS +ROOMY +ROONEY +ROOSEVELT +ROOSEVELTIAN +ROOST +ROOSTER +ROOSTERS +ROOT +ROOTED +ROOTER +ROOTING +ROOTS +ROPE +ROPED +ROPER +ROPERS +ROPES +ROPING +ROQUEMORE +RORSCHACH +ROSA +ROSABELLE +ROSALIE +ROSARY +ROSE +ROSEBUD +ROSEBUDS +ROSEBUSH +ROSELAND +ROSELLA +ROSEMARY +ROSEN +ROSENBERG +ROSENBLUM +ROSENTHAL +ROSENZWEIG +ROSES +ROSETTA +ROSETTE +ROSIE +ROSINESS +ROSS +ROSSI +ROSTER +ROSTRUM +ROSWELL +ROSY +ROT +ROTARIAN +ROTARIANS +ROTARY +ROTATE +ROTATED +ROTATES +ROTATING +ROTATION +ROTATIONAL +ROTATIONS +ROTATOR +ROTH +ROTHSCHILD +ROTOR +ROTS +ROTTEN +ROTTENNESS +ROTTERDAM +ROTTING +ROTUND +ROTUNDA +ROUGE +ROUGH +ROUGHED +ROUGHEN +ROUGHER +ROUGHEST +ROUGHLY +ROUGHNECK +ROUGHNESS +ROULETTE +ROUND +ROUNDABOUT +ROUNDED +ROUNDEDNESS +ROUNDER +ROUNDEST +ROUNDHEAD +ROUNDHOUSE +ROUNDING +ROUNDLY +ROUNDNESS +ROUNDOFF +ROUNDS +ROUNDTABLE +ROUNDUP +ROUNDWORM +ROURKE +ROUSE +ROUSED +ROUSES +ROUSING +ROUSSEAU +ROUSTABOUT +ROUT +ROUTE +ROUTED +ROUTER +ROUTERS +ROUTES +ROUTINE +ROUTINELY +ROUTINES +ROUTING +ROUTINGS +ROVE +ROVED +ROVER +ROVES +ROVING +ROW +ROWBOAT +ROWDY +ROWE +ROWED +ROWENA +ROWER +ROWING +ROWLAND +ROWLEY +ROWS +ROXBURY +ROXY +ROY +ROYAL +ROYALIST +ROYALISTS +ROYALLY +ROYALTIES +ROYALTY +ROYCE +ROZELLE +RUANDA +RUB +RUBAIYAT +RUBBED +RUBBER +RUBBERS +RUBBERY +RUBBING +RUBBISH +RUBBLE +RUBDOWN +RUBE +RUBEN +RUBENS +RUBIES +RUBIN +RUBLE +RUBLES +RUBOUT +RUBS +RUBY +RUDDER +RUDDERS +RUDDINESS +RUDDY +RUDE +RUDELY +RUDENESS +RUDIMENT +RUDIMENTARY +RUDIMENTS +RUDOLF +RUDOLPH +RUDY +RUDYARD +RUE +RUEFULLY +RUFFIAN +RUFFIANLY +RUFFIANS +RUFFLE +RUFFLED +RUFFLES +RUFUS +RUG +RUGGED +RUGGEDLY +RUGGEDNESS +RUGS +RUIN +RUINATION +RUINATIONS +RUINED +RUINING +RUINOUS +RUINOUSLY +RUINS +RULE +RULED +RULER +RULERS +RULES +RULING +RULINGS +RUM +RUMANIA +RUMANIAN +RUMANIANS +RUMBLE +RUMBLED +RUMBLER +RUMBLES +RUMBLING +RUMEN +RUMFORD +RUMMAGE +RUMMEL +RUMMY +RUMOR +RUMORED +RUMORS +RUMP +RUMPLE +RUMPLED +RUMPLY +RUMPUS +RUN +RUNAWAY +RUNDOWN +RUNG +RUNGE +RUNGS +RUNNABLE +RUNNER +RUNNERS +RUNNING +RUNNYMEDE +RUNOFF +RUNS +RUNT +RUNTIME +RUNYON +RUPEE +RUPPERT +RUPTURE +RUPTURED +RUPTURES +RUPTURING +RURAL +RURALLY +RUSH +RUSHED +RUSHER +RUSHES +RUSHING +RUSHMORE +RUSS +RUSSELL +RUSSET +RUSSIA +RUSSIAN +RUSSIANIZATIONS +RUSSIANIZES +RUSSIANS +RUSSO +RUST +RUSTED +RUSTIC +RUSTICATE +RUSTICATED +RUSTICATES +RUSTICATING +RUSTICATION +RUSTING +RUSTLE +RUSTLED +RUSTLER +RUSTLERS +RUSTLING +RUSTS +RUSTY +RUT +RUTGERS +RUTH +RUTHERFORD +RUTHLESS +RUTHLESSLY +RUTHLESSNESS +RUTLAND +RUTLEDGE +RUTS +RWANDA +RYAN +RYDBERG +RYDER +RYE +SABBATH +SABBATHIZE +SABBATHIZES +SABBATICAL +SABER +SABERS +SABINA +SABINE +SABLE +SABLES +SABOTAGE +SACHS +SACK +SACKER +SACKING +SACKS +SACRAMENT +SACRAMENTO +SACRED +SACREDLY +SACREDNESS +SACRIFICE +SACRIFICED +SACRIFICER +SACRIFICERS +SACRIFICES +SACRIFICIAL +SACRIFICIALLY +SACRIFICING +SACRILEGE +SACRILEGIOUS +SACROSANCT +SAD +SADDEN +SADDENED +SADDENS +SADDER +SADDEST +SADDLE +SADDLEBAG +SADDLED +SADDLES +SADIE +SADISM +SADIST +SADISTIC +SADISTICALLY +SADISTS +SADLER +SADLY +SADNESS +SAFARI +SAFE +SAFEGUARD +SAFEGUARDED +SAFEGUARDING +SAFEGUARDS +SAFEKEEPING +SAFELY +SAFENESS +SAFER +SAFES +SAFEST +SAFETIES +SAFETY +SAFFRON +SAG +SAGA +SAGACIOUS +SAGACITY +SAGE +SAGEBRUSH +SAGELY +SAGES +SAGGING +SAGINAW +SAGITTAL +SAGITTARIUS +SAGS +SAGUARO +SAHARA +SAID +SAIGON +SAIL +SAILBOAT +SAILED +SAILFISH +SAILING +SAILOR +SAILORLY +SAILORS +SAILS +SAINT +SAINTED +SAINTHOOD +SAINTLY +SAINTS +SAKE +SAKES +SAL +SALAAM +SALABLE +SALAD +SALADS +SALAMANDER +SALAMI +SALARIED +SALARIES +SALARY +SALE +SALEM +SALERNO +SALES +SALESGIRL +SALESIAN +SALESLADY +SALESMAN +SALESMEN +SALESPERSON +SALIENT +SALINA +SALINE +SALISBURY +SALISH +SALIVA +SALIVARY +SALIVATE +SALK +SALLE +SALLIES +SALLOW +SALLY +SALLYING +SALMON +SALON +SALONS +SALOON +SALOONS +SALT +SALTED +SALTER +SALTERS +SALTIER +SALTIEST +SALTINESS +SALTING +SALTON +SALTS +SALTY +SALUTARY +SALUTATION +SALUTATIONS +SALUTE +SALUTED +SALUTES +SALUTING +SALVADOR +SALVADORAN +SALVAGE +SALVAGED +SALVAGER +SALVAGES +SALVAGING +SALVATION +SALVATORE +SALVE +SALVER +SALVES +SALZ +SAM +SAMARITAN +SAME +SAMENESS +SAMMY +SAMOA +SAMOAN +SAMPLE +SAMPLED +SAMPLER +SAMPLERS +SAMPLES +SAMPLING +SAMPLINGS +SAMPSON +SAMSON +SAMUEL +SAMUELS +SAMUELSON +SAN +SANA +SANATORIA +SANATORIUM +SANBORN +SANCHEZ +SANCHO +SANCTIFICATION +SANCTIFIED +SANCTIFY +SANCTIMONIOUS +SANCTION +SANCTIONED +SANCTIONING +SANCTIONS +SANCTITY +SANCTUARIES +SANCTUARY +SANCTUM +SAND +SANDAL +SANDALS +SANDBAG +SANDBURG +SANDED +SANDER +SANDERLING +SANDERS +SANDERSON +SANDIA +SANDING +SANDMAN +SANDPAPER +SANDRA +SANDS +SANDSTONE +SANDUSKY +SANDWICH +SANDWICHES +SANDY +SANE +SANELY +SANER +SANEST +SANFORD +SANG +SANGUINE +SANHEDRIN +SANITARIUM +SANITARY +SANITATION +SANITY +SANK +SANSKRIT +SANSKRITIC +SANSKRITIZE +SANTA +SANTAYANA +SANTIAGO +SANTO +SAO +SAP +SAPIENS +SAPLING +SAPLINGS +SAPPHIRE +SAPPHO +SAPS +SAPSUCKER +SARA +SARACEN +SARACENS +SARAH +SARAN +SARASOTA +SARATOGA +SARCASM +SARCASMS +SARCASTIC +SARDINE +SARDINIA +SARDONIC +SARGENT +SARI +SARTRE +SASH +SASKATCHEWAN +SASKATOON +SAT +SATAN +SATANIC +SATANISM +SATANIST +SATCHEL +SATCHELS +SATE +SATED +SATELLITE +SATELLITES +SATES +SATIN +SATING +SATIRE +SATIRES +SATIRIC +SATISFACTION +SATISFACTIONS +SATISFACTORILY +SATISFACTORY +SATISFIABILITY +SATISFIABLE +SATISFIED +SATISFIES +SATISFY +SATISFYING +SATURATE +SATURATED +SATURATES +SATURATING +SATURATION +SATURDAY +SATURDAYS +SATURN +SATURNALIA +SATURNISM +SATYR +SAUCE +SAUCEPAN +SAUCEPANS +SAUCER +SAUCERS +SAUCES +SAUCY +SAUD +SAUDI +SAUKVILLE +SAUL +SAULT +SAUNDERS +SAUNTER +SAUSAGE +SAUSAGES +SAVAGE +SAVAGED +SAVAGELY +SAVAGENESS +SAVAGER +SAVAGERS +SAVAGES +SAVAGING +SAVANNAH +SAVE +SAVED +SAVER +SAVERS +SAVES +SAVING +SAVINGS +SAVIOR +SAVIORS +SAVIOUR +SAVONAROLA +SAVOR +SAVORED +SAVORING +SAVORS +SAVORY +SAVOY +SAVOYARD +SAVOYARDS +SAW +SAWDUST +SAWED +SAWFISH +SAWING +SAWMILL +SAWMILLS +SAWS +SAWTOOTH +SAX +SAXON +SAXONIZATION +SAXONIZATIONS +SAXONIZE +SAXONIZES +SAXONS +SAXONY +SAXOPHONE +SAXTON +SAY +SAYER +SAYERS +SAYING +SAYINGS +SAYS +SCAB +SCABBARD +SCABBARDS +SCABROUS +SCAFFOLD +SCAFFOLDING +SCAFFOLDINGS +SCAFFOLDS +SCALA +SCALABLE +SCALAR +SCALARS +SCALD +SCALDED +SCALDING +SCALE +SCALED +SCALES +SCALING +SCALINGS +SCALLOP +SCALLOPED +SCALLOPS +SCALP +SCALPS +SCALY +SCAMPER +SCAMPERING +SCAMPERS +SCAN +SCANDAL +SCANDALOUS +SCANDALS +SCANDINAVIA +SCANDINAVIAN +SCANDINAVIANS +SCANNED +SCANNER +SCANNERS +SCANNING +SCANS +SCANT +SCANTIER +SCANTIEST +SCANTILY +SCANTINESS +SCANTLY +SCANTY +SCAPEGOAT +SCAR +SCARBOROUGH +SCARCE +SCARCELY +SCARCENESS +SCARCER +SCARCITY +SCARE +SCARECROW +SCARED +SCARES +SCARF +SCARING +SCARLATTI +SCARLET +SCARS +SCARSDALE +SCARVES +SCARY +SCATTER +SCATTERBRAIN +SCATTERED +SCATTERING +SCATTERS +SCENARIO +SCENARIOS +SCENE +SCENERY +SCENES +SCENIC +SCENT +SCENTED +SCENTS +SCEPTER +SCEPTERS +SCHAEFER +SCHAEFFER +SCHAFER +SCHAFFNER +SCHANTZ +SCHAPIRO +SCHEDULABLE +SCHEDULE +SCHEDULED +SCHEDULER +SCHEDULERS +SCHEDULES +SCHEDULING +SCHEHERAZADE +SCHELLING +SCHEMA +SCHEMAS +SCHEMATA +SCHEMATIC +SCHEMATICALLY +SCHEMATICS +SCHEME +SCHEMED +SCHEMER +SCHEMERS +SCHEMES +SCHEMING +SCHILLER +SCHISM +SCHIZOPHRENIA +SCHLESINGER +SCHLITZ +SCHLOSS +SCHMIDT +SCHMITT +SCHNABEL +SCHNEIDER +SCHOENBERG +SCHOFIELD +SCHOLAR +SCHOLARLY +SCHOLARS +SCHOLARSHIP +SCHOLARSHIPS +SCHOLASTIC +SCHOLASTICALLY +SCHOLASTICS +SCHOOL +SCHOOLBOY +SCHOOLBOYS +SCHOOLED +SCHOOLER +SCHOOLERS +SCHOOLHOUSE +SCHOOLHOUSES +SCHOOLING +SCHOOLMASTER +SCHOOLMASTERS +SCHOOLROOM +SCHOOLROOMS +SCHOOLS +SCHOONER +SCHOPENHAUER +SCHOTTKY +SCHROEDER +SCHROEDINGER +SCHUBERT +SCHULTZ +SCHULZ +SCHUMACHER +SCHUMAN +SCHUMANN +SCHUSTER +SCHUYLER +SCHUYLKILL +SCHWAB +SCHWARTZ +SCHWEITZER +SCIENCE +SCIENCES +SCIENTIFIC +SCIENTIFICALLY +SCIENTIST +SCIENTISTS +SCISSOR +SCISSORED +SCISSORING +SCISSORS +SCLEROSIS +SCLEROTIC +SCOFF +SCOFFED +SCOFFER +SCOFFING +SCOFFS +SCOLD +SCOLDED +SCOLDING +SCOLDS +SCOOP +SCOOPED +SCOOPING +SCOOPS +SCOOT +SCOPE +SCOPED +SCOPES +SCOPING +SCORCH +SCORCHED +SCORCHER +SCORCHES +SCORCHING +SCORE +SCOREBOARD +SCORECARD +SCORED +SCORER +SCORERS +SCORES +SCORING +SCORINGS +SCORN +SCORNED +SCORNER +SCORNFUL +SCORNFULLY +SCORNING +SCORNS +SCORPIO +SCORPION +SCORPIONS +SCOT +SCOTCH +SCOTCHGARD +SCOTCHMAN +SCOTIA +SCOTIAN +SCOTLAND +SCOTS +SCOTSMAN +SCOTSMEN +SCOTT +SCOTTISH +SCOTTSDALE +SCOTTY +SCOUNDREL +SCOUNDRELS +SCOUR +SCOURED +SCOURGE +SCOURING +SCOURS +SCOUT +SCOUTED +SCOUTING +SCOUTS +SCOW +SCOWL +SCOWLED +SCOWLING +SCOWLS +SCRAM +SCRAMBLE +SCRAMBLED +SCRAMBLER +SCRAMBLES +SCRAMBLING +SCRANTON +SCRAP +SCRAPE +SCRAPED +SCRAPER +SCRAPERS +SCRAPES +SCRAPING +SCRAPINGS +SCRAPPED +SCRAPS +SCRATCH +SCRATCHED +SCRATCHER +SCRATCHERS +SCRATCHES +SCRATCHING +SCRATCHY +SCRAWL +SCRAWLED +SCRAWLING +SCRAWLS +SCRAWNY +SCREAM +SCREAMED +SCREAMER +SCREAMERS +SCREAMING +SCREAMS +SCREECH +SCREECHED +SCREECHES +SCREECHING +SCREEN +SCREENED +SCREENING +SCREENINGS +SCREENPLAY +SCREENS +SCREW +SCREWBALL +SCREWDRIVER +SCREWED +SCREWING +SCREWS +SCRIBBLE +SCRIBBLED +SCRIBBLER +SCRIBBLES +SCRIBE +SCRIBES +SCRIBING +SCRIBNERS +SCRIMMAGE +SCRIPPS +SCRIPT +SCRIPTS +SCRIPTURE +SCRIPTURES +SCROLL +SCROLLED +SCROLLING +SCROLLS +SCROOGE +SCROUNGE +SCRUB +SCRUMPTIOUS +SCRUPLE +SCRUPULOUS +SCRUPULOUSLY +SCRUTINIZE +SCRUTINIZED +SCRUTINIZING +SCRUTINY +SCUBA +SCUD +SCUFFLE +SCUFFLED +SCUFFLES +SCUFFLING +SCULPT +SCULPTED +SCULPTOR +SCULPTORS +SCULPTS +SCULPTURE +SCULPTURED +SCULPTURES +SCURRIED +SCURRY +SCURVY +SCUTTLE +SCUTTLED +SCUTTLES +SCUTTLING +SCYLLA +SCYTHE +SCYTHES +SCYTHIA +SEA +SEABOARD +SEABORG +SEABROOK +SEACOAST +SEACOASTS +SEAFOOD +SEAGATE +SEAGRAM +SEAGULL +SEAHORSE +SEAL +SEALED +SEALER +SEALING +SEALS +SEALY +SEAM +SEAMAN +SEAMED +SEAMEN +SEAMING +SEAMS +SEAMY +SEAN +SEAPORT +SEAPORTS +SEAQUARIUM +SEAR +SEARCH +SEARCHED +SEARCHER +SEARCHERS +SEARCHES +SEARCHING +SEARCHINGLY +SEARCHINGS +SEARCHLIGHT +SEARED +SEARING +SEARINGLY +SEARS +SEAS +SEASHORE +SEASHORES +SEASIDE +SEASON +SEASONABLE +SEASONABLY +SEASONAL +SEASONALLY +SEASONED +SEASONER +SEASONERS +SEASONING +SEASONINGS +SEASONS +SEAT +SEATED +SEATING +SEATS +SEATTLE +SEAWARD +SEAWEED +SEBASTIAN +SECANT +SECEDE +SECEDED +SECEDES +SECEDING +SECESSION +SECLUDE +SECLUDED +SECLUSION +SECOND +SECONDARIES +SECONDARILY +SECONDARY +SECONDED +SECONDER +SECONDERS +SECONDHAND +SECONDING +SECONDLY +SECONDS +SECRECY +SECRET +SECRETARIAL +SECRETARIAT +SECRETARIES +SECRETARY +SECRETE +SECRETED +SECRETES +SECRETING +SECRETION +SECRETIONS +SECRETIVE +SECRETIVELY +SECRETLY +SECRETS +SECT +SECTARIAN +SECTION +SECTIONAL +SECTIONED +SECTIONING +SECTIONS +SECTOR +SECTORS +SECTS +SECULAR +SECURE +SECURED +SECURELY +SECURES +SECURING +SECURINGS +SECURITIES +SECURITY +SEDAN +SEDATE +SEDGE +SEDGWICK +SEDIMENT +SEDIMENTARY +SEDIMENTS +SEDITION +SEDITIOUS +SEDUCE +SEDUCED +SEDUCER +SEDUCERS +SEDUCES +SEDUCING +SEDUCTION +SEDUCTIVE +SEE +SEED +SEEDED +SEEDER +SEEDERS +SEEDING +SEEDINGS +SEEDLING +SEEDLINGS +SEEDS +SEEDY +SEEING +SEEK +SEEKER +SEEKERS +SEEKING +SEEKS +SEELEY +SEEM +SEEMED +SEEMING +SEEMINGLY +SEEMLY +SEEMS +SEEN +SEEP +SEEPAGE +SEEPED +SEEPING +SEEPS +SEER +SEERS +SEERSUCKER +SEES +SEETHE +SEETHED +SEETHES +SEETHING +SEGMENT +SEGMENTATION +SEGMENTATIONS +SEGMENTED +SEGMENTING +SEGMENTS +SEGOVIA +SEGREGATE +SEGREGATED +SEGREGATES +SEGREGATING +SEGREGATION +SEGUNDO +SEIDEL +SEISMIC +SEISMOGRAPH +SEISMOLOGY +SEIZE +SEIZED +SEIZES +SEIZING +SEIZURE +SEIZURES +SELDOM +SELECT +SELECTED +SELECTING +SELECTION +SELECTIONS +SELECTIVE +SELECTIVELY +SELECTIVITY +SELECTMAN +SELECTMEN +SELECTOR +SELECTORS +SELECTRIC +SELECTS +SELENA +SELENIUM +SELF +SELFISH +SELFISHLY +SELFISHNESS +SELFRIDGE +SELFSAME +SELKIRK +SELL +SELLER +SELLERS +SELLING +SELLOUT +SELLS +SELMA +SELTZER +SELVES +SELWYN +SEMANTIC +SEMANTICAL +SEMANTICALLY +SEMANTICIST +SEMANTICISTS +SEMANTICS +SEMAPHORE +SEMAPHORES +SEMBLANCE +SEMESTER +SEMESTERS +SEMI +SEMIAUTOMATED +SEMICOLON +SEMICOLONS +SEMICONDUCTOR +SEMICONDUCTORS +SEMINAL +SEMINAR +SEMINARIAN +SEMINARIES +SEMINARS +SEMINARY +SEMINOLE +SEMIPERMANENT +SEMIPERMANENTLY +SEMIRAMIS +SEMITE +SEMITIC +SEMITICIZE +SEMITICIZES +SEMITIZATION +SEMITIZATIONS +SEMITIZE +SEMITIZES +SENATE +SENATES +SENATOR +SENATORIAL +SENATORS +SEND +SENDER +SENDERS +SENDING +SENDS +SENECA +SENEGAL +SENILE +SENIOR +SENIORITY +SENIORS +SENSATION +SENSATIONAL +SENSATIONALLY +SENSATIONS +SENSE +SENSED +SENSELESS +SENSELESSLY +SENSELESSNESS +SENSES +SENSIBILITIES +SENSIBILITY +SENSIBLE +SENSIBLY +SENSING +SENSITIVE +SENSITIVELY +SENSITIVENESS +SENSITIVES +SENSITIVITIES +SENSITIVITY +SENSOR +SENSORS +SENSORY +SENSUAL +SENSUOUS +SENT +SENTENCE +SENTENCED +SENTENCES +SENTENCING +SENTENTIAL +SENTIMENT +SENTIMENTAL +SENTIMENTALLY +SENTIMENTS +SENTINEL +SENTINELS +SENTRIES +SENTRY +SEOUL +SEPARABLE +SEPARATE +SEPARATED +SEPARATELY +SEPARATENESS +SEPARATES +SEPARATING +SEPARATION +SEPARATIONS +SEPARATOR +SEPARATORS +SEPIA +SEPOY +SEPT +SEPTEMBER +SEPTEMBERS +SEPULCHER +SEPULCHERS +SEQUEL +SEQUELS +SEQUENCE +SEQUENCED +SEQUENCER +SEQUENCERS +SEQUENCES +SEQUENCING +SEQUENCINGS +SEQUENTIAL +SEQUENTIALITY +SEQUENTIALIZE +SEQUENTIALIZED +SEQUENTIALIZES +SEQUENTIALIZING +SEQUENTIALLY +SEQUESTER +SEQUOIA +SERAFIN +SERBIA +SERBIAN +SERBIANS +SERENDIPITOUS +SERENDIPITY +SERENE +SERENELY +SERENITY +SERF +SERFS +SERGEANT +SERGEANTS +SERGEI +SERIAL +SERIALIZABILITY +SERIALIZABLE +SERIALIZATION +SERIALIZATIONS +SERIALIZE +SERIALIZED +SERIALIZES +SERIALIZING +SERIALLY +SERIALS +SERIES +SERIF +SERIOUS +SERIOUSLY +SERIOUSNESS +SERMON +SERMONS +SERPENS +SERPENT +SERPENTINE +SERPENTS +SERRA +SERUM +SERUMS +SERVANT +SERVANTS +SERVE +SERVED +SERVER +SERVERS +SERVES +SERVICE +SERVICEABILITY +SERVICEABLE +SERVICED +SERVICEMAN +SERVICEMEN +SERVICES +SERVICING +SERVILE +SERVING +SERVINGS +SERVITUDE +SERVO +SERVOMECHANISM +SESAME +SESSION +SESSIONS +SET +SETBACK +SETH +SETS +SETTABLE +SETTER +SETTERS +SETTING +SETTINGS +SETTLE +SETTLED +SETTLEMENT +SETTLEMENTS +SETTLER +SETTLERS +SETTLES +SETTLING +SETUP +SETUPS +SEVEN +SEVENFOLD +SEVENS +SEVENTEEN +SEVENTEENS +SEVENTEENTH +SEVENTH +SEVENTIES +SEVENTIETH +SEVENTY +SEVER +SEVERAL +SEVERALFOLD +SEVERALLY +SEVERANCE +SEVERE +SEVERED +SEVERELY +SEVERER +SEVEREST +SEVERING +SEVERITIES +SEVERITY +SEVERN +SEVERS +SEVILLE +SEW +SEWAGE +SEWARD +SEWED +SEWER +SEWERS +SEWING +SEWS +SEX +SEXED +SEXES +SEXIST +SEXTANS +SEXTET +SEXTILLION +SEXTON +SEXTUPLE +SEXTUPLET +SEXUAL +SEXUALITY +SEXUALLY +SEXY +SEYCHELLES +SEYMOUR +SHABBY +SHACK +SHACKED +SHACKLE +SHACKLED +SHACKLES +SHACKLING +SHACKS +SHADE +SHADED +SHADES +SHADIER +SHADIEST +SHADILY +SHADINESS +SHADING +SHADINGS +SHADOW +SHADOWED +SHADOWING +SHADOWS +SHADOWY +SHADY +SHAFER +SHAFFER +SHAFT +SHAFTS +SHAGGY +SHAKABLE +SHAKABLY +SHAKE +SHAKEDOWN +SHAKEN +SHAKER +SHAKERS +SHAKES +SHAKESPEARE +SHAKESPEAREAN +SHAKESPEARIAN +SHAKESPEARIZE +SHAKESPEARIZES +SHAKINESS +SHAKING +SHAKY +SHALE +SHALL +SHALLOW +SHALLOWER +SHALLOWLY +SHALLOWNESS +SHAM +SHAMBLES +SHAME +SHAMED +SHAMEFUL +SHAMEFULLY +SHAMELESS +SHAMELESSLY +SHAMES +SHAMING +SHAMPOO +SHAMROCK +SHAMS +SHANGHAI +SHANGHAIED +SHANGHAIING +SHANGHAIINGS +SHANGHAIS +SHANNON +SHANTIES +SHANTUNG +SHANTY +SHAPE +SHAPED +SHAPELESS +SHAPELESSLY +SHAPELESSNESS +SHAPELY +SHAPER +SHAPERS +SHAPES +SHAPING +SHAPIRO +SHARABLE +SHARD +SHARE +SHAREABLE +SHARECROPPER +SHARECROPPERS +SHARED +SHAREHOLDER +SHAREHOLDERS +SHARER +SHARERS +SHARES +SHARI +SHARING +SHARK +SHARKS +SHARON +SHARP +SHARPE +SHARPEN +SHARPENED +SHARPENING +SHARPENS +SHARPER +SHARPEST +SHARPLY +SHARPNESS +SHARPSHOOT +SHASTA +SHATTER +SHATTERED +SHATTERING +SHATTERPROOF +SHATTERS +SHATTUCK +SHAVE +SHAVED +SHAVEN +SHAVES +SHAVING +SHAVINGS +SHAWANO +SHAWL +SHAWLS +SHAWNEE +SHE +SHEA +SHEAF +SHEAR +SHEARED +SHEARER +SHEARING +SHEARS +SHEATH +SHEATHING +SHEATHS +SHEAVES +SHEBOYGAN +SHED +SHEDDING +SHEDIR +SHEDS +SHEEHAN +SHEEN +SHEEP +SHEEPSKIN +SHEER +SHEERED +SHEET +SHEETED +SHEETING +SHEETS +SHEFFIELD +SHEIK +SHEILA +SHELBY +SHELDON +SHELF +SHELL +SHELLED +SHELLER +SHELLEY +SHELLING +SHELLS +SHELTER +SHELTERED +SHELTERING +SHELTERS +SHELTON +SHELVE +SHELVED +SHELVES +SHELVING +SHENANDOAH +SHENANIGAN +SHEPARD +SHEPHERD +SHEPHERDS +SHEPPARD +SHERATON +SHERBET +SHERIDAN +SHERIFF +SHERIFFS +SHERLOCK +SHERMAN +SHERRILL +SHERRY +SHERWIN +SHERWOOD +SHIBBOLETH +SHIED +SHIELD +SHIELDED +SHIELDING +SHIELDS +SHIES +SHIFT +SHIFTED +SHIFTER +SHIFTERS +SHIFTIER +SHIFTIEST +SHIFTILY +SHIFTINESS +SHIFTING +SHIFTS +SHIFTY +SHIITE +SHIITES +SHILL +SHILLING +SHILLINGS +SHILLONG +SHILOH +SHIMMER +SHIMMERING +SHIN +SHINBONE +SHINE +SHINED +SHINER +SHINERS +SHINES +SHINGLE +SHINGLES +SHINING +SHININGLY +SHINTO +SHINTOISM +SHINTOIZE +SHINTOIZES +SHINY +SHIP +SHIPBOARD +SHIPBUILDING +SHIPLEY +SHIPMATE +SHIPMENT +SHIPMENTS +SHIPPED +SHIPPER +SHIPPERS +SHIPPING +SHIPS +SHIPSHAPE +SHIPWRECK +SHIPWRECKED +SHIPWRECKS +SHIPYARD +SHIRE +SHIRK +SHIRKER +SHIRKING +SHIRKS +SHIRLEY +SHIRT +SHIRTING +SHIRTS +SHIT +SHIVA +SHIVER +SHIVERED +SHIVERER +SHIVERING +SHIVERS +SHMUEL +SHOAL +SHOALS +SHOCK +SHOCKED +SHOCKER +SHOCKERS +SHOCKING +SHOCKINGLY +SHOCKLEY +SHOCKS +SHOD +SHODDY +SHOE +SHOED +SHOEHORN +SHOEING +SHOELACE +SHOEMAKER +SHOES +SHOESTRING +SHOJI +SHONE +SHOOK +SHOOT +SHOOTER +SHOOTERS +SHOOTING +SHOOTINGS +SHOOTS +SHOP +SHOPKEEPER +SHOPKEEPERS +SHOPPED +SHOPPER +SHOPPERS +SHOPPING +SHOPS +SHOPWORN +SHORE +SHORELINE +SHORES +SHOREWOOD +SHORN +SHORT +SHORTAGE +SHORTAGES +SHORTCOMING +SHORTCOMINGS +SHORTCUT +SHORTCUTS +SHORTED +SHORTEN +SHORTENED +SHORTENING +SHORTENS +SHORTER +SHORTEST +SHORTFALL +SHORTHAND +SHORTHANDED +SHORTING +SHORTISH +SHORTLY +SHORTNESS +SHORTS +SHORTSIGHTED +SHORTSTOP +SHOSHONE +SHOT +SHOTGUN +SHOTGUNS +SHOTS +SHOULD +SHOULDER +SHOULDERED +SHOULDERING +SHOULDERS +SHOUT +SHOUTED +SHOUTER +SHOUTERS +SHOUTING +SHOUTS +SHOVE +SHOVED +SHOVEL +SHOVELED +SHOVELS +SHOVES +SHOVING +SHOW +SHOWBOAT +SHOWCASE +SHOWDOWN +SHOWED +SHOWER +SHOWERED +SHOWERING +SHOWERS +SHOWING +SHOWINGS +SHOWN +SHOWPIECE +SHOWROOM +SHOWS +SHOWY +SHRANK +SHRAPNEL +SHRED +SHREDDER +SHREDDING +SHREDS +SHREVEPORT +SHREW +SHREWD +SHREWDEST +SHREWDLY +SHREWDNESS +SHREWS +SHRIEK +SHRIEKED +SHRIEKING +SHRIEKS +SHRILL +SHRILLED +SHRILLING +SHRILLNESS +SHRILLY +SHRIMP +SHRINE +SHRINES +SHRINK +SHRINKABLE +SHRINKAGE +SHRINKING +SHRINKS +SHRIVEL +SHRIVELED +SHROUD +SHROUDED +SHRUB +SHRUBBERY +SHRUBS +SHRUG +SHRUGS +SHRUNK +SHRUNKEN +SHU +SHUDDER +SHUDDERED +SHUDDERING +SHUDDERS +SHUFFLE +SHUFFLEBOARD +SHUFFLED +SHUFFLES +SHUFFLING +SHULMAN +SHUN +SHUNS +SHUNT +SHUT +SHUTDOWN +SHUTDOWNS +SHUTOFF +SHUTOUT +SHUTS +SHUTTER +SHUTTERED +SHUTTERS +SHUTTING +SHUTTLE +SHUTTLECOCK +SHUTTLED +SHUTTLES +SHUTTLING +SHY +SHYLOCK +SHYLOCKIAN +SHYLY +SHYNESS +SIAM +SIAMESE +SIAN +SIBERIA +SIBERIAN +SIBLEY +SIBLING +SIBLINGS +SICILIAN +SICILIANA +SICILIANS +SICILY +SICK +SICKEN +SICKER +SICKEST +SICKLE +SICKLY +SICKNESS +SICKNESSES +SICKROOM +SIDE +SIDEARM +SIDEBAND +SIDEBOARD +SIDEBOARDS +SIDEBURNS +SIDECAR +SIDED +SIDELIGHT +SIDELIGHTS +SIDELINE +SIDEREAL +SIDES +SIDESADDLE +SIDESHOW +SIDESTEP +SIDETRACK +SIDEWALK +SIDEWALKS +SIDEWAYS +SIDEWISE +SIDING +SIDINGS +SIDNEY +SIEGE +SIEGEL +SIEGES +SIEGFRIED +SIEGLINDA +SIEGMUND +SIEMENS +SIENA +SIERRA +SIEVE +SIEVES +SIFFORD +SIFT +SIFTED +SIFTER +SIFTING +SIGGRAPH +SIGH +SIGHED +SIGHING +SIGHS +SIGHT +SIGHTED +SIGHTING +SIGHTINGS +SIGHTLY +SIGHTS +SIGHTSEEING +SIGMA +SIGMUND +SIGN +SIGNAL +SIGNALED +SIGNALING +SIGNALLED +SIGNALLING +SIGNALLY +SIGNALS +SIGNATURE +SIGNATURES +SIGNED +SIGNER +SIGNERS +SIGNET +SIGNIFICANCE +SIGNIFICANT +SIGNIFICANTLY +SIGNIFICANTS +SIGNIFICATION +SIGNIFIED +SIGNIFIES +SIGNIFY +SIGNIFYING +SIGNING +SIGNS +SIKH +SIKHES +SIKHS +SIKKIM +SIKKIMESE +SIKORSKY +SILAS +SILENCE +SILENCED +SILENCER +SILENCERS +SILENCES +SILENCING +SILENT +SILENTLY +SILHOUETTE +SILHOUETTED +SILHOUETTES +SILICA +SILICATE +SILICON +SILICONE +SILK +SILKEN +SILKIER +SILKIEST +SILKILY +SILKINE +SILKS +SILKY +SILL +SILLIEST +SILLINESS +SILLS +SILLY +SILO +SILT +SILTED +SILTING +SILTS +SILVER +SILVERED +SILVERING +SILVERMAN +SILVERS +SILVERSMITH +SILVERSTEIN +SILVERWARE +SILVERY +SIMILAR +SIMILARITIES +SIMILARITY +SIMILARLY +SIMILE +SIMILITUDE +SIMLA +SIMMER +SIMMERED +SIMMERING +SIMMERS +SIMMONS +SIMMONSVILLE +SIMMS +SIMON +SIMONS +SIMONSON +SIMPLE +SIMPLEMINDED +SIMPLENESS +SIMPLER +SIMPLEST +SIMPLETON +SIMPLEX +SIMPLICITIES +SIMPLICITY +SIMPLIFICATION +SIMPLIFICATIONS +SIMPLIFIED +SIMPLIFIER +SIMPLIFIERS +SIMPLIFIES +SIMPLIFY +SIMPLIFYING +SIMPLISTIC +SIMPLY +SIMPSON +SIMS +SIMULA +SIMULA +SIMULATE +SIMULATED +SIMULATES +SIMULATING +SIMULATION +SIMULATIONS +SIMULATOR +SIMULATORS +SIMULCAST +SIMULTANEITY +SIMULTANEOUS +SIMULTANEOUSLY +SINAI +SINATRA +SINBAD +SINCE +SINCERE +SINCERELY +SINCEREST +SINCERITY +SINCLAIR +SINE +SINES +SINEW +SINEWS +SINEWY +SINFUL +SINFULLY +SINFULNESS +SING +SINGABLE +SINGAPORE +SINGBORG +SINGE +SINGED +SINGER +SINGERS +SINGING +SINGINGLY +SINGLE +SINGLED +SINGLEHANDED +SINGLENESS +SINGLES +SINGLET +SINGLETON +SINGLETONS +SINGLING +SINGLY +SINGS +SINGSONG +SINGULAR +SINGULARITIES +SINGULARITY +SINGULARLY +SINISTER +SINK +SINKED +SINKER +SINKERS +SINKHOLE +SINKING +SINKS +SINNED +SINNER +SINNERS +SINNING +SINS +SINUOUS +SINUS +SINUSOID +SINUSOIDAL +SINUSOIDS +SIOUX +SIP +SIPHON +SIPHONING +SIPPING +SIPS +SIR +SIRE +SIRED +SIREN +SIRENS +SIRES +SIRIUS +SIRS +SIRUP +SISTER +SISTERLY +SISTERS +SISTINE +SISYPHEAN +SISYPHUS +SIT +SITE +SITED +SITES +SITING +SITS +SITTER +SITTERS +SITTING +SITTINGS +SITU +SITUATE +SITUATED +SITUATES +SITUATING +SITUATION +SITUATIONAL +SITUATIONALLY +SITUATIONS +SIVA +SIX +SIXES +SIXFOLD +SIXGUN +SIXPENCE +SIXTEEN +SIXTEENS +SIXTEENTH +SIXTH +SIXTIES +SIXTIETH +SIXTY +SIZABLE +SIZE +SIZED +SIZES +SIZING +SIZINGS +SIZZLE +SKATE +SKATED +SKATER +SKATERS +SKATES +SKATING +SKELETAL +SKELETON +SKELETONS +SKEPTIC +SKEPTICAL +SKEPTICALLY +SKEPTICISM +SKEPTICS +SKETCH +SKETCHBOOK +SKETCHED +SKETCHES +SKETCHILY +SKETCHING +SKETCHPAD +SKETCHY +SKEW +SKEWED +SKEWER +SKEWERS +SKEWING +SKEWS +SKI +SKID +SKIDDING +SKIED +SKIES +SKIFF +SKIING +SKILL +SKILLED +SKILLET +SKILLFUL +SKILLFULLY +SKILLFULNESS +SKILLS +SKIM +SKIMMED +SKIMMING +SKIMP +SKIMPED +SKIMPING +SKIMPS +SKIMPY +SKIMS +SKIN +SKINDIVE +SKINNED +SKINNER +SKINNERS +SKINNING +SKINNY +SKINS +SKIP +SKIPPED +SKIPPER +SKIPPERS +SKIPPING +SKIPPY +SKIPS +SKIRMISH +SKIRMISHED +SKIRMISHER +SKIRMISHERS +SKIRMISHES +SKIRMISHING +SKIRT +SKIRTED +SKIRTING +SKIRTS +SKIS +SKIT +SKOPJE +SKULK +SKULKED +SKULKER +SKULKING +SKULKS +SKULL +SKULLCAP +SKULLDUGGERY +SKULLS +SKUNK +SKUNKS +SKY +SKYE +SKYHOOK +SKYJACK +SKYLARK +SKYLARKING +SKYLARKS +SKYLIGHT +SKYLIGHTS +SKYLINE +SKYROCKETS +SKYSCRAPER +SKYSCRAPERS +SLAB +SLACK +SLACKEN +SLACKER +SLACKING +SLACKLY +SLACKNESS +SLACKS +SLAIN +SLAM +SLAMMED +SLAMMING +SLAMS +SLANDER +SLANDERER +SLANDEROUS +SLANDERS +SLANG +SLANT +SLANTED +SLANTING +SLANTS +SLAP +SLAPPED +SLAPPING +SLAPS +SLAPSTICK +SLASH +SLASHED +SLASHES +SLASHING +SLAT +SLATE +SLATED +SLATER +SLATES +SLATS +SLAUGHTER +SLAUGHTERED +SLAUGHTERHOUSE +SLAUGHTERING +SLAUGHTERS +SLAV +SLAVE +SLAVER +SLAVERY +SLAVES +SLAVIC +SLAVICIZE +SLAVICIZES +SLAVISH +SLAVIZATION +SLAVIZATIONS +SLAVIZE +SLAVIZES +SLAVONIC +SLAVONICIZE +SLAVONICIZES +SLAVS +SLAY +SLAYER +SLAYERS +SLAYING +SLAYS +SLED +SLEDDING +SLEDGE +SLEDGEHAMMER +SLEDGES +SLEDS +SLEEK +SLEEP +SLEEPER +SLEEPERS +SLEEPILY +SLEEPINESS +SLEEPING +SLEEPLESS +SLEEPLESSLY +SLEEPLESSNESS +SLEEPS +SLEEPWALK +SLEEPY +SLEET +SLEEVE +SLEEVES +SLEIGH +SLEIGHS +SLEIGHT +SLENDER +SLENDERER +SLEPT +SLESINGER +SLEUTH +SLEW +SLEWING +SLICE +SLICED +SLICER +SLICERS +SLICES +SLICING +SLICK +SLICKER +SLICKERS +SLICKS +SLID +SLIDE +SLIDER +SLIDERS +SLIDES +SLIDING +SLIGHT +SLIGHTED +SLIGHTER +SLIGHTEST +SLIGHTING +SLIGHTLY +SLIGHTNESS +SLIGHTS +SLIM +SLIME +SLIMED +SLIMLY +SLIMY +SLING +SLINGING +SLINGS +SLINGSHOT +SLIP +SLIPPAGE +SLIPPED +SLIPPER +SLIPPERINESS +SLIPPERS +SLIPPERY +SLIPPING +SLIPS +SLIT +SLITHER +SLITS +SLIVER +SLOAN +SLOANE +SLOB +SLOCUM +SLOGAN +SLOGANS +SLOOP +SLOP +SLOPE +SLOPED +SLOPER +SLOPERS +SLOPES +SLOPING +SLOPPED +SLOPPINESS +SLOPPING +SLOPPY +SLOPS +SLOT +SLOTH +SLOTHFUL +SLOTHS +SLOTS +SLOTTED +SLOTTING +SLOUCH +SLOUCHED +SLOUCHES +SLOUCHING +SLOVAKIA +SLOVENIA +SLOW +SLOWDOWN +SLOWED +SLOWER +SLOWEST +SLOWING +SLOWLY +SLOWNESS +SLOWS +SLUDGE +SLUG +SLUGGISH +SLUGGISHLY +SLUGGISHNESS +SLUGS +SLUICE +SLUM +SLUMBER +SLUMBERED +SLUMMING +SLUMP +SLUMPED +SLUMPS +SLUMS +SLUNG +SLUR +SLURP +SLURRING +SLURRY +SLURS +SLY +SLYLY +SMACK +SMACKED +SMACKING +SMACKS +SMALL +SMALLER +SMALLEST +SMALLEY +SMALLISH +SMALLNESS +SMALLPOX +SMALLTIME +SMALLWOOD +SMART +SMARTED +SMARTER +SMARTEST +SMARTLY +SMARTNESS +SMASH +SMASHED +SMASHER +SMASHERS +SMASHES +SMASHING +SMASHINGLY +SMATTERING +SMEAR +SMEARED +SMEARING +SMEARS +SMELL +SMELLED +SMELLING +SMELLS +SMELLY +SMELT +SMELTER +SMELTS +SMILE +SMILED +SMILES +SMILING +SMILINGLY +SMIRK +SMITE +SMITH +SMITHEREENS +SMITHFIELD +SMITHS +SMITHSON +SMITHSONIAN +SMITHTOWN +SMITHY +SMITTEN +SMOCK +SMOCKING +SMOCKS +SMOG +SMOKABLE +SMOKE +SMOKED +SMOKER +SMOKERS +SMOKES +SMOKESCREEN +SMOKESTACK +SMOKIES +SMOKING +SMOKY +SMOLDER +SMOLDERED +SMOLDERING +SMOLDERS +SMOOCH +SMOOTH +SMOOTHBORE +SMOOTHED +SMOOTHER +SMOOTHES +SMOOTHEST +SMOOTHING +SMOOTHLY +SMOOTHNESS +SMOTE +SMOTHER +SMOTHERED +SMOTHERING +SMOTHERS +SMUCKER +SMUDGE +SMUG +SMUGGLE +SMUGGLED +SMUGGLER +SMUGGLERS +SMUGGLES +SMUGGLING +SMUT +SMUTTY +SMYRNA +SMYTHE +SNACK +SNAFU +SNAG +SNAIL +SNAILS +SNAKE +SNAKED +SNAKELIKE +SNAKES +SNAP +SNAPDRAGON +SNAPPED +SNAPPER +SNAPPERS +SNAPPILY +SNAPPING +SNAPPY +SNAPS +SNAPSHOT +SNAPSHOTS +SNARE +SNARED +SNARES +SNARING +SNARK +SNARL +SNARLED +SNARLING +SNATCH +SNATCHED +SNATCHES +SNATCHING +SNAZZY +SNEAD +SNEAK +SNEAKED +SNEAKER +SNEAKERS +SNEAKIER +SNEAKIEST +SNEAKILY +SNEAKINESS +SNEAKING +SNEAKS +SNEAKY +SNEED +SNEER +SNEERED +SNEERING +SNEERS +SNEEZE +SNEEZED +SNEEZES +SNEEZING +SNIDER +SNIFF +SNIFFED +SNIFFING +SNIFFLE +SNIFFS +SNIFTER +SNIGGER +SNIP +SNIPE +SNIPPET +SNIVEL +SNOB +SNOBBERY +SNOBBISH +SNODGRASS +SNOOP +SNOOPED +SNOOPING +SNOOPS +SNOOPY +SNORE +SNORED +SNORES +SNORING +SNORKEL +SNORT +SNORTED +SNORTING +SNORTS +SNOTTY +SNOUT +SNOUTS +SNOW +SNOWBALL +SNOWBELT +SNOWED +SNOWFALL +SNOWFLAKE +SNOWIER +SNOWIEST +SNOWILY +SNOWING +SNOWMAN +SNOWMEN +SNOWS +SNOWSHOE +SNOWSHOES +SNOWSTORM +SNOWY +SNUB +SNUFF +SNUFFED +SNUFFER +SNUFFING +SNUFFS +SNUG +SNUGGLE +SNUGGLED +SNUGGLES +SNUGGLING +SNUGLY +SNUGNESS +SNYDER +SOAK +SOAKED +SOAKING +SOAKS +SOAP +SOAPED +SOAPING +SOAPS +SOAPY +SOAR +SOARED +SOARING +SOARS +SOB +SOBBING +SOBER +SOBERED +SOBERING +SOBERLY +SOBERNESS +SOBERS +SOBRIETY +SOBS +SOCCER +SOCIABILITY +SOCIABLE +SOCIABLY +SOCIAL +SOCIALISM +SOCIALIST +SOCIALISTS +SOCIALIZE +SOCIALIZED +SOCIALIZES +SOCIALIZING +SOCIALLY +SOCIETAL +SOCIETIES +SOCIETY +SOCIOECONOMIC +SOCIOLOGICAL +SOCIOLOGICALLY +SOCIOLOGIST +SOCIOLOGISTS +SOCIOLOGY +SOCK +SOCKED +SOCKET +SOCKETS +SOCKING +SOCKS +SOCRATES +SOCRATIC +SOD +SODA +SODDY +SODIUM +SODOMY +SODS +SOFA +SOFAS +SOFIA +SOFT +SOFTBALL +SOFTEN +SOFTENED +SOFTENING +SOFTENS +SOFTER +SOFTEST +SOFTLY +SOFTNESS +SOFTWARE +SOFTWARES +SOGGY +SOIL +SOILED +SOILING +SOILS +SOIREE +SOJOURN +SOJOURNER +SOJOURNERS +SOL +SOLACE +SOLACED +SOLAR +SOLD +SOLDER +SOLDERED +SOLDIER +SOLDIERING +SOLDIERLY +SOLDIERS +SOLE +SOLELY +SOLEMN +SOLEMNITY +SOLEMNLY +SOLEMNNESS +SOLENOID +SOLES +SOLICIT +SOLICITATION +SOLICITED +SOLICITING +SOLICITOR +SOLICITOUS +SOLICITS +SOLICITUDE +SOLID +SOLIDARITY +SOLIDIFICATION +SOLIDIFIED +SOLIDIFIES +SOLIDIFY +SOLIDIFYING +SOLIDITY +SOLIDLY +SOLIDNESS +SOLIDS +SOLILOQUY +SOLITAIRE +SOLITARY +SOLITUDE +SOLITUDES +SOLLY +SOLO +SOLOMON +SOLON +SOLOS +SOLOVIEV +SOLSTICE +SOLUBILITY +SOLUBLE +SOLUTION +SOLUTIONS +SOLVABLE +SOLVE +SOLVED +SOLVENT +SOLVENTS +SOLVER +SOLVERS +SOLVES +SOLVING +SOMALI +SOMALIA +SOMALIS +SOMATIC +SOMBER +SOMBERLY +SOME +SOMEBODY +SOMEDAY +SOMEHOW +SOMEONE +SOMEPLACE +SOMERS +SOMERSAULT +SOMERSET +SOMERVILLE +SOMETHING +SOMETIME +SOMETIMES +SOMEWHAT +SOMEWHERE +SOMMELIER +SOMMERFELD +SOMNOLENT +SON +SONAR +SONATA +SONENBERG +SONG +SONGBOOK +SONGS +SONIC +SONNET +SONNETS +SONNY +SONOMA +SONORA +SONS +SONY +SOON +SOONER +SOONEST +SOOT +SOOTH +SOOTHE +SOOTHED +SOOTHER +SOOTHES +SOOTHING +SOOTHSAYER +SOPHIA +SOPHIAS +SOPHIE +SOPHISTICATED +SOPHISTICATION +SOPHISTRY +SOPHOCLEAN +SOPHOCLES +SOPHOMORE +SOPHOMORES +SOPRANO +SORCERER +SORCERERS +SORCERY +SORDID +SORDIDLY +SORDIDNESS +SORE +SORELY +SORENESS +SORENSEN +SORENSON +SORER +SORES +SOREST +SORGHUM +SORORITY +SORREL +SORRENTINE +SORRIER +SORRIEST +SORROW +SORROWFUL +SORROWFULLY +SORROWS +SORRY +SORT +SORTED +SORTER +SORTERS +SORTIE +SORTING +SORTS +SOUGHT +SOUL +SOULFUL +SOULS +SOUND +SOUNDED +SOUNDER +SOUNDEST +SOUNDING +SOUNDINGS +SOUNDLY +SOUNDNESS +SOUNDPROOF +SOUNDS +SOUP +SOUPED +SOUPS +SOUR +SOURCE +SOURCES +SOURDOUGH +SOURED +SOURER +SOUREST +SOURING +SOURLY +SOURNESS +SOURS +SOUSA +SOUTH +SOUTHAMPTON +SOUTHBOUND +SOUTHEAST +SOUTHEASTERN +SOUTHERN +SOUTHERNER +SOUTHERNERS +SOUTHERNMOST +SOUTHERNWOOD +SOUTHEY +SOUTHFIELD +SOUTHLAND +SOUTHPAW +SOUTHWARD +SOUTHWEST +SOUTHWESTERN +SOUVENIR +SOVEREIGN +SOVEREIGNS +SOVEREIGNTY +SOVIET +SOVIETS +SOW +SOWN +SOY +SOYA +SOYBEAN +SPA +SPACE +SPACECRAFT +SPACED +SPACER +SPACERS +SPACES +SPACESHIP +SPACESHIPS +SPACESUIT +SPACEWAR +SPACING +SPACINGS +SPACIOUS +SPADED +SPADES +SPADING +SPAFFORD +SPAHN +SPAIN +SPALDING +SPAN +SPANDREL +SPANIARD +SPANIARDIZATION +SPANIARDIZATIONS +SPANIARDIZE +SPANIARDIZES +SPANIARDS +SPANIEL +SPANISH +SPANISHIZE +SPANISHIZES +SPANK +SPANKED +SPANKING +SPANKS +SPANNED +SPANNER +SPANNERS +SPANNING +SPANS +SPARC +SPARCSTATION +SPARE +SPARED +SPARELY +SPARENESS +SPARER +SPARES +SPAREST +SPARING +SPARINGLY +SPARK +SPARKED +SPARKING +SPARKLE +SPARKLING +SPARKMAN +SPARKS +SPARRING +SPARROW +SPARROWS +SPARSE +SPARSELY +SPARSENESS +SPARSER +SPARSEST +SPARTA +SPARTAN +SPARTANIZE +SPARTANIZES +SPASM +SPASTIC +SPAT +SPATE +SPATES +SPATIAL +SPATIALLY +SPATTER +SPATTERED +SPATULA +SPAULDING +SPAWN +SPAWNED +SPAWNING +SPAWNS +SPAYED +SPEAK +SPEAKABLE +SPEAKEASY +SPEAKER +SPEAKERPHONE +SPEAKERPHONES +SPEAKERS +SPEAKING +SPEAKS +SPEAR +SPEARED +SPEARMINT +SPEARS +SPEC +SPECIAL +SPECIALIST +SPECIALISTS +SPECIALIZATION +SPECIALIZATIONS +SPECIALIZE +SPECIALIZED +SPECIALIZES +SPECIALIZING +SPECIALLY +SPECIALS +SPECIALTIES +SPECIALTY +SPECIE +SPECIES +SPECIFIABLE +SPECIFIC +SPECIFICALLY +SPECIFICATION +SPECIFICATIONS +SPECIFICITY +SPECIFICS +SPECIFIED +SPECIFIER +SPECIFIERS +SPECIFIES +SPECIFY +SPECIFYING +SPECIMEN +SPECIMENS +SPECIOUS +SPECK +SPECKLE +SPECKLED +SPECKLES +SPECKS +SPECTACLE +SPECTACLED +SPECTACLES +SPECTACULAR +SPECTACULARLY +SPECTATOR +SPECTATORS +SPECTER +SPECTERS +SPECTOR +SPECTRA +SPECTRAL +SPECTROGRAM +SPECTROGRAMS +SPECTROGRAPH +SPECTROGRAPHIC +SPECTROGRAPHY +SPECTROMETER +SPECTROPHOTOMETER +SPECTROPHOTOMETRY +SPECTROSCOPE +SPECTROSCOPIC +SPECTROSCOPY +SPECTRUM +SPECULATE +SPECULATED +SPECULATES +SPECULATING +SPECULATION +SPECULATIONS +SPECULATIVE +SPECULATOR +SPECULATORS +SPED +SPEECH +SPEECHES +SPEECHLESS +SPEECHLESSNESS +SPEED +SPEEDBOAT +SPEEDED +SPEEDER +SPEEDERS +SPEEDILY +SPEEDING +SPEEDOMETER +SPEEDS +SPEEDUP +SPEEDUPS +SPEEDY +SPELL +SPELLBOUND +SPELLED +SPELLER +SPELLERS +SPELLING +SPELLINGS +SPELLS +SPENCER +SPENCERIAN +SPEND +SPENDER +SPENDERS +SPENDING +SPENDS +SPENGLERIAN +SPENT +SPERM +SPERRY +SPHERE +SPHERES +SPHERICAL +SPHERICALLY +SPHEROID +SPHEROIDAL +SPHINX +SPICA +SPICE +SPICED +SPICES +SPICINESS +SPICY +SPIDER +SPIDERS +SPIDERY +SPIEGEL +SPIES +SPIGOT +SPIKE +SPIKED +SPIKES +SPILL +SPILLED +SPILLER +SPILLING +SPILLS +SPILT +SPIN +SPINACH +SPINAL +SPINALLY +SPINDLE +SPINDLED +SPINDLING +SPINE +SPINNAKER +SPINNER +SPINNERS +SPINNING +SPINOFF +SPINS +SPINSTER +SPINY +SPIRAL +SPIRALED +SPIRALING +SPIRALLY +SPIRE +SPIRES +SPIRIT +SPIRITED +SPIRITEDLY +SPIRITING +SPIRITS +SPIRITUAL +SPIRITUALLY +SPIRITUALS +SPIRO +SPIT +SPITE +SPITED +SPITEFUL +SPITEFULLY +SPITEFULNESS +SPITES +SPITFIRE +SPITING +SPITS +SPITTING +SPITTLE +SPITZ +SPLASH +SPLASHED +SPLASHES +SPLASHING +SPLASHY +SPLEEN +SPLENDID +SPLENDIDLY +SPLENDOR +SPLENETIC +SPLICE +SPLICED +SPLICER +SPLICERS +SPLICES +SPLICING +SPLICINGS +SPLINE +SPLINES +SPLINT +SPLINTER +SPLINTERED +SPLINTERS +SPLINTERY +SPLIT +SPLITS +SPLITTER +SPLITTERS +SPLITTING +SPLURGE +SPOIL +SPOILAGE +SPOILED +SPOILER +SPOILERS +SPOILING +SPOILS +SPOKANE +SPOKE +SPOKED +SPOKEN +SPOKES +SPOKESMAN +SPOKESMEN +SPONGE +SPONGED +SPONGER +SPONGERS +SPONGES +SPONGING +SPONGY +SPONSOR +SPONSORED +SPONSORING +SPONSORS +SPONSORSHIP +SPONTANEITY +SPONTANEOUS +SPONTANEOUSLY +SPOOF +SPOOK +SPOOKY +SPOOL +SPOOLED +SPOOLER +SPOOLERS +SPOOLING +SPOOLS +SPOON +SPOONED +SPOONFUL +SPOONING +SPOONS +SPORADIC +SPORE +SPORES +SPORT +SPORTED +SPORTING +SPORTINGLY +SPORTIVE +SPORTS +SPORTSMAN +SPORTSMEN +SPORTSWEAR +SPORTSWRITER +SPORTSWRITING +SPORTY +SPOSATO +SPOT +SPOTLESS +SPOTLESSLY +SPOTLIGHT +SPOTS +SPOTTED +SPOTTER +SPOTTERS +SPOTTING +SPOTTY +SPOUSE +SPOUSES +SPOUT +SPOUTED +SPOUTING +SPOUTS +SPRAGUE +SPRAIN +SPRANG +SPRAWL +SPRAWLED +SPRAWLING +SPRAWLS +SPRAY +SPRAYED +SPRAYER +SPRAYING +SPRAYS +SPREAD +SPREADER +SPREADERS +SPREADING +SPREADINGS +SPREADS +SPREADSHEET +SPREE +SPREES +SPRIG +SPRIGHTLY +SPRING +SPRINGBOARD +SPRINGER +SPRINGERS +SPRINGFIELD +SPRINGIER +SPRINGIEST +SPRINGINESS +SPRINGING +SPRINGS +SPRINGTIME +SPRINGY +SPRINKLE +SPRINKLED +SPRINKLER +SPRINKLES +SPRINKLING +SPRINT +SPRINTED +SPRINTER +SPRINTERS +SPRINTING +SPRINTS +SPRITE +SPROCKET +SPROUL +SPROUT +SPROUTED +SPROUTING +SPRUCE +SPRUCED +SPRUNG +SPUDS +SPUN +SPUNK +SPUR +SPURIOUS +SPURN +SPURNED +SPURNING +SPURNS +SPURS +SPURT +SPURTED +SPURTING +SPURTS +SPUTTER +SPUTTERED +SPY +SPYGLASS +SPYING +SQUABBLE +SQUABBLED +SQUABBLES +SQUABBLING +SQUAD +SQUADRON +SQUADRONS +SQUADS +SQUALID +SQUALL +SQUALLS +SQUANDER +SQUARE +SQUARED +SQUARELY +SQUARENESS +SQUARER +SQUARES +SQUAREST +SQUARESVILLE +SQUARING +SQUASH +SQUASHED +SQUASHING +SQUAT +SQUATS +SQUATTING +SQUAW +SQUAWK +SQUAWKED +SQUAWKING +SQUAWKS +SQUEAK +SQUEAKED +SQUEAKING +SQUEAKS +SQUEAKY +SQUEAL +SQUEALED +SQUEALING +SQUEALS +SQUEAMISH +SQUEEZE +SQUEEZED +SQUEEZER +SQUEEZES +SQUEEZING +SQUELCH +SQUIBB +SQUID +SQUINT +SQUINTED +SQUINTING +SQUIRE +SQUIRES +SQUIRM +SQUIRMED +SQUIRMS +SQUIRMY +SQUIRREL +SQUIRRELED +SQUIRRELING +SQUIRRELS +SQUIRT +SQUISHY +SRI +STAB +STABBED +STABBING +STABILE +STABILITIES +STABILITY +STABILIZE +STABILIZED +STABILIZER +STABILIZERS +STABILIZES +STABILIZING +STABLE +STABLED +STABLER +STABLES +STABLING +STABLY +STABS +STACK +STACKED +STACKING +STACKS +STACY +STADIA +STADIUM +STAFF +STAFFED +STAFFER +STAFFERS +STAFFING +STAFFORD +STAFFORDSHIRE +STAFFS +STAG +STAGE +STAGECOACH +STAGECOACHES +STAGED +STAGER +STAGERS +STAGES +STAGGER +STAGGERED +STAGGERING +STAGGERS +STAGING +STAGNANT +STAGNATE +STAGNATION +STAGS +STAHL +STAID +STAIN +STAINED +STAINING +STAINLESS +STAINS +STAIR +STAIRCASE +STAIRCASES +STAIRS +STAIRWAY +STAIRWAYS +STAIRWELL +STAKE +STAKED +STAKES +STALACTITE +STALE +STALEMATE +STALEY +STALIN +STALINIST +STALINS +STALK +STALKED +STALKING +STALL +STALLED +STALLING +STALLINGS +STALLION +STALLS +STALWART +STALWARTLY +STAMEN +STAMENS +STAMFORD +STAMINA +STAMMER +STAMMERED +STAMMERER +STAMMERING +STAMMERS +STAMP +STAMPED +STAMPEDE +STAMPEDED +STAMPEDES +STAMPEDING +STAMPER +STAMPERS +STAMPING +STAMPS +STAN +STANCH +STANCHEST +STANCHION +STAND +STANDARD +STANDARDIZATION +STANDARDIZE +STANDARDIZED +STANDARDIZES +STANDARDIZING +STANDARDLY +STANDARDS +STANDBY +STANDING +STANDINGS +STANDISH +STANDOFF +STANDPOINT +STANDPOINTS +STANDS +STANDSTILL +STANFORD +STANHOPE +STANLEY +STANS +STANTON +STANZA +STANZAS +STAPHYLOCOCCUS +STAPLE +STAPLER +STAPLES +STAPLETON +STAPLING +STAR +STARBOARD +STARCH +STARCHED +STARDOM +STARE +STARED +STARER +STARES +STARFISH +STARGATE +STARING +STARK +STARKEY +STARKLY +STARLET +STARLIGHT +STARLING +STARR +STARRED +STARRING +STARRY +STARS +START +STARTED +STARTER +STARTERS +STARTING +STARTLE +STARTLED +STARTLES +STARTLING +STARTS +STARTUP +STARTUPS +STARVATION +STARVE +STARVED +STARVES +STARVING +STATE +STATED +STATELY +STATEMENT +STATEMENTS +STATEN +STATES +STATESMAN +STATESMANLIKE +STATESMEN +STATEWIDE +STATIC +STATICALLY +STATING +STATION +STATIONARY +STATIONED +STATIONER +STATIONERY +STATIONING +STATIONMASTER +STATIONS +STATISTIC +STATISTICAL +STATISTICALLY +STATISTICIAN +STATISTICIANS +STATISTICS +STATLER +STATUE +STATUES +STATUESQUE +STATUESQUELY +STATUESQUENESS +STATUETTE +STATURE +STATUS +STATUSES +STATUTE +STATUTES +STATUTORILY +STATUTORINESS +STATUTORY +STAUFFER +STAUNCH +STAUNCHEST +STAUNCHLY +STAUNTON +STAVE +STAVED +STAVES +STAY +STAYED +STAYING +STAYS +STEAD +STEADFAST +STEADFASTLY +STEADFASTNESS +STEADIED +STEADIER +STEADIES +STEADIEST +STEADILY +STEADINESS +STEADY +STEADYING +STEAK +STEAKS +STEAL +STEALER +STEALING +STEALS +STEALTH +STEALTHILY +STEALTHY +STEAM +STEAMBOAT +STEAMBOATS +STEAMED +STEAMER +STEAMERS +STEAMING +STEAMS +STEAMSHIP +STEAMSHIPS +STEAMY +STEARNS +STEED +STEEL +STEELE +STEELED +STEELERS +STEELING +STEELMAKER +STEELS +STEELY +STEEN +STEEP +STEEPED +STEEPER +STEEPEST +STEEPING +STEEPLE +STEEPLES +STEEPLY +STEEPNESS +STEEPS +STEER +STEERABLE +STEERED +STEERING +STEERS +STEFAN +STEGOSAURUS +STEINBECK +STEINBERG +STEINER +STELLA +STELLAR +STEM +STEMMED +STEMMING +STEMS +STENCH +STENCHES +STENCIL +STENCILS +STENDHAL +STENDLER +STENOGRAPHER +STENOGRAPHERS +STENOTYPE +STEP +STEPCHILD +STEPHAN +STEPHANIE +STEPHEN +STEPHENS +STEPHENSON +STEPMOTHER +STEPMOTHERS +STEPPED +STEPPER +STEPPING +STEPS +STEPSON +STEPWISE +STEREO +STEREOS +STEREOSCOPIC +STEREOTYPE +STEREOTYPED +STEREOTYPES +STEREOTYPICAL +STERILE +STERILIZATION +STERILIZATIONS +STERILIZE +STERILIZED +STERILIZER +STERILIZES +STERILIZING +STERLING +STERN +STERNBERG +STERNLY +STERNNESS +STERNO +STERNS +STETHOSCOPE +STETSON +STETSONS +STEUBEN +STEVE +STEVEDORE +STEVEN +STEVENS +STEVENSON +STEVIE +STEW +STEWARD +STEWARDESS +STEWARDS +STEWART +STEWED +STEWS +STICK +STICKER +STICKERS +STICKIER +STICKIEST +STICKILY +STICKINESS +STICKING +STICKLEBACK +STICKS +STICKY +STIFF +STIFFEN +STIFFENS +STIFFER +STIFFEST +STIFFLY +STIFFNESS +STIFFS +STIFLE +STIFLED +STIFLES +STIFLING +STIGMA +STIGMATA +STILE +STILES +STILETTO +STILL +STILLBIRTH +STILLBORN +STILLED +STILLER +STILLEST +STILLING +STILLNESS +STILLS +STILLWELL +STILT +STILTS +STIMSON +STIMULANT +STIMULANTS +STIMULATE +STIMULATED +STIMULATES +STIMULATING +STIMULATION +STIMULATIONS +STIMULATIVE +STIMULI +STIMULUS +STING +STINGING +STINGS +STINGY +STINK +STINKER +STINKERS +STINKING +STINKS +STINT +STIPEND +STIPENDS +STIPULATE +STIPULATED +STIPULATES +STIPULATING +STIPULATION +STIPULATIONS +STIR +STIRLING +STIRRED +STIRRER +STIRRERS +STIRRING +STIRRINGLY +STIRRINGS +STIRRUP +STIRS +STITCH +STITCHED +STITCHES +STITCHING +STOCHASTIC +STOCHASTICALLY +STOCK +STOCKADE +STOCKADES +STOCKBROKER +STOCKED +STOCKER +STOCKERS +STOCKHOLDER +STOCKHOLDERS +STOCKHOLM +STOCKING +STOCKINGS +STOCKPILE +STOCKROOM +STOCKS +STOCKTON +STOCKY +STODGY +STOICHIOMETRY +STOKE +STOKES +STOLE +STOLEN +STOLES +STOLID +STOMACH +STOMACHED +STOMACHER +STOMACHES +STOMACHING +STOMP +STONE +STONED +STONEHENGE +STONES +STONING +STONY +STOOD +STOOGE +STOOL +STOOP +STOOPED +STOOPING +STOOPS +STOP +STOPCOCK +STOPCOCKS +STOPGAP +STOPOVER +STOPPABLE +STOPPAGE +STOPPED +STOPPER +STOPPERS +STOPPING +STOPS +STOPWATCH +STORAGE +STORAGES +STORE +STORED +STOREHOUSE +STOREHOUSES +STOREKEEPER +STOREROOM +STORES +STOREY +STOREYED +STOREYS +STORIED +STORIES +STORING +STORK +STORKS +STORM +STORMED +STORMIER +STORMIEST +STORMINESS +STORMING +STORMS +STORMY +STORY +STORYBOARD +STORYTELLER +STOUFFER +STOUT +STOUTER +STOUTEST +STOUTLY +STOUTNESS +STOVE +STOVES +STOW +STOWE +STOWED +STRADDLE +STRAFE +STRAGGLE +STRAGGLED +STRAGGLER +STRAGGLERS +STRAGGLES +STRAGGLING +STRAIGHT +STRAIGHTAWAY +STRAIGHTEN +STRAIGHTENED +STRAIGHTENS +STRAIGHTER +STRAIGHTEST +STRAIGHTFORWARD +STRAIGHTFORWARDLY +STRAIGHTFORWARDNESS +STRAIGHTNESS +STRAIGHTWAY +STRAIN +STRAINED +STRAINER +STRAINERS +STRAINING +STRAINS +STRAIT +STRAITEN +STRAITS +STRAND +STRANDED +STRANDING +STRANDS +STRANGE +STRANGELY +STRANGENESS +STRANGER +STRANGERS +STRANGEST +STRANGLE +STRANGLED +STRANGLER +STRANGLERS +STRANGLES +STRANGLING +STRANGLINGS +STRANGULATION +STRANGULATIONS +STRAP +STRAPS +STRASBOURG +STRATAGEM +STRATAGEMS +STRATEGIC +STRATEGIES +STRATEGIST +STRATEGY +STRATFORD +STRATIFICATION +STRATIFICATIONS +STRATIFIED +STRATIFIES +STRATIFY +STRATOSPHERE +STRATOSPHERIC +STRATTON +STRATUM +STRAUSS +STRAVINSKY +STRAW +STRAWBERRIES +STRAWBERRY +STRAWS +STRAY +STRAYED +STRAYS +STREAK +STREAKED +STREAKS +STREAM +STREAMED +STREAMER +STREAMERS +STREAMING +STREAMLINE +STREAMLINED +STREAMLINER +STREAMLINES +STREAMLINING +STREAMS +STREET +STREETCAR +STREETCARS +STREETERS +STREETS +STRENGTH +STRENGTHEN +STRENGTHENED +STRENGTHENER +STRENGTHENING +STRENGTHENS +STRENGTHS +STRENUOUS +STRENUOUSLY +STREPTOCOCCUS +STRESS +STRESSED +STRESSES +STRESSFUL +STRESSING +STRETCH +STRETCHED +STRETCHER +STRETCHERS +STRETCHES +STRETCHING +STREW +STREWN +STREWS +STRICKEN +STRICKLAND +STRICT +STRICTER +STRICTEST +STRICTLY +STRICTNESS +STRICTURE +STRIDE +STRIDER +STRIDES +STRIDING +STRIFE +STRIKE +STRIKEBREAKER +STRIKER +STRIKERS +STRIKES +STRIKING +STRIKINGLY +STRINDBERG +STRING +STRINGED +STRINGENT +STRINGENTLY +STRINGER +STRINGERS +STRINGIER +STRINGIEST +STRINGINESS +STRINGING +STRINGS +STRINGY +STRIP +STRIPE +STRIPED +STRIPES +STRIPPED +STRIPPER +STRIPPERS +STRIPPING +STRIPS +STRIPTEASE +STRIVE +STRIVEN +STRIVES +STRIVING +STRIVINGS +STROBE +STROBED +STROBES +STROBOSCOPIC +STRODE +STROKE +STROKED +STROKER +STROKERS +STROKES +STROKING +STROLL +STROLLED +STROLLER +STROLLING +STROLLS +STROM +STROMBERG +STRONG +STRONGER +STRONGEST +STRONGHEART +STRONGHOLD +STRONGLY +STRONTIUM +STROVE +STRUCK +STRUCTURAL +STRUCTURALLY +STRUCTURE +STRUCTURED +STRUCTURER +STRUCTURES +STRUCTURING +STRUGGLE +STRUGGLED +STRUGGLES +STRUGGLING +STRUNG +STRUT +STRUTS +STRUTTING +STRYCHNINE +STU +STUART +STUB +STUBBLE +STUBBLEFIELD +STUBBLEFIELDS +STUBBORN +STUBBORNLY +STUBBORNNESS +STUBBY +STUBS +STUCCO +STUCK +STUD +STUDEBAKER +STUDENT +STUDENTS +STUDIED +STUDIES +STUDIO +STUDIOS +STUDIOUS +STUDIOUSLY +STUDS +STUDY +STUDYING +STUFF +STUFFED +STUFFIER +STUFFIEST +STUFFING +STUFFS +STUFFY +STUMBLE +STUMBLED +STUMBLES +STUMBLING +STUMP +STUMPED +STUMPING +STUMPS +STUN +STUNG +STUNNING +STUNNINGLY +STUNT +STUNTS +STUPEFY +STUPEFYING +STUPENDOUS +STUPENDOUSLY +STUPID +STUPIDEST +STUPIDITIES +STUPIDITY +STUPIDLY +STUPOR +STURBRIDGE +STURDINESS +STURDY +STURGEON +STURM +STUTTER +STUTTGART +STUYVESANT +STYGIAN +STYLE +STYLED +STYLER +STYLERS +STYLES +STYLI +STYLING +STYLISH +STYLISHLY +STYLISHNESS +STYLISTIC +STYLISTICALLY +STYLIZED +STYLUS +STYROFOAM +STYX +SUAVE +SUB +SUBATOMIC +SUBCHANNEL +SUBCHANNELS +SUBCLASS +SUBCLASSES +SUBCOMMITTEES +SUBCOMPONENT +SUBCOMPONENTS +SUBCOMPUTATION +SUBCOMPUTATIONS +SUBCONSCIOUS +SUBCONSCIOUSLY +SUBCULTURE +SUBCULTURES +SUBCYCLE +SUBCYCLES +SUBDIRECTORIES +SUBDIRECTORY +SUBDIVIDE +SUBDIVIDED +SUBDIVIDES +SUBDIVIDING +SUBDIVISION +SUBDIVISIONS +SUBDOMAINS +SUBDUE +SUBDUED +SUBDUES +SUBDUING +SUBEXPRESSION +SUBEXPRESSIONS +SUBFIELD +SUBFIELDS +SUBFILE +SUBFILES +SUBGOAL +SUBGOALS +SUBGRAPH +SUBGRAPHS +SUBGROUP +SUBGROUPS +SUBINTERVAL +SUBINTERVALS +SUBJECT +SUBJECTED +SUBJECTING +SUBJECTION +SUBJECTIVE +SUBJECTIVELY +SUBJECTIVITY +SUBJECTS +SUBLANGUAGE +SUBLANGUAGES +SUBLAYER +SUBLAYERS +SUBLIMATION +SUBLIMATIONS +SUBLIME +SUBLIMED +SUBLIST +SUBLISTS +SUBMARINE +SUBMARINER +SUBMARINERS +SUBMARINES +SUBMERGE +SUBMERGED +SUBMERGES +SUBMERGING +SUBMISSION +SUBMISSIONS +SUBMISSIVE +SUBMIT +SUBMITS +SUBMITTAL +SUBMITTED +SUBMITTING +SUBMODE +SUBMODES +SUBMODULE +SUBMODULES +SUBMULTIPLEXED +SUBNET +SUBNETS +SUBNETWORK +SUBNETWORKS +SUBOPTIMAL +SUBORDINATE +SUBORDINATED +SUBORDINATES +SUBORDINATION +SUBPARTS +SUBPHASES +SUBPOENA +SUBPROBLEM +SUBPROBLEMS +SUBPROCESSES +SUBPROGRAM +SUBPROGRAMS +SUBPROJECT +SUBPROOF +SUBPROOFS +SUBRANGE +SUBRANGES +SUBROUTINE +SUBROUTINES +SUBS +SUBSCHEMA +SUBSCHEMAS +SUBSCRIBE +SUBSCRIBED +SUBSCRIBER +SUBSCRIBERS +SUBSCRIBES +SUBSCRIBING +SUBSCRIPT +SUBSCRIPTED +SUBSCRIPTING +SUBSCRIPTION +SUBSCRIPTIONS +SUBSCRIPTS +SUBSECTION +SUBSECTIONS +SUBSEGMENT +SUBSEGMENTS +SUBSEQUENCE +SUBSEQUENCES +SUBSEQUENT +SUBSEQUENTLY +SUBSERVIENT +SUBSET +SUBSETS +SUBSIDE +SUBSIDED +SUBSIDES +SUBSIDIARIES +SUBSIDIARY +SUBSIDIES +SUBSIDING +SUBSIDIZE +SUBSIDIZED +SUBSIDIZES +SUBSIDIZING +SUBSIDY +SUBSIST +SUBSISTED +SUBSISTENCE +SUBSISTENT +SUBSISTING +SUBSISTS +SUBSLOT +SUBSLOTS +SUBSPACE +SUBSPACES +SUBSTANCE +SUBSTANCES +SUBSTANTIAL +SUBSTANTIALLY +SUBSTANTIATE +SUBSTANTIATED +SUBSTANTIATES +SUBSTANTIATING +SUBSTANTIATION +SUBSTANTIATIONS +SUBSTANTIVE +SUBSTANTIVELY +SUBSTANTIVITY +SUBSTATION +SUBSTATIONS +SUBSTITUTABILITY +SUBSTITUTABLE +SUBSTITUTE +SUBSTITUTED +SUBSTITUTES +SUBSTITUTING +SUBSTITUTION +SUBSTITUTIONS +SUBSTRATE +SUBSTRATES +SUBSTRING +SUBSTRINGS +SUBSTRUCTURE +SUBSTRUCTURES +SUBSUME +SUBSUMED +SUBSUMES +SUBSUMING +SUBSYSTEM +SUBSYSTEMS +SUBTASK +SUBTASKS +SUBTERFUGE +SUBTERRANEAN +SUBTITLE +SUBTITLED +SUBTITLES +SUBTLE +SUBTLENESS +SUBTLER +SUBTLEST +SUBTLETIES +SUBTLETY +SUBTLY +SUBTOTAL +SUBTRACT +SUBTRACTED +SUBTRACTING +SUBTRACTION +SUBTRACTIONS +SUBTRACTOR +SUBTRACTORS +SUBTRACTS +SUBTRAHEND +SUBTRAHENDS +SUBTREE +SUBTREES +SUBUNIT +SUBUNITS +SUBURB +SUBURBAN +SUBURBIA +SUBURBS +SUBVERSION +SUBVERSIVE +SUBVERT +SUBVERTED +SUBVERTER +SUBVERTING +SUBVERTS +SUBWAY +SUBWAYS +SUCCEED +SUCCEEDED +SUCCEEDING +SUCCEEDS +SUCCESS +SUCCESSES +SUCCESSFUL +SUCCESSFULLY +SUCCESSION +SUCCESSIONS +SUCCESSIVE +SUCCESSIVELY +SUCCESSOR +SUCCESSORS +SUCCINCT +SUCCINCTLY +SUCCINCTNESS +SUCCOR +SUCCUMB +SUCCUMBED +SUCCUMBING +SUCCUMBS +SUCH +SUCK +SUCKED +SUCKER +SUCKERS +SUCKING +SUCKLE +SUCKLING +SUCKS +SUCTION +SUDAN +SUDANESE +SUDANIC +SUDDEN +SUDDENLY +SUDDENNESS +SUDS +SUDSING +SUE +SUED +SUES +SUEZ +SUFFER +SUFFERANCE +SUFFERED +SUFFERER +SUFFERERS +SUFFERING +SUFFERINGS +SUFFERS +SUFFICE +SUFFICED +SUFFICES +SUFFICIENCY +SUFFICIENT +SUFFICIENTLY +SUFFICING +SUFFIX +SUFFIXED +SUFFIXER +SUFFIXES +SUFFIXING +SUFFOCATE +SUFFOCATED +SUFFOCATES +SUFFOCATING +SUFFOCATION +SUFFOLK +SUFFRAGE +SUFFRAGETTE +SUGAR +SUGARED +SUGARING +SUGARINGS +SUGARS +SUGGEST +SUGGESTED +SUGGESTIBLE +SUGGESTING +SUGGESTION +SUGGESTIONS +SUGGESTIVE +SUGGESTIVELY +SUGGESTS +SUICIDAL +SUICIDALLY +SUICIDE +SUICIDES +SUING +SUIT +SUITABILITY +SUITABLE +SUITABLENESS +SUITABLY +SUITCASE +SUITCASES +SUITE +SUITED +SUITERS +SUITES +SUITING +SUITOR +SUITORS +SUITS +SUKARNO +SULFA +SULFUR +SULFURIC +SULFUROUS +SULK +SULKED +SULKINESS +SULKING +SULKS +SULKY +SULLEN +SULLENLY +SULLENNESS +SULLIVAN +SULPHATE +SULPHUR +SULPHURED +SULPHURIC +SULTAN +SULTANS +SULTRY +SULZBERGER +SUM +SUMAC +SUMATRA +SUMERIA +SUMERIAN +SUMMAND +SUMMANDS +SUMMARIES +SUMMARILY +SUMMARIZATION +SUMMARIZATIONS +SUMMARIZE +SUMMARIZED +SUMMARIZES +SUMMARIZING +SUMMARY +SUMMATION +SUMMATIONS +SUMMED +SUMMER +SUMMERDALE +SUMMERS +SUMMERTIME +SUMMING +SUMMIT +SUMMITRY +SUMMON +SUMMONED +SUMMONER +SUMMONERS +SUMMONING +SUMMONS +SUMMONSES +SUMNER +SUMPTUOUS +SUMS +SUMTER +SUN +SUNBEAM +SUNBEAMS +SUNBELT +SUNBONNET +SUNBURN +SUNBURNT +SUNDAY +SUNDAYS +SUNDER +SUNDIAL +SUNDOWN +SUNDRIES +SUNDRY +SUNFLOWER +SUNG +SUNGLASS +SUNGLASSES +SUNK +SUNKEN +SUNLIGHT +SUNLIT +SUNNED +SUNNING +SUNNY +SUNNYVALE +SUNRISE +SUNS +SUNSET +SUNSHINE +SUNSPOT +SUNTAN +SUNTANNED +SUNTANNING +SUPER +SUPERB +SUPERBLOCK +SUPERBLY +SUPERCOMPUTER +SUPERCOMPUTERS +SUPEREGO +SUPEREGOS +SUPERFICIAL +SUPERFICIALLY +SUPERFLUITIES +SUPERFLUITY +SUPERFLUOUS +SUPERFLUOUSLY +SUPERGROUP +SUPERGROUPS +SUPERHUMAN +SUPERHUMANLY +SUPERIMPOSE +SUPERIMPOSED +SUPERIMPOSES +SUPERIMPOSING +SUPERINTEND +SUPERINTENDENT +SUPERINTENDENTS +SUPERIOR +SUPERIORITY +SUPERIORS +SUPERLATIVE +SUPERLATIVELY +SUPERLATIVES +SUPERMARKET +SUPERMARKETS +SUPERMINI +SUPERMINIS +SUPERNATURAL +SUPERPOSE +SUPERPOSED +SUPERPOSES +SUPERPOSING +SUPERPOSITION +SUPERSCRIPT +SUPERSCRIPTED +SUPERSCRIPTING +SUPERSCRIPTS +SUPERSEDE +SUPERSEDED +SUPERSEDES +SUPERSEDING +SUPERSET +SUPERSETS +SUPERSTITION +SUPERSTITIONS +SUPERSTITIOUS +SUPERUSER +SUPERVISE +SUPERVISED +SUPERVISES +SUPERVISING +SUPERVISION +SUPERVISOR +SUPERVISORS +SUPERVISORY +SUPINE +SUPPER +SUPPERS +SUPPLANT +SUPPLANTED +SUPPLANTING +SUPPLANTS +SUPPLE +SUPPLEMENT +SUPPLEMENTAL +SUPPLEMENTARY +SUPPLEMENTED +SUPPLEMENTING +SUPPLEMENTS +SUPPLENESS +SUPPLICATION +SUPPLIED +SUPPLIER +SUPPLIERS +SUPPLIES +SUPPLY +SUPPLYING +SUPPORT +SUPPORTABLE +SUPPORTED +SUPPORTER +SUPPORTERS +SUPPORTING +SUPPORTINGLY +SUPPORTIVE +SUPPORTIVELY +SUPPORTS +SUPPOSE +SUPPOSED +SUPPOSEDLY +SUPPOSES +SUPPOSING +SUPPOSITION +SUPPOSITIONS +SUPPRESS +SUPPRESSED +SUPPRESSES +SUPPRESSING +SUPPRESSION +SUPPRESSOR +SUPPRESSORS +SUPRANATIONAL +SUPREMACY +SUPREME +SUPREMELY +SURCHARGE +SURE +SURELY +SURENESS +SURETIES +SURETY +SURF +SURFACE +SURFACED +SURFACENESS +SURFACES +SURFACING +SURGE +SURGED +SURGEON +SURGEONS +SURGERY +SURGES +SURGICAL +SURGICALLY +SURGING +SURLINESS +SURLY +SURMISE +SURMISED +SURMISES +SURMOUNT +SURMOUNTED +SURMOUNTING +SURMOUNTS +SURNAME +SURNAMES +SURPASS +SURPASSED +SURPASSES +SURPASSING +SURPLUS +SURPLUSES +SURPRISE +SURPRISED +SURPRISES +SURPRISING +SURPRISINGLY +SURREAL +SURRENDER +SURRENDERED +SURRENDERING +SURRENDERS +SURREPTITIOUS +SURREY +SURROGATE +SURROGATES +SURROUND +SURROUNDED +SURROUNDING +SURROUNDINGS +SURROUNDS +SURTAX +SURVEY +SURVEYED +SURVEYING +SURVEYOR +SURVEYORS +SURVEYS +SURVIVAL +SURVIVALS +SURVIVE +SURVIVED +SURVIVES +SURVIVING +SURVIVOR +SURVIVORS +SUS +SUSAN +SUSANNE +SUSCEPTIBLE +SUSIE +SUSPECT +SUSPECTED +SUSPECTING +SUSPECTS +SUSPEND +SUSPENDED +SUSPENDER +SUSPENDERS +SUSPENDING +SUSPENDS +SUSPENSE +SUSPENSES +SUSPENSION +SUSPENSIONS +SUSPICION +SUSPICIONS +SUSPICIOUS +SUSPICIOUSLY +SUSQUEHANNA +SUSSEX +SUSTAIN +SUSTAINED +SUSTAINING +SUSTAINS +SUSTENANCE +SUTHERLAND +SUTTON +SUTURE +SUTURES +SUWANEE +SUZANNE +SUZERAINTY +SUZUKI +SVELTE +SVETLANA +SWAB +SWABBING +SWAGGER +SWAGGERED +SWAGGERING +SWAHILI +SWAIN +SWAINS +SWALLOW +SWALLOWED +SWALLOWING +SWALLOWS +SWALLOWTAIL +SWAM +SWAMI +SWAMP +SWAMPED +SWAMPING +SWAMPS +SWAMPY +SWAN +SWANK +SWANKY +SWANLIKE +SWANS +SWANSEA +SWANSON +SWAP +SWAPPED +SWAPPING +SWAPS +SWARM +SWARMED +SWARMING +SWARMS +SWARTHMORE +SWARTHOUT +SWARTHY +SWARTZ +SWASTIKA +SWAT +SWATTED +SWAY +SWAYED +SWAYING +SWAZILAND +SWEAR +SWEARER +SWEARING +SWEARS +SWEAT +SWEATED +SWEATER +SWEATERS +SWEATING +SWEATS +SWEATSHIRT +SWEATY +SWEDE +SWEDEN +SWEDES +SWEDISH +SWEENEY +SWEENEYS +SWEEP +SWEEPER +SWEEPERS +SWEEPING +SWEEPINGS +SWEEPS +SWEEPSTAKES +SWEET +SWEETEN +SWEETENED +SWEETENER +SWEETENERS +SWEETENING +SWEETENINGS +SWEETENS +SWEETER +SWEETEST +SWEETHEART +SWEETHEARTS +SWEETISH +SWEETLY +SWEETNESS +SWEETS +SWELL +SWELLED +SWELLING +SWELLINGS +SWELLS +SWELTER +SWENSON +SWEPT +SWERVE +SWERVED +SWERVES +SWERVING +SWIFT +SWIFTER +SWIFTEST +SWIFTLY +SWIFTNESS +SWIM +SWIMMER +SWIMMERS +SWIMMING +SWIMMINGLY +SWIMS +SWIMSUIT +SWINBURNE +SWINDLE +SWINE +SWING +SWINGER +SWINGERS +SWINGING +SWINGS +SWINK +SWIPE +SWIRL +SWIRLED +SWIRLING +SWISH +SWISHED +SWISS +SWITCH +SWITCHBLADE +SWITCHBOARD +SWITCHBOARDS +SWITCHED +SWITCHER +SWITCHERS +SWITCHES +SWITCHING +SWITCHINGS +SWITCHMAN +SWITZER +SWITZERLAND +SWIVEL +SWIZZLE +SWOLLEN +SWOON +SWOOP +SWOOPED +SWOOPING +SWOOPS +SWORD +SWORDFISH +SWORDS +SWORE +SWORN +SWUM +SWUNG +SYBIL +SYCAMORE +SYCOPHANT +SYCOPHANTIC +SYDNEY +SYKES +SYLLABLE +SYLLABLES +SYLLOGISM +SYLLOGISMS +SYLLOGISTIC +SYLOW +SYLVAN +SYLVANIA +SYLVESTER +SYLVIA +SYLVIE +SYMBIOSIS +SYMBIOTIC +SYMBOL +SYMBOLIC +SYMBOLICALLY +SYMBOLICS +SYMBOLISM +SYMBOLIZATION +SYMBOLIZE +SYMBOLIZED +SYMBOLIZES +SYMBOLIZING +SYMBOLS +SYMINGTON +SYMMETRIC +SYMMETRICAL +SYMMETRICALLY +SYMMETRIES +SYMMETRY +SYMPATHETIC +SYMPATHIES +SYMPATHIZE +SYMPATHIZED +SYMPATHIZER +SYMPATHIZERS +SYMPATHIZES +SYMPATHIZING +SYMPATHIZINGLY +SYMPATHY +SYMPHONIC +SYMPHONIES +SYMPHONY +SYMPOSIA +SYMPOSIUM +SYMPOSIUMS +SYMPTOM +SYMPTOMATIC +SYMPTOMS +SYNAGOGUE +SYNAPSE +SYNAPSES +SYNAPTIC +SYNCHRONISM +SYNCHRONIZATION +SYNCHRONIZE +SYNCHRONIZED +SYNCHRONIZER +SYNCHRONIZERS +SYNCHRONIZES +SYNCHRONIZING +SYNCHRONOUS +SYNCHRONOUSLY +SYNCHRONY +SYNCHROTRON +SYNCOPATE +SYNDICATE +SYNDICATED +SYNDICATES +SYNDICATION +SYNDROME +SYNDROMES +SYNERGISM +SYNERGISTIC +SYNERGY +SYNGE +SYNOD +SYNONYM +SYNONYMOUS +SYNONYMOUSLY +SYNONYMS +SYNOPSES +SYNOPSIS +SYNTACTIC +SYNTACTICAL +SYNTACTICALLY +SYNTAX +SYNTAXES +SYNTHESIS +SYNTHESIZE +SYNTHESIZED +SYNTHESIZER +SYNTHESIZERS +SYNTHESIZES +SYNTHESIZING +SYNTHETIC +SYNTHETICS +SYRACUSE +SYRIA +SYRIAN +SYRIANIZE +SYRIANIZES +SYRIANS +SYRINGE +SYRINGES +SYRUP +SYRUPY +SYSTEM +SYSTEMATIC +SYSTEMATICALLY +SYSTEMATIZE +SYSTEMATIZED +SYSTEMATIZES +SYSTEMATIZING +SYSTEMIC +SYSTEMS +SYSTEMWIDE +SZILARD +TAB +TABERNACLE +TABERNACLES +TABLE +TABLEAU +TABLEAUS +TABLECLOTH +TABLECLOTHS +TABLED +TABLES +TABLESPOON +TABLESPOONFUL +TABLESPOONFULS +TABLESPOONS +TABLET +TABLETS +TABLING +TABOO +TABOOS +TABS +TABULAR +TABULATE +TABULATED +TABULATES +TABULATING +TABULATION +TABULATIONS +TABULATOR +TABULATORS +TACHOMETER +TACHOMETERS +TACIT +TACITLY +TACITUS +TACK +TACKED +TACKING +TACKLE +TACKLES +TACOMA +TACT +TACTIC +TACTICS +TACTILE +TAFT +TAG +TAGGED +TAGGING +TAGS +TAHITI +TAHOE +TAIL +TAILED +TAILING +TAILOR +TAILORED +TAILORING +TAILORS +TAILS +TAINT +TAINTED +TAIPEI +TAIWAN +TAIWANESE +TAKE +TAKEN +TAKER +TAKERS +TAKES +TAKING +TAKINGS +TALE +TALENT +TALENTED +TALENTS +TALES +TALK +TALKATIVE +TALKATIVELY +TALKATIVENESS +TALKED +TALKER +TALKERS +TALKIE +TALKING +TALKS +TALL +TALLADEGA +TALLAHASSEE +TALLAHATCHIE +TALLAHOOSA +TALLCHIEF +TALLER +TALLEST +TALLEYRAND +TALLNESS +TALLOW +TALLY +TALMUD +TALMUDISM +TALMUDIZATION +TALMUDIZATIONS +TALMUDIZE +TALMUDIZES +TAME +TAMED +TAMELY +TAMENESS +TAMER +TAMES +TAMIL +TAMING +TAMMANY +TAMMANYIZE +TAMMANYIZES +TAMPA +TAMPER +TAMPERED +TAMPERING +TAMPERS +TAN +TANAKA +TANANARIVE +TANDEM +TANG +TANGANYIKA +TANGENT +TANGENTIAL +TANGENTS +TANGIBLE +TANGIBLY +TANGLE +TANGLED +TANGY +TANK +TANKER +TANKERS +TANKS +TANNENBAUM +TANNER +TANNERS +TANTALIZING +TANTALIZINGLY +TANTALUS +TANTAMOUNT +TANTRUM +TANTRUMS +TANYA +TANZANIA +TAOISM +TAOIST +TAOS +TAP +TAPE +TAPED +TAPER +TAPERED +TAPERING +TAPERS +TAPES +TAPESTRIES +TAPESTRY +TAPING +TAPINGS +TAPPED +TAPPER +TAPPERS +TAPPING +TAPROOT +TAPROOTS +TAPS +TAR +TARA +TARBELL +TARDINESS +TARDY +TARGET +TARGETED +TARGETING +TARGETS +TARIFF +TARIFFS +TARRY +TARRYTOWN +TART +TARTARY +TARTLY +TARTNESS +TARTUFFE +TARZAN +TASK +TASKED +TASKING +TASKS +TASMANIA +TASS +TASSEL +TASSELS +TASTE +TASTED +TASTEFUL +TASTEFULLY +TASTEFULNESS +TASTELESS +TASTELESSLY +TASTER +TASTERS +TASTES +TASTING +TATE +TATTER +TATTERED +TATTOO +TATTOOED +TATTOOS +TAU +TAUGHT +TAUNT +TAUNTED +TAUNTER +TAUNTING +TAUNTS +TAURUS +TAUT +TAUTLY +TAUTNESS +TAUTOLOGICAL +TAUTOLOGICALLY +TAUTOLOGIES +TAUTOLOGY +TAVERN +TAVERNS +TAWNEY +TAWNY +TAX +TAXABLE +TAXATION +TAXED +TAXES +TAXI +TAXICAB +TAXICABS +TAXIED +TAXIING +TAXING +TAXIS +TAXONOMIC +TAXONOMICALLY +TAXONOMY +TAXPAYER +TAXPAYERS +TAYLOR +TAYLORIZE +TAYLORIZES +TAYLORS +TCHAIKOVSKY +TEA +TEACH +TEACHABLE +TEACHER +TEACHERS +TEACHES +TEACHING +TEACHINGS +TEACUP +TEAM +TEAMED +TEAMING +TEAMS +TEAR +TEARED +TEARFUL +TEARFULLY +TEARING +TEARS +TEAS +TEASE +TEASED +TEASES +TEASING +TEASPOON +TEASPOONFUL +TEASPOONFULS +TEASPOONS +TECHNICAL +TECHNICALITIES +TECHNICALITY +TECHNICALLY +TECHNICIAN +TECHNICIANS +TECHNION +TECHNIQUE +TECHNIQUES +TECHNOLOGICAL +TECHNOLOGICALLY +TECHNOLOGIES +TECHNOLOGIST +TECHNOLOGISTS +TECHNOLOGY +TED +TEDDY +TEDIOUS +TEDIOUSLY +TEDIOUSNESS +TEDIUM +TEEM +TEEMED +TEEMING +TEEMS +TEEN +TEENAGE +TEENAGED +TEENAGER +TEENAGERS +TEENS +TEETH +TEETHE +TEETHED +TEETHES +TEETHING +TEFLON +TEGUCIGALPA +TEHERAN +TEHRAN +TEKTRONIX +TELECOMMUNICATION +TELECOMMUNICATIONS +TELEDYNE +TELEFUNKEN +TELEGRAM +TELEGRAMS +TELEGRAPH +TELEGRAPHED +TELEGRAPHER +TELEGRAPHERS +TELEGRAPHIC +TELEGRAPHING +TELEGRAPHS +TELEMANN +TELEMETRY +TELEOLOGICAL +TELEOLOGICALLY +TELEOLOGY +TELEPATHY +TELEPHONE +TELEPHONED +TELEPHONER +TELEPHONERS +TELEPHONES +TELEPHONIC +TELEPHONING +TELEPHONY +TELEPROCESSING +TELESCOPE +TELESCOPED +TELESCOPES +TELESCOPING +TELETEX +TELETEXT +TELETYPE +TELETYPES +TELEVISE +TELEVISED +TELEVISES +TELEVISING +TELEVISION +TELEVISIONS +TELEVISOR +TELEVISORS +TELEX +TELL +TELLER +TELLERS +TELLING +TELLS +TELNET +TELNET +TEMPER +TEMPERAMENT +TEMPERAMENTAL +TEMPERAMENTS +TEMPERANCE +TEMPERATE +TEMPERATELY +TEMPERATENESS +TEMPERATURE +TEMPERATURES +TEMPERED +TEMPERING +TEMPERS +TEMPEST +TEMPESTUOUS +TEMPESTUOUSLY +TEMPLATE +TEMPLATES +TEMPLE +TEMPLEMAN +TEMPLES +TEMPLETON +TEMPORAL +TEMPORALLY +TEMPORARIES +TEMPORARILY +TEMPORARY +TEMPT +TEMPTATION +TEMPTATIONS +TEMPTED +TEMPTER +TEMPTERS +TEMPTING +TEMPTINGLY +TEMPTS +TEN +TENACIOUS +TENACIOUSLY +TENANT +TENANTS +TEND +TENDED +TENDENCIES +TENDENCY +TENDER +TENDERLY +TENDERNESS +TENDERS +TENDING +TENDS +TENEMENT +TENEMENTS +TENEX +TENEX +TENFOLD +TENNECO +TENNESSEE +TENNEY +TENNIS +TENNYSON +TENOR +TENORS +TENS +TENSE +TENSED +TENSELY +TENSENESS +TENSER +TENSES +TENSEST +TENSING +TENSION +TENSIONS +TENT +TENTACLE +TENTACLED +TENTACLES +TENTATIVE +TENTATIVELY +TENTED +TENTH +TENTING +TENTS +TENURE +TERESA +TERM +TERMED +TERMINAL +TERMINALLY +TERMINALS +TERMINATE +TERMINATED +TERMINATES +TERMINATING +TERMINATION +TERMINATIONS +TERMINATOR +TERMINATORS +TERMING +TERMINOLOGIES +TERMINOLOGY +TERMINUS +TERMS +TERMWISE +TERNARY +TERPSICHORE +TERRA +TERRACE +TERRACED +TERRACES +TERRAIN +TERRAINS +TERRAN +TERRE +TERRESTRIAL +TERRESTRIALS +TERRIBLE +TERRIBLY +TERRIER +TERRIERS +TERRIFIC +TERRIFIED +TERRIFIES +TERRIFY +TERRIFYING +TERRITORIAL +TERRITORIES +TERRITORY +TERROR +TERRORISM +TERRORIST +TERRORISTIC +TERRORISTS +TERRORIZE +TERRORIZED +TERRORIZES +TERRORIZING +TERRORS +TERTIARY +TESS +TESSIE +TEST +TESTABILITY +TESTABLE +TESTAMENT +TESTAMENTS +TESTED +TESTER +TESTERS +TESTICLE +TESTICLES +TESTIFIED +TESTIFIER +TESTIFIERS +TESTIFIES +TESTIFY +TESTIFYING +TESTIMONIES +TESTIMONY +TESTING +TESTINGS +TESTS +TEUTONIC +TEX +TEX +TEXACO +TEXAN +TEXANS +TEXAS +TEXASES +TEXT +TEXTBOOK +TEXTBOOKS +TEXTILE +TEXTILES +TEXTRON +TEXTS +TEXTUAL +TEXTUALLY +TEXTURE +TEXTURED +TEXTURES +THAI +THAILAND +THALIA +THAMES +THAN +THANK +THANKED +THANKFUL +THANKFULLY +THANKFULNESS +THANKING +THANKLESS +THANKLESSLY +THANKLESSNESS +THANKS +THANKSGIVING +THANKSGIVINGS +THAT +THATCH +THATCHES +THATS +THAW +THAWED +THAWING +THAWS +THAYER +THE +THEA +THEATER +THEATERS +THEATRICAL +THEATRICALLY +THEATRICALS +THEBES +THEFT +THEFTS +THEIR +THEIRS +THELMA +THEM +THEMATIC +THEME +THEMES +THEMSELVES +THEN +THENCE +THENCEFORTH +THEODORE +THEODOSIAN +THEODOSIUS +THEOLOGICAL +THEOLOGY +THEOREM +THEOREMS +THEORETIC +THEORETICAL +THEORETICALLY +THEORETICIANS +THEORIES +THEORIST +THEORISTS +THEORIZATION +THEORIZATIONS +THEORIZE +THEORIZED +THEORIZER +THEORIZERS +THEORIZES +THEORIZING +THEORY +THERAPEUTIC +THERAPIES +THERAPIST +THERAPISTS +THERAPY +THERE +THEREABOUTS +THEREAFTER +THEREBY +THEREFORE +THEREIN +THEREOF +THEREON +THERESA +THERETO +THEREUPON +THEREWITH +THERMAL +THERMODYNAMIC +THERMODYNAMICS +THERMOFAX +THERMOMETER +THERMOMETERS +THERMOSTAT +THERMOSTATS +THESE +THESES +THESEUS +THESIS +THESSALONIAN +THESSALY +THETIS +THEY +THICK +THICKEN +THICKENS +THICKER +THICKEST +THICKET +THICKETS +THICKLY +THICKNESS +THIEF +THIENSVILLE +THIEVE +THIEVES +THIEVING +THIGH +THIGHS +THIMBLE +THIMBLES +THIMBU +THIN +THING +THINGS +THINK +THINKABLE +THINKABLY +THINKER +THINKERS +THINKING +THINKS +THINLY +THINNER +THINNESS +THINNEST +THIRD +THIRDLY +THIRDS +THIRST +THIRSTED +THIRSTS +THIRSTY +THIRTEEN +THIRTEENS +THIRTEENTH +THIRTIES +THIRTIETH +THIRTY +THIS +THISTLE +THOMAS +THOMISTIC +THOMPSON +THOMSON +THONG +THOR +THOREAU +THORN +THORNBURG +THORNS +THORNTON +THORNY +THOROUGH +THOROUGHFARE +THOROUGHFARES +THOROUGHLY +THOROUGHNESS +THORPE +THORSTEIN +THOSE +THOUGH +THOUGHT +THOUGHTFUL +THOUGHTFULLY +THOUGHTFULNESS +THOUGHTLESS +THOUGHTLESSLY +THOUGHTLESSNESS +THOUGHTS +THOUSAND +THOUSANDS +THOUSANDTH +THRACE +THRACIAN +THRASH +THRASHED +THRASHER +THRASHES +THRASHING +THREAD +THREADED +THREADER +THREADERS +THREADING +THREADS +THREAT +THREATEN +THREATENED +THREATENING +THREATENS +THREATS +THREE +THREEFOLD +THREES +THREESCORE +THRESHOLD +THRESHOLDS +THREW +THRICE +THRIFT +THRIFTY +THRILL +THRILLED +THRILLER +THRILLERS +THRILLING +THRILLINGLY +THRILLS +THRIVE +THRIVED +THRIVES +THRIVING +THROAT +THROATED +THROATS +THROB +THROBBED +THROBBING +THROBS +THRONE +THRONEBERRY +THRONES +THRONG +THRONGS +THROTTLE +THROTTLED +THROTTLES +THROTTLING +THROUGH +THROUGHOUT +THROUGHPUT +THROW +THROWER +THROWING +THROWN +THROWS +THRUSH +THRUST +THRUSTER +THRUSTERS +THRUSTING +THRUSTS +THUBAN +THUD +THUDS +THUG +THUGS +THULE +THUMB +THUMBED +THUMBING +THUMBS +THUMP +THUMPED +THUMPING +THUNDER +THUNDERBOLT +THUNDERBOLTS +THUNDERED +THUNDERER +THUNDERERS +THUNDERING +THUNDERS +THUNDERSTORM +THUNDERSTORMS +THURBER +THURMAN +THURSDAY +THURSDAYS +THUS +THUSLY +THWART +THWARTED +THWARTING +THWARTS +THYSELF +TIBER +TIBET +TIBETAN +TIBURON +TICK +TICKED +TICKER +TICKERS +TICKET +TICKETS +TICKING +TICKLE +TICKLED +TICKLES +TICKLING +TICKLISH +TICKS +TICONDEROGA +TIDAL +TIDALLY +TIDE +TIDED +TIDES +TIDIED +TIDINESS +TIDING +TIDINGS +TIDY +TIDYING +TIE +TIECK +TIED +TIENTSIN +TIER +TIERS +TIES +TIFFANY +TIGER +TIGERS +TIGHT +TIGHTEN +TIGHTENED +TIGHTENER +TIGHTENERS +TIGHTENING +TIGHTENINGS +TIGHTENS +TIGHTER +TIGHTEST +TIGHTLY +TIGHTNESS +TIGRIS +TIJUANA +TILDE +TILE +TILED +TILES +TILING +TILL +TILLABLE +TILLED +TILLER +TILLERS +TILLICH +TILLIE +TILLING +TILLS +TILT +TILTED +TILTING +TILTS +TIM +TIMBER +TIMBERED +TIMBERING +TIMBERS +TIME +TIMED +TIMELESS +TIMELESSLY +TIMELESSNESS +TIMELY +TIMEOUT +TIMEOUTS +TIMER +TIMERS +TIMES +TIMESHARE +TIMESHARES +TIMESHARING +TIMESTAMP +TIMESTAMPS +TIMETABLE +TIMETABLES +TIMEX +TIMID +TIMIDITY +TIMIDLY +TIMING +TIMINGS +TIMMY +TIMON +TIMONIZE +TIMONIZES +TIMS +TIN +TINA +TINCTURE +TINGE +TINGED +TINGLE +TINGLED +TINGLES +TINGLING +TINIER +TINIEST +TINILY +TININESS +TINKER +TINKERED +TINKERING +TINKERS +TINKLE +TINKLED +TINKLES +TINKLING +TINNIER +TINNIEST +TINNILY +TINNINESS +TINNY +TINS +TINSELTOWN +TINT +TINTED +TINTING +TINTS +TINY +TIOGA +TIP +TIPPECANOE +TIPPED +TIPPER +TIPPERARY +TIPPERS +TIPPING +TIPS +TIPTOE +TIRANA +TIRE +TIRED +TIREDLY +TIRELESS +TIRELESSLY +TIRELESSNESS +TIRES +TIRESOME +TIRESOMELY +TIRESOMENESS +TIRING +TISSUE +TISSUES +TIT +TITAN +TITHE +TITHER +TITHES +TITHING +TITLE +TITLED +TITLES +TITO +TITS +TITTER +TITTERS +TITUS +TOAD +TOADS +TOAST +TOASTED +TOASTER +TOASTING +TOASTS +TOBACCO +TOBAGO +TOBY +TODAY +TODAYS +TODD +TOE +TOES +TOGETHER +TOGETHERNESS +TOGGLE +TOGGLED +TOGGLES +TOGGLING +TOGO +TOIL +TOILED +TOILER +TOILET +TOILETS +TOILING +TOILS +TOKEN +TOKENS +TOKYO +TOLAND +TOLD +TOLEDO +TOLERABILITY +TOLERABLE +TOLERABLY +TOLERANCE +TOLERANCES +TOLERANT +TOLERANTLY +TOLERATE +TOLERATED +TOLERATES +TOLERATING +TOLERATION +TOLL +TOLLED +TOLLEY +TOLLS +TOLSTOY +TOM +TOMAHAWK +TOMAHAWKS +TOMATO +TOMATOES +TOMB +TOMBIGBEE +TOMBS +TOMLINSON +TOMMIE +TOMOGRAPHY +TOMORROW +TOMORROWS +TOMPKINS +TON +TONE +TONED +TONER +TONES +TONGS +TONGUE +TONGUED +TONGUES +TONI +TONIC +TONICS +TONIGHT +TONING +TONIO +TONNAGE +TONS +TONSIL +TOO +TOOK +TOOL +TOOLED +TOOLER +TOOLERS +TOOLING +TOOLS +TOOMEY +TOOTH +TOOTHBRUSH +TOOTHBRUSHES +TOOTHPASTE +TOOTHPICK +TOOTHPICKS +TOP +TOPEKA +TOPER +TOPIC +TOPICAL +TOPICALLY +TOPICS +TOPMOST +TOPOGRAPHY +TOPOLOGICAL +TOPOLOGIES +TOPOLOGY +TOPPLE +TOPPLED +TOPPLES +TOPPLING +TOPS +TOPSY +TORAH +TORCH +TORCHES +TORE +TORIES +TORMENT +TORMENTED +TORMENTER +TORMENTERS +TORMENTING +TORN +TORNADO +TORNADOES +TORONTO +TORPEDO +TORPEDOES +TORQUE +TORQUEMADA +TORRANCE +TORRENT +TORRENTS +TORRID +TORTOISE +TORTOISES +TORTURE +TORTURED +TORTURER +TORTURERS +TORTURES +TORTURING +TORUS +TORUSES +TORY +TORYIZE +TORYIZES +TOSCA +TOSCANINI +TOSHIBA +TOSS +TOSSED +TOSSES +TOSSING +TOTAL +TOTALED +TOTALING +TOTALITIES +TOTALITY +TOTALLED +TOTALLER +TOTALLERS +TOTALLING +TOTALLY +TOTALS +TOTO +TOTTER +TOTTERED +TOTTERING +TOTTERS +TOUCH +TOUCHABLE +TOUCHED +TOUCHES +TOUCHIER +TOUCHIEST +TOUCHILY +TOUCHINESS +TOUCHING +TOUCHINGLY +TOUCHY +TOUGH +TOUGHEN +TOUGHER +TOUGHEST +TOUGHLY +TOUGHNESS +TOULOUSE +TOUR +TOURED +TOURING +TOURIST +TOURISTS +TOURNAMENT +TOURNAMENTS +TOURS +TOW +TOWARD +TOWARDS +TOWED +TOWEL +TOWELING +TOWELLED +TOWELLING +TOWELS +TOWER +TOWERED +TOWERING +TOWERS +TOWN +TOWNLEY +TOWNS +TOWNSEND +TOWNSHIP +TOWNSHIPS +TOWSLEY +TOY +TOYED +TOYING +TOYNBEE +TOYOTA +TOYS +TRACE +TRACEABLE +TRACED +TRACER +TRACERS +TRACES +TRACING +TRACINGS +TRACK +TRACKED +TRACKER +TRACKERS +TRACKING +TRACKS +TRACT +TRACTABILITY +TRACTABLE +TRACTARIANS +TRACTIVE +TRACTOR +TRACTORS +TRACTS +TRACY +TRADE +TRADED +TRADEMARK +TRADEMARKS +TRADEOFF +TRADEOFFS +TRADER +TRADERS +TRADES +TRADESMAN +TRADING +TRADITION +TRADITIONAL +TRADITIONALLY +TRADITIONS +TRAFFIC +TRAFFICKED +TRAFFICKER +TRAFFICKERS +TRAFFICKING +TRAFFICS +TRAGEDIES +TRAGEDY +TRAGIC +TRAGICALLY +TRAIL +TRAILED +TRAILER +TRAILERS +TRAILING +TRAILINGS +TRAILS +TRAIN +TRAINED +TRAINEE +TRAINEES +TRAINER +TRAINERS +TRAINING +TRAINS +TRAIT +TRAITOR +TRAITORS +TRAITS +TRAJECTORIES +TRAJECTORY +TRAMP +TRAMPED +TRAMPING +TRAMPLE +TRAMPLED +TRAMPLER +TRAMPLES +TRAMPLING +TRAMPS +TRANCE +TRANCES +TRANQUIL +TRANQUILITY +TRANQUILLY +TRANSACT +TRANSACTION +TRANSACTIONS +TRANSATLANTIC +TRANSCEIVE +TRANSCEIVER +TRANSCEIVERS +TRANSCEND +TRANSCENDED +TRANSCENDENT +TRANSCENDING +TRANSCENDS +TRANSCONTINENTAL +TRANSCRIBE +TRANSCRIBED +TRANSCRIBER +TRANSCRIBERS +TRANSCRIBES +TRANSCRIBING +TRANSCRIPT +TRANSCRIPTION +TRANSCRIPTIONS +TRANSCRIPTS +TRANSFER +TRANSFERABILITY +TRANSFERABLE +TRANSFERAL +TRANSFERALS +TRANSFERENCE +TRANSFERRED +TRANSFERRER +TRANSFERRERS +TRANSFERRING +TRANSFERS +TRANSFINITE +TRANSFORM +TRANSFORMABLE +TRANSFORMATION +TRANSFORMATIONAL +TRANSFORMATIONS +TRANSFORMED +TRANSFORMER +TRANSFORMERS +TRANSFORMING +TRANSFORMS +TRANSGRESS +TRANSGRESSED +TRANSGRESSION +TRANSGRESSIONS +TRANSIENCE +TRANSIENCY +TRANSIENT +TRANSIENTLY +TRANSIENTS +TRANSISTOR +TRANSISTORIZE +TRANSISTORIZED +TRANSISTORIZING +TRANSISTORS +TRANSIT +TRANSITE +TRANSITION +TRANSITIONAL +TRANSITIONED +TRANSITIONS +TRANSITIVE +TRANSITIVELY +TRANSITIVENESS +TRANSITIVITY +TRANSITORY +TRANSLATABILITY +TRANSLATABLE +TRANSLATE +TRANSLATED +TRANSLATES +TRANSLATING +TRANSLATION +TRANSLATIONAL +TRANSLATIONS +TRANSLATOR +TRANSLATORS +TRANSLUCENT +TRANSMISSION +TRANSMISSIONS +TRANSMIT +TRANSMITS +TRANSMITTAL +TRANSMITTED +TRANSMITTER +TRANSMITTERS +TRANSMITTING +TRANSMOGRIFICATION +TRANSMOGRIFY +TRANSPACIFIC +TRANSPARENCIES +TRANSPARENCY +TRANSPARENT +TRANSPARENTLY +TRANSPIRE +TRANSPIRED +TRANSPIRES +TRANSPIRING +TRANSPLANT +TRANSPLANTED +TRANSPLANTING +TRANSPLANTS +TRANSPONDER +TRANSPONDERS +TRANSPORT +TRANSPORTABILITY +TRANSPORTATION +TRANSPORTED +TRANSPORTER +TRANSPORTERS +TRANSPORTING +TRANSPORTS +TRANSPOSE +TRANSPOSED +TRANSPOSES +TRANSPOSING +TRANSPOSITION +TRANSPUTER +TRANSVAAL +TRANSYLVANIA +TRAP +TRAPEZOID +TRAPEZOIDAL +TRAPEZOIDS +TRAPPED +TRAPPER +TRAPPERS +TRAPPING +TRAPPINGS +TRAPS +TRASH +TRASTEVERE +TRAUMA +TRAUMATIC +TRAVAIL +TRAVEL +TRAVELED +TRAVELER +TRAVELERS +TRAVELING +TRAVELINGS +TRAVELS +TRAVERSAL +TRAVERSALS +TRAVERSE +TRAVERSED +TRAVERSES +TRAVERSING +TRAVESTIES +TRAVESTY +TRAVIS +TRAY +TRAYS +TREACHERIES +TREACHEROUS +TREACHEROUSLY +TREACHERY +TREAD +TREADING +TREADS +TREADWELL +TREASON +TREASURE +TREASURED +TREASURER +TREASURES +TREASURIES +TREASURING +TREASURY +TREAT +TREATED +TREATIES +TREATING +TREATISE +TREATISES +TREATMENT +TREATMENTS +TREATS +TREATY +TREBLE +TREE +TREES +TREETOP +TREETOPS +TREK +TREKS +TREMBLE +TREMBLED +TREMBLES +TREMBLING +TREMENDOUS +TREMENDOUSLY +TREMOR +TREMORS +TRENCH +TRENCHER +TRENCHES +TREND +TRENDING +TRENDS +TRENTON +TRESPASS +TRESPASSED +TRESPASSER +TRESPASSERS +TRESPASSES +TRESS +TRESSES +TREVELYAN +TRIAL +TRIALS +TRIANGLE +TRIANGLES +TRIANGULAR +TRIANGULARLY +TRIANGULUM +TRIANON +TRIASSIC +TRIBAL +TRIBE +TRIBES +TRIBUNAL +TRIBUNALS +TRIBUNE +TRIBUNES +TRIBUTARY +TRIBUTE +TRIBUTES +TRICERATOPS +TRICHINELLA +TRICHOTOMY +TRICK +TRICKED +TRICKIER +TRICKIEST +TRICKINESS +TRICKING +TRICKLE +TRICKLED +TRICKLES +TRICKLING +TRICKS +TRICKY +TRIED +TRIER +TRIERS +TRIES +TRIFLE +TRIFLER +TRIFLES +TRIFLING +TRIGGER +TRIGGERED +TRIGGERING +TRIGGERS +TRIGONOMETRIC +TRIGONOMETRY +TRIGRAM +TRIGRAMS +TRIHEDRAL +TRILATERAL +TRILL +TRILLED +TRILLION +TRILLIONS +TRILLIONTH +TRIM +TRIMBLE +TRIMLY +TRIMMED +TRIMMER +TRIMMEST +TRIMMING +TRIMMINGS +TRIMNESS +TRIMS +TRINIDAD +TRINKET +TRINKETS +TRIO +TRIP +TRIPLE +TRIPLED +TRIPLES +TRIPLET +TRIPLETS +TRIPLETT +TRIPLING +TRIPOD +TRIPS +TRISTAN +TRIUMPH +TRIUMPHAL +TRIUMPHANT +TRIUMPHANTLY +TRIUMPHED +TRIUMPHING +TRIUMPHS +TRIVIA +TRIVIAL +TRIVIALITIES +TRIVIALITY +TRIVIALLY +TROBRIAND +TROD +TROJAN +TROLL +TROLLEY +TROLLEYS +TROLLS +TROOP +TROOPER +TROOPERS +TROOPS +TROPEZ +TROPHIES +TROPHY +TROPIC +TROPICAL +TROPICS +TROT +TROTS +TROTSKY +TROUBLE +TROUBLED +TROUBLEMAKER +TROUBLEMAKERS +TROUBLES +TROUBLESHOOT +TROUBLESHOOTER +TROUBLESHOOTERS +TROUBLESHOOTING +TROUBLESHOOTS +TROUBLESOME +TROUBLESOMELY +TROUBLING +TROUGH +TROUSER +TROUSERS +TROUT +TROUTMAN +TROWEL +TROWELS +TROY +TRUANT +TRUANTS +TRUCE +TRUCK +TRUCKED +TRUCKEE +TRUCKER +TRUCKERS +TRUCKING +TRUCKS +TRUDEAU +TRUDGE +TRUDGED +TRUDY +TRUE +TRUED +TRUER +TRUES +TRUEST +TRUING +TRUISM +TRUISMS +TRUJILLO +TRUK +TRULY +TRUMAN +TRUMBULL +TRUMP +TRUMPED +TRUMPET +TRUMPETER +TRUMPS +TRUNCATE +TRUNCATED +TRUNCATES +TRUNCATING +TRUNCATION +TRUNCATIONS +TRUNK +TRUNKS +TRUST +TRUSTED +TRUSTEE +TRUSTEES +TRUSTFUL +TRUSTFULLY +TRUSTFULNESS +TRUSTING +TRUSTINGLY +TRUSTS +TRUSTWORTHINESS +TRUSTWORTHY +TRUSTY +TRUTH +TRUTHFUL +TRUTHFULLY +TRUTHFULNESS +TRUTHS +TRY +TRYING +TSUNEMATSU +TUB +TUBE +TUBER +TUBERCULOSIS +TUBERS +TUBES +TUBING +TUBS +TUCK +TUCKED +TUCKER +TUCKING +TUCKS +TUCSON +TUDOR +TUESDAY +TUESDAYS +TUFT +TUFTS +TUG +TUGS +TUITION +TULANE +TULIP +TULIPS +TULSA +TUMBLE +TUMBLED +TUMBLER +TUMBLERS +TUMBLES +TUMBLING +TUMOR +TUMORS +TUMULT +TUMULTS +TUMULTUOUS +TUNABLE +TUNE +TUNED +TUNER +TUNERS +TUNES +TUNIC +TUNICS +TUNING +TUNIS +TUNISIA +TUNISIAN +TUNNEL +TUNNELED +TUNNELS +TUPLE +TUPLES +TURBAN +TURBANS +TURBULENCE +TURBULENT +TURBULENTLY +TURF +TURGID +TURGIDLY +TURIN +TURING +TURKEY +TURKEYS +TURKISH +TURKIZE +TURKIZES +TURMOIL +TURMOILS +TURN +TURNABLE +TURNAROUND +TURNED +TURNER +TURNERS +TURNING +TURNINGS +TURNIP +TURNIPS +TURNOVER +TURNS +TURPENTINE +TURQUOISE +TURRET +TURRETS +TURTLE +TURTLENECK +TURTLES +TUSCALOOSA +TUSCAN +TUSCANIZE +TUSCANIZES +TUSCANY +TUSCARORA +TUSKEGEE +TUTANKHAMEN +TUTANKHAMON +TUTANKHAMUN +TUTENKHAMON +TUTOR +TUTORED +TUTORIAL +TUTORIALS +TUTORING +TUTORS +TUTTLE +TWAIN +TWANG +TWAS +TWEED +TWELFTH +TWELVE +TWELVES +TWENTIES +TWENTIETH +TWENTY +TWICE +TWIG +TWIGS +TWILIGHT +TWILIGHTS +TWILL +TWIN +TWINE +TWINED +TWINER +TWINKLE +TWINKLED +TWINKLER +TWINKLES +TWINKLING +TWINS +TWIRL +TWIRLED +TWIRLER +TWIRLING +TWIRLS +TWIST +TWISTED +TWISTER +TWISTERS +TWISTING +TWISTS +TWITCH +TWITCHED +TWITCHING +TWITTER +TWITTERED +TWITTERING +TWO +TWOFOLD +TWOMBLY +TWOS +TYBURN +TYING +TYLER +TYLERIZE +TYLERIZES +TYNDALL +TYPE +TYPED +TYPEOUT +TYPES +TYPESETTER +TYPEWRITER +TYPEWRITERS +TYPHOID +TYPHON +TYPICAL +TYPICALLY +TYPICALNESS +TYPIFIED +TYPIFIES +TYPIFY +TYPIFYING +TYPING +TYPIST +TYPISTS +TYPO +TYPOGRAPHIC +TYPOGRAPHICAL +TYPOGRAPHICALLY +TYPOGRAPHY +TYRANNICAL +TYRANNOSAURUS +TYRANNY +TYRANT +TYRANTS +TYSON +TZELTAL +UBIQUITOUS +UBIQUITOUSLY +UBIQUITY +UDALL +UGANDA +UGH +UGLIER +UGLIEST +UGLINESS +UGLY +UKRAINE +UKRAINIAN +UKRAINIANS +ULAN +ULCER +ULCERS +ULLMAN +ULSTER +ULTIMATE +ULTIMATELY +ULTRA +ULTRASONIC +ULTRIX +ULTRIX +ULYSSES +UMBRAGE +UMBRELLA +UMBRELLAS +UMPIRE +UMPIRES +UNABATED +UNABBREVIATED +UNABLE +UNACCEPTABILITY +UNACCEPTABLE +UNACCEPTABLY +UNACCOUNTABLE +UNACCUSTOMED +UNACHIEVABLE +UNACKNOWLEDGED +UNADULTERATED +UNAESTHETICALLY +UNAFFECTED +UNAFFECTEDLY +UNAFFECTEDNESS +UNAIDED +UNALIENABILITY +UNALIENABLE +UNALTERABLY +UNALTERED +UNAMBIGUOUS +UNAMBIGUOUSLY +UNAMBITIOUS +UNANALYZABLE +UNANIMITY +UNANIMOUS +UNANIMOUSLY +UNANSWERABLE +UNANSWERED +UNANTICIPATED +UNARMED +UNARY +UNASSAILABLE +UNASSIGNED +UNASSISTED +UNATTAINABILITY +UNATTAINABLE +UNATTENDED +UNATTRACTIVE +UNATTRACTIVELY +UNAUTHORIZED +UNAVAILABILITY +UNAVAILABLE +UNAVOIDABLE +UNAVOIDABLY +UNAWARE +UNAWARENESS +UNAWARES +UNBALANCED +UNBEARABLE +UNBECOMING +UNBELIEVABLE +UNBIASED +UNBIND +UNBLOCK +UNBLOCKED +UNBLOCKING +UNBLOCKS +UNBORN +UNBOUND +UNBOUNDED +UNBREAKABLE +UNBRIDLED +UNBROKEN +UNBUFFERED +UNCANCELLED +UNCANNY +UNCAPITALIZED +UNCAUGHT +UNCERTAIN +UNCERTAINLY +UNCERTAINTIES +UNCERTAINTY +UNCHANGEABLE +UNCHANGED +UNCHANGING +UNCLAIMED +UNCLASSIFIED +UNCLE +UNCLEAN +UNCLEANLY +UNCLEANNESS +UNCLEAR +UNCLEARED +UNCLES +UNCLOSED +UNCOMFORTABLE +UNCOMFORTABLY +UNCOMMITTED +UNCOMMON +UNCOMMONLY +UNCOMPROMISING +UNCOMPUTABLE +UNCONCERNED +UNCONCERNEDLY +UNCONDITIONAL +UNCONDITIONALLY +UNCONNECTED +UNCONSCIONABLE +UNCONSCIOUS +UNCONSCIOUSLY +UNCONSCIOUSNESS +UNCONSTITUTIONAL +UNCONSTRAINED +UNCONTROLLABILITY +UNCONTROLLABLE +UNCONTROLLABLY +UNCONTROLLED +UNCONVENTIONAL +UNCONVENTIONALLY +UNCONVINCED +UNCONVINCING +UNCOORDINATED +UNCORRECTABLE +UNCORRECTED +UNCOUNTABLE +UNCOUNTABLY +UNCOUTH +UNCOVER +UNCOVERED +UNCOVERING +UNCOVERS +UNDAMAGED +UNDAUNTED +UNDAUNTEDLY +UNDECIDABLE +UNDECIDED +UNDECLARED +UNDECOMPOSABLE +UNDEFINABILITY +UNDEFINED +UNDELETED +UNDENIABLE +UNDENIABLY +UNDER +UNDERBRUSH +UNDERDONE +UNDERESTIMATE +UNDERESTIMATED +UNDERESTIMATES +UNDERESTIMATING +UNDERESTIMATION +UNDERFLOW +UNDERFLOWED +UNDERFLOWING +UNDERFLOWS +UNDERFOOT +UNDERGO +UNDERGOES +UNDERGOING +UNDERGONE +UNDERGRADUATE +UNDERGRADUATES +UNDERGROUND +UNDERLIE +UNDERLIES +UNDERLINE +UNDERLINED +UNDERLINES +UNDERLING +UNDERLINGS +UNDERLINING +UNDERLININGS +UNDERLOADED +UNDERLYING +UNDERMINE +UNDERMINED +UNDERMINES +UNDERMINING +UNDERNEATH +UNDERPINNING +UNDERPINNINGS +UNDERPLAY +UNDERPLAYED +UNDERPLAYING +UNDERPLAYS +UNDERSCORE +UNDERSCORED +UNDERSCORES +UNDERSTAND +UNDERSTANDABILITY +UNDERSTANDABLE +UNDERSTANDABLY +UNDERSTANDING +UNDERSTANDINGLY +UNDERSTANDINGS +UNDERSTANDS +UNDERSTATED +UNDERSTOOD +UNDERTAKE +UNDERTAKEN +UNDERTAKER +UNDERTAKERS +UNDERTAKES +UNDERTAKING +UNDERTAKINGS +UNDERTOOK +UNDERWATER +UNDERWAY +UNDERWEAR +UNDERWENT +UNDERWORLD +UNDERWRITE +UNDERWRITER +UNDERWRITERS +UNDERWRITES +UNDERWRITING +UNDESIRABILITY +UNDESIRABLE +UNDETECTABLE +UNDETECTED +UNDETERMINED +UNDEVELOPED +UNDID +UNDIMINISHED +UNDIRECTED +UNDISCIPLINED +UNDISCOVERED +UNDISTURBED +UNDIVIDED +UNDO +UNDOCUMENTED +UNDOES +UNDOING +UNDOINGS +UNDONE +UNDOUBTEDLY +UNDRESS +UNDRESSED +UNDRESSES +UNDRESSING +UNDUE +UNDULY +UNEASILY +UNEASINESS +UNEASY +UNECONOMIC +UNECONOMICAL +UNEMBELLISHED +UNEMPLOYED +UNEMPLOYMENT +UNENCRYPTED +UNENDING +UNENLIGHTENING +UNEQUAL +UNEQUALED +UNEQUALLY +UNEQUIVOCAL +UNEQUIVOCALLY +UNESCO +UNESSENTIAL +UNEVALUATED +UNEVEN +UNEVENLY +UNEVENNESS +UNEVENTFUL +UNEXCUSED +UNEXPANDED +UNEXPECTED +UNEXPECTEDLY +UNEXPLAINED +UNEXPLORED +UNEXTENDED +UNFAIR +UNFAIRLY +UNFAIRNESS +UNFAITHFUL +UNFAITHFULLY +UNFAITHFULNESS +UNFAMILIAR +UNFAMILIARITY +UNFAMILIARLY +UNFAVORABLE +UNFETTERED +UNFINISHED +UNFIT +UNFITNESS +UNFLAGGING +UNFOLD +UNFOLDED +UNFOLDING +UNFOLDS +UNFORESEEN +UNFORGEABLE +UNFORGIVING +UNFORMATTED +UNFORTUNATE +UNFORTUNATELY +UNFORTUNATES +UNFOUNDED +UNFRIENDLINESS +UNFRIENDLY +UNFULFILLED +UNGRAMMATICAL +UNGRATEFUL +UNGRATEFULLY +UNGRATEFULNESS +UNGROUNDED +UNGUARDED +UNGUIDED +UNHAPPIER +UNHAPPIEST +UNHAPPILY +UNHAPPINESS +UNHAPPY +UNHARMED +UNHEALTHY +UNHEARD +UNHEEDED +UNIBUS +UNICORN +UNICORNS +UNICYCLE +UNIDENTIFIED +UNIDIRECTIONAL +UNIDIRECTIONALITY +UNIDIRECTIONALLY +UNIFICATION +UNIFICATIONS +UNIFIED +UNIFIER +UNIFIERS +UNIFIES +UNIFORM +UNIFORMED +UNIFORMITY +UNIFORMLY +UNIFORMS +UNIFY +UNIFYING +UNILLUMINATING +UNIMAGINABLE +UNIMPEDED +UNIMPLEMENTED +UNIMPORTANT +UNINDENTED +UNINITIALIZED +UNINSULATED +UNINTELLIGIBLE +UNINTENDED +UNINTENTIONAL +UNINTENTIONALLY +UNINTERESTING +UNINTERESTINGLY +UNINTERPRETED +UNINTERRUPTED +UNINTERRUPTEDLY +UNION +UNIONIZATION +UNIONIZE +UNIONIZED +UNIONIZER +UNIONIZERS +UNIONIZES +UNIONIZING +UNIONS +UNIPLUS +UNIPROCESSOR +UNIQUE +UNIQUELY +UNIQUENESS +UNIROYAL +UNISOFT +UNISON +UNIT +UNITARIAN +UNITARIANIZE +UNITARIANIZES +UNITARIANS +UNITE +UNITED +UNITES +UNITIES +UNITING +UNITS +UNITY +UNIVAC +UNIVALVE +UNIVALVES +UNIVERSAL +UNIVERSALITY +UNIVERSALLY +UNIVERSALS +UNIVERSE +UNIVERSES +UNIVERSITIES +UNIVERSITY +UNIX +UNIX +UNJUST +UNJUSTIFIABLE +UNJUSTIFIED +UNJUSTLY +UNKIND +UNKINDLY +UNKINDNESS +UNKNOWABLE +UNKNOWING +UNKNOWINGLY +UNKNOWN +UNKNOWNS +UNLABELLED +UNLAWFUL +UNLAWFULLY +UNLEASH +UNLEASHED +UNLEASHES +UNLEASHING +UNLESS +UNLIKE +UNLIKELY +UNLIKENESS +UNLIMITED +UNLINK +UNLINKED +UNLINKING +UNLINKS +UNLOAD +UNLOADED +UNLOADING +UNLOADS +UNLOCK +UNLOCKED +UNLOCKING +UNLOCKS +UNLUCKY +UNMANAGEABLE +UNMANAGEABLY +UNMANNED +UNMARKED +UNMARRIED +UNMASK +UNMASKED +UNMATCHED +UNMENTIONABLE +UNMERCIFUL +UNMERCIFULLY +UNMISTAKABLE +UNMISTAKABLY +UNMODIFIED +UNMOVED +UNNAMED +UNNATURAL +UNNATURALLY +UNNATURALNESS +UNNECESSARILY +UNNECESSARY +UNNEEDED +UNNERVE +UNNERVED +UNNERVES +UNNERVING +UNNOTICED +UNOBSERVABLE +UNOBSERVED +UNOBTAINABLE +UNOCCUPIED +UNOFFICIAL +UNOFFICIALLY +UNOPENED +UNORDERED +UNPACK +UNPACKED +UNPACKING +UNPACKS +UNPAID +UNPARALLELED +UNPARSED +UNPLANNED +UNPLEASANT +UNPLEASANTLY +UNPLEASANTNESS +UNPLUG +UNPOPULAR +UNPOPULARITY +UNPRECEDENTED +UNPREDICTABLE +UNPREDICTABLY +UNPRESCRIBED +UNPRESERVED +UNPRIMED +UNPROFITABLE +UNPROJECTED +UNPROTECTED +UNPROVABILITY +UNPROVABLE +UNPROVEN +UNPUBLISHED +UNQUALIFIED +UNQUALIFIEDLY +UNQUESTIONABLY +UNQUESTIONED +UNQUOTED +UNRAVEL +UNRAVELED +UNRAVELING +UNRAVELS +UNREACHABLE +UNREAL +UNREALISTIC +UNREALISTICALLY +UNREASONABLE +UNREASONABLENESS +UNREASONABLY +UNRECOGNIZABLE +UNRECOGNIZED +UNREGULATED +UNRELATED +UNRELIABILITY +UNRELIABLE +UNREPORTED +UNREPRESENTABLE +UNRESOLVED +UNRESPONSIVE +UNREST +UNRESTRAINED +UNRESTRICTED +UNRESTRICTEDLY +UNRESTRICTIVE +UNROLL +UNROLLED +UNROLLING +UNROLLS +UNRULY +UNSAFE +UNSAFELY +UNSANITARY +UNSATISFACTORY +UNSATISFIABILITY +UNSATISFIABLE +UNSATISFIED +UNSATISFYING +UNSCRUPULOUS +UNSEEDED +UNSEEN +UNSELECTED +UNSELFISH +UNSELFISHLY +UNSELFISHNESS +UNSENT +UNSETTLED +UNSETTLING +UNSHAKEN +UNSHARED +UNSIGNED +UNSKILLED +UNSLOTTED +UNSOLVABLE +UNSOLVED +UNSOPHISTICATED +UNSOUND +UNSPEAKABLE +UNSPECIFIED +UNSTABLE +UNSTEADINESS +UNSTEADY +UNSTRUCTURED +UNSUCCESSFUL +UNSUCCESSFULLY +UNSUITABLE +UNSUITED +UNSUPPORTED +UNSURE +UNSURPRISING +UNSURPRISINGLY +UNSYNCHRONIZED +UNTAGGED +UNTAPPED +UNTENABLE +UNTERMINATED +UNTESTED +UNTHINKABLE +UNTHINKING +UNTIDINESS +UNTIDY +UNTIE +UNTIED +UNTIES +UNTIL +UNTIMELY +UNTO +UNTOLD +UNTOUCHABLE +UNTOUCHABLES +UNTOUCHED +UNTOWARD +UNTRAINED +UNTRANSLATED +UNTREATED +UNTRIED +UNTRUE +UNTRUTHFUL +UNTRUTHFULNESS +UNTYING +UNUSABLE +UNUSED +UNUSUAL +UNUSUALLY +UNVARYING +UNVEIL +UNVEILED +UNVEILING +UNVEILS +UNWANTED +UNWELCOME +UNWHOLESOME +UNWIELDINESS +UNWIELDY +UNWILLING +UNWILLINGLY +UNWILLINGNESS +UNWIND +UNWINDER +UNWINDERS +UNWINDING +UNWINDS +UNWISE +UNWISELY +UNWISER +UNWISEST +UNWITTING +UNWITTINGLY +UNWORTHINESS +UNWORTHY +UNWOUND +UNWRAP +UNWRAPPED +UNWRAPPING +UNWRAPS +UNWRITTEN +UPBRAID +UPCOMING +UPDATE +UPDATED +UPDATER +UPDATES +UPDATING +UPGRADE +UPGRADED +UPGRADES +UPGRADING +UPHELD +UPHILL +UPHOLD +UPHOLDER +UPHOLDERS +UPHOLDING +UPHOLDS +UPHOLSTER +UPHOLSTERED +UPHOLSTERER +UPHOLSTERING +UPHOLSTERS +UPKEEP +UPLAND +UPLANDS +UPLIFT +UPLINK +UPLINKS +UPLOAD +UPON +UPPER +UPPERMOST +UPRIGHT +UPRIGHTLY +UPRIGHTNESS +UPRISING +UPRISINGS +UPROAR +UPROOT +UPROOTED +UPROOTING +UPROOTS +UPSET +UPSETS +UPSHOT +UPSHOTS +UPSIDE +UPSTAIRS +UPSTREAM +UPTON +UPTURN +UPTURNED +UPTURNING +UPTURNS +UPWARD +UPWARDS +URANIA +URANUS +URBAN +URBANA +URCHIN +URCHINS +URDU +URGE +URGED +URGENT +URGENTLY +URGES +URGING +URGINGS +URI +URINATE +URINATED +URINATES +URINATING +URINATION +URINE +URIS +URN +URNS +URQUHART +URSA +URSULA +URSULINE +URUGUAY +URUGUAYAN +URUGUAYANS +USABILITY +USABLE +USABLY +USAGE +USAGES +USE +USED +USEFUL +USEFULLY +USEFULNESS +USELESS +USELESSLY +USELESSNESS +USENET +USENIX +USER +USERS +USES +USHER +USHERED +USHERING +USHERS +USING +USUAL +USUALLY +USURP +USURPED +USURPER +UTAH +UTENSIL +UTENSILS +UTICA +UTILITIES +UTILITY +UTILIZATION +UTILIZATIONS +UTILIZE +UTILIZED +UTILIZES +UTILIZING +UTMOST +UTOPIA +UTOPIAN +UTOPIANIZE +UTOPIANIZES +UTOPIANS +UTRECHT +UTTER +UTTERANCE +UTTERANCES +UTTERED +UTTERING +UTTERLY +UTTERMOST +UTTERS +UZI +VACANCIES +VACANCY +VACANT +VACANTLY +VACATE +VACATED +VACATES +VACATING +VACATION +VACATIONED +VACATIONER +VACATIONERS +VACATIONING +VACATIONS +VACUO +VACUOUS +VACUOUSLY +VACUUM +VACUUMED +VACUUMING +VADUZ +VAGABOND +VAGABONDS +VAGARIES +VAGARY +VAGINA +VAGINAS +VAGRANT +VAGRANTLY +VAGUE +VAGUELY +VAGUENESS +VAGUER +VAGUEST +VAIL +VAIN +VAINLY +VALE +VALENCE +VALENCES +VALENTINE +VALENTINES +VALERIE +VALERY +VALES +VALET +VALETS +VALHALLA +VALIANT +VALIANTLY +VALID +VALIDATE +VALIDATED +VALIDATES +VALIDATING +VALIDATION +VALIDITY +VALIDLY +VALIDNESS +VALKYRIE +VALLETTA +VALLEY +VALLEYS +VALOIS +VALOR +VALPARAISO +VALUABLE +VALUABLES +VALUABLY +VALUATION +VALUATIONS +VALUE +VALUED +VALUER +VALUERS +VALUES +VALUING +VALVE +VALVES +VAMPIRE +VAN +VANCE +VANCEMENT +VANCOUVER +VANDALIZE +VANDALIZED +VANDALIZES +VANDALIZING +VANDENBERG +VANDERBILT +VANDERBURGH +VANDERPOEL +VANE +VANES +VANESSA +VANGUARD +VANILLA +VANISH +VANISHED +VANISHER +VANISHES +VANISHING +VANISHINGLY +VANITIES +VANITY +VANQUISH +VANQUISHED +VANQUISHES +VANQUISHING +VANS +VANTAGE +VAPOR +VAPORING +VAPORS +VARIABILITY +VARIABLE +VARIABLENESS +VARIABLES +VARIABLY +VARIAN +VARIANCE +VARIANCES +VARIANT +VARIANTLY +VARIANTS +VARIATION +VARIATIONS +VARIED +VARIES +VARIETIES +VARIETY +VARIOUS +VARIOUSLY +VARITYPE +VARITYPING +VARNISH +VARNISHES +VARY +VARYING +VARYINGS +VASE +VASES +VASQUEZ +VASSAL +VASSAR +VAST +VASTER +VASTEST +VASTLY +VASTNESS +VAT +VATICAN +VATICANIZATION +VATICANIZATIONS +VATICANIZE +VATICANIZES +VATS +VAUDEVILLE +VAUDOIS +VAUGHAN +VAUGHN +VAULT +VAULTED +VAULTER +VAULTING +VAULTS +VAUNT +VAUNTED +VAX +VAXES +VEAL +VECTOR +VECTORIZATION +VECTORIZING +VECTORS +VEDA +VEER +VEERED +VEERING +VEERS +VEGA +VEGANISM +VEGAS +VEGETABLE +VEGETABLES +VEGETARIAN +VEGETARIANS +VEGETATE +VEGETATED +VEGETATES +VEGETATING +VEGETATION +VEGETATIVE +VEHEMENCE +VEHEMENT +VEHEMENTLY +VEHICLE +VEHICLES +VEHICULAR +VEIL +VEILED +VEILING +VEILS +VEIN +VEINED +VEINING +VEINS +VELA +VELASQUEZ +VELLA +VELOCITIES +VELOCITY +VELVET +VENDOR +VENDORS +VENERABLE +VENERATION +VENETIAN +VENETO +VENEZUELA +VENEZUELAN +VENGEANCE +VENIAL +VENICE +VENISON +VENN +VENOM +VENOMOUS +VENOMOUSLY +VENT +VENTED +VENTILATE +VENTILATED +VENTILATES +VENTILATING +VENTILATION +VENTRICLE +VENTRICLES +VENTS +VENTURA +VENTURE +VENTURED +VENTURER +VENTURERS +VENTURES +VENTURING +VENTURINGS +VENUS +VENUSIAN +VENUSIANS +VERA +VERACITY +VERANDA +VERANDAS +VERB +VERBAL +VERBALIZE +VERBALIZED +VERBALIZES +VERBALIZING +VERBALLY +VERBOSE +VERBS +VERDE +VERDERER +VERDI +VERDICT +VERDURE +VERGE +VERGER +VERGES +VERGIL +VERIFIABILITY +VERIFIABLE +VERIFICATION +VERIFICATIONS +VERIFIED +VERIFIER +VERIFIERS +VERIFIES +VERIFY +VERIFYING +VERILY +VERITABLE +VERLAG +VERMIN +VERMONT +VERN +VERNA +VERNACULAR +VERNE +VERNON +VERONA +VERONICA +VERSA +VERSAILLES +VERSATEC +VERSATILE +VERSATILITY +VERSE +VERSED +VERSES +VERSING +VERSION +VERSIONS +VERSUS +VERTEBRATE +VERTEBRATES +VERTEX +VERTICAL +VERTICALLY +VERTICALNESS +VERTICES +VERY +VESSEL +VESSELS +VEST +VESTED +VESTIGE +VESTIGES +VESTIGIAL +VESTS +VESUVIUS +VETERAN +VETERANS +VETERINARIAN +VETERINARIANS +VETERINARY +VETO +VETOED +VETOER +VETOES +VEX +VEXATION +VEXED +VEXES +VEXING +VIA +VIABILITY +VIABLE +VIABLY +VIAL +VIALS +VIBRATE +VIBRATED +VIBRATING +VIBRATION +VIBRATIONS +VIBRATOR +VIC +VICE +VICEROY +VICES +VICHY +VICINITY +VICIOUS +VICIOUSLY +VICIOUSNESS +VICISSITUDE +VICISSITUDES +VICKERS +VICKSBURG +VICKY +VICTIM +VICTIMIZE +VICTIMIZED +VICTIMIZER +VICTIMIZERS +VICTIMIZES +VICTIMIZING +VICTIMS +VICTOR +VICTORIA +VICTORIAN +VICTORIANIZE +VICTORIANIZES +VICTORIANS +VICTORIES +VICTORIOUS +VICTORIOUSLY +VICTORS +VICTORY +VICTROLA +VICTUAL +VICTUALER +VICTUALS +VIDA +VIDAL +VIDEO +VIDEOTAPE +VIDEOTAPES +VIDEOTEX +VIE +VIED +VIENNA +VIENNESE +VIENTIANE +VIER +VIES +VIET +VIETNAM +VIETNAMESE +VIEW +VIEWABLE +VIEWED +VIEWER +VIEWERS +VIEWING +VIEWPOINT +VIEWPOINTS +VIEWS +VIGILANCE +VIGILANT +VIGILANTE +VIGILANTES +VIGILANTLY +VIGNETTE +VIGNETTES +VIGOR +VIGOROUS +VIGOROUSLY +VIKING +VIKINGS +VIKRAM +VILE +VILELY +VILENESS +VILIFICATION +VILIFICATIONS +VILIFIED +VILIFIES +VILIFY +VILIFYING +VILLA +VILLAGE +VILLAGER +VILLAGERS +VILLAGES +VILLAIN +VILLAINOUS +VILLAINOUSLY +VILLAINOUSNESS +VILLAINS +VILLAINY +VILLAS +VINCE +VINCENT +VINCI +VINDICATE +VINDICATED +VINDICATION +VINDICTIVE +VINDICTIVELY +VINDICTIVENESS +VINE +VINEGAR +VINES +VINEYARD +VINEYARDS +VINSON +VINTAGE +VIOLATE +VIOLATED +VIOLATES +VIOLATING +VIOLATION +VIOLATIONS +VIOLATOR +VIOLATORS +VIOLENCE +VIOLENT +VIOLENTLY +VIOLET +VIOLETS +VIOLIN +VIOLINIST +VIOLINISTS +VIOLINS +VIPER +VIPERS +VIRGIL +VIRGIN +VIRGINIA +VIRGINIAN +VIRGINIANS +VIRGINITY +VIRGINS +VIRGO +VIRTUAL +VIRTUALLY +VIRTUE +VIRTUES +VIRTUOSO +VIRTUOSOS +VIRTUOUS +VIRTUOUSLY +VIRULENT +VIRUS +VIRUSES +VISA +VISAGE +VISAS +VISCOUNT +VISCOUNTS +VISCOUS +VISHNU +VISIBILITY +VISIBLE +VISIBLY +VISIGOTH +VISIGOTHS +VISION +VISIONARY +VISIONS +VISIT +VISITATION +VISITATIONS +VISITED +VISITING +VISITOR +VISITORS +VISITS +VISOR +VISORS +VISTA +VISTAS +VISUAL +VISUALIZE +VISUALIZED +VISUALIZER +VISUALIZES +VISUALIZING +VISUALLY +VITA +VITAE +VITAL +VITALITY +VITALLY +VITALS +VITO +VITUS +VIVALDI +VIVIAN +VIVID +VIVIDLY +VIVIDNESS +VIZIER +VLADIMIR +VLADIVOSTOK +VOCABULARIES +VOCABULARY +VOCAL +VOCALLY +VOCALS +VOCATION +VOCATIONAL +VOCATIONALLY +VOCATIONS +VOGEL +VOGUE +VOICE +VOICED +VOICER +VOICERS +VOICES +VOICING +VOID +VOIDED +VOIDER +VOIDING +VOIDS +VOLATILE +VOLATILITIES +VOLATILITY +VOLCANIC +VOLCANO +VOLCANOS +VOLITION +VOLKSWAGEN +VOLKSWAGENS +VOLLEY +VOLLEYBALL +VOLLEYBALLS +VOLSTEAD +VOLT +VOLTA +VOLTAGE +VOLTAGES +VOLTAIRE +VOLTERRA +VOLTS +VOLUME +VOLUMES +VOLUNTARILY +VOLUNTARY +VOLUNTEER +VOLUNTEERED +VOLUNTEERING +VOLUNTEERS +VOLVO +VOMIT +VOMITED +VOMITING +VOMITS +VORTEX +VOSS +VOTE +VOTED +VOTER +VOTERS +VOTES +VOTING +VOTIVE +VOUCH +VOUCHER +VOUCHERS +VOUCHES +VOUCHING +VOUGHT +VOW +VOWED +VOWEL +VOWELS +VOWER +VOWING +VOWS +VOYAGE +VOYAGED +VOYAGER +VOYAGERS +VOYAGES +VOYAGING +VOYAGINGS +VREELAND +VULCAN +VULCANISM +VULGAR +VULGARLY +VULNERABILITIES +VULNERABILITY +VULNERABLE +VULTURE +VULTURES +WAALS +WABASH +WACKE +WACKY +WACO +WADE +WADED +WADER +WADES +WADING +WADSWORTH +WAFER +WAFERS +WAFFLE +WAFFLES +WAFT +WAG +WAGE +WAGED +WAGER +WAGERS +WAGES +WAGING +WAGNER +WAGNERIAN +WAGNERIZE +WAGNERIZES +WAGON +WAGONER +WAGONS +WAGS +WAHL +WAIL +WAILED +WAILING +WAILS +WAINWRIGHT +WAIST +WAISTCOAT +WAISTCOATS +WAISTS +WAIT +WAITE +WAITED +WAITER +WAITERS +WAITING +WAITRESS +WAITRESSES +WAITS +WAIVE +WAIVED +WAIVER +WAIVERABLE +WAIVES +WAIVING +WAKE +WAKED +WAKEFIELD +WAKEN +WAKENED +WAKENING +WAKES +WAKEUP +WAKING +WALBRIDGE +WALCOTT +WALDEN +WALDENSIAN +WALDO +WALDORF +WALDRON +WALES +WALFORD +WALGREEN +WALK +WALKED +WALKER +WALKERS +WALKING +WALKS +WALL +WALLACE +WALLED +WALLENSTEIN +WALLER +WALLET +WALLETS +WALLING +WALLIS +WALLOW +WALLOWED +WALLOWING +WALLOWS +WALLS +WALNUT +WALNUTS +WALPOLE +WALRUS +WALRUSES +WALSH +WALT +WALTER +WALTERS +WALTHAM +WALTON +WALTZ +WALTZED +WALTZES +WALTZING +WALWORTH +WAN +WAND +WANDER +WANDERED +WANDERER +WANDERERS +WANDERING +WANDERINGS +WANDERS +WANE +WANED +WANES +WANG +WANING +WANLY +WANSEE +WANSLEY +WANT +WANTED +WANTING +WANTON +WANTONLY +WANTONNESS +WANTS +WAPATO +WAPPINGER +WAR +WARBLE +WARBLED +WARBLER +WARBLES +WARBLING +WARBURTON +WARD +WARDEN +WARDENS +WARDER +WARDROBE +WARDROBES +WARDS +WARE +WAREHOUSE +WAREHOUSES +WAREHOUSING +WARES +WARFARE +WARFIELD +WARILY +WARINESS +WARING +WARLIKE +WARM +WARMED +WARMER +WARMERS +WARMEST +WARMING +WARMLY +WARMS +WARMTH +WARN +WARNED +WARNER +WARNING +WARNINGLY +WARNINGS +WARNOCK +WARNS +WARP +WARPED +WARPING +WARPS +WARRANT +WARRANTED +WARRANTIES +WARRANTING +WARRANTS +WARRANTY +WARRED +WARRING +WARRIOR +WARRIORS +WARS +WARSAW +WARSHIP +WARSHIPS +WART +WARTIME +WARTS +WARWICK +WARY +WAS +WASH +WASHBURN +WASHED +WASHER +WASHERS +WASHES +WASHING +WASHINGS +WASHINGTON +WASHOE +WASP +WASPS +WASSERMAN +WASTE +WASTED +WASTEFUL +WASTEFULLY +WASTEFULNESS +WASTES +WASTING +WATANABE +WATCH +WATCHED +WATCHER +WATCHERS +WATCHES +WATCHFUL +WATCHFULLY +WATCHFULNESS +WATCHING +WATCHINGS +WATCHMAN +WATCHWORD +WATCHWORDS +WATER +WATERBURY +WATERED +WATERFALL +WATERFALLS +WATERGATE +WATERHOUSE +WATERING +WATERINGS +WATERLOO +WATERMAN +WATERPROOF +WATERPROOFING +WATERS +WATERTOWN +WATERWAY +WATERWAYS +WATERY +WATKINS +WATSON +WATTENBERG +WATTERSON +WATTS +WAUKESHA +WAUNONA +WAUPACA +WAUPUN +WAUSAU +WAUWATOSA +WAVE +WAVED +WAVEFORM +WAVEFORMS +WAVEFRONT +WAVEFRONTS +WAVEGUIDES +WAVELAND +WAVELENGTH +WAVELENGTHS +WAVER +WAVERS +WAVES +WAVING +WAX +WAXED +WAXEN +WAXER +WAXERS +WAXES +WAXING +WAXY +WAY +WAYNE +WAYNESBORO +WAYS +WAYSIDE +WAYWARD +WEAK +WEAKEN +WEAKENED +WEAKENING +WEAKENS +WEAKER +WEAKEST +WEAKLY +WEAKNESS +WEAKNESSES +WEALTH +WEALTHIEST +WEALTHS +WEALTHY +WEAN +WEANED +WEANING +WEAPON +WEAPONS +WEAR +WEARABLE +WEARER +WEARIED +WEARIER +WEARIEST +WEARILY +WEARINESS +WEARING +WEARISOME +WEARISOMELY +WEARS +WEARY +WEARYING +WEASEL +WEASELS +WEATHER +WEATHERCOCK +WEATHERCOCKS +WEATHERED +WEATHERFORD +WEATHERING +WEATHERS +WEAVE +WEAVER +WEAVES +WEAVING +WEB +WEBB +WEBBER +WEBS +WEBSTER +WEBSTERVILLE +WEDDED +WEDDING +WEDDINGS +WEDGE +WEDGED +WEDGES +WEDGING +WEDLOCK +WEDNESDAY +WEDNESDAYS +WEDS +WEE +WEED +WEEDS +WEEK +WEEKEND +WEEKENDS +WEEKLY +WEEKS +WEEP +WEEPER +WEEPING +WEEPS +WEHR +WEI +WEIBULL +WEIDER +WEIDMAN +WEIERSTRASS +WEIGH +WEIGHED +WEIGHING +WEIGHINGS +WEIGHS +WEIGHT +WEIGHTED +WEIGHTING +WEIGHTS +WEIGHTY +WEINBERG +WEINER +WEINSTEIN +WEIRD +WEIRDLY +WEISENHEIMER +WEISS +WEISSMAN +WEISSMULLER +WELCH +WELCHER +WELCHES +WELCOME +WELCOMED +WELCOMES +WELCOMING +WELD +WELDED +WELDER +WELDING +WELDON +WELDS +WELDWOOD +WELFARE +WELL +WELLED +WELLER +WELLES +WELLESLEY +WELLING +WELLINGTON +WELLMAN +WELLS +WELLSVILLE +WELMERS +WELSH +WELTON +WENCH +WENCHES +WENDELL +WENDY +WENT +WENTWORTH +WEPT +WERE +WERNER +WERTHER +WESLEY +WESLEYAN +WESSON +WEST +WESTBOUND +WESTBROOK +WESTCHESTER +WESTERN +WESTERNER +WESTERNERS +WESTFIELD +WESTHAMPTON +WESTINGHOUSE +WESTMINSTER +WESTMORE +WESTON +WESTPHALIA +WESTPORT +WESTWARD +WESTWARDS +WESTWOOD +WET +WETLY +WETNESS +WETS +WETTED +WETTER +WETTEST +WETTING +WEYERHAUSER +WHACK +WHACKED +WHACKING +WHACKS +WHALE +WHALEN +WHALER +WHALES +WHALING +WHARF +WHARTON +WHARVES +WHAT +WHATEVER +WHATLEY +WHATSOEVER +WHEAT +WHEATEN +WHEATLAND +WHEATON +WHEATSTONE +WHEEL +WHEELED +WHEELER +WHEELERS +WHEELING +WHEELINGS +WHEELOCK +WHEELS +WHELAN +WHELLER +WHELP +WHEN +WHENCE +WHENEVER +WHERE +WHEREABOUTS +WHEREAS +WHEREBY +WHEREIN +WHEREUPON +WHEREVER +WHETHER +WHICH +WHICHEVER +WHILE +WHIM +WHIMPER +WHIMPERED +WHIMPERING +WHIMPERS +WHIMS +WHIMSICAL +WHIMSICALLY +WHIMSIES +WHIMSY +WHINE +WHINED +WHINES +WHINING +WHIP +WHIPPANY +WHIPPED +WHIPPER +WHIPPERS +WHIPPING +WHIPPINGS +WHIPPLE +WHIPS +WHIRL +WHIRLED +WHIRLING +WHIRLPOOL +WHIRLPOOLS +WHIRLS +WHIRLWIND +WHIRR +WHIRRING +WHISK +WHISKED +WHISKER +WHISKERS +WHISKEY +WHISKING +WHISKS +WHISPER +WHISPERED +WHISPERING +WHISPERINGS +WHISPERS +WHISTLE +WHISTLED +WHISTLER +WHISTLERS +WHISTLES +WHISTLING +WHIT +WHITAKER +WHITCOMB +WHITE +WHITEHALL +WHITEHORSE +WHITELEAF +WHITELEY +WHITELY +WHITEN +WHITENED +WHITENER +WHITENERS +WHITENESS +WHITENING +WHITENS +WHITER +WHITES +WHITESPACE +WHITEST +WHITEWASH +WHITEWASHED +WHITEWATER +WHITFIELD +WHITING +WHITLOCK +WHITMAN +WHITMANIZE +WHITMANIZES +WHITNEY +WHITTAKER +WHITTIER +WHITTLE +WHITTLED +WHITTLES +WHITTLING +WHIZ +WHIZZED +WHIZZES +WHIZZING +WHO +WHOEVER +WHOLE +WHOLEHEARTED +WHOLEHEARTEDLY +WHOLENESS +WHOLES +WHOLESALE +WHOLESALER +WHOLESALERS +WHOLESOME +WHOLESOMENESS +WHOLLY +WHOM +WHOMEVER +WHOOP +WHOOPED +WHOOPING +WHOOPS +WHORE +WHORES +WHORL +WHORLS +WHOSE +WHY +WICHITA +WICK +WICKED +WICKEDLY +WICKEDNESS +WICKER +WICKS +WIDE +WIDEBAND +WIDELY +WIDEN +WIDENED +WIDENER +WIDENING +WIDENS +WIDER +WIDESPREAD +WIDEST +WIDGET +WIDOW +WIDOWED +WIDOWER +WIDOWERS +WIDOWS +WIDTH +WIDTHS +WIELAND +WIELD +WIELDED +WIELDER +WIELDING +WIELDS +WIER +WIFE +WIFELY +WIG +WIGGINS +WIGHTMAN +WIGS +WIGWAM +WILBUR +WILCOX +WILD +WILDCAT +WILDCATS +WILDER +WILDERNESS +WILDEST +WILDLY +WILDNESS +WILE +WILES +WILEY +WILFRED +WILHELM +WILHELMINA +WILINESS +WILKES +WILKIE +WILKINS +WILKINSON +WILL +WILLA +WILLAMETTE +WILLARD +WILLCOX +WILLED +WILLEM +WILLFUL +WILLFULLY +WILLIAM +WILLIAMS +WILLIAMSBURG +WILLIAMSON +WILLIE +WILLIED +WILLIES +WILLING +WILLINGLY +WILLINGNESS +WILLIS +WILLISSON +WILLOUGHBY +WILLOW +WILLOWS +WILLS +WILLY +WILMA +WILMETTE +WILMINGTON +WILSHIRE +WILSON +WILSONIAN +WILT +WILTED +WILTING +WILTS +WILTSHIRE +WILY +WIN +WINCE +WINCED +WINCES +WINCHELL +WINCHESTER +WINCING +WIND +WINDED +WINDER +WINDERS +WINDING +WINDMILL +WINDMILLS +WINDOW +WINDOWS +WINDS +WINDSOR +WINDY +WINE +WINED +WINEHEAD +WINER +WINERS +WINES +WINFIELD +WING +WINGED +WINGING +WINGS +WINIFRED +WINING +WINK +WINKED +WINKER +WINKING +WINKS +WINNEBAGO +WINNER +WINNERS +WINNETKA +WINNIE +WINNING +WINNINGLY +WINNINGS +WINNIPEG +WINNIPESAUKEE +WINOGRAD +WINOOSKI +WINS +WINSBOROUGH +WINSETT +WINSLOW +WINSTON +WINTER +WINTERED +WINTERING +WINTERS +WINTHROP +WINTRY +WIPE +WIPED +WIPER +WIPERS +WIPES +WIPING +WIRE +WIRED +WIRELESS +WIRES +WIRETAP +WIRETAPPERS +WIRETAPPING +WIRETAPS +WIRINESS +WIRING +WIRY +WISCONSIN +WISDOM +WISDOMS +WISE +WISED +WISELY +WISENHEIMER +WISER +WISEST +WISH +WISHED +WISHER +WISHERS +WISHES +WISHFUL +WISHING +WISP +WISPS +WISTFUL +WISTFULLY +WISTFULNESS +WIT +WITCH +WITCHCRAFT +WITCHES +WITCHING +WITH +WITHAL +WITHDRAW +WITHDRAWAL +WITHDRAWALS +WITHDRAWING +WITHDRAWN +WITHDRAWS +WITHDREW +WITHER +WITHERS +WITHERSPOON +WITHHELD +WITHHOLD +WITHHOLDER +WITHHOLDERS +WITHHOLDING +WITHHOLDINGS +WITHHOLDS +WITHIN +WITHOUT +WITHSTAND +WITHSTANDING +WITHSTANDS +WITHSTOOD +WITNESS +WITNESSED +WITNESSES +WITNESSING +WITS +WITT +WITTGENSTEIN +WITTY +WIVES +WIZARD +WIZARDS +WOE +WOEFUL +WOEFULLY +WOKE +WOLCOTT +WOLF +WOLFE +WOLFF +WOLFGANG +WOLVERTON +WOLVES +WOMAN +WOMANHOOD +WOMANLY +WOMB +WOMBS +WOMEN +WON +WONDER +WONDERED +WONDERFUL +WONDERFULLY +WONDERFULNESS +WONDERING +WONDERINGLY +WONDERMENT +WONDERS +WONDROUS +WONDROUSLY +WONG +WONT +WONTED +WOO +WOOD +WOODARD +WOODBERRY +WOODBURY +WOODCHUCK +WOODCHUCKS +WOODCOCK +WOODCOCKS +WOODED +WOODEN +WOODENLY +WOODENNESS +WOODLAND +WOODLAWN +WOODMAN +WOODPECKER +WOODPECKERS +WOODROW +WOODS +WOODSTOCK +WOODWARD +WOODWARDS +WOODWORK +WOODWORKING +WOODY +WOOED +WOOER +WOOF +WOOFED +WOOFER +WOOFERS +WOOFING +WOOFS +WOOING +WOOL +WOOLEN +WOOLLY +WOOLS +WOOLWORTH +WOONSOCKET +WOOS +WOOSTER +WORCESTER +WORCESTERSHIRE +WORD +WORDED +WORDILY +WORDINESS +WORDING +WORDS +WORDSWORTH +WORDY +WORE +WORK +WORKABLE +WORKABLY +WORKBENCH +WORKBENCHES +WORKBOOK +WORKBOOKS +WORKED +WORKER +WORKERS +WORKHORSE +WORKHORSES +WORKING +WORKINGMAN +WORKINGS +WORKLOAD +WORKMAN +WORKMANSHIP +WORKMEN +WORKS +WORKSHOP +WORKSHOPS +WORKSPACE +WORKSTATION +WORKSTATIONS +WORLD +WORLDLINESS +WORLDLY +WORLDS +WORLDWIDE +WORM +WORMED +WORMING +WORMS +WORN +WORRIED +WORRIER +WORRIERS +WORRIES +WORRISOME +WORRY +WORRYING +WORRYINGLY +WORSE +WORSHIP +WORSHIPED +WORSHIPER +WORSHIPFUL +WORSHIPING +WORSHIPS +WORST +WORSTED +WORTH +WORTHIEST +WORTHINESS +WORTHINGTON +WORTHLESS +WORTHLESSNESS +WORTHS +WORTHWHILE +WORTHWHILENESS +WORTHY +WOTAN +WOULD +WOUND +WOUNDED +WOUNDING +WOUNDS +WOVE +WOVEN +WRANGLE +WRANGLED +WRANGLER +WRAP +WRAPAROUND +WRAPPED +WRAPPER +WRAPPERS +WRAPPING +WRAPPINGS +WRAPS +WRATH +WREAK +WREAKS +WREATH +WREATHED +WREATHES +WRECK +WRECKAGE +WRECKED +WRECKER +WRECKERS +WRECKING +WRECKS +WREN +WRENCH +WRENCHED +WRENCHES +WRENCHING +WRENS +WREST +WRESTLE +WRESTLER +WRESTLES +WRESTLING +WRESTLINGS +WRETCH +WRETCHED +WRETCHEDNESS +WRETCHES +WRIGGLE +WRIGGLED +WRIGGLER +WRIGGLES +WRIGGLING +WRIGLEY +WRING +WRINGER +WRINGS +WRINKLE +WRINKLED +WRINKLES +WRIST +WRISTS +WRISTWATCH +WRISTWATCHES +WRIT +WRITABLE +WRITE +WRITER +WRITERS +WRITES +WRITHE +WRITHED +WRITHES +WRITHING +WRITING +WRITINGS +WRITS +WRITTEN +WRONG +WRONGED +WRONGING +WRONGLY +WRONGS +WRONSKIAN +WROTE +WROUGHT +WRUNG +WUHAN +WYANDOTTE +WYATT +WYETH +WYLIE +WYMAN +WYNER +WYNN +WYOMING +XANTHUS +XAVIER +XEBEC +XENAKIS +XENIA +XENIX +XEROX +XEROXED +XEROXES +XEROXING +XERXES +XHOSA +YAGI +YAKIMA +YALE +YALIES +YALTA +YAMAHA +YANK +YANKED +YANKEE +YANKEES +YANKING +YANKS +YANKTON +YAOUNDE +YAQUI +YARD +YARDS +YARDSTICK +YARDSTICKS +YARMOUTH +YARN +YARNS +YATES +YAUNDE +YAWN +YAWNER +YAWNING +YEA +YEAGER +YEAR +YEARLY +YEARN +YEARNED +YEARNING +YEARNINGS +YEARS +YEAS +YEAST +YEASTS +YEATS +YELL +YELLED +YELLER +YELLING +YELLOW +YELLOWED +YELLOWER +YELLOWEST +YELLOWING +YELLOWISH +YELLOWKNIFE +YELLOWNESS +YELLOWS +YELLOWSTONE +YELP +YELPED +YELPING +YELPS +YEMEN +YENTL +YEOMAN +YEOMEN +YERKES +YES +YESTERDAY +YESTERDAYS +YET +YIDDISH +YIELD +YIELDED +YIELDING +YIELDS +YODER +YOKE +YOKES +YOKNAPATAWPHA +YOKOHAMA +YOKUTS +YON +YONDER +YONKERS +YORICK +YORK +YORKER +YORKERS +YORKSHIRE +YORKTOWN +YOSEMITE +YOST +YOU +YOUNG +YOUNGER +YOUNGEST +YOUNGLY +YOUNGSTER +YOUNGSTERS +YOUNGSTOWN +YOUR +YOURS +YOURSELF +YOURSELVES +YOUTH +YOUTHES +YOUTHFUL +YOUTHFULLY +YOUTHFULNESS +YPSILANTI +YUBA +YUCATAN +YUGOSLAV +YUGOSLAVIA +YUGOSLAVIAN +YUGOSLAVIANS +YUH +YUKI +YUKON +YURI +YVES +YVETTE +ZACHARY +ZAGREB +ZAIRE +ZAMBIA +ZAN +ZANZIBAR +ZEAL +ZEALAND +ZEALOUS +ZEALOUSLY +ZEALOUSNESS +ZEBRA +ZEBRAS +ZEFFIRELLI +ZEISS +ZELLERBACH +ZEN +ZENITH +ZENNIST +ZERO +ZEROED +ZEROES +ZEROING +ZEROS +ZEROTH +ZEST +ZEUS +ZIEGFELD +ZIEGFELDS +ZIEGLER +ZIGGY +ZIGZAG +ZILLIONS +ZIMMERMAN +ZINC +ZION +ZIONISM +ZIONIST +ZIONISTS +ZIONS +ZODIAC +ZOE +ZOMBA +ZONAL +ZONALLY +ZONE +ZONED +ZONES +ZONING +ZOO +ZOOLOGICAL +ZOOLOGICALLY +ZOOM +ZOOMS +ZOOS +ZORN +ZOROASTER +ZOROASTRIAN +ZULU +ZULUS +ZURICH diff --git a/python-mega-algo/strings/frequency_finder.py b/python-mega-algo/strings/frequency_finder.py new file mode 100644 index 00000000..48760a9d --- /dev/null +++ b/python-mega-algo/strings/frequency_finder.py @@ -0,0 +1,120 @@ +# Frequency Finder + +# frequency taken from http://en.wikipedia.org/wiki/Letter_frequency +englishLetterFreq = { + "E": 12.70, + "T": 9.06, + "A": 8.17, + "O": 7.51, + "I": 6.97, + "N": 6.75, + "S": 6.33, + "H": 6.09, + "R": 5.99, + "D": 4.25, + "L": 4.03, + "C": 2.78, + "U": 2.76, + "M": 2.41, + "W": 2.36, + "F": 2.23, + "G": 2.02, + "Y": 1.97, + "P": 1.93, + "B": 1.29, + "V": 0.98, + "K": 0.77, + "J": 0.15, + "X": 0.15, + "Q": 0.10, + "Z": 0.07, +} +ETAOIN = "ETAOINSHRDLCUMWFGYPBVKJXQZ" +LETTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + + +def getLetterCount(message): + letterCount = { + "A": 0, + "B": 0, + "C": 0, + "D": 0, + "E": 0, + "F": 0, + "G": 0, + "H": 0, + "I": 0, + "J": 0, + "K": 0, + "L": 0, + "M": 0, + "N": 0, + "O": 0, + "P": 0, + "Q": 0, + "R": 0, + "S": 0, + "T": 0, + "U": 0, + "V": 0, + "W": 0, + "X": 0, + "Y": 0, + "Z": 0, + } + for letter in message.upper(): + if letter in LETTERS: + letterCount[letter] += 1 + + return letterCount + + +def getItemAtIndexZero(x): + return x[0] + + +def getFrequencyOrder(message): + letterToFreq = getLetterCount(message) + freqToLetter = {} + for letter in LETTERS: + if letterToFreq[letter] not in freqToLetter: + freqToLetter[letterToFreq[letter]] = [letter] + else: + freqToLetter[letterToFreq[letter]].append(letter) + + for freq in freqToLetter: + freqToLetter[freq].sort(key=ETAOIN.find, reverse=True) + freqToLetter[freq] = "".join(freqToLetter[freq]) + + freqPairs = list(freqToLetter.items()) + freqPairs.sort(key=getItemAtIndexZero, reverse=True) + + freqOrder = [] + for freqPair in freqPairs: + freqOrder.append(freqPair[1]) + + return "".join(freqOrder) + + +def englishFreqMatchScore(message): + """ + >>> englishFreqMatchScore('Hello World') + 1 + """ + freqOrder = getFrequencyOrder(message) + matchScore = 0 + for commonLetter in ETAOIN[:6]: + if commonLetter in freqOrder[:6]: + matchScore += 1 + + for uncommonLetter in ETAOIN[-6:]: + if uncommonLetter in freqOrder[-6:]: + matchScore += 1 + + return matchScore + + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/strings/is_palindrome.py b/python-mega-algo/strings/is_palindrome.py new file mode 100644 index 00000000..4776a5fc --- /dev/null +++ b/python-mega-algo/strings/is_palindrome.py @@ -0,0 +1,28 @@ +def is_palindrome(s: str) -> bool: + """ + Determine whether the string is palindrome + :param s: + :return: Boolean + >>> is_palindrome("a man a plan a canal panama".replace(" ", "")) + True + >>> is_palindrome("Hello") + False + >>> is_palindrome("Able was I ere I saw Elba") + True + >>> is_palindrome("racecar") + True + >>> is_palindrome("Mr. Owl ate my metal worm?") + True + """ + # Since Punctuation, capitalization, and spaces are usually ignored while checking + # Palindrome, we first remove them from our string. + s = "".join([character for character in s.lower() if character.isalnum()]) + return s == s[::-1] + + +if __name__ == "__main__": + s = input("Enter string to determine whether its palindrome or not: ").strip() + if is_palindrome(s): + print("Given string is palindrome") + else: + print("Given string is not palindrome") diff --git a/python-mega-algo/strings/jaro_winkler.py b/python-mega-algo/strings/jaro_winkler.py new file mode 100644 index 00000000..f4a8fbad --- /dev/null +++ b/python-mega-algo/strings/jaro_winkler.py @@ -0,0 +1,78 @@ +"""https://en.wikipedia.org/wiki/Jaro%E2%80%93Winkler_distance""" + + +def jaro_winkler(str1: str, str2: str) -> float: + """ + Jaro–Winkler distance is a string metric measuring an edit distance between two + sequences. + Output value is between 0.0 and 1.0. + + >>> jaro_winkler("martha", "marhta") + 0.9611111111111111 + >>> jaro_winkler("CRATE", "TRACE") + 0.7333333333333334 + >>> jaro_winkler("test", "dbdbdbdb") + 0.0 + >>> jaro_winkler("test", "test") + 1.0 + >>> jaro_winkler("hello world", "HeLLo W0rlD") + 0.6363636363636364 + >>> jaro_winkler("test", "") + 0.0 + >>> jaro_winkler("hello", "world") + 0.4666666666666666 + >>> jaro_winkler("hell**o", "*world") + 0.4365079365079365 + """ + + def get_matched_characters(_str1: str, _str2: str) -> str: + matched = [] + limit = min(len(_str1), len(_str2)) // 2 + for i, l in enumerate(_str1): + left = int(max(0, i - limit)) + right = int(min(i + limit + 1, len(_str2))) + if l in _str2[left:right]: + matched.append(l) + _str2 = f"{_str2[0:_str2.index(l)]} {_str2[_str2.index(l) + 1:]}" + + return "".join(matched) + + # matching characters + matching_1 = get_matched_characters(str1, str2) + matching_2 = get_matched_characters(str2, str1) + match_count = len(matching_1) + + # transposition + transpositions = ( + len([(c1, c2) for c1, c2 in zip(matching_1, matching_2) if c1 != c2]) // 2 + ) + + if not match_count: + jaro = 0.0 + else: + jaro = ( + 1 + / 3 + * ( + match_count / len(str1) + + match_count / len(str2) + + (match_count - transpositions) / match_count + ) + ) + + # common prefix up to 4 characters + prefix_len = 0 + for c1, c2 in zip(str1[:4], str2[:4]): + if c1 == c2: + prefix_len += 1 + else: + break + + return jaro + 0.1 * prefix_len * (1 - jaro) + + +if __name__ == "__main__": + import doctest + + doctest.testmod() + print(jaro_winkler("hello", "world")) diff --git a/python-mega-algo/strings/knuth_morris_pratt.py b/python-mega-algo/strings/knuth_morris_pratt.py new file mode 100644 index 00000000..a205ce37 --- /dev/null +++ b/python-mega-algo/strings/knuth_morris_pratt.py @@ -0,0 +1,83 @@ +from typing import List + + +def kmp(pattern: str, text: str) -> bool: + """ + The Knuth-Morris-Pratt Algorithm for finding a pattern within a piece of text + with complexity O(n + m) + + 1) Preprocess pattern to identify any suffixes that are identical to prefixes + + This tells us where to continue from if we get a mismatch between a character + in our pattern and the text. + + 2) Step through the text one character at a time and compare it to a character in + the pattern updating our location within the pattern if necessary + + """ + + # 1) Construct the failure array + failure = get_failure_array(pattern) + + # 2) Step through text searching for pattern + i, j = 0, 0 # index into text, pattern + while i < len(text): + if pattern[j] == text[i]: + if j == (len(pattern) - 1): + return True + j += 1 + + # if this is a prefix in our pattern + # just go back far enough to continue + elif j > 0: + j = failure[j - 1] + continue + i += 1 + return False + + +def get_failure_array(pattern: str) -> List[int]: + """ + Calculates the new index we should go to if we fail a comparison + :param pattern: + :return: + """ + failure = [0] + i = 0 + j = 1 + while j < len(pattern): + if pattern[i] == pattern[j]: + i += 1 + elif i > 0: + i = failure[i - 1] + continue + j += 1 + failure.append(i) + return failure + + +if __name__ == "__main__": + # Test 1) + pattern = "abc1abc12" + text1 = "alskfjaldsabc1abc1abc12k23adsfabcabc" + text2 = "alskfjaldsk23adsfabcabc" + assert kmp(pattern, text1) and not kmp(pattern, text2) + + # Test 2) + pattern = "ABABX" + text = "ABABZABABYABABX" + assert kmp(pattern, text) + + # Test 3) + pattern = "AAAB" + text = "ABAAAAAB" + assert kmp(pattern, text) + + # Test 4) + pattern = "abcdabcy" + text = "abcxabcdabxabcdabcdabcy" + assert kmp(pattern, text) + + # Test 5) + pattern = "aabaabaaa" + assert get_failure_array(pattern) == [0, 1, 0, 1, 2, 3, 4, 5, 2] diff --git a/python-mega-algo/strings/levenshtein_distance.py b/python-mega-algo/strings/levenshtein_distance.py new file mode 100644 index 00000000..540a21c9 --- /dev/null +++ b/python-mega-algo/strings/levenshtein_distance.py @@ -0,0 +1,72 @@ +""" +This is a Python implementation of the levenshtein distance. +Levenshtein distance is a string metric for measuring the +difference between two sequences. + +For doctests run following command: +python -m doctest -v levenshtein-distance.py +or +python3 -m doctest -v levenshtein-distance.py + +For manual testing run: +python levenshtein-distance.py +""" + + +def levenshtein_distance(first_word: str, second_word: str) -> int: + """Implementation of the levenshtein distance in Python. + :param first_word: the first word to measure the difference. + :param second_word: the second word to measure the difference. + :return: the levenshtein distance between the two words. + Examples: + >>> levenshtein_distance("planet", "planetary") + 3 + >>> levenshtein_distance("", "test") + 4 + >>> levenshtein_distance("book", "back") + 2 + >>> levenshtein_distance("book", "book") + 0 + >>> levenshtein_distance("test", "") + 4 + >>> levenshtein_distance("", "") + 0 + >>> levenshtein_distance("orchestration", "container") + 10 + """ + # The longer word should come first + if len(first_word) < len(second_word): + return levenshtein_distance(second_word, first_word) + + if len(second_word) == 0: + return len(first_word) + + previous_row = range(len(second_word) + 1) + + for i, c1 in enumerate(first_word): + + current_row = [i + 1] + + for j, c2 in enumerate(second_word): + + # Calculate insertions, deletions and substitutions + insertions = previous_row[j + 1] + 1 + deletions = current_row[j] + 1 + substitutions = previous_row[j] + (c1 != c2) + + # Get the minimum to append to the current row + current_row.append(min(insertions, deletions, substitutions)) + + # Store the previous row + previous_row = current_row + + # Returns the last element (distance) + return previous_row[-1] + + +if __name__ == "__main__": + first_word = input("Enter the first word:\n").strip() + second_word = input("Enter the second word:\n").strip() + + result = levenshtein_distance(first_word, second_word) + print(f"Levenshtein distance between {first_word} and {second_word} is {result}") diff --git a/python-mega-algo/strings/lower.py b/python-mega-algo/strings/lower.py new file mode 100644 index 00000000..9ae41912 --- /dev/null +++ b/python-mega-algo/strings/lower.py @@ -0,0 +1,26 @@ +def lower(word: str) -> str: + """ + Will convert the entire string to lowercase letters + + >>> lower("wow") + 'wow' + >>> lower("HellZo") + 'hellzo' + >>> lower("WHAT") + 'what' + >>> lower("wh[]32") + 'wh[]32' + >>> lower("whAT") + 'what' + """ + + # converting to ascii value int value and checking to see if char is a capital + # letter if it is a capital letter it is getting shift by 32 which makes it a lower + # case letter + return "".join(chr(ord(char) + 32) if "A" <= char <= "Z" else char for char in word) + + +if __name__ == "__main__": + from doctest import testmod + + testmod() diff --git a/python-mega-algo/strings/manacher.py b/python-mega-algo/strings/manacher.py new file mode 100644 index 00000000..bdb646d6 --- /dev/null +++ b/python-mega-algo/strings/manacher.py @@ -0,0 +1,107 @@ +def palindromic_string(input_string: str) -> str: + """ + >>> palindromic_string('abbbaba') + 'abbba' + >>> palindromic_string('ababa') + 'ababa' + + Manacher’s algorithm which finds Longest palindromic Substring in linear time. + + 1. first this convert input_string("xyx") into new_string("x|y|x") where odd + positions are actual input characters. + 2. for each character in new_string it find corresponding length and store the + length and l,r to store previously calculated info.(please look the explanation + for details) + + 3. return corresponding output_string by removing all "|" + """ + max_length = 0 + + # if input_string is "aba" than new_input_string become "a|b|a" + new_input_string = "" + output_string = "" + + # append each character + "|" in new_string for range(0, length-1) + for i in input_string[: len(input_string) - 1]: + new_input_string += i + "|" + # append last character + new_input_string += input_string[-1] + + # we will store the starting and ending of previous furthest ending palindromic + # substring + l, r = 0, 0 + + # length[i] shows the length of palindromic substring with center i + length = [1 for i in range(len(new_input_string))] + + # for each character in new_string find corresponding palindromic string + for i in range(len(new_input_string)): + k = 1 if i > r else min(length[l + r - i] // 2, r - i + 1) + while ( + i - k >= 0 + and i + k < len(new_input_string) + and new_input_string[k + i] == new_input_string[i - k] + ): + k += 1 + + length[i] = 2 * k - 1 + + # does this string is ending after the previously explored end (that is r) ? + # if yes the update the new r to the last index of this + if i + k - 1 > r: + l = i - k + 1 # noqa: E741 + r = i + k - 1 + + # update max_length and start position + if max_length < length[i]: + max_length = length[i] + start = i + + # create that string + s = new_input_string[start - max_length // 2 : start + max_length // 2 + 1] + for i in s: + if i != "|": + output_string += i + + return output_string + + +if __name__ == "__main__": + import doctest + + doctest.testmod() + +""" +...a0...a1...a2.....a3......a4...a5...a6.... + +consider the string for which we are calculating the longest palindromic substring is +shown above where ... are some characters in between and right now we are calculating +the length of palindromic substring with center at a5 with following conditions : +i) we have stored the length of palindromic substring which has center at a3 (starts at + l ends at r) and it is the furthest ending till now, and it has ending after a6 +ii) a2 and a4 are equally distant from a3 so char(a2) == char(a4) +iii) a0 and a6 are equally distant from a3 so char(a0) == char(a6) +iv) a1 is corresponding equal character of a5 in palindrome with center a3 (remember + that in below derivation of a4==a6) + +now for a5 we will calculate the length of palindromic substring with center as a5 but +can we use previously calculated information in some way? +Yes, look the above string we know that a5 is inside the palindrome with center a3 and +previously we have have calculated that +a0==a2 (palindrome of center a1) +a2==a4 (palindrome of center a3) +a0==a6 (palindrome of center a3) +so a4==a6 + +so we can say that palindrome at center a5 is at least as long as palindrome at center +a1 but this only holds if a0 and a6 are inside the limits of palindrome centered at a3 +so finally .. + +len_of_palindrome__at(a5) = min(len_of_palindrome_at(a1), r-a5) +where a3 lies from l to r and we have to keep updating that + +and if the a5 lies outside of l,r boundary we calculate length of palindrome with +bruteforce and update l,r. + +it gives the linear time complexity just like z-function +""" diff --git a/python-mega-algo/strings/min_cost_string_conversion.py b/python-mega-algo/strings/min_cost_string_conversion.py new file mode 100644 index 00000000..e990aaa2 --- /dev/null +++ b/python-mega-algo/strings/min_cost_string_conversion.py @@ -0,0 +1,131 @@ +from typing import List, Tuple + +""" +Algorithm for calculating the most cost-efficient sequence for converting one string +into another. +The only allowed operations are +--- Cost to copy a character is copy_cost +--- Cost to replace a character is replace_cost +--- Cost to delete a character is delete_cost +--- Cost to insert a character is insert_cost +""" + + +def compute_transform_tables( + source_string: str, + destination_string: str, + copy_cost: int, + replace_cost: int, + delete_cost: int, + insert_cost: int, +) -> Tuple[List[int], List[str]]: + source_seq = list(source_string) + destination_seq = list(destination_string) + len_source_seq = len(source_seq) + len_destination_seq = len(destination_seq) + + costs = [ + [0 for _ in range(len_destination_seq + 1)] for _ in range(len_source_seq + 1) + ] + ops = [ + [0 for _ in range(len_destination_seq + 1)] for _ in range(len_source_seq + 1) + ] + + for i in range(1, len_source_seq + 1): + costs[i][0] = i * delete_cost + ops[i][0] = "D%c" % source_seq[i - 1] + + for i in range(1, len_destination_seq + 1): + costs[0][i] = i * insert_cost + ops[0][i] = "I%c" % destination_seq[i - 1] + + for i in range(1, len_source_seq + 1): + for j in range(1, len_destination_seq + 1): + if source_seq[i - 1] == destination_seq[j - 1]: + costs[i][j] = costs[i - 1][j - 1] + copy_cost + ops[i][j] = "C%c" % source_seq[i - 1] + else: + costs[i][j] = costs[i - 1][j - 1] + replace_cost + ops[i][j] = "R%c" % source_seq[i - 1] + str(destination_seq[j - 1]) + + if costs[i - 1][j] + delete_cost < costs[i][j]: + costs[i][j] = costs[i - 1][j] + delete_cost + ops[i][j] = "D%c" % source_seq[i - 1] + + if costs[i][j - 1] + insert_cost < costs[i][j]: + costs[i][j] = costs[i][j - 1] + insert_cost + ops[i][j] = "I%c" % destination_seq[j - 1] + + return costs, ops + + +def assemble_transformation(ops: List[str], i: int, j: int) -> List[str]: + if i == 0 and j == 0: + return [] + else: + if ops[i][j][0] == "C" or ops[i][j][0] == "R": + seq = assemble_transformation(ops, i - 1, j - 1) + seq.append(ops[i][j]) + return seq + elif ops[i][j][0] == "D": + seq = assemble_transformation(ops, i - 1, j) + seq.append(ops[i][j]) + return seq + else: + seq = assemble_transformation(ops, i, j - 1) + seq.append(ops[i][j]) + return seq + + +if __name__ == "__main__": + _, operations = compute_transform_tables("Python", "Algorithms", -1, 1, 2, 2) + + m = len(operations) + n = len(operations[0]) + sequence = assemble_transformation(operations, m - 1, n - 1) + + string = list("Python") + i = 0 + cost = 0 + + with open("min_cost.txt", "w") as file: + for op in sequence: + print("".join(string)) + + if op[0] == "C": + file.write("%-16s" % "Copy %c" % op[1]) + file.write("\t\t\t" + "".join(string)) + file.write("\r\n") + + cost -= 1 + elif op[0] == "R": + string[i] = op[2] + + file.write("%-16s" % ("Replace %c" % op[1] + " with " + str(op[2]))) + file.write("\t\t" + "".join(string)) + file.write("\r\n") + + cost += 1 + elif op[0] == "D": + string.pop(i) + + file.write("%-16s" % "Delete %c" % op[1]) + file.write("\t\t\t" + "".join(string)) + file.write("\r\n") + + cost += 2 + else: + string.insert(i, op[1]) + + file.write("%-16s" % "Insert %c" % op[1]) + file.write("\t\t\t" + "".join(string)) + file.write("\r\n") + + cost += 2 + + i += 1 + + print("".join(string)) + print("Cost: ", cost) + + file.write("\r\nMinimum cost: " + str(cost)) diff --git a/python-mega-algo/strings/naive_string_search.py b/python-mega-algo/strings/naive_string_search.py new file mode 100644 index 00000000..f2895026 --- /dev/null +++ b/python-mega-algo/strings/naive_string_search.py @@ -0,0 +1,42 @@ +""" +https://en.wikipedia.org/wiki/String-searching_algorithm#Na%C3%AFve_string_search + +this algorithm tries to find the pattern from every position of +the mainString if pattern is found from position i it add it to +the answer and does the same for position i+1 + +Complexity : O(n*m) + n=length of main string + m=length of pattern string +""" + + +def naive_pattern_search(s: str, pattern: str) -> list: + """ + >>> naive_pattern_search("ABAAABCDBBABCDDEBCABC", "ABC") + [4, 10, 18] + >>> naive_pattern_search("ABC", "ABAAABCDBBABCDDEBCABC") + [] + >>> naive_pattern_search("", "ABC") + [] + >>> naive_pattern_search("TEST", "TEST") + [0] + >>> naive_pattern_search("ABCDEGFTEST", "TEST") + [7] + """ + pat_len = len(pattern) + position = [] + for i in range(len(s) - pat_len + 1): + match_found = True + for j in range(pat_len): + if s[i + j] != pattern[j]: + match_found = False + break + if match_found: + position.append(i) + return position + + +if __name__ == "__main__": + assert naive_pattern_search("ABCDEFG", "DE") == [3] + print(f"{naive_pattern_search('ABAAABCDBBABCDDEBCABC', 'ABC') = }") diff --git a/python-mega-algo/strings/palindrome.py b/python-mega-algo/strings/palindrome.py new file mode 100644 index 00000000..dd1fe316 --- /dev/null +++ b/python-mega-algo/strings/palindrome.py @@ -0,0 +1,66 @@ +# Algorithms to determine if a string is palindrome + +test_data = { + "MALAYALAM": True, + "String": False, + "rotor": True, + "level": True, + "A": True, + "BB": True, + "ABC": False, + "amanaplanacanalpanama": True, # "a man a plan a canal panama" +} +# Ensure our test data is valid +assert all((key == key[::-1]) is value for key, value in test_data.items()) + + +def is_palindrome(s: str) -> bool: + """ + Return True if s is a palindrome otherwise return False. + + >>> all(is_palindrome(key) is value for key, value in test_data.items()) + True + """ + + start_i = 0 + end_i = len(s) - 1 + while start_i < end_i: + if s[start_i] == s[end_i]: + start_i += 1 + end_i -= 1 + else: + return False + return True + + +def is_palindrome_recursive(s: str) -> bool: + """ + Return True if s is a palindrome otherwise return False. + + >>> all(is_palindrome_recursive(key) is value for key, value in test_data.items()) + True + """ + if len(s) <= 1: + return True + if s[0] == s[len(s) - 1]: + return is_palindrome_recursive(s[1:-1]) + else: + return False + + +def is_palindrome_slice(s: str) -> bool: + """ + Return True if s is a palindrome otherwise return False. + + >>> all(is_palindrome_slice(key) is value for key, value in test_data.items()) + True + """ + return s == s[::-1] + + +if __name__ == "__main__": + for key, value in test_data.items(): + assert is_palindrome(key) is is_palindrome_recursive(key) + assert is_palindrome(key) is is_palindrome_slice(key) + print(f"{key:21} {value}") + print("a man a plan a canal panama") diff --git a/python-mega-algo/strings/prefix_function.py b/python-mega-algo/strings/prefix_function.py new file mode 100644 index 00000000..9e6dbbf5 --- /dev/null +++ b/python-mega-algo/strings/prefix_function.py @@ -0,0 +1,65 @@ +""" +https://cp-algorithms.com/string/prefix-function.html + +Prefix function Knuth–Morris–Pratt algorithm + +Different algorithm than Knuth-Morris-Pratt pattern finding + +E.x. Finding longest prefix which is also suffix + +Time Complexity: O(n) - where n is the length of the string +""" + + +def prefix_function(input_string: str) -> list: + """ + For the given string this function computes value for each index(i), + which represents the longest coincidence of prefix and sufix + for given substring (input_str[0...i]) + + For the value of the first element the algorithm always returns 0 + + >>> prefix_function("aabcdaabc") + [0, 1, 0, 0, 0, 1, 2, 3, 4] + >>> prefix_function("asdasdad") + [0, 0, 0, 1, 2, 3, 4, 0] + """ + + # list for the result values + prefix_result = [0] * len(input_string) + + for i in range(1, len(input_string)): + + # use last results for better performance - dynamic programming + j = prefix_result[i - 1] + while j > 0 and input_string[i] != input_string[j]: + j = prefix_result[j - 1] + + if input_string[i] == input_string[j]: + j += 1 + prefix_result[i] = j + + return prefix_result + + +def longest_prefix(input_str: str) -> int: + """ + Prefix-function use case + Finding longest prefix which is sufix as well + + >>> longest_prefix("aabcdaabc") + 4 + >>> longest_prefix("asdasdad") + 4 + >>> longest_prefix("abcab") + 2 + """ + + # just returning maximum value of the array gives us answer + return max(prefix_function(input_str)) + + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/strings/rabin_karp.py b/python-mega-algo/strings/rabin_karp.py new file mode 100644 index 00000000..81ca611a --- /dev/null +++ b/python-mega-algo/strings/rabin_karp.py @@ -0,0 +1,90 @@ +# Numbers of alphabet which we call base +alphabet_size = 256 +# Modulus to hash a string +modulus = 1000003 + + +def rabin_karp(pattern: str, text: str) -> bool: + """ + The Rabin-Karp Algorithm for finding a pattern within a piece of text + with complexity O(nm), most efficient when it is used with multiple patterns + as it is able to check if any of a set of patterns match a section of text in o(1) + given the precomputed hashes. + + This will be the simple version which only assumes one pattern is being searched + for but it's not hard to modify + + 1) Calculate pattern hash + + 2) Step through the text one character at a time passing a window with the same + length as the pattern + calculating the hash of the text within the window compare it with the hash + of the pattern. Only testing equality if the hashes match + """ + p_len = len(pattern) + t_len = len(text) + if p_len > t_len: + return False + + p_hash = 0 + text_hash = 0 + modulus_power = 1 + + # Calculating the hash of pattern and substring of text + for i in range(p_len): + p_hash = (ord(pattern[i]) + p_hash * alphabet_size) % modulus + text_hash = (ord(text[i]) + text_hash * alphabet_size) % modulus + if i == p_len - 1: + continue + modulus_power = (modulus_power * alphabet_size) % modulus + + for i in range(0, t_len - p_len + 1): + if text_hash == p_hash and text[i : i + p_len] == pattern: + return True + if i == t_len - p_len: + continue + # Calculate the https://en.wikipedia.org/wiki/Rolling_hash + text_hash = ( + (text_hash - ord(text[i]) * modulus_power) * alphabet_size + + ord(text[i + p_len]) + ) % modulus + return False + + +def test_rabin_karp() -> None: + """ + >>> test_rabin_karp() + Success. + """ + # Test 1) + pattern = "abc1abc12" + text1 = "alskfjaldsabc1abc1abc12k23adsfabcabc" + text2 = "alskfjaldsk23adsfabcabc" + assert rabin_karp(pattern, text1) and not rabin_karp(pattern, text2) + + # Test 2) + pattern = "ABABX" + text = "ABABZABABYABABX" + assert rabin_karp(pattern, text) + + # Test 3) + pattern = "AAAB" + text = "ABAAAAAB" + assert rabin_karp(pattern, text) + + # Test 4) + pattern = "abcdabcy" + text = "abcxabcdabxabcdabcdabcy" + assert rabin_karp(pattern, text) + + # Test 5) + pattern = "Lü" + text = "Lüsai" + assert rabin_karp(pattern, text) + pattern = "Lue" + assert not rabin_karp(pattern, text) + print("Success.") + + +if __name__ == "__main__": + test_rabin_karp() diff --git a/python-mega-algo/strings/remove_duplicate.py b/python-mega-algo/strings/remove_duplicate.py new file mode 100644 index 00000000..5ab0e996 --- /dev/null +++ b/python-mega-algo/strings/remove_duplicate.py @@ -0,0 +1,15 @@ +def remove_duplicates(sentence: str) -> str: + """ + Remove duplicates from sentence + >>> remove_duplicates("Python is great and Java is also great") + 'Java Python also and great is' + >>> remove_duplicates("Python is great and Java is also great") + 'Java Python also and great is' + """ + return " ".join(sorted(set(sentence.split()))) + + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/strings/reverse_letters.py b/python-mega-algo/strings/reverse_letters.py new file mode 100644 index 00000000..10b8a6d7 --- /dev/null +++ b/python-mega-algo/strings/reverse_letters.py @@ -0,0 +1,19 @@ +def reverse_letters(input_str: str) -> str: + """ + Reverses letters in a given string without adjusting the position of the words + >>> reverse_letters('The cat in the hat') + 'ehT tac ni eht tah' + >>> reverse_letters('The quick brown fox jumped over the lazy dog.') + 'ehT kciuq nworb xof depmuj revo eht yzal .god' + >>> reverse_letters('Is this true?') + 'sI siht ?eurt' + >>> reverse_letters("I love Python") + 'I evol nohtyP' + """ + return " ".join([word[::-1] for word in input_str.split()]) + + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/strings/reverse_words.py b/python-mega-algo/strings/reverse_words.py new file mode 100644 index 00000000..504c1c20 --- /dev/null +++ b/python-mega-algo/strings/reverse_words.py @@ -0,0 +1,15 @@ +def reverse_words(input_str: str) -> str: + """ + Reverses words in a given string + >>> reverse_words("I love Python") + 'Python love I' + >>> reverse_words("I Love Python") + 'Python Love I' + """ + return " ".join(input_str.split()[::-1]) + + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/strings/right.html b/python-mega-algo/strings/right.html new file mode 100644 index 00000000..225834f3 --- /dev/null +++ b/python-mega-algo/strings/right.html @@ -0,0 +1,37 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/strings + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + + + + + + + + + +
    FileFileFileFile
    aho_corasick.py frequency...der.py naive_str...rch.py swap_case.py 
    anagrams.py is_palindrome.py palindrome.py upper.py 
    autocompl...rie.py jaro_winkler.py prefix_function.py word_occurrence.py 
    boyer_moo...rch.py knuth_mor...att.py rabin_karp.py word_patterns.py 
    can_strin...ome.py levenshte...nce.py remove_du...ate.py z_function.py 
    capitalize.py lower.py reverse_letters.py __init__.py 
    check_anagrams.py manacher.py reverse_words.py dictionary.txt 
    check_pangram.py min_cost_...ion.py split.py words.txt 
    detecting...lly.py 
    + +

    +Folders: 1
    +Files: 33
    +Size of all files: 2953366 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/strings/split.py b/python-mega-algo/strings/split.py new file mode 100644 index 00000000..b62b86d2 --- /dev/null +++ b/python-mega-algo/strings/split.py @@ -0,0 +1,34 @@ +def split(string: str, separator: str = " ") -> list: + """ + Will split the string up into all the values separated by the separator + (defaults to spaces) + + >>> split("apple#banana#cherry#orange",separator='#') + ['apple', 'banana', 'cherry', 'orange'] + + >>> split("Hello there") + ['Hello', 'there'] + + >>> split("11/22/63",separator = '/') + ['11', '22', '63'] + + >>> split("12:43:39",separator = ":") + ['12', '43', '39'] + """ + + split_words = [] + + last_index = 0 + for index, char in enumerate(string): + if char == separator: + split_words.append(string[last_index:index]) + last_index = index + 1 + elif index + 1 == len(string): + split_words.append(string[last_index : index + 1]) + return split_words + + +if __name__ == "__main__": + from doctest import testmod + + testmod() diff --git a/python-mega-algo/strings/swap_case.py b/python-mega-algo/strings/swap_case.py new file mode 100644 index 00000000..107fda4b --- /dev/null +++ b/python-mega-algo/strings/swap_case.py @@ -0,0 +1,37 @@ +""" +This algorithm helps you to swap cases. + +User will give input and then program will perform swap cases. + +In other words, convert all lowercase letters to uppercase letters and vice versa. +For example: +1. Please input sentence: Algorithm.Python@89 + aLGORITHM.pYTHON@89 +2. Please input sentence: github.com/mayur200 + GITHUB.COM/MAYUR200 + +""" + + +def swap_case(sentence: str) -> str: + """ + This function will convert all lowercase letters to uppercase letters + and vice versa. + + >>> swap_case('Algorithm.Python@89') + 'aLGORITHM.pYTHON@89' + """ + new_string = "" + for char in sentence: + if char.isupper(): + new_string += char.lower() + elif char.islower(): + new_string += char.upper() + else: + new_string += char + + return new_string + + +if __name__ == "__main__": + print(swap_case(input("Please input sentence: "))) diff --git a/python-mega-algo/strings/upper.py b/python-mega-algo/strings/upper.py new file mode 100644 index 00000000..5edd40b7 --- /dev/null +++ b/python-mega-algo/strings/upper.py @@ -0,0 +1,24 @@ +def upper(word: str) -> str: + """ + Will convert the entire string to uppercase letters + + >>> upper("wow") + 'WOW' + >>> upper("Hello") + 'HELLO' + >>> upper("WHAT") + 'WHAT' + >>> upper("wh[]32") + 'WH[]32' + """ + + # Converting to ascii value int value and checking to see if char is a lower letter + # if it is a lowercase letter it is getting shift by 32 which makes it an uppercase + # case letter + return "".join(chr(ord(char) - 32) if "a" <= char <= "z" else char for char in word) + + +if __name__ == "__main__": + from doctest import testmod + + testmod() diff --git a/python-mega-algo/strings/word_occurrence.py b/python-mega-algo/strings/word_occurrence.py new file mode 100644 index 00000000..ef612e12 --- /dev/null +++ b/python-mega-algo/strings/word_occurrence.py @@ -0,0 +1,26 @@ +# Created by sarathkaul on 17/11/19 +# Modified by Arkadip Bhattacharya(@darkmatter18) on 20/04/2020 +from collections import defaultdict + + +def word_occurence(sentence: str) -> dict: + """ + >>> from collections import Counter + >>> SENTENCE = "a b A b c b d b d e f e g e h e i e j e 0" + >>> occurence_dict = word_occurence(SENTENCE) + >>> all(occurence_dict[word] == count for word, count + ... in Counter(SENTENCE.split()).items()) + True + >>> dict(word_occurence("Two spaces")) + {'Two': 1, 'spaces': 1} + """ + occurrence = defaultdict(int) + # Creating a dictionary containing count of each word + for word in sentence.split(): + occurrence[word] += 1 + return occurrence + + +if __name__ == "__main__": + for word, count in word_occurence("INPUT STRING").items(): + print(f"{word}: {count}") diff --git a/python-mega-algo/strings/word_patterns.py b/python-mega-algo/strings/word_patterns.py new file mode 100644 index 00000000..d229954d --- /dev/null +++ b/python-mega-algo/strings/word_patterns.py @@ -0,0 +1,44 @@ +def get_word_pattern(word: str) -> str: + """ + >>> get_word_pattern("pattern") + '0.1.2.2.3.4.5' + >>> get_word_pattern("word pattern") + '0.1.2.3.4.5.6.7.7.8.2.9' + >>> get_word_pattern("get word pattern") + '0.1.2.3.4.5.6.7.3.8.9.2.2.1.6.10' + """ + word = word.upper() + next_num = 0 + letter_nums = {} + word_pattern = [] + + for letter in word: + if letter not in letter_nums: + letter_nums[letter] = str(next_num) + next_num += 1 + word_pattern.append(letter_nums[letter]) + return ".".join(word_pattern) + + +if __name__ == "__main__": + import pprint + import time + + start_time = time.time() + with open("dictionary.txt") as in_file: + wordList = in_file.read().splitlines() + + all_patterns = {} + for word in wordList: + pattern = get_word_pattern(word) + if pattern in all_patterns: + all_patterns[pattern].append(word) + else: + all_patterns[pattern] = [word] + + with open("word_patterns.txt", "w") as out_file: + out_file.write(pprint.pformat(all_patterns)) + + totalTime = round(time.time() - start_time, 2) + print(f"Done! {len(all_patterns):,} word patterns found in {totalTime} seconds.") + # Done! 9,581 word patterns found in 0.58 seconds. diff --git a/python-mega-algo/strings/words.txt b/python-mega-algo/strings/words.txt new file mode 100644 index 00000000..4be557ed --- /dev/null +++ b/python-mega-algo/strings/words.txt @@ -0,0 +1,235886 @@ +A +a +aa +aal +aalii +aam +Aani +aardvark +aardwolf +Aaron +Aaronic +Aaronical +Aaronite +Aaronitic +Aaru +Ab +aba +Ababdeh +Ababua +abac +abaca +abacate +abacay +abacinate +abacination +abaciscus +abacist +aback +abactinal +abactinally +abaction +abactor +abaculus +abacus +Abadite +abaff +abaft +abaisance +abaiser +abaissed +abalienate +abalienation +abalone +Abama +abampere +abandon +abandonable +abandoned +abandonedly +abandonee +abandoner +abandonment +Abanic +Abantes +abaptiston +Abarambo +Abaris +abarthrosis +abarticular +abarticulation +abas +abase +abased +abasedly +abasedness +abasement +abaser +Abasgi +abash +abashed +abashedly +abashedness +abashless +abashlessly +abashment +abasia +abasic +abask +Abassin +abastardize +abatable +abate +abatement +abater +abatis +abatised +abaton +abator +abattoir +Abatua +abature +abave +abaxial +abaxile +abaze +abb +Abba +abbacomes +abbacy +Abbadide +abbas +abbasi +abbassi +Abbasside +abbatial +abbatical +abbess +abbey +abbeystede +Abbie +abbot +abbotcy +abbotnullius +abbotship +abbreviate +abbreviately +abbreviation +abbreviator +abbreviatory +abbreviature +Abby +abcoulomb +abdal +abdat +Abderian +Abderite +abdest +abdicable +abdicant +abdicate +abdication +abdicative +abdicator +Abdiel +abditive +abditory +abdomen +abdominal +Abdominales +abdominalian +abdominally +abdominoanterior +abdominocardiac +abdominocentesis +abdominocystic +abdominogenital +abdominohysterectomy +abdominohysterotomy +abdominoposterior +abdominoscope +abdominoscopy +abdominothoracic +abdominous +abdominovaginal +abdominovesical +abduce +abducens +abducent +abduct +abduction +abductor +Abe +abeam +abear +abearance +abecedarian +abecedarium +abecedary +abed +abeigh +Abel +abele +Abelia +Abelian +Abelicea +Abelite +abelite +Abelmoschus +abelmosk +Abelonian +abeltree +Abencerrages +abenteric +abepithymia +Aberdeen +aberdevine +Aberdonian +Aberia +aberrance +aberrancy +aberrant +aberrate +aberration +aberrational +aberrator +aberrometer +aberroscope +aberuncator +abet +abetment +abettal +abettor +abevacuation +abey +abeyance +abeyancy +abeyant +abfarad +abhenry +abhiseka +abhominable +abhor +abhorrence +abhorrency +abhorrent +abhorrently +abhorrer +abhorrible +abhorring +Abhorson +abidal +abidance +abide +abider +abidi +abiding +abidingly +abidingness +Abie +Abies +abietate +abietene +abietic +abietin +Abietineae +abietineous +abietinic +Abiezer +Abigail +abigail +abigailship +abigeat +abigeus +abilao +ability +abilla +abilo +abintestate +abiogenesis +abiogenesist +abiogenetic +abiogenetical +abiogenetically +abiogenist +abiogenous +abiogeny +abiological +abiologically +abiology +abiosis +abiotic +abiotrophic +abiotrophy +Abipon +abir +abirritant +abirritate +abirritation +abirritative +abiston +Abitibi +abiuret +abject +abjectedness +abjection +abjective +abjectly +abjectness +abjoint +abjudge +abjudicate +abjudication +abjunction +abjunctive +abjuration +abjuratory +abjure +abjurement +abjurer +abkar +abkari +Abkhas +Abkhasian +ablach +ablactate +ablactation +ablare +ablastemic +ablastous +ablate +ablation +ablatitious +ablatival +ablative +ablator +ablaut +ablaze +able +ableeze +ablegate +ableness +ablepharia +ablepharon +ablepharous +Ablepharus +ablepsia +ableptical +ableptically +abler +ablest +ablewhackets +ablins +abloom +ablow +ablude +abluent +ablush +ablution +ablutionary +abluvion +ably +abmho +Abnaki +abnegate +abnegation +abnegative +abnegator +Abner +abnerval +abnet +abneural +abnormal +abnormalism +abnormalist +abnormality +abnormalize +abnormally +abnormalness +abnormity +abnormous +abnumerable +Abo +aboard +Abobra +abode +abodement +abody +abohm +aboil +abolish +abolisher +abolishment +abolition +abolitionary +abolitionism +abolitionist +abolitionize +abolla +aboma +abomasum +abomasus +abominable +abominableness +abominably +abominate +abomination +abominator +abomine +Abongo +aboon +aborad +aboral +aborally +abord +aboriginal +aboriginality +aboriginally +aboriginary +aborigine +abort +aborted +aborticide +abortient +abortifacient +abortin +abortion +abortional +abortionist +abortive +abortively +abortiveness +abortus +abouchement +abound +abounder +abounding +aboundingly +about +abouts +above +aboveboard +abovedeck +aboveground +aboveproof +abovestairs +abox +abracadabra +abrachia +abradant +abrade +abrader +Abraham +Abrahamic +Abrahamidae +Abrahamite +Abrahamitic +abraid +Abram +Abramis +abranchial +abranchialism +abranchian +Abranchiata +abranchiate +abranchious +abrasax +abrase +abrash +abrasiometer +abrasion +abrasive +abrastol +abraum +abraxas +abreact +abreaction +abreast +abrenounce +abret +abrico +abridge +abridgeable +abridged +abridgedly +abridger +abridgment +abrim +abrin +abristle +abroach +abroad +Abrocoma +abrocome +abrogable +abrogate +abrogation +abrogative +abrogator +Abroma +Abronia +abrook +abrotanum +abrotine +abrupt +abruptedly +abruption +abruptly +abruptness +Abrus +Absalom +absampere +Absaroka +absarokite +abscess +abscessed +abscession +abscessroot +abscind +abscise +abscision +absciss +abscissa +abscissae +abscisse +abscission +absconce +abscond +absconded +abscondedly +abscondence +absconder +absconsa +abscoulomb +absence +absent +absentation +absentee +absenteeism +absenteeship +absenter +absently +absentment +absentmindedly +absentness +absfarad +abshenry +Absi +absinthe +absinthial +absinthian +absinthiate +absinthic +absinthin +absinthine +absinthism +absinthismic +absinthium +absinthol +absit +absmho +absohm +absolute +absolutely +absoluteness +absolution +absolutism +absolutist +absolutistic +absolutistically +absolutive +absolutization +absolutize +absolutory +absolvable +absolvatory +absolve +absolvent +absolver +absolvitor +absolvitory +absonant +absonous +absorb +absorbability +absorbable +absorbed +absorbedly +absorbedness +absorbefacient +absorbency +absorbent +absorber +absorbing +absorbingly +absorbition +absorpt +absorptance +absorptiometer +absorptiometric +absorption +absorptive +absorptively +absorptiveness +absorptivity +absquatulate +abstain +abstainer +abstainment +abstemious +abstemiously +abstemiousness +abstention +abstentionist +abstentious +absterge +abstergent +abstersion +abstersive +abstersiveness +abstinence +abstinency +abstinent +abstinential +abstinently +abstract +abstracted +abstractedly +abstractedness +abstracter +abstraction +abstractional +abstractionism +abstractionist +abstractitious +abstractive +abstractively +abstractiveness +abstractly +abstractness +abstractor +abstrahent +abstricted +abstriction +abstruse +abstrusely +abstruseness +abstrusion +abstrusity +absume +absumption +absurd +absurdity +absurdly +absurdness +absvolt +Absyrtus +abterminal +abthain +abthainrie +abthainry +abthanage +Abu +abu +abucco +abulia +abulic +abulomania +abuna +abundance +abundancy +abundant +Abundantia +abundantly +abura +aburabozu +aburban +aburst +aburton +abusable +abuse +abusedly +abusee +abuseful +abusefully +abusefulness +abuser +abusion +abusious +abusive +abusively +abusiveness +abut +Abuta +Abutilon +abutment +abuttal +abutter +abutting +abuzz +abvolt +abwab +aby +abysm +abysmal +abysmally +abyss +abyssal +Abyssinian +abyssobenthonic +abyssolith +abyssopelagic +acacatechin +acacatechol +acacetin +Acacia +Acacian +acaciin +acacin +academe +academial +academian +Academic +academic +academical +academically +academicals +academician +academicism +academism +academist +academite +academization +academize +Academus +academy +Acadia +acadialite +Acadian +Acadie +Acaena +acajou +acaleph +Acalepha +Acalephae +acalephan +acalephoid +acalycal +acalycine +acalycinous +acalyculate +Acalypha +Acalypterae +Acalyptrata +Acalyptratae +acalyptrate +Acamar +acampsia +acana +acanaceous +acanonical +acanth +acantha +Acanthaceae +acanthaceous +acanthad +Acantharia +Acanthia +acanthial +acanthin +acanthine +acanthion +acanthite +acanthocarpous +Acanthocephala +acanthocephalan +Acanthocephali +acanthocephalous +Acanthocereus +acanthocladous +Acanthodea +acanthodean +Acanthodei +Acanthodes +acanthodian +Acanthodidae +Acanthodii +Acanthodini +acanthoid +Acantholimon +acanthological +acanthology +acantholysis +acanthoma +Acanthomeridae +acanthon +Acanthopanax +Acanthophis +acanthophorous +acanthopod +acanthopodous +acanthopomatous +acanthopore +acanthopteran +Acanthopteri +acanthopterous +acanthopterygian +Acanthopterygii +acanthosis +acanthous +Acanthuridae +Acanthurus +acanthus +acapnia +acapnial +acapsular +acapu +acapulco +acara +Acarapis +acardia +acardiac +acari +acarian +acariasis +acaricidal +acaricide +acarid +Acarida +Acaridea +acaridean +acaridomatium +acariform +Acarina +acarine +acarinosis +acarocecidium +acarodermatitis +acaroid +acarol +acarologist +acarology +acarophilous +acarophobia +acarotoxic +acarpelous +acarpous +Acarus +Acastus +acatalectic +acatalepsia +acatalepsy +acataleptic +acatallactic +acatamathesia +acataphasia +acataposis +acatastasia +acatastatic +acate +acategorical +acatery +acatharsia +acatharsy +acatholic +acaudal +acaudate +acaulescent +acauline +acaulose +acaulous +acca +accede +accedence +acceder +accelerable +accelerando +accelerant +accelerate +accelerated +acceleratedly +acceleration +accelerative +accelerator +acceleratory +accelerograph +accelerometer +accend +accendibility +accendible +accension +accensor +accent +accentless +accentor +accentuable +accentual +accentuality +accentually +accentuate +accentuation +accentuator +accentus +accept +acceptability +acceptable +acceptableness +acceptably +acceptance +acceptancy +acceptant +acceptation +accepted +acceptedly +accepter +acceptilate +acceptilation +acception +acceptive +acceptor +acceptress +accerse +accersition +accersitor +access +accessarily +accessariness +accessary +accessaryship +accessibility +accessible +accessibly +accession +accessional +accessioner +accessive +accessively +accessless +accessorial +accessorily +accessoriness +accessorius +accessory +accidence +accidency +accident +accidental +accidentalism +accidentalist +accidentality +accidentally +accidentalness +accidented +accidential +accidentiality +accidently +accidia +accidie +accinge +accipient +Accipiter +accipitral +accipitrary +Accipitres +accipitrine +accismus +accite +acclaim +acclaimable +acclaimer +acclamation +acclamator +acclamatory +acclimatable +acclimatation +acclimate +acclimatement +acclimation +acclimatizable +acclimatization +acclimatize +acclimatizer +acclimature +acclinal +acclinate +acclivitous +acclivity +acclivous +accloy +accoast +accoil +accolade +accoladed +accolated +accolent +accolle +accombination +accommodable +accommodableness +accommodate +accommodately +accommodateness +accommodating +accommodatingly +accommodation +accommodational +accommodative +accommodativeness +accommodator +accompanier +accompaniment +accompanimental +accompanist +accompany +accompanyist +accompletive +accomplice +accompliceship +accomplicity +accomplish +accomplishable +accomplished +accomplisher +accomplishment +accomplisht +accompt +accord +accordable +accordance +accordancy +accordant +accordantly +accorder +according +accordingly +accordion +accordionist +accorporate +accorporation +accost +accostable +accosted +accouche +accouchement +accoucheur +accoucheuse +account +accountability +accountable +accountableness +accountably +accountancy +accountant +accountantship +accounting +accountment +accouple +accouplement +accouter +accouterment +accoy +accredit +accreditate +accreditation +accredited +accreditment +accrementitial +accrementition +accresce +accrescence +accrescent +accretal +accrete +accretion +accretionary +accretive +accroach +accroides +accrual +accrue +accruement +accruer +accubation +accubitum +accubitus +accultural +acculturate +acculturation +acculturize +accumbency +accumbent +accumber +accumulable +accumulate +accumulation +accumulativ +accumulative +accumulatively +accumulativeness +accumulator +accuracy +accurate +accurately +accurateness +accurse +accursed +accursedly +accursedness +accusable +accusably +accusal +accusant +accusation +accusatival +accusative +accusatively +accusatorial +accusatorially +accusatory +accusatrix +accuse +accused +accuser +accusingly +accusive +accustom +accustomed +accustomedly +accustomedness +ace +aceacenaphthene +aceanthrene +aceanthrenequinone +acecaffine +aceconitic +acedia +acediamine +acediast +acedy +Aceldama +Acemetae +Acemetic +acenaphthene +acenaphthenyl +acenaphthylene +acentric +acentrous +aceologic +aceology +acephal +Acephala +acephalan +Acephali +acephalia +Acephalina +acephaline +acephalism +acephalist +Acephalite +acephalocyst +acephalous +acephalus +Acer +Aceraceae +aceraceous +Acerae +Acerata +acerate +Acerates +acerathere +Aceratherium +aceratosis +acerb +Acerbas +acerbate +acerbic +acerbity +acerdol +acerin +acerose +acerous +acerra +acertannin +acervate +acervately +acervation +acervative +acervose +acervuline +acervulus +acescence +acescency +acescent +aceship +acesodyne +Acestes +acetabular +Acetabularia +acetabuliferous +acetabuliform +acetabulous +acetabulum +acetacetic +acetal +acetaldehydase +acetaldehyde +acetaldehydrase +acetalization +acetalize +acetamide +acetamidin +acetamidine +acetamido +acetaminol +acetanilid +acetanilide +acetanion +acetaniside +acetanisidide +acetannin +acetarious +acetarsone +acetate +acetated +acetation +acetbromamide +acetenyl +acethydrazide +acetic +acetification +acetifier +acetify +acetimeter +acetimetry +acetin +acetize +acetmethylanilide +acetnaphthalide +acetoacetanilide +acetoacetate +acetoacetic +acetoamidophenol +acetoarsenite +Acetobacter +acetobenzoic +acetobromanilide +acetochloral +acetocinnamene +acetoin +acetol +acetolysis +acetolytic +acetometer +acetometrical +acetometrically +acetometry +acetomorphine +acetonaphthone +acetonate +acetonation +acetone +acetonemia +acetonemic +acetonic +acetonitrile +acetonization +acetonize +acetonuria +acetonurometer +acetonyl +acetonylacetone +acetonylidene +acetophenetide +acetophenin +acetophenine +acetophenone +acetopiperone +acetopyrin +acetosalicylic +acetose +acetosity +acetosoluble +acetothienone +acetotoluide +acetotoluidine +acetous +acetoveratrone +acetoxime +acetoxyl +acetoxyphthalide +acetphenetid +acetphenetidin +acetract +acettoluide +acetum +aceturic +acetyl +acetylacetonates +acetylacetone +acetylamine +acetylate +acetylation +acetylator +acetylbenzene +acetylbenzoate +acetylbenzoic +acetylbiuret +acetylcarbazole +acetylcellulose +acetylcholine +acetylcyanide +acetylenation +acetylene +acetylenediurein +acetylenic +acetylenyl +acetylfluoride +acetylglycine +acetylhydrazine +acetylic +acetylide +acetyliodide +acetylizable +acetylization +acetylize +acetylizer +acetylmethylcarbinol +acetylperoxide +acetylphenol +acetylphenylhydrazine +acetylrosaniline +acetylsalicylate +acetylsalol +acetyltannin +acetylthymol +acetyltropeine +acetylurea +ach +Achaean +Achaemenian +Achaemenid +Achaemenidae +Achaemenidian +Achaenodon +Achaeta +achaetous +achage +Achagua +Achakzai +achalasia +Achamoth +Achango +achar +Achariaceae +Achariaceous +achate +Achates +Achatina +Achatinella +Achatinidae +ache +acheilia +acheilous +acheiria +acheirous +acheirus +Achen +achene +achenial +achenium +achenocarp +achenodium +acher +Achernar +Acheronian +Acherontic +Acherontical +achete +Achetidae +Acheulean +acheweed +achievable +achieve +achievement +achiever +achigan +achilary +achill +Achillea +Achillean +Achilleid +achilleine +Achillize +achillobursitis +achillodynia +achime +Achimenes +Achinese +aching +achingly +achira +Achitophel +achlamydate +Achlamydeae +achlamydeous +achlorhydria +achlorophyllous +achloropsia +Achmetha +acholia +acholic +Acholoe +acholous +acholuria +acholuric +Achomawi +achondrite +achondritic +achondroplasia +achondroplastic +achor +achordal +Achordata +achordate +Achorion +Achras +achree +achroacyte +Achroanthes +achrodextrin +achrodextrinase +achroglobin +achroiocythaemia +achroiocythemia +achroite +achroma +achromacyte +achromasia +achromat +achromate +Achromatiaceae +achromatic +achromatically +achromaticity +achromatin +achromatinic +achromatism +Achromatium +achromatizable +achromatization +achromatize +achromatocyte +achromatolysis +achromatope +achromatophile +achromatopia +achromatopsia +achromatopsy +achromatosis +achromatous +achromaturia +achromia +achromic +Achromobacter +Achromobacterieae +achromoderma +achromophilous +achromotrichia +achromous +achronical +achroodextrin +achroodextrinase +achroous +achropsia +achtehalber +achtel +achtelthaler +Achuas +achy +achylia +achylous +achymia +achymous +Achyranthes +Achyrodes +acichloride +acicula +acicular +acicularly +aciculate +aciculated +aciculum +acid +Acidanthera +Acidaspis +acidemia +acider +acidic +acidiferous +acidifiable +acidifiant +acidific +acidification +acidifier +acidify +acidimeter +acidimetric +acidimetrical +acidimetrically +acidimetry +acidite +acidity +acidize +acidly +acidness +acidoid +acidology +acidometer +acidometry +acidophile +acidophilic +acidophilous +acidoproteolytic +acidosis +acidosteophyte +acidotic +acidproof +acidulate +acidulent +acidulous +aciduric +acidyl +acier +acierage +Acieral +acierate +acieration +aciform +aciliate +aciliated +Acilius +acinaceous +acinaces +acinacifolious +acinaciform +acinar +acinarious +acinary +Acineta +Acinetae +acinetan +Acinetaria +acinetarian +acinetic +acinetiform +Acinetina +acinetinan +acinic +aciniform +acinose +acinotubular +acinous +acinus +Acipenser +Acipenseres +acipenserid +Acipenseridae +acipenserine +acipenseroid +Acipenseroidei +Acis +aciurgy +acker +ackey +ackman +acknow +acknowledge +acknowledgeable +acknowledged +acknowledgedly +acknowledger +aclastic +acle +acleidian +acleistous +Aclemon +aclidian +aclinal +aclinic +acloud +aclys +Acmaea +Acmaeidae +acmatic +acme +acmesthesia +acmic +Acmispon +acmite +acne +acneform +acneiform +acnemia +Acnida +acnodal +acnode +Acocanthera +acocantherin +acock +acockbill +acocotl +Acoela +Acoelomata +acoelomate +acoelomatous +Acoelomi +acoelomous +acoelous +Acoemetae +Acoemeti +Acoemetic +acoin +acoine +Acolapissa +acold +Acolhua +Acolhuan +acologic +acology +acolous +acoluthic +acolyte +acolythate +Acoma +acoma +acomia +acomous +aconative +acondylose +acondylous +acone +aconic +aconin +aconine +aconital +aconite +aconitia +aconitic +aconitin +aconitine +Aconitum +Acontias +acontium +Acontius +aconuresis +acopic +acopon +acopyrin +acopyrine +acor +acorea +acoria +acorn +acorned +Acorus +acosmic +acosmism +acosmist +acosmistic +acotyledon +acotyledonous +acouasm +acouchi +acouchy +acoumeter +acoumetry +acouometer +acouophonia +acoupa +acousmata +acousmatic +acoustic +acoustical +acoustically +acoustician +acousticolateral +Acousticon +acoustics +acquaint +acquaintance +acquaintanceship +acquaintancy +acquaintant +acquainted +acquaintedness +acquest +acquiesce +acquiescement +acquiescence +acquiescency +acquiescent +acquiescently +acquiescer +acquiescingly +acquirability +acquirable +acquire +acquired +acquirement +acquirenda +acquirer +acquisible +acquisite +acquisited +acquisition +acquisitive +acquisitively +acquisitiveness +acquisitor +acquisitum +acquist +acquit +acquitment +acquittal +acquittance +acquitter +Acrab +acracy +acraein +Acraeinae +acraldehyde +Acrania +acranial +acraniate +acrasia +Acrasiaceae +Acrasiales +Acrasida +Acrasieae +Acraspeda +acraspedote +acratia +acraturesis +acrawl +acraze +acre +acreable +acreage +acreak +acream +acred +Acredula +acreman +acrestaff +acrid +acridan +acridian +acridic +Acrididae +Acridiidae +acridine +acridinic +acridinium +acridity +Acridium +acridly +acridness +acridone +acridonium +acridophagus +acridyl +acriflavin +acriflavine +acrimonious +acrimoniously +acrimoniousness +acrimony +acrindoline +acrinyl +acrisia +Acrisius +Acrita +acritan +acrite +acritical +acritol +Acroa +acroaesthesia +acroama +acroamatic +acroamatics +acroanesthesia +acroarthritis +acroasphyxia +acroataxia +acroatic +acrobacy +acrobat +Acrobates +acrobatholithic +acrobatic +acrobatical +acrobatically +acrobatics +acrobatism +acroblast +acrobryous +acrobystitis +Acrocarpi +acrocarpous +acrocephalia +acrocephalic +acrocephalous +acrocephaly +Acrocera +Acroceratidae +Acroceraunian +Acroceridae +Acrochordidae +Acrochordinae +acrochordon +Acroclinium +Acrocomia +acroconidium +acrocontracture +acrocoracoid +acrocyanosis +acrocyst +acrodactylum +acrodermatitis +acrodont +acrodontism +acrodrome +acrodromous +Acrodus +acrodynia +acroesthesia +acrogamous +acrogamy +acrogen +acrogenic +acrogenous +acrogenously +acrography +Acrogynae +acrogynae +acrogynous +acrolein +acrolith +acrolithan +acrolithic +acrologic +acrologically +acrologism +acrologue +acrology +acromania +acromastitis +acromegalia +acromegalic +acromegaly +acromelalgia +acrometer +acromial +acromicria +acromioclavicular +acromiocoracoid +acromiodeltoid +acromiohumeral +acromiohyoid +acromion +acromioscapular +acromiosternal +acromiothoracic +acromonogrammatic +acromphalus +Acromyodi +acromyodian +acromyodic +acromyodous +acromyotonia +acromyotonus +acron +acronarcotic +acroneurosis +acronical +acronically +acronyc +acronych +Acronycta +acronyctous +acronym +acronymic +acronymize +acronymous +acronyx +acrook +acroparalysis +acroparesthesia +acropathology +acropathy +acropetal +acropetally +acrophobia +acrophonetic +acrophonic +acrophony +acropodium +acropoleis +acropolis +acropolitan +Acropora +acrorhagus +acrorrheuma +acrosarc +acrosarcum +acroscleriasis +acroscleroderma +acroscopic +acrose +acrosome +acrosphacelus +acrospire +acrospore +acrosporous +across +acrostic +acrostical +acrostically +acrostichal +Acrosticheae +acrostichic +acrostichoid +Acrostichum +acrosticism +acrostolion +acrostolium +acrotarsial +acrotarsium +acroteleutic +acroterial +acroteric +acroterium +Acrothoracica +acrotic +acrotism +acrotomous +Acrotreta +Acrotretidae +acrotrophic +acrotrophoneurosis +Acrux +Acrydium +acryl +acrylaldehyde +acrylate +acrylic +acrylonitrile +acrylyl +act +acta +actability +actable +Actaea +Actaeaceae +Actaeon +Actaeonidae +Actiad +Actian +actification +actifier +actify +actin +actinal +actinally +actinautographic +actinautography +actine +actinenchyma +acting +Actinia +actinian +Actiniaria +actiniarian +actinic +actinically +Actinidia +Actinidiaceae +actiniferous +actiniform +actinine +actiniochrome +actiniohematin +Actiniomorpha +actinism +Actinistia +actinium +actinobacillosis +Actinobacillus +actinoblast +actinobranch +actinobranchia +actinocarp +actinocarpic +actinocarpous +actinochemistry +actinocrinid +Actinocrinidae +actinocrinite +Actinocrinus +actinocutitis +actinodermatitis +actinodielectric +actinodrome +actinodromous +actinoelectric +actinoelectrically +actinoelectricity +actinogonidiate +actinogram +actinograph +actinography +actinoid +Actinoida +Actinoidea +actinolite +actinolitic +actinologous +actinologue +actinology +actinomere +actinomeric +actinometer +actinometric +actinometrical +actinometry +actinomorphic +actinomorphous +actinomorphy +Actinomyces +Actinomycetaceae +Actinomycetales +actinomycete +actinomycetous +actinomycin +actinomycoma +actinomycosis +actinomycotic +Actinomyxidia +Actinomyxidiida +actinon +Actinonema +actinoneuritis +actinophone +actinophonic +actinophore +actinophorous +actinophryan +Actinophrys +Actinopoda +actinopraxis +actinopteran +Actinopteri +actinopterous +actinopterygian +Actinopterygii +actinopterygious +actinoscopy +actinosoma +actinosome +Actinosphaerium +actinost +actinostereoscopy +actinostomal +actinostome +actinotherapeutic +actinotherapeutics +actinotherapy +actinotoxemia +actinotrichium +actinotrocha +actinouranium +Actinozoa +actinozoal +actinozoan +actinozoon +actinula +action +actionable +actionably +actional +actionary +actioner +actionize +actionless +Actipylea +Actium +activable +activate +activation +activator +active +actively +activeness +activin +activism +activist +activital +activity +activize +actless +actomyosin +acton +actor +actorship +actress +Acts +actu +actual +actualism +actualist +actualistic +actuality +actualization +actualize +actually +actualness +actuarial +actuarially +actuarian +actuary +actuaryship +actuation +actuator +acture +acturience +actutate +acuaesthesia +Acuan +acuate +acuation +Acubens +acuclosure +acuductor +acuesthesia +acuity +aculea +Aculeata +aculeate +aculeated +aculeiform +aculeolate +aculeolus +aculeus +acumen +acuminate +acumination +acuminose +acuminous +acuminulate +acupress +acupressure +acupunctuate +acupunctuation +acupuncturation +acupuncturator +acupuncture +acurative +acushla +acutangular +acutate +acute +acutely +acutenaculum +acuteness +acutiator +acutifoliate +Acutilinguae +acutilingual +acutilobate +acutiplantar +acutish +acutograve +acutonodose +acutorsion +acyanoblepsia +acyanopsia +acyclic +acyesis +acyetic +acyl +acylamido +acylamidobenzene +acylamino +acylate +acylation +acylogen +acyloin +acyloxy +acyloxymethane +acyrological +acyrology +acystia +ad +Ada +adactyl +adactylia +adactylism +adactylous +Adad +adad +adage +adagial +adagietto +adagio +Adai +Adaize +Adam +adamant +adamantean +adamantine +adamantinoma +adamantoblast +adamantoblastoma +adamantoid +adamantoma +adamas +Adamastor +adambulacral +adamellite +Adamhood +Adamic +Adamical +Adamically +adamine +Adamite +adamite +Adamitic +Adamitical +Adamitism +Adamsia +adamsite +adance +adangle +Adansonia +Adapa +adapid +Adapis +adapt +adaptability +adaptable +adaptation +adaptational +adaptationally +adaptative +adaptedness +adapter +adaption +adaptional +adaptionism +adaptitude +adaptive +adaptively +adaptiveness +adaptometer +adaptor +adaptorial +Adar +adarme +adat +adati +adatom +adaunt +adaw +adawe +adawlut +adawn +adaxial +aday +adays +adazzle +adcraft +add +Adda +adda +addability +addable +addax +addebted +added +addedly +addend +addenda +addendum +adder +adderbolt +adderfish +adderspit +adderwort +addibility +addible +addicent +addict +addicted +addictedness +addiction +Addie +addiment +Addisonian +Addisoniana +additament +additamentary +addition +additional +additionally +additionary +additionist +addititious +additive +additively +additivity +additory +addle +addlebrain +addlebrained +addlehead +addleheaded +addleheadedly +addleheadedness +addlement +addleness +addlepate +addlepated +addlepatedness +addleplot +addlings +addlins +addorsed +address +addressee +addresser +addressful +Addressograph +addressor +addrest +Addu +adduce +adducent +adducer +adducible +adduct +adduction +adductive +adductor +Addy +Ade +ade +adead +adeem +adeep +Adela +Adelaide +Adelarthra +Adelarthrosomata +adelarthrosomatous +Adelbert +Adelea +Adeleidae +Adelges +Adelia +Adelina +Adeline +adeling +adelite +Adeliza +adelocerous +Adelochorda +adelocodonic +adelomorphic +adelomorphous +adelopod +Adelops +Adelphi +Adelphian +adelphogamy +Adelphoi +adelpholite +adelphophagy +ademonist +adempted +ademption +adenalgia +adenalgy +Adenanthera +adenase +adenasthenia +adendric +adendritic +adenectomy +adenectopia +adenectopic +adenemphractic +adenemphraxis +adenia +adeniform +adenine +adenitis +adenization +adenoacanthoma +adenoblast +adenocancroid +adenocarcinoma +adenocarcinomatous +adenocele +adenocellulitis +adenochondroma +adenochondrosarcoma +adenochrome +adenocyst +adenocystoma +adenocystomatous +adenodermia +adenodiastasis +adenodynia +adenofibroma +adenofibrosis +adenogenesis +adenogenous +adenographer +adenographic +adenographical +adenography +adenohypersthenia +adenoid +adenoidal +adenoidism +adenoliomyofibroma +adenolipoma +adenolipomatosis +adenologaditis +adenological +adenology +adenolymphocele +adenolymphoma +adenoma +adenomalacia +adenomatome +adenomatous +adenomeningeal +adenometritis +adenomycosis +adenomyofibroma +adenomyoma +adenomyxoma +adenomyxosarcoma +adenoncus +adenoneural +adenoneure +adenopathy +adenopharyngeal +adenopharyngitis +adenophlegmon +Adenophora +adenophore +adenophorous +adenophthalmia +adenophyllous +adenophyma +adenopodous +adenosarcoma +adenosclerosis +adenose +adenosine +adenosis +adenostemonous +Adenostoma +adenotome +adenotomic +adenotomy +adenotyphoid +adenotyphus +adenyl +adenylic +Adeodatus +Adeona +Adephaga +adephagan +adephagia +adephagous +adept +adeptness +adeptship +adequacy +adequate +adequately +adequateness +adequation +adequative +adermia +adermin +Adessenarian +adet +adevism +adfected +adfix +adfluxion +adglutinate +Adhafera +adhaka +adhamant +Adhara +adharma +adhere +adherence +adherency +adherent +adherently +adherer +adherescence +adherescent +adhesion +adhesional +adhesive +adhesively +adhesivemeter +adhesiveness +adhibit +adhibition +adiabatic +adiabatically +adiabolist +adiactinic +adiadochokinesis +adiagnostic +adiantiform +Adiantum +adiaphon +adiaphonon +adiaphoral +adiaphoresis +adiaphoretic +adiaphorism +adiaphorist +adiaphoristic +adiaphorite +adiaphoron +adiaphorous +adiate +adiathermal +adiathermancy +adiathermanous +adiathermic +adiathetic +adiation +Adib +Adicea +adicity +Adiel +adieu +adieux +Adigei +Adighe +Adigranth +adigranth +Adin +Adinida +adinidan +adinole +adion +adipate +adipescent +adipic +adipinic +adipocele +adipocellulose +adipocere +adipoceriform +adipocerous +adipocyte +adipofibroma +adipogenic +adipogenous +adipoid +adipolysis +adipolytic +adipoma +adipomatous +adipometer +adipopexia +adipopexis +adipose +adiposeness +adiposis +adiposity +adiposogenital +adiposuria +adipous +adipsia +adipsic +adipsous +adipsy +adipyl +Adirondack +adit +adital +aditus +adjacency +adjacent +adjacently +adjag +adject +adjection +adjectional +adjectival +adjectivally +adjective +adjectively +adjectivism +adjectivitis +adjiger +adjoin +adjoined +adjoinedly +adjoining +adjoint +adjourn +adjournal +adjournment +adjudge +adjudgeable +adjudger +adjudgment +adjudicate +adjudication +adjudicative +adjudicator +adjudicature +adjunct +adjunction +adjunctive +adjunctively +adjunctly +adjuration +adjuratory +adjure +adjurer +adjust +adjustable +adjustably +adjustage +adjustation +adjuster +adjustive +adjustment +adjutage +adjutancy +adjutant +adjutantship +adjutorious +adjutory +adjutrice +adjuvant +Adlai +adlay +adless +adlet +Adlumia +adlumidine +adlumine +adman +admarginate +admaxillary +admeasure +admeasurement +admeasurer +admedial +admedian +admensuration +admi +adminicle +adminicula +adminicular +adminiculary +adminiculate +adminiculation +adminiculum +administer +administerd +administerial +administrable +administrant +administrate +administration +administrational +administrative +administratively +administrator +administratorship +administratress +administratrices +administratrix +admirability +admirable +admirableness +admirably +admiral +admiralship +admiralty +admiration +admirative +admirator +admire +admired +admiredly +admirer +admiring +admiringly +admissibility +admissible +admissibleness +admissibly +admission +admissive +admissory +admit +admittable +admittance +admitted +admittedly +admittee +admitter +admittible +admix +admixtion +admixture +admonish +admonisher +admonishingly +admonishment +admonition +admonitioner +admonitionist +admonitive +admonitively +admonitor +admonitorial +admonitorily +admonitory +admonitrix +admortization +adnascence +adnascent +adnate +adnation +adnephrine +adnerval +adneural +adnex +adnexal +adnexed +adnexitis +adnexopexy +adnominal +adnominally +adnomination +adnoun +ado +adobe +adolesce +adolescence +adolescency +adolescent +adolescently +Adolph +Adolphus +Adonai +Adonean +Adonia +Adoniad +Adonian +Adonic +adonidin +adonin +Adoniram +Adonis +adonite +adonitol +adonize +adoperate +adoperation +adopt +adoptability +adoptable +adoptant +adoptative +adopted +adoptedly +adoptee +adopter +adoptian +adoptianism +adoptianist +adoption +adoptional +adoptionism +adoptionist +adoptious +adoptive +adoptively +adorability +adorable +adorableness +adorably +adoral +adorally +adorant +Adorantes +adoration +adoratory +adore +adorer +Adoretus +adoringly +adorn +adorner +adorningly +adornment +adosculation +adossed +adoulie +adown +Adoxa +Adoxaceae +adoxaceous +adoxography +adoxy +adoze +adpao +adpress +adpromission +adradial +adradially +adradius +Adramelech +Adrammelech +adread +adream +adreamed +adreamt +adrectal +adrenal +adrenalectomize +adrenalectomy +Adrenalin +adrenaline +adrenalize +adrenalone +adrenergic +adrenin +adrenine +adrenochrome +adrenocortical +adrenocorticotropic +adrenolysis +adrenolytic +adrenotropic +Adrian +Adriana +Adriatic +Adrienne +adrift +adrip +adroit +adroitly +adroitness +adroop +adrop +adrostral +adrowse +adrue +adry +adsbud +adscendent +adscititious +adscititiously +adscript +adscripted +adscription +adscriptitious +adscriptitius +adscriptive +adsessor +adsheart +adsignification +adsignify +adsmith +adsmithing +adsorb +adsorbable +adsorbate +adsorbent +adsorption +adsorptive +adstipulate +adstipulation +adstipulator +adterminal +adtevac +adular +adularescence +adularia +adulate +adulation +adulator +adulatory +adulatress +Adullam +Adullamite +adult +adulter +adulterant +adulterate +adulterately +adulterateness +adulteration +adulterator +adulterer +adulteress +adulterine +adulterize +adulterous +adulterously +adultery +adulthood +adulticidal +adulticide +adultness +adultoid +adumbral +adumbrant +adumbrate +adumbration +adumbrative +adumbratively +adunc +aduncate +aduncated +aduncity +aduncous +adusk +adust +adustion +adustiosis +Advaita +advance +advanceable +advanced +advancedness +advancement +advancer +advancing +advancingly +advancive +advantage +advantageous +advantageously +advantageousness +advection +advectitious +advective +advehent +advene +advenience +advenient +Advent +advential +Adventism +Adventist +adventitia +adventitious +adventitiously +adventitiousness +adventive +adventual +adventure +adventureful +adventurement +adventurer +adventureship +adventuresome +adventuresomely +adventuresomeness +adventuress +adventurish +adventurous +adventurously +adventurousness +adverb +adverbial +adverbiality +adverbialize +adverbially +adverbiation +adversant +adversaria +adversarious +adversary +adversative +adversatively +adverse +adversely +adverseness +adversifoliate +adversifolious +adversity +advert +advertence +advertency +advertent +advertently +advertisable +advertise +advertisee +advertisement +advertiser +advertising +advice +adviceful +advisability +advisable +advisableness +advisably +advisal +advisatory +advise +advised +advisedly +advisedness +advisee +advisement +adviser +advisership +advisive +advisiveness +advisor +advisorily +advisory +advocacy +advocate +advocateship +advocatess +advocation +advocator +advocatory +advocatress +advocatrice +advocatrix +advolution +advowee +advowson +ady +adynamia +adynamic +adynamy +adyta +adyton +adytum +adz +adze +adzer +adzooks +ae +Aeacides +Aeacus +Aeaean +Aechmophorus +aecial +Aecidiaceae +aecidial +aecidioform +Aecidiomycetes +aecidiospore +aecidiostage +aecidium +aeciospore +aeciostage +aecioteliospore +aeciotelium +aecium +aedeagus +Aedes +aedicula +aedile +aedileship +aedilian +aedilic +aedilitian +aedility +aedoeagus +aefald +aefaldness +aefaldy +aefauld +aegagropila +aegagropile +aegagrus +Aegean +aegerian +aegeriid +Aegeriidae +Aegialitis +aegicrania +Aegina +Aeginetan +Aeginetic +Aegipan +aegirine +aegirinolite +aegirite +aegis +Aegisthus +Aegithalos +Aegithognathae +aegithognathism +aegithognathous +Aegle +Aegopodium +aegrotant +aegyptilla +aegyrite +aeluroid +Aeluroidea +aelurophobe +aelurophobia +aeluropodous +aenach +aenean +aeneolithic +aeneous +aenigmatite +aeolharmonica +Aeolia +Aeolian +Aeolic +Aeolicism +aeolid +Aeolidae +Aeolididae +aeolina +aeoline +aeolipile +Aeolis +Aeolism +Aeolist +aeolistic +aeolodicon +aeolodion +aeolomelodicon +aeolopantalon +aeolotropic +aeolotropism +aeolotropy +aeolsklavier +aeon +aeonial +aeonian +aeonist +Aepyceros +Aepyornis +Aepyornithidae +Aepyornithiformes +Aequi +Aequian +Aequiculi +Aequipalpia +aequoreal +aer +aerage +aerarian +aerarium +aerate +aeration +aerator +aerenchyma +aerenterectasia +aerial +aerialist +aeriality +aerially +aerialness +aeric +aerical +Aerides +aerie +aeried +aerifaction +aeriferous +aerification +aeriform +aerify +aero +Aerobacter +aerobate +aerobatic +aerobatics +aerobe +aerobian +aerobic +aerobically +aerobiologic +aerobiological +aerobiologically +aerobiologist +aerobiology +aerobion +aerobiont +aerobioscope +aerobiosis +aerobiotic +aerobiotically +aerobious +aerobium +aeroboat +Aerobranchia +aerobranchiate +aerobus +aerocamera +aerocartograph +Aerocharidae +aerocolpos +aerocraft +aerocurve +aerocyst +aerodermectasia +aerodone +aerodonetic +aerodonetics +aerodrome +aerodromics +aerodynamic +aerodynamical +aerodynamicist +aerodynamics +aerodyne +aeroembolism +aeroenterectasia +aerofoil +aerogel +aerogen +aerogenes +aerogenesis +aerogenic +aerogenically +aerogenous +aerogeologist +aerogeology +aerognosy +aerogram +aerograph +aerographer +aerographic +aerographical +aerographics +aerography +aerogun +aerohydrodynamic +aerohydropathy +aerohydroplane +aerohydrotherapy +aerohydrous +aeroides +aerolite +aerolith +aerolithology +aerolitic +aerolitics +aerologic +aerological +aerologist +aerology +aeromaechanic +aeromancer +aeromancy +aeromantic +aeromarine +aeromechanical +aeromechanics +aerometeorograph +aerometer +aerometric +aerometry +aeromotor +aeronat +aeronaut +aeronautic +aeronautical +aeronautically +aeronautics +aeronautism +aeronef +aeroneurosis +aeropathy +Aerope +aeroperitoneum +aeroperitonia +aerophagia +aerophagist +aerophagy +aerophane +aerophilatelic +aerophilatelist +aerophilately +aerophile +aerophilic +aerophilous +aerophobia +aerophobic +aerophone +aerophor +aerophore +aerophotography +aerophysical +aerophysics +aerophyte +aeroplane +aeroplaner +aeroplanist +aeropleustic +aeroporotomy +aeroscepsis +aeroscepsy +aeroscope +aeroscopic +aeroscopically +aeroscopy +aerose +aerosiderite +aerosiderolite +Aerosol +aerosol +aerosphere +aerosporin +aerostat +aerostatic +aerostatical +aerostatics +aerostation +aerosteam +aerotactic +aerotaxis +aerotechnical +aerotherapeutics +aerotherapy +aerotonometer +aerotonometric +aerotonometry +aerotropic +aerotropism +aeroyacht +aeruginous +aerugo +aery +aes +Aeschylean +Aeschynanthus +Aeschynomene +aeschynomenous +Aesculaceae +aesculaceous +Aesculapian +Aesculapius +Aesculus +Aesopian +Aesopic +aesthete +aesthetic +aesthetical +aesthetically +aesthetician +aestheticism +aestheticist +aestheticize +aesthetics +aesthiology +aesthophysiology +Aestii +aethalioid +aethalium +aetheogam +aetheogamic +aetheogamous +aethered +Aethionema +aethogen +aethrioscope +Aethusa +Aetian +aetiogenic +aetiotropic +aetiotropically +Aetobatidae +Aetobatus +Aetolian +Aetomorphae +aetosaur +aetosaurian +Aetosaurus +aevia +aface +afaint +Afar +afar +afara +afear +afeard +afeared +afebrile +Afenil +afernan +afetal +affa +affability +affable +affableness +affably +affabrous +affair +affaite +affect +affectable +affectate +affectation +affectationist +affected +affectedly +affectedness +affecter +affectibility +affectible +affecting +affectingly +affection +affectional +affectionally +affectionate +affectionately +affectionateness +affectioned +affectious +affective +affectively +affectivity +affeer +affeerer +affeerment +affeir +affenpinscher +affenspalte +afferent +affettuoso +affiance +affiancer +affiant +affidation +affidavit +affidavy +affiliable +affiliate +affiliation +affinal +affination +affine +affined +affinely +affinitative +affinitatively +affinite +affinition +affinitive +affinity +affirm +affirmable +affirmably +affirmance +affirmant +affirmation +affirmative +affirmatively +affirmatory +affirmer +affirmingly +affix +affixal +affixation +affixer +affixion +affixture +afflation +afflatus +afflict +afflicted +afflictedness +afflicter +afflicting +afflictingly +affliction +afflictionless +afflictive +afflictively +affluence +affluent +affluently +affluentness +afflux +affluxion +afforce +afforcement +afford +affordable +afforest +afforestable +afforestation +afforestment +afformative +affranchise +affranchisement +affray +affrayer +affreight +affreighter +affreightment +affricate +affricated +affrication +affricative +affright +affrighted +affrightedly +affrighter +affrightful +affrightfully +affrightingly +affrightment +affront +affronte +affronted +affrontedly +affrontedness +affronter +affronting +affrontingly +affrontingness +affrontive +affrontiveness +affrontment +affuse +affusion +affy +Afghan +afghani +afield +Afifi +afikomen +afire +aflagellar +aflame +aflare +aflat +aflaunt +aflicker +aflight +afloat +aflow +aflower +afluking +aflush +aflutter +afoam +afoot +afore +aforehand +aforenamed +aforesaid +aforethought +aforetime +aforetimes +afortiori +afoul +afraid +afraidness +Aframerican +Afrasia +Afrasian +afreet +afresh +afret +Afric +African +Africana +Africanism +Africanist +Africanization +Africanize +Africanoid +Africanthropus +Afridi +Afrikaans +Afrikander +Afrikanderdom +Afrikanderism +Afrikaner +Afrogaea +Afrogaean +afront +afrown +Afshah +Afshar +aft +aftaba +after +afteract +afterage +afterattack +afterband +afterbeat +afterbirth +afterblow +afterbody +afterbrain +afterbreach +afterbreast +afterburner +afterburning +aftercare +aftercareer +aftercast +aftercataract +aftercause +afterchance +afterchrome +afterchurch +afterclap +afterclause +aftercome +aftercomer +aftercoming +aftercooler +aftercost +aftercourse +aftercrop +aftercure +afterdamp +afterdate +afterdays +afterdeck +afterdinner +afterdrain +afterdrops +aftereffect +afterend +aftereye +afterfall +afterfame +afterfeed +afterfermentation +afterform +afterfriend +afterfruits +afterfuture +aftergame +aftergas +afterglide +afterglow +aftergo +aftergood +aftergrass +aftergrave +aftergrief +aftergrind +aftergrowth +afterguard +afterguns +afterhand +afterharm +afterhatch +afterhelp +afterhend +afterhold +afterhope +afterhours +afterimage +afterimpression +afterings +afterking +afterknowledge +afterlife +afterlifetime +afterlight +afterloss +afterlove +aftermark +aftermarriage +aftermass +aftermast +aftermath +aftermatter +aftermeal +aftermilk +aftermost +afternight +afternoon +afternoons +afternose +afternote +afteroar +afterpain +afterpart +afterpast +afterpeak +afterpiece +afterplanting +afterplay +afterpressure +afterproof +afterrake +afterreckoning +afterrider +afterripening +afterroll +afterschool +aftersend +aftersensation +aftershaft +aftershafted +aftershine +aftership +aftershock +aftersong +aftersound +afterspeech +afterspring +afterstain +afterstate +afterstorm +afterstrain +afterstretch +afterstudy +afterswarm +afterswarming +afterswell +aftertan +aftertask +aftertaste +afterthinker +afterthought +afterthoughted +afterthrift +aftertime +aftertimes +aftertouch +aftertreatment +aftertrial +afterturn +aftervision +afterwale +afterwar +afterward +afterwards +afterwash +afterwhile +afterwisdom +afterwise +afterwit +afterwitted +afterwork +afterworking +afterworld +afterwrath +afterwrist +aftmost +Aftonian +aftosa +aftward +aftwards +afunction +afunctional +afwillite +Afzelia +aga +agabanee +agacante +agacella +Agaces +Agade +Agag +again +against +againstand +agal +agalactia +agalactic +agalactous +agalawood +agalaxia +agalaxy +Agalena +Agalenidae +Agalinis +agalite +agalloch +agallochum +agallop +agalma +agalmatolite +agalwood +Agama +agama +Agamae +Agamemnon +agamete +agami +agamian +agamic +agamically +agamid +Agamidae +agamobium +agamogenesis +agamogenetic +agamogenetically +agamogony +agamoid +agamont +agamospore +agamous +agamy +aganglionic +Aganice +Aganippe +Agao +Agaonidae +Agapanthus +agape +Agapemone +Agapemonian +Agapemonist +Agapemonite +agapetae +agapeti +agapetid +Agapetidae +Agapornis +agar +agaric +agaricaceae +agaricaceous +Agaricales +agaricic +agariciform +agaricin +agaricine +agaricoid +Agaricus +Agaristidae +agarita +Agarum +agarwal +agasp +Agastache +Agastreae +agastric +agastroneuria +agate +agateware +Agatha +Agathaea +Agathaumas +agathin +Agathis +agathism +agathist +agathodaemon +agathodaemonic +agathokakological +agathology +Agathosma +agatiferous +agatiform +agatine +agatize +agatoid +agaty +Agau +Agave +agavose +Agawam +Agaz +agaze +agazed +Agdistis +age +aged +agedly +agedness +agee +Agelacrinites +Agelacrinitidae +Agelaius +Agelaus +ageless +agelessness +agelong +agen +Agena +agency +agenda +agendum +agenesia +agenesic +agenesis +agennetic +agent +agentess +agential +agentival +agentive +agentry +agentship +ageometrical +ager +Ageratum +ageusia +ageusic +ageustia +agger +aggerate +aggeration +aggerose +Aggie +agglomerant +agglomerate +agglomerated +agglomeratic +agglomeration +agglomerative +agglomerator +agglutinability +agglutinable +agglutinant +agglutinate +agglutination +agglutinationist +agglutinative +agglutinator +agglutinin +agglutinize +agglutinogen +agglutinogenic +agglutinoid +agglutinoscope +agglutogenic +aggradation +aggradational +aggrade +aggrandizable +aggrandize +aggrandizement +aggrandizer +aggrate +aggravate +aggravating +aggravatingly +aggravation +aggravative +aggravator +aggregable +aggregant +Aggregata +Aggregatae +aggregate +aggregately +aggregateness +aggregation +aggregative +aggregator +aggregatory +aggress +aggressin +aggression +aggressionist +aggressive +aggressively +aggressiveness +aggressor +aggrievance +aggrieve +aggrieved +aggrievedly +aggrievedness +aggrievement +aggroup +aggroupment +aggry +aggur +agha +Aghan +aghanee +aghast +aghastness +Aghlabite +Aghorapanthi +Aghori +Agialid +Agib +Agiel +agilawood +agile +agilely +agileness +agility +agillawood +aging +agio +agiotage +agist +agistator +agistment +agistor +agitable +agitant +agitate +agitatedly +agitation +agitational +agitationist +agitative +agitator +agitatorial +agitatrix +agitprop +Agkistrodon +agla +Aglaia +aglance +Aglaonema +Aglaos +aglaozonia +aglare +Aglaspis +Aglauros +agleaf +agleam +aglet +aglethead +agley +aglimmer +aglint +Aglipayan +Aglipayano +aglitter +aglobulia +Aglossa +aglossal +aglossate +aglossia +aglow +aglucon +aglutition +aglycosuric +Aglypha +aglyphodont +Aglyphodonta +Aglyphodontia +aglyphous +agmatine +agmatology +agminate +agminated +agnail +agname +agnamed +agnate +Agnatha +agnathia +agnathic +Agnathostomata +agnathostomatous +agnathous +agnatic +agnatically +agnation +agnel +Agnes +agnification +agnize +Agnoetae +Agnoete +Agnoetism +agnoiology +Agnoite +agnomen +agnomical +agnominal +agnomination +agnosia +agnosis +agnostic +agnostically +agnosticism +Agnostus +agnosy +Agnotozoic +agnus +ago +agog +agoge +agogic +agogics +agoho +agoing +agomensin +agomphiasis +agomphious +agomphosis +agon +agonal +agone +agoniada +agoniadin +agoniatite +Agoniatites +agonic +agonied +agonist +Agonista +agonistarch +agonistic +agonistically +agonistics +agonium +agonize +agonizedly +agonizer +agonizingly +Agonostomus +agonothete +agonothetic +agony +agora +agoranome +agoraphobia +agouara +agouta +agouti +agpaite +agpaitic +Agra +agraffee +agrah +agral +agrammatical +agrammatism +Agrania +agranulocyte +agranulocytosis +agranuloplastic +Agrapha +agraphia +agraphic +agrarian +agrarianism +agrarianize +agrarianly +Agrauleum +agre +agree +agreeability +agreeable +agreeableness +agreeably +agreed +agreeing +agreeingly +agreement +agreer +agregation +agrege +agrestal +agrestial +agrestian +agrestic +agria +agricere +agricole +agricolist +agricolite +agricolous +agricultor +agricultural +agriculturalist +agriculturally +agriculture +agriculturer +agriculturist +Agrilus +Agrimonia +agrimony +agrimotor +agrin +Agriochoeridae +Agriochoerus +agriological +agriologist +agriology +Agrionia +agrionid +Agrionidae +Agriotes +Agriotypidae +Agriotypus +agrise +agrito +agroan +agrobiologic +agrobiological +agrobiologically +agrobiologist +agrobiology +agrogeological +agrogeologically +agrogeology +agrologic +agrological +agrologically +agrology +agrom +Agromyza +agromyzid +Agromyzidae +agronome +agronomial +agronomic +agronomical +agronomics +agronomist +agronomy +agroof +agrope +Agropyron +Agrostemma +agrosteral +Agrostis +agrostographer +agrostographic +agrostographical +agrostography +agrostologic +agrostological +agrostologist +agrostology +agrotechny +Agrotis +aground +agrufe +agruif +agrypnia +agrypnotic +agsam +agua +aguacate +Aguacateca +aguavina +Agudist +ague +aguelike +agueproof +agueweed +aguey +aguilarite +aguilawood +aguinaldo +aguirage +aguish +aguishly +aguishness +agunah +agush +agust +agy +Agyieus +agynarious +agynary +agynous +agyrate +agyria +Ah +ah +aha +ahaaina +ahankara +Ahantchuyuk +ahartalav +ahaunch +ahead +aheap +ahem +Ahepatokla +Ahet +ahey +ahimsa +ahind +ahint +Ahir +ahluwalia +ahmadi +Ahmadiya +Ahmed +Ahmet +Ahnfeltia +aho +Ahom +ahong +ahorse +ahorseback +Ahousaht +ahoy +Ahrendahronon +Ahriman +Ahrimanian +ahsan +Aht +Ahtena +ahu +ahuatle +ahuehuete +ahull +ahum +ahungered +ahungry +ahunt +ahura +ahush +ahwal +ahypnia +ai +Aias +Aiawong +aichmophobia +aid +aidable +aidance +aidant +aide +Aidenn +aider +Aides +aidful +aidless +aiel +aigialosaur +Aigialosauridae +Aigialosaurus +aiglet +aigremore +aigrette +aiguille +aiguillesque +aiguillette +aiguilletted +aikinite +ail +ailantery +ailanthic +Ailanthus +ailantine +ailanto +aile +Aileen +aileron +ailette +Ailie +ailing +aillt +ailment +ailsyte +Ailuridae +ailuro +ailuroid +Ailuroidea +Ailuropoda +Ailuropus +Ailurus +ailweed +aim +Aimak +aimara +Aimee +aimer +aimful +aimfully +aiming +aimless +aimlessly +aimlessness +Aimore +aimworthiness +ainaleh +ainhum +ainoi +ainsell +aint +Ainu +aion +aionial +air +Aira +airable +airampo +airan +airbound +airbrained +airbrush +aircraft +aircraftman +aircraftsman +aircraftswoman +aircraftwoman +aircrew +aircrewman +airdock +airdrome +airdrop +aire +Airedale +airedale +airer +airfield +airfoil +airframe +airfreight +airfreighter +airgraphics +airhead +airiferous +airified +airily +airiness +airing +airish +airless +airlift +airlike +airliner +airmail +airman +airmanship +airmark +airmarker +airmonger +airohydrogen +airometer +airpark +airphobia +airplane +airplanist +airport +airproof +airscape +airscrew +airship +airsick +airsickness +airstrip +airt +airtight +airtightly +airtightness +airward +airwards +airway +airwayman +airwoman +airworthiness +airworthy +airy +aischrolatreia +aiseweed +aisle +aisled +aisleless +aisling +Aissaoua +Aissor +aisteoir +Aistopoda +Aistopodes +ait +aitch +aitchbone +aitchless +aitchpiece +aitesis +aithochroi +aition +aitiotropic +Aitkenite +Aitutakian +aiwan +Aix +aizle +Aizoaceae +aizoaceous +Aizoon +Ajaja +ajaja +ajangle +ajar +ajari +Ajatasatru +ajava +ajhar +ajivika +ajog +ajoint +ajowan +Ajuga +ajutment +ak +Aka +aka +Akal +akala +Akali +akalimba +akamatsu +Akamnik +Akan +Akanekunik +Akania +Akaniaceae +akaroa +akasa +Akawai +akazga +akazgine +akcheh +ake +akeake +akebi +Akebia +akee +akeki +akeley +akenobeite +akepiro +akerite +akey +Akha +Akhissar +Akhlame +Akhmimic +akhoond +akhrot +akhyana +akia +Akim +akimbo +akin +akindle +akinesia +akinesic +akinesis +akinete +akinetic +Akiskemikinik +Akiyenik +Akka +Akkad +Akkadian +Akkadist +akmudar +akmuddar +aknee +ako +akoasm +akoasma +akoluthia +akonge +Akontae +Akoulalion +akov +akpek +Akra +akra +Akrabattine +akroasis +akrochordite +akroterion +Aktistetae +Aktistete +Aktivismus +Aktivist +aku +akuammine +akule +akund +Akwapim +Al +al +ala +Alabama +Alabaman +Alabamian +alabamide +alabamine +alabandite +alabarch +alabaster +alabastos +alabastrian +alabastrine +alabastrites +alabastron +alabastrum +alacha +alack +alackaday +alacreatine +alacreatinine +alacrify +alacritous +alacrity +Alactaga +alada +Aladdin +Aladdinize +Aladfar +Aladinist +alaihi +Alain +alaite +Alaki +Alala +alala +alalite +alalonga +alalunga +alalus +Alamanni +Alamannian +Alamannic +alameda +alamo +alamodality +alamonti +alamosite +alamoth +Alan +alan +aland +Alangiaceae +alangin +alangine +Alangium +alani +alanine +alannah +Alans +alantic +alantin +alantol +alantolactone +alantolic +alanyl +alar +Alarbus +alares +Alaria +Alaric +alarm +alarmable +alarmed +alarmedly +alarming +alarmingly +alarmism +alarmist +Alarodian +alarum +alary +alas +Alascan +Alaska +alaskaite +Alaskan +alaskite +Alastair +Alaster +alastrim +alate +alated +alatern +alaternus +alation +Alauda +Alaudidae +alaudine +Alaunian +Alawi +Alb +alb +alba +albacore +albahaca +Albainn +Alban +alban +Albanenses +Albanensian +Albania +Albanian +albanite +Albany +albarco +albardine +albarello +albarium +albaspidin +albata +Albatros +albatross +albe +albedo +albedograph +albee +albeit +Alberene +Albert +Alberta +albertin +Albertina +Albertine +Albertinian +Albertist +albertite +Alberto +albertustaler +albertype +albescence +albescent +albespine +albetad +Albi +Albian +albicans +albicant +albication +albiculi +albification +albificative +albiflorous +albify +Albigenses +Albigensian +Albigensianism +Albin +albinal +albiness +albinic +albinism +albinistic +albino +albinoism +albinotic +albinuria +Albion +Albireo +albite +albitic +albitite +albitization +albitophyre +Albizzia +albocarbon +albocinereous +Albococcus +albocracy +Alboin +albolite +albolith +albopannin +albopruinose +alboranite +Albrecht +Albright +albronze +Albruna +Albuca +Albuginaceae +albuginea +albugineous +albuginitis +albugo +album +albumean +albumen +albumenization +albumenize +albumenizer +albumimeter +albumin +albuminate +albuminaturia +albuminiferous +albuminiform +albuminimeter +albuminimetry +albuminiparous +albuminization +albuminize +albuminocholia +albuminofibrin +albuminogenous +albuminoid +albuminoidal +albuminolysis +albuminometer +albuminometry +albuminone +albuminorrhea +albuminoscope +albuminose +albuminosis +albuminous +albuminousness +albuminuria +albuminuric +albumoid +albumoscope +albumose +albumosuria +alburn +alburnous +alburnum +albus +albutannin +Albyn +Alca +Alcaaba +Alcae +Alcaic +alcaide +alcalde +alcaldeship +alcaldia +Alcaligenes +alcalizate +Alcalzar +alcamine +alcanna +Alcantara +Alcantarines +alcarraza +alcatras +alcazar +Alcedines +Alcedinidae +Alcedininae +Alcedo +alcelaphine +Alcelaphus +Alces +alchemic +alchemical +alchemically +Alchemilla +alchemist +alchemistic +alchemistical +alchemistry +alchemize +alchemy +alchera +alcheringa +alchimy +alchitran +alchochoden +Alchornea +alchymy +Alcibiadean +Alcicornium +Alcidae +alcidine +alcine +Alcippe +alclad +alco +alcoate +alcogel +alcogene +alcohate +alcohol +alcoholate +alcoholature +alcoholdom +alcoholemia +alcoholic +alcoholically +alcoholicity +alcoholimeter +alcoholism +alcoholist +alcoholizable +alcoholization +alcoholize +alcoholmeter +alcoholmetric +alcoholomania +alcoholometer +alcoholometric +alcoholometrical +alcoholometry +alcoholophilia +alcoholuria +alcoholysis +alcoholytic +Alcor +Alcoran +Alcoranic +Alcoranist +alcornoco +alcornoque +alcosol +Alcotate +alcove +alcovinometer +Alcuinian +alcyon +Alcyonacea +alcyonacean +Alcyonaria +alcyonarian +Alcyone +Alcyones +Alcyoniaceae +alcyonic +alcyoniform +Alcyonium +alcyonoid +aldamine +aldane +aldazin +aldazine +aldeament +Aldebaran +aldebaranium +aldehol +aldehydase +aldehyde +aldehydic +aldehydine +aldehydrol +alder +Alderamin +alderman +aldermanate +aldermancy +aldermaness +aldermanic +aldermanical +aldermanity +aldermanlike +aldermanly +aldermanry +aldermanship +aldern +Alderney +alderwoman +Aldhafara +Aldhafera +aldim +aldime +aldimine +Aldine +aldine +aldoheptose +aldohexose +aldoketene +aldol +aldolization +aldolize +aldononose +aldopentose +aldose +aldoside +aldoxime +Aldrovanda +Aldus +ale +Alea +aleak +aleatory +alebench +aleberry +Alebion +alec +alecithal +alecize +Aleck +aleconner +alecost +Alectoria +alectoria +Alectorides +alectoridine +alectorioid +Alectoris +alectoromachy +alectoromancy +Alectoromorphae +alectoromorphous +Alectoropodes +alectoropodous +Alectrion +Alectrionidae +alectryomachy +alectryomancy +Alectryon +alecup +alee +alef +alefnull +aleft +alefzero +alegar +alehoof +alehouse +Alejandro +alem +alemana +Alemanni +Alemannian +Alemannic +Alemannish +alembic +alembicate +alembroth +Alemite +alemite +alemmal +alemonger +alen +Alencon +Aleochara +aleph +alephs +alephzero +alepidote +alepole +alepot +Aleppine +Aleppo +alerce +alerse +alert +alertly +alertness +alesan +alestake +aletap +aletaster +Alethea +alethiology +alethopteis +alethopteroid +alethoscope +aletocyte +Aletris +alette +aleukemic +Aleurites +aleuritic +Aleurobius +Aleurodes +Aleurodidae +aleuromancy +aleurometer +aleuronat +aleurone +aleuronic +aleuroscope +Aleut +Aleutian +Aleutic +aleutite +alevin +alewife +Alex +Alexander +alexanders +Alexandra +Alexandreid +Alexandrian +Alexandrianism +Alexandrina +Alexandrine +alexandrite +Alexas +Alexia +alexia +Alexian +alexic +alexin +alexinic +alexipharmacon +alexipharmacum +alexipharmic +alexipharmical +alexipyretic +Alexis +alexiteric +alexiterical +Alexius +aleyard +Aleyrodes +aleyrodid +Aleyrodidae +Alf +alf +alfa +alfaje +alfalfa +alfaqui +alfaquin +alfenide +alfet +alfilaria +alfileria +alfilerilla +alfilerillo +alfiona +Alfirk +alfonsin +alfonso +alforja +Alfred +Alfreda +alfresco +alfridaric +alfridary +Alfur +Alfurese +Alfuro +alga +algae +algaecide +algaeological +algaeologist +algaeology +algaesthesia +algaesthesis +algal +algalia +Algaroth +algarroba +algarrobilla +algarrobin +Algarsife +Algarsyf +algate +Algebar +algebra +algebraic +algebraical +algebraically +algebraist +algebraization +algebraize +Algedi +algedo +algedonic +algedonics +algefacient +Algenib +Algerian +Algerine +algerine +Algernon +algesia +algesic +algesis +algesthesis +algetic +Algic +algic +algid +algidity +algidness +Algieba +algific +algin +alginate +algine +alginic +alginuresis +algiomuscular +algist +algivorous +algocyan +algodoncillo +algodonite +algoesthesiometer +algogenic +algoid +Algol +algolagnia +algolagnic +algolagnist +algolagny +algological +algologist +algology +Algoman +algometer +algometric +algometrical +algometrically +algometry +Algomian +Algomic +Algonkian +Algonquian +Algonquin +algophilia +algophilist +algophobia +algor +Algorab +Algores +algorism +algorismic +algorist +algoristic +algorithm +algorithmic +algosis +algous +algovite +algraphic +algraphy +alguazil +algum +Algy +Alhagi +Alhambra +Alhambraic +Alhambresque +Alhena +alhenna +alias +Alibamu +alibangbang +alibi +alibility +alible +Alicant +Alice +alichel +Alichino +Alicia +Alick +alicoche +alictisal +alicyclic +Alida +alidade +Alids +alien +alienability +alienable +alienage +alienate +alienation +alienator +aliency +alienee +aliener +alienicola +alienigenate +alienism +alienist +alienize +alienor +alienship +aliethmoid +aliethmoidal +alif +aliferous +aliform +aligerous +alight +align +aligner +alignment +aligreek +aliipoe +alike +alikeness +alikewise +Alikuluf +Alikulufan +alilonghi +alima +aliment +alimental +alimentally +alimentariness +alimentary +alimentation +alimentative +alimentatively +alimentativeness +alimenter +alimentic +alimentive +alimentiveness +alimentotherapy +alimentum +alimonied +alimony +alin +alinasal +Aline +alineation +alintatao +aliofar +Alioth +alipata +aliped +aliphatic +alipterion +aliptes +aliptic +aliquant +aliquot +aliseptal +alish +alisier +Alisma +Alismaceae +alismaceous +alismad +alismal +Alismales +Alismataceae +alismoid +aliso +Alison +alison +alisonite +alisp +alisphenoid +alisphenoidal +alist +Alister +alit +alite +alitrunk +aliturgic +aliturgical +aliunde +alive +aliveness +alivincular +Alix +aliyah +alizarate +alizari +alizarin +aljoba +alk +alkahest +alkahestic +alkahestica +alkahestical +Alkaid +alkalamide +alkalemia +alkalescence +alkalescency +alkalescent +alkali +alkalic +alkaliferous +alkalifiable +alkalify +alkaligen +alkaligenous +alkalimeter +alkalimetric +alkalimetrical +alkalimetrically +alkalimetry +alkaline +alkalinity +alkalinization +alkalinize +alkalinuria +alkalizable +alkalizate +alkalization +alkalize +alkalizer +alkaloid +alkaloidal +alkalometry +alkalosis +alkalous +Alkalurops +alkamin +alkamine +alkane +alkanet +Alkanna +alkannin +Alkaphrah +alkapton +alkaptonuria +alkaptonuric +alkargen +alkarsin +alkekengi +alkene +alkenna +alkenyl +alkermes +Alkes +alkide +alkine +alkool +Alkoran +Alkoranic +alkoxide +alkoxy +alkoxyl +alky +alkyd +alkyl +alkylamine +alkylate +alkylation +alkylene +alkylic +alkylidene +alkylize +alkylogen +alkyloxy +alkyne +all +allabuta +allactite +allaeanthus +allagite +allagophyllous +allagostemonous +Allah +allalinite +Allamanda +allamotti +Allan +allan +allanite +allanitic +allantiasis +allantochorion +allantoic +allantoid +allantoidal +Allantoidea +allantoidean +allantoidian +allantoin +allantoinase +allantoinuria +allantois +allantoxaidin +allanturic +Allasch +allassotonic +allative +allatrate +allay +allayer +allayment +allbone +Alle +allecret +allectory +allegate +allegation +allegator +allege +allegeable +allegedly +allegement +alleger +Alleghenian +Allegheny +allegiance +allegiancy +allegiant +allegoric +allegorical +allegorically +allegoricalness +allegorism +allegorist +allegorister +allegoristic +allegorization +allegorize +allegorizer +allegory +allegretto +allegro +allele +allelic +allelism +allelocatalytic +allelomorph +allelomorphic +allelomorphism +allelotropic +allelotropism +allelotropy +alleluia +alleluiatic +allemand +allemande +allemontite +Allen +allenarly +allene +Allentiac +Allentiacan +aller +allergen +allergenic +allergia +allergic +allergin +allergist +allergy +allerion +allesthesia +alleviate +alleviatingly +alleviation +alleviative +alleviator +alleviatory +alley +alleyed +alleyite +alleyway +allgood +Allhallow +Allhallowtide +allheal +alliable +alliably +Alliaceae +alliaceous +alliance +alliancer +Alliaria +allicampane +allice +allicholly +alliciency +allicient +Allie +allied +Allies +allies +alligate +alligator +alligatored +allineate +allineation +Allionia +Allioniaceae +allision +alliteral +alliterate +alliteration +alliterational +alliterationist +alliterative +alliteratively +alliterativeness +alliterator +Allium +allivalite +allmouth +allness +Allobroges +allocable +allocaffeine +allocatable +allocate +allocatee +allocation +allocator +allochetia +allochetite +allochezia +allochiral +allochirally +allochiria +allochlorophyll +allochroic +allochroite +allochromatic +allochroous +allochthonous +allocinnamic +alloclase +alloclasite +allocochick +allocrotonic +allocryptic +allocute +allocution +allocutive +allocyanine +allodelphite +allodesmism +alloeosis +alloeostropha +alloeotic +alloerotic +alloerotism +allogamous +allogamy +allogene +allogeneity +allogeneous +allogenic +allogenically +allograph +alloiogenesis +alloisomer +alloisomeric +alloisomerism +allokinesis +allokinetic +allokurtic +allomerism +allomerous +allometric +allometry +allomorph +allomorphic +allomorphism +allomorphite +allomucic +allonomous +allonym +allonymous +allopalladium +allopath +allopathetic +allopathetically +allopathic +allopathically +allopathist +allopathy +allopatric +allopatrically +allopatry +allopelagic +allophanamide +allophanates +allophane +allophanic +allophone +allophyle +allophylian +allophylic +Allophylus +allophytoid +alloplasm +alloplasmatic +alloplasmic +alloplast +alloplastic +alloplasty +alloploidy +allopolyploid +allopsychic +alloquial +alloquialism +alloquy +allorhythmia +allorrhyhmia +allorrhythmic +allosaur +Allosaurus +allose +allosematic +allosome +allosyndesis +allosyndetic +allot +allotee +allotelluric +allotheism +Allotheria +allothigene +allothigenetic +allothigenetically +allothigenic +allothigenous +allothimorph +allothimorphic +allothogenic +allothogenous +allotment +allotriodontia +Allotriognathi +allotriomorphic +allotriophagia +allotriophagy +allotriuria +allotrope +allotrophic +allotropic +allotropical +allotropically +allotropicity +allotropism +allotropize +allotropous +allotropy +allotrylic +allottable +allottee +allotter +allotype +allotypical +allover +allow +allowable +allowableness +allowably +allowance +allowedly +allower +alloxan +alloxanate +alloxanic +alloxantin +alloxuraemia +alloxuremia +alloxuric +alloxyproteic +alloy +alloyage +allozooid +allseed +allspice +allthing +allthorn +alltud +allude +allure +allurement +allurer +alluring +alluringly +alluringness +allusion +allusive +allusively +allusiveness +alluvia +alluvial +alluviate +alluviation +alluvion +alluvious +alluvium +allwhere +allwhither +allwork +Allworthy +Ally +ally +allyl +allylamine +allylate +allylation +allylene +allylic +allylthiourea +Alma +alma +Almach +almaciga +almacigo +almadia +almadie +almagest +almagra +Almain +Alman +almanac +almandine +almandite +alme +almeidina +almemar +Almerian +almeriite +Almida +almightily +almightiness +almighty +almique +Almira +almirah +almochoden +Almohad +Almohade +Almohades +almoign +Almon +almon +almond +almondy +almoner +almonership +almonry +Almoravid +Almoravide +Almoravides +almost +almous +alms +almsdeed +almsfolk +almsful +almsgiver +almsgiving +almshouse +almsman +almswoman +almucantar +almuce +almud +almude +almug +Almuredin +almuten +aln +alnage +alnager +alnagership +Alnaschar +Alnascharism +alnein +alnico +Alnilam +alniresinol +Alnitak +Alnitham +alniviridol +alnoite +alnuin +Alnus +alo +Aloadae +Alocasia +alochia +alod +alodial +alodialism +alodialist +alodiality +alodially +alodian +alodiary +alodification +alodium +alody +aloe +aloed +aloelike +aloemodin +aloeroot +aloesol +aloeswood +aloetic +aloetical +aloewood +aloft +alogia +Alogian +alogical +alogically +alogism +alogy +aloid +aloin +Alois +aloisiite +aloma +alomancy +alone +aloneness +along +alongshore +alongshoreman +alongside +alongst +Alonso +Alonsoa +Alonzo +aloof +aloofly +aloofness +aloose +alop +alopecia +Alopecias +alopecist +alopecoid +Alopecurus +alopeke +Alopias +Alopiidae +Alosa +alose +Alouatta +alouatte +aloud +alow +alowe +Aloxite +Aloysia +Aloysius +alp +alpaca +alpasotes +Alpax +alpeen +Alpen +alpenglow +alpenhorn +alpenstock +alpenstocker +alpestral +alpestrian +alpestrine +alpha +alphabet +alphabetarian +alphabetic +alphabetical +alphabetically +alphabetics +alphabetiform +alphabetism +alphabetist +alphabetization +alphabetize +alphabetizer +Alphard +alphatoluic +Alphean +Alphecca +alphenic +Alpheratz +alphitomancy +alphitomorphous +alphol +Alphonist +Alphonse +Alphonsine +Alphonsism +Alphonso +alphorn +alphos +alphosis +alphyl +Alpian +Alpid +alpieu +alpigene +Alpine +alpine +alpinely +alpinery +alpinesque +Alpinia +Alpiniaceae +Alpinism +Alpinist +alpist +Alpujarra +alqueire +alquier +alquifou +alraun +alreadiness +already +alright +alrighty +alroot +alruna +Alsatia +Alsatian +alsbachite +Alshain +Alsinaceae +alsinaceous +Alsine +also +alsoon +Alsophila +Alstonia +alstonidine +alstonine +alstonite +Alstroemeria +alsweill +alt +Altaian +Altaic +Altaid +Altair +altaite +Altamira +altar +altarage +altared +altarist +altarlet +altarpiece +altarwise +altazimuth +alter +alterability +alterable +alterableness +alterably +alterant +alterate +alteration +alterative +altercate +altercation +altercative +alteregoism +alteregoistic +alterer +alterity +altern +alternacy +alternance +alternant +Alternanthera +Alternaria +alternariose +alternate +alternately +alternateness +alternating +alternatingly +alternation +alternationist +alternative +alternatively +alternativeness +alternativity +alternator +alterne +alternifoliate +alternipetalous +alternipinnate +alternisepalous +alternize +alterocentric +Althaea +althaein +Althea +althea +althein +altheine +althionic +altho +althorn +although +Altica +Alticamelus +altigraph +altilik +altiloquence +altiloquent +altimeter +altimetrical +altimetrically +altimetry +altin +altincar +Altingiaceae +altingiaceous +altininck +altiplano +altiscope +altisonant +altisonous +altissimo +altitude +altitudinal +altitudinarian +alto +altogether +altogetherness +altometer +altoun +altrices +altricial +altropathy +altrose +altruism +altruist +altruistic +altruistically +altschin +altun +Aluco +Aluconidae +Aluconinae +aludel +Aludra +alula +alular +alulet +Alulim +alum +alumbloom +Alumel +alumic +alumiferous +alumina +aluminaphone +aluminate +alumine +aluminic +aluminide +aluminiferous +aluminiform +aluminish +aluminite +aluminium +aluminize +aluminoferric +aluminographic +aluminography +aluminose +aluminosilicate +aluminosis +aluminosity +aluminothermic +aluminothermics +aluminothermy +aluminotype +aluminous +aluminum +aluminyl +alumish +alumite +alumium +alumna +alumnae +alumnal +alumni +alumniate +Alumnol +alumnus +alumohydrocalcite +alumroot +Alundum +aluniferous +alunite +alunogen +alupag +Alur +alure +alurgite +alushtite +aluta +alutaceous +Alvah +Alvan +alvar +alvearium +alveary +alveloz +alveola +alveolar +alveolariform +alveolary +alveolate +alveolated +alveolation +alveole +alveolectomy +alveoli +alveoliform +alveolite +Alveolites +alveolitis +alveoloclasia +alveolocondylean +alveolodental +alveololabial +alveololingual +alveolonasal +alveolosubnasal +alveolotomy +alveolus +alveus +alviducous +Alvin +Alvina +alvine +Alvissmal +alvite +alvus +alway +always +aly +Alya +alycompaine +alymphia +alymphopotent +alypin +alysson +Alyssum +alytarch +Alytes +am +ama +amaas +Amabel +amability +amacratic +amacrinal +amacrine +amadavat +amadelphous +Amadi +Amadis +amadou +Amaethon +Amafingo +amaga +amah +Amahuaca +amain +amaister +amakebe +Amakosa +amala +amalaita +amalaka +Amalfian +Amalfitan +amalgam +amalgamable +amalgamate +amalgamation +amalgamationist +amalgamative +amalgamatize +amalgamator +amalgamist +amalgamization +amalgamize +Amalings +Amalrician +amaltas +amamau +Amampondo +Amanda +amandin +Amandus +amang +amani +amania +Amanist +Amanita +amanitin +amanitine +Amanitopsis +amanori +amanous +amantillo +amanuenses +amanuensis +amapa +Amapondo +amar +Amara +Amarantaceae +amarantaceous +amaranth +Amaranthaceae +amaranthaceous +amaranthine +amaranthoid +Amaranthus +amarantite +Amarantus +amarelle +amarevole +amargoso +amarillo +amarin +amarine +amaritude +amarity +amaroid +amaroidal +Amarth +amarthritis +amaryllid +Amaryllidaceae +amaryllidaceous +amaryllideous +Amaryllis +amasesis +amass +amassable +amasser +amassment +Amasta +amasthenic +amastia +amasty +Amatembu +amaterialistic +amateur +amateurish +amateurishly +amateurishness +amateurism +amateurship +Amati +amative +amatively +amativeness +amatol +amatorial +amatorially +amatorian +amatorious +amatory +amatrice +amatungula +amaurosis +amaurotic +amaze +amazed +amazedly +amazedness +amazeful +amazement +amazia +Amazilia +amazing +amazingly +Amazon +Amazona +Amazonian +Amazonism +amazonite +Amazulu +amba +ambage +ambagiosity +ambagious +ambagiously +ambagiousness +ambagitory +ambalam +amban +ambar +ambaree +ambarella +ambary +ambash +ambassade +Ambassadeur +ambassador +ambassadorial +ambassadorially +ambassadorship +ambassadress +ambassage +ambassy +ambatch +ambatoarinite +ambay +ambeer +amber +amberfish +ambergris +amberiferous +amberite +amberoid +amberous +ambery +ambicolorate +ambicoloration +ambidexter +ambidexterity +ambidextral +ambidextrous +ambidextrously +ambidextrousness +ambience +ambiency +ambiens +ambient +ambier +ambigenous +ambiguity +ambiguous +ambiguously +ambiguousness +ambilateral +ambilateralaterally +ambilaterality +ambilevous +ambilian +ambilogy +ambiopia +ambiparous +ambisinister +ambisinistrous +ambisporangiate +ambisyllabic +ambit +ambital +ambitendency +ambition +ambitionist +ambitionless +ambitionlessly +ambitious +ambitiously +ambitiousness +ambitty +ambitus +ambivalence +ambivalency +ambivalent +ambivert +amble +ambler +ambling +amblingly +amblotic +amblyacousia +amblyaphia +Amblycephalidae +Amblycephalus +amblychromatic +Amblydactyla +amblygeusia +amblygon +amblygonal +amblygonite +amblyocarpous +Amblyomma +amblyope +amblyopia +amblyopic +Amblyopsidae +Amblyopsis +amblyoscope +amblypod +Amblypoda +amblypodous +Amblyrhynchus +amblystegite +Amblystoma +ambo +amboceptoid +amboceptor +Ambocoelia +Amboina +Amboinese +ambomalleal +ambon +ambonite +Ambonnay +ambos +ambosexous +ambosexual +ambrain +ambrein +ambrette +Ambrica +ambrite +ambroid +ambrology +Ambrose +ambrose +ambrosia +ambrosiac +Ambrosiaceae +ambrosiaceous +ambrosial +ambrosially +Ambrosian +ambrosian +ambrosiate +ambrosin +ambrosine +Ambrosio +ambrosterol +ambrotype +ambry +ambsace +ambulacral +ambulacriform +ambulacrum +ambulance +ambulancer +ambulant +ambulate +ambulatio +ambulation +ambulative +ambulator +Ambulatoria +ambulatorial +ambulatorium +ambulatory +ambuling +ambulomancy +amburbial +ambury +ambuscade +ambuscader +ambush +ambusher +ambushment +Ambystoma +Ambystomidae +amchoor +ame +amebiform +Amedeo +ameed +ameen +Ameiuridae +Ameiurus +Ameiva +Amelanchier +amelcorn +Amelia +amelia +amelification +ameliorable +ameliorableness +ameliorant +ameliorate +amelioration +ameliorativ +ameliorative +ameliorator +amellus +ameloblast +ameloblastic +amelu +amelus +Amen +amen +amenability +amenable +amenableness +amenably +amend +amendable +amendableness +amendatory +amende +amender +amendment +amends +amene +amenia +Amenism +Amenite +amenity +amenorrhea +amenorrheal +amenorrheic +amenorrhoea +ament +amentaceous +amental +amentia +Amentiferae +amentiferous +amentiform +amentulum +amentum +amerce +amerceable +amercement +amercer +amerciament +America +American +Americana +Americanese +Americanism +Americanist +Americanistic +Americanitis +Americanization +Americanize +Americanizer +Americanly +Americanoid +Americaward +Americawards +americium +Americomania +Americophobe +Amerimnon +Amerind +Amerindian +Amerindic +amerism +ameristic +amesite +Ametabola +ametabole +ametabolia +ametabolian +ametabolic +ametabolism +ametabolous +ametaboly +ametallous +amethodical +amethodically +amethyst +amethystine +ametoecious +ametria +ametrometer +ametrope +ametropia +ametropic +ametrous +Amex +amgarn +amhar +amherstite +amhran +Ami +ami +Amia +amiability +amiable +amiableness +amiably +amianth +amianthiform +amianthine +Amianthium +amianthoid +amianthoidal +amianthus +amic +amicability +amicable +amicableness +amicably +amical +amice +amiced +amicicide +amicrobic +amicron +amicronucleate +amid +amidase +amidate +amidation +amide +amidic +amidid +amidide +amidin +amidine +Amidism +Amidist +amido +amidoacetal +amidoacetic +amidoacetophenone +amidoaldehyde +amidoazo +amidoazobenzene +amidoazobenzol +amidocaffeine +amidocapric +amidofluorid +amidofluoride +amidogen +amidoguaiacol +amidohexose +amidoketone +amidol +amidomyelin +amidon +amidophenol +amidophosphoric +amidoplast +amidoplastid +amidopyrine +amidosuccinamic +amidosulphonal +amidothiazole +amidoxime +amidoxy +amidoxyl +amidrazone +amidship +amidships +amidst +amidstream +amidulin +Amigo +Amiidae +amil +Amiles +Amiloun +amimia +amimide +amin +aminate +amination +amine +amini +aminic +aminity +aminization +aminize +amino +aminoacetal +aminoacetanilide +aminoacetic +aminoacetone +aminoacetophenetidine +aminoacetophenone +aminoacidemia +aminoaciduria +aminoanthraquinone +aminoazobenzene +aminobarbituric +aminobenzaldehyde +aminobenzamide +aminobenzene +aminobenzoic +aminocaproic +aminodiphenyl +aminoethionic +aminoformic +aminogen +aminoglutaric +aminoguanidine +aminoid +aminoketone +aminolipin +aminolysis +aminolytic +aminomalonic +aminomyelin +aminophenol +aminoplast +aminoplastic +aminopropionic +aminopurine +aminopyrine +aminoquinoline +aminosis +aminosuccinamic +aminosulphonic +aminothiophen +aminovaleric +aminoxylol +Aminta +Amintor +Amioidei +Amir +amir +Amiranha +amiray +amirship +Amish +Amishgo +amiss +amissibility +amissible +amissness +Amita +Amitabha +amitosis +amitotic +amitotically +amity +amixia +Amizilis +amla +amli +amlikar +amlong +Amma +amma +amman +Ammanite +ammelide +ammelin +ammeline +ammer +ammeter +Ammi +Ammiaceae +ammiaceous +ammine +amminochloride +amminolysis +amminolytic +ammiolite +ammo +Ammobium +ammochaeta +ammochryse +ammocoete +ammocoetes +ammocoetid +Ammocoetidae +ammocoetiform +ammocoetoid +Ammodytes +Ammodytidae +ammodytoid +ammonal +ammonate +ammonation +Ammonea +ammonia +ammoniacal +ammoniacum +ammoniate +ammoniation +ammonic +ammonical +ammoniemia +ammonification +ammonifier +ammonify +ammoniojarosite +ammonion +ammonionitrate +Ammonite +ammonite +Ammonites +Ammonitess +ammonitic +ammoniticone +ammonitiferous +Ammonitish +ammonitoid +Ammonitoidea +ammonium +ammoniuria +ammonization +ammono +ammonobasic +ammonocarbonic +ammonocarbonous +ammonoid +Ammonoidea +ammonoidean +ammonolysis +ammonolytic +ammonolyze +Ammophila +ammophilous +ammoresinol +ammotherapy +ammu +ammunition +amnemonic +amnesia +amnesic +amnestic +amnesty +amnia +amniac +amniatic +amnic +Amnigenia +amnioallantoic +amniocentesis +amniochorial +amnioclepsis +amniomancy +amnion +Amnionata +amnionate +amnionic +amniorrhea +Amniota +amniote +amniotic +amniotitis +amniotome +amober +amobyr +amoeba +amoebae +Amoebaea +amoebaean +amoebaeum +amoebalike +amoeban +amoebian +amoebiasis +amoebic +amoebicide +amoebid +Amoebida +Amoebidae +amoebiform +Amoebobacter +Amoebobacterieae +amoebocyte +Amoebogeniae +amoeboid +amoeboidism +amoebous +amoebula +amok +amoke +amole +amolilla +amomal +Amomales +Amomis +amomum +among +amongst +amontillado +amor +amorado +amoraic +amoraim +amoral +amoralism +amoralist +amorality +amoralize +Amores +amoret +amoretto +Amoreuxia +amorism +amorist +amoristic +Amorite +Amoritic +Amoritish +amorosity +amoroso +amorous +amorously +amorousness +Amorpha +amorphia +amorphic +amorphinism +amorphism +Amorphophallus +amorphophyte +amorphotae +amorphous +amorphously +amorphousness +amorphus +amorphy +amort +amortisseur +amortizable +amortization +amortize +amortizement +Amorua +Amos +Amoskeag +amotion +amotus +amount +amour +amourette +amovability +amovable +amove +Amoy +Amoyan +Amoyese +ampalaya +ampalea +ampangabeite +ampasimenite +Ampelidaceae +ampelidaceous +Ampelidae +ampelideous +Ampelis +ampelite +ampelitic +ampelographist +ampelography +ampelopsidin +ampelopsin +Ampelopsis +Ampelosicyos +ampelotherapy +amper +amperage +ampere +amperemeter +Amperian +amperometer +ampersand +ampery +amphanthium +ampheclexis +ampherotokous +ampherotoky +amphetamine +amphiarthrodial +amphiarthrosis +amphiaster +amphibalus +Amphibia +amphibial +amphibian +amphibichnite +amphibiety +amphibiological +amphibiology +amphibion +amphibiotic +Amphibiotica +amphibious +amphibiously +amphibiousness +amphibium +amphiblastic +amphiblastula +amphiblestritis +Amphibola +amphibole +amphibolia +amphibolic +amphiboliferous +amphiboline +amphibolite +amphibolitic +amphibological +amphibologically +amphibologism +amphibology +amphibolous +amphiboly +amphibrach +amphibrachic +amphibryous +Amphicarpa +Amphicarpaea +amphicarpic +amphicarpium +amphicarpogenous +amphicarpous +amphicentric +amphichroic +amphichrom +amphichromatic +amphichrome +amphicoelian +amphicoelous +Amphicondyla +amphicondylous +amphicrania +amphicreatinine +amphicribral +amphictyon +amphictyonian +amphictyonic +amphictyony +Amphicyon +Amphicyonidae +amphicyrtic +amphicyrtous +amphicytula +amphid +amphide +amphidesmous +amphidetic +amphidiarthrosis +amphidiploid +amphidiploidy +amphidisc +Amphidiscophora +amphidiscophoran +amphierotic +amphierotism +Amphigaea +amphigam +Amphigamae +amphigamous +amphigastrium +amphigastrula +amphigean +amphigen +amphigene +amphigenesis +amphigenetic +amphigenous +amphigenously +amphigonic +amphigonium +amphigonous +amphigony +amphigoric +amphigory +amphigouri +amphikaryon +amphilogism +amphilogy +amphimacer +amphimictic +amphimictical +amphimictically +amphimixis +amphimorula +Amphinesian +Amphineura +amphineurous +amphinucleus +Amphion +Amphionic +Amphioxi +Amphioxidae +Amphioxides +Amphioxididae +amphioxus +amphipeptone +amphiphloic +amphiplatyan +Amphipleura +amphiploid +amphiploidy +amphipneust +Amphipneusta +amphipneustic +Amphipnous +amphipod +Amphipoda +amphipodal +amphipodan +amphipodiform +amphipodous +amphiprostylar +amphiprostyle +amphiprotic +amphipyrenin +Amphirhina +amphirhinal +amphirhine +amphisarca +amphisbaena +amphisbaenian +amphisbaenic +Amphisbaenidae +amphisbaenoid +amphisbaenous +amphiscians +amphiscii +Amphisile +Amphisilidae +amphispermous +amphisporangiate +amphispore +Amphistoma +amphistomatic +amphistome +amphistomoid +amphistomous +Amphistomum +amphistylar +amphistylic +amphistyly +amphitene +amphitheater +amphitheatered +amphitheatral +amphitheatric +amphitheatrical +amphitheatrically +amphithecial +amphithecium +amphithect +amphithyron +amphitokal +amphitokous +amphitoky +amphitriaene +amphitrichous +Amphitrite +amphitropal +amphitropous +Amphitruo +Amphitryon +Amphiuma +Amphiumidae +amphivasal +amphivorous +Amphizoidae +amphodarch +amphodelite +amphodiplopia +amphogenous +ampholyte +amphopeptone +amphophil +amphophile +amphophilic +amphophilous +amphora +amphoral +amphore +amphorette +amphoric +amphoricity +amphoriloquy +amphorophony +amphorous +amphoteric +Amphrysian +ample +amplectant +ampleness +amplexation +amplexicaudate +amplexicaul +amplexicauline +amplexifoliate +amplexus +ampliate +ampliation +ampliative +amplicative +amplidyne +amplification +amplificative +amplificator +amplificatory +amplifier +amplify +amplitude +amply +ampollosity +ampongue +ampoule +ampul +ampulla +ampullaceous +ampullar +Ampullaria +Ampullariidae +ampullary +ampullate +ampullated +ampulliform +ampullitis +ampullula +amputate +amputation +amputational +amputative +amputator +amputee +ampyx +amra +amreeta +amrita +Amritsar +amsath +amsel +Amsonia +Amsterdamer +amt +amtman +Amuchco +amuck +Amueixa +amuguis +amula +amulet +amuletic +amulla +amunam +amurca +amurcosity +amurcous +Amurru +amusable +amuse +amused +amusedly +amusee +amusement +amuser +amusette +Amusgo +amusia +amusing +amusingly +amusingness +amusive +amusively +amusiveness +amutter +amuyon +amuyong +amuze +amvis +Amy +amy +Amyclaean +Amyclas +amyelencephalia +amyelencephalic +amyelencephalous +amyelia +amyelic +amyelinic +amyelonic +amyelous +amygdal +amygdala +Amygdalaceae +amygdalaceous +amygdalase +amygdalate +amygdalectomy +amygdalic +amygdaliferous +amygdaliform +amygdalin +amygdaline +amygdalinic +amygdalitis +amygdaloid +amygdaloidal +amygdalolith +amygdaloncus +amygdalopathy +amygdalothripsis +amygdalotome +amygdalotomy +Amygdalus +amygdonitrile +amygdophenin +amygdule +amyl +amylaceous +amylamine +amylan +amylase +amylate +amylemia +amylene +amylenol +amylic +amylidene +amyliferous +amylin +amylo +amylocellulose +amyloclastic +amylocoagulase +amylodextrin +amylodyspepsia +amylogen +amylogenesis +amylogenic +amylohydrolysis +amylohydrolytic +amyloid +amyloidal +amyloidosis +amyloleucite +amylolysis +amylolytic +amylom +amylometer +amylon +amylopectin +amylophagia +amylophosphate +amylophosphoric +amyloplast +amyloplastic +amyloplastid +amylopsin +amylose +amylosis +amylosynthesis +amylum +amyluria +Amynodon +amynodont +amyosthenia +amyosthenic +amyotaxia +amyotonia +amyotrophia +amyotrophic +amyotrophy +amyous +Amyraldism +Amyraldist +Amyridaceae +amyrin +Amyris +amyrol +amyroot +Amytal +amyxorrhea +amyxorrhoea +an +Ana +ana +Anabaena +Anabantidae +Anabaptism +Anabaptist +Anabaptistic +Anabaptistical +Anabaptistically +Anabaptistry +anabaptize +Anabas +anabasine +anabasis +anabasse +anabata +anabathmos +anabatic +anaberoga +anabibazon +anabiosis +anabiotic +Anablepidae +Anableps +anabo +anabohitsite +anabolic +anabolin +anabolism +anabolite +anabolize +anabong +anabranch +anabrosis +anabrotic +anacahuita +anacahuite +anacalypsis +anacampsis +anacamptic +anacamptically +anacamptics +anacamptometer +anacanth +anacanthine +Anacanthini +anacanthous +anacara +anacard +Anacardiaceae +anacardiaceous +anacardic +Anacardium +anacatadidymus +anacatharsis +anacathartic +anacephalaeosis +anacephalize +Anaces +Anacharis +anachorism +anachromasis +anachronic +anachronical +anachronically +anachronism +anachronismatical +anachronist +anachronistic +anachronistical +anachronistically +anachronize +anachronous +anachronously +anachueta +anacid +anacidity +anaclasis +anaclastic +anaclastics +Anaclete +anacleticum +anaclinal +anaclisis +anaclitic +anacoenosis +anacoluthia +anacoluthic +anacoluthically +anacoluthon +anaconda +Anacreon +Anacreontic +Anacreontically +anacrisis +Anacrogynae +anacrogynae +anacrogynous +anacromyodian +anacrotic +anacrotism +anacrusis +anacrustic +anacrustically +anaculture +anacusia +anacusic +anacusis +Anacyclus +anadem +anadenia +anadicrotic +anadicrotism +anadidymus +anadiplosis +anadipsia +anadipsic +anadrom +anadromous +Anadyomene +anaematosis +anaemia +anaemic +anaeretic +anaerobation +anaerobe +anaerobia +anaerobian +anaerobic +anaerobically +anaerobies +anaerobion +anaerobiont +anaerobiosis +anaerobiotic +anaerobiotically +anaerobious +anaerobism +anaerobium +anaerophyte +anaeroplastic +anaeroplasty +anaesthesia +anaesthesiant +anaesthetically +anaesthetizer +anaetiological +anagalactic +Anagallis +anagap +anagenesis +anagenetic +anagep +anagignoskomena +anaglyph +anaglyphic +anaglyphical +anaglyphics +anaglyphoscope +anaglyphy +anaglyptic +anaglyptical +anaglyptics +anaglyptograph +anaglyptographic +anaglyptography +anaglypton +anagnorisis +anagnost +anagoge +anagogic +anagogical +anagogically +anagogics +anagogy +anagram +anagrammatic +anagrammatical +anagrammatically +anagrammatism +anagrammatist +anagrammatize +anagrams +anagraph +anagua +anagyrin +anagyrine +Anagyris +anahau +Anahita +Anaitis +Anakes +anakinesis +anakinetic +anakinetomer +anakinetomeric +anakoluthia +anakrousis +anaktoron +anal +analabos +analav +analcime +analcimite +analcite +analcitite +analecta +analectic +analects +analemma +analemmatic +analepsis +analepsy +analeptic +analeptical +analgen +analgesia +analgesic +Analgesidae +analgesis +analgesist +analgetic +analgia +analgic +analgize +analkalinity +anallagmatic +anallantoic +Anallantoidea +anallantoidean +anallergic +anally +analogic +analogical +analogically +analogicalness +analogion +analogism +analogist +analogistic +analogize +analogon +analogous +analogously +analogousness +analogue +analogy +analphabet +analphabete +analphabetic +analphabetical +analphabetism +analysability +analysable +analysand +analysation +analyse +analyser +analyses +analysis +analyst +analytic +analytical +analytically +analytics +analyzability +analyzable +analyzation +analyze +analyzer +Anam +anam +anama +anamesite +anametadromous +Anamirta +anamirtin +Anamite +anamite +anammonid +anammonide +anamnesis +anamnestic +anamnestically +Anamnia +Anamniata +Anamnionata +anamnionic +Anamniota +anamniote +anamniotic +anamorphic +anamorphism +anamorphoscope +anamorphose +anamorphosis +anamorphote +anamorphous +anan +anana +ananaplas +ananaples +ananas +ananda +anandrarious +anandria +anandrous +ananepionic +anangioid +anangular +Ananias +Ananism +Ananite +anankastic +Anansi +Ananta +anantherate +anantherous +ananthous +ananym +anapaest +anapaestic +anapaestical +anapaestically +anapaganize +anapaite +anapanapa +anapeiratic +anaphalantiasis +Anaphalis +anaphase +Anaphe +anaphia +anaphora +anaphoral +anaphoria +anaphoric +anaphorical +anaphrodisia +anaphrodisiac +anaphroditic +anaphroditous +anaphylactic +anaphylactin +anaphylactogen +anaphylactogenic +anaphylactoid +anaphylatoxin +anaphylaxis +anaphyte +anaplasia +anaplasis +anaplasm +Anaplasma +anaplasmosis +anaplastic +anaplasty +anaplerosis +anaplerotic +anapnea +anapneic +anapnoeic +anapnograph +anapnoic +anapnometer +anapodeictic +anapophysial +anapophysis +anapsid +Anapsida +anapsidan +Anapterygota +anapterygote +anapterygotism +anapterygotous +Anaptomorphidae +Anaptomorphus +anaptotic +anaptychus +anaptyctic +anaptyctical +anaptyxis +anaqua +anarcestean +Anarcestes +anarch +anarchal +anarchial +anarchic +anarchical +anarchically +anarchism +anarchist +anarchistic +anarchize +anarchoindividualist +anarchosocialist +anarchosyndicalism +anarchosyndicalist +anarchy +anarcotin +anareta +anaretic +anaretical +anargyros +anarthria +anarthric +anarthropod +Anarthropoda +anarthropodous +anarthrosis +anarthrous +anarthrously +anarthrousness +anartismos +anarya +Anaryan +Anas +Anasa +anasarca +anasarcous +Anasazi +anaschistic +anaseismic +Anasitch +anaspadias +anaspalin +Anaspida +Anaspidacea +Anaspides +anastalsis +anastaltic +Anastasia +Anastasian +anastasimon +anastasimos +anastasis +Anastasius +anastate +anastatic +Anastatica +Anastatus +anastigmat +anastigmatic +anastomose +anastomosis +anastomotic +Anastomus +anastrophe +Anastrophia +Anat +anatase +anatexis +anathema +anathematic +anathematical +anathematically +anathematism +anathematization +anathematize +anathematizer +anatheme +anathemize +Anatherum +Anatidae +anatifa +Anatifae +anatifer +anatiferous +Anatinacea +Anatinae +anatine +anatocism +Anatole +Anatolian +Anatolic +Anatoly +anatomic +anatomical +anatomically +anatomicobiological +anatomicochirurgical +anatomicomedical +anatomicopathologic +anatomicopathological +anatomicophysiologic +anatomicophysiological +anatomicosurgical +anatomism +anatomist +anatomization +anatomize +anatomizer +anatomopathologic +anatomopathological +anatomy +anatopism +anatox +anatoxin +anatreptic +anatripsis +anatripsology +anatriptic +anatron +anatropal +anatropia +anatropous +Anatum +anaudia +anaunter +anaunters +Anax +Anaxagorean +Anaxagorize +anaxial +Anaximandrian +anaxon +anaxone +Anaxonia +anay +anazoturia +anba +anbury +Ancerata +ancestor +ancestorial +ancestorially +ancestral +ancestrally +ancestress +ancestrial +ancestrian +ancestry +Ancha +Anchat +Anchietea +anchietin +anchietine +anchieutectic +anchimonomineral +Anchisaurus +Anchises +Anchistea +Anchistopoda +anchithere +anchitherioid +anchor +anchorable +anchorage +anchorate +anchored +anchorer +anchoress +anchoret +anchoretic +anchoretical +anchoretish +anchoretism +anchorhold +anchorite +anchoritess +anchoritic +anchoritical +anchoritish +anchoritism +anchorless +anchorlike +anchorwise +anchovy +Anchtherium +Anchusa +anchusin +anchusine +anchylose +anchylosis +ancience +anciency +ancient +ancientism +anciently +ancientness +ancientry +ancienty +ancile +ancilla +ancillary +ancipital +ancipitous +Ancistrocladaceae +ancistrocladaceous +Ancistrocladus +ancistroid +ancon +Ancona +anconad +anconagra +anconal +ancone +anconeal +anconeous +anconeus +anconitis +anconoid +ancony +ancora +ancoral +Ancyloceras +Ancylocladus +Ancylodactyla +ancylopod +Ancylopoda +Ancylostoma +ancylostome +ancylostomiasis +Ancylostomum +Ancylus +Ancyrean +Ancyrene +and +anda +andabatarian +Andalusian +andalusite +Andaman +Andamanese +andante +andantino +Andaqui +Andaquian +Andarko +Andaste +Ande +Andean +Anderson +Andesic +andesine +andesinite +andesite +andesitic +Andevo +Andhra +Andi +Andian +Andine +Andira +andirin +andirine +andiroba +andiron +Andoke +andorite +Andorobo +Andorran +andouillet +andradite +andranatomy +andrarchy +Andre +Andrea +Andreaea +Andreaeaceae +Andreaeales +Andreas +Andrena +andrenid +Andrenidae +Andrew +andrewsite +Andria +Andriana +Andrias +andric +Andries +androcentric +androcephalous +androcephalum +androclinium +Androclus +androconium +androcracy +androcratic +androcyte +androdioecious +androdioecism +androdynamous +androecial +androecium +androgametangium +androgametophore +androgen +androgenesis +androgenetic +androgenic +androgenous +androginous +androgone +androgonia +androgonial +androgonidium +androgonium +Andrographis +andrographolide +androgynal +androgynary +androgyne +androgyneity +androgynia +androgynism +androgynous +androgynus +androgyny +android +androidal +androkinin +androl +androlepsia +androlepsy +Andromache +andromania +Andromaque +Andromeda +Andromede +andromedotoxin +andromonoecious +andromonoecism +andromorphous +andron +Andronicus +andronitis +andropetalar +andropetalous +androphagous +androphobia +androphonomania +androphore +androphorous +androphorum +androphyll +Andropogon +Androsace +Androscoggin +androseme +androsin +androsphinx +androsporangium +androspore +androsterone +androtauric +androtomy +Andy +anear +aneath +anecdota +anecdotage +anecdotal +anecdotalism +anecdote +anecdotic +anecdotical +anecdotically +anecdotist +anele +anelectric +anelectrode +anelectrotonic +anelectrotonus +anelytrous +anematosis +Anemia +anemia +anemic +anemobiagraph +anemochord +anemoclastic +anemogram +anemograph +anemographic +anemographically +anemography +anemological +anemology +anemometer +anemometric +anemometrical +anemometrically +anemometrograph +anemometrographic +anemometrographically +anemometry +anemonal +anemone +Anemonella +anemonin +anemonol +anemony +anemopathy +anemophile +anemophilous +anemophily +Anemopsis +anemoscope +anemosis +anemotaxis +anemotropic +anemotropism +anencephalia +anencephalic +anencephalotrophia +anencephalous +anencephalus +anencephaly +anend +anenergia +anenst +anent +anenterous +anepia +anepigraphic +anepigraphous +anepiploic +anepithymia +anerethisia +aneretic +anergia +anergic +anergy +anerly +aneroid +aneroidograph +anerotic +anerythroplasia +anerythroplastic +anes +anesis +anesthesia +anesthesiant +anesthesimeter +anesthesiologist +anesthesiology +anesthesis +anesthetic +anesthetically +anesthetist +anesthetization +anesthetize +anesthetizer +anesthyl +anethole +Anethum +anetiological +aneuploid +aneuploidy +aneuria +aneuric +aneurilemmic +aneurin +aneurism +aneurismally +aneurysm +aneurysmal +aneurysmally +aneurysmatic +anew +Anezeh +anfractuose +anfractuosity +anfractuous +anfractuousness +anfracture +Angami +Angara +angaralite +angaria +angary +Angdistis +angekok +angel +Angela +angelate +angeldom +Angeleno +angelet +angeleyes +angelfish +angelhood +angelic +Angelica +angelica +Angelical +angelical +angelically +angelicalness +Angelican +angelicic +angelicize +angelico +angelin +Angelina +angeline +angelique +angelize +angellike +Angelo +angelocracy +angelographer +angelolater +angelolatry +angelologic +angelological +angelology +angelomachy +Angelonia +angelophany +angelot +angelship +Angelus +anger +angerly +Angerona +Angeronalia +Angers +Angetenar +Angevin +angeyok +angiasthenia +angico +Angie +angiectasis +angiectopia +angiemphraxis +angiitis +angild +angili +angina +anginal +anginiform +anginoid +anginose +anginous +angioasthenia +angioataxia +angioblast +angioblastic +angiocarditis +angiocarp +angiocarpian +angiocarpic +angiocarpous +angiocavernous +angiocholecystitis +angiocholitis +angiochondroma +angioclast +angiocyst +angiodermatitis +angiodiascopy +angioelephantiasis +angiofibroma +angiogenesis +angiogenic +angiogeny +angioglioma +angiograph +angiography +angiohyalinosis +angiohydrotomy +angiohypertonia +angiohypotonia +angioid +angiokeratoma +angiokinesis +angiokinetic +angioleucitis +angiolipoma +angiolith +angiology +angiolymphitis +angiolymphoma +angioma +angiomalacia +angiomatosis +angiomatous +angiomegaly +angiometer +angiomyocardiac +angiomyoma +angiomyosarcoma +angioneoplasm +angioneurosis +angioneurotic +angionoma +angionosis +angioparalysis +angioparalytic +angioparesis +angiopathy +angiophorous +angioplany +angioplasty +angioplerosis +angiopoietic +angiopressure +angiorrhagia +angiorrhaphy +angiorrhea +angiorrhexis +angiosarcoma +angiosclerosis +angiosclerotic +angioscope +angiosis +angiospasm +angiospastic +angiosperm +Angiospermae +angiospermal +angiospermatous +angiospermic +angiospermous +angiosporous +angiostegnosis +angiostenosis +angiosteosis +angiostomize +angiostomy +angiostrophy +angiosymphysis +angiotasis +angiotelectasia +angiothlipsis +angiotome +angiotomy +angiotonic +angiotonin +angiotribe +angiotripsy +angiotrophic +Angka +anglaise +angle +angleberry +angled +anglehook +anglepod +angler +Angles +anglesite +anglesmith +angletouch +angletwitch +anglewing +anglewise +angleworm +Anglian +Anglic +Anglican +Anglicanism +Anglicanize +Anglicanly +Anglicanum +Anglicism +Anglicist +Anglicization +anglicization +Anglicize +anglicize +Anglification +Anglify +anglimaniac +angling +Anglish +Anglist +Anglistics +Anglogaea +Anglogaean +angloid +Angloman +Anglomane +Anglomania +Anglomaniac +Anglophile +Anglophobe +Anglophobia +Anglophobiac +Anglophobic +Anglophobist +ango +Angola +angolar +Angolese +angor +Angora +angostura +Angouleme +Angoumian +Angraecum +angrily +angriness +angrite +angry +angst +angster +Angstrom +angstrom +anguid +Anguidae +anguiform +Anguilla +Anguillaria +Anguillidae +anguilliform +anguilloid +Anguillula +Anguillulidae +Anguimorpha +anguine +anguineal +anguineous +Anguinidae +anguiped +Anguis +anguis +anguish +anguished +anguishful +anguishous +anguishously +angula +angular +angulare +angularity +angularization +angularize +angularly +angularness +angulate +angulated +angulately +angulateness +angulation +angulatogibbous +angulatosinuous +anguliferous +angulinerved +Anguloa +angulodentate +angulometer +angulosity +angulosplenial +angulous +anguria +Angus +angusticlave +angustifoliate +angustifolious +angustirostrate +angustisellate +angustiseptal +angustiseptate +angwantibo +anhalamine +anhaline +anhalonine +Anhalonium +anhalouidine +anhang +Anhanga +anharmonic +anhedonia +anhedral +anhedron +anhelation +anhelous +anhematosis +anhemolytic +anhidrosis +anhidrotic +anhima +Anhimae +Anhimidae +anhinga +anhistic +anhistous +anhungered +anhungry +anhydrate +anhydration +anhydremia +anhydremic +anhydric +anhydride +anhydridization +anhydridize +anhydrite +anhydrization +anhydrize +anhydroglocose +anhydromyelia +anhydrous +anhydroxime +anhysteretic +ani +Aniba +Anice +aniconic +aniconism +anicular +anicut +anidian +anidiomatic +anidiomatical +anidrosis +Aniellidae +aniente +anigh +anight +anights +anil +anilao +anilau +anile +anileness +anilic +anilid +anilide +anilidic +anilidoxime +aniline +anilinism +anilinophile +anilinophilous +anility +anilla +anilopyrin +anilopyrine +anima +animability +animable +animableness +animadversion +animadversional +animadversive +animadversiveness +animadvert +animadverter +animal +animalcula +animalculae +animalcular +animalcule +animalculine +animalculism +animalculist +animalculous +animalculum +animalhood +Animalia +animalian +animalic +animalier +animalish +animalism +animalist +animalistic +animality +Animalivora +animalivore +animalivorous +animalization +animalize +animally +animastic +animastical +animate +animated +animatedly +animately +animateness +animater +animating +animatingly +animation +animatism +animatistic +animative +animatograph +animator +anime +animi +Animikean +animikite +animism +animist +animistic +animize +animosity +animotheism +animous +animus +anion +anionic +aniridia +anis +anisal +anisalcohol +anisaldehyde +anisaldoxime +anisamide +anisandrous +anisanilide +anisate +anischuria +anise +aniseed +aniseikonia +aniseikonic +aniselike +aniseroot +anisette +anisic +anisidin +anisidine +anisil +anisilic +anisobranchiate +anisocarpic +anisocarpous +anisocercal +anisochromatic +anisochromia +anisocoria +anisocotyledonous +anisocotyly +anisocratic +anisocycle +anisocytosis +anisodactyl +Anisodactyla +Anisodactyli +anisodactylic +anisodactylous +anisodont +anisogamete +anisogamous +anisogamy +anisogenous +anisogeny +anisognathism +anisognathous +anisogynous +anisoin +anisole +anisoleucocytosis +Anisomeles +anisomelia +anisomelus +anisomeric +anisomerous +anisometric +anisometrope +anisometropia +anisometropic +anisomyarian +Anisomyodi +anisomyodian +anisomyodous +anisopetalous +anisophyllous +anisophylly +anisopia +anisopleural +anisopleurous +anisopod +Anisopoda +anisopodal +anisopodous +anisopogonous +Anisoptera +anisopterous +anisosepalous +anisospore +anisostaminous +anisostemonous +anisosthenic +anisostichous +Anisostichus +anisostomous +anisotonic +anisotropal +anisotrope +anisotropic +anisotropical +anisotropically +anisotropism +anisotropous +anisotropy +anisoyl +anisum +anisuria +anisyl +anisylidene +Anita +anither +anitrogenous +anjan +Anjou +ankaramite +ankaratrite +ankee +anker +ankerite +ankh +ankle +anklebone +anklejack +anklet +anklong +Ankoli +Ankou +ankus +ankusha +ankylenteron +ankyloblepharon +ankylocheilia +ankylodactylia +ankylodontia +ankyloglossia +ankylomele +ankylomerism +ankylophobia +ankylopodia +ankylopoietic +ankyloproctia +ankylorrhinia +Ankylosaurus +ankylose +ankylosis +ankylostoma +ankylotia +ankylotic +ankylotome +ankylotomy +ankylurethria +ankyroid +anlace +anlaut +Ann +ann +Anna +anna +Annabel +annabergite +annal +annale +annaline +annalism +annalist +annalistic +annalize +annals +Annam +Annamese +Annamite +Annamitic +Annapurna +Annard +annat +annates +annatto +Anne +anneal +annealer +annectent +annection +annelid +Annelida +annelidan +Annelides +annelidian +annelidous +annelism +Annellata +anneloid +annerodite +Anneslia +annet +Annette +annex +annexa +annexable +annexal +annexation +annexational +annexationist +annexer +annexion +annexionist +annexitis +annexive +annexment +annexure +annidalin +Annie +Anniellidae +annihilability +annihilable +annihilate +annihilation +annihilationism +annihilationist +annihilative +annihilator +annihilatory +Annist +annite +anniversarily +anniversariness +anniversary +anniverse +annodated +Annona +annona +Annonaceae +annonaceous +annotate +annotater +annotation +annotative +annotator +annotatory +annotine +annotinous +announce +announceable +announcement +announcer +annoy +annoyance +annoyancer +annoyer +annoyful +annoying +annoyingly +annoyingness +annoyment +annual +annualist +annualize +annually +annuary +annueler +annuent +annuitant +annuity +annul +annular +Annularia +annularity +annularly +annulary +Annulata +annulate +annulated +annulation +annulet +annulettee +annulism +annullable +annullate +annullation +annuller +annulment +annuloid +Annuloida +Annulosa +annulosan +annulose +annulus +annunciable +annunciate +annunciation +annunciative +annunciator +annunciatory +anoa +Anobiidae +anocarpous +anociassociation +anococcygeal +anodal +anode +anodendron +anodic +anodically +anodize +Anodon +Anodonta +anodontia +anodos +anodyne +anodynia +anodynic +anodynous +anoegenetic +anoesia +anoesis +anoestrous +anoestrum +anoestrus +anoetic +anogenic +anogenital +Anogra +anoil +anoine +anoint +anointer +anointment +anole +anoli +anolian +Anolis +Anolympiad +anolyte +Anomala +anomaliflorous +anomaliped +anomalism +anomalist +anomalistic +anomalistical +anomalistically +anomalocephalus +anomaloflorous +Anomalogonatae +anomalogonatous +Anomalon +anomalonomy +Anomalopteryx +anomaloscope +anomalotrophy +anomalous +anomalously +anomalousness +anomalure +Anomaluridae +Anomalurus +anomaly +Anomatheca +Anomia +Anomiacea +Anomiidae +anomite +anomocarpous +anomodont +Anomodontia +Anomoean +Anomoeanism +anomophyllous +anomorhomboid +anomorhomboidal +anomphalous +Anomura +anomural +anomuran +anomurous +anomy +anon +anonang +anoncillo +anonol +anonychia +anonym +anonyma +anonymity +anonymous +anonymously +anonymousness +anonymuncule +anoopsia +anoperineal +anophele +Anopheles +Anophelinae +anopheline +anophoria +anophthalmia +anophthalmos +Anophthalmus +anophyte +anopia +anopisthographic +Anopla +Anoplanthus +anoplocephalic +anoplonemertean +Anoplonemertini +anoplothere +Anoplotheriidae +anoplotherioid +Anoplotherium +anoplotheroid +Anoplura +anopluriform +anopsia +anopubic +anorak +anorchia +anorchism +anorchous +anorchus +anorectal +anorectic +anorectous +anorexia +anorexy +anorgana +anorganic +anorganism +anorganology +anormal +anormality +anorogenic +anorth +anorthic +anorthite +anorthitic +anorthitite +anorthoclase +anorthographic +anorthographical +anorthographically +anorthography +anorthophyre +anorthopia +anorthoscope +anorthose +anorthosite +anoscope +anoscopy +Anosia +anosmatic +anosmia +anosmic +anosphrasia +anosphresia +anospinal +anostosis +Anostraca +anoterite +another +anotherkins +anotia +anotropia +anotta +anotto +anotus +anounou +Anous +anovesical +anoxemia +anoxemic +anoxia +anoxic +anoxidative +anoxybiosis +anoxybiotic +anoxyscope +ansa +ansar +ansarian +Ansarie +ansate +ansation +Anseis +Ansel +Anselm +Anselmian +Anser +anserated +Anseres +Anseriformes +Anserinae +anserine +anserous +anspessade +ansu +ansulate +answer +answerability +answerable +answerableness +answerably +answerer +answeringly +answerless +answerlessly +ant +Anta +anta +antacid +antacrid +antadiform +Antaean +Antaeus +antagonism +antagonist +antagonistic +antagonistical +antagonistically +antagonization +antagonize +antagonizer +antagony +Antaimerina +Antaios +Antaiva +antal +antalgesic +antalgol +antalkali +antalkaline +antambulacral +antanacathartic +antanaclasis +Antanandro +antanemic +antapex +antaphrodisiac +antaphroditic +antapocha +antapodosis +antapology +antapoplectic +Antar +Antara +antarchism +antarchist +antarchistic +antarchistical +antarchy +Antarctalia +Antarctalian +antarctic +Antarctica +antarctica +antarctical +antarctically +Antarctogaea +Antarctogaean +Antares +antarthritic +antasphyctic +antasthenic +antasthmatic +antatrophic +antdom +ante +anteact +anteal +anteambulate +anteambulation +anteater +antebaptismal +antebath +antebrachial +antebrachium +antebridal +antecabinet +antecaecal +antecardium +antecavern +antecedaneous +antecedaneously +antecede +antecedence +antecedency +antecedent +antecedental +antecedently +antecessor +antechamber +antechapel +Antechinomys +antechoir +antechurch +anteclassical +antecloset +antecolic +antecommunion +anteconsonantal +antecornu +antecourt +antecoxal +antecubital +antecurvature +antedate +antedawn +antediluvial +antediluvially +antediluvian +Antedon +antedonin +antedorsal +antefebrile +antefix +antefixal +anteflected +anteflexed +anteflexion +antefurca +antefurcal +antefuture +antegarden +antegrade +antehall +antehistoric +antehuman +antehypophysis +anteinitial +antejentacular +antejudiciary +antejuramentum +antelabium +antelegal +antelocation +antelope +antelopian +antelucan +antelude +anteluminary +antemarginal +antemarital +antemedial +antemeridian +antemetallic +antemetic +antemillennial +antemingent +antemortal +antemundane +antemural +antenarial +antenatal +antenatalitial +antenati +antenave +antenna +antennae +antennal +Antennaria +antennariid +Antennariidae +Antennarius +antennary +Antennata +antennate +antenniferous +antenniform +antennula +antennular +antennulary +antennule +antenodal +antenoon +Antenor +antenumber +anteoccupation +anteocular +anteopercle +anteoperculum +anteorbital +antepagmenta +antepagments +antepalatal +antepaschal +antepast +antepatriarchal +antepectoral +antepectus +antependium +antepenult +antepenultima +antepenultimate +antephialtic +antepileptic +antepirrhema +anteporch +anteportico +anteposition +anteposthumous +anteprandial +antepredicament +antepredicamental +antepreterit +antepretonic +anteprohibition +anteprostate +anteprostatic +antepyretic +antequalm +antereformation +antereformational +anteresurrection +anterethic +anterevolutional +anterevolutionary +anteriad +anterior +anteriority +anteriorly +anteriorness +anteroclusion +anterodorsal +anteroexternal +anterofixation +anteroflexion +anterofrontal +anterograde +anteroinferior +anterointerior +anterointernal +anterolateral +anterolaterally +anteromedial +anteromedian +anteroom +anteroparietal +anteroposterior +anteroposteriorly +anteropygal +anterospinal +anterosuperior +anteroventral +anteroventrally +antes +antescript +antesignanus +antespring +antestature +antesternal +antesternum +antesunrise +antesuperior +antetemple +antetype +Anteva +antevenient +anteversion +antevert +antevocalic +antewar +anthecological +anthecologist +anthecology +Antheia +anthela +anthelion +anthelmintic +anthem +anthema +anthemene +anthemia +Anthemideae +anthemion +Anthemis +anthemwise +anthemy +anther +Antheraea +antheral +Anthericum +antherid +antheridial +antheridiophore +antheridium +antheriferous +antheriform +antherless +antherogenous +antheroid +antherozoid +antherozoidal +antherozooid +antherozooidal +anthesis +Anthesteria +Anthesteriac +anthesterin +Anthesterion +anthesterol +antheximeter +Anthicidae +Anthidium +anthill +Anthinae +anthine +anthobiology +anthocarp +anthocarpous +anthocephalous +Anthoceros +Anthocerotaceae +Anthocerotales +anthocerote +anthochlor +anthochlorine +anthoclinium +anthocyan +anthocyanidin +anthocyanin +anthodium +anthoecological +anthoecologist +anthoecology +anthogenesis +anthogenetic +anthogenous +anthography +anthoid +anthokyan +antholite +anthological +anthologically +anthologion +anthologist +anthologize +anthology +antholysis +Antholyza +anthomania +anthomaniac +Anthomedusae +anthomedusan +Anthomyia +anthomyiid +Anthomyiidae +Anthonin +Anthonomus +Anthony +anthood +anthophagous +Anthophila +anthophile +anthophilian +anthophilous +anthophobia +Anthophora +anthophore +Anthophoridae +anthophorous +anthophyllite +anthophyllitic +Anthophyta +anthophyte +anthorine +anthosiderite +Anthospermum +anthotaxis +anthotaxy +anthotropic +anthotropism +anthoxanthin +Anthoxanthum +Anthozoa +anthozoan +anthozoic +anthozooid +anthozoon +anthracemia +anthracene +anthraceniferous +anthrachrysone +anthracia +anthracic +anthraciferous +anthracin +anthracite +anthracitic +anthracitiferous +anthracitious +anthracitism +anthracitization +anthracnose +anthracnosis +anthracocide +anthracoid +anthracolithic +anthracomancy +Anthracomarti +anthracomartian +Anthracomartus +anthracometer +anthracometric +anthraconecrosis +anthraconite +Anthracosaurus +anthracosis +anthracothere +Anthracotheriidae +Anthracotherium +anthracotic +anthracyl +anthradiol +anthradiquinone +anthraflavic +anthragallol +anthrahydroquinone +anthramine +anthranil +anthranilate +anthranilic +anthranol +anthranone +anthranoyl +anthranyl +anthraphenone +anthrapurpurin +anthrapyridine +anthraquinol +anthraquinone +anthraquinonyl +anthrarufin +anthratetrol +anthrathiophene +anthratriol +anthrax +anthraxolite +anthraxylon +Anthrenus +anthribid +Anthribidae +Anthriscus +anthrohopobiological +anthroic +anthrol +anthrone +anthropic +anthropical +Anthropidae +anthropobiologist +anthropobiology +anthropocentric +anthropocentrism +anthropoclimatologist +anthropoclimatology +anthropocosmic +anthropodeoxycholic +Anthropodus +anthropogenesis +anthropogenetic +anthropogenic +anthropogenist +anthropogenous +anthropogeny +anthropogeographer +anthropogeographical +anthropogeography +anthropoglot +anthropogony +anthropography +anthropoid +anthropoidal +Anthropoidea +anthropoidean +anthropolater +anthropolatric +anthropolatry +anthropolite +anthropolithic +anthropolitic +anthropological +anthropologically +anthropologist +anthropology +anthropomancy +anthropomantic +anthropomantist +anthropometer +anthropometric +anthropometrical +anthropometrically +anthropometrist +anthropometry +anthropomorph +Anthropomorpha +anthropomorphic +anthropomorphical +anthropomorphically +Anthropomorphidae +anthropomorphism +anthropomorphist +anthropomorphite +anthropomorphitic +anthropomorphitical +anthropomorphitism +anthropomorphization +anthropomorphize +anthropomorphological +anthropomorphologically +anthropomorphology +anthropomorphosis +anthropomorphotheist +anthropomorphous +anthropomorphously +anthroponomical +anthroponomics +anthroponomist +anthroponomy +anthropopathia +anthropopathic +anthropopathically +anthropopathism +anthropopathite +anthropopathy +anthropophagi +anthropophagic +anthropophagical +anthropophaginian +anthropophagism +anthropophagist +anthropophagistic +anthropophagite +anthropophagize +anthropophagous +anthropophagously +anthropophagy +anthropophilous +anthropophobia +anthropophuism +anthropophuistic +anthropophysiography +anthropophysite +Anthropopithecus +anthropopsychic +anthropopsychism +Anthropos +anthroposcopy +anthroposociologist +anthroposociology +anthroposomatology +anthroposophical +anthroposophist +anthroposophy +anthropoteleoclogy +anthropoteleological +anthropotheism +anthropotomical +anthropotomist +anthropotomy +anthropotoxin +Anthropozoic +anthropurgic +anthroropolith +anthroxan +anthroxanic +anthryl +anthrylene +Anthurium +Anthus +Anthyllis +anthypophora +anthypophoretic +Anti +anti +antiabolitionist +antiabrasion +antiabrin +antiabsolutist +antiacid +antiadiaphorist +antiaditis +antiadministration +antiae +antiaesthetic +antiager +antiagglutinating +antiagglutinin +antiaggression +antiaggressionist +antiaggressive +antiaircraft +antialbumid +antialbumin +antialbumose +antialcoholic +antialcoholism +antialcoholist +antialdoxime +antialexin +antialien +antiamboceptor +antiamusement +antiamylase +antianaphylactogen +antianaphylaxis +antianarchic +antianarchist +antiangular +antiannexation +antiannexationist +antianopheline +antianthrax +antianthropocentric +antianthropomorphism +antiantibody +antiantidote +antiantienzyme +antiantitoxin +antiaphrodisiac +antiaphthic +antiapoplectic +antiapostle +antiaquatic +antiar +Antiarcha +Antiarchi +antiarin +Antiaris +antiaristocrat +antiarthritic +antiascetic +antiasthmatic +antiastronomical +antiatheism +antiatheist +antiatonement +antiattrition +antiautolysin +antibacchic +antibacchius +antibacterial +antibacteriolytic +antiballooner +antibalm +antibank +antibasilican +antibenzaldoxime +antiberiberin +antibibliolatry +antibigotry +antibilious +antibiont +antibiosis +antibiotic +antibishop +antiblastic +antiblennorrhagic +antiblock +antiblue +antibody +antiboxing +antibreakage +antibridal +antibromic +antibubonic +Antiburgher +antic +anticachectic +antical +anticalcimine +anticalculous +anticalligraphic +anticancer +anticapital +anticapitalism +anticapitalist +anticardiac +anticardium +anticarious +anticarnivorous +anticaste +anticatalase +anticatalyst +anticatalytic +anticatalyzer +anticatarrhal +anticathexis +anticathode +anticaustic +anticensorship +anticentralization +anticephalalgic +anticeremonial +anticeremonialism +anticeremonialist +anticheater +antichlor +antichlorine +antichloristic +antichlorotic +anticholagogue +anticholinergic +antichoromanic +antichorus +antichresis +antichretic +antichrist +antichristian +antichristianity +antichristianly +antichrome +antichronical +antichronically +antichthon +antichurch +antichurchian +antichymosin +anticipant +anticipatable +anticipate +anticipation +anticipative +anticipatively +anticipator +anticipatorily +anticipatory +anticivic +anticivism +anticize +anticker +anticlactic +anticlassical +anticlassicist +Anticlea +anticlergy +anticlerical +anticlericalism +anticlimactic +anticlimax +anticlinal +anticline +anticlinorium +anticlockwise +anticlogging +anticly +anticnemion +anticness +anticoagulant +anticoagulating +anticoagulative +anticoagulin +anticogitative +anticolic +anticombination +anticomet +anticomment +anticommercial +anticommunist +anticomplement +anticomplementary +anticomplex +anticonceptionist +anticonductor +anticonfederationist +anticonformist +anticonscience +anticonscription +anticonscriptive +anticonstitutional +anticonstitutionalist +anticonstitutionally +anticontagion +anticontagionist +anticontagious +anticonventional +anticonventionalism +anticonvulsive +anticor +anticorn +anticorrosion +anticorrosive +anticorset +anticosine +anticosmetic +anticouncil +anticourt +anticourtier +anticous +anticovenanter +anticovenanting +anticreation +anticreative +anticreator +anticreep +anticreeper +anticreeping +anticrepuscular +anticrepuscule +anticrisis +anticritic +anticritique +anticrochet +anticrotalic +anticryptic +anticum +anticyclic +anticyclone +anticyclonic +anticyclonically +anticynic +anticytolysin +anticytotoxin +antidactyl +antidancing +antidecalogue +antideflation +antidemocrat +antidemocratic +antidemocratical +antidemoniac +antidetonant +antidetonating +antidiabetic +antidiastase +Antidicomarian +Antidicomarianite +antidictionary +antidiffuser +antidinic +antidiphtheria +antidiphtheric +antidiphtherin +antidiphtheritic +antidisciplinarian +antidivine +antidivorce +antidogmatic +antidomestic +antidominican +Antidorcas +antidoron +antidotal +antidotally +antidotary +antidote +antidotical +antidotically +antidotism +antidraft +antidrag +antidromal +antidromic +antidromically +antidromous +antidromy +antidrug +antiduke +antidumping +antidynamic +antidynastic +antidyscratic +antidysenteric +antidysuric +antiecclesiastic +antiecclesiastical +antiedemic +antieducation +antieducational +antiegotism +antiejaculation +antiemetic +antiemperor +antiempirical +antiendotoxin +antiendowment +antienergistic +antienthusiastic +antienzyme +antienzymic +antiepicenter +antiepileptic +antiepiscopal +antiepiscopist +antiepithelial +antierosion +antierysipelas +Antietam +antiethnic +antieugenic +antievangelical +antievolution +antievolutionist +antiexpansionist +antiexporting +antiextreme +antieyestrain +antiface +antifaction +antifame +antifanatic +antifat +antifatigue +antifebrile +antifederal +antifederalism +antifederalist +antifelon +antifelony +antifeminism +antifeminist +antiferment +antifermentative +antifertilizer +antifeudal +antifeudalism +antifibrinolysin +antifibrinolysis +antifideism +antifire +antiflash +antiflattering +antiflatulent +antiflux +antifoam +antifoaming +antifogmatic +antiforeign +antiforeignism +antiformin +antifouler +antifouling +antifowl +antifreeze +antifreezing +antifriction +antifrictional +antifrost +antifundamentalist +antifungin +antigalactagogue +antigalactic +antigambling +antiganting +antigen +antigenic +antigenicity +antighostism +antigigmanic +antiglare +antiglyoxalase +antigod +Antigone +antigonococcic +Antigonon +antigonorrheic +Antigonus +antigorite +antigovernment +antigraft +antigrammatical +antigraph +antigravitate +antigravitational +antigropelos +antigrowth +Antiguan +antiguggler +antigyrous +antihalation +antiharmonist +antihectic +antihelix +antihelminthic +antihemagglutinin +antihemisphere +antihemoglobin +antihemolysin +antihemolytic +antihemorrhagic +antihemorrheidal +antihero +antiheroic +antiheroism +antiheterolysin +antihidrotic +antihierarchical +antihierarchist +antihistamine +antihistaminic +antiholiday +antihormone +antihuff +antihum +antihuman +antihumbuggist +antihunting +antihydrophobic +antihydropic +antihydropin +antihygienic +antihylist +antihypnotic +antihypochondriac +antihypophora +antihysteric +Antikamnia +antikathode +antikenotoxin +antiketogen +antiketogenesis +antiketogenic +antikinase +antiking +antiknock +antilabor +antilaborist +antilacrosse +antilacrosser +antilactase +antilapsarian +antileague +antilegalist +antilegomena +antilemic +antilens +antilepsis +antileptic +antilethargic +antileveling +Antilia +antiliberal +antilibration +antilift +antilipase +antilipoid +antiliquor +antilithic +antiliturgical +antiliturgist +Antillean +antilobium +Antilocapra +Antilocapridae +Antilochus +antiloemic +antilogarithm +antilogic +antilogical +antilogism +antilogous +antilogy +antiloimic +Antilope +Antilopinae +antilottery +antiluetin +antilynching +antilysin +antilysis +antilyssic +antilytic +antimacassar +antimachine +antimachinery +antimagistratical +antimalaria +antimalarial +antimallein +antimaniac +antimaniacal +Antimarian +antimark +antimartyr +antimask +antimasker +Antimason +Antimasonic +Antimasonry +antimasque +antimasquer +antimasquerade +antimaterialist +antimaterialistic +antimatrimonial +antimatrimonialist +antimedical +antimedieval +antimelancholic +antimellin +antimeningococcic +antimension +antimensium +antimephitic +antimere +antimerger +antimeric +Antimerina +antimerism +antimeristem +antimetabole +antimetathesis +antimetathetic +antimeter +antimethod +antimetrical +antimetropia +antimetropic +antimiasmatic +antimicrobic +antimilitarism +antimilitarist +antimilitary +antiministerial +antiministerialist +antiminsion +antimiscegenation +antimission +antimissionary +antimissioner +antimixing +antimnemonic +antimodel +antimodern +antimonarchial +antimonarchic +antimonarchical +antimonarchically +antimonarchicalness +antimonarchist +antimonate +antimonial +antimoniate +antimoniated +antimonic +antimonid +antimonide +antimoniferous +antimonious +antimonite +antimonium +antimoniuret +antimoniureted +antimoniuretted +antimonopolist +antimonopoly +antimonsoon +antimony +antimonyl +antimoral +antimoralism +antimoralist +antimosquito +antimusical +antimycotic +antimythic +antimythical +antinarcotic +antinarrative +antinational +antinationalist +antinationalistic +antinatural +antinegro +antinegroism +antineologian +antinephritic +antinepotic +antineuralgic +antineuritic +antineurotoxin +antineutral +antinial +antinicotine +antinion +antinode +antinoise +antinome +antinomian +antinomianism +antinomic +antinomical +antinomist +antinomy +antinormal +antinosarian +Antinous +Antiochene +Antiochian +Antiochianism +antiodont +antiodontalgic +Antiope +antiopelmous +antiophthalmic +antiopium +antiopiumist +antiopiumite +antioptimist +antioptionist +antiorgastic +antiorthodox +antioxidant +antioxidase +antioxidizer +antioxidizing +antioxygen +antioxygenation +antioxygenator +antioxygenic +antipacifist +antipapacy +antipapal +antipapalist +antipapism +antipapist +antipapistical +antiparabema +antiparagraphe +antiparagraphic +antiparallel +antiparallelogram +antiparalytic +antiparalytical +antiparasitic +antiparastatitis +antiparliament +antiparliamental +antiparliamentarist +antiparliamentary +antipart +Antipasch +Antipascha +antipass +antipastic +Antipatharia +antipatharian +antipathetic +antipathetical +antipathetically +antipatheticalness +antipathic +Antipathida +antipathist +antipathize +antipathogen +antipathy +antipatriarch +antipatriarchal +antipatriot +antipatriotic +antipatriotism +antipedal +Antipedobaptism +Antipedobaptist +antipeduncular +antipellagric +antipepsin +antipeptone +antiperiodic +antiperistalsis +antiperistaltic +antiperistasis +antiperistatic +antiperistatical +antiperistatically +antipersonnel +antiperthite +antipestilential +antipetalous +antipewism +antiphagocytic +antipharisaic +antipharmic +antiphase +antiphilosophic +antiphilosophical +antiphlogistian +antiphlogistic +antiphon +antiphonal +antiphonally +antiphonary +antiphoner +antiphonetic +antiphonic +antiphonical +antiphonically +antiphonon +antiphony +antiphrasis +antiphrastic +antiphrastical +antiphrastically +antiphthisic +antiphthisical +antiphylloxeric +antiphysic +antiphysical +antiphysician +antiplague +antiplanet +antiplastic +antiplatelet +antipleion +antiplenist +antiplethoric +antipleuritic +antiplurality +antipneumococcic +antipodagric +antipodagron +antipodal +antipode +antipodean +antipodes +antipodic +antipodism +antipodist +antipoetic +antipoints +antipolar +antipole +antipolemist +antipolitical +antipollution +antipolo +antipolygamy +antipolyneuritic +antipool +antipooling +antipope +antipopery +antipopular +antipopulationist +antiportable +antiposition +antipoverty +antipragmatic +antipragmatist +antiprecipitin +antipredeterminant +antiprelate +antiprelatic +antiprelatist +antipreparedness +antiprestidigitation +antipriest +antipriestcraft +antiprime +antiprimer +antipriming +antiprinciple +antiprism +antiproductionist +antiprofiteering +antiprohibition +antiprohibitionist +antiprojectivity +antiprophet +antiprostate +antiprostatic +antiprotease +antiproteolysis +antiprotozoal +antiprudential +antipruritic +antipsalmist +antipsoric +antiptosis +antipudic +antipuritan +antiputrefaction +antiputrefactive +antiputrescent +antiputrid +antipyic +antipyonin +antipyresis +antipyretic +Antipyrine +antipyrotic +antipyryl +antiqua +antiquarian +antiquarianism +antiquarianize +antiquarianly +antiquarism +antiquartan +antiquary +antiquate +antiquated +antiquatedness +antiquation +antique +antiquely +antiqueness +antiquer +antiquing +antiquist +antiquitarian +antiquity +antirabic +antirabies +antiracemate +antiracer +antirachitic +antirachitically +antiracing +antiradiating +antiradiation +antiradical +antirailwayist +antirational +antirationalism +antirationalist +antirationalistic +antirattler +antireactive +antirealism +antirealistic +antirebating +antirecruiting +antired +antireducer +antireform +antireformer +antireforming +antireformist +antireligion +antireligious +antiremonstrant +antirennet +antirennin +antirent +antirenter +antirentism +antirepublican +antireservationist +antirestoration +antireticular +antirevisionist +antirevolutionary +antirevolutionist +antirheumatic +antiricin +antirickets +antiritual +antiritualistic +antirobin +antiromance +antiromantic +antiromanticism +antiroyal +antiroyalist +Antirrhinum +antirumor +antirun +antirust +antisacerdotal +antisacerdotalist +antisaloon +antisalooner +antisavage +antiscabious +antiscale +antischolastic +antischool +antiscians +antiscientific +antiscion +antiscolic +antiscorbutic +antiscorbutical +antiscrofulous +antiseismic +antiselene +antisensitizer +antisensuous +antisensuousness +antisepalous +antisepsin +antisepsis +antiseptic +antiseptical +antiseptically +antisepticism +antisepticist +antisepticize +antiseption +antiseptize +antiserum +antishipping +Antisi +antisialagogue +antisialic +antisiccative +antisideric +antisilverite +antisimoniacal +antisine +antisiphon +antisiphonal +antiskeptical +antiskid +antiskidding +antislavery +antislaveryism +antislickens +antislip +antismoking +antisnapper +antisocial +antisocialist +antisocialistic +antisocialistically +antisociality +antisolar +antisophist +antisoporific +antispace +antispadix +antispasis +antispasmodic +antispast +antispastic +antispectroscopic +antispermotoxin +antispiritual +antispirochetic +antisplasher +antisplenetic +antisplitting +antispreader +antispreading +antisquama +antisquatting +antistadholder +antistadholderian +antistalling +antistaphylococcic +antistate +antistatism +antistatist +antisteapsin +antisterility +antistes +antistimulant +antistock +antistreptococcal +antistreptococcic +antistreptococcin +antistreptococcus +antistrike +antistrophal +antistrophe +antistrophic +antistrophically +antistrophize +antistrophon +antistrumatic +antistrumous +antisubmarine +antisubstance +antisudoral +antisudorific +antisuffrage +antisuffragist +antisun +antisupernaturalism +antisupernaturalist +antisurplician +antisymmetrical +antisyndicalism +antisyndicalist +antisynod +antisyphilitic +antitabetic +antitabloid +antitangent +antitank +antitarnish +antitartaric +antitax +antiteetotalism +antitegula +antitemperance +antitetanic +antitetanolysin +antithalian +antitheft +antitheism +antitheist +antitheistic +antitheistical +antitheistically +antithenar +antitheologian +antitheological +antithermic +antithermin +antitheses +antithesis +antithesism +antithesize +antithet +antithetic +antithetical +antithetically +antithetics +antithrombic +antithrombin +antitintinnabularian +antitobacco +antitobacconal +antitobacconist +antitonic +antitorpedo +antitoxic +antitoxin +antitrade +antitrades +antitraditional +antitragal +antitragic +antitragicus +antitragus +antitrismus +antitrochanter +antitropal +antitrope +antitropic +antitropical +antitropous +antitropy +antitrust +antitrypsin +antitryptic +antituberculin +antituberculosis +antituberculotic +antituberculous +antiturnpikeism +antitwilight +antitypal +antitype +antityphoid +antitypic +antitypical +antitypically +antitypy +antityrosinase +antiunion +antiunionist +antiuratic +antiurease +antiusurious +antiutilitarian +antivaccination +antivaccinationist +antivaccinator +antivaccinist +antivariolous +antivenefic +antivenereal +antivenin +antivenom +antivenomous +antivermicular +antivibrating +antivibrator +antivibratory +antivice +antiviral +antivirus +antivitalist +antivitalistic +antivitamin +antivivisection +antivivisectionist +antivolition +antiwar +antiwarlike +antiwaste +antiwedge +antiweed +antiwit +antixerophthalmic +antizealot +antizymic +antizymotic +antler +antlered +antlerite +antlerless +antlia +antliate +Antlid +antling +antluetic +antodontalgic +antoeci +antoecian +antoecians +Antoinette +Anton +Antonella +Antonia +Antonina +antoninianus +Antonio +antonomasia +antonomastic +antonomastical +antonomastically +antonomasy +Antony +antonym +antonymous +antonymy +antorbital +antproof +antra +antral +antralgia +antre +antrectomy +antrin +antritis +antrocele +antronasal +antrophore +antrophose +antrorse +antrorsely +antroscope +antroscopy +Antrostomus +antrotome +antrotomy +antrotympanic +antrotympanitis +antrum +antrustion +antrustionship +antship +Antu +antu +Antum +Antwerp +antwise +anubing +Anubis +anucleate +anukabiet +Anukit +anuloma +Anura +anuran +anuresis +anuretic +anuria +anuric +anurous +anury +anus +anusim +anusvara +anutraminosa +anvasser +anvil +anvilsmith +anxietude +anxiety +anxious +anxiously +anxiousness +any +anybody +Anychia +anyhow +anyone +anyplace +Anystidae +anything +anythingarian +anythingarianism +anyway +anyways +anywhen +anywhere +anywhereness +anywheres +anywhy +anywise +anywither +Anzac +Anzanian +Ao +aogiri +Aoife +aonach +Aonian +aorist +aoristic +aoristically +aorta +aortal +aortarctia +aortectasia +aortectasis +aortic +aorticorenal +aortism +aortitis +aortoclasia +aortoclasis +aortolith +aortomalacia +aortomalaxis +aortopathy +aortoptosia +aortoptosis +aortorrhaphy +aortosclerosis +aortostenosis +aortotomy +aosmic +Aotea +Aotearoa +Aotes +Aotus +aoudad +Aouellimiden +Aoul +apa +apabhramsa +apace +Apache +apache +Apachette +apachism +apachite +apadana +apagoge +apagogic +apagogical +apagogically +apaid +Apalachee +apalit +Apama +apandry +Apanteles +Apantesis +apanthropia +apanthropy +apar +Aparai +aparaphysate +aparejo +Apargia +aparithmesis +apart +apartheid +aparthrosis +apartment +apartmental +apartness +apasote +apastron +apatan +Apatela +apatetic +apathetic +apathetical +apathetically +apathic +apathism +apathist +apathistical +apathogenic +Apathus +apathy +apatite +Apatornis +Apatosaurus +Apaturia +Apayao +ape +apeak +apectomy +apedom +apehood +apeiron +apelet +apelike +apeling +apellous +Apemantus +Apennine +apenteric +apepsia +apepsinia +apepsy +apeptic +aper +aperch +aperea +aperient +aperiodic +aperiodically +aperiodicity +aperispermic +aperistalsis +aperitive +apert +apertly +apertness +apertometer +apertural +aperture +apertured +Aperu +apery +apesthesia +apesthetic +apesthetize +Apetalae +apetaloid +apetalose +apetalous +apetalousness +apetaly +apex +apexed +aphaeresis +aphaeretic +aphagia +aphakia +aphakial +aphakic +Aphanapteryx +Aphanes +aphanesite +Aphaniptera +aphanipterous +aphanite +aphanitic +aphanitism +Aphanomyces +aphanophyre +aphanozygous +Apharsathacites +aphasia +aphasiac +aphasic +Aphelandra +Aphelenchus +aphelian +Aphelinus +aphelion +apheliotropic +apheliotropically +apheliotropism +Aphelops +aphemia +aphemic +aphengescope +aphengoscope +aphenoscope +apheresis +apheretic +aphesis +apheta +aphetic +aphetically +aphetism +aphetize +aphicidal +aphicide +aphid +aphides +aphidian +aphidicide +aphidicolous +aphidid +Aphididae +Aphidiinae +aphidious +Aphidius +aphidivorous +aphidolysin +aphidophagous +aphidozer +aphilanthropy +Aphis +aphlaston +aphlebia +aphlogistic +aphnology +aphodal +aphodian +Aphodius +aphodus +aphonia +aphonic +aphonous +aphony +aphoria +aphorism +aphorismatic +aphorismer +aphorismic +aphorismical +aphorismos +aphorist +aphoristic +aphoristically +aphorize +aphorizer +Aphoruridae +aphotic +aphototactic +aphototaxis +aphototropic +aphototropism +Aphra +aphrasia +aphrite +aphrizite +aphrodisia +aphrodisiac +aphrodisiacal +aphrodisian +Aphrodision +Aphrodistic +Aphrodite +Aphroditeum +aphroditic +Aphroditidae +aphroditous +aphrolite +aphronia +aphrosiderite +aphtha +Aphthartodocetae +Aphthartodocetic +Aphthartodocetism +aphthic +aphthitalite +aphthoid +aphthong +aphthongal +aphthongia +aphthous +aphydrotropic +aphydrotropism +aphyllose +aphyllous +aphylly +aphyric +Apiaca +Apiaceae +apiaceous +Apiales +apian +apiarian +apiarist +apiary +apiator +apicad +apical +apically +apices +Apician +apicifixed +apicilar +apicillary +apicitis +apickaback +apicoectomy +apicolysis +apicula +apicular +apiculate +apiculated +apiculation +apicultural +apiculture +apiculturist +apiculus +Apidae +apiece +apieces +apigenin +apii +apiin +apikoros +apilary +Apina +Apinae +Apinage +apinch +aping +apinoid +apio +Apioceridae +apioid +apioidal +apiole +apiolin +apiologist +apiology +apionol +Apios +apiose +Apiosoma +apiphobia +Apis +apish +apishamore +apishly +apishness +apism +apitong +apitpat +Apium +apivorous +apjohnite +aplacental +Aplacentalia +Aplacentaria +Aplacophora +aplacophoran +aplacophorous +aplanat +aplanatic +aplanatically +aplanatism +Aplanobacter +aplanogamete +aplanospore +aplasia +aplastic +Aplectrum +aplenty +aplite +aplitic +aplobasalt +aplodiorite +Aplodontia +Aplodontiidae +aplomb +aplome +Aplopappus +aploperistomatous +aplostemonous +aplotaxene +aplotomy +Apluda +aplustre +Aplysia +apnea +apneal +apneic +apneumatic +apneumatosis +Apneumona +apneumonous +apneustic +apoaconitine +apoatropine +apobiotic +apoblast +apocaffeine +apocalypse +apocalypst +apocalypt +apocalyptic +apocalyptical +apocalyptically +apocalypticism +apocalyptism +apocalyptist +apocamphoric +apocarp +apocarpous +apocarpy +apocatastasis +apocatastatic +apocatharsis +apocenter +apocentric +apocentricity +apocha +apocholic +apochromat +apochromatic +apochromatism +apocinchonine +apocodeine +apocopate +apocopated +apocopation +apocope +apocopic +apocrenic +apocrisiary +Apocrita +apocrustic +apocryph +Apocrypha +apocryphal +apocryphalist +apocryphally +apocryphalness +apocryphate +apocryphon +Apocynaceae +apocynaceous +apocyneous +Apocynum +apod +Apoda +apodal +apodan +apodeipnon +apodeixis +apodema +apodemal +apodematal +apodeme +Apodes +Apodia +apodia +apodictic +apodictical +apodictically +apodictive +Apodidae +apodixis +apodosis +apodous +apodyterium +apoembryony +apofenchene +apogaeic +apogalacteum +apogamic +apogamically +apogamous +apogamously +apogamy +apogeal +apogean +apogee +apogeic +apogenous +apogeny +apogeotropic +apogeotropically +apogeotropism +Apogon +Apogonidae +apograph +apographal +apoharmine +apohyal +Apoidea +apoise +apojove +apokrea +apokreos +apolar +apolarity +apolaustic +apolegamic +Apolista +Apolistan +Apollinarian +Apollinarianism +Apolline +Apollo +Apollonia +Apollonian +Apollonic +apollonicon +Apollonistic +Apolloship +Apollyon +apologal +apologete +apologetic +apologetical +apologetically +apologetics +apologia +apologist +apologize +apologizer +apologue +apology +apolousis +Apolysin +apolysis +apolytikion +apomecometer +apomecometry +apometabolic +apometabolism +apometabolous +apometaboly +apomictic +apomictical +apomixis +apomorphia +apomorphine +aponeurology +aponeurorrhaphy +aponeurosis +aponeurositis +aponeurotic +aponeurotome +aponeurotomy +aponia +aponic +Aponogeton +Aponogetonaceae +aponogetonaceous +apoop +apopenptic +apopetalous +apophantic +apophasis +apophatic +Apophis +apophlegmatic +apophonia +apophony +apophorometer +apophthegm +apophthegmatist +apophyge +apophylactic +apophylaxis +apophyllite +apophyllous +apophysary +apophysate +apophyseal +apophysis +apophysitis +apoplasmodial +apoplastogamous +apoplectic +apoplectical +apoplectically +apoplectiform +apoplectoid +apoplex +apoplexy +apopyle +apoquinamine +apoquinine +aporetic +aporetical +aporhyolite +aporia +Aporobranchia +aporobranchian +Aporobranchiata +Aporocactus +Aporosa +aporose +aporphin +aporphine +Aporrhaidae +Aporrhais +aporrhaoid +aporrhegma +aport +aportoise +aposafranine +aposaturn +aposaturnium +aposematic +aposematically +aposepalous +aposia +aposiopesis +aposiopetic +apositia +apositic +aposoro +aposporogony +aposporous +apospory +apostasis +apostasy +apostate +apostatic +apostatical +apostatically +apostatism +apostatize +apostaxis +apostemate +apostematic +apostemation +apostematous +aposteme +aposteriori +aposthia +apostil +apostle +apostlehood +apostleship +apostolate +apostoless +apostoli +Apostolian +Apostolic +apostolic +apostolical +apostolically +apostolicalness +Apostolici +apostolicism +apostolicity +apostolize +Apostolos +apostrophal +apostrophation +apostrophe +apostrophic +apostrophied +apostrophize +apostrophus +Apotactic +Apotactici +apotelesm +apotelesmatic +apotelesmatical +apothecal +apothecary +apothecaryship +apothece +apothecial +apothecium +apothegm +apothegmatic +apothegmatical +apothegmatically +apothegmatist +apothegmatize +apothem +apotheose +apotheoses +apotheosis +apotheosize +apothesine +apothesis +apotome +apotracheal +apotropaic +apotropaion +apotropaism +apotropous +apoturmeric +apotype +apotypic +apout +apoxesis +Apoxyomenos +apozem +apozema +apozemical +apozymase +Appalachia +Appalachian +appall +appalling +appallingly +appallment +appalment +appanage +appanagist +apparatus +apparel +apparelment +apparence +apparency +apparent +apparently +apparentness +apparition +apparitional +apparitor +appassionata +appassionato +appay +appeal +appealability +appealable +appealer +appealing +appealingly +appealingness +appear +appearance +appearanced +appearer +appeasable +appeasableness +appeasably +appease +appeasement +appeaser +appeasing +appeasingly +appeasive +appellability +appellable +appellancy +appellant +appellate +appellation +appellational +appellative +appellatived +appellatively +appellativeness +appellatory +appellee +appellor +append +appendage +appendaged +appendalgia +appendance +appendancy +appendant +appendectomy +appendical +appendicalgia +appendice +appendicectasis +appendicectomy +appendices +appendicial +appendicious +appendicitis +appendicle +appendicocaecostomy +appendicostomy +appendicular +Appendicularia +appendicularian +Appendiculariidae +Appendiculata +appendiculate +appendiculated +appenditious +appendix +appendorontgenography +appendotome +appentice +apperceive +apperception +apperceptionism +apperceptionist +apperceptionistic +apperceptive +apperceptively +appercipient +appersonation +appertain +appertainment +appertinent +appet +appete +appetence +appetency +appetent +appetently +appetibility +appetible +appetibleness +appetite +appetition +appetitional +appetitious +appetitive +appetize +appetizement +appetizer +appetizingly +appinite +Appius +applanate +applanation +applaud +applaudable +applaudably +applauder +applaudingly +applause +applausive +applausively +apple +appleberry +appleblossom +applecart +appledrane +applegrower +applejack +applejohn +applemonger +applenut +appleringy +appleroot +applesauce +applewife +applewoman +appliable +appliableness +appliably +appliance +appliant +applicability +applicable +applicableness +applicably +applicancy +applicant +applicate +application +applicative +applicatively +applicator +applicatorily +applicatory +applied +appliedly +applier +applique +applosion +applosive +applot +applotment +apply +applyingly +applyment +appoggiatura +appoint +appointable +appointe +appointee +appointer +appointive +appointment +appointor +Appomatox +Appomattoc +apport +apportion +apportionable +apportioner +apportionment +apposability +apposable +appose +apposer +apposiopestic +apposite +appositely +appositeness +apposition +appositional +appositionally +appositive +appositively +appraisable +appraisal +appraise +appraisement +appraiser +appraising +appraisingly +appraisive +appreciable +appreciably +appreciant +appreciate +appreciatingly +appreciation +appreciational +appreciativ +appreciative +appreciatively +appreciativeness +appreciator +appreciatorily +appreciatory +appredicate +apprehend +apprehender +apprehendingly +apprehensibility +apprehensible +apprehensibly +apprehension +apprehensive +apprehensively +apprehensiveness +apprend +apprense +apprentice +apprenticehood +apprenticement +apprenticeship +appressed +appressor +appressorial +appressorium +appreteur +apprise +apprize +apprizement +apprizer +approach +approachability +approachabl +approachable +approachableness +approacher +approaching +approachless +approachment +approbate +approbation +approbative +approbativeness +approbator +approbatory +approof +appropinquate +appropinquation +appropinquity +appropre +appropriable +appropriate +appropriately +appropriateness +appropriation +appropriative +appropriativeness +appropriator +approvable +approvableness +approval +approvance +approve +approvedly +approvedness +approvement +approver +approvingly +approximal +approximate +approximately +approximation +approximative +approximatively +approximativeness +approximator +appulse +appulsion +appulsive +appulsively +appurtenance +appurtenant +apractic +apraxia +apraxic +apricate +aprication +aprickle +apricot +April +Aprilesque +Apriline +Aprilis +apriori +apriorism +apriorist +aprioristic +apriority +Aprocta +aproctia +aproctous +apron +aproneer +apronful +apronless +apronlike +apropos +aprosexia +aprosopia +aprosopous +aproterodont +apse +apselaphesia +apselaphesis +apsidal +apsidally +apsides +apsidiole +apsis +apsychia +apsychical +apt +Aptal +Aptenodytes +Aptera +apteral +apteran +apterial +apterium +apteroid +apterous +Apteryges +apterygial +Apterygidae +Apterygiformes +Apterygogenea +Apterygota +apterygote +apterygotous +Apteryx +Aptian +Aptiana +aptitude +aptitudinal +aptitudinally +aptly +aptness +aptote +aptotic +aptyalia +aptyalism +aptychus +Apulian +apulmonic +apulse +apurpose +Apus +apyonin +apyrene +apyretic +apyrexia +apyrexial +apyrexy +apyrotype +apyrous +aqua +aquabelle +aquabib +aquacade +aquacultural +aquaculture +aquaemanale +aquafortist +aquage +aquagreen +aquamarine +aquameter +aquaplane +aquapuncture +aquarelle +aquarellist +aquaria +aquarial +Aquarian +aquarian +Aquarid +Aquarii +aquariist +aquarium +Aquarius +aquarter +aquascutum +aquatic +aquatical +aquatically +aquatile +aquatint +aquatinta +aquatinter +aquation +aquativeness +aquatone +aquavalent +aquavit +aqueduct +aqueoglacial +aqueoigneous +aqueomercurial +aqueous +aqueously +aqueousness +aquicolous +aquicultural +aquiculture +aquiculturist +aquifer +aquiferous +Aquifoliaceae +aquifoliaceous +aquiform +Aquila +Aquilaria +aquilawood +aquilege +Aquilegia +Aquilian +Aquilid +aquiline +aquilino +aquincubital +aquincubitalism +Aquinist +aquintocubital +aquintocubitalism +aquiparous +Aquitanian +aquiver +aquo +aquocapsulitis +aquocarbonic +aquocellolitis +aquopentamminecobaltic +aquose +aquosity +aquotization +aquotize +ar +ara +Arab +araba +araban +arabana +Arabella +arabesque +arabesquely +arabesquerie +Arabian +Arabianize +Arabic +Arabicism +Arabicize +Arabidopsis +arability +arabin +arabinic +arabinose +arabinosic +Arabis +Arabism +Arabist +arabit +arabitol +arabiyeh +Arabize +arable +Arabophil +Araby +araca +Aracana +aracanga +aracari +Araceae +araceous +arachic +arachidonic +arachin +Arachis +arachnactis +Arachne +arachnean +arachnid +Arachnida +arachnidan +arachnidial +arachnidism +arachnidium +arachnism +Arachnites +arachnitis +arachnoid +arachnoidal +Arachnoidea +arachnoidea +arachnoidean +arachnoiditis +arachnological +arachnologist +arachnology +Arachnomorphae +arachnophagous +arachnopia +arad +Aradidae +arado +araeostyle +araeosystyle +Aragallus +Aragonese +Aragonian +aragonite +araguato +arain +Arains +Arakanese +arakawaite +arake +Arales +Aralia +Araliaceae +araliaceous +araliad +Araliaephyllum +aralie +Araliophyllum +aralkyl +aralkylated +Aramaean +Aramaic +Aramaicize +Aramaism +aramayoite +Aramidae +aramina +Araminta +Aramis +Aramitess +Aramu +Aramus +Aranea +Araneae +araneid +Araneida +araneidan +araneiform +Araneiformes +Araneiformia +aranein +Araneina +Araneoidea +araneologist +araneology +araneous +aranga +arango +Aranyaka +aranzada +arapahite +Arapaho +arapaima +araphorostic +arapunga +Araquaju +arar +Arara +arara +araracanga +ararao +ararauna +arariba +araroba +arati +aration +aratory +Araua +Arauan +Araucan +Araucanian +Araucano +Araucaria +Araucariaceae +araucarian +Araucarioxylon +Araujia +Arauna +Arawa +Arawak +Arawakan +Arawakian +arba +Arbacia +arbacin +arbalest +arbalester +arbalestre +arbalestrier +arbalist +arbalister +arbalo +Arbela +arbiter +arbitrable +arbitrager +arbitragist +arbitral +arbitrament +arbitrarily +arbitrariness +arbitrary +arbitrate +arbitration +arbitrational +arbitrationist +arbitrative +arbitrator +arbitratorship +arbitratrix +arbitrement +arbitrer +arbitress +arboloco +arbor +arboraceous +arboral +arborary +arborator +arboreal +arboreally +arborean +arbored +arboreous +arborescence +arborescent +arborescently +arboresque +arboret +arboreta +arboretum +arborical +arboricole +arboricoline +arboricolous +arboricultural +arboriculture +arboriculturist +arboriform +arborist +arborization +arborize +arboroid +arborolatry +arborous +arborvitae +arborway +arbuscle +arbuscula +arbuscular +arbuscule +arbusterol +arbustum +arbutase +arbute +arbutean +arbutin +arbutinase +arbutus +arc +arca +Arcacea +arcade +Arcadia +Arcadian +arcadian +Arcadianism +Arcadianly +Arcadic +Arcady +arcana +arcanal +arcane +arcanite +arcanum +arcate +arcature +Arcella +Arceuthobium +arch +archabomination +archae +archaecraniate +Archaeoceti +Archaeocyathidae +Archaeocyathus +archaeogeology +archaeographic +archaeographical +archaeography +archaeolatry +archaeolith +archaeolithic +archaeologer +archaeologian +archaeologic +archaeological +archaeologically +archaeologist +archaeology +Archaeopithecus +Archaeopteris +Archaeopterygiformes +Archaeopteryx +Archaeornis +Archaeornithes +archaeostoma +Archaeostomata +archaeostomatous +archagitator +archaic +archaical +archaically +archaicism +archaism +archaist +archaistic +archaize +archaizer +archangel +archangelic +Archangelica +archangelical +archangelship +archantagonist +archantiquary +archapostate +archapostle +archarchitect +archarios +archartist +archband +archbeacon +archbeadle +archbishop +archbishopess +archbishopric +archbishopry +archbotcher +archboutefeu +archbuffoon +archbuilder +archchampion +archchaplain +archcharlatan +archcheater +archchemic +archchief +archchronicler +archcity +archconfraternity +archconsoler +archconspirator +archcorrupter +archcorsair +archcount +archcozener +archcriminal +archcritic +archcrown +archcupbearer +archdapifer +archdapifership +archdeacon +archdeaconate +archdeaconess +archdeaconry +archdeaconship +archdean +archdeanery +archdeceiver +archdefender +archdemon +archdepredator +archdespot +archdetective +archdevil +archdiocesan +archdiocese +archdiplomatist +archdissembler +archdisturber +archdivine +archdogmatist +archdolt +archdruid +archducal +archduchess +archduchy +archduke +archdukedom +arche +archeal +Archean +archearl +archebiosis +archecclesiastic +archecentric +arched +archegone +archegonial +Archegoniata +Archegoniatae +archegoniate +archegoniophore +archegonium +archegony +Archegosaurus +archeion +Archelaus +Archelenis +archelogy +Archelon +archemperor +Archencephala +archencephalic +archenemy +archengineer +archenteric +archenteron +archeocyte +Archeozoic +Archer +archer +archeress +archerfish +archership +archery +arches +archespore +archesporial +archesporium +archetypal +archetypally +archetype +archetypic +archetypical +archetypically +archetypist +archeunuch +archeus +archexorcist +archfelon +archfiend +archfire +archflamen +archflatterer +archfoe +archfool +archform +archfounder +archfriend +archgenethliac +archgod +archgomeral +archgovernor +archgunner +archhead +archheart +archheresy +archheretic +archhost +archhouse +archhumbug +archhypocrisy +archhypocrite +Archiannelida +archiater +Archibald +archibenthal +archibenthic +archibenthos +archiblast +archiblastic +archiblastoma +archiblastula +Archibuteo +archicantor +archicarp +archicerebrum +Archichlamydeae +archichlamydeous +archicleistogamous +archicleistogamy +archicoele +archicontinent +archicyte +archicytula +Archidamus +Archidiaceae +archidiaconal +archidiaconate +archididascalian +archididascalos +Archidiskodon +Archidium +archidome +Archie +archiepiscopacy +archiepiscopal +archiepiscopally +archiepiscopate +archiereus +archigaster +archigastrula +archigenesis +archigonic +archigonocyte +archigony +archiheretical +archikaryon +archil +archilithic +Archilochian +archilowe +archimage +Archimago +archimagus +archimandrite +Archimedean +Archimedes +archimime +archimorphic +archimorula +archimperial +archimperialism +archimperialist +archimperialistic +archimpressionist +Archimycetes +archineuron +archinfamy +archinformer +arching +archipallial +archipallium +archipelagian +archipelagic +archipelago +archipin +archiplasm +archiplasmic +Archiplata +archiprelatical +archipresbyter +archipterygial +archipterygium +archisperm +Archispermae +archisphere +archispore +archistome +archisupreme +archisymbolical +architect +architective +architectonic +Architectonica +architectonically +architectonics +architectress +architectural +architecturalist +architecturally +architecture +architecturesque +Architeuthis +architis +architraval +architrave +architraved +architypographer +archival +archive +archivist +archivolt +archizoic +archjockey +archking +archknave +archleader +archlecher +archleveler +archlexicographer +archliar +archlute +archly +archmachine +archmagician +archmagirist +archmarshal +archmediocrity +archmessenger +archmilitarist +archmime +archminister +archmock +archmocker +archmockery +archmonarch +archmonarchist +archmonarchy +archmugwump +archmurderer +archmystagogue +archness +archocele +archocystosyrinx +archology +archon +archonship +archont +archontate +Archontia +archontic +archoplasm +archoplasmic +archoptoma +archoptosis +archorrhagia +archorrhea +archostegnosis +archostenosis +archosyrinx +archoverseer +archpall +archpapist +archpastor +archpatriarch +archpatron +archphilosopher +archphylarch +archpiece +archpilferer +archpillar +archpirate +archplagiarist +archplagiary +archplayer +archplotter +archplunderer +archplutocrat +archpoet +archpolitician +archpontiff +archpractice +archprelate +archprelatic +archprelatical +archpresbyter +archpresbyterate +archpresbytery +archpretender +archpriest +archpriesthood +archpriestship +archprimate +archprince +archprophet +archprotopope +archprototype +archpublican +archpuritan +archradical +archrascal +archreactionary +archrebel +archregent +archrepresentative +archrobber +archrogue +archruler +archsacrificator +archsacrificer +archsaint +archsatrap +archscoundrel +archseducer +archsee +archsewer +archshepherd +archsin +archsnob +archspirit +archspy +archsteward +archswindler +archsynagogue +archtempter +archthief +archtraitor +archtreasurer +archtreasurership +archturncoat +archtyrant +archurger +archvagabond +archvampire +archvestryman +archvillain +archvillainy +archvisitor +archwag +archway +archwench +archwise +archworker +archworkmaster +Archy +archy +Arcidae +Arcifera +arciferous +arcifinious +arciform +arcing +Arcite +arcked +arcking +arcocentrous +arcocentrum +arcograph +Arcos +Arctalia +Arctalian +Arctamerican +arctation +Arctia +arctian +arctic +arctically +arctician +arcticize +arcticward +arcticwards +arctiid +Arctiidae +Arctisca +Arctium +Arctocephalus +Arctogaea +Arctogaeal +Arctogaean +arctoid +Arctoidea +arctoidean +Arctomys +Arctos +Arctosis +Arctostaphylos +Arcturia +Arcturus +arcual +arcuale +arcuate +arcuated +arcuately +arcuation +arcubalist +arcubalister +arcula +arculite +ardassine +Ardea +Ardeae +ardeb +Ardeidae +Ardelia +ardella +ardency +ardennite +ardent +ardently +ardentness +Ardhamagadhi +Ardhanari +ardish +Ardisia +Ardisiaceae +ardoise +ardor +ardri +ardu +arduinite +arduous +arduously +arduousness +ardurous +are +area +areach +aread +areal +areality +Arean +arear +areasoner +areaway +Areca +Arecaceae +arecaceous +arecaidin +arecaidine +arecain +arecaine +Arecales +arecolidin +arecolidine +arecolin +arecoline +Arecuna +ared +areek +areel +arefact +arefaction +aregenerative +aregeneratory +areito +arena +arenaceous +arenae +Arenaria +arenariae +arenarious +arenation +arend +arendalite +areng +Arenga +Arenicola +arenicole +arenicolite +arenicolous +Arenig +arenilitic +arenoid +arenose +arenosity +arent +areocentric +areographer +areographic +areographical +areographically +areography +areola +areolar +areolate +areolated +areolation +areole +areolet +areologic +areological +areologically +areologist +areology +areometer +areometric +areometrical +areometry +Areopagist +Areopagite +Areopagitic +Areopagitica +Areopagus +areotectonics +areroscope +aretaics +arete +Arethusa +Arethuse +Aretinian +arfvedsonite +argal +argala +argali +argans +Argante +Argas +argasid +Argasidae +Argean +argeers +argel +Argemone +argemony +argenol +argent +argental +argentamid +argentamide +argentamin +argentamine +argentate +argentation +argenteous +argenter +argenteum +argentic +argenticyanide +argentide +argentiferous +Argentina +Argentine +argentine +Argentinean +Argentinian +Argentinidae +argentinitrate +Argentinize +Argentino +argention +argentite +argentojarosite +argentol +argentometric +argentometrically +argentometry +argenton +argentoproteinum +argentose +argentous +argentum +Argestes +arghan +arghel +arghool +Argid +argil +argillaceous +argilliferous +argillite +argillitic +argilloarenaceous +argillocalcareous +argillocalcite +argilloferruginous +argilloid +argillomagnesian +argillous +arginine +argininephosphoric +Argiope +Argiopidae +Argiopoidea +Argive +Argo +argo +Argoan +argol +argolet +Argolian +Argolic +Argolid +argon +Argonaut +Argonauta +Argonautic +Argonne +argosy +argot +argotic +Argovian +arguable +argue +arguer +argufier +argufy +Argulus +argument +argumental +argumentation +argumentatious +argumentative +argumentatively +argumentativeness +argumentator +argumentatory +Argus +argusfish +Argusianus +Arguslike +argute +argutely +arguteness +Argyle +Argyll +Argynnis +argyranthemous +argyranthous +Argyraspides +argyria +argyric +argyrite +argyrocephalous +argyrodite +Argyrol +Argyroneta +Argyropelecus +argyrose +argyrosis +Argyrosomus +argyrythrose +arhar +arhat +arhatship +Arhauaco +arhythmic +aria +Ariadne +Arian +Ariana +Arianism +Arianistic +Arianistical +Arianize +Arianizer +Arianrhod +aribine +Arician +aricine +arid +Arided +aridge +aridian +aridity +aridly +aridness +ariegite +Ariel +ariel +arienzo +Aries +arietation +Arietid +arietinous +arietta +aright +arightly +arigue +Ariidae +Arikara +aril +ariled +arillary +arillate +arillated +arilliform +arillode +arillodium +arilloid +arillus +Arimasp +Arimaspian +Arimathaean +Ariocarpus +Arioi +Arioian +Arion +ariose +arioso +ariot +aripple +Arisaema +arisard +arise +arisen +arist +arista +Aristarch +Aristarchian +aristarchy +aristate +Aristeas +Aristida +Aristides +Aristippus +aristocracy +aristocrat +aristocratic +aristocratical +aristocratically +aristocraticalness +aristocraticism +aristocraticness +aristocratism +aristodemocracy +aristodemocratical +aristogenesis +aristogenetic +aristogenic +aristogenics +Aristol +Aristolochia +Aristolochiaceae +aristolochiaceous +Aristolochiales +aristolochin +aristolochine +aristological +aristologist +aristology +aristomonarchy +Aristophanic +aristorepublicanism +Aristotelian +Aristotelianism +Aristotelic +Aristotelism +aristotype +aristulate +arite +arithmetic +arithmetical +arithmetically +arithmetician +arithmetization +arithmetize +arithmic +arithmocracy +arithmocratic +arithmogram +arithmograph +arithmography +arithmomania +arithmometer +Arius +Arivaipa +Arizona +Arizonan +Arizonian +arizonite +arjun +ark +Arkab +Arkansan +Arkansas +Arkansawyer +arkansite +Arkite +arkite +arkose +arkosic +arksutite +Arlene +Arleng +arles +Arline +arm +armada +armadilla +Armadillididae +Armadillidium +armadillo +Armado +Armageddon +Armageddonist +armagnac +armament +armamentarium +armamentary +armangite +armariolum +armarium +Armata +Armatoles +Armatoli +armature +armbone +armchair +armchaired +armed +armeniaceous +Armenian +Armenic +Armenize +Armenoid +armer +Armeria +Armeriaceae +armet +armful +armgaunt +armhole +armhoop +Armida +armied +armiferous +armiger +armigeral +armigerous +armil +armilla +Armillaria +armillary +armillate +armillated +arming +Arminian +Arminianism +Arminianize +Arminianizer +armipotence +armipotent +armisonant +armisonous +armistice +armless +armlet +armload +armoire +armonica +armor +Armoracia +armored +armorer +armorial +Armoric +Armorican +Armorician +armoried +armorist +armorproof +armorwise +armory +Armouchiquois +armozeen +armpiece +armpit +armplate +armrack +armrest +arms +armscye +armure +army +arn +arna +Arnaut +arnberry +Arne +Arneb +Arnebia +arnee +arni +arnica +Arnold +Arnoldist +Arnoseris +arnotta +arnotto +Arnusian +arnut +Aro +aroar +aroast +arock +aroeira +aroid +aroideous +Aroides +aroint +arolium +arolla +aroma +aromacity +aromadendrin +aromatic +aromatically +aromaticness +aromatite +aromatites +aromatization +aromatize +aromatizer +aromatophor +aromatophore +Aronia +aroon +Aroras +Arosaguntacook +arose +around +arousal +arouse +arousement +arouser +arow +aroxyl +arpeggiando +arpeggiated +arpeggiation +arpeggio +arpeggioed +arpen +arpent +arquerite +arquifoux +arracach +arracacha +Arracacia +arrack +arrah +arraign +arraigner +arraignment +arrame +arrange +arrangeable +arrangement +arranger +arrant +arrantly +Arras +arras +arrased +arrasene +arrastra +arrastre +arratel +arrau +array +arrayal +arrayer +arrayment +arrear +arrearage +arrect +arrector +arrendation +arrenotokous +arrenotoky +arrent +arrentable +arrentation +arreptitious +arrest +arrestable +arrestation +arrestee +arrester +arresting +arrestingly +arrestive +arrestment +arrestor +Arretine +arrhenal +Arrhenatherum +arrhenoid +arrhenotokous +arrhenotoky +arrhinia +arrhizal +arrhizous +arrhythmia +arrhythmic +arrhythmical +arrhythmically +arrhythmous +arrhythmy +arriage +arriba +arride +arridge +arrie +arriere +Arriet +arrimby +arris +arrish +arrisways +arriswise +arrival +arrive +arriver +arroba +arrogance +arrogancy +arrogant +arrogantly +arrogantness +arrogate +arrogatingly +arrogation +arrogative +arrogator +arrojadite +arrope +arrosive +arrow +arrowbush +arrowed +arrowhead +arrowheaded +arrowleaf +arrowless +arrowlet +arrowlike +arrowplate +arrowroot +arrowsmith +arrowstone +arrowweed +arrowwood +arrowworm +arrowy +arroyo +Arruague +Arry +Arryish +Arsacid +Arsacidan +arsanilic +arse +arsedine +arsenal +arsenate +arsenation +arseneted +arsenetted +arsenfast +arsenferratose +arsenhemol +arseniasis +arseniate +arsenic +arsenical +arsenicalism +arsenicate +arsenicism +arsenicize +arsenicophagy +arsenide +arseniferous +arsenillo +arseniopleite +arseniosiderite +arsenious +arsenism +arsenite +arsenium +arseniuret +arseniureted +arsenization +arseno +arsenobenzene +arsenobenzol +arsenobismite +arsenoferratin +arsenofuran +arsenohemol +arsenolite +arsenophagy +arsenophen +arsenophenol +arsenophenylglycin +arsenopyrite +arsenostyracol +arsenotherapy +arsenotungstates +arsenotungstic +arsenous +arsenoxide +arsenyl +arses +arsesmart +arsheen +arshin +arshine +arsine +arsinic +arsino +Arsinoitherium +arsis +arsle +arsmetrik +arsmetrike +arsnicker +arsoite +arson +arsonate +arsonation +arsonic +arsonist +arsonite +arsonium +arsono +arsonvalization +arsphenamine +arsyl +arsylene +Art +art +artaba +artabe +artal +Artamidae +Artamus +artar +artarine +artcraft +artefact +artel +Artemas +Artemia +Artemis +Artemisia +artemisic +artemisin +Artemision +Artemisium +arteriagra +arterial +arterialization +arterialize +arterially +arteriarctia +arteriasis +arteriectasia +arteriectasis +arteriectopia +arterin +arterioarctia +arteriocapillary +arteriococcygeal +arteriodialysis +arteriodiastasis +arteriofibrosis +arteriogenesis +arteriogram +arteriograph +arteriography +arteriole +arteriolith +arteriology +arteriolosclerosis +arteriomalacia +arteriometer +arteriomotor +arterionecrosis +arteriopalmus +arteriopathy +arteriophlebotomy +arterioplania +arterioplasty +arteriopressor +arteriorenal +arteriorrhagia +arteriorrhaphy +arteriorrhexis +arteriosclerosis +arteriosclerotic +arteriospasm +arteriostenosis +arteriostosis +arteriostrepsis +arteriosympathectomy +arteriotome +arteriotomy +arteriotrepsis +arterious +arteriovenous +arterioversion +arterioverter +arteritis +artery +Artesian +artesian +artful +artfully +artfulness +Artgum +artha +arthel +arthemis +arthragra +arthral +arthralgia +arthralgic +arthrectomy +arthredema +arthrempyesis +arthresthesia +arthritic +arthritical +arthriticine +arthritis +arthritism +arthrobacterium +arthrobranch +arthrobranchia +arthrocace +arthrocarcinoma +arthrocele +arthrochondritis +arthroclasia +arthrocleisis +arthroclisis +arthroderm +arthrodesis +arthrodia +arthrodial +arthrodic +Arthrodira +arthrodiran +arthrodire +arthrodirous +Arthrodonteae +arthrodynia +arthrodynic +arthroempyema +arthroempyesis +arthroendoscopy +Arthrogastra +arthrogastran +arthrogenous +arthrography +arthrogryposis +arthrolite +arthrolith +arthrolithiasis +arthrology +arthromeningitis +arthromere +arthromeric +arthrometer +arthrometry +arthroncus +arthroneuralgia +arthropathic +arthropathology +arthropathy +arthrophlogosis +arthrophyma +arthroplastic +arthroplasty +arthropleura +arthropleure +arthropod +Arthropoda +arthropodal +arthropodan +arthropodous +Arthropomata +arthropomatous +arthropterous +arthropyosis +arthrorheumatism +arthrorrhagia +arthrosclerosis +arthrosia +arthrosis +arthrospore +arthrosporic +arthrosporous +arthrosteitis +arthrosterigma +arthrostome +arthrostomy +Arthrostraca +arthrosynovitis +arthrosyrinx +arthrotome +arthrotomy +arthrotrauma +arthrotropic +arthrotyphoid +arthrous +arthroxerosis +Arthrozoa +arthrozoan +arthrozoic +Arthur +Arthurian +Arthuriana +artiad +artichoke +article +articled +articulability +articulable +articulacy +articulant +articular +articulare +articularly +articulary +Articulata +articulate +articulated +articulately +articulateness +articulation +articulationist +articulative +articulator +articulatory +articulite +articulus +Artie +artifact +artifactitious +artifice +artificer +artificership +artificial +artificialism +artificiality +artificialize +artificially +artificialness +artiller +artillerist +artillery +artilleryman +artilleryship +artiness +artinite +Artinskian +artiodactyl +Artiodactyla +artiodactylous +artiphyllous +artisan +artisanship +artist +artistdom +artiste +artistic +artistical +artistically +artistry +artless +artlessly +artlessness +artlet +artlike +Artocarpaceae +artocarpad +artocarpeous +artocarpous +Artocarpus +artolater +artophagous +artophorion +artotype +artotypy +Artotyrite +artware +arty +aru +Aruac +arui +aruke +Arulo +Arum +arumin +Aruncus +arundiferous +arundinaceous +Arundinaria +arundineous +Arundo +Arunta +arupa +arusa +arusha +arustle +arval +arvel +Arverni +Arvicola +arvicole +Arvicolinae +arvicoline +arvicolous +arviculture +arx +ary +Arya +Aryan +Aryanism +Aryanization +Aryanize +aryballoid +aryballus +aryepiglottic +aryl +arylamine +arylamino +arylate +arytenoid +arytenoidal +arzan +Arzava +Arzawa +arzrunite +arzun +As +as +Asa +asaddle +asafetida +Asahel +asak +asale +asana +Asaph +asaphia +Asaphic +asaphid +Asaphidae +Asaphus +asaprol +asarabacca +Asaraceae +Asarh +asarite +asaron +asarone +asarotum +Asarum +asbest +asbestic +asbestiform +asbestine +asbestinize +asbestoid +asbestoidal +asbestos +asbestosis +asbestous +asbestus +asbolin +asbolite +Ascabart +Ascalabota +ascan +Ascanian +Ascanius +ascare +ascariasis +ascaricidal +ascaricide +ascarid +Ascaridae +ascarides +Ascaridia +ascaridiasis +ascaridole +Ascaris +ascaron +Ascella +ascellus +ascend +ascendable +ascendance +ascendancy +ascendant +ascendence +ascendency +ascendent +ascender +ascendible +ascending +ascendingly +ascension +ascensional +ascensionist +Ascensiontide +ascensive +ascent +ascertain +ascertainable +ascertainableness +ascertainably +ascertainer +ascertainment +ascescency +ascescent +ascetic +ascetical +ascetically +asceticism +Ascetta +aschaffite +ascham +aschistic +asci +ascian +Ascidia +Ascidiacea +Ascidiae +ascidian +ascidiate +ascidicolous +ascidiferous +ascidiform +ascidioid +Ascidioida +Ascidioidea +Ascidiozoa +ascidiozooid +ascidium +asciferous +ascigerous +ascii +ascites +ascitic +ascitical +ascititious +asclent +Asclepiad +asclepiad +Asclepiadaceae +asclepiadaceous +Asclepiadae +Asclepiadean +asclepiadeous +Asclepiadic +Asclepian +Asclepias +asclepidin +asclepidoid +Asclepieion +asclepin +Asclepius +ascocarp +ascocarpous +Ascochyta +ascogenous +ascogone +ascogonial +ascogonidium +ascogonium +ascolichen +Ascolichenes +ascoma +ascomycetal +ascomycete +Ascomycetes +ascomycetous +ascon +Ascones +ascophore +ascophorous +Ascophyllum +ascorbic +ascospore +ascosporic +ascosporous +Ascot +ascot +Ascothoracica +ascribable +ascribe +ascript +ascription +ascriptitii +ascriptitious +ascriptitius +ascry +ascula +Ascupart +ascus +ascyphous +Ascyrum +asdic +ase +asearch +asecretory +aseethe +aseismatic +aseismic +aseismicity +aseity +aselgeia +asellate +Aselli +Asellidae +Aselline +Asellus +asem +asemasia +asemia +asepsis +aseptate +aseptic +aseptically +asepticism +asepticize +aseptify +aseptol +aseptolin +asexual +asexuality +asexualization +asexualize +asexually +asfetida +ash +Asha +ashake +ashame +ashamed +ashamedly +ashamedness +ashamnu +Ashangos +Ashantee +Ashanti +Asharasi +ashberry +ashcake +ashen +Asher +asherah +Asherites +ashery +ashes +ashet +ashily +ashimmer +ashine +ashiness +ashipboard +Ashir +ashiver +Ashkenazic +Ashkenazim +ashkoko +ashlar +ashlared +ashlaring +ashless +ashling +Ashluslay +ashman +Ashmolean +Ashochimi +ashore +ashpan +ashpit +ashplant +ashraf +ashrafi +ashthroat +Ashur +ashur +ashweed +ashwort +ashy +asialia +Asian +Asianic +Asianism +Asiarch +Asiarchate +Asiatic +Asiatical +Asiatically +Asiatican +Asiaticism +Asiaticization +Asiaticize +Asiatize +aside +asidehand +asideness +asiderite +asideu +asiento +asilid +Asilidae +Asilus +asimen +Asimina +asimmer +asinego +asinine +asininely +asininity +asiphonate +asiphonogama +asitia +ask +askable +askance +askant +askar +askari +asker +askew +askingly +askip +asklent +Asklepios +askos +Askr +aslant +aslantwise +aslaver +asleep +aslop +aslope +aslumber +asmack +asmalte +asmear +asmile +asmoke +asmolder +asniffle +asnort +asoak +asocial +asok +asoka +asomatophyte +asomatous +asonant +asonia +asop +asor +asouth +asp +aspace +aspalathus +Aspalax +asparagic +asparagine +asparaginic +asparaginous +asparagus +asparagyl +asparkle +aspartate +aspartic +aspartyl +Aspasia +Aspatia +aspect +aspectable +aspectant +aspection +aspectual +aspen +asper +asperate +asperation +aspergation +asperge +asperger +Asperges +aspergil +aspergill +Aspergillaceae +Aspergillales +aspergilliform +aspergillin +aspergillosis +aspergillum +aspergillus +Asperifoliae +asperifoliate +asperifolious +asperite +asperity +aspermatic +aspermatism +aspermatous +aspermia +aspermic +aspermous +asperous +asperously +asperse +aspersed +asperser +aspersion +aspersive +aspersively +aspersor +aspersorium +aspersory +Asperugo +Asperula +asperuloside +asperulous +asphalt +asphaltene +asphalter +asphaltic +asphaltite +asphaltum +aspheterism +aspheterize +asphodel +Asphodelaceae +Asphodeline +Asphodelus +asphyctic +asphyctous +asphyxia +asphyxial +asphyxiant +asphyxiate +asphyxiation +asphyxiative +asphyxiator +asphyxied +asphyxy +aspic +aspiculate +aspiculous +aspidate +aspidiaria +aspidinol +Aspidiotus +Aspidiske +Aspidistra +aspidium +Aspidobranchia +Aspidobranchiata +aspidobranchiate +Aspidocephali +Aspidochirota +Aspidoganoidei +aspidomancy +Aspidosperma +aspidospermine +aspirant +aspirata +aspirate +aspiration +aspirator +aspiratory +aspire +aspirer +aspirin +aspiring +aspiringly +aspiringness +aspish +asplanchnic +Asplenieae +asplenioid +Asplenium +asporogenic +asporogenous +asporous +asport +asportation +asporulate +aspout +asprawl +aspread +Aspredinidae +Aspredo +aspring +asprout +asquare +asquat +asqueal +asquint +asquirm +ass +assacu +assagai +assai +assail +assailable +assailableness +assailant +assailer +assailment +Assam +Assamese +Assamites +assapan +assapanic +assarion +assart +assary +assassin +assassinate +assassination +assassinative +assassinator +assassinatress +assassinist +assate +assation +assault +assaultable +assaulter +assaut +assay +assayable +assayer +assaying +assbaa +asse +assecuration +assecurator +assedation +assegai +asself +assemblable +assemblage +assemble +assembler +assembly +assemblyman +assent +assentaneous +assentation +assentatious +assentator +assentatorily +assentatory +assented +assenter +assentient +assenting +assentingly +assentive +assentiveness +assentor +assert +assertable +assertative +asserter +assertible +assertion +assertional +assertive +assertively +assertiveness +assertor +assertorial +assertorially +assertoric +assertorical +assertorically +assertorily +assertory +assertress +assertrix +assertum +assess +assessable +assessably +assessed +assessee +assession +assessionary +assessment +assessor +assessorial +assessorship +assessory +asset +assets +assever +asseverate +asseveratingly +asseveration +asseverative +asseveratively +asseveratory +asshead +assi +assibilate +assibilation +Assidean +assident +assidual +assidually +assiduity +assiduous +assiduously +assiduousness +assientist +assiento +assify +assign +assignability +assignable +assignably +assignat +assignation +assigned +assignee +assigneeship +assigner +assignment +assignor +assilag +assimilability +assimilable +assimilate +assimilation +assimilationist +assimilative +assimilativeness +assimilator +assimilatory +Assiniboin +assis +Assisan +assise +assish +assishly +assishness +assist +assistance +assistant +assistanted +assistantship +assistency +assister +assistful +assistive +assistless +assistor +assize +assizement +assizer +assizes +asslike +assman +Assmannshauser +assmanship +associability +associable +associableness +associate +associated +associatedness +associateship +association +associational +associationalism +associationalist +associationism +associationist +associationistic +associative +associatively +associativeness +associator +associatory +assoil +assoilment +assoilzie +assonance +assonanced +assonant +assonantal +assonantic +assonate +Assonia +assort +assortative +assorted +assortedness +assorter +assortive +assortment +assuade +assuage +assuagement +assuager +assuasive +assubjugate +assuetude +assumable +assumably +assume +assumed +assumedly +assumer +assuming +assumingly +assumingness +assumpsit +assumption +Assumptionist +assumptious +assumptiousness +assumptive +assumptively +assurable +assurance +assurant +assure +assured +assuredly +assuredness +assurer +assurge +assurgency +assurgent +assuring +assuringly +assyntite +Assyrian +Assyrianize +Assyriological +Assyriologist +Assyriologue +Assyriology +Assyroid +assythment +ast +asta +Astacidae +Astacus +Astakiwi +astalk +astarboard +astare +astart +Astarte +Astartian +Astartidae +astasia +astatic +astatically +astaticism +astatine +astatize +astatizer +astay +asteam +asteatosis +asteep +asteer +asteism +astelic +astely +aster +Asteraceae +asteraceous +Asterales +Asterella +astereognosis +asteria +asterial +Asterias +asteriated +Asteriidae +asterikos +asterin +Asterina +Asterinidae +asterioid +Asterion +asterion +Asterionella +asterisk +asterism +asterismal +astern +asternal +Asternata +asternia +Asterochiton +asteroid +asteroidal +Asteroidea +asteroidean +Asterolepidae +Asterolepis +Asterope +asterophyllite +Asterophyllites +Asterospondyli +asterospondylic +asterospondylous +Asteroxylaceae +Asteroxylon +Asterozoa +asterwort +asthenia +asthenic +asthenical +asthenobiosis +asthenobiotic +asthenolith +asthenology +asthenopia +asthenopic +asthenosphere +astheny +asthma +asthmatic +asthmatical +asthmatically +asthmatoid +asthmogenic +asthore +asthorin +Astian +astichous +astigmatic +astigmatical +astigmatically +astigmatism +astigmatizer +astigmatometer +astigmatoscope +astigmatoscopy +astigmia +astigmism +astigmometer +astigmometry +Astilbe +astilbe +astint +astipulate +astir +astite +astomatal +astomatous +astomia +astomous +astonied +astonish +astonishedly +astonisher +astonishing +astonishingly +astonishingness +astonishment +astony +astoop +astor +astound +astoundable +astounding +astoundingly +astoundment +Astrachan +astraddle +Astraea +Astraean +astraean +astraeid +Astraeidae +astraeiform +astragal +astragalar +astragalectomy +astragali +astragalocalcaneal +astragalocentral +astragalomancy +astragalonavicular +astragaloscaphoid +astragalotibial +Astragalus +astragalus +astrain +astrakanite +astrakhan +astral +astrally +astrand +Astrantia +astraphobia +astrapophobia +astray +astream +astrer +astrict +astriction +astrictive +astrictively +astrictiveness +Astrid +astride +astrier +astriferous +astrild +astringe +astringency +astringent +astringently +astringer +astroalchemist +astroblast +Astrocaryum +astrochemist +astrochemistry +astrochronological +astrocyte +astrocytoma +astrocytomata +astrodiagnosis +astrodome +astrofel +astrogeny +astroglia +astrognosy +astrogonic +astrogony +astrograph +astrographic +astrography +astroid +astroite +astrolabe +astrolabical +astrolater +astrolatry +astrolithology +astrologaster +astrologer +astrologian +astrologic +astrological +astrologically +astrologistic +astrologize +astrologous +astrology +astromancer +astromancy +astromantic +astrometeorological +astrometeorologist +astrometeorology +astrometer +astrometrical +astrometry +astronaut +astronautics +astronomer +astronomic +astronomical +astronomically +astronomics +astronomize +astronomy +Astropecten +Astropectinidae +astrophil +astrophobia +astrophotographic +astrophotography +astrophotometer +astrophotometrical +astrophotometry +astrophyllite +astrophysical +astrophysicist +astrophysics +Astrophyton +astroscope +Astroscopus +astroscopy +astrospectral +astrospectroscopic +astrosphere +astrotheology +astrut +astucious +astuciously +astucity +Astur +Asturian +astute +astutely +astuteness +astylar +Astylospongia +Astylosternus +asudden +asunder +Asuri +aswail +aswarm +asway +asweat +aswell +aswim +aswing +aswirl +aswoon +aswooned +asyla +asyllabia +asyllabic +asyllabical +asylum +asymbiotic +asymbolia +asymbolic +asymbolical +asymmetric +asymmetrical +asymmetrically +Asymmetron +asymmetry +asymptomatic +asymptote +asymptotic +asymptotical +asymptotically +asynapsis +asynaptic +asynartete +asynartetic +asynchronism +asynchronous +asyndesis +asyndetic +asyndetically +asyndeton +asynergia +asynergy +asyngamic +asyngamy +asyntactic +asyntrophy +asystole +asystolic +asystolism +asyzygetic +at +Ata +atabal +atabeg +atabek +Atabrine +Atacaman +Atacamenan +Atacamenian +Atacameno +atacamite +atactic +atactiform +Ataentsic +atafter +Ataigal +Ataiyal +Atalan +ataman +atamasco +Atamosco +atangle +atap +ataraxia +ataraxy +atatschite +ataunt +atavi +atavic +atavism +atavist +atavistic +atavistically +atavus +ataxaphasia +ataxia +ataxiagram +ataxiagraph +ataxiameter +ataxiaphasia +ataxic +ataxinomic +ataxite +ataxonomic +ataxophemia +ataxy +atazir +atbash +atchison +ate +Ateba +atebrin +atechnic +atechnical +atechny +ateeter +atef +atelectasis +atelectatic +ateleological +Ateles +atelestite +atelets +atelier +ateliosis +Atellan +atelo +atelocardia +atelocephalous +ateloglossia +atelognathia +atelomitic +atelomyelia +atelopodia +ateloprosopia +atelorachidia +atelostomia +atemporal +Aten +Atenism +Atenist +Aterian +ates +Atestine +ateuchi +ateuchus +Atfalati +Athabasca +Athabascan +athalamous +athalline +Athamantid +athanasia +Athanasian +Athanasianism +Athanasianist +athanasy +athanor +Athapascan +athar +Atharvan +Athecae +Athecata +athecate +atheism +atheist +atheistic +atheistical +atheistically +atheisticalness +atheize +atheizer +athelia +atheling +athematic +Athena +Athenaea +athenaeum +athenee +Athenian +Athenianly +athenor +Athens +atheological +atheologically +atheology +atheous +Athericera +athericeran +athericerous +atherine +Atherinidae +Atheriogaea +Atheriogaean +Atheris +athermancy +athermanous +athermic +athermous +atheroma +atheromasia +atheromata +atheromatosis +atheromatous +atherosclerosis +Atherosperma +Atherurus +athetesis +athetize +athetoid +athetosic +athetosis +athing +athirst +athlete +athletehood +athletic +athletical +athletically +athleticism +athletics +athletism +athletocracy +athlothete +athlothetes +athodyd +athort +athrepsia +athreptic +athrill +athrive +athrob +athrocyte +athrocytosis +athrogenic +athrong +athrough +athwart +athwarthawse +athwartship +athwartships +athwartwise +athymia +athymic +athymy +athyreosis +athyria +athyrid +Athyridae +Athyris +Athyrium +athyroid +athyroidism +athyrosis +Ati +Atik +Atikokania +atilt +atimon +atinga +atingle +atinkle +atip +atis +Atka +Atlanta +atlantad +atlantal +Atlantean +atlantes +Atlantic +atlantic +Atlantica +Atlantid +Atlantides +atlantite +atlantoaxial +atlantodidymus +atlantomastoid +atlantoodontoid +Atlantosaurus +Atlas +atlas +Atlaslike +atlatl +atle +atlee +atloaxoid +atloid +atloidean +atloidoaxoid +atma +atman +atmiatrics +atmiatry +atmid +atmidalbumin +atmidometer +atmidometry +atmo +atmocausis +atmocautery +atmoclastic +atmogenic +atmograph +atmologic +atmological +atmologist +atmology +atmolysis +atmolyzation +atmolyze +atmolyzer +atmometer +atmometric +atmometry +atmos +atmosphere +atmosphereful +atmosphereless +atmospheric +atmospherical +atmospherically +atmospherics +atmospherology +atmostea +atmosteal +atmosteon +Atnah +atocha +atocia +atokal +atoke +atokous +atoll +atom +atomatic +atomechanics +atomerg +atomic +atomical +atomically +atomician +atomicism +atomicity +atomics +atomiferous +atomism +atomist +atomistic +atomistical +atomistically +atomistics +atomity +atomization +atomize +atomizer +atomology +atomy +atonable +atonal +atonalism +atonalistic +atonality +atonally +atone +atonement +atoneness +atoner +atonia +atonic +atonicity +atoningly +atony +atop +Atophan +atophan +atopic +atopite +atopy +Atorai +Atossa +atour +atoxic +Atoxyl +atoxyl +atrabilarian +atrabilarious +atrabiliar +atrabiliarious +atrabiliary +atrabilious +atrabiliousness +atracheate +Atractaspis +Atragene +atragene +atrail +atrament +atramental +atramentary +atramentous +atraumatic +Atrebates +Atremata +atrematous +atremble +atrepsy +atreptic +atresia +atresic +atresy +atretic +atria +atrial +atrichia +atrichosis +atrichous +atrickle +Atridean +atrienses +atriensis +atriocoelomic +atrioporal +atriopore +atrioventricular +atrip +Atriplex +atrium +atrocha +atrochal +atrochous +atrocious +atrociously +atrociousness +atrocity +atrolactic +Atropa +atropaceous +atropal +atropamine +atrophia +atrophiated +atrophic +atrophied +atrophoderma +atrophy +atropia +atropic +Atropidae +atropine +atropinism +atropinization +atropinize +atropism +atropous +atrorubent +atrosanguineous +atroscine +atrous +atry +Atrypa +Atta +atta +Attacapan +attacco +attach +attachable +attachableness +attache +attached +attachedly +attacher +attacheship +attachment +attack +attackable +attacker +attacolite +Attacus +attacus +attagen +attaghan +attain +attainability +attainable +attainableness +attainder +attainer +attainment +attaint +attaintment +attainture +Attalea +attaleh +Attalid +attar +attargul +attask +attemper +attemperament +attemperance +attemperate +attemperately +attemperation +attemperator +attempt +attemptability +attemptable +attempter +attemptless +attend +attendance +attendancy +attendant +attendantly +attender +attendingly +attendment +attendress +attensity +attent +attention +attentional +attentive +attentively +attentiveness +attently +attenuable +attenuant +attenuate +attenuation +attenuative +attenuator +atter +attercop +attercrop +atterminal +attermine +atterminement +attern +attery +attest +attestable +attestant +attestation +attestative +attestator +attester +attestive +Attic +attic +Attical +Atticism +atticism +Atticist +Atticize +atticize +atticomastoid +attid +Attidae +attinge +attingence +attingency +attingent +attire +attired +attirement +attirer +attitude +attitudinal +attitudinarian +attitudinarianism +attitudinize +attitudinizer +Attiwendaronk +attorn +attorney +attorneydom +attorneyism +attorneyship +attornment +attract +attractability +attractable +attractableness +attractant +attracter +attractile +attractingly +attraction +attractionally +attractive +attractively +attractiveness +attractivity +attractor +attrahent +attrap +attributable +attributal +attribute +attributer +attribution +attributive +attributively +attributiveness +attrist +attrite +attrited +attriteness +attrition +attritive +attritus +attune +attunely +attunement +Atuami +atule +atumble +atune +atwain +atweel +atween +atwin +atwirl +atwist +atwitch +atwitter +atwixt +atwo +atypic +atypical +atypically +atypy +auantic +aube +aubepine +Aubrey +Aubrietia +aubrietia +aubrite +auburn +aubusson +Auca +auca +Aucan +Aucaner +Aucanian +Auchenia +auchenia +auchenium +auchlet +auction +auctionary +auctioneer +auctorial +Aucuba +aucuba +aucupate +audacious +audaciously +audaciousness +audacity +Audaean +Audian +Audibertia +audibility +audible +audibleness +audibly +audience +audiencier +audient +audile +audio +audiogenic +audiogram +audiologist +audiology +audiometer +audiometric +audiometry +Audion +audion +audiophile +audiphone +audit +audition +auditive +auditor +auditoria +auditorial +auditorially +auditorily +auditorium +auditorship +auditory +auditress +auditual +audivise +audiviser +audivision +Audrey +Audubonistic +Aueto +auganite +auge +Augean +augelite +augen +augend +auger +augerer +augh +aught +aughtlins +augite +augitic +augitite +augitophyre +augment +augmentable +augmentation +augmentationer +augmentative +augmentatively +augmented +augmentedly +augmenter +augmentive +augur +augural +augurate +augurial +augurous +augurship +augury +August +august +Augusta +augustal +Augustan +Augusti +Augustin +Augustinian +Augustinianism +Augustinism +augustly +augustness +Augustus +auh +auhuhu +Auk +auk +auklet +aula +aulacocarpous +Aulacodus +Aulacomniaceae +Aulacomnium +aulae +aularian +auld +auldfarrantlike +auletai +aulete +auletes +auletic +auletrides +auletris +aulic +aulicism +auloi +aulophyte +aulos +Aulostoma +Aulostomatidae +Aulostomi +aulostomid +Aulostomidae +Aulostomus +aulu +aum +aumaga +aumail +aumbry +aumery +aumil +aumildar +aumous +aumrie +auncel +aune +Aunjetitz +aunt +aunthood +auntie +auntish +auntlike +auntly +auntsary +auntship +aupaka +aura +aurae +aural +aurally +auramine +Aurantiaceae +aurantiaceous +Aurantium +aurantium +aurar +aurate +aurated +aureate +aureately +aureateness +aureation +aureity +Aurelia +aurelia +aurelian +Aurelius +Aureocasidium +aureola +aureole +aureolin +aureoline +aureomycin +aureous +aureously +auresca +aureus +auribromide +auric +aurichalcite +aurichalcum +aurichloride +aurichlorohydric +auricle +auricled +auricomous +Auricula +auricula +auriculae +auricular +auriculare +auriculares +Auricularia +auricularia +Auriculariaceae +auriculariae +Auriculariales +auricularian +auricularis +auricularly +auriculate +auriculated +auriculately +Auriculidae +auriculocranial +auriculoparietal +auriculotemporal +auriculoventricular +auriculovertical +auricyanhydric +auricyanic +auricyanide +auride +auriferous +aurific +aurification +auriform +aurify +Auriga +aurigal +aurigation +aurigerous +Aurigid +Aurignacian +aurilave +aurin +aurinasal +auriphone +auriphrygia +auriphrygiate +auripuncture +aurir +auriscalp +auriscalpia +auriscalpium +auriscope +auriscopy +aurist +aurite +aurivorous +auroauric +aurobromide +aurochloride +aurochs +aurocyanide +aurodiamine +auronal +aurophobia +aurophore +aurora +aurorae +auroral +aurorally +aurore +aurorean +Aurorian +aurorium +aurotellurite +aurothiosulphate +aurothiosulphuric +aurous +aurrescu +aurulent +aurum +aurure +auryl +Aus +auscult +auscultascope +auscultate +auscultation +auscultative +auscultator +auscultatory +Auscultoscope +auscultoscope +Aushar +auslaut +auslaute +Ausones +Ausonian +auspex +auspicate +auspice +auspices +auspicial +auspicious +auspiciously +auspiciousness +auspicy +Aussie +Austafrican +austenite +austenitic +Auster +austere +austerely +austereness +austerity +Austerlitz +Austin +Austral +austral +Australasian +australene +Australia +Australian +Australianism +Australianize +Australic +Australioid +australite +Australoid +Australopithecinae +australopithecine +Australopithecus +Australorp +Austrasian +Austrian +Austrianize +Austric +austrium +Austroasiatic +Austrogaea +Austrogaean +austromancy +Austronesian +Austrophil +Austrophile +Austrophilism +Austroriparian +ausu +ausubo +autacoid +autacoidal +autallotriomorphic +autantitypy +autarch +autarchic +autarchical +Autarchoglossa +autarchy +autarkic +autarkical +autarkist +autarky +aute +autechoscope +autecious +auteciously +auteciousness +autecism +autecologic +autecological +autecologically +autecologist +autecology +autecy +autem +authentic +authentical +authentically +authenticalness +authenticate +authentication +authenticator +authenticity +authenticly +authenticness +authigene +authigenetic +authigenic +authigenous +author +authorcraft +authoress +authorhood +authorial +authorially +authorish +authorism +authoritarian +authoritarianism +authoritative +authoritatively +authoritativeness +authority +authorizable +authorization +authorize +authorized +authorizer +authorless +authorling +authorly +authorship +authotype +autism +autist +autistic +auto +autoabstract +autoactivation +autoactive +autoaddress +autoagglutinating +autoagglutination +autoagglutinin +autoalarm +autoalkylation +autoallogamous +autoallogamy +autoanalysis +autoanalytic +autoantibody +autoanticomplement +autoantitoxin +autoasphyxiation +autoaspiration +autoassimilation +autobahn +autobasidia +Autobasidiomycetes +autobasidiomycetous +autobasidium +Autobasisii +autobiographal +autobiographer +autobiographic +autobiographical +autobiographically +autobiographist +autobiography +autobiology +autoblast +autoboat +autoboating +autobolide +autobus +autocab +autocade +autocall +autocamp +autocamper +autocamping +autocar +autocarist +autocarpian +autocarpic +autocarpous +autocatalepsy +autocatalysis +autocatalytic +autocatalytically +autocatalyze +autocatheterism +autocephalia +autocephality +autocephalous +autocephaly +autoceptive +autochemical +autocholecystectomy +autochrome +autochromy +autochronograph +autochthon +autochthonal +autochthonic +autochthonism +autochthonous +autochthonously +autochthonousness +autochthony +autocide +autocinesis +autoclasis +autoclastic +autoclave +autocoenobium +autocoherer +autocoid +autocollimation +autocollimator +autocolony +autocombustible +autocombustion +autocomplexes +autocondensation +autoconduction +autoconvection +autoconverter +autocopist +autocoprophagous +autocorrosion +autocracy +autocrat +autocratic +autocratical +autocratically +autocrator +autocratoric +autocratorical +autocratrix +autocratship +autocremation +autocriticism +autocystoplasty +autocytolysis +autocytolytic +autodecomposition +autodepolymerization +autodermic +autodestruction +autodetector +autodiagnosis +autodiagnostic +autodiagrammatic +autodidact +autodidactic +autodifferentiation +autodiffusion +autodigestion +autodigestive +autodrainage +autodrome +autodynamic +autodyne +autoecholalia +autoecic +autoecious +autoeciously +autoeciousness +autoecism +autoecous +autoecy +autoeducation +autoeducative +autoelectrolysis +autoelectrolytic +autoelectronic +autoelevation +autoepigraph +autoepilation +autoerotic +autoerotically +autoeroticism +autoerotism +autoexcitation +autofecundation +autofermentation +autoformation +autofrettage +autogamic +autogamous +autogamy +autogauge +autogeneal +autogenesis +autogenetic +autogenetically +autogenic +autogenous +autogenously +autogeny +Autogiro +autogiro +autognosis +autognostic +autograft +autografting +autogram +autograph +autographal +autographer +autographic +autographical +autographically +autographism +autographist +autographometer +autography +autogravure +Autoharp +autoharp +autoheader +autohemic +autohemolysin +autohemolysis +autohemolytic +autohemorrhage +autohemotherapy +autoheterodyne +autoheterosis +autohexaploid +autohybridization +autohypnosis +autohypnotic +autohypnotism +autohypnotization +autoicous +autoignition +autoimmunity +autoimmunization +autoinduction +autoinductive +autoinfection +autoinfusion +autoinhibited +autoinoculable +autoinoculation +autointellectual +autointoxicant +autointoxication +autoirrigation +autoist +autojigger +autojuggernaut +autokinesis +autokinetic +autokrator +autolaryngoscope +autolaryngoscopic +autolaryngoscopy +autolater +autolatry +autolavage +autolesion +autolimnetic +autolith +autoloading +autological +autologist +autologous +autology +autoluminescence +autoluminescent +autolysate +autolysin +autolysis +autolytic +Autolytus +autolyzate +autolyze +automa +automacy +automanual +automat +automata +automatic +automatical +automatically +automaticity +automatin +automatism +automatist +automatization +automatize +automatograph +automaton +automatonlike +automatous +automechanical +automelon +autometamorphosis +autometric +autometry +automobile +automobilism +automobilist +automobilistic +automobility +automolite +automonstration +automorph +automorphic +automorphically +automorphism +automotive +automotor +automower +automysophobia +autonegation +autonephrectomy +autonephrotoxin +autoneurotoxin +autonitridation +autonoetic +autonomasy +autonomic +autonomical +autonomically +autonomist +autonomize +autonomous +autonomously +autonomy +autonym +autoparasitism +autopathic +autopathography +autopathy +autopelagic +autopepsia +autophagi +autophagia +autophagous +autophagy +autophobia +autophoby +autophon +autophone +autophonoscope +autophonous +autophony +autophotoelectric +autophotograph +autophotometry +autophthalmoscope +autophyllogeny +autophyte +autophytic +autophytically +autophytograph +autophytography +autopilot +autoplagiarism +autoplasmotherapy +autoplast +autoplastic +autoplasty +autopneumatic +autopoint +autopoisonous +autopolar +autopolo +autopoloist +autopolyploid +autopore +autoportrait +autoportraiture +autopositive +autopotent +autoprogressive +autoproteolysis +autoprothesis +autopsic +autopsical +autopsy +autopsychic +autopsychoanalysis +autopsychology +autopsychorhythmia +autopsychosis +autoptic +autoptical +autoptically +autopticity +autopyotherapy +autoracemization +autoradiograph +autoradiographic +autoradiography +autoreduction +autoregenerator +autoregulation +autoreinfusion +autoretardation +autorhythmic +autorhythmus +autoriser +autorotation +autorrhaphy +Autosauri +Autosauria +autoschediasm +autoschediastic +autoschediastical +autoschediastically +autoschediaze +autoscience +autoscope +autoscopic +autoscopy +autosender +autosensitization +autosensitized +autosepticemia +autoserotherapy +autoserum +autosexing +autosight +autosign +autosite +autositic +autoskeleton +autosled +autoslip +autosomal +autosomatognosis +autosomatognostic +autosome +autosoteric +autosoterism +autospore +autosporic +autospray +autostability +autostage +autostandardization +autostarter +autostethoscope +autostylic +autostylism +autostyly +autosuggestibility +autosuggestible +autosuggestion +autosuggestionist +autosuggestive +autosuppression +autosymbiontic +autosymbolic +autosymbolical +autosymbolically +autosymnoia +Autosyn +autosyndesis +autotelegraph +autotelic +autotetraploid +autotetraploidy +autothaumaturgist +autotheater +autotheism +autotheist +autotherapeutic +autotherapy +autothermy +autotomic +autotomize +autotomous +autotomy +autotoxaemia +autotoxic +autotoxication +autotoxicity +autotoxicosis +autotoxin +autotoxis +autotractor +autotransformer +autotransfusion +autotransplant +autotransplantation +autotrepanation +autotriploid +autotriploidy +autotroph +autotrophic +autotrophy +autotropic +autotropically +autotropism +autotruck +autotuberculin +autoturning +autotype +autotyphization +autotypic +autotypography +autotypy +autourine +autovaccination +autovaccine +autovalet +autovalve +autovivisection +autoxeny +autoxidation +autoxidator +autoxidizability +autoxidizable +autoxidize +autoxidizer +autozooid +autrefois +autumn +autumnal +autumnally +autumnian +autumnity +Autunian +autunite +auxamylase +auxanogram +auxanology +auxanometer +auxesis +auxetic +auxetical +auxetically +auxiliar +auxiliarly +auxiliary +auxiliate +auxiliation +auxiliator +auxiliatory +auxilium +auximone +auxin +auxinic +auxinically +auxoaction +auxoamylase +auxoblast +auxobody +auxocardia +auxochrome +auxochromic +auxochromism +auxochromous +auxocyte +auxoflore +auxofluor +auxograph +auxographic +auxohormone +auxology +auxometer +auxospore +auxosubstance +auxotonic +auxotox +ava +avadana +avadavat +avadhuta +avahi +avail +availability +available +availableness +availably +availingly +availment +aval +avalanche +avalent +avalvular +Avanguardisti +avania +avanious +Avanti +avanturine +Avar +Avaradrano +avaremotemo +Avarian +avarice +avaricious +avariciously +avariciousness +Avarish +Avars +avascular +avast +avaunt +Ave +ave +avellan +avellane +avellaneous +avellano +avelonge +aveloz +Avena +avenaceous +avenage +avenalin +avener +avenge +avengeful +avengement +avenger +avengeress +avenging +avengingly +avenin +avenolith +avenous +avens +aventail +Aventine +aventurine +avenue +aver +avera +average +averagely +averager +averah +averil +averin +averment +Avernal +Avernus +averrable +averral +Averrhoa +Averroism +Averroist +Averroistic +averruncate +averruncation +averruncator +aversant +aversation +averse +aversely +averseness +aversion +aversive +avert +avertable +averted +avertedly +averter +avertible +Avertin +Avery +Aves +Avesta +Avestan +avian +avianization +avianize +aviarist +aviary +aviate +aviatic +aviation +aviator +aviatorial +aviatoriality +aviatory +aviatress +aviatrices +aviatrix +Avicennia +Avicenniaceae +Avicennism +avichi +avicide +avick +avicolous +Avicula +avicular +Avicularia +avicularia +avicularian +Aviculariidae +Avicularimorphae +avicularium +Aviculidae +aviculture +aviculturist +avid +avidious +avidiously +avidity +avidly +avidous +avidya +avifauna +avifaunal +avigate +avigation +avigator +Avignonese +avijja +Avikom +avine +aviolite +avirulence +avirulent +Avis +aviso +avital +avitaminosis +avitaminotic +avitic +avives +avizandum +avo +avocado +avocate +avocation +avocative +avocatory +avocet +avodire +avogadrite +avoid +avoidable +avoidably +avoidance +avoider +avoidless +avoidment +avoirdupois +avolate +avolation +avolitional +avondbloem +avouch +avouchable +avoucher +avouchment +avourneen +avow +avowable +avowableness +avowably +avowal +avowance +avowant +avowed +avowedly +avowedness +avower +avowry +avoyer +avoyership +Avshar +avulse +avulsion +avuncular +avunculate +aw +awa +Awabakal +awabi +Awadhi +awaft +awag +await +awaiter +Awaitlala +awakable +awake +awaken +awakenable +awakener +awakening +awakeningly +awakenment +awald +awalim +awalt +Awan +awane +awanting +awapuhi +award +awardable +awarder +awardment +aware +awaredom +awareness +awaruite +awash +awaste +awat +awatch +awater +awave +away +awayness +awber +awd +awe +awearied +aweary +aweather +aweband +awedness +awee +aweek +aweel +aweigh +Awellimiden +awesome +awesomely +awesomeness +awest +aweto +awfu +awful +awfully +awfulness +awheel +awheft +awhet +awhile +awhir +awhirl +awide +awiggle +awikiwiki +awin +awing +awink +awiwi +awkward +awkwardish +awkwardly +awkwardness +awl +awless +awlessness +awlwort +awmous +awn +awned +awner +awning +awninged +awnless +awnlike +awny +awoke +Awol +awork +awreck +awrist +awrong +awry +Awshar +ax +axal +axbreaker +axe +axed +Axel +axenic +axes +axfetch +axhammer +axhammered +axhead +axial +axiality +axially +axiate +axiation +Axifera +axiform +axifugal +axil +axile +axilemma +axilemmata +axilla +axillae +axillant +axillar +axillary +axine +axinite +axinomancy +axiolite +axiolitic +axiological +axiologically +axiologist +axiology +axiom +axiomatic +axiomatical +axiomatically +axiomatization +axiomatize +axion +axiopisty +Axis +axis +axised +axisymmetric +axisymmetrical +axite +axle +axled +axlesmith +axletree +axmaker +axmaking +axman +axmanship +axmaster +Axminster +axodendrite +axofugal +axogamy +axoid +axoidean +axolemma +axolotl +axolysis +axometer +axometric +axometry +axon +axonal +axoneure +axoneuron +Axonia +Axonolipa +axonolipous +axonometric +axonometry +Axonophora +axonophorous +Axonopus +axonost +axopetal +axophyte +axoplasm +axopodia +axopodium +axospermous +axostyle +axseed +axstone +axtree +Axumite +axunge +axweed +axwise +axwort +Ay +ay +ayacahuite +ayah +Ayahuca +Aydendron +aye +ayegreen +ayelp +ayenbite +ayin +Aylesbury +ayless +aylet +ayllu +Aymara +Aymaran +Aymoro +ayond +ayont +ayous +Ayrshire +Aythya +ayu +Ayubite +Ayyubid +azadrachta +azafrin +Azalea +azalea +Azande +azarole +azedarach +azelaic +azelate +Azelfafage +azeotrope +azeotropic +azeotropism +azeotropy +Azerbaijanese +Azerbaijani +Azerbaijanian +Azha +azide +aziethane +Azilian +azilut +Azimech +azimene +azimethylene +azimide +azimine +azimino +aziminobenzene +azimuth +azimuthal +azimuthally +azine +aziola +azlactone +azo +azobacter +azobenzene +azobenzil +azobenzoic +azobenzol +azoblack +azoch +azocochineal +azocoralline +azocorinth +azocyanide +azocyclic +azodicarboxylic +azodiphenyl +azodisulphonic +azoeosin +azoerythrin +azofication +azofier +azoflavine +azoformamide +azoformic +azofy +azogallein +azogreen +azogrenadine +azohumic +azoic +azoimide +azoisobutyronitrile +azole +azolitmin +Azolla +azomethine +azon +azonal +azonaphthalene +azonic +azonium +azoospermia +azoparaffin +azophen +azophenetole +azophenine +azophenol +azophenyl +azophenylene +azophosphin +azophosphore +azoprotein +Azorian +azorite +azorubine +azosulphine +azosulphonic +azotate +azote +azoted +azotemia +azotenesis +azotetrazole +azoth +azothionium +azotic +azotine +azotite +azotize +Azotobacter +Azotobacterieae +azotoluene +azotometer +azotorrhoea +azotous +azoturia +azovernine +azox +azoxazole +azoxime +azoxine +azoxonium +azoxy +azoxyanisole +azoxybenzene +azoxybenzoic +azoxynaphthalene +azoxyphenetole +azoxytoluidine +Aztec +Azteca +azteca +Aztecan +azthionium +azulene +azulite +azulmic +azumbre +azure +azurean +azured +azureous +azurine +azurite +azurmalachite +azurous +azury +Azygobranchia +Azygobranchiata +azygobranchiate +azygomatous +azygos +azygosperm +azygospore +azygous +azyme +azymite +azymous +B +b +ba +baa +baahling +Baal +baal +Baalath +Baalish +Baalism +Baalist +Baalite +Baalitical +Baalize +Baalshem +baar +Bab +baba +babacoote +babai +babasco +babassu +babaylan +Babbie +Babbitt +babbitt +babbitter +Babbittess +Babbittian +Babbittism +Babbittry +babblative +babble +babblement +babbler +babblesome +babbling +babblingly +babblish +babblishly +babbly +babby +Babcock +babe +babehood +Babel +Babeldom +babelet +Babelic +babelike +Babelish +Babelism +Babelize +babery +babeship +Babesia +babesiasis +Babhan +Babi +Babiana +babiche +babied +Babiism +babillard +Babine +babingtonite +babirusa +babish +babished +babishly +babishness +Babism +Babist +Babite +bablah +babloh +baboen +Babongo +baboo +baboodom +babooism +baboon +baboonery +baboonish +baboonroot +baboot +babouche +Babouvism +Babouvist +babroot +Babs +babu +Babua +babudom +babuina +babuism +babul +Babuma +Babungera +babushka +baby +babydom +babyfied +babyhood +babyhouse +babyish +babyishly +babyishness +babyism +babylike +Babylon +Babylonian +Babylonic +Babylonish +Babylonism +Babylonite +Babylonize +babyolatry +babyship +bac +bacaba +bacach +bacalao +bacao +bacbakiri +bacca +baccaceous +baccae +baccalaurean +baccalaureate +baccara +baccarat +baccate +baccated +Bacchae +bacchanal +Bacchanalia +bacchanalian +bacchanalianism +bacchanalianly +bacchanalism +bacchanalization +bacchanalize +bacchant +bacchante +bacchantes +bacchantic +bacchar +baccharis +baccharoid +baccheion +bacchiac +bacchian +Bacchic +bacchic +Bacchical +Bacchides +bacchii +bacchius +Bacchus +Bacchuslike +bacciferous +bacciform +baccivorous +bach +Bacharach +bache +bachel +bachelor +bachelordom +bachelorhood +bachelorism +bachelorize +bachelorlike +bachelorly +bachelorship +bachelorwise +bachelry +Bachichi +Bacillaceae +bacillar +Bacillariaceae +bacillariaceous +Bacillariales +Bacillarieae +Bacillariophyta +bacillary +bacillemia +bacilli +bacillian +bacillicidal +bacillicide +bacillicidic +bacilliculture +bacilliform +bacilligenic +bacilliparous +bacillite +bacillogenic +bacillogenous +bacillophobia +bacillosis +bacilluria +bacillus +Bacis +bacitracin +back +backache +backaching +backachy +backage +backband +backbearing +backbencher +backbite +backbiter +backbitingly +backblow +backboard +backbone +backboned +backboneless +backbonelessness +backbrand +backbreaker +backbreaking +backcap +backcast +backchain +backchat +backcourt +backcross +backdoor +backdown +backdrop +backed +backen +backer +backet +backfall +backfatter +backfield +backfill +backfiller +backfilling +backfire +backfiring +backflap +backflash +backflow +backfold +backframe +backfriend +backfurrow +backgame +backgammon +background +backhand +backhanded +backhandedly +backhandedness +backhander +backhatch +backheel +backhooker +backhouse +backie +backiebird +backing +backjaw +backjoint +backlands +backlash +backlashing +backless +backlet +backlings +backlog +backlotter +backmost +backpedal +backpiece +backplate +backrope +backrun +backsaw +backscraper +backset +backsetting +backsettler +backshift +backside +backsight +backslap +backslapper +backslapping +backslide +backslider +backslidingness +backspace +backspacer +backspang +backspier +backspierer +backspin +backspread +backspringing +backstaff +backstage +backstamp +backstay +backster +backstick +backstitch +backstone +backstop +backstrap +backstretch +backstring +backstrip +backstroke +backstromite +backswept +backswing +backsword +backswording +backswordman +backswordsman +backtack +backtender +backtenter +backtrack +backtracker +backtrick +backup +backveld +backvelder +backwall +backward +backwardation +backwardly +backwardness +backwards +backwash +backwasher +backwashing +backwater +backwatered +backway +backwood +backwoods +backwoodsiness +backwoodsman +backwoodsy +backword +backworm +backwort +backyarder +baclin +bacon +baconer +Baconian +Baconianism +Baconic +Baconism +Baconist +baconize +baconweed +bacony +Bacopa +bacteremia +bacteria +Bacteriaceae +bacteriaceous +bacterial +bacterially +bacterian +bacteric +bactericholia +bactericidal +bactericide +bactericidin +bacterid +bacteriemia +bacteriform +bacterin +bacterioagglutinin +bacterioblast +bacteriocyte +bacteriodiagnosis +bacteriofluorescin +bacteriogenic +bacteriogenous +bacteriohemolysin +bacterioid +bacterioidal +bacteriologic +bacteriological +bacteriologically +bacteriologist +bacteriology +bacteriolysin +bacteriolysis +bacteriolytic +bacteriolyze +bacteriopathology +bacteriophage +bacteriophagia +bacteriophagic +bacteriophagous +bacteriophagy +bacteriophobia +bacterioprecipitin +bacterioprotein +bacteriopsonic +bacteriopsonin +bacteriopurpurin +bacterioscopic +bacterioscopical +bacterioscopically +bacterioscopist +bacterioscopy +bacteriosis +bacteriosolvent +bacteriostasis +bacteriostat +bacteriostatic +bacteriotherapeutic +bacteriotherapy +bacteriotoxic +bacteriotoxin +bacteriotropic +bacteriotropin +bacteriotrypsin +bacterious +bacteritic +bacterium +bacteriuria +bacterization +bacterize +bacteroid +bacteroidal +Bacteroideae +Bacteroides +Bactrian +Bactris +Bactrites +bactriticone +bactritoid +bacula +bacule +baculi +baculiferous +baculiform +baculine +baculite +Baculites +baculitic +baculiticone +baculoid +baculum +baculus +bacury +bad +Badaga +badan +Badarian +badarrah +Badawi +baddeleyite +badderlocks +baddish +baddishly +baddishness +baddock +bade +badenite +badge +badgeless +badgeman +badger +badgerbrush +badgerer +badgeringly +badgerlike +badgerly +badgerweed +badiaga +badian +badigeon +badinage +badious +badland +badlands +badly +badminton +badness +Badon +Baduhenna +bae +Baedeker +Baedekerian +Baeria +baetuli +baetulus +baetyl +baetylic +baetylus +baetzner +bafaro +baff +baffeta +baffle +bafflement +baffler +baffling +bafflingly +bafflingness +baffy +baft +bafta +Bafyot +bag +baga +Baganda +bagani +bagasse +bagataway +bagatelle +bagatine +bagattini +bagattino +Bagaudae +Bagdad +Bagdi +bagel +bagful +baggage +baggageman +baggagemaster +baggager +baggala +bagganet +Baggara +bagged +bagger +baggie +baggily +bagginess +bagging +baggit +baggy +Bagheli +baghouse +Baginda +Bagirmi +bagleaves +baglike +bagmaker +bagmaking +bagman +bagnio +bagnut +bago +Bagobo +bagonet +bagpipe +bagpiper +bagpipes +bagplant +bagrationite +bagre +bagreef +bagroom +baguette +bagwig +bagwigged +bagworm +bagwyn +bah +Bahai +Bahaism +Bahaist +Baham +Bahama +Bahamian +bahan +bahar +Bahaullah +bahawder +bahay +bahera +bahiaite +Bahima +bahisti +Bahmani +Bahmanid +bahnung +baho +bahoe +bahoo +baht +Bahuma +bahur +bahut +Bahutu +bahuvrihi +Baianism +baidarka +Baidya +Baiera +baiginet +baignet +baikalite +baikerinite +baikerite +baikie +bail +bailable +bailage +bailee +bailer +bailey +bailie +bailiery +bailieship +bailiff +bailiffry +bailiffship +bailiwick +bailliage +baillone +Baillonella +bailment +bailor +bailpiece +bailsman +bailwood +bain +bainie +Baining +baioc +baiocchi +baiocco +bairagi +Bairam +bairn +bairnie +bairnish +bairnishness +bairnliness +bairnly +bairnteam +bairntime +bairnwort +Bais +Baisakh +baister +bait +baiter +baith +baittle +baitylos +baize +bajada +bajan +Bajardo +bajarigar +Bajau +Bajocian +bajra +bajree +bajri +bajury +baka +Bakairi +bakal +Bakalai +Bakalei +Bakatan +bake +bakeboard +baked +bakehouse +Bakelite +bakelite +bakelize +baken +bakeoven +bakepan +baker +bakerdom +bakeress +bakerite +bakerless +bakerly +bakership +bakery +bakeshop +bakestone +Bakhtiari +bakie +baking +bakingly +bakli +Bakongo +Bakshaish +baksheesh +baktun +Baku +baku +Bakuba +bakula +Bakunda +Bakuninism +Bakuninist +bakupari +Bakutu +Bakwiri +Bal +bal +Bala +Balaam +Balaamite +Balaamitical +balachong +balaclava +baladine +Balaena +Balaenicipites +balaenid +Balaenidae +balaenoid +Balaenoidea +balaenoidean +Balaenoptera +Balaenopteridae +balafo +balagan +balaghat +balai +Balaic +Balak +Balaklava +balalaika +Balan +balance +balanceable +balanced +balancedness +balancelle +balanceman +balancement +balancer +balancewise +balancing +balander +balandra +balandrana +balaneutics +balangay +balanic +balanid +Balanidae +balaniferous +balanism +balanite +Balanites +balanitis +balanoblennorrhea +balanocele +Balanoglossida +Balanoglossus +balanoid +Balanophora +Balanophoraceae +balanophoraceous +balanophore +balanophorin +balanoplasty +balanoposthitis +balanopreputial +Balanops +Balanopsidaceae +Balanopsidales +balanorrhagia +Balanta +Balante +balantidial +balantidiasis +balantidic +balantidiosis +Balantidium +Balanus +Balao +balao +Balarama +balas +balata +balatong +balatron +balatronic +balausta +balaustine +balaustre +Balawa +Balawu +balboa +balbriggan +balbutiate +balbutient +balbuties +balconet +balconied +balcony +bald +baldachin +baldachined +baldachini +baldachino +baldberry +baldcrown +balden +balder +balderdash +baldhead +baldicoot +Baldie +baldish +baldling +baldly +baldmoney +baldness +baldpate +baldrib +baldric +baldricked +baldricwise +balductum +Baldwin +baldy +bale +Balearian +Balearic +Balearica +baleen +balefire +baleful +balefully +balefulness +balei +baleise +baleless +baler +balete +Bali +bali +balibago +Balija +Balilla +baline +Balinese +balinger +balinghasay +balisaur +balistarius +Balistes +balistid +Balistidae +balistraria +balita +balk +Balkan +Balkanic +Balkanization +Balkanize +Balkar +balker +balkingly +Balkis +balky +ball +ballad +ballade +balladeer +ballader +balladeroyal +balladic +balladical +balladier +balladism +balladist +balladize +balladlike +balladling +balladmonger +balladmongering +balladry +balladwise +ballahoo +ballam +ballan +ballant +ballast +ballastage +ballaster +ballasting +ballata +ballate +ballatoon +balldom +balled +baller +ballerina +ballet +balletic +balletomane +Ballhausplatz +balli +ballist +ballista +ballistae +ballistic +ballistically +ballistician +ballistics +Ballistite +ballistocardiograph +ballium +ballmine +ballogan +ballonet +balloon +balloonation +ballooner +balloonery +balloonet +balloonfish +balloonflower +balloonful +ballooning +balloonish +balloonist +balloonlike +ballot +Ballota +ballotade +ballotage +balloter +balloting +ballotist +ballottement +ballow +Ballplatz +ballplayer +ballproof +ballroom +ballstock +ballup +ballweed +bally +ballyhack +ballyhoo +ballyhooer +ballywack +ballywrack +balm +balmacaan +Balmarcodes +Balmawhapple +balmily +balminess +balmlike +balmony +Balmoral +balmy +balneal +balneary +balneation +balneatory +balneographer +balneography +balneologic +balneological +balneologist +balneology +balneophysiology +balneotechnics +balneotherapeutics +balneotherapia +balneotherapy +Balnibarbi +Baloch +Baloghia +Balolo +balonea +baloney +baloo +Balopticon +Balor +Baloskion +Baloskionaceae +balow +balsa +balsam +balsamation +Balsamea +Balsameaceae +balsameaceous +balsamer +balsamic +balsamical +balsamically +balsamiferous +balsamina +Balsaminaceae +balsaminaceous +balsamine +balsamitic +balsamiticness +balsamize +balsamo +Balsamodendron +Balsamorrhiza +balsamous +balsamroot +balsamum +balsamweed +balsamy +Balt +baltei +balter +balteus +Balthasar +Balti +Baltic +Baltimore +Baltimorean +baltimorite +Baltis +balu +Baluba +Baluch +Baluchi +Baluchistan +baluchithere +baluchitheria +Baluchitherium +baluchitherium +Baluga +Balunda +balushai +baluster +balustered +balustrade +balustraded +balustrading +balut +balwarra +balza +Balzacian +balzarine +bam +Bamalip +Bamangwato +bamban +Bambara +bambini +bambino +bambocciade +bamboo +bamboozle +bamboozlement +bamboozler +Bambos +bamboula +Bambuba +Bambusa +Bambuseae +Bambute +bamoth +Ban +ban +Bana +banaba +banago +banak +banakite +banal +banality +banally +banana +Bananaland +Bananalander +Banande +bananist +bananivorous +banat +Banate +banatite +banausic +Banba +Banbury +banc +banca +bancal +banchi +banco +bancus +band +Banda +banda +bandage +bandager +bandagist +bandaite +bandaka +bandala +bandalore +bandanna +bandannaed +bandar +bandarlog +bandbox +bandboxical +bandboxy +bandcase +bandcutter +bande +bandeau +banded +bandelet +bander +Banderma +banderole +bandersnatch +bandfish +bandhava +bandhook +Bandhor +bandhu +bandi +bandicoot +bandicoy +bandie +bandikai +bandiness +banding +bandit +banditism +banditry +banditti +bandle +bandless +bandlessly +bandlessness +bandlet +bandman +bandmaster +bando +bandog +bandoleer +bandoleered +bandoline +bandonion +Bandor +bandore +bandrol +bandsman +bandstand +bandster +bandstring +Bandusia +Bandusian +bandwork +bandy +bandyball +bandyman +bane +baneberry +baneful +banefully +banefulness +banewort +Banff +bang +banga +Bangala +bangalay +bangalow +Bangash +bangboard +bange +banger +banghy +Bangia +Bangiaceae +bangiaceous +Bangiales +banging +bangkok +bangle +bangled +bangling +bangster +bangtail +Bangwaketsi +bani +banian +banig +banilad +banish +banisher +banishment +banister +Baniva +baniwa +baniya +banjo +banjoist +banjore +banjorine +banjuke +bank +bankable +Bankalachi +bankbook +banked +banker +bankera +bankerdom +bankeress +banket +bankfull +banking +bankman +bankrider +bankrupt +bankruptcy +bankruptism +bankruptlike +bankruptly +bankruptship +bankrupture +bankshall +Banksia +Banksian +bankside +banksman +bankweed +banky +banner +bannered +bannerer +banneret +bannerfish +bannerless +bannerlike +bannerman +bannerol +bannerwise +bannet +banning +bannister +Bannock +bannock +Bannockburn +banns +bannut +banovina +banquet +banqueteer +banqueteering +banqueter +banquette +bansalague +banshee +banstickle +bant +Bantam +bantam +bantamize +bantamweight +bantay +bantayan +banteng +banter +banterer +banteringly +bantery +Bantingism +bantingize +bantling +Bantoid +Bantu +banty +banuyo +banxring +banya +Banyai +banyan +Banyoro +Banyuls +banzai +baobab +bap +Baphia +Baphomet +Baphometic +Baptanodon +Baptisia +baptisin +baptism +baptismal +baptismally +Baptist +baptistery +baptistic +baptizable +baptize +baptizee +baptizement +baptizer +Baptornis +bar +bara +barabara +barabora +Barabra +Baraca +barad +baragnosis +baragouin +baragouinish +Baraithas +barajillo +Baralipton +Baramika +barandos +barangay +barasingha +barathea +barathra +barathrum +barauna +barb +Barbacoa +Barbacoan +barbacou +Barbadian +Barbados +barbal +barbaloin +Barbara +barbaralalia +Barbarea +barbaresque +Barbarian +barbarian +barbarianism +barbarianize +barbaric +barbarical +barbarically +barbarious +barbariousness +barbarism +barbarity +barbarization +barbarize +barbarous +barbarously +barbarousness +Barbary +barbary +barbas +barbasco +barbastel +barbate +barbated +barbatimao +barbe +barbecue +barbed +barbeiro +barbel +barbellate +barbellula +barbellulate +barber +barberess +barberfish +barberish +barberry +barbershop +barbet +barbette +Barbeyaceae +barbican +barbicel +barbigerous +barbion +barbital +barbitalism +barbiton +barbitone +barbitos +barbiturate +barbituric +barbless +barblet +barbone +barbotine +Barbra +barbudo +Barbula +barbulate +barbule +barbulyie +barbwire +Barcan +barcarole +barcella +barcelona +Barcoo +bard +bardane +bardash +bardcraft +bardel +Bardesanism +Bardesanist +Bardesanite +bardess +bardic +bardie +bardiglio +bardily +bardiness +barding +bardish +bardism +bardlet +bardlike +bardling +bardo +Bardolater +Bardolatry +Bardolph +Bardolphian +bardship +Bardulph +bardy +Bare +bare +bareback +barebacked +bareboat +barebone +bareboned +bareca +barefaced +barefacedly +barefacedness +barefit +barefoot +barefooted +barehanded +barehead +bareheaded +bareheadedness +barelegged +barely +barenecked +bareness +barer +baresark +baresma +baretta +barff +barfish +barfly +barful +bargain +bargainee +bargainer +bargainor +bargainwise +bargander +barge +bargeboard +bargee +bargeer +bargeese +bargehouse +bargelike +bargeload +bargeman +bargemaster +barger +bargh +bargham +barghest +bargoose +Bari +bari +baria +baric +barid +barie +barile +barilla +baring +baris +barish +barit +barite +baritone +barium +bark +barkbound +barkcutter +barkeeper +barken +barkentine +barker +barkery +barkevikite +barkevikitic +barkey +barkhan +barking +barkingly +Barkinji +barkle +barkless +barklyite +barkometer +barkpeel +barkpeeler +barkpeeling +barksome +barky +barlafumble +barlafummil +barless +barley +barleybird +barleybreak +barleycorn +barleyhood +barleymow +barleysick +barling +barlock +barlow +barm +barmaid +barman +barmaster +barmbrack +barmcloth +Barmecidal +Barmecide +barmkin +barmote +barmskin +barmy +barmybrained +barn +Barnabas +Barnabite +Barnaby +barnacle +Barnard +barnard +barnbrack +Barnburner +Barney +barney +barnful +barnhardtite +barnman +barnstorm +barnstormer +barnstorming +Barnumism +Barnumize +barny +barnyard +Baroco +barocyclonometer +barodynamic +barodynamics +barognosis +barogram +barograph +barographic +baroi +barolo +barology +Barolong +barometer +barometric +barometrical +barometrically +barometrograph +barometrography +barometry +barometz +baromotor +baron +baronage +baroness +baronet +baronetage +baronetcy +baronethood +baronetical +baronetship +barong +Baronga +baronial +baronize +baronry +baronship +barony +Baroque +baroque +baroscope +baroscopic +baroscopical +Barosma +barosmin +barotactic +barotaxis +barotaxy +barothermograph +barothermohygrograph +baroto +Barotse +barouche +barouchet +Barouni +baroxyton +barpost +barquantine +barra +barrabkie +barrable +barrabora +barracan +barrack +barracker +barraclade +barracoon +barracouta +barracuda +barrad +barragan +barrage +barragon +barramunda +barramundi +barranca +barrandite +barras +barrator +barratrous +barratrously +barratry +barred +barrel +barrelage +barreled +barreler +barrelet +barrelful +barrelhead +barrelmaker +barrelmaking +barrelwise +barren +barrenly +barrenness +barrenwort +barrer +barret +Barrett +barrette +barretter +barricade +barricader +barricado +barrico +barrier +barriguda +barrigudo +barrikin +barriness +barring +Barrington +Barringtonia +Barrio +barrio +barrister +barristerial +barristership +barristress +barroom +barrow +barrowful +Barrowist +barrowman +barrulee +barrulet +barrulety +barruly +Barry +barry +Barsac +barse +barsom +Bart +bartender +bartending +barter +barterer +barth +barthite +bartholinitis +Bartholomean +Bartholomew +Bartholomewtide +Bartholomite +bartizan +bartizaned +Bartlemy +Bartlett +Barton +barton +Bartonella +Bartonia +Bartram +Bartramia +Bartramiaceae +Bartramian +Bartsia +baru +Baruch +Barundi +baruria +barvel +barwal +barway +barways +barwise +barwood +barycenter +barycentric +barye +baryecoia +baryglossia +barylalia +barylite +baryphonia +baryphonic +baryphony +barysilite +barysphere +baryta +barytes +barythymia +barytic +barytine +barytocalcite +barytocelestine +barytocelestite +baryton +barytone +barytophyllite +barytostrontianite +barytosulphate +bas +basal +basale +basalia +basally +basalt +basaltes +basaltic +basaltiform +basaltine +basaltoid +basanite +basaree +Bascology +bascule +base +baseball +baseballdom +baseballer +baseboard +baseborn +basebred +based +basehearted +baseheartedness +baselard +baseless +baselessly +baselessness +baselike +baseliner +Basella +Basellaceae +basellaceous +basely +baseman +basement +basementward +baseness +basenji +bases +bash +bashaw +bashawdom +bashawism +bashawship +bashful +bashfully +bashfulness +Bashilange +Bashkir +bashlyk +Bashmuric +basial +basialveolar +basiarachnitis +basiarachnoiditis +basiate +basiation +Basibracteolate +basibranchial +basibranchiate +basibregmatic +basic +basically +basichromatic +basichromatin +basichromatinic +basichromiole +basicity +basicranial +basicytoparaplastin +basidia +basidial +basidigital +basidigitale +basidiogenetic +basidiolichen +Basidiolichenes +basidiomycete +Basidiomycetes +basidiomycetous +basidiophore +basidiospore +basidiosporous +basidium +basidorsal +basifacial +basification +basifier +basifixed +basifugal +basify +basigamous +basigamy +basigenic +basigenous +basiglandular +basigynium +basihyal +basihyoid +Basil +basil +basilar +Basilarchia +basilary +basilateral +basilemma +basileus +Basilian +basilic +Basilica +basilica +Basilicae +basilical +basilican +basilicate +basilicon +Basilics +Basilidian +Basilidianism +basilinna +basiliscan +basiliscine +Basiliscus +basilisk +basilissa +Basilosauridae +Basilosaurus +basilweed +basilysis +basilyst +basimesostasis +basin +basinasal +basinasial +basined +basinerved +basinet +basinlike +basioccipital +basion +basiophitic +basiophthalmite +basiophthalmous +basiotribe +basiotripsy +basiparachromatin +basiparaplastin +basipetal +basiphobia +basipodite +basipoditic +basipterygial +basipterygium +basipterygoid +basiradial +basirhinal +basirostral +basis +basiscopic +basisphenoid +basisphenoidal +basitemporal +basiventral +basivertebral +bask +basker +Baskerville +basket +basketball +basketballer +basketful +basketing +basketmaker +basketmaking +basketry +basketware +basketwoman +basketwood +basketwork +basketworm +Baskish +Baskonize +Basoche +Basoga +basoid +Basoko +Basommatophora +basommatophorous +bason +Basongo +basophile +basophilia +basophilic +basophilous +basophobia +basos +basote +Basque +basque +basqued +basquine +bass +Bassa +Bassalia +Bassalian +bassan +bassanello +bassanite +bassara +bassarid +Bassaris +Bassariscus +bassarisk +basset +bassetite +bassetta +Bassia +bassie +bassine +bassinet +bassist +bassness +basso +bassoon +bassoonist +bassorin +bassus +basswood +Bast +bast +basta +Bastaard +Bastard +bastard +bastardism +bastardization +bastardize +bastardliness +bastardly +bastardy +baste +basten +baster +bastide +bastille +bastinade +bastinado +basting +bastion +bastionary +bastioned +bastionet +bastite +bastnasite +basto +baston +basurale +Basuto +Bat +bat +bataan +batad +Batak +batakan +bataleur +Batan +batara +batata +Batatas +batatilla +Batavi +Batavian +batch +batcher +bate +batea +bateau +bateaux +bated +Batekes +batel +bateman +batement +bater +Batetela +batfish +batfowl +batfowler +batfowling +Bath +bath +Bathala +bathe +batheable +bather +bathetic +bathflower +bathhouse +bathic +bathing +bathless +bathman +bathmic +bathmism +bathmotropic +bathmotropism +bathochromatic +bathochromatism +bathochrome +bathochromic +bathochromy +bathoflore +bathofloric +batholite +batholith +batholithic +batholitic +bathometer +Bathonian +bathophobia +bathorse +bathos +bathrobe +bathroom +bathroomed +bathroot +bathtub +bathukolpian +bathukolpic +bathvillite +bathwort +bathyal +bathyanesthesia +bathybian +bathybic +bathybius +bathycentesis +bathychrome +bathycolpian +bathycolpic +bathycurrent +bathyesthesia +bathygraphic +bathyhyperesthesia +bathyhypesthesia +bathylimnetic +bathylite +bathylith +bathylithic +bathylitic +bathymeter +bathymetric +bathymetrical +bathymetrically +bathymetry +bathyorographical +bathypelagic +bathyplankton +bathyseism +bathysmal +bathysophic +bathysophical +bathysphere +bathythermograph +Batidaceae +batidaceous +batik +batiker +batikulin +batikuling +bating +batino +Batis +batiste +batitinan +batlan +batlike +batling +batlon +batman +Batocrinidae +Batocrinus +Batodendron +batoid +Batoidei +Batoka +baton +Batonga +batonistic +batonne +batophobia +Batrachia +batrachian +batrachiate +Batrachidae +Batrachium +batrachoid +Batrachoididae +batrachophagous +Batrachophidia +batrachophobia +batrachoplasty +Batrachospermum +bats +batsman +batsmanship +batster +batswing +batt +Batta +batta +battailous +Battak +Battakhin +battalia +battalion +battarism +battarismus +battel +batteler +batten +battener +battening +batter +batterable +battercake +batterdock +battered +batterer +batterfang +batteried +batterman +battery +batteryman +battik +batting +battish +battle +battled +battledore +battlefield +battleful +battleground +battlement +battlemented +battleplane +battler +battleship +battlesome +battlestead +battlewagon +battleward +battlewise +battological +battologist +battologize +battology +battue +batty +batukite +batule +Batussi +Batwa +batwing +batyphone +batz +batzen +bauble +baublery +baubling +Baubo +bauch +bauchle +bauckie +bauckiebird +baud +baudekin +baudrons +Bauera +Bauhinia +baul +bauleah +Baume +baumhauerite +baun +bauno +Baure +bauson +bausond +bauta +bauxite +bauxitite +Bavarian +bavaroy +bavary +bavenite +baviaantje +Bavian +bavian +baviere +bavin +Bavius +bavoso +baw +bawarchi +bawbee +bawcock +bawd +bawdily +bawdiness +bawdry +bawdship +bawdyhouse +bawl +bawler +bawley +bawn +Bawra +bawtie +baxter +Baxterian +Baxterianism +baxtone +bay +Baya +baya +bayadere +bayal +bayamo +Bayard +bayard +bayardly +bayberry +baybolt +baybush +baycuru +bayed +bayeta +baygall +bayhead +bayish +bayldonite +baylet +baylike +bayman +bayness +Bayogoula +bayok +bayonet +bayoneted +bayoneteer +bayou +baywood +bazaar +baze +Bazigar +bazoo +bazooka +bazzite +bdellid +Bdellidae +bdellium +bdelloid +Bdelloida +Bdellostoma +Bdellostomatidae +Bdellostomidae +bdellotomy +Bdelloura +Bdellouridae +be +Bea +beach +beachcomb +beachcomber +beachcombing +beached +beachhead +beachlamar +beachless +beachman +beachmaster +beachward +beachy +beacon +beaconage +beaconless +beaconwise +bead +beaded +beader +beadflush +beadhouse +beadily +beadiness +beading +beadle +beadledom +beadlehood +beadleism +beadlery +beadleship +beadlet +beadlike +beadman +beadroll +beadrow +beadsman +beadswoman +beadwork +beady +Beagle +beagle +beagling +beak +beaked +beaker +beakerful +beakerman +beakermen +beakful +beakhead +beakiron +beaklike +beaky +beal +beala +bealing +beallach +bealtared +Bealtine +Bealtuinn +beam +beamage +beambird +beamed +beamer +beamfilling +beamful +beamhouse +beamily +beaminess +beaming +beamingly +beamish +beamless +beamlet +beamlike +beamman +beamsman +beamster +beamwork +beamy +bean +beanbag +beanbags +beancod +beanery +beanfeast +beanfeaster +beanfield +beanie +beano +beansetter +beanshooter +beanstalk +beant +beanweed +beany +beaproned +bear +bearable +bearableness +bearably +bearance +bearbaiter +bearbaiting +bearbane +bearberry +bearbind +bearbine +bearcoot +beard +bearded +bearder +beardie +bearding +beardless +beardlessness +beardom +beardtongue +beardy +bearer +bearess +bearfoot +bearherd +bearhide +bearhound +bearing +bearish +bearishly +bearishness +bearlet +bearlike +bearm +bearship +bearskin +beartongue +bearward +bearwood +bearwort +beast +beastbane +beastdom +beasthood +beastie +beastily +beastish +beastishness +beastlike +beastlily +beastliness +beastling +beastlings +beastly +beastman +beastship +beat +Beata +beata +beatable +beatae +beatee +beaten +beater +beaterman +beath +beatific +beatifical +beatifically +beatificate +beatification +beatify +beatinest +beating +beatitude +Beatrice +Beatrix +beatster +beatus +beau +Beauclerc +beaufin +Beaufort +beauish +beauism +Beaujolais +Beaumontia +Beaune +beaupere +beauseant +beauship +beauteous +beauteously +beauteousness +beauti +beautician +beautied +beautification +beautifier +beautiful +beautifully +beautifulness +beautify +beautihood +beauty +beautydom +beautyship +beaux +beaver +Beaverboard +beaverboard +beavered +beaverette +beaverish +beaverism +beaverite +beaverize +Beaverkill +beaverkin +beaverlike +beaverpelt +beaverroot +beaverteen +beaverwood +beavery +beback +bebait +beballed +bebang +bebannered +bebar +bebaron +bebaste +bebat +bebathe +bebatter +bebay +bebeast +bebed +bebeerine +bebeeru +bebelted +bebilya +bebite +bebization +beblain +beblear +bebled +bebless +beblister +beblood +bebloom +beblotch +beblubber +bebog +bebop +beboss +bebotch +bebothered +bebouldered +bebrave +bebreech +bebrine +bebrother +bebrush +bebump +bebusy +bebuttoned +becall +becalm +becalmment +becap +becard +becarpet +becarve +becassocked +becater +because +beccafico +becense +bechained +bechalk +bechance +becharm +bechase +bechatter +bechauffeur +becheck +becher +bechern +bechignoned +bechirp +Bechtler +Bechuana +becircled +becivet +Beck +beck +beckelite +becker +becket +Beckie +beckiron +beckon +beckoner +beckoning +beckoningly +Becky +beclad +beclamor +beclamour +beclang +beclart +beclasp +beclatter +beclaw +becloak +beclog +beclothe +becloud +beclout +beclown +becluster +becobweb +becoiffed +becollier +becolme +becolor +becombed +become +becomes +becoming +becomingly +becomingness +becomma +becompass +becompliment +becoom +becoresh +becost +becousined +becovet +becoward +becquerelite +becram +becramp +becrampon +becrawl +becreep +becrime +becrimson +becrinolined +becripple +becroak +becross +becrowd +becrown +becrush +becrust +becry +becudgel +becuffed +becuiba +becumber +becuna +becurl +becurry +becurse +becurtained +becushioned +becut +bed +bedabble +bedad +bedaggered +bedamn +bedamp +bedangled +bedare +bedark +bedarken +bedash +bedaub +bedawn +beday +bedaze +bedazement +bedazzle +bedazzlement +bedazzling +bedazzlingly +bedboard +bedbug +bedcap +bedcase +bedchair +bedchamber +bedclothes +bedcord +bedcover +bedded +bedder +bedding +bedead +bedeaf +bedeafen +bedebt +bedeck +bedecorate +bedeguar +bedel +beden +bedene +bedesman +bedevil +bedevilment +bedew +bedewer +bedewoman +bedfast +bedfellow +bedfellowship +bedflower +bedfoot +Bedford +bedframe +bedgery +bedgoer +bedgown +bediademed +bediamonded +bediaper +bedight +bedikah +bedim +bedimple +bedin +bedip +bedirt +bedirter +bedirty +bedismal +bedizen +bedizenment +bedkey +bedlam +bedlamer +Bedlamic +bedlamism +bedlamite +bedlamitish +bedlamize +bedlar +bedless +bedlids +bedmaker +bedmaking +bedman +bedmate +bedoctor +bedog +bedolt +bedot +bedote +Bedouin +Bedouinism +bedouse +bedown +bedoyo +bedpan +bedplate +bedpost +bedquilt +bedrabble +bedraggle +bedragglement +bedrail +bedral +bedrape +bedravel +bedrench +bedress +bedribble +bedrid +bedridden +bedriddenness +bedrift +bedright +bedrip +bedrivel +bedrizzle +bedrock +bedroll +bedroom +bedrop +bedrown +bedrowse +bedrug +bedscrew +bedsick +bedside +bedsite +bedsock +bedsore +bedspread +bedspring +bedstaff +bedstand +bedstaves +bedstead +bedstock +bedstraw +bedstring +bedtick +bedticking +bedtime +bedub +beduchess +beduck +beduke +bedull +bedumb +bedunce +bedunch +bedung +bedur +bedusk +bedust +bedwarf +bedway +bedways +bedwell +bedye +Bee +bee +beearn +beebread +beech +beechdrops +beechen +beechnut +beechwood +beechwoods +beechy +beedged +beedom +beef +beefeater +beefer +beefhead +beefheaded +beefily +beefin +beefiness +beefish +beefishness +beefless +beeflower +beefsteak +beeftongue +beefwood +beefy +beegerite +beehead +beeheaded +beeherd +beehive +beehouse +beeish +beeishness +beek +beekeeper +beekeeping +beekite +Beekmantown +beelbow +beelike +beeline +beelol +Beelzebub +Beelzebubian +Beelzebul +beeman +beemaster +been +beennut +beer +beerage +beerbachite +beerbibber +beerhouse +beerily +beeriness +beerish +beerishly +beermaker +beermaking +beermonger +beerocracy +Beerothite +beerpull +beery +bees +beest +beestings +beeswax +beeswing +beeswinged +beet +beeth +Beethovenian +Beethovenish +Beethovian +beetle +beetled +beetlehead +beetleheaded +beetler +beetlestock +beetlestone +beetleweed +beetmister +beetrave +beetroot +beetrooty +beety +beeve +beevish +beeware +beeway +beeweed +beewise +beewort +befall +befame +befamilied +befamine +befan +befancy +befanned +befathered +befavor +befavour +befeather +beferned +befetished +befetter +befezzed +befiddle +befilch +befile +befilleted +befilmed +befilth +befinger +befire +befist +befit +befitting +befittingly +befittingness +beflag +beflannel +beflap +beflatter +beflea +befleck +beflounce +beflour +beflout +beflower +beflum +befluster +befoam +befog +befool +befoolment +befop +before +beforehand +beforeness +beforested +beforetime +beforetimes +befortune +befoul +befouler +befoulment +befountained +befraught +befreckle +befreeze +befreight +befret +befriend +befriender +befriendment +befrill +befringe +befriz +befrocked +befrogged +befrounce +befrumple +befuddle +befuddlement +befuddler +befume +befurbelowed +befurred +beg +begabled +begad +begall +begani +begar +begari +begarlanded +begarnish +begartered +begash +begat +begaud +begaudy +begay +begaze +begeck +begem +beget +begettal +begetter +beggable +beggar +beggardom +beggarer +beggaress +beggarhood +beggarism +beggarlike +beggarliness +beggarly +beggarman +beggarweed +beggarwise +beggarwoman +beggary +Beggiatoa +Beggiatoaceae +beggiatoaceous +begging +beggingly +beggingwise +Beghard +begift +begiggle +begild +begin +beginger +beginner +beginning +begird +begirdle +beglad +beglamour +beglare +beglerbeg +beglerbeglic +beglerbegluc +beglerbegship +beglerbey +beglic +beglide +beglitter +beglobed +begloom +begloze +begluc +beglue +begnaw +bego +begob +begobs +begoggled +begohm +begone +begonia +Begoniaceae +begoniaceous +Begoniales +begorra +begorry +begotten +begottenness +begoud +begowk +begowned +begrace +begrain +begrave +begray +begrease +begreen +begrett +begrim +begrime +begrimer +begroan +begrown +begrudge +begrudgingly +begruntle +begrutch +begrutten +beguard +beguess +beguile +beguileful +beguilement +beguiler +beguiling +beguilingly +Beguin +Beguine +beguine +begulf +begum +begun +begunk +begut +behale +behalf +behallow +behammer +behap +behatted +behave +behavior +behavioral +behaviored +behaviorism +behaviorist +behavioristic +behavioristically +behead +beheadal +beheader +beheadlined +behear +behears +behearse +behedge +beheld +behelp +behemoth +behen +behenate +behenic +behest +behind +behinder +behindhand +behindsight +behint +behn +behold +beholdable +beholden +beholder +beholding +beholdingness +behoney +behoof +behooped +behoot +behoove +behooveful +behoovefully +behoovefulness +behooves +behooving +behoovingly +behorn +behorror +behowl +behung +behusband +behymn +behypocrite +beice +Beid +beige +being +beingless +beingness +beinked +beira +beisa +Beja +bejabers +bejade +bejan +bejant +bejaundice +bejazz +bejel +bejewel +bejezebel +bejig +bejuggle +bejumble +bekah +bekerchief +bekick +bekilted +beking +bekinkinite +bekiss +bekko +beknave +beknight +beknit +beknived +beknotted +beknottedly +beknottedness +beknow +beknown +Bel +bel +bela +belabor +belaced +beladle +belady +belage +belah +Belait +Belaites +belam +Belamcanda +belanda +belar +belard +belash +belate +belated +belatedly +belatedness +belatticed +belaud +belauder +belavendered +belay +belayer +belch +belcher +beld +beldam +beldamship +belderroot +belduque +beleaf +beleaguer +beleaguerer +beleaguerment +beleap +beleave +belecture +beledgered +belee +belemnid +belemnite +Belemnites +belemnitic +Belemnitidae +belemnoid +Belemnoidea +beletter +belfried +belfry +belga +Belgae +Belgian +Belgic +Belgophile +Belgrade +Belgravia +Belgravian +Belial +Belialic +Belialist +belibel +belick +belie +belief +beliefful +belieffulness +beliefless +belier +believability +believable +believableness +believe +believer +believing +believingly +belight +beliked +Belili +belimousined +Belinda +Belinuridae +Belinurus +belion +beliquor +Belis +belite +belitter +belittle +belittlement +belittler +belive +bell +Bella +Bellabella +Bellacoola +belladonna +bellarmine +Bellatrix +bellbind +bellbird +bellbottle +bellboy +belle +belled +belledom +Belleek +bellehood +belleric +Bellerophon +Bellerophontidae +belletrist +belletristic +bellflower +bellhanger +bellhanging +bellhop +bellhouse +bellicism +bellicose +bellicosely +bellicoseness +bellicosity +bellied +belliferous +belligerence +belligerency +belligerent +belligerently +belling +bellipotent +Bellis +bellite +bellmaker +bellmaking +bellman +bellmanship +bellmaster +bellmouth +bellmouthed +Bellona +Bellonian +bellonion +bellote +Bellovaci +bellow +bellower +bellows +bellowsful +bellowslike +bellowsmaker +bellowsmaking +bellowsman +bellpull +belltail +belltopper +belltopperdom +bellware +bellwaver +bellweed +bellwether +bellwind +bellwine +bellwood +bellwort +belly +bellyache +bellyband +bellyer +bellyfish +bellyflaught +bellyful +bellying +bellyland +bellylike +bellyman +bellypiece +bellypinch +beloam +beloeilite +beloid +belomancy +Belone +belonesite +belong +belonger +belonging +belonid +Belonidae +belonite +belonoid +belonosphaerite +belord +Belostoma +Belostomatidae +Belostomidae +belout +belove +beloved +below +belowstairs +belozenged +Belshazzar +Belshazzaresque +belsire +belt +Beltane +belted +Beltene +belter +Beltian +beltie +beltine +belting +Beltir +Beltis +beltmaker +beltmaking +beltman +belton +beltwise +Beluchi +Belucki +beluga +belugite +belute +belve +belvedere +Belverdian +bely +belying +belyingly +belzebuth +bema +bemad +bemadam +bemaddening +bemail +bemaim +bemajesty +beman +bemangle +bemantle +bemar +bemartyr +bemask +bemaster +bemat +bemata +bemaul +bemazed +Bemba +Bembecidae +Bembex +bemeal +bemean +bemedaled +bemedalled +bementite +bemercy +bemingle +beminstrel +bemire +bemirement +bemirror +bemirrorment +bemist +bemistress +bemitered +bemitred +bemix +bemoan +bemoanable +bemoaner +bemoaning +bemoaningly +bemoat +bemock +bemoil +bemoisten +bemole +bemolt +bemonster +bemoon +bemotto +bemoult +bemouth +bemuck +bemud +bemuddle +bemuddlement +bemuddy +bemuffle +bemurmur +bemuse +bemused +bemusedly +bemusement +bemusk +bemuslined +bemuzzle +Ben +ben +bena +benab +Benacus +bename +benami +benamidar +benasty +benben +bench +benchboard +bencher +benchership +benchfellow +benchful +benching +benchland +benchlet +benchman +benchwork +benchy +bencite +bend +benda +bendability +bendable +bended +bender +bending +bendingly +bendlet +bendsome +bendwise +bendy +bene +beneaped +beneath +beneception +beneceptive +beneceptor +benedicite +Benedict +benedict +Benedicta +Benedictine +Benedictinism +benediction +benedictional +benedictionary +benedictive +benedictively +benedictory +Benedictus +benedight +benefaction +benefactive +benefactor +benefactorship +benefactory +benefactress +benefic +benefice +beneficed +beneficeless +beneficence +beneficent +beneficential +beneficently +beneficial +beneficially +beneficialness +beneficiary +beneficiaryship +beneficiate +beneficiation +benefit +benefiter +beneighbored +Benelux +benempt +benempted +beneplacito +benet +Benetnasch +benettle +Beneventan +Beneventana +benevolence +benevolent +benevolently +benevolentness +benevolist +beng +Bengal +Bengalese +Bengali +Bengalic +bengaline +Bengola +Beni +beni +benight +benighted +benightedness +benighten +benighter +benightmare +benightment +benign +benignancy +benignant +benignantly +benignity +benignly +Benin +Benincasa +benison +benitoite +benj +Benjamin +benjamin +benjaminite +Benjamite +Benjy +benjy +Benkulen +benmost +benn +benne +bennel +Bennet +bennet +Bennettitaceae +bennettitaceous +Bennettitales +Bennettites +bennetweed +Benny +benny +beno +benorth +benote +bensel +bensh +benshea +benshee +benshi +Benson +bent +bentang +benthal +Benthamic +Benthamism +Benthamite +benthic +benthon +benthonic +benthos +Bentincks +bentiness +benting +Benton +bentonite +bentstar +bentwood +benty +Benu +benumb +benumbed +benumbedness +benumbing +benumbingly +benumbment +benward +benweed +benzacridine +benzal +benzalacetone +benzalacetophenone +benzalaniline +benzalazine +benzalcohol +benzalcyanhydrin +benzaldehyde +benzaldiphenyl +benzaldoxime +benzalethylamine +benzalhydrazine +benzalphenylhydrazone +benzalphthalide +benzamide +benzamido +benzamine +benzaminic +benzamino +benzanalgen +benzanilide +benzanthrone +benzantialdoxime +benzazide +benzazimide +benzazine +benzazole +benzbitriazole +benzdiazine +benzdifuran +benzdioxazine +benzdioxdiazine +benzdioxtriazine +Benzedrine +benzein +benzene +benzenediazonium +benzenoid +benzenyl +benzhydrol +benzhydroxamic +benzidine +benzidino +benzil +benzilic +benzimidazole +benziminazole +benzinduline +benzine +benzo +benzoate +benzoated +benzoazurine +benzobis +benzocaine +benzocoumaran +benzodiazine +benzodiazole +benzoflavine +benzofluorene +benzofulvene +benzofuran +benzofuroquinoxaline +benzofuryl +benzoglycolic +benzoglyoxaline +benzohydrol +benzoic +benzoid +benzoin +benzoinated +benzoiodohydrin +benzol +benzolate +benzole +benzolize +benzomorpholine +benzonaphthol +benzonitrile +benzonitrol +benzoperoxide +benzophenanthrazine +benzophenanthroline +benzophenazine +benzophenol +benzophenone +benzophenothiazine +benzophenoxazine +benzophloroglucinol +benzophosphinic +benzophthalazine +benzopinacone +benzopyran +benzopyranyl +benzopyrazolone +benzopyrylium +benzoquinoline +benzoquinone +benzoquinoxaline +benzosulphimide +benzotetrazine +benzotetrazole +benzothiazine +benzothiazole +benzothiazoline +benzothiodiazole +benzothiofuran +benzothiophene +benzothiopyran +benzotoluide +benzotriazine +benzotriazole +benzotrichloride +benzotrifuran +benzoxate +benzoxy +benzoxyacetic +benzoxycamphor +benzoxyphenanthrene +benzoyl +benzoylate +benzoylation +benzoylformic +benzoylglycine +benzpinacone +benzthiophen +benztrioxazine +benzyl +benzylamine +benzylic +benzylidene +benzylpenicillin +beode +Beothuk +Beothukan +Beowulf +bepaid +Bepaint +bepale +bepaper +beparch +beparody +beparse +bepart +bepaste +bepastured +bepat +bepatched +bepaw +bepearl +bepelt +bepen +bepepper +beperiwigged +bepester +bepewed +bephilter +bephrase +bepicture +bepiece +bepierce +bepile +bepill +bepillared +bepimple +bepinch +bepistoled +bepity +beplague +beplaided +beplaster +beplumed +bepommel +bepowder +bepraise +bepraisement +bepraiser +beprank +bepray +bepreach +bepress +bepretty +bepride +beprose +bepuddle +bepuff +bepun +bepurple +bepuzzle +bepuzzlement +bequalm +bequeath +bequeathable +bequeathal +bequeather +bequeathment +bequest +bequirtle +bequote +ber +berain +berairou +berakah +berake +berakoth +berapt +berascal +berat +berate +berattle +beraunite +beray +berbamine +Berber +Berberi +Berberian +berberid +Berberidaceae +berberidaceous +berberine +Berberis +berberry +Berchemia +Berchta +berdache +bere +Berean +bereason +bereave +bereavement +bereaven +bereaver +bereft +berend +Berengaria +Berengarian +Berengarianism +berengelite +Berenice +Bereshith +beresite +beret +berewick +berg +bergalith +Bergama +Bergamask +bergamiol +Bergamo +Bergamot +bergamot +bergander +bergaptene +berger +berghaan +berginization +berginize +berglet +bergschrund +Bergsonian +Bergsonism +bergut +bergy +bergylt +berhyme +Beri +beribanded +beribboned +beriberi +beriberic +beride +berigora +beringed +beringite +beringleted +berinse +berith +Berkeleian +Berkeleianism +Berkeleyism +Berkeleyite +berkelium +berkovets +berkowitz +Berkshire +berley +berlin +berline +Berliner +berlinite +Berlinize +berm +Bermuda +Bermudian +bermudite +Bern +Bernard +Bernardina +Bernardine +berne +Bernese +Bernice +Bernicia +bernicle +Bernie +Berninesque +Bernoullian +berobed +Beroe +Beroida +Beroidae +beroll +Berossos +berouged +beround +berrendo +berret +berri +berried +berrier +berrigan +berrugate +berry +berrybush +berryless +berrylike +berrypicker +berrypicking +berseem +berserk +berserker +Bersiamite +Bersil +Bert +Bertat +Berteroa +berth +Bertha +berthage +berthed +berther +berthierite +berthing +Berthold +Bertholletia +Bertie +Bertolonia +Bertram +bertram +Bertrand +bertrandite +bertrum +beruffed +beruffled +berust +bervie +berycid +Berycidae +beryciform +berycine +berycoid +Berycoidea +berycoidean +Berycoidei +Berycomorphi +beryl +berylate +beryllia +berylline +berylliosis +beryllium +berylloid +beryllonate +beryllonite +beryllosis +Berytidae +Beryx +berzelianite +berzeliite +bes +besa +besagne +besaiel +besaint +besan +besanctify +besauce +bescab +bescarf +bescatter +bescent +bescorch +bescorn +bescoundrel +bescour +bescourge +bescramble +bescrape +bescratch +bescrawl +bescreen +bescribble +bescurf +bescurvy +bescutcheon +beseam +besee +beseech +beseecher +beseeching +beseechingly +beseechingness +beseechment +beseem +beseeming +beseemingly +beseemingness +beseemliness +beseemly +beseen +beset +besetment +besetter +besetting +beshackle +beshade +beshadow +beshag +beshake +beshame +beshawled +beshear +beshell +beshield +beshine +beshiver +beshlik +beshod +beshout +beshow +beshower +beshrew +beshriek +beshrivel +beshroud +besiclometer +beside +besides +besiege +besieged +besiegement +besieger +besieging +besiegingly +besigh +besilver +besin +besing +besiren +besit +beslab +beslap +beslash +beslave +beslaver +besleeve +beslime +beslimer +beslings +beslipper +beslobber +beslow +beslubber +beslur +beslushed +besmear +besmearer +besmell +besmile +besmirch +besmircher +besmirchment +besmoke +besmooth +besmother +besmouch +besmudge +besmut +besmutch +besnare +besneer +besnivel +besnow +besnuff +besodden +besogne +besognier +besoil +besom +besomer +besonnet +besoot +besoothe +besoothement +besot +besotment +besotted +besottedly +besottedness +besotting +besottingly +besought +besoul +besour +bespangle +bespate +bespatter +bespatterer +bespatterment +bespawl +bespeak +bespeakable +bespeaker +bespecked +bespeckle +bespecklement +bespectacled +besped +bespeech +bespeed +bespell +bespelled +bespend +bespete +bespew +bespice +bespill +bespin +bespirit +bespit +besplash +besplatter +besplit +bespoke +bespoken +bespot +bespottedness +bespouse +bespout +bespray +bespread +besprent +besprinkle +besprinkler +bespurred +besputter +bespy +besqueeze +besquib +besra +Bess +Bessarabian +Besselian +Bessemer +bessemer +Bessemerize +bessemerize +Bessera +Bessi +Bessie +Bessy +best +bestab +bestain +bestamp +bestar +bestare +bestarve +bestatued +bestay +bestayed +bestead +besteer +bestench +bester +bestial +bestialism +bestialist +bestiality +bestialize +bestially +bestiarian +bestiarianism +bestiary +bestick +bestill +bestink +bestir +bestness +bestock +bestore +bestorm +bestove +bestow +bestowable +bestowage +bestowal +bestower +bestowing +bestowment +bestraddle +bestrapped +bestraught +bestraw +bestreak +bestream +bestrew +bestrewment +bestride +bestripe +bestrode +bestubbled +bestuck +bestud +besugar +besuit +besully +beswarm +besweatered +besweeten +beswelter +beswim +beswinge +beswitch +bet +Beta +beta +betacism +betacismus +betafite +betag +betail +betailor +betaine +betainogen +betalk +betallow +betangle +betanglement +betask +betassel +betatron +betattered +betaxed +betear +beteela +beteem +betel +Betelgeuse +Beth +beth +bethabara +bethankit +bethel +Bethesda +bethflower +bethink +Bethlehem +Bethlehemite +bethought +bethrall +bethreaten +bethroot +Bethuel +bethumb +bethump +bethunder +bethwack +Bethylidae +betide +betimber +betimes +betinge +betipple +betire +betis +betitle +betocsin +betoil +betoken +betokener +betone +betongue +Betonica +betony +betorcin +betorcinol +betoss +betowel +betowered +Betoya +Betoyan +betrace +betrail +betrample +betrap +betravel +betray +betrayal +betrayer +betrayment +betread +betrend +betrim +betrinket +betroth +betrothal +betrothed +betrothment +betrough +betrousered +betrumpet +betrunk +Betsey +Betsileos +Betsimisaraka +betso +Betsy +Betta +betted +better +betterer +bettergates +bettering +betterly +betterment +bettermost +betterness +betters +Bettina +Bettine +betting +bettong +bettonga +Bettongia +bettor +Betty +betty +betuckered +Betula +Betulaceae +betulaceous +betulin +betulinamaric +betulinic +betulinol +Betulites +beturbaned +betusked +betutor +betutored +betwattled +between +betweenbrain +betweenity +betweenmaid +betweenness +betweenwhiles +betwine +betwit +betwixen +betwixt +beudantite +Beulah +beuniformed +bevatron +beveil +bevel +beveled +beveler +bevelled +bevelment +bevenom +bever +beverage +Beverly +beverse +bevesseled +bevesselled +beveto +bevillain +bevined +bevoiled +bevomit +bevue +bevy +bewail +bewailable +bewailer +bewailing +bewailingly +bewailment +bewaitered +bewall +beware +bewash +bewaste +bewater +beweary +beweep +beweeper +bewelcome +bewelter +bewept +bewest +bewet +bewhig +bewhiskered +bewhisper +bewhistle +bewhite +bewhiten +bewidow +bewig +bewigged +bewilder +bewildered +bewilderedly +bewilderedness +bewildering +bewilderingly +bewilderment +bewimple +bewinged +bewinter +bewired +bewitch +bewitchedness +bewitcher +bewitchery +bewitchful +bewitching +bewitchingly +bewitchingness +bewitchment +bewith +bewizard +bework +beworm +beworn +beworry +beworship +bewrap +bewrathed +bewray +bewrayer +bewrayingly +bewrayment +bewreath +bewreck +bewrite +bey +beydom +beylic +beylical +beyond +beyrichite +beyship +Bezaleel +Bezaleelian +bezant +bezantee +bezanty +bezel +bezesteen +bezetta +bezique +bezoar +bezoardic +bezonian +Bezpopovets +bezzi +bezzle +bezzo +bhabar +Bhadon +Bhaga +bhagavat +bhagavata +bhaiachari +bhaiyachara +bhakta +bhakti +bhalu +bhandar +bhandari +bhang +bhangi +Bhar +bhara +bharal +Bharata +bhat +bhava +Bhavani +bheesty +bhikku +bhikshu +Bhil +Bhili +Bhima +Bhojpuri +bhoosa +Bhotia +Bhotiya +Bhowani +bhoy +Bhumij +bhungi +bhungini +bhut +Bhutanese +Bhutani +bhutatathata +Bhutia +biabo +biacetyl +biacetylene +biacid +biacromial +biacuminate +biacuru +bialate +biallyl +bialveolar +Bianca +Bianchi +bianchite +bianco +biangular +biangulate +biangulated +biangulous +bianisidine +biannual +biannually +biannulate +biarchy +biarcuate +biarcuated +biarticular +biarticulate +biarticulated +bias +biasness +biasteric +biaswise +biatomic +biauricular +biauriculate +biaxal +biaxial +biaxiality +biaxially +biaxillary +bib +bibacious +bibacity +bibasic +bibation +bibb +bibber +bibble +bibbler +bibbons +bibcock +bibenzyl +bibi +Bibio +bibionid +Bibionidae +bibiri +bibitory +Bible +bibless +Biblic +Biblical +Biblicality +Biblically +Biblicism +Biblicist +Biblicistic +Biblicolegal +Biblicoliterary +Biblicopsychological +biblioclasm +biblioclast +bibliofilm +bibliogenesis +bibliognost +bibliognostic +bibliogony +bibliograph +bibliographer +bibliographic +bibliographical +bibliographically +bibliographize +bibliography +biblioklept +bibliokleptomania +bibliokleptomaniac +bibliolater +bibliolatrous +bibliolatry +bibliological +bibliologist +bibliology +bibliomancy +bibliomane +bibliomania +bibliomaniac +bibliomaniacal +bibliomanian +bibliomanianism +bibliomanism +bibliomanist +bibliopegic +bibliopegist +bibliopegistic +bibliopegy +bibliophage +bibliophagic +bibliophagist +bibliophagous +bibliophile +bibliophilic +bibliophilism +bibliophilist +bibliophilistic +bibliophily +bibliophobia +bibliopolar +bibliopole +bibliopolery +bibliopolic +bibliopolical +bibliopolically +bibliopolism +bibliopolist +bibliopolistic +bibliopoly +bibliosoph +bibliotaph +bibliotaphic +bibliothec +bibliotheca +bibliothecal +bibliothecarial +bibliothecarian +bibliothecary +bibliotherapeutic +bibliotherapist +bibliotherapy +bibliothetic +bibliotic +bibliotics +bibliotist +Biblism +Biblist +biblus +biborate +bibracteate +bibracteolate +bibulosity +bibulous +bibulously +bibulousness +Bibulus +bicalcarate +bicameral +bicameralism +bicamerist +bicapitate +bicapsular +bicarbonate +bicarbureted +bicarinate +bicarpellary +bicarpellate +bicaudal +bicaudate +Bice +bice +bicellular +bicentenary +bicentennial +bicephalic +bicephalous +biceps +bicetyl +bichir +bichloride +bichord +bichromate +bichromatic +bichromatize +bichrome +bichromic +bichy +biciliate +biciliated +bicipital +bicipitous +bicircular +bicirrose +bick +bicker +bickerer +bickern +biclavate +biclinium +bicollateral +bicollaterality +bicolligate +bicolor +bicolored +bicolorous +biconcave +biconcavity +bicondylar +bicone +biconic +biconical +biconically +biconjugate +biconsonantal +biconvex +bicorn +bicornate +bicorne +bicorned +bicornous +bicornuate +bicornuous +bicornute +bicorporal +bicorporate +bicorporeal +bicostate +bicrenate +bicrescentic +bicrofarad +bicron +bicrural +bicursal +bicuspid +bicuspidate +bicyanide +bicycle +bicycler +bicyclic +bicyclism +bicyclist +bicyclo +bicycloheptane +bicylindrical +bid +bidactyl +bidactyle +bidactylous +bidar +bidarka +bidcock +biddable +biddableness +biddably +biddance +Biddelian +bidder +bidding +Biddulphia +Biddulphiaceae +Biddy +biddy +bide +Bidens +bident +bidental +bidentate +bidented +bidential +bidenticulate +bider +bidet +bidigitate +bidimensional +biding +bidirectional +bidiurnal +Bidpai +bidri +biduous +bieberite +Biedermeier +bield +bieldy +bielectrolysis +bielenite +Bielid +Bielorouss +bien +bienly +bienness +biennia +biennial +biennially +biennium +bier +bierbalk +biethnic +bietle +bifacial +bifanged +bifara +bifarious +bifariously +bifer +biferous +biff +biffin +bifid +bifidate +bifidated +bifidity +bifidly +bifilar +bifilarly +bifistular +biflabellate +biflagellate +biflecnode +biflected +biflex +biflorate +biflorous +bifluoride +bifocal +bifoil +bifold +bifolia +bifoliate +bifoliolate +bifolium +biforked +biform +biformed +biformity +biforous +bifront +bifrontal +bifronted +bifurcal +bifurcate +bifurcated +bifurcately +bifurcation +big +biga +bigamic +bigamist +bigamistic +bigamize +bigamous +bigamously +bigamy +bigarade +bigaroon +bigarreau +bigbloom +bigemina +bigeminal +bigeminate +bigeminated +bigeminum +bigener +bigeneric +bigential +bigeye +bigg +biggah +biggen +bigger +biggest +biggin +biggish +biggonet +bigha +bighead +bighearted +bigheartedness +bighorn +bight +biglandular +biglenoid +biglot +bigmouth +bigmouthed +bigness +Bignonia +Bignoniaceae +bignoniaceous +bignoniad +bignou +bigoniac +bigonial +bigot +bigoted +bigotedly +bigotish +bigotry +bigotty +bigroot +bigthatch +biguanide +biguttate +biguttulate +bigwig +bigwigged +bigwiggedness +bigwiggery +bigwiggism +Bihai +Biham +bihamate +Bihari +biharmonic +bihourly +bihydrazine +bija +bijasal +bijou +bijouterie +bijoux +bijugate +bijugular +bike +bikh +bikhaconitine +bikini +Bikol +Bikram +Bikukulla +Bilaan +bilabe +bilabial +bilabiate +bilalo +bilamellar +bilamellate +bilamellated +bilaminar +bilaminate +bilaminated +bilander +bilateral +bilateralism +bilaterality +bilaterally +bilateralness +Bilati +bilberry +bilbie +bilbo +bilboquet +bilby +bilch +bilcock +bildar +bilders +bile +bilestone +bilge +bilgy +Bilharzia +bilharzial +bilharziasis +bilharzic +bilharziosis +bilianic +biliary +biliate +biliation +bilic +bilicyanin +bilifaction +biliferous +bilification +bilifuscin +bilify +bilihumin +bilimbi +bilimbing +biliment +Bilin +bilinear +bilineate +bilingual +bilingualism +bilingually +bilinguar +bilinguist +bilinigrin +bilinite +bilio +bilious +biliously +biliousness +biliprasin +bilipurpurin +bilipyrrhin +bilirubin +bilirubinemia +bilirubinic +bilirubinuria +biliteral +biliteralism +bilith +bilithon +biliverdic +biliverdin +bilixanthin +bilk +bilker +Bill +bill +billa +billable +billabong +billback +billbeetle +Billbergia +billboard +billbroking +billbug +billed +biller +billet +billeter +billethead +billeting +billetwood +billety +billfish +billfold +billhead +billheading +billholder +billhook +billian +billiard +billiardist +billiardly +billiards +Billie +Billiken +billikin +billing +billingsgate +billion +billionaire +billionism +billionth +billitonite +Billjim +billman +billon +billot +billow +billowiness +billowy +billposter +billposting +billsticker +billsticking +Billy +billy +billyboy +billycan +billycock +billyer +billyhood +billywix +bilo +bilobated +bilobe +bilobed +bilobiate +bilobular +bilocation +bilocellate +bilocular +biloculate +Biloculina +biloculine +bilophodont +Biloxi +bilsh +Bilskirnir +bilsted +biltong +biltongue +Bim +bimaculate +bimaculated +bimalar +Bimana +bimanal +bimane +bimanous +bimanual +bimanually +bimarginate +bimarine +bimastic +bimastism +bimastoid +bimasty +bimaxillary +bimbil +Bimbisara +bimeby +bimensal +bimester +bimestrial +bimetalic +bimetallism +bimetallist +bimetallistic +bimillenary +bimillennium +bimillionaire +Bimini +Bimmeler +bimodal +bimodality +bimolecular +bimonthly +bimotored +bimotors +bimucronate +bimuscular +bin +binal +binaphthyl +binarium +binary +binate +binately +bination +binational +binaural +binauricular +binbashi +bind +binder +bindery +bindheimite +binding +bindingly +bindingness +bindle +bindlet +bindoree +bindweb +bindweed +bindwith +bindwood +bine +binervate +bineweed +bing +binge +bingey +binghi +bingle +bingo +bingy +binh +Bini +biniodide +Binitarian +Binitarianism +bink +binman +binna +binnacle +binning +binnite +binnogue +bino +binocle +binocular +binocularity +binocularly +binoculate +binodal +binode +binodose +binodous +binomenclature +binomial +binomialism +binomially +binominal +binominated +binominous +binormal +binotic +binotonous +binous +binoxalate +binoxide +bint +bintangor +binturong +binuclear +binucleate +binucleated +binucleolate +binukau +Binzuru +biobibliographical +biobibliography +bioblast +bioblastic +biocatalyst +biocellate +biocentric +biochemic +biochemical +biochemically +biochemics +biochemist +biochemistry +biochemy +biochore +bioclimatic +bioclimatology +biocoenose +biocoenosis +biocoenotic +biocycle +biod +biodynamic +biodynamical +biodynamics +biodyne +bioecologic +bioecological +bioecologically +bioecologist +bioecology +biogen +biogenase +biogenesis +biogenesist +biogenetic +biogenetical +biogenetically +biogenetics +biogenous +biogeny +biogeochemistry +biogeographic +biogeographical +biogeographically +biogeography +biognosis +biograph +biographee +biographer +biographic +biographical +biographically +biographist +biographize +biography +bioherm +biokinetics +biolinguistics +biolith +biologese +biologic +biological +biologically +biologicohumanistic +biologism +biologist +biologize +biology +bioluminescence +bioluminescent +biolysis +biolytic +biomagnetic +biomagnetism +biomathematics +biome +biomechanical +biomechanics +biometeorology +biometer +biometric +biometrical +biometrically +biometrician +biometricist +biometrics +biometry +biomicroscopy +bion +bionergy +bionomic +bionomical +bionomically +bionomics +bionomist +bionomy +biophagism +biophagous +biophagy +biophilous +biophore +biophotophone +biophysical +biophysicochemical +biophysics +biophysiography +biophysiological +biophysiologist +biophysiology +biophyte +bioplasm +bioplasmic +bioplast +bioplastic +bioprecipitation +biopsic +biopsy +biopsychic +biopsychical +biopsychological +biopsychologist +biopsychology +biopyribole +bioral +biorbital +biordinal +bioreaction +biorgan +bios +bioscope +bioscopic +bioscopy +biose +biosis +biosocial +biosociological +biosphere +biostatic +biostatical +biostatics +biostatistics +biosterin +biosterol +biostratigraphy +biosynthesis +biosynthetic +biosystematic +biosystematics +biosystematist +biosystematy +Biota +biota +biotaxy +biotechnics +biotic +biotical +biotics +biotin +biotite +biotitic +biotome +biotomy +biotope +biotype +biotypic +biovular +biovulate +bioxalate +bioxide +bipack +bipaleolate +Bipaliidae +Bipalium +bipalmate +biparasitic +biparental +biparietal +biparous +biparted +bipartible +bipartient +bipartile +bipartisan +bipartisanship +bipartite +bipartitely +bipartition +biparty +bipaschal +bipectinate +bipectinated +biped +bipedal +bipedality +bipedism +bipeltate +bipennate +bipennated +bipenniform +biperforate +bipersonal +bipetalous +biphase +biphasic +biphenol +biphenyl +biphenylene +bipinnaria +bipinnate +bipinnated +bipinnately +bipinnatifid +bipinnatiparted +bipinnatipartite +bipinnatisect +bipinnatisected +biplanal +biplanar +biplane +biplicate +biplicity +biplosion +biplosive +bipod +bipolar +bipolarity +bipolarize +Bipont +Bipontine +biporose +biporous +biprism +biprong +bipunctal +bipunctate +bipunctual +bipupillate +bipyramid +bipyramidal +bipyridine +bipyridyl +biquadrantal +biquadrate +biquadratic +biquarterly +biquartz +biquintile +biracial +biracialism +biradial +biradiate +biradiated +biramous +birational +birch +birchbark +birchen +birching +birchman +birchwood +bird +birdbander +birdbanding +birdbath +birdberry +birdcall +birdcatcher +birdcatching +birdclapper +birdcraft +birddom +birdeen +birder +birdglue +birdhood +birdhouse +birdie +birdikin +birding +birdland +birdless +birdlet +birdlike +birdlime +birdling +birdlore +birdman +birdmouthed +birdnest +birdnester +birdseed +birdstone +birdweed +birdwise +birdwoman +birdy +birectangular +birefracting +birefraction +birefractive +birefringence +birefringent +bireme +biretta +Birgus +biri +biriba +birimose +birk +birken +Birkenhead +Birkenia +Birkeniidae +birkie +birkremite +birl +birle +birler +birlie +birlieman +birlinn +birma +Birmingham +Birminghamize +birn +birny +Biron +birostrate +birostrated +birotation +birotatory +birr +birse +birsle +birsy +birth +birthbed +birthday +birthland +birthless +birthmark +birthmate +birthnight +birthplace +birthright +birthroot +birthstone +birthstool +birthwort +birthy +bis +bisabol +bisaccate +bisacromial +bisalt +Bisaltae +bisantler +bisaxillary +bisbeeite +biscacha +Biscanism +Biscayan +Biscayanism +biscayen +Biscayner +bischofite +biscotin +biscuit +biscuiting +biscuitlike +biscuitmaker +biscuitmaking +biscuitroot +biscuitry +bisdiapason +bisdimethylamino +bisect +bisection +bisectional +bisectionally +bisector +bisectrices +bisectrix +bisegment +biseptate +biserial +biserially +biseriate +biseriately +biserrate +bisetose +bisetous +bisexed +bisext +bisexual +bisexualism +bisexuality +bisexually +bisexuous +bisglyoxaline +Bishareen +Bishari +Bisharin +bishop +bishopdom +bishopess +bishopful +bishophood +bishopless +bishoplet +bishoplike +bishopling +bishopric +bishopship +bishopweed +bisiliac +bisilicate +bisiliquous +bisimine +bisinuate +bisinuation +bisischiadic +bisischiatic +Bisley +bislings +bismar +Bismarck +Bismarckian +Bismarckianism +bismarine +bismerpund +bismillah +bismite +Bismosol +bismuth +bismuthal +bismuthate +bismuthic +bismuthide +bismuthiferous +bismuthine +bismuthinite +bismuthite +bismuthous +bismuthyl +bismutite +bismutoplagionite +bismutosmaltite +bismutosphaerite +bisnaga +bison +bisonant +bisontine +bisphenoid +bispinose +bispinous +bispore +bisporous +bisque +bisquette +bissext +bissextile +bisson +bistate +bistephanic +bister +bistered +bistetrazole +bisti +bistipular +bistipulate +bistipuled +bistort +Bistorta +bistournage +bistoury +bistratal +bistratose +bistriate +bistriazole +bistro +bisubstituted +bisubstitution +bisulcate +bisulfid +bisulphate +bisulphide +bisulphite +bisyllabic +bisyllabism +bisymmetric +bisymmetrical +bisymmetrically +bisymmetry +bit +bitable +bitangent +bitangential +bitanhol +bitartrate +bitbrace +bitch +bite +bitemporal +bitentaculate +biter +biternate +biternately +bitesheep +bitewing +bitheism +Bithynian +biti +biting +bitingly +bitingness +Bitis +bitless +bito +bitolyl +bitonality +bitreadle +bitripartite +bitripinnatifid +bitriseptate +bitrochanteric +bitstock +bitstone +bitt +bitted +bitten +bitter +bitterbark +bitterblain +bitterbloom +bitterbur +bitterbush +bitterful +bitterhead +bitterhearted +bitterheartedness +bittering +bitterish +bitterishness +bitterless +bitterling +bitterly +bittern +bitterness +bitternut +bitterroot +bitters +bittersweet +bitterweed +bitterwood +bitterworm +bitterwort +bitthead +bittie +Bittium +bittock +bitty +bitubercular +bituberculate +bituberculated +Bitulithic +bitulithic +bitume +bitumed +bitumen +bituminate +bituminiferous +bituminization +bituminize +bituminoid +bituminous +bitwise +bityite +bitypic +biune +biunial +biunity +biunivocal +biurate +biurea +biuret +bivalence +bivalency +bivalent +bivalve +bivalved +Bivalvia +bivalvian +bivalvous +bivalvular +bivariant +bivariate +bivascular +bivaulted +bivector +biventer +biventral +biverbal +bivinyl +bivious +bivittate +bivocal +bivocalized +bivoltine +bivoluminous +bivouac +biwa +biweekly +biwinter +Bixa +Bixaceae +bixaceous +bixbyite +bixin +biyearly +biz +bizardite +bizarre +bizarrely +bizarreness +Bizen +bizet +bizonal +bizone +Bizonia +bizygomatic +bizz +Bjorne +blab +blabber +blabberer +blachong +black +blackacre +blackamoor +blackback +blackball +blackballer +blackband +Blackbeard +blackbelly +blackberry +blackbine +blackbird +blackbirder +blackbirding +blackboard +blackboy +blackbreast +blackbush +blackbutt +blackcap +blackcoat +blackcock +blackdamp +blacken +blackener +blackening +blacker +blacketeer +blackey +blackeyes +blackface +Blackfeet +blackfellow +blackfellows +blackfin +blackfire +blackfish +blackfisher +blackfishing +Blackfoot +blackfoot +Blackfriars +blackguard +blackguardism +blackguardize +blackguardly +blackguardry +Blackhander +blackhead +blackheads +blackheart +blackhearted +blackheartedness +blackie +blacking +blackish +blackishly +blackishness +blackit +blackjack +blackland +blackleg +blackleggery +blacklegism +blacklegs +blackly +blackmail +blackmailer +blackneb +blackneck +blackness +blacknob +blackout +blackpoll +blackroot +blackseed +blackshirted +blacksmith +blacksmithing +blackstick +blackstrap +blacktail +blackthorn +blacktongue +blacktree +blackwash +blackwasher +blackwater +blackwood +blackwork +blackwort +blacky +blad +bladder +bladderet +bladderless +bladderlike +bladdernose +bladdernut +bladderpod +bladderseed +bladderweed +bladderwort +bladdery +blade +bladebone +bladed +bladelet +bladelike +blader +bladesmith +bladewise +blading +bladish +blady +bladygrass +blae +blaeberry +blaeness +blaewort +blaff +blaffert +blaflum +blah +blahlaut +blain +Blaine +Blair +blair +blairmorite +Blake +blake +blakeberyed +blamable +blamableness +blamably +blame +blamed +blameful +blamefully +blamefulness +blameless +blamelessly +blamelessness +blamer +blameworthiness +blameworthy +blaming +blamingly +blan +blanc +blanca +blancard +Blanch +blanch +blancher +blanching +blanchingly +blancmange +blancmanger +blanco +bland +blanda +Blandfordia +blandiloquence +blandiloquious +blandiloquous +blandish +blandisher +blandishing +blandishingly +blandishment +blandly +blandness +blank +blankard +blankbook +blanked +blankeel +blanket +blanketed +blanketeer +blanketflower +blanketing +blanketless +blanketmaker +blanketmaking +blanketry +blanketweed +blankety +blanking +blankish +Blankit +blankite +blankly +blankness +blanky +blanque +blanquillo +blare +Blarina +blarney +blarneyer +blarnid +blarny +blart +blas +blase +blash +blashy +Blasia +blaspheme +blasphemer +blasphemous +blasphemously +blasphemousness +blasphemy +blast +blasted +blastema +blastemal +blastematic +blastemic +blaster +blastful +blasthole +blastid +blastie +blasting +blastment +blastocarpous +blastocheme +blastochyle +blastocoele +blastocolla +blastocyst +blastocyte +blastoderm +blastodermatic +blastodermic +blastodisk +blastogenesis +blastogenetic +blastogenic +blastogeny +blastogranitic +blastoid +Blastoidea +blastoma +blastomata +blastomere +blastomeric +Blastomyces +blastomycete +Blastomycetes +blastomycetic +blastomycetous +blastomycosis +blastomycotic +blastoneuropore +Blastophaga +blastophitic +blastophoral +blastophore +blastophoric +blastophthoria +blastophthoric +blastophyllum +blastoporal +blastopore +blastoporic +blastoporphyritic +blastosphere +blastospheric +blastostylar +blastostyle +blastozooid +blastplate +blastula +blastulae +blastular +blastulation +blastule +blasty +blat +blatancy +blatant +blatantly +blate +blately +blateness +blather +blatherer +blatherskite +blathery +blatjang +Blatta +blatta +Blattariae +blatter +blatterer +blatti +blattid +Blattidae +blattiform +Blattodea +blattoid +Blattoidea +blaubok +Blaugas +blauwbok +blaver +blaw +blawort +blay +Blayne +blaze +blazer +blazing +blazingly +blazon +blazoner +blazoning +blazonment +blazonry +blazy +bleaberry +bleach +bleachability +bleachable +bleached +bleacher +bleacherite +bleacherman +bleachery +bleachfield +bleachground +bleachhouse +bleaching +bleachman +bleachworks +bleachyard +bleak +bleakish +bleakly +bleakness +bleaky +blear +bleared +blearedness +bleareye +bleariness +blearness +bleary +bleat +bleater +bleating +bleatingly +bleaty +bleb +blebby +blechnoid +Blechnum +bleck +blee +bleed +bleeder +bleeding +bleekbok +bleery +bleeze +bleezy +blellum +blemish +blemisher +blemishment +Blemmyes +blench +blencher +blenching +blenchingly +blencorn +blend +blendcorn +blende +blended +blender +blending +blendor +blendure +blendwater +blennadenitis +blennemesis +blennenteria +blennenteritis +blenniid +Blenniidae +blenniiform +Blenniiformes +blennioid +Blennioidea +blennocele +blennocystitis +blennoemesis +blennogenic +blennogenous +blennoid +blennoma +blennometritis +blennophlogisma +blennophlogosis +blennophthalmia +blennoptysis +blennorrhagia +blennorrhagic +blennorrhea +blennorrheal +blennorrhinia +blennosis +blennostasis +blennostatic +blennothorax +blennotorrhea +blennuria +blenny +blennymenitis +blent +bleo +blephara +blepharadenitis +blepharal +blepharanthracosis +blepharedema +blepharelcosis +blepharemphysema +Blephariglottis +blepharism +blepharitic +blepharitis +blepharoadenitis +blepharoadenoma +blepharoatheroma +blepharoblennorrhea +blepharocarcinoma +Blepharocera +Blepharoceridae +blepharochalasis +blepharochromidrosis +blepharoclonus +blepharocoloboma +blepharoconjunctivitis +blepharodiastasis +blepharodyschroia +blepharohematidrosis +blepharolithiasis +blepharomelasma +blepharoncosis +blepharoncus +blepharophimosis +blepharophryplasty +blepharophthalmia +blepharophyma +blepharoplast +blepharoplastic +blepharoplasty +blepharoplegia +blepharoptosis +blepharopyorrhea +blepharorrhaphy +blepharospasm +blepharospath +blepharosphincterectomy +blepharostat +blepharostenosis +blepharosymphysis +blepharosyndesmitis +blepharosynechia +blepharotomy +blepharydatis +Blephillia +blesbok +blesbuck +bless +blessed +blessedly +blessedness +blesser +blessing +blessingly +blest +blet +bletheration +Bletia +Bletilla +blewits +blibe +blick +blickey +Blighia +blight +blightbird +blighted +blighter +blighting +blightingly +blighty +blimbing +blimp +blimy +blind +blindage +blindball +blinded +blindedly +blinder +blindeyes +blindfast +blindfish +blindfold +blindfolded +blindfoldedness +blindfolder +blindfoldly +blinding +blindingly +blindish +blindless +blindling +blindly +blindness +blindstory +blindweed +blindworm +blink +blinkard +blinked +blinker +blinkered +blinking +blinkingly +blinks +blinky +blinter +blintze +blip +bliss +blissful +blissfully +blissfulness +blissless +blissom +blister +blistered +blistering +blisteringly +blisterweed +blisterwort +blistery +blite +blithe +blithebread +blitheful +blithefully +blithehearted +blithelike +blithely +blithemeat +blithen +blitheness +blither +blithering +blithesome +blithesomely +blithesomeness +blitter +Blitum +blitz +blitzbuggy +blitzkrieg +blizz +blizzard +blizzardly +blizzardous +blizzardy +blo +bloat +bloated +bloatedness +bloater +bloating +blob +blobbed +blobber +blobby +bloc +block +blockade +blockader +blockage +blockbuster +blocked +blocker +blockhead +blockheaded +blockheadedly +blockheadedness +blockheadish +blockheadishness +blockheadism +blockholer +blockhouse +blockiness +blocking +blockish +blockishly +blockishness +blocklayer +blocklike +blockmaker +blockmaking +blockman +blockpate +blockship +blocky +blodite +bloke +blolly +blomstrandine +blonde +blondeness +blondine +blood +bloodalley +bloodalp +bloodbeat +bloodberry +bloodbird +bloodcurdler +bloodcurdling +blooddrop +blooddrops +blooded +bloodfin +bloodflower +bloodguilt +bloodguiltiness +bloodguiltless +bloodguilty +bloodhound +bloodied +bloodily +bloodiness +bloodleaf +bloodless +bloodlessly +bloodlessness +bloodletter +bloodletting +bloodline +bloodmobile +bloodmonger +bloodnoun +bloodripe +bloodripeness +bloodroot +bloodshed +bloodshedder +bloodshedding +bloodshot +bloodshotten +bloodspiller +bloodspilling +bloodstain +bloodstained +bloodstainedness +bloodstanch +bloodstock +bloodstone +bloodstroke +bloodsuck +bloodsucker +bloodsucking +bloodthirst +bloodthirster +bloodthirstily +bloodthirstiness +bloodthirsting +bloodthirsty +bloodweed +bloodwite +bloodwood +bloodworm +bloodwort +bloodworthy +bloody +bloodybones +blooey +bloom +bloomage +bloomer +Bloomeria +bloomerism +bloomers +bloomery +bloomfell +blooming +bloomingly +bloomingness +bloomkin +bloomless +Bloomsburian +Bloomsbury +bloomy +bloop +blooper +blooping +blore +blosmy +blossom +blossombill +blossomed +blossomhead +blossomless +blossomry +blossomtime +blossomy +blot +blotch +blotched +blotchy +blotless +blotter +blottesque +blottesquely +blotting +blottingly +blotto +blotty +bloubiskop +blouse +bloused +blousing +blout +blow +blowback +blowball +blowcock +blowdown +blowen +blower +blowfish +blowfly +blowgun +blowhard +blowhole +blowiness +blowing +blowings +blowiron +blowlamp +blowline +blown +blowoff +blowout +blowpipe +blowpoint +blowproof +blowspray +blowth +blowtorch +blowtube +blowup +blowy +blowze +blowzed +blowzing +blowzy +blub +blubber +blubberer +blubbering +blubberingly +blubberman +blubberous +blubbery +blucher +bludgeon +bludgeoned +bludgeoneer +bludgeoner +blue +blueback +bluebead +Bluebeard +bluebeard +Bluebeardism +bluebell +bluebelled +blueberry +bluebill +bluebird +blueblaw +bluebonnet +bluebook +bluebottle +bluebreast +bluebuck +bluebush +bluebutton +bluecap +bluecoat +bluecup +bluefish +bluegill +bluegown +bluegrass +bluehearted +bluehearts +blueing +bluejack +bluejacket +bluejoint +blueleg +bluelegs +bluely +blueness +bluenose +Bluenoser +blueprint +blueprinter +bluer +blues +bluesides +bluestem +bluestocking +bluestockingish +bluestockingism +bluestone +bluestoner +bluet +bluethroat +bluetongue +bluetop +blueweed +bluewing +bluewood +bluey +bluff +bluffable +bluffer +bluffly +bluffness +bluffy +bluggy +bluing +bluish +bluishness +bluism +Blumea +blunder +blunderbuss +blunderer +blunderful +blunderhead +blunderheaded +blunderheadedness +blundering +blunderingly +blundersome +blunge +blunger +blunk +blunker +blunks +blunnen +blunt +blunter +blunthead +blunthearted +bluntie +bluntish +bluntly +bluntness +blup +blur +blurb +blurbist +blurred +blurredness +blurrer +blurry +blurt +blush +blusher +blushful +blushfully +blushfulness +blushiness +blushing +blushingly +blushless +blushwort +blushy +bluster +blusteration +blusterer +blustering +blusteringly +blusterous +blusterously +blustery +blype +bo +boa +Boaedon +boagane +Boanbura +Boanerges +boanergism +boar +boarcite +board +boardable +boarder +boarding +boardinghouse +boardlike +boardly +boardman +boardwalk +boardy +boarfish +boarhound +boarish +boarishly +boarishness +boarship +boarskin +boarspear +boarstaff +boarwood +boast +boaster +boastful +boastfully +boastfulness +boasting +boastive +boastless +boat +boatable +boatage +boatbill +boatbuilder +boatbuilding +boater +boatfalls +boatful +boathead +boatheader +boathouse +boatie +boating +boatkeeper +boatless +boatlike +boatlip +boatload +boatloader +boatloading +boatly +boatman +boatmanship +boatmaster +boatowner +boatsetter +boatshop +boatside +boatsman +boatswain +boattail +boatward +boatwise +boatwoman +boatwright +Bob +bob +boba +bobac +Bobadil +Bobadilian +Bobadilish +Bobadilism +bobbed +bobber +bobbery +Bobbie +bobbin +bobbiner +bobbinet +bobbing +Bobbinite +bobbinwork +bobbish +bobbishly +bobble +Bobby +bobby +bobcat +bobcoat +bobeche +bobfly +bobierrite +bobization +bobjerom +bobo +bobolink +bobotie +bobsled +bobsleigh +bobstay +bobtail +bobtailed +bobwhite +bobwood +bocaccio +bocal +bocardo +bocasine +bocca +boccale +boccarella +boccaro +bocce +Bocconia +boce +bocedization +Boche +bocher +Bochism +bock +bockerel +bockeret +bocking +bocoy +bod +bodach +bodacious +bodaciously +bode +bodeful +bodega +bodement +boden +bodenbenderite +boder +bodewash +bodge +bodger +bodgery +bodhi +bodhisattva +bodice +bodiced +bodicemaker +bodicemaking +bodied +bodier +bodieron +bodikin +bodiless +bodilessness +bodiliness +bodily +bodiment +boding +bodingly +bodkin +bodkinwise +bodle +Bodleian +Bodo +bodock +Bodoni +body +bodybending +bodybuilder +bodyguard +bodyhood +bodyless +bodymaker +bodymaking +bodyplate +bodywise +bodywood +bodywork +Boebera +Boedromion +Boehmenism +Boehmenist +Boehmenite +Boehmeria +boeotarch +Boeotian +Boeotic +Boer +Boerdom +Boerhavia +Boethian +Boethusian +bog +boga +bogan +bogard +bogart +bogberry +bogey +bogeyman +boggart +boggin +bogginess +boggish +boggle +bogglebo +boggler +boggy +boghole +bogie +bogieman +bogier +Bogijiab +bogland +boglander +bogle +bogledom +boglet +bogman +bogmire +Bogo +bogo +Bogomil +Bogomile +Bogomilian +bogong +Bogota +bogsucker +bogtrot +bogtrotter +bogtrotting +bogue +bogum +bogus +bogusness +bogway +bogwood +bogwort +bogy +bogydom +bogyism +bogyland +Bohairic +bohawn +bohea +Bohemia +Bohemian +Bohemianism +bohemium +bohereen +bohireen +boho +bohor +bohunk +boid +Boidae +Boii +Boiko +boil +boilable +boildown +boiled +boiler +boilerful +boilerhouse +boilerless +boilermaker +boilermaking +boilerman +boilersmith +boilerworks +boilery +boiling +boilinglike +boilingly +boilover +boily +Bois +boist +boisterous +boisterously +boisterousness +bojite +bojo +bokadam +bokard +bokark +boke +Bokhara +Bokharan +bokom +bola +Bolag +bolar +Bolboxalis +bold +bolden +Bolderian +boldhearted +boldine +boldly +boldness +boldo +Boldu +bole +bolection +bolectioned +boled +boleite +Bolelia +bolelike +bolero +Boletaceae +boletaceous +bolete +Boletus +boleweed +bolewort +bolide +bolimba +bolis +bolivar +bolivarite +bolivia +Bolivian +boliviano +bolk +boll +Bollandist +bollard +bolled +boller +bolling +bollock +bollworm +bolly +Bolo +bolo +Bologna +Bolognan +Bolognese +bolograph +bolographic +bolographically +bolography +Boloism +boloman +bolometer +bolometric +boloney +boloroot +Bolshevik +Bolsheviki +Bolshevikian +Bolshevism +Bolshevist +Bolshevistic +Bolshevistically +Bolshevize +Bolshie +bolson +bolster +bolsterer +bolsterwork +bolt +boltage +boltant +boltcutter +boltel +bolter +bolthead +boltheader +boltheading +bolthole +bolti +bolting +boltless +boltlike +boltmaker +boltmaking +Boltonia +boltonite +boltrope +boltsmith +boltstrake +boltuprightness +boltwork +bolus +Bolyaian +bom +boma +Bomarea +bomb +bombable +Bombacaceae +bombacaceous +bombard +bombarde +bombardelle +bombarder +bombardier +bombardment +bombardon +bombast +bombaster +bombastic +bombastically +bombastry +Bombax +Bombay +bombazet +bombazine +bombed +bomber +bombiccite +Bombidae +bombilate +bombilation +Bombinae +bombinate +bombination +bombo +bombola +bombonne +bombous +bombproof +bombshell +bombsight +Bombus +bombycid +Bombycidae +bombyciform +Bombycilla +Bombycillidae +Bombycina +bombycine +Bombyliidae +Bombyx +Bon +bon +bonaci +bonagh +bonaght +bonair +bonairly +bonairness +bonally +bonang +bonanza +Bonapartean +Bonapartism +Bonapartist +Bonasa +bonasus +bonaventure +Bonaveria +bonavist +Bonbo +bonbon +bonce +bond +bondage +bondager +bondar +bonded +Bondelswarts +bonder +bonderman +bondfolk +bondholder +bondholding +bonding +bondless +bondman +bondmanship +bondsman +bondstone +bondswoman +bonduc +bondwoman +bone +boneache +bonebinder +boneblack +bonebreaker +boned +bonedog +bonefish +boneflower +bonehead +boneheaded +boneless +bonelessly +bonelessness +bonelet +bonelike +Bonellia +boner +boneset +bonesetter +bonesetting +boneshaker +boneshaw +bonetail +bonewood +bonework +bonewort +Boney +bonfire +bong +Bongo +bongo +bonhomie +Boni +boniata +Boniface +bonification +boniform +bonify +boniness +boninite +bonitarian +bonitary +bonito +bonk +bonnaz +bonnet +bonneted +bonneter +bonnethead +bonnetless +bonnetlike +bonnetman +bonnibel +Bonnie +bonnily +bonniness +Bonny +bonny +bonnyclabber +bonnyish +bonnyvis +Bononian +bonsai +bonspiel +bontebok +bontebuck +bontequagga +Bontok +bonus +bonxie +bony +bonyfish +bonze +bonzer +bonzery +bonzian +boo +boob +boobery +boobily +boobook +booby +boobyalla +boobyish +boobyism +bood +boodie +boodle +boodledom +boodleism +boodleize +boodler +boody +boof +booger +boogiewoogie +boohoo +boojum +book +bookable +bookbinder +bookbindery +bookbinding +bookboard +bookcase +bookcraft +bookdealer +bookdom +booked +booker +bookery +bookfold +bookful +bookholder +bookhood +bookie +bookiness +booking +bookish +bookishly +bookishness +bookism +bookkeeper +bookkeeping +bookland +bookless +booklet +booklike +bookling +booklore +booklover +bookmaker +bookmaking +Bookman +bookman +bookmark +bookmarker +bookmate +bookmobile +bookmonger +bookplate +bookpress +bookrack +bookrest +bookroom +bookseller +booksellerish +booksellerism +bookselling +bookshelf +bookshop +bookstack +bookstall +bookstand +bookstore +bookward +bookwards +bookways +bookwise +bookwork +bookworm +bookwright +booky +bool +Boolian +booly +boolya +boom +boomable +boomage +boomah +boomboat +boomdas +boomer +boomerang +booming +boomingly +boomless +boomlet +boomorah +boomslang +boomslange +boomster +boomy +boon +boondock +boondocks +boondoggle +boondoggler +Boone +boonfellow +boongary +boonk +boonless +Boophilus +boopis +boor +boorish +boorishly +boorishness +boort +boose +boost +booster +boosterism +boosy +boot +bootblack +bootboy +booted +bootee +booter +bootery +Bootes +bootful +booth +boother +Boothian +boothite +bootholder +boothose +Bootid +bootied +bootikin +booting +bootjack +bootlace +bootleg +bootlegger +bootlegging +bootless +bootlessly +bootlessness +bootlick +bootlicker +bootmaker +bootmaking +boots +bootstrap +booty +bootyless +booze +boozed +boozer +boozily +booziness +boozy +bop +bopeep +boppist +bopyrid +Bopyridae +bopyridian +Bopyrus +bor +bora +borable +borachio +boracic +boraciferous +boracous +borage +Boraginaceae +boraginaceous +Borago +Borak +borak +boral +Boran +Borana +Borani +borasca +borasque +Borassus +borate +borax +Borboridae +Borborus +borborygmic +borborygmus +bord +bordage +bordar +bordarius +Bordeaux +bordel +bordello +border +bordered +borderer +Borderies +bordering +borderism +borderland +borderlander +borderless +borderline +bordermark +Borderside +bordroom +bordure +bordured +bore +boreable +boread +Boreades +boreal +borealis +borean +Boreas +borecole +boredom +boree +boreen +boregat +borehole +Boreiad +boreism +borele +borer +boresome +Boreus +borg +borgh +borghalpenny +Borghese +borh +boric +borickite +boride +borine +boring +boringly +boringness +Borinqueno +Boris +borish +borism +bority +borize +borlase +born +borne +Bornean +Borneo +borneol +borning +bornite +bornitic +bornyl +Boro +boro +Borocaine +borocalcite +borocarbide +borocitrate +borofluohydric +borofluoric +borofluoride +borofluorin +boroglycerate +boroglyceride +boroglycerine +borolanite +boron +boronatrocalcite +Boronia +boronic +borophenol +borophenylic +Bororo +Bororoan +borosalicylate +borosalicylic +borosilicate +borosilicic +borotungstate +borotungstic +borough +boroughlet +boroughmaster +boroughmonger +boroughmongering +boroughmongery +boroughship +borowolframic +borracha +borrel +Borrelia +Borrelomycetaceae +Borreria +Borrichia +Borromean +Borrovian +borrow +borrowable +borrower +borrowing +borsch +borscht +borsholder +borsht +borstall +bort +bortsch +borty +bortz +Boruca +Borussian +borwort +boryl +Borzicactus +borzoi +Bos +Bosc +boscage +bosch +boschbok +Boschneger +boschvark +boschveld +bose +Boselaphus +boser +bosh +Boshas +bosher +Bosjesman +bosjesman +bosk +bosker +bosket +boskiness +bosky +bosn +Bosniac +Bosniak +Bosnian +Bosnisch +bosom +bosomed +bosomer +bosomy +Bosporan +Bosporanic +Bosporian +bosporus +boss +bossage +bossdom +bossed +bosselated +bosselation +bosser +bosset +bossiness +bossing +bossism +bosslet +bossship +bossy +bostangi +bostanji +bosthoon +Boston +boston +Bostonese +Bostonian +bostonite +bostrychid +Bostrychidae +bostrychoid +bostrychoidal +bostryx +bosun +Boswellia +Boswellian +Boswelliana +Boswellism +Boswellize +bot +bota +botanic +botanical +botanically +botanist +botanize +botanizer +botanomancy +botanophile +botanophilist +botany +botargo +Botaurinae +Botaurus +botch +botched +botchedly +botcher +botcherly +botchery +botchily +botchiness +botchka +botchy +bote +Botein +botella +boterol +botfly +both +bother +botheration +botherer +botherheaded +botherment +bothersome +bothlike +Bothnian +Bothnic +bothrenchyma +Bothriocephalus +Bothriocidaris +Bothriolepis +bothrium +Bothrodendron +bothropic +Bothrops +bothros +bothsided +bothsidedness +bothway +bothy +Botocudo +botonee +botong +Botrychium +Botrydium +Botryllidae +Botryllus +botryogen +botryoid +botryoidal +botryoidally +botryolite +Botryomyces +botryomycoma +botryomycosis +botryomycotic +Botryopteriaceae +botryopterid +Botryopteris +botryose +botryotherapy +Botrytis +bott +bottekin +Botticellian +bottine +bottle +bottlebird +bottled +bottleflower +bottleful +bottlehead +bottleholder +bottlelike +bottlemaker +bottlemaking +bottleman +bottleneck +bottlenest +bottlenose +bottler +bottling +bottom +bottomchrome +bottomed +bottomer +bottoming +bottomless +bottomlessly +bottomlessness +bottommost +bottomry +bottstick +botuliform +botulin +botulinum +botulism +botulismus +bouchal +bouchaleen +boucharde +bouche +boucher +boucherism +boucherize +bouchette +boud +boudoir +bouffancy +bouffant +Bougainvillaea +Bougainvillea +Bougainvillia +Bougainvilliidae +bougar +bouge +bouget +bough +boughed +boughless +boughpot +bought +boughten +boughy +bougie +bouillabaisse +bouillon +bouk +boukit +boulangerite +Boulangism +Boulangist +boulder +boulderhead +bouldering +bouldery +boule +boulevard +boulevardize +boultel +boulter +boulterer +boun +bounce +bounceable +bounceably +bouncer +bouncing +bouncingly +bound +boundable +boundary +bounded +boundedly +boundedness +bounden +bounder +bounding +boundingly +boundless +boundlessly +boundlessness +boundly +boundness +bounteous +bounteously +bounteousness +bountied +bountiful +bountifully +bountifulness +bountith +bountree +bounty +bountyless +bouquet +bourasque +Bourbon +bourbon +Bourbonesque +Bourbonian +Bourbonism +Bourbonist +bourbonize +bourd +bourder +bourdon +bourette +bourg +bourgeois +bourgeoise +bourgeoisie +bourgeoisitic +Bourignian +Bourignianism +Bourignianist +Bourignonism +Bourignonist +bourn +bournless +bournonite +bourock +Bourout +bourse +bourtree +bouse +bouser +Boussingaultia +boussingaultite +boustrophedon +boustrophedonic +bousy +bout +boutade +Bouteloua +bouto +boutonniere +boutylka +Bouvardia +bouw +bovarism +bovarysm +bovate +bovenland +bovicide +boviculture +bovid +Bovidae +boviform +bovine +bovinely +bovinity +Bovista +bovoid +bovovaccination +bovovaccine +bow +bowable +bowback +bowbells +bowbent +bowboy +Bowdichia +bowdlerism +bowdlerization +bowdlerize +bowed +bowedness +bowel +boweled +bowelless +bowellike +bowels +bowenite +bower +bowerbird +bowerlet +bowermaiden +bowermay +bowerwoman +Bowery +bowery +Boweryish +bowet +bowfin +bowgrace +bowhead +bowie +bowieful +bowing +bowingly +bowk +bowkail +bowker +bowknot +bowl +bowla +bowleg +bowlegged +bowleggedness +bowler +bowless +bowlful +bowlike +bowline +bowling +bowllike +bowlmaker +bowls +bowly +bowmaker +bowmaking +bowman +bowpin +bowralite +bowshot +bowsprit +bowstave +bowstring +bowstringed +bowwoman +bowwood +bowwort +bowwow +bowyer +boxberry +boxboard +boxbush +boxcar +boxen +Boxer +boxer +Boxerism +boxfish +boxful +boxhaul +boxhead +boxing +boxkeeper +boxlike +boxmaker +boxmaking +boxman +boxthorn +boxty +boxwallah +boxwood +boxwork +boxy +boy +boyang +boyar +boyard +boyardism +boyardom +boyarism +Boyce +boycott +boycottage +boycotter +boycottism +Boyd +boydom +boyer +boyhood +boyish +boyishly +boyishness +boyism +boyla +boylike +boyology +boysenberry +boyship +boza +bozal +bozo +bozze +bra +brab +brabagious +brabant +Brabanter +Brabantine +brabble +brabblement +brabbler +brabblingly +Brabejum +braca +braccate +braccia +bracciale +braccianite +braccio +brace +braced +bracelet +braceleted +bracer +bracero +braces +brach +Brachelytra +brachelytrous +bracherer +brachering +brachet +brachial +brachialgia +brachialis +Brachiata +brachiate +brachiation +brachiator +brachiferous +brachigerous +Brachinus +brachiocephalic +brachiocrural +brachiocubital +brachiocyllosis +brachiofacial +brachiofaciolingual +brachioganoid +Brachioganoidei +brachiolaria +brachiolarian +brachiopod +Brachiopoda +brachiopode +brachiopodist +brachiopodous +brachioradial +brachioradialis +brachiorrhachidian +brachiorrheuma +brachiosaur +Brachiosaurus +brachiostrophosis +brachiotomy +brachistocephali +brachistocephalic +brachistocephalous +brachistocephaly +brachistochrone +brachistochronic +brachistochronous +brachium +brachtmema +brachyaxis +brachycardia +brachycatalectic +brachycephal +brachycephalic +brachycephalism +brachycephalization +brachycephalize +brachycephalous +brachycephaly +Brachycera +brachyceral +brachyceric +brachycerous +brachychronic +brachycnemic +Brachycome +brachycranial +brachydactyl +brachydactylic +brachydactylism +brachydactylous +brachydactyly +brachydiagonal +brachydodrome +brachydodromous +brachydomal +brachydomatic +brachydome +brachydont +brachydontism +brachyfacial +brachyglossal +brachygnathia +brachygnathism +brachygnathous +brachygrapher +brachygraphic +brachygraphical +brachygraphy +brachyhieric +brachylogy +brachymetropia +brachymetropic +Brachyoura +brachyphalangia +Brachyphyllum +brachypinacoid +brachypinacoidal +brachypleural +brachypnea +brachypodine +brachypodous +brachyprism +brachyprosopic +brachypterous +brachypyramid +brachyrrhinia +brachysclereid +brachyskelic +brachysm +brachystaphylic +Brachystegia +brachystochrone +Brachystomata +brachystomatous +brachystomous +brachytic +brachytypous +Brachyura +brachyural +brachyuran +brachyuranic +brachyure +brachyurous +Brachyurus +bracing +bracingly +bracingness +brack +brackebuschite +bracken +brackened +bracker +bracket +bracketing +bracketwise +brackish +brackishness +brackmard +bracky +Bracon +braconid +Braconidae +bract +bractea +bracteal +bracteate +bracted +bracteiform +bracteolate +bracteole +bracteose +bractless +bractlet +Brad +brad +bradawl +Bradbury +Bradburya +bradenhead +Bradford +Bradley +bradmaker +Bradshaw +bradsot +bradyacousia +bradycardia +bradycauma +bradycinesia +bradycrotic +bradydactylia +bradyesthesia +bradyglossia +bradykinesia +bradykinetic +bradylalia +bradylexia +bradylogia +bradynosus +bradypepsia +bradypeptic +bradyphagia +bradyphasia +bradyphemia +bradyphrasia +bradyphrenia +bradypnea +bradypnoea +bradypod +bradypode +Bradypodidae +bradypodoid +Bradypus +bradyseism +bradyseismal +bradyseismic +bradyseismical +bradyseismism +bradyspermatism +bradysphygmia +bradystalsis +bradyteleocinesia +bradyteleokinesis +bradytocia +bradytrophic +bradyuria +brae +braeface +braehead +braeman +braeside +brag +braggardism +braggart +braggartism +braggartly +braggartry +braggat +bragger +braggery +bragget +bragging +braggingly +braggish +braggishly +Bragi +bragite +bragless +braguette +Brahm +Brahma +brahmachari +Brahmahood +Brahmaic +Brahman +Brahmana +Brahmanaspati +Brahmanda +Brahmaness +Brahmanhood +Brahmani +Brahmanic +Brahmanical +Brahmanism +Brahmanist +Brahmanistic +Brahmanize +Brahmany +Brahmi +Brahmic +Brahmin +Brahminic +Brahminism +Brahmoism +Brahmsian +Brahmsite +Brahui +braid +braided +braider +braiding +Braidism +Braidist +brail +Braille +Braillist +brain +brainache +braincap +braincraft +brainer +brainfag +brainge +braininess +brainless +brainlessly +brainlessness +brainlike +brainpan +brains +brainsick +brainsickly +brainsickness +brainstone +brainward +brainwash +brainwasher +brainwashing +brainwater +brainwood +brainwork +brainworker +brainy +braird +braireau +brairo +braise +brake +brakeage +brakehand +brakehead +brakeless +brakeload +brakemaker +brakemaking +brakeman +braker +brakeroot +brakesman +brakie +braky +Bram +Bramantesque +Bramantip +bramble +brambleberry +bramblebush +brambled +brambling +brambly +brambrack +Bramia +bran +brancard +branch +branchage +branched +Branchellion +brancher +branchery +branchful +branchi +branchia +branchiae +branchial +Branchiata +branchiate +branchicolous +branchiferous +branchiform +branchihyal +branchiness +branching +Branchiobdella +branchiocardiac +branchiogenous +branchiomere +branchiomeric +branchiomerism +branchiopallial +branchiopod +Branchiopoda +branchiopodan +branchiopodous +Branchiopulmonata +branchiopulmonate +branchiosaur +Branchiosauria +branchiosaurian +Branchiosaurus +branchiostegal +Branchiostegidae +branchiostegite +branchiostegous +Branchiostoma +branchiostomid +Branchiostomidae +Branchipodidae +Branchipus +branchireme +Branchiura +branchiurous +branchless +branchlet +branchlike +branchling +branchman +branchstand +branchway +branchy +brand +branded +Brandenburg +Brandenburger +brander +brandering +Brandi +brandied +brandify +brandise +brandish +brandisher +brandisite +brandless +brandling +Brandon +brandreth +Brandy +brandy +brandyball +brandyman +brandywine +brangle +brangled +branglement +brangler +brangling +branial +brank +brankie +brankursine +branle +branner +brannerite +branny +bransle +bransolder +brant +Branta +brantail +brantness +Brasenia +brash +brashiness +brashness +brashy +brasiletto +brasque +brass +brassage +brassard +brassart +Brassavola +brassbound +brassbounder +brasse +brasser +brasset +Brassia +brassic +Brassica +Brassicaceae +brassicaceous +brassidic +brassie +brassiere +brassily +brassiness +brassish +brasslike +brassware +brasswork +brassworker +brassworks +brassy +brassylic +brat +bratling +bratstvo +brattach +brattice +bratticer +bratticing +brattie +brattish +brattishing +brattle +brauna +Brauneberger +Brauneria +braunite +Brauronia +Brauronian +Brava +bravade +bravado +bravadoism +brave +bravehearted +bravely +braveness +braver +bravery +braving +bravish +bravo +bravoite +bravura +bravuraish +braw +brawl +brawler +brawling +brawlingly +brawlsome +brawly +brawlys +brawn +brawned +brawnedness +brawner +brawnily +brawniness +brawny +braws +braxy +bray +brayer +brayera +brayerin +braystone +braza +braze +brazen +brazenface +brazenfaced +brazenfacedly +brazenly +brazenness +brazer +brazera +brazier +braziery +brazil +brazilein +brazilette +Brazilian +brazilin +brazilite +brazilwood +breach +breacher +breachful +breachy +bread +breadbasket +breadberry +breadboard +breadbox +breadearner +breadearning +breaden +breadfruit +breadless +breadlessness +breadmaker +breadmaking +breadman +breadnut +breadroot +breadseller +breadstuff +breadth +breadthen +breadthless +breadthriders +breadthways +breadthwise +breadwinner +breadwinning +breaghe +break +breakable +breakableness +breakably +breakage +breakaway +breakax +breakback +breakbones +breakdown +breaker +breakerman +breakfast +breakfaster +breakfastless +breaking +breakless +breakneck +breakoff +breakout +breakover +breakshugh +breakstone +breakthrough +breakup +breakwater +breakwind +bream +breards +breast +breastband +breastbeam +breastbone +breasted +breaster +breastfeeding +breastful +breastheight +breasthook +breastie +breasting +breastless +breastmark +breastpiece +breastpin +breastplate +breastplow +breastrail +breastrope +breastsummer +breastweed +breastwise +breastwood +breastwork +breath +breathable +breathableness +breathe +breathed +breather +breathful +breathiness +breathing +breathingly +breathless +breathlessly +breathlessness +breathseller +breathy +breba +breccia +breccial +brecciated +brecciation +brecham +Brechites +breck +brecken +bred +bredbergite +brede +bredi +bree +breech +breechblock +breechcloth +breechclout +breeched +breeches +breechesflower +breechesless +breeching +breechless +breechloader +breed +breedable +breedbate +breeder +breediness +breeding +breedy +breek +breekless +breekums +breeze +breezeful +breezeless +breezelike +breezeway +breezily +breeziness +breezy +bregma +bregmata +bregmate +bregmatic +brehon +brehonship +brei +breislakite +breithauptite +brekkle +brelaw +breloque +breme +bremely +bremeness +Bremia +bremsstrahlung +Brenda +Brendan +Brender +brennage +Brent +brent +Brenthis +brephic +Brescian +Bret +bret +bretelle +bretesse +breth +brethren +Breton +Bretonian +Bretschneideraceae +Brett +brett +brettice +Bretwalda +Bretwaldadom +Bretwaldaship +breunnerite +breva +breve +brevet +brevetcy +breviary +breviate +breviature +brevicaudate +brevicipitid +Brevicipitidae +breviconic +brevier +brevifoliate +breviger +brevilingual +breviloquence +breviloquent +breviped +brevipen +brevipennate +breviradiate +brevirostral +brevirostrate +Brevirostrines +brevit +brevity +brew +brewage +brewer +brewership +brewery +brewhouse +brewing +brewis +brewmaster +brewst +brewster +brewsterite +brey +Brian +briar +briarberry +Briard +Briarean +Briareus +briarroot +bribe +bribee +bribegiver +bribegiving +bribemonger +briber +bribery +bribetaker +bribetaking +bribeworthy +Bribri +brichen +brichette +brick +brickbat +brickcroft +brickel +bricken +brickfield +brickfielder +brickhood +bricking +brickish +brickkiln +bricklayer +bricklaying +brickle +brickleness +bricklike +brickliner +bricklining +brickly +brickmaker +brickmaking +brickmason +brickset +bricksetter +bricktimber +brickwise +brickwork +bricky +brickyard +bricole +bridal +bridale +bridaler +bridally +Bride +bride +bridebed +bridebowl +bridecake +bridechamber +bridecup +bridegod +bridegroom +bridegroomship +bridehead +bridehood +brideknot +bridelace +brideless +bridelike +bridely +bridemaid +bridemaiden +bridemaidship +brideship +bridesmaid +bridesmaiding +bridesman +bridestake +bridewain +brideweed +bridewell +bridewort +bridge +bridgeable +bridgeboard +bridgebote +bridgebuilder +bridgebuilding +bridged +bridgehead +bridgekeeper +bridgeless +bridgelike +bridgemaker +bridgemaking +bridgeman +bridgemaster +bridgepot +Bridger +bridger +Bridget +bridgetree +bridgeward +bridgewards +bridgeway +bridgework +bridging +bridle +bridled +bridleless +bridleman +bridler +bridling +bridoon +brief +briefing +briefless +brieflessly +brieflessness +briefly +briefness +briefs +brier +brierberry +briered +brierroot +brierwood +briery +brieve +brig +brigade +brigadier +brigadiership +brigalow +brigand +brigandage +brigander +brigandine +brigandish +brigandishly +brigandism +Brigantes +Brigantia +brigantine +brigatry +brigbote +brigetty +Briggs +Briggsian +Brighella +Brighid +bright +brighten +brightener +brightening +Brighteyes +brighteyes +brightish +brightly +brightness +brightsmith +brightsome +brightsomeness +brightwork +Brigid +Brigittine +brill +brilliance +brilliancy +brilliandeer +brilliant +brilliantine +brilliantly +brilliantness +brilliantwise +brilliolette +brillolette +brills +brim +brimborion +brimborium +brimful +brimfully +brimfulness +briming +brimless +brimmed +brimmer +brimming +brimmingly +brimstone +brimstonewort +brimstony +brin +brindlish +brine +brinehouse +brineless +brineman +briner +bring +bringal +bringall +bringer +brininess +brinish +brinishness +brinjal +brinjarry +brink +brinkless +briny +brioche +briolette +brique +briquette +brisk +brisken +brisket +briskish +briskly +briskness +brisling +brisque +briss +Brissotin +Brissotine +bristle +bristlebird +bristlecone +bristled +bristleless +bristlelike +bristler +bristletail +bristlewort +bristliness +bristly +Bristol +brisure +brit +Britain +Britannia +Britannian +Britannic +Britannically +britchka +brith +brither +Briticism +British +Britisher +Britishhood +Britishism +Britishly +Britishness +Briton +Britoness +britska +Brittany +britten +brittle +brittlebush +brittlely +brittleness +brittlestem +brittlewood +brittlewort +brittling +Briza +brizz +broach +broacher +broad +broadacre +broadax +broadbill +Broadbrim +broadbrim +broadcast +broadcaster +broadcloth +broaden +broadhead +broadhearted +broadhorn +broadish +broadleaf +broadloom +broadly +broadmouth +broadness +broadpiece +broadshare +broadsheet +broadside +broadspread +broadsword +broadtail +broadthroat +Broadway +broadway +Broadwayite +broadways +broadwife +broadwise +brob +Brobdingnag +Brobdingnagian +brocade +brocaded +brocard +brocardic +brocatel +brocatello +broccoli +broch +brochan +brochant +brochantite +broche +brochette +brochidodromous +brocho +brochure +brock +brockage +brocked +brocket +brockle +brod +brodder +brodeglass +brodequin +broderer +Brodiaea +Brodie +brog +brogan +brogger +broggerite +broggle +brogue +brogueful +brogueneer +broguer +broguery +broguish +broider +broiderer +broideress +broidery +broigne +broil +broiler +broiling +broilingly +brokage +broke +broken +brokenhearted +brokenheartedly +brokenheartedness +brokenly +brokenness +broker +brokerage +brokeress +brokership +broking +brolga +broll +brolly +broma +bromacetanilide +bromacetate +bromacetic +bromacetone +bromal +bromalbumin +bromamide +bromargyrite +bromate +bromaurate +bromauric +brombenzamide +brombenzene +brombenzyl +bromcamphor +bromcresol +brome +bromeigon +Bromeikon +bromeikon +Bromelia +Bromeliaceae +bromeliaceous +bromeliad +bromelin +bromellite +bromethyl +bromethylene +bromgelatin +bromhidrosis +bromhydrate +bromhydric +Bromian +bromic +bromide +bromidic +bromidically +bromidrosis +brominate +bromination +bromindigo +bromine +brominism +brominize +bromiodide +Bromios +bromism +bromite +Bromius +bromization +bromize +bromizer +bromlite +bromoacetone +bromoaurate +bromoauric +bromobenzene +bromobenzyl +bromocamphor +bromochlorophenol +bromocresol +bromocyanidation +bromocyanide +bromocyanogen +bromoethylene +bromoform +bromogelatin +bromohydrate +bromohydrin +bromoil +bromoiodide +bromoiodism +bromoiodized +bromoketone +bromol +bromomania +bromomenorrhea +bromomethane +bromometric +bromometrical +bromometrically +bromometry +bromonaphthalene +bromophenol +bromopicrin +bromopnea +bromoprotein +bromothymol +bromous +bromphenol +brompicrin +bromthymol +bromuret +Bromus +bromvogel +bromyrite +bronc +bronchadenitis +bronchi +bronchia +bronchial +bronchially +bronchiarctia +bronchiectasis +bronchiectatic +bronchiloquy +bronchiocele +bronchiocrisis +bronchiogenic +bronchiolar +bronchiole +bronchioli +bronchiolitis +bronchiolus +bronchiospasm +bronchiostenosis +bronchitic +bronchitis +bronchium +bronchoadenitis +bronchoalveolar +bronchoaspergillosis +bronchoblennorrhea +bronchocavernous +bronchocele +bronchocephalitis +bronchoconstriction +bronchoconstrictor +bronchodilatation +bronchodilator +bronchoegophony +bronchoesophagoscopy +bronchogenic +bronchohemorrhagia +broncholemmitis +broncholith +broncholithiasis +bronchomotor +bronchomucormycosis +bronchomycosis +bronchopathy +bronchophonic +bronchophony +bronchophthisis +bronchoplasty +bronchoplegia +bronchopleurisy +bronchopneumonia +bronchopneumonic +bronchopulmonary +bronchorrhagia +bronchorrhaphy +bronchorrhea +bronchoscope +bronchoscopic +bronchoscopist +bronchoscopy +bronchospasm +bronchostenosis +bronchostomy +bronchotetany +bronchotome +bronchotomist +bronchotomy +bronchotracheal +bronchotyphoid +bronchotyphus +bronchovesicular +bronchus +bronco +broncobuster +brongniardite +bronk +Bronteana +bronteon +brontephobia +Brontesque +bronteum +brontide +brontogram +brontograph +brontolite +brontology +brontometer +brontophobia +Brontops +Brontosaurus +brontoscopy +Brontotherium +Brontozoum +Bronx +bronze +bronzed +bronzelike +bronzen +bronzer +bronzesmith +bronzewing +bronzify +bronzine +bronzing +bronzite +bronzitite +bronzy +broo +brooch +brood +brooder +broodiness +brooding +broodingly +broodless +broodlet +broodling +broody +brook +brookable +Brooke +brooked +brookflower +brookie +brookite +brookless +brooklet +brooklike +brooklime +Brooklynite +brookside +brookweed +brooky +brool +broom +broombush +broomcorn +broomer +broommaker +broommaking +broomrape +broomroot +broomshank +broomstaff +broomstick +broomstraw +broomtail +broomweed +broomwood +broomwort +broomy +broon +broose +broozled +brose +Brosimum +brosot +brosy +brot +brotan +brotany +broth +brothel +brotheler +brothellike +brothelry +brother +brotherhood +brotherless +brotherlike +brotherliness +brotherly +brothership +Brotherton +brotherwort +brothy +brotocrystal +Brotula +brotulid +Brotulidae +brotuliform +brough +brougham +brought +Broussonetia +brow +browache +Browallia +browallia +browband +browbeat +browbeater +browbound +browden +browed +browis +browless +browman +brown +brownback +browner +Brownian +brownie +browniness +browning +Browningesque +brownish +Brownism +Brownist +Brownistic +Brownistical +brownly +brownness +brownout +brownstone +browntail +browntop +brownweed +brownwort +browny +browpiece +browpost +browse +browser +browsick +browsing +browst +bruang +Bruce +Brucella +brucellosis +Bruchidae +Bruchus +brucia +brucina +brucine +brucite +bruckle +bruckled +bruckleness +Bructeri +brugh +brugnatellite +bruin +bruise +bruiser +bruisewort +bruising +bruit +bruiter +bruke +Brule +brulee +brulyie +brulyiement +brumal +Brumalia +brumby +brume +Brummagem +brummagem +brumous +brumstane +brumstone +brunch +Brunella +Brunellia +Brunelliaceae +brunelliaceous +brunet +brunetness +brunette +brunetteness +Brunfelsia +brunissure +Brunistic +brunneous +Brunnichia +Bruno +Brunonia +Brunoniaceae +Brunonian +Brunonism +Brunswick +brunswick +brunt +bruscus +brush +brushable +brushball +brushbird +brushbush +brushed +brusher +brushes +brushet +brushful +brushiness +brushing +brushite +brushland +brushless +brushlessness +brushlet +brushlike +brushmaker +brushmaking +brushman +brushoff +brushproof +brushwood +brushwork +brushy +brusque +brusquely +brusqueness +Brussels +brustle +brut +Bruta +brutage +brutal +brutalism +brutalist +brutalitarian +brutality +brutalization +brutalize +brutally +brute +brutedom +brutelike +brutely +bruteness +brutification +brutify +bruting +brutish +brutishly +brutishness +brutism +brutter +Brutus +bruzz +Bryaceae +bryaceous +Bryales +Bryan +Bryanism +Bryanite +Bryanthus +Bryce +bryogenin +bryological +bryologist +bryology +Bryonia +bryonidin +bryonin +bryony +Bryophyllum +Bryophyta +bryophyte +bryophytic +Bryozoa +bryozoan +bryozoon +bryozoum +Brython +Brythonic +Bryum +Bu +bu +bual +buaze +bub +buba +bubal +bubaline +Bubalis +bubalis +Bubastid +Bubastite +bubble +bubbleless +bubblement +bubbler +bubbling +bubblingly +bubblish +bubbly +bubby +bubbybush +Bube +bubinga +Bubo +bubo +buboed +bubonalgia +bubonic +Bubonidae +bubonocele +bubukle +bucare +bucca +buccal +buccally +buccan +buccaneer +buccaneerish +buccate +Buccellarius +buccina +buccinal +buccinator +buccinatory +Buccinidae +bucciniform +buccinoid +Buccinum +Bucco +buccobranchial +buccocervical +buccogingival +buccolabial +buccolingual +bucconasal +Bucconidae +Bucconinae +buccopharyngeal +buccula +Bucculatrix +bucentaur +Bucephala +Bucephalus +Buceros +Bucerotes +Bucerotidae +Bucerotinae +Buchanan +Buchanite +buchite +Buchloe +Buchmanism +Buchmanite +Buchnera +buchnerite +buchonite +buchu +buck +buckaroo +buckberry +buckboard +buckbrush +buckbush +bucked +buckeen +bucker +bucket +bucketer +bucketful +bucketing +bucketmaker +bucketmaking +bucketman +buckety +buckeye +buckhorn +buckhound +buckie +bucking +buckish +buckishly +buckishness +buckjump +buckjumper +bucklandite +buckle +buckled +buckleless +buckler +Buckleya +buckling +bucklum +bucko +buckplate +buckpot +buckra +buckram +bucksaw +buckshee +buckshot +buckskin +buckskinned +buckstall +buckstay +buckstone +bucktail +buckthorn +bucktooth +buckwagon +buckwash +buckwasher +buckwashing +buckwheat +buckwheater +buckwheatlike +Bucky +bucky +bucoliast +bucolic +bucolical +bucolically +bucolicism +Bucorvinae +Bucorvus +bucrane +bucranium +Bud +bud +buda +buddage +budder +Buddh +Buddha +Buddhahood +Buddhaship +buddhi +Buddhic +Buddhism +Buddhist +Buddhistic +Buddhistical +Buddhology +budding +buddle +Buddleia +buddleman +buddler +buddy +budge +budger +budgeree +budgereegah +budgerigar +budgerow +budget +budgetary +budgeteer +budgeter +budgetful +Budh +budless +budlet +budlike +budmash +Budorcas +budtime +Budukha +Buduma +budwood +budworm +budzat +Buettneria +Buettneriaceae +bufagin +buff +buffable +buffalo +buffaloback +buffball +buffcoat +buffed +buffer +buffet +buffeter +buffing +buffle +bufflehead +bufflehorn +buffont +buffoon +buffoonery +buffoonesque +buffoonish +buffoonism +buffware +buffy +bufidin +bufo +Bufonidae +bufonite +bufotalin +bug +bugaboo +bugan +bugbane +bugbear +bugbeardom +bugbearish +bugbite +bugdom +bugfish +bugger +buggery +bugginess +buggy +buggyman +bughead +bughouse +Bugi +Buginese +Buginvillaea +bugle +bugled +bugler +buglet +bugleweed +buglewort +bugloss +bugologist +bugology +bugproof +bugre +bugseed +bugweed +bugwort +buhl +buhr +buhrstone +build +buildable +builder +building +buildingless +buildress +buildup +built +buirdly +buisson +buist +Bukat +Bukeyef +bukh +Bukidnon +bukshi +bulak +Bulanda +bulb +bulbaceous +bulbar +bulbed +bulbiferous +bulbiform +bulbil +Bulbilis +bulbilla +bulbless +bulblet +bulblike +bulbocapnin +bulbocapnine +bulbocavernosus +bulbocavernous +Bulbochaete +Bulbocodium +bulbomedullary +bulbomembranous +bulbonuclear +Bulbophyllum +bulborectal +bulbose +bulbospinal +bulbotuber +bulbous +bulbul +bulbule +bulby +bulchin +Bulgar +Bulgari +Bulgarian +Bulgaric +Bulgarophil +bulge +bulger +bulginess +bulgy +bulimia +bulimiac +bulimic +bulimiform +bulimoid +Bulimulidae +Bulimus +bulimy +bulk +bulked +bulker +bulkhead +bulkheaded +bulkily +bulkiness +bulkish +bulky +bull +bulla +bullace +bullamacow +bullan +bullary +bullate +bullated +bullation +bullback +bullbaiting +bullbat +bullbeggar +bullberry +bullbird +bullboat +bullcart +bullcomber +bulldog +bulldogged +bulldoggedness +bulldoggy +bulldogism +bulldoze +bulldozer +buller +bullet +bulleted +bullethead +bulletheaded +bulletheadedness +bulletin +bulletless +bulletlike +bulletmaker +bulletmaking +bulletproof +bulletwood +bullety +bullfeast +bullfight +bullfighter +bullfighting +bullfinch +bullfist +bullflower +bullfoot +bullfrog +bullhead +bullheaded +bullheadedly +bullheadedness +bullhide +bullhoof +bullhorn +Bullidae +bulliform +bullimong +bulling +bullion +bullionism +bullionist +bullionless +bullish +bullishly +bullishness +bullism +bullit +bullneck +bullnose +bullnut +bullock +bullocker +Bullockite +bullockman +bullocky +Bullom +bullous +bullpates +bullpoll +bullpout +bullskin +bullsticker +bullsucker +bullswool +bulltoad +bullule +bullweed +bullwhack +bullwhacker +bullwhip +bullwort +bully +bullyable +bullydom +bullyhuff +bullying +bullyism +bullyrag +bullyragger +bullyragging +bullyrook +bulrush +bulrushlike +bulrushy +bulse +bult +bulter +bultey +bultong +bultow +bulwand +bulwark +bum +bumbailiff +bumbailiffship +bumbarge +bumbaste +bumbaze +bumbee +bumbershoot +bumble +bumblebee +bumbleberry +Bumbledom +bumblefoot +bumblekite +bumblepuppy +bumbler +bumbo +bumboat +bumboatman +bumboatwoman +bumclock +Bumelia +bumicky +bummalo +bummaree +bummed +bummer +bummerish +bummie +bumming +bummler +bummock +bump +bumpee +bumper +bumperette +bumpily +bumpiness +bumping +bumpingly +bumpkin +bumpkinet +bumpkinish +bumpkinly +bumpology +bumptious +bumptiously +bumptiousness +bumpy +bumtrap +bumwood +bun +Buna +buna +buncal +bunce +bunch +bunchberry +buncher +bunchflower +bunchily +bunchiness +bunchy +buncombe +bund +Bunda +Bundahish +Bundeli +bunder +Bundestag +bundle +bundler +bundlerooted +bundlet +bundobust +bundook +Bundu +bundweed +bundy +bunemost +bung +Bunga +bungaloid +bungalow +bungarum +Bungarus +bungee +bungerly +bungey +bungfu +bungfull +bunghole +bungle +bungler +bunglesome +bungling +bunglingly +bungmaker +bungo +bungwall +bungy +Buninahua +bunion +bunk +bunker +bunkerman +bunkery +bunkhouse +bunkie +bunkload +bunko +bunkum +bunnell +bunny +bunnymouth +bunodont +Bunodonta +bunolophodont +Bunomastodontidae +bunoselenodont +bunsenite +bunt +buntal +bunted +Bunter +bunter +bunting +buntline +bunton +bunty +bunya +bunyah +bunyip +Bunyoro +buoy +buoyage +buoyance +buoyancy +buoyant +buoyantly +buoyantness +Buphaga +buphthalmia +buphthalmic +Buphthalmum +bupleurol +Bupleurum +buplever +buprestid +Buprestidae +buprestidan +Buprestis +bur +buran +burao +Burbank +burbank +burbankian +Burbankism +burbark +Burberry +burble +burbler +burbly +burbot +burbush +burd +burdalone +burden +burdener +burdenless +burdenous +burdensome +burdensomely +burdensomeness +burdie +Burdigalian +burdock +burdon +bure +bureau +bureaucracy +bureaucrat +bureaucratic +bureaucratical +bureaucratically +bureaucratism +bureaucratist +bureaucratization +bureaucratize +bureaux +burel +burele +buret +burette +burfish +burg +burgage +burgality +burgall +burgee +burgensic +burgeon +burgess +burgessdom +burggrave +burgh +burghal +burghalpenny +burghbote +burghemot +burgher +burgherage +burgherdom +burgheress +burgherhood +burghermaster +burghership +burghmaster +burghmoot +burglar +burglarious +burglariously +burglarize +burglarproof +burglary +burgle +burgomaster +burgomastership +burgonet +burgoo +burgoyne +burgrave +burgraviate +burgul +Burgundian +Burgundy +burgus +burgware +burhead +Burhinidae +Burhinus +Buri +buri +burial +burian +Buriat +buried +burier +burin +burinist +burion +buriti +burka +burke +burker +burkundaz +burl +burlap +burled +burler +burlesque +burlesquely +burlesquer +burlet +burletta +Burley +burlily +burliness +Burlington +burly +Burman +Burmannia +Burmanniaceae +burmanniaceous +Burmese +burmite +burn +burnable +burnbeat +burned +burner +burnet +burnetize +burnfire +burnie +burniebee +burning +burningly +burnish +burnishable +burnisher +burnishing +burnishment +burnoose +burnoosed +burnous +burnout +burnover +Burnsian +burnside +burnsides +burnt +burntweed +burnut +burnwood +burny +buro +burp +burr +burrah +burrawang +burred +burrel +burrer +burrgrailer +burring +burrish +burrito +burrknot +burro +burrobrush +burrow +burroweed +burrower +burrowstown +burry +bursa +bursal +bursar +bursarial +bursarship +bursary +bursate +bursattee +bursautee +burse +burseed +Bursera +Burseraceae +Burseraceous +bursicle +bursiculate +bursiform +bursitis +burst +burster +burstwort +burt +burthenman +burton +burtonization +burtonize +burucha +Burushaski +Burut +burweed +bury +burying +bus +Busaos +busby +buscarl +buscarle +bush +bushbeater +bushbuck +bushcraft +bushed +bushel +busheler +bushelful +bushelman +bushelwoman +busher +bushfighter +bushfighting +bushful +bushhammer +bushi +bushily +bushiness +bushing +bushland +bushless +bushlet +bushlike +bushmaker +bushmaking +Bushman +bushmanship +bushmaster +bushment +Bushongo +bushranger +bushranging +bushrope +bushveld +bushwa +bushwhack +bushwhacker +bushwhacking +bushwife +bushwoman +bushwood +bushy +busied +busily +busine +business +businesslike +businesslikeness +businessman +businesswoman +busk +busked +busker +busket +buskin +buskined +buskle +busky +busman +buss +busser +bussock +bussu +bust +bustard +busted +bustee +buster +busthead +bustic +busticate +bustle +bustled +bustler +bustling +bustlingly +busy +busybodied +busybody +busybodyish +busybodyism +busybodyness +Busycon +busyhead +busying +busyish +busyness +busywork +but +butadiene +butadiyne +butanal +butane +butanoic +butanol +butanolid +butanolide +butanone +butch +butcher +butcherbird +butcherdom +butcherer +butcheress +butchering +butcherless +butcherliness +butcherly +butcherous +butchery +Bute +Butea +butein +butene +butenyl +Buteo +buteonine +butic +butine +Butler +butler +butlerage +butlerdom +butleress +butlerism +butlerlike +butlership +butlery +butment +Butomaceae +butomaceous +Butomus +butoxy +butoxyl +Butsu +butt +butte +butter +butteraceous +butterback +butterball +butterbill +butterbird +butterbox +butterbump +butterbur +butterbush +buttercup +buttered +butterfat +butterfingered +butterfingers +butterfish +butterflower +butterfly +butterflylike +butterhead +butterine +butteriness +butteris +butterjags +butterless +butterlike +buttermaker +buttermaking +butterman +buttermilk +buttermonger +buttermouth +butternose +butternut +butterroot +butterscotch +butterweed +butterwife +butterwoman +butterworker +butterwort +butterwright +buttery +butteryfingered +buttgenbachite +butting +buttinsky +buttle +buttock +buttocked +buttocker +button +buttonball +buttonbur +buttonbush +buttoned +buttoner +buttonhold +buttonholder +buttonhole +buttonholer +buttonhook +buttonless +buttonlike +buttonmold +buttons +buttonweed +buttonwood +buttony +buttress +buttressless +buttresslike +buttstock +buttwoman +buttwood +butty +buttyman +butyl +butylamine +butylation +butylene +butylic +Butyn +butyne +butyr +butyraceous +butyral +butyraldehyde +butyrate +butyric +butyrically +butyrin +butyrinase +butyrochloral +butyrolactone +butyrometer +butyrometric +butyrone +butyrous +butyrousness +butyryl +Buxaceae +buxaceous +Buxbaumia +Buxbaumiaceae +buxerry +buxom +buxomly +buxomness +Buxus +buy +buyable +buyer +Buyides +buzane +buzylene +buzz +buzzard +buzzardlike +buzzardly +buzzer +buzzerphone +buzzgloak +buzzies +buzzing +buzzingly +buzzle +buzzwig +buzzy +by +Byblidaceae +Byblis +bycoket +bye +byee +byegaein +byeman +byepath +byerite +byerlite +byestreet +byeworker +byeworkman +bygane +byganging +bygo +bygoing +bygone +byhand +bylaw +bylawman +byname +bynedestin +Bynin +byon +byordinar +byordinary +byous +byously +bypass +bypasser +bypast +bypath +byplay +byre +byreman +byrewards +byrewoman +byrlaw +byrlawman +byrnie +byroad +Byron +Byronesque +Byronian +Byroniana +Byronic +Byronically +Byronics +Byronish +Byronism +Byronist +Byronite +Byronize +byrrus +Byrsonima +byrthynsak +Bysacki +bysen +bysmalith +byspell +byssaceous +byssal +byssiferous +byssin +byssine +byssinosis +byssogenous +byssoid +byssolite +byssus +bystander +bystreet +byth +bytime +bytownite +bytownitite +bywalk +bywalker +byway +bywoner +byword +bywork +Byzantian +Byzantine +Byzantinesque +Byzantinism +Byzantinize +C +c +ca +caam +caama +caaming +caapeba +caatinga +cab +caba +cabaan +caback +cabaho +cabal +cabala +cabalassou +cabaletta +cabalic +cabalism +cabalist +cabalistic +cabalistical +cabalistically +caballer +caballine +caban +cabana +cabaret +cabas +cabasset +cabassou +cabbage +cabbagehead +cabbagewood +cabbagy +cabber +cabble +cabbler +cabby +cabda +cabdriver +cabdriving +cabellerote +caber +cabernet +cabestro +cabezon +cabilliau +cabin +Cabinda +cabinet +cabinetmaker +cabinetmaking +cabinetry +cabinetwork +cabinetworker +cabinetworking +cabio +Cabirean +Cabiri +Cabiria +Cabirian +Cabiric +Cabiritic +cable +cabled +cablegram +cableless +cablelike +cableman +cabler +cablet +cableway +cabling +cabman +cabob +caboceer +cabochon +cabocle +Cabomba +Cabombaceae +caboodle +cabook +caboose +caboshed +cabot +cabotage +cabree +cabrerite +cabreuva +cabrilla +cabriole +cabriolet +cabrit +cabstand +cabureiba +cabuya +Caca +Cacajao +Cacalia +cacam +Cacan +Cacana +cacanthrax +cacao +Cacara +Cacatua +Cacatuidae +Cacatuinae +Caccabis +cacesthesia +cacesthesis +cachalot +cachaza +cache +cachectic +cachemia +cachemic +cachet +cachexia +cachexic +cachexy +cachibou +cachinnate +cachinnation +cachinnator +cachinnatory +cacholong +cachou +cachrys +cachucha +cachunde +Cacicus +cacidrosis +caciocavallo +cacique +caciqueship +caciquism +cack +cackerel +cackle +cackler +cacocholia +cacochroia +cacochylia +cacochymia +cacochymic +cacochymical +cacochymy +cacocnemia +cacodaemoniac +cacodaemonial +cacodaemonic +cacodemon +cacodemonia +cacodemoniac +cacodemonial +cacodemonic +cacodemonize +cacodemonomania +cacodontia +cacodorous +cacodoxian +cacodoxical +cacodoxy +cacodyl +cacodylate +cacodylic +cacoeconomy +cacoepist +cacoepistic +cacoepy +cacoethes +cacoethic +cacogalactia +cacogastric +cacogenesis +cacogenic +cacogenics +cacogeusia +cacoglossia +cacographer +cacographic +cacographical +cacography +cacology +cacomagician +cacomelia +cacomistle +cacomixl +cacomixle +cacomorphia +cacomorphosis +caconychia +caconym +caconymic +cacoon +cacopathy +cacopharyngia +cacophonia +cacophonic +cacophonical +cacophonically +cacophonist +cacophonize +cacophonous +cacophonously +cacophony +cacophthalmia +cacoplasia +cacoplastic +cacoproctia +cacorhythmic +cacorrhachis +cacorrhinia +cacosmia +cacospermia +cacosplanchnia +cacostomia +cacothansia +cacotheline +cacothesis +cacothymia +cacotrichia +cacotrophia +cacotrophic +cacotrophy +cacotype +cacoxene +cacoxenite +cacozeal +cacozealous +cacozyme +Cactaceae +cactaceous +Cactales +cacti +cactiform +cactoid +Cactus +cacuminal +cacuminate +cacumination +cacuminous +cacur +cad +cadalene +cadamba +cadastral +cadastration +cadastre +cadaver +cadaveric +cadaverine +cadaverize +cadaverous +cadaverously +cadaverousness +cadbait +cadbit +cadbote +caddice +caddiced +Caddie +caddie +caddis +caddised +caddish +caddishly +caddishness +caddle +Caddo +Caddoan +caddow +caddy +cade +cadelle +cadence +cadenced +cadency +cadent +cadential +cadenza +cader +caderas +Cadet +cadet +cadetcy +cadetship +cadette +cadew +cadge +cadger +cadgily +cadginess +cadgy +cadi +cadilesker +cadinene +cadism +cadiueio +cadjan +cadlock +Cadmean +cadmia +cadmic +cadmide +cadmiferous +cadmium +cadmiumize +Cadmopone +Cadmus +cados +cadrans +cadre +cadua +caduac +caduca +caducary +caducean +caduceus +caduciary +caducibranch +Caducibranchiata +caducibranchiate +caducicorn +caducity +caducous +cadus +Cadwal +Cadwallader +cadweed +caeca +caecal +caecally +caecectomy +caeciform +Caecilia +Caeciliae +caecilian +Caeciliidae +caecitis +caecocolic +caecostomy +caecotomy +caecum +Caedmonian +Caedmonic +Caelian +caelometer +Caelum +Caelus +Caenogaea +Caenogaean +Caenolestes +caenostylic +caenostyly +caeoma +caeremoniarius +Caerphilly +Caesalpinia +Caesalpiniaceae +caesalpiniaceous +Caesar +Caesardom +Caesarean +Caesareanize +Caesarian +Caesarism +Caesarist +Caesarize +caesaropapacy +caesaropapism +caesaropopism +Caesarotomy +Caesarship +caesious +caesura +caesural +caesuric +cafeneh +cafenet +cafeteria +caffa +caffeate +caffeic +caffeina +caffeine +caffeinic +caffeinism +caffeism +caffeol +caffeone +caffetannic +caffetannin +caffiso +caffle +caffoline +caffoy +cafh +cafiz +caftan +caftaned +cag +Cagayan +cage +caged +cageful +cageless +cagelike +cageling +cageman +cager +cagester +cagework +cagey +caggy +cagily +cagit +cagmag +Cagn +Cahenslyism +Cahill +cahincic +Cahita +cahiz +Cahnite +Cahokia +cahoot +cahot +cahow +Cahuapana +Cahuilla +caickle +caid +cailcedra +cailleach +caimacam +caimakam +caiman +caimitillo +caimito +Cain +cain +Caingang +Caingua +Cainian +Cainish +Cainism +Cainite +Cainitic +caique +caiquejee +Cairba +caird +Cairene +cairn +cairned +cairngorm +cairngorum +cairny +Cairo +caisson +caissoned +Caitanyas +Caite +caitiff +Cajan +Cajanus +cajeput +cajole +cajolement +cajoler +cajolery +cajoling +cajolingly +cajuela +Cajun +cajun +cajuput +cajuputene +cajuputol +Cakavci +Cakchikel +cake +cakebox +cakebread +cakehouse +cakemaker +cakemaking +caker +cakette +cakewalk +cakewalker +cakey +Cakile +caky +cal +calaba +Calabar +Calabari +calabash +calabaza +calabazilla +calaber +calaboose +calabrasella +Calabrese +calabrese +Calabrian +calade +Caladium +calais +calalu +Calamagrostis +calamanco +calamansi +Calamariaceae +calamariaceous +Calamariales +calamarian +calamarioid +calamaroid +calamary +calambac +calambour +calamiferous +calamiform +calaminary +calamine +calamint +Calamintha +calamistral +calamistrum +calamite +calamitean +Calamites +calamitoid +calamitous +calamitously +calamitousness +calamity +Calamodendron +calamondin +Calamopitys +Calamospermae +Calamostachys +calamus +calander +Calandra +calandria +Calandridae +Calandrinae +Calandrinia +calangay +calantas +Calanthe +calapite +Calappa +Calappidae +Calas +calascione +calash +Calathea +calathian +calathidium +calathiform +calathiscus +calathus +Calatrava +calaverite +calbroben +calcaneal +calcaneoastragalar +calcaneoastragaloid +calcaneocuboid +calcaneofibular +calcaneonavicular +calcaneoplantar +calcaneoscaphoid +calcaneotibial +calcaneum +calcaneus +calcar +calcarate +Calcarea +calcareoargillaceous +calcareobituminous +calcareocorneous +calcareosiliceous +calcareosulphurous +calcareous +calcareously +calcareousness +calcariferous +calcariform +calcarine +calced +calceiform +calcemia +Calceolaria +calceolate +Calchaqui +Calchaquian +calcic +calciclase +calcicole +calcicolous +calcicosis +calciferol +Calciferous +calciferous +calcific +calcification +calcified +calciform +calcifugal +calcifuge +calcifugous +calcify +calcigenous +calcigerous +calcimeter +calcimine +calciminer +calcinable +calcination +calcinatory +calcine +calcined +calciner +calcinize +calciobiotite +calciocarnotite +calcioferrite +calcioscheelite +calciovolborthite +calcipexy +calciphile +calciphilia +calciphilous +calciphobe +calciphobous +calciphyre +calciprivic +calcisponge +Calcispongiae +calcite +calcitestaceous +calcitic +calcitrant +calcitrate +calcitreation +calcium +calcivorous +calcographer +calcographic +calcography +calcrete +calculability +calculable +Calculagraph +calculary +calculate +calculated +calculatedly +calculating +calculatingly +calculation +calculational +calculative +calculator +calculatory +calculi +calculiform +calculist +calculous +calculus +Calcydon +calden +caldron +calean +Caleb +Caledonia +Caledonian +caledonite +calefacient +calefaction +calefactive +calefactor +calefactory +calelectric +calelectrical +calelectricity +Calemes +calendal +calendar +calendarer +calendarial +calendarian +calendaric +calender +calenderer +calendric +calendrical +calendry +calends +Calendula +calendulin +calentural +calenture +calenturist +calepin +calescence +calescent +calf +calfbound +calfhood +calfish +calfkill +calfless +calflike +calfling +calfskin +Caliban +Calibanism +caliber +calibered +calibogus +calibrate +calibration +calibrator +calibre +Caliburn +Caliburno +calicate +calices +caliciform +calicle +calico +calicoback +calicoed +calicular +caliculate +Calicut +calid +calidity +caliduct +California +Californian +californite +californium +caliga +caligated +caliginous +caliginously +caligo +Calimeris +Calinago +calinda +calinut +caliological +caliologist +caliology +calipash +calipee +caliper +caliperer +calipers +caliph +caliphal +caliphate +caliphship +Calista +calistheneum +calisthenic +calisthenical +calisthenics +Calite +caliver +calix +Calixtin +Calixtus +calk +calkage +calker +calkin +calking +call +Calla +callable +callainite +callant +callboy +caller +callet +calli +Callianassa +Callianassidae +Calliandra +Callicarpa +Callicebus +callid +callidity +callidness +calligraph +calligrapha +calligrapher +calligraphic +calligraphical +calligraphically +calligraphist +calligraphy +calling +Callionymidae +Callionymus +Calliope +calliophone +Calliopsis +calliper +calliperer +Calliphora +calliphorid +Calliphoridae +calliphorine +callipygian +callipygous +Callirrhoe +Callisaurus +callisection +callisteia +Callistemon +Callistephus +Callithrix +callithump +callithumpian +Callitrichaceae +callitrichaceous +Callitriche +Callitrichidae +Callitris +callitype +callo +Callorhynchidae +Callorhynchus +callosal +callose +callosity +callosomarginal +callosum +callous +callously +callousness +Callovian +callow +callower +callowman +callowness +Calluna +callus +Callynteria +calm +calmant +calmative +calmer +calmierer +calmingly +calmly +calmness +calmy +Calocarpum +Calochortaceae +Calochortus +calodemon +calography +calomba +calomel +calomorphic +Calonectria +Calonyction +calool +Calophyllum +Calopogon +calor +calorescence +calorescent +caloric +caloricity +calorie +calorifacient +calorific +calorifical +calorifically +calorification +calorifics +calorifier +calorify +calorigenic +calorimeter +calorimetric +calorimetrical +calorimetrically +calorimetry +calorimotor +caloris +calorisator +calorist +Calorite +calorize +calorizer +Calosoma +Calotermes +calotermitid +Calotermitidae +Calothrix +calotte +calotype +calotypic +calotypist +caloyer +calp +calpac +calpack +calpacked +calpulli +Caltha +caltrap +caltrop +calumba +calumet +calumniate +calumniation +calumniative +calumniator +calumniatory +calumnious +calumniously +calumniousness +calumny +Calusa +calutron +Calvados +calvaria +calvarium +Calvary +Calvatia +calve +calved +calver +calves +Calvin +Calvinian +Calvinism +Calvinist +Calvinistic +Calvinistical +Calvinistically +Calvinize +calvish +calvities +calvity +calvous +calx +calycanth +Calycanthaceae +calycanthaceous +calycanthemous +calycanthemy +calycanthine +Calycanthus +calycate +Calyceraceae +calyceraceous +calyces +calyciferous +calycifloral +calyciflorate +calyciflorous +calyciform +calycinal +calycine +calycle +calycled +Calycocarpum +calycoid +calycoideous +Calycophora +Calycophorae +calycophoran +Calycozoa +calycozoan +calycozoic +calycozoon +calycular +calyculate +calyculated +calycule +calyculus +Calydon +Calydonian +Calymene +calymma +calyphyomy +calypsist +Calypso +calypso +calypsonian +calypter +Calypterae +Calyptoblastea +calyptoblastic +Calyptorhynchus +calyptra +Calyptraea +Calyptranthes +Calyptrata +Calyptratae +calyptrate +calyptriform +calyptrimorphous +calyptro +calyptrogen +Calyptrogyne +Calystegia +calyx +cam +camaca +Camacan +camagon +camail +camailed +Camaldolensian +Camaldolese +Camaldolesian +Camaldolite +Camaldule +Camaldulian +camalote +caman +camansi +camara +camaraderie +Camarasaurus +camarilla +camass +Camassia +camata +camatina +Camaxtli +camb +Camball +Cambalo +Cambarus +cambaye +camber +Cambeva +cambial +cambiform +cambiogenetic +cambism +cambist +cambistry +cambium +Cambodian +cambogia +cambrel +cambresine +Cambrian +Cambric +cambricleaf +cambuca +Cambuscan +Cambyuskan +Came +came +cameist +camel +camelback +cameleer +Camelid +Camelidae +Camelina +cameline +camelish +camelishness +camelkeeper +Camellia +Camelliaceae +camellike +camellin +Camellus +camelman +cameloid +Cameloidea +camelopard +Camelopardalis +Camelopardid +Camelopardidae +Camelopardus +camelry +Camelus +Camembert +Camenae +Camenes +cameo +cameograph +cameography +camera +cameral +cameralism +cameralist +cameralistic +cameralistics +cameraman +Camerata +camerate +camerated +cameration +camerier +Camerina +Camerinidae +camerist +camerlingo +Cameronian +Camestres +camilla +camillus +camion +camisado +Camisard +camise +camisia +camisole +camlet +camleteen +Cammarum +cammed +cammock +cammocky +camomile +camoodi +camoodie +Camorra +Camorrism +Camorrist +Camorrista +camouflage +camouflager +camp +Campa +campagna +campagnol +campaign +campaigner +campana +campane +campanero +Campanian +campaniform +campanile +campaniliform +campanilla +campanini +campanist +campanistic +campanologer +campanological +campanologically +campanologist +campanology +Campanula +Campanulaceae +campanulaceous +Campanulales +campanular +Campanularia +Campanulariae +campanularian +Campanularidae +Campanulatae +campanulate +campanulated +campanulous +Campaspe +Campbellism +Campbellite +campbellite +campcraft +Campe +Campephagidae +campephagine +Campephilus +camper +campestral +campfight +campfire +campground +camphane +camphanic +camphanone +camphanyl +camphene +camphine +camphire +campho +camphocarboxylic +camphoid +camphol +campholic +campholide +campholytic +camphor +camphoraceous +camphorate +camphoric +camphorize +camphorone +camphoronic +camphoroyl +camphorphorone +camphorwood +camphory +camphoryl +camphylene +Campignian +campimeter +campimetrical +campimetry +Campine +campion +cample +campmaster +campo +Campodea +campodeid +Campodeidae +campodeiform +campodeoid +campody +Camponotus +campoo +camporee +campshed +campshedding +campsheeting +campshot +campstool +camptodrome +camptonite +Camptosorus +campulitropal +campulitropous +campus +campward +campylite +campylodrome +campylometer +Campyloneuron +campylospermous +campylotropal +campylotropous +camshach +camshachle +camshaft +camstane +camstone +camuning +camus +camused +camwood +can +Cana +Canaan +Canaanite +Canaanitess +Canaanitic +Canaanitish +canaba +Canacee +Canada +canada +Canadian +Canadianism +Canadianization +Canadianize +canadine +canadite +canadol +canaigre +canaille +canajong +canal +canalage +canalboat +canalicular +canaliculate +canaliculated +canaliculation +canaliculi +canaliculization +canaliculus +canaliferous +canaliform +canalization +canalize +canaller +canalling +canalman +canalside +Canamary +canamo +Cananaean +Cananga +Canangium +canape +canapina +canard +Canari +canari +Canarian +canarin +Canariote +Canarium +Canarsee +canary +canasta +canaster +canaut +Canavali +Canavalia +canavalin +Canberra +cancan +cancel +cancelable +cancelation +canceleer +canceler +cancellarian +cancellate +cancellated +cancellation +cancelli +cancellous +cancellus +cancelment +cancer +cancerate +canceration +cancerdrops +cancered +cancerigenic +cancerism +cancerophobe +cancerophobia +cancerous +cancerously +cancerousness +cancerroot +cancerweed +cancerwort +canch +canchalagua +Canchi +Cancri +Cancrid +cancriform +cancrinite +cancrisocial +cancrivorous +cancrizans +cancroid +cancrophagous +cancrum +cand +Candace +candareen +candela +candelabra +candelabrum +candelilla +candent +candescence +candescent +candescently +candid +candidacy +candidate +candidateship +candidature +candidly +candidness +candied +candier +candify +Candiot +candiru +candle +candleball +candlebeam +candleberry +candlebomb +candlebox +candlefish +candleholder +candlelight +candlelighted +candlelighter +candlelighting +candlelit +candlemaker +candlemaking +Candlemas +candlenut +candlepin +candler +candlerent +candleshine +candleshrift +candlestand +candlestick +candlesticked +candlestickward +candlewaster +candlewasting +candlewick +candlewood +candlewright +candock +Candollea +Candolleaceae +candolleaceous +candor +candroy +candy +candymaker +candymaking +candys +candystick +candytuft +candyweed +cane +canebrake +canel +canelike +canella +Canellaceae +canellaceous +Canelo +canelo +caneology +canephor +canephore +canephoros +canephroi +caner +canescence +canescent +canette +canewise +canework +Canfield +canfieldite +canful +cangan +cangia +cangle +cangler +cangue +canhoop +Canichana +Canichanan +canicola +Canicula +canicular +canicule +canid +Canidae +Canidia +canille +caninal +canine +caniniform +caninity +caninus +canioned +canions +Canis +Canisiana +canistel +canister +canities +canjac +cank +canker +cankerberry +cankerbird +cankereat +cankered +cankeredly +cankeredness +cankerflower +cankerous +cankerroot +cankerweed +cankerworm +cankerwort +cankery +canmaker +canmaking +canman +Canna +canna +cannabic +Cannabinaceae +cannabinaceous +cannabine +cannabinol +Cannabis +cannabism +Cannaceae +cannaceous +cannach +canned +cannel +cannelated +cannelure +cannelured +cannequin +canner +cannery +cannet +cannibal +cannibalean +cannibalic +cannibalish +cannibalism +cannibalistic +cannibalistically +cannibality +cannibalization +cannibalize +cannibally +cannikin +cannily +canniness +canning +cannon +cannonade +cannoned +cannoneer +cannoneering +Cannonism +cannonproof +cannonry +cannot +Cannstatt +cannula +cannular +cannulate +cannulated +canny +canoe +canoeing +Canoeiro +canoeist +canoeload +canoeman +canoewood +canon +canoncito +canoness +canonic +canonical +canonically +canonicalness +canonicals +canonicate +canonicity +canonics +canonist +canonistic +canonistical +canonizant +canonization +canonize +canonizer +canonlike +canonry +canonship +canoodle +canoodler +Canopic +canopic +Canopus +canopy +canorous +canorously +canorousness +Canossa +canroy +canroyer +canso +cant +Cantab +cantabank +cantabile +Cantabri +Cantabrian +Cantabrigian +Cantabrize +cantala +cantalite +cantaloupe +cantankerous +cantankerously +cantankerousness +cantar +cantara +cantaro +cantata +Cantate +cantation +cantative +cantatory +cantboard +canted +canteen +cantefable +canter +Canterburian +Canterburianism +Canterbury +canterer +canthal +Cantharellus +Cantharidae +cantharidal +cantharidate +cantharides +cantharidian +cantharidin +cantharidism +cantharidize +cantharis +cantharophilous +cantharus +canthectomy +canthitis +cantholysis +canthoplasty +canthorrhaphy +canthotomy +canthus +cantic +canticle +cantico +cantilena +cantilene +cantilever +cantilevered +cantillate +cantillation +cantily +cantina +cantiness +canting +cantingly +cantingness +cantion +cantish +cantle +cantlet +canto +Canton +canton +cantonal +cantonalism +cantoned +cantoner +Cantonese +cantonment +cantoon +cantor +cantoral +Cantorian +cantoris +cantorous +cantorship +cantred +cantref +cantrip +cantus +cantwise +canty +Canuck +canun +canvas +canvasback +canvasman +canvass +canvassy +cany +canyon +canzon +canzonet +caoba +Caodaism +Caodaist +caoutchouc +caoutchoucin +cap +capability +capable +capableness +capably +capacious +capaciously +capaciousness +capacitance +capacitate +capacitation +capacitative +capacitativly +capacitive +capacitor +capacity +capanna +capanne +caparison +capax +capcase +Cape +cape +caped +capel +capelet +capelin +capeline +Capella +capellet +caper +caperbush +capercaillie +capercally +capercut +caperer +capering +caperingly +Capernaism +Capernaite +Capernaitic +Capernaitical +Capernaitically +Capernaitish +capernoited +capernoitie +capernoity +capersome +caperwort +capes +capeskin +Capetian +Capetonian +capeweed +capewise +capful +Caph +caph +caphar +caphite +Caphtor +Caphtorim +capias +capicha +capillaceous +capillaire +capillament +capillarectasia +capillarily +capillarimeter +capillariness +capillariomotor +capillarity +capillary +capillation +capilliculture +capilliform +capillitial +capillitium +capillose +capistrate +capital +capitaldom +capitaled +capitalism +capitalist +capitalistic +capitalistically +capitalizable +capitalization +capitalize +capitally +capitalness +capitan +capitate +capitated +capitatim +capitation +capitative +capitatum +capitellar +capitellate +capitelliform +capitellum +Capito +Capitol +Capitolian +Capitoline +Capitolium +Capitonidae +Capitoninae +capitoul +capitoulate +capitulant +capitular +capitularly +capitulary +capitulate +capitulation +capitulator +capitulatory +capituliform +capitulum +capivi +capkin +capless +caplin +capmaker +capmaking +capman +capmint +Capnodium +Capnoides +capnomancy +capocchia +capomo +capon +caponier +caponize +caponizer +caporal +capot +capote +cappadine +Cappadocian +Capparidaceae +capparidaceous +Capparis +capped +cappelenite +capper +cappie +capping +capple +cappy +Capra +caprate +Caprella +Caprellidae +caprelline +capreol +capreolar +capreolary +capreolate +capreoline +Capreolus +Capri +capric +capriccetto +capricci +capriccio +caprice +capricious +capriciously +capriciousness +Capricorn +Capricornid +Capricornus +caprid +caprificate +caprification +caprificator +caprifig +Caprifoliaceae +caprifoliaceous +Caprifolium +caprifolium +capriform +caprigenous +Caprimulgi +Caprimulgidae +Caprimulgiformes +caprimulgine +Caprimulgus +caprin +caprine +caprinic +Capriola +capriole +Capriote +capriped +capripede +caprizant +caproate +caproic +caproin +Capromys +caprone +capronic +capronyl +caproyl +capryl +caprylate +caprylene +caprylic +caprylin +caprylone +caprylyl +capsa +capsaicin +Capsella +capsheaf +capshore +Capsian +capsicin +Capsicum +capsicum +capsid +Capsidae +capsizal +capsize +capstan +capstone +capsula +capsulae +capsular +capsulate +capsulated +capsulation +capsule +capsulectomy +capsuler +capsuliferous +capsuliform +capsuligerous +capsulitis +capsulociliary +capsulogenous +capsulolenticular +capsulopupillary +capsulorrhaphy +capsulotome +capsulotomy +capsumin +captaculum +captain +captaincy +captainess +captainly +captainry +captainship +captance +captation +caption +captious +captiously +captiousness +captivate +captivately +captivating +captivatingly +captivation +captivative +captivator +captivatrix +captive +captivity +captor +captress +capturable +capture +capturer +Capuan +capuche +capuched +Capuchin +capuchin +capucine +capulet +capulin +capybara +Caquetio +car +Cara +carabao +carabeen +carabid +Carabidae +carabidan +carabideous +carabidoid +carabin +carabineer +Carabini +caraboid +Carabus +carabus +caracal +caracara +caracol +caracole +caracoler +caracoli +caracolite +caracoller +caracore +caract +Caractacus +caracter +Caradoc +carafe +Caragana +Caraguata +caraguata +Caraho +caraibe +Caraipa +caraipi +Caraja +Carajas +carajura +caramba +carambola +carambole +caramel +caramelan +caramelen +caramelin +caramelization +caramelize +caramoussal +carancha +caranda +Carandas +caranday +carane +Caranga +carangid +Carangidae +carangoid +Carangus +caranna +Caranx +Carapa +carapace +carapaced +Carapache +Carapacho +carapacic +carapato +carapax +Carapidae +carapine +carapo +Carapus +Carara +carat +caratch +caraunda +caravan +caravaneer +caravanist +caravanner +caravansary +caravanserai +caravanserial +caravel +caraway +Carayan +carbacidometer +carbamate +carbamic +carbamide +carbamido +carbamine +carbamino +carbamyl +carbanil +carbanilic +carbanilide +carbarn +carbasus +carbazic +carbazide +carbazine +carbazole +carbazylic +carbeen +carbene +carberry +carbethoxy +carbethoxyl +carbide +carbimide +carbine +carbinol +carbinyl +carbo +carboazotine +carbocinchomeronic +carbodiimide +carbodynamite +carbogelatin +carbohemoglobin +carbohydrase +carbohydrate +carbohydraturia +carbohydrazide +carbohydride +carbohydrogen +carbolate +carbolated +carbolfuchsin +carbolic +carbolineate +Carbolineum +carbolize +Carboloy +carboluria +carbolxylol +carbomethene +carbomethoxy +carbomethoxyl +carbon +carbona +carbonaceous +carbonade +carbonado +Carbonari +Carbonarism +Carbonarist +carbonatation +carbonate +carbonation +carbonatization +carbonator +carbonemia +carbonero +carbonic +carbonide +Carboniferous +carboniferous +carbonification +carbonify +carbonigenous +carbonimeter +carbonimide +carbonite +carbonitride +carbonium +carbonizable +carbonization +carbonize +carbonizer +carbonless +Carbonnieux +carbonometer +carbonometry +carbonous +carbonuria +carbonyl +carbonylene +carbonylic +carbophilous +carbora +Carborundum +carborundum +carbosilicate +carbostyril +carboxide +carboxy +Carboxydomonas +carboxyhemoglobin +carboxyl +carboxylase +carboxylate +carboxylation +carboxylic +carboy +carboyed +carbro +carbromal +carbuilder +carbuncle +carbuncled +carbuncular +carbungi +carburant +carburate +carburation +carburator +carbure +carburet +carburetant +carburetor +carburization +carburize +carburizer +carburometer +carbyl +carbylamine +carcajou +carcake +carcanet +carcaneted +carcass +Carcavelhos +carceag +carcel +carceral +carcerate +carceration +Carcharhinus +Carcharias +carchariid +Carchariidae +carcharioid +Carcharodon +carcharodont +carcinemia +carcinogen +carcinogenesis +carcinogenic +carcinoid +carcinological +carcinologist +carcinology +carcinolysin +carcinolytic +carcinoma +carcinomata +carcinomatoid +carcinomatosis +carcinomatous +carcinomorphic +carcinophagous +carcinopolypus +carcinosarcoma +carcinosarcomata +Carcinoscorpius +carcinosis +carcoon +card +cardaissin +Cardamine +cardamom +Cardanic +cardboard +cardcase +cardecu +carded +cardel +carder +cardholder +cardia +cardiac +cardiacal +Cardiacea +cardiacean +cardiagra +cardiagram +cardiagraph +cardiagraphy +cardial +cardialgia +cardialgy +cardiameter +cardiamorphia +cardianesthesia +cardianeuria +cardiant +cardiaplegia +cardiarctia +cardiasthenia +cardiasthma +cardiataxia +cardiatomy +cardiatrophia +cardiauxe +Cardiazol +cardicentesis +cardiectasis +cardiectomize +cardiectomy +cardielcosis +cardiemphraxia +cardiform +Cardigan +cardigan +Cardiidae +cardin +cardinal +cardinalate +cardinalic +Cardinalis +cardinalism +cardinalist +cardinalitial +cardinalitian +cardinally +cardinalship +cardines +carding +cardioaccelerator +cardioarterial +cardioblast +cardiocarpum +cardiocele +cardiocentesis +cardiocirrhosis +cardioclasia +cardioclasis +cardiodilator +cardiodynamics +cardiodynia +cardiodysesthesia +cardiodysneuria +cardiogenesis +cardiogenic +cardiogram +cardiograph +cardiographic +cardiography +cardiohepatic +cardioid +cardiokinetic +cardiolith +cardiological +cardiologist +cardiology +cardiolysis +cardiomalacia +cardiomegaly +cardiomelanosis +cardiometer +cardiometric +cardiometry +cardiomotility +cardiomyoliposis +cardiomyomalacia +cardioncus +cardionecrosis +cardionephric +cardioneural +cardioneurosis +cardionosus +cardioparplasis +cardiopathic +cardiopathy +cardiopericarditis +cardiophobe +cardiophobia +cardiophrenia +cardioplasty +cardioplegia +cardiopneumatic +cardiopneumograph +cardioptosis +cardiopulmonary +cardiopuncture +cardiopyloric +cardiorenal +cardiorespiratory +cardiorrhaphy +cardiorrheuma +cardiorrhexis +cardioschisis +cardiosclerosis +cardioscope +cardiospasm +Cardiospermum +cardiosphygmogram +cardiosphygmograph +cardiosymphysis +cardiotherapy +cardiotomy +cardiotonic +cardiotoxic +cardiotrophia +cardiotrophotherapy +cardiovascular +cardiovisceral +cardipaludism +cardipericarditis +cardisophistical +carditic +carditis +Cardium +cardlike +cardmaker +cardmaking +cardo +cardol +cardon +cardona +cardoncillo +cardooer +cardoon +cardophagus +cardplayer +cardroom +cardsharp +cardsharping +cardstock +Carduaceae +carduaceous +Carduelis +Carduus +care +carecloth +careen +careenage +careener +career +careerer +careering +careeringly +careerist +carefree +careful +carefully +carefulness +careless +carelessly +carelessness +carene +carer +caress +caressant +caresser +caressing +caressingly +caressive +caressively +carest +caret +caretaker +caretaking +Caretta +Carettochelydidae +careworn +Carex +carfare +carfax +carfuffle +carful +carga +cargo +cargoose +carhop +carhouse +cariacine +Cariacus +cariama +Cariamae +Carian +Carib +Caribal +Cariban +Caribbean +Caribbee +Caribi +Caribisi +caribou +Carica +Caricaceae +caricaceous +caricatura +caricaturable +caricatural +caricature +caricaturist +caricetum +caricographer +caricography +caricologist +caricology +caricous +carid +Carida +Caridea +caridean +caridoid +Caridomorpha +caries +Carijona +carillon +carillonneur +carina +carinal +Carinaria +Carinatae +carinate +carinated +carination +Cariniana +cariniform +Carinthian +cariole +carioling +cariosity +carious +cariousness +Caripuna +Cariri +Caririan +Carisa +Carissa +caritative +caritive +Cariyo +cark +carking +carkingly +carkled +Carl +carl +carless +carlet +carlie +carlin +Carlina +carline +carling +carlings +carlish +carlishness +Carlisle +Carlism +Carlist +Carlo +carload +carloading +carloadings +Carlos +carlot +Carlovingian +carls +Carludovica +Carlylean +Carlyleian +Carlylese +Carlylesque +Carlylian +Carlylism +carmagnole +carmalum +Carman +carman +Carmanians +Carmel +Carmela +carmele +Carmelite +Carmelitess +carmeloite +Carmen +carminative +Carmine +carmine +carminette +carminic +carminite +carminophilous +carmoisin +carmot +Carnacian +carnage +carnaged +carnal +carnalism +carnalite +carnality +carnalize +carnallite +carnally +carnalness +carnaptious +Carnaria +carnassial +carnate +carnation +carnationed +carnationist +carnauba +carnaubic +carnaubyl +Carnegie +Carnegiea +carnelian +carneol +carneole +carneous +carney +carnic +carniferous +carniferrin +carnifex +carnification +carnifices +carnificial +carniform +carnify +Carniolan +carnival +carnivaler +carnivalesque +Carnivora +carnivoracity +carnivoral +carnivore +carnivorism +carnivorous +carnivorously +carnivorousness +carnose +carnosine +carnosity +carnotite +carnous +Caro +caroa +carob +caroba +caroche +Caroid +Carol +carol +Carolan +Carole +Carolean +caroler +caroli +carolin +Carolina +Caroline +caroline +Caroling +Carolingian +Carolinian +carolus +Carolyn +carom +carombolette +carone +caronic +caroome +caroon +carotene +carotenoid +carotic +carotid +carotidal +carotidean +carotin +carotinemia +carotinoid +caroubier +carousal +carouse +carouser +carousing +carousingly +carp +carpaine +carpal +carpale +carpalia +Carpathian +carpel +carpellary +carpellate +carpent +carpenter +Carpenteria +carpentering +carpentership +carpentry +carper +carpet +carpetbag +carpetbagger +carpetbaggery +carpetbaggism +carpetbagism +carpetbeater +carpeting +carpetlayer +carpetless +carpetmaker +carpetmaking +carpetmonger +carpetweb +carpetweed +carpetwork +carpetwoven +Carphiophiops +carpholite +Carphophis +carphosiderite +carpid +carpidium +carpincho +carping +carpingly +carpintero +Carpinus +Carpiodes +carpitis +carpium +carpocace +Carpocapsa +carpocarpal +carpocephala +carpocephalum +carpocerite +carpocervical +Carpocratian +Carpodacus +Carpodetus +carpogam +carpogamy +carpogenic +carpogenous +carpogone +carpogonial +carpogonium +Carpoidea +carpolite +carpolith +carpological +carpologically +carpologist +carpology +carpomania +carpometacarpal +carpometacarpus +carpopedal +Carpophaga +carpophagous +carpophalangeal +carpophore +carpophyll +carpophyte +carpopodite +carpopoditic +carpoptosia +carpoptosis +carport +carpos +carposperm +carposporangia +carposporangial +carposporangium +carpospore +carposporic +carposporous +carpostome +carpus +carquaise +carr +carrack +carrageen +carrageenin +Carrara +Carraran +carrel +carriable +carriage +carriageable +carriageful +carriageless +carriagesmith +carriageway +Carrick +carrick +Carrie +carried +carrier +carrion +carritch +carritches +carriwitchet +Carrizo +carrizo +carroch +carrollite +carronade +carrot +carrotage +carroter +carrotiness +carrottop +carrotweed +carrotwood +carroty +carrousel +carrow +Carry +carry +carryall +carrying +carrytale +carse +carshop +carsick +carsmith +Carsten +cart +cartable +cartaceous +cartage +cartboot +cartbote +carte +cartel +cartelism +cartelist +cartelization +cartelize +Carter +carter +Cartesian +Cartesianism +cartful +Carthaginian +carthame +carthamic +carthamin +Carthamus +Carthusian +Cartier +cartilage +cartilaginean +Cartilaginei +cartilagineous +Cartilagines +cartilaginification +cartilaginoid +cartilaginous +cartisane +Cartist +cartload +cartmaker +cartmaking +cartman +cartobibliography +cartogram +cartograph +cartographer +cartographic +cartographical +cartographically +cartography +cartomancy +carton +cartonnage +cartoon +cartoonist +cartouche +cartridge +cartsale +cartulary +cartway +cartwright +cartwrighting +carty +carua +carucage +carucal +carucate +carucated +Carum +caruncle +caruncula +carunculae +caruncular +carunculate +carunculated +carunculous +carvacrol +carvacryl +carval +carve +carvel +carven +carvene +carver +carvership +carvestrene +carving +carvoepra +carvol +carvomenthene +carvone +carvyl +carwitchet +Cary +Carya +caryatic +caryatid +caryatidal +caryatidean +caryatidic +caryl +Caryocar +Caryocaraceae +caryocaraceous +Caryophyllaceae +caryophyllaceous +caryophyllene +caryophylleous +caryophyllin +caryophyllous +Caryophyllus +caryopilite +caryopses +caryopsides +caryopsis +Caryopteris +Caryota +casaba +casabe +casal +casalty +Casamarca +Casanovanic +Casasia +casate +casaun +casava +casave +casavi +casbah +cascabel +cascade +Cascadia +Cascadian +cascadite +cascado +cascalho +cascalote +cascara +cascarilla +cascaron +casco +cascol +Case +case +Casearia +casease +caseate +caseation +casebook +casebox +cased +caseful +casefy +caseharden +caseic +casein +caseinate +caseinogen +casekeeper +Casel +caseless +caselessly +casemaker +casemaking +casemate +casemated +casement +casemented +caseolysis +caseose +caseous +caser +casern +caseum +caseweed +casewood +casework +caseworker +caseworm +Casey +cash +casha +cashable +cashableness +cashaw +cashbook +cashbox +cashboy +cashcuttee +cashel +cashew +cashgirl +Cashibo +cashier +cashierer +cashierment +cashkeeper +cashment +Cashmere +cashmere +cashmerette +Cashmirian +Casimir +Casimiroa +casing +casino +casiri +cask +casket +casking +casklike +Caslon +Caspar +Casparian +Casper +Caspian +casque +casqued +casquet +casquetel +casquette +cass +cassabanana +cassabully +cassady +Cassandra +cassareep +cassation +casse +Cassegrain +Cassegrainian +casselty +cassena +casserole +Cassia +cassia +Cassiaceae +Cassian +cassican +Cassicus +Cassida +cassideous +cassidid +Cassididae +Cassidinae +cassidony +Cassidulina +cassiduloid +Cassiduloidea +Cassie +cassie +Cassiepeia +cassimere +cassina +cassine +Cassinese +cassinette +Cassinian +cassino +cassinoid +cassioberry +Cassiope +Cassiopeia +Cassiopeian +Cassiopeid +cassiopeium +Cassis +cassis +cassiterite +Cassius +cassock +cassolette +casson +cassonade +cassoon +cassowary +cassumunar +Cassytha +Cassythaceae +cast +castable +castagnole +Castalia +Castalian +Castalides +Castalio +Castanea +castanean +castaneous +castanet +Castanopsis +Castanospermum +castaway +caste +casteless +castelet +castellan +castellano +castellanship +castellany +castellar +castellate +castellated +castellation +caster +casterless +casthouse +castice +castigable +castigate +castigation +castigative +castigator +castigatory +Castilian +Castilla +Castilleja +Castilloa +casting +castle +castled +castlelike +castlet +castlewards +castlewise +castling +castock +castoff +Castor +castor +Castores +castoreum +castorial +Castoridae +castorin +castorite +castorized +Castoroides +castory +castra +castral +castrametation +castrate +castrater +castration +castrator +castrensial +castrensian +castrum +castuli +casual +casualism +casualist +casuality +casually +casualness +casualty +Casuariidae +Casuariiformes +Casuarina +Casuarinaceae +casuarinaceous +Casuarinales +Casuarius +casuary +casuist +casuistess +casuistic +casuistical +casuistically +casuistry +casula +caswellite +Casziel +Cat +cat +catabaptist +catabases +catabasis +catabatic +catabibazon +catabiotic +catabolic +catabolically +catabolin +catabolism +catabolite +catabolize +catacaustic +catachreses +catachresis +catachrestic +catachrestical +catachrestically +catachthonian +cataclasm +cataclasmic +cataclastic +cataclinal +cataclysm +cataclysmal +cataclysmatic +cataclysmatist +cataclysmic +cataclysmically +cataclysmist +catacomb +catacorolla +catacoustics +catacromyodian +catacrotic +catacrotism +catacumbal +catadicrotic +catadicrotism +catadioptric +catadioptrical +catadioptrics +catadromous +catafalco +catafalque +catagenesis +catagenetic +catagmatic +Cataian +catakinesis +catakinetic +catakinetomer +catakinomeric +Catalan +Catalanganes +Catalanist +catalase +Catalaunian +catalecta +catalectic +catalecticant +catalepsis +catalepsy +cataleptic +cataleptiform +cataleptize +cataleptoid +catalexis +catalina +catalineta +catalinite +catallactic +catallactically +catallactics +catallum +catalogia +catalogic +catalogical +catalogist +catalogistic +catalogue +cataloguer +cataloguish +cataloguist +cataloguize +Catalonian +catalowne +Catalpa +catalpa +catalufa +catalyses +catalysis +catalyst +catalyte +catalytic +catalytical +catalytically +catalyzator +catalyze +catalyzer +catamaran +Catamarcan +Catamarenan +catamenia +catamenial +catamite +catamited +catamiting +catamount +catamountain +catan +Catananche +catapan +catapasm +catapetalous +cataphasia +cataphatic +cataphora +cataphoresis +cataphoretic +cataphoria +cataphoric +cataphract +Cataphracta +Cataphracti +cataphrenia +cataphrenic +Cataphrygian +cataphrygianism +cataphyll +cataphylla +cataphyllary +cataphyllum +cataphysical +cataplasia +cataplasis +cataplasm +catapleiite +cataplexy +catapult +catapultic +catapultier +cataract +cataractal +cataracted +cataractine +cataractous +cataractwise +cataria +catarinite +catarrh +catarrhal +catarrhally +catarrhed +Catarrhina +catarrhine +catarrhinian +catarrhous +catasarka +Catasetum +catasta +catastaltic +catastasis +catastate +catastatic +catasterism +catastrophal +catastrophe +catastrophic +catastrophical +catastrophically +catastrophism +catastrophist +catathymic +catatonia +catatoniac +catatonic +catawampous +catawampously +catawamptious +catawamptiously +catawampus +Catawba +catberry +catbird +catboat +catcall +catch +catchable +catchall +catchcry +catcher +catchfly +catchiness +catching +catchingly +catchingness +catchland +catchment +catchpenny +catchplate +catchpole +catchpolery +catchpoleship +catchpoll +catchpollery +catchup +catchwater +catchweed +catchweight +catchword +catchwork +catchy +catclaw +catdom +cate +catechesis +catechetic +catechetical +catechetically +catechin +catechism +catechismal +catechist +catechistic +catechistical +catechistically +catechizable +catechization +catechize +catechizer +catechol +catechu +catechumen +catechumenal +catechumenate +catechumenical +catechumenically +catechumenism +catechumenship +catechutannic +categorem +categorematic +categorematical +categorematically +categorial +categoric +categorical +categorically +categoricalness +categorist +categorization +categorize +category +catelectrotonic +catelectrotonus +catella +catena +catenae +catenarian +catenary +catenate +catenated +catenation +catenoid +catenulate +catepuce +cater +cateran +catercap +catercorner +caterer +caterership +cateress +caterpillar +caterpillared +caterpillarlike +caterva +caterwaul +caterwauler +caterwauling +Catesbaea +cateye +catface +catfaced +catfacing +catfall +catfish +catfoot +catfooted +catgut +Catha +Cathari +Catharina +Catharine +Catharism +Catharist +Catharistic +catharization +catharize +catharpin +catharping +Cathars +catharsis +Cathartae +Cathartes +cathartic +cathartical +cathartically +catharticalness +Cathartidae +Cathartides +Cathartolinum +Cathay +Cathayan +cathead +cathect +cathectic +cathection +cathedra +cathedral +cathedraled +cathedralesque +cathedralic +cathedrallike +cathedralwise +cathedratic +cathedratica +cathedratical +cathedratically +cathedraticum +cathepsin +Catherine +catheter +catheterism +catheterization +catheterize +catheti +cathetometer +cathetometric +cathetus +cathexion +cathexis +cathidine +cathin +cathine +cathinine +cathion +cathisma +cathodal +cathode +cathodic +cathodical +cathodically +cathodofluorescence +cathodograph +cathodography +cathodoluminescence +cathograph +cathography +cathole +catholic +catholical +catholically +catholicalness +catholicate +catholicism +catholicist +catholicity +catholicize +catholicizer +catholicly +catholicness +catholicon +catholicos +catholicus +catholyte +cathood +cathop +Cathrin +cathro +Cathryn +Cathy +Catilinarian +cation +cationic +cativo +catjang +catkin +catkinate +catlap +catlike +catlin +catling +catlinite +catmalison +catmint +catnip +catoblepas +Catocala +catocalid +catocathartic +catoctin +Catodon +catodont +catogene +catogenic +Catoism +Catonian +Catonic +Catonically +Catonism +catoptric +catoptrical +catoptrically +catoptrics +catoptrite +catoptromancy +catoptromantic +Catoquina +catostomid +Catostomidae +catostomoid +Catostomus +catpiece +catpipe +catproof +Catskill +catskin +catstep +catstick +catstitch +catstitcher +catstone +catsup +cattabu +cattail +cattalo +cattery +Catti +cattily +cattimandoo +cattiness +catting +cattish +cattishly +cattishness +cattle +cattlebush +cattlegate +cattleless +cattleman +Cattleya +cattleya +cattleyak +Catty +catty +cattyman +Catullian +catvine +catwalk +catwise +catwood +catwort +caubeen +cauboge +Caucasian +Caucasic +Caucasoid +cauch +cauchillo +caucho +caucus +cauda +caudad +caudae +caudal +caudally +caudalward +Caudata +caudata +caudate +caudated +caudation +caudatolenticular +caudatory +caudatum +caudex +caudices +caudicle +caudiform +caudillism +caudle +caudocephalad +caudodorsal +caudofemoral +caudolateral +caudotibial +caudotibialis +Caughnawaga +caught +cauk +caul +cauld +cauldrife +cauldrifeness +Caulerpa +Caulerpaceae +caulerpaceous +caules +caulescent +caulicle +caulicole +caulicolous +caulicule +cauliculus +cauliferous +cauliflorous +cauliflory +cauliflower +cauliform +cauligenous +caulinar +caulinary +cauline +caulis +Caulite +caulivorous +caulocarpic +caulocarpous +caulome +caulomer +caulomic +caulophylline +Caulophyllum +Caulopteris +caulopteris +caulosarc +caulotaxis +caulotaxy +caulote +caum +cauma +caumatic +caunch +Caunos +Caunus +caup +caupo +caupones +Cauqui +caurale +Caurus +causability +causable +causal +causalgia +causality +causally +causate +causation +causational +causationism +causationist +causative +causatively +causativeness +causativity +cause +causeful +causeless +causelessly +causelessness +causer +causerie +causeway +causewayman +causey +causidical +causing +causingness +causse +causson +caustic +caustical +caustically +causticiser +causticism +causticity +causticization +causticize +causticizer +causticly +causticness +caustification +caustify +Causus +cautel +cautelous +cautelously +cautelousness +cauter +cauterant +cauterization +cauterize +cautery +caution +cautionary +cautioner +cautionry +cautious +cautiously +cautiousness +cautivo +cava +cavae +caval +cavalcade +cavalero +cavalier +cavalierish +cavalierishness +cavalierism +cavalierly +cavalierness +cavaliero +cavaliership +cavalla +cavalry +cavalryman +cavascope +cavate +cavatina +cave +caveat +caveator +cavekeeper +cavel +cavelet +cavelike +cavendish +cavern +cavernal +caverned +cavernicolous +cavernitis +cavernlike +cavernoma +cavernous +cavernously +cavernulous +cavesson +cavetto +Cavia +caviar +cavicorn +Cavicornia +Cavidae +cavie +cavil +caviler +caviling +cavilingly +cavilingness +cavillation +Cavina +caving +cavings +cavish +cavitary +cavitate +cavitation +cavitied +cavity +caviya +cavort +cavus +cavy +caw +cawk +cawky +cawney +cawquaw +caxiri +caxon +Caxton +Caxtonian +cay +Cayapa +Cayapo +Cayenne +cayenne +cayenned +Cayleyan +cayman +Cayubaba +Cayubaban +Cayuga +Cayugan +Cayuse +Cayuvava +caza +cazimi +Ccoya +ce +Ceanothus +cearin +cease +ceaseless +ceaselessly +ceaselessness +ceasmic +Cebalrai +Cebatha +cebell +cebian +cebid +Cebidae +cebil +cebine +ceboid +cebollite +cebur +Cebus +cecidiologist +cecidiology +cecidium +cecidogenous +cecidologist +cecidology +cecidomyian +cecidomyiid +Cecidomyiidae +cecidomyiidous +Cecil +Cecile +Cecilia +cecilite +cecils +Cecily +cecity +cecograph +Cecomorphae +cecomorphic +cecostomy +Cecropia +Cecrops +cecutiency +cedar +cedarbird +cedared +cedarn +cedarware +cedarwood +cedary +cede +cedent +ceder +cedilla +cedrat +cedrate +cedre +Cedrela +cedrene +Cedric +cedrin +cedrine +cedriret +cedrium +cedrol +cedron +Cedrus +cedry +cedula +cee +Ceiba +ceibo +ceil +ceile +ceiler +ceilidh +ceiling +ceilinged +ceilingward +ceilingwards +ceilometer +Celadon +celadon +celadonite +Celaeno +celandine +Celanese +Celarent +Celastraceae +celastraceous +Celastrus +celation +celative +celature +Celebesian +celebrant +celebrate +celebrated +celebratedness +celebrater +celebration +celebrative +celebrator +celebratory +celebrity +celemin +celemines +celeomorph +Celeomorphae +celeomorphic +celeriac +celerity +celery +celesta +Celeste +celeste +celestial +celestiality +celestialize +celestially +celestialness +celestina +Celestine +celestine +Celestinian +celestite +celestitude +Celia +celiac +celiadelphus +celiagra +celialgia +celibacy +celibatarian +celibate +celibatic +celibatist +celibatory +celidographer +celidography +celiectasia +celiectomy +celiemia +celiitis +celiocele +celiocentesis +celiocolpotomy +celiocyesis +celiodynia +celioelytrotomy +celioenterotomy +celiogastrotomy +celiohysterotomy +celiolymph +celiomyalgia +celiomyodynia +celiomyomectomy +celiomyomotomy +celiomyositis +celioncus +celioparacentesis +celiopyosis +celiorrhaphy +celiorrhea +celiosalpingectomy +celiosalpingotomy +celioschisis +celioscope +celioscopy +celiotomy +celite +cell +cella +cellae +cellar +cellarage +cellarer +cellaress +cellaret +cellaring +cellarless +cellarman +cellarous +cellarway +cellarwoman +cellated +celled +Cellepora +cellepore +Cellfalcicula +celliferous +celliform +cellifugal +cellipetal +cellist +Cellite +cello +cellobiose +celloid +celloidin +celloist +cellophane +cellose +Cellucotton +cellular +cellularity +cellularly +cellulase +cellulate +cellulated +cellulation +cellule +cellulicidal +celluliferous +cellulifugal +cellulifugally +cellulin +cellulipetal +cellulipetally +cellulitis +cellulocutaneous +cellulofibrous +Celluloid +celluloid +celluloided +Cellulomonadeae +Cellulomonas +cellulose +cellulosic +cellulosity +cellulotoxic +cellulous +Cellvibrio +Celosia +Celotex +celotomy +Celsia +celsian +Celsius +Celt +celt +Celtdom +Celtiberi +Celtiberian +Celtic +Celtically +Celticism +Celticist +Celticize +Celtidaceae +celtiform +Celtillyrians +Celtis +Celtish +Celtism +Celtist +celtium +Celtization +Celtologist +Celtologue +Celtomaniac +Celtophil +Celtophobe +Celtophobia +celtuce +cembalist +cembalo +cement +cemental +cementation +cementatory +cementer +cementification +cementin +cementite +cementitious +cementless +cementmaker +cementmaking +cementoblast +cementoma +cementum +cemeterial +cemetery +cenacle +cenaculum +cenanthous +cenanthy +cencerro +Cenchrus +cendre +cenobian +cenobite +cenobitic +cenobitical +cenobitically +cenobitism +cenobium +cenoby +cenogenesis +cenogenetic +cenogenetically +cenogonous +Cenomanian +cenosite +cenosity +cenospecies +cenospecific +cenospecifically +cenotaph +cenotaphic +cenotaphy +Cenozoic +cenozoology +cense +censer +censerless +censive +censor +censorable +censorate +censorial +censorious +censoriously +censoriousness +censorship +censual +censurability +censurable +censurableness +censurably +censure +censureless +censurer +censureship +census +cent +centage +cental +centare +centaur +centaurdom +Centaurea +centauress +centauri +centaurial +centaurian +centauric +Centaurid +Centauridium +Centaurium +centauromachia +centauromachy +Centaurus +centaurus +centaury +centavo +centena +centenar +centenarian +centenarianism +centenary +centenier +centenionalis +centennial +centennially +center +centerable +centerboard +centered +centerer +centering +centerless +centermost +centerpiece +centervelic +centerward +centerwise +centesimal +centesimally +centesimate +centesimation +centesimi +centesimo +centesis +Centetes +centetid +Centetidae +centgener +centiar +centiare +centibar +centifolious +centigrade +centigram +centile +centiliter +centillion +centillionth +Centiloquy +centime +centimeter +centimo +centimolar +centinormal +centipedal +centipede +centiplume +centipoise +centistere +centistoke +centner +cento +centonical +centonism +centrad +central +centrale +Centrales +centralism +centralist +centralistic +centrality +centralization +centralize +centralizer +centrally +centralness +centranth +Centranthus +centrarchid +Centrarchidae +centrarchoid +Centraxonia +centraxonial +Centrechinoida +centric +Centricae +centrical +centricality +centrically +centricalness +centricipital +centriciput +centricity +centriffed +centrifugal +centrifugalization +centrifugalize +centrifugaller +centrifugally +centrifugate +centrifugation +centrifuge +centrifugence +centriole +centripetal +centripetalism +centripetally +centripetence +centripetency +centriscid +Centriscidae +centrisciform +centriscoid +Centriscus +centrist +centroacinar +centrobaric +centrobarical +centroclinal +centrode +centrodesmose +centrodesmus +centrodorsal +centrodorsally +centroid +centroidal +centrolecithal +Centrolepidaceae +centrolepidaceous +centrolinead +centrolineal +centromere +centronucleus +centroplasm +Centropomidae +Centropomus +Centrosema +centrosome +centrosomic +Centrosoyus +Centrospermae +centrosphere +centrosymmetric +centrosymmetry +Centrotus +centrum +centry +centum +centumvir +centumviral +centumvirate +Centunculus +centuple +centuplicate +centuplication +centuply +centuria +centurial +centuriate +centuriation +centuriator +centuried +centurion +century +ceorl +ceorlish +cep +cepa +cepaceous +cepe +cephaeline +Cephaelis +Cephalacanthidae +Cephalacanthus +cephalad +cephalagra +cephalalgia +cephalalgic +cephalalgy +cephalanthium +cephalanthous +Cephalanthus +Cephalaspis +Cephalata +cephalate +cephaldemae +cephalemia +cephaletron +Cephaleuros +cephalhematoma +cephalhydrocele +cephalic +cephalin +Cephalina +cephaline +cephalism +cephalitis +cephalization +cephaloauricular +Cephalobranchiata +cephalobranchiate +cephalocathartic +cephalocaudal +cephalocele +cephalocentesis +cephalocercal +Cephalocereus +cephalochord +Cephalochorda +cephalochordal +Cephalochordata +cephalochordate +cephaloclasia +cephaloclast +cephalocone +cephaloconic +cephalocyst +cephalodiscid +Cephalodiscida +Cephalodiscus +cephalodymia +cephalodymus +cephalodynia +cephalofacial +cephalogenesis +cephalogram +cephalograph +cephalohumeral +cephalohumeralis +cephaloid +cephalology +cephalomancy +cephalomant +cephalomelus +cephalomenia +cephalomeningitis +cephalomere +cephalometer +cephalometric +cephalometry +cephalomotor +cephalomyitis +cephalon +cephalonasal +cephalopagus +cephalopathy +cephalopharyngeal +cephalophine +cephalophorous +Cephalophus +cephalophyma +cephaloplegia +cephaloplegic +cephalopod +Cephalopoda +cephalopodan +cephalopodic +cephalopodous +Cephalopterus +cephalorachidian +cephalorhachidian +cephalosome +cephalospinal +Cephalosporium +cephalostyle +Cephalotaceae +cephalotaceous +Cephalotaxus +cephalotheca +cephalothecal +cephalothoracic +cephalothoracopagus +cephalothorax +cephalotome +cephalotomy +cephalotractor +cephalotribe +cephalotripsy +cephalotrocha +Cephalotus +cephalous +Cephas +Cepheid +cephid +Cephidae +Cephus +Cepolidae +ceps +ceptor +cequi +ceraceous +cerago +ceral +ceramal +cerambycid +Cerambycidae +Ceramiaceae +ceramiaceous +ceramic +ceramicite +ceramics +ceramidium +ceramist +Ceramium +ceramographic +ceramography +cerargyrite +ceras +cerasein +cerasin +cerastes +Cerastium +Cerasus +cerata +cerate +ceratectomy +cerated +ceratiasis +ceratiid +Ceratiidae +ceratioid +ceration +ceratite +Ceratites +ceratitic +Ceratitidae +Ceratitis +ceratitoid +Ceratitoidea +Ceratium +Ceratobatrachinae +ceratoblast +ceratobranchial +ceratocricoid +Ceratodidae +Ceratodontidae +Ceratodus +ceratofibrous +ceratoglossal +ceratoglossus +ceratohyal +ceratohyoid +ceratoid +ceratomandibular +ceratomania +Ceratonia +Ceratophrys +Ceratophyllaceae +ceratophyllaceous +Ceratophyllum +Ceratophyta +ceratophyte +Ceratops +Ceratopsia +ceratopsian +ceratopsid +Ceratopsidae +Ceratopteridaceae +ceratopteridaceous +Ceratopteris +ceratorhine +Ceratosa +Ceratosaurus +Ceratospongiae +ceratospongian +Ceratostomataceae +Ceratostomella +ceratotheca +ceratothecal +Ceratozamia +ceraunia +ceraunics +ceraunogram +ceraunograph +ceraunomancy +ceraunophone +ceraunoscope +ceraunoscopy +Cerberean +Cerberic +Cerberus +cercal +cercaria +cercarial +cercarian +cercariform +cercelee +cerci +Cercidiphyllaceae +Cercis +Cercocebus +Cercolabes +Cercolabidae +cercomonad +Cercomonadidae +Cercomonas +cercopid +Cercopidae +cercopithecid +Cercopithecidae +cercopithecoid +Cercopithecus +cercopod +Cercospora +Cercosporella +cercus +Cerdonian +cere +cereal +cerealian +cerealin +cerealism +cerealist +cerealose +cerebella +cerebellar +cerebellifugal +cerebellipetal +cerebellocortex +cerebellopontile +cerebellopontine +cerebellorubral +cerebellospinal +cerebellum +cerebra +cerebral +cerebralgia +cerebralism +cerebralist +cerebralization +cerebralize +cerebrally +cerebrasthenia +cerebrasthenic +cerebrate +cerebration +cerebrational +Cerebratulus +cerebric +cerebricity +cerebriform +cerebriformly +cerebrifugal +cerebrin +cerebripetal +cerebritis +cerebrize +cerebrocardiac +cerebrogalactose +cerebroganglion +cerebroganglionic +cerebroid +cerebrology +cerebroma +cerebromalacia +cerebromedullary +cerebromeningeal +cerebromeningitis +cerebrometer +cerebron +cerebronic +cerebroparietal +cerebropathy +cerebropedal +cerebrophysiology +cerebropontile +cerebropsychosis +cerebrorachidian +cerebrosclerosis +cerebroscope +cerebroscopy +cerebrose +cerebrosensorial +cerebroside +cerebrosis +cerebrospinal +cerebrospinant +cerebrosuria +cerebrotomy +cerebrotonia +cerebrotonic +cerebrovisceral +cerebrum +cerecloth +cered +cereless +cerement +ceremonial +ceremonialism +ceremonialist +ceremonialize +ceremonially +ceremonious +ceremoniously +ceremoniousness +ceremony +cereous +cerer +ceresin +Cereus +cerevis +ceria +Cerialia +cerianthid +Cerianthidae +cerianthoid +Cerianthus +ceric +ceride +ceriferous +cerigerous +cerillo +ceriman +cerin +cerine +Cerinthe +Cerinthian +Ceriomyces +Cerion +Cerionidae +ceriops +Ceriornis +cerise +cerite +Cerithiidae +cerithioid +Cerithium +cerium +cermet +cern +cerniture +cernuous +cero +cerograph +cerographic +cerographist +cerography +ceroline +cerolite +ceroma +ceromancy +cerophilous +ceroplast +ceroplastic +ceroplastics +ceroplasty +cerotate +cerote +cerotene +cerotic +cerotin +cerotype +cerous +ceroxyle +Ceroxylon +cerrero +cerrial +cerris +certain +certainly +certainty +Certhia +Certhiidae +certie +certifiable +certifiableness +certifiably +certificate +certification +certificative +certificator +certificatory +certified +certifier +certify +certiorari +certiorate +certioration +certis +certitude +certosina +certosino +certy +cerule +cerulean +cerulein +ceruleite +ceruleolactite +ceruleous +cerulescent +ceruleum +cerulignol +cerulignone +cerumen +ceruminal +ceruminiferous +ceruminous +cerumniparous +ceruse +cerussite +Cervantist +cervantite +cervical +Cervicapra +cervicaprine +cervicectomy +cervicicardiac +cervicide +cerviciplex +cervicispinal +cervicitis +cervicoauricular +cervicoaxillary +cervicobasilar +cervicobrachial +cervicobregmatic +cervicobuccal +cervicodorsal +cervicodynia +cervicofacial +cervicohumeral +cervicolabial +cervicolingual +cervicolumbar +cervicomuscular +cerviconasal +cervicorn +cervicoscapular +cervicothoracic +cervicovaginal +cervicovesical +cervid +Cervidae +Cervinae +cervine +cervisia +cervisial +cervix +cervoid +cervuline +Cervulus +Cervus +ceryl +Cerynean +Cesare +cesarevitch +cesarolite +cesious +cesium +cespititous +cespitose +cespitosely +cespitulose +cess +cessantly +cessation +cessative +cessavit +cesser +cession +cessionaire +cessionary +cessor +cesspipe +cesspit +cesspool +cest +Cestida +Cestidae +Cestoda +Cestodaria +cestode +cestoid +Cestoidea +cestoidean +Cestracion +cestraciont +Cestraciontes +Cestraciontidae +Cestrian +Cestrum +cestrum +cestus +Cetacea +cetacean +cetaceous +cetaceum +cetane +Cete +cetene +ceterach +ceti +cetic +ceticide +Cetid +cetin +Cetiosauria +cetiosaurian +Cetiosaurus +cetological +cetologist +cetology +Cetomorpha +cetomorphic +Cetonia +cetonian +Cetoniides +Cetoniinae +cetorhinid +Cetorhinidae +cetorhinoid +Cetorhinus +cetotolite +Cetraria +cetraric +cetrarin +Cetus +cetyl +cetylene +cetylic +cevadilla +cevadilline +cevadine +Cevennian +Cevenol +Cevenole +cevine +cevitamic +ceylanite +Ceylon +Ceylonese +ceylonite +ceyssatite +Ceyx +Cezannesque +cha +chaa +chab +chabasie +chabazite +Chablis +chabot +chabouk +chabuk +chabutra +Chac +chacate +chachalaca +Chachapuya +chack +Chackchiuma +chacker +chackle +chackler +chacma +Chaco +chacona +chacte +chad +chadacryst +Chaenactis +Chaenolobus +Chaenomeles +chaeta +Chaetangiaceae +Chaetangium +Chaetetes +Chaetetidae +Chaetifera +chaetiferous +Chaetites +Chaetitidae +Chaetochloa +Chaetodon +chaetodont +chaetodontid +Chaetodontidae +chaetognath +Chaetognatha +chaetognathan +chaetognathous +Chaetophora +Chaetophoraceae +chaetophoraceous +Chaetophorales +chaetophorous +chaetopod +Chaetopoda +chaetopodan +chaetopodous +chaetopterin +Chaetopterus +chaetosema +Chaetosoma +Chaetosomatidae +Chaetosomidae +chaetotactic +chaetotaxy +Chaetura +chafe +chafer +chafery +chafewax +chafeweed +chaff +chaffcutter +chaffer +chafferer +chaffinch +chaffiness +chaffing +chaffingly +chaffless +chafflike +chaffman +chaffseed +chaffwax +chaffweed +chaffy +chaft +chafted +Chaga +chagan +Chagga +chagrin +chaguar +chagul +chahar +chai +Chailletiaceae +chain +chainage +chained +chainer +chainette +chainless +chainlet +chainmaker +chainmaking +chainman +chainon +chainsmith +chainwale +chainwork +chair +chairer +chairless +chairmaker +chairmaking +chairman +chairmanship +chairmender +chairmending +chairwarmer +chairwoman +chais +chaise +chaiseless +Chait +chaitya +chaja +chaka +chakar +chakari +Chakavski +chakazi +chakdar +chakobu +chakra +chakram +chakravartin +chaksi +chal +chalaco +chalana +chalastic +Chalastogastra +chalaza +chalazal +chalaze +chalazian +chalaziferous +chalazion +chalazogam +chalazogamic +chalazogamy +chalazoidite +chalcanthite +Chalcedonian +chalcedonic +chalcedonous +chalcedony +chalcedonyx +chalchuite +chalcid +Chalcidian +Chalcidic +chalcidicum +chalcidid +Chalcididae +chalcidiform +chalcidoid +Chalcidoidea +Chalcioecus +Chalcis +chalcites +chalcocite +chalcograph +chalcographer +chalcographic +chalcographical +chalcographist +chalcography +chalcolite +chalcolithic +chalcomancy +chalcomenite +chalcon +chalcone +chalcophanite +chalcophyllite +chalcopyrite +chalcosiderite +chalcosine +chalcostibite +chalcotrichite +chalcotript +chalcus +Chaldaei +Chaldaic +Chaldaical +Chaldaism +Chaldean +Chaldee +chalder +chaldron +chalet +chalice +chaliced +chalicosis +chalicothere +chalicotheriid +Chalicotheriidae +chalicotherioid +Chalicotherium +Chalina +Chalinidae +chalinine +Chalinitis +chalk +chalkcutter +chalker +chalkiness +chalklike +chalkography +chalkosideric +chalkstone +chalkstony +chalkworker +chalky +challah +challenge +challengeable +challengee +challengeful +challenger +challengingly +challie +challis +challote +chalmer +chalon +chalone +Chalons +chalque +chalta +Chalukya +Chalukyan +chalumeau +chalutz +chalutzim +Chalybean +chalybeate +chalybeous +Chalybes +chalybite +Cham +cham +Chama +Chamacea +Chamacoco +Chamaebatia +Chamaecistus +chamaecranial +Chamaecrista +Chamaecyparis +Chamaedaphne +Chamaeleo +Chamaeleon +Chamaeleontidae +Chamaelirium +Chamaenerion +Chamaepericlymenum +chamaeprosopic +Chamaerops +chamaerrhine +Chamaesaura +Chamaesiphon +Chamaesiphonaceae +Chamaesiphonaceous +Chamaesiphonales +Chamaesyce +chamal +Chamar +chamar +chamber +chamberdeacon +chambered +chamberer +chambering +chamberlain +chamberlainry +chamberlainship +chamberlet +chamberleted +chamberletted +chambermaid +Chambertin +chamberwoman +Chambioa +chambray +chambrel +chambul +chamecephalic +chamecephalous +chamecephalus +chamecephaly +chameleon +chameleonic +chameleonize +chameleonlike +chamfer +chamferer +chamfron +Chamian +Chamicuro +Chamidae +chamisal +chamiso +Chamite +chamite +Chamkanni +chamma +chamois +Chamoisette +chamoisite +chamoline +Chamomilla +Chamorro +Chamos +champ +Champa +champac +champaca +champacol +champagne +champagneless +champagnize +champaign +champain +champaka +champer +champertor +champertous +champerty +champignon +champion +championess +championize +championless +championlike +championship +Champlain +Champlainic +champleve +champy +Chanabal +Chanca +chance +chanceful +chancefully +chancefulness +chancel +chanceled +chanceless +chancellery +chancellor +chancellorate +chancelloress +chancellorism +chancellorship +chancer +chancery +chancewise +chanche +chanchito +chanco +chancre +chancriform +chancroid +chancroidal +chancrous +chancy +chandala +chandam +chandelier +Chandi +chandi +chandler +chandleress +chandlering +chandlery +chandoo +chandu +chandul +Chane +chanfrin +Chang +chang +changa +changar +change +changeability +changeable +changeableness +changeably +changedale +changedness +changeful +changefully +changefulness +changeless +changelessly +changelessness +changeling +changement +changer +Changoan +Changos +Changuina +Changuinan +Chanidae +chank +chankings +channel +channelbill +channeled +channeler +channeling +channelization +channelize +channelled +channeller +channelling +channelwards +channer +chanson +chansonnette +chanst +chant +chantable +chanter +chanterelle +chantership +chantey +chanteyman +chanticleer +chanting +chantingly +chantlate +chantress +chantry +chao +chaogenous +chaology +chaos +chaotic +chaotical +chaotically +chaoticness +Chaouia +chap +Chapacura +Chapacuran +chapah +Chapanec +chaparral +chaparro +chapatty +chapbook +chape +chapeau +chapeaux +chaped +chapel +chapeless +chapelet +chapelgoer +chapelgoing +chapellage +chapellany +chapelman +chapelmaster +chapelry +chapelward +chaperno +chaperon +chaperonage +chaperone +chaperonless +chapfallen +chapin +chapiter +chapitral +chaplain +chaplaincy +chaplainry +chaplainship +chapless +chaplet +chapleted +chapman +chapmanship +chapournet +chapournetted +chappaul +chapped +chapper +chappie +chappin +chapping +chappow +chappy +chaps +chapt +chaptalization +chaptalize +chapter +chapteral +chapterful +chapwoman +char +Chara +charabanc +charabancer +charac +Characeae +characeous +characetum +characin +characine +characinid +Characinidae +characinoid +character +characterful +characterial +characterical +characterism +characterist +characteristic +characteristical +characteristically +characteristicalness +characteristicness +characterizable +characterization +characterize +characterizer +characterless +characterlessness +characterological +characterologist +characterology +charactery +charade +Charadrii +Charadriidae +charadriiform +Charadriiformes +charadrine +charadrioid +Charadriomorphae +Charadrius +Charales +charas +charbon +Charca +charcoal +charcoaly +charcutier +chard +chardock +chare +charer +charet +charette +charge +chargeability +chargeable +chargeableness +chargeably +chargee +chargeless +chargeling +chargeman +charger +chargeship +charging +Charicleia +charier +charily +chariness +chariot +charioted +chariotee +charioteer +charioteership +chariotlike +chariotman +chariotry +chariotway +charism +charisma +charismatic +Charissa +charisticary +charitable +charitableness +charitably +Charites +charity +charityless +charivari +chark +charka +charkha +charkhana +charlady +charlatan +charlatanic +charlatanical +charlatanically +charlatanish +charlatanism +charlatanistic +charlatanry +charlatanship +Charleen +Charlene +Charles +Charleston +Charley +Charlie +charlock +Charlotte +charm +charmedly +charmel +charmer +charmful +charmfully +charmfulness +charming +charmingly +charmingness +charmless +charmlessly +charmwise +charnel +charnockite +Charon +Charonian +Charonic +Charontas +Charophyta +charpit +charpoy +charqued +charqui +charr +Charruan +Charruas +charry +charshaf +charsingha +chart +chartaceous +charter +charterable +charterage +chartered +charterer +charterhouse +Charterist +charterless +chartermaster +charthouse +charting +Chartism +Chartist +chartist +chartless +chartographist +chartology +chartometer +chartophylax +chartreuse +Chartreux +chartroom +chartula +chartulary +charuk +charwoman +chary +Charybdian +Charybdis +chasable +chase +chaseable +chaser +Chasidim +chasing +chasm +chasma +chasmal +chasmed +chasmic +chasmogamic +chasmogamous +chasmogamy +chasmophyte +chasmy +chasse +Chasselas +chassepot +chasseur +chassignite +chassis +Chastacosta +chaste +chastely +chasten +chastener +chasteness +chasteningly +chastenment +chasteweed +chastisable +chastise +chastisement +chastiser +chastity +chasuble +chasubled +chat +chataka +Chateau +chateau +chateaux +chatelain +chatelaine +chatelainry +chatellany +chathamite +chati +Chatillon +Chatino +Chatot +chatoyance +chatoyancy +chatoyant +chatsome +chatta +chattable +Chattanooga +Chattanoogan +chattation +chattel +chattelhood +chattelism +chattelization +chattelize +chattelship +chatter +chatteration +chatterbag +chatterbox +chatterer +chattering +chatteringly +chattermag +chattermagging +Chattertonian +chattery +Chatti +chattily +chattiness +chatting +chattingly +chatty +chatwood +Chaucerian +Chauceriana +Chaucerianism +Chaucerism +Chauchat +chaudron +chauffer +chauffeur +chauffeurship +Chaui +chauk +chaukidari +Chauliodes +chaulmoogra +chaulmoograte +chaulmoogric +Chauna +chaus +chausseemeile +Chautauqua +Chautauquan +chaute +chauth +chauvinism +chauvinist +chauvinistic +chauvinistically +Chavante +Chavantean +chavender +chavibetol +chavicin +chavicine +chavicol +chavish +chaw +chawan +chawbacon +chawer +Chawia +chawk +chawl +chawstick +chay +chaya +chayaroot +Chayma +Chayota +chayote +chayroot +chazan +Chazy +che +cheap +cheapen +cheapener +cheapery +cheaping +cheapish +cheaply +cheapness +Cheapside +cheat +cheatable +cheatableness +cheatee +cheater +cheatery +cheating +cheatingly +cheatrie +Chebacco +chebec +chebel +chebog +chebule +chebulinic +Chechehet +Chechen +check +checkable +checkage +checkbird +checkbite +checkbook +checked +checker +checkerbelly +checkerberry +checkerbloom +checkerboard +checkerbreast +checkered +checkerist +checkers +checkerwise +checkerwork +checkhook +checkless +checkman +checkmate +checkoff +checkrack +checkrein +checkroll +checkroom +checkrope +checkrow +checkrowed +checkrower +checkstone +checkstrap +checkstring +checkup +checkweigher +checkwork +checky +cheddaring +cheddite +cheder +chedlock +chee +cheecha +cheechako +cheek +cheekbone +cheeker +cheekily +cheekiness +cheekish +cheekless +cheekpiece +cheeky +cheep +cheeper +cheepily +cheepiness +cheepy +cheer +cheered +cheerer +cheerful +cheerfulize +cheerfully +cheerfulness +cheerfulsome +cheerily +cheeriness +cheering +cheeringly +cheerio +cheerleader +cheerless +cheerlessly +cheerlessness +cheerly +cheery +cheese +cheeseboard +cheesebox +cheeseburger +cheesecake +cheesecloth +cheesecurd +cheesecutter +cheeseflower +cheeselip +cheesemonger +cheesemongering +cheesemongerly +cheesemongery +cheeseparer +cheeseparing +cheeser +cheesery +cheesewood +cheesiness +cheesy +cheet +cheetah +cheeter +cheetie +chef +Chefrinia +chegoe +chegre +Chehalis +Cheilanthes +cheilitis +Cheilodipteridae +Cheilodipterus +Cheilostomata +cheilostomatous +cheir +cheiragra +Cheiranthus +Cheirogaleus +Cheiroglossa +cheirognomy +cheirography +cheirolin +cheirology +cheiromancy +cheiromegaly +cheiropatagium +cheiropodist +cheiropody +cheiropompholyx +Cheiroptera +cheiropterygium +cheirosophy +cheirospasm +Cheirotherium +Cheka +chekan +cheke +cheki +Chekist +chekmak +chela +chelaship +chelate +chelation +chelem +chelerythrine +chelicer +chelicera +cheliceral +chelicerate +chelicere +chelide +chelidon +chelidonate +chelidonian +chelidonic +chelidonine +Chelidonium +Chelidosaurus +Cheliferidea +cheliferous +cheliform +chelingo +cheliped +Chellean +chello +Chelodina +chelodine +chelone +Chelonia +chelonian +chelonid +Chelonidae +cheloniid +Cheloniidae +chelonin +chelophore +chelp +Cheltenham +Chelura +Chelydidae +Chelydra +Chelydridae +chelydroid +chelys +Chemakuan +chemasthenia +chemawinite +Chemehuevi +chemesthesis +chemiatric +chemiatrist +chemiatry +chemic +chemical +chemicalization +chemicalize +chemically +chemicker +chemicoastrological +chemicobiologic +chemicobiology +chemicocautery +chemicodynamic +chemicoengineering +chemicoluminescence +chemicomechanical +chemicomineralogical +chemicopharmaceutical +chemicophysical +chemicophysics +chemicophysiological +chemicovital +chemigraph +chemigraphic +chemigraphy +chemiloon +chemiluminescence +chemiotactic +chemiotaxic +chemiotaxis +chemiotropic +chemiotropism +chemiphotic +chemis +chemise +chemisette +chemism +chemisorb +chemisorption +chemist +chemistry +chemitype +chemitypy +chemoceptor +chemokinesis +chemokinetic +chemolysis +chemolytic +chemolyze +chemoreception +chemoreceptor +chemoreflex +chemoresistance +chemoserotherapy +chemosis +chemosmosis +chemosmotic +chemosynthesis +chemosynthetic +chemotactic +chemotactically +chemotaxis +chemotaxy +chemotherapeutic +chemotherapeutics +chemotherapist +chemotherapy +chemotic +chemotropic +chemotropically +chemotropism +Chemung +chemurgic +chemurgical +chemurgy +Chen +chena +chende +chenevixite +Cheney +cheng +chenica +chenille +cheniller +chenopod +Chenopodiaceae +chenopodiaceous +Chenopodiales +Chenopodium +cheoplastic +chepster +cheque +Chequers +Chera +chercock +cherem +Cheremiss +Cheremissian +cherimoya +cherish +cherishable +cherisher +cherishing +cherishingly +cherishment +Cherkess +Cherkesser +Chermes +Chermidae +Chermish +Chernomorish +chernozem +Cherokee +cheroot +cherried +cherry +cherryblossom +cherrylike +chersonese +Chersydridae +chert +cherte +cherty +cherub +cherubic +cherubical +cherubically +cherubim +cherubimic +cherubimical +cherubin +Cherusci +Chervante +chervil +chervonets +Chesapeake +Cheshire +cheson +chess +chessboard +chessdom +chessel +chesser +chessist +chessman +chessmen +chesstree +chessylite +chest +Chester +chester +chesterfield +Chesterfieldian +chesterlite +chestful +chestily +chestiness +chestnut +chestnutty +chesty +Chet +cheth +chettik +chetty +chetverik +chetvert +chevage +cheval +chevalier +chevaline +chevance +cheve +cheven +chevener +chevesaile +chevin +Cheviot +chevisance +chevise +chevon +chevrette +chevron +chevrone +chevronel +chevronelly +chevronwise +chevrony +chevrotain +chevy +chew +chewbark +chewer +chewink +chewstick +chewy +Cheyenne +cheyney +chhatri +chi +chia +Chiam +Chian +Chianti +Chiapanec +Chiapanecan +chiaroscurist +chiaroscuro +chiasm +chiasma +chiasmal +chiasmatype +chiasmatypy +chiasmic +Chiasmodon +chiasmodontid +Chiasmodontidae +chiasmus +chiastic +chiastolite +chiastoneural +chiastoneurous +chiastoneury +chiaus +Chibcha +Chibchan +chibinite +chibouk +chibrit +chic +chicane +chicaner +chicanery +chicaric +chicayote +Chicha +chichi +chichicaste +Chichimec +chichimecan +chichipate +chichipe +chichituna +chick +chickabiddy +chickadee +Chickahominy +Chickamauga +chickaree +Chickasaw +chickasaw +chickell +chicken +chickenberry +chickenbill +chickenbreasted +chickenhearted +chickenheartedly +chickenheartedness +chickenhood +chickenweed +chickenwort +chicker +chickhood +chickling +chickstone +chickweed +chickwit +chicky +chicle +chicness +Chico +chico +Chicomecoatl +chicory +chicot +chicote +chicqued +chicquer +chicquest +chicquing +chid +chidden +chide +chider +chiding +chidingly +chidingness +chidra +chief +chiefdom +chiefery +chiefess +chiefest +chiefish +chiefless +chiefling +chiefly +chiefship +chieftain +chieftaincy +chieftainess +chieftainry +chieftainship +chieftess +chield +Chien +chien +chiffer +chiffon +chiffonade +chiffonier +chiffony +chifforobe +chigetai +chiggak +chigger +chiggerweed +chignon +chignoned +chigoe +chih +chihfu +Chihuahua +chikara +chil +chilacavote +chilalgia +chilarium +chilblain +Chilcat +child +childbearing +childbed +childbirth +childcrowing +childe +childed +Childermas +childhood +childing +childish +childishly +childishness +childkind +childless +childlessness +childlike +childlikeness +childly +childness +childrenite +childridden +childship +childward +chile +Chilean +Chileanization +Chileanize +chilectropion +chilenite +chili +chiliad +chiliadal +chiliadic +chiliagon +chiliahedron +chiliarch +chiliarchia +chiliarchy +chiliasm +chiliast +chiliastic +chilicote +chilicothe +chilidium +Chilina +Chilinidae +chiliomb +Chilion +chilitis +Chilkat +chill +chilla +chillagite +chilled +chiller +chillily +chilliness +chilling +chillingly +chillish +Chilliwack +chillness +chillo +chillroom +chillsome +chillum +chillumchee +chilly +chilognath +Chilognatha +chilognathan +chilognathous +chilogrammo +chiloma +Chilomastix +chiloncus +chiloplasty +chilopod +Chilopoda +chilopodan +chilopodous +Chilopsis +Chilostoma +Chilostomata +chilostomatous +chilostome +chilotomy +Chiltern +chilver +chimaera +chimaerid +Chimaeridae +chimaeroid +Chimaeroidei +Chimakuan +Chimakum +Chimalakwe +Chimalapa +Chimane +chimango +Chimaphila +Chimarikan +Chimariko +chimble +chime +chimer +chimera +chimeric +chimerical +chimerically +chimericalness +chimesmaster +chiminage +Chimmesyan +chimney +chimneyhead +chimneyless +chimneyman +Chimonanthus +chimopeelagic +chimpanzee +Chimu +Chin +chin +china +chinaberry +chinalike +Chinaman +chinamania +chinamaniac +chinampa +chinanta +Chinantecan +Chinantecs +chinaphthol +chinar +chinaroot +Chinatown +chinaware +chinawoman +chinband +chinch +chincha +Chinchasuyu +chinchayote +chinche +chincherinchee +chinchilla +chinching +chincloth +chincough +chine +chined +Chinee +Chinese +Chinesery +ching +chingma +Chingpaw +Chinhwan +chinik +chinin +Chink +chink +chinkara +chinker +chinkerinchee +chinking +chinkle +chinks +chinky +chinless +chinnam +chinned +chinny +chino +chinoa +chinol +Chinook +Chinookan +chinotoxine +chinotti +chinpiece +chinquapin +chinse +chint +chintz +chinwood +Chiococca +chiococcine +Chiogenes +chiolite +chionablepsia +Chionanthus +Chionaspis +Chionididae +Chionis +Chionodoxa +Chiot +chiotilla +Chip +chip +chipchap +chipchop +Chipewyan +chiplet +chipling +chipmunk +chippable +chippage +chipped +Chippendale +chipper +chipping +chippy +chips +chipwood +Chiquitan +Chiquito +chiragra +chiral +chiralgia +chirality +chirapsia +chirarthritis +chirata +Chiriana +Chiricahua +Chiriguano +chirimen +Chirino +chirinola +chiripa +chirivita +chirk +chirm +chiro +chirocosmetics +chirogale +chirognomic +chirognomically +chirognomist +chirognomy +chirognostic +chirograph +chirographary +chirographer +chirographic +chirographical +chirography +chirogymnast +chirological +chirologically +chirologist +chirology +chiromance +chiromancer +chiromancist +chiromancy +chiromant +chiromantic +chiromantical +Chiromantis +chiromegaly +chirometer +Chiromyidae +Chiromys +Chiron +chironomic +chironomid +Chironomidae +Chironomus +chironomy +chironym +chiropatagium +chiroplasty +chiropod +chiropodial +chiropodic +chiropodical +chiropodist +chiropodistry +chiropodous +chiropody +chiropompholyx +chiropractic +chiropractor +chiropraxis +chiropter +Chiroptera +chiropteran +chiropterite +chiropterophilous +chiropterous +chiropterygian +chiropterygious +chiropterygium +chirosophist +chirospasm +Chirotes +chirotherian +Chirotherium +chirothesia +chirotonsor +chirotonsory +chirotony +chirotype +chirp +chirper +chirpily +chirpiness +chirping +chirpingly +chirpling +chirpy +chirr +chirrup +chirruper +chirrupy +chirurgeon +chirurgery +Chisedec +chisel +chiseled +chiseler +chisellike +chiselly +chiselmouth +chit +Chita +chitak +chital +chitchat +chitchatty +Chitimacha +Chitimachan +chitin +chitinization +chitinized +chitinocalcareous +chitinogenous +chitinoid +chitinous +chiton +chitosamine +chitosan +chitose +chitra +Chitrali +chittamwood +chitter +chitterling +chitty +chivalresque +chivalric +chivalrous +chivalrously +chivalrousness +chivalry +chive +chivey +chiviatite +Chiwere +chkalik +chladnite +chlamyd +chlamydate +chlamydeous +Chlamydobacteriaceae +chlamydobacteriaceous +Chlamydobacteriales +Chlamydomonadaceae +Chlamydomonadidae +Chlamydomonas +Chlamydosaurus +Chlamydoselachidae +Chlamydoselachus +chlamydospore +Chlamydozoa +chlamydozoan +chlamyphore +Chlamyphorus +chlamys +Chleuh +chloanthite +chloasma +Chloe +chlor +chloracetate +chloragogen +chloral +chloralformamide +chloralide +chloralism +chloralization +chloralize +chloralose +chloralum +chloramide +chloramine +chloramphenicol +chloranemia +chloranemic +chloranhydride +chloranil +Chloranthaceae +chloranthaceous +Chloranthus +chloranthy +chlorapatite +chlorastrolite +chlorate +chlorazide +chlorcosane +chlordan +chlordane +chlore +Chlorella +Chlorellaceae +chlorellaceous +chloremia +chlorenchyma +chlorhydrate +chlorhydric +chloric +chloridate +chloridation +chloride +Chloridella +Chloridellidae +chlorider +chloridize +chlorimeter +chlorimetric +chlorimetry +chlorinate +chlorination +chlorinator +chlorine +chlorinize +chlorinous +chloriodide +Chlorion +Chlorioninae +chlorite +chloritic +chloritization +chloritize +chloritoid +chlorize +chlormethane +chlormethylic +chloroacetate +chloroacetic +chloroacetone +chloroacetophenone +chloroamide +chloroamine +chloroanaemia +chloroanemia +chloroaurate +chloroauric +chloroaurite +chlorobenzene +chlorobromide +chlorocalcite +chlorocarbonate +chlorochromates +chlorochromic +chlorochrous +Chlorococcaceae +Chlorococcales +Chlorococcum +Chlorococcus +chlorocresol +chlorocruorin +chlorodize +chloroform +chloroformate +chloroformic +chloroformism +chloroformist +chloroformization +chloroformize +chlorogenic +chlorogenine +chlorohydrin +chlorohydrocarbon +chloroiodide +chloroleucite +chloroma +chloromelanite +chlorometer +chloromethane +chlorometric +chlorometry +Chloromycetin +chloronitrate +chloropal +chloropalladates +chloropalladic +chlorophane +chlorophenol +chlorophoenicite +Chlorophora +Chlorophyceae +chlorophyceous +chlorophyl +chlorophyll +chlorophyllaceous +chlorophyllan +chlorophyllase +chlorophyllian +chlorophyllide +chlorophylliferous +chlorophylligenous +chlorophylligerous +chlorophyllin +chlorophyllite +chlorophylloid +chlorophyllose +chlorophyllous +chloropia +chloropicrin +chloroplast +chloroplastic +chloroplastid +chloroplatinate +chloroplatinic +chloroplatinite +chloroplatinous +chloroprene +chloropsia +chloroquine +chlorosilicate +chlorosis +chlorospinel +chlorosulphonic +chlorotic +chlorous +chlorozincate +chlorsalol +chloryl +Chnuphis +cho +choachyte +choana +choanate +Choanephora +choanocytal +choanocyte +Choanoflagellata +choanoflagellate +Choanoflagellida +Choanoflagellidae +choanoid +choanophorous +choanosomal +choanosome +choate +choaty +chob +choca +chocard +Chocho +chocho +chock +chockablock +chocker +chockler +chockman +Choco +Chocoan +chocolate +Choctaw +choel +choenix +Choeropsis +Choes +choffer +choga +chogak +chogset +Choiak +choice +choiceful +choiceless +choicelessness +choicely +choiceness +choicy +choil +choiler +choir +choirboy +choirlike +choirman +choirmaster +choirwise +Choisya +chokage +choke +chokeberry +chokebore +chokecherry +chokedamp +choker +chokered +chokerman +chokestrap +chokeweed +chokidar +choking +chokingly +chokra +choky +Chol +chol +Chola +chola +cholagogic +cholagogue +cholalic +cholane +cholangioitis +cholangitis +cholanic +cholanthrene +cholate +chold +choleate +cholecyanine +cholecyst +cholecystalgia +cholecystectasia +cholecystectomy +cholecystenterorrhaphy +cholecystenterostomy +cholecystgastrostomy +cholecystic +cholecystitis +cholecystnephrostomy +cholecystocolostomy +cholecystocolotomy +cholecystoduodenostomy +cholecystogastrostomy +cholecystogram +cholecystography +cholecystoileostomy +cholecystojejunostomy +cholecystokinin +cholecystolithiasis +cholecystolithotripsy +cholecystonephrostomy +cholecystopexy +cholecystorrhaphy +cholecystostomy +cholecystotomy +choledoch +choledochal +choledochectomy +choledochitis +choledochoduodenostomy +choledochoenterostomy +choledocholithiasis +choledocholithotomy +choledocholithotripsy +choledochoplasty +choledochorrhaphy +choledochostomy +choledochotomy +cholehematin +choleic +choleine +choleinic +cholelith +cholelithiasis +cholelithic +cholelithotomy +cholelithotripsy +cholelithotrity +cholemia +choleokinase +cholepoietic +choler +cholera +choleraic +choleric +cholericly +cholericness +choleriform +cholerigenous +cholerine +choleroid +choleromania +cholerophobia +cholerrhagia +cholestane +cholestanol +cholesteatoma +cholesteatomatous +cholestene +cholesterate +cholesteremia +cholesteric +cholesterin +cholesterinemia +cholesterinic +cholesterinuria +cholesterol +cholesterolemia +cholesteroluria +cholesterosis +cholesteryl +choletelin +choletherapy +choleuria +choli +choliamb +choliambic +choliambist +cholic +choline +cholinergic +cholinesterase +cholinic +cholla +choller +Cholo +cholochrome +cholocyanine +Choloepus +chologenetic +choloidic +choloidinic +chololith +chololithic +Cholonan +Cholones +cholophein +cholorrhea +choloscopy +cholterheaded +cholum +choluria +Choluteca +chomp +chondral +chondralgia +chondrarsenite +chondre +chondrectomy +chondrenchyma +chondric +chondrification +chondrify +chondrigen +chondrigenous +Chondrilla +chondrin +chondrinous +chondriocont +chondriome +chondriomere +chondriomite +chondriosomal +chondriosome +chondriosphere +chondrite +chondritic +chondritis +chondroadenoma +chondroalbuminoid +chondroangioma +chondroarthritis +chondroblast +chondroblastoma +chondrocarcinoma +chondrocele +chondroclasis +chondroclast +chondrocoracoid +chondrocostal +chondrocranial +chondrocranium +chondrocyte +chondrodite +chondroditic +chondrodynia +chondrodystrophia +chondrodystrophy +chondroendothelioma +chondroepiphysis +chondrofetal +chondrofibroma +chondrofibromatous +Chondroganoidei +chondrogen +chondrogenesis +chondrogenetic +chondrogenous +chondrogeny +chondroglossal +chondroglossus +chondrography +chondroid +chondroitic +chondroitin +chondrolipoma +chondrology +chondroma +chondromalacia +chondromatous +chondromucoid +Chondromyces +chondromyoma +chondromyxoma +chondromyxosarcoma +chondropharyngeal +chondropharyngeus +chondrophore +chondrophyte +chondroplast +chondroplastic +chondroplasty +chondroprotein +chondropterygian +Chondropterygii +chondropterygious +chondrosamine +chondrosarcoma +chondrosarcomatous +chondroseptum +chondrosin +chondrosis +chondroskeleton +chondrostean +Chondrostei +chondrosteoma +chondrosteous +chondrosternal +chondrotome +chondrotomy +chondroxiphoid +chondrule +chondrus +chonolith +chonta +Chontal +Chontalan +Chontaquiro +chontawood +choop +choosable +choosableness +choose +chooser +choosing +choosingly +choosy +chop +chopa +chopboat +chopfallen +chophouse +chopin +chopine +choplogic +chopped +chopper +choppered +chopping +choppy +chopstick +Chopunnish +Chora +choragic +choragion +choragium +choragus +choragy +Chorai +choral +choralcelo +choraleon +choralist +chorally +Chorasmian +chord +chorda +Chordaceae +chordacentrous +chordacentrum +chordaceous +chordal +chordally +chordamesoderm +Chordata +chordate +chorded +Chordeiles +chorditis +chordoid +chordomesoderm +chordotomy +chordotonal +chore +chorea +choreal +choreatic +choree +choregic +choregus +choregy +choreic +choreiform +choreograph +choreographer +choreographic +choreographical +choreography +choreoid +choreomania +chorepiscopal +chorepiscopus +choreus +choreutic +chorial +choriamb +choriambic +choriambize +choriambus +choric +chorine +chorioadenoma +chorioallantoic +chorioallantoid +chorioallantois +choriocapillaris +choriocapillary +choriocarcinoma +choriocele +chorioepithelioma +chorioid +chorioidal +chorioiditis +chorioidocyclitis +chorioidoiritis +chorioidoretinitis +chorioma +chorion +chorionepithelioma +chorionic +Chorioptes +chorioptic +chorioretinal +chorioretinitis +Choripetalae +choripetalous +choriphyllous +chorisepalous +chorisis +chorism +chorist +choristate +chorister +choristership +choristic +choristoblastoma +choristoma +choristry +chorization +chorizont +chorizontal +chorizontes +chorizontic +chorizontist +chorogi +chorograph +chorographer +chorographic +chorographical +chorographically +chorography +choroid +choroidal +choroidea +choroiditis +choroidocyclitis +choroidoiritis +choroidoretinitis +chorological +chorologist +chorology +choromania +choromanic +chorometry +chorook +Chorotega +Choroti +chort +chorten +Chorti +chortle +chortler +chortosterol +chorus +choruser +choruslike +Chorwat +choryos +chose +chosen +chott +Chou +Chouan +Chouanize +chouette +chough +chouka +choultry +choup +chouquette +chous +chouse +chouser +chousingha +chow +Chowanoc +chowchow +chowder +chowderhead +chowderheaded +chowk +chowry +choya +choyroot +Chozar +chrematheism +chrematist +chrematistic +chrematistics +chreotechnics +chresmology +chrestomathic +chrestomathics +chrestomathy +chria +chrimsel +Chris +chrism +chrisma +chrismal +chrismary +chrismatine +chrismation +chrismatite +chrismatize +chrismatory +chrismon +chrisom +chrisomloosing +chrisroot +Chrissie +Christ +Christabel +Christadelphian +Christadelphianism +christcross +Christdom +Christed +christen +Christendie +Christendom +christened +christener +christening +Christenmas +Christhood +Christiad +Christian +Christiana +Christiania +Christianiadeal +Christianism +christianite +Christianity +Christianization +Christianize +Christianizer +Christianlike +Christianly +Christianness +Christianogentilism +Christianography +Christianomastix +Christianopaganism +Christicide +Christie +Christiform +Christina +Christine +Christless +Christlessness +Christlike +Christlikeness +Christliness +Christly +Christmas +Christmasberry +Christmasing +Christmastide +Christmasy +Christocentric +Christofer +Christogram +Christolatry +Christological +Christologist +Christology +Christophany +Christophe +Christopher +Christos +chroatol +Chrobat +chroma +chromaffin +chromaffinic +chromammine +chromaphil +chromaphore +chromascope +chromate +chromatic +chromatical +chromatically +chromatician +chromaticism +chromaticity +chromatics +chromatid +chromatin +chromatinic +Chromatioideae +chromatism +chromatist +Chromatium +chromatize +chromatocyte +chromatodysopia +chromatogenous +chromatogram +chromatograph +chromatographic +chromatography +chromatoid +chromatology +chromatolysis +chromatolytic +chromatometer +chromatone +chromatopathia +chromatopathic +chromatopathy +chromatophil +chromatophile +chromatophilia +chromatophilic +chromatophilous +chromatophobia +chromatophore +chromatophoric +chromatophorous +chromatoplasm +chromatopsia +chromatoptometer +chromatoptometry +chromatoscope +chromatoscopy +chromatosis +chromatosphere +chromatospheric +chromatrope +chromaturia +chromatype +chromazurine +chromdiagnosis +chrome +chromene +chromesthesia +chromic +chromicize +chromid +Chromidae +Chromides +chromidial +Chromididae +chromidiogamy +chromidiosome +chromidium +chromidrosis +chromiferous +chromiole +chromism +chromite +chromitite +chromium +chromo +Chromobacterieae +Chromobacterium +chromoblast +chromocenter +chromocentral +chromochalcographic +chromochalcography +chromocollograph +chromocollographic +chromocollography +chromocollotype +chromocollotypy +chromocratic +chromocyte +chromocytometer +chromodermatosis +chromodiascope +chromogen +chromogene +chromogenesis +chromogenetic +chromogenic +chromogenous +chromogram +chromograph +chromoisomer +chromoisomeric +chromoisomerism +chromoleucite +chromolipoid +chromolith +chromolithic +chromolithograph +chromolithographer +chromolithographic +chromolithography +chromolysis +chromomere +chromometer +chromone +chromonema +chromoparous +chromophage +chromophane +chromophile +chromophilic +chromophilous +chromophobic +chromophore +chromophoric +chromophorous +chromophotograph +chromophotographic +chromophotography +chromophotolithograph +chromophyll +chromoplasm +chromoplasmic +chromoplast +chromoplastid +chromoprotein +chromopsia +chromoptometer +chromoptometrical +chromosantonin +chromoscope +chromoscopic +chromoscopy +chromosomal +chromosome +chromosphere +chromospheric +chromotherapist +chromotherapy +chromotrope +chromotropic +chromotropism +chromotropy +chromotype +chromotypic +chromotypographic +chromotypography +chromotypy +chromous +chromoxylograph +chromoxylography +chromule +chromy +chromyl +chronal +chronanagram +chronaxia +chronaxie +chronaxy +chronic +chronical +chronically +chronicity +chronicle +chronicler +chronicon +chronisotherm +chronist +chronobarometer +chronocinematography +chronocrator +chronocyclegraph +chronodeik +chronogeneous +chronogenesis +chronogenetic +chronogram +chronogrammatic +chronogrammatical +chronogrammatically +chronogrammatist +chronogrammic +chronograph +chronographer +chronographic +chronographical +chronographically +chronography +chronoisothermal +chronologer +chronologic +chronological +chronologically +chronologist +chronologize +chronology +chronomancy +chronomantic +chronometer +chronometric +chronometrical +chronometrically +chronometry +chrononomy +chronopher +chronophotograph +chronophotographic +chronophotography +Chronos +chronoscope +chronoscopic +chronoscopically +chronoscopy +chronosemic +chronostichon +chronothermal +chronothermometer +chronotropic +chronotropism +Chroococcaceae +chroococcaceous +Chroococcales +chroococcoid +Chroococcus +Chrosperma +chrotta +chrysal +chrysalid +chrysalidal +chrysalides +chrysalidian +chrysaline +chrysalis +chrysaloid +chrysamine +chrysammic +chrysamminic +Chrysamphora +chrysaniline +chrysanisic +chrysanthemin +chrysanthemum +chrysanthous +Chrysaor +chrysarobin +chrysatropic +chrysazin +chrysazol +chryselectrum +chryselephantine +Chrysemys +chrysene +chrysenic +chrysid +Chrysidella +chrysidid +Chrysididae +chrysin +Chrysippus +Chrysis +chrysoaristocracy +Chrysobalanaceae +Chrysobalanus +chrysoberyl +chrysobull +chrysocarpous +chrysochlore +Chrysochloridae +Chrysochloris +chrysochlorous +chrysochrous +chrysocolla +chrysocracy +chrysoeriol +chrysogen +chrysograph +chrysographer +chrysography +chrysohermidin +chrysoidine +chrysolite +chrysolitic +chrysology +Chrysolophus +chrysomelid +Chrysomelidae +chrysomonad +Chrysomonadales +Chrysomonadina +chrysomonadine +Chrysomyia +Chrysopa +chrysopal +chrysopee +chrysophan +chrysophanic +Chrysophanus +chrysophenine +chrysophilist +chrysophilite +Chrysophlyctis +chrysophyll +Chrysophyllum +chrysopid +Chrysopidae +chrysopoeia +chrysopoetic +chrysopoetics +chrysoprase +Chrysops +Chrysopsis +chrysorin +chrysosperm +Chrysosplenium +Chrysothamnus +Chrysothrix +chrysotile +Chrysotis +chrystocrene +chthonian +chthonic +chthonophagia +chthonophagy +chub +chubbed +chubbedness +chubbily +chubbiness +chubby +Chuchona +Chuck +chuck +chucker +chuckhole +chuckies +chucking +chuckingly +chuckle +chucklehead +chuckleheaded +chuckler +chucklingly +chuckrum +chuckstone +chuckwalla +chucky +Chud +chuddar +Chude +Chudic +Chueta +chufa +chuff +chuffy +chug +chugger +chuhra +Chuje +chukar +Chukchi +chukker +chukor +chulan +chullpa +chum +Chumashan +Chumawi +chummage +chummer +chummery +chummily +chummy +chump +chumpaka +chumpish +chumpishness +Chumpivilca +chumpy +chumship +Chumulu +Chun +chun +chunari +Chuncho +chunga +chunk +chunkhead +chunkily +chunkiness +chunky +chunner +chunnia +chunter +chupak +chupon +chuprassie +chuprassy +church +churchanity +churchcraft +churchdom +churchful +churchgoer +churchgoing +churchgrith +churchianity +churchified +churchiness +churching +churchish +churchism +churchite +churchless +churchlet +churchlike +churchliness +churchly +churchman +churchmanly +churchmanship +churchmaster +churchscot +churchward +churchwarden +churchwardenism +churchwardenize +churchwardenship +churchwards +churchway +churchwise +churchwoman +churchy +churchyard +churel +churinga +churl +churled +churlhood +churlish +churlishly +churlishness +churly +churm +churn +churnability +churnful +churning +churnmilk +churnstaff +Churoya +Churoyan +churr +Churrigueresque +churruck +churrus +churrworm +chut +chute +chuter +chutney +Chuvash +Chwana +chyack +chyak +chylaceous +chylangioma +chylaqueous +chyle +chylemia +chylidrosis +chylifaction +chylifactive +chylifactory +chyliferous +chylific +chylification +chylificatory +chyliform +chylify +chylocaulous +chylocauly +chylocele +chylocyst +chyloid +chylomicron +chylopericardium +chylophyllous +chylophylly +chylopoiesis +chylopoietic +chylosis +chylothorax +chylous +chyluria +chymaqueous +chymase +chyme +chymia +chymic +chymiferous +chymification +chymify +chymosin +chymosinogen +chymotrypsin +chymotrypsinogen +chymous +chypre +chytra +chytrid +Chytridiaceae +chytridiaceous +chytridial +Chytridiales +chytridiose +chytridiosis +Chytridium +Chytroi +cibarial +cibarian +cibarious +cibation +cibol +Cibola +Cibolan +Ciboney +cibophobia +ciborium +cibory +ciboule +cicad +cicada +Cicadellidae +cicadid +Cicadidae +cicala +cicatrice +cicatrices +cicatricial +cicatricle +cicatricose +cicatricula +cicatricule +cicatrisive +cicatrix +cicatrizant +cicatrizate +cicatrization +cicatrize +cicatrizer +cicatrose +Cicely +cicely +cicer +ciceronage +cicerone +ciceroni +Ciceronian +Ciceronianism +Ciceronianize +Ciceronic +Ciceronically +ciceronism +ciceronize +cichlid +Cichlidae +cichloid +cichoraceous +Cichoriaceae +cichoriaceous +Cichorium +Cicindela +cicindelid +cicindelidae +cicisbeism +ciclatoun +Ciconia +Ciconiae +ciconian +ciconiid +Ciconiidae +ciconiiform +Ciconiiformes +ciconine +ciconioid +Cicuta +cicutoxin +Cid +cidarid +Cidaridae +cidaris +Cidaroida +cider +ciderish +ciderist +ciderkin +cig +cigala +cigar +cigaresque +cigarette +cigarfish +cigarillo +cigarito +cigarless +cigua +ciguatera +cilectomy +cilia +ciliary +Ciliata +ciliate +ciliated +ciliately +ciliation +cilice +Cilician +cilicious +Cilicism +ciliella +ciliferous +ciliform +ciliiferous +ciliiform +Cilioflagellata +cilioflagellate +ciliograde +ciliolate +ciliolum +Ciliophora +cilioretinal +cilioscleral +ciliospinal +ciliotomy +cilium +cillosis +cimbia +Cimbri +Cimbrian +Cimbric +cimelia +cimex +cimicid +Cimicidae +cimicide +cimiciform +Cimicifuga +cimicifugin +cimicoid +ciminite +cimline +Cimmeria +Cimmerian +Cimmerianism +cimolite +cinch +cincher +cincholoipon +cincholoiponic +cinchomeronic +Cinchona +Cinchonaceae +cinchonaceous +cinchonamine +cinchonate +cinchonia +cinchonic +cinchonicine +cinchonidia +cinchonidine +cinchonine +cinchoninic +cinchonism +cinchonization +cinchonize +cinchonology +cinchophen +cinchotine +cinchotoxine +cincinnal +Cincinnati +Cincinnatia +Cincinnatian +cincinnus +Cinclidae +Cinclidotus +cinclis +Cinclus +cinct +cincture +cinder +Cinderella +cinderlike +cinderman +cinderous +cindery +Cindie +Cindy +cine +cinecamera +cinefilm +cinel +cinema +Cinemascope +cinematic +cinematical +cinematically +cinematize +cinematograph +cinematographer +cinematographic +cinematographical +cinematographically +cinematographist +cinematography +cinemelodrama +cinemize +cinemograph +cinenchyma +cinenchymatous +cinene +cinenegative +cineole +cineolic +cinephone +cinephotomicrography +cineplastics +cineplasty +cineraceous +Cinerama +Cineraria +cinerarium +cinerary +cineration +cinerator +cinerea +cinereal +cinereous +cineritious +cinevariety +cingle +cingular +cingulate +cingulated +cingulum +cinnabar +cinnabaric +cinnabarine +cinnamal +cinnamaldehyde +cinnamate +cinnamein +cinnamene +cinnamenyl +cinnamic +Cinnamodendron +cinnamol +cinnamomic +Cinnamomum +cinnamon +cinnamoned +cinnamonic +cinnamonlike +cinnamonroot +cinnamonwood +cinnamyl +cinnamylidene +cinnoline +cinnyl +cinquain +cinque +cinquecentism +cinquecentist +cinquecento +cinquefoil +cinquefoiled +cinquepace +cinter +Cinura +cinuran +cinurous +cion +cionectomy +cionitis +cionocranial +cionocranian +cionoptosis +cionorrhaphia +cionotome +cionotomy +Cipango +cipher +cipherable +cipherdom +cipherer +cipherhood +cipo +cipolin +cippus +circa +Circaea +Circaeaceae +Circaetus +Circassian +Circassic +Circe +Circean +Circensian +circinal +circinate +circinately +circination +Circinus +circiter +circle +circled +circler +circlet +circlewise +circling +circovarian +circuit +circuitable +circuital +circuiteer +circuiter +circuition +circuitman +circuitor +circuitous +circuitously +circuitousness +circuity +circulable +circulant +circular +circularism +circularity +circularization +circularize +circularizer +circularly +circularness +circularwise +circulate +circulation +circulative +circulator +circulatory +circumagitate +circumagitation +circumambages +circumambagious +circumambience +circumambiency +circumambient +circumambulate +circumambulation +circumambulator +circumambulatory +circumanal +circumantarctic +circumarctic +circumarticular +circumaviate +circumaviation +circumaviator +circumaxial +circumaxile +circumaxillary +circumbasal +circumbendibus +circumboreal +circumbuccal +circumbulbar +circumcallosal +Circumcellion +circumcenter +circumcentral +circumcinct +circumcincture +circumcircle +circumcise +circumciser +circumcision +circumclude +circumclusion +circumcolumnar +circumcone +circumconic +circumcorneal +circumcrescence +circumcrescent +circumdenudation +circumdiction +circumduce +circumduct +circumduction +circumesophagal +circumesophageal +circumference +circumferential +circumferentially +circumferentor +circumflant +circumflect +circumflex +circumflexion +circumfluence +circumfluent +circumfluous +circumforaneous +circumfulgent +circumfuse +circumfusile +circumfusion +circumgenital +circumgyrate +circumgyration +circumgyratory +circumhorizontal +circumincession +circuminsession +circuminsular +circumintestinal +circumitineration +circumjacence +circumjacency +circumjacent +circumlental +circumlitio +circumlittoral +circumlocute +circumlocution +circumlocutional +circumlocutionary +circumlocutionist +circumlocutory +circummeridian +circummeridional +circummigration +circummundane +circummure +circumnatant +circumnavigable +circumnavigate +circumnavigation +circumnavigator +circumnavigatory +circumneutral +circumnuclear +circumnutate +circumnutation +circumnutatory +circumocular +circumoesophagal +circumoral +circumorbital +circumpacific +circumpallial +circumparallelogram +circumpentagon +circumplicate +circumplication +circumpolar +circumpolygon +circumpose +circumposition +circumradius +circumrenal +circumrotate +circumrotation +circumrotatory +circumsail +circumscissile +circumscribable +circumscribe +circumscribed +circumscriber +circumscript +circumscription +circumscriptive +circumscriptively +circumscriptly +circumsinous +circumspangle +circumspatial +circumspect +circumspection +circumspective +circumspectively +circumspectly +circumspectness +circumspheral +circumstance +circumstanced +circumstantiability +circumstantiable +circumstantial +circumstantiality +circumstantially +circumstantialness +circumstantiate +circumstantiation +circumtabular +circumterraneous +circumterrestrial +circumtonsillar +circumtropical +circumumbilical +circumundulate +circumundulation +circumvallate +circumvallation +circumvascular +circumvent +circumventer +circumvention +circumventive +circumventor +circumviate +circumvolant +circumvolute +circumvolution +circumvolutory +circumvolve +circumzenithal +circus +circusy +cirque +cirrate +cirrated +Cirratulidae +Cirratulus +Cirrhopetalum +cirrhosed +cirrhosis +cirrhotic +cirrhous +cirri +cirribranch +cirriferous +cirriform +cirrigerous +cirrigrade +cirriped +Cirripedia +cirripedial +cirrolite +cirropodous +cirrose +Cirrostomi +cirrous +cirrus +cirsectomy +Cirsium +cirsocele +cirsoid +cirsomphalos +cirsophthalmia +cirsotome +cirsotomy +ciruela +cirurgian +Cisalpine +cisalpine +Cisalpinism +cisandine +cisatlantic +cisco +cise +cisele +cisgangetic +cisjurane +cisleithan +cismarine +Cismontane +cismontane +Cismontanism +cisoceanic +cispadane +cisplatine +cispontine +cisrhenane +Cissampelos +cissing +cissoid +cissoidal +Cissus +cist +cista +Cistaceae +cistaceous +cistae +cisted +Cistercian +Cistercianism +cistern +cisterna +cisternal +cistic +cistophoric +cistophorus +Cistudo +Cistus +cistvaen +cit +citable +citadel +citation +citator +citatory +cite +citee +Citellus +citer +citess +cithara +Citharexylum +citharist +citharista +citharoedi +citharoedic +citharoedus +cither +citied +citification +citified +citify +Citigradae +citigrade +citizen +citizendom +citizeness +citizenhood +citizenish +citizenism +citizenize +citizenly +citizenry +citizenship +citole +citraconate +citraconic +citral +citramide +citramontane +citrange +citrangeade +citrate +citrated +citrean +citrene +citreous +citric +citriculture +citriculturist +citril +citrin +citrination +citrine +citrinin +citrinous +citrometer +Citromyces +citron +citronade +citronella +citronellal +citronelle +citronellic +citronellol +citronin +citronwood +Citropsis +citropten +citrous +citrullin +Citrullus +Citrus +citrus +citrylidene +cittern +citua +city +citycism +citydom +cityfolk +cityful +cityish +cityless +cityness +cityscape +cityward +citywards +cive +civet +civetlike +civetone +civic +civically +civicism +civics +civil +civilian +civility +civilizable +civilization +civilizational +civilizatory +civilize +civilized +civilizedness +civilizee +civilizer +civilly +civilness +civism +Civitan +civvy +cixiid +Cixiidae +Cixo +clabber +clabbery +clachan +clack +Clackama +clackdish +clacker +clacket +clackety +clad +cladanthous +cladautoicous +cladding +cladine +cladocarpous +Cladocera +cladoceran +cladocerous +cladode +cladodial +cladodont +cladodontid +Cladodontidae +Cladodus +cladogenous +Cladonia +Cladoniaceae +cladoniaceous +cladonioid +Cladophora +Cladophoraceae +cladophoraceous +Cladophorales +cladophyll +cladophyllum +cladoptosis +cladose +Cladoselache +Cladoselachea +cladoselachian +Cladoselachidae +cladosiphonic +Cladosporium +Cladothrix +Cladrastis +cladus +clag +claggum +claggy +Claiborne +Claibornian +claim +claimable +claimant +claimer +claimless +clairaudience +clairaudient +clairaudiently +clairce +Claire +clairecole +clairecolle +clairschach +clairschacher +clairsentience +clairsentient +clairvoyance +clairvoyancy +clairvoyant +clairvoyantly +claith +claithes +claiver +Clallam +clam +clamant +clamantly +clamative +Clamatores +clamatorial +clamatory +clamb +clambake +clamber +clamberer +clamcracker +clame +clamer +clammed +clammer +clammily +clamminess +clamming +clammish +clammy +clammyweed +clamor +clamorer +clamorist +clamorous +clamorously +clamorousness +clamorsome +clamp +clamper +clamshell +clamworm +clan +clancular +clancularly +clandestine +clandestinely +clandestineness +clandestinity +clanfellow +clang +clangful +clangingly +clangor +clangorous +clangorously +Clangula +clanjamfray +clanjamfrey +clanjamfrie +clanjamphrey +clank +clankety +clanking +clankingly +clankingness +clankless +clanless +clanned +clanning +clannishly +clannishness +clansfolk +clanship +clansman +clansmanship +clanswoman +Claosaurus +clap +clapboard +clapbread +clapmatch +clapnet +clapped +clapper +clapperclaw +clapperclawer +clapperdudgeon +clappermaclaw +clapping +clapt +claptrap +clapwort +claque +claquer +Clara +clarabella +clarain +Clare +Clarence +Clarenceux +Clarenceuxship +Clarencieux +clarendon +claret +Claretian +Claribel +claribella +Clarice +clarifiant +clarification +clarifier +clarify +clarigation +clarin +Clarinda +clarinet +clarinetist +clarinettist +clarion +clarionet +Clarissa +Clarisse +Clarist +clarity +Clark +clark +clarkeite +Clarkia +claro +Claromontane +clarshech +clart +clarty +clary +clash +clasher +clashingly +clashy +clasmatocyte +clasmatosis +clasp +clasper +clasping +claspt +class +classable +classbook +classed +classer +classes +classfellow +classic +classical +classicalism +classicalist +classicality +classicalize +classically +classicalness +classicism +classicist +classicistic +classicize +classicolatry +classifiable +classific +classifically +classification +classificational +classificator +classificatory +classified +classifier +classis +classism +classman +classmanship +classmate +classroom +classwise +classwork +classy +clastic +clat +clatch +Clathraceae +clathraceous +Clathraria +clathrarian +clathrate +Clathrina +Clathrinidae +clathroid +clathrose +clathrulate +Clathrus +Clatsop +clatter +clatterer +clatteringly +clattertrap +clattery +clatty +Claude +claudent +claudetite +Claudia +Claudian +claudicant +claudicate +claudication +Claudio +Claudius +claught +clausal +clause +Clausilia +Clausiliidae +clausthalite +claustra +claustral +claustration +claustrophobia +claustrum +clausula +clausular +clausule +clausure +claut +clava +clavacin +claval +Clavaria +Clavariaceae +clavariaceous +clavate +clavated +clavately +clavation +clave +clavecin +clavecinist +clavel +clavelization +clavelize +clavellate +clavellated +claver +clavial +claviature +clavicembalo +Claviceps +clavichord +clavichordist +clavicithern +clavicle +clavicorn +clavicornate +Clavicornes +Clavicornia +clavicotomy +clavicular +clavicularium +claviculate +claviculus +clavicylinder +clavicymbal +clavicytherium +clavier +clavierist +claviform +claviger +clavigerous +claviharp +clavilux +claviol +clavipectoral +clavis +clavodeltoid +clavodeltoideus +clavola +clavolae +clavolet +clavus +clavy +claw +clawed +clawer +clawk +clawker +clawless +Clay +clay +claybank +claybrained +clayen +clayer +clayey +clayiness +clayish +claylike +clayman +claymore +Clayoquot +claypan +Clayton +Claytonia +clayware +clayweed +cleach +clead +cleaded +cleading +cleam +cleamer +clean +cleanable +cleaner +cleanhanded +cleanhandedness +cleanhearted +cleaning +cleanish +cleanlily +cleanliness +cleanly +cleanness +cleanout +cleansable +cleanse +cleanser +cleansing +cleanskins +cleanup +clear +clearable +clearage +clearance +clearcole +clearedness +clearer +clearheaded +clearheadedly +clearheadedness +clearhearted +clearing +clearinghouse +clearish +clearly +clearness +clearskins +clearstarch +clearweed +clearwing +cleat +cleavability +cleavable +cleavage +cleave +cleaveful +cleavelandite +cleaver +cleavers +cleaverwort +cleaving +cleavingly +cleche +cleck +cled +cledge +cledgy +cledonism +clee +cleek +cleeked +cleeky +clef +cleft +clefted +cleg +cleidagra +cleidarthritis +cleidocostal +cleidocranial +cleidohyoid +cleidomancy +cleidomastoid +cleidorrhexis +cleidoscapular +cleidosternal +cleidotomy +cleidotripsy +cleistocarp +cleistocarpous +cleistogamic +cleistogamically +cleistogamous +cleistogamously +cleistogamy +cleistogene +cleistogenous +cleistogeny +cleistothecium +Cleistothecopsis +cleithral +cleithrum +Clem +clem +Clematis +clematite +Clemclemalats +clemence +clemency +Clement +clement +Clementina +Clementine +clemently +clench +cleoid +Cleome +Cleopatra +clep +Clepsine +clepsydra +cleptobiosis +cleptobiotic +clerestoried +clerestory +clergy +clergyable +clergylike +clergyman +clergywoman +cleric +clerical +clericalism +clericalist +clericality +clericalize +clerically +clericate +clericature +clericism +clericity +clerid +Cleridae +clerihew +clerisy +clerk +clerkage +clerkdom +clerkery +clerkess +clerkhood +clerking +clerkish +clerkless +clerklike +clerkliness +clerkly +clerkship +Clerodendron +cleromancy +cleronomy +cleruch +cleruchial +cleruchic +cleruchy +Clerus +cletch +Clethra +Clethraceae +clethraceous +cleuch +cleve +cleveite +clever +cleverality +cleverish +cleverishly +cleverly +cleverness +clevis +clew +cliack +clianthus +cliche +click +clicker +clicket +clickless +clicky +Clidastes +cliency +client +clientage +cliental +cliented +clientelage +clientele +clientless +clientry +clientship +Cliff +cliff +cliffed +cliffless +clifflet +clifflike +Clifford +cliffside +cliffsman +cliffweed +cliffy +clift +Cliftonia +cliftonite +clifty +clima +Climaciaceae +climaciaceous +Climacium +climacteric +climacterical +climacterically +climactic +climactical +climactically +climacus +climata +climatal +climate +climath +climatic +climatical +climatically +Climatius +climatize +climatographical +climatography +climatologic +climatological +climatologically +climatologist +climatology +climatometer +climatotherapeutics +climatotherapy +climature +climax +climb +climbable +climber +climbing +clime +climograph +clinal +clinamen +clinamina +clinandria +clinandrium +clinanthia +clinanthium +clinch +clincher +clinchingly +clinchingness +cline +cling +clinger +clingfish +clinging +clingingly +clingingness +clingstone +clingy +clinia +clinic +clinical +clinically +clinician +clinicist +clinicopathological +clinium +clink +clinker +clinkerer +clinkery +clinking +clinkstone +clinkum +clinoaxis +clinocephalic +clinocephalism +clinocephalous +clinocephalus +clinocephaly +clinochlore +clinoclase +clinoclasite +clinodiagonal +clinodomatic +clinodome +clinograph +clinographic +clinohedral +clinohedrite +clinohumite +clinoid +clinologic +clinology +clinometer +clinometric +clinometrical +clinometry +clinopinacoid +clinopinacoidal +Clinopodium +clinoprism +clinopyramid +clinopyroxene +clinorhombic +clinospore +clinostat +clinquant +clint +clinting +Clinton +Clintonia +clintonite +clinty +Clio +Cliona +Clione +clip +clipei +clipeus +clippable +clipped +clipper +clipperman +clipping +clips +clipse +clipsheet +clipsome +clipt +clique +cliquedom +cliqueless +cliquish +cliquishly +cliquishness +cliquism +cliquy +cliseometer +clisere +clishmaclaver +Clisiocampa +Clistogastra +clit +clitch +clite +clitella +clitellar +clitelliferous +clitelline +clitellum +clitellus +clites +clithe +clithral +clithridiate +clitia +clition +Clitocybe +Clitoria +clitoridauxe +clitoridean +clitoridectomy +clitoriditis +clitoridotomy +clitoris +clitorism +clitoritis +clitter +clitterclatter +clival +clive +clivers +Clivia +clivis +clivus +cloaca +cloacal +cloacaline +cloacean +cloacinal +cloacinean +cloacitis +cloak +cloakage +cloaked +cloakedly +cloaking +cloakless +cloaklet +cloakmaker +cloakmaking +cloakroom +cloakwise +cloam +cloamen +cloamer +clobber +clobberer +clochan +cloche +clocher +clochette +clock +clockbird +clockcase +clocked +clocker +clockface +clockhouse +clockkeeper +clockless +clocklike +clockmaker +clockmaking +clockmutch +clockroom +clocksmith +clockwise +clockwork +clod +clodbreaker +clodder +cloddily +cloddiness +cloddish +cloddishly +cloddishness +cloddy +clodhead +clodhopper +clodhopping +clodlet +clodpate +clodpated +clodpoll +cloff +clog +clogdogdo +clogger +cloggily +clogginess +cloggy +cloghad +cloglike +clogmaker +clogmaking +clogwood +clogwyn +cloiochoanitic +cloisonless +cloisonne +cloister +cloisteral +cloistered +cloisterer +cloisterless +cloisterlike +cloisterliness +cloisterly +cloisterwise +cloistral +cloistress +cloit +clomb +clomben +clonal +clone +clonic +clonicity +clonicotonic +clonism +clonorchiasis +Clonorchis +Clonothrix +clonus +cloof +cloop +cloot +clootie +clop +cloragen +clorargyrite +cloriodid +closable +close +closecross +closed +closefisted +closefistedly +closefistedness +closehanded +closehearted +closely +closemouth +closemouthed +closen +closeness +closer +closestool +closet +closewing +closh +closish +closter +Closterium +clostridial +Clostridium +closure +clot +clotbur +clote +cloth +clothbound +clothe +clothes +clothesbag +clothesbasket +clothesbrush +clotheshorse +clothesline +clothesman +clothesmonger +clothespin +clothespress +clothesyard +clothier +clothify +Clothilda +clothing +clothmaker +clothmaking +Clotho +clothworker +clothy +clottage +clottedness +clotter +clotty +cloture +clotweed +cloud +cloudage +cloudberry +cloudburst +cloudcap +clouded +cloudful +cloudily +cloudiness +clouding +cloudland +cloudless +cloudlessly +cloudlessness +cloudlet +cloudlike +cloudling +cloudology +cloudscape +cloudship +cloudward +cloudwards +cloudy +clough +clour +clout +clouted +clouter +clouterly +clouty +clove +cloven +clovene +clover +clovered +cloverlay +cloverleaf +cloveroot +cloverroot +clovery +clow +clown +clownade +clownage +clownery +clownheal +clownish +clownishly +clownishness +clownship +clowring +cloy +cloyedness +cloyer +cloying +cloyingly +cloyingness +cloyless +cloysome +club +clubbability +clubbable +clubbed +clubber +clubbily +clubbing +clubbish +clubbism +clubbist +clubby +clubdom +clubfellow +clubfisted +clubfoot +clubfooted +clubhand +clubhaul +clubhouse +clubionid +Clubionidae +clubland +clubman +clubmate +clubmobile +clubmonger +clubridden +clubroom +clubroot +clubstart +clubster +clubweed +clubwoman +clubwood +cluck +clue +cluff +clump +clumpish +clumproot +clumpy +clumse +clumsily +clumsiness +clumsy +clunch +clung +Cluniac +Cluniacensian +Clunisian +Clunist +clunk +clupanodonic +Clupea +clupeid +Clupeidae +clupeiform +clupeine +Clupeodei +clupeoid +cluricaune +Clusia +Clusiaceae +clusiaceous +cluster +clusterberry +clustered +clusterfist +clustering +clusteringly +clustery +clutch +clutchman +cluther +clutter +clutterer +clutterment +cluttery +cly +Clyde +Clydesdale +Clydeside +Clydesider +clyer +clyfaker +clyfaking +Clymenia +clype +clypeal +Clypeaster +Clypeastridea +Clypeastrina +clypeastroid +Clypeastroida +Clypeastroidea +clypeate +clypeiform +clypeolar +clypeolate +clypeole +clypeus +clysis +clysma +clysmian +clysmic +clyster +clysterize +Clytemnestra +cnemapophysis +cnemial +cnemidium +Cnemidophorus +cnemis +Cneoraceae +cneoraceous +Cneorum +cnicin +Cnicus +cnida +Cnidaria +cnidarian +Cnidian +cnidoblast +cnidocell +cnidocil +cnidocyst +cnidophore +cnidophorous +cnidopod +cnidosac +Cnidoscolus +cnidosis +coabode +coabound +coabsume +coacceptor +coacervate +coacervation +coach +coachability +coachable +coachbuilder +coachbuilding +coachee +coacher +coachfellow +coachful +coaching +coachlet +coachmaker +coachmaking +coachman +coachmanship +coachmaster +coachsmith +coachsmithing +coachway +coachwhip +coachwise +coachwoman +coachwork +coachwright +coachy +coact +coaction +coactive +coactively +coactivity +coactor +coadamite +coadapt +coadaptation +coadequate +coadjacence +coadjacency +coadjacent +coadjacently +coadjudicator +coadjust +coadjustment +coadjutant +coadjutator +coadjute +coadjutement +coadjutive +coadjutor +coadjutorship +coadjutress +coadjutrix +coadjuvancy +coadjuvant +coadjuvate +coadminister +coadministration +coadministrator +coadministratrix +coadmiration +coadmire +coadmit +coadnate +coadore +coadsorbent +coadunate +coadunation +coadunative +coadunatively +coadunite +coadventure +coadventurer +coadvice +coaffirmation +coafforest +coaged +coagency +coagent +coaggregate +coaggregated +coaggregation +coagitate +coagitator +coagment +coagonize +coagriculturist +coagula +coagulability +coagulable +coagulant +coagulase +coagulate +coagulation +coagulative +coagulator +coagulatory +coagulin +coagulometer +coagulose +coagulum +Coahuiltecan +coaid +coaita +coak +coakum +coal +coalbag +coalbagger +coalbin +coalbox +coaldealer +coaler +coalesce +coalescence +coalescency +coalescent +coalfish +coalfitter +coalhole +coalification +coalify +Coalite +coalition +coalitional +coalitioner +coalitionist +coalize +coalizer +coalless +coalmonger +coalmouse +coalpit +coalrake +coalsack +coalternate +coalternation +coalternative +coaltitude +coaly +coalyard +coambassador +coambulant +coamiable +coaming +Coan +coanimate +coannex +coannihilate +coapostate +coapparition +coappear +coappearance +coapprehend +coapprentice +coappriser +coapprover +coapt +coaptate +coaptation +coaration +coarb +coarbiter +coarbitrator +coarctate +coarctation +coardent +coarrange +coarrangement +coarse +coarsely +coarsen +coarseness +coarsish +coascend +coassert +coasserter +coassession +coassessor +coassignee +coassist +coassistance +coassistant +coassume +coast +coastal +coastally +coaster +Coastguard +coastguardman +coasting +coastland +coastman +coastside +coastwaiter +coastward +coastwards +coastways +coastwise +coat +coated +coatee +coater +coati +coatie +coatimondie +coatimundi +coating +coatless +coatroom +coattail +coattailed +coattend +coattest +coattestation +coattestator +coaudience +coauditor +coaugment +coauthor +coauthority +coauthorship +coawareness +coax +coaxal +coaxation +coaxer +coaxial +coaxially +coaxing +coaxingly +coaxy +cob +cobaea +cobalt +cobaltammine +cobaltic +cobalticyanic +cobalticyanides +cobaltiferous +cobaltinitrite +cobaltite +cobaltocyanic +cobaltocyanide +cobaltous +cobang +cobbed +cobber +cobberer +cobbing +cobble +cobbler +cobblerfish +cobblerism +cobblerless +cobblership +cobblery +cobblestone +cobbling +cobbly +cobbra +cobby +cobcab +Cobdenism +Cobdenite +cobego +cobelief +cobeliever +cobelligerent +cobenignity +coberger +cobewail +cobhead +cobia +cobiron +cobishop +Cobitidae +Cobitis +coble +cobleman +Coblentzian +Cobleskill +cobless +cobloaf +cobnut +cobola +coboundless +cobourg +cobra +cobreathe +cobridgehead +cobriform +cobrother +cobstone +coburg +coburgess +coburgher +coburghership +Cobus +cobweb +cobwebbery +cobwebbing +cobwebby +cobwork +coca +cocaceous +cocaine +cocainism +cocainist +cocainization +cocainize +cocainomania +cocainomaniac +Cocama +Cocamama +cocamine +Cocanucos +cocarboxylase +cocash +cocashweed +cocause +cocautioner +Coccaceae +coccagee +coccal +Cocceian +Cocceianism +coccerin +cocci +coccid +Coccidae +coccidia +coccidial +coccidian +Coccidiidea +coccidioidal +Coccidioides +Coccidiomorpha +coccidiosis +coccidium +coccidology +cocciferous +cocciform +coccigenic +coccinella +coccinellid +Coccinellidae +coccionella +cocco +coccobacillus +coccochromatic +Coccogonales +coccogone +Coccogoneae +coccogonium +coccoid +coccolite +coccolith +coccolithophorid +Coccolithophoridae +Coccoloba +Coccolobis +Coccomyces +coccosphere +coccostean +coccosteid +Coccosteidae +Coccosteus +Coccothraustes +coccothraustine +Coccothrinax +coccous +coccule +cocculiferous +Cocculus +cocculus +coccus +coccydynia +coccygalgia +coccygeal +coccygean +coccygectomy +coccygerector +coccyges +coccygeus +coccygine +coccygodynia +coccygomorph +Coccygomorphae +coccygomorphic +coccygotomy +coccyodynia +coccyx +Coccyzus +cocentric +cochairman +cochal +cochief +Cochin +cochineal +cochlea +cochlear +cochleare +Cochlearia +cochlearifoliate +cochleariform +cochleate +cochleated +cochleiform +cochleitis +cochleous +cochlidiid +Cochlidiidae +cochliodont +Cochliodontidae +Cochliodus +Cochlospermaceae +cochlospermaceous +Cochlospermum +Cochranea +cochurchwarden +cocillana +cocircular +cocircularity +cocitizen +cocitizenship +cock +cockade +cockaded +Cockaigne +cockal +cockalorum +cockamaroo +cockarouse +cockateel +cockatoo +cockatrice +cockawee +cockbell +cockbill +cockbird +cockboat +cockbrain +cockchafer +cockcrow +cockcrower +cockcrowing +cocked +Cocker +cocker +cockerel +cockermeg +cockernony +cocket +cockeye +cockeyed +cockfight +cockfighting +cockhead +cockhorse +cockieleekie +cockily +cockiness +cocking +cockish +cockle +cockleboat +cocklebur +cockled +cockler +cockleshell +cocklet +cocklewife +cocklight +cockling +cockloft +cockly +cockmaster +cockmatch +cockmate +cockneian +cockneity +cockney +cockneybred +cockneydom +cockneyese +cockneyess +cockneyfication +cockneyfy +cockneyish +cockneyishly +cockneyism +cockneyize +cockneyland +cockneyship +cockpit +cockroach +cockscomb +cockscombed +cocksfoot +cockshead +cockshot +cockshut +cockshy +cockshying +cockspur +cockstone +cocksure +cocksuredom +cocksureism +cocksurely +cocksureness +cocksurety +cocktail +cockthrowing +cockup +cockweed +cocky +Cocle +coco +cocoa +cocoach +cocobolo +Coconino +coconnection +coconqueror +coconscious +coconsciously +coconsciousness +coconsecrator +coconspirator +coconstituent +cocontractor +Coconucan +Coconuco +coconut +cocoon +cocoonery +cocorico +cocoroot +Cocos +cocotte +cocovenantor +cocowood +cocowort +cocozelle +cocreate +cocreator +cocreatorship +cocreditor +cocrucify +coctile +coction +coctoantigen +coctoprecipitin +cocuisa +cocullo +cocurator +cocurrent +cocuswood +cocuyo +Cocytean +Cocytus +cod +coda +codamine +codbank +codder +codding +coddle +coddler +code +codebtor +codeclination +codecree +codefendant +codeine +codeless +codelight +codelinquency +codelinquent +codenization +codeposit +coder +coderive +codescendant +codespairer +codex +codfish +codfisher +codfishery +codger +codhead +codheaded +Codiaceae +codiaceous +Codiaeum +Codiales +codical +codices +codicil +codicilic +codicillary +codictatorship +codification +codifier +codify +codilla +codille +codiniac +codirectional +codirector +codiscoverer +codisjunct +codist +Codium +codivine +codling +codman +codo +codol +codomestication +codominant +codon +codpiece +codpitchings +Codrus +codshead +codworm +coe +coecal +coecum +coed +coeditor +coeditorship +coeducate +coeducation +coeducational +coeducationalism +coeducationalize +coeducationally +coeffect +coefficacy +coefficient +coefficiently +coeffluent +coeffluential +coelacanth +coelacanthid +Coelacanthidae +coelacanthine +Coelacanthini +coelacanthoid +coelacanthous +coelanaglyphic +coelar +coelarium +Coelastraceae +coelastraceous +Coelastrum +Coelata +coelder +coeldership +Coelebogyne +coelect +coelection +coelector +coelectron +coelelminth +Coelelminthes +coelelminthic +Coelentera +Coelenterata +coelenterate +coelenteric +coelenteron +coelestine +coelevate +coelho +coelia +coeliac +coelialgia +coelian +Coelicolae +Coelicolist +coeligenous +coelin +coeline +coeliomyalgia +coeliorrhea +coeliorrhoea +coelioscopy +coeliotomy +coeloblastic +coeloblastula +Coelococcus +coelodont +coelogastrula +Coeloglossum +Coelogyne +coelom +coeloma +Coelomata +coelomate +coelomatic +coelomatous +coelomesoblast +coelomic +Coelomocoela +coelomopore +coelonavigation +coelongated +coeloplanula +coelosperm +coelospermous +coelostat +coelozoic +coemanate +coembedded +coembody +coembrace +coeminency +coemperor +coemploy +coemployee +coemployment +coempt +coemption +coemptional +coemptionator +coemptive +coemptor +coenact +coenactor +coenaculous +coenamor +coenamorment +coenamourment +coenanthium +coendear +Coendidae +Coendou +coendure +coenenchym +coenenchyma +coenenchymal +coenenchymatous +coenenchyme +coenesthesia +coenesthesis +coenflame +coengage +coengager +coenjoy +coenobe +coenobiar +coenobic +coenobioid +coenobium +coenoblast +coenoblastic +coenocentrum +coenocyte +coenocytic +coenodioecism +coenoecial +coenoecic +coenoecium +coenogamete +coenomonoecism +coenosarc +coenosarcal +coenosarcous +coenosite +coenospecies +coenospecific +coenospecifically +coenosteal +coenosteum +coenotrope +coenotype +coenotypic +coenthrone +coenurus +coenzyme +coequal +coequality +coequalize +coequally +coequalness +coequate +coequated +coequation +coerce +coercement +coercer +coercibility +coercible +coercibleness +coercibly +coercion +coercionary +coercionist +coercitive +coercive +coercively +coerciveness +coercivity +Coerebidae +coeruleolactite +coessential +coessentiality +coessentially +coessentialness +coestablishment +coestate +coetaneity +coetaneous +coetaneously +coetaneousness +coeternal +coeternally +coeternity +coetus +coeval +coevality +coevally +coexchangeable +coexclusive +coexecutant +coexecutor +coexecutrix +coexert +coexertion +coexist +coexistence +coexistency +coexistent +coexpand +coexpanded +coexperiencer +coexpire +coexplosion +coextend +coextension +coextensive +coextensively +coextensiveness +coextent +cofactor +Cofane +cofaster +cofather +cofathership +cofeature +cofeoffee +coferment +cofermentation +coff +Coffea +coffee +coffeebush +coffeecake +coffeegrower +coffeegrowing +coffeehouse +coffeeleaf +coffeepot +coffeeroom +coffeetime +coffeeweed +coffeewood +coffer +cofferdam +cofferer +cofferfish +coffering +cofferlike +cofferwork +coffin +coffinless +coffinmaker +coffinmaking +coffle +coffret +cofighter +coforeknown +coformulator +cofounder +cofoundress +cofreighter +coft +cofunction +cog +cogence +cogency +cogener +cogeneric +cogent +cogently +cogged +cogger +coggie +cogging +coggle +coggledy +cogglety +coggly +coghle +cogitability +cogitable +cogitabund +cogitabundity +cogitabundly +cogitabundous +cogitant +cogitantly +cogitate +cogitatingly +cogitation +cogitative +cogitatively +cogitativeness +cogitativity +cogitator +coglorify +coglorious +cogman +cognac +cognate +cognateness +cognatic +cognatical +cognation +cognisable +cognisance +cognition +cognitional +cognitive +cognitively +cognitum +cognizability +cognizable +cognizableness +cognizably +cognizance +cognizant +cognize +cognizee +cognizer +cognizor +cognomen +cognominal +cognominate +cognomination +cognosce +cognoscent +cognoscibility +cognoscible +cognoscitive +cognoscitively +cogon +cogonal +cogovernment +cogovernor +cogracious +cograil +cogrediency +cogredient +cogroad +Cogswellia +coguarantor +coguardian +cogue +cogway +cogwheel +cogwood +cohabit +cohabitancy +cohabitant +cohabitation +coharmonious +coharmoniously +coharmonize +coheartedness +coheir +coheiress +coheirship +cohelper +cohelpership +Cohen +cohenite +coherald +cohere +coherence +coherency +coherent +coherently +coherer +coheretic +coheritage +coheritor +cohesibility +cohesible +cohesion +cohesive +cohesively +cohesiveness +cohibit +cohibition +cohibitive +cohibitor +coho +cohoba +cohobate +cohobation +cohobator +cohol +cohort +cohortation +cohortative +cohosh +cohune +cohusband +coidentity +coif +coifed +coiffure +coign +coigue +coil +coiled +coiler +coiling +coilsmith +coimmense +coimplicant +coimplicate +coimplore +coin +coinable +coinage +coincide +coincidence +coincidency +coincident +coincidental +coincidentally +coincidently +coincider +coinclination +coincline +coinclude +coincorporate +coindicant +coindicate +coindication +coindwelling +coiner +coinfeftment +coinfer +coinfinite +coinfinity +coinhabit +coinhabitant +coinhabitor +coinhere +coinherence +coinherent +coinheritance +coinheritor +coining +coinitial +coinmaker +coinmaking +coinmate +coinspire +coinstantaneity +coinstantaneous +coinstantaneously +coinstantaneousness +coinsurance +coinsure +cointense +cointension +cointensity +cointer +cointerest +cointersecting +cointise +Cointreau +coinventor +coinvolve +coiny +coir +coislander +coistrel +coistril +coital +coition +coiture +coitus +Coix +cojudge +cojuror +cojusticiar +coke +cokelike +cokeman +coker +cokernut +cokery +coking +coky +col +Cola +cola +colaborer +Colada +colalgia +Colan +colander +colane +colarin +colate +colation +colatitude +colatorium +colature +colauxe +colback +colberter +colbertine +Colbertism +colcannon +Colchian +Colchicaceae +colchicine +Colchicum +Colchis +colchyte +Colcine +colcothar +cold +colder +coldfinch +coldhearted +coldheartedly +coldheartedness +coldish +coldly +coldness +coldproof +coldslaw +Cole +cole +coleader +colecannon +colectomy +Coleen +colegatee +colegislator +colemanite +colemouse +Coleochaetaceae +coleochaetaceous +Coleochaete +Coleophora +Coleophoridae +coleopter +Coleoptera +coleopteral +coleopteran +coleopterist +coleopteroid +coleopterological +coleopterology +coleopteron +coleopterous +coleoptile +coleoptilum +coleorhiza +Coleosporiaceae +Coleosporium +coleplant +coleseed +coleslaw +colessee +colessor +coletit +coleur +Coleus +colewort +coli +Colias +colibacillosis +colibacterin +colibri +colic +colical +colichemarde +colicky +colicolitis +colicroot +colicweed +colicwort +colicystitis +colicystopyelitis +coliform +Coliidae +Coliiformes +colilysin +Colima +colima +Colin +colin +colinear +colinephritis +coling +Colinus +coliplication +colipuncture +colipyelitis +colipyuria +colisepsis +Coliseum +coliseum +colitic +colitis +colitoxemia +coliuria +Colius +colk +coll +Colla +collaborate +collaboration +collaborationism +collaborationist +collaborative +collaboratively +collaborator +collage +collagen +collagenic +collagenous +collapse +collapsibility +collapsible +collar +collarband +collarbird +collarbone +collard +collare +collared +collaret +collarino +collarless +collarman +collatable +collate +collatee +collateral +collaterality +collaterally +collateralness +collation +collationer +collatitious +collative +collator +collatress +collaud +collaudation +colleague +colleagueship +collect +collectability +collectable +collectanea +collectarium +collected +collectedly +collectedness +collectibility +collectible +collection +collectional +collectioner +collective +collectively +collectiveness +collectivism +collectivist +collectivistic +collectivistically +collectivity +collectivization +collectivize +collector +collectorate +collectorship +collectress +colleen +collegatary +college +colleger +collegial +collegialism +collegiality +collegian +collegianer +Collegiant +collegiate +collegiately +collegiateness +collegiation +collegium +Collembola +collembolan +collembole +collembolic +collembolous +collenchyma +collenchymatic +collenchymatous +collenchyme +collencytal +collencyte +Colleri +Colleries +Collery +collery +collet +colleter +colleterial +colleterium +Colletes +Colletia +colletic +Colletidae +colletin +Colletotrichum +colletside +colley +collibert +colliculate +colliculus +collide +collidine +collie +collied +collier +colliery +collieshangie +colliform +colligate +colligation +colligative +colligible +collimate +collimation +collimator +Collin +collin +collinal +colline +collinear +collinearity +collinearly +collineate +collineation +colling +collingly +collingual +Collins +collins +Collinsia +collinsite +Collinsonia +colliquate +colliquation +colliquative +colliquativeness +collision +collisional +collisive +colloblast +collobrierite +collocal +Collocalia +collocate +collocation +collocationable +collocative +collocatory +collochemistry +collochromate +collock +collocution +collocutor +collocutory +collodiochloride +collodion +collodionization +collodionize +collodiotype +collodium +collogue +colloid +colloidal +colloidality +colloidize +colloidochemical +Collomia +collop +colloped +collophanite +collophore +colloque +colloquia +colloquial +colloquialism +colloquialist +colloquiality +colloquialize +colloquially +colloquialness +colloquist +colloquium +colloquize +colloquy +collothun +collotype +collotypic +collotypy +colloxylin +colluctation +collude +colluder +collum +collumelliaceous +collusion +collusive +collusively +collusiveness +collutorium +collutory +colluvial +colluvies +colly +collyba +Collybia +Collyridian +collyrite +collyrium +collywest +collyweston +collywobbles +colmar +colobin +colobium +coloboma +Colobus +Colocasia +colocentesis +Colocephali +colocephalous +coloclysis +colocola +colocolic +colocynth +colocynthin +colodyspepsia +coloenteritis +cologarithm +Cologne +cololite +Colombian +colombier +colombin +Colombina +colometric +colometrically +colometry +colon +colonalgia +colonate +colonel +colonelcy +colonelship +colongitude +colonial +colonialism +colonialist +colonialize +colonially +colonialness +colonic +colonist +colonitis +colonizability +colonizable +colonization +colonizationist +colonize +colonizer +colonnade +colonnaded +colonnette +colonopathy +colonopexy +colonoscope +colonoscopy +colony +colopexia +colopexotomy +colopexy +colophane +colophany +colophene +colophenic +colophon +colophonate +Colophonian +colophonic +colophonist +colophonite +colophonium +colophony +coloplication +coloproctitis +coloptosis +colopuncture +coloquintid +coloquintida +color +colorability +colorable +colorableness +colorably +Coloradan +Colorado +colorado +coloradoite +colorant +colorate +coloration +colorational +colorationally +colorative +coloratura +colorature +colorcast +colorectitis +colorectostomy +colored +colorer +colorfast +colorful +colorfully +colorfulness +colorific +colorifics +colorimeter +colorimetric +colorimetrical +colorimetrically +colorimetrics +colorimetrist +colorimetry +colorin +coloring +colorist +coloristic +colorization +colorize +colorless +colorlessly +colorlessness +colormaker +colormaking +colorman +colorrhaphy +colors +colortype +Colorum +colory +coloss +colossal +colossality +colossally +colossean +Colosseum +colossi +Colossian +Colossochelys +colossus +Colossuswise +colostomy +colostral +colostration +colostric +colostrous +colostrum +colotomy +colotyphoid +colove +colp +colpenchyma +colpeo +colpeurynter +colpeurysis +colpindach +colpitis +colpocele +colpocystocele +colpohyperplasia +colpohysterotomy +colpoperineoplasty +colpoperineorrhaphy +colpoplastic +colpoplasty +colpoptosis +colporrhagia +colporrhaphy +colporrhea +colporrhexis +colport +colportage +colporter +colporteur +colposcope +colposcopy +colpotomy +colpus +Colt +colt +colter +colthood +coltish +coltishly +coltishness +coltpixie +coltpixy +coltsfoot +coltskin +Coluber +colubrid +Colubridae +colubriform +Colubriformes +Colubriformia +Colubrina +Colubrinae +colubrine +colubroid +colugo +Columba +columbaceous +Columbae +Columban +Columbanian +columbarium +columbary +columbate +columbeion +Columbella +Columbia +columbiad +Columbian +columbic +Columbid +Columbidae +columbier +columbiferous +Columbiformes +columbin +Columbine +columbine +columbite +columbium +columbo +columboid +columbotantalate +columbotitanate +columella +columellar +columellate +Columellia +Columelliaceae +columelliform +column +columnal +columnar +columnarian +columnarity +columnated +columned +columner +columniation +columniferous +columniform +columning +columnist +columnization +columnwise +colunar +colure +Colutea +Colville +coly +Colymbidae +colymbiform +colymbion +Colymbriformes +Colymbus +colyone +colyonic +colytic +colyum +colyumist +colza +coma +comacine +comagistracy +comagmatic +comaker +comal +comamie +Coman +Comanche +Comanchean +Comandra +comanic +comart +Comarum +comate +comatose +comatosely +comatoseness +comatosity +comatous +comatula +comatulid +comb +combaron +combat +combatable +combatant +combater +combative +combatively +combativeness +combativity +combed +comber +combfish +combflower +combinable +combinableness +combinant +combinantive +combinate +combination +combinational +combinative +combinator +combinatorial +combinatory +combine +combined +combinedly +combinedness +combinement +combiner +combing +combining +comble +combless +comblessness +combmaker +combmaking +comboloio +comboy +Combretaceae +combretaceous +Combretum +combure +comburendo +comburent +comburgess +comburimeter +comburimetry +comburivorous +combust +combustibility +combustible +combustibleness +combustibly +combustion +combustive +combustor +combwise +combwright +comby +come +comeback +Comecrudo +comedial +comedian +comediant +comedic +comedical +comedienne +comedietta +comedist +comedo +comedown +comedy +comelily +comeliness +comeling +comely +comendite +comenic +comephorous +comer +comes +comestible +comet +cometarium +cometary +comether +cometic +cometical +cometlike +cometographer +cometographical +cometography +cometoid +cometology +cometwise +comeuppance +comfit +comfiture +comfort +comfortable +comfortableness +comfortably +comforter +comfortful +comforting +comfortingly +comfortless +comfortlessly +comfortlessness +comfortress +comfortroot +comfrey +comfy +Comiakin +comic +comical +comicality +comically +comicalness +comicocratic +comicocynical +comicodidactic +comicography +comicoprosaic +comicotragedy +comicotragic +comicotragical +comicry +Comid +comiferous +Cominform +coming +comingle +comino +Comintern +comism +comital +comitant +comitatensian +comitative +comitatus +comitia +comitial +Comitium +comitragedy +comity +comma +command +commandable +commandant +commandedness +commandeer +commander +commandership +commandery +commanding +commandingly +commandingness +commandless +commandment +commando +commandoman +commandress +commassation +commassee +commatic +commation +commatism +commeasurable +commeasure +commeddle +Commelina +Commelinaceae +commelinaceous +commemorable +commemorate +commemoration +commemorational +commemorative +commemoratively +commemorativeness +commemorator +commemoratory +commemorize +commence +commenceable +commencement +commencer +commend +commendable +commendableness +commendably +commendador +commendam +commendatary +commendation +commendator +commendatory +commender +commendingly +commendment +commensal +commensalism +commensalist +commensalistic +commensality +commensally +commensurability +commensurable +commensurableness +commensurably +commensurate +commensurately +commensurateness +commensuration +comment +commentarial +commentarialism +commentary +commentate +commentation +commentator +commentatorial +commentatorially +commentatorship +commenter +commerce +commerceless +commercer +commerciable +commercial +commercialism +commercialist +commercialistic +commerciality +commercialization +commercialize +commercially +commercium +commerge +commie +comminate +commination +comminative +comminator +comminatory +commingle +comminglement +commingler +comminister +comminuate +comminute +comminution +comminutor +Commiphora +commiserable +commiserate +commiseratingly +commiseration +commiserative +commiseratively +commiserator +commissar +commissarial +commissariat +commissary +commissaryship +commission +commissionaire +commissional +commissionate +commissioner +commissionership +commissionship +commissive +commissively +commissural +commissure +commissurotomy +commit +commitment +committable +committal +committee +committeeism +committeeman +committeeship +committeewoman +committent +committer +committible +committor +commix +commixt +commixtion +commixture +commodatary +commodate +commodation +commodatum +commode +commodious +commodiously +commodiousness +commoditable +commodity +commodore +common +commonable +commonage +commonality +commonalty +commoner +commonership +commoney +commonish +commonition +commonize +commonly +commonness +commonplace +commonplaceism +commonplacely +commonplaceness +commonplacer +commons +commonsensible +commonsensibly +commonsensical +commonsensically +commonty +commonweal +commonwealth +commonwealthism +commorancy +commorant +commorient +commorth +commot +commotion +commotional +commotive +commove +communa +communal +communalism +communalist +communalistic +communality +communalization +communalize +communalizer +communally +communard +commune +communer +communicability +communicable +communicableness +communicably +communicant +communicate +communicatee +communicating +communication +communicative +communicatively +communicativeness +communicator +communicatory +communion +communionist +communique +communism +communist +communistery +communistic +communistically +communital +communitarian +communitary +communitive +communitorium +community +communization +communize +commutability +commutable +commutableness +commutant +commutate +commutation +commutative +commutatively +commutator +commute +commuter +commuting +commutual +commutuality +Comnenian +comoid +comolecule +comortgagee +comose +comourn +comourner +comournful +comous +Comox +compact +compacted +compactedly +compactedness +compacter +compactible +compaction +compactly +compactness +compactor +compacture +compages +compaginate +compagination +companator +companion +companionability +companionable +companionableness +companionably +companionage +companionate +companionize +companionless +companionship +companionway +company +comparability +comparable +comparableness +comparably +comparascope +comparate +comparatival +comparative +comparatively +comparativeness +comparativist +comparator +compare +comparer +comparison +comparition +comparograph +compart +compartition +compartment +compartmental +compartmentalization +compartmentalize +compartmentally +compartmentize +compass +compassable +compasser +compasses +compassing +compassion +compassionable +compassionate +compassionately +compassionateness +compassionless +compassive +compassivity +compassless +compaternity +compatibility +compatible +compatibleness +compatibly +compatriot +compatriotic +compatriotism +compear +compearance +compearant +compeer +compel +compellable +compellably +compellation +compellative +compellent +compeller +compelling +compellingly +compend +compendency +compendent +compendia +compendiary +compendiate +compendious +compendiously +compendiousness +compendium +compenetrate +compenetration +compensable +compensate +compensating +compensatingly +compensation +compensational +compensative +compensativeness +compensator +compensatory +compense +compenser +compesce +compete +competence +competency +competent +competently +competentness +competition +competitioner +competitive +competitively +competitiveness +competitor +competitorship +competitory +competitress +competitrix +compilation +compilator +compilatory +compile +compilement +compiler +compital +Compitalia +compitum +complacence +complacency +complacent +complacential +complacentially +complacently +complain +complainable +complainant +complainer +complainingly +complainingness +complaint +complaintive +complaintiveness +complaisance +complaisant +complaisantly +complaisantness +complanar +complanate +complanation +complect +complected +complement +complemental +complementally +complementalness +complementariness +complementarism +complementary +complementation +complementative +complementer +complementoid +complete +completedness +completely +completement +completeness +completer +completion +completive +completively +completory +complex +complexedness +complexification +complexify +complexion +complexionably +complexional +complexionally +complexioned +complexionist +complexionless +complexity +complexively +complexly +complexness +complexus +compliable +compliableness +compliably +compliance +compliancy +compliant +compliantly +complicacy +complicant +complicate +complicated +complicatedly +complicatedness +complication +complicative +complice +complicitous +complicity +complier +compliment +complimentable +complimental +complimentally +complimentalness +complimentarily +complimentariness +complimentary +complimentation +complimentative +complimenter +complimentingly +complin +complot +complotter +Complutensian +compluvium +comply +compo +compoer +compole +compone +componed +componency +componendo +component +componental +componented +compony +comport +comportment +compos +compose +composed +composedly +composedness +composer +composita +Compositae +composite +compositely +compositeness +composition +compositional +compositionally +compositive +compositively +compositor +compositorial +compositous +composograph +compossibility +compossible +compost +composture +composure +compotation +compotationship +compotator +compotatory +compote +compotor +compound +compoundable +compoundedness +compounder +compounding +compoundness +comprachico +comprador +comprecation +compreg +compregnate +comprehend +comprehender +comprehendible +comprehendingly +comprehense +comprehensibility +comprehensible +comprehensibleness +comprehensibly +comprehension +comprehensive +comprehensively +comprehensiveness +comprehensor +compresbyter +compresbyterial +compresence +compresent +compress +compressed +compressedly +compressibility +compressible +compressibleness +compressingly +compression +compressional +compressive +compressively +compressometer +compressor +compressure +comprest +compriest +comprisable +comprisal +comprise +comprised +compromise +compromiser +compromising +compromisingly +compromissary +compromission +compromissorial +compromit +compromitment +comprovincial +Compsilura +Compsoa +Compsognathus +Compsothlypidae +compter +Comptometer +Comptonia +comptroller +comptrollership +compulsative +compulsatively +compulsatorily +compulsatory +compulsed +compulsion +compulsitor +compulsive +compulsively +compulsiveness +compulsorily +compulsoriness +compulsory +compunction +compunctionary +compunctionless +compunctious +compunctiously +compunctive +compurgation +compurgator +compurgatorial +compurgatory +compursion +computability +computable +computably +computation +computational +computative +computativeness +compute +computer +computist +computus +comrade +comradely +comradery +comradeship +Comsomol +comstockery +Comtian +Comtism +Comtist +comurmurer +Comus +con +conacaste +conacre +conal +conalbumin +conamed +Conant +conarial +conarium +conation +conational +conationalistic +conative +conatus +conaxial +concamerate +concamerated +concameration +concanavalin +concaptive +concassation +concatenary +concatenate +concatenation +concatenator +concausal +concause +concavation +concave +concavely +concaveness +concaver +concavity +conceal +concealable +concealed +concealedly +concealedness +concealer +concealment +concede +conceded +concededly +conceder +conceit +conceited +conceitedly +conceitedness +conceitless +conceity +conceivability +conceivable +conceivableness +conceivably +conceive +conceiver +concelebrate +concelebration +concent +concenter +concentive +concentralization +concentrate +concentrated +concentration +concentrative +concentrativeness +concentrator +concentric +concentrically +concentricity +concentual +concentus +concept +conceptacle +conceptacular +conceptaculum +conception +conceptional +conceptionist +conceptism +conceptive +conceptiveness +conceptual +conceptualism +conceptualist +conceptualistic +conceptuality +conceptualization +conceptualize +conceptually +conceptus +concern +concerned +concernedly +concernedness +concerning +concerningly +concerningness +concernment +concert +concerted +concertedly +concertgoer +concertina +concertinist +concertist +concertize +concertizer +concertmaster +concertmeister +concertment +concerto +concertstuck +concessible +concession +concessionaire +concessional +concessionary +concessioner +concessionist +concessive +concessively +concessiveness +concessor +concettism +concettist +conch +concha +conchal +conchate +conche +conched +concher +Conchifera +conchiferous +conchiform +conchinine +conchiolin +conchitic +conchitis +Conchobor +conchoid +conchoidal +conchoidally +conchological +conchologically +conchologist +conchologize +conchology +conchometer +conchometry +Conchostraca +conchotome +Conchubar +Conchucu +conchuela +conchy +conchyliated +conchyliferous +conchylium +concierge +concile +conciliable +conciliabule +conciliabulum +conciliar +conciliate +conciliating +conciliatingly +conciliation +conciliationist +conciliative +conciliator +conciliatorily +conciliatoriness +conciliatory +concilium +concinnity +concinnous +concionator +concipiency +concipient +concise +concisely +conciseness +concision +conclamant +conclamation +conclave +conclavist +concludable +conclude +concluder +concluding +concludingly +conclusion +conclusional +conclusionally +conclusive +conclusively +conclusiveness +conclusory +concoagulate +concoagulation +concoct +concocter +concoction +concoctive +concoctor +concolor +concolorous +concomitance +concomitancy +concomitant +concomitantly +conconscious +Concord +concord +concordal +concordance +concordancer +concordant +concordantial +concordantly +concordat +concordatory +concorder +concordial +concordist +concordity +concorporate +Concorrezanes +concourse +concreate +concremation +concrement +concresce +concrescence +concrescible +concrescive +concrete +concretely +concreteness +concreter +concretion +concretional +concretionary +concretism +concretive +concretively +concretize +concretor +concubinage +concubinal +concubinarian +concubinary +concubinate +concubine +concubinehood +concubitancy +concubitant +concubitous +concubitus +concupiscence +concupiscent +concupiscible +concupiscibleness +concupy +concur +concurrence +concurrency +concurrent +concurrently +concurrentness +concurring +concurringly +concursion +concurso +concursus +concuss +concussant +concussion +concussional +concussive +concutient +concyclic +concyclically +cond +Condalia +condemn +condemnable +condemnably +condemnate +condemnation +condemnatory +condemned +condemner +condemning +condemningly +condensability +condensable +condensance +condensary +condensate +condensation +condensational +condensative +condensator +condense +condensed +condensedly +condensedness +condenser +condensery +condensity +condescend +condescendence +condescendent +condescender +condescending +condescendingly +condescendingness +condescension +condescensive +condescensively +condescensiveness +condiction +condictious +condiddle +condiddlement +condign +condigness +condignity +condignly +condiment +condimental +condimentary +condisciple +condistillation +condite +condition +conditional +conditionalism +conditionalist +conditionality +conditionalize +conditionally +conditionate +conditioned +conditioner +condivision +condolatory +condole +condolement +condolence +condolent +condoler +condoling +condolingly +condominate +condominium +condonable +condonance +condonation +condonative +condone +condonement +condoner +condor +conduce +conducer +conducing +conducingly +conducive +conduciveness +conduct +conductance +conductibility +conductible +conductility +conductimeter +conductio +conduction +conductional +conductitious +conductive +conductively +conductivity +conductometer +conductometric +conductor +conductorial +conductorless +conductorship +conductory +conductress +conductus +conduit +conduplicate +conduplicated +conduplication +condurangin +condurango +condylar +condylarth +Condylarthra +condylarthrosis +condylarthrous +condyle +condylectomy +condylion +condyloid +condyloma +condylomatous +condylome +condylopod +Condylopoda +condylopodous +condylos +condylotomy +Condylura +condylure +cone +coned +coneen +coneflower +conehead +coneighboring +coneine +conelet +conemaker +conemaking +Conemaugh +conenose +conepate +coner +cones +conessine +Conestoga +confab +confabular +confabulate +confabulation +confabulator +confabulatory +confact +confarreate +confarreation +confated +confect +confection +confectionary +confectioner +confectionery +Confed +confederacy +confederal +confederalist +confederate +confederater +confederatio +confederation +confederationist +confederatism +confederative +confederatize +confederator +confelicity +conferee +conference +conferential +conferment +conferrable +conferral +conferrer +conferruminate +conferted +Conferva +Confervaceae +confervaceous +conferval +Confervales +confervoid +Confervoideae +confervous +confess +confessable +confessant +confessarius +confessary +confessedly +confesser +confessing +confessingly +confession +confessional +confessionalian +confessionalism +confessionalist +confessionary +confessionist +confessor +confessorship +confessory +confidant +confide +confidence +confidency +confident +confidential +confidentiality +confidentially +confidentialness +confidentiary +confidently +confidentness +confider +confiding +confidingly +confidingness +configural +configurate +configuration +configurational +configurationally +configurationism +configurationist +configurative +configure +confinable +confine +confineable +confined +confinedly +confinedness +confineless +confinement +confiner +confining +confinity +confirm +confirmable +confirmand +confirmation +confirmative +confirmatively +confirmatorily +confirmatory +confirmed +confirmedly +confirmedness +confirmee +confirmer +confirming +confirmingly +confirmity +confirmment +confirmor +confiscable +confiscatable +confiscate +confiscation +confiscator +confiscatory +confitent +confiteor +confiture +confix +conflagrant +conflagrate +conflagration +conflagrative +conflagrator +conflagratory +conflate +conflated +conflation +conflict +conflicting +conflictingly +confliction +conflictive +conflictory +conflow +confluence +confluent +confluently +conflux +confluxibility +confluxible +confluxibleness +confocal +conform +conformability +conformable +conformableness +conformably +conformal +conformance +conformant +conformate +conformation +conformator +conformer +conformist +conformity +confound +confoundable +confounded +confoundedly +confoundedness +confounder +confounding +confoundingly +confrater +confraternal +confraternity +confraternization +confrere +confriar +confrication +confront +confrontal +confrontation +confronte +confronter +confrontment +Confucian +Confucianism +Confucianist +confusability +confusable +confusably +confuse +confused +confusedly +confusedness +confusingly +confusion +confusional +confusticate +confustication +confutable +confutation +confutative +confutator +confute +confuter +conga +congeable +congeal +congealability +congealable +congealableness +congealedness +congealer +congealment +congee +congelation +congelative +congelifraction +congeliturbate +congeliturbation +congener +congeneracy +congeneric +congenerical +congenerous +congenerousness +congenetic +congenial +congeniality +congenialize +congenially +congenialness +congenital +congenitally +congenitalness +conger +congeree +congest +congested +congestible +congestion +congestive +congiary +congius +conglobate +conglobately +conglobation +conglobe +conglobulate +conglomerate +conglomeratic +conglomeration +conglutin +conglutinant +conglutinate +conglutination +conglutinative +Congo +Congoese +Congolese +Congoleum +congou +congratulable +congratulant +congratulate +congratulation +congratulational +congratulator +congratulatory +congredient +congreet +congregable +congreganist +congregant +congregate +congregation +congregational +congregationalism +Congregationalist +congregationalize +congregationally +Congregationer +congregationist +congregative +congregativeness +congregator +Congreso +congress +congresser +congressional +congressionalist +congressionally +congressionist +congressist +congressive +congressman +Congresso +congresswoman +Congreve +Congridae +congroid +congruence +congruency +congruent +congruential +congruently +congruism +congruist +congruistic +congruity +congruous +congruously +congruousness +conhydrine +Coniacian +conic +conical +conicality +conically +conicalness +coniceine +conichalcite +conicine +conicity +conicle +conicoid +conicopoly +conics +Conidae +conidia +conidial +conidian +conidiiferous +conidioid +conidiophore +conidiophorous +conidiospore +conidium +conifer +Coniferae +coniferin +coniferophyte +coniferous +conification +coniform +Conilurus +conima +conimene +conin +conine +Coniogramme +Coniophora +Coniopterygidae +Conioselinum +coniosis +Coniothyrium +coniroster +conirostral +Conirostres +Conium +conject +conjective +conjecturable +conjecturably +conjectural +conjecturalist +conjecturality +conjecturally +conjecture +conjecturer +conjobble +conjoin +conjoined +conjoinedly +conjoiner +conjoint +conjointly +conjointment +conjointness +conjubilant +conjugable +conjugacy +conjugal +Conjugales +conjugality +conjugally +conjugant +conjugata +Conjugatae +conjugate +conjugated +conjugately +conjugateness +conjugation +conjugational +conjugationally +conjugative +conjugator +conjugial +conjugium +conjunct +conjunction +conjunctional +conjunctionally +conjunctiva +conjunctival +conjunctive +conjunctively +conjunctiveness +conjunctivitis +conjunctly +conjunctur +conjunctural +conjuncture +conjuration +conjurator +conjure +conjurement +conjurer +conjurership +conjuror +conjury +conk +conkanee +conker +conkers +conky +conn +connach +Connaraceae +connaraceous +connarite +Connarus +connascency +connascent +connatal +connate +connately +connateness +connation +connatural +connaturality +connaturalize +connaturally +connaturalness +connature +connaught +connect +connectable +connectant +connected +connectedly +connectedness +connectible +connection +connectional +connectival +connective +connectively +connectivity +connector +connellite +conner +connex +connexion +connexionalism +connexity +connexive +connexivum +connexus +Connie +conning +conniption +connivance +connivancy +connivant +connivantly +connive +connivent +conniver +Connochaetes +connoissance +connoisseur +connoisseurship +connotation +connotative +connotatively +connote +connotive +connotively +connubial +connubiality +connubially +connubiate +connubium +connumerate +connumeration +Conocarpus +Conocephalum +Conocephalus +conoclinium +conocuneus +conodont +conoid +conoidal +conoidally +conoidic +conoidical +conoidically +Conolophus +conominee +cononintelligent +Conopholis +conopid +Conopidae +conoplain +conopodium +Conopophaga +Conopophagidae +Conor +Conorhinus +conormal +conoscope +conourish +Conoy +conphaseolin +conplane +conquedle +conquer +conquerable +conquerableness +conqueress +conquering +conqueringly +conquerment +conqueror +conquest +conquian +conquinamine +conquinine +conquistador +Conrad +conrector +conrectorship +conred +Conringia +consanguine +consanguineal +consanguinean +consanguineous +consanguineously +consanguinity +conscience +conscienceless +consciencelessly +consciencelessness +consciencewise +conscient +conscientious +conscientiously +conscientiousness +conscionable +conscionableness +conscionably +conscious +consciously +consciousness +conscribe +conscript +conscription +conscriptional +conscriptionist +conscriptive +consecrate +consecrated +consecratedness +consecrater +consecration +consecrative +consecrator +consecratory +consectary +consecute +consecution +consecutive +consecutively +consecutiveness +consecutives +consenescence +consenescency +consension +consensual +consensually +consensus +consent +consentable +consentaneity +consentaneous +consentaneously +consentaneousness +consentant +consenter +consentful +consentfully +consentience +consentient +consentiently +consenting +consentingly +consentingness +consentive +consentively +consentment +consequence +consequency +consequent +consequential +consequentiality +consequentially +consequentialness +consequently +consertal +conservable +conservacy +conservancy +conservant +conservate +conservation +conservational +conservationist +conservatism +conservatist +conservative +conservatively +conservativeness +conservatize +conservatoire +conservator +conservatorio +conservatorium +conservatorship +conservatory +conservatrix +conserve +conserver +consider +considerability +considerable +considerableness +considerably +considerance +considerate +considerately +considerateness +consideration +considerative +consideratively +considerativeness +considerator +considered +considerer +considering +consideringly +consign +consignable +consignatary +consignation +consignatory +consignee +consigneeship +consigner +consignificant +consignificate +consignification +consignificative +consignificator +consignify +consignment +consignor +consiliary +consilience +consilient +consimilar +consimilarity +consimilate +consist +consistence +consistency +consistent +consistently +consistorial +consistorian +consistory +consociate +consociation +consociational +consociationism +consociative +consocies +consol +consolable +consolableness +consolably +Consolamentum +consolation +Consolato +consolatorily +consolatoriness +consolatory +consolatrix +console +consolement +consoler +consolidant +consolidate +consolidated +consolidation +consolidationist +consolidative +consolidator +consoling +consolingly +consolute +consomme +consonance +consonancy +consonant +consonantal +consonantic +consonantism +consonantize +consonantly +consonantness +consonate +consonous +consort +consortable +consorter +consortial +consortion +consortism +consortium +consortship +consound +conspecies +conspecific +conspectus +consperse +conspersion +conspicuity +conspicuous +conspicuously +conspicuousness +conspiracy +conspirant +conspiration +conspirative +conspirator +conspiratorial +conspiratorially +conspiratory +conspiratress +conspire +conspirer +conspiring +conspiringly +conspue +constable +constablery +constableship +constabless +constablewick +constabular +constabulary +Constance +constancy +constant +constantan +Constantine +Constantinian +Constantinopolitan +constantly +constantness +constat +constatation +constate +constatory +constellate +constellation +constellatory +consternate +consternation +constipate +constipation +constituency +constituent +constituently +constitute +constituter +constitution +constitutional +constitutionalism +constitutionalist +constitutionality +constitutionalization +constitutionalize +constitutionally +constitutionary +constitutioner +constitutionist +constitutive +constitutively +constitutiveness +constitutor +constrain +constrainable +constrained +constrainedly +constrainedness +constrainer +constraining +constrainingly +constrainment +constraint +constrict +constricted +constriction +constrictive +constrictor +constringe +constringency +constringent +construability +construable +construct +constructer +constructible +construction +constructional +constructionally +constructionism +constructionist +constructive +constructively +constructiveness +constructivism +constructivist +constructor +constructorship +constructure +construe +construer +constuprate +constupration +consubsist +consubsistency +consubstantial +consubstantialism +consubstantialist +consubstantiality +consubstantially +consubstantiate +consubstantiation +consubstantiationist +consubstantive +consuete +consuetitude +consuetude +consuetudinal +consuetudinary +consul +consulage +consular +consularity +consulary +consulate +consulship +consult +consultable +consultant +consultary +consultation +consultative +consultatory +consultee +consulter +consulting +consultive +consultively +consultor +consultory +consumable +consume +consumedly +consumeless +consumer +consuming +consumingly +consumingness +consummate +consummately +consummation +consummative +consummatively +consummativeness +consummator +consummatory +consumpt +consumpted +consumptible +consumption +consumptional +consumptive +consumptively +consumptiveness +consumptivity +consute +contabescence +contabescent +contact +contactor +contactual +contactually +contagion +contagioned +contagionist +contagiosity +contagious +contagiously +contagiousness +contagium +contain +containable +container +containment +contakion +contaminable +contaminant +contaminate +contamination +contaminative +contaminator +contaminous +contangential +contango +conte +contect +contection +contemn +contemner +contemnible +contemnibly +contemning +contemningly +contemnor +contemper +contemperate +contemperature +contemplable +contemplamen +contemplant +contemplate +contemplatingly +contemplation +contemplatist +contemplative +contemplatively +contemplativeness +contemplator +contemplature +contemporanean +contemporaneity +contemporaneous +contemporaneously +contemporaneousness +contemporarily +contemporariness +contemporary +contemporize +contempt +contemptful +contemptibility +contemptible +contemptibleness +contemptibly +contemptuous +contemptuously +contemptuousness +contendent +contender +contending +contendingly +contendress +content +contentable +contented +contentedly +contentedness +contentful +contention +contentional +contentious +contentiously +contentiousness +contentless +contently +contentment +contentness +contents +conter +conterminal +conterminant +contermine +conterminous +conterminously +conterminousness +contest +contestable +contestableness +contestably +contestant +contestation +contestee +contester +contestingly +contestless +context +contextive +contextual +contextually +contextural +contexture +contextured +conticent +contignation +contiguity +contiguous +contiguously +contiguousness +continence +continency +continent +continental +Continentaler +continentalism +continentalist +continentality +Continentalize +continentally +continently +contingence +contingency +contingent +contingential +contingentialness +contingently +contingentness +continuable +continual +continuality +continually +continualness +continuance +continuancy +continuando +continuant +continuantly +continuate +continuately +continuateness +continuation +continuative +continuatively +continuativeness +continuator +continue +continued +continuedly +continuedness +continuer +continuingly +continuist +continuity +continuous +continuously +continuousness +continuum +contise +contline +conto +contorniate +contorsive +contort +Contortae +contorted +contortedly +contortedness +contortion +contortional +contortionate +contortioned +contortionist +contortionistic +contortive +contour +contourne +contra +contraband +contrabandage +contrabandery +contrabandism +contrabandist +contrabandista +contrabass +contrabassist +contrabasso +contracapitalist +contraception +contraceptionist +contraceptive +contracivil +contraclockwise +contract +contractable +contractant +contractation +contracted +contractedly +contractedness +contractee +contracter +contractibility +contractible +contractibleness +contractibly +contractile +contractility +contraction +contractional +contractionist +contractive +contractively +contractiveness +contractor +contractual +contractually +contracture +contractured +contradebt +contradict +contradictable +contradictedness +contradicter +contradiction +contradictional +contradictious +contradictiously +contradictiousness +contradictive +contradictively +contradictiveness +contradictor +contradictorily +contradictoriness +contradictory +contradiscriminate +contradistinct +contradistinction +contradistinctive +contradistinctively +contradistinctly +contradistinguish +contradivide +contrafacture +contrafagotto +contrafissura +contraflexure +contraflow +contrafocal +contragredience +contragredient +contrahent +contrail +contraindicate +contraindication +contraindicative +contralateral +contralto +contramarque +contranatural +contrantiscion +contraoctave +contraparallelogram +contraplex +contrapolarization +contrapone +contraponend +Contraposaune +contrapose +contraposit +contraposita +contraposition +contrapositive +contraprogressist +contraprop +contraproposal +contraption +contraptious +contrapuntal +contrapuntalist +contrapuntally +contrapuntist +contrapunto +contrarational +contraregular +contraregularity +contraremonstrance +contraremonstrant +contrarevolutionary +contrariant +contrariantly +contrariety +contrarily +contrariness +contrarious +contrariously +contrariousness +contrariwise +contrarotation +contrary +contrascriptural +contrast +contrastable +contrastably +contrastedly +contrastimulant +contrastimulation +contrastimulus +contrastingly +contrastive +contrastively +contrastment +contrasty +contrasuggestible +contratabular +contrate +contratempo +contratenor +contravalence +contravallation +contravariant +contravene +contravener +contravention +contraversion +contravindicate +contravindication +contrawise +contrayerva +contrectation +contreface +contrefort +contretemps +contributable +contribute +contribution +contributional +contributive +contributively +contributiveness +contributor +contributorial +contributorship +contributory +contrite +contritely +contriteness +contrition +contriturate +contrivance +contrivancy +contrive +contrivement +contriver +control +controllability +controllable +controllableness +controllably +controller +controllership +controlless +controllingly +controlment +controversial +controversialism +controversialist +controversialize +controversially +controversion +controversional +controversionalism +controversionalist +controversy +controvert +controverter +controvertible +controvertibly +controvertist +contubernal +contubernial +contubernium +contumacious +contumaciously +contumaciousness +contumacity +contumacy +contumelious +contumeliously +contumeliousness +contumely +contund +conturbation +contuse +contusion +contusioned +contusive +conubium +Conularia +conumerary +conumerous +conundrum +conundrumize +conurbation +conure +Conuropsis +Conurus +conus +conusable +conusance +conusant +conusee +conusor +conutrition +conuzee +conuzor +convalesce +convalescence +convalescency +convalescent +convalescently +convallamarin +Convallaria +Convallariaceae +convallariaceous +convallarin +convect +convection +convectional +convective +convectively +convector +convenable +convenably +convene +convenee +convener +convenership +convenience +conveniency +convenient +conveniently +convenientness +convent +conventical +conventically +conventicle +conventicler +conventicular +convention +conventional +conventionalism +conventionalist +conventionality +conventionalization +conventionalize +conventionally +conventionary +conventioner +conventionism +conventionist +conventionize +conventual +conventually +converge +convergement +convergence +convergency +convergent +convergescence +converging +conversable +conversableness +conversably +conversance +conversancy +conversant +conversantly +conversation +conversationable +conversational +conversationalist +conversationally +conversationism +conversationist +conversationize +conversative +converse +conversely +converser +conversibility +conversible +conversion +conversional +conversionism +conversionist +conversive +convert +converted +convertend +converter +convertibility +convertible +convertibleness +convertibly +converting +convertingness +convertise +convertism +convertite +convertive +convertor +conveth +convex +convexed +convexedly +convexedness +convexity +convexly +convexness +convey +conveyable +conveyal +conveyance +conveyancer +conveyancing +conveyer +convict +convictable +conviction +convictional +convictism +convictive +convictively +convictiveness +convictment +convictor +convince +convinced +convincedly +convincedness +convincement +convincer +convincibility +convincible +convincing +convincingly +convincingness +convival +convive +convivial +convivialist +conviviality +convivialize +convivially +convocant +convocate +convocation +convocational +convocationally +convocationist +convocative +convocator +convoke +convoker +Convoluta +convolute +convoluted +convolutely +convolution +convolutional +convolutionary +convolutive +convolve +convolvement +Convolvulaceae +convolvulaceous +convolvulad +convolvuli +convolvulic +convolvulin +convolvulinic +convolvulinolic +Convolvulus +convoy +convulsant +convulse +convulsedly +convulsibility +convulsible +convulsion +convulsional +convulsionary +convulsionism +convulsionist +convulsive +convulsively +convulsiveness +cony +conycatcher +conyrine +coo +cooba +coodle +cooee +cooer +coof +Coohee +cooing +cooingly +cooja +cook +cookable +cookbook +cookdom +cookee +cookeite +cooker +cookery +cookhouse +cooking +cookish +cookishly +cookless +cookmaid +cookout +cookroom +cookshack +cookshop +cookstove +cooky +cool +coolant +coolen +cooler +coolerman +coolheaded +coolheadedly +coolheadedness +coolhouse +coolibah +coolie +cooling +coolingly +coolingness +coolish +coolly +coolness +coolth +coolung +coolweed +coolwort +cooly +coom +coomb +coomy +coon +cooncan +coonily +cooniness +coonroot +coonskin +coontail +coontie +coony +coop +cooper +cooperage +Cooperia +coopering +coopery +cooree +Coorg +coorie +cooruptibly +Coos +cooser +coost +Coosuc +coot +cooter +cootfoot +coothay +cootie +cop +copa +copable +copacetic +copaene +copaiba +copaibic +Copaifera +Copaiva +copaivic +copaiye +copal +copalche +copalcocote +copaliferous +copalite +copalm +coparallel +coparcenary +coparcener +coparceny +coparent +copart +copartaker +copartner +copartnership +copartnery +coparty +copassionate +copastor +copastorate +copatain +copatentee +copatriot +copatron +copatroness +cope +Copehan +copei +Copelata +Copelatae +copelate +copellidine +copeman +copemate +copen +copending +copenetrate +Copeognatha +copepod +Copepoda +copepodan +copepodous +coper +coperception +coperiodic +Copernican +Copernicanism +Copernicia +coperta +copesman +copesmate +copestone +copetitioner +cophasal +Cophetua +cophosis +copiability +copiable +copiapite +copied +copier +copilot +coping +copiopia +copiopsia +copiosity +copious +copiously +copiousness +copis +copist +copita +coplaintiff +coplanar +coplanarity +copleased +coplotter +coploughing +coplowing +copolar +copolymer +copolymerization +copolymerize +coppaelite +copped +copper +copperas +copperbottom +copperer +copperhead +copperheadism +coppering +copperish +copperization +copperize +copperleaf +coppernose +coppernosed +copperplate +copperproof +coppersidesman +copperskin +coppersmith +coppersmithing +copperware +copperwing +copperworks +coppery +copperytailed +coppet +coppice +coppiced +coppicing +coppin +copping +copple +copplecrown +coppled +coppy +copr +copra +coprecipitate +coprecipitation +copremia +copremic +copresbyter +copresence +copresent +Coprides +Coprinae +coprincipal +coprincipate +Coprinus +coprisoner +coprodaeum +coproduce +coproducer +coprojector +coprolagnia +coprolagnist +coprolalia +coprolaliac +coprolite +coprolith +coprolitic +coprology +copromisor +copromoter +coprophagan +coprophagia +coprophagist +coprophagous +coprophagy +coprophilia +coprophiliac +coprophilic +coprophilism +coprophilous +coprophyte +coproprietor +coproprietorship +coprose +Coprosma +coprostasis +coprosterol +coprozoic +copse +copsewood +copsewooded +copsing +copsy +Copt +copter +Coptic +Coptis +copula +copulable +copular +copularium +copulate +copulation +copulative +copulatively +copulatory +copunctal +copurchaser +copus +copy +copybook +copycat +copygraph +copygraphed +copyhold +copyholder +copyholding +copyism +copyist +copyman +copyreader +copyright +copyrightable +copyrighter +copywise +coque +coquecigrue +coquelicot +coqueluche +coquet +coquetoon +coquetry +coquette +coquettish +coquettishly +coquettishness +coquicken +coquilla +Coquille +coquille +coquimbite +coquina +coquita +Coquitlam +coquito +cor +Cora +cora +Corabeca +Corabecan +corach +Coraciae +coracial +Coracias +Coracii +Coraciidae +coraciiform +Coraciiformes +coracine +coracle +coracler +coracoacromial +coracobrachial +coracobrachialis +coracoclavicular +coracocostal +coracohumeral +coracohyoid +coracoid +coracoidal +coracomandibular +coracomorph +Coracomorphae +coracomorphic +coracopectoral +coracoprocoracoid +coracoradialis +coracoscapular +coracovertebral +coradical +coradicate +corah +coraise +coral +coralberry +coralbush +coraled +coralflower +coralist +corallet +Corallian +corallic +Corallidae +corallidomous +coralliferous +coralliform +Coralligena +coralligenous +coralligerous +corallike +Corallina +Corallinaceae +corallinaceous +coralline +corallite +Corallium +coralloid +coralloidal +Corallorhiza +corallum +Corallus +coralroot +coralwort +coram +Corambis +coranto +corban +corbeau +corbeil +corbel +corbeling +corbicula +corbiculate +corbiculum +corbie +corbiestep +corbovinum +corbula +corcass +Corchorus +corcir +corcopali +Corcyraean +cord +cordage +Cordaitaceae +cordaitaceous +cordaitalean +Cordaitales +cordaitean +Cordaites +cordant +cordate +cordately +cordax +Cordeau +corded +cordel +Cordelia +Cordelier +cordeliere +cordelle +corder +Cordery +cordewane +Cordia +cordial +cordiality +cordialize +cordially +cordialness +cordiceps +cordicole +cordierite +cordies +cordiform +cordigeri +cordillera +cordilleran +cordiner +cording +cordite +corditis +cordleaf +cordmaker +cordoba +cordon +cordonnet +Cordovan +Cordula +corduroy +corduroyed +cordwain +cordwainer +cordwainery +cordwood +cordy +Cordyceps +cordyl +Cordylanthus +Cordyline +core +corebel +coreceiver +coreciprocal +corectome +corectomy +corector +cored +coredeem +coredeemer +coredemptress +coreductase +Coree +coreflexed +coregence +coregency +coregent +coregnancy +coregnant +coregonid +Coregonidae +coregonine +coregonoid +Coregonus +coreid +Coreidae +coreign +coreigner +corejoice +coreless +coreligionist +corella +corelysis +Corema +coremaker +coremaking +coremium +coremorphosis +corenounce +coreometer +Coreopsis +coreplastic +coreplasty +corer +coresidence +coresidual +coresign +coresonant +coresort +corespect +corespondency +corespondent +coretomy +coreveler +coreveller +corevolve +Corey +corf +Corfiote +Corflambo +corge +corgi +coriaceous +corial +coriamyrtin +coriander +coriandrol +Coriandrum +Coriaria +Coriariaceae +coriariaceous +coriin +Corimelaena +Corimelaenidae +Corin +corindon +Corineus +coring +Corinna +corinne +Corinth +Corinthian +Corinthianesque +Corinthianism +Corinthianize +Coriolanus +coriparian +corium +Corixa +Corixidae +cork +corkage +corkboard +corke +corked +corker +corkiness +corking +corkish +corkite +corkmaker +corkmaking +corkscrew +corkscrewy +corkwing +corkwood +corky +corm +Cormac +cormel +cormidium +cormoid +Cormophyta +cormophyte +cormophytic +cormorant +cormous +cormus +corn +Cornaceae +cornaceous +cornage +cornbell +cornberry +cornbin +cornbinks +cornbird +cornbole +cornbottle +cornbrash +corncake +corncob +corncracker +corncrib +corncrusher +corndodger +cornea +corneagen +corneal +cornein +corneitis +cornel +Cornelia +cornelian +Cornelius +cornemuse +corneocalcareous +corneosclerotic +corneosiliceous +corneous +corner +cornerbind +cornered +cornerer +cornerpiece +cornerstone +cornerways +cornerwise +cornet +cornetcy +cornettino +cornettist +corneule +corneum +cornfield +cornfloor +cornflower +corngrower +cornhouse +cornhusk +cornhusker +cornhusking +cornic +cornice +cornicle +corniculate +corniculer +corniculum +Corniferous +cornific +cornification +cornified +corniform +cornigerous +cornin +corning +corniplume +Cornish +Cornishman +cornland +cornless +cornloft +cornmaster +cornmonger +cornopean +cornpipe +cornrick +cornroot +cornstalk +cornstarch +cornstook +cornu +cornual +cornuate +cornuated +cornubianite +cornucopia +Cornucopiae +cornucopian +cornucopiate +cornule +cornulite +Cornulites +cornupete +Cornus +cornute +cornuted +cornutine +cornuto +cornwallis +cornwallite +corny +coroa +Coroado +corocleisis +corodiary +corodiastasis +corodiastole +corody +corol +corolla +corollaceous +corollarial +corollarially +corollary +corollate +corollated +corolliferous +corolliform +corollike +corolline +corollitic +corometer +corona +coronach +coronad +coronadite +coronae +coronagraph +coronagraphic +coronal +coronale +coronaled +coronally +coronamen +coronary +coronate +coronated +coronation +coronatorial +coroner +coronership +coronet +coroneted +coronetted +coronetty +coroniform +Coronilla +coronillin +coronion +coronitis +coronium +coronize +coronobasilar +coronofacial +coronofrontal +coronoid +Coronopus +coronule +coroparelcysis +coroplast +coroplasta +coroplastic +Coropo +coroscopy +corotomy +corozo +corp +corpora +corporal +corporalism +corporality +corporally +corporalship +corporas +corporate +corporately +corporateness +corporation +corporational +corporationer +corporationism +corporative +corporator +corporature +corporeal +corporealist +corporeality +corporealization +corporealize +corporeally +corporealness +corporeals +corporeity +corporeous +corporification +corporify +corporosity +corposant +corps +corpsbruder +corpse +corpsman +corpulence +corpulency +corpulent +corpulently +corpulentness +corpus +corpuscle +corpuscular +corpuscularian +corpuscularity +corpusculated +corpuscule +corpusculous +corpusculum +corrade +corradial +corradiate +corradiation +corral +corrasion +corrasive +Correa +correal +correality +correct +correctable +correctant +corrected +correctedness +correctible +correcting +correctingly +correction +correctional +correctionalist +correctioner +correctitude +corrective +correctively +correctiveness +correctly +correctness +corrector +correctorship +correctress +correctrice +corregidor +correlatable +correlate +correlated +correlation +correlational +correlative +correlatively +correlativeness +correlativism +correlativity +correligionist +corrente +correption +corresol +correspond +correspondence +correspondency +correspondent +correspondential +correspondentially +correspondently +correspondentship +corresponder +corresponding +correspondingly +corresponsion +corresponsive +corresponsively +corridor +corridored +corrie +Corriedale +corrige +corrigenda +corrigendum +corrigent +corrigibility +corrigible +corrigibleness +corrigibly +Corrigiola +Corrigiolaceae +corrival +corrivality +corrivalry +corrivalship +corrivate +corrivation +corrobboree +corroborant +corroborate +corroboration +corroborative +corroboratively +corroborator +corroboratorily +corroboratory +corroboree +corrode +corrodent +Corrodentia +corroder +corrodiary +corrodibility +corrodible +corrodier +corroding +corrosibility +corrosible +corrosibleness +corrosion +corrosional +corrosive +corrosively +corrosiveness +corrosivity +corrugate +corrugated +corrugation +corrugator +corrupt +corrupted +corruptedly +corruptedness +corrupter +corruptful +corruptibility +corruptible +corruptibleness +corrupting +corruptingly +corruption +corruptionist +corruptive +corruptively +corruptly +corruptness +corruptor +corruptress +corsac +corsage +corsaint +corsair +corse +corselet +corsepresent +corsesque +corset +corseting +corsetless +corsetry +Corsican +corsie +corsite +corta +Cortaderia +cortege +Cortes +cortex +cortez +cortical +cortically +corticate +corticated +corticating +cortication +cortices +corticiferous +corticiform +corticifugal +corticifugally +corticipetal +corticipetally +Corticium +corticoafferent +corticoefferent +corticoline +corticopeduncular +corticose +corticospinal +corticosterone +corticostriate +corticous +cortin +cortina +cortinarious +Cortinarius +cortinate +cortisone +cortlandtite +Corton +coruco +coruler +Coruminacan +corundophilite +corundum +corupay +coruscant +coruscate +coruscation +corver +corvette +corvetto +Corvidae +corviform +corvillosum +corvina +Corvinae +corvine +corvoid +Corvus +Cory +Corybant +Corybantian +corybantiasm +Corybantic +corybantic +Corybantine +corybantish +corybulbin +corybulbine +corycavamine +corycavidin +corycavidine +corycavine +Corycia +Corycian +corydalin +corydaline +Corydalis +corydine +Corydon +coryl +Corylaceae +corylaceous +corylin +Corylopsis +Corylus +corymb +corymbed +corymbiate +corymbiated +corymbiferous +corymbiform +corymbose +corymbous +corynebacterial +Corynebacterium +Coryneum +corynine +Corynocarpaceae +corynocarpaceous +Corynocarpus +Corypha +Coryphaena +coryphaenid +Coryphaenidae +coryphaenoid +Coryphaenoididae +coryphaeus +coryphee +coryphene +Coryphodon +coryphodont +coryphylly +corytuberine +coryza +cos +cosalite +cosaque +cosavior +coscet +Coscinodiscaceae +Coscinodiscus +coscinomancy +coscoroba +coseasonal +coseat +cosec +cosecant +cosech +cosectarian +cosectional +cosegment +coseism +coseismal +coseismic +cosenator +cosentiency +cosentient +coservant +cosession +coset +cosettler +cosh +cosharer +cosheath +cosher +cosherer +coshering +coshery +cosignatory +cosigner +cosignitary +cosily +cosinage +cosine +cosiness +cosingular +cosinusoid +Cosmati +cosmecology +cosmesis +cosmetic +cosmetical +cosmetically +cosmetician +cosmetiste +cosmetological +cosmetologist +cosmetology +cosmic +cosmical +cosmicality +cosmically +cosmism +cosmist +cosmocracy +cosmocrat +cosmocratic +cosmogenesis +cosmogenetic +cosmogenic +cosmogeny +cosmogonal +cosmogoner +cosmogonic +cosmogonical +cosmogonist +cosmogonize +cosmogony +cosmographer +cosmographic +cosmographical +cosmographically +cosmographist +cosmography +cosmolabe +cosmolatry +cosmologic +cosmological +cosmologically +cosmologist +cosmology +cosmometry +cosmopathic +cosmoplastic +cosmopoietic +cosmopolicy +cosmopolis +cosmopolitan +cosmopolitanism +cosmopolitanization +cosmopolitanize +cosmopolitanly +cosmopolite +cosmopolitic +cosmopolitical +cosmopolitics +cosmopolitism +cosmorama +cosmoramic +cosmorganic +cosmos +cosmoscope +cosmosophy +cosmosphere +cosmotellurian +cosmotheism +cosmotheist +cosmotheistic +cosmothetic +cosmotron +cosmozoan +cosmozoic +cosmozoism +cosonant +cosounding +cosovereign +cosovereignty +cospecies +cospecific +cosphered +cosplendor +cosplendour +coss +Cossack +Cossaean +cossas +cosse +cosset +cossette +cossid +Cossidae +cossnent +cossyrite +cost +costa +Costaea +costal +costalgia +costally +costander +Costanoan +costar +costard +Costata +costate +costated +costean +costeaning +costectomy +costellate +coster +costerdom +costermonger +costicartilage +costicartilaginous +costicervical +costiferous +costiform +costing +costipulator +costispinal +costive +costively +costiveness +costless +costlessness +costliness +costly +costmary +costoabdominal +costoapical +costocentral +costochondral +costoclavicular +costocolic +costocoracoid +costodiaphragmatic +costogenic +costoinferior +costophrenic +costopleural +costopneumopexy +costopulmonary +costoscapular +costosternal +costosuperior +costothoracic +costotome +costotomy +costotrachelian +costotransversal +costotransverse +costovertebral +costoxiphoid +costraight +costrel +costula +costulation +costume +costumer +costumery +costumic +costumier +costumiere +costuming +costumist +costusroot +cosubject +cosubordinate +cosuffer +cosufferer +cosuggestion +cosuitor +cosurety +cosustain +coswearer +cosy +cosymmedian +cot +cotangent +cotangential +cotarius +cotarnine +cotch +cote +coteful +coteline +coteller +cotemporane +cotemporanean +cotemporaneous +cotemporaneously +cotemporary +cotenancy +cotenant +cotenure +coterell +coterie +coterminous +Cotesian +coth +cothamore +cothe +cotheorist +cothish +cothon +cothurn +cothurnal +cothurnate +cothurned +cothurnian +cothurnus +cothy +cotidal +cotillage +cotillion +Cotinga +cotingid +Cotingidae +cotingoid +Cotinus +cotise +cotitular +cotland +cotman +coto +cotoin +Cotonam +Cotoneaster +cotonier +cotorment +cotoro +cotorture +Cotoxo +cotquean +cotraitor +cotransfuse +cotranslator +cotranspire +cotransubstantiate +cotrine +cotripper +cotrustee +cotset +cotsetla +cotsetle +cotta +cottabus +cottage +cottaged +cottager +cottagers +cottagey +cotte +cotted +cotter +cotterel +cotterite +cotterway +cottid +Cottidae +cottier +cottierism +cottiform +cottoid +cotton +cottonade +cottonbush +cottonee +cottoneer +cottoner +Cottonian +cottonization +cottonize +cottonless +cottonmouth +cottonocracy +Cottonopolis +cottonseed +cottontail +cottontop +cottonweed +cottonwood +cottony +Cottus +cotty +cotuit +cotula +cotunnite +Coturnix +cotutor +cotwin +cotwinned +cotwist +cotyla +cotylar +cotyledon +cotyledonal +cotyledonar +cotyledonary +cotyledonous +cotyliform +cotyligerous +cotyliscus +cotyloid +Cotylophora +cotylophorous +cotylopubic +cotylosacral +cotylosaur +Cotylosauria +cotylosaurian +cotype +Cotys +Cotyttia +couac +coucal +couch +couchancy +couchant +couched +couchee +coucher +couching +couchmaker +couchmaking +couchmate +couchy +coude +coudee +coue +Coueism +cougar +cough +cougher +coughroot +coughweed +coughwort +cougnar +coul +could +couldron +coulee +coulisse +coulomb +coulometer +coulterneb +coulure +couma +coumalic +coumalin +coumara +coumaran +coumarate +coumaric +coumarilic +coumarin +coumarinic +coumarone +coumarou +Coumarouna +council +councilist +councilman +councilmanic +councilor +councilorship +councilwoman +counderstand +counite +couniversal +counsel +counselable +counselee +counselful +counselor +counselorship +count +countable +countableness +countably +countdom +countenance +countenancer +counter +counterabut +counteraccusation +counteracquittance +counteract +counteractant +counteracter +counteracting +counteractingly +counteraction +counteractive +counteractively +counteractivity +counteractor +counteraddress +counteradvance +counteradvantage +counteradvice +counteradvise +counteraffirm +counteraffirmation +counteragency +counteragent +counteragitate +counteragitation +counteralliance +counterambush +counterannouncement +counteranswer +counterappeal +counterappellant +counterapproach +counterapse +counterarch +counterargue +counterargument +counterartillery +counterassertion +counterassociation +counterassurance +counterattack +counterattestation +counterattired +counterattraction +counterattractive +counterattractively +counteraverment +counteravouch +counteravouchment +counterbalance +counterbarrage +counterbase +counterbattery +counterbeating +counterbend +counterbewitch +counterbid +counterblast +counterblow +counterbond +counterborder +counterbore +counterboycott +counterbrace +counterbranch +counterbrand +counterbreastwork +counterbuff +counterbuilding +countercampaign +countercarte +countercause +counterchange +counterchanged +countercharge +countercharm +countercheck +countercheer +counterclaim +counterclaimant +counterclockwise +countercolored +countercommand +countercompetition +countercomplaint +countercompony +countercondemnation +counterconquest +counterconversion +countercouchant +countercoupe +countercourant +countercraft +countercriticism +countercross +countercry +countercurrent +countercurrently +countercurrentwise +counterdance +counterdash +counterdecision +counterdeclaration +counterdecree +counterdefender +counterdemand +counterdemonstration +counterdeputation +counterdesire +counterdevelopment +counterdifficulty +counterdigged +counterdike +counterdiscipline +counterdisengage +counterdisengagement +counterdistinction +counterdistinguish +counterdoctrine +counterdogmatism +counterdraft +counterdrain +counterdrive +counterearth +counterefficiency +countereffort +counterembattled +counterembowed +counterenamel +counterend +counterenergy +counterengagement +counterengine +counterenthusiasm +counterentry +counterequivalent +counterermine +counterespionage +counterestablishment +counterevidence +counterexaggeration +counterexcitement +counterexcommunication +counterexercise +counterexplanation +counterexposition +counterexpostulation +counterextend +counterextension +counterfact +counterfallacy +counterfaller +counterfeit +counterfeiter +counterfeitly +counterfeitment +counterfeitness +counterferment +counterfessed +counterfire +counterfix +counterflange +counterflashing +counterflight +counterflory +counterflow +counterflux +counterfoil +counterforce +counterformula +counterfort +counterfugue +countergabble +countergabion +countergambit +countergarrison +countergauge +countergauger +countergift +countergirded +counterglow +counterguard +counterhaft +counterhammering +counterhypothesis +counteridea +counterideal +counterimagination +counterimitate +counterimitation +counterimpulse +counterindentation +counterindented +counterindicate +counterindication +counterinfluence +counterinsult +counterintelligence +counterinterest +counterinterpretation +counterintrigue +counterinvective +counterirritant +counterirritate +counterirritation +counterjudging +counterjumper +counterlath +counterlathing +counterlatration +counterlaw +counterleague +counterlegislation +counterlife +counterlocking +counterlode +counterlove +counterly +countermachination +counterman +countermand +countermandable +countermaneuver +countermanifesto +countermarch +countermark +countermarriage +countermeasure +countermeet +countermessage +countermigration +countermine +countermission +countermotion +countermount +countermove +countermovement +countermure +countermutiny +counternaiant +counternarrative +counternatural +counternecromancy +counternoise +counternotice +counterobjection +counterobligation +counteroffensive +counteroffer +counteropening +counteropponent +counteropposite +counterorator +counterorder +counterorganization +counterpaled +counterpaly +counterpane +counterpaned +counterparadox +counterparallel +counterparole +counterparry +counterpart +counterpassant +counterpassion +counterpenalty +counterpendent +counterpetition +counterpicture +counterpillar +counterplan +counterplay +counterplayer +counterplea +counterplead +counterpleading +counterplease +counterplot +counterpoint +counterpointe +counterpointed +counterpoise +counterpoison +counterpole +counterponderate +counterpose +counterposition +counterposting +counterpotence +counterpotency +counterpotent +counterpractice +counterpray +counterpreach +counterpreparation +counterpressure +counterprick +counterprinciple +counterprocess +counterproject +counterpronunciamento +counterproof +counterpropaganda +counterpropagandize +counterprophet +counterproposal +counterproposition +counterprotection +counterprotest +counterprove +counterpull +counterpunch +counterpuncture +counterpush +counterquartered +counterquarterly +counterquery +counterquestion +counterquip +counterradiation +counterraid +counterraising +counterrampant +counterrate +counterreaction +counterreason +counterreckoning +counterrecoil +counterreconnaissance +counterrefer +counterreflected +counterreform +counterreformation +counterreligion +counterremonstrant +counterreply +counterreprisal +counterresolution +counterrestoration +counterretreat +counterrevolution +counterrevolutionary +counterrevolutionist +counterrevolutionize +counterriposte +counterroll +counterround +counterruin +countersale +countersalient +counterscale +counterscalloped +counterscarp +counterscoff +countersconce +counterscrutiny +countersea +counterseal +countersecure +countersecurity +counterselection +countersense +counterservice +countershade +countershaft +countershafting +countershear +countershine +countershout +counterside +countersiege +countersign +countersignal +countersignature +countersink +countersleight +counterslope +countersmile +countersnarl +counterspying +counterstain +counterstamp +counterstand +counterstatant +counterstatement +counterstatute +counterstep +counterstimulate +counterstimulation +counterstimulus +counterstock +counterstratagem +counterstream +counterstrike +counterstroke +counterstruggle +countersubject +countersuggestion +countersuit +countersun +countersunk +countersurprise +counterswing +countersworn +countersympathy +countersynod +countertack +countertail +countertally +countertaste +countertechnicality +countertendency +countertenor +counterterm +counterterror +countertheme +countertheory +counterthought +counterthreat +counterthrust +counterthwarting +countertierce +countertime +countertouch +countertraction +countertrades +countertransference +countertranslation +countertraverse +countertreason +countertree +countertrench +countertrespass +countertrippant +countertripping +countertruth +countertug +counterturn +counterturned +countertype +countervail +countervair +countervairy +countervallation +countervaunt +countervene +countervengeance +countervenom +countervibration +counterview +countervindication +countervolition +countervolley +countervote +counterwager +counterwall +counterwarmth +counterwave +counterweigh +counterweight +counterweighted +counterwheel +counterwill +counterwilling +counterwind +counterwitness +counterword +counterwork +counterworker +counterwrite +countess +countfish +counting +countinghouse +countless +countor +countrified +countrifiedness +country +countryfolk +countryman +countrypeople +countryseat +countryside +countryward +countrywoman +countship +county +coup +coupage +coupe +couped +coupee +coupelet +couper +couple +coupled +couplement +coupler +coupleress +couplet +coupleteer +coupling +coupon +couponed +couponless +coupstick +coupure +courage +courageous +courageously +courageousness +courager +courant +courante +courap +couratari +courb +courbache +courbaril +courbash +courge +courida +courier +couril +courlan +Cours +course +coursed +courser +coursing +court +courtbred +courtcraft +courteous +courteously +courteousness +courtepy +courter +courtesan +courtesanry +courtesanship +courtesy +courtezanry +courtezanship +courthouse +courtier +courtierism +courtierly +courtiership +courtin +courtless +courtlet +courtlike +courtliness +courtling +courtly +courtman +Courtney +courtroom +courtship +courtyard +courtzilite +couscous +couscousou +couseranite +cousin +cousinage +cousiness +cousinhood +cousinly +cousinry +cousinship +cousiny +coussinet +coustumier +coutel +coutelle +couter +Coutet +couth +couthie +couthily +couthiness +couthless +coutil +coutumier +couvade +couxia +covado +covalence +covalent +Covarecan +Covarecas +covariable +covariance +covariant +covariation +covassal +cove +coved +covelline +covellite +covenant +covenantal +covenanted +covenantee +Covenanter +covenanter +covenanting +covenantor +covent +coventrate +coventrize +Coventry +cover +coverage +coveralls +coverchief +covercle +covered +coverer +covering +coverless +coverlet +coverlid +coversed +coverside +coversine +coverslut +covert +covertical +covertly +covertness +coverture +covet +covetable +coveter +coveting +covetingly +covetiveness +covetous +covetously +covetousness +covey +covibrate +covibration +covid +Coviello +covillager +Covillea +covin +coving +covinous +covinously +covisit +covisitor +covite +covolume +covotary +cow +cowal +Cowan +coward +cowardice +cowardliness +cowardly +cowardness +cowardy +cowbane +cowbell +cowberry +cowbind +cowbird +cowboy +cowcatcher +cowdie +coween +cower +cowfish +cowgate +cowgram +cowhage +cowheart +cowhearted +cowheel +cowherb +cowherd +cowhide +cowhiding +cowhorn +Cowichan +cowish +cowitch +cowkeeper +cowl +cowle +cowled +cowleech +cowleeching +cowlick +cowlicks +cowlike +cowling +Cowlitz +cowlstaff +cowman +cowpath +cowpea +cowpen +Cowperian +cowperitis +cowpock +cowpox +cowpuncher +cowquake +cowrie +cowroid +cowshed +cowskin +cowslip +cowslipped +cowsucker +cowtail +cowthwort +cowtongue +cowweed +cowwheat +cowy +cowyard +cox +coxa +coxal +coxalgia +coxalgic +coxankylometer +coxarthritis +coxarthrocace +coxarthropathy +coxbones +coxcomb +coxcombess +coxcombhood +coxcombic +coxcombical +coxcombicality +coxcombically +coxcombity +coxcombry +coxcomby +coxcomical +coxcomically +coxite +coxitis +coxocerite +coxoceritic +coxodynia +coxofemoral +coxopodite +coxswain +coxy +coy +coyan +coydog +coyish +coyishness +coyly +coyness +coynye +coyo +coyol +coyote +Coyotero +coyotillo +coyoting +coypu +coyure +coz +coze +cozen +cozenage +cozener +cozening +cozeningly +cozier +cozily +coziness +cozy +crab +crabbed +crabbedly +crabbedness +crabber +crabbery +crabbing +crabby +crabcatcher +crabeater +craber +crabhole +crablet +crablike +crabman +crabmill +crabsidle +crabstick +crabweed +crabwise +crabwood +Cracca +Cracidae +Cracinae +crack +crackable +crackajack +crackbrain +crackbrained +crackbrainedness +crackdown +cracked +crackedness +cracker +crackerberry +crackerjack +crackers +crackhemp +crackiness +cracking +crackjaw +crackle +crackled +crackless +crackleware +crackling +crackly +crackmans +cracknel +crackpot +crackskull +cracksman +cracky +cracovienne +craddy +cradge +cradle +cradleboard +cradlechild +cradlefellow +cradleland +cradlelike +cradlemaker +cradlemaking +cradleman +cradlemate +cradler +cradleside +cradlesong +cradletime +cradling +Cradock +craft +craftily +craftiness +craftless +craftsman +craftsmanship +craftsmaster +craftswoman +craftwork +craftworker +crafty +crag +craggan +cragged +craggedness +craggily +cragginess +craggy +craglike +cragsman +cragwork +craichy +Craig +craigmontite +crain +craisey +craizey +crajuru +crake +crakefeet +crakow +cram +cramasie +crambambulee +crambambuli +Crambe +crambe +cramberry +crambid +Crambidae +Crambinae +cramble +crambly +crambo +Crambus +crammer +cramp +cramped +crampedness +cramper +crampet +crampfish +cramping +crampingly +crampon +cramponnee +crampy +cran +cranage +cranberry +crance +crandall +crandallite +crane +cranelike +craneman +craner +cranesman +craneway +craney +Crania +crania +craniacromial +craniad +cranial +cranially +cranian +Craniata +craniate +cranic +craniectomy +craniocele +craniocerebral +cranioclasis +cranioclasm +cranioclast +cranioclasty +craniodidymus +craniofacial +craniognomic +craniognomy +craniognosy +craniograph +craniographer +craniography +craniological +craniologically +craniologist +craniology +craniomalacia +craniomaxillary +craniometer +craniometric +craniometrical +craniometrically +craniometrist +craniometry +craniopagus +craniopathic +craniopathy +craniopharyngeal +craniophore +cranioplasty +craniopuncture +craniorhachischisis +craniosacral +cranioschisis +cranioscopical +cranioscopist +cranioscopy +craniospinal +craniostenosis +craniostosis +Craniota +craniotabes +craniotome +craniotomy +craniotopography +craniotympanic +craniovertebral +cranium +crank +crankbird +crankcase +cranked +cranker +crankery +crankily +crankiness +crankle +crankless +crankly +crankman +crankous +crankpin +crankshaft +crankum +cranky +crannage +crannied +crannock +crannog +crannoger +cranny +cranreuch +crantara +crants +crap +crapaud +crapaudine +crape +crapefish +crapehanger +crapelike +crappie +crappin +crapple +crappo +craps +crapshooter +crapulate +crapulence +crapulent +crapulous +crapulously +crapulousness +crapy +craquelure +crare +crash +crasher +crasis +craspedal +craspedodromous +craspedon +Craspedota +craspedotal +craspedote +crass +crassamentum +crassier +crassilingual +Crassina +crassitude +crassly +crassness +Crassula +Crassulaceae +crassulaceous +Crataegus +Crataeva +cratch +cratchens +cratches +crate +crateful +cratemaker +cratemaking +crateman +crater +crateral +cratered +Craterellus +Craterid +crateriform +crateris +craterkin +craterless +craterlet +craterlike +craterous +craticular +Cratinean +cratometer +cratometric +cratometry +craunch +craunching +craunchingly +cravat +crave +craven +Cravenette +cravenette +cravenhearted +cravenly +cravenness +craver +craving +cravingly +cravingness +cravo +craw +crawberry +crawdad +crawfish +crawfoot +crawful +crawl +crawler +crawlerize +crawley +crawleyroot +crawling +crawlingly +crawlsome +crawly +crawm +crawtae +Crawthumper +Crax +crayer +crayfish +crayon +crayonist +crayonstone +craze +crazed +crazedly +crazedness +crazily +craziness +crazingmill +crazy +crazycat +crazyweed +crea +creagh +creaght +creak +creaker +creakily +creakiness +creakingly +creaky +cream +creambush +creamcake +creamcup +creamer +creamery +creameryman +creamfruit +creamily +creaminess +creamless +creamlike +creammaker +creammaking +creamometer +creamsacs +creamware +creamy +creance +creancer +creant +crease +creaseless +creaser +creashaks +creasing +creasy +creat +creatable +create +createdness +creatic +creatine +creatinephosphoric +creatinine +creatininemia +creatinuria +creation +creational +creationary +creationism +creationist +creationistic +creative +creatively +creativeness +creativity +creatophagous +creator +creatorhood +creatorrhea +creatorship +creatotoxism +creatress +creatrix +creatural +creature +creaturehood +creatureless +creatureliness +creatureling +creaturely +creatureship +creaturize +crebricostate +crebrisulcate +crebrity +crebrous +creche +creddock +credence +credencive +credenciveness +credenda +credensive +credensiveness +credent +credential +credently +credenza +credibility +credible +credibleness +credibly +credit +creditability +creditable +creditableness +creditably +creditive +creditless +creditor +creditorship +creditress +creditrix +crednerite +Credo +credulity +credulous +credulously +credulousness +Cree +cree +creed +creedal +creedalism +creedalist +creeded +creedist +creedite +creedless +creedlessness +creedmore +creedsman +Creek +creek +creeker +creekfish +creekside +creekstuff +creeky +creel +creeler +creem +creen +creep +creepage +creeper +creepered +creeperless +creephole +creepie +creepiness +creeping +creepingly +creepmouse +creepmousy +creepy +creese +creesh +creeshie +creeshy +creirgist +cremaster +cremasterial +cremasteric +cremate +cremation +cremationism +cremationist +cremator +crematorial +crematorium +crematory +crembalum +cremnophobia +cremocarp +cremometer +cremone +cremor +cremorne +cremule +crena +crenate +crenated +crenately +crenation +crenature +crenel +crenelate +crenelated +crenelation +crenele +creneled +crenelet +crenellate +crenellation +crenic +crenitic +crenology +crenotherapy +Crenothrix +crenula +crenulate +crenulated +crenulation +creodont +Creodonta +creole +creoleize +creolian +Creolin +creolism +creolization +creolize +creophagia +creophagism +creophagist +creophagous +creophagy +creosol +creosote +creosoter +creosotic +crepance +crepe +crepehanger +Crepidula +crepine +crepiness +Crepis +crepitaculum +crepitant +crepitate +crepitation +crepitous +crepitus +crepon +crept +crepuscle +crepuscular +crepuscule +crepusculine +crepusculum +crepy +cresamine +crescendo +crescent +crescentade +crescentader +Crescentia +crescentic +crescentiform +crescentlike +crescentoid +crescentwise +crescive +crescograph +crescographic +cresegol +cresol +cresolin +cresorcinol +cresotate +cresotic +cresotinic +cresoxide +cresoxy +cresphontes +cress +cressed +cresselle +cresset +Cressida +cresson +cressweed +cresswort +cressy +crest +crested +crestfallen +crestfallenly +crestfallenness +cresting +crestless +crestline +crestmoreite +cresyl +cresylate +cresylene +cresylic +cresylite +creta +Cretaceous +cretaceous +cretaceously +Cretacic +Cretan +Crete +cretefaction +Cretic +cretic +cretification +cretify +cretin +cretinic +cretinism +cretinization +cretinize +cretinoid +cretinous +cretion +cretionary +Cretism +cretonne +crevalle +crevasse +crevice +creviced +crew +crewel +crewelist +crewellery +crewelwork +crewer +crewless +crewman +Crex +crib +cribbage +cribber +cribbing +cribble +cribellum +cribo +cribral +cribrate +cribrately +cribration +cribriform +cribrose +cribwork +cric +Cricetidae +cricetine +Cricetus +crick +cricket +cricketer +cricketing +crickety +crickey +crickle +cricoarytenoid +cricoid +cricopharyngeal +cricothyreoid +cricothyreotomy +cricothyroid +cricothyroidean +cricotomy +cricotracheotomy +Cricotus +cried +crier +criey +crig +crile +crime +Crimean +crimeful +crimeless +crimelessness +crimeproof +criminal +criminaldom +criminalese +criminalism +criminalist +criminalistic +criminalistician +criminalistics +criminality +criminally +criminalness +criminaloid +criminate +crimination +criminative +criminator +criminatory +crimine +criminogenesis +criminogenic +criminologic +criminological +criminologist +criminology +criminosis +criminous +criminously +criminousness +crimogenic +crimp +crimpage +crimper +crimping +crimple +crimpness +crimpy +crimson +crimsonly +crimsonness +crimsony +crin +crinal +crinanite +crinated +crinatory +crine +crined +crinet +cringe +cringeling +cringer +cringing +cringingly +cringingness +cringle +crinicultural +criniculture +criniferous +Criniger +crinigerous +criniparous +crinite +crinitory +crinivorous +crink +crinkle +crinkleroot +crinkly +crinoid +crinoidal +Crinoidea +crinoidean +crinoline +crinose +crinosity +crinula +Crinum +criobolium +criocephalus +Crioceras +crioceratite +crioceratitic +Crioceris +criophore +Criophoros +criosphinx +cripes +crippingly +cripple +crippledom +crippleness +crippler +crippling +cripply +Cris +crises +crisic +crisis +crisp +crispate +crispated +crispation +crispature +crisped +crisper +crispily +Crispin +crispine +crispiness +crisping +crisply +crispness +crispy +criss +crissal +crisscross +crissum +crista +cristate +Cristatella +Cristi +cristiform +Cristina +Cristineaux +Cristino +Cristispira +Cristivomer +cristobalite +Cristopher +critch +criteria +criteriology +criterion +criterional +criterium +crith +Crithidia +crithmene +crithomancy +critic +critical +criticality +critically +criticalness +criticaster +criticasterism +criticastry +criticisable +criticism +criticist +criticizable +criticize +criticizer +criticizingly +critickin +criticship +criticule +critique +critling +crizzle +cro +croak +Croaker +croaker +croakily +croakiness +croaky +Croat +Croatan +Croatian +croc +Crocanthemum +crocard +croceic +crocein +croceine +croceous +crocetin +croche +crochet +crocheter +crocheting +croci +crocidolite +Crocidura +crocin +crock +crocker +crockery +crockeryware +crocket +crocketed +crocky +crocodile +Crocodilia +crocodilian +Crocodilidae +crocodiline +crocodilite +crocodiloid +Crocodilus +Crocodylidae +Crocodylus +crocoisite +crocoite +croconate +croconic +Crocosmia +Crocus +crocus +crocused +croft +crofter +crofterization +crofterize +crofting +croftland +croisette +croissante +Crokinole +Crom +cromaltite +crome +Cromer +Cromerian +cromfordite +cromlech +cromorna +cromorne +Cromwell +Cromwellian +Cronartium +crone +croneberry +cronet +Cronian +cronish +cronk +cronkness +cronstedtite +crony +crood +croodle +crook +crookback +crookbacked +crookbill +crookbilled +crooked +crookedly +crookedness +crooken +crookesite +crookfingered +crookheaded +crookkneed +crookle +crooklegged +crookneck +crooknecked +crooknosed +crookshouldered +crooksided +crooksterned +crooktoothed +crool +Croomia +croon +crooner +crooning +crooningly +crop +crophead +cropland +cropman +croppa +cropper +croppie +cropplecrown +croppy +cropshin +cropsick +cropsickness +cropweed +croquet +croquette +crore +crosa +Crosby +crosier +crosiered +crosnes +cross +crossability +crossable +crossarm +crossband +crossbar +crossbeak +crossbeam +crossbelt +crossbill +crossbolt +crossbolted +crossbones +crossbow +crossbowman +crossbred +crossbreed +crosscurrent +crosscurrented +crosscut +crosscutter +crosscutting +crosse +crossed +crosser +crossette +crossfall +crossfish +crossflow +crossflower +crossfoot +crosshackle +crosshand +crosshatch +crosshaul +crosshauling +crosshead +crossing +crossite +crossjack +crosslegs +crosslet +crossleted +crosslight +crosslighted +crossline +crossly +crossness +crossopodia +crossopterygian +Crossopterygii +Crossosoma +Crossosomataceae +crossosomataceous +crossover +crosspatch +crosspath +crosspiece +crosspoint +crossrail +crossroad +crossroads +crossrow +crossruff +crosstail +crosstie +crosstied +crosstoes +crosstrack +crosstree +crosswalk +crossway +crossways +crossweb +crossweed +crosswise +crossword +crosswort +crostarie +crotal +Crotalaria +crotalic +Crotalidae +crotaliform +Crotalinae +crotaline +crotalism +crotalo +crotaloid +crotalum +Crotalus +crotaphic +crotaphion +crotaphite +crotaphitic +Crotaphytus +crotch +crotched +crotchet +crotcheteer +crotchetiness +crotchety +crotchy +crotin +Croton +crotonaldehyde +crotonate +crotonic +crotonization +crotonyl +crotonylene +Crotophaga +crottels +crottle +crotyl +crouch +crouchant +crouched +croucher +crouching +crouchingly +crounotherapy +croup +croupade +croupal +croupe +crouperbush +croupier +croupily +croupiness +croupous +croupy +crouse +crousely +crout +croute +crouton +crow +crowbait +crowbar +crowberry +crowbill +crowd +crowded +crowdedly +crowdedness +crowder +crowdweed +crowdy +crower +crowflower +crowfoot +crowfooted +crowhop +crowing +crowingly +crowkeeper +crowl +crown +crownbeard +crowned +crowner +crownless +crownlet +crownling +crownmaker +crownwork +crownwort +crowshay +crowstep +crowstepped +crowstick +crowstone +crowtoe +croy +croyden +croydon +croze +crozer +crozzle +crozzly +crubeen +cruce +cruces +crucethouse +cruche +crucial +cruciality +crucially +crucian +Crucianella +cruciate +cruciately +cruciation +crucible +Crucibulum +crucifer +Cruciferae +cruciferous +crucificial +crucified +crucifier +crucifix +crucifixion +cruciform +cruciformity +cruciformly +crucify +crucigerous +crucilly +crucily +cruck +crude +crudely +crudeness +crudity +crudwort +cruel +cruelhearted +cruelize +cruelly +cruelness +cruels +cruelty +cruent +cruentation +cruet +cruety +cruise +cruiser +cruisken +cruive +cruller +crum +crumb +crumbable +crumbcloth +crumber +crumble +crumblement +crumblet +crumbliness +crumblingness +crumblings +crumbly +crumby +crumen +crumenal +crumlet +crummie +crummier +crummiest +crummock +crummy +crump +crumper +crumpet +crumple +crumpled +crumpler +crumpling +crumply +crumpy +crunch +crunchable +crunchiness +crunching +crunchingly +crunchingness +crunchweed +crunchy +crunk +crunkle +crunodal +crunode +crunt +cruor +crupper +crural +crureus +crurogenital +cruroinguinal +crurotarsal +crus +crusade +crusader +crusado +Crusca +cruse +crush +crushability +crushable +crushed +crusher +crushing +crushingly +crusie +crusily +crust +crusta +Crustacea +crustaceal +crustacean +crustaceological +crustaceologist +crustaceology +crustaceous +crustade +crustal +crustalogical +crustalogist +crustalogy +crustate +crustated +crustation +crusted +crustedly +cruster +crustific +crustification +crustily +crustiness +crustless +crustose +crustosis +crusty +crutch +crutched +crutcher +crutching +crutchlike +cruth +crutter +crux +cruzeiro +cry +cryable +cryaesthesia +cryalgesia +cryanesthesia +crybaby +cryesthesia +crying +cryingly +crymodynia +crymotherapy +cryoconite +cryogen +cryogenic +cryogenics +cryogeny +cryohydrate +cryohydric +cryolite +cryometer +cryophile +cryophilic +cryophoric +cryophorus +cryophyllite +cryophyte +cryoplankton +cryoscope +cryoscopic +cryoscopy +cryosel +cryostase +cryostat +crypt +crypta +cryptal +cryptamnesia +cryptamnesic +cryptanalysis +cryptanalyst +cryptarch +cryptarchy +crypted +Crypteronia +Crypteroniaceae +cryptesthesia +cryptesthetic +cryptic +cryptical +cryptically +cryptoagnostic +cryptobatholithic +cryptobranch +Cryptobranchia +Cryptobranchiata +cryptobranchiate +Cryptobranchidae +Cryptobranchus +cryptocarp +cryptocarpic +cryptocarpous +Cryptocarya +Cryptocephala +cryptocephalous +Cryptocerata +cryptocerous +cryptoclastic +Cryptocleidus +cryptococci +cryptococcic +Cryptococcus +cryptococcus +cryptocommercial +cryptocrystalline +cryptocrystallization +cryptodeist +Cryptodira +cryptodiran +cryptodire +cryptodirous +cryptodouble +cryptodynamic +cryptogam +Cryptogamia +cryptogamian +cryptogamic +cryptogamical +cryptogamist +cryptogamous +cryptogamy +cryptogenetic +cryptogenic +cryptogenous +Cryptoglaux +cryptoglioma +cryptogram +Cryptogramma +cryptogrammatic +cryptogrammatical +cryptogrammatist +cryptogrammic +cryptograph +cryptographal +cryptographer +cryptographic +cryptographical +cryptographically +cryptographist +cryptography +cryptoheresy +cryptoheretic +cryptoinflationist +cryptolite +cryptologist +cryptology +cryptolunatic +cryptomere +Cryptomeria +cryptomerous +cryptomnesia +cryptomnesic +cryptomonad +Cryptomonadales +Cryptomonadina +cryptonema +Cryptonemiales +cryptoneurous +cryptonym +cryptonymous +cryptopapist +cryptoperthite +Cryptophagidae +cryptophthalmos +Cryptophyceae +cryptophyte +cryptopine +cryptoporticus +Cryptoprocta +cryptoproselyte +cryptoproselytism +cryptopyic +cryptopyrrole +cryptorchid +cryptorchidism +cryptorchis +Cryptorhynchus +cryptorrhesis +cryptorrhetic +cryptoscope +cryptoscopy +cryptosplenetic +Cryptostegia +cryptostoma +Cryptostomata +cryptostomate +cryptostome +Cryptotaenia +cryptous +cryptovalence +cryptovalency +cryptozonate +Cryptozonia +cryptozygosity +cryptozygous +Crypturi +Crypturidae +crystal +crystallic +crystalliferous +crystalliform +crystalligerous +crystallin +crystalline +crystallinity +crystallite +crystallitic +crystallitis +crystallizability +crystallizable +crystallization +crystallize +crystallized +crystallizer +crystalloblastic +crystallochemical +crystallochemistry +crystallogenesis +crystallogenetic +crystallogenic +crystallogenical +crystallogeny +crystallogram +crystallographer +crystallographic +crystallographical +crystallographically +crystallography +crystalloid +crystalloidal +crystallology +crystalloluminescence +crystallomagnetic +crystallomancy +crystallometric +crystallometry +crystallophyllian +crystallose +crystallurgy +crystalwort +crystic +crystograph +crystoleum +Crystolon +crystosphene +csardas +Ctenacanthus +ctene +ctenidial +ctenidium +cteniform +Ctenocephalus +ctenocyst +ctenodactyl +Ctenodipterini +ctenodont +Ctenodontidae +Ctenodus +ctenoid +ctenoidean +Ctenoidei +ctenoidian +ctenolium +Ctenophora +ctenophoral +ctenophoran +ctenophore +ctenophoric +ctenophorous +Ctenoplana +Ctenostomata +ctenostomatous +ctenostome +ctetology +cuadra +Cuailnge +cuapinole +cuarenta +cuarta +cuarteron +cuartilla +cuartillo +cub +Cuba +cubage +Cuban +cubangle +cubanite +Cubanize +cubatory +cubature +cubbing +cubbish +cubbishly +cubbishness +cubby +cubbyhole +cubbyhouse +cubbyyew +cubdom +cube +cubeb +cubelet +Cubelium +cuber +cubhood +cubi +cubic +cubica +cubical +cubically +cubicalness +cubicity +cubicle +cubicly +cubicone +cubicontravariant +cubicovariant +cubicular +cubiculum +cubiform +cubism +cubist +cubit +cubital +cubitale +cubited +cubitiere +cubito +cubitocarpal +cubitocutaneous +cubitodigital +cubitometacarpal +cubitopalmar +cubitoplantar +cubitoradial +cubitus +cubmaster +cubocalcaneal +cuboctahedron +cubocube +cubocuneiform +cubododecahedral +cuboid +cuboidal +cuboides +cubomancy +Cubomedusae +cubomedusan +cubometatarsal +cubonavicular +Cuchan +Cuchulainn +cuck +cuckhold +cuckold +cuckoldom +cuckoldry +cuckoldy +cuckoo +cuckooflower +cuckoomaid +cuckoopint +cuckoopintle +cuckstool +cucoline +Cucujid +Cucujidae +Cucujus +Cuculi +Cuculidae +cuculiform +Cuculiformes +cuculine +cuculla +cucullaris +cucullate +cucullately +cuculliform +cucullus +cuculoid +Cuculus +Cucumaria +Cucumariidae +cucumber +cucumiform +Cucumis +cucurbit +Cucurbita +Cucurbitaceae +cucurbitaceous +cucurbite +cucurbitine +cud +cudava +cudbear +cudden +cuddle +cuddleable +cuddlesome +cuddly +Cuddy +cuddy +cuddyhole +cudgel +cudgeler +cudgerie +cudweed +cue +cueball +cueca +cueist +cueman +cuemanship +cuerda +cuesta +Cueva +cuff +cuffer +cuffin +cuffy +cuffyism +cuggermugger +cuichunchulli +cuinage +cuir +cuirass +cuirassed +cuirassier +cuisinary +cuisine +cuissard +cuissart +cuisse +cuissen +cuisten +Cuitlateco +cuittikin +Cujam +cuke +Culavamsa +culbut +Culdee +culebra +culet +culeus +Culex +culgee +culicid +Culicidae +culicidal +culicide +culiciform +culicifugal +culicifuge +Culicinae +culicine +Culicoides +culilawan +culinarily +culinary +cull +culla +cullage +Cullen +culler +cullet +culling +cullion +cullis +cully +culm +culmen +culmicolous +culmiferous +culmigenous +culminal +culminant +culminate +culmination +culmy +culotte +culottes +culottic +culottism +culpa +culpability +culpable +culpableness +culpably +culpatory +culpose +culprit +cult +cultch +cultellation +cultellus +culteranismo +cultic +cultigen +cultirostral +Cultirostres +cultish +cultism +cultismo +cultist +cultivability +cultivable +cultivably +cultivar +cultivatability +cultivatable +cultivate +cultivated +cultivation +cultivator +cultrate +cultrated +cultriform +cultrirostral +Cultrirostres +cultual +culturable +cultural +culturally +culture +cultured +culturine +culturist +culturization +culturize +culturological +culturologically +culturologist +culturology +cultus +culver +culverfoot +culverhouse +culverin +culverineer +culverkey +culvert +culvertage +culverwort +cum +Cumacea +cumacean +cumaceous +Cumaean +cumal +cumaldehyde +Cumanagoto +cumaphyte +cumaphytic +cumaphytism +Cumar +cumay +cumbent +cumber +cumberer +cumberlandite +cumberless +cumberment +cumbersome +cumbersomely +cumbersomeness +cumberworld +cumbha +cumbly +cumbraite +cumbrance +cumbre +Cumbrian +cumbrous +cumbrously +cumbrousness +cumbu +cumene +cumengite +cumenyl +cumflutter +cumhal +cumic +cumidin +cumidine +cumin +cuminal +cuminic +cuminoin +cuminol +cuminole +cuminseed +cuminyl +cummer +cummerbund +cummin +cummingtonite +cumol +cump +cumshaw +cumulant +cumular +cumulate +cumulately +cumulation +cumulatist +cumulative +cumulatively +cumulativeness +cumuli +cumuliform +cumulite +cumulophyric +cumulose +cumulous +cumulus +cumyl +Cuna +cunabular +Cunan +Cunarder +Cunas +cunctation +cunctatious +cunctative +cunctator +cunctatorship +cunctatury +cunctipotent +cundeamor +cuneal +cuneate +cuneately +cuneatic +cuneator +cuneiform +cuneiformist +cuneocuboid +cuneonavicular +cuneoscaphoid +cunette +cuneus +cungeboi +cunicular +cuniculus +cunila +cunjah +cunjer +cunjevoi +cunner +cunnilinctus +cunnilingus +cunning +Cunninghamia +cunningly +cunningness +Cunonia +Cunoniaceae +cunoniaceous +cunye +Cunza +Cuon +cuorin +cup +Cupania +cupay +cupbearer +cupboard +cupcake +cupel +cupeler +cupellation +cupflower +cupful +Cuphea +cuphead +cupholder +Cupid +cupidinous +cupidity +cupidon +cupidone +cupless +cupmaker +cupmaking +cupman +cupmate +cupola +cupolaman +cupolar +cupolated +cupped +cupper +cupping +cuppy +cuprammonia +cuprammonium +cupreine +cuprene +cupreous +Cupressaceae +cupressineous +Cupressinoxylon +Cupressus +cupric +cupride +cupriferous +cuprite +cuproammonium +cuprobismutite +cuprocyanide +cuprodescloizite +cuproid +cuproiodargyrite +cupromanganese +cupronickel +cuproplumbite +cuproscheelite +cuprose +cuprosilicon +cuprotungstite +cuprous +cuprum +cupseed +cupstone +cupula +cupulate +cupule +Cupuliferae +cupuliferous +cupuliform +cur +curability +curable +curableness +curably +curacao +curacy +curare +curarine +curarization +curarize +curassow +curatage +curate +curatel +curateship +curatess +curatial +curatic +curation +curative +curatively +curativeness +curatize +curatolatry +curator +curatorial +curatorium +curatorship +curatory +curatrix +Curavecan +curb +curbable +curber +curbing +curbless +curblike +curbstone +curbstoner +curby +curcas +curch +curcuddoch +Curculio +curculionid +Curculionidae +curculionist +Curcuma +curcumin +curd +curdiness +curdle +curdler +curdly +curdwort +curdy +cure +cureless +curelessly +curemaster +curer +curettage +curette +curettement +curfew +curial +curialism +curialist +curialistic +curiality +curiate +Curiatii +curiboca +curie +curiescopy +curietherapy +curin +curine +curing +curio +curiologic +curiologically +curiologics +curiology +curiomaniac +curiosa +curiosity +curioso +curious +curiously +curiousness +curite +Curitis +curium +curl +curled +curledly +curledness +curler +curlew +curlewberry +curlicue +curliewurly +curlike +curlily +curliness +curling +curlingly +curlpaper +curly +curlycue +curlyhead +curlylocks +curmudgeon +curmudgeonery +curmudgeonish +curmudgeonly +curmurring +curn +curney +curnock +curple +curr +currach +currack +curragh +currant +curratow +currawang +currency +current +currently +currentness +currentwise +curricle +curricula +curricular +curricularization +curricularize +curriculum +curried +currier +curriery +currish +currishly +currishness +curry +currycomb +curryfavel +Cursa +cursal +curse +cursed +cursedly +cursedness +curser +curship +cursitor +cursive +cursively +cursiveness +cursor +cursorary +Cursores +Cursoria +cursorial +Cursoriidae +cursorily +cursoriness +cursorious +Cursorius +cursory +curst +curstful +curstfully +curstly +curstness +cursus +Curt +curt +curtail +curtailed +curtailedly +curtailer +curtailment +curtain +curtaining +curtainless +curtainwise +curtal +Curtana +curtate +curtation +curtesy +curtilage +Curtis +Curtise +curtly +curtness +curtsy +curua +curuba +Curucaneca +Curucanecan +curucucu +curule +Curuminaca +Curuminacan +Curupira +cururo +curvaceous +curvaceousness +curvacious +curvant +curvate +curvation +curvature +curve +curved +curvedly +curvedness +curver +curvesome +curvesomeness +curvet +curvicaudate +curvicostate +curvidentate +curvifoliate +curviform +curvilineal +curvilinear +curvilinearity +curvilinearly +curvimeter +curvinervate +curvinerved +curvirostral +Curvirostres +curviserial +curvital +curvity +curvograph +curvometer +curvous +curvulate +curvy +curwhibble +curwillet +cuscohygrine +cusconine +Cuscus +cuscus +Cuscuta +Cuscutaceae +cuscutaceous +cusec +cuselite +cush +cushag +cushat +cushaw +cushewbird +cushion +cushioned +cushionflower +cushionless +cushionlike +cushiony +Cushite +Cushitic +cushlamochree +cushy +cusie +cusinero +cusk +cusp +cuspal +cusparidine +cusparine +cuspate +cusped +cuspid +cuspidal +cuspidate +cuspidation +cuspidine +cuspidor +cuspule +cuss +cussed +cussedly +cussedness +cusser +cusso +custard +custerite +custodee +custodes +custodial +custodiam +custodian +custodianship +custodier +custody +custom +customable +customarily +customariness +customary +customer +customhouse +customs +custumal +cut +cutaneal +cutaneous +cutaneously +cutaway +cutback +cutch +cutcher +cutcherry +cute +cutely +cuteness +Cuterebra +Cuthbert +cutheal +cuticle +cuticolor +cuticula +cuticular +cuticularization +cuticularize +cuticulate +cutidure +cutie +cutification +cutigeral +cutin +cutinization +cutinize +cutireaction +cutis +cutisector +Cutiterebra +cutitis +cutization +cutlass +cutler +cutleress +Cutleria +Cutleriaceae +cutleriaceous +Cutleriales +cutlery +cutlet +cutling +cutlips +cutocellulose +cutoff +cutout +cutover +cutpurse +cuttable +cuttage +cuttail +cuttanee +cutted +cutter +cutterhead +cutterman +cutthroat +cutting +cuttingly +cuttingness +cuttle +cuttlebone +cuttlefish +cuttler +cuttoo +cutty +cuttyhunk +cutup +cutwater +cutweed +cutwork +cutworm +cuvette +Cuvierian +cuvy +cuya +Cuzceno +cwierc +cwm +cyamelide +Cyamus +cyan +cyanacetic +cyanamide +cyananthrol +Cyanastraceae +Cyanastrum +cyanate +cyanaurate +cyanauric +cyanbenzyl +cyancarbonic +Cyanea +cyanean +cyanemia +cyaneous +cyanephidrosis +cyanformate +cyanformic +cyanhidrosis +cyanhydrate +cyanhydric +cyanhydrin +cyanic +cyanicide +cyanidation +cyanide +cyanidin +cyanidine +cyanidrosis +cyanimide +cyanin +cyanine +cyanite +cyanize +cyanmethemoglobin +cyanoacetate +cyanoacetic +cyanoaurate +cyanoauric +cyanobenzene +cyanocarbonic +cyanochlorous +cyanochroia +cyanochroic +Cyanocitta +cyanocrystallin +cyanoderma +cyanogen +cyanogenesis +cyanogenetic +cyanogenic +cyanoguanidine +cyanohermidin +cyanohydrin +cyanol +cyanole +cyanomaclurin +cyanometer +cyanomethaemoglobin +cyanomethemoglobin +cyanometric +cyanometry +cyanopathic +cyanopathy +cyanophile +cyanophilous +cyanophoric +cyanophose +Cyanophyceae +cyanophycean +cyanophyceous +cyanophycin +cyanopia +cyanoplastid +cyanoplatinite +cyanoplatinous +cyanopsia +cyanose +cyanosed +cyanosis +Cyanospiza +cyanotic +cyanotrichite +cyanotype +cyanuramide +cyanurate +cyanuret +cyanuric +cyanurine +cyanus +cyaphenine +cyath +Cyathaspis +Cyathea +Cyatheaceae +cyatheaceous +cyathiform +cyathium +cyathoid +cyatholith +Cyathophyllidae +cyathophylline +cyathophylloid +Cyathophyllum +cyathos +cyathozooid +cyathus +cybernetic +cyberneticist +cybernetics +Cybister +cycad +Cycadaceae +cycadaceous +Cycadales +cycadean +cycadeoid +Cycadeoidea +cycadeous +cycadiform +cycadlike +cycadofilicale +Cycadofilicales +Cycadofilices +cycadofilicinean +Cycadophyta +Cycas +Cycladic +cyclamen +cyclamin +cyclamine +cyclammonium +cyclane +Cyclanthaceae +cyclanthaceous +Cyclanthales +Cyclanthus +cyclar +cyclarthrodial +cyclarthrsis +cyclas +cycle +cyclecar +cycledom +cyclene +cycler +cyclesmith +Cycliae +cyclian +cyclic +cyclical +cyclically +cyclicism +cyclide +cycling +cyclism +cyclist +cyclistic +cyclitic +cyclitis +cyclization +cyclize +cycloalkane +Cyclobothra +cyclobutane +cyclocoelic +cyclocoelous +Cycloconium +cyclodiolefin +cycloganoid +Cycloganoidei +cyclogram +cyclograph +cyclographer +cycloheptane +cycloheptanone +cyclohexane +cyclohexanol +cyclohexanone +cyclohexene +cyclohexyl +cycloid +cycloidal +cycloidally +cycloidean +Cycloidei +cycloidian +cycloidotrope +cyclolith +Cycloloma +cyclomania +cyclometer +cyclometric +cyclometrical +cyclometry +Cyclomyaria +cyclomyarian +cyclonal +cyclone +cyclonic +cyclonical +cyclonically +cyclonist +cyclonite +cyclonologist +cyclonology +cyclonometer +cyclonoscope +cycloolefin +cycloparaffin +cyclope +Cyclopean +cyclopean +cyclopedia +cyclopedic +cyclopedical +cyclopedically +cyclopedist +cyclopentadiene +cyclopentane +cyclopentanone +cyclopentene +Cyclopes +cyclopes +cyclophoria +cyclophoric +Cyclophorus +cyclophrenia +cyclopia +Cyclopic +cyclopism +cyclopite +cycloplegia +cycloplegic +cyclopoid +cyclopropane +Cyclops +Cyclopteridae +cyclopteroid +cyclopterous +cyclopy +cyclorama +cycloramic +Cyclorrhapha +cyclorrhaphous +cycloscope +cyclose +cyclosis +cyclospermous +Cyclospondyli +cyclospondylic +cyclospondylous +Cyclosporales +Cyclosporeae +Cyclosporinae +cyclosporous +Cyclostoma +Cyclostomata +cyclostomate +Cyclostomatidae +cyclostomatous +cyclostome +Cyclostomes +Cyclostomi +Cyclostomidae +cyclostomous +cyclostrophic +cyclostyle +Cyclotella +cyclothem +cyclothure +cyclothurine +Cyclothurus +cyclothyme +cyclothymia +cyclothymiac +cyclothymic +cyclotome +cyclotomic +cyclotomy +Cyclotosaurus +cyclotron +cyclovertebral +cyclus +Cydippe +cydippian +cydippid +Cydippida +Cydonia +Cydonian +cydonium +cyesiology +cyesis +cygneous +cygnet +Cygnid +Cygninae +cygnine +Cygnus +cyke +cylinder +cylindered +cylinderer +cylinderlike +cylindraceous +cylindrarthrosis +Cylindrella +cylindrelloid +cylindrenchyma +cylindric +cylindrical +cylindricality +cylindrically +cylindricalness +cylindricity +cylindricule +cylindriform +cylindrite +cylindrocellular +cylindrocephalic +cylindroconical +cylindroconoidal +cylindrocylindric +cylindrodendrite +cylindrograph +cylindroid +cylindroidal +cylindroma +cylindromatous +cylindrometric +cylindroogival +Cylindrophis +Cylindrosporium +cylindruria +cylix +Cyllenian +Cyllenius +cyllosis +cyma +cymagraph +cymaphen +cymaphyte +cymaphytic +cymaphytism +cymar +cymation +cymatium +cymba +cymbaeform +cymbal +Cymbalaria +cymbaleer +cymbaler +cymbaline +cymbalist +cymballike +cymbalo +cymbalon +cymbate +Cymbella +cymbiform +Cymbium +cymbling +cymbocephalic +cymbocephalous +cymbocephaly +Cymbopogon +cyme +cymelet +cymene +cymiferous +cymling +Cymodoceaceae +cymogene +cymograph +cymographic +cymoid +Cymoidium +cymometer +cymophane +cymophanous +cymophenol +cymoscope +cymose +cymosely +cymotrichous +cymotrichy +cymous +Cymraeg +Cymric +Cymry +cymule +cymulose +cynanche +Cynanchum +cynanthropy +Cynara +cynaraceous +cynarctomachy +cynareous +cynaroid +cynebot +cynegetic +cynegetics +cynegild +cynhyena +Cynias +cyniatria +cyniatrics +cynic +cynical +cynically +cynicalness +cynicism +cynicist +cynipid +Cynipidae +cynipidous +cynipoid +Cynipoidea +Cynips +cynism +cynocephalic +cynocephalous +cynocephalus +cynoclept +Cynocrambaceae +cynocrambaceous +Cynocrambe +Cynodon +cynodont +Cynodontia +Cynogale +cynogenealogist +cynogenealogy +Cynoglossum +Cynognathus +cynography +cynoid +Cynoidea +cynology +Cynomoriaceae +cynomoriaceous +Cynomorium +Cynomorpha +cynomorphic +cynomorphous +Cynomys +cynophile +cynophilic +cynophilist +cynophobe +cynophobia +Cynopithecidae +cynopithecoid +cynopodous +cynorrhodon +Cynosarges +Cynoscion +Cynosura +cynosural +cynosure +Cynosurus +cynotherapy +Cynoxylon +Cynthia +Cynthian +Cynthiidae +Cynthius +cyp +Cyperaceae +cyperaceous +Cyperus +cyphella +cyphellate +Cyphomandra +cyphonautes +cyphonism +Cypraea +cypraeid +Cypraeidae +cypraeiform +cypraeoid +cypre +cypres +cypress +cypressed +cypressroot +Cypria +Cyprian +Cyprididae +Cypridina +Cypridinidae +cypridinoid +Cyprina +cyprine +cyprinid +Cyprinidae +cypriniform +cyprinine +cyprinodont +Cyprinodontes +Cyprinodontidae +cyprinodontoid +cyprinoid +Cyprinoidea +cyprinoidean +Cyprinus +Cypriote +Cypripedium +Cypris +cypsela +Cypseli +Cypselid +Cypselidae +cypseliform +Cypseliformes +cypseline +cypseloid +cypselomorph +Cypselomorphae +cypselomorphic +cypselous +Cypselus +cyptozoic +Cyrano +Cyrenaic +Cyrenaicism +Cyrenian +Cyril +Cyrilla +Cyrillaceae +cyrillaceous +Cyrillian +Cyrillianism +Cyrillic +cyriologic +cyriological +Cyrtandraceae +Cyrtidae +cyrtoceracone +Cyrtoceras +cyrtoceratite +cyrtoceratitic +cyrtograph +cyrtolite +cyrtometer +Cyrtomium +cyrtopia +cyrtosis +Cyrus +cyrus +cyst +cystadenoma +cystadenosarcoma +cystal +cystalgia +cystamine +cystaster +cystatrophia +cystatrophy +cystectasia +cystectasy +cystectomy +cysted +cysteine +cysteinic +cystelcosis +cystenchyma +cystenchymatous +cystencyte +cysterethism +cystic +cysticarpic +cysticarpium +cysticercoid +cysticercoidal +cysticercosis +cysticercus +cysticolous +cystid +Cystidea +cystidean +cystidicolous +cystidium +cystiferous +cystiform +cystigerous +Cystignathidae +cystignathine +cystine +cystinuria +cystirrhea +cystis +cystitis +cystitome +cystoadenoma +cystocarcinoma +cystocarp +cystocarpic +cystocele +cystocolostomy +cystocyte +cystodynia +cystoelytroplasty +cystoenterocele +cystoepiplocele +cystoepithelioma +cystofibroma +Cystoflagellata +cystoflagellate +cystogenesis +cystogenous +cystogram +cystoid +Cystoidea +cystoidean +cystolith +cystolithectomy +cystolithiasis +cystolithic +cystoma +cystomatous +cystomorphous +cystomyoma +cystomyxoma +Cystonectae +cystonectous +cystonephrosis +cystoneuralgia +cystoparalysis +Cystophora +cystophore +cystophotography +cystophthisis +cystoplasty +cystoplegia +cystoproctostomy +Cystopteris +cystoptosis +Cystopus +cystopyelitis +cystopyelography +cystopyelonephritis +cystoradiography +cystorrhagia +cystorrhaphy +cystorrhea +cystosarcoma +cystoschisis +cystoscope +cystoscopic +cystoscopy +cystose +cystospasm +cystospastic +cystospore +cystostomy +cystosyrinx +cystotome +cystotomy +cystotrachelotomy +cystoureteritis +cystourethritis +cystous +cytase +cytasic +Cytherea +Cytherean +Cytherella +Cytherellidae +Cytinaceae +cytinaceous +Cytinus +cytioderm +cytisine +Cytisus +cytitis +cytoblast +cytoblastema +cytoblastemal +cytoblastematous +cytoblastemic +cytoblastemous +cytochemistry +cytochrome +cytochylema +cytocide +cytoclasis +cytoclastic +cytococcus +cytocyst +cytode +cytodendrite +cytoderm +cytodiagnosis +cytodieresis +cytodieretic +cytogamy +cytogene +cytogenesis +cytogenetic +cytogenetical +cytogenetically +cytogeneticist +cytogenetics +cytogenic +cytogenous +cytogeny +cytoglobin +cytohyaloplasm +cytoid +cytokinesis +cytolist +cytologic +cytological +cytologically +cytologist +cytology +cytolymph +cytolysin +cytolysis +cytolytic +cytoma +cytomere +cytometer +cytomicrosome +cytomitome +cytomorphosis +cyton +cytoparaplastin +cytopathologic +cytopathological +cytopathologically +cytopathology +Cytophaga +cytophagous +cytophagy +cytopharynx +cytophil +cytophysics +cytophysiology +cytoplasm +cytoplasmic +cytoplast +cytoplastic +cytoproct +cytopyge +cytoreticulum +cytoryctes +cytosine +cytosome +Cytospora +Cytosporina +cytost +cytostomal +cytostome +cytostroma +cytostromatic +cytotactic +cytotaxis +cytotoxic +cytotoxin +cytotrophoblast +cytotrophy +cytotropic +cytotropism +cytozoic +cytozoon +cytozymase +cytozyme +cytula +Cyzicene +cyzicene +czar +czardas +czardom +czarevitch +czarevna +czarian +czaric +czarina +czarinian +czarish +czarism +czarist +czaristic +czaritza +czarowitch +czarowitz +czarship +Czech +Czechic +Czechish +Czechization +Czechoslovak +Czechoslovakian +D +d +da +daalder +dab +dabb +dabba +dabber +dabble +dabbler +dabbling +dabblingly +dabblingness +dabby +dabchick +Dabih +Dabitis +dablet +daboia +daboya +dabster +dace +Dacelo +Daceloninae +dacelonine +dachshound +dachshund +Dacian +dacite +dacitic +dacker +dacoit +dacoitage +dacoity +dacryadenalgia +dacryadenitis +dacryagogue +dacrycystalgia +Dacrydium +dacryelcosis +dacryoadenalgia +dacryoadenitis +dacryoblenorrhea +dacryocele +dacryocyst +dacryocystalgia +dacryocystitis +dacryocystoblennorrhea +dacryocystocele +dacryocystoptosis +dacryocystorhinostomy +dacryocystosyringotomy +dacryocystotome +dacryocystotomy +dacryohelcosis +dacryohemorrhea +dacryolite +dacryolith +dacryolithiasis +dacryoma +dacryon +dacryops +dacryopyorrhea +dacryopyosis +dacryosolenitis +dacryostenosis +dacryosyrinx +dacryuria +Dactyl +dactyl +dactylar +dactylate +dactylic +dactylically +dactylioglyph +dactylioglyphic +dactylioglyphist +dactylioglyphtic +dactylioglyphy +dactyliographer +dactyliographic +dactyliography +dactyliology +dactyliomancy +dactylion +dactyliotheca +Dactylis +dactylist +dactylitic +dactylitis +dactylogram +dactylograph +dactylographic +dactylography +dactyloid +dactylology +dactylomegaly +dactylonomy +dactylopatagium +Dactylopius +dactylopodite +dactylopore +Dactylopteridae +Dactylopterus +dactylorhiza +dactyloscopic +dactyloscopy +dactylose +dactylosternal +dactylosymphysis +dactylotheca +dactylous +dactylozooid +dactylus +Dacus +dacyorrhea +dad +Dada +dada +Dadaism +Dadaist +dadap +Dadayag +dadder +daddle +daddock +daddocky +daddy +daddynut +dade +dadenhudd +dado +Dadoxylon +Dadu +daduchus +Dadupanthi +dae +Daedal +daedal +Daedalea +Daedalean +Daedalian +Daedalic +Daedalidae +Daedalist +daedaloid +Daedalus +daemon +Daemonelix +daemonic +daemonurgist +daemonurgy +daemony +daer +daff +daffery +daffing +daffish +daffle +daffodil +daffodilly +daffy +daffydowndilly +Dafla +daft +daftberry +daftlike +daftly +daftness +dag +dagaba +dagame +dagassa +Dagbamba +Dagbane +dagesh +Dagestan +dagga +dagger +daggerbush +daggered +daggerlike +daggerproof +daggers +daggle +daggletail +daggletailed +daggly +daggy +daghesh +daglock +Dagmar +Dago +dagoba +Dagomba +dags +Daguerrean +daguerreotype +daguerreotyper +daguerreotypic +daguerreotypist +daguerreotypy +dah +dahabeah +Dahlia +Dahoman +Dahomeyan +dahoon +Daibutsu +daidle +daidly +Daijo +daiker +daikon +Dail +Dailamite +dailiness +daily +daimen +daimiate +daimio +daimon +daimonic +daimonion +daimonistic +daimonology +dain +daincha +dainteth +daintify +daintihood +daintily +daintiness +daintith +dainty +Daira +daira +dairi +dairy +dairying +dairymaid +dairyman +dairywoman +dais +daisied +daisy +daisybush +daitya +daiva +dak +daker +Dakhini +dakir +Dakota +daktylon +daktylos +dal +dalar +Dalarnian +Dalbergia +Dalcassian +Dale +dale +Dalea +Dalecarlian +daleman +daler +dalesfolk +dalesman +dalespeople +daleswoman +daleth +dali +Dalibarda +dalk +dallack +dalle +dalles +dalliance +dallier +dally +dallying +dallyingly +Dalmania +Dalmanites +Dalmatian +Dalmatic +dalmatic +Dalradian +dalt +dalteen +Dalton +dalton +Daltonian +Daltonic +Daltonism +Daltonist +dam +dama +damage +damageability +damageable +damageableness +damageably +damagement +damager +damages +damagingly +daman +Damara +Damascene +damascene +damascened +damascener +damascenine +Damascus +damask +damaskeen +damasse +damassin +Damayanti +dambonitol +dambose +dambrod +dame +damenization +damewort +Damgalnunna +Damia +damiana +Damianist +damie +damier +damine +damkjernite +damlike +dammar +Dammara +damme +dammer +dammish +damn +damnability +damnable +damnableness +damnably +damnation +damnatory +damned +damner +damnification +damnify +Damnii +damning +damningly +damningness +damnonians +Damnonii +damnous +damnously +Damoclean +Damocles +Damoetas +damoiseau +Damon +Damone +damonico +damourite +damp +dampang +damped +dampen +dampener +damper +damping +dampish +dampishly +dampishness +damply +dampness +dampproof +dampproofer +dampproofing +dampy +damsel +damselfish +damselhood +damson +Dan +dan +Dana +Danaan +Danagla +Danai +Danaid +danaid +Danaidae +danaide +Danaidean +Danainae +danaine +Danais +danaite +Danakil +danalite +danburite +dancalite +dance +dancer +danceress +dancery +dancette +dancing +dancingly +dand +danda +dandelion +dander +dandiacal +dandiacally +dandically +dandification +dandify +dandilly +dandily +dandiprat +dandizette +dandle +dandler +dandling +dandlingly +dandruff +dandruffy +dandy +dandydom +dandyish +dandyism +dandyize +dandyling +Dane +Daneball +Daneflower +Danegeld +Danelaw +Daneweed +Danewort +dang +danger +dangerful +dangerfully +dangerless +dangerous +dangerously +dangerousness +dangersome +dangle +dangleberry +danglement +dangler +danglin +dangling +danglingly +Dani +Danian +Danic +danicism +Daniel +Daniele +Danielic +Danielle +Daniglacial +danio +Danish +Danism +Danite +Danization +Danize +dank +Dankali +dankish +dankishness +dankly +dankness +danli +Dannebrog +dannemorite +danner +Dannie +dannock +Danny +danoranja +dansant +danseuse +danta +Dantean +Dantesque +Danthonia +Dantist +Dantology +Dantomania +danton +Dantonesque +Dantonist +Dantophilist +Dantophily +Danube +Danubian +Danuri +Danzig +Danziger +dao +daoine +dap +Dapedium +Dapedius +Daphnaceae +Daphne +Daphnean +Daphnephoria +daphnetin +Daphnia +daphnin +daphnioid +Daphnis +daphnoid +dapicho +dapico +dapifer +dapper +dapperling +dapperly +dapperness +dapple +dappled +dar +darabukka +darac +daraf +Darapti +darat +darbha +darby +Darbyism +Darbyite +Darci +Dard +Dardan +dardanarius +Dardani +dardanium +dardaol +Dardic +Dardistan +dare +dareall +daredevil +daredevilism +daredevilry +daredeviltry +dareful +Daren +darer +Dares +daresay +darg +dargah +darger +Darghin +Dargo +dargsman +dargue +dari +daribah +daric +Darien +Darii +Darin +daring +daringly +daringness +dariole +Darius +Darjeeling +dark +darken +darkener +darkening +darkful +darkhearted +darkheartedness +darkish +darkishness +darkle +darkling +darklings +darkly +darkmans +darkness +darkroom +darkskin +darksome +darksomeness +darky +darling +darlingly +darlingness +Darlingtonia +darn +darnation +darned +darnel +darner +darnex +darning +daroga +daroo +darr +darrein +Darrell +Darren +Darryl +darshana +Darsonval +Darsonvalism +darst +dart +Dartagnan +dartars +dartboard +darter +darting +dartingly +dartingness +dartle +dartlike +dartman +Dartmoor +dartoic +dartoid +dartos +dartre +dartrose +dartrous +darts +dartsman +Darwinian +Darwinical +Darwinically +Darwinism +Darwinist +Darwinistic +Darwinite +Darwinize +Daryl +darzee +das +Daschagga +dash +dashboard +dashed +dashedly +dashee +dasheen +dasher +dashing +dashingly +dashmaker +Dashnak +Dashnakist +Dashnaktzutiun +dashplate +dashpot +dashwheel +dashy +dasi +Dasiphora +dasnt +dassie +dassy +dastard +dastardize +dastardliness +dastardly +dastur +dasturi +Dasya +Dasyatidae +Dasyatis +Dasycladaceae +dasycladaceous +Dasylirion +dasymeter +dasypaedal +dasypaedes +dasypaedic +Dasypeltis +dasyphyllous +Dasypodidae +dasypodoid +Dasyprocta +Dasyproctidae +dasyproctine +Dasypus +Dasystephana +dasyure +Dasyuridae +dasyurine +dasyuroid +Dasyurus +Dasyus +data +datable +datableness +datably +dataria +datary +datch +datcha +date +dateless +datemark +dater +datil +dating +dation +Datisca +Datiscaceae +datiscaceous +datiscetin +datiscin +datiscoside +Datisi +Datism +datival +dative +datively +dativogerundial +datolite +datolitic +dattock +datum +Datura +daturic +daturism +daub +daube +Daubentonia +Daubentoniidae +dauber +daubery +daubing +daubingly +daubreeite +daubreelite +daubster +dauby +Daucus +daud +daughter +daughterhood +daughterkin +daughterless +daughterlike +daughterliness +daughterling +daughterly +daughtership +Daulias +daunch +dauncy +Daunii +daunt +daunter +daunting +dauntingly +dauntingness +dauntless +dauntlessly +dauntlessness +daunton +dauphin +dauphine +dauphiness +Daur +Dauri +daut +dautie +dauw +davach +Davallia +Dave +daven +davenport +daver +daverdy +David +Davidian +Davidic +Davidical +Davidist +davidsonite +Daviesia +daviesite +davit +davoch +Davy +davy +davyne +daw +dawdle +dawdler +dawdling +dawdlingly +dawdy +dawish +dawkin +Dawn +dawn +dawning +dawnlight +dawnlike +dawnstreak +dawnward +dawny +Dawson +Dawsonia +Dawsoniaceae +dawsoniaceous +dawsonite +dawtet +dawtit +dawut +day +dayabhaga +Dayakker +dayal +daybeam +dayberry +dayblush +daybook +daybreak +daydawn +daydream +daydreamer +daydreamy +daydrudge +dayflower +dayfly +daygoing +dayless +daylight +daylit +daylong +dayman +daymare +daymark +dayroom +days +dayshine +daysman +dayspring +daystar +daystreak +daytale +daytide +daytime +daytimes +dayward +daywork +dayworker +daywrit +Daza +daze +dazed +dazedly +dazedness +dazement +dazingly +dazy +dazzle +dazzlement +dazzler +dazzlingly +de +deacetylate +deacetylation +deacidification +deacidify +deacon +deaconal +deaconate +deaconess +deaconhood +deaconize +deaconry +deaconship +deactivate +deactivation +dead +deadbeat +deadborn +deadcenter +deaden +deadener +deadening +deader +deadeye +deadfall +deadhead +deadheadism +deadhearted +deadheartedly +deadheartedness +deadhouse +deading +deadish +deadishly +deadishness +deadlatch +deadlight +deadlily +deadline +deadliness +deadlock +deadly +deadman +deadmelt +deadness +deadpan +deadpay +deadtongue +deadwood +deadwort +deaerate +deaeration +deaerator +deaf +deafen +deafening +deafeningly +deafforest +deafforestation +deafish +deafly +deafness +deair +deal +dealable +dealate +dealated +dealation +dealbate +dealbation +dealbuminize +dealcoholist +dealcoholization +dealcoholize +dealer +dealerdom +dealership +dealfish +dealing +dealkalize +dealkylate +dealkylation +dealt +deambulation +deambulatory +deamidase +deamidate +deamidation +deamidization +deamidize +deaminase +deaminate +deamination +deaminization +deaminize +deammonation +Dean +dean +deanathematize +deaner +deanery +deaness +deanimalize +deanship +deanthropomorphic +deanthropomorphism +deanthropomorphization +deanthropomorphize +deappetizing +deaquation +dear +dearborn +dearie +dearly +dearness +dearomatize +dearsenicate +dearsenicator +dearsenicize +dearth +dearthfu +dearticulation +dearworth +dearworthily +dearworthiness +deary +deash +deasil +deaspirate +deaspiration +deassimilation +death +deathbed +deathblow +deathday +deathful +deathfully +deathfulness +deathify +deathin +deathiness +deathless +deathlessly +deathlessness +deathlike +deathliness +deathling +deathly +deathroot +deathshot +deathsman +deathtrap +deathward +deathwards +deathwatch +deathweed +deathworm +deathy +deave +deavely +Deb +deb +debacle +debadge +debamboozle +debar +debarbarization +debarbarize +debark +debarkation +debarkment +debarment +debarrance +debarrass +debarration +debase +debasedness +debasement +debaser +debasingly +debatable +debate +debateful +debatefully +debatement +debater +debating +debatingly +debauch +debauched +debauchedly +debauchedness +debauchee +debaucher +debauchery +debauchment +Debbie +Debby +debby +debeige +debellate +debellation +debellator +deben +debenture +debentured +debenzolize +Debi +debile +debilissima +debilitant +debilitate +debilitated +debilitation +debilitative +debility +debind +debit +debiteuse +debituminization +debituminize +deblaterate +deblateration +deboistly +deboistness +debonair +debonaire +debonairity +debonairly +debonairness +debonnaire +Deborah +debord +debordment +debosh +deboshed +debouch +debouchment +debride +debrief +debris +debrominate +debromination +debruise +debt +debtee +debtful +debtless +debtor +debtorship +debullition +debunk +debunker +debunkment +debus +Debussyan +Debussyanize +debut +debutant +debutante +decachord +decad +decadactylous +decadal +decadally +decadarch +decadarchy +decadary +decadation +decade +decadence +decadency +decadent +decadentism +decadently +decadescent +decadianome +decadic +decadist +decadrachm +decadrachma +decaesarize +decaffeinate +decaffeinize +decafid +decagon +decagonal +decagram +decagramme +decahedral +decahedron +decahydrate +decahydrated +decahydronaphthalene +Decaisnea +decal +decalcification +decalcifier +decalcify +decalcomania +decalcomaniac +decalescence +decalescent +Decalin +decaliter +decalitre +decalobate +Decalogist +Decalogue +decalvant +decalvation +decameral +Decameron +Decameronic +decamerous +decameter +decametre +decamp +decampment +decan +decanal +decanally +decanate +decane +decangular +decani +decanically +decannulation +decanonization +decanonize +decant +decantate +decantation +decanter +decantherous +decap +decapetalous +decaphyllous +decapitable +decapitalization +decapitalize +decapitate +decapitation +decapitator +decapod +Decapoda +decapodal +decapodan +decapodiform +decapodous +decapper +decapsulate +decapsulation +decarbonate +decarbonator +decarbonization +decarbonize +decarbonized +decarbonizer +decarboxylate +decarboxylation +decarboxylization +decarboxylize +decarburation +decarburization +decarburize +decarch +decarchy +decardinalize +decare +decarhinus +decarnate +decarnated +decart +decasemic +decasepalous +decaspermal +decaspermous +decast +decastellate +decastere +decastich +decastyle +decasualization +decasualize +decasyllabic +decasyllable +decasyllabon +decate +decathlon +decatholicize +decatize +decatizer +decatoic +decator +decatyl +decaudate +decaudation +decay +decayable +decayed +decayedness +decayer +decayless +decease +deceased +decedent +deceit +deceitful +deceitfully +deceitfulness +deceivability +deceivable +deceivableness +deceivably +deceive +deceiver +deceiving +deceivingly +decelerate +deceleration +decelerator +decelerometer +December +Decemberish +Decemberly +Decembrist +decemcostate +decemdentate +decemfid +decemflorous +decemfoliate +decemfoliolate +decemjugate +decemlocular +decempartite +decempeda +decempedal +decempedate +decempennate +decemplex +decemplicate +decempunctate +decemstriate +decemuiri +decemvir +decemviral +decemvirate +decemvirship +decenary +decence +decency +decene +decennal +decennary +decennia +decenniad +decennial +decennially +decennium +decennoval +decent +decenter +decently +decentness +decentralism +decentralist +decentralization +decentralize +decentration +decentre +decenyl +decephalization +deceptibility +deceptible +deception +deceptious +deceptiously +deceptitious +deceptive +deceptively +deceptiveness +deceptivity +decerebrate +decerebration +decerebrize +decern +decerniture +decernment +decess +decession +dechemicalization +dechemicalize +dechenite +Dechlog +dechlore +dechlorination +dechoralize +dechristianization +dechristianize +Decian +deciare +deciatine +decibel +deciceronize +decidable +decide +decided +decidedly +decidedness +decider +decidingly +decidua +decidual +deciduary +Deciduata +deciduate +deciduitis +deciduoma +deciduous +deciduously +deciduousness +decigram +decigramme +decil +decile +deciliter +decillion +decillionth +decima +decimal +decimalism +decimalist +decimalization +decimalize +decimally +decimate +decimation +decimator +decimestrial +decimeter +decimolar +decimole +decimosexto +Decimus +decinormal +decipher +decipherability +decipherable +decipherably +decipherer +decipherment +decipium +decipolar +decision +decisional +decisive +decisively +decisiveness +decistere +decitizenize +Decius +decivilization +decivilize +deck +decke +decked +deckel +decker +deckhead +deckhouse +deckie +decking +deckle +deckload +deckswabber +declaim +declaimant +declaimer +declamation +declamatoriness +declamatory +declarable +declarant +declaration +declarative +declaratively +declarator +declaratorily +declaratory +declare +declared +declaredly +declaredness +declarer +declass +declassicize +declassify +declension +declensional +declensionally +declericalize +declimatize +declinable +declinal +declinate +declination +declinational +declinatory +declinature +decline +declined +declinedness +decliner +declinograph +declinometer +declivate +declive +declivitous +declivity +declivous +declutch +decoagulate +decoagulation +decoat +decocainize +decoct +decoctible +decoction +decoctive +decoctum +decode +Decodon +decohere +decoherence +decoherer +decohesion +decoic +decoke +decollate +decollated +decollation +decollator +decolletage +decollete +decolor +decolorant +decolorate +decoloration +decolorimeter +decolorization +decolorize +decolorizer +decolour +decommission +decompensate +decompensation +decomplex +decomponible +decomposability +decomposable +decompose +decomposed +decomposer +decomposite +decomposition +decomposure +decompound +decompoundable +decompoundly +decompress +decompressing +decompression +decompressive +deconcatenate +deconcentrate +deconcentration +deconcentrator +decongestive +deconsecrate +deconsecration +deconsider +deconsideration +decontaminate +decontamination +decontrol +deconventionalize +decopperization +decopperize +decorability +decorable +decorably +decorament +decorate +decorated +decoration +decorationist +decorative +decoratively +decorativeness +decorator +decoratory +decorist +decorous +decorously +decorousness +decorrugative +decorticate +decortication +decorticator +decorticosis +decorum +decostate +decoy +decoyer +decoyman +decrassify +decream +decrease +decreaseless +decreasing +decreasingly +decreation +decreative +decree +decreeable +decreement +decreer +decreet +decrement +decrementless +decremeter +decrepit +decrepitate +decrepitation +decrepitly +decrepitness +decrepitude +decrescence +decrescendo +decrescent +decretal +decretalist +decrete +decretist +decretive +decretively +decretorial +decretorily +decretory +decretum +decrew +decrial +decried +decrier +decrown +decrudescence +decrustation +decry +decrystallization +decubital +decubitus +decultivate +deculturate +decuman +decumana +decumanus +Decumaria +decumary +decumbence +decumbency +decumbent +decumbently +decumbiture +decuple +decuplet +decuria +decurion +decurionate +decurrence +decurrency +decurrent +decurrently +decurring +decursion +decursive +decursively +decurtate +decurvation +decurvature +decurve +decury +decus +decussate +decussated +decussately +decussation +decussis +decussorium +decyl +decylene +decylenic +decylic +decyne +Dedan +Dedanim +Dedanite +dedecorate +dedecoration +dedecorous +dedendum +dedentition +dedicant +dedicate +dedicatee +dedication +dedicational +dedicative +dedicator +dedicatorial +dedicatorily +dedicatory +dedicature +dedifferentiate +dedifferentiation +dedimus +deditician +dediticiancy +dedition +dedo +dedoggerelize +dedogmatize +dedolation +deduce +deducement +deducibility +deducible +deducibleness +deducibly +deducive +deduct +deductible +deduction +deductive +deductively +deductory +deduplication +dee +deed +deedbox +deedeed +deedful +deedfully +deedily +deediness +deedless +deedy +deem +deemer +deemie +deemster +deemstership +deep +deepen +deepener +deepening +deepeningly +Deepfreeze +deeping +deepish +deeplier +deeply +deepmost +deepmouthed +deepness +deepsome +deepwater +deepwaterman +deer +deerberry +deerdog +deerdrive +deerfood +deerhair +deerherd +deerhorn +deerhound +deerlet +deermeat +deerskin +deerstalker +deerstalking +deerstand +deerstealer +deertongue +deerweed +deerwood +deeryard +deevey +deevilick +deface +defaceable +defacement +defacer +defacing +defacingly +defalcate +defalcation +defalcator +defalk +defamation +defamatory +defame +defamed +defamer +defamingly +defassa +defat +default +defaultant +defaulter +defaultless +defaulture +defeasance +defeasanced +defease +defeasibility +defeasible +defeasibleness +defeat +defeater +defeatism +defeatist +defeatment +defeature +defecant +defecate +defecation +defecator +defect +defectibility +defectible +defection +defectionist +defectious +defective +defectively +defectiveness +defectless +defectology +defector +defectoscope +defedation +defeminize +defence +defend +defendable +defendant +defender +defendress +defenestration +defensative +defense +defenseless +defenselessly +defenselessness +defensibility +defensible +defensibleness +defensibly +defension +defensive +defensively +defensiveness +defensor +defensorship +defensory +defer +deferable +deference +deferent +deferentectomy +deferential +deferentiality +deferentially +deferentitis +deferment +deferrable +deferral +deferred +deferrer +deferrization +deferrize +defervesce +defervescence +defervescent +defeudalize +defiable +defial +defiance +defiant +defiantly +defiantness +defiber +defibrinate +defibrination +defibrinize +deficience +deficiency +deficient +deficiently +deficit +defier +defiguration +defilade +defile +defiled +defiledness +defilement +defiler +defiliation +defiling +defilingly +definability +definable +definably +define +defined +definedly +definement +definer +definiendum +definiens +definite +definitely +definiteness +definition +definitional +definitiones +definitive +definitively +definitiveness +definitization +definitize +definitor +definitude +deflagrability +deflagrable +deflagrate +deflagration +deflagrator +deflate +deflation +deflationary +deflationist +deflator +deflect +deflectable +deflected +deflection +deflectionization +deflectionize +deflective +deflectometer +deflector +deflesh +deflex +deflexibility +deflexible +deflexion +deflexure +deflocculant +deflocculate +deflocculation +deflocculator +deflorate +defloration +deflorescence +deflower +deflowerer +defluent +defluous +defluvium +defluxion +defoedation +defog +defoliage +defoliate +defoliated +defoliation +defoliator +deforce +deforcement +deforceor +deforcer +deforciant +deforest +deforestation +deforester +deform +deformability +deformable +deformalize +deformation +deformational +deformative +deformed +deformedly +deformedness +deformer +deformeter +deformism +deformity +defortify +defoul +defraud +defraudation +defrauder +defraudment +defray +defrayable +defrayal +defrayer +defrayment +defreeze +defrication +defrock +defrost +defroster +deft +defterdar +deftly +deftness +defunct +defunction +defunctionalization +defunctionalize +defunctness +defuse +defusion +defy +defyingly +deg +deganglionate +degarnish +degas +degasification +degasifier +degasify +degasser +degauss +degelatinize +degelation +degeneracy +degeneralize +degenerate +degenerately +degenerateness +degeneration +degenerationist +degenerative +degenerescence +degenerescent +degentilize +degerm +degerminate +degerminator +degged +degger +deglaciation +deglaze +deglutinate +deglutination +deglutition +deglutitious +deglutitive +deglutitory +deglycerin +deglycerine +degorge +degradable +degradand +degradation +degradational +degradative +degrade +degraded +degradedly +degradedness +degradement +degrader +degrading +degradingly +degradingness +degraduate +degraduation +degrain +degrease +degreaser +degree +degreeless +degreewise +degression +degressive +degressively +degu +Deguelia +deguelin +degum +degummer +degust +degustation +dehair +dehairer +Dehaites +deheathenize +dehematize +dehepatize +Dehgan +dehisce +dehiscence +dehiscent +dehistoricize +Dehkan +dehnstufe +dehonestate +dehonestation +dehorn +dehorner +dehors +dehort +dehortation +dehortative +dehortatory +dehorter +dehull +dehumanization +dehumanize +dehumidification +dehumidifier +dehumidify +dehusk +Dehwar +dehydrant +dehydrase +dehydrate +dehydration +dehydrator +dehydroascorbic +dehydrocorydaline +dehydrofreezing +dehydrogenase +dehydrogenate +dehydrogenation +dehydrogenization +dehydrogenize +dehydromucic +dehydrosparteine +dehypnotize +deice +deicer +deicidal +deicide +deictic +deictical +deictically +deidealize +Deidesheimer +deific +deifical +deification +deificatory +deifier +deiform +deiformity +deify +deign +Deimos +deincrustant +deindividualization +deindividualize +deindividuate +deindustrialization +deindustrialize +deink +Deino +Deinocephalia +Deinoceras +Deinodon +Deinodontidae +deinos +Deinosauria +Deinotherium +deinsularize +deintellectualization +deintellectualize +deionize +Deipara +deiparous +Deiphobus +deipnodiplomatic +deipnophobia +deipnosophism +deipnosophist +deipnosophistic +deipotent +Deirdre +deiseal +deisidaimonia +deism +deist +deistic +deistical +deistically +deisticalness +deity +deityship +deject +dejecta +dejected +dejectedly +dejectedness +dejectile +dejection +dejectly +dejectory +dejecture +dejerate +dejeration +dejerator +dejeune +dejeuner +dejunkerize +Dekabrist +dekaparsec +dekapode +dekko +dekle +deknight +Del +delabialization +delabialize +delacrimation +delactation +delaine +delaminate +delamination +delapse +delapsion +delate +delater +delatinization +delatinize +delation +delator +delatorian +Delaware +Delawarean +delawn +delay +delayable +delayage +delayer +delayful +delaying +delayingly +Delbert +dele +delead +delectability +delectable +delectableness +delectably +delectate +delectation +delectus +delegable +delegacy +delegalize +delegant +delegate +delegatee +delegateship +delegation +delegative +delegator +delegatory +delenda +Delesseria +Delesseriaceae +delesseriaceous +delete +deleterious +deleteriously +deleteriousness +deletion +deletive +deletory +delf +delft +delftware +Delhi +Delia +Delian +deliberalization +deliberalize +deliberant +deliberate +deliberately +deliberateness +deliberation +deliberative +deliberatively +deliberativeness +deliberator +delible +delicacy +delicate +delicately +delicateness +delicatesse +delicatessen +delicense +Delichon +delicioso +Delicious +delicious +deliciously +deliciousness +delict +delictum +deligated +deligation +delight +delightable +delighted +delightedly +delightedness +delighter +delightful +delightfully +delightfulness +delighting +delightingly +delightless +delightsome +delightsomely +delightsomeness +delignate +delignification +Delilah +delime +delimit +delimitate +delimitation +delimitative +delimiter +delimitize +delineable +delineament +delineate +delineation +delineative +delineator +delineatory +delineature +delinquence +delinquency +delinquent +delinquently +delint +delinter +deliquesce +deliquescence +deliquescent +deliquium +deliracy +delirament +deliration +deliriant +delirifacient +delirious +deliriously +deliriousness +delirium +delitescence +delitescency +delitescent +deliver +deliverable +deliverance +deliverer +deliveress +deliveror +delivery +deliveryman +dell +Della +dellenite +Delobranchiata +delocalization +delocalize +delomorphic +delomorphous +deloul +delouse +delphacid +Delphacidae +Delphian +Delphin +Delphinapterus +delphine +delphinic +Delphinid +Delphinidae +delphinin +delphinine +delphinite +Delphinium +Delphinius +delphinoid +Delphinoidea +delphinoidine +Delphinus +delphocurarine +Delsarte +Delsartean +Delsartian +Delta +delta +deltafication +deltaic +deltal +deltarium +deltation +delthyrial +delthyrium +deltic +deltidial +deltidium +deltiology +deltohedron +deltoid +deltoidal +delubrum +deludable +delude +deluder +deludher +deluding +deludingly +deluge +deluminize +delundung +delusion +delusional +delusionist +delusive +delusively +delusiveness +delusory +deluster +deluxe +delve +delver +demagnetizable +demagnetization +demagnetize +demagnetizer +demagog +demagogic +demagogical +demagogically +demagogism +demagogue +demagoguery +demagogy +demal +demand +demandable +demandant +demander +demanding +demandingly +demanganization +demanganize +demantoid +demarcate +demarcation +demarcator +demarch +demarchy +demargarinate +demark +demarkation +demast +dematerialization +dematerialize +Dematiaceae +dematiaceous +deme +demean +demeanor +demegoric +demency +dement +dementate +dementation +demented +dementedly +dementedness +dementholize +dementia +demephitize +demerit +demeritorious +demeritoriously +Demerol +demersal +demersed +demersion +demesman +demesmerize +demesne +demesnial +demetallize +demethylate +demethylation +Demetrian +demetricize +demi +demiadult +demiangel +demiassignation +demiatheism +demiatheist +demibarrel +demibastion +demibastioned +demibath +demibeast +demibelt +demibob +demibombard +demibrassart +demibrigade +demibrute +demibuckram +demicadence +demicannon +demicanon +demicanton +demicaponier +demichamfron +demicircle +demicircular +demicivilized +demicolumn +demicoronal +demicritic +demicuirass +demiculverin +demicylinder +demicylindrical +demidandiprat +demideify +demideity +demidevil +demidigested +demidistance +demiditone +demidoctor +demidog +demidolmen +demidome +demieagle +demifarthing +demifigure +demiflouncing +demifusion +demigardebras +demigauntlet +demigentleman +demiglobe +demigod +demigoddess +demigoddessship +demigorge +demigriffin +demigroat +demihag +demihearse +demiheavenly +demihigh +demihogshead +demihorse +demihuman +demijambe +demijohn +demikindred +demiking +demilance +demilancer +demilawyer +demilegato +demilion +demilitarization +demilitarize +demiliterate +demilune +demiluster +demilustre +demiman +demimark +demimentoniere +demimetope +demimillionaire +demimondaine +demimonde +demimonk +deminatured +demineralization +demineralize +deminude +deminudity +demioctagonal +demioctangular +demiofficial +demiorbit +demiourgoi +demiowl +demiox +demipagan +demiparallel +demipauldron +demipectinate +demipesade +demipike +demipillar +demipique +demiplacate +demiplate +demipomada +demipremise +demipremiss +demipriest +demipronation +demipuppet +demiquaver +demiracle +demiram +demirelief +demirep +demirevetment +demirhumb +demirilievo +demirobe +demisability +demisable +demisacrilege +demisang +demisangue +demisavage +demise +demiseason +demisecond +demisemiquaver +demisemitone +demisheath +demishirt +demisovereign +demisphere +demiss +demission +demissionary +demissly +demissness +demissory +demisuit +demit +demitasse +demitint +demitoilet +demitone +demitrain +demitranslucence +demitube +demiturned +demiurge +demiurgeous +demiurgic +demiurgical +demiurgically +demiurgism +demivambrace +demivirgin +demivoice +demivol +demivolt +demivotary +demiwivern +demiwolf +demnition +demob +demobilization +demobilize +democracy +democrat +democratian +democratic +democratical +democratically +democratifiable +democratism +democratist +democratization +democratize +demodectic +demoded +Demodex +Demodicidae +Demodocus +demodulation +demodulator +demogenic +Demogorgon +demographer +demographic +demographical +demographically +demographist +demography +demoid +demoiselle +demolish +demolisher +demolishment +demolition +demolitionary +demolitionist +demological +demology +Demon +demon +demonastery +demoness +demonetization +demonetize +demoniac +demoniacal +demoniacally +demoniacism +demonial +demonian +demonianism +demoniast +demonic +demonical +demonifuge +demonish +demonism +demonist +demonize +demonkind +demonland +demonlike +demonocracy +demonograph +demonographer +demonography +demonolater +demonolatrous +demonolatrously +demonolatry +demonologer +demonologic +demonological +demonologically +demonologist +demonology +demonomancy +demonophobia +demonry +demonship +demonstrability +demonstrable +demonstrableness +demonstrably +demonstrant +demonstratable +demonstrate +demonstratedly +demonstrater +demonstration +demonstrational +demonstrationist +demonstrative +demonstratively +demonstrativeness +demonstrator +demonstratorship +demonstratory +demophil +demophilism +demophobe +Demophon +Demophoon +demoralization +demoralize +demoralizer +demorphinization +demorphism +demos +Demospongiae +Demosthenean +Demosthenic +demote +demotic +demotics +demotion +demotist +demount +demountability +demountable +dempster +demulce +demulcent +demulsibility +demulsify +demulsion +demure +demurely +demureness +demurity +demurrable +demurrage +demurral +demurrant +demurrer +demurring +demurringly +demutization +demy +demyship +den +denarcotization +denarcotize +denarius +denaro +denary +denat +denationalization +denationalize +denaturalization +denaturalize +denaturant +denaturate +denaturation +denature +denaturization +denaturize +denaturizer +denazify +denda +dendrachate +dendral +Dendraspis +dendraxon +dendric +dendriform +dendrite +Dendrites +dendritic +dendritical +dendritically +dendritiform +Dendrium +Dendrobates +Dendrobatinae +dendrobe +Dendrobium +Dendrocalamus +Dendroceratina +dendroceratine +Dendrochirota +dendrochronological +dendrochronologist +dendrochronology +dendroclastic +Dendrocoela +dendrocoelan +dendrocoele +dendrocoelous +Dendrocolaptidae +dendrocolaptine +Dendroctonus +Dendrocygna +dendrodont +Dendrodus +Dendroeca +Dendrogaea +Dendrogaean +dendrograph +dendrography +Dendrohyrax +Dendroica +dendroid +dendroidal +Dendroidea +Dendrolagus +dendrolatry +Dendrolene +dendrolite +dendrologic +dendrological +dendrologist +dendrologous +dendrology +Dendromecon +dendrometer +dendron +dendrophil +dendrophile +dendrophilous +Dendropogon +Dene +dene +Deneb +Denebola +denegate +denegation +denehole +denervate +denervation +deneutralization +dengue +deniable +denial +denicotinize +denier +denierage +denierer +denigrate +denigration +denigrator +denim +Denis +denitrate +denitration +denitrator +denitrificant +denitrification +denitrificator +denitrifier +denitrify +denitrize +denization +denizen +denizenation +denizenize +denizenship +Denmark +dennet +Dennis +Dennstaedtia +denominable +denominate +denomination +denominational +denominationalism +denominationalist +denominationalize +denominationally +denominative +denominatively +denominator +denotable +denotation +denotative +denotatively +denotativeness +denotatum +denote +denotement +denotive +denouement +denounce +denouncement +denouncer +dense +densely +densen +denseness +denshare +densher +denshire +densification +densifier +densify +densimeter +densimetric +densimetrically +densimetry +densitometer +density +dent +dentagra +dental +dentale +dentalgia +Dentaliidae +dentalism +dentality +Dentalium +dentalization +dentalize +dentally +dentaphone +Dentaria +dentary +dentata +dentate +dentated +dentately +dentation +dentatoangulate +dentatocillitate +dentatocostate +dentatocrenate +dentatoserrate +dentatosetaceous +dentatosinuate +dentel +dentelated +dentelle +dentelure +denter +dentex +dentical +denticate +Denticeti +denticle +denticular +denticulate +denticulately +denticulation +denticule +dentiferous +dentification +dentiform +dentifrice +dentigerous +dentil +dentilabial +dentilated +dentilation +dentile +dentilingual +dentiloquist +dentiloquy +dentimeter +dentin +dentinal +dentinalgia +dentinasal +dentine +dentinitis +dentinoblast +dentinocemental +dentinoid +dentinoma +dentiparous +dentiphone +dentiroster +dentirostral +dentirostrate +Dentirostres +dentiscalp +dentist +dentistic +dentistical +dentistry +dentition +dentoid +dentolabial +dentolingual +dentonasal +dentosurgical +dentural +denture +denty +denucleate +denudant +denudate +denudation +denudative +denude +denuder +denumerable +denumerably +denumeral +denumerant +denumerantive +denumeration +denumerative +denunciable +denunciant +denunciate +denunciation +denunciative +denunciatively +denunciator +denunciatory +denutrition +deny +denyingly +deobstruct +deobstruent +deoccidentalize +deoculate +deodand +deodara +deodorant +deodorization +deodorize +deodorizer +deontological +deontologist +deontology +deoperculate +deoppilant +deoppilate +deoppilation +deoppilative +deordination +deorganization +deorganize +deorientalize +deorsumvergence +deorsumversion +deorusumduction +deossification +deossify +deota +deoxidant +deoxidate +deoxidation +deoxidative +deoxidator +deoxidization +deoxidize +deoxidizer +deoxygenate +deoxygenation +deoxygenization +deozonization +deozonize +deozonizer +depa +depaganize +depaint +depancreatization +depancreatize +depark +deparliament +depart +departed +departer +departisanize +departition +department +departmental +departmentalism +departmentalization +departmentalize +departmentally +departmentization +departmentize +departure +depas +depascent +depass +depasturable +depasturage +depasturation +depasture +depatriate +depauperate +depauperation +depauperization +depauperize +depencil +depend +dependability +dependable +dependableness +dependably +dependence +dependency +dependent +dependently +depender +depending +dependingly +depeople +deperdite +deperditely +deperition +depersonalization +depersonalize +depersonize +depetalize +depeter +depetticoat +dephase +dephilosophize +dephlegmate +dephlegmation +dephlegmatize +dephlegmator +dephlegmatory +dephlegmedness +dephlogisticate +dephlogisticated +dephlogistication +dephosphorization +dephosphorize +dephysicalization +dephysicalize +depickle +depict +depicter +depiction +depictive +depicture +depiedmontize +depigment +depigmentate +depigmentation +depigmentize +depilate +depilation +depilator +depilatory +depilitant +depilous +deplaceable +deplane +deplasmolysis +deplaster +deplenish +deplete +deplethoric +depletion +depletive +depletory +deploitation +deplorability +deplorable +deplorableness +deplorably +deploration +deplore +deplored +deploredly +deploredness +deplorer +deploringly +deploy +deployment +deplumate +deplumated +deplumation +deplume +deplump +depoetize +depoh +depolarization +depolarize +depolarizer +depolish +depolishing +depolymerization +depolymerize +depone +deponent +depopularize +depopulate +depopulation +depopulative +depopulator +deport +deportable +deportation +deportee +deporter +deportment +deposable +deposal +depose +deposer +deposit +depositary +depositation +depositee +deposition +depositional +depositive +depositor +depository +depositum +depositure +depot +depotentiate +depotentiation +depravation +deprave +depraved +depravedly +depravedness +depraver +depravingly +depravity +deprecable +deprecate +deprecatingly +deprecation +deprecative +deprecator +deprecatorily +deprecatoriness +deprecatory +depreciable +depreciant +depreciate +depreciatingly +depreciation +depreciative +depreciatively +depreciator +depreciatoriness +depreciatory +depredate +depredation +depredationist +depredator +depredatory +depress +depressant +depressed +depressibility +depressible +depressing +depressingly +depressingness +depression +depressive +depressively +depressiveness +depressomotor +depressor +depreter +deprint +depriorize +deprivable +deprival +deprivate +deprivation +deprivative +deprive +deprivement +depriver +deprovincialize +depside +depth +depthen +depthing +depthless +depthometer +depthwise +depullulation +depurant +depurate +depuration +depurative +depurator +depuratory +depursement +deputable +deputation +deputational +deputationist +deputationize +deputative +deputatively +deputator +depute +deputize +deputy +deputyship +dequeen +derabbinize +deracialize +deracinate +deracination +deradelphus +deradenitis +deradenoncus +derah +deraign +derail +derailer +derailment +derange +derangeable +deranged +derangement +deranger +derat +derate +derater +derationalization +derationalize +deratization +deray +Derbend +Derby +derby +derbylite +dere +deregister +deregulationize +dereism +dereistic +dereistically +Derek +derelict +dereliction +derelictly +derelictness +dereligion +dereligionize +derencephalocele +derencephalus +deresinate +deresinize +deric +deride +derider +deridingly +Deringa +Deripia +derisible +derision +derisive +derisively +derisiveness +derisory +derivability +derivable +derivably +derival +derivant +derivate +derivately +derivation +derivational +derivationally +derivationist +derivatist +derivative +derivatively +derivativeness +derive +derived +derivedly +derivedness +deriver +derm +derma +Dermacentor +dermad +dermahemia +dermal +dermalgia +dermalith +dermamyiasis +dermanaplasty +dermapostasis +Dermaptera +dermapteran +dermapterous +dermaskeleton +dermasurgery +dermatagra +dermatalgia +dermataneuria +dermatatrophia +dermatauxe +dermathemia +dermatic +dermatine +dermatitis +Dermatobia +dermatocele +dermatocellulitis +dermatoconiosis +Dermatocoptes +dermatocoptic +dermatocyst +dermatodynia +dermatogen +dermatoglyphics +dermatograph +dermatographia +dermatography +dermatoheteroplasty +dermatoid +dermatological +dermatologist +dermatology +dermatolysis +dermatoma +dermatome +dermatomere +dermatomic +dermatomuscular +dermatomyces +dermatomycosis +dermatomyoma +dermatoneural +dermatoneurology +dermatoneurosis +dermatonosus +dermatopathia +dermatopathic +dermatopathology +dermatopathophobia +Dermatophagus +dermatophobia +dermatophone +dermatophony +dermatophyte +dermatophytic +dermatophytosis +dermatoplasm +dermatoplast +dermatoplastic +dermatoplasty +dermatopnagic +dermatopsy +Dermatoptera +dermatoptic +dermatorrhagia +dermatorrhea +dermatorrhoea +dermatosclerosis +dermatoscopy +dermatosis +dermatoskeleton +dermatotherapy +dermatotome +dermatotomy +dermatotropic +dermatoxerasia +dermatozoon +dermatozoonosis +dermatrophia +dermatrophy +dermenchysis +Dermestes +dermestid +Dermestidae +dermestoid +dermic +dermis +dermitis +dermoblast +Dermobranchia +dermobranchiata +dermobranchiate +Dermochelys +dermochrome +dermococcus +dermogastric +dermographia +dermographic +dermographism +dermography +dermohemal +dermohemia +dermohumeral +dermoid +dermoidal +dermoidectomy +dermol +dermolysis +dermomuscular +dermomycosis +dermoneural +dermoneurosis +dermonosology +dermoosseous +dermoossification +dermopathic +dermopathy +dermophlebitis +dermophobe +dermophyte +dermophytic +dermoplasty +Dermoptera +dermopteran +dermopterous +dermoreaction +Dermorhynchi +dermorhynchous +dermosclerite +dermoskeletal +dermoskeleton +dermostenosis +dermostosis +dermosynovitis +dermotropic +dermovaccine +dermutation +dern +dernier +derodidymus +derogate +derogately +derogation +derogative +derogatively +derogator +derogatorily +derogatoriness +derogatory +Derotrema +Derotremata +derotremate +derotrematous +derotreme +derout +Derrick +derrick +derricking +derrickman +derride +derries +derringer +Derris +derry +dertrotheca +dertrum +deruinate +deruralize +derust +dervish +dervishhood +dervishism +dervishlike +desaccharification +desacralization +desacralize +desalt +desamidization +desand +desaturate +desaturation +desaurin +descale +descant +descanter +descantist +descend +descendable +descendance +descendant +descendence +descendent +descendental +descendentalism +descendentalist +descendentalistic +descender +descendibility +descendible +descending +descendingly +descension +descensional +descensionist +descensive +descent +Deschampsia +descloizite +descort +describability +describable +describably +describe +describer +descrier +descript +description +descriptionist +descriptionless +descriptive +descriptively +descriptiveness +descriptory +descrive +descry +deseasonalize +desecrate +desecrater +desecration +desectionalize +deseed +desegmentation +desegmented +desensitization +desensitize +desensitizer +desentimentalize +deseret +desert +deserted +desertedly +desertedness +deserter +desertful +desertfully +desertic +deserticolous +desertion +desertism +desertless +desertlessly +desertlike +desertness +desertress +desertrice +desertward +deserve +deserved +deservedly +deservedness +deserveless +deserver +deserving +deservingly +deservingness +desex +desexualization +desexualize +deshabille +desi +desiccant +desiccate +desiccation +desiccative +desiccator +desiccatory +desiderant +desiderata +desiderate +desideration +desiderative +desideratum +desight +desightment +design +designable +designate +designation +designative +designator +designatory +designatum +designed +designedly +designedness +designee +designer +designful +designfully +designfulness +designing +designingly +designless +designlessly +designlessness +desilicate +desilicification +desilicify +desiliconization +desiliconize +desilver +desilverization +desilverize +desilverizer +desinence +desinent +desiodothyroxine +desipience +desipiency +desipient +desirability +desirable +desirableness +desirably +desire +desired +desiredly +desiredness +desireful +desirefulness +desireless +desirer +desiringly +desirous +desirously +desirousness +desist +desistance +desistive +desition +desize +desk +desklike +deslime +desma +desmachymatous +desmachyme +desmacyte +desman +Desmanthus +Desmarestia +Desmarestiaceae +desmarestiaceous +Desmatippus +desmectasia +desmepithelium +desmic +desmid +Desmidiaceae +desmidiaceous +Desmidiales +desmidiologist +desmidiology +desmine +desmitis +desmocyte +desmocytoma +Desmodactyli +Desmodium +desmodont +Desmodontidae +Desmodus +desmodynia +desmogen +desmogenous +Desmognathae +desmognathism +desmognathous +desmography +desmohemoblast +desmoid +desmology +desmoma +Desmomyaria +desmon +Desmoncus +desmoneoplasm +desmonosology +desmopathologist +desmopathology +desmopathy +desmopelmous +desmopexia +desmopyknosis +desmorrhexis +Desmoscolecidae +Desmoscolex +desmosis +desmosite +Desmothoraca +desmotomy +desmotrope +desmotropic +desmotropism +desocialization +desocialize +desolate +desolately +desolateness +desolater +desolating +desolatingly +desolation +desolative +desonation +desophisticate +desophistication +desorption +desoxalate +desoxyanisoin +desoxybenzoin +desoxycinchonine +desoxycorticosterone +desoxymorphine +desoxyribonucleic +despair +despairer +despairful +despairfully +despairfulness +despairing +despairingly +despairingness +despecialization +despecialize +despecificate +despecification +despect +desperacy +desperado +desperadoism +desperate +desperately +desperateness +desperation +despicability +despicable +despicableness +despicably +despiritualization +despiritualize +despisable +despisableness +despisal +despise +despisedness +despisement +despiser +despisingly +despite +despiteful +despitefully +despitefulness +despiteous +despiteously +despoil +despoiler +despoilment +despoliation +despond +despondence +despondency +despondent +despondently +desponder +desponding +despondingly +despot +despotat +Despotes +despotic +despotically +despoticalness +despoticly +despotism +despotist +despotize +despumate +despumation +desquamate +desquamation +desquamative +desquamatory +dess +dessa +dessert +dessertspoon +dessertspoonful +dessiatine +dessil +destabilize +destain +destandardize +desterilization +desterilize +destinate +destination +destine +destinezite +destinism +destinist +destiny +destitute +destitutely +destituteness +destitution +destour +destress +destrier +destroy +destroyable +destroyer +destroyingly +destructibility +destructible +destructibleness +destruction +destructional +destructionism +destructionist +destructive +destructively +destructiveness +destructivism +destructivity +destructor +destructuralize +desubstantiate +desucration +desuete +desuetude +desugar +desugarize +Desulfovibrio +desulphur +desulphurate +desulphuration +desulphurization +desulphurize +desulphurizer +desultor +desultorily +desultoriness +desultorious +desultory +desuperheater +desyatin +desyl +desynapsis +desynaptic +desynonymization +desynonymize +detach +detachability +detachable +detachableness +detachably +detached +detachedly +detachedness +detacher +detachment +detail +detailed +detailedly +detailedness +detailer +detailism +detailist +detain +detainable +detainal +detainer +detainingly +detainment +detar +detassel +detax +detect +detectability +detectable +detectably +detectaphone +detecter +detectible +detection +detective +detectivism +detector +detenant +detent +detention +detentive +deter +deterge +detergence +detergency +detergent +detergible +deteriorate +deterioration +deteriorationist +deteriorative +deteriorator +deteriorism +deteriority +determent +determinability +determinable +determinableness +determinably +determinacy +determinant +determinantal +determinate +determinately +determinateness +determination +determinative +determinatively +determinativeness +determinator +determine +determined +determinedly +determinedness +determiner +determinism +determinist +deterministic +determinoid +deterrence +deterrent +detersion +detersive +detersively +detersiveness +detest +detestability +detestable +detestableness +detestably +detestation +detester +dethronable +dethrone +dethronement +dethroner +dethyroidism +detin +detinet +detinue +detonable +detonate +detonation +detonative +detonator +detorsion +detour +detoxicant +detoxicate +detoxication +detoxicator +detoxification +detoxify +detract +detracter +detractingly +detraction +detractive +detractively +detractiveness +detractor +detractory +detractress +detrain +detrainment +detribalization +detribalize +detriment +detrimental +detrimentality +detrimentally +detrimentalness +detrital +detrited +detrition +detritus +Detroiter +detrude +detruncate +detruncation +detrusion +detrusive +detrusor +detubation +detumescence +detune +detur +deuce +deuced +deucedly +deul +deurbanize +deutencephalic +deutencephalon +deuteragonist +deuteranomal +deuteranomalous +deuteranope +deuteranopia +deuteranopic +deuteric +deuteride +deuterium +deuteroalbumose +deuterocanonical +deuterocasease +deuterocone +deuteroconid +deuterodome +deuteroelastose +deuterofibrinose +deuterogamist +deuterogamy +deuterogelatose +deuterogenic +deuteroglobulose +deuteromorphic +Deuteromycetes +deuteromyosinose +deuteron +Deuteronomic +Deuteronomical +Deuteronomist +Deuteronomistic +Deuteronomy +deuteropathic +deuteropathy +deuteroplasm +deuteroprism +deuteroproteose +deuteroscopic +deuteroscopy +deuterostoma +Deuterostomata +deuterostomatous +deuterotokous +deuterotoky +deuterotype +deuterovitellose +deuterozooid +deutobromide +deutocarbonate +deutochloride +deutomala +deutomalal +deutomalar +deutomerite +deuton +deutonephron +deutonymph +deutonymphal +deutoplasm +deutoplasmic +deutoplastic +deutoscolex +deutoxide +Deutzia +dev +deva +devachan +devadasi +devall +devaloka +devalorize +devaluate +devaluation +devalue +devance +devaporate +devaporation +devast +devastate +devastating +devastatingly +devastation +devastative +devastator +devastavit +devaster +devata +develin +develop +developability +developable +developedness +developer +developist +development +developmental +developmentalist +developmentally +developmentarian +developmentary +developmentist +developoid +devertebrated +devest +deviability +deviable +deviancy +deviant +deviate +deviation +deviationism +deviationist +deviative +deviator +deviatory +device +deviceful +devicefully +devicefulness +devil +devilbird +devildom +deviled +deviler +deviless +devilet +devilfish +devilhood +deviling +devilish +devilishly +devilishness +devilism +devilize +devilkin +devillike +devilman +devilment +devilmonger +devilry +devilship +deviltry +devilward +devilwise +devilwood +devily +devious +deviously +deviousness +devirginate +devirgination +devirginator +devirilize +devisable +devisal +deviscerate +devisceration +devise +devisee +deviser +devisor +devitalization +devitalize +devitalized +devitaminize +devitrification +devitrify +devocalization +devocalize +devoice +devoid +devoir +devolatilize +devolute +devolution +devolutionary +devolutionist +devolve +devolvement +Devon +Devonian +Devonic +devonite +devonport +devonshire +devorative +devote +devoted +devotedly +devotedness +devotee +devoteeism +devotement +devoter +devotion +devotional +devotionalism +devotionalist +devotionality +devotionally +devotionalness +devotionate +devotionist +devour +devourable +devourer +devouress +devouring +devouringly +devouringness +devourment +devout +devoutless +devoutlessly +devoutlessness +devoutly +devoutness +devow +devulcanization +devulcanize +devulgarize +devvel +dew +dewan +dewanee +dewanship +dewater +dewaterer +dewax +dewbeam +dewberry +dewclaw +dewclawed +dewcup +dewdamp +dewdrop +dewdropper +dewer +Dewey +deweylite +dewfall +dewflower +dewily +dewiness +dewlap +dewlapped +dewless +dewlight +dewlike +dewool +deworm +dewret +dewtry +dewworm +dewy +dexiocardia +dexiotrope +dexiotropic +dexiotropism +dexiotropous +Dexter +dexter +dexterical +dexterity +dexterous +dexterously +dexterousness +dextrad +dextral +dextrality +dextrally +dextran +dextraural +dextrin +dextrinase +dextrinate +dextrinize +dextrinous +dextro +dextroaural +dextrocardia +dextrocardial +dextrocerebral +dextrocular +dextrocularity +dextroduction +dextroglucose +dextrogyrate +dextrogyration +dextrogyratory +dextrogyrous +dextrolactic +dextrolimonene +dextropinene +dextrorotary +dextrorotatary +dextrorotation +dextrorsal +dextrorse +dextrorsely +dextrosazone +dextrose +dextrosinistral +dextrosinistrally +dextrosuria +dextrotartaric +dextrotropic +dextrotropous +dextrous +dextrously +dextrousness +dextroversion +dey +deyhouse +deyship +deywoman +Dezaley +dezinc +dezincation +dezincification +dezincify +dezymotize +dha +dhabb +dhai +dhak +dhamnoo +dhan +dhangar +dhanuk +dhanush +Dhanvantari +dharana +dharani +dharma +dharmakaya +dharmashastra +dharmasmriti +dharmasutra +dharmsala +dharna +dhaura +dhauri +dhava +dhaw +Dheneb +dheri +dhobi +dhole +dhoni +dhoon +dhoti +dhoul +dhow +Dhritarashtra +dhu +dhunchee +dhunchi +Dhundia +dhurra +dhyal +dhyana +di +diabase +diabasic +diabetes +diabetic +diabetogenic +diabetogenous +diabetometer +diablerie +diabolarch +diabolarchy +diabolatry +diabolepsy +diaboleptic +diabolic +diabolical +diabolically +diabolicalness +diabolification +diabolify +diabolism +diabolist +diabolization +diabolize +diabological +diabology +diabolology +diabrosis +diabrotic +Diabrotica +diacanthous +diacaustic +diacetamide +diacetate +diacetic +diacetin +diacetine +diacetonuria +diaceturia +diacetyl +diacetylene +diachoretic +diachronic +diachylon +diachylum +diacid +diacipiperazine +diaclase +diaclasis +diaclastic +diacle +diaclinal +diacodion +diacoele +diacoelia +diaconal +diaconate +diaconia +diaconicon +diaconicum +diacope +diacranterian +diacranteric +diacrisis +diacritic +diacritical +diacritically +Diacromyodi +diacromyodian +diact +diactin +diactinal +diactinic +diactinism +Diadelphia +diadelphian +diadelphic +diadelphous +diadem +Diadema +Diadematoida +diaderm +diadermic +diadoche +Diadochi +Diadochian +diadochite +diadochokinesia +diadochokinetic +diadromous +diadumenus +diaene +diaereses +diaeresis +diaeretic +diaetetae +diagenesis +diagenetic +diageotropic +diageotropism +diaglyph +diaglyphic +diagnosable +diagnose +diagnoseable +diagnoses +diagnosis +diagnostic +diagnostically +diagnosticate +diagnostication +diagnostician +diagnostics +diagometer +diagonal +diagonality +diagonalize +diagonally +diagonalwise +diagonic +diagram +diagrammatic +diagrammatical +diagrammatician +diagrammatize +diagrammeter +diagrammitically +diagraph +diagraphic +diagraphical +diagraphics +diagredium +diagrydium +Diaguitas +Diaguite +diaheliotropic +diaheliotropically +diaheliotropism +diakinesis +dial +dialcohol +dialdehyde +dialect +dialectal +dialectalize +dialectally +dialectic +dialectical +dialectically +dialectician +dialecticism +dialecticize +dialectics +dialectologer +dialectological +dialectologist +dialectology +dialector +dialer +dialin +dialing +dialist +Dialister +dialkyl +dialkylamine +diallage +diallagic +diallagite +diallagoid +diallel +diallelon +diallelus +diallyl +dialogic +dialogical +dialogically +dialogism +dialogist +dialogistic +dialogistical +dialogistically +dialogite +dialogize +dialogue +dialoguer +Dialonian +dialuric +dialycarpous +Dialypetalae +dialypetalous +dialyphyllous +dialysepalous +dialysis +dialystaminous +dialystelic +dialystely +dialytic +dialytically +dialyzability +dialyzable +dialyzate +dialyzation +dialyzator +dialyze +dialyzer +diamagnet +diamagnetic +diamagnetically +diamagnetism +diamantiferous +diamantine +diamantoid +diamb +diambic +diamesogamous +diameter +diametral +diametrally +diametric +diametrical +diametrically +diamicton +diamide +diamidogen +diamine +diaminogen +diaminogene +diammine +diamminobromide +diamminonitrate +diammonium +diamond +diamondback +diamonded +diamondiferous +diamondize +diamondlike +diamondwise +diamondwork +diamorphine +diamylose +Dian +dian +Diana +Diancecht +diander +Diandria +diandrian +diandrous +Diane +dianetics +Dianil +dianilid +dianilide +dianisidin +dianisidine +dianite +dianodal +dianoetic +dianoetical +dianoetically +Dianthaceae +Dianthera +Dianthus +diapalma +diapase +diapasm +diapason +diapasonal +diapause +diapedesis +diapedetic +Diapensia +Diapensiaceae +diapensiaceous +diapente +diaper +diapering +diaphane +diaphaneity +diaphanie +diaphanometer +diaphanometric +diaphanometry +diaphanoscope +diaphanoscopy +diaphanotype +diaphanous +diaphanously +diaphanousness +diaphany +diaphone +diaphonia +diaphonic +diaphonical +diaphony +diaphoresis +diaphoretic +diaphoretical +diaphorite +diaphote +diaphototropic +diaphototropism +diaphragm +diaphragmal +diaphragmatic +diaphragmatically +diaphtherin +diaphysial +diaphysis +diaplasma +diaplex +diaplexal +diaplexus +diapnoic +diapnotic +diapophysial +diapophysis +Diaporthe +diapositive +diapsid +Diapsida +diapsidan +diapyesis +diapyetic +diarch +diarchial +diarchic +diarchy +diarhemia +diarial +diarian +diarist +diaristic +diarize +diarrhea +diarrheal +diarrheic +diarrhetic +diarsenide +diarthric +diarthrodial +diarthrosis +diarticular +diary +diaschisis +diaschisma +diaschistic +Diascia +diascope +diascopy +diascord +diascordium +diaskeuasis +diaskeuast +Diaspidinae +diaspidine +Diaspinae +diaspine +diaspirin +Diaspora +diaspore +diastaltic +diastase +diastasic +diastasimetry +diastasis +diastataxic +diastataxy +diastatic +diastatically +diastem +diastema +diastematic +diastematomyelia +diaster +diastole +diastolic +diastomatic +diastral +diastrophe +diastrophic +diastrophism +diastrophy +diasynthesis +diasyrm +diatessaron +diathermacy +diathermal +diathermancy +diathermaneity +diathermanous +diathermic +diathermize +diathermometer +diathermotherapy +diathermous +diathermy +diathesic +diathesis +diathetic +diatom +Diatoma +Diatomaceae +diatomacean +diatomaceoid +diatomaceous +Diatomales +Diatomeae +diatomean +diatomic +diatomicity +diatomiferous +diatomin +diatomist +diatomite +diatomous +diatonic +diatonical +diatonically +diatonous +diatoric +diatreme +diatribe +diatribist +diatropic +diatropism +Diatryma +Diatrymiformes +Diau +diaulic +diaulos +diaxial +diaxon +diazenithal +diazeuctic +diazeuxis +diazide +diazine +diazoamine +diazoamino +diazoaminobenzene +diazoanhydride +diazoate +diazobenzene +diazohydroxide +diazoic +diazoimide +diazoimido +diazole +diazoma +diazomethane +diazonium +diazotate +diazotic +diazotizability +diazotizable +diazotization +diazotize +diazotype +dib +dibase +dibasic +dibasicity +dibatag +Dibatis +dibber +dibble +dibbler +dibbuk +dibenzophenazine +dibenzopyrrole +dibenzoyl +dibenzyl +dibhole +diblastula +diborate +Dibothriocephalus +dibrach +dibranch +Dibranchia +Dibranchiata +dibranchiate +dibranchious +dibrom +dibromid +dibromide +dibromoacetaldehyde +dibromobenzene +dibs +dibstone +dibutyrate +dibutyrin +dicacodyl +Dicaeidae +dicaeology +dicalcic +dicalcium +dicarbonate +dicarbonic +dicarboxylate +dicarboxylic +dicarpellary +dicaryon +dicaryophase +dicaryophyte +dicaryotic +dicast +dicastery +dicastic +dicatalectic +dicatalexis +Diccon +dice +diceboard +dicebox +dicecup +dicellate +diceman +Dicentra +dicentrine +dicephalism +dicephalous +dicephalus +diceplay +dicer +Diceras +Diceratidae +dicerion +dicerous +dicetyl +dich +Dichapetalaceae +Dichapetalum +dichas +dichasial +dichasium +dichastic +Dichelyma +dichlamydeous +dichloramine +dichlorhydrin +dichloride +dichloroacetic +dichlorohydrin +dichloromethane +dichocarpism +dichocarpous +dichogamous +dichogamy +Dichondra +Dichondraceae +dichopodial +dichoptic +dichord +dichoree +Dichorisandra +dichotic +dichotomal +dichotomic +dichotomically +dichotomist +dichotomistic +dichotomization +dichotomize +dichotomous +dichotomously +dichotomy +dichroic +dichroiscope +dichroism +dichroite +dichroitic +dichromasy +dichromat +dichromate +dichromatic +dichromatism +dichromic +dichromism +dichronous +dichrooscope +dichroous +dichroscope +dichroscopic +Dichter +dicing +Dick +dick +dickcissel +dickens +Dickensian +Dickensiana +dicker +dickey +dickeybird +dickinsonite +Dicksonia +dicky +Diclidantheraceae +diclinic +diclinism +diclinous +Diclytra +dicoccous +dicodeine +dicoelious +dicolic +dicolon +dicondylian +dicot +dicotyl +dicotyledon +dicotyledonary +Dicotyledones +dicotyledonous +Dicotyles +Dicotylidae +dicotylous +dicoumarin +Dicranaceae +dicranaceous +dicranoid +dicranterian +Dicranum +Dicrostonyx +dicrotal +dicrotic +dicrotism +dicrotous +Dicruridae +dicta +Dictaen +Dictamnus +Dictaphone +dictate +dictatingly +dictation +dictational +dictative +dictator +dictatorial +dictatorialism +dictatorially +dictatorialness +dictatorship +dictatory +dictatress +dictatrix +dictature +dictic +diction +dictionary +Dictograph +dictum +dictynid +Dictynidae +Dictyoceratina +dictyoceratine +dictyodromous +dictyogen +dictyogenous +Dictyograptus +dictyoid +Dictyonema +Dictyonina +dictyonine +Dictyophora +dictyopteran +Dictyopteris +Dictyosiphon +Dictyosiphonaceae +dictyosiphonaceous +dictyosome +dictyostele +dictyostelic +Dictyota +Dictyotaceae +dictyotaceous +Dictyotales +dictyotic +Dictyoxylon +dicyanide +dicyanine +dicyanodiamide +dicyanogen +dicycle +dicyclic +Dicyclica +dicyclist +Dicyema +Dicyemata +dicyemid +Dicyemida +Dicyemidae +Dicynodon +dicynodont +Dicynodontia +Dicynodontidae +did +Didache +Didachist +didactic +didactical +didacticality +didactically +didactician +didacticism +didacticity +didactics +didactive +didactyl +didactylism +didactylous +didapper +didascalar +didascaliae +didascalic +didascalos +didascaly +didder +diddle +diddler +diddy +didelph +Didelphia +didelphian +didelphic +didelphid +Didelphidae +didelphine +Didelphis +didelphoid +didelphous +Didelphyidae +didepsid +didepside +Dididae +didie +didine +Didinium +didle +didna +didnt +Dido +didodecahedral +didodecahedron +didrachma +didrachmal +didromy +didst +diductor +Didunculidae +Didunculinae +Didunculus +Didus +didym +didymate +didymia +didymitis +didymium +didymoid +didymolite +didymous +didymus +Didynamia +didynamian +didynamic +didynamous +didynamy +die +dieb +dieback +diectasis +diedral +diedric +Dieffenbachia +Diego +Diegueno +diehard +dielectric +dielectrically +dielike +Dielytra +diem +diemaker +diemaking +diencephalic +diencephalon +diene +dier +Dieri +Diervilla +diesel +dieselization +dieselize +diesinker +diesinking +diesis +diestock +diet +dietal +dietarian +dietary +Dieter +dieter +dietetic +dietetically +dietetics +dietetist +diethanolamine +diethyl +diethylamine +diethylenediamine +diethylstilbestrol +dietic +dietician +dietics +dietine +dietist +dietitian +dietotherapeutics +dietotherapy +dietotoxic +dietotoxicity +dietrichite +dietzeite +diewise +Dieyerie +diezeugmenon +Difda +diferrion +diffame +diffarreation +differ +difference +differencingly +different +differentia +differentiable +differential +differentialize +differentially +differentiant +differentiate +differentiation +differentiator +differently +differentness +differingly +difficile +difficileness +difficult +difficultly +difficultness +difficulty +diffidation +diffide +diffidence +diffident +diffidently +diffidentness +diffinity +diffluence +diffluent +Difflugia +difform +difformed +difformity +diffract +diffraction +diffractive +diffractively +diffractiveness +diffractometer +diffrangibility +diffrangible +diffugient +diffusate +diffuse +diffused +diffusedly +diffusely +diffuseness +diffuser +diffusibility +diffusible +diffusibleness +diffusibly +diffusimeter +diffusiometer +diffusion +diffusionism +diffusionist +diffusive +diffusively +diffusiveness +diffusivity +diffusor +diformin +dig +digallate +digallic +digametic +digamist +digamma +digammated +digammic +digamous +digamy +digastric +Digenea +digeneous +digenesis +digenetic +Digenetica +digenic +digenous +digeny +digerent +digest +digestant +digested +digestedly +digestedness +digester +digestibility +digestible +digestibleness +digestibly +digestion +digestional +digestive +digestively +digestiveness +digestment +diggable +digger +digging +diggings +dight +dighter +digit +digital +digitalein +digitalin +digitalis +digitalism +digitalization +digitalize +digitally +Digitaria +digitate +digitated +digitately +digitation +digitiform +Digitigrada +digitigrade +digitigradism +digitinervate +digitinerved +digitipinnate +digitize +digitizer +digitogenin +digitonin +digitoplantar +digitorium +digitoxin +digitoxose +digitule +digitus +digladiate +digladiation +digladiator +diglossia +diglot +diglottic +diglottism +diglottist +diglucoside +diglyceride +diglyph +diglyphic +digmeat +dignification +dignified +dignifiedly +dignifiedness +dignify +dignitarial +dignitarian +dignitary +dignity +digoneutic +digoneutism +digonoporous +digonous +Digor +digram +digraph +digraphic +digredience +digrediency +digredient +digress +digressingly +digression +digressional +digressionary +digressive +digressively +digressiveness +digressory +digs +diguanide +Digynia +digynian +digynous +dihalide +dihalo +dihalogen +dihedral +dihedron +dihexagonal +dihexahedral +dihexahedron +dihybrid +dihybridism +dihydrate +dihydrated +dihydrazone +dihydric +dihydride +dihydrite +dihydrocupreine +dihydrocuprin +dihydrogen +dihydrol +dihydronaphthalene +dihydronicotine +dihydrotachysterol +dihydroxy +dihydroxysuccinic +dihydroxytoluene +dihysteria +diiamb +diiambus +diiodide +diiodo +diiodoform +diipenates +Diipolia +diisatogen +dijudicate +dijudication +dika +dikage +dikamali +dikaryon +dikaryophase +dikaryophasic +dikaryophyte +dikaryophytic +dikaryotic +Dike +dike +dikegrave +dikelocephalid +Dikelocephalus +diker +dikereeve +dikeside +diketo +diketone +dikkop +diktyonite +dilacerate +dilaceration +dilambdodont +dilamination +Dilantin +dilapidate +dilapidated +dilapidation +dilapidator +dilatability +dilatable +dilatableness +dilatably +dilatancy +dilatant +dilatate +dilatation +dilatative +dilatator +dilatatory +dilate +dilated +dilatedly +dilatedness +dilater +dilatingly +dilation +dilative +dilatometer +dilatometric +dilatometry +dilator +dilatorily +dilatoriness +dilatory +dildo +dilection +Dilemi +Dilemite +dilemma +dilemmatic +dilemmatical +dilemmatically +dilettant +dilettante +dilettanteish +dilettanteism +dilettanteship +dilettanti +dilettantish +dilettantism +dilettantist +diligence +diligency +diligent +diligentia +diligently +diligentness +dilker +dill +Dillenia +Dilleniaceae +dilleniaceous +dilleniad +dilli +dillier +dilligrout +dilling +dillseed +dillue +dilluer +dillweed +dilly +dillydallier +dillydally +dillyman +dilo +dilogy +diluent +dilute +diluted +dilutedly +dilutedness +dilutee +dilutely +diluteness +dilutent +diluter +dilution +dilutive +dilutor +diluvia +diluvial +diluvialist +diluvian +diluvianism +diluvion +diluvium +dim +dimagnesic +dimanganion +dimanganous +Dimaris +dimastigate +Dimatis +dimber +dimberdamber +dimble +dime +dimensible +dimension +dimensional +dimensionality +dimensionally +dimensioned +dimensionless +dimensive +dimer +Dimera +dimeran +dimercuric +dimercurion +dimercury +dimeric +dimeride +dimerism +dimerization +dimerlie +dimerous +dimetallic +dimeter +dimethoxy +dimethyl +dimethylamine +dimethylamino +dimethylaniline +dimethylbenzene +dimetria +dimetric +Dimetry +dimication +dimidiate +dimidiation +diminish +diminishable +diminishableness +diminisher +diminishingly +diminishment +diminuendo +diminutal +diminute +diminution +diminutival +diminutive +diminutively +diminutiveness +diminutivize +dimiss +dimission +dimissorial +dimissory +dimit +Dimitry +Dimittis +dimity +dimly +dimmed +dimmedness +dimmer +dimmest +dimmet +dimmish +Dimna +dimness +dimolecular +dimoric +dimorph +dimorphic +dimorphism +Dimorphotheca +dimorphous +dimple +dimplement +dimply +dimps +dimpsy +Dimyaria +dimyarian +dimyaric +din +Dinah +dinamode +Dinantian +dinaphthyl +dinar +Dinaric +Dinarzade +dinder +dindle +Dindymene +Dindymus +dine +diner +dinergate +dineric +dinero +dinette +dineuric +ding +dingar +dingbat +dingdong +dinge +dingee +dinghee +dinghy +dingily +dinginess +dingle +dingleberry +dinglebird +dingledangle +dingly +dingmaul +dingo +dingus +Dingwall +dingy +dinheiro +dinic +dinical +Dinichthys +dining +dinitrate +dinitril +dinitrile +dinitro +dinitrobenzene +dinitrocellulose +dinitrophenol +dinitrotoluene +dink +Dinka +dinkey +dinkum +dinky +dinmont +dinner +dinnerless +dinnerly +dinnertime +dinnerware +dinnery +Dinobryon +Dinoceras +Dinocerata +dinoceratan +dinoceratid +Dinoceratidae +Dinoflagellata +Dinoflagellatae +dinoflagellate +Dinoflagellida +dinomic +Dinomys +Dinophilea +Dinophilus +Dinophyceae +Dinornis +Dinornithes +dinornithic +dinornithid +Dinornithidae +Dinornithiformes +dinornithine +dinornithoid +dinosaur +Dinosauria +dinosaurian +dinothere +Dinotheres +dinotherian +Dinotheriidae +Dinotherium +dinsome +dint +dintless +dinus +diobely +diobol +diocesan +diocese +Diocletian +dioctahedral +Dioctophyme +diode +Diodia +Diodon +diodont +Diodontidae +Dioecia +dioecian +dioeciodimorphous +dioeciopolygamous +dioecious +dioeciously +dioeciousness +dioecism +dioecy +dioestrous +dioestrum +dioestrus +Diogenean +Diogenic +diogenite +dioicous +diol +diolefin +diolefinic +Diomedea +Diomedeidae +Dion +Dionaea +Dionaeaceae +Dione +dionise +dionym +dionymal +Dionysia +Dionysiac +Dionysiacal +Dionysiacally +Dioon +Diophantine +Diopsidae +diopside +Diopsis +dioptase +diopter +Dioptidae +dioptograph +dioptometer +dioptometry +dioptoscopy +dioptra +dioptral +dioptrate +dioptric +dioptrical +dioptrically +dioptrics +dioptrometer +dioptrometry +dioptroscopy +dioptry +diorama +dioramic +diordinal +diorite +dioritic +diorthosis +diorthotic +Dioscorea +Dioscoreaceae +dioscoreaceous +dioscorein +dioscorine +Dioscuri +Dioscurian +diose +Diosma +diosmin +diosmose +diosmosis +diosmotic +diosphenol +Diospyraceae +diospyraceous +Diospyros +diota +diotic +Diotocardia +diovular +dioxane +dioxide +dioxime +dioxindole +dioxy +dip +Dipala +diparentum +dipartite +dipartition +dipaschal +dipentene +dipeptid +dipeptide +dipetalous +dipetto +diphase +diphaser +diphasic +diphead +diphenol +diphenyl +diphenylamine +diphenylchloroarsine +diphenylene +diphenylenimide +diphenylguanidine +diphenylmethane +diphenylquinomethane +diphenylthiourea +diphosgene +diphosphate +diphosphide +diphosphoric +diphosphothiamine +diphrelatic +diphtheria +diphtherial +diphtherian +diphtheric +diphtheritic +diphtheritically +diphtheritis +diphtheroid +diphtheroidal +diphtherotoxin +diphthong +diphthongal +diphthongalize +diphthongally +diphthongation +diphthongic +diphthongization +diphthongize +diphycercal +diphycercy +Diphyes +diphygenic +diphyletic +Diphylla +Diphylleia +Diphyllobothrium +diphyllous +diphyodont +diphyozooid +Diphysite +Diphysitism +diphyzooid +dipicrate +dipicrylamin +dipicrylamine +Diplacanthidae +Diplacanthus +diplacusis +Dipladenia +diplanar +diplanetic +diplanetism +diplantidian +diplarthrism +diplarthrous +diplasiasmus +diplasic +diplasion +diplegia +dipleidoscope +dipleura +dipleural +dipleurogenesis +dipleurogenetic +diplex +diplobacillus +diplobacterium +diploblastic +diplocardia +diplocardiac +Diplocarpon +diplocaulescent +diplocephalous +diplocephalus +diplocephaly +diplochlamydeous +diplococcal +diplococcemia +diplococcic +diplococcoid +diplococcus +diploconical +diplocoria +Diplodia +Diplodocus +Diplodus +diploe +diploetic +diplogangliate +diplogenesis +diplogenetic +diplogenic +Diploglossata +diploglossate +diplograph +diplographic +diplographical +diplography +diplohedral +diplohedron +diploic +diploid +diploidic +diploidion +diploidy +diplois +diplokaryon +diploma +diplomacy +diplomat +diplomate +diplomatic +diplomatical +diplomatically +diplomatics +diplomatism +diplomatist +diplomatize +diplomatology +diplomyelia +diplonema +diplonephridia +diploneural +diplont +diploperistomic +diplophase +diplophyte +diplopia +diplopic +diploplacula +diploplacular +diploplaculate +diplopod +Diplopoda +diplopodic +Diploptera +diplopterous +Diplopteryga +diplopy +diplosis +diplosome +diplosphenal +diplosphene +Diplospondyli +diplospondylic +diplospondylism +diplostemonous +diplostemony +diplostichous +Diplotaxis +diplotegia +diplotene +Diplozoon +diplumbic +Dipneumona +Dipneumones +dipneumonous +dipneustal +Dipneusti +dipnoan +Dipnoi +dipnoid +dipnoous +dipode +dipodic +Dipodidae +Dipodomyinae +Dipodomys +dipody +dipolar +dipolarization +dipolarize +dipole +diporpa +dipotassic +dipotassium +dipped +dipper +dipperful +dipping +diprimary +diprismatic +dipropargyl +dipropyl +Diprotodon +diprotodont +Diprotodontia +Dipsacaceae +dipsacaceous +Dipsaceae +dipsaceous +Dipsacus +Dipsadinae +dipsas +dipsetic +dipsey +dipsomania +dipsomaniac +dipsomaniacal +Dipsosaurus +dipsosis +dipter +Diptera +Dipteraceae +dipteraceous +dipterad +dipteral +dipteran +dipterist +dipterocarp +Dipterocarpaceae +dipterocarpaceous +dipterocarpous +Dipterocarpus +dipterocecidium +dipterological +dipterologist +dipterology +dipteron +dipteros +dipterous +Dipteryx +diptote +diptych +Dipus +dipware +dipygus +dipylon +dipyre +dipyrenous +dipyridyl +Dirca +Dircaean +dird +dirdum +dire +direct +directable +directed +directer +direction +directional +directionally +directionless +directitude +directive +directively +directiveness +directivity +directly +directness +Directoire +director +directoral +directorate +directorial +directorially +directorship +directory +directress +directrices +directrix +direful +direfully +direfulness +direly +dirempt +diremption +direness +direption +dirge +dirgeful +dirgelike +dirgeman +dirgler +dirhem +Dirian +Dirichletian +dirigent +dirigibility +dirigible +dirigomotor +diriment +Dirk +dirk +dirl +dirndl +dirt +dirtbird +dirtboard +dirten +dirtily +dirtiness +dirtplate +dirty +dis +Disa +disability +disable +disabled +disablement +disabusal +disabuse +disacceptance +disaccharide +disaccharose +disaccommodate +disaccommodation +disaccord +disaccordance +disaccordant +disaccustom +disaccustomed +disaccustomedness +disacidify +disacknowledge +disacknowledgement +disacquaint +disacquaintance +disadjust +disadorn +disadvance +disadvantage +disadvantageous +disadvantageously +disadvantageousness +disadventure +disadventurous +disadvise +disaffect +disaffectation +disaffected +disaffectedly +disaffectedness +disaffection +disaffectionate +disaffiliate +disaffiliation +disaffirm +disaffirmance +disaffirmation +disaffirmative +disafforest +disafforestation +disafforestment +disagglomeration +disaggregate +disaggregation +disaggregative +disagio +disagree +disagreeability +disagreeable +disagreeableness +disagreeably +disagreed +disagreement +disagreer +disalicylide +disalign +disalignment +disalike +disallow +disallowable +disallowableness +disallowance +disally +disamenity +Disamis +disanagrammatize +disanalogous +disangularize +disanimal +disanimate +disanimation +disannex +disannexation +disannul +disannuller +disannulment +disanoint +disanswerable +disapostle +disapparel +disappear +disappearance +disappearer +disappearing +disappoint +disappointed +disappointedly +disappointer +disappointing +disappointingly +disappointingness +disappointment +disappreciate +disappreciation +disapprobation +disapprobative +disapprobatory +disappropriate +disappropriation +disapprovable +disapproval +disapprove +disapprover +disapprovingly +disaproned +disarchbishop +disarm +disarmament +disarmature +disarmed +disarmer +disarming +disarmingly +disarrange +disarrangement +disarray +disarticulate +disarticulation +disarticulator +disasinate +disasinize +disassemble +disassembly +disassimilate +disassimilation +disassimilative +disassociate +disassociation +disaster +disastimeter +disastrous +disastrously +disastrousness +disattaint +disattire +disattune +disauthenticate +disauthorize +disavow +disavowable +disavowal +disavowedly +disavower +disavowment +disawa +disazo +disbalance +disbalancement +disband +disbandment +disbar +disbark +disbarment +disbelief +disbelieve +disbeliever +disbelieving +disbelievingly +disbench +disbenchment +disbloom +disbody +disbosom +disbowel +disbrain +disbranch +disbud +disbudder +disburden +disburdenment +disbursable +disburse +disbursement +disburser +disburthen +disbury +disbutton +disc +discage +discal +discalceate +discalced +discanonization +discanonize +discanter +discantus +discapacitate +discard +discardable +discarder +discardment +discarnate +discarnation +discase +discastle +discept +disceptation +disceptator +discern +discerner +discernible +discernibleness +discernibly +discerning +discerningly +discernment +discerp +discerpibility +discerpible +discerpibleness +discerptibility +discerptible +discerptibleness +discerption +discharacter +discharge +dischargeable +dischargee +discharger +discharging +discharity +discharm +dischase +Disciflorae +discifloral +disciform +discigerous +Discina +discinct +discinoid +disciple +disciplelike +discipleship +disciplinability +disciplinable +disciplinableness +disciplinal +disciplinant +disciplinarian +disciplinarianism +disciplinarily +disciplinary +disciplinative +disciplinatory +discipline +discipliner +discipular +discircumspection +discission +discitis +disclaim +disclaimant +disclaimer +disclamation +disclamatory +disclass +disclassify +disclike +disclimax +discloister +disclose +disclosed +discloser +disclosive +disclosure +discloud +discoach +discoactine +discoblastic +discoblastula +discobolus +discocarp +discocarpium +discocarpous +discocephalous +discodactyl +discodactylous +discogastrula +discoglossid +Discoglossidae +discoglossoid +discographical +discography +discohexaster +discoid +discoidal +Discoidea +Discoideae +discolichen +discolith +discolor +discolorate +discoloration +discolored +discoloredness +discolorization +discolorment +discolourization +Discomedusae +discomedusan +discomedusoid +discomfit +discomfiter +discomfiture +discomfort +discomfortable +discomfortableness +discomforting +discomfortingly +discommend +discommendable +discommendableness +discommendably +discommendation +discommender +discommode +discommodious +discommodiously +discommodiousness +discommodity +discommon +discommons +discommunity +discomorula +discompliance +discompose +discomposed +discomposedly +discomposedness +discomposing +discomposingly +discomposure +discomycete +Discomycetes +discomycetous +Disconanthae +disconanthous +disconcert +disconcerted +disconcertedly +disconcertedness +disconcerting +disconcertingly +disconcertingness +disconcertion +disconcertment +disconcord +disconduce +disconducive +Disconectae +disconform +disconformable +disconformity +discongruity +disconjure +disconnect +disconnected +disconnectedly +disconnectedness +disconnecter +disconnection +disconnective +disconnectiveness +disconnector +disconsider +disconsideration +disconsolate +disconsolately +disconsolateness +disconsolation +disconsonancy +disconsonant +discontent +discontented +discontentedly +discontentedness +discontentful +discontenting +discontentive +discontentment +discontiguity +discontiguous +discontiguousness +discontinuable +discontinuance +discontinuation +discontinue +discontinuee +discontinuer +discontinuity +discontinuor +discontinuous +discontinuously +discontinuousness +disconula +disconvenience +disconvenient +disconventicle +discophile +Discophora +discophoran +discophore +discophorous +discoplacenta +discoplacental +Discoplacentalia +discoplacentalian +discoplasm +discopodous +discord +discordance +discordancy +discordant +discordantly +discordantness +discordful +Discordia +discording +discorporate +discorrespondency +discorrespondent +discount +discountable +discountenance +discountenancer +discounter +discouple +discourage +discourageable +discouragement +discourager +discouraging +discouragingly +discouragingness +discourse +discourseless +discourser +discoursive +discoursively +discoursiveness +discourteous +discourteously +discourteousness +discourtesy +discous +discovenant +discover +discoverability +discoverable +discoverably +discovered +discoverer +discovert +discoverture +discovery +discreate +discreation +discredence +discredit +discreditability +discreditable +discreet +discreetly +discreetness +discrepance +discrepancy +discrepant +discrepantly +discrepate +discrepation +discrested +discrete +discretely +discreteness +discretion +discretional +discretionally +discretionarily +discretionary +discretive +discretively +discretiveness +discriminability +discriminable +discriminal +discriminant +discriminantal +discriminate +discriminately +discriminateness +discriminating +discriminatingly +discrimination +discriminational +discriminative +discriminatively +discriminator +discriminatory +discrown +disculpate +disculpation +disculpatory +discumber +discursative +discursativeness +discursify +discursion +discursive +discursively +discursiveness +discursory +discursus +discurtain +discus +discuss +discussable +discussant +discusser +discussible +discussion +discussional +discussionism +discussionist +discussive +discussment +discutable +discutient +disdain +disdainable +disdainer +disdainful +disdainfully +disdainfulness +disdainly +disdeceive +disdenominationalize +disdiaclast +disdiaclastic +disdiapason +disdiazo +disdiplomatize +disdodecahedroid +disdub +disease +diseased +diseasedly +diseasedness +diseaseful +diseasefulness +disecondary +disedge +disedification +disedify +diseducate +diselder +diselectrification +diselectrify +diselenide +disematism +disembargo +disembark +disembarkation +disembarkment +disembarrass +disembarrassment +disembattle +disembed +disembellish +disembitter +disembocation +disembodiment +disembody +disembogue +disemboguement +disembosom +disembowel +disembowelment +disembower +disembroil +disemburden +diseme +disemic +disemplane +disemploy +disemployment +disempower +disenable +disenablement +disenact +disenactment +disenamor +disenamour +disenchain +disenchant +disenchanter +disenchantingly +disenchantment +disenchantress +disencharm +disenclose +disencumber +disencumberment +disencumbrance +disendow +disendower +disendowment +disenfranchise +disenfranchisement +disengage +disengaged +disengagedness +disengagement +disengirdle +disenjoy +disenjoyment +disenmesh +disennoble +disennui +disenshroud +disenslave +disensoul +disensure +disentail +disentailment +disentangle +disentanglement +disentangler +disenthral +disenthrall +disenthrallment +disenthralment +disenthrone +disenthronement +disentitle +disentomb +disentombment +disentrain +disentrainment +disentrammel +disentrance +disentrancement +disentwine +disenvelop +disepalous +disequalize +disequalizer +disequilibrate +disequilibration +disequilibrium +disestablish +disestablisher +disestablishment +disestablishmentarian +disesteem +disesteemer +disestimation +disexcommunicate +disfaith +disfame +disfashion +disfavor +disfavorer +disfeature +disfeaturement +disfellowship +disfen +disfiguration +disfigurative +disfigure +disfigurement +disfigurer +disfiguringly +disflesh +disfoliage +disforest +disforestation +disfranchise +disfranchisement +disfranchiser +disfrequent +disfriar +disfrock +disfurnish +disfurnishment +disgarland +disgarnish +disgarrison +disgavel +disgeneric +disgenius +disgig +disglorify +disglut +disgood +disgorge +disgorgement +disgorger +disgospel +disgown +disgrace +disgraceful +disgracefully +disgracefulness +disgracement +disgracer +disgracious +disgradation +disgrade +disgregate +disgregation +disgruntle +disgruntlement +disguisable +disguisal +disguise +disguised +disguisedly +disguisedness +disguiseless +disguisement +disguiser +disguising +disgulf +disgust +disgusted +disgustedly +disgustedness +disguster +disgustful +disgustfully +disgustfulness +disgusting +disgustingly +disgustingness +dish +dishabilitate +dishabilitation +dishabille +dishabituate +dishallow +dishallucination +disharmonic +disharmonical +disharmonious +disharmonism +disharmonize +disharmony +dishboard +dishcloth +dishclout +disheart +dishearten +disheartener +disheartening +dishearteningly +disheartenment +disheaven +dished +dishellenize +dishelm +disher +disherent +disherison +disherit +disheritment +dishevel +disheveled +dishevelment +dishexecontahedroid +dishful +Dishley +dishlike +dishling +dishmaker +dishmaking +dishmonger +dishome +dishonest +dishonestly +dishonor +dishonorable +dishonorableness +dishonorably +dishonorary +dishonorer +dishorn +dishorner +dishorse +dishouse +dishpan +dishpanful +dishrag +dishumanize +dishwasher +dishwashing +dishwashings +dishwater +dishwatery +dishwiper +dishwiping +disidentify +disilane +disilicane +disilicate +disilicic +disilicid +disilicide +disillude +disilluminate +disillusion +disillusionist +disillusionize +disillusionizer +disillusionment +disillusive +disimagine +disimbitter +disimitate +disimitation +disimmure +disimpark +disimpassioned +disimprison +disimprisonment +disimprove +disimprovement +disincarcerate +disincarceration +disincarnate +disincarnation +disinclination +disincline +disincorporate +disincorporation +disincrust +disincrustant +disincrustion +disindividualize +disinfect +disinfectant +disinfecter +disinfection +disinfective +disinfector +disinfest +disinfestation +disinfeudation +disinflame +disinflate +disinflation +disingenuity +disingenuous +disingenuously +disingenuousness +disinherison +disinherit +disinheritable +disinheritance +disinhume +disinsulation +disinsure +disintegrable +disintegrant +disintegrate +disintegration +disintegrationist +disintegrative +disintegrator +disintegratory +disintegrity +disintegrous +disintensify +disinter +disinterest +disinterested +disinterestedly +disinterestedness +disinteresting +disinterment +disintertwine +disintrench +disintricate +disinvagination +disinvest +disinvestiture +disinvigorate +disinvite +disinvolve +disjasked +disject +disjection +disjoin +disjoinable +disjoint +disjointed +disjointedly +disjointedness +disjointly +disjointure +disjunct +disjunction +disjunctive +disjunctively +disjunctor +disjuncture +disjune +disk +diskelion +diskless +disklike +dislaurel +disleaf +dislegitimate +dislevelment +dislicense +dislikable +dislike +dislikelihood +disliker +disliking +dislimn +dislink +dislip +disload +dislocability +dislocable +dislocate +dislocated +dislocatedly +dislocatedness +dislocation +dislocator +dislocatory +dislodge +dislodgeable +dislodgement +dislove +disloyal +disloyalist +disloyally +disloyalty +disluster +dismain +dismal +dismality +dismalize +dismally +dismalness +disman +dismantle +dismantlement +dismantler +dismarble +dismark +dismarket +dismask +dismast +dismastment +dismay +dismayable +dismayed +dismayedness +dismayful +dismayfully +dismayingly +disme +dismember +dismembered +dismemberer +dismemberment +dismembrate +dismembrator +disminion +disminister +dismiss +dismissable +dismissal +dismissible +dismissingly +dismission +dismissive +dismissory +dismoded +dismount +dismountable +dismutation +disna +disnaturalization +disnaturalize +disnature +disnest +disnew +disniche +disnosed +disnumber +disobedience +disobedient +disobediently +disobey +disobeyal +disobeyer +disobligation +disoblige +disobliger +disobliging +disobligingly +disobligingness +disoccupation +disoccupy +disodic +disodium +disomatic +disomatous +disomic +disomus +disoperculate +disorb +disorchard +disordained +disorder +disordered +disorderedly +disorderedness +disorderer +disorderliness +disorderly +disordinated +disordination +disorganic +disorganization +disorganize +disorganizer +disorient +disorientate +disorientation +disown +disownable +disownment +disoxygenate +disoxygenation +disozonize +dispapalize +disparage +disparageable +disparagement +disparager +disparaging +disparagingly +disparate +disparately +disparateness +disparation +disparity +dispark +dispart +dispartment +dispassionate +dispassionately +dispassionateness +dispassioned +dispatch +dispatcher +dispatchful +dispatriated +dispauper +dispauperize +dispeace +dispeaceful +dispel +dispeller +dispend +dispender +dispendious +dispendiously +dispenditure +dispensability +dispensable +dispensableness +dispensary +dispensate +dispensation +dispensational +dispensative +dispensatively +dispensator +dispensatorily +dispensatory +dispensatress +dispensatrix +dispense +dispenser +dispensingly +dispeople +dispeoplement +dispeopler +dispergate +dispergation +dispergator +dispericraniate +disperiwig +dispermic +dispermous +dispermy +dispersal +dispersant +disperse +dispersed +dispersedly +dispersedness +dispersement +disperser +dispersibility +dispersible +dispersion +dispersity +dispersive +dispersively +dispersiveness +dispersoid +dispersoidological +dispersoidology +dispersonalize +dispersonate +dispersonification +dispersonify +dispetal +disphenoid +dispiece +dispireme +dispirit +dispirited +dispiritedly +dispiritedness +dispiritingly +dispiritment +dispiteous +dispiteously +dispiteousness +displace +displaceability +displaceable +displacement +displacency +displacer +displant +display +displayable +displayed +displayer +displease +displeased +displeasedly +displeaser +displeasing +displeasingly +displeasingness +displeasurable +displeasurably +displeasure +displeasurement +displenish +displicency +displume +displuviate +dispondaic +dispondee +dispone +disponee +disponent +disponer +dispope +dispopularize +disporous +disport +disportive +disportment +Disporum +disposability +disposable +disposableness +disposal +dispose +disposed +disposedly +disposedness +disposer +disposingly +disposition +dispositional +dispositioned +dispositive +dispositively +dispossess +dispossession +dispossessor +dispossessory +dispost +disposure +dispowder +dispractice +dispraise +dispraiser +dispraisingly +dispread +dispreader +disprejudice +disprepare +disprince +disprison +disprivacied +disprivilege +disprize +disprobabilization +disprobabilize +disprobative +dispromise +disproof +disproportion +disproportionable +disproportionableness +disproportionably +disproportional +disproportionality +disproportionally +disproportionalness +disproportionate +disproportionately +disproportionateness +disproportionation +disprovable +disproval +disprove +disprovement +disproven +disprover +dispulp +dispunct +dispunishable +dispunitive +disputability +disputable +disputableness +disputably +disputant +disputation +disputatious +disputatiously +disputatiousness +disputative +disputatively +disputativeness +disputator +dispute +disputeless +disputer +disqualification +disqualify +disquantity +disquiet +disquieted +disquietedly +disquietedness +disquieten +disquieter +disquieting +disquietingly +disquietly +disquietness +disquietude +disquiparancy +disquiparant +disquiparation +disquisite +disquisition +disquisitional +disquisitionary +disquisitive +disquisitively +disquisitor +disquisitorial +disquisitory +disquixote +disrank +disrate +disrealize +disrecommendation +disregard +disregardable +disregardance +disregardant +disregarder +disregardful +disregardfully +disregardfulness +disrelated +disrelation +disrelish +disrelishable +disremember +disrepair +disreputability +disreputable +disreputableness +disreputably +disreputation +disrepute +disrespect +disrespecter +disrespectful +disrespectfully +disrespectfulness +disrestore +disring +disrobe +disrobement +disrober +disroof +disroost +disroot +disrudder +disrump +disrupt +disruptability +disruptable +disrupter +disruption +disruptionist +disruptive +disruptively +disruptiveness +disruptment +disruptor +disrupture +diss +dissatisfaction +dissatisfactoriness +dissatisfactory +dissatisfied +dissatisfiedly +dissatisfiedness +dissatisfy +dissaturate +disscepter +disseat +dissect +dissected +dissectible +dissecting +dissection +dissectional +dissective +dissector +disseize +disseizee +disseizin +disseizor +disseizoress +disselboom +dissemblance +dissemble +dissembler +dissemblingly +dissembly +dissemilative +disseminate +dissemination +disseminative +disseminator +disseminule +dissension +dissensualize +dissent +dissentaneous +dissentaneousness +dissenter +dissenterism +dissentience +dissentiency +dissentient +dissenting +dissentingly +dissentious +dissentiously +dissentism +dissentment +dissepiment +dissepimental +dissert +dissertate +dissertation +dissertational +dissertationist +dissertative +dissertator +disserve +disservice +disserviceable +disserviceableness +disserviceably +dissettlement +dissever +disseverance +disseverment +disshadow +dissheathe +disshroud +dissidence +dissident +dissidently +dissight +dissightly +dissiliency +dissilient +dissimilar +dissimilarity +dissimilarly +dissimilars +dissimilate +dissimilation +dissimilatory +dissimile +dissimilitude +dissimulate +dissimulation +dissimulative +dissimulator +dissimule +dissimuler +dissipable +dissipate +dissipated +dissipatedly +dissipatedness +dissipater +dissipation +dissipative +dissipativity +dissipator +dissociability +dissociable +dissociableness +dissocial +dissociality +dissocialize +dissociant +dissociate +dissociation +dissociative +dissoconch +dissogeny +dissogony +dissolubility +dissoluble +dissolubleness +dissolute +dissolutely +dissoluteness +dissolution +dissolutional +dissolutionism +dissolutionist +dissolutive +dissolvable +dissolvableness +dissolve +dissolveability +dissolvent +dissolver +dissolving +dissolvingly +dissonance +dissonancy +dissonant +dissonantly +dissonous +dissoul +dissuade +dissuader +dissuasion +dissuasive +dissuasively +dissuasiveness +dissuasory +dissuit +dissuitable +dissuited +dissyllabic +dissyllabification +dissyllabify +dissyllabism +dissyllabize +dissyllable +dissymmetric +dissymmetrical +dissymmetrically +dissymmetry +dissympathize +dissympathy +distad +distaff +distain +distal +distale +distally +distalwards +distance +distanceless +distancy +distannic +distant +distantly +distantness +distaste +distasted +distasteful +distastefully +distastefulness +distater +distemonous +distemper +distemperature +distempered +distemperedly +distemperedness +distemperer +distenant +distend +distendedly +distender +distensibility +distensible +distensive +distent +distention +disthene +disthrall +disthrone +distich +Distichlis +distichous +distichously +distill +distillable +distillage +distilland +distillate +distillation +distillatory +distilled +distiller +distillery +distilling +distillmint +distinct +distinctify +distinction +distinctional +distinctionless +distinctive +distinctively +distinctiveness +distinctly +distinctness +distingue +distinguish +distinguishability +distinguishable +distinguishableness +distinguishably +distinguished +distinguishedly +distinguisher +distinguishing +distinguishingly +distinguishment +distoclusion +Distoma +Distomatidae +distomatosis +distomatous +distome +distomian +distomiasis +Distomidae +Distomum +distort +distorted +distortedly +distortedness +distorter +distortion +distortional +distortionist +distortionless +distortive +distract +distracted +distractedly +distractedness +distracter +distractibility +distractible +distractingly +distraction +distractive +distractively +distrain +distrainable +distrainee +distrainer +distrainment +distrainor +distraint +distrait +distraite +distraught +distress +distressed +distressedly +distressedness +distressful +distressfully +distressfulness +distressing +distressingly +distributable +distributary +distribute +distributed +distributedly +distributee +distributer +distribution +distributional +distributionist +distributival +distributive +distributively +distributiveness +distributor +distributress +district +distrouser +distrust +distruster +distrustful +distrustfully +distrustfulness +distrustingly +distune +disturb +disturbance +disturbative +disturbed +disturbedly +disturber +disturbing +disturbingly +disturn +disturnpike +disubstituted +disubstitution +disulfonic +disulfuric +disulphate +disulphide +disulphonate +disulphone +disulphonic +disulphoxide +disulphuret +disulphuric +disuniform +disuniformity +disunify +disunion +disunionism +disunionist +disunite +disuniter +disunity +disusage +disusance +disuse +disutility +disutilize +disvaluation +disvalue +disvertebrate +disvisage +disvoice +disvulnerability +diswarren +diswench +diswood +disworth +disyllabic +disyllable +disyoke +dit +dita +dital +ditch +ditchbank +ditchbur +ditchdigger +ditchdown +ditcher +ditchless +ditchside +ditchwater +dite +diter +diterpene +ditertiary +ditetragonal +dithalous +dithecal +ditheism +ditheist +ditheistic +ditheistical +dithematic +dither +dithery +dithiobenzoic +dithioglycol +dithioic +dithion +dithionate +dithionic +dithionite +dithionous +dithymol +dithyramb +dithyrambic +dithyrambically +Dithyrambos +Dithyrambus +ditokous +ditolyl +ditone +ditrematous +ditremid +Ditremidae +ditrichotomous +ditriglyph +ditriglyphic +ditrigonal +ditrigonally +Ditrocha +ditrochean +ditrochee +ditrochous +ditroite +dittamy +dittander +dittany +dittay +dittied +ditto +dittogram +dittograph +dittographic +dittography +dittology +ditty +diumvirate +diuranate +diureide +diuresis +diuretic +diuretically +diureticalness +Diurna +diurnal +diurnally +diurnalness +diurnation +diurne +diurnule +diuturnal +diuturnity +div +diva +divagate +divagation +divalence +divalent +divan +divariant +divaricate +divaricately +divaricating +divaricatingly +divarication +divaricator +divata +dive +divekeeper +divel +divellent +divellicate +diver +diverge +divergement +divergence +divergency +divergent +divergently +diverging +divergingly +divers +diverse +diversely +diverseness +diversicolored +diversifiability +diversifiable +diversification +diversified +diversifier +diversiflorate +diversiflorous +diversifoliate +diversifolious +diversiform +diversify +diversion +diversional +diversionary +diversipedate +diversisporous +diversity +diversly +diversory +divert +divertedly +diverter +divertibility +divertible +diverticle +diverticular +diverticulate +diverticulitis +diverticulosis +diverticulum +diverting +divertingly +divertingness +divertisement +divertive +divertor +divest +divestible +divestitive +divestiture +divestment +divesture +dividable +dividableness +divide +divided +dividedly +dividedness +dividend +divider +dividing +dividingly +dividual +dividualism +dividually +dividuity +dividuous +divinable +divinail +divination +divinator +divinatory +divine +divinely +divineness +diviner +divineress +diving +divinify +divining +diviningly +divinity +divinityship +divinization +divinize +divinyl +divisibility +divisible +divisibleness +divisibly +division +divisional +divisionally +divisionary +divisionism +divisionist +divisionistic +divisive +divisively +divisiveness +divisor +divisorial +divisory +divisural +divorce +divorceable +divorcee +divorcement +divorcer +divorcible +divorcive +divot +divoto +divulgate +divulgater +divulgation +divulgatory +divulge +divulgement +divulgence +divulger +divulse +divulsion +divulsive +divulsor +divus +Divvers +divvy +diwata +dixenite +Dixie +dixie +Dixiecrat +dixit +dixy +dizain +dizen +dizenment +dizoic +dizygotic +dizzard +dizzily +dizziness +dizzy +Djagatay +djasakid +djave +djehad +djerib +djersa +Djuka +do +doab +doable +doarium +doat +doated +doater +doating +doatish +Dob +dob +dobbed +dobber +dobbin +dobbing +dobby +dobe +dobla +doblon +dobra +dobrao +dobson +doby +doc +docent +docentship +Docetae +Docetic +Docetically +Docetism +Docetist +Docetistic +Docetize +dochmiac +dochmiacal +dochmiasis +dochmius +docibility +docible +docibleness +docile +docilely +docility +docimasia +docimastic +docimastical +docimasy +docimology +docity +dock +dockage +docken +docker +docket +dockhead +dockhouse +dockization +dockize +dockland +dockmackie +dockman +dockmaster +dockside +dockyard +dockyardman +docmac +Docoglossa +docoglossan +docoglossate +docosane +doctor +doctoral +doctorally +doctorate +doctorbird +doctordom +doctoress +doctorfish +doctorhood +doctorial +doctorially +doctorization +doctorize +doctorless +doctorlike +doctorly +doctorship +doctress +doctrinaire +doctrinairism +doctrinal +doctrinalism +doctrinalist +doctrinality +doctrinally +doctrinarian +doctrinarianism +doctrinarily +doctrinarity +doctrinary +doctrinate +doctrine +doctrinism +doctrinist +doctrinization +doctrinize +doctrix +document +documental +documentalist +documentarily +documentary +documentation +documentize +dod +dodd +doddart +dodded +dodder +doddered +dodderer +doddering +doddery +doddie +dodding +doddle +doddy +doddypoll +Dode +dodecade +dodecadrachm +dodecafid +dodecagon +dodecagonal +dodecahedral +dodecahedric +dodecahedron +dodecahydrate +dodecahydrated +dodecamerous +dodecane +Dodecanesian +dodecanoic +dodecant +dodecapartite +dodecapetalous +dodecarch +dodecarchy +dodecasemic +dodecastyle +dodecastylos +dodecasyllabic +dodecasyllable +dodecatemory +Dodecatheon +dodecatoic +dodecatyl +dodecatylic +dodecuplet +dodecyl +dodecylene +dodecylic +dodge +dodgeful +dodger +dodgery +dodgily +dodginess +dodgy +dodkin +dodlet +dodman +dodo +dodoism +Dodona +Dodonaea +Dodonaeaceae +Dodonaean +Dodonean +Dodonian +dodrans +doe +doebird +Doedicurus +Doeg +doeglic +doegling +doer +does +doeskin +doesnt +doest +doff +doffer +doftberry +dog +dogal +dogate +dogbane +Dogberry +dogberry +Dogberrydom +Dogberryism +dogbite +dogblow +dogboat +dogbolt +dogbush +dogcart +dogcatcher +dogdom +doge +dogedom +dogeless +dogeship +dogface +dogfall +dogfight +dogfish +dogfoot +dogged +doggedly +doggedness +dogger +doggerel +doggereler +doggerelism +doggerelist +doggerelize +doggerelizer +doggery +doggess +doggish +doggishly +doggishness +doggo +doggone +doggoned +doggrel +doggrelize +doggy +doghead +doghearted +doghole +doghood +doghouse +dogie +dogless +doglike +dogly +dogma +dogman +dogmata +dogmatic +dogmatical +dogmatically +dogmaticalness +dogmatician +dogmatics +dogmatism +dogmatist +dogmatization +dogmatize +dogmatizer +dogmouth +dogplate +dogproof +Dogra +Dogrib +dogs +dogship +dogshore +dogskin +dogsleep +dogstone +dogtail +dogtie +dogtooth +dogtoothing +dogtrick +dogtrot +dogvane +dogwatch +dogwood +dogy +doigt +doiled +doily +doina +doing +doings +doit +doited +doitkin +doitrified +doke +Doketic +Doketism +dokhma +dokimastic +Dokmarok +Doko +Dol +dola +dolabra +dolabrate +dolabriform +dolcan +dolcian +dolciano +dolcino +doldrum +doldrums +dole +dolefish +doleful +dolefully +dolefulness +dolefuls +dolent +dolently +dolerite +doleritic +dolerophanite +dolesman +dolesome +dolesomely +dolesomeness +doless +doli +dolia +dolichoblond +dolichocephal +dolichocephali +dolichocephalic +dolichocephalism +dolichocephalize +dolichocephalous +dolichocephaly +dolichocercic +dolichocnemic +dolichocranial +dolichofacial +Dolichoglossus +dolichohieric +Dolicholus +dolichopellic +dolichopodous +dolichoprosopic +Dolichopsyllidae +Dolichos +dolichos +dolichosaur +Dolichosauri +Dolichosauria +Dolichosaurus +Dolichosoma +dolichostylous +dolichotmema +dolichuric +dolichurus +Doliidae +dolina +doline +dolioform +Doliolidae +Doliolum +dolium +doll +dollar +dollarbird +dollardee +dollardom +dollarfish +dollarleaf +dollbeer +dolldom +dollface +dollfish +dollhood +dollhouse +dollier +dolliness +dollish +dollishly +dollishness +dollmaker +dollmaking +dollop +dollship +dolly +dollyman +dollyway +dolman +dolmen +dolmenic +Dolomedes +dolomite +dolomitic +dolomitization +dolomitize +dolomization +dolomize +dolor +Dolores +doloriferous +dolorific +dolorifuge +dolorous +dolorously +dolorousness +dolose +dolous +Dolph +dolphin +dolphinlike +Dolphus +dolt +dolthead +doltish +doltishly +doltishness +dom +domain +domainal +domal +domanial +domatium +domatophobia +domba +Dombeya +Domdaniel +dome +domelike +doment +domer +domesday +domestic +domesticable +domesticality +domestically +domesticate +domestication +domesticative +domesticator +domesticity +domesticize +domett +domeykite +domic +domical +domically +Domicella +domicile +domicilement +domiciliar +domiciliary +domiciliate +domiciliation +dominance +dominancy +dominant +dominantly +dominate +dominated +dominatingly +domination +dominative +dominator +domine +domineer +domineerer +domineering +domineeringly +domineeringness +dominial +Dominic +dominical +dominicale +Dominican +Dominick +dominie +dominion +dominionism +dominionist +Dominique +dominium +domino +dominus +domitable +domite +Domitian +domitic +domn +domnei +domoid +dompt +domy +Don +don +donable +Donacidae +donaciform +Donal +Donald +Donar +donary +donatary +donate +donated +donatee +Donatiaceae +donation +Donatism +Donatist +Donatistic +Donatistical +donative +donatively +donator +donatory +donatress +donax +doncella +Dondia +done +donee +Donet +doney +dong +donga +Dongola +Dongolese +dongon +Donia +donjon +donkey +donkeyback +donkeyish +donkeyism +donkeyman +donkeywork +Donmeh +Donn +Donna +donna +Donne +donnered +donnert +Donnie +donnish +donnishness +donnism +donnot +donor +donorship +donought +Donovan +donship +donsie +dont +donum +doob +doocot +doodab +doodad +Doodia +doodle +doodlebug +doodler +doodlesack +doohickey +doohickus +doohinkey +doohinkus +dooja +dook +dooket +dookit +dool +doolee +dooley +dooli +doolie +dooly +doom +doomage +doombook +doomer +doomful +dooms +doomsday +doomsman +doomstead +doon +door +doorba +doorbell +doorboy +doorbrand +doorcase +doorcheek +doored +doorframe +doorhead +doorjamb +doorkeeper +doorknob +doorless +doorlike +doormaid +doormaker +doormaking +doorman +doornail +doorplate +doorpost +doorsill +doorstead +doorstep +doorstone +doorstop +doorward +doorway +doorweed +doorwise +dooryard +dop +dopa +dopamelanin +dopaoxidase +dopatta +dope +dopebook +doper +dopester +dopey +doppelkummel +Dopper +dopper +doppia +Doppler +dopplerite +Dor +dor +Dora +dorab +dorad +Doradidae +dorado +doraphobia +Dorask +Doraskean +dorbeetle +Dorcas +dorcastry +Dorcatherium +Dorcopsis +doree +dorestane +dorhawk +Dori +doria +Dorian +Doric +Dorical +Doricism +Doricize +Dorididae +Dorine +Doris +Dorism +Dorize +dorje +Dorking +dorlach +dorlot +dorm +dormancy +dormant +dormer +dormered +dormie +dormient +dormilona +dormition +dormitive +dormitory +dormouse +dormy +dorn +dorneck +dornic +dornick +dornock +Dorobo +Doronicum +Dorosoma +Dorothea +Dorothy +dorp +dorsabdominal +dorsabdominally +dorsad +dorsal +dorsale +dorsalgia +dorsalis +dorsally +dorsalmost +dorsalward +dorsalwards +dorsel +dorser +dorsibranch +Dorsibranchiata +dorsibranchiate +dorsicollar +dorsicolumn +dorsicommissure +dorsicornu +dorsiduct +dorsiferous +dorsifixed +dorsiflex +dorsiflexion +dorsiflexor +dorsigrade +dorsilateral +dorsilumbar +dorsimedian +dorsimesal +dorsimeson +dorsiparous +dorsispinal +dorsiventral +dorsiventrality +dorsiventrally +dorsoabdominal +dorsoanterior +dorsoapical +Dorsobranchiata +dorsocaudad +dorsocaudal +dorsocentral +dorsocephalad +dorsocephalic +dorsocervical +dorsocervically +dorsodynia +dorsoepitrochlear +dorsointercostal +dorsointestinal +dorsolateral +dorsolumbar +dorsomedial +dorsomedian +dorsomesal +dorsonasal +dorsonuchal +dorsopleural +dorsoposteriad +dorsoposterior +dorsoradial +dorsosacral +dorsoscapular +dorsosternal +dorsothoracic +dorsoventrad +dorsoventral +dorsoventrally +Dorstenia +dorsulum +dorsum +dorsumbonal +dorter +dortiness +dortiship +dorts +dorty +doruck +Dory +dory +Doryanthes +Dorylinae +doryphorus +dos +dosa +dosadh +dosage +dose +doser +dosimeter +dosimetric +dosimetrician +dosimetrist +dosimetry +Dosinia +dosiology +dosis +Dositheans +dosology +doss +dossal +dossel +dosser +dosseret +dossier +dossil +dossman +Dot +dot +dotage +dotal +dotard +dotardism +dotardly +dotardy +dotate +dotation +dotchin +dote +doted +doter +Dothideacea +dothideaceous +Dothideales +Dothidella +dothienenteritis +Dothiorella +dotiness +doting +dotingly +dotingness +dotish +dotishness +dotkin +dotless +dotlike +Doto +Dotonidae +dotriacontane +dotted +dotter +dotterel +dottily +dottiness +dotting +dottle +dottler +Dottore +Dotty +dotty +doty +douar +double +doubled +doubledamn +doubleganger +doublegear +doublehanded +doublehandedly +doublehandedness +doublehatching +doublehearted +doubleheartedness +doublehorned +doubleleaf +doublelunged +doubleness +doubler +doublet +doubleted +doubleton +doubletone +doubletree +doublets +doubling +doubloon +doubly +doubt +doubtable +doubtably +doubtedly +doubter +doubtful +doubtfully +doubtfulness +doubting +doubtingly +doubtingness +doubtless +doubtlessly +doubtlessness +doubtmonger +doubtous +doubtsome +douc +douce +doucely +douceness +doucet +douche +doucin +doucine +doudle +Doug +dough +doughbird +doughboy +doughface +doughfaceism +doughfoot +doughhead +doughiness +doughlike +doughmaker +doughmaking +doughman +doughnut +dought +doughtily +doughtiness +doughty +doughy +Douglas +doulocracy +doum +doundake +doup +douping +dour +dourine +dourly +dourness +douse +douser +dout +douter +doutous +douzepers +douzieme +dove +dovecot +doveflower +dovefoot +dovehouse +dovekey +dovekie +dovelet +dovelike +doveling +dover +dovetail +dovetailed +dovetailer +dovetailwise +doveweed +dovewood +dovish +Dovyalis +dow +dowable +dowager +dowagerism +dowcet +dowd +dowdily +dowdiness +dowdy +dowdyish +dowdyism +dowed +dowel +dower +doweral +doweress +dowerless +dowery +dowf +dowie +Dowieism +Dowieite +dowily +dowiness +dowitch +dowitcher +dowl +dowlas +dowless +down +downbear +downbeard +downbeat +downby +downcast +downcastly +downcastness +downcome +downcomer +downcoming +downcry +downcurved +downcut +downdale +downdraft +downer +downface +downfall +downfallen +downfalling +downfeed +downflow +downfold +downfolded +downgate +downgone +downgrade +downgrowth +downhanging +downhaul +downheaded +downhearted +downheartedly +downheartedness +downhill +downily +downiness +Downing +Downingia +downland +downless +downlie +downlier +downligging +downlike +downline +downlooked +downlooker +downlying +downmost +downness +downpour +downpouring +downright +downrightly +downrightness +downrush +downrushing +downset +downshare +downshore +downside +downsinking +downsitting +downsliding +downslip +downslope +downsman +downspout +downstage +downstairs +downstate +downstater +downstream +downstreet +downstroke +downswing +downtake +downthrow +downthrown +downthrust +Downton +downtown +downtrampling +downtreading +downtrend +downtrodden +downtroddenness +downturn +downward +downwardly +downwardness +downway +downweed +downweigh +downweight +downweighted +downwind +downwith +downy +dowp +dowry +dowsabel +dowse +dowser +dowset +doxa +Doxantha +doxastic +doxasticon +doxographer +doxographical +doxography +doxological +doxologically +doxologize +doxology +doxy +Doyle +doze +dozed +dozen +dozener +dozenth +dozer +dozily +doziness +dozy +dozzled +drab +Draba +drabbet +drabbish +drabble +drabbler +drabbletail +drabbletailed +drabby +drably +drabness +Dracaena +Dracaenaceae +drachm +drachma +drachmae +drachmai +drachmal +dracma +Draco +Dracocephalum +Draconian +Draconianism +Draconic +draconic +Draconically +Draconid +Draconis +Draconism +draconites +draconitic +dracontian +dracontiasis +dracontic +dracontine +dracontites +Dracontium +dracunculus +draegerman +draff +draffman +draffy +draft +draftage +draftee +drafter +draftily +draftiness +drafting +draftman +draftmanship +draftproof +draftsman +draftsmanship +draftswoman +draftswomanship +draftwoman +drafty +drag +dragade +dragbar +dragbolt +dragged +dragger +draggily +dragginess +dragging +draggingly +draggle +draggletail +draggletailed +draggletailedly +draggletailedness +draggly +draggy +draghound +dragline +dragman +dragnet +drago +dragoman +dragomanate +dragomanic +dragomanish +dragon +dragonesque +dragoness +dragonet +dragonfish +dragonfly +dragonhead +dragonhood +dragonish +dragonism +dragonize +dragonkind +dragonlike +dragonnade +dragonroot +dragontail +dragonwort +dragoon +dragoonable +dragoonade +dragoonage +dragooner +dragrope +dragsaw +dragsawing +dragsman +dragstaff +drail +drain +drainable +drainage +drainboard +draine +drained +drainer +drainerman +drainless +drainman +drainpipe +draintile +draisine +drake +drakestone +drakonite +dram +drama +dramalogue +Dramamine +dramatic +dramatical +dramatically +dramaticism +dramatics +dramaticule +dramatism +dramatist +dramatizable +dramatization +dramatize +dramatizer +dramaturge +dramaturgic +dramaturgical +dramaturgist +dramaturgy +dramm +drammage +dramme +drammed +drammer +dramming +drammock +dramseller +dramshop +drang +drank +drant +drapable +Draparnaldia +drape +drapeable +draper +draperess +draperied +drapery +drapetomania +drapping +drassid +Drassidae +drastic +drastically +drat +dratchell +drate +dratted +dratting +draught +draughtboard +draughthouse +draughtman +draughtmanship +draughts +draughtsman +draughtsmanship +draughtswoman +draughtswomanship +Dravida +Dravidian +Dravidic +dravya +draw +drawable +drawarm +drawback +drawbar +drawbeam +drawbench +drawboard +drawbolt +drawbore +drawboy +drawbridge +Drawcansir +drawcut +drawdown +drawee +drawer +drawers +drawfile +drawfiling +drawgate +drawgear +drawglove +drawhead +drawhorse +drawing +drawk +drawknife +drawknot +drawl +drawlatch +drawler +drawling +drawlingly +drawlingness +drawlink +drawloom +drawly +drawn +drawnet +drawoff +drawout +drawplate +drawpoint +drawrod +drawshave +drawsheet +drawspan +drawspring +drawstop +drawstring +drawtongs +drawtube +dray +drayage +drayman +drazel +dread +dreadable +dreader +dreadful +dreadfully +dreadfulness +dreadingly +dreadless +dreadlessly +dreadlessness +dreadly +dreadness +dreadnought +dream +dreamage +dreamer +dreamery +dreamful +dreamfully +dreamfulness +dreamhole +dreamily +dreaminess +dreamingly +dreamish +dreamland +dreamless +dreamlessly +dreamlessness +dreamlet +dreamlike +dreamlit +dreamlore +dreamsily +dreamsiness +dreamsy +dreamt +dreamtide +dreamwhile +dreamwise +dreamworld +dreamy +drear +drearfully +drearily +dreariment +dreariness +drearisome +drearly +drearness +dreary +dredge +dredgeful +dredger +dredging +dree +dreep +dreepiness +dreepy +dreg +dreggily +dregginess +dreggish +dreggy +dregless +dregs +dreiling +Dreissensia +dreissiger +drench +drencher +drenching +drenchingly +dreng +drengage +Drepanaspis +Drepanidae +Drepanididae +drepaniform +Drepanis +drepanium +drepanoid +Dreparnaudia +dress +dressage +dressed +dresser +dressership +dressily +dressiness +dressing +dressline +dressmaker +dressmakership +dressmakery +dressmaking +dressy +drest +Drew +drew +drewite +Dreyfusism +Dreyfusist +drias +drib +dribble +dribblement +dribbler +driblet +driddle +dried +drier +drierman +driest +drift +driftage +driftbolt +drifter +drifting +driftingly +driftland +driftless +driftlessness +driftlet +driftman +driftpiece +driftpin +driftway +driftweed +driftwind +driftwood +drifty +drightin +drill +driller +drillet +drilling +drillman +drillmaster +drillstock +Drimys +dringle +drink +drinkability +drinkable +drinkableness +drinkably +drinker +drinking +drinkless +drinkproof +drinn +drip +dripper +dripping +dripple +dripproof +drippy +dripstick +dripstone +drisheen +drisk +drivable +drivage +drive +driveaway +driveboat +drivebolt +drivehead +drivel +driveler +drivelingly +driven +drivepipe +driver +driverless +drivership +drivescrew +driveway +drivewell +driving +drivingly +drizzle +drizzly +drochuil +droddum +drofland +drogh +drogher +drogherman +drogue +droit +droitsman +droitural +droiturel +Drokpa +droll +drollery +drollingly +drollish +drollishness +drollist +drollness +drolly +Dromaeognathae +dromaeognathism +dromaeognathous +Dromaeus +drome +dromedarian +dromedarist +dromedary +drometer +Dromiacea +dromic +Dromiceiidae +Dromiceius +Dromicia +dromograph +dromomania +dromometer +dromond +Dromornis +dromos +dromotropic +drona +dronage +drone +dronepipe +droner +drongo +droningly +dronish +dronishly +dronishness +dronkgrass +drony +drool +droop +drooper +drooping +droopingly +droopingness +droopt +droopy +drop +dropberry +dropcloth +dropflower +drophead +droplet +droplight +droplike +dropling +dropman +dropout +dropper +dropping +droppingly +droppy +dropseed +dropsical +dropsically +dropsicalness +dropsied +dropsy +dropsywort +dropt +dropwise +dropworm +dropwort +Droschken +Drosera +Droseraceae +droseraceous +droshky +drosky +drosograph +drosometer +Drosophila +Drosophilidae +Drosophyllum +dross +drossel +drosser +drossiness +drossless +drossy +drostdy +droud +drought +droughtiness +droughty +drouk +drove +drover +drovy +drow +drown +drowner +drowningly +drowse +drowsily +drowsiness +drowsy +drub +drubber +drubbing +drubbly +drucken +drudge +drudger +drudgery +drudgingly +drudgism +druery +drug +drugeteria +drugger +druggery +drugget +druggeting +druggist +druggister +druggy +drugless +drugman +drugshop +drugstore +druid +druidess +druidic +druidical +druidism +druidry +druith +Drukpa +drum +drumbeat +drumble +drumbledore +drumbler +drumfire +drumfish +drumhead +drumheads +drumlike +drumlin +drumline +drumlinoid +drumloid +drumloidal +drumly +drummer +drumming +drummy +drumskin +drumstick +drumwood +drung +drungar +drunk +drunkard +drunken +drunkenly +drunkenness +drunkensome +drunkenwise +drunkery +Drupa +Drupaceae +drupaceous +drupal +drupe +drupel +drupelet +drupeole +drupetum +drupiferous +Druse +druse +Drusean +Drusedom +drusy +druxiness +druxy +dry +dryad +dryadetum +dryadic +dryas +dryasdust +drybeard +drybrained +drycoal +Drydenian +Drydenism +dryfoot +drygoodsman +dryhouse +drying +dryish +dryly +Drynaria +dryness +Dryobalanops +Dryope +Dryopes +Dryophyllum +Dryopians +dryopithecid +Dryopithecinae +dryopithecine +Dryopithecus +Dryops +Dryopteris +dryopteroid +drysalter +drysaltery +dryster +dryth +dryworker +Dschubba +duad +duadic +dual +Duala +duali +dualin +dualism +dualist +dualistic +dualistically +duality +dualization +dualize +dually +Dualmutef +dualogue +Duane +duarch +duarchy +dub +dubash +dubb +dubba +dubbah +dubbeltje +dubber +dubbing +dubby +Dubhe +Dubhgall +dubiety +dubiocrystalline +dubiosity +dubious +dubiously +dubiousness +dubitable +dubitably +dubitancy +dubitant +dubitate +dubitatingly +dubitation +dubitative +dubitatively +Duboisia +duboisin +duboisine +Dubonnet +dubs +ducal +ducally +ducamara +ducape +ducat +ducato +ducatoon +ducdame +duces +Duchesnea +Duchess +duchess +duchesse +duchesslike +duchy +duck +duckbill +duckblind +duckboard +duckboat +ducker +duckery +duckfoot +duckhearted +duckhood +duckhouse +duckhunting +duckie +ducking +duckling +ducklingship +duckmeat +duckpin +duckpond +duckstone +duckweed +duckwife +duckwing +Duco +duct +ducted +ductibility +ductible +ductile +ductilely +ductileness +ductilimeter +ductility +ductilize +duction +ductless +ductor +ductule +Ducula +Duculinae +dud +dudaim +dudder +duddery +duddies +dude +dudeen +dudgeon +dudine +dudish +dudishness +dudism +dudler +dudley +Dudleya +dudleyite +dudman +due +duel +dueler +dueling +duelist +duelistic +duello +dueness +duenna +duennadom +duennaship +duer +Duessa +duet +duettist +duff +duffadar +duffel +duffer +dufferdom +duffing +dufoil +dufrenite +dufrenoysite +dufter +dufterdar +duftery +dug +dugal +dugdug +duggler +dugong +Dugongidae +dugout +dugway +duhat +Duhr +duiker +duikerbok +duim +Duit +duit +dujan +Duke +duke +dukedom +dukeling +dukely +dukery +dukeship +dukhn +dukker +dukkeripen +Dulanganes +Dulat +dulbert +dulcet +dulcetly +dulcetness +dulcian +dulciana +dulcification +dulcifluous +dulcify +dulcigenic +dulcimer +Dulcin +Dulcinea +Dulcinist +dulcitol +dulcitude +dulcose +duledge +duler +dulia +dull +dullard +dullardism +dullardness +dullbrained +duller +dullery +dullhead +dullhearted +dullification +dullify +dullish +dullity +dullness +dullpate +dullsome +dully +dulosis +dulotic +dulse +dulseman +dult +dultie +dulwilly +duly +dum +duma +dumaist +dumb +dumba +dumbbell +dumbbeller +dumbcow +dumbfounder +dumbfounderment +dumbhead +dumbledore +dumbly +dumbness +dumdum +dumetose +dumfound +dumfounder +dumfounderment +dummel +dummered +dumminess +dummy +dummyism +dummyweed +Dumontia +Dumontiaceae +dumontite +dumortierite +dumose +dumosity +dump +dumpage +dumpcart +dumper +dumpily +dumpiness +dumping +dumpish +dumpishly +dumpishness +dumple +dumpling +dumpoke +dumpy +dumsola +dun +dunair +dunal +dunbird +Duncan +dunce +duncedom +duncehood +duncery +dunch +Dunciad +duncical +duncify +duncish +duncishly +duncishness +dundasite +dunder +dunderhead +dunderheaded +dunderheadedness +dunderpate +dune +dunelike +dunfish +dung +Dungan +dungannonite +dungaree +dungbeck +dungbird +dungbred +dungeon +dungeoner +dungeonlike +dunger +dunghill +dunghilly +dungol +dungon +dungy +dungyard +dunite +dunk +dunkadoo +Dunkard +Dunker +dunker +Dunkirk +Dunkirker +Dunlap +dunlin +Dunlop +dunnage +dunne +dunner +dunness +dunnish +dunnite +dunnock +dunny +dunpickle +Duns +dunst +dunstable +dunt +duntle +duny +dunziekte +duo +duocosane +duodecahedral +duodecahedron +duodecane +duodecennial +duodecillion +duodecimal +duodecimality +duodecimally +duodecimfid +duodecimo +duodecimole +duodecuple +duodena +duodenal +duodenary +duodenate +duodenation +duodene +duodenectomy +duodenitis +duodenocholangitis +duodenocholecystostomy +duodenocholedochotomy +duodenocystostomy +duodenoenterostomy +duodenogram +duodenojejunal +duodenojejunostomy +duodenopancreatectomy +duodenoscopy +duodenostomy +duodenotomy +duodenum +duodrama +duograph +duogravure +duole +duoliteral +duologue +duomachy +duopod +duopolistic +duopoly +duopsonistic +duopsony +duosecant +duotone +duotriacontane +duotype +dup +dupability +dupable +dupe +dupedom +duper +dupery +dupion +dupla +duplation +duple +duplet +duplex +duplexity +duplicability +duplicable +duplicand +duplicate +duplication +duplicative +duplicator +duplicature +duplicia +duplicident +Duplicidentata +duplicidentate +duplicipennate +duplicitas +duplicity +duplification +duplify +duplone +dupondius +duppy +dura +durability +durable +durableness +durably +durain +dural +Duralumin +duramatral +duramen +durance +Durandarte +durangite +Durango +Durani +durant +Duranta +duraplasty +duraquara +duraspinalis +duration +durational +durationless +durative +durax +durbachite +Durban +durbar +durdenite +dure +durene +durenol +duress +duressor +durgan +Durham +durian +duridine +Durindana +during +duringly +Durio +durity +durmast +durn +duro +Duroc +durometer +duroquinone +durra +durrie +durrin +durry +durst +durukuli +durwaun +duryl +Duryodhana +Durzada +dusack +duscle +dush +dusio +dusk +dusken +duskily +duskiness +duskingtide +duskish +duskishly +duskishness +duskly +duskness +dusky +dust +dustbin +dustbox +dustcloth +dustee +duster +dusterman +dustfall +dustily +Dustin +dustiness +dusting +dustless +dustlessness +dustman +dustpan +dustproof +dustuck +dustwoman +dusty +dustyfoot +Dusun +Dutch +dutch +Dutcher +Dutchify +Dutchman +Dutchy +duteous +duteously +duteousness +dutiability +dutiable +dutied +dutiful +dutifully +dutifulness +dutra +duty +dutymonger +duumvir +duumviral +duumvirate +duvet +duvetyn +dux +duyker +dvaita +dvandva +dwale +dwalm +Dwamish +dwang +dwarf +dwarfish +dwarfishly +dwarfishness +dwarfism +dwarfling +dwarfness +dwarfy +dwayberry +Dwayne +dwell +dwelled +dweller +dwelling +dwelt +Dwight +dwindle +dwindlement +dwine +Dwyka +dyad +dyadic +Dyak +dyakisdodecahedron +Dyakish +dyarchic +dyarchical +dyarchy +Dyas +Dyassic +dyaster +Dyaus +dyce +dye +dyeable +dyehouse +dyeing +dyeleaves +dyemaker +dyemaking +dyer +dyester +dyestuff +dyeware +dyeweed +dyewood +dygogram +dying +dyingly +dyingness +dyke +dykehopper +dyker +dykereeve +Dylan +dynagraph +dynameter +dynametric +dynametrical +dynamic +dynamical +dynamically +dynamics +dynamis +dynamism +dynamist +dynamistic +dynamitard +dynamite +dynamiter +dynamitic +dynamitical +dynamitically +dynamiting +dynamitish +dynamitism +dynamitist +dynamization +dynamize +dynamo +dynamoelectric +dynamoelectrical +dynamogenesis +dynamogenic +dynamogenous +dynamogenously +dynamogeny +dynamometamorphic +dynamometamorphism +dynamometamorphosed +dynamometer +dynamometric +dynamometrical +dynamometry +dynamomorphic +dynamoneure +dynamophone +dynamostatic +dynamotor +dynast +Dynastes +dynastical +dynastically +dynasticism +dynastid +dynastidan +Dynastides +Dynastinae +dynasty +dynatron +dyne +dyophone +Dyophysite +Dyophysitic +Dyophysitical +Dyophysitism +dyotheism +Dyothelete +Dyotheletian +Dyotheletic +Dyotheletical +Dyotheletism +Dyothelism +dyphone +dysacousia +dysacousis +dysanalyte +dysaphia +dysarthria +dysarthric +dysarthrosis +dysbulia +dysbulic +dyschiria +dyschroa +dyschroia +dyschromatopsia +dyschromatoptic +dyschronous +dyscrasia +dyscrasial +dyscrasic +dyscrasite +dyscratic +dyscrystalline +dysenteric +dysenterical +dysentery +dysepulotic +dysepulotical +dyserethisia +dysergasia +dysergia +dysesthesia +dysesthetic +dysfunction +dysgenesic +dysgenesis +dysgenetic +dysgenic +dysgenical +dysgenics +dysgeogenous +dysgnosia +dysgraphia +dysidrosis +dyskeratosis +dyskinesia +dyskinetic +dyslalia +dyslexia +dyslogia +dyslogistic +dyslogistically +dyslogy +dysluite +dyslysin +dysmenorrhea +dysmenorrheal +dysmerism +dysmeristic +dysmerogenesis +dysmerogenetic +dysmeromorph +dysmeromorphic +dysmetria +dysmnesia +dysmorphism +dysmorphophobia +dysneuria +dysnomy +dysodile +dysodontiasis +dysorexia +dysorexy +dysoxidation +dysoxidizable +dysoxidize +dyspathetic +dyspathy +dyspepsia +dyspepsy +dyspeptic +dyspeptical +dyspeptically +dysphagia +dysphagic +dysphasia +dysphasic +dysphemia +dysphonia +dysphonic +dysphoria +dysphoric +dysphotic +dysphrasia +dysphrenia +dyspituitarism +dysplasia +dysplastic +dyspnea +dyspneal +dyspneic +dyspnoic +dysprosia +dysprosium +dysraphia +dyssnite +Dyssodia +dysspermatism +dyssynergia +dyssystole +dystaxia +dystectic +dysteleological +dysteleologist +dysteleology +dysthyroidism +dystocia +dystocial +dystome +dystomic +dystomous +dystrophia +dystrophic +dystrophy +dysuria +dysuric +dysyntribite +dytiscid +Dytiscidae +Dytiscus +dzeren +Dzungar +E +e +ea +each +eachwhere +eager +eagerly +eagerness +eagle +eaglelike +eagless +eaglestone +eaglet +eaglewood +eagre +ean +ear +earache +earbob +earcap +earcockle +eardrop +eardropper +eardrum +eared +earflower +earful +earhole +earing +earjewel +Earl +earl +earlap +earldom +Earle +earless +earlet +earlike +earliness +earlish +earlock +earlship +early +earmark +earn +earner +earnest +earnestly +earnestness +earnful +Earnie +earning +earnings +earphone +earpick +earpiece +earplug +earreach +earring +earringed +earscrew +earshot +earsore +earsplitting +eartab +earth +earthboard +earthborn +earthbred +earthdrake +earthed +earthen +earthenhearted +earthenware +earthfall +earthfast +earthgall +earthgrubber +earthian +earthiness +earthkin +earthless +earthlight +earthlike +earthliness +earthling +earthly +earthmaker +earthmaking +earthnut +earthpea +earthquake +earthquaked +earthquaken +earthquaking +Earthshaker +earthshine +earthshock +earthslide +earthsmoke +earthstar +earthtongue +earthwall +earthward +earthwards +earthwork +earthworm +earthy +earwax +earwig +earwigginess +earwiggy +earwitness +earworm +earwort +ease +easeful +easefully +easefulness +easel +easeless +easement +easer +easier +easiest +easily +easiness +easing +east +eastabout +eastbound +Easter +easter +easterling +easterly +Eastern +eastern +easterner +Easternism +Easternly +easternmost +Eastertide +easting +Eastlake +eastland +eastmost +Eastre +eastward +eastwardly +easy +easygoing +easygoingness +eat +eatability +eatable +eatableness +eatage +Eatanswill +eatberry +eaten +eater +eatery +eating +eats +eave +eaved +eavedrop +eaver +eaves +eavesdrop +eavesdropper +eavesdropping +ebb +ebbman +Eben +Ebenaceae +ebenaceous +Ebenales +ebeneous +Ebenezer +Eberthella +Ebionism +Ebionite +Ebionitic +Ebionitism +Ebionize +Eboe +eboe +ebon +ebonist +ebonite +ebonize +ebony +ebracteate +ebracteolate +ebriate +ebriety +ebriosity +ebrious +ebriously +ebullate +ebullience +ebulliency +ebullient +ebulliently +ebulliometer +ebullioscope +ebullioscopic +ebullioscopy +ebullition +ebullitive +ebulus +eburated +eburine +Eburna +eburnated +eburnation +eburnean +eburneoid +eburneous +eburnian +eburnification +ecad +ecalcarate +ecanda +ecardinal +Ecardines +ecarinate +ecarte +Ecaudata +ecaudate +Ecballium +ecbatic +ecblastesis +ecbole +ecbolic +Ecca +eccaleobion +eccentrate +eccentric +eccentrical +eccentrically +eccentricity +eccentring +eccentrometer +ecchondroma +ecchondrosis +ecchondrotome +ecchymoma +ecchymose +ecchymosis +ecclesia +ecclesial +ecclesiarch +ecclesiarchy +ecclesiast +Ecclesiastes +ecclesiastic +ecclesiastical +ecclesiastically +ecclesiasticism +ecclesiasticize +ecclesiastics +Ecclesiasticus +ecclesiastry +ecclesioclastic +ecclesiography +ecclesiolater +ecclesiolatry +ecclesiologic +ecclesiological +ecclesiologically +ecclesiologist +ecclesiology +ecclesiophobia +eccoprotic +eccoproticophoric +eccrinology +eccrisis +eccritic +eccyclema +eccyesis +ecdemic +ecdemite +ecderon +ecderonic +ecdysiast +ecdysis +ecesic +ecesis +ecgonine +eche +echea +echelette +echelon +echelonment +Echeloot +Echeneidae +echeneidid +Echeneididae +echeneidoid +Echeneis +Echeveria +echidna +Echidnidae +Echimys +Echinacea +echinal +echinate +echinid +Echinidea +echinital +echinite +Echinocactus +Echinocaris +Echinocereus +Echinochloa +echinochrome +echinococcus +Echinoderes +Echinoderidae +echinoderm +Echinoderma +echinodermal +Echinodermata +echinodermatous +echinodermic +Echinodorus +echinoid +Echinoidea +echinologist +echinology +Echinomys +Echinopanax +Echinops +echinopsine +Echinorhinidae +Echinorhinus +Echinorhynchus +Echinospermum +Echinosphaerites +Echinosphaeritidae +Echinostoma +Echinostomatidae +echinostome +echinostomiasis +Echinozoa +echinulate +echinulated +echinulation +echinuliform +echinus +Echis +echitamine +Echites +Echium +echiurid +Echiurida +echiuroid +Echiuroidea +Echiurus +echo +echoer +echoic +echoingly +echoism +echoist +echoize +echolalia +echolalic +echoless +echometer +echopractic +echopraxia +echowise +Echuca +eciliate +Eciton +ecize +Eckehart +ecklein +eclair +eclampsia +eclamptic +eclat +eclectic +eclectical +eclectically +eclecticism +eclecticize +Eclectics +eclectism +eclectist +eclegm +eclegma +eclipsable +eclipsareon +eclipsation +eclipse +eclipser +eclipsis +ecliptic +ecliptical +ecliptically +eclogite +eclogue +eclosion +ecmnesia +ecoid +ecole +ecologic +ecological +ecologically +ecologist +ecology +econometer +econometric +econometrician +econometrics +economic +economical +economically +economics +economism +economist +Economite +economization +economize +economizer +economy +ecophene +ecophobia +ecorticate +ecospecies +ecospecific +ecospecifically +ecostate +ecosystem +ecotonal +ecotone +ecotype +ecotypic +ecotypically +ecphonesis +ecphorable +ecphore +ecphoria +ecphorization +ecphorize +ecphrasis +ecrasite +ecru +ecrustaceous +ecstasis +ecstasize +ecstasy +ecstatic +ecstatica +ecstatical +ecstatically +ecstaticize +ecstrophy +ectad +ectadenia +ectal +ectally +ectasia +ectasis +ectatic +ectene +ectental +ectepicondylar +ectethmoid +ectethmoidal +Ecthesis +ecthetically +ecthlipsis +ecthyma +ectiris +ectobatic +ectoblast +ectoblastic +ectobronchium +ectocardia +Ectocarpaceae +ectocarpaceous +Ectocarpales +ectocarpic +ectocarpous +Ectocarpus +ectocinerea +ectocinereal +ectocoelic +ectocondylar +ectocondyle +ectocondyloid +ectocornea +ectocranial +ectocuneiform +ectocuniform +ectocyst +ectodactylism +ectoderm +ectodermal +ectodermic +ectodermoidal +ectodermosis +ectodynamomorphic +ectoentad +ectoenzyme +ectoethmoid +ectogenesis +ectogenic +ectogenous +ectoglia +Ectognatha +ectolecithal +ectoloph +ectomere +ectomeric +ectomesoblast +ectomorph +ectomorphic +ectomorphy +ectonephridium +ectoparasite +ectoparasitic +Ectoparasitica +ectopatagium +ectophloic +ectophyte +ectophytic +ectopia +ectopic +Ectopistes +ectoplacenta +ectoplasm +ectoplasmatic +ectoplasmic +ectoplastic +ectoplasy +Ectoprocta +ectoproctan +ectoproctous +ectopterygoid +ectopy +ectoretina +ectorganism +ectorhinal +ectosarc +ectosarcous +ectoskeleton +ectosomal +ectosome +ectosphenoid +ectosphenotic +ectosphere +ectosteal +ectosteally +ectostosis +ectotheca +ectotoxin +Ectotrophi +ectotrophic +ectozoa +ectozoan +ectozoic +ectozoon +ectrodactylia +ectrodactylism +ectrodactyly +ectrogenic +ectrogeny +ectromelia +ectromelian +ectromelic +ectromelus +ectropion +ectropium +ectropometer +ectrosyndactyly +ectypal +ectype +ectypography +Ecuadoran +Ecuadorian +ecuelling +ecumenic +ecumenical +ecumenicalism +ecumenicality +ecumenically +ecumenicity +ecyphellate +eczema +eczematization +eczematoid +eczematosis +eczematous +Ed +edacious +edaciously +edaciousness +edacity +Edana +edaphic +edaphology +edaphon +Edaphosauria +Edaphosaurus +Edda +Eddaic +edder +Eddic +Eddie +eddish +eddo +Eddy +eddy +eddyroot +edea +edeagra +edeitis +edelweiss +edema +edematous +edemic +Eden +Edenic +edenite +Edenization +Edenize +edental +edentalous +Edentata +edentate +edentulate +edentulous +edeodynia +edeology +edeomania +edeoscopy +edeotomy +Edessan +edestan +edestin +Edestosaurus +Edgar +edge +edgebone +edged +edgeless +edgemaker +edgemaking +edgeman +edger +edgerman +edgeshot +edgestone +edgeways +edgeweed +edgewise +edginess +edging +edgingly +edgrew +edgy +edh +edibility +edible +edibleness +edict +edictal +edictally +edicule +edificable +edification +edificator +edificatory +edifice +edificial +edifier +edify +edifying +edifyingly +edifyingness +edingtonite +edit +edital +Edith +edition +editor +editorial +editorialize +editorially +editorship +editress +Ediya +Edmond +Edmund +Edna +Edo +Edomite +Edomitish +Edoni +Edriasteroidea +Edrioasteroid +Edrioasteroidea +Edriophthalma +edriophthalmatous +edriophthalmian +edriophthalmic +edriophthalmous +Eduardo +Educabilia +educabilian +educability +educable +educand +educatable +educate +educated +educatee +education +educationable +educational +educationalism +educationalist +educationally +educationary +educationist +educative +educator +educatory +educatress +educe +educement +educible +educive +educt +eduction +eductive +eductor +edulcorate +edulcoration +edulcorative +edulcorator +Eduskunta +Edward +Edwardean +Edwardeanism +Edwardian +Edwardine +Edwardsia +Edwardsiidae +Edwin +Edwina +eegrass +eel +eelboat +eelbob +eelbobber +eelcake +eelcatcher +eeler +eelery +eelfare +eelfish +eelgrass +eellike +eelpot +eelpout +eelshop +eelskin +eelspear +eelware +eelworm +eely +eer +eerie +eerily +eeriness +eerisome +effable +efface +effaceable +effacement +effacer +effect +effecter +effectful +effectible +effective +effectively +effectiveness +effectivity +effectless +effector +effects +effectual +effectuality +effectualize +effectually +effectualness +effectuate +effectuation +effeminacy +effeminate +effeminately +effeminateness +effemination +effeminatize +effeminization +effeminize +effendi +efferent +effervesce +effervescence +effervescency +effervescent +effervescible +effervescingly +effervescive +effete +effeteness +effetman +efficacious +efficaciously +efficaciousness +efficacity +efficacy +efficience +efficiency +efficient +efficiently +Effie +effigial +effigiate +effigiation +effigurate +effiguration +effigy +efflate +efflation +effloresce +efflorescence +efflorescency +efflorescent +efflower +effluence +effluency +effluent +effluvia +effluvial +effluviate +effluviography +effluvious +effluvium +efflux +effluxion +effodient +Effodientia +efform +efformation +efformative +effort +effortful +effortless +effortlessly +effossion +effraction +effranchise +effranchisement +effrontery +effulge +effulgence +effulgent +effulgently +effund +effuse +effusiometer +effusion +effusive +effusively +effusiveness +Efik +eflagelliferous +efoliolate +efoliose +efoveolate +eft +eftest +eftsoons +egad +egalitarian +egalitarianism +egality +Egba +Egbert +Egbo +egence +egeran +Egeria +egest +egesta +egestion +egestive +egg +eggberry +eggcup +eggcupful +eggeater +egger +eggfish +eggfruit +egghead +egghot +egging +eggler +eggless +egglike +eggnog +eggplant +eggshell +eggy +egilops +egipto +Eglamore +eglandular +eglandulose +eglantine +eglatere +eglestonite +egma +ego +egocentric +egocentricity +egocentrism +Egocerus +egohood +egoism +egoist +egoistic +egoistical +egoistically +egoity +egoize +egoizer +egol +egolatrous +egomania +egomaniac +egomaniacal +egomism +egophonic +egophony +egosyntonic +egotheism +egotism +egotist +egotistic +egotistical +egotistically +egotize +egregious +egregiously +egregiousness +egress +egression +egressive +egressor +egret +Egretta +egrimony +egueiite +egurgitate +eguttulate +Egypt +Egyptian +Egyptianism +Egyptianization +Egyptianize +Egyptize +Egyptologer +Egyptologic +Egyptological +Egyptologist +Egyptology +eh +Ehatisaht +eheu +ehlite +Ehretia +Ehretiaceae +ehrwaldite +ehuawa +eichbergite +Eichhornia +eichwaldite +eicosane +eident +eidently +eider +eidetic +eidograph +eidolic +eidolism +eidology +eidolology +eidolon +eidoptometry +eidouranion +eigenfunction +eigenvalue +eight +eighteen +eighteenfold +eighteenmo +eighteenth +eighteenthly +eightfoil +eightfold +eighth +eighthly +eightieth +eightling +eightpenny +eightscore +eightsman +eightsome +eighty +eightyfold +eigne +Eikonogen +eikonology +Eileen +Eimak +eimer +Eimeria +einkorn +Einsteinian +Eireannach +Eirene +eiresione +eisegesis +eisegetical +eisodic +eisteddfod +eisteddfodic +eisteddfodism +either +ejaculate +ejaculation +ejaculative +ejaculator +ejaculatory +Ejam +eject +ejecta +ejectable +ejection +ejective +ejectively +ejectivity +ejectment +ejector +ejicient +ejoo +ekaboron +ekacaesium +ekaha +ekamanganese +ekasilicon +ekatantalum +eke +ekebergite +eker +ekerite +eking +ekka +Ekoi +ekphore +Ekron +Ekronite +ektene +ektenes +ektodynamorphic +el +elaborate +elaborately +elaborateness +elaboration +elaborative +elaborator +elaboratory +elabrate +Elachista +Elachistaceae +elachistaceous +Elaeagnaceae +elaeagnaceous +Elaeagnus +Elaeis +elaeoblast +elaeoblastic +Elaeocarpaceae +elaeocarpaceous +Elaeocarpus +Elaeococca +Elaeodendron +elaeodochon +elaeomargaric +elaeometer +elaeoptene +elaeosaccharum +elaeothesium +elaidate +elaidic +elaidin +elaidinic +elain +Elaine +elaine +elaioleucite +elaioplast +elaiosome +Elamite +Elamitic +Elamitish +elance +eland +elanet +Elanus +Elaphe +Elaphebolion +elaphine +Elaphodus +Elaphoglossum +Elaphomyces +Elaphomycetaceae +Elaphrium +elaphure +elaphurine +Elaphurus +elapid +Elapidae +Elapinae +elapine +elapoid +Elaps +elapse +Elapsoidea +elasmobranch +elasmobranchian +elasmobranchiate +Elasmobranchii +elasmosaur +Elasmosaurus +elasmothere +Elasmotherium +elastance +elastic +elastica +elastically +elastician +elasticin +elasticity +elasticize +elasticizer +elasticness +elastin +elastivity +elastomer +elastomeric +elastometer +elastometry +elastose +elatcha +elate +elated +elatedly +elatedness +elater +elaterid +Elateridae +elaterin +elaterite +elaterium +elateroid +Elatha +Elatinaceae +elatinaceous +Elatine +elation +elative +elator +elatrometer +elb +Elbert +Elberta +elbow +elbowboard +elbowbush +elbowchair +elbowed +elbower +elbowpiece +elbowroom +elbowy +elcaja +elchee +eld +elder +elderberry +elderbrotherhood +elderbrotherish +elderbrotherly +elderbush +elderhood +elderliness +elderly +elderman +eldership +eldersisterly +elderwoman +elderwood +elderwort +eldest +eldin +elding +Eldred +eldress +eldritch +Elean +Eleanor +Eleatic +Eleaticism +Eleazar +elecampane +elect +electable +electee +electicism +election +electionary +electioneer +electioneerer +elective +electively +electiveness +electivism +electivity +electly +elector +electoral +electorally +electorate +electorial +electorship +Electra +electragist +electragy +electralize +electrepeter +electress +electret +electric +electrical +electricalize +electrically +electricalness +electrician +electricity +electricize +electrics +electriferous +electrifiable +electrification +electrifier +electrify +electrion +electrionic +electrizable +electrization +electrize +electrizer +electro +electroacoustic +electroaffinity +electroamalgamation +electroanalysis +electroanalytic +electroanalytical +electroanesthesia +electroballistic +electroballistics +electrobath +electrobiological +electrobiologist +electrobiology +electrobioscopy +electroblasting +electrobrasser +electrobus +electrocapillarity +electrocapillary +electrocardiogram +electrocardiograph +electrocardiographic +electrocardiography +electrocatalysis +electrocatalytic +electrocataphoresis +electrocataphoretic +electrocauterization +electrocautery +electroceramic +electrochemical +electrochemically +electrochemist +electrochemistry +electrochronograph +electrochronographic +electrochronometer +electrochronometric +electrocoagulation +electrocoating +electrocolloidal +electrocontractility +electrocorticogram +electroculture +electrocute +electrocution +electrocutional +electrocutioner +electrocystoscope +electrode +electrodeless +electrodentistry +electrodeposit +electrodepositable +electrodeposition +electrodepositor +electrodesiccate +electrodesiccation +electrodiagnosis +electrodialysis +electrodialyze +electrodialyzer +electrodiplomatic +electrodispersive +electrodissolution +electrodynamic +electrodynamical +electrodynamics +electrodynamism +electrodynamometer +electroencephalogram +electroencephalograph +electroencephalography +electroendosmose +electroendosmosis +electroendosmotic +electroengrave +electroengraving +electroergometer +electroetching +electroethereal +electroextraction +electroform +electroforming +electrofuse +electrofused +electrofusion +electrogalvanic +electrogalvanize +electrogenesis +electrogenetic +electrogild +electrogilding +electrogilt +electrograph +electrographic +electrographite +electrography +electroharmonic +electrohemostasis +electrohomeopathy +electrohorticulture +electrohydraulic +electroimpulse +electroindustrial +electroionic +electroirrigation +electrokinematics +electrokinetic +electrokinetics +electrolier +electrolithotrity +electrologic +electrological +electrologist +electrology +electroluminescence +electroluminescent +electrolysis +electrolyte +electrolytic +electrolytical +electrolytically +electrolyzability +electrolyzable +electrolyzation +electrolyze +electrolyzer +electromagnet +electromagnetic +electromagnetical +electromagnetically +electromagnetics +electromagnetism +electromagnetist +electromassage +electromechanical +electromechanics +electromedical +electromer +electromeric +electromerism +electrometallurgical +electrometallurgist +electrometallurgy +electrometer +electrometric +electrometrical +electrometrically +electrometry +electromobile +electromobilism +electromotion +electromotive +electromotivity +electromotograph +electromotor +electromuscular +electromyographic +electron +electronarcosis +electronegative +electronervous +electronic +electronics +electronographic +electrooptic +electrooptical +electrooptically +electrooptics +electroosmosis +electroosmotic +electroosmotically +electrootiatrics +electropathic +electropathology +electropathy +electropercussive +electrophobia +electrophone +electrophore +electrophoresis +electrophoretic +electrophoric +Electrophoridae +electrophorus +electrophotometer +electrophotometry +electrophototherapy +electrophrenic +electrophysics +electrophysiological +electrophysiologist +electrophysiology +electropism +electroplate +electroplater +electroplating +electroplax +electropneumatic +electropneumatically +electropoion +electropolar +electropositive +electropotential +electropower +electropsychrometer +electropult +electropuncturation +electropuncture +electropuncturing +electropyrometer +electroreceptive +electroreduction +electrorefine +electroscission +electroscope +electroscopic +electrosherardizing +electroshock +electrosmosis +electrostatic +electrostatical +electrostatically +electrostatics +electrosteel +electrostenolysis +electrostenolytic +electrostereotype +electrostriction +electrosurgery +electrosurgical +electrosynthesis +electrosynthetic +electrosynthetically +electrotactic +electrotautomerism +electrotaxis +electrotechnic +electrotechnical +electrotechnician +electrotechnics +electrotechnology +electrotelegraphic +electrotelegraphy +electrotelethermometer +electrotellurograph +electrotest +electrothanasia +electrothanatosis +electrotherapeutic +electrotherapeutical +electrotherapeutics +electrotherapeutist +electrotherapist +electrotherapy +electrothermal +electrothermancy +electrothermic +electrothermics +electrothermometer +electrothermostat +electrothermostatic +electrothermotic +electrotitration +electrotonic +electrotonicity +electrotonize +electrotonus +electrotrephine +electrotropic +electrotropism +electrotype +electrotyper +electrotypic +electrotyping +electrotypist +electrotypy +electrovalence +electrovalency +electrovection +electroviscous +electrovital +electrowin +electrum +electuary +eleemosynarily +eleemosynariness +eleemosynary +elegance +elegancy +elegant +elegantly +elegiac +elegiacal +elegiambic +elegiambus +elegiast +elegist +elegit +elegize +elegy +eleidin +element +elemental +elementalism +elementalist +elementalistic +elementalistically +elementality +elementalize +elementally +elementarily +elementariness +elementary +elementoid +elemi +elemicin +elemin +elench +elenchi +elenchic +elenchical +elenchically +elenchize +elenchtic +elenchtical +elenctic +elenge +eleoblast +Eleocharis +eleolite +eleomargaric +eleometer +eleonorite +eleoptene +eleostearate +eleostearic +elephant +elephanta +elephantiac +elephantiasic +elephantiasis +elephantic +elephanticide +Elephantidae +elephantine +elephantlike +elephantoid +elephantoidal +Elephantopus +elephantous +elephantry +Elephas +Elettaria +Eleusine +Eleusinia +Eleusinian +Eleusinion +Eleut +eleutherarch +Eleutheri +Eleutheria +Eleutherian +Eleutherios +eleutherism +eleutherodactyl +Eleutherodactyli +Eleutherodactylus +eleutheromania +eleutheromaniac +eleutheromorph +eleutheropetalous +eleutherophyllous +eleutherosepalous +Eleutherozoa +eleutherozoan +elevate +elevated +elevatedly +elevatedness +elevating +elevatingly +elevation +elevational +elevator +elevatory +eleven +elevener +elevenfold +eleventh +eleventhly +elevon +elf +elfenfolk +elfhood +elfic +elfin +elfinwood +elfish +elfishly +elfishness +elfkin +elfland +elflike +elflock +elfship +elfwife +elfwort +Eli +Elia +Elian +Elianic +Elias +eliasite +elicit +elicitable +elicitate +elicitation +elicitor +elicitory +elide +elidible +eligibility +eligible +eligibleness +eligibly +Elihu +Elijah +eliminable +eliminand +eliminant +eliminate +elimination +eliminative +eliminator +eliminatory +Elinor +Elinvar +Eliot +Eliphalet +eliquate +eliquation +Elisabeth +Elisha +Elishah +elision +elisor +Elissa +elite +elixir +Eliza +Elizabeth +Elizabethan +Elizabethanism +Elizabethanize +elk +Elkanah +Elkdom +Elkesaite +elkhorn +elkhound +Elkoshite +elkslip +Elkuma +elkwood +ell +Ella +ellachick +ellagate +ellagic +ellagitannin +Ellasar +elle +elleck +Ellen +ellenyard +Ellerian +ellfish +Ellice +Ellick +Elliot +Elliott +ellipse +ellipses +ellipsis +ellipsograph +ellipsoid +ellipsoidal +ellipsone +ellipsonic +elliptic +elliptical +elliptically +ellipticalness +ellipticity +elliptograph +elliptoid +ellops +ellwand +elm +Elmer +elmy +Eloah +elocular +elocute +elocution +elocutionary +elocutioner +elocutionist +elocutionize +elod +Elodea +Elodeaceae +Elodes +eloge +elogium +Elohim +Elohimic +Elohism +Elohist +Elohistic +eloign +eloigner +eloignment +Eloise +Elon +elongate +elongated +elongation +elongative +Elonite +elope +elopement +eloper +Elopidae +elops +eloquence +eloquent +eloquential +eloquently +eloquentness +Elotherium +elotillo +elpasolite +elpidite +Elric +els +Elsa +else +elsehow +elsewards +elseways +elsewhen +elsewhere +elsewheres +elsewhither +elsewise +Elsholtzia +elsin +elt +eluate +elucidate +elucidation +elucidative +elucidator +elucidatory +elucubrate +elucubration +elude +eluder +elusion +elusive +elusively +elusiveness +elusoriness +elusory +elute +elution +elutor +elutriate +elutriation +elutriator +eluvial +eluviate +eluviation +eluvium +elvan +elvanite +elvanitic +elver +elves +elvet +Elvira +Elvis +elvish +elvishly +Elwood +elydoric +Elymi +Elymus +Elysee +Elysia +elysia +Elysian +Elysiidae +Elysium +elytral +elytriferous +elytriform +elytrigerous +elytrin +elytrocele +elytroclasia +elytroid +elytron +elytroplastic +elytropolypus +elytroposis +elytrorhagia +elytrorrhagia +elytrorrhaphy +elytrostenosis +elytrotomy +elytrous +elytrum +Elzevir +Elzevirian +Em +em +emaciate +emaciation +emajagua +emanant +emanate +emanation +emanational +emanationism +emanationist +emanatism +emanatist +emanatistic +emanativ +emanative +emanatively +emanator +emanatory +emancipate +emancipation +emancipationist +emancipatist +emancipative +emancipator +emancipatory +emancipatress +emancipist +emandibulate +emanium +emarcid +emarginate +emarginately +emargination +Emarginula +emasculate +emasculation +emasculative +emasculator +emasculatory +Embadomonas +emball +emballonurid +Emballonuridae +emballonurine +embalm +embalmer +embalmment +embank +embankment +embannered +embar +embargo +embargoist +embark +embarkation +embarkment +embarras +embarrass +embarrassed +embarrassedly +embarrassing +embarrassingly +embarrassment +embarrel +embassage +embassy +embastioned +embathe +embatholithic +embattle +embattled +embattlement +embay +embayment +Embden +embed +embedment +embeggar +Embelia +embelic +embellish +embellisher +embellishment +ember +embergoose +Emberiza +emberizidae +Emberizinae +emberizine +embezzle +embezzlement +embezzler +Embiidae +Embiidina +embind +Embiodea +Embioptera +embiotocid +Embiotocidae +embiotocoid +embira +embitter +embitterer +embitterment +emblaze +emblazer +emblazon +emblazoner +emblazonment +emblazonry +emblem +emblema +emblematic +emblematical +emblematically +emblematicalness +emblematicize +emblematist +emblematize +emblematology +emblement +emblemist +emblemize +emblemology +emblic +emblossom +embodier +embodiment +embody +embog +emboitement +embolden +emboldener +embole +embolectomy +embolemia +embolic +emboliform +embolism +embolismic +embolismus +embolite +embolium +embolize +embolo +embololalia +Embolomeri +embolomerism +embolomerous +embolomycotic +embolum +embolus +emboly +emborder +emboscata +embosom +emboss +embossage +embosser +embossing +embossman +embossment +embosture +embottle +embouchure +embound +embow +embowed +embowel +emboweler +embowelment +embower +embowerment +embowment +embox +embrace +embraceable +embraceably +embracement +embraceor +embracer +embracery +embracing +embracingly +embracingness +embracive +embrail +embranchment +embrangle +embranglement +embrasure +embreathe +embreathement +Embrica +embright +embrittle +embrittlement +embroaden +embrocate +embrocation +embroider +embroiderer +embroideress +embroidery +embroil +embroiler +embroilment +embronze +embrown +embryectomy +embryo +embryocardia +embryoctonic +embryoctony +embryoferous +embryogenesis +embryogenetic +embryogenic +embryogeny +embryogony +embryographer +embryographic +embryography +embryoid +embryoism +embryologic +embryological +embryologically +embryologist +embryology +embryoma +embryon +embryonal +embryonary +embryonate +embryonated +embryonic +embryonically +embryoniferous +embryoniform +embryony +embryopathology +embryophagous +embryophore +Embryophyta +embryophyte +embryoplastic +embryoscope +embryoscopic +embryotega +embryotic +embryotome +embryotomy +embryotrophic +embryotrophy +embryous +embryulcia +embryulcus +embubble +embuia +embus +embusk +embuskin +emcee +eme +emeer +emeership +Emeline +emend +emendable +emendandum +emendate +emendation +emendator +emendatory +emender +emerald +emeraldine +emeraude +emerge +emergence +emergency +emergent +emergently +emergentness +Emerita +emerited +emeritus +emerize +emerse +emersed +emersion +Emersonian +Emersonianism +Emery +emery +Emesa +Emesidae +emesis +emetatrophia +emetic +emetically +emetine +emetocathartic +emetology +emetomorphine +emgalla +emication +emiction +emictory +emigrant +emigrate +emigration +emigrational +emigrationist +emigrative +emigrator +emigratory +emigree +Emil +Emilia +Emily +Emim +eminence +eminency +eminent +eminently +emir +emirate +emirship +emissarium +emissary +emissaryship +emissile +emission +emissive +emissivity +emit +emittent +emitter +Emm +Emma +emma +Emmanuel +emmarble +emmarvel +emmenagogic +emmenagogue +emmenic +emmeniopathy +emmenology +emmensite +Emmental +emmer +emmergoose +emmet +emmetrope +emmetropia +emmetropic +emmetropism +emmetropy +Emmett +emodin +emollescence +emolliate +emollient +emoloa +emolument +emolumental +emolumentary +emote +emotion +emotionable +emotional +emotionalism +emotionalist +emotionality +emotionalization +emotionalize +emotionally +emotioned +emotionist +emotionize +emotionless +emotionlessness +emotive +emotively +emotiveness +emotivity +empacket +empaistic +empall +empanel +empanelment +empanoply +empaper +emparadise +emparchment +empark +empasm +empathic +empathically +empathize +empathy +Empedoclean +empeirema +Empeo +emperor +emperorship +empery +Empetraceae +empetraceous +Empetrum +emphases +emphasis +emphasize +emphatic +emphatical +emphatically +emphaticalness +emphlysis +emphractic +emphraxis +emphysema +emphysematous +emphyteusis +emphyteuta +emphyteutic +empicture +Empididae +Empidonax +empiecement +Empire +empire +empirema +empiric +empirical +empiricalness +empiricism +empiricist +empirics +empiriocritcism +empiriocritical +empiriological +empirism +empiristic +emplace +emplacement +emplane +emplastic +emplastration +emplastrum +emplectite +empleomania +employ +employability +employable +employed +employee +employer +employless +employment +emplume +empocket +empodium +empoison +empoisonment +emporetic +emporeutic +emporia +emporial +emporium +empower +empowerment +empress +emprise +emprosthotonic +emprosthotonos +emprosthotonus +empt +emptier +emptily +emptiness +emptings +emptins +emption +emptional +emptor +empty +emptyhearted +emptysis +empurple +Empusa +empyema +empyemic +empyesis +empyocele +empyreal +empyrean +empyreuma +empyreumatic +empyreumatical +empyreumatize +empyromancy +emu +emulable +emulant +emulate +emulation +emulative +emulatively +emulator +emulatory +emulatress +emulgence +emulgent +emulous +emulously +emulousness +emulsibility +emulsible +emulsifiability +emulsifiable +emulsification +emulsifier +emulsify +emulsin +emulsion +emulsionize +emulsive +emulsoid +emulsor +emunctory +emundation +emyd +Emydea +emydian +Emydidae +Emydinae +Emydosauria +emydosaurian +Emys +en +enable +enablement +enabler +enact +enactable +enaction +enactive +enactment +enactor +enactory +enaena +enage +Enajim +enalid +Enaliornis +enaliosaur +Enaliosauria +enaliosaurian +enallachrome +enallage +enaluron +enam +enamber +enambush +enamdar +enamel +enameler +enameling +enamelist +enamelless +enamellist +enameloma +enamelware +enamor +enamorato +enamored +enamoredness +enamorment +enamourment +enanguish +enanthem +enanthema +enanthematous +enanthesis +enantiobiosis +enantioblastic +enantioblastous +enantiomer +enantiomeride +enantiomorph +enantiomorphic +enantiomorphism +enantiomorphous +enantiomorphously +enantiomorphy +enantiopathia +enantiopathic +enantiopathy +enantiosis +enantiotropic +enantiotropy +enantobiosis +enapt +enarbor +enarbour +enarch +enarched +enargite +enarm +enarme +enarthrodia +enarthrodial +enarthrosis +enate +enatic +enation +enbrave +encaenia +encage +encake +encalendar +encallow +encamp +encampment +encanker +encanthis +encapsulate +encapsulation +encapsule +encarditis +encarnadine +encarnalize +encarpium +encarpus +encase +encasement +encash +encashable +encashment +encasserole +encastage +encatarrhaphy +encauma +encaustes +encaustic +encaustically +encave +encefalon +Encelia +encell +encenter +encephala +encephalalgia +Encephalartos +encephalasthenia +encephalic +encephalin +encephalitic +encephalitis +encephalocele +encephalocoele +encephalodialysis +encephalogram +encephalograph +encephalography +encephaloid +encephalolith +encephalology +encephaloma +encephalomalacia +encephalomalacosis +encephalomalaxis +encephalomeningitis +encephalomeningocele +encephalomere +encephalomeric +encephalometer +encephalometric +encephalomyelitis +encephalomyelopathy +encephalon +encephalonarcosis +encephalopathia +encephalopathic +encephalopathy +encephalophyma +encephalopsychesis +encephalopyosis +encephalorrhagia +encephalosclerosis +encephaloscope +encephaloscopy +encephalosepsis +encephalospinal +encephalothlipsis +encephalotome +encephalotomy +encephalous +enchain +enchainment +enchair +enchalice +enchannel +enchant +enchanter +enchanting +enchantingly +enchantingness +enchantment +enchantress +encharge +encharnel +enchase +enchaser +enchasten +Enchelycephali +enchequer +enchest +enchilada +enchiridion +Enchodontid +Enchodontidae +Enchodontoid +Enchodus +enchondroma +enchondromatous +enchondrosis +enchorial +enchurch +enchylema +enchylematous +enchymatous +enchytrae +enchytraeid +Enchytraeidae +Enchytraeus +encina +encinal +encincture +encinder +encinillo +encipher +encircle +encirclement +encircler +encist +encitadel +enclaret +enclasp +enclave +enclavement +enclisis +enclitic +enclitical +enclitically +encloak +encloister +enclose +encloser +enclosure +enclothe +encloud +encoach +encode +encoffin +encoignure +encoil +encolden +encollar +encolor +encolpion +encolumn +encomendero +encomia +encomiast +encomiastic +encomiastical +encomiastically +encomic +encomienda +encomiologic +encomium +encommon +encompass +encompasser +encompassment +encoop +encorbelment +encore +encoronal +encoronate +encoronet +encounter +encounterable +encounterer +encourage +encouragement +encourager +encouraging +encouragingly +encowl +encraal +encradle +encranial +encratic +Encratism +Encratite +encraty +encreel +encrimson +encrinal +encrinic +Encrinidae +encrinidae +encrinital +encrinite +encrinitic +encrinitical +encrinoid +Encrinoidea +Encrinus +encrisp +encroach +encroacher +encroachingly +encroachment +encrotchet +encrown +encrownment +encrust +encrustment +encrypt +encryption +encuirassed +encumber +encumberer +encumberingly +encumberment +encumbrance +encumbrancer +encup +encurl +encurtain +encushion +encyclic +encyclical +encyclopedia +encyclopediac +encyclopediacal +encyclopedial +encyclopedian +encyclopediast +encyclopedic +encyclopedically +encyclopedism +encyclopedist +encyclopedize +encyrtid +Encyrtidae +encyst +encystation +encystment +end +endable +endamage +endamageable +endamagement +endamask +endameba +endamebic +Endamoeba +endamoebiasis +endamoebic +Endamoebidae +endanger +endangerer +endangerment +endangium +endaortic +endaortitis +endarch +endarchy +endarterial +endarteritis +endarterium +endaspidean +endaze +endboard +endbrain +endear +endearance +endeared +endearedly +endearedness +endearing +endearingly +endearingness +endearment +endeavor +endeavorer +ended +endeictic +endellionite +endemial +endemic +endemically +endemicity +endemiological +endemiology +endemism +endenizen +ender +endere +endermatic +endermic +endermically +enderon +enderonic +endevil +endew +endgate +endiadem +endiaper +ending +endite +endive +endless +endlessly +endlessness +endlichite +endlong +endmatcher +endmost +endoabdominal +endoangiitis +endoaortitis +endoappendicitis +endoarteritis +endoauscultation +endobatholithic +endobiotic +endoblast +endoblastic +endobronchial +endobronchially +endobronchitis +endocannibalism +endocardiac +endocardial +endocarditic +endocarditis +endocardium +endocarp +endocarpal +endocarpic +endocarpoid +endocellular +endocentric +Endoceras +Endoceratidae +endoceratite +endoceratitic +endocervical +endocervicitis +endochondral +endochorion +endochorionic +endochrome +endochylous +endoclinal +endocline +endocoelar +endocoele +endocoeliac +endocolitis +endocolpitis +endocondensation +endocone +endoconidium +endocorpuscular +endocortex +endocranial +endocranium +endocrinal +endocrine +endocrinic +endocrinism +endocrinological +endocrinologist +endocrinology +endocrinopathic +endocrinopathy +endocrinotherapy +endocrinous +endocritic +endocycle +endocyclic +endocyemate +endocyst +endocystitis +endoderm +endodermal +endodermic +endodermis +endodontia +endodontic +endodontist +endodynamomorphic +endoenteritis +endoenzyme +endoesophagitis +endofaradism +endogalvanism +endogamic +endogamous +endogamy +endogastric +endogastrically +endogastritis +endogen +Endogenae +endogenesis +endogenetic +endogenic +endogenous +endogenously +endogeny +endoglobular +endognath +endognathal +endognathion +endogonidium +endointoxication +endokaryogamy +endolabyrinthitis +endolaryngeal +endolemma +endolumbar +endolymph +endolymphangial +endolymphatic +endolymphic +endolysin +endomastoiditis +endome +endomesoderm +endometrial +endometritis +endometrium +endometry +endomitosis +endomitotic +endomixis +endomorph +endomorphic +endomorphism +endomorphy +Endomyces +Endomycetaceae +endomysial +endomysium +endoneurial +endoneurium +endonuclear +endonucleolus +endoparasite +endoparasitic +Endoparasitica +endopathic +endopelvic +endopericarditis +endoperidial +endoperidium +endoperitonitis +endophagous +endophagy +endophasia +endophasic +endophlebitis +endophragm +endophragmal +Endophyllaceae +endophyllous +Endophyllum +endophytal +endophyte +endophytic +endophytically +endophytous +endoplasm +endoplasma +endoplasmic +endoplast +endoplastron +endoplastular +endoplastule +endopleura +endopleural +endopleurite +endopleuritic +endopod +endopodite +endopoditic +endoproct +Endoprocta +endoproctous +endopsychic +Endopterygota +endopterygote +endopterygotic +endopterygotism +endopterygotous +endorachis +endoral +endore +endorhinitis +endorsable +endorsation +endorse +endorsed +endorsee +endorsement +endorser +endorsingly +endosalpingitis +endosarc +endosarcode +endosarcous +endosclerite +endoscope +endoscopic +endoscopy +endosecretory +endosepsis +endosiphon +endosiphonal +endosiphonate +endosiphuncle +endoskeletal +endoskeleton +endosmometer +endosmometric +endosmosic +endosmosis +endosmotic +endosmotically +endosome +endosperm +endospermic +endospore +endosporium +endosporous +endoss +endosteal +endosteally +endosteitis +endosteoma +endosternite +endosternum +endosteum +endostitis +endostoma +endostome +endostosis +endostracal +endostracum +endostylar +endostyle +endostylic +endotheca +endothecal +endothecate +endothecial +endothecium +endothelia +endothelial +endothelioblastoma +endotheliocyte +endothelioid +endotheliolysin +endotheliolytic +endothelioma +endotheliomyoma +endotheliomyxoma +endotheliotoxin +endothelium +endothermal +endothermic +endothermous +endothermy +Endothia +endothoracic +endothorax +Endothrix +endothys +endotoxic +endotoxin +endotoxoid +endotracheitis +endotrachelitis +Endotrophi +endotrophic +endotys +endovaccination +endovasculitis +endovenous +endow +endower +endowment +endozoa +endpiece +Endromididae +Endromis +endue +enduement +endungeon +endura +endurability +endurable +endurableness +endurably +endurance +endurant +endure +endurer +enduring +enduringly +enduringness +endways +endwise +endyma +endymal +Endymion +endysis +Eneas +eneclann +enema +enemy +enemylike +enemyship +enepidermic +energeia +energesis +energetic +energetical +energetically +energeticalness +energeticist +energetics +energetistic +energic +energical +energid +energism +energist +energize +energizer +energumen +energumenon +energy +enervate +enervation +enervative +enervator +eneuch +eneugh +enface +enfacement +enfamous +enfasten +enfatico +enfeature +enfeeble +enfeeblement +enfeebler +enfelon +enfeoff +enfeoffment +enfester +enfetter +enfever +enfigure +enfilade +enfilading +enfile +enfiled +enflagellate +enflagellation +enflesh +enfleurage +enflower +enfoil +enfold +enfolden +enfolder +enfoldment +enfonced +enforce +enforceability +enforceable +enforced +enforcedly +enforcement +enforcer +enforcibility +enforcible +enforcingly +enfork +enfoul +enframe +enframement +enfranchisable +enfranchise +enfranchisement +enfranchiser +enfree +enfrenzy +enfuddle +enfurrow +engage +engaged +engagedly +engagedness +engagement +engager +engaging +engagingly +engagingness +engaol +engarb +engarble +engarland +engarment +engarrison +engastrimyth +engastrimythic +engaud +engaze +Engelmannia +engem +engender +engenderer +engenderment +engerminate +enghosted +engild +engine +engineer +engineering +engineership +enginehouse +engineless +enginelike +engineman +enginery +enginous +engird +engirdle +engirt +engjateigur +englacial +englacially +englad +engladden +Englander +Engler +Englerophoenix +Englifier +Englify +English +Englishable +Englisher +Englishhood +Englishism +Englishize +Englishly +Englishman +Englishness +Englishry +Englishwoman +englobe +englobement +engloom +englory +englut +englyn +engnessang +engobe +engold +engolden +engore +engorge +engorgement +engouled +engrace +engraff +engraft +engraftation +engrafter +engraftment +engrail +engrailed +engrailment +engrain +engrained +engrainedly +engrainer +engram +engramma +engrammatic +engrammic +engrandize +engrandizement +engraphia +engraphic +engraphically +engraphy +engrapple +engrasp +Engraulidae +Engraulis +engrave +engraved +engravement +engraver +engraving +engreen +engrieve +engroove +engross +engrossed +engrossedly +engrosser +engrossing +engrossingly +engrossingness +engrossment +enguard +engulf +engulfment +engyscope +engysseismology +Engystomatidae +enhallow +enhalo +enhamper +enhance +enhanced +enhancement +enhancer +enhancive +enharmonic +enharmonical +enharmonically +enhat +enhaunt +enhearse +enheart +enhearten +enhedge +enhelm +enhemospore +enherit +enheritage +enheritance +enhorror +enhunger +enhusk +Enhydra +Enhydrinae +Enhydris +enhydrite +enhydritic +enhydros +enhydrous +enhypostasia +enhypostasis +enhypostatic +enhypostatize +eniac +Enicuridae +Enid +Enif +enigma +enigmatic +enigmatical +enigmatically +enigmaticalness +enigmatist +enigmatization +enigmatize +enigmatographer +enigmatography +enigmatology +enisle +enjail +enjamb +enjambed +enjambment +enjelly +enjeopard +enjeopardy +enjewel +enjoin +enjoinder +enjoiner +enjoinment +enjoy +enjoyable +enjoyableness +enjoyably +enjoyer +enjoying +enjoyingly +enjoyment +enkerchief +enkernel +Enki +Enkidu +enkindle +enkindler +enkraal +enlace +enlacement +enlard +enlarge +enlargeable +enlargeableness +enlarged +enlargedly +enlargedness +enlargement +enlarger +enlarging +enlargingly +enlaurel +enleaf +enleague +enlevement +enlief +enlife +enlight +enlighten +enlightened +enlightenedly +enlightenedness +enlightener +enlightening +enlighteningly +enlightenment +enlink +enlinkment +enlist +enlisted +enlister +enlistment +enliven +enlivener +enlivening +enliveningly +enlivenment +enlock +enlodge +enlodgement +enmarble +enmask +enmass +enmesh +enmeshment +enmist +enmity +enmoss +enmuffle +enneacontahedral +enneacontahedron +ennead +enneadianome +enneadic +enneagon +enneagynous +enneahedral +enneahedria +enneahedron +enneapetalous +enneaphyllous +enneasemic +enneasepalous +enneaspermous +enneastyle +enneastylos +enneasyllabic +enneateric +enneatic +enneatical +ennerve +enniche +ennoble +ennoblement +ennobler +ennobling +ennoblingly +ennoic +ennomic +ennui +Enoch +Enochic +enocyte +enodal +enodally +enoil +enol +enolate +enolic +enolizable +enolization +enolize +enomania +enomaniac +enomotarch +enomoty +enophthalmos +enophthalmus +Enopla +enoplan +enoptromancy +enorganic +enorm +enormity +enormous +enormously +enormousness +Enos +enostosis +enough +enounce +enouncement +enow +enphytotic +enplane +enquicken +enquire +enquirer +enquiry +enrace +enrage +enraged +enragedly +enragement +enrange +enrank +enrapt +enrapture +enrapturer +enravish +enravishingly +enravishment +enray +enregiment +enregister +enregistration +enregistry +enrib +enrich +enricher +enriching +enrichingly +enrichment +enring +enrive +enrobe +enrobement +enrober +enrockment +enrol +enroll +enrolled +enrollee +enroller +enrollment +enrolment +enroot +enrough +enruin +enrut +ens +ensaffron +ensaint +ensample +ensand +ensandal +ensanguine +ensate +enscene +ensconce +enscroll +ensculpture +ense +enseam +enseat +enseem +ensellure +ensemble +ensepulcher +ensepulchre +enseraph +enserf +ensete +enshade +enshadow +enshawl +ensheathe +enshell +enshelter +enshield +enshrine +enshrinement +enshroud +Ensiferi +ensiform +ensign +ensigncy +ensignhood +ensignment +ensignry +ensignship +ensilage +ensilate +ensilation +ensile +ensilist +ensilver +ensisternum +ensky +enslave +enslavedness +enslavement +enslaver +ensmall +ensnare +ensnarement +ensnarer +ensnaring +ensnaringly +ensnarl +ensnow +ensorcelize +ensorcell +ensoul +enspell +ensphere +enspirit +enstamp +enstar +enstate +enstatite +enstatitic +enstatolite +ensteel +enstool +enstore +enstrengthen +ensuable +ensuance +ensuant +ensue +ensuer +ensuingly +ensulphur +ensure +ensurer +enswathe +enswathement +ensweep +entablature +entablatured +entablement +entach +entad +Entada +entail +entailable +entailer +entailment +ental +entame +Entamoeba +entamoebiasis +entamoebic +entangle +entangled +entangledly +entangledness +entanglement +entangler +entangling +entanglingly +entapophysial +entapophysis +entarthrotic +entasia +entasis +entelam +entelechy +entellus +Entelodon +entelodont +entempest +entemple +entente +Ententophil +entepicondylar +enter +enterable +enteraden +enteradenographic +enteradenography +enteradenological +enteradenology +enteral +enteralgia +enterate +enterauxe +enterclose +enterectomy +enterer +entergogenic +enteria +enteric +entericoid +entering +enteritidis +enteritis +entermete +enteroanastomosis +enterobiliary +enterocele +enterocentesis +enterochirurgia +enterochlorophyll +enterocholecystostomy +enterocinesia +enterocinetic +enterocleisis +enteroclisis +enteroclysis +Enterocoela +enterocoele +enterocoelic +enterocoelous +enterocolitis +enterocolostomy +enterocrinin +enterocyst +enterocystoma +enterodynia +enteroepiplocele +enterogastritis +enterogastrone +enterogenous +enterogram +enterograph +enterography +enterohelcosis +enterohemorrhage +enterohepatitis +enterohydrocele +enteroid +enterointestinal +enteroischiocele +enterokinase +enterokinesia +enterokinetic +enterolith +enterolithiasis +Enterolobium +enterology +enteromegalia +enteromegaly +enteromere +enteromesenteric +Enteromorpha +enteromycosis +enteromyiasis +enteron +enteroneuritis +enteroparalysis +enteroparesis +enteropathy +enteropexia +enteropexy +enterophthisis +enteroplasty +enteroplegia +enteropneust +Enteropneusta +enteropneustan +enteroptosis +enteroptotic +enterorrhagia +enterorrhaphy +enterorrhea +enteroscope +enterosepsis +enterospasm +enterostasis +enterostenosis +enterostomy +enterosyphilis +enterotome +enterotomy +enterotoxemia +enterotoxication +enterozoa +enterozoan +enterozoic +enterprise +enterpriseless +enterpriser +enterprising +enterprisingly +enterritoriality +entertain +entertainable +entertainer +entertaining +entertainingly +entertainingness +entertainment +enthalpy +entheal +enthelmintha +enthelminthes +enthelminthic +enthetic +enthral +enthraldom +enthrall +enthralldom +enthraller +enthralling +enthrallingly +enthrallment +enthralment +enthrone +enthronement +enthronization +enthronize +enthuse +enthusiasm +enthusiast +enthusiastic +enthusiastical +enthusiastically +enthusiastly +enthymematic +enthymematical +enthymeme +entia +entice +enticeable +enticeful +enticement +enticer +enticing +enticingly +enticingness +entifical +entification +entify +entincture +entire +entirely +entireness +entirety +entiris +entitative +entitatively +entitle +entitlement +entity +entoblast +entoblastic +entobranchiate +entobronchium +entocalcaneal +entocarotid +entocele +entocnemial +entocoele +entocoelic +entocondylar +entocondyle +entocondyloid +entocone +entoconid +entocornea +entocranial +entocuneiform +entocuniform +entocyemate +entocyst +entoderm +entodermal +entodermic +entogastric +entogenous +entoglossal +entohyal +entoil +entoilment +Entoloma +entomb +entombment +entomere +entomeric +entomic +entomical +entomion +entomogenous +entomoid +entomologic +entomological +entomologically +entomologist +entomologize +entomology +Entomophaga +entomophagan +entomophagous +Entomophila +entomophilous +entomophily +Entomophthora +Entomophthoraceae +entomophthoraceous +Entomophthorales +entomophthorous +entomophytous +Entomosporium +Entomostraca +entomostracan +entomostracous +entomotaxy +entomotomist +entomotomy +entone +entonement +entoolitic +entoparasite +entoparasitic +entoperipheral +entophytal +entophyte +entophytic +entophytically +entophytous +entopic +entopical +entoplasm +entoplastic +entoplastral +entoplastron +entopopliteal +Entoprocta +entoproctous +entopterygoid +entoptic +entoptical +entoptically +entoptics +entoptoscope +entoptoscopic +entoptoscopy +entoretina +entorganism +entosarc +entosclerite +entosphenal +entosphenoid +entosphere +entosternal +entosternite +entosternum +entothorax +entotic +Entotrophi +entotympanic +entourage +entozoa +entozoal +entozoan +entozoarian +entozoic +entozoological +entozoologically +entozoologist +entozoology +entozoon +entracte +entrail +entrails +entrain +entrainer +entrainment +entrammel +entrance +entrancedly +entrancement +entranceway +entrancing +entrancingly +entrant +entrap +entrapment +entrapper +entrappingly +entreasure +entreat +entreating +entreatingly +entreatment +entreaty +entree +entremets +entrench +entrenchment +entrepas +entrepot +entrepreneur +entrepreneurial +entrepreneurship +entresol +entrochite +entrochus +entropion +entropionize +entropium +entropy +entrough +entrust +entrustment +entry +entryman +entryway +enturret +entwine +entwinement +entwist +Entyloma +enucleate +enucleation +enucleator +Enukki +enumerable +enumerate +enumeration +enumerative +enumerator +enunciability +enunciable +enunciate +enunciation +enunciative +enunciatively +enunciator +enunciatory +enure +enuresis +enuretic +enurny +envapor +envapour +envassal +envassalage +envault +enveil +envelop +envelope +enveloper +envelopment +envenom +envenomation +enverdure +envermeil +enviable +enviableness +enviably +envied +envier +envineyard +envious +enviously +enviousness +environ +environage +environal +environic +environment +environmental +environmentalism +environmentalist +environmentally +environs +envisage +envisagement +envision +envolume +envoy +envoyship +envy +envying +envyingly +enwallow +enwiden +enwind +enwisen +enwoman +enwomb +enwood +enworthed +enwound +enwrap +enwrapment +enwreathe +enwrite +enwrought +enzone +enzootic +enzooty +enzym +enzymatic +enzyme +enzymic +enzymically +enzymologist +enzymology +enzymolysis +enzymolytic +enzymosis +enzymotic +eoan +Eoanthropus +Eocarboniferous +Eocene +Eodevonian +Eogaea +Eogaean +Eoghanacht +Eohippus +eolation +eolith +eolithic +Eomecon +eon +eonism +Eopalaeozoic +Eopaleozoic +eophyte +eophytic +eophyton +eorhyolite +eosate +Eosaurus +eoside +eosin +eosinate +eosinic +eosinoblast +eosinophile +eosinophilia +eosinophilic +eosinophilous +eosphorite +Eozoic +eozoon +eozoonal +epacmaic +epacme +epacrid +Epacridaceae +epacridaceous +Epacris +epact +epactal +epagoge +epagogic +epagomenae +epagomenal +epagomenic +epagomenous +epaleaceous +epalpate +epanadiplosis +Epanagoge +epanalepsis +epanaleptic +epanaphora +epanaphoral +epanastrophe +epanisognathism +epanisognathous +epanodos +epanody +Epanorthidae +epanorthosis +epanorthotic +epanthous +epapillate +epappose +eparch +eparchate +Eparchean +eparchial +eparchy +eparcuale +eparterial +epaule +epaulement +epaulet +epauleted +epauletted +epauliere +epaxial +epaxially +epedaphic +epee +epeeist +Epeira +epeiric +epeirid +Epeiridae +epeirogenesis +epeirogenetic +epeirogenic +epeirogeny +epeisodion +epembryonic +epencephal +epencephalic +epencephalon +ependyma +ependymal +ependyme +ependymitis +ependymoma +ependytes +epenthesis +epenthesize +epenthetic +epephragmal +epepophysial +epepophysis +epergne +eperotesis +Eperua +epexegesis +epexegetic +epexegetical +epexegetically +epha +ephah +epharmonic +epharmony +ephebe +ephebeion +ephebeum +ephebic +ephebos +ephebus +ephectic +Ephedra +Ephedraceae +ephedrine +ephelcystic +ephelis +Ephemera +ephemera +ephemerae +ephemeral +ephemerality +ephemerally +ephemeralness +ephemeran +ephemerid +Ephemerida +Ephemeridae +ephemerides +ephemeris +ephemerist +ephemeromorph +ephemeromorphic +ephemeron +Ephemeroptera +ephemerous +Ephesian +Ephesine +ephetae +ephete +ephetic +ephialtes +ephidrosis +ephippial +ephippium +ephod +ephor +ephoral +ephoralty +ephorate +ephoric +ephorship +ephorus +ephphatha +Ephraim +Ephraimite +Ephraimitic +Ephraimitish +Ephraitic +Ephrathite +Ephthalite +Ephthianura +ephthianure +Ephydra +ephydriad +ephydrid +Ephydridae +ephymnium +ephyra +ephyrula +epibasal +Epibaterium +epibatholithic +epibenthic +epibenthos +epiblast +epiblastema +epiblastic +epiblema +epibole +epibolic +epibolism +epiboly +epiboulangerite +epibranchial +epic +epical +epically +epicalyx +epicanthic +epicanthus +epicardia +epicardiac +epicardial +epicardium +epicarid +epicaridan +Epicaridea +Epicarides +epicarp +Epicauta +epicede +epicedial +epicedian +epicedium +epicele +epicene +epicenism +epicenity +epicenter +epicentral +epicentrum +Epiceratodus +epicerebral +epicheirema +epichil +epichile +epichilium +epichindrotic +epichirema +epichondrosis +epichordal +epichorial +epichoric +epichorion +epichoristic +Epichristian +epicism +epicist +epiclastic +epicleidian +epicleidium +epiclesis +epiclidal +epiclinal +epicly +epicnemial +Epicoela +epicoelar +epicoele +epicoelia +epicoeliac +epicoelian +epicoeloma +epicoelous +epicolic +epicondylar +epicondyle +epicondylian +epicondylic +epicontinental +epicoracohumeral +epicoracoid +epicoracoidal +epicormic +epicorolline +epicortical +epicostal +epicotyl +epicotyleal +epicotyledonary +epicranial +epicranium +epicranius +Epicrates +epicrisis +epicritic +epicrystalline +Epictetian +epicure +Epicurean +Epicureanism +epicurish +epicurishly +Epicurism +Epicurize +epicycle +epicyclic +epicyclical +epicycloid +epicycloidal +epicyemate +epicyesis +epicystotomy +epicyte +epideictic +epideictical +epideistic +epidemic +epidemical +epidemically +epidemicalness +epidemicity +epidemiographist +epidemiography +epidemiological +epidemiologist +epidemiology +epidemy +epidendral +epidendric +Epidendron +Epidendrum +epiderm +epiderma +epidermal +epidermatic +epidermatoid +epidermatous +epidermic +epidermical +epidermically +epidermidalization +epidermis +epidermization +epidermoid +epidermoidal +epidermolysis +epidermomycosis +Epidermophyton +epidermophytosis +epidermose +epidermous +epidesmine +epidialogue +epidiascope +epidiascopic +epidictic +epidictical +epididymal +epididymectomy +epididymis +epididymite +epididymitis +epididymodeferentectomy +epididymodeferential +epididymovasostomy +epidiorite +epidiorthosis +epidosite +epidote +epidotic +epidotiferous +epidotization +epidural +epidymides +epifascial +epifocal +epifolliculitis +Epigaea +epigamic +epigaster +epigastraeum +epigastral +epigastrial +epigastric +epigastrical +epigastriocele +epigastrium +epigastrocele +epigeal +epigean +epigeic +epigene +epigenesis +epigenesist +epigenetic +epigenetically +epigenic +epigenist +epigenous +epigeous +epiglottal +epiglottic +epiglottidean +epiglottiditis +epiglottis +epiglottitis +epignathous +epigonal +epigonation +epigone +Epigoni +epigonic +Epigonichthyidae +Epigonichthys +epigonium +epigonos +epigonous +Epigonus +epigram +epigrammatic +epigrammatical +epigrammatically +epigrammatism +epigrammatist +epigrammatize +epigrammatizer +epigraph +epigrapher +epigraphic +epigraphical +epigraphically +epigraphist +epigraphy +epiguanine +epigyne +epigynous +epigynum +epigyny +Epihippus +epihyal +epihydric +epihydrinic +epikeia +epiklesis +Epikouros +epilabrum +Epilachna +Epilachnides +epilamellar +epilaryngeal +epilate +epilation +epilatory +epilegomenon +epilemma +epilemmal +epilepsy +epileptic +epileptically +epileptiform +epileptogenic +epileptogenous +epileptoid +epileptologist +epileptology +epilimnion +epilobe +Epilobiaceae +Epilobium +epilogation +epilogic +epilogical +epilogist +epilogistic +epilogize +epilogue +Epimachinae +epimacus +epimandibular +epimanikia +Epimedium +Epimenidean +epimer +epimeral +epimere +epimeric +epimeride +epimerite +epimeritic +epimeron +epimerum +epimorphic +epimorphosis +epimysium +epimyth +epinaos +epinastic +epinastically +epinasty +epineolithic +Epinephelidae +Epinephelus +epinephrine +epinette +epineural +epineurial +epineurium +epinglette +epinicial +epinician +epinicion +epinine +epiopticon +epiotic +Epipactis +epipaleolithic +epiparasite +epiparodos +epipastic +epiperipheral +epipetalous +epiphanous +Epiphany +epipharyngeal +epipharynx +Epiphegus +epiphenomenal +epiphenomenalism +epiphenomenalist +epiphenomenon +epiphloedal +epiphloedic +epiphloeum +epiphonema +epiphora +epiphragm +epiphylline +epiphyllous +Epiphyllum +epiphysary +epiphyseal +epiphyseolysis +epiphysial +epiphysis +epiphysitis +epiphytal +epiphyte +epiphytic +epiphytical +epiphytically +epiphytism +epiphytology +epiphytotic +epiphytous +epipial +epiplankton +epiplanktonic +epiplasm +epiplasmic +epiplastral +epiplastron +epiplectic +epipleura +epipleural +epiplexis +epiploce +epiplocele +epiploic +epiploitis +epiploon +epiplopexy +epipodial +epipodiale +epipodite +epipoditic +epipodium +epipolic +epipolism +epipolize +epiprecoracoid +Epipsychidion +epipteric +epipterous +epipterygoid +epipubic +epipubis +epirhizous +epirogenic +epirogeny +Epirote +Epirotic +epirotulian +epirrhema +epirrhematic +epirrheme +episarcine +episcenium +episclera +episcleral +episcleritis +episcopable +episcopacy +Episcopal +episcopal +episcopalian +Episcopalianism +Episcopalianize +episcopalism +episcopality +Episcopally +episcopally +episcopate +episcopature +episcope +episcopicide +episcopization +episcopize +episcopolatry +episcotister +episematic +episepalous +episiocele +episiohematoma +episioplasty +episiorrhagia +episiorrhaphy +episiostenosis +episiotomy +episkeletal +episkotister +episodal +episode +episodial +episodic +episodical +episodically +epispadiac +epispadias +epispastic +episperm +epispermic +epispinal +episplenitis +episporangium +epispore +episporium +epistapedial +epistasis +epistatic +epistaxis +epistemic +epistemolog +epistemological +epistemologically +epistemologist +epistemology +epistemonic +epistemonical +epistemophilia +epistemophiliac +epistemophilic +episternal +episternalia +episternite +episternum +epistilbite +epistlar +epistle +epistler +epistolarian +epistolarily +epistolary +epistolatory +epistoler +epistolet +epistolic +epistolical +epistolist +epistolizable +epistolization +epistolize +epistolizer +epistolographer +epistolographic +epistolographist +epistolography +epistoma +epistomal +epistome +epistomian +epistroma +epistrophe +epistropheal +epistropheus +epistrophic +epistrophy +epistylar +epistyle +Epistylis +episyllogism +episynaloephe +episynthetic +episyntheton +epitactic +epitaph +epitapher +epitaphial +epitaphian +epitaphic +epitaphical +epitaphist +epitaphize +epitaphless +epitasis +epitela +epitendineum +epitenon +epithalamia +epithalamial +epithalamiast +epithalamic +epithalamion +epithalamium +epithalamize +epithalamus +epithalamy +epithalline +epitheca +epithecal +epithecate +epithecium +epithelia +epithelial +epithelioblastoma +epithelioceptor +epitheliogenetic +epithelioglandular +epithelioid +epitheliolysin +epitheliolysis +epitheliolytic +epithelioma +epitheliomatous +epitheliomuscular +epitheliosis +epitheliotoxin +epithelium +epithelization +epithelize +epitheloid +epithem +epithesis +epithet +epithetic +epithetical +epithetically +epithetician +epithetize +epitheton +epithumetic +epithyme +epithymetic +epithymetical +epitimesis +epitoke +epitomator +epitomatory +epitome +epitomic +epitomical +epitomically +epitomist +epitomization +epitomize +epitomizer +epitonic +Epitoniidae +epitonion +Epitonium +epitoxoid +epitrachelion +epitrichial +epitrichium +epitrite +epitritic +epitrochlea +epitrochlear +epitrochoid +epitrochoidal +epitrope +epitrophic +epitrophy +epituberculosis +epituberculous +epitympanic +epitympanum +epityphlitis +epityphlon +epiural +epivalve +epixylous +epizeuxis +Epizoa +epizoa +epizoal +epizoan +epizoarian +epizoic +epizoicide +epizoon +epizootic +epizootiology +epoch +epocha +epochal +epochally +epochism +epochist +epode +epodic +epollicate +Epomophorus +eponychium +eponym +eponymic +eponymism +eponymist +eponymize +eponymous +eponymus +eponymy +epoophoron +epopee +epopoean +epopoeia +epopoeist +epopt +epoptes +epoptic +epoptist +epornitic +epornitically +epos +Eppie +Eppy +Eproboscidea +epruinose +epsilon +Epsom +epsomite +Eptatretidae +Eptatretus +epulary +epulation +epulis +epulo +epuloid +epulosis +epulotic +epupillate +epural +epurate +epuration +epyllion +equability +equable +equableness +equably +equaeval +equal +equalable +equaling +equalist +equalitarian +equalitarianism +equality +equalization +equalize +equalizer +equalizing +equalling +equally +equalness +equangular +equanimity +equanimous +equanimously +equanimousness +equant +equatable +equate +equation +equational +equationally +equationism +equationist +equator +equatorial +equatorially +equatorward +equatorwards +equerry +equerryship +equestrial +equestrian +equestrianism +equestrianize +equestrianship +equestrienne +equianchorate +equiangle +equiangular +equiangularity +equianharmonic +equiarticulate +equiatomic +equiaxed +equiaxial +equibalance +equibiradiate +equicellular +equichangeable +equicohesive +equiconvex +equicostate +equicrural +equicurve +equid +equidense +equidensity +equidiagonal +equidifferent +equidimensional +equidistance +equidistant +equidistantial +equidistantly +equidistribution +equidiurnal +equidivision +equidominant +equidurable +equielliptical +equiexcellency +equiform +equiformal +equiformity +equiglacial +equigranular +equijacent +equilateral +equilaterally +equilibrant +equilibrate +equilibration +equilibrative +equilibrator +equilibratory +equilibria +equilibrial +equilibriate +equilibrio +equilibrious +equilibrist +equilibristat +equilibristic +equilibrity +equilibrium +equilibrize +equilobate +equilobed +equilocation +equilucent +equimodal +equimolar +equimolecular +equimomental +equimultiple +equinate +equine +equinecessary +equinely +equinia +equinity +equinoctial +equinoctially +equinovarus +equinox +equinumerally +equinus +equiomnipotent +equip +equipaga +equipage +equiparant +equiparate +equiparation +equipartile +equipartisan +equipartition +equiped +equipedal +equiperiodic +equipluve +equipment +equipoise +equipollence +equipollency +equipollent +equipollently +equipollentness +equiponderance +equiponderancy +equiponderant +equiponderate +equiponderation +equipostile +equipotent +equipotential +equipotentiality +equipper +equiprobabilism +equiprobabilist +equiprobability +equiproducing +equiproportional +equiproportionality +equiradial +equiradiate +equiradical +equirotal +equisegmented +Equisetaceae +equisetaceous +Equisetales +equisetic +Equisetum +equisided +equisignal +equisized +equison +equisonance +equisonant +equispaced +equispatial +equisufficiency +equisurface +equitable +equitableness +equitably +equitangential +equitant +equitation +equitative +equitemporal +equitemporaneous +equites +equitist +equitriangular +equity +equivalence +equivalenced +equivalency +equivalent +equivalently +equivaliant +equivalue +equivaluer +equivalve +equivalved +equivalvular +equivelocity +equivocacy +equivocal +equivocality +equivocally +equivocalness +equivocate +equivocatingly +equivocation +equivocator +equivocatory +equivoluminal +equivoque +equivorous +equivote +equoid +equoidean +equuleus +Equus +er +era +erade +eradiate +eradiation +eradicable +eradicant +eradicate +eradication +eradicative +eradicator +eradicatory +eradiculose +Eragrostis +eral +eranist +Eranthemum +Eranthis +erasable +erase +erased +erasement +eraser +erasion +Erasmian +Erasmus +Erastian +Erastianism +Erastianize +Erastus +erasure +Erava +erbia +erbium +erd +erdvark +ere +Erechtheum +Erechtheus +Erechtites +erect +erectable +erecter +erectile +erectility +erecting +erection +erective +erectly +erectness +erectopatent +erector +erelong +eremacausis +Eremian +eremic +eremital +eremite +eremiteship +eremitic +eremitical +eremitish +eremitism +Eremochaeta +eremochaetous +eremology +eremophyte +Eremopteris +Eremurus +erenach +erenow +erepsin +erept +ereptase +ereptic +ereption +erethic +erethisia +erethism +erethismic +erethistic +erethitic +Erethizon +Erethizontidae +Eretrian +erewhile +erewhiles +erg +ergal +ergamine +Ergane +ergasia +ergasterion +ergastic +ergastoplasm +ergastoplasmic +ergastulum +ergatandromorph +ergatandromorphic +ergatandrous +ergatandry +ergates +ergatocracy +ergatocrat +ergatogyne +ergatogynous +ergatogyny +ergatoid +ergatomorph +ergatomorphic +ergatomorphism +ergmeter +ergodic +ergogram +ergograph +ergographic +ergoism +ergology +ergomaniac +ergometer +ergometric +ergometrine +ergon +ergonovine +ergophile +ergophobia +ergophobiac +ergoplasm +ergostat +ergosterin +ergosterol +ergot +ergotamine +ergotaminine +ergoted +ergothioneine +ergotic +ergotin +ergotinine +ergotism +ergotist +ergotization +ergotize +ergotoxin +ergotoxine +ergusia +eria +Erian +Erianthus +Eric +eric +Erica +Ericaceae +ericaceous +ericad +erical +Ericales +ericetal +ericeticolous +ericetum +erichthus +erichtoid +ericineous +ericius +Erick +ericoid +ericolin +ericophyte +Eridanid +Erie +Erigenia +Erigeron +erigible +Eriglossa +eriglossate +Erik +erika +erikite +Erinaceidae +erinaceous +Erinaceus +erineum +erinite +Erinize +erinose +Eriobotrya +Eriocaulaceae +eriocaulaceous +Eriocaulon +Eriocomi +Eriodendron +Eriodictyon +erioglaucine +Eriogonum +eriometer +erionite +Eriophorum +Eriophyes +Eriophyidae +eriophyllous +Eriosoma +Eriphyle +Eristalis +eristic +eristical +eristically +Erithacus +Eritrean +erizo +erlking +Erma +Ermanaric +Ermani +Ermanrich +ermelin +ermine +ermined +erminee +ermines +erminites +erminois +erne +Ernest +Ernestine +Ernie +Ernst +erode +eroded +erodent +erodible +Erodium +erogeneity +erogenesis +erogenetic +erogenic +erogenous +erogeny +Eros +eros +erose +erosely +erosible +erosion +erosional +erosionist +erosive +erostrate +eroteme +erotesis +erotetic +erotic +erotica +erotical +erotically +eroticism +eroticize +eroticomania +erotism +erotogenesis +erotogenetic +erotogenic +erotogenicity +erotomania +erotomaniac +erotopath +erotopathic +erotopathy +Erotylidae +Erpetoichthys +erpetologist +err +errability +errable +errableness +errabund +errancy +errand +errant +Errantia +errantly +errantness +errantry +errata +erratic +erratical +erratically +erraticalness +erraticism +erraticness +erratum +errhine +erring +erringly +errite +erroneous +erroneously +erroneousness +error +errorful +errorist +errorless +ers +Ersar +ersatz +Erse +Ertebolle +erth +erthen +erthling +erthly +erubescence +erubescent +erubescite +eruc +Eruca +eruca +erucic +eruciform +erucin +erucivorous +eruct +eructance +eructation +eructative +eruction +erudit +erudite +eruditely +eruditeness +eruditical +erudition +eruditional +eruditionist +erugate +erugation +erugatory +erumpent +erupt +eruption +eruptional +eruptive +eruptively +eruptiveness +eruptivity +ervenholder +Ervipiame +Ervum +Erwin +Erwinia +eryhtrism +Erymanthian +Eryngium +eryngo +Eryon +Eryops +Erysibe +Erysimum +erysipelas +erysipelatoid +erysipelatous +erysipeloid +Erysipelothrix +erysipelous +Erysiphaceae +Erysiphe +Erythea +erythema +erythematic +erythematous +erythemic +Erythraea +Erythraean +Erythraeidae +erythrasma +erythrean +erythremia +erythremomelalgia +erythrene +erythrin +Erythrina +erythrine +Erythrinidae +Erythrinus +erythrismal +erythristic +erythrite +erythritic +erythritol +erythroblast +erythroblastic +erythroblastosis +erythrocarpous +erythrocatalysis +Erythrochaete +erythrochroic +erythrochroism +erythroclasis +erythroclastic +erythrocyte +erythrocytic +erythrocytoblast +erythrocytolysin +erythrocytolysis +erythrocytolytic +erythrocytometer +erythrocytorrhexis +erythrocytoschisis +erythrocytosis +erythrodegenerative +erythrodermia +erythrodextrin +erythrogenesis +erythrogenic +erythroglucin +erythrogonium +erythroid +erythrol +erythrolein +erythrolitmin +erythrolysin +erythrolysis +erythrolytic +erythromelalgia +erythron +erythroneocytosis +Erythronium +erythronium +erythropenia +erythrophage +erythrophagous +erythrophilous +erythrophleine +erythrophobia +erythrophore +erythrophyll +erythrophyllin +erythropia +erythroplastid +erythropoiesis +erythropoietic +erythropsia +erythropsin +erythrorrhexis +erythroscope +erythrose +erythrosiderite +erythrosin +erythrosinophile +erythrosis +Erythroxylaceae +erythroxylaceous +erythroxyline +Erythroxylon +Erythroxylum +erythrozincite +erythrozyme +erythrulose +Eryx +es +esca +escadrille +escalade +escalader +escalado +escalan +escalate +Escalator +escalator +escalin +Escallonia +Escalloniaceae +escalloniaceous +escalop +escaloped +escambio +escambron +escapable +escapade +escapage +escape +escapee +escapeful +escapeless +escapement +escaper +escapingly +escapism +escapist +escarbuncle +escargatoire +escarole +escarp +escarpment +eschalot +eschar +eschara +escharine +escharoid +escharotic +eschatocol +eschatological +eschatologist +eschatology +escheat +escheatable +escheatage +escheatment +escheator +escheatorship +Escherichia +eschew +eschewal +eschewance +eschewer +Eschscholtzia +eschynite +esclavage +escoba +escobadura +escobilla +escobita +escolar +esconson +escopette +Escorial +escort +escortage +escortee +escortment +escribe +escritoire +escritorial +escrol +escropulo +escrow +escruage +escudo +Esculapian +esculent +esculetin +esculin +escutcheon +escutcheoned +escutellate +esdragol +Esdras +Esebrias +esemplastic +esemplasy +eseptate +esere +eserine +esexual +eshin +esiphonal +esker +Eskimauan +Eskimo +Eskimoic +Eskimoid +Eskimoized +Eskualdun +Eskuara +Esmeralda +Esmeraldan +esmeraldite +esne +esoanhydride +esocataphoria +Esocidae +esociform +esocyclic +esodic +esoenteritis +esoethmoiditis +esogastritis +esonarthex +esoneural +esophagal +esophagalgia +esophageal +esophagean +esophagectasia +esophagectomy +esophagi +esophagism +esophagismus +esophagitis +esophago +esophagocele +esophagodynia +esophagogastroscopy +esophagogastrostomy +esophagomalacia +esophagometer +esophagomycosis +esophagopathy +esophagoplasty +esophagoplegia +esophagoplication +esophagoptosis +esophagorrhagia +esophagoscope +esophagoscopy +esophagospasm +esophagostenosis +esophagostomy +esophagotome +esophagotomy +esophagus +esophoria +esophoric +Esopus +esoteric +esoterica +esoterical +esoterically +esotericism +esotericist +esoterics +esoterism +esoterist +esoterize +esotery +esothyropexy +esotrope +esotropia +esotropic +Esox +espacement +espadon +espalier +espantoon +esparcet +esparsette +esparto +espathate +espave +especial +especially +especialness +esperance +Esperantic +Esperantidist +Esperantido +Esperantism +Esperantist +Esperanto +espial +espichellite +espier +espinal +espingole +espinillo +espino +espionage +esplanade +esplees +esponton +espousal +espouse +espousement +espouser +Espriella +espringal +espundia +espy +esquamate +esquamulose +Esquiline +esquire +esquirearchy +esquiredom +esquireship +ess +essang +essay +essayer +essayette +essayical +essayish +essayism +essayist +essayistic +essayistical +essaylet +essed +Essedones +Esselen +Esselenian +essence +essency +Essene +Essenian +Essenianism +Essenic +Essenical +Essenis +Essenism +Essenize +essentia +essential +essentialism +essentialist +essentiality +essentialize +essentially +essentialness +essenwood +Essex +essexite +Essie +essling +essoin +essoinee +essoiner +essoinment +essonite +essorant +establish +establishable +established +establisher +establishment +establishmentarian +establishmentarianism +establishmentism +estacade +estadal +estadio +estado +estafette +estafetted +estamene +estamp +estampage +estampede +estampedero +estate +estatesman +esteem +esteemable +esteemer +Estella +ester +esterase +esterellite +esteriferous +esterification +esterify +esterization +esterize +esterlin +esterling +estevin +Esth +Esthacyte +esthematology +Esther +Estheria +estherian +Estheriidae +esthesia +esthesio +esthesioblast +esthesiogen +esthesiogenic +esthesiogeny +esthesiography +esthesiology +esthesiometer +esthesiometric +esthesiometry +esthesioneurosis +esthesiophysiology +esthesis +esthetology +esthetophore +esthiomene +estimable +estimableness +estimably +estimate +estimatingly +estimation +estimative +estimator +estipulate +estivage +estival +estivate +estivation +estivator +estmark +estoc +estoile +Estonian +estop +estoppage +estoppel +Estotiland +estovers +estrade +estradiol +estradiot +estragole +estrange +estrangedness +estrangement +estranger +estrapade +estray +estre +estreat +estrepe +estrepement +estriate +estriche +estrin +estriol +estrogen +estrogenic +estrone +estrous +estrual +estruate +estruation +estuarial +estuarine +estuary +estufa +estuous +estus +esugarization +esurience +esurient +esuriently +eta +etaballi +etacism +etacist +etalon +Etamin +etamine +etch +Etchareottine +etcher +Etchimin +etching +Eteoclus +Eteocretes +Eteocreton +eternal +eternalism +eternalist +eternalization +eternalize +eternally +eternalness +eternity +eternization +eternize +etesian +ethal +ethaldehyde +Ethan +ethanal +ethanamide +ethane +ethanedial +ethanediol +ethanedithiol +ethanethial +ethanethiol +Ethanim +ethanol +ethanolamine +ethanolysis +ethanoyl +Ethel +ethel +ethene +Etheneldeli +ethenic +ethenoid +ethenoidal +ethenol +ethenyl +Etheostoma +Etheostomidae +Etheostominae +etheostomoid +ether +etherate +ethereal +etherealism +ethereality +etherealization +etherealize +ethereally +etherealness +etherean +ethered +ethereous +Etheria +etheric +etherification +etheriform +etherify +Etheriidae +etherin +etherion +etherism +etherization +etherize +etherizer +etherolate +etherous +ethic +ethical +ethicalism +ethicality +ethically +ethicalness +ethician +ethicism +ethicist +ethicize +ethicoaesthetic +ethicophysical +ethicopolitical +ethicoreligious +ethicosocial +ethics +ethid +ethide +ethidene +ethine +ethiodide +ethionic +Ethiop +Ethiopia +Ethiopian +Ethiopic +ethiops +ethmofrontal +ethmoid +ethmoidal +ethmoiditis +ethmolachrymal +ethmolith +ethmomaxillary +ethmonasal +ethmopalatal +ethmopalatine +ethmophysal +ethmopresphenoidal +ethmosphenoid +ethmosphenoidal +ethmoturbinal +ethmoturbinate +ethmovomer +ethmovomerine +ethmyphitis +ethnal +ethnarch +ethnarchy +ethnic +ethnical +ethnically +ethnicism +ethnicist +ethnicize +ethnicon +ethnize +ethnobiological +ethnobiology +ethnobotanic +ethnobotanical +ethnobotanist +ethnobotany +ethnocentric +ethnocentrism +ethnocracy +ethnodicy +ethnoflora +ethnogenic +ethnogeny +ethnogeographer +ethnogeographic +ethnogeographical +ethnogeographically +ethnogeography +ethnographer +ethnographic +ethnographical +ethnographically +ethnographist +ethnography +ethnologer +ethnologic +ethnological +ethnologically +ethnologist +ethnology +ethnomaniac +ethnopsychic +ethnopsychological +ethnopsychology +ethnos +ethnotechnics +ethnotechnography +ethnozoological +ethnozoology +ethography +etholide +ethologic +ethological +ethology +ethonomic +ethonomics +ethopoeia +ethos +ethoxide +ethoxycaffeine +ethoxyl +ethrog +ethyl +ethylamide +ethylamine +ethylate +ethylation +ethylene +ethylenediamine +ethylenic +ethylenimine +ethylenoid +ethylhydrocupreine +ethylic +ethylidene +ethylidyne +ethylin +ethylmorphine +ethylsulphuric +ethyne +ethynyl +etiogenic +etiolate +etiolation +etiolin +etiolize +etiological +etiologically +etiologist +etiologue +etiology +etiophyllin +etioporphyrin +etiotropic +etiotropically +etiquette +etiquettical +etna +Etnean +Etonian +Etrurian +Etruscan +Etruscologist +Etruscology +Etta +Ettarre +ettle +etua +etude +etui +etym +etymic +etymography +etymologer +etymologic +etymological +etymologically +etymologicon +etymologist +etymologization +etymologize +etymology +etymon +etymonic +etypic +etypical +etypically +eu +Euahlayi +euangiotic +Euascomycetes +euaster +Eubacteriales +eubacterium +Eubasidii +Euboean +Euboic +Eubranchipus +eucaine +eucairite +eucalypt +eucalypteol +eucalyptian +eucalyptic +eucalyptography +eucalyptol +eucalyptole +Eucalyptus +eucalyptus +Eucarida +eucatropine +eucephalous +Eucharis +Eucharist +eucharistial +eucharistic +eucharistical +Eucharistically +eucharistically +eucharistize +Eucharitidae +Euchite +Euchlaena +euchlorhydria +euchloric +euchlorine +Euchlorophyceae +euchological +euchologion +euchology +Euchorda +euchre +euchred +euchroic +euchroite +euchromatic +euchromatin +euchrome +euchromosome +euchrone +Eucirripedia +euclase +Euclea +Eucleidae +Euclid +Euclidean +Euclideanism +Eucnemidae +eucolite +Eucommia +Eucommiaceae +eucone +euconic +Euconjugatae +Eucopepoda +Eucosia +eucosmid +Eucosmidae +eucrasia +eucrasite +eucrasy +eucrite +Eucryphia +Eucryphiaceae +eucryphiaceous +eucryptite +eucrystalline +euctical +eucyclic +eudaemon +eudaemonia +eudaemonic +eudaemonical +eudaemonics +eudaemonism +eudaemonist +eudaemonistic +eudaemonistical +eudaemonistically +eudaemonize +eudaemony +eudaimonia +eudaimonism +eudaimonist +Eudemian +Eudendrium +Eudeve +eudiagnostic +eudialyte +eudiaphoresis +eudidymite +eudiometer +eudiometric +eudiometrical +eudiometrically +eudiometry +eudipleural +Eudist +Eudora +Eudorina +Eudoxian +Eudromias +Eudyptes +Euergetes +euge +Eugene +eugenesic +eugenesis +eugenetic +Eugenia +eugenic +eugenical +eugenically +eugenicist +eugenics +Eugenie +eugenism +eugenist +eugenol +eugenolate +eugeny +Euglandina +Euglena +Euglenaceae +Euglenales +Euglenida +Euglenidae +Euglenineae +euglenoid +Euglenoidina +euglobulin +eugranitic +Eugregarinida +Eugubine +Eugubium +euharmonic +euhedral +euhemerism +euhemerist +euhemeristic +euhemeristically +euhemerize +euhyostylic +euhyostyly +euktolite +eulachon +Eulalia +eulalia +eulamellibranch +Eulamellibranchia +Eulamellibranchiata +Eulima +Eulimidae +eulogia +eulogic +eulogical +eulogically +eulogious +eulogism +eulogist +eulogistic +eulogistical +eulogistically +eulogium +eulogization +eulogize +eulogizer +eulogy +eulysite +eulytine +eulytite +Eumenes +eumenid +Eumenidae +Eumenidean +Eumenides +eumenorrhea +eumerism +eumeristic +eumerogenesis +eumerogenetic +eumeromorph +eumeromorphic +eumitosis +eumitotic +eumoiriety +eumoirous +Eumolpides +Eumolpus +eumorphous +eumycete +Eumycetes +eumycetic +Eunectes +Eunice +eunicid +Eunicidae +Eunomia +Eunomian +Eunomianism +eunomy +eunuch +eunuchal +eunuchism +eunuchize +eunuchoid +eunuchoidism +eunuchry +euomphalid +Euomphalus +euonym +euonymin +euonymous +Euonymus +euonymy +Euornithes +euornithic +Euorthoptera +euosmite +euouae +eupad +Eupanorthidae +Eupanorthus +eupathy +eupatoriaceous +eupatorin +Eupatorium +eupatory +eupatrid +eupatridae +eupepsia +eupepsy +eupeptic +eupepticism +eupepticity +Euphausia +Euphausiacea +euphausiid +Euphausiidae +Euphemia +euphemian +euphemious +euphemiously +euphemism +euphemist +euphemistic +euphemistical +euphemistically +euphemize +euphemizer +euphemous +euphemy +euphon +euphone +euphonetic +euphonetics +euphonia +euphonic +euphonical +euphonically +euphonicalness +euphonious +euphoniously +euphoniousness +euphonism +euphonium +euphonize +euphonon +euphonous +euphony +euphonym +Euphorbia +Euphorbiaceae +euphorbiaceous +euphorbium +euphoria +euphoric +euphory +Euphrasia +euphrasy +Euphratean +euphroe +Euphrosyne +Euphues +euphuism +euphuist +euphuistic +euphuistical +euphuistically +euphuize +Euphyllopoda +eupione +eupittonic +euplastic +Euplectella +Euplexoptera +Euplocomi +Euploeinae +euploid +euploidy +eupnea +Eupolidean +Eupolyzoa +eupolyzoan +Eupomatia +Eupomatiaceae +eupractic +eupraxia +Euprepia +Euproctis +eupsychics +Euptelea +Eupterotidae +eupyrchroite +eupyrene +eupyrion +Eurafric +Eurafrican +Euraquilo +Eurasian +Eurasianism +Eurasiatic +eureka +eurhodine +eurhodol +Eurindic +Euripidean +euripus +eurite +Euroaquilo +eurobin +Euroclydon +Europa +Europasian +European +Europeanism +Europeanization +Europeanize +Europeanly +Europeward +europium +Europocentric +Eurus +Euryalae +Euryale +Euryaleae +euryalean +Euryalida +euryalidan +Euryalus +eurybathic +eurybenthic +eurycephalic +eurycephalous +Eurycerotidae +Euryclea +Eurydice +Eurygaea +Eurygaean +eurygnathic +eurygnathism +eurygnathous +euryhaline +Eurylaimi +Eurylaimidae +eurylaimoid +Eurylaimus +Eurymus +euryon +Eurypelma +Eurypharyngidae +Eurypharynx +euryprognathous +euryprosopic +eurypterid +Eurypterida +eurypteroid +Eurypteroidea +Eurypterus +Eurypyga +Eurypygae +Eurypygidae +eurypylous +euryscope +Eurystheus +eurystomatous +eurythermal +eurythermic +eurythmic +eurythmical +eurythmics +eurythmy +eurytomid +Eurytomidae +Eurytus +euryzygous +Euscaro +Eusebian +Euselachii +Euskaldun +Euskara +Euskarian +Euskaric +Euskera +eusol +Euspongia +eusporangiate +Eustace +Eustachian +eustachium +Eustathian +eustatic +Eusthenopteron +eustomatous +eustyle +Eusuchia +eusuchian +eusynchite +Eutaenia +eutannin +eutaxic +eutaxite +eutaxitic +eutaxy +eutechnic +eutechnics +eutectic +eutectoid +Euterpe +Euterpean +eutexia +Euthamia +euthanasia +euthanasy +euthenics +euthenist +Eutheria +eutherian +euthermic +Euthycomi +euthycomic +Euthyneura +euthyneural +euthyneurous +euthytatic +euthytropic +eutomous +eutony +Eutopia +Eutopian +eutrophic +eutrophy +eutropic +eutropous +Eutychian +Eutychianism +euxanthate +euxanthic +euxanthone +euxenite +Euxine +Eva +evacuant +evacuate +evacuation +evacuative +evacuator +evacue +evacuee +evadable +evade +evader +evadingly +Evadne +evagation +evaginable +evaginate +evagination +evaluable +evaluate +evaluation +evaluative +evalue +Evan +evanesce +evanescence +evanescency +evanescent +evanescently +evanescible +evangel +evangelary +evangelian +evangeliarium +evangeliary +evangelical +evangelicalism +evangelicality +evangelically +evangelicalness +evangelican +evangelicism +evangelicity +Evangeline +evangelion +evangelism +evangelist +evangelistarion +evangelistarium +evangelistary +evangelistic +evangelistically +evangelistics +evangelistship +evangelium +evangelization +evangelize +evangelizer +Evaniidae +evanish +evanishment +evanition +evansite +evaporability +evaporable +evaporate +evaporation +evaporative +evaporativity +evaporator +evaporimeter +evaporize +evaporometer +evase +evasible +evasion +evasional +evasive +evasively +evasiveness +Eve +eve +Evea +evechurr +evection +evectional +Evehood +evejar +Eveless +evelight +Evelina +Eveline +evelong +Evelyn +even +evenblush +evendown +evener +evenfall +evenforth +evenglow +evenhanded +evenhandedly +evenhandedness +evening +evenlight +evenlong +evenly +evenmete +evenminded +evenmindedness +evenness +evens +evensong +event +eventful +eventfully +eventfulness +eventide +eventime +eventless +eventlessly +eventlessness +eventognath +Eventognathi +eventognathous +eventration +eventual +eventuality +eventualize +eventually +eventuate +eventuation +evenwise +evenworthy +eveque +ever +Everard +everbearer +everbearing +everbloomer +everblooming +everduring +Everett +everglade +evergreen +evergreenery +evergreenite +everlasting +everlastingly +everlastingness +everliving +evermore +Evernia +evernioid +eversible +eversion +eversive +eversporting +evert +evertebral +Evertebrata +evertebrate +evertile +evertor +everwhich +everwho +every +everybody +everyday +everydayness +everyhow +everylike +Everyman +everyman +everyness +everyone +everything +everywhen +everywhence +everywhere +everywhereness +everywheres +everywhither +evestar +evetide +eveweed +evict +eviction +evictor +evidence +evidencive +evident +evidential +evidentially +evidentiary +evidently +evidentness +evil +evildoer +evilhearted +evilly +evilmouthed +evilness +evilproof +evilsayer +evilspeaker +evilspeaking +evilwishing +evince +evincement +evincible +evincibly +evincingly +evincive +evirate +eviration +eviscerate +evisceration +evisite +evitable +evitate +evitation +evittate +evocable +evocate +evocation +evocative +evocatively +evocator +evocatory +evocatrix +Evodia +evoe +evoke +evoker +evolute +evolution +evolutional +evolutionally +evolutionary +evolutionism +evolutionist +evolutionize +evolutive +evolutoid +evolvable +evolve +evolvement +evolvent +evolver +Evonymus +evovae +evulgate +evulgation +evulse +evulsion +evzone +ewder +Ewe +ewe +ewelease +ewer +ewerer +ewery +ewry +ex +exacerbate +exacerbation +exacerbescence +exacerbescent +exact +exactable +exacter +exacting +exactingly +exactingness +exaction +exactitude +exactive +exactiveness +exactly +exactment +exactness +exactor +exactress +exadversum +exaggerate +exaggerated +exaggeratedly +exaggerating +exaggeratingly +exaggeration +exaggerative +exaggeratively +exaggerativeness +exaggerator +exaggeratory +exagitate +exagitation +exairesis +exalate +exalbuminose +exalbuminous +exallotriote +exalt +exaltation +exaltative +exalted +exaltedly +exaltedness +exalter +exam +examen +examinability +examinable +examinant +examinate +examination +examinational +examinationism +examinationist +examinative +examinator +examinatorial +examinatory +examine +examinee +examiner +examinership +examining +examiningly +example +exampleless +exampleship +exanimate +exanimation +exanthem +exanthema +exanthematic +exanthematous +exappendiculate +exarate +exaration +exarch +exarchal +exarchate +exarchateship +Exarchic +Exarchist +exarchist +exarchy +exareolate +exarillate +exaristate +exarteritis +exarticulate +exarticulation +exasperate +exasperated +exasperatedly +exasperater +exasperating +exasperatingly +exasperation +exasperative +exaspidean +Exaudi +exaugurate +exauguration +excalate +excalation +excalcarate +excalceate +excalceation +Excalibur +excamb +excamber +excambion +excandescence +excandescency +excandescent +excantation +excarnate +excarnation +excathedral +excaudate +excavate +excavation +excavationist +excavator +excavatorial +excavatory +excave +excecate +excecation +excedent +exceed +exceeder +exceeding +exceedingly +exceedingness +excel +excelente +excellence +excellency +excellent +excellently +excelsin +Excelsior +excelsior +excelsitude +excentral +excentric +excentrical +excentricity +except +exceptant +excepting +exception +exceptionable +exceptionableness +exceptionably +exceptional +exceptionality +exceptionally +exceptionalness +exceptionary +exceptionless +exceptious +exceptiousness +exceptive +exceptively +exceptiveness +exceptor +excerebration +excerpt +excerptible +excerption +excerptive +excerptor +excess +excessive +excessively +excessiveness +excessman +exchange +exchangeability +exchangeable +exchangeably +exchanger +Exchangite +Exchequer +exchequer +excide +excipient +exciple +Excipulaceae +excipular +excipule +excipuliform +excipulum +excircle +excisable +excise +exciseman +excisemanship +excision +excisor +excitability +excitable +excitableness +excitancy +excitant +excitation +excitative +excitator +excitatory +excite +excited +excitedly +excitedness +excitement +exciter +exciting +excitingly +excitive +excitoglandular +excitometabolic +excitomotion +excitomotor +excitomotory +excitomuscular +excitonutrient +excitor +excitory +excitosecretory +excitovascular +exclaim +exclaimer +exclaiming +exclaimingly +exclamation +exclamational +exclamative +exclamatively +exclamatorily +exclamatory +exclave +exclosure +excludable +exclude +excluder +excluding +excludingly +exclusion +exclusionary +exclusioner +exclusionism +exclusionist +exclusive +exclusively +exclusiveness +exclusivism +exclusivist +exclusivity +exclusory +Excoecaria +excogitable +excogitate +excogitation +excogitative +excogitator +excommunicable +excommunicant +excommunicate +excommunication +excommunicative +excommunicator +excommunicatory +exconjugant +excoriable +excoriate +excoriation +excoriator +excorticate +excortication +excrement +excremental +excrementary +excrementitial +excrementitious +excrementitiously +excrementitiousness +excrementive +excresce +excrescence +excrescency +excrescent +excrescential +excreta +excretal +excrete +excreter +excretes +excretion +excretionary +excretitious +excretive +excretory +excriminate +excruciable +excruciate +excruciating +excruciatingly +excruciation +excruciator +excubant +excudate +exculpable +exculpate +exculpation +exculpative +exculpatorily +exculpatory +excurrent +excurse +excursion +excursional +excursionary +excursioner +excursionism +excursionist +excursionize +excursive +excursively +excursiveness +excursory +excursus +excurvate +excurvated +excurvation +excurvature +excurved +excusability +excusable +excusableness +excusably +excusal +excusative +excusator +excusatory +excuse +excuseful +excusefully +excuseless +excuser +excusing +excusingly +excusive +excuss +excyst +excystation +excysted +excystment +exdelicto +exdie +exeat +execrable +execrableness +execrably +execrate +execration +execrative +execratively +execrator +execratory +executable +executancy +executant +execute +executed +executer +execution +executional +executioneering +executioner +executioneress +executionist +executive +executively +executiveness +executiveship +executor +executorial +executorship +executory +executress +executrices +executrix +executrixship +executry +exedent +exedra +exegeses +exegesis +exegesist +exegete +exegetic +exegetical +exegetically +exegetics +exegetist +exemplar +exemplaric +exemplarily +exemplariness +exemplarism +exemplarity +exemplary +exemplifiable +exemplification +exemplificational +exemplificative +exemplificator +exemplifier +exemplify +exempt +exemptible +exemptile +exemption +exemptionist +exemptive +exencephalia +exencephalic +exencephalous +exencephalus +exendospermic +exendospermous +exenterate +exenteration +exequatur +exequial +exequy +exercisable +exercise +exerciser +exercitant +exercitation +exercitor +exercitorial +exercitorian +exeresis +exergual +exergue +exert +exertion +exertionless +exertive +exes +exeunt +exfiguration +exfigure +exfiltration +exflagellate +exflagellation +exflect +exfodiate +exfodiation +exfoliate +exfoliation +exfoliative +exfoliatory +exgorgitation +exhalable +exhalant +exhalation +exhalatory +exhale +exhaust +exhausted +exhaustedly +exhaustedness +exhauster +exhaustibility +exhaustible +exhausting +exhaustingly +exhaustion +exhaustive +exhaustively +exhaustiveness +exhaustless +exhaustlessly +exhaustlessness +exheredate +exheredation +exhibit +exhibitable +exhibitant +exhibiter +exhibition +exhibitional +exhibitioner +exhibitionism +exhibitionist +exhibitionistic +exhibitionize +exhibitive +exhibitively +exhibitor +exhibitorial +exhibitorship +exhibitory +exhilarant +exhilarate +exhilarating +exhilaratingly +exhilaration +exhilarative +exhilarator +exhilaratory +exhort +exhortation +exhortative +exhortatively +exhortator +exhortatory +exhorter +exhortingly +exhumate +exhumation +exhumator +exhumatory +exhume +exhumer +exigence +exigency +exigent +exigenter +exigently +exigible +exiguity +exiguous +exiguously +exiguousness +exilarch +exilarchate +exile +exiledom +exilement +exiler +exilian +exilic +exility +eximious +eximiously +eximiousness +exinanite +exinanition +exindusiate +exinguinal +exist +existability +existence +existent +existential +existentialism +existentialist +existentialistic +existentialize +existentially +existently +exister +existibility +existible +existlessness +exit +exite +exition +exitus +exlex +exmeridian +Exmoor +exoarteritis +Exoascaceae +exoascaceous +Exoascales +Exoascus +Exobasidiaceae +Exobasidiales +Exobasidium +exocannibalism +exocardia +exocardiac +exocardial +exocarp +exocataphoria +exoccipital +exocentric +Exochorda +exochorion +exoclinal +exocline +exocoelar +exocoele +exocoelic +exocoelom +Exocoetidae +Exocoetus +exocolitis +exocone +exocrine +exoculate +exoculation +exocyclic +Exocyclica +Exocycloida +exode +exoderm +exodermis +exodic +exodist +exodontia +exodontist +exodos +exodromic +exodromy +exodus +exody +exoenzyme +exoenzymic +exoerythrocytic +exogamic +exogamous +exogamy +exogastric +exogastrically +exogastritis +exogen +Exogenae +exogenetic +exogenic +exogenous +exogenously +exogeny +exognathion +exognathite +Exogonium +Exogyra +exolemma +exometritis +exomion +exomis +exomologesis +exomorphic +exomorphism +exomphalos +exomphalous +exomphalus +Exon +exon +exonarthex +exoner +exonerate +exoneration +exonerative +exonerator +exoneural +Exonian +exonship +exopathic +exoperidium +exophagous +exophagy +exophasia +exophasic +exophoria +exophoric +exophthalmic +exophthalmos +exoplasm +exopod +exopodite +exopoditic +Exopterygota +exopterygotic +exopterygotism +exopterygotous +exorability +exorable +exorableness +exorbital +exorbitance +exorbitancy +exorbitant +exorbitantly +exorbitate +exorbitation +exorcisation +exorcise +exorcisement +exorciser +exorcism +exorcismal +exorcisory +exorcist +exorcistic +exorcistical +exordia +exordial +exordium +exordize +exorganic +exorhason +exormia +exornation +exosepsis +exoskeletal +exoskeleton +exosmic +exosmose +exosmosis +exosmotic +exosperm +exosporal +exospore +exosporium +exosporous +Exostema +exostome +exostosed +exostosis +exostotic +exostra +exostracism +exostracize +exoteric +exoterical +exoterically +exotericism +exoterics +exotheca +exothecal +exothecate +exothecium +exothermal +exothermic +exothermous +exotic +exotically +exoticalness +exoticism +exoticist +exoticity +exoticness +exotism +exotospore +exotoxic +exotoxin +exotropia +exotropic +exotropism +expalpate +expand +expanded +expandedly +expandedness +expander +expanding +expandingly +expanse +expansibility +expansible +expansibleness +expansibly +expansile +expansion +expansional +expansionary +expansionism +expansionist +expansive +expansively +expansiveness +expansivity +expansometer +expansure +expatiate +expatiater +expatiatingly +expatiation +expatiative +expatiator +expatiatory +expatriate +expatriation +expect +expectable +expectance +expectancy +expectant +expectantly +expectation +expectative +expectedly +expecter +expectingly +expective +expectorant +expectorate +expectoration +expectorative +expectorator +expede +expediate +expedience +expediency +expedient +expediential +expedientially +expedientist +expediently +expeditate +expeditation +expedite +expedited +expeditely +expediteness +expediter +expedition +expeditionary +expeditionist +expeditious +expeditiously +expeditiousness +expel +expellable +expellant +expellee +expeller +expend +expendability +expendable +expender +expendible +expenditor +expenditrix +expenditure +expense +expenseful +expensefully +expensefulness +expenseless +expensilation +expensive +expensively +expensiveness +expenthesis +expergefacient +expergefaction +experience +experienceable +experienced +experienceless +experiencer +experiencible +experient +experiential +experientialism +experientialist +experientially +experiment +experimental +experimentalism +experimentalist +experimentalize +experimentally +experimentarian +experimentation +experimentative +experimentator +experimented +experimentee +experimenter +experimentist +experimentize +experimently +expert +expertism +expertize +expertly +expertness +expertship +expiable +expiate +expiation +expiational +expiatist +expiative +expiator +expiatoriness +expiatory +expilate +expilation +expilator +expirable +expirant +expirate +expiration +expirator +expiratory +expire +expiree +expirer +expiring +expiringly +expiry +expiscate +expiscation +expiscator +expiscatory +explain +explainable +explainer +explaining +explainingly +explanate +explanation +explanative +explanatively +explanator +explanatorily +explanatoriness +explanatory +explant +explantation +explement +explemental +expletive +expletively +expletiveness +expletory +explicable +explicableness +explicate +explication +explicative +explicatively +explicator +explicatory +explicit +explicitly +explicitness +explodable +explode +exploded +explodent +exploder +exploit +exploitable +exploitage +exploitation +exploitationist +exploitative +exploiter +exploitive +exploiture +explorable +exploration +explorational +explorative +exploratively +explorativeness +explorator +exploratory +explore +explorement +explorer +exploring +exploringly +explosibility +explosible +explosion +explosionist +explosive +explosively +explosiveness +expone +exponence +exponency +exponent +exponential +exponentially +exponentiation +exponible +export +exportability +exportable +exportation +exporter +exposal +expose +exposed +exposedness +exposer +exposit +exposition +expositional +expositionary +expositive +expositively +expositor +expositorial +expositorially +expositorily +expositoriness +expository +expositress +expostulate +expostulating +expostulatingly +expostulation +expostulative +expostulatively +expostulator +expostulatory +exposure +expound +expoundable +expounder +express +expressable +expressage +expressed +expresser +expressibility +expressible +expressibly +expression +expressionable +expressional +expressionful +expressionism +expressionist +expressionistic +expressionless +expressionlessly +expressionlessness +expressive +expressively +expressiveness +expressivism +expressivity +expressless +expressly +expressman +expressness +expressway +exprimable +exprobrate +exprobration +exprobratory +expromission +expromissor +expropriable +expropriate +expropriation +expropriator +expugn +expugnable +expuition +expulsatory +expulse +expulser +expulsion +expulsionist +expulsive +expulsory +expunction +expunge +expungeable +expungement +expunger +expurgate +expurgation +expurgative +expurgator +expurgatorial +expurgatory +expurge +exquisite +exquisitely +exquisiteness +exquisitism +exquisitively +exradio +exradius +exrupeal +exsanguinate +exsanguination +exsanguine +exsanguineous +exsanguinity +exsanguinous +exsanguious +exscind +exscissor +exscriptural +exsculptate +exscutellate +exsect +exsectile +exsection +exsector +exsequatur +exsert +exserted +exsertile +exsertion +exship +exsibilate +exsibilation +exsiccant +exsiccatae +exsiccate +exsiccation +exsiccative +exsiccator +exsiliency +exsomatic +exspuition +exsputory +exstipulate +exstrophy +exsuccous +exsuction +exsufflate +exsufflation +exsufflicate +exsurge +exsurgent +extant +extemporal +extemporally +extemporalness +extemporaneity +extemporaneous +extemporaneously +extemporaneousness +extemporarily +extemporariness +extemporary +extempore +extemporization +extemporize +extemporizer +extend +extended +extendedly +extendedness +extender +extendibility +extendible +extending +extense +extensibility +extensible +extensibleness +extensile +extensimeter +extension +extensional +extensionist +extensity +extensive +extensively +extensiveness +extensometer +extensor +extensory +extensum +extent +extenuate +extenuating +extenuatingly +extenuation +extenuative +extenuator +extenuatory +exter +exterior +exteriorate +exterioration +exteriority +exteriorization +exteriorize +exteriorly +exteriorness +exterminable +exterminate +extermination +exterminative +exterminator +exterminatory +exterminatress +exterminatrix +exterminist +extern +external +externalism +externalist +externalistic +externality +externalization +externalize +externally +externals +externate +externation +externe +externity +externization +externize +externomedian +externum +exteroceptist +exteroceptive +exteroceptor +exterraneous +exterrestrial +exterritorial +exterritoriality +exterritorialize +exterritorially +extima +extinct +extinction +extinctionist +extinctive +extinctor +extine +extinguish +extinguishable +extinguishant +extinguished +extinguisher +extinguishment +extipulate +extirpate +extirpation +extirpationist +extirpative +extirpator +extirpatory +extispex +extispicious +extispicy +extogenous +extol +extoll +extollation +extoller +extollingly +extollment +extolment +extoolitic +extorsive +extorsively +extort +extorter +extortion +extortionary +extortionate +extortionately +extortioner +extortionist +extortive +extra +extrabold +extrabranchial +extrabronchial +extrabuccal +extrabulbar +extrabureau +extraburghal +extracalendar +extracalicular +extracanonical +extracapsular +extracardial +extracarpal +extracathedral +extracellular +extracellularly +extracerebral +extracivic +extracivically +extraclassroom +extraclaustral +extracloacal +extracollegiate +extracolumella +extraconscious +extraconstellated +extraconstitutional +extracorporeal +extracorpuscular +extracosmic +extracosmical +extracostal +extracranial +extract +extractable +extractant +extracted +extractible +extractiform +extraction +extractive +extractor +extractorship +extracultural +extracurial +extracurricular +extracurriculum +extracutaneous +extracystic +extradecretal +extradialectal +extraditable +extradite +extradition +extradomestic +extrados +extradosed +extradotal +extraduction +extradural +extraembryonic +extraenteric +extraepiphyseal +extraequilibrium +extraessential +extraessentially +extrafascicular +extrafloral +extrafocal +extrafoliaceous +extraforaneous +extraformal +extragalactic +extragastric +extrait +extrajudicial +extrajudicially +extralateral +extralite +extrality +extramarginal +extramatrical +extramedullary +extramental +extrameridian +extrameridional +extrametaphysical +extrametrical +extrametropolitan +extramodal +extramolecular +extramorainal +extramorainic +extramoral +extramoralist +extramundane +extramural +extramurally +extramusical +extranational +extranatural +extranean +extraneity +extraneous +extraneously +extraneousness +extranidal +extranormal +extranuclear +extraocular +extraofficial +extraoral +extraorbital +extraorbitally +extraordinarily +extraordinariness +extraordinary +extraorganismal +extraovate +extraovular +extraparenchymal +extraparental +extraparietal +extraparliamentary +extraparochial +extraparochially +extrapatriarchal +extrapelvic +extraperineal +extraperiodic +extraperiosteal +extraperitoneal +extraphenomenal +extraphysical +extraphysiological +extrapituitary +extraplacental +extraplanetary +extrapleural +extrapoetical +extrapolar +extrapolate +extrapolation +extrapolative +extrapolator +extrapopular +extraprofessional +extraprostatic +extraprovincial +extrapulmonary +extrapyramidal +extraquiz +extrared +extraregarding +extraregular +extraregularly +extrarenal +extraretinal +extrarhythmical +extrasacerdotal +extrascholastic +extraschool +extrascientific +extrascriptural +extrascripturality +extrasensible +extrasensory +extrasensuous +extraserous +extrasocial +extrasolar +extrasomatic +extraspectral +extraspherical +extraspinal +extrastapedial +extrastate +extrasterile +extrastomachal +extrasyllabic +extrasyllogistic +extrasyphilitic +extrasystole +extrasystolic +extratabular +extratarsal +extratellurian +extratelluric +extratemporal +extratension +extratensive +extraterrene +extraterrestrial +extraterritorial +extraterritoriality +extraterritorially +extrathecal +extratheistic +extrathermodynamic +extrathoracic +extratorrid +extratracheal +extratribal +extratropical +extratubal +extratympanic +extrauterine +extravagance +extravagancy +extravagant +Extravagantes +extravagantly +extravagantness +extravaganza +extravagate +extravaginal +extravasate +extravasation +extravascular +extraventricular +extraversion +extravert +extravillar +extraviolet +extravisceral +extrazodiacal +extreme +extremeless +extremely +extremeness +extremism +extremist +extremistic +extremital +extremity +extricable +extricably +extricate +extricated +extrication +extrinsic +extrinsical +extrinsicality +extrinsically +extrinsicalness +extrinsicate +extrinsication +extroitive +extropical +extrorsal +extrorse +extrorsely +extrospect +extrospection +extrospective +extroversion +extroversive +extrovert +extrovertish +extrude +extruder +extruding +extrusile +extrusion +extrusive +extrusory +extubate +extubation +extumescence +extund +extusion +exuberance +exuberancy +exuberant +exuberantly +exuberantness +exuberate +exuberation +exudate +exudation +exudative +exude +exudence +exulcerate +exulceration +exulcerative +exulceratory +exult +exultance +exultancy +exultant +exultantly +exultation +exultet +exultingly +exululate +exumbral +exumbrella +exumbrellar +exundance +exundancy +exundate +exundation +exuviability +exuviable +exuviae +exuvial +exuviate +exuviation +exzodiacal +ey +eyah +eyalet +eyas +eye +eyeball +eyebalm +eyebar +eyebeam +eyeberry +eyeblink +eyebolt +eyebree +eyebridled +eyebright +eyebrow +eyecup +eyed +eyedness +eyedot +eyedrop +eyeflap +eyeful +eyeglance +eyeglass +eyehole +Eyeish +eyelash +eyeless +eyelessness +eyelet +eyeleteer +eyeletter +eyelid +eyelight +eyelike +eyeline +eyemark +eyen +eyepiece +eyepit +eyepoint +eyer +eyereach +eyeroot +eyesalve +eyeseed +eyeservant +eyeserver +eyeservice +eyeshade +eyeshield +eyeshot +eyesight +eyesome +eyesore +eyespot +eyestalk +eyestone +eyestrain +eyestring +eyetooth +eyewaiter +eyewash +eyewater +eyewear +eyewink +eyewinker +eyewitness +eyewort +eyey +eying +eyn +eyne +eyot +eyoty +eyra +eyre +eyrie +eyrir +ezba +Ezekiel +Ezra +F +f +fa +Faba +Fabaceae +fabaceous +fabella +fabes +Fabian +Fabianism +Fabianist +fabiform +fable +fabled +fabledom +fableist +fableland +fablemaker +fablemonger +fablemongering +fabler +fabliau +fabling +Fabraea +fabric +fabricant +fabricate +fabrication +fabricative +fabricator +fabricatress +Fabrikoid +fabrikoid +Fabronia +Fabroniaceae +fabular +fabulist +fabulosity +fabulous +fabulously +fabulousness +faburden +facadal +facade +face +faceable +facebread +facecloth +faced +faceless +facellite +facemaker +facemaking +faceman +facemark +facepiece +faceplate +facer +facet +facete +faceted +facetely +faceteness +facetiae +facetiation +facetious +facetiously +facetiousness +facewise +facework +facia +facial +facially +faciation +faciend +facient +facies +facile +facilely +facileness +facilitate +facilitation +facilitative +facilitator +facility +facing +facingly +facinorous +facinorousness +faciobrachial +faciocervical +faciolingual +facioplegia +facioscapulohumeral +fack +fackeltanz +fackings +fackins +facks +facsimile +facsimilist +facsimilize +fact +factable +factabling +factful +Factice +facticide +faction +factional +factionalism +factionary +factioneer +factionist +factionistism +factious +factiously +factiousness +factish +factitial +factitious +factitiously +factitive +factitively +factitude +factive +factor +factorability +factorable +factorage +factordom +factoress +factorial +factorially +factorist +factorization +factorize +factorship +factory +factoryship +factotum +factrix +factual +factuality +factually +factualness +factum +facture +facty +facula +facular +faculous +facultate +facultative +facultatively +facultied +facultize +faculty +facund +facy +fad +fadable +faddiness +faddish +faddishness +faddism +faddist +faddle +faddy +fade +fadeaway +faded +fadedly +fadedness +fadeless +faden +fader +fadge +fading +fadingly +fadingness +fadmonger +fadmongering +fadmongery +fadridden +fady +fae +faerie +Faeroe +faery +faeryland +faff +faffle +faffy +fag +Fagaceae +fagaceous +fagald +Fagales +Fagara +fage +Fagelia +fager +fagger +faggery +fagging +faggingly +fagine +fagopyrism +fagopyrismus +Fagopyrum +fagot +fagoter +fagoting +fagottino +fagottist +fagoty +Fagus +faham +fahlerz +fahlore +fahlunite +Fahrenheit +faience +fail +failing +failingly +failingness +faille +failure +fain +fainaigue +fainaiguer +faineance +faineancy +faineant +faineantism +fainly +fainness +fains +faint +fainter +faintful +faintheart +fainthearted +faintheartedly +faintheartedness +fainting +faintingly +faintish +faintishness +faintly +faintness +faints +fainty +faipule +fair +fairer +fairfieldite +fairgoer +fairgoing +fairgrass +fairground +fairily +fairing +fairish +fairishly +fairkeeper +fairlike +fairling +fairly +fairm +fairness +fairstead +fairtime +fairwater +fairway +fairy +fairydom +fairyfolk +fairyhood +fairyish +fairyism +fairyland +fairylike +fairyologist +fairyology +fairyship +faith +faithbreach +faithbreaker +faithful +faithfully +faithfulness +faithless +faithlessly +faithlessness +faithwise +faithworthiness +faithworthy +faitour +fake +fakement +faker +fakery +fakiness +fakir +fakirism +Fakofo +faky +falanaka +Falange +Falangism +Falangist +Falasha +falbala +falcade +Falcata +falcate +falcated +falcation +falcer +falces +falchion +falcial +Falcidian +falciform +Falcinellus +falciparum +Falco +falcon +falconbill +falconelle +falconer +Falcones +falconet +Falconidae +Falconiformes +Falconinae +falconine +falconlike +falconoid +falconry +falcopern +falcula +falcular +falculate +Falcunculus +faldage +falderal +faldfee +faldstool +Falerian +Falernian +Falerno +Faliscan +Falisci +Falkland +fall +fallace +fallacious +fallaciously +fallaciousness +fallacy +fallage +fallation +fallaway +fallback +fallectomy +fallen +fallenness +faller +fallfish +fallibility +fallible +fallibleness +fallibly +falling +Fallopian +fallostomy +fallotomy +fallow +fallowist +fallowness +falltime +fallway +fally +falsary +false +falsehearted +falseheartedly +falseheartedness +falsehood +falsely +falsen +falseness +falser +falsettist +falsetto +falsework +falsidical +falsie +falsifiable +falsificate +falsification +falsificator +falsifier +falsify +falsism +Falstaffian +faltboat +faltche +falter +falterer +faltering +falteringly +Falunian +Faluns +falutin +falx +fam +Fama +famatinite +famble +fame +fameflower +fameful +fameless +famelessly +famelessness +Fameuse +fameworthy +familia +familial +familiar +familiarism +familiarity +familiarization +familiarize +familiarizer +familiarizingly +familiarly +familiarness +familism +familist +familistery +familistic +familistical +family +familyish +famine +famish +famishment +famous +famously +famousness +famulary +famulus +Fan +fan +fana +fanal +fanam +fanatic +fanatical +fanatically +fanaticalness +fanaticism +fanaticize +fanback +fanbearer +fanciable +fancical +fancied +fancier +fanciful +fancifully +fancifulness +fancify +fanciless +fancy +fancymonger +fancysick +fancywork +fand +fandangle +fandango +fandom +fanega +fanegada +fanfarade +Fanfare +fanfare +fanfaron +fanfaronade +fanfaronading +fanflower +fanfoot +fang +fanged +fangle +fangled +fanglement +fangless +fanglet +fanglomerate +fangot +fangy +fanhouse +faniente +fanion +fanioned +fanlight +fanlike +fanmaker +fanmaking +fanman +fannel +fanner +Fannia +fannier +fanning +Fanny +fanon +fant +fantail +fantasia +fantasie +fantasied +fantasist +fantasque +fantassin +fantast +fantastic +fantastical +fantasticality +fantastically +fantasticalness +fantasticate +fantastication +fantasticism +fantasticly +fantasticness +fantastico +fantastry +fantasy +Fanti +fantigue +fantoccini +fantocine +fantod +fantoddish +Fanwe +fanweed +fanwise +fanwork +fanwort +fanwright +Fany +faon +Fapesmo +far +farad +faradaic +faraday +faradic +faradism +faradization +faradize +faradizer +faradmeter +faradocontractility +faradomuscular +faradonervous +faradopalpation +farandole +farasula +faraway +farawayness +farce +farcelike +farcer +farcetta +farcial +farcialize +farcical +farcicality +farcically +farcicalness +farcied +farcify +farcing +farcinoma +farcist +farctate +farcy +farde +fardel +fardelet +fardh +fardo +fare +farer +farewell +farfara +farfel +farfetched +farfetchedness +Farfugium +fargoing +fargood +farina +farinaceous +farinaceously +faring +farinometer +farinose +farinosely +farinulent +Farish +farish +farkleberry +farl +farleu +farm +farmable +farmage +farmer +farmeress +farmerette +farmerlike +farmership +farmery +farmhold +farmhouse +farmhousey +farming +farmost +farmplace +farmstead +farmsteading +farmtown +farmy +farmyard +farmyardy +farnesol +farness +Farnovian +faro +Faroeish +Faroese +farolito +Farouk +farraginous +farrago +farrand +farrandly +farrantly +farreate +farreation +farrier +farrierlike +farriery +farrisite +farrow +farruca +farsalah +farse +farseeing +farseeingness +farseer +farset +Farsi +farsighted +farsightedly +farsightedness +farther +farthermost +farthest +farthing +farthingale +farthingless +farweltered +fasces +fascet +fascia +fascial +fasciate +fasciated +fasciately +fasciation +fascicle +fascicled +fascicular +fascicularly +fasciculate +fasciculated +fasciculately +fasciculation +fascicule +fasciculus +fascinate +fascinated +fascinatedly +fascinating +fascinatingly +fascination +fascinative +fascinator +fascinatress +fascine +fascinery +Fascio +fasciodesis +fasciola +fasciolar +Fasciolaria +Fasciolariidae +fasciole +fasciolet +fascioliasis +Fasciolidae +fascioloid +fascioplasty +fasciotomy +fascis +fascism +fascist +Fascista +Fascisti +fascisticization +fascisticize +fascistization +fascistize +fash +fasher +fashery +fashion +fashionability +fashionable +fashionableness +fashionably +fashioned +fashioner +fashionist +fashionize +fashionless +fashionmonger +fashionmonging +fashious +fashiousness +fasibitikite +fasinite +fass +fassalite +fast +fasten +fastener +fastening +faster +fastgoing +fasthold +fastidiosity +fastidious +fastidiously +fastidiousness +fastidium +fastigate +fastigated +fastigiate +fastigium +fasting +fastingly +fastish +fastland +fastness +fastuous +fastuously +fastuousness +fastus +fat +Fatagaga +fatal +fatalism +fatalist +fatalistic +fatalistically +fatality +fatalize +fatally +fatalness +fatbird +fatbrained +fate +fated +fateful +fatefully +fatefulness +fatelike +fathead +fatheaded +fatheadedness +fathearted +father +fathercraft +fathered +fatherhood +fatherland +fatherlandish +fatherless +fatherlessness +fatherlike +fatherliness +fatherling +fatherly +fathership +fathmur +fathom +fathomable +fathomage +fathomer +Fathometer +fathomless +fathomlessly +fathomlessness +fatidic +fatidical +fatidically +fatiferous +fatigability +fatigable +fatigableness +fatigue +fatigueless +fatiguesome +fatiguing +fatiguingly +fatiha +fatil +fatiloquent +Fatima +Fatimid +fatiscence +fatiscent +fatless +fatling +fatly +fatness +fatsia +fattable +fatten +fattenable +fattener +fatter +fattily +fattiness +fattish +fattishness +fattrels +fatty +fatuism +fatuitous +fatuitousness +fatuity +fatuoid +fatuous +fatuously +fatuousness +fatwood +faucal +faucalize +fauces +faucet +fauchard +faucial +faucitis +faucre +faugh +faujasite +fauld +Faulkland +fault +faultage +faulter +faultfind +faultfinder +faultfinding +faultful +faultfully +faultily +faultiness +faulting +faultless +faultlessly +faultlessness +faultsman +faulty +faun +Fauna +faunal +faunally +faunated +faunish +faunist +faunistic +faunistical +faunistically +faunlike +faunological +faunology +faunule +fause +faussebraie +faussebrayed +faust +Faustian +fauterer +fautor +fautorship +fauve +Fauvism +Fauvist +favaginous +favella +favellidium +favelloid +Faventine +faveolate +faveolus +faviform +favilla +favillous +favism +favissa +favn +favonian +Favonius +favor +favorable +favorableness +favorably +favored +favoredly +favoredness +favorer +favoress +favoring +favoringly +favorite +favoritism +favorless +favose +favosely +favosite +Favosites +Favositidae +favositoid +favous +favus +fawn +fawner +fawnery +fawning +fawningly +fawningness +fawnlike +fawnskin +fawny +Fay +fay +Fayal +fayalite +Fayettism +fayles +Fayumic +faze +fazenda +fe +feaberry +feague +feak +feal +fealty +fear +fearable +feared +fearedly +fearedness +fearer +fearful +fearfully +fearfulness +fearingly +fearless +fearlessly +fearlessness +fearnought +fearsome +fearsomely +fearsomeness +feasance +feasibility +feasible +feasibleness +feasibly +feasor +feast +feasten +feaster +feastful +feastfully +feastless +feat +feather +featherback +featherbed +featherbedding +featherbird +featherbone +featherbrain +featherbrained +featherdom +feathered +featheredge +featheredged +featherer +featherfew +featherfoil +featherhead +featherheaded +featheriness +feathering +featherleaf +featherless +featherlessness +featherlet +featherlike +featherman +feathermonger +featherpate +featherpated +featherstitch +featherstitching +feathertop +featherway +featherweed +featherweight +featherwing +featherwise +featherwood +featherwork +featherworker +feathery +featliness +featly +featness +featous +featural +featurally +feature +featured +featureful +featureless +featureliness +featurely +featy +feaze +feazings +febricant +febricide +febricity +febricula +febrifacient +febriferous +febrific +febrifugal +febrifuge +febrile +febrility +Febronian +Febronianism +Februarius +February +februation +fecal +fecalith +fecaloid +feces +Fechnerian +feck +feckful +feckfully +feckless +fecklessly +fecklessness +feckly +fecula +feculence +feculency +feculent +fecund +fecundate +fecundation +fecundative +fecundator +fecundatory +fecundify +fecundity +fecundize +fed +feddan +federacy +Federal +federal +federalism +federalist +federalization +federalize +federally +federalness +federate +federation +federationist +federatist +federative +federatively +federator +Fedia +Fedora +fee +feeable +feeble +feeblebrained +feeblehearted +feebleheartedly +feebleheartedness +feebleness +feebling +feeblish +feebly +feed +feedable +feedback +feedbin +feedboard +feedbox +feeder +feedhead +feeding +feedman +feedsman +feedstuff +feedway +feedy +feel +feelable +feeler +feeless +feeling +feelingful +feelingless +feelinglessly +feelingly +feelingness +feer +feere +feering +feetage +feetless +feeze +fefnicute +fegary +Fegatella +Fehmic +fei +feif +feigher +feign +feigned +feignedly +feignedness +feigner +feigning +feigningly +Feijoa +feil +feint +feis +feist +feisty +Felapton +feldsher +feldspar +feldsparphyre +feldspathic +feldspathization +feldspathoid +Felichthys +felicide +felicific +felicitate +felicitation +felicitator +felicitous +felicitously +felicitousness +felicity +felid +Felidae +feliform +Felinae +feline +felinely +felineness +felinity +felinophile +felinophobe +Felis +Felix +fell +fellable +fellage +fellah +fellaheen +fellahin +Fellani +Fellata +Fellatah +fellatio +fellation +fellen +feller +fellic +felliducous +fellifluous +felling +fellingbird +fellinic +fellmonger +fellmongering +fellmongery +fellness +felloe +fellow +fellowcraft +fellowess +fellowheirship +fellowless +fellowlike +fellowship +fellside +fellsman +felly +feloid +felon +feloness +felonious +feloniously +feloniousness +felonry +felonsetter +felonsetting +felonweed +felonwood +felonwort +felony +fels +felsite +felsitic +felsobanyite +felsophyre +felsophyric +felsosphaerite +felstone +felt +felted +felter +felting +feltlike +feltmaker +feltmaking +feltmonger +feltness +feltwork +feltwort +felty +feltyfare +felucca +Felup +felwort +female +femalely +femaleness +femality +femalize +Feme +feme +femerell +femic +femicide +feminacy +feminal +feminality +feminate +femineity +feminie +feminility +feminin +feminine +femininely +feminineness +femininism +femininity +feminism +feminist +feministic +feministics +feminity +feminization +feminize +feminologist +feminology +feminophobe +femora +femoral +femorocaudal +femorocele +femorococcygeal +femorofibular +femoropopliteal +femororotulian +femorotibial +femur +fen +fenbank +fenberry +fence +fenceful +fenceless +fencelessness +fencelet +fenceplay +fencer +fenceress +fenchene +fenchone +fenchyl +fencible +fencing +fend +fendable +fender +fendering +fenderless +fendillate +fendillation +fendy +feneration +fenestella +Fenestellidae +fenestra +fenestral +fenestrate +fenestrated +fenestration +fenestrato +fenestrule +Fenian +Fenianism +fenite +fenks +fenland +fenlander +fenman +fennec +fennel +fennelflower +fennig +fennish +Fennoman +fenny +fenouillet +Fenrir +fensive +fent +fenter +fenugreek +Fenzelia +feod +feodal +feodality +feodary +feodatory +feoff +feoffee +feoffeeship +feoffment +feoffor +feower +feracious +feracity +Ferae +Ferahan +feral +feralin +Feramorz +ferash +ferberite +Ferdiad +ferdwit +feretory +feretrum +ferfathmur +ferfet +ferganite +Fergus +fergusite +Ferguson +fergusonite +feria +ferial +feridgi +ferie +ferine +ferinely +ferineness +Feringi +Ferio +Ferison +ferity +ferk +ferling +ferly +fermail +Fermatian +ferme +ferment +fermentability +fermentable +fermentarian +fermentation +fermentative +fermentatively +fermentativeness +fermentatory +fermenter +fermentescible +fermentitious +fermentive +fermentology +fermentor +fermentum +fermerer +fermery +fermila +fermorite +fern +fernandinite +Fernando +fernbird +fernbrake +ferned +fernery +ferngale +ferngrower +fernland +fernleaf +fernless +fernlike +fernshaw +fernsick +ferntickle +ferntickled +fernwort +ferny +Ferocactus +ferocious +ferociously +ferociousness +ferocity +feroher +Feronia +ferrado +ferrament +Ferrara +Ferrarese +ferrate +ferrated +ferrateen +ferratin +ferrean +ferreous +ferret +ferreter +ferreting +ferretto +ferrety +ferri +ferriage +ferric +ferrichloride +ferricyanate +ferricyanhydric +ferricyanic +ferricyanide +ferricyanogen +ferrier +ferriferous +ferrihydrocyanic +ferriprussiate +ferriprussic +ferrite +ferritization +ferritungstite +ferrivorous +ferroalloy +ferroaluminum +ferroboron +ferrocalcite +ferrocerium +ferrochrome +ferrochromium +ferroconcrete +ferroconcretor +ferrocyanate +ferrocyanhydric +ferrocyanic +ferrocyanide +ferrocyanogen +ferroglass +ferrogoslarite +ferrohydrocyanic +ferroinclave +ferromagnesian +ferromagnetic +ferromagnetism +ferromanganese +ferromolybdenum +ferronatrite +ferronickel +ferrophosphorus +ferroprint +ferroprussiate +ferroprussic +ferrosilicon +ferrotitanium +ferrotungsten +ferrotype +ferrotyper +ferrous +ferrovanadium +ferrozirconium +ferruginate +ferrugination +ferruginean +ferruginous +ferrule +ferruler +ferrum +ferruminate +ferrumination +ferry +ferryboat +ferryhouse +ferryman +ferryway +ferthumlungur +Fertil +fertile +fertilely +fertileness +fertility +fertilizable +fertilization +fertilizational +fertilize +fertilizer +feru +ferula +ferulaceous +ferule +ferulic +fervanite +fervency +fervent +fervently +ferventness +fervescence +fervescent +fervid +fervidity +fervidly +fervidness +Fervidor +fervor +fervorless +Fesapo +Fescennine +fescenninity +fescue +fess +fessely +fesswise +fest +festal +festally +Feste +fester +festerment +festilogy +festinance +festinate +festinately +festination +festine +Festino +festival +festivally +festive +festively +festiveness +festivity +festivous +festology +festoon +festoonery +festoony +festuca +festucine +fet +fetal +fetalism +fetalization +fetation +fetch +fetched +fetcher +fetching +fetchingly +feteless +feterita +fetial +fetiales +fetichmonger +feticidal +feticide +fetid +fetidity +fetidly +fetidness +fetiferous +fetiparous +fetish +fetisheer +fetishic +fetishism +fetishist +fetishistic +fetishization +fetishize +fetishmonger +fetishry +fetlock +fetlocked +fetlow +fetography +fetometry +fetoplacental +fetor +fetter +fetterbush +fetterer +fetterless +fetterlock +fetticus +fettle +fettler +fettling +fetus +feu +feuage +feuar +feucht +feud +feudal +feudalism +feudalist +feudalistic +feudality +feudalizable +feudalization +feudalize +feudally +feudatorial +feudatory +feudee +feudist +feudovassalism +feued +Feuillants +feuille +feuilletonism +feuilletonist +feuilletonistic +feulamort +fever +feverberry +feverbush +fevercup +feveret +feverfew +fevergum +feverish +feverishly +feverishness +feverless +feverlike +feverous +feverously +feverroot +fevertrap +fevertwig +fevertwitch +feverweed +feverwort +few +fewness +fewsome +fewter +fewterer +fewtrils +fey +feyness +fez +Fezzan +fezzed +Fezziwig +fezzy +fi +fiacre +fiance +fiancee +fianchetto +Fianna +fiar +fiard +fiasco +fiat +fiatconfirmatio +fib +fibber +fibbery +fibdom +Fiber +fiber +fiberboard +fibered +Fiberglas +fiberize +fiberizer +fiberless +fiberware +fibration +fibreless +fibreware +fibriform +fibril +fibrilla +fibrillar +fibrillary +fibrillate +fibrillated +fibrillation +fibrilled +fibrilliferous +fibrilliform +fibrillose +fibrillous +fibrin +fibrinate +fibrination +fibrine +fibrinemia +fibrinoalbuminous +fibrinocellular +fibrinogen +fibrinogenetic +fibrinogenic +fibrinogenous +fibrinolysin +fibrinolysis +fibrinolytic +fibrinoplastic +fibrinoplastin +fibrinopurulent +fibrinose +fibrinosis +fibrinous +fibrinuria +fibroadenia +fibroadenoma +fibroadipose +fibroangioma +fibroareolar +fibroblast +fibroblastic +fibrobronchitis +fibrocalcareous +fibrocarcinoma +fibrocartilage +fibrocartilaginous +fibrocaseose +fibrocaseous +fibrocellular +fibrochondritis +fibrochondroma +fibrochondrosteal +fibrocrystalline +fibrocyst +fibrocystic +fibrocystoma +fibrocyte +fibroelastic +fibroenchondroma +fibrofatty +fibroferrite +fibroglia +fibroglioma +fibrohemorrhagic +fibroid +fibroin +fibrointestinal +fibroligamentous +fibrolipoma +fibrolipomatous +fibrolite +fibrolitic +fibroma +fibromata +fibromatoid +fibromatosis +fibromatous +fibromembrane +fibromembranous +fibromucous +fibromuscular +fibromyectomy +fibromyitis +fibromyoma +fibromyomatous +fibromyomectomy +fibromyositis +fibromyotomy +fibromyxoma +fibromyxosarcoma +fibroneuroma +fibronuclear +fibronucleated +fibropapilloma +fibropericarditis +fibroplastic +fibropolypus +fibropsammoma +fibropurulent +fibroreticulate +fibrosarcoma +fibrose +fibroserous +fibrosis +fibrositis +Fibrospongiae +fibrotic +fibrotuberculosis +fibrous +fibrously +fibrousness +fibrovasal +fibrovascular +fibry +fibster +fibula +fibulae +fibular +fibulare +fibulocalcaneal +Ficaria +ficary +fice +ficelle +fiche +Fichtean +Fichteanism +fichtelite +fichu +ficiform +fickle +ficklehearted +fickleness +ficklety +ficklewise +fickly +fico +ficoid +Ficoidaceae +Ficoideae +ficoides +fictation +fictile +fictileness +fictility +fiction +fictional +fictionalize +fictionally +fictionary +fictioneer +fictioner +fictionist +fictionistic +fictionization +fictionize +fictionmonger +fictious +fictitious +fictitiously +fictitiousness +fictive +fictively +Ficula +Ficus +fid +Fidac +fidalgo +fidate +fidation +fiddle +fiddleback +fiddlebrained +fiddlecome +fiddledeedee +fiddlefaced +fiddlehead +fiddleheaded +fiddler +fiddlerfish +fiddlery +fiddlestick +fiddlestring +fiddlewood +fiddley +fiddling +fide +fideicommiss +fideicommissary +fideicommission +fideicommissioner +fideicommissor +fideicommissum +fideism +fideist +fidejussion +fidejussionary +fidejussor +fidejussory +Fidele +Fidelia +Fidelio +fidelity +fidepromission +fidepromissor +Fides +Fidessa +fidfad +fidge +fidget +fidgeter +fidgetily +fidgetiness +fidgeting +fidgetingly +fidgety +Fidia +fidicinal +fidicinales +fidicula +Fido +fiducia +fiducial +fiducially +fiduciarily +fiduciary +fiducinales +fie +fiedlerite +fiefdom +field +fieldball +fieldbird +fielded +fielder +fieldfare +fieldish +fieldman +fieldpiece +fieldsman +fieldward +fieldwards +fieldwork +fieldworker +fieldwort +fieldy +fiend +fiendful +fiendfully +fiendhead +fiendish +fiendishly +fiendishness +fiendism +fiendlike +fiendliness +fiendly +fiendship +fient +Fierabras +Fierasfer +fierasferid +Fierasferidae +fierasferoid +fierce +fiercehearted +fiercely +fiercen +fierceness +fierding +fierily +fieriness +fiery +fiesta +fieulamort +Fife +fife +fifer +fifie +fifish +fifo +fifteen +fifteener +fifteenfold +fifteenth +fifteenthly +fifth +fifthly +fiftieth +fifty +fiftyfold +fig +figaro +figbird +figeater +figent +figged +figgery +figging +figgle +figgy +fight +fightable +fighter +fighteress +fighting +fightingly +fightwite +Figitidae +figless +figlike +figment +figmental +figpecker +figshell +figulate +figulated +figuline +figurability +figurable +figural +figurant +figurante +figurate +figurately +figuration +figurative +figuratively +figurativeness +figure +figured +figuredly +figurehead +figureheadless +figureheadship +figureless +figurer +figuresome +figurette +figurial +figurine +figurism +figurist +figurize +figury +figworm +figwort +Fiji +Fijian +fike +fikie +filace +filaceous +filacer +Filago +filament +filamentar +filamentary +filamented +filamentiferous +filamentoid +filamentose +filamentous +filamentule +filander +filanders +filao +filar +Filaria +filaria +filarial +filarian +filariasis +filaricidal +filariform +filariid +Filariidae +filarious +filasse +filate +filator +filature +filbert +filch +filcher +filchery +filching +filchingly +file +filefish +filelike +filemaker +filemaking +filemot +filer +filesmith +filet +filial +filiality +filially +filialness +filiate +filiation +filibeg +filibranch +Filibranchia +filibranchiate +filibuster +filibusterer +filibusterism +filibusterous +filical +Filicales +filicauline +Filices +filicic +filicidal +filicide +filiciform +filicin +Filicineae +filicinean +filicite +Filicites +filicologist +filicology +Filicornia +filiety +filiferous +filiform +filiformed +Filigera +filigerous +filigree +filing +filings +filionymic +filiopietistic +filioque +Filipendula +filipendulous +Filipina +Filipiniana +Filipinization +Filipinize +Filipino +filippo +filipuncture +filite +Filix +fill +fillable +filled +fillemot +filler +fillercap +fillet +filleter +filleting +filletlike +filletster +filleul +filling +fillingly +fillingness +fillip +fillipeen +fillister +fillmass +fillock +fillowite +filly +film +filmable +filmdom +filmet +filmgoer +filmgoing +filmic +filmiform +filmily +filminess +filmish +filmist +filmize +filmland +filmlike +filmogen +filmslide +filmstrip +filmy +filo +filoplumaceous +filoplume +filopodium +Filosa +filose +filoselle +fils +filter +filterability +filterable +filterableness +filterer +filtering +filterman +filth +filthify +filthily +filthiness +filthless +filthy +filtrability +filtrable +filtratable +filtrate +filtration +fimble +fimbria +fimbrial +fimbriate +fimbriated +fimbriation +fimbriatum +fimbricate +fimbricated +fimbrilla +fimbrillate +fimbrilliferous +fimbrillose +fimbriodentate +Fimbristylis +fimetarious +fimicolous +Fin +fin +finable +finableness +finagle +finagler +final +finale +finalism +finalist +finality +finalize +finally +finance +financial +financialist +financially +financier +financiery +financist +finback +finch +finchbacked +finched +finchery +find +findability +findable +findal +finder +findfault +finding +findjan +fine +fineable +finebent +fineish +fineleaf +fineless +finely +finement +fineness +finer +finery +finespun +finesse +finesser +finestill +finestiller +finetop +finfish +finfoot +Fingal +Fingall +Fingallian +fingent +finger +fingerable +fingerberry +fingerbreadth +fingered +fingerer +fingerfish +fingerflower +fingerhold +fingerhook +fingering +fingerleaf +fingerless +fingerlet +fingerlike +fingerling +fingernail +fingerparted +fingerprint +fingerprinting +fingerroot +fingersmith +fingerspin +fingerstall +fingerstone +fingertip +fingerwise +fingerwork +fingery +fingrigo +Fingu +finial +finialed +finical +finicality +finically +finicalness +finicism +finick +finickily +finickiness +finicking +finickingly +finickingness +finific +finify +Finiglacial +finikin +finiking +fining +finis +finish +finishable +finished +finisher +finishing +finite +finitely +finiteness +finitesimal +finitive +finitude +finity +finjan +fink +finkel +finland +Finlander +finless +finlet +finlike +Finmark +Finn +finnac +finned +finner +finnesko +Finnic +Finnicize +finnip +Finnish +finny +finochio +Fionnuala +fiord +fiorded +Fioretti +fiorin +fiorite +Fiot +fip +fipenny +fipple +fique +fir +Firbolg +firca +fire +fireable +firearm +firearmed +fireback +fireball +firebird +fireblende +fireboard +fireboat +firebolt +firebolted +firebote +firebox +fireboy +firebrand +firebrat +firebreak +firebrick +firebug +fireburn +firecoat +firecracker +firecrest +fired +firedamp +firedog +firedrake +firefall +firefang +firefanged +fireflaught +fireflirt +fireflower +firefly +fireguard +firehouse +fireless +firelight +firelike +fireling +firelit +firelock +fireman +firemanship +firemaster +fireplace +fireplug +firepower +fireproof +fireproofing +fireproofness +firer +fireroom +firesafe +firesafeness +firesafety +fireshaft +fireshine +fireside +firesider +firesideship +firespout +firestone +firestopping +firetail +firetop +firetrap +firewarden +firewater +fireweed +firewood +firework +fireworkless +fireworky +fireworm +firing +firk +firker +firkin +firlot +firm +firmament +firmamental +firman +firmance +firmer +firmhearted +firmisternal +Firmisternia +firmisternial +firmisternous +firmly +firmness +firn +Firnismalerei +Firoloida +firring +firry +first +firstcomer +firsthand +firstling +firstly +firstness +firstship +firth +fisc +fiscal +fiscalify +fiscalism +fiscalization +fiscalize +fiscally +fischerite +fise +fisetin +fish +fishable +fishback +fishbed +fishberry +fishbolt +fishbone +fisheater +fished +fisher +fisherboat +fisherboy +fisheress +fisherfolk +fishergirl +fisherman +fisherpeople +fisherwoman +fishery +fishet +fisheye +fishfall +fishful +fishgarth +fishgig +fishhood +fishhook +fishhooks +fishhouse +fishify +fishily +fishiness +fishing +fishingly +fishless +fishlet +fishlike +fishline +fishling +fishman +fishmonger +fishmouth +fishplate +fishpond +fishpool +fishpot +fishpotter +fishpound +fishskin +fishtail +fishway +fishweed +fishweir +fishwife +fishwoman +fishwood +fishworker +fishworks +fishworm +fishy +fishyard +fisnoga +fissate +fissicostate +fissidactyl +Fissidens +Fissidentaceae +fissidentaceous +fissile +fissileness +fissilingual +Fissilinguia +fissility +fission +fissionable +fissipalmate +fissipalmation +fissiparation +fissiparism +fissiparity +fissiparous +fissiparously +fissiparousness +fissiped +Fissipeda +fissipedal +fissipedate +Fissipedia +fissipedial +Fissipes +fissirostral +fissirostrate +Fissirostres +fissive +fissural +fissuration +fissure +fissureless +Fissurella +Fissurellidae +fissuriform +fissury +fist +fisted +fister +fistful +fistiana +fistic +fistical +fisticuff +fisticuffer +fisticuffery +fistify +fistiness +fisting +fistlike +fistmele +fistnote +fistuca +fistula +Fistulana +fistular +Fistularia +Fistulariidae +fistularioid +fistulate +fistulated +fistulatome +fistulatous +fistule +fistuliform +Fistulina +fistulize +fistulose +fistulous +fistwise +fisty +fit +fitch +fitched +fitchee +fitcher +fitchery +fitchet +fitchew +fitful +fitfully +fitfulness +fitly +fitment +fitness +fitout +fitroot +fittable +fittage +fitted +fittedness +fitten +fitter +fitters +fittily +fittiness +fitting +fittingly +fittingness +Fittonia +fitty +fittyfied +fittyways +fittywise +fitweed +Fitzclarence +Fitzroy +Fitzroya +Fiuman +five +fivebar +fivefold +fivefoldness +fiveling +fivepence +fivepenny +fivepins +fiver +fives +fivescore +fivesome +fivestones +fix +fixable +fixage +fixate +fixatif +fixation +fixative +fixator +fixature +fixed +fixedly +fixedness +fixer +fixidity +fixing +fixity +fixture +fixtureless +fixure +fizelyite +fizgig +fizz +fizzer +fizzle +fizzy +fjarding +fjeld +fjerding +Fjorgyn +flabbergast +flabbergastation +flabbily +flabbiness +flabby +flabellarium +flabellate +flabellation +flabellifoliate +flabelliform +flabellinerved +flabellum +flabrum +flaccid +flaccidity +flaccidly +flaccidness +flacherie +Flacian +Flacianism +Flacianist +flack +flacked +flacker +flacket +Flacourtia +Flacourtiaceae +flacourtiaceous +flaff +flaffer +flag +flagboat +flagellant +flagellantism +flagellar +Flagellaria +Flagellariaceae +flagellariaceous +Flagellata +Flagellatae +flagellate +flagellated +flagellation +flagellative +flagellator +flagellatory +flagelliferous +flagelliform +flagellist +flagellosis +flagellula +flagellum +flageolet +flagfall +flagger +flaggery +flaggily +flagginess +flagging +flaggingly +flaggish +flaggy +flagitate +flagitation +flagitious +flagitiously +flagitiousness +flagleaf +flagless +flaglet +flaglike +flagmaker +flagmaking +flagman +flagon +flagonet +flagonless +flagpole +flagrance +flagrancy +flagrant +flagrantly +flagrantness +flagroot +flagship +flagstaff +flagstick +flagstone +flagworm +flail +flaillike +flair +flaith +flaithship +flajolotite +flak +flakage +flake +flakeless +flakelet +flaker +flakily +flakiness +flaky +flam +Flamandization +Flamandize +flamant +flamb +flambeau +flambeaux +flamberg +flamboyance +flamboyancy +flamboyant +flamboyantism +flamboyantize +flamboyantly +flamboyer +flame +flamed +flameflower +flameless +flamelet +flamelike +flamen +flamenco +flamenship +flameproof +flamer +flamfew +flamineous +flaming +Flamingant +flamingly +flamingo +Flaminian +flaminica +flaminical +flammability +flammable +flammeous +flammiferous +flammulated +flammulation +flammule +flamy +flan +flancard +flanch +flanched +flanconade +flandan +flandowser +flane +flange +flangeless +flanger +flangeway +flank +flankard +flanked +flanker +flanking +flankwise +flanky +flannel +flannelbush +flanneled +flannelette +flannelflower +flannelleaf +flannelly +flannelmouth +flannelmouthed +flannels +flanque +flap +flapcake +flapdock +flapdoodle +flapdragon +flapjack +flapmouthed +flapper +flapperdom +flapperhood +flapperish +flapperism +flare +flareback +flareboard +flareless +flaring +flaringly +flary +flaser +flash +flashboard +flasher +flashet +flashily +flashiness +flashing +flashingly +flashlight +flashlike +flashly +flashness +flashover +flashpan +flashproof +flashtester +flashy +flask +flasker +flasket +flasklet +flasque +flat +flatboat +flatbottom +flatcap +flatcar +flatdom +flated +flatfish +flatfoot +flathat +flathead +flatiron +flatland +flatlet +flatling +flatly +flatman +flatness +flatnose +flatten +flattener +flattening +flatter +flatterable +flattercap +flatterdock +flatterer +flattering +flatteringly +flatteringness +flattery +flattie +flatting +flattish +flattop +flatulence +flatulency +flatulent +flatulently +flatulentness +flatus +flatware +flatway +flatways +flatweed +flatwise +flatwoods +flatwork +flatworm +Flaubertian +flaught +flaughter +flaunt +flaunter +flauntily +flauntiness +flaunting +flauntingly +flaunty +flautino +flautist +flavanilin +flavaniline +flavanthrene +flavanthrone +flavedo +Flaveria +flavescence +flavescent +Flavia +Flavian +flavic +flavicant +flavid +flavin +flavine +Flavius +flavo +Flavobacterium +flavone +flavoprotein +flavopurpurin +flavor +flavored +flavorer +flavorful +flavoring +flavorless +flavorous +flavorsome +flavory +flavour +flaw +flawed +flawflower +flawful +flawless +flawlessly +flawlessness +flawn +flawy +flax +flaxboard +flaxbush +flaxdrop +flaxen +flaxlike +flaxman +flaxseed +flaxtail +flaxweed +flaxwench +flaxwife +flaxwoman +flaxwort +flaxy +flay +flayer +flayflint +flea +fleabane +fleabite +fleadock +fleam +fleaseed +fleaweed +fleawood +fleawort +fleay +flebile +fleche +flechette +fleck +flecken +flecker +fleckiness +fleckled +fleckless +flecklessly +flecky +flecnodal +flecnode +flection +flectional +flectionless +flector +fled +fledge +fledgeless +fledgling +fledgy +flee +fleece +fleeceable +fleeced +fleeceflower +fleeceless +fleecelike +fleecer +fleech +fleechment +fleecily +fleeciness +fleecy +fleer +fleerer +fleering +fleeringly +fleet +fleeter +fleetful +fleeting +fleetingly +fleetingness +fleetings +fleetly +fleetness +fleetwing +Flem +Fleming +Flemish +flemish +flench +flense +flenser +flerry +flesh +fleshbrush +fleshed +fleshen +flesher +fleshful +fleshhood +fleshhook +fleshiness +fleshing +fleshings +fleshless +fleshlike +fleshlily +fleshliness +fleshly +fleshment +fleshmonger +fleshpot +fleshy +flet +Fleta +fletch +Fletcher +fletcher +Fletcherism +Fletcherite +Fletcherize +flether +fleuret +fleurettee +fleuronnee +fleury +flew +flewed +flewit +flews +flex +flexanimous +flexed +flexibility +flexible +flexibleness +flexibly +flexile +flexility +flexion +flexionless +flexor +flexuose +flexuosity +flexuous +flexuously +flexuousness +flexural +flexure +flexured +fley +fleyedly +fleyedness +fleyland +fleysome +flibbertigibbet +flicflac +flick +flicker +flickering +flickeringly +flickerproof +flickertail +flickery +flicky +flidder +flier +fligger +flight +flighted +flighter +flightful +flightily +flightiness +flighting +flightless +flightshot +flighty +flimflam +flimflammer +flimflammery +flimmer +flimp +flimsily +flimsiness +flimsy +flinch +flincher +flinching +flinchingly +flinder +Flindersia +flindosa +flindosy +fling +flinger +flingy +flinkite +flint +flinter +flinthearted +flintify +flintily +flintiness +flintless +flintlike +flintlock +flintwood +flintwork +flintworker +flinty +flioma +flip +flipe +flipjack +flippancy +flippant +flippantly +flippantness +flipper +flipperling +flippery +flirt +flirtable +flirtation +flirtational +flirtationless +flirtatious +flirtatiously +flirtatiousness +flirter +flirtigig +flirting +flirtingly +flirtish +flirtishness +flirtling +flirty +flisk +flisky +flit +flitch +flitchen +flite +flitfold +fliting +flitter +flitterbat +flittermouse +flittern +flitting +flittingly +flitwite +flivver +flix +flixweed +Flo +float +floatability +floatable +floatage +floatation +floatative +floatboard +floater +floatiness +floating +floatingly +floative +floatless +floatmaker +floatman +floatplane +floatsman +floatstone +floaty +flob +flobby +floc +floccillation +floccipend +floccose +floccosely +flocculable +flocculant +floccular +flocculate +flocculation +flocculator +floccule +flocculence +flocculency +flocculent +flocculently +flocculose +flocculus +floccus +flock +flocker +flocking +flockless +flocklike +flockman +flockmaster +flockowner +flockwise +flocky +flocoon +flodge +floe +floeberg +Floerkea +floey +flog +floggable +flogger +flogging +floggingly +flogmaster +flogster +flokite +flong +flood +floodable +floodage +floodboard +floodcock +flooded +flooder +floodgate +flooding +floodless +floodlet +floodlight +floodlighting +floodlike +floodmark +floodometer +floodproof +floodtime +floodwater +floodway +floodwood +floody +floor +floorage +floorcloth +floorer +floorhead +flooring +floorless +floorman +floorwalker +floorward +floorway +floorwise +floozy +flop +flophouse +flopover +flopper +floppers +floppily +floppiness +floppy +flopwing +Flora +flora +floral +Floralia +floralize +florally +floramor +floran +florate +floreal +floreate +Florence +florence +florent +Florentine +Florentinism +florentium +flores +florescence +florescent +floressence +floret +floreted +floretum +Floria +Florian +floriate +floriated +floriation +florican +floricin +floricultural +floriculturally +floriculture +floriculturist +florid +Florida +Floridan +Florideae +floridean +florideous +Floridian +floridity +floridly +floridness +floriferous +floriferously +floriferousness +florification +floriform +florigen +florigenic +florigraphy +florikan +floriken +florilegium +florimania +florimanist +florin +Florinda +floriparous +floripondio +floriscope +Florissant +florist +floristic +floristically +floristics +floristry +florisugent +florivorous +floroon +floroscope +florula +florulent +flory +floscular +Floscularia +floscularian +Flosculariidae +floscule +flosculose +flosculous +flosh +floss +flosser +flossflower +Flossie +flossification +flossing +flossy +flot +flota +flotage +flotant +flotation +flotative +flotilla +flotorial +flotsam +flounce +flouncey +flouncing +flounder +floundering +flounderingly +flour +flourish +flourishable +flourisher +flourishing +flourishingly +flourishment +flourishy +flourlike +floury +flouse +flout +flouter +flouting +floutingly +flow +flowable +flowage +flower +flowerage +flowered +flowerer +floweret +flowerful +flowerily +floweriness +flowering +flowerist +flowerless +flowerlessness +flowerlet +flowerlike +flowerpecker +flowerpot +flowerwork +flowery +flowing +flowingly +flowingness +flowmanostat +flowmeter +flown +flowoff +Floyd +flu +fluate +fluavil +flub +flubdub +flubdubbery +flucan +fluctiferous +fluctigerous +fluctisonant +fluctisonous +fluctuability +fluctuable +fluctuant +fluctuate +fluctuation +fluctuosity +fluctuous +flue +flued +flueless +fluellen +fluellite +flueman +fluency +fluent +fluently +fluentness +fluer +fluework +fluey +fluff +fluffer +fluffily +fluffiness +fluffy +Flugelhorn +flugelman +fluible +fluid +fluidacetextract +fluidal +fluidally +fluidextract +fluidglycerate +fluidible +fluidic +fluidification +fluidifier +fluidify +fluidimeter +fluidism +fluidist +fluidity +fluidization +fluidize +fluidly +fluidness +fluidram +fluigram +fluitant +fluke +fluked +flukeless +flukeworm +flukewort +flukily +flukiness +fluking +fluky +flumdiddle +flume +flumerin +fluminose +flummadiddle +flummer +flummery +flummox +flummydiddle +flump +flung +flunk +flunker +flunkeydom +flunkeyhood +flunkeyish +flunkeyize +flunky +flunkydom +flunkyhood +flunkyish +flunkyism +flunkyistic +flunkyite +flunkyize +fluoaluminate +fluoaluminic +fluoarsenate +fluoborate +fluoboric +fluoborid +fluoboride +fluoborite +fluobromide +fluocarbonate +fluocerine +fluocerite +fluochloride +fluohydric +fluophosphate +fluor +fluoran +fluoranthene +fluorapatite +fluorate +fluorbenzene +fluorene +fluorenyl +fluoresage +fluoresce +fluorescein +fluorescence +fluorescent +fluorescigenic +fluorescigenous +fluorescin +fluorhydric +fluoric +fluoridate +fluoridation +fluoride +fluoridization +fluoridize +fluorimeter +fluorinate +fluorination +fluorindine +fluorine +fluorite +fluormeter +fluorobenzene +fluoroborate +fluoroform +fluoroformol +fluorogen +fluorogenic +fluorography +fluoroid +fluorometer +fluoroscope +fluoroscopic +fluoroscopy +fluorosis +fluorotype +fluorspar +fluoryl +fluosilicate +fluosilicic +fluotantalate +fluotantalic +fluotitanate +fluotitanic +fluozirconic +flurn +flurr +flurried +flurriedly +flurriment +flurry +flush +flushboard +flusher +flusherman +flushgate +flushing +flushingly +flushness +flushy +flusk +flusker +fluster +flusterate +flusteration +flusterer +flusterment +flustery +Flustra +flustrine +flustroid +flustrum +flute +flutebird +fluted +flutelike +flutemouth +fluter +flutework +Flutidae +flutina +fluting +flutist +flutter +flutterable +flutteration +flutterer +fluttering +flutteringly +flutterless +flutterment +fluttersome +fluttery +fluty +fluvial +fluvialist +fluviatic +fluviatile +fluvicoline +fluvioglacial +fluviograph +fluviolacustrine +fluviology +fluviomarine +fluviometer +fluviose +fluvioterrestrial +fluviovolcanic +flux +fluxation +fluxer +fluxibility +fluxible +fluxibleness +fluxibly +fluxile +fluxility +fluxion +fluxional +fluxionally +fluxionary +fluxionist +fluxmeter +fluxroot +fluxweed +fly +flyable +flyaway +flyback +flyball +flybane +flybelt +flyblow +flyblown +flyboat +flyboy +flycatcher +flyeater +flyer +flyflap +flyflapper +flyflower +flying +flyingly +flyleaf +flyless +flyman +flyness +flypaper +flype +flyproof +Flysch +flyspeck +flytail +flytier +flytrap +flyway +flyweight +flywheel +flywinch +flywort +Fo +foal +foalfoot +foalhood +foaly +foam +foambow +foamer +foamflower +foamily +foaminess +foaming +foamingly +foamless +foamlike +foamy +fob +focal +focalization +focalize +focally +focaloid +foci +focimeter +focimetry +focoids +focometer +focometry +focsle +focus +focusable +focuser +focusless +fod +fodda +fodder +fodderer +foddering +fodderless +foder +fodge +fodgel +fodient +Fodientia +foe +foehn +foehnlike +foeish +foeless +foelike +foeman +foemanship +Foeniculum +foenngreek +foeship +foetalization +fog +fogbound +fogbow +fogdog +fogdom +fogeater +fogey +fogfruit +foggage +fogged +fogger +foggily +fogginess +foggish +foggy +foghorn +fogle +fogless +fogman +fogo +fogon +fogou +fogproof +fogram +fogramite +fogramity +fogscoffer +fogus +fogy +fogydom +fogyish +fogyism +fohat +foible +foil +foilable +foiler +foiling +foilsman +foining +foiningly +Foism +foison +foisonless +Foist +foist +foister +foistiness +foisty +foiter +Fokker +fold +foldable +foldage +foldboat +foldcourse +folded +foldedly +folden +folder +folding +foldless +foldskirt +foldure +foldwards +foldy +fole +folgerite +folia +foliaceous +foliaceousness +foliage +foliaged +foliageous +folial +foliar +foliary +foliate +foliated +foliation +foliature +folie +foliicolous +foliiferous +foliiform +folio +foliobranch +foliobranchiate +foliocellosis +foliolate +foliole +folioliferous +foliolose +foliose +foliosity +foliot +folious +foliously +folium +folk +folkcraft +folkfree +folkland +folklore +folkloric +folklorish +folklorism +folklorist +folkloristic +folkmoot +folkmooter +folkmot +folkmote +folkmoter +folkright +folksiness +folksy +Folkvang +Folkvangr +folkway +folky +folles +folletage +follicle +follicular +folliculate +folliculated +follicule +folliculin +Folliculina +folliculitis +folliculose +folliculosis +folliculous +folliful +follis +follow +followable +follower +followership +following +followingly +folly +follyproof +Fomalhaut +foment +fomentation +fomenter +fomes +fomites +Fon +fondak +fondant +fondish +fondle +fondler +fondlesome +fondlike +fondling +fondlingly +fondly +fondness +fondu +fondue +fonduk +fonly +fonnish +fono +fons +font +Fontainea +fontal +fontally +fontanel +fontange +fonted +fontful +fonticulus +fontinal +Fontinalaceae +fontinalaceous +Fontinalis +fontlet +foo +Foochow +Foochowese +food +fooder +foodful +foodless +foodlessness +foodstuff +foody +foofaraw +fool +fooldom +foolery +fooless +foolfish +foolhardihood +foolhardily +foolhardiness +foolhardiship +foolhardy +fooling +foolish +foolishly +foolishness +foollike +foolocracy +foolproof +foolproofness +foolscap +foolship +fooner +fooster +foosterer +foot +footage +footback +football +footballer +footballist +footband +footblower +footboard +footboy +footbreadth +footbridge +footcloth +footed +footeite +footer +footfall +footfarer +footfault +footfolk +footful +footganger +footgear +footgeld +foothalt +foothill +foothold +foothook +foothot +footing +footingly +footings +footle +footler +footless +footlicker +footlight +footlights +footling +footlining +footlock +footmaker +footman +footmanhood +footmanry +footmanship +footmark +footnote +footnoted +footpace +footpad +footpaddery +footpath +footpick +footplate +footprint +footrail +footrest +footrill +footroom +footrope +foots +footscald +footslog +footslogger +footsore +footsoreness +footstalk +footstall +footstep +footstick +footstock +footstone +footstool +footwalk +footwall +footway +footwear +footwork +footworn +footy +fooyoung +foozle +foozler +fop +fopling +foppery +foppish +foppishly +foppishness +foppy +fopship +For +for +fora +forage +foragement +forager +foralite +foramen +foraminated +foramination +foraminifer +Foraminifera +foraminiferal +foraminiferan +foraminiferous +foraminose +foraminous +foraminulate +foraminule +foraminulose +foraminulous +forane +foraneen +foraneous +forasmuch +foray +forayer +forb +forbade +forbar +forbathe +forbear +forbearable +forbearance +forbearant +forbearantly +forbearer +forbearing +forbearingly +forbearingness +forbesite +forbid +forbiddable +forbiddal +forbiddance +forbidden +forbiddenly +forbiddenness +forbidder +forbidding +forbiddingly +forbiddingness +forbit +forbled +forblow +forbore +forborne +forbow +forby +force +forceable +forced +forcedly +forcedness +forceful +forcefully +forcefulness +forceless +forcemeat +forcement +forceps +forcepslike +forcer +forchase +forche +forcibility +forcible +forcibleness +forcibly +forcing +forcingly +forcipate +forcipated +forcipes +forcipiform +forcipressure +Forcipulata +forcipulate +forcleave +forconceit +ford +fordable +fordableness +fordays +Fordicidia +fording +fordless +fordo +fordone +fordwine +fordy +fore +foreaccounting +foreaccustom +foreacquaint +foreact +foreadapt +foreadmonish +foreadvertise +foreadvice +foreadvise +foreallege +foreallot +foreannounce +foreannouncement +foreanswer +foreappoint +foreappointment +forearm +foreassign +foreassurance +forebackwardly +forebay +forebear +forebemoan +forebemoaned +forebespeak +forebitt +forebitten +forebitter +forebless +foreboard +forebode +forebodement +foreboder +foreboding +forebodingly +forebodingness +forebody +foreboot +forebowels +forebowline +forebrace +forebrain +forebreast +forebridge +foreburton +forebush +forecar +forecarriage +forecast +forecaster +forecasting +forecastingly +forecastle +forecastlehead +forecastleman +forecatching +forecatharping +forechamber +forechase +forechoice +forechoose +forechurch +forecited +foreclaw +foreclosable +foreclose +foreclosure +forecome +forecomingness +forecommend +foreconceive +foreconclude +forecondemn +foreconscious +foreconsent +foreconsider +forecontrive +forecool +forecooler +forecounsel +forecount +forecourse +forecourt +forecover +forecovert +foredate +foredawn +foreday +foredeck +foredeclare +foredecree +foredeep +foredefeated +foredefine +foredenounce +foredescribe +foredeserved +foredesign +foredesignment +foredesk +foredestine +foredestiny +foredetermination +foredetermine +foredevised +foredevote +forediscern +foredispose +foredivine +foredone +foredoom +foredoomer +foredoor +foreface +forefather +forefatherly +forefault +forefeel +forefeeling +forefeelingly +forefelt +forefield +forefigure +forefin +forefinger +forefit +foreflank +foreflap +foreflipper +forefoot +forefront +foregallery +foregame +foreganger +foregate +foregift +foregirth +foreglance +foregleam +foreglimpse +foreglow +forego +foregoer +foregoing +foregone +foregoneness +foreground +foreguess +foreguidance +forehalf +forehall +forehammer +forehand +forehanded +forehandedness +forehandsel +forehard +forehatch +forehatchway +forehead +foreheaded +forehear +forehearth +foreheater +forehill +forehinting +forehold +forehood +forehoof +forehook +foreign +foreigneering +foreigner +foreignership +foreignism +foreignization +foreignize +foreignly +foreignness +foreimagination +foreimagine +foreimpressed +foreimpression +foreinclined +foreinstruct +foreintend +foreiron +forejudge +forejudgment +forekeel +foreking +foreknee +foreknow +foreknowable +foreknower +foreknowing +foreknowingly +foreknowledge +forel +forelady +foreland +forelay +foreleech +foreleg +forelimb +forelive +forellenstein +forelock +forelook +foreloop +forelooper +foreloper +foremade +foreman +foremanship +foremarch +foremark +foremartyr +foremast +foremasthand +foremastman +foremean +foremeant +foremelt +foremention +forementioned +foremessenger +foremilk +foremisgiving +foremistress +foremost +foremostly +foremother +forename +forenamed +forenews +forenight +forenoon +forenote +forenoted +forenotice +forenotion +forensal +forensic +forensical +forensicality +forensically +foreordain +foreordainment +foreorder +foreordinate +foreordination +foreorlop +forepad +forepale +foreparents +forepart +forepassed +forepast +forepaw +forepayment +forepeak +foreperiod +forepiece +foreplace +foreplan +foreplanting +forepole +foreporch +forepossessed +forepost +forepredicament +forepreparation +foreprepare +forepretended +foreproduct +foreproffer +forepromise +forepromised +foreprovided +foreprovision +forepurpose +forequarter +forequoted +foreran +forerank +forereach +forereaching +foreread +forereading +forerecited +forereckon +forerehearsed +foreremembered +forereport +forerequest +forerevelation +forerib +forerigging +foreright +foreroom +foreroyal +forerun +forerunner +forerunnership +forerunnings +foresaddle +foresaid +foresail +foresay +forescene +forescent +foreschool +foreschooling +forescript +foreseason +foreseat +foresee +foreseeability +foreseeable +foreseeingly +foreseer +foreseize +foresend +foresense +foresentence +foreset +foresettle +foresettled +foreshadow +foreshadower +foreshaft +foreshank +foreshape +foresheet +foreshift +foreship +foreshock +foreshoe +foreshop +foreshore +foreshorten +foreshortening +foreshot +foreshoulder +foreshow +foreshower +foreshroud +foreside +foresight +foresighted +foresightedness +foresightful +foresightless +foresign +foresignify +foresin +foresing +foresinger +foreskin +foreskirt +foresleeve +foresound +forespeak +forespecified +forespeed +forespencer +forest +forestaff +forestage +forestair +forestal +forestall +forestaller +forestallment +forestarling +forestate +forestation +forestay +forestaysail +forestcraft +forested +foresteep +forestem +forestep +forester +forestership +forestful +forestial +Forestian +forestick +Forestiera +forestine +forestish +forestless +forestlike +forestology +forestral +forestress +forestry +forestside +forestudy +forestwards +foresty +foresummer +foresummon +foresweat +foretack +foretackle +foretalk +foretalking +foretaste +foretaster +foretell +foretellable +foreteller +forethink +forethinker +forethought +forethoughted +forethoughtful +forethoughtfully +forethoughtfulness +forethoughtless +forethrift +foretime +foretimed +foretoken +foretold +foretop +foretopman +foretrace +foretrysail +foreturn +foretype +foretypified +foreuse +foreutter +forevalue +forever +forevermore +foreview +forevision +forevouch +forevouched +forevow +forewarm +forewarmer +forewarn +forewarner +forewarning +forewarningly +forewaters +foreween +foreweep +foreweigh +forewing +forewinning +forewisdom +forewish +forewoman +forewonted +foreword +foreworld +foreworn +forewritten +forewrought +foreyard +foreyear +forfairn +forfar +forfare +forfars +forfault +forfaulture +forfeit +forfeiter +forfeits +forfeiture +forfend +forficate +forficated +forfication +forficiform +Forficula +forficulate +Forficulidae +forfouchten +forfoughen +forfoughten +forgainst +forgather +forge +forgeability +forgeable +forged +forgedly +forgeful +forgeman +forger +forgery +forget +forgetful +forgetfully +forgetfulness +forgetive +forgetness +forgettable +forgetter +forgetting +forgettingly +forgie +forging +forgivable +forgivableness +forgivably +forgive +forgiveless +forgiveness +forgiver +forgiving +forgivingly +forgivingness +forgo +forgoer +forgot +forgotten +forgottenness +forgrow +forgrown +forhoo +forhooy +forhow +forinsec +forint +forisfamiliate +forisfamiliation +forjesket +forjudge +forjudger +fork +forkable +forkbeard +forked +forkedly +forkedness +forker +forkful +forkhead +forkiness +forkless +forklike +forkman +forksmith +forktail +forkwise +forky +forleft +forlet +forlorn +forlornity +forlornly +forlornness +form +formability +formable +formably +formagen +formagenic +formal +formalazine +formaldehyde +formaldehydesulphoxylate +formaldehydesulphoxylic +formaldoxime +formalesque +Formalin +formalism +formalist +formalistic +formalith +formality +formalization +formalize +formalizer +formally +formalness +formamide +formamidine +formamido +formamidoxime +formanilide +formant +format +formate +formation +formational +formative +formatively +formativeness +formature +formazyl +forme +formed +formedon +formee +formel +formene +formenic +former +formeret +formerly +formerness +formful +formiate +formic +Formica +formican +Formicariae +formicarian +Formicariidae +formicarioid +formicarium +formicaroid +formicary +formicate +formication +formicative +formicicide +formicid +Formicidae +formicide +Formicina +Formicinae +formicine +Formicivora +formicivorous +Formicoidea +formidability +formidable +formidableness +formidably +formin +forminate +forming +formless +formlessly +formlessness +Formol +formolite +formonitrile +Formosan +formose +formoxime +formula +formulable +formulae +formulaic +formular +formularism +formularist +formularistic +formularization +formularize +formulary +formulate +formulation +formulator +formulatory +formule +formulism +formulist +formulistic +formulization +formulize +formulizer +formwork +formy +formyl +formylal +formylate +formylation +fornacic +Fornax +fornaxid +fornenst +fornent +fornical +fornicate +fornicated +fornication +fornicator +fornicatress +fornicatrix +forniciform +forninst +fornix +forpet +forpine +forpit +forprise +forrad +forrard +forride +forrit +forritsome +forrue +forsake +forsaken +forsakenly +forsakenness +forsaker +forset +forslow +forsooth +forspeak +forspend +forspread +Forst +forsterite +forswear +forswearer +forsworn +forswornness +Forsythia +fort +fortalice +forte +fortescue +fortescure +forth +forthbring +forthbringer +forthcome +forthcomer +forthcoming +forthcomingness +forthcut +forthfare +forthfigured +forthgaze +forthgo +forthgoing +forthink +forthputting +forthright +forthrightly +forthrightness +forthrights +forthtell +forthteller +forthwith +forthy +forties +fortieth +fortifiable +fortification +fortifier +fortify +fortifying +fortifyingly +fortin +fortis +fortissimo +fortitude +fortitudinous +fortlet +fortnight +fortnightly +fortravail +fortread +fortress +fortuitism +fortuitist +fortuitous +fortuitously +fortuitousness +fortuity +fortunate +fortunately +fortunateness +fortune +fortuned +fortuneless +Fortunella +fortunetell +fortuneteller +fortunetelling +fortunite +forty +fortyfold +forum +forumize +forwander +forward +forwardal +forwardation +forwarder +forwarding +forwardly +forwardness +forwards +forwean +forweend +forwent +forwoden +forworden +fosh +fosie +Fosite +fossa +fossage +fossane +fossarian +fosse +fossed +fossette +fossick +fossicker +fossiform +fossil +fossilage +fossilated +fossilation +fossildom +fossiled +fossiliferous +fossilification +fossilify +fossilism +fossilist +fossilizable +fossilization +fossilize +fossillike +fossilogist +fossilogy +fossilological +fossilologist +fossilology +fossor +Fossores +Fossoria +fossorial +fossorious +fossula +fossulate +fossule +fossulet +fostell +Foster +foster +fosterable +fosterage +fosterer +fosterhood +fostering +fosteringly +fosterite +fosterland +fosterling +fostership +fostress +fot +fotch +fother +Fothergilla +fotmal +fotui +fou +foud +foudroyant +fouette +fougade +fougasse +fought +foughten +foughty +foujdar +foujdary +foul +foulage +foulard +fouler +fouling +foulish +foully +foulmouthed +foulmouthedly +foulmouthedness +foulness +foulsome +foumart +foun +found +foundation +foundational +foundationally +foundationary +foundationed +foundationer +foundationless +foundationlessness +founder +founderous +foundership +foundery +founding +foundling +foundress +foundry +foundryman +fount +fountain +fountained +fountaineer +fountainhead +fountainless +fountainlet +fountainous +fountainously +fountainwise +fountful +Fouquieria +Fouquieriaceae +fouquieriaceous +four +fourble +fourche +fourchee +fourcher +fourchette +fourchite +fourer +fourflusher +fourfold +Fourierian +Fourierism +Fourierist +Fourieristic +Fourierite +fourling +fourpence +fourpenny +fourpounder +fourre +fourrier +fourscore +foursome +foursquare +foursquarely +foursquareness +fourstrand +fourteen +fourteener +fourteenfold +fourteenth +fourteenthly +fourth +fourther +fourthly +foussa +foute +fouter +fouth +fovea +foveal +foveate +foveated +foveation +foveiform +foveola +foveolarious +foveolate +foveolated +foveole +foveolet +fow +fowk +fowl +fowler +fowlerite +fowlery +fowlfoot +fowling +fox +foxbane +foxberry +foxchop +foxer +foxery +foxfeet +foxfinger +foxfish +foxglove +foxhole +foxhound +foxily +foxiness +foxing +foxish +foxlike +foxproof +foxship +foxskin +foxtail +foxtailed +foxtongue +foxwood +foxy +foy +foyaite +foyaitic +foyboat +foyer +foziness +fozy +fra +frab +frabbit +frabjous +frabjously +frabous +fracas +fracedinous +frache +frack +fractable +fractabling +fracted +Fracticipita +fractile +fraction +fractional +fractionalism +fractionalize +fractionally +fractionary +fractionate +fractionating +fractionation +fractionator +fractionization +fractionize +fractionlet +fractious +fractiously +fractiousness +fractocumulus +fractonimbus +fractostratus +fractuosity +fracturable +fractural +fracture +fractureproof +frae +Fragaria +fraghan +Fragilaria +Fragilariaceae +fragile +fragilely +fragileness +fragility +fragment +fragmental +fragmentally +fragmentarily +fragmentariness +fragmentary +fragmentation +fragmented +fragmentist +fragmentitious +fragmentize +fragrance +fragrancy +fragrant +fragrantly +fragrantness +fraid +fraik +frail +frailejon +frailish +frailly +frailness +frailty +fraise +fraiser +Fram +framable +framableness +frambesia +frame +framea +frameable +frameableness +framed +frameless +framer +framesmith +framework +framing +frammit +frampler +frampold +franc +Frances +franchisal +franchise +franchisement +franchiser +Francic +Francis +francisc +francisca +Franciscan +Franciscanism +Francisco +francium +Francize +franco +Francois +francolin +francolite +Francomania +Franconian +Francophile +Francophilism +Francophobe +Francophobia +frangent +Frangi +frangibility +frangible +frangibleness +frangipane +frangipani +frangula +Frangulaceae +frangulic +frangulin +frangulinic +Frank +frank +frankability +frankable +frankalmoign +Frankenia +Frankeniaceae +frankeniaceous +Frankenstein +franker +frankfurter +frankhearted +frankheartedly +frankheartedness +Frankify +frankincense +frankincensed +franking +Frankish +Frankist +franklandite +Franklin +franklin +Franklinia +Franklinian +Frankliniana +Franklinic +Franklinism +Franklinist +franklinite +Franklinization +frankly +frankmarriage +frankness +frankpledge +frantic +frantically +franticly +franticness +franzy +frap +frappe +frapping +frasco +frase +Frasera +frasier +frass +frat +fratch +fratched +fratcheous +fratcher +fratchety +fratchy +frater +Fratercula +fraternal +fraternalism +fraternalist +fraternality +fraternally +fraternate +fraternation +fraternism +fraternity +fraternization +fraternize +fraternizer +fratery +Fraticelli +Fraticellian +fratority +Fratricelli +fratricidal +fratricide +fratry +fraud +fraudful +fraudfully +fraudless +fraudlessly +fraudlessness +fraudproof +fraudulence +fraudulency +fraudulent +fraudulently +fraudulentness +fraughan +fraught +frawn +fraxetin +fraxin +fraxinella +Fraxinus +fray +frayed +frayedly +frayedness +fraying +frayn +frayproof +fraze +frazer +frazil +frazzle +frazzling +freak +freakdom +freakery +freakful +freakily +freakiness +freakish +freakishly +freakishness +freaky +fream +freath +freck +frecken +freckened +frecket +freckle +freckled +freckledness +freckleproof +freckling +frecklish +freckly +Fred +Freddie +Freddy +Frederic +Frederica +Frederick +frederik +fredricite +free +freeboard +freeboot +freebooter +freebootery +freebooting +freeborn +Freechurchism +freed +freedman +freedom +freedwoman +freehand +freehanded +freehandedly +freehandedness +freehearted +freeheartedly +freeheartedness +freehold +freeholder +freeholdership +freeholding +freeing +freeish +Freekirker +freelage +freeloving +freelovism +freely +freeman +freemanship +freemartin +freemason +freemasonic +freemasonical +freemasonism +freemasonry +freeness +freer +Freesia +freesilverism +freesilverite +freestanding +freestone +freet +freethinker +freethinking +freetrader +freety +freeward +freeway +freewheel +freewheeler +freewheeling +freewill +freewoman +freezable +freeze +freezer +freezing +freezingly +Fregata +Fregatae +Fregatidae +freibergite +freieslebenite +freight +freightage +freighter +freightless +freightment +freir +freit +freity +fremd +fremdly +fremdness +fremescence +fremescent +fremitus +Fremontia +Fremontodendron +frenal +Frenatae +frenate +French +frenched +Frenchification +frenchification +Frenchify +frenchify +Frenchily +Frenchiness +frenching +Frenchism +Frenchize +Frenchless +Frenchly +Frenchman +Frenchness +Frenchwise +Frenchwoman +Frenchy +frenetic +frenetical +frenetically +Frenghi +frenular +frenulum +frenum +frenzelite +frenzied +frenziedly +frenzy +Freon +frequence +frequency +frequent +frequentable +frequentage +frequentation +frequentative +frequenter +frequently +frequentness +frescade +fresco +frescoer +frescoist +fresh +freshen +freshener +freshet +freshhearted +freshish +freshly +freshman +freshmanhood +freshmanic +freshmanship +freshness +freshwoman +Fresison +fresnel +fresno +fret +fretful +fretfully +fretfulness +fretless +fretsome +frett +frettage +frettation +frette +fretted +fretter +fretting +frettingly +fretty +fretum +fretways +fretwise +fretwork +fretworked +Freudian +Freudianism +Freudism +Freudist +Freya +freyalite +Freycinetia +Freyja +Freyr +friability +friable +friableness +friand +friandise +friar +friarbird +friarhood +friarling +friarly +friary +frib +fribble +fribbleism +fribbler +fribblery +fribbling +fribblish +fribby +fricandeau +fricandel +fricassee +frication +fricative +fricatrice +friction +frictionable +frictional +frictionally +frictionize +frictionless +frictionlessly +frictionproof +Friday +Fridila +fridstool +fried +Frieda +friedcake +friedelite +friedrichsdor +friend +friended +friendless +friendlessness +friendlike +friendlily +friendliness +friendliwise +friendly +friendship +frier +frieseite +Friesian +Friesic +Friesish +frieze +friezer +friezy +frig +frigate +frigatoon +friggle +fright +frightable +frighten +frightenable +frightened +frightenedly +frightenedness +frightener +frightening +frighteningly +frighter +frightful +frightfully +frightfulness +frightless +frightment +frighty +frigid +Frigidaire +frigidarium +frigidity +frigidly +frigidness +frigiferous +frigolabile +frigoric +frigorific +frigorifical +frigorify +frigorimeter +frigostable +frigotherapy +Frija +frijol +frijolillo +frijolito +frike +frill +frillback +frilled +friller +frillery +frillily +frilliness +frilling +frilly +frim +Frimaire +fringe +fringed +fringeflower +fringeless +fringelet +fringent +fringepod +Fringetail +Fringilla +fringillaceous +Fringillidae +fringilliform +Fringilliformes +fringilline +fringilloid +fringing +fringy +fripperer +frippery +frisca +Frisesomorum +frisette +Frisian +Frisii +frisk +frisker +frisket +friskful +friskily +friskiness +frisking +friskingly +frisky +frisolee +frison +frist +frisure +frit +frith +frithborh +frithbot +frithles +frithsoken +frithstool +frithwork +Fritillaria +fritillary +fritt +fritter +fritterer +Fritz +Friulian +frivol +frivoler +frivolism +frivolist +frivolity +frivolize +frivolous +frivolously +frivolousness +frixion +friz +frize +frizer +frizz +frizzer +frizzily +frizziness +frizzing +frizzle +frizzler +frizzly +frizzy +fro +frock +frocking +frockless +frocklike +frockmaker +froe +Froebelian +Froebelism +Froebelist +frog +frogbit +frogeater +frogeye +frogface +frogfish +frogflower +frogfoot +frogged +froggery +frogginess +frogging +froggish +froggy +froghood +froghopper +frogland +frogleaf +frogleg +froglet +froglike +frogling +frogman +frogmouth +frognose +frogskin +frogstool +frogtongue +frogwort +froise +frolic +frolicful +frolicker +frolicky +frolicly +frolicness +frolicsome +frolicsomely +frolicsomeness +from +fromward +fromwards +frond +frondage +fronded +frondent +frondesce +frondescence +frondescent +frondiferous +frondiform +frondigerous +frondivorous +frondlet +frondose +frondosely +frondous +front +frontad +frontage +frontager +frontal +frontalis +frontality +frontally +frontbencher +fronted +fronter +frontier +frontierlike +frontierman +frontiersman +Frontignan +fronting +frontingly +Frontirostria +frontispiece +frontless +frontlessly +frontlessness +frontlet +frontoauricular +frontoethmoid +frontogenesis +frontolysis +frontomallar +frontomaxillary +frontomental +frontonasal +frontooccipital +frontoorbital +frontoparietal +frontopontine +frontosphenoidal +frontosquamosal +frontotemporal +frontozygomatic +frontpiece +frontsman +frontstall +frontward +frontways +frontwise +froom +frore +frory +frosh +frost +frostation +frostbird +frostbite +frostbow +frosted +froster +frostfish +frostflower +frostily +frostiness +frosting +frostless +frostlike +frostproof +frostproofing +frostroot +frostweed +frostwork +frostwort +frosty +frot +froth +frother +Frothi +frothily +frothiness +frothing +frothless +frothsome +frothy +frotton +froufrou +frough +froughy +frounce +frounceless +frow +froward +frowardly +frowardness +frower +frowl +frown +frowner +frownful +frowning +frowningly +frownless +frowny +frowst +frowstily +frowstiness +frowsty +frowy +frowze +frowzily +frowziness +frowzled +frowzly +frowzy +froze +frozen +frozenhearted +frozenly +frozenness +fruchtschiefer +fructed +fructescence +fructescent +fructicultural +fructiculture +Fructidor +fructiferous +fructiferously +fructification +fructificative +fructifier +fructiform +fructify +fructiparous +fructivorous +fructose +fructoside +fructuary +fructuosity +fructuous +fructuously +fructuousness +frugal +frugalism +frugalist +frugality +frugally +frugalness +fruggan +Frugivora +frugivorous +fruit +fruitade +fruitage +fruitarian +fruitarianism +fruitcake +fruited +fruiter +fruiterer +fruiteress +fruitery +fruitful +fruitfullness +fruitfully +fruitgrower +fruitgrowing +fruitiness +fruiting +fruition +fruitist +fruitive +fruitless +fruitlessly +fruitlessness +fruitlet +fruitling +fruitstalk +fruittime +fruitwise +fruitwoman +fruitwood +fruitworm +fruity +frumentaceous +frumentarious +frumentation +frumenty +frump +frumpery +frumpily +frumpiness +frumpish +frumpishly +frumpishness +frumple +frumpy +frush +frustrate +frustrately +frustrater +frustration +frustrative +frustratory +frustule +frustulent +frustulose +frustum +frutescence +frutescent +fruticetum +fruticose +fruticous +fruticulose +frutify +fry +fryer +fu +fub +fubby +fubsy +Fucaceae +fucaceous +Fucales +fucate +fucation +fucatious +Fuchsia +Fuchsian +fuchsin +fuchsine +fuchsinophil +fuchsinophilous +fuchsite +fuchsone +fuci +fucinita +fuciphagous +fucoid +fucoidal +Fucoideae +fucosan +fucose +fucous +fucoxanthin +fucus +fud +fuddle +fuddler +fuder +fudge +fudger +fudgy +Fuegian +fuel +fueler +fuelizer +fuerte +fuff +fuffy +fugacious +fugaciously +fugaciousness +fugacity +fugal +fugally +fuggy +fugient +fugitate +fugitation +fugitive +fugitively +fugitiveness +fugitivism +fugitivity +fugle +fugleman +fuglemanship +fugler +fugu +fugue +fuguist +fuidhir +fuirdays +Fuirena +fuji +Fulah +fulciform +fulcral +fulcrate +fulcrum +fulcrumage +fulfill +fulfiller +fulfillment +Fulfulde +fulgent +fulgently +fulgentness +fulgid +fulgide +fulgidity +fulgor +Fulgora +fulgorid +Fulgoridae +Fulgoroidea +fulgorous +Fulgur +fulgural +fulgurant +fulgurantly +fulgurata +fulgurate +fulgurating +fulguration +fulgurator +fulgurite +fulgurous +fulham +Fulica +Fulicinae +fulicine +fuliginosity +fuliginous +fuliginously +fuliginousness +Fuligula +Fuligulinae +fuliguline +fulk +full +fullam +fullback +fuller +fullering +fullery +fullface +fullhearted +fulling +fullish +fullmouth +fullmouthed +fullmouthedly +fullness +fullom +Fullonian +fully +fulmar +Fulmarus +fulmicotton +fulminancy +fulminant +fulminate +fulminating +fulmination +fulminator +fulminatory +fulmine +fulmineous +fulminic +fulminous +fulminurate +fulminuric +fulsome +fulsomely +fulsomeness +fulth +Fultz +Fulup +fulvene +fulvescent +fulvid +fulvidness +fulvous +fulwa +fulyie +fulzie +fum +fumacious +fumado +fumage +fumagine +Fumago +fumarate +Fumaria +Fumariaceae +fumariaceous +fumaric +fumarine +fumarium +fumaroid +fumaroidal +fumarole +fumarolic +fumaryl +fumatorium +fumatory +fumble +fumbler +fumbling +fume +fumeless +fumer +fumeroot +fumet +fumette +fumewort +fumiduct +fumiferous +fumigant +fumigate +fumigation +fumigator +fumigatorium +fumigatory +fumily +fuminess +fuming +fumingly +fumistery +fumitory +fumose +fumosity +fumous +fumously +fumy +fun +funambulate +funambulation +funambulator +funambulatory +funambulic +funambulism +funambulist +funambulo +Funaria +Funariaceae +funariaceous +function +functional +functionalism +functionalist +functionality +functionalize +functionally +functionarism +functionary +functionate +functionation +functionize +functionless +fund +fundable +fundal +fundament +fundamental +fundamentalism +fundamentalist +fundamentality +fundamentally +fundamentalness +fundatorial +fundatrix +funded +funder +fundholder +fundi +fundic +fundiform +funditor +fundless +fundmonger +fundmongering +funds +Fundulinae +funduline +Fundulus +fundungi +fundus +funebrial +funeral +funeralize +funerary +funereal +funereally +funest +fungaceous +fungal +Fungales +fungate +fungation +fungi +Fungia +fungian +fungibility +fungible +fungic +fungicidal +fungicide +fungicolous +fungiferous +fungiform +fungilliform +fungin +fungistatic +fungivorous +fungo +fungoid +fungoidal +fungological +fungologist +fungology +fungose +fungosity +fungous +fungus +fungused +funguslike +fungusy +funicle +funicular +funiculate +funicule +funiculitis +funiculus +funiform +funipendulous +funis +Funje +funk +funker +Funkia +funkiness +funky +funmaker +funmaking +funnel +funneled +funnelform +funnellike +funnelwise +funnily +funniment +funniness +funny +funnyman +funori +funt +Funtumia +Fur +fur +furacious +furaciousness +furacity +fural +furaldehyde +furan +furanoid +furazan +furazane +furbelow +furbish +furbishable +furbisher +furbishment +furca +furcal +furcate +furcately +furcation +Furcellaria +furcellate +furciferine +furciferous +furciform +Furcraea +furcula +furcular +furculum +furdel +Furfooz +furfur +furfuraceous +furfuraceously +furfural +furfuralcohol +furfuraldehyde +furfuramide +furfuran +furfuration +furfurine +furfuroid +furfurole +furfurous +furfuryl +furfurylidene +furiant +furibund +furied +Furies +furify +furil +furilic +furiosa +furiosity +furioso +furious +furiously +furiousness +furison +furl +furlable +Furlan +furler +furless +furlong +furlough +furnace +furnacelike +furnaceman +furnacer +furnacite +furnage +Furnariidae +Furnariides +Furnarius +furner +furnish +furnishable +furnished +furnisher +furnishing +furnishment +furniture +furnitureless +furodiazole +furoic +furoid +furoin +furole +furomethyl +furomonazole +furor +furore +furphy +furred +furrier +furriered +furriery +furrily +furriness +furring +furrow +furrower +furrowless +furrowlike +furrowy +furry +furstone +further +furtherance +furtherer +furtherest +furtherly +furthermore +furthermost +furthersome +furthest +furtive +furtively +furtiveness +Furud +furuncle +furuncular +furunculoid +furunculosis +furunculous +fury +furyl +furze +furzechat +furzed +furzeling +furzery +furzetop +furzy +fusain +fusarial +fusariose +fusariosis +Fusarium +fusarole +fusate +fusc +fuscescent +fuscin +fuscohyaline +fuscous +fuse +fuseboard +fused +fusee +fuselage +fuseplug +fusht +fusibility +fusible +fusibleness +fusibly +Fusicladium +Fusicoccum +fusiform +Fusiformis +fusil +fusilier +fusillade +fusilly +fusinist +fusion +fusional +fusionism +fusionist +fusionless +fusoid +fuss +fusser +fussification +fussify +fussily +fussiness +fussock +fussy +fust +fustanella +fustee +fusteric +fustet +fustian +fustianish +fustianist +fustianize +fustic +fustigate +fustigation +fustigator +fustigatory +fustilugs +fustily +fustin +fustiness +fustle +fusty +Fusulina +fusuma +fusure +Fusus +fut +futchel +fute +futhorc +futile +futilely +futileness +futilitarian +futilitarianism +futility +futilize +futtermassel +futtock +futural +future +futureless +futureness +futuric +futurism +futurist +futuristic +futurition +futurity +futurize +futwa +fuye +fuze +fuzz +fuzzball +fuzzily +fuzziness +fuzzy +fyke +fylfot +fyrd +G +g +Ga +ga +gab +gabardine +gabbard +gabber +gabble +gabblement +gabbler +gabbro +gabbroic +gabbroid +gabbroitic +gabby +Gabe +gabelle +gabelled +gabelleman +gabeller +gaberdine +gaberlunzie +gabgab +gabi +gabion +gabionade +gabionage +gabioned +gablatores +gable +gableboard +gablelike +gablet +gablewise +gablock +Gaboon +Gabriel +Gabriella +Gabrielrache +Gabunese +gaby +Gad +gad +Gadaba +gadabout +Gadarene +Gadaria +gadbee +gadbush +Gaddang +gadded +gadder +Gaddi +gaddi +gadding +gaddingly +gaddish +gaddishness +gade +gadfly +gadge +gadger +gadget +gadid +Gadidae +gadinine +Gaditan +gadling +gadman +gadoid +Gadoidea +gadolinia +gadolinic +gadolinite +gadolinium +gadroon +gadroonage +Gadsbodikins +Gadsbud +Gadslid +gadsman +Gadswoons +gaduin +Gadus +gadwall +Gadzooks +Gael +Gaeldom +Gaelic +Gaelicism +Gaelicist +Gaelicization +Gaelicize +Gaeltacht +gaen +Gaertnerian +gaet +Gaetulan +Gaetuli +Gaetulian +gaff +gaffe +gaffer +Gaffkya +gaffle +gaffsman +gag +gagate +gage +gageable +gagee +gageite +gagelike +gager +gagership +gagger +gaggery +gaggle +gaggler +gagman +gagor +gagroot +gagtooth +gahnite +Gahrwali +Gaia +gaiassa +Gaidropsaridae +gaiety +Gail +Gaillardia +gaily +gain +gainable +gainage +gainbirth +gaincall +gaincome +gaine +gainer +gainful +gainfully +gainfulness +gaining +gainless +gainlessness +gainliness +gainly +gains +gainsay +gainsayer +gainset +gainsome +gainspeaker +gainspeaking +gainst +gainstrive +gainturn +gaintwist +gainyield +gair +gairfish +gaisling +gait +gaited +gaiter +gaiterless +gaiting +gaize +gaj +gal +gala +Galacaceae +galactagogue +galactagoguic +galactan +galactase +galactemia +galacthidrosis +Galactia +galactic +galactidrosis +galactite +galactocele +galactodendron +galactodensimeter +galactogenetic +galactohemia +galactoid +galactolipide +galactolipin +galactolysis +galactolytic +galactoma +galactometer +galactometry +galactonic +galactopathy +galactophagist +galactophagous +galactophlebitis +galactophlysis +galactophore +galactophoritis +galactophorous +galactophthysis +galactophygous +galactopoiesis +galactopoietic +galactopyra +galactorrhea +galactorrhoea +galactoscope +galactose +galactoside +galactosis +galactostasis +galactosuria +galactotherapy +galactotrophy +galacturia +galagala +Galaginae +Galago +galah +galanas +galanga +galangin +galant +Galanthus +galantine +galany +galapago +Galatae +galatea +Galatian +Galatic +galatotrophic +Galax +galaxian +Galaxias +Galaxiidae +galaxy +galban +galbanum +Galbula +Galbulae +Galbulidae +Galbulinae +galbulus +Galcha +Galchic +Gale +gale +galea +galeage +galeate +galeated +galee +galeeny +Galega +galegine +Galei +galeid +Galeidae +galeiform +galempung +Galen +galena +Galenian +Galenic +galenic +Galenical +galenical +Galenism +Galenist +galenite +galenobismutite +galenoid +Galeodes +Galeodidae +galeoid +Galeopithecus +Galeopsis +Galeorchis +Galeorhinidae +Galeorhinus +galeproof +galera +galericulate +galerum +galerus +Galesaurus +galet +Galeus +galewort +galey +Galga +galgal +Galgulidae +gali +Galibi +Galician +Galictis +Galidia +Galidictis +Galik +Galilean +galilee +galimatias +galingale +Galinsoga +galiongee +galiot +galipidine +galipine +galipoidin +galipoidine +galipoipin +galipot +Galium +gall +Galla +galla +gallacetophenone +gallah +gallanilide +gallant +gallantize +gallantly +gallantness +gallantry +gallate +gallature +gallberry +gallbush +galleass +galled +Gallegan +gallein +galleon +galler +Galleria +gallerian +galleried +Galleriidae +gallery +gallerylike +gallet +galley +galleylike +galleyman +galleyworm +gallflower +gallfly +Galli +galliambic +galliambus +Gallian +galliard +galliardise +galliardly +galliardness +Gallic +gallic +Gallican +Gallicanism +Gallicism +Gallicization +Gallicize +Gallicizer +gallicola +Gallicolae +gallicole +gallicolous +galliferous +Gallification +gallification +galliform +Galliformes +Gallify +galligaskin +gallimaufry +Gallinaceae +gallinacean +Gallinacei +gallinaceous +Gallinae +Gallinago +gallinazo +galline +galling +gallingly +gallingness +gallinipper +Gallinula +gallinule +Gallinulinae +gallinuline +gallipot +Gallirallus +gallisin +gallium +gallivant +gallivanter +gallivat +gallivorous +galliwasp +gallnut +gallocyanin +gallocyanine +galloflavine +galloglass +Galloman +Gallomania +Gallomaniac +gallon +gallonage +galloner +galloon +gallooned +gallop +gallopade +galloper +Galloperdix +Gallophile +Gallophilism +Gallophobe +Gallophobia +galloping +galloptious +gallotannate +gallotannic +gallotannin +gallous +Gallovidian +Galloway +galloway +gallowglass +gallows +gallowsmaker +gallowsness +gallowsward +gallstone +Gallus +galluses +gallweed +gallwort +gally +gallybagger +gallybeggar +gallycrow +Galoisian +galoot +galop +galore +galosh +galp +galravage +galravitch +galt +Galtonia +Galtonian +galuchat +galumph +galumptious +Galusha +galuth +galvanic +galvanical +galvanically +galvanism +galvanist +galvanization +galvanize +galvanized +galvanizer +galvanocauterization +galvanocautery +galvanocontractility +galvanofaradization +galvanoglyph +galvanoglyphy +galvanograph +galvanographic +galvanography +galvanologist +galvanology +galvanolysis +galvanomagnet +galvanomagnetic +galvanomagnetism +galvanometer +galvanometric +galvanometrical +galvanometrically +galvanometry +galvanoplastic +galvanoplastical +galvanoplastically +galvanoplastics +galvanoplasty +galvanopsychic +galvanopuncture +galvanoscope +galvanoscopic +galvanoscopy +galvanosurgery +galvanotactic +galvanotaxis +galvanotherapy +galvanothermometer +galvanothermy +galvanotonic +galvanotropic +galvanotropism +galvayne +galvayning +Galways +Galwegian +galyac +galyak +galziekte +gam +gamahe +Gamaliel +gamashes +gamasid +Gamasidae +Gamasoidea +gamb +gamba +gambade +gambado +gambang +gambeer +gambeson +gambet +gambette +gambia +gambier +gambist +gambit +gamble +gambler +gamblesome +gamblesomeness +gambling +gambodic +gamboge +gambogian +gambogic +gamboised +gambol +gambrel +gambreled +gambroon +Gambusia +gamdeboo +game +gamebag +gameball +gamecock +gamecraft +gameful +gamekeeper +gamekeeping +gamelang +gameless +gamelike +Gamelion +gamelotte +gamely +gamene +gameness +gamesome +gamesomely +gamesomeness +gamester +gamestress +gametal +gametange +gametangium +gamete +gametic +gametically +gametocyst +gametocyte +gametogenesis +gametogenic +gametogenous +gametogeny +gametogonium +gametogony +gametoid +gametophagia +gametophore +gametophyll +gametophyte +gametophytic +gamic +gamily +gamin +gaminesque +gaminess +gaming +gaminish +gamma +gammacism +gammacismus +gammadion +gammarid +Gammaridae +gammarine +gammaroid +Gammarus +gammation +gammelost +gammer +gammerel +gammerstang +Gammexane +gammick +gammock +gammon +gammoner +gammoning +gammy +gamobium +gamodesmic +gamodesmy +gamogenesis +gamogenetic +gamogenetical +gamogenetically +gamogony +Gamolepis +gamomania +gamont +Gamopetalae +gamopetalous +gamophagia +gamophagy +gamophyllous +gamori +gamosepalous +gamostele +gamostelic +gamostely +gamotropic +gamotropism +gamp +gamphrel +gamut +gamy +gan +ganam +ganancial +Ganapati +ganch +Ganda +gander +ganderess +gandergoose +gandermooner +ganderteeth +Gandhara +Gandharva +Gandhiism +Gandhism +Gandhist +gandul +gandum +gandurah +gane +ganef +gang +Ganga +ganga +Gangamopteris +gangan +gangava +gangboard +gangdom +gange +ganger +Gangetic +ganggang +ganging +gangism +gangland +ganglander +ganglia +gangliac +ganglial +gangliar +gangliasthenia +gangliate +gangliated +gangliectomy +gangliform +gangliitis +gangling +ganglioblast +gangliocyte +ganglioform +ganglioid +ganglioma +ganglion +ganglionary +ganglionate +ganglionectomy +ganglioneural +ganglioneure +ganglioneuroma +ganglioneuron +ganglionic +ganglionitis +ganglionless +ganglioplexus +gangly +gangman +gangmaster +gangplank +gangrel +gangrene +gangrenescent +gangrenous +gangsman +gangster +gangsterism +gangtide +gangue +Ganguela +gangway +gangwayman +ganister +ganja +ganner +gannet +Ganocephala +ganocephalan +ganocephalous +ganodont +Ganodonta +Ganodus +ganoid +ganoidal +ganoidean +Ganoidei +ganoidian +ganoin +ganomalite +ganophyllite +ganosis +Ganowanian +gansel +gansey +gansy +gant +ganta +gantang +gantlet +gantline +ganton +gantries +gantry +gantryman +gantsl +Ganymede +Ganymedes +ganza +ganzie +gaol +gaolbird +gaoler +Gaon +Gaonate +Gaonic +gap +Gapa +gapa +gape +gaper +gapes +gapeseed +gapeworm +gaping +gapingly +gapingstock +gapo +gappy +gapy +gar +gara +garabato +garad +garage +garageman +Garamond +garance +garancine +garapata +garava +garavance +garawi +garb +garbage +garbardine +garbel +garbell +garbill +garble +garbleable +garbler +garbless +garbling +garboard +garboil +garbure +garce +Garcinia +gardant +gardeen +garden +gardenable +gardencraft +gardened +gardener +gardenership +gardenesque +gardenful +gardenhood +Gardenia +gardenin +gardening +gardenize +gardenless +gardenlike +gardenly +gardenmaker +gardenmaking +gardenwards +gardenwise +gardeny +garderobe +gardevin +gardy +gardyloo +gare +garefowl +gareh +garetta +garewaite +garfish +garganey +Gargantua +Gargantuan +garget +gargety +gargle +gargol +gargoyle +gargoyled +gargoyley +gargoylish +gargoylishly +gargoylism +Garhwali +garial +gariba +garibaldi +Garibaldian +garish +garishly +garishness +garland +garlandage +garlandless +garlandlike +garlandry +garlandwise +garle +garlic +garlicky +garliclike +garlicmonger +garlicwort +garment +garmentless +garmentmaker +garmenture +garmentworker +garn +garnel +garner +garnerage +garnet +garnetberry +garneter +garnetiferous +garnets +garnett +garnetter +garnetwork +garnetz +garnice +garniec +garnierite +garnish +garnishable +garnished +garnishee +garnisheement +garnisher +garnishment +garnishry +garniture +Garo +garoo +garookuh +garrafa +garran +Garret +garret +garreted +garreteer +garretmaster +garrison +Garrisonian +Garrisonism +garrot +garrote +garroter +Garrulinae +garruline +garrulity +garrulous +garrulously +garrulousness +Garrulus +garrupa +Garrya +Garryaceae +garse +Garshuni +garsil +garston +garten +garter +gartered +gartering +garterless +garth +garthman +Garuda +garum +garvanzo +garvey +garvock +Gary +gas +Gasan +gasbag +gascoigny +Gascon +gasconade +gasconader +Gasconism +gascromh +gaseity +gaselier +gaseosity +gaseous +gaseousness +gasfiring +gash +gashes +gashful +gashliness +gashly +gasholder +gashouse +gashy +gasifiable +gasification +gasifier +gasiform +gasify +gasket +gaskin +gasking +gaskins +gasless +gaslight +gaslighted +gaslighting +gaslit +gaslock +gasmaker +gasman +gasogenic +gasoliery +gasoline +gasolineless +gasoliner +gasometer +gasometric +gasometrical +gasometry +gasp +Gaspar +gasparillo +gasper +gaspereau +gaspergou +gaspiness +gasping +gaspingly +gasproof +gaspy +gasser +Gasserian +gassiness +gassing +gassy +gast +gastaldite +gastaldo +gaster +gasteralgia +Gasterolichenes +gasteromycete +Gasteromycetes +gasteromycetous +Gasterophilus +gasteropod +Gasteropoda +gasterosteid +Gasterosteidae +gasterosteiform +gasterosteoid +Gasterosteus +gasterotheca +gasterothecal +Gasterotricha +gasterotrichan +gasterozooid +gastight +gastightness +Gastornis +Gastornithidae +gastradenitis +gastraea +gastraead +Gastraeadae +gastraeal +gastraeum +gastral +gastralgia +gastralgic +gastralgy +gastraneuria +gastrasthenia +gastratrophia +gastrectasia +gastrectasis +gastrectomy +gastrelcosis +gastric +gastricism +gastrilegous +gastriloquial +gastriloquism +gastriloquist +gastriloquous +gastriloquy +gastrin +gastritic +gastritis +gastroadenitis +gastroadynamic +gastroalbuminorrhea +gastroanastomosis +gastroarthritis +gastroatonia +gastroatrophia +gastroblennorrhea +gastrocatarrhal +gastrocele +gastrocentrous +Gastrochaena +Gastrochaenidae +gastrocnemial +gastrocnemian +gastrocnemius +gastrocoel +gastrocolic +gastrocoloptosis +gastrocolostomy +gastrocolotomy +gastrocolpotomy +gastrocystic +gastrocystis +gastrodialysis +gastrodiaphanoscopy +gastrodidymus +gastrodisk +gastroduodenal +gastroduodenitis +gastroduodenoscopy +gastroduodenotomy +gastrodynia +gastroelytrotomy +gastroenteralgia +gastroenteric +gastroenteritic +gastroenteritis +gastroenteroanastomosis +gastroenterocolitis +gastroenterocolostomy +gastroenterological +gastroenterologist +gastroenterology +gastroenteroptosis +gastroenterostomy +gastroenterotomy +gastroepiploic +gastroesophageal +gastroesophagostomy +gastrogastrotomy +gastrogenital +gastrograph +gastrohelcosis +gastrohepatic +gastrohepatitis +gastrohydrorrhea +gastrohyperneuria +gastrohypertonic +gastrohysterectomy +gastrohysteropexy +gastrohysterorrhaphy +gastrohysterotomy +gastroid +gastrointestinal +gastrojejunal +gastrojejunostomy +gastrolater +gastrolatrous +gastrolienal +gastrolith +Gastrolobium +gastrologer +gastrological +gastrologist +gastrology +gastrolysis +gastrolytic +gastromalacia +gastromancy +gastromelus +gastromenia +gastromyces +gastromycosis +gastromyxorrhea +gastronephritis +gastronome +gastronomer +gastronomic +gastronomical +gastronomically +gastronomist +gastronomy +gastronosus +gastropancreatic +gastropancreatitis +gastroparalysis +gastroparesis +gastroparietal +gastropathic +gastropathy +gastroperiodynia +gastropexy +gastrophile +gastrophilism +gastrophilist +gastrophilite +Gastrophilus +gastrophrenic +gastrophthisis +gastroplasty +gastroplenic +gastropleuritis +gastroplication +gastropneumatic +gastropneumonic +gastropod +Gastropoda +gastropodan +gastropodous +gastropore +gastroptosia +gastroptosis +gastropulmonary +gastropulmonic +gastropyloric +gastrorrhagia +gastrorrhaphy +gastrorrhea +gastroschisis +gastroscope +gastroscopic +gastroscopy +gastrosoph +gastrosopher +gastrosophy +gastrospasm +gastrosplenic +gastrostaxis +gastrostegal +gastrostege +gastrostenosis +gastrostomize +Gastrostomus +gastrostomy +gastrosuccorrhea +gastrotheca +gastrothecal +gastrotome +gastrotomic +gastrotomy +Gastrotricha +gastrotrichan +gastrotubotomy +gastrotympanites +gastrovascular +gastroxynsis +gastrozooid +gastrula +gastrular +gastrulate +gastrulation +gasworker +gasworks +gat +gata +gatch +gatchwork +gate +gateado +gateage +gated +gatehouse +gatekeeper +gateless +gatelike +gatemaker +gateman +gatepost +gater +gatetender +gateward +gatewards +gateway +gatewayman +gatewise +gatewoman +gateworks +gatewright +Gatha +gather +gatherable +gatherer +gathering +Gathic +gating +gator +gatter +gatteridge +gau +gaub +gauby +gauche +gauchely +gaucheness +gaucherie +Gaucho +gaud +gaudery +Gaudete +gaudful +gaudily +gaudiness +gaudless +gaudsman +gaudy +gaufer +gauffer +gauffered +gauffre +gaufre +gaufrette +gauge +gaugeable +gauger +gaugership +gauging +Gaul +gaulding +gauleiter +Gaulic +gaulin +Gaulish +Gaullism +Gaullist +Gault +gault +gaulter +gaultherase +Gaultheria +gaultherin +gaum +gaumish +gaumless +gaumlike +gaumy +gaun +gaunt +gaunted +gauntlet +gauntleted +gauntly +gauntness +gauntry +gaunty +gaup +gaupus +gaur +Gaura +Gaurian +gaus +gauss +gaussage +gaussbergite +Gaussian +gauster +gausterer +gaut +gauteite +gauze +gauzelike +gauzewing +gauzily +gauziness +gauzy +gavall +gave +gavel +gaveler +gavelkind +gavelkinder +gavelman +gavelock +Gavia +Gaviae +gavial +Gavialis +gavialoid +Gaviiformes +gavotte +gavyuti +gaw +gawby +gawcie +gawk +gawkhammer +gawkihood +gawkily +gawkiness +gawkish +gawkishly +gawkishness +gawky +gawm +gawn +gawney +gawsie +gay +gayal +gayatri +gaybine +gaycat +gaydiang +gayish +Gaylussacia +gaylussite +gayment +gayness +Gaypoo +gaysome +gaywings +gayyou +gaz +gazabo +gazangabin +Gazania +gaze +gazebo +gazee +gazehound +gazel +gazeless +Gazella +gazelle +gazelline +gazement +gazer +gazettal +gazette +gazetteer +gazetteerage +gazetteerish +gazetteership +gazi +gazing +gazingly +gazingstock +gazogene +gazon +gazophylacium +gazy +gazzetta +Ge +ge +Geadephaga +geadephagous +geal +gean +geanticlinal +geanticline +gear +gearbox +geared +gearing +gearksutite +gearless +gearman +gearset +gearshift +gearwheel +gease +geason +Geaster +Geat +geat +Geatas +gebang +gebanga +gebbie +gebur +Gecarcinidae +Gecarcinus +geck +gecko +geckoid +geckotian +geckotid +Geckotidae +geckotoid +Ged +ged +gedackt +gedanite +gedder +gedeckt +gedecktwork +Gederathite +Gederite +gedrite +Gee +gee +geebong +geebung +Geechee +geejee +geek +geelbec +geeldikkop +geelhout +geepound +geerah +geest +geet +Geez +geezer +Gegenschein +gegg +geggee +gegger +geggery +Geheimrat +Gehenna +gehlenite +Geikia +geikielite +gein +geira +Geisenheimer +geisha +geison +geisotherm +geisothermal +Geissoloma +Geissolomataceae +Geissolomataceous +Geissorhiza +geissospermin +geissospermine +geitjie +geitonogamous +geitonogamy +Gekko +Gekkones +gekkonid +Gekkonidae +gekkonoid +Gekkota +gel +gelable +gelada +gelandejump +gelandelaufer +gelandesprung +Gelasian +Gelasimus +gelastic +Gelastocoridae +gelatification +gelatigenous +gelatin +gelatinate +gelatination +gelatined +gelatiniferous +gelatiniform +gelatinify +gelatinigerous +gelatinity +gelatinizability +gelatinizable +gelatinization +gelatinize +gelatinizer +gelatinobromide +gelatinochloride +gelatinoid +gelatinotype +gelatinous +gelatinously +gelatinousness +gelation +gelatose +geld +geldability +geldable +geldant +gelder +gelding +Gelechia +gelechiid +Gelechiidae +Gelfomino +gelid +Gelidiaceae +gelidity +Gelidium +gelidly +gelidness +gelignite +gelilah +gelinotte +gell +Gellert +gelly +gelogenic +gelong +geloscopy +gelose +gelosin +gelotherapy +gelotometer +gelotoscopy +gelototherapy +gelsemic +gelsemine +gelseminic +gelseminine +Gelsemium +gelt +gem +Gemara +Gemaric +Gemarist +gematria +gematrical +gemauve +gemel +gemeled +gemellione +gemellus +geminate +geminated +geminately +gemination +geminative +Gemini +Geminid +geminiflorous +geminiform +geminous +Gemitores +gemitorial +gemless +gemlike +Gemma +gemma +gemmaceous +gemmae +gemmate +gemmation +gemmative +gemmeous +gemmer +gemmiferous +gemmiferousness +gemmification +gemmiform +gemmily +gemminess +Gemmingia +gemmipara +gemmipares +gemmiparity +gemmiparous +gemmiparously +gemmoid +gemmology +gemmula +gemmulation +gemmule +gemmuliferous +gemmy +gemot +gemsbok +gemsbuck +gemshorn +gemul +gemuti +gemwork +gen +gena +genal +genapp +genapper +genarch +genarcha +genarchaship +genarchship +gendarme +gendarmery +gender +genderer +genderless +Gene +gene +genealogic +genealogical +genealogically +genealogist +genealogize +genealogizer +genealogy +genear +geneat +genecologic +genecological +genecologically +genecologist +genecology +geneki +genep +genera +generability +generable +generableness +general +generalate +generalcy +generale +generalia +Generalidad +generalific +generalism +generalissima +generalissimo +generalist +generalistic +generality +generalizable +generalization +generalize +generalized +generalizer +generall +generally +generalness +generalship +generalty +generant +generate +generating +generation +generational +generationism +generative +generatively +generativeness +generator +generatrix +generic +generical +generically +genericalness +generification +generosity +generous +generously +generousness +Genesee +geneserine +Genesiac +Genesiacal +genesial +genesic +genesiology +genesis +Genesitic +genesiurgic +genet +genethliac +genethliacal +genethliacally +genethliacon +genethliacs +genethlialogic +genethlialogical +genethlialogy +genethlic +genetic +genetical +genetically +geneticism +geneticist +genetics +genetmoil +genetous +Genetrix +genetrix +Genetta +Geneura +Geneva +geneva +Genevan +Genevese +Genevieve +Genevois +genevoise +genial +geniality +genialize +genially +genialness +genian +genic +genicular +geniculate +geniculated +geniculately +geniculation +geniculum +genie +genii +genin +genioglossal +genioglossi +genioglossus +geniohyoglossal +geniohyoglossus +geniohyoid +geniolatry +genion +genioplasty +genip +Genipa +genipa +genipap +genipapada +genisaro +Genista +genista +genistein +genital +genitalia +genitals +genitival +genitivally +genitive +genitocrural +genitofemoral +genitor +genitorial +genitory +genitourinary +geniture +genius +genizah +genizero +Genny +Genoa +genoblast +genoblastic +genocidal +genocide +Genoese +genoese +genom +genome +genomic +genonema +genos +genotype +genotypic +genotypical +genotypically +Genoveva +genovino +genre +genro +gens +genson +gent +genteel +genteelish +genteelism +genteelize +genteelly +genteelness +gentes +genthite +gentian +Gentiana +Gentianaceae +gentianaceous +Gentianales +gentianella +gentianic +gentianin +gentianose +gentianwort +gentile +gentiledom +gentilesse +gentilic +gentilism +gentilitial +gentilitian +gentilitious +gentility +gentilization +gentilize +gentiobiose +gentiopicrin +gentisein +gentisic +gentisin +gentle +gentlefolk +gentlehearted +gentleheartedly +gentleheartedness +gentlehood +gentleman +gentlemanhood +gentlemanism +gentlemanize +gentlemanlike +gentlemanlikeness +gentlemanliness +gentlemanly +gentlemanship +gentlemens +gentlemouthed +gentleness +gentlepeople +gentleship +gentlewoman +gentlewomanhood +gentlewomanish +gentlewomanlike +gentlewomanliness +gentlewomanly +gently +gentman +Gentoo +gentrice +gentry +genty +genu +genua +genual +genuclast +genuflect +genuflection +genuflector +genuflectory +genuflex +genuflexuous +genuine +genuinely +genuineness +genus +genyantrum +Genyophrynidae +genyoplasty +genys +geo +geoaesthesia +geoagronomic +geobiologic +geobiology +geobiont +geobios +geoblast +geobotanic +geobotanical +geobotanist +geobotany +geocarpic +geocentric +geocentrical +geocentrically +geocentricism +geocerite +geochemical +geochemist +geochemistry +geochronic +geochronology +geochrony +Geococcyx +geocoronium +geocratic +geocronite +geocyclic +geodaesia +geodal +geode +geodesic +geodesical +geodesist +geodesy +geodete +geodetic +geodetical +geodetically +geodetician +geodetics +geodiatropism +geodic +geodiferous +geodist +geoduck +geodynamic +geodynamical +geodynamics +geoethnic +Geoff +Geoffrey +geoffroyin +geoffroyine +geoform +geogenesis +geogenetic +geogenic +geogenous +geogeny +Geoglossaceae +Geoglossum +geoglyphic +geognosis +geognosist +geognost +geognostic +geognostical +geognostically +geognosy +geogonic +geogonical +geogony +geographer +geographic +geographical +geographically +geographics +geographism +geographize +geography +geohydrologist +geohydrology +geoid +geoidal +geoisotherm +geolatry +geologer +geologian +geologic +geological +geologically +geologician +geologist +geologize +geology +geomagnetic +geomagnetician +geomagnetics +geomagnetist +geomalic +geomalism +geomaly +geomance +geomancer +geomancy +geomant +geomantic +geomantical +geomantically +geometer +geometric +geometrical +geometrically +geometrician +geometricize +geometrid +Geometridae +geometriform +Geometrina +geometrine +geometrize +geometroid +Geometroidea +geometry +geomoroi +geomorphic +geomorphist +geomorphogenic +geomorphogenist +geomorphogeny +geomorphological +geomorphology +geomorphy +geomyid +Geomyidae +Geomys +Geon +geonavigation +geonegative +Geonic +Geonim +Geonoma +geonoma +geonyctinastic +geonyctitropic +geoparallelotropic +geophagia +geophagism +geophagist +geophagous +geophagy +Geophila +geophilid +Geophilidae +geophilous +Geophilus +Geophone +geophone +geophysical +geophysicist +geophysics +geophyte +geophytic +geoplagiotropism +Geoplana +Geoplanidae +geopolar +geopolitic +geopolitical +geopolitically +geopolitician +geopolitics +Geopolitik +geoponic +geoponical +geoponics +geopony +geopositive +Geoprumnon +georama +Geordie +George +Georgemas +Georgette +Georgia +georgiadesite +Georgian +Georgiana +georgic +Georgie +geoscopic +geoscopy +geoselenic +geosid +geoside +geosphere +Geospiza +geostatic +geostatics +geostrategic +geostrategist +geostrategy +geostrophic +geosynclinal +geosyncline +geotactic +geotactically +geotaxis +geotaxy +geotechnic +geotechnics +geotectology +geotectonic +geotectonics +Geoteuthis +geotherm +geothermal +geothermic +geothermometer +Geothlypis +geotic +geotical +geotilla +geotonic +geotonus +geotropic +geotropically +geotropism +geotropy +geoty +Gepeoo +Gephyrea +gephyrean +gephyrocercal +gephyrocercy +Gepidae +ger +gerah +Gerald +Geraldine +Geraniaceae +geraniaceous +geranial +Geraniales +geranic +geraniol +Geranium +geranium +geranomorph +Geranomorphae +geranomorphic +geranyl +Gerard +gerardia +Gerasene +gerastian +gerate +gerated +geratic +geratologic +geratologous +geratology +geraty +gerb +gerbe +Gerbera +Gerberia +gerbil +Gerbillinae +Gerbillus +gercrow +gereagle +gerefa +gerenda +gerendum +gerent +gerenuk +gerfalcon +gerhardtite +geriatric +geriatrician +geriatrics +gerim +gerip +germ +germal +German +german +germander +germane +germanely +germaneness +Germanesque +Germanhood +Germania +Germanic +germanic +Germanical +Germanically +Germanics +Germanification +Germanify +germanious +Germanish +Germanism +Germanist +Germanistic +germanite +Germanity +germanity +germanium +Germanization +germanization +Germanize +germanize +Germanizer +Germanly +Germanness +Germanocentric +Germanomania +Germanomaniac +Germanophile +Germanophilist +Germanophobe +Germanophobia +Germanophobic +Germanophobist +germanous +Germantown +germanyl +germarium +germen +germfree +germicidal +germicide +germifuge +germigenous +germin +germina +germinability +germinable +Germinal +germinal +germinally +germinance +germinancy +germinant +germinate +germination +germinative +germinatively +germinator +germing +germinogony +germiparity +germless +germlike +germling +germon +germproof +germule +germy +gernitz +gerocomia +gerocomical +gerocomy +geromorphism +Geronomite +geront +gerontal +gerontes +gerontic +gerontine +gerontism +geronto +gerontocracy +gerontocrat +gerontocratic +gerontogeous +gerontology +gerontophilia +gerontoxon +Gerres +gerrhosaurid +Gerrhosauridae +Gerridae +gerrymander +gerrymanderer +gers +gersdorffite +Gershom +Gershon +Gershonite +gersum +Gertie +Gertrude +gerund +gerundial +gerundially +gerundival +gerundive +gerundively +gerusia +Gervais +gervao +Gervas +Gervase +Gerygone +gerygone +Geryonia +geryonid +Geryonidae +Geryoniidae +Ges +Gesan +Geshurites +gesith +gesithcund +gesithcundman +Gesnera +Gesneraceae +gesneraceous +Gesneria +gesneria +Gesneriaceae +gesneriaceous +Gesnerian +gesning +gessamine +gesso +gest +Gestalt +gestalter +gestaltist +gestant +Gestapo +gestate +gestation +gestational +gestative +gestatorial +gestatorium +gestatory +geste +gested +gesten +gestening +gestic +gestical +gesticulacious +gesticulant +gesticular +gesticularious +gesticulate +gesticulation +gesticulative +gesticulatively +gesticulator +gesticulatory +gestion +gestning +gestural +gesture +gestureless +gesturer +get +geta +Getae +getah +getaway +gether +Gethsemane +gethsemane +Gethsemanic +gethsemanic +Getic +getling +getpenny +Getsul +gettable +getter +getting +getup +Geullah +Geum +geum +gewgaw +gewgawed +gewgawish +gewgawry +gewgawy +gey +geyan +geyerite +geyser +geyseral +geyseric +geyserine +geyserish +geyserite +gez +ghafir +ghaist +ghalva +Ghan +gharial +gharnao +gharry +Ghassanid +ghastily +ghastlily +ghastliness +ghastly +ghat +ghatti +ghatwal +ghatwazi +ghazi +ghazism +Ghaznevid +Gheber +ghebeta +Ghedda +ghee +Gheg +Ghegish +gheleem +Ghent +gherkin +ghetchoo +ghetti +ghetto +ghettoization +ghettoize +Ghibelline +Ghibellinism +Ghilzai +Ghiordes +ghizite +ghoom +ghost +ghostcraft +ghostdom +ghoster +ghostess +ghostfish +ghostflower +ghosthood +ghostified +ghostily +ghostish +ghostism +ghostland +ghostless +ghostlet +ghostlify +ghostlike +ghostlily +ghostliness +ghostly +ghostmonger +ghostology +ghostship +ghostweed +ghostwrite +ghosty +ghoul +ghoulery +ghoulish +ghoulishly +ghoulishness +ghrush +ghurry +Ghuz +Gi +Giansar +giant +giantesque +giantess +gianthood +giantish +giantism +giantize +giantkind +giantlike +giantly +giantry +giantship +Giardia +giardia +giardiasis +giarra +giarre +Gib +gib +gibaro +gibbals +gibbed +gibber +Gibberella +gibbergunyah +gibberish +gibberose +gibberosity +gibbet +gibbetwise +Gibbi +gibblegabble +gibblegabbler +gibbles +gibbon +gibbose +gibbosity +gibbous +gibbously +gibbousness +gibbsite +gibbus +gibby +gibe +gibel +gibelite +Gibeonite +giber +gibing +gibingly +gibleh +giblet +giblets +Gibraltar +Gibson +gibstaff +gibus +gid +giddap +giddea +giddify +giddily +giddiness +giddy +giddyberry +giddybrain +giddyhead +giddyish +Gideon +Gideonite +gidgee +gie +gied +gien +Gienah +gieseckite +gif +giffgaff +Gifola +gift +gifted +giftedly +giftedness +giftie +giftless +giftling +giftware +gig +gigantean +gigantesque +gigantic +gigantical +gigantically +giganticidal +giganticide +giganticness +gigantism +gigantize +gigantoblast +gigantocyte +gigantolite +gigantological +gigantology +gigantomachy +Gigantopithecus +Gigantosaurus +Gigantostraca +gigantostracan +gigantostracous +Gigartina +Gigartinaceae +gigartinaceous +Gigartinales +gigback +gigelira +gigeria +gigerium +gigful +gigger +giggish +giggit +giggle +giggledom +gigglement +giggler +gigglesome +giggling +gigglingly +gigglish +giggly +Gigi +giglet +gigliato +giglot +gigman +gigmaness +gigmanhood +gigmania +gigmanic +gigmanically +gigmanism +gigmanity +gignate +gignitive +gigolo +gigot +gigsman +gigster +gigtree +gigunu +Gil +Gila +Gilaki +Gilbert +gilbert +gilbertage +Gilbertese +Gilbertian +Gilbertianism +gilbertite +gild +gildable +gilded +gilden +gilder +gilding +Gileadite +Gileno +Giles +gilguy +Gilia +gilia +Giliak +gilim +Gill +gill +gillaroo +gillbird +gilled +Gillenia +giller +Gilles +gillflirt +gillhooter +Gillian +gillie +gilliflirt +gilling +gilliver +gillotage +gillotype +gillstoup +gilly +gillyflower +gillygaupus +gilo +gilpy +gilravage +gilravager +gilse +gilsonite +gilt +giltcup +gilthead +gilttail +gim +gimbal +gimbaled +gimbaljawed +gimberjawed +gimble +gimcrack +gimcrackery +gimcrackiness +gimcracky +gimel +Gimirrai +gimlet +gimleteyed +gimlety +gimmal +gimmer +gimmerpet +gimmick +gimp +gimped +gimper +gimping +gin +ging +ginger +gingerade +gingerberry +gingerbread +gingerbready +gingerin +gingerleaf +gingerline +gingerliness +gingerly +gingerness +gingernut +gingerol +gingerous +gingerroot +gingersnap +gingerspice +gingerwork +gingerwort +gingery +gingham +ginghamed +gingili +gingiva +gingivae +gingival +gingivalgia +gingivectomy +gingivitis +gingivoglossitis +gingivolabial +ginglyform +ginglymoarthrodia +ginglymoarthrodial +Ginglymodi +ginglymodian +ginglymoid +ginglymoidal +Ginglymostoma +ginglymostomoid +ginglymus +ginglyni +ginhouse +gink +Ginkgo +ginkgo +Ginkgoaceae +ginkgoaceous +Ginkgoales +ginned +ginner +ginners +ginnery +ginney +ginning +ginnle +Ginny +ginny +ginseng +ginward +gio +giobertite +giornata +giornatate +Giottesque +Giovanni +gip +gipon +gipper +Gippy +gipser +gipsire +gipsyweed +Giraffa +giraffe +giraffesque +Giraffidae +giraffine +giraffoid +girandola +girandole +girasol +girasole +girba +gird +girder +girderage +girderless +girding +girdingly +girdle +girdlecake +girdlelike +girdler +girdlestead +girdling +girdlingly +Girella +Girellidae +Girgashite +Girgasite +girl +girleen +girlery +girlfully +girlhood +girlie +girliness +girling +girlish +girlishly +girlishness +girlism +girllike +girly +girn +girny +giro +giroflore +Girondin +Girondism +Girondist +girouette +girouettism +girr +girse +girsh +girsle +girt +girth +girtline +gisarme +gish +gisla +gisler +gismondine +gismondite +gist +git +gitaligenin +gitalin +Gitanemuck +gith +Gitksan +gitonin +gitoxigenin +gitoxin +gittern +Gittite +gittith +Giuseppe +giustina +give +giveable +giveaway +given +givenness +giver +givey +giving +gizz +gizzard +gizzen +gizzern +glabella +glabellae +glabellar +glabellous +glabellum +glabrate +glabrescent +glabrous +glace +glaceed +glaceing +glaciable +glacial +glacialism +glacialist +glacialize +glacially +glaciaria +glaciarium +glaciate +glaciation +glacier +glaciered +glacieret +glacierist +glacification +glacioaqueous +glaciolacustrine +glaciological +glaciologist +glaciology +glaciomarine +glaciometer +glacionatant +glacis +glack +glad +gladden +gladdener +gladdon +gladdy +glade +gladelike +gladeye +gladful +gladfully +gladfulness +gladhearted +gladiate +gladiator +gladiatorial +gladiatorism +gladiatorship +gladiatrix +gladify +gladii +gladiola +gladiolar +gladiole +gladioli +gladiolus +gladius +gladkaite +gladless +gladly +gladness +gladsome +gladsomely +gladsomeness +Gladstone +Gladstonian +Gladstonianism +glady +Gladys +glaga +Glagol +Glagolic +Glagolitic +Glagolitsa +glaieul +glaik +glaiket +glaiketness +glair +glaireous +glairiness +glairy +glaister +glaive +glaived +glaked +glaky +glam +glamberry +glamorize +glamorous +glamorously +glamour +glamoury +glance +glancer +glancing +glancingly +gland +glandaceous +glandarious +glandered +glanderous +glanders +glandes +glandiferous +glandiform +glandless +glandlike +glandular +glandularly +glandule +glanduliferous +glanduliform +glanduligerous +glandulose +glandulosity +glandulous +glandulousness +Glaniostomi +glans +glar +glare +glareless +Glareola +glareole +Glareolidae +glareous +glareproof +glareworm +glarily +glariness +glaring +glaringly +glaringness +glarry +glary +Glaserian +glaserite +glashan +glass +glassen +glasser +glasses +glassfish +glassful +glasshouse +glassie +glassily +glassine +glassiness +Glassite +glassless +glasslike +glassmaker +glassmaking +glassman +glassophone +glassrope +glassteel +glassware +glassweed +glasswork +glassworker +glassworking +glassworks +glasswort +glassy +Glaswegian +Glathsheim +Glathsheimr +glauberite +glaucescence +glaucescent +Glaucidium +glaucin +glaucine +Glaucionetta +Glaucium +glaucochroite +glaucodot +glaucolite +glaucoma +glaucomatous +Glaucomys +Glauconia +glauconiferous +Glauconiidae +glauconite +glauconitic +glauconitization +glaucophane +glaucophanite +glaucophanization +glaucophanize +glaucophyllous +Glaucopis +glaucosuria +glaucous +glaucously +Glauke +glaum +glaumrie +glaur +glaury +Glaux +glaver +glaze +glazed +glazen +glazer +glazework +glazier +glaziery +glazily +glaziness +glazing +glazy +gleam +gleamily +gleaminess +gleaming +gleamingly +gleamless +gleamy +glean +gleanable +gleaner +gleaning +gleary +gleba +glebal +glebe +glebeless +glebous +Glecoma +glede +Gleditsia +gledy +glee +gleed +gleeful +gleefully +gleefulness +gleeishly +gleek +gleemaiden +gleeman +gleesome +gleesomely +gleesomeness +gleet +gleety +gleewoman +gleg +glegly +glegness +Glen +glen +Glengarry +Glenn +glenohumeral +glenoid +glenoidal +glent +glessite +gleyde +glia +gliadin +glial +glib +glibbery +glibly +glibness +glidder +gliddery +glide +glideless +glideness +glider +gliderport +glidewort +gliding +glidingly +gliff +gliffing +glime +glimmer +glimmering +glimmeringly +glimmerite +glimmerous +glimmery +glimpse +glimpser +glink +glint +glioma +gliomatous +gliosa +gliosis +Glires +Gliridae +gliriform +Gliriformia +glirine +Glis +glisk +glisky +glissade +glissader +glissando +glissette +glisten +glistening +glisteningly +glister +glisteringly +Glitnir +glitter +glitterance +glittering +glitteringly +glittersome +glittery +gloam +gloaming +gloat +gloater +gloating +gloatingly +global +globally +globate +globated +globe +globed +globefish +globeflower +globeholder +globelet +Globicephala +globiferous +Globigerina +globigerine +Globigerinidae +globin +Globiocephalus +globoid +globose +globosely +globoseness +globosite +globosity +globosphaerite +globous +globously +globousness +globular +Globularia +Globulariaceae +globulariaceous +globularity +globularly +globularness +globule +globulet +globulicidal +globulicide +globuliferous +globuliform +globulimeter +globulin +globulinuria +globulite +globulitic +globuloid +globulolysis +globulose +globulous +globulousness +globulysis +globy +glochid +glochideous +glochidia +glochidial +glochidian +glochidiate +glochidium +glochis +glockenspiel +gloea +gloeal +Gloeocapsa +gloeocapsoid +gloeosporiose +Gloeosporium +Gloiopeltis +Gloiosiphonia +Gloiosiphoniaceae +glom +glome +glomerate +glomeration +Glomerella +glomeroporphyritic +glomerular +glomerulate +glomerule +glomerulitis +glomerulonephritis +glomerulose +glomerulus +glommox +glomus +glonoin +glonoine +gloom +gloomful +gloomfully +gloomily +gloominess +glooming +gloomingly +gloomless +gloomth +gloomy +glop +gloppen +glor +glore +Gloria +Gloriana +gloriation +gloriette +glorifiable +glorification +glorifier +glorify +gloriole +Gloriosa +gloriosity +glorious +gloriously +gloriousness +glory +gloryful +glorying +gloryingly +gloryless +gloss +glossa +glossagra +glossal +glossalgia +glossalgy +glossanthrax +glossarial +glossarially +glossarian +glossarist +glossarize +glossary +Glossata +glossate +glossator +glossatorial +glossectomy +glossed +glosser +glossic +glossily +Glossina +glossiness +glossing +glossingly +Glossiphonia +Glossiphonidae +glossist +glossitic +glossitis +glossless +glossmeter +glossocarcinoma +glossocele +glossocoma +glossocomon +glossodynamometer +glossodynia +glossoepiglottic +glossoepiglottidean +glossograph +glossographer +glossographical +glossography +glossohyal +glossoid +glossokinesthetic +glossolabial +glossolabiolaryngeal +glossolabiopharyngeal +glossolalia +glossolalist +glossolaly +glossolaryngeal +glossological +glossologist +glossology +glossolysis +glossoncus +glossopalatine +glossopalatinus +glossopathy +glossopetra +Glossophaga +glossophagine +glossopharyngeal +glossopharyngeus +Glossophora +glossophorous +glossophytia +glossoplasty +glossoplegia +glossopode +glossopodium +Glossopteris +glossoptosis +glossopyrosis +glossorrhaphy +glossoscopia +glossoscopy +glossospasm +glossosteresis +Glossotherium +glossotomy +glossotype +glossy +glost +glottal +glottalite +glottalize +glottic +glottid +glottidean +glottis +glottiscope +glottogonic +glottogonist +glottogony +glottologic +glottological +glottologist +glottology +Gloucester +glout +glove +gloveless +glovelike +glovemaker +glovemaking +glover +gloveress +glovey +gloving +glow +glower +glowerer +glowering +gloweringly +glowfly +glowing +glowingly +glowworm +Gloxinia +gloy +gloze +glozing +glozingly +glub +glucase +glucemia +glucid +glucide +glucidic +glucina +glucine +glucinic +glucinium +glucinum +gluck +glucofrangulin +glucokinin +glucolipid +glucolipide +glucolipin +glucolipine +glucolysis +glucosaemia +glucosamine +glucosan +glucosane +glucosazone +glucose +glucosemia +glucosic +glucosid +glucosidal +glucosidase +glucoside +glucosidic +glucosidically +glucosin +glucosine +glucosone +glucosuria +glucuronic +glue +glued +gluemaker +gluemaking +gluepot +gluer +gluey +glueyness +glug +gluish +gluishness +glum +gluma +Glumaceae +glumaceous +glumal +Glumales +glume +glumiferous +Glumiflorae +glumly +glummy +glumness +glumose +glumosity +glump +glumpily +glumpiness +glumpish +glumpy +glunch +Gluneamie +glusid +gluside +glut +glutamic +glutamine +glutaminic +glutaric +glutathione +glutch +gluteal +glutelin +gluten +glutenin +glutenous +gluteofemoral +gluteoinguinal +gluteoperineal +gluteus +glutin +glutinate +glutination +glutinative +glutinize +glutinose +glutinosity +glutinous +glutinously +glutinousness +glutition +glutoid +glutose +glutter +gluttery +glutting +gluttingly +glutton +gluttoness +gluttonish +gluttonism +gluttonize +gluttonous +gluttonously +gluttonousness +gluttony +glyceraldehyde +glycerate +Glyceria +glyceric +glyceride +glycerin +glycerinate +glycerination +glycerine +glycerinize +glycerite +glycerize +glycerizin +glycerizine +glycerogel +glycerogelatin +glycerol +glycerolate +glycerole +glycerolize +glycerophosphate +glycerophosphoric +glycerose +glyceroxide +glyceryl +glycid +glycide +glycidic +glycidol +Glycine +glycine +glycinin +glycocholate +glycocholic +glycocin +glycocoll +glycogelatin +glycogen +glycogenesis +glycogenetic +glycogenic +glycogenize +glycogenolysis +glycogenous +glycogeny +glycohaemia +glycohemia +glycol +glycolaldehyde +glycolate +glycolic +glycolide +glycolipid +glycolipide +glycolipin +glycolipine +glycoluric +glycoluril +glycolyl +glycolylurea +glycolysis +glycolytic +glycolytically +Glyconian +Glyconic +glyconic +glyconin +glycoproteid +glycoprotein +glycosaemia +glycose +glycosemia +glycosin +glycosine +glycosuria +glycosuric +glycuresis +glycuronic +glycyl +glycyphyllin +Glycyrrhiza +glycyrrhizin +Glynn +glyoxal +glyoxalase +glyoxalic +glyoxalin +glyoxaline +glyoxim +glyoxime +glyoxyl +glyoxylic +glyph +glyphic +glyphograph +glyphographer +glyphographic +glyphography +glyptic +glyptical +glyptician +Glyptodon +glyptodont +Glyptodontidae +glyptodontoid +glyptograph +glyptographer +glyptographic +glyptography +glyptolith +glyptological +glyptologist +glyptology +glyptotheca +Glyptotherium +glyster +Gmelina +gmelinite +gnabble +Gnaeus +gnaphalioid +Gnaphalium +gnar +gnarl +gnarled +gnarliness +gnarly +gnash +gnashingly +gnat +gnatcatcher +gnatflower +gnathal +gnathalgia +gnathic +gnathidium +gnathion +gnathism +gnathite +gnathitis +Gnatho +gnathobase +gnathobasic +Gnathobdellae +Gnathobdellida +gnathometer +gnathonic +gnathonical +gnathonically +gnathonism +gnathonize +gnathophorous +gnathoplasty +gnathopod +Gnathopoda +gnathopodite +gnathopodous +gnathostegite +Gnathostoma +Gnathostomata +gnathostomatous +gnathostome +Gnathostomi +gnathostomous +gnathotheca +gnatling +gnatproof +gnatsnap +gnatsnapper +gnatter +gnatty +gnatworm +gnaw +gnawable +gnawer +gnawing +gnawingly +gnawn +gneiss +gneissic +gneissitic +gneissoid +gneissose +gneissy +Gnetaceae +gnetaceous +Gnetales +Gnetum +gnocchetti +gnome +gnomed +gnomesque +gnomic +gnomical +gnomically +gnomide +gnomish +gnomist +gnomologic +gnomological +gnomologist +gnomology +gnomon +Gnomonia +Gnomoniaceae +gnomonic +gnomonical +gnomonics +gnomonological +gnomonologically +gnomonology +gnosiological +gnosiology +gnosis +Gnostic +gnostic +gnostical +gnostically +Gnosticism +gnosticity +gnosticize +gnosticizer +gnostology +gnu +go +goa +goad +goadsman +goadster +goaf +Goajiro +goal +Goala +goalage +goalee +goalie +goalkeeper +goalkeeping +goalless +goalmouth +Goan +Goanese +goanna +Goasila +goat +goatbeard +goatbrush +goatbush +goatee +goateed +goatfish +goatherd +goatherdess +goatish +goatishly +goatishness +goatland +goatlike +goatling +goatly +goatroot +goatsbane +goatsbeard +goatsfoot +goatskin +goatstone +goatsucker +goatweed +goaty +goave +gob +goback +goban +gobang +gobbe +gobber +gobbet +gobbin +gobbing +gobble +gobbledygook +gobbler +gobby +Gobelin +gobelin +gobernadora +gobi +Gobia +Gobian +gobiesocid +Gobiesocidae +gobiesociform +Gobiesox +gobiid +Gobiidae +gobiiform +Gobiiformes +Gobinism +Gobinist +Gobio +gobioid +Gobioidea +Gobioidei +goblet +gobleted +gobletful +goblin +gobline +goblinesque +goblinish +goblinism +goblinize +goblinry +gobmouthed +gobo +gobonated +gobony +gobstick +goburra +goby +gobylike +gocart +Goclenian +God +god +godchild +Goddam +Goddard +goddard +goddaughter +godded +goddess +goddesshood +goddessship +goddikin +goddize +gode +godet +Godetia +godfather +godfatherhood +godfathership +Godforsaken +Godfrey +Godful +godhead +godhood +Godiva +godkin +godless +godlessly +godlessness +godlet +godlike +godlikeness +godlily +godliness +godling +godly +godmaker +godmaking +godmamma +godmother +godmotherhood +godmothership +godown +godpapa +godparent +Godsake +godsend +godship +godson +godsonship +Godspeed +Godward +Godwin +Godwinian +godwit +goeduck +goel +goelism +Goemagot +Goemot +goer +goes +Goetae +Goethian +goetia +goetic +goetical +goety +goff +goffer +goffered +gofferer +goffering +goffle +gog +gogga +goggan +goggle +goggled +goggler +gogglers +goggly +goglet +Gogo +gogo +Gohila +goi +goiabada +Goidel +Goidelic +going +goitcho +goiter +goitered +goitral +goitrogen +goitrogenic +goitrous +Gokuraku +gol +gola +golach +goladar +golandaas +golandause +Golaseccan +Golconda +Gold +gold +goldbeater +goldbeating +Goldbird +goldbrick +goldbricker +goldbug +goldcrest +goldcup +golden +goldenback +goldeneye +goldenfleece +goldenhair +goldenknop +goldenlocks +goldenly +Goldenmouth +goldenmouthed +goldenness +goldenpert +goldenrod +goldenseal +goldentop +goldenwing +golder +goldfielder +goldfinch +goldfinny +goldfish +goldflower +goldhammer +goldhead +Goldi +Goldic +goldie +goldilocks +goldin +goldish +goldless +goldlike +Goldonian +goldseed +goldsinny +goldsmith +goldsmithery +goldsmithing +goldspink +goldstone +goldtail +goldtit +goldwater +goldweed +goldwork +goldworker +Goldy +goldy +golee +golem +golf +golfdom +golfer +Golgi +Golgotha +goli +goliard +goliardery +goliardic +Goliath +goliath +goliathize +golkakra +Goll +golland +gollar +golliwogg +golly +Golo +goloe +golpe +Goma +gomari +Gomarian +Gomarist +Gomarite +gomart +gomashta +gomavel +gombay +gombeen +gombeenism +gombroon +Gomeisa +gomer +gomeral +gomlah +gommelin +Gomontia +Gomorrhean +Gomphocarpus +gomphodont +Gompholobium +gomphosis +Gomphrena +gomuti +gon +Gona +gonad +gonadal +gonadial +gonadic +gonadotropic +gonadotropin +gonaduct +gonagra +gonakie +gonal +gonalgia +gonangial +gonangium +gonapod +gonapophysal +gonapophysial +gonapophysis +gonarthritis +Gond +gondang +Gondi +gondite +gondola +gondolet +gondolier +gone +goneness +goneoclinic +gonepoiesis +gonepoietic +goner +Goneril +gonesome +gonfalcon +gonfalonier +gonfalonierate +gonfaloniership +gonfanon +gong +gongman +Gongoresque +Gongorism +Gongorist +gongoristic +gonia +goniac +gonial +goniale +Goniaster +goniatite +Goniatites +goniatitic +goniatitid +Goniatitidae +goniatitoid +gonid +gonidangium +gonidia +gonidial +gonidic +gonidiferous +gonidiogenous +gonidioid +gonidiophore +gonidiose +gonidiospore +gonidium +gonimic +gonimium +gonimolobe +gonimous +goniocraniometry +Goniodoridae +Goniodorididae +Goniodoris +goniometer +goniometric +goniometrical +goniometrically +goniometry +gonion +Goniopholidae +Goniopholis +goniostat +goniotropous +gonitis +Gonium +gonium +gonnardite +gonne +gonoblast +gonoblastic +gonoblastidial +gonoblastidium +gonocalycine +gonocalyx +gonocheme +gonochorism +gonochorismal +gonochorismus +gonochoristic +gonococcal +gonococcic +gonococcoid +gonococcus +gonocoel +gonocyte +gonoecium +Gonolobus +gonomere +gonomery +gonophore +gonophoric +gonophorous +gonoplasm +gonopoietic +gonorrhea +gonorrheal +gonorrheic +gonosomal +gonosome +gonosphere +gonostyle +gonotheca +gonothecal +gonotokont +gonotome +gonotype +gonozooid +gony +gonyalgia +gonydeal +gonydial +gonyocele +gonyoncus +gonys +Gonystylaceae +gonystylaceous +Gonystylus +gonytheca +Gonzalo +goo +goober +good +Goodenia +Goodeniaceae +goodeniaceous +Goodenoviaceae +goodhearted +goodheartedly +goodheartedness +gooding +goodish +goodishness +goodlihead +goodlike +goodliness +goodly +goodman +goodmanship +goodness +goods +goodsome +goodwife +goodwill +goodwillit +goodwilly +goody +goodyear +Goodyera +goodyish +goodyism +goodyness +goodyship +goof +goofer +goofily +goofiness +goofy +googly +googol +googolplex +googul +gook +gool +goolah +gools +gooma +goon +goondie +goonie +Goop +goosander +goose +goosebeak +gooseberry +goosebill +goosebird +goosebone +gooseboy +goosecap +goosefish +gooseflower +goosefoot +goosegirl +goosegog +gooseherd +goosehouse +gooselike +goosemouth +gooseneck +goosenecked +gooserumped +goosery +goosetongue +gooseweed +goosewing +goosewinged +goosish +goosishly +goosishness +goosy +gopher +gopherberry +gopherroot +gopherwood +gopura +Gor +gor +gora +goracco +goral +goran +gorb +gorbal +gorbellied +gorbelly +gorbet +gorble +gorblimy +gorce +gorcock +gorcrow +Gordiacea +gordiacean +gordiaceous +Gordian +Gordiidae +Gordioidea +Gordius +gordolobo +Gordon +Gordonia +gordunite +Gordyaean +gore +gorer +gorevan +gorfly +gorge +gorgeable +gorged +gorgedly +gorgelet +gorgeous +gorgeously +gorgeousness +gorger +gorgerin +gorget +gorgeted +gorglin +Gorgon +Gorgonacea +gorgonacean +gorgonaceous +gorgonesque +gorgoneum +Gorgonia +Gorgoniacea +gorgoniacean +gorgoniaceous +Gorgonian +gorgonian +gorgonin +gorgonize +gorgonlike +Gorgonzola +Gorgosaurus +gorhen +goric +gorilla +gorillaship +gorillian +gorilline +gorilloid +gorily +goriness +goring +Gorkhali +Gorkiesque +gorlin +gorlois +gormandize +gormandizer +gormaw +gormed +gorra +gorraf +gorry +gorse +gorsebird +gorsechat +gorsedd +gorsehatch +gorsy +Gortonian +Gortonite +gory +gos +gosain +goschen +gosh +goshawk +Goshen +goshenite +goslarite +goslet +gosling +gosmore +gospel +gospeler +gospelist +gospelize +gospellike +gospelly +gospelmonger +gospelwards +Gosplan +gospodar +gosport +gossamer +gossamered +gossamery +gossampine +gossan +gossaniferous +gossard +gossip +gossipdom +gossipee +gossiper +gossiphood +gossipiness +gossiping +gossipingly +gossipmonger +gossipred +gossipry +gossipy +gossoon +gossy +gossypine +Gossypium +gossypol +gossypose +got +gotch +gote +Goth +Gotha +Gotham +Gothamite +Gothic +Gothically +Gothicism +Gothicist +Gothicity +Gothicize +Gothicizer +Gothicness +Gothish +Gothism +gothite +Gothlander +Gothonic +Gotiglacial +gotra +gotraja +gotten +Gottfried +Gottlieb +gouaree +Gouda +Goudy +gouge +gouger +goujon +goulash +goumi +goup +Goura +gourami +gourd +gourde +gourdful +gourdhead +gourdiness +gourdlike +gourdworm +gourdy +Gourinae +gourmand +gourmander +gourmanderie +gourmandism +gourmet +gourmetism +gourounut +goustrous +gousty +gout +goutify +goutily +goutiness +goutish +goutte +goutweed +goutwort +gouty +gove +govern +governability +governable +governableness +governably +governail +governance +governess +governessdom +governesshood +governessy +governing +governingly +government +governmental +governmentalism +governmentalist +governmentalize +governmentally +governmentish +governor +governorate +governorship +gowan +gowdnie +gowf +gowfer +gowiddie +gowk +gowked +gowkedly +gowkedness +gowkit +gowl +gown +gownlet +gownsman +gowpen +goy +Goyana +goyazite +Goyetian +goyim +goyin +goyle +gozell +gozzard +gra +Graafian +grab +grabbable +grabber +grabble +grabbler +grabbling +grabbots +graben +grabhook +grabouche +Grace +grace +graceful +gracefully +gracefulness +graceless +gracelessly +gracelessness +gracelike +gracer +Gracilaria +gracilariid +Gracilariidae +gracile +gracileness +gracilescent +gracilis +gracility +graciosity +gracioso +gracious +graciously +graciousness +grackle +Graculus +grad +gradable +gradal +gradate +gradation +gradational +gradationally +gradationately +gradative +gradatively +gradatory +graddan +grade +graded +gradefinder +gradely +grader +Gradgrind +gradgrind +Gradgrindian +Gradgrindish +Gradgrindism +gradient +gradienter +Gradientia +gradin +gradine +grading +gradiometer +gradiometric +gradometer +gradual +gradualism +gradualist +gradualistic +graduality +gradually +gradualness +graduand +graduate +graduated +graduateship +graduatical +graduating +graduation +graduator +gradus +Graeae +Graeculus +Graeme +graff +graffage +graffer +Graffias +graffito +grafship +graft +graftage +graftdom +grafted +grafter +grafting +graftonite +graftproof +Graham +graham +grahamite +Graian +grail +grailer +grailing +grain +grainage +grained +grainedness +grainer +grainering +grainery +grainfield +graininess +graining +grainland +grainless +grainman +grainsick +grainsickness +grainsman +grainways +grainy +graip +graisse +graith +Grallae +Grallatores +grallatorial +grallatory +grallic +Grallina +gralline +gralloch +gram +grama +gramarye +gramashes +grame +gramenite +gramicidin +Graminaceae +graminaceous +Gramineae +gramineal +gramineous +gramineousness +graminicolous +graminiferous +graminifolious +graminiform +graminin +graminivore +graminivorous +graminological +graminology +graminous +grammalogue +grammar +grammarian +grammarianism +grammarless +grammatic +grammatical +grammatically +grammaticalness +grammaticaster +grammaticism +grammaticize +grammatics +grammatist +grammatistical +grammatite +grammatolator +grammatolatry +Grammatophyllum +gramme +Grammontine +gramoches +Gramophone +gramophone +gramophonic +gramophonical +gramophonically +gramophonist +gramp +grampa +grampus +granada +granadilla +granadillo +Granadine +granage +granary +granate +granatum +granch +grand +grandam +grandame +grandaunt +grandchild +granddad +granddaddy +granddaughter +granddaughterly +grandee +grandeeism +grandeeship +grandesque +grandeur +grandeval +grandfather +grandfatherhood +grandfatherish +grandfatherless +grandfatherly +grandfathership +grandfer +grandfilial +grandiloquence +grandiloquent +grandiloquently +grandiloquous +grandiose +grandiosely +grandiosity +grandisonant +Grandisonian +Grandisonianism +grandisonous +grandly +grandma +grandmaternal +Grandmontine +grandmother +grandmotherhood +grandmotherism +grandmotherliness +grandmotherly +grandnephew +grandness +grandniece +grandpa +grandparent +grandparentage +grandparental +grandpaternal +grandsire +grandson +grandsonship +grandstand +grandstander +granduncle +grane +grange +granger +grangerism +grangerite +grangerization +grangerize +grangerizer +Grangousier +graniform +granilla +granite +granitelike +graniteware +granitic +granitical +graniticoline +granitiferous +granitification +granitiform +granitite +granitization +granitize +granitoid +granivore +granivorous +granjeno +grank +grannom +granny +grannybush +grano +granoblastic +granodiorite +granogabbro +granolite +granolith +granolithic +granomerite +granophyre +granophyric +granose +granospherite +Grant +grant +grantable +grantedly +grantee +granter +Granth +Grantha +Grantia +Grantiidae +grantor +granula +granular +granularity +granularly +granulary +granulate +granulated +granulater +granulation +granulative +granulator +granule +granulet +granuliferous +granuliform +granulite +granulitic +granulitis +granulitization +granulitize +granulize +granuloadipose +granulocyte +granuloma +granulomatous +granulometric +granulosa +granulose +granulous +Granville +granza +granzita +grape +graped +grapeflower +grapefruit +grapeful +grapeless +grapelet +grapelike +grapenuts +graperoot +grapery +grapeshot +grapeskin +grapestalk +grapestone +grapevine +grapewise +grapewort +graph +graphalloy +graphic +graphical +graphically +graphicalness +graphicly +graphicness +graphics +Graphidiaceae +Graphiola +graphiological +graphiologist +graphiology +Graphis +graphite +graphiter +graphitic +graphitization +graphitize +graphitoid +graphitoidal +Graphium +graphologic +graphological +graphologist +graphology +graphomania +graphomaniac +graphometer +graphometric +graphometrical +graphometry +graphomotor +Graphophone +graphophone +graphophonic +graphorrhea +graphoscope +graphospasm +graphostatic +graphostatical +graphostatics +graphotype +graphotypic +graphy +graping +grapnel +grappa +grapple +grappler +grappling +Grapsidae +grapsoid +Grapsus +Grapta +graptolite +Graptolitha +Graptolithida +Graptolithina +graptolitic +Graptolitoidea +Graptoloidea +graptomancy +grapy +grasp +graspable +grasper +grasping +graspingly +graspingness +graspless +grass +grassant +grassation +grassbird +grasschat +grasscut +grasscutter +grassed +grasser +grasset +grassflat +grassflower +grasshop +grasshopper +grasshopperdom +grasshopperish +grasshouse +grassiness +grassing +grassland +grassless +grasslike +grassman +grassnut +grassplot +grassquit +grasswards +grassweed +grasswidowhood +grasswork +grassworm +grassy +grat +grate +grateful +gratefully +gratefulness +grateless +grateman +grater +gratewise +grather +Gratia +Gratiano +graticulate +graticulation +graticule +gratification +gratified +gratifiedly +gratifier +gratify +gratifying +gratifyingly +gratility +gratillity +gratinate +grating +Gratiola +gratiolin +gratiosolin +gratis +gratitude +gratten +grattoir +gratuitant +gratuitous +gratuitously +gratuitousness +gratuity +gratulant +gratulate +gratulation +gratulatorily +gratulatory +graupel +gravamen +gravamina +grave +graveclod +gravecloth +graveclothes +graved +gravedigger +gravegarth +gravel +graveless +gravelike +graveling +gravelish +gravelliness +gravelly +gravelroot +gravelstone +gravelweed +gravely +gravemaker +gravemaking +graveman +gravemaster +graven +graveness +Gravenstein +graveolence +graveolency +graveolent +graver +Graves +graveship +graveside +gravestead +gravestone +graveward +gravewards +graveyard +gravic +gravicembalo +gravid +gravidity +gravidly +gravidness +Gravigrada +gravigrade +gravimeter +gravimetric +gravimetrical +gravimetrically +gravimetry +graving +gravitate +gravitater +gravitation +gravitational +gravitationally +gravitative +gravitometer +gravity +gravure +gravy +grawls +gray +grayback +graybeard +graycoat +grayfish +grayfly +grayhead +grayish +graylag +grayling +grayly +graymalkin +graymill +grayness +graypate +graywacke +grayware +graywether +grazable +graze +grazeable +grazer +grazier +grazierdom +graziery +grazing +grazingly +grease +greasebush +greasehorn +greaseless +greaselessness +greaseproof +greaseproofness +greaser +greasewood +greasily +greasiness +greasy +great +greatcoat +greatcoated +greaten +greater +greathead +greatheart +greathearted +greatheartedness +greatish +greatly +greatmouthed +greatness +greave +greaved +greaves +grebe +Grebo +grece +Grecian +Grecianize +Grecism +Grecize +Grecomania +Grecomaniac +Grecophil +gree +greed +greedily +greediness +greedless +greedsome +greedy +greedygut +greedyguts +Greek +Greekdom +Greekery +Greekess +Greekish +Greekism +Greekist +Greekize +Greekless +Greekling +green +greenable +greenage +greenalite +greenback +Greenbacker +Greenbackism +greenbark +greenbone +greenbrier +Greencloth +greencoat +greener +greenery +greeney +greenfinch +greenfish +greengage +greengill +greengrocer +greengrocery +greenhead +greenheaded +greenheart +greenhearted +greenhew +greenhide +greenhood +greenhorn +greenhornism +greenhouse +greening +greenish +greenishness +greenkeeper +greenkeeping +Greenland +Greenlander +Greenlandic +Greenlandish +greenlandite +Greenlandman +greenleek +greenless +greenlet +greenling +greenly +greenness +greenockite +greenovite +greenroom +greensand +greensauce +greenshank +greensick +greensickness +greenside +greenstone +greenstuff +greensward +greenswarded +greentail +greenth +greenuk +greenweed +Greenwich +greenwing +greenwithe +greenwood +greenwort +greeny +greenyard +greet +greeter +greeting +greetingless +greetingly +greffier +greffotome +Greg +gregal +gregale +gregaloid +gregarian +gregarianism +Gregarina +Gregarinae +Gregarinaria +gregarine +Gregarinida +gregarinidal +gregariniform +Gregarinina +Gregarinoidea +gregarinosis +gregarinous +gregarious +gregariously +gregariousness +gregaritic +grege +Gregg +Gregge +greggle +grego +Gregor +Gregorian +Gregorianist +Gregorianize +Gregorianizer +Gregory +greige +grein +greisen +gremial +gremlin +grenade +Grenadian +grenadier +grenadierial +grenadierly +grenadiership +grenadin +grenadine +Grendel +Grenelle +Gressoria +gressorial +gressorious +Greta +Gretchen +Gretel +greund +Grevillea +grew +grewhound +Grewia +grey +greyhound +Greyiaceae +greyly +greyness +gribble +grice +grid +griddle +griddlecake +griddler +gride +gridelin +gridiron +griece +grieced +grief +griefful +grieffully +griefless +grieflessness +grieshoch +grievance +grieve +grieved +grievedly +griever +grieveship +grieving +grievingly +grievous +grievously +grievousness +Griff +griff +griffade +griffado +griffaun +griffe +griffin +griffinage +griffinesque +griffinhood +griffinish +griffinism +Griffith +griffithite +Griffon +griffon +griffonage +griffonne +grift +grifter +grig +griggles +grignet +grigri +grihastha +grihyasutra +grike +grill +grillade +grillage +grille +grilled +griller +grillroom +grillwork +grilse +grim +grimace +grimacer +grimacier +grimacing +grimacingly +grimalkin +grime +grimful +grimgribber +grimily +griminess +grimliness +grimly +grimme +Grimmia +Grimmiaceae +grimmiaceous +grimmish +grimness +grimp +grimy +grin +grinagog +grinch +grind +grindable +Grindelia +grinder +grinderman +grindery +grinding +grindingly +grindle +grindstone +gringo +gringolee +gringophobia +Grinnellia +grinner +grinning +grinningly +grinny +grintern +grip +gripe +gripeful +griper +gripgrass +griphite +Griphosaurus +griping +gripingly +gripless +gripman +gripment +grippal +grippe +gripper +grippiness +gripping +grippingly +grippingness +gripple +grippleness +grippotoxin +grippy +gripsack +gripy +Griqua +griquaite +Griqualander +gris +grisaille +grisard +Griselda +griseous +grisette +grisettish +grisgris +griskin +grisliness +grisly +Grison +grison +grisounite +grisoutine +Grissel +grissens +grissons +grist +gristbite +grister +Gristhorbia +gristle +gristliness +gristly +gristmill +gristmiller +gristmilling +gristy +grit +grith +grithbreach +grithman +gritless +gritrock +grits +gritstone +gritten +gritter +grittily +grittiness +grittle +gritty +grivet +grivna +Grizel +Grizzel +grizzle +grizzled +grizzler +grizzly +grizzlyman +groan +groaner +groanful +groaning +groaningly +groat +groats +groatsworth +grobian +grobianism +grocer +grocerdom +groceress +grocerly +grocerwise +grocery +groceryman +Groenendael +groff +grog +groggery +groggily +grogginess +groggy +grogram +grogshop +groin +groined +groinery +groining +Grolier +Grolieresque +gromatic +gromatics +Gromia +grommet +gromwell +groom +groomer +groomish +groomishly +groomlet +groomling +groomsman +groomy +groop +groose +groot +grooty +groove +grooveless +groovelike +groover +grooverhead +grooviness +grooving +groovy +grope +groper +groping +gropingly +gropple +grorudite +gros +grosbeak +groschen +groser +groset +grosgrain +grosgrained +gross +grossart +grossen +grosser +grossification +grossify +grossly +grossness +grosso +grossulaceous +grossular +Grossularia +grossularia +Grossulariaceae +grossulariaceous +grossularious +grossularite +grosz +groszy +grot +grotesque +grotesquely +grotesqueness +grotesquerie +grothine +grothite +Grotian +Grotianism +grottesco +grotto +grottoed +grottolike +grottowork +grouch +grouchily +grouchiness +grouchingly +grouchy +grouf +grough +ground +groundable +groundably +groundage +groundberry +groundbird +grounded +groundedly +groundedness +groundenell +grounder +groundflower +grounding +groundless +groundlessly +groundlessness +groundliness +groundling +groundly +groundman +groundmass +groundneedle +groundnut +groundplot +grounds +groundsel +groundsill +groundsman +groundward +groundwood +groundwork +groundy +group +groupage +groupageness +grouped +grouper +grouping +groupist +grouplet +groupment +groupwise +grouse +grouseberry +grouseless +grouser +grouseward +grousewards +grousy +grout +grouter +grouthead +grouts +grouty +grouze +grove +groved +grovel +groveler +groveless +groveling +grovelingly +grovelings +grovy +grow +growable +growan +growed +grower +growing +growingly +growingupness +growl +growler +growlery +growling +growlingly +growly +grown +grownup +growse +growsome +growth +growthful +growthiness +growthless +growthy +grozart +grozet +grr +grub +grubbed +grubber +grubbery +grubbily +grubbiness +grubby +grubhood +grubless +grubroot +grubs +grubstake +grubstaker +Grubstreet +grubstreet +grubworm +grudge +grudgeful +grudgefully +grudgekin +grudgeless +grudger +grudgery +grudging +grudgingly +grudgingness +grudgment +grue +gruel +grueler +grueling +gruelly +Grues +gruesome +gruesomely +gruesomeness +gruff +gruffily +gruffiness +gruffish +gruffly +gruffness +gruffs +gruffy +grufted +grugru +Gruidae +gruiform +Gruiformes +gruine +Gruis +grum +grumble +grumbler +grumblesome +Grumbletonian +grumbling +grumblingly +grumbly +grume +Grumium +grumly +grummel +grummels +grummet +grummeter +grumness +grumose +grumous +grumousness +grump +grumph +grumphie +grumphy +grumpily +grumpiness +grumpish +grumpy +grun +Grundified +Grundlov +grundy +Grundyism +Grundyist +Grundyite +grunerite +gruneritization +grunion +grunt +grunter +Grunth +grunting +gruntingly +gruntle +gruntled +gruntling +Grus +grush +grushie +Grusian +Grusinian +gruss +grutch +grutten +gryde +grylli +gryllid +Gryllidae +gryllos +Gryllotalpa +Gryllus +gryllus +grypanian +Gryphaea +Gryphosaurus +gryposis +Grypotherium +grysbok +guaba +guacacoa +guachamaca +guacharo +guachipilin +Guacho +Guacico +guacimo +guacin +guaco +guaconize +Guadagnini +guadalcazarite +Guaharibo +Guahiban +Guahibo +Guahivo +guaiac +guaiacol +guaiacolize +guaiaconic +guaiacum +guaiaretic +guaiasanol +guaiol +guaka +Gualaca +guama +guan +Guana +guana +guanabana +guanabano +guanaco +guanajuatite +guanamine +guanase +guanay +Guanche +guaneide +guango +guanidine +guanidopropionic +guaniferous +guanine +guanize +guano +guanophore +guanosine +guanyl +guanylic +guao +guapena +guapilla +guapinol +Guaque +guar +guara +guarabu +guaracha +guaraguao +guarana +Guarani +guarani +Guaranian +guaranine +guarantee +guaranteeship +guarantor +guarantorship +guaranty +guarapucu +Guaraunan +Guarauno +guard +guardable +guardant +guarded +guardedly +guardedness +guardeen +guarder +guardfish +guardful +guardfully +guardhouse +guardian +guardiancy +guardianess +guardianless +guardianly +guardianship +guarding +guardingly +guardless +guardlike +guardo +guardrail +guardroom +guardship +guardsman +guardstone +Guarea +guariba +guarinite +guarneri +Guarnerius +Guarnieri +Guarrau +guarri +Guaruan +guasa +Guastalline +guatambu +Guatemalan +Guatemaltecan +guativere +Guato +Guatoan +Guatusan +Guatuso +Guauaenok +guava +guavaberry +guavina +guayaba +guayabi +guayabo +guayacan +Guayaqui +Guaycuru +Guaycuruan +Guaymie +guayroto +guayule +guaza +Guazuma +gubbertush +Gubbin +gubbo +gubernacula +gubernacular +gubernaculum +gubernative +gubernator +gubernatorial +gubernatrix +guberniya +gucki +gud +gudame +guddle +gude +gudebrother +gudefather +gudemother +gudesake +gudesakes +gudesire +gudewife +gudge +gudgeon +gudget +gudok +gue +guebucu +guejarite +Guelph +Guelphic +Guelphish +Guelphism +guemal +guenepe +guenon +guepard +guerdon +guerdonable +guerdoner +guerdonless +guereza +Guerickian +Guerinet +Guernsey +guernsey +guernseyed +guerrilla +guerrillaism +guerrillaship +Guesdism +Guesdist +guess +guessable +guesser +guessing +guessingly +guesswork +guessworker +guest +guestchamber +guesten +guester +guesthouse +guesting +guestive +guestless +Guestling +guestling +guestmaster +guestship +guestwise +Guetar +Guetare +gufa +guff +guffaw +guffer +guffin +guffy +gugal +guggle +gugglet +guglet +guglia +guglio +gugu +Guha +Guhayna +guhr +Guiana +Guianan +Guianese +guib +guiba +guidable +guidage +guidance +guide +guideboard +guidebook +guidebookish +guidecraft +guideless +guideline +guidepost +guider +guideress +guidership +guideship +guideway +guidman +Guido +guidon +Guidonian +guidwilly +guige +Guignardia +guignol +guijo +Guilandina +guild +guilder +guildhall +guildic +guildry +guildship +guildsman +guile +guileful +guilefully +guilefulness +guileless +guilelessly +guilelessness +guilery +guillemet +guillemot +Guillermo +guillevat +guilloche +guillochee +guillotinade +guillotine +guillotinement +guillotiner +guillotinism +guillotinist +guilt +guiltily +guiltiness +guiltless +guiltlessly +guiltlessness +guiltsick +guilty +guily +guimbard +guimpe +Guinea +guinea +Guineaman +Guinean +Guinevere +guipure +Guisard +guisard +guise +guiser +Guisian +guising +guitar +guitarfish +guitarist +guitermanite +guitguit +Guittonian +Gujar +Gujarati +Gujrati +gul +gula +gulae +gulaman +gulancha +Gulanganes +gular +gularis +gulch +gulden +guldengroschen +gule +gules +Gulf +gulf +gulflike +gulfside +gulfwards +gulfweed +gulfy +gulgul +gulinula +gulinulae +gulinular +gulix +gull +Gullah +gullery +gullet +gulleting +gullibility +gullible +gullibly +gullion +gullish +gullishly +gullishness +gully +gullyhole +Gulo +gulonic +gulose +gulosity +gulp +gulper +gulpin +gulping +gulpingly +gulpy +gulravage +gulsach +Gum +gum +gumbo +gumboil +gumbotil +gumby +gumchewer +gumdigger +gumdigging +gumdrop +gumfield +gumflower +gumihan +gumless +gumlike +gumly +gumma +gummage +gummaker +gummaking +gummata +gummatous +gummed +gummer +gummiferous +gumminess +gumming +gummite +gummose +gummosis +gummosity +gummous +gummy +gump +gumphion +gumption +gumptionless +gumptious +gumpus +gumshoe +gumweed +gumwood +gun +guna +gunate +gunation +gunbearer +gunboat +gunbright +gunbuilder +guncotton +gundi +gundy +gunebo +gunfire +gunflint +gunge +gunhouse +Gunite +gunite +gunj +gunk +gunl +gunless +gunlock +gunmaker +gunmaking +gunman +gunmanship +gunnage +Gunnar +gunne +gunnel +gunner +Gunnera +Gunneraceae +gunneress +gunnership +gunnery +gunnies +gunning +gunnung +gunny +gunocracy +gunong +gunpaper +gunplay +gunpowder +gunpowderous +gunpowdery +gunpower +gunrack +gunreach +gunrunner +gunrunning +gunsel +gunshop +gunshot +gunsman +gunsmith +gunsmithery +gunsmithing +gunster +gunstick +gunstock +gunstocker +gunstocking +gunstone +Gunter +gunter +Gunther +gunwale +gunyah +gunyang +gunyeh +Gunz +Gunzian +gup +guppy +guptavidya +gur +Guran +gurdfish +gurdle +gurdwara +gurge +gurgeon +gurgeons +gurges +gurgitation +gurgle +gurglet +gurgling +gurglingly +gurgly +gurgoyle +gurgulation +Gurian +Guric +Gurish +Gurjara +gurjun +gurk +Gurkha +gurl +gurly +Gurmukhi +gurnard +gurnet +gurnetty +Gurneyite +gurniad +gurr +gurrah +gurry +gurt +guru +guruship +Gus +gush +gusher +gushet +gushily +gushiness +gushing +gushingly +gushingness +gushy +gusla +gusle +guss +gusset +Gussie +gussie +gust +gustable +gustation +gustative +gustativeness +gustatory +Gustavus +gustful +gustfully +gustfulness +gustily +gustiness +gustless +gusto +gustoish +Gustus +gusty +gut +Guti +Gutium +gutless +gutlike +gutling +Gutnic +Gutnish +gutt +gutta +guttable +guttate +guttated +guttatim +guttation +gutte +gutter +Guttera +gutterblood +guttering +gutterlike +gutterling +gutterman +guttersnipe +guttersnipish +gutterspout +gutterwise +guttery +gutti +guttide +guttie +Guttiferae +guttiferal +Guttiferales +guttiferous +guttiform +guttiness +guttle +guttler +guttula +guttulae +guttular +guttulate +guttule +guttural +gutturalism +gutturality +gutturalization +gutturalize +gutturally +gutturalness +gutturize +gutturonasal +gutturopalatal +gutturopalatine +gutturotetany +guttus +gutty +gutweed +gutwise +gutwort +guvacine +guvacoline +Guy +guy +Guyandot +guydom +guyer +guytrash +guz +guze +Guzmania +guzmania +Guzul +guzzle +guzzledom +guzzler +gwag +gweduc +gweed +gweeon +gwely +Gwen +Gwendolen +gwine +gwyniad +Gyarung +gyascutus +Gyges +Gygis +gyle +gym +gymel +gymkhana +Gymnadenia +Gymnadeniopsis +Gymnanthes +gymnanthous +Gymnarchidae +Gymnarchus +gymnasia +gymnasial +gymnasiarch +gymnasiarchy +gymnasiast +gymnasic +gymnasium +gymnast +gymnastic +gymnastically +gymnastics +gymnemic +gymnetrous +gymnic +gymnical +gymnics +gymnite +Gymnoblastea +gymnoblastic +Gymnocalycium +gymnocarpic +gymnocarpous +Gymnocerata +gymnoceratous +gymnocidium +Gymnocladus +Gymnoconia +Gymnoderinae +Gymnodiniaceae +gymnodiniaceous +Gymnodiniidae +Gymnodinium +gymnodont +Gymnodontes +gymnogen +gymnogenous +Gymnoglossa +gymnoglossate +gymnogynous +Gymnogyps +Gymnolaema +Gymnolaemata +gymnolaematous +Gymnonoti +Gymnopaedes +gymnopaedic +gymnophiona +gymnoplast +Gymnorhina +gymnorhinal +Gymnorhininae +gymnosoph +gymnosophist +gymnosophy +gymnosperm +Gymnospermae +gymnospermal +gymnospermic +gymnospermism +Gymnospermous +gymnospermy +Gymnosporangium +gymnospore +gymnosporous +Gymnostomata +Gymnostomina +gymnostomous +Gymnothorax +gymnotid +Gymnotidae +Gymnotoka +gymnotokous +Gymnotus +Gymnura +gymnure +Gymnurinae +gymnurine +gympie +gyn +gynaecea +gynaeceum +gynaecocoenic +gynander +gynandrarchic +gynandrarchy +Gynandria +gynandria +gynandrian +gynandrism +gynandroid +gynandromorph +gynandromorphic +gynandromorphism +gynandromorphous +gynandromorphy +gynandrophore +gynandrosporous +gynandrous +gynandry +gynantherous +gynarchic +gynarchy +gyne +gynecic +gynecidal +gynecide +gynecocentric +gynecocracy +gynecocrat +gynecocratic +gynecocratical +gynecoid +gynecolatry +gynecologic +gynecological +gynecologist +gynecology +gynecomania +gynecomastia +gynecomastism +gynecomasty +gynecomazia +gynecomorphous +gyneconitis +gynecopathic +gynecopathy +gynecophore +gynecophoric +gynecophorous +gynecotelic +gynecratic +gyneocracy +gyneolater +gyneolatry +gynephobia +Gynerium +gynethusia +gyniatrics +gyniatry +gynic +gynics +gynobase +gynobaseous +gynobasic +gynocardia +gynocardic +gynocracy +gynocratic +gynodioecious +gynodioeciously +gynodioecism +gynoecia +gynoecium +gynogenesis +gynomonecious +gynomonoeciously +gynomonoecism +gynophagite +gynophore +gynophoric +gynosporangium +gynospore +gynostegia +gynostegium +gynostemium +Gynura +gyp +Gypaetus +gype +gypper +Gyppo +Gyps +gyps +gypseian +gypseous +gypsiferous +gypsine +gypsiologist +gypsite +gypsography +gypsologist +gypsology +Gypsophila +gypsophila +gypsophilous +gypsophily +gypsoplast +gypsous +gypster +gypsum +Gypsy +gypsy +gypsydom +gypsyesque +gypsyfy +gypsyhead +gypsyhood +gypsyish +gypsyism +gypsylike +gypsyry +gypsyweed +gypsywise +gypsywort +Gyracanthus +gyral +gyrally +gyrant +gyrate +gyration +gyrational +gyrator +gyratory +gyre +Gyrencephala +gyrencephalate +gyrencephalic +gyrencephalous +gyrene +gyrfalcon +gyri +gyric +gyrinid +Gyrinidae +Gyrinus +gyro +gyrocar +gyroceracone +gyroceran +Gyroceras +gyrochrome +gyrocompass +Gyrodactylidae +Gyrodactylus +gyrogonite +gyrograph +gyroidal +gyroidally +gyrolite +gyrolith +gyroma +gyromagnetic +gyromancy +gyromele +gyrometer +Gyromitra +gyron +gyronny +Gyrophora +Gyrophoraceae +Gyrophoraceous +gyrophoric +gyropigeon +gyroplane +gyroscope +gyroscopic +gyroscopically +gyroscopics +gyrose +gyrostabilizer +Gyrostachys +gyrostat +gyrostatic +gyrostatically +gyrostatics +Gyrotheca +gyrous +gyrovagi +gyrovagues +gyrowheel +gyrus +gyte +gytling +gyve +H +h +ha +haab +haaf +Habab +habanera +Habbe +habble +habdalah +Habe +habeas +habena +habenal +habenar +Habenaria +habendum +habenula +habenular +haberdash +haberdasher +haberdasheress +haberdashery +haberdine +habergeon +habilable +habilatory +habile +habiliment +habilimentation +habilimented +habilitate +habilitation +habilitator +hability +habille +Habiri +Habiru +habit +habitability +habitable +habitableness +habitably +habitacle +habitacule +habitally +habitan +habitance +habitancy +habitant +habitat +habitate +habitation +habitational +habitative +habited +habitual +habituality +habitualize +habitually +habitualness +habituate +habituation +habitude +habitudinal +habitue +habitus +habnab +haboob +Habronema +habronemiasis +habronemic +habu +habutai +habutaye +hache +Hachiman +hachure +hacienda +hack +hackamatak +hackamore +hackbarrow +hackberry +hackbolt +hackbush +hackbut +hackbuteer +hacked +hackee +hacker +hackery +hackin +hacking +hackingly +hackle +hackleback +hackler +hacklog +hackly +hackmack +hackman +hackmatack +hackney +hackneyed +hackneyer +hackneyism +hackneyman +hacksaw +hacksilber +hackster +hackthorn +hacktree +hackwood +hacky +had +Hadassah +hadbot +hadden +haddie +haddo +haddock +haddocker +hade +Hadean +Hadendoa +Hadendowa +hadentomoid +Hadentomoidea +Hades +Hadhramautian +hading +Hadith +hadj +Hadjemi +hadji +hadland +Hadramautian +hadrome +Hadromerina +hadromycosis +hadrosaur +Hadrosaurus +haec +haecceity +Haeckelian +Haeckelism +haem +Haemamoeba +Haemanthus +Haemaphysalis +haemaspectroscope +haematherm +haemathermal +haemathermous +haematinon +haematinum +haematite +Haematobranchia +haematobranchiate +Haematocrya +haematocryal +Haematophilina +haematophiline +Haematopus +haematorrhachis +haematosepsis +Haematotherma +haematothermal +haematoxylic +haematoxylin +Haematoxylon +haemoconcentration +haemodilution +Haemodoraceae +haemodoraceous +haemoglobin +haemogram +Haemogregarina +Haemogregarinidae +haemonchiasis +haemonchosis +Haemonchus +haemony +haemophile +Haemoproteus +haemorrhage +haemorrhagia +haemorrhagic +haemorrhoid +haemorrhoidal +haemosporid +Haemosporidia +haemosporidian +Haemosporidium +Haemulidae +haemuloid +haeremai +haet +haff +haffet +haffkinize +haffle +Hafgan +hafiz +hafnium +hafnyl +haft +hafter +hag +Haganah +Hagarite +hagberry +hagboat +hagborn +hagbush +hagdon +hageen +Hagenia +hagfish +haggada +haggaday +haggadic +haggadical +haggadist +haggadistic +haggard +haggardly +haggardness +hagged +hagger +haggis +haggish +haggishly +haggishness +haggister +haggle +haggler +haggly +haggy +hagi +hagia +hagiarchy +hagiocracy +Hagiographa +hagiographal +hagiographer +hagiographic +hagiographical +hagiographist +hagiography +hagiolater +hagiolatrous +hagiolatry +hagiologic +hagiological +hagiologist +hagiology +hagiophobia +hagioscope +hagioscopic +haglet +haglike +haglin +hagride +hagrope +hagseed +hagship +hagstone +hagtaper +hagweed +hagworm +hah +Hahnemannian +Hahnemannism +Haiathalah +Haida +Haidan +Haidee +haidingerite +Haiduk +haik +haikai +haikal +Haikh +haikwan +hail +hailer +hailproof +hailse +hailshot +hailstone +hailstorm +hailweed +haily +Haimavati +hain +Hainai +Hainan +Hainanese +hainberry +haine +hair +hairband +hairbeard +hairbird +hairbrain +hairbreadth +hairbrush +haircloth +haircut +haircutter +haircutting +hairdo +hairdress +hairdresser +hairdressing +haire +haired +hairen +hairhoof +hairhound +hairif +hairiness +hairlace +hairless +hairlessness +hairlet +hairline +hairlock +hairmeal +hairmonger +hairpin +hairsplitter +hairsplitting +hairspring +hairstone +hairstreak +hairtail +hairup +hairweed +hairwood +hairwork +hairworm +hairy +Haisla +Haithal +Haitian +haje +hajib +hajilij +hak +hakam +hakdar +hake +Hakea +hakeem +hakenkreuz +Hakenkreuzler +hakim +Hakka +hako +haku +Hal +hala +halakah +halakic +halakist +halakistic +halal +halalcor +halation +Halawi +halazone +halberd +halberdier +halberdman +halberdsman +halbert +halch +halcyon +halcyonian +halcyonic +Halcyonidae +Halcyoninae +halcyonine +Haldanite +hale +halebi +Halecomorphi +haleness +Halenia +haler +halerz +Halesia +halesome +half +halfback +halfbeak +halfer +halfheaded +halfhearted +halfheartedly +halfheartedness +halfling +halfman +halfness +halfpace +halfpaced +halfpenny +halfpennyworth +halfway +halfwise +Haliaeetus +halibios +halibiotic +halibiu +halibut +halibuter +Halicarnassean +Halicarnassian +Halichondriae +halichondrine +halichondroid +Halicore +Halicoridae +halide +halidom +halieutic +halieutically +halieutics +Haligonian +Halimeda +halimous +halinous +haliographer +haliography +Haliotidae +Haliotis +haliotoid +haliplankton +haliplid +Haliplidae +Haliserites +halisteresis +halisteretic +halite +Halitheriidae +Halitherium +halitosis +halituosity +halituous +halitus +hall +hallabaloo +hallage +hallah +hallan +hallanshaker +hallebardier +hallecret +halleflinta +halleflintoid +hallel +hallelujah +hallelujatic +hallex +Halleyan +halliblash +halling +hallman +hallmark +hallmarked +hallmarker +hallmoot +halloo +Hallopididae +hallopodous +Hallopus +hallow +Hallowday +hallowed +hallowedly +hallowedness +Halloween +hallower +Hallowmas +Hallowtide +halloysite +Hallstatt +Hallstattian +hallucal +hallucinate +hallucination +hallucinational +hallucinative +hallucinator +hallucinatory +hallucined +hallucinosis +hallux +hallway +halma +halmalille +halmawise +halo +Haloa +Halobates +halobios +halobiotic +halochromism +halochromy +Halocynthiidae +haloesque +halogen +halogenate +halogenation +halogenoid +halogenous +Halogeton +halohydrin +haloid +halolike +halolimnic +halomancy +halometer +halomorphic +halophile +halophilism +halophilous +halophyte +halophytic +halophytism +Halopsyche +Halopsychidae +Haloragidaceae +haloragidaceous +Halosauridae +Halosaurus +haloscope +Halosphaera +halotrichite +haloxene +hals +halse +halsen +halsfang +halt +halter +halterbreak +halteres +Halteridium +halterproof +Haltica +halting +haltingly +haltingness +haltless +halucket +halukkah +halurgist +halurgy +halutz +halvaner +halvans +halve +halved +halvelings +halver +halves +halyard +Halysites +ham +hamacratic +Hamadan +hamadryad +Hamal +hamal +hamald +Hamamelidaceae +hamamelidaceous +Hamamelidanthemum +hamamelidin +Hamamelidoxylon +hamamelin +Hamamelis +Hamamelites +hamartiologist +hamartiology +hamartite +hamate +hamated +Hamathite +hamatum +hambergite +hamble +hambroline +hamburger +hame +hameil +hamel +Hamelia +hamesucken +hamewith +hamfat +hamfatter +hami +Hamidian +Hamidieh +hamiform +Hamilton +Hamiltonian +Hamiltonianism +Hamiltonism +hamingja +hamirostrate +Hamital +Hamite +Hamites +Hamitic +Hamiticized +Hamitism +Hamitoid +hamlah +hamlet +hamleted +hamleteer +hamletization +hamletize +hamlinite +hammada +hammam +hammer +hammerable +hammerbird +hammercloth +hammerdress +hammerer +hammerfish +hammerhead +hammerheaded +hammering +hammeringly +hammerkop +hammerless +hammerlike +hammerman +hammersmith +hammerstone +hammertoe +hammerwise +hammerwork +hammerwort +hammochrysos +hammock +hammy +hamose +hamous +hamper +hamperedly +hamperedness +hamperer +hamperman +Hampshire +hamrongite +hamsa +hamshackle +hamster +hamstring +hamular +hamulate +hamule +Hamulites +hamulose +hamulus +hamus +hamza +han +Hanafi +Hanafite +hanaper +hanaster +Hanbalite +hanbury +hance +hanced +hanch +hancockite +hand +handbag +handball +handballer +handbank +handbanker +handbarrow +handbill +handblow +handbolt +handbook +handbow +handbreadth +handcar +handcart +handclap +handclasp +handcloth +handcraft +handcraftman +handcraftsman +handcuff +handed +handedness +Handelian +hander +handersome +handfast +handfasting +handfastly +handfastness +handflower +handful +handgrasp +handgravure +handgrip +handgriping +handgun +handhaving +handhold +handhole +handicap +handicapped +handicapper +handicraft +handicraftship +handicraftsman +handicraftsmanship +handicraftswoman +handicuff +handily +handiness +handistroke +handiwork +handkercher +handkerchief +handkerchiefful +handlaid +handle +handleable +handled +handleless +handler +handless +handlike +handling +handmade +handmaid +handmaiden +handmaidenly +handout +handpost +handprint +handrail +handrailing +handreader +handreading +handsale +handsaw +handsbreadth +handscrape +handsel +handseller +handset +handshake +handshaker +handshaking +handsmooth +handsome +handsomeish +handsomely +handsomeness +handspade +handspike +handspoke +handspring +handstaff +handstand +handstone +handstroke +handwear +handwheel +handwhile +handwork +handworkman +handwrist +handwrite +handwriting +handy +handyblow +handybook +handygrip +hangability +hangable +hangalai +hangar +hangbird +hangby +hangdog +hange +hangee +hanger +hangfire +hangie +hanging +hangingly +hangkang +hangle +hangman +hangmanship +hangment +hangnail +hangnest +hangout +hangul +hangwoman +hangworm +hangworthy +hanif +hanifism +hanifite +hanifiya +Hank +hank +hanker +hankerer +hankering +hankeringly +hankie +hankle +hanksite +hanky +hanna +hannayite +Hannibal +Hannibalian +Hannibalic +Hano +Hanoverian +Hanoverianize +Hanoverize +Hans +hansa +Hansard +Hansardization +Hansardize +Hanse +hanse +Hanseatic +hansel +hansgrave +hansom +hant +hantle +Hanukkah +Hanuman +hao +haole +haoma +haori +hap +Hapale +Hapalidae +hapalote +Hapalotis +hapaxanthous +haphazard +haphazardly +haphazardness +haphtarah +Hapi +hapless +haplessly +haplessness +haplite +haplocaulescent +haplochlamydeous +Haplodoci +Haplodon +haplodont +haplodonty +haplography +haploid +haploidic +haploidy +haplolaly +haplologic +haplology +haploma +Haplomi +haplomid +haplomous +haplont +haploperistomic +haploperistomous +haplopetalous +haplophase +haplophyte +haploscope +haploscopic +haplosis +haplostemonous +haplotype +haply +happen +happening +happenstance +happier +happiest +happify +happiless +happily +happiness +happing +happy +hapten +haptene +haptenic +haptere +hapteron +haptic +haptics +haptometer +haptophor +haptophoric +haptophorous +haptotropic +haptotropically +haptotropism +hapu +hapuku +haqueton +harakeke +harangue +harangueful +haranguer +Hararese +Harari +harass +harassable +harassedly +harasser +harassingly +harassment +haratch +Haratin +Haraya +Harb +harbergage +harbi +harbinge +harbinger +harbingership +harbingery +harbor +harborage +harborer +harborless +harborous +harborside +harborward +hard +hardanger +hardback +hardbake +hardbeam +hardberry +harden +hardenable +Hardenbergia +hardener +hardening +hardenite +harder +Harderian +hardfern +hardfist +hardfisted +hardfistedness +hardhack +hardhanded +hardhandedness +hardhead +hardheaded +hardheadedly +hardheadedness +hardhearted +hardheartedly +hardheartedness +hardihood +hardily +hardim +hardiment +hardiness +hardish +hardishrew +hardly +hardmouth +hardmouthed +hardness +hardock +hardpan +hardship +hardstand +hardstanding +hardtack +hardtail +hardware +hardwareman +Hardwickia +hardwood +hardy +hardystonite +hare +harebell +harebottle +harebrain +harebrained +harebrainedly +harebrainedness +harebur +harefoot +harefooted +harehearted +harehound +Harelda +harelike +harelip +harelipped +harem +haremism +haremlik +harengiform +harfang +haricot +harigalds +hariolate +hariolation +hariolize +harish +hark +harka +harl +Harleian +Harlemese +Harlemite +harlequin +harlequina +harlequinade +harlequinery +harlequinesque +harlequinic +harlequinism +harlequinize +harling +harlock +harlot +harlotry +harm +Harmachis +harmal +harmala +harmaline +harman +harmattan +harmel +harmer +harmful +harmfully +harmfulness +harmine +harminic +harmless +harmlessly +harmlessness +Harmon +harmonia +harmoniacal +harmonial +harmonic +harmonica +harmonical +harmonically +harmonicalness +harmonichord +harmonici +harmonicism +harmonicon +harmonics +harmonious +harmoniously +harmoniousness +harmoniphon +harmoniphone +harmonist +harmonistic +harmonistically +Harmonite +harmonium +harmonizable +harmonization +harmonize +harmonizer +harmonogram +harmonograph +harmonometer +harmony +harmost +harmotome +harmotomic +harmproof +harn +harness +harnesser +harnessry +harnpan +Harold +harp +Harpa +harpago +harpagon +Harpagornis +Harpalides +Harpalinae +Harpalus +harper +harperess +Harpidae +harpier +harpings +harpist +harpless +harplike +Harpocrates +harpoon +harpooner +Harporhynchus +harpress +harpsichord +harpsichordist +harpula +Harpullia +harpwaytuning +harpwise +Harpy +Harpyia +harpylike +harquebus +harquebusade +harquebusier +harr +harrateen +harridan +harrier +Harris +Harrisia +harrisite +Harrovian +harrow +harrower +harrowing +harrowingly +harrowingness +harrowment +Harry +harry +harsh +harshen +harshish +harshly +harshness +harshweed +harstigite +hart +hartal +hartberry +hartebeest +hartin +hartite +Hartleian +Hartleyan +Hartmann +Hartmannia +Hartogia +hartshorn +hartstongue +harttite +Hartungen +haruspex +haruspical +haruspicate +haruspication +haruspice +haruspices +haruspicy +Harv +Harvard +Harvardian +Harvardize +Harveian +harvest +harvestbug +harvester +harvestless +harvestman +harvestry +harvesttime +Harvey +Harveyize +harzburgite +hasan +hasenpfeffer +hash +hashab +hasher +Hashimite +hashish +Hashiya +hashy +Hasidean +Hasidic +Hasidim +Hasidism +Hasinai +hask +Haskalah +haskness +hasky +haslet +haslock +Hasmonaean +hasp +hassar +hassel +hassle +hassock +hassocky +hasta +hastate +hastately +hastati +hastatolanceolate +hastatosagittate +haste +hasteful +hastefully +hasteless +hastelessness +hasten +hastener +hasteproof +haster +hastilude +hastily +hastiness +hastings +hastingsite +hastish +hastler +hasty +hat +hatable +hatband +hatbox +hatbrim +hatbrush +hatch +hatchability +hatchable +hatchel +hatcheler +hatcher +hatchery +hatcheryman +hatchet +hatchetback +hatchetfish +hatchetlike +hatchetman +hatchettine +hatchettolite +hatchety +hatchgate +hatching +hatchling +hatchman +hatchment +hatchminder +hatchway +hatchwayman +hate +hateable +hateful +hatefully +hatefulness +hateless +hatelessness +hater +hatful +hath +hatherlite +hathi +Hathor +Hathoric +Hati +Hatikvah +hatless +hatlessness +hatlike +hatmaker +hatmaking +hatpin +hatrack +hatrail +hatred +hatress +hatstand +hatt +hatted +Hattemist +hatter +Hatteria +hattery +Hatti +Hattic +Hattie +hatting +Hattism +Hattize +hattock +Hatty +hatty +hau +hauberget +hauberk +hauchecornite +hauerite +haugh +haughland +haught +haughtily +haughtiness +haughtly +haughtness +haughtonite +haughty +haul +haulabout +haulage +haulageway +haulback +hauld +hauler +haulier +haulm +haulmy +haulster +haunch +haunched +hauncher +haunching +haunchless +haunchy +haunt +haunter +hauntingly +haunty +Hauranitic +hauriant +haurient +Hausa +hause +hausen +hausmannite +hausse +Haussmannization +Haussmannize +haustellate +haustellated +haustellous +haustellum +haustement +haustorial +haustorium +haustral +haustrum +hautboy +hautboyist +hauteur +hauynite +hauynophyre +havage +Havaiki +Havaikian +Havana +Havanese +have +haveable +haveage +havel +haveless +havelock +haven +havenage +havener +havenership +havenet +havenful +havenless +havent +havenward +haver +havercake +haverel +haverer +havergrass +havermeal +havers +haversack +Haversian +haversine +havier +havildar +havingness +havoc +havocker +haw +Hawaiian +hawaiite +hawbuck +hawcubite +hawer +hawfinch +Hawiya +hawk +hawkbill +hawkbit +hawked +hawker +hawkery +Hawkeye +hawkie +hawking +hawkish +hawklike +hawknut +hawkweed +hawkwise +hawky +hawm +hawok +Haworthia +hawse +hawsehole +hawseman +hawsepiece +hawsepipe +hawser +hawserwise +hawthorn +hawthorned +hawthorny +hay +haya +hayband +haybird +haybote +haycap +haycart +haycock +haydenite +hayey +hayfield +hayfork +haygrower +haylift +hayloft +haymaker +haymaking +haymarket +haymow +hayrack +hayrake +hayraker +hayrick +hayseed +haysel +haystack +haysuck +haytime +hayward +hayweed +haywire +hayz +Hazara +hazard +hazardable +hazarder +hazardful +hazardize +hazardless +hazardous +hazardously +hazardousness +hazardry +haze +Hazel +hazel +hazeled +hazeless +hazelly +hazelnut +hazelwood +hazelwort +hazen +hazer +hazily +haziness +hazing +hazle +haznadar +hazy +hazzan +he +head +headache +headachy +headband +headbander +headboard +headborough +headcap +headchair +headcheese +headchute +headcloth +headdress +headed +headender +header +headfirst +headforemost +headframe +headful +headgear +headily +headiness +heading +headkerchief +headland +headledge +headless +headlessness +headlight +headlighting +headlike +headline +headliner +headlock +headlong +headlongly +headlongs +headlongwise +headman +headmark +headmaster +headmasterly +headmastership +headmistress +headmistressship +headmold +headmost +headnote +headpenny +headphone +headpiece +headplate +headpost +headquarter +headquarters +headrace +headrail +headreach +headrent +headrest +headright +headring +headroom +headrope +headsail +headset +headshake +headship +headsill +headskin +headsman +headspring +headstall +headstand +headstick +headstock +headstone +headstream +headstrong +headstrongly +headstrongness +headwaiter +headwall +headward +headwark +headwater +headway +headwear +headwork +headworker +headworking +heady +heaf +heal +healable +heald +healder +healer +healful +healing +healingly +healless +healsome +healsomeness +health +healthcraft +healthful +healthfully +healthfulness +healthguard +healthily +healthiness +healthless +healthlessness +healthsome +healthsomely +healthsomeness +healthward +healthy +heap +heaper +heaps +heapstead +heapy +hear +hearable +hearer +hearing +hearingless +hearken +hearkener +hearsay +hearse +hearsecloth +hearselike +hearst +heart +heartache +heartaching +heartbeat +heartbird +heartblood +heartbreak +heartbreaker +heartbreaking +heartbreakingly +heartbroken +heartbrokenly +heartbrokenness +heartburn +heartburning +heartdeep +heartease +hearted +heartedly +heartedness +hearten +heartener +heartening +hearteningly +heartfelt +heartful +heartfully +heartfulness +heartgrief +hearth +hearthless +hearthman +hearthpenny +hearthrug +hearthstead +hearthstone +hearthward +hearthwarming +heartikin +heartily +heartiness +hearting +heartland +heartleaf +heartless +heartlessly +heartlessness +heartlet +heartling +heartly +heartnut +heartpea +heartquake +heartroot +hearts +heartscald +heartsease +heartseed +heartsette +heartsick +heartsickening +heartsickness +heartsome +heartsomely +heartsomeness +heartsore +heartstring +heartthrob +heartward +heartwater +heartweed +heartwise +heartwood +heartwort +hearty +heat +heatable +heatdrop +heatedly +heater +heaterman +heatful +heath +heathberry +heathbird +heathen +heathendom +heatheness +heathenesse +heathenhood +heathenish +heathenishly +heathenishness +heathenism +heathenize +heathenness +heathenry +heathenship +Heather +heather +heathered +heatheriness +heathery +heathless +heathlike +heathwort +heathy +heating +heatingly +heatless +heatlike +heatmaker +heatmaking +heatproof +heatronic +heatsman +heatstroke +heaume +heaumer +heautarit +heautomorphism +Heautontimorumenos +heautophany +heave +heaveless +heaven +Heavenese +heavenful +heavenhood +heavenish +heavenishly +heavenize +heavenless +heavenlike +heavenliness +heavenly +heavens +heavenward +heavenwardly +heavenwardness +heavenwards +heaver +heavies +heavily +heaviness +heaving +heavisome +heavity +heavy +heavyback +heavyhanded +heavyhandedness +heavyheaded +heavyhearted +heavyheartedness +heavyweight +hebamic +hebdomad +hebdomadal +hebdomadally +hebdomadary +hebdomader +hebdomarian +hebdomary +hebeanthous +hebecarpous +hebecladous +hebegynous +hebenon +hebeosteotomy +hebepetalous +hebephrenia +hebephrenic +hebetate +hebetation +hebetative +hebete +hebetic +hebetomy +hebetude +hebetudinous +Hebraean +Hebraic +Hebraica +Hebraical +Hebraically +Hebraicize +Hebraism +Hebraist +Hebraistic +Hebraistical +Hebraistically +Hebraization +Hebraize +Hebraizer +Hebrew +Hebrewdom +Hebrewess +Hebrewism +Hebrician +Hebridean +Hebronite +hebronite +hecastotheism +Hecate +Hecatean +Hecatic +Hecatine +hecatomb +Hecatombaeon +hecatomped +hecatompedon +hecatonstylon +hecatontarchy +hecatontome +hecatophyllous +hech +Hechtia +heck +heckelphone +Heckerism +heckimal +heckle +heckler +hectare +hecte +hectic +hectical +hectically +hecticly +hecticness +hectocotyl +hectocotyle +hectocotyliferous +hectocotylization +hectocotylize +hectocotylus +hectogram +hectograph +hectographic +hectography +hectoliter +hectometer +Hector +hector +Hectorean +Hectorian +hectoringly +hectorism +hectorly +hectorship +hectostere +hectowatt +heddle +heddlemaker +heddler +hedebo +hedenbergite +Hedeoma +heder +Hedera +hederaceous +hederaceously +hederated +hederic +hederiferous +hederiform +hederigerent +hederin +hederose +hedge +hedgeberry +hedgeborn +hedgebote +hedgebreaker +hedgehog +hedgehoggy +hedgehop +hedgehopper +hedgeless +hedgemaker +hedgemaking +hedger +hedgerow +hedgesmith +hedgeweed +hedgewise +hedgewood +hedging +hedgingly +hedgy +hedonic +hedonical +hedonically +hedonics +hedonism +hedonist +hedonistic +hedonistically +hedonology +hedriophthalmous +hedrocele +hedrumite +Hedychium +hedyphane +Hedysarum +heed +heeder +heedful +heedfully +heedfulness +heedily +heediness +heedless +heedlessly +heedlessness +heedy +heehaw +heel +heelball +heelband +heelcap +heeled +heeler +heelgrip +heelless +heelmaker +heelmaking +heelpath +heelpiece +heelplate +heelpost +heelprint +heelstrap +heeltap +heeltree +heemraad +heer +heeze +heezie +heezy +heft +hefter +heftily +heftiness +hefty +hegari +Hegelian +Hegelianism +Hegelianize +Hegelizer +hegemon +hegemonic +hegemonical +hegemonist +hegemonizer +hegemony +hegira +hegumen +hegumene +Hehe +hei +heiau +Heidi +heifer +heiferhood +heigh +heighday +height +heighten +heightener +heii +Heikum +Heiltsuk +heimin +Hein +Heinesque +Heinie +heinous +heinously +heinousness +Heinrich +heintzite +Heinz +heir +heirdom +heiress +heiressdom +heiresshood +heirless +heirloom +heirship +heirskip +heitiki +Hejazi +Hejazian +hekteus +helbeh +helcoid +helcology +helcoplasty +helcosis +helcotic +heldentenor +helder +Helderbergian +hele +Helen +Helena +helenin +helenioid +Helenium +Helenus +helepole +Helge +heliacal +heliacally +Heliaea +heliaean +Heliamphora +Heliand +helianthaceous +Helianthemum +helianthic +helianthin +Helianthium +Helianthoidea +Helianthoidean +Helianthus +heliast +heliastic +heliazophyte +helical +helically +heliced +helices +helichryse +helichrysum +Helicidae +heliciform +helicin +Helicina +helicine +Helicinidae +helicitic +helicline +helicograph +helicogyrate +helicogyre +helicoid +helicoidal +helicoidally +helicometry +helicon +Heliconia +Heliconian +Heliconiidae +Heliconiinae +heliconist +Heliconius +helicoprotein +helicopter +helicorubin +helicotrema +Helicteres +helictite +helide +Heligmus +heling +helio +heliocentric +heliocentrical +heliocentrically +heliocentricism +heliocentricity +heliochrome +heliochromic +heliochromoscope +heliochromotype +heliochromy +helioculture +heliodon +heliodor +helioelectric +helioengraving +heliofugal +Heliogabalize +Heliogabalus +heliogram +heliograph +heliographer +heliographic +heliographical +heliographically +heliography +heliogravure +helioid +heliolater +heliolatrous +heliolatry +heliolite +Heliolites +heliolithic +Heliolitidae +heliologist +heliology +heliometer +heliometric +heliometrical +heliometrically +heliometry +heliomicrometer +Helion +heliophilia +heliophiliac +heliophilous +heliophobe +heliophobia +heliophobic +heliophobous +heliophotography +heliophyllite +heliophyte +Heliopora +Helioporidae +Heliopsis +heliopticon +Heliornis +Heliornithes +Heliornithidae +Helios +helioscope +helioscopic +helioscopy +heliosis +heliostat +heliostatic +heliotactic +heliotaxis +heliotherapy +heliothermometer +Heliothis +heliotrope +heliotroper +Heliotropiaceae +heliotropian +heliotropic +heliotropical +heliotropically +heliotropine +heliotropism +Heliotropium +heliotropy +heliotype +heliotypic +heliotypically +heliotypography +heliotypy +Heliozoa +heliozoan +heliozoic +heliport +Helipterum +helispheric +helispherical +helium +helix +helizitic +hell +Helladian +Helladic +Helladotherium +hellandite +hellanodic +hellbender +hellborn +hellbox +hellbred +hellbroth +hellcat +helldog +helleboraceous +helleboraster +hellebore +helleborein +helleboric +helleborin +Helleborine +helleborism +Helleborus +Hellelt +Hellen +Hellene +Hellenian +Hellenic +Hellenically +Hellenicism +Hellenism +Hellenist +Hellenistic +Hellenistical +Hellenistically +Hellenisticism +Hellenization +Hellenize +Hellenizer +Hellenocentric +Hellenophile +heller +helleri +Hellespont +Hellespontine +hellgrammite +hellhag +hellhole +hellhound +hellicat +hellier +hellion +hellish +hellishly +hellishness +hellkite +hellness +hello +hellroot +hellship +helluo +hellward +hellweed +helly +helm +helmage +helmed +helmet +helmeted +helmetlike +helmetmaker +helmetmaking +Helmholtzian +helminth +helminthagogic +helminthagogue +Helminthes +helminthiasis +helminthic +helminthism +helminthite +Helminthocladiaceae +helminthoid +helminthologic +helminthological +helminthologist +helminthology +helminthosporiose +Helminthosporium +helminthosporoid +helminthous +helmless +helmsman +helmsmanship +helobious +heloderm +Heloderma +Helodermatidae +helodermatoid +helodermatous +helodes +heloe +heloma +Helonias +helonin +helosis +Helot +helotage +helotism +helotize +helotomy +helotry +help +helpable +helper +helpful +helpfully +helpfulness +helping +helpingly +helpless +helplessly +helplessness +helply +helpmate +helpmeet +helpsome +helpworthy +helsingkite +helve +helvell +Helvella +Helvellaceae +helvellaceous +Helvellales +helvellic +helver +Helvetia +Helvetian +Helvetic +Helvetii +Helvidian +helvite +hem +hemabarometer +hemachate +hemachrome +hemachrosis +hemacite +hemad +hemadrometer +hemadrometry +hemadromograph +hemadromometer +hemadynameter +hemadynamic +hemadynamics +hemadynamometer +hemafibrite +hemagglutinate +hemagglutination +hemagglutinative +hemagglutinin +hemagogic +hemagogue +hemal +hemalbumen +hemamoeba +hemangioma +hemangiomatosis +hemangiosarcoma +hemaphein +hemapod +hemapodous +hemapoiesis +hemapoietic +hemapophyseal +hemapophysial +hemapophysis +hemarthrosis +hemase +hemaspectroscope +hemastatics +hematachometer +hematachometry +hematal +hematein +hematemesis +hematemetic +hematencephalon +hematherapy +hematherm +hemathermal +hemathermous +hemathidrosis +hematic +hematid +hematidrosis +hematimeter +hematin +hematinic +hematinometer +hematinometric +hematinuria +hematite +hematitic +hematobic +hematobious +hematobium +hematoblast +hematobranchiate +hematocatharsis +hematocathartic +hematocele +hematochezia +hematochrome +hematochyluria +hematoclasia +hematoclasis +hematocolpus +hematocrit +hematocryal +hematocrystallin +hematocyanin +hematocyst +hematocystis +hematocyte +hematocytoblast +hematocytogenesis +hematocytometer +hematocytotripsis +hematocytozoon +hematocyturia +hematodynamics +hematodynamometer +hematodystrophy +hematogen +hematogenesis +hematogenetic +hematogenic +hematogenous +hematoglobulin +hematography +hematohidrosis +hematoid +hematoidin +hematolin +hematolite +hematological +hematologist +hematology +hematolymphangioma +hematolysis +hematolytic +hematoma +hematomancy +hematometer +hematometra +hematometry +hematomphalocele +hematomyelia +hematomyelitis +hematonephrosis +hematonic +hematopathology +hematopericardium +hematopexis +hematophobia +hematophyte +hematoplast +hematoplastic +hematopoiesis +hematopoietic +hematoporphyrin +hematoporphyrinuria +hematorrhachis +hematorrhea +hematosalpinx +hematoscope +hematoscopy +hematose +hematosepsis +hematosin +hematosis +hematospectrophotometer +hematospectroscope +hematospermatocele +hematospermia +hematostibiite +hematotherapy +hematothermal +hematothorax +hematoxic +hematozoal +hematozoan +hematozoic +hematozoon +hematozymosis +hematozymotic +hematuresis +hematuria +hematuric +hemautogram +hemautograph +hemautographic +hemautography +heme +hemellitene +hemellitic +hemelytral +hemelytron +hemen +hemera +hemeralope +hemeralopia +hemeralopic +Hemerobaptism +Hemerobaptist +Hemerobian +Hemerobiid +Hemerobiidae +Hemerobius +Hemerocallis +hemerologium +hemerology +hemerythrin +hemiablepsia +hemiacetal +hemiachromatopsia +hemiageusia +hemiageustia +hemialbumin +hemialbumose +hemialbumosuria +hemialgia +hemiamaurosis +hemiamb +hemiamblyopia +hemiamyosthenia +hemianacusia +hemianalgesia +hemianatropous +hemianesthesia +hemianopia +hemianopic +hemianopsia +hemianoptic +hemianosmia +hemiapraxia +Hemiascales +Hemiasci +Hemiascomycetes +hemiasynergia +hemiataxia +hemiataxy +hemiathetosis +hemiatrophy +hemiazygous +Hemibasidiales +Hemibasidii +Hemibasidiomycetes +hemibasidium +hemibathybian +hemibenthic +hemibenthonic +hemibranch +hemibranchiate +Hemibranchii +hemic +hemicanities +hemicardia +hemicardiac +hemicarp +hemicatalepsy +hemicataleptic +hemicellulose +hemicentrum +hemicephalous +hemicerebrum +Hemichorda +hemichordate +hemichorea +hemichromatopsia +hemicircle +hemicircular +hemiclastic +hemicollin +hemicrane +hemicrania +hemicranic +hemicrany +hemicrystalline +hemicycle +hemicyclic +hemicyclium +hemicylindrical +hemidactylous +Hemidactylus +hemidemisemiquaver +hemidiapente +hemidiaphoresis +hemiditone +hemidomatic +hemidome +hemidrachm +hemidysergia +hemidysesthesia +hemidystrophy +hemiekton +hemielliptic +hemiepilepsy +hemifacial +hemiform +Hemigale +Hemigalus +Hemiganus +hemigastrectomy +hemigeusia +hemiglossal +hemiglossitis +hemiglyph +hemignathous +hemihdry +hemihedral +hemihedrally +hemihedric +hemihedrism +hemihedron +hemiholohedral +hemihydrate +hemihydrated +hemihydrosis +hemihypalgesia +hemihyperesthesia +hemihyperidrosis +hemihypertonia +hemihypertrophy +hemihypesthesia +hemihypoesthesia +hemihypotonia +hemikaryon +hemikaryotic +hemilaminectomy +hemilaryngectomy +Hemileia +hemilethargy +hemiligulate +hemilingual +hemimellitene +hemimellitic +hemimelus +Hemimeridae +Hemimerus +Hemimetabola +hemimetabole +hemimetabolic +hemimetabolism +hemimetabolous +hemimetaboly +hemimetamorphic +hemimetamorphosis +hemimetamorphous +hemimorph +hemimorphic +hemimorphism +hemimorphite +hemimorphy +Hemimyaria +hemin +hemina +hemine +heminee +hemineurasthenia +hemiobol +hemiolia +hemiolic +hemionus +hemiope +hemiopia +hemiopic +hemiorthotype +hemiparalysis +hemiparanesthesia +hemiparaplegia +hemiparasite +hemiparasitic +hemiparasitism +hemiparesis +hemiparesthesia +hemiparetic +hemipenis +hemipeptone +hemiphrase +hemipic +hemipinnate +hemiplane +hemiplankton +hemiplegia +hemiplegic +hemiplegy +hemipodan +hemipode +Hemipodii +Hemipodius +hemiprism +hemiprismatic +hemiprotein +hemipter +Hemiptera +hemipteral +hemipteran +hemipteroid +hemipterological +hemipterology +hemipteron +hemipterous +hemipyramid +hemiquinonoid +hemiramph +Hemiramphidae +Hemiramphinae +hemiramphine +Hemiramphus +hemisaprophyte +hemisaprophytic +hemiscotosis +hemisect +hemisection +hemispasm +hemispheral +hemisphere +hemisphered +hemispherical +hemispherically +hemispheroid +hemispheroidal +hemispherule +hemistater +hemistich +hemistichal +hemistrumectomy +hemisymmetrical +hemisymmetry +hemisystole +hemiterata +hemiteratic +hemiteratics +hemiteria +hemiterpene +hemitery +hemithyroidectomy +hemitone +hemitremor +hemitrichous +hemitriglyph +hemitropal +hemitrope +hemitropic +hemitropism +hemitropous +hemitropy +hemitype +hemitypic +hemivagotony +heml +hemlock +hemmel +hemmer +hemoalkalimeter +hemoblast +hemochromatosis +hemochrome +hemochromogen +hemochromometer +hemochromometry +hemoclasia +hemoclasis +hemoclastic +hemocoel +hemocoele +hemocoelic +hemocoelom +hemoconcentration +hemoconia +hemoconiosis +hemocry +hemocrystallin +hemoculture +hemocyanin +hemocyte +hemocytoblast +hemocytogenesis +hemocytolysis +hemocytometer +hemocytotripsis +hemocytozoon +hemocyturia +hemodiagnosis +hemodilution +hemodrometer +hemodrometry +hemodromograph +hemodromometer +hemodynameter +hemodynamic +hemodynamics +hemodystrophy +hemoerythrin +hemoflagellate +hemofuscin +hemogastric +hemogenesis +hemogenetic +hemogenic +hemogenous +hemoglobic +hemoglobin +hemoglobinemia +hemoglobiniferous +hemoglobinocholia +hemoglobinometer +hemoglobinophilic +hemoglobinous +hemoglobinuria +hemoglobinuric +hemoglobulin +hemogram +hemogregarine +hemoid +hemokonia +hemokoniosis +hemol +hemoleucocyte +hemoleucocytic +hemologist +hemology +hemolymph +hemolymphatic +hemolysin +hemolysis +hemolytic +hemolyze +hemomanometer +hemometer +hemometry +hemonephrosis +hemopathology +hemopathy +hemopericardium +hemoperitoneum +hemopexis +hemophage +hemophagia +hemophagocyte +hemophagocytosis +hemophagous +hemophagy +hemophile +Hemophileae +hemophilia +hemophiliac +hemophilic +Hemophilus +hemophobia +hemophthalmia +hemophthisis +hemopiezometer +hemoplasmodium +hemoplastic +hemopneumothorax +hemopod +hemopoiesis +hemopoietic +hemoproctia +hemoptoe +hemoptysis +hemopyrrole +hemorrhage +hemorrhagic +hemorrhagin +hemorrhea +hemorrhodin +hemorrhoid +hemorrhoidal +hemorrhoidectomy +hemosalpinx +hemoscope +hemoscopy +hemosiderin +hemosiderosis +hemospasia +hemospastic +hemospermia +hemosporid +hemosporidian +hemostasia +hemostasis +hemostat +hemostatic +hemotachometer +hemotherapeutics +hemotherapy +hemothorax +hemotoxic +hemotoxin +hemotrophe +hemotropic +hemozoon +hemp +hempbush +hempen +hemplike +hempseed +hempstring +hempweed +hempwort +hempy +hemstitch +hemstitcher +hen +henad +henbane +henbill +henbit +hence +henceforth +henceforward +henceforwards +henchboy +henchman +henchmanship +hencoop +hencote +hend +hendecacolic +hendecagon +hendecagonal +hendecahedron +hendecane +hendecasemic +hendecasyllabic +hendecasyllable +hendecatoic +hendecoic +hendecyl +hendiadys +hendly +hendness +heneicosane +henequen +henfish +henhearted +henhouse +henhussy +henism +henlike +henmoldy +henna +Hennebique +hennery +hennin +hennish +henny +henogeny +henotheism +henotheist +henotheistic +henotic +henpeck +henpen +Henrician +Henrietta +henroost +Henry +henry +hent +Hentenian +henter +hentriacontane +henware +henwife +henwise +henwoodite +henyard +heortological +heortologion +heortology +hep +hepar +heparin +heparinize +hepatalgia +hepatatrophia +hepatatrophy +hepatauxe +hepatectomy +hepatic +Hepatica +hepatica +Hepaticae +hepatical +hepaticoduodenostomy +hepaticoenterostomy +hepaticogastrostomy +hepaticologist +hepaticology +hepaticopulmonary +hepaticostomy +hepaticotomy +hepatite +hepatitis +hepatization +hepatize +hepatocele +hepatocirrhosis +hepatocolic +hepatocystic +hepatoduodenal +hepatoduodenostomy +hepatodynia +hepatodysentery +hepatoenteric +hepatoflavin +hepatogastric +hepatogenic +hepatogenous +hepatography +hepatoid +hepatolenticular +hepatolith +hepatolithiasis +hepatolithic +hepatological +hepatologist +hepatology +hepatolysis +hepatolytic +hepatoma +hepatomalacia +hepatomegalia +hepatomegaly +hepatomelanosis +hepatonephric +hepatopathy +hepatoperitonitis +hepatopexia +hepatopexy +hepatophlebitis +hepatophlebotomy +hepatophyma +hepatopneumonic +hepatoportal +hepatoptosia +hepatoptosis +hepatopulmonary +hepatorenal +hepatorrhagia +hepatorrhaphy +hepatorrhea +hepatorrhexis +hepatorrhoea +hepatoscopy +hepatostomy +hepatotherapy +hepatotomy +hepatotoxemia +hepatoumbilical +hepcat +Hephaesteum +Hephaestian +Hephaestic +Hephaestus +hephthemimer +hephthemimeral +hepialid +Hepialidae +Hepialus +heppen +hepper +heptacapsular +heptace +heptachord +heptachronous +heptacolic +heptacosane +heptad +heptadecane +heptadecyl +heptaglot +heptagon +heptagonal +heptagynous +heptahedral +heptahedrical +heptahedron +heptahexahedral +heptahydrate +heptahydrated +heptahydric +heptahydroxy +heptal +heptameride +Heptameron +heptamerous +heptameter +heptamethylene +heptametrical +heptanaphthene +Heptanchus +heptandrous +heptane +Heptanesian +heptangular +heptanoic +heptanone +heptapetalous +heptaphyllous +heptaploid +heptaploidy +heptapodic +heptapody +heptarch +heptarchal +heptarchic +heptarchical +heptarchist +heptarchy +heptasemic +heptasepalous +heptaspermous +heptastich +heptastrophic +heptastylar +heptastyle +heptasulphide +heptasyllabic +Heptateuch +heptatomic +heptatonic +Heptatrema +heptavalent +heptene +hepteris +heptine +heptite +heptitol +heptoic +heptorite +heptose +heptoxide +Heptranchias +heptyl +heptylene +heptylic +heptyne +her +Heraclean +Heracleidan +Heracleonite +Heracleopolitan +Heracleopolite +Heracleum +Heraclid +Heraclidae +Heraclidan +Heraclitean +Heracliteanism +Heraclitic +Heraclitical +Heraclitism +Herakles +herald +heraldess +heraldic +heraldical +heraldically +heraldist +heraldize +heraldress +heraldry +heraldship +herapathite +Herat +Herb +herb +herbaceous +herbaceously +herbage +herbaged +herbager +herbagious +herbal +herbalism +herbalist +herbalize +herbane +herbaria +herbarial +herbarian +herbarism +herbarist +herbarium +herbarize +Herbartian +Herbartianism +herbary +Herbert +herbescent +herbicidal +herbicide +herbicolous +herbiferous +herbish +herbist +Herbivora +herbivore +herbivority +herbivorous +herbless +herblet +herblike +herbman +herborist +herborization +herborize +herborizer +herbose +herbosity +herbous +herbwife +herbwoman +herby +hercogamous +hercogamy +Herculanean +Herculanensian +Herculanian +Herculean +Hercules +Herculid +Hercynian +hercynite +herd +herdbook +herdboy +herder +herderite +herdic +herding +herdship +herdsman +herdswoman +herdwick +here +hereabout +hereadays +hereafter +hereafterward +hereamong +hereat +hereaway +hereaways +herebefore +hereby +heredipetous +heredipety +hereditability +hereditable +hereditably +hereditament +hereditarian +hereditarianism +hereditarily +hereditariness +hereditarist +hereditary +hereditation +hereditative +hereditism +hereditist +hereditivity +heredity +heredium +heredofamilial +heredolues +heredoluetic +heredosyphilis +heredosyphilitic +heredosyphilogy +heredotuberculosis +Hereford +herefrom +heregeld +herein +hereinabove +hereinafter +hereinbefore +hereinto +herem +hereness +hereniging +hereof +hereon +hereright +Herero +heresiarch +heresimach +heresiographer +heresiography +heresiologer +heresiologist +heresiology +heresy +heresyphobia +heresyproof +heretic +heretical +heretically +hereticalness +hereticate +heretication +hereticator +hereticide +hereticize +hereto +heretoch +heretofore +heretoforetime +heretoga +heretrix +hereunder +hereunto +hereupon +hereward +herewith +herewithal +herile +heriot +heriotable +herisson +heritability +heritable +heritably +heritage +heritance +Heritiera +heritor +heritress +heritrix +herl +herling +herma +hermaean +hermaic +Herman +hermaphrodite +hermaphroditic +hermaphroditical +hermaphroditically +hermaphroditish +hermaphroditism +hermaphroditize +Hermaphroditus +hermeneut +hermeneutic +hermeneutical +hermeneutically +hermeneutics +hermeneutist +Hermes +Hermesian +Hermesianism +Hermetic +hermetic +hermetical +hermetically +hermeticism +Hermetics +Hermetism +Hermetist +hermidin +Herminone +Hermione +Hermit +hermit +hermitage +hermitary +hermitess +hermitic +hermitical +hermitically +hermitish +hermitism +hermitize +hermitry +hermitship +Hermo +hermodact +hermodactyl +Hermogenian +hermoglyphic +hermoglyphist +hermokopid +hern +Hernandia +Hernandiaceae +hernandiaceous +hernanesell +hernani +hernant +herne +hernia +hernial +Herniaria +herniarin +herniary +herniate +herniated +herniation +hernioenterotomy +hernioid +herniology +herniopuncture +herniorrhaphy +herniotome +herniotomist +herniotomy +hero +heroarchy +Herodian +herodian +Herodianic +Herodii +Herodiones +herodionine +heroess +herohead +herohood +heroic +heroical +heroically +heroicalness +heroicity +heroicly +heroicness +heroicomic +heroicomical +heroid +Heroides +heroify +Heroin +heroin +heroine +heroineship +heroinism +heroinize +heroism +heroistic +heroization +heroize +herolike +heromonger +heron +heroner +heronite +heronry +heroogony +heroologist +heroology +Herophile +Herophilist +heroship +herotheism +herpes +Herpestes +Herpestinae +herpestine +herpetic +herpetiform +herpetism +herpetography +herpetoid +herpetologic +herpetological +herpetologically +herpetologist +herpetology +herpetomonad +Herpetomonas +herpetophobia +herpetotomist +herpetotomy +herpolhode +Herpotrichia +herrengrundite +Herrenvolk +herring +herringbone +herringer +Herrnhuter +hers +Herschelian +herschelite +herse +hersed +herself +hership +hersir +hertz +hertzian +Heruli +Herulian +Hervati +Herve +Herzegovinian +Hesiodic +Hesione +Hesionidae +hesitance +hesitancy +hesitant +hesitantly +hesitate +hesitater +hesitating +hesitatingly +hesitatingness +hesitation +hesitative +hesitatively +hesitatory +Hesper +Hespera +Hesperia +Hesperian +Hesperic +Hesperid +hesperid +hesperidate +hesperidene +hesperideous +Hesperides +Hesperidian +hesperidin +hesperidium +hesperiid +Hesperiidae +hesperinon +Hesperis +hesperitin +Hesperornis +Hesperornithes +hesperornithid +Hesperornithiformes +hesperornithoid +Hesperus +Hessian +hessite +hessonite +hest +Hester +hestern +hesternal +Hesther +hesthogenous +Hesychasm +Hesychast +hesychastic +het +hetaera +hetaeria +hetaeric +hetaerism +Hetaerist +hetaerist +hetaeristic +hetaerocracy +hetaerolite +hetaery +heteradenia +heteradenic +heterakid +Heterakis +Heteralocha +heterandrous +heterandry +heteratomic +heterauxesis +heteraxial +heteric +heterically +hetericism +hetericist +heterism +heterization +heterize +hetero +heteroagglutinin +heteroalbumose +heteroauxin +heteroblastic +heteroblastically +heteroblasty +heterocarpism +heterocarpous +Heterocarpus +heterocaseose +heterocellular +heterocentric +heterocephalous +Heterocera +heterocerc +heterocercal +heterocercality +heterocercy +heterocerous +heterochiral +heterochlamydeous +Heterochloridales +heterochromatic +heterochromatin +heterochromatism +heterochromatization +heterochromatized +heterochrome +heterochromia +heterochromic +heterochromosome +heterochromous +heterochromy +heterochronic +heterochronism +heterochronistic +heterochronous +heterochrony +heterochrosis +heterochthon +heterochthonous +heterocline +heteroclinous +heteroclital +heteroclite +heteroclitica +heteroclitous +Heterocoela +heterocoelous +Heterocotylea +heterocycle +heterocyclic +heterocyst +heterocystous +heterodactyl +Heterodactylae +heterodactylous +Heterodera +Heterodon +heterodont +Heterodonta +Heterodontidae +heterodontism +heterodontoid +Heterodontus +heterodox +heterodoxal +heterodoxical +heterodoxly +heterodoxness +heterodoxy +heterodromous +heterodromy +heterodyne +heteroecious +heteroeciously +heteroeciousness +heteroecism +heteroecismal +heteroecy +heteroepic +heteroepy +heteroerotic +heteroerotism +heterofermentative +heterofertilization +heterogalactic +heterogamete +heterogametic +heterogametism +heterogamety +heterogamic +heterogamous +heterogamy +heterogangliate +heterogen +heterogene +heterogeneal +heterogenean +heterogeneity +heterogeneous +heterogeneously +heterogeneousness +heterogenesis +heterogenetic +heterogenic +heterogenicity +heterogenist +heterogenous +heterogeny +heteroglobulose +heterognath +Heterognathi +heterogone +heterogonism +heterogonous +heterogonously +heterogony +heterograft +heterographic +heterographical +heterography +Heterogyna +heterogynal +heterogynous +heteroicous +heteroimmune +heteroinfection +heteroinoculable +heteroinoculation +heterointoxication +heterokaryon +heterokaryosis +heterokaryotic +heterokinesis +heterokinetic +Heterokontae +heterokontan +heterolalia +heterolateral +heterolecithal +heterolith +heterolobous +heterologic +heterological +heterologically +heterologous +heterology +heterolysin +heterolysis +heterolytic +heteromallous +heteromastigate +heteromastigote +Heteromeles +Heteromera +heteromeral +Heteromeran +Heteromeri +heteromeric +heteromerous +Heterometabola +heterometabole +heterometabolic +heterometabolism +heterometabolous +heterometaboly +heterometric +Heteromi +Heteromita +Heteromorpha +Heteromorphae +heteromorphic +heteromorphism +heteromorphite +heteromorphosis +heteromorphous +heteromorphy +Heteromya +Heteromyaria +heteromyarian +Heteromyidae +Heteromys +heteronereid +heteronereis +Heteroneura +heteronomous +heteronomously +heteronomy +heteronuclear +heteronym +heteronymic +heteronymous +heteronymously +heteronymy +heteroousia +Heteroousian +heteroousian +Heteroousiast +heteroousious +heteropathic +heteropathy +heteropelmous +heteropetalous +Heterophaga +Heterophagi +heterophagous +heterophasia +heterophemism +heterophemist +heterophemistic +heterophemize +heterophemy +heterophile +heterophoria +heterophoric +heterophylesis +heterophyletic +heterophyllous +heterophylly +heterophyly +heterophyte +heterophytic +Heteropia +Heteropidae +heteroplasia +heteroplasm +heteroplastic +heteroplasty +heteroploid +heteroploidy +heteropod +Heteropoda +heteropodal +heteropodous +heteropolar +heteropolarity +heteropoly +heteroproteide +heteroproteose +heteropter +Heteroptera +heteropterous +heteroptics +heteropycnosis +Heterorhachis +heteroscope +heteroscopy +heterosexual +heterosexuality +heteroside +Heterosiphonales +heterosis +Heterosomata +Heterosomati +heterosomatous +heterosome +Heterosomi +heterosomous +Heterosporeae +heterosporic +Heterosporium +heterosporous +heterospory +heterostatic +heterostemonous +Heterostraca +heterostracan +Heterostraci +heterostrophic +heterostrophous +heterostrophy +heterostyled +heterostylism +heterostylous +heterostyly +heterosuggestion +heterosyllabic +heterotactic +heterotactous +heterotaxia +heterotaxic +heterotaxis +heterotaxy +heterotelic +heterothallic +heterothallism +heterothermal +heterothermic +heterotic +heterotopia +heterotopic +heterotopism +heterotopous +heterotopy +heterotransplant +heterotransplantation +heterotrich +Heterotricha +Heterotrichales +Heterotrichida +heterotrichosis +heterotrichous +heterotropal +heterotroph +heterotrophic +heterotrophy +heterotropia +heterotropic +heterotropous +heterotype +heterotypic +heterotypical +heteroxanthine +heteroxenous +heterozetesis +heterozygosis +heterozygosity +heterozygote +heterozygotic +heterozygous +heterozygousness +hething +hetman +hetmanate +hetmanship +hetter +hetterly +Hettie +Hetty +heuau +Heuchera +heugh +heulandite +heumite +heuretic +heuristic +heuristically +Hevea +hevi +hew +hewable +hewel +hewer +hewettite +hewhall +hewn +hewt +hex +hexa +hexabasic +Hexabiblos +hexabiose +hexabromide +hexacanth +hexacanthous +hexacapsular +hexacarbon +hexace +hexachloride +hexachlorocyclohexane +hexachloroethane +hexachord +hexachronous +hexacid +hexacolic +Hexacoralla +hexacorallan +Hexacorallia +hexacosane +hexacosihedroid +hexact +hexactinal +hexactine +hexactinellid +Hexactinellida +hexactinellidan +hexactinelline +hexactinian +hexacyclic +hexad +hexadactyle +hexadactylic +hexadactylism +hexadactylous +hexadactyly +hexadecahedroid +hexadecane +hexadecanoic +hexadecene +hexadecyl +hexadic +hexadiene +hexadiyne +hexafoil +hexaglot +hexagon +hexagonal +hexagonally +hexagonial +hexagonical +hexagonous +hexagram +Hexagrammidae +hexagrammoid +Hexagrammos +hexagyn +Hexagynia +hexagynian +hexagynous +hexahedral +hexahedron +hexahydrate +hexahydrated +hexahydric +hexahydride +hexahydrite +hexahydrobenzene +hexahydroxy +hexakisoctahedron +hexakistetrahedron +hexameral +hexameric +hexamerism +hexameron +hexamerous +hexameter +hexamethylenamine +hexamethylene +hexamethylenetetramine +hexametral +hexametric +hexametrical +hexametrist +hexametrize +hexametrographer +Hexamita +hexamitiasis +hexammine +hexammino +hexanaphthene +Hexanchidae +Hexanchus +Hexandria +hexandric +hexandrous +hexandry +hexane +hexanedione +hexangular +hexangularly +hexanitrate +hexanitrodiphenylamine +hexapartite +hexaped +hexapetaloid +hexapetaloideous +hexapetalous +hexaphyllous +hexapla +hexaplar +hexaplarian +hexaplaric +hexaploid +hexaploidy +hexapod +Hexapoda +hexapodal +hexapodan +hexapodous +hexapody +hexapterous +hexaradial +hexarch +hexarchy +hexaseme +hexasemic +hexasepalous +hexaspermous +hexastemonous +hexaster +hexastich +hexastichic +hexastichon +hexastichous +hexastichy +hexastigm +hexastylar +hexastyle +hexastylos +hexasulphide +hexasyllabic +hexatetrahedron +Hexateuch +Hexateuchal +hexathlon +hexatomic +hexatriacontane +hexatriose +hexavalent +hexecontane +hexenbesen +hexene +hexer +hexerei +hexeris +hexestrol +hexicological +hexicology +hexine +hexiological +hexiology +hexis +hexitol +hexoctahedral +hexoctahedron +hexode +hexoestrol +hexogen +hexoic +hexokinase +hexone +hexonic +hexosamine +hexosaminic +hexosan +hexose +hexosediphosphoric +hexosemonophosphoric +hexosephosphatase +hexosephosphoric +hexoylene +hexpartite +hexyl +hexylene +hexylic +hexylresorcinol +hexyne +hey +heyday +Hezron +Hezronites +hi +hia +Hianakoto +hiant +hiatal +hiate +hiation +hiatus +Hibbertia +hibbin +hibernacle +hibernacular +hibernaculum +hibernal +hibernate +hibernation +hibernator +Hibernia +Hibernian +Hibernianism +Hibernic +Hibernical +Hibernically +Hibernicism +Hibernicize +Hibernization +Hibernize +Hibernologist +Hibernology +Hibiscus +Hibito +Hibitos +Hibunci +hic +hicatee +hiccup +hick +hickey +hickory +Hicksite +hickwall +Hicoria +hidable +hidage +hidalgism +hidalgo +hidalgoism +hidated +hidation +Hidatsa +hidden +hiddenite +hiddenly +hiddenmost +hiddenness +hide +hideaway +hidebind +hidebound +hideboundness +hided +hideland +hideless +hideling +hideosity +hideous +hideously +hideousness +hider +hidling +hidlings +hidradenitis +hidrocystoma +hidromancy +hidropoiesis +hidrosis +hidrotic +hie +hieder +hielaman +hield +hielmite +hiemal +hiemation +Hienz +Hieracian +Hieracium +hieracosphinx +hierapicra +hierarch +hierarchal +hierarchic +hierarchical +hierarchically +hierarchism +hierarchist +hierarchize +hierarchy +hieratic +hieratical +hieratically +hieraticism +hieratite +Hierochloe +hierocracy +hierocratic +hierocratical +hierodule +hierodulic +Hierofalco +hierogamy +hieroglyph +hieroglypher +hieroglyphic +hieroglyphical +hieroglyphically +hieroglyphist +hieroglyphize +hieroglyphology +hieroglyphy +hierogram +hierogrammat +hierogrammate +hierogrammateus +hierogrammatic +hierogrammatical +hierogrammatist +hierograph +hierographer +hierographic +hierographical +hierography +hierolatry +hierologic +hierological +hierologist +hierology +hieromachy +hieromancy +hieromnemon +hieromonach +hieron +Hieronymic +Hieronymite +hieropathic +hierophancy +hierophant +hierophantes +hierophantic +hierophantically +hierophanticly +hieros +hieroscopy +Hierosolymitan +Hierosolymite +hierurgical +hierurgy +hifalutin +higdon +higgaion +higginsite +higgle +higglehaggle +higgler +higglery +high +highball +highbelia +highbinder +highborn +highboy +highbred +higher +highermost +highest +highfalutin +highfaluting +highfalutinism +highflying +highhanded +highhandedly +highhandedness +highhearted +highheartedly +highheartedness +highish +highjack +highjacker +highland +highlander +highlandish +Highlandman +Highlandry +highlight +highliving +highly +highman +highmoor +highmost +highness +highroad +hight +hightoby +hightop +highway +highwayman +higuero +hijack +hike +hiker +Hilaria +hilarious +hilariously +hilariousness +hilarity +Hilary +Hilarymas +Hilarytide +hilasmic +hilch +Hilda +Hildebrand +Hildebrandian +Hildebrandic +Hildebrandine +Hildebrandism +Hildebrandist +Hildebrandslied +Hildegarde +hilding +hiliferous +hill +Hillary +hillberry +hillbilly +hillculture +hillebrandite +Hillel +hiller +hillet +Hillhousia +hilliness +hillman +hillock +hillocked +hillocky +hillsale +hillsalesman +hillside +hillsman +hilltop +hilltrot +hillward +hillwoman +hilly +hilsa +hilt +hiltless +hilum +hilus +him +Hima +Himalaya +Himalayan +Himantopus +himation +Himawan +himp +himself +himward +himwards +Himyaric +Himyarite +Himyaritic +hin +hinau +Hinayana +hinch +hind +hindberry +hindbrain +hindcast +hinddeck +hinder +hinderance +hinderer +hinderest +hinderful +hinderfully +hinderingly +hinderlands +hinderlings +hinderlins +hinderly +hinderment +hindermost +hindersome +hindhand +hindhead +Hindi +hindmost +hindquarter +hindrance +hindsaddle +hindsight +Hindu +Hinduism +Hinduize +Hindustani +hindward +hing +hinge +hingecorner +hingeflower +hingeless +hingelike +hinger +hingeways +hingle +hinney +hinnible +Hinnites +hinny +hinoid +hinoideous +hinoki +hinsdalite +hint +hintedly +hinter +hinterland +hintingly +hintproof +hintzeite +Hiodon +hiodont +Hiodontidae +hiortdahlite +hip +hipbone +hipe +hiper +hiphalt +hipless +hipmold +Hippa +hippalectryon +hipparch +Hipparion +Hippeastrum +hipped +Hippelates +hippen +Hippia +hippian +hippiater +hippiatric +hippiatrical +hippiatrics +hippiatrist +hippiatry +hippic +Hippidae +Hippidion +Hippidium +hipping +hippish +hipple +hippo +Hippobosca +hippoboscid +Hippoboscidae +hippocamp +hippocampal +hippocampi +hippocampine +hippocampus +Hippocastanaceae +hippocastanaceous +hippocaust +hippocentaur +hippocentauric +hippocerf +hippocoprosterol +hippocras +Hippocratea +Hippocrateaceae +hippocrateaceous +Hippocratian +Hippocratic +Hippocratical +Hippocratism +Hippocrene +Hippocrenian +hippocrepian +hippocrepiform +Hippodamia +hippodamous +hippodrome +hippodromic +hippodromist +hippogastronomy +Hippoglosinae +Hippoglossidae +Hippoglossus +hippogriff +hippogriffin +hippoid +hippolite +hippolith +hippological +hippologist +hippology +Hippolytan +Hippolyte +Hippolytidae +Hippolytus +hippomachy +hippomancy +hippomanes +Hippomedon +hippomelanin +Hippomenes +hippometer +hippometric +hippometry +Hipponactean +hipponosological +hipponosology +hippopathological +hippopathology +hippophagi +hippophagism +hippophagist +hippophagistical +hippophagous +hippophagy +hippophile +hippophobia +hippopod +hippopotami +hippopotamian +hippopotamic +Hippopotamidae +hippopotamine +hippopotamoid +hippopotamus +Hipposelinum +hippotigrine +Hippotigris +hippotomical +hippotomist +hippotomy +hippotragine +Hippotragus +hippurate +hippuric +hippurid +Hippuridaceae +Hippuris +hippurite +Hippurites +hippuritic +Hippuritidae +hippuritoid +hippus +hippy +hipshot +hipwort +hirable +hiragana +Hiram +Hiramite +hircarra +hircine +hircinous +hircocerf +hircocervus +hircosity +hire +hired +hireless +hireling +hireman +Hiren +hirer +hirmologion +hirmos +Hirneola +hiro +Hirofumi +hirondelle +Hirotoshi +Hiroyuki +hirple +hirrient +hirse +hirsel +hirsle +hirsute +hirsuteness +hirsuties +hirsutism +hirsutulous +Hirtella +hirtellous +Hirudin +hirudine +Hirudinea +hirudinean +hirudiniculture +Hirudinidae +hirudinize +hirudinoid +Hirudo +hirundine +Hirundinidae +hirundinous +Hirundo +his +hish +hisingerite +hisn +Hispa +Hispania +Hispanic +Hispanicism +Hispanicize +hispanidad +Hispaniolate +Hispaniolize +Hispanist +Hispanize +Hispanophile +Hispanophobe +hispid +hispidity +hispidulate +hispidulous +Hispinae +hiss +hisser +hissing +hissingly +hissproof +hist +histaminase +histamine +histaminic +histidine +histie +histiocyte +histiocytic +histioid +histiology +Histiophoridae +Histiophorus +histoblast +histochemic +histochemical +histochemistry +histoclastic +histocyte +histodiagnosis +histodialysis +histodialytic +histogen +histogenesis +histogenetic +histogenetically +histogenic +histogenous +histogeny +histogram +histographer +histographic +histographical +histography +histoid +histologic +histological +histologically +histologist +histology +histolysis +histolytic +histometabasis +histomorphological +histomorphologically +histomorphology +histon +histonal +histone +histonomy +histopathologic +histopathological +histopathologist +histopathology +histophyly +histophysiological +histophysiology +Histoplasma +histoplasmin +histoplasmosis +historial +historian +historiated +historic +historical +historically +historicalness +historician +historicism +historicity +historicize +historicocabbalistical +historicocritical +historicocultural +historicodogmatic +historicogeographical +historicophilosophica +historicophysical +historicopolitical +historicoprophetic +historicoreligious +historics +historicus +historied +historier +historiette +historify +historiograph +historiographer +historiographership +historiographic +historiographical +historiographically +historiography +historiological +historiology +historiometric +historiometry +historionomer +historious +historism +historize +history +histotherapist +histotherapy +histotome +histotomy +histotrophic +histotrophy +histotropic +histozoic +histozyme +histrio +Histriobdella +Histriomastix +histrion +histrionic +histrionical +histrionically +histrionicism +histrionism +hit +hitch +hitcher +hitchhike +hitchhiker +hitchily +hitchiness +Hitchiti +hitchproof +hitchy +hithe +hither +hithermost +hitherto +hitherward +Hitlerism +Hitlerite +hitless +Hitoshi +hittable +hitter +Hittite +Hittitics +Hittitology +Hittology +hive +hiveless +hiver +hives +hiveward +Hivite +hizz +Hler +Hlidhskjalf +Hlithskjalf +Hlorrithi +Ho +ho +hoar +hoard +hoarder +hoarding +hoardward +hoarfrost +hoarhead +hoarheaded +hoarhound +hoarily +hoariness +hoarish +hoarness +hoarse +hoarsely +hoarsen +hoarseness +hoarstone +hoarwort +hoary +hoaryheaded +hoast +hoastman +hoatzin +hoax +hoaxee +hoaxer +hoaxproof +hob +hobber +Hobbesian +hobbet +Hobbian +hobbil +Hobbism +Hobbist +Hobbistical +hobble +hobblebush +hobbledehoy +hobbledehoydom +hobbledehoyhood +hobbledehoyish +hobbledehoyishness +hobbledehoyism +hobbledygee +hobbler +hobbling +hobblingly +hobbly +hobby +hobbyhorse +hobbyhorsical +hobbyhorsically +hobbyism +hobbyist +hobbyless +hobgoblin +hoblike +hobnail +hobnailed +hobnailer +hobnob +hobo +hoboism +Hobomoco +hobthrush +hocco +Hochelaga +Hochheimer +hock +Hockday +hockelty +hocker +hocket +hockey +hockshin +Hocktide +hocky +hocus +hod +hodden +hodder +hoddle +hoddy +hodening +hodful +hodgepodge +Hodgkin +hodgkinsonite +hodiernal +hodman +hodmandod +hodograph +hodometer +hodometrical +hoe +hoecake +hoedown +hoeful +hoer +hoernesite +Hoffmannist +Hoffmannite +hog +hoga +hogan +Hogarthian +hogback +hogbush +hogfish +hogframe +hogged +hogger +hoggerel +hoggery +hogget +hoggie +hoggin +hoggish +hoggishly +hoggishness +hoggism +hoggy +hogherd +hoghide +hoghood +hoglike +hogling +hogmace +hogmanay +Hogni +hognose +hognut +hogpen +hogreeve +hogrophyte +hogshead +hogship +hogshouther +hogskin +hogsty +hogward +hogwash +hogweed +hogwort +hogyard +Hohe +Hohenzollern +Hohenzollernism +Hohn +Hohokam +hoi +hoick +hoin +hoise +hoist +hoistaway +hoister +hoisting +hoistman +hoistway +hoit +hoju +Hokan +hokey +hokeypokey +hokum +holagogue +holarctic +holard +holarthritic +holarthritis +holaspidean +holcad +holcodont +Holconoti +Holcus +hold +holdable +holdall +holdback +holden +holdenite +holder +holdership +holdfast +holdfastness +holding +holdingly +holdout +holdover +holdsman +holdup +hole +holeable +Holectypina +holectypoid +holeless +holeman +holeproof +holer +holethnic +holethnos +holewort +holey +holia +holiday +holidayer +holidayism +holidaymaker +holidaymaking +holily +holiness +holing +holinight +holism +holistic +holistically +holl +holla +hollaite +Holland +hollandaise +Hollander +Hollandish +hollandite +Hollands +Hollantide +holler +hollin +holliper +hollo +hollock +hollong +hollow +hollower +hollowfaced +hollowfoot +hollowhearted +hollowheartedness +hollowly +hollowness +holluschick +Holly +holly +hollyhock +Hollywood +Hollywooder +Hollywoodize +holm +holmberry +holmgang +holmia +holmic +holmium +holmos +holobaptist +holobenthic +holoblastic +holoblastically +holobranch +holocaine +holocarpic +holocarpous +holocaust +holocaustal +holocaustic +Holocene +holocentrid +Holocentridae +holocentroid +Holocentrus +Holocephala +holocephalan +Holocephali +holocephalian +holocephalous +Holochoanites +holochoanitic +holochoanoid +Holochoanoida +holochoanoidal +holochordate +holochroal +holoclastic +holocrine +holocryptic +holocrystalline +holodactylic +holodedron +Holodiscus +hologamous +hologamy +hologastrula +hologastrular +Holognatha +holognathous +hologonidium +holograph +holographic +holographical +holohedral +holohedric +holohedrism +holohemihedral +holohyaline +holomastigote +Holometabola +holometabole +holometabolian +holometabolic +holometabolism +holometabolous +holometaboly +holometer +holomorph +holomorphic +holomorphism +holomorphosis +holomorphy +Holomyaria +holomyarian +Holomyarii +holoparasite +holoparasitic +Holophane +holophane +holophotal +holophote +holophotometer +holophrase +holophrasis +holophrasm +holophrastic +holophyte +holophytic +holoplankton +holoplanktonic +holoplexia +holopneustic +holoproteide +holoptic +holoptychian +holoptychiid +Holoptychiidae +Holoptychius +holoquinoid +holoquinoidal +holoquinonic +holoquinonoid +holorhinal +holosaprophyte +holosaprophytic +holosericeous +holoside +holosiderite +Holosiphona +holosiphonate +Holosomata +holosomatous +holospondaic +holostean +Holostei +holosteous +holosteric +Holosteum +Holostomata +holostomate +holostomatous +holostome +holostomous +holostylic +holosymmetric +holosymmetrical +holosymmetry +holosystematic +holosystolic +holothecal +holothoracic +Holothuria +holothurian +Holothuridea +holothurioid +Holothurioidea +holotonia +holotonic +holotony +holotrich +Holotricha +holotrichal +Holotrichida +holotrichous +holotype +holour +holozoic +Holstein +holster +holstered +holt +holy +holyday +holyokeite +holystone +holytide +homage +homageable +homager +Homalocenchrus +homalogonatous +homalographic +homaloid +homaloidal +Homalonotus +Homalopsinae +Homaloptera +Homalopterous +homalosternal +Homalosternii +Homam +Homaridae +homarine +homaroid +Homarus +homatomic +homaxial +homaxonial +homaxonic +Homburg +home +homebody +homeborn +homebound +homebred +homecomer +homecraft +homecroft +homecrofter +homecrofting +homefarer +homefelt +homegoer +homekeeper +homekeeping +homeland +homelander +homeless +homelessly +homelessness +homelet +homelike +homelikeness +homelily +homeliness +homeling +homely +homelyn +homemade +homemaker +homemaking +homeoblastic +homeochromatic +homeochromatism +homeochronous +homeocrystalline +homeogenic +homeogenous +homeoid +homeoidal +homeoidality +homeokinesis +homeokinetic +homeomerous +homeomorph +homeomorphic +homeomorphism +homeomorphous +homeomorphy +homeopath +homeopathic +homeopathically +homeopathician +homeopathicity +homeopathist +homeopathy +homeophony +homeoplasia +homeoplastic +homeoplasy +homeopolar +homeosis +homeostasis +homeostatic +homeotic +homeotransplant +homeotransplantation +homeotype +homeotypic +homeotypical +homeowner +homeozoic +Homer +homer +Homerian +Homeric +Homerical +Homerically +Homerid +Homeridae +Homeridian +Homerist +Homerologist +Homerology +Homeromastix +homeseeker +homesick +homesickly +homesickness +homesite +homesome +homespun +homestall +homestead +homesteader +homester +homestretch +homeward +homewardly +homework +homeworker +homewort +homey +homeyness +homicidal +homicidally +homicide +homicidious +homiculture +homilete +homiletic +homiletical +homiletically +homiletics +homiliarium +homiliary +homilist +homilite +homilize +homily +hominal +hominess +Hominian +hominid +Hominidae +hominiform +hominify +hominine +hominisection +hominivorous +hominoid +hominy +homish +homishness +homo +homoanisaldehyde +homoanisic +homoarecoline +homobaric +homoblastic +homoblasty +homocarpous +homocategoric +homocentric +homocentrical +homocentrically +homocerc +homocercal +homocercality +homocercy +homocerebrin +homochiral +homochlamydeous +homochromatic +homochromatism +homochrome +homochromic +homochromosome +homochromous +homochromy +homochronous +homoclinal +homocline +Homocoela +homocoelous +homocreosol +homocyclic +homodermic +homodermy +homodont +homodontism +homodox +homodoxian +homodromal +homodrome +homodromous +homodromy +homodynamic +homodynamous +homodynamy +homodyne +Homoean +Homoeanism +homoecious +homoeoarchy +homoeoblastic +homoeochromatic +homoeochronous +homoeocrystalline +homoeogenic +homoeogenous +homoeography +homoeokinesis +homoeomerae +Homoeomeri +homoeomeria +homoeomerian +homoeomerianism +homoeomeric +homoeomerical +homoeomerous +homoeomery +homoeomorph +homoeomorphic +homoeomorphism +homoeomorphous +homoeomorphy +homoeopath +homoeopathic +homoeopathically +homoeopathician +homoeopathicity +homoeopathist +homoeopathy +homoeophony +homoeophyllous +homoeoplasia +homoeoplastic +homoeoplasy +homoeopolar +homoeosis +homoeotel +homoeoteleutic +homoeoteleuton +homoeotic +homoeotopy +homoeotype +homoeotypic +homoeotypical +homoeozoic +homoerotic +homoerotism +homofermentative +homogametic +homogamic +homogamous +homogamy +homogangliate +homogen +homogenate +homogene +homogeneal +homogenealness +homogeneate +homogeneity +homogeneization +homogeneize +homogeneous +homogeneously +homogeneousness +homogenesis +homogenetic +homogenetical +homogenic +homogenization +homogenize +homogenizer +homogenous +homogentisic +homogeny +homoglot +homogone +homogonous +homogonously +homogony +homograft +homograph +homographic +homography +homohedral +homoiotherm +homoiothermal +homoiothermic +homoiothermism +homoiothermous +homoiousia +Homoiousian +homoiousian +Homoiousianism +homoiousious +homolateral +homolecithal +homolegalis +homologate +homologation +homologic +homological +homologically +homologist +homologize +homologizer +homologon +homologoumena +homologous +homolographic +homolography +homologue +homology +homolosine +homolysin +homolysis +homomallous +homomeral +homomerous +homometrical +homometrically +homomorph +Homomorpha +homomorphic +homomorphism +homomorphosis +homomorphous +homomorphy +Homoneura +homonomous +homonomy +homonuclear +homonym +homonymic +homonymous +homonymously +homonymy +homoousia +Homoousian +Homoousianism +Homoousianist +Homoousiast +Homoousion +homoousious +homopathy +homoperiodic +homopetalous +homophene +homophenous +homophone +homophonic +homophonous +homophony +homophthalic +homophylic +homophyllous +homophyly +homopiperonyl +homoplasis +homoplasmic +homoplasmy +homoplast +homoplastic +homoplasy +homopolar +homopolarity +homopolic +homopter +Homoptera +homopteran +homopteron +homopterous +Homorelaps +homorganic +homoseismal +homosexual +homosexualism +homosexualist +homosexuality +homosporous +homospory +Homosteus +homostyled +homostylic +homostylism +homostylous +homostyly +homosystemic +homotactic +homotatic +homotaxeous +homotaxia +homotaxial +homotaxially +homotaxic +homotaxis +homotaxy +homothallic +homothallism +homothetic +homothety +homotonic +homotonous +homotonously +homotony +homotopic +homotransplant +homotransplantation +homotropal +homotropous +homotypal +homotype +homotypic +homotypical +homotypy +homovanillic +homovanillin +homoveratric +homoveratrole +homozygosis +homozygosity +homozygote +homozygous +homozygousness +homrai +homuncle +homuncular +homunculus +homy +Hon +honda +hondo +Honduran +Honduranean +Honduranian +Hondurean +Hondurian +hone +honest +honestly +honestness +honestone +honesty +honewort +honey +honeybee +honeyberry +honeybind +honeyblob +honeybloom +honeycomb +honeycombed +honeydew +honeydewed +honeydrop +honeyed +honeyedly +honeyedness +honeyfall +honeyflower +honeyfogle +honeyful +honeyhearted +honeyless +honeylike +honeylipped +honeymoon +honeymooner +honeymoonlight +honeymoonshine +honeymoonstruck +honeymoony +honeymouthed +honeypod +honeypot +honeystone +honeysuck +honeysucker +honeysuckle +honeysuckled +honeysweet +honeyware +Honeywood +honeywood +honeywort +hong +honied +honily +honk +honker +honor +Honora +honorability +honorable +honorableness +honorableship +honorably +honorance +honoraria +honorarily +honorarium +honorary +honoree +honorer +honoress +honorific +honorifically +honorless +honorous +honorsman +honorworthy +hontish +hontous +Honzo +hooch +hoochinoo +hood +hoodcap +hooded +hoodedness +hoodful +hoodie +hoodless +hoodlike +hoodlum +hoodlumish +hoodlumism +hoodlumize +hoodman +hoodmold +hoodoo +hoodsheaf +hoodshy +hoodshyness +hoodwink +hoodwinkable +hoodwinker +hoodwise +hoodwort +hooey +hoof +hoofbeat +hoofbound +hoofed +hoofer +hoofiness +hoofish +hoofless +hooflet +hooflike +hoofmark +hoofprint +hoofrot +hoofs +hoofworm +hoofy +hook +hookah +hookaroon +hooked +hookedness +hookedwise +hooker +Hookera +hookerman +hookers +hookheal +hookish +hookless +hooklet +hooklike +hookmaker +hookmaking +hookman +hooknose +hooksmith +hooktip +hookum +hookup +hookweed +hookwise +hookworm +hookwormer +hookwormy +hooky +hooligan +hooliganism +hooliganize +hoolock +hooly +hoon +hoonoomaun +hoop +hooped +hooper +hooping +hoopla +hoople +hoopless +hooplike +hoopmaker +hoopman +hoopoe +hoopstick +hoopwood +hoose +hoosegow +hoosh +Hoosier +Hoosierdom +Hoosierese +Hoosierize +hoot +hootay +hooter +hootingly +hoove +hooven +Hooverism +Hooverize +hoovey +hop +hopbine +hopbush +Hopcalite +hopcrease +hope +hoped +hopeful +hopefully +hopefulness +hopeite +hopeless +hopelessly +hopelessness +hoper +Hopi +hopi +hopingly +Hopkinsian +Hopkinsianism +Hopkinsonian +hoplite +hoplitic +hoplitodromos +Hoplocephalus +hoplology +hoplomachic +hoplomachist +hoplomachos +hoplomachy +Hoplonemertea +hoplonemertean +hoplonemertine +Hoplonemertini +hopoff +hopped +hopper +hopperburn +hopperdozer +hopperette +hoppergrass +hopperings +hopperman +hoppers +hoppestere +hoppet +hoppingly +hoppity +hopple +hoppy +hopscotch +hopscotcher +hoptoad +hopvine +hopyard +hora +horal +horary +Horatian +Horatio +Horatius +horbachite +hordarian +hordary +horde +hordeaceous +hordeiform +hordein +hordenine +Hordeum +horehound +Horim +horismology +horizometer +horizon +horizonless +horizontal +horizontalism +horizontality +horizontalization +horizontalize +horizontally +horizontalness +horizontic +horizontical +horizontically +horizonward +horme +hormic +hormigo +hormion +hormist +hormogon +Hormogonales +Hormogoneae +Hormogoneales +hormogonium +hormogonous +hormonal +hormone +hormonic +hormonize +hormonogenesis +hormonogenic +hormonology +hormonopoiesis +hormonopoietic +hormos +horn +hornbeam +hornbill +hornblende +hornblendic +hornblendite +hornblendophyre +hornblower +hornbook +horned +hornedness +horner +hornerah +hornet +hornety +hornfair +hornfels +hornfish +hornful +horngeld +Hornie +hornify +hornily +horniness +horning +hornish +hornist +hornito +hornless +hornlessness +hornlet +hornlike +hornotine +hornpipe +hornplant +hornsman +hornstay +hornstone +hornswoggle +horntail +hornthumb +horntip +hornwood +hornwork +hornworm +hornwort +horny +hornyhanded +hornyhead +horograph +horographer +horography +horokaka +horologe +horologer +horologic +horological +horologically +horologiography +horologist +horologium +horologue +horology +horometrical +horometry +Horonite +horopito +horopter +horopteric +horoptery +horoscopal +horoscope +horoscoper +horoscopic +horoscopical +horoscopist +horoscopy +Horouta +horrendous +horrendously +horrent +horrescent +horreum +horribility +horrible +horribleness +horribly +horrid +horridity +horridly +horridness +horrific +horrifically +horrification +horrify +horripilant +horripilate +horripilation +horrisonant +horror +horrorful +horrorish +horrorist +horrorize +horrormonger +horrormongering +horrorous +horrorsome +horse +horseback +horsebacker +horseboy +horsebreaker +horsecar +horsecloth +horsecraft +horsedom +horsefair +horsefettler +horsefight +horsefish +horseflesh +horsefly +horsefoot +horsegate +horsehair +horsehaired +horsehead +horseherd +horsehide +horsehood +horsehoof +horsejockey +horsekeeper +horselaugh +horselaugher +horselaughter +horseleech +horseless +horselike +horseload +horseman +horsemanship +horsemastership +horsemint +horsemonger +horseplay +horseplayful +horsepond +horsepower +horsepox +horser +horseshoe +horseshoer +horsetail +horsetongue +Horsetown +horsetree +horseway +horseweed +horsewhip +horsewhipper +horsewoman +horsewomanship +horsewood +horsfordite +horsify +horsily +horsiness +horsing +Horst +horst +horsy +horsyism +hortation +hortative +hortatively +hortator +hortatorily +hortatory +Hortense +Hortensia +hortensial +Hortensian +hortensian +horticultural +horticulturally +horticulture +horticulturist +hortite +hortonolite +hortulan +Horvatian +hory +Hosackia +hosanna +hose +hosed +hosel +hoseless +hoselike +hoseman +hosier +hosiery +hosiomartyr +hospice +hospitable +hospitableness +hospitably +hospitage +hospital +hospitalary +hospitaler +hospitalism +hospitality +hospitalization +hospitalize +hospitant +hospitate +hospitation +hospitator +hospitious +hospitium +hospitize +hospodar +hospodariat +hospodariate +host +Hosta +hostage +hostager +hostageship +hostel +hosteler +hostelry +hoster +hostess +hostie +hostile +hostilely +hostileness +hostility +hostilize +hosting +hostler +hostlership +hostlerwife +hostless +hostly +hostry +hostship +hot +hotbed +hotblood +hotbox +hotbrained +hotch +hotchpot +hotchpotch +hotchpotchly +hotel +hoteldom +hotelhood +hotelier +hotelization +hotelize +hotelkeeper +hotelless +hotelward +hotfoot +hothead +hotheaded +hotheadedly +hotheadedness +hothearted +hotheartedly +hotheartedness +hothouse +hoti +hotly +hotmouthed +hotness +hotspur +hotspurred +Hotta +Hottentot +Hottentotese +Hottentotic +Hottentotish +Hottentotism +hotter +hottery +hottish +Hottonia +houbara +Houdan +hough +houghband +hougher +houghite +houghmagandy +Houghton +hounce +hound +hounder +houndfish +hounding +houndish +houndlike +houndman +houndsbane +houndsberry +houndshark +houndy +houppelande +hour +hourful +hourglass +houri +hourless +hourly +housage +housal +Housatonic +house +houseball +houseboat +houseboating +housebote +housebound +houseboy +housebreak +housebreaker +housebreaking +housebroke +housebroken +housebug +housebuilder +housebuilding +housecarl +housecoat +housecraft +housefast +housefather +housefly +houseful +housefurnishings +household +householder +householdership +householding +householdry +housekeep +housekeeper +housekeeperlike +housekeeperly +housekeeping +housel +houseleek +houseless +houselessness +houselet +houseline +houseling +housemaid +housemaidenly +housemaiding +housemaidy +houseman +housemaster +housemastership +housemate +housemating +houseminder +housemistress +housemother +housemotherly +houseowner +houser +houseridden +houseroom +housesmith +housetop +houseward +housewares +housewarm +housewarmer +housewarming +housewear +housewife +housewifeliness +housewifely +housewifery +housewifeship +housewifish +housewive +housework +housewright +housing +Houstonia +housty +housy +houtou +houvari +Hova +hove +hovedance +hovel +hoveler +hoven +Hovenia +hover +hoverer +hovering +hoveringly +hoverly +how +howadji +Howard +howardite +howbeit +howdah +howder +howdie +howdy +howe +Howea +howel +however +howff +howish +howitzer +howk +howkit +howl +howler +howlet +howling +howlingly +howlite +howso +howsoever +howsomever +hox +hoy +Hoya +hoyden +hoydenhood +hoydenish +hoydenism +hoyle +hoyman +Hrimfaxi +Hrothgar +Hsi +Hsuan +Hu +huaca +huaco +huajillo +huamuchil +huantajayite +huaracho +Huari +huarizo +Huashi +Huastec +Huastecan +Huave +Huavean +hub +hubb +hubba +hubber +Hubbite +hubble +hubbly +hubbub +hubbuboo +hubby +Hubert +hubmaker +hubmaking +hubnerite +hubristic +hubshi +huccatoon +huchen +Huchnom +hucho +huck +huckaback +huckle +huckleback +hucklebacked +huckleberry +hucklebone +huckmuck +huckster +hucksterage +hucksterer +hucksteress +hucksterize +huckstery +hud +huddle +huddledom +huddlement +huddler +huddling +huddlingly +huddock +huddroun +huddup +Hudibras +Hudibrastic +Hudibrastically +Hudsonia +Hudsonian +hudsonite +hue +hued +hueful +hueless +huelessness +huer +Huey +huff +huffier +huffily +huffiness +huffingly +huffish +huffishly +huffishness +huffle +huffler +huffy +hug +huge +Hugelia +hugelite +hugely +hugeness +hugeous +hugeously +hugeousness +huggable +hugger +huggermugger +huggermuggery +Huggin +hugging +huggingly +huggle +Hugh +Hughes +Hughoc +Hugo +Hugoesque +hugsome +Huguenot +Huguenotic +Huguenotism +huh +Hui +huia +huipil +huisache +huiscoyol +huitain +Huk +Hukbalahap +huke +hula +Huldah +huldee +hulk +hulkage +hulking +hulky +hull +hullabaloo +huller +hullock +hulloo +hulotheism +Hulsean +hulsite +hulster +hulu +hulver +hulverhead +hulverheaded +hum +Huma +human +humane +humanely +humaneness +humanhood +humanics +humanification +humaniform +humaniformian +humanify +humanish +humanism +humanist +humanistic +humanistical +humanistically +humanitarian +humanitarianism +humanitarianist +humanitarianize +humanitary +humanitian +humanity +humanitymonger +humanization +humanize +humanizer +humankind +humanlike +humanly +humanness +humanoid +humate +humble +humblebee +humblehearted +humblemouthed +humbleness +humbler +humblie +humblingly +humbly +humbo +humboldtilite +humboldtine +humboldtite +humbug +humbugability +humbugable +humbugger +humbuggery +humbuggism +humbuzz +humdinger +humdrum +humdrumminess +humdrummish +humdrummishness +humdudgeon +Hume +Humean +humect +humectant +humectate +humectation +humective +humeral +humeri +humeroabdominal +humerocubital +humerodigital +humerodorsal +humerometacarpal +humeroradial +humeroscapular +humeroulnar +humerus +humet +humetty +humhum +humic +humicubation +humid +humidate +humidification +humidifier +humidify +humidistat +humidity +humidityproof +humidly +humidness +humidor +humific +humification +humifuse +humify +humiliant +humiliate +humiliating +humiliatingly +humiliation +humiliative +humiliator +humiliatory +humilific +humilitude +humility +humin +Humiria +Humiriaceae +Humiriaceous +Humism +Humist +humistratous +humite +humlie +hummel +hummeler +hummer +hummie +humming +hummingbird +hummock +hummocky +humor +humoral +humoralism +humoralist +humoralistic +humoresque +humoresquely +humorful +humorific +humorism +humorist +humoristic +humoristical +humorize +humorless +humorlessness +humorology +humorous +humorously +humorousness +humorproof +humorsome +humorsomely +humorsomeness +humourful +humous +hump +humpback +humpbacked +humped +humph +Humphrey +humpiness +humpless +humpty +humpy +humstrum +humulene +humulone +Humulus +humus +humuslike +Hun +Hunanese +hunch +Hunchakist +hunchback +hunchbacked +hunchet +hunchy +hundi +hundred +hundredal +hundredary +hundreder +hundredfold +hundredman +hundredpenny +hundredth +hundredweight +hundredwork +hung +Hungaria +Hungarian +hungarite +hunger +hungerer +hungeringly +hungerless +hungerly +hungerproof +hungerweed +hungrify +hungrily +hungriness +hungry +hunh +hunk +Hunker +hunker +Hunkerism +hunkerous +hunkerousness +hunkers +hunkies +Hunkpapa +hunks +hunky +Hunlike +Hunnian +Hunnic +Hunnican +Hunnish +Hunnishness +hunt +huntable +huntedly +Hunter +Hunterian +hunterlike +huntilite +hunting +huntress +huntsman +huntsmanship +huntswoman +Hunyak +hup +Hupa +hupaithric +Hura +hura +hurcheon +hurdies +hurdis +hurdle +hurdleman +hurdler +hurdlewise +hurds +hure +hureaulite +hureek +Hurf +hurgila +hurkle +hurl +hurlbarrow +hurled +hurler +hurley +hurleyhouse +hurling +hurlock +hurly +Huron +huron +Huronian +hurr +hurrah +Hurri +Hurrian +hurricane +hurricanize +hurricano +hurried +hurriedly +hurriedness +hurrier +hurrisome +hurrock +hurroo +hurroosh +hurry +hurryingly +hurryproof +hursinghar +hurst +hurt +hurtable +hurted +hurter +hurtful +hurtfully +hurtfulness +hurting +hurtingest +hurtle +hurtleberry +hurtless +hurtlessly +hurtlessness +hurtlingly +hurtsome +hurty +husband +husbandable +husbandage +husbander +husbandfield +husbandhood +husbandland +husbandless +husbandlike +husbandliness +husbandly +husbandman +husbandress +husbandry +husbandship +huse +hush +hushable +hushaby +hushcloth +hushedly +husheen +hushel +husher +hushful +hushfully +hushing +hushingly +hushion +husho +husk +huskanaw +husked +huskened +husker +huskershredder +huskily +huskiness +husking +huskroot +huskwort +Husky +husky +huso +huspil +huss +hussar +Hussite +Hussitism +hussy +hussydom +hussyness +husting +hustle +hustlecap +hustlement +hustler +hut +hutch +hutcher +hutchet +Hutchinsonian +Hutchinsonianism +hutchinsonite +Huterian +huthold +hutholder +hutia +hutkeeper +hutlet +hutment +Hutsulian +Hutterites +Huttonian +Huttonianism +huttoning +huttonweed +hutukhtu +huvelyk +Huxleian +Huygenian +huzoor +Huzvaresh +huzz +huzza +huzzard +Hwa +Hy +hyacinth +Hyacinthia +hyacinthian +hyacinthine +Hyacinthus +Hyades +hyaena +Hyaenanche +Hyaenarctos +Hyaenidae +Hyaenodon +hyaenodont +hyaenodontoid +Hyakume +hyalescence +hyalescent +hyaline +hyalinization +hyalinize +hyalinocrystalline +hyalinosis +hyalite +hyalitis +hyaloandesite +hyalobasalt +hyalocrystalline +hyalodacite +hyalogen +hyalograph +hyalographer +hyalography +hyaloid +hyaloiditis +hyaloliparite +hyalolith +hyalomelan +hyalomucoid +Hyalonema +hyalophagia +hyalophane +hyalophyre +hyalopilitic +hyaloplasm +hyaloplasma +hyaloplasmic +hyalopsite +hyalopterous +hyalosiderite +Hyalospongia +hyalotekite +hyalotype +hyaluronic +hyaluronidase +Hybanthus +Hybla +Hyblaea +Hyblaean +Hyblan +hybodont +Hybodus +hybosis +hybrid +hybridal +hybridation +hybridism +hybridist +hybridity +hybridizable +hybridization +hybridize +hybridizer +hybridous +hydantoate +hydantoic +hydantoin +hydathode +hydatid +hydatidiform +hydatidinous +hydatidocele +hydatiform +hydatigenous +Hydatina +hydatogenesis +hydatogenic +hydatogenous +hydatoid +hydatomorphic +hydatomorphism +hydatopneumatic +hydatopneumatolytic +hydatopyrogenic +hydatoscopy +Hydnaceae +hydnaceous +hydnocarpate +hydnocarpic +Hydnocarpus +hydnoid +Hydnora +Hydnoraceae +hydnoraceous +Hydnum +Hydra +hydracetin +Hydrachna +hydrachnid +Hydrachnidae +hydracid +hydracoral +hydracrylate +hydracrylic +Hydractinia +hydractinian +Hydradephaga +hydradephagan +hydradephagous +hydragogue +hydragogy +hydramine +hydramnion +hydramnios +Hydrangea +Hydrangeaceae +hydrangeaceous +hydrant +hydranth +hydrarch +hydrargillite +hydrargyrate +hydrargyria +hydrargyriasis +hydrargyric +hydrargyrism +hydrargyrosis +hydrargyrum +hydrarthrosis +hydrarthrus +hydrastine +Hydrastis +hydrate +hydrated +hydration +hydrator +hydratropic +hydraucone +hydraulic +hydraulically +hydraulician +hydraulicity +hydraulicked +hydraulicon +hydraulics +hydraulist +hydraulus +hydrazide +hydrazidine +hydrazimethylene +hydrazine +hydrazino +hydrazo +hydrazoate +hydrazobenzene +hydrazoic +hydrazone +hydrazyl +hydremia +hydremic +hydrencephalocele +hydrencephaloid +hydrencephalus +hydria +hydriatric +hydriatrist +hydriatry +hydric +hydrically +Hydrid +hydride +hydriform +hydrindene +hydriodate +hydriodic +hydriodide +hydriotaphia +Hydriote +hydro +hydroa +hydroadipsia +hydroaeric +hydroalcoholic +hydroaromatic +hydroatmospheric +hydroaviation +hydrobarometer +Hydrobates +Hydrobatidae +hydrobenzoin +hydrobilirubin +hydrobiological +hydrobiologist +hydrobiology +hydrobiosis +hydrobiplane +hydrobomb +hydroboracite +hydroborofluoric +hydrobranchiate +hydrobromate +hydrobromic +hydrobromide +hydrocarbide +hydrocarbon +hydrocarbonaceous +hydrocarbonate +hydrocarbonic +hydrocarbonous +hydrocarbostyril +hydrocardia +Hydrocaryaceae +hydrocaryaceous +hydrocatalysis +hydrocauline +hydrocaulus +hydrocele +hydrocellulose +hydrocephalic +hydrocephalocele +hydrocephaloid +hydrocephalous +hydrocephalus +hydrocephaly +hydroceramic +hydrocerussite +Hydrocharidaceae +hydrocharidaceous +Hydrocharis +Hydrocharitaceae +hydrocharitaceous +Hydrochelidon +hydrochemical +hydrochemistry +hydrochlorate +hydrochlorauric +hydrochloric +hydrochloride +hydrochlorplatinic +hydrochlorplatinous +Hydrochoerus +hydrocholecystis +hydrocinchonine +hydrocinnamic +hydrocirsocele +hydrocladium +hydroclastic +Hydrocleis +hydroclimate +hydrocobalticyanic +hydrocoele +hydrocollidine +hydroconion +Hydrocorallia +Hydrocorallinae +hydrocoralline +Hydrocores +Hydrocorisae +hydrocorisan +hydrocotarnine +Hydrocotyle +hydrocoumaric +hydrocupreine +hydrocyanate +hydrocyanic +hydrocyanide +hydrocycle +hydrocyclic +hydrocyclist +Hydrocyon +hydrocyst +hydrocystic +Hydrodamalidae +Hydrodamalis +Hydrodictyaceae +Hydrodictyon +hydrodrome +Hydrodromica +hydrodromican +hydrodynamic +hydrodynamical +hydrodynamics +hydrodynamometer +hydroeconomics +hydroelectric +hydroelectricity +hydroelectrization +hydroergotinine +hydroextract +hydroextractor +hydroferricyanic +hydroferrocyanate +hydroferrocyanic +hydrofluate +hydrofluoboric +hydrofluoric +hydrofluorid +hydrofluoride +hydrofluosilicate +hydrofluosilicic +hydrofluozirconic +hydrofoil +hydroforming +hydrofranklinite +hydrofuge +hydrogalvanic +hydrogel +hydrogen +hydrogenase +hydrogenate +hydrogenation +hydrogenator +hydrogenic +hydrogenide +hydrogenium +hydrogenization +hydrogenize +hydrogenolysis +Hydrogenomonas +hydrogenous +hydrogeological +hydrogeology +hydroglider +hydrognosy +hydrogode +hydrograph +hydrographer +hydrographic +hydrographical +hydrographically +hydrography +hydrogymnastics +hydrohalide +hydrohematite +hydrohemothorax +hydroid +Hydroida +Hydroidea +hydroidean +hydroiodic +hydrokinetic +hydrokinetical +hydrokinetics +hydrol +hydrolase +hydrolatry +Hydrolea +Hydroleaceae +hydrolize +hydrologic +hydrological +hydrologically +hydrologist +hydrology +hydrolysis +hydrolyst +hydrolyte +hydrolytic +hydrolyzable +hydrolyzate +hydrolyzation +hydrolyze +hydromagnesite +hydromancer +hydromancy +hydromania +hydromaniac +hydromantic +hydromantical +hydromantically +hydrome +hydromechanical +hydromechanics +hydromedusa +Hydromedusae +hydromedusan +hydromedusoid +hydromel +hydromeningitis +hydromeningocele +hydrometallurgical +hydrometallurgically +hydrometallurgy +hydrometamorphism +hydrometeor +hydrometeorological +hydrometeorology +hydrometer +hydrometra +hydrometric +hydrometrical +hydrometrid +Hydrometridae +hydrometry +hydromica +hydromicaceous +hydromonoplane +hydromorph +hydromorphic +hydromorphous +hydromorphy +hydromotor +hydromyelia +hydromyelocele +hydromyoma +Hydromys +hydrone +hydronegative +hydronephelite +hydronephrosis +hydronephrotic +hydronitric +hydronitroprussic +hydronitrous +hydronium +hydroparacoumaric +Hydroparastatae +hydropath +hydropathic +hydropathical +hydropathist +hydropathy +hydropericarditis +hydropericardium +hydroperiod +hydroperitoneum +hydroperitonitis +hydroperoxide +hydrophane +hydrophanous +hydrophid +Hydrophidae +hydrophil +hydrophile +hydrophilic +hydrophilid +Hydrophilidae +hydrophilism +hydrophilite +hydrophiloid +hydrophilous +hydrophily +Hydrophinae +Hydrophis +hydrophobe +hydrophobia +hydrophobic +hydrophobical +hydrophobist +hydrophobophobia +hydrophobous +hydrophoby +hydrophoid +hydrophone +Hydrophora +hydrophoran +hydrophore +hydrophoria +hydrophorous +hydrophthalmia +hydrophthalmos +hydrophthalmus +hydrophylacium +hydrophyll +Hydrophyllaceae +hydrophyllaceous +hydrophylliaceous +hydrophyllium +Hydrophyllum +hydrophysometra +hydrophyte +hydrophytic +hydrophytism +hydrophyton +hydrophytous +hydropic +hydropical +hydropically +hydropigenous +hydroplane +hydroplanula +hydroplatinocyanic +hydroplutonic +hydropneumatic +hydropneumatosis +hydropneumopericardium +hydropneumothorax +hydropolyp +hydroponic +hydroponicist +hydroponics +hydroponist +hydropositive +hydropot +Hydropotes +hydropropulsion +hydrops +hydropsy +Hydropterideae +hydroptic +hydropult +hydropultic +hydroquinine +hydroquinol +hydroquinoline +hydroquinone +hydrorachis +hydrorhiza +hydrorhizal +hydrorrhachis +hydrorrhachitis +hydrorrhea +hydrorrhoea +hydrorubber +hydrosalpinx +hydrosalt +hydrosarcocele +hydroscope +hydroscopic +hydroscopical +hydroscopicity +hydroscopist +hydroselenic +hydroselenide +hydroselenuret +hydroseparation +hydrosilicate +hydrosilicon +hydrosol +hydrosomal +hydrosomatous +hydrosome +hydrosorbic +hydrosphere +hydrospire +hydrospiric +hydrostat +hydrostatic +hydrostatical +hydrostatically +hydrostatician +hydrostatics +hydrostome +hydrosulphate +hydrosulphide +hydrosulphite +hydrosulphocyanic +hydrosulphurated +hydrosulphuret +hydrosulphureted +hydrosulphuric +hydrosulphurous +hydrosulphuryl +hydrotachymeter +hydrotactic +hydrotalcite +hydrotasimeter +hydrotaxis +hydrotechnic +hydrotechnical +hydrotechnologist +hydrotechny +hydroterpene +hydrotheca +hydrothecal +hydrotherapeutic +hydrotherapeutics +hydrotherapy +hydrothermal +hydrothoracic +hydrothorax +hydrotic +hydrotical +hydrotimeter +hydrotimetric +hydrotimetry +hydrotomy +hydrotropic +hydrotropism +hydroturbine +hydrotype +hydrous +hydrovane +hydroxamic +hydroxamino +hydroxide +hydroximic +hydroxy +hydroxyacetic +hydroxyanthraquinone +hydroxybutyricacid +hydroxyketone +hydroxyl +hydroxylactone +hydroxylamine +hydroxylate +hydroxylation +hydroxylic +hydroxylization +hydroxylize +hydrozincite +Hydrozoa +hydrozoal +hydrozoan +hydrozoic +hydrozoon +hydrula +Hydruntine +Hydrurus +Hydrus +hydurilate +hydurilic +hyena +hyenadog +hyenanchin +hyenic +hyeniform +hyenine +hyenoid +hyetal +hyetograph +hyetographic +hyetographical +hyetographically +hyetography +hyetological +hyetology +hyetometer +hyetometrograph +Hygeia +Hygeian +hygeiolatry +hygeist +hygeistic +hygeology +hygiantic +hygiantics +hygiastic +hygiastics +hygieist +hygienal +hygiene +hygienic +hygienical +hygienically +hygienics +hygienist +hygienization +hygienize +hygiologist +hygiology +hygric +hygrine +hygroblepharic +hygrodeik +hygroexpansivity +hygrograph +hygrology +hygroma +hygromatous +hygrometer +hygrometric +hygrometrical +hygrometrically +hygrometry +hygrophaneity +hygrophanous +hygrophilous +hygrophobia +hygrophthalmic +hygrophyte +hygrophytic +hygroplasm +hygroplasma +hygroscope +hygroscopic +hygroscopical +hygroscopically +hygroscopicity +hygroscopy +hygrostat +hygrostatics +hygrostomia +hygrothermal +hygrothermograph +hying +hyke +Hyla +hylactic +hylactism +hylarchic +hylarchical +hyle +hyleg +hylegiacal +hylic +hylicism +hylicist +Hylidae +hylism +hylist +Hyllus +Hylobates +hylobatian +hylobatic +hylobatine +Hylocereus +Hylocichla +Hylocomium +Hylodes +hylogenesis +hylogeny +hyloid +hylology +hylomorphic +hylomorphical +hylomorphism +hylomorphist +hylomorphous +Hylomys +hylopathism +hylopathist +hylopathy +hylophagous +hylotheism +hylotheist +hylotheistic +hylotheistical +hylotomous +hylozoic +hylozoism +hylozoist +hylozoistic +hylozoistically +hymen +Hymenaea +Hymenaeus +Hymenaic +hymenal +hymeneal +hymeneally +hymeneals +hymenean +hymenial +hymenic +hymenicolar +hymeniferous +hymeniophore +hymenium +Hymenocallis +Hymenochaete +Hymenogaster +Hymenogastraceae +hymenogeny +hymenoid +Hymenolepis +hymenomycetal +hymenomycete +Hymenomycetes +hymenomycetoid +hymenomycetous +hymenophore +hymenophorum +Hymenophyllaceae +hymenophyllaceous +Hymenophyllites +Hymenophyllum +hymenopter +Hymenoptera +hymenopteran +hymenopterist +hymenopterological +hymenopterologist +hymenopterology +hymenopteron +hymenopterous +hymenotomy +Hymettian +Hymettic +hymn +hymnal +hymnarium +hymnary +hymnbook +hymner +hymnic +hymnist +hymnless +hymnlike +hymnode +hymnodical +hymnodist +hymnody +hymnographer +hymnography +hymnologic +hymnological +hymnologically +hymnologist +hymnology +hymnwise +hynde +hyne +hyobranchial +hyocholalic +hyocholic +hyoepiglottic +hyoepiglottidean +hyoglossal +hyoglossus +hyoglycocholic +hyoid +hyoidal +hyoidan +hyoideal +hyoidean +hyoides +Hyolithes +hyolithid +Hyolithidae +hyolithoid +hyomandibula +hyomandibular +hyomental +hyoplastral +hyoplastron +hyoscapular +hyoscine +hyoscyamine +Hyoscyamus +hyosternal +hyosternum +hyostylic +hyostyly +hyothere +Hyotherium +hyothyreoid +hyothyroid +hyp +hypabyssal +hypaethral +hypaethron +hypaethros +hypaethrum +hypalgesia +hypalgia +hypalgic +hypallactic +hypallage +hypanthial +hypanthium +hypantrum +Hypapante +hypapophysial +hypapophysis +hyparterial +hypaspist +hypate +hypaton +hypautomorphic +hypaxial +Hypenantron +hyper +hyperabelian +hyperabsorption +hyperaccurate +hyperacid +hyperacidaminuria +hyperacidity +hyperacoustics +hyperaction +hyperactive +hyperactivity +hyperacuity +hyperacusia +hyperacusis +hyperacute +hyperacuteness +hyperadenosis +hyperadiposis +hyperadiposity +hyperadrenalemia +hyperaeolism +hyperalbuminosis +hyperalgebra +hyperalgesia +hyperalgesic +hyperalgesis +hyperalgetic +hyperalimentation +hyperalkalinity +hyperaltruism +hyperaminoacidemia +hyperanabolic +hyperanarchy +hyperangelical +hyperaphia +hyperaphic +hyperapophyseal +hyperapophysial +hyperapophysis +hyperarchaeological +hyperarchepiscopal +hyperazotemia +hyperbarbarous +hyperbatic +hyperbatically +hyperbaton +hyperbola +hyperbolaeon +hyperbole +hyperbolic +hyperbolically +hyperbolicly +hyperbolism +hyperbolize +hyperboloid +hyperboloidal +hyperboreal +Hyperborean +hyperborean +hyperbrachycephal +hyperbrachycephalic +hyperbrachycephaly +hyperbrachycranial +hyperbrachyskelic +hyperbranchia +hyperbrutal +hyperbulia +hypercalcemia +hypercarbamidemia +hypercarbureted +hypercarburetted +hypercarnal +hypercatalectic +hypercatalexis +hypercatharsis +hypercathartic +hypercathexis +hypercenosis +hyperchamaerrhine +hyperchlorhydria +hyperchloric +hypercholesterinemia +hypercholesterolemia +hypercholia +hypercivilization +hypercivilized +hyperclassical +hyperclimax +hypercoagulability +hypercoagulable +hypercomplex +hypercomposite +hyperconcentration +hypercone +hyperconfident +hyperconformist +hyperconscientious +hyperconscientiousness +hyperconscious +hyperconsciousness +hyperconservatism +hyperconstitutional +hypercoracoid +hypercorrect +hypercorrection +hypercorrectness +hypercosmic +hypercreaturely +hypercritic +hypercritical +hypercritically +hypercriticism +hypercriticize +hypercryalgesia +hypercube +hypercyanotic +hypercycle +hypercylinder +hyperdactyl +hyperdactylia +hyperdactyly +hyperdeify +hyperdelicacy +hyperdelicate +hyperdemocracy +hyperdemocratic +hyperdeterminant +hyperdiabolical +hyperdialectism +hyperdiapason +hyperdiapente +hyperdiastole +hyperdiatessaron +hyperdiazeuxis +hyperdicrotic +hyperdicrotism +hyperdicrotous +hyperdimensional +hyperdimensionality +hyperdissyllable +hyperdistention +hyperditone +hyperdivision +hyperdolichocephal +hyperdolichocephalic +hyperdolichocephaly +hyperdolichocranial +hyperdoricism +hyperdulia +hyperdulic +hyperdulical +hyperelegant +hyperelliptic +hyperemesis +hyperemetic +hyperemia +hyperemic +hyperemotivity +hyperemphasize +hyperenthusiasm +hypereosinophilia +hyperephidrosis +hyperequatorial +hypererethism +hyperessence +hyperesthesia +hyperesthetic +hyperethical +hypereuryprosopic +hypereutectic +hypereutectoid +hyperexaltation +hyperexcitability +hyperexcitable +hyperexcitement +hyperexcursive +hyperexophoria +hyperextend +hyperextension +hyperfastidious +hyperfederalist +hyperfine +hyperflexion +hyperfocal +hyperfunction +hyperfunctional +hyperfunctioning +hypergalactia +hypergamous +hypergamy +hypergenesis +hypergenetic +hypergeometric +hypergeometrical +hypergeometry +hypergeusia +hypergeustia +hyperglycemia +hyperglycemic +hyperglycorrhachia +hyperglycosuria +hypergoddess +hypergol +hypergolic +Hypergon +hypergrammatical +hyperhedonia +hyperhemoglobinemia +hyperhilarious +hyperhypocrisy +Hypericaceae +hypericaceous +Hypericales +hypericin +hypericism +Hypericum +hypericum +hyperidealistic +hyperideation +hyperimmune +hyperimmunity +hyperimmunization +hyperimmunize +hyperingenuity +hyperinosis +hyperinotic +hyperinsulinization +hyperinsulinize +hyperintellectual +hyperintelligence +hyperinvolution +hyperirritability +hyperirritable +hyperisotonic +hyperite +hyperkeratosis +hyperkinesia +hyperkinesis +hyperkinetic +hyperlactation +hyperleptoprosopic +hyperleucocytosis +hyperlipemia +hyperlipoidemia +hyperlithuria +hyperlogical +hyperlustrous +hypermagical +hypermakroskelic +hypermedication +hypermenorrhea +hypermetabolism +hypermetamorphic +hypermetamorphism +hypermetamorphosis +hypermetamorphotic +hypermetaphorical +hypermetaphysical +hypermetaplasia +hypermeter +hypermetric +hypermetrical +hypermetron +hypermetrope +hypermetropia +hypermetropic +hypermetropical +hypermetropy +hypermiraculous +hypermixolydian +hypermnesia +hypermnesic +hypermnesis +hypermnestic +hypermodest +hypermonosyllable +hypermoral +hypermorph +hypermorphism +hypermorphosis +hypermotile +hypermotility +hypermyotonia +hypermyotrophy +hypermyriorama +hypermystical +hypernatural +hypernephroma +hyperneuria +hyperneurotic +hypernic +hypernitrogenous +hypernomian +hypernomic +hypernormal +hypernote +hypernutrition +Hyperoartia +hyperoartian +hyperobtrusive +hyperodontogeny +Hyperoodon +hyperoon +hyperope +hyperopia +hyperopic +hyperorganic +hyperorthognathic +hyperorthognathous +hyperorthognathy +hyperosmia +hyperosmic +hyperostosis +hyperostotic +hyperothodox +hyperothodoxy +Hyperotreta +hyperotretan +Hyperotreti +hyperotretous +hyperoxidation +hyperoxide +hyperoxygenate +hyperoxygenation +hyperoxygenize +hyperpanegyric +hyperparasite +hyperparasitic +hyperparasitism +hyperparasitize +hyperparoxysm +hyperpathetic +hyperpatriotic +hyperpencil +hyperpepsinia +hyperper +hyperperistalsis +hyperperistaltic +hyperpersonal +hyperphalangeal +hyperphalangism +hyperpharyngeal +hyperphenomena +hyperphoria +hyperphoric +hyperphosphorescence +hyperphysical +hyperphysically +hyperphysics +hyperpiesia +hyperpiesis +hyperpietic +hyperpietist +hyperpigmentation +hyperpigmented +hyperpinealism +hyperpituitarism +hyperplagiarism +hyperplane +hyperplasia +hyperplasic +hyperplastic +hyperplatyrrhine +hyperploid +hyperploidy +hyperpnea +hyperpnoea +hyperpolysyllabic +hyperpredator +hyperprism +hyperproduction +hyperprognathous +hyperprophetical +hyperprosexia +hyperpulmonary +hyperpure +hyperpurist +hyperpyramid +hyperpyretic +hyperpyrexia +hyperpyrexial +hyperquadric +hyperrational +hyperreactive +hyperrealize +hyperresonance +hyperresonant +hyperreverential +hyperrhythmical +hyperridiculous +hyperritualism +hypersacerdotal +hypersaintly +hypersalivation +hypersceptical +hyperscholastic +hyperscrupulosity +hypersecretion +hypersensibility +hypersensitive +hypersensitiveness +hypersensitivity +hypersensitization +hypersensitize +hypersensual +hypersensualism +hypersensuous +hypersentimental +hypersolid +hypersomnia +hypersonic +hypersophisticated +hyperspace +hyperspatial +hyperspeculative +hypersphere +hyperspherical +hyperspiritualizing +hypersplenia +hypersplenism +hypersthene +hypersthenia +hypersthenic +hypersthenite +hyperstoic +hyperstrophic +hypersubtlety +hypersuggestibility +hypersuperlative +hypersurface +hypersusceptibility +hypersusceptible +hypersystole +hypersystolic +hypertechnical +hypertelic +hypertely +hypertense +hypertensin +hypertension +hypertensive +hyperterrestrial +hypertetrahedron +hyperthermal +hyperthermalgesia +hyperthermesthesia +hyperthermia +hyperthermic +hyperthermy +hyperthesis +hyperthetic +hyperthetical +hyperthyreosis +hyperthyroid +hyperthyroidism +hyperthyroidization +hyperthyroidize +hypertonia +hypertonic +hypertonicity +hypertonus +hypertorrid +hypertoxic +hypertoxicity +hypertragical +hypertragically +hypertranscendent +hypertrichosis +hypertridimensional +hypertrophic +hypertrophied +hypertrophous +hypertrophy +hypertropia +hypertropical +hypertype +hypertypic +hypertypical +hyperurbanism +hyperuresis +hypervascular +hypervascularity +hypervenosity +hyperventilate +hyperventilation +hypervigilant +hyperviscosity +hypervitalization +hypervitalize +hypervitaminosis +hypervolume +hyperwrought +hypesthesia +hypesthesic +hypethral +hypha +Hyphaene +hyphaeresis +hyphal +hyphedonia +hyphema +hyphen +hyphenate +hyphenated +hyphenation +hyphenic +hyphenism +hyphenization +hyphenize +hypho +hyphodrome +Hyphomycetales +hyphomycete +Hyphomycetes +hyphomycetic +hyphomycetous +hyphomycosis +hypidiomorphic +hypidiomorphically +hypinosis +hypinotic +Hypnaceae +hypnaceous +hypnagogic +hypnesthesis +hypnesthetic +hypnoanalysis +hypnobate +hypnocyst +hypnody +hypnoetic +hypnogenesis +hypnogenetic +hypnoid +hypnoidal +hypnoidization +hypnoidize +hypnologic +hypnological +hypnologist +hypnology +hypnone +hypnophobia +hypnophobic +hypnophoby +hypnopompic +Hypnos +hypnoses +hypnosis +hypnosperm +hypnosporangium +hypnospore +hypnosporic +hypnotherapy +hypnotic +hypnotically +hypnotism +hypnotist +hypnotistic +hypnotizability +hypnotizable +hypnotization +hypnotize +hypnotizer +hypnotoid +hypnotoxin +Hypnum +hypo +hypoacid +hypoacidity +hypoactive +hypoactivity +hypoadenia +hypoadrenia +hypoaeolian +hypoalimentation +hypoalkaline +hypoalkalinity +hypoaminoacidemia +hypoantimonate +hypoazoturia +hypobasal +hypobatholithic +hypobenthonic +hypobenthos +hypoblast +hypoblastic +hypobole +hypobranchial +hypobranchiate +hypobromite +hypobromous +hypobulia +hypobulic +hypocalcemia +hypocarp +hypocarpium +hypocarpogean +hypocatharsis +hypocathartic +hypocathexis +hypocaust +hypocentrum +hypocephalus +Hypochaeris +hypochil +hypochilium +hypochlorhydria +hypochlorhydric +hypochloric +hypochlorite +hypochlorous +hypochloruria +Hypochnaceae +hypochnose +Hypochnus +hypochondria +hypochondriac +hypochondriacal +hypochondriacally +hypochondriacism +hypochondrial +hypochondriasis +hypochondriast +hypochondrium +hypochondry +hypochordal +hypochromia +hypochrosis +hypochylia +hypocist +hypocleidian +hypocleidium +hypocoelom +hypocondylar +hypocone +hypoconid +hypoconule +hypoconulid +hypocoracoid +hypocorism +hypocoristic +hypocoristical +hypocoristically +hypocotyl +hypocotyleal +hypocotyledonary +hypocotyledonous +hypocotylous +hypocrater +hypocrateriform +hypocraterimorphous +Hypocreaceae +hypocreaceous +Hypocreales +hypocrisis +hypocrisy +hypocrital +hypocrite +hypocritic +hypocritical +hypocritically +hypocrize +hypocrystalline +hypocycloid +hypocycloidal +hypocystotomy +hypocytosis +hypodactylum +hypoderm +hypoderma +hypodermal +hypodermatic +hypodermatically +hypodermatoclysis +hypodermatomy +Hypodermella +hypodermic +hypodermically +hypodermis +hypodermoclysis +hypodermosis +hypodermous +hypodiapason +hypodiapente +hypodiastole +hypodiatessaron +hypodiazeuxis +hypodicrotic +hypodicrotous +hypoditone +hypodorian +hypodynamia +hypodynamic +hypoeliminator +hypoendocrinism +hypoeosinophilia +hypoeutectic +hypoeutectoid +hypofunction +hypogastric +hypogastrium +hypogastrocele +hypogeal +hypogean +hypogee +hypogeic +hypogeiody +hypogene +hypogenesis +hypogenetic +hypogenic +hypogenous +hypogeocarpous +hypogeous +hypogeum +hypogeusia +hypoglobulia +hypoglossal +hypoglossitis +hypoglossus +hypoglottis +hypoglycemia +hypoglycemic +hypognathism +hypognathous +hypogonation +hypogynic +hypogynium +hypogynous +hypogyny +hypohalous +hypohemia +hypohidrosis +Hypohippus +hypohyal +hypohyaline +hypoid +hypoiodite +hypoiodous +hypoionian +hypoischium +hypoisotonic +hypokeimenometry +hypokinesia +hypokinesis +hypokinetic +hypokoristikon +hypolemniscus +hypoleptically +hypoleucocytosis +hypolimnion +hypolocrian +hypolydian +hypomania +hypomanic +hypomelancholia +hypomeral +hypomere +hypomeron +hypometropia +hypomixolydian +hypomnematic +hypomnesis +hypomochlion +hypomorph +hypomotility +hypomyotonia +hyponastic +hyponastically +hyponasty +hyponeuria +hyponitric +hyponitrite +hyponitrous +hyponoetic +hyponoia +hyponome +hyponomic +hyponychial +hyponychium +hyponym +hyponymic +hyponymous +Hypoparia +hypopepsia +hypopepsinia +hypopepsy +hypopetalous +hypopetaly +hypophalangism +hypophamin +hypophamine +hypophare +hypopharyngeal +hypopharynx +hypophloeodal +hypophloeodic +hypophloeous +hypophonic +hypophonous +hypophora +hypophoria +hypophosphate +hypophosphite +hypophosphoric +hypophosphorous +hypophrenia +hypophrenic +hypophrenosis +hypophrygian +hypophyge +hypophyll +hypophyllium +hypophyllous +hypophyllum +hypophyse +hypophyseal +hypophysectomize +hypophysectomy +hypophyseoprivic +hypophyseoprivous +hypophysial +hypophysical +hypophysics +hypophysis +hypopial +hypopinealism +hypopituitarism +Hypopitys +hypoplankton +hypoplanktonic +hypoplasia +hypoplastic +hypoplastral +hypoplastron +hypoplasty +hypoplasy +hypoploid +hypoploidy +hypopodium +hypopraxia +hypoprosexia +hypopselaphesia +hypopteral +hypopteron +hypoptilar +hypoptilum +hypoptosis +hypoptyalism +hypopus +hypopygial +hypopygidium +hypopygium +hypopyon +hyporadial +hyporadiolus +hyporadius +hyporchema +hyporchematic +hyporcheme +hyporchesis +hyporhachidian +hyporhachis +hyporhined +hyporit +hyporrhythmic +hyposcenium +hyposcleral +hyposcope +hyposecretion +hyposensitization +hyposensitize +hyposkeletal +hyposmia +hypospadiac +hypospadias +hyposphene +hypospray +hypostase +hypostasis +hypostasization +hypostasize +hypostasy +hypostatic +hypostatical +hypostatically +hypostatization +hypostatize +hyposternal +hyposternum +hyposthenia +hyposthenic +hyposthenuria +hypostigma +hypostilbite +hypostoma +Hypostomata +hypostomatic +hypostomatous +hypostome +hypostomial +Hypostomides +hypostomous +hypostrophe +hypostyle +hypostypsis +hypostyptic +hyposulphite +hyposulphurous +hyposuprarenalism +hyposyllogistic +hyposynaphe +hyposynergia +hyposystole +hypotactic +hypotarsal +hypotarsus +hypotaxia +hypotaxic +hypotaxis +hypotension +hypotensive +hypotensor +hypotenusal +hypotenuse +hypothalamic +hypothalamus +hypothalline +hypothallus +hypothec +hypotheca +hypothecal +hypothecary +hypothecate +hypothecation +hypothecative +hypothecator +hypothecatory +hypothecial +hypothecium +hypothenal +hypothenar +Hypotheria +hypothermal +hypothermia +hypothermic +hypothermy +hypotheses +hypothesis +hypothesist +hypothesize +hypothesizer +hypothetic +hypothetical +hypothetically +hypothetics +hypothetist +hypothetize +hypothetizer +hypothyreosis +hypothyroid +hypothyroidism +hypotonia +hypotonic +hypotonicity +hypotonus +hypotony +hypotoxic +hypotoxicity +hypotrachelium +Hypotremata +hypotrich +Hypotricha +Hypotrichida +hypotrichosis +hypotrichous +hypotrochanteric +hypotrochoid +hypotrochoidal +hypotrophic +hypotrophy +hypotympanic +hypotypic +hypotypical +hypotyposis +hypovalve +hypovanadate +hypovanadic +hypovanadious +hypovanadous +hypovitaminosis +hypoxanthic +hypoxanthine +Hypoxis +Hypoxylon +hypozeugma +hypozeuxis +Hypozoa +hypozoan +hypozoic +hyppish +hypsibrachycephalic +hypsibrachycephalism +hypsibrachycephaly +hypsicephalic +hypsicephaly +hypsidolichocephalic +hypsidolichocephalism +hypsidolichocephaly +hypsiliform +hypsiloid +Hypsilophodon +hypsilophodont +hypsilophodontid +Hypsilophodontidae +hypsilophodontoid +Hypsiprymninae +Hypsiprymnodontinae +Hypsiprymnus +Hypsistarian +hypsistenocephalic +hypsistenocephalism +hypsistenocephaly +hypsobathymetric +hypsocephalous +hypsochrome +hypsochromic +hypsochromy +hypsodont +hypsodontism +hypsodonty +hypsographic +hypsographical +hypsography +hypsoisotherm +hypsometer +hypsometric +hypsometrical +hypsometrically +hypsometrist +hypsometry +hypsophobia +hypsophonous +hypsophyll +hypsophyllar +hypsophyllary +hypsophyllous +hypsophyllum +hypsothermometer +hypural +hyraces +hyraceum +Hyrachyus +hyracid +Hyracidae +hyraciform +Hyracina +Hyracodon +hyracodont +hyracodontid +Hyracodontidae +hyracodontoid +hyracoid +Hyracoidea +hyracoidean +hyracothere +hyracotherian +Hyracotheriinae +Hyracotherium +hyrax +Hyrcan +Hyrcanian +hyson +hyssop +Hyssopus +hystazarin +hysteralgia +hysteralgic +hysteranthous +hysterectomy +hysterelcosis +hysteresial +hysteresis +hysteretic +hysteretically +hysteria +hysteriac +Hysteriales +hysteric +hysterical +hysterically +hystericky +hysterics +hysteriform +hysterioid +Hysterocarpus +hysterocatalepsy +hysterocele +hysterocleisis +hysterocrystalline +hysterocystic +hysterodynia +hysterogen +hysterogenetic +hysterogenic +hysterogenous +hysterogeny +hysteroid +hysterolaparotomy +hysterolith +hysterolithiasis +hysterology +hysterolysis +hysteromania +hysterometer +hysterometry +hysteromorphous +hysteromyoma +hysteromyomectomy +hysteron +hysteroneurasthenia +hysteropathy +hysteropexia +hysteropexy +hysterophore +Hysterophyta +hysterophytal +hysterophyte +hysteroproterize +hysteroptosia +hysteroptosis +hysterorrhaphy +hysterorrhexis +hysteroscope +hysterosis +hysterotome +hysterotomy +hysterotraumatism +hystriciasis +hystricid +Hystricidae +Hystricinae +hystricine +hystricism +hystricismus +hystricoid +hystricomorph +Hystricomorpha +hystricomorphic +hystricomorphous +Hystrix +I +i +Iacchic +Iacchos +Iacchus +Iachimo +iamatology +iamb +Iambe +iambelegus +iambi +iambic +iambically +iambist +iambize +iambographer +iambus +Ian +Ianthina +ianthine +ianthinite +Ianus +iao +Iapetus +Iapyges +Iapygian +Iapygii +iatraliptic +iatraliptics +iatric +iatrical +iatrochemic +iatrochemical +iatrochemist +iatrochemistry +iatrological +iatrology +iatromathematical +iatromathematician +iatromathematics +iatromechanical +iatromechanist +iatrophysical +iatrophysicist +iatrophysics +iatrotechnics +iba +Ibad +Ibadite +Iban +Ibanag +Iberes +Iberi +Iberia +Iberian +Iberic +Iberis +Iberism +iberite +ibex +ibices +ibid +Ibididae +Ibidinae +ibidine +Ibidium +Ibilao +ibis +ibisbill +Ibo +ibolium +ibota +Ibsenian +Ibsenic +Ibsenish +Ibsenism +Ibsenite +Ibycter +Ibycus +Icacinaceae +icacinaceous +icaco +Icacorea +Icaria +Icarian +Icarianism +Icarus +ice +iceberg +iceblink +iceboat +icebone +icebound +icebox +icebreaker +icecap +icecraft +iced +icefall +icefish +icehouse +Iceland +iceland +Icelander +Icelandian +Icelandic +iceleaf +iceless +Icelidae +icelike +iceman +Iceni +icequake +iceroot +Icerya +icework +ich +Ichneumia +ichneumon +ichneumoned +Ichneumones +ichneumonid +Ichneumonidae +ichneumonidan +Ichneumonides +ichneumoniform +ichneumonized +ichneumonoid +Ichneumonoidea +ichneumonology +ichneumous +ichneutic +ichnite +ichnographic +ichnographical +ichnographically +ichnography +ichnolite +ichnolithology +ichnolitic +ichnological +ichnology +ichnomancy +icho +ichoglan +ichor +ichorous +ichorrhea +ichorrhemia +ichthulin +ichthulinic +ichthus +ichthyal +ichthyic +ichthyism +ichthyismus +ichthyization +ichthyized +ichthyobatrachian +Ichthyocephali +ichthyocephalous +ichthyocol +ichthyocolla +ichthyocoprolite +Ichthyodea +Ichthyodectidae +ichthyodian +ichthyodont +ichthyodorulite +ichthyofauna +ichthyoform +ichthyographer +ichthyographia +ichthyographic +ichthyography +ichthyoid +ichthyoidal +Ichthyoidea +Ichthyol +ichthyolatrous +ichthyolatry +ichthyolite +ichthyolitic +ichthyologic +ichthyological +ichthyologically +ichthyologist +ichthyology +ichthyomancy +ichthyomantic +Ichthyomorpha +ichthyomorphic +ichthyomorphous +ichthyonomy +ichthyopaleontology +ichthyophagan +ichthyophagi +ichthyophagian +ichthyophagist +ichthyophagize +ichthyophagous +ichthyophagy +ichthyophile +ichthyophobia +ichthyophthalmite +ichthyophthiriasis +ichthyopolism +ichthyopolist +ichthyopsid +Ichthyopsida +ichthyopsidan +Ichthyopterygia +ichthyopterygian +ichthyopterygium +Ichthyornis +Ichthyornithes +ichthyornithic +Ichthyornithidae +Ichthyornithiformes +ichthyornithoid +ichthyosaur +Ichthyosauria +ichthyosaurian +ichthyosaurid +Ichthyosauridae +ichthyosauroid +Ichthyosaurus +ichthyosis +ichthyosism +ichthyotic +Ichthyotomi +ichthyotomist +ichthyotomous +ichthyotomy +ichthyotoxin +ichthyotoxism +ichthytaxidermy +ichu +icica +icicle +icicled +icily +iciness +icing +icon +Iconian +iconic +iconical +iconism +iconoclasm +iconoclast +iconoclastic +iconoclastically +iconoclasticism +iconodule +iconodulic +iconodulist +iconoduly +iconograph +iconographer +iconographic +iconographical +iconographist +iconography +iconolater +iconolatrous +iconolatry +iconological +iconologist +iconology +iconomachal +iconomachist +iconomachy +iconomania +iconomatic +iconomatically +iconomaticism +iconomatography +iconometer +iconometric +iconometrical +iconometrically +iconometry +iconophile +iconophilism +iconophilist +iconophily +iconoplast +iconoscope +iconostas +iconostasion +iconostasis +iconotype +icosahedral +Icosandria +icosasemic +icosian +icositetrahedron +icosteid +Icosteidae +icosteine +Icosteus +icotype +icteric +icterical +Icteridae +icterine +icteritious +icterode +icterogenetic +icterogenic +icterogenous +icterohematuria +icteroid +icterus +ictic +Ictonyx +ictuate +ictus +icy +id +Ida +Idaean +Idaho +Idahoan +Idaic +idalia +Idalian +idant +iddat +Iddio +ide +idea +ideaed +ideaful +ideagenous +ideal +idealess +idealism +idealist +idealistic +idealistical +idealistically +ideality +idealization +idealize +idealizer +idealless +ideally +idealness +ideamonger +Idean +ideate +ideation +ideational +ideationally +ideative +ideist +idempotent +identic +identical +identicalism +identically +identicalness +identifiable +identifiableness +identification +identifier +identify +identism +identity +ideogenetic +ideogenical +ideogenous +ideogeny +ideoglyph +ideogram +ideogrammic +ideograph +ideographic +ideographical +ideographically +ideography +ideolatry +ideologic +ideological +ideologically +ideologist +ideologize +ideologue +ideology +ideomotion +ideomotor +ideophone +ideophonetics +ideophonous +ideoplastia +ideoplastic +ideoplastics +ideoplasty +ideopraxist +ides +idgah +idiasm +idic +idiobiology +idioblast +idioblastic +idiochromatic +idiochromatin +idiochromosome +idiocrasis +idiocrasy +idiocratic +idiocratical +idiocy +idiocyclophanous +idioelectric +idioelectrical +Idiogastra +idiogenesis +idiogenetic +idiogenous +idioglossia +idioglottic +idiograph +idiographic +idiographical +idiohypnotism +idiolalia +idiolatry +idiologism +idiolysin +idiom +idiomatic +idiomatical +idiomatically +idiomaticalness +idiomelon +idiometer +idiomography +idiomology +idiomorphic +idiomorphically +idiomorphism +idiomorphous +idiomuscular +idiopathetic +idiopathic +idiopathical +idiopathically +idiopathy +idiophanism +idiophanous +idiophonic +idioplasm +idioplasmatic +idioplasmic +idiopsychological +idiopsychology +idioreflex +idiorepulsive +idioretinal +idiorrhythmic +Idiosepiidae +Idiosepion +idiosome +idiospasm +idiospastic +idiostatic +idiosyncrasy +idiosyncratic +idiosyncratical +idiosyncratically +idiot +idiotcy +idiothalamous +idiothermous +idiothermy +idiotic +idiotical +idiotically +idioticalness +idioticon +idiotish +idiotism +idiotize +idiotropian +idiotry +idiotype +idiotypic +Idism +Idist +Idistic +idite +iditol +idle +idleful +idleheaded +idlehood +idleman +idlement +idleness +idler +idleset +idleship +idlety +idlish +idly +Ido +idocrase +Idoism +Idoist +Idoistic +idol +idola +idolaster +idolater +idolatress +idolatric +idolatrize +idolatrizer +idolatrous +idolatrously +idolatrousness +idolatry +idolify +idolism +idolist +idolistic +idolization +idolize +idolizer +idoloclast +idoloclastic +idolodulia +idolographical +idololatrical +idololatry +idolomancy +idolomania +idolothyte +idolothytic +idolous +idolum +Idomeneus +idoneal +idoneity +idoneous +idoneousness +idorgan +idosaccharic +idose +Idotea +Idoteidae +Idothea +Idotheidae +idrialin +idrialine +idrialite +Idrisid +Idrisite +idryl +Idumaean +idyl +idyler +idylism +idylist +idylize +idyllian +idyllic +idyllical +idyllically +idyllicism +ie +Ierne +if +ife +iffy +Ifugao +Igara +Igbira +Igdyr +igelstromite +igloo +Iglulirmiut +ignatia +Ignatian +Ignatianist +Ignatius +ignavia +igneoaqueous +igneous +ignescent +ignicolist +igniferous +igniferousness +igniform +ignifuge +ignify +ignigenous +ignipotent +ignipuncture +ignitability +ignite +igniter +ignitibility +ignitible +ignition +ignitive +ignitor +ignitron +ignivomous +ignivomousness +ignobility +ignoble +ignobleness +ignoblesse +ignobly +ignominious +ignominiously +ignominiousness +ignominy +ignorable +ignoramus +ignorance +ignorant +Ignorantine +ignorantism +ignorantist +ignorantly +ignorantness +ignoration +ignore +ignorement +ignorer +ignote +Igorot +iguana +Iguania +iguanian +iguanid +Iguanidae +iguaniform +Iguanodon +iguanodont +Iguanodontia +Iguanodontidae +iguanodontoid +Iguanodontoidea +iguanoid +Iguvine +ihi +Ihlat +ihleite +ihram +iiwi +ijma +Ijo +ijolite +Ijore +ijussite +ikat +Ike +ikey +ikeyness +Ikhwan +ikona +ikra +Ila +ileac +ileectomy +ileitis +ileocaecal +ileocaecum +ileocolic +ileocolitis +ileocolostomy +ileocolotomy +ileon +ileosigmoidostomy +ileostomy +ileotomy +ilesite +ileum +ileus +ilex +ilia +Iliac +iliac +iliacus +Iliad +Iliadic +Iliadist +Iliadize +iliahi +ilial +Ilian +iliau +Ilicaceae +ilicaceous +ilicic +ilicin +ilima +iliocaudal +iliocaudalis +iliococcygeal +iliococcygeus +iliococcygian +iliocostal +iliocostalis +iliodorsal +iliofemoral +iliohypogastric +ilioinguinal +ilioischiac +ilioischiatic +iliolumbar +iliopectineal +iliopelvic +ilioperoneal +iliopsoas +iliopsoatic +iliopubic +iliosacral +iliosciatic +ilioscrotal +iliospinal +iliotibial +iliotrochanteric +Ilissus +ilium +ilk +ilka +ilkane +ill +illaborate +illachrymable +illachrymableness +Illaenus +Illano +Illanun +illapsable +illapse +illapsive +illaqueate +illaqueation +illation +illative +illatively +illaudable +illaudably +illaudation +illaudatory +Illecebraceae +illecebrous +illeck +illegal +illegality +illegalize +illegally +illegalness +illegibility +illegible +illegibleness +illegibly +illegitimacy +illegitimate +illegitimately +illegitimateness +illegitimation +illegitimatize +illeism +illeist +illess +illfare +illguide +illiberal +illiberalism +illiberality +illiberalize +illiberally +illiberalness +illicit +illicitly +illicitness +Illicium +illimitability +illimitable +illimitableness +illimitably +illimitate +illimitation +illimited +illimitedly +illimitedness +illinition +illinium +Illinoian +Illinois +Illinoisan +Illinoisian +Illipe +illipene +illiquation +illiquid +illiquidity +illiquidly +illish +illision +illiteracy +illiteral +illiterate +illiterately +illiterateness +illiterature +illium +illness +illocal +illocality +illocally +illogic +illogical +illogicality +illogically +illogicalness +illogician +illogicity +Illoricata +illoricate +illoricated +illoyal +illoyalty +illth +illucidate +illucidation +illucidative +illude +illudedly +illuder +illume +illumer +illuminability +illuminable +illuminance +illuminant +illuminate +illuminated +illuminati +illuminating +illuminatingly +illumination +illuminational +illuminatism +illuminatist +illuminative +illuminato +illuminator +illuminatory +illuminatus +illumine +illuminee +illuminer +Illuminism +illuminist +Illuministic +Illuminize +illuminometer +illuminous +illupi +illure +illurement +illusible +illusion +illusionable +illusional +illusionary +illusioned +illusionism +illusionist +illusionistic +illusive +illusively +illusiveness +illusor +illusorily +illusoriness +illusory +illustrable +illustratable +illustrate +illustration +illustrational +illustrative +illustratively +illustrator +illustratory +illustratress +illustre +illustricity +illustrious +illustriously +illustriousness +illutate +illutation +illuvial +illuviate +illuviation +illy +Illyrian +Illyric +ilmenite +ilmenitite +ilmenorutile +Ilocano +Ilokano +Iloko +Ilongot +ilot +Ilpirra +ilvaite +Ilya +Ilysanthes +Ilysia +Ilysiidae +ilysioid +Ima +image +imageable +imageless +imager +imagerial +imagerially +imagery +imaginability +imaginable +imaginableness +imaginably +imaginal +imaginant +imaginarily +imaginariness +imaginary +imaginate +imagination +imaginational +imaginationalism +imaginative +imaginatively +imaginativeness +imaginator +imagine +imaginer +imagines +imaginist +imaginous +imagism +imagist +imagistic +imago +imam +imamah +imamate +imambarah +imamic +imamship +Imantophyllum +imaret +imbalance +imban +imband +imbannered +imbarge +imbark +imbarn +imbased +imbastardize +imbat +imbauba +imbe +imbecile +imbecilely +imbecilic +imbecilitate +imbecility +imbed +imbellious +imber +imbibe +imbiber +imbibition +imbibitional +imbibitory +imbirussu +imbitter +imbitterment +imbolish +imbondo +imbonity +imbordure +imborsation +imbosom +imbower +imbreathe +imbreviate +imbrex +imbricate +imbricated +imbricately +imbrication +imbricative +imbroglio +imbrue +imbruement +imbrute +imbrutement +imbue +imbuement +imburse +imbursement +Imer +Imerina +Imeritian +imi +imidazole +imidazolyl +imide +imidic +imidogen +iminazole +imine +imino +iminohydrin +imitability +imitable +imitableness +imitancy +imitant +imitate +imitatee +imitation +imitational +imitationist +imitative +imitatively +imitativeness +imitator +imitatorship +imitatress +imitatrix +immaculacy +immaculance +immaculate +immaculately +immaculateness +immalleable +immanacle +immanation +immane +immanely +immanence +immanency +immaneness +immanent +immanental +immanentism +immanentist +immanently +Immanes +immanifest +immanifestness +immanity +immantle +Immanuel +immarble +immarcescible +immarcescibly +immarcibleness +immarginate +immask +immatchable +immaterial +immaterialism +immaterialist +immateriality +immaterialize +immaterially +immaterialness +immaterials +immateriate +immatriculate +immatriculation +immature +immatured +immaturely +immatureness +immaturity +immeability +immeasurability +immeasurable +immeasurableness +immeasurably +immeasured +immechanical +immechanically +immediacy +immedial +immediate +immediately +immediateness +immediatism +immediatist +immedicable +immedicableness +immedicably +immelodious +immember +immemorable +immemorial +immemorially +immense +immensely +immenseness +immensity +immensive +immensurability +immensurable +immensurableness +immensurate +immerd +immerge +immergence +immergent +immerit +immerited +immeritorious +immeritoriously +immeritous +immerse +immersement +immersible +immersion +immersionism +immersionist +immersive +immethodic +immethodical +immethodically +immethodicalness +immethodize +immetrical +immetrically +immetricalness +immew +immi +immigrant +immigrate +immigration +immigrator +immigratory +imminence +imminency +imminent +imminently +imminentness +immingle +imminution +immiscibility +immiscible +immiscibly +immission +immit +immitigability +immitigable +immitigably +immix +immixable +immixture +immobile +immobility +immobilization +immobilize +immoderacy +immoderate +immoderately +immoderateness +immoderation +immodest +immodestly +immodesty +immodulated +immolate +immolation +immolator +immoment +immomentous +immonastered +immoral +immoralism +immoralist +immorality +immoralize +immorally +immorigerous +immorigerousness +immortability +immortable +immortal +immortalism +immortalist +immortality +immortalizable +immortalization +immortalize +immortalizer +immortally +immortalness +immortalship +immortelle +immortification +immortified +immotile +immotioned +immotive +immound +immovability +immovable +immovableness +immovably +immund +immundity +immune +immunist +immunity +immunization +immunize +immunochemistry +immunogen +immunogenetic +immunogenetics +immunogenic +immunogenically +immunogenicity +immunologic +immunological +immunologically +immunologist +immunology +immunoreaction +immunotoxin +immuration +immure +immurement +immusical +immusically +immutability +immutable +immutableness +immutably +immutation +immute +immutilate +immutual +Imogen +Imolinda +imonium +imp +impacability +impacable +impack +impackment +impact +impacted +impaction +impactionize +impactment +impactual +impages +impaint +impair +impairable +impairer +impairment +impala +impalace +impalatable +impale +impalement +impaler +impall +impalm +impalpability +impalpable +impalpably +impalsy +impaludism +impanate +impanation +impanator +impane +impanel +impanelment +impapase +impapyrate +impar +imparadise +imparalleled +imparasitic +impardonable +impardonably +imparidigitate +imparipinnate +imparisyllabic +imparity +impark +imparkation +imparl +imparlance +imparsonee +impart +impartable +impartance +impartation +imparter +impartial +impartialism +impartialist +impartiality +impartially +impartialness +impartibilibly +impartibility +impartible +impartibly +imparticipable +impartite +impartive +impartivity +impartment +impassability +impassable +impassableness +impassably +impasse +impassibilibly +impassibility +impassible +impassibleness +impassion +impassionable +impassionate +impassionately +impassioned +impassionedly +impassionedness +impassionment +impassive +impassively +impassiveness +impassivity +impastation +impaste +impasto +impasture +impaternate +impatible +impatience +impatiency +Impatiens +impatient +Impatientaceae +impatientaceous +impatiently +impatientness +impatronize +impave +impavid +impavidity +impavidly +impawn +impayable +impeach +impeachability +impeachable +impeacher +impeachment +impearl +impeccability +impeccable +impeccably +impeccance +impeccancy +impeccant +impectinate +impecuniary +impecuniosity +impecunious +impecuniously +impecuniousness +impedance +impede +impeder +impedibility +impedible +impedient +impediment +impedimenta +impedimental +impedimentary +impeding +impedingly +impedite +impedition +impeditive +impedometer +impeevish +impel +impellent +impeller +impen +impend +impendence +impendency +impendent +impending +impenetrability +impenetrable +impenetrableness +impenetrably +impenetrate +impenetration +impenetrative +impenitence +impenitent +impenitently +impenitentness +impenitible +impenitibleness +impennate +Impennes +impent +imperance +imperant +Imperata +imperate +imperation +imperatival +imperative +imperatively +imperativeness +imperator +imperatorial +imperatorially +imperatorian +imperatorious +imperatorship +imperatory +imperatrix +imperceivable +imperceivableness +imperceivably +imperceived +imperceiverant +imperceptibility +imperceptible +imperceptibleness +imperceptibly +imperception +imperceptive +imperceptiveness +imperceptivity +impercipience +impercipient +imperence +imperent +imperfect +imperfected +imperfectibility +imperfectible +imperfection +imperfectious +imperfective +imperfectly +imperfectness +imperforable +Imperforata +imperforate +imperforated +imperforation +imperformable +imperia +imperial +imperialin +imperialine +imperialism +imperialist +imperialistic +imperialistically +imperiality +imperialization +imperialize +imperially +imperialness +imperialty +imperil +imperilment +imperious +imperiously +imperiousness +imperish +imperishability +imperishable +imperishableness +imperishably +imperite +imperium +impermanence +impermanency +impermanent +impermanently +impermeability +impermeabilization +impermeabilize +impermeable +impermeableness +impermeably +impermeated +impermeator +impermissible +impermutable +imperscriptible +imperscrutable +impersonable +impersonal +impersonality +impersonalization +impersonalize +impersonally +impersonate +impersonation +impersonative +impersonator +impersonatress +impersonatrix +impersonification +impersonify +impersonization +impersonize +imperspicuity +imperspicuous +imperspirability +imperspirable +impersuadable +impersuadableness +impersuasibility +impersuasible +impersuasibleness +impersuasibly +impertinacy +impertinence +impertinency +impertinent +impertinently +impertinentness +impertransible +imperturbability +imperturbable +imperturbableness +imperturbably +imperturbation +imperturbed +imperverse +impervertible +impervestigable +imperviability +imperviable +imperviableness +impervial +impervious +imperviously +imperviousness +impest +impestation +impester +impeticos +impetiginous +impetigo +impetition +impetrate +impetration +impetrative +impetrator +impetratory +impetre +impetulant +impetulantly +impetuosity +impetuous +impetuously +impetuousness +impetus +Impeyan +imphee +impi +impicture +impierceable +impiety +impignorate +impignoration +impinge +impingement +impingence +impingent +impinger +impinguate +impious +impiously +impiousness +impish +impishly +impishness +impiteous +impitiably +implacability +implacable +implacableness +implacably +implacement +implacental +Implacentalia +implacentate +implant +implantation +implanter +implastic +implasticity +implate +implausibility +implausible +implausibleness +implausibly +impleach +implead +impleadable +impleader +impledge +implement +implemental +implementation +implementiferous +implete +impletion +impletive +implex +impliable +implial +implicant +implicate +implicately +implicateness +implication +implicational +implicative +implicatively +implicatory +implicit +implicitly +implicitness +impliedly +impliedness +impling +implode +implodent +implorable +imploration +implorator +imploratory +implore +implorer +imploring +imploringly +imploringness +implosion +implosive +implosively +implume +implumed +implunge +impluvium +imply +impocket +impofo +impoison +impoisoner +impolarizable +impolicy +impolished +impolite +impolitely +impoliteness +impolitic +impolitical +impolitically +impoliticalness +impoliticly +impoliticness +impollute +imponderabilia +imponderability +imponderable +imponderableness +imponderably +imponderous +impone +imponent +impoor +impopular +impopularly +imporosity +imporous +import +importability +importable +importableness +importably +importance +importancy +important +importantly +importation +importer +importless +importment +importraiture +importray +importunacy +importunance +importunate +importunately +importunateness +importunator +importune +importunely +importunement +importuner +importunity +imposable +imposableness +imposal +impose +imposement +imposer +imposing +imposingly +imposingness +imposition +impositional +impositive +impossibilification +impossibilism +impossibilist +impossibilitate +impossibility +impossible +impossibleness +impossibly +impost +imposter +imposterous +impostor +impostorism +impostorship +impostress +impostrix +impostrous +impostumate +impostumation +impostume +imposture +imposturism +imposturous +imposure +impot +impotable +impotence +impotency +impotent +impotently +impotentness +impound +impoundable +impoundage +impounder +impoundment +impoverish +impoverisher +impoverishment +impracticability +impracticable +impracticableness +impracticably +impractical +impracticality +impracticalness +imprecant +imprecate +imprecation +imprecator +imprecatorily +imprecatory +imprecise +imprecisely +imprecision +impredicability +impredicable +impreg +impregn +impregnability +impregnable +impregnableness +impregnably +impregnant +impregnate +impregnation +impregnative +impregnator +impregnatory +imprejudice +impremeditate +impreparation +impresa +impresario +imprescience +imprescribable +imprescriptibility +imprescriptible +imprescriptibly +imprese +impress +impressable +impressedly +impresser +impressibility +impressible +impressibleness +impressibly +impression +impressionability +impressionable +impressionableness +impressionably +impressional +impressionalist +impressionality +impressionally +impressionary +impressionism +impressionist +impressionistic +impressionistically +impressionless +impressive +impressively +impressiveness +impressment +impressor +impressure +imprest +imprestable +impreventability +impreventable +imprevisibility +imprevisible +imprevision +imprimatur +imprime +imprimitive +imprimitivity +imprint +imprinter +imprison +imprisonable +imprisoner +imprisonment +improbability +improbabilize +improbable +improbableness +improbably +improbation +improbative +improbatory +improbity +improcreant +improcurability +improcurable +improducible +improficience +improficiency +improgressive +improgressively +improgressiveness +improlificical +impromptitude +impromptu +impromptuary +impromptuist +improof +improper +improperation +improperly +improperness +impropriate +impropriation +impropriator +impropriatrix +impropriety +improvability +improvable +improvableness +improvably +improve +improvement +improver +improvership +improvidence +improvident +improvidentially +improvidently +improving +improvingly +improvisate +improvisation +improvisational +improvisator +improvisatorial +improvisatorially +improvisatorize +improvisatory +improvise +improvisedly +improviser +improvision +improviso +improvisor +imprudence +imprudency +imprudent +imprudential +imprudently +imprudentness +impship +impuberal +impuberate +impuberty +impubic +impudence +impudency +impudent +impudently +impudentness +impudicity +impugn +impugnability +impugnable +impugnation +impugner +impugnment +impuissance +impuissant +impulse +impulsion +impulsive +impulsively +impulsiveness +impulsivity +impulsory +impunctate +impunctual +impunctuality +impunely +impunible +impunibly +impunity +impure +impurely +impureness +impuritan +impuritanism +impurity +imputability +imputable +imputableness +imputably +imputation +imputative +imputatively +imputativeness +impute +imputedly +imputer +imputrescence +imputrescibility +imputrescible +imputrid +impy +imshi +imsonic +imu +in +inability +inabordable +inabstinence +inaccentuated +inaccentuation +inacceptable +inaccessibility +inaccessible +inaccessibleness +inaccessibly +inaccordance +inaccordancy +inaccordant +inaccordantly +inaccuracy +inaccurate +inaccurately +inaccurateness +inachid +Inachidae +inachoid +Inachus +inacquaintance +inacquiescent +inactinic +inaction +inactionist +inactivate +inactivation +inactive +inactively +inactiveness +inactivity +inactuate +inactuation +inadaptability +inadaptable +inadaptation +inadaptive +inadept +inadequacy +inadequate +inadequately +inadequateness +inadequation +inadequative +inadequatively +inadherent +inadhesion +inadhesive +inadjustability +inadjustable +inadmissibility +inadmissible +inadmissibly +inadventurous +inadvertence +inadvertency +inadvertent +inadvertently +inadvisability +inadvisable +inadvisableness +inadvisedly +inaesthetic +inaffability +inaffable +inaffectation +inagglutinability +inagglutinable +inaggressive +inagile +inaidable +inaja +inalacrity +inalienability +inalienable +inalienableness +inalienably +inalimental +inalterability +inalterable +inalterableness +inalterably +inamissibility +inamissible +inamissibleness +inamorata +inamorate +inamoration +inamorato +inamovability +inamovable +inane +inanely +inanga +inangulate +inanimadvertence +inanimate +inanimated +inanimately +inanimateness +inanimation +inanition +inanity +inantherate +inapathy +inapostate +inapparent +inappealable +inappeasable +inappellability +inappellable +inappendiculate +inapperceptible +inappertinent +inappetence +inappetency +inappetent +inappetible +inapplicability +inapplicable +inapplicableness +inapplicably +inapplication +inapposite +inappositely +inappositeness +inappreciable +inappreciably +inappreciation +inappreciative +inappreciatively +inappreciativeness +inapprehensible +inapprehension +inapprehensive +inapprehensiveness +inapproachability +inapproachable +inapproachably +inappropriable +inappropriableness +inappropriate +inappropriately +inappropriateness +inapt +inaptitude +inaptly +inaptness +inaqueous +inarable +inarch +inarculum +inarguable +inarguably +inarm +inarticulacy +Inarticulata +inarticulate +inarticulated +inarticulately +inarticulateness +inarticulation +inartificial +inartificiality +inartificially +inartificialness +inartistic +inartistical +inartisticality +inartistically +inasmuch +inassimilable +inassimilation +inassuageable +inattackable +inattention +inattentive +inattentively +inattentiveness +inaudibility +inaudible +inaudibleness +inaudibly +inaugur +inaugural +inaugurate +inauguration +inaugurative +inaugurator +inauguratory +inaugurer +inaurate +inauration +inauspicious +inauspiciously +inauspiciousness +inauthentic +inauthenticity +inauthoritative +inauthoritativeness +inaxon +inbe +inbeaming +inbearing +inbeing +inbending +inbent +inbirth +inblow +inblowing +inblown +inboard +inbond +inborn +inbound +inbread +inbreak +inbreaking +inbreathe +inbreather +inbred +inbreed +inbring +inbringer +inbuilt +inburning +inburnt +inburst +inby +Inca +Incaic +incalculability +incalculable +incalculableness +incalculably +incalescence +incalescency +incalescent +incaliculate +incalver +incalving +incameration +Incan +incandent +incandesce +incandescence +incandescency +incandescent +incandescently +incanous +incantation +incantational +incantator +incantatory +incanton +incapability +incapable +incapableness +incapably +incapacious +incapaciousness +incapacitate +incapacitation +incapacity +incapsulate +incapsulation +incaptivate +incarcerate +incarceration +incarcerator +incardinate +incardination +Incarial +incarmined +incarn +incarnadine +incarnant +incarnate +incarnation +incarnational +incarnationist +incarnative +Incarvillea +incase +incasement +incast +incatenate +incatenation +incaution +incautious +incautiously +incautiousness +incavate +incavated +incavation +incavern +incedingly +incelebrity +incendiarism +incendiary +incendivity +incensation +incense +incenseless +incensement +incensory +incensurable +incensurably +incenter +incentive +incentively +incentor +incept +inception +inceptive +inceptively +inceptor +inceration +incertitude +incessable +incessably +incessancy +incessant +incessantly +incessantness +incest +incestuous +incestuously +incestuousness +inch +inched +inchmeal +inchoacy +inchoant +inchoate +inchoately +inchoateness +inchoation +inchoative +inchpin +inchworm +incide +incidence +incident +incidental +incidentalist +incidentally +incidentalness +incidentless +incidently +incinerable +incinerate +incineration +incinerator +incipience +incipient +incipiently +incircumscription +incircumspect +incircumspection +incircumspectly +incircumspectness +incisal +incise +incisely +incisiform +incision +incisive +incisively +incisiveness +incisor +incisorial +incisory +incisure +incitability +incitable +incitant +incitation +incite +incitement +inciter +incitingly +incitive +incitress +incivic +incivility +incivilization +incivism +inclemency +inclement +inclemently +inclementness +inclinable +inclinableness +inclination +inclinational +inclinator +inclinatorily +inclinatorium +inclinatory +incline +incliner +inclinograph +inclinometer +inclip +inclose +inclosure +includable +include +included +includedness +includer +inclusa +incluse +inclusion +inclusionist +inclusive +inclusively +inclusiveness +inclusory +incoagulable +incoalescence +incoercible +incog +incogent +incogitability +incogitable +incogitancy +incogitant +incogitantly +incogitative +incognita +incognitive +incognito +incognizability +incognizable +incognizance +incognizant +incognoscent +incognoscibility +incognoscible +incoherence +incoherency +incoherent +incoherentific +incoherently +incoherentness +incohering +incohesion +incohesive +incoincidence +incoincident +incombustibility +incombustible +incombustibleness +incombustibly +incombustion +income +incomeless +incomer +incoming +incommensurability +incommensurable +incommensurableness +incommensurably +incommensurate +incommensurately +incommensurateness +incommiscibility +incommiscible +incommodate +incommodation +incommode +incommodement +incommodious +incommodiously +incommodiousness +incommodity +incommunicability +incommunicable +incommunicableness +incommunicably +incommunicado +incommunicative +incommunicatively +incommunicativeness +incommutability +incommutable +incommutableness +incommutably +incompact +incompactly +incompactness +incomparability +incomparable +incomparableness +incomparably +incompassionate +incompassionately +incompassionateness +incompatibility +incompatible +incompatibleness +incompatibly +incompendious +incompensated +incompensation +incompetence +incompetency +incompetent +incompetently +incompetentness +incompletability +incompletable +incompletableness +incomplete +incompleted +incompletely +incompleteness +incompletion +incomplex +incompliance +incompliancy +incompliant +incompliantly +incomplicate +incomplying +incomposed +incomposedly +incomposedness +incomposite +incompossibility +incompossible +incomprehended +incomprehending +incomprehendingly +incomprehensibility +incomprehensible +incomprehensibleness +incomprehensibly +incomprehension +incomprehensive +incomprehensively +incomprehensiveness +incompressibility +incompressible +incompressibleness +incompressibly +incomputable +inconcealable +inconceivability +inconceivable +inconceivableness +inconceivably +inconcinnate +inconcinnately +inconcinnity +inconcinnous +inconcludent +inconcluding +inconclusion +inconclusive +inconclusively +inconclusiveness +inconcrete +inconcurrent +inconcurring +incondensability +incondensable +incondensibility +incondensible +incondite +inconditionate +inconditioned +inconducive +inconfirm +inconformable +inconformably +inconformity +inconfused +inconfusedly +inconfusion +inconfutable +inconfutably +incongealable +incongealableness +incongenerous +incongenial +incongeniality +inconglomerate +incongruence +incongruent +incongruently +incongruity +incongruous +incongruously +incongruousness +inconjoinable +inconnected +inconnectedness +inconnu +inconscience +inconscient +inconsciently +inconscious +inconsciously +inconsecutive +inconsecutively +inconsecutiveness +inconsequence +inconsequent +inconsequential +inconsequentiality +inconsequentially +inconsequently +inconsequentness +inconsiderable +inconsiderableness +inconsiderably +inconsiderate +inconsiderately +inconsiderateness +inconsideration +inconsidered +inconsistence +inconsistency +inconsistent +inconsistently +inconsistentness +inconsolability +inconsolable +inconsolableness +inconsolably +inconsolate +inconsolately +inconsonance +inconsonant +inconsonantly +inconspicuous +inconspicuously +inconspicuousness +inconstancy +inconstant +inconstantly +inconstantness +inconstruable +inconsultable +inconsumable +inconsumably +inconsumed +incontaminable +incontaminate +incontaminateness +incontemptible +incontestability +incontestable +incontestableness +incontestably +incontinence +incontinency +incontinent +incontinently +incontinuity +incontinuous +incontracted +incontractile +incontraction +incontrollable +incontrollably +incontrolled +incontrovertibility +incontrovertible +incontrovertibleness +incontrovertibly +inconvenience +inconveniency +inconvenient +inconveniently +inconvenientness +inconversable +inconversant +inconversibility +inconvertibility +inconvertible +inconvertibleness +inconvertibly +inconvinced +inconvincedly +inconvincibility +inconvincible +inconvincibly +incopresentability +incopresentable +incoronate +incoronated +incoronation +incorporable +incorporate +incorporated +incorporatedness +incorporation +incorporative +incorporator +incorporeal +incorporealism +incorporealist +incorporeality +incorporealize +incorporeally +incorporeity +incorporeous +incorpse +incorrect +incorrection +incorrectly +incorrectness +incorrespondence +incorrespondency +incorrespondent +incorresponding +incorrigibility +incorrigible +incorrigibleness +incorrigibly +incorrodable +incorrodible +incorrosive +incorrupt +incorrupted +incorruptibility +Incorruptible +incorruptible +incorruptibleness +incorruptibly +incorruption +incorruptly +incorruptness +incourteous +incourteously +incrash +incrassate +incrassated +incrassation +incrassative +increasable +increasableness +increase +increasedly +increaseful +increasement +increaser +increasing +increasingly +increate +increately +increative +incredibility +incredible +incredibleness +incredibly +increditable +incredited +incredulity +incredulous +incredulously +incredulousness +increep +incremate +incremation +increment +incremental +incrementation +increpate +increpation +increscence +increscent +increst +incretion +incretionary +incretory +incriminate +incrimination +incriminator +incriminatory +incross +incrossbred +incrossing +incrotchet +incruent +incruental +incruentous +incrust +incrustant +Incrustata +incrustate +incrustation +incrustator +incrustive +incrustment +incrystal +incrystallizable +incubate +incubation +incubational +incubative +incubator +incubatorium +incubatory +incubi +incubous +incubus +incudal +incudate +incudectomy +incudes +incudomalleal +incudostapedial +inculcate +inculcation +inculcative +inculcator +inculcatory +inculpability +inculpable +inculpableness +inculpably +inculpate +inculpation +inculpative +inculpatory +incult +incultivation +inculture +incumbence +incumbency +incumbent +incumbentess +incumbently +incumber +incumberment +incumbrance +incumbrancer +incunable +incunabula +incunabular +incunabulist +incunabulum +incuneation +incur +incurability +incurable +incurableness +incurably +incuriosity +incurious +incuriously +incuriousness +incurrable +incurrence +incurrent +incurse +incursion +incursionist +incursive +incurvate +incurvation +incurvature +incurve +incus +incuse +incut +incutting +Ind +indaba +indaconitine +indagate +indagation +indagative +indagator +indagatory +indamine +indan +indane +Indanthrene +indanthrene +indart +indazin +indazine +indazol +indazole +inde +indebt +indebted +indebtedness +indebtment +indecence +indecency +indecent +indecently +indecentness +Indecidua +indeciduate +indeciduous +indecipherability +indecipherable +indecipherableness +indecipherably +indecision +indecisive +indecisively +indecisiveness +indeclinable +indeclinableness +indeclinably +indecomponible +indecomposable +indecomposableness +indecorous +indecorously +indecorousness +indecorum +indeed +indeedy +indefaceable +indefatigability +indefatigable +indefatigableness +indefatigably +indefeasibility +indefeasible +indefeasibleness +indefeasibly +indefeatable +indefectibility +indefectible +indefectibly +indefective +indefensibility +indefensible +indefensibleness +indefensibly +indefensive +indeficiency +indeficient +indeficiently +indefinable +indefinableness +indefinably +indefinite +indefinitely +indefiniteness +indefinitive +indefinitively +indefinitiveness +indefinitude +indefinity +indeflectible +indefluent +indeformable +indehiscence +indehiscent +indelectable +indelegability +indelegable +indeliberate +indeliberately +indeliberateness +indeliberation +indelibility +indelible +indelibleness +indelibly +indelicacy +indelicate +indelicately +indelicateness +indemnification +indemnificator +indemnificatory +indemnifier +indemnify +indemnitee +indemnitor +indemnity +indemnization +indemoniate +indemonstrability +indemonstrable +indemonstrableness +indemonstrably +indene +indent +indentation +indented +indentedly +indentee +indenter +indention +indentment +indentor +indenture +indentured +indentureship +indentwise +independable +independence +independency +independent +independentism +independently +Independista +indeposable +indeprehensible +indeprivability +indeprivable +inderivative +indescribability +indescribable +indescribableness +indescribably +indescript +indescriptive +indesert +indesignate +indesirable +indestructibility +indestructible +indestructibleness +indestructibly +indetectable +indeterminable +indeterminableness +indeterminably +indeterminacy +indeterminate +indeterminately +indeterminateness +indetermination +indeterminative +indetermined +indeterminism +indeterminist +indeterministic +indevirginate +indevoted +indevotion +indevotional +indevout +indevoutly +indevoutness +index +indexed +indexer +indexical +indexically +indexing +indexless +indexlessness +indexterity +India +indiadem +Indiaman +Indian +Indiana +indianaite +Indianan +Indianeer +Indianesque +Indianhood +Indianian +Indianism +Indianist +indianite +indianization +indianize +Indic +indic +indicable +indican +indicant +indicanuria +indicate +indication +indicative +indicatively +indicator +Indicatoridae +Indicatorinae +indicatory +indicatrix +indices +indicia +indicial +indicible +indicium +indicolite +indict +indictable +indictably +indictee +indicter +indiction +indictional +indictive +indictment +indictor +Indies +indiferous +indifference +indifferency +indifferent +indifferential +indifferentism +indifferentist +indifferentistic +indifferently +indigena +indigenal +indigenate +indigence +indigency +indigene +indigeneity +Indigenismo +indigenist +indigenity +indigenous +indigenously +indigenousness +indigent +indigently +indigested +indigestedness +indigestibility +indigestible +indigestibleness +indigestibly +indigestion +indigestive +indigitamenta +indigitate +indigitation +indign +indignance +indignancy +indignant +indignantly +indignation +indignatory +indignify +indignity +indignly +indigo +indigoberry +Indigofera +indigoferous +indigoid +indigotic +indigotin +indigotindisulphonic +indiguria +indimensible +indimensional +indiminishable +indimple +indirect +indirected +indirection +indirectly +indirectness +indirubin +indiscernibility +indiscernible +indiscernibleness +indiscernibly +indiscerptibility +indiscerptible +indiscerptibleness +indiscerptibly +indisciplinable +indiscipline +indisciplined +indiscoverable +indiscoverably +indiscovered +indiscreet +indiscreetly +indiscreetness +indiscrete +indiscretely +indiscretion +indiscretionary +indiscriminate +indiscriminated +indiscriminately +indiscriminateness +indiscriminating +indiscriminatingly +indiscrimination +indiscriminative +indiscriminatively +indiscriminatory +indiscussable +indiscussible +indispellable +indispensability +indispensable +indispensableness +indispensably +indispose +indisposed +indisposedness +indisposition +indisputability +indisputable +indisputableness +indisputably +indissipable +indissociable +indissolubility +indissoluble +indissolubleness +indissolubly +indissolute +indissolvability +indissolvable +indissolvableness +indissolvably +indissuadable +indissuadably +indistinct +indistinction +indistinctive +indistinctively +indistinctiveness +indistinctly +indistinctness +indistinguishability +indistinguishable +indistinguishableness +indistinguishably +indistinguished +indistortable +indistributable +indisturbable +indisturbance +indisturbed +indite +inditement +inditer +indium +indivertible +indivertibly +individable +individua +individual +individualism +individualist +individualistic +individualistically +individuality +individualization +individualize +individualizer +individualizingly +individually +individuate +individuation +individuative +individuator +individuity +individuum +indivinable +indivisibility +indivisible +indivisibleness +indivisibly +indivision +indocibility +indocible +indocibleness +indocile +indocility +indoctrinate +indoctrination +indoctrinator +indoctrine +indoctrinization +indoctrinize +Indogaea +Indogaean +indogen +indogenide +indole +indolence +indolent +indolently +indoles +indoline +Indologian +Indologist +Indologue +Indology +indoloid +indolyl +indomitability +indomitable +indomitableness +indomitably +Indone +Indonesian +indoor +indoors +indophenin +indophenol +Indophile +Indophilism +Indophilist +indorsation +indorse +indoxyl +indoxylic +indoxylsulphuric +Indra +indraft +indraught +indrawal +indrawing +indrawn +indri +Indris +indubious +indubiously +indubitable +indubitableness +indubitably +indubitatively +induce +induced +inducedly +inducement +inducer +induciae +inducible +inducive +induct +inductance +inductee +inducteous +inductile +inductility +induction +inductional +inductionally +inductionless +inductive +inductively +inductiveness +inductivity +inductometer +inductophone +inductor +inductorium +inductory +inductoscope +indue +induement +indulge +indulgeable +indulgement +indulgence +indulgenced +indulgency +indulgent +indulgential +indulgentially +indulgently +indulgentness +indulger +indulging +indulgingly +induline +indult +indulto +indument +indumentum +induna +induplicate +induplication +induplicative +indurable +indurate +induration +indurative +indurite +Indus +indusial +indusiate +indusiated +indusiform +indusioid +indusium +industrial +industrialism +industrialist +industrialization +industrialize +industrially +industrialness +industrious +industriously +industriousness +industrochemical +industry +induviae +induvial +induviate +indwell +indweller +indy +indyl +indylic +inearth +inebriacy +inebriant +inebriate +inebriation +inebriative +inebriety +inebrious +ineconomic +ineconomy +inedibility +inedible +inedited +Ineducabilia +ineducabilian +ineducability +ineducable +ineducation +ineffability +ineffable +ineffableness +ineffably +ineffaceability +ineffaceable +ineffaceably +ineffectible +ineffectibly +ineffective +ineffectively +ineffectiveness +ineffectual +ineffectuality +ineffectually +ineffectualness +ineffervescence +ineffervescent +ineffervescibility +ineffervescible +inefficacious +inefficaciously +inefficaciousness +inefficacity +inefficacy +inefficience +inefficiency +inefficient +inefficiently +ineffulgent +inelaborate +inelaborated +inelaborately +inelastic +inelasticate +inelasticity +inelegance +inelegancy +inelegant +inelegantly +ineligibility +ineligible +ineligibleness +ineligibly +ineliminable +ineloquence +ineloquent +ineloquently +ineluctability +ineluctable +ineluctably +ineludible +ineludibly +inembryonate +inemendable +inemotivity +inemulous +inenarrable +inenergetic +inenubilable +inenucleable +inept +ineptitude +ineptly +ineptness +inequable +inequal +inequalitarian +inequality +inequally +inequalness +inequation +inequiaxial +inequicostate +inequidistant +inequigranular +inequilateral +inequilibrium +inequilobate +inequilobed +inequipotential +inequipotentiality +inequitable +inequitableness +inequitably +inequity +inequivalent +inequivalve +inequivalvular +ineradicable +ineradicableness +ineradicably +inerasable +inerasableness +inerasably +inerasible +Ineri +inerm +Inermes +Inermi +Inermia +inermous +inerrability +inerrable +inerrableness +inerrably +inerrancy +inerrant +inerrantly +inerratic +inerring +inerringly +inerroneous +inert +inertance +inertia +inertial +inertion +inertly +inertness +inerubescent +inerudite +ineruditely +inerudition +inescapable +inescapableness +inescapably +inesculent +inescutcheon +inesite +inessential +inessentiality +inestimability +inestimable +inestimableness +inestimably +inestivation +inethical +ineunt +ineuphonious +inevadible +inevadibly +inevaporable +inevasible +inevidence +inevident +inevitability +inevitable +inevitableness +inevitably +inexact +inexacting +inexactitude +inexactly +inexactness +inexcellence +inexcitability +inexcitable +inexclusive +inexclusively +inexcommunicable +inexcusability +inexcusable +inexcusableness +inexcusably +inexecutable +inexecution +inexertion +inexhausted +inexhaustedly +inexhaustibility +inexhaustible +inexhaustibleness +inexhaustibly +inexhaustive +inexhaustively +inexigible +inexist +inexistence +inexistency +inexistent +inexorability +inexorable +inexorableness +inexorably +inexpansible +inexpansive +inexpectancy +inexpectant +inexpectation +inexpected +inexpectedly +inexpectedness +inexpedience +inexpediency +inexpedient +inexpediently +inexpensive +inexpensively +inexpensiveness +inexperience +inexperienced +inexpert +inexpertly +inexpertness +inexpiable +inexpiableness +inexpiably +inexpiate +inexplainable +inexplicability +inexplicable +inexplicableness +inexplicables +inexplicably +inexplicit +inexplicitly +inexplicitness +inexplorable +inexplosive +inexportable +inexposable +inexposure +inexpress +inexpressibility +inexpressible +inexpressibleness +inexpressibles +inexpressibly +inexpressive +inexpressively +inexpressiveness +inexpugnability +inexpugnable +inexpugnableness +inexpugnably +inexpungeable +inexpungible +inextant +inextended +inextensibility +inextensible +inextensile +inextension +inextensional +inextensive +inexterminable +inextinct +inextinguishable +inextinguishably +inextirpable +inextirpableness +inextricability +inextricable +inextricableness +inextricably +Inez +inface +infall +infallibilism +infallibilist +infallibility +infallible +infallibleness +infallibly +infalling +infalsificable +infame +infamiliar +infamiliarity +infamize +infamonize +infamous +infamously +infamousness +infamy +infancy +infand +infandous +infang +infanglement +infangthief +infant +infanta +infantado +infante +infanthood +infanticidal +infanticide +infantile +infantilism +infantility +infantine +infantlike +infantry +infantryman +infarct +infarctate +infarcted +infarction +infare +infatuate +infatuatedly +infatuation +infatuator +infaust +infeasibility +infeasible +infeasibleness +infect +infectant +infected +infectedness +infecter +infectible +infection +infectionist +infectious +infectiously +infectiousness +infective +infectiveness +infectivity +infector +infectress +infectuous +infecund +infecundity +infeed +infeft +infeftment +infelicific +infelicitous +infelicitously +infelicitousness +infelicity +infelonious +infelt +infeminine +infer +inferable +inference +inferent +inferential +inferentialism +inferentialist +inferentially +inferior +inferiorism +inferiority +inferiorize +inferiorly +infern +infernal +infernalism +infernality +infernalize +infernally +infernalry +infernalship +inferno +inferoanterior +inferobranchiate +inferofrontal +inferolateral +inferomedian +inferoposterior +inferrer +inferribility +inferrible +inferringly +infertile +infertilely +infertileness +infertility +infest +infestant +infestation +infester +infestive +infestivity +infestment +infeudation +infibulate +infibulation +inficete +infidel +infidelic +infidelical +infidelism +infidelistic +infidelity +infidelize +infidelly +infield +infielder +infieldsman +infighter +infighting +infill +infilling +infilm +infilter +infiltrate +infiltration +infiltrative +infinitant +infinitarily +infinitary +infinitate +infinitation +infinite +infinitely +infiniteness +infinitesimal +infinitesimalism +infinitesimality +infinitesimally +infinitesimalness +infiniteth +infinitieth +infinitival +infinitivally +infinitive +infinitively +infinitize +infinitude +infinituple +infinity +infirm +infirmarer +infirmaress +infirmarian +infirmary +infirmate +infirmation +infirmative +infirmity +infirmly +infirmness +infissile +infit +infitter +infix +infixion +inflame +inflamed +inflamedly +inflamedness +inflamer +inflaming +inflamingly +inflammability +inflammable +inflammableness +inflammably +inflammation +inflammative +inflammatorily +inflammatory +inflatable +inflate +inflated +inflatedly +inflatedness +inflater +inflatile +inflatingly +inflation +inflationary +inflationism +inflationist +inflative +inflatus +inflect +inflected +inflectedness +inflection +inflectional +inflectionally +inflectionless +inflective +inflector +inflex +inflexed +inflexibility +inflexible +inflexibleness +inflexibly +inflexive +inflict +inflictable +inflicter +infliction +inflictive +inflood +inflorescence +inflorescent +inflow +inflowering +influence +influenceable +influencer +influencive +influent +influential +influentiality +influentially +influenza +influenzal +influenzic +influx +influxable +influxible +influxibly +influxion +influxionism +infold +infolder +infolding +infoldment +infoliate +inform +informable +informal +informality +informalize +informally +informant +information +informational +informative +informatively +informatory +informed +informedly +informer +informidable +informingly +informity +infortiate +infortitude +infortunate +infortunately +infortunateness +infortune +infra +infrabasal +infrabestial +infrabranchial +infrabuccal +infracanthal +infracaudal +infracelestial +infracentral +infracephalic +infraclavicle +infraclavicular +infraclusion +infraconscious +infracortical +infracostal +infracostalis +infracotyloid +infract +infractible +infraction +infractor +infradentary +infradiaphragmatic +infragenual +infraglacial +infraglenoid +infraglottic +infragrant +infragular +infrahuman +infrahyoid +infralabial +infralapsarian +infralapsarianism +infralinear +infralittoral +inframammary +inframammillary +inframandibular +inframarginal +inframaxillary +inframedian +inframercurial +inframercurian +inframolecular +inframontane +inframundane +infranatural +infranaturalism +infrangibility +infrangible +infrangibleness +infrangibly +infranodal +infranuclear +infraoccipital +infraocclusion +infraocular +infraoral +infraorbital +infraordinary +infrapapillary +infrapatellar +infraperipherial +infrapose +infraposition +infraprotein +infrapubian +infraradular +infrared +infrarenal +infrarenally +infrarimal +infrascapular +infrascapularis +infrascientific +infraspinal +infraspinate +infraspinatus +infraspinous +infrastapedial +infrasternal +infrastigmatal +infrastipular +infrastructure +infrasutral +infratemporal +infraterrene +infraterritorial +infrathoracic +infratonsillar +infratracheal +infratrochanteric +infratrochlear +infratubal +infraturbinal +infravaginal +infraventral +infrequency +infrequent +infrequently +infrigidate +infrigidation +infrigidative +infringe +infringement +infringer +infringible +infructiferous +infructuose +infructuosity +infructuous +infructuously +infrugal +infrustrable +infrustrably +infula +infumate +infumated +infumation +infundibular +Infundibulata +infundibulate +infundibuliform +infundibulum +infuriate +infuriately +infuriatingly +infuriation +infuscate +infuscation +infuse +infusedly +infuser +infusibility +infusible +infusibleness +infusile +infusion +infusionism +infusionist +infusive +Infusoria +infusorial +infusorian +infusoriform +infusorioid +infusorium +infusory +Ing +ing +Inga +Ingaevones +Ingaevonic +ingallantry +ingate +ingather +ingatherer +ingathering +ingeldable +ingeminate +ingemination +ingenerability +ingenerable +ingenerably +ingenerate +ingenerately +ingeneration +ingenerative +ingeniosity +ingenious +ingeniously +ingeniousness +ingenit +ingenue +ingenuity +ingenuous +ingenuously +ingenuousness +Inger +ingerminate +ingest +ingesta +ingestible +ingestion +ingestive +Inghamite +Inghilois +ingiver +ingiving +ingle +inglenook +ingleside +inglobate +inglobe +inglorious +ingloriously +ingloriousness +inglutition +ingluvial +ingluvies +ingluviitis +ingoing +Ingomar +ingot +ingotman +ingraft +ingrain +ingrained +ingrainedly +ingrainedness +Ingram +ingrammaticism +ingrandize +ingrate +ingrateful +ingratefully +ingratefulness +ingrately +ingratiate +ingratiating +ingratiatingly +ingratiation +ingratiatory +ingratitude +ingravescent +ingravidate +ingravidation +ingredient +ingress +ingression +ingressive +ingressiveness +ingross +ingrow +ingrown +ingrownness +ingrowth +inguen +inguinal +inguinoabdominal +inguinocrural +inguinocutaneous +inguinodynia +inguinolabial +inguinoscrotal +Inguklimiut +ingulf +ingulfment +ingurgitate +ingurgitation +Ingush +inhabit +inhabitability +inhabitable +inhabitancy +inhabitant +inhabitation +inhabitative +inhabitativeness +inhabited +inhabitedness +inhabiter +inhabitiveness +inhabitress +inhalant +inhalation +inhalator +inhale +inhalement +inhalent +inhaler +inharmonic +inharmonical +inharmonious +inharmoniously +inharmoniousness +inharmony +inhaul +inhauler +inhaust +inhaustion +inhearse +inheaven +inhere +inherence +inherency +inherent +inherently +inherit +inheritability +inheritable +inheritableness +inheritably +inheritage +inheritance +inheritor +inheritress +inheritrice +inheritrix +inhesion +inhiate +inhibit +inhibitable +inhibiter +inhibition +inhibitionist +inhibitive +inhibitor +inhibitory +inhomogeneity +inhomogeneous +inhomogeneously +inhospitable +inhospitableness +inhospitably +inhospitality +inhuman +inhumane +inhumanely +inhumanism +inhumanity +inhumanize +inhumanly +inhumanness +inhumate +inhumation +inhumationist +inhume +inhumer +inhumorous +inhumorously +Inia +inial +inidoneity +inidoneous +Inigo +inimicable +inimical +inimicality +inimically +inimicalness +inimitability +inimitable +inimitableness +inimitably +iniome +Iniomi +iniomous +inion +iniquitable +iniquitably +iniquitous +iniquitously +iniquitousness +iniquity +inirritability +inirritable +inirritant +inirritative +inissuable +initial +initialer +initialist +initialize +initially +initiant +initiary +initiate +initiation +initiative +initiatively +initiator +initiatorily +initiatory +initiatress +initiatrix +initis +initive +inject +injectable +injection +injector +injelly +injudicial +injudicially +injudicious +injudiciously +injudiciousness +Injun +injunct +injunction +injunctive +injunctively +injurable +injure +injured +injuredly +injuredness +injurer +injurious +injuriously +injuriousness +injury +injustice +ink +inkberry +inkbush +inken +inker +Inkerman +inket +inkfish +inkholder +inkhorn +inkhornism +inkhornist +inkhornize +inkhornizer +inkindle +inkiness +inkish +inkle +inkless +inklike +inkling +inkmaker +inkmaking +inknot +inkosi +inkpot +Inkra +inkroot +inks +inkshed +inkslinger +inkslinging +inkstain +inkstand +inkstandish +inkstone +inkweed +inkwell +inkwood +inkwriter +inky +inlagation +inlaid +inlaik +inlake +inland +inlander +inlandish +inlaut +inlaw +inlawry +inlay +inlayer +inlaying +inleague +inleak +inleakage +inlet +inlier +inlook +inlooker +inly +inlying +inmate +inmeats +inmixture +inmost +inn +innascibility +innascible +innate +innately +innateness +innatism +innative +innatural +innaturality +innaturally +inneity +inner +innerly +innermore +innermost +innermostly +innerness +innervate +innervation +innervational +innerve +inness +innest +innet +innholder +inning +inninmorite +Innisfail +innkeeper +innless +innocence +innocency +innocent +innocently +innocentness +innocuity +innocuous +innocuously +innocuousness +innominable +innominables +innominata +innominate +innominatum +innovant +innovate +innovation +innovational +innovationist +innovative +innovator +innovatory +innoxious +innoxiously +innoxiousness +innuendo +Innuit +innumerability +innumerable +innumerableness +innumerably +innumerous +innutrient +innutrition +innutritious +innutritive +innyard +Ino +inobedience +inobedient +inobediently +inoblast +inobnoxious +inobscurable +inobservable +inobservance +inobservancy +inobservant +inobservantly +inobservantness +inobservation +inobtainable +inobtrusive +inobtrusively +inobtrusiveness +inobvious +Inocarpus +inoccupation +Inoceramus +inochondritis +inochondroma +inoculability +inoculable +inoculant +inocular +inoculate +inoculation +inoculative +inoculator +inoculum +inocystoma +inocyte +Inodes +inodorous +inodorously +inodorousness +inoepithelioma +inoffending +inoffensive +inoffensively +inoffensiveness +inofficial +inofficially +inofficiosity +inofficious +inofficiously +inofficiousness +inogen +inogenesis +inogenic +inogenous +inoglia +inohymenitic +inolith +inoma +inominous +inomyoma +inomyositis +inomyxoma +inone +inoneuroma +inoperable +inoperative +inoperativeness +inopercular +Inoperculata +inoperculate +inopinable +inopinate +inopinately +inopine +inopportune +inopportunely +inopportuneness +inopportunism +inopportunist +inopportunity +inoppressive +inoppugnable +inopulent +inorb +inorderly +inordinacy +inordinary +inordinate +inordinately +inordinateness +inorganic +inorganical +inorganically +inorganizable +inorganization +inorganized +inoriginate +inornate +inosclerosis +inoscopy +inosculate +inosculation +inosic +inosin +inosinic +inosite +inositol +inostensible +inostensibly +inotropic +inower +inoxidability +inoxidable +inoxidizable +inoxidize +inparabola +inpardonable +inpatient +inpayment +inpensioner +inphase +inpolygon +inpolyhedron +inport +inpour +inpush +input +inquaintance +inquartation +inquest +inquestual +inquiet +inquietation +inquietly +inquietness +inquietude +Inquilinae +inquiline +inquilinism +inquilinity +inquilinous +inquinate +inquination +inquirable +inquirant +inquiration +inquire +inquirendo +inquirent +inquirer +inquiring +inquiringly +inquiry +inquisite +inquisition +inquisitional +inquisitionist +inquisitive +inquisitively +inquisitiveness +inquisitor +inquisitorial +inquisitorially +inquisitorialness +inquisitorious +inquisitorship +inquisitory +inquisitress +inquisitrix +inquisiturient +inradius +inreality +inrigged +inrigger +inrighted +inring +inro +inroad +inroader +inroll +inrooted +inrub +inrun +inrunning +inruption +inrush +insack +insagacity +insalivate +insalivation +insalubrious +insalubrity +insalutary +insalvability +insalvable +insane +insanely +insaneness +insanify +insanitariness +insanitary +insanitation +insanity +insapiency +insapient +insatiability +insatiable +insatiableness +insatiably +insatiate +insatiated +insatiately +insatiateness +insatiety +insatisfaction +insatisfactorily +insaturable +inscenation +inscibile +inscience +inscient +inscribable +inscribableness +inscribe +inscriber +inscript +inscriptible +inscription +inscriptional +inscriptioned +inscriptionist +inscriptionless +inscriptive +inscriptively +inscriptured +inscroll +inscrutability +inscrutable +inscrutableness +inscrutables +inscrutably +insculp +insculpture +insea +inseam +insect +Insecta +insectan +insectarium +insectary +insectean +insected +insecticidal +insecticide +insectiferous +insectiform +insectifuge +insectile +insectine +insection +insectival +Insectivora +insectivore +insectivorous +insectlike +insectmonger +insectologer +insectologist +insectology +insectproof +insecure +insecurely +insecureness +insecurity +insee +inseer +inselberg +inseminate +insemination +insenescible +insensate +insensately +insensateness +insense +insensibility +insensibilization +insensibilize +insensibilizer +insensible +insensibleness +insensibly +insensitive +insensitiveness +insensitivity +insensuous +insentience +insentiency +insentient +inseparability +inseparable +inseparableness +inseparably +inseparate +inseparately +insequent +insert +insertable +inserted +inserter +insertion +insertional +insertive +inserviceable +insessor +Insessores +insessorial +inset +insetter +inseverable +inseverably +inshave +insheathe +inshell +inshining +inship +inshoe +inshoot +inshore +inside +insider +insidiosity +insidious +insidiously +insidiousness +insight +insightful +insigne +insignia +insignificance +insignificancy +insignificant +insignificantly +insimplicity +insincere +insincerely +insincerity +insinking +insinuant +insinuate +insinuating +insinuatingly +insinuation +insinuative +insinuatively +insinuativeness +insinuator +insinuatory +insinuendo +insipid +insipidity +insipidly +insipidness +insipience +insipient +insipiently +insist +insistence +insistency +insistent +insistently +insister +insistingly +insistive +insititious +insnare +insnarement +insnarer +insobriety +insociability +insociable +insociableness +insociably +insocial +insocially +insofar +insolate +insolation +insole +insolence +insolency +insolent +insolently +insolentness +insolid +insolidity +insolubility +insoluble +insolubleness +insolubly +insolvability +insolvable +insolvably +insolvence +insolvency +insolvent +insomnia +insomniac +insomnious +insomnolence +insomnolency +insomnolent +insomuch +insonorous +insooth +insorb +insorbent +insouciance +insouciant +insouciantly +insoul +inspan +inspeak +inspect +inspectability +inspectable +inspectingly +inspection +inspectional +inspectioneer +inspective +inspector +inspectoral +inspectorate +inspectorial +inspectorship +inspectress +inspectrix +inspheration +insphere +inspirability +inspirable +inspirant +inspiration +inspirational +inspirationalism +inspirationally +inspirationist +inspirative +inspirator +inspiratory +inspiratrix +inspire +inspired +inspiredly +inspirer +inspiring +inspiringly +inspirit +inspiriter +inspiriting +inspiritingly +inspiritment +inspirometer +inspissant +inspissate +inspissation +inspissator +inspissosis +inspoke +inspoken +inspreith +instability +instable +install +installant +installation +installer +installment +instance +instancy +instanding +instant +instantaneity +instantaneous +instantaneously +instantaneousness +instanter +instantial +instantly +instantness +instar +instate +instatement +instaurate +instauration +instaurator +instead +instealing +insteam +insteep +instellation +instep +instigant +instigate +instigatingly +instigation +instigative +instigator +instigatrix +instill +instillation +instillator +instillatory +instiller +instillment +instinct +instinctive +instinctively +instinctivist +instinctivity +instinctual +instipulate +institor +institorial +institorian +institory +institute +instituter +institution +institutional +institutionalism +institutionalist +institutionality +institutionalization +institutionalize +institutionally +institutionary +institutionize +institutive +institutively +institutor +institutress +institutrix +instonement +instratified +instreaming +instrengthen +instressed +instroke +instruct +instructed +instructedly +instructedness +instructer +instructible +instruction +instructional +instructionary +instructive +instructively +instructiveness +instructor +instructorship +instructress +instrument +instrumental +instrumentalism +instrumentalist +instrumentality +instrumentalize +instrumentally +instrumentary +instrumentate +instrumentation +instrumentative +instrumentist +instrumentman +insuavity +insubduable +insubjection +insubmergible +insubmersible +insubmission +insubmissive +insubordinate +insubordinately +insubordinateness +insubordination +insubstantial +insubstantiality +insubstantiate +insubstantiation +insubvertible +insuccess +insuccessful +insucken +insuetude +insufferable +insufferableness +insufferably +insufficience +insufficiency +insufficient +insufficiently +insufflate +insufflation +insufflator +insula +insulance +insulant +insular +insularism +insularity +insularize +insularly +insulary +insulate +insulated +insulating +insulation +insulator +insulin +insulize +insulse +insulsity +insult +insultable +insultant +insultation +insulter +insulting +insultingly +insultproof +insunk +insuperability +insuperable +insuperableness +insuperably +insupportable +insupportableness +insupportably +insupposable +insuppressible +insuppressibly +insuppressive +insurability +insurable +insurance +insurant +insure +insured +insurer +insurge +insurgence +insurgency +insurgent +insurgentism +insurgescence +insurmountability +insurmountable +insurmountableness +insurmountably +insurpassable +insurrect +insurrection +insurrectional +insurrectionally +insurrectionary +insurrectionism +insurrectionist +insurrectionize +insurrectory +insusceptibility +insusceptible +insusceptibly +insusceptive +inswamp +inswarming +insweeping +inswell +inswept +inswing +inswinger +intabulate +intact +intactile +intactly +intactness +intagliated +intagliation +intaglio +intagliotype +intake +intaker +intangibility +intangible +intangibleness +intangibly +intarissable +intarsia +intarsiate +intarsist +intastable +intaxable +intechnicality +integer +integrability +integrable +integral +integrality +integralization +integralize +integrally +integrand +integrant +integraph +integrate +integration +integrative +integrator +integrifolious +integrious +integriously +integripalliate +integrity +integrodifferential +integropallial +Integropallialia +Integropalliata +integropalliate +integument +integumental +integumentary +integumentation +inteind +intellect +intellectation +intellected +intellectible +intellection +intellective +intellectively +intellectual +intellectualism +intellectualist +intellectualistic +intellectualistically +intellectuality +intellectualization +intellectualize +intellectualizer +intellectually +intellectualness +intelligence +intelligenced +intelligencer +intelligency +intelligent +intelligential +intelligently +intelligentsia +intelligibility +intelligible +intelligibleness +intelligibly +intelligize +intemerate +intemerately +intemerateness +intemeration +intemperable +intemperably +intemperament +intemperance +intemperate +intemperately +intemperateness +intemperature +intempestive +intempestively +intempestivity +intemporal +intemporally +intenability +intenable +intenancy +intend +intendance +intendancy +intendant +intendantism +intendantship +intended +intendedly +intendedness +intendence +intender +intendible +intending +intendingly +intendit +intendment +intenerate +inteneration +intenible +intensate +intensation +intensative +intense +intensely +intenseness +intensification +intensifier +intensify +intension +intensional +intensionally +intensitive +intensity +intensive +intensively +intensiveness +intent +intention +intentional +intentionalism +intentionality +intentionally +intentioned +intentionless +intentive +intentively +intentiveness +intently +intentness +inter +interabsorption +interacademic +interaccessory +interaccuse +interacinar +interacinous +interact +interaction +interactional +interactionism +interactionist +interactive +interactivity +interadaptation +interadditive +interadventual +interaffiliation +interagency +interagent +interagglutinate +interagglutination +interagree +interagreement +interalar +interallied +interally +interalveolar +interambulacral +interambulacrum +interamnian +interangular +interanimate +interannular +interantagonism +interantennal +interantennary +interapophyseal +interapplication +interarboration +interarch +interarcualis +interarmy +interarticular +interartistic +interarytenoid +interassociation +interassure +interasteroidal +interastral +interatomic +interatrial +interattrition +interaulic +interaural +interauricular +interavailability +interavailable +interaxal +interaxial +interaxillary +interaxis +interbalance +interbanded +interbank +interbedded +interbelligerent +interblend +interbody +interbonding +interborough +interbourse +interbrachial +interbrain +interbranch +interbranchial +interbreath +interbreed +interbrigade +interbring +interbronchial +intercadence +intercadent +intercalare +intercalarily +intercalarium +intercalary +intercalate +intercalation +intercalative +intercalatory +intercale +intercalm +intercanal +intercanalicular +intercapillary +intercardinal +intercarotid +intercarpal +intercarpellary +intercarrier +intercartilaginous +intercaste +intercatenated +intercausative +intercavernous +intercede +interceder +intercellular +intercensal +intercentral +intercentrum +intercept +intercepter +intercepting +interception +interceptive +interceptor +interceptress +intercerebral +intercession +intercessional +intercessionary +intercessionment +intercessive +intercessor +intercessorial +intercessory +interchaff +interchange +interchangeability +interchangeable +interchangeableness +interchangeably +interchanger +interchapter +intercharge +interchase +intercheck +interchoke +interchondral +interchurch +Intercidona +interciliary +intercilium +intercircle +intercirculate +intercirculation +intercision +intercitizenship +intercity +intercivic +intercivilization +interclash +interclasp +interclass +interclavicle +interclavicular +interclerical +intercloud +interclub +intercoastal +intercoccygeal +intercoccygean +intercohesion +intercollege +intercollegian +intercollegiate +intercolline +intercolonial +intercolonially +intercolonization +intercolumn +intercolumnal +intercolumnar +intercolumniation +intercom +intercombat +intercombination +intercombine +intercome +intercommission +intercommon +intercommonable +intercommonage +intercommoner +intercommunal +intercommune +intercommuner +intercommunicability +intercommunicable +intercommunicate +intercommunication +intercommunicative +intercommunicator +intercommunion +intercommunity +intercompany +intercomparable +intercompare +intercomparison +intercomplexity +intercomplimentary +interconal +interconciliary +intercondenser +intercondylar +intercondylic +intercondyloid +interconfessional +interconfound +interconnect +interconnection +intercontinental +intercontorted +intercontradiction +intercontradictory +interconversion +interconvertibility +interconvertible +interconvertibly +intercooler +intercooling +intercoracoid +intercorporate +intercorpuscular +intercorrelate +intercorrelation +intercortical +intercosmic +intercosmically +intercostal +intercostally +intercostobrachial +intercostohumeral +intercotylar +intercounty +intercourse +intercoxal +intercranial +intercreate +intercrescence +intercrinal +intercrop +intercross +intercrural +intercrust +intercrystalline +intercrystallization +intercrystallize +intercultural +interculture +intercurl +intercurrence +intercurrent +intercurrently +intercursation +intercuspidal +intercutaneous +intercystic +interdash +interdebate +interdenominational +interdental +interdentally +interdentil +interdepartmental +interdepartmentally +interdepend +interdependable +interdependence +interdependency +interdependent +interdependently +interderivative +interdespise +interdestructive +interdestructiveness +interdetermination +interdetermine +interdevour +interdict +interdiction +interdictive +interdictor +interdictory +interdictum +interdifferentiation +interdiffuse +interdiffusion +interdiffusive +interdiffusiveness +interdigital +interdigitate +interdigitation +interdine +interdiscal +interdispensation +interdistinguish +interdistrict +interdivision +interdome +interdorsal +interdrink +intereat +interelectrode +interelectrodic +interempire +interenjoy +interentangle +interentanglement +interepidemic +interepimeral +interepithelial +interequinoctial +interessee +interest +interested +interestedly +interestedness +interester +interesting +interestingly +interestingness +interestless +interestuarine +interface +interfacial +interfactional +interfamily +interfascicular +interfault +interfector +interfederation +interfemoral +interfenestral +interfenestration +interferant +interfere +interference +interferent +interferential +interferer +interfering +interferingly +interferingness +interferometer +interferometry +interferric +interfertile +interfertility +interfibrillar +interfibrillary +interfibrous +interfilamentar +interfilamentary +interfilamentous +interfilar +interfiltrate +interfinger +interflange +interflashing +interflow +interfluence +interfluent +interfluminal +interfluous +interfluve +interfluvial +interflux +interfold +interfoliaceous +interfoliar +interfoliate +interfollicular +interforce +interfraternal +interfraternity +interfret +interfretted +interfriction +interfrontal +interfruitful +interfulgent +interfuse +interfusion +interganglionic +intergenerant +intergenerating +intergeneration +intergential +intergesture +intergilt +interglacial +interglandular +interglobular +interglyph +intergossip +intergovernmental +intergradation +intergrade +intergradient +intergraft +intergranular +intergrapple +intergrave +intergroupal +intergrow +intergrown +intergrowth +intergular +intergyral +interhabitation +interhemal +interhemispheric +interhostile +interhuman +interhyal +interhybridize +interim +interimist +interimistic +interimistical +interimistically +interimperial +interincorporation +interindependence +interindicate +interindividual +interinfluence +interinhibition +interinhibitive +interinsert +interinsular +interinsurance +interinsurer +interinvolve +interionic +interior +interiority +interiorize +interiorly +interiorness +interirrigation +interisland +interjacence +interjacency +interjacent +interjaculate +interjaculatory +interjangle +interjealousy +interject +interjection +interjectional +interjectionalize +interjectionally +interjectionary +interjectionize +interjectiveness +interjector +interjectorily +interjectory +interjectural +interjoin +interjoist +interjudgment +interjunction +interkinesis +interkinetic +interknit +interknot +interknow +interknowledge +interlaboratory +interlace +interlaced +interlacedly +interlacement +interlacery +interlacustrine +interlaid +interlake +interlamellar +interlamellation +interlaminar +interlaminate +interlamination +interlanguage +interlap +interlapse +interlard +interlardation +interlardment +interlatitudinal +interlaudation +interlay +interleaf +interleague +interleave +interleaver +interlibel +interlibrary +interlie +interligamentary +interligamentous +interlight +interlimitation +interline +interlineal +interlineally +interlinear +interlinearily +interlinearly +interlineary +interlineate +interlineation +interlinement +interliner +Interlingua +interlingual +interlinguist +interlinguistic +interlining +interlink +interloan +interlobar +interlobate +interlobular +interlocal +interlocally +interlocate +interlocation +interlock +interlocker +interlocular +interloculus +interlocution +interlocutive +interlocutor +interlocutorily +interlocutory +interlocutress +interlocutrice +interlocutrix +interloop +interlope +interloper +interlot +interlucation +interlucent +interlude +interluder +interludial +interlunar +interlunation +interlying +intermalleolar +intermammary +intermammillary +intermandibular +intermanorial +intermarginal +intermarine +intermarriage +intermarriageable +intermarry +intermason +intermastoid +intermat +intermatch +intermaxilla +intermaxillar +intermaxillary +intermaze +intermeasurable +intermeasure +intermeddle +intermeddlement +intermeddler +intermeddlesome +intermeddlesomeness +intermeddling +intermeddlingly +intermediacy +intermediae +intermedial +intermediary +intermediate +intermediately +intermediateness +intermediation +intermediator +intermediatory +intermedium +intermedius +intermeet +intermelt +intermembral +intermembranous +intermeningeal +intermenstrual +intermenstruum +interment +intermental +intermention +intermercurial +intermesenterial +intermesenteric +intermesh +intermessage +intermessenger +intermetacarpal +intermetallic +intermetameric +intermetatarsal +intermew +intermewed +intermewer +intermezzo +intermigration +interminability +interminable +interminableness +interminably +interminant +interminate +intermine +intermingle +intermingledom +interminglement +interminister +interministerial +interministerium +intermission +intermissive +intermit +intermitted +intermittedly +intermittence +intermittency +intermittent +intermittently +intermitter +intermitting +intermittingly +intermix +intermixedly +intermixtly +intermixture +intermobility +intermodification +intermodillion +intermodulation +intermolar +intermolecular +intermomentary +intermontane +intermorainic +intermotion +intermountain +intermundane +intermundial +intermundian +intermundium +intermunicipal +intermunicipality +intermural +intermuscular +intermutation +intermutual +intermutually +intermutule +intern +internal +internality +internalization +internalize +internally +internalness +internals +internarial +internasal +internation +international +internationalism +internationalist +internationality +internationalization +internationalize +internationally +interneciary +internecinal +internecine +internecion +internecive +internee +internetted +interneural +interneuronic +internidal +internist +internment +internobasal +internodal +internode +internodial +internodian +internodium +internodular +internship +internuclear +internuncial +internunciary +internunciatory +internuncio +internuncioship +internuncius +internuptial +interobjective +interoceanic +interoceptive +interoceptor +interocular +interoffice +interolivary +interopercle +interopercular +interoperculum +interoptic +interorbital +interorbitally +interoscillate +interosculant +interosculate +interosculation +interosseal +interosseous +interownership +interpage +interpalatine +interpalpebral +interpapillary +interparenchymal +interparental +interparenthetical +interparenthetically +interparietal +interparietale +interparliament +interparliamentary +interparoxysmal +interparty +interpause +interpave +interpeal +interpectoral +interpeduncular +interpel +interpellant +interpellate +interpellation +interpellator +interpenetrable +interpenetrant +interpenetrate +interpenetration +interpenetrative +interpenetratively +interpermeate +interpersonal +interpervade +interpetaloid +interpetiolar +interpetiolary +interphalangeal +interphase +interphone +interpiece +interpilaster +interpilastering +interplacental +interplait +interplanetary +interplant +interplanting +interplay +interplea +interplead +interpleader +interpledge +interpleural +interplical +interplicate +interplication +interplight +interpoint +interpolable +interpolar +interpolary +interpolate +interpolater +interpolation +interpolative +interpolatively +interpolator +interpole +interpolitical +interpolity +interpollinate +interpolymer +interpone +interportal +interposable +interposal +interpose +interposer +interposing +interposingly +interposition +interposure +interpour +interprater +interpressure +interpret +interpretability +interpretable +interpretableness +interpretably +interpretament +interpretation +interpretational +interpretative +interpretatively +interpreter +interpretership +interpretive +interpretively +interpretorial +interpretress +interprismatic +interproduce +interprofessional +interproglottidal +interproportional +interprotoplasmic +interprovincial +interproximal +interproximate +interpterygoid +interpubic +interpulmonary +interpunct +interpunction +interpunctuate +interpunctuation +interpupillary +interquarrel +interquarter +interrace +interracial +interracialism +interradial +interradially +interradiate +interradiation +interradium +interradius +interrailway +interramal +interramicorn +interramification +interreceive +interreflection +interregal +interregimental +interregional +interregna +interregnal +interregnum +interreign +interrelate +interrelated +interrelatedly +interrelatedness +interrelation +interrelationship +interreligious +interrenal +interrenalism +interrepellent +interrepulsion +interrer +interresponsibility +interresponsible +interreticular +interreticulation +interrex +interrhyme +interright +interriven +interroad +interrogability +interrogable +interrogant +interrogate +interrogatedness +interrogatee +interrogatingly +interrogation +interrogational +interrogative +interrogatively +interrogator +interrogatorily +interrogatory +interrogatrix +interrogee +interroom +interrule +interrun +interrupt +interrupted +interruptedly +interruptedness +interrupter +interruptible +interrupting +interruptingly +interruption +interruptive +interruptively +interruptor +interruptory +intersale +intersalute +interscapilium +interscapular +interscapulum +interscene +interscholastic +interschool +interscience +interscribe +interscription +interseaboard +interseamed +intersect +intersectant +intersection +intersectional +intersegmental +interseminal +intersentimental +interseptal +intersertal +intersesamoid +intersession +intersessional +interset +intersex +intersexual +intersexualism +intersexuality +intershade +intershifting +intershock +intershoot +intershop +intersidereal +intersituate +intersocial +intersocietal +intersociety +intersole +intersolubility +intersoluble +intersomnial +intersomnious +intersonant +intersow +interspace +interspatial +interspatially +interspeaker +interspecial +interspecific +interspersal +intersperse +interspersedly +interspersion +interspheral +intersphere +interspicular +interspinal +interspinalis +interspinous +interspiral +interspiration +intersporal +intersprinkle +intersqueeze +interstadial +interstage +interstaminal +interstapedial +interstate +interstation +interstellar +interstellary +intersterile +intersterility +intersternal +interstice +intersticed +interstimulate +interstimulation +interstitial +interstitially +interstitious +interstratification +interstratify +interstreak +interstream +interstreet +interstrial +interstriation +interstrive +intersubjective +intersubsistence +intersubstitution +intersuperciliary +intersusceptation +intersystem +intersystematical +intertalk +intertangle +intertanglement +intertarsal +interteam +intertentacular +intertergal +interterminal +interterritorial +intertessellation +intertexture +interthing +interthreaded +interthronging +intertidal +intertie +intertill +intertillage +intertinge +intertissued +intertone +intertongue +intertonic +intertouch +intertown +intertrabecular +intertrace +intertrade +intertrading +intertraffic +intertragian +intertransformability +intertransformable +intertransmissible +intertransmission +intertranspicuous +intertransversal +intertransversalis +intertransversary +intertransverse +intertrappean +intertribal +intertriginous +intertriglyph +intertrigo +intertrinitarian +intertrochanteric +intertropic +intertropical +intertropics +intertrude +intertuberal +intertubercular +intertubular +intertwin +intertwine +intertwinement +intertwining +intertwiningly +intertwist +intertwistingly +Intertype +interungular +interungulate +interunion +interuniversity +interurban +interureteric +intervaginal +interval +intervale +intervalley +intervallic +intervallum +intervalvular +intervarietal +intervary +intervascular +intervein +interveinal +intervenant +intervene +intervener +intervenience +interveniency +intervenient +intervenium +intervention +interventional +interventionism +interventionist +interventive +interventor +interventral +interventralia +interventricular +intervenular +interverbal +interversion +intervert +intervertebra +intervertebral +intervertebrally +intervesicular +interview +interviewable +interviewee +interviewer +intervillous +intervisibility +intervisible +intervisit +intervisitation +intervital +intervocal +intervocalic +intervolute +intervolution +intervolve +interwar +interweave +interweavement +interweaver +interweaving +interweavingly +interwed +interweld +interwhiff +interwhile +interwhistle +interwind +interwish +interword +interwork +interworks +interworld +interworry +interwound +interwove +interwoven +interwovenly +interwrap +interwreathe +interwrought +interxylary +interzonal +interzone +interzooecial +interzygapophysial +intestable +intestacy +intestate +intestation +intestinal +intestinally +intestine +intestineness +intestiniform +intestinovesical +intext +intextine +intexture +inthrall +inthrallment +inthrong +inthronistic +inthronization +inthronize +inthrow +inthrust +intil +intima +intimacy +intimal +intimate +intimately +intimateness +intimater +intimation +intimidate +intimidation +intimidator +intimidatory +intimidity +intimity +intinction +intine +intitule +into +intoed +intolerability +intolerable +intolerableness +intolerably +intolerance +intolerancy +intolerant +intolerantly +intolerantness +intolerated +intolerating +intoleration +intonable +intonate +intonation +intonator +intone +intonement +intoner +intoothed +intorsion +intort +intortillage +intown +intoxation +intoxicable +intoxicant +intoxicate +intoxicated +intoxicatedly +intoxicatedness +intoxicating +intoxicatingly +intoxication +intoxicative +intoxicator +intrabiontic +intrabranchial +intrabred +intrabronchial +intrabuccal +intracalicular +intracanalicular +intracanonical +intracapsular +intracardiac +intracardial +intracarpal +intracarpellary +intracartilaginous +intracellular +intracellularly +intracephalic +intracerebellar +intracerebral +intracerebrally +intracervical +intrachordal +intracistern +intracity +intraclitelline +intracloacal +intracoastal +intracoelomic +intracolic +intracollegiate +intracommunication +intracompany +intracontinental +intracorporeal +intracorpuscular +intracortical +intracosmic +intracosmical +intracosmically +intracostal +intracranial +intracranially +intractability +intractable +intractableness +intractably +intractile +intracutaneous +intracystic +intrada +intradepartmental +intradermal +intradermally +intradermic +intradermically +intradermo +intradistrict +intradivisional +intrados +intraduodenal +intradural +intraecclesiastical +intraepiphyseal +intraepithelial +intrafactory +intrafascicular +intrafissural +intrafistular +intrafoliaceous +intraformational +intrafusal +intragastric +intragemmal +intraglacial +intraglandular +intraglobular +intragroup +intragroupal +intragyral +intrahepatic +intrahyoid +intraimperial +intrait +intrajugular +intralamellar +intralaryngeal +intralaryngeally +intraleukocytic +intraligamentary +intraligamentous +intralingual +intralobar +intralobular +intralocular +intralogical +intralumbar +intramammary +intramarginal +intramastoid +intramatrical +intramatrically +intramedullary +intramembranous +intrameningeal +intramental +intrametropolitan +intramolecular +intramontane +intramorainic +intramundane +intramural +intramuralism +intramuscular +intramuscularly +intramyocardial +intranarial +intranasal +intranatal +intranational +intraneous +intraneural +intranidal +intranquil +intranquillity +intranscalency +intranscalent +intransferable +intransformable +intransfusible +intransgressible +intransient +intransigency +intransigent +intransigentism +intransigentist +intransigently +intransitable +intransitive +intransitively +intransitiveness +intransitivity +intranslatable +intransmissible +intransmutability +intransmutable +intransparency +intransparent +intrant +intranuclear +intraoctave +intraocular +intraoral +intraorbital +intraorganization +intraossal +intraosseous +intraosteal +intraovarian +intrapair +intraparenchymatous +intraparietal +intraparochial +intraparty +intrapelvic +intrapericardiac +intrapericardial +intraperineal +intraperiosteal +intraperitoneal +intraperitoneally +intrapetiolar +intraphilosophic +intrapial +intraplacental +intraplant +intrapleural +intrapolar +intrapontine +intraprostatic +intraprotoplasmic +intrapsychic +intrapsychical +intrapsychically +intrapulmonary +intrapyretic +intrarachidian +intrarectal +intrarelation +intrarenal +intraretinal +intrarhachidian +intraschool +intrascrotal +intrasegmental +intraselection +intrasellar +intraseminal +intraseptal +intraserous +intrashop +intraspecific +intraspinal +intrastate +intrastromal +intrasusception +intrasynovial +intratarsal +intratelluric +intraterritorial +intratesticular +intrathecal +intrathoracic +intrathyroid +intratomic +intratonsillar +intratrabecular +intratracheal +intratracheally +intratropical +intratubal +intratubular +intratympanic +intravaginal +intravalvular +intravasation +intravascular +intravenous +intravenously +intraventricular +intraverbal +intraversable +intravertebral +intravertebrally +intravesical +intravital +intravitelline +intravitreous +intraxylary +intreat +intrench +intrenchant +intrencher +intrenchment +intrepid +intrepidity +intrepidly +intrepidness +intricacy +intricate +intricately +intricateness +intrication +intrigant +intrigue +intrigueproof +intriguer +intriguery +intriguess +intriguing +intriguingly +intrine +intrinse +intrinsic +intrinsical +intrinsicality +intrinsically +intrinsicalness +introactive +introceptive +introconversion +introconvertibility +introconvertible +introdden +introduce +introducee +introducement +introducer +introducible +introduction +introductive +introductively +introductor +introductorily +introductoriness +introductory +introductress +introflex +introflexion +introgression +introgressive +introinflection +introit +introitus +introject +introjection +introjective +intromissibility +intromissible +intromission +intromissive +intromit +intromittence +intromittent +intromitter +intropression +intropulsive +introreception +introrsal +introrse +introrsely +introsensible +introsentient +introspect +introspectable +introspection +introspectional +introspectionism +introspectionist +introspective +introspectively +introspectiveness +introspectivism +introspectivist +introspector +introsuction +introsuscept +introsusception +introthoracic +introtraction +introvenient +introverse +introversibility +introversible +introversion +introversive +introversively +introvert +introverted +introvertive +introvision +introvolution +intrudance +intrude +intruder +intruding +intrudingly +intrudress +intruse +intrusion +intrusional +intrusionism +intrusionist +intrusive +intrusively +intrusiveness +intrust +intubate +intubation +intubationist +intubator +intube +intue +intuent +intuicity +intuit +intuitable +intuition +intuitional +intuitionalism +intuitionalist +intuitionally +intuitionism +intuitionist +intuitionistic +intuitionless +intuitive +intuitively +intuitiveness +intuitivism +intuitivist +intumesce +intumescence +intumescent +inturbidate +inturn +inturned +inturning +intussuscept +intussusception +intussusceptive +intwist +inula +inulaceous +inulase +inulin +inuloid +inumbrate +inumbration +inunct +inunction +inunctum +inunctuosity +inunctuous +inundable +inundant +inundate +inundation +inundator +inundatory +inunderstandable +inurbane +inurbanely +inurbaneness +inurbanity +inure +inured +inuredness +inurement +inurn +inusitate +inusitateness +inusitation +inustion +inutile +inutilely +inutility +inutilized +inutterable +invaccinate +invaccination +invadable +invade +invader +invaginable +invaginate +invagination +invalescence +invalid +invalidate +invalidation +invalidator +invalidcy +invalidhood +invalidish +invalidism +invalidity +invalidly +invalidness +invalidship +invalorous +invaluable +invaluableness +invaluably +invalued +Invar +invariability +invariable +invariableness +invariably +invariance +invariancy +invariant +invariantive +invariantively +invariantly +invaried +invasion +invasionist +invasive +invecked +invected +invection +invective +invectively +invectiveness +invectivist +invector +inveigh +inveigher +inveigle +inveiglement +inveigler +inveil +invein +invendibility +invendible +invendibleness +invenient +invent +inventable +inventary +inventer +inventful +inventibility +inventible +inventibleness +invention +inventional +inventionless +inventive +inventively +inventiveness +inventor +inventoriable +inventorial +inventorially +inventory +inventress +inventurous +inveracious +inveracity +inverisimilitude +inverity +inverminate +invermination +invernacular +Inverness +inversable +inversatile +inverse +inversed +inversedly +inversely +inversion +inversionist +inversive +invert +invertase +invertebracy +invertebral +Invertebrata +invertebrate +invertebrated +inverted +invertedly +invertend +inverter +invertibility +invertible +invertile +invertin +invertive +invertor +invest +investable +investible +investigable +investigatable +investigate +investigating +investigatingly +investigation +investigational +investigative +investigator +investigatorial +investigatory +investitive +investitor +investiture +investment +investor +inveteracy +inveterate +inveterately +inveterateness +inviability +invictive +invidious +invidiously +invidiousness +invigilance +invigilancy +invigilation +invigilator +invigor +invigorant +invigorate +invigorating +invigoratingly +invigoratingness +invigoration +invigorative +invigoratively +invigorator +invinate +invination +invincibility +invincible +invincibleness +invincibly +inviolability +inviolable +inviolableness +inviolably +inviolacy +inviolate +inviolated +inviolately +inviolateness +invirile +invirility +invirtuate +inviscate +inviscation +inviscid +inviscidity +invised +invisibility +invisible +invisibleness +invisibly +invitable +invital +invitant +invitation +invitational +invitatory +invite +invitee +invitement +inviter +invitiate +inviting +invitingly +invitingness +invitress +invitrifiable +invivid +invocable +invocant +invocate +invocation +invocative +invocator +invocatory +invoice +invoke +invoker +involatile +involatility +involucel +involucellate +involucellated +involucral +involucrate +involucre +involucred +involucriform +involucrum +involuntarily +involuntariness +involuntary +involute +involuted +involutedly +involutely +involution +involutional +involutionary +involutorial +involutory +involve +involved +involvedly +involvedness +involvement +involvent +involver +invulnerability +invulnerable +invulnerableness +invulnerably +invultuation +inwale +inwall +inwandering +inward +inwardly +inwardness +inwards +inweave +inwedged +inweed +inweight +inwick +inwind +inwit +inwith +inwood +inwork +inworn +inwound +inwoven +inwrap +inwrapment +inwreathe +inwrit +inwrought +inyoite +inyoke +Io +io +Iodamoeba +iodate +iodation +iodhydrate +iodhydric +iodhydrin +iodic +iodide +iodiferous +iodinate +iodination +iodine +iodinium +iodinophil +iodinophilic +iodinophilous +iodism +iodite +iodization +iodize +iodizer +iodo +iodobehenate +iodobenzene +iodobromite +iodocasein +iodochloride +iodochromate +iodocresol +iododerma +iodoethane +iodoform +iodogallicin +iodohydrate +iodohydric +iodohydrin +iodol +iodomercurate +iodomercuriate +iodomethane +iodometric +iodometrical +iodometry +iodonium +iodopsin +iodoso +iodosobenzene +iodospongin +iodotannic +iodotherapy +iodothyrin +iodous +iodoxy +iodoxybenzene +iodyrite +iolite +ion +Ione +Ioni +Ionian +Ionic +ionic +Ionicism +Ionicization +Ionicize +Ionidium +Ionism +Ionist +ionium +ionizable +Ionization +ionization +Ionize +ionize +ionizer +ionogen +ionogenic +ionone +Ionornis +ionosphere +ionospheric +Ionoxalis +iontophoresis +Ioskeha +iota +iotacism +iotacismus +iotacist +iotization +iotize +Iowa +Iowan +Ipalnemohuani +ipecac +ipecacuanha +ipecacuanhic +Iphimedia +Iphis +ipid +Ipidae +ipil +ipomea +Ipomoea +ipomoein +ipseand +ipsedixitish +ipsedixitism +ipsedixitist +ipseity +ipsilateral +Ira +iracund +iracundity +iracundulous +irade +Iran +Irani +Iranian +Iranic +Iranism +Iranist +Iranize +Iraq +Iraqi +Iraqian +irascent +irascibility +irascible +irascibleness +irascibly +irate +irately +ire +ireful +irefully +irefulness +Irelander +ireless +Irena +irenarch +Irene +irene +irenic +irenical +irenically +irenicism +irenicist +irenicon +irenics +irenicum +Iresine +Irfan +Irgun +Irgunist +irian +Iriartea +Iriarteaceae +Iricism +Iricize +irid +Iridaceae +iridaceous +iridadenosis +iridal +iridalgia +iridate +iridauxesis +iridectome +iridectomize +iridectomy +iridectropium +iridemia +iridencleisis +iridentropium +irideous +irideremia +irides +iridesce +iridescence +iridescency +iridescent +iridescently +iridial +iridian +iridiate +iridic +iridical +iridin +iridine +iridiocyte +iridiophore +iridioplatinum +iridious +iridite +iridium +iridization +iridize +iridoavulsion +iridocapsulitis +iridocele +iridoceratitic +iridochoroiditis +iridocoloboma +iridoconstrictor +iridocyclitis +iridocyte +iridodesis +iridodiagnosis +iridodialysis +iridodonesis +iridokinesia +iridomalacia +iridomotor +Iridomyrmex +iridoncus +iridoparalysis +iridophore +iridoplegia +iridoptosis +iridopupillary +iridorhexis +iridosclerotomy +iridosmine +iridosmium +iridotasis +iridotome +iridotomy +iris +irisated +irisation +iriscope +irised +Irish +Irisher +Irishian +Irishism +Irishize +Irishly +Irishman +Irishness +Irishry +Irishwoman +Irishy +irisin +irislike +irisroot +iritic +iritis +irk +irksome +irksomely +irksomeness +Irma +Iroha +irok +iroko +iron +ironback +ironbark +ironbound +ironbush +ironclad +irone +ironer +ironfisted +ironflower +ironhanded +ironhandedly +ironhandedness +ironhard +ironhead +ironheaded +ironhearted +ironheartedly +ironheartedness +ironical +ironically +ironicalness +ironice +ironish +ironism +ironist +ironize +ironless +ironlike +ironly +ironmaker +ironmaking +ironman +ironmaster +ironmonger +ironmongering +ironmongery +ironness +ironshod +ironshot +ironside +ironsided +ironsides +ironsmith +ironstone +ironware +ironweed +ironwood +ironwork +ironworked +ironworker +ironworking +ironworks +ironwort +irony +Iroquoian +Iroquois +Irpex +irradiance +irradiancy +irradiant +irradiate +irradiated +irradiatingly +irradiation +irradiative +irradiator +irradicable +irradicate +irrarefiable +irrationability +irrationable +irrationably +irrational +irrationalism +irrationalist +irrationalistic +irrationality +irrationalize +irrationally +irrationalness +irreality +irrealizable +irrebuttable +irreceptive +irreceptivity +irreciprocal +irreciprocity +irreclaimability +irreclaimable +irreclaimableness +irreclaimably +irreclaimed +irrecognition +irrecognizability +irrecognizable +irrecognizably +irrecognizant +irrecollection +irreconcilability +irreconcilable +irreconcilableness +irreconcilably +irreconcile +irreconcilement +irreconciliability +irreconciliable +irreconciliableness +irreconciliably +irreconciliation +irrecordable +irrecoverable +irrecoverableness +irrecoverably +irrecusable +irrecusably +irredeemability +irredeemable +irredeemableness +irredeemably +irredeemed +irredenta +irredential +Irredentism +Irredentist +irredressibility +irredressible +irredressibly +irreducibility +irreducible +irreducibleness +irreducibly +irreductibility +irreductible +irreduction +irreferable +irreflection +irreflective +irreflectively +irreflectiveness +irreflexive +irreformability +irreformable +irrefragability +irrefragable +irrefragableness +irrefragably +irrefrangibility +irrefrangible +irrefrangibleness +irrefrangibly +irrefusable +irrefutability +irrefutable +irrefutableness +irrefutably +irregardless +irregeneracy +irregenerate +irregeneration +irregular +irregularism +irregularist +irregularity +irregularize +irregularly +irregularness +irregulate +irregulated +irregulation +irrelate +irrelated +irrelation +irrelative +irrelatively +irrelativeness +irrelevance +irrelevancy +irrelevant +irrelevantly +irreliability +irrelievable +irreligion +irreligionism +irreligionist +irreligionize +irreligiosity +irreligious +irreligiously +irreligiousness +irreluctant +irremeable +irremeably +irremediable +irremediableness +irremediably +irrememberable +irremissibility +irremissible +irremissibleness +irremissibly +irremission +irremissive +irremovability +irremovable +irremovableness +irremovably +irremunerable +irrenderable +irrenewable +irrenunciable +irrepair +irrepairable +irreparability +irreparable +irreparableness +irreparably +irrepassable +irrepealability +irrepealable +irrepealableness +irrepealably +irrepentance +irrepentant +irrepentantly +irreplaceable +irreplaceably +irrepleviable +irreplevisable +irreportable +irreprehensible +irreprehensibleness +irreprehensibly +irrepresentable +irrepresentableness +irrepressibility +irrepressible +irrepressibleness +irrepressibly +irrepressive +irreproachability +irreproachable +irreproachableness +irreproachably +irreproducible +irreproductive +irreprovable +irreprovableness +irreprovably +irreptitious +irrepublican +irresilient +irresistance +irresistibility +irresistible +irresistibleness +irresistibly +irresoluble +irresolubleness +irresolute +irresolutely +irresoluteness +irresolution +irresolvability +irresolvable +irresolvableness +irresolved +irresolvedly +irresonance +irresonant +irrespectability +irrespectable +irrespectful +irrespective +irrespectively +irrespirable +irrespondence +irresponsibility +irresponsible +irresponsibleness +irresponsibly +irresponsive +irresponsiveness +irrestrainable +irrestrainably +irrestrictive +irresultive +irresuscitable +irresuscitably +irretention +irretentive +irretentiveness +irreticence +irreticent +irretraceable +irretraceably +irretractable +irretractile +irretrievability +irretrievable +irretrievableness +irretrievably +irrevealable +irrevealably +irreverence +irreverend +irreverendly +irreverent +irreverential +irreverentialism +irreverentially +irreverently +irreversibility +irreversible +irreversibleness +irreversibly +irrevertible +irreviewable +irrevisable +irrevocability +irrevocable +irrevocableness +irrevocably +irrevoluble +irrigable +irrigably +irrigant +irrigate +irrigation +irrigational +irrigationist +irrigative +irrigator +irrigatorial +irrigatory +irriguous +irriguousness +irrision +irrisor +Irrisoridae +irrisory +irritability +irritable +irritableness +irritably +irritament +irritancy +irritant +irritate +irritatedly +irritating +irritatingly +irritation +irritative +irritativeness +irritator +irritatory +Irritila +irritomotile +irritomotility +irrorate +irrotational +irrotationally +irrubrical +irrupt +irruptible +irruption +irruptive +irruptively +Irvin +Irving +Irvingesque +Irvingiana +Irvingism +Irvingite +Irwin +is +Isaac +Isabel +isabelina +isabelita +Isabella +Isabelle +Isabelline +isabnormal +isaconitine +isacoustic +isadelphous +Isadora +isagoge +isagogic +isagogical +isagogically +isagogics +isagon +Isaiah +Isaian +isallobar +isallotherm +isamine +Isander +isandrous +isanemone +isanomal +isanomalous +isanthous +isapostolic +Isaria +isarioid +isatate +isatic +isatide +isatin +isatinic +Isatis +isatogen +isatogenic +Isaurian +Isawa +isazoxy +isba +Iscariot +Iscariotic +Iscariotical +Iscariotism +ischemia +ischemic +ischiac +ischiadic +ischiadicus +ischial +ischialgia +ischialgic +ischiatic +ischidrosis +ischioanal +ischiobulbar +ischiocapsular +ischiocaudal +ischiocavernosus +ischiocavernous +ischiocele +ischiocerite +ischiococcygeal +ischiofemoral +ischiofibular +ischioiliac +ischioneuralgia +ischioperineal +ischiopodite +ischiopubic +ischiopubis +ischiorectal +ischiorrhogic +ischiosacral +ischiotibial +ischiovaginal +ischiovertebral +ischium +ischocholia +ischuretic +ischuria +ischury +Ischyodus +Isegrim +isenergic +isentropic +isepiptesial +isepiptesis +iserine +iserite +isethionate +isethionic +Iseum +Isfahan +Ishmael +Ishmaelite +Ishmaelitic +Ishmaelitish +Ishmaelitism +ishpingo +ishshakku +Isiac +Isiacal +Isidae +isidiiferous +isidioid +isidiophorous +isidiose +isidium +isidoid +Isidore +Isidorian +Isidoric +Isinai +isindazole +isinglass +Isis +Islam +Islamic +Islamism +Islamist +Islamistic +Islamite +Islamitic +Islamitish +Islamization +Islamize +island +islander +islandhood +islandic +islandish +islandless +islandlike +islandman +islandress +islandry +islandy +islay +isle +isleless +islesman +islet +Isleta +isleted +isleward +islot +ism +Ismaelism +Ismaelite +Ismaelitic +Ismaelitical +Ismaelitish +Ismaili +Ismailian +Ismailite +ismal +ismatic +ismatical +ismaticalness +ismdom +ismy +Isnardia +iso +isoabnormal +isoagglutination +isoagglutinative +isoagglutinin +isoagglutinogen +isoalantolactone +isoallyl +isoamarine +isoamide +isoamyl +isoamylamine +isoamylene +isoamylethyl +isoamylidene +isoantibody +isoantigen +isoapiole +isoasparagine +isoaurore +isobar +isobarbaloin +isobarbituric +isobare +isobaric +isobarism +isobarometric +isobase +isobath +isobathic +isobathytherm +isobathythermal +isobathythermic +isobenzofuran +isobilateral +isobilianic +isobiogenetic +isoborneol +isobornyl +isobront +isobronton +isobutane +isobutyl +isobutylene +isobutyraldehyde +isobutyrate +isobutyric +isobutyryl +isocamphor +isocamphoric +isocaproic +isocarbostyril +Isocardia +Isocardiidae +isocarpic +isocarpous +isocellular +isocephalic +isocephalism +isocephalous +isocephaly +isocercal +isocercy +isochasm +isochasmic +isocheim +isocheimal +isocheimenal +isocheimic +isocheimonal +isochlor +isochlorophyll +isochlorophyllin +isocholanic +isocholesterin +isocholesterol +isochor +isochoric +isochromatic +isochronal +isochronally +isochrone +isochronic +isochronical +isochronism +isochronize +isochronon +isochronous +isochronously +isochroous +isocinchomeronic +isocinchonine +isocitric +isoclasite +isoclimatic +isoclinal +isocline +isoclinic +isocodeine +isocola +isocolic +isocolon +isocoria +isocorybulbin +isocorybulbine +isocorydine +isocoumarin +isocracy +isocrat +isocratic +isocreosol +isocrotonic +isocrymal +isocryme +isocrymic +isocyanate +isocyanic +isocyanide +isocyanine +isocyano +isocyanogen +isocyanurate +isocyanuric +isocyclic +isocymene +isocytic +isodactylism +isodactylous +isodiabatic +isodialuric +isodiametric +isodiametrical +isodiazo +isodiazotate +isodimorphic +isodimorphism +isodimorphous +isodomic +isodomous +isodomum +isodont +isodontous +isodrome +isodulcite +isodurene +isodynamia +isodynamic +isodynamical +isoelectric +isoelectrically +isoelectronic +isoelemicin +isoemodin +isoenergetic +isoerucic +Isoetaceae +Isoetales +Isoetes +isoeugenol +isoflavone +isoflor +isogamete +isogametic +isogametism +isogamic +isogamous +isogamy +isogen +isogenesis +isogenetic +isogenic +isogenotype +isogenotypic +isogenous +isogeny +isogeotherm +isogeothermal +isogeothermic +isogloss +isoglossal +isognathism +isognathous +isogon +isogonal +isogonality +isogonally +isogonic +isogoniostat +isogonism +isograft +isogram +isograph +isographic +isographical +isographically +isography +isogynous +isohaline +isohalsine +isohel +isohemopyrrole +isoheptane +isohesperidin +isohexyl +isohydric +isohydrocyanic +isohydrosorbic +isohyet +isohyetal +isoimmune +isoimmunity +isoimmunization +isoimmunize +isoindazole +isoindigotin +isoindole +isoionone +isokeraunic +isokeraunographic +isokeraunophonic +Isokontae +isokontan +isokurtic +isolability +isolable +isolapachol +isolate +isolated +isolatedly +isolating +isolation +isolationism +isolationist +isolative +Isolde +isolecithal +isoleucine +isolichenin +isolinolenic +isologous +isologue +isology +Isoloma +isolysin +isolysis +isomagnetic +isomaltose +isomastigate +isomelamine +isomenthone +isomer +Isomera +isomere +isomeric +isomerical +isomerically +isomeride +isomerism +isomerization +isomerize +isomeromorphism +isomerous +isomery +isometric +isometrical +isometrically +isometrograph +isometropia +isometry +isomorph +isomorphic +isomorphism +isomorphous +Isomyaria +isomyarian +isoneph +isonephelic +isonergic +isonicotinic +isonitramine +isonitrile +isonitroso +isonomic +isonomous +isonomy +isonuclear +isonym +isonymic +isonymy +isooleic +isoosmosis +isopachous +isopag +isoparaffin +isopectic +isopelletierin +isopelletierine +isopentane +isoperimeter +isoperimetric +isoperimetrical +isoperimetry +isopetalous +isophanal +isophane +isophasal +isophene +isophenomenal +isophoria +isophorone +isophthalic +isophthalyl +isophyllous +isophylly +isopicramic +isopiestic +isopiestically +isopilocarpine +isoplere +isopleth +Isopleura +isopleural +isopleuran +isopleurous +isopod +Isopoda +isopodan +isopodiform +isopodimorphous +isopodous +isopogonous +isopolite +isopolitical +isopolity +isopoly +isoprene +isopropenyl +isopropyl +isopropylacetic +isopropylamine +isopsephic +isopsephism +Isoptera +isopterous +isoptic +isopulegone +isopurpurin +isopycnic +isopyre +isopyromucic +isopyrrole +isoquercitrin +isoquinine +isoquinoline +isorcinol +isorhamnose +isorhodeose +isorithm +isorosindone +isorrhythmic +isorropic +isosaccharic +isosaccharin +isoscele +isosceles +isoscope +isoseismal +isoseismic +isoseismical +isoseist +isoserine +isosmotic +Isospondyli +isospondylous +isospore +isosporic +isosporous +isospory +isostasist +isostasy +isostatic +isostatical +isostatically +isostemonous +isostemony +isostere +isosteric +isosterism +isostrychnine +isosuccinic +isosulphide +isosulphocyanate +isosulphocyanic +isosultam +isotac +isoteles +isotely +isotheral +isothere +isotherm +isothermal +isothermally +isothermic +isothermical +isothermobath +isothermobathic +isothermous +isotherombrose +isothiocyanates +isothiocyanic +isothiocyano +isothujone +isotimal +isotome +isotomous +isotonia +isotonic +isotonicity +isotony +isotope +isotopic +isotopism +isotopy +isotrehalose +Isotria +isotrimorphic +isotrimorphism +isotrimorphous +isotron +isotrope +isotropic +isotropism +isotropous +isotropy +isotype +isotypic +isotypical +isovalerate +isovalerianate +isovalerianic +isovaleric +isovalerone +isovaline +isovanillic +isovoluminal +isoxanthine +isoxazine +isoxazole +isoxime +isoxylene +isoyohimbine +isozooid +ispaghul +ispravnik +Israel +Israeli +Israelite +Israeliteship +Israelitic +Israelitish +Israelitism +Israelitize +issanguila +Issedoi +Issedones +issei +issite +issuable +issuably +issuance +issuant +issue +issueless +issuer +issuing +ist +isthmi +Isthmia +isthmial +isthmian +isthmiate +isthmic +isthmoid +isthmus +istiophorid +Istiophoridae +Istiophorus +istle +istoke +Istrian +Istvaeones +isuret +isuretine +Isuridae +isuroid +Isurus +Iswara +it +Ita +itabirite +itacism +itacist +itacistic +itacolumite +itaconate +itaconic +Itala +Itali +Italian +Italianate +Italianately +Italianation +Italianesque +Italianish +Italianism +Italianist +Italianity +Italianization +Italianize +Italianizer +Italianly +Italic +Italical +Italically +Italican +Italicanist +Italici +Italicism +italicization +italicize +italics +Italiote +italite +Italomania +Italon +Italophile +itamalate +itamalic +itatartaric +itatartrate +Itaves +itch +itchiness +itching +itchingly +itchless +itchproof +itchreed +itchweed +itchy +itcze +Itea +Iteaceae +Itelmes +item +iteming +itemization +itemize +itemizer +itemy +Iten +Itenean +iter +iterable +iterance +iterancy +iterant +iterate +iteration +iterative +iteratively +iterativeness +Ithaca +Ithacan +Ithacensian +ithagine +Ithaginis +ither +Ithiel +ithomiid +Ithomiidae +Ithomiinae +ithyphallic +Ithyphallus +ithyphyllous +itineracy +itinerancy +itinerant +itinerantly +itinerarian +Itinerarium +itinerary +itinerate +itineration +itmo +Ito +Itoism +Itoist +Itoland +Itonama +Itonaman +Itonia +itonidid +Itonididae +itoubou +its +itself +Ituraean +iturite +Itylus +Itys +Itza +itzebu +iva +Ivan +ivied +ivin +ivoried +ivorine +ivoriness +ivorist +ivory +ivorylike +ivorytype +ivorywood +ivy +ivybells +ivyberry +ivyflower +ivylike +ivyweed +ivywood +ivywort +iwa +iwaiwa +iwis +Ixia +Ixiaceae +Ixiama +Ixil +Ixion +Ixionian +Ixodes +ixodian +ixodic +ixodid +Ixodidae +Ixora +iyo +Izar +izar +izard +Izcateco +Izchak +Izdubar +izle +izote +iztle +Izumi +izzard +Izzy +J +j +Jaalin +jab +Jabarite +jabbed +jabber +jabberer +jabbering +jabberingly +jabberment +Jabberwock +jabberwockian +Jabberwocky +jabbing +jabbingly +jabble +jabers +jabia +jabiru +jaborandi +jaborine +jabot +jaboticaba +jabul +jacal +Jacaltec +Jacalteca +jacamar +Jacamaralcyon +jacameropine +Jacamerops +jacami +jacamin +Jacana +jacana +Jacanidae +Jacaranda +jacare +jacate +jacchus +jacent +jacinth +jacinthe +Jack +jack +jackal +jackanapes +jackanapish +jackaroo +jackass +jackassery +jackassification +jackassism +jackassness +jackbird +jackbox +jackboy +jackdaw +jackeen +jacker +jacket +jacketed +jacketing +jacketless +jacketwise +jackety +jackfish +jackhammer +jackknife +jackleg +jackman +jacko +jackpudding +jackpuddinghood +jackrod +jacksaw +jackscrew +jackshaft +jackshay +jacksnipe +Jackson +Jacksonia +Jacksonian +Jacksonite +jackstay +jackstone +jackstraw +jacktan +jackweed +jackwood +Jacky +Jackye +Jacob +jacobaea +jacobaean +Jacobean +Jacobian +Jacobic +Jacobin +Jacobinia +Jacobinic +Jacobinical +Jacobinically +Jacobinism +Jacobinization +Jacobinize +Jacobite +Jacobitely +Jacobitiana +Jacobitic +Jacobitical +Jacobitically +Jacobitish +Jacobitishly +Jacobitism +jacobsite +Jacobson +jacobus +jacoby +jaconet +Jacqueminot +Jacques +jactance +jactancy +jactant +jactation +jactitate +jactitation +jacu +jacuaru +jaculate +jaculation +jaculative +jaculator +jaculatorial +jaculatory +jaculiferous +Jacunda +jacutinga +jadder +jade +jaded +jadedly +jadedness +jadeite +jadery +jadesheen +jadeship +jadestone +jadish +jadishly +jadishness +jady +jaeger +jag +Jaga +Jagannath +Jagannatha +jagat +Jagatai +Jagataic +Jagath +jager +jagged +jaggedly +jaggedness +jagger +jaggery +jaggy +jagir +jagirdar +jagla +jagless +jagong +jagrata +jagua +jaguar +jaguarete +Jahve +Jahvist +Jahvistic +jail +jailage +jailbird +jaildom +jailer +jaileress +jailering +jailership +jailhouse +jailish +jailkeeper +jaillike +jailmate +jailward +jailyard +Jaime +Jain +Jaina +Jainism +Jainist +Jaipuri +jajman +Jake +jake +jakes +jako +Jakob +Jakun +Jalalaean +jalap +jalapa +jalapin +jalkar +jalloped +jalopy +jalouse +jalousie +jalousied +jalpaite +Jam +jam +jama +Jamaica +Jamaican +jaman +jamb +jambalaya +jambeau +jambo +jambolan +jambone +jambool +jamboree +Jambos +jambosa +jambstone +jamdani +James +Jamesian +Jamesina +jamesonite +jami +Jamie +jamlike +jammedness +jammer +jammy +Jamnia +jampan +jampani +jamrosade +jamwood +Jan +janapa +janapan +Jane +jane +Janet +jangada +Janghey +jangkar +jangle +jangler +jangly +Janice +janiceps +Janiculan +Janiculum +Janiform +janissary +janitor +janitorial +janitorship +janitress +janitrix +Janizarian +Janizary +jank +janker +jann +jannock +Janos +Jansenism +Jansenist +Jansenistic +Jansenistical +Jansenize +Janthina +Janthinidae +jantu +janua +Januarius +January +Janus +Januslike +jaob +Jap +jap +japaconine +japaconitine +Japan +japan +Japanee +Japanese +Japanesque +Japanesquely +Japanesquery +Japanesy +Japanicize +Japanism +Japanization +Japanize +japanned +Japanner +japanner +japannery +Japannish +Japanolatry +Japanologist +Japanology +Japanophile +Japanophobe +Japanophobia +jape +japer +japery +Japetus +Japheth +Japhetic +Japhetide +Japhetite +japing +japingly +japish +japishly +japishness +Japonic +japonica +Japonically +Japonicize +Japonism +Japonize +Japonizer +Japygidae +japygoid +Japyx +Jaqueline +Jaquesian +jaquima +jar +jara +jaragua +jararaca +jararacussu +jarbird +jarble +jarbot +jardiniere +Jared +jarfly +jarful +jarg +jargon +jargonal +jargoneer +jargonelle +jargoner +jargonesque +jargonic +jargonish +jargonist +jargonistic +jargonium +jargonization +jargonize +jarkman +Jarl +jarl +jarldom +jarless +jarlship +Jarmo +jarnut +jarool +jarosite +jarra +jarrah +jarring +jarringly +jarringness +jarry +jarvey +Jarvis +jasey +jaseyed +Jasione +Jasminaceae +jasmine +jasmined +jasminewood +Jasminum +jasmone +Jason +jaspachate +jaspagate +Jasper +jasper +jasperated +jaspered +jasperize +jasperoid +jaspery +jaspidean +jaspideous +jaspilite +jaspis +jaspoid +jasponyx +jaspopal +jass +jassid +Jassidae +jassoid +Jat +jatamansi +Jateorhiza +jateorhizine +jatha +jati +Jatki +Jatni +jato +Jatropha +jatrophic +jatrorrhizine +Jatulian +jaudie +jauk +jaun +jaunce +jaunder +jaundice +jaundiceroot +jaunt +jauntie +jauntily +jauntiness +jauntingly +jaunty +jaup +Java +Javahai +javali +Javan +Javanee +Javanese +javelin +javelina +javeline +javelineer +javer +Javitero +jaw +jawab +jawbation +jawbone +jawbreaker +jawbreaking +jawbreakingly +jawed +jawfall +jawfallen +jawfish +jawfoot +jawfooted +jawless +jawsmith +jawy +Jay +jay +Jayant +Jayesh +jayhawk +jayhawker +jaypie +jaywalk +jaywalker +jazerant +Jazyges +jazz +jazzer +jazzily +jazziness +jazzy +jealous +jealously +jealousness +jealousy +Jeames +Jean +jean +Jean-Christophe +Jean-Pierre +Jeanette +Jeanie +Jeanne +Jeannette +Jeannie +Jeanpaulia +jeans +Jeany +Jebus +Jebusi +Jebusite +Jebusitic +Jebusitical +Jebusitish +jecoral +jecorin +jecorize +jed +jedcock +jedding +jeddock +jeel +jeep +jeer +jeerer +jeering +jeeringly +jeerproof +jeery +jeewhillijers +jeewhillikens +Jef +Jeff +jeff +jefferisite +Jeffersonia +Jeffersonian +Jeffersonianism +jeffersonite +Jeffery +Jeffie +Jeffrey +Jehovah +Jehovic +Jehovism +Jehovist +Jehovistic +jehu +jehup +jejunal +jejunator +jejune +jejunely +jejuneness +jejunitis +jejunity +jejunoduodenal +jejunoileitis +jejunostomy +jejunotomy +jejunum +jelab +jelerang +jelick +jell +jellica +jellico +jellied +jelliedness +jellification +jellify +jellily +jelloid +jelly +jellydom +jellyfish +jellyleaf +jellylike +Jelske +jelutong +Jem +jemadar +Jemez +Jemima +jemmily +jemminess +Jemmy +jemmy +Jenine +jenkin +jenna +jennerization +jennerize +jennet +jenneting +Jennie +jennier +Jennifer +Jenny +jenny +Jenson +jentacular +jeofail +jeopard +jeoparder +jeopardize +jeopardous +jeopardously +jeopardousness +jeopardy +jequirity +Jerahmeel +Jerahmeelites +Jerald +jerboa +jereed +jeremejevite +jeremiad +Jeremiah +Jeremian +Jeremianic +Jeremias +Jeremy +jerez +jerib +jerk +jerker +jerkily +jerkin +jerkined +jerkiness +jerkingly +jerkish +jerksome +jerkwater +jerky +jerl +jerm +jermonal +Jeroboam +Jerome +Jeromian +Jeronymite +jerque +jerquer +Jerrie +Jerry +jerry +jerryism +Jersey +jersey +Jerseyan +jerseyed +Jerseyite +Jerseyman +jert +Jerusalem +jervia +jervina +jervine +Jesper +Jess +jess +jessakeed +jessamine +jessamy +jessant +Jesse +Jessean +jessed +Jessica +Jessie +jessur +jest +jestbook +jestee +jester +jestful +jesting +jestingly +jestingstock +jestmonger +jestproof +jestwise +jestword +Jesu +Jesuate +Jesuit +Jesuited +Jesuitess +Jesuitic +Jesuitical +Jesuitically +Jesuitish +Jesuitism +Jesuitist +Jesuitize +Jesuitocracy +Jesuitry +Jesus +jet +jetbead +jete +Jethro +Jethronian +jetsam +jettage +jetted +jetter +jettied +jettiness +jettingly +jettison +jetton +jetty +jettyhead +jettywise +jetware +Jew +jewbird +jewbush +Jewdom +jewel +jeweler +jewelhouse +jeweling +jewelless +jewellike +jewelry +jewelsmith +jewelweed +jewely +Jewess +jewfish +Jewhood +Jewish +Jewishly +Jewishness +Jewism +Jewless +Jewlike +Jewling +Jewry +Jewship +Jewstone +Jewy +jezail +Jezebel +Jezebelian +Jezebelish +jezekite +jeziah +Jezreelite +jharal +jheel +jhool +jhow +Jhuria +Ji +Jianyun +jib +jibbah +jibber +jibbings +jibby +jibe +jibhead +jibi +jibman +jiboa +jibstay +jicama +Jicaque +Jicaquean +jicara +Jicarilla +jiff +jiffle +jiffy +jig +jigamaree +jigger +jiggerer +jiggerman +jiggers +jigget +jiggety +jigginess +jiggish +jiggle +jiggly +jiggumbob +jiggy +jiglike +jigman +jihad +jikungu +Jill +jillet +jillflirt +jilt +jiltee +jilter +jiltish +Jim +jimbang +jimberjaw +jimberjawed +jimjam +Jimmy +jimmy +jimp +jimply +jimpness +jimpricute +jimsedge +Jin +jina +jincamas +Jincan +Jinchao +jing +jingal +Jingbai +jingbang +jingle +jingled +jinglejangle +jingler +jinglet +jingling +jinglingly +jingly +jingo +jingodom +jingoish +jingoism +jingoist +jingoistic +jinja +jinjili +jink +jinker +jinket +jinkle +jinks +jinn +jinnestan +jinni +jinniwink +jinniyeh +Jinny +jinny +jinriki +jinrikiman +jinrikisha +jinshang +jinx +jipijapa +jipper +jiqui +jirble +jirga +Jiri +jirkinet +Jisheng +Jitendra +jiti +jitneur +jitneuse +jitney +jitneyman +jitro +jitter +jitterbug +jitters +jittery +jiva +Jivaran +Jivaro +Jivaroan +jive +jixie +Jo +jo +Joachim +Joachimite +Joan +Joanna +Joanne +Joannite +joaquinite +Job +job +jobade +jobarbe +jobation +jobber +jobbernowl +jobbernowlism +jobbery +jobbet +jobbing +jobbish +jobble +jobholder +jobless +joblessness +jobman +jobmaster +jobmistress +jobmonger +jobo +jobsmith +Jocasta +Jocelin +Joceline +Jocelyn +joch +Jochen +Jock +jock +jocker +jockey +jockeydom +jockeyish +jockeyism +jockeylike +jockeyship +jocko +jockteleg +jocoque +jocose +jocosely +jocoseness +jocoseriosity +jocoserious +jocosity +jocote +jocu +jocular +jocularity +jocularly +jocularness +joculator +jocum +jocuma +jocund +jocundity +jocundly +jocundness +jodel +jodelr +jodhpurs +Jodo +Joe +joe +joebush +Joel +joewood +Joey +joey +jog +jogger +joggle +joggler +jogglety +jogglework +joggly +jogtrottism +Johan +Johann +Johanna +Johannean +Johannes +johannes +Johannine +Johannisberger +Johannist +Johannite +johannite +John +Johnadreams +Johnathan +Johnian +johnin +Johnnie +Johnny +johnnycake +johnnydom +Johnsmas +Johnsonese +Johnsonian +Johnsoniana +Johnsonianism +Johnsonianly +Johnsonism +johnstrupite +join +joinable +joinant +joinder +joiner +joinery +joining +joiningly +joint +jointage +jointed +jointedly +jointedness +jointer +jointing +jointist +jointless +jointly +jointress +jointure +jointureless +jointuress +jointweed +jointworm +jointy +joist +joisting +joistless +jojoba +joke +jokeless +jokelet +jokeproof +joker +jokesmith +jokesome +jokesomeness +jokester +jokingly +jokish +jokist +jokul +joky +joll +jolleyman +jollier +jollification +jollify +jollily +jolliness +jollity +jollop +jolloped +jolly +jollytail +Joloano +jolt +jolter +jolterhead +jolterheaded +jolterheadedness +jolthead +joltiness +jolting +joltingly +joltless +joltproof +jolty +Jon +Jonah +Jonahesque +Jonahism +Jonas +Jonathan +Jonathanization +Jones +Jonesian +Jong +jonglery +jongleur +Joni +jonque +jonquil +jonquille +Jonsonian +Jonval +jonvalization +jonvalize +jookerie +joola +joom +Joon +Jophiel +Jordan +jordan +Jordanian +jordanite +joree +Jorge +Jorist +jorum +Jos +Jose +josefite +joseite +Joseph +Josepha +Josephine +Josephinism +josephinite +Josephism +Josephite +Josh +josh +josher +joshi +Joshua +Josiah +josie +Josip +joskin +joss +jossakeed +josser +jostle +jostlement +jostler +jot +jota +jotation +jotisi +Jotnian +jotter +jotting +jotty +joubarb +Joubert +joug +jough +jouk +joukerypawkery +joule +joulean +joulemeter +jounce +journal +journalese +journalish +journalism +journalist +journalistic +journalistically +journalization +journalize +journalizer +journey +journeycake +journeyer +journeying +journeyman +journeywoman +journeywork +journeyworker +jours +joust +jouster +Jova +Jove +Jovial +jovial +jovialist +jovialistic +joviality +jovialize +jovially +jovialness +jovialty +Jovian +Jovianly +Jovicentric +Jovicentrical +Jovicentrically +jovilabe +Joviniamish +Jovinian +Jovinianist +Jovite +jow +jowar +jowari +jowel +jower +jowery +jowl +jowler +jowlish +jowlop +jowly +jowpy +jowser +jowter +joy +joyance +joyancy +joyant +Joyce +joyful +joyfully +joyfulness +joyhop +joyleaf +joyless +joylessly +joylessness +joylet +joyous +joyously +joyousness +joyproof +joysome +joyweed +Jozy +Ju +Juan +Juang +juba +jubate +jubbah +jubbe +jube +juberous +jubilance +jubilancy +jubilant +jubilantly +jubilarian +jubilate +jubilatio +jubilation +jubilatory +jubilean +jubilee +jubilist +jubilization +jubilize +jubilus +juck +juckies +Jucuna +jucundity +jud +Judaeomancy +Judaeophile +Judaeophilism +Judaeophobe +Judaeophobia +Judah +Judahite +Judaic +Judaica +Judaical +Judaically +Judaism +Judaist +Judaistic +Judaistically +Judaization +Judaize +Judaizer +Judas +Judaslike +judcock +Jude +Judean +judex +Judge +judge +judgeable +judgelike +judger +judgeship +judgingly +judgmatic +judgmatical +judgmatically +judgment +Judica +judicable +judicate +judication +judicative +judicator +judicatorial +judicatory +judicature +judices +judiciable +judicial +judiciality +judicialize +judicially +judicialness +judiciarily +judiciary +judicious +judiciously +judiciousness +Judith +judo +Judophobism +Judy +Juergen +jufti +jug +Juga +jugal +jugale +Jugatae +jugate +jugated +jugation +juger +jugerum +jugful +jugger +Juggernaut +juggernaut +Juggernautish +juggins +juggle +jugglement +juggler +jugglery +juggling +jugglingly +Juglandaceae +juglandaceous +Juglandales +juglandin +Juglans +juglone +jugular +Jugulares +jugulary +jugulate +jugulum +jugum +Jugurthine +Juha +juice +juiceful +juiceless +juicily +juiciness +juicy +jujitsu +juju +jujube +jujuism +jujuist +juke +jukebox +Jule +julep +Jules +Juletta +Julia +Julian +Juliana +Juliane +Julianist +Julianto +julid +Julidae +julidan +Julie +Julien +julienite +julienne +Juliet +Julietta +julio +Julius +juloid +Juloidea +juloidian +julole +julolidin +julolidine +julolin +juloline +Julus +July +Julyflower +Jumada +Jumana +jumart +jumba +jumble +jumblement +jumbler +jumblingly +jumbly +jumbo +jumboesque +jumboism +jumbuck +jumby +jumelle +jument +jumentous +jumfru +jumillite +jumma +jump +jumpable +jumper +jumperism +jumpiness +jumpingly +jumpness +jumprock +jumpseed +jumpsome +jumpy +Jun +Juncaceae +juncaceous +Juncaginaceae +juncaginaceous +juncagineous +junciform +juncite +Junco +Juncoides +juncous +junction +junctional +junctive +juncture +Juncus +June +june +Juneberry +Junebud +junectomy +Juneflower +Jungermannia +Jungermanniaceae +jungermanniaceous +Jungermanniales +jungle +jungled +jungleside +junglewards +junglewood +jungli +jungly +juniata +junior +juniorate +juniority +juniorship +juniper +Juniperaceae +Juniperus +Junius +junk +junkboard +Junker +junker +Junkerdom +junkerdom +junkerish +Junkerism +junkerism +junket +junketer +junketing +junking +junkman +Juno +Junoesque +Junonia +Junonian +junt +junta +junto +jupati +jupe +Jupiter +jupon +Jur +Jura +jural +jurally +jurament +juramentado +juramental +juramentally +juramentum +Jurane +jurant +jurara +Jurassic +jurat +juration +jurative +jurator +juratorial +juratory +jure +jurel +Jurevis +Juri +juridic +juridical +juridically +juring +jurisconsult +jurisdiction +jurisdictional +jurisdictionalism +jurisdictionally +jurisdictive +jurisprudence +jurisprudent +jurisprudential +jurisprudentialist +jurisprudentially +jurist +juristic +juristical +juristically +juror +jurupaite +jury +juryless +juryman +jurywoman +jusquaboutisme +jusquaboutist +jussel +Jussi +Jussiaea +Jussiaean +Jussieuan +jussion +jussive +jussory +just +justen +justice +justicehood +justiceless +justicelike +justicer +justiceship +justiceweed +Justicia +justiciability +justiciable +justicial +justiciar +justiciarship +justiciary +justiciaryship +justicies +justifiability +justifiable +justifiableness +justifiably +justification +justificative +justificator +justificatory +justifier +justify +justifying +justifyingly +Justin +Justina +Justine +Justinian +Justinianian +Justinianist +justly +justment +justness +justo +Justus +jut +Jute +jute +Jutic +Jutish +jutka +Jutlander +Jutlandish +jutting +juttingly +jutty +Juturna +Juvavian +juvenal +Juvenalian +juvenate +juvenescence +juvenescent +juvenile +juvenilely +juvenileness +juvenilify +juvenilism +juvenility +juvenilize +Juventas +juventude +Juverna +juvia +juvite +juxtalittoral +juxtamarine +juxtapose +juxtaposit +juxtaposition +juxtapositional +juxtapositive +juxtapyloric +juxtaspinal +juxtaterrestrial +juxtatropical +Juyas +Juza +Jwahar +Jynginae +jyngine +Jynx +jynx +K +k +ka +Kababish +Kabaka +kabaragoya +Kabard +Kabardian +kabaya +Kabbeljaws +kabel +kaberu +kabiet +Kabirpanthi +Kabistan +Kabonga +kabuki +Kabuli +Kabyle +Kachari +Kachin +kachin +Kadaga +Kadarite +kadaya +Kadayan +Kaddish +kadein +kadikane +kadischi +Kadmi +kados +Kadu +kaempferol +Kaf +Kafa +kaferita +Kaffir +kaffir +kaffiyeh +Kaffraria +Kaffrarian +Kafir +kafir +Kafiri +kafirin +kafiz +Kafka +Kafkaesque +kafta +kago +kagu +kaha +kahar +kahau +kahikatea +kahili +kahu +kahuna +kai +Kaibab +Kaibartha +kaid +kaik +kaikara +kaikawaka +kail +kailyard +kailyarder +kailyardism +Kaimo +Kainah +kainga +kainite +kainsi +kainyn +kairine +kairoline +kaiser +kaiserdom +kaiserism +kaisership +kaitaka +Kaithi +kaiwhiria +kaiwi +Kaj +Kajar +kajawah +kajugaru +kaka +Kakan +kakapo +kakar +kakarali +kakariki +Kakatoe +Kakatoidae +kakawahie +kaki +kakidrosis +kakistocracy +kakkak +kakke +kakortokite +kala +kaladana +kalamalo +kalamansanai +Kalamian +Kalanchoe +Kalandariyah +Kalang +Kalapooian +kalashnikov +kalasie +Kaldani +kale +kaleidophon +kaleidophone +kaleidoscope +kaleidoscopic +kaleidoscopical +kaleidoscopically +Kalekah +kalema +Kalendae +kalends +kalewife +kaleyard +kali +kalian +Kaliana +kaliborite +kalidium +kaliform +kaligenous +Kalinga +kalinite +kaliophilite +kalipaya +Kalispel +kalium +kallah +kallege +kallilite +Kallima +kallitype +Kalmarian +Kalmia +Kalmuck +kalo +kalogeros +kalokagathia +kalon +kalong +kalpis +kalsomine +kalsominer +kalumpang +kalumpit +Kalwar +kalymmaukion +kalymmocyte +kamachile +kamacite +kamahi +kamala +kamaloka +kamansi +kamao +Kamares +kamarezite +kamarupa +kamarupic +kamas +Kamasin +Kamass +kamassi +Kamba +kambal +kamboh +Kamchadal +Kamchatkan +kame +kameeldoorn +kameelthorn +Kamel +kamelaukion +kamerad +kamias +kamichi +kamik +kamikaze +Kamiya +kammalan +kammererite +kamperite +kampong +kamptomorph +kan +kana +kanae +kanagi +Kanaka +kanap +kanara +Kanarese +kanari +kanat +Kanauji +Kanawari +Kanawha +kanchil +kande +Kandelia +kandol +kaneh +kanephore +kanephoros +Kaneshite +Kanesian +kang +kanga +kangani +kangaroo +kangarooer +Kangli +Kanji +Kankanai +kankie +kannume +kanoon +Kanred +kans +Kansa +Kansan +kantele +kanteletar +kanten +Kanthan +Kantian +Kantianism +Kantism +Kantist +Kanuri +Kanwar +kaoliang +kaolin +kaolinate +kaolinic +kaolinite +kaolinization +kaolinize +kapa +kapai +kapeika +kapok +kapp +kappa +kappe +kappland +kapur +kaput +Karabagh +karagan +Karaism +Karaite +Karaitism +karaka +Karakatchan +Karakul +karakul +Karamojo +karamu +karaoke +Karatas +karate +Karaya +karaya +karbi +karch +kareao +kareeta +Karel +karela +Karelian +Karen +Karharbari +Kari +karite +Karl +Karling +Karluk +karma +Karmathian +karmic +karmouth +karo +kaross +karou +karree +karri +Karroo +karroo +karrusel +karsha +Karshuni +Karst +karst +karstenite +karstic +kartel +Karthli +kartometer +kartos +Kartvel +Kartvelian +karwar +Karwinskia +karyaster +karyenchyma +karyochrome +karyochylema +karyogamic +karyogamy +karyokinesis +karyokinetic +karyologic +karyological +karyologically +karyology +karyolymph +Karyolysidae +karyolysis +Karyolysus +karyolytic +karyomere +karyomerite +karyomicrosome +karyomitoic +karyomitome +karyomiton +karyomitosis +karyomitotic +karyon +karyoplasm +karyoplasma +karyoplasmatic +karyoplasmic +karyopyknosis +karyorrhexis +karyoschisis +karyosome +karyotin +karyotype +kasa +kasbah +kasbeke +kascamiol +Kasha +Kashan +kasher +kashga +kashi +kashima +Kashmiri +Kashmirian +Kashoubish +kashruth +Kashube +Kashubian +Kashyapa +kasida +Kasikumuk +Kaska +Kaskaskia +kasm +kasolite +kassabah +Kassak +Kassite +kassu +kastura +Kasubian +kat +Katabanian +katabasis +katabatic +katabella +katabolic +katabolically +katabolism +katabolite +katabolize +katabothron +katachromasis +katacrotic +katacrotism +katagenesis +katagenetic +katakana +katakinesis +katakinetic +katakinetomer +katakinetomeric +katakiribori +katalase +katalysis +katalyst +katalytic +katalyze +katamorphism +kataphoresis +kataphoretic +kataphoric +kataphrenia +kataplasia +kataplectic +kataplexy +katar +katastate +katastatic +katathermometer +katatonia +katatonic +katatype +katchung +katcina +Kate +kath +Katha +katha +kathal +Katharina +Katharine +katharometer +katharsis +kathartic +kathemoglobin +kathenotheism +Kathleen +kathodic +Kathopanishad +Kathryn +Kathy +Katie +Katik +Katinka +katipo +Katipunan +Katipuneros +katmon +katogle +Katrine +Katrinka +katsup +Katsuwonidae +katuka +Katukina +katun +katurai +Katy +katydid +Kauravas +kauri +kava +kavaic +kavass +Kavi +Kaw +kawaka +Kawchodinne +kawika +Kay +kay +kayak +kayaker +Kayan +Kayasth +Kayastha +kayles +kayo +Kayvan +Kazak +kazi +kazoo +Kazuhiro +kea +keach +keacorn +Keatsian +keawe +keb +kebab +kebbie +kebbuck +kechel +keck +keckle +keckling +kecksy +kecky +ked +Kedar +Kedarite +keddah +kedge +kedger +kedgeree +kedlock +Kedushshah +Kee +keech +keek +keeker +keel +keelage +keelbill +keelblock +keelboat +keelboatman +keeled +keeler +keelfat +keelhale +keelhaul +keelie +keeling +keelivine +keelless +keelman +keelrake +keelson +keen +keena +keened +keener +keenly +keenness +keep +keepable +keeper +keeperess +keepering +keeperless +keepership +keeping +keepsake +keepsaky +keepworthy +keerogue +Kees +keeshond +keest +keet +keeve +Keewatin +kef +keffel +kefir +kefiric +Kefti +Keftian +Keftiu +keg +kegler +kehaya +kehillah +kehoeite +Keid +keilhauite +keita +Keith +keitloa +Kekchi +kekotene +kekuna +kelchin +keld +Kele +kele +kelebe +kelectome +keleh +kelek +kelep +Kelima +kelk +kell +kella +kellion +kellupweed +Kelly +kelly +keloid +keloidal +kelp +kelper +kelpfish +kelpie +kelpware +kelpwort +kelpy +kelt +kelter +Keltoi +kelty +Kelvin +kelvin +kelyphite +Kemal +Kemalism +Kemalist +kemb +kemp +kemperyman +kempite +kemple +kempster +kempt +kempy +Ken +ken +kenaf +Kenai +kenareh +kench +kend +kendir +kendyr +Kenelm +Kenipsim +kenlore +kenmark +Kenn +Kennebec +kennebecker +kennebunker +Kennedya +kennel +kennelly +kennelman +kenner +Kenneth +kenning +kenningwort +kenno +keno +kenogenesis +kenogenetic +kenogenetically +kenogeny +kenosis +kenotic +kenoticism +kenoticist +kenotism +kenotist +kenotoxin +kenotron +Kenseikai +kensington +Kensitite +kenspac +kenspeck +kenspeckle +Kent +kent +kentallenite +Kentia +Kenticism +Kentish +Kentishman +kentledge +Kenton +kentrogon +kentrolite +Kentuckian +Kentucky +kenyte +kep +kepi +Keplerian +kept +Ker +keracele +keralite +kerana +keraphyllocele +keraphyllous +kerasin +kerasine +kerat +keratalgia +keratectasia +keratectomy +Keraterpeton +keratin +keratinization +keratinize +keratinoid +keratinose +keratinous +keratitis +keratoangioma +keratocele +keratocentesis +keratoconjunctivitis +keratoconus +keratocricoid +keratode +keratodermia +keratogenic +keratogenous +keratoglobus +keratoglossus +keratohelcosis +keratohyal +keratoid +Keratoidea +keratoiritis +Keratol +keratoleukoma +keratolysis +keratolytic +keratoma +keratomalacia +keratome +keratometer +keratometry +keratomycosis +keratoncus +keratonosus +keratonyxis +keratophyre +keratoplastic +keratoplasty +keratorrhexis +keratoscope +keratoscopy +keratose +keratosis +keratotome +keratotomy +keratto +keraulophon +keraulophone +Keraunia +keraunion +keraunograph +keraunographic +keraunography +keraunophone +keraunophonic +keraunoscopia +keraunoscopy +kerbstone +kerchief +kerchiefed +kerchoo +kerchug +kerchunk +kerectomy +kerel +Keres +Keresan +Kerewa +kerf +kerflap +kerflop +kerflummox +Kerite +Kermanji +Kermanshah +kermes +kermesic +kermesite +kermis +kern +kernel +kerneled +kernelless +kernelly +kerner +kernetty +kernish +kernite +kernos +kerogen +kerosene +kerplunk +Kerri +Kerria +kerrie +kerrikerri +kerril +kerrite +Kerry +kerry +kersantite +kersey +kerseymere +kerslam +kerslosh +kersmash +kerugma +kerwham +kerygma +kerygmatic +kerykeion +kerystic +kerystics +Keryx +kesslerman +kestrel +ket +keta +ketal +ketapang +ketazine +ketch +ketchcraft +ketchup +ketembilla +keten +ketene +ketimide +ketimine +ketipate +ketipic +keto +ketogen +ketogenesis +ketogenic +ketoheptose +ketohexose +ketoketene +ketol +ketole +ketolysis +ketolytic +ketone +ketonemia +ketonic +ketonimid +ketonimide +ketonimin +ketonimine +ketonization +ketonize +ketonuria +ketose +ketoside +ketosis +ketosuccinic +ketoxime +kette +ketting +kettle +kettlecase +kettledrum +kettledrummer +kettleful +kettlemaker +kettlemaking +kettler +ketty +Ketu +ketuba +ketupa +ketyl +keup +Keuper +keurboom +kevalin +Kevan +kevel +kevelhead +Kevin +kevutzah +Kevyn +Keweenawan +keweenawite +kewpie +kex +kexy +key +keyage +keyboard +keyed +keyhole +keyless +keylet +keylock +Keynesian +Keynesianism +keynote +keynoter +keyseater +keyserlick +keysmith +keystone +keystoned +Keystoner +keyway +Kha +khaddar +khadi +khagiarite +khahoon +khaiki +khair +khaja +khajur +khakanship +khaki +khakied +Khaldian +khalifa +Khalifat +Khalkha +khalsa +Khami +khamsin +Khamti +khan +khanate +khanda +khandait +khanjar +khanjee +khankah +khansamah +khanum +khar +kharaj +Kharia +Kharijite +Kharoshthi +kharouba +kharroubah +Khartoumer +kharua +Kharwar +Khasa +Khasi +khass +khat +khatib +khatri +Khatti +Khattish +Khaya +Khazar +Khazarian +khediva +khedival +khedivate +khedive +khediviah +khedivial +khediviate +khepesh +Kherwari +Kherwarian +khet +Khevzur +khidmatgar +Khila +khilat +khir +khirka +Khitan +Khivan +Khlysti +Khmer +Khoja +khoja +khoka +Khokani +Khond +Khorassan +khot +Khotan +Khotana +Khowar +khu +Khuai +khubber +khula +khuskhus +Khussak +khutbah +khutuktu +Khuzi +khvat +Khwarazmian +kiack +kiaki +kialee +kiang +Kiangan +kiaugh +kibber +kibble +kibbler +kibblerman +kibe +kibei +kibitka +kibitz +kibitzer +kiblah +kibosh +kiby +kick +kickable +Kickapoo +kickback +kickee +kicker +kicking +kickish +kickless +kickoff +kickout +kickseys +kickshaw +kickup +Kidder +kidder +Kidderminster +kiddier +kiddish +kiddush +kiddushin +kiddy +kidhood +kidlet +kidling +kidnap +kidnapee +kidnaper +kidney +kidneyroot +kidneywort +Kids +kidskin +kidsman +kiefekil +Kieffer +kiekie +kiel +kier +Kieran +kieselguhr +kieserite +kiestless +kieye +Kiho +kikar +Kikatsik +kikawaeo +kike +Kiki +kiki +Kikki +Kikongo +kiku +kikuel +kikumon +Kikuyu +kil +kiladja +kilah +kilampere +kilan +kilbrickenite +kildee +kilderkin +kileh +kilerg +kiley +Kilhamite +kilhig +kiliare +kilim +kill +killable +killadar +Killarney +killas +killcalf +killcrop +killcu +killdeer +killeekillee +killeen +killer +killick +killifish +killing +killingly +killingness +killinite +killogie +killweed +killwort +killy +Kilmarnock +kiln +kilneye +kilnhole +kilnman +kilnrib +kilo +kiloampere +kilobar +kilocalorie +kilocycle +kilodyne +kilogauss +kilogram +kilojoule +kiloliter +kilolumen +kilometer +kilometrage +kilometric +kilometrical +kiloparsec +kilostere +kiloton +kilovar +kilovolt +kilowatt +kilp +kilt +kilter +kiltie +kilting +Kiluba +Kim +kim +kimbang +kimberlin +kimberlite +Kimberly +Kimbundu +Kimeridgian +kimigayo +Kimmo +kimnel +kimono +kimonoed +kin +kina +kinaesthesia +kinaesthesis +kinah +kinase +kinbote +Kinch +kinch +kinchin +kinchinmort +kincob +kind +kindergarten +kindergartener +kindergartening +kindergartner +Kinderhook +kindheart +kindhearted +kindheartedly +kindheartedness +kindle +kindler +kindlesome +kindlily +kindliness +kindling +kindly +kindness +kindred +kindredless +kindredly +kindredness +kindredship +kinematic +kinematical +kinematically +kinematics +kinematograph +kinemometer +kineplasty +kinepox +kinesalgia +kinescope +kinesiatric +kinesiatrics +kinesic +kinesics +kinesimeter +kinesiologic +kinesiological +kinesiology +kinesiometer +kinesis +kinesitherapy +kinesodic +kinesthesia +kinesthesis +kinesthetic +kinetic +kinetical +kinetically +kinetics +kinetochore +kinetogenesis +kinetogenetic +kinetogenetically +kinetogenic +kinetogram +kinetograph +kinetographer +kinetographic +kinetography +kinetomer +kinetomeric +kinetonema +kinetonucleus +kinetophone +kinetophonograph +kinetoplast +kinetoscope +kinetoscopic +King +king +kingbird +kingbolt +kingcob +kingcraft +kingcup +kingdom +kingdomed +kingdomful +kingdomless +kingdomship +kingfish +kingfisher +kinghead +kinghood +kinghunter +kingless +kinglessness +kinglet +kinglihood +kinglike +kinglily +kingliness +kingling +kingly +kingmaker +kingmaking +kingpiece +kingpin +kingrow +kingship +kingsman +Kingu +kingweed +kingwood +Kinipetu +kink +kinkable +kinkaider +kinkajou +kinkcough +kinkhab +kinkhost +kinkily +kinkiness +kinkle +kinkled +kinkly +kinksbush +kinky +kinless +kinnikinnick +kino +kinofluous +kinology +kinoplasm +kinoplasmic +Kinorhyncha +kinospore +Kinosternidae +Kinosternon +kinotannic +kinsfolk +kinship +kinsman +kinsmanly +kinsmanship +kinspeople +kinswoman +kintar +Kintyre +kioea +Kioko +kiosk +kiotome +Kiowa +Kiowan +Kioway +kip +kipage +Kipchak +kipe +Kiplingese +Kiplingism +kippeen +kipper +kipperer +kippy +kipsey +kipskin +Kiranti +Kirghiz +Kirghizean +kiri +Kirillitsa +kirimon +Kirk +kirk +kirker +kirkify +kirking +kirkinhead +kirklike +kirkman +kirktown +kirkward +kirkyard +Kirman +kirmew +kirn +kirombo +kirsch +Kirsten +Kirsty +kirtle +kirtled +Kirundi +kirve +kirver +kischen +kish +Kishambala +kishen +kishon +kishy +kiskatom +Kislev +kismet +kismetic +kisra +kiss +kissability +kissable +kissableness +kissage +kissar +kisser +kissing +kissingly +kissproof +kisswise +kissy +kist +kistful +kiswa +Kiswahili +Kit +kit +kitab +kitabis +Kitalpha +Kitamat +Kitan +kitar +kitcat +kitchen +kitchendom +kitchener +kitchenette +kitchenful +kitchenless +kitchenmaid +kitchenman +kitchenry +kitchenward +kitchenwards +kitchenware +kitchenwife +kitcheny +kite +kiteflier +kiteflying +kith +kithe +kithless +kitish +Kitkahaxki +Kitkehahki +kitling +Kitlope +Kittatinny +kittel +kitten +kittendom +kittenhearted +kittenhood +kittenish +kittenishly +kittenishness +kittenless +kittenship +kitter +kittereen +kitthoge +kittiwake +kittle +kittlepins +kittles +kittlish +kittly +kittock +kittul +Kitty +kitty +kittysol +Kitunahan +kiva +kiver +kivikivi +kivu +Kiwai +Kiwanian +Kiwanis +kiwi +kiwikiwi +kiyas +kiyi +Kizil +Kizilbash +Kjeldahl +kjeldahlization +kjeldahlize +klafter +klaftern +klam +Klamath +Klan +Klanism +Klansman +Klanswoman +klaprotholite +Klaskino +Klaudia +Klaus +klavern +Klaxon +klaxon +Klebsiella +kleeneboc +Kleinian +Kleistian +klendusic +klendusity +klendusive +klepht +klephtic +klephtism +kleptic +kleptistic +kleptomania +kleptomaniac +kleptomanist +kleptophobia +klicket +Klikitat +Kling +Klingsor +klip +klipbok +klipdachs +klipdas +klipfish +klippe +klippen +klipspringer +klister +klockmannite +klom +Klondike +Klondiker +klootchman +klop +klops +klosh +Kluxer +klystron +kmet +knab +knabble +knack +knackebrod +knacker +knackery +knacky +knag +knagged +knaggy +knap +knapbottle +knape +knappan +Knapper +knapper +knappish +knappishly +knapsack +knapsacked +knapsacking +knapweed +knar +knark +knarred +knarry +Knautia +knave +knavery +knaveship +knavess +knavish +knavishly +knavishness +knawel +knead +kneadability +kneadable +kneader +kneading +kneadingly +knebelite +knee +kneebrush +kneecap +kneed +kneehole +kneel +kneeler +kneelet +kneeling +kneelingly +kneepad +kneepan +kneepiece +kneestone +Kneiffia +Kneippism +knell +knelt +Knesset +knet +knew +knez +knezi +kniaz +kniazi +knick +knicker +Knickerbocker +knickerbockered +knickerbockers +knickered +knickers +knickknack +knickknackatory +knickknacked +knickknackery +knickknacket +knickknackish +knickknacky +knickpoint +knife +knifeboard +knifeful +knifeless +knifelike +knifeman +knifeproof +knifer +knifesmith +knifeway +knight +knightage +knightess +knighthead +knighthood +Knightia +knightless +knightlihood +knightlike +knightliness +knightling +knightly +knightship +knightswort +Kniphofia +Knisteneaux +knit +knitback +knitch +knitted +knitter +knitting +knittle +knitwear +knitweed +knitwork +knived +knivey +knob +knobbed +knobber +knobbiness +knobble +knobbler +knobbly +knobby +knobkerrie +knoblike +knobstick +knobstone +knobular +knobweed +knobwood +knock +knockabout +knockdown +knockemdown +knocker +knocking +knockless +knockoff +knockout +knockstone +knockup +knoll +knoller +knolly +knop +knopite +knopped +knopper +knoppy +knopweed +knorhaan +Knorria +knosp +knosped +Knossian +knot +knotberry +knotgrass +knothole +knothorn +knotless +knotlike +knotroot +knotted +knotter +knottily +knottiness +knotting +knotty +knotweed +knotwork +knotwort +knout +know +knowability +knowable +knowableness +knowe +knower +knowing +knowingly +knowingness +knowledge +knowledgeable +knowledgeableness +knowledgeably +knowledged +knowledgeless +knowledgement +knowledging +known +knowperts +Knoxian +Knoxville +knoxvillite +knub +knubbly +knubby +knublet +knuckle +knucklebone +knuckled +knuckler +knuckling +knuckly +knuclesome +Knudsen +knur +knurl +knurled +knurling +knurly +Knut +knut +Knute +knutty +knyaz +knyazi +Ko +ko +koa +koae +koala +koali +Koasati +kob +koban +kobellite +kobi +kobird +kobold +kobong +kobu +Kobus +Koch +Kochab +Kochia +kochliarion +koda +Kodagu +Kodak +kodak +kodaker +kodakist +kodakry +Kodashim +kodro +kodurite +Koeberlinia +Koeberliniaceae +koeberliniaceous +koechlinite +Koeksotenok +koel +Koellia +Koelreuteria +koenenite +Koeri +koff +koft +koftgar +koftgari +koggelmannetje +Kogia +Kohathite +Koheleth +kohemp +Kohen +Kohistani +Kohl +kohl +Kohlan +kohlrabi +kohua +koi +Koiari +Koibal +koil +koila +koilanaglyphic +koilon +koimesis +Koine +koine +koinon +koinonia +Koipato +Koitapu +kojang +Kojiki +kokako +kokam +kokan +kokerboom +kokil +kokio +koklas +koklass +Koko +koko +kokoon +Kokoona +kokoromiko +kokowai +kokra +koksaghyz +koku +kokum +kokumin +kokumingun +Kol +kola +kolach +Kolarian +Koldaji +kolea +koleroga +kolhoz +Koli +kolinski +kolinsky +Kolis +kolkhos +kolkhoz +Kolkka +kollast +kollaster +koller +kollergang +kolo +kolobion +kolobus +kolokolo +kolsun +koltunna +koltunnor +Koluschan +Kolush +Komati +komatik +kombu +Kome +Komi +kominuter +kommetje +kommos +komondor +kompeni +Komsomol +kon +kona +konak +Konariot +Konde +Kongo +Kongoese +Kongolese +kongoni +kongsbergite +kongu +Konia +Koniaga +Koniga +konimeter +koninckite +konini +koniology +koniscope +konjak +Konkani +Konomihu +Konrad +konstantin +Konstantinos +kontakion +Konyak +kooka +kookaburra +kookeree +kookery +kookri +koolah +kooletah +kooliman +koolokamba +Koolooly +koombar +koomkie +Koorg +kootcha +Kootenay +kop +Kopagmiut +kopeck +koph +kopi +koppa +koppen +koppite +Koprino +kor +Kora +kora +koradji +Korah +Korahite +Korahitic +korait +korakan +Koran +Korana +Koranic +Koranist +korari +Kore +kore +Korean +korec +koreci +Koreish +Koreishite +korero +Koreshan +Koreshanity +kori +korimako +korin +Kornephorus +kornerupine +kornskeppa +kornskeppur +korntonde +korntonder +korntunna +korntunnur +Koroa +koromika +koromiko +korona +korova +korrel +korrigum +korumburra +koruna +Korwa +Kory +Koryak +korymboi +korymbos +korzec +kos +Kosalan +Koschei +kosher +Kosimo +kosin +kosmokrator +Koso +kosong +kosotoxin +Kossaean +Kossean +Kosteletzkya +koswite +Kota +kotal +Kotar +koto +Kotoko +kotschubeite +kottigite +kotuku +kotukutuku +kotwal +kotwalee +kotyle +kotylos +kou +koulan +Koungmiut +kouza +kovil +Kowagmiut +kowhai +kowtow +koyan +kozo +Kpuesi +Kra +kra +kraal +kraft +Krag +kragerite +krageroite +krait +kraken +krakowiak +kral +Krama +krama +Krameria +Krameriaceae +krameriaceous +kran +krantzite +Krapina +kras +krasis +kratogen +kratogenic +Kraunhia +kraurite +kraurosis +kraurotic +krausen +krausite +kraut +kreis +Kreistag +kreistle +kreittonite +krelos +kremersite +kremlin +krems +kreng +krennerite +Krepi +kreplech +kreutzer +kriegspiel +krieker +Krigia +krimmer +krina +Kriophoros +Kris +Krishna +Krishnaism +Krishnaist +Krishnaite +Krishnaitic +Kristen +Kristi +Kristian +Kristin +Kristinaux +krisuvigite +kritarchy +Krithia +Kriton +kritrima +krobyloi +krobylos +krocket +krohnkite +krome +kromeski +kromogram +kromskop +krona +krone +kronen +kroner +Kronion +kronor +kronur +Kroo +kroon +krosa +krouchka +kroushka +Kru +Krugerism +Krugerite +Kruman +krummhorn +kryokonite +krypsis +kryptic +krypticism +kryptocyanine +kryptol +kryptomere +krypton +Krzysztof +Kshatriya +Kshatriyahood +Kua +Kuan +kuan +Kuar +Kuba +kuba +Kubachi +Kubanka +kubba +Kubera +kubuklion +Kuchean +kuchen +kudize +kudos +Kudrun +kudu +kudzu +Kuehneola +kuei +Kufic +kuge +kugel +Kuhnia +Kui +kuichua +Kuki +kukoline +kukri +kuku +kukui +Kukulcan +kukupa +Kukuruku +kula +kulack +Kulah +kulah +kulaite +kulak +kulakism +Kulanapan +kulang +Kuldip +Kuli +kulimit +kulkarni +kullaite +Kullani +kulm +kulmet +Kulturkampf +Kulturkreis +Kuman +kumbi +kumhar +kumiss +kummel +Kumni +kumquat +kumrah +Kumyk +kunai +Kunbi +Kundry +Kuneste +kung +kunk +kunkur +Kunmiut +kunzite +Kuomintang +kupfernickel +kupfferite +kuphar +kupper +Kuranko +kurbash +kurchicine +kurchine +Kurd +Kurdish +Kurdistan +kurgan +Kuri +Kurilian +Kurku +kurmburra +Kurmi +Kuroshio +kurrajong +Kurt +kurtosis +Kuruba +Kurukh +kuruma +kurumaya +Kurumba +kurung +kurus +kurvey +kurveyor +kusa +kusam +Kusan +kusha +Kushshu +kusimansel +kuskite +kuskos +kuskus +Kuskwogmiut +Kustenau +kusti +Kusum +kusum +kutcha +Kutchin +Kutenai +kuttab +kuttar +kuttaur +kuvasz +Kuvera +kvass +kvint +kvinter +Kwakiutl +kwamme +kwan +Kwannon +Kwapa +kwarta +kwarterka +kwazoku +kyack +kyah +kyar +kyat +kyaung +Kybele +Kyklopes +Kyklops +kyl +Kyle +kyle +kylite +kylix +Kylo +kymation +kymatology +kymbalon +kymogram +kymograph +kymographic +kynurenic +kynurine +kyphoscoliosis +kyphoscoliotic +Kyphosidae +kyphosis +kyphotic +Kyrie +kyrine +kyschtymite +kyte +Kyu +Kyung +Kyurin +Kyurinish +L +l +la +laager +laang +lab +Laban +labara +labarum +labba +labber +labdacism +labdacismus +labdanum +labefact +labefactation +labefaction +labefy +label +labeler +labella +labellate +labeller +labelloid +labellum +labia +labial +labialism +labialismus +labiality +labialization +labialize +labially +Labiatae +labiate +labiated +labidophorous +Labidura +Labiduridae +labiella +labile +lability +labilization +labilize +labioalveolar +labiocervical +labiodental +labioglossal +labioglossolaryngeal +labioglossopharyngeal +labiograph +labioguttural +labiolingual +labiomancy +labiomental +labionasal +labiopalatal +labiopalatalize +labiopalatine +labiopharyngeal +labioplasty +labiose +labiotenaculum +labiovelar +labioversion +labis +labium +lablab +labor +laborability +laborable +laborage +laborant +laboratorial +laboratorian +laboratory +labordom +labored +laboredly +laboredness +laborer +laboress +laborhood +laboring +laboringly +laborious +laboriously +laboriousness +laborism +laborist +laborite +laborless +laborous +laborously +laborousness +laborsaving +laborsome +laborsomely +laborsomeness +Laboulbenia +Laboulbeniaceae +laboulbeniaceous +Laboulbeniales +labour +labra +Labrador +Labradorean +labradorite +labradoritic +labral +labret +labretifery +Labridae +labroid +Labroidea +labrosaurid +labrosauroid +Labrosaurus +labrose +labrum +Labrus +labrusca +labrys +Laburnum +labyrinth +labyrinthal +labyrinthally +labyrinthian +labyrinthibranch +labyrinthibranchiate +Labyrinthibranchii +labyrinthic +labyrinthical +labyrinthically +Labyrinthici +labyrinthiform +labyrinthine +labyrinthitis +Labyrinthodon +labyrinthodont +Labyrinthodonta +labyrinthodontian +labyrinthodontid +labyrinthodontoid +Labyrinthula +Labyrinthulidae +lac +lacca +laccaic +laccainic +laccase +laccol +laccolith +laccolithic +laccolitic +lace +lacebark +laced +Lacedaemonian +laceflower +laceleaf +laceless +lacelike +lacemaker +lacemaking +laceman +lacepiece +lacepod +lacer +lacerability +lacerable +lacerant +lacerate +lacerated +lacerately +laceration +lacerative +Lacerta +Lacertae +lacertian +Lacertid +Lacertidae +lacertiform +Lacertilia +lacertilian +lacertiloid +lacertine +lacertoid +lacertose +lacery +lacet +lacewing +lacewoman +lacewood +lacework +laceworker +laceybark +lache +Lachenalia +laches +Lachesis +Lachnanthes +Lachnosterna +lachryma +lachrymae +lachrymaeform +lachrymal +lachrymally +lachrymalness +lachrymary +lachrymation +lachrymator +lachrymatory +lachrymiform +lachrymist +lachrymogenic +lachrymonasal +lachrymosal +lachrymose +lachrymosely +lachrymosity +lachrymous +lachsa +lacily +Lacinaria +laciness +lacing +lacinia +laciniate +laciniated +laciniation +laciniform +laciniola +laciniolate +laciniose +lacinula +lacinulate +lacinulose +lacis +lack +lackadaisical +lackadaisicality +lackadaisically +lackadaisicalness +lackadaisy +lackaday +lacker +lackey +lackeydom +lackeyed +lackeyism +lackeyship +lackland +lackluster +lacklusterness +lacklustrous +lacksense +lackwit +lackwittedly +lackwittedness +lacmoid +lacmus +Laconian +Laconic +laconic +laconica +laconically +laconicalness +laconicism +laconicum +laconism +laconize +laconizer +Lacosomatidae +lacquer +lacquerer +lacquering +lacquerist +lacroixite +lacrosse +lacrosser +lacrym +lactagogue +lactalbumin +lactam +lactamide +lactant +lactarene +lactarious +lactarium +Lactarius +lactary +lactase +lactate +lactation +lactational +lacteal +lactean +lactenin +lacteous +lactesce +lactescence +lactescency +lactescent +lactic +lacticinia +lactid +lactide +lactiferous +lactiferousness +lactific +lactifical +lactification +lactiflorous +lactifluous +lactiform +lactifuge +lactify +lactigenic +lactigenous +lactigerous +lactim +lactimide +lactinate +lactivorous +lacto +lactobacilli +Lactobacillus +lactobacillus +lactobutyrometer +lactocele +lactochrome +lactocitrate +lactodensimeter +lactoflavin +lactoglobulin +lactoid +lactol +lactometer +lactone +lactonic +lactonization +lactonize +lactophosphate +lactoproteid +lactoprotein +lactoscope +lactose +lactoside +lactosuria +lactothermometer +lactotoxin +lactovegetarian +Lactuca +lactucarium +lactucerin +lactucin +lactucol +lactucon +lactyl +lacuna +lacunae +lacunal +lacunar +lacunaria +lacunary +lacune +lacunose +lacunosity +lacunule +lacunulose +lacuscular +lacustral +lacustrian +lacustrine +lacwork +lacy +lad +Ladakhi +ladakin +ladanigerous +ladanum +ladder +laddered +laddering +ladderlike +ladderway +ladderwise +laddery +laddess +laddie +laddikie +laddish +laddock +lade +lademan +laden +lader +ladhood +ladies +ladify +Ladik +Ladin +lading +Ladino +ladkin +ladle +ladleful +ladler +ladlewood +ladrone +ladronism +ladronize +lady +ladybird +ladybug +ladyclock +ladydom +ladyfinger +ladyfish +ladyfly +ladyfy +ladyhood +ladyish +ladyism +ladykin +ladykind +ladyless +ladylike +ladylikely +ladylikeness +ladyling +ladylintywhite +ladylove +ladyly +ladyship +Ladytide +Laelia +laemodipod +Laemodipoda +laemodipodan +laemodipodiform +laemodipodous +laemoparalysis +laemostenosis +laeotropic +laeotropism +Laestrygones +laet +laeti +laetic +Laevigrada +laevoduction +laevogyrate +laevogyre +laevogyrous +laevolactic +laevorotation +laevorotatory +laevotartaric +laevoversion +lafayette +Lafite +lag +lagan +lagarto +lagen +lagena +Lagenaria +lagend +lageniform +lager +Lagerstroemia +Lagetta +lagetto +laggar +laggard +laggardism +laggardly +laggardness +lagged +laggen +lagger +laggin +lagging +laglast +lagna +lagniappe +lagomorph +Lagomorpha +lagomorphic +lagomorphous +Lagomyidae +lagonite +lagoon +lagoonal +lagoonside +lagophthalmos +lagopode +lagopodous +lagopous +Lagopus +Lagorchestes +lagostoma +Lagostomus +Lagothrix +Lagrangian +Lagthing +Lagting +Laguncularia +Lagunero +Lagurus +lagwort +Lahnda +Lahontan +Lahuli +Lai +lai +Laibach +laic +laical +laicality +laically +laich +laicism +laicity +laicization +laicize +laicizer +laid +laigh +lain +laine +laiose +lair +lairage +laird +lairdess +lairdie +lairdly +lairdocracy +lairdship +lairless +lairman +lairstone +lairy +laitance +laity +Lak +lak +lakarpite +lakatoi +lake +lakeland +lakelander +lakeless +lakelet +lakelike +lakemanship +laker +lakeside +lakeward +lakeweed +lakie +laking +lakish +lakishness +lakism +lakist +Lakota +Lakshmi +laky +lalang +lall +Lallan +Lalland +lallation +lalling +lalo +laloneurosis +lalopathy +lalophobia +laloplegia +lam +lama +lamaic +Lamaism +Lamaist +Lamaistic +Lamaite +Lamanism +Lamanite +Lamano +lamantin +lamany +Lamarckia +Lamarckian +Lamarckianism +Lamarckism +lamasary +lamasery +lamastery +lamb +Lamba +lamba +Lambadi +lambale +lambaste +lambda +lambdacism +lambdoid +lambdoidal +lambeau +lambency +lambent +lambently +lamber +Lambert +lambert +lambhood +lambie +lambiness +lambish +lambkill +lambkin +Lamblia +lambliasis +lamblike +lambling +lambly +lamboys +lambrequin +lambsdown +lambskin +lambsuccory +lamby +lame +lamedh +lameduck +lamel +lamella +lamellar +Lamellaria +Lamellariidae +lamellarly +lamellary +lamellate +lamellated +lamellately +lamellation +lamellibranch +Lamellibranchia +Lamellibranchiata +lamellibranchiate +lamellicorn +lamellicornate +Lamellicornes +Lamellicornia +lamellicornous +lamelliferous +lamelliform +lamellirostral +lamellirostrate +Lamellirostres +lamelloid +lamellose +lamellosity +lamellule +lamely +lameness +lament +lamentable +lamentableness +lamentably +lamentation +lamentational +lamentatory +lamented +lamentedly +lamenter +lamentful +lamenting +lamentingly +lamentive +lamentory +lamester +lamestery +lameter +lametta +lamia +Lamiaceae +lamiaceous +lamiger +lamiid +Lamiidae +Lamiides +Lamiinae +lamin +lamina +laminability +laminable +laminae +laminar +Laminaria +Laminariaceae +laminariaceous +Laminariales +laminarian +laminarin +laminarioid +laminarite +laminary +laminate +laminated +lamination +laminboard +laminectomy +laminiferous +laminiform +laminiplantar +laminiplantation +laminitis +laminose +laminous +lamish +Lamista +lamiter +Lamium +Lammas +lammas +Lammastide +lammer +lammergeier +lammock +lammy +Lamna +lamnectomy +lamnid +Lamnidae +lamnoid +lamp +lampad +lampadary +lampadedromy +lampadephore +lampadephoria +lampadite +lampas +lampatia +lampblack +lamper +lampern +lampers +lampflower +lampfly +lampful +lamphole +lamping +lampion +lampist +lampistry +lampless +lamplet +lamplight +lamplighted +lamplighter +lamplit +lampmaker +lampmaking +lampman +Lampong +lampoon +lampooner +lampoonery +lampoonist +lamppost +lamprey +Lampridae +lamprophony +lamprophyre +lamprophyric +lamprotype +Lampsilis +Lampsilus +lampstand +lampwick +lampyrid +Lampyridae +lampyrine +Lampyris +Lamus +Lamut +lamziekte +lan +Lana +lanameter +Lanao +Lanarkia +lanarkite +lanas +lanate +lanated +lanaz +Lancaster +Lancasterian +Lancastrian +Lance +lance +lanced +lancegay +lancelet +lancelike +lancely +lanceman +lanceolar +lanceolate +lanceolated +lanceolately +lanceolation +lancepesade +lancepod +lanceproof +lancer +lances +lancet +lanceted +lanceteer +lancewood +lancha +lanciers +lanciferous +lanciform +lancinate +lancination +land +landamman +landau +landaulet +landaulette +landblink +landbook +landdrost +landed +lander +landesite +landfall +landfast +landflood +landgafol +landgravate +landgrave +landgraveship +landgravess +landgraviate +landgravine +landholder +landholdership +landholding +landimere +landing +landlady +landladydom +landladyhood +landladyish +landladyship +landless +landlessness +landlike +landline +landlock +landlocked +landlook +landlooker +landloper +landlord +landlordism +landlordly +landlordry +landlordship +landlouper +landlouping +landlubber +landlubberish +landlubberly +landlubbing +landman +landmark +Landmarker +landmil +landmonger +landocracy +landocrat +Landolphia +landolphia +landowner +landownership +landowning +landplane +landraker +landreeve +landright +landsale +landscape +landscapist +landshard +landship +landsick +landside +landskip +landslide +landslip +Landsmaal +landsman +landspout +landspringy +Landsting +landstorm +Landsturm +Landuman +landwaiter +landward +landwash +landways +Landwehr +landwhin +landwire +landwrack +lane +lanete +laneway +laney +langaha +langarai +langbanite +langbeinite +langca +Langhian +langi +langite +langlauf +langlaufer +langle +Lango +Langobard +Langobardic +langoon +langooty +langrage +langsat +Langsdorffia +langsettle +Langshan +langspiel +langsyne +language +languaged +languageless +langued +Languedocian +languescent +languet +languid +languidly +languidness +languish +languisher +languishing +languishingly +languishment +languor +languorous +languorously +langur +laniariform +laniary +laniate +laniferous +lanific +laniflorous +laniform +lanigerous +Laniidae +laniiform +Laniinae +lanioid +lanista +Lanital +Lanius +lank +lanket +lankily +lankiness +lankish +lankly +lankness +lanky +lanner +lanneret +Lanny +lanolin +lanose +lanosity +lansat +lansdowne +lanseh +lansfordite +lansknecht +lanson +lansquenet +lant +lantaca +Lantana +lanterloo +lantern +lanternflower +lanternist +lanternleaf +lanternman +lanthana +lanthanide +lanthanite +Lanthanotidae +Lanthanotus +lanthanum +lanthopine +lantum +lanuginose +lanuginous +lanuginousness +lanugo +lanum +Lanuvian +lanx +lanyard +Lao +Laodicean +Laodiceanism +Laotian +lap +lapacho +lapachol +lapactic +Lapageria +laparectomy +laparocele +laparocholecystotomy +laparocolectomy +laparocolostomy +laparocolotomy +laparocolpohysterotomy +laparocolpotomy +laparocystectomy +laparocystotomy +laparoelytrotomy +laparoenterostomy +laparoenterotomy +laparogastroscopy +laparogastrotomy +laparohepatotomy +laparohysterectomy +laparohysteropexy +laparohysterotomy +laparoileotomy +laparomyitis +laparomyomectomy +laparomyomotomy +laparonephrectomy +laparonephrotomy +laparorrhaphy +laparosalpingectomy +laparosalpingotomy +laparoscopy +laparosplenectomy +laparosplenotomy +laparostict +Laparosticti +laparothoracoscopy +laparotome +laparotomist +laparotomize +laparotomy +laparotrachelotomy +lapboard +lapcock +Lapeirousia +lapel +lapeler +lapelled +lapful +lapicide +lapidarian +lapidarist +lapidary +lapidate +lapidation +lapidator +lapideon +lapideous +lapidescent +lapidicolous +lapidific +lapidification +lapidify +lapidist +lapidity +lapidose +lapilliform +lapillo +lapillus +Lapith +Lapithae +Lapithaean +Laplacian +Lapland +Laplander +Laplandian +Laplandic +Laplandish +lapon +Laportea +Lapp +Lappa +lappaceous +lappage +lapped +lapper +lappet +lappeted +Lappic +lapping +Lappish +Lapponese +Lapponian +Lappula +lapsability +lapsable +Lapsana +lapsation +lapse +lapsed +lapser +lapsi +lapsing +lapsingly +lapstone +lapstreak +lapstreaked +lapstreaker +Laputa +Laputan +laputically +lapwing +lapwork +laquear +laquearian +laqueus +Lar +lar +Laralia +Laramide +Laramie +larboard +larbolins +larbowlines +larcener +larcenic +larcenish +larcenist +larcenous +larcenously +larceny +larch +larchen +lard +lardacein +lardaceous +larder +larderellite +larderer +larderful +larderlike +lardiform +lardite +Lardizabalaceae +lardizabalaceous +lardon +lardworm +lardy +lareabell +Larentiidae +large +largebrained +largehanded +largehearted +largeheartedness +largely +largemouth +largemouthed +largen +largeness +largess +larghetto +largifical +largish +largition +largitional +largo +Lari +lari +Laria +lariat +larick +larid +Laridae +laridine +larigo +larigot +lariid +Lariidae +larin +Larinae +larine +larithmics +Larix +larixin +lark +larker +larkiness +larking +larkingly +larkish +larkishness +larklike +larkling +larksome +larkspur +larky +larmier +larmoyant +Larnaudian +larnax +laroid +larrigan +larrikin +larrikinalian +larrikiness +larrikinism +larriman +larrup +Larry +larry +Lars +larsenite +Larunda +Larus +larva +Larvacea +larvae +larval +Larvalia +larvarium +larvate +larve +larvicidal +larvicide +larvicolous +larviform +larvigerous +larvikite +larviparous +larviposit +larviposition +larvivorous +larvule +laryngal +laryngalgia +laryngeal +laryngeally +laryngean +laryngeating +laryngectomy +laryngemphraxis +laryngendoscope +larynges +laryngic +laryngismal +laryngismus +laryngitic +laryngitis +laryngocele +laryngocentesis +laryngofission +laryngofissure +laryngograph +laryngography +laryngological +laryngologist +laryngology +laryngometry +laryngoparalysis +laryngopathy +laryngopharyngeal +laryngopharyngitis +laryngophony +laryngophthisis +laryngoplasty +laryngoplegia +laryngorrhagia +laryngorrhea +laryngoscleroma +laryngoscope +laryngoscopic +laryngoscopical +laryngoscopist +laryngoscopy +laryngospasm +laryngostasis +laryngostenosis +laryngostomy +laryngostroboscope +laryngotome +laryngotomy +laryngotracheal +laryngotracheitis +laryngotracheoscopy +laryngotracheotomy +laryngotyphoid +laryngovestibulitis +larynx +las +lasa +lasarwort +lascar +lascivious +lasciviously +lasciviousness +laser +Laserpitium +laserwort +lash +lasher +lashingly +lashless +lashlite +Lasi +lasianthous +Lasiocampa +lasiocampid +Lasiocampidae +Lasiocampoidea +lasiocarpous +Lasius +lask +lasket +Laspeyresia +laspring +lasque +lass +lasset +lassie +lassiehood +lassieish +lassitude +lasslorn +lasso +lassock +lassoer +last +lastage +laster +lasting +lastingly +lastingness +lastly +lastness +lastre +lastspring +lasty +lat +lata +latah +Latakia +Latania +Latax +latch +latcher +latchet +latching +latchkey +latchless +latchman +latchstring +late +latebra +latebricole +latecomer +latecoming +lated +lateen +lateener +lately +laten +latence +latency +lateness +latensification +latent +latentize +latently +latentness +later +latera +laterad +lateral +lateralis +laterality +lateralization +lateralize +laterally +Lateran +latericumbent +lateriflexion +laterifloral +lateriflorous +laterifolious +Laterigradae +laterigrade +laterinerved +laterite +lateritic +lateritious +lateriversion +laterization +lateroabdominal +lateroanterior +laterocaudal +laterocervical +laterodeviation +laterodorsal +lateroduction +lateroflexion +lateromarginal +lateronuchal +lateroposition +lateroposterior +lateropulsion +laterostigmatal +laterostigmatic +laterotemporal +laterotorsion +lateroventral +lateroversion +latescence +latescent +latesome +latest +latewhile +latex +latexosis +lath +lathe +lathee +latheman +lathen +lather +latherability +latherable +lathereeve +latherer +latherin +latheron +latherwort +lathery +lathesman +lathhouse +lathing +Lathraea +lathwork +lathy +lathyric +lathyrism +Lathyrus +Latian +latibulize +latices +laticiferous +laticlave +laticostate +latidentate +latifundian +latifundium +latigo +Latimeria +Latin +Latinate +Latiner +Latinesque +Latinian +Latinic +Latiniform +Latinism +latinism +Latinist +Latinistic +Latinistical +Latinitaster +Latinity +Latinization +Latinize +Latinizer +Latinless +Latinus +lation +latipennate +latiplantar +latirostral +Latirostres +latirostrous +Latirus +latisept +latiseptal +latiseptate +latish +latisternal +latitancy +latitant +latitat +latite +latitude +latitudinal +latitudinally +latitudinarian +latitudinarianisn +latitudinary +latitudinous +latomy +Latona +Latonian +Latooka +latrant +latration +latreutic +latria +Latrididae +latrine +Latris +latro +latrobe +latrobite +latrocinium +Latrodectus +latron +latten +lattener +latter +latterkin +latterly +lattermath +lattermost +latterness +lattice +latticed +latticewise +latticework +latticing +latticinio +Latuka +latus +Latvian +lauan +laubanite +laud +laudability +laudable +laudableness +laudably +laudanidine +laudanin +laudanine +laudanosine +laudanum +laudation +laudative +laudator +laudatorily +laudatory +lauder +Laudian +Laudianism +laudification +Laudism +Laudist +laudist +laugh +laughable +laughableness +laughably +laughee +laugher +laughful +laughing +laughingly +laughingstock +laughsome +laughter +laughterful +laughterless +laughworthy +laughy +lauia +laumonite +laumontite +laun +launce +launch +launcher +launchful +launchways +laund +launder +launderability +launderable +launderer +laundry +laundrymaid +laundryman +laundryowner +laundrywoman +laur +Laura +laura +Lauraceae +lauraceous +lauraldehyde +laurate +laurdalite +laureate +laureated +laureateship +laureation +Laurel +laurel +laureled +laurellike +laurelship +laurelwood +Laurence +Laurencia +Laurent +Laurentian +Laurentide +laureole +Laurianne +lauric +Laurie +laurin +laurinoxylon +laurionite +laurite +Laurocerasus +laurone +laurotetanine +Laurus +laurustine +laurustinus +laurvikite +lauryl +lautarite +lautitious +lava +lavable +lavabo +lavacre +lavage +lavaliere +lavalike +Lavandula +lavanga +lavant +lavaret +Lavatera +lavatic +lavation +lavational +lavatorial +lavatory +lave +laveer +Lavehr +lavement +lavender +lavenite +laver +Laverania +laverock +laverwort +lavialite +lavic +Lavinia +lavish +lavisher +lavishing +lavishingly +lavishly +lavishment +lavishness +lavolta +lavrovite +law +lawbook +lawbreaker +lawbreaking +lawcraft +lawful +lawfully +lawfulness +lawgiver +lawgiving +lawing +lawish +lawk +lawlants +lawless +lawlessly +lawlessness +lawlike +lawmaker +lawmaking +lawman +lawmonger +lawn +lawned +lawner +lawnlet +lawnlike +lawny +lawproof +Lawrence +lawrencite +Lawrie +lawrightman +Lawson +Lawsoneve +Lawsonia +lawsonite +lawsuit +lawsuiting +lawter +Lawton +lawyer +lawyeress +lawyerism +lawyerlike +lawyerling +lawyerly +lawyership +lawyery +lawzy +lax +laxate +laxation +laxative +laxatively +laxativeness +laxiflorous +laxifoliate +laxifolious +laxism +laxist +laxity +laxly +laxness +lay +layaway +layback +layboy +layer +layerage +layered +layery +layette +Layia +laying +layland +layman +laymanship +layne +layoff +layout +layover +layship +laystall +laystow +laywoman +Laz +lazar +lazaret +lazaretto +Lazarist +lazarlike +lazarly +lazarole +Lazarus +laze +lazily +laziness +lazule +lazuli +lazuline +lazulite +lazulitic +lazurite +lazy +lazybird +lazybones +lazyboots +lazyhood +lazyish +lazylegs +lazyship +lazzarone +lazzaroni +Lea +lea +leach +leacher +leachman +leachy +Lead +lead +leadable +leadableness +leadage +leadback +leaded +leaden +leadenhearted +leadenheartedness +leadenly +leadenness +leadenpated +leader +leaderess +leaderette +leaderless +leadership +leadhillite +leadin +leadiness +leading +leadingly +leadless +leadman +leadoff +leadout +leadproof +Leads +leadsman +leadstone +leadway +leadwood +leadwork +leadwort +leady +leaf +leafage +leafboy +leafcup +leafdom +leafed +leafen +leafer +leafery +leafgirl +leafit +leafless +leaflessness +leaflet +leafleteer +leaflike +leafstalk +leafwork +leafy +league +leaguelong +leaguer +Leah +leak +leakage +leakance +leaker +leakiness +leakless +leakproof +leaky +leal +lealand +leally +lealness +lealty +leam +leamer +lean +Leander +leaner +leaning +leanish +leanly +leanness +leant +leap +leapable +leaper +leapfrog +leapfrogger +leapfrogging +leaping +leapingly +leapt +Lear +lear +Learchus +learn +learnable +learned +learnedly +learnedness +learner +learnership +learning +learnt +Learoyd +leasable +lease +leasehold +leaseholder +leaseholding +leaseless +leasemonger +leaser +leash +leashless +leasing +leasow +least +leastways +leastwise +leat +leath +leather +leatherback +leatherbark +leatherboard +leatherbush +leathercoat +leathercraft +leatherer +Leatherette +leatherfish +leatherflower +leatherhead +leatherine +leatheriness +leathering +leatherize +leatherjacket +leatherleaf +leatherlike +leathermaker +leathermaking +leathern +leatherneck +Leatheroid +leatherroot +leatherside +Leatherstocking +leatherware +leatherwing +leatherwood +leatherwork +leatherworker +leatherworking +leathery +leathwake +leatman +leave +leaved +leaveless +leavelooker +leaven +leavening +leavenish +leavenless +leavenous +leaver +leaverwood +leaves +leaving +leavy +leawill +leban +Lebanese +lebbek +lebensraum +Lebistes +lebrancho +lecama +lecaniid +Lecaniinae +lecanine +Lecanium +lecanomancer +lecanomancy +lecanomantic +Lecanora +Lecanoraceae +lecanoraceous +lecanorine +lecanoroid +lecanoscopic +lecanoscopy +lech +Lechea +lecher +lecherous +lecherously +lecherousness +lechery +lechriodont +Lechriodonta +lechuguilla +lechwe +Lecidea +Lecideaceae +lecideaceous +lecideiform +lecideine +lecidioid +lecithal +lecithalbumin +lecithality +lecithin +lecithinase +lecithoblast +lecithoprotein +leck +lecker +lecontite +lecotropal +lectern +lection +lectionary +lectisternium +lector +lectorate +lectorial +lectorship +lectotype +lectress +lectrice +lectual +lecture +lecturee +lectureproof +lecturer +lectureship +lecturess +lecturette +lecyth +lecythid +Lecythidaceae +lecythidaceous +Lecythis +lecythoid +lecythus +led +Leda +lede +leden +lederite +ledge +ledged +ledgeless +ledger +ledgerdom +ledging +ledgment +ledgy +Ledidae +ledol +Ledum +Lee +lee +leeangle +leeboard +leech +leecheater +leecher +leechery +leeches +leechkin +leechlike +leechwort +leed +leefang +leeftail +leek +leekish +leeky +leep +leepit +leer +leerily +leeringly +leerish +leerness +leeroway +Leersia +leery +lees +leet +leetman +leewan +leeward +leewardly +leewardmost +leewardness +leeway +leewill +left +leftish +leftism +leftist +leftments +leftmost +leftness +leftover +leftward +leftwardly +leftwards +leg +legacy +legal +legalese +legalism +legalist +legalistic +legalistically +legality +legalization +legalize +legally +legalness +legantine +legatary +legate +legatee +legateship +legatine +legation +legationary +legative +legato +legator +legatorial +legend +legenda +legendarian +legendary +legendic +legendist +legendless +Legendrian +legendry +leger +legerdemain +legerdemainist +legerity +leges +legged +legger +legginess +legging +legginged +leggy +leghorn +legibility +legible +legibleness +legibly +legific +legion +legionary +legioned +legioner +legionnaire +legionry +legislate +legislation +legislational +legislativ +legislative +legislatively +legislator +legislatorial +legislatorially +legislatorship +legislatress +legislature +legist +legit +legitim +legitimacy +legitimate +legitimately +legitimateness +legitimation +legitimatist +legitimatize +legitimism +legitimist +legitimistic +legitimity +legitimization +legitimize +leglen +legless +leglessness +leglet +leglike +legman +legoa +legpiece +legpull +legpuller +legpulling +legrope +legua +leguan +Leguatia +leguleian +leguleious +legume +legumelin +legumen +legumin +leguminiform +Leguminosae +leguminose +leguminous +Lehi +lehr +lehrbachite +lehrman +lehua +lei +Leibnitzian +Leibnitzianism +Leicester +Leif +Leigh +leighton +Leila +leimtype +leiocephalous +leiocome +leiodermatous +leiodermia +leiomyofibroma +leiomyoma +leiomyomatous +leiomyosarcoma +leiophyllous +Leiophyllum +Leiothrix +Leiotrichan +Leiotriches +Leiotrichi +Leiotrichidae +Leiotrichinae +leiotrichine +leiotrichous +leiotrichy +leiotropic +Leipoa +Leishmania +leishmaniasis +Leisten +leister +leisterer +leisurable +leisurably +leisure +leisured +leisureful +leisureless +leisureliness +leisurely +leisureness +Leith +leitmotiv +Leitneria +Leitneriaceae +leitneriaceous +Leitneriales +lek +lekach +lekane +lekha +Lelia +Lemaireocereus +leman +Lemanea +Lemaneaceae +lemel +lemma +lemmata +lemming +lemmitis +lemmoblastic +lemmocyte +Lemmus +Lemna +Lemnaceae +lemnaceous +lemnad +Lemnian +lemniscate +lemniscatic +lemniscus +lemography +lemology +lemon +lemonade +Lemonias +Lemoniidae +Lemoniinae +lemonish +lemonlike +lemonweed +lemonwood +lemony +Lemosi +Lemovices +lempira +Lemuel +lemur +lemures +Lemuria +Lemurian +lemurian +lemurid +Lemuridae +lemuriform +Lemurinae +lemurine +lemuroid +Lemuroidea +Len +Lena +lenad +Lenaea +Lenaean +Lenaeum +Lenaeus +Lenape +lenard +Lenca +Lencan +lench +lend +lendable +lendee +lender +Lendu +lene +length +lengthen +lengthener +lengther +lengthful +lengthily +lengthiness +lengthsman +lengthsome +lengthsomeness +lengthways +lengthwise +lengthy +lenience +leniency +lenient +leniently +lenify +Leninism +Leninist +Leninite +lenis +lenitic +lenitive +lenitively +lenitiveness +lenitude +lenity +lennilite +Lennoaceae +lennoaceous +lennow +Lenny +leno +Lenora +lens +lensed +lensless +lenslike +Lent +lent +Lenten +Lententide +lenth +lenthways +Lentibulariaceae +lentibulariaceous +lenticel +lenticellate +lenticle +lenticonus +lenticula +lenticular +lenticulare +lenticularis +lenticularly +lenticulate +lenticulated +lenticule +lenticulostriate +lenticulothalamic +lentiform +lentigerous +lentiginous +lentigo +lentil +Lentilla +lentisc +lentiscine +lentisco +lentiscus +lentisk +lentitude +lentitudinous +lento +lentoid +lentor +lentous +lenvoi +lenvoy +Lenzites +Leo +Leon +Leonard +Leonardesque +Leonato +leoncito +Leonese +leonhardite +Leonid +Leonine +leonine +leoninely +leonines +Leonis +Leonist +leonite +Leonnoys +Leonora +Leonotis +leontiasis +Leontocebus +leontocephalous +Leontodon +Leontopodium +Leonurus +leopard +leoparde +leopardess +leopardine +leopardite +leopardwood +Leopold +Leopoldinia +leopoldite +Leora +leotard +lepa +Lepadidae +lepadoid +Lepanto +lepargylic +Lepargyraea +Lepas +Lepcha +leper +leperdom +lepered +lepidene +lepidine +Lepidium +lepidoblastic +Lepidodendraceae +lepidodendraceous +lepidodendrid +lepidodendroid +Lepidodendron +lepidoid +Lepidoidei +lepidolite +lepidomelane +Lepidophloios +lepidophyllous +Lepidophyllum +lepidophyte +lepidophytic +lepidoporphyrin +lepidopter +Lepidoptera +lepidopteral +lepidopteran +lepidopterid +lepidopterist +lepidopterological +lepidopterologist +lepidopterology +lepidopteron +lepidopterous +Lepidosauria +lepidosaurian +Lepidosiren +Lepidosirenidae +lepidosirenoid +lepidosis +Lepidosperma +Lepidospermae +Lepidosphes +Lepidostei +lepidosteoid +Lepidosteus +Lepidostrobus +lepidote +Lepidotes +lepidotic +Lepidotus +Lepidurus +Lepilemur +Lepiota +Lepisma +Lepismatidae +Lepismidae +lepismoid +Lepisosteidae +Lepisosteus +lepocyte +Lepomis +leporid +Leporidae +leporide +leporiform +leporine +Leporis +Lepospondyli +lepospondylous +Leposternidae +Leposternon +lepothrix +lepra +Lepralia +lepralian +leprechaun +lepric +leproid +leprologic +leprologist +leprology +leproma +lepromatous +leprosarium +leprose +leprosery +leprosied +leprosis +leprosity +leprosy +leprous +leprously +leprousness +Leptamnium +Leptandra +leptandrin +leptid +Leptidae +leptiform +Leptilon +leptinolite +Leptinotarsa +leptite +Leptocardia +leptocardian +Leptocardii +leptocentric +leptocephalan +leptocephali +leptocephalia +leptocephalic +leptocephalid +Leptocephalidae +leptocephaloid +leptocephalous +Leptocephalus +leptocephalus +leptocephaly +leptocercal +leptochlorite +leptochroa +leptochrous +leptoclase +leptodactyl +Leptodactylidae +leptodactylous +Leptodactylus +leptodermatous +leptodermous +Leptodora +Leptodoridae +Leptogenesis +leptokurtic +Leptolepidae +Leptolepis +Leptolinae +leptomatic +leptome +Leptomedusae +leptomedusan +leptomeningeal +leptomeninges +leptomeningitis +leptomeninx +leptometer +leptomonad +Leptomonas +Lepton +lepton +leptonecrosis +leptonema +leptopellic +Leptophis +leptophyllous +leptoprosope +leptoprosopic +leptoprosopous +leptoprosopy +Leptoptilus +Leptorchis +leptorrhin +leptorrhine +leptorrhinian +leptorrhinism +leptosome +leptosperm +Leptospermum +Leptosphaeria +Leptospira +leptospirosis +leptosporangiate +Leptostraca +leptostracan +leptostracous +Leptostromataceae +Leptosyne +leptotene +Leptothrix +Leptotrichia +Leptotyphlopidae +Leptotyphlops +leptus +leptynite +Lepus +Ler +Lernaea +Lernaeacea +Lernaean +Lernaeidae +lernaeiform +lernaeoid +Lernaeoides +lerot +lerp +lerret +Lerwa +Les +Lesath +Lesbia +Lesbian +Lesbianism +lesche +Lesgh +lesion +lesional +lesiy +Leskea +Leskeaceae +leskeaceous +Lesleya +Leslie +Lespedeza +Lesquerella +less +lessee +lesseeship +lessen +lessener +lesser +lessive +lessn +lessness +lesson +lessor +lest +Lester +lestiwarite +lestobiosis +lestobiotic +Lestodon +Lestosaurus +lestrad +Lestrigon +Lestrigonian +let +letch +letchy +letdown +lete +lethal +lethality +lethalize +lethally +lethargic +lethargical +lethargically +lethargicalness +lethargize +lethargus +lethargy +Lethe +Lethean +lethiferous +Lethocerus +lethologica +Letitia +Leto +letoff +Lett +lettable +letten +letter +lettered +letterer +letteret +lettergram +letterhead +letterin +lettering +letterleaf +letterless +letterpress +letterspace +letterweight +letterwood +Lettic +Lettice +Lettish +lettrin +lettsomite +lettuce +Letty +letup +leu +Leucadendron +Leucadian +leucaemia +leucaemic +Leucaena +leucaethiop +leucaethiopic +leucaniline +leucanthous +leucaugite +leucaurin +leucemia +leucemic +Leucetta +leuch +leuchaemia +leuchemia +leuchtenbergite +Leucichthys +Leucifer +Leuciferidae +leucine +Leucippus +leucism +leucite +leucitic +leucitis +leucitite +leucitohedron +leucitoid +Leuckartia +Leuckartiidae +leuco +leucobasalt +leucoblast +leucoblastic +Leucobryaceae +Leucobryum +leucocarpous +leucochalcite +leucocholic +leucocholy +leucochroic +leucocidic +leucocidin +leucocism +leucocrate +leucocratic +Leucocrinum +leucocyan +leucocytal +leucocyte +leucocythemia +leucocythemic +leucocytic +leucocytoblast +leucocytogenesis +leucocytoid +leucocytology +leucocytolysin +leucocytolysis +leucocytolytic +leucocytometer +leucocytopenia +leucocytopenic +leucocytoplania +leucocytopoiesis +leucocytosis +leucocytotherapy +leucocytotic +Leucocytozoon +leucoderma +leucodermatous +leucodermic +leucoencephalitis +leucogenic +leucoid +leucoindigo +leucoindigotin +Leucojaceae +Leucojum +leucolytic +leucoma +leucomaine +leucomatous +leucomelanic +leucomelanous +leucon +Leuconostoc +leucopenia +leucopenic +leucophane +leucophanite +leucophoenicite +leucophore +leucophyllous +leucophyre +leucoplakia +leucoplakial +leucoplast +leucoplastid +leucopoiesis +leucopoietic +leucopyrite +leucoquinizarin +leucorrhea +leucorrheal +leucoryx +leucosis +Leucosolenia +Leucosoleniidae +leucospermous +leucosphenite +leucosphere +leucospheric +leucostasis +Leucosticte +leucosyenite +leucotactic +Leucothea +Leucothoe +leucotic +leucotome +leucotomy +leucotoxic +leucous +leucoxene +leucyl +leud +leuk +leukemia +leukemic +leukocidic +leukocidin +leukosis +leukotic +leuma +Leung +lev +Levana +levance +Levant +levant +Levanter +levanter +Levantine +levator +levee +level +leveler +levelheaded +levelheadedly +levelheadedness +leveling +levelish +levelism +levelly +levelman +levelness +lever +leverage +leverer +leveret +leverman +levers +leverwood +Levi +leviable +leviathan +levier +levigable +levigate +levigation +levigator +levin +levining +levir +levirate +leviratical +leviration +Levis +Levisticum +levitant +levitate +levitation +levitational +levitative +levitator +Levite +Levitical +Leviticalism +Leviticality +Levitically +Leviticalness +Leviticism +Leviticus +Levitism +levity +levo +levoduction +levogyrate +levogyre +levogyrous +levolactic +levolimonene +levorotation +levorotatory +levotartaric +levoversion +levulic +levulin +levulinic +levulose +levulosuria +levy +levyist +levynite +Lew +lew +Lewanna +lewd +lewdly +lewdness +Lewie +Lewis +lewis +Lewisia +Lewisian +lewisite +lewisson +lewth +Lex +lexia +lexical +lexicalic +lexicality +lexicographer +lexicographian +lexicographic +lexicographical +lexicographically +lexicographist +lexicography +lexicologic +lexicological +lexicologist +lexicology +lexicon +lexiconist +lexiconize +lexigraphic +lexigraphical +lexigraphically +lexigraphy +lexiphanic +lexiphanicism +ley +leyland +leysing +Lezghian +lherzite +lherzolite +Lhota +li +liability +liable +liableness +liaison +liana +liang +liar +liard +Lias +Liassic +Liatris +libament +libaniferous +libanophorous +libanotophorous +libant +libate +libation +libationary +libationer +libatory +libber +libbet +libbra +Libby +libel +libelant +libelee +libeler +libelist +libellary +libellate +Libellula +libellulid +Libellulidae +libelluloid +libelous +libelously +Liber +liber +liberal +Liberalia +liberalism +liberalist +liberalistic +liberality +liberalization +liberalize +liberalizer +liberally +liberalness +liberate +liberation +liberationism +liberationist +liberative +liberator +liberatory +liberatress +Liberia +Liberian +liberomotor +libertarian +libertarianism +Libertas +liberticidal +liberticide +libertinage +libertine +libertinism +liberty +libertyless +libethenite +libidibi +libidinal +libidinally +libidinosity +libidinous +libidinously +libidinousness +libido +Libitina +libken +Libocedrus +Libra +libra +libral +librarian +librarianess +librarianship +librarious +librarius +library +libraryless +librate +libration +libratory +libretti +librettist +libretto +Librid +libriform +libroplast +Libyan +Libytheidae +Libytheinae +Licania +licareol +licca +licensable +license +licensed +licensee +licenseless +licenser +licensor +licensure +licentiate +licentiateship +licentiation +licentious +licentiously +licentiousness +lich +licham +lichanos +lichen +lichenaceous +lichened +Lichenes +licheniasis +lichenic +lichenicolous +licheniform +lichenin +lichenism +lichenist +lichenivorous +lichenization +lichenize +lichenlike +lichenographer +lichenographic +lichenographical +lichenographist +lichenography +lichenoid +lichenologic +lichenological +lichenologist +lichenology +Lichenopora +Lichenoporidae +lichenose +licheny +lichi +Lichnophora +Lichnophoridae +Licinian +licit +licitation +licitly +licitness +lick +licker +lickerish +lickerishly +lickerishness +licking +lickpenny +lickspit +lickspittle +lickspittling +licorice +licorn +licorne +lictor +lictorian +Licuala +lid +Lida +lidded +lidder +Lide +lidflower +lidgate +lidless +lie +liebenerite +Liebfraumilch +liebigite +lied +lief +liege +liegedom +liegeful +liegefully +liegeless +liegely +liegeman +lieger +lien +lienal +lienculus +lienee +lienic +lienitis +lienocele +lienogastric +lienointestinal +lienomalacia +lienomedullary +lienomyelogenous +lienopancreatic +lienor +lienorenal +lienotoxin +lienteria +lienteric +lientery +lieproof +lieprooflier +lieproofliest +lier +lierne +lierre +liesh +liespfund +lieu +lieue +lieutenancy +lieutenant +lieutenantry +lieutenantship +Lievaart +lieve +lievrite +Lif +life +lifeblood +lifeboat +lifeboatman +lifeday +lifedrop +lifeful +lifefully +lifefulness +lifeguard +lifehold +lifeholder +lifeless +lifelessly +lifelessness +lifelet +lifelike +lifelikeness +lifeline +lifelong +lifer +liferent +liferenter +liferentrix +liferoot +lifesaver +lifesaving +lifesome +lifesomely +lifesomeness +lifespring +lifetime +lifeward +lifework +lifey +lifo +lift +liftable +lifter +lifting +liftless +liftman +ligable +ligament +ligamental +ligamentary +ligamentous +ligamentously +ligamentum +ligas +ligate +ligation +ligator +ligature +ligeance +ligger +light +lightable +lightboat +lightbrained +lighten +lightener +lightening +lighter +lighterage +lighterful +lighterman +lightface +lightful +lightfulness +lighthead +lightheaded +lightheadedly +lightheadedness +lighthearted +lightheartedly +lightheartedness +lighthouse +lighthouseman +lighting +lightish +lightkeeper +lightless +lightlessness +lightly +lightman +lightmanship +lightmouthed +lightness +lightning +lightninglike +lightningproof +lightproof +lightroom +lightscot +lightship +lightsman +lightsome +lightsomely +lightsomeness +lighttight +lightwards +lightweight +lightwood +lightwort +lignaloes +lignatile +ligne +ligneous +lignescent +lignicole +lignicoline +lignicolous +ligniferous +lignification +ligniform +lignify +lignin +ligninsulphonate +ligniperdous +lignite +lignitic +lignitiferous +lignitize +lignivorous +lignocellulose +lignoceric +lignography +lignone +lignose +lignosity +lignosulphite +lignosulphonate +lignum +ligroine +ligula +ligular +Ligularia +ligulate +ligulated +ligule +Liguliflorae +liguliflorous +liguliform +ligulin +liguloid +Liguorian +ligure +Ligurian +ligurite +ligurition +Ligusticum +ligustrin +Ligustrum +Ligyda +Ligydidae +Lihyanite +liin +lija +likability +likable +likableness +like +likelihead +likelihood +likeliness +likely +liken +likeness +liker +likesome +likeways +likewise +likin +liking +liknon +Lila +lilac +lilaceous +lilacin +lilacky +lilacthroat +lilactide +Lilaeopsis +lile +Liliaceae +liliaceous +Liliales +Lilian +lilied +liliform +Liliiflorae +Lilith +Lilium +lill +lillianite +lillibullero +Lilliput +Lilliputian +Lilliputianize +lilt +liltingly +liltingness +lily +lilyfy +lilyhanded +lilylike +lilywood +lilywort +lim +Lima +Limacea +limacel +limaceous +Limacidae +limaciform +Limacina +limacine +limacinid +Limacinidae +limacoid +limacon +limaille +liman +limation +Limawood +Limax +limb +limbal +limbat +limbate +limbation +limbeck +limbed +limber +limberham +limberly +limberness +limbers +limbic +limbie +limbiferous +limbless +limbmeal +limbo +limboinfantum +limbous +Limbu +Limburger +limburgite +limbus +limby +lime +limeade +Limean +limeberry +limebush +limehouse +limekiln +limeless +limelight +limelighter +limelike +limeman +limen +limequat +limer +Limerick +limes +limestone +limetta +limettin +limewash +limewater +limewort +limey +Limicolae +limicoline +limicolous +Limidae +liminal +liminary +liminess +liming +limit +limitable +limitableness +limital +limitarian +limitary +limitate +limitation +limitative +limitatively +limited +limitedly +limitedness +limiter +limiting +limitive +limitless +limitlessly +limitlessness +limitrophe +limivorous +limma +limmer +limmock +limmu +limn +limnanth +Limnanthaceae +limnanthaceous +Limnanthemum +Limnanthes +limner +limnery +limnetic +Limnetis +limniad +limnimeter +limnimetric +limnite +limnobiologic +limnobiological +limnobiologically +limnobiology +limnobios +Limnobium +Limnocnida +limnograph +limnologic +limnological +limnologically +limnologist +limnology +limnometer +limnophile +limnophilid +Limnophilidae +limnophilous +limnoplankton +Limnorchis +Limnoria +Limnoriidae +limnorioid +Limodorum +limoid +limonene +limoniad +limonin +limonite +limonitic +limonitization +limonium +Limosa +limose +Limosella +Limosi +limous +limousine +limp +limper +limpet +limphault +limpid +limpidity +limpidly +limpidness +limpily +limpin +limpiness +limping +limpingly +limpingness +limpish +limpkin +limply +limpness +limpsy +limpwort +limpy +limsy +limu +limulid +Limulidae +limuloid +Limuloidea +Limulus +limurite +limy +Lin +lin +Lina +lina +linable +Linaceae +linaceous +linaga +linage +linaloa +linalol +linalool +linamarin +Linanthus +Linaria +linarite +linch +linchbolt +linchet +linchpin +linchpinned +lincloth +Lincoln +Lincolnian +Lincolniana +Lincolnlike +linctus +Linda +lindackerite +lindane +linden +Linder +linder +Lindera +Lindleyan +lindo +lindoite +Lindsay +Lindsey +line +linea +lineage +lineaged +lineal +lineality +lineally +lineament +lineamental +lineamentation +lineameter +linear +linearifolius +linearity +linearization +linearize +linearly +lineate +lineated +lineation +lineature +linecut +lined +lineiform +lineless +linelet +lineman +linen +Linene +linenette +linenize +linenizer +linenman +lineocircular +lineograph +lineolate +lineolated +liner +linesman +Linet +linewalker +linework +ling +linga +Lingayat +lingberry +lingbird +linge +lingel +lingenberry +linger +lingerer +lingerie +lingo +lingonberry +Lingoum +lingtow +lingtowman +lingua +linguacious +linguaciousness +linguadental +linguaeform +lingual +linguale +linguality +lingualize +lingually +linguanasal +Linguata +Linguatula +Linguatulida +Linguatulina +linguatuline +linguatuloid +linguet +linguidental +linguiform +linguipotence +linguist +linguister +linguistic +linguistical +linguistically +linguistician +linguistics +linguistry +lingula +lingulate +lingulated +Lingulella +lingulid +Lingulidae +linguliferous +linguliform +linguloid +linguodental +linguodistal +linguogingival +linguopalatal +linguopapillitis +linguoversion +lingwort +lingy +linha +linhay +linie +liniment +linin +lininess +lining +linitis +liniya +linja +linje +link +linkable +linkage +linkboy +linked +linkedness +linker +linking +linkman +links +linksmith +linkwork +linky +Linley +linn +Linnaea +Linnaean +Linnaeanism +linnaeite +Linne +linnet +lino +linolate +linoleic +linolein +linolenate +linolenic +linolenin +linoleum +linolic +linolin +linometer +linon +Linopteris +Linos +Linotype +linotype +linotyper +linotypist +linous +linoxin +linoxyn +linpin +Linsang +linseed +linsey +linstock +lint +lintel +linteled +linteling +linten +linter +lintern +lintie +lintless +lintonite +lintseed +lintwhite +linty +Linum +Linus +linwood +liny +Linyphia +Linyphiidae +liodermia +liomyofibroma +liomyoma +lion +lioncel +Lionel +lionel +lionesque +lioness +lionet +lionheart +lionhearted +lionheartedness +lionhood +lionism +lionizable +lionization +lionize +lionizer +lionlike +lionly +lionproof +lionship +Liothrix +Liotrichi +Liotrichidae +liotrichine +lip +lipa +lipacidemia +lipaciduria +Lipan +Liparian +liparian +liparid +Liparidae +Liparididae +Liparis +liparite +liparocele +liparoid +liparomphalus +liparous +lipase +lipectomy +lipemia +Lipeurus +lipide +lipin +lipless +liplet +liplike +lipoblast +lipoblastoma +Lipobranchia +lipocaic +lipocardiac +lipocele +lipoceratous +lipocere +lipochondroma +lipochrome +lipochromogen +lipoclasis +lipoclastic +lipocyte +lipodystrophia +lipodystrophy +lipoferous +lipofibroma +lipogenesis +lipogenetic +lipogenic +lipogenous +lipogram +lipogrammatic +lipogrammatism +lipogrammatist +lipography +lipohemia +lipoid +lipoidal +lipoidemia +lipoidic +lipolysis +lipolytic +lipoma +lipomata +lipomatosis +lipomatous +lipometabolic +lipometabolism +lipomorph +lipomyoma +lipomyxoma +lipopexia +lipophagic +lipophore +lipopod +Lipopoda +lipoprotein +liposarcoma +liposis +liposome +lipostomy +lipothymial +lipothymic +lipothymy +lipotrophic +lipotrophy +lipotropic +lipotropy +lipotype +Lipotyphla +lipovaccine +lipoxenous +lipoxeny +lipped +lippen +lipper +lipperings +Lippia +lippiness +lipping +lippitude +lippitudo +lippy +lipsanographer +lipsanotheca +lipstick +lipuria +lipwork +liquable +liquamen +liquate +liquation +liquefacient +liquefaction +liquefactive +liquefiable +liquefier +liquefy +liquesce +liquescence +liquescency +liquescent +liqueur +liquid +liquidable +Liquidambar +liquidamber +liquidate +liquidation +liquidator +liquidatorship +liquidity +liquidize +liquidizer +liquidless +liquidly +liquidness +liquidogenic +liquidogenous +liquidy +liquiform +liquor +liquorer +liquorish +liquorishly +liquorishness +liquorist +liquorless +lira +lirate +liration +lire +lirella +lirellate +lirelliform +lirelline +lirellous +Liriodendron +liripipe +liroconite +lis +Lisa +Lisbon +Lise +lisere +Lisette +lish +lisk +Lisle +lisle +lisp +lisper +lispingly +lispund +liss +Lissamphibia +lissamphibian +Lissencephala +lissencephalic +lissencephalous +Lissoflagellata +lissoflagellate +lissom +lissome +lissomely +lissomeness +lissotrichan +Lissotriches +lissotrichous +lissotrichy +List +list +listable +listed +listedness +listel +listen +listener +listening +lister +Listera +listerellosis +Listeria +Listerian +Listerine +Listerism +Listerize +listing +listless +listlessly +listlessness +listred +listwork +Lisuarte +lit +litaneutical +litany +litanywise +litas +litation +litch +litchi +lite +liter +literacy +literaily +literal +literalism +literalist +literalistic +literality +literalization +literalize +literalizer +literally +literalminded +literalmindedness +literalness +literarian +literariness +literary +literaryism +literate +literati +literation +literatist +literato +literator +literature +literatus +literose +literosity +lith +lithagogue +lithangiuria +lithanthrax +litharge +lithe +lithectasy +lithectomy +lithely +lithemia +lithemic +litheness +lithesome +lithesomeness +lithi +lithia +lithiasis +lithiastic +lithiate +lithic +lithifaction +lithification +lithify +lithite +lithium +litho +lithobiid +Lithobiidae +lithobioid +Lithobius +Lithocarpus +lithocenosis +lithochemistry +lithochromatic +lithochromatics +lithochromatographic +lithochromatography +lithochromography +lithochromy +lithoclase +lithoclast +lithoclastic +lithoclasty +lithoculture +lithocyst +lithocystotomy +Lithodes +lithodesma +lithodialysis +lithodid +Lithodidae +lithodomous +Lithodomus +lithofracteur +lithofractor +lithogenesis +lithogenetic +lithogenous +lithogeny +lithoglyph +lithoglypher +lithoglyphic +lithoglyptic +lithoglyptics +lithograph +lithographer +lithographic +lithographical +lithographically +lithographize +lithography +lithogravure +lithoid +lithoidite +litholabe +litholapaxy +litholatrous +litholatry +lithologic +lithological +lithologically +lithologist +lithology +litholysis +litholyte +litholytic +lithomancy +lithomarge +lithometer +lithonephria +lithonephritis +lithonephrotomy +lithontriptic +lithontriptist +lithontriptor +lithopedion +lithopedium +lithophagous +lithophane +lithophanic +lithophany +lithophilous +lithophone +lithophotography +lithophotogravure +lithophthisis +lithophyl +lithophyllous +lithophysa +lithophysal +lithophyte +lithophytic +lithophytous +lithopone +lithoprint +lithoscope +lithosian +lithosiid +Lithosiidae +Lithosiinae +lithosis +lithosol +lithosperm +lithospermon +lithospermous +Lithospermum +lithosphere +lithotint +lithotome +lithotomic +lithotomical +lithotomist +lithotomize +lithotomous +lithotomy +lithotony +lithotresis +lithotripsy +lithotriptor +lithotrite +lithotritic +lithotritist +lithotrity +lithotype +lithotypic +lithotypy +lithous +lithoxyl +lithsman +Lithuanian +Lithuanic +lithuresis +lithuria +lithy +liticontestation +litigable +litigant +litigate +litigation +litigationist +litigator +litigatory +litigiosity +litigious +litigiously +litigiousness +Litiopa +litiscontest +litiscontestation +litiscontestational +litmus +Litopterna +Litorina +Litorinidae +litorinoid +litotes +litra +Litsea +litster +litten +litter +litterateur +litterer +littermate +littery +little +littleleaf +littleneck +littleness +littlewale +littling +littlish +littoral +Littorella +littress +lituiform +lituite +Lituites +Lituitidae +Lituola +lituoline +lituoloid +liturate +liturgical +liturgically +liturgician +liturgics +liturgiological +liturgiologist +liturgiology +liturgism +liturgist +liturgistic +liturgistical +liturgize +liturgy +litus +lituus +Litvak +Lityerses +litz +Liukiu +Liv +livability +livable +livableness +live +liveborn +lived +livedo +livelihood +livelily +liveliness +livelong +lively +liven +liveness +liver +liverance +liverberry +livered +liverhearted +liverheartedness +liveried +liverish +liverishness +liverleaf +liverless +Liverpudlian +liverwort +liverwurst +livery +liverydom +liveryless +liveryman +livestock +Livian +livid +lividity +lividly +lividness +livier +living +livingless +livingly +livingness +livingstoneite +Livish +Livistona +Livonian +livor +livre +liwan +lixive +lixivial +lixiviate +lixiviation +lixiviator +lixivious +lixivium +Liyuan +Liz +Liza +lizard +lizardtail +Lizzie +llama +Llanberisslate +Llandeilo +Llandovery +llano +llautu +Lleu +Llew +Lloyd +Lludd +llyn +Lo +lo +Loa +loa +loach +load +loadage +loaded +loaden +loader +loading +loadless +loadpenny +loadsome +loadstone +loaf +loafer +loaferdom +loaferish +loafing +loafingly +loaflet +loaghtan +loam +loamily +loaminess +loaming +loamless +Loammi +loamy +loan +loanable +loaner +loanin +loanmonger +loanword +Loasa +Loasaceae +loasaceous +loath +loathe +loather +loathful +loathfully +loathfulness +loathing +loathingly +loathliness +loathly +loathness +loathsome +loathsomely +loathsomeness +Loatuko +loave +lob +Lobachevskian +lobal +Lobale +lobar +Lobaria +Lobata +Lobatae +lobate +lobated +lobately +lobation +lobber +lobbish +lobby +lobbyer +lobbyism +lobbyist +lobbyman +lobcock +lobe +lobectomy +lobed +lobefoot +lobefooted +lobeless +lobelet +Lobelia +Lobeliaceae +lobeliaceous +lobelin +lobeline +lobellated +lobfig +lobiform +lobigerous +lobing +lobiped +loblolly +lobo +lobola +lobopodium +Lobosa +lobose +lobotomy +lobscourse +lobscouse +lobscouser +lobster +lobstering +lobsterish +lobsterlike +lobsterproof +lobtail +lobular +Lobularia +lobularly +lobulate +lobulated +lobulation +lobule +lobulette +lobulose +lobulous +lobworm +loca +locable +local +locale +localism +localist +localistic +locality +localizable +localization +localize +localizer +locally +localness +locanda +Locarnist +Locarnite +Locarnize +Locarno +locate +location +locational +locative +locator +locellate +locellus +loch +lochage +lochan +lochetic +lochia +lochial +lochiocolpos +lochiocyte +lochiometra +lochiometritis +lochiopyra +lochiorrhagia +lochiorrhea +lochioschesis +Lochlin +lochometritis +lochoperitonitis +lochopyra +lochus +lochy +loci +lociation +lock +lockable +lockage +Lockatong +lockbox +locked +locker +lockerman +locket +lockful +lockhole +Lockian +Lockianism +locking +lockjaw +lockless +locklet +lockmaker +lockmaking +lockman +lockout +lockpin +Lockport +lockram +locksman +locksmith +locksmithery +locksmithing +lockspit +lockup +lockwork +locky +loco +locodescriptive +locofoco +Locofocoism +locoism +locomobile +locomobility +locomote +locomotility +locomotion +locomotive +locomotively +locomotiveman +locomotiveness +locomotivity +locomotor +locomotory +locomutation +locoweed +Locrian +Locrine +loculament +loculamentose +loculamentous +locular +loculate +loculated +loculation +locule +loculicidal +loculicidally +loculose +loculus +locum +locus +locust +locusta +locustal +locustberry +locustelle +locustid +Locustidae +locusting +locustlike +locution +locutor +locutorship +locutory +lod +Loddigesia +lode +lodemanage +lodesman +lodestar +lodestone +lodestuff +lodge +lodgeable +lodged +lodgeful +lodgeman +lodgepole +lodger +lodgerdom +lodging +lodginghouse +lodgings +lodgment +Lodha +lodicule +Lodoicea +Lodowic +Lodowick +Lodur +Loegria +loess +loessal +loessial +loessic +loessland +loessoid +lof +lofstelle +loft +lofter +loftily +loftiness +lofting +loftless +loftman +loftsman +lofty +log +loganberry +Logania +Loganiaceae +loganiaceous +loganin +logaoedic +logarithm +logarithmal +logarithmetic +logarithmetical +logarithmetically +logarithmic +logarithmical +logarithmically +logarithmomancy +logbook +logcock +loge +logeion +logeum +loggat +logged +logger +loggerhead +loggerheaded +loggia +loggin +logging +loggish +loghead +logheaded +logia +logic +logical +logicalist +logicality +logicalization +logicalize +logically +logicalness +logicaster +logician +logicism +logicist +logicity +logicize +logicless +logie +login +logion +logistic +logistical +logistician +logistics +logium +loglet +loglike +logman +logocracy +logodaedaly +logogogue +logogram +logogrammatic +logograph +logographer +logographic +logographical +logographically +logography +logogriph +logogriphic +logoi +logolatry +logology +logomach +logomacher +logomachic +logomachical +logomachist +logomachize +logomachy +logomancy +logomania +logomaniac +logometer +logometric +logometrical +logometrically +logopedia +logopedics +logorrhea +logos +logothete +logotype +logotypy +Logres +Logria +Logris +logroll +logroller +logrolling +logway +logwise +logwood +logwork +logy +lohan +Lohana +Lohar +lohoch +loimic +loimography +loimology +loin +loincloth +loined +loir +Lois +Loiseleuria +loiter +loiterer +loiteringly +loiteringness +loka +lokao +lokaose +lokapala +loke +loket +lokiec +Lokindra +Lokman +Lola +Loliginidae +Loligo +Lolium +loll +Lollard +Lollardian +Lollardism +Lollardist +Lollardize +Lollardlike +Lollardry +Lollardy +loller +lollingite +lollingly +lollipop +lollop +lollopy +lolly +Lolo +loma +lomastome +lomatine +lomatinous +Lomatium +Lombard +lombard +Lombardeer +Lombardesque +Lombardian +Lombardic +lomboy +Lombrosian +loment +lomentaceous +Lomentaria +lomentariaceous +lomentum +lomita +lommock +Lonchocarpus +Lonchopteridae +Londinensian +Londoner +Londonese +Londonesque +Londonian +Londonish +Londonism +Londonization +Londonize +Londony +Londres +lone +lonelihood +lonelily +loneliness +lonely +loneness +lonesome +lonesomely +lonesomeness +long +longa +longan +longanimity +longanimous +Longaville +longbeak +longbeard +longboat +longbow +longcloth +longe +longear +longer +longeval +longevity +longevous +longfelt +longfin +longful +longhair +longhand +longhead +longheaded +longheadedly +longheadedness +longhorn +longicaudal +longicaudate +longicone +longicorn +Longicornia +longilateral +longilingual +longiloquence +longimanous +longimetric +longimetry +longing +longingly +longingness +Longinian +longinquity +longipennate +longipennine +longirostral +longirostrate +longirostrine +Longirostrines +longisection +longish +longitude +longitudinal +longitudinally +longjaw +longleaf +longlegs +longly +longmouthed +longness +Longobard +Longobardi +Longobardian +Longobardic +longs +longshanks +longshore +longshoreman +longsome +longsomely +longsomeness +longspun +longspur +longtail +longue +longulite +longway +longways +longwise +longwool +longwork +longwort +Lonhyn +Lonicera +Lonk +lonquhard +lontar +loo +looby +lood +loof +loofah +loofie +loofness +look +looker +looking +lookout +lookum +loom +loomer +loomery +looming +loon +loonery +looney +loony +loop +looper +loopful +loophole +looping +loopist +looplet +looplike +loopy +loose +loosely +loosemouthed +loosen +loosener +looseness +looser +loosestrife +loosing +loosish +loot +lootable +looten +looter +lootie +lootiewallah +lootsman +lop +lope +loper +Lopezia +lophiid +Lophiidae +lophine +Lophiodon +lophiodont +Lophiodontidae +lophiodontoid +Lophiola +Lophiomyidae +Lophiomyinae +Lophiomys +lophiostomate +lophiostomous +lophobranch +lophobranchiate +Lophobranchii +lophocalthrops +lophocercal +Lophocome +Lophocomi +Lophodermium +lophodont +Lophophora +lophophoral +lophophore +Lophophorinae +lophophorine +Lophophorus +lophophytosis +Lophopoda +Lophornis +Lophortyx +lophosteon +lophotriaene +lophotrichic +lophotrichous +Lophura +lopolith +loppard +lopper +loppet +lopping +loppy +lopseed +lopsided +lopsidedly +lopsidedness +lopstick +loquacious +loquaciously +loquaciousness +loquacity +loquat +loquence +loquent +loquently +Lora +lora +loral +loran +lorandite +loranskite +Loranthaceae +loranthaceous +Loranthus +lorarius +lorate +lorcha +Lord +lord +lording +lordkin +lordless +lordlet +lordlike +lordlily +lordliness +lordling +lordly +lordolatry +lordosis +lordotic +lordship +lordwood +lordy +lore +loreal +lored +loreless +Loren +Lorenzan +lorenzenite +Lorenzo +Lorettine +lorettoite +lorgnette +Lori +lori +loric +lorica +loricarian +Loricariidae +loricarioid +Loricata +loricate +Loricati +lorication +loricoid +Lorien +lorikeet +lorilet +lorimer +loriot +loris +Lorius +lormery +lorn +lornness +loro +Lorraine +Lorrainer +Lorrainese +lorriker +lorry +lors +lorum +lory +losable +losableness +lose +losel +loselism +losenger +loser +losh +losing +loss +lossenite +lossless +lossproof +lost +lostling +lostness +Lot +lot +Lota +lota +lotase +lote +lotebush +Lotharingian +lotic +lotiform +lotion +lotment +Lotophagi +lotophagous +lotophagously +lotrite +lots +Lotta +Lotte +lotter +lottery +Lottie +lotto +Lotuko +lotus +lotusin +lotuslike +Lou +louch +louchettes +loud +louden +loudering +loudish +loudly +loudmouthed +loudness +louey +lough +lougheen +Louie +Louiqa +Louis +Louisa +Louise +Louisiana +Louisianian +louisine +louk +Loukas +loukoum +loulu +lounder +lounderer +lounge +lounger +lounging +loungingly +loungy +Loup +loup +loupe +lour +lourdy +louse +louseberry +lousewort +lousily +lousiness +louster +lousy +lout +louter +louther +loutish +loutishly +loutishness +loutrophoros +louty +louvar +louver +louvered +louvering +louverwork +Louvre +lovability +lovable +lovableness +lovably +lovage +love +lovebird +loveflower +loveful +lovelass +loveless +lovelessly +lovelessness +lovelihead +lovelily +loveliness +loveling +lovelock +lovelorn +lovelornness +lovely +loveman +lovemate +lovemonger +loveproof +lover +loverdom +lovered +loverhood +lovering +loverless +loverliness +loverly +lovership +loverwise +lovesick +lovesickness +lovesome +lovesomely +lovesomeness +loveworth +loveworthy +loving +lovingly +lovingness +low +lowa +lowan +lowbell +lowborn +lowboy +lowbred +lowdah +lowder +loweite +Lowell +lower +lowerable +lowerclassman +lowerer +lowering +loweringly +loweringness +lowermost +lowery +lowigite +lowish +lowishly +lowishness +lowland +lowlander +lowlily +lowliness +lowly +lowmen +lowmost +lown +lowness +lownly +lowth +Lowville +lowwood +lowy +lox +loxia +loxic +Loxiinae +loxoclase +loxocosm +loxodograph +Loxodon +loxodont +Loxodonta +loxodontous +loxodrome +loxodromic +loxodromical +loxodromically +loxodromics +loxodromism +Loxolophodon +loxolophodont +Loxomma +loxophthalmus +Loxosoma +Loxosomidae +loxotic +loxotomy +loy +loyal +loyalism +loyalist +loyalize +loyally +loyalness +loyalty +Loyd +Loyolism +Loyolite +lozenge +lozenged +lozenger +lozengeways +lozengewise +lozengy +Lu +Luba +lubber +lubbercock +Lubberland +lubberlike +lubberliness +lubberly +lube +lubra +lubric +lubricant +lubricate +lubrication +lubricational +lubricative +lubricator +lubricatory +lubricious +lubricity +lubricous +lubrifaction +lubrification +lubrify +lubritorian +lubritorium +Luc +Lucan +Lucania +lucanid +Lucanidae +Lucanus +lucarne +Lucayan +lucban +Lucchese +luce +lucence +lucency +lucent +Lucentio +lucently +Luceres +lucern +lucernal +Lucernaria +lucernarian +Lucernariidae +lucerne +lucet +Luchuan +Lucia +Lucian +Luciana +lucible +lucid +lucida +lucidity +lucidly +lucidness +lucifee +Lucifer +luciferase +Luciferian +Luciferidae +luciferin +luciferoid +luciferous +luciferously +luciferousness +lucific +luciform +lucifugal +lucifugous +lucigen +Lucile +Lucilia +lucimeter +Lucina +Lucinacea +Lucinda +Lucinidae +lucinoid +Lucite +Lucius +lucivee +luck +lucken +luckful +luckie +luckily +luckiness +luckless +lucklessly +lucklessness +Lucknow +lucky +lucration +lucrative +lucratively +lucrativeness +lucre +Lucrece +Lucretia +Lucretian +Lucretius +lucriferous +lucriferousness +lucrific +lucrify +Lucrine +luctation +luctiferous +luctiferousness +lucubrate +lucubration +lucubrator +lucubratory +lucule +luculent +luculently +Lucullan +lucullite +Lucuma +lucumia +Lucumo +lucumony +Lucy +lucy +ludden +Luddism +Luddite +Ludditism +ludefisk +Ludgate +Ludgathian +Ludgatian +Ludian +ludibrious +ludibry +ludicropathetic +ludicroserious +ludicrosity +ludicrosplenetic +ludicrous +ludicrously +ludicrousness +ludification +ludlamite +Ludlovian +Ludlow +ludo +Ludolphian +Ludwig +ludwigite +lue +Luella +lues +luetic +luetically +lufberry +lufbery +luff +Luffa +Lug +lug +Luganda +luge +luger +luggage +luggageless +luggar +lugged +lugger +luggie +Luggnagg +lugmark +Lugnas +lugsail +lugsome +lugubriosity +lugubrious +lugubriously +lugubriousness +lugworm +luhinga +Lui +Luian +Luigi +luigino +Luis +Luiseno +Luite +lujaurite +Lukas +Luke +luke +lukely +lukeness +lukewarm +lukewarmish +lukewarmly +lukewarmness +lukewarmth +Lula +lulab +lull +lullaby +luller +Lullian +lulliloo +lullingly +Lulu +lulu +Lum +lum +lumachel +lumbaginous +lumbago +lumbang +lumbar +lumbarization +lumbayao +lumber +lumberdar +lumberdom +lumberer +lumbering +lumberingly +lumberingness +lumberjack +lumberless +lumberly +lumberman +lumbersome +lumberyard +lumbocolostomy +lumbocolotomy +lumbocostal +lumbodorsal +lumbodynia +lumbosacral +lumbovertebral +lumbrical +lumbricalis +Lumbricidae +lumbriciform +lumbricine +lumbricoid +lumbricosis +Lumbricus +lumbrous +lumen +luminaire +Luminal +luminal +luminance +luminant +luminarious +luminarism +luminarist +luminary +luminate +lumination +luminative +luminator +lumine +luminesce +luminescence +luminescent +luminiferous +luminificent +luminism +luminist +luminologist +luminometer +luminosity +luminous +luminously +luminousness +lummox +lummy +lump +lumper +lumpet +lumpfish +lumpily +lumpiness +lumping +lumpingly +lumpish +lumpishly +lumpishness +lumpkin +lumpman +lumpsucker +lumpy +luna +lunacy +lunambulism +lunar +lunare +Lunaria +lunarian +lunarist +lunarium +lunary +lunate +lunatellus +lunately +lunatic +lunatically +lunation +lunatize +lunatum +lunch +luncheon +luncheoner +luncheonette +luncheonless +luncher +lunchroom +Lunda +Lundinarium +lundress +lundyfoot +lune +Lunel +lunes +lunette +lung +lunge +lunged +lungeous +lunger +lungfish +lungflower +lungful +lungi +lungie +lungis +lungless +lungmotor +lungsick +lungworm +lungwort +lungy +lunicurrent +luniform +lunisolar +lunistice +lunistitial +lunitidal +Lunka +lunkhead +lunn +lunoid +lunt +lunula +lunular +Lunularia +lunulate +lunulated +lunule +lunulet +lunulite +Lunulites +Luo +lupanarian +lupanine +lupe +lupeol +lupeose +Lupercal +Lupercalia +Lupercalian +Luperci +lupetidine +lupicide +Lupid +lupiform +lupinaster +lupine +lupinin +lupinine +lupinosis +lupinous +Lupinus +lupis +lupoid +lupous +lupulic +lupulin +lupuline +lupulinic +lupulinous +lupulinum +lupulus +lupus +lupuserythematosus +Lur +lura +lural +lurch +lurcher +lurchingfully +lurchingly +lurchline +lurdan +lurdanism +lure +lureful +lurement +lurer +luresome +lurg +lurgworm +Luri +lurid +luridity +luridly +luridness +luringly +lurk +lurker +lurkingly +lurkingness +lurky +lurrier +lurry +Lusatian +Luscinia +luscious +lusciously +lusciousness +lush +Lushai +lushburg +Lushei +lusher +lushly +lushness +lushy +Lusiad +Lusian +Lusitania +Lusitanian +lusk +lusky +lusory +lust +luster +lusterer +lusterless +lusterware +lustful +lustfully +lustfulness +lustihead +lustily +lustiness +lustless +lustra +lustral +lustrant +lustrate +lustration +lustrative +lustratory +lustreless +lustrical +lustrification +lustrify +lustrine +lustring +lustrous +lustrously +lustrousness +lustrum +lusty +lut +lutaceous +lutanist +lutany +Lutao +lutation +Lutayo +lute +luteal +lutecia +lutecium +lutein +luteinization +luteinize +lutelet +lutemaker +lutemaking +luteo +luteocobaltic +luteofulvous +luteofuscescent +luteofuscous +luteolin +luteolous +luteoma +luteorufescent +luteous +luteovirescent +luter +lutescent +lutestring +Lutetia +Lutetian +lutetium +luteway +lutfisk +Luther +Lutheran +Lutheranic +Lutheranism +Lutheranize +Lutheranizer +Lutherism +Lutherist +luthern +luthier +lutianid +Lutianidae +lutianoid +Lutianus +lutidine +lutidinic +luting +lutist +Lutjanidae +Lutjanus +lutose +Lutra +Lutraria +Lutreola +lutrin +Lutrinae +lutrine +lutulence +lutulent +Luvaridae +Luvian +Luvish +Luwian +lux +luxate +luxation +luxe +Luxemburger +Luxemburgian +luxulianite +luxuriance +luxuriancy +luxuriant +luxuriantly +luxuriantness +luxuriate +luxuriation +luxurious +luxuriously +luxuriousness +luxurist +luxury +luxus +Luzula +Lwo +ly +lyam +lyard +Lyas +Lycaena +lycaenid +Lycaenidae +lycanthrope +lycanthropia +lycanthropic +lycanthropist +lycanthropize +lycanthropous +lycanthropy +lyceal +lyceum +Lychnic +Lychnis +lychnomancy +lychnoscope +lychnoscopic +Lycian +lycid +Lycidae +Lycium +Lycodes +Lycodidae +lycodoid +lycopene +Lycoperdaceae +lycoperdaceous +Lycoperdales +lycoperdoid +Lycoperdon +lycoperdon +Lycopersicon +lycopin +lycopod +lycopode +Lycopodiaceae +lycopodiaceous +Lycopodiales +Lycopodium +Lycopsida +Lycopsis +Lycopus +lycorine +Lycosa +lycosid +Lycosidae +lyctid +Lyctidae +Lyctus +Lycus +lyddite +Lydia +Lydian +lydite +lye +Lyencephala +lyencephalous +lyery +lygaeid +Lygaeidae +Lygeum +Lygodium +Lygosoma +lying +lyingly +Lymantria +lymantriid +Lymantriidae +lymhpangiophlebitis +Lymnaea +lymnaean +lymnaeid +Lymnaeidae +lymph +lymphad +lymphadenectasia +lymphadenectasis +lymphadenia +lymphadenitis +lymphadenoid +lymphadenoma +lymphadenopathy +lymphadenosis +lymphaemia +lymphagogue +lymphangeitis +lymphangial +lymphangiectasis +lymphangiectatic +lymphangiectodes +lymphangiitis +lymphangioendothelioma +lymphangiofibroma +lymphangiology +lymphangioma +lymphangiomatous +lymphangioplasty +lymphangiosarcoma +lymphangiotomy +lymphangitic +lymphangitis +lymphatic +lymphatical +lymphation +lymphatism +lymphatitis +lymphatolysin +lymphatolysis +lymphatolytic +lymphectasia +lymphedema +lymphemia +lymphenteritis +lymphoblast +lymphoblastic +lymphoblastoma +lymphoblastosis +lymphocele +lymphocyst +lymphocystosis +lymphocyte +lymphocythemia +lymphocytic +lymphocytoma +lymphocytomatosis +lymphocytosis +lymphocytotic +lymphocytotoxin +lymphodermia +lymphoduct +lymphogenic +lymphogenous +lymphoglandula +lymphogranuloma +lymphoid +lymphoidectomy +lymphology +lymphoma +lymphomatosis +lymphomatous +lymphomonocyte +lymphomyxoma +lymphopathy +lymphopenia +lymphopenial +lymphopoiesis +lymphopoietic +lymphoprotease +lymphorrhage +lymphorrhagia +lymphorrhagic +lymphorrhea +lymphosarcoma +lymphosarcomatosis +lymphosarcomatous +lymphosporidiosis +lymphostasis +lymphotaxis +lymphotome +lymphotomy +lymphotoxemia +lymphotoxin +lymphotrophic +lymphotrophy +lymphous +lymphuria +lymphy +lyncean +Lynceus +lynch +lynchable +lyncher +Lyncid +lyncine +Lyndon +Lynette +Lyngbyaceae +Lyngbyeae +Lynn +Lynne +Lynnette +lynnhaven +lynx +Lyomeri +lyomerous +Lyon +Lyonese +Lyonetia +lyonetiid +Lyonetiidae +Lyonnais +lyonnaise +Lyonnesse +lyophile +lyophilization +lyophilize +lyophobe +Lyopoma +Lyopomata +lyopomatous +lyotrope +lypemania +Lyperosia +lypothymia +lyra +Lyraid +lyrate +lyrated +lyrately +lyraway +lyre +lyrebird +lyreflower +lyreman +lyretail +lyric +lyrical +lyrically +lyricalness +lyrichord +lyricism +lyricist +lyricize +Lyrid +lyriform +lyrism +lyrist +Lyrurus +lys +Lysander +lysate +lyse +Lysenkoism +lysidine +lysigenic +lysigenous +lysigenously +Lysiloma +Lysimachia +Lysimachus +lysimeter +lysin +lysine +lysis +Lysistrata +lysogen +lysogenesis +lysogenetic +lysogenic +lysozyme +lyssa +lyssic +lyssophobia +lyterian +Lythraceae +lythraceous +Lythrum +lytic +lytta +lyxose +M +m +Ma +ma +maam +maamselle +Maarten +Mab +Maba +Mabel +Mabellona +mabi +Mabinogion +mabolo +Mac +mac +macaasim +macabre +macabresque +Macaca +macaco +Macacus +macadam +Macadamia +macadamite +macadamization +macadamize +macadamizer +Macaglia +macan +macana +Macanese +macao +macaque +Macaranga +Macarani +Macareus +macarism +macarize +macaroni +macaronic +macaronical +macaronically +macaronicism +macaronism +macaroon +Macartney +Macassar +Macassarese +macaw +Macbeth +Maccabaeus +Maccabean +Maccabees +maccaboy +macco +maccoboy +Macduff +mace +macedoine +Macedon +Macedonian +Macedonic +macehead +maceman +macer +macerate +macerater +maceration +Macflecknoe +machairodont +Machairodontidae +Machairodontinae +Machairodus +machan +machar +machete +Machetes +machi +Machiavel +Machiavellian +Machiavellianism +Machiavellianly +Machiavellic +Machiavellism +machiavellist +Machiavellistic +machicolate +machicolation +machicoulis +Machicui +machila +Machilidae +Machilis +machin +machinability +machinable +machinal +machinate +machination +machinator +machine +machineful +machineless +machinelike +machinely +machineman +machinemonger +machiner +machinery +machinification +machinify +machinism +machinist +machinization +machinize +machinoclast +machinofacture +machinotechnique +machinule +Machogo +machopolyp +machree +macies +Macigno +macilence +macilency +macilent +mack +mackenboy +mackerel +mackereler +mackereling +Mackinaw +mackins +mackintosh +mackintoshite +mackle +macklike +macle +Macleaya +macled +Maclura +Maclurea +maclurin +Macmillanite +maco +Macon +maconite +Macracanthorhynchus +macracanthrorhynchiasis +macradenous +macrame +macrander +macrandrous +macrauchene +Macrauchenia +macraucheniid +Macraucheniidae +macraucheniiform +macrauchenioid +macrencephalic +macrencephalous +macro +macroanalysis +macroanalyst +macroanalytical +macrobacterium +macrobian +macrobiosis +macrobiote +macrobiotic +macrobiotics +Macrobiotus +macroblast +macrobrachia +macrocarpous +Macrocentrinae +Macrocentrus +macrocephalia +macrocephalic +macrocephalism +macrocephalous +macrocephalus +macrocephaly +macrochaeta +macrocheilia +Macrochelys +macrochemical +macrochemically +macrochemistry +Macrochira +macrochiran +Macrochires +macrochiria +Macrochiroptera +macrochiropteran +macrocladous +macroclimate +macroclimatic +macrococcus +macrocoly +macroconidial +macroconidium +macroconjugant +macrocornea +macrocosm +macrocosmic +macrocosmical +macrocosmology +macrocosmos +macrocrystalline +macrocyst +Macrocystis +macrocyte +macrocythemia +macrocytic +macrocytosis +macrodactyl +macrodactylia +macrodactylic +macrodactylism +macrodactylous +macrodactyly +macrodiagonal +macrodomatic +macrodome +macrodont +macrodontia +macrodontism +macroelement +macroergate +macroevolution +macrofarad +macrogamete +macrogametocyte +macrogamy +macrogastria +macroglossate +macroglossia +macrognathic +macrognathism +macrognathous +macrogonidium +macrograph +macrographic +macrography +macrolepidoptera +macrolepidopterous +macrology +macromandibular +macromania +macromastia +macromazia +macromelia +macromeral +macromere +macromeric +macromerite +macromeritic +macromesentery +macrometer +macromethod +macromolecule +macromyelon +macromyelonal +macron +macronuclear +macronucleus +macronutrient +macropetalous +macrophage +macrophagocyte +macrophagus +Macrophoma +macrophotograph +macrophotography +macrophyllous +macrophysics +macropia +macropinacoid +macropinacoidal +macroplankton +macroplasia +macroplastia +macropleural +macropodia +Macropodidae +Macropodinae +macropodine +macropodous +macroprism +macroprosopia +macropsia +macropteran +macropterous +Macropus +Macropygia +macropyramid +macroreaction +Macrorhamphosidae +Macrorhamphosus +macrorhinia +Macrorhinus +macroscelia +Macroscelides +macroscian +macroscopic +macroscopical +macroscopically +macroseism +macroseismic +macroseismograph +macrosepalous +macroseptum +macrosmatic +macrosomatia +macrosomatous +macrosomia +macrosplanchnic +macrosporange +macrosporangium +macrospore +macrosporic +Macrosporium +macrosporophore +macrosporophyl +macrosporophyll +Macrostachya +macrostomatous +macrostomia +macrostructural +macrostructure +macrostylospore +macrostylous +macrosymbiont +macrothere +Macrotheriidae +macrotherioid +Macrotherium +macrotherm +macrotia +macrotin +Macrotolagus +macrotome +macrotone +macrotous +macrourid +Macrouridae +Macrourus +Macrozamia +macrozoogonidium +macrozoospore +Macrura +macrural +macruran +macruroid +macrurous +mactation +Mactra +Mactridae +mactroid +macuca +macula +macular +maculate +maculated +maculation +macule +maculicole +maculicolous +maculiferous +maculocerebral +maculopapular +maculose +Macusi +macuta +mad +Madagascan +Madagascar +Madagascarian +Madagass +madam +madame +madapollam +madarosis +madarotic +madbrain +madbrained +madcap +madden +maddening +maddeningly +maddeningness +madder +madderish +madderwort +madding +maddingly +maddish +maddle +made +Madecase +madefaction +madefy +Madegassy +Madeira +Madeiran +Madeline +madeline +Madelon +madescent +Madge +madhouse +madhuca +Madhva +Madi +Madia +madid +madidans +Madiga +madisterium +madling +madly +madman +madnep +madness +mado +Madoc +Madonna +Madonnahood +Madonnaish +Madonnalike +madoqua +Madotheca +madrague +Madras +madrasah +Madrasi +madreperl +Madrepora +Madreporacea +madreporacean +Madreporaria +madreporarian +madrepore +madreporian +madreporic +madreporiform +madreporite +madreporitic +Madrid +madrier +madrigal +madrigaler +madrigaletto +madrigalian +madrigalist +Madrilene +Madrilenian +madrona +madship +madstone +Madurese +maduro +madweed +madwoman +madwort +mae +Maeandra +Maeandrina +maeandrine +maeandriniform +maeandrinoid +maeandroid +Maecenas +Maecenasship +maegbote +Maelstrom +Maemacterion +maenad +maenadic +maenadism +maenaite +Maenalus +Maenidae +Maeonian +Maeonides +maestri +maestro +maffia +maffick +mafficker +maffle +mafflin +mafic +mafoo +mafura +mag +Maga +Magadhi +magadis +magadize +Magahi +Magalensia +magani +magas +magazinable +magazinage +magazine +magazinelet +magaziner +magazinette +magazinish +magazinism +magazinist +magaziny +Magdalen +Magdalene +Magdalenian +mage +Magellan +Magellanian +Magellanic +magenta +magged +Maggie +maggle +maggot +maggotiness +maggotpie +maggoty +Maggy +Magh +Maghi +Maghrib +Maghribi +Magi +magi +Magian +Magianism +magic +magical +magicalize +magically +magicdom +magician +magicianship +magicked +magicking +Magindanao +magiric +magirics +magirist +magiristic +magirological +magirologist +magirology +Magism +magister +magisterial +magisteriality +magisterially +magisterialness +magistery +magistracy +magistral +magistrality +magistrally +magistrand +magistrant +magistrate +magistrateship +magistratic +magistratical +magistratically +magistrative +magistrature +Maglemose +Maglemosean +Maglemosian +magma +magmatic +magnanimity +magnanimous +magnanimously +magnanimousness +magnascope +magnascopic +magnate +magnecrystallic +magnelectric +magneoptic +magnes +magnesia +magnesial +magnesian +magnesic +magnesioferrite +magnesite +magnesium +magnet +magneta +magnetic +magnetical +magnetically +magneticalness +magnetician +magnetics +magnetiferous +magnetification +magnetify +magnetimeter +magnetism +magnetist +magnetite +magnetitic +magnetizability +magnetizable +magnetization +magnetize +magnetizer +magneto +magnetobell +magnetochemical +magnetochemistry +magnetod +magnetodynamo +magnetoelectric +magnetoelectrical +magnetoelectricity +magnetogenerator +magnetogram +magnetograph +magnetographic +magnetoid +magnetomachine +magnetometer +magnetometric +magnetometrical +magnetometrically +magnetometry +magnetomotive +magnetomotor +magneton +magnetooptic +magnetooptical +magnetooptics +magnetophone +magnetophonograph +magnetoplumbite +magnetoprinter +magnetoscope +magnetostriction +magnetotelegraph +magnetotelephone +magnetotherapy +magnetotransmitter +magnetron +magnicaudate +magnicaudatous +magnifiable +magnific +magnifical +magnifically +Magnificat +magnification +magnificative +magnifice +magnificence +magnificent +magnificently +magnificentness +magnifico +magnifier +magnify +magniloquence +magniloquent +magniloquently +magniloquy +magnipotence +magnipotent +magnirostrate +magnisonant +magnitude +magnitudinous +magnochromite +magnoferrite +Magnolia +magnolia +Magnoliaceae +magnoliaceous +magnum +Magnus +Magog +magot +magpie +magpied +magpieish +magsman +maguari +maguey +Magyar +Magyaran +Magyarism +Magyarization +Magyarize +Mah +maha +mahaleb +mahalla +mahant +mahar +maharaja +maharajrana +maharana +maharanee +maharani +maharao +Maharashtri +maharawal +maharawat +mahatma +mahatmaism +Mahayana +Mahayanism +Mahayanist +Mahayanistic +Mahdi +Mahdian +Mahdiship +Mahdism +Mahdist +Mahesh +Mahi +Mahican +mahmal +Mahmoud +mahmudi +mahoe +mahoganize +mahogany +mahoitre +maholi +maholtine +Mahomet +Mahometry +mahone +Mahonia +Mahori +Mahound +mahout +Mahra +Mahran +Mahri +mahseer +mahua +mahuang +Maia +Maiacca +Maianthemum +maid +Maida +maidan +maiden +maidenhair +maidenhead +maidenhood +maidenish +maidenism +maidenlike +maidenliness +maidenly +maidenship +maidenweed +maidhood +Maidie +maidish +maidism +maidkin +maidlike +maidling +maidservant +Maidu +maidy +maiefic +maieutic +maieutical +maieutics +maigre +maiid +Maiidae +mail +mailable +mailbag +mailbox +mailclad +mailed +mailer +mailguard +mailie +maillechort +mailless +mailman +mailplane +maim +maimed +maimedly +maimedness +maimer +maimon +Maimonidean +Maimonist +main +Mainan +Maine +mainferre +mainlander +mainly +mainmast +mainmortable +mainour +mainpast +mainpernable +mainpernor +mainpin +mainport +mainpost +mainprise +mains +mainsail +mainsheet +mainspring +mainstay +Mainstreeter +Mainstreetism +maint +maintain +maintainable +maintainableness +maintainer +maintainment +maintainor +maintenance +Maintenon +maintop +maintopman +maioid +Maioidea +maioidean +Maioli +Maiongkong +Maipure +mairatour +maire +maisonette +Maithili +maitlandite +Maitreya +Maius +maize +maizebird +maizenic +maizer +Maja +Majagga +majagua +Majesta +majestic +majestical +majestically +majesticalness +majesticness +majestious +majesty +majestyship +Majlis +majo +majolica +majolist +majoon +Major +major +majorate +majoration +Majorcan +majorette +Majorism +Majorist +Majoristic +majority +majorize +majorship +majuscular +majuscule +makable +Makah +Makaraka +Makari +Makassar +make +makebate +makedom +makefast +maker +makeress +makership +makeshift +makeshiftiness +makeshiftness +makeshifty +makeweight +makhzan +maki +makimono +making +makluk +mako +Makonde +makroskelic +Maku +Makua +makuk +mal +mala +malaanonang +Malabar +Malabarese +malabathrum +malacanthid +Malacanthidae +malacanthine +Malacanthus +Malacca +Malaccan +malaccident +Malaceae +malaceous +malachite +malacia +Malaclemys +Malaclypse +Malacobdella +Malacocotylea +malacoderm +Malacodermatidae +malacodermatous +Malacodermidae +malacodermous +malacoid +malacolite +malacological +malacologist +malacology +malacon +malacophilous +malacophonous +malacophyllous +malacopod +Malacopoda +malacopodous +malacopterygian +Malacopterygii +malacopterygious +Malacoscolices +Malacoscolicine +Malacosoma +Malacostraca +malacostracan +malacostracology +malacostracous +malactic +maladaptation +maladdress +maladive +maladjust +maladjusted +maladjustive +maladjustment +maladminister +maladministration +maladministrator +maladroit +maladroitly +maladroitness +maladventure +malady +Malaga +Malagasy +Malagigi +malagma +malaguena +malahack +malaise +malakin +malalignment +malambo +malandered +malanders +malandrous +malanga +malapaho +malapert +malapertly +malapertness +malapi +malapplication +malappointment +malappropriate +malappropriation +malaprop +malapropian +malapropish +malapropism +malapropoism +malapropos +Malapterurus +malar +malaria +malarial +malariaproof +malarin +malarioid +malariologist +malariology +malarious +malarkey +malaroma +malarrangement +malasapsap +malassimilation +malassociation +malate +malati +malattress +malax +malaxable +malaxage +malaxate +malaxation +malaxator +malaxerman +Malaxis +Malay +Malayalam +Malayalim +Malayan +Malayic +Malayize +Malayoid +Malaysian +malbehavior +malbrouck +malchite +Malchus +Malcolm +malconceived +malconduct +malconformation +malconstruction +malcontent +malcontented +malcontentedly +malcontentedness +malcontentism +malcontently +malcontentment +malconvenance +malcreated +malcultivation +maldeveloped +maldevelopment +maldigestion +maldirection +maldistribution +Maldivian +maldonite +malduck +Male +male +malease +maleate +Malebolge +Malebolgian +Malebolgic +Malebranchism +Malecite +maledicent +maledict +malediction +maledictive +maledictory +maleducation +malefaction +malefactor +malefactory +malefactress +malefical +malefically +maleficence +maleficent +maleficial +maleficiate +maleficiation +maleic +maleinoid +malella +Malemute +maleness +malengine +maleo +maleruption +Malesherbia +Malesherbiaceae +malesherbiaceous +malevolence +malevolency +malevolent +malevolently +malexecution +malfeasance +malfeasant +malfed +malformation +malformed +malfortune +malfunction +malgovernment +malgrace +malguzar +malguzari +malhonest +malhygiene +mali +malic +malice +maliceful +maliceproof +malicho +malicious +maliciously +maliciousness +malicorium +malidentification +maliferous +maliform +malign +malignance +malignancy +malignant +malignantly +malignation +maligner +malignify +malignity +malignly +malignment +malik +malikadna +malikala +malikana +Maliki +Malikite +maline +malines +malinfluence +malinger +malingerer +malingery +Malinois +malinowskite +malinstitution +malinstruction +malintent +malism +malison +malist +malistic +malkin +Malkite +mall +malladrite +mallangong +mallard +mallardite +malleability +malleabilization +malleable +malleableize +malleableized +malleableness +malleablize +malleal +mallear +malleate +malleation +mallee +Malleifera +malleiferous +malleiform +mallein +malleinization +malleinize +mallemaroking +mallemuck +malleoincudal +malleolable +malleolar +malleolus +mallet +malleus +Malling +Mallophaga +mallophagan +mallophagous +malloseismic +Mallotus +mallow +mallowwort +Malloy +mallum +mallus +malm +Malmaison +malmignatte +malmsey +malmstone +malmy +malnourished +malnourishment +malnutrite +malnutrition +malo +malobservance +malobservation +maloccluded +malocclusion +malodor +malodorant +malodorous +malodorously +malodorousness +malojilla +malonate +malonic +malonyl +malonylurea +Malope +maloperation +malorganization +malorganized +malouah +malpais +Malpighia +Malpighiaceae +malpighiaceous +Malpighian +malplaced +malpoise +malposed +malposition +malpractice +malpractioner +malpraxis +malpresentation +malproportion +malproportioned +malpropriety +malpublication +malreasoning +malrotation +malshapen +malt +maltable +maltase +malter +Maltese +maltha +Malthe +malthouse +Malthusian +Malthusianism +Malthusiast +maltiness +malting +maltman +Malto +maltobiose +maltodextrin +maltodextrine +maltolte +maltose +maltreat +maltreatment +maltreator +maltster +malturned +maltworm +malty +malunion +Malurinae +malurine +Malurus +Malus +Malva +Malvaceae +malvaceous +Malvales +malvasia +malvasian +Malvastrum +malversation +malverse +malvoisie +malvolition +Mam +mamba +mambo +mameliere +mamelonation +mameluco +Mameluke +Mamercus +Mamers +Mamertine +Mamie +Mamilius +mamlatdar +mamma +mammal +mammalgia +Mammalia +mammalian +mammaliferous +mammality +mammalogical +mammalogist +mammalogy +mammary +mammate +Mammea +mammectomy +mammee +mammer +Mammifera +mammiferous +mammiform +mammilla +mammillaplasty +mammillar +Mammillaria +mammillary +mammillate +mammillated +mammillation +mammilliform +mammilloid +mammitis +mammock +mammogen +mammogenic +mammogenically +mammon +mammondom +mammoniacal +mammonish +mammonism +mammonist +mammonistic +mammonite +mammonitish +mammonization +mammonize +mammonolatry +Mammonteus +mammoth +mammothrept +mammula +mammular +Mammut +Mammutidae +mammy +mamo +man +mana +Manabozho +manacle +Manacus +manage +manageability +manageable +manageableness +manageably +managee +manageless +management +managemental +manager +managerdom +manageress +managerial +managerially +managership +managery +manaism +manakin +manal +manas +Manasquan +manatee +Manatidae +manatine +manatoid +Manatus +manavel +manavelins +Manavendra +manbird +manbot +manche +Manchester +Manchesterdom +Manchesterism +Manchesterist +Manchestrian +manchet +manchineel +Manchu +Manchurian +mancinism +mancipable +mancipant +mancipate +mancipation +mancipative +mancipatory +mancipee +mancipium +manciple +mancipleship +mancipular +mancono +Mancunian +mancus +mand +Mandaean +Mandaeism +Mandaic +Mandaite +mandala +Mandalay +mandament +mandamus +Mandan +mandant +mandarah +mandarin +mandarinate +mandarindom +mandariness +mandarinic +mandarinism +mandarinize +mandarinship +mandatary +mandate +mandatee +mandation +mandative +mandator +mandatorily +mandatory +mandatum +Mande +mandelate +mandelic +mandible +mandibula +mandibular +mandibulary +Mandibulata +mandibulate +mandibulated +mandibuliform +mandibulohyoid +mandibulomaxillary +mandibulopharyngeal +mandibulosuspensorial +mandil +mandilion +Mandingan +Mandingo +mandola +mandolin +mandolinist +mandolute +mandom +mandora +mandore +mandra +mandragora +mandrake +mandrel +mandriarch +mandrill +mandrin +mandruka +mandua +manducable +manducate +manducation +manducatory +mandyas +mane +maned +manege +manei +maneless +manent +manerial +manes +manesheet +maness +Manetti +Manettia +maneuver +maneuverability +maneuverable +maneuverer +maneuvrability +maneuvrable +maney +Manfred +Manfreda +manful +manfully +manfulness +mang +manga +mangabeira +mangabey +mangal +manganapatite +manganate +manganblende +manganbrucite +manganeisen +manganese +manganesian +manganetic +manganhedenbergite +manganic +manganiferous +manganite +manganium +manganize +Manganja +manganocalcite +manganocolumbite +manganophyllite +manganosiderite +manganosite +manganostibiite +manganotantalite +manganous +manganpectolite +Mangar +Mangbattu +mange +mangeao +mangel +mangelin +manger +mangerite +mangi +Mangifera +mangily +manginess +mangle +mangleman +mangler +mangling +manglingly +mango +mangona +mangonel +mangonism +mangonization +mangonize +mangosteen +mangrass +mangrate +mangrove +Mangue +mangue +mangy +Mangyan +manhandle +Manhattan +Manhattanite +Manhattanize +manhead +manhole +manhood +mani +mania +maniable +maniac +maniacal +maniacally +manic +Manicaria +manicate +Manichaean +Manichaeanism +Manichaeanize +Manichaeism +Manichaeist +Manichee +manichord +manicole +manicure +manicurist +manid +Manidae +manienie +manifest +manifestable +manifestant +manifestation +manifestational +manifestationist +manifestative +manifestatively +manifested +manifestedness +manifester +manifestive +manifestly +manifestness +manifesto +manifold +manifolder +manifoldly +manifoldness +manifoldwise +maniform +manify +Manihot +manikin +manikinism +Manila +manila +manilla +manille +manioc +maniple +manipulable +manipular +manipulatable +manipulate +manipulation +manipulative +manipulatively +manipulator +manipulatory +Manipuri +Manis +manism +manist +manistic +manito +Manitoban +manitrunk +maniu +Manius +Maniva +manjak +Manjeri +mank +mankeeper +mankin +mankind +manless +manlessly +manlessness +manlet +manlihood +manlike +manlikely +manlikeness +manlily +manliness +manling +manly +Mann +manna +mannan +mannequin +manner +mannerable +mannered +mannerhood +mannering +mannerism +mannerist +manneristic +manneristical +manneristically +mannerize +mannerless +mannerlessness +mannerliness +mannerly +manners +mannersome +manness +Mannheimar +mannide +mannie +manniferous +mannify +mannikinism +manning +mannish +mannishly +mannishness +mannite +mannitic +mannitol +mannitose +mannoheptite +mannoheptitol +mannoheptose +mannoketoheptose +mannonic +mannosan +mannose +Manny +manny +mano +Manobo +manoc +manograph +Manolis +manometer +manometric +manometrical +manometry +manomin +manor +manorial +manorialism +manorialize +manorship +manoscope +manostat +manostatic +manque +manred +manrent +manroot +manrope +Mans +mansard +mansarded +manscape +manse +manservant +manship +mansion +mansional +mansionary +mansioned +mansioneer +mansionry +manslaughter +manslaughterer +manslaughtering +manslaughterous +manslayer +manslaying +manso +mansonry +manstealer +manstealing +manstopper +manstopping +mansuete +mansuetely +mansuetude +mant +manta +mantal +manteau +mantel +mantelet +manteline +mantelletta +mantellone +mantelpiece +mantelshelf +manteltree +manter +mantes +mantevil +mantic +manticism +manticore +mantid +Mantidae +mantilla +Mantinean +mantis +Mantisia +Mantispa +mantispid +Mantispidae +mantissa +mantistic +mantle +mantled +mantlet +mantling +Manto +manto +Mantodea +mantoid +Mantoidea +mantologist +mantology +mantra +mantrap +mantua +mantuamaker +mantuamaking +Mantuan +Mantzu +manual +manualii +manualism +manualist +manualiter +manually +manuao +manubrial +manubriated +manubrium +manucaption +manucaptor +manucapture +manucode +Manucodia +manucodiata +manuduce +manuduction +manuductor +manuductory +Manuel +manufactory +manufacturable +manufactural +manufacture +manufacturer +manufacturess +manuka +manul +manuma +manumea +manumisable +manumission +manumissive +manumit +manumitter +manumotive +manurable +manurage +manurance +manure +manureless +manurer +manurial +manurially +manus +manuscript +manuscriptal +manuscription +manuscriptural +manusina +manustupration +manutagi +Manvantara +manward +manwards +manway +manweed +manwise +Manx +Manxman +Manxwoman +many +manyberry +Manyema +manyfold +manyness +manyplies +manyroot +manyways +manywhere +manywise +manzana +manzanilla +manzanillo +manzanita +Manzas +manzil +mao +maomao +Maori +Maoridom +Maoriland +Maorilander +map +mapach +mapau +maphrian +mapland +maple +maplebush +mapo +mappable +mapper +Mappila +mappist +mappy +Mapuche +mapwise +maquahuitl +maquette +maqui +Maquiritare +maquis +Mar +mar +Mara +marabotin +marabou +Marabout +marabuto +maraca +Maracaibo +maracan +maracock +marae +Maragato +marajuana +marakapas +maral +maranatha +marang +Maranha +Maranham +Maranhao +Maranta +Marantaceae +marantaceous +marantic +marara +mararie +marasca +maraschino +marasmic +Marasmius +marasmoid +marasmous +marasmus +Maratha +Marathi +marathon +marathoner +Marathonian +Maratism +Maratist +Marattia +Marattiaceae +marattiaceous +Marattiales +maraud +marauder +maravedi +Maravi +marbelize +marble +marbled +marblehead +marbleheader +marblehearted +marbleization +marbleize +marbleizer +marblelike +marbleness +marbler +marbles +marblewood +marbling +marblish +marbly +marbrinus +Marc +marc +Marcan +marcantant +marcasite +marcasitic +marcasitical +Marcel +marcel +marceline +Marcella +marcella +marceller +Marcellian +Marcellianism +marcello +marcescence +marcescent +Marcgravia +Marcgraviaceae +marcgraviaceous +March +march +Marchantia +Marchantiaceae +marchantiaceous +Marchantiales +marcher +marchetto +marchioness +marchite +marchland +marchman +Marchmont +marchpane +Marci +Marcia +marcid +Marcionism +Marcionist +Marcionite +Marcionitic +Marcionitish +Marcionitism +Marcite +Marco +marco +Marcobrunner +Marcomanni +Marconi +marconi +marconigram +marconigraph +marconigraphy +marcor +Marcos +Marcosian +marcottage +mardy +mare +mareblob +Mareca +marechal +Marehan +Marek +marekanite +maremma +maremmatic +maremmese +marengo +marennin +Mareotic +Mareotid +Marfik +marfire +margarate +Margarelon +Margaret +margaric +margarin +margarine +margarita +margaritaceous +margarite +margaritiferous +margaritomancy +Margarodes +margarodid +Margarodinae +margarodite +Margaropus +margarosanite +margay +marge +margeline +margent +Margery +Margie +margin +marginal +marginalia +marginality +marginalize +marginally +marginate +marginated +margination +margined +Marginella +Marginellidae +marginelliform +marginiform +margining +marginirostral +marginoplasty +margosa +Margot +margravate +margrave +margravely +margravial +margraviate +margravine +Marguerite +marguerite +marhala +Marheshvan +Mari +Maria +maria +marialite +Mariamman +Marian +Mariana +Marianic +Marianne +Marianolatrist +Marianolatry +maricolous +marid +Marie +mariengroschen +marigenous +marigold +marigram +marigraph +marigraphic +marijuana +marikina +Marilla +Marilyn +marimba +marimonda +marina +marinade +marinate +marinated +marine +mariner +marinheiro +marinist +marinorama +Mario +mariola +Mariolater +Mariolatrous +Mariolatry +Mariology +Marion +marionette +Mariou +Mariposan +mariposite +maris +marish +marishness +Marist +maritage +marital +maritality +maritally +mariticidal +mariticide +Maritime +maritime +maritorious +mariupolite +marjoram +Marjorie +Mark +mark +marka +Markab +markdown +Markeb +marked +markedly +markedness +marker +market +marketability +marketable +marketableness +marketably +marketeer +marketer +marketing +marketman +marketstead +marketwise +markfieldite +Markgenossenschaft +markhor +marking +markka +markless +markman +markmoot +Marko +markshot +marksman +marksmanly +marksmanship +markswoman +markup +Markus +markweed +markworthy +marl +Marla +marlaceous +marlberry +marled +Marlena +marler +marli +marlin +marline +marlinespike +marlite +marlitic +marllike +marlock +Marlovian +Marlowesque +Marlowish +Marlowism +marlpit +marly +marm +marmalade +marmalady +Marmar +marmarization +marmarize +marmarosis +marmatite +marmelos +marmennill +marmit +marmite +marmolite +marmoraceous +marmorate +marmorated +marmoration +marmoreal +marmoreally +marmorean +marmoric +Marmosa +marmose +marmoset +marmot +Marmota +Marnix +maro +marocain +marok +Maronian +Maronist +Maronite +maroon +marooner +maroquin +Marpessa +marplot +marplotry +marque +marquee +Marquesan +marquess +marquetry +marquis +marquisal +marquisate +marquisdom +marquise +marquisette +marquisina +marquisotte +marquisship +marquito +marranism +marranize +marrano +marree +Marrella +marrer +marriable +marriage +marriageability +marriageable +marriageableness +marriageproof +married +marrier +marron +marrot +marrow +marrowbone +marrowed +marrowfat +marrowish +marrowless +marrowlike +marrowsky +marrowskyer +marrowy +Marrubium +Marrucinian +marry +marryer +marrying +marrymuffe +Mars +Marsala +Marsdenia +marseilles +Marsh +marsh +Marsha +marshal +marshalate +marshalcy +marshaler +marshaless +Marshall +marshalman +marshalment +Marshalsea +marshalship +marshberry +marshbuck +marshfire +marshflower +marshiness +marshite +marshland +marshlander +marshlike +marshlocks +marshman +marshwort +marshy +Marsi +Marsian +Marsilea +Marsileaceae +marsileaceous +Marsilia +Marsiliaceae +marsipobranch +Marsipobranchia +Marsipobranchiata +marsipobranchiate +Marsipobranchii +marsoon +Marspiter +Marssonia +Marssonina +marsupial +Marsupialia +marsupialian +marsupialization +marsupialize +marsupian +Marsupiata +marsupiate +marsupium +Mart +mart +martagon +martel +marteline +martellate +martellato +marten +martensite +martensitic +Martes +martext +Martha +martial +martialism +Martialist +martiality +martialization +martialize +martially +martialness +Martian +Martin +martin +martinet +martineta +martinetish +martinetishness +martinetism +martinetship +Martinez +martingale +martinico +Martinism +Martinist +Martinmas +martinoe +martite +Martius +martlet +Martu +Marty +Martyn +Martynia +Martyniaceae +martyniaceous +martyr +martyrdom +martyress +martyrium +martyrization +martyrize +martyrizer +martyrlike +martyrly +martyrolatry +martyrologic +martyrological +martyrologist +martyrologistic +martyrologium +martyrology +martyrship +martyry +maru +marvel +marvelment +marvelous +marvelously +marvelousness +marvelry +marver +Marvin +Marwari +Marxian +Marxianism +Marxism +Marxist +Mary +mary +marybud +Maryland +Marylander +Marylandian +Marymass +marysole +marzipan +mas +masa +Masai +Masanao +Masanobu +masaridid +Masarididae +Masaridinae +Masaris +mascagnine +mascagnite +mascally +mascara +mascaron +mascled +mascleless +mascot +mascotism +mascotry +Mascouten +mascularity +masculate +masculation +masculine +masculinely +masculineness +masculinism +masculinist +masculinity +masculinization +masculinize +masculist +masculofeminine +masculonucleus +masculy +masdeu +Masdevallia +mash +masha +mashal +mashallah +mashelton +masher +mashie +mashing +mashman +Mashona +Mashpee +mashru +mashy +masjid +mask +masked +Maskegon +maskelynite +masker +maskette +maskflower +Maskins +masklike +Maskoi +maskoid +maslin +masochism +masochist +masochistic +Mason +mason +masoned +masoner +masonic +Masonite +masonite +masonry +masonwork +masooka +masoola +Masora +Masorete +Masoreth +Masoretic +Maspiter +masque +masquer +masquerade +masquerader +Mass +mass +massa +massacre +massacrer +massage +massager +massageuse +massagist +Massalia +Massalian +massaranduba +massasauga +masse +massebah +massecuite +massedly +massedness +Massekhoth +massel +masser +masseter +masseteric +masseur +masseuse +massicot +massier +massiest +massif +Massilia +Massilian +massily +massiness +massive +massively +massiveness +massivity +masskanne +massless +masslike +Massmonger +massotherapy +massoy +massula +massy +mast +mastaba +mastadenitis +mastadenoma +mastage +mastalgia +mastatrophia +mastatrophy +mastauxe +mastax +mastectomy +masted +master +masterable +masterate +masterdom +masterer +masterful +masterfully +masterfulness +masterhood +masterless +masterlessness +masterlike +masterlily +masterliness +masterling +masterly +masterman +mastermind +masterous +masterpiece +masterproof +mastership +masterwork +masterwort +mastery +mastful +masthead +masthelcosis +mastic +masticability +masticable +masticate +mastication +masticator +masticatory +mastiche +masticic +Masticura +masticurous +mastiff +Mastigamoeba +mastigate +mastigium +mastigobranchia +mastigobranchial +Mastigophora +mastigophoran +mastigophoric +mastigophorous +mastigopod +Mastigopoda +mastigopodous +mastigote +mastigure +masting +mastitis +mastless +mastlike +mastman +mastocarcinoma +mastoccipital +mastochondroma +mastochondrosis +mastodon +mastodonsaurian +Mastodonsaurus +mastodont +mastodontic +Mastodontidae +mastodontine +mastodontoid +mastodynia +mastoid +mastoidal +mastoidale +mastoideal +mastoidean +mastoidectomy +mastoideocentesis +mastoideosquamous +mastoiditis +mastoidohumeral +mastoidohumeralis +mastoidotomy +mastological +mastologist +mastology +mastomenia +mastoncus +mastooccipital +mastoparietal +mastopathy +mastopexy +mastoplastia +mastorrhagia +mastoscirrhus +mastosquamose +mastotomy +mastotympanic +masturbate +masturbation +masturbational +masturbator +masturbatory +mastwood +masty +masu +Masulipatam +masurium +Mat +mat +Matabele +Matacan +matachin +matachina +mataco +matadero +matador +mataeological +mataeologue +mataeology +Matagalpa +Matagalpan +matagory +matagouri +matai +matajuelo +matalan +matamata +matamoro +matanza +matapan +matapi +Matar +matara +Matatua +Matawan +matax +matboard +match +matchable +matchableness +matchably +matchboard +matchboarding +matchbook +matchbox +matchcloth +matchcoat +matcher +matching +matchless +matchlessly +matchlessness +matchlock +matchmaker +matchmaking +matchmark +Matchotic +matchsafe +matchstick +matchwood +matchy +mate +mategriffon +matehood +mateless +matelessness +matelote +mately +mater +materfamilias +material +materialism +materialist +materialistic +materialistical +materialistically +materiality +materialization +materialize +materializee +materializer +materially +materialman +materialness +materiate +materiation +materiel +maternal +maternality +maternalize +maternally +maternalness +maternity +maternology +mateship +matey +matezite +matfelon +matgrass +math +mathematic +mathematical +mathematically +mathematicals +mathematician +mathematicize +mathematics +mathematize +mathemeg +mathes +mathesis +mathetic +Mathurin +matico +matildite +matin +matinal +matinee +mating +matins +matipo +matka +matless +matlockite +matlow +matmaker +matmaking +matra +matral +Matralia +matranee +matrass +matreed +matriarch +matriarchal +matriarchalism +matriarchate +matriarchic +matriarchist +matriarchy +matric +matrical +Matricaria +matrices +matricidal +matricide +matricula +matriculable +matriculant +matricular +matriculate +matriculation +matriculator +matriculatory +Matrigan +matriheritage +matriherital +matrilineal +matrilineally +matrilinear +matrilinearism +matriliny +matrilocal +matrimonial +matrimonially +matrimonious +matrimoniously +matrimony +matriotism +matripotestal +matris +matrix +matroclinic +matroclinous +matrocliny +matron +matronage +matronal +Matronalia +matronhood +matronism +matronize +matronlike +matronliness +matronly +matronship +matronymic +matross +Mats +matsu +matsuri +Matt +matta +mattamore +Mattapony +mattaro +mattboard +matte +matted +mattedly +mattedness +matter +matterate +matterative +matterful +matterfulness +matterless +mattery +Matteuccia +Matthaean +Matthew +Matthias +Matthieu +Matthiola +Matti +matti +matting +mattock +mattoid +mattoir +mattress +mattulla +Matty +maturable +maturate +maturation +maturative +mature +maturely +maturement +matureness +maturer +maturescence +maturescent +maturing +maturish +maturity +matutinal +matutinally +matutinary +matutine +matutinely +matweed +maty +matzo +matzoon +matzos +matzoth +mau +maucherite +Maud +maud +maudle +maudlin +maudlinism +maudlinize +maudlinly +maudlinwort +mauger +maugh +Maugis +maul +Maulawiyah +mauler +mauley +mauling +maulstick +Maumee +maumet +maumetry +Maun +maun +maund +maunder +maunderer +maundful +maundy +maunge +Maurandia +Maureen +Mauretanian +Mauri +Maurice +Maurist +Mauritia +Mauritian +Mauser +mausolea +mausoleal +mausolean +mausoleum +mauther +mauve +mauveine +mauvette +mauvine +maux +maverick +mavis +Mavortian +mavournin +mavrodaphne +maw +mawbound +mawk +mawkish +mawkishly +mawkishness +mawky +mawp +Max +maxilla +maxillar +maxillary +maxilliferous +maxilliform +maxilliped +maxillipedary +maxillodental +maxillofacial +maxillojugal +maxillolabial +maxillomandibular +maxillopalatal +maxillopalatine +maxillopharyngeal +maxillopremaxillary +maxilloturbinal +maxillozygomatic +maxim +maxima +maximal +Maximalism +Maximalist +maximally +maximate +maximation +maximed +maximist +maximistic +maximite +maximization +maximize +maximizer +Maximon +maximum +maximus +maxixe +maxwell +May +may +Maya +maya +Mayaca +Mayacaceae +mayacaceous +Mayan +Mayance +Mayathan +maybe +Maybird +Maybloom +maybush +Maycock +maycock +Mayda +mayday +Mayer +Mayey +Mayeye +Mayfair +mayfish +Mayflower +Mayfowl +mayhap +mayhappen +mayhem +Maying +Maylike +maynt +Mayo +Mayologist +mayonnaise +mayor +mayoral +mayoralty +mayoress +mayorship +Mayoruna +Maypole +Maypoling +maypop +maysin +mayten +Maytenus +Maythorn +Maytide +Maytime +mayweed +Maywings +Maywort +maza +mazalgia +Mazama +mazame +Mazanderani +mazapilite +mazard +mazarine +Mazatec +Mazateco +Mazda +Mazdaism +Mazdaist +Mazdakean +Mazdakite +Mazdean +maze +mazed +mazedly +mazedness +mazeful +mazement +mazer +Mazhabi +mazic +mazily +maziness +mazocacothesis +mazodynia +mazolysis +mazolytic +mazopathia +mazopathic +mazopexy +Mazovian +mazuca +mazuma +Mazur +Mazurian +mazurka +mazut +mazy +mazzard +Mazzinian +Mazzinianism +Mazzinist +mbalolo +Mbaya +mbori +Mbuba +Mbunda +Mcintosh +Mckay +Mdewakanton +me +meable +meaching +mead +meader +meadow +meadowbur +meadowed +meadower +meadowing +meadowink +meadowland +meadowless +meadowsweet +meadowwort +meadowy +meadsman +meager +meagerly +meagerness +meagre +meak +meal +mealable +mealberry +mealer +mealies +mealily +mealiness +mealless +mealman +mealmonger +mealmouth +mealmouthed +mealproof +mealtime +mealy +mealymouth +mealymouthed +mealymouthedly +mealymouthedness +mealywing +mean +meander +meanderingly +meandrine +meandriniform +meandrite +meandrous +meaned +meaner +meaning +meaningful +meaningfully +meaningless +meaninglessly +meaninglessness +meaningly +meaningness +meanish +meanly +meanness +meant +Meantes +meantone +meanwhile +mease +measle +measled +measledness +measles +measlesproof +measly +measondue +measurability +measurable +measurableness +measurably +measuration +measure +measured +measuredly +measuredness +measureless +measurelessly +measurelessness +measurely +measurement +measurer +measuring +meat +meatal +meatbird +meatcutter +meated +meathook +meatily +meatiness +meatless +meatman +meatometer +meatorrhaphy +meatoscope +meatoscopy +meatotome +meatotomy +meatus +meatworks +meaty +Mebsuta +Mecaptera +mecate +Mecca +Meccan +Meccano +Meccawee +Mechael +mechanal +mechanality +mechanalize +mechanic +mechanical +mechanicalism +mechanicalist +mechanicality +mechanicalization +mechanicalize +mechanically +mechanicalness +mechanician +mechanicochemical +mechanicocorpuscular +mechanicointellectual +mechanicotherapy +mechanics +mechanism +mechanist +mechanistic +mechanistically +mechanization +mechanize +mechanizer +mechanolater +mechanology +mechanomorphic +mechanomorphism +mechanotherapeutic +mechanotherapeutics +mechanotherapist +mechanotherapy +Mechir +Mechitaristican +Mechlin +mechoacan +meckelectomy +Meckelian +Mecklenburgian +mecodont +Mecodonta +mecometer +mecometry +mecon +meconic +meconidium +meconin +meconioid +meconium +meconology +meconophagism +meconophagist +Mecoptera +mecopteran +mecopteron +mecopterous +medal +medaled +medalet +medalist +medalize +medallary +medallic +medallically +medallion +medallionist +meddle +meddlecome +meddlement +meddler +meddlesome +meddlesomely +meddlesomeness +meddling +meddlingly +Mede +Medellin +Medeola +Media +media +mediacid +mediacy +mediad +mediaevalize +mediaevally +medial +medialization +medialize +medialkaline +medially +Median +median +medianic +medianimic +medianimity +medianism +medianity +medianly +mediant +mediastinal +mediastine +mediastinitis +mediastinotomy +mediastinum +mediate +mediately +mediateness +mediating +mediatingly +mediation +mediative +mediatization +mediatize +mediator +mediatorial +mediatorialism +mediatorially +mediatorship +mediatory +mediatress +mediatrice +mediatrix +Medic +medic +medicable +Medicago +medical +medically +medicament +medicamental +medicamentally +medicamentary +medicamentation +medicamentous +medicaster +medicate +medication +medicative +medicator +medicatory +Medicean +Medici +medicinable +medicinableness +medicinal +medicinally +medicinalness +medicine +medicinelike +medicinemonger +mediciner +medico +medicobotanical +medicochirurgic +medicochirurgical +medicodental +medicolegal +medicolegally +medicomania +medicomechanic +medicomechanical +medicomoral +medicophysical +medicopsychological +medicopsychology +medicostatistic +medicosurgical +medicotopographic +medicozoologic +mediety +Medieval +medieval +medievalism +medievalist +medievalistic +medievalize +medievally +medifixed +mediglacial +medimn +medimno +medimnos +medimnus +Medina +Medinilla +medino +medio +medioanterior +mediocarpal +medioccipital +mediocre +mediocrist +mediocrity +mediocubital +mediodepressed +mediodigital +mediodorsal +mediodorsally +mediofrontal +mediolateral +mediopalatal +mediopalatine +mediopassive +mediopectoral +medioperforate +mediopontine +medioposterior +mediosilicic +mediostapedial +mediotarsal +medioventral +medisance +medisect +medisection +Medish +Medism +meditant +meditate +meditating +meditatingly +meditation +meditationist +meditatist +meditative +meditatively +meditativeness +meditator +mediterranean +Mediterraneanism +Mediterraneanization +Mediterraneanize +mediterraneous +medithorax +Meditrinalia +meditullium +medium +mediumism +mediumistic +mediumization +mediumize +mediumship +medius +Medize +Medizer +medjidie +medlar +medley +Medoc +medregal +medrick +medrinaque +medulla +medullar +medullary +medullate +medullated +medullation +medullispinal +medullitis +medullization +medullose +Medusa +Medusaean +medusal +medusalike +medusan +medusiferous +medusiform +medusoid +meebos +meece +meed +meedless +Meehan +meek +meeken +meekhearted +meekheartedness +meekling +meekly +meekness +Meekoceras +Meeks +meered +meerkat +meerschaum +meese +meet +meetable +meeten +meeter +meeterly +meethelp +meethelper +meeting +meetinger +meetinghouse +meetly +meetness +Meg +megabar +megacephalia +megacephalic +megacephaly +megacerine +Megaceros +megacerotine +Megachile +megachilid +Megachilidae +Megachiroptera +megachiropteran +megachiropterous +megacolon +megacosm +megacoulomb +megacycle +megadont +Megadrili +megadynamics +megadyne +Megaera +megaerg +megafarad +megafog +megagamete +megagametophyte +megajoule +megakaryocyte +Megalactractus +Megaladapis +Megalaema +Megalaemidae +Megalania +megaleme +Megalensian +megalerg +Megalesia +Megalesian +megalesthete +megalethoscope +Megalichthyidae +Megalichthys +megalith +megalithic +Megalobatrachus +megaloblast +megaloblastic +megalocardia +megalocarpous +megalocephalia +megalocephalic +megalocephalous +megalocephaly +Megaloceros +megalochirous +megalocornea +megalocyte +megalocytosis +megalodactylia +megalodactylism +megalodactylous +Megalodon +megalodont +megalodontia +Megalodontidae +megaloenteron +megalogastria +megaloglossia +megalograph +megalography +megalohepatia +megalokaryocyte +megalomania +megalomaniac +megalomaniacal +megalomelia +Megalonychidae +Megalonyx +megalopa +megalopenis +megalophonic +megalophonous +megalophthalmus +megalopia +megalopic +Megalopidae +Megalopinae +megalopine +megaloplastocyte +megalopolis +megalopolitan +megalopolitanism +megalopore +megalops +megalopsia +Megaloptera +Megalopyge +Megalopygidae +Megalornis +Megalornithidae +megalosaur +megalosaurian +Megalosauridae +megalosauroid +Megalosaurus +megaloscope +megaloscopy +megalosphere +megalospheric +megalosplenia +megalosyndactyly +megaloureter +Megaluridae +Megamastictora +megamastictoral +megamere +megameter +megampere +Meganeura +Meganthropus +meganucleus +megaparsec +megaphone +megaphonic +megaphotographic +megaphotography +megaphyllous +Megaphyton +megapod +megapode +Megapodidae +Megapodiidae +Megapodius +megaprosopous +Megaptera +Megapterinae +megapterine +Megarensian +Megarhinus +Megarhyssa +Megarian +Megarianism +Megaric +megaron +megasclere +megascleric +megasclerous +megasclerum +megascope +megascopic +megascopical +megascopically +megaseism +megaseismic +megaseme +Megasoma +megasporange +megasporangium +megaspore +megasporic +megasporophyll +megasynthetic +megathere +megatherian +Megatheriidae +megatherine +megatherioid +Megatherium +megatherm +megathermic +megatheroid +megaton +megatype +megatypy +megavolt +megawatt +megaweber +megazooid +megazoospore +megerg +Meggy +megilp +megmho +megohm +megohmit +megohmmeter +megophthalmus +megotalc +Megrel +Megrez +megrim +megrimish +mehalla +mehari +meharist +Mehelya +mehmandar +Mehrdad +mehtar +mehtarship +Meibomia +Meibomian +meile +mein +meinie +meio +meiobar +meionite +meiophylly +meiosis +meiotaxy +meiotic +Meissa +Meistersinger +meith +Meithei +meizoseismal +meizoseismic +mejorana +Mekbuda +Mekhitarist +mekometer +mel +mela +melaconite +melada +meladiorite +melagabbro +melagra +melagranite +Melaleuca +melalgia +melam +melamed +melamine +melampodium +Melampsora +Melampsoraceae +Melampus +melampyritol +Melampyrum +melanagogal +melanagogue +melancholia +melancholiac +melancholic +melancholically +melancholily +melancholiness +melancholious +melancholiously +melancholiousness +melancholish +melancholist +melancholize +melancholomaniac +melancholy +melancholyish +Melanchthonian +Melanconiaceae +melanconiaceous +Melanconiales +Melanconium +melanemia +melanemic +Melanesian +melange +melanger +melangeur +Melania +melanian +melanic +melaniferous +Melaniidae +melanilin +melaniline +melanin +Melanippe +Melanippus +melanism +melanistic +melanite +melanitic +melanize +melano +melanoblast +melanocarcinoma +melanocerite +Melanochroi +Melanochroid +melanochroite +melanochroous +melanocomous +melanocrate +melanocratic +melanocyte +Melanodendron +melanoderma +melanodermia +melanodermic +Melanogaster +melanogen +Melanoi +melanoid +melanoidin +melanoma +melanopathia +melanopathy +melanophore +melanoplakia +Melanoplus +melanorrhagia +melanorrhea +Melanorrhoea +melanosarcoma +melanosarcomatosis +melanoscope +melanose +melanosed +melanosis +melanosity +melanospermous +melanotekite +melanotic +melanotrichous +melanous +melanterite +Melanthaceae +melanthaceous +Melanthium +melanure +melanuresis +melanuria +melanuric +melaphyre +Melas +melasma +melasmic +melassigenic +Melastoma +Melastomaceae +melastomaceous +melastomad +melatope +melaxuma +Melburnian +Melcarth +melch +Melchite +Melchora +meld +melder +meldometer +meldrop +mele +Meleager +Meleagridae +Meleagrina +Meleagrinae +meleagrine +Meleagris +melebiose +melee +melena +melene +melenic +Meles +Meletian +Meletski +melezitase +melezitose +Melia +Meliaceae +meliaceous +Meliadus +Melian +Melianthaceae +melianthaceous +Melianthus +meliatin +melibiose +melic +Melica +Melicent +melicera +meliceric +meliceris +melicerous +Melicerta +Melicertidae +melichrous +melicitose +Melicocca +melicraton +melilite +melilitite +melilot +Melilotus +Melinae +Melinda +meline +Melinis +melinite +Meliola +meliorability +meliorable +meliorant +meliorate +meliorater +melioration +meliorative +meliorator +meliorism +meliorist +melioristic +meliority +meliphagan +Meliphagidae +meliphagidan +meliphagous +meliphanite +Melipona +Meliponinae +meliponine +melisma +melismatic +melismatics +Melissa +melissyl +melissylic +Melitaea +melitemia +melithemia +melitis +melitose +melitriose +melittologist +melittology +melituria +melituric +mell +mellaginous +mellate +mellay +melleous +meller +Mellifera +melliferous +mellificate +mellification +mellifluence +mellifluent +mellifluently +mellifluous +mellifluously +mellifluousness +mellimide +mellisonant +mellisugent +mellit +mellitate +mellite +mellitic +Mellivora +Mellivorinae +mellivorous +mellon +mellonides +mellophone +mellow +mellowly +mellowness +mellowy +mellsman +Melocactus +melocoton +melodeon +melodia +melodial +melodially +melodic +melodica +melodically +melodicon +melodics +melodiograph +melodion +melodious +melodiously +melodiousness +melodism +melodist +melodize +melodizer +melodram +melodrama +melodramatic +melodramatical +melodramatically +melodramaticism +melodramatics +melodramatist +melodramatize +melodrame +melody +melodyless +meloe +melogram +Melogrammataceae +melograph +melographic +meloid +Meloidae +melologue +Melolontha +Melolonthidae +melolonthidan +Melolonthides +Melolonthinae +melolonthine +melomane +melomania +melomaniac +melomanic +melon +meloncus +Melonechinus +melongena +melongrower +melonist +melonite +Melonites +melonlike +melonmonger +melonry +melophone +melophonic +melophonist +melopiano +meloplast +meloplastic +meloplasty +melopoeia +melopoeic +melos +melosa +Melospiza +Melothria +melotragedy +melotragic +melotrope +melt +meltability +meltable +meltage +melted +meltedness +melteigite +melter +melters +melting +meltingly +meltingness +melton +Meltonian +Melungeon +Melursus +mem +member +membered +memberless +membership +membracid +Membracidae +membracine +membral +membrally +membrana +membranaceous +membranaceously +membranate +membrane +membraned +membraneless +membranelike +membranelle +membraneous +membraniferous +membraniform +membranin +Membranipora +Membraniporidae +membranocalcareous +membranocartilaginous +membranocoriaceous +membranocorneous +membranogenic +membranoid +membranology +membranonervous +membranosis +membranous +membranously +membranula +membranule +membretto +memento +meminna +Memnon +Memnonian +Memnonium +memo +memoir +memoirism +memoirist +memorabilia +memorability +memorable +memorableness +memorably +memoranda +memorandist +memorandize +memorandum +memorative +memoria +memorial +memorialist +memorialization +memorialize +memorializer +memorially +memoried +memorious +memorist +memorizable +memorization +memorize +memorizer +memory +memoryless +Memphian +Memphite +men +menaccanite +menaccanitic +menace +menaceable +menaceful +menacement +menacer +menacing +menacingly +menacme +menadione +menage +menagerie +menagerist +menald +Menangkabau +menarche +Menaspis +mend +mendable +mendacious +mendaciously +mendaciousness +mendacity +Mendaite +Mende +mendee +Mendelian +Mendelianism +Mendelianist +Mendelism +Mendelist +Mendelize +Mendelssohnian +Mendelssohnic +mendelyeevite +mender +Mendi +mendicancy +mendicant +mendicate +mendication +mendicity +mending +mendipite +mendole +mendozite +mends +meneghinite +menfolk +Menfra +meng +Mengwe +menhaden +menhir +menial +menialism +meniality +menially +Menic +menilite +meningeal +meninges +meningic +meningina +meningism +meningitic +meningitis +meningocele +meningocephalitis +meningocerebritis +meningococcal +meningococcemia +meningococcic +meningococcus +meningocortical +meningoencephalitis +meningoencephalocele +meningomalacia +meningomyclitic +meningomyelitis +meningomyelocele +meningomyelorrhaphy +meningorachidian +meningoradicular +meningorhachidian +meningorrhagia +meningorrhea +meningorrhoea +meningosis +meningospinal +meningotyphoid +meninting +meninx +meniscal +meniscate +menisciform +meniscitis +meniscoid +meniscoidal +Meniscotheriidae +Meniscotherium +meniscus +menisperm +Menispermaceae +menispermaceous +menispermine +Menispermum +Menkalinan +Menkar +Menkib +menkind +mennom +Mennonist +Mennonite +Menobranchidae +Menobranchus +menognath +menognathous +menologium +menology +menometastasis +Menominee +menopausal +menopause +menopausic +menophania +menoplania +Menopoma +Menorah +Menorhyncha +menorhynchous +menorrhagia +menorrhagic +menorrhagy +menorrhea +menorrheic +menorrhoea +menorrhoeic +menoschesis +menoschetic +menosepsis +menostasia +menostasis +menostatic +menostaxis +Menotyphla +menotyphlic +menoxenia +mensa +mensal +mensalize +mense +menseful +menseless +menses +Menshevik +Menshevism +Menshevist +mensk +menstrual +menstruant +menstruate +menstruation +menstruous +menstruousness +menstruum +mensual +mensurability +mensurable +mensurableness +mensurably +mensural +mensuralist +mensurate +mensuration +mensurational +mensurative +Ment +mentagra +mental +mentalis +mentalism +mentalist +mentalistic +mentality +mentalization +mentalize +mentally +mentary +mentation +Mentha +Menthaceae +menthaceous +menthadiene +menthane +menthene +menthenol +menthenone +menthol +mentholated +menthone +menthyl +menticide +menticultural +menticulture +mentiferous +mentiform +mentigerous +mentimeter +mentimutation +mention +mentionability +mentionable +mentionless +mentoanterior +mentobregmatic +mentocondylial +mentohyoid +mentolabial +mentomeckelian +mentonniere +mentoposterior +mentor +mentorial +mentorism +mentorship +mentum +Mentzelia +menu +Menura +Menurae +Menuridae +meny +Menyanthaceae +Menyanthaceous +Menyanthes +menyie +menzie +Menziesia +Meo +Mephisto +Mephistophelean +Mephistopheleanly +Mephistopheles +Mephistophelic +Mephistophelistic +mephitic +mephitical +Mephitinae +mephitine +mephitis +mephitism +Mer +Merak +meralgia +meraline +Merat +Meratia +merbaby +mercal +mercantile +mercantilely +mercantilism +mercantilist +mercantilistic +mercantility +mercaptal +mercaptan +mercaptides +mercaptids +mercapto +mercaptol +mercaptole +Mercator +Mercatorial +mercatorial +Mercedarian +Mercedes +Mercedinus +Mercedonius +mercenarily +mercenariness +mercenary +mercer +merceress +mercerization +mercerize +mercerizer +mercership +mercery +merch +merchandisable +merchandise +merchandiser +merchant +merchantable +merchantableness +merchanter +merchanthood +merchantish +merchantlike +merchantly +merchantman +merchantry +merchantship +merchet +Mercian +merciful +mercifully +mercifulness +merciless +mercilessly +mercilessness +merciment +mercurate +mercuration +Mercurean +mercurial +Mercurialis +mercurialism +mercuriality +mercurialization +mercurialize +mercurially +mercurialness +mercuriamines +mercuriammonium +Mercurian +mercuriate +mercuric +mercuride +mercurification +mercurify +Mercurius +mercurization +mercurize +Mercurochrome +mercurophen +mercurous +Mercury +mercy +mercyproof +merdivorous +mere +Meredithian +merel +merely +merenchyma +merenchymatous +meresman +merestone +meretricious +meretriciously +meretriciousness +meretrix +merfold +merfolk +merganser +merge +mergence +merger +mergh +Merginae +Mergulus +Mergus +meriah +mericarp +merice +Merida +meridian +Meridion +Meridionaceae +Meridional +meridional +meridionality +meridionally +meril +meringue +meringued +Merino +Meriones +meriquinoid +meriquinoidal +meriquinone +meriquinonic +meriquinonoid +merism +merismatic +merismoid +merist +meristele +meristelic +meristem +meristematic +meristematically +meristic +meristically +meristogenous +merit +meritable +merited +meritedly +meriter +meritful +meritless +meritmonger +meritmongering +meritmongery +meritorious +meritoriously +meritoriousness +merk +merkhet +merkin +merl +merle +merlette +merlin +merlon +Merlucciidae +Merluccius +mermaid +mermaiden +merman +Mermis +mermithaner +mermithergate +Mermithidae +mermithization +mermithized +mermithogyne +Mermnad +Mermnadae +mermother +mero +meroblastic +meroblastically +merocele +merocelic +merocerite +meroceritic +merocrystalline +merocyte +Merodach +merogamy +merogastrula +merogenesis +merogenetic +merogenic +merognathite +merogonic +merogony +merohedral +merohedric +merohedrism +meroistic +Meroitic +meromorphic +Meromyaria +meromyarian +merop +Merope +Meropes +meropia +Meropidae +meropidan +meroplankton +meroplanktonic +meropodite +meropoditic +Merops +merorganization +merorganize +meros +merosomal +Merosomata +merosomatous +merosome +merosthenic +Merostomata +merostomatous +merostome +merostomous +merosymmetrical +merosymmetry +merosystematic +merotomize +merotomy +merotropism +merotropy +Merovingian +meroxene +Merozoa +merozoite +merpeople +merribauks +merribush +Merril +merriless +merrily +merriment +merriness +merrow +merry +merrymake +merrymaker +merrymaking +merryman +merrymeeting +merrythought +merrytrotter +merrywing +merse +Mertensia +Merton +Merula +meruline +merulioid +Merulius +merveileux +merwinite +merwoman +Merychippus +merycism +merycismus +Merycoidodon +Merycoidodontidae +Merycopotamidae +Merycopotamus +Mes +mesa +mesabite +mesaconate +mesaconic +mesad +Mesadenia +mesadenia +mesail +mesal +mesalike +mesally +mesameboid +mesange +mesaortitis +mesaraic +mesaraical +mesarch +mesarteritic +mesarteritis +Mesartim +mesaticephal +mesaticephali +mesaticephalic +mesaticephalism +mesaticephalous +mesaticephaly +mesatipellic +mesatipelvic +mesatiskelic +mesaxonic +mescal +Mescalero +mescaline +mescalism +mesdames +mese +mesectoderm +mesem +Mesembryanthemaceae +Mesembryanthemum +mesembryo +mesembryonic +mesencephalic +mesencephalon +mesenchyma +mesenchymal +mesenchymatal +mesenchymatic +mesenchymatous +mesenchyme +mesendoderm +mesenna +mesenterial +mesenteric +mesenterical +mesenterically +mesenteriform +mesenteriolum +mesenteritic +mesenteritis +mesenteron +mesenteronic +mesentery +mesentoderm +mesepimeral +mesepimeron +mesepisternal +mesepisternum +mesepithelial +mesepithelium +mesethmoid +mesethmoidal +mesh +Meshech +meshed +meshrabiyeh +meshwork +meshy +mesiad +mesial +mesially +mesian +mesic +mesically +mesilla +mesiobuccal +mesiocervical +mesioclusion +mesiodistal +mesiodistally +mesiogingival +mesioincisal +mesiolabial +mesiolingual +mesion +mesioocclusal +mesiopulpal +mesioversion +Mesitae +Mesites +Mesitidae +mesitite +mesityl +mesitylene +mesitylenic +mesmerian +mesmeric +mesmerical +mesmerically +mesmerism +mesmerist +mesmerite +mesmerizability +mesmerizable +mesmerization +mesmerize +mesmerizee +mesmerizer +mesmeromania +mesmeromaniac +mesnality +mesnalty +mesne +meso +mesoappendicitis +mesoappendix +mesoarial +mesoarium +mesobar +mesobenthos +mesoblast +mesoblastema +mesoblastemic +mesoblastic +mesobranchial +mesobregmate +mesocaecal +mesocaecum +mesocardia +mesocardium +mesocarp +mesocentrous +mesocephal +mesocephalic +mesocephalism +mesocephalon +mesocephalous +mesocephaly +mesochilium +mesochondrium +mesochroic +mesocoele +mesocoelian +mesocoelic +mesocolic +mesocolon +mesocoracoid +mesocranial +mesocratic +mesocuneiform +mesode +mesoderm +mesodermal +mesodermic +Mesodesma +Mesodesmatidae +Mesodesmidae +Mesodevonian +Mesodevonic +mesodic +mesodisilicic +mesodont +Mesoenatides +mesofurca +mesofurcal +mesogaster +mesogastral +mesogastric +mesogastrium +mesogloea +mesogloeal +mesognathic +mesognathion +mesognathism +mesognathous +mesognathy +mesogyrate +mesohepar +Mesohippus +mesokurtic +mesolabe +mesole +mesolecithal +mesolimnion +mesolite +mesolithic +mesologic +mesological +mesology +mesomere +mesomeric +mesomerism +mesometral +mesometric +mesometrium +mesomorph +mesomorphic +mesomorphous +mesomorphy +Mesomyodi +mesomyodian +mesomyodous +meson +mesonasal +Mesonemertini +mesonephric +mesonephridium +mesonephritic +mesonephros +mesonic +mesonotal +mesonotum +Mesonychidae +Mesonyx +mesoparapteral +mesoparapteron +mesopectus +mesoperiodic +mesopetalum +mesophile +mesophilic +mesophilous +mesophragm +mesophragma +mesophragmal +mesophryon +mesophyll +mesophyllous +mesophyllum +mesophyte +mesophytic +mesophytism +mesopic +mesoplankton +mesoplanktonic +mesoplast +mesoplastic +mesoplastral +mesoplastron +mesopleural +mesopleuron +Mesoplodon +mesoplodont +mesopodial +mesopodiale +mesopodium +mesopotamia +Mesopotamian +mesopotamic +mesoprescutal +mesoprescutum +mesoprosopic +mesopterygial +mesopterygium +mesopterygoid +mesorchial +mesorchium +Mesore +mesorectal +mesorectum +Mesoreodon +mesorrhin +mesorrhinal +mesorrhinian +mesorrhinism +mesorrhinium +mesorrhiny +mesosalpinx +mesosaur +Mesosauria +Mesosaurus +mesoscapula +mesoscapular +mesoscutal +mesoscutellar +mesoscutellum +mesoscutum +mesoseismal +mesoseme +mesosiderite +mesosigmoid +mesoskelic +mesosoma +mesosomatic +mesosome +mesosperm +mesospore +mesosporic +mesosporium +mesostasis +mesosternal +mesosternebra +mesosternebral +mesosternum +mesostethium +Mesostoma +Mesostomatidae +mesostomid +mesostyle +mesostylous +Mesosuchia +mesosuchian +Mesotaeniaceae +Mesotaeniales +mesotarsal +mesotartaric +Mesothelae +mesothelial +mesothelium +mesotherm +mesothermal +mesothesis +mesothet +mesothetic +mesothetical +mesothoracic +mesothoracotheca +mesothorax +mesothorium +mesotonic +mesotroch +mesotrocha +mesotrochal +mesotrochous +mesotron +mesotropic +mesotympanic +mesotype +mesovarian +mesovarium +mesoventral +mesoventrally +mesoxalate +mesoxalic +mesoxalyl +Mesozoa +mesozoan +Mesozoic +mespil +Mespilus +Mespot +mesquite +Mesropian +mess +message +messagery +Messalian +messaline +messan +Messapian +messe +messelite +messenger +messengership +messer +messet +Messiah +Messiahship +Messianic +Messianically +messianically +Messianism +Messianist +Messianize +Messias +messieurs +messily +messin +Messines +Messinese +messiness +messing +messman +messmate +messor +messroom +messrs +messtin +messuage +messy +mestee +mester +mestiza +mestizo +mestome +Mesua +Mesvinian +mesymnion +met +meta +metabasis +metabasite +metabatic +metabiological +metabiology +metabiosis +metabiotic +metabiotically +metabismuthic +metabisulphite +metabletic +Metabola +metabola +metabole +Metabolia +metabolian +metabolic +metabolism +metabolite +metabolizable +metabolize +metabolon +metabolous +metaboly +metaborate +metaboric +metabranchial +metabrushite +metabular +metacarpal +metacarpale +metacarpophalangeal +metacarpus +metacenter +metacentral +metacentric +metacentricity +metachemic +metachemistry +Metachlamydeae +metachlamydeous +metachromasis +metachromatic +metachromatin +metachromatinic +metachromatism +metachrome +metachronism +metachrosis +metacinnabarite +metacism +metacismus +metaclase +metacneme +metacoele +metacoelia +metaconal +metacone +metaconid +metaconule +metacoracoid +metacrasis +metacresol +metacromial +metacromion +metacryst +metacyclic +metacymene +metad +metadiabase +metadiazine +metadiorite +metadiscoidal +metadromous +metafluidal +metaformaldehyde +metafulminuric +metagalactic +metagalaxy +metagaster +metagastric +metagastrula +metage +Metageitnion +metagelatin +metagenesis +metagenetic +metagenetically +metagenic +metageometer +metageometrical +metageometry +metagnath +metagnathism +metagnathous +metagnomy +metagnostic +metagnosticism +metagram +metagrammatism +metagrammatize +metagraphic +metagraphy +metahewettite +metahydroxide +metaigneous +metainfective +metakinesis +metakinetic +metal +metalammonium +metalanguage +metalbumin +metalcraft +metaldehyde +metalepsis +metaleptic +metaleptical +metaleptically +metaler +metaline +metalined +metaling +metalinguistic +metalinguistics +metalism +metalist +metalization +metalize +metallary +metalleity +metallic +metallical +metallically +metallicity +metallicize +metallicly +metallics +metallide +metallifacture +metalliferous +metallification +metalliform +metallify +metallik +metalline +metallism +metallization +metallize +metallochrome +metallochromy +metallogenetic +metallogenic +metallogeny +metallograph +metallographer +metallographic +metallographical +metallographist +metallography +metalloid +metalloidal +metallometer +metallophone +metalloplastic +metallorganic +metallotherapeutic +metallotherapy +metallurgic +metallurgical +metallurgically +metallurgist +metallurgy +metalmonger +metalogic +metalogical +metaloph +metalorganic +metaloscope +metaloscopy +metaluminate +metaluminic +metalware +metalwork +metalworker +metalworking +metalworks +metamathematical +metamathematics +metamer +metameral +metamere +metameric +metamerically +metameride +metamerism +metamerization +metamerized +metamerous +metamery +metamorphic +metamorphism +metamorphize +metamorphopsia +metamorphopsy +metamorphosable +metamorphose +metamorphoser +metamorphoses +metamorphosian +metamorphosic +metamorphosical +metamorphosis +metamorphostical +metamorphotic +metamorphous +metamorphy +Metamynodon +metanalysis +metanauplius +Metanemertini +metanephric +metanephritic +metanephron +metanephros +metanepionic +metanilic +metanitroaniline +metanomen +metanotal +metanotum +metantimonate +metantimonic +metantimonious +metantimonite +metantimonous +metanym +metaorganism +metaparapteral +metaparapteron +metapectic +metapectus +metapepsis +metapeptone +metaperiodic +metaphase +metaphenomenal +metaphenomenon +metaphenylene +metaphenylenediamin +metaphenylenediamine +metaphloem +metaphonical +metaphonize +metaphony +metaphor +metaphoric +metaphorical +metaphorically +metaphoricalness +metaphorist +metaphorize +metaphosphate +metaphosphoric +metaphosphorous +metaphragm +metaphragmal +metaphrase +metaphrasis +metaphrast +metaphrastic +metaphrastical +metaphrastically +metaphyseal +metaphysic +metaphysical +metaphysically +metaphysician +metaphysicianism +metaphysicist +metaphysicize +metaphysicous +metaphysics +metaphysis +metaphyte +metaphytic +metaphyton +metaplasia +metaplasis +metaplasm +metaplasmic +metaplast +metaplastic +metapleural +metapleure +metapleuron +metaplumbate +metaplumbic +metapneumonic +metapneustic +metapodial +metapodiale +metapodium +metapolitic +metapolitical +metapolitician +metapolitics +metapophyseal +metapophysial +metapophysis +metapore +metapostscutellar +metapostscutellum +metaprescutal +metaprescutum +metaprotein +metapsychic +metapsychical +metapsychics +metapsychism +metapsychist +metapsychological +metapsychology +metapsychosis +metapterygial +metapterygium +metapterygoid +metarabic +metarhyolite +metarossite +metarsenic +metarsenious +metarsenite +metasaccharinic +metascutal +metascutellar +metascutellum +metascutum +metasedimentary +metasilicate +metasilicic +metasoma +metasomal +metasomasis +metasomatic +metasomatism +metasomatosis +metasome +metasperm +Metaspermae +metaspermic +metaspermous +metastability +metastable +metastannate +metastannic +metastasis +metastasize +metastatic +metastatical +metastatically +metasternal +metasternum +metasthenic +metastibnite +metastigmate +metastoma +metastome +metastrophe +metastrophic +metastyle +metatantalic +metatarsal +metatarsale +metatarse +metatarsophalangeal +metatarsus +metatatic +metatatically +metataxic +metate +metathalamus +metatheology +Metatheria +metatherian +metatheses +metathesis +metathetic +metathetical +metathetically +metathoracic +metathorax +metatitanate +metatitanic +metatoluic +metatoluidine +metatracheal +metatrophic +metatungstic +metatype +metatypic +Metaurus +metavanadate +metavanadic +metavauxite +metavoltine +metaxenia +metaxite +metaxylem +metaxylene +metayer +Metazoa +metazoal +metazoan +metazoea +metazoic +metazoon +mete +metel +metempiric +metempirical +metempirically +metempiricism +metempiricist +metempirics +metempsychic +metempsychosal +metempsychose +metempsychoses +metempsychosical +metempsychosis +metempsychosize +metemptosis +metencephalic +metencephalon +metensarcosis +metensomatosis +metenteron +metenteronic +meteogram +meteograph +meteor +meteorgraph +meteoric +meteorical +meteorically +meteorism +meteorist +meteoristic +meteorital +meteorite +meteoritic +meteoritics +meteorization +meteorize +meteorlike +meteorogram +meteorograph +meteorographic +meteorography +meteoroid +meteoroidal +meteorolite +meteorolitic +meteorologic +meteorological +meteorologically +meteorologist +meteorology +meteorometer +meteoroscope +meteoroscopy +meteorous +metepencephalic +metepencephalon +metepimeral +metepimeron +metepisternal +metepisternum +meter +meterage +metergram +meterless +meterman +metership +metestick +metewand +meteyard +methacrylate +methacrylic +methadone +methanal +methanate +methane +methanoic +methanolysis +methanometer +metheglin +methemoglobin +methemoglobinemia +methemoglobinuria +methenamine +methene +methenyl +mether +methid +methide +methine +methinks +methiodide +methionic +methionine +methobromide +method +methodaster +methodeutic +methodic +methodical +methodically +methodicalness +methodics +methodism +Methodist +methodist +Methodistic +Methodistically +Methodisty +methodization +Methodize +methodize +methodizer +methodless +methodological +methodologically +methodologist +methodology +Methody +methought +methoxide +methoxychlor +methoxyl +methronic +Methuselah +methyl +methylacetanilide +methylal +methylamine +methylaniline +methylanthracene +methylate +methylation +methylator +methylcholanthrene +methylene +methylenimine +methylenitan +methylethylacetic +methylglycine +methylglycocoll +methylglyoxal +methylic +methylmalonic +methylnaphthalene +methylol +methylolurea +methylosis +methylotic +methylpentose +methylpentoses +methylpropane +methylsulfanol +metic +meticulosity +meticulous +meticulously +meticulousness +metier +Metin +metis +Metoac +metochous +metochy +metoestrous +metoestrum +Metol +metonym +metonymic +metonymical +metonymically +metonymous +metonymously +metonymy +metope +Metopias +metopic +metopion +metopism +Metopoceros +metopomancy +metopon +metoposcopic +metoposcopical +metoposcopist +metoposcopy +metosteal +metosteon +metoxazine +metoxenous +metoxeny +metra +metralgia +metranate +metranemia +metratonia +Metrazol +metrectasia +metrectatic +metrectomy +metrectopia +metrectopic +metrectopy +metreless +metreship +metreta +metrete +metretes +metria +metric +metrical +metrically +metrician +metricism +metricist +metricize +metrics +Metridium +metrification +metrifier +metrify +metriocephalic +metrist +metritis +metrocampsis +metrocarat +metrocarcinoma +metrocele +metroclyst +metrocolpocele +metrocracy +metrocratic +metrocystosis +metrodynia +metrofibroma +metrological +metrologist +metrologue +metrology +metrolymphangitis +metromalacia +metromalacoma +metromalacosis +metromania +metromaniac +metromaniacal +metrometer +metroneuria +metronome +metronomic +metronomical +metronomically +metronymic +metronymy +metroparalysis +metropathia +metropathic +metropathy +metroperitonitis +metrophlebitis +metrophotography +metropole +metropolis +metropolitan +metropolitanate +metropolitancy +metropolitanism +metropolitanize +metropolitanship +metropolite +metropolitic +metropolitical +metropolitically +metroptosia +metroptosis +metroradioscope +metrorrhagia +metrorrhagic +metrorrhea +metrorrhexis +metrorthosis +metrosalpingitis +metrosalpinx +metroscirrhus +metroscope +metroscopy +Metrosideros +metrostaxis +metrostenosis +metrosteresis +metrostyle +metrosynizesis +metrotherapist +metrotherapy +metrotome +metrotomy +Metroxylon +mettar +mettle +mettled +mettlesome +mettlesomely +mettlesomeness +metusia +metze +Meum +meuse +meute +Mev +mew +meward +mewer +mewl +mewler +Mexica +Mexican +Mexicanize +Mexitl +Mexitli +meyerhofferite +mezcal +Mezentian +Mezentism +Mezentius +mezereon +mezereum +mezuzah +mezzanine +mezzo +mezzograph +mezzotint +mezzotinter +mezzotinto +mho +mhometer +mi +Miami +miamia +mian +Miao +Miaotse +Miaotze +miaow +miaower +Miaplacidus +miargyrite +miarolitic +mias +miaskite +miasm +miasma +miasmal +miasmata +miasmatic +miasmatical +miasmatically +miasmatize +miasmatology +miasmatous +miasmic +miasmology +miasmous +Miastor +miaul +miauler +mib +mica +micaceous +micacious +micacite +Micah +micasization +micasize +micate +mication +Micawberish +Micawberism +mice +micellar +micelle +Michabo +Michabou +Michael +Michaelites +Michaelmas +Michaelmastide +miche +Micheal +Michel +Michelangelesque +Michelangelism +Michelia +Michelle +micher +Michiel +Michigamea +Michigan +michigan +Michigander +Michiganite +miching +Michoacan +Michoacano +micht +Mick +mick +Mickey +mickle +Micky +Micmac +mico +miconcave +Miconia +micramock +Micrampelis +micranatomy +micrander +micrandrous +micraner +micranthropos +Micraster +micrencephalia +micrencephalic +micrencephalous +micrencephalus +micrencephaly +micrergate +micresthete +micrify +micro +microammeter +microampere +microanalysis +microanalyst +microanalytical +microangstrom +microapparatus +microbal +microbalance +microbar +microbarograph +microbattery +microbe +microbeless +microbeproof +microbial +microbian +microbic +microbicidal +microbicide +microbiologic +microbiological +microbiologically +microbiologist +microbiology +microbion +microbiosis +microbiota +microbiotic +microbious +microbism +microbium +microblast +microblepharia +microblepharism +microblephary +microbrachia +microbrachius +microburet +microburette +microburner +microcaltrop +microcardia +microcardius +microcarpous +Microcebus +microcellular +microcentrosome +microcentrum +microcephal +microcephalia +microcephalic +microcephalism +microcephalous +microcephalus +microcephaly +microceratous +microchaeta +microcharacter +microcheilia +microcheiria +microchemic +microchemical +microchemically +microchemistry +microchiria +Microchiroptera +microchiropteran +microchiropterous +microchromosome +microchronometer +microcinema +microcinematograph +microcinematographic +microcinematography +Microcitrus +microclastic +microclimate +microclimatic +microclimatologic +microclimatological +microclimatology +microcline +microcnemia +microcoat +micrococcal +Micrococceae +Micrococcus +microcoleoptera +microcolon +microcolorimeter +microcolorimetric +microcolorimetrically +microcolorimetry +microcolumnar +microcombustion +microconidial +microconidium +microconjugant +Microconodon +microconstituent +microcopy +microcoria +microcosm +microcosmal +microcosmian +microcosmic +microcosmical +microcosmography +microcosmology +microcosmos +microcosmus +microcoulomb +microcranous +microcrith +microcryptocrystalline +microcrystal +microcrystalline +microcrystallogeny +microcrystallography +microcrystalloscopy +microcurie +Microcyprini +microcyst +microcyte +microcythemia +microcytosis +microdactylia +microdactylism +microdactylous +microdentism +microdentous +microdetection +microdetector +microdetermination +microdiactine +microdissection +microdistillation +microdont +microdontism +microdontous +microdose +microdrawing +Microdrili +microdrive +microelectrode +microelectrolysis +microelectroscope +microelement +microerg +microestimation +microeutaxitic +microevolution +microexamination +microfarad +microfauna +microfelsite +microfelsitic +microfilaria +microfilm +microflora +microfluidal +microfoliation +microfossil +microfungus +microfurnace +Microgadus +microgalvanometer +microgamete +microgametocyte +microgametophyte +microgamy +Microgaster +microgastria +Microgastrinae +microgastrine +microgeological +microgeologist +microgeology +microgilbert +microglia +microglossia +micrognathia +micrognathic +micrognathous +microgonidial +microgonidium +microgram +microgramme +microgranite +microgranitic +microgranitoid +microgranular +microgranulitic +micrograph +micrographer +micrographic +micrographical +micrographically +micrographist +micrography +micrograver +microgravimetric +microgroove +microgyne +microgyria +microhenry +microhepatia +microhistochemical +microhistology +microhm +microhmmeter +Microhymenoptera +microhymenopteron +microinjection +microjoule +microlepidopter +microlepidoptera +microlepidopteran +microlepidopterist +microlepidopteron +microlepidopterous +microleukoblast +microlevel +microlite +microliter +microlith +microlithic +microlitic +micrologic +micrological +micrologically +micrologist +micrologue +micrology +microlux +micromania +micromaniac +micromanipulation +micromanipulator +micromanometer +Micromastictora +micromazia +micromeasurement +micromechanics +micromelia +micromelic +micromelus +micromembrane +micromeral +micromere +Micromeria +micromeric +micromerism +micromeritic +micromeritics +micromesentery +micrometallographer +micrometallography +micrometallurgy +micrometer +micromethod +micrometrical +micrometrically +micrometry +micromicrofarad +micromicron +micromil +micromillimeter +micromineralogical +micromineralogy +micromorph +micromotion +micromotoscope +micromyelia +micromyeloblast +micron +Micronesian +micronization +micronize +micronometer +micronuclear +micronucleus +micronutrient +microorganic +microorganism +microorganismal +micropaleontology +micropantograph +microparasite +microparasitic +micropathological +micropathologist +micropathology +micropegmatite +micropegmatitic +micropenis +microperthite +microperthitic +micropetalous +micropetrography +micropetrologist +micropetrology +microphage +microphagocyte +microphagous +microphagy +microphakia +microphallus +microphone +microphonic +microphonics +microphonograph +microphot +microphotograph +microphotographic +microphotography +microphotometer +microphotoscope +microphthalmia +microphthalmic +microphthalmos +microphthalmus +microphyllous +microphysical +microphysics +microphysiography +microphytal +microphyte +microphytic +microphytology +micropia +micropin +micropipette +microplakite +microplankton +microplastocyte +microplastometer +micropodal +Micropodi +micropodia +Micropodidae +Micropodiformes +micropoecilitic +micropoicilitic +micropoikilitic +micropolariscope +micropolarization +micropore +microporosity +microporous +microporphyritic +microprint +microprojector +micropsia +micropsy +micropterism +micropterous +Micropterus +micropterygid +Micropterygidae +micropterygious +Micropterygoidea +Micropteryx +Micropus +micropylar +micropyle +micropyrometer +microradiometer +microreaction +microrefractometer +microrhabdus +microrheometer +microrheometric +microrheometrical +Microrhopias +Microsauria +microsaurian +microsclere +microsclerous +microsclerum +microscopal +microscope +microscopial +microscopic +microscopical +microscopically +microscopics +Microscopid +microscopist +Microscopium +microscopize +microscopy +microsecond +microsection +microseism +microseismic +microseismical +microseismograph +microseismology +microseismometer +microseismometrograph +microseismometry +microseme +microseptum +microsmatic +microsmatism +microsoma +microsomatous +microsome +microsomia +microsommite +Microsorex +microspecies +microspectroscope +microspectroscopic +microspectroscopy +Microspermae +microspermous +Microsphaera +microsphaeric +microsphere +microspheric +microspherulitic +microsplanchnic +microsplenia +microsplenic +microsporange +microsporangium +microspore +microsporiasis +microsporic +Microsporidia +microsporidian +Microsporon +microsporophore +microsporophyll +microsporosis +microsporous +Microsporum +microstat +microsthene +Microsthenes +microsthenic +microstomatous +microstome +microstomia +microstomous +microstructural +microstructure +Microstylis +microstylospore +microstylous +microsublimation +microtasimeter +microtechnic +microtechnique +microtelephone +microtelephonic +Microthelyphonida +microtheos +microtherm +microthermic +microthorax +Microthyriaceae +microtia +Microtinae +microtine +microtitration +microtome +microtomic +microtomical +microtomist +microtomy +microtone +Microtus +microtypal +microtype +microtypical +microvolt +microvolume +microvolumetric +microwatt +microwave +microweber +microzoa +microzoal +microzoan +microzoaria +microzoarian +microzoary +microzoic +microzone +microzooid +microzoology +microzoon +microzoospore +microzyma +microzyme +microzymian +micrurgic +micrurgical +micrurgist +micrurgy +Micrurus +miction +micturate +micturition +mid +midafternoon +midautumn +midaxillary +midbrain +midday +midden +middenstead +middle +middlebreaker +middlebuster +middleman +middlemanism +middlemanship +middlemost +middler +middlesplitter +middlewards +middleway +middleweight +middlewoman +middling +middlingish +middlingly +middlingness +middlings +middorsal +middy +mide +Mider +midevening +midewiwin +midfacial +midforenoon +midfrontal +midge +midget +midgety +midgy +midheaven +Midianite +Midianitish +Mididae +midiron +midland +Midlander +Midlandize +midlandward +midlatitude +midleg +midlenting +midmain +midmandibular +midmonth +midmonthly +midmorn +midmorning +midmost +midnight +midnightly +midnoon +midparent +midparentage +midparental +midpit +midrange +midrash +midrashic +midrib +midribbed +midriff +mids +midseason +midsentence +midship +midshipman +midshipmanship +midshipmite +midships +midspace +midst +midstory +midstout +midstream +midstreet +midstroke +midstyled +midsummer +midsummerish +midsummery +midtap +midvein +midverse +midward +midwatch +midway +midweek +midweekly +Midwest +Midwestern +Midwesterner +midwestward +midwife +midwifery +midwinter +midwinterly +midwintry +midwise +midyear +Miek +mien +miersite +Miescherian +miff +miffiness +miffy +mig +might +mightily +mightiness +mightless +mightnt +mighty +mightyhearted +mightyship +miglio +migmatite +migniardise +mignon +mignonette +mignonne +mignonness +Migonitis +migraine +migrainoid +migrainous +migrant +migrate +migration +migrational +migrationist +migrative +migrator +migratorial +migratory +Miguel +miharaite +mihrab +mijakite +mijl +mikado +mikadoate +mikadoism +Mikael +Mikania +Mikasuki +Mike +mike +Mikey +Miki +mikie +Mikir +Mil +mil +mila +milady +milammeter +Milan +Milanese +Milanion +milarite +milch +milcher +milchy +mild +milden +milder +mildew +mildewer +mildewy +mildhearted +mildheartedness +mildish +mildly +mildness +Mildred +mile +mileage +Miledh +milepost +miler +Miles +Milesian +milesima +Milesius +milestone +mileway +milfoil +milha +miliaceous +miliarensis +miliaria +miliarium +miliary +Milicent +milieu +Miliola +milioliform +milioline +miliolite +miliolitic +militancy +militant +militantly +militantness +militarily +militariness +militarism +militarist +militaristic +militaristically +militarization +militarize +military +militaryism +militaryment +militaster +militate +militation +militia +militiaman +militiate +milium +milk +milkbush +milken +milker +milkeress +milkfish +milkgrass +milkhouse +milkily +milkiness +milking +milkless +milklike +milkmaid +milkman +milkness +milkshed +milkshop +milksick +milksop +milksopism +milksoppery +milksopping +milksoppish +milksoppy +milkstone +milkweed +milkwood +milkwort +milky +mill +Milla +milla +millable +millage +millboard +millclapper +millcourse +milldam +mille +milled +millefiori +milleflorous +millefoliate +millenarian +millenarianism +millenarist +millenary +millennia +millennial +millennialism +millennialist +millennially +millennian +millenniarism +millenniary +millennium +millepede +Millepora +millepore +milleporiform +milleporine +milleporite +milleporous +millepunctate +miller +milleress +millering +Millerism +Millerite +millerite +millerole +millesimal +millesimally +millet +Millettia +millfeed +millful +millhouse +milliad +milliammeter +milliamp +milliampere +milliamperemeter +milliangstrom +milliard +milliardaire +milliare +milliarium +milliary +millibar +millicron +millicurie +Millie +millieme +milliequivalent +millifarad +millifold +milliform +milligal +milligrade +milligram +milligramage +millihenry +millilambert +millile +milliliter +millilux +millimeter +millimicron +millimolar +millimole +millincost +milline +milliner +millinerial +millinering +millinery +milling +Millingtonia +millinormal +millinormality +millioctave +millioersted +million +millionaire +millionairedom +millionairess +millionairish +millionairism +millionary +millioned +millioner +millionfold +millionism +millionist +millionize +millionocracy +millions +millionth +milliphot +millipoise +millisecond +millistere +Millite +millithrum +millivolt +millivoltmeter +millman +millocracy +millocrat +millocratism +millosevichite +millowner +millpond +millpool +millpost +millrace +millrynd +millsite +millstock +millstone +millstream +milltail +millward +millwork +millworker +millwright +millwrighting +Milly +Milner +milner +Milo +milo +milord +milpa +milreis +milsey +milsie +milt +milter +miltlike +Miltonia +Miltonian +Miltonic +Miltonically +Miltonism +Miltonist +Miltonize +Miltos +miltsick +miltwaste +milty +Milvago +Milvinae +milvine +milvinous +Milvus +milzbrand +mim +mima +mimbar +mimble +Mimbreno +Mime +mime +mimeo +mimeograph +mimeographic +mimeographically +mimeographist +mimer +mimesis +mimester +mimetene +mimetesite +mimetic +mimetical +mimetically +mimetism +mimetite +Mimi +mimiambi +mimiambic +mimiambics +mimic +mimical +mimically +mimicism +mimicker +mimicry +Mimidae +Miminae +mimine +miminypiminy +mimly +mimmation +mimmest +mimmock +mimmocking +mimmocky +mimmood +mimmoud +mimmouthed +mimmouthedness +mimodrama +mimographer +mimography +mimologist +Mimosa +Mimosaceae +mimosaceous +mimosis +mimosite +mimotype +mimotypic +mimp +Mimpei +mimsey +Mimulus +Mimus +Mimusops +min +Mina +mina +minable +minacious +minaciously +minaciousness +minacity +Minaean +Minahassa +Minahassan +Minahassian +minar +minaret +minareted +minargent +minasragrite +minatorial +minatorially +minatorily +minatory +minaway +mince +mincemeat +mincer +minchery +minchiate +mincing +mincingly +mincingness +Mincopi +Mincopie +mind +minded +Mindel +Mindelian +minder +Mindererus +mindful +mindfully +mindfulness +minding +mindless +mindlessly +mindlessness +mindsight +mine +mineowner +miner +mineragraphic +mineragraphy +mineraiogic +mineral +mineralizable +mineralization +mineralize +mineralizer +mineralogical +mineralogically +mineralogist +mineralogize +mineralogy +Minerva +minerval +Minervan +Minervic +minery +mines +minette +mineworker +Ming +ming +minge +mingelen +mingle +mingleable +mingledly +minglement +mingler +minglingly +Mingo +Mingrelian +minguetite +mingwort +mingy +minhag +minhah +miniaceous +miniate +miniator +miniature +miniaturist +minibus +minicam +minicamera +Miniconjou +minienize +minification +minify +minikin +minikinly +minim +minima +minimacid +minimal +minimalism +Minimalist +minimalkaline +minimally +minimetric +minimifidian +minimifidianism +minimism +minimistic +Minimite +minimitude +minimization +minimize +minimizer +minimum +minimus +minimuscular +mining +minion +minionette +minionism +minionly +minionship +minish +minisher +minishment +minister +ministeriable +ministerial +ministerialism +ministerialist +ministeriality +ministerially +ministerialness +ministerium +ministership +ministrable +ministrant +ministration +ministrative +ministrator +ministrer +ministress +ministry +ministryship +minitant +Minitari +minium +miniver +minivet +mink +minkery +minkish +Minkopi +Minnehaha +minnesinger +minnesong +Minnesotan +Minnetaree +Minnie +minnie +minniebush +minning +minnow +minny +mino +Minoan +minoize +minometer +minor +minorage +minorate +minoration +Minorca +Minorcan +Minoress +minoress +Minorist +Minorite +minority +minorship +Minos +minot +Minotaur +Minseito +minsitive +minster +minsteryard +minstrel +minstreless +minstrelship +minstrelsy +mint +mintage +Mintaka +mintbush +minter +mintmaker +mintmaking +mintman +mintmaster +minty +minuend +minuet +minuetic +minuetish +minus +minuscular +minuscule +minutary +minutation +minute +minutely +minuteman +minuteness +minuter +minuthesis +minutia +minutiae +minutial +minutiose +minutiously +minutissimic +minverite +minx +minxish +minxishly +minxishness +minxship +miny +Minyadidae +Minyae +Minyan +minyan +Minyas +miocardia +Miocene +Miocenic +Miohippus +miolithic +mioplasmia +miothermic +miqra +miquelet +mir +Mira +Mirabel +Mirabell +mirabiliary +Mirabilis +mirabilite +Mirac +Mirach +mirach +miracidial +miracidium +miracle +miraclemonger +miraclemongering +miraclist +miraculist +miraculize +miraculosity +miraculous +miraculously +miraculousness +mirador +mirage +miragy +Mirak +Miramolin +Mirana +Miranda +mirandous +Miranha +Miranhan +mirate +mirbane +mird +mirdaha +mire +mirepoix +Mirfak +Miriam +Miriamne +mirid +Miridae +mirific +miriness +mirish +mirk +mirkiness +mirksome +mirliton +Miro +miro +Mirounga +mirror +mirrored +mirrorize +mirrorlike +mirrorscope +mirrory +mirth +mirthful +mirthfully +mirthfulness +mirthless +mirthlessly +mirthlessness +mirthsome +mirthsomeness +miry +miryachit +mirza +misaccent +misaccentuation +misachievement +misacknowledge +misact +misadapt +misadaptation +misadd +misaddress +misadjust +misadmeasurement +misadministration +misadvantage +misadventure +misadventurer +misadventurous +misadventurously +misadvertence +misadvice +misadvise +misadvised +misadvisedly +misadvisedness +misaffected +misaffection +misaffirm +misagent +misaim +misalienate +misalignment +misallegation +misallege +misalliance +misallotment +misallowance +misally +misalphabetize +misalter +misanalyze +misandry +misanswer +misanthrope +misanthropia +misanthropic +misanthropical +misanthropically +misanthropism +misanthropist +misanthropize +misanthropy +misapparel +misappear +misappearance +misappellation +misapplication +misapplier +misapply +misappoint +misappointment +misappraise +misappraisement +misappreciate +misappreciation +misappreciative +misapprehend +misapprehendingly +misapprehensible +misapprehension +misapprehensive +misapprehensively +misapprehensiveness +misappropriate +misappropriately +misappropriation +misarchism +misarchist +misarrange +misarrangement +misarray +misascribe +misascription +misasperse +misassay +misassent +misassert +misassign +misassociate +misassociation +misatone +misattend +misattribute +misattribution +misaunter +misauthorization +misauthorize +misaward +misbandage +misbaptize +misbecome +misbecoming +misbecomingly +misbecomingness +misbefitting +misbeget +misbegin +misbegotten +misbehave +misbehavior +misbeholden +misbelief +misbelieve +misbeliever +misbelievingly +misbelove +misbeseem +misbestow +misbestowal +misbetide +misbias +misbill +misbind +misbirth +misbode +misborn +misbrand +misbuild +misbusy +miscalculate +miscalculation +miscalculator +miscall +miscaller +miscanonize +miscarriage +miscarriageable +miscarry +miscast +miscasualty +misceability +miscegenate +miscegenation +miscegenationist +miscegenator +miscegenetic +miscegine +miscellanarian +miscellanea +miscellaneity +miscellaneous +miscellaneously +miscellaneousness +miscellanist +miscellany +mischallenge +mischance +mischanceful +mischancy +mischaracterization +mischaracterize +mischarge +mischief +mischiefful +mischieve +mischievous +mischievously +mischievousness +mischio +mischoice +mischoose +mischristen +miscibility +miscible +miscipher +misclaim +misclaiming +misclass +misclassification +misclassify +miscognizant +miscoin +miscoinage +miscollocation +miscolor +miscoloration +miscommand +miscommit +miscommunicate +miscompare +miscomplacence +miscomplain +miscomplaint +miscompose +miscomprehend +miscomprehension +miscomputation +miscompute +misconceive +misconceiver +misconception +misconclusion +miscondition +misconduct +misconfer +misconfidence +misconfident +misconfiguration +misconjecture +misconjugate +misconjugation +misconjunction +misconsecrate +misconsequence +misconstitutional +misconstruable +misconstruct +misconstruction +misconstructive +misconstrue +misconstruer +miscontinuance +misconvenient +misconvey +miscook +miscookery +miscorrect +miscorrection +miscounsel +miscount +miscovet +miscreancy +miscreant +miscreate +miscreation +miscreative +miscreator +miscredited +miscredulity +miscreed +miscript +miscrop +miscue +miscultivated +misculture +miscurvature +miscut +misdate +misdateful +misdaub +misdeal +misdealer +misdecide +misdecision +misdeclaration +misdeclare +misdeed +misdeem +misdeemful +misdefine +misdeformed +misdeliver +misdelivery +misdemean +misdemeanant +misdemeanist +misdemeanor +misdentition +misderivation +misderive +misdescribe +misdescriber +misdescription +misdescriptive +misdesire +misdetermine +misdevise +misdevoted +misdevotion +misdiet +misdirect +misdirection +misdispose +misdisposition +misdistinguish +misdistribute +misdistribution +misdivide +misdivision +misdo +misdoer +misdoing +misdoubt +misdower +misdraw +misdread +misdrive +mise +misease +misecclesiastic +misedit +miseducate +miseducation +miseducative +miseffect +misemphasis +misemphasize +misemploy +misemployment +misencourage +misendeavor +misenforce +misengrave +misenite +misenjoy +misenroll +misentitle +misenunciation +Misenus +miser +miserabilism +miserabilist +miserabilistic +miserability +miserable +miserableness +miserably +miserdom +miserected +Miserere +miserhood +misericord +Misericordia +miserism +miserliness +miserly +misery +misesteem +misestimate +misestimation +misexample +misexecute +misexecution +misexpectation +misexpend +misexpenditure +misexplain +misexplanation +misexplication +misexposition +misexpound +misexpress +misexpression +misexpressive +misfaith +misfare +misfashion +misfather +misfault +misfeasance +misfeasor +misfeature +misfield +misfigure +misfile +misfire +misfit +misfond +misform +misformation +misfortunate +misfortunately +misfortune +misfortuned +misfortuner +misframe +misgauge +misgesture +misgive +misgiving +misgivingly +misgo +misgotten +misgovern +misgovernance +misgovernment +misgovernor +misgracious +misgraft +misgrave +misground +misgrow +misgrown +misgrowth +misguess +misguggle +misguidance +misguide +misguided +misguidedly +misguidedness +misguider +misguiding +misguidingly +mishandle +mishap +mishappen +Mishikhwutmetunne +mishmash +mishmee +Mishmi +Mishnah +Mishnaic +Mishnic +Mishnical +Mishongnovi +misidentification +misidentify +Misima +misimagination +misimagine +misimpression +misimprove +misimprovement +misimputation +misimpute +misincensed +misincite +misinclination +misincline +misinfer +misinference +misinflame +misinform +misinformant +misinformation +misinformer +misingenuity +misinspired +misinstruct +misinstruction +misinstructive +misintelligence +misintelligible +misintend +misintention +misinter +misinterment +misinterpret +misinterpretable +misinterpretation +misinterpreter +misintimation +misjoin +misjoinder +misjudge +misjudgement +misjudger +misjudgingly +misjudgment +miskeep +misken +miskenning +miskill +miskindle +misknow +misknowledge +misky +mislabel +mislabor +mislanguage +mislay +mislayer +mislead +misleadable +misleader +misleading +misleadingly +misleadingness +mislear +misleared +mislearn +misled +mislest +mislight +mislike +misliken +mislikeness +misliker +mislikingly +mislippen +mislive +mislocate +mislocation +mislodge +mismade +mismake +mismanage +mismanageable +mismanagement +mismanager +mismarriage +mismarry +mismatch +mismatchment +mismate +mismeasure +mismeasurement +mismenstruation +misminded +mismingle +mismotion +mismove +misname +misnarrate +misnatured +misnavigation +Misniac +misnomed +misnomer +misnumber +misnurture +misnutrition +misobedience +misobey +misobservance +misobserve +misocapnic +misocapnist +misocatholic +misoccupy +misogallic +misogamic +misogamist +misogamy +misogyne +misogynic +misogynical +misogynism +misogynist +misogynistic +misogynistical +misogynous +misogyny +misohellene +misologist +misology +misomath +misoneism +misoneist +misoneistic +misopaterist +misopedia +misopedism +misopedist +misopinion +misopolemical +misorder +misordination +misorganization +misorganize +misoscopist +misosophist +misosophy +misotheism +misotheist +misotheistic +misotramontanism +misotyranny +misoxene +misoxeny +mispage +mispagination +mispaint +misparse +mispart +mispassion +mispatch +mispay +misperceive +misperception +misperform +misperformance +mispersuade +misperuse +misphrase +mispick +mispickel +misplace +misplacement +misplant +misplay +misplead +mispleading +misplease +mispoint +mispoise +mispolicy +misposition +mispossessed +mispractice +mispraise +misprejudiced +misprincipled +misprint +misprisal +misprision +misprize +misprizer +misproceeding +misproduce +misprofess +misprofessor +mispronounce +mispronouncement +mispronunciation +misproportion +misproposal +mispropose +misproud +misprovide +misprovidence +misprovoke +mispunctuate +mispunctuation +mispurchase +mispursuit +misput +misqualify +misquality +misquotation +misquote +misquoter +misraise +misrate +misread +misreader +misrealize +misreason +misreceive +misrecital +misrecite +misreckon +misrecognition +misrecognize +misrecollect +misrefer +misreference +misreflect +misreform +misregulate +misrehearsal +misrehearse +misrelate +misrelation +misreliance +misremember +misremembrance +misrender +misrepeat +misreport +misreporter +misreposed +misrepresent +misrepresentation +misrepresentative +misrepresenter +misreprint +misrepute +misresemblance +misresolved +misresult +misreward +misrhyme +misrhymer +misrule +miss +missable +missal +missay +missayer +misseem +missel +missemblance +missentence +misserve +misservice +misset +misshape +misshapen +misshapenly +misshapenness +misshood +missible +missile +missileproof +missiness +missing +missingly +mission +missional +missionarize +missionary +missionaryship +missioner +missionize +missionizer +missis +Missisauga +missish +missishness +Mississippi +Mississippian +missive +missmark +missment +Missouri +Missourian +Missourianism +missourite +misspeak +misspeech +misspell +misspelling +misspend +misspender +misstate +misstatement +misstater +misstay +misstep +missuade +missuggestion +missummation +missuppose +missy +missyish +missyllabication +missyllabify +mist +mistakable +mistakableness +mistakably +mistake +mistakeful +mistaken +mistakenly +mistakenness +mistakeproof +mistaker +mistaking +mistakingly +mistassini +mistaught +mistbow +misteach +misteacher +misted +mistell +mistempered +mistend +mistendency +Mister +mister +misterm +mistetch +mistfall +mistflower +mistful +misthink +misthought +misthread +misthrift +misthrive +misthrow +mistic +mistide +mistify +mistigris +mistily +mistime +mistiness +mistitle +mistle +mistless +mistletoe +mistone +mistonusk +mistook +mistouch +mistradition +mistrain +mistral +mistranscribe +mistranscript +mistranscription +mistranslate +mistranslation +mistreat +mistreatment +mistress +mistressdom +mistresshood +mistressless +mistressly +mistrial +mistrist +mistrust +mistruster +mistrustful +mistrustfully +mistrustfulness +mistrusting +mistrustingly +mistrustless +mistry +mistryst +misturn +mistutor +misty +mistyish +misunderstand +misunderstandable +misunderstander +misunderstanding +misunderstandingly +misunderstood +misunderstoodness +misura +misusage +misuse +misuseful +misusement +misuser +misusurped +misvaluation +misvalue +misventure +misventurous +misvouch +miswed +miswisdom +miswish +misword +misworship +misworshiper +misworshipper +miswrite +misyoke +miszealous +Mitakshara +Mitanni +Mitannian +Mitannish +mitapsis +Mitch +mitchboard +Mitchell +Mitchella +mite +Mitella +miteproof +miter +mitered +miterer +miterflower +miterwort +Mithra +Mithraea +Mithraeum +Mithraic +Mithraicism +Mithraicist +Mithraicize +Mithraism +Mithraist +Mithraistic +Mithraitic +Mithraize +Mithras +Mithratic +Mithriac +mithridate +Mithridatic +mithridatic +mithridatism +mithridatize +miticidal +miticide +mitigable +mitigant +mitigate +mitigatedly +mitigation +mitigative +mitigator +mitigatory +mitis +mitochondria +mitochondrial +mitogenetic +mitome +mitosis +mitosome +mitotic +mitotically +Mitra +mitra +mitrailleuse +mitral +mitrate +mitre +mitrer +Mitridae +mitriform +Mitsukurina +Mitsukurinidae +mitsumata +mitt +mittelhand +Mittelmeer +mitten +mittened +mittimus +mitty +Mitu +Mitua +mity +miurus +mix +mixable +mixableness +mixblood +Mixe +mixed +mixedly +mixedness +mixen +mixer +mixeress +mixhill +mixible +mixite +mixobarbaric +mixochromosome +Mixodectes +Mixodectidae +mixolydian +mixoploid +mixoploidy +Mixosaurus +mixotrophic +Mixtec +Mixtecan +mixtiform +mixtilineal +mixtilion +mixtion +mixture +mixy +Mizar +mizmaze +Mizpah +Mizraim +mizzen +mizzenmast +mizzenmastman +mizzentopman +mizzle +mizzler +mizzly +mizzonite +mizzy +mlechchha +mneme +mnemic +Mnemiopsis +mnemonic +mnemonical +mnemonicalist +mnemonically +mnemonicon +mnemonics +mnemonism +mnemonist +mnemonization +mnemonize +Mnemosyne +mnemotechnic +mnemotechnical +mnemotechnics +mnemotechnist +mnemotechny +mnesic +mnestic +Mnevis +Mniaceae +mniaceous +mnioid +Mniotiltidae +Mnium +Mo +mo +Moabite +Moabitess +Moabitic +Moabitish +moan +moanful +moanfully +moanification +moaning +moaningly +moanless +Moaria +Moarian +moat +Moattalite +mob +mobable +mobbable +mobber +mobbish +mobbishly +mobbishness +mobbism +mobbist +mobby +mobcap +mobed +mobile +Mobilian +mobilianer +mobiliary +mobility +mobilizable +mobilization +mobilize +mobilometer +moble +moblike +mobocracy +mobocrat +mobocratic +mobocratical +mobolatry +mobproof +mobship +mobsman +mobster +Mobula +Mobulidae +moccasin +Mocha +mocha +Mochica +mochras +mock +mockable +mockado +mockbird +mocker +mockernut +mockery +mockful +mockfully +mockground +mockingbird +mockingstock +mocmain +Mocoa +Mocoan +mocomoco +mocuck +Mod +modal +modalism +modalist +modalistic +modality +modalize +modally +mode +model +modeler +modeless +modelessness +modeling +modelist +modeller +modelmaker +modelmaking +modena +Modenese +moderant +moderantism +moderantist +moderate +moderately +moderateness +moderation +moderationist +moderatism +moderatist +moderato +moderator +moderatorship +moderatrix +Modern +modern +moderner +modernicide +modernish +modernism +modernist +modernistic +modernity +modernizable +modernization +modernize +modernizer +modernly +modernness +modest +modestly +modestness +modesty +modiation +modicity +modicum +modifiability +modifiable +modifiableness +modifiably +modificability +modificable +modification +modificationist +modificative +modificator +modificatory +modifier +modify +modillion +modiolar +Modiolus +modiolus +modish +modishly +modishness +modist +modiste +modistry +modius +Modoc +Modred +modulability +modulant +modular +modulate +modulation +modulative +modulator +modulatory +module +Modulidae +modulo +modulus +modumite +Moe +Moed +Moehringia +moellon +moerithere +moeritherian +Moeritheriidae +Moeritherium +mofette +moff +mofussil +mofussilite +mog +mogador +mogadore +mogdad +moggan +moggy +Moghan +mogigraphia +mogigraphic +mogigraphy +mogilalia +mogilalism +mogiphonia +mogitocia +mogo +mogographia +Mogollon +Mograbi +Mogrebbin +moguey +Mogul +mogulship +Moguntine +moha +mohabat +mohair +Mohammad +Mohammedan +Mohammedanism +Mohammedanization +Mohammedanize +Mohammedism +Mohammedist +Mohammedization +Mohammedize +mohar +Mohave +Mohawk +Mohawkian +mohawkite +Mohegan +mohel +Mohican +Mohineyam +mohnseed +moho +Mohock +Mohockism +mohr +Mohrodendron +mohur +Moi +moider +moidore +moieter +moiety +moil +moiler +moiles +moiley +moiling +moilingly +moilsome +moineau +Moingwena +moio +Moira +moire +moirette +moise +Moism +moissanite +moist +moisten +moistener +moistful +moistify +moistish +moistishness +moistless +moistly +moistness +moisture +moistureless +moistureproof +moisty +moit +moity +mojarra +Mojo +mojo +mokaddam +moke +moki +mokihana +moko +moksha +mokum +moky +Mola +mola +molal +Molala +molality +molar +molariform +molarimeter +molarity +molary +Molasse +molasses +molassied +molassy +molave +mold +moldability +moldable +moldableness +Moldavian +moldavite +moldboard +molder +moldery +moldiness +molding +moldmade +moldproof +moldwarp +moldy +Mole +mole +molecast +molecula +molecular +molecularist +molecularity +molecularly +molecule +molehead +moleheap +molehill +molehillish +molehilly +moleism +molelike +molendinar +molendinary +molengraaffite +moleproof +moler +moleskin +molest +molestation +molester +molestful +molestfully +Molge +Molgula +Molidae +molimen +moliminous +molinary +moline +Molinia +Molinism +Molinist +Molinistic +molka +Moll +molland +Mollberg +molle +mollescence +mollescent +molleton +mollichop +mollicrush +mollie +mollienisia +mollient +molliently +mollifiable +mollification +mollifiedly +mollifier +mollify +mollifying +mollifyingly +mollifyingness +molligrant +molligrubs +mollipilose +Mollisiaceae +mollisiose +mollities +mollitious +mollitude +Molluginaceae +Mollugo +Mollusca +molluscan +molluscivorous +molluscoid +Molluscoida +molluscoidal +molluscoidan +Molluscoidea +molluscoidean +molluscous +molluscousness +molluscum +mollusk +Molly +molly +mollycoddle +mollycoddler +mollycoddling +mollycosset +mollycot +mollyhawk +molman +Moloch +Molochize +Molochship +moloid +moloker +molompi +molosse +Molossian +molossic +Molossidae +molossine +molossoid +molossus +Molothrus +molpe +molrooken +molt +molten +moltenly +molter +Molucca +Moluccan +Moluccella +Moluche +moly +molybdate +molybdena +molybdenic +molybdeniferous +molybdenite +molybdenous +molybdenum +molybdic +molybdite +molybdocardialgia +molybdocolic +molybdodyspepsia +molybdomancy +molybdomenite +molybdonosus +molybdoparesis +molybdophyllite +molybdosis +molybdous +molysite +mombin +momble +Mombottu +mome +moment +momenta +momental +momentally +momentaneall +momentaneity +momentaneous +momentaneously +momentaneousness +momentarily +momentariness +momentary +momently +momentous +momentously +momentousness +momentum +momiology +momism +momme +mommet +mommy +momo +Momordica +Momotidae +Momotinae +Momotus +Momus +Mon +mon +mona +Monacan +monacanthid +Monacanthidae +monacanthine +monacanthous +Monacha +monachal +monachate +Monachi +monachism +monachist +monachization +monachize +monactin +monactine +monactinellid +monactinellidan +monad +monadelph +Monadelphia +monadelphian +monadelphous +monadic +monadical +monadically +monadiform +monadigerous +Monadina +monadism +monadistic +monadnock +monadology +monaene +monal +monamniotic +Monanday +monander +Monandria +monandrian +monandric +monandrous +monandry +monanthous +monapsal +monarch +monarchal +monarchally +monarchess +monarchial +monarchian +monarchianism +monarchianist +monarchianistic +monarchic +monarchical +monarchically +monarchism +monarchist +monarchistic +monarchize +monarchizer +monarchlike +monarchomachic +monarchomachist +monarchy +Monarda +Monardella +monarthritis +monarticular +monas +Monasa +Monascidiae +monascidian +monase +monaster +monasterial +monasterially +monastery +monastic +monastical +monastically +monasticism +monasticize +monatomic +monatomicity +monatomism +monaulos +monaural +monaxial +monaxile +monaxon +monaxonial +monaxonic +Monaxonida +monazine +monazite +Monbuttu +monchiquite +Monday +Mondayish +Mondayishness +Mondayland +mone +Monegasque +Monel +monel +monembryary +monembryonic +monembryony +monepic +monepiscopacy +monepiscopal +moner +Monera +moneral +moneran +monergic +monergism +monergist +monergistic +moneric +moneron +Monerozoa +monerozoan +monerozoic +monerula +Moneses +monesia +monetarily +monetary +monetite +monetization +monetize +money +moneyage +moneybag +moneybags +moneyed +moneyer +moneyflower +moneygrub +moneygrubber +moneygrubbing +moneylender +moneylending +moneyless +moneymonger +moneymongering +moneysaving +moneywise +moneywort +mong +mongcorn +monger +mongering +mongery +Monghol +Mongholian +Mongibel +mongler +Mongo +Mongol +Mongolian +Mongolianism +Mongolic +Mongolioid +Mongolish +Mongolism +Mongolization +Mongolize +Mongoloid +mongoose +Mongoyo +mongrel +mongreldom +mongrelish +mongrelism +mongrelity +mongrelization +mongrelize +mongrelly +mongrelness +mongst +monheimite +monial +Monias +Monica +moniker +monilated +monilethrix +Monilia +Moniliaceae +moniliaceous +Moniliales +monilicorn +moniliform +moniliformly +monilioid +moniment +Monimia +Monimiaceae +monimiaceous +monimolite +monimostylic +monism +monist +monistic +monistical +monistically +monition +monitive +monitor +monitorial +monitorially +monitorish +monitorship +monitory +monitress +monitrix +monk +monkbird +monkcraft +monkdom +monkery +monkess +monkey +monkeyboard +monkeyface +monkeyfy +monkeyhood +monkeyish +monkeyishly +monkeyishness +monkeylike +monkeynut +monkeypod +monkeypot +monkeyry +monkeyshine +monkeytail +monkfish +monkflower +monkhood +monkish +monkishly +monkishness +monkism +monklike +monkliness +monkly +monkmonger +monkship +monkshood +Monmouth +monmouthite +monny +Mono +mono +monoacetate +monoacetin +monoacid +monoacidic +monoamide +monoamine +monoamino +monoammonium +monoazo +monobacillary +monobase +monobasic +monobasicity +monoblastic +monoblepsia +monoblepsis +monobloc +monobranchiate +monobromacetone +monobromated +monobromide +monobrominated +monobromination +monobromized +monobromoacetanilide +monobromoacetone +monobutyrin +monocalcium +monocarbide +monocarbonate +monocarbonic +monocarboxylic +monocardian +monocarp +monocarpal +monocarpellary +monocarpian +monocarpic +monocarpous +monocellular +monocentric +monocentrid +Monocentridae +Monocentris +monocentroid +monocephalous +monocercous +monoceros +monocerous +monochasial +monochasium +Monochlamydeae +monochlamydeous +monochlor +monochloracetic +monochloranthracene +monochlorbenzene +monochloride +monochlorinated +monochlorination +monochloro +monochloroacetic +monochlorobenzene +monochloromethane +monochoanitic +monochord +monochordist +monochordize +monochroic +monochromasy +monochromat +monochromate +monochromatic +monochromatically +monochromatism +monochromator +monochrome +monochromic +monochromical +monochromically +monochromist +monochromous +monochromy +monochronic +monochronous +monociliated +monocle +monocled +monocleid +monoclinal +monoclinally +monocline +monoclinian +monoclinic +monoclinism +monoclinometric +monoclinous +Monoclonius +Monocoelia +monocoelian +monocoelic +Monocondyla +monocondylar +monocondylian +monocondylic +monocondylous +monocormic +monocot +monocotyledon +Monocotyledones +monocotyledonous +monocracy +monocrat +monocratic +monocrotic +monocrotism +monocular +monocularity +monocularly +monoculate +monocule +monoculist +monoculous +monocultural +monoculture +monoculus +monocyanogen +monocycle +monocyclic +Monocyclica +monocystic +Monocystidae +Monocystidea +Monocystis +monocyte +monocytic +monocytopoiesis +monodactyl +monodactylate +monodactyle +monodactylism +monodactylous +monodactyly +monodelph +Monodelphia +monodelphian +monodelphic +monodelphous +monodermic +monodic +monodically +monodimetric +monodist +monodize +monodomous +Monodon +monodont +Monodonta +monodontal +monodram +monodrama +monodramatic +monodramatist +monodromic +monodromy +monody +monodynamic +monodynamism +Monoecia +monoecian +monoecious +monoeciously +monoeciousness +monoecism +monoeidic +monoestrous +monoethanolamine +monoethylamine +monofilament +monofilm +monoflagellate +monoformin +monogamian +monogamic +monogamist +monogamistic +monogamous +monogamously +monogamousness +monogamy +monoganglionic +monogastric +monogene +Monogenea +monogeneity +monogeneous +monogenesis +monogenesist +monogenesy +monogenetic +Monogenetica +monogenic +monogenism +monogenist +monogenistic +monogenous +monogeny +monoglot +monoglycerid +monoglyceride +monogoneutic +monogonoporic +monogonoporous +monogony +monogram +monogrammatic +monogrammatical +monogrammed +monogrammic +monograph +monographer +monographic +monographical +monographically +monographist +monography +monograptid +Monograptidae +Monograptus +monogynic +monogynious +monogynist +monogynoecial +monogynous +monogyny +monohybrid +monohydrate +monohydrated +monohydric +monohydrogen +monohydroxy +monoicous +monoid +monoketone +monolater +monolatrist +monolatrous +monolatry +monolayer +monoline +monolingual +monolinguist +monoliteral +monolith +monolithal +monolithic +monolobular +monolocular +monologian +monologic +monological +monologist +monologize +monologue +monologuist +monology +monomachist +monomachy +monomania +monomaniac +monomaniacal +monomastigate +monomeniscous +monomer +monomeric +monomerous +monometallic +monometallism +monometallist +monometer +monomethyl +monomethylated +monomethylic +monometric +monometrical +monomial +monomict +monomineral +monomineralic +monomolecular +monomolybdate +Monomorium +monomorphic +monomorphism +monomorphous +Monomya +Monomyaria +monomyarian +mononaphthalene +mononch +Mononchus +mononeural +Monongahela +mononitrate +mononitrated +mononitration +mononitride +mononitrobenzene +mononomial +mononomian +monont +mononuclear +mononucleated +mononucleosis +mononychous +mononym +mononymic +mononymization +mononymize +mononymy +monoousian +monoousious +monoparental +monoparesis +monoparesthesia +monopathic +monopathy +monopectinate +monopersonal +monopersulfuric +monopersulphuric +Monopetalae +monopetalous +monophagism +monophagous +monophagy +monophase +monophasia +monophasic +monophobia +monophone +monophonic +monophonous +monophony +monophotal +monophote +monophthalmic +monophthalmus +monophthong +monophthongal +monophthongization +monophthongize +monophyletic +monophyleticism +monophylite +monophyllous +monophyodont +monophyodontism +Monophysite +Monophysitic +Monophysitical +Monophysitism +monopitch +monoplacula +monoplacular +monoplaculate +monoplane +monoplanist +monoplasmatic +monoplast +monoplastic +monoplegia +monoplegic +Monopneumoa +monopneumonian +monopneumonous +monopode +monopodial +monopodially +monopodic +monopodium +monopodous +monopody +monopolar +monopolaric +monopolarity +monopole +monopolism +monopolist +monopolistic +monopolistically +monopolitical +monopolizable +monopolization +monopolize +monopolizer +monopolous +monopoly +monopolylogist +monopolylogue +monopotassium +monoprionid +monoprionidian +monopsonistic +monopsony +monopsychism +monopteral +Monopteridae +monopteroid +monopteron +monopteros +monopterous +monoptic +monoptical +monoptote +monoptotic +Monopylaea +Monopylaria +monopylean +monopyrenous +monorail +monorailroad +monorailway +monorchid +monorchidism +monorchis +monorchism +monorganic +Monorhina +monorhinal +monorhine +monorhyme +monorhymed +monorhythmic +monosaccharide +monosaccharose +monoschemic +monoscope +monose +monosemic +monosepalous +monoservice +monosilane +monosilicate +monosilicic +monosiphonic +monosiphonous +monosodium +monosomatic +monosomatous +monosome +monosomic +monosperm +monospermal +monospermic +monospermous +monospermy +monospherical +monospondylic +monosporangium +monospore +monospored +monosporiferous +monosporous +monostele +monostelic +monostelous +monostely +monostich +monostichous +Monostomata +Monostomatidae +monostomatous +monostome +Monostomidae +monostomous +Monostomum +monostromatic +monostrophe +monostrophic +monostrophics +monostylous +monosubstituted +monosubstitution +monosulfone +monosulfonic +monosulphide +monosulphone +monosulphonic +monosyllabic +monosyllabical +monosyllabically +monosyllabism +monosyllabize +monosyllable +monosymmetric +monosymmetrical +monosymmetrically +monosymmetry +monosynthetic +monotelephone +monotelephonic +monotellurite +Monothalama +monothalamian +monothalamous +monothecal +monotheism +monotheist +monotheistic +monotheistical +monotheistically +Monothelete +Monotheletian +Monotheletic +Monotheletism +monothelious +Monothelism +Monothelitic +Monothelitism +monothetic +monotic +monotint +Monotocardia +monotocardiac +monotocardian +monotocous +monotomous +monotone +monotonic +monotonical +monotonically +monotonist +monotonize +monotonous +monotonously +monotonousness +monotony +monotremal +Monotremata +monotremate +monotrematous +monotreme +monotremous +monotrichous +monotriglyph +monotriglyphic +Monotrocha +monotrochal +monotrochian +monotrochous +Monotropa +Monotropaceae +monotropaceous +monotrophic +monotropic +Monotropsis +monotropy +monotypal +monotype +monotypic +monotypical +monotypous +monoureide +monovalence +monovalency +monovalent +monovariant +monoverticillate +monovoltine +monovular +monoxenous +monoxide +monoxime +monoxyle +monoxylic +monoxylon +monoxylous +Monozoa +monozoan +monozoic +monozygotic +Monroeism +Monroeist +monrolite +monseigneur +monsieur +monsieurship +monsignor +monsignorial +Monsoni +monsoon +monsoonal +monsoonish +monsoonishly +monster +Monstera +monsterhood +monsterlike +monstership +monstrance +monstrate +monstration +monstrator +monstricide +monstriferous +monstrification +monstrify +monstrosity +monstrous +monstrously +monstrousness +Mont +montage +Montagnac +Montagnais +Montana +montana +Montanan +montane +montanic +montanin +Montanism +Montanist +Montanistic +Montanistical +montanite +Montanize +montant +Montargis +Montauk +montbretia +monte +montebrasite +monteith +montem +Montenegrin +Montepulciano +Monterey +Montes +Montesco +Montesinos +Montessorian +Montessorianism +Montezuma +montgolfier +month +monthly +monthon +Montia +monticellite +monticle +monticoline +monticulate +monticule +Monticulipora +Monticuliporidae +monticuliporidean +monticuliporoid +monticulose +monticulous +monticulus +montiform +montigeneous +montilla +montjoy +montmartrite +Montmorency +montmorilonite +monton +Montrachet +montroydite +Montu +monture +Monty +Monumbo +monument +monumental +monumentalism +monumentality +monumentalization +monumentalize +monumentally +monumentary +monumentless +monumentlike +monzodiorite +monzogabbro +monzonite +monzonitic +moo +Mooachaht +mooch +moocha +moocher +moochulka +mood +mooder +moodily +moodiness +moodish +moodishly +moodishness +moodle +moody +mooing +mool +moolet +moolings +mools +moolum +moon +moonack +moonbeam +moonbill +moonblink +mooncalf +mooncreeper +moondown +moondrop +mooned +mooner +moonery +mooneye +moonface +moonfaced +moonfall +moonfish +moonflower +moonglade +moonglow +moonhead +moonily +mooniness +mooning +moonish +moonite +moonja +moonjah +moonless +moonlet +moonlight +moonlighted +moonlighter +moonlighting +moonlighty +moonlike +moonlikeness +moonlit +moonlitten +moonman +moonpath +moonpenny +moonproof +moonraker +moonraking +moonrise +moonsail +moonscape +moonseed +moonset +moonshade +moonshine +moonshiner +moonshining +moonshiny +moonsick +moonsickness +moonstone +moontide +moonwalker +moonwalking +moonward +moonwards +moonway +moonwort +moony +moop +Moor +moor +moorage +moorball +moorband +moorberry +moorbird +moorburn +moorburner +moorburning +Moore +moorflower +moorfowl +mooring +Moorish +moorish +moorishly +moorishness +moorland +moorlander +Moorman +moorman +moorn +moorpan +moors +Moorship +moorsman +moorstone +moortetter +moorup +moorwort +moory +moosa +moose +mooseberry +moosebird +moosebush +moosecall +mooseflower +moosehood +moosemise +moosetongue +moosewob +moosewood +moosey +moost +moot +mootable +mooter +mooth +mooting +mootman +mootstead +mootworthy +mop +Mopan +mopane +mopboard +mope +moper +moph +mophead +mopheaded +moping +mopingly +mopish +mopishly +mopishness +mopla +mopper +moppet +moppy +mopstick +mopsy +mopus +Moquelumnan +moquette +Moqui +mor +mora +Moraceae +moraceous +Moraea +morainal +moraine +morainic +moral +morale +moralism +moralist +moralistic +moralistically +morality +moralization +moralize +moralizer +moralizingly +moralless +morally +moralness +morals +Moran +morass +morassic +morassweed +morassy +morat +morate +moration +moratoria +moratorium +moratory +Moravian +Moravianism +Moravianized +Moravid +moravite +moray +morbid +morbidity +morbidize +morbidly +morbidness +morbiferal +morbiferous +morbific +morbifical +morbifically +morbify +morbility +morbillary +morbilli +morbilliform +morbillous +morcellate +morcellated +morcellation +Morchella +Morcote +mordacious +mordaciously +mordacity +mordancy +mordant +mordantly +Mordella +mordellid +Mordellidae +mordelloid +mordenite +mordent +mordicate +mordication +mordicative +mordore +Mordv +Mordva +Mordvin +Mordvinian +more +moreen +morefold +moreish +morel +morella +morello +morencite +moreness +morenita +morenosite +Moreote +moreover +morepork +mores +Moresque +morfrey +morg +morga +Morgan +morgan +Morgana +morganatic +morganatical +morganatically +morganic +morganite +morganize +morgay +morgen +morgengift +morgenstern +morglay +morgue +moribund +moribundity +moribundly +moric +moriche +moriform +morigerate +morigeration +morigerous +morigerously +morigerousness +morillon +morin +Morinaceae +Morinda +morindin +morindone +morinel +Moringa +Moringaceae +moringaceous +moringad +Moringua +moringuid +Moringuidae +moringuoid +morion +Moriori +Moriscan +Morisco +Morisonian +Morisonianism +morkin +morlop +mormaor +mormaordom +mormaorship +mormo +Mormon +mormon +Mormondom +Mormoness +Mormonism +Mormonist +Mormonite +Mormonweed +Mormoops +mormyr +mormyre +mormyrian +mormyrid +Mormyridae +mormyroid +Mormyrus +morn +morne +morned +morning +morningless +morningly +mornings +morningtide +morningward +mornless +mornlike +morntime +mornward +Moro +moro +moroc +Moroccan +Morocco +morocco +morocota +morological +morologically +morologist +morology +moromancy +moron +moroncy +morong +moronic +Moronidae +moronism +moronity +moronry +Moropus +morosaurian +morosauroid +Morosaurus +morose +morosely +moroseness +morosis +morosity +moroxite +morph +morphallaxis +morphea +Morphean +morpheme +morphemic +morphemics +morphetic +Morpheus +morphew +morphia +morphiate +morphic +morphically +morphinate +morphine +morphinic +morphinism +morphinist +morphinization +morphinize +morphinomania +morphinomaniac +morphiomania +morphiomaniac +Morpho +morphogenesis +morphogenetic +morphogenic +morphogeny +morphographer +morphographic +morphographical +morphographist +morphography +morpholine +morphologic +morphological +morphologically +morphologist +morphology +morphometrical +morphometry +morphon +morphonomic +morphonomy +morphophonemic +morphophonemically +morphophonemics +morphophyly +morphoplasm +morphoplasmic +morphosis +morphotic +morphotropic +morphotropism +morphotropy +morphous +Morrenian +Morrhua +morrhuate +morrhuine +morricer +Morris +morris +Morrisean +morrow +morrowing +morrowless +morrowmass +morrowspeech +morrowtide +morsal +Morse +morse +morsel +morselization +morselize +morsing +morsure +mort +mortacious +mortal +mortalism +mortalist +mortality +mortalize +mortally +mortalness +mortalwise +mortar +mortarboard +mortarize +mortarless +mortarlike +mortarware +mortary +mortbell +mortcloth +mortersheen +mortgage +mortgageable +mortgagee +mortgagor +morth +morthwyrtha +mortician +mortier +mortiferous +mortiferously +mortiferousness +mortific +mortification +mortified +mortifiedly +mortifiedness +mortifier +mortify +mortifying +mortifyingly +Mortimer +mortise +mortiser +mortling +mortmain +mortmainer +Morton +mortuarian +mortuary +mortuous +morula +morular +morulation +morule +moruloid +Morus +morvin +morwong +Mosaic +mosaic +Mosaical +mosaical +mosaically +mosaicism +mosaicist +Mosaicity +Mosaism +Mosaist +mosaist +mosandrite +mosasaur +Mosasauri +Mosasauria +mosasaurian +mosasaurid +Mosasauridae +mosasauroid +Mosasaurus +Mosatenan +moschate +moschatel +moschatelline +Moschi +Moschidae +moschiferous +Moschinae +moschine +Moschus +Moscow +Mose +Moselle +Moses +mosesite +Mosetena +mosette +mosey +Mosgu +moskeneer +mosker +Moslem +Moslemah +Moslemic +Moslemin +Moslemism +Moslemite +Moslemize +moslings +mosque +mosquelet +mosquish +mosquital +Mosquito +mosquito +mosquitobill +mosquitocidal +mosquitocide +mosquitoey +mosquitoish +mosquitoproof +moss +mossback +mossberry +mossbunker +mossed +mosser +mossery +mossful +mosshead +Mossi +mossiness +mossless +mosslike +mosstrooper +mosstroopery +mosstrooping +mosswort +mossy +mossyback +most +moste +Mosting +mostlike +mostlings +mostly +mostness +Mosul +Mosur +mot +Motacilla +motacillid +Motacillidae +Motacillinae +motacilline +motatorious +motatory +Motazilite +mote +moted +motel +moteless +moter +motet +motettist +motey +moth +mothed +mother +motherdom +mothered +motherer +mothergate +motherhood +motheriness +mothering +motherkin +motherland +motherless +motherlessness +motherlike +motherliness +motherling +motherly +mothership +mothersome +motherward +motherwise +motherwort +mothery +mothless +mothlike +mothproof +mothworm +mothy +motif +motific +motile +motility +motion +motionable +motional +motionless +motionlessly +motionlessness +motitation +motivate +motivation +motivational +motive +motiveless +motivelessly +motivelessness +motiveness +motivity +motley +motleyness +motmot +motofacient +motograph +motographic +motomagnetic +motoneuron +motophone +motor +motorable +motorboat +motorboatman +motorbus +motorcab +motorcade +motorcar +motorcycle +motorcyclist +motordom +motordrome +motored +motorial +motoric +motoring +motorism +motorist +motorium +motorization +motorize +motorless +motorman +motorneer +motorphobe +motorphobia +motorphobiac +motorway +motory +Motozintlec +Motozintleca +motricity +Mott +mott +motte +mottle +mottled +mottledness +mottlement +mottler +mottling +motto +mottoed +mottoless +mottolike +mottramite +motyka +mou +moucharaby +mouchardism +mouche +mouchrabieh +moud +moudie +moudieman +moudy +mouflon +Mougeotia +Mougeotiaceae +mouillation +mouille +mouillure +moujik +moul +mould +moulded +moule +moulin +moulinage +moulinet +moulleen +moulrush +mouls +moulter +mouly +mound +moundiness +moundlet +moundwork +moundy +mount +mountable +mountably +mountain +mountained +mountaineer +mountainet +mountainette +mountainless +mountainlike +mountainous +mountainously +mountainousness +mountainside +mountaintop +mountainward +mountainwards +mountainy +mountant +mountebank +mountebankery +mountebankish +mountebankism +mountebankly +mounted +mounter +Mountie +mounting +mountingly +mountlet +mounture +moup +mourn +mourner +mourneress +mournful +mournfully +mournfulness +mourning +mourningly +mournival +mournsome +mouse +mousebane +mousebird +mousefish +mousehawk +mousehole +mousehound +Mouseion +mousekin +mouselet +mouselike +mouseproof +mouser +mousery +mouseship +mousetail +mousetrap +mouseweb +mousey +mousily +mousiness +mousing +mousingly +mousle +mousmee +Mousoni +mousquetaire +mousse +Mousterian +moustoc +mousy +mout +moutan +mouth +mouthable +mouthbreeder +mouthed +mouther +mouthful +mouthily +mouthiness +mouthing +mouthingly +mouthishly +mouthless +mouthlike +mouthpiece +mouthroot +mouthwash +mouthwise +mouthy +mouton +moutonnee +mouzah +mouzouna +movability +movable +movableness +movably +movant +move +moveability +moveableness +moveably +moveless +movelessly +movelessness +movement +mover +movie +moviedom +movieize +movieland +moving +movingly +movingness +mow +mowable +mowana +mowburn +mowburnt +mowch +mowcht +mower +mowha +mowie +mowing +mowland +mown +mowra +mowrah +mowse +mowstead +mowt +mowth +moxa +moxieberry +Moxo +moy +moyen +moyenless +moyenne +moyite +moyle +moyo +Mozambican +mozambique +Mozarab +Mozarabian +Mozarabic +Mozartean +mozemize +mozing +mozzetta +Mpangwe +Mpondo +mpret +Mr +Mrs +Mru +mu +muang +mubarat +mucago +mucaro +mucedin +mucedinaceous +mucedine +mucedinous +much +muchfold +muchly +muchness +mucic +mucid +mucidness +muciferous +mucific +muciform +mucigen +mucigenous +mucilage +mucilaginous +mucilaginously +mucilaginousness +mucin +mucinogen +mucinoid +mucinous +muciparous +mucivore +mucivorous +muck +muckender +Mucker +mucker +muckerish +muckerism +mucket +muckiness +muckite +muckle +muckluck +muckman +muckment +muckmidden +muckna +muckrake +muckraker +mucksweat +mucksy +muckthrift +muckweed +muckworm +mucky +mucluc +mucocele +mucocellulose +mucocellulosic +mucocutaneous +mucodermal +mucofibrous +mucoflocculent +mucoid +mucomembranous +muconic +mucoprotein +mucopurulent +mucopus +mucor +Mucoraceae +mucoraceous +Mucorales +mucorine +mucorioid +mucormycosis +mucorrhea +mucosa +mucosal +mucosanguineous +mucose +mucoserous +mucosity +mucosocalcareous +mucosogranular +mucosopurulent +mucososaccharine +mucous +mucousness +mucro +mucronate +mucronately +mucronation +mucrones +mucroniferous +mucroniform +mucronulate +mucronulatous +muculent +Mucuna +mucus +mucusin +mud +mudar +mudbank +mudcap +mudd +mudde +mudden +muddify +muddily +muddiness +mudding +muddish +muddle +muddlebrained +muddledom +muddlehead +muddleheaded +muddleheadedness +muddlement +muddleproof +muddler +muddlesome +muddlingly +muddy +muddybrained +muddybreast +muddyheaded +mudee +Mudejar +mudfish +mudflow +mudguard +mudhead +mudhole +mudhopper +mudir +mudiria +mudland +mudlark +mudlarker +mudless +mudproof +mudra +mudsill +mudskipper +mudslinger +mudslinging +mudspate +mudstain +mudstone +mudsucker +mudtrack +mudweed +mudwort +Muehlenbeckia +muermo +muezzin +muff +muffed +muffet +muffetee +muffin +muffineer +muffish +muffishness +muffle +muffled +muffleman +muffler +mufflin +muffy +mufti +mufty +mug +muga +mugearite +mugful +mugg +mugger +mugget +muggily +mugginess +muggins +muggish +muggles +Muggletonian +Muggletonianism +muggy +mughouse +mugience +mugiency +mugient +Mugil +Mugilidae +mugiliform +mugiloid +mugweed +mugwort +mugwump +mugwumpery +mugwumpian +mugwumpism +muhammadi +Muharram +Muhlenbergia +muid +Muilla +muir +muirburn +muircock +muirfowl +muishond +muist +mujtahid +Mukden +mukluk +Mukri +muktar +muktatma +mukti +mulaprakriti +mulatta +mulatto +mulattoism +mulattress +mulberry +mulch +mulcher +Mulciber +Mulcibirian +mulct +mulctable +mulctary +mulctation +mulctative +mulctatory +mulctuary +mulder +mule +muleback +mulefoot +mulefooted +muleman +muleta +muleteer +muletress +muletta +mulewort +muley +mulga +muliebral +muliebria +muliebrile +muliebrity +muliebrous +mulier +mulierine +mulierose +mulierosity +mulish +mulishly +mulishness +mulism +mulita +mulk +mull +mulla +mullah +mullar +mullein +mullenize +muller +Mullerian +mullet +mulletry +mullets +mulley +mullid +Mullidae +mulligan +mulligatawny +mulligrubs +mullion +mullite +mullock +mullocker +mullocky +mulloid +mulloway +mulmul +mulse +mulsify +mult +multangular +multangularly +multangularness +multangulous +multangulum +Multani +multanimous +multarticulate +multeity +multiangular +multiareolate +multiarticular +multiarticulate +multiarticulated +multiaxial +multiblade +multibladed +multibranched +multibranchiate +multibreak +multicamerate +multicapitate +multicapsular +multicarinate +multicarinated +multicellular +multicentral +multicentric +multicharge +multichord +multichrome +multiciliate +multiciliated +multicipital +multicircuit +multicoccous +multicoil +multicolor +multicolored +multicolorous +multicomponent +multiconductor +multiconstant +multicore +multicorneal +multicostate +multicourse +multicrystalline +multicuspid +multicuspidate +multicycle +multicylinder +multicylindered +multidentate +multidenticulate +multidenticulated +multidigitate +multidimensional +multidirectional +multidisperse +multiengine +multiengined +multiexhaust +multifaced +multifaceted +multifactorial +multifamilial +multifarious +multifariously +multifariousness +multiferous +multifetation +multifibered +multifid +multifidly +multifidous +multifidus +multifilament +multifistular +multiflagellate +multiflagellated +multiflash +multiflorous +multiflow +multiflue +multifocal +multifoil +multifoiled +multifold +multifoliate +multifoliolate +multiform +multiformed +multiformity +multifurcate +multiganglionic +multigap +multigranulate +multigranulated +Multigraph +multigraph +multigrapher +multiguttulate +multigyrate +multihead +multihearth +multihued +multijet +multijugate +multijugous +multilaciniate +multilamellar +multilamellate +multilamellous +multilaminar +multilaminate +multilaminated +multilateral +multilaterally +multilighted +multilineal +multilinear +multilingual +multilinguist +multilirate +multiliteral +multilobar +multilobate +multilobe +multilobed +multilobular +multilobulate +multilobulated +multilocation +multilocular +multiloculate +multiloculated +multiloquence +multiloquent +multiloquious +multiloquous +multiloquy +multimacular +multimammate +multimarble +multimascular +multimedial +multimetalic +multimetallism +multimetallist +multimillion +multimillionaire +multimodal +multimodality +multimolecular +multimotor +multimotored +multinational +multinervate +multinervose +multinodal +multinodate +multinodous +multinodular +multinomial +multinominal +multinominous +multinuclear +multinucleate +multinucleated +multinucleolar +multinucleolate +multinucleolated +multiovular +multiovulate +multipara +multiparient +multiparity +multiparous +multipartisan +multipartite +multiped +multiperforate +multiperforated +multipersonal +multiphase +multiphaser +multiphotography +multipinnate +multiplane +multiple +multiplepoinding +multiplet +multiplex +multipliable +multipliableness +multiplicability +multiplicable +multiplicand +multiplicate +multiplication +multiplicational +multiplicative +multiplicatively +multiplicator +multiplicity +multiplier +multiply +multiplying +multipointed +multipolar +multipole +multiported +multipotent +multipresence +multipresent +multiradial +multiradiate +multiradiated +multiradicate +multiradicular +multiramified +multiramose +multiramous +multirate +multireflex +multirooted +multirotation +multirotatory +multisaccate +multisacculate +multisacculated +multiscience +multiseated +multisect +multisector +multisegmental +multisegmentate +multisegmented +multisensual +multiseptate +multiserial +multiserially +multiseriate +multishot +multisiliquous +multisonous +multispeed +multispermous +multispicular +multispiculate +multispindle +multispinous +multispiral +multispired +multistage +multistaminate +multistoried +multistory +multistratified +multistratous +multistriate +multisulcate +multisulcated +multisyllabic +multisyllability +multisyllable +multitarian +multitentaculate +multitheism +multithreaded +multititular +multitoed +multitoned +multitube +Multituberculata +multituberculate +multituberculated +multituberculism +multituberculy +multitubular +multitude +multitudinal +multitudinary +multitudinism +multitudinist +multitudinistic +multitudinosity +multitudinous +multitudinously +multitudinousness +multiturn +multivagant +multivalence +multivalency +multivalent +multivalve +multivalved +multivalvular +multivane +multivariant +multivarious +multiversant +multiverse +multivibrator +multivincular +multivious +multivocal +multivocalness +multivoiced +multivolent +multivoltine +multivolumed +multivorous +multocular +multum +multungulate +multure +multurer +mum +mumble +mumblebee +mumblement +mumbler +mumbling +mumblingly +mummer +mummery +mummichog +mummick +mummied +mummification +mummiform +mummify +mumming +mummy +mummydom +mummyhood +mummylike +mumness +mump +mumper +mumphead +mumpish +mumpishly +mumpishness +mumps +mumpsimus +mumruffin +mun +Munandi +Muncerian +munch +Munchausenism +Munchausenize +muncheel +muncher +munchet +mund +Munda +mundane +mundanely +mundaneness +mundanism +mundanity +Mundari +mundatory +mundic +mundificant +mundification +mundifier +mundify +mundil +mundivagant +mundle +mung +munga +munge +mungey +mungo +mungofa +munguba +mungy +Munia +Munich +Munichism +municipal +municipalism +municipalist +municipality +municipalization +municipalize +municipalizer +municipally +municipium +munific +munificence +munificency +munificent +munificently +munificentness +muniment +munition +munitionary +munitioneer +munitioner +munitions +munity +munj +munjeet +munjistin +munnion +Munnopsidae +Munnopsis +Munsee +munshi +munt +Muntiacus +muntin +Muntingia +muntjac +Munychia +Munychian +Munychion +Muong +Muphrid +Mura +mura +Muradiyah +Muraena +Muraenidae +muraenoid +murage +mural +muraled +muralist +murally +Muran +Muranese +murasakite +Murat +Muratorian +murchy +murder +murderer +murderess +murdering +murderingly +murderish +murderment +murderous +murderously +murderousness +murdrum +mure +murenger +murex +murexan +murexide +murga +murgavi +murgeon +muriate +muriated +muriatic +muricate +muricid +Muricidae +muriciform +muricine +muricoid +muriculate +murid +Muridae +muridism +Muriel +muriform +muriformly +Murillo +Murinae +murine +murinus +muriti +murium +murk +murkily +murkiness +murkish +murkly +murkness +murksome +murky +murlin +murly +Murmi +murmur +murmuration +murmurator +murmurer +murmuring +murmuringly +murmurish +murmurless +murmurlessly +murmurous +murmurously +muromontite +Murph +murphy +murra +murrain +Murray +Murraya +murre +murrelet +murrey +murrhine +murrina +murrnong +murshid +Murthy +murumuru +Murut +muruxi +murva +murza +Murzim +Mus +Musa +Musaceae +musaceous +Musaeus +musal +Musales +Musalmani +musang +musar +Musca +muscade +muscadel +muscadine +Muscadinia +muscardine +Muscardinidae +Muscardinus +Muscari +muscariform +muscarine +muscat +muscatel +muscatorium +Musci +Muscicapa +Muscicapidae +muscicapine +muscicide +muscicole +muscicoline +muscicolous +muscid +Muscidae +musciform +Muscinae +muscle +muscled +muscleless +musclelike +muscling +muscly +Muscogee +muscoid +Muscoidea +muscologic +muscological +muscologist +muscology +muscone +muscose +muscoseness +muscosity +muscot +muscovadite +muscovado +Muscovi +Muscovite +muscovite +Muscovitic +muscovitization +muscovitize +muscovy +muscular +muscularity +muscularize +muscularly +musculation +musculature +muscule +musculin +musculoarterial +musculocellular +musculocutaneous +musculodermic +musculoelastic +musculofibrous +musculointestinal +musculoligamentous +musculomembranous +musculopallial +musculophrenic +musculospinal +musculospiral +musculotegumentary +musculotendinous +Muse +muse +mused +museful +musefully +museist +museless +muselike +museographist +museography +museologist +museology +muser +musery +musette +museum +museumize +Musgu +mush +musha +mushaa +Mushabbihite +mushed +musher +mushhead +mushheaded +mushheadedness +mushily +mushiness +mushla +mushmelon +mushrebiyeh +mushroom +mushroomer +mushroomic +mushroomlike +mushroomy +mushru +mushy +music +musical +musicale +musicality +musicalization +musicalize +musically +musicalness +musicate +musician +musiciana +musicianer +musicianly +musicianship +musicker +musicless +musiclike +musicmonger +musico +musicoartistic +musicodramatic +musicofanatic +musicographer +musicography +musicological +musicologist +musicologue +musicology +musicomania +musicomechanical +musicophilosophical +musicophobia +musicophysical +musicopoetic +musicotherapy +musicproof +musie +musily +musimon +musing +musingly +musk +muskat +muskeg +muskeggy +muskellunge +musket +musketade +musketeer +musketlike +musketoon +musketproof +musketry +muskflower +Muskhogean +muskie +muskiness +muskish +musklike +muskmelon +Muskogee +muskrat +muskroot +Muskwaki +muskwood +musky +muslin +muslined +muslinet +musnud +Musophaga +Musophagi +Musophagidae +musophagine +musquash +musquashroot +musquashweed +musquaspen +musquaw +musrol +muss +mussable +mussably +Mussaenda +mussal +mussalchee +mussel +musseled +musseler +mussily +mussiness +mussitate +mussitation +mussuk +Mussulman +Mussulmanic +Mussulmanish +Mussulmanism +Mussulwoman +mussurana +mussy +must +mustache +mustached +mustachial +mustachio +mustachioed +mustafina +Mustahfiz +mustang +mustanger +mustard +mustarder +mustee +Mustela +mustelid +Mustelidae +musteline +mustelinous +musteloid +Mustelus +muster +musterable +musterdevillers +musterer +mustermaster +mustify +mustily +mustiness +mustnt +musty +muta +Mutabilia +mutability +mutable +mutableness +mutably +mutafacient +mutage +mutagenic +mutant +mutarotate +mutarotation +mutase +mutate +mutation +mutational +mutationally +mutationism +mutationist +mutative +mutatory +mutawalli +Mutazala +mutch +mute +mutedly +mutely +muteness +Muter +mutesarif +mutescence +mutessarifat +muth +muthmannite +muthmassel +mutic +muticous +mutilate +mutilation +mutilative +mutilator +mutilatory +Mutilla +mutillid +Mutillidae +mutilous +mutineer +mutinous +mutinously +mutinousness +mutiny +Mutisia +Mutisiaceae +mutism +mutist +mutistic +mutive +mutivity +mutoscope +mutoscopic +mutsje +mutsuddy +mutt +mutter +mutterer +muttering +mutteringly +mutton +muttonbird +muttonchop +muttonfish +muttonhead +muttonheaded +muttonhood +muttonmonger +muttonwood +muttony +mutual +mutualism +mutualist +mutualistic +mutuality +mutualization +mutualize +mutually +mutualness +mutuary +mutuatitious +mutulary +mutule +mutuum +mux +Muysca +muyusa +muzhik +Muzo +muzz +muzzily +muzziness +muzzle +muzzler +muzzlewood +muzzy +Mwa +my +Mya +Myacea +myal +myalgia +myalgic +myalism +myall +Myaria +myarian +myasthenia +myasthenic +myatonia +myatonic +myatony +myatrophy +mycele +mycelia +mycelial +mycelian +mycelioid +mycelium +myceloid +Mycenaean +Mycetes +mycetism +mycetocyte +mycetogenesis +mycetogenetic +mycetogenic +mycetogenous +mycetoid +mycetological +mycetology +mycetoma +mycetomatous +Mycetophagidae +mycetophagous +mycetophilid +Mycetophilidae +mycetous +Mycetozoa +mycetozoan +mycetozoon +Mycobacteria +Mycobacteriaceae +Mycobacterium +mycocecidium +mycocyte +mycoderm +mycoderma +mycodermatoid +mycodermatous +mycodermic +mycodermitis +mycodesmoid +mycodomatium +mycogastritis +Mycogone +mycohaemia +mycohemia +mycoid +mycologic +mycological +mycologically +mycologist +mycologize +mycology +mycomycete +Mycomycetes +mycomycetous +mycomyringitis +mycophagist +mycophagous +mycophagy +mycophyte +Mycoplana +mycoplasm +mycoplasmic +mycoprotein +mycorhiza +mycorhizal +mycorrhizal +mycose +mycosin +mycosis +mycosozin +Mycosphaerella +Mycosphaerellaceae +mycosterol +mycosymbiosis +mycotic +mycotrophic +Mycteria +mycteric +mycterism +Myctodera +myctophid +Myctophidae +Myctophum +Mydaidae +mydaleine +mydatoxine +Mydaus +mydine +mydriasine +mydriasis +mydriatic +mydriatine +myectomize +myectomy +myectopia +myectopy +myelalgia +myelapoplexy +myelasthenia +myelatrophy +myelauxe +myelemia +myelencephalic +myelencephalon +myelencephalous +myelic +myelin +myelinate +myelinated +myelination +myelinic +myelinization +myelinogenesis +myelinogenetic +myelinogeny +myelitic +myelitis +myeloblast +myeloblastic +myelobrachium +myelocele +myelocerebellar +myelocoele +myelocyst +myelocystic +myelocystocele +myelocyte +myelocythaemia +myelocythemia +myelocytic +myelocytosis +myelodiastasis +myeloencephalitis +myeloganglitis +myelogenesis +myelogenetic +myelogenous +myelogonium +myeloic +myeloid +myelolymphangioma +myelolymphocyte +myeloma +myelomalacia +myelomatoid +myelomatosis +myelomenia +myelomeningitis +myelomeningocele +myelomere +myelon +myelonal +myeloneuritis +myelonic +myeloparalysis +myelopathic +myelopathy +myelopetal +myelophthisis +myeloplast +myeloplastic +myeloplax +myeloplegia +myelopoiesis +myelopoietic +myelorrhagia +myelorrhaphy +myelosarcoma +myelosclerosis +myelospasm +myelospongium +myelosyphilis +myelosyphilosis +myelosyringosis +myelotherapy +Myelozoa +myelozoan +myentasis +myenteric +myenteron +myesthesia +mygale +mygalid +mygaloid +Myiarchus +myiasis +myiferous +myiodesopsia +myiosis +myitis +mykiss +myliobatid +Myliobatidae +myliobatine +myliobatoid +Mylodon +mylodont +Mylodontidae +mylohyoid +mylohyoidean +mylonite +mylonitic +Mymar +mymarid +Mymaridae +myna +Mynheer +mynpacht +mynpachtbrief +myoalbumin +myoalbumose +myoatrophy +myoblast +myoblastic +myocardiac +myocardial +myocardiogram +myocardiograph +myocarditic +myocarditis +myocardium +myocele +myocellulitis +myoclonic +myoclonus +myocoele +myocoelom +myocolpitis +myocomma +myocyte +myodegeneration +Myodes +myodiastasis +myodynamia +myodynamic +myodynamics +myodynamiometer +myodynamometer +myoedema +myoelectric +myoendocarditis +myoepicardial +myoepithelial +myofibril +myofibroma +myogen +myogenesis +myogenetic +myogenic +myogenous +myoglobin +myoglobulin +myogram +myograph +myographer +myographic +myographical +myographist +myography +myohematin +myoid +myoidema +myokinesis +myolemma +myolipoma +myoliposis +myologic +myological +myologist +myology +myolysis +myoma +myomalacia +myomancy +myomantic +myomatous +myomectomy +myomelanosis +myomere +myometritis +myometrium +myomohysterectomy +myomorph +Myomorpha +myomorphic +myomotomy +myoneme +myoneural +myoneuralgia +myoneurasthenia +myoneure +myoneuroma +myoneurosis +myonosus +myopachynsis +myoparalysis +myoparesis +myopathia +myopathic +myopathy +myope +myoperitonitis +myophan +myophore +myophorous +myophysical +myophysics +myopia +myopic +myopical +myopically +myoplasm +myoplastic +myoplasty +myopolar +Myoporaceae +myoporaceous +myoporad +Myoporum +myoproteid +myoprotein +myoproteose +myops +myopy +myorrhaphy +myorrhexis +myosalpingitis +myosarcoma +myosarcomatous +myosclerosis +myoscope +myoseptum +myosin +myosinogen +myosinose +myosis +myositic +myositis +myosote +Myosotis +myospasm +myospasmia +Myosurus +myosuture +myosynizesis +myotacismus +Myotalpa +Myotalpinae +myotasis +myotenotomy +myothermic +myotic +myotome +myotomic +myotomy +myotonia +myotonic +myotonus +myotony +myotrophy +myowun +Myoxidae +myoxine +Myoxus +Myra +myrabalanus +myrabolam +myrcene +Myrcia +myrcia +myriacanthous +myriacoulomb +myriad +myriaded +myriadfold +myriadly +myriadth +myriagram +myriagramme +myrialiter +myrialitre +myriameter +myriametre +Myrianida +myriapod +Myriapoda +myriapodan +myriapodous +myriarch +myriarchy +myriare +Myrica +myrica +Myricaceae +myricaceous +Myricales +myricetin +myricin +Myrick +myricyl +myricylic +Myrientomata +myringa +myringectomy +myringitis +myringodectomy +myringodermatitis +myringomycosis +myringoplasty +myringotome +myringotomy +myriological +myriologist +myriologue +myriophyllite +myriophyllous +Myriophyllum +Myriopoda +myriopodous +myriorama +myrioscope +myriosporous +myriotheism +Myriotrichia +Myriotrichiaceae +myriotrichiaceous +myristate +myristic +Myristica +myristica +Myristicaceae +myristicaceous +Myristicivora +myristicivorous +myristin +myristone +Myrmecia +Myrmecobiinae +myrmecobine +Myrmecobius +myrmecochorous +myrmecochory +myrmecoid +myrmecoidy +myrmecological +myrmecologist +myrmecology +Myrmecophaga +Myrmecophagidae +myrmecophagine +myrmecophagoid +myrmecophagous +myrmecophile +myrmecophilism +myrmecophilous +myrmecophily +myrmecophobic +myrmecophyte +myrmecophytic +myrmekite +Myrmeleon +Myrmeleonidae +Myrmeleontidae +Myrmica +myrmicid +Myrmicidae +myrmicine +myrmicoid +Myrmidon +Myrmidonian +myrmotherine +myrobalan +Myron +myron +myronate +myronic +myrosin +myrosinase +Myrothamnaceae +myrothamnaceous +Myrothamnus +Myroxylon +myrrh +myrrhed +myrrhic +myrrhine +Myrrhis +myrrhol +myrrhophore +myrrhy +Myrsinaceae +myrsinaceous +myrsinad +Myrsiphyllum +Myrtaceae +myrtaceous +myrtal +Myrtales +myrtiform +Myrtilus +myrtle +myrtleberry +myrtlelike +myrtol +Myrtus +mysel +myself +mysell +Mysian +mysid +Mysidacea +Mysidae +mysidean +Mysis +mysogynism +mysoid +mysophobia +Mysore +mysosophist +mysost +myst +mystacial +Mystacocete +Mystacoceti +mystagogic +mystagogical +mystagogically +mystagogue +mystagogy +mystax +mysterial +mysteriarch +mysteriosophic +mysteriosophy +mysterious +mysteriously +mysteriousness +mysterize +mystery +mystes +mystic +mystical +mysticality +mystically +mysticalness +Mysticete +mysticete +Mysticeti +mysticetous +mysticism +mysticity +mysticize +mysticly +mystific +mystifically +mystification +mystificator +mystificatory +mystifiedly +mystifier +mystify +mystifyingly +mytacism +myth +mythical +mythicalism +mythicality +mythically +mythicalness +mythicism +mythicist +mythicize +mythicizer +mythification +mythify +mythism +mythist +mythize +mythland +mythmaker +mythmaking +mythoclast +mythoclastic +mythogenesis +mythogonic +mythogony +mythographer +mythographist +mythography +mythogreen +mythoheroic +mythohistoric +mythologema +mythologer +mythological +mythologically +mythologist +mythologize +mythologizer +mythologue +mythology +mythomania +mythomaniac +mythometer +mythonomy +mythopastoral +mythopoeic +mythopoeism +mythopoeist +mythopoem +mythopoesis +mythopoesy +mythopoet +mythopoetic +mythopoetize +mythopoetry +mythos +mythus +Mytilacea +mytilacean +mytilaceous +Mytiliaspis +mytilid +Mytilidae +mytiliform +mytiloid +mytilotoxine +Mytilus +myxa +myxadenitis +myxadenoma +myxaemia +myxamoeba +myxangitis +myxasthenia +myxedema +myxedematoid +myxedematous +myxedemic +myxemia +Myxine +Myxinidae +myxinoid +Myxinoidei +myxo +Myxobacteria +Myxobacteriaceae +myxobacteriaceous +Myxobacteriales +myxoblastoma +myxochondroma +myxochondrosarcoma +Myxococcus +myxocystoma +myxocyte +myxoenchondroma +myxofibroma +myxofibrosarcoma +myxoflagellate +myxogaster +Myxogasteres +Myxogastrales +Myxogastres +myxogastric +myxogastrous +myxoglioma +myxoid +myxoinoma +myxolipoma +myxoma +myxomatosis +myxomatous +Myxomycetales +myxomycete +Myxomycetes +myxomycetous +myxomyoma +myxoneuroma +myxopapilloma +Myxophyceae +myxophycean +Myxophyta +myxopod +Myxopoda +myxopodan +myxopodium +myxopodous +myxopoiesis +myxorrhea +myxosarcoma +Myxospongiae +myxospongian +Myxospongida +myxospore +Myxosporidia +myxosporidian +Myxosporidiida +Myxosporium +myxosporous +Myxothallophyta +myxotheca +Myzodendraceae +myzodendraceous +Myzodendron +Myzomyia +myzont +Myzontes +Myzostoma +Myzostomata +myzostomatous +myzostome +myzostomid +Myzostomida +Myzostomidae +myzostomidan +myzostomous +N +n +na +naa +naam +Naaman +Naassenes +nab +nabak +Nabal +Nabalism +Nabalite +Nabalitic +Nabaloi +Nabalus +Nabataean +Nabatean +Nabathaean +Nabathean +Nabathite +nabber +Nabby +nabk +nabla +nable +nabob +nabobery +nabobess +nabobical +nabobish +nabobishly +nabobism +nabobry +nabobship +Nabothian +nabs +Nabu +nacarat +nacarine +nace +nacelle +nach +nachani +Nachitoch +Nachitoches +Nachschlag +Nacionalista +nacket +nacre +nacred +nacreous +nacrine +nacrite +nacrous +nacry +nadder +Nadeem +nadir +nadiral +nadorite +nae +naebody +naegate +naegates +nael +Naemorhedinae +naemorhedine +Naemorhedus +naether +naething +nag +Naga +naga +nagaika +nagana +nagara +Nagari +nagatelite +nagger +naggin +nagging +naggingly +naggingness +naggish +naggle +naggly +naggy +naght +nagkassar +nagmaal +nagman +nagnag +nagnail +nagor +nagsman +nagster +nagual +nagualism +nagualist +nagyagite +Nahanarvali +Nahane +Nahani +Naharvali +Nahor +Nahua +Nahuan +Nahuatl +Nahuatlac +Nahuatlan +Nahuatleca +Nahuatlecan +Nahum +naiad +Naiadaceae +naiadaceous +Naiadales +Naiades +naiant +Naias +naid +naif +naifly +naig +naigie +naik +nail +nailbin +nailbrush +nailer +naileress +nailery +nailhead +nailing +nailless +naillike +nailprint +nailproof +nailrod +nailshop +nailsick +nailsmith +nailwort +naily +Naim +nain +nainsel +nainsook +naio +naipkin +Nair +nairy +nais +naish +naissance +naissant +naither +naive +naively +naiveness +naivete +naivety +Naja +nak +nake +naked +nakedish +nakedize +nakedly +nakedness +nakedweed +nakedwood +naker +nakhlite +nakhod +nakhoda +Nakir +nako +Nakomgilisala +nakong +nakoo +Nakula +Nalita +nallah +nam +Nama +namability +namable +Namaqua +namaqua +Namaquan +namaycush +namaz +namazlik +Nambe +namda +name +nameability +nameable +nameboard +nameless +namelessly +namelessness +nameling +namely +namer +namesake +naming +nammad +Nan +nan +Nana +nana +Nanaimo +nanawood +Nance +Nancy +nancy +Nanda +Nandi +nandi +Nandina +nandine +nandow +nandu +nane +nanes +nanga +nanism +nanization +nankeen +Nankin +nankin +Nanking +Nankingese +nannander +nannandrium +nannandrous +Nannette +nannoplankton +Nanny +nanny +nannyberry +nannybush +nanocephalia +nanocephalic +nanocephalism +nanocephalous +nanocephalus +nanocephaly +nanoid +nanomelia +nanomelous +nanomelus +nanosoma +nanosomia +nanosomus +nanpie +nant +Nanticoke +nantle +nantokite +Nantz +naological +naology +naometry +Naomi +Naos +naos +Naosaurus +Naoto +nap +napa +Napaea +Napaean +napal +napalm +nape +napead +napecrest +napellus +naperer +napery +naphtha +naphthacene +naphthalate +naphthalene +naphthaleneacetic +naphthalenesulphonic +naphthalenic +naphthalenoid +naphthalic +naphthalidine +naphthalin +naphthaline +naphthalization +naphthalize +naphthalol +naphthamine +naphthanthracene +naphthene +naphthenic +naphthinduline +naphthionate +naphtho +naphthoic +naphthol +naphtholate +naphtholize +naphtholsulphonate +naphtholsulphonic +naphthoquinone +naphthoresorcinol +naphthosalol +naphthous +naphthoxide +naphthyl +naphthylamine +naphthylaminesulphonic +naphthylene +naphthylic +naphtol +Napierian +napiform +napkin +napkining +napless +naplessness +Napoleon +napoleon +Napoleonana +Napoleonic +Napoleonically +Napoleonism +Napoleonist +Napoleonistic +napoleonite +Napoleonize +napoo +nappe +napped +napper +nappiness +napping +nappishness +nappy +naprapath +naprapathy +napron +napthionic +napu +nar +Narcaciontes +Narcaciontidae +narceine +narcism +Narciss +Narcissan +narcissi +Narcissine +narcissism +narcissist +narcissistic +Narcissus +narcist +narcistic +narcoanalysis +narcoanesthesia +Narcobatidae +Narcobatoidea +Narcobatus +narcohypnia +narcohypnosis +narcolepsy +narcoleptic +narcoma +narcomania +narcomaniac +narcomaniacal +narcomatous +Narcomedusae +narcomedusan +narcose +narcosis +narcostimulant +narcosynthesis +narcotherapy +narcotia +narcotic +narcotical +narcotically +narcoticalness +narcoticism +narcoticness +narcotina +narcotine +narcotinic +narcotism +narcotist +narcotization +narcotize +narcous +nard +nardine +nardoo +Nardus +Naren +Narendra +nares +Naresh +narghile +nargil +narial +naric +narica +naricorn +nariform +narine +naringenin +naringin +nark +narky +narr +narra +Narraganset +narras +narratable +narrate +narrater +narration +narrational +narrative +narratively +narrator +narratory +narratress +narratrix +narrawood +narrow +narrower +narrowhearted +narrowheartedness +narrowingness +narrowish +narrowly +narrowness +narrowy +narsarsukite +narsinga +narthecal +Narthecium +narthex +narwhal +narwhalian +nary +nasab +nasal +Nasalis +nasalis +nasalism +nasality +nasalization +nasalize +nasally +nasalward +nasalwards +nasard +Nascan +Nascapi +nascence +nascency +nascent +nasch +naseberry +nasethmoid +nash +nashgab +nashgob +Nashim +Nashira +Nashua +nasi +nasial +nasicorn +Nasicornia +nasicornous +Nasiei +nasiform +nasilabial +nasillate +nasillation +nasioalveolar +nasiobregmatic +nasioinial +nasiomental +nasion +nasitis +Naskhi +nasoalveola +nasoantral +nasobasilar +nasobronchial +nasobuccal +nasoccipital +nasociliary +nasoethmoidal +nasofrontal +nasolabial +nasolachrymal +nasological +nasologist +nasology +nasomalar +nasomaxillary +nasonite +nasoorbital +nasopalatal +nasopalatine +nasopharyngeal +nasopharyngitis +nasopharynx +nasoprognathic +nasoprognathism +nasorostral +nasoscope +nasoseptal +nasosinuitis +nasosinusitis +nasosubnasal +nasoturbinal +nasrol +Nassa +Nassau +Nassellaria +nassellarian +Nassidae +nassology +nast +nastaliq +nastic +nastika +nastily +nastiness +nasturtion +nasturtium +nasty +Nasua +nasus +nasute +nasuteness +nasutiform +nasutus +nat +natability +nataka +Natal +natal +Natalia +Natalian +Natalie +natality +nataloin +natals +natant +natantly +Nataraja +natation +natational +natator +natatorial +natatorious +natatorium +natatory +natch +natchbone +Natchez +Natchezan +Natchitoches +natchnee +Nate +nates +Nathan +Nathanael +Nathaniel +nathe +nather +nathless +Natica +Naticidae +naticiform +naticine +Natick +naticoid +natiform +natimortality +nation +national +nationalism +nationalist +nationalistic +nationalistically +nationality +nationalization +nationalize +nationalizer +nationally +nationalness +nationalty +nationhood +nationless +nationwide +native +natively +nativeness +nativism +nativist +nativistic +nativity +natr +Natraj +Natricinae +natricine +natrium +Natrix +natrochalcite +natrojarosite +natrolite +natron +Natt +natter +nattered +natteredness +natterjack +nattily +nattiness +nattle +natty +natuary +natural +naturalesque +naturalism +naturalist +naturalistic +naturalistically +naturality +naturalization +naturalize +naturalizer +naturally +naturalness +nature +naturecraft +naturelike +naturing +naturism +naturist +naturistic +naturistically +naturize +naturopath +naturopathic +naturopathist +naturopathy +naucrar +naucrary +naufragous +nauger +naught +naughtily +naughtiness +naughty +naujaite +naumachia +naumachy +naumannite +Naumburgia +naumk +naumkeag +naumkeager +naunt +nauntle +naupathia +nauplial +naupliiform +nauplioid +nauplius +nauropometer +nauscopy +nausea +nauseant +nauseaproof +nauseate +nauseatingly +nauseation +nauseous +nauseously +nauseousness +Nauset +naut +nautch +nauther +nautic +nautical +nauticality +nautically +nautics +nautiform +Nautilacea +nautilacean +nautilicone +nautiliform +nautilite +nautiloid +Nautiloidea +nautiloidean +nautilus +Navaho +Navajo +naval +navalese +navalism +navalist +navalistic +navalistically +navally +navar +navarch +navarchy +Navarrese +Navarrian +nave +navel +naveled +navellike +navelwort +navet +navette +navew +navicella +navicert +navicula +Naviculaceae +naviculaeform +navicular +naviculare +naviculoid +naviform +navigability +navigable +navigableness +navigably +navigant +navigate +navigation +navigational +navigator +navigerous +navipendular +navipendulum +navite +navvy +navy +naw +nawab +nawabship +nawt +nay +Nayar +Nayarit +Nayarita +nayaur +naysay +naysayer +nayward +nayword +Nazarate +Nazarean +Nazarene +Nazarenism +Nazarite +Nazariteship +Nazaritic +Nazaritish +Nazaritism +naze +Nazerini +Nazi +Nazify +Naziism +nazim +nazir +Nazirate +Nazirite +Naziritic +Nazism +ne +nea +Neal +neal +neallotype +Neanderthal +Neanderthaler +Neanderthaloid +neanic +neanthropic +neap +neaped +Neapolitan +nearable +nearabout +nearabouts +nearaivays +nearaway +nearby +Nearctic +Nearctica +nearest +nearish +nearly +nearmost +nearness +nearsighted +nearsightedly +nearsightedness +nearthrosis +neat +neaten +neath +neatherd +neatherdess +neathmost +neatify +neatly +neatness +neb +neback +Nebaioth +Nebalia +Nebaliacea +nebalian +Nebaliidae +nebalioid +nebbed +nebbuck +nebbuk +nebby +nebel +nebelist +nebenkern +Nebiim +Nebraskan +nebris +nebula +nebulae +nebular +nebularization +nebularize +nebulated +nebulation +nebule +nebulescent +nebuliferous +nebulite +nebulium +nebulization +nebulize +nebulizer +nebulose +nebulosity +nebulous +nebulously +nebulousness +Necator +necessar +necessarian +necessarianism +necessarily +necessariness +necessary +necessism +necessist +necessitarian +necessitarianism +necessitate +necessitatedly +necessitatingly +necessitation +necessitative +necessitous +necessitously +necessitousness +necessitude +necessity +neck +neckar +neckatee +neckband +neckcloth +necked +necker +neckercher +neckerchief +neckful +neckguard +necking +neckinger +necklace +necklaced +necklaceweed +neckless +necklet +necklike +neckline +neckmold +neckpiece +neckstock +necktie +necktieless +neckward +neckwear +neckweed +neckyoke +necrectomy +necremia +necrobacillary +necrobacillosis +necrobiosis +necrobiotic +necrogenic +necrogenous +necrographer +necrolatry +necrologic +necrological +necrologically +necrologist +necrologue +necrology +necromancer +necromancing +necromancy +necromantic +necromantically +necromorphous +necronite +necropathy +Necrophaga +necrophagan +necrophagous +necrophile +necrophilia +necrophilic +necrophilism +necrophilistic +necrophilous +necrophily +necrophobia +necrophobic +Necrophorus +necropoleis +necropoles +necropolis +necropolitan +necropsy +necroscopic +necroscopical +necroscopy +necrose +necrosis +necrotic +necrotization +necrotize +necrotomic +necrotomist +necrotomy +necrotype +necrotypic +Nectandra +nectar +nectareal +nectarean +nectared +nectareous +nectareously +nectareousness +nectarial +nectarian +nectaried +nectariferous +nectarine +Nectarinia +Nectariniidae +nectarious +nectarium +nectarivorous +nectarize +nectarlike +nectarous +nectary +nectiferous +nectocalycine +nectocalyx +Nectonema +nectophore +nectopod +Nectria +nectriaceous +Nectrioidaceae +Necturidae +Necturus +Ned +nedder +neddy +Nederlands +nee +neebor +neebour +need +needer +needfire +needful +needfully +needfulness +needgates +needham +needily +neediness +needing +needle +needlebill +needlebook +needlebush +needlecase +needled +needlefish +needleful +needlelike +needlemaker +needlemaking +needleman +needlemonger +needleproof +needler +needles +needless +needlessly +needlessness +needlestone +needlewoman +needlewood +needlework +needleworked +needleworker +needling +needly +needments +needs +needsome +needy +neeger +neeld +neele +neelghan +neem +neencephalic +neencephalon +Neengatu +neep +neepour +neer +neese +neet +neetup +neeze +nef +nefandous +nefandousness +nefarious +nefariously +nefariousness +nefast +neffy +neftgil +negate +negatedness +negation +negationalist +negationist +negative +negatively +negativeness +negativer +negativism +negativist +negativistic +negativity +negator +negatory +negatron +neger +neginoth +neglect +neglectable +neglectedly +neglectedness +neglecter +neglectful +neglectfully +neglectfulness +neglectingly +neglection +neglective +neglectively +neglector +neglectproof +negligee +negligence +negligency +negligent +negligently +negligibility +negligible +negligibleness +negligibly +negotiability +negotiable +negotiant +negotiate +negotiation +negotiator +negotiatory +negotiatress +negotiatrix +Negress +negrillo +negrine +Negritian +Negritic +Negritize +Negrito +Negritoid +Negro +negro +negrodom +Negrofy +negrohead +negrohood +Negroid +Negroidal +negroish +Negroism +Negroization +Negroize +negrolike +Negroloid +Negrophil +Negrophile +Negrophilism +Negrophilist +Negrophobe +Negrophobia +Negrophobiac +Negrophobist +Negrotic +Negundo +Negus +negus +Nehantic +Nehemiah +nehiloth +nei +neif +neigh +neighbor +neighbored +neighborer +neighboress +neighborhood +neighboring +neighborless +neighborlike +neighborliness +neighborly +neighborship +neighborstained +neighbourless +neighbourlike +neighbourship +neigher +Neil +Neillia +neiper +Neisseria +Neisserieae +neist +neither +Nejd +Nejdi +Nekkar +nekton +nektonic +Nelken +Nell +Nellie +Nelly +nelson +nelsonite +nelumbian +Nelumbium +Nelumbo +Nelumbonaceae +nema +nemaline +Nemalion +Nemalionaceae +Nemalionales +nemalite +Nemastomaceae +Nematelmia +nematelminth +Nematelminthes +nemathece +nemathecial +nemathecium +Nemathelmia +nemathelminth +Nemathelminthes +nematic +nematoblast +nematoblastic +Nematocera +nematoceran +nematocerous +nematocide +nematocyst +nematocystic +Nematoda +nematode +nematodiasis +nematogene +nematogenic +nematogenous +nematognath +Nematognathi +nematognathous +nematogone +nematogonous +nematoid +Nematoidea +nematoidean +nematologist +nematology +Nematomorpha +nematophyton +Nematospora +nematozooid +Nembutal +Nemean +Nemertea +nemertean +Nemertina +nemertine +Nemertinea +nemertinean +Nemertini +nemertoid +nemeses +Nemesia +nemesic +Nemesis +Nemichthyidae +Nemichthys +Nemocera +nemoceran +nemocerous +Nemopanthus +Nemophila +nemophilist +nemophilous +nemophily +nemoral +Nemorensian +nemoricole +Nengahiba +nenta +nenuphar +neo +neoacademic +neoanthropic +Neoarctic +neoarsphenamine +Neobalaena +Neobeckia +neoblastic +neobotanist +neobotany +Neocene +Neoceratodus +neocerotic +neoclassic +neoclassicism +neoclassicist +Neocomian +neocosmic +neocracy +neocriticism +neocyanine +neocyte +neocytosis +neodamode +neodidymium +neodymium +Neofabraea +neofetal +neofetus +Neofiber +neoformation +neoformative +Neogaea +Neogaean +neogamous +neogamy +Neogene +neogenesis +neogenetic +Neognathae +neognathic +neognathous +neogrammarian +neogrammatical +neographic +neohexane +Neohipparion +neoholmia +neoholmium +neoimpressionism +neoimpressionist +neolalia +neolater +neolatry +neolith +neolithic +neologian +neologianism +neologic +neological +neologically +neologism +neologist +neologistic +neologistical +neologization +neologize +neology +neomedievalism +neomenia +neomenian +Neomeniidae +neomiracle +neomodal +neomorph +Neomorpha +neomorphic +neomorphism +Neomylodon +neon +neonatal +neonate +neonatus +neonomian +neonomianism +neontology +neonychium +neopagan +neopaganism +neopaganize +Neopaleozoic +neopallial +neopallium +neoparaffin +neophilism +neophilological +neophilologist +neophobia +neophobic +neophrastic +Neophron +neophyte +neophytic +neophytish +neophytism +Neopieris +neoplasia +neoplasm +neoplasma +neoplasmata +neoplastic +neoplasticism +neoplasty +Neoplatonic +Neoplatonician +Neoplatonism +Neoplatonist +neoprene +neorama +neorealism +Neornithes +neornithic +Neosalvarsan +Neosorex +Neosporidia +neossin +neossology +neossoptile +neostriatum +neostyle +neoteinia +neoteinic +neotenia +neotenic +neoteny +neoteric +neoterically +neoterism +neoterist +neoteristic +neoterize +neothalamus +Neotoma +Neotragus +Neotremata +Neotropic +Neotropical +neotype +neovitalism +neovolcanic +Neowashingtonia +neoytterbium +neoza +Neozoic +Nep +nep +Nepa +Nepal +Nepalese +Nepali +Nepenthaceae +nepenthaceous +nepenthe +nepenthean +Nepenthes +nepenthes +neper +Neperian +Nepeta +nephalism +nephalist +Nephele +nephele +nepheligenous +nepheline +nephelinic +nephelinite +nephelinitic +nephelinitoid +nephelite +Nephelium +nephelognosy +nepheloid +nephelometer +nephelometric +nephelometrical +nephelometrically +nephelometry +nephelorometer +nepheloscope +nephesh +nephew +nephewship +Nephila +Nephilinae +Nephite +nephogram +nephograph +nephological +nephologist +nephology +nephoscope +nephradenoma +nephralgia +nephralgic +nephrapostasis +nephratonia +nephrauxe +nephrectasia +nephrectasis +nephrectomize +nephrectomy +nephrelcosis +nephremia +nephremphraxis +nephria +nephric +nephridia +nephridial +nephridiopore +nephridium +nephrism +nephrite +nephritic +nephritical +nephritis +nephroabdominal +nephrocardiac +nephrocele +nephrocoele +nephrocolic +nephrocolopexy +nephrocoloptosis +nephrocystitis +nephrocystosis +nephrocyte +nephrodinic +Nephrodium +nephroerysipelas +nephrogastric +nephrogenetic +nephrogenic +nephrogenous +nephrogonaduct +nephrohydrosis +nephrohypertrophy +nephroid +Nephrolepis +nephrolith +nephrolithic +nephrolithotomy +nephrologist +nephrology +nephrolysin +nephrolysis +nephrolytic +nephromalacia +nephromegaly +nephromere +nephron +nephroncus +nephroparalysis +nephropathic +nephropathy +nephropexy +nephrophthisis +nephropore +Nephrops +Nephropsidae +nephroptosia +nephroptosis +nephropyelitis +nephropyeloplasty +nephropyosis +nephrorrhagia +nephrorrhaphy +nephros +nephrosclerosis +nephrosis +nephrostoma +nephrostome +nephrostomial +nephrostomous +nephrostomy +nephrotome +nephrotomize +nephrotomy +nephrotoxic +nephrotoxicity +nephrotoxin +nephrotuberculosis +nephrotyphoid +nephrotyphus +nephrozymosis +Nepidae +nepionic +nepman +nepotal +nepote +nepotic +nepotious +nepotism +nepotist +nepotistical +nepouite +Neptune +Neptunean +Neptunian +neptunism +neptunist +neptunium +Nereid +Nereidae +nereidiform +Nereidiformia +Nereis +nereite +Nereocystis +Neri +Nerine +nerine +Nerita +neritic +Neritidae +Neritina +neritoid +Nerium +Neroic +Neronian +Neronic +Neronize +nerterology +Nerthridae +Nerthrus +nerval +nervate +nervation +nervature +nerve +nerveless +nervelessly +nervelessness +nervelet +nerveproof +nerver +nerveroot +nervid +nerviduct +Nervii +nervily +nervimotion +nervimotor +nervimuscular +nervine +nerviness +nerving +nervish +nervism +nervomuscular +nervosanguineous +nervose +nervosism +nervosity +nervous +nervously +nervousness +nervular +nervule +nervulet +nervulose +nervuration +nervure +nervy +nescience +nescient +nese +nesh +neshly +neshness +Nesiot +nesiote +Neskhi +Neslia +Nesogaea +Nesogaean +Nesokia +Nesonetta +Nesotragus +Nespelim +nesquehonite +ness +nesslerization +Nesslerize +nesslerize +nest +nestable +nestage +nester +nestful +nestiatria +nestitherapy +nestle +nestler +nestlike +nestling +Nestor +Nestorian +Nestorianism +Nestorianize +Nestorianizer +nestorine +nesty +Net +net +netball +netbraider +netbush +netcha +Netchilik +nete +neter +netful +neth +netheist +nether +Netherlander +Netherlandian +Netherlandic +Netherlandish +nethermore +nethermost +netherstock +netherstone +netherward +netherwards +Nethinim +neti +netleaf +netlike +netmaker +netmaking +netman +netmonger +netop +netsman +netsuke +nettable +Nettapus +netted +netter +Nettie +netting +Nettion +nettle +nettlebed +nettlebird +nettlefire +nettlefish +nettlefoot +nettlelike +nettlemonger +nettler +nettlesome +nettlewort +nettling +nettly +Netty +netty +netwise +network +Neudeckian +neugroschen +neuma +neumatic +neumatize +neume +neumic +neurad +neuradynamia +neural +neurale +neuralgia +neuralgiac +neuralgic +neuralgiform +neuralgy +neuralist +neurapophyseal +neurapophysial +neurapophysis +neurarthropathy +neurasthenia +neurasthenic +neurasthenical +neurasthenically +neurataxia +neurataxy +neuration +neuratrophia +neuratrophic +neuratrophy +neuraxial +neuraxis +neuraxon +neuraxone +neurectasia +neurectasis +neurectasy +neurectome +neurectomic +neurectomy +neurectopia +neurectopy +neurenteric +neurepithelium +neurergic +neurexairesis +neurhypnology +neurhypnotist +neuriatry +neuric +neurilema +neurilematic +neurilemma +neurilemmal +neurilemmatic +neurilemmatous +neurilemmitis +neurility +neurin +neurine +neurinoma +neurism +neurite +neuritic +neuritis +neuroanatomical +neuroanatomy +neurobiotactic +neurobiotaxis +neuroblast +neuroblastic +neuroblastoma +neurocanal +neurocardiac +neurocele +neurocentral +neurocentrum +neurochemistry +neurochitin +neurochondrite +neurochord +neurochorioretinitis +neurocirculatory +neurocity +neuroclonic +neurocoele +neurocoelian +neurocyte +neurocytoma +neurodegenerative +neurodendrite +neurodendron +neurodermatitis +neurodermatosis +neurodermitis +neurodiagnosis +neurodynamic +neurodynia +neuroepidermal +neuroepithelial +neuroepithelium +neurofibril +neurofibrilla +neurofibrillae +neurofibrillar +neurofibroma +neurofibromatosis +neurofil +neuroganglion +neurogastralgia +neurogastric +neurogenesis +neurogenetic +neurogenic +neurogenous +neuroglandular +neuroglia +neurogliac +neuroglial +neurogliar +neuroglic +neuroglioma +neurogliosis +neurogram +neurogrammic +neurographic +neurography +neurohistology +neurohumor +neurohumoral +neurohypnology +neurohypnotic +neurohypnotism +neurohypophysis +neuroid +neurokeratin +neurokyme +neurological +neurologist +neurologize +neurology +neurolymph +neurolysis +neurolytic +neuroma +neuromalacia +neuromalakia +neuromast +neuromastic +neuromatosis +neuromatous +neuromere +neuromerism +neuromerous +neuromimesis +neuromimetic +neuromotor +neuromuscular +neuromusculature +neuromyelitis +neuromyic +neuron +neuronal +neurone +neuronic +neuronism +neuronist +neuronophagia +neuronophagy +neuronym +neuronymy +neuroparalysis +neuroparalytic +neuropath +neuropathic +neuropathical +neuropathically +neuropathist +neuropathological +neuropathologist +neuropathology +neuropathy +Neurope +neurophagy +neurophil +neurophile +neurophilic +neurophysiological +neurophysiology +neuropile +neuroplasm +neuroplasmic +neuroplasty +neuroplexus +neuropodial +neuropodium +neuropodous +neuropore +neuropsychiatric +neuropsychiatrist +neuropsychiatry +neuropsychic +neuropsychological +neuropsychologist +neuropsychology +neuropsychopathic +neuropsychopathy +neuropsychosis +neuropter +Neuroptera +neuropteran +Neuropteris +neuropterist +neuropteroid +Neuropteroidea +neuropterological +neuropterology +neuropteron +neuropterous +neuroretinitis +neurorrhaphy +Neurorthoptera +neurorthopteran +neurorthopterous +neurosal +neurosarcoma +neurosclerosis +neuroses +neurosis +neuroskeletal +neuroskeleton +neurosome +neurospasm +neurospongium +neurosthenia +neurosurgeon +neurosurgery +neurosurgical +neurosuture +neurosynapse +neurosyphilis +neurotendinous +neurotension +neurotherapeutics +neurotherapist +neurotherapy +neurothlipsis +neurotic +neurotically +neuroticism +neuroticize +neurotization +neurotome +neurotomical +neurotomist +neurotomize +neurotomy +neurotonic +neurotoxia +neurotoxic +neurotoxin +neurotripsy +neurotrophic +neurotrophy +neurotropic +neurotropism +neurovaccination +neurovaccine +neurovascular +neurovisceral +neurula +neurypnological +neurypnologist +neurypnology +Neustrian +neuter +neuterdom +neuterlike +neuterly +neuterness +neutral +neutralism +neutralist +neutrality +neutralization +neutralize +neutralizer +neutrally +neutralness +neutrino +neutroceptive +neutroceptor +neutroclusion +Neutrodyne +neutrologistic +neutron +neutropassive +neutrophile +neutrophilia +neutrophilic +neutrophilous +Nevada +Nevadan +nevadite +neve +nevel +never +neverland +nevermore +nevertheless +Neville +nevo +nevoid +Nevome +nevoy +nevus +nevyanskite +new +Newar +Newari +newberyite +newcal +Newcastle +newcome +newcomer +newel +newelty +newfangle +newfangled +newfangledism +newfangledly +newfangledness +newfanglement +Newfoundland +Newfoundlander +Newichawanoc +newing +newings +newish +newlandite +newly +newlywed +Newmanism +Newmanite +Newmanize +newmarket +newness +Newport +news +newsbill +newsboard +newsboat +newsboy +newscast +newscaster +newscasting +newsful +newsiness +newsless +newslessness +newsletter +newsman +newsmonger +newsmongering +newsmongery +newspaper +newspaperdom +newspaperese +newspaperish +newspaperized +newspaperman +newspaperwoman +newspapery +newsprint +newsreader +newsreel +newsroom +newssheet +newsstand +newsteller +newsworthiness +newsworthy +newsy +newt +newtake +newton +Newtonian +Newtonianism +Newtonic +Newtonist +newtonite +nexal +next +nextly +nextness +nexum +nexus +neyanda +ngai +ngaio +ngapi +Ngoko +Nguyen +Nhan +Nheengatu +ni +niacin +Niagara +Niagaran +Niall +Niantic +Nias +Niasese +niata +nib +nibbana +nibbed +nibber +nibble +nibbler +nibblingly +nibby +niblick +niblike +nibong +nibs +nibsome +Nicaean +Nicaragua +Nicaraguan +Nicarao +niccolic +niccoliferous +niccolite +niccolous +Nice +nice +niceish +niceling +nicely +Nicene +niceness +Nicenian +Nicenist +nicesome +nicetish +nicety +Nichael +niche +nichelino +nicher +Nicholas +Nici +Nick +nick +nickel +nickelage +nickelic +nickeliferous +nickeline +nickeling +nickelization +nickelize +nickellike +nickelodeon +nickelous +nickeltype +nicker +nickerpecker +nickey +Nickie +Nickieben +nicking +nickle +nickname +nicknameable +nicknamee +nicknameless +nicknamer +Nickneven +nickstick +nicky +Nicobar +Nicobarese +Nicodemite +Nicodemus +Nicol +Nicolaitan +Nicolaitanism +Nicolas +nicolayite +Nicolette +Nicolo +nicolo +Nicomachean +nicotia +nicotian +Nicotiana +nicotianin +nicotic +nicotinamide +nicotine +nicotinean +nicotined +nicotineless +nicotinian +nicotinic +nicotinism +nicotinize +nicotism +nicotize +nictate +nictation +nictitant +nictitate +nictitation +nid +nidal +nidamental +nidana +nidation +nidatory +niddering +niddick +niddle +nide +nidge +nidget +nidgety +nidi +nidicolous +nidificant +nidificate +nidification +nidificational +nidifugous +nidify +niding +nidologist +nidology +nidor +nidorosity +nidorous +nidorulent +nidulant +Nidularia +Nidulariaceae +nidulariaceous +Nidulariales +nidulate +nidulation +nidulus +nidus +niece +nieceless +nieceship +niellated +nielled +niellist +niello +Niels +niepa +Nierembergia +Niersteiner +Nietzschean +Nietzscheanism +Nietzscheism +nieve +nieveta +nievling +nife +nifesima +niffer +nific +nifle +nifling +nifty +nig +Nigel +Nigella +Nigerian +niggard +niggardize +niggardliness +niggardling +niggardly +niggardness +nigger +niggerdom +niggerfish +niggergoose +niggerhead +niggerish +niggerism +niggerling +niggertoe +niggerweed +niggery +niggle +niggler +niggling +nigglingly +niggly +nigh +nighly +nighness +night +nightcap +nightcapped +nightcaps +nightchurr +nightdress +nighted +nightfall +nightfish +nightflit +nightfowl +nightgown +nighthawk +nightie +nightingale +nightingalize +nightjar +nightless +nightlessness +nightlike +nightlong +nightly +nightman +nightmare +nightmarish +nightmarishly +nightmary +nights +nightshade +nightshine +nightshirt +nightstock +nightstool +nighttide +nighttime +nightwalker +nightwalking +nightward +nightwards +nightwear +nightwork +nightworker +nignay +nignye +nigori +nigranilin +nigraniline +nigre +nigrescence +nigrescent +nigresceous +nigrescite +nigrification +nigrified +nigrify +nigrine +Nigritian +nigrities +nigritude +nigritudinous +nigrosine +nigrous +nigua +Nihal +nihilianism +nihilianistic +nihilification +nihilify +nihilism +nihilist +nihilistic +nihilitic +nihility +nikau +Nikeno +nikethamide +Nikko +niklesite +Nikolai +nil +Nile +nilgai +Nilometer +Nilometric +Niloscope +Nilot +Nilotic +Nilous +nilpotent +Nils +nim +nimb +nimbated +nimbed +nimbi +nimbiferous +nimbification +nimble +nimblebrained +nimbleness +nimbly +nimbose +nimbosity +nimbus +nimbused +nimiety +niminy +nimious +Nimkish +nimmer +Nimrod +Nimrodian +Nimrodic +Nimrodical +Nimrodize +nimshi +Nina +nincom +nincompoop +nincompoopery +nincompoophood +nincompoopish +nine +ninebark +ninefold +nineholes +ninepegs +ninepence +ninepenny +ninepin +ninepins +ninescore +nineted +nineteen +nineteenfold +nineteenth +nineteenthly +ninetieth +ninety +ninetyfold +ninetyish +ninetyknot +Ninevite +Ninevitical +Ninevitish +Ning +Ningpo +Ninja +ninny +ninnyhammer +ninnyish +ninnyism +ninnyship +ninnywatch +Ninon +ninon +Ninox +ninth +ninthly +nintu +ninut +niobate +Niobe +Niobean +niobic +Niobid +Niobite +niobite +niobium +niobous +niog +niota +Nip +nip +nipa +nipcheese +niphablepsia +niphotyphlosis +Nipissing +Nipmuc +nipper +nipperkin +nippers +nippily +nippiness +nipping +nippingly +nippitate +nipple +nippleless +nipplewort +Nipponese +Nipponism +nipponium +Nipponize +nippy +nipter +Niquiran +nirles +nirmanakaya +nirvana +nirvanic +Nisaean +Nisan +nisei +Nishada +nishiki +nisnas +nispero +Nisqualli +nisse +nisus +nit +nitch +nitchevo +Nitella +nitency +nitently +niter +niterbush +nitered +nither +nithing +nitid +nitidous +nitidulid +Nitidulidae +nito +niton +nitramine +nitramino +nitranilic +nitraniline +nitrate +nitratine +nitration +nitrator +Nitrian +nitriary +nitric +nitridation +nitride +nitriding +nitridization +nitridize +nitrifaction +nitriferous +nitrifiable +nitrification +nitrifier +nitrify +nitrile +Nitriot +nitrite +nitro +nitroalizarin +nitroamine +nitroaniline +Nitrobacter +nitrobacteria +Nitrobacteriaceae +Nitrobacterieae +nitrobarite +nitrobenzene +nitrobenzol +nitrobenzole +nitrocalcite +nitrocellulose +nitrocellulosic +nitrochloroform +nitrocotton +nitroform +nitrogelatin +nitrogen +nitrogenate +nitrogenation +nitrogenic +nitrogenization +nitrogenize +nitrogenous +nitroglycerin +nitrohydrochloric +nitrolamine +nitrolic +nitrolime +nitromagnesite +nitrometer +nitrometric +nitromuriate +nitromuriatic +nitronaphthalene +nitroparaffin +nitrophenol +nitrophilous +nitrophyte +nitrophytic +nitroprussiate +nitroprussic +nitroprusside +nitrosamine +nitrosate +nitrosification +nitrosify +nitrosite +nitrosobacteria +nitrosochloride +Nitrosococcus +Nitrosomonas +nitrososulphuric +nitrostarch +nitrosulphate +nitrosulphonic +nitrosulphuric +nitrosyl +nitrosylsulphuric +nitrotoluene +nitrous +nitroxyl +nitryl +nitter +nitty +nitwit +Nitzschia +Nitzschiaceae +Niuan +Niue +nival +nivation +nivellate +nivellation +nivellator +nivellization +nivenite +niveous +nivicolous +nivosity +nix +nixie +niyoga +Nizam +nizam +nizamate +nizamut +nizy +njave +No +no +noa +Noachian +Noachic +Noachical +Noachite +Noah +Noahic +Noam +nob +nobber +nobbily +nobble +nobbler +nobbut +nobby +nobiliary +nobilify +nobilitate +nobilitation +nobility +noble +noblehearted +nobleheartedly +nobleheartedness +nobleman +noblemanly +nobleness +noblesse +noblewoman +nobley +nobly +nobody +nobodyness +nobs +nocake +Nocardia +nocardiosis +nocent +nocerite +nociassociation +nociceptive +nociceptor +nociperception +nociperceptive +nock +nocket +nocktat +noctambulant +noctambulation +noctambule +noctambulism +noctambulist +noctambulistic +noctambulous +Nocten +noctidial +noctidiurnal +noctiferous +noctiflorous +Noctilio +Noctilionidae +Noctiluca +noctiluca +noctilucal +noctilucan +noctilucence +noctilucent +Noctilucidae +noctilucin +noctilucine +noctilucous +noctiluminous +noctipotent +noctivagant +noctivagation +noctivagous +noctograph +noctovision +Noctuae +noctuid +Noctuidae +noctuiform +noctule +nocturia +nocturn +nocturnal +nocturnally +nocturne +nocuity +nocuous +nocuously +nocuousness +nod +nodal +nodality +nodated +nodder +nodding +noddingly +noddle +noddy +node +noded +nodi +nodiak +nodical +nodicorn +nodiferous +nodiflorous +nodiform +Nodosaria +nodosarian +nodosariform +nodosarine +nodose +nodosity +nodous +nodular +nodulate +nodulated +nodulation +nodule +noduled +nodulize +nodulose +nodulous +nodulus +nodus +noegenesis +noegenetic +Noel +noel +noematachograph +noematachometer +noematachometic +Noemi +Noetic +noetic +noetics +nog +nogada +Nogai +nogal +noggen +noggin +nogging +noghead +nogheaded +nohow +Nohuntsik +noibwood +noil +noilage +noiler +noily +noint +nointment +noir +noise +noiseful +noisefully +noiseless +noiselessly +noiselessness +noisemaker +noisemaking +noiseproof +noisette +noisily +noisiness +noisome +noisomely +noisomeness +noisy +nokta +Nolascan +nolition +Noll +noll +nolle +nolleity +nollepros +nolo +noma +nomad +nomadian +nomadic +nomadical +nomadically +Nomadidae +nomadism +nomadization +nomadize +nomancy +nomarch +nomarchy +Nomarthra +nomarthral +nombril +nome +Nomeidae +nomenclate +nomenclative +nomenclator +nomenclatorial +nomenclatorship +nomenclatory +nomenclatural +nomenclature +nomenclaturist +Nomeus +nomial +nomic +nomina +nominable +nominal +nominalism +nominalist +nominalistic +nominality +nominally +nominate +nominated +nominately +nomination +nominatival +nominative +nominatively +nominator +nominatrix +nominature +nominee +nomineeism +nominy +nomism +nomisma +nomismata +nomistic +nomocanon +nomocracy +nomogenist +nomogenous +nomogeny +nomogram +nomograph +nomographer +nomographic +nomographical +nomographically +nomography +nomological +nomologist +nomology +nomopelmous +nomophylax +nomophyllous +nomos +nomotheism +nomothete +nomothetes +nomothetic +nomothetical +non +Nona +nonabandonment +nonabdication +nonabiding +nonability +nonabjuration +nonabjurer +nonabolition +nonabridgment +nonabsentation +nonabsolute +nonabsolution +nonabsorbable +nonabsorbent +nonabsorptive +nonabstainer +nonabstaining +nonabstemious +nonabstention +nonabstract +nonacademic +nonacceding +nonacceleration +nonaccent +nonacceptance +nonacceptant +nonacceptation +nonaccess +nonaccession +nonaccessory +nonaccidental +nonaccompaniment +nonaccompanying +nonaccomplishment +nonaccredited +nonaccretion +nonachievement +nonacid +nonacknowledgment +nonacosane +nonacoustic +nonacquaintance +nonacquiescence +nonacquiescent +nonacquisitive +nonacquittal +nonact +nonactinic +nonaction +nonactionable +nonactive +nonactuality +nonaculeate +nonacute +nonadditive +nonadecane +nonadherence +nonadherent +nonadhesion +nonadhesive +nonadjacent +nonadjectival +nonadjournment +nonadjustable +nonadjustive +nonadjustment +nonadministrative +nonadmiring +nonadmission +nonadmitted +nonadoption +Nonadorantes +nonadornment +nonadult +nonadvancement +nonadvantageous +nonadventitious +nonadventurous +nonadverbial +nonadvertence +nonadvertency +nonadvocate +nonaerating +nonaerobiotic +nonaesthetic +nonaffection +nonaffiliated +nonaffirmation +nonage +nonagenarian +nonagency +nonagent +nonagesimal +nonagglutinative +nonagglutinator +nonaggression +nonaggressive +nonagon +nonagrarian +nonagreement +nonagricultural +nonahydrate +nonaid +nonair +nonalarmist +nonalcohol +nonalcoholic +nonalgebraic +nonalienating +nonalienation +nonalignment +nonalkaloidal +nonallegation +nonallegorical +nonalliterated +nonalliterative +nonallotment +nonalluvial +nonalphabetic +nonaltruistic +nonaluminous +nonamalgamable +nonamendable +nonamino +nonamotion +nonamphibious +nonamputation +nonanalogy +nonanalytical +nonanalyzable +nonanalyzed +nonanaphoric +nonanaphthene +nonanatomical +nonancestral +nonane +nonanesthetized +nonangelic +nonangling +nonanimal +nonannexation +nonannouncement +nonannuitant +nonannulment +nonanoic +nonanonymity +nonanswer +nonantagonistic +nonanticipative +nonantigenic +nonapologetic +nonapostatizing +nonapostolic +nonapparent +nonappealable +nonappearance +nonappearer +nonappearing +nonappellate +nonappendicular +nonapplication +nonapply +nonappointment +nonapportionable +nonapposable +nonappraisal +nonappreciation +nonapprehension +nonappropriation +nonapproval +nonaqueous +nonarbitrable +nonarcing +nonargentiferous +nonaristocratic +nonarithmetical +nonarmament +nonarmigerous +nonaromatic +nonarraignment +nonarrival +nonarsenical +nonarterial +nonartesian +nonarticulated +nonarticulation +nonartistic +nonary +nonascendancy +nonascertainable +nonascertaining +nonascetic +nonascription +nonaseptic +nonaspersion +nonasphalt +nonaspirate +nonaspiring +nonassault +nonassent +nonassentation +nonassented +nonassenting +nonassertion +nonassertive +nonassessable +nonassessment +nonassignable +nonassignment +nonassimilable +nonassimilating +nonassimilation +nonassistance +nonassistive +nonassociable +nonassortment +nonassurance +nonasthmatic +nonastronomical +nonathletic +nonatmospheric +nonatonement +nonattached +nonattachment +nonattainment +nonattendance +nonattendant +nonattention +nonattestation +nonattribution +nonattributive +nonaugmentative +nonauricular +nonauriferous +nonauthentication +nonauthoritative +nonautomatic +nonautomotive +nonavoidance +nonaxiomatic +nonazotized +nonbachelor +nonbacterial +nonbailable +nonballoting +nonbanishment +nonbankable +nonbarbarous +nonbaronial +nonbase +nonbasement +nonbasic +nonbasing +nonbathing +nonbearded +nonbearing +nonbeing +nonbeliever +nonbelieving +nonbelligerent +nonbending +nonbenevolent +nonbetrayal +nonbeverage +nonbilabiate +nonbilious +nonbinomial +nonbiological +nonbitter +nonbituminous +nonblack +nonblameless +nonbleeding +nonblended +nonblockaded +nonblocking +nonblooded +nonblooming +nonbodily +nonbookish +nonborrower +nonbotanical +nonbourgeois +nonbranded +nonbreakable +nonbreeder +nonbreeding +nonbroodiness +nonbroody +nonbrowsing +nonbudding +nonbulbous +nonbulkhead +nonbureaucratic +nonburgage +nonburgess +nonburnable +nonburning +nonbursting +nonbusiness +nonbuying +noncabinet +noncaffeine +noncaking +Noncalcarea +noncalcareous +noncalcified +noncallability +noncallable +noncancellable +noncannibalistic +noncanonical +noncanonization +noncanvassing +noncapillarity +noncapillary +noncapital +noncapitalist +noncapitalistic +noncapitulation +noncapsizable +noncapture +noncarbonate +noncareer +noncarnivorous +noncarrier +noncartelized +noncaste +noncastigation +noncataloguer +noncatarrhal +noncatechizable +noncategorical +noncathedral +noncatholicity +noncausality +noncausation +nonce +noncelebration +noncelestial +noncellular +noncellulosic +noncensored +noncensorious +noncensus +noncentral +noncereal +noncerebral +nonceremonial +noncertain +noncertainty +noncertified +nonchafing +nonchalance +nonchalant +nonchalantly +nonchalantness +nonchalky +nonchallenger +nonchampion +nonchangeable +nonchanging +noncharacteristic +nonchargeable +nonchastisement +nonchastity +nonchemical +nonchemist +nonchivalrous +nonchokable +nonchokebore +nonchronological +nonchurch +nonchurched +nonchurchgoer +nonciliate +noncircuit +noncircuital +noncircular +noncirculation +noncitation +noncitizen +noncivilized +nonclaim +nonclaimable +nonclassable +nonclassical +nonclassifiable +nonclassification +nonclastic +nonclearance +noncleistogamic +nonclergyable +nonclerical +nonclimbable +nonclinical +nonclose +nonclosure +nonclotting +noncoagulability +noncoagulable +noncoagulation +noncoalescing +noncock +noncoercion +noncoercive +noncognate +noncognition +noncognitive +noncognizable +noncognizance +noncoherent +noncohesion +noncohesive +noncoinage +noncoincidence +noncoincident +noncoincidental +noncoking +noncollaboration +noncollaborative +noncollapsible +noncollectable +noncollection +noncollegiate +noncollinear +noncolloid +noncollusion +noncollusive +noncolonial +noncoloring +noncom +noncombat +noncombatant +noncombination +noncombining +noncombustible +noncombustion +noncome +noncoming +noncommemoration +noncommencement +noncommendable +noncommensurable +noncommercial +noncommissioned +noncommittal +noncommittalism +noncommittally +noncommittalness +noncommonable +noncommorancy +noncommunal +noncommunicable +noncommunicant +noncommunicating +noncommunication +noncommunion +noncommunist +noncommunistic +noncommutative +noncompearance +noncompensating +noncompensation +noncompetency +noncompetent +noncompeting +noncompetitive +noncompetitively +noncomplaisance +noncompletion +noncompliance +noncomplicity +noncomplying +noncomposite +noncompoundable +noncompounder +noncomprehension +noncompressible +noncompression +noncompulsion +noncomputation +noncon +nonconcealment +nonconceiving +nonconcentration +nonconception +nonconcern +nonconcession +nonconciliating +nonconcludency +nonconcludent +nonconcluding +nonconclusion +nonconcordant +nonconcur +nonconcurrence +nonconcurrency +nonconcurrent +noncondensable +noncondensation +noncondensible +noncondensing +noncondimental +nonconditioned +noncondonation +nonconducive +nonconductibility +nonconductible +nonconducting +nonconduction +nonconductive +nonconductor +nonconfederate +nonconferrable +nonconfession +nonconficient +nonconfident +nonconfidential +nonconfinement +nonconfirmation +nonconfirmative +nonconfiscable +nonconfiscation +nonconfitent +nonconflicting +nonconform +nonconformable +nonconformably +nonconformance +nonconformer +nonconforming +nonconformism +nonconformist +nonconformistical +nonconformistically +nonconformitant +nonconformity +nonconfutation +noncongealing +noncongenital +noncongestion +noncongratulatory +noncongruent +nonconjectural +nonconjugal +nonconjugate +nonconjunction +nonconnection +nonconnective +nonconnivance +nonconnotative +nonconnubial +nonconscientious +nonconscious +nonconscription +nonconsecration +nonconsecutive +nonconsent +nonconsenting +nonconsequence +nonconsequent +nonconservation +nonconservative +nonconserving +nonconsideration +nonconsignment +nonconsistorial +nonconsoling +nonconsonant +nonconsorting +nonconspirator +nonconspiring +nonconstituent +nonconstitutional +nonconstraint +nonconstruable +nonconstruction +nonconstructive +nonconsular +nonconsultative +nonconsumable +nonconsumption +noncontact +noncontagion +noncontagionist +noncontagious +noncontagiousness +noncontamination +noncontemplative +noncontending +noncontent +noncontention +noncontentious +noncontentiously +nonconterminous +noncontiguity +noncontiguous +noncontinental +noncontingent +noncontinuance +noncontinuation +noncontinuous +noncontraband +noncontraction +noncontradiction +noncontradictory +noncontributing +noncontribution +noncontributor +noncontributory +noncontrivance +noncontrolled +noncontrolling +noncontroversial +nonconvective +nonconvenable +nonconventional +nonconvergent +nonconversable +nonconversant +nonconversational +nonconversion +nonconvertible +nonconveyance +nonconviction +nonconvivial +noncoplanar +noncopying +noncoring +noncorporate +noncorporeality +noncorpuscular +noncorrection +noncorrective +noncorrelation +noncorrespondence +noncorrespondent +noncorresponding +noncorroboration +noncorroborative +noncorrodible +noncorroding +noncorrosive +noncorruption +noncortical +noncosmic +noncosmopolitism +noncostraight +noncottager +noncotyledonous +noncounty +noncranking +noncreation +noncreative +noncredence +noncredent +noncredibility +noncredible +noncreditor +noncreeping +noncrenate +noncretaceous +noncriminal +noncriminality +noncrinoid +noncritical +noncrucial +noncruciform +noncrusading +noncrushability +noncrushable +noncrustaceous +noncrystalline +noncrystallizable +noncrystallized +noncrystallizing +nonculmination +nonculpable +noncultivated +noncultivation +nonculture +noncumulative +noncurantist +noncurling +noncurrency +noncurrent +noncursive +noncurtailment +noncuspidate +noncustomary +noncutting +noncyclic +noncyclical +nonda +nondamageable +nondamnation +nondancer +nondangerous +nondatival +nondealer +nondebtor +nondecadence +nondecadent +nondecalcified +nondecane +nondecasyllabic +nondecatoic +nondecaying +nondeceivable +nondeception +nondeceptive +Nondeciduata +nondeciduate +nondeciduous +nondecision +nondeclarant +nondeclaration +nondeclarer +nondecomposition +nondecoration +nondedication +nondeduction +nondefalcation +nondefamatory +nondefaulting +nondefection +nondefendant +nondefense +nondefensive +nondeference +nondeferential +nondefiance +nondefilement +nondefining +nondefinition +nondefinitive +nondeforestation +nondegenerate +nondegeneration +nondegerming +nondegradation +nondegreased +nondehiscent +nondeist +nondelegable +nondelegate +nondelegation +nondeleterious +nondeliberate +nondeliberation +nondelineation +nondeliquescent +nondelirious +nondeliverance +nondelivery +nondemand +nondemise +nondemobilization +nondemocratic +nondemonstration +nondendroid +nondenial +nondenominational +nondenominationalism +nondense +nondenumerable +nondenunciation +nondepartmental +nondeparture +nondependence +nondependent +nondepletion +nondeportation +nondeported +nondeposition +nondepositor +nondepravity +nondepreciating +nondepressed +nondepression +nondeprivable +nonderivable +nonderivative +nonderogatory +nondescript +nondesecration +nondesignate +nondesigned +nondesire +nondesirous +nondesisting +nondespotic +nondesquamative +nondestructive +nondesulphurized +nondetachable +nondetailed +nondetention +nondetermination +nondeterminist +nondeterrent +nondetest +nondetonating +nondetrimental +nondevelopable +nondevelopment +nondeviation +nondevotional +nondexterous +nondiabetic +nondiabolic +nondiagnosis +nondiagonal +nondiagrammatic +nondialectal +nondialectical +nondialyzing +nondiametral +nondiastatic +nondiathermanous +nondiazotizable +nondichogamous +nondichogamy +nondichotomous +nondictation +nondictatorial +nondictionary +nondidactic +nondieting +nondifferentation +nondifferentiable +nondiffractive +nondiffusing +nondigestion +nondilatable +nondilution +nondiocesan +nondiphtheritic +nondiphthongal +nondiplomatic +nondipterous +nondirection +nondirectional +nondisagreement +nondisappearing +nondisarmament +nondisbursed +nondiscernment +nondischarging +nondisciplinary +nondisclaim +nondisclosure +nondiscontinuance +nondiscordant +nondiscountable +nondiscovery +nondiscretionary +nondiscrimination +nondiscriminatory +nondiscussion +nondisestablishment +nondisfigurement +nondisfranchised +nondisingenuous +nondisintegration +nondisinterested +nondisjunct +nondisjunction +nondisjunctional +nondisjunctive +nondismemberment +nondismissal +nondisparaging +nondisparate +nondispensation +nondispersal +nondispersion +nondisposal +nondisqualifying +nondissenting +nondissolution +nondistant +nondistinctive +nondistortion +nondistribution +nondistributive +nondisturbance +nondivergence +nondivergent +nondiversification +nondivinity +nondivisible +nondivisiblity +nondivision +nondivisional +nondivorce +nondo +nondoctrinal +nondocumentary +nondogmatic +nondoing +nondomestic +nondomesticated +nondominant +nondonation +nondramatic +nondrinking +nondropsical +nondrying +nonduality +nondumping +nonduplication +nondutiable +nondynastic +nondyspeptic +none +nonearning +noneastern +noneatable +nonecclesiastical +nonechoic +noneclectic +noneclipsing +nonecompense +noneconomic +nonedible +noneditor +noneditorial +noneducable +noneducation +noneducational +noneffective +noneffervescent +noneffete +nonefficacious +nonefficacy +nonefficiency +nonefficient +noneffusion +nonego +nonegoistical +nonejection +nonelastic +nonelasticity +nonelect +nonelection +nonelective +nonelector +nonelectric +nonelectrical +nonelectrification +nonelectrified +nonelectrized +nonelectrocution +nonelectrolyte +noneleemosynary +nonelemental +nonelementary +nonelimination +nonelopement +nonemanating +nonemancipation +nonembarkation +nonembellishment +nonembezzlement +nonembryonic +nonemendation +nonemergent +nonemigration +nonemission +nonemotional +nonemphatic +nonemphatical +nonempirical +nonemploying +nonemployment +nonemulative +nonenactment +nonenclosure +nonencroachment +nonencyclopedic +nonendemic +nonendorsement +nonenduring +nonene +nonenemy +nonenergic +nonenforceability +nonenforceable +nonenforcement +nonengagement +nonengineering +nonenrolled +nonent +nonentailed +nonenteric +nonentertainment +nonentitative +nonentitive +nonentitize +nonentity +nonentityism +nonentomological +nonentrant +nonentres +nonentry +nonenumerated +nonenunciation +nonenvious +nonenzymic +nonephemeral +nonepic +nonepicurean +nonepileptic +nonepiscopal +nonepiscopalian +nonepithelial +nonepochal +nonequal +nonequation +nonequatorial +nonequestrian +nonequilateral +nonequilibrium +nonequivalent +nonequivocating +nonerasure +nonerecting +nonerection +nonerotic +nonerroneous +nonerudite +noneruption +nones +nonescape +nonespionage +nonespousal +nonessential +nonesthetic +nonesuch +nonet +noneternal +noneternity +nonetheless +nonethereal +nonethical +nonethnological +nonethyl +noneugenic +noneuphonious +nonevacuation +nonevanescent +nonevangelical +nonevaporation +nonevasion +nonevasive +noneviction +nonevident +nonevidential +nonevil +nonevolutionary +nonevolutionist +nonevolving +nonexaction +nonexaggeration +nonexamination +nonexcavation +nonexcepted +nonexcerptible +nonexcessive +nonexchangeability +nonexchangeable +nonexciting +nonexclamatory +nonexclusion +nonexclusive +nonexcommunicable +nonexculpation +nonexcusable +nonexecution +nonexecutive +nonexemplary +nonexemplificatior +nonexempt +nonexercise +nonexertion +nonexhibition +nonexistence +nonexistent +nonexistential +nonexisting +nonexoneration +nonexotic +nonexpansion +nonexpansive +nonexpansively +nonexpectation +nonexpendable +nonexperience +nonexperienced +nonexperimental +nonexpert +nonexpiation +nonexpiry +nonexploitation +nonexplosive +nonexportable +nonexportation +nonexposure +nonexpulsion +nonextant +nonextempore +nonextended +nonextensile +nonextension +nonextensional +nonextensive +nonextenuatory +nonexteriority +nonextermination +nonexternal +nonexternality +nonextinction +nonextortion +nonextracted +nonextraction +nonextraditable +nonextradition +nonextraneous +nonextreme +nonextrication +nonextrinsic +nonexuding +nonexultation +nonfabulous +nonfacetious +nonfacial +nonfacility +nonfacing +nonfact +nonfactious +nonfactory +nonfactual +nonfacultative +nonfaculty +nonfaddist +nonfading +nonfailure +nonfalse +nonfamily +nonfamous +nonfanatical +nonfanciful +nonfarm +nonfastidious +nonfat +nonfatal +nonfatalistic +nonfatty +nonfavorite +nonfeasance +nonfeasor +nonfeatured +nonfebrile +nonfederal +nonfederated +nonfeldspathic +nonfelonious +nonfelony +nonfenestrated +nonfermentability +nonfermentable +nonfermentation +nonfermentative +nonferrous +nonfertile +nonfertility +nonfestive +nonfeudal +nonfibrous +nonfiction +nonfictional +nonfiduciary +nonfighter +nonfigurative +nonfilamentous +nonfimbriate +nonfinancial +nonfinding +nonfinishing +nonfinite +nonfireproof +nonfiscal +nonfisherman +nonfissile +nonfixation +nonflaky +nonflammable +nonfloatation +nonfloating +nonfloriferous +nonflowering +nonflowing +nonfluctuating +nonfluid +nonfluorescent +nonflying +nonfocal +nonfood +nonforeclosure +nonforeign +nonforeknowledge +nonforest +nonforested +nonforfeitable +nonforfeiting +nonforfeiture +nonform +nonformal +nonformation +nonformulation +nonfortification +nonfortuitous +nonfossiliferous +nonfouling +nonfrat +nonfraternity +nonfrauder +nonfraudulent +nonfreedom +nonfreeman +nonfreezable +nonfreeze +nonfreezing +nonfricative +nonfriction +nonfrosted +nonfruition +nonfrustration +nonfulfillment +nonfunctional +nonfundable +nonfundamental +nonfungible +nonfuroid +nonfusion +nonfuturition +nonfuturity +nongalactic +nongalvanized +nonganglionic +nongas +nongaseous +nongassy +nongelatinizing +nongelatinous +nongenealogical +nongenerative +nongenetic +nongentile +nongeographical +nongeological +nongeometrical +nongermination +nongerundial +nongildsman +nongipsy +nonglacial +nonglandered +nonglandular +nonglare +nonglucose +nonglucosidal +nonglucosidic +nongod +nongold +nongolfer +nongospel +nongovernmental +nongraduate +nongraduated +nongraduation +nongrain +nongranular +nongraphitic +nongrass +nongratuitous +nongravitation +nongravity +nongray +nongreasy +nongreen +nongregarious +nongremial +nongrey +nongrooming +nonguarantee +nonguard +nonguttural +nongymnast +nongypsy +nonhabitable +nonhabitual +nonhalation +nonhallucination +nonhandicap +nonhardenable +nonharmonic +nonharmonious +nonhazardous +nonheading +nonhearer +nonheathen +nonhedonistic +nonhepatic +nonhereditarily +nonhereditary +nonheritable +nonheritor +nonhero +nonhieratic +nonhistoric +nonhistorical +nonhomaloidal +nonhomogeneity +nonhomogeneous +nonhomogenous +nonhostile +nonhouseholder +nonhousekeeping +nonhuman +nonhumanist +nonhumorous +nonhumus +nonhunting +nonhydrogenous +nonhydrolyzable +nonhygrometric +nonhygroscopic +nonhypostatic +nonic +noniconoclastic +nonideal +nonidealist +nonidentical +nonidentity +nonidiomatic +nonidolatrous +nonidyllic +nonignitible +nonignominious +nonignorant +nonillion +nonillionth +nonillumination +nonillustration +nonimaginary +nonimbricating +nonimitative +nonimmateriality +nonimmersion +nonimmigrant +nonimmigration +nonimmune +nonimmunity +nonimmunized +nonimpact +nonimpairment +nonimpartment +nonimpatience +nonimpeachment +nonimperative +nonimperial +nonimplement +nonimportation +nonimporting +nonimposition +nonimpregnated +nonimpressionist +nonimprovement +nonimputation +nonincandescent +nonincarnated +nonincitement +noninclination +noninclusion +noninclusive +nonincrease +nonincreasing +nonincrusting +nonindependent +nonindictable +nonindictment +nonindividual +nonindividualistic +noninductive +noninductively +noninductivity +nonindurated +nonindustrial +noninfallibilist +noninfallible +noninfantry +noninfected +noninfection +noninfectious +noninfinite +noninfinitely +noninflammability +noninflammable +noninflammatory +noninflectional +noninfluence +noninformative +noninfraction +noninhabitant +noninheritable +noninherited +noninitial +noninjurious +noninjury +noninoculation +noninquiring +noninsect +noninsertion +noninstitution +noninstruction +noninstructional +noninstructress +noninstrumental +noninsurance +nonintegrable +nonintegrity +nonintellectual +nonintelligence +nonintelligent +nonintent +nonintention +noninterchangeability +noninterchangeable +nonintercourse +noninterference +noninterferer +noninterfering +nonintermittent +noninternational +noninterpolation +noninterposition +noninterrupted +nonintersecting +nonintersector +nonintervention +noninterventionalist +noninterventionist +nonintoxicant +nonintoxicating +nonintrospective +nonintrospectively +nonintrusion +nonintrusionism +nonintrusionist +nonintuitive +noninverted +noninvidious +noninvincibility +noniodized +nonion +nonionized +nonionizing +nonirate +nonirradiated +nonirrational +nonirreparable +nonirrevocable +nonirrigable +nonirrigated +nonirrigating +nonirrigation +nonirritable +nonirritant +nonirritating +nonisobaric +nonisotropic +nonissuable +nonius +nonjoinder +nonjudicial +nonjurable +nonjurant +nonjuress +nonjuring +nonjurist +nonjuristic +nonjuror +nonjurorism +nonjury +nonjurying +nonknowledge +nonkosher +nonlabeling +nonlactescent +nonlaminated +nonlanguage +nonlaying +nonleaded +nonleaking +nonlegal +nonlegato +nonlegume +nonlepidopterous +nonleprous +nonlevel +nonlevulose +nonliability +nonliable +nonliberation +nonlicensed +nonlicentiate +nonlicet +nonlicking +nonlife +nonlimitation +nonlimiting +nonlinear +nonlipoidal +nonliquefying +nonliquid +nonliquidating +nonliquidation +nonlister +nonlisting +nonliterary +nonlitigious +nonliturgical +nonliving +nonlixiviated +nonlocal +nonlocalized +nonlogical +nonlosable +nonloser +nonlover +nonloving +nonloxodromic +nonluminescent +nonluminosity +nonluminous +nonluster +nonlustrous +nonly +nonmagnetic +nonmagnetizable +nonmaintenance +nonmajority +nonmalarious +nonmalicious +nonmalignant +nonmalleable +nonmammalian +nonmandatory +nonmanifest +nonmanifestation +nonmanila +nonmannite +nonmanual +nonmanufacture +nonmanufactured +nonmanufacturing +nonmarine +nonmarital +nonmaritime +nonmarket +nonmarriage +nonmarriageable +nonmarrying +nonmartial +nonmastery +nonmaterial +nonmaterialistic +nonmateriality +nonmaternal +nonmathematical +nonmathematician +nonmatrimonial +nonmatter +nonmechanical +nonmechanistic +nonmedical +nonmedicinal +nonmedullated +nonmelodious +nonmember +nonmembership +nonmenial +nonmental +nonmercantile +nonmetal +nonmetallic +nonmetalliferous +nonmetallurgical +nonmetamorphic +nonmetaphysical +nonmeteoric +nonmeteorological +nonmetric +nonmetrical +nonmetropolitan +nonmicrobic +nonmicroscopical +nonmigratory +nonmilitant +nonmilitary +nonmillionaire +nonmimetic +nonmineral +nonmineralogical +nonminimal +nonministerial +nonministration +nonmiraculous +nonmischievous +nonmiscible +nonmissionary +nonmobile +nonmodal +nonmodern +nonmolar +nonmolecular +nonmomentary +nonmonarchical +nonmonarchist +nonmonastic +nonmonist +nonmonogamous +nonmonotheistic +nonmorainic +nonmoral +nonmorality +nonmortal +nonmotile +nonmotoring +nonmotorist +nonmountainous +nonmucilaginous +nonmucous +nonmulched +nonmultiple +nonmunicipal +nonmuscular +nonmusical +nonmussable +nonmutationally +nonmutative +nonmutual +nonmystical +nonmythical +nonmythological +nonnant +nonnarcotic +nonnasal +nonnat +nonnational +nonnative +nonnatural +nonnaturalism +nonnaturalistic +nonnaturality +nonnaturalness +nonnautical +nonnaval +nonnavigable +nonnavigation +nonnebular +nonnecessary +nonnecessity +nonnegligible +nonnegotiable +nonnegotiation +nonnephritic +nonnervous +nonnescience +nonnescient +nonneutral +nonneutrality +nonnitrogenized +nonnitrogenous +nonnoble +nonnomination +nonnotification +nonnotional +nonnucleated +nonnumeral +nonnutrient +nonnutritious +nonnutritive +nonobedience +nonobedient +nonobjection +nonobjective +nonobligatory +nonobservable +nonobservance +nonobservant +nonobservation +nonobstetrical +nonobstructive +nonobvious +nonoccidental +nonocculting +nonoccupant +nonoccupation +nonoccupational +nonoccurrence +nonodorous +nonoecumenic +nonoffender +nonoffensive +nonofficeholding +nonofficial +nonofficially +nonofficinal +nonoic +nonoily +nonolfactory +nonomad +nononerous +nonopacity +nonopening +nonoperating +nonoperative +nonopposition +nonoppressive +nonoptical +nonoptimistic +nonoptional +nonorchestral +nonordination +nonorganic +nonorganization +nonoriental +nonoriginal +nonornamental +nonorthodox +nonorthographical +nonoscine +nonostentation +nonoutlawry +nonoutrage +nonoverhead +nonoverlapping +nonowner +nonoxidating +nonoxidizable +nonoxidizing +nonoxygenated +nonoxygenous +nonpacific +nonpacification +nonpacifist +nonpagan +nonpaid +nonpainter +nonpalatal +nonpapal +nonpapist +nonpar +nonparallel +nonparalytic +nonparasitic +nonparasitism +nonpareil +nonparent +nonparental +nonpariello +nonparishioner +nonparliamentary +nonparlor +nonparochial +nonparous +nonpartial +nonpartiality +nonparticipant +nonparticipating +nonparticipation +nonpartisan +nonpartisanship +nonpartner +nonparty +nonpassenger +nonpasserine +nonpastoral +nonpatentable +nonpatented +nonpaternal +nonpathogenic +nonpause +nonpaying +nonpayment +nonpeak +nonpeaked +nonpearlitic +nonpecuniary +nonpedestrian +nonpedigree +nonpelagic +nonpeltast +nonpenal +nonpenalized +nonpending +nonpensionable +nonpensioner +nonperception +nonperceptual +nonperfection +nonperforated +nonperforating +nonperformance +nonperformer +nonperforming +nonperiodic +nonperiodical +nonperishable +nonperishing +nonperjury +nonpermanent +nonpermeability +nonpermeable +nonpermissible +nonpermission +nonperpendicular +nonperpetual +nonperpetuity +nonpersecution +nonperseverance +nonpersistence +nonpersistent +nonperson +nonpersonal +nonpersonification +nonpertinent +nonperversive +nonphagocytic +nonpharmaceutical +nonphenolic +nonphenomenal +nonphilanthropic +nonphilological +nonphilosophical +nonphilosophy +nonphonetic +nonphosphatic +nonphosphorized +nonphotobiotic +nonphysical +nonphysiological +nonpickable +nonpigmented +nonplacental +nonplacet +nonplanar +nonplane +nonplanetary +nonplantowning +nonplastic +nonplate +nonplausible +nonpleading +nonplus +nonplusation +nonplushed +nonplutocratic +nonpoet +nonpoetic +nonpoisonous +nonpolar +nonpolarizable +nonpolarizing +nonpolitical +nonponderosity +nonponderous +nonpopery +nonpopular +nonpopularity +nonporous +nonporphyritic +nonport +nonportability +nonportable +nonportrayal +nonpositive +nonpossession +nonposthumous +nonpostponement +nonpotential +nonpower +nonpractical +nonpractice +nonpraedial +nonpreaching +nonprecious +nonprecipitation +nonpredatory +nonpredestination +nonpredicative +nonpredictable +nonpreference +nonpreferential +nonpreformed +nonpregnant +nonprehensile +nonprejudicial +nonprelatical +nonpremium +nonpreparation +nonprepayment +nonprepositional +nonpresbyter +nonprescribed +nonprescriptive +nonpresence +nonpresentation +nonpreservation +nonpresidential +nonpress +nonpressure +nonprevalence +nonprevalent +nonpriestly +nonprimitive +nonprincipiate +nonprincipled +nonprobable +nonprocreation +nonprocurement +nonproducer +nonproducing +nonproduction +nonproductive +nonproductively +nonproductiveness +nonprofane +nonprofessed +nonprofession +nonprofessional +nonprofessionalism +nonprofessorial +nonproficience +nonproficiency +nonproficient +nonprofit +nonprofiteering +nonprognostication +nonprogressive +nonprohibitable +nonprohibition +nonprohibitive +nonprojection +nonprojective +nonprojectively +nonproletarian +nonproliferous +nonprolific +nonprolongation +nonpromiscuous +nonpromissory +nonpromotion +nonpromulgation +nonpronunciation +nonpropagandistic +nonpropagation +nonprophetic +nonpropitiation +nonproportional +nonproprietary +nonproprietor +nonprorogation +nonproscriptive +nonprosecution +nonprospect +nonprotection +nonprotective +nonproteid +nonprotein +nonprotestation +nonprotractile +nonprotractility +nonproven +nonprovided +nonprovidential +nonprovocation +nonpsychic +nonpsychological +nonpublic +nonpublication +nonpublicity +nonpueblo +nonpulmonary +nonpulsating +nonpumpable +nonpunctual +nonpunctuation +nonpuncturable +nonpunishable +nonpunishing +nonpunishment +nonpurchase +nonpurchaser +nonpurgative +nonpurification +nonpurposive +nonpursuit +nonpurulent +nonpurveyance +nonputrescent +nonputrescible +nonputting +nonpyogenic +nonpyritiferous +nonqualification +nonquality +nonquota +nonracial +nonradiable +nonradiating +nonradical +nonrailroader +nonranging +nonratability +nonratable +nonrated +nonratifying +nonrational +nonrationalist +nonrationalized +nonrayed +nonreaction +nonreactive +nonreactor +nonreader +nonreading +nonrealistic +nonreality +nonrealization +nonreasonable +nonreasoner +nonrebel +nonrebellious +nonreceipt +nonreceiving +nonrecent +nonreception +nonrecess +nonrecipient +nonreciprocal +nonreciprocating +nonreciprocity +nonrecital +nonreclamation +nonrecluse +nonrecognition +nonrecognized +nonrecoil +nonrecollection +nonrecommendation +nonreconciliation +nonrecourse +nonrecoverable +nonrecovery +nonrectangular +nonrectified +nonrecuperation +nonrecurrent +nonrecurring +nonredemption +nonredressing +nonreducing +nonreference +nonrefillable +nonreflector +nonreformation +nonrefraction +nonrefrigerant +nonrefueling +nonrefutation +nonregardance +nonregarding +nonregenerating +nonregenerative +nonregent +nonregimented +nonregistered +nonregistrability +nonregistrable +nonregistration +nonregression +nonregulation +nonrehabilitation +nonreigning +nonreimbursement +nonreinforcement +nonreinstatement +nonrejection +nonrejoinder +nonrelapsed +nonrelation +nonrelative +nonrelaxation +nonrelease +nonreliance +nonreligion +nonreligious +nonreligiousness +nonrelinquishment +nonremanie +nonremedy +nonremembrance +nonremission +nonremonstrance +nonremuneration +nonremunerative +nonrendition +nonrenewable +nonrenewal +nonrenouncing +nonrenunciation +nonrepair +nonreparation +nonrepayable +nonrepealing +nonrepeat +nonrepeater +nonrepentance +nonrepetition +nonreplacement +nonreplicate +nonreportable +nonreprehensible +nonrepresentation +nonrepresentational +nonrepresentationalism +nonrepresentative +nonrepression +nonreprisal +nonreproduction +nonreproductive +nonrepublican +nonrepudiation +nonrequirement +nonrequisition +nonrequital +nonrescue +nonresemblance +nonreservation +nonreserve +nonresidence +nonresidency +nonresident +nonresidental +nonresidenter +nonresidential +nonresidentiary +nonresidentor +nonresidual +nonresignation +nonresinifiable +nonresistance +nonresistant +nonresisting +nonresistive +nonresolvability +nonresolvable +nonresonant +nonrespectable +nonrespirable +nonresponsibility +nonrestitution +nonrestraint +nonrestricted +nonrestriction +nonrestrictive +nonresumption +nonresurrection +nonresuscitation +nonretaliation +nonretention +nonretentive +nonreticence +nonretinal +nonretirement +nonretiring +nonretraceable +nonretractation +nonretractile +nonretraction +nonretrenchment +nonretroactive +nonreturn +nonreturnable +nonrevaluation +nonrevealing +nonrevelation +nonrevenge +nonrevenue +nonreverse +nonreversed +nonreversible +nonreversing +nonreversion +nonrevertible +nonreviewable +nonrevision +nonrevival +nonrevocation +nonrevolting +nonrevolutionary +nonrevolving +nonrhetorical +nonrhymed +nonrhyming +nonrhythmic +nonriding +nonrigid +nonrioter +nonriparian +nonritualistic +nonrival +nonromantic +nonrotatable +nonrotating +nonrotative +nonround +nonroutine +nonroyal +nonroyalist +nonrubber +nonruminant +Nonruminantia +nonrun +nonrupture +nonrural +nonrustable +nonsabbatic +nonsaccharine +nonsacerdotal +nonsacramental +nonsacred +nonsacrifice +nonsacrificial +nonsailor +nonsalable +nonsalaried +nonsale +nonsaline +nonsalutary +nonsalutation +nonsalvation +nonsanctification +nonsanction +nonsanctity +nonsane +nonsanguine +nonsanity +nonsaponifiable +nonsatisfaction +nonsaturated +nonsaturation +nonsaving +nonsawing +nonscalding +nonscaling +nonscandalous +nonschematized +nonschismatic +nonscholastic +nonscience +nonscientific +nonscientist +nonscoring +nonscraping +nonscriptural +nonscripturalist +nonscrutiny +nonseasonal +nonsecession +nonseclusion +nonsecrecy +nonsecret +nonsecretarial +nonsecretion +nonsecretive +nonsecretory +nonsectarian +nonsectional +nonsectorial +nonsecular +nonsecurity +nonsedentary +nonseditious +nonsegmented +nonsegregation +nonseizure +nonselected +nonselection +nonselective +nonself +nonselfregarding +nonselling +nonsenatorial +nonsense +nonsensible +nonsensical +nonsensicality +nonsensically +nonsensicalness +nonsensification +nonsensify +nonsensitive +nonsensitiveness +nonsensitized +nonsensorial +nonsensuous +nonsentence +nonsentient +nonseparation +nonseptate +nonseptic +nonsequacious +nonsequaciousness +nonsequestration +nonserial +nonserif +nonserious +nonserous +nonserviential +nonservile +nonsetter +nonsetting +nonsettlement +nonsexual +nonsexually +nonshaft +nonsharing +nonshatter +nonshedder +nonshipper +nonshipping +nonshredding +nonshrinkable +nonshrinking +nonsiccative +nonsidereal +nonsignatory +nonsignature +nonsignificance +nonsignificant +nonsignification +nonsignificative +nonsilicated +nonsiliceous +nonsilver +nonsimplification +nonsine +nonsinging +nonsingular +nonsinkable +nonsinusoidal +nonsiphonage +nonsister +nonsitter +nonsitting +nonskeptical +nonskid +nonskidding +nonskipping +nonslaveholding +nonslip +nonslippery +nonslipping +nonsludging +nonsmoker +nonsmoking +nonsmutting +nonsocial +nonsocialist +nonsocialistic +nonsociety +nonsociological +nonsolar +nonsoldier +nonsolicitation +nonsolid +nonsolidified +nonsolution +nonsolvency +nonsolvent +nonsonant +nonsovereign +nonspalling +nonsparing +nonsparking +nonspeaker +nonspeaking +nonspecial +nonspecialist +nonspecialized +nonspecie +nonspecific +nonspecification +nonspecificity +nonspecified +nonspectacular +nonspectral +nonspeculation +nonspeculative +nonspherical +nonspill +nonspillable +nonspinning +nonspinose +nonspiny +nonspiral +nonspirit +nonspiritual +nonspirituous +nonspontaneous +nonspored +nonsporeformer +nonsporeforming +nonsporting +nonspottable +nonsprouting +nonstainable +nonstaining +nonstampable +nonstandard +nonstandardized +nonstanzaic +nonstaple +nonstarch +nonstarter +nonstarting +nonstatement +nonstatic +nonstationary +nonstatistical +nonstatutory +nonstellar +nonsticky +nonstimulant +nonstipulation +nonstock +nonstooping +nonstop +nonstrategic +nonstress +nonstretchable +nonstretchy +nonstriated +nonstriker +nonstriking +nonstriped +nonstructural +nonstudent +nonstudious +nonstylized +nonsubject +nonsubjective +nonsubmission +nonsubmissive +nonsubordination +nonsubscriber +nonsubscribing +nonsubscription +nonsubsiding +nonsubsidy +nonsubsistence +nonsubstantial +nonsubstantialism +nonsubstantialist +nonsubstantiality +nonsubstantiation +nonsubstantive +nonsubstitution +nonsubtraction +nonsuccess +nonsuccessful +nonsuccession +nonsuccessive +nonsuccour +nonsuction +nonsuctorial +nonsufferance +nonsuffrage +nonsugar +nonsuggestion +nonsuit +nonsulphurous +nonsummons +nonsupplication +nonsupport +nonsupporter +nonsupporting +nonsuppositional +nonsuppressed +nonsuppression +nonsuppurative +nonsurface +nonsurgical +nonsurrender +nonsurvival +nonsurvivor +nonsuspect +nonsustaining +nonsustenance +nonswearer +nonswearing +nonsweating +nonswimmer +nonswimming +nonsyllabic +nonsyllabicness +nonsyllogistic +nonsyllogizing +nonsymbiotic +nonsymbiotically +nonsymbolic +nonsymmetrical +nonsympathetic +nonsympathizer +nonsympathy +nonsymphonic +nonsymptomatic +nonsynchronous +nonsyndicate +nonsynodic +nonsynonymous +nonsyntactic +nonsyntactical +nonsynthesized +nonsyntonic +nonsystematic +nontabular +nontactical +nontan +nontangential +nontannic +nontannin +nontariff +nontarnishable +nontarnishing +nontautomeric +nontautomerizable +nontax +nontaxability +nontaxable +nontaxonomic +nonteachable +nonteacher +nonteaching +nontechnical +nontechnological +nonteetotaler +nontelegraphic +nonteleological +nontelephonic +nontemporal +nontemporizing +nontenant +nontenure +nontenurial +nonterm +nonterminating +nonterrestrial +nonterritorial +nonterritoriality +nontestamentary +nontextual +nontheatrical +nontheistic +nonthematic +nontheological +nontheosophical +nontherapeutic +nonthinker +nonthinking +nonthoracic +nonthoroughfare +nonthreaded +nontidal +nontillable +nontimbered +nontitaniferous +nontitular +nontolerated +nontopographical +nontourist +nontoxic +nontraction +nontrade +nontrader +nontrading +nontraditional +nontragic +nontrailing +nontransferability +nontransferable +nontransgression +nontransient +nontransitional +nontranslocation +nontransmission +nontransparency +nontransparent +nontransportation +nontransposing +nontransposition +nontraveler +nontraveling +nontreasonable +nontreated +nontreatment +nontreaty +nontrespass +nontrial +nontribal +nontribesman +nontributary +nontrier +nontrigonometrical +nontronite +nontropical +nontrunked +nontruth +nontuberculous +nontuned +nonturbinated +nontutorial +nontyphoidal +nontypical +nontypicalness +nontypographical +nontyrannical +nonubiquitous +nonulcerous +nonultrafilterable +nonumbilical +nonumbilicate +nonumbrellaed +nonunanimous +nonuncial +nonundergraduate +nonunderstandable +nonunderstanding +nonunderstandingly +nonunderstood +nonundulatory +nonuniform +nonuniformist +nonuniformitarian +nonuniformity +nonuniformly +nonunion +nonunionism +nonunionist +nonunique +nonunison +nonunited +nonuniversal +nonuniversity +nonupholstered +nonuple +nonuplet +nonupright +nonurban +nonurgent +nonusage +nonuse +nonuser +nonusing +nonusurping +nonuterine +nonutile +nonutilitarian +nonutility +nonutilized +nonutterance +nonvacant +nonvaccination +nonvacuous +nonvaginal +nonvalent +nonvalidity +nonvaluation +nonvalve +nonvanishing +nonvariable +nonvariant +nonvariation +nonvascular +nonvassal +nonvegetative +nonvenereal +nonvenomous +nonvenous +nonventilation +nonverbal +nonverdict +nonverminous +nonvernacular +nonvertebral +nonvertical +nonvertically +nonvesicular +nonvesting +nonvesture +nonveteran +nonveterinary +nonviable +nonvibratile +nonvibration +nonvibrator +nonvibratory +nonvicarious +nonvictory +nonvillager +nonvillainous +nonvindication +nonvinous +nonvintage +nonviolation +nonviolence +nonvirginal +nonvirile +nonvirtue +nonvirtuous +nonvirulent +nonviruliferous +nonvisaed +nonvisceral +nonviscid +nonviscous +nonvisional +nonvisitation +nonvisiting +nonvisual +nonvisualized +nonvital +nonvitreous +nonvitrified +nonviviparous +nonvocal +nonvocalic +nonvocational +nonvolant +nonvolatile +nonvolatilized +nonvolcanic +nonvolition +nonvoluntary +nonvortical +nonvortically +nonvoter +nonvoting +nonvulcanizable +nonvulvar +nonwalking +nonwar +nonwasting +nonwatertight +nonweakness +nonwestern +nonwetted +nonwhite +nonwinged +nonwoody +nonworker +nonworking +nonworship +nonwrinkleable +nonya +nonyielding +nonyl +nonylene +nonylenic +nonylic +nonzealous +nonzero +nonzodiacal +nonzonal +nonzonate +nonzoological +noodle +noodledom +noodleism +nook +nooked +nookery +nooking +nooklet +nooklike +nooky +noological +noologist +noology +noometry +noon +noonday +noonflower +nooning +noonlight +noonlit +noonstead +noontide +noontime +noonwards +noop +nooscopic +noose +nooser +Nootka +nopal +Nopalea +nopalry +nope +nopinene +nor +Nora +Norah +norard +norate +noration +norbergite +Norbert +Norbertine +norcamphane +nordcaper +nordenskioldine +Nordic +Nordicism +Nordicist +Nordicity +Nordicization +Nordicize +nordmarkite +noreast +noreaster +norelin +Norfolk +Norfolkian +norgine +nori +noria +Noric +norie +norimon +norite +norland +norlander +norlandism +norleucine +Norm +norm +Norma +norma +normal +normalcy +normalism +normalist +normality +normalization +normalize +normalizer +normally +normalness +Norman +Normanesque +Normanish +Normanism +Normanist +Normanization +Normanize +Normanizer +Normanly +Normannic +normated +normative +normatively +normativeness +normless +normoblast +normoblastic +normocyte +normocytic +normotensive +Norn +Norna +nornicotine +nornorwest +noropianic +norpinic +Norridgewock +Norroway +Norroy +Norse +norsel +Norseland +norseler +Norseman +Norsk +north +northbound +northeast +northeaster +northeasterly +northeastern +northeasternmost +northeastward +northeastwardly +northeastwards +norther +northerliness +northerly +northern +northerner +northernize +northernly +northernmost +northernness +northest +northfieldite +northing +northland +northlander +northlight +Northman +northmost +northness +Northumber +Northumbrian +northupite +northward +northwardly +northwards +northwest +northwester +northwesterly +northwestern +northwestward +northwestwardly +northwestwards +Norumbega +norward +norwards +Norway +Norwegian +norwest +norwester +norwestward +Nosairi +Nosairian +nosarian +nose +nosean +noseanite +noseband +nosebanded +nosebleed +nosebone +noseburn +nosed +nosegay +nosegaylike +noseherb +nosehole +noseless +noselessly +noselessness +noselike +noselite +Nosema +Nosematidae +nosepiece +nosepinch +noser +nosesmart +nosethirl +nosetiology +nosewards +nosewheel +nosewise +nosey +nosine +nosing +nosism +nosocomial +nosocomium +nosogenesis +nosogenetic +nosogenic +nosogeny +nosogeography +nosographer +nosographic +nosographical +nosographically +nosography +nosohaemia +nosohemia +nosological +nosologically +nosologist +nosology +nosomania +nosomycosis +nosonomy +nosophobia +nosophyte +nosopoetic +nosopoietic +nosotaxy +nosotrophy +nostalgia +nostalgic +nostalgically +nostalgy +nostic +Nostoc +Nostocaceae +nostocaceous +nostochine +nostologic +nostology +nostomania +Nostradamus +nostrificate +nostrification +nostril +nostriled +nostrility +nostrilsome +nostrum +nostrummonger +nostrummongership +nostrummongery +Nosu +nosy +not +notabilia +notability +notable +notableness +notably +notacanthid +Notacanthidae +notacanthoid +notacanthous +Notacanthus +notaeal +notaeum +notal +notalgia +notalgic +Notalia +notan +notandum +notanencephalia +notarial +notarially +notariate +notarikon +notarize +notary +notaryship +notate +notation +notational +notative +notator +notch +notchboard +notched +notchel +notcher +notchful +notching +notchweed +notchwing +notchy +note +notebook +notecase +noted +notedly +notedness +notehead +noteholder +notekin +Notelaea +noteless +notelessly +notelessness +notelet +notencephalocele +notencephalus +noter +notewise +noteworthily +noteworthiness +noteworthy +notharctid +Notharctidae +Notharctus +nother +nothing +nothingarian +nothingarianism +nothingism +nothingist +nothingize +nothingless +nothingly +nothingness +nothingology +Nothofagus +Notholaena +nothosaur +Nothosauri +nothosaurian +Nothosauridae +Nothosaurus +nothous +notice +noticeability +noticeable +noticeably +noticer +Notidani +notidanian +notidanid +Notidanidae +notidanidan +notidanoid +Notidanus +notifiable +notification +notified +notifier +notify +notifyee +notion +notionable +notional +notionalist +notionality +notionally +notionalness +notionary +notionate +notioned +notionist +notionless +Notiosorex +notitia +Notkerian +notocentrous +notocentrum +notochord +notochordal +notodontian +notodontid +Notodontidae +notodontoid +Notogaea +Notogaeal +Notogaean +Notogaeic +notommatid +Notommatidae +Notonecta +notonectal +notonectid +Notonectidae +notopodial +notopodium +notopterid +Notopteridae +notopteroid +Notopterus +notorhizal +Notorhynchus +notoriety +notorious +notoriously +notoriousness +Notornis +Notoryctes +Notostraca +Nototherium +Nototrema +nototribe +notour +notourly +Notropis +notself +Nottoway +notum +Notungulata +notungulate +Notus +notwithstanding +Nou +nougat +nougatine +nought +noumeaite +noumeite +noumenal +noumenalism +noumenalist +noumenality +noumenalize +noumenally +noumenism +noumenon +noun +nounal +nounally +nounize +nounless +noup +nourice +nourish +nourishable +nourisher +nourishing +nourishingly +nourishment +nouriture +nous +nouther +nova +novaculite +novalia +Novanglian +Novanglican +novantique +novarsenobenzene +novate +Novatian +Novatianism +Novatianist +novation +novative +novator +novatory +novatrix +novcic +novel +novelcraft +noveldom +novelese +novelesque +novelet +novelette +noveletter +novelettish +novelettist +noveletty +novelish +novelism +novelist +novelistic +novelistically +novelization +novelize +novella +novelless +novellike +novelly +novelmongering +novelness +novelry +novelty +novelwright +novem +novemarticulate +November +Novemberish +novemcostate +novemdigitate +novemfid +novemlobate +novemnervate +novemperfoliate +novena +novenary +novendial +novene +novennial +novercal +Novial +novice +novicehood +novicelike +noviceship +noviciate +novilunar +novitial +novitiate +novitiateship +novitiation +novity +Novo +Novocain +novodamus +Novorolsky +now +nowaday +nowadays +nowanights +noway +noways +nowed +nowel +nowhat +nowhen +nowhence +nowhere +nowhereness +nowheres +nowhit +nowhither +nowise +nowness +Nowroze +nowt +nowy +noxa +noxal +noxally +noxious +noxiously +noxiousness +noy +noyade +noyau +Nozi +nozzle +nozzler +nth +nu +nuance +nub +Nuba +nubbin +nubble +nubbling +nubbly +nubby +nubecula +nubia +Nubian +nubiferous +nubiform +nubigenous +nubilate +nubilation +nubile +nubility +nubilous +Nubilum +nucal +nucament +nucamentaceous +nucellar +nucellus +nucha +nuchal +nuchalgia +nuciculture +nuciferous +nuciform +nucin +nucivorous +nucleal +nuclear +nucleary +nuclease +nucleate +nucleation +nucleator +nuclei +nucleiferous +nucleiform +nuclein +nucleinase +nucleoalbumin +nucleoalbuminuria +nucleofugal +nucleohistone +nucleohyaloplasm +nucleohyaloplasma +nucleoid +nucleoidioplasma +nucleolar +nucleolated +nucleole +nucleoli +nucleolinus +nucleolocentrosome +nucleoloid +nucleolus +nucleolysis +nucleomicrosome +nucleon +nucleone +nucleonics +nucleopetal +nucleoplasm +nucleoplasmatic +nucleoplasmic +nucleoprotein +nucleoside +nucleotide +nucleus +nuclide +nuclidic +Nucula +Nuculacea +nuculanium +nucule +nuculid +Nuculidae +nuculiform +nuculoid +Nuda +nudate +nudation +Nudd +nuddle +nude +nudely +nudeness +Nudens +nudge +nudger +nudibranch +Nudibranchia +nudibranchian +nudibranchiate +nudicaudate +nudicaul +nudifier +nudiflorous +nudiped +nudish +nudism +nudist +nuditarian +nudity +nugacious +nugaciousness +nugacity +nugator +nugatoriness +nugatory +nuggar +nugget +nuggety +nugify +nugilogue +Nugumiut +nuisance +nuisancer +nuke +Nukuhivan +nul +null +nullable +nullah +nullibicity +nullibility +nullibiquitous +nullibist +nullification +nullificationist +nullificator +nullifidian +nullifier +nullify +nullipara +nulliparity +nulliparous +nullipennate +Nullipennes +nulliplex +nullipore +nulliporous +nullism +nullisome +nullisomic +nullity +nulliverse +nullo +Numa +Numantine +numb +number +numberable +numberer +numberful +numberless +numberous +numbersome +numbfish +numbing +numbingly +numble +numbles +numbly +numbness +numda +numdah +numen +Numenius +numerable +numerableness +numerably +numeral +numerant +numerary +numerate +numeration +numerative +numerator +numerical +numerically +numericalness +numerist +numero +numerology +numerose +numerosity +numerous +numerously +numerousness +Numida +Numidae +Numidian +Numididae +Numidinae +numinism +numinous +numinously +numismatic +numismatical +numismatically +numismatician +numismatics +numismatist +numismatography +numismatologist +numismatology +nummary +nummi +nummiform +nummular +Nummularia +nummulary +nummulated +nummulation +nummuline +Nummulinidae +nummulite +Nummulites +nummulitic +Nummulitidae +nummulitoid +nummuloidal +nummus +numskull +numskulled +numskulledness +numskullery +numskullism +numud +nun +nunatak +nunbird +nunch +nuncheon +nunciate +nunciative +nunciatory +nunciature +nuncio +nuncioship +nuncle +nuncupate +nuncupation +nuncupative +nuncupatively +nundinal +nundination +nundine +nunhood +Nunki +nunky +nunlet +nunlike +nunnari +nunnated +nunnation +nunnery +nunni +nunnify +nunnish +nunnishness +nunship +Nupe +Nuphar +nuptial +nuptiality +nuptialize +nuptially +nuptials +nuque +nuraghe +nurhag +nurly +nursable +nurse +nursedom +nursegirl +nursehound +nursekeeper +nursekin +nurselet +nurselike +nursemaid +nurser +nursery +nurserydom +nurseryful +nurserymaid +nurseryman +nursetender +nursing +nursingly +nursle +nursling +nursy +nurturable +nurtural +nurture +nurtureless +nurturer +nurtureship +Nusairis +Nusakan +nusfiah +nut +nutant +nutarian +nutate +nutation +nutational +nutbreaker +nutcake +nutcrack +nutcracker +nutcrackers +nutcrackery +nutgall +nuthatch +nuthook +nutjobber +nutlet +nutlike +nutmeg +nutmegged +nutmeggy +nutpecker +nutpick +nutramin +nutria +nutrice +nutricial +nutricism +nutrient +nutrify +nutriment +nutrimental +nutritial +nutrition +nutritional +nutritionally +nutritionist +nutritious +nutritiously +nutritiousness +nutritive +nutritively +nutritiveness +nutritory +nutseed +nutshell +Nuttallia +nuttalliasis +nuttalliosis +nutted +nutter +nuttery +nuttily +nuttiness +nutting +nuttish +nuttishness +nutty +nuzzer +nuzzerana +nuzzle +Nyamwezi +Nyanja +nyanza +Nyaya +nychthemer +nychthemeral +nychthemeron +Nyctaginaceae +nyctaginaceous +Nyctaginia +nyctalope +nyctalopia +nyctalopic +nyctalopy +Nyctanthes +Nyctea +Nyctereutes +nycteribiid +Nycteribiidae +Nycteridae +nycterine +Nycteris +Nycticorax +Nyctimene +nyctinastic +nyctinasty +nyctipelagic +Nyctipithecinae +nyctipithecine +Nyctipithecus +nyctitropic +nyctitropism +nyctophobia +nycturia +Nydia +nye +nylast +nylon +nymil +nymph +nympha +nymphae +Nymphaea +Nymphaeaceae +nymphaeaceous +nymphaeum +nymphal +nymphalid +Nymphalidae +Nymphalinae +nymphaline +nympheal +nymphean +nymphet +nymphic +nymphical +nymphid +nymphine +Nymphipara +nymphiparous +nymphish +nymphitis +nymphlike +nymphlin +nymphly +Nymphoides +nympholepsia +nympholepsy +nympholept +nympholeptic +nymphomania +nymphomaniac +nymphomaniacal +Nymphonacea +nymphosis +nymphotomy +nymphwise +Nyoro +Nyroca +Nyssa +Nyssaceae +nystagmic +nystagmus +nyxis +O +o +oadal +oaf +oafdom +oafish +oafishly +oafishness +oak +oakberry +Oakboy +oaken +oakenshaw +Oakesia +oaklet +oaklike +oakling +oaktongue +oakum +oakweb +oakwood +oaky +oam +Oannes +oar +oarage +oarcock +oared +oarfish +oarhole +oarial +oarialgia +oaric +oariocele +oariopathic +oariopathy +oariotomy +oaritic +oaritis +oarium +oarless +oarlike +oarlock +oarlop +oarman +oarsman +oarsmanship +oarswoman +oarweed +oary +oasal +oasean +oases +oasis +oasitic +oast +oasthouse +oat +oatbin +oatcake +oatear +oaten +oatenmeal +oatfowl +oath +oathay +oathed +oathful +oathlet +oathworthy +oatland +oatlike +oatmeal +oatseed +oaty +Obadiah +obambulate +obambulation +obambulatory +oban +Obbenite +obbligato +obclavate +obclude +obcompressed +obconical +obcordate +obcordiform +obcuneate +obdeltoid +obdiplostemonous +obdiplostemony +obdormition +obduction +obduracy +obdurate +obdurately +obdurateness +obduration +obe +obeah +obeahism +obeche +obedience +obediency +obedient +obediential +obedientially +obedientialness +obedientiar +obedientiary +obediently +obeisance +obeisant +obeisantly +obeism +obelia +obeliac +obelial +obelion +obeliscal +obeliscar +obelisk +obeliskoid +obelism +obelize +obelus +Oberon +obese +obesely +obeseness +obesity +obex +obey +obeyable +obeyer +obeyingly +obfuscable +obfuscate +obfuscation +obfuscator +obfuscity +obfuscous +obi +Obidicut +obispo +obit +obitual +obituarian +obituarily +obituarist +obituarize +obituary +object +objectable +objectation +objectative +objectee +objecthood +objectification +objectify +objection +objectionability +objectionable +objectionableness +objectionably +objectional +objectioner +objectionist +objectival +objectivate +objectivation +objective +objectively +objectiveness +objectivism +objectivist +objectivistic +objectivity +objectivize +objectization +objectize +objectless +objectlessly +objectlessness +objector +objicient +objuration +objure +objurgate +objurgation +objurgative +objurgatively +objurgator +objurgatorily +objurgatory +objurgatrix +oblanceolate +oblate +oblately +oblateness +oblation +oblational +oblationary +oblatory +oblectate +oblectation +obley +obligable +obligancy +obligant +obligate +obligation +obligational +obligative +obligativeness +obligator +obligatorily +obligatoriness +obligatory +obligatum +oblige +obliged +obligedly +obligedness +obligee +obligement +obliger +obliging +obligingly +obligingness +obligistic +obligor +obliquangular +obliquate +obliquation +oblique +obliquely +obliqueness +obliquitous +obliquity +obliquus +obliterable +obliterate +obliteration +obliterative +obliterator +oblivescence +oblivial +obliviality +oblivion +oblivionate +oblivionist +oblivionize +oblivious +obliviously +obliviousness +obliviscence +obliviscible +oblocutor +oblong +oblongatal +oblongated +oblongish +oblongitude +oblongitudinal +oblongly +oblongness +obloquial +obloquious +obloquy +obmutescence +obmutescent +obnebulate +obnounce +obnoxiety +obnoxious +obnoxiously +obnoxiousness +obnubilate +obnubilation +obnunciation +oboe +oboist +obol +Obolaria +obolary +obole +obolet +obolus +obomegoid +Obongo +oboval +obovate +obovoid +obpyramidal +obpyriform +Obrazil +obreption +obreptitious +obreptitiously +obrogate +obrogation +obrotund +obscene +obscenely +obsceneness +obscenity +obscurancy +obscurant +obscurantic +obscurantism +obscurantist +obscuration +obscurative +obscure +obscuredly +obscurely +obscurement +obscureness +obscurer +obscurism +obscurist +obscurity +obsecrate +obsecration +obsecrationary +obsecratory +obsede +obsequence +obsequent +obsequial +obsequience +obsequiosity +obsequious +obsequiously +obsequiousness +obsequity +obsequium +obsequy +observability +observable +observableness +observably +observance +observancy +observandum +observant +Observantine +Observantist +observantly +observantness +observation +observational +observationalism +observationally +observative +observatorial +observatory +observe +observedly +observer +observership +observing +observingly +obsess +obsessingly +obsession +obsessional +obsessionist +obsessive +obsessor +obsidian +obsidianite +obsidional +obsidionary +obsidious +obsignate +obsignation +obsignatory +obsolesce +obsolescence +obsolescent +obsolescently +obsolete +obsoletely +obsoleteness +obsoletion +obsoletism +obstacle +obstetric +obstetrical +obstetrically +obstetricate +obstetrication +obstetrician +obstetrics +obstetricy +obstetrist +obstetrix +obstinacious +obstinacy +obstinance +obstinate +obstinately +obstinateness +obstination +obstinative +obstipation +obstreperate +obstreperosity +obstreperous +obstreperously +obstreperousness +obstriction +obstringe +obstruct +obstructant +obstructedly +obstructer +obstructingly +obstruction +obstructionism +obstructionist +obstructive +obstructively +obstructiveness +obstructivism +obstructivity +obstructor +obstruent +obstupefy +obtain +obtainable +obtainal +obtainance +obtainer +obtainment +obtect +obtected +obtemper +obtemperate +obtenebrate +obtenebration +obtention +obtest +obtestation +obtriangular +obtrude +obtruder +obtruncate +obtruncation +obtruncator +obtrusion +obtrusionist +obtrusive +obtrusively +obtrusiveness +obtund +obtundent +obtunder +obtundity +obturate +obturation +obturator +obturatory +obturbinate +obtusangular +obtuse +obtusely +obtuseness +obtusifid +obtusifolious +obtusilingual +obtusilobous +obtusion +obtusipennate +obtusirostrate +obtusish +obtusity +obumbrant +obumbrate +obumbration +obvallate +obvelation +obvention +obverse +obversely +obversion +obvert +obvertend +obviable +obviate +obviation +obviative +obviator +obvious +obviously +obviousness +obvolute +obvoluted +obvolution +obvolutive +obvolve +obvolvent +ocarina +Occamism +Occamist +Occamistic +Occamite +occamy +occasion +occasionable +occasional +occasionalism +occasionalist +occasionalistic +occasionality +occasionally +occasionalness +occasionary +occasioner +occasionless +occasive +occident +occidental +Occidentalism +Occidentalist +occidentality +Occidentalization +Occidentalize +occidentally +occiduous +occipital +occipitalis +occipitally +occipitoanterior +occipitoatlantal +occipitoatloid +occipitoaxial +occipitoaxoid +occipitobasilar +occipitobregmatic +occipitocalcarine +occipitocervical +occipitofacial +occipitofrontal +occipitofrontalis +occipitohyoid +occipitoiliac +occipitomastoid +occipitomental +occipitonasal +occipitonuchal +occipitootic +occipitoparietal +occipitoposterior +occipitoscapular +occipitosphenoid +occipitosphenoidal +occipitotemporal +occipitothalamic +occiput +occitone +occlude +occludent +occlusal +occluse +occlusion +occlusive +occlusiveness +occlusocervical +occlusocervically +occlusogingival +occlusometer +occlusor +occult +occultate +occultation +occulter +occulting +occultism +occultist +occultly +occultness +occupable +occupance +occupancy +occupant +occupation +occupational +occupationalist +occupationally +occupationless +occupative +occupiable +occupier +occupy +occur +occurrence +occurrent +occursive +ocean +oceaned +oceanet +oceanful +Oceanian +oceanic +Oceanican +oceanity +oceanographer +oceanographic +oceanographical +oceanographically +oceanographist +oceanography +oceanology +oceanophyte +oceanside +oceanward +oceanwards +oceanways +oceanwise +ocellar +ocellary +ocellate +ocellated +ocellation +ocelli +ocellicyst +ocellicystic +ocelliferous +ocelliform +ocelligerous +ocellus +oceloid +ocelot +och +ochava +ochavo +ocher +ocherish +ocherous +ochery +ochidore +ochlesis +ochlesitic +ochletic +ochlocracy +ochlocrat +ochlocratic +ochlocratical +ochlocratically +ochlophobia +ochlophobist +Ochna +Ochnaceae +ochnaceous +ochone +Ochotona +Ochotonidae +Ochozoma +ochraceous +Ochrana +ochrea +ochreate +ochreous +ochro +ochrocarpous +ochroid +ochroleucous +ochrolite +Ochroma +ochronosis +ochronosus +ochronotic +ochrous +ocht +Ocimum +ock +oclock +Ocneria +ocote +Ocotea +ocotillo +ocque +ocracy +ocrea +ocreaceous +Ocreatae +ocreate +ocreated +octachloride +octachord +octachordal +octachronous +Octacnemus +octacolic +octactinal +octactine +Octactiniae +octactinian +octad +octadecahydrate +octadecane +octadecanoic +octadecyl +octadic +octadrachm +octaemeron +octaeteric +octaeterid +octagon +octagonal +octagonally +octahedral +octahedric +octahedrical +octahedrite +octahedroid +octahedron +octahedrous +octahydrate +octahydrated +octakishexahedron +octamerism +octamerous +octameter +octan +octanaphthene +Octandria +octandrian +octandrious +octane +octangle +octangular +octangularness +Octans +octant +octantal +octapla +octaploid +octaploidic +octaploidy +octapodic +octapody +octarch +octarchy +octarius +octarticulate +octary +octasemic +octastich +octastichon +octastrophic +octastyle +octastylos +octateuch +octaval +octavalent +octavarium +octave +Octavia +Octavian +octavic +octavina +Octavius +octavo +octenary +octene +octennial +octennially +octet +octic +octillion +octillionth +octine +octingentenary +octoad +octoalloy +octoate +octobass +October +octobrachiate +Octobrist +octocentenary +octocentennial +octochord +Octocoralla +octocorallan +Octocorallia +octocoralline +octocotyloid +octodactyl +octodactyle +octodactylous +octodecimal +octodecimo +octodentate +octodianome +Octodon +octodont +Octodontidae +Octodontinae +octoechos +octofid +octofoil +octofoiled +octogamy +octogenarian +octogenarianism +octogenary +octogild +octoglot +Octogynia +octogynian +octogynious +octogynous +octoic +octoid +octolateral +octolocular +octomeral +octomerous +octometer +octonal +octonare +octonarian +octonarius +octonary +octonematous +octonion +octonocular +octoon +octopartite +octopean +octoped +octopede +octopetalous +octophthalmous +octophyllous +octopi +octopine +octoploid +octoploidic +octoploidy +octopod +Octopoda +octopodan +octopodes +octopodous +octopolar +octopus +octoradial +octoradiate +octoradiated +octoreme +octoroon +octose +octosepalous +octospermous +octospore +octosporous +octostichous +octosyllabic +octosyllable +octovalent +octoyl +octroi +octroy +octuor +octuple +octuplet +octuplex +octuplicate +octuplication +octuply +octyl +octylene +octyne +ocuby +ocular +ocularist +ocularly +oculary +oculate +oculated +oculauditory +oculiferous +oculiform +oculigerous +Oculina +oculinid +Oculinidae +oculinoid +oculist +oculistic +oculocephalic +oculofacial +oculofrontal +oculomotor +oculomotory +oculonasal +oculopalpebral +oculopupillary +oculospinal +oculozygomatic +oculus +ocydrome +ocydromine +Ocydromus +Ocypete +Ocypoda +ocypodan +Ocypode +ocypodian +Ocypodidae +ocypodoid +Ocyroe +Ocyroidae +Od +od +oda +Odacidae +odacoid +odal +odalborn +odalisk +odalisque +odaller +odalman +odalwoman +Odax +odd +oddish +oddity +oddlegs +oddly +oddman +oddment +oddments +oddness +Odds +odds +Oddsbud +oddsman +ode +odel +odelet +Odelsthing +Odelsting +odeon +odeum +odic +odically +Odin +Odinian +Odinic +Odinism +Odinist +odinite +Odinitic +odiometer +odious +odiously +odiousness +odist +odium +odiumproof +Odobenidae +Odobenus +Odocoileus +odograph +odology +odometer +odometrical +odometry +Odonata +odontagra +odontalgia +odontalgic +Odontaspidae +Odontaspididae +Odontaspis +odontatrophia +odontatrophy +odontexesis +odontiasis +odontic +odontist +odontitis +odontoblast +odontoblastic +odontocele +Odontocete +odontocete +Odontoceti +odontocetous +odontochirurgic +odontoclasis +odontoclast +odontodynia +odontogen +odontogenesis +odontogenic +odontogeny +Odontoglossae +odontoglossal +odontoglossate +Odontoglossum +Odontognathae +odontognathic +odontognathous +odontograph +odontographic +odontography +odontohyperesthesia +odontoid +Odontolcae +odontolcate +odontolcous +odontolite +odontolith +odontological +odontologist +odontology +odontoloxia +odontoma +odontomous +odontonecrosis +odontoneuralgia +odontonosology +odontopathy +odontophoral +odontophore +Odontophoridae +Odontophorinae +odontophorine +odontophorous +Odontophorus +odontoplast +odontoplerosis +Odontopteris +Odontopteryx +odontorhynchous +Odontormae +Odontornithes +odontornithic +odontorrhagia +odontorthosis +odontoschism +odontoscope +odontosis +odontostomatous +odontostomous +Odontosyllis +odontotechny +odontotherapia +odontotherapy +odontotomy +Odontotormae +odontotripsis +odontotrypy +odoom +odophone +odor +odorant +odorate +odorator +odored +odorful +odoriferant +odoriferosity +odoriferous +odoriferously +odoriferousness +odorific +odorimeter +odorimetry +odoriphore +odorivector +odorize +odorless +odorometer +odorosity +odorous +odorously +odorousness +odorproof +Odostemon +Ods +odso +odum +odyl +odylic +odylism +odylist +odylization +odylize +Odynerus +Odyssean +Odyssey +Odz +Odzookers +Odzooks +oe +Oecanthus +oecist +oecodomic +oecodomical +oecoparasite +oecoparasitism +oecophobia +oecumenian +oecumenic +oecumenical +oecumenicalism +oecumenicity +oecus +oedemerid +Oedemeridae +oedicnemine +Oedicnemus +Oedipal +Oedipean +Oedipus +Oedogoniaceae +oedogoniaceous +Oedogoniales +Oedogonium +oenanthaldehyde +oenanthate +Oenanthe +oenanthic +oenanthol +oenanthole +oenanthyl +oenanthylate +oenanthylic +oenin +Oenocarpus +oenochoe +oenocyte +oenocytic +oenolin +oenological +oenologist +oenology +oenomancy +Oenomaus +oenomel +oenometer +oenophilist +oenophobist +oenopoetic +Oenothera +Oenotheraceae +oenotheraceous +Oenotrian +oer +oersted +oes +oesophageal +oesophagi +oesophagismus +oesophagostomiasis +Oesophagostomum +oesophagus +oestradiol +Oestrelata +oestrian +oestriasis +oestrid +Oestridae +oestrin +oestriol +oestroid +oestrous +oestrual +oestruate +oestruation +oestrum +oestrus +of +Ofer +off +offal +offaling +offbeat +offcast +offcome +offcut +offend +offendable +offendant +offended +offendedly +offendedness +offender +offendible +offendress +offense +offenseful +offenseless +offenselessly +offenseproof +offensible +offensive +offensively +offensiveness +offer +offerable +offeree +offerer +offering +offeror +offertorial +offertory +offgoing +offgrade +offhand +offhanded +offhandedly +offhandedness +office +officeholder +officeless +officer +officerage +officeress +officerhood +officerial +officerism +officerless +officership +official +officialdom +officialese +officialism +officiality +officialization +officialize +officially +officialty +officiant +officiary +officiate +officiation +officiator +officinal +officinally +officious +officiously +officiousness +offing +offish +offishly +offishness +offlet +offlook +offprint +offsaddle +offscape +offscour +offscourer +offscouring +offscum +offset +offshoot +offshore +offsider +offspring +offtake +offtype +offuscate +offuscation +offward +offwards +oflete +Ofo +oft +often +oftenness +oftens +oftentime +oftentimes +ofter +oftest +oftly +oftness +ofttime +ofttimes +oftwhiles +Og +ogaire +Ogallala +ogam +ogamic +Ogboni +Ogcocephalidae +Ogcocephalus +ogdoad +ogdoas +ogee +ogeed +ogganition +ogham +oghamic +Oghuz +ogival +ogive +ogived +Oglala +ogle +ogler +ogmic +Ogor +Ogpu +ogre +ogreish +ogreishly +ogreism +ogress +ogrish +ogrism +ogtiern +ogum +Ogygia +Ogygian +oh +ohelo +ohia +Ohio +Ohioan +ohm +ohmage +ohmic +ohmmeter +oho +ohoy +oidioid +oidiomycosis +oidiomycotic +Oidium +oii +oikology +oikoplast +oil +oilberry +oilbird +oilcan +oilcloth +oilcoat +oilcup +oildom +oiled +oiler +oilery +oilfish +oilhole +oilily +oiliness +oilless +oillessness +oillet +oillike +oilman +oilmonger +oilmongery +oilometer +oilpaper +oilproof +oilproofing +oilseed +oilskin +oilskinned +oilstock +oilstone +oilstove +oiltight +oiltightness +oilway +oily +oilyish +oime +oinochoe +oinology +oinomancy +oinomania +oinomel +oint +ointment +Oireachtas +oisin +oisivity +oitava +oiticica +Ojibwa +Ojibway +Ok +oka +okapi +Okapia +okee +okenite +oket +oki +okia +Okie +Okinagan +Oklafalaya +Oklahannali +Oklahoma +Oklahoman +okoniosis +okonite +okra +okrug +okshoofd +okthabah +Okuari +okupukupu +Olacaceae +olacaceous +Olaf +olam +olamic +Olax +Olcha +Olchi +Old +old +olden +Oldenburg +older +oldermost +oldfangled +oldfangledness +Oldfieldia +Oldhamia +oldhamite +oldhearted +oldish +oldland +oldness +oldster +oldwife +Ole +Olea +Oleaceae +oleaceous +Oleacina +Oleacinidae +oleaginous +oleaginousness +oleana +oleander +oleandrin +Olearia +olease +oleaster +oleate +olecranal +olecranarthritis +olecranial +olecranian +olecranoid +olecranon +olefiant +olefin +olefine +olefinic +Oleg +oleic +oleiferous +olein +olena +olenellidian +Olenellus +olenid +Olenidae +olenidian +olent +Olenus +oleo +oleocalcareous +oleocellosis +oleocyst +oleoduct +oleograph +oleographer +oleographic +oleography +oleomargaric +oleomargarine +oleometer +oleoptene +oleorefractometer +oleoresin +oleoresinous +oleosaccharum +oleose +oleosity +oleostearate +oleostearin +oleothorax +oleous +Oleraceae +oleraceous +olericultural +olericulturally +olericulture +Oleron +Olethreutes +olethreutid +Olethreutidae +olfact +olfactible +olfaction +olfactive +olfactology +olfactometer +olfactometric +olfactometry +olfactor +olfactorily +olfactory +olfacty +Olga +oliban +olibanum +olid +oligacanthous +oligaemia +oligandrous +oliganthous +oligarch +oligarchal +oligarchic +oligarchical +oligarchically +oligarchism +oligarchist +oligarchize +oligarchy +oligemia +oligidria +oligist +oligistic +oligistical +oligocarpous +Oligocene +Oligochaeta +oligochaete +oligochaetous +oligochete +oligocholia +oligochrome +oligochromemia +oligochronometer +oligochylia +oligoclase +oligoclasite +oligocystic +oligocythemia +oligocythemic +oligodactylia +oligodendroglia +oligodendroglioma +oligodipsia +oligodontous +oligodynamic +oligogalactia +oligohemia +oligohydramnios +oligolactia +oligomenorrhea +oligomerous +oligomery +oligometochia +oligometochic +Oligomyodae +oligomyodian +oligomyoid +Oligonephria +oligonephric +oligonephrous +oligonite +oligopepsia +oligopetalous +oligophagous +oligophosphaturia +oligophrenia +oligophrenic +oligophyllous +oligoplasmia +oligopnea +oligopolistic +oligopoly +oligoprothesy +oligoprothetic +oligopsonistic +oligopsony +oligopsychia +oligopyrene +oligorhizous +oligosepalous +oligosialia +oligosideric +oligosiderite +oligosite +oligospermia +oligospermous +oligostemonous +oligosyllabic +oligosyllable +oligosynthetic +oligotokous +oligotrichia +oligotrophic +oligotrophy +oligotropic +oliguresis +oliguretic +oliguria +Olinia +Oliniaceae +oliniaceous +olio +oliphant +oliprance +olitory +Oliva +oliva +olivaceous +olivary +Olive +olive +Olivean +olived +Olivella +oliveness +olivenite +Oliver +Oliverian +oliverman +oliversmith +olivescent +olivet +Olivetan +Olivette +olivewood +Olivia +Olividae +Olivier +oliviferous +oliviform +olivil +olivile +olivilin +olivine +olivinefels +olivinic +olivinite +olivinitic +olla +ollamh +ollapod +ollenite +Ollie +ollock +olm +Olneya +Olof +ological +ologist +ologistic +ology +olomao +olona +Olonets +Olonetsian +Olonetsish +Olor +oloroso +olpe +Olpidiaster +Olpidium +Olson +oltonde +oltunna +olycook +olykoek +Olympia +Olympiad +Olympiadic +Olympian +Olympianism +Olympianize +Olympianly +Olympianwise +Olympic +Olympicly +Olympicness +Olympieion +Olympionic +Olympus +Olynthiac +Olynthian +Olynthus +om +omadhaun +omagra +Omagua +Omaha +omalgia +Oman +Omani +omao +Omar +omarthritis +omasitis +omasum +omber +ombrette +ombrifuge +ombrograph +ombrological +ombrology +ombrometer +ombrophile +ombrophilic +ombrophilous +ombrophily +ombrophobe +ombrophobous +ombrophoby +ombrophyte +ombudsman +ombudsmanship +omega +omegoid +omelet +omelette +omen +omened +omenology +omental +omentectomy +omentitis +omentocele +omentofixation +omentopexy +omentoplasty +omentorrhaphy +omentosplenopexy +omentotomy +omentulum +omentum +omer +omicron +omina +ominous +ominously +ominousness +omissible +omission +omissive +omissively +omit +omitis +omittable +omitter +omlah +Ommastrephes +Ommastrephidae +ommateal +ommateum +ommatidial +ommatidium +ommatophore +ommatophorous +Ommiad +Ommiades +omneity +omniactive +omniactuality +omniana +omniarch +omnibenevolence +omnibenevolent +omnibus +omnibusman +omnicausality +omnicompetence +omnicompetent +omnicorporeal +omnicredulity +omnicredulous +omnidenominational +omnierudite +omniessence +omnifacial +omnifarious +omnifariously +omnifariousness +omniferous +omnific +omnificent +omnifidel +omniform +omniformal +omniformity +omnify +omnigenous +omnigerent +omnigraph +omnihuman +omnihumanity +omnilegent +omnilingual +omniloquent +omnilucent +omnimental +omnimeter +omnimode +omnimodous +omninescience +omninescient +omniparent +omniparient +omniparity +omniparous +omnipatient +omnipercipience +omnipercipiency +omnipercipient +omniperfect +omnipotence +omnipotency +omnipotent +omnipotentiality +omnipotently +omnipregnant +omnipresence +omnipresent +omnipresently +omniprevalence +omniprevalent +omniproduction +omniprudent +omnirange +omniregency +omnirepresentative +omnirepresentativeness +omnirevealing +omniscience +omnisciency +omniscient +omnisciently +omniscope +omniscribent +omniscriptive +omnisentience +omnisentient +omnisignificance +omnisignificant +omnispective +omnist +omnisufficiency +omnisufficient +omnitemporal +omnitenent +omnitolerant +omnitonal +omnitonality +omnitonic +omnitude +omnium +omnivagant +omnivalence +omnivalent +omnivalous +omnivarious +omnividence +omnivident +omnivision +omnivolent +Omnivora +omnivoracious +omnivoracity +omnivorant +omnivore +omnivorous +omnivorously +omnivorousness +omodynia +omohyoid +omoideum +omophagia +omophagist +omophagous +omophagy +omophorion +omoplate +omoplatoscopy +omostegite +omosternal +omosternum +omphacine +omphacite +omphalectomy +omphalic +omphalism +omphalitis +omphalocele +omphalode +omphalodium +omphalogenous +omphaloid +omphaloma +omphalomesaraic +omphalomesenteric +omphaloncus +omphalopagus +omphalophlebitis +omphalopsychic +omphalopsychite +omphalorrhagia +omphalorrhea +omphalorrhexis +omphalos +omphalosite +omphaloskepsis +omphalospinous +omphalotomy +omphalotripsy +omphalus +on +Ona +ona +onager +Onagra +onagra +Onagraceae +onagraceous +Onan +onanism +onanist +onanistic +onca +once +oncetta +Onchidiidae +Onchidium +Onchocerca +onchocerciasis +onchocercosis +oncia +Oncidium +oncin +oncograph +oncography +oncologic +oncological +oncology +oncome +oncometer +oncometric +oncometry +oncoming +Oncorhynchus +oncosimeter +oncosis +oncosphere +oncost +oncostman +oncotomy +ondagram +ondagraph +ondameter +ondascope +ondatra +ondine +ondogram +ondograph +ondometer +ondoscope +ondy +one +oneanother +oneberry +onefold +onefoldness +onegite +onehearted +onehow +Oneida +oneiric +oneirocrit +oneirocritic +oneirocritical +oneirocritically +oneirocriticism +oneirocritics +oneirodynia +oneirologist +oneirology +oneiromancer +oneiromancy +oneiroscopic +oneiroscopist +oneiroscopy +oneirotic +oneism +onement +oneness +oner +onerary +onerative +onerosity +onerous +onerously +onerousness +onery +oneself +onesigned +onetime +onewhere +oneyer +onfall +onflemed +onflow +onflowing +ongaro +ongoing +onhanger +onicolo +oniomania +oniomaniac +onion +onionet +onionized +onionlike +onionpeel +onionskin +oniony +onirotic +Oniscidae +onisciform +oniscoid +Oniscoidea +oniscoidean +Oniscus +onium +onkilonite +onkos +onlay +onlepy +onliest +onliness +onlook +onlooker +onlooking +only +onmarch +Onmun +Onobrychis +onocentaur +Onoclea +onofrite +Onohippidium +onolatry +onomancy +onomantia +onomastic +onomasticon +onomatologist +onomatology +onomatomania +onomatope +onomatoplasm +onomatopoeia +onomatopoeial +onomatopoeian +onomatopoeic +onomatopoeical +onomatopoeically +onomatopoesis +onomatopoesy +onomatopoetic +onomatopoetically +onomatopy +onomatous +onomomancy +Onondaga +Onondagan +Ononis +Onopordon +Onosmodium +onrush +onrushing +ons +onset +onsetter +onshore +onside +onsight +onslaught +onstand +onstanding +onstead +onsweep +onsweeping +ontal +Ontarian +Ontaric +onto +ontocycle +ontocyclic +ontogenal +ontogenesis +ontogenetic +ontogenetical +ontogenetically +ontogenic +ontogenically +ontogenist +ontogeny +ontography +ontologic +ontological +ontologically +ontologism +ontologist +ontologistic +ontologize +ontology +ontosophy +onus +onwaiting +onward +onwardly +onwardness +onwards +onycha +onychatrophia +onychauxis +onychia +onychin +onychitis +onychium +onychogryposis +onychoid +onycholysis +onychomalacia +onychomancy +onychomycosis +onychonosus +onychopathic +onychopathology +onychopathy +onychophagist +onychophagy +Onychophora +onychophoran +onychophorous +onychophyma +onychoptosis +onychorrhexis +onychoschizia +onychosis +onychotrophy +onym +onymal +onymancy +onymatic +onymity +onymize +onymous +onymy +onyx +onyxis +onyxitis +onza +ooangium +ooblast +ooblastic +oocyesis +oocyst +Oocystaceae +oocystaceous +oocystic +Oocystis +oocyte +oodles +ooecial +ooecium +oofbird +ooftish +oofy +oogamete +oogamous +oogamy +oogenesis +oogenetic +oogeny +ooglea +oogone +oogonial +oogoniophore +oogonium +oograph +ooid +ooidal +ookinesis +ookinete +ookinetic +oolak +oolemma +oolite +oolitic +oolly +oologic +oological +oologically +oologist +oologize +oology +oolong +oomancy +oomantia +oometer +oometric +oometry +oomycete +Oomycetes +oomycetous +oons +oont +oopak +oophoralgia +oophorauxe +oophore +oophorectomy +oophoreocele +oophorhysterectomy +oophoric +oophoridium +oophoritis +oophoroepilepsy +oophoroma +oophoromalacia +oophoromania +oophoron +oophoropexy +oophororrhaphy +oophorosalpingectomy +oophorostomy +oophorotomy +oophyte +oophytic +ooplasm +ooplasmic +ooplast +oopod +oopodal +ooporphyrin +oorali +oord +ooscope +ooscopy +oosperm +oosphere +oosporange +oosporangium +oospore +Oosporeae +oosporic +oosporiferous +oosporous +oostegite +oostegitic +ootheca +oothecal +ootid +ootocoid +Ootocoidea +ootocoidean +ootocous +ootype +ooze +oozily +ooziness +oozooid +oozy +opacate +opacification +opacifier +opacify +opacite +opacity +opacous +opacousness +opah +opal +opaled +opalesce +opalescence +opalescent +opalesque +Opalina +opaline +opalinid +Opalinidae +opalinine +opalish +opalize +opaloid +opaque +opaquely +opaqueness +Opata +opdalite +ope +Opegrapha +opeidoscope +opelet +open +openable +openband +openbeak +openbill +opencast +opener +openhanded +openhandedly +openhandedness +openhead +openhearted +openheartedly +openheartedness +opening +openly +openmouthed +openmouthedly +openmouthedness +openness +openside +openwork +opera +operability +operabily +operable +operae +operagoer +operalogue +operameter +operance +operancy +operand +operant +operatable +operate +operatee +operatic +operatical +operatically +operating +operation +operational +operationalism +operationalist +operationism +operationist +operative +operatively +operativeness +operativity +operatize +operator +operatory +operatrix +opercle +opercled +opercula +opercular +Operculata +operculate +operculated +operculiferous +operculiform +operculigenous +operculigerous +operculum +operetta +operette +operettist +operose +operosely +operoseness +operosity +Ophelia +ophelimity +Ophian +ophiasis +ophic +ophicalcite +Ophicephalidae +ophicephaloid +Ophicephalus +Ophichthyidae +ophichthyoid +ophicleide +ophicleidean +ophicleidist +Ophidia +ophidian +Ophidiidae +Ophidiobatrachia +ophidioid +Ophidion +ophidiophobia +ophidious +ophidologist +ophidology +Ophiobatrachia +Ophiobolus +Ophioglossaceae +ophioglossaceous +Ophioglossales +Ophioglossum +ophiography +ophioid +ophiolater +ophiolatrous +ophiolatry +ophiolite +ophiolitic +ophiologic +ophiological +ophiologist +ophiology +ophiomancy +ophiomorph +Ophiomorpha +ophiomorphic +ophiomorphous +Ophion +ophionid +Ophioninae +ophionine +ophiophagous +ophiophilism +ophiophilist +ophiophobe +ophiophobia +ophiophoby +ophiopluteus +Ophiosaurus +ophiostaphyle +ophiouride +Ophis +Ophisaurus +Ophism +Ophite +ophite +Ophitic +ophitic +Ophitism +Ophiuchid +Ophiuchus +ophiuran +ophiurid +Ophiurida +ophiuroid +Ophiuroidea +ophiuroidean +ophryon +Ophrys +ophthalaiater +ophthalmagra +ophthalmalgia +ophthalmalgic +ophthalmatrophia +ophthalmectomy +ophthalmencephalon +ophthalmetrical +ophthalmia +ophthalmiac +ophthalmiatrics +ophthalmic +ophthalmious +ophthalmist +ophthalmite +ophthalmitic +ophthalmitis +ophthalmoblennorrhea +ophthalmocarcinoma +ophthalmocele +ophthalmocopia +ophthalmodiagnosis +ophthalmodiastimeter +ophthalmodynamometer +ophthalmodynia +ophthalmography +ophthalmoleucoscope +ophthalmolith +ophthalmologic +ophthalmological +ophthalmologist +ophthalmology +ophthalmomalacia +ophthalmometer +ophthalmometric +ophthalmometry +ophthalmomycosis +ophthalmomyositis +ophthalmomyotomy +ophthalmoneuritis +ophthalmopathy +ophthalmophlebotomy +ophthalmophore +ophthalmophorous +ophthalmophthisis +ophthalmoplasty +ophthalmoplegia +ophthalmoplegic +ophthalmopod +ophthalmoptosis +ophthalmorrhagia +ophthalmorrhea +ophthalmorrhexis +Ophthalmosaurus +ophthalmoscope +ophthalmoscopic +ophthalmoscopical +ophthalmoscopist +ophthalmoscopy +ophthalmostasis +ophthalmostat +ophthalmostatometer +ophthalmothermometer +ophthalmotomy +ophthalmotonometer +ophthalmotonometry +ophthalmotrope +ophthalmotropometer +ophthalmy +opianic +opianyl +opiate +opiateproof +opiatic +Opiconsivia +opificer +opiism +Opilia +Opiliaceae +opiliaceous +Opiliones +Opilionina +opilionine +Opilonea +Opimian +opinability +opinable +opinably +opinant +opination +opinative +opinatively +opinator +opine +opiner +opiniaster +opiniastre +opiniastrety +opiniastrous +opiniater +opiniative +opiniatively +opiniativeness +opiniatreness +opiniatrety +opinion +opinionable +opinionaire +opinional +opinionate +opinionated +opinionatedly +opinionatedness +opinionately +opinionative +opinionatively +opinionativeness +opinioned +opinionedness +opinionist +opiomania +opiomaniac +opiophagism +opiophagy +opiparous +opisometer +opisthenar +opisthion +opisthobranch +Opisthobranchia +opisthobranchiate +Opisthocoelia +opisthocoelian +opisthocoelous +opisthocome +Opisthocomi +Opisthocomidae +opisthocomine +opisthocomous +opisthodetic +opisthodome +opisthodomos +opisthodomus +opisthodont +opisthogastric +Opisthoglossa +opisthoglossal +opisthoglossate +opisthoglyph +Opisthoglypha +opisthoglyphic +opisthoglyphous +Opisthognathidae +opisthognathism +opisthognathous +opisthograph +opisthographal +opisthographic +opisthographical +opisthography +opisthogyrate +opisthogyrous +Opisthoparia +opisthoparian +opisthophagic +opisthoporeia +opisthorchiasis +Opisthorchis +opisthosomal +Opisthothelae +opisthotic +opisthotonic +opisthotonoid +opisthotonos +opisthotonus +opium +opiumism +opobalsam +opodeldoc +opodidymus +opodymus +opopanax +Oporto +opossum +opotherapy +Oppian +oppidan +oppilate +oppilation +oppilative +opponency +opponent +opportune +opportuneless +opportunely +opportuneness +opportunism +opportunist +opportunistic +opportunistically +opportunity +opposability +opposable +oppose +opposed +opposeless +opposer +opposing +opposingly +opposit +opposite +oppositely +oppositeness +oppositiflorous +oppositifolious +opposition +oppositional +oppositionary +oppositionism +oppositionist +oppositionless +oppositious +oppositipetalous +oppositipinnate +oppositipolar +oppositisepalous +oppositive +oppositively +oppositiveness +opposure +oppress +oppressed +oppressible +oppression +oppressionist +oppressive +oppressively +oppressiveness +oppressor +opprobriate +opprobrious +opprobriously +opprobriousness +opprobrium +opprobry +oppugn +oppugnacy +oppugnance +oppugnancy +oppugnant +oppugnate +oppugnation +oppugner +opsigamy +opsimath +opsimathy +opsiometer +opsisform +opsistype +opsonic +opsoniferous +opsonification +opsonify +opsonin +opsonist +opsonium +opsonization +opsonize +opsonogen +opsonoid +opsonology +opsonometry +opsonophilia +opsonophilic +opsonophoric +opsonotherapy +opsy +opt +optable +optableness +optably +optant +optate +optation +optative +optatively +opthalmophorium +opthalmoplegy +opthalmothermometer +optic +optical +optically +optician +opticist +opticity +opticochemical +opticociliary +opticon +opticopapillary +opticopupillary +optics +optigraph +optimacy +optimal +optimate +optimates +optime +optimism +optimist +optimistic +optimistical +optimistically +optimity +optimization +optimize +optimum +option +optional +optionality +optionalize +optionally +optionary +optionee +optionor +optive +optoblast +optogram +optography +optological +optologist +optology +optomeninx +optometer +optometrical +optometrist +optometry +optophone +optotechnics +optotype +Opulaster +opulence +opulency +opulent +opulently +opulus +Opuntia +Opuntiaceae +Opuntiales +opuntioid +opus +opuscular +opuscule +opusculum +oquassa +or +ora +orabassu +orach +oracle +oracular +oracularity +oracularly +oracularness +oraculate +oraculous +oraculously +oraculousness +oraculum +orad +orage +oragious +Orakzai +oral +oraler +oralism +oralist +orality +oralization +oralize +orally +oralogist +oralogy +Orang +orang +orange +orangeade +orangebird +Orangeism +Orangeist +orangeleaf +Orangeman +orangeman +oranger +orangeroot +orangery +orangewoman +orangewood +orangey +orangism +orangist +orangite +orangize +orangutan +orant +Oraon +orarian +orarion +orarium +orary +orate +oration +orational +orationer +orator +oratorial +oratorially +Oratorian +oratorian +Oratorianism +Oratorianize +oratoric +oratorical +oratorically +oratorio +oratorize +oratorlike +oratorship +oratory +oratress +oratrix +orb +orbed +orbic +orbical +Orbicella +orbicle +orbicular +orbicularis +orbicularity +orbicularly +orbicularness +orbiculate +orbiculated +orbiculately +orbiculation +orbiculatocordate +orbiculatoelliptical +Orbiculoidea +orbific +Orbilian +Orbilius +orbit +orbital +orbitale +orbitar +orbitary +orbite +orbitelar +Orbitelariae +orbitelarian +orbitele +orbitelous +orbitofrontal +Orbitoides +Orbitolina +orbitolite +Orbitolites +orbitomalar +orbitomaxillary +orbitonasal +orbitopalpebral +orbitosphenoid +orbitosphenoidal +orbitostat +orbitotomy +orbitozygomatic +orbless +orblet +Orbulina +orby +orc +Orca +Orcadian +orcanet +orcein +orchamus +orchard +orcharding +orchardist +orchardman +orchat +orchel +orchella +orchesis +orchesography +orchester +Orchestia +orchestian +orchestic +orchestiid +Orchestiidae +orchestra +orchestral +orchestraless +orchestrally +orchestrate +orchestrater +orchestration +orchestrator +orchestre +orchestric +orchestrina +orchestrion +orchialgia +orchic +orchichorea +orchid +Orchidaceae +orchidacean +orchidaceous +Orchidales +orchidalgia +orchidectomy +orchideous +orchideously +orchidist +orchiditis +orchidocele +orchidocelioplasty +orchidologist +orchidology +orchidomania +orchidopexy +orchidoplasty +orchidoptosis +orchidorrhaphy +orchidotherapy +orchidotomy +orchiectomy +orchiencephaloma +orchiepididymitis +orchil +orchilla +orchilytic +orchiocatabasis +orchiocele +orchiodynia +orchiomyeloma +orchioncus +orchioneuralgia +orchiopexy +orchioplasty +orchiorrhaphy +orchioscheocele +orchioscirrhus +orchiotomy +Orchis +orchitic +orchitis +orchotomy +orcin +orcinol +Orcinus +ordain +ordainable +ordainer +ordainment +ordanchite +ordeal +order +orderable +ordered +orderedness +orderer +orderless +orderliness +orderly +ordinable +ordinal +ordinally +ordinance +ordinand +ordinant +ordinar +ordinarily +ordinariness +ordinarius +ordinary +ordinaryship +ordinate +ordinately +ordination +ordinative +ordinatomaculate +ordinator +ordinee +ordines +ordnance +ordonnance +ordonnant +ordosite +Ordovian +Ordovices +Ordovician +ordu +ordure +ordurous +ore +oread +Oreamnos +Oreas +orecchion +orectic +orective +oreillet +orellin +oreman +orenda +orendite +Oreocarya +Oreodon +oreodont +Oreodontidae +oreodontine +oreodontoid +Oreodoxa +Oreophasinae +oreophasine +Oreophasis +Oreortyx +oreotragine +Oreotragus +Oreotrochilus +Orestean +Oresteia +oreweed +orewood +orexis +orf +orfgild +organ +organal +organbird +organdy +organella +organelle +organer +organette +organic +organical +organically +organicalness +organicism +organicismal +organicist +organicistic +organicity +organific +organing +organism +organismal +organismic +organist +organistic +organistrum +organistship +organity +organizability +organizable +organization +organizational +organizationally +organizationist +organizatory +organize +organized +organizer +organless +organoantimony +organoarsenic +organobismuth +organoboron +organochordium +organogel +organogen +organogenesis +organogenetic +organogenic +organogenist +organogeny +organogold +organographic +organographical +organographist +organography +organoid +organoiron +organolead +organoleptic +organolithium +organologic +organological +organologist +organology +organomagnesium +organomercury +organometallic +organon +organonomic +organonomy +organonym +organonymal +organonymic +organonymy +organopathy +organophil +organophile +organophilic +organophone +organophonic +organophyly +organoplastic +organoscopy +organosilicon +organosilver +organosodium +organosol +organotherapy +organotin +organotrophic +organotropic +organotropically +organotropism +organotropy +organozinc +organry +organule +organum +organzine +orgasm +orgasmic +orgastic +orgeat +orgia +orgiac +orgiacs +orgiasm +orgiast +orgiastic +orgiastical +orgic +orgue +orguinette +orgulous +orgulously +orgy +orgyia +Orias +Oribatidae +oribi +orichalceous +orichalch +orichalcum +oriconic +oricycle +oriel +oriency +orient +Oriental +oriental +Orientalia +orientalism +orientalist +orientality +orientalization +orientalize +orientally +Orientalogy +orientate +orientation +orientative +orientator +orientite +orientization +orientize +oriently +orientness +orifacial +orifice +orificial +oriflamb +oriflamme +oriform +origan +origanized +Origanum +Origenian +Origenic +Origenical +Origenism +Origenist +Origenistic +Origenize +origin +originable +original +originalist +originality +originally +originalness +originant +originarily +originary +originate +origination +originative +originatively +originator +originatress +originist +orignal +orihon +orihyperbola +orillion +orillon +orinasal +orinasality +oriole +Oriolidae +Oriolus +Orion +Oriskanian +orismologic +orismological +orismology +orison +orisphere +oristic +Oriya +Orkhon +Orkneyan +Orlando +orle +orlean +Orleanism +Orleanist +Orleanistic +Orleans +orlet +orleways +orlewise +orlo +orlop +Ormazd +ormer +ormolu +Ormond +orna +ornament +ornamental +ornamentalism +ornamentalist +ornamentality +ornamentalize +ornamentally +ornamentary +ornamentation +ornamenter +ornamentist +ornate +ornately +ornateness +ornation +ornature +orneriness +ornery +ornis +orniscopic +orniscopist +orniscopy +ornithic +ornithichnite +ornithine +Ornithischia +ornithischian +ornithivorous +ornithobiographical +ornithobiography +ornithocephalic +Ornithocephalidae +ornithocephalous +Ornithocephalus +ornithocoprolite +ornithocopros +ornithodelph +Ornithodelphia +ornithodelphian +ornithodelphic +ornithodelphous +Ornithodoros +Ornithogaea +Ornithogaean +Ornithogalum +ornithogeographic +ornithogeographical +ornithography +ornithoid +Ornitholestes +ornitholite +ornitholitic +ornithologic +ornithological +ornithologically +ornithologist +ornithology +ornithomancy +ornithomantia +ornithomantic +ornithomantist +Ornithomimidae +Ornithomimus +ornithomorph +ornithomorphic +ornithomyzous +ornithon +Ornithopappi +ornithophile +ornithophilist +ornithophilite +ornithophilous +ornithophily +ornithopod +Ornithopoda +ornithopter +Ornithoptera +Ornithopteris +Ornithorhynchidae +ornithorhynchous +Ornithorhynchus +ornithosaur +Ornithosauria +ornithosaurian +Ornithoscelida +ornithoscelidan +ornithoscopic +ornithoscopist +ornithoscopy +ornithosis +ornithotomical +ornithotomist +ornithotomy +ornithotrophy +Ornithurae +ornithuric +ornithurous +ornoite +oroanal +Orobanchaceae +orobanchaceous +Orobanche +orobancheous +orobathymetric +Orobatoidea +Orochon +orocratic +orodiagnosis +orogen +orogenesis +orogenesy +orogenetic +orogenic +orogeny +orograph +orographic +orographical +orographically +orography +oroheliograph +Orohippus +orohydrographic +orohydrographical +orohydrography +oroide +orolingual +orological +orologist +orology +orometer +orometric +orometry +Oromo +oronasal +oronoco +Orontium +oropharyngeal +oropharynx +orotherapy +Orotinan +orotund +orotundity +orphan +orphancy +orphandom +orphange +orphanhood +orphanism +orphanize +orphanry +orphanship +orpharion +Orphean +Orpheist +orpheon +orpheonist +orpheum +Orpheus +Orphic +Orphical +Orphically +Orphicism +Orphism +Orphize +orphrey +orphreyed +orpiment +orpine +Orpington +orrery +orrhoid +orrhology +orrhotherapy +orris +orrisroot +orseille +orseilline +orsel +orselle +orseller +orsellic +orsellinate +orsellinic +Orson +ort +ortalid +Ortalidae +ortalidian +Ortalis +ortet +Orthagoriscus +orthal +orthantimonic +Ortheris +orthian +orthic +orthicon +orthid +Orthidae +Orthis +orthite +orthitic +ortho +orthoarsenite +orthoaxis +orthobenzoquinone +orthobiosis +orthoborate +orthobrachycephalic +orthocarbonic +orthocarpous +Orthocarpus +orthocenter +orthocentric +orthocephalic +orthocephalous +orthocephaly +orthoceracone +Orthoceran +Orthoceras +Orthoceratidae +orthoceratite +orthoceratitic +orthoceratoid +orthochlorite +orthochromatic +orthochromatize +orthoclase +orthoclasite +orthoclastic +orthocoumaric +orthocresol +orthocymene +orthodiaene +orthodiagonal +orthodiagram +orthodiagraph +orthodiagraphic +orthodiagraphy +orthodiazin +orthodiazine +orthodolichocephalic +orthodomatic +orthodome +orthodontia +orthodontic +orthodontics +orthodontist +orthodox +orthodoxal +orthodoxality +orthodoxally +orthodoxian +orthodoxical +orthodoxically +orthodoxism +orthodoxist +orthodoxly +orthodoxness +orthodoxy +orthodromic +orthodromics +orthodromy +orthoepic +orthoepical +orthoepically +orthoepist +orthoepistic +orthoepy +orthoformic +orthogamous +orthogamy +orthogenesis +orthogenetic +orthogenic +orthognathic +orthognathism +orthognathous +orthognathus +orthognathy +orthogneiss +orthogonal +orthogonality +orthogonally +orthogonial +orthograde +orthogranite +orthograph +orthographer +orthographic +orthographical +orthographically +orthographist +orthographize +orthography +orthohydrogen +orthologer +orthologian +orthological +orthology +orthometopic +orthometric +orthometry +Orthonectida +orthonitroaniline +orthopath +orthopathic +orthopathically +orthopathy +orthopedia +orthopedic +orthopedical +orthopedically +orthopedics +orthopedist +orthopedy +orthophenylene +orthophonic +orthophony +orthophoria +orthophoric +orthophosphate +orthophosphoric +orthophyre +orthophyric +orthopinacoid +orthopinacoidal +orthoplastic +orthoplasy +orthoplumbate +orthopnea +orthopneic +orthopod +Orthopoda +orthopraxis +orthopraxy +orthoprism +orthopsychiatric +orthopsychiatrical +orthopsychiatrist +orthopsychiatry +orthopter +Orthoptera +orthopteral +orthopteran +orthopterist +orthopteroid +Orthopteroidea +orthopterological +orthopterologist +orthopterology +orthopteron +orthopterous +orthoptic +orthopyramid +orthopyroxene +orthoquinone +orthorhombic +Orthorrhapha +orthorrhaphous +orthorrhaphy +orthoscope +orthoscopic +orthose +orthosemidin +orthosemidine +orthosilicate +orthosilicic +orthosis +orthosite +orthosomatic +orthospermous +orthostatic +orthostichous +orthostichy +orthostyle +orthosubstituted +orthosymmetric +orthosymmetrical +orthosymmetrically +orthosymmetry +orthotactic +orthotectic +orthotic +orthotolidin +orthotolidine +orthotoluic +orthotoluidin +orthotoluidine +orthotomic +orthotomous +orthotone +orthotonesis +orthotonic +orthotonus +orthotropal +orthotropic +orthotropism +orthotropous +orthotropy +orthotype +orthotypous +orthovanadate +orthovanadic +orthoveratraldehyde +orthoveratric +orthoxazin +orthoxazine +orthoxylene +orthron +ortiga +ortive +Ortol +ortolan +Ortrud +ortstein +ortygan +Ortygian +Ortyginae +ortygine +Ortyx +Orunchun +orvietan +orvietite +Orvieto +Orville +ory +Orycteropodidae +Orycteropus +oryctics +oryctognostic +oryctognostical +oryctognostically +oryctognosy +Oryctolagus +oryssid +Oryssidae +Oryssus +Oryx +Oryza +oryzenin +oryzivorous +Oryzomys +Oryzopsis +Oryzorictes +Oryzorictinae +Os +os +Osage +osamin +osamine +osazone +Osc +Oscan +Oscar +Oscarella +Oscarellidae +oscella +oscheal +oscheitis +oscheocarcinoma +oscheocele +oscheolith +oscheoma +oscheoncus +oscheoplasty +Oschophoria +oscillance +oscillancy +oscillant +Oscillaria +Oscillariaceae +oscillariaceous +oscillate +oscillating +oscillation +oscillative +oscillatively +oscillator +Oscillatoria +Oscillatoriaceae +oscillatoriaceous +oscillatorian +oscillatory +oscillogram +oscillograph +oscillographic +oscillography +oscillometer +oscillometric +oscillometry +oscilloscope +oscin +oscine +Oscines +oscinian +Oscinidae +oscinine +Oscinis +oscitance +oscitancy +oscitant +oscitantly +oscitate +oscitation +oscnode +osculable +osculant +oscular +oscularity +osculate +osculation +osculatory +osculatrix +oscule +osculiferous +osculum +oscurrantist +ose +osela +oshac +Osiandrian +oside +osier +osiered +osierlike +osiery +Osirian +Osiride +Osiridean +Osirification +Osirify +Osiris +Osirism +Oskar +Osmanie +Osmanli +Osmanthus +osmate +osmatic +osmatism +osmazomatic +osmazomatous +osmazome +Osmeridae +Osmerus +osmesis +osmeterium +osmetic +osmic +osmidrosis +osmin +osmina +osmious +osmiridium +osmium +osmodysphoria +osmogene +osmograph +osmolagnia +osmology +osmometer +osmometric +osmometry +Osmond +osmondite +osmophore +osmoregulation +Osmorhiza +osmoscope +osmose +osmosis +osmotactic +osmotaxis +osmotherapy +osmotic +osmotically +osmous +osmund +Osmunda +Osmundaceae +osmundaceous +osmundine +Osnaburg +Osnappar +osoberry +osone +osophy +osotriazine +osotriazole +osphradial +osphradium +osphresiolagnia +osphresiologic +osphresiologist +osphresiology +osphresiometer +osphresiometry +osphresiophilia +osphresis +osphretic +Osphromenidae +osphyalgia +osphyalgic +osphyarthritis +osphyitis +osphyocele +osphyomelitis +osprey +ossal +ossarium +ossature +osse +ossein +osselet +ossements +osseoalbuminoid +osseoaponeurotic +osseocartilaginous +osseofibrous +osseomucoid +osseous +osseously +Osset +Ossetian +Ossetic +Ossetine +Ossetish +Ossian +Ossianesque +Ossianic +Ossianism +Ossianize +ossicle +ossicular +ossiculate +ossicule +ossiculectomy +ossiculotomy +ossiculum +ossiferous +ossific +ossification +ossified +ossifier +ossifluence +ossifluent +ossiform +ossifrage +ossifrangent +ossify +ossivorous +ossuarium +ossuary +ossypite +ostalgia +Ostara +ostariophysan +Ostariophyseae +Ostariophysi +ostariophysial +ostariophysous +ostarthritis +osteal +ostealgia +osteanabrosis +osteanagenesis +ostearthritis +ostearthrotomy +ostectomy +osteectomy +osteectopia +osteectopy +Osteichthyes +ostein +osteitic +osteitis +ostemia +ostempyesis +ostensibility +ostensible +ostensibly +ostension +ostensive +ostensively +ostensorium +ostensory +ostent +ostentate +ostentation +ostentatious +ostentatiously +ostentatiousness +ostentive +ostentous +osteoaneurysm +osteoarthritis +osteoarthropathy +osteoarthrotomy +osteoblast +osteoblastic +osteoblastoma +osteocachetic +osteocarcinoma +osteocartilaginous +osteocele +osteocephaloma +osteochondritis +osteochondrofibroma +osteochondroma +osteochondromatous +osteochondropathy +osteochondrophyte +osteochondrosarcoma +osteochondrous +osteoclasia +osteoclasis +osteoclast +osteoclastic +osteoclasty +osteocolla +osteocomma +osteocranium +osteocystoma +osteodentin +osteodentinal +osteodentine +osteoderm +osteodermal +osteodermatous +osteodermia +osteodermis +osteodiastasis +osteodynia +osteodystrophy +osteoencephaloma +osteoenchondroma +osteoepiphysis +osteofibroma +osteofibrous +osteogangrene +osteogen +osteogenesis +osteogenetic +osteogenic +osteogenist +osteogenous +osteogeny +osteoglossid +Osteoglossidae +osteoglossoid +Osteoglossum +osteographer +osteography +osteohalisteresis +osteoid +Osteolepidae +Osteolepis +osteolite +osteologer +osteologic +osteological +osteologically +osteologist +osteology +osteolysis +osteolytic +osteoma +osteomalacia +osteomalacial +osteomalacic +osteomancy +osteomanty +osteomatoid +osteomere +osteometric +osteometrical +osteometry +osteomyelitis +osteoncus +osteonecrosis +osteoneuralgia +osteopaedion +osteopath +osteopathic +osteopathically +osteopathist +osteopathy +osteopedion +osteoperiosteal +osteoperiostitis +osteopetrosis +osteophage +osteophagia +osteophlebitis +osteophone +osteophony +osteophore +osteophyma +osteophyte +osteophytic +osteoplaque +osteoplast +osteoplastic +osteoplasty +osteoporosis +osteoporotic +osteorrhaphy +osteosarcoma +osteosarcomatous +osteosclerosis +osteoscope +osteosis +osteosteatoma +osteostixis +osteostomatous +osteostomous +osteostracan +Osteostraci +osteosuture +osteosynovitis +osteosynthesis +osteothrombosis +osteotome +osteotomist +osteotomy +osteotribe +osteotrite +osteotrophic +osteotrophy +Ostertagia +ostial +ostiary +ostiate +Ostic +ostiolar +ostiolate +ostiole +ostitis +ostium +ostleress +Ostmannic +ostmark +Ostmen +ostosis +Ostracea +ostracean +ostraceous +Ostraciidae +ostracine +ostracioid +Ostracion +ostracism +ostracizable +ostracization +ostracize +ostracizer +ostracod +Ostracoda +ostracode +ostracoderm +Ostracodermi +ostracodous +ostracoid +Ostracoidea +ostracon +ostracophore +Ostracophori +ostracophorous +ostracum +Ostraeacea +ostraite +Ostrea +ostreaceous +ostreger +ostreicultural +ostreiculture +ostreiculturist +Ostreidae +ostreiform +ostreodynamometer +ostreoid +ostreophage +ostreophagist +ostreophagous +ostrich +ostrichlike +Ostrogoth +Ostrogothian +Ostrogothic +Ostrya +Ostyak +Oswald +Oswegan +otacoustic +otacousticon +Otaheitan +otalgia +otalgic +otalgy +Otaria +otarian +Otariidae +Otariinae +otariine +otarine +otarioid +otary +otate +otectomy +otelcosis +Otello +Othake +othelcosis +Othello +othematoma +othemorrhea +otheoscope +other +otherdom +otherest +othergates +otherguess +otherhow +otherism +otherist +otherness +othersome +othertime +otherwards +otherwhence +otherwhere +otherwhereness +otherwheres +otherwhile +otherwhiles +otherwhither +otherwise +otherwiseness +otherworld +otherworldliness +otherworldly +otherworldness +Othin +Othinism +othmany +Othonna +othygroma +otiant +otiatric +otiatrics +otiatry +otic +oticodinia +Otidae +Otides +Otididae +otidiform +otidine +Otidiphaps +otidium +otiorhynchid +Otiorhynchidae +Otiorhynchinae +otiose +otiosely +otioseness +otiosity +Otis +otitic +otitis +otkon +Oto +otoantritis +otoblennorrhea +otocariasis +otocephalic +otocephaly +otocerebritis +otocleisis +otoconial +otoconite +otoconium +otocrane +otocranial +otocranic +otocranium +Otocyon +otocyst +otocystic +otodynia +otodynic +otoencephalitis +otogenic +otogenous +otographical +otography +Otogyps +otohemineurasthenia +otolaryngologic +otolaryngologist +otolaryngology +otolite +otolith +Otolithidae +Otolithus +otolitic +otological +otologist +otology +Otomaco +otomassage +Otomi +Otomian +Otomitlan +otomucormycosis +otomyces +otomycosis +otonecrectomy +otoneuralgia +otoneurasthenia +otopathic +otopathy +otopharyngeal +otophone +otopiesis +otoplastic +otoplasty +otopolypus +otopyorrhea +otopyosis +otorhinolaryngologic +otorhinolaryngologist +otorhinolaryngology +otorrhagia +otorrhea +otorrhoea +otosalpinx +otosclerosis +otoscope +otoscopic +otoscopy +otosis +otosphenal +otosteal +otosteon +ototomy +Otozoum +ottajanite +ottar +ottavarima +Ottawa +otter +otterer +otterhound +ottinger +ottingkar +Otto +otto +Ottoman +Ottomanean +Ottomanic +Ottomanism +Ottomanization +Ottomanize +Ottomanlike +Ottomite +ottrelife +Ottweilian +Otuquian +oturia +Otus +Otyak +ouabain +ouabaio +ouabe +ouachitite +ouakari +ouananiche +oubliette +ouch +Oudemian +oudenarde +Oudenodon +oudenodont +ouenite +ouf +ough +ought +oughtness +oughtnt +Ouija +ouistiti +oukia +oulap +ounce +ounds +ouphe +ouphish +our +Ouranos +ourie +ouroub +Ourouparia +ours +ourself +ourselves +oust +ouster +out +outact +outadmiral +Outagami +outage +outambush +outarde +outargue +outask +outawe +outbabble +outback +outbacker +outbake +outbalance +outban +outbanter +outbar +outbargain +outbark +outbawl +outbeam +outbear +outbearing +outbeg +outbeggar +outbelch +outbellow +outbent +outbetter +outbid +outbidder +outbirth +outblacken +outblaze +outbleat +outbleed +outbless +outbloom +outblossom +outblot +outblow +outblowing +outblown +outbluff +outblunder +outblush +outbluster +outboard +outboast +outbolting +outbond +outbook +outborn +outborough +outbound +outboundaries +outbounds +outbow +outbowed +outbowl +outbox +outbrag +outbranch +outbranching +outbrave +outbray +outbrazen +outbreak +outbreaker +outbreaking +outbreath +outbreathe +outbreather +outbred +outbreed +outbreeding +outbribe +outbridge +outbring +outbrother +outbud +outbuild +outbuilding +outbulge +outbulk +outbully +outburn +outburst +outbustle +outbuy +outbuzz +outby +outcant +outcaper +outcarol +outcarry +outcase +outcast +outcaste +outcasting +outcastness +outcavil +outchamber +outcharm +outchase +outchatter +outcheat +outchide +outcity +outclamor +outclass +outclerk +outclimb +outcome +outcomer +outcoming +outcompass +outcomplete +outcompliment +outcorner +outcountry +outcourt +outcrawl +outcricket +outcrier +outcrop +outcropper +outcross +outcrossing +outcrow +outcrowd +outcry +outcull +outcure +outcurse +outcurve +outcut +outdaciousness +outdance +outdare +outdate +outdated +outdazzle +outdevil +outdispatch +outdistance +outdistrict +outdo +outdodge +outdoer +outdoor +outdoorness +outdoors +outdoorsman +outdraft +outdragon +outdraw +outdream +outdress +outdrink +outdrive +outdure +outdwell +outdweller +outdwelling +outeat +outecho +outed +outedge +outen +outer +outerly +outermost +outerness +outerwear +outeye +outeyed +outfable +outface +outfall +outfame +outfangthief +outfast +outfawn +outfeast +outfeat +outfeeding +outfence +outferret +outfiction +outfield +outfielder +outfieldsman +outfight +outfighter +outfighting +outfigure +outfish +outfit +outfitter +outflame +outflank +outflanker +outflanking +outflare +outflash +outflatter +outfling +outfloat +outflourish +outflow +outflue +outflung +outflunky +outflush +outflux +outfly +outfold +outfool +outfoot +outform +outfort +outfreeman +outfront +outfroth +outfrown +outgabble +outgain +outgallop +outgamble +outgame +outgang +outgarment +outgarth +outgas +outgate +outgauge +outgaze +outgeneral +outgive +outgiving +outglad +outglare +outgleam +outglitter +outgloom +outglow +outgnaw +outgo +outgoer +outgoing +outgoingness +outgone +outgreen +outgrin +outground +outgrow +outgrowing +outgrowth +outguard +outguess +outgun +outgush +outhammer +outhasten +outhaul +outhauler +outhear +outheart +outhector +outheel +outher +outhire +outhiss +outhit +outhold +outhorror +outhouse +outhousing +outhowl +outhue +outhumor +outhunt +outhurl +outhut +outhymn +outhyperbolize +outimage +outing +outinvent +outish +outissue +outjazz +outjest +outjet +outjetting +outjinx +outjockey +outjourney +outjuggle +outjump +outjut +outkeeper +outkick +outkill +outking +outkiss +outkitchen +outknave +outknee +outlabor +outlaid +outlance +outland +outlander +outlandish +outlandishlike +outlandishly +outlandishness +outlash +outlast +outlaugh +outlaunch +outlaw +outlawry +outlay +outlean +outleap +outlearn +outlegend +outlength +outlengthen +outler +outlet +outlie +outlier +outlighten +outlimb +outlimn +outline +outlinear +outlined +outlineless +outliner +outlinger +outlip +outlipped +outlive +outliver +outlodging +outlook +outlooker +outlord +outlove +outlung +outluster +outly +outlying +outmagic +outmalaprop +outman +outmaneuver +outmantle +outmarch +outmarriage +outmarry +outmaster +outmatch +outmate +outmeasure +outmerchant +outmiracle +outmode +outmoded +outmost +outmount +outmouth +outmove +outname +outness +outnight +outnoise +outnook +outnumber +outoffice +outoven +outpace +outpage +outpaint +outparagon +outparamour +outparish +outpart +outpass +outpassion +outpath +outpatient +outpay +outpayment +outpeal +outpeep +outpeer +outpension +outpensioner +outpeople +outperform +outpick +outpicket +outpipe +outpitch +outpity +outplace +outplan +outplay +outplayed +outplease +outplod +outplot +outpocketing +outpoint +outpoise +outpoison +outpoll +outpomp +outpop +outpopulate +outporch +outport +outporter +outportion +outpost +outpouching +outpour +outpourer +outpouring +outpractice +outpraise +outpray +outpreach +outpreen +outprice +outprodigy +outproduce +outpromise +outpry +outpull +outpupil +outpurl +outpurse +outpush +output +outputter +outquaff +outquarters +outqueen +outquestion +outquibble +outquote +outrace +outrage +outrageous +outrageously +outrageousness +outrageproof +outrager +outraging +outrail +outrance +outrange +outrank +outrant +outrap +outrate +outraught +outrave +outray +outre +outreach +outread +outreason +outreckon +outredden +outrede +outreign +outrelief +outremer +outreness +outrhyme +outrick +outride +outrider +outriding +outrig +outrigger +outriggered +outriggerless +outrigging +outright +outrightly +outrightness +outring +outrival +outroar +outrogue +outroll +outromance +outrooper +outroot +outrove +outrow +outroyal +outrun +outrunner +outrush +outsail +outsaint +outsally +outsatisfy +outsavor +outsay +outscent +outscold +outscore +outscorn +outscour +outscouring +outscream +outsea +outseam +outsearch +outsee +outseek +outsell +outsentry +outsert +outservant +outset +outsetting +outsettlement +outsettler +outshadow +outshake +outshame +outshape +outsharp +outsharpen +outsheathe +outshift +outshine +outshiner +outshoot +outshot +outshoulder +outshout +outshove +outshow +outshower +outshriek +outshrill +outshut +outside +outsided +outsidedness +outsideness +outsider +outsift +outsigh +outsight +outsin +outsing +outsit +outsize +outsized +outskill +outskip +outskirmish +outskirmisher +outskirt +outskirter +outslander +outslang +outsleep +outslide +outslink +outsmart +outsmell +outsmile +outsnatch +outsnore +outsoar +outsole +outsoler +outsonnet +outsophisticate +outsound +outspan +outsparkle +outspeak +outspeaker +outspeech +outspeed +outspell +outspend +outspent +outspill +outspin +outspirit +outspit +outsplendor +outspoken +outspokenly +outspokenness +outsport +outspout +outspread +outspring +outsprint +outspue +outspurn +outspurt +outstagger +outstair +outstand +outstander +outstanding +outstandingly +outstandingness +outstare +outstart +outstarter +outstartle +outstate +outstation +outstatistic +outstature +outstay +outsteal +outsteam +outstep +outsting +outstink +outstood +outstorm +outstrain +outstream +outstreet +outstretch +outstretcher +outstride +outstrike +outstrip +outstrive +outstroke +outstrut +outstudent +outstudy +outstunt +outsubtle +outsuck +outsucken +outsuffer +outsuitor +outsulk +outsum +outsuperstition +outswagger +outswarm +outswear +outsweep +outsweeping +outsweeten +outswell +outswift +outswim +outswindle +outswing +outswirl +outtaken +outtalent +outtalk +outtask +outtaste +outtear +outtease +outtell +outthieve +outthink +outthreaten +outthrob +outthrough +outthrow +outthrust +outthruster +outthunder +outthwack +outtinkle +outtire +outtoil +outtongue +outtop +outtower +outtrade +outtrail +outtravel +outtrick +outtrot +outtrump +outturn +outturned +outtyrannize +outusure +outvalue +outvanish +outvaunt +outvelvet +outvenom +outvictor +outvie +outvier +outvigil +outvillage +outvillain +outvociferate +outvoice +outvote +outvoter +outvoyage +outwait +outwake +outwale +outwalk +outwall +outwallop +outwander +outwar +outwarble +outward +outwardly +outwardmost +outwardness +outwards +outwash +outwaste +outwatch +outwater +outwave +outwealth +outweapon +outwear +outweary +outweave +outweed +outweep +outweigh +outweight +outwell +outwent +outwhirl +outwick +outwile +outwill +outwind +outwindow +outwing +outwish +outwit +outwith +outwittal +outwitter +outwoe +outwoman +outwood +outword +outwore +outwork +outworker +outworld +outworn +outworth +outwrangle +outwrench +outwrest +outwrestle +outwriggle +outwring +outwrite +outwrought +outyard +outyell +outyelp +outyield +outzany +ouzel +Ova +ova +Ovaherero +oval +ovalbumin +ovalescent +ovaliform +ovalish +ovalization +ovalize +ovally +ovalness +ovaloid +ovalwise +Ovambo +Ovampo +Ovangangela +ovant +ovarial +ovarian +ovarin +ovarioabdominal +ovariocele +ovariocentesis +ovariocyesis +ovariodysneuria +ovariohysterectomy +ovariole +ovariolumbar +ovariorrhexis +ovariosalpingectomy +ovariosteresis +ovariostomy +ovariotomist +ovariotomize +ovariotomy +ovariotubal +ovarious +ovaritis +ovarium +ovary +ovate +ovateconical +ovated +ovately +ovation +ovational +ovationary +ovatoacuminate +ovatoconical +ovatocordate +ovatocylindraceous +ovatodeltoid +ovatoellipsoidal +ovatoglobose +ovatolanceolate +ovatooblong +ovatoorbicular +ovatopyriform +ovatoquadrangular +ovatorotundate +ovatoserrate +ovatotriangular +oven +ovenbird +ovenful +ovenlike +ovenly +ovenman +ovenpeel +ovenstone +ovenware +ovenwise +over +overability +overable +overabound +overabsorb +overabstain +overabstemious +overabstemiousness +overabundance +overabundant +overabundantly +overabuse +overaccentuate +overaccumulate +overaccumulation +overaccuracy +overaccurate +overaccurately +overact +overaction +overactive +overactiveness +overactivity +overacute +overaddiction +overadvance +overadvice +overaffect +overaffirmation +overafflict +overaffliction +overage +overageness +overaggravate +overaggravation +overagitate +overagonize +overall +overalled +overalls +overambitioned +overambitious +overambling +overanalyze +overangelic +overannotate +overanswer +overanxiety +overanxious +overanxiously +overappareled +overappraisal +overappraise +overapprehended +overapprehension +overapprehensive +overapt +overarch +overargue +overarm +overartificial +overartificiality +overassail +overassert +overassertion +overassertive +overassertively +overassertiveness +overassess +overassessment +overassumption +overattached +overattachment +overattention +overattentive +overattentively +overawe +overawful +overawn +overawning +overbake +overbalance +overballast +overbalm +overbanded +overbandy +overbank +overbanked +overbark +overbarren +overbarrenness +overbase +overbaseness +overbashful +overbashfully +overbashfulness +overbattle +overbear +overbearance +overbearer +overbearing +overbearingly +overbearingness +overbeat +overbeating +overbeetling +overbelief +overbend +overbepatched +overberg +overbet +overbias +overbid +overbig +overbigness +overbillow +overbit +overbite +overbitten +overbitter +overbitterly +overbitterness +overblack +overblame +overblaze +overbleach +overblessed +overblessedness +overblind +overblindly +overblithe +overbloom +overblouse +overblow +overblowing +overblown +overboard +overboast +overboastful +overbodice +overboding +overbody +overboil +overbold +overboldly +overboldness +overbook +overbookish +overbooming +overborne +overborrow +overbought +overbound +overbounteous +overbounteously +overbounteousness +overbow +overbowed +overbowl +overbrace +overbragging +overbrained +overbranch +overbrave +overbravely +overbravery +overbray +overbreak +overbreathe +overbred +overbreed +overbribe +overbridge +overbright +overbrightly +overbrightness +overbrilliancy +overbrilliant +overbrilliantly +overbrim +overbrimmingly +overbroaden +overbroil +overbrood +overbrow +overbrown +overbrowse +overbrush +overbrutal +overbrutality +overbrutalize +overbrutally +overbubbling +overbuild +overbuilt +overbulk +overbulky +overbumptious +overburden +overburdeningly +overburdensome +overburn +overburned +overburningly +overburnt +overburst +overburthen +overbusily +overbusiness +overbusy +overbuy +overby +overcall +overcanny +overcanopy +overcap +overcapable +overcapably +overcapacity +overcape +overcapitalization +overcapitalize +overcaptious +overcaptiously +overcaptiousness +overcard +overcare +overcareful +overcarefully +overcareless +overcarelessly +overcarelessness +overcaring +overcarking +overcarry +overcast +overcasting +overcasual +overcasually +overcatch +overcaution +overcautious +overcautiously +overcautiousness +overcentralization +overcentralize +overcertification +overcertify +overchafe +overchannel +overchant +overcharge +overchargement +overcharger +overcharitable +overcharitably +overcharity +overchase +overcheap +overcheaply +overcheapness +overcheck +overcherish +overchidden +overchief +overchildish +overchildishness +overchill +overchlorinate +overchoke +overchrome +overchurch +overcirculate +overcircumspect +overcircumspection +overcivil +overcivility +overcivilization +overcivilize +overclaim +overclamor +overclasp +overclean +overcleanly +overcleanness +overcleave +overclever +overcleverness +overclimb +overcloak +overclog +overclose +overclosely +overcloseness +overclothe +overclothes +overcloud +overcloy +overcluster +overcoached +overcoat +overcoated +overcoating +overcoil +overcold +overcoldly +overcollar +overcolor +overcomable +overcome +overcomer +overcomingly +overcommand +overcommend +overcommon +overcommonly +overcommonness +overcompensate +overcompensation +overcompensatory +overcompetition +overcompetitive +overcomplacency +overcomplacent +overcomplacently +overcomplete +overcomplex +overcomplexity +overcompliant +overcompound +overconcentrate +overconcentration +overconcern +overconcerned +overcondensation +overcondense +overconfidence +overconfident +overconfidently +overconfute +overconquer +overconscientious +overconscious +overconsciously +overconsciousness +overconservatism +overconservative +overconservatively +overconsiderate +overconsiderately +overconsideration +overconsume +overconsumption +overcontented +overcontentedly +overcontentment +overcontract +overcontraction +overcontribute +overcontribution +overcook +overcool +overcoolly +overcopious +overcopiously +overcopiousness +overcorned +overcorrect +overcorrection +overcorrupt +overcorruption +overcorruptly +overcostly +overcount +overcourteous +overcourtesy +overcover +overcovetous +overcovetousness +overcow +overcoy +overcoyness +overcram +overcredit +overcredulity +overcredulous +overcredulously +overcreed +overcreep +overcritical +overcritically +overcriticalness +overcriticism +overcriticize +overcrop +overcross +overcrow +overcrowd +overcrowded +overcrowdedly +overcrowdedness +overcrown +overcrust +overcry +overcull +overcultivate +overcultivation +overculture +overcultured +overcumber +overcunning +overcunningly +overcunningness +overcup +overcured +overcurious +overcuriously +overcuriousness +overcurl +overcurrency +overcurrent +overcurtain +overcustom +overcut +overcutter +overcutting +overdaintily +overdaintiness +overdainty +overdamn +overdance +overdangle +overdare +overdaringly +overdarken +overdash +overdazed +overdazzle +overdeal +overdear +overdearly +overdearness +overdeck +overdecorate +overdecoration +overdecorative +overdeeming +overdeep +overdeepen +overdeeply +overdeliberate +overdeliberation +overdelicacy +overdelicate +overdelicately +overdelicious +overdeliciously +overdelighted +overdelightedly +overdemand +overdemocracy +overdepress +overdepressive +overdescant +overdesire +overdesirous +overdesirousness +overdestructive +overdestructively +overdestructiveness +overdetermination +overdetermined +overdevelop +overdevelopment +overdevoted +overdevotedly +overdevotion +overdiffuse +overdiffusely +overdiffuseness +overdigest +overdignified +overdignifiedly +overdignifiedness +overdignify +overdignity +overdiligence +overdiligent +overdiligently +overdilute +overdilution +overdischarge +overdiscipline +overdiscount +overdiscourage +overdiscouragement +overdistance +overdistant +overdistantly +overdistantness +overdistempered +overdistention +overdiverse +overdiversely +overdiversification +overdiversify +overdiversity +overdo +overdoctrinize +overdoer +overdogmatic +overdogmatically +overdogmatism +overdome +overdominate +overdone +overdoor +overdosage +overdose +overdoubt +overdoze +overdraft +overdrain +overdrainage +overdramatic +overdramatically +overdrape +overdrapery +overdraw +overdrawer +overdream +overdrench +overdress +overdrifted +overdrink +overdrip +overdrive +overdriven +overdroop +overdrowsed +overdry +overdubbed +overdue +overdunged +overdure +overdust +overdye +overeager +overeagerly +overeagerness +overearnest +overearnestly +overearnestness +overeasily +overeasiness +overeasy +overeat +overeaten +overedge +overedit +overeducate +overeducated +overeducation +overeducative +overeffort +overegg +overelaborate +overelaborately +overelaboration +overelate +overelegance +overelegancy +overelegant +overelegantly +overelliptical +overembellish +overembellishment +overembroider +overemotional +overemotionality +overemotionalize +overemphasis +overemphasize +overemphatic +overemphatically +overemphaticness +overempired +overemptiness +overempty +overenter +overenthusiasm +overenthusiastic +overentreat +overentry +overequal +overestimate +overestimation +overexcelling +overexcitability +overexcitable +overexcitably +overexcite +overexcitement +overexercise +overexert +overexerted +overexertedly +overexertedness +overexertion +overexpand +overexpansion +overexpansive +overexpect +overexpectant +overexpectantly +overexpenditure +overexpert +overexplain +overexplanation +overexpose +overexposure +overexpress +overexquisite +overexquisitely +overextend +overextension +overextensive +overextreme +overexuberant +overeye +overeyebrowed +overface +overfacile +overfacilely +overfacility +overfactious +overfactiousness +overfag +overfagged +overfaint +overfaith +overfaithful +overfaithfully +overfall +overfamed +overfamiliar +overfamiliarity +overfamiliarly +overfamous +overfanciful +overfancy +overfar +overfast +overfastidious +overfastidiously +overfastidiousness +overfasting +overfat +overfatigue +overfatten +overfavor +overfavorable +overfavorably +overfear +overfearful +overfearfully +overfearfulness +overfeast +overfeatured +overfed +overfee +overfeed +overfeel +overfellowlike +overfellowly +overfelon +overfeminine +overfeminize +overfertile +overfertility +overfestoon +overfew +overfierce +overfierceness +overfile +overfill +overfilm +overfine +overfinished +overfish +overfit +overfix +overflatten +overfleece +overfleshed +overflexion +overfling +overfloat +overflog +overflood +overflorid +overfloridness +overflourish +overflow +overflowable +overflower +overflowing +overflowingly +overflowingness +overflown +overfluency +overfluent +overfluently +overflush +overflutter +overfly +overfold +overfond +overfondle +overfondly +overfondness +overfoolish +overfoolishly +overfoolishness +overfoot +overforce +overforged +overformed +overforward +overforwardly +overforwardness +overfought +overfoul +overfoully +overfrail +overfrailty +overfranchised +overfrank +overfrankly +overfrankness +overfraught +overfree +overfreedom +overfreely +overfreight +overfrequency +overfrequent +overfrequently +overfret +overfrieze +overfrighted +overfrighten +overfroth +overfrown +overfrozen +overfruited +overfruitful +overfull +overfullness +overfunctioning +overfurnish +overgaiter +overgalled +overgamble +overgang +overgarment +overgarrison +overgaze +overgeneral +overgeneralize +overgenerally +overgenerosity +overgenerous +overgenerously +overgenial +overgeniality +overgentle +overgently +overget +overgifted +overgild +overgilted +overgird +overgirded +overgirdle +overglad +overgladly +overglance +overglass +overglaze +overglide +overglint +overgloom +overgloominess +overgloomy +overglorious +overgloss +overglut +overgo +overgoad +overgod +overgodliness +overgodly +overgood +overgorge +overgovern +overgovernment +overgown +overgrace +overgracious +overgrade +overgrain +overgrainer +overgrasping +overgrateful +overgratefully +overgratification +overgratify +overgratitude +overgraze +overgreasiness +overgreasy +overgreat +overgreatly +overgreatness +overgreed +overgreedily +overgreediness +overgreedy +overgrieve +overgrievous +overgrind +overgross +overgrossly +overgrossness +overground +overgrow +overgrown +overgrowth +overguilty +overgun +overhair +overhalf +overhand +overhanded +overhandicap +overhandle +overhang +overhappy +overharass +overhard +overharden +overhardness +overhardy +overharsh +overharshly +overharshness +overhaste +overhasten +overhastily +overhastiness +overhasty +overhate +overhatted +overhaughty +overhaul +overhauler +overhead +overheadiness +overheadman +overheady +overheap +overhear +overhearer +overheartily +overhearty +overheat +overheatedly +overheave +overheaviness +overheavy +overheight +overheighten +overheinous +overheld +overhelp +overhelpful +overhigh +overhighly +overhill +overhit +overholiness +overhollow +overholy +overhomeliness +overhomely +overhonest +overhonestly +overhonesty +overhonor +overhorse +overhot +overhotly +overhour +overhouse +overhover +overhuge +overhuman +overhumanity +overhumanize +overhung +overhunt +overhurl +overhurriedly +overhurry +overhusk +overhysterical +overidealism +overidealistic +overidle +overidly +overillustrate +overillustration +overimaginative +overimaginativeness +overimitate +overimitation +overimitative +overimitatively +overimport +overimportation +overimpress +overimpressible +overinclinable +overinclination +overinclined +overincrust +overincurious +overindividualism +overindividualistic +overindulge +overindulgence +overindulgent +overindulgently +overindustrialization +overindustrialize +overinflate +overinflation +overinflative +overinfluence +overinfluential +overinform +overink +overinsist +overinsistence +overinsistent +overinsistently +overinsolence +overinsolent +overinsolently +overinstruct +overinstruction +overinsurance +overinsure +overintellectual +overintellectuality +overintense +overintensely +overintensification +overintensity +overinterest +overinterested +overinterestedness +overinventoried +overinvest +overinvestment +overiodize +overirrigate +overirrigation +overissue +overitching +overjacket +overjade +overjaded +overjawed +overjealous +overjealously +overjealousness +overjob +overjocular +overjoy +overjoyful +overjoyfully +overjoyous +overjudge +overjudging +overjudgment +overjudicious +overjump +overjust +overjutting +overkeen +overkeenness +overkeep +overkick +overkind +overkindly +overkindness +overking +overknavery +overknee +overknow +overknowing +overlabor +overlace +overlactation +overlade +overlaid +overlain +overland +Overlander +overlander +overlanguaged +overlap +overlard +overlarge +overlargely +overlargeness +overlascivious +overlast +overlate +overlaudation +overlaudatory +overlaugh +overlaunch +overlave +overlavish +overlavishly +overlax +overlaxative +overlaxly +overlaxness +overlay +overlayer +overlead +overleaf +overlean +overleap +overlearn +overlearned +overlearnedly +overlearnedness +overleather +overleave +overleaven +overleer +overleg +overlegislation +overleisured +overlength +overlettered +overlewd +overlewdly +overlewdness +overliberal +overliberality +overliberally +overlicentious +overlick +overlie +overlier +overlift +overlight +overlighted +overlightheaded +overlightly +overlightsome +overliking +overline +overling +overlinger +overlinked +overlip +overlipping +overlisted +overlisten +overliterary +overlittle +overlive +overliveliness +overlively +overliver +overload +overloath +overlock +overlocker +overlofty +overlogical +overlogically +overlong +overlook +overlooker +overloose +overlord +overlordship +overloud +overloup +overlove +overlover +overlow +overlowness +overloyal +overloyally +overloyalty +overlubricatio +overluscious +overlush +overlustiness +overlusty +overluxuriance +overluxuriant +overluxurious +overly +overlying +overmagnify +overmagnitude +overmajority +overmalapert +overman +overmantel +overmantle +overmany +overmarch +overmark +overmarking +overmarl +overmask +overmast +overmaster +overmasterful +overmasterfully +overmasterfulness +overmastering +overmasteringly +overmatch +overmatter +overmature +overmaturity +overmean +overmeanly +overmeanness +overmeasure +overmeddle +overmeek +overmeekly +overmeekness +overmellow +overmellowness +overmelodied +overmelt +overmerciful +overmercifulness +overmerit +overmerrily +overmerry +overmettled +overmickle +overmighty +overmild +overmill +overminute +overminutely +overminuteness +overmix +overmoccasin +overmodest +overmodestly +overmodesty +overmodulation +overmoist +overmoisten +overmoisture +overmortgage +overmoss +overmost +overmotor +overmount +overmounts +overmourn +overmournful +overmournfully +overmuch +overmuchness +overmultiplication +overmultiply +overmultitude +overname +overnarrow +overnarrowly +overnationalization +overnear +overneat +overneatness +overneglect +overnegligence +overnegligent +overnervous +overnervously +overnervousness +overnet +overnew +overnice +overnicely +overniceness +overnicety +overnigh +overnight +overnimble +overnipping +overnoise +overnotable +overnourish +overnoveled +overnumber +overnumerous +overnumerousness +overnurse +overobedience +overobedient +overobediently +overobese +overobjectify +overoblige +overobsequious +overobsequiously +overobsequiousness +overoffend +overoffensive +overofficered +overofficious +overorder +overornamented +overpained +overpainful +overpainfully +overpainfulness +overpaint +overpamper +overpart +overparted +overpartial +overpartiality +overpartially +overparticular +overparticularly +overpass +overpassionate +overpassionately +overpassionateness +overpast +overpatient +overpatriotic +overpay +overpayment +overpeer +overpending +overpensive +overpensiveness +overpeople +overpepper +overperemptory +overpersuade +overpersuasion +overpert +overpessimism +overpessimistic +overpet +overphysic +overpick +overpicture +overpinching +overpitch +overpitched +overpiteous +overplace +overplaced +overplacement +overplain +overplant +overplausible +overplay +overplease +overplenitude +overplenteous +overplenteously +overplentiful +overplenty +overplot +overplow +overplumb +overplume +overplump +overplumpness +overplus +overply +overpointed +overpoise +overpole +overpolemical +overpolish +overpolitic +overponderous +overpopular +overpopularity +overpopularly +overpopulate +overpopulation +overpopulous +overpopulousness +overpositive +overpossess +overpot +overpotent +overpotential +overpour +overpower +overpowerful +overpowering +overpoweringly +overpoweringness +overpraise +overpray +overpreach +overprecise +overpreciseness +overpreface +overpregnant +overpreoccupation +overpreoccupy +overpress +overpressure +overpresumption +overpresumptuous +overprice +overprick +overprint +overprize +overprizer +overprocrastination +overproduce +overproduction +overproductive +overproficient +overprolific +overprolix +overprominence +overprominent +overprominently +overpromise +overprompt +overpromptly +overpromptness +overprone +overproneness +overpronounced +overproof +overproportion +overproportionate +overproportionated +overproportionately +overproportioned +overprosperity +overprosperous +overprotect +overprotract +overprotraction +overproud +overproudly +overprove +overprovender +overprovide +overprovident +overprovidently +overprovision +overprovocation +overprovoke +overprune +overpublic +overpublicity +overpuff +overpuissant +overpunish +overpunishment +overpurchase +overquantity +overquarter +overquell +overquick +overquickly +overquiet +overquietly +overquietness +overrace +overrack +overrake +overrange +overrank +overrankness +overrapture +overrapturize +overrash +overrashly +overrashness +overrate +overrational +overrationalize +overravish +overreach +overreacher +overreaching +overreachingly +overreachingness +overread +overreader +overreadily +overreadiness +overready +overrealism +overrealistic +overreckon +overrecord +overrefine +overrefined +overrefinement +overreflection +overreflective +overregister +overregistration +overregular +overregularity +overregularly +overregulate +overregulation +overrelax +overreliance +overreliant +overreligion +overreligious +overremiss +overremissly +overremissness +overrennet +overrent +overreplete +overrepletion +overrepresent +overrepresentation +overrepresentative +overreserved +overresolute +overresolutely +overrestore +overrestrain +overretention +overreward +overrich +overriches +overrichness +override +overrife +overrigged +overright +overrighteous +overrighteously +overrighteousness +overrigid +overrigidity +overrigidly +overrigorous +overrigorously +overrim +overriot +overripe +overripely +overripen +overripeness +overrise +overroast +overroll +overroof +overrooted +overrough +overroughly +overroughness +overroyal +overrude +overrudely +overrudeness +overruff +overrule +overruler +overruling +overrulingly +overrun +overrunner +overrunning +overrunningly +overrush +overrusset +overrust +oversad +oversadly +oversadness +oversaid +oversail +oversale +oversaliva +oversalt +oversalty +oversand +oversanded +oversanguine +oversanguinely +oversapless +oversated +oversatisfy +oversaturate +oversaturation +oversauce +oversauciness +oversaucy +oversave +overscare +overscatter +overscented +oversceptical +overscepticism +overscore +overscour +overscratch +overscrawl +overscream +overscribble +overscrub +overscruple +overscrupulosity +overscrupulous +overscrupulously +overscrupulousness +overscurf +overscutched +oversea +overseal +overseam +overseamer +oversearch +overseas +overseason +overseasoned +overseated +oversecure +oversecurely +oversecurity +oversee +overseed +overseen +overseer +overseerism +overseership +overseethe +oversell +oversend +oversensible +oversensibly +oversensitive +oversensitively +oversensitiveness +oversententious +oversentimental +oversentimentalism +oversentimentalize +oversentimentally +overserious +overseriously +overseriousness +overservice +overservile +overservility +overset +oversetter +oversettle +oversettled +oversevere +overseverely +overseverity +oversew +overshade +overshadow +overshadower +overshadowing +overshadowingly +overshadowment +overshake +oversharp +oversharpness +overshave +oversheet +overshelving +overshepherd +overshine +overshirt +overshoe +overshoot +overshort +overshorten +overshortly +overshot +overshoulder +overshowered +overshrink +overshroud +oversick +overside +oversight +oversilence +oversilent +oversilver +oversimple +oversimplicity +oversimplification +oversimplify +oversimply +oversize +oversized +overskim +overskip +overskipper +overskirt +overslack +overslander +overslaugh +overslavish +overslavishly +oversleep +oversleeve +overslide +overslight +overslip +overslope +overslow +overslowly +overslowness +overslur +oversmall +oversman +oversmite +oversmitten +oversmoke +oversmooth +oversmoothly +oversmoothness +oversnow +oversoak +oversoar +oversock +oversoft +oversoftly +oversoftness +oversold +oversolemn +oversolemnity +oversolemnly +oversolicitous +oversolicitously +oversolicitousness +oversoon +oversoothing +oversophisticated +oversophistication +oversorrow +oversorrowed +oversot +oversoul +oversound +oversour +oversourly +oversourness +oversow +overspacious +overspaciousness +overspan +overspangled +oversparing +oversparingly +oversparingness +oversparred +overspatter +overspeak +overspecialization +overspecialize +overspeculate +overspeculation +overspeculative +overspeech +overspeed +overspeedily +overspeedy +overspend +overspill +overspin +oversplash +overspread +overspring +oversprinkle +oversprung +overspun +oversqueak +oversqueamish +oversqueamishness +overstaff +overstaid +overstain +overstale +overstalled +overstand +overstaring +overstate +overstately +overstatement +overstay +overstayal +oversteadfast +oversteadfastness +oversteady +overstep +overstiff +overstiffness +overstifle +overstimulate +overstimulation +overstimulative +overstir +overstitch +overstock +overstoop +overstoping +overstore +overstory +overstout +overstoutly +overstowage +overstowed +overstrain +overstrait +overstraiten +overstraitly +overstraitness +overstream +overstrength +overstress +overstretch +overstrew +overstrict +overstrictly +overstrictness +overstride +overstrident +overstridently +overstrike +overstring +overstriving +overstrong +overstrongly +overstrung +overstud +overstudied +overstudious +overstudiously +overstudiousness +overstudy +overstuff +oversublime +oversubscribe +oversubscriber +oversubscription +oversubtile +oversubtle +oversubtlety +oversubtly +oversufficiency +oversufficient +oversufficiently +oversuperstitious +oversupply +oversure +oversurety +oversurge +oversurviving +oversusceptibility +oversusceptible +oversuspicious +oversuspiciously +overswarm +overswarth +oversway +oversweated +oversweep +oversweet +oversweeten +oversweetly +oversweetness +overswell +overswift +overswim +overswimmer +overswing +overswinging +overswirling +oversystematic +oversystematically +oversystematize +overt +overtakable +overtake +overtaker +overtalk +overtalkative +overtalkativeness +overtalker +overtame +overtamely +overtameness +overtapped +overtare +overtariff +overtarry +overtart +overtask +overtax +overtaxation +overteach +overtechnical +overtechnicality +overtedious +overtediously +overteem +overtell +overtempt +overtenacious +overtender +overtenderly +overtenderness +overtense +overtensely +overtenseness +overtension +overterrible +overtest +overthick +overthin +overthink +overthought +overthoughtful +overthriftily +overthriftiness +overthrifty +overthrong +overthrow +overthrowable +overthrowal +overthrower +overthrust +overthwart +overthwartly +overthwartness +overthwartways +overthwartwise +overtide +overtight +overtightly +overtill +overtimbered +overtime +overtimer +overtimorous +overtimorously +overtimorousness +overtinseled +overtint +overtip +overtipple +overtire +overtiredness +overtitle +overtly +overtness +overtoe +overtoil +overtoise +overtone +overtongued +overtop +overtopple +overtorture +overtower +overtrace +overtrack +overtrade +overtrader +overtrailed +overtrain +overtrample +overtravel +overtread +overtreatment +overtrick +overtrim +overtrouble +overtrue +overtrump +overtrust +overtrustful +overtruthful +overtruthfully +overtumble +overture +overturn +overturnable +overturner +overtutor +overtwine +overtwist +overtype +overuberous +overunionized +overunsuitable +overurbanization +overurge +overuse +overusual +overusually +overvaliant +overvaluable +overvaluation +overvalue +overvariety +overvault +overvehemence +overvehement +overveil +overventilate +overventilation +overventuresome +overventurous +overview +overvoltage +overvote +overwade +overwages +overwake +overwalk +overwander +overward +overwash +overwasted +overwatch +overwatcher +overwater +overwave +overway +overwealth +overwealthy +overweaponed +overwear +overweary +overweather +overweave +overweb +overween +overweener +overweening +overweeningly +overweeningness +overweep +overweigh +overweight +overweightage +overwell +overwelt +overwet +overwetness +overwheel +overwhelm +overwhelmer +overwhelming +overwhelmingly +overwhelmingness +overwhipped +overwhirl +overwhisper +overwide +overwild +overwilily +overwilling +overwillingly +overwily +overwin +overwind +overwing +overwinter +overwiped +overwisdom +overwise +overwisely +overwithered +overwoman +overwomanize +overwomanly +overwood +overwooded +overwoody +overword +overwork +overworld +overworn +overworry +overworship +overwound +overwove +overwoven +overwrap +overwrest +overwrested +overwrestle +overwrite +overwroth +overwrought +overyear +overyoung +overyouthful +overzeal +overzealous +overzealously +overzealousness +ovest +ovey +Ovibos +Ovibovinae +ovibovine +ovicapsular +ovicapsule +ovicell +ovicellular +ovicidal +ovicide +ovicular +oviculated +oviculum +ovicyst +ovicystic +Ovidae +Ovidian +oviducal +oviduct +oviductal +oviferous +ovification +oviform +ovigenesis +ovigenetic +ovigenic +ovigenous +ovigerm +ovigerous +ovile +Ovillus +Ovinae +ovine +ovinia +ovipara +oviparal +oviparity +oviparous +oviparously +oviparousness +oviposit +oviposition +ovipositor +Ovis +ovisac +oviscapt +ovism +ovispermary +ovispermiduct +ovist +ovistic +ovivorous +ovocyte +ovoelliptic +ovoflavin +ovogenesis +ovogenetic +ovogenous +ovogonium +ovoid +ovoidal +ovolemma +ovolo +ovological +ovologist +ovology +ovolytic +ovomucoid +ovoplasm +ovoplasmic +ovopyriform +ovorhomboid +ovorhomboidal +ovotesticular +ovotestis +ovovitellin +Ovovivipara +ovoviviparism +ovoviviparity +ovoviviparous +ovoviviparously +ovoviviparousness +Ovula +ovular +ovularian +ovulary +ovulate +ovulation +ovule +ovuliferous +ovuligerous +ovulist +ovum +ow +owd +owe +owelty +Owen +Owenia +Owenian +Owenism +Owenist +Owenite +Owenize +ower +owerance +owerby +owercome +owergang +owerloup +owertaen +owerword +owght +owing +owk +owl +owldom +owler +owlery +owlet +Owlglass +owlhead +owling +owlish +owlishly +owlishness +owlism +owllight +owllike +Owlspiegle +owly +own +owner +ownerless +ownership +ownhood +ownness +ownself +ownwayish +owregane +owrehip +owrelay +owse +owsen +owser +owtchah +owyheeite +ox +oxacid +oxadiazole +oxalacetic +oxalaldehyde +oxalamid +oxalamide +oxalan +oxalate +oxaldehyde +oxalemia +oxalic +Oxalidaceae +oxalidaceous +Oxalis +oxalite +oxalodiacetic +oxalonitril +oxalonitrile +oxaluramid +oxaluramide +oxalurate +oxaluria +oxaluric +oxalyl +oxalylurea +oxamate +oxamethane +oxamic +oxamid +oxamide +oxamidine +oxammite +oxan +oxanate +oxane +oxanic +oxanilate +oxanilic +oxanilide +oxazine +oxazole +oxbane +oxberry +oxbird +oxbiter +oxblood +oxbow +oxboy +oxbrake +oxcart +oxcheek +oxdiacetic +oxdiazole +oxea +oxeate +oxen +oxeote +oxer +oxetone +oxeye +oxfly +Oxford +Oxfordian +Oxfordism +Oxfordist +oxgang +oxgoad +oxharrow +oxhead +oxheal +oxheart +oxhide +oxhoft +oxhorn +oxhouse +oxhuvud +oxidability +oxidable +oxidant +oxidase +oxidate +oxidation +oxidational +oxidative +oxidator +oxide +oxidic +oxidimetric +oxidimetry +oxidizability +oxidizable +oxidization +oxidize +oxidizement +oxidizer +oxidizing +oxidoreductase +oxidoreduction +oxidulated +oximate +oximation +oxime +oxland +oxlike +oxlip +oxman +oxmanship +oxoindoline +Oxonian +oxonic +oxonium +Oxonolatry +oxozone +oxozonide +oxpecker +oxphony +oxreim +oxshoe +oxskin +oxtail +oxter +oxtongue +oxwort +oxy +oxyacanthine +oxyacanthous +oxyacetylene +oxyacid +Oxyaena +Oxyaenidae +oxyaldehyde +oxyamine +oxyanthracene +oxyanthraquinone +oxyaphia +oxyaster +oxybaphon +Oxybaphus +oxybenzaldehyde +oxybenzene +oxybenzoic +oxybenzyl +oxyberberine +oxyblepsia +oxybromide +oxybutyria +oxybutyric +oxycalcium +oxycalorimeter +oxycamphor +oxycaproic +oxycarbonate +oxycellulose +oxycephalic +oxycephalism +oxycephalous +oxycephaly +oxychlorate +oxychloric +oxychloride +oxycholesterol +oxychromatic +oxychromatin +oxychromatinic +oxycinnamic +oxycobaltammine +Oxycoccus +oxycopaivic +oxycoumarin +oxycrate +oxycyanide +oxydactyl +Oxydendrum +oxydiact +oxyesthesia +oxyether +oxyethyl +oxyfatty +oxyfluoride +oxygas +oxygen +oxygenant +oxygenate +oxygenation +oxygenator +oxygenerator +oxygenic +oxygenicity +oxygenium +oxygenizable +oxygenize +oxygenizement +oxygenizer +oxygenous +oxygeusia +oxygnathous +oxyhalide +oxyhaloid +oxyhematin +oxyhemocyanin +oxyhemoglobin +oxyhexactine +oxyhexaster +oxyhydrate +oxyhydric +oxyhydrogen +oxyiodide +oxyketone +oxyl +Oxylabracidae +Oxylabrax +oxyluciferin +oxyluminescence +oxyluminescent +oxymandelic +oxymel +oxymethylene +oxymoron +oxymuriate +oxymuriatic +oxynaphthoic +oxynaphtoquinone +oxynarcotine +oxyneurin +oxyneurine +oxynitrate +oxyntic +oxyophitic +oxyopia +Oxyopidae +oxyosphresia +oxypetalous +oxyphenol +oxyphenyl +oxyphile +oxyphilic +oxyphilous +oxyphonia +oxyphosphate +oxyphthalic +oxyphyllous +oxyphyte +oxypicric +Oxypolis +oxyproline +oxypropionic +oxypurine +oxypycnos +oxyquinaseptol +oxyquinoline +oxyquinone +oxyrhine +oxyrhinous +oxyrhynch +oxyrhynchous +oxyrhynchus +Oxyrrhyncha +oxyrrhynchid +oxysalicylic +oxysalt +oxystearic +Oxystomata +oxystomatous +oxystome +oxysulphate +oxysulphide +oxyterpene +oxytocia +oxytocic +oxytocin +oxytocous +oxytoluene +oxytoluic +oxytone +oxytonesis +oxytonical +oxytonize +Oxytricha +Oxytropis +oxytylotate +oxytylote +oxyuriasis +oxyuricide +Oxyuridae +oxyurous +oxywelding +Oyana +oyapock +oyer +oyster +oysterage +oysterbird +oystered +oysterer +oysterfish +oystergreen +oysterhood +oysterhouse +oystering +oysterish +oysterishness +oysterlike +oysterling +oysterman +oysterous +oysterroot +oysterseed +oystershell +oysterwife +oysterwoman +Ozan +Ozark +ozarkite +ozena +Ozias +ozobrome +ozocerite +ozokerit +ozokerite +ozonate +ozonation +ozonator +ozone +ozoned +ozonic +ozonide +ozoniferous +ozonification +ozonify +Ozonium +ozonization +ozonize +ozonizer +ozonometer +ozonometry +ozonoscope +ozonoscopic +ozonous +ozophen +ozophene +ozostomia +ozotype +P +p +pa +paal +paar +paauw +Paba +pabble +Pablo +pablo +pabouch +pabular +pabulary +pabulation +pabulatory +pabulous +pabulum +pac +paca +pacable +Pacaguara +pacate +pacation +pacative +pacay +pacaya +Paccanarist +Pacchionian +Pace +pace +paceboard +paced +pacemaker +pacemaking +pacer +pachak +pachisi +pachnolite +pachometer +Pachomian +Pachons +Pacht +pachyacria +pachyaemia +pachyblepharon +pachycarpous +pachycephal +pachycephalia +pachycephalic +pachycephalous +pachycephaly +pachychilia +pachycholia +pachychymia +pachycladous +pachydactyl +pachydactylous +pachydactyly +pachyderm +pachyderma +pachydermal +Pachydermata +pachydermatocele +pachydermatoid +pachydermatosis +pachydermatous +pachydermatously +pachydermia +pachydermial +pachydermic +pachydermoid +pachydermous +pachyemia +pachyglossal +pachyglossate +pachyglossia +pachyglossous +pachyhaemia +pachyhaemic +pachyhaemous +pachyhematous +pachyhemia +pachyhymenia +pachyhymenic +Pachylophus +pachylosis +Pachyma +pachymenia +pachymenic +pachymeningitic +pachymeningitis +pachymeninx +pachymeter +pachynathous +pachynema +pachynsis +pachyntic +pachyodont +pachyotia +pachyotous +pachyperitonitis +pachyphyllous +pachypleuritic +pachypod +pachypodous +pachypterous +Pachyrhizus +pachyrhynchous +pachysalpingitis +Pachysandra +pachysaurian +pachysomia +pachysomous +pachystichous +Pachystima +pachytene +pachytrichous +Pachytylus +pachyvaginitis +pacifiable +pacific +pacifical +pacifically +pacificate +pacification +pacificator +pacificatory +pacificism +pacificist +pacificity +pacifier +pacifism +pacifist +pacifistic +pacifistically +pacify +pacifyingly +Pacinian +pack +packable +package +packbuilder +packcloth +packer +packery +packet +packhouse +packless +packly +packmaker +packmaking +packman +packmanship +packness +packsack +packsaddle +packstaff +packthread +packwall +packwaller +packware +packway +paco +Pacolet +pacouryuva +pact +paction +pactional +pactionally +Pactolian +Pactolus +pad +padcloth +Padda +padder +padding +paddle +paddlecock +paddled +paddlefish +paddlelike +paddler +paddlewood +paddling +paddock +paddockride +paddockstone +paddockstool +Paddy +paddy +paddybird +Paddyism +paddymelon +Paddywack +paddywatch +Paddywhack +paddywhack +padella +padfoot +padge +Padina +padishah +padle +padlike +padlock +padmasana +padmelon +padnag +padpiece +Padraic +Padraig +padre +padroadist +padroado +padronism +padstone +padtree +Paduan +Paduanism +paduasoy +Padus +paean +paeanism +paeanize +paedarchy +paedatrophia +paedatrophy +paediatry +paedogenesis +paedogenetic +paedometer +paedometrical +paedomorphic +paedomorphism +paedonymic +paedonymy +paedopsychologist +paedotribe +paedotrophic +paedotrophist +paedotrophy +paegel +paegle +Paelignian +paenula +paeon +Paeonia +Paeoniaceae +Paeonian +paeonic +paetrick +paga +pagan +Paganalia +Paganalian +pagandom +paganic +paganical +paganically +paganish +paganishly +paganism +paganist +paganistic +paganity +paganization +paganize +paganizer +paganly +paganry +pagatpat +Page +page +pageant +pageanted +pageanteer +pageantic +pageantry +pagedom +pageful +pagehood +pageless +pagelike +pager +pageship +pagina +paginal +paginary +paginate +pagination +pagiopod +Pagiopoda +pagoda +pagodalike +pagodite +pagoscope +pagrus +Paguma +pagurian +pagurid +Paguridae +Paguridea +pagurine +Pagurinea +paguroid +Paguroidea +Pagurus +pagus +pah +paha +Pahareen +Pahari +Paharia +pahi +Pahlavi +pahlavi +pahmi +paho +pahoehoe +Pahouin +pahutan +Paiconeca +paideutic +paideutics +paidological +paidologist +paidology +paidonosology +paigle +paik +pail +pailful +paillasse +paillette +pailletted +pailou +paimaneh +pain +pained +painful +painfully +painfulness +paining +painingly +painkiller +painless +painlessly +painlessness +painproof +painstaker +painstaking +painstakingly +painstakingness +painsworthy +paint +paintability +paintable +paintableness +paintably +paintbox +paintbrush +painted +paintedness +painter +painterish +painterlike +painterly +paintership +paintiness +painting +paintingness +paintless +paintpot +paintproof +paintress +paintrix +paintroot +painty +paip +pair +paired +pairedness +pairer +pairment +pairwise +pais +paisa +paisanite +Paisley +Paiute +paiwari +pajahuello +pajama +pajamaed +pajock +Pajonism +Pakawa +Pakawan +pakchoi +pakeha +Pakhpuluk +Pakhtun +Pakistani +paktong +pal +Pala +palace +palaced +palacelike +palaceous +palaceward +palacewards +paladin +palaeanthropic +Palaearctic +Palaeechini +palaeechinoid +Palaeechinoidea +palaeechinoidean +palaeentomology +palaeethnologic +palaeethnological +palaeethnologist +palaeethnology +Palaeeudyptes +Palaeic +palaeichthyan +Palaeichthyes +palaeichthyic +Palaemon +palaemonid +Palaemonidae +palaemonoid +palaeoalchemical +palaeoanthropic +palaeoanthropography +palaeoanthropology +Palaeoanthropus +palaeoatavism +palaeoatavistic +palaeobiogeography +palaeobiologist +palaeobiology +palaeobotanic +palaeobotanical +palaeobotanically +palaeobotanist +palaeobotany +Palaeocarida +palaeoceanography +Palaeocene +palaeochorology +palaeoclimatic +palaeoclimatology +Palaeoconcha +palaeocosmic +palaeocosmology +Palaeocrinoidea +palaeocrystal +palaeocrystallic +palaeocrystalline +palaeocrystic +palaeocyclic +palaeodendrologic +palaeodendrological +palaeodendrologically +palaeodendrologist +palaeodendrology +Palaeodictyoptera +palaeodictyopteran +palaeodictyopteron +palaeodictyopterous +palaeoencephalon +palaeoeremology +palaeoethnic +palaeoethnologic +palaeoethnological +palaeoethnologist +palaeoethnology +palaeofauna +Palaeogaea +Palaeogaean +palaeogene +palaeogenesis +palaeogenetic +palaeogeographic +palaeogeography +palaeoglaciology +palaeoglyph +Palaeognathae +palaeognathic +palaeognathous +palaeograph +palaeographer +palaeographic +palaeographical +palaeographically +palaeographist +palaeography +palaeoherpetologist +palaeoherpetology +palaeohistology +palaeohydrography +palaeolatry +palaeolimnology +palaeolith +palaeolithic +palaeolithical +palaeolithist +palaeolithoid +palaeolithy +palaeological +palaeologist +palaeology +Palaeomastodon +palaeometallic +palaeometeorological +palaeometeorology +Palaeonemertea +palaeonemertean +palaeonemertine +Palaeonemertinea +Palaeonemertini +palaeoniscid +Palaeoniscidae +palaeoniscoid +Palaeoniscum +Palaeoniscus +palaeontographic +palaeontographical +palaeontography +palaeopathology +palaeopedology +palaeophile +palaeophilist +Palaeophis +palaeophysiography +palaeophysiology +palaeophytic +palaeophytological +palaeophytologist +palaeophytology +palaeoplain +palaeopotamology +palaeopsychic +palaeopsychological +palaeopsychology +palaeoptychology +Palaeornis +Palaeornithinae +palaeornithine +palaeornithological +palaeornithology +palaeosaur +Palaeosaurus +palaeosophy +Palaeospondylus +Palaeostraca +palaeostracan +palaeostriatal +palaeostriatum +palaeostylic +palaeostyly +palaeotechnic +palaeothalamus +Palaeothentes +Palaeothentidae +palaeothere +palaeotherian +Palaeotheriidae +palaeotheriodont +palaeotherioid +Palaeotherium +palaeotheroid +Palaeotropical +palaeotype +palaeotypic +palaeotypical +palaeotypically +palaeotypographical +palaeotypographist +palaeotypography +palaeovolcanic +Palaeozoic +palaeozoological +palaeozoologist +palaeozoology +palaestra +palaestral +palaestrian +palaestric +palaestrics +palaetiological +palaetiologist +palaetiology +palafitte +palagonite +palagonitic +Palaic +Palaihnihan +palaiotype +palaite +palama +palamate +palame +Palamedea +palamedean +Palamedeidae +Palamite +Palamitism +palampore +palander +palanka +palankeen +palanquin +palapalai +Palapteryx +Palaquium +palar +palas +palatability +palatable +palatableness +palatably +palatal +palatalism +palatality +palatalization +palatalize +palate +palated +palateful +palatefulness +palateless +palatelike +palatial +palatially +palatialness +palatian +palatic +palatinal +palatinate +palatine +palatineship +Palatinian +palatinite +palation +palatist +palatitis +palative +palatization +palatize +palatoalveolar +palatodental +palatoglossal +palatoglossus +palatognathous +palatogram +palatograph +palatography +palatomaxillary +palatometer +palatonasal +palatopharyngeal +palatopharyngeus +palatoplasty +palatoplegia +palatopterygoid +palatoquadrate +palatorrhaphy +palatoschisis +Palatua +Palau +Palaung +palaver +palaverer +palaverist +palaverment +palaverous +palay +palazzi +palberry +palch +pale +palea +paleaceous +paleanthropic +Palearctic +paleate +palebelly +palebuck +palechinoid +paled +paledness +paleencephalon +paleentomology +paleethnographer +paleethnologic +paleethnological +paleethnologist +paleethnology +paleface +palehearted +paleichthyologic +paleichthyologist +paleichthyology +paleiform +palely +Paleman +paleness +Palenque +paleoalchemical +paleoandesite +paleoanthropic +paleoanthropography +paleoanthropological +paleoanthropologist +paleoanthropology +Paleoanthropus +paleoatavism +paleoatavistic +paleobiogeography +paleobiologist +paleobiology +paleobotanic +paleobotanical +paleobotanically +paleobotanist +paleobotany +paleoceanography +Paleocene +paleochorology +paleoclimatic +paleoclimatologist +paleoclimatology +Paleoconcha +paleocosmic +paleocosmology +paleocrystal +paleocrystallic +paleocrystalline +paleocrystic +paleocyclic +paleodendrologic +paleodendrological +paleodendrologically +paleodendrologist +paleodendrology +paleoecologist +paleoecology +paleoencephalon +paleoeremology +paleoethnic +paleoethnography +paleoethnologic +paleoethnological +paleoethnologist +paleoethnology +paleofauna +Paleogene +paleogenesis +paleogenetic +paleogeographic +paleogeography +paleoglaciology +paleoglyph +paleograph +paleographer +paleographic +paleographical +paleographically +paleographist +paleography +paleoherpetologist +paleoherpetology +paleohistology +paleohydrography +paleoichthyology +paleokinetic +paleola +paleolate +paleolatry +paleolimnology +paleolith +paleolithic +paleolithical +paleolithist +paleolithoid +paleolithy +paleological +paleologist +paleology +paleomammalogy +paleometallic +paleometeorological +paleometeorology +paleontographic +paleontographical +paleontography +paleontologic +paleontological +paleontologically +paleontologist +paleontology +paleopathology +paleopedology +paleophysiography +paleophysiology +paleophytic +paleophytological +paleophytologist +paleophytology +paleopicrite +paleoplain +paleopotamoloy +paleopsychic +paleopsychological +paleopsychology +paleornithological +paleornithology +paleostriatal +paleostriatum +paleostylic +paleostyly +paleotechnic +paleothalamus +paleothermal +paleothermic +Paleotropical +paleovolcanic +paleoytterbium +Paleozoic +paleozoological +paleozoologist +paleozoology +paler +Palermitan +Palermo +Pales +Palesman +Palestinian +palestra +palestral +palestrian +palestric +palet +paletiology +paletot +palette +paletz +palewise +palfrey +palfreyed +palgat +Pali +pali +Palicourea +palification +paliform +paligorskite +palikar +palikarism +palikinesia +palila +palilalia +Palilia +Palilicium +palillogia +palilogetic +palilogy +palimbacchic +palimbacchius +palimpsest +palimpsestic +palinal +palindrome +palindromic +palindromical +palindromically +palindromist +paling +palingenesia +palingenesian +palingenesis +palingenesist +palingenesy +palingenetic +palingenetically +palingenic +palingenist +palingeny +palinode +palinodial +palinodic +palinodist +palinody +palinurid +Palinuridae +palinuroid +Palinurus +paliphrasia +palirrhea +palisade +palisading +palisado +palisander +palisfy +palish +palistrophia +Paliurus +palkee +pall +palla +palladammine +Palladia +palladia +Palladian +Palladianism +palladic +palladiferous +palladinize +palladion +palladious +Palladium +palladium +palladiumize +palladize +palladodiammine +palladosammine +palladous +pallae +pallah +pallall +pallanesthesia +Pallas +pallasite +pallbearer +palled +pallescence +pallescent +pallesthesia +pallet +palleting +palletize +pallette +pallholder +palli +pallial +palliard +palliasse +Palliata +palliata +palliate +palliation +palliative +palliatively +palliator +palliatory +pallid +pallidiflorous +pallidipalpate +palliditarsate +pallidity +pallidiventrate +pallidly +pallidness +palliness +Palliobranchiata +palliobranchiate +palliocardiac +pallioessexite +pallion +palliopedal +palliostratus +pallium +Palliyan +pallograph +pallographic +pallometric +pallone +pallor +Pallu +Palluites +pallwise +pally +palm +palma +Palmaceae +palmaceous +palmad +Palmae +palmanesthesia +palmar +palmarian +palmary +palmate +palmated +palmately +palmatifid +palmatiform +palmatilobate +palmatilobed +palmation +palmatiparted +palmatipartite +palmatisect +palmatisected +palmature +palmcrist +palmed +Palmella +Palmellaceae +palmellaceous +palmelloid +palmer +palmerite +palmery +palmesthesia +palmette +palmetto +palmetum +palmful +palmicolous +palmiferous +palmification +palmiform +palmigrade +palmilobate +palmilobated +palmilobed +palminervate +palminerved +palmiped +Palmipedes +palmipes +palmist +palmister +palmistry +palmitate +palmite +palmitic +palmitin +palmitinic +palmito +palmitoleic +palmitone +palmiveined +palmivorous +palmlike +palmo +palmodic +palmoscopy +palmospasmus +palmula +palmus +palmwise +palmwood +palmy +palmyra +Palmyrene +Palmyrenian +palolo +palombino +palometa +palomino +palosapis +palouser +paloverde +palp +palpability +palpable +palpableness +palpably +palpacle +palpal +palpate +palpation +palpatory +palpebra +palpebral +palpebrate +palpebration +palpebritis +palped +palpi +palpicorn +Palpicornia +palpifer +palpiferous +palpiform +palpiger +palpigerous +palpitant +palpitate +palpitatingly +palpitation +palpless +palpocil +palpon +palpulus +palpus +palsgrave +palsgravine +palsied +palsification +palstave +palster +palsy +palsylike +palsywort +palt +Palta +palter +palterer +palterly +paltrily +paltriness +paltry +paludal +paludament +paludamentum +paludial +paludian +paludic +Paludicella +Paludicolae +paludicole +paludicoline +paludicolous +paludiferous +Paludina +paludinal +paludine +paludinous +paludism +paludose +paludous +paludrin +paludrine +palule +palulus +Palus +palus +palustral +palustrian +palustrine +paly +palynology +Pam +pam +pambanmanche +Pamela +pament +pameroon +Pamir +Pamiri +Pamirian +Pamlico +pamment +Pampanga +Pampangan +Pampango +pampas +pampean +pamper +pampered +pamperedly +pamperedness +pamperer +pamperize +pampero +pamphagous +pampharmacon +Pamphiliidae +Pamphilius +pamphlet +pamphletage +pamphletary +pamphleteer +pamphleter +pamphletful +pamphletic +pamphletical +pamphletize +pamphletwise +pamphysical +pamphysicism +pampilion +pampiniform +pampinocele +pamplegia +pampootee +pampootie +pampre +pamprodactyl +pamprodactylism +pamprodactylous +pampsychism +pampsychist +Pamunkey +Pan +pan +panace +Panacea +panacea +panacean +panaceist +panache +panached +panachure +panada +panade +Panagia +panagiarion +Panak +Panaka +panama +Panamaian +Panaman +Panamanian +Panamano +Panamic +Panamint +Panamist +panapospory +panarchic +panarchy +panaris +panaritium +panarteritis +panarthritis +panary +panatela +Panathenaea +Panathenaean +Panathenaic +panatrophy +panautomorphic +panax +Panayan +Panayano +panbabylonian +panbabylonism +Panboeotian +pancake +pancarditis +panchama +panchayat +pancheon +panchion +panchromatic +panchromatism +panchromatization +panchromatize +panchway +panclastic +panconciliatory +pancosmic +pancosmism +pancosmist +pancratian +pancratiast +pancratiastic +pancratic +pancratical +pancratically +pancration +pancratism +pancratist +pancratium +pancreas +pancreatalgia +pancreatectomize +pancreatectomy +pancreatemphraxis +pancreathelcosis +pancreatic +pancreaticoduodenal +pancreaticoduodenostomy +pancreaticogastrostomy +pancreaticosplenic +pancreatin +pancreatism +pancreatitic +pancreatitis +pancreatization +pancreatize +pancreatoduodenectomy +pancreatoenterostomy +pancreatogenic +pancreatogenous +pancreatoid +pancreatolipase +pancreatolith +pancreatomy +pancreatoncus +pancreatopathy +pancreatorrhagia +pancreatotomy +pancreectomy +pancreozymin +pancyclopedic +pand +panda +pandal +pandan +Pandanaceae +pandanaceous +Pandanales +Pandanus +pandaram +Pandarctos +pandaric +Pandarus +pandation +Pandean +pandect +Pandectist +pandemia +pandemian +pandemic +pandemicity +pandemoniac +Pandemoniacal +Pandemonian +pandemonic +pandemonism +Pandemonium +pandemonium +Pandemos +pandemy +pandenominational +pander +panderage +panderer +panderess +panderism +panderize +panderly +Panderma +pandermite +panderous +pandership +pandestruction +pandiabolism +pandiculation +Pandion +Pandionidae +pandita +pandle +pandlewhew +Pandora +pandora +Pandorea +Pandoridae +Pandorina +Pandosto +pandour +pandowdy +pandrop +pandura +pandurate +pandurated +panduriform +pandy +pane +panecclesiastical +paned +panegoism +panegoist +panegyric +panegyrical +panegyrically +panegyricize +panegyricon +panegyricum +panegyris +panegyrist +panegyrize +panegyrizer +panegyry +paneity +panel +panela +panelation +paneler +paneless +paneling +panelist +panellation +panelling +panelwise +panelwork +panentheism +panesthesia +panesthetic +paneulogism +panfil +panfish +panful +pang +Pangaea +pangamic +pangamous +pangamously +pangamy +pangane +Pangasinan +pangen +pangene +pangenesis +pangenetic +pangenetically +pangenic +pangful +pangi +Pangium +pangless +panglessly +panglima +Pangloss +Panglossian +Panglossic +pangolin +pangrammatist +Pangwe +panhandle +panhandler +panharmonic +panharmonicon +panhead +panheaded +Panhellenic +Panhellenios +Panhellenism +Panhellenist +Panhellenium +panhidrosis +panhuman +panhygrous +panhyperemia +panhysterectomy +Pani +panic +panical +panically +panicful +panichthyophagous +panicked +panicky +panicle +panicled +paniclike +panicmonger +panicmongering +paniconograph +paniconographic +paniconography +Panicularia +paniculate +paniculated +paniculately +paniculitis +Panicum +panidiomorphic +panidrosis +panification +panimmunity +Paninean +Panionia +Panionian +Panionic +Paniquita +Paniquitan +panisc +panisca +paniscus +panisic +panivorous +Panjabi +panjandrum +pank +pankin +pankration +panleucopenia +panlogical +panlogism +panlogistical +panman +panmelodicon +panmelodion +panmerism +panmeristic +panmixia +panmixy +panmnesia +panmug +panmyelophthisis +Panna +pannade +pannage +pannam +pannationalism +panne +pannel +panner +pannery +panneuritic +panneuritis +pannicle +pannicular +pannier +panniered +pannierman +pannikin +panning +Pannonian +Pannonic +pannose +pannosely +pannum +pannus +pannuscorium +Panoan +panocha +panoche +panococo +panoistic +panomphaic +panomphean +panomphic +panophobia +panophthalmia +panophthalmitis +panoplied +panoplist +panoply +panoptic +panoptical +panopticon +panoram +panorama +panoramic +panoramical +panoramically +panoramist +panornithic +Panorpa +Panorpatae +panorpian +panorpid +Panorpidae +Panos +panosteitis +panostitis +panotitis +panotype +panouchi +panpathy +panpharmacon +panphenomenalism +panphobia +Panpipe +panplegia +panpneumatism +panpolism +panpsychic +panpsychism +panpsychist +panpsychistic +panscientist +pansciolism +pansciolist +pansclerosis +pansclerotic +panse +pansexism +pansexual +pansexualism +pansexualist +pansexuality +pansexualize +panshard +panside +pansideman +pansied +pansinuitis +pansinusitis +pansmith +pansophic +pansophical +pansophically +pansophism +pansophist +pansophy +panspermatism +panspermatist +panspermia +panspermic +panspermism +panspermist +panspermy +pansphygmograph +panstereorama +pansy +pansylike +pant +pantachromatic +pantacosm +pantagamy +pantagogue +pantagraph +pantagraphic +pantagraphical +Pantagruel +Pantagruelian +Pantagruelic +Pantagruelically +Pantagrueline +pantagruelion +Pantagruelism +Pantagruelist +Pantagruelistic +Pantagruelistical +Pantagruelize +pantaleon +pantaletless +pantalets +pantaletted +pantalgia +pantalon +Pantalone +pantaloon +pantalooned +pantaloonery +pantaloons +pantameter +pantamorph +pantamorphia +pantamorphic +pantanemone +pantanencephalia +pantanencephalic +pantaphobia +pantarbe +pantarchy +pantas +pantascope +pantascopic +Pantastomatida +Pantastomina +pantatrophia +pantatrophy +pantatype +pantechnic +pantechnicon +pantelegraph +pantelegraphy +panteleologism +pantelephone +pantelephonic +Pantelis +pantellerite +panter +panterer +Pantheian +pantheic +pantheism +pantheist +pantheistic +pantheistical +pantheistically +panthelematism +panthelism +pantheologist +pantheology +pantheon +pantheonic +pantheonization +pantheonize +panther +pantheress +pantherine +pantherish +pantherlike +pantherwood +pantheum +pantie +panties +pantile +pantiled +pantiling +panting +pantingly +pantisocracy +pantisocrat +pantisocratic +pantisocratical +pantisocratist +pantle +pantler +panto +pantochrome +pantochromic +pantochromism +pantochronometer +Pantocrator +pantod +Pantodon +Pantodontidae +pantoffle +pantofle +pantoganglitis +pantogelastic +pantoglossical +pantoglot +pantoglottism +pantograph +pantographer +pantographic +pantographical +pantographically +pantography +pantoiatrical +pantologic +pantological +pantologist +pantology +pantomancer +pantometer +pantometric +pantometrical +pantometry +pantomime +pantomimic +pantomimical +pantomimically +pantomimicry +pantomimish +pantomimist +pantomimus +pantomnesia +pantomnesic +pantomorph +pantomorphia +pantomorphic +panton +pantoon +pantopelagian +pantophagic +pantophagist +pantophagous +pantophagy +pantophile +pantophobia +pantophobic +pantophobous +pantoplethora +pantopod +Pantopoda +pantopragmatic +pantopterous +pantoscope +pantoscopic +pantosophy +Pantostomata +pantostomate +pantostomatous +pantostome +pantotactic +pantothenate +pantothenic +Pantotheria +pantotherian +pantotype +pantoum +pantropic +pantropical +pantry +pantryman +pantrywoman +pants +pantun +panty +pantywaist +panung +panurgic +panurgy +panyar +Panzer +panzoism +panzootia +panzootic +panzooty +Paola +paolo +paon +pap +papa +papability +papable +papabot +papacy +papagallo +Papago +papain +papal +papalism +papalist +papalistic +papalization +papalize +papalizer +papally +papalty +papane +papaphobia +papaphobist +papaprelatical +papaprelatist +paparchical +paparchy +papaship +Papaver +Papaveraceae +papaveraceous +Papaverales +papaverine +papaverous +papaw +papaya +Papayaceae +papayaceous +papayotin +papboat +pape +papelonne +paper +paperback +paperbark +paperboard +papered +paperer +paperful +paperiness +papering +paperlike +papermaker +papermaking +papermouth +papern +papershell +paperweight +papery +papess +papeterie +papey +Paphian +Paphiopedilum +Papiamento +papicolar +papicolist +Papilio +Papilionaceae +papilionaceous +Papiliones +papilionid +Papilionidae +Papilionides +Papilioninae +papilionine +papilionoid +Papilionoidea +papilla +papillae +papillar +papillary +papillate +papillated +papillectomy +papilledema +papilliferous +papilliform +papillitis +papilloadenocystoma +papillocarcinoma +papilloedema +papilloma +papillomatosis +papillomatous +papillon +papilloretinitis +papillosarcoma +papillose +papillosity +papillote +papillous +papillulate +papillule +Papinachois +Papio +papion +papish +papisher +papism +Papist +papist +papistic +papistical +papistically +papistlike +papistly +papistry +papize +papless +papmeat +papolater +papolatrous +papolatry +papoose +papooseroot +Pappea +pappescent +pappi +pappiferous +pappiform +pappose +pappox +pappus +pappy +papreg +paprica +paprika +Papuan +papula +papular +papulate +papulated +papulation +papule +papuliferous +papuloerythematous +papulopustular +papulopustule +papulose +papulosquamous +papulous +papulovesicular +papyr +papyraceous +papyral +papyrean +papyri +papyrian +papyrin +papyrine +papyritious +papyrocracy +papyrograph +papyrographer +papyrographic +papyrography +papyrological +papyrologist +papyrology +papyrophobia +papyroplastics +papyrotamia +papyrotint +papyrotype +papyrus +Paque +paquet +par +para +paraaminobenzoic +parabanate +parabanic +parabaptism +parabaptization +parabasal +parabasic +parabasis +parabema +parabematic +parabenzoquinone +parabiosis +parabiotic +parablast +parablastic +parable +parablepsia +parablepsis +parablepsy +parableptic +parabola +parabolanus +parabolic +parabolical +parabolicalism +parabolically +parabolicness +paraboliform +parabolist +parabolization +parabolize +parabolizer +paraboloid +paraboloidal +parabomb +parabotulism +parabranchia +parabranchial +parabranchiate +parabulia +parabulic +paracanthosis +paracarmine +paracasein +paracaseinate +Paracelsian +Paracelsianism +Paracelsic +Paracelsist +Paracelsistic +Paracelsus +paracentesis +paracentral +paracentric +paracentrical +paracephalus +paracerebellar +paracetaldehyde +parachaplain +paracholia +parachor +parachordal +parachrea +parachroia +parachroma +parachromatism +parachromatophorous +parachromatopsia +parachromatosis +parachrome +parachromoparous +parachromophoric +parachromophorous +parachronism +parachronistic +parachrose +parachute +parachutic +parachutism +parachutist +paraclete +paracmasis +paracme +paracoele +paracoelian +paracolitis +paracolon +paracolpitis +paracolpium +paracondyloid +paracone +paraconic +paraconid +paraconscious +paracorolla +paracotoin +paracoumaric +paracresol +Paracress +paracusia +paracusic +paracyanogen +paracyesis +paracymene +paracystic +paracystitis +paracystium +parade +paradeful +paradeless +paradelike +paradenitis +paradental +paradentitis +paradentium +parader +paraderm +paradiastole +paradiazine +paradichlorbenzene +paradichlorbenzol +paradichlorobenzene +paradichlorobenzol +paradidymal +paradidymis +paradigm +paradigmatic +paradigmatical +paradigmatically +paradigmatize +parading +paradingly +paradiplomatic +paradisaic +paradisaically +paradisal +paradise +Paradisea +paradisean +Paradiseidae +Paradiseinae +Paradisia +paradisiac +paradisiacal +paradisiacally +paradisial +paradisian +paradisic +paradisical +parado +paradoctor +parados +paradoses +paradox +paradoxal +paradoxer +paradoxial +paradoxic +paradoxical +paradoxicalism +paradoxicality +paradoxically +paradoxicalness +paradoxician +Paradoxides +paradoxidian +paradoxism +paradoxist +paradoxographer +paradoxographical +paradoxology +paradoxure +Paradoxurinae +paradoxurine +Paradoxurus +paradoxy +paradromic +paraenesis +paraenesize +paraenetic +paraenetical +paraengineer +paraffin +paraffine +paraffiner +paraffinic +paraffinize +paraffinoid +paraffiny +paraffle +parafle +parafloccular +paraflocculus +paraform +paraformaldehyde +parafunction +paragammacism +paraganglion +paragaster +paragastral +paragastric +paragastrula +paragastrular +parage +paragenesia +paragenesis +paragenetic +paragenic +paragerontic +parageusia +parageusic +parageusis +paragglutination +paraglenal +paraglobin +paraglobulin +paraglossa +paraglossal +paraglossate +paraglossia +paraglycogen +paragnath +paragnathism +paragnathous +paragnathus +paragneiss +paragnosia +paragoge +paragogic +paragogical +paragogically +paragogize +paragon +paragonimiasis +Paragonimus +paragonite +paragonitic +paragonless +paragram +paragrammatist +paragraph +paragrapher +paragraphia +paragraphic +paragraphical +paragraphically +paragraphism +paragraphist +paragraphistical +paragraphize +Paraguay +Paraguayan +parah +paraheliotropic +paraheliotropism +parahematin +parahemoglobin +parahepatic +Parahippus +parahopeite +parahormone +parahydrogen +paraiba +Paraiyan +parakeet +parakeratosis +parakilya +parakinesia +parakinetic +paralactate +paralalia +paralambdacism +paralambdacismus +paralaurionite +paraldehyde +parale +paralectotype +paraleipsis +paralepsis +paralexia +paralexic +paralgesia +paralgesic +paralinin +paralipomena +Paralipomenon +paralipsis +paralitical +parallactic +parallactical +parallactically +parallax +parallel +parallelable +parallelepiped +parallelepipedal +parallelepipedic +parallelepipedon +parallelepipedonal +paralleler +parallelinervate +parallelinerved +parallelinervous +parallelism +parallelist +parallelistic +parallelith +parallelization +parallelize +parallelizer +parallelless +parallelly +parallelodrome +parallelodromous +parallelogram +parallelogrammatic +parallelogrammatical +parallelogrammic +parallelogrammical +parallelograph +parallelometer +parallelopiped +parallelopipedon +parallelotropic +parallelotropism +parallelwise +parallepipedous +paralogia +paralogical +paralogician +paralogism +paralogist +paralogistic +paralogize +paralogy +paraluminite +paralyses +paralysis +paralytic +paralytical +paralytically +paralyzant +paralyzation +paralyze +paralyzedly +paralyzer +paralyzingly +param +paramagnet +paramagnetic +paramagnetism +paramandelic +paramarine +paramastigate +paramastitis +paramastoid +paramatta +Paramecidae +Paramecium +paramedian +paramelaconite +paramenia +parament +paramere +parameric +parameron +paramese +paramesial +parameter +parametric +parametrical +parametritic +parametritis +parametrium +paramide +paramilitary +paramimia +paramine +paramiographer +paramitome +paramnesia +paramo +Paramoecium +paramorph +paramorphia +paramorphic +paramorphine +paramorphism +paramorphosis +paramorphous +paramount +paramountcy +paramountly +paramountness +paramountship +paramour +paramuthetic +paramyelin +paramylum +paramyoclonus +paramyosinogen +paramyotone +paramyotonia +paranasal +paranatellon +parandrus +paranema +paranematic +paranephric +paranephritic +paranephritis +paranephros +paranepionic +paranete +parang +paranitraniline +paranitrosophenol +paranoia +paranoiac +paranoid +paranoidal +paranoidism +paranomia +paranormal +paranosic +paranthelion +paranthracene +Paranthropus +paranuclear +paranucleate +paranucleic +paranuclein +paranucleinic +paranucleus +paranymph +paranymphal +parao +paraoperation +Parapaguridae +paraparesis +paraparetic +parapathia +parapathy +parapegm +parapegma +paraperiodic +parapet +parapetalous +parapeted +parapetless +paraph +paraphasia +paraphasic +paraphemia +paraphenetidine +paraphenylene +paraphenylenediamine +parapherna +paraphernal +paraphernalia +paraphernalian +paraphia +paraphilia +paraphimosis +paraphonia +paraphonic +paraphototropism +paraphrasable +paraphrase +paraphraser +paraphrasia +paraphrasian +paraphrasis +paraphrasist +paraphrast +paraphraster +paraphrastic +paraphrastical +paraphrastically +paraphrenia +paraphrenic +paraphrenitis +paraphyllium +paraphysate +paraphysical +paraphysiferous +paraphysis +paraplasis +paraplasm +paraplasmic +paraplastic +paraplastin +paraplectic +paraplegia +paraplegic +paraplegy +parapleuritis +parapleurum +parapod +parapodial +parapodium +parapophysial +parapophysis +parapraxia +parapraxis +paraproctitis +paraproctium +paraprostatitis +Parapsida +parapsidal +parapsidan +parapsis +parapsychical +parapsychism +parapsychological +parapsychology +parapsychosis +parapteral +parapteron +parapterum +paraquadrate +paraquinone +Pararctalia +Pararctalian +pararectal +pararek +parareka +pararhotacism +pararosaniline +pararosolic +pararthria +parasaboteur +parasalpingitis +parasang +parascene +parascenium +parasceve +paraschematic +parasecretion +paraselene +paraselenic +parasemidin +parasemidine +parasexuality +parashah +parasigmatism +parasigmatismus +Parasita +parasital +parasitary +parasite +parasitelike +parasitemia +parasitic +Parasitica +parasitical +parasitically +parasiticalness +parasiticidal +parasiticide +Parasitidae +parasitism +parasitize +parasitogenic +parasitoid +parasitoidism +parasitological +parasitologist +parasitology +parasitophobia +parasitosis +parasitotrope +parasitotropic +parasitotropism +parasitotropy +paraskenion +parasol +parasoled +parasolette +paraspecific +parasphenoid +parasphenoidal +paraspotter +paraspy +parastas +parastatic +parastemon +parastemonal +parasternal +parasternum +parastichy +parastyle +parasubphonate +parasubstituted +Parasuchia +parasuchian +parasympathetic +parasympathomimetic +parasynapsis +parasynaptic +parasynaptist +parasyndesis +parasynesis +parasynetic +parasynovitis +parasynthesis +parasynthetic +parasyntheton +parasyphilis +parasyphilitic +parasyphilosis +parasystole +paratactic +paratactical +paratactically +paratartaric +parataxis +parate +paraterminal +Paratheria +paratherian +parathesis +parathetic +parathion +parathormone +parathymic +parathyroid +parathyroidal +parathyroidectomize +parathyroidectomy +parathyroprival +parathyroprivia +parathyroprivic +paratitla +paratitles +paratoloid +paratoluic +paratoluidine +paratomial +paratomium +paratonic +paratonically +paratorium +paratory +paratracheal +paratragedia +paratragoedia +paratransversan +paratrichosis +paratrimma +paratriptic +paratroop +paratrooper +paratrophic +paratrophy +paratuberculin +paratuberculosis +paratuberculous +paratungstate +paratungstic +paratype +paratyphlitis +paratyphoid +paratypic +paratypical +paratypically +paravaginitis +paravail +paravane +paravauxite +paravent +paravertebral +paravesical +paraxial +paraxially +paraxon +paraxonic +paraxylene +Parazoa +parazoan +parazonium +parbake +Parbate +parboil +parbuckle +parcel +parceling +parcellary +parcellate +parcellation +parcelling +parcellization +parcellize +parcelment +parcelwise +parcenary +parcener +parcenership +parch +parchable +parchedly +parchedness +parcheesi +parchemin +parcher +parchesi +parching +parchingly +parchisi +parchment +parchmenter +parchmentize +parchmentlike +parchmenty +parchy +parcidentate +parciloquy +parclose +parcook +pard +pardalote +Pardanthus +pardao +parded +pardesi +pardine +pardner +pardnomastic +pardo +pardon +pardonable +pardonableness +pardonably +pardonee +pardoner +pardoning +pardonless +pardonmonger +pare +paregoric +Pareiasauri +Pareiasauria +pareiasaurian +Pareiasaurus +Pareioplitae +parel +parelectronomic +parelectronomy +parella +paren +parencephalic +parencephalon +parenchym +parenchyma +parenchymal +parenchymatic +parenchymatitis +parenchymatous +parenchymatously +parenchyme +parenchymous +parent +parentage +parental +Parentalia +parentalism +parentality +parentally +parentdom +parentela +parentelic +parenteral +parenterally +parentheses +parenthesis +parenthesize +parenthetic +parenthetical +parentheticality +parenthetically +parentheticalness +parenthood +parenticide +parentless +parentlike +parentship +Pareoean +parepididymal +parepididymis +parepigastric +parer +parerethesis +parergal +parergic +parergon +paresis +paresthesia +paresthesis +paresthetic +parethmoid +paretic +paretically +pareunia +parfait +parfilage +parfleche +parfocal +pargana +pargasite +parge +pargeboard +parget +pargeter +pargeting +pargo +parhelia +parheliacal +parhelic +parhelion +parhomologous +parhomology +parhypate +pari +pariah +pariahdom +pariahism +pariahship +parial +Parian +parian +Pariasauria +Pariasaurus +Paridae +paridigitate +paridrosis +paries +parietal +Parietales +Parietaria +parietary +parietes +parietofrontal +parietojugal +parietomastoid +parietoquadrate +parietosphenoid +parietosphenoidal +parietosplanchnic +parietosquamosal +parietotemporal +parietovaginal +parietovisceral +parify +parigenin +pariglin +Parilia +Parilicium +parilla +parillin +parimutuel +Parinarium +parine +paring +paripinnate +Paris +parish +parished +parishen +parishional +parishionally +parishionate +parishioner +parishionership +Parisian +Parisianism +Parisianization +Parisianize +Parisianly +Parisii +parisis +parisology +parison +parisonic +paristhmic +paristhmion +parisyllabic +parisyllabical +Pariti +Paritium +parity +parivincular +park +parka +parkee +parker +parkin +parking +Parkinsonia +Parkinsonism +parkish +parklike +parkward +parkway +parky +parlamento +parlance +parlando +Parlatoria +parlatory +parlay +parle +parley +parleyer +parliament +parliamental +parliamentarian +parliamentarianism +parliamentarily +parliamentariness +parliamentarism +parliamentarization +parliamentarize +parliamentary +parliamenteer +parliamenteering +parliamenter +parling +parlish +parlor +parlorish +parlormaid +parlous +parlously +parlousness +parly +Parma +parma +parmacety +parmak +Parmelia +Parmeliaceae +parmeliaceous +parmelioid +Parmentiera +Parmesan +Parmese +parnas +Parnassia +Parnassiaceae +parnassiaceous +Parnassian +Parnassianism +Parnassiinae +Parnassism +Parnassus +parnel +Parnellism +Parnellite +parnorpine +paroarion +paroarium +paroccipital +paroch +parochial +parochialic +parochialism +parochialist +parochiality +parochialization +parochialize +parochially +parochialness +parochin +parochine +parochiner +parode +parodiable +parodial +parodic +parodical +parodinia +parodist +parodistic +parodistically +parodize +parodontitis +parodos +parody +parodyproof +paroecious +paroeciously +paroeciousness +paroecism +paroecy +paroemia +paroemiac +paroemiographer +paroemiography +paroemiologist +paroemiology +paroicous +parol +parolable +parole +parolee +parolfactory +paroli +parolist +paromoeon +paromologetic +paromologia +paromology +paromphalocele +paromphalocelic +paronomasia +paronomasial +paronomasian +paronomasiastic +paronomastical +paronomastically +paronychia +paronychial +paronychium +paronym +paronymic +paronymization +paronymize +paronymous +paronymy +paroophoric +paroophoritis +paroophoron +paropsis +paroptesis +paroptic +parorchid +parorchis +parorexia +Parosela +parosmia +parosmic +parosteal +parosteitis +parosteosis +parostosis +parostotic +Parotia +parotic +parotid +parotidean +parotidectomy +parotiditis +parotis +parotitic +parotitis +parotoid +parous +parousia +parousiamania +parovarian +parovariotomy +parovarium +paroxazine +paroxysm +paroxysmal +paroxysmalist +paroxysmally +paroxysmic +paroxysmist +paroxytone +paroxytonic +paroxytonize +parpal +parquet +parquetage +parquetry +parr +Parra +parrel +parrhesia +parrhesiastic +parriable +parricidal +parricidally +parricide +parricided +parricidial +parricidism +Parridae +parrier +parrock +parrot +parroter +parrothood +parrotism +parrotize +parrotlet +parrotlike +parrotry +parrotwise +parroty +parry +parsable +parse +parsec +Parsee +Parseeism +parser +parsettensite +Parsi +Parsic +Parsiism +parsimonious +parsimoniously +parsimoniousness +parsimony +Parsism +parsley +parsleylike +parsleywort +parsnip +parson +parsonage +parsonarchy +parsondom +parsoned +parsonese +parsoness +parsonet +parsonhood +parsonic +parsonical +parsonically +parsoning +parsonish +parsonity +parsonize +parsonlike +parsonly +parsonolatry +parsonology +parsonry +parsonship +Parsonsia +parsonsite +parsony +Part +part +partakable +partake +partaker +partan +partanfull +partanhanded +parted +partedness +parter +parterre +parterred +partheniad +Partheniae +parthenian +parthenic +Parthenium +parthenocarpelly +parthenocarpic +parthenocarpical +parthenocarpically +parthenocarpous +parthenocarpy +Parthenocissus +parthenogenesis +parthenogenetic +parthenogenetically +parthenogenic +parthenogenitive +parthenogenous +parthenogeny +parthenogonidium +Parthenolatry +parthenology +Parthenon +Parthenopaeus +parthenoparous +Parthenope +Parthenopean +Parthenos +parthenosperm +parthenospore +Parthian +partial +partialism +partialist +partialistic +partiality +partialize +partially +partialness +partiary +partible +particate +participability +participable +participance +participancy +participant +participantly +participate +participatingly +participation +participative +participatively +participator +participatory +participatress +participial +participiality +participialize +participially +participle +particle +particled +particular +particularism +particularist +particularistic +particularistically +particularity +particularization +particularize +particularly +particularness +particulate +partigen +partile +partimembered +partimen +partinium +partisan +partisanism +partisanize +partisanship +partite +partition +partitional +partitionary +partitioned +partitioner +partitioning +partitionist +partitionment +partitive +partitively +partitura +partiversal +partivity +partless +partlet +partly +partner +partnerless +partnership +parto +partook +partridge +partridgeberry +partridgelike +partridgewood +partridging +partschinite +parture +parturiate +parturience +parturiency +parturient +parturifacient +parturition +parturitive +party +partyism +partyist +partykin +partyless +partymonger +partyship +Parukutu +parulis +parumbilical +parure +paruria +Parus +parvanimity +parvenu +parvenudom +parvenuism +parvicellular +parviflorous +parvifoliate +parvifolious +parvipotent +parvirostrate +parvis +parviscient +parvitude +parvolin +parvoline +parvule +paryphodrome +pasan +pasang +Pascal +Pasch +Pascha +paschal +paschalist +Paschaltide +paschite +pascoite +pascuage +pascual +pascuous +pasgarde +pash +pasha +pashadom +pashalik +pashaship +pashm +pashmina +Pashto +pasi +pasigraphic +pasigraphical +pasigraphy +pasilaly +Pasitelean +pasmo +Paspalum +pasqueflower +pasquil +pasquilant +pasquiler +pasquilic +Pasquin +pasquin +pasquinade +pasquinader +Pasquinian +Pasquino +pass +passable +passableness +passably +passade +passado +passage +passageable +passageway +Passagian +passalid +Passalidae +Passalus +Passamaquoddy +passant +passback +passbook +Passe +passe +passee +passegarde +passement +passementerie +passen +passenger +Passer +passer +Passeres +passeriform +Passeriformes +Passerina +passerine +passewa +passibility +passible +passibleness +Passiflora +Passifloraceae +passifloraceous +Passiflorales +passimeter +passing +passingly +passingness +passion +passional +passionary +passionate +passionately +passionateness +passionative +passioned +passionflower +passionful +passionfully +passionfulness +Passionist +passionist +passionless +passionlessly +passionlessness +passionlike +passionometer +passionproof +Passiontide +passionwise +passionwort +passir +passival +passivate +passivation +passive +passively +passiveness +passivism +passivist +passivity +passkey +passless +passman +passo +passometer +passout +passover +passoverish +passpenny +passport +passportless +passulate +passulation +passus +passway +passwoman +password +passworts +passymeasure +past +paste +pasteboard +pasteboardy +pasted +pastedness +pastedown +pastel +pastelist +paster +pasterer +pastern +pasterned +pasteur +Pasteurella +Pasteurelleae +pasteurellosis +Pasteurian +pasteurism +pasteurization +pasteurize +pasteurizer +pastiche +pasticheur +pastil +pastile +pastille +pastime +pastimer +Pastinaca +pastiness +pasting +pastness +pastophor +pastophorion +pastophorium +pastophorus +pastor +pastorage +pastoral +pastorale +pastoralism +pastoralist +pastorality +pastoralize +pastorally +pastoralness +pastorate +pastoress +pastorhood +pastorium +pastorize +pastorless +pastorlike +pastorling +pastorly +pastorship +pastose +pastosity +pastrami +pastry +pastryman +pasturability +pasturable +pasturage +pastural +pasture +pastureless +pasturer +pasturewise +pasty +pasul +Pat +pat +pata +pataca +patacao +pataco +patagial +patagiate +patagium +Patagon +patagon +Patagones +Patagonian +pataka +patamar +patao +patapat +pataque +Pataria +Patarin +Patarine +Patarinism +patas +patashte +Patavian +patavinity +patball +patballer +patch +patchable +patcher +patchery +patchily +patchiness +patchleaf +patchless +patchouli +patchwise +patchword +patchwork +patchworky +patchy +pate +patefaction +patefy +patel +patella +patellar +patellaroid +patellate +Patellidae +patellidan +patelliform +patelline +patellofemoral +patelloid +patellula +patellulate +paten +patency +patener +patent +patentability +patentable +patentably +patentee +patently +patentor +pater +patera +patercove +paterfamiliar +paterfamiliarly +paterfamilias +pateriform +paterissa +paternal +paternalism +paternalist +paternalistic +paternalistically +paternality +paternalize +paternally +paternity +paternoster +paternosterer +patesi +patesiate +path +Pathan +pathbreaker +pathed +pathema +pathematic +pathematically +pathematology +pathetic +pathetical +pathetically +patheticalness +patheticate +patheticly +patheticness +pathetism +pathetist +pathetize +pathfarer +pathfinder +pathfinding +pathic +pathicism +pathless +pathlessness +pathlet +pathoanatomical +pathoanatomy +pathobiological +pathobiologist +pathobiology +pathochemistry +pathodontia +pathogen +pathogene +pathogenesis +pathogenesy +pathogenetic +pathogenic +pathogenicity +pathogenous +pathogeny +pathogerm +pathogermic +pathognomic +pathognomical +pathognomonic +pathognomonical +pathognomy +pathognostic +pathographical +pathography +pathologic +pathological +pathologically +pathologicoanatomic +pathologicoanatomical +pathologicoclinical +pathologicohistological +pathologicopsychological +pathologist +pathology +patholysis +patholytic +pathomania +pathometabolism +pathomimesis +pathomimicry +pathoneurosis +pathonomia +pathonomy +pathophobia +pathophoresis +pathophoric +pathophorous +pathoplastic +pathoplastically +pathopoeia +pathopoiesis +pathopoietic +pathopsychology +pathopsychosis +pathoradiography +pathos +pathosocial +Pathrusim +pathway +pathwayed +pathy +patible +patibulary +patibulate +patience +patiency +patient +patientless +patiently +patientness +patina +patinate +patination +patine +patined +patinize +patinous +patio +patisserie +patly +Patmian +Patmos +patness +patnidar +pato +patois +patola +patonce +patria +patrial +patriarch +patriarchal +patriarchalism +patriarchally +patriarchate +patriarchdom +patriarched +patriarchess +patriarchic +patriarchical +patriarchically +patriarchism +patriarchist +patriarchship +patriarchy +Patrice +patrice +Patricia +Patrician +patrician +patricianhood +patricianism +patricianly +patricianship +patriciate +patricidal +patricide +Patricio +Patrick +patrico +patrilineal +patrilineally +patrilinear +patriliny +patrilocal +patrimonial +patrimonially +patrimony +patrin +Patriofelis +patriolatry +patriot +patrioteer +patriotess +patriotic +patriotical +patriotically +patriotics +patriotism +patriotly +patriotship +Patripassian +Patripassianism +Patripassianist +Patripassianly +patrist +patristic +patristical +patristically +patristicalness +patristicism +patristics +patrix +patrizate +patrization +patrocinium +patroclinic +patroclinous +patrocliny +patrogenesis +patrol +patroller +patrollotism +patrolman +patrologic +patrological +patrologist +patrology +patron +patronage +patronal +patronate +patrondom +patroness +patronessship +patronite +patronizable +patronization +patronize +patronizer +patronizing +patronizingly +patronless +patronly +patronomatology +patronship +patronym +patronymic +patronymically +patronymy +patroon +patroonry +patroonship +patruity +Patsy +patta +pattable +patte +pattee +patten +pattened +pattener +patter +patterer +patterist +pattern +patternable +patterned +patterner +patterning +patternize +patternless +patternlike +patternmaker +patternmaking +patternwise +patterny +pattu +Patty +patty +pattypan +patu +patulent +patulous +patulously +patulousness +Patuxent +patwari +Patwin +paty +pau +pauciarticulate +pauciarticulated +paucidentate +pauciflorous +paucifoliate +paucifolious +paucify +paucijugate +paucilocular +pauciloquent +pauciloquently +pauciloquy +paucinervate +paucipinnate +pauciplicate +pauciradiate +pauciradiated +paucispiral +paucispirated +paucity +paughty +paukpan +Paul +Paula +paular +pauldron +Pauliad +Paulian +Paulianist +Pauliccian +Paulicianism +paulie +paulin +Paulina +Pauline +Paulinia +Paulinian +Paulinism +Paulinist +Paulinistic +Paulinistically +Paulinity +Paulinize +Paulinus +Paulism +Paulist +Paulista +Paulite +paulopast +paulopost +paulospore +Paulownia +Paulus +Paumari +paunch +paunched +paunchful +paunchily +paunchiness +paunchy +paup +pauper +pauperage +pauperate +pauperdom +pauperess +pauperism +pauperitic +pauperization +pauperize +pauperizer +Paurometabola +paurometabolic +paurometabolism +paurometabolous +paurometaboly +pauropod +Pauropoda +pauropodous +pausably +pausal +pausation +pause +pauseful +pausefully +pauseless +pauselessly +pausement +pauser +pausingly +paussid +Paussidae +paut +pauxi +pavage +pavan +pavane +pave +pavement +pavemental +paver +pavestone +Pavetta +Pavia +pavid +pavidity +pavier +pavilion +paving +pavior +Paviotso +paviour +pavis +pavisade +pavisado +paviser +pavisor +Pavo +pavonated +pavonazzetto +pavonazzo +Pavoncella +Pavonia +pavonian +pavonine +pavonize +pavy +paw +pawdite +pawer +pawing +pawk +pawkery +pawkily +pawkiness +pawkrie +pawky +pawl +pawn +pawnable +pawnage +pawnbroker +pawnbrokerage +pawnbrokeress +pawnbrokering +pawnbrokery +pawnbroking +Pawnee +pawnee +pawner +pawnie +pawnor +pawnshop +pawpaw +Pawtucket +pax +paxilla +paxillar +paxillary +paxillate +paxilliferous +paxilliform +Paxillosa +paxillose +paxillus +paxiuba +paxwax +pay +payability +payable +payableness +payably +Payagua +Payaguan +payday +payed +payee +payeny +payer +paying +paymaster +paymastership +payment +paymistress +Payni +paynim +paynimhood +paynimry +Paynize +payoff +payong +payor +payroll +paysagist +Pazend +pea +peaberry +peace +peaceable +peaceableness +peaceably +peacebreaker +peacebreaking +peaceful +peacefully +peacefulness +peaceless +peacelessness +peacelike +peacemaker +peacemaking +peaceman +peacemonger +peacemongering +peacetime +peach +peachberry +peachblossom +peachblow +peachen +peacher +peachery +peachick +peachify +peachiness +peachlet +peachlike +peachwood +peachwort +peachy +peacoat +peacock +peacockery +peacockish +peacockishly +peacockishness +peacockism +peacocklike +peacockly +peacockwise +peacocky +peacod +peafowl +peag +peage +peahen +peai +peaiism +peak +peaked +peakedly +peakedness +peaker +peakily +peakiness +peaking +peakish +peakishly +peakishness +peakless +peaklike +peakward +peaky +peakyish +peal +pealike +pean +peanut +pear +pearceite +pearl +pearlberry +pearled +pearler +pearlet +pearlfish +pearlfruit +pearlike +pearlin +pearliness +pearling +pearlish +pearlite +pearlitic +pearlsides +pearlstone +pearlweed +pearlwort +pearly +pearmain +pearmonger +peart +pearten +peartly +peartness +pearwood +peasant +peasantess +peasanthood +peasantism +peasantize +peasantlike +peasantly +peasantry +peasantship +peasecod +peaselike +peasen +peashooter +peason +peastake +peastaking +peastick +peasticking +peastone +peasy +peat +peatery +peathouse +peatman +peatship +peatstack +peatwood +peaty +peavey +peavy +Peba +peba +Peban +pebble +pebbled +pebblehearted +pebblestone +pebbleware +pebbly +pebrine +pebrinous +pecan +peccability +peccable +peccadillo +peccancy +peccant +peccantly +peccantness +peccary +peccation +peccavi +pech +pecht +pecite +peck +pecked +pecker +peckerwood +pecket +peckful +peckhamite +peckiness +peckish +peckishly +peckishness +peckle +peckled +peckly +Pecksniffian +Pecksniffianism +Pecksniffism +pecky +Pecopteris +pecopteroid +Pecora +Pecos +pectase +pectate +pecten +pectic +pectin +Pectinacea +pectinacean +pectinaceous +pectinal +pectinase +pectinate +pectinated +pectinately +pectination +pectinatodenticulate +pectinatofimbricate +pectinatopinnate +pectineal +pectineus +pectinibranch +Pectinibranchia +pectinibranchian +Pectinibranchiata +pectinibranchiate +pectinic +pectinid +Pectinidae +pectiniferous +pectiniform +pectinirostrate +pectinite +pectinogen +pectinoid +pectinose +pectinous +pectizable +pectization +pectize +pectocellulose +pectolite +pectora +pectoral +pectoralgia +pectoralis +pectoralist +pectorally +pectoriloquial +pectoriloquism +pectoriloquous +pectoriloquy +pectosase +pectose +pectosic +pectosinase +pectous +pectunculate +Pectunculus +pectus +peculate +peculation +peculator +peculiar +peculiarism +peculiarity +peculiarize +peculiarly +peculiarness +peculiarsome +peculium +pecuniarily +pecuniary +pecuniosity +pecunious +ped +peda +pedage +pedagog +pedagogal +pedagogic +pedagogical +pedagogically +pedagogics +pedagogism +pedagogist +pedagogue +pedagoguery +pedagoguish +pedagoguism +pedagogy +pedal +pedaler +pedalfer +pedalferic +Pedaliaceae +pedaliaceous +pedalian +pedalier +Pedalion +pedalism +pedalist +pedaliter +pedality +Pedalium +pedanalysis +pedant +pedantesque +pedantess +pedanthood +pedantic +pedantical +pedantically +pedanticalness +pedanticism +pedanticly +pedanticness +pedantism +pedantize +pedantocracy +pedantocrat +pedantocratic +pedantry +pedary +Pedata +pedate +pedated +pedately +pedatifid +pedatiform +pedatilobate +pedatilobed +pedatinerved +pedatipartite +pedatisect +pedatisected +pedatrophia +pedder +peddle +peddler +peddleress +peddlerism +peddlery +peddling +peddlingly +pedee +pedelion +pederast +pederastic +pederastically +pederasty +pedes +pedesis +pedestal +pedestrial +pedestrially +pedestrian +pedestrianate +pedestrianism +pedestrianize +pedetentous +Pedetes +Pedetidae +Pedetinae +pediadontia +pediadontic +pediadontist +pedialgia +Pediastrum +pediatric +pediatrician +pediatrics +pediatrist +pediatry +pedicab +pedicel +pediceled +pedicellar +pedicellaria +pedicellate +pedicellated +pedicellation +pedicelled +pedicelliform +Pedicellina +pedicellus +pedicle +pedicular +Pedicularia +Pedicularis +pediculate +pediculated +Pediculati +pedicule +Pediculi +pediculicidal +pediculicide +pediculid +Pediculidae +Pediculina +pediculine +pediculofrontal +pediculoid +pediculoparietal +pediculophobia +pediculosis +pediculous +Pediculus +pedicure +pedicurism +pedicurist +pediferous +pediform +pedigerous +pedigraic +pedigree +pedigreeless +pediluvium +Pedimana +pedimanous +pediment +pedimental +pedimented +pedimentum +Pedioecetes +pedion +pedionomite +Pedionomus +pedipalp +pedipalpal +pedipalpate +Pedipalpi +Pedipalpida +pedipalpous +pedipalpus +pedipulate +pedipulation +pedipulator +pedlar +pedlary +pedobaptism +pedobaptist +pedocal +pedocalcic +pedodontia +pedodontic +pedodontist +pedodontology +pedograph +pedological +pedologist +pedologistical +pedologistically +pedology +pedometer +pedometric +pedometrical +pedometrically +pedometrician +pedometrist +pedomorphic +pedomorphism +pedomotive +pedomotor +pedophilia +pedophilic +pedotribe +pedotrophic +pedotrophist +pedotrophy +pedrail +pedregal +pedrero +Pedro +pedro +pedule +pedum +peduncle +peduncled +peduncular +Pedunculata +pedunculate +pedunculated +pedunculation +pedunculus +pee +peed +peek +peekaboo +peel +peelable +peele +peeled +peeledness +peeler +peelhouse +peeling +Peelism +Peelite +peelman +peen +peenge +peeoy +peep +peeper +peepeye +peephole +peepy +peer +peerage +peerdom +peeress +peerhood +peerie +peeringly +peerless +peerlessly +peerlessness +peerling +peerly +peership +peery +peesash +peesoreh +peesweep +peetweet +peeve +peeved +peevedly +peevedness +peever +peevish +peevishly +peevishness +peewee +Peg +peg +pega +pegall +peganite +Peganum +Pegasean +Pegasian +Pegasid +pegasid +Pegasidae +pegasoid +Pegasus +pegboard +pegbox +pegged +pegger +pegging +peggle +Peggy +peggy +pegless +peglet +peglike +pegman +pegmatite +pegmatitic +pegmatization +pegmatize +pegmatoid +pegmatophyre +pegology +pegomancy +Peguan +pegwood +Pehlevi +peho +Pehuenche +peignoir +peine +peirameter +peirastic +peirastically +peisage +peise +peiser +Peitho +peixere +pejorate +pejoration +pejorationist +pejorative +pejoratively +pejorism +pejorist +pejority +pekan +Pekin +pekin +Peking +Pekingese +pekoe +peladic +pelage +pelagial +Pelagian +pelagian +Pelagianism +Pelagianize +Pelagianizer +pelagic +Pelagothuria +pelamyd +pelanos +Pelargi +pelargic +Pelargikon +pelargomorph +Pelargomorphae +pelargomorphic +pelargonate +pelargonic +pelargonidin +pelargonin +pelargonium +Pelasgi +Pelasgian +Pelasgic +Pelasgikon +Pelasgoi +Pele +pelean +pelecan +Pelecani +Pelecanidae +Pelecaniformes +Pelecanoides +Pelecanoidinae +Pelecanus +pelecypod +Pelecypoda +pelecypodous +pelelith +pelerine +Peleus +Pelew +pelf +Pelias +pelican +pelicanry +pelick +pelicometer +Pelides +Pelidnota +pelike +peliom +pelioma +peliosis +pelisse +pelite +pelitic +pell +Pellaea +pellage +pellagra +pellagragenic +pellagrin +pellagrose +pellagrous +pellar +pellard +pellas +pellate +pellation +peller +pellet +pelleted +pelletierine +pelletlike +pellety +Pellian +pellicle +pellicula +pellicular +pellicularia +pelliculate +pellicule +pellile +pellitory +pellmell +pellock +pellotine +pellucent +pellucid +pellucidity +pellucidly +pellucidness +Pelmanism +Pelmanist +Pelmanize +pelmatic +pelmatogram +Pelmatozoa +pelmatozoan +pelmatozoic +pelmet +Pelobates +pelobatid +Pelobatidae +pelobatoid +Pelodytes +pelodytid +Pelodytidae +pelodytoid +Pelomedusa +pelomedusid +Pelomedusidae +pelomedusoid +Pelomyxa +pelon +Pelopaeus +Pelopid +Pelopidae +Peloponnesian +Pelops +peloria +pelorian +peloriate +peloric +pelorism +pelorization +pelorize +pelorus +pelota +pelotherapy +peloton +pelt +pelta +Peltandra +peltast +peltate +peltated +peltately +peltatifid +peltation +peltatodigitate +pelter +pelterer +peltiferous +peltifolious +peltiform +Peltigera +Peltigeraceae +peltigerine +peltigerous +peltinerved +pelting +peltingly +peltless +peltmonger +Peltogaster +peltry +pelu +peludo +Pelusios +pelveoperitonitis +pelves +Pelvetia +pelvic +pelviform +pelvigraph +pelvigraphy +pelvimeter +pelvimetry +pelviolithotomy +pelvioperitonitis +pelvioplasty +pelvioradiography +pelvioscopy +pelviotomy +pelviperitonitis +pelvirectal +pelvis +pelvisacral +pelvisternal +pelvisternum +pelycogram +pelycography +pelycology +pelycometer +pelycometry +pelycosaur +Pelycosauria +pelycosaurian +pembina +Pembroke +pemican +pemmican +pemmicanization +pemmicanize +pemphigoid +pemphigous +pemphigus +pen +penacute +Penaea +Penaeaceae +penaeaceous +penal +penalist +penality +penalizable +penalization +penalize +penally +penalty +penance +penanceless +penang +penannular +penates +penbard +pencatite +pence +pencel +penceless +penchant +penchute +pencil +penciled +penciler +penciliform +penciling +pencilled +penciller +pencillike +pencilling +pencilry +pencilwood +pencraft +pend +penda +pendant +pendanted +pendanting +pendantlike +pendecagon +pendeloque +pendency +pendent +pendentive +pendently +pendicle +pendicler +pending +pendle +pendom +pendragon +pendragonish +pendragonship +pendulant +pendular +pendulate +pendulation +pendule +penduline +pendulosity +pendulous +pendulously +pendulousness +pendulum +pendulumlike +Penelope +Penelopean +Penelophon +Penelopinae +penelopine +peneplain +peneplanation +peneplane +peneseismic +penetrability +penetrable +penetrableness +penetrably +penetral +penetralia +penetralian +penetrance +penetrancy +penetrant +penetrate +penetrating +penetratingly +penetratingness +penetration +penetrative +penetratively +penetrativeness +penetrativity +penetrator +penetrology +penetrometer +penfieldite +penfold +penful +penghulu +pengo +penguin +penguinery +penhead +penholder +penial +penicillate +penicillated +penicillately +penicillation +penicilliform +penicillin +Penicillium +penide +penile +peninsula +peninsular +peninsularism +peninsularity +peninsulate +penintime +peninvariant +penis +penistone +penitence +penitencer +penitent +Penitentes +penitential +penitentially +penitentiary +penitentiaryship +penitently +penk +penkeeper +penknife +penlike +penmaker +penmaking +penman +penmanship +penmaster +penna +pennaceous +Pennacook +pennae +pennage +Pennales +pennant +Pennaria +Pennariidae +Pennatae +pennate +pennated +pennatifid +pennatilobate +pennatipartite +pennatisect +pennatisected +Pennatula +Pennatulacea +pennatulacean +pennatulaceous +pennatularian +pennatulid +Pennatulidae +pennatuloid +penneech +penneeck +penner +pennet +penni +pennia +pennied +penniferous +penniform +pennigerous +penniless +pennilessly +pennilessness +pennill +penninervate +penninerved +penning +penninite +pennipotent +Pennisetum +penniveined +pennon +pennoned +pennopluma +pennoplume +pennorth +Pennsylvania +Pennsylvanian +Penny +penny +pennybird +pennycress +pennyearth +pennyflower +pennyhole +pennyleaf +pennyrot +pennyroyal +pennysiller +pennystone +pennyweight +pennywinkle +pennywort +pennyworth +Penobscot +penologic +penological +penologist +penology +penorcon +penrack +penroseite +Pensacola +penscript +penseful +pensefulness +penship +pensile +pensileness +pensility +pension +pensionable +pensionably +pensionary +pensioner +pensionership +pensionless +pensive +pensived +pensively +pensiveness +penster +penstick +penstock +pensum +pensy +pent +penta +pentabasic +pentabromide +pentacapsular +pentacarbon +pentacarbonyl +pentacarpellary +pentace +pentacetate +pentachenium +pentachloride +pentachord +pentachromic +pentacid +pentacle +pentacoccous +pentacontane +pentacosane +Pentacrinidae +pentacrinite +pentacrinoid +Pentacrinus +pentacron +pentacrostic +pentactinal +pentactine +pentacular +pentacyanic +pentacyclic +pentad +pentadactyl +Pentadactyla +pentadactylate +pentadactyle +pentadactylism +pentadactyloid +pentadecagon +pentadecahydrate +pentadecahydrated +pentadecane +pentadecatoic +pentadecoic +pentadecyl +pentadecylic +pentadelphous +pentadicity +pentadiene +pentadodecahedron +pentadrachm +pentadrachma +pentaerythrite +pentaerythritol +pentafid +pentafluoride +pentagamist +pentaglossal +pentaglot +pentaglottical +pentagon +pentagonal +pentagonally +pentagonohedron +pentagonoid +pentagram +pentagrammatic +pentagyn +Pentagynia +pentagynian +pentagynous +pentahalide +pentahedral +pentahedrical +pentahedroid +pentahedron +pentahedrous +pentahexahedral +pentahexahedron +pentahydrate +pentahydrated +pentahydric +pentahydroxy +pentail +pentaiodide +pentalobate +pentalogue +pentalogy +pentalpha +Pentamera +pentameral +pentameran +pentamerid +Pentameridae +pentamerism +pentameroid +pentamerous +Pentamerus +pentameter +pentamethylene +pentamethylenediamine +pentametrist +pentametrize +pentander +Pentandria +pentandrian +pentandrous +pentane +pentanedione +pentangle +pentangular +pentanitrate +pentanoic +pentanolide +pentanone +pentapetalous +Pentaphylacaceae +pentaphylacaceous +Pentaphylax +pentaphyllous +pentaploid +pentaploidic +pentaploidy +pentapody +pentapolis +pentapolitan +pentapterous +pentaptote +pentaptych +pentaquine +pentarch +pentarchical +pentarchy +pentasepalous +pentasilicate +pentaspermous +pentaspheric +pentaspherical +pentastich +pentastichous +pentastichy +pentastome +Pentastomida +pentastomoid +pentastomous +Pentastomum +pentastyle +pentastylos +pentasulphide +pentasyllabic +pentasyllabism +pentasyllable +Pentateuch +Pentateuchal +pentateuchal +pentathionate +pentathionic +pentathlete +pentathlon +pentathlos +pentatomic +pentatomid +Pentatomidae +Pentatomoidea +pentatone +pentatonic +pentatriacontane +pentavalence +pentavalency +pentavalent +penteconter +pentecontoglossal +Pentecost +Pentecostal +pentecostal +pentecostalism +pentecostalist +pentecostarion +pentecoster +pentecostys +Pentelic +Pentelican +pentene +penteteric +penthemimer +penthemimeral +penthemimeris +Penthestes +penthiophen +penthiophene +Penthoraceae +Penthorum +penthouse +penthouselike +penthrit +penthrite +pentimento +pentine +pentiodide +pentit +pentite +pentitol +pentlandite +pentobarbital +pentode +pentoic +pentol +pentosan +pentosane +pentose +pentoside +pentosuria +pentoxide +pentremital +pentremite +Pentremites +Pentremitidae +pentrit +pentrite +pentrough +Pentstemon +pentstock +penttail +pentyl +pentylene +pentylic +pentylidene +pentyne +Pentzia +penuchi +penult +penultima +penultimate +penultimatum +penumbra +penumbrae +penumbral +penumbrous +penurious +penuriously +penuriousness +penury +Penutian +penwiper +penwoman +penwomanship +penworker +penwright +peon +peonage +peonism +peony +people +peopledom +peoplehood +peopleize +peopleless +peopler +peoplet +peoplish +Peoria +Peorian +peotomy +pep +peperine +peperino +Peperomia +pepful +Pephredo +pepinella +pepino +peplos +peplosed +peplum +peplus +pepo +peponida +peponium +pepper +pepperbox +peppercorn +peppercornish +peppercorny +pepperer +peppergrass +pepperidge +pepperily +pepperiness +pepperish +pepperishly +peppermint +pepperoni +pepperproof +pepperroot +pepperweed +pepperwood +pepperwort +peppery +peppily +peppin +peppiness +peppy +pepsin +pepsinate +pepsinhydrochloric +pepsiniferous +pepsinogen +pepsinogenic +pepsinogenous +pepsis +peptic +peptical +pepticity +peptidase +peptide +peptizable +peptization +peptize +peptizer +peptogaster +peptogenic +peptogenous +peptogeny +peptohydrochloric +peptolysis +peptolytic +peptonaemia +peptonate +peptone +peptonemia +peptonic +peptonization +peptonize +peptonizer +peptonoid +peptonuria +peptotoxine +Pepysian +Pequot +Per +per +Peracarida +peracephalus +peracetate +peracetic +peracid +peracidite +peract +peracute +peradventure +peragrate +peragration +Perakim +peramble +perambulant +perambulate +perambulation +perambulator +perambulatory +Perameles +Peramelidae +perameline +perameloid +Peramium +Peratae +Perates +perbend +perborate +perborax +perbromide +Perca +percale +percaline +percarbide +percarbonate +percarbonic +perceivability +perceivable +perceivableness +perceivably +perceivance +perceivancy +perceive +perceivedly +perceivedness +perceiver +perceiving +perceivingness +percent +percentable +percentably +percentage +percentaged +percental +percentile +percentual +percept +perceptibility +perceptible +perceptibleness +perceptibly +perception +perceptional +perceptionalism +perceptionism +perceptive +perceptively +perceptiveness +perceptivity +perceptual +perceptually +Percesoces +percesocine +Perceval +perch +percha +perchable +perchance +percher +Percheron +perchlorate +perchlorethane +perchlorethylene +perchloric +perchloride +perchlorinate +perchlorination +perchloroethane +perchloroethylene +perchromate +perchromic +percid +Percidae +perciform +Perciformes +percipience +percipiency +percipient +Percival +perclose +percnosome +percoct +percoid +Percoidea +percoidean +percolable +percolate +percolation +percolative +percolator +percomorph +Percomorphi +percomorphous +percompound +percontation +percontatorial +percribrate +percribration +percrystallization +perculsion +perculsive +percur +percurration +percurrent +percursory +percuss +percussion +percussional +percussioner +percussionist +percussionize +percussive +percussively +percussiveness +percussor +percutaneous +percutaneously +percutient +Percy +percylite +Perdicinae +perdicine +perdition +perditionable +Perdix +perdricide +perdu +perduellion +perdurability +perdurable +perdurableness +perdurably +perdurance +perdurant +perdure +perduring +perduringly +Perean +peregrin +peregrina +peregrinate +peregrination +peregrinator +peregrinatory +peregrine +peregrinity +peregrinoid +pereion +pereiopod +pereira +pereirine +peremptorily +peremptoriness +peremptory +perendinant +perendinate +perendination +perendure +perennate +perennation +perennial +perenniality +perennialize +perennially +perennibranch +Perennibranchiata +perennibranchiate +perequitate +peres +Pereskia +perezone +perfect +perfectation +perfected +perfectedly +perfecter +perfecti +perfectibilian +perfectibilism +perfectibilist +perfectibilitarian +perfectibility +perfectible +perfecting +perfection +perfectionate +perfectionation +perfectionator +perfectioner +perfectionism +perfectionist +perfectionistic +perfectionize +perfectionizement +perfectionizer +perfectionment +perfectism +perfectist +perfective +perfectively +perfectiveness +perfectivity +perfectivize +perfectly +perfectness +perfecto +perfector +perfectuation +perfervent +perfervid +perfervidity +perfervidly +perfervidness +perfervor +perfervour +perfidious +perfidiously +perfidiousness +perfidy +perfilograph +perflate +perflation +perfluent +perfoliate +perfoliation +perforable +perforant +Perforata +perforate +perforated +perforation +perforationproof +perforative +perforator +perforatorium +perforatory +perforce +perforcedly +perform +performable +performance +performant +performative +performer +perfrication +perfumatory +perfume +perfumed +perfumeless +perfumer +perfumeress +perfumery +perfumy +perfunctionary +perfunctorily +perfunctoriness +perfunctorious +perfunctoriously +perfunctorize +perfunctory +perfuncturate +perfusate +perfuse +perfusion +perfusive +Pergamene +pergameneous +Pergamenian +pergamentaceous +Pergamic +pergamyn +pergola +perhalide +perhalogen +perhaps +perhazard +perhorresce +perhydroanthracene +perhydrogenate +perhydrogenation +perhydrogenize +peri +periacinal +periacinous +periactus +periadenitis +periamygdalitis +perianal +periangiocholitis +periangioma +periangitis +perianth +perianthial +perianthium +periaortic +periaortitis +periapical +periappendicitis +periappendicular +periapt +Periarctic +periareum +periarterial +periarteritis +periarthric +periarthritis +periarticular +periaster +periastral +periastron +periastrum +periatrial +periauricular +periaxial +periaxillary +periaxonal +periblast +periblastic +periblastula +periblem +peribolos +peribolus +peribranchial +peribronchial +peribronchiolar +peribronchiolitis +peribronchitis +peribulbar +peribursal +pericaecal +pericaecitis +pericanalicular +pericapsular +pericardia +pericardiac +pericardiacophrenic +pericardial +pericardicentesis +pericardiectomy +pericardiocentesis +pericardiolysis +pericardiomediastinitis +pericardiophrenic +pericardiopleural +pericardiorrhaphy +pericardiosymphysis +pericardiotomy +pericarditic +pericarditis +pericardium +pericardotomy +pericarp +pericarpial +pericarpic +pericarpium +pericarpoidal +pericecal +pericecitis +pericellular +pericemental +pericementitis +pericementoclasia +pericementum +pericenter +pericentral +pericentric +pericephalic +pericerebral +perichaete +perichaetial +perichaetium +perichete +pericholangitis +pericholecystitis +perichondral +perichondrial +perichondritis +perichondrium +perichord +perichordal +perichoresis +perichorioidal +perichoroidal +perichylous +pericladium +periclase +periclasia +periclasite +periclaustral +Periclean +Pericles +periclinal +periclinally +pericline +periclinium +periclitate +periclitation +pericolitis +pericolpitis +periconchal +periconchitis +pericopal +pericope +pericopic +pericorneal +pericowperitis +pericoxitis +pericranial +pericranitis +pericranium +pericristate +Pericu +periculant +pericycle +pericycloid +pericyclone +pericyclonic +pericystic +pericystitis +pericystium +pericytial +peridendritic +peridental +peridentium +peridentoclasia +periderm +peridermal +peridermic +Peridermium +peridesm +peridesmic +peridesmitis +peridesmium +peridial +peridiastole +peridiastolic +perididymis +perididymitis +peridiiform +Peridineae +Peridiniaceae +peridiniaceous +peridinial +Peridiniales +peridinian +peridinid +Peridinidae +Peridinieae +Peridiniidae +Peridinium +peridiole +peridiolum +peridium +peridot +peridotic +peridotite +peridotitic +periductal +periegesis +periegetic +perielesis +periencephalitis +perienteric +perienteritis +perienteron +periependymal +periesophageal +periesophagitis +perifistular +perifoliary +perifollicular +perifolliculitis +perigangliitis +periganglionic +perigastric +perigastritis +perigastrula +perigastrular +perigastrulation +perigeal +perigee +perigemmal +perigenesis +perigenital +perigeum +periglandular +perigloea +periglottic +periglottis +perignathic +perigon +perigonadial +perigonal +perigone +perigonial +perigonium +perigraph +perigraphic +perigynial +perigynium +perigynous +perigyny +perihelial +perihelian +perihelion +perihelium +perihepatic +perihepatitis +perihermenial +perihernial +perihysteric +perijejunitis +perijove +perikaryon +perikronion +peril +perilabyrinth +perilabyrinthitis +perilaryngeal +perilaryngitis +perilenticular +periligamentous +Perilla +perilless +perilobar +perilous +perilously +perilousness +perilsome +perilymph +perilymphangial +perilymphangitis +perilymphatic +perimartium +perimastitis +perimedullary +perimeningitis +perimeter +perimeterless +perimetral +perimetric +perimetrical +perimetrically +perimetritic +perimetritis +perimetrium +perimetry +perimorph +perimorphic +perimorphism +perimorphous +perimyelitis +perimysial +perimysium +perine +perineal +perineocele +perineoplastic +perineoplasty +perineorrhaphy +perineoscrotal +perineostomy +perineosynthesis +perineotomy +perineovaginal +perineovulvar +perinephral +perinephrial +perinephric +perinephritic +perinephritis +perinephrium +perineptunium +perineum +perineural +perineurial +perineuritis +perineurium +perinium +perinuclear +periocular +period +periodate +periodic +periodical +periodicalism +periodicalist +periodicalize +periodically +periodicalness +periodicity +periodide +periodize +periodogram +periodograph +periodology +periodontal +periodontia +periodontic +periodontist +periodontitis +periodontium +periodontoclasia +periodontologist +periodontology +periodontum +periodoscope +perioeci +perioecians +perioecic +perioecid +perioecus +perioesophageal +perioikoi +periomphalic +perionychia +perionychium +perionyx +perionyxis +perioophoritis +periophthalmic +periophthalmitis +periople +perioplic +perioptic +perioptometry +perioral +periorbit +periorbita +periorbital +periorchitis +periost +periostea +periosteal +periosteitis +periosteoalveolar +periosteoma +periosteomedullitis +periosteomyelitis +periosteophyte +periosteorrhaphy +periosteotome +periosteotomy +periosteous +periosteum +periostitic +periostitis +periostoma +periostosis +periostotomy +periostracal +periostracum +periotic +periovular +peripachymeningitis +peripancreatic +peripancreatitis +peripapillary +Peripatetic +peripatetic +peripatetical +peripatetically +peripateticate +Peripateticism +Peripatidae +Peripatidea +peripatize +peripatoid +Peripatopsidae +Peripatopsis +Peripatus +peripenial +peripericarditis +peripetalous +peripetasma +peripeteia +peripetia +peripety +periphacitis +peripharyngeal +peripherad +peripheral +peripherally +peripherial +peripheric +peripherical +peripherically +peripherocentral +peripheroceptor +peripheromittor +peripheroneural +peripherophose +periphery +periphlebitic +periphlebitis +periphractic +periphrase +periphrases +periphrasis +periphrastic +periphrastical +periphrastically +periphraxy +periphyllum +periphyse +periphysis +Periplaneta +periplasm +periplast +periplastic +periplegmatic +peripleural +peripleuritis +Periploca +periplus +peripneumonia +peripneumonic +peripneumony +peripneustic +peripolar +peripolygonal +periportal +periproct +periproctal +periproctitis +periproctous +periprostatic +periprostatitis +peripteral +peripterous +periptery +peripylephlebitis +peripyloric +perique +perirectal +perirectitis +perirenal +perisalpingitis +perisarc +perisarcal +perisarcous +perisaturnium +periscian +periscians +periscii +perisclerotic +periscopal +periscope +periscopic +periscopical +periscopism +perish +perishability +perishable +perishableness +perishably +perished +perishing +perishingly +perishless +perishment +perisigmoiditis +perisinuitis +perisinuous +perisinusitis +perisoma +perisomal +perisomatic +perisome +perisomial +perisperm +perispermal +perispermatitis +perispermic +perisphere +perispheric +perispherical +perisphinctean +Perisphinctes +Perisphinctidae +perisphinctoid +perisplanchnic +perisplanchnitis +perisplenetic +perisplenic +perisplenitis +perispome +perispomenon +perispondylic +perispondylitis +perispore +Perisporiaceae +perisporiaceous +Perisporiales +perissad +perissodactyl +Perissodactyla +perissodactylate +perissodactyle +perissodactylic +perissodactylism +perissodactylous +perissologic +perissological +perissology +perissosyllabic +peristalith +peristalsis +peristaltic +peristaltically +peristaphyline +peristaphylitis +peristele +peristerite +peristeromorph +Peristeromorphae +peristeromorphic +peristeromorphous +peristeronic +peristerophily +peristeropod +peristeropodan +peristeropode +Peristeropodes +peristeropodous +peristethium +peristole +peristoma +peristomal +peristomatic +peristome +peristomial +peristomium +peristrephic +peristrephical +peristrumitis +peristrumous +peristylar +peristyle +peristylium +peristylos +peristylum +perisynovial +perisystole +perisystolic +perit +perite +peritectic +peritendineum +peritenon +perithece +perithecial +perithecium +perithelial +perithelioma +perithelium +perithoracic +perithyreoiditis +perithyroiditis +peritomize +peritomous +peritomy +peritoneal +peritonealgia +peritoneally +peritoneocentesis +peritoneoclysis +peritoneomuscular +peritoneopathy +peritoneopericardial +peritoneopexy +peritoneoplasty +peritoneoscope +peritoneoscopy +peritoneotomy +peritoneum +peritonism +peritonital +peritonitic +peritonitis +peritonsillar +peritonsillitis +peritracheal +peritrema +peritrematous +peritreme +peritrich +Peritricha +peritrichan +peritrichic +peritrichous +peritrichously +peritroch +peritrochal +peritrochanteric +peritrochium +peritrochoid +peritropal +peritrophic +peritropous +perityphlic +perityphlitic +perityphlitis +periumbilical +periungual +periuranium +periureteric +periureteritis +periurethral +periurethritis +periuterine +periuvular +perivaginal +perivaginitis +perivascular +perivasculitis +perivenous +perivertebral +perivesical +perivisceral +perivisceritis +perivitellin +perivitelline +periwig +periwigpated +periwinkle +periwinkled +periwinkler +perizonium +perjink +perjinkety +perjinkities +perjinkly +perjure +perjured +perjuredly +perjuredness +perjurer +perjuress +perjurious +perjuriously +perjuriousness +perjurous +perjury +perjurymonger +perjurymongering +perk +perkily +Perkin +perkin +perkiness +perking +perkingly +perkish +perknite +perky +Perla +perlaceous +Perlaria +perle +perlection +perlid +Perlidae +perligenous +perlingual +perlingually +perlite +perlitic +perloir +perlustrate +perlustration +perlustrator +perm +permafrost +Permalloy +permalloy +permanence +permanency +permanent +permanently +permanentness +permanganate +permanganic +permansive +permeability +permeable +permeableness +permeably +permeameter +permeance +permeant +permeate +permeation +permeative +permeator +Permiak +Permian +permillage +permirific +permissibility +permissible +permissibleness +permissibly +permission +permissioned +permissive +permissively +permissiveness +permissory +permit +permittable +permitted +permittedly +permittee +permitter +permittivity +permixture +Permocarboniferous +permonosulphuric +permoralize +permutability +permutable +permutableness +permutably +permutate +permutation +permutational +permutationist +permutator +permutatorial +permutatory +permute +permuter +pern +pernancy +pernasal +pernavigate +Pernettia +pernicious +perniciously +perniciousness +pernicketiness +pernickety +pernine +Pernis +pernitrate +pernitric +pernoctation +pernor +pernyi +peroba +perobrachius +perocephalus +perochirus +perodactylus +Perodipus +Perognathinae +Perognathus +Peromedusae +Peromela +peromelous +peromelus +Peromyscus +peronate +peroneal +peroneocalcaneal +peroneotarsal +peroneotibial +peronial +peronium +Peronospora +Peronosporaceae +peronosporaceous +Peronosporales +peropod +Peropoda +peropodous +peropus +peroral +perorally +perorate +peroration +perorational +perorative +perorator +peroratorical +peroratorically +peroratory +perosis +perosmate +perosmic +perosomus +perotic +perovskite +peroxidase +peroxidate +peroxidation +peroxide +peroxidic +peroxidize +peroxidizement +peroxy +peroxyl +perozonid +perozonide +perpend +perpendicular +perpendicularity +perpendicularly +perpera +perperfect +perpetrable +perpetrate +perpetration +perpetrator +perpetratress +perpetratrix +perpetuable +perpetual +perpetualism +perpetualist +perpetuality +perpetually +perpetualness +perpetuana +perpetuance +perpetuant +perpetuate +perpetuation +perpetuator +perpetuity +perplantar +perplex +perplexable +perplexed +perplexedly +perplexedness +perplexer +perplexing +perplexingly +perplexity +perplexment +perplication +perquadrat +perquest +perquisite +perquisition +perquisitor +perradial +perradially +perradiate +perradius +perridiculous +perrier +Perrinist +perron +perruche +perrukery +perruthenate +perruthenic +Perry +perry +perryman +Persae +persalt +perscent +perscribe +perscrutate +perscrutation +perscrutator +perse +Persea +persecute +persecutee +persecuting +persecutingly +persecution +persecutional +persecutive +persecutiveness +persecutor +persecutory +persecutress +persecutrix +Perseid +perseite +perseitol +perseity +persentiscency +Persephassa +Persephone +Persepolitan +perseverance +perseverant +perseverate +perseveration +persevere +persevering +perseveringly +Persian +Persianist +Persianization +Persianize +Persic +Persicaria +persicary +Persicize +persico +persicot +persienne +persiennes +persiflage +persiflate +persilicic +persimmon +Persis +persis +Persism +persist +persistence +persistency +persistent +persistently +persister +persisting +persistingly +persistive +persistively +persistiveness +persnickety +person +persona +personable +personableness +personably +personage +personal +personalia +personalism +personalist +personalistic +personality +personalization +personalize +personally +personalness +personalty +personate +personately +personating +personation +personative +personator +personed +personeity +personifiable +personifiant +personification +personificative +personificator +personifier +personify +personization +personize +personnel +personship +perspection +perspective +perspectived +perspectiveless +perspectively +perspectivity +perspectograph +perspectometer +perspicacious +perspicaciously +perspicaciousness +perspicacity +perspicuity +perspicuous +perspicuously +perspicuousness +perspirability +perspirable +perspirant +perspirate +perspiration +perspirative +perspiratory +perspire +perspiringly +perspiry +perstringe +perstringement +persuadability +persuadable +persuadableness +persuadably +persuade +persuaded +persuadedly +persuadedness +persuader +persuadingly +persuasibility +persuasible +persuasibleness +persuasibly +persuasion +persuasive +persuasively +persuasiveness +persuasory +persulphate +persulphide +persulphocyanate +persulphocyanic +persulphuric +persymmetric +persymmetrical +pert +pertain +pertaining +pertainment +perten +perthiocyanate +perthiocyanic +perthiotophyre +perthite +perthitic +perthitically +perthosite +pertinacious +pertinaciously +pertinaciousness +pertinacity +pertinence +pertinency +pertinent +pertinently +pertinentness +pertish +pertly +pertness +perturb +perturbability +perturbable +perturbance +perturbancy +perturbant +perturbate +perturbation +perturbational +perturbatious +perturbative +perturbator +perturbatory +perturbatress +perturbatrix +perturbed +perturbedly +perturbedness +perturber +perturbing +perturbingly +perturbment +Pertusaria +Pertusariaceae +pertuse +pertused +pertusion +pertussal +pertussis +perty +Peru +Perugian +Peruginesque +peruke +perukeless +perukier +perukiership +perula +Perularia +perulate +perule +Perun +perusable +perusal +peruse +peruser +Peruvian +Peruvianize +pervade +pervadence +pervader +pervading +pervadingly +pervadingness +pervagate +pervagation +pervalvar +pervasion +pervasive +pervasively +pervasiveness +perverse +perversely +perverseness +perversion +perversity +perversive +pervert +perverted +pervertedly +pervertedness +perverter +pervertibility +pervertible +pervertibly +pervertive +perviability +perviable +pervicacious +pervicaciously +pervicaciousness +pervicacity +pervigilium +pervious +perviously +perviousness +pervulgate +pervulgation +perwitsky +pes +pesa +Pesach +pesade +pesage +Pesah +peseta +peshkar +peshkash +peshwa +peshwaship +peskily +peskiness +pesky +peso +pess +pessary +pessimal +pessimism +pessimist +pessimistic +pessimistically +pessimize +pessimum +pessomancy +pessoner +pessular +pessulus +pest +Pestalozzian +Pestalozzianism +peste +pester +pesterer +pesteringly +pesterment +pesterous +pestersome +pestful +pesthole +pesthouse +pesticidal +pesticide +pestiduct +pestiferous +pestiferously +pestiferousness +pestifugous +pestify +pestilence +pestilenceweed +pestilencewort +pestilent +pestilential +pestilentially +pestilentialness +pestilently +pestle +pestological +pestologist +pestology +pestproof +pet +petal +petalage +petaled +Petalia +petaliferous +petaliform +Petaliidae +petaline +petalism +petalite +petalled +petalless +petallike +petalocerous +petalodic +petalodont +petalodontid +Petalodontidae +petalodontoid +Petalodus +petalody +petaloid +petaloidal +petaloideous +petalomania +petalon +Petalostemon +petalous +petalwise +petaly +petard +petardeer +petardier +petary +Petasites +petasos +petasus +petaurine +petaurist +Petaurista +Petauristidae +Petauroides +Petaurus +petchary +petcock +Pete +pete +peteca +petechiae +petechial +petechiate +peteman +Peter +peter +Peterkin +Peterloo +peterman +peternet +petersham +peterwort +petful +petiolar +petiolary +Petiolata +petiolate +petiolated +petiole +petioled +Petioliventres +petiolular +petiolulate +petiolule +petiolus +petit +petite +petiteness +petitgrain +petition +petitionable +petitional +petitionarily +petitionary +petitionee +petitioner +petitionist +petitionproof +petitor +petitory +Petiveria +Petiveriaceae +petkin +petling +peto +Petr +Petrarchal +Petrarchan +Petrarchesque +Petrarchian +Petrarchianism +Petrarchism +Petrarchist +Petrarchistic +Petrarchistical +Petrarchize +petrary +petre +Petrea +petrean +petreity +petrel +petrescence +petrescent +Petricola +Petricolidae +petricolous +petrie +petrifaction +petrifactive +petrifiable +petrific +petrificant +petrificate +petrification +petrified +petrifier +petrify +Petrine +Petrinism +Petrinist +Petrinize +petrissage +Petrobium +Petrobrusian +petrochemical +petrochemistry +Petrogale +petrogenesis +petrogenic +petrogeny +petroglyph +petroglyphic +petroglyphy +petrograph +petrographer +petrographic +petrographical +petrographically +petrography +petrohyoid +petrol +petrolage +petrolatum +petrolean +petrolene +petroleous +petroleum +petrolic +petroliferous +petrolific +petrolist +petrolithic +petrolization +petrolize +petrologic +petrological +petrologically +petromastoid +Petromyzon +Petromyzonidae +petromyzont +Petromyzontes +Petromyzontidae +petromyzontoid +petronel +petronella +petropharyngeal +petrophilous +petrosa +petrosal +Petroselinum +petrosilex +petrosiliceous +petrosilicious +petrosphenoid +petrosphenoidal +petrosphere +petrosquamosal +petrosquamous +petrostearin +petrostearine +petrosum +petrotympanic +petrous +petroxolin +pettable +petted +pettedly +pettedness +petter +pettichaps +petticoat +petticoated +petticoaterie +petticoatery +petticoatism +petticoatless +petticoaty +pettifog +pettifogger +pettifoggery +pettifogging +pettifogulize +pettifogulizer +pettily +pettiness +pettingly +pettish +pettitoes +pettle +petty +pettyfog +petulance +petulancy +petulant +petulantly +petune +Petunia +petuntse +petwood +petzite +Peucedanum +Peucetii +peucites +peuhl +Peul +Peumus +Peutingerian +pew +pewage +pewdom +pewee +pewfellow +pewful +pewholder +pewing +pewit +pewless +pewmate +pewter +pewterer +pewterwort +pewtery +pewy +Peyerian +peyote +peyotl +peyton +peytrel +pezantic +Peziza +Pezizaceae +pezizaceous +pezizaeform +Pezizales +peziziform +pezizoid +pezograph +Pezophaps +Pfaffian +pfeffernuss +Pfeifferella +pfennig +pfui +pfund +Phaca +Phacelia +phacelite +phacella +Phacidiaceae +Phacidiales +phacitis +phacoanaphylaxis +phacocele +phacochere +phacocherine +phacochoere +phacochoerid +phacochoerine +phacochoeroid +Phacochoerus +phacocyst +phacocystectomy +phacocystitis +phacoglaucoma +phacoid +phacoidal +phacoidoscope +phacolite +phacolith +phacolysis +phacomalacia +phacometer +phacopid +Phacopidae +Phacops +phacosclerosis +phacoscope +phacotherapy +Phaeacian +Phaedo +phaeism +phaenantherous +phaenanthery +phaenogam +Phaenogamia +phaenogamian +phaenogamic +phaenogamous +phaenogenesis +phaenogenetic +phaenological +phaenology +phaenomenal +phaenomenism +phaenomenon +phaenozygous +phaeochrous +Phaeodaria +phaeodarian +phaeophore +Phaeophyceae +phaeophycean +phaeophyceous +phaeophyll +Phaeophyta +phaeophytin +phaeoplast +Phaeosporales +phaeospore +Phaeosporeae +phaeosporous +Phaet +Phaethon +Phaethonic +Phaethontes +Phaethontic +Phaethontidae +Phaethusa +phaeton +phage +phagedena +phagedenic +phagedenical +phagedenous +Phagineae +phagocytable +phagocytal +phagocyte +phagocyter +phagocytic +phagocytism +phagocytize +phagocytoblast +phagocytolysis +phagocytolytic +phagocytose +phagocytosis +phagodynamometer +phagolysis +phagolytic +phagomania +phainolion +Phainopepla +Phajus +Phalacrocoracidae +phalacrocoracine +Phalacrocorax +phalacrosis +Phalaecean +Phalaecian +Phalaenae +Phalaenidae +phalaenopsid +Phalaenopsis +phalangal +phalange +phalangeal +phalangean +phalanger +Phalangeridae +Phalangerinae +phalangerine +phalanges +phalangette +phalangian +phalangic +phalangid +Phalangida +phalangidan +Phalangidea +phalangidean +Phalangides +phalangiform +Phalangigrada +phalangigrade +phalangigrady +phalangiid +Phalangiidae +phalangist +Phalangista +Phalangistidae +phalangistine +phalangite +phalangitic +phalangitis +Phalangium +phalangologist +phalangology +phalansterial +phalansterian +phalansterianism +phalansteric +phalansterism +phalansterist +phalanstery +phalanx +phalanxed +phalarica +Phalaris +Phalarism +phalarope +Phalaropodidae +phalera +phalerate +phalerated +Phaleucian +Phallaceae +phallaceous +Phallales +phallalgia +phallaneurysm +phallephoric +phallic +phallical +phallicism +phallicist +phallin +phallism +phallist +phallitis +phallocrypsis +phallodynia +phalloid +phalloncus +phalloplasty +phallorrhagia +phallus +Phanar +Phanariot +Phanariote +phanatron +phaneric +phanerite +Phanerocarpae +Phanerocarpous +Phanerocephala +phanerocephalous +phanerocodonic +phanerocryst +phanerocrystalline +phanerogam +Phanerogamia +phanerogamian +phanerogamic +phanerogamous +phanerogamy +phanerogenetic +phanerogenic +Phaneroglossa +phaneroglossal +phaneroglossate +phaneromania +phaneromere +phaneromerous +phaneroscope +phanerosis +phanerozoic +phanerozonate +Phanerozonia +phanic +phano +phansigar +phantascope +phantasia +Phantasiast +Phantasiastic +phantasist +phantasize +phantasm +phantasma +phantasmagoria +phantasmagorial +phantasmagorially +phantasmagorian +phantasmagoric +phantasmagorical +phantasmagorist +phantasmagory +phantasmal +phantasmalian +phantasmality +phantasmally +phantasmascope +phantasmata +Phantasmatic +phantasmatic +phantasmatical +phantasmatically +phantasmatography +phantasmic +phantasmical +phantasmically +Phantasmist +phantasmogenesis +phantasmogenetic +phantasmograph +phantasmological +phantasmology +phantast +phantasy +phantom +phantomatic +phantomic +phantomical +phantomically +Phantomist +phantomize +phantomizer +phantomland +phantomlike +phantomnation +phantomry +phantomship +phantomy +phantoplex +phantoscope +Pharaoh +Pharaonic +Pharaonical +Pharbitis +phare +Phareodus +Pharian +Pharisaean +Pharisaic +pharisaical +pharisaically +pharisaicalness +Pharisaism +Pharisaist +Pharisean +Pharisee +pharisee +Phariseeism +pharmacal +pharmaceutic +pharmaceutical +pharmaceutically +pharmaceutics +pharmaceutist +pharmacic +pharmacist +pharmacite +pharmacodiagnosis +pharmacodynamic +pharmacodynamical +pharmacodynamics +pharmacoendocrinology +pharmacognosia +pharmacognosis +pharmacognosist +pharmacognostical +pharmacognostically +pharmacognostics +pharmacognosy +pharmacography +pharmacolite +pharmacologia +pharmacologic +pharmacological +pharmacologically +pharmacologist +pharmacology +pharmacomania +pharmacomaniac +pharmacomaniacal +pharmacometer +pharmacopedia +pharmacopedic +pharmacopedics +pharmacopeia +pharmacopeial +pharmacopeian +pharmacophobia +pharmacopoeia +pharmacopoeial +pharmacopoeian +pharmacopoeist +pharmacopolist +pharmacoposia +pharmacopsychology +pharmacosiderite +pharmacotherapy +pharmacy +pharmakos +pharmic +pharmuthi +pharology +Pharomacrus +pharos +Pharsalian +pharyngal +pharyngalgia +pharyngalgic +pharyngeal +pharyngectomy +pharyngemphraxis +pharynges +pharyngic +pharyngismus +pharyngitic +pharyngitis +pharyngoamygdalitis +pharyngobranch +pharyngobranchial +pharyngobranchiate +Pharyngobranchii +pharyngocele +pharyngoceratosis +pharyngodynia +pharyngoepiglottic +pharyngoepiglottidean +pharyngoesophageal +pharyngoglossal +pharyngoglossus +pharyngognath +Pharyngognathi +pharyngognathous +pharyngographic +pharyngography +pharyngokeratosis +pharyngolaryngeal +pharyngolaryngitis +pharyngolith +pharyngological +pharyngology +pharyngomaxillary +pharyngomycosis +pharyngonasal +pharyngopalatine +pharyngopalatinus +pharyngoparalysis +pharyngopathy +pharyngoplasty +pharyngoplegia +pharyngoplegic +pharyngoplegy +pharyngopleural +Pharyngopneusta +pharyngopneustal +pharyngorhinitis +pharyngorhinoscopy +pharyngoscleroma +pharyngoscope +pharyngoscopy +pharyngospasm +pharyngotherapy +pharyngotomy +pharyngotonsillitis +pharyngotyphoid +pharyngoxerosis +pharynogotome +pharynx +Phascaceae +phascaceous +Phascogale +Phascolarctinae +Phascolarctos +phascolome +Phascolomyidae +Phascolomys +Phascolonus +Phascum +phase +phaseal +phaseless +phaselin +phasemeter +phasemy +Phaseolaceae +phaseolin +phaseolous +phaseolunatin +Phaseolus +phaseometer +phases +Phasianella +Phasianellidae +phasianic +phasianid +Phasianidae +Phasianinae +phasianine +phasianoid +Phasianus +phasic +Phasiron +phasis +phasm +phasma +phasmatid +Phasmatida +Phasmatidae +Phasmatodea +phasmatoid +Phasmatoidea +phasmatrope +phasmid +Phasmida +Phasmidae +phasmoid +phasogeneous +phasotropy +pheal +pheasant +pheasantry +pheasantwood +Phebe +Phecda +Phegopteris +Pheidole +phellandrene +phellem +Phellodendron +phelloderm +phellodermal +phellogen +phellogenetic +phellogenic +phellonic +phelloplastic +phelloplastics +phelonion +phemic +Phemie +phenacaine +phenacetin +phenaceturic +phenacite +Phenacodontidae +Phenacodus +phenacyl +phenakism +phenakistoscope +Phenalgin +phenanthrene +phenanthridine +phenanthridone +phenanthrol +phenanthroline +phenarsine +phenate +phenazine +phenazone +phene +phenegol +phenene +phenethyl +phenetidine +phenetole +phengite +phengitical +phenic +phenicate +phenicious +phenicopter +phenin +phenmiazine +phenobarbital +phenocoll +phenocopy +phenocryst +phenocrystalline +phenogenesis +phenogenetic +phenol +phenolate +phenolic +phenolization +phenolize +phenological +phenologically +phenologist +phenology +phenoloid +phenolphthalein +phenolsulphonate +phenolsulphonephthalein +phenolsulphonic +phenomena +phenomenal +phenomenalism +phenomenalist +phenomenalistic +phenomenalistically +phenomenality +phenomenalization +phenomenalize +phenomenally +phenomenic +phenomenical +phenomenism +phenomenist +phenomenistic +phenomenize +phenomenological +phenomenologically +phenomenology +phenomenon +phenoplast +phenoplastic +phenoquinone +phenosafranine +phenosal +phenospermic +phenospermy +phenothiazine +phenotype +phenotypic +phenotypical +phenotypically +phenoxazine +phenoxid +phenoxide +phenozygous +Pheny +phenyl +phenylacetaldehyde +phenylacetamide +phenylacetic +phenylalanine +phenylamide +phenylamine +phenylate +phenylation +phenylboric +phenylcarbamic +phenylcarbimide +phenylene +phenylenediamine +phenylethylene +phenylglycine +phenylglycolic +phenylglyoxylic +phenylhydrazine +phenylhydrazone +phenylic +phenylmethane +pheon +pheophyl +pheophyll +pheophytin +Pherecratean +Pherecratian +Pherecratic +Pherephatta +pheretrer +Pherkad +Pherophatta +Phersephatta +Phersephoneia +phew +phi +phial +phiale +phialful +phialide +phialine +phiallike +phialophore +phialospore +Phidiac +Phidian +Phigalian +Phil +Philadelphian +Philadelphianism +philadelphite +Philadelphus +philadelphy +philalethist +philamot +Philander +philander +philanderer +philanthid +Philanthidae +philanthrope +philanthropian +philanthropic +philanthropical +philanthropically +philanthropinism +philanthropinist +Philanthropinum +philanthropism +philanthropist +philanthropistic +philanthropize +philanthropy +Philanthus +philantomba +philarchaist +philaristocracy +philatelic +philatelical +philatelically +philatelism +philatelist +philatelistic +philately +Philathea +philathletic +philematology +Philepitta +Philepittidae +Philesia +Philetaerus +philharmonic +philhellene +philhellenic +philhellenism +philhellenist +philhippic +philhymnic +philiater +Philip +Philippa +Philippan +Philippe +Philippian +Philippic +philippicize +Philippine +Philippines +Philippism +Philippist +Philippistic +Philippizate +philippize +philippizer +philippus +Philistia +Philistian +Philistine +Philistinely +Philistinian +Philistinic +Philistinish +Philistinism +Philistinize +Phill +philliloo +Phillip +phillipsine +phillipsite +Phillis +Phillyrea +phillyrin +philobiblian +philobiblic +philobiblical +philobiblist +philobotanic +philobotanist +philobrutish +philocalic +philocalist +philocaly +philocathartic +philocatholic +philocomal +Philoctetes +philocubist +philocynic +philocynical +philocynicism +philocyny +philodemic +Philodendron +philodespot +philodestructiveness +Philodina +Philodinidae +philodox +philodoxer +philodoxical +philodramatic +philodramatist +philofelist +philofelon +philogarlic +philogastric +philogeant +philogenitive +philogenitiveness +philograph +philographic +philogynaecic +philogynist +philogynous +philogyny +Philohela +philohellenian +philokleptic +philoleucosis +philologaster +philologastry +philologer +philologian +philologic +philological +philologically +philologist +philologistic +philologize +philologue +philology +Philomachus +philomath +philomathematic +philomathematical +philomathic +philomathical +philomathy +philomel +Philomela +philomelanist +philomuse +philomusical +philomystic +philonatural +philoneism +Philonian +Philonic +Philonism +Philonist +philonium +philonoist +philopagan +philopater +philopatrian +philopena +philophilosophos +philopig +philoplutonic +philopoet +philopogon +philopolemic +philopolemical +philopornist +philoprogeneity +philoprogenitive +philoprogenitiveness +philopterid +Philopteridae +philopublican +philoradical +philorchidaceous +philornithic +philorthodox +philosoph +philosophaster +philosophastering +philosophastry +philosophedom +philosopheme +philosopher +philosopheress +philosophership +philosophic +philosophical +philosophically +philosophicalness +philosophicide +philosophicohistorical +philosophicojuristic +philosophicolegal +philosophicoreligious +philosophicotheological +philosophism +philosophist +philosophister +philosophistic +philosophistical +philosophization +philosophize +philosophizer +philosophling +philosophobia +philosophocracy +philosophuncule +philosophunculist +philosophy +philotadpole +philotechnic +philotechnical +philotechnist +philothaumaturgic +philotheism +philotheist +philotheistic +philotheosophical +philotherian +philotherianism +Philotria +Philoxenian +philoxygenous +philozoic +philozoist +philozoonist +philter +philterer +philterproof +philtra +philtrum +Philydraceae +philydraceous +Philyra +phimosed +phimosis +phimotic +Phineas +Phiomia +Phiroze +phit +phiz +phizes +phizog +phlebalgia +phlebangioma +phlebarteriectasia +phlebarteriodialysis +phlebectasia +phlebectasis +phlebectasy +phlebectomy +phlebectopia +phlebectopy +phlebemphraxis +phlebenteric +phlebenterism +phlebitic +phlebitis +Phlebodium +phlebogram +phlebograph +phlebographical +phlebography +phleboid +phleboidal +phlebolite +phlebolith +phlebolithiasis +phlebolithic +phlebolitic +phlebological +phlebology +phlebometritis +phlebopexy +phleboplasty +phleborrhage +phleborrhagia +phleborrhaphy +phleborrhexis +phlebosclerosis +phlebosclerotic +phlebostasia +phlebostasis +phlebostenosis +phlebostrepsis +phlebothrombosis +phlebotome +phlebotomic +phlebotomical +phlebotomically +phlebotomist +phlebotomization +phlebotomize +Phlebotomus +phlebotomus +phlebotomy +Phlegethon +Phlegethontal +Phlegethontic +phlegm +phlegma +phlegmagogue +phlegmasia +phlegmatic +phlegmatical +phlegmatically +phlegmaticalness +phlegmaticly +phlegmaticness +phlegmatism +phlegmatist +phlegmatous +phlegmless +phlegmon +phlegmonic +phlegmonoid +phlegmonous +phlegmy +Phleum +phlobaphene +phlobatannin +phloem +phloeophagous +phloeoterma +phlogisma +phlogistian +phlogistic +phlogistical +phlogisticate +phlogistication +phlogiston +phlogistonism +phlogistonist +phlogogenetic +phlogogenic +phlogogenous +phlogopite +phlogosed +Phlomis +phloretic +phloroglucic +phloroglucin +phlorone +phloxin +pho +phobiac +phobic +phobism +phobist +phobophobia +Phobos +phoby +phoca +phocacean +phocaceous +Phocaean +Phocaena +Phocaenina +phocaenine +phocal +Phocean +phocenate +phocenic +phocenin +Phocian +phocid +Phocidae +phociform +Phocinae +phocine +phocodont +Phocodontia +phocodontic +Phocoena +phocoid +phocomelia +phocomelous +phocomelus +Phoebe +phoebe +Phoebean +Phoenicaceae +phoenicaceous +Phoenicales +phoenicean +Phoenician +Phoenicianism +Phoenicid +phoenicite +Phoenicize +phoenicochroite +Phoenicopteridae +Phoenicopteriformes +phoenicopteroid +Phoenicopteroideae +phoenicopterous +Phoenicopterus +Phoeniculidae +Phoeniculus +phoenicurous +phoenigm +Phoenix +phoenix +phoenixity +phoenixlike +phoh +pholad +Pholadacea +pholadian +pholadid +Pholadidae +Pholadinea +pholadoid +Pholas +pholcid +Pholcidae +pholcoid +Pholcus +pholido +pholidolite +pholidosis +Pholidota +pholidote +Pholiota +Phoma +Phomopsis +phon +phonal +phonasthenia +phonate +phonation +phonatory +phonautogram +phonautograph +phonautographic +phonautographically +phone +phoneidoscope +phoneidoscopic +Phonelescope +phoneme +phonemic +phonemics +phonendoscope +phonesis +phonestheme +phonetic +phonetical +phonetically +phonetician +phoneticism +phoneticist +phoneticization +phoneticize +phoneticogrammatical +phoneticohieroglyphic +phonetics +phonetism +phonetist +phonetization +phonetize +phoniatrics +phoniatry +phonic +phonics +phonikon +phonism +phono +phonocamptic +phonocinematograph +phonodeik +phonodynamograph +phonoglyph +phonogram +phonogramic +phonogramically +phonogrammatic +phonogrammatical +phonogrammic +phonogrammically +phonograph +phonographer +phonographic +phonographical +phonographically +phonographist +phonography +phonolite +phonolitic +phonologer +phonologic +phonological +phonologically +phonologist +phonology +phonometer +phonometric +phonometry +phonomimic +phonomotor +phonopathy +phonophile +phonophobia +phonophone +phonophore +phonophoric +phonophorous +phonophote +phonophotography +phonophotoscope +phonophotoscopic +phonoplex +phonoscope +phonotelemeter +phonotype +phonotyper +phonotypic +phonotypical +phonotypically +phonotypist +phonotypy +phony +phoo +Phora +Phoradendron +phoranthium +phoresis +phoresy +phoria +phorid +Phoridae +phorminx +Phormium +phorology +phorometer +phorometric +phorometry +phorone +phoronic +phoronid +Phoronida +Phoronidea +Phoronis +phoronomia +phoronomic +phoronomically +phoronomics +phoronomy +Phororhacidae +Phororhacos +phoroscope +phorozooid +phos +phose +phosgene +phosgenic +phosgenite +phosis +phosphagen +phospham +phosphamic +phosphamide +phosphamidic +phosphammonium +phosphatase +phosphate +phosphated +phosphatemia +phosphatese +phosphatic +phosphatide +phosphation +phosphatization +phosphatize +phosphaturia +phosphaturic +phosphene +phosphenyl +phosphide +phosphinate +phosphine +phosphinic +phosphite +phospho +phosphoaminolipide +phosphocarnic +phosphocreatine +phosphoferrite +phosphoglycerate +phosphoglyceric +phosphoglycoprotein +phospholipide +phospholipin +phosphomolybdate +phosphomolybdic +phosphonate +phosphonic +phosphonium +phosphophyllite +phosphoprotein +phosphor +phosphorate +phosphore +phosphoreal +phosphorent +phosphoreous +phosphoresce +phosphorescence +phosphorescent +phosphorescently +phosphoreted +phosphorhidrosis +phosphori +phosphoric +phosphorical +phosphoriferous +phosphorism +phosphorite +phosphoritic +phosphorize +phosphorogen +phosphorogenic +phosphorograph +phosphorographic +phosphorography +phosphoroscope +phosphorous +phosphoruria +phosphorus +phosphoryl +phosphorylase +phosphorylation +phosphosilicate +phosphotartaric +phosphotungstate +phosphotungstic +phosphowolframic +phosphuranylite +phosphuret +phosphuria +phosphyl +phossy +phot +photaesthesia +photaesthesis +photaesthetic +photal +photalgia +photechy +photelectrograph +photeolic +photerythrous +photesthesis +photic +photics +Photinia +Photinian +Photinianism +photism +photistic +photo +photoactinic +photoactivate +photoactivation +photoactive +photoactivity +photoaesthetic +photoalbum +photoalgraphy +photoanamorphosis +photoaquatint +Photobacterium +photobathic +photobiotic +photobromide +photocampsis +photocatalysis +photocatalyst +photocatalytic +photocatalyzer +photocell +photocellulose +photoceptor +photoceramic +photoceramics +photoceramist +photochemic +photochemical +photochemically +photochemigraphy +photochemist +photochemistry +photochloride +photochlorination +photochromascope +photochromatic +photochrome +photochromic +photochromography +photochromolithograph +photochromoscope +photochromotype +photochromotypy +photochromy +photochronograph +photochronographic +photochronographical +photochronographically +photochronography +photocollograph +photocollographic +photocollography +photocollotype +photocombustion +photocompose +photocomposition +photoconductivity +photocopier +photocopy +photocrayon +photocurrent +photodecomposition +photodensitometer +photodermatic +photodermatism +photodisintegration +photodissociation +photodrama +photodramatic +photodramatics +photodramatist +photodramaturgic +photodramaturgy +photodrome +photodromy +photodynamic +photodynamical +photodynamically +photodynamics +photodysphoria +photoelastic +photoelasticity +photoelectric +photoelectrical +photoelectrically +photoelectricity +photoelectron +photoelectrotype +photoemission +photoemissive +photoengrave +photoengraver +photoengraving +photoepinastic +photoepinastically +photoepinasty +photoesthesis +photoesthetic +photoetch +photoetcher +photoetching +photofilm +photofinish +photofinisher +photofinishing +photofloodlamp +photogalvanograph +photogalvanographic +photogalvanography +photogastroscope +photogelatin +photogen +photogene +photogenetic +photogenic +photogenically +photogenous +photoglyph +photoglyphic +photoglyphography +photoglyphy +photoglyptic +photoglyptography +photogram +photogrammeter +photogrammetric +photogrammetrical +photogrammetry +photograph +photographable +photographee +photographer +photographeress +photographess +photographic +photographical +photographically +photographist +photographize +photographometer +photography +photogravure +photogravurist +photogyric +photohalide +photoheliograph +photoheliographic +photoheliography +photoheliometer +photohyponastic +photohyponastically +photohyponasty +photoimpression +photoinactivation +photoinduction +photoinhibition +photointaglio +photoionization +photoisomeric +photoisomerization +photokinesis +photokinetic +photolith +photolitho +photolithograph +photolithographer +photolithographic +photolithography +photologic +photological +photologist +photology +photoluminescence +photoluminescent +photolysis +photolyte +photolytic +photoma +photomacrograph +photomagnetic +photomagnetism +photomap +photomapper +photomechanical +photomechanically +photometeor +photometer +photometric +photometrical +photometrically +photometrician +photometrist +photometrograph +photometry +photomezzotype +photomicrogram +photomicrograph +photomicrographer +photomicrographic +photomicrography +photomicroscope +photomicroscopic +photomicroscopy +photomontage +photomorphosis +photomural +photon +photonastic +photonasty +photonegative +photonephograph +photonephoscope +photoneutron +photonosus +photooxidation +photooxidative +photopathic +photopathy +photoperceptive +photoperimeter +photoperiod +photoperiodic +photoperiodism +photophane +photophile +photophilic +photophilous +photophily +photophobe +photophobia +photophobic +photophobous +photophone +photophonic +photophony +photophore +photophoresis +photophosphorescent +photophygous +photophysical +photophysicist +photopia +photopic +photopile +photopitometer +photoplay +photoplayer +photoplaywright +photopography +photopolarigraph +photopolymerization +photopositive +photoprint +photoprinter +photoprinting +photoprocess +photoptometer +photoradio +photoradiogram +photoreception +photoreceptive +photoreceptor +photoregression +photorelief +photoresistance +photosalt +photosantonic +photoscope +photoscopic +photoscopy +photosculptural +photosculpture +photosensitive +photosensitiveness +photosensitivity +photosensitization +photosensitize +photosensitizer +photosensory +photospectroheliograph +photospectroscope +photospectroscopic +photospectroscopical +photospectroscopy +photosphere +photospheric +photostability +photostable +Photostat +photostat +photostationary +photostereograph +photosurveying +photosyntax +photosynthate +photosynthesis +photosynthesize +photosynthetic +photosynthetically +photosynthometer +phototachometer +phototachometric +phototachometrical +phototachometry +phototactic +phototactically +phototactism +phototaxis +phototaxy +phototechnic +phototelegraph +phototelegraphic +phototelegraphically +phototelegraphy +phototelephone +phototelephony +phototelescope +phototelescopic +phototheodolite +phototherapeutic +phototherapeutics +phototherapic +phototherapist +phototherapy +photothermic +phototonic +phototonus +phototopographic +phototopographical +phototopography +phototrichromatic +phototrope +phototrophic +phototrophy +phototropic +phototropically +phototropism +phototropy +phototube +phototype +phototypic +phototypically +phototypist +phototypographic +phototypography +phototypy +photovisual +photovitrotype +photovoltaic +photoxylography +photozinco +photozincograph +photozincographic +photozincography +photozincotype +photozincotypy +photuria +Phractamphibia +phragma +Phragmidium +Phragmites +phragmocone +phragmoconic +Phragmocyttares +phragmocyttarous +phragmoid +phragmosis +phrasable +phrasal +phrasally +phrase +phraseable +phraseless +phrasemaker +phrasemaking +phraseman +phrasemonger +phrasemongering +phrasemongery +phraseogram +phraseograph +phraseographic +phraseography +phraseological +phraseologically +phraseologist +phraseology +phraser +phrasify +phrasiness +phrasing +phrasy +phrator +phratral +phratria +phratriac +phratrial +phratry +phreatic +phreatophyte +phrenesia +phrenesiac +phrenesis +phrenetic +phrenetically +phreneticness +phrenic +phrenicectomy +phrenicocolic +phrenicocostal +phrenicogastric +phrenicoglottic +phrenicohepatic +phrenicolienal +phrenicopericardiac +phrenicosplenic +phrenicotomy +phrenics +phrenitic +phrenitis +phrenocardia +phrenocardiac +phrenocolic +phrenocostal +phrenodynia +phrenogastric +phrenoglottic +phrenogram +phrenograph +phrenography +phrenohepatic +phrenologer +phrenologic +phrenological +phrenologically +phrenologist +phrenologize +phrenology +phrenomagnetism +phrenomesmerism +phrenopathia +phrenopathic +phrenopathy +phrenopericardiac +phrenoplegia +phrenoplegy +phrenosin +phrenosinic +phrenospasm +phrenosplenic +phronesis +Phronima +Phronimidae +phrontisterion +phrontisterium +phrontistery +Phryganea +phryganeid +Phryganeidae +phryganeoid +Phrygian +Phrygianize +phrygium +Phryma +Phrymaceae +phrymaceous +phrynid +Phrynidae +phrynin +phrynoid +Phrynosoma +phthalacene +phthalan +phthalanilic +phthalate +phthalazin +phthalazine +phthalein +phthaleinometer +phthalic +phthalid +phthalide +phthalimide +phthalin +phthalocyanine +phthalyl +phthanite +Phthartolatrae +phthinoid +phthiocol +phthiriasis +Phthirius +phthirophagous +phthisic +phthisical +phthisicky +phthisiogenesis +phthisiogenetic +phthisiogenic +phthisiologist +phthisiology +phthisiophobia +phthisiotherapeutic +phthisiotherapy +phthisipneumonia +phthisipneumony +phthisis +phthongal +phthongometer +phthor +phthoric +phu +phugoid +phulkari +phulwa +phulwara +phut +Phyciodes +phycite +Phycitidae +phycitol +phycochromaceae +phycochromaceous +phycochrome +Phycochromophyceae +phycochromophyceous +phycocyanin +phycocyanogen +Phycodromidae +phycoerythrin +phycography +phycological +phycologist +phycology +Phycomyces +phycomycete +Phycomycetes +phycomycetous +phycophaein +phycoxanthin +phycoxanthine +phygogalactic +phyla +phylacobiosis +phylacobiotic +phylacteric +phylacterical +phylacteried +phylacterize +phylactery +phylactic +phylactocarp +phylactocarpal +Phylactolaema +Phylactolaemata +phylactolaematous +Phylactolema +Phylactolemata +phylarch +phylarchic +phylarchical +phylarchy +phyle +phylephebic +phylesis +phyletic +phyletically +phyletism +phylic +Phyllachora +Phyllactinia +phyllade +Phyllanthus +phyllary +Phyllaurea +phylliform +phyllin +phylline +Phyllis +phyllite +phyllitic +Phyllitis +Phyllium +phyllobranchia +phyllobranchial +phyllobranchiate +Phyllocactus +phyllocarid +Phyllocarida +phyllocaridan +Phylloceras +phyllocerate +Phylloceratidae +phylloclad +phylloclade +phyllocladioid +phyllocladium +phyllocladous +phyllocyanic +phyllocyanin +phyllocyst +phyllocystic +phyllode +phyllodial +phyllodination +phyllodineous +phyllodiniation +phyllodinous +phyllodium +Phyllodoce +phyllody +phylloerythrin +phyllogenetic +phyllogenous +phylloid +phylloidal +phylloideous +phyllomancy +phyllomania +phyllome +phyllomic +phyllomorph +phyllomorphic +phyllomorphosis +phyllomorphy +Phyllophaga +phyllophagous +phyllophore +phyllophorous +phyllophyllin +phyllophyte +phyllopod +Phyllopoda +phyllopodan +phyllopode +phyllopodiform +phyllopodium +phyllopodous +phylloporphyrin +Phyllopteryx +phylloptosis +phyllopyrrole +phyllorhine +phyllorhinine +phylloscopine +Phylloscopus +phyllosiphonic +phyllosoma +Phyllosomata +phyllosome +Phyllospondyli +phyllospondylous +Phyllostachys +Phyllosticta +Phyllostoma +Phyllostomatidae +Phyllostomatinae +phyllostomatoid +phyllostomatous +phyllostome +Phyllostomidae +Phyllostominae +phyllostomine +phyllostomous +Phyllostomus +phyllotactic +phyllotactical +phyllotaxis +phyllotaxy +phyllous +phylloxanthin +Phylloxera +phylloxeran +phylloxeric +Phylloxeridae +phyllozooid +phylogenetic +phylogenetical +phylogenetically +phylogenic +phylogenist +phylogeny +phylogerontic +phylogerontism +phylography +phylology +phylon +phyloneanic +phylonepionic +phylum +phyma +phymata +phymatic +phymatid +Phymatidae +Phymatodes +phymatoid +phymatorhysin +phymatosis +Phymosia +Physa +physagogue +Physalia +physalian +Physaliidae +Physalis +physalite +Physalospora +Physapoda +Physaria +Physcia +Physciaceae +physcioid +Physcomitrium +Physeter +Physeteridae +Physeterinae +physeterine +physeteroid +Physeteroidea +physharmonica +physianthropy +physiatric +physiatrical +physiatrics +physic +physical +physicalism +physicalist +physicalistic +physicalistically +physicality +physically +physicalness +physician +physicianary +physiciancy +physicianed +physicianer +physicianess +physicianless +physicianly +physicianship +physicism +physicist +physicked +physicker +physicking +physicky +physicoastronomical +physicobiological +physicochemic +physicochemical +physicochemically +physicochemist +physicochemistry +physicogeographical +physicologic +physicological +physicomathematical +physicomathematics +physicomechanical +physicomedical +physicomental +physicomorph +physicomorphic +physicomorphism +physicooptics +physicophilosophical +physicophilosophy +physicophysiological +physicopsychical +physicosocial +physicotheological +physicotheologist +physicotheology +physicotherapeutic +physicotherapeutics +physicotherapy +physics +Physidae +physiform +physiochemical +physiochemically +physiocracy +physiocrat +physiocratic +physiocratism +physiocratist +physiogenesis +physiogenetic +physiogenic +physiogeny +physiognomic +physiognomical +physiognomically +physiognomics +physiognomist +physiognomize +physiognomonic +physiognomonical +physiognomy +physiogony +physiographer +physiographic +physiographical +physiographically +physiography +physiolater +physiolatrous +physiolatry +physiologer +physiologian +physiological +physiologically +physiologicoanatomic +physiologist +physiologize +physiologue +physiologus +physiology +physiopathological +physiophilist +physiophilosopher +physiophilosophical +physiophilosophy +physiopsychic +physiopsychical +physiopsychological +physiopsychology +physiosociological +physiosophic +physiosophy +physiotherapeutic +physiotherapeutical +physiotherapeutics +physiotherapist +physiotherapy +physiotype +physiotypy +physique +physiqued +physitheism +physitheistic +physitism +physiurgic +physiurgy +physocarpous +Physocarpus +physocele +physoclist +Physoclisti +physoclistic +physoclistous +Physoderma +physogastric +physogastrism +physogastry +physometra +Physonectae +physonectous +Physophorae +physophoran +physophore +physophorous +physopod +Physopoda +physopodan +Physostegia +Physostigma +physostigmine +physostomatous +physostome +Physostomi +physostomous +phytalbumose +phytase +Phytelephas +Phyteus +phytic +phytiferous +phytiform +phytin +phytivorous +phytobacteriology +phytobezoar +phytobiological +phytobiology +phytochemical +phytochemistry +phytochlorin +phytocidal +phytodynamics +phytoecological +phytoecologist +phytoecology +Phytoflagellata +phytogamy +phytogenesis +phytogenetic +phytogenetical +phytogenetically +phytogenic +phytogenous +phytogeny +phytogeographer +phytogeographic +phytogeographical +phytogeographically +phytogeography +phytoglobulin +phytograph +phytographer +phytographic +phytographical +phytographist +phytography +phytohormone +phytoid +phytol +Phytolacca +Phytolaccaceae +phytolaccaceous +phytolatrous +phytolatry +phytolithological +phytolithologist +phytolithology +phytologic +phytological +phytologically +phytologist +phytology +phytoma +Phytomastigina +Phytomastigoda +phytome +phytomer +phytometer +phytometric +phytometry +phytomonad +Phytomonadida +Phytomonadina +Phytomonas +phytomorphic +phytomorphology +phytomorphosis +phyton +phytonic +phytonomy +phytooecology +phytopaleontologic +phytopaleontological +phytopaleontologist +phytopaleontology +phytoparasite +phytopathogen +phytopathogenic +phytopathologic +phytopathological +phytopathologist +phytopathology +Phytophaga +phytophagan +phytophagic +Phytophagineae +phytophagous +phytophagy +phytopharmacologic +phytopharmacology +phytophenological +phytophenology +phytophil +phytophilous +Phytophthora +phytophylogenetic +phytophylogenic +phytophylogeny +phytophysiological +phytophysiology +phytoplankton +phytopsyche +phytoptid +Phytoptidae +phytoptose +phytoptosis +Phytoptus +phytorhodin +phytosaur +Phytosauria +phytosaurian +phytoserologic +phytoserological +phytoserologically +phytoserology +phytosis +phytosociologic +phytosociological +phytosociologically +phytosociologist +phytosociology +phytosterin +phytosterol +phytostrote +phytosynthesis +phytotaxonomy +phytotechny +phytoteratologic +phytoteratological +phytoteratologist +phytoteratology +Phytotoma +Phytotomidae +phytotomist +phytotomy +phytotopographical +phytotopography +phytotoxic +phytotoxin +phytovitellin +Phytozoa +phytozoan +Phytozoaria +phytozoon +phytyl +pi +Pia +pia +piaba +piacaba +piacle +piacular +piacularity +piacularly +piacularness +piaculum +piaffe +piaffer +pial +pialyn +pian +pianette +pianic +pianino +pianism +pianissimo +pianist +pianiste +pianistic +pianistically +Piankashaw +piannet +piano +pianoforte +pianofortist +pianograph +Pianokoto +Pianola +pianola +pianolist +pianologue +piarhemia +piarhemic +Piarist +Piaroa +Piaroan +Piaropus +Piarroan +piassava +Piast +piaster +piastre +piation +piazine +piazza +piazzaed +piazzaless +piazzalike +piazzian +pibcorn +piblokto +pibroch +pic +Pica +pica +picador +picadura +Picae +pical +picamar +picara +Picard +picarel +picaresque +Picariae +picarian +Picarii +picaro +picaroon +picary +picayune +picayunish +picayunishly +picayunishness +piccadill +piccadilly +piccalilli +piccolo +piccoloist +pice +Picea +Picene +picene +Picenian +piceoferruginous +piceotestaceous +piceous +piceworth +pichi +pichiciago +pichuric +pichurim +Pici +Picidae +piciform +Piciformes +Picinae +picine +pick +pickaback +pickable +pickableness +pickage +pickaninny +pickaroon +pickaway +pickax +picked +pickedly +pickedness +pickee +pickeer +picker +pickerel +pickerelweed +pickering +pickeringite +pickery +picket +picketboat +picketeer +picketer +pickfork +pickietar +pickings +pickle +picklelike +pickleman +pickler +pickleweed +pickleworm +picklock +pickman +pickmaw +picknick +picknicker +pickover +pickpocket +pickpocketism +pickpocketry +pickpole +pickpurse +pickshaft +picksman +picksmith +picksome +picksomeness +pickthank +pickthankly +pickthankness +pickthatch +picktooth +pickup +pickwick +Pickwickian +Pickwickianism +Pickwickianly +pickwork +picky +picnic +picnicker +picnickery +Picnickian +picnickish +picnicky +pico +picofarad +picoid +picoline +picolinic +picot +picotah +picotee +picotite +picqueter +picra +picramic +Picramnia +picrasmin +picrate +picrated +picric +Picris +picrite +picrocarmine +Picrodendraceae +Picrodendron +picroerythrin +picrol +picrolite +picromerite +picropodophyllin +picrorhiza +picrorhizin +picrotin +picrotoxic +picrotoxin +picrotoxinin +picryl +Pict +pict +pictarnie +Pictavi +Pictish +Pictland +pictogram +pictograph +pictographic +pictographically +pictography +Pictones +pictoradiogram +pictorial +pictorialism +pictorialist +pictorialization +pictorialize +pictorially +pictorialness +pictoric +pictorical +pictorically +picturability +picturable +picturableness +picturably +pictural +picture +picturecraft +pictured +picturedom +picturedrome +pictureful +pictureless +picturelike +picturely +picturemaker +picturemaking +picturer +picturesque +picturesquely +picturesqueness +picturesquish +picturization +picturize +pictury +picucule +picuda +picudilla +picudo +picul +piculet +piculule +Picumninae +Picumnus +Picunche +Picuris +Picus +pidan +piddle +piddler +piddling +piddock +pidgin +pidjajap +pie +piebald +piebaldism +piebaldly +piebaldness +piece +pieceable +pieceless +piecemaker +piecemeal +piecemealwise +piecen +piecener +piecer +piecette +piecewise +piecework +pieceworker +piecing +piecrust +pied +piedfort +piedly +piedmont +piedmontal +Piedmontese +piedmontite +piedness +Piegan +piehouse +pieless +pielet +pielum +piemag +pieman +piemarker +pien +pienanny +piend +piepan +pieplant +piepoudre +piepowder +pieprint +pier +pierage +Piercarlo +Pierce +pierce +pierceable +pierced +piercel +pierceless +piercent +piercer +piercing +piercingly +piercingness +pierdrop +Pierette +pierhead +Pierian +pierid +Pieridae +Pierides +Pieridinae +pieridine +Pierinae +pierine +Pieris +pierless +pierlike +Pierre +Pierrot +pierrot +pierrotic +pieshop +Piet +piet +pietas +Piete +Pieter +pietic +pietism +Pietist +pietist +pietistic +pietistical +pietistically +pietose +piety +piewife +piewipe +piewoman +piezo +piezochemical +piezochemistry +piezocrystallization +piezoelectric +piezoelectrically +piezoelectricity +piezometer +piezometric +piezometrical +piezometry +piff +piffle +piffler +pifine +pig +pigbelly +pigdan +pigdom +pigeon +pigeonable +pigeonberry +pigeoneer +pigeoner +pigeonfoot +pigeongram +pigeonhearted +pigeonhole +pigeonholer +pigeonman +pigeonry +pigeontail +pigeonweed +pigeonwing +pigeonwood +pigface +pigfish +pigflower +pigfoot +pigful +piggery +piggin +pigging +piggish +piggishly +piggishness +piggle +piggy +pighead +pigheaded +pigheadedly +pigheadedness +pigherd +pightle +pigless +piglet +pigling +piglinghood +pigly +pigmaker +pigmaking +pigman +pigment +pigmental +pigmentally +pigmentary +pigmentation +pigmentize +pigmentolysis +pigmentophage +pigmentose +Pigmy +pignolia +pignon +pignorate +pignoration +pignoratitious +pignorative +pignus +pignut +pigpen +pigritude +pigroot +pigsconce +pigskin +pigsney +pigstick +pigsticker +pigsty +pigtail +pigwash +pigweed +pigwidgeon +pigyard +piitis +pik +pika +pike +piked +pikel +pikelet +pikeman +pikemonger +piker +pikestaff +piketail +pikey +piki +piking +pikle +piky +pilage +pilandite +pilapil +Pilar +pilar +pilary +pilaster +pilastered +pilastering +pilastrade +pilastraded +pilastric +Pilate +Pilatian +pilau +pilaued +pilch +pilchard +pilcher +pilcorn +pilcrow +pile +Pilea +pileata +pileate +pileated +piled +pileiform +pileolated +pileolus +pileorhiza +pileorhize +pileous +piler +piles +pileus +pileweed +pilework +pileworm +pilewort +pilfer +pilferage +pilferer +pilfering +pilferingly +pilferment +pilgarlic +pilgarlicky +pilger +pilgrim +pilgrimage +pilgrimager +pilgrimatic +pilgrimatical +pilgrimdom +pilgrimer +pilgrimess +pilgrimism +pilgrimize +pilgrimlike +pilgrimwise +pili +pilidium +pilifer +piliferous +piliform +piligan +piliganine +piligerous +pilikai +pililloo +pilimiction +pilin +piline +piling +pilipilula +pilkins +pill +pillage +pillageable +pillagee +pillager +pillar +pillared +pillaret +pillaring +pillarist +pillarize +pillarlet +pillarlike +pillarwise +pillary +pillas +pillbox +pilled +pilledness +pillet +pilleus +pillion +pilliver +pilliwinks +pillmaker +pillmaking +pillmonger +pillorization +pillorize +pillory +pillow +pillowcase +pillowing +pillowless +pillowmade +pillowwork +pillowy +pillworm +pillwort +pilm +pilmy +Pilobolus +pilocarpidine +pilocarpine +Pilocarpus +Pilocereus +pilocystic +piloerection +pilomotor +pilon +pilonidal +pilori +pilose +pilosebaceous +pilosine +pilosis +pilosism +pilosity +Pilot +pilot +pilotage +pilotaxitic +pilotee +pilothouse +piloting +pilotism +pilotless +pilotman +pilotry +pilotship +pilotweed +pilous +Pilpai +Pilpay +pilpul +pilpulist +pilpulistic +piltock +pilula +pilular +Pilularia +pilule +pilulist +pilulous +pilum +Pilumnus +pilus +pilwillet +pily +Pim +Pima +Piman +pimaric +pimelate +Pimelea +pimelic +pimelite +pimelitis +Pimenta +pimento +pimenton +pimgenet +pimienta +pimiento +pimlico +pimola +pimp +pimperlimpimp +pimpernel +pimpery +Pimpinella +pimping +pimpish +Pimpla +pimple +pimpleback +pimpled +pimpleproof +Pimplinae +pimpliness +pimplo +pimploe +pimplous +pimply +pimpship +pin +pina +Pinaceae +pinaceous +pinaces +pinachrome +pinacle +Pinacoceras +Pinacoceratidae +pinacocytal +pinacocyte +pinacoid +pinacoidal +pinacol +pinacolate +pinacolic +pinacolin +pinacone +pinacoteca +pinaculum +Pinacyanol +pinafore +pinakiolite +pinakoidal +pinakotheke +Pinal +Pinaleno +Pinales +pinang +pinaster +pinatype +pinaverdol +pinax +pinball +pinbefore +pinbone +pinbush +pincase +pincement +pincer +pincerlike +pincers +pincerweed +pinch +pinchable +pinchback +pinchbeck +pinchbelly +pinchcock +pinchcommons +pinchcrust +pinche +pinched +pinchedly +pinchedness +pinchem +pincher +pinchfist +pinchfisted +pinchgut +pinching +pinchingly +pinchpenny +Pincian +Pinckneya +pincoffin +pincpinc +Pinctada +pincushion +pincushiony +pind +pinda +Pindari +Pindaric +pindarical +pindarically +Pindarism +Pindarist +Pindarize +Pindarus +pinder +pindling +pindy +pine +pineal +pinealism +pinealoma +pineapple +pined +pinedrops +pineland +pinene +piner +pinery +pinesap +pinetum +pineweed +pinewoods +piney +pinfall +pinfeather +pinfeathered +pinfeatherer +pinfeathery +pinfish +pinfold +Ping +ping +pingle +pingler +pingue +pinguecula +pinguedinous +pinguefaction +pinguefy +pinguescence +pinguescent +Pinguicula +pinguicula +Pinguiculaceae +pinguiculaceous +pinguid +pinguidity +pinguiferous +pinguin +pinguinitescent +pinguite +pinguitude +pinguitudinous +pinhead +pinheaded +pinheadedness +pinhold +pinhole +pinhook +pinic +pinicoline +pinicolous +piniferous +piniform +pining +piningly +pinion +pinioned +pinionless +pinionlike +pinipicrin +pinitannic +pinite +pinitol +pinivorous +pinjane +pinjra +pink +pinkberry +pinked +pinkeen +pinken +pinker +Pinkerton +Pinkertonism +pinkeye +pinkfish +pinkie +pinkify +pinkily +pinkiness +pinking +pinkish +pinkishness +pinkly +pinkness +pinkroot +pinksome +Pinkster +pinkweed +pinkwood +pinkwort +pinky +pinless +pinlock +pinmaker +Pinna +pinna +pinnace +pinnacle +pinnaclet +pinnae +pinnaglobin +pinnal +pinnate +pinnated +pinnatedly +pinnately +pinnatifid +pinnatifidly +pinnatilobate +pinnatilobed +pinnation +pinnatipartite +pinnatiped +pinnatisect +pinnatisected +pinnatodentate +pinnatopectinate +pinnatulate +pinned +pinnel +pinner +pinnet +Pinnidae +pinniferous +pinniform +pinnigerous +Pinnigrada +pinnigrade +pinninervate +pinninerved +pinning +pinningly +pinniped +Pinnipedia +pinnipedian +pinnisect +pinnisected +pinnitarsal +pinnitentaculate +pinniwinkis +pinnock +pinnoite +pinnotere +pinnothere +Pinnotheres +pinnotherian +Pinnotheridae +pinnula +pinnular +pinnulate +pinnulated +pinnule +pinnulet +pinny +pino +pinochle +pinocytosis +pinole +pinoleum +pinolia +pinolin +pinon +pinonic +pinpillow +pinpoint +pinprick +pinproof +pinrail +pinrowed +pinscher +pinsons +pint +pinta +pintadera +pintado +pintadoite +pintail +pintano +pinte +pintle +pinto +pintura +pinulus +Pinus +pinweed +pinwing +pinwork +pinworm +piny +pinyl +pinyon +pioneer +pioneerdom +pioneership +pionnotes +pioscope +pioted +piotine +Piotr +piotty +pioury +pious +piously +piousness +Pioxe +pip +pipa +pipage +pipal +pipe +pipeage +pipecoline +pipecolinic +piped +pipefish +pipeful +pipelayer +pipeless +pipelike +pipeline +pipeman +pipemouth +Piper +piper +Piperaceae +piperaceous +Piperales +piperate +piperazin +piperazine +piperic +piperide +piperideine +piperidge +piperidide +piperidine +piperine +piperitious +piperitone +piperly +piperno +piperoid +piperonal +piperonyl +pipery +piperylene +pipestapple +pipestem +pipestone +pipet +pipette +pipewalker +pipewood +pipework +pipewort +pipi +Pipidae +Pipil +Pipile +Pipilo +piping +pipingly +pipingness +pipiri +pipistrel +pipistrelle +Pipistrellus +pipit +pipkin +pipkinet +pipless +pipped +pipper +pippin +pippiner +pippinface +pippy +Pipra +Pipridae +Piprinae +piprine +piproid +pipsissewa +Piptadenia +Piptomeris +pipunculid +Pipunculidae +pipy +piquable +piquance +piquancy +piquant +piquantly +piquantness +pique +piquet +piquia +piqure +pir +piracy +piragua +Piranga +piranha +pirate +piratelike +piratery +piratess +piratical +piratically +piratism +piratize +piraty +Pirene +Piricularia +pirijiri +piripiri +piririgua +pirl +pirn +pirner +pirnie +pirny +Piro +pirogue +pirol +piroplasm +Piroplasma +piroplasmosis +pirouette +pirouetter +pirouettist +pirr +pirraura +pirrmaw +pirssonite +Pisaca +pisaca +pisachee +Pisan +pisang +pisanite +Pisauridae +pisay +piscary +Piscataqua +Piscataway +piscation +piscatology +piscator +piscatorial +piscatorialist +piscatorially +piscatorian +piscatorious +piscatory +Pisces +piscian +piscicapture +piscicapturist +piscicolous +piscicultural +pisciculturally +pisciculture +pisciculturist +Piscid +Piscidia +piscifauna +pisciferous +pisciform +piscina +piscinal +piscine +piscinity +Piscis +piscivorous +pisco +pise +pish +pishaug +pishogue +Pishquow +pishu +Pisidium +pisiform +Pisistratean +Pisistratidae +pisk +pisky +pismire +pismirism +piso +pisolite +pisolitic +Pisonia +piss +pissabed +pissant +pist +pistache +pistachio +Pistacia +pistacite +pistareen +Pistia +pistic +pistil +pistillaceous +pistillar +pistillary +pistillate +pistillid +pistilliferous +pistilliform +pistilligerous +pistilline +pistillode +pistillody +pistilloid +pistilogy +pistle +Pistoiese +pistol +pistole +pistoleer +pistolet +pistolgram +pistolgraph +pistollike +pistolography +pistology +pistolproof +pistolwise +piston +pistonhead +pistonlike +pistrix +Pisum +pit +pita +Pitahauerat +Pitahauirata +pitahaya +pitanga +pitangua +pitapat +pitapatation +pitarah +pitau +Pitawas +pitaya +pitayita +Pitcairnia +pitch +pitchable +pitchblende +pitcher +pitchered +pitcherful +pitcherlike +pitcherman +pitchfork +pitchhole +pitchi +pitchiness +pitching +pitchlike +pitchman +pitchometer +pitchout +pitchpike +pitchpole +pitchpoll +pitchstone +pitchwork +pitchy +piteous +piteously +piteousness +pitfall +pith +pithecan +pithecanthrope +pithecanthropic +pithecanthropid +Pithecanthropidae +pithecanthropoid +Pithecanthropus +Pithecia +pithecian +Pitheciinae +pitheciine +pithecism +pithecoid +Pithecolobium +pithecological +pithecometric +pithecomorphic +pithecomorphism +pithful +pithily +pithiness +pithless +pithlessly +Pithoegia +Pithoigia +pithole +pithos +pithsome +pithwork +pithy +pitiability +pitiable +pitiableness +pitiably +pitiedly +pitiedness +pitier +pitiful +pitifully +pitifulness +pitikins +pitiless +pitilessly +pitilessness +pitless +pitlike +pitmaker +pitmaking +pitman +pitmark +pitmirk +pitometer +pitpan +pitpit +pitside +Pitta +pittacal +pittance +pittancer +pitted +pitter +pitticite +Pittidae +pittine +pitting +Pittism +Pittite +pittite +pittoid +Pittosporaceae +pittosporaceous +pittospore +Pittosporum +Pittsburgher +pituital +pituitary +pituite +pituitous +pituitousness +Pituitrin +pituri +pitwood +pitwork +pitwright +pity +pitying +pityingly +Pitylus +pityocampa +pityproof +pityriasic +pityriasis +Pityrogramma +pityroid +piuri +piuricapsular +pivalic +pivot +pivotal +pivotally +pivoter +pix +pixie +pixilated +pixilation +pixy +pize +pizza +pizzeria +pizzicato +pizzle +placability +placable +placableness +placably +Placaean +placard +placardeer +placarder +placate +placater +placation +placative +placatively +placatory +placcate +place +placeable +Placean +placebo +placeful +placeless +placelessly +placemaker +placemaking +placeman +placemanship +placement +placemonger +placemongering +placenta +placental +Placentalia +placentalian +placentary +placentate +placentation +placentiferous +placentiform +placentigerous +placentitis +placentoid +placentoma +placer +placet +placewoman +placid +placidity +placidly +placidness +placitum +plack +placket +plackless +placochromatic +placode +placoderm +placodermal +placodermatous +Placodermi +placodermoid +placodont +Placodontia +Placodus +placoganoid +placoganoidean +Placoganoidei +placoid +placoidal +placoidean +Placoidei +Placoides +Placophora +placophoran +placoplast +placula +placuntitis +placuntoma +Placus +pladaroma +pladarosis +plaga +plagal +plagate +plage +Plagianthus +plagiaplite +plagiarical +plagiarism +plagiarist +plagiaristic +plagiaristically +plagiarization +plagiarize +plagiarizer +plagiary +plagihedral +plagiocephalic +plagiocephalism +plagiocephaly +Plagiochila +plagioclase +plagioclasite +plagioclastic +plagioclinal +plagiodont +plagiograph +plagioliparite +plagionite +plagiopatagium +plagiophyre +Plagiostomata +plagiostomatous +plagiostome +Plagiostomi +plagiostomous +plagiotropic +plagiotropically +plagiotropism +plagiotropous +plagium +plagose +plagosity +plague +plagued +plagueful +plagueless +plagueproof +plaguer +plaguesome +plaguesomeness +plaguily +plaguy +plaice +plaid +plaided +plaidie +plaiding +plaidman +plaidy +plain +plainback +plainbacks +plainer +plainful +plainhearted +plainish +plainly +plainness +plainscraft +plainsfolk +plainsman +plainsoled +plainstones +plainswoman +plaint +plaintail +plaintiff +plaintiffship +plaintile +plaintive +plaintively +plaintiveness +plaintless +plainward +plaister +plait +plaited +plaiter +plaiting +plaitless +plaitwork +plak +plakat +plan +planable +planaea +planar +Planaria +planarian +Planarida +planaridan +planariform +planarioid +planarity +planate +planation +planch +plancheite +plancher +planchet +planchette +planching +planchment +plancier +Planckian +plandok +plane +planeness +planer +Planera +planet +planeta +planetable +planetabler +planetal +planetaria +planetarian +planetarily +planetarium +planetary +planeted +planetesimal +planeticose +planeting +planetist +planetkin +planetless +planetlike +planetogeny +planetography +planetoid +planetoidal +planetologic +planetologist +planetology +planetule +planform +planful +planfully +planfulness +plang +plangency +plangent +plangently +plangor +plangorous +planicaudate +planicipital +planidorsate +planifolious +planiform +planigraph +planilla +planimetric +planimetrical +planimetry +planineter +planipennate +Planipennia +planipennine +planipetalous +planiphyllous +planirostral +planirostrate +planiscope +planiscopic +planish +planisher +planispheral +planisphere +planispheric +planispherical +planispiral +planity +plank +plankage +plankbuilt +planker +planking +plankless +planklike +planksheer +plankter +planktologist +planktology +plankton +planktonic +planktont +plankways +plankwise +planky +planless +planlessly +planlessness +planner +planoblast +planoblastic +Planococcus +planoconical +planocylindric +planoferrite +planogamete +planograph +planographic +planographist +planography +planohorizontal +planolindrical +planometer +planometry +planomiller +planoorbicular +Planorbidae +planorbiform +planorbine +Planorbis +planorboid +planorotund +Planosarcina +planosol +planosome +planospiral +planospore +planosubulate +plant +planta +plantable +plantad +Plantae +plantage +Plantaginaceae +plantaginaceous +Plantaginales +plantagineous +Plantago +plantain +plantal +plantar +plantaris +plantarium +plantation +plantationlike +plantdom +planter +planterdom +planterly +plantership +Plantigrada +plantigrade +plantigrady +planting +plantivorous +plantless +plantlet +plantlike +plantling +plantocracy +plantsman +plantula +plantular +plantule +planula +planulan +planular +planulate +planuliform +planuloid +Planuloidea +planuria +planury +planxty +plap +plappert +plaque +plaquette +plash +plasher +plashet +plashingly +plashment +plashy +plasm +plasma +plasmagene +plasmapheresis +plasmase +plasmatic +plasmatical +plasmation +plasmatoparous +plasmatorrhexis +plasmic +plasmocyte +plasmocytoma +plasmode +plasmodesm +plasmodesma +plasmodesmal +plasmodesmic +plasmodesmus +plasmodia +plasmodial +plasmodiate +plasmodic +plasmodiocarp +plasmodiocarpous +Plasmodiophora +Plasmodiophoraceae +Plasmodiophorales +plasmodium +plasmogen +plasmolysis +plasmolytic +plasmolytically +plasmolyzability +plasmolyzable +plasmolyze +plasmoma +Plasmon +Plasmopara +plasmophagous +plasmophagy +plasmoptysis +plasmosoma +plasmosome +plasmotomy +plasome +plass +plasson +plastein +plaster +plasterbill +plasterboard +plasterer +plasteriness +plastering +plasterlike +plasterwise +plasterwork +plastery +Plastic +plastic +plastically +plasticimeter +Plasticine +plasticine +plasticism +plasticity +plasticization +plasticize +plasticizer +plasticly +plastics +plastid +plastidium +plastidome +Plastidozoa +plastidular +plastidule +plastify +plastin +plastinoid +plastisol +plastochondria +plastochron +plastochrone +plastodynamia +plastodynamic +plastogamic +plastogamy +plastogene +plastomere +plastometer +plastosome +plastotype +plastral +plastron +plastrum +plat +Plataean +Platalea +Plataleidae +plataleiform +Plataleinae +plataleine +platan +Platanaceae +platanaceous +platane +platanist +Platanista +Platanistidae +platano +Platanus +platband +platch +plate +platea +plateasm +plateau +plateaux +plated +plateful +plateholder +plateiasmus +platelayer +plateless +platelet +platelike +platemaker +platemaking +plateman +platen +plater +platerer +plateresque +platery +plateway +platework +plateworker +platform +platformally +platformed +platformer +platformish +platformism +platformist +platformistic +platformless +platformy +platic +platicly +platilla +platina +platinamine +platinammine +platinate +Platine +plating +platinic +platinichloric +platinichloride +platiniferous +platiniridium +platinite +platinization +platinize +platinochloric +platinochloride +platinocyanic +platinocyanide +platinoid +platinotype +platinous +platinum +platinumsmith +platitude +platitudinal +platitudinarian +platitudinarianism +platitudinism +platitudinist +platitudinization +platitudinize +platitudinizer +platitudinous +platitudinously +platitudinousness +Platoda +platode +Platodes +platoid +Platonesque +platonesque +Platonian +Platonic +Platonical +Platonically +Platonicalness +Platonician +Platonicism +Platonism +Platonist +Platonistic +Platonization +Platonize +Platonizer +platoon +platopic +platosamine +platosammine +Platt +Plattdeutsch +platted +platten +platter +platterface +platterful +platting +plattnerite +platty +platurous +platy +platybasic +platybrachycephalic +platybrachycephalous +platybregmatic +platycarpous +Platycarpus +Platycarya +platycelian +platycelous +platycephalic +Platycephalidae +platycephalism +platycephaloid +platycephalous +Platycephalus +platycephaly +Platycercinae +platycercine +Platycercus +Platycerium +platycheiria +platycnemia +platycnemic +Platycodon +platycoria +platycrania +platycranial +Platyctenea +platycyrtean +platydactyl +platydactyle +platydactylous +platydolichocephalic +platydolichocephalous +platyfish +platyglossal +platyglossate +platyglossia +Platyhelmia +platyhelminth +Platyhelminthes +platyhelminthic +platyhieric +platykurtic +platylobate +platymeria +platymeric +platymery +platymesaticephalic +platymesocephalic +platymeter +platymyoid +platynite +platynotal +platyodont +platyope +platyopia +platyopic +platypellic +platypetalous +platyphyllous +platypod +Platypoda +platypodia +platypodous +Platyptera +platypus +platypygous +Platyrhina +Platyrhini +platyrhynchous +platyrrhin +Platyrrhina +platyrrhine +Platyrrhini +platyrrhinian +platyrrhinic +platyrrhinism +platyrrhiny +platysma +platysmamyoides +platysomid +Platysomidae +Platysomus +platystaphyline +Platystemon +platystencephalia +platystencephalic +platystencephalism +platystencephaly +platysternal +Platysternidae +Platystomidae +platystomous +platytrope +platytropy +plaud +plaudation +plaudit +plaudite +plauditor +plauditory +plauenite +plausibility +plausible +plausibleness +plausibly +plausive +plaustral +Plautine +Plautus +play +playa +playability +playable +playback +playbill +playbook +playbox +playboy +playboyism +playbroker +playcraft +playcraftsman +playday +playdown +player +playerdom +playeress +playfellow +playfellowship +playfield +playfolk +playful +playfully +playfulness +playgoer +playgoing +playground +playhouse +playingly +playless +playlet +playlike +playmaker +playmaking +playman +playmare +playmate +playmonger +playmongering +playock +playpen +playreader +playroom +playscript +playsome +playsomely +playsomeness +playstead +plaything +playtime +playward +playwoman +playwork +playwright +playwrightess +playwrighting +playwrightry +playwriter +playwriting +plaza +plazolite +plea +pleach +pleached +pleacher +plead +pleadable +pleadableness +pleader +pleading +pleadingly +pleadingness +pleaproof +pleasable +pleasableness +pleasance +pleasant +pleasantable +pleasantish +pleasantly +pleasantness +pleasantry +pleasantsome +please +pleasedly +pleasedness +pleaseman +pleaser +pleaship +pleasing +pleasingly +pleasingness +pleasurability +pleasurable +pleasurableness +pleasurably +pleasure +pleasureful +pleasurehood +pleasureless +pleasurelessly +pleasureman +pleasurement +pleasuremonger +pleasureproof +pleasurer +pleasuring +pleasurist +pleasurous +pleat +pleater +pleatless +pleb +plebe +plebeian +plebeiance +plebeianize +plebeianly +plebeianness +plebeity +plebianism +plebicolar +plebicolist +plebificate +plebification +plebify +plebiscitarian +plebiscitarism +plebiscitary +plebiscite +plebiscitic +plebiscitum +plebs +pleck +Plecoptera +plecopteran +plecopterid +plecopterous +Plecotinae +plecotine +Plecotus +plectognath +Plectognathi +plectognathic +plectognathous +plectopter +plectopteran +plectopterous +plectospondyl +Plectospondyli +plectospondylous +plectre +plectridial +plectridium +plectron +plectrum +pled +pledge +pledgeable +pledgee +pledgeless +pledgeor +pledger +pledgeshop +pledget +pledgor +Plegadis +plegaphonia +plegometer +Pleiades +pleiobar +pleiochromia +pleiochromic +pleiomastia +pleiomazia +pleiomerous +pleiomery +pleion +Pleione +pleionian +pleiophyllous +pleiophylly +pleiotaxis +pleiotropic +pleiotropically +pleiotropism +Pleistocene +Pleistocenic +pleistoseist +plemochoe +plemyrameter +plenarily +plenariness +plenarium +plenarty +plenary +plenicorn +pleniloquence +plenilunal +plenilunar +plenilunary +plenilune +plenipo +plenipotence +plenipotent +plenipotential +plenipotentiality +plenipotentiarily +plenipotentiarize +Plenipotentiary +plenipotentiary +plenipotentiaryship +plenish +plenishing +plenishment +plenism +plenist +plenitide +plenitude +plenitudinous +plenshing +plenteous +plenteously +plenteousness +plentiful +plentifully +plentifulness +plentify +plenty +plenum +pleny +pleochroic +pleochroism +pleochroitic +pleochromatic +pleochromatism +pleochroous +pleocrystalline +pleodont +pleomastia +pleomastic +pleomazia +pleometrosis +pleometrotic +pleomorph +pleomorphic +pleomorphism +pleomorphist +pleomorphous +pleomorphy +pleon +pleonal +pleonasm +pleonast +pleonaste +pleonastic +pleonastical +pleonastically +pleonectic +pleonexia +pleonic +pleophyletic +pleopod +pleopodite +Pleospora +Pleosporaceae +plerergate +plerocercoid +pleroma +pleromatic +plerome +pleromorph +plerophoric +plerophory +plerosis +plerotic +Plesianthropus +plesiobiosis +plesiobiotic +plesiomorphic +plesiomorphism +plesiomorphous +plesiosaur +Plesiosauri +Plesiosauria +plesiosaurian +plesiosauroid +Plesiosaurus +plesiotype +plessigraph +plessimeter +plessimetric +plessimetry +plessor +Plethodon +plethodontid +Plethodontidae +plethora +plethoretic +plethoretical +plethoric +plethorical +plethorically +plethorous +plethory +plethysmograph +plethysmographic +plethysmographically +plethysmography +pleura +Pleuracanthea +Pleuracanthidae +Pleuracanthini +pleuracanthoid +Pleuracanthus +pleural +pleuralgia +pleuralgic +pleurapophysial +pleurapophysis +pleurectomy +pleurenchyma +pleurenchymatous +pleuric +pleuriseptate +pleurisy +pleurite +pleuritic +pleuritical +pleuritically +pleuritis +Pleurobrachia +Pleurobrachiidae +pleurobranch +pleurobranchia +pleurobranchial +pleurobranchiate +pleurobronchitis +Pleurocapsa +Pleurocapsaceae +pleurocapsaceous +pleurocarp +Pleurocarpi +pleurocarpous +pleurocele +pleurocentesis +pleurocentral +pleurocentrum +Pleurocera +pleurocerebral +Pleuroceridae +pleuroceroid +Pleurococcaceae +pleurococcaceous +Pleurococcus +Pleurodelidae +Pleurodira +pleurodiran +pleurodire +pleurodirous +pleurodiscous +pleurodont +pleurodynia +pleurodynic +pleurogenic +pleurogenous +pleurohepatitis +pleuroid +pleurolith +pleurolysis +pleuron +Pleuronectes +pleuronectid +Pleuronectidae +pleuronectoid +Pleuronema +pleuropedal +pleuropericardial +pleuropericarditis +pleuroperitonaeal +pleuroperitoneal +pleuroperitoneum +pleuropneumonia +pleuropneumonic +pleuropodium +pleuropterygian +Pleuropterygii +pleuropulmonary +pleurorrhea +Pleurosaurus +Pleurosigma +pleurospasm +pleurosteal +Pleurosteon +pleurostict +Pleurosticti +Pleurostigma +pleurothotonic +pleurothotonus +Pleurotoma +Pleurotomaria +Pleurotomariidae +pleurotomarioid +Pleurotomidae +pleurotomine +pleurotomoid +pleurotomy +pleurotonic +pleurotonus +Pleurotremata +pleurotribal +pleurotribe +pleurotropous +Pleurotus +pleurotyphoid +pleurovisceral +pleurum +pleuston +pleustonic +plew +plex +plexal +plexicose +plexiform +pleximeter +pleximetric +pleximetry +plexodont +plexometer +plexor +plexure +plexus +pliability +pliable +pliableness +pliably +pliancy +pliant +pliantly +pliantness +plica +plicable +plical +plicate +plicated +plicately +plicateness +plicater +plicatile +plication +plicative +plicatocontorted +plicatocristate +plicatolacunose +plicatolobate +plicatopapillose +plicator +plicatoundulate +plicatulate +plicature +pliciferous +pliciform +plied +plier +plies +pliers +plight +plighted +plighter +plim +plimsoll +Plinian +plinth +plinther +plinthiform +plinthless +plinthlike +Pliny +Plinyism +Pliocene +Pliohippus +Pliopithecus +pliosaur +pliosaurian +Pliosauridae +Pliosaurus +pliothermic +Pliotron +pliskie +plisky +ploat +ploce +Ploceidae +ploceiform +Ploceinae +Ploceus +plock +plod +plodder +plodderly +plodding +ploddingly +ploddingness +plodge +Ploima +ploimate +plomb +plook +plop +ploration +ploratory +plosion +plosive +plot +plote +plotful +Plotinian +Plotinic +Plotinical +Plotinism +Plotinist +Plotinize +plotless +plotlessness +plotproof +plottage +plotted +plotter +plottery +plotting +plottingly +plotty +plough +ploughmanship +ploughtail +plouk +plouked +plouky +plounce +plousiocracy +plout +Plouteneion +plouter +plover +ploverlike +plovery +plow +plowable +plowbote +plowboy +plower +plowfish +plowfoot +plowgang +plowgate +plowgraith +plowhead +plowing +plowjogger +plowland +plowlight +plowline +plowmaker +plowman +plowmanship +plowmell +plowpoint +Plowrightia +plowshare +plowshoe +plowstaff +plowstilt +plowtail +plowwise +plowwoman +plowwright +ploy +ployment +Pluchea +pluck +pluckage +plucked +pluckedness +plucker +Pluckerian +pluckily +pluckiness +pluckless +plucklessness +plucky +plud +pluff +pluffer +pluffy +plug +plugboard +plugdrawer +pluggable +plugged +plugger +plugging +pluggingly +pluggy +plughole +plugless +pluglike +plugman +plugtray +plugtree +plum +pluma +plumaceous +plumach +plumade +plumage +plumaged +plumagery +plumasite +plumate +Plumatella +plumatellid +Plumatellidae +plumatelloid +plumb +plumbable +plumbage +Plumbaginaceae +plumbaginaceous +plumbagine +plumbaginous +plumbago +plumbate +plumbean +plumbeous +plumber +plumbership +plumbery +plumbet +plumbic +plumbiferous +plumbing +plumbism +plumbisolvent +plumbite +plumbless +plumbness +plumbog +plumbojarosite +plumboniobate +plumbosolvency +plumbosolvent +plumbous +plumbum +plumcot +plumdamas +plumdamis +plume +plumed +plumeless +plumelet +plumelike +plumemaker +plumemaking +plumeopicean +plumeous +plumer +plumery +plumet +plumette +plumicorn +plumier +Plumiera +plumieride +plumification +plumiform +plumiformly +plumify +plumigerous +pluminess +plumiped +plumipede +plumist +plumless +plumlet +plumlike +plummer +plummet +plummeted +plummetless +plummy +plumose +plumosely +plumoseness +plumosity +plumous +plump +plumpen +plumper +plumping +plumpish +plumply +plumpness +plumps +plumpy +plumula +plumulaceous +plumular +Plumularia +plumularian +Plumulariidae +plumulate +plumule +plumuliform +plumulose +plumy +plunder +plunderable +plunderage +plunderbund +plunderer +plunderess +plundering +plunderingly +plunderless +plunderous +plunderproof +plunge +plunger +plunging +plungingly +plunk +plunther +plup +plupatriotic +pluperfect +pluperfectly +pluperfectness +plural +pluralism +pluralist +pluralistic +pluralistically +plurality +pluralization +pluralize +pluralizer +plurally +plurative +plurennial +pluriaxial +pluricarinate +pluricarpellary +pluricellular +pluricentral +pluricipital +pluricuspid +pluricuspidate +pluridentate +pluries +plurifacial +plurifetation +plurification +pluriflagellate +pluriflorous +plurifoliate +plurifoliolate +plurify +pluriglandular +pluriguttulate +plurilateral +plurilingual +plurilingualism +plurilingualist +plurilocular +plurimammate +plurinominal +plurinucleate +pluripara +pluriparity +pluriparous +pluripartite +pluripetalous +pluripotence +pluripotent +pluripresence +pluriseptate +pluriserial +pluriseriate +pluriseriated +plurisetose +plurispiral +plurisporous +plurisyllabic +plurisyllable +plurivalent +plurivalve +plurivorous +plurivory +plus +plush +plushed +plushette +plushily +plushiness +plushlike +plushy +Plusia +Plusiinae +plusquamperfect +plussage +Plutarchian +Plutarchic +Plutarchical +Plutarchically +plutarchy +pluteal +plutean +pluteiform +Plutella +pluteus +Pluto +plutocracy +plutocrat +plutocratic +plutocratical +plutocratically +plutolatry +plutological +plutologist +plutology +plutomania +Plutonian +plutonian +plutonic +Plutonion +plutonism +plutonist +plutonite +Plutonium +plutonium +plutonometamorphism +plutonomic +plutonomist +plutonomy +pluvial +pluvialiform +pluvialine +Pluvialis +pluvian +pluvine +pluviograph +pluviographic +pluviographical +pluviography +pluviometer +pluviometric +pluviometrical +pluviometrically +pluviometry +pluvioscope +pluviose +pluviosity +pluvious +ply +plyer +plying +plyingly +Plymouth +Plymouthism +Plymouthist +Plymouthite +Plynlymmon +plywood +pneodynamics +pneograph +pneomanometer +pneometer +pneometry +pneophore +pneoscope +pneuma +pneumarthrosis +pneumathaemia +pneumatic +pneumatical +pneumatically +pneumaticity +pneumatics +pneumatism +pneumatist +pneumatize +pneumatized +pneumatocardia +pneumatocele +pneumatochemical +pneumatochemistry +pneumatocyst +pneumatocystic +pneumatode +pneumatogenic +pneumatogenous +pneumatogram +pneumatograph +pneumatographer +pneumatographic +pneumatography +pneumatolitic +pneumatologic +pneumatological +pneumatologist +pneumatology +pneumatolysis +pneumatolytic +Pneumatomachian +Pneumatomachist +Pneumatomachy +pneumatometer +pneumatometry +pneumatomorphic +pneumatonomy +pneumatophany +pneumatophilosophy +pneumatophobia +pneumatophonic +pneumatophony +pneumatophore +pneumatophorous +pneumatorrhachis +pneumatoscope +pneumatosic +pneumatosis +pneumatotactic +pneumatotherapeutics +pneumatotherapy +Pneumatria +pneumaturia +pneumectomy +pneumobacillus +Pneumobranchia +Pneumobranchiata +pneumocele +pneumocentesis +pneumochirurgia +pneumococcal +pneumococcemia +pneumococcic +pneumococcous +pneumococcus +pneumoconiosis +pneumoderma +pneumodynamic +pneumodynamics +pneumoencephalitis +pneumoenteritis +pneumogastric +pneumogram +pneumograph +pneumographic +pneumography +pneumohemothorax +pneumohydropericardium +pneumohydrothorax +pneumolith +pneumolithiasis +pneumological +pneumology +pneumolysis +pneumomalacia +pneumomassage +Pneumometer +pneumomycosis +pneumonalgia +pneumonectasia +pneumonectomy +pneumonedema +pneumonia +pneumonic +pneumonitic +pneumonitis +pneumonocace +pneumonocarcinoma +pneumonocele +pneumonocentesis +pneumonocirrhosis +pneumonoconiosis +pneumonodynia +pneumonoenteritis +pneumonoerysipelas +pneumonographic +pneumonography +pneumonokoniosis +pneumonolith +pneumonolithiasis +pneumonolysis +pneumonomelanosis +pneumonometer +pneumonomycosis +pneumonoparesis +pneumonopathy +pneumonopexy +pneumonophorous +pneumonophthisis +pneumonopleuritis +pneumonorrhagia +pneumonorrhaphy +pneumonosis +pneumonotherapy +pneumonotomy +pneumony +pneumopericardium +pneumoperitoneum +pneumoperitonitis +pneumopexy +pneumopleuritis +pneumopyothorax +pneumorrachis +pneumorrhachis +pneumorrhagia +pneumotactic +pneumotherapeutics +pneumotherapy +pneumothorax +pneumotomy +pneumotoxin +pneumotropic +pneumotropism +pneumotyphoid +pneumotyphus +pneumoventriculography +Po +po +Poa +Poaceae +poaceous +poach +poachable +poacher +poachiness +poachy +Poales +poalike +pob +pobby +Poblacht +poblacion +pobs +pochade +pochard +pochay +poche +pochette +pocilliform +pock +pocket +pocketable +pocketableness +pocketbook +pocketed +pocketer +pocketful +pocketing +pocketknife +pocketless +pocketlike +pockety +pockhouse +pockily +pockiness +pockmanteau +pockmantie +pockmark +pockweed +pockwood +pocky +poco +pococurante +pococuranteism +pococurantic +pococurantish +pococurantism +pococurantist +pocosin +poculary +poculation +poculent +poculiform +pod +podagra +podagral +podagric +podagrical +podagrous +podal +podalgia +podalic +Podaliriidae +Podalirius +Podarge +Podargidae +Podarginae +podargine +podargue +Podargus +podarthral +podarthritis +podarthrum +podatus +Podaxonia +podaxonial +podded +podder +poddidge +poddish +poddle +poddy +podelcoma +podeon +podesta +podesterate +podetiiform +podetium +podex +podge +podger +podgily +podginess +podgy +podial +podiatrist +podiatry +podical +Podiceps +podices +Podicipedidae +podilegous +podite +poditic +poditti +podium +podler +podley +podlike +podobranch +podobranchia +podobranchial +podobranchiate +podocarp +Podocarpaceae +Podocarpineae +podocarpous +Podocarpus +podocephalous +pododerm +pododynia +podogyn +podogyne +podogynium +Podolian +podolite +podology +podomancy +podomere +podometer +podometry +Podophrya +Podophryidae +Podophthalma +Podophthalmata +podophthalmate +podophthalmatous +Podophthalmia +podophthalmian +podophthalmic +podophthalmite +podophthalmitic +podophthalmous +Podophyllaceae +podophyllic +podophyllin +podophyllotoxin +podophyllous +Podophyllum +podophyllum +podoscaph +podoscapher +podoscopy +Podosomata +podosomatous +podosperm +Podosphaera +Podostemaceae +podostemaceous +podostemad +Podostemon +Podostemonaceae +podostemonaceous +Podostomata +podostomatous +podotheca +podothecal +Podozamites +Podsnap +Podsnappery +podsol +podsolic +podsolization +podsolize +Podunk +Podura +poduran +podurid +Poduridae +podware +podzol +podzolic +podzolization +podzolize +poe +Poecile +Poeciliidae +poecilitic +Poecilocyttares +poecilocyttarous +poecilogonous +poecilogony +poecilomere +poecilonym +poecilonymic +poecilonymy +poecilopod +Poecilopoda +poecilopodous +poem +poematic +poemet +poemlet +Poephaga +poephagous +Poephagus +poesie +poesiless +poesis +poesy +poet +poetaster +poetastering +poetasterism +poetastery +poetastress +poetastric +poetastrical +poetastry +poetcraft +poetdom +poetesque +poetess +poethood +poetic +poetical +poeticality +poetically +poeticalness +poeticism +poeticize +poeticness +poetics +poeticule +poetito +poetization +poetize +poetizer +poetless +poetlike +poetling +poetly +poetomachia +poetress +poetry +poetryless +poetship +poetwise +pogamoggan +pogge +poggy +Pogo +Pogonatum +Pogonia +pogoniasis +pogoniate +pogonion +pogonip +pogoniris +pogonite +pogonological +pogonologist +pogonology +pogonotomy +pogonotrophy +pogrom +pogromist +pogromize +pogy +poh +poha +pohickory +pohna +pohutukawa +poi +Poiana +Poictesme +poietic +poignance +poignancy +poignant +poignantly +poignet +poikilitic +poikiloblast +poikiloblastic +poikilocyte +poikilocythemia +poikilocytosis +poikilotherm +poikilothermic +poikilothermism +poil +poilu +poimenic +poimenics +Poinciana +poind +poindable +poinder +poinding +Poinsettia +point +pointable +pointage +pointed +pointedly +pointedness +pointel +pointer +pointful +pointfully +pointfulness +pointillism +pointillist +pointing +pointingly +pointless +pointlessly +pointlessness +pointlet +pointleted +pointmaker +pointman +pointment +pointrel +pointsman +pointswoman +pointways +pointwise +pointy +poisable +poise +poised +poiser +poison +poisonable +poisonful +poisonfully +poisoning +poisonless +poisonlessness +poisonmaker +poisonous +poisonously +poisonousness +poisonproof +poisonweed +poisonwood +poitrail +poitrel +poivrade +pokable +Pokan +Pokanoket +poke +pokeberry +poked +pokeful +pokeloken +pokeout +poker +pokerish +pokerishly +pokerishness +pokeroot +pokeweed +pokey +pokily +pokiness +poking +Pokom +Pokomam +Pokomo +pokomoo +Pokonchi +pokunt +poky +pol +Polab +Polabian +Polabish +polacca +Polack +polack +polacre +Polander +Polanisia +polar +polaric +Polarid +polarigraphic +polarimeter +polarimetric +polarimetry +Polaris +polariscope +polariscopic +polariscopically +polariscopist +polariscopy +polaristic +polaristrobometer +polarity +polarizability +polarizable +polarization +polarize +polarizer +polarly +polarogram +polarograph +polarographic +polarographically +polarography +Polaroid +polarward +polaxis +poldavis +poldavy +polder +polderboy +polderman +Pole +pole +polearm +poleax +poleaxe +poleaxer +poleburn +polecat +polehead +poleless +poleman +polemarch +polemic +polemical +polemically +polemician +polemicist +polemics +polemist +polemize +Polemoniaceae +polemoniaceous +Polemoniales +Polemonium +polemoscope +polenta +poler +polesetter +Polesian +polesman +polestar +poleward +polewards +poley +poliad +poliadic +Polian +polianite +Polianthes +police +policed +policedom +policeless +policeman +policemanish +policemanism +policemanlike +policemanship +policewoman +Polichinelle +policial +policize +policizer +policlinic +policy +policyholder +poliencephalitis +poliencephalomyelitis +poligar +poligarship +poligraphical +Polinices +polio +polioencephalitis +polioencephalomyelitis +poliomyelitis +poliomyelopathy +polioneuromere +poliorcetic +poliorcetics +poliosis +polis +Polish +polish +polishable +polished +polishedly +polishedness +polisher +polishment +polisman +polissoir +Polistes +politarch +politarchic +Politbureau +Politburo +polite +politeful +politely +politeness +politesse +politic +political +politicalism +politicalize +politically +politicaster +politician +politicious +politicist +politicize +politicizer +politicly +politico +politicomania +politicophobia +politics +politied +Politique +politist +politize +polity +politzerization +politzerize +polk +polka +Poll +poll +pollable +pollack +polladz +pollage +pollakiuria +pollam +pollan +pollarchy +pollard +pollbook +polled +pollen +pollened +polleniferous +pollenigerous +pollenite +pollenivorous +pollenless +pollenlike +pollenproof +pollent +poller +polleten +pollex +pollical +pollicar +pollicate +pollicitation +pollinar +pollinarium +pollinate +pollination +pollinator +pollinctor +pollincture +polling +pollinia +pollinic +pollinical +polliniferous +pollinigerous +pollinium +pollinivorous +pollinization +pollinize +pollinizer +pollinodial +pollinodium +pollinoid +pollinose +pollinosis +polliwig +polliwog +pollock +polloi +pollster +pollucite +pollutant +pollute +polluted +pollutedly +pollutedness +polluter +polluting +pollutingly +pollution +Pollux +pollux +Polly +Pollyanna +Pollyannish +pollywog +polo +poloconic +polocyte +poloist +polonaise +Polonese +Polonia +Polonial +Polonian +Polonism +polonium +Polonius +Polonization +Polonize +polony +polos +polska +polt +poltergeist +poltfoot +poltfooted +poltina +poltinnik +poltophagic +poltophagist +poltophagy +poltroon +poltroonery +poltroonish +poltroonishly +poltroonism +poluphloisboic +poluphloisboiotatotic +poluphloisboiotic +polverine +poly +polyacanthus +polyacid +polyacoustic +polyacoustics +polyact +polyactinal +polyactine +Polyactinia +polyad +polyadelph +Polyadelphia +polyadelphian +polyadelphous +polyadenia +polyadenitis +polyadenoma +polyadenous +polyadic +polyaffectioned +polyalcohol +polyamide +polyamylose +Polyandria +polyandria +polyandrian +polyandrianism +polyandric +polyandrious +polyandrism +polyandrist +polyandrium +polyandrous +polyandry +Polyangium +polyangular +polyantha +polyanthous +polyanthus +polyanthy +polyarch +polyarchal +polyarchical +polyarchist +polyarchy +polyarteritis +polyarthric +polyarthritic +polyarthritis +polyarthrous +polyarticular +polyatomic +polyatomicity +polyautographic +polyautography +polyaxial +polyaxon +polyaxone +polyaxonic +polybasic +polybasicity +polybasite +polyblast +Polyborinae +polyborine +Polyborus +polybranch +Polybranchia +polybranchian +Polybranchiata +polybranchiate +polybromid +polybromide +polybunous +polybuny +polybuttoned +polycarboxylic +Polycarp +polycarpellary +polycarpic +Polycarpon +polycarpous +polycarpy +polycellular +polycentral +polycentric +polycephalic +polycephalous +polycephaly +Polychaeta +polychaete +polychaetous +polychasial +polychasium +polychloride +polychoerany +polychord +polychotomous +polychotomy +polychrest +polychrestic +polychrestical +polychresty +polychroic +polychroism +polychromasia +polychromate +polychromatic +polychromatism +polychromatist +polychromatize +polychromatophil +polychromatophile +polychromatophilia +polychromatophilic +polychrome +polychromia +polychromic +polychromism +polychromize +polychromous +polychromy +polychronious +polyciliate +polycitral +polyclad +Polycladida +polycladine +polycladose +polycladous +polyclady +Polycletan +polyclinic +polyclona +polycoccous +Polycodium +polyconic +polycormic +polycotyl +polycotyledon +polycotyledonary +polycotyledonous +polycotyledony +polycotylous +polycotyly +polycracy +polycrase +polycratic +polycrotic +polycrotism +polycrystalline +polyctenid +Polyctenidae +polycttarian +polycyanide +polycyclic +polycycly +polycyesis +polycystic +polycythemia +polycythemic +Polycyttaria +polydactyl +polydactyle +polydactylism +polydactylous +Polydactylus +polydactyly +polydaemoniac +polydaemonism +polydaemonist +polydaemonistic +polydemic +polydenominational +polydental +polydermous +polydermy +polydigital +polydimensional +polydipsia +polydisperse +polydomous +polydymite +polydynamic +polyeidic +polyeidism +polyembryonate +polyembryonic +polyembryony +polyemia +polyemic +polyenzymatic +polyergic +Polyergus +polyester +polyesthesia +polyesthetic +polyethnic +polyethylene +polyfenestral +polyflorous +polyfoil +polyfold +Polygala +Polygalaceae +polygalaceous +polygalic +polygam +Polygamia +polygamian +polygamic +polygamical +polygamically +polygamist +polygamistic +polygamize +polygamodioecious +polygamous +polygamously +polygamy +polyganglionic +polygastric +polygene +polygenesic +polygenesis +polygenesist +polygenetic +polygenetically +polygenic +polygenism +polygenist +polygenistic +polygenous +polygeny +polyglandular +polyglobulia +polyglobulism +polyglossary +polyglot +polyglotry +polyglottal +polyglottally +polyglotted +polyglotter +polyglottery +polyglottic +polyglottically +polyglottism +polyglottist +polyglottonic +polyglottous +polyglotwise +polyglycerol +polygon +Polygonaceae +polygonaceous +polygonal +Polygonales +polygonally +Polygonatum +Polygonella +polygoneutic +polygoneutism +Polygonia +polygonic +polygonically +polygonoid +polygonous +Polygonum +polygony +Polygordius +polygram +polygrammatic +polygraph +polygrapher +polygraphic +polygraphy +polygroove +polygrooved +polygyn +polygynaiky +Polygynia +polygynian +polygynic +polygynious +polygynist +polygynoecial +polygynous +polygyny +polygyral +polygyria +polyhaemia +polyhaemic +polyhalide +polyhalite +polyhalogen +polyharmonic +polyharmony +polyhedral +polyhedric +polyhedrical +polyhedroid +polyhedron +polyhedrosis +polyhedrous +polyhemia +polyhidrosis +polyhistor +polyhistorian +polyhistoric +polyhistory +polyhybrid +polyhydric +polyhydroxy +polyideic +polyideism +polyidrosis +polyiodide +polykaryocyte +polylaminated +polylemma +polylepidous +polylinguist +polylith +polylithic +polylobular +polylogy +polyloquent +polymagnet +polymastia +polymastic +Polymastiga +polymastigate +Polymastigida +Polymastigina +polymastigous +polymastism +Polymastodon +polymastodont +polymasty +polymath +polymathic +polymathist +polymathy +polymazia +polymelia +polymelian +polymely +polymer +polymere +polymeria +polymeric +polymeride +polymerism +polymerization +polymerize +polymerous +polymetallism +polymetameric +polymeter +polymethylene +polymetochia +polymetochic +polymicrian +polymicrobial +polymicrobic +polymicroscope +polymignite +Polymixia +polymixiid +Polymixiidae +Polymnestor +Polymnia +polymnite +polymolecular +polymolybdate +polymorph +Polymorpha +polymorphean +polymorphic +polymorphism +polymorphistic +polymorphonuclear +polymorphonucleate +polymorphosis +polymorphous +polymorphy +Polymyaria +polymyarian +Polymyarii +Polymyodi +polymyodian +polymyodous +polymyoid +polymyositis +polymythic +polymythy +polynaphthene +polynemid +Polynemidae +polynemoid +Polynemus +Polynesian +polynesic +polyneural +polyneuric +polyneuritic +polyneuritis +polyneuropathy +polynodal +Polynoe +polynoid +Polynoidae +polynome +polynomial +polynomialism +polynomialist +polynomic +polynucleal +polynuclear +polynucleate +polynucleated +polynucleolar +polynucleosis +Polyodon +polyodont +polyodontal +polyodontia +Polyodontidae +polyodontoid +polyoecious +polyoeciously +polyoeciousness +polyoecism +polyoecy +polyoicous +polyommatous +polyonomous +polyonomy +polyonychia +polyonym +polyonymal +polyonymic +polyonymist +polyonymous +polyonymy +polyophthalmic +polyopia +polyopic +polyopsia +polyopsy +polyorama +polyorchidism +polyorchism +polyorganic +polyose +polyoxide +polyoxymethylene +polyp +polypage +polypaged +polypapilloma +polyparasitic +polyparasitism +polyparesis +polyparia +polyparian +polyparium +polyparous +polypary +polypean +polyped +Polypedates +polypeptide +polypetal +Polypetalae +polypetalous +Polyphaga +polyphage +polyphagia +polyphagian +polyphagic +polyphagist +polyphagous +polyphagy +polyphalangism +polypharmacal +polypharmacist +polypharmacon +polypharmacy +polypharmic +polyphasal +polyphase +polyphaser +Polypheme +polyphemian +polyphemic +polyphemous +polyphenol +polyphloesboean +polyphloisboioism +polyphloisboism +polyphobia +polyphobic +polyphone +polyphoned +polyphonia +polyphonic +polyphonical +polyphonism +polyphonist +polyphonium +polyphonous +polyphony +polyphore +polyphosphoric +polyphotal +polyphote +polyphylesis +polyphyletic +polyphyletically +polyphylety +polyphylline +polyphyllous +polyphylly +polyphylogeny +polyphyly +polyphyodont +Polypi +polypi +polypian +polypide +polypidom +Polypifera +polypiferous +polypigerous +polypinnate +polypite +Polyplacophora +polyplacophoran +polyplacophore +polyplacophorous +polyplastic +Polyplectron +polyplegia +polyplegic +polyploid +polyploidic +polyploidy +polypnoea +polypnoeic +polypod +Polypoda +polypodia +Polypodiaceae +polypodiaceous +Polypodium +polypodous +polypody +polypoid +polypoidal +Polypomorpha +polypomorphic +Polyporaceae +polyporaceous +polypore +polyporite +polyporoid +polyporous +Polyporus +polypose +polyposis +polypotome +polypous +polypragmacy +polypragmatic +polypragmatical +polypragmatically +polypragmatism +polypragmatist +polypragmaty +polypragmist +polypragmon +polypragmonic +polypragmonist +polyprene +polyprism +polyprismatic +polyprothetic +polyprotodont +Polyprotodontia +polypseudonymous +polypsychic +polypsychical +polypsychism +polypterid +Polypteridae +polypteroid +Polypterus +polyptote +polyptoton +polyptych +polypus +polyrhizal +polyrhizous +polyrhythmic +polyrhythmical +polysaccharide +polysaccharose +Polysaccum +polysalicylide +polysarcia +polysarcous +polyschematic +polyschematist +polyscope +polyscopic +polysemant +polysemantic +polysemeia +polysemia +polysemous +polysemy +polysensuous +polysensuousness +polysepalous +polyseptate +polyserositis +polysided +polysidedness +polysilicate +polysilicic +Polysiphonia +polysiphonic +polysiphonous +polysomatic +polysomatous +polysomaty +polysomia +polysomic +polysomitic +polysomous +polysomy +polyspast +polyspaston +polyspermal +polyspermatous +polyspermia +polyspermic +polyspermous +polyspermy +polyspondylic +polyspondylous +polyspondyly +Polyspora +polysporangium +polyspore +polyspored +polysporic +polysporous +polystachyous +polystaurion +polystele +polystelic +polystemonous +polystichoid +polystichous +Polystichum +Polystictus +Polystomata +Polystomatidae +polystomatous +polystome +Polystomea +Polystomella +Polystomidae +polystomium +polystylar +polystyle +polystylous +polystyrene +polysulphide +polysulphuration +polysulphurization +polysyllabic +polysyllabical +polysyllabically +polysyllabicism +polysyllabicity +polysyllabism +polysyllable +polysyllogism +polysyllogistic +polysymmetrical +polysymmetrically +polysymmetry +polysyndetic +polysyndetically +polysyndeton +polysynthesis +polysynthesism +polysynthetic +polysynthetical +polysynthetically +polysyntheticism +polysynthetism +polysynthetize +polytechnic +polytechnical +polytechnics +polytechnist +polyterpene +Polythalamia +polythalamian +polythalamic +polythalamous +polythecial +polytheism +polytheist +polytheistic +polytheistical +polytheistically +polytheize +polythelia +polythelism +polythely +polythene +polythionic +polytitanic +polytocous +polytokous +polytoky +polytomous +polytomy +polytonal +polytonalism +polytonality +polytone +polytonic +polytony +polytope +polytopic +polytopical +Polytrichaceae +polytrichaceous +polytrichia +polytrichous +Polytrichum +polytrochal +polytrochous +polytrope +polytrophic +polytropic +polytungstate +polytungstic +polytype +polytypic +polytypical +polytypy +polyuresis +polyuria +polyuric +polyvalence +polyvalent +polyvinyl +polyvinylidene +polyvirulent +polyvoltine +Polyzoa +polyzoal +polyzoan +polyzoarial +polyzoarium +polyzoary +polyzoic +polyzoism +polyzonal +polyzooid +polyzoon +polzenite +pom +pomace +Pomaceae +pomacentrid +Pomacentridae +pomacentroid +Pomacentrus +pomaceous +pomade +Pomaderris +Pomak +pomander +pomane +pomarine +pomarium +pomate +pomato +pomatomid +Pomatomidae +Pomatomus +pomatorhine +pomatum +pombe +pombo +pome +pomegranate +pomelo +Pomeranian +pomeridian +pomerium +pomewater +pomey +pomfret +pomiculture +pomiculturist +pomiferous +pomiform +pomivorous +Pommard +pomme +pommee +pommel +pommeled +pommeler +pommet +pommey +pommy +Pomo +pomological +pomologically +pomologist +pomology +Pomona +pomonal +pomonic +pomp +pompa +Pompadour +pompadour +pompal +pompano +Pompeian +Pompeii +pompelmous +Pompey +pompey +pompholix +pompholygous +pompholyx +pomphus +pompier +pompilid +Pompilidae +pompiloid +Pompilus +pompion +pompist +pompless +pompoleon +pompon +pomposity +pompous +pompously +pompousness +pompster +Pomptine +pomster +pon +Ponca +ponce +ponceau +poncelet +poncho +ponchoed +Poncirus +pond +pondage +pondbush +ponder +ponderability +ponderable +ponderableness +ponderal +ponderance +ponderancy +ponderant +ponderary +ponderate +ponderation +ponderative +ponderer +pondering +ponderingly +ponderling +ponderment +ponderomotive +ponderosapine +ponderosity +ponderous +ponderously +ponderousness +pondfish +pondful +pondgrass +pondlet +pondman +Pondo +pondok +pondokkie +Pondomisi +pondside +pondus +pondweed +pondwort +pondy +pone +ponent +Ponera +Poneramoeba +ponerid +Poneridae +Ponerinae +ponerine +poneroid +ponerology +poney +pong +ponga +pongee +Pongidae +Pongo +poniard +ponica +ponier +ponja +pont +Pontac +Pontacq +pontage +pontal +Pontederia +Pontederiaceae +pontederiaceous +pontee +pontes +pontianak +Pontic +pontic +ponticello +ponticular +ponticulus +pontifex +pontiff +pontific +pontifical +pontificalia +pontificalibus +pontificality +pontifically +pontificate +pontification +pontifices +pontificial +pontificially +pontificious +pontify +pontil +pontile +pontin +Pontine +pontine +pontist +pontlevis +ponto +Pontocaspian +pontocerebellar +ponton +pontonier +pontoon +pontooneer +pontooner +pontooning +Pontus +pontvolant +pony +ponzite +pooa +pooch +pooder +poodle +poodledom +poodleish +poodleship +poof +poogye +pooh +poohpoohist +pook +pooka +pookaun +pookoo +pool +pooler +pooli +poolroom +poolroot +poolside +poolwort +pooly +poon +poonac +poonga +poonghie +poop +pooped +poophyte +poophytic +poor +poorhouse +poorish +poorliness +poorling +poorly +poorlyish +poormaster +poorness +poorweed +poorwill +poot +Pop +pop +popadam +popal +popcorn +popdock +pope +Popean +popedom +popeholy +popehood +popeism +popeler +popeless +popelike +popeline +popely +popery +popeship +popess +popeye +popeyed +popglove +popgun +popgunner +popgunnery +Popian +popify +popinac +popinjay +Popish +popish +popishly +popishness +popjoy +poplar +poplared +Poplilia +poplin +poplinette +popliteal +popliteus +poplolly +Popocracy +Popocrat +Popolari +Popoloco +popomastic +popover +Popovets +poppa +poppability +poppable +poppean +poppel +popper +poppet +poppethead +poppied +poppin +popple +popply +poppy +poppycock +poppycockish +poppyfish +poppyhead +poppylike +poppywort +popshop +populace +popular +popularism +Popularist +popularity +popularization +popularize +popularizer +popularly +popularness +populate +population +populational +populationist +populationistic +populationless +populator +populicide +populin +Populism +Populist +Populistic +populous +populously +populousness +Populus +popweed +poral +porbeagle +porcate +porcated +porcelain +porcelainization +porcelainize +porcelainlike +porcelainous +porcelaneous +porcelanic +porcelanite +porcelanous +Porcellana +porcellanian +porcellanid +Porcellanidae +porcellanize +porch +porched +porching +porchless +porchlike +porcine +Porcula +porcupine +porcupinish +pore +pored +porelike +Porella +porencephalia +porencephalic +porencephalitis +porencephalon +porencephalous +porencephalus +porencephaly +porer +porge +porger +porgy +Poria +poricidal +Porifera +poriferal +poriferan +poriferous +poriform +porimania +poriness +poring +poringly +poriomanic +porism +porismatic +porismatical +porismatically +poristic +poristical +porite +Porites +Poritidae +poritoid +pork +porkburger +porker +porkery +porket +porkfish +porkish +porkless +porkling +porkman +Porkopolis +porkpie +porkwood +porky +pornerastic +pornocracy +pornocrat +pornograph +pornographer +pornographic +pornographically +pornographist +pornography +pornological +Porocephalus +porodine +porodite +porogam +porogamic +porogamous +porogamy +porokaiwhiria +porokeratosis +Porokoto +poroma +porometer +porophyllous +poroplastic +poroporo +pororoca +poros +poroscope +poroscopic +poroscopy +porose +poroseness +porosimeter +porosis +porosity +porotic +porotype +porous +porously +porousness +porpentine +porphine +Porphyra +Porphyraceae +porphyraceous +porphyratin +Porphyrean +porphyria +Porphyrian +porphyrian +Porphyrianist +porphyrin +porphyrine +porphyrinuria +Porphyrio +porphyrion +porphyrite +porphyritic +porphyroblast +porphyroblastic +porphyrogene +porphyrogenite +porphyrogenitic +porphyrogenitism +porphyrogeniture +porphyrogenitus +porphyroid +porphyrophore +porphyrous +porphyry +Porpita +porpitoid +porpoise +porpoiselike +porporate +porr +porraceous +porrect +porrection +porrectus +porret +porridge +porridgelike +porridgy +porriginous +porrigo +Porrima +porringer +porriwiggle +porry +port +porta +portability +portable +portableness +portably +portage +portague +portahepatis +portail +portal +portaled +portalled +portalless +portamento +portance +portass +portatile +portative +portcrayon +portcullis +porteacid +ported +porteligature +portend +portendance +portendment +Porteno +portension +portent +portention +portentosity +portentous +portentously +portentousness +porteous +porter +porterage +Porteranthus +porteress +porterhouse +porterlike +porterly +portership +portfire +portfolio +portglaive +portglave +portgrave +Porthetria +Portheus +porthole +porthook +porthors +porthouse +Portia +portia +portico +porticoed +portiere +portiered +portifory +portify +portio +portiomollis +portion +portionable +portional +portionally +portioner +portionist +portionize +portionless +portitor +Portlandian +portlast +portless +portlet +portligature +portlily +portliness +portly +portman +portmanmote +portmanteau +portmanteaux +portmantle +portmantologism +portment +portmoot +porto +portoise +portolan +portolano +Portor +portrait +portraitist +portraitlike +portraiture +portray +portrayable +portrayal +portrayer +portrayist +portrayment +portreeve +portreeveship +portress +portside +portsider +portsman +portuary +portugais +Portugal +Portugalism +Portugee +Portuguese +Portulaca +Portulacaceae +portulacaceous +Portulacaria +portulan +Portunalia +portunian +Portunidae +Portunus +portway +porty +porule +porulose +porulous +porus +porwigle +pory +Porzana +posadaship +posca +pose +Poseidon +Poseidonian +posement +poser +poseur +posey +posh +posing +posingly +posit +position +positional +positioned +positioner +positionless +positival +positive +positively +positiveness +positivism +positivist +positivistic +positivistically +positivity +positivize +positor +positron +positum +positure +Posnanian +posnet +posole +posologic +posological +posologist +posology +pospolite +poss +posse +posseman +possess +possessable +possessed +possessedly +possessedness +possessing +possessingly +possessingness +possession +possessional +possessionalism +possessionalist +possessionary +possessionate +possessioned +possessioner +possessionist +possessionless +possessionlessness +possessival +possessive +possessively +possessiveness +possessor +possessoress +possessorial +possessoriness +possessorship +possessory +posset +possibilism +possibilist +possibilitate +possibility +possible +possibleness +possibly +possum +possumwood +post +postabdomen +postabdominal +postable +postabortal +postacetabular +postadjunct +postage +postal +postallantoic +postally +postalveolar +postament +postamniotic +postanal +postanesthetic +postantennal +postaortic +postapoplectic +postappendicular +postarterial +postarthritic +postarticular +postarytenoid +postaspirate +postaspirated +postasthmatic +postatrial +postauditory +postauricular +postaxiad +postaxial +postaxially +postaxillary +postbag +postbaptismal +postbox +postboy +postbrachial +postbrachium +postbranchial +postbreakfast +postbronchial +postbuccal +postbulbar +postbursal +postcaecal +postcalcaneal +postcalcarine +postcanonical +postcardiac +postcardinal +postcarnate +postcarotid +postcart +postcartilaginous +postcatarrhal +postcava +postcaval +postcecal +postcenal +postcentral +postcentrum +postcephalic +postcerebellar +postcerebral +postcesarean +postcibal +postclassic +postclassical +postclassicism +postclavicle +postclavicula +postclavicular +postclimax +postclitellian +postclival +postcolon +postcolonial +postcolumellar +postcomitial +postcommissural +postcommissure +postcommunicant +Postcommunion +postconceptive +postcondylar +postconfinement +postconnubial +postconsonantal +postcontact +postcontract +postconvalescent +postconvulsive +postcordial +postcornu +postcosmic +postcostal +postcoxal +postcritical +postcrural +postcubital +postdate +postdental +postdepressive +postdetermined +postdevelopmental +postdiagnostic +postdiaphragmatic +postdiastolic +postdicrotic +postdigestive +postdigital +postdiluvial +postdiluvian +postdiphtheric +postdiphtheritic +postdisapproved +postdisseizin +postdisseizor +postdoctoral +postdoctorate +postdural +postdysenteric +posted +posteen +postelection +postelementary +postembryonal +postembryonic +postemporal +postencephalitic +postencephalon +postenteral +postentry +postepileptic +poster +posterette +posteriad +posterial +posterior +posterioric +posteriorically +posterioristic +posterioristically +posteriority +posteriorly +posteriormost +posteriors +posteriorums +posterish +posterishness +posterist +posterity +posterize +postern +posteroclusion +posterodorsad +posterodorsal +posterodorsally +posteroexternal +posteroinferior +posterointernal +posterolateral +posteromedial +posteromedian +posteromesial +posteroparietal +posterosuperior +posterotemporal +posteroterminal +posteroventral +posteruptive +postesophageal +posteternity +postethmoid +postexilian +postexilic +postexist +postexistence +postexistency +postexistent +postface +postfact +postfebrile +postfemoral +postfetal +postfix +postfixal +postfixation +postfixed +postfixial +postflection +postflexion +postform +postfoveal +postfrontal +postfurca +postfurcal +postganglionic +postgangrenal +postgastric +postgeminum +postgenial +postgeniture +postglacial +postglenoid +postglenoidal +postgonorrheic +postgracile +postgraduate +postgrippal +posthabit +posthaste +posthemiplegic +posthemorrhagic +posthepatic +posthetomist +posthetomy +posthexaplaric +posthippocampal +posthitis +postholder +posthole +posthouse +posthumeral +posthumous +posthumously +posthumousness +posthumus +posthyoid +posthypnotic +posthypnotically +posthypophyseal +posthypophysis +posthysterical +postic +postical +postically +posticous +posticteric +posticum +postil +postilion +postilioned +postillate +postillation +postillator +postimpressionism +postimpressionist +postimpressionistic +postinfective +postinfluenzal +posting +postingly +postintestinal +postique +postischial +postjacent +postjugular +postlabial +postlachrymal +postlaryngeal +postlegitimation +postlenticular +postless +postlike +postliminary +postliminiary +postliminious +postliminium +postliminous +postliminy +postloitic +postloral +postlude +postludium +postluetic +postmalarial +postmamillary +postmammary +postman +postmandibular +postmaniacal +postmarital +postmark +postmarriage +postmaster +postmasterlike +postmastership +postmastoid +postmaturity +postmaxillary +postmaximal +postmeatal +postmedia +postmedial +postmedian +postmediastinal +postmediastinum +postmedullary +postmeiotic +postmeningeal +postmenstrual +postmental +postmeridian +postmeridional +postmesenteric +postmillenarian +postmillenarianism +postmillennial +postmillennialism +postmillennialist +postmillennian +postmineral +postmistress +postmortal +postmortuary +postmundane +postmuscular +postmutative +postmycotic +postmyxedematous +postnarial +postnaris +postnasal +postnatal +postnate +postnati +postnecrotic +postnephritic +postneural +postneuralgic +postneuritic +postneurotic +postnodular +postnominal +postnotum +postnuptial +postnuptially +postobituary +postocular +postolivary +postomental +postoperative +postoptic +postoral +postorbital +postordination +postorgastic +postosseous +postotic +postpagan +postpaid +postpalatal +postpalatine +postpalpebral +postpaludal +postparalytic +postparietal +postparotid +postparotitic +postparoxysmal +postparturient +postpatellar +postpathological +postpericardial +postpharyngeal +postphlogistic +postphragma +postphrenic +postphthisic +postpituitary +postplace +postplegic +postpneumonic +postponable +postpone +postponement +postponence +postponer +postpontile +postpose +postposited +postposition +postpositional +postpositive +postpositively +postprandial +postprandially +postpredicament +postprophesy +postprostate +postpubertal +postpubescent +postpubic +postpubis +postpuerperal +postpulmonary +postpupillary +postpycnotic +postpyloric +postpyramidal +postpyretic +postrachitic +postramus +postrectal +postreduction +postremogeniture +postremote +postrenal +postresurrection +postresurrectional +postretinal +postrheumatic +postrhinal +postrider +postrorse +postrostral +postrubeolar +postsaccular +postsacral +postscalenus +postscapula +postscapular +postscapularis +postscarlatinal +postscenium +postscorbutic +postscribe +postscript +postscriptum +postscutellar +postscutellum +postseason +postsigmoid +postsign +postspasmodic +postsphenoid +postsphenoidal +postsphygmic +postspinous +postsplenial +postsplenic +poststernal +poststertorous +postsuppurative +postsurgical +postsynaptic +postsynsacral +postsyphilitic +postsystolic +posttabetic +posttarsal +posttetanic +postthalamic +postthoracic +postthyroidal +posttibial +posttonic +posttoxic +posttracheal +posttrapezoid +posttraumatic +posttreaty +posttubercular +posttussive +posttympanic +posttyphoid +postulancy +postulant +postulantship +postulata +postulate +postulation +postulational +postulator +postulatory +postulatum +postulnar +postumbilical +postumbonal +postural +posture +posturer +postureteric +posturist +posturize +postuterine +postvaccinal +postvaricellar +postvarioloid +postvelar +postvenereal +postvenous +postverbal +Postverta +postvertebral +postvesical +postvide +postvocalic +postwar +postward +postwise +postwoman +postxyphoid +postyard +postzygapophysial +postzygapophysis +posy +pot +potability +potable +potableness +potagerie +potagery +potamic +Potamobiidae +Potamochoerus +Potamogale +Potamogalidae +Potamogeton +Potamogetonaceae +potamogetonaceous +potamological +potamologist +potamology +potamometer +Potamonidae +potamophilous +potamoplankton +potash +potashery +potass +potassa +potassamide +potassic +potassiferous +potassium +potate +potation +potative +potato +potatoes +potator +potatory +Potawatami +Potawatomi +potbank +potbellied +potbelly +potboil +potboiler +potboy +potboydom +potch +potcher +potcherman +potcrook +potdar +pote +potecary +poteen +potence +potency +potent +potentacy +potentate +potential +potentiality +potentialization +potentialize +potentially +potentialness +potentiate +potentiation +Potentilla +potentiometer +potentiometric +potentize +potently +potentness +poter +Poterium +potestal +potestas +potestate +potestative +poteye +potful +potgirl +potgun +pothanger +pothead +pothecary +potheen +pother +potherb +potherment +pothery +pothole +pothook +pothookery +Pothos +pothouse +pothousey +pothunt +pothunter +pothunting +poticary +potichomania +potichomanist +potifer +Potiguara +potion +potlatch +potleg +potlicker +potlid +potlike +potluck +potmaker +potmaking +potman +potomania +potomato +potometer +potong +potoo +Potoroinae +potoroo +Potorous +potpie +potpourri +potrack +potsherd +potshoot +potshooter +potstick +potstone +pott +pottage +pottagy +pottah +potted +potter +potterer +potteress +potteringly +pottery +Pottiaceae +potting +pottinger +pottle +pottled +potto +potty +potwaller +potwalling +potware +potwhisky +potwork +potwort +pouce +poucer +poucey +pouch +pouched +pouchful +pouchless +pouchlike +pouchy +poudrette +pouf +poulaine +poulard +poulardize +poulp +poulpe +poult +poulter +poulterer +poulteress +poultice +poulticewise +poultry +poultrydom +poultryist +poultryless +poultrylike +poultryman +poultryproof +pounamu +pounce +pounced +pouncer +pouncet +pouncing +pouncingly +pound +poundage +poundal +poundcake +pounder +pounding +poundkeeper +poundless +poundlike +poundman +poundmaster +poundmeal +poundstone +poundworth +pour +pourer +pourie +pouring +pouringly +pourparler +pourparley +pourpiece +pourpoint +pourpointer +pouser +poussette +pout +pouter +poutful +pouting +poutingly +pouty +poverish +poverishment +poverty +povertyweed +Povindah +pow +powder +powderable +powdered +powderer +powderiness +powdering +powderization +powderize +powderizer +powderlike +powderman +powdery +powdike +powdry +powellite +power +powerboat +powered +powerful +powerfully +powerfulness +powerhouse +powerless +powerlessly +powerlessness +powermonger +Powhatan +powitch +powldoody +pownie +powsoddy +powsowdy +powwow +powwower +powwowism +pox +poxy +poy +poyou +pozzolanic +pozzuolana +pozzuolanic +praam +prabble +prabhu +practic +practicability +practicable +practicableness +practicably +practical +practicalism +practicalist +practicality +practicalization +practicalize +practicalizer +practically +practicalness +practicant +practice +practiced +practicedness +practicer +practician +practicianism +practicum +practitional +practitioner +practitionery +prad +Pradeep +pradhana +praeabdomen +praeacetabular +praeanal +praecava +praecipe +praecipuum +praecoces +praecocial +praecognitum +praecoracoid +praecordia +praecordial +praecordium +praecornu +praecox +praecuneus +praedial +praedialist +praediality +praeesophageal +praefect +praefectorial +praefectus +praefervid +praefloration +praefoliation +praehallux +praelabrum +praelection +praelector +praelectorship +praelectress +praeludium +praemaxilla +praemolar +praemunire +praenarial +Praenestine +Praenestinian +praeneural +praenomen +praenomina +praenominal +praeoperculum +praepositor +praepostor +praepostorial +praepubis +praepuce +praescutum +Praesepe +praesertim +Praesian +praesidium +praesphenoid +praesternal +praesternum +praestomium +praesystolic +praetaxation +praetexta +praetor +praetorial +Praetorian +praetorian +praetorianism +praetorium +praetorship +praezygapophysis +pragmatic +pragmatica +pragmatical +pragmaticality +pragmatically +pragmaticalness +pragmaticism +pragmatics +pragmatism +pragmatist +pragmatistic +pragmatize +pragmatizer +prairie +prairiecraft +prairied +prairiedom +prairielike +prairieweed +prairillon +praisable +praisableness +praisably +praise +praiseful +praisefully +praisefulness +praiseless +praiseproof +praiser +praiseworthy +praising +praisingly +praisworthily +praisworthiness +Prajapati +prajna +Prakash +Prakrit +prakriti +Prakritic +Prakritize +praline +pralltriller +pram +Pramnian +prana +prance +pranceful +prancer +prancing +prancingly +prancy +prandial +prandially +prank +pranked +pranker +prankful +prankfulness +pranking +prankingly +prankish +prankishly +prankishness +prankle +pranksome +pranksomeness +prankster +pranky +prase +praseocobaltic +praseodidymium +praseodymia +praseodymium +praseolite +prasine +prasinous +prasoid +prasophagous +prasophagy +prastha +prat +pratal +Pratap +Pratapwant +prate +prateful +pratement +pratensian +Prater +prater +pratey +pratfall +pratiloma +Pratincola +pratincole +pratincoline +pratincolous +prating +pratingly +pratique +pratiyasamutpada +Pratt +prattfall +prattle +prattlement +prattler +prattling +prattlingly +prattly +prau +Pravin +pravity +prawn +prawner +prawny +Praxean +Praxeanist +praxinoscope +praxiology +praxis +Praxitelean +pray +praya +prayer +prayerful +prayerfully +prayerfulness +prayerless +prayerlessly +prayerlessness +prayermaker +prayermaking +prayerwise +prayful +praying +prayingly +prayingwise +preabdomen +preabsorb +preabsorbent +preabstract +preabundance +preabundant +preabundantly +preaccept +preacceptance +preaccess +preaccessible +preaccidental +preaccidentally +preaccommodate +preaccommodating +preaccommodatingly +preaccommodation +preaccomplish +preaccomplishment +preaccord +preaccordance +preaccount +preaccounting +preaccredit +preaccumulate +preaccumulation +preaccusation +preaccuse +preaccustom +preaccustomed +preacetabular +preach +preachable +preacher +preacherdom +preacheress +preacherize +preacherless +preacherling +preachership +preachieved +preachification +preachify +preachily +preachiness +preaching +preachingly +preachman +preachment +preachy +preacid +preacidity +preacidly +preacidness +preacknowledge +preacknowledgment +preacquaint +preacquaintance +preacquire +preacquired +preacquit +preacquittal +preact +preaction +preactive +preactively +preactivity +preacute +preacutely +preacuteness +preadamic +preadamite +preadamitic +preadamitical +preadamitism +preadapt +preadaptable +preadaptation +preaddition +preadditional +preaddress +preadequacy +preadequate +preadequately +preadhere +preadherence +preadherent +preadjectival +preadjective +preadjourn +preadjournment +preadjunct +preadjust +preadjustable +preadjustment +preadministration +preadministrative +preadministrator +preadmire +preadmirer +preadmission +preadmit +preadmonish +preadmonition +preadolescent +preadopt +preadoption +preadoration +preadore +preadorn +preadornment +preadult +preadulthood +preadvance +preadvancement +preadventure +preadvertency +preadvertent +preadvertise +preadvertisement +preadvice +preadvisable +preadvise +preadviser +preadvisory +preadvocacy +preadvocate +preaestival +preaffect +preaffection +preaffidavit +preaffiliate +preaffiliation +preaffirm +preaffirmation +preaffirmative +preafflict +preaffliction +preafternoon +preaged +preaggravate +preaggravation +preaggression +preaggressive +preagitate +preagitation +preagonal +preagony +preagree +preagreement +preagricultural +preagriculture +prealarm +prealcohol +prealcoholic +prealgebra +prealgebraic +prealkalic +preallable +preallably +preallegation +preallege +prealliance +preallied +preallot +preallotment +preallow +preallowable +preallowably +preallowance +preallude +preallusion +preally +prealphabet +prealphabetical +prealtar +prealteration +prealveolar +preamalgamation +preambassadorial +preambition +preambitious +preamble +preambled +preambling +preambular +preambulary +preambulate +preambulation +preambulatory +preanal +preanaphoral +preanesthetic +preanimism +preannex +preannounce +preannouncement +preannouncer +preantepenult +preantepenultimate +preanterior +preanticipate +preantiquity +preantiseptic +preaortic +preappearance +preapperception +preapplication +preappoint +preappointment +preapprehension +preapprise +preapprobation +preapproval +preapprove +preaptitude +prearm +prearrange +prearrangement +prearrest +prearrestment +prearticulate +preartistic +preascertain +preascertainment +preascitic +preaseptic +preassigned +preassume +preassurance +preassure +preataxic +preattachment +preattune +preaudience +preauditory +preaver +preavowal +preaxiad +preaxial +preaxially +prebachelor +prebacillary +prebake +prebalance +preballot +preballoting +prebankruptcy +prebaptismal +prebaptize +prebarbaric +prebarbarous +prebargain +prebasal +prebasilar +prebeleve +prebelief +prebeliever +prebelieving +prebellum +prebeloved +prebend +prebendal +prebendary +prebendaryship +prebendate +prebenediction +prebeneficiary +prebenefit +prebeset +prebestow +prebestowal +prebetray +prebetrayal +prebetrothal +prebid +prebidding +prebill +prebless +preblessing +preblockade +preblooming +preboast +preboding +preboil +preborn +preborrowing +preboyhood +prebrachial +prebrachium +prebreathe +prebridal +prebroadcasting +prebromidic +prebronchial +prebronze +prebrute +prebuccal +prebudget +prebudgetary +prebullying +preburlesque +preburn +precalculable +precalculate +precalculation +precampaign +precancel +precancellation +precancerous +precandidacy +precandidature +precanning +precanonical +precant +precantation +precanvass +precapillary +precapitalist +precapitalistic +precaptivity +precapture +precarcinomatous +precardiac +precaria +precarious +precariously +precariousness +precarium +precarnival +precartilage +precartilaginous +precary +precast +precation +precative +precatively +precatory +precaudal +precausation +precaution +precautional +precautionary +precautious +precautiously +precautiousness +precava +precaval +precedable +precede +precedence +precedency +precedent +precedentable +precedentary +precedented +precedential +precedentless +precedently +preceder +preceding +precelebrant +precelebrate +precelebration +precensure +precensus +precent +precentor +precentorial +precentorship +precentory +precentral +precentress +precentrix +precentrum +precept +preception +preceptist +preceptive +preceptively +preceptor +preceptoral +preceptorate +preceptorial +preceptorially +preceptorship +preceptory +preceptress +preceptual +preceptually +preceramic +precerebellar +precerebral +precerebroid +preceremonial +preceremony +precertification +precertify +preces +precess +precession +precessional +prechallenge +prechampioned +prechampionship +precharge +prechart +precheck +prechemical +precherish +prechildhood +prechill +prechloric +prechloroform +prechoice +prechoose +prechordal +prechoroid +preciation +precinct +precinction +precinctive +preciosity +precious +preciously +preciousness +precipe +precipice +precipiced +precipitability +precipitable +precipitance +precipitancy +precipitant +precipitantly +precipitantness +precipitate +precipitated +precipitatedly +precipitately +precipitation +precipitative +precipitator +precipitin +precipitinogen +precipitinogenic +precipitous +precipitously +precipitousness +precirculate +precirculation +precis +precise +precisely +preciseness +precisian +precisianism +precisianist +precision +precisional +precisioner +precisionism +precisionist +precisionize +precisive +precitation +precite +precited +precivilization +preclaim +preclaimant +preclaimer +preclassic +preclassical +preclassification +preclassified +preclassify +preclean +precleaner +precleaning +preclerical +preclimax +preclinical +preclival +precloacal +preclose +preclosure +preclothe +precludable +preclude +preclusion +preclusive +preclusively +precoagulation +precoccygeal +precocial +precocious +precociously +precociousness +precocity +precogitate +precogitation +precognition +precognitive +precognizable +precognizant +precognize +precognosce +precoil +precoiler +precoincidence +precoincident +precoincidently +precollapsable +precollapse +precollect +precollectable +precollection +precollector +precollege +precollegiate +precollude +precollusion +precollusive +precolor +precolorable +precoloration +precoloring +precombat +precombatant +precombination +precombine +precombustion +precommand +precommend +precomment +precommercial +precommissural +precommissure +precommit +precommune +precommunicate +precommunication +precommunion +precompare +precomparison +precompass +precompel +precompensate +precompensation +precompilation +precompile +precompiler +precompleteness +precompletion +precompliance +precompliant +precomplicate +precomplication +precompose +precomposition +precompound +precompounding +precompoundly +precomprehend +precomprehension +precomprehensive +precompress +precompulsion +precomradeship +preconceal +preconcealment +preconcede +preconceivable +preconceive +preconceived +preconcentrate +preconcentrated +preconcentratedly +preconcentration +preconcept +preconception +preconceptional +preconceptual +preconcern +preconcernment +preconcert +preconcerted +preconcertedly +preconcertedness +preconcertion +preconcertive +preconcession +preconcessive +preconclude +preconclusion +preconcur +preconcurrence +preconcurrent +preconcurrently +precondemn +precondemnation +precondensation +precondense +precondition +preconditioned +preconduct +preconduction +preconductor +precondylar +precondyloid +preconfer +preconference +preconfess +preconfession +preconfide +preconfiguration +preconfigure +preconfine +preconfinedly +preconfinemnt +preconfirm +preconfirmation +preconflict +preconform +preconformity +preconfound +preconfuse +preconfusedly +preconfusion +precongenial +precongested +precongestion +precongestive +precongratulate +precongratulation +precongressional +preconizance +preconization +preconize +preconizer +preconjecture +preconnection +preconnective +preconnubial +preconquer +preconquest +preconquestal +preconquestual +preconscious +preconsciously +preconsciousness +preconsecrate +preconsecration +preconsent +preconsider +preconsideration +preconsign +preconsolation +preconsole +preconsolidate +preconsolidated +preconsolidation +preconsonantal +preconspiracy +preconspirator +preconspire +preconstituent +preconstitute +preconstruct +preconstruction +preconsult +preconsultation +preconsultor +preconsume +preconsumer +preconsumption +precontact +precontain +precontained +precontemn +precontemplate +precontemplation +precontemporaneous +precontemporary +precontend +precontent +precontention +precontently +precontentment +precontest +precontinental +precontract +precontractive +precontractual +precontribute +precontribution +precontributive +precontrivance +precontrive +precontrol +precontrolled +precontroversial +precontroversy +preconvention +preconversation +preconversational +preconversion +preconvert +preconvey +preconveyal +preconveyance +preconvict +preconviction +preconvince +precook +precooker +precool +precooler +precooling +precopy +precoracoid +precordia +precordial +precordiality +precordially +precordium +precorneal +precornu +precoronation +precorrect +precorrection +precorrectly +precorrectness +precorrespond +precorrespondence +precorrespondent +precorridor +precorrupt +precorruption +precorruptive +precorruptly +precoruptness +precosmic +precosmical +precostal +precounsel +precounsellor +precourse +precover +precovering +precox +precreate +precreation +precreative +precredit +precreditor +precreed +precritical +precriticism +precriticize +precrucial +precrural +precrystalline +precultivate +precultivation +precultural +preculturally +preculture +precuneal +precuneate +precuneus +precure +precurrent +precurricular +precurriculum +precursal +precurse +precursive +precursor +precursory +precurtain +precut +precyclone +precyclonic +precynical +precyst +precystic +predable +predacean +predaceous +predaceousness +predacity +predamage +predamn +predamnation +predark +predarkness +predata +predate +predation +predatism +predative +predator +predatorily +predatoriness +predatory +predawn +preday +predaylight +predaytime +predazzite +predealer +predealing +predeath +predeathly +predebate +predebater +predebit +predebtor +predecay +predecease +predeceaser +predeceive +predeceiver +predeception +predecession +predecessor +predecessorship +predecide +predecision +predecisive +predeclaration +predeclare +predeclination +predecline +predecree +prededicate +prededuct +prededuction +predefault +predefeat +predefect +predefective +predefence +predefend +predefense +predefiance +predeficiency +predeficient +predefine +predefinite +predefinition +predefray +predefrayal +predefy +predegeneracy +predegenerate +predegree +predeication +predelay +predelegate +predelegation +predeliberate +predeliberately +predeliberation +predelineate +predelineation +predelinquency +predelinquent +predelinquently +predeliver +predelivery +predella +predelude +predelusion +predemand +predemocracy +predemocratic +predemonstrate +predemonstration +predemonstrative +predenial +predental +predentary +Predentata +predentate +predeny +predepart +predepartmental +predeparture +predependable +predependence +predependent +predeplete +predepletion +predeposit +predepository +predepreciate +predepreciation +predepression +predeprivation +predeprive +prederivation +prederive +predescend +predescent +predescribe +predescription +predesert +predeserter +predesertion +predeserve +predeserving +predesign +predesignate +predesignation +predesignatory +predesirous +predesolate +predesolation +predespair +predesperate +predespicable +predespise +predespond +predespondency +predespondent +predestinable +predestinarian +predestinarianism +predestinate +predestinately +predestination +predestinational +predestinationism +predestinationist +predestinative +predestinator +predestine +predestiny +predestitute +predestitution +predestroy +predestruction +predetach +predetachment +predetail +predetain +predetainer +predetect +predetention +predeterminability +predeterminable +predeterminant +predeterminate +predeterminately +predetermination +predeterminative +predetermine +predeterminer +predeterminism +predeterministic +predetest +predetestation +predetrimental +predevelop +predevelopment +predevise +predevote +predevotion +predevour +prediagnosis +prediagnostic +predial +prediastolic +prediatory +predicability +predicable +predicableness +predicably +predicament +predicamental +predicamentally +predicant +predicate +predication +predicational +predicative +predicatively +predicator +predicatory +predicrotic +predict +predictability +predictable +predictably +predictate +predictation +prediction +predictional +predictive +predictively +predictiveness +predictor +predictory +prediet +predietary +predifferent +predifficulty +predigest +predigestion +predikant +predilect +predilected +predilection +prediligent +prediligently +prediluvial +prediluvian +prediminish +prediminishment +prediminution +predine +predinner +prediphtheritic +prediploma +prediplomacy +prediplomatic +predirect +predirection +predirector +predisability +predisable +predisadvantage +predisadvantageous +predisadvantageously +predisagree +predisagreeable +predisagreement +predisappointment +predisaster +predisastrous +prediscern +prediscernment +predischarge +prediscipline +predisclose +predisclosure +prediscontent +prediscontented +prediscontentment +prediscontinuance +prediscontinuation +prediscontinue +prediscount +prediscountable +prediscourage +prediscouragement +prediscourse +prediscover +prediscoverer +prediscovery +prediscreet +prediscretion +prediscretionary +prediscriminate +prediscrimination +prediscriminator +prediscuss +prediscussion +predisgrace +predisguise +predisgust +predislike +predismiss +predismissal +predismissory +predisorder +predisordered +predisorderly +predispatch +predispatcher +predisperse +predispersion +predisplace +predisplacement +predisplay +predisponency +predisponent +predisposable +predisposal +predispose +predisposed +predisposedly +predisposedness +predisposition +predispositional +predisputant +predisputation +predispute +predisregard +predisrupt +predisruption +predissatisfaction +predissolution +predissolve +predissuade +predistinct +predistinction +predistinguish +predistress +predistribute +predistribution +predistributor +predistrict +predistrust +predistrustful +predisturb +predisturbance +prediversion +predivert +predivide +predividend +predivider +predivinable +predivinity +predivision +predivorce +predivorcement +predoctorate +predocumentary +predomestic +predominance +predominancy +predominant +predominantly +predominate +predominately +predominatingly +predomination +predominator +predonate +predonation +predonor +predoom +predorsal +predoubt +predoubter +predoubtful +predraft +predrainage +predramatic +predraw +predrawer +predread +predreadnought +predrill +predriller +predrive +predriver +predry +preduplicate +preduplication +predusk +predwell +predynamite +predynastic +preen +preener +preeze +prefab +prefabricate +prefabrication +prefabricator +preface +prefaceable +prefacer +prefacial +prefacist +prefactor +prefactory +prefamiliar +prefamiliarity +prefamiliarly +prefamous +prefashion +prefatial +prefator +prefatorial +prefatorially +prefatorily +prefatory +prefavor +prefavorable +prefavorably +prefavorite +prefearful +prefearfully +prefeast +prefect +prefectly +prefectoral +prefectorial +prefectorially +prefectorian +prefectship +prefectual +prefectural +prefecture +prefecundation +prefecundatory +prefederal +prefelic +prefer +preferability +preferable +preferableness +preferably +preferee +preference +preferent +preferential +preferentialism +preferentialist +preferentially +preferment +prefermentation +preferred +preferredly +preferredness +preferrer +preferrous +prefertile +prefertility +prefertilization +prefertilize +prefervid +prefestival +prefeudal +prefeudalic +prefeudalism +prefiction +prefictional +prefigurate +prefiguration +prefigurative +prefiguratively +prefigurativeness +prefigure +prefigurement +prefiller +prefilter +prefinal +prefinance +prefinancial +prefine +prefinish +prefix +prefixable +prefixal +prefixally +prefixation +prefixed +prefixedly +prefixion +prefixture +preflagellate +preflatter +preflattery +preflavor +preflavoring +preflection +preflexion +preflight +preflood +prefloration +preflowering +prefoliation +prefool +preforbidden +preforceps +preforgive +preforgiveness +preforgotten +preform +preformant +preformation +preformationary +preformationism +preformationist +preformative +preformed +preformism +preformist +preformistic +preformulate +preformulation +prefortunate +prefortunately +prefortune +prefoundation +prefounder +prefragrance +prefragrant +prefrankness +prefraternal +prefraternally +prefraud +prefreeze +prefreshman +prefriendly +prefriendship +prefright +prefrighten +prefrontal +prefulfill +prefulfillment +prefulgence +prefulgency +prefulgent +prefunction +prefunctional +prefuneral +prefungoidal +prefurlough +prefurnish +pregain +pregainer +pregalvanize +preganglionic +pregather +pregathering +pregeminum +pregenerate +pregeneration +pregenerosity +pregenerous +pregenerously +pregenial +pregeniculatum +pregeniculum +pregenital +pregeological +pregirlhood +preglacial +pregladden +pregladness +preglenoid +preglenoidal +preglobulin +pregnability +pregnable +pregnance +pregnancy +pregnant +pregnantly +pregnantness +pregolden +pregolfing +pregracile +pregracious +pregrade +pregraduation +pregranite +pregranitic +pregratification +pregratify +pregreet +pregreeting +pregrievance +pregrowth +preguarantee +preguarantor +preguard +preguess +preguidance +preguide +preguilt +preguiltiness +preguilty +pregust +pregustant +pregustation +pregustator +pregustic +prehallux +prehalter +prehandicap +prehandle +prehaps +preharden +preharmonious +preharmoniousness +preharmony +preharsh +preharshness +preharvest +prehatred +prehaunt +prehaunted +prehaustorium +prehazard +prehazardous +preheal +prehearing +preheat +preheated +preheater +prehemiplegic +prehend +prehensible +prehensile +prehensility +prehension +prehensive +prehensiveness +prehensor +prehensorial +prehensory +prehepatic +prehepaticus +preheroic +prehesitancy +prehesitate +prehesitation +prehexameral +prehistorian +prehistoric +prehistorical +prehistorically +prehistorics +prehistory +prehnite +prehnitic +preholder +preholding +preholiday +prehorizon +prehorror +prehostile +prehostility +prehuman +prehumiliate +prehumiliation +prehumor +prehunger +prehydration +prehypophysis +preidea +preidentification +preidentify +preignition +preilluminate +preillumination +preillustrate +preillustration +preimage +preimaginary +preimagination +preimagine +preimbibe +preimbue +preimitate +preimitation +preimitative +preimmigration +preimpair +preimpairment +preimpart +preimperial +preimport +preimportance +preimportant +preimportantly +preimportation +preimposal +preimpose +preimposition +preimpress +preimpression +preimpressive +preimprove +preimprovement +preinaugural +preinaugurate +preincarnate +preincentive +preinclination +preincline +preinclude +preinclusion +preincorporate +preincorporation +preincrease +preindebted +preindebtedness +preindemnification +preindemnify +preindemnity +preindependence +preindependent +preindependently +preindesignate +preindicant +preindicate +preindication +preindispose +preindisposition +preinduce +preinducement +preinduction +preinductive +preindulge +preindulgence +preindulgent +preindustrial +preindustry +preinfect +preinfection +preinfer +preinference +preinflection +preinflectional +preinflict +preinfluence +preinform +preinformation +preinhabit +preinhabitant +preinhabitation +preinhere +preinherit +preinheritance +preinitial +preinitiate +preinitiation +preinjure +preinjurious +preinjury +preinquisition +preinscribe +preinscription +preinsert +preinsertion +preinsinuate +preinsinuating +preinsinuatingly +preinsinuation +preinsinuative +preinspect +preinspection +preinspector +preinspire +preinstall +preinstallation +preinstill +preinstillation +preinstruct +preinstruction +preinstructional +preinstructive +preinsula +preinsular +preinsulate +preinsulation +preinsult +preinsurance +preinsure +preintellectual +preintelligence +preintelligent +preintelligently +preintend +preintention +preintercede +preintercession +preinterchange +preintercourse +preinterest +preinterfere +preinterference +preinterpret +preinterpretation +preinterpretative +preinterview +preintone +preinvent +preinvention +preinventive +preinventory +preinvest +preinvestigate +preinvestigation +preinvestigator +preinvestment +preinvitation +preinvite +preinvocation +preinvolve +preinvolvement +preiotization +preiotize +preirrigation +preirrigational +preissuance +preissue +prejacent +prejournalistic +prejudge +prejudgement +prejudger +prejudgment +prejudication +prejudicative +prejudicator +prejudice +prejudiced +prejudicedly +prejudiceless +prejudiciable +prejudicial +prejudicially +prejudicialness +prejudicious +prejudiciously +prejunior +prejurisdiction +prejustification +prejustify +prejuvenile +Prekantian +prekindergarten +prekindle +preknit +preknow +preknowledge +prelabel +prelabial +prelabor +prelabrum +prelachrymal +prelacrimal +prelacteal +prelacy +prelanguage +prelapsarian +prelate +prelatehood +prelateship +prelatess +prelatial +prelatic +prelatical +prelatically +prelaticalness +prelation +prelatish +prelatism +prelatist +prelatize +prelatry +prelature +prelaunch +prelaunching +prelawful +prelawfully +prelawfulness +prelease +prelect +prelection +prelector +prelectorship +prelectress +prelecture +prelegacy +prelegal +prelegate +prelegatee +prelegend +prelegendary +prelegislative +preliability +preliable +prelibation +preliberal +preliberality +preliberally +preliberate +preliberation +prelicense +prelim +preliminarily +preliminary +prelimit +prelimitate +prelimitation +prelingual +prelinguistic +prelinpinpin +preliquidate +preliquidation +preliteral +preliterally +preliteralness +preliterary +preliterate +preliterature +prelithic +prelitigation +preloan +prelocalization +prelocate +prelogic +prelogical +preloral +preloreal +preloss +prelude +preluder +preludial +preludious +preludiously +preludium +preludize +prelumbar +prelusion +prelusive +prelusively +prelusorily +prelusory +preluxurious +premachine +premadness +premaintain +premaintenance +premake +premaker +premaking +premandibular +premanhood +premaniacal +premanifest +premanifestation +premankind +premanufacture +premanufacturer +premanufacturing +premarital +premarriage +premarry +premastery +prematch +premate +prematerial +prematernity +prematrimonial +prematuration +premature +prematurely +prematureness +prematurity +premaxilla +premaxillary +premeasure +premeasurement +premechanical +premedia +premedial +premedian +premedic +premedical +premedicate +premedication +premedieval +premedievalism +premeditate +premeditatedly +premeditatedness +premeditatingly +premeditation +premeditative +premeditator +premegalithic +prememorandum +premenace +premenstrual +premention +premeridian +premerit +premetallic +premethodical +premial +premiant +premiate +premidnight +premidsummer +premier +premieral +premiere +premieress +premierjus +premiership +premilitary +premillenarian +premillenarianism +premillennial +premillennialism +premillennialist +premillennialize +premillennially +premillennian +preminister +preministry +premious +premisal +premise +premisory +premisrepresent +premisrepresentation +premiss +premium +premix +premixer +premixture +premodel +premodern +premodification +premodify +premolar +premold +premolder +premolding +premonarchial +premonetary +Premongolian +premonish +premonishment +premonition +premonitive +premonitor +premonitorily +premonitory +premonopolize +premonopoly +Premonstrant +Premonstratensian +premonumental +premoral +premorality +premorally +premorbid +premorbidly +premorbidness +premorning +premorse +premortal +premortification +premortify +premortuary +premosaic +premotion +premourn +premove +premovement +premover +premuddle +premultiplication +premultiplier +premultiply +premundane +premunicipal +premunition +premunitory +premusical +premuster +premutative +premutiny +premycotic +premyelocyte +premythical +prename +Prenanthes +prenares +prenarial +prenaris +prenasal +prenatal +prenatalist +prenatally +prenational +prenative +prenatural +prenaval +prender +prendre +prenebular +prenecessitate +preneglect +preneglectful +prenegligence +prenegligent +prenegotiate +prenegotiation +preneolithic +prenephritic +preneural +preneuralgic +prenight +prenoble +prenodal +prenominal +prenominate +prenomination +prenominical +prenotation +prenotice +prenotification +prenotify +prenotion +prentice +prenticeship +prenumber +prenumbering +prenuncial +prenuptial +prenursery +preobedience +preobedient +preobject +preobjection +preobjective +preobligate +preobligation +preoblige +preobservance +preobservation +preobservational +preobserve +preobstruct +preobstruction +preobtain +preobtainable +preobtrude +preobtrusion +preobtrusive +preobviate +preobvious +preobviously +preobviousness +preoccasioned +preoccipital +preocclusion +preoccultation +preoccupancy +preoccupant +preoccupate +preoccupation +preoccupative +preoccupied +preoccupiedly +preoccupiedness +preoccupier +preoccupy +preoccur +preoccurrence +preoceanic +preocular +preodorous +preoffend +preoffense +preoffensive +preoffensively +preoffensiveness +preoffer +preoffering +preofficial +preofficially +preominate +preomission +preomit +preopen +preopening +preoperate +preoperation +preoperative +preoperatively +preoperator +preopercle +preopercular +preoperculum +preopinion +preopinionated +preoppose +preopposition +preoppress +preoppression +preoppressor +preoptic +preoptimistic +preoption +preoral +preorally +preorbital +preordain +preorder +preordination +preorganic +preorganization +preorganize +preoriginal +preoriginally +preornamental +preoutfit +preoutline +preoverthrow +prep +prepainful +prepalatal +prepalatine +prepaleolithic +prepanic +preparable +preparation +preparationist +preparative +preparatively +preparator +preparatorily +preparatory +prepardon +prepare +prepared +preparedly +preparedness +preparement +preparental +preparer +preparietal +preparingly +preparliamentary +preparoccipital +preparoxysmal +prepartake +preparticipation +prepartisan +prepartition +prepartnership +prepatellar +prepatent +prepatriotic +prepave +prepavement +prepay +prepayable +prepayment +prepeduncle +prepenetrate +prepenetration +prepenial +prepense +prepensely +prepeople +preperceive +preperception +preperceptive +preperitoneal +prepersuade +prepersuasion +prepersuasive +preperusal +preperuse +prepetition +prephragma +prephthisical +prepigmental +prepink +prepious +prepituitary +preplace +preplacement +preplacental +preplan +preplant +prepledge +preplot +prepoetic +prepoetical +prepoison +prepolice +prepolish +prepolitic +prepolitical +prepolitically +prepollence +prepollency +prepollent +prepollex +preponder +preponderance +preponderancy +preponderant +preponderantly +preponderate +preponderately +preponderating +preponderatingly +preponderation +preponderous +preponderously +prepontile +prepontine +preportray +preportrayal +prepose +preposition +prepositional +prepositionally +prepositive +prepositively +prepositor +prepositorial +prepositure +prepossess +prepossessed +prepossessing +prepossessingly +prepossessingness +prepossession +prepossessionary +prepossessor +preposterous +preposterously +preposterousness +prepostorship +prepotence +prepotency +prepotent +prepotential +prepotently +prepractical +prepractice +preprandial +prepreference +prepreparation +preprice +preprimary +preprimer +preprimitive +preprint +preprofess +preprofessional +preprohibition +prepromise +prepromote +prepromotion +prepronounce +prepronouncement +preprophetic +preprostatic +preprove +preprovide +preprovision +preprovocation +preprovoke +preprudent +preprudently +prepsychological +prepsychology +prepuberal +prepubertal +prepuberty +prepubescent +prepubic +prepubis +prepublication +prepublish +prepuce +prepunctual +prepunish +prepunishment +prepupa +prepupal +prepurchase +prepurchaser +prepurpose +preputial +preputium +prepyloric +prepyramidal +prequalification +prequalify +prequarantine +prequestion +prequotation +prequote +preracing +preradio +prerailroad +prerailroadite +prerailway +preramus +prerational +prereadiness +preready +prerealization +prerealize +prerebellion +prereceipt +prereceive +prereceiver +prerecital +prerecite +prereckon +prereckoning +prerecognition +prerecognize +prerecommend +prerecommendation +prereconcile +prereconcilement +prereconciliation +prerectal +preredeem +preredemption +prereduction +prerefer +prereference +prerefine +prerefinement +prereform +prereformation +prereformatory +prerefusal +prerefuse +preregal +preregister +preregistration +preregulate +preregulation +prereject +prerejection +prerejoice +prerelate +prerelation +prerelationship +prerelease +prereligious +prereluctation +preremit +preremittance +preremorse +preremote +preremoval +preremove +preremunerate +preremuneration +prerenal +prerent +prerental +prereport +prerepresent +prerepresentation +prereption +prerepublican +prerequest +prerequire +prerequirement +prerequisite +prerequisition +preresemblance +preresemble +preresolve +preresort +prerespectability +prerespectable +prerespiration +prerespire +preresponsibility +preresponsible +prerestoration +prerestrain +prerestraint +prerestrict +prerestriction +prereturn +prereveal +prerevelation +prerevenge +prereversal +prereverse +prereview +prerevise +prerevision +prerevival +prerevolutionary +prerheumatic +prerich +prerighteous +prerighteously +prerighteousness +prerogatival +prerogative +prerogatived +prerogatively +prerogativity +prerolandic +preromantic +preromanticism +preroute +preroutine +preroyal +preroyally +preroyalty +prerupt +preruption +presacral +presacrifice +presacrificial +presage +presageful +presagefully +presager +presagient +presaging +presagingly +presalvation +presanctification +presanctified +presanctify +presanguine +presanitary +presartorial +presatisfaction +presatisfactory +presatisfy +presavage +presavagery +presay +presbyacousia +presbyacusia +presbycousis +presbycusis +presbyope +presbyophrenia +presbyophrenic +presbyopia +presbyopic +presbyopy +presbyte +presbyter +presbyteral +presbyterate +presbyterated +presbyteress +presbyteria +presbyterial +presbyterially +Presbyterian +Presbyterianism +Presbyterianize +Presbyterianly +presbyterium +presbytership +presbytery +presbytia +presbytic +Presbytinae +Presbytis +presbytism +prescapula +prescapular +prescapularis +prescholastic +preschool +prescience +prescient +prescientific +presciently +prescind +prescindent +prescission +prescored +prescout +prescribable +prescribe +prescriber +prescript +prescriptibility +prescriptible +prescription +prescriptionist +prescriptive +prescriptively +prescriptiveness +prescriptorial +prescrive +prescutal +prescutum +preseal +presearch +preseason +preseasonal +presecular +presecure +presee +preselect +presell +preseminal +preseminary +presence +presenced +presenceless +presenile +presenility +presensation +presension +present +presentability +presentable +presentableness +presentably +presental +presentation +presentational +presentationism +presentationist +presentative +presentatively +presentee +presentence +presenter +presential +presentiality +presentially +presentialness +presentient +presentiment +presentimental +presentist +presentive +presentively +presentiveness +presently +presentment +presentness +presentor +preseparate +preseparation +preseparator +preservability +preservable +preserval +preservation +preservationist +preservative +preservatize +preservatory +preserve +preserver +preserveress +preses +presession +preset +presettle +presettlement +presexual +preshadow +preshape +preshare +presharpen +preshelter +preship +preshipment +preshortage +preshorten +preshow +preside +presidence +presidencia +presidency +president +presidente +presidentess +presidential +presidentially +presidentiary +presidentship +presider +presidial +presidially +presidiary +presidio +presidium +presift +presign +presignal +presignificance +presignificancy +presignificant +presignification +presignificative +presignificator +presignify +presimian +preslavery +Presley +presmooth +presocial +presocialism +presocialist +presolar +presolicit +presolicitation +presolution +presolve +presophomore +presound +prespecialist +prespecialize +prespecific +prespecifically +prespecification +prespecify +prespeculate +prespeculation +presphenoid +presphenoidal +presphygmic +prespinal +prespinous +prespiracular +presplendor +presplenomegalic +prespoil +prespontaneity +prespontaneous +prespontaneously +prespread +presprinkle +prespur +press +pressable +pressboard +pressdom +pressel +presser +pressfat +pressful +pressgang +pressible +pressing +pressingly +pressingness +pression +pressive +pressman +pressmanship +pressmark +pressor +presspack +pressroom +pressurage +pressural +pressure +pressureless +pressureproof +pressurize +pressurizer +presswoman +presswork +pressworker +prest +prestabilism +prestability +prestable +prestamp +prestandard +prestandardization +prestandardize +prestant +prestate +prestation +prestatistical +presteam +presteel +prester +presternal +presternum +prestidigital +prestidigitate +prestidigitation +prestidigitator +prestidigitatorial +prestige +prestigiate +prestigiation +prestigiator +prestigious +prestigiously +prestigiousness +prestimulate +prestimulation +prestimulus +prestissimo +presto +prestock +prestomial +prestomium +prestorage +prestore +prestraighten +prestrain +prestrengthen +prestress +prestretch +prestricken +prestruggle +prestubborn +prestudious +prestudiously +prestudiousness +prestudy +presubdue +presubiculum +presubject +presubjection +presubmission +presubmit +presubordinate +presubordination +presubscribe +presubscriber +presubscription +presubsist +presubsistence +presubsistent +presubstantial +presubstitute +presubstitution +presuccess +presuccessful +presuccessfully +presuffer +presuffering +presufficiency +presufficient +presufficiently +presuffrage +presuggest +presuggestion +presuggestive +presuitability +presuitable +presuitably +presumable +presumably +presume +presumedly +presumer +presuming +presumption +presumptious +presumptiously +presumptive +presumptively +presumptuous +presumptuously +presumptuousness +presuperficial +presuperficiality +presuperficially +presuperfluity +presuperfluous +presuperfluously +presuperintendence +presuperintendency +presupervise +presupervision +presupervisor +presupplemental +presupplementary +presupplicate +presupplication +presupply +presupport +presupposal +presuppose +presupposition +presuppositionless +presuppress +presuppression +presuppurative +presupremacy +presupreme +presurgery +presurgical +presurmise +presurprisal +presurprise +presurrender +presurround +presurvey +presusceptibility +presusceptible +presuspect +presuspend +presuspension +presuspicion +presuspicious +presuspiciously +presuspiciousness +presustain +presutural +preswallow +presylvian +presympathize +presympathy +presymphonic +presymphony +presymphysial +presymptom +presymptomatic +presynapsis +presynaptic +presystematic +presystematically +presystole +presystolic +pretabulate +pretabulation +pretan +pretangible +pretangibly +pretannage +pretardily +pretardiness +pretardy +pretariff +pretaste +preteach +pretechnical +pretechnically +pretelegraph +pretelegraphic +pretelephone +pretelephonic +pretell +pretemperate +pretemperately +pretemporal +pretend +pretendant +pretended +pretendedly +pretender +Pretenderism +pretendership +pretendingly +pretendingness +pretense +pretenseful +pretenseless +pretension +pretensional +pretensionless +pretensive +pretensively +pretensiveness +pretentative +pretentious +pretentiously +pretentiousness +pretercanine +preterchristian +preterconventional +preterdetermined +preterdeterminedly +preterdiplomatic +preterdiplomatically +preterequine +preteressential +pretergress +pretergression +preterhuman +preterience +preterient +preterintentional +preterist +preterit +preteriteness +preterition +preteritive +preteritness +preterlabent +preterlegal +preterlethal +preterminal +pretermission +pretermit +pretermitter +preternative +preternatural +preternaturalism +preternaturalist +preternaturality +preternaturally +preternaturalness +preternormal +preternotorious +preternuptial +preterpluperfect +preterpolitical +preterrational +preterregular +preterrestrial +preterritorial +preterroyal +preterscriptural +preterseasonable +pretersensual +pretervection +pretest +pretestify +pretestimony +pretext +pretexted +pretextuous +pretheological +prethoracic +prethoughtful +prethoughtfully +prethoughtfulness +prethreaten +prethrill +prethrust +pretibial +pretimeliness +pretimely +pretincture +pretire +pretoken +pretone +pretonic +pretorial +pretorship +pretorsional +pretorture +pretournament +pretrace +pretracheal +pretraditional +pretrain +pretraining +pretransact +pretransaction +pretranscribe +pretranscription +pretranslate +pretranslation +pretransmission +pretransmit +pretransport +pretransportation +pretravel +pretreat +pretreatment +pretreaty +pretrematic +pretribal +pretry +prettification +prettifier +prettify +prettikin +prettily +prettiness +pretty +prettyface +prettyish +prettyism +pretubercular +pretuberculous +pretympanic +pretyphoid +pretypify +pretypographical +pretyrannical +pretyranny +pretzel +preultimate +preultimately +preumbonal +preunderstand +preundertake +preunion +preunite +preutilizable +preutilization +preutilize +prevacate +prevacation +prevaccinate +prevaccination +prevail +prevailance +prevailer +prevailingly +prevailingness +prevailment +prevalence +prevalency +prevalent +prevalently +prevalentness +prevalescence +prevalescent +prevalid +prevalidity +prevalidly +prevaluation +prevalue +prevariation +prevaricate +prevarication +prevaricator +prevaricatory +prevascular +prevegetation +prevelar +prevenance +prevenancy +prevene +prevenience +prevenient +preveniently +prevent +preventability +preventable +preventative +preventer +preventible +preventingly +prevention +preventionism +preventionist +preventive +preventively +preventiveness +preventorium +preventure +preverb +preverbal +preverification +preverify +prevernal +preversion +prevertebral +prevesical +preveto +previctorious +previde +previdence +preview +previgilance +previgilant +previgilantly +previolate +previolation +previous +previously +previousness +previse +previsibility +previsible +previsibly +prevision +previsional +previsit +previsitor +previsive +previsor +prevocal +prevocalic +prevocally +prevocational +prevogue +prevoid +prevoidance +prevolitional +prevolunteer +prevomer +prevotal +prevote +prevoyance +prevoyant +prevue +prewar +prewarn +prewarrant +prewash +preweigh +prewelcome +prewhip +prewilling +prewillingly +prewillingness +prewire +prewireless +prewitness +prewonder +prewonderment +preworldliness +preworldly +preworship +preworthily +preworthiness +preworthy +prewound +prewrap +prexy +prey +preyer +preyful +preyingly +preyouthful +prezonal +prezone +prezygapophysial +prezygapophysis +prezygomatic +Pria +priacanthid +Priacanthidae +priacanthine +Priacanthus +Priapean +Priapic +priapism +Priapulacea +priapulid +Priapulida +Priapulidae +priapuloid +Priapuloidea +Priapulus +Priapus +Priapusian +Price +price +priceable +priceably +priced +priceite +priceless +pricelessness +pricer +prich +prick +prickant +pricked +pricker +pricket +prickfoot +pricking +prickingly +prickish +prickle +prickleback +prickled +pricklefish +prickless +prickliness +prickling +pricklingly +pricklouse +prickly +pricklyback +prickmadam +prickmedainty +prickproof +pricks +prickseam +prickshot +prickspur +pricktimber +prickwood +pricky +pride +prideful +pridefully +pridefulness +prideless +pridelessly +prideling +prideweed +pridian +priding +pridingly +pridy +pried +prier +priest +priestal +priestcap +priestcraft +priestdom +priesteen +priestery +priestess +priestfish +priesthood +priestianity +priestish +priestism +priestless +priestlet +priestlike +priestliness +priestling +priestly +priestship +priestshire +prig +prigdom +prigger +priggery +priggess +priggish +priggishly +priggishness +priggism +prighood +prigman +prill +prillion +prim +prima +primacy +primage +primal +primality +primar +primarian +primaried +primarily +primariness +primary +primatal +primate +Primates +primateship +primatial +primatic +primatical +primavera +primaveral +prime +primegilt +primely +primeness +primer +primero +primerole +primeval +primevalism +primevally +primeverose +primevity +primevous +primevrin +Primianist +primigene +primigenial +primigenian +primigenious +primigenous +primigravida +primine +priming +primipara +primiparity +primiparous +primipilar +primitiae +primitial +primitias +primitive +primitively +primitivism +primitivist +primitivistic +primitivity +primly +primness +primogenetrix +primogenial +primogenital +primogenitary +primogenitive +primogenitor +primogeniture +primogenitureship +primogenous +primoprime +primoprimitive +primordality +primordia +primordial +primordialism +primordially +primordiate +primordium +primosity +primost +primp +primrose +primrosed +primrosetide +primrosetime +primrosy +primsie +Primula +primula +Primulaceae +primulaceous +Primulales +primulaverin +primulaveroside +primulic +primuline +Primulinus +Primus +primus +primwort +primy +prince +princeage +princecraft +princedom +princehood +Princeite +princekin +princeless +princelet +princelike +princeliness +princeling +princely +princeps +princeship +princess +princessdom +princesse +princesslike +princessly +princewood +princified +princify +principal +principality +principally +principalness +principalship +principate +Principes +principes +principia +principiant +principiate +principiation +principium +principle +principulus +princock +princox +prine +pringle +prink +prinker +prinkle +prinky +print +printability +printable +printableness +printed +printer +printerdom +printerlike +printery +printing +printless +printline +printscript +printworks +Priodon +priodont +Priodontes +prion +prionid +Prionidae +Prioninae +prionine +Prionodesmacea +prionodesmacean +prionodesmaceous +prionodesmatic +Prionodon +prionodont +Prionopinae +prionopine +Prionops +Prionus +prior +prioracy +prioral +priorate +prioress +prioristic +prioristically +priorite +priority +priorly +priorship +priory +prisable +prisage +prisal +priscan +Priscian +Priscianist +Priscilla +Priscillian +Priscillianism +Priscillianist +prism +prismal +prismatic +prismatical +prismatically +prismatization +prismatize +prismatoid +prismatoidal +prismed +prismoid +prismoidal +prismy +prisometer +prison +prisonable +prisondom +prisoner +prisonful +prisonlike +prisonment +prisonous +priss +prissily +prissiness +prissy +pristane +pristine +Pristipomatidae +Pristipomidae +Pristis +Pristodus +pritch +Pritchardia +pritchel +prithee +prius +privacity +privacy +privant +private +privateer +privateersman +privately +privateness +privation +privative +privatively +privativeness +privet +privilege +privileged +privileger +privily +priviness +privity +privy +prizable +prize +prizeable +prizeholder +prizeman +prizer +prizery +prizetaker +prizeworthy +pro +proa +proabolitionist +proabsolutism +proabsolutist +proabstinence +proacademic +proacceptance +proacquisition +proacquittal +proaction +proactor +proaddition +proadjournment +proadministration +proadmission +proadoption +proadvertising +proaesthetic +proaggressionist +proagitation +proagrarian +proagreement +proagricultural +proagule +proairesis +proairplane +proal +proalcoholism +proalien +proalliance +proallotment +proalteration +proamateur +proambient +proamendment +proamnion +proamniotic +proamusement +proanaphora +proanaphoral +proanarchic +proangiosperm +proangiospermic +proangiospermous +proanimistic +proannexation +proannexationist +proantarctic +proanthropos +proapostolic +proappointment +proapportionment +proappreciation +proappropriation +proapproval +proaquatic +proarbitration +proarbitrationist +proarchery +proarctic +proaristocratic +proarmy +Proarthri +proassessment +proassociation +proatheist +proatheistic +proathletic +proatlas +proattack +proattendance +proauction +proaudience +proaulion +proauthor +proauthority +proautomobile +proavian +proaviation +Proavis +proaward +prob +probabiliorism +probabiliorist +probabilism +probabilist +probabilistic +probability +probabilize +probabl +probable +probableness +probably +probachelor +probal +proballoon +probang +probanishment +probankruptcy +probant +probargaining +probaseball +probasketball +probate +probathing +probatical +probation +probational +probationary +probationer +probationerhood +probationership +probationism +probationist +probationship +probative +probatively +probator +probatory +probattle +probattleship +probe +probeable +probeer +prober +probetting +probiology +probituminous +probity +problem +problematic +problematical +problematically +problematist +problematize +problemdom +problemist +problemistic +problemize +problemwise +problockade +probonding +probonus +proborrowing +proboscidal +proboscidate +Proboscidea +proboscidean +proboscideous +proboscides +proboscidial +proboscidian +proboscidiferous +proboscidiform +probosciform +probosciformed +Probosciger +proboscis +proboscislike +probouleutic +proboulevard +probowling +proboxing +proboycott +probrick +probridge +probroadcasting +probudget +probudgeting +probuilding +probusiness +probuying +procacious +procaciously +procacity +procaine +procambial +procambium +procanal +procancellation +procapital +procapitalism +procapitalist +procarnival +procarp +procarpium +procarrier +procatalectic +procatalepsis +procatarctic +procatarxis +procathedral +Procavia +Procaviidae +procedendo +procedural +procedure +proceed +proceeder +proceeding +proceeds +proceleusmatic +Procellaria +procellarian +procellarid +Procellariidae +Procellariiformes +procellariine +procellas +procello +procellose +procellous +procensorship +procensure +procentralization +procephalic +procercoid +procereal +procerebral +procerebrum +proceremonial +proceremonialism +proceremonialist +proceres +procerite +proceritic +procerity +procerus +process +processal +procession +processional +processionalist +processionally +processionary +processioner +processionist +processionize +processionwise +processive +processor +processual +procharity +prochein +prochemical +prochlorite +prochondral +prochoos +prochordal +prochorion +prochorionic +prochromosome +prochronic +prochronism +prochronize +prochurch +prochurchian +procidence +procident +procidentia +procivic +procivilian +procivism +proclaim +proclaimable +proclaimant +proclaimer +proclaiming +proclaimingly +proclamation +proclamator +proclamatory +proclassic +proclassical +proclergy +proclerical +proclericalism +procline +proclisis +proclitic +proclive +proclivitous +proclivity +proclivous +proclivousness +Procne +procnemial +Procoelia +procoelia +procoelian +procoelous +procoercive +procollectivistic +procollegiate +procombat +procombination +procomedy +procommemoration +procomment +procommercial +procommission +procommittee +procommunal +procommunism +procommunist +procommutation +procompensation +procompetition +procompromise +procompulsion +proconcentration +proconcession +proconciliation +procondemnation +proconfederationist +proconference +proconfession +proconfessionist +proconfiscation +proconformity +Proconnesian +proconquest +proconscription +proconscriptive +proconservation +proconservationist +proconsolidation +proconstitutional +proconstitutionalism +proconsul +proconsular +proconsulary +proconsulate +proconsulship +proconsultation +procontinuation +proconvention +proconventional +proconviction +procoracoid +procoracoidal +procorporation +procosmetic +procosmopolitan +procotton +procourt +procrastinate +procrastinating +procrastinatingly +procrastination +procrastinative +procrastinatively +procrastinator +procrastinatory +procreant +procreate +procreation +procreative +procreativeness +procreator +procreatory +procreatress +procreatrix +procremation +Procris +procritic +procritique +Procrustean +Procrusteanism +Procrusteanize +Procrustes +procrypsis +procryptic +procryptically +proctal +proctalgia +proctalgy +proctatresia +proctatresy +proctectasia +proctectomy +procteurynter +proctitis +proctocele +proctoclysis +proctocolitis +proctocolonoscopy +proctocystoplasty +proctocystotomy +proctodaeal +proctodaeum +proctodynia +proctoelytroplastic +proctologic +proctological +proctologist +proctology +proctoparalysis +proctoplastic +proctoplasty +proctoplegia +proctopolypus +proctoptoma +proctoptosis +proctor +proctorage +proctoral +proctorial +proctorially +proctorical +proctorization +proctorize +proctorling +proctorrhagia +proctorrhaphy +proctorrhea +proctorship +proctoscope +proctoscopic +proctoscopy +proctosigmoidectomy +proctosigmoiditis +proctospasm +proctostenosis +proctostomy +proctotome +proctotomy +proctotresia +proctotrypid +Proctotrypidae +proctotrypoid +Proctotrypoidea +proctovalvotomy +Proculian +procumbent +procurable +procuracy +procural +procurance +procurate +procuration +procurative +procurator +procuratorate +procuratorial +procuratorship +procuratory +procuratrix +procure +procurement +procurer +procuress +procurrent +procursive +procurvation +procurved +Procyon +Procyonidae +procyoniform +Procyoniformia +Procyoninae +procyonine +proczarist +prod +prodatary +prodder +proddle +prodecoration +prodefault +prodefiance +prodelay +prodelision +prodemocratic +Prodenia +prodenominational +prodentine +prodeportation +prodespotic +prodespotism +prodialogue +prodigal +prodigalish +prodigalism +prodigality +prodigalize +prodigally +prodigiosity +prodigious +prodigiously +prodigiousness +prodigus +prodigy +prodisarmament +prodisplay +prodissoconch +prodissolution +prodistribution +prodition +proditorious +proditoriously +prodivision +prodivorce +prodproof +prodramatic +prodroma +prodromal +prodromatic +prodromatically +prodrome +prodromic +prodromous +prodromus +producal +produce +produceable +produceableness +produced +producent +producer +producership +producibility +producible +producibleness +product +producted +productibility +productible +productid +Productidae +productile +production +productional +productionist +productive +productively +productiveness +productivity +productoid +productor +productory +productress +Productus +proecclesiastical +proeconomy +proeducation +proeducational +proegumenal +proelectric +proelectrical +proelectrification +proelectrocution +proelimination +proem +proembryo +proembryonic +proemial +proemium +proemployee +proemptosis +proenforcement +proenlargement +proenzym +proenzyme +proepimeron +proepiscopist +proepisternum +proequality +proethical +proethnic +proethnically +proetid +Proetidae +Proetus +proevolution +proevolutionist +proexamination +proexecutive +proexemption +proexercise +proexperiment +proexpert +proexporting +proexposure +proextension +proextravagance +prof +profaculty +profanable +profanableness +profanably +profanation +profanatory +profanchise +profane +profanely +profanement +profaneness +profaner +profanism +profanity +profanize +profarmer +profection +profectional +profectitious +profederation +profeminism +profeminist +proferment +profert +profess +professable +professed +professedly +profession +professional +professionalism +professionalist +professionality +professionalization +professionalize +professionally +professionist +professionize +professionless +professive +professively +professor +professorate +professordom +professoress +professorial +professorialism +professorially +professoriate +professorlike +professorling +professorship +professory +proffer +profferer +proficience +proficiency +proficient +proficiently +proficientness +profiction +proficuous +proficuously +profile +profiler +profilist +profilograph +profit +profitability +profitable +profitableness +profitably +profiteer +profiteering +profiter +profiting +profitless +profitlessly +profitlessness +profitmonger +profitmongering +profitproof +proflated +proflavine +profligacy +profligate +profligately +profligateness +profligation +proflogger +profluence +profluent +profluvious +profluvium +proforeign +profound +profoundly +profoundness +profraternity +profugate +profulgent +profunda +profundity +profuse +profusely +profuseness +profusion +profusive +profusively +profusiveness +prog +progambling +progamete +progamic +proganosaur +Proganosauria +progenerate +progeneration +progenerative +progenital +progenitive +progenitiveness +progenitor +progenitorial +progenitorship +progenitress +progenitrix +progeniture +progenity +progeny +progeotropic +progeotropism +progeria +progermination +progestational +progesterone +progestin +progger +proglottic +proglottid +proglottidean +proglottis +prognathi +prognathic +prognathism +prognathous +prognathy +progne +prognose +prognosis +prognostic +prognosticable +prognostically +prognosticate +prognostication +prognosticative +prognosticator +prognosticatory +progoneate +progospel +progovernment +program +programist +programistic +programma +programmar +programmatic +programmatically +programmatist +programmer +progrede +progrediency +progredient +progress +progresser +progression +progressional +progressionally +progressionary +progressionism +progressionist +progressism +progressist +progressive +progressively +progressiveness +progressivism +progressivist +progressivity +progressor +proguardian +Progymnasium +progymnosperm +progymnospermic +progymnospermous +progypsy +prohaste +prohibit +prohibiter +prohibition +prohibitionary +prohibitionism +prohibitionist +prohibitive +prohibitively +prohibitiveness +prohibitor +prohibitorily +prohibitory +proholiday +prohostility +prohuman +prohumanistic +prohydrotropic +prohydrotropism +proidealistic +proimmunity +proinclusion +proincrease +proindemnity +proindustrial +proinjunction +proinnovationist +proinquiry +proinsurance +prointervention +proinvestment +proirrigation +projacient +project +projectable +projectedly +projectile +projecting +projectingly +projection +projectional +projectionist +projective +projectively +projectivity +projector +projectress +projectrix +projecture +projicience +projicient +projiciently +projournalistic +projudicial +proke +prokeimenon +proker +prokindergarten +proklausis +prolabium +prolabor +prolacrosse +prolactin +prolamin +prolan +prolapse +prolapsus +prolarva +prolarval +prolate +prolately +prolateness +prolation +prolative +prolatively +proleague +proleaguer +prolectite +proleg +prolegate +prolegislative +prolegomena +prolegomenal +prolegomenary +prolegomenist +prolegomenon +prolegomenous +proleniency +prolepsis +proleptic +proleptical +proleptically +proleptics +proletairism +proletarian +proletarianism +proletarianization +proletarianize +proletarianly +proletarianness +proletariat +proletariatism +proletarization +proletarize +proletary +proletcult +proleucocyte +proleukocyte +prolicense +prolicidal +prolicide +proliferant +proliferate +proliferation +proliferative +proliferous +proliferously +prolific +prolificacy +prolifical +prolifically +prolificalness +prolificate +prolification +prolificity +prolificly +prolificness +prolificy +prolify +proligerous +proline +proliquor +proliterary +proliturgical +proliturgist +prolix +prolixity +prolixly +prolixness +prolocution +prolocutor +prolocutorship +prolocutress +prolocutrix +prologist +prologize +prologizer +prologos +prologue +prologuelike +prologuer +prologuist +prologuize +prologuizer +prologus +prolong +prolongable +prolongableness +prolongably +prolongate +prolongation +prolonge +prolonger +prolongment +prolusion +prolusionize +prolusory +prolyl +promachinery +promachos +promagisterial +promagistracy +promagistrate +promajority +promammal +Promammalia +promammalian +promarriage +promatrimonial +promatrimonialist +promaximum +promemorial +promenade +promenader +promenaderess +promercantile +promercy +promerger +promeristem +promerit +promeritor +Promethea +Promethean +Prometheus +promethium +promic +promilitarism +promilitarist +promilitary +prominence +prominency +prominent +prominently +prominimum +proministry +prominority +promisable +promiscuity +promiscuous +promiscuously +promiscuousness +promise +promisee +promiseful +promiseless +promisemonger +promiseproof +promiser +promising +promisingly +promisingness +promisor +promissionary +promissive +promissor +promissorily +promissory +promitosis +promittor +promnesia +promoderation +promoderationist +promodernist +promodernistic +promonarchic +promonarchical +promonarchicalness +promonarchist +promonopolist +promonopoly +promontoried +promontory +promoral +promorph +promorphological +promorphologically +promorphologist +promorphology +promotable +promote +promotement +promoter +promotion +promotional +promotive +promotiveness +promotor +promotorial +promotress +promotrix +promovable +promovent +prompt +promptbook +prompter +promptitude +promptive +promptly +promptness +promptress +promptuary +prompture +promulgate +promulgation +promulgator +promulge +promulger +promuscidate +promuscis +promycelial +promycelium +promythic +pronaos +pronate +pronation +pronational +pronationalism +pronationalist +pronationalistic +pronative +pronatoflexor +pronator +pronaval +pronavy +prone +pronegotiation +pronegro +pronegroism +pronely +proneness +pronephric +pronephridiostome +pronephron +pronephros +proneur +prong +prongbuck +pronged +pronger +pronghorn +pronglike +pronic +pronograde +pronominal +pronominalize +pronominally +pronomination +pronotal +pronotum +pronoun +pronounal +pronounce +pronounceable +pronounced +pronouncedly +pronouncement +pronounceness +pronouncer +pronpl +pronto +Pronuba +pronuba +pronubial +pronuclear +pronucleus +pronumber +pronunciability +pronunciable +pronuncial +pronunciamento +pronunciation +pronunciative +pronunciator +pronunciatory +pronymph +pronymphal +proo +prooemiac +prooemion +prooemium +proof +proofer +proofful +proofing +proofless +prooflessly +proofness +proofread +proofreader +proofreading +proofroom +proofy +prop +propadiene +propaedeutic +propaedeutical +propaedeutics +propagability +propagable +propagableness +propagand +propaganda +propagandic +propagandism +propagandist +propagandistic +propagandistically +propagandize +propagate +propagation +propagational +propagative +propagator +propagatory +propagatress +propago +propagulum +propale +propalinal +propane +propanedicarboxylic +propanol +propanone +propapist +proparasceve +propargyl +propargylic +Proparia +proparian +proparliamental +proparoxytone +proparoxytonic +proparticipation +propatagial +propatagian +propatagium +propatriotic +propatriotism +propatronage +propayment +propellable +propellant +propellent +propeller +propelment +propend +propendent +propene +propenoic +propense +propensely +propenseness +propension +propensitude +propensity +propenyl +propenylic +proper +properispome +properispomenon +properitoneal +properly +properness +propertied +property +propertyless +propertyship +propessimism +propessimist +prophase +prophasis +prophecy +prophecymonger +prophesiable +prophesier +prophesy +prophet +prophetess +prophethood +prophetic +prophetical +propheticality +prophetically +propheticalness +propheticism +propheticly +prophetism +prophetize +prophetless +prophetlike +prophetry +prophetship +prophilosophical +prophloem +prophoric +prophototropic +prophototropism +prophylactic +prophylactical +prophylactically +prophylaxis +prophylaxy +prophyll +prophyllum +propination +propine +propinoic +propinquant +propinque +propinquity +propinquous +propiolaldehyde +propiolate +propiolic +propionate +propione +Propionibacterieae +Propionibacterium +propionic +propionitril +propionitrile +propionyl +Propithecus +propitiable +propitial +propitiate +propitiatingly +propitiation +propitiative +propitiator +propitiatorily +propitiatory +propitious +propitiously +propitiousness +proplasm +proplasma +proplastic +propless +propleural +propleuron +proplex +proplexus +Propliopithecus +propodeal +propodeon +propodeum +propodial +propodiale +propodite +propoditic +propodium +propolis +propolitical +propolization +propolize +propone +proponement +proponent +proponer +propons +Propontic +propooling +propopery +proportion +proportionability +proportionable +proportionableness +proportionably +proportional +proportionalism +proportionality +proportionally +proportionate +proportionately +proportionateness +proportioned +proportioner +proportionless +proportionment +proposable +proposal +proposant +propose +proposer +proposition +propositional +propositionally +propositionize +propositus +propound +propounder +propoundment +propoxy +proppage +propper +propraetor +propraetorial +propraetorian +proprecedent +propriation +proprietage +proprietarian +proprietariat +proprietarily +proprietary +proprietor +proprietorial +proprietorially +proprietorship +proprietory +proprietous +proprietress +proprietrix +propriety +proprioception +proprioceptive +proprioceptor +propriospinal +proprium +proprivilege +proproctor +proprofit +proprovincial +proprovost +props +propterygial +propterygium +proptosed +proptosis +propublication +propublicity +propugnacled +propugnaculum +propugnation +propugnator +propugner +propulsation +propulsatory +propulsion +propulsity +propulsive +propulsor +propulsory +propunishment +propupa +propupal +propurchase +Propus +propwood +propygidium +propyl +propylacetic +propylaeum +propylamine +propylation +propylene +propylic +propylidene +propylite +propylitic +propylitization +propylon +propyne +propynoic +proquaestor +proracing +prorailroad +prorata +proratable +prorate +proration +prore +proreader +prorealism +prorealist +prorealistic +proreality +prorean +prorebate +prorebel +prorecall +proreciprocation +prorecognition +proreconciliation +prorector +prorectorate +proredemption +proreduction +proreferendum +proreform +proreformist +proregent +prorelease +Proreptilia +proreptilian +proreption +prorepublican +proresearch +proreservationist +proresignation +prorestoration +prorestriction +prorevision +prorevisionist +prorevolution +prorevolutionary +prorevolutionist +prorhinal +Prorhipidoglossomorpha +proritual +proritualistic +prorogate +prorogation +prorogator +prorogue +proroguer +proromance +proromantic +proromanticism +proroyal +proroyalty +prorrhesis +prorsad +prorsal +proruption +prosabbath +prosabbatical +prosacral +prosaic +prosaical +prosaically +prosaicalness +prosaicism +prosaicness +prosaism +prosaist +prosar +Prosarthri +prosateur +proscapula +proscapular +proscenium +proscholastic +proschool +proscientific +proscolecine +proscolex +proscribable +proscribe +proscriber +proscript +proscription +proscriptional +proscriptionist +proscriptive +proscriptively +proscriptiveness +proscutellar +proscutellum +proscynemata +prose +prosecrecy +prosecretin +prosect +prosection +prosector +prosectorial +prosectorium +prosectorship +prosecutable +prosecute +prosecution +prosecutor +prosecutrix +proselenic +proselike +proselyte +proselyter +proselytical +proselytingly +proselytism +proselytist +proselytistic +proselytization +proselytize +proselytizer +proseman +proseminar +proseminary +proseminate +prosemination +prosencephalic +prosencephalon +prosenchyma +prosenchymatous +proseneschal +proser +Proserpinaca +prosethmoid +proseucha +proseuche +prosification +prosifier +prosify +prosiliency +prosilient +prosiliently +prosilverite +prosily +Prosimiae +prosimian +prosiness +prosing +prosingly +prosiphon +prosiphonal +prosiphonate +prosish +prosist +proslambanomenos +proslave +proslaver +proslavery +proslaveryism +prosneusis +proso +prosobranch +Prosobranchia +Prosobranchiata +prosobranchiate +prosocele +prosodal +prosode +prosodemic +prosodetic +prosodiac +prosodiacal +prosodiacally +prosodial +prosodially +prosodian +prosodic +prosodical +prosodically +prosodion +prosodist +prosodus +prosody +prosogaster +prosogyrate +prosogyrous +prosoma +prosomal +prosomatic +prosonomasia +prosopalgia +prosopalgic +prosopantritis +prosopectasia +prosophist +prosopic +prosopically +Prosopis +prosopite +Prosopium +prosoplasia +prosopography +prosopon +prosoponeuralgia +prosopoplegia +prosopoplegic +prosopopoeia +prosopopoeial +prosoposchisis +prosopospasm +prosopotocia +prosopyl +prosopyle +prosorus +prospect +prospection +prospective +prospectively +prospectiveness +prospectless +prospector +prospectus +prospectusless +prospeculation +prosper +prosperation +prosperity +prosperous +prosperously +prosperousness +prospicience +prosporangium +prosport +pross +prossy +prostatauxe +prostate +prostatectomy +prostatelcosis +prostatic +prostaticovesical +prostatism +prostatitic +prostatitis +prostatocystitis +prostatocystotomy +prostatodynia +prostatolith +prostatomegaly +prostatometer +prostatomyomectomy +prostatorrhea +prostatorrhoea +prostatotomy +prostatovesical +prostatovesiculectomy +prostatovesiculitis +prostemmate +prostemmatic +prosternal +prosternate +prosternum +prostheca +prosthenic +prosthesis +prosthetic +prosthetically +prosthetics +prosthetist +prosthion +prosthionic +prosthodontia +prosthodontist +Prostigmin +prostitute +prostitutely +prostitution +prostitutor +prostomial +prostomiate +prostomium +prostrate +prostration +prostrative +prostrator +prostrike +prostyle +prostylos +prosubmission +prosubscription +prosubstantive +prosubstitution +prosuffrage +prosupervision +prosupport +prosurgical +prosurrender +prosy +prosyllogism +prosyndicalism +prosyndicalist +protactic +protactinium +protagon +protagonism +protagonist +Protagorean +Protagoreanism +protalbumose +protamine +protandric +protandrism +protandrous +protandrously +protandry +protanomal +protanomalous +protanope +protanopia +protanopic +protargentum +protargin +Protargol +protariff +protarsal +protarsus +protasis +protaspis +protatic +protatically +protax +protaxation +protaxial +protaxis +prote +Protea +protea +Proteaceae +proteaceous +protead +protean +proteanly +proteanwise +protease +protechnical +protect +protectant +protectible +protecting +protectingly +protectingness +protection +protectional +protectionate +protectionism +protectionist +protectionize +protectionship +protective +protectively +protectiveness +Protectograph +protector +protectoral +protectorate +protectorial +protectorian +protectorless +protectorship +protectory +protectress +protectrix +protege +protegee +protegulum +proteic +Proteida +Proteidae +proteide +proteidean +proteidogenous +proteiform +protein +proteinaceous +proteinase +proteinic +proteinochromogen +proteinous +proteinuria +Proteles +Protelidae +Protelytroptera +protelytropteran +protelytropteron +protelytropterous +protemperance +protempirical +protemporaneous +protend +protension +protensity +protensive +protensively +proteoclastic +proteogenous +proteolysis +proteolytic +proteopectic +proteopexic +proteopexis +proteopexy +proteosaurid +Proteosauridae +Proteosaurus +proteose +Proteosoma +proteosomal +proteosome +proteosuria +protephemeroid +Protephemeroidea +proterandrous +proterandrousness +proterandry +proteranthous +proterobase +proteroglyph +Proteroglypha +proteroglyphic +proteroglyphous +proterogynous +proterogyny +proterothesis +proterotype +Proterozoic +protervity +protest +protestable +protestancy +protestant +Protestantish +Protestantishly +protestantism +Protestantize +Protestantlike +Protestantly +protestation +protestator +protestatory +protester +protestingly +protestive +protestor +protetrarch +Proteus +protevangel +protevangelion +protevangelium +protext +prothalamia +prothalamion +prothalamium +prothallia +prothallial +prothallic +prothalline +prothallium +prothalloid +prothallus +protheatrical +protheca +prothesis +prothetic +prothetical +prothetically +prothonotarial +prothonotariat +prothonotary +prothonotaryship +prothoracic +prothorax +prothrift +prothrombin +prothrombogen +prothyl +prothysteron +protide +protiodide +protist +Protista +protistan +protistic +protistological +protistologist +protistology +protiston +Protium +protium +proto +protoactinium +protoalbumose +protoamphibian +protoanthropic +protoapostate +protoarchitect +Protoascales +Protoascomycetes +protobacco +Protobasidii +Protobasidiomycetes +protobasidiomycetous +protobasidium +protobishop +protoblast +protoblastic +protoblattoid +Protoblattoidea +Protobranchia +Protobranchiata +protobranchiate +protocalcium +protocanonical +Protocaris +protocaseose +protocatechualdehyde +protocatechuic +Protoceras +Protoceratidae +Protoceratops +protocercal +protocerebral +protocerebrum +protochemist +protochemistry +protochloride +protochlorophyll +Protochorda +Protochordata +protochordate +protochromium +protochronicler +protocitizen +protoclastic +protocneme +Protococcaceae +protococcaceous +protococcal +Protococcales +protococcoid +Protococcus +protocol +protocolar +protocolary +Protocoleoptera +protocoleopteran +protocoleopteron +protocoleopterous +protocolist +protocolization +protocolize +protoconch +protoconchal +protocone +protoconid +protoconule +protoconulid +protocopper +protocorm +protodeacon +protoderm +protodevil +Protodonata +protodonatan +protodonate +protodont +Protodonta +protodramatic +protodynastic +protoelastose +protoepiphyte +protoforaminifer +protoforester +protogaster +protogelatose +protogenal +protogenes +protogenesis +protogenetic +protogenic +protogenist +Protogeometric +protogine +protoglobulose +protogod +protogonous +protogospel +protograph +protogynous +protogyny +protohematoblast +Protohemiptera +protohemipteran +protohemipteron +protohemipterous +protoheresiarch +Protohippus +protohistorian +protohistoric +protohistory +protohomo +protohuman +Protohydra +protohydrogen +Protohymenoptera +protohymenopteran +protohymenopteron +protohymenopterous +protoiron +protoleration +protoleucocyte +protoleukocyte +protolithic +protoliturgic +protolog +protologist +protoloph +protoma +protomagister +protomagnate +protomagnesium +protomala +protomalal +protomalar +protomammal +protomammalian +protomanganese +protomartyr +Protomastigida +protome +protomeristem +protomerite +protomeritic +protometal +protometallic +protometaphrast +Protominobacter +Protomonadina +protomonostelic +protomorph +protomorphic +Protomycetales +protomyosinose +proton +protone +protonegroid +protonema +protonemal +protonematal +protonematoid +protoneme +Protonemertini +protonephridial +protonephridium +protonephros +protoneuron +protoneurone +protonic +protonickel +protonitrate +protonotater +protonym +protonymph +protonymphal +protopapas +protopappas +protoparent +protopathia +protopathic +protopathy +protopatriarchal +protopatrician +protopattern +protopectin +protopectinase +protopepsia +Protoperlaria +protoperlarian +protophilosophic +protophloem +protophyll +Protophyta +protophyte +protophytic +protopin +protopine +protoplasm +protoplasma +protoplasmal +protoplasmatic +protoplasmic +protoplast +protoplastic +protopod +protopodial +protopodite +protopoditic +protopoetic +protopope +protoporphyrin +protopragmatic +protopresbyter +protopresbytery +protoprism +protoproteose +protoprotestant +protopteran +Protopteridae +protopteridophyte +protopterous +Protopterus +protopyramid +protore +protorebel +protoreligious +protoreptilian +Protorohippus +protorosaur +Protorosauria +protorosaurian +Protorosauridae +protorosauroid +Protorosaurus +Protorthoptera +protorthopteran +protorthopteron +protorthopterous +protosalt +protosaurian +protoscientific +Protoselachii +protosilicate +protosilicon +protosinner +Protosiphon +Protosiphonaceae +protosiphonaceous +protosocial +protosolution +protospasm +Protosphargis +Protospondyli +protospore +Protostega +Protostegidae +protostele +protostelic +protostome +protostrontium +protosulphate +protosulphide +protosyntonose +prototaxites +prototheca +protothecal +prototheme +protothere +Prototheria +prototherian +prototitanium +Prototracheata +prototraitor +prototroch +prototrochal +prototrophic +prototypal +prototype +prototypic +prototypical +prototypically +prototypographer +prototyrant +protovanadium +protoveratrine +protovertebra +protovertebral +protovestiary +protovillain +protovum +protoxide +protoxylem +Protozoa +protozoacidal +protozoacide +protozoal +protozoan +protozoea +protozoean +protozoiasis +protozoic +protozoological +protozoologist +protozoology +protozoon +protozoonal +Protracheata +protracheate +protract +protracted +protractedly +protractedness +protracter +protractible +protractile +protractility +protraction +protractive +protractor +protrade +protradition +protraditional +protragedy +protragical +protragie +protransfer +protranslation +protransubstantiation +protravel +protreasurer +protreaty +Protremata +protreptic +protreptical +protriaene +protropical +protrudable +protrude +protrudent +protrusible +protrusile +protrusion +protrusive +protrusively +protrusiveness +protuberance +protuberancy +protuberant +protuberantial +protuberantly +protuberantness +protuberate +protuberosity +protuberous +Protura +proturan +protutor +protutory +protyl +protyle +Protylopus +protype +proudful +proudhearted +proudish +proudishly +proudling +proudly +proudness +prouniformity +prounion +prounionist +prouniversity +proustite +provability +provable +provableness +provably +provaccinist +provand +provant +provascular +prove +provect +provection +proved +proveditor +provedly +provedor +provedore +proven +provenance +Provencal +Provencalize +Provence +Provencial +provender +provenience +provenient +provenly +proventricular +proventricule +proventriculus +prover +proverb +proverbial +proverbialism +proverbialist +proverbialize +proverbially +proverbic +proverbiologist +proverbiology +proverbize +proverblike +provicar +provicariate +providable +providance +provide +provided +providence +provident +providential +providentialism +providentially +providently +providentness +provider +providing +providore +providoring +province +provincial +provincialate +provincialism +provincialist +provinciality +provincialization +provincialize +provincially +provincialship +provinciate +provinculum +provine +proving +provingly +provision +provisional +provisionality +provisionally +provisionalness +provisionary +provisioner +provisioneress +provisionless +provisionment +provisive +proviso +provisor +provisorily +provisorship +provisory +provitamin +provivisection +provivisectionist +provocant +provocation +provocational +provocative +provocatively +provocativeness +provocator +provocatory +provokable +provoke +provokee +provoker +provoking +provokingly +provokingness +provolunteering +provost +provostal +provostess +provostorial +provostry +provostship +prow +prowar +prowarden +prowaterpower +prowed +prowersite +prowess +prowessed +prowessful +prowl +prowler +prowling +prowlingly +proxenet +proxenete +proxenetism +proxenos +proxenus +proxeny +proxically +proximad +proximal +proximally +proximate +proximately +proximateness +proximation +proximity +proximo +proximobuccal +proximolabial +proximolingual +proxy +proxyship +proxysm +prozone +prozoning +prozygapophysis +prozymite +prude +prudelike +prudely +Prudence +prudence +prudent +prudential +prudentialism +prudentialist +prudentiality +prudentially +prudentialness +prudently +prudery +prudish +prudishly +prudishness +prudist +prudity +Prudy +Prue +pruh +pruinate +pruinescence +pruinose +pruinous +prulaurasin +prunable +prunableness +prunably +Prunaceae +prunase +prunasin +prune +prunell +Prunella +prunella +prunelle +Prunellidae +prunello +pruner +prunetin +prunetol +pruniferous +pruniform +pruning +prunitrin +prunt +prunted +Prunus +prurience +pruriency +prurient +pruriently +pruriginous +prurigo +pruriousness +pruritic +pruritus +prusiano +Prussian +Prussianism +Prussianization +Prussianize +Prussianizer +prussiate +prussic +Prussification +Prussify +prut +prutah +pry +pryer +prying +pryingly +pryingness +pryler +pryproof +pryse +prytaneum +prytanis +prytanize +prytany +psalis +psalm +psalmic +psalmist +psalmister +psalmistry +psalmless +psalmodial +psalmodic +psalmodical +psalmodist +psalmodize +psalmody +psalmograph +psalmographer +psalmography +psalmy +psaloid +psalter +psalterial +psalterian +psalterion +psalterist +psalterium +psaltery +psaltes +psaltress +psammite +psammitic +psammocarcinoma +psammocharid +Psammocharidae +psammogenous +psammolithic +psammologist +psammology +psammoma +psammophile +psammophilous +Psammophis +psammophyte +psammophytic +psammosarcoma +psammotherapy +psammous +Psaronius +pschent +Psedera +Pselaphidae +Pselaphus +psellism +psellismus +psephism +psephisma +psephite +psephitic +psephomancy +Psephurus +Psetta +pseudaconine +pseudaconitine +pseudacusis +pseudalveolar +pseudambulacral +pseudambulacrum +pseudamoeboid +pseudamphora +pseudandry +pseudangina +pseudankylosis +pseudaphia +pseudaposematic +pseudaposporous +pseudapospory +pseudapostle +pseudarachnidan +pseudarthrosis +pseudataxic +pseudatoll +pseudaxine +pseudaxis +Pseudechis +pseudelephant +pseudelminth +pseudelytron +pseudembryo +pseudembryonic +pseudencephalic +pseudencephalus +pseudepigraph +pseudepigrapha +pseudepigraphal +pseudepigraphic +pseudepigraphical +pseudepigraphous +pseudepigraphy +pseudepiploic +pseudepiploon +pseudepiscopacy +pseudepiscopy +pseudepisematic +pseudesthesia +pseudhalteres +pseudhemal +pseudimaginal +pseudimago +pseudisodomum +pseudo +pseudoacaccia +pseudoacademic +pseudoacademical +pseudoaccidental +pseudoacid +pseudoaconitine +pseudoacromegaly +pseudoadiabatic +pseudoaesthetic +pseudoaffectionate +pseudoalkaloid +pseudoalum +pseudoalveolar +pseudoamateurish +pseudoamatory +pseudoanaphylactic +pseudoanaphylaxis +pseudoanatomic +pseudoanatomical +pseudoancestral +pseudoanemia +pseudoanemic +pseudoangelic +pseudoangina +pseudoankylosis +pseudoanthorine +pseudoanthropoid +pseudoanthropological +pseudoanthropology +pseudoantique +pseudoapologetic +pseudoapoplectic +pseudoapoplexy +pseudoappendicitis +pseudoaquatic +pseudoarchaic +pseudoarchaism +pseudoarchaist +pseudoaristocratic +pseudoarthrosis +pseudoarticulation +pseudoartistic +pseudoascetic +pseudoastringent +pseudoasymmetrical +pseudoasymmetry +pseudoataxia +pseudobacterium +pseudobasidium +pseudobenevolent +pseudobenthonic +pseudobenthos +pseudobinary +pseudobiological +pseudoblepsia +pseudoblepsis +pseudobrachial +pseudobrachium +pseudobranch +pseudobranchia +pseudobranchial +pseudobranchiate +Pseudobranchus +pseudobrookite +pseudobrotherly +pseudobulb +pseudobulbar +pseudobulbil +pseudobulbous +pseudobutylene +pseudocandid +pseudocapitulum +pseudocarbamide +pseudocarcinoid +pseudocarp +pseudocarpous +pseudocartilaginous +pseudocele +pseudocelian +pseudocelic +pseudocellus +pseudocentric +pseudocentrous +pseudocentrum +Pseudoceratites +pseudoceratitic +pseudocercaria +pseudoceryl +pseudocharitable +pseudochemical +pseudochina +pseudochromesthesia +pseudochromia +pseudochromosome +pseudochronism +pseudochronologist +pseudochrysalis +pseudochrysolite +pseudochylous +pseudocirrhosis +pseudoclassic +pseudoclassical +pseudoclassicism +pseudoclerical +Pseudococcinae +Pseudococcus +pseudococtate +pseudocollegiate +pseudocolumella +pseudocolumellar +pseudocommissure +pseudocommisural +pseudocompetitive +pseudoconcha +pseudoconclude +pseudocone +pseudoconglomerate +pseudoconglomeration +pseudoconhydrine +pseudoconjugation +pseudoconservative +pseudocorneous +pseudocortex +pseudocosta +pseudocotyledon +pseudocotyledonal +pseudocritical +pseudocroup +pseudocrystalline +pseudocubic +pseudocultivated +pseudocultural +pseudocumene +pseudocumenyl +pseudocumidine +pseudocumyl +pseudocyclosis +pseudocyesis +pseudocyst +pseudodeltidium +pseudodementia +pseudodemocratic +pseudoderm +pseudodermic +pseudodiagnosis +pseudodiastolic +pseudodiphtheria +pseudodiphtheritic +pseudodipteral +pseudodipterally +pseudodipteros +pseudodont +pseudodox +pseudodoxal +pseudodoxy +pseudodramatic +pseudodysentery +pseudoedema +pseudoelectoral +pseudoembryo +pseudoembryonic +pseudoemotional +pseudoencephalitic +pseudoenthusiastic +pseudoephedrine +pseudoepiscopal +pseudoequalitarian +pseudoerotic +pseudoeroticism +pseudoerysipelas +pseudoerysipelatous +pseudoerythrin +pseudoethical +pseudoetymological +pseudoeugenics +pseudoevangelical +pseudofamous +pseudofarcy +pseudofeminine +pseudofever +pseudofeverish +pseudofilaria +pseudofilarian +pseudofinal +pseudofluctuation +pseudofluorescence +pseudofoliaceous +pseudoform +pseudofossil +pseudogalena +pseudoganglion +pseudogaseous +pseudogaster +pseudogastrula +pseudogeneral +pseudogeneric +pseudogenerous +pseudogenteel +pseudogenus +pseudogeometry +pseudogermanic +pseudogeusia +pseudogeustia +pseudoglanders +pseudoglioma +pseudoglobulin +pseudoglottis +pseudograph +pseudographeme +pseudographer +pseudographia +pseudographize +pseudography +pseudograsserie +Pseudogryphus +pseudogyne +pseudogynous +pseudogyny +pseudogyrate +pseudohallucination +pseudohallucinatory +pseudohalogen +pseudohemal +pseudohermaphrodite +pseudohermaphroditic +pseudohermaphroditism +pseudoheroic +pseudohexagonal +pseudohistoric +pseudohistorical +pseudoholoptic +pseudohuman +pseudohydrophobia +pseudohyoscyamine +pseudohypertrophic +pseudohypertrophy +pseudoidentical +pseudoimpartial +pseudoindependent +pseudoinfluenza +pseudoinsane +pseudoinsoluble +pseudoisatin +pseudoism +pseudoisomer +pseudoisomeric +pseudoisomerism +pseudoisotropy +pseudojervine +pseudolabial +pseudolabium +pseudolalia +Pseudolamellibranchia +Pseudolamellibranchiata +pseudolamellibranchiate +pseudolaminated +Pseudolarix +pseudolateral +pseudolatry +pseudolegal +pseudolegendary +pseudoleucite +pseudoleucocyte +pseudoleukemia +pseudoleukemic +pseudoliberal +pseudolichen +pseudolinguistic +pseudoliterary +pseudolobar +pseudological +pseudologically +pseudologist +pseudologue +pseudology +pseudolunule +pseudomalachite +pseudomalaria +pseudomancy +pseudomania +pseudomaniac +pseudomantic +pseudomantist +pseudomasculine +pseudomedical +pseudomedieval +pseudomelanosis +pseudomembrane +pseudomembranous +pseudomeningitis +pseudomenstruation +pseudomer +pseudomeric +pseudomerism +pseudomery +pseudometallic +pseudometameric +pseudometamerism +pseudomica +pseudomilitarist +pseudomilitaristic +pseudomilitary +pseudoministerial +pseudomiraculous +pseudomitotic +pseudomnesia +pseudomodern +pseudomodest +Pseudomonas +pseudomonastic +pseudomonoclinic +pseudomonocotyledonous +pseudomonocyclic +pseudomonotropy +pseudomoral +pseudomorph +pseudomorphia +pseudomorphic +pseudomorphine +pseudomorphism +pseudomorphose +pseudomorphosis +pseudomorphous +pseudomorula +pseudomorular +pseudomucin +pseudomucoid +pseudomultilocular +pseudomultiseptate +pseudomythical +pseudonarcotic +pseudonational +pseudonavicella +pseudonavicellar +pseudonavicula +pseudonavicular +pseudoneuropter +Pseudoneuroptera +pseudoneuropteran +pseudoneuropterous +pseudonitrole +pseudonitrosite +pseudonuclein +pseudonucleolus +pseudonychium +pseudonym +pseudonymal +pseudonymic +pseudonymity +pseudonymous +pseudonymously +pseudonymousness +pseudonymuncle +pseudonymuncule +pseudopapaverine +pseudoparalysis +pseudoparalytic +pseudoparaplegia +pseudoparasitic +pseudoparasitism +pseudoparenchyma +pseudoparenchymatous +pseudoparenchyme +pseudoparesis +pseudoparthenogenesis +pseudopatriotic +pseudopediform +pseudopelletierine +pseudopercular +pseudoperculate +pseudoperculum +pseudoperianth +pseudoperidium +pseudoperiodic +pseudoperipteral +pseudopermanent +pseudoperoxide +pseudoperspective +Pseudopeziza +pseudophallic +pseudophellandrene +pseudophenanthrene +pseudophenanthroline +pseudophenocryst +pseudophilanthropic +pseudophilosophical +Pseudophoenix +pseudopionnotes +pseudopious +pseudoplasm +pseudoplasma +pseudoplasmodium +pseudopneumonia +pseudopod +pseudopodal +pseudopodia +pseudopodial +pseudopodian +pseudopodiospore +pseudopodium +pseudopoetic +pseudopoetical +pseudopolitic +pseudopolitical +pseudopopular +pseudopore +pseudoporphyritic +pseudopregnancy +pseudopregnant +pseudopriestly +pseudoprimitive +pseudoprimitivism +pseudoprincely +pseudoproboscis +pseudoprofessional +pseudoprofessorial +pseudoprophetic +pseudoprophetical +pseudoprosperous +pseudopsia +pseudopsychological +pseudoptics +pseudoptosis +pseudopupa +pseudopupal +pseudopurpurin +pseudopyriform +pseudoquinol +pseudorabies +pseudoracemic +pseudoracemism +pseudoramose +pseudoramulus +pseudorealistic +pseudoreduction +pseudoreformed +pseudoregal +pseudoreligious +pseudoreminiscence +pseudorganic +pseudorheumatic +pseudorhombohedral +pseudoromantic +pseudorunic +pseudosacred +pseudosacrilegious +pseudosalt +pseudosatirical +pseudoscarlatina +Pseudoscarus +pseudoscholarly +pseudoscholastic +pseudoscientific +Pseudoscines +pseudoscinine +pseudosclerosis +pseudoscope +pseudoscopic +pseudoscopically +pseudoscopy +pseudoscorpion +Pseudoscorpiones +Pseudoscorpionida +pseudoscutum +pseudosematic +pseudosensational +pseudoseptate +pseudoservile +pseudosessile +pseudosiphonal +pseudosiphuncal +pseudoskeletal +pseudoskeleton +pseudoskink +pseudosmia +pseudosocial +pseudosocialistic +pseudosolution +pseudosoph +pseudosopher +pseudosophical +pseudosophist +pseudosophy +pseudospectral +pseudosperm +pseudospermic +pseudospermium +pseudospermous +pseudosphere +pseudospherical +pseudospiracle +pseudospiritual +pseudosporangium +pseudospore +pseudosquamate +pseudostalactite +pseudostalactitical +pseudostalagmite +pseudostalagmitical +pseudostereoscope +pseudostereoscopic +pseudostereoscopism +pseudostigma +pseudostigmatic +pseudostoma +pseudostomatous +pseudostomous +pseudostratum +pseudosubtle +Pseudosuchia +pseudosuchian +pseudosweating +pseudosyllogism +pseudosymmetric +pseudosymmetrical +pseudosymmetry +pseudosymptomatic +pseudosyphilis +pseudosyphilitic +pseudotabes +pseudotachylite +pseudotetanus +pseudotetragonal +Pseudotetramera +pseudotetrameral +pseudotetramerous +pseudotrachea +pseudotracheal +pseudotribal +pseudotributary +Pseudotrimera +pseudotrimeral +pseudotrimerous +pseudotropine +Pseudotsuga +pseudotubercular +pseudotuberculosis +pseudotuberculous +pseudoturbinal +pseudotyphoid +pseudoval +pseudovarian +pseudovary +pseudovelar +pseudovelum +pseudoventricle +pseudoviaduct +pseudoviperine +pseudoviscosity +pseudoviscous +pseudovolcanic +pseudovolcano +pseudovum +pseudowhorl +pseudoxanthine +pseudoyohimbine +pseudozealot +pseudozoea +pseudozoogloeal +psha +Pshav +pshaw +psi +Psidium +psilanthropic +psilanthropism +psilanthropist +psilanthropy +psiloceran +Psiloceras +psiloceratan +psiloceratid +Psiloceratidae +psiloi +psilology +psilomelane +psilomelanic +Psilophytales +psilophyte +Psilophyton +psilosis +psilosopher +psilosophy +Psilotaceae +psilotaceous +psilothrum +psilotic +Psilotum +psithurism +Psithyrus +psittaceous +psittaceously +Psittaci +Psittacidae +Psittaciformes +Psittacinae +psittacine +psittacinite +psittacism +psittacistic +Psittacomorphae +psittacomorphic +psittacosis +Psittacus +psoadic +psoas +psoatic +psocid +Psocidae +psocine +psoitis +psomophagic +psomophagist +psomophagy +psora +Psoralea +psoriasic +psoriasiform +psoriasis +psoriatic +psoriatiform +psoric +psoroid +Psorophora +psorophthalmia +psorophthalmic +Psoroptes +psoroptic +psorosis +psorosperm +psorospermial +psorospermiasis +psorospermic +psorospermiform +psorospermosis +psorous +pssimistical +pst +psych +psychagogic +psychagogos +psychagogue +psychagogy +psychal +psychalgia +psychanalysis +psychanalysist +psychanalytic +psychasthenia +psychasthenic +Psyche +psyche +Psychean +psycheometry +psychesthesia +psychesthetic +psychiasis +psychiater +psychiatria +psychiatric +psychiatrical +psychiatrically +psychiatrist +psychiatrize +psychiatry +psychic +psychical +psychically +Psychichthys +psychicism +psychicist +psychics +psychid +Psychidae +psychism +psychist +psychoanalysis +psychoanalyst +psychoanalytic +psychoanalytical +psychoanalytically +psychoanalyze +psychoanalyzer +psychoautomatic +psychobiochemistry +psychobiologic +psychobiological +psychobiology +psychobiotic +psychocatharsis +psychoclinic +psychoclinical +psychoclinicist +Psychoda +psychodiagnostics +Psychodidae +psychodispositional +psychodrama +psychodynamic +psychodynamics +psychoeducational +psychoepilepsy +psychoethical +psychofugal +psychogalvanic +psychogalvanometer +psychogenesis +psychogenetic +psychogenetical +psychogenetically +psychogenetics +psychogenic +psychogeny +psychognosis +psychognostic +psychognosy +psychogonic +psychogonical +psychogony +psychogram +psychograph +psychographer +psychographic +psychographist +psychography +psychoid +psychokinesia +psychokinesis +psychokinetic +psychokyme +psycholepsy +psycholeptic +psychologer +psychologian +psychologic +psychological +psychologically +psychologics +psychologism +psychologist +psychologize +psychologue +psychology +psychomachy +psychomancy +psychomantic +psychometer +psychometric +psychometrical +psychometrically +psychometrician +psychometrics +psychometrist +psychometrize +psychometry +psychomonism +psychomoral +psychomorphic +psychomorphism +psychomotility +psychomotor +psychon +psychoneural +psychoneurological +psychoneurosis +psychoneurotic +psychonomic +psychonomics +psychonomy +psychony +psychoorganic +psychopannychian +psychopannychism +psychopannychist +psychopannychistic +psychopannychy +psychopanychite +psychopath +psychopathia +psychopathic +psychopathist +psychopathologic +psychopathological +psychopathologist +psychopathy +psychopetal +psychophobia +psychophysic +psychophysical +psychophysically +psychophysicist +psychophysics +psychophysiologic +psychophysiological +psychophysiologically +psychophysiologist +psychophysiology +psychoplasm +psychopomp +psychopompos +psychorealism +psychorealist +psychorealistic +psychoreflex +psychorhythm +psychorhythmia +psychorhythmic +psychorhythmical +psychorhythmically +psychorrhagic +psychorrhagy +psychosarcous +psychosensorial +psychosensory +psychoses +psychosexual +psychosexuality +psychosexually +psychosis +psychosocial +psychosomatic +psychosomatics +psychosome +psychosophy +psychostasy +psychostatic +psychostatical +psychostatically +psychostatics +psychosurgeon +psychosurgery +psychosynthesis +psychosynthetic +psychotaxis +psychotechnical +psychotechnician +psychotechnics +psychotechnological +psychotechnology +psychotheism +psychotherapeutic +psychotherapeutical +psychotherapeutics +psychotherapeutist +psychotherapist +psychotherapy +psychotic +Psychotria +psychotrine +psychovital +Psychozoic +psychroesthesia +psychrograph +psychrometer +psychrometric +psychrometrical +psychrometry +psychrophile +psychrophilic +psychrophobia +psychrophore +psychrophyte +psychurgy +psykter +Psylla +psylla +psyllid +Psyllidae +psyllium +ptarmic +Ptarmica +ptarmical +ptarmigan +Ptelea +Ptenoglossa +ptenoglossate +Pteranodon +pteranodont +Pteranodontidae +pteraspid +Pteraspidae +Pteraspis +ptereal +pterergate +Pterian +pteric +Pterichthyodes +Pterichthys +pterideous +pteridium +pteridography +pteridoid +pteridological +pteridologist +pteridology +pteridophilism +pteridophilist +pteridophilistic +Pteridophyta +pteridophyte +pteridophytic +pteridophytous +pteridosperm +Pteridospermae +Pteridospermaphyta +pteridospermaphytic +pteridospermous +pterion +Pteris +Pterobranchia +pterobranchiate +pterocarpous +Pterocarpus +Pterocarya +Pterocaulon +Pterocera +Pteroceras +Pterocles +Pterocletes +Pteroclidae +Pteroclomorphae +pteroclomorphic +pterodactyl +Pterodactyli +pterodactylian +pterodactylic +pterodactylid +Pterodactylidae +pterodactyloid +pterodactylous +Pterodactylus +pterographer +pterographic +pterographical +pterography +pteroid +pteroma +pteromalid +Pteromalidae +Pteromys +pteropaedes +pteropaedic +pteropegal +pteropegous +pteropegum +pterophorid +Pterophoridae +Pterophorus +Pterophryne +pteropid +Pteropidae +pteropine +pteropod +Pteropoda +pteropodal +pteropodan +pteropodial +Pteropodidae +pteropodium +pteropodous +Pteropsida +Pteropus +pterosaur +Pterosauri +Pterosauria +pterosaurian +pterospermous +Pterospora +Pterostemon +Pterostemonaceae +pterostigma +pterostigmal +pterostigmatic +pterostigmatical +pterotheca +pterothorax +pterotic +pteroylglutamic +pterygial +pterygiophore +pterygium +pterygobranchiate +pterygode +pterygodum +Pterygogenea +pterygoid +pterygoidal +pterygoidean +pterygomalar +pterygomandibular +pterygomaxillary +pterygopalatal +pterygopalatine +pterygopharyngeal +pterygopharyngean +pterygophore +pterygopodium +pterygoquadrate +pterygosphenoid +pterygospinous +pterygostaphyline +Pterygota +pterygote +pterygotous +pterygotrabecular +Pterygotus +pteryla +pterylographic +pterylographical +pterylography +pterylological +pterylology +pterylosis +Ptilichthyidae +Ptiliidae +Ptilimnium +ptilinal +ptilinum +Ptilocercus +Ptilonorhynchidae +Ptilonorhynchinae +ptilopaedes +ptilopaedic +ptilosis +Ptilota +ptinid +Ptinidae +ptinoid +Ptinus +ptisan +ptochocracy +ptochogony +ptochology +Ptolemaean +Ptolemaian +Ptolemaic +Ptolemaical +Ptolemaism +Ptolemaist +Ptolemean +Ptolemy +ptomain +ptomaine +ptomainic +ptomatropine +ptosis +ptotic +ptyalagogic +ptyalagogue +ptyalectasis +ptyalin +ptyalism +ptyalize +ptyalocele +ptyalogenic +ptyalolith +ptyalolithiasis +ptyalorrhea +Ptychoparia +ptychoparid +ptychopariid +ptychopterygial +ptychopterygium +Ptychosperma +ptysmagogue +ptyxis +pu +pua +puan +pub +pubal +pubble +puberal +pubertal +pubertic +puberty +puberulent +puberulous +pubes +pubescence +pubescency +pubescent +pubian +pubic +pubigerous +pubiotomy +pubis +public +Publican +publican +publicanism +publication +publichearted +publicheartedness +publicism +publicist +publicity +publicize +publicly +publicness +Publilian +publish +publishable +publisher +publisheress +publishership +publishment +pubococcygeal +pubofemoral +puboiliac +puboischiac +puboischial +puboischiatic +puboprostatic +puborectalis +pubotibial +pubourethral +pubovesical +Puccinia +Pucciniaceae +pucciniaceous +puccinoid +puccoon +puce +pucelage +pucellas +pucelle +Puchanahua +pucherite +puchero +puck +pucka +puckball +pucker +puckerbush +puckerel +puckerer +puckermouth +puckery +puckfist +puckish +puckishly +puckishness +puckle +pucklike +puckling +puckneedle +puckrel +puckster +pud +puddee +puddening +pudder +pudding +puddingberry +puddinghead +puddingheaded +puddinghouse +puddinglike +puddingwife +puddingy +puddle +puddled +puddlelike +puddler +puddling +puddly +puddock +puddy +pudency +pudenda +pudendal +pudendous +pudendum +pudent +pudge +pudgily +pudginess +pudgy +pudiano +pudibund +pudibundity +pudic +pudical +pudicitia +pudicity +pudsey +pudsy +Pudu +pudu +pueblito +Pueblo +pueblo +Puebloan +puebloization +puebloize +Puelche +Puelchean +Pueraria +puerer +puericulture +puerile +puerilely +puerileness +puerilism +puerility +puerman +puerpera +puerperal +puerperalism +puerperant +puerperium +puerperous +puerpery +puff +puffback +puffball +puffbird +puffed +puffer +puffery +puffily +puffin +puffiness +puffinet +puffing +puffingly +Puffinus +pufflet +puffwig +puffy +pug +pugged +pugger +puggi +pugginess +pugging +puggish +puggle +puggree +puggy +pugh +pugil +pugilant +pugilism +pugilist +pugilistic +pugilistical +pugilistically +puglianite +pugman +pugmill +pugmiller +pugnacious +pugnaciously +pugnaciousness +pugnacity +Puinavi +Puinavian +Puinavis +puisne +puissance +puissant +puissantly +puissantness +puist +puistie +puja +Pujunan +puka +pukatea +pukateine +puke +pukeko +puker +pukeweed +Pukhtun +pukish +pukishness +pukras +puku +puky +pul +pulahan +pulahanism +pulasan +pulaskite +Pulaya +Pulayan +pulchrify +pulchritude +pulchritudinous +pule +pulegol +pulegone +puler +Pulex +pulghere +puli +Pulian +pulicarious +pulicat +pulicene +pulicid +Pulicidae +pulicidal +pulicide +pulicine +pulicoid +pulicose +pulicosity +pulicous +puling +pulingly +pulish +pulk +pulka +pull +pullable +pullback +pullboat +pulldevil +pulldoo +pulldown +pulldrive +pullen +puller +pullery +pullet +pulley +pulleyless +pulli +Pullman +Pullmanize +pullorum +pullulant +pullulate +pullulation +pullus +pulmobranchia +pulmobranchial +pulmobranchiate +pulmocardiac +pulmocutaneous +pulmogastric +pulmometer +pulmometry +pulmonal +pulmonar +Pulmonaria +pulmonarian +pulmonary +Pulmonata +pulmonate +pulmonated +pulmonectomy +pulmonic +pulmonifer +Pulmonifera +pulmoniferous +pulmonitis +Pulmotor +pulmotracheal +Pulmotrachearia +pulmotracheary +pulmotracheate +pulp +pulpaceous +pulpal +pulpalgia +pulpamenta +pulpboard +pulpectomy +pulpefaction +pulper +pulpifier +pulpify +pulpily +pulpiness +pulpit +pulpital +pulpitarian +pulpiteer +pulpiter +pulpitful +pulpitic +pulpitical +pulpitically +pulpitis +pulpitish +pulpitism +pulpitize +pulpitless +pulpitly +pulpitolatry +pulpitry +pulpless +pulplike +pulpotomy +pulpous +pulpousness +pulpstone +pulpwood +pulpy +pulque +pulsant +pulsatance +pulsate +pulsatile +pulsatility +Pulsatilla +pulsation +pulsational +pulsative +pulsatively +pulsator +pulsatory +pulse +pulseless +pulselessly +pulselessness +pulselike +pulsellum +pulsidge +pulsific +pulsimeter +pulsion +pulsive +pulsojet +pulsometer +pultaceous +pulton +pulu +pulveraceous +pulverant +pulverate +pulveration +pulvereous +pulverin +pulverizable +pulverizate +pulverization +pulverizator +pulverize +pulverizer +pulverous +pulverulence +pulverulent +pulverulently +pulvic +pulvil +pulvillar +pulvilliform +pulvillus +pulvinar +Pulvinaria +pulvinarian +pulvinate +pulvinated +pulvinately +pulvination +pulvinic +pulviniform +pulvino +pulvinule +pulvinulus +pulvinus +pulviplume +pulwar +puly +puma +Pume +pumicate +pumice +pumiced +pumiceous +pumicer +pumiciform +pumicose +pummel +pummice +pump +pumpable +pumpage +pumpellyite +pumper +pumpernickel +pumpkin +pumpkinification +pumpkinify +pumpkinish +pumpkinity +pumple +pumpless +pumplike +pumpman +pumpsman +pumpwright +pun +puna +punaise +punalua +punaluan +Punan +punatoo +punch +punchable +punchboard +puncheon +puncher +punchinello +punching +punchless +punchlike +punchproof +punchy +punct +punctal +punctate +punctated +punctation +punctator +puncticular +puncticulate +puncticulose +punctiform +punctiliar +punctilio +punctiliomonger +punctiliosity +punctilious +punctiliously +punctiliousness +punctist +punctographic +punctual +punctualist +punctuality +punctually +punctualness +punctuate +punctuation +punctuational +punctuationist +punctuative +punctuator +punctuist +punctulate +punctulated +punctulation +punctule +punctulum +punctum +puncturation +puncture +punctured +punctureless +punctureproof +puncturer +pundigrion +pundit +pundita +punditic +punditically +punditry +pundonor +pundum +puneca +pung +punga +pungapung +pungar +pungence +pungency +pungent +pungently +punger +pungey +pungi +pungle +pungled +Punic +Punica +Punicaceae +punicaceous +puniceous +punicial +punicin +punicine +punily +puniness +punish +punishability +punishable +punishableness +punishably +punisher +punishment +punishmentproof +punition +punitional +punitionally +punitive +punitively +punitiveness +punitory +Punjabi +punjum +punk +punkah +punketto +punkie +punkwood +punky +punless +punlet +punnable +punnage +punner +punnet +punnic +punnical +punnigram +punningly +punnology +Puno +punproof +punster +punstress +punt +punta +puntabout +puntal +puntel +punter +punti +puntil +puntist +Puntlatsh +punto +puntout +puntsman +punty +puny +punyish +punyism +pup +pupa +pupahood +pupal +puparial +puparium +pupate +pupation +pupelo +Pupidae +pupiferous +pupiform +pupigenous +pupigerous +pupil +pupilability +pupilage +pupilar +pupilate +pupildom +pupiled +pupilize +pupillarity +pupillary +pupilless +Pupillidae +pupillometer +pupillometry +pupilloscope +pupilloscoptic +pupilloscopy +Pupipara +pupiparous +Pupivora +pupivore +pupivorous +pupoid +puppet +puppetdom +puppeteer +puppethood +puppetish +puppetism +puppetize +puppetlike +puppetly +puppetman +puppetmaster +puppetry +puppify +puppily +Puppis +puppy +puppydom +puppyfish +puppyfoot +puppyhood +puppyish +puppyism +puppylike +puppysnatch +pupulo +Pupuluca +pupunha +Puquina +Puquinan +pur +purana +puranic +puraque +Purasati +Purbeck +Purbeckian +purblind +purblindly +purblindness +purchasability +purchasable +purchase +purchaser +purchasery +purdah +purdy +pure +pureblood +purebred +pured +puree +purehearted +purely +pureness +purer +purfle +purfled +purfler +purfling +purfly +purga +purgation +purgative +purgatively +purgatorial +purgatorian +purgatory +purge +purgeable +purger +purgery +purging +purificant +purification +purificative +purificator +purificatory +purifier +puriform +purify +purine +puriri +purism +purist +puristic +puristical +Puritan +puritandom +Puritaness +puritanic +puritanical +puritanically +puritanicalness +Puritanism +puritanism +Puritanize +Puritanizer +puritanlike +Puritanly +puritano +purity +Purkinje +Purkinjean +purl +purler +purlhouse +purlicue +purlieu +purlieuman +purlin +purlman +purloin +purloiner +purohepatitis +purolymph +puromucous +purpart +purparty +purple +purplelip +purplely +purpleness +purplescent +purplewood +purplewort +purplish +purplishness +purply +purport +purportless +purpose +purposedly +purposeful +purposefully +purposefulness +purposeless +purposelessly +purposelessness +purposelike +purposely +purposer +purposive +purposively +purposiveness +purposivism +purposivist +purposivistic +purpresture +purpura +purpuraceous +purpurate +purpure +purpureal +purpurean +purpureous +purpurescent +purpuric +purpuriferous +purpuriform +purpurigenous +purpurin +purpurine +purpuriparous +purpurite +purpurize +purpurogallin +purpurogenous +purpuroid +purpuroxanthin +purr +purre +purree +purreic +purrel +purrer +purring +purringly +purrone +purry +purse +pursed +purseful +purseless +purselike +purser +pursership +Purshia +pursily +pursiness +purslane +purslet +pursley +pursuable +pursual +pursuance +pursuant +pursuantly +pursue +pursuer +pursuit +pursuitmeter +pursuivant +pursy +purtenance +Puru +Puruha +purulence +purulency +purulent +purulently +puruloid +Purupuru +purusha +purushartha +purvey +purveyable +purveyal +purveyance +purveyancer +purveyor +purveyoress +purview +purvoe +purwannah +pus +Puschkinia +Puseyism +Puseyistical +Puseyite +push +pushball +pushcart +pusher +pushful +pushfully +pushfulness +pushing +pushingly +pushingness +pushmobile +pushover +pushpin +Pushtu +pushwainling +pusillanimity +pusillanimous +pusillanimously +pusillanimousness +puss +pusscat +pussley +pusslike +pussy +pussycat +pussyfoot +pussyfooted +pussyfooter +pussyfooting +pussyfootism +pussytoe +pustulant +pustular +pustulate +pustulated +pustulation +pustulatous +pustule +pustuled +pustulelike +pustuliform +pustulose +pustulous +put +putage +putamen +putaminous +putanism +putation +putationary +putative +putatively +putback +putchen +putcher +puteal +putelee +puther +puthery +putid +putidly +putidness +putlog +putois +Putorius +putredinal +putredinous +putrefacient +putrefactible +putrefaction +putrefactive +putrefactiveness +putrefiable +putrefier +putrefy +putresce +putrescence +putrescency +putrescent +putrescibility +putrescible +putrescine +putricide +putrid +putridity +putridly +putridness +putrifacted +putriform +putrilage +putrilaginous +putrilaginously +putschism +putschist +putt +puttee +putter +putterer +putteringly +puttier +puttock +putty +puttyblower +puttyhead +puttyhearted +puttylike +puttyroot +puttywork +puture +puxy +Puya +Puyallup +puzzle +puzzleation +puzzled +puzzledly +puzzledness +puzzledom +puzzlehead +puzzleheaded +puzzleheadedly +puzzleheadedness +puzzleman +puzzlement +puzzlepate +puzzlepated +puzzlepatedness +puzzler +puzzling +puzzlingly +puzzlingness +pya +pyal +pyarthrosis +pyche +Pycnanthemum +pycnia +pycnial +pycnid +pycnidia +pycnidial +pycnidiophore +pycnidiospore +pycnidium +pycniospore +pycnite +pycnium +Pycnocoma +pycnoconidium +pycnodont +Pycnodonti +Pycnodontidae +pycnodontoid +Pycnodus +pycnogonid +Pycnogonida +pycnogonidium +pycnogonoid +pycnometer +pycnometochia +pycnometochic +pycnomorphic +pycnomorphous +Pycnonotidae +Pycnonotinae +pycnonotine +Pycnonotus +pycnosis +pycnospore +pycnosporic +pycnostyle +pycnotic +pyelectasis +pyelic +pyelitic +pyelitis +pyelocystitis +pyelogram +pyelograph +pyelographic +pyelography +pyelolithotomy +pyelometry +pyelonephritic +pyelonephritis +pyelonephrosis +pyeloplasty +pyeloscopy +pyelotomy +pyeloureterogram +pyemesis +pyemia +pyemic +pygal +pygalgia +pygarg +pygargus +pygidial +pygidid +Pygididae +Pygidium +pygidium +pygmaean +Pygmalion +pygmoid +Pygmy +pygmy +pygmydom +pygmyhood +pygmyish +pygmyism +pygmyship +pygmyweed +Pygobranchia +Pygobranchiata +pygobranchiate +pygofer +pygopagus +pygopod +Pygopodes +Pygopodidae +pygopodine +pygopodous +Pygopus +pygostyle +pygostyled +pygostylous +pyic +pyin +pyjama +pyjamaed +pyke +pyknatom +pyknic +pyknotic +pyla +Pylades +pylagore +pylangial +pylangium +pylar +pylephlebitic +pylephlebitis +pylethrombophlebitis +pylethrombosis +pylic +pylon +pyloralgia +pylorectomy +pyloric +pyloristenosis +pyloritis +pylorocleisis +pylorodilator +pylorogastrectomy +pyloroplasty +pyloroptosis +pyloroschesis +pyloroscirrhus +pyloroscopy +pylorospasm +pylorostenosis +pylorostomy +pylorus +pyobacillosis +pyocele +pyoctanin +pyocyanase +pyocyanin +pyocyst +pyocyte +pyodermatitis +pyodermatosis +pyodermia +pyodermic +pyogenesis +pyogenetic +pyogenic +pyogenin +pyogenous +pyohemothorax +pyoid +pyolabyrinthitis +pyolymph +pyometra +pyometritis +pyonephritis +pyonephrosis +pyonephrotic +pyopericarditis +pyopericardium +pyoperitoneum +pyoperitonitis +pyophagia +pyophthalmia +pyophylactic +pyoplania +pyopneumocholecystitis +pyopneumocyst +pyopneumopericardium +pyopneumoperitoneum +pyopneumoperitonitis +pyopneumothorax +pyopoiesis +pyopoietic +pyoptysis +pyorrhea +pyorrheal +pyorrheic +pyosalpingitis +pyosalpinx +pyosepticemia +pyosepticemic +pyosis +pyospermia +pyotherapy +pyothorax +pyotoxinemia +pyoureter +pyovesiculosis +pyoxanthose +pyr +pyracanth +Pyracantha +Pyraceae +pyracene +pyral +Pyrales +pyralid +Pyralidae +pyralidan +pyralidid +Pyralididae +pyralidiform +Pyralidoidea +pyralis +pyraloid +Pyrameis +pyramid +pyramidaire +pyramidal +pyramidale +pyramidalis +Pyramidalism +Pyramidalist +pyramidally +pyramidate +Pyramidella +pyramidellid +Pyramidellidae +pyramider +pyramides +pyramidia +pyramidic +pyramidical +pyramidically +pyramidicalness +pyramidion +Pyramidist +pyramidize +pyramidlike +pyramidoattenuate +pyramidoidal +pyramidologist +pyramidoprismatic +pyramidwise +pyramoidal +pyran +pyranometer +pyranyl +pyrargyrite +Pyrausta +Pyraustinae +pyrazine +pyrazole +pyrazoline +pyrazolone +pyrazolyl +pyre +pyrectic +pyrena +pyrene +Pyrenean +pyrenematous +pyrenic +pyrenin +pyrenocarp +pyrenocarpic +pyrenocarpous +Pyrenochaeta +pyrenodean +pyrenodeine +pyrenodeous +pyrenoid +pyrenolichen +Pyrenomycetales +pyrenomycete +Pyrenomycetes +Pyrenomycetineae +pyrenomycetous +Pyrenopeziza +pyrethrin +Pyrethrum +pyrethrum +pyretic +pyreticosis +pyretogenesis +pyretogenetic +pyretogenic +pyretogenous +pyretography +pyretology +pyretolysis +pyretotherapy +pyrewinkes +Pyrex +pyrex +pyrexia +pyrexial +pyrexic +pyrexical +pyrgeometer +pyrgocephalic +pyrgocephaly +pyrgoidal +pyrgologist +pyrgom +pyrheliometer +pyrheliometric +pyrheliometry +pyrheliophor +pyribole +pyridazine +pyridic +pyridine +pyridinium +pyridinize +pyridone +pyridoxine +pyridyl +pyriform +pyriformis +pyrimidine +pyrimidyl +pyritaceous +pyrite +pyrites +pyritic +pyritical +pyritiferous +pyritization +pyritize +pyritohedral +pyritohedron +pyritoid +pyritology +pyritous +pyro +pyroacetic +pyroacid +pyroantimonate +pyroantimonic +pyroarsenate +pyroarsenic +pyroarsenious +pyroarsenite +pyrobelonite +pyrobituminous +pyroborate +pyroboric +pyrocatechin +pyrocatechinol +pyrocatechol +pyrocatechuic +pyrocellulose +pyrochemical +pyrochemically +pyrochlore +pyrochromate +pyrochromic +pyrocinchonic +pyrocitric +pyroclastic +pyrocoll +pyrocollodion +pyrocomenic +pyrocondensation +pyroconductivity +pyrocotton +pyrocrystalline +Pyrocystis +Pyrodine +pyroelectric +pyroelectricity +pyrogallate +pyrogallic +pyrogallol +pyrogen +pyrogenation +pyrogenesia +pyrogenesis +pyrogenetic +pyrogenetically +pyrogenic +pyrogenous +pyroglutamic +pyrognomic +pyrognostic +pyrognostics +pyrograph +pyrographer +pyrographic +pyrography +pyrogravure +pyroguaiacin +pyroheliometer +pyroid +Pyrola +Pyrolaceae +pyrolaceous +pyrolater +pyrolatry +pyroligneous +pyrolignic +pyrolignite +pyrolignous +pyrolite +pyrollogical +pyrologist +pyrology +pyrolusite +pyrolysis +pyrolytic +pyrolyze +pyromachy +pyromagnetic +pyromancer +pyromancy +pyromania +pyromaniac +pyromaniacal +pyromantic +pyromeconic +pyromellitic +pyrometallurgy +pyrometamorphic +pyrometamorphism +pyrometer +pyrometric +pyrometrical +pyrometrically +pyrometry +Pyromorphidae +pyromorphism +pyromorphite +pyromorphous +pyromotor +pyromucate +pyromucic +pyromucyl +pyronaphtha +pyrone +Pyronema +pyronine +pyronomics +pyronyxis +pyrope +pyropen +pyrophanite +pyrophanous +pyrophile +pyrophilous +pyrophobia +pyrophone +pyrophoric +pyrophorous +pyrophorus +pyrophosphate +pyrophosphoric +pyrophosphorous +pyrophotograph +pyrophotography +pyrophotometer +pyrophyllite +pyrophysalite +pyropuncture +pyropus +pyroracemate +pyroracemic +pyroscope +pyroscopy +pyrosis +pyrosmalite +Pyrosoma +Pyrosomatidae +pyrosome +Pyrosomidae +pyrosomoid +pyrosphere +pyrostat +pyrostereotype +pyrostilpnite +pyrosulphate +pyrosulphite +pyrosulphuric +pyrosulphuryl +pyrotantalate +pyrotartaric +pyrotartrate +pyrotechnian +pyrotechnic +pyrotechnical +pyrotechnically +pyrotechnician +pyrotechnics +pyrotechnist +pyrotechny +pyroterebic +pyrotheology +Pyrotheria +Pyrotherium +pyrotic +pyrotoxin +pyrotritaric +pyrotritartric +pyrouric +pyrovanadate +pyrovanadic +pyroxanthin +pyroxene +pyroxenic +pyroxenite +pyroxmangite +pyroxonium +pyroxyle +pyroxylene +pyroxylic +pyroxylin +Pyrrhic +pyrrhic +pyrrhichian +pyrrhichius +pyrrhicist +Pyrrhocoridae +Pyrrhonean +Pyrrhonian +Pyrrhonic +Pyrrhonism +Pyrrhonist +Pyrrhonistic +Pyrrhonize +pyrrhotine +pyrrhotism +pyrrhotist +pyrrhotite +pyrrhous +Pyrrhuloxia +Pyrrhus +pyrrodiazole +pyrrol +pyrrole +pyrrolic +pyrrolidine +pyrrolidone +pyrrolidyl +pyrroline +pyrrolylene +pyrrophyllin +pyrroporphyrin +pyrrotriazole +pyrroyl +pyrryl +pyrrylene +Pyrula +Pyrularia +pyruline +pyruloid +Pyrus +pyruvaldehyde +pyruvate +pyruvic +pyruvil +pyruvyl +pyrylium +Pythagorean +Pythagoreanism +Pythagoreanize +Pythagoreanly +Pythagoric +Pythagorical +Pythagorically +Pythagorism +Pythagorist +Pythagorize +Pythagorizer +Pythia +Pythiaceae +Pythiacystis +Pythiad +Pythiambic +Pythian +Pythic +Pythios +Pythium +Pythius +pythogenesis +pythogenetic +pythogenic +pythogenous +python +pythoness +pythonic +pythonical +pythonid +Pythonidae +pythoniform +Pythoninae +pythonine +pythonism +Pythonissa +pythonist +pythonize +pythonoid +pythonomorph +Pythonomorpha +pythonomorphic +pythonomorphous +pyuria +pyvuril +pyx +Pyxidanthera +pyxidate +pyxides +pyxidium +pyxie +Pyxis +pyxis +Q +q +qasida +qere +qeri +qintar +Qoheleth +qoph +qua +quab +quabird +quachil +quack +quackery +quackhood +quackish +quackishly +quackishness +quackism +quackle +quacksalver +quackster +quacky +quad +quadded +quaddle +Quader +Quadi +quadmeter +quadra +quadrable +quadragenarian +quadragenarious +Quadragesima +quadragesimal +quadragintesimal +quadral +quadrangle +quadrangled +quadrangular +quadrangularly +quadrangularness +quadrangulate +quadrans +quadrant +quadrantal +quadrantes +Quadrantid +quadrantile +quadrantlike +quadrantly +quadrat +quadrate +quadrated +quadrateness +quadratic +quadratical +quadratically +quadratics +Quadratifera +quadratiferous +quadratojugal +quadratomandibular +quadratosquamosal +quadratrix +quadratum +quadrature +quadratus +quadrauricular +quadrennia +quadrennial +quadrennially +quadrennium +quadriad +quadrialate +quadriannulate +quadriarticulate +quadriarticulated +quadribasic +quadric +quadricapsular +quadricapsulate +quadricarinate +quadricellular +quadricentennial +quadriceps +quadrichord +quadriciliate +quadricinium +quadricipital +quadricone +quadricorn +quadricornous +quadricostate +quadricotyledonous +quadricovariant +quadricrescentic +quadricrescentoid +quadricuspid +quadricuspidal +quadricuspidate +quadricycle +quadricycler +quadricyclist +quadridentate +quadridentated +quadriderivative +quadridigitate +quadriennial +quadriennium +quadrienniumutile +quadrifarious +quadrifariously +quadrifid +quadrifilar +quadrifocal +quadrifoil +quadrifoliate +quadrifoliolate +quadrifolious +quadrifolium +quadriform +quadrifrons +quadrifrontal +quadrifurcate +quadrifurcated +quadrifurcation +quadriga +quadrigabled +quadrigamist +quadrigate +quadrigatus +quadrigeminal +quadrigeminate +quadrigeminous +quadrigeminum +quadrigenarious +quadriglandular +quadrihybrid +quadrijugal +quadrijugate +quadrijugous +quadrilaminar +quadrilaminate +quadrilateral +quadrilaterally +quadrilateralness +quadrilingual +quadriliteral +quadrille +quadrilled +quadrillion +quadrillionth +quadrilobate +quadrilobed +quadrilocular +quadriloculate +quadrilogue +quadrilogy +quadrimembral +quadrimetallic +quadrimolecular +quadrimum +quadrinodal +quadrinomial +quadrinomical +quadrinominal +quadrinucleate +quadrioxalate +quadriparous +quadripartite +quadripartitely +quadripartition +quadripennate +quadriphosphate +quadriphyllous +quadripinnate +quadriplanar +quadriplegia +quadriplicate +quadriplicated +quadripolar +quadripole +quadriportico +quadriporticus +quadripulmonary +quadriquadric +quadriradiate +quadrireme +quadrisect +quadrisection +quadriseptate +quadriserial +quadrisetose +quadrispiral +quadristearate +quadrisulcate +quadrisulcated +quadrisulphide +quadrisyllabic +quadrisyllabical +quadrisyllable +quadrisyllabous +quadriternate +quadritubercular +quadrituberculate +quadriurate +quadrivalence +quadrivalency +quadrivalent +quadrivalently +quadrivalve +quadrivalvular +quadrivial +quadrivious +quadrivium +quadrivoltine +quadroon +quadrual +Quadrula +quadrum +Quadrumana +quadrumanal +quadrumane +quadrumanous +quadruped +quadrupedal +quadrupedan +quadrupedant +quadrupedantic +quadrupedantical +quadrupedate +quadrupedation +quadrupedism +quadrupedous +quadruplane +quadruplator +quadruple +quadrupleness +quadruplet +quadruplex +quadruplicate +quadruplication +quadruplicature +quadruplicity +quadruply +quadrupole +quaedam +Quaequae +quaesitum +quaestor +quaestorial +quaestorian +quaestorship +quaestuary +quaff +quaffer +quaffingly +quag +quagga +quagginess +quaggle +quaggy +quagmire +quagmiry +quahog +quail +quailberry +quailery +quailhead +quaillike +quaily +quaint +quaintance +quaintise +quaintish +quaintly +quaintness +Quaitso +quake +quakeful +quakeproof +Quaker +quaker +quakerbird +Quakerdom +Quakeress +Quakeric +Quakerish +Quakerishly +Quakerishness +Quakerism +Quakerization +Quakerize +Quakerlet +Quakerlike +Quakerly +Quakership +Quakery +quaketail +quakiness +quaking +quakingly +quaky +quale +qualifiable +qualification +qualificative +qualificator +qualificatory +qualified +qualifiedly +qualifiedness +qualifier +qualify +qualifyingly +qualimeter +qualitative +qualitatively +qualitied +quality +qualityless +qualityship +qualm +qualminess +qualmish +qualmishly +qualmishness +qualmproof +qualmy +qualmyish +qualtagh +Quamasia +Quamoclit +quan +quandary +quandong +quandy +quannet +quant +quanta +quantic +quantical +quantifiable +quantifiably +quantification +quantifier +quantify +quantimeter +quantitate +quantitative +quantitatively +quantitativeness +quantitied +quantitive +quantitively +quantity +quantivalence +quantivalency +quantivalent +quantization +quantize +quantometer +quantulum +quantum +Quapaw +quaquaversal +quaquaversally +quar +quarantinable +quarantine +quarantiner +quaranty +quardeel +quare +quarenden +quarender +quarentene +quark +quarl +quarle +quarred +quarrel +quarreled +quarreler +quarreling +quarrelingly +quarrelproof +quarrelsome +quarrelsomely +quarrelsomeness +quarriable +quarried +quarrier +quarry +quarryable +quarrying +quarryman +quarrystone +quart +quartan +quartane +quartation +quartenylic +quarter +quarterage +quarterback +quarterdeckish +quartered +quarterer +quartering +quarterization +quarterland +quarterly +quarterman +quartermaster +quartermasterlike +quartermastership +quartern +quarterpace +quarters +quartersaw +quartersawed +quarterspace +quarterstaff +quarterstetch +quartet +quartette +quartetto +quartful +quartic +quartile +quartine +quartiparous +quarto +Quartodeciman +quartodecimanism +quartole +quartz +quartzic +quartziferous +quartzite +quartzitic +quartzless +quartzoid +quartzose +quartzous +quartzy +quash +Quashee +quashey +quashy +quasi +quasijudicial +Quasimodo +quasky +quassation +quassative +Quassia +quassiin +quassin +quat +quata +quatch +quatercentenary +quatern +quaternal +quaternarian +quaternarius +quaternary +quaternate +quaternion +quaternionic +quaternionist +quaternitarian +quaternity +quaters +quatertenses +quatorzain +quatorze +quatrain +quatral +quatrayle +quatre +quatrefeuille +quatrefoil +quatrefoiled +quatrefoliated +quatrible +quatrin +quatrino +quatrocentism +quatrocentist +quatrocento +Quatsino +quattie +quattrini +quatuor +quatuorvirate +quauk +quave +quaver +quaverer +quavering +quaveringly +quaverous +quavery +quaverymavery +quaw +quawk +quay +quayage +quayful +quaylike +quayman +quayside +quaysider +qubba +queach +queachy +queak +queal +quean +queanish +queasily +queasiness +queasom +queasy +quebrachamine +quebrachine +quebrachitol +quebracho +quebradilla +Quechua +Quechuan +quedful +queechy +queen +queencake +queencraft +queencup +queendom +queenfish +queenhood +queening +queenite +queenless +queenlet +queenlike +queenliness +queenly +queenright +queenroot +queensberry +queenship +queenweed +queenwood +queer +queerer +queerish +queerishness +queerity +queerly +queerness +queersome +queery +queest +queesting +queet +queeve +quegh +quei +queintise +quelch +Quelea +quell +queller +quemado +queme +quemeful +quemefully +quemely +quench +quenchable +quenchableness +quencher +quenchless +quenchlessly +quenchlessness +quenelle +quenselite +quercetagetin +quercetic +quercetin +quercetum +quercic +Querciflorae +quercimeritrin +quercin +quercine +quercinic +quercitannic +quercitannin +quercite +quercitin +quercitol +quercitrin +quercitron +quercivorous +Quercus +Querecho +Querendi +Querendy +querent +Queres +querier +queriman +querimonious +querimoniously +querimoniousness +querimony +querist +querken +querl +quern +quernal +Quernales +quernstone +querulent +querulential +querulist +querulity +querulosity +querulous +querulously +querulousness +query +querying +queryingly +queryist +quesited +quesitive +quest +quester +questeur +questful +questingly +question +questionability +questionable +questionableness +questionably +questionary +questionee +questioner +questioningly +questionist +questionless +questionlessly +questionnaire +questionous +questionwise +questman +questor +questorial +questorship +quet +quetch +quetenite +quetzal +queue +quey +Quiangan +quiapo +quib +quibble +quibbleproof +quibbler +quibblingly +quiblet +quica +Quiche +quick +quickbeam +quickborn +quicken +quickenance +quickenbeam +quickener +quickfoot +quickhatch +quickhearted +quickie +quicklime +quickly +quickness +quicksand +quicksandy +quickset +quicksilver +quicksilvering +quicksilverish +quicksilverishness +quicksilvery +quickstep +quickthorn +quickwork +quid +Quidae +quiddative +quidder +Quiddist +quiddit +quidditative +quidditatively +quiddity +quiddle +quiddler +quidnunc +quiesce +quiescence +quiescency +quiescent +quiescently +quiet +quietable +quieten +quietener +quieter +quieting +quietism +quietist +quietistic +quietive +quietlike +quietly +quietness +quietsome +quietude +quietus +quiff +quiffing +Quiina +Quiinaceae +quiinaceous +quila +quiles +Quileute +quilkin +quill +Quillagua +quillai +quillaic +Quillaja +quillaja +quillback +quilled +quiller +quillet +quilleted +quillfish +quilling +quilltail +quillwork +quillwort +quilly +quilt +quilted +quilter +quilting +Quimbaya +Quimper +quin +quina +quinacrine +Quinaielt +quinaldic +quinaldine +quinaldinic +quinaldinium +quinaldyl +quinamicine +quinamidine +quinamine +quinanisole +quinaquina +quinarian +quinarius +quinary +quinate +quinatoxine +Quinault +quinazoline +quinazolyl +quince +quincentenary +quincentennial +quincewort +quinch +quincubital +quincubitalism +quincuncial +quincuncially +quincunx +quincunxial +quindecad +quindecagon +quindecangle +quindecasyllabic +quindecemvir +quindecemvirate +quindecennial +quindecim +quindecima +quindecylic +quindene +quinetum +quingentenary +quinhydrone +quinia +quinible +quinic +quinicine +quinidia +quinidine +quinin +quinina +quinine +quininiazation +quininic +quininism +quininize +quiniretin +quinisext +quinisextine +quinism +quinite +quinitol +quinizarin +quinize +quink +quinnat +quinnet +Quinnipiac +quinoa +quinocarbonium +quinoform +quinogen +quinoid +quinoidal +quinoidation +quinoidine +quinol +quinoline +quinolinic +quinolinium +quinolinyl +quinologist +quinology +quinolyl +quinometry +quinone +quinonediimine +quinonic +quinonimine +quinonization +quinonize +quinonoid +quinonyl +quinopyrin +quinotannic +quinotoxine +quinova +quinovatannic +quinovate +quinovic +quinovin +quinovose +quinoxaline +quinoxalyl +quinoyl +quinquagenarian +quinquagenary +Quinquagesima +quinquagesimal +quinquarticular +Quinquatria +Quinquatrus +quinquecapsular +quinquecostate +quinquedentate +quinquedentated +quinquefarious +quinquefid +quinquefoliate +quinquefoliated +quinquefoliolate +quinquegrade +quinquejugous +quinquelateral +quinqueliteral +quinquelobate +quinquelobated +quinquelobed +quinquelocular +quinqueloculine +quinquenary +quinquenerval +quinquenerved +quinquennalia +quinquennia +quinquenniad +quinquennial +quinquennialist +quinquennially +quinquennium +quinquepartite +quinquepedal +quinquepedalian +quinquepetaloid +quinquepunctal +quinquepunctate +quinqueradial +quinqueradiate +quinquereme +quinquertium +quinquesect +quinquesection +quinqueseptate +quinqueserial +quinqueseriate +quinquesyllabic +quinquesyllable +quinquetubercular +quinquetuberculate +quinquevalence +quinquevalency +quinquevalent +quinquevalve +quinquevalvous +quinquevalvular +quinqueverbal +quinqueverbial +quinquevir +quinquevirate +quinquiliteral +quinquina +quinquino +quinse +quinsied +quinsy +quinsyberry +quinsywort +quint +quintad +quintadena +quintadene +quintain +quintal +quintan +quintant +quintary +quintato +quinte +quintelement +quintennial +quinternion +quinteron +quinteroon +quintessence +quintessential +quintessentiality +quintessentially +quintessentiate +quintet +quintette +quintetto +quintic +quintile +Quintilis +Quintillian +quintillion +quintillionth +Quintin +quintin +quintiped +Quintius +quinto +quintocubital +quintocubitalism +quintole +quinton +quintroon +quintuple +quintuplet +quintuplicate +quintuplication +quintuplinerved +quintupliribbed +quintus +quinuclidine +quinyl +quinze +quinzieme +quip +quipful +quipo +quipper +quippish +quippishness +quippy +quipsome +quipsomeness +quipster +quipu +quira +quire +quirewise +Quirinal +Quirinalia +quirinca +quiritarian +quiritary +Quirite +Quirites +quirk +quirkiness +quirkish +quirksey +quirksome +quirky +quirl +quirquincho +quirt +quis +quisby +quiscos +quisle +quisling +Quisqualis +quisqueite +quisquilian +quisquiliary +quisquilious +quisquous +quisutsch +quit +quitch +quitclaim +quite +Quitemoca +Quiteno +quitrent +quits +quittable +quittance +quitted +quitter +quittor +Quitu +quiver +quivered +quiverer +quiverful +quivering +quiveringly +quiverish +quiverleaf +quivery +Quixote +quixotic +quixotical +quixotically +quixotism +quixotize +quixotry +quiz +quizzability +quizzable +quizzacious +quizzatorial +quizzee +quizzer +quizzery +quizzical +quizzicality +quizzically +quizzicalness +quizzification +quizzify +quizziness +quizzingly +quizzish +quizzism +quizzity +quizzy +Qung +quo +quod +quoddies +quoddity +quodlibet +quodlibetal +quodlibetarian +quodlibetary +quodlibetic +quodlibetical +quodlibetically +quoilers +quoin +quoined +quoining +quoit +quoiter +quoitlike +quoits +quondam +quondamly +quondamship +quoniam +quop +Quoratean +quorum +quot +quota +quotability +quotable +quotableness +quotably +quotation +quotational +quotationally +quotationist +quotative +quote +quotee +quoteless +quotennial +quoter +quoteworthy +quoth +quotha +quotidian +quotidianly +quotidianness +quotient +quotiety +quotingly +quotity +quotlibet +quotum +Qurti +R +r +ra +raad +Raanan +raash +Rab +rab +raband +rabanna +rabat +rabatine +rabatte +rabattement +rabbanist +rabbanite +rabbet +rabbeting +rabbi +rabbin +rabbinate +rabbindom +Rabbinic +rabbinic +Rabbinica +rabbinical +rabbinically +rabbinism +rabbinist +rabbinistic +rabbinistical +rabbinite +rabbinize +rabbinship +rabbiship +rabbit +rabbitberry +rabbiter +rabbithearted +rabbitlike +rabbitmouth +rabbitproof +rabbitroot +rabbitry +rabbitskin +rabbitweed +rabbitwise +rabbitwood +rabbity +rabble +rabblelike +rabblement +rabbleproof +rabbler +rabblesome +rabboni +rabbonim +Rabelaisian +Rabelaisianism +Rabelaism +Rabi +rabic +rabid +rabidity +rabidly +rabidness +rabies +rabietic +rabific +rabiform +rabigenic +Rabin +rabinet +rabirubia +rabitic +rabulistic +rabulous +raccoon +raccoonberry +raccroc +race +raceabout +racebrood +racecourse +racegoer +racegoing +racelike +racemate +racemation +raceme +racemed +racemic +racemiferous +racemiform +racemism +racemization +racemize +racemocarbonate +racemocarbonic +racemomethylate +racemose +racemosely +racemous +racemously +racemule +racemulose +racer +raceway +rach +rache +Rachel +rachial +rachialgia +rachialgic +rachianalgesia +Rachianectes +rachianesthesia +rachicentesis +rachides +rachidial +rachidian +rachiform +Rachiglossa +rachiglossate +rachigraph +rachilla +rachiocentesis +rachiococainize +rachiocyphosis +rachiodont +rachiodynia +rachiometer +rachiomyelitis +rachioparalysis +rachioplegia +rachioscoliosis +rachiotome +rachiotomy +rachipagus +rachis +rachischisis +rachitic +rachitis +rachitism +rachitogenic +rachitome +rachitomous +rachitomy +Rachycentridae +Rachycentron +racial +racialism +racialist +raciality +racialization +racialize +racially +racily +raciness +racing +racinglike +racism +racist +rack +rackabones +rackan +rackboard +racker +racket +racketeer +racketeering +racketer +racketing +racketlike +racketproof +racketry +rackett +rackettail +rackety +rackful +racking +rackingly +rackle +rackless +rackmaster +rackproof +rackrentable +rackway +rackwork +racloir +racon +raconteur +racoon +Racovian +racy +rad +rada +radar +radarman +radarscope +raddle +raddleman +raddlings +radectomy +Radek +radiability +radiable +radial +radiale +radialia +radiality +radialization +radialize +radially +radian +radiance +radiancy +radiant +radiantly +Radiata +radiate +radiated +radiately +radiateness +radiatics +radiatiform +radiation +radiational +radiative +radiatopatent +radiatoporose +radiatoporous +radiator +radiatory +radiatostriate +radiatosulcate +radiature +radical +radicalism +radicality +radicalization +radicalize +radically +radicalness +radicand +radicant +radicate +radicated +radicating +radication +radicel +radices +radicicola +radicicolous +radiciferous +radiciflorous +radiciform +radicivorous +radicle +radicolous +radicose +Radicula +radicular +radicule +radiculectomy +radiculitis +radiculose +radiectomy +radiescent +radiferous +radii +radio +radioacoustics +radioactinium +radioactivate +radioactive +radioactively +radioactivity +radioamplifier +radioanaphylaxis +radioautograph +radioautographic +radioautography +radiobicipital +radiobroadcast +radiobroadcaster +radiobroadcasting +radiobserver +radiocarbon +radiocarpal +radiocast +radiocaster +radiochemical +radiochemistry +radiocinematograph +radioconductor +radiode +radiodermatitis +radiodetector +radiodiagnosis +radiodigital +radiodontia +radiodontic +radiodontist +radiodynamic +radiodynamics +radioelement +radiogenic +radiogoniometer +radiogoniometric +radiogoniometry +radiogram +radiograph +radiographer +radiographic +radiographical +radiographically +radiography +radiohumeral +radioisotope +Radiolaria +radiolarian +radiolead +radiolite +Radiolites +radiolitic +Radiolitidae +radiolocation +radiolocator +radiologic +radiological +radiologist +radiology +radiolucency +radiolucent +radioluminescence +radioluminescent +radioman +radiomedial +radiometallography +radiometeorograph +radiometer +radiometric +radiometrically +radiometry +radiomicrometer +radiomovies +radiomuscular +radionecrosis +radioneuritis +radionics +radiopacity +radiopalmar +radiopaque +radiopelvimetry +radiophare +radiophone +radiophonic +radiophony +radiophosphorus +radiophotograph +radiophotography +radiopraxis +radioscope +radioscopic +radioscopical +radioscopy +radiosensibility +radiosensitive +radiosensitivity +radiosonde +radiosonic +radiostereoscopy +radiosurgery +radiosurgical +radiosymmetrical +radiotechnology +radiotelegram +radiotelegraph +radiotelegraphic +radiotelegraphy +radiotelephone +radiotelephonic +radiotelephony +radioteria +radiothallium +radiotherapeutic +radiotherapeutics +radiotherapeutist +radiotherapist +radiotherapy +radiothermy +radiothorium +radiotoxemia +radiotransparency +radiotransparent +radiotrician +Radiotron +radiotropic +radiotropism +radiovision +radish +radishlike +radium +radiumization +radiumize +radiumlike +radiumproof +radiumtherapy +radius +radix +radknight +radman +radome +radon +radsimir +radula +radulate +raduliferous +raduliform +Rafael +Rafe +raff +Raffaelesque +raffe +raffee +raffery +raffia +raffinase +raffinate +raffing +raffinose +raffish +raffishly +raffishness +raffle +raffler +Rafflesia +rafflesia +Rafflesiaceae +rafflesiaceous +Rafik +raft +raftage +rafter +raftiness +raftlike +raftman +raftsman +rafty +rag +raga +ragabash +ragabrash +ragamuffin +ragamuffinism +ragamuffinly +rage +rageful +ragefully +rageless +rageous +rageously +rageousness +rageproof +rager +ragesome +ragfish +ragged +raggedly +raggedness +raggedy +raggee +ragger +raggery +raggety +raggil +raggily +ragging +raggle +raggled +raggy +raghouse +Raghu +raging +ragingly +raglan +raglanite +raglet +raglin +ragman +Ragnar +ragout +ragpicker +ragseller +ragshag +ragsorter +ragstone +ragtag +ragtime +ragtimer +ragtimey +ragule +raguly +ragweed +ragwort +rah +Rahanwin +rahdar +rahdaree +Rahul +Raia +raia +Raiae +raid +raider +raidproof +Raif +Raiidae +raiiform +rail +railage +railbird +railer +railhead +railing +railingly +raillery +railless +raillike +railly +railman +railroad +railroadana +railroader +railroadiana +railroading +railroadish +railroadship +railway +railwaydom +railwayless +Raimannia +raiment +raimentless +rain +rainband +rainbird +rainbound +rainbow +rainbowlike +rainbowweed +rainbowy +rainburst +raincoat +raindrop +Rainer +rainer +rainfall +rainfowl +rainful +rainily +raininess +rainless +rainlessness +rainlight +rainproof +rainproofer +rainspout +rainstorm +raintight +rainwash +rainworm +rainy +raioid +Rais +rais +raisable +raise +raised +raiseman +raiser +raisin +raising +raisiny +Raj +raj +Raja +raja +Rajah +rajah +Rajarshi +rajaship +Rajasthani +rajbansi +Rajeev +Rajendra +Rajesh +Rajidae +Rajiv +Rajput +rakan +rake +rakeage +rakeful +rakehell +rakehellish +rakehelly +raker +rakery +rakesteel +rakestele +rakh +Rakhal +raki +rakily +raking +rakish +rakishly +rakishness +rakit +rakshasa +raku +Ralf +rallentando +ralliance +Rallidae +rallier +ralliform +Rallinae +ralline +Rallus +rally +Ralph +ralph +ralstonite +Ram +ram +Rama +ramada +Ramadoss +ramage +Ramaism +Ramaite +ramal +Raman +Ramanan +ramanas +ramarama +ramass +ramate +rambeh +ramberge +ramble +rambler +rambling +ramblingly +ramblingness +Rambo +rambong +rambooze +Rambouillet +rambunctious +rambutan +ramdohrite +rame +rameal +Ramean +ramed +ramekin +ramellose +rament +ramentaceous +ramental +ramentiferous +ramentum +rameous +ramequin +Rameses +Rameseum +Ramesh +Ramessid +Ramesside +ramet +ramex +ramfeezled +ramgunshoch +ramhead +ramhood +rami +ramicorn +ramie +ramiferous +ramificate +ramification +ramified +ramiflorous +ramiform +ramify +ramigerous +Ramillie +Ramillied +ramiparous +Ramiro +ramisection +ramisectomy +Ramism +Ramist +Ramistical +ramlike +ramline +rammack +rammel +rammelsbergite +rammer +rammerman +rammish +rammishly +rammishness +rammy +Ramneek +Ramnenses +Ramnes +Ramon +Ramona +Ramoosii +ramose +ramosely +ramosity +ramosopalmate +ramosopinnate +ramososubdivided +ramous +ramp +rampacious +rampaciously +rampage +rampageous +rampageously +rampageousness +rampager +rampagious +rampancy +rampant +rampantly +rampart +ramped +ramper +Ramphastidae +Ramphastides +Ramphastos +rampick +rampike +ramping +rampingly +rampion +rampire +rampler +ramplor +rampsman +ramrace +ramrod +ramroddy +ramscallion +ramsch +Ramsey +ramshackle +ramshackled +ramshackleness +ramshackly +ramson +ramstam +ramtil +ramular +ramule +ramuliferous +ramulose +ramulous +ramulus +ramus +ramuscule +Ramusi +Ran +ran +Rana +rana +ranal +Ranales +ranarian +ranarium +Ranatra +rance +rancel +rancellor +rancelman +rancer +rancescent +ranch +ranche +rancher +rancheria +ranchero +ranchless +ranchman +rancho +ranchwoman +rancid +rancidification +rancidify +rancidity +rancidly +rancidness +rancor +rancorous +rancorously +rancorousness +rancorproof +Rand +rand +Randal +Randall +Randallite +randan +randannite +Randell +randem +rander +Randia +randing +randir +Randite +randle +Randolph +random +randomish +randomization +randomize +randomly +randomness +randomwise +Randy +randy +rane +Ranella +Ranere +rang +rangatira +range +ranged +rangeless +rangeman +ranger +rangership +rangework +rangey +Rangifer +rangiferine +ranginess +ranging +rangle +rangler +rangy +rani +ranid +Ranidae +raniferous +raniform +Ranina +Raninae +ranine +raninian +ranivorous +Ranjit +rank +ranked +ranker +rankish +rankle +rankless +ranklingly +rankly +rankness +ranksman +rankwise +rann +rannel +rannigal +ranny +Ranquel +ransack +ransacker +ransackle +ransel +ranselman +ransom +ransomable +ransomer +ransomfree +ransomless +ranstead +rant +rantan +rantankerous +rantepole +ranter +Ranterism +ranting +rantingly +rantipole +rantock +ranty +ranula +ranular +Ranunculaceae +ranunculaceous +Ranunculales +ranunculi +Ranunculus +Ranzania +Raoulia +rap +Rapaces +rapaceus +rapacious +rapaciously +rapaciousness +rapacity +rapakivi +Rapallo +Rapanea +Rapateaceae +rapateaceous +rape +rapeful +raper +rapeseed +Raphael +Raphaelesque +Raphaelic +Raphaelism +Raphaelite +Raphaelitism +raphania +Raphanus +raphany +raphe +Raphia +raphide +raphides +raphidiferous +raphidiid +Raphidiidae +Raphidodea +Raphidoidea +Raphiolepis +raphis +rapic +rapid +rapidity +rapidly +rapidness +rapier +rapiered +rapillo +rapine +rapiner +raping +rapinic +rapist +raploch +rappage +rapparee +rappe +rappel +rapper +rapping +Rappist +rappist +Rappite +rapport +rapscallion +rapscallionism +rapscallionly +rapscallionry +rapt +raptatorial +raptatory +raptly +raptness +raptor +Raptores +raptorial +raptorious +raptril +rapture +raptured +raptureless +rapturist +rapturize +rapturous +rapturously +rapturousness +raptury +raptus +rare +rarebit +rarefaction +rarefactional +rarefactive +rarefiable +rarefication +rarefier +rarefy +rarely +rareness +rareripe +Rareyfy +rariconstant +rarish +rarity +Rarotongan +ras +rasa +Rasalas +Rasalhague +rasamala +rasant +rascacio +rascal +rascaldom +rascaless +rascalion +rascalism +rascality +rascalize +rascallike +rascallion +rascally +rascalry +rascalship +rasceta +rascette +rase +rasen +Rasenna +raser +rasgado +rash +rasher +rashful +rashing +rashlike +rashly +rashness +Rashti +rasion +Raskolnik +Rasores +rasorial +rasp +raspatorium +raspatory +raspberriade +raspberry +raspberrylike +rasped +rasper +rasping +raspingly +raspingness +raspings +raspish +raspite +raspy +rasse +Rasselas +rassle +Rastaban +raster +rastik +rastle +Rastus +rasure +rat +rata +ratability +ratable +ratableness +ratably +ratafee +ratafia +ratal +ratanhia +rataplan +ratbite +ratcatcher +ratcatching +ratch +ratchel +ratchelly +ratcher +ratchet +ratchetlike +ratchety +ratching +ratchment +rate +rated +ratel +rateless +ratement +ratepayer +ratepaying +rater +ratfish +rath +rathe +rathed +rathely +ratheness +rather +ratherest +ratheripe +ratherish +ratherly +rathest +rathite +Rathnakumar +rathole +rathskeller +raticidal +raticide +ratification +ratificationist +ratifier +ratify +ratihabition +ratine +rating +ratio +ratiocinant +ratiocinate +ratiocination +ratiocinative +ratiocinator +ratiocinatory +ratiometer +ration +rationable +rationably +rational +rationale +rationalism +rationalist +rationalistic +rationalistical +rationalistically +rationalisticism +rationality +rationalizable +rationalization +rationalize +rationalizer +rationally +rationalness +rationate +rationless +rationment +Ratitae +ratite +ratitous +ratlike +ratline +ratliner +ratoon +ratooner +ratproof +ratsbane +ratskeller +rattage +rattail +rattan +ratteen +ratten +rattener +ratter +rattery +ratti +rattinet +rattish +rattle +rattlebag +rattlebones +rattlebox +rattlebrain +rattlebrained +rattlebush +rattled +rattlehead +rattleheaded +rattlejack +rattlemouse +rattlenut +rattlepate +rattlepated +rattlepod +rattleproof +rattler +rattleran +rattleroot +rattlertree +rattles +rattleskull +rattleskulled +rattlesnake +rattlesome +rattletrap +rattleweed +rattlewort +rattling +rattlingly +rattlingness +rattly +ratton +rattoner +rattrap +Rattus +ratty +ratwa +ratwood +raucid +raucidity +raucity +raucous +raucously +raucousness +raught +raugrave +rauk +raukle +Raul +rauli +raun +raunge +raupo +rauque +Rauraci +Raurici +Rauwolfia +ravage +ravagement +ravager +rave +ravehook +raveinelike +ravel +raveler +ravelin +raveling +ravelly +ravelment +ravelproof +raven +Ravenala +ravendom +ravenduck +Ravenelia +ravener +ravenhood +ravening +ravenish +ravenlike +ravenous +ravenously +ravenousness +ravenry +ravens +Ravensara +ravensara +ravenstone +ravenwise +raver +Ravi +ravigote +ravin +ravinate +Ravindran +Ravindranath +ravine +ravined +ravinement +raviney +raving +ravingly +ravioli +ravish +ravishedly +ravisher +ravishing +ravishingly +ravishment +ravison +ravissant +raw +rawboned +rawbones +rawhead +rawhide +rawhider +rawish +rawishness +rawness +rax +Ray +ray +raya +rayage +Rayan +rayed +rayful +rayless +raylessness +raylet +Raymond +rayon +rayonnance +rayonnant +raze +razee +razer +razoo +razor +razorable +razorback +razorbill +razoredge +razorless +razormaker +razormaking +razorman +razorstrop +Razoumofskya +razz +razzia +razzly +re +rea +reaal +reabandon +reabolish +reabolition +reabridge +reabsence +reabsent +reabsolve +reabsorb +reabsorption +reabuse +reacceptance +reaccess +reaccession +reacclimatization +reacclimatize +reaccommodate +reaccompany +reaccomplish +reaccomplishment +reaccord +reaccost +reaccount +reaccredit +reaccrue +reaccumulate +reaccumulation +reaccusation +reaccuse +reaccustom +reacetylation +reach +reachable +reacher +reachieve +reachievement +reaching +reachless +reachy +reacidification +reacidify +reacknowledge +reacknowledgment +reacquaint +reacquaintance +reacquire +reacquisition +react +reactance +reactant +reaction +reactional +reactionally +reactionariness +reactionarism +reactionarist +reactionary +reactionaryism +reactionism +reactionist +reactivate +reactivation +reactive +reactively +reactiveness +reactivity +reactological +reactology +reactor +reactualization +reactualize +reactuate +read +readability +readable +readableness +readably +readapt +readaptability +readaptable +readaptation +readaptive +readaptiveness +readd +readdition +readdress +reader +readerdom +readership +readhere +readhesion +readily +readiness +reading +readingdom +readjourn +readjournment +readjudicate +readjust +readjustable +readjuster +readjustment +readmeasurement +readminister +readmiration +readmire +readmission +readmit +readmittance +readopt +readoption +readorn +readvance +readvancement +readvent +readventure +readvertency +readvertise +readvertisement +readvise +readvocate +ready +reaeration +reaffect +reaffection +reaffiliate +reaffiliation +reaffirm +reaffirmance +reaffirmation +reaffirmer +reafflict +reafford +reafforest +reafforestation +reaffusion +reagency +reagent +reaggravate +reaggravation +reaggregate +reaggregation +reaggressive +reagin +reagitate +reagitation +reagree +reagreement +reak +Real +real +realarm +reales +realest +realgar +realienate +realienation +realign +realignment +realism +realist +realistic +realistically +realisticize +reality +realive +realizability +realizable +realizableness +realizably +realization +realize +realizer +realizing +realizingly +reallegation +reallege +reallegorize +realliance +reallocate +reallocation +reallot +reallotment +reallow +reallowance +reallude +reallusion +really +realm +realmless +realmlet +realness +realter +realteration +realtor +realty +ream +reamage +reamalgamate +reamalgamation +reamass +reambitious +reamend +reamendment +reamer +reamerer +reaminess +reamputation +reamuse +reamy +reanalysis +reanalyze +reanchor +reanimalize +reanimate +reanimation +reanneal +reannex +reannexation +reannotate +reannounce +reannouncement +reannoy +reannoyance +reanoint +reanswer +reanvil +reanxiety +reap +reapable +reapdole +reaper +reapologize +reapology +reapparel +reapparition +reappeal +reappear +reappearance +reappease +reapplaud +reapplause +reappliance +reapplicant +reapplication +reapplier +reapply +reappoint +reappointment +reapportion +reapportionment +reapposition +reappraisal +reappraise +reappraisement +reappreciate +reappreciation +reapprehend +reapprehension +reapproach +reapprobation +reappropriate +reappropriation +reapproval +reapprove +rear +rearbitrate +rearbitration +rearer +reargue +reargument +rearhorse +rearisal +rearise +rearling +rearm +rearmament +rearmost +rearousal +rearouse +rearrange +rearrangeable +rearrangement +rearranger +rearray +rearrest +rearrival +rearrive +rearward +rearwardly +rearwardness +rearwards +reascend +reascendancy +reascendant +reascendency +reascendent +reascension +reascensional +reascent +reascertain +reascertainment +reashlar +reasiness +reask +reason +reasonability +reasonable +reasonableness +reasonably +reasoned +reasonedly +reasoner +reasoning +reasoningly +reasonless +reasonlessly +reasonlessness +reasonproof +reaspire +reassail +reassault +reassay +reassemblage +reassemble +reassembly +reassent +reassert +reassertion +reassertor +reassess +reassessment +reasseverate +reassign +reassignation +reassignment +reassimilate +reassimilation +reassist +reassistance +reassociate +reassociation +reassort +reassortment +reassume +reassumption +reassurance +reassure +reassured +reassuredly +reassurement +reassurer +reassuring +reassuringly +reastiness +reastonish +reastonishment +reastray +reasty +reasy +reattach +reattachment +reattack +reattain +reattainment +reattempt +reattend +reattendance +reattention +reattentive +reattest +reattire +reattract +reattraction +reattribute +reattribution +reatus +reaudit +reauthenticate +reauthentication +reauthorization +reauthorize +reavail +reavailable +reave +reaver +reavoid +reavoidance +reavouch +reavow +reawait +reawake +reawaken +reawakening +reawakenment +reaward +reaware +reb +rebab +reback +rebag +rebait +rebake +rebalance +rebale +reballast +reballot +reban +rebandage +rebanish +rebanishment +rebankrupt +rebankruptcy +rebaptism +rebaptismal +rebaptization +rebaptize +rebaptizer +rebar +rebarbarization +rebarbarize +rebarbative +rebargain +rebase +rebasis +rebatable +rebate +rebateable +rebatement +rebater +rebathe +rebato +rebawl +rebeamer +rebear +rebeat +rebeautify +rebec +Rebecca +Rebeccaism +Rebeccaites +rebeck +rebecome +rebed +rebeg +rebeget +rebeggar +rebegin +rebeginner +rebeginning +rebeguile +rebehold +Rebekah +rebel +rebeldom +rebelief +rebelieve +rebeller +rebellike +rebellion +rebellious +rebelliously +rebelliousness +rebellow +rebelly +rebelong +rebelove +rebelproof +rebemire +rebend +rebenediction +rebenefit +rebeset +rebesiege +rebestow +rebestowal +rebetake +rebetray +rebewail +rebia +rebias +rebid +rebill +rebillet +rebilling +rebind +rebirth +rebite +reblade +reblame +reblast +rebleach +reblend +rebless +reblock +rebloom +reblossom +reblot +reblow +reblue +rebluff +reblunder +reboant +reboantic +reboard +reboast +rebob +reboil +reboiler +reboise +reboisement +rebold +rebolt +rebone +rebook +rebop +rebore +reborn +reborrow +rebottle +Reboulia +rebounce +rebound +reboundable +rebounder +reboundingness +rebourbonize +rebox +rebrace +rebraid +rebranch +rebrand +rebrandish +rebreathe +rebreed +rebrew +rebribe +rebrick +rebridge +rebring +rebringer +rebroach +rebroadcast +rebronze +rebrown +rebrush +rebrutalize +rebubble +rebuckle +rebud +rebudget +rebuff +rebuffable +rebuffably +rebuffet +rebuffproof +rebuild +rebuilder +rebuilt +rebukable +rebuke +rebukeable +rebukeful +rebukefully +rebukefulness +rebukeproof +rebuker +rebukingly +rebulk +rebunch +rebundle +rebunker +rebuoy +rebuoyage +reburden +reburgeon +reburial +reburn +reburnish +reburst +rebury +rebus +rebush +rebusy +rebut +rebute +rebutment +rebuttable +rebuttal +rebutter +rebutton +rebuy +recable +recadency +recage +recalcination +recalcine +recalcitrance +recalcitrant +recalcitrate +recalcitration +recalculate +recalculation +recalesce +recalescence +recalescent +recalibrate +recalibration +recalk +recall +recallable +recallist +recallment +recampaign +recancel +recancellation +recandescence +recandidacy +recant +recantation +recanter +recantingly +recanvas +recap +recapacitate +recapitalization +recapitalize +recapitulate +recapitulation +recapitulationist +recapitulative +recapitulator +recapitulatory +recappable +recapper +recaption +recaptivate +recaptivation +recaptor +recapture +recapturer +recarbon +recarbonate +recarbonation +recarbonization +recarbonize +recarbonizer +recarburization +recarburize +recarburizer +recarnify +recarpet +recarriage +recarrier +recarry +recart +recarve +recase +recash +recasket +recast +recaster +recasting +recatalogue +recatch +recaulescence +recausticize +recce +recco +reccy +recede +recedence +recedent +receder +receipt +receiptable +receiptless +receiptor +receipts +receivability +receivable +receivables +receivablness +receival +receive +received +receivedness +receiver +receivership +recelebrate +recelebration +recement +recementation +recency +recense +recension +recensionist +recensor +recensure +recensus +recent +recenter +recently +recentness +recentralization +recentralize +recentre +recept +receptacle +receptacular +receptaculite +Receptaculites +receptaculitid +Receptaculitidae +receptaculitoid +receptaculum +receptant +receptibility +receptible +reception +receptionism +receptionist +receptitious +receptive +receptively +receptiveness +receptivity +receptor +receptoral +receptorial +receptual +receptually +recercelee +recertificate +recertify +recess +recesser +recession +recessional +recessionary +recessive +recessively +recessiveness +recesslike +recessor +Rechabite +Rechabitism +rechafe +rechain +rechal +rechallenge +rechamber +rechange +rechant +rechaos +rechar +recharge +recharter +rechase +rechaser +rechasten +rechaw +recheat +recheck +recheer +recherche +rechew +rechip +rechisel +rechoose +rechristen +rechuck +rechurn +recidivation +recidive +recidivism +recidivist +recidivistic +recidivity +recidivous +recipe +recipiangle +recipience +recipiency +recipiend +recipiendary +recipient +recipiomotor +reciprocable +reciprocal +reciprocality +reciprocalize +reciprocally +reciprocalness +reciprocate +reciprocation +reciprocative +reciprocator +reciprocatory +reciprocitarian +reciprocity +recircle +recirculate +recirculation +recision +recission +recissory +recitable +recital +recitalist +recitatif +recitation +recitationalism +recitationist +recitative +recitatively +recitativical +recitativo +recite +recitement +reciter +recivilization +recivilize +reck +reckla +reckless +recklessly +recklessness +reckling +reckon +reckonable +reckoner +reckoning +reclaim +reclaimable +reclaimableness +reclaimably +reclaimant +reclaimer +reclaimless +reclaimment +reclama +reclamation +reclang +reclasp +reclass +reclassification +reclassify +reclean +recleaner +recleanse +reclear +reclearance +reclimb +reclinable +reclinate +reclinated +reclination +recline +recliner +reclose +reclothe +reclothing +recluse +reclusely +recluseness +reclusery +reclusion +reclusive +reclusiveness +reclusory +recoach +recoagulation +recoal +recoast +recoat +recock +recoct +recoction +recode +recodification +recodify +recogitate +recogitation +recognition +recognitive +recognitor +recognitory +recognizability +recognizable +recognizably +recognizance +recognizant +recognize +recognizedly +recognizee +recognizer +recognizingly +recognizor +recognosce +recohabitation +recoil +recoiler +recoilingly +recoilment +recoin +recoinage +recoiner +recoke +recollapse +recollate +recollation +Recollect +recollectable +recollected +recollectedly +recollectedness +recollectible +recollection +recollective +recollectively +recollectiveness +Recollet +recolonization +recolonize +recolor +recomb +recombination +recombine +recomember +recomfort +recommand +recommence +recommencement +recommencer +recommend +recommendability +recommendable +recommendableness +recommendably +recommendation +recommendatory +recommendee +recommender +recommission +recommit +recommitment +recommittal +recommunicate +recommunion +recompact +recompare +recomparison +recompass +recompel +recompensable +recompensate +recompensation +recompense +recompenser +recompensive +recompete +recompetition +recompetitor +recompilation +recompile +recompilement +recomplain +recomplaint +recomplete +recompletion +recompliance +recomplicate +recomplication +recomply +recompose +recomposer +recomposition +recompound +recomprehend +recomprehension +recompress +recompression +recomputation +recompute +recon +reconceal +reconcealment +reconcede +reconceive +reconcentrate +reconcentration +reconception +reconcert +reconcession +reconcilability +reconcilable +reconcilableness +reconcilably +reconcile +reconcilee +reconcileless +reconcilement +reconciler +reconciliability +reconciliable +reconciliate +reconciliation +reconciliative +reconciliator +reconciliatory +reconciling +reconcilingly +reconclude +reconclusion +reconcoct +reconcrete +reconcur +recondemn +recondemnation +recondensation +recondense +recondite +reconditely +reconditeness +recondition +recondole +reconduct +reconduction +reconfer +reconfess +reconfide +reconfine +reconfinement +reconfirm +reconfirmation +reconfiscate +reconfiscation +reconform +reconfound +reconfront +reconfuse +reconfusion +recongeal +recongelation +recongest +recongestion +recongratulate +recongratulation +reconjoin +reconjunction +reconnaissance +reconnect +reconnection +reconnoissance +reconnoiter +reconnoiterer +reconnoiteringly +reconnoitre +reconnoitrer +reconnoitringly +reconquer +reconqueror +reconquest +reconsecrate +reconsecration +reconsent +reconsider +reconsideration +reconsign +reconsignment +reconsole +reconsolidate +reconsolidation +reconstituent +reconstitute +reconstitution +reconstruct +reconstructed +reconstruction +reconstructional +reconstructionary +reconstructionist +reconstructive +reconstructiveness +reconstructor +reconstrue +reconsult +reconsultation +recontact +recontemplate +recontemplation +recontend +recontest +recontinuance +recontinue +recontract +recontraction +recontrast +recontribute +recontribution +recontrivance +recontrive +recontrol +reconvalesce +reconvalescence +reconvalescent +reconvene +reconvention +reconventional +reconverge +reconverse +reconversion +reconvert +reconvertible +reconvey +reconveyance +reconvict +reconviction +reconvince +reconvoke +recook +recool +recooper +recopper +recopy +recopyright +record +recordable +recordant +recordation +recordative +recordatively +recordatory +recordedly +recorder +recordership +recording +recordist +recordless +recork +recorporification +recorporify +recorrect +recorrection +recorrupt +recorruption +recostume +recounsel +recount +recountable +recountal +recountenance +recounter +recountless +recoup +recoupable +recouper +recouple +recoupment +recourse +recover +recoverability +recoverable +recoverableness +recoverance +recoveree +recoverer +recoveringly +recoverless +recoveror +recovery +recramp +recrank +recrate +recreance +recreancy +recreant +recreantly +recreantness +recrease +recreate +recreation +recreational +recreationist +recreative +recreatively +recreativeness +recreator +recreatory +recredit +recrement +recremental +recrementitial +recrementitious +recrescence +recrew +recriminate +recrimination +recriminative +recriminator +recriminatory +recriticize +recroon +recrop +recross +recrowd +recrown +recrucify +recrudency +recrudesce +recrudescence +recrudescency +recrudescent +recruit +recruitable +recruitage +recruital +recruitee +recruiter +recruithood +recruiting +recruitment +recruity +recrush +recrusher +recrystallization +recrystallize +rect +recta +rectal +rectalgia +rectally +rectangle +rectangled +rectangular +rectangularity +rectangularly +rectangularness +rectangulate +rectangulometer +rectectomy +recti +rectifiable +rectification +rectificative +rectificator +rectificatory +rectified +rectifier +rectify +rectigrade +Rectigraph +rectilineal +rectilineally +rectilinear +rectilinearism +rectilinearity +rectilinearly +rectilinearness +rectilineation +rectinerved +rection +rectipetality +rectirostral +rectischiac +rectiserial +rectitic +rectitis +rectitude +rectitudinous +recto +rectoabdominal +rectocele +rectoclysis +rectococcygeal +rectococcygeus +rectocolitic +rectocolonic +rectocystotomy +rectogenital +rectopexy +rectoplasty +rector +rectoral +rectorate +rectoress +rectorial +rectorrhaphy +rectorship +rectory +rectoscope +rectoscopy +rectosigmoid +rectostenosis +rectostomy +rectotome +rectotomy +rectovaginal +rectovesical +rectress +rectricial +rectrix +rectum +rectus +recubant +recubate +recultivate +recultivation +recumbence +recumbency +recumbent +recumbently +recuperability +recuperance +recuperate +recuperation +recuperative +recuperativeness +recuperator +recuperatory +recur +recure +recureful +recureless +recurl +recurrence +recurrency +recurrent +recurrently +recurrer +recurring +recurringly +recurse +recursion +recursive +recurtain +recurvant +recurvate +recurvation +recurvature +recurve +Recurvirostra +recurvirostral +Recurvirostridae +recurvopatent +recurvoternate +recurvous +recusance +recusancy +recusant +recusation +recusative +recusator +recuse +recushion +recussion +recut +recycle +Red +red +redact +redaction +redactional +redactor +redactorial +redamage +redamnation +redan +redare +redargue +redargution +redargutive +redargutory +redarken +redarn +redart +redate +redaub +redawn +redback +redbait +redbeard +redbelly +redberry +redbill +redbird +redbone +redbreast +redbrush +redbuck +redbud +redcap +redcoat +redd +redden +reddendo +reddendum +reddening +redder +redding +reddingite +reddish +reddishness +reddition +reddleman +reddock +reddsman +reddy +rede +redeal +redebate +redebit +redeceive +redecide +redecimate +redecision +redeck +redeclaration +redeclare +redecline +redecorate +redecoration +redecrease +redecussate +rededicate +rededication +rededicatory +rededuct +rededuction +redeed +redeem +redeemability +redeemable +redeemableness +redeemably +redeemer +redeemeress +redeemership +redeemless +redefault +redefeat +redefecate +redefer +redefiance +redefine +redefinition +redeflect +redefy +redeify +redelay +redelegate +redelegation +redeliberate +redeliberation +redeliver +redeliverance +redeliverer +redelivery +redemand +redemandable +redemise +redemolish +redemonstrate +redemonstration +redemptible +Redemptine +redemption +redemptional +redemptioner +Redemptionist +redemptionless +redemptive +redemptively +redemptor +redemptorial +Redemptorist +redemptory +redemptress +redemptrice +redenigrate +redeny +redepend +redeploy +redeployment +redeposit +redeposition +redepreciate +redepreciation +redeprive +rederivation +redescend +redescent +redescribe +redescription +redesertion +redeserve +redesign +redesignate +redesignation +redesire +redesirous +redesman +redespise +redetect +redetention +redetermination +redetermine +redevelop +redeveloper +redevelopment +redevise +redevote +redevotion +redeye +redfin +redfinch +redfish +redfoot +redhead +redheaded +redheadedly +redheadedness +redhearted +redhibition +redhibitory +redhoop +redia +redictate +redictation +redient +redifferentiate +redifferentiation +redig +redigest +redigestion +rediminish +redingote +redintegrate +redintegration +redintegrative +redintegrator +redip +redipper +redirect +redirection +redisable +redisappear +redisburse +redisbursement +redischarge +rediscipline +rediscount +rediscourage +rediscover +rediscoverer +rediscovery +rediscuss +rediscussion +redisembark +redismiss +redispatch +redispel +redisperse +redisplay +redispose +redisposition +redispute +redissect +redissection +redisseise +redisseisin +redisseisor +redisseize +redisseizin +redisseizor +redissoluble +redissolution +redissolvable +redissolve +redistend +redistill +redistillation +redistiller +redistinguish +redistrain +redistrainer +redistribute +redistributer +redistribution +redistributive +redistributor +redistributory +redistrict +redisturb +redive +rediversion +redivert +redivertible +redivide +redivision +redivive +redivivous +redivivus +redivorce +redivorcement +redivulge +redivulgence +redjacket +redknees +redleg +redlegs +redly +redmouth +redness +redo +redock +redocket +redolence +redolency +redolent +redolently +redominate +redondilla +redoom +redouble +redoublement +redoubler +redoubling +redoubt +redoubtable +redoubtableness +redoubtably +redoubted +redound +redowa +redox +redpoll +redraft +redrag +redrape +redraw +redrawer +redream +redredge +redress +redressable +redressal +redresser +redressible +redressive +redressless +redressment +redressor +redrill +redrive +redroot +redry +redsear +redshank +redshirt +redskin +redstart +redstreak +redtab +redtail +redthroat +redtop +redub +redubber +reduce +reduceable +reduceableness +reduced +reducement +reducent +reducer +reducibility +reducible +reducibleness +reducibly +reducing +reduct +reductant +reductase +reductibility +reduction +reductional +reductionism +reductionist +reductionistic +reductive +reductively +reductor +reductorial +redue +Redunca +redundance +redundancy +redundant +redundantly +reduplicate +reduplication +reduplicative +reduplicatively +reduplicatory +reduplicature +reduviid +Reduviidae +reduvioid +Reduvius +redux +redward +redware +redweed +redwing +redwithe +redwood +redye +Ree +ree +reechy +reed +reedbird +reedbuck +reedbush +reeded +reeden +reeder +reediemadeasy +reedily +reediness +reeding +reedish +reedition +reedless +reedlike +reedling +reedmaker +reedmaking +reedman +reedplot +reedwork +reedy +reef +reefable +reefer +reefing +reefy +reek +reeker +reekingly +reeky +reel +reelable +reeled +reeler +reelingly +reelrall +reem +reeming +reemish +reen +reenge +reeper +Rees +reese +reeshle +reesk +reesle +reest +reester +reestle +reesty +reet +reetam +reetle +reeve +reeveland +reeveship +ref +reface +refacilitate +refall +refallow +refan +refascinate +refascination +refashion +refashioner +refashionment +refasten +refathered +refavor +refect +refection +refectionary +refectioner +refective +refectorarian +refectorary +refectorer +refectorial +refectorian +refectory +refederate +refeed +refeel +refeign +refel +refence +refer +referable +referee +reference +referenda +referendal +referendary +referendaryship +referendum +referent +referential +referentially +referently +referment +referral +referrer +referrible +referribleness +refertilization +refertilize +refetch +refight +refigure +refill +refillable +refilm +refilter +refinable +refinage +refinance +refind +refine +refined +refinedly +refinedness +refinement +refiner +refinery +refinger +refining +refiningly +refinish +refire +refit +refitment +refix +refixation +refixture +reflag +reflagellate +reflame +reflash +reflate +reflation +reflationism +reflect +reflectance +reflected +reflectedly +reflectedness +reflectent +reflecter +reflectibility +reflectible +reflecting +reflectingly +reflection +reflectional +reflectionist +reflectionless +reflective +reflectively +reflectiveness +reflectivity +reflectometer +reflectometry +reflector +reflectoscope +refledge +reflee +reflex +reflexed +reflexibility +reflexible +reflexism +reflexive +reflexively +reflexiveness +reflexivity +reflexly +reflexness +reflexogenous +reflexological +reflexologist +reflexology +refling +refloat +refloatation +reflog +reflood +refloor +reflorescence +reflorescent +reflourish +reflourishment +reflow +reflower +refluctuation +refluence +refluency +refluent +reflush +reflux +refluxed +refly +refocillate +refocillation +refocus +refold +refoment +refont +refool +refoot +reforbid +reforce +reford +reforecast +reforest +reforestation +reforestization +reforestize +reforestment +reforfeit +reforfeiture +reforge +reforger +reforget +reforgive +reform +reformability +reformable +reformableness +reformado +reformandum +Reformati +reformation +reformational +reformationary +reformationist +reformative +reformatively +reformatness +reformatory +reformed +reformedly +reformer +reformeress +reformingly +reformism +reformist +reformistic +reformproof +reformulate +reformulation +reforsake +refortification +refortify +reforward +refound +refoundation +refounder +refract +refractable +refracted +refractedly +refractedness +refractile +refractility +refracting +refraction +refractional +refractionate +refractionist +refractive +refractively +refractiveness +refractivity +refractometer +refractometric +refractometry +refractor +refractorily +refractoriness +refractory +refracture +refragability +refragable +refragableness +refrain +refrainer +refrainment +reframe +refrangent +refrangibility +refrangible +refrangibleness +refreeze +refrenation +refrenzy +refresh +refreshant +refreshen +refreshener +refresher +refreshful +refreshfully +refreshing +refreshingly +refreshingness +refreshment +refrigerant +refrigerate +refrigerating +refrigeration +refrigerative +refrigerator +refrigeratory +refrighten +refringence +refringency +refringent +refront +refrustrate +reft +refuel +refueling +refuge +refugee +refugeeism +refugeeship +refulge +refulgence +refulgency +refulgent +refulgently +refulgentness +refunction +refund +refunder +refundment +refurbish +refurbishment +refurl +refurnish +refurnishment +refusable +refusal +refuse +refuser +refusing +refusingly +refusion +refusive +refutability +refutable +refutably +refutal +refutation +refutative +refutatory +refute +refuter +reg +regain +regainable +regainer +regainment +regal +regale +Regalecidae +Regalecus +regalement +regaler +regalia +regalian +regalism +regalist +regality +regalize +regallop +regally +regalness +regalvanization +regalvanize +regard +regardable +regardance +regardancy +regardant +regarder +regardful +regardfully +regardfulness +regarding +regardless +regardlessly +regardlessness +regarment +regarnish +regarrison +regather +regatta +regauge +regelate +regelation +regency +regeneracy +regenerance +regenerant +regenerate +regenerateness +regeneration +regenerative +regeneratively +regenerator +regeneratory +regeneratress +regeneratrix +regenesis +regent +regental +regentess +regentship +regerminate +regermination +reges +reget +Regga +Reggie +regia +regicidal +regicide +regicidism +regift +regifuge +regild +regill +regime +regimen +regimenal +regiment +regimental +regimentaled +regimentalled +regimentally +regimentals +regimentary +regimentation +regiminal +regin +reginal +Reginald +region +regional +regionalism +regionalist +regionalistic +regionalization +regionalize +regionally +regionary +regioned +register +registered +registerer +registership +registrability +registrable +registral +registrant +registrar +registrarship +registrary +registrate +registration +registrational +registrationist +registrator +registrer +registry +regive +regladden +reglair +reglaze +regle +reglement +reglementary +reglementation +reglementist +reglet +reglorified +regloss +reglove +reglow +reglue +regma +regmacarp +regnal +regnancy +regnant +regnerable +regolith +regorge +regovern +regradation +regrade +regraduate +regraduation +regraft +regrant +regrasp +regrass +regrate +regrater +regratification +regratify +regrating +regratingly +regrator +regratress +regravel +regrede +regreen +regreet +regress +regression +regressionist +regressive +regressively +regressiveness +regressivity +regressor +regret +regretful +regretfully +regretfulness +regretless +regrettable +regrettableness +regrettably +regretter +regrettingly +regrind +regrinder +regrip +regroup +regroupment +regrow +regrowth +reguarantee +reguard +reguardant +reguide +regula +regulable +regular +Regulares +Regularia +regularity +regularization +regularize +regularizer +regularly +regularness +regulatable +regulate +regulated +regulation +regulationist +regulative +regulatively +regulator +regulatorship +regulatory +regulatress +regulatris +reguli +reguline +regulize +Regulus +regulus +regur +regurge +regurgitant +regurgitate +regurgitation +regush +reh +rehabilitate +rehabilitation +rehabilitative +rehair +rehale +rehallow +rehammer +rehandicap +rehandle +rehandler +rehandling +rehang +rehappen +reharden +reharm +reharmonize +reharness +reharrow +reharvest +rehash +rehaul +rehazard +rehead +reheal +reheap +rehear +rehearing +rehearsal +rehearse +rehearser +rehearten +reheat +reheater +Reheboth +rehedge +reheel +reheighten +Rehoboam +Rehoboth +Rehobothan +rehoe +rehoist +rehollow +rehonor +rehonour +rehood +rehook +rehoop +rehouse +rehumanize +rehumble +rehumiliate +rehumiliation +rehung +rehybridize +rehydrate +rehydration +rehypothecate +rehypothecation +rehypothecator +reichsgulden +Reichsland +Reichslander +reichsmark +reichspfennig +reichstaler +Reid +reidentification +reidentify +reif +reification +reify +reign +reignite +reignition +reignore +reillume +reilluminate +reillumination +reillumine +reillustrate +reillustration +reim +reimage +reimagination +reimagine +reimbark +reimbarkation +reimbibe +reimbody +reimbursable +reimburse +reimbursement +reimburser +reimbush +reimbushment +reimkennar +reimmerge +reimmerse +reimmersion +reimmigrant +reimmigration +reimpact +reimpark +reimpart +reimpatriate +reimpatriation +reimpel +reimplant +reimplantation +reimply +reimport +reimportation +reimportune +reimpose +reimposition +reimposure +reimpregnate +reimpress +reimpression +reimprint +reimprison +reimprisonment +reimprove +reimprovement +reimpulse +rein +reina +reinability +reinaugurate +reinauguration +reincapable +reincarnadine +reincarnate +reincarnation +reincarnationism +reincarnationist +reincense +reincentive +reincidence +reincidency +reincite +reinclination +reincline +reinclude +reinclusion +reincorporate +reincorporation +reincrease +reincrudate +reincrudation +reinculcate +reincur +reindebted +reindebtedness +reindeer +reindependence +reindicate +reindication +reindict +reindictment +reindifferent +reindorse +reinduce +reinducement +reindue +reindulge +reindulgence +Reiner +reinette +reinfect +reinfection +reinfectious +reinfer +reinfest +reinfestation +reinflame +reinflate +reinflation +reinflict +reinfliction +reinfluence +reinforce +reinforcement +reinforcer +reinform +reinfuse +reinfusion +reingraft +reingratiate +reingress +reinhabit +reinhabitation +Reinhard +reinherit +reinitiate +reinitiation +reinject +reinjure +reinless +reinoculate +reinoculation +reinquire +reinquiry +reins +reinsane +reinsanity +reinscribe +reinsert +reinsertion +reinsist +reinsman +reinspect +reinspection +reinspector +reinsphere +reinspiration +reinspire +reinspirit +reinstall +reinstallation +reinstallment +reinstalment +reinstate +reinstatement +reinstation +reinstator +reinstauration +reinstil +reinstill +reinstitute +reinstitution +reinstruct +reinstruction +reinsult +reinsurance +reinsure +reinsurer +reintegrate +reintegration +reintend +reinter +reintercede +reintercession +reinterchange +reinterest +reinterfere +reinterference +reinterment +reinterpret +reinterpretation +reinterrogate +reinterrogation +reinterrupt +reinterruption +reintervene +reintervention +reinterview +reinthrone +reintimate +reintimation +reintitule +reintrench +reintroduce +reintroduction +reintrude +reintrusion +reintuition +reintuitive +reinvade +reinvasion +reinvent +reinvention +reinventor +reinversion +reinvert +reinvest +reinvestigate +reinvestigation +reinvestiture +reinvestment +reinvigorate +reinvigoration +reinvitation +reinvite +reinvoice +reinvolve +Reinwardtia +reirrigate +reirrigation +reis +reisolation +reissuable +reissue +reissuement +reissuer +reit +reitbok +reitbuck +reitemize +reiter +reiterable +reiterance +reiterant +reiterate +reiterated +reiteratedly +reiteratedness +reiteration +reiterative +reiteratively +reiver +rejail +Rejang +reject +rejectable +rejectableness +rejectage +rejectamenta +rejecter +rejectingly +rejection +rejective +rejectment +rejector +rejerk +rejoice +rejoiceful +rejoicement +rejoicer +rejoicing +rejoicingly +rejoin +rejoinder +rejolt +rejourney +rejudge +rejumble +rejunction +rejustification +rejustify +rejuvenant +rejuvenate +rejuvenation +rejuvenative +rejuvenator +rejuvenesce +rejuvenescence +rejuvenescent +rejuvenize +Reki +rekick +rekill +rekindle +rekindlement +rekindler +reking +rekiss +reknit +reknow +rel +relabel +relace +relacquer +relade +reladen +relais +relament +relamp +reland +relap +relapper +relapsable +relapse +relapseproof +relapser +relapsing +relast +relaster +relata +relatability +relatable +relatch +relate +related +relatedness +relater +relatinization +relation +relational +relationality +relationally +relationary +relationism +relationist +relationless +relationship +relatival +relative +relatively +relativeness +relativism +relativist +relativistic +relativity +relativization +relativize +relator +relatrix +relatum +relaunch +relax +relaxable +relaxant +relaxation +relaxative +relaxatory +relaxed +relaxedly +relaxedness +relaxer +relay +relayman +relbun +relead +releap +relearn +releasable +release +releasee +releasement +releaser +releasor +releather +relection +relegable +relegate +relegation +relend +relent +relenting +relentingly +relentless +relentlessly +relentlessness +relentment +relessee +relessor +relet +reletter +relevance +relevancy +relevant +relevantly +relevate +relevation +relevator +relevel +relevy +reliability +reliable +reliableness +reliably +reliance +reliant +reliantly +reliberate +relic +relicary +relicense +relick +reliclike +relicmonger +relict +relicted +reliction +relief +reliefless +relier +relievable +relieve +relieved +relievedly +reliever +relieving +relievingly +relievo +relift +religate +religation +relight +relightable +relighten +relightener +relighter +religion +religionary +religionate +religioner +religionism +religionist +religionistic +religionize +religionless +religiose +religiosity +religious +religiously +religiousness +relime +relimit +relimitation +reline +reliner +relink +relinquent +relinquish +relinquisher +relinquishment +reliquaire +reliquary +reliquefy +reliquiae +reliquian +reliquidate +reliquidation +reliquism +relish +relishable +relisher +relishing +relishingly +relishsome +relishy +relist +relisten +relitigate +relive +Rellyan +Rellyanism +Rellyanite +reload +reloan +relocable +relocate +relocation +relocator +relock +relodge +relook +relose +relost +relot +relove +relower +relucent +reluct +reluctance +reluctancy +reluctant +reluctantly +reluctate +reluctation +reluctivity +relume +relumine +rely +remade +remagnetization +remagnetize +remagnification +remagnify +remail +remain +remainder +remainderman +remaindership +remainer +remains +remaintain +remaintenance +remake +remaker +reman +remanage +remanagement +remanation +remancipate +remancipation +remand +remandment +remanence +remanency +remanent +remanet +remanipulate +remanipulation +remantle +remanufacture +remanure +remap +remarch +remargin +remark +remarkability +remarkable +remarkableness +remarkably +remarkedly +remarker +remarket +remarque +remarriage +remarry +remarshal +remask +remass +remast +remasticate +remastication +rematch +rematerialize +remble +Rembrandt +Rembrandtesque +Rembrandtish +Rembrandtism +remeant +remeasure +remeasurement +remede +remediable +remediableness +remediably +remedial +remedially +remediation +remediless +remedilessly +remedilessness +remeditate +remeditation +remedy +remeet +remelt +remember +rememberability +rememberable +rememberably +rememberer +remembrance +remembrancer +remembrancership +rememorize +remenace +remend +remerge +remetal +remex +Remi +remica +remicate +remication +remicle +remiform +remigate +remigation +remiges +remigial +remigrant +remigrate +remigration +Remijia +remilitarization +remilitarize +remill +remimic +remind +remindal +reminder +remindful +remindingly +remineralization +remineralize +remingle +reminisce +reminiscence +reminiscenceful +reminiscencer +reminiscency +reminiscent +reminiscential +reminiscentially +reminiscently +reminiscer +reminiscitory +remint +remiped +remirror +remise +remisrepresent +remisrepresentation +remiss +remissful +remissibility +remissible +remissibleness +remission +remissive +remissively +remissiveness +remissly +remissness +remissory +remisunderstand +remit +remitment +remittable +remittal +remittance +remittancer +remittee +remittence +remittency +remittent +remittently +remitter +remittitur +remittor +remix +remixture +remnant +remnantal +remobilization +remobilize +Remoboth +remock +remodel +remodeler +remodeller +remodelment +remodification +remodify +remolade +remold +remollient +remonetization +remonetize +remonstrance +remonstrant +remonstrantly +remonstrate +remonstrating +remonstratingly +remonstration +remonstrative +remonstratively +remonstrator +remonstratory +remontado +remontant +remontoir +remop +remora +remord +remorse +remorseful +remorsefully +remorsefulness +remorseless +remorselessly +remorselessness +remorseproof +remortgage +remote +remotely +remoteness +remotion +remotive +remould +remount +removability +removable +removableness +removably +removal +remove +removed +removedly +removedness +removement +remover +removing +remultiplication +remultiply +remunerability +remunerable +remunerably +remunerate +remuneration +remunerative +remuneratively +remunerativeness +remunerator +remuneratory +remurmur +Remus +remuster +remutation +renable +renably +renail +Renaissance +renaissance +Renaissancist +Renaissant +renal +rename +Renardine +renascence +renascency +renascent +renascible +renascibleness +renature +renavigate +renavigation +rencontre +rencounter +renculus +rend +render +renderable +renderer +rendering +renderset +rendezvous +rendibility +rendible +rendition +rendlewood +rendrock +rendzina +reneague +Renealmia +renecessitate +reneg +renegade +renegadism +renegado +renegation +renege +reneger +reneglect +renegotiable +renegotiate +renegotiation +renegotiations +renegue +renerve +renes +renet +renew +renewability +renewable +renewably +renewal +renewedly +renewedness +renewer +renewment +renicardiac +renickel +renidification +renidify +reniform +Renilla +Renillidae +renin +renipericardial +reniportal +renipuncture +renish +renishly +renitence +renitency +renitent +renk +renky +renne +rennet +renneting +rennin +renniogen +renocutaneous +renogastric +renography +renointestinal +renominate +renomination +renopericardial +renopulmonary +renormalize +renotation +renotice +renotification +renotify +renounce +renounceable +renouncement +renouncer +renourish +renovate +renovater +renovatingly +renovation +renovative +renovator +renovatory +renovize +renown +renowned +renownedly +renownedness +renowner +renownful +renownless +rensselaerite +rent +rentability +rentable +rentage +rental +rentaler +rentaller +rented +rentee +renter +rentless +rentrant +rentrayeuse +Renu +renumber +renumerate +renumeration +renunciable +renunciance +renunciant +renunciate +renunciation +renunciative +renunciator +renunciatory +renunculus +renverse +renvoi +renvoy +reobject +reobjectivization +reobjectivize +reobligate +reobligation +reoblige +reobscure +reobservation +reobserve +reobtain +reobtainable +reobtainment +reoccasion +reoccupation +reoccupy +reoccur +reoccurrence +reoffend +reoffense +reoffer +reoffset +reoil +reometer +reomission +reomit +reopen +reoperate +reoperation +reoppose +reopposition +reoppress +reoppression +reorchestrate +reordain +reorder +reordinate +reordination +reorganization +reorganizationist +reorganize +reorganizer +reorient +reorientation +reornament +reoutfit +reoutline +reoutput +reoutrage +reovercharge +reoverflow +reovertake +reoverwork +reown +reoxidation +reoxidize +reoxygenate +reoxygenize +rep +repace +repacification +repacify +repack +repackage +repacker +repaganization +repaganize +repaganizer +repage +repaint +repair +repairable +repairableness +repairer +repairman +repale +repand +repandly +repandodentate +repandodenticulate +repandolobate +repandous +repandousness +repanel +repaper +reparability +reparable +reparably +reparagraph +reparate +reparation +reparative +reparatory +repark +repartable +repartake +repartee +reparticipate +reparticipation +repartition +repartitionable +repass +repassable +repassage +repasser +repast +repaste +repasture +repatch +repatency +repatent +repatriable +repatriate +repatriation +repatronize +repattern +repave +repavement +repawn +repay +repayable +repayal +repaying +repayment +repeal +repealability +repealable +repealableness +repealer +repealist +repealless +repeat +repeatability +repeatable +repeatal +repeated +repeatedly +repeater +repeg +repel +repellance +repellant +repellence +repellency +repellent +repellently +repeller +repelling +repellingly +repellingness +repen +repenetrate +repension +repent +repentable +repentance +repentant +repentantly +repenter +repentingly +repeople +reperceive +repercept +reperception +repercolation +repercuss +repercussion +repercussive +repercussively +repercussiveness +repercutient +reperform +reperformance +reperfume +reperible +repermission +repermit +reperplex +repersonalization +repersonalize +repersuade +repersuasion +repertoire +repertorial +repertorily +repertorium +repertory +reperusal +reperuse +repetend +repetition +repetitional +repetitionary +repetitious +repetitiously +repetitiousness +repetitive +repetitively +repetitiveness +repetitory +repetticoat +repew +Rephael +rephase +rephonate +rephosphorization +rephosphorize +rephotograph +rephrase +repic +repick +repicture +repiece +repile +repin +repine +repineful +repinement +repiner +repiningly +repipe +repique +repitch +repkie +replace +replaceability +replaceable +replacement +replacer +replait +replan +replane +replant +replantable +replantation +replanter +replaster +replate +replay +replead +repleader +repleat +repledge +repledger +replenish +replenisher +replenishingly +replenishment +replete +repletely +repleteness +repletion +repletive +repletively +repletory +repleviable +replevin +replevisable +replevisor +replevy +repliant +replica +replicate +replicated +replicatile +replication +replicative +replicatively +replicatory +replier +replight +replod +replot +replotment +replotter +replough +replow +replum +replume +replunder +replunge +reply +replyingly +repocket +repoint +repolish +repoll +repollute +repolon +repolymerization +repolymerize +reponder +repone +repope +repopulate +repopulation +report +reportable +reportage +reportedly +reporter +reporteress +reporterism +reportership +reportingly +reportion +reportorial +reportorially +reposal +repose +reposed +reposedly +reposedness +reposeful +reposefully +reposefulness +reposer +reposit +repositary +reposition +repositor +repository +repossess +repossession +repossessor +repost +repostpone +repot +repound +repour +repowder +repp +repped +repractice +repray +repreach +reprecipitate +reprecipitation +repredict +reprefer +reprehend +reprehendable +reprehendatory +reprehender +reprehensibility +reprehensible +reprehensibleness +reprehensibly +reprehension +reprehensive +reprehensively +reprehensory +repreparation +reprepare +represcribe +represent +representability +representable +representamen +representant +representation +representational +representationalism +representationalist +representationary +representationism +representationist +representative +representatively +representativeness +representativeship +representativity +representer +representment +represide +repress +repressed +repressedly +represser +repressible +repressibly +repression +repressionary +repressionist +repressive +repressively +repressiveness +repressment +repressor +repressory +repressure +reprice +reprieval +reprieve +repriever +reprimand +reprimander +reprimanding +reprimandingly +reprime +reprimer +reprint +reprinter +reprisal +reprisalist +reprise +repristinate +repristination +reprivatization +reprivatize +reprivilege +reproach +reproachable +reproachableness +reproachably +reproacher +reproachful +reproachfully +reproachfulness +reproachingly +reproachless +reproachlessness +reprobacy +reprobance +reprobate +reprobateness +reprobater +reprobation +reprobationary +reprobationer +reprobative +reprobatively +reprobator +reprobatory +reproceed +reprocess +reproclaim +reproclamation +reprocurable +reprocure +reproduce +reproduceable +reproducer +reproducibility +reproducible +reproduction +reproductionist +reproductive +reproductively +reproductiveness +reproductivity +reproductory +reprofane +reprofess +reprohibit +repromise +repromulgate +repromulgation +repronounce +repronunciation +reproof +reproofless +repropagate +repropitiate +repropitiation +reproportion +reproposal +repropose +reprosecute +reprosecution +reprosper +reprotect +reprotection +reprotest +reprovable +reprovableness +reprovably +reproval +reprove +reprover +reprovide +reprovingly +reprovision +reprovocation +reprovoke +reprune +reps +reptant +reptatorial +reptatory +reptile +reptiledom +reptilelike +reptilferous +Reptilia +reptilian +reptiliary +reptiliform +reptilious +reptiliousness +reptilism +reptility +reptilivorous +reptiloid +republic +republican +republicanism +republicanization +republicanize +republicanizer +republication +republish +republisher +republishment +repuddle +repudiable +repudiate +repudiation +repudiationist +repudiative +repudiator +repudiatory +repuff +repugn +repugnable +repugnance +repugnancy +repugnant +repugnantly +repugnantness +repugnate +repugnatorial +repugner +repullulate +repullulation +repullulative +repullulescent +repulpit +repulse +repulseless +repulseproof +repulser +repulsion +repulsive +repulsively +repulsiveness +repulsory +repulverize +repump +repunish +repunishment +repurchase +repurchaser +repurge +repurification +repurify +repurple +repurpose +repursue +repursuit +reputability +reputable +reputableness +reputably +reputation +reputationless +reputative +reputatively +repute +reputed +reputedly +reputeless +requalification +requalify +requarantine +requeen +requench +request +requester +requestion +requiem +Requienia +requiescence +requin +requirable +require +requirement +requirer +requisite +requisitely +requisiteness +requisition +requisitionary +requisitioner +requisitionist +requisitor +requisitorial +requisitory +requit +requitable +requital +requitative +requite +requiteful +requitement +requiter +requiz +requotation +requote +rerack +reracker +reradiation +rerail +reraise +rerake +rerank +rerate +reread +rereader +rerebrace +reredos +reree +rereel +rereeve +rerefief +reregister +reregistration +reregulate +reregulation +rereign +reremouse +rerent +rerental +reresupper +rerig +rering +rerise +rerival +rerivet +rerob +rerobe +reroll +reroof +reroot +rerope +reroute +rerow +reroyalize +rerub +rerummage +rerun +resaca +resack +resacrifice +resaddle +resail +resalable +resale +resalt +resalutation +resalute +resalvage +resample +resanctify +resanction +resatisfaction +resatisfy +resaw +resawer +resawyer +resay +resazurin +rescan +reschedule +rescind +rescindable +rescinder +rescindment +rescissible +rescission +rescissory +rescore +rescramble +rescratch +rescribe +rescript +rescription +rescriptive +rescriptively +rescrub +rescuable +rescue +rescueless +rescuer +reseal +reseam +research +researcher +researchful +researchist +reseat +resecrete +resecretion +resect +resection +resectional +Reseda +reseda +Resedaceae +resedaceous +resee +reseed +reseek +resegment +resegmentation +reseise +reseiser +reseize +reseizer +reseizure +reselect +reselection +reself +resell +reseller +resemblable +resemblance +resemblant +resemble +resembler +resemblingly +reseminate +resend +resene +resensation +resensitization +resensitize +resent +resentationally +resentence +resenter +resentful +resentfullness +resentfully +resentience +resentingly +resentless +resentment +resepulcher +resequent +resequester +resequestration +reserene +reservable +reserval +reservation +reservationist +reservatory +reserve +reserved +reservedly +reservedness +reservee +reserveful +reserveless +reserver +reservery +reservice +reservist +reservoir +reservor +reset +resettable +resetter +resettle +resettlement +resever +resew +resex +resh +reshake +reshape +reshare +resharpen +reshave +reshear +reshearer +resheathe +reshelve +reshift +reshine +reshingle +reship +reshipment +reshipper +reshoe +reshoot +reshoulder +reshovel +reshower +reshrine +reshuffle +reshun +reshunt +reshut +reshuttle +resiccate +reside +residence +residencer +residency +resident +residental +residenter +residential +residentiality +residentially +residentiary +residentiaryship +residentship +resider +residua +residual +residuary +residuation +residue +residuent +residuous +residuum +resift +resigh +resign +resignal +resignatary +resignation +resignationism +resigned +resignedly +resignedness +resignee +resigner +resignful +resignment +resile +resilement +resilial +resiliate +resilience +resiliency +resilient +resilifer +resiliometer +resilition +resilium +resilver +resin +resina +resinaceous +resinate +resinbush +resiner +resinfiable +resing +resinic +resiniferous +resinification +resinifluous +resiniform +resinify +resinize +resink +resinlike +resinoelectric +resinoextractive +resinogenous +resinoid +resinol +resinolic +resinophore +resinosis +resinous +resinously +resinousness +resinovitreous +resiny +resipiscence +resipiscent +resist +resistability +resistable +resistableness +resistance +resistant +resistantly +resister +resistful +resistibility +resistible +resistibleness +resistibly +resisting +resistingly +resistive +resistively +resistiveness +resistivity +resistless +resistlessly +resistlessness +resistor +resitting +resize +resizer +resketch +reskin +reslash +reslate +reslay +reslide +reslot +resmell +resmelt +resmile +resmooth +resnap +resnatch +resnatron +resnub +resoak +resoap +resoften +resoil +resojourn +resolder +resole +resolemnize +resolicit +resolidification +resolidify +resolubility +resoluble +resolubleness +resolute +resolutely +resoluteness +resolution +resolutioner +resolutionist +resolutory +resolvability +resolvable +resolvableness +resolvancy +resolve +resolved +resolvedly +resolvedness +resolvent +resolver +resolvible +resonance +resonancy +resonant +resonantly +resonate +resonator +resonatory +resoothe +resorb +resorbence +resorbent +resorcin +resorcine +resorcinism +resorcinol +resorcinolphthalein +resorcinum +resorcylic +resorption +resorptive +resort +resorter +resorufin +resought +resound +resounder +resounding +resoundingly +resource +resourceful +resourcefully +resourcefulness +resourceless +resourcelessness +resoutive +resow +resp +respace +respade +respan +respangle +resparkle +respeak +respect +respectability +respectabilize +respectable +respectableness +respectably +respectant +respecter +respectful +respectfully +respectfulness +respecting +respective +respectively +respectiveness +respectless +respectlessly +respectlessness +respectworthy +respell +respersive +respin +respirability +respirable +respirableness +respiration +respirational +respirative +respirator +respiratored +respiratorium +respiratory +respire +respirit +respirometer +respite +respiteless +resplend +resplendence +resplendency +resplendent +resplendently +resplice +resplit +respoke +respond +responde +respondence +respondency +respondent +respondentia +responder +responsal +responsary +response +responseless +responser +responsibility +responsible +responsibleness +responsibly +responsion +responsive +responsively +responsiveness +responsivity +responsorial +responsory +respot +respray +respread +respring +resprout +respue +resquare +resqueak +ressaidar +ressala +ressaldar +ressaut +rest +restable +restack +restaff +restain +restainable +restake +restamp +restandardization +restandardize +restant +restart +restate +restatement +restaur +restaurant +restaurate +restaurateur +restauration +restbalk +resteal +resteel +resteep +restem +restep +rester +resterilize +restes +restful +restfully +restfulness +restharrow +resthouse +Restiaceae +restiaceous +restiad +restibrachium +restiff +restiffen +restiffener +restiffness +restifle +restiform +restigmatize +restimulate +restimulation +resting +restingly +Restio +Restionaceae +restionaceous +restipulate +restipulation +restipulatory +restir +restis +restitch +restitute +restitution +restitutionism +restitutionist +restitutive +restitutor +restitutory +restive +restively +restiveness +restless +restlessly +restlessness +restock +restopper +restorable +restorableness +restoral +restoration +restorationer +restorationism +restorationist +restorative +restoratively +restorativeness +restorator +restoratory +restore +restorer +restow +restowal +restproof +restraighten +restrain +restrainability +restrained +restrainedly +restrainedness +restrainer +restraining +restrainingly +restraint +restraintful +restrap +restratification +restream +restrengthen +restress +restretch +restrict +restricted +restrictedly +restrictedness +restriction +restrictionary +restrictionist +restrictive +restrictively +restrictiveness +restrike +restring +restringe +restringency +restringent +restrip +restrive +restroke +restudy +restuff +restward +restwards +resty +restyle +resubject +resubjection +resubjugate +resublimation +resublime +resubmerge +resubmission +resubmit +resubordinate +resubscribe +resubscriber +resubscription +resubstitute +resubstitution +resucceed +resuck +resudation +resue +resuffer +resufferance +resuggest +resuggestion +resuing +resuit +result +resultance +resultancy +resultant +resultantly +resultative +resultful +resultfully +resulting +resultingly +resultive +resultless +resultlessly +resultlessness +resumability +resumable +resume +resumer +resummon +resummons +resumption +resumptive +resumptively +resun +resup +resuperheat +resupervise +resupinate +resupinated +resupination +resupine +resupply +resupport +resuppose +resupposition +resuppress +resuppression +resurface +resurge +resurgence +resurgency +resurgent +resurprise +resurrect +resurrectible +resurrection +resurrectional +resurrectionary +resurrectioner +resurrectioning +resurrectionism +resurrectionist +resurrectionize +resurrective +resurrector +resurrender +resurround +resurvey +resuscitable +resuscitant +resuscitate +resuscitation +resuscitative +resuscitator +resuspect +resuspend +resuspension +reswage +reswallow +resward +reswarm +reswear +resweat +resweep +reswell +reswill +reswim +resyllabification +resymbolization +resymbolize +resynthesis +resynthesize +ret +retable +retack +retackle +retag +retail +retailer +retailment +retailor +retain +retainability +retainable +retainableness +retainal +retainder +retainer +retainership +retaining +retake +retaker +retaliate +retaliation +retaliationist +retaliative +retaliator +retaliatory +retalk +retama +retame +retan +retanner +retape +retard +retardance +retardant +retardate +retardation +retardative +retardatory +retarded +retardence +retardent +retarder +retarding +retardingly +retardive +retardment +retardure +retare +retariff +retaste +retation +retattle +retax +retaxation +retch +reteach +retecious +retelegraph +retelephone +retell +retelling +retem +retemper +retempt +retemptation +retenant +retender +retene +retent +retention +retentionist +retentive +retentively +retentiveness +retentivity +retentor +Retepora +retepore +Reteporidae +retest +retexture +rethank +rethatch +rethaw +rethe +retheness +rethicken +rethink +rethrash +rethread +rethreaten +rethresh +rethresher +rethrill +rethrive +rethrone +rethrow +rethrust +rethunder +retia +retial +Retiariae +retiarian +retiarius +retiary +reticella +reticello +reticence +reticency +reticent +reticently +reticket +reticle +reticula +reticular +Reticularia +reticularian +reticularly +reticulary +reticulate +reticulated +reticulately +reticulation +reticulatocoalescent +reticulatogranulate +reticulatoramose +reticulatovenose +reticule +reticuled +reticulin +reticulitis +reticulocyte +reticulocytosis +reticuloramose +Reticulosa +reticulose +reticulovenose +reticulum +retie +retier +retiform +retighten +retile +retill +retimber +retime +retin +retina +retinacular +retinaculate +retinaculum +retinal +retinalite +retinasphalt +retinasphaltum +retincture +retinene +retinerved +retinian +retinispora +retinite +retinitis +retinize +retinker +retinoblastoma +retinochorioid +retinochorioidal +retinochorioiditis +retinoid +retinol +retinopapilitis +retinophoral +retinophore +retinoscope +retinoscopic +retinoscopically +retinoscopist +retinoscopy +Retinospora +retinue +retinula +retinular +retinule +retip +retiracied +retiracy +retirade +retiral +retire +retired +retiredly +retiredness +retirement +retirer +retiring +retiringly +retiringness +retistene +retoast +retold +retolerate +retoleration +retomb +retonation +retook +retool +retooth +retoother +retort +retortable +retorted +retorter +retortion +retortive +retorture +retoss +retotal +retouch +retoucher +retouching +retouchment +retour +retourable +retrace +retraceable +retracement +retrack +retract +retractability +retractable +retractation +retracted +retractibility +retractible +retractile +retractility +retraction +retractive +retractively +retractiveness +retractor +retrad +retrade +retradition +retrahent +retrain +retral +retrally +retramp +retrample +retranquilize +retranscribe +retranscription +retransfer +retransference +retransfigure +retransform +retransformation +retransfuse +retransit +retranslate +retranslation +retransmission +retransmissive +retransmit +retransmute +retransplant +retransport +retransportation +retravel +retraverse +retraxit +retread +retreat +retreatal +retreatant +retreater +retreatful +retreating +retreatingness +retreative +retreatment +retree +retrench +retrenchable +retrencher +retrenchment +retrial +retribute +retribution +retributive +retributively +retributor +retributory +retricked +retrievability +retrievable +retrievableness +retrievably +retrieval +retrieve +retrieveless +retrievement +retriever +retrieverish +retrim +retrimmer +retrip +retroact +retroaction +retroactive +retroactively +retroactivity +retroalveolar +retroauricular +retrobronchial +retrobuccal +retrobulbar +retrocaecal +retrocardiac +retrocecal +retrocede +retrocedence +retrocedent +retrocervical +retrocession +retrocessional +retrocessionist +retrocessive +retrochoir +retroclavicular +retroclusion +retrocognition +retrocognitive +retrocolic +retroconsciousness +retrocopulant +retrocopulation +retrocostal +retrocouple +retrocoupler +retrocurved +retrodate +retrodeviation +retrodisplacement +retroduction +retrodural +retroesophageal +retroflected +retroflection +retroflex +retroflexed +retroflexion +retroflux +retroform +retrofract +retrofracted +retrofrontal +retrogastric +retrogenerative +retrogradation +retrogradatory +retrograde +retrogradely +retrogradient +retrogradingly +retrogradism +retrogradist +retrogress +retrogression +retrogressionist +retrogressive +retrogressively +retrohepatic +retroinfection +retroinsular +retroiridian +retroject +retrojection +retrojugular +retrolabyrinthine +retrolaryngeal +retrolingual +retrolocation +retromammary +retromammillary +retromandibular +retromastoid +retromaxillary +retromigration +retromingent +retromingently +retromorphosed +retromorphosis +retronasal +retroperitoneal +retroperitoneally +retropharyngeal +retropharyngitis +retroplacental +retroplexed +retroposed +retroposition +retropresbyteral +retropubic +retropulmonary +retropulsion +retropulsive +retroreception +retrorectal +retroreflective +retrorenal +retrorse +retrorsely +retroserrate +retroserrulate +retrospect +retrospection +retrospective +retrospectively +retrospectiveness +retrospectivity +retrosplenic +retrostalsis +retrostaltic +retrosternal +retrosusception +retrot +retrotarsal +retrotemporal +retrothyroid +retrotracheal +retrotransfer +retrotransference +retrotympanic +retrousse +retrovaccinate +retrovaccination +retrovaccine +retroverse +retroversion +retrovert +retrovision +retroxiphoid +retrude +retrue +retrusible +retrusion +retrust +retry +retted +retter +rettery +retting +rettory +retube +retuck +retumble +retumescence +retune +returban +returf +returfer +return +returnability +returnable +returned +returner +returnless +returnlessly +retuse +retwine +retwist +retying +retype +retzian +Reub +Reuben +Reubenites +Reuchlinian +Reuchlinism +Reuel +reundercut +reundergo +reundertake +reundulate +reundulation +reune +reunfold +reunification +reunify +reunion +reunionism +reunionist +reunionistic +reunitable +reunite +reunitedly +reuniter +reunition +reunitive +reunpack +reuphold +reupholster +reuplift +reurge +reuse +reutilization +reutilize +reutter +reutterance +rev +revacate +revaccinate +revaccination +revalenta +revalescence +revalescent +revalidate +revalidation +revalorization +revalorize +revaluate +revaluation +revalue +revamp +revamper +revampment +revaporization +revaporize +revarnish +revary +reve +reveal +revealability +revealable +revealableness +revealed +revealedly +revealer +revealing +revealingly +revealingness +revealment +revegetate +revegetation +revehent +reveil +reveille +revel +revelability +revelant +revelation +revelational +revelationer +revelationist +revelationize +revelative +revelator +revelatory +reveler +revellent +revelly +revelment +revelrout +revelry +revenant +revend +revender +revendicate +revendication +reveneer +revenge +revengeable +revengeful +revengefully +revengefulness +revengeless +revengement +revenger +revengingly +revent +reventilate +reventure +revenual +revenue +revenued +revenuer +rever +reverable +reverb +reverbatory +reverberant +reverberate +reverberation +reverberative +reverberator +reverberatory +reverbrate +reverdure +revere +revered +reverence +reverencer +reverend +reverendly +reverendship +reverent +reverential +reverentiality +reverentially +reverentialness +reverently +reverentness +reverer +reverie +reverification +reverify +reverist +revers +reversability +reversable +reversal +reverse +reversed +reversedly +reverseful +reverseless +reversely +reversement +reverser +reverseways +reversewise +reversi +reversibility +reversible +reversibleness +reversibly +reversification +reversifier +reversify +reversing +reversingly +reversion +reversionable +reversional +reversionally +reversionary +reversioner +reversionist +reversis +reversist +reversive +reverso +revert +revertal +reverter +revertibility +revertible +revertive +revertively +revery +revest +revestiary +revestry +revet +revete +revetement +revetment +revibrate +revibration +revibrational +revictorious +revictory +revictual +revictualment +revie +review +reviewability +reviewable +reviewage +reviewal +reviewer +revieweress +reviewish +reviewless +revigorate +revigoration +revile +revilement +reviler +reviling +revilingly +revindicate +revindication +reviolate +reviolation +revirescence +revirescent +Revisable +revisable +revisableness +revisal +revise +Revised +revisee +reviser +revisership +revisible +revision +revisional +revisionary +revisionism +revisionist +revisit +revisitant +revisitation +revisor +revisory +revisualization +revisualize +revitalization +revitalize +revitalizer +revivability +revivable +revivably +revival +revivalism +revivalist +revivalistic +revivalize +revivatory +revive +revivement +reviver +revivification +revivifier +revivify +reviving +revivingly +reviviscence +reviviscency +reviviscent +reviviscible +revivor +revocability +revocable +revocableness +revocably +revocation +revocative +revocatory +revoice +revokable +revoke +revokement +revoker +revokingly +revolant +revolatilize +revolt +revolter +revolting +revoltingly +revoltress +revolubility +revoluble +revolubly +revolunteer +revolute +revoluted +revolution +revolutional +revolutionally +revolutionarily +revolutionariness +revolutionary +revolutioneering +revolutioner +revolutionism +revolutionist +revolutionize +revolutionizement +revolutionizer +revolvable +revolvably +revolve +revolvement +revolvency +revolver +revolving +revolvingly +revomit +revote +revue +revuette +revuist +revulsed +revulsion +revulsionary +revulsive +revulsively +rewade +rewager +rewake +rewaken +rewall +rewallow +reward +rewardable +rewardableness +rewardably +rewardedly +rewarder +rewardful +rewardfulness +rewarding +rewardingly +rewardless +rewardproof +rewarehouse +rewarm +rewarn +rewash +rewater +rewave +rewax +rewaybill +rewayle +reweaken +rewear +reweave +rewed +reweigh +reweigher +reweight +rewelcome +reweld +rewend +rewet +rewhelp +rewhirl +rewhisper +rewhiten +rewiden +rewin +rewind +rewinder +rewirable +rewire +rewish +rewithdraw +rewithdrawal +rewood +reword +rework +reworked +rewound +rewove +rewoven +rewrap +rewrite +rewriter +Rex +rex +rexen +reyield +Reynard +Reynold +reyoke +reyouth +rezbanyite +rhabdite +rhabditiform +Rhabditis +rhabdium +Rhabdocarpum +Rhabdocoela +rhabdocoelan +rhabdocoele +Rhabdocoelida +rhabdocoelidan +rhabdocoelous +rhabdoid +rhabdoidal +rhabdolith +rhabdom +rhabdomal +rhabdomancer +rhabdomancy +rhabdomantic +rhabdomantist +Rhabdomonas +rhabdomyoma +rhabdomyosarcoma +rhabdomysarcoma +rhabdophane +rhabdophanite +Rhabdophora +rhabdophoran +Rhabdopleura +rhabdopod +rhabdos +rhabdosome +rhabdosophy +rhabdosphere +rhabdus +Rhacianectes +Rhacomitrium +Rhacophorus +Rhadamanthine +Rhadamanthus +Rhadamanthys +Rhaetian +Rhaetic +rhagades +rhagadiform +rhagiocrin +rhagionid +Rhagionidae +rhagite +Rhagodia +rhagon +rhagonate +rhagose +rhamn +Rhamnaceae +rhamnaceous +rhamnal +Rhamnales +rhamnetin +rhamninase +rhamninose +rhamnite +rhamnitol +rhamnohexite +rhamnohexitol +rhamnohexose +rhamnonic +rhamnose +rhamnoside +Rhamnus +rhamphoid +Rhamphorhynchus +Rhamphosuchus +rhamphotheca +Rhapidophyllum +Rhapis +rhapontic +rhaponticin +rhapontin +rhapsode +rhapsodic +rhapsodical +rhapsodically +rhapsodie +rhapsodism +rhapsodist +rhapsodistic +rhapsodize +rhapsodomancy +rhapsody +Rhaptopetalaceae +rhason +rhasophore +rhatania +rhatany +rhe +Rhea +rhea +rheadine +Rheae +rhebok +rhebosis +rheeboc +rheebok +rheen +rhegmatype +rhegmatypy +Rhegnopteri +rheic +Rheidae +Rheiformes +rhein +rheinic +rhema +rhematic +rhematology +rheme +Rhemish +Rhemist +Rhenish +rhenium +rheobase +rheocrat +rheologist +rheology +rheometer +rheometric +rheometry +rheophile +rheophore +rheophoric +rheoplankton +rheoscope +rheoscopic +rheostat +rheostatic +rheostatics +rheotactic +rheotan +rheotaxis +rheotome +rheotrope +rheotropic +rheotropism +rhesian +rhesus +rhetor +rhetoric +rhetorical +rhetorically +rhetoricalness +rhetoricals +rhetorician +rhetorize +Rheum +rheum +rheumarthritis +rheumatalgia +rheumatic +rheumatical +rheumatically +rheumaticky +rheumatism +rheumatismal +rheumatismoid +rheumative +rheumatiz +rheumatize +rheumatoid +rheumatoidal +rheumatoidally +rheumed +rheumic +rheumily +rheuminess +rheumy +Rhexia +rhexis +rhigolene +rhigosis +rhigotic +Rhina +rhinal +rhinalgia +Rhinanthaceae +Rhinanthus +rhinarium +rhincospasm +rhine +Rhineland +Rhinelander +rhinencephalic +rhinencephalon +rhinencephalous +rhinenchysis +Rhineodon +Rhineodontidae +rhinestone +Rhineura +rhineurynter +Rhinidae +rhinion +rhinitis +rhino +Rhinobatidae +Rhinobatus +rhinobyon +rhinocaul +rhinocele +rhinocelian +rhinocerial +rhinocerian +rhinocerine +rhinoceroid +rhinoceros +rhinoceroslike +rhinocerotic +Rhinocerotidae +rhinocerotiform +rhinocerotine +rhinocerotoid +rhinochiloplasty +Rhinoderma +rhinodynia +rhinogenous +rhinolalia +rhinolaryngology +rhinolaryngoscope +rhinolite +rhinolith +rhinolithic +rhinological +rhinologist +rhinology +rhinolophid +Rhinolophidae +rhinolophine +rhinopharyngeal +rhinopharyngitis +rhinopharynx +Rhinophidae +Rhinophis +rhinophonia +rhinophore +rhinophyma +rhinoplastic +rhinoplasty +rhinopolypus +Rhinoptera +Rhinopteridae +rhinorrhagia +rhinorrhea +rhinorrheal +rhinoscleroma +rhinoscope +rhinoscopic +rhinoscopy +rhinosporidiosis +Rhinosporidium +rhinotheca +rhinothecal +Rhinthonic +Rhinthonica +rhipidate +rhipidion +Rhipidistia +rhipidistian +rhipidium +Rhipidoglossa +rhipidoglossal +rhipidoglossate +Rhipidoptera +rhipidopterous +rhipiphorid +Rhipiphoridae +Rhipiptera +rhipipteran +rhipipterous +Rhipsalis +Rhiptoglossa +rhizanthous +rhizautoicous +Rhizina +Rhizinaceae +rhizine +rhizinous +Rhizobium +rhizocarp +Rhizocarpeae +rhizocarpean +rhizocarpian +rhizocarpic +rhizocarpous +rhizocaul +rhizocaulus +Rhizocephala +rhizocephalan +rhizocephalous +rhizocorm +Rhizoctonia +rhizoctoniose +rhizodermis +Rhizodus +Rhizoflagellata +rhizoflagellate +rhizogen +rhizogenetic +rhizogenic +rhizogenous +rhizoid +rhizoidal +rhizoma +rhizomatic +rhizomatous +rhizome +rhizomelic +rhizomic +rhizomorph +rhizomorphic +rhizomorphoid +rhizomorphous +rhizoneure +rhizophagous +rhizophilous +Rhizophora +Rhizophoraceae +rhizophoraceous +rhizophore +rhizophorous +rhizophyte +rhizoplast +rhizopod +Rhizopoda +rhizopodal +rhizopodan +rhizopodist +rhizopodous +Rhizopogon +Rhizopus +rhizosphere +Rhizostomae +Rhizostomata +rhizostomatous +rhizostome +rhizostomous +Rhizota +rhizotaxis +rhizotaxy +rhizote +rhizotic +rhizotomi +rhizotomy +rho +Rhoda +rhodaline +Rhodamine +rhodamine +rhodanate +Rhodanian +rhodanic +rhodanine +rhodanthe +rhodeose +Rhodes +Rhodesian +Rhodesoid +rhodeswood +Rhodian +rhodic +rhoding +rhodinol +rhodite +rhodium +rhodizite +rhodizonic +Rhodobacteriaceae +Rhodobacterioideae +rhodochrosite +Rhodococcus +Rhodocystis +rhodocyte +rhododendron +rhodolite +Rhodomelaceae +rhodomelaceous +rhodonite +Rhodope +rhodophane +Rhodophyceae +rhodophyceous +rhodophyll +Rhodophyllidaceae +Rhodophyta +rhodoplast +rhodopsin +Rhodora +Rhodoraceae +rhodorhiza +rhodosperm +Rhodospermeae +rhodospermin +rhodospermous +Rhodospirillum +Rhodothece +Rhodotypos +Rhodymenia +Rhodymeniaceae +rhodymeniaceous +Rhodymeniales +Rhoeadales +Rhoecus +Rhoeo +rhomb +rhombencephalon +rhombenporphyr +rhombic +rhombical +rhombiform +rhomboclase +rhomboganoid +Rhomboganoidei +rhombogene +rhombogenic +rhombogenous +rhombohedra +rhombohedral +rhombohedrally +rhombohedric +rhombohedron +rhomboid +rhomboidal +rhomboidally +rhomboideus +rhomboidly +rhomboquadratic +rhomborectangular +rhombos +rhombovate +Rhombozoa +rhombus +rhonchal +rhonchial +rhonchus +Rhonda +rhopalic +rhopalism +rhopalium +Rhopalocera +rhopaloceral +rhopalocerous +Rhopalura +rhotacism +rhotacismus +rhotacistic +rhotacize +rhubarb +rhubarby +rhumb +rhumba +rhumbatron +Rhus +rhyacolite +rhyme +rhymeless +rhymelet +rhymemaker +rhymemaking +rhymeproof +rhymer +rhymery +rhymester +rhymewise +rhymic +rhymist +rhymy +Rhynchobdellae +Rhynchobdellida +Rhynchocephala +Rhynchocephali +Rhynchocephalia +rhynchocephalian +rhynchocephalic +rhynchocephalous +Rhynchocoela +rhynchocoelan +rhynchocoelic +rhynchocoelous +rhyncholite +Rhynchonella +Rhynchonellacea +Rhynchonellidae +rhynchonelloid +Rhynchophora +rhynchophoran +rhynchophore +rhynchophorous +Rhynchopinae +Rhynchops +Rhynchosia +Rhynchospora +Rhynchota +rhynchotal +rhynchote +rhynchotous +rhynconellid +Rhyncostomi +Rhynia +Rhyniaceae +Rhynocheti +Rhynsburger +rhyobasalt +rhyodacite +rhyolite +rhyolitic +rhyotaxitic +rhyparographer +rhyparographic +rhyparographist +rhyparography +rhypography +rhyptic +rhyptical +rhysimeter +Rhyssa +rhythm +rhythmal +rhythmic +rhythmical +rhythmicality +rhythmically +rhythmicity +rhythmicize +rhythmics +rhythmist +rhythmizable +rhythmization +rhythmize +rhythmless +rhythmometer +rhythmopoeia +rhythmproof +Rhytidodon +rhytidome +rhytidosis +Rhytina +Rhytisma +rhyton +ria +rial +riancy +riant +riantly +riata +rib +ribald +ribaldish +ribaldly +ribaldrous +ribaldry +riband +Ribandism +Ribandist +ribandlike +ribandmaker +ribandry +ribat +ribaudequin +ribaudred +ribband +ribbandry +ribbed +ribber +ribbet +ribbidge +ribbing +ribble +ribbon +ribbonback +ribboner +ribbonfish +Ribbonism +ribbonlike +ribbonmaker +Ribbonman +ribbonry +ribbonweed +ribbonwood +ribbony +ribby +ribe +Ribes +Ribhus +ribless +riblet +riblike +riboflavin +ribonic +ribonuclease +ribonucleic +ribose +ribroast +ribroaster +ribroasting +ribskin +ribspare +Ribston +ribwork +ribwort +Ric +Ricardian +Ricardianism +Ricardo +Riccia +Ricciaceae +ricciaceous +Ricciales +rice +ricebird +riceland +ricer +ricey +Rich +rich +Richard +Richardia +Richardsonia +richdom +Richebourg +richellite +richen +riches +richesse +richling +richly +Richmond +Richmondena +richness +richt +richterite +richweed +ricin +ricine +ricinelaidic +ricinelaidinic +ricinic +ricinine +ricininic +ricinium +ricinoleate +ricinoleic +ricinolein +ricinolic +Ricinulei +Ricinus +ricinus +Rick +rick +rickardite +ricker +ricketily +ricketiness +ricketish +rickets +Rickettsia +rickettsial +Rickettsiales +rickettsialpox +rickety +rickey +rickle +rickmatic +rickrack +ricksha +rickshaw +rickstaddle +rickstand +rickstick +Ricky +rickyard +ricochet +ricolettaite +ricrac +rictal +rictus +rid +ridable +ridableness +ridably +riddam +riddance +riddel +ridden +ridder +ridding +riddle +riddlemeree +riddler +riddling +riddlingly +riddlings +ride +rideable +rideau +riden +rident +rider +ridered +rideress +riderless +ridge +ridgeband +ridgeboard +ridgebone +ridged +ridgel +ridgelet +ridgelike +ridgeling +ridgepiece +ridgeplate +ridgepole +ridgepoled +ridger +ridgerope +ridgetree +ridgeway +ridgewise +ridgil +ridging +ridgingly +ridgling +ridgy +ridibund +ridicule +ridiculer +ridiculize +ridiculosity +ridiculous +ridiculously +ridiculousness +riding +ridingman +ridotto +rie +riebeckite +riem +Riemannean +Riemannian +riempie +rier +Riesling +rife +rifely +rifeness +Riff +riff +Riffi +Riffian +riffle +riffler +riffraff +Rifi +Rifian +rifle +riflebird +rifledom +rifleman +riflemanship +rifleproof +rifler +riflery +rifleshot +rifling +rift +rifter +riftless +rifty +rig +rigadoon +rigamajig +rigamarole +rigation +rigbane +Rigel +Rigelian +rigescence +rigescent +riggald +rigger +rigging +riggish +riggite +riggot +right +rightabout +righten +righteous +righteously +righteousness +righter +rightful +rightfully +rightfulness +rightheaded +righthearted +rightist +rightle +rightless +rightlessness +rightly +rightmost +rightness +righto +rightship +rightward +rightwardly +rightwards +righty +rigid +rigidify +rigidist +rigidity +rigidly +rigidness +rigidulous +rigling +rigmaree +rigmarole +rigmarolery +rigmarolic +rigmarolish +rigmarolishly +rignum +rigol +rigolette +rigor +rigorism +rigorist +rigoristic +rigorous +rigorously +rigorousness +rigsby +rigsdaler +Rigsmaal +Rigsmal +rigwiddie +rigwiddy +Rik +Rikari +rikisha +rikk +riksha +rikshaw +Riksmaal +Riksmal +rilawa +rile +riley +rill +rillet +rillett +rillette +rillock +rillstone +rilly +rim +rima +rimal +rimate +rimbase +rime +rimeless +rimer +rimester +rimfire +rimiform +rimland +rimless +rimmaker +rimmaking +rimmed +rimmer +rimose +rimosely +rimosity +rimous +rimpi +rimple +rimption +rimrock +rimu +rimula +rimulose +rimy +Rinaldo +rinceau +rinch +rincon +Rind +rind +Rinde +rinded +rinderpest +rindle +rindless +rindy +rine +ring +ringable +Ringatu +ringbark +ringbarker +ringbill +ringbird +ringbolt +ringbone +ringboned +ringcraft +ringdove +ringe +ringed +ringent +ringer +ringeye +ringgiver +ringgiving +ringgoer +ringhals +ringhead +ringiness +ringing +ringingly +ringingness +ringite +ringle +ringlead +ringleader +ringleaderless +ringleadership +ringless +ringlet +ringleted +ringlety +ringlike +ringmaker +ringmaking +ringman +ringmaster +ringneck +ringsail +ringside +ringsider +ringster +ringtail +ringtaw +ringtime +ringtoss +ringwalk +ringwall +ringwise +ringworm +ringy +rink +rinka +rinker +rinkite +rinncefada +rinneite +rinner +rinsable +rinse +rinser +rinsing +rinthereout +rintherout +Rio +rio +riot +rioter +rioting +riotingly +riotist +riotistic +riotocracy +riotous +riotously +riotousness +riotproof +riotry +rip +ripa +ripal +riparial +riparian +Riparii +riparious +ripcord +ripe +ripelike +ripely +ripen +ripener +ripeness +ripening +ripeningly +riper +ripgut +ripicolous +ripidolite +ripienist +ripieno +ripier +ripost +riposte +rippable +ripper +ripperman +rippet +rippier +ripping +rippingly +rippingness +rippit +ripple +rippleless +rippler +ripplet +rippling +ripplingly +ripply +rippon +riprap +riprapping +ripsack +ripsaw +ripsnorter +ripsnorting +Ripuarian +ripup +riroriro +risala +risberm +rise +risen +riser +rishi +rishtadar +risibility +risible +risibleness +risibles +risibly +rising +risk +risker +riskful +riskfulness +riskily +riskiness +riskish +riskless +riskproof +risky +risorial +risorius +risp +risper +risque +risquee +Riss +rissel +risser +Rissian +rissle +Rissoa +rissoid +Rissoidae +rist +ristori +rit +Rita +rita +Ritalynne +ritardando +Ritchey +rite +riteless +ritelessness +ritling +ritornel +ritornelle +ritornello +Ritschlian +Ritschlianism +rittingerite +ritual +ritualism +ritualist +ritualistic +ritualistically +rituality +ritualize +ritualless +ritually +ritzy +riva +rivage +rival +rivalable +rivaless +rivalism +rivality +rivalize +rivalless +rivalrous +rivalry +rivalship +rive +rivel +rivell +riven +river +riverain +riverbank +riverbush +riverdamp +rivered +riverhead +riverhood +riverine +riverish +riverless +riverlet +riverlike +riverling +riverly +riverman +riverscape +riverside +riversider +riverward +riverwards +riverwash +riverway +riverweed +riverwise +rivery +rivet +riveter +rivethead +riveting +rivetless +rivetlike +Rivina +riving +rivingly +Rivinian +rivose +Rivularia +Rivulariaceae +rivulariaceous +rivulation +rivulet +rivulose +rix +rixatrix +rixy +riyal +riziform +rizzar +rizzle +rizzom +rizzomed +rizzonite +Ro +roach +roachback +road +roadability +roadable +roadbed +roadblock +roadbook +roadcraft +roaded +roader +roadfellow +roadhead +roadhouse +roading +roadite +roadless +roadlessness +roadlike +roadman +roadmaster +roadside +roadsider +roadsman +roadstead +roadster +roadstone +roadtrack +roadway +roadweed +roadwise +roadworthiness +roadworthy +roam +roamage +roamer +roaming +roamingly +roan +roanoke +roar +roarer +roaring +roaringly +roast +roastable +roaster +roasting +roastingly +Rob +rob +robalito +robalo +roband +robber +robberproof +robbery +Robbin +robbin +robbing +robe +robeless +Robenhausian +rober +roberd +Roberdsman +Robert +Roberta +Roberto +Robigalia +Robigus +Robin +robin +robinet +robing +Robinia +robinin +robinoside +roble +robomb +roborant +roborate +roboration +roborative +roborean +roboreous +robot +robotesque +robotian +robotism +robotistic +robotization +robotize +robotlike +robotry +robur +roburite +robust +robustful +robustfully +robustfulness +robustic +robusticity +robustious +robustiously +robustiousness +robustity +robustly +robustness +roc +rocambole +Roccella +Roccellaceae +roccellic +roccellin +roccelline +Rochea +rochelime +Rochelle +rocher +rochet +rocheted +rock +rockable +rockably +rockaby +rockabye +rockallite +Rockaway +rockaway +rockbell +rockberry +rockbird +rockborn +rockbrush +rockcist +rockcraft +rockelay +rocker +rockery +rocket +rocketeer +rocketer +rocketlike +rocketor +rocketry +rockety +rockfall +rockfish +rockfoil +rockhair +rockhearted +Rockies +rockiness +rocking +rockingly +rockish +rocklay +rockless +rocklet +rocklike +rockling +rockman +rockrose +rockshaft +rockslide +rockstaff +rocktree +rockward +rockwards +rockweed +rockwood +rockwork +rocky +rococo +Rocouyenne +rocta +Rod +rod +rodd +roddikin +roddin +rodding +rode +Rodent +rodent +Rodentia +rodential +rodentially +rodentian +rodenticidal +rodenticide +rodentproof +rodeo +Roderic +Roderick +rodge +Rodger +rodham +Rodinal +Rodinesque +roding +rodingite +rodknight +rodless +rodlet +rodlike +rodmaker +rodman +Rodney +rodney +Rodolph +Rodolphus +rodomont +rodomontade +rodomontadist +rodomontador +rodsman +rodster +rodwood +roe +roeblingite +roebuck +roed +roelike +roentgen +roentgenism +roentgenization +roentgenize +roentgenogram +roentgenograph +roentgenographic +roentgenographically +roentgenography +roentgenologic +roentgenological +roentgenologically +roentgenologist +roentgenology +roentgenometer +roentgenometry +roentgenoscope +roentgenoscopic +roentgenoscopy +roentgenotherapy +roentgentherapy +roer +roestone +roey +rog +rogan +rogation +Rogationtide +rogative +rogatory +Roger +roger +Rogero +rogersite +roggle +Rogue +rogue +roguedom +rogueling +roguery +rogueship +roguing +roguish +roguishly +roguishness +rohan +Rohilla +rohob +rohun +rohuna +roi +roid +roil +roily +Roist +roister +roisterer +roistering +roisteringly +roisterly +roisterous +roisterously +roit +Rok +roka +roke +rokeage +rokee +rokelay +roker +rokey +roky +Roland +Rolandic +role +roleo +Rolf +Rolfe +roll +rollable +rollback +rolled +rollejee +roller +rollerer +rollermaker +rollermaking +rollerman +rollerskater +rollerskating +rolley +rolleyway +rolleywayman +rolliche +rollichie +rollick +rollicker +rollicking +rollickingly +rollickingness +rollicksome +rollicksomeness +rollicky +rolling +rollingly +Rollinia +rollix +rollmop +Rollo +rollock +rollway +roloway +Romaean +Romagnese +Romagnol +Romagnole +Romaic +romaika +Romain +romaine +Romaji +romal +Roman +Romance +romance +romancealist +romancean +romanceful +romanceish +romanceishness +romanceless +romancelet +romancelike +romancemonger +romanceproof +romancer +romanceress +romancical +romancing +romancist +romancy +Romandom +Romane +Romanes +Romanese +Romanesque +Romanhood +Romanian +Romanic +Romaniform +Romanish +Romanism +Romanist +Romanistic +Romanite +Romanity +romanium +Romanization +Romanize +Romanizer +Romanly +Romansch +Romansh +romantic +romantical +romanticalism +romanticality +romantically +romanticalness +romanticism +romanticist +romanticistic +romanticity +romanticize +romanticly +romanticness +romantism +romantist +Romany +romanza +romaunt +rombos +rombowline +Rome +romeite +Romeo +romerillo +romero +Romescot +Romeshot +Romeward +Romewards +Romic +Romipetal +Romish +Romishly +Romishness +rommack +Rommany +Romney +Romneya +romp +romper +romping +rompingly +rompish +rompishly +rompishness +rompu +rompy +Romulian +Romulus +Ron +Ronald +roncador +Roncaglian +roncet +ronco +rond +rondache +rondacher +rondawel +ronde +rondeau +rondel +rondelet +Rondeletia +rondelier +rondelle +rondellier +rondino +rondle +rondo +rondoletto +rondure +rone +Rong +Ronga +rongeur +Ronni +ronquil +Ronsardian +Ronsardism +Ronsardist +Ronsardize +Ronsdorfer +Ronsdorfian +rontgen +ronyon +rood +roodebok +roodle +roodstone +roof +roofage +roofer +roofing +roofless +rooflet +rooflike +roofman +rooftree +roofward +roofwise +roofy +rooibok +rooinek +rook +rooker +rookeried +rookery +rookie +rookish +rooklet +rooklike +rooky +rool +room +roomage +roomed +roomer +roomful +roomie +roomily +roominess +roomkeeper +roomless +roomlet +roommate +roomstead +roomth +roomthily +roomthiness +roomthy +roomward +roomy +roon +roorback +roosa +Roosevelt +Rooseveltian +roost +roosted +rooster +roosterfish +roosterhood +roosterless +roosters +roostership +Root +root +rootage +rootcap +rooted +rootedly +rootedness +rooter +rootery +rootfast +rootfastness +roothold +rootiness +rootle +rootless +rootlessness +rootlet +rootlike +rootling +rootstalk +rootstock +rootwalt +rootward +rootwise +rootworm +rooty +roove +ropable +rope +ropeable +ropeband +ropebark +ropedance +ropedancer +ropedancing +ropelayer +ropelaying +ropelike +ropemaker +ropemaking +ropeman +roper +roperipe +ropery +ropes +ropesmith +ropetrick +ropewalk +ropewalker +ropeway +ropework +ropily +ropiness +roping +ropish +ropishness +ropp +ropy +roque +roquelaure +roquer +roquet +roquette +roquist +roral +roratorio +Rori +roric +Roridula +Roridulaceae +roriferous +rorifluent +Roripa +Rorippa +roritorious +rorqual +rorty +rorulent +rory +Rosa +Rosabel +Rosabella +Rosaceae +rosacean +rosaceous +rosal +Rosales +Rosalia +Rosalie +Rosalind +Rosaline +Rosamond +rosanilin +rosaniline +rosarian +rosario +rosarium +rosaruby +rosary +rosated +Roschach +roscherite +roscid +roscoelite +rose +roseal +roseate +roseately +rosebay +rosebud +rosebush +rosed +rosedrop +rosefish +rosehead +rosehill +rosehiller +roseine +rosel +roseless +roselet +roselike +roselite +rosella +rosellate +roselle +Rosellinia +rosemary +Rosenbergia +rosenbuschite +roseola +roseolar +roseoliform +roseolous +roseous +roseroot +rosery +roset +rosetan +rosetangle +rosetime +Rosetta +rosette +rosetted +rosetty +rosetum +rosety +roseways +rosewise +rosewood +rosewort +Rosicrucian +Rosicrucianism +rosied +rosier +rosieresite +rosilla +rosillo +rosily +rosin +rosinate +rosinduline +Rosine +rosiness +rosinous +rosinweed +rosinwood +rosiny +rosland +rosmarine +Rosmarinus +Rosminian +Rosminianism +rosoli +rosolic +rosolio +rosolite +rosorial +Ross +ross +rosser +rossite +rostel +rostellar +Rostellaria +rostellarian +rostellate +rostelliform +rostellum +roster +rostra +rostral +rostrally +rostrate +rostrated +rostriferous +rostriform +rostroantennary +rostrobranchial +rostrocarinate +rostrocaudal +rostroid +rostrolateral +rostrular +rostrulate +rostrulum +rostrum +rosular +rosulate +rosy +rot +rota +rotacism +Rotal +rotal +Rotala +Rotalia +rotalian +rotaliform +rotaliiform +rotaman +rotameter +rotan +Rotanev +rotang +Rotarian +Rotarianism +rotarianize +Rotary +rotary +rotascope +rotatable +rotate +rotated +rotating +rotation +rotational +rotative +rotatively +rotativism +rotatodentate +rotatoplane +rotator +Rotatoria +rotatorian +rotatory +rotch +rote +rotella +rotenone +roter +rotge +rotgut +rother +rothermuck +rotifer +Rotifera +rotiferal +rotiferan +rotiferous +rotiform +rotisserie +roto +rotograph +rotogravure +rotor +rotorcraft +rotproof +Rotse +rottan +rotten +rottenish +rottenly +rottenness +rottenstone +rotter +rotting +rottle +rottlera +rottlerin +rottock +rottolo +rotula +rotulad +rotular +rotulet +rotulian +rotuliform +rotulus +rotund +rotunda +rotundate +rotundifoliate +rotundifolious +rotundiform +rotundify +rotundity +rotundly +rotundness +rotundo +rotundotetragonal +roub +roucou +roud +roue +rouelle +rouge +rougeau +rougeberry +rougelike +rougemontite +rougeot +rough +roughage +roughcast +roughcaster +roughdraft +roughdraw +roughdress +roughdry +roughen +roughener +rougher +roughet +roughhearted +roughheartedness +roughhew +roughhewer +roughhewn +roughhouse +roughhouser +roughhousing +roughhousy +roughie +roughing +roughings +roughish +roughishly +roughishness +roughleg +roughly +roughness +roughometer +roughride +roughrider +roughroot +roughscuff +roughsetter +roughshod +roughslant +roughsome +roughstring +roughstuff +roughtail +roughtailed +roughwork +roughwrought +roughy +rougy +rouille +rouky +roulade +rouleau +roulette +Rouman +Roumeliote +roun +rounce +rounceval +rouncy +round +roundabout +roundaboutly +roundaboutness +rounded +roundedly +roundedness +roundel +roundelay +roundeleer +rounder +roundfish +roundhead +roundheaded +roundheadedness +roundhouse +rounding +roundish +roundishness +roundlet +roundline +roundly +roundmouthed +roundness +roundnose +roundnosed +roundridge +roundseam +roundsman +roundtail +roundtop +roundtree +roundup +roundwise +roundwood +roundworm +roundy +roup +rouper +roupet +roupily +roupingwife +roupit +roupy +rouse +rouseabout +rousedness +rousement +rouser +rousing +rousingly +Rousseau +Rousseauan +Rousseauism +Rousseauist +Rousseauistic +Rousseauite +Roussellian +roussette +Roussillon +roust +roustabout +rouster +rousting +rout +route +router +routh +routhercock +routhie +routhiness +routhy +routinary +routine +routineer +routinely +routing +routinish +routinism +routinist +routinization +routinize +routivarite +routous +routously +rouvillite +rove +rover +rovet +rovetto +roving +rovingly +rovingness +row +rowable +rowan +rowanberry +rowboat +rowdily +rowdiness +rowdy +rowdydow +rowdydowdy +rowdyish +rowdyishly +rowdyishness +rowdyism +rowdyproof +rowed +rowel +rowelhead +rowen +Rowena +rower +rowet +rowiness +rowing +Rowland +rowlandite +Rowleian +rowlet +Rowley +Rowleyan +rowlock +rowport +rowty +rowy +rox +Roxana +Roxane +Roxanne +Roxburgh +Roxburghiaceae +Roxbury +Roxie +Roxolani +Roxy +roxy +Roy +royal +royale +royalet +royalism +royalist +royalization +royalize +royally +royalty +Royena +royet +royetness +royetous +royetously +Roystonea +royt +rozum +Rua +ruach +ruana +rub +rubasse +rubato +rubbed +rubber +rubberer +rubberize +rubberless +rubberneck +rubbernecker +rubbernose +rubbers +rubberstone +rubberwise +rubbery +rubbing +rubbingstone +rubbish +rubbishing +rubbishingly +rubbishly +rubbishry +rubbishy +rubble +rubbler +rubblestone +rubblework +rubbly +rubdown +Rube +rubedinous +rubedity +rubefacient +rubefaction +rubelet +rubella +rubelle +rubellite +rubellosis +Rubensian +rubeola +rubeolar +rubeoloid +ruberythric +ruberythrinic +rubescence +rubescent +Rubia +Rubiaceae +rubiaceous +Rubiales +rubianic +rubiate +rubiator +rubican +rubicelle +Rubicola +Rubicon +rubiconed +rubicund +rubicundity +rubidic +rubidine +rubidium +rubied +rubific +rubification +rubificative +rubify +rubiginous +rubijervine +rubine +rubineous +rubious +ruble +rublis +rubor +rubric +rubrica +rubrical +rubricality +rubrically +rubricate +rubrication +rubricator +rubrician +rubricism +rubricist +rubricity +rubricize +rubricose +rubrific +rubrification +rubrify +rubrisher +rubrospinal +rubstone +Rubus +ruby +rubylike +rubytail +rubythroat +rubywise +rucervine +Rucervus +Ruchbah +ruche +ruching +ruck +rucker +ruckle +ruckling +rucksack +rucksey +ruckus +rucky +ructation +ruction +rud +rudas +Rudbeckia +rudd +rudder +rudderhead +rudderhole +rudderless +rudderlike +rudderpost +rudderstock +ruddied +ruddily +ruddiness +ruddle +ruddleman +ruddock +ruddy +ruddyish +rude +rudely +rudeness +rudented +rudenture +ruderal +rudesby +Rudesheimer +rudge +rudiment +rudimental +rudimentarily +rudimentariness +rudimentary +rudimentation +rudish +Rudista +Rudistae +rudistan +rudistid +rudity +Rudmasday +Rudolf +Rudolph +Rudolphus +Rudy +rue +rueful +ruefully +ruefulness +ruelike +ruelle +Ruellia +ruen +ruer +ruesome +ruesomeness +ruewort +rufescence +rufescent +ruff +ruffable +ruffed +ruffer +ruffian +ruffianage +ruffiandom +ruffianhood +ruffianish +ruffianism +ruffianize +ruffianlike +ruffianly +ruffiano +ruffin +ruffle +ruffled +ruffleless +rufflement +ruffler +rufflike +ruffliness +ruffling +ruffly +ruficarpous +ruficaudate +ruficoccin +ruficornate +rufigallic +rufoferruginous +rufofulvous +rufofuscous +rufopiceous +rufotestaceous +rufous +rufter +rufulous +Rufus +rufus +rug +ruga +rugate +Rugbeian +Rugby +rugged +ruggedly +ruggedness +Rugger +rugging +ruggle +ruggy +rugheaded +ruglike +rugmaker +rugmaking +Rugosa +rugosa +rugose +rugosely +rugosity +rugous +rugulose +ruin +ruinable +ruinate +ruination +ruinatious +ruinator +ruined +ruiner +ruing +ruiniform +ruinlike +ruinous +ruinously +ruinousness +ruinproof +Rukbat +rukh +rulable +Rulander +rule +ruledom +ruleless +rulemonger +ruler +rulership +ruling +rulingly +rull +ruller +rullion +Rum +rum +rumal +Ruman +Rumanian +rumbelow +rumble +rumblegarie +rumblegumption +rumblement +rumbler +rumbling +rumblingly +rumbly +rumbo +rumbooze +rumbowline +rumbowling +rumbullion +rumbumptious +rumbustical +rumbustious +rumbustiousness +rumchunder +Rumelian +rumen +rumenitis +rumenocentesis +rumenotomy +Rumex +rumfustian +rumgumption +rumgumptious +ruminal +ruminant +Ruminantia +ruminantly +ruminate +ruminating +ruminatingly +rumination +ruminative +ruminatively +ruminator +rumkin +rumless +rumly +rummage +rummager +rummagy +rummer +rummily +rumminess +rummish +rummy +rumness +rumney +rumor +rumorer +rumormonger +rumorous +rumorproof +rumourmonger +rump +rumpad +rumpadder +rumpade +Rumper +rumple +rumpless +rumply +rumpscuttle +rumpuncheon +rumpus +rumrunner +rumrunning +rumshop +rumswizzle +rumtytoo +run +runabout +runagate +runaround +runaway +runback +runboard +runby +runch +runchweed +runcinate +rundale +Rundi +rundle +rundlet +rune +runecraft +runed +runefolk +runeless +runelike +runer +runesmith +runestaff +runeword +runfish +rung +runghead +rungless +runholder +runic +runically +runiform +runite +runkeeper +runkle +runkly +runless +runlet +runman +runnable +runnel +runner +runnet +running +runningly +runny +runoff +runologist +runology +runout +runover +runproof +runrig +runround +runt +runted +runtee +runtiness +runtish +runtishly +runtishness +runty +runway +rupa +rupee +Rupert +rupestral +rupestrian +rupestrine +rupia +rupiah +rupial +Rupicapra +Rupicaprinae +rupicaprine +Rupicola +Rupicolinae +rupicoline +rupicolous +rupie +rupitic +Ruppia +ruptile +ruption +ruptive +ruptuary +rupturable +rupture +ruptured +rupturewort +rural +ruralism +ruralist +ruralite +rurality +ruralization +ruralize +rurally +ruralness +rurban +ruridecanal +rurigenous +Ruritania +Ruritanian +ruru +Rus +Rusa +Ruscus +ruse +rush +rushbush +rushed +rushen +rusher +rushiness +rushing +rushingly +rushingness +rushland +rushlight +rushlighted +rushlike +rushlit +rushy +Rusin +rusine +rusk +ruskin +Ruskinian +rusky +rusma +rusot +ruspone +Russ +russel +Russelia +Russell +Russellite +Russene +russet +russeting +russetish +russetlike +russety +Russia +russia +Russian +Russianism +Russianist +Russianization +Russianize +Russification +Russificator +Russifier +Russify +Russine +Russism +Russniak +Russolatrous +Russolatry +Russomania +Russomaniac +Russomaniacal +Russophile +Russophilism +Russophilist +Russophobe +Russophobia +Russophobiac +Russophobism +Russophobist +russud +Russula +rust +rustable +rustful +rustic +rustical +rustically +rusticalness +rusticate +rustication +rusticator +rusticial +rusticism +rusticity +rusticize +rusticly +rusticness +rusticoat +rustily +rustiness +rustle +rustler +rustless +rustling +rustlingly +rustlingness +rustly +rustproof +rustre +rustred +Rusty +rusty +rustyback +rustyish +ruswut +rut +Ruta +rutabaga +Rutaceae +rutaceous +rutaecarpine +rutate +rutch +rutelian +Rutelinae +Ruth +ruth +ruthenate +Ruthene +Ruthenian +ruthenic +ruthenious +ruthenium +ruthenous +ruther +rutherford +rutherfordine +rutherfordite +ruthful +ruthfully +ruthfulness +ruthless +ruthlessly +ruthlessness +rutic +rutidosis +rutilant +rutilated +rutile +rutilous +rutin +rutinose +Rutiodon +ruttee +rutter +ruttiness +ruttish +ruttishly +ruttishness +rutty +Rutuli +rutyl +rutylene +ruvid +rux +rvulsant +ryal +ryania +rybat +ryder +rye +ryen +Rymandra +ryme +Rynchospora +rynchosporous +rynd +rynt +ryot +ryotwar +ryotwari +rype +rypeck +rytidosis +Rytina +Ryukyu +S +s +sa +saa +Saad +Saan +Saarbrucken +sab +Saba +sabadilla +sabadine +sabadinine +Sabaean +Sabaeanism +Sabaeism +sabaigrass +Sabaism +Sabaist +Sabal +Sabalaceae +sabalo +Saban +sabanut +Sabaoth +Sabathikos +Sabazian +Sabazianism +Sabazios +sabbat +Sabbatarian +Sabbatarianism +Sabbatary +Sabbatean +Sabbath +sabbath +Sabbathaian +Sabbathaic +Sabbathaist +Sabbathbreaker +Sabbathbreaking +Sabbathism +Sabbathize +Sabbathkeeper +Sabbathkeeping +Sabbathless +Sabbathlike +Sabbathly +Sabbatia +sabbatia +Sabbatian +Sabbatic +sabbatic +Sabbatical +sabbatical +Sabbatically +Sabbaticalness +sabbatine +sabbatism +Sabbatist +Sabbatization +Sabbatize +sabbaton +sabbitha +sabdariffa +sabe +sabeca +Sabella +sabella +sabellan +Sabellaria +sabellarian +Sabelli +Sabellian +Sabellianism +Sabellianize +sabellid +Sabellidae +sabelloid +saber +saberbill +sabered +saberleg +saberlike +saberproof +sabertooth +saberwing +Sabia +Sabiaceae +sabiaceous +Sabian +Sabianism +sabicu +Sabik +Sabina +sabina +Sabine +sabine +Sabinian +sabino +Sabir +sable +sablefish +sableness +sably +sabora +saboraim +sabot +sabotage +saboted +saboteur +sabotine +Sabra +sabra +sabretache +Sabrina +Sabromin +sabromin +Sabuja +sabuline +sabulite +sabulose +sabulosity +sabulous +sabulum +saburra +saburral +saburration +sabutan +sabzi +Sac +sac +Sacae +sacalait +sacaline +sacaton +sacatra +sacbrood +saccade +saccadic +Saccammina +saccate +saccated +Saccha +saccharamide +saccharase +saccharate +saccharated +saccharephidrosis +saccharic +saccharide +sacchariferous +saccharification +saccharifier +saccharify +saccharilla +saccharimeter +saccharimetric +saccharimetrical +saccharimetry +saccharin +saccharinate +saccharinated +saccharine +saccharineish +saccharinely +saccharinic +saccharinity +saccharization +saccharize +saccharobacillus +saccharobiose +saccharobutyric +saccharoceptive +saccharoceptor +saccharochemotropic +saccharocolloid +saccharofarinaceous +saccharogalactorrhea +saccharogenic +saccharohumic +saccharoid +saccharoidal +saccharolactonic +saccharolytic +saccharometabolic +saccharometabolism +saccharometer +saccharometric +saccharometry +saccharomucilaginous +Saccharomyces +saccharomyces +Saccharomycetaceae +saccharomycetaceous +Saccharomycetales +saccharomycete +Saccharomycetes +saccharomycetic +saccharomycosis +saccharon +saccharonate +saccharone +saccharonic +saccharophylly +saccharorrhea +saccharoscope +saccharose +saccharostarchy +saccharosuria +saccharotriose +saccharous +saccharulmic +saccharulmin +Saccharum +saccharum +saccharuria +sacciferous +sacciform +Saccobranchiata +saccobranchiate +Saccobranchus +saccoderm +Saccolabium +saccolabium +saccomyian +saccomyid +Saccomyidae +Saccomyina +saccomyine +saccomyoid +Saccomyoidea +saccomyoidean +Saccomys +Saccopharyngidae +Saccopharynx +Saccorhiza +saccos +saccular +sacculate +sacculated +sacculation +saccule +Sacculina +sacculoutricular +sacculus +saccus +sacellum +sacerdocy +sacerdotage +sacerdotal +sacerdotalism +sacerdotalist +sacerdotalize +sacerdotally +sacerdotical +sacerdotism +sachamaker +sachem +sachemdom +sachemic +sachemship +sachet +Sacheverell +Sacian +sack +sackage +sackamaker +sackbag +sackbut +sackcloth +sackclothed +sackdoudle +sacked +sacken +sacker +sackful +sacking +sackless +sacklike +sackmaker +sackmaking +sackman +sacktime +saclike +saco +sacope +sacque +sacra +sacrad +sacral +sacralgia +sacralization +sacrament +sacramental +sacramentalism +sacramentalist +sacramentality +sacramentally +sacramentalness +Sacramentarian +sacramentarian +sacramentarianism +sacramentarist +Sacramentary +sacramentary +sacramenter +sacramentism +sacramentize +Sacramento +sacramentum +sacraria +sacrarial +sacrarium +sacrectomy +sacred +sacredly +sacredness +sacrificable +sacrificant +Sacrificati +sacrification +sacrificator +sacrificatory +sacrificature +sacrifice +sacrificer +sacrificial +sacrificially +sacrificing +sacrilege +sacrileger +sacrilegious +sacrilegiously +sacrilegiousness +sacrilegist +sacrilumbal +sacrilumbalis +sacring +Sacripant +sacrist +sacristan +sacristy +sacro +sacrocaudal +sacrococcygeal +sacrococcygean +sacrococcygeus +sacrococcyx +sacrocostal +sacrocotyloid +sacrocotyloidean +sacrocoxalgia +sacrocoxitis +sacrodorsal +sacrodynia +sacrofemoral +sacroiliac +sacroinguinal +sacroischiac +sacroischiadic +sacroischiatic +sacrolumbal +sacrolumbalis +sacrolumbar +sacropectineal +sacroperineal +sacropictorial +sacroposterior +sacropubic +sacrorectal +sacrosanct +sacrosanctity +sacrosanctness +sacrosciatic +sacrosecular +sacrospinal +sacrospinalis +sacrospinous +sacrotomy +sacrotuberous +sacrovertebral +sacrum +sad +Sadachbia +Sadalmelik +Sadalsuud +sadden +saddening +saddeningly +saddik +saddirham +saddish +saddle +saddleback +saddlebag +saddlebow +saddlecloth +saddled +saddleleaf +saddleless +saddlelike +saddlenose +saddler +saddlery +saddlesick +saddlesore +saddlesoreness +saddlestead +saddletree +saddlewise +saddling +Sadducaic +Sadducean +Sadducee +Sadduceeism +Sadduceeist +Sadducism +Sadducize +sade +sadh +sadhe +sadhearted +sadhu +sadic +Sadie +sadiron +sadism +sadist +sadistic +sadistically +Sadite +sadly +sadness +sado +sadomasochism +Sadr +sadr +saecula +saeculum +Saeima +saernaite +saeter +saeume +Safar +safari +Safavi +Safawid +safe +safeblower +safeblowing +safebreaker +safebreaking +safecracking +safeguard +safeguarder +safehold +safekeeper +safekeeping +safelight +safely +safemaker +safemaking +safen +safener +safeness +safety +Saffarian +Saffarid +saffian +safflor +safflorite +safflow +safflower +saffron +saffroned +saffrontree +saffronwood +saffrony +Safi +Safine +Safini +safranin +safranine +safranophile +safrole +saft +sag +saga +sagaciate +sagacious +sagaciously +sagaciousness +sagacity +Sagai +sagaie +sagaman +sagamite +sagamore +sagapenum +sagathy +sage +sagebrush +sagebrusher +sagebush +sageleaf +sagely +sagene +sageness +sagenite +sagenitic +Sageretia +sagerose +sageship +sagewood +sagger +sagging +saggon +saggy +saghavart +Sagina +saginate +sagination +saging +Sagitarii +sagitta +sagittal +sagittally +Sagittaria +Sagittariid +Sagittarius +sagittarius +Sagittary +sagittary +sagittate +Sagittid +sagittiferous +sagittiform +sagittocyst +sagittoid +sagless +sago +sagoin +sagolike +Sagra +saguaro +Saguerus +sagum +saguran +sagvandite +sagwire +sagy +sah +Sahadeva +Sahaptin +Sahara +Saharan +Saharian +Saharic +sahh +sahib +Sahibah +Sahidic +sahme +Saho +sahoukar +sahukar +sai +saic +said +Saidi +Saify +saiga +Saiid +sail +sailable +sailage +sailboat +sailcloth +sailed +sailer +sailfish +sailflying +sailing +sailingly +sailless +sailmaker +sailmaking +sailor +sailoring +sailorizing +sailorless +sailorlike +sailorly +sailorman +sailorproof +sailplane +sailship +sailsman +saily +saim +saimiri +saimy +sain +Sainfoin +saint +saintdom +sainted +saintess +sainthood +saintish +saintism +saintless +saintlike +saintlily +saintliness +saintling +saintly +saintologist +saintology +Saintpaulia +saintship +saip +Saiph +sair +sairly +sairve +sairy +Saite +saithe +Saitic +Saiva +Saivism +saj +sajou +Sak +Saka +Sakai +Sakalava +sake +sakeber +sakeen +Sakel +Sakelarides +Sakell +Sakellaridis +saker +sakeret +Sakha +saki +sakieh +Sakkara +Saktism +sakulya +Sakyamuni +Sal +sal +salaam +salaamlike +salability +salable +salableness +salably +salaceta +salacious +salaciously +salaciousness +salacity +salacot +salad +salading +salago +salagrama +salal +salamandarin +salamander +salamanderlike +Salamandra +salamandrian +Salamandridae +salamandriform +Salamandrina +salamandrine +salamandroid +salambao +Salaminian +salamo +salampore +salangane +salangid +Salangidae +Salar +salar +salariat +salaried +salary +salaryless +salat +salay +sale +salegoer +salele +salema +salenixon +salep +saleratus +saleroom +salesclerk +Salesian +saleslady +salesman +salesmanship +salespeople +salesperson +salesroom +saleswoman +salework +saleyard +salfern +Salian +Saliaric +Salic +salic +Salicaceae +salicaceous +Salicales +Salicariaceae +salicetum +salicin +salicional +salicorn +Salicornia +salicyl +salicylal +salicylaldehyde +salicylamide +salicylanilide +salicylase +salicylate +salicylic +salicylide +salicylidene +salicylism +salicylize +salicylous +salicyluric +salicylyl +salience +salient +Salientia +salientian +saliently +saliferous +salifiable +salification +salify +saligenin +saligot +salimeter +salimetry +Salina +salina +Salinan +salination +saline +Salinella +salinelle +salineness +saliniferous +salinification +saliniform +salinity +salinize +salinometer +salinometry +salinosulphureous +salinoterreous +Salisburia +Salish +Salishan +salite +salited +Saliva +saliva +salival +Salivan +salivant +salivary +salivate +salivation +salivator +salivatory +salivous +Salix +salix +salle +sallee +salleeman +sallenders +sallet +sallier +salloo +sallow +sallowish +sallowness +sallowy +Sally +sally +Sallybloom +sallyman +sallywood +Salm +salma +salmagundi +salmiac +salmine +salmis +Salmo +Salmon +salmon +salmonberry +Salmonella +salmonella +salmonellae +salmonellosis +salmonet +salmonid +Salmonidae +salmoniform +salmonlike +salmonoid +Salmonoidea +Salmonoidei +salmonsite +salmwood +salnatron +Salol +salol +Salome +salometer +salometry +salomon +Salomonia +Salomonian +Salomonic +salon +saloon +saloonist +saloonkeeper +saloop +Salopian +salopian +salp +Salpa +salpa +salpacean +salpian +salpicon +Salpidae +salpiform +Salpiglossis +salpiglossis +salpingectomy +salpingemphraxis +salpinges +salpingian +salpingion +salpingitic +salpingitis +salpingocatheterism +salpingocele +salpingocyesis +salpingomalleus +salpingonasal +salpingopalatal +salpingopalatine +salpingoperitonitis +salpingopexy +salpingopharyngeal +salpingopharyngeus +salpingopterygoid +salpingorrhaphy +salpingoscope +salpingostaphyline +salpingostenochoria +salpingostomatomy +salpingostomy +salpingotomy +salpinx +salpoid +salse +salsifis +salsify +salsilla +Salsola +Salsolaceae +salsolaceous +salsuginous +salt +salta +saltant +saltarella +saltarello +saltary +saltate +saltation +saltativeness +Saltator +saltator +Saltatoria +saltatorial +saltatorian +saltatoric +saltatorious +saltatory +saltbush +saltcat +saltcatch +saltcellar +salted +saltee +salten +salter +saltern +saltery +saltfat +saltfoot +salthouse +saltier +saltierra +saltierwise +Saltigradae +saltigrade +saltimbanco +saltimbank +saltimbankery +saltine +saltiness +salting +saltish +saltishly +saltishness +saltless +saltlessness +saltly +saltmaker +saltmaking +saltman +saltmouth +saltness +saltometer +saltorel +saltpan +saltpeter +saltpetrous +saltpond +saltspoon +saltspoonful +saltsprinkler +saltus +saltweed +saltwife +saltworker +saltworks +saltwort +salty +salubrify +salubrious +salubriously +salubriousness +salubrity +saluki +salung +salutarily +salutariness +salutary +salutation +salutational +salutationless +salutatious +salutatorian +salutatorily +salutatorium +salutatory +salute +saluter +salutiferous +salutiferously +Salva +salvability +salvable +salvableness +salvably +Salvadora +salvadora +Salvadoraceae +salvadoraceous +Salvadoran +Salvadorian +salvage +salvageable +salvagee +salvageproof +salvager +salvaging +Salvarsan +salvarsan +salvatella +salvation +salvational +salvationism +salvationist +salvatory +salve +salveline +Salvelinus +salver +salverform +Salvia +salvianin +salvific +salvifical +salvifically +Salvinia +Salviniaceae +salviniaceous +Salviniales +salviol +salvo +salvor +salvy +Salwey +salzfelle +Sam +sam +Samadera +samadh +samadhi +samaj +Samal +saman +Samandura +Samani +Samanid +Samantha +samara +samaria +samariform +Samaritan +Samaritaness +Samaritanism +samarium +Samarkand +samaroid +samarra +samarskite +Samas +samba +Sambal +sambal +sambaqui +sambar +Sambara +Sambathe +sambhogakaya +Sambo +sambo +Sambucaceae +Sambucus +sambuk +sambuke +sambunigrin +Samburu +same +samekh +samel +sameliness +samely +samen +sameness +samesome +Samgarnebo +samh +Samhain +samhita +Samian +samiel +Samir +samiresite +samiri +samisen +Samish +samite +samkara +samlet +sammel +sammer +sammier +Sammy +sammy +Samnani +Samnite +Samoan +Samogitian +samogonka +Samolus +Samosatenian +samothere +Samotherium +Samothracian +samovar +Samoyed +Samoyedic +samp +sampaguita +sampaloc +sampan +samphire +sampi +sample +sampleman +sampler +samplery +sampling +Sampsaean +Samsam +samsara +samshu +Samsien +samskara +Samson +samson +Samsoness +Samsonian +Samsonic +Samsonistic +samsonite +Samucan +Samucu +Samuel +samurai +Samydaceae +San +san +sanability +sanable +sanableness +sanai +Sanand +sanative +sanativeness +sanatoria +sanatorium +sanatory +Sanballat +sanbenito +Sanche +sancho +sanct +sancta +sanctanimity +sanctifiable +sanctifiableness +sanctifiably +sanctificate +sanctification +sanctified +sanctifiedly +sanctifier +sanctify +sanctifyingly +sanctilogy +sanctiloquent +sanctimonial +sanctimonious +sanctimoniously +sanctimoniousness +sanctimony +sanction +sanctionable +sanctionary +sanctionative +sanctioner +sanctionist +sanctionless +sanctionment +sanctitude +sanctity +sanctologist +Sanctology +sanctorium +sanctuaried +sanctuarize +sanctuary +sanctum +Sanctus +Sancy +sancyite +sand +sandak +sandal +sandaled +sandaliform +sandaling +sandalwood +sandalwort +sandan +sandarac +sandaracin +sandastros +Sandawe +sandbag +sandbagger +sandbank +sandbin +sandblast +sandboard +sandbox +sandboy +sandbur +sandclub +sandculture +sanded +Sandeep +Sandemanian +Sandemanianism +Sandemanism +Sander +sander +sanderling +sanders +sandfish +sandflower +sandglass +sandheat +sandhi +sandiferous +sandiness +sanding +Sandip +sandiver +sandix +sandlapper +sandless +sandlike +sandling +sandman +sandnatter +sandnecker +sandpaper +sandpaperer +sandpeep +sandpiper +sandproof +Sandra +sandrock +sandspit +sandspur +sandstay +sandstone +sandstorm +sandust +sandweed +sandweld +sandwich +sandwood +sandworm +sandwort +Sandy +sandy +sandyish +sane +sanely +saneness +Sanetch +Sanford +Sanforized +sang +sanga +Sangamon +sangar +sangaree +sangei +sanger +sangerbund +sangerfest +Sanggil +sangha +Sangho +Sangir +Sangirese +sanglant +sangley +Sangraal +sangreeroot +sangrel +sangsue +sanguicolous +sanguifacient +sanguiferous +sanguification +sanguifier +sanguifluous +sanguimotor +sanguimotory +sanguinaceous +Sanguinaria +sanguinarily +sanguinariness +sanguinary +sanguine +sanguineless +sanguinely +sanguineness +sanguineobilious +sanguineophlegmatic +sanguineous +sanguineousness +sanguineovascular +sanguinicolous +sanguiniferous +sanguinification +sanguinism +sanguinity +sanguinivorous +sanguinocholeric +sanguinolency +sanguinolent +sanguinopoietic +sanguinous +Sanguisorba +Sanguisorbaceae +sanguisuge +sanguisugent +sanguisugous +sanguivorous +Sanhedrim +Sanhedrin +Sanhedrist +Sanhita +sanicle +Sanicula +sanidine +sanidinic +sanidinite +sanies +sanification +sanify +sanious +sanipractic +sanitarian +sanitarily +sanitarist +sanitarium +sanitary +sanitate +sanitation +sanitationist +sanitist +sanitize +Sanity +sanity +sanjak +sanjakate +sanjakbeg +sanjakship +Sanjay +Sanjeev +Sanjib +sank +sankha +Sankhya +sannaite +Sannoisian +sannup +sannyasi +sannyasin +sanopurulent +sanoserous +Sanpoil +sans +Sansar +sansei +Sansevieria +sanshach +sansi +Sanskrit +Sanskritic +Sanskritist +Sanskritization +Sanskritize +sant +Santa +Santal +santal +Santalaceae +santalaceous +Santalales +Santali +santalic +santalin +santalol +Santalum +santalwood +santapee +Santee +santene +Santiago +santimi +santims +santir +Santo +Santolina +santon +santonica +santonin +santoninic +santorinite +Santos +sanukite +Sanvitalia +Sanyakoan +sao +Saoshyant +sap +sapa +sapajou +sapan +sapanwood +sapbush +sapek +Saperda +sapful +Sapharensian +saphead +sapheaded +sapheadedness +saphena +saphenal +saphenous +saphie +sapid +sapidity +sapidless +sapidness +sapience +sapiency +sapient +sapiential +sapientially +sapientize +sapiently +sapin +sapinda +Sapindaceae +sapindaceous +Sapindales +sapindaship +Sapindus +Sapium +sapiutan +saple +sapless +saplessness +sapling +saplinghood +sapo +sapodilla +sapogenin +saponaceous +saponaceousness +saponacity +Saponaria +saponarin +saponary +Saponi +saponifiable +saponification +saponifier +saponify +saponin +saponite +sapophoric +sapor +saporific +saporosity +saporous +Sapota +sapota +Sapotaceae +sapotaceous +sapote +sapotilha +sapotilla +sapotoxin +sappanwood +sappare +sapper +Sapphic +sapphic +sapphire +sapphireberry +sapphired +sapphirewing +sapphiric +sapphirine +Sapphism +Sapphist +Sappho +sappiness +sapping +sapples +sappy +sapremia +sapremic +saprine +saprocoll +saprodil +saprodontia +saprogenic +saprogenous +Saprolegnia +Saprolegniaceae +saprolegniaceous +Saprolegniales +saprolegnious +saprolite +saprolitic +sapropel +sapropelic +sapropelite +saprophagan +saprophagous +saprophile +saprophilous +saprophyte +saprophytic +saprophytically +saprophytism +saprostomous +saprozoic +sapsago +sapskull +sapsuck +sapsucker +sapucaia +sapucainha +sapwood +sapwort +Saqib +sar +Sara +saraad +sarabacan +Sarabaite +saraband +Saracen +Saracenian +Saracenic +Saracenical +Saracenism +Saracenlike +Sarada +saraf +Sarah +Sarakolet +Sarakolle +Saramaccaner +Saran +sarangi +sarangousty +Saratoga +Saratogan +Saravan +Sarawakese +sarawakite +Sarawan +sarbacane +sarbican +sarcasm +sarcasmproof +sarcast +sarcastic +sarcastical +sarcastically +sarcasticalness +sarcasticness +sarcelle +sarcenet +sarcilis +Sarcina +sarcine +sarcitis +sarcle +sarcler +sarcoadenoma +Sarcobatus +sarcoblast +sarcocarcinoma +sarcocarp +sarcocele +Sarcococca +Sarcocolla +sarcocollin +sarcocyst +Sarcocystidea +sarcocystidean +sarcocystidian +Sarcocystis +sarcocystoid +sarcocyte +sarcode +sarcoderm +Sarcodes +sarcodic +sarcodictyum +Sarcodina +sarcodous +sarcoenchondroma +sarcogenic +sarcogenous +sarcoglia +Sarcogyps +sarcoid +sarcolactic +sarcolemma +sarcolemmic +sarcolemmous +sarcoline +sarcolite +sarcologic +sarcological +sarcologist +sarcology +sarcolysis +sarcolyte +sarcolytic +sarcoma +sarcomatoid +sarcomatosis +sarcomatous +sarcomere +Sarcophaga +sarcophagal +sarcophagi +sarcophagic +sarcophagid +Sarcophagidae +sarcophagine +sarcophagize +sarcophagous +sarcophagus +sarcophagy +sarcophile +sarcophilous +Sarcophilus +sarcoplasm +sarcoplasma +sarcoplasmatic +sarcoplasmic +sarcoplast +sarcoplastic +sarcopoietic +Sarcopsylla +Sarcopsyllidae +Sarcoptes +sarcoptic +sarcoptid +Sarcoptidae +Sarcorhamphus +sarcosepsis +sarcosepta +sarcoseptum +sarcosine +sarcosis +sarcosoma +sarcosperm +sarcosporid +Sarcosporida +Sarcosporidia +sarcosporidial +sarcosporidian +sarcosporidiosis +sarcostosis +sarcostyle +sarcotheca +sarcotherapeutics +sarcotherapy +sarcotic +sarcous +Sarcura +Sard +sard +sardachate +Sardanapalian +Sardanapalus +sardel +Sardian +sardine +sardinewise +Sardinian +sardius +Sardoin +sardonic +sardonical +sardonically +sardonicism +sardonyx +sare +sargasso +Sargassum +sargassum +sargo +Sargonic +Sargonid +Sargonide +sargus +sari +sarif +Sarigue +sarigue +sarinda +sarip +sark +sarkar +sarkful +sarkical +sarkine +sarking +sarkinite +sarkit +sarkless +sarlak +sarlyk +Sarmatian +Sarmatic +sarmatier +sarment +sarmenta +sarmentaceous +sarmentiferous +sarmentose +sarmentous +sarmentum +sarna +sarod +saron +sarong +saronic +saronide +saros +Sarothamnus +Sarothra +sarothrum +sarpler +sarpo +sarra +Sarracenia +sarracenia +Sarraceniaceae +sarraceniaceous +sarracenial +Sarraceniales +sarraf +sarrazin +sarrusophone +sarrusophonist +sarsa +sarsaparilla +sarsaparillin +Sarsar +Sarsechim +sarsen +sarsenet +Sarsi +Sart +sart +sartage +sartain +Sartish +sartor +sartoriad +sartorial +sartorially +sartorian +sartorite +sartorius +Saruk +sarus +Sarvarthasiddha +sarwan +Sarzan +sasa +sasan +sasani +sasanqua +sash +sashay +sashery +sashing +sashless +sasin +sasine +saskatoon +sassaby +sassafac +sassafrack +sassafras +Sassak +Sassan +Sassanian +Sassanid +Sassanidae +Sassanide +Sassenach +sassolite +sassy +sassywood +Sastean +sat +satable +Satan +satan +Satanael +Satanas +satang +satanic +satanical +satanically +satanicalness +Satanism +Satanist +satanist +Satanistic +Satanity +satanize +Satanology +Satanophany +Satanophil +Satanophobia +Satanship +satara +satchel +satcheled +sate +sateen +sateenwood +sateless +satelles +satellitarian +satellite +satellited +satellitesimal +satellitian +satellitic +satellitious +satellitium +satellitoid +satellitory +satelloid +satiability +satiable +satiableness +satiably +satiate +satiation +Satieno +satient +satiety +satin +satinbush +satine +satined +satinette +satinfin +satinflower +satinite +satinity +satinize +satinleaf +satinlike +satinpod +satinwood +satiny +satire +satireproof +satiric +satirical +satirically +satiricalness +satirist +satirizable +satirize +satirizer +satisdation +satisdiction +satisfaction +satisfactional +satisfactionist +satisfactionless +satisfactive +satisfactorily +satisfactoriness +satisfactorious +satisfactory +satisfiable +satisfice +satisfied +satisfiedly +satisfiedness +satisfier +satisfy +satisfying +satisfyingly +satisfyingness +satispassion +satlijk +Satrae +satrap +satrapal +satrapess +satrapic +satrapical +satrapy +satron +Satsuma +sattle +sattva +satura +saturability +saturable +saturant +saturate +saturated +saturater +saturation +saturator +Saturday +Satureia +Saturn +Saturnal +Saturnale +Saturnalia +saturnalia +Saturnalian +saturnalian +Saturnia +Saturnian +saturnian +Saturnicentric +saturniid +Saturniidae +Saturnine +saturnine +saturninely +saturnineness +saturninity +saturnism +saturnity +saturnize +Saturnus +satyagrahi +satyashodak +satyr +satyresque +satyress +satyriasis +satyric +Satyridae +Satyrinae +satyrine +satyrion +satyrism +satyrlike +satyromaniac +sauce +sauceboat +saucebox +saucedish +sauceless +sauceline +saucemaker +saucemaking +sauceman +saucepan +sauceplate +saucer +saucerful +saucerleaf +saucerless +saucerlike +saucily +sauciness +saucy +Sauerbraten +sauerkraut +sauf +sauger +saugh +saughen +Saul +sauld +saulie +sault +saulter +Saulteur +saum +saumon +saumont +Saumur +Saumya +sauna +saunders +saunderswood +saunter +saunterer +sauntering +saunteringly +sauqui +saur +Saura +Sauraseni +Saurauia +Saurauiaceae +saurel +Sauria +saurian +sauriasis +sauriosis +Saurischia +saurischian +Sauroctonos +saurodont +Saurodontidae +Saurognathae +saurognathism +saurognathous +Sauromatian +saurophagous +sauropod +Sauropoda +sauropodous +sauropsid +Sauropsida +sauropsidan +sauropsidian +Sauropterygia +sauropterygian +Saurornithes +saurornithic +Saururaceae +saururaceous +Saururae +saururan +saururous +Saururus +saury +sausage +sausagelike +sausinger +Saussurea +saussurite +saussuritic +saussuritization +saussuritize +saut +saute +sauterelle +sauterne +sauternes +sauteur +sauty +Sauvagesia +sauve +sauvegarde +savable +savableness +savacu +savage +savagedom +savagely +savageness +savagerous +savagery +savagess +savagism +savagize +savanilla +savanna +Savannah +savant +Savara +savarin +savation +save +saved +saveloy +saver +Savery +savin +saving +savingly +savingness +savior +savioress +saviorhood +saviorship +Saviour +Savitar +Savitri +savola +Savonarolist +Savonnerie +savor +savored +savorer +savorily +savoriness +savoringly +savorless +savorous +savorsome +savory +savour +savoy +Savoyard +savoyed +savoying +savssat +savvy +saw +sawah +Sawaiori +sawali +Sawan +sawarra +sawback +sawbelly +sawbill +sawbones +sawbuck +sawbwa +sawder +sawdust +sawdustish +sawdustlike +sawdusty +sawed +sawer +sawfish +sawfly +sawhorse +sawing +sawish +sawlike +sawmaker +sawmaking +sawman +sawmill +sawmiller +sawmilling +sawmon +sawmont +sawn +Sawney +sawney +sawsetter +sawsharper +sawsmith +sawt +sawway +sawworker +sawwort +sawyer +sax +saxatile +saxboard +saxcornet +Saxe +saxhorn +Saxicava +saxicavous +Saxicola +saxicole +Saxicolidae +Saxicolinae +saxicoline +saxicolous +Saxifraga +Saxifragaceae +saxifragaceous +saxifragant +saxifrage +saxifragous +saxifrax +saxigenous +Saxish +Saxon +Saxondom +Saxonian +Saxonic +Saxonical +Saxonically +Saxonish +Saxonism +Saxonist +saxonite +Saxonization +Saxonize +Saxonly +Saxony +saxophone +saxophonist +saxotromba +saxpence +saxten +saxtie +saxtuba +say +saya +sayability +sayable +sayableness +Sayal +sayer +sayette +sayid +saying +sazen +Sbaikian +sblood +sbodikins +scab +scabbard +scabbardless +scabbed +scabbedness +scabbery +scabbily +scabbiness +scabble +scabbler +scabbling +scabby +scabellum +scaberulous +scabid +scabies +scabietic +scabinus +Scabiosa +scabiosity +scabious +scabish +scabland +scabrate +scabrescent +scabrid +scabridity +scabridulous +scabrities +scabriusculose +scabriusculous +scabrosely +scabrous +scabrously +scabrousness +scabwort +scacchic +scacchite +scad +scaddle +scads +Scaean +scaff +scaffer +scaffery +scaffie +scaffle +scaffold +scaffoldage +scaffolder +scaffolding +scaglia +scagliola +scagliolist +scala +scalable +scalableness +scalably +scalage +scalar +scalare +Scalaria +scalarian +scalariform +Scalariidae +scalarwise +scalation +scalawag +scalawaggery +scalawaggy +scald +scaldberry +scalded +scalder +scaldfish +scaldic +scalding +scaldweed +scaldy +scale +scaleback +scalebark +scaleboard +scaled +scaledrake +scalefish +scaleful +scaleless +scalelet +scalelike +scaleman +scalena +scalene +scalenohedral +scalenohedron +scalenon +scalenous +scalenum +scalenus +scalepan +scaleproof +scaler +scales +scalesman +scalesmith +scaletail +scalewing +scalewise +scalework +scalewort +scaliger +scaliness +scaling +scall +scalled +scallion +scallola +scallom +scallop +scalloper +scalloping +scallopwise +scalma +scaloni +Scalops +Scalopus +scalp +scalpeen +scalpel +scalpellar +scalpellic +scalpellum +scalpellus +scalper +scalping +scalpless +scalpriform +scalprum +scalpture +scalt +scaly +scalytail +scam +scamander +Scamandrius +scamble +scambler +scambling +scamell +scamler +scamles +scammoniate +scammonin +scammony +scammonyroot +scamp +scampavia +scamper +scamperer +scamphood +scamping +scampingly +scampish +scampishly +scampishness +scampsman +scan +scandal +scandalization +scandalize +scandalizer +scandalmonger +scandalmongering +scandalmongery +scandalmonging +scandalous +scandalously +scandalousness +scandalproof +scandaroon +scandent +scandia +Scandian +scandic +scandicus +Scandinavia +Scandinavian +Scandinavianism +scandium +Scandix +Scania +Scanian +Scanic +scanmag +scannable +scanner +scanning +scanningly +scansion +scansionist +Scansores +scansorial +scansorious +scant +scanties +scantily +scantiness +scantity +scantle +scantling +scantlinged +scantly +scantness +scanty +scap +scape +scapegallows +scapegoat +scapegoatism +scapegrace +scapel +scapeless +scapement +scapethrift +scapha +Scaphander +Scaphandridae +scaphion +Scaphiopodidae +Scaphiopus +scaphism +scaphite +Scaphites +Scaphitidae +scaphitoid +scaphocephalic +scaphocephalism +scaphocephalous +scaphocephalus +scaphocephaly +scaphocerite +scaphoceritic +scaphognathite +scaphognathitic +scaphoid +scapholunar +scaphopod +Scaphopoda +scaphopodous +scapiform +scapigerous +scapoid +scapolite +scapolitization +scapose +scapple +scappler +scapula +scapulalgia +scapular +scapulare +scapulary +scapulated +scapulectomy +scapulet +scapulimancy +scapuloaxillary +scapulobrachial +scapuloclavicular +scapulocoracoid +scapulodynia +scapulohumeral +scapulopexy +scapuloradial +scapulospinal +scapulothoracic +scapuloulnar +scapulovertebral +scapus +scar +scarab +scarabaean +scarabaei +scarabaeid +Scarabaeidae +scarabaeidoid +scarabaeiform +Scarabaeinae +scarabaeoid +scarabaeus +scarabee +scaraboid +Scaramouch +scaramouch +scarce +scarcelins +scarcely +scarcement +scarcen +scarceness +scarcity +scare +scarebabe +scarecrow +scarecrowish +scarecrowy +scareful +scarehead +scaremonger +scaremongering +scareproof +scarer +scaresome +scarf +scarface +scarfed +scarfer +scarflike +scarfpin +scarfskin +scarfwise +scarfy +scarid +Scaridae +scarification +scarificator +scarifier +scarify +scarily +scariose +scarious +scarlatina +scarlatinal +scarlatiniform +scarlatinoid +scarlatinous +scarless +scarlet +scarletberry +scarletseed +scarlety +scarman +scarn +scaroid +scarp +scarpines +scarping +scarpment +scarproof +scarred +scarrer +scarring +scarry +scart +scarth +Scarus +scarus +scarved +scary +scase +scasely +scat +scatch +scathe +scatheful +scatheless +scathelessly +scathing +scathingly +Scaticook +scatland +scatologia +scatologic +scatological +scatology +scatomancy +scatophagid +Scatophagidae +scatophagoid +scatophagous +scatophagy +scatoscopy +scatter +scatterable +scatteration +scatteraway +scatterbrain +scatterbrained +scatterbrains +scattered +scatteredly +scatteredness +scatterer +scattergood +scattering +scatteringly +scatterling +scattermouch +scattery +scatty +scatula +scaturient +scaul +scaum +scaup +scauper +scaur +scaurie +scaut +scavage +scavel +scavenage +scavenge +scavenger +scavengerism +scavengership +scavengery +scavenging +scaw +scawd +scawl +scazon +scazontic +sceat +scelalgia +scelerat +scelidosaur +scelidosaurian +scelidosauroid +Scelidosaurus +Scelidotherium +Sceliphron +sceloncus +Sceloporus +scelotyrbe +scena +scenario +scenarioist +scenarioization +scenarioize +scenarist +scenarization +scenarize +scenary +scend +scene +scenecraft +Scenedesmus +sceneful +sceneman +scenery +sceneshifter +scenewright +scenic +scenical +scenically +scenist +scenite +scenograph +scenographer +scenographic +scenographical +scenographically +scenography +Scenopinidae +scent +scented +scenter +scentful +scenting +scentless +scentlessness +scentproof +scentwood +scepsis +scepter +scepterdom +sceptered +scepterless +sceptic +sceptral +sceptropherous +sceptrosophy +sceptry +scerne +sceuophorion +sceuophylacium +sceuophylax +schaapsteker +Schaefferia +schairerite +schalmei +schalmey +schalstein +schanz +schapbachite +schappe +schapped +schapping +scharf +Scharlachberger +schatchen +Scheat +Schedar +schediasm +schediastic +Schedius +schedular +schedulate +schedule +schedulize +scheelite +scheffel +schefferite +schelling +Schellingian +Schellingianism +Schellingism +schelly +scheltopusik +schema +schemata +schematic +schematically +schematism +schematist +schematization +schematize +schematizer +schematogram +schematograph +schematologetically +schematomancy +schematonics +scheme +schemeful +schemeless +schemer +schemery +scheming +schemingly +schemist +schemy +schene +schepel +schepen +scherm +scherzando +scherzi +scherzo +schesis +Scheuchzeria +Scheuchzeriaceae +scheuchzeriaceous +schiavone +Schiedam +schiffli +schiller +schillerfels +schillerization +schillerize +schilling +schimmel +schindylesis +schindyletic +Schinus +schipperke +Schisandra +Schisandraceae +schism +schisma +schismatic +schismatical +schismatically +schismaticalness +schismatism +schismatist +schismatize +schismic +schismless +schist +schistaceous +schistic +schistocelia +schistocephalus +Schistocerca +schistocoelia +schistocormia +schistocormus +schistocyte +schistocytosis +schistoglossia +schistoid +schistomelia +schistomelus +schistoprosopia +schistoprosopus +schistorrhachis +schistoscope +schistose +schistosity +Schistosoma +schistosome +schistosomia +schistosomiasis +schistosomus +schistosternia +schistothorax +schistous +schistus +Schizaea +Schizaeaceae +schizaeaceous +Schizanthus +schizanthus +schizaxon +schizocarp +schizocarpic +schizocarpous +schizochroal +schizocoele +schizocoelic +schizocoelous +schizocyte +schizocytosis +schizodinic +schizogamy +schizogenesis +schizogenetic +schizogenetically +schizogenic +schizogenous +schizogenously +schizognath +Schizognathae +schizognathism +schizognathous +schizogonic +schizogony +Schizogregarinae +schizogregarine +Schizogregarinida +schizoid +schizoidism +Schizolaenaceae +schizolaenaceous +schizolite +schizolysigenous +Schizomeria +schizomycete +Schizomycetes +schizomycetic +schizomycetous +schizomycosis +Schizonemertea +schizonemertean +schizonemertine +Schizoneura +Schizonotus +schizont +schizopelmous +Schizopetalon +schizophasia +Schizophragma +schizophrene +schizophrenia +schizophreniac +schizophrenic +Schizophyceae +Schizophyllum +Schizophyta +schizophyte +schizophytic +schizopod +Schizopoda +schizopodal +schizopodous +schizorhinal +schizospore +schizostele +schizostelic +schizostely +schizothecal +schizothoracic +schizothyme +schizothymia +schizothymic +schizotrichia +Schizotrypanum +schiztic +Schlauraffenland +Schleichera +schlemiel +schlemihl +schlenter +schlieren +schlieric +schloop +Schmalkaldic +schmaltz +schmelz +schmelze +schnabel +Schnabelkanne +schnapper +schnapps +schnauzer +schneider +Schneiderian +schnitzel +schnorchel +schnorkel +schnorrer +scho +schochat +schochet +schoenobatic +schoenobatist +Schoenocaulon +Schoenus +schoenus +Schoharie +schola +scholae +scholaptitude +scholar +scholarch +scholardom +scholarian +scholarism +scholarless +scholarlike +scholarliness +scholarly +scholarship +scholasm +scholastic +scholastical +scholastically +scholasticate +scholasticism +scholasticly +scholia +scholiast +scholiastic +scholion +scholium +Schomburgkia +schone +schonfelsite +Schoodic +School +school +schoolable +schoolbag +schoolbook +schoolbookish +schoolboy +schoolboydom +schoolboyhood +schoolboyish +schoolboyishly +schoolboyishness +schoolboyism +schoolbutter +schoolcraft +schooldame +schooldom +schooled +schoolery +schoolfellow +schoolfellowship +schoolful +schoolgirl +schoolgirlhood +schoolgirlish +schoolgirlishly +schoolgirlishness +schoolgirlism +schoolgirly +schoolgoing +schoolhouse +schooling +schoolingly +schoolish +schoolkeeper +schoolkeeping +schoolless +schoollike +schoolmaam +schoolmaamish +schoolmaid +schoolman +schoolmaster +schoolmasterhood +schoolmastering +schoolmasterish +schoolmasterishly +schoolmasterishness +schoolmasterism +schoolmasterly +schoolmastership +schoolmastery +schoolmate +schoolmiss +schoolmistress +schoolmistressy +schoolroom +schoolteacher +schoolteacherish +schoolteacherly +schoolteachery +schoolteaching +schooltide +schooltime +schoolward +schoolwork +schoolyard +schoon +schooner +Schopenhauereanism +Schopenhauerian +Schopenhauerism +schoppen +schorenbergite +schorl +schorlaceous +schorlomite +schorlous +schorly +schottische +schottish +schout +schraubthaler +Schrebera +schreiner +schreinerize +schriesheimite +Schrund +schtoff +schuh +schuhe +schuit +schule +schultenite +schungite +schuss +schute +schwa +schwabacher +Schwalbea +schwarz +Schwarzian +schweizer +schweizerkase +Schwendenerian +Schwenkfelder +Schwenkfeldian +Sciadopitys +Sciaena +sciaenid +Sciaenidae +sciaeniform +Sciaeniformes +sciaenoid +scialytic +sciamachy +Scian +sciapod +sciapodous +Sciara +sciarid +Sciaridae +Sciarinae +sciatheric +sciatherical +sciatherically +sciatic +sciatica +sciatical +sciatically +sciaticky +scibile +science +scienced +scient +sciential +scientician +scientific +scientifical +scientifically +scientificalness +scientificogeographical +scientificohistorical +scientificophilosophical +scientificopoetic +scientificoreligious +scientificoromantic +scientintically +scientism +Scientist +scientist +scientistic +scientistically +scientize +scientolism +scilicet +Scilla +scillain +scillipicrin +Scillitan +scillitin +scillitoxin +Scillonian +scimitar +scimitared +scimitarpod +scincid +Scincidae +scincidoid +scinciform +scincoid +scincoidian +Scincomorpha +Scincus +scind +sciniph +scintilla +scintillant +scintillantly +scintillate +scintillating +scintillatingly +scintillation +scintillator +scintillescent +scintillize +scintillometer +scintilloscope +scintillose +scintillously +scintle +scintler +scintling +sciograph +sciographic +sciography +sciolism +sciolist +sciolistic +sciolous +sciomachiology +sciomachy +sciomancy +sciomantic +scion +sciophilous +sciophyte +scioptic +sciopticon +scioptics +scioptric +sciosophist +sciosophy +Sciot +scioterical +scioterique +sciotheism +sciotheric +sciotherical +sciotherically +scious +scirenga +Scirophoria +Scirophorion +Scirpus +scirrhi +scirrhogastria +scirrhoid +scirrhoma +scirrhosis +scirrhous +scirrhus +scirrosity +scirtopod +Scirtopoda +scirtopodous +scissel +scissible +scissile +scission +scissiparity +scissor +scissorbill +scissorbird +scissorer +scissoring +scissorium +scissorlike +scissorlikeness +scissors +scissorsbird +scissorsmith +scissorstail +scissortail +scissorwise +scissura +scissure +Scissurella +scissurellid +Scissurellidae +Scitaminales +Scitamineae +sciurid +Sciuridae +sciurine +sciuroid +sciuromorph +Sciuromorpha +sciuromorphic +Sciuropterus +Sciurus +sclaff +sclate +sclater +Sclav +Sclavonian +sclaw +scler +sclera +scleral +scleranth +Scleranthaceae +Scleranthus +scleratogenous +sclere +sclerectasia +sclerectomy +scleredema +sclereid +sclerema +sclerencephalia +sclerenchyma +sclerenchymatous +sclerenchyme +sclererythrin +scleretinite +Scleria +scleriasis +sclerification +sclerify +sclerite +scleritic +scleritis +sclerized +sclerobase +sclerobasic +scleroblast +scleroblastema +scleroblastemic +scleroblastic +sclerocauly +sclerochorioiditis +sclerochoroiditis +scleroconjunctival +scleroconjunctivitis +sclerocornea +sclerocorneal +sclerodactylia +sclerodactyly +scleroderm +Scleroderma +scleroderma +Sclerodermaceae +Sclerodermata +Sclerodermatales +sclerodermatitis +sclerodermatous +Sclerodermi +sclerodermia +sclerodermic +sclerodermite +sclerodermitic +sclerodermitis +sclerodermous +sclerogen +Sclerogeni +sclerogenoid +sclerogenous +scleroid +scleroiritis +sclerokeratitis +sclerokeratoiritis +scleroma +scleromata +scleromeninx +scleromere +sclerometer +sclerometric +scleronychia +scleronyxis +Scleropages +Scleroparei +sclerophthalmia +sclerophyll +sclerophyllous +sclerophylly +scleroprotein +sclerosal +sclerosarcoma +Scleroscope +scleroscope +sclerose +sclerosed +scleroseptum +sclerosis +scleroskeletal +scleroskeleton +Sclerospora +sclerostenosis +Sclerostoma +sclerostomiasis +sclerotal +sclerote +sclerotia +sclerotial +sclerotic +sclerotica +sclerotical +scleroticectomy +scleroticochorioiditis +scleroticochoroiditis +scleroticonyxis +scleroticotomy +Sclerotinia +sclerotinial +sclerotiniose +sclerotioid +sclerotitic +sclerotitis +sclerotium +sclerotized +sclerotoid +sclerotome +sclerotomic +sclerotomy +sclerous +scleroxanthin +sclerozone +scliff +sclim +sclimb +scoad +scob +scobby +scobicular +scobiform +scobs +scoff +scoffer +scoffery +scoffing +scoffingly +scoffingstock +scofflaw +scog +scoggan +scogger +scoggin +scogginism +scogginist +scoinson +scoke +scolb +scold +scoldable +scoldenore +scolder +scolding +scoldingly +scoleces +scoleciasis +scolecid +Scolecida +scoleciform +scolecite +scolecoid +scolecology +scolecophagous +scolecospore +scoleryng +scolex +Scolia +scolia +scolices +scoliid +Scoliidae +scoliograptic +scoliokyposis +scoliometer +scolion +scoliorachitic +scoliosis +scoliotic +scoliotone +scolite +scollop +scolog +scolopaceous +Scolopacidae +scolopacine +Scolopax +Scolopendra +scolopendra +Scolopendrella +Scolopendrellidae +scolopendrelloid +scolopendrid +Scolopendridae +scolopendriform +scolopendrine +Scolopendrium +scolopendroid +scolophore +scolopophore +Scolymus +scolytid +Scolytidae +scolytoid +Scolytus +Scomber +scomberoid +Scombresocidae +Scombresox +scombrid +Scombridae +scombriform +Scombriformes +scombrine +scombroid +Scombroidea +scombroidean +scombrone +sconce +sconcer +sconcheon +sconcible +scone +scoon +scoop +scooped +scooper +scoopful +scooping +scoopingly +scoot +scooter +scopa +scoparin +scoparius +scopate +scope +scopeless +scopelid +Scopelidae +scopeliform +scopelism +scopeloid +Scopelus +scopet +scopic +Scopidae +scopiferous +scopiform +scopiformly +scopine +scopiped +scopola +scopolamine +scopoleine +scopoletin +scopoline +scopperil +scops +scoptical +scoptically +scoptophilia +scoptophiliac +scoptophilic +scoptophobia +scopula +Scopularia +scopularian +scopulate +scopuliferous +scopuliform +scopuliped +Scopulipedes +scopulite +scopulous +scopulousness +Scopus +scorbute +scorbutic +scorbutical +scorbutically +scorbutize +scorbutus +scorch +scorched +scorcher +scorching +scorchingly +scorchingness +scorchproof +score +scoreboard +scorebook +scored +scorekeeper +scorekeeping +scoreless +scorer +scoria +scoriac +scoriaceous +scoriae +scorification +scorifier +scoriform +scorify +scoring +scorious +scorn +scorned +scorner +scornful +scornfully +scornfulness +scorningly +scornproof +scorny +scorodite +Scorpaena +scorpaenid +Scorpaenidae +scorpaenoid +scorpene +scorper +Scorpidae +Scorpididae +Scorpii +Scorpiid +Scorpio +scorpioid +scorpioidal +Scorpioidea +scorpion +Scorpiones +scorpionic +scorpionid +Scorpionida +Scorpionidea +Scorpionis +scorpionweed +scorpionwort +Scorpiurus +Scorpius +scorse +scortation +scortatory +Scorzonera +Scot +scot +scotale +Scotch +scotch +scotcher +Scotchery +Scotchification +Scotchify +Scotchiness +scotching +Scotchman +scotchman +Scotchness +Scotchwoman +Scotchy +scote +scoter +scoterythrous +Scotia +scotia +Scotic +scotino +Scotism +Scotist +Scotistic +Scotistical +Scotize +Scotlandwards +scotodinia +scotogram +scotograph +scotographic +scotography +scotoma +scotomata +scotomatic +scotomatical +scotomatous +scotomia +scotomic +scotomy +scotophobia +scotopia +scotopic +scotoscope +scotosis +Scots +Scotsman +Scotswoman +Scott +Scotticism +Scotticize +Scottie +Scottification +Scottify +Scottish +Scottisher +Scottishly +Scottishman +Scottishness +Scotty +scouch +scouk +scoundrel +scoundreldom +scoundrelish +scoundrelism +scoundrelly +scoundrelship +scoup +scour +scourage +scoured +scourer +scouress +scourfish +scourge +scourger +scourging +scourgingly +scouriness +scouring +scourings +scourway +scourweed +scourwort +scoury +scouse +scout +scoutcraft +scoutdom +scouter +scouth +scouther +scouthood +scouting +scoutingly +scoutish +scoutmaster +scoutwatch +scove +scovel +scovillite +scovy +scow +scowbank +scowbanker +scowder +scowl +scowler +scowlful +scowling +scowlingly +scowlproof +scowman +scrab +scrabble +scrabbled +scrabbler +scrabe +scrae +scraffle +scrag +scragged +scraggedly +scraggedness +scragger +scraggily +scragginess +scragging +scraggled +scraggling +scraggly +scraggy +scraily +scram +scramasax +scramble +scramblement +scrambler +scrambling +scramblingly +scrambly +scrampum +scran +scranch +scrank +scranky +scrannel +scranning +scranny +scrap +scrapable +scrapbook +scrape +scrapeage +scraped +scrapepenny +scraper +scrapie +scraping +scrapingly +scrapler +scraplet +scrapling +scrapman +scrapmonger +scrappage +scrapped +scrapper +scrappet +scrappily +scrappiness +scrapping +scrappingly +scrapple +scrappler +scrappy +scrapworks +scrapy +scrat +scratch +scratchable +scratchably +scratchback +scratchboard +scratchbrush +scratchcard +scratchcarding +scratchcat +scratcher +scratches +scratchification +scratchiness +scratching +scratchingly +scratchless +scratchlike +scratchman +scratchproof +scratchweed +scratchwork +scratchy +scrath +scratter +scrattle +scrattling +scrauch +scrauchle +scraunch +scraw +scrawk +scrawl +scrawler +scrawliness +scrawly +scrawm +scrawnily +scrawniness +scrawny +scray +scraze +screak +screaking +screaky +scream +screamer +screaminess +screaming +screamingly +screamproof +screamy +scree +screech +screechbird +screecher +screechily +screechiness +screeching +screechingly +screechy +screed +screek +screel +screeman +screen +screenable +screenage +screencraft +screendom +screened +screener +screening +screenless +screenlike +screenman +screenplay +screensman +screenwise +screenwork +screenwriter +screeny +screet +screeve +screeved +screever +screich +screigh +screve +screver +screw +screwable +screwage +screwball +screwbarrel +screwdrive +screwdriver +screwed +screwer +screwhead +screwiness +screwing +screwish +screwless +screwlike +screwman +screwmatics +screwship +screwsman +screwstem +screwstock +screwwise +screwworm +screwy +scribable +scribacious +scribaciousness +scribal +scribatious +scribatiousness +scribblage +scribblative +scribblatory +scribble +scribbleable +scribbled +scribbledom +scribbleism +scribblemania +scribblement +scribbleomania +scribbler +scribbling +scribblingly +scribbly +scribe +scriber +scribeship +scribing +scribism +scribophilous +scride +scrieve +scriever +scriggle +scriggler +scriggly +scrike +scrim +scrime +scrimer +scrimmage +scrimmager +scrimp +scrimped +scrimpily +scrimpiness +scrimpingly +scrimply +scrimpness +scrimption +scrimpy +scrimshander +scrimshandy +scrimshank +scrimshanker +scrimshaw +scrimshon +scrimshorn +scrin +scrinch +scrine +scringe +scriniary +scrip +scripee +scripless +scrippage +script +scription +scriptitious +scriptitiously +scriptitory +scriptive +scriptor +scriptorial +scriptorium +scriptory +scriptural +Scripturalism +scripturalism +Scripturalist +scripturalist +Scripturality +scripturality +scripturalize +scripturally +scripturalness +Scripturarian +Scripture +scripture +Scriptured +scriptured +Scriptureless +scripturiency +scripturient +Scripturism +scripturism +Scripturist +scripula +scripulum +scritch +scritoire +scrivaille +scrive +scrivello +scriven +scrivener +scrivenership +scrivenery +scrivening +scrivenly +scriver +scrob +scrobble +scrobe +scrobicula +scrobicular +scrobiculate +scrobiculated +scrobicule +scrobiculus +scrobis +scrod +scrodgill +scroff +scrofula +scrofularoot +scrofulaweed +scrofulide +scrofulism +scrofulitic +scrofuloderm +scrofuloderma +scrofulorachitic +scrofulosis +scrofulotuberculous +scrofulous +scrofulously +scrofulousness +scrog +scroggy +scrolar +scroll +scrolled +scrollery +scrollhead +scrollwise +scrollwork +scrolly +scronach +scroo +scrooch +scrooge +scroop +Scrophularia +Scrophulariaceae +scrophulariaceous +scrota +scrotal +scrotectomy +scrotiform +scrotitis +scrotocele +scrotofemoral +scrotum +scrouge +scrouger +scrounge +scrounger +scrounging +scrout +scrow +scroyle +scrub +scrubbable +scrubbed +scrubber +scrubbery +scrubbily +scrubbiness +scrubbird +scrubbly +scrubboard +scrubby +scrubgrass +scrubland +scrubwood +scruf +scruff +scruffle +scruffman +scruffy +scruft +scrum +scrummage +scrummager +scrump +scrumple +scrumption +scrumptious +scrumptiously +scrumptiousness +scrunch +scrunchy +scrunge +scrunger +scrunt +scruple +scrupleless +scrupler +scruplesome +scruplesomeness +scrupula +scrupular +scrupuli +scrupulist +scrupulosity +scrupulous +scrupulously +scrupulousness +scrupulum +scrupulus +scrush +scrutability +scrutable +scrutate +scrutation +scrutator +scrutatory +scrutinant +scrutinate +scrutineer +scrutinization +scrutinize +scrutinizer +scrutinizingly +scrutinous +scrutinously +scrutiny +scruto +scrutoire +scruze +scry +scryer +scud +scuddaler +scuddawn +scudder +scuddick +scuddle +scuddy +scudi +scudler +scudo +scuff +scuffed +scuffer +scuffle +scuffler +scufflingly +scuffly +scuffy +scuft +scufter +scug +scuggery +sculch +sculduddery +scull +sculler +scullery +scullful +scullion +scullionish +scullionize +scullionship +scullog +sculp +sculper +sculpin +sculpt +sculptile +sculptitory +sculptograph +sculptography +Sculptor +sculptor +Sculptorid +sculptress +sculptural +sculpturally +sculpturation +sculpture +sculptured +sculpturer +sculpturesque +sculpturesquely +sculpturesqueness +sculpturing +sculsh +scum +scumber +scumble +scumbling +scumboard +scumfish +scumless +scumlike +scummed +scummer +scumming +scummy +scumproof +scun +scuncheon +scunder +scunner +scup +scupful +scuppaug +scupper +scuppernong +scuppet +scuppler +scur +scurdy +scurf +scurfer +scurfily +scurfiness +scurflike +scurfy +scurrier +scurrile +scurrilist +scurrility +scurrilize +scurrilous +scurrilously +scurrilousness +scurry +scurvied +scurvily +scurviness +scurvish +scurvy +scurvyweed +scusation +scuse +scut +scuta +scutage +scutal +scutate +scutated +scutatiform +scutation +scutch +scutcheon +scutcheoned +scutcheonless +scutcheonlike +scutcheonwise +scutcher +scutching +scute +scutel +scutella +scutellae +scutellar +Scutellaria +scutellarin +scutellate +scutellated +scutellation +scutellerid +Scutelleridae +scutelliform +scutelligerous +scutelliplantar +scutelliplantation +scutellum +scutibranch +Scutibranchia +scutibranchian +scutibranchiate +scutifer +scutiferous +scutiform +scutiger +Scutigera +scutigeral +Scutigeridae +scutigerous +scutiped +scutter +scuttle +scuttlebutt +scuttleful +scuttleman +scuttler +scuttling +scuttock +scutty +scutula +scutular +scutulate +scutulated +scutulum +Scutum +scutum +scybala +scybalous +scybalum +scye +scyelite +Scyld +Scylla +Scyllaea +Scyllaeidae +scyllarian +Scyllaridae +scyllaroid +Scyllarus +Scyllidae +Scylliidae +scyllioid +Scylliorhinidae +scylliorhinoid +Scylliorhinus +scyllite +scyllitol +Scyllium +scypha +scyphae +scyphate +scyphi +scyphiferous +scyphiform +scyphiphorous +scyphistoma +scyphistomae +scyphistomoid +scyphistomous +scyphoi +scyphomancy +Scyphomedusae +scyphomedusan +scyphomedusoid +scyphophore +Scyphophori +scyphophorous +scyphopolyp +scyphose +scyphostoma +Scyphozoa +scyphozoan +scyphula +scyphulus +scyphus +scyt +scytale +Scyth +scythe +scytheless +scythelike +scytheman +scythesmith +scythestone +scythework +Scythian +Scythic +Scythize +scytitis +scytoblastema +scytodepsic +Scytonema +Scytonemataceae +scytonemataceous +scytonematoid +scytonematous +Scytopetalaceae +scytopetalaceous +Scytopetalum +sdeath +sdrucciola +se +sea +seabeach +seabeard +Seabee +seaberry +seaboard +seaborderer +seabound +seacannie +seacatch +seacoast +seaconny +seacraft +seacrafty +seacunny +seadog +seadrome +seafardinger +seafare +seafarer +seafaring +seaflood +seaflower +seafolk +Seaforthia +seafowl +Seaghan +seagirt +seagoer +seagoing +seah +seahound +seak +seal +sealable +sealant +sealch +sealed +sealer +sealery +sealess +sealet +sealette +sealflower +sealike +sealine +sealing +sealless +seallike +sealskin +sealwort +Sealyham +seam +seaman +seamancraft +seamanite +seamanlike +seamanly +seamanship +seamark +Seamas +seambiter +seamed +seamer +seaminess +seaming +seamless +seamlessly +seamlessness +seamlet +seamlike +seamost +seamrend +seamrog +seamster +seamstress +Seamus +seamy +Sean +seance +seapiece +seaplane +seaport +seaquake +sear +searce +searcer +search +searchable +searchableness +searchant +searcher +searcheress +searcherlike +searchership +searchful +searching +searchingly +searchingness +searchless +searchlight +searchment +searcloth +seared +searedness +searer +searing +searlesite +searness +seary +Seasan +seascape +seascapist +seascout +seascouting +seashine +seashore +seasick +seasickness +seaside +seasider +season +seasonable +seasonableness +seasonably +seasonal +seasonality +seasonally +seasonalness +seasoned +seasonedly +seasoner +seasoning +seasoninglike +seasonless +seastrand +seastroke +seat +seatang +seated +seater +seathe +seating +seatless +seatrain +seatron +seatsman +seatwork +seave +seavy +seawant +seaward +seawardly +seaware +seaway +seaweed +seaweedy +seawife +seawoman +seaworn +seaworthiness +seaworthy +seax +Seba +sebacate +sebaceous +sebacic +sebait +Sebastian +sebastianite +Sebastichthys +Sebastodes +sebate +sebesten +sebiferous +sebific +sebilla +sebiparous +sebkha +sebolith +seborrhagia +seborrhea +seborrheal +seborrheic +seborrhoic +Sebright +sebum +sebundy +sec +secability +secable +Secale +secalin +secaline +secalose +Secamone +secancy +secant +secantly +secateur +secede +Seceder +seceder +secern +secernent +secernment +secesh +secesher +Secessia +Secession +secession +Secessional +secessional +secessionalist +Secessiondom +secessioner +secessionism +secessionist +sech +Sechium +Sechuana +seck +Seckel +seclude +secluded +secludedly +secludedness +secluding +secluse +seclusion +seclusionist +seclusive +seclusively +seclusiveness +secodont +secohm +secohmmeter +second +secondar +secondarily +secondariness +secondary +seconde +seconder +secondhand +secondhanded +secondhandedly +secondhandedness +secondly +secondment +secondness +secos +secpar +secque +secre +secrecy +secret +secreta +secretage +secretagogue +secretarial +secretarian +Secretariat +secretariat +secretariate +secretary +secretaryship +secrete +secretin +secretion +secretional +secretionary +secretitious +secretive +secretively +secretiveness +secretly +secretmonger +secretness +secreto +secretomotor +secretor +secretory +secretum +sect +sectarial +sectarian +sectarianism +sectarianize +sectarianly +sectarism +sectarist +sectary +sectator +sectile +sectility +section +sectional +sectionalism +sectionalist +sectionality +sectionalization +sectionalize +sectionally +sectionary +sectionist +sectionize +sectioplanography +sectism +sectist +sectiuncle +sective +sector +sectoral +sectored +sectorial +sectroid +sectwise +secular +secularism +secularist +secularistic +secularity +secularization +secularize +secularizer +secularly +secularness +secund +secundate +secundation +secundiflorous +secundigravida +secundine +secundipara +secundiparity +secundiparous +secundly +secundogeniture +secundoprimary +secundus +securable +securance +secure +securely +securement +secureness +securer +securicornate +securifer +Securifera +securiferous +securiform +Securigera +securigerous +securitan +security +Sedaceae +Sedan +sedan +Sedang +sedanier +Sedat +sedate +sedately +sedateness +sedation +sedative +sedent +Sedentaria +sedentarily +sedentariness +sedentary +sedentation +Seder +sederunt +sedge +sedged +sedgelike +sedging +sedgy +sedigitate +sedigitated +sedile +sedilia +sediment +sedimental +sedimentarily +sedimentary +sedimentate +sedimentation +sedimentous +sedimetric +sedimetrical +sedition +seditionary +seditionist +seditious +seditiously +seditiousness +sedjadeh +Sedovic +seduce +seduceable +seducee +seducement +seducer +seducible +seducing +seducingly +seducive +seduct +seduction +seductionist +seductive +seductively +seductiveness +seductress +sedulity +sedulous +sedulously +sedulousness +Sedum +sedum +see +seeable +seeableness +Seebeck +seecatch +seech +seed +seedage +seedbed +seedbird +seedbox +seedcake +seedcase +seedeater +seeded +Seeder +seeder +seedful +seedgall +seedily +seediness +seedkin +seedless +seedlessness +seedlet +seedlike +seedling +seedlip +seedman +seedness +seedsman +seedstalk +seedtime +seedy +seege +seeing +seeingly +seeingness +seek +seeker +Seekerism +seeking +seel +seelful +seely +seem +seemable +seemably +seemer +seeming +seemingly +seemingness +seemless +seemlihead +seemlily +seemliness +seemly +seen +seenie +Seenu +seep +seepage +seeped +seepweed +seepy +seer +seerband +seercraft +seeress +seerfish +seerhand +seerhood +seerlike +seerpaw +seership +seersucker +seesaw +seesawiness +seesee +seethe +seething +seethingly +seetulputty +Sefekhet +seg +seggar +seggard +segged +seggrom +Seginus +segment +segmental +segmentally +segmentary +segmentate +segmentation +segmented +sego +segol +segolate +segreant +segregable +segregant +segregate +segregateness +segregation +segregational +segregationist +segregative +segregator +Sehyo +seiche +Seid +Seidel +seidel +Seidlitz +seigneur +seigneurage +seigneuress +seigneurial +seigneury +seignior +seigniorage +seignioral +seignioralty +seigniorial +seigniority +seigniorship +seigniory +seignorage +seignoral +seignorial +seignorize +seignory +seilenoi +seilenos +seine +seiner +seirospore +seirosporic +seise +seism +seismal +seismatical +seismetic +seismic +seismically +seismicity +seismism +seismochronograph +seismogram +seismograph +seismographer +seismographic +seismographical +seismography +seismologic +seismological +seismologically +seismologist +seismologue +seismology +seismometer +seismometric +seismometrical +seismometrograph +seismometry +seismomicrophone +seismoscope +seismoscopic +seismotectonic +seismotherapy +seismotic +seit +seity +Seiurus +Seiyuhonto +Seiyukai +seizable +seize +seizer +seizin +seizing +seizor +seizure +sejant +sejoin +sejoined +sejugate +sejugous +sejunct +sejunctive +sejunctively +sejunctly +Sekane +Sekani +Sekar +Seker +Sekhwan +sekos +selachian +Selachii +selachoid +Selachoidei +Selachostome +Selachostomi +selachostomous +seladang +Selaginaceae +Selaginella +Selaginellaceae +selaginellaceous +selagite +Selago +selah +selamin +selamlik +selbergite +Selbornian +seldom +seldomcy +seldomer +seldomly +seldomness +seldor +seldseen +sele +select +selectable +selected +selectedly +selectee +selection +selectionism +selectionist +selective +selectively +selectiveness +selectivity +selectly +selectman +selectness +selector +Selena +selenate +Selene +selenian +seleniate +selenic +Selenicereus +selenide +Selenidera +seleniferous +selenigenous +selenion +selenious +Selenipedium +selenite +selenitic +selenitical +selenitiferous +selenitish +selenium +seleniuret +selenobismuthite +selenocentric +selenodont +Selenodonta +selenodonty +selenograph +selenographer +selenographic +selenographical +selenographically +selenographist +selenography +selenolatry +selenological +selenologist +selenology +selenomancy +selenoscope +selenosis +selenotropic +selenotropism +selenotropy +selensilver +selensulphur +Seleucian +Seleucid +Seleucidae +Seleucidan +Seleucidean +Seleucidian +Seleucidic +self +selfcide +selfdom +selfful +selffulness +selfheal +selfhood +selfish +selfishly +selfishness +selfism +selfist +selfless +selflessly +selflessness +selfly +selfness +selfpreservatory +selfsame +selfsameness +selfward +selfwards +selictar +seligmannite +selihoth +Selina +Selinuntine +selion +Seljuk +Seljukian +sell +sella +sellable +sellably +sellaite +sellar +sellate +sellenders +seller +Selli +sellie +selliform +selling +sellout +selly +selsoviet +selsyn +selt +Selter +Seltzer +seltzogene +Selung +selva +selvage +selvaged +selvagee +selvedge +selzogene +Semaeostomae +Semaeostomata +Semang +semanteme +semantic +semantical +semantically +semantician +semanticist +semantics +semantological +semantology +semantron +semaphore +semaphoric +semaphorical +semaphorically +semaphorist +semarum +semasiological +semasiologically +semasiologist +semasiology +semateme +sematic +sematographic +sematography +sematology +sematrope +semball +semblable +semblably +semblance +semblant +semblative +semble +seme +Semecarpus +semeed +semeia +semeiography +semeiologic +semeiological +semeiologist +semeiology +semeion +semeiotic +semeiotical +semeiotics +semelfactive +semelincident +semen +semence +Semeostoma +semese +semester +semestral +semestrial +semi +semiabstracted +semiaccomplishment +semiacid +semiacidified +semiacquaintance +semiadherent +semiadjectively +semiadnate +semiaerial +semiaffectionate +semiagricultural +Semiahmoo +semialbinism +semialcoholic +semialien +semiallegiance +semialpine +semialuminous +semiamplexicaul +semiamplitude +semianarchist +semianatomical +semianatropal +semianatropous +semiangle +semiangular +semianimal +semianimate +semianimated +semiannealed +semiannual +semiannually +semiannular +semianthracite +semiantiministerial +semiantique +semiape +semiaperiodic +semiaperture +semiappressed +semiaquatic +semiarborescent +semiarc +semiarch +semiarchitectural +semiarid +semiaridity +semiarticulate +semiasphaltic +semiatheist +semiattached +semiautomatic +semiautomatically +semiautonomous +semiaxis +semibacchanalian +semibachelor +semibald +semibalked +semiball +semiballoon +semiband +semibarbarian +semibarbarianism +semibarbaric +semibarbarism +semibarbarous +semibaronial +semibarren +semibase +semibasement +semibastion +semibay +semibeam +semibejan +semibelted +semibifid +semibituminous +semibleached +semiblind +semiblunt +semibody +semiboiled +semibolshevist +semibolshevized +semibouffant +semibourgeois +semibreve +semibull +semiburrowing +semic +semicadence +semicalcareous +semicalcined +semicallipygian +semicanal +semicanalis +semicannibalic +semicantilever +semicarbazide +semicarbazone +semicarbonate +semicarbonize +semicardinal +semicartilaginous +semicastrate +semicastration +semicatholicism +semicaudate +semicelestial +semicell +semicellulose +semicentenarian +semicentenary +semicentennial +semicentury +semichannel +semichaotic +semichemical +semicheviot +semichevron +semichiffon +semichivalrous +semichoric +semichorus +semichrome +semicircle +semicircled +semicircular +semicircularity +semicircularly +semicircularness +semicircumference +semicircumferentor +semicircumvolution +semicirque +semicitizen +semicivilization +semicivilized +semiclassic +semiclassical +semiclause +semicleric +semiclerical +semiclimber +semiclimbing +semiclose +semiclosed +semiclosure +semicoagulated +semicoke +semicollapsible +semicollar +semicollegiate +semicolloid +semicolloquial +semicolon +semicolonial +semicolumn +semicolumnar +semicoma +semicomatose +semicombined +semicombust +semicomic +semicomical +semicommercial +semicompact +semicompacted +semicomplete +semicomplicated +semiconceal +semiconcrete +semiconducting +semiconductor +semicone +semiconfident +semiconfinement +semiconfluent +semiconformist +semiconformity +semiconic +semiconical +semiconnate +semiconnection +semiconoidal +semiconscious +semiconsciously +semiconsciousness +semiconservative +semiconsonant +semiconsonantal +semiconspicuous +semicontinent +semicontinuum +semicontraction +semicontradiction +semiconvergence +semiconvergent +semiconversion +semiconvert +semicordate +semicordated +semicoriaceous +semicorneous +semicoronate +semicoronated +semicoronet +semicostal +semicostiferous +semicotton +semicotyle +semicounterarch +semicountry +semicrepe +semicrescentic +semicretin +semicretinism +semicriminal +semicroma +semicrome +semicrustaceous +semicrystallinc +semicubical +semicubit +semicup +semicupium +semicupola +semicured +semicurl +semicursive +semicurvilinear +semicyclic +semicycloid +semicylinder +semicylindric +semicylindrical +semicynical +semidaily +semidangerous +semidark +semidarkness +semidead +semideaf +semidecay +semidecussation +semidefinite +semideific +semideification +semideistical +semideity +semidelight +semidelirious +semideltaic +semidemented +semidenatured +semidependence +semidependent +semideponent +semidesert +semidestructive +semidetached +semidetachment +semideveloped +semidiagrammatic +semidiameter +semidiapason +semidiapente +semidiaphaneity +semidiaphanous +semidiatessaron +semidifference +semidigested +semidigitigrade +semidigression +semidilapidation +semidine +semidirect +semidisabled +semidisk +semiditone +semidiurnal +semidivided +semidivine +semidocumentary +semidodecagon +semidole +semidome +semidomed +semidomestic +semidomesticated +semidomestication +semidomical +semidormant +semidouble +semidrachm +semidramatic +semidress +semidressy +semidried +semidry +semidrying +semiductile +semidull +semiduplex +semiduration +semieducated +semieffigy +semiegg +semiegret +semielastic +semielision +semiellipse +semiellipsis +semiellipsoidal +semielliptic +semielliptical +semienclosed +semiengaged +semiequitant +semierect +semieremitical +semiessay +semiexecutive +semiexpanded +semiexplanation +semiexposed +semiexternal +semiextinct +semiextinction +semifable +semifabulous +semifailure +semifamine +semifascia +semifasciated +semifashion +semifast +semifatalistic +semiferal +semiferous +semifeudal +semifeudalism +semifib +semifiction +semifictional +semifigurative +semifigure +semifinal +semifinalist +semifine +semifinish +semifinished +semifiscal +semifistular +semifit +semifitting +semifixed +semiflashproof +semiflex +semiflexed +semiflexible +semiflexion +semiflexure +semiflint +semifloating +semifloret +semifloscular +semifloscule +semiflosculose +semiflosculous +semifluctuant +semifluctuating +semifluid +semifluidic +semifluidity +semifoaming +semiforbidding +semiforeign +semiform +semiformal +semiformed +semifossil +semifossilized +semifrantic +semifriable +semifrontier +semifuddle +semifunctional +semifused +semifusion +semify +semigala +semigelatinous +semigentleman +semigenuflection +semigirder +semiglaze +semiglazed +semiglobe +semiglobose +semiglobular +semiglobularly +semiglorious +semiglutin +semigod +semigovernmental +semigrainy +semigranitic +semigranulate +semigravel +semigroove +semihand +semihard +semiharden +semihardy +semihastate +semihepatization +semiherbaceous +semiheterocercal +semihexagon +semihexagonal +semihiant +semihiatus +semihibernation +semihigh +semihistorical +semihobo +semihonor +semihoral +semihorny +semihostile +semihot +semihuman +semihumanitarian +semihumanized +semihumbug +semihumorous +semihumorously +semihyaline +semihydrate +semihydrobenzoinic +semihyperbola +semihyperbolic +semihyperbolical +semijealousy +semijubilee +semijudicial +semijuridical +semilanceolate +semilatent +semilatus +semileafless +semilegendary +semilegislative +semilens +semilenticular +semilethal +semiliberal +semilichen +semiligneous +semilimber +semilined +semiliquid +semiliquidity +semiliterate +semilocular +semilogarithmic +semilogical +semilong +semilooper +semiloose +semiloyalty +semilucent +semilunar +semilunare +semilunary +semilunate +semilunation +semilune +semiluxation +semiluxury +semimachine +semimade +semimadman +semimagical +semimagnetic +semimajor +semimalignant +semimanufacture +semimanufactured +semimarine +semimarking +semimathematical +semimature +semimechanical +semimedicinal +semimember +semimembranosus +semimembranous +semimenstrual +semimercerized +semimessianic +semimetal +semimetallic +semimetamorphosis +semimicrochemical +semimild +semimilitary +semimill +semimineral +semimineralized +semiminim +semiminor +semimolecule +semimonastic +semimonitor +semimonopoly +semimonster +semimonthly +semimoron +semimucous +semimute +semimystic +semimystical +semimythical +seminaked +seminal +seminality +seminally +seminaphthalidine +seminaphthylamine +seminar +seminarcosis +seminarial +seminarian +seminarianism +seminarist +seminaristic +seminarize +seminary +seminasal +seminase +seminatant +seminate +semination +seminationalization +seminative +seminebulous +seminecessary +seminegro +seminervous +seminiferal +seminiferous +seminific +seminifical +seminification +seminist +seminium +seminivorous +seminocturnal +Seminole +seminoma +seminomad +seminomadic +seminomata +seminonconformist +seminonflammable +seminonsensical +seminormal +seminose +seminovel +seminovelty +seminude +seminudity +seminule +seminuliferous +seminuria +seminvariant +seminvariantive +semioblivion +semioblivious +semiobscurity +semioccasional +semioccasionally +semiocclusive +semioctagonal +semiofficial +semiofficially +semiography +Semionotidae +Semionotus +semiopacity +semiopacous +semiopal +semiopalescent +semiopaque +semiopened +semiorb +semiorbicular +semiorbicularis +semiorbiculate +semiordinate +semiorganized +semioriental +semioscillation +semiosseous +semiostracism +semiotic +semiotician +semioval +semiovaloid +semiovate +semioviparous +semiovoid +semiovoidal +semioxidated +semioxidized +semioxygenated +semioxygenized +semipagan +semipalmate +semipalmated +semipalmation +semipanic +semipapal +semipapist +semiparallel +semiparalysis +semiparameter +semiparasitic +semiparasitism +semipaste +semipastoral +semipasty +semipause +semipeace +semipectinate +semipectinated +semipectoral +semiped +semipedal +semipellucid +semipellucidity +semipendent +semipenniform +semiperfect +semiperimeter +semiperimetry +semiperiphery +semipermanent +semipermeability +semipermeable +semiperoid +semiperspicuous +semipertinent +semipervious +semipetaloid +semipetrified +semiphase +semiphilologist +semiphilosophic +semiphilosophical +semiphlogisticated +semiphonotypy +semiphosphorescent +semipinacolic +semipinacolin +semipinnate +semipiscine +semiplantigrade +semiplastic +semiplumaceous +semiplume +semipolar +semipolitical +semipolitician +semipoor +semipopish +semipopular +semiporcelain +semiporous +semiporphyritic +semiportable +semipostal +semipractical +semiprecious +semipreservation +semiprimigenous +semiprivacy +semiprivate +semipro +semiprofane +semiprofessional +semiprofessionalized +semipronation +semiprone +semipronominal +semiproof +semiproselyte +semiprosthetic +semiprostrate +semiprotectorate +semiproven +semipublic +semipupa +semipurulent +semiputrid +semipyramidal +semipyramidical +semipyritic +semiquadrangle +semiquadrantly +semiquadrate +semiquantitative +semiquantitatively +semiquartile +semiquaver +semiquietism +semiquietist +semiquinquefid +semiquintile +semiquote +semiradial +semiradiate +Semiramis +Semiramize +semirapacious +semirare +semirattlesnake +semiraw +semirebellion +semirecondite +semirecumbent +semirefined +semireflex +semiregular +semirelief +semireligious +semireniform +semirepublican +semiresinous +semiresolute +semirespectability +semirespectable +semireticulate +semiretirement +semiretractile +semireverberatory +semirevolute +semirevolution +semirevolutionist +semirhythm +semiriddle +semirigid +semiring +semiroll +semirotary +semirotating +semirotative +semirotatory +semirotund +semirotunda +semiround +semiroyal +semiruin +semirural +semirustic +semis +semisacerdotal +semisacred +semisagittate +semisaint +semisaline +semisaltire +semisaprophyte +semisaprophytic +semisarcodic +semisatiric +semisaturation +semisavage +semisavagedom +semisavagery +semiscenic +semischolastic +semiscientific +semiseafaring +semisecondary +semisecrecy +semisecret +semisection +semisedentary +semisegment +semisensuous +semisentient +semisentimental +semiseparatist +semiseptate +semiserf +semiserious +semiseriously +semiseriousness +semiservile +semisevere +semiseverely +semiseverity +semisextile +semishady +semishaft +semisheer +semishirker +semishrub +semishrubby +semisightseeing +semisilica +semisimious +semisimple +semisingle +semisixth +semiskilled +semislave +semismelting +semismile +semisocial +semisocialism +semisociative +semisocinian +semisoft +semisolemn +semisolemnity +semisolemnly +semisolid +semisolute +semisomnambulistic +semisomnolence +semisomnous +semisopor +semisovereignty +semispan +semispeculation +semisphere +semispheric +semispherical +semispheroidal +semispinalis +semispiral +semispiritous +semispontaneity +semispontaneous +semispontaneously +semispontaneousness +semisport +semisporting +semisquare +semistagnation +semistaminate +semistarvation +semistarved +semistate +semisteel +semistiff +semistill +semistock +semistory +semistratified +semistriate +semistriated +semistuporous +semisubterranean +semisuburban +semisuccess +semisuccessful +semisuccessfully +semisucculent +semisupernatural +semisupinated +semisupination +semisupine +semisuspension +semisymmetric +semita +semitact +semitae +semitailored +semital +semitandem +semitangent +semitaur +Semite +semitechnical +semiteetotal +semitelic +semitendinosus +semitendinous +semiterete +semiterrestrial +semitertian +semitesseral +semitessular +semitheological +semithoroughfare +Semitic +Semiticism +Semiticize +Semitics +semitime +Semitism +Semitist +Semitization +Semitize +semitonal +semitonally +semitone +semitonic +semitonically +semitontine +semitorpid +semitour +semitrailer +semitrained +semitransept +semitranslucent +semitransparency +semitransparent +semitransverse +semitreasonable +semitrimmed +semitropic +semitropical +semitropics +semitruth +semituberous +semitubular +semiuncial +semiundressed +semiuniversalist +semiupright +semiurban +semiurn +semivalvate +semivault +semivector +semivegetable +semivertebral +semiverticillate +semivibration +semivirtue +semiviscid +semivital +semivitreous +semivitrification +semivitrified +semivocal +semivocalic +semivolatile +semivolcanic +semivoluntary +semivowel +semivulcanized +semiwaking +semiwarfare +semiweekly +semiwild +semiwoody +semiyearly +semmet +semmit +Semnae +Semnones +Semnopithecinae +semnopithecine +Semnopithecus +semola +semolella +semolina +semological +semology +Semostomae +semostomeous +semostomous +semperannual +sempergreen +semperidentical +semperjuvenescent +sempervirent +sempervirid +Sempervivum +sempitern +sempiternal +sempiternally +sempiternity +sempiternize +sempiternous +sempstrywork +semsem +semuncia +semuncial +sen +Senaah +senaite +senam +senarian +senarius +senarmontite +senary +senate +senator +senatorial +senatorially +senatorian +senatorship +senatory +senatress +senatrices +senatrix +sence +Senci +sencion +send +sendable +sendal +sendee +sender +sending +Seneca +Senecan +Senecio +senecioid +senecionine +senectitude +senectude +senectuous +senega +Senegal +Senegalese +Senegambian +senegin +senesce +senescence +senescent +seneschal +seneschally +seneschalship +seneschalsy +seneschalty +sengreen +senicide +Senijextee +senile +senilely +senilism +senility +senilize +senior +seniority +seniorship +Senlac +Senna +senna +sennegrass +sennet +sennight +sennit +sennite +senocular +Senones +Senonian +sensa +sensable +sensal +sensate +sensation +sensational +sensationalism +sensationalist +sensationalistic +sensationalize +sensationally +sensationary +sensationish +sensationism +sensationist +sensationistic +sensationless +sensatorial +sensatory +sense +sensed +senseful +senseless +senselessly +senselessness +sensibilia +sensibilisin +sensibilitist +sensibilitous +sensibility +sensibilium +sensibilization +sensibilize +sensible +sensibleness +sensibly +sensical +sensifacient +sensiferous +sensific +sensificatory +sensifics +sensify +sensigenous +sensile +sensilia +sensilla +sensillum +sension +sensism +sensist +sensistic +sensitive +sensitively +sensitiveness +sensitivity +sensitization +sensitize +sensitizer +sensitometer +sensitometric +sensitometry +sensitory +sensive +sensize +senso +sensomobile +sensomobility +sensomotor +sensoparalysis +sensor +sensoria +sensorial +sensoriglandular +sensorimotor +sensorimuscular +sensorium +sensorivascular +sensorivasomotor +sensorivolitional +sensory +sensual +sensualism +sensualist +sensualistic +sensuality +sensualization +sensualize +sensually +sensualness +sensuism +sensuist +sensum +sensuosity +sensuous +sensuously +sensuousness +sensyne +sent +sentence +sentencer +sentential +sententially +sententiarian +sententiarist +sententiary +sententiosity +sententious +sententiously +sententiousness +sentience +sentiendum +sentient +sentiently +sentiment +sentimental +sentimentalism +sentimentalist +sentimentality +sentimentalization +sentimentalize +sentimentalizer +sentimentally +sentimenter +sentimentless +sentinel +sentinellike +sentinelship +sentinelwise +sentisection +sentition +sentry +Senusi +Senusian +Senusism +sepad +sepal +sepaled +sepaline +sepalled +sepalody +sepaloid +separability +separable +separableness +separably +separata +separate +separatedly +separately +separateness +separates +separatical +separating +separation +separationism +separationist +separatism +separatist +separatistic +separative +separatively +separativeness +separator +separatory +separatress +separatrix +separatum +Sepharad +Sephardi +Sephardic +Sephardim +Sepharvites +sephen +sephiric +sephirothic +sepia +sepiaceous +sepialike +sepian +sepiarian +sepiary +sepic +sepicolous +Sepiidae +sepiment +sepioid +Sepioidea +Sepiola +Sepiolidae +sepiolite +sepion +sepiost +sepiostaire +sepium +sepone +sepoy +seppuku +seps +Sepsidae +sepsine +sepsis +Sept +sept +septa +septal +septan +septane +septangle +septangled +septangular +septangularness +septarian +septariate +septarium +septate +septated +septation +septatoarticulate +septavalent +septave +septcentenary +septectomy +September +Septemberer +Septemberism +Septemberist +Septembral +Septembrian +Septembrist +Septembrize +Septembrizer +septemdecenary +septemfid +septemfluous +septemfoliate +septemfoliolate +septemia +septempartite +septemplicate +septemvious +septemvir +septemvirate +septemviri +septenar +septenarian +septenarius +septenary +septenate +septendecennial +septendecimal +septennary +septennate +septenniad +septennial +septennialist +septenniality +septennially +septennium +septenous +Septentrio +Septentrion +septentrional +septentrionality +septentrionally +septentrionate +septentrionic +septerium +septet +septfoil +Septi +Septibranchia +Septibranchiata +septic +septical +septically +septicemia +septicemic +septicidal +septicidally +septicity +septicization +septicolored +septicopyemia +septicopyemic +septier +septifarious +septiferous +septifluous +septifolious +septiform +septifragal +septifragally +septilateral +septile +septillion +septillionth +septimal +septimanal +septimanarian +septime +septimetritis +septimole +septinsular +septipartite +septisyllabic +septisyllable +septivalent +septleva +Septobasidium +septocosta +septocylindrical +Septocylindrium +septodiarrhea +septogerm +Septogloeum +septoic +septole +septomarginal +septomaxillary +septonasal +Septoria +septotomy +septship +septuagenarian +septuagenarianism +septuagenary +septuagesima +Septuagint +septuagint +Septuagintal +septulate +septulum +septum +septuncial +septuor +septuple +septuplet +septuplicate +septuplication +sepulcher +sepulchral +sepulchralize +sepulchrally +sepulchrous +sepultural +sepulture +sequa +sequacious +sequaciously +sequaciousness +sequacity +Sequan +Sequani +Sequanian +sequel +sequela +sequelae +sequelant +sequence +sequencer +sequency +sequent +sequential +sequentiality +sequentially +sequently +sequest +sequester +sequestered +sequesterment +sequestra +sequestrable +sequestral +sequestrate +sequestration +sequestrator +sequestratrices +sequestratrix +sequestrectomy +sequestrotomy +sequestrum +sequin +sequitur +Sequoia +ser +sera +serab +Serabend +seragli +seraglio +serai +serail +seral +seralbumin +seralbuminous +serang +serape +Serapea +Serapeum +seraph +seraphic +seraphical +seraphically +seraphicalness +seraphicism +seraphicness +seraphim +seraphina +seraphine +seraphism +seraphlike +seraphtide +Serapias +Serapic +Serapis +Serapist +serasker +seraskerate +seraskier +seraskierat +serau +seraw +Serb +Serbdom +Serbian +Serbize +Serbonian +Serbophile +Serbophobe +sercial +serdab +Serdar +Sere +sere +Serean +sereh +Serena +serenade +serenader +serenata +serenate +Serendib +serendibite +serendipity +serendite +serene +serenely +sereneness +serenify +serenissime +serenissimi +serenissimo +serenity +serenize +Serenoa +Serer +Seres +sereward +serf +serfage +serfdom +serfhood +serfish +serfishly +serfishness +serfism +serflike +serfship +Serge +serge +sergeancy +Sergeant +sergeant +sergeantcy +sergeantess +sergeantry +sergeantship +sergeanty +sergedesoy +Sergei +serger +sergette +serging +Sergio +Sergiu +Sergius +serglobulin +Seri +serial +serialist +seriality +serialization +serialize +serially +Serian +seriary +seriate +seriately +seriatim +seriation +Seric +Sericana +sericate +sericated +sericea +sericeotomentose +sericeous +sericicultural +sericiculture +sericiculturist +sericin +sericipary +sericite +sericitic +sericitization +Sericocarpus +sericteria +sericterium +serictery +sericultural +sericulture +sericulturist +seriema +series +serif +serific +Seriform +serigraph +serigrapher +serigraphy +serimeter +serin +serine +serinette +seringa +seringal +seringhi +Serinus +serio +seriocomedy +seriocomic +seriocomical +seriocomically +seriogrotesque +Seriola +Seriolidae +serioline +serioludicrous +seriopantomimic +serioridiculous +seriosity +serious +seriously +seriousness +seripositor +Serjania +serjeant +serment +sermo +sermocination +sermocinatrix +sermon +sermoneer +sermoner +sermonesque +sermonet +sermonettino +sermonic +sermonically +sermonics +sermonish +sermonism +sermonist +sermonize +sermonizer +sermonless +sermonoid +sermonolatry +sermonology +sermonproof +sermonwise +sermuncle +sernamby +sero +seroalbumin +seroalbuminuria +seroanaphylaxis +serobiological +serocolitis +serocyst +serocystic +serodermatosis +serodermitis +serodiagnosis +serodiagnostic +seroenteritis +seroenzyme +serofibrinous +serofibrous +serofluid +serogelatinous +serohemorrhagic +serohepatitis +seroimmunity +serolactescent +serolemma +serolin +serolipase +serologic +serological +serologically +serologist +serology +seromaniac +seromembranous +seromucous +seromuscular +seron +seronegative +seronegativity +seroon +seroot +seroperitoneum +serophthisis +serophysiology +seroplastic +seropneumothorax +seropositive +seroprevention +seroprognosis +seroprophylaxis +seroprotease +seropuriform +seropurulent +seropus +seroreaction +serosa +serosanguineous +serosanguinolent +seroscopy +serositis +serosity +serosynovial +serosynovitis +serotherapeutic +serotherapeutics +serotherapist +serotherapy +serotina +serotinal +serotine +serotinous +serotoxin +serous +serousness +serovaccine +serow +serozyme +Serpari +serpedinous +Serpens +Serpent +serpent +serpentaria +Serpentarian +Serpentarii +serpentarium +Serpentarius +serpentary +serpentcleide +serpenteau +Serpentes +serpentess +Serpentian +serpenticidal +serpenticide +Serpentid +serpentiferous +serpentiform +serpentina +serpentine +serpentinely +Serpentinian +serpentinic +serpentiningly +serpentinization +serpentinize +serpentinoid +serpentinous +Serpentis +serpentivorous +serpentize +serpentlike +serpently +serpentoid +serpentry +serpentwood +serphid +Serphidae +serphoid +Serphoidea +serpierite +serpiginous +serpiginously +serpigo +serpivolant +serpolet +Serpula +serpula +Serpulae +serpulae +serpulan +serpulid +Serpulidae +serpulidan +serpuline +serpulite +serpulitic +serpuloid +serra +serradella +serrage +serran +serrana +serranid +Serranidae +Serrano +serrano +serranoid +Serranus +Serrasalmo +serrate +serrated +serratic +serratiform +serratile +serration +serratirostral +serratocrenate +serratodentate +serratodenticulate +serratoglandulous +serratospinose +serrature +serricorn +Serricornia +Serridentines +Serridentinus +serried +serriedly +serriedness +Serrifera +serriferous +serriform +serriped +serrirostrate +serrulate +serrulated +serrulation +serry +sert +serta +Sertularia +sertularian +Sertulariidae +sertularioid +sertule +sertulum +sertum +serum +serumal +serut +servable +servage +serval +servaline +servant +servantcy +servantdom +servantess +servantless +servantlike +servantry +servantship +servation +serve +servente +serventism +server +servery +servet +Servetian +Servetianism +Servian +service +serviceability +serviceable +serviceableness +serviceably +serviceberry +serviceless +servicelessness +serviceman +Servidor +servidor +servient +serviential +serviette +servile +servilely +servileness +servilism +servility +servilize +serving +servingman +servist +Servite +servitor +servitorial +servitorship +servitress +servitrix +servitude +serviture +Servius +servo +servomechanism +servomotor +servulate +serwamby +sesame +sesamoid +sesamoidal +sesamoiditis +Sesamum +Sesban +Sesbania +sescuple +Seseli +Seshat +Sesia +Sesiidae +sesma +sesqui +sesquialter +sesquialtera +sesquialteral +sesquialteran +sesquialterous +sesquibasic +sesquicarbonate +sesquicentennial +sesquichloride +sesquiduplicate +sesquihydrate +sesquihydrated +sesquinona +sesquinonal +sesquioctava +sesquioctaval +sesquioxide +sesquipedal +sesquipedalian +sesquipedalianism +sesquipedality +sesquiplicate +sesquiquadrate +sesquiquarta +sesquiquartal +sesquiquartile +sesquiquinta +sesquiquintal +sesquiquintile +sesquisalt +sesquiseptimal +sesquisextal +sesquisilicate +sesquisquare +sesquisulphate +sesquisulphide +sesquisulphuret +sesquiterpene +sesquitertia +sesquitertial +sesquitertian +sesquitertianal +sess +sessile +sessility +Sessiliventres +session +sessional +sessionary +sessions +sesterce +sestertium +sestet +sesti +sestiad +Sestian +sestina +sestine +sestole +sestuor +Sesuto +Sesuvium +set +seta +setaceous +setaceously +setae +setal +Setaria +setarious +setback +setbolt +setdown +setfast +Seth +seth +sethead +Sethian +Sethic +Sethite +Setibo +setier +Setifera +setiferous +setiform +setigerous +setiparous +setirostral +setline +setness +setoff +seton +Setophaga +Setophaginae +setophagine +setose +setous +setout +setover +setscrew +setsman +sett +settable +settaine +settee +setter +settergrass +setterwort +setting +settle +settleable +settled +settledly +settledness +settlement +settler +settlerdom +settling +settlings +settlor +settsman +setula +setule +setuliform +setulose +setulous +setup +setwall +setwise +setwork +seugh +Sevastopol +seven +sevenbark +sevener +sevenfold +sevenfolded +sevenfoldness +sevennight +sevenpence +sevenpenny +sevenscore +seventeen +seventeenfold +seventeenth +seventeenthly +seventh +seventhly +seventieth +seventy +seventyfold +sever +severable +several +severalfold +severality +severalize +severally +severalness +severalth +severalty +severance +severation +severe +severedly +severely +severeness +severer +Severian +severingly +severish +severity +severization +severize +severy +Sevillian +sew +sewable +sewage +sewan +sewed +sewellel +sewen +sewer +sewerage +sewered +sewerless +sewerlike +sewerman +sewery +sewing +sewless +sewn +sewround +sex +sexadecimal +sexagenarian +sexagenarianism +sexagenary +Sexagesima +sexagesimal +sexagesimally +sexagesimals +sexagonal +sexangle +sexangled +sexangular +sexangularly +sexannulate +sexarticulate +sexcentenary +sexcuspidate +sexdigital +sexdigitate +sexdigitated +sexdigitism +sexed +sexenary +sexennial +sexennially +sexennium +sexern +sexfarious +sexfid +sexfoil +sexhood +sexifid +sexillion +sexiped +sexipolar +sexisyllabic +sexisyllable +sexitubercular +sexivalence +sexivalency +sexivalent +sexless +sexlessly +sexlessness +sexlike +sexlocular +sexly +sexological +sexologist +sexology +sexpartite +sexradiate +sext +sextactic +sextain +sextan +sextans +Sextant +sextant +sextantal +sextar +sextarii +sextarius +sextary +sextennial +sextern +sextet +sextic +sextile +Sextilis +sextillion +sextillionth +sextipara +sextipartite +sextipartition +sextiply +sextipolar +sexto +sextodecimo +sextole +sextolet +sexton +sextoness +sextonship +sextry +sextubercular +sextuberculate +sextula +sextulary +sextumvirate +sextuple +sextuplet +sextuplex +sextuplicate +sextuply +sexual +sexuale +sexualism +sexualist +sexuality +sexualization +sexualize +sexually +sexuous +sexupara +sexuparous +sexy +sey +seybertite +Seymeria +Seymour +sfoot +Sgad +sgraffiato +sgraffito +sh +sha +shaatnez +shab +Shaban +shabash +Shabbath +shabbed +shabbify +shabbily +shabbiness +shabble +shabby +shabbyish +shabrack +shabunder +Shabuoth +shachle +shachly +shack +shackanite +shackatory +shackbolt +shackland +shackle +shacklebone +shackledom +shackler +shacklewise +shackling +shackly +shacky +shad +shadbelly +shadberry +shadbird +shadbush +shadchan +shaddock +shade +shaded +shadeful +shadeless +shadelessness +shader +shadetail +shadflower +shadily +shadine +shadiness +shading +shadkan +shadoof +Shadow +shadow +shadowable +shadowbox +shadowboxing +shadowed +shadower +shadowfoot +shadowgram +shadowgraph +shadowgraphic +shadowgraphist +shadowgraphy +shadowily +shadowiness +shadowing +shadowishly +shadowist +shadowland +shadowless +shadowlessness +shadowlike +shadowly +shadowy +shadrach +shady +shaffle +Shafiite +shaft +shafted +shafter +shaftfoot +shafting +shaftless +shaftlike +shaftman +shaftment +shaftsman +shaftway +shafty +shag +shaganappi +shagbag +shagbark +shagged +shaggedness +shaggily +shagginess +shaggy +Shagia +shaglet +shaglike +shagpate +shagrag +shagreen +shagreened +shagroon +shagtail +shah +Shahaptian +shaharith +shahdom +shahi +Shahid +shahin +shahzada +Shai +Shaigia +shaikh +Shaikiyeh +shaitan +Shaiva +Shaivism +Shaka +shakable +shake +shakeable +shakebly +shakedown +shakefork +shaken +shakenly +shakeout +shakeproof +Shaker +shaker +shakerag +Shakerdom +Shakeress +Shakerism +Shakerlike +shakers +shakescene +Shakespearean +Shakespeareana +Shakespeareanism +Shakespeareanly +Shakespearize +Shakespearolater +Shakespearolatry +shakha +Shakil +shakily +shakiness +shaking +shakingly +shako +shaksheer +Shakta +Shakti +shakti +Shaktism +shaku +shaky +Shakyamuni +Shalako +shale +shalelike +shaleman +shall +shallal +shallon +shalloon +shallop +shallopy +shallot +shallow +shallowbrained +shallowhearted +shallowish +shallowist +shallowly +shallowness +shallowpate +shallowpated +shallows +shallowy +shallu +shalom +shalt +shalwar +shaly +Sham +sham +shama +shamable +shamableness +shamably +shamal +shamalo +shaman +shamaness +shamanic +shamanism +shamanist +shamanistic +shamanize +shamateur +shamba +Shambala +shamble +shambling +shamblingly +shambrier +Shambu +shame +shameable +shamed +shameface +shamefaced +shamefacedly +shamefacedness +shamefast +shamefastly +shamefastness +shameful +shamefully +shamefulness +shameless +shamelessly +shamelessness +shameproof +shamer +shamesick +shameworthy +shamianah +Shamim +shamir +Shammar +shammed +shammer +shammick +shamming +shammish +shammock +shammocking +shammocky +shammy +shampoo +shampooer +shamrock +shamroot +shamsheer +Shan +shan +shanachas +shanachie +Shandean +shandry +shandrydan +Shandy +shandy +shandygaff +Shandyism +Shane +Shang +Shangalla +shangan +Shanghai +shanghai +shanghaier +shank +Shankar +shanked +shanker +shankings +shankpiece +shanksman +shanna +Shannon +shanny +shansa +shant +Shantung +shanty +shantylike +shantyman +shantytown +shap +shapable +Shape +shape +shaped +shapeful +shapeless +shapelessly +shapelessness +shapeliness +shapely +shapen +shaper +shapeshifter +shapesmith +shaping +shapingly +shapometer +shaps +Shaptan +shapy +sharable +Sharada +Sharan +shard +Shardana +sharded +shardy +share +shareable +sharebone +sharebroker +sharecrop +sharecropper +shareholder +shareholdership +shareman +sharepenny +sharer +shareship +sharesman +sharewort +Sharezer +shargar +Shari +Sharia +Sharira +shark +sharkful +sharkish +sharklet +sharklike +sharkship +sharkskin +sharky +sharn +sharnbud +sharny +Sharon +sharp +sharpen +sharpener +sharper +sharpie +sharpish +sharply +sharpness +sharps +sharpsaw +sharpshin +sharpshod +sharpshooter +sharpshooting +sharptail +sharpware +sharpy +Sharra +sharrag +sharry +Shasta +shastaite +Shastan +shaster +shastra +shastraik +shastri +shastrik +shat +shatan +shathmont +Shatter +shatter +shatterbrain +shatterbrained +shatterer +shatterheaded +shattering +shatteringly +shatterment +shatterpated +shatterproof +shatterwit +shattery +shattuckite +shauchle +shaugh +shaul +Shaula +shaup +shauri +shauwe +shavable +shave +shaveable +shaved +shavee +shaveling +shaven +shaver +shavery +Shavese +shavester +shavetail +shaveweed +Shavian +Shaviana +Shavianism +shaving +shavings +Shaw +shaw +Shawanese +Shawano +shawl +shawled +shawling +shawlless +shawllike +shawlwise +shawm +Shawn +Shawnee +shawneewood +shawny +Shawwal +shawy +shay +Shaysite +she +shea +sheading +sheaf +sheafage +sheaflike +sheafripe +sheafy +sheal +shealing +Shean +shear +shearbill +sheard +shearer +sheargrass +shearhog +shearing +shearless +shearling +shearman +shearmouse +shears +shearsman +sheartail +shearwater +shearwaters +sheat +sheatfish +sheath +sheathbill +sheathe +sheathed +sheather +sheathery +sheathing +sheathless +sheathlike +sheathy +sheave +sheaved +sheaveless +sheaveman +shebang +Shebat +shebeen +shebeener +Shechem +Shechemites +shed +shedded +shedder +shedding +sheder +shedhand +shedlike +shedman +shedwise +shee +sheely +sheen +sheenful +sheenless +sheenly +sheeny +sheep +sheepback +sheepberry +sheepbine +sheepbiter +sheepbiting +sheepcote +sheepcrook +sheepfaced +sheepfacedly +sheepfacedness +sheepfold +sheepfoot +sheepgate +sheephead +sheepheaded +sheephearted +sheepherder +sheepherding +sheephook +sheephouse +sheepify +sheepish +sheepishly +sheepishness +sheepkeeper +sheepkeeping +sheepkill +sheepless +sheeplet +sheeplike +sheepling +sheepman +sheepmaster +sheepmonger +sheepnose +sheepnut +sheeppen +sheepshank +sheepshead +sheepsheadism +sheepshear +sheepshearer +sheepshearing +sheepshed +sheepskin +sheepsplit +sheepsteal +sheepstealer +sheepstealing +sheepwalk +sheepwalker +sheepweed +sheepy +sheer +sheered +sheering +sheerly +sheerness +sheet +sheetage +sheeted +sheeter +sheetflood +sheetful +sheeting +sheetless +sheetlet +sheetlike +sheetling +sheetways +sheetwise +sheetwork +sheetwriting +sheety +Sheffield +shehitah +sheik +sheikdom +sheikhlike +sheikhly +sheiklike +sheikly +Sheila +shekel +Shekinah +Shel +shela +sheld +sheldapple +shelder +sheldfowl +sheldrake +shelduck +shelf +shelfback +shelffellow +shelfful +shelflist +shelfmate +shelfpiece +shelfroom +shelfworn +shelfy +shell +shellac +shellacker +shellacking +shellapple +shellback +shellblow +shellblowing +shellbound +shellburst +shellcracker +shelleater +shelled +sheller +Shelleyan +Shelleyana +shellfire +shellfish +shellfishery +shellflower +shellful +shellhead +shelliness +shelling +shellman +shellmonger +shellproof +shellshake +shellum +shellwork +shellworker +shelly +shellycoat +shelta +shelter +shelterage +sheltered +shelterer +shelteringly +shelterless +shelterlessness +shelterwood +sheltery +sheltron +shelty +shelve +shelver +shelving +shelvingly +shelvingness +shelvy +Shelyak +Shemaka +sheminith +Shemite +Shemitic +Shemitish +Shemu +Shen +shenanigan +shend +sheng +Shenshai +Sheol +sheolic +shepherd +shepherdage +shepherddom +shepherdess +shepherdhood +Shepherdia +shepherdish +shepherdism +shepherdize +shepherdless +shepherdlike +shepherdling +shepherdly +shepherdry +sheppeck +sheppey +shepstare +sher +Sherani +Sherardia +sherardize +sherardizer +Sheratan +Sheraton +sherbacha +sherbet +sherbetlee +sherbetzide +sheriat +sherif +sherifa +sherifate +sheriff +sheriffalty +sheriffdom +sheriffess +sheriffhood +sheriffry +sheriffship +sheriffwick +sherifi +sherifian +sherify +sheristadar +Sheriyat +sherlock +Sherman +Sherpa +Sherramoor +Sherri +sherry +Sherrymoor +sherryvallies +Shesha +sheth +Shetland +Shetlander +Shetlandic +sheugh +sheva +shevel +sheveled +shevri +shewa +shewbread +shewel +sheyle +shi +Shiah +shibah +shibar +shibboleth +shibbolethic +shibuichi +shice +shicer +shicker +shickered +shide +shied +shiel +shield +shieldable +shieldboard +shielddrake +shielded +shielder +shieldflower +shielding +shieldless +shieldlessly +shieldlessness +shieldlike +shieldling +shieldmaker +shieldmay +shieldtail +shieling +shier +shies +shiest +shift +shiftable +shiftage +shifter +shiftful +shiftfulness +shiftily +shiftiness +shifting +shiftingly +shiftingness +shiftless +shiftlessly +shiftlessness +shifty +Shigella +shiggaion +shigram +shih +Shiism +Shiite +Shiitic +Shik +shikar +shikara +shikargah +shikari +shikasta +shikimi +shikimic +shikimole +shikimotoxin +shikken +shiko +shikra +shilf +shilfa +Shilh +Shilha +shill +shilla +shillaber +shillelagh +shillet +shillety +shillhouse +shillibeer +shilling +shillingless +shillingsworth +shilloo +Shilluh +Shilluk +Shiloh +shilpit +shim +shimal +Shimei +shimmer +shimmering +shimmeringly +shimmery +shimmy +Shimonoseki +shimose +shimper +shin +Shina +shinaniging +shinarump +shinbone +shindig +shindle +shindy +shine +shineless +shiner +shingle +shingled +shingler +shingles +shinglewise +shinglewood +shingling +shingly +shinily +shininess +shining +shiningly +shiningness +shinleaf +Shinnecock +shinner +shinnery +shinning +shinny +shinplaster +shintiyan +Shinto +Shintoism +Shintoist +Shintoistic +Shintoize +shinty +Shinwari +shinwood +shiny +shinza +ship +shipboard +shipbound +shipboy +shipbreaking +shipbroken +shipbuilder +shipbuilding +shipcraft +shipentine +shipful +shipkeeper +shiplap +shipless +shiplessly +shiplet +shipload +shipman +shipmanship +shipmast +shipmaster +shipmate +shipmatish +shipment +shipowner +shipowning +shippable +shippage +shipped +shipper +shipping +shipplane +shippo +shippon +shippy +shipshape +shipshapely +shipside +shipsmith +shipward +shipwards +shipway +shipwork +shipworm +shipwreck +shipwrecky +shipwright +shipwrightery +shipwrightry +shipyard +shirakashi +shirallee +Shiraz +shire +shirehouse +shireman +shirewick +shirk +shirker +shirky +shirl +shirlcock +Shirley +shirpit +shirr +shirring +shirt +shirtband +shirtiness +shirting +shirtless +shirtlessness +shirtlike +shirtmaker +shirtmaking +shirtman +shirttail +shirtwaist +shirty +Shirvan +shish +shisham +shisn +shita +shitepoke +shither +shittah +shittim +shittimwood +shiv +Shivaism +Shivaist +Shivaistic +Shivaite +shivaree +shive +shiver +shivereens +shiverer +shivering +shiveringly +shiverproof +shiversome +shiverweed +shivery +shivey +shivoo +shivy +shivzoku +Shkupetar +Shlu +Shluh +Sho +sho +Shoa +shoad +shoader +shoal +shoalbrain +shoaler +shoaliness +shoalness +shoalwise +shoaly +shoat +shock +shockability +shockable +shockedness +shocker +shockheaded +shocking +shockingly +shockingness +shocklike +shockproof +shod +shodden +shoddily +shoddiness +shoddy +shoddydom +shoddyism +shoddyite +shoddylike +shoddyward +shoddywards +shode +shoder +shoe +shoebill +shoebinder +shoebindery +shoebinding +shoebird +shoeblack +shoeboy +shoebrush +shoecraft +shoeflower +shoehorn +shoeing +shoeingsmith +shoelace +shoeless +shoemaker +shoemaking +shoeman +shoepack +shoer +shoescraper +shoeshine +shoeshop +shoesmith +shoestring +shoewoman +shoful +shog +shogaol +shoggie +shoggle +shoggly +shogi +shogun +shogunal +shogunate +shohet +shoji +Shojo +shola +shole +Shona +shone +shoneen +shonkinite +shoo +shood +shoofa +shoofly +shooi +shook +shool +shooldarry +shooler +shoop +shoopiltie +shoor +shoot +shootable +shootboard +shootee +shooter +shoother +shooting +shootist +shootman +shop +shopboard +shopbook +shopboy +shopbreaker +shopbreaking +shopfolk +shopful +shopgirl +shopgirlish +shophar +shopkeeper +shopkeeperess +shopkeeperish +shopkeeperism +shopkeepery +shopkeeping +shopland +shoplet +shoplifter +shoplifting +shoplike +shopmaid +shopman +shopmark +shopmate +shopocracy +shopocrat +shoppe +shopper +shopping +shoppish +shoppishness +shoppy +shopster +shoptalk +shopwalker +shopwear +shopwife +shopwindow +shopwoman +shopwork +shopworker +shopworn +shoq +Shor +shor +shoran +shore +Shorea +shoreberry +shorebush +shored +shoregoing +shoreland +shoreless +shoreman +shorer +shoreside +shoresman +shoreward +shorewards +shoreweed +shoreyer +shoring +shorling +shorn +short +shortage +shortbread +shortcake +shortchange +shortchanger +shortclothes +shortcoat +shortcomer +shortcoming +shorten +shortener +shortening +shorter +shortfall +shorthand +shorthanded +shorthandedness +shorthander +shorthead +shorthorn +Shortia +shortish +shortly +shortness +shorts +shortschat +shortsighted +shortsightedly +shortsightedness +shortsome +shortstaff +shortstop +shorttail +Shortzy +Shoshonean +shoshonite +shot +shotbush +shote +shotgun +shotless +shotlike +shotmaker +shotman +shotproof +shotsman +shotstar +shott +shotted +shotten +shotter +shotty +Shotweld +shou +should +shoulder +shouldered +shoulderer +shoulderette +shouldering +shouldna +shouldnt +shoupeltin +shout +shouter +shouting +shoutingly +shoval +shove +shovegroat +shovel +shovelard +shovelbill +shovelboard +shovelfish +shovelful +shovelhead +shovelmaker +shovelman +shovelnose +shovelweed +shover +show +showable +showance +showbird +showboard +showboat +showboater +showboating +showcase +showdom +showdown +shower +showerer +showerful +showeriness +showerless +showerlike +showerproof +showery +showily +showiness +showing +showish +showless +showman +showmanism +showmanry +showmanship +shown +showpiece +showroom +showup +showworthy +showy +showyard +shoya +shrab +shraddha +shradh +shraf +shrag +shram +shrank +shrap +shrapnel +shrave +shravey +shreadhead +shred +shredcock +shredder +shredding +shreddy +shredless +shredlike +Shree +shree +shreeve +shrend +shrew +shrewd +shrewdish +shrewdly +shrewdness +shrewdom +shrewdy +shrewish +shrewishly +shrewishness +shrewlike +shrewly +shrewmouse +shrewstruck +shriek +shrieker +shriekery +shriekily +shriekiness +shriekingly +shriekproof +shrieky +shrieval +shrievalty +shrift +shrike +shrill +shrilling +shrillish +shrillness +shrilly +shrimp +shrimper +shrimpfish +shrimpi +shrimpish +shrimpishness +shrimplike +shrimpy +shrinal +Shrine +shrine +shrineless +shrinelet +shrinelike +Shriner +shrink +shrinkable +shrinkage +shrinkageproof +shrinker +shrinkhead +shrinking +shrinkingly +shrinkproof +shrinky +shrip +shrite +shrive +shrivel +shriven +shriver +shriving +shroff +shrog +Shropshire +shroud +shrouded +shrouding +shroudless +shroudlike +shroudy +Shrove +shrove +shrover +Shrovetide +shrub +shrubbed +shrubbery +shrubbiness +shrubbish +shrubby +shrubland +shrubless +shrublet +shrublike +shrubwood +shruff +shrug +shruggingly +shrunk +shrunken +shrups +Shtokavski +shtreimel +Shu +shuba +shubunkin +shuck +shucker +shucking +shuckins +shuckpen +shucks +shudder +shudderful +shudderiness +shudderingly +shuddersome +shuddery +shuff +shuffle +shuffleboard +shufflecap +shuffler +shufflewing +shuffling +shufflingly +shug +Shuhali +Shukria +Shukulumbwe +shul +Shulamite +shuler +shulwaurs +shumac +shun +Shunammite +shune +shunless +shunnable +shunner +shunt +shunter +shunting +shure +shurf +shush +shusher +Shuswap +shut +shutdown +shutness +shutoff +Shutoku +shutout +shuttance +shutten +shutter +shuttering +shutterless +shutterwise +shutting +shuttle +shuttlecock +shuttleheaded +shuttlelike +shuttlewise +Shuvra +shwanpan +shy +Shyam +shydepoke +shyer +shyish +Shylock +Shylockism +shyly +shyness +shyster +si +Sia +siak +sial +sialaden +sialadenitis +sialadenoncus +sialagogic +sialagogue +sialagoguic +sialemesis +Sialia +sialic +sialid +Sialidae +sialidan +Sialis +sialoangitis +sialogenous +sialoid +sialolith +sialolithiasis +sialology +sialorrhea +sialoschesis +sialosemeiology +sialosis +sialostenosis +sialosyrinx +sialozemia +Siam +siamang +Siamese +sib +Sibbaldus +sibbed +sibbens +sibber +sibboleth +sibby +Siberian +Siberic +siberite +sibilance +sibilancy +sibilant +sibilantly +sibilate +sibilatingly +sibilator +sibilatory +sibilous +sibilus +Sibiric +sibling +sibness +sibrede +sibship +sibyl +sibylesque +sibylic +sibylism +sibylla +sibylline +sibyllist +sic +Sicambri +Sicambrian +Sicana +Sicani +Sicanian +sicarian +sicarious +sicarius +sicca +siccaneous +siccant +siccate +siccation +siccative +siccimeter +siccity +sice +Sicel +Siceliot +Sicilian +sicilian +siciliana +Sicilianism +sicilica +sicilicum +sicilienne +sicinnian +sick +sickbed +sicken +sickener +sickening +sickeningly +sicker +sickerly +sickerness +sickhearted +sickish +sickishly +sickishness +sickle +sicklebill +sickled +sicklelike +sickleman +sicklemia +sicklemic +sicklepod +sickler +sicklerite +sickless +sickleweed +sicklewise +sicklewort +sicklied +sicklily +sickliness +sickling +sickly +sickness +sicknessproof +sickroom +sicsac +sicula +sicular +Siculi +Siculian +Sicyonian +Sicyonic +Sicyos +Sid +Sida +Sidalcea +sidder +Siddha +Siddhanta +Siddhartha +Siddhi +siddur +side +sideage +sidearm +sideboard +sidebone +sidebones +sideburns +sidecar +sidecarist +sidecheck +sided +sidedness +sideflash +sidehead +sidehill +sidekicker +sidelang +sideless +sideline +sideling +sidelings +sidelingwise +sidelong +sidenote +sidepiece +sider +sideral +sideration +siderealize +sidereally +siderean +siderin +siderism +siderite +sideritic +Sideritis +siderognost +siderographic +siderographical +siderographist +siderography +siderolite +siderology +sideromagnetic +sideromancy +sideromelane +sideronatrite +sideronym +sideroscope +siderose +siderosis +siderostat +siderostatic +siderotechny +siderous +Sideroxylon +sidership +siderurgical +siderurgy +sides +sidesaddle +sideshake +sideslip +sidesman +sidesplitter +sidesplitting +sidesplittingly +sidesway +sideswipe +sideswiper +sidetrack +sidewalk +sideward +sidewards +sideway +sideways +sidewinder +sidewipe +sidewiper +sidewise +sidhe +sidi +siding +sidle +sidler +sidling +sidlingly +Sidney +Sidonian +Sidrach +sidth +sidy +sie +siege +siegeable +siegecraft +siegenite +sieger +siegework +Siegfried +Sieglingia +Siegmund +Siegurd +Siena +Sienese +sienna +sier +siering +sierozem +Sierra +sierra +sierran +siesta +siestaland +Sieva +sieve +sieveful +sievelike +siever +Sieversia +sievings +sievy +sifac +sifaka +Sifatite +sife +siffilate +siffle +sifflement +sifflet +sifflot +sift +siftage +sifted +sifter +sifting +sig +Siganidae +Siganus +sigatoka +Sigaultian +sigger +sigh +sigher +sighful +sighfully +sighing +sighingly +sighingness +sighless +sighlike +sight +sightable +sighted +sighten +sightening +sighter +sightful +sightfulness +sighthole +sighting +sightless +sightlessly +sightlessness +sightlily +sightliness +sightly +sightproof +sightworthiness +sightworthy +sighty +sigil +sigilative +Sigillaria +Sigillariaceae +sigillariaceous +sigillarian +sigillarid +sigillarioid +sigillarist +sigillaroid +sigillary +sigillate +sigillated +sigillation +sigillistic +sigillographer +sigillographical +sigillography +sigillum +sigla +siglarian +siglos +Sigma +sigma +sigmaspire +sigmate +sigmatic +sigmation +sigmatism +sigmodont +Sigmodontes +sigmoid +sigmoidal +sigmoidally +sigmoidectomy +sigmoiditis +sigmoidopexy +sigmoidoproctostomy +sigmoidorectostomy +sigmoidoscope +sigmoidoscopy +sigmoidostomy +Sigmund +sign +signable +signal +signalee +signaler +signalese +signaletic +signaletics +signalism +signalist +signality +signalize +signally +signalman +signalment +signary +signatary +signate +signation +signator +signatory +signatural +signature +signatureless +signaturist +signboard +signee +signer +signet +signetwise +signifer +signifiable +significal +significance +significancy +significant +significantly +significantness +significate +signification +significatist +significative +significatively +significativeness +significator +significatory +significatrix +significature +significavit +significian +significs +signifier +signify +signior +signiorship +signist +signless +signlike +signman +signorial +signorship +signory +signpost +signum +signwriter +Sigurd +Sihasapa +Sika +sika +sikar +sikatch +sike +sikerly +sikerness +siket +Sikh +sikhara +Sikhism +sikhra +Sikinnis +Sikkimese +Siksika +sil +silage +silaginoid +silane +Silas +silbergroschen +silcrete +sile +silen +Silenaceae +silenaceous +Silenales +silence +silenced +silencer +silency +Silene +sileni +silenic +silent +silential +silentiary +silentious +silentish +silently +silentness +silenus +silesia +Silesian +Siletz +silex +silexite +silhouette +silhouettist +silhouettograph +silica +silicam +silicane +silicate +silication +silicatization +Silicea +silicean +siliceocalcareous +siliceofelspathic +siliceofluoric +siliceous +silicic +silicicalcareous +silicicolous +silicide +silicidize +siliciferous +silicification +silicifluoric +silicifluoride +silicify +siliciophite +silicious +Silicispongiae +silicium +siliciuretted +silicize +silicle +silico +silicoacetic +silicoalkaline +silicoaluminate +silicoarsenide +silicocalcareous +silicochloroform +silicocyanide +silicoethane +silicoferruginous +Silicoflagellata +Silicoflagellatae +silicoflagellate +Silicoflagellidae +silicofluoric +silicofluoride +silicohydrocarbon +Silicoidea +silicomagnesian +silicomanganese +silicomethane +silicon +silicone +siliconize +silicononane +silicopropane +silicosis +Silicospongiae +silicotalcose +silicotic +silicotitanate +silicotungstate +silicotungstic +silicula +silicular +silicule +siliculose +siliculous +silicyl +Silipan +siliqua +siliquaceous +siliquae +Siliquaria +Siliquariidae +silique +siliquiferous +siliquiform +siliquose +siliquous +silk +silkalene +silkaline +silked +silken +silker +silkflower +silkgrower +silkie +silkily +silkiness +silklike +silkman +silkness +silksman +silktail +silkweed +silkwoman +silkwood +silkwork +silkworks +silkworm +silky +sill +sillabub +silladar +Sillaginidae +Sillago +sillandar +sillar +siller +Sillery +sillibouk +sillikin +sillily +sillimanite +silliness +sillock +sillograph +sillographer +sillographist +sillometer +sillon +silly +sillyhood +sillyhow +sillyish +sillyism +sillyton +silo +siloist +Silpha +silphid +Silphidae +silphium +silt +siltage +siltation +silting +siltlike +silty +silundum +Silures +Silurian +Siluric +silurid +Siluridae +Siluridan +siluroid +Siluroidei +Silurus +silva +silvan +silvanity +silvanry +Silvanus +silvendy +silver +silverback +silverbeater +silverbelly +silverberry +silverbill +silverboom +silverbush +silvered +silverer +silvereye +silverfin +silverfish +silverhead +silverily +silveriness +silvering +silverish +silverite +silverize +silverizer +silverleaf +silverless +silverlike +silverling +silverly +silvern +silverness +silverpoint +silverrod +silverside +silversides +silverskin +silversmith +silversmithing +silverspot +silvertail +silvertip +silvertop +silvervine +silverware +silverweed +silverwing +silverwood +silverwork +silverworker +silvery +Silvester +Silvia +silvical +silvicolous +silvics +silvicultural +silviculturally +silviculture +silviculturist +Silvius +Silybum +silyl +Sim +sima +Simaba +simal +simar +Simarouba +Simaroubaceae +simaroubaceous +simball +simbil +simblin +simblot +Simblum +sime +Simeon +Simeonism +Simeonite +Simia +simiad +simial +simian +simianity +simiesque +Simiidae +Simiinae +similar +similarity +similarize +similarly +similative +simile +similimum +similiter +similitive +similitude +similitudinize +simility +similize +similor +simioid +simious +simiousness +simity +simkin +simlin +simling +simmer +simmeringly +simmon +simnel +simnelwise +simoleon +Simon +simoniac +simoniacal +simoniacally +Simonian +Simonianism +simonious +simonism +Simonist +simonist +simony +simool +simoom +simoon +Simosaurus +simous +simp +simpai +simper +simperer +simperingly +simple +simplehearted +simpleheartedly +simpleheartedness +simpleness +simpler +simpleton +simpletonian +simpletonianism +simpletonic +simpletonish +simpletonism +simplex +simplexed +simplexity +simplicident +Simplicidentata +simplicidentate +simplicist +simplicitarian +simplicity +simplicize +simplification +simplificative +simplificator +simplified +simplifiedly +simplifier +simplify +simplism +simplist +simplistic +simply +simsim +simson +simulacra +simulacral +simulacre +simulacrize +simulacrum +simulance +simulant +simular +simulate +simulation +simulative +simulatively +simulator +simulatory +simulcast +simuler +simuliid +Simuliidae +simulioid +Simulium +simultaneity +simultaneous +simultaneously +simultaneousness +sin +sina +Sinae +Sinaean +Sinaic +sinaite +Sinaitic +sinal +sinalbin +Sinaloa +sinamay +sinamine +sinapate +sinapic +sinapine +sinapinic +Sinapis +sinapis +sinapism +sinapize +sinapoline +sinarchism +sinarchist +sinarquism +sinarquist +sinarquista +sinawa +sincaline +since +sincere +sincerely +sincereness +sincerity +sincipital +sinciput +sind +sinder +Sindhi +sindle +sindoc +sindon +sindry +sine +sinecural +sinecure +sinecureship +sinecurism +sinecurist +Sinesian +sinew +sinewed +sinewiness +sinewless +sinewous +sinewy +sinfonia +sinfonie +sinfonietta +sinful +sinfully +sinfulness +sing +singability +singable +singableness +singally +singarip +singe +singed +singeing +singeingly +singer +singey +Singfo +singh +Singhalese +singillatim +singing +singingly +singkamas +single +singlebar +singled +singlehanded +singlehandedly +singlehandedness +singlehearted +singleheartedly +singleheartedness +singlehood +singleness +singler +singles +singlestick +singlesticker +singlet +singleton +singletree +singlings +singly +Singpho +Singsing +singsong +singsongy +Singspiel +singspiel +singstress +singular +singularism +singularist +singularity +singularization +singularize +singularly +singularness +singult +singultous +singultus +sinh +Sinhalese +Sinian +Sinic +Sinicism +Sinicization +Sinicize +Sinico +Sinification +Sinify +sinigrin +sinigrinase +sinigrosid +sinigroside +Sinisian +Sinism +sinister +sinisterly +sinisterness +sinisterwise +sinistrad +sinistral +sinistrality +sinistrally +sinistration +sinistrin +sinistrocerebral +sinistrocular +sinistrodextral +sinistrogyrate +sinistrogyration +sinistrogyric +sinistromanual +sinistrorsal +sinistrorsally +sinistrorse +sinistrous +sinistrously +sinistruous +Sinite +Sinitic +sink +sinkable +sinkage +sinker +sinkerless +sinkfield +sinkhead +sinkhole +sinking +Sinkiuse +sinkless +sinklike +sinkroom +sinkstone +sinky +sinless +sinlessly +sinlessness +sinlike +sinnable +sinnableness +sinnen +sinner +sinneress +sinnership +sinnet +Sinningia +sinningly +sinningness +sinoatrial +sinoauricular +Sinogram +sinoidal +Sinolog +Sinologer +Sinological +Sinologist +Sinologue +Sinology +sinomenine +Sinonism +Sinophile +Sinophilism +sinopia +Sinopic +sinopite +sinople +sinproof +Sinsiga +sinsion +sinsring +sinsyne +sinter +Sinto +sintoc +Sintoism +Sintoist +Sintsink +Sintu +sinuate +sinuated +sinuatedentate +sinuately +sinuation +sinuatocontorted +sinuatodentate +sinuatodentated +sinuatopinnatifid +sinuatoserrated +sinuatoundulate +sinuatrial +sinuauricular +sinuitis +sinuose +sinuosely +sinuosity +sinuous +sinuously +sinuousness +Sinupallia +sinupallial +Sinupallialia +Sinupalliata +sinupalliate +sinus +sinusal +sinusitis +sinuslike +sinusoid +sinusoidal +sinusoidally +sinuventricular +sinward +siol +Sion +sion +Sionite +Siouan +Sioux +sip +sipage +sipe +siper +siphoid +siphon +siphonaceous +siphonage +siphonal +Siphonales +Siphonaptera +siphonapterous +Siphonaria +siphonariid +Siphonariidae +Siphonata +siphonate +Siphoneae +siphoneous +siphonet +siphonia +siphonial +Siphoniata +siphonic +Siphonifera +siphoniferous +siphoniform +siphonium +siphonless +siphonlike +Siphonobranchiata +siphonobranchiate +Siphonocladales +Siphonocladiales +siphonogam +Siphonogama +siphonogamic +siphonogamous +siphonogamy +siphonoglyph +siphonoglyphe +siphonognathid +Siphonognathidae +siphonognathous +Siphonognathus +Siphonophora +siphonophoran +siphonophore +siphonophorous +siphonoplax +siphonopore +siphonorhinal +siphonorhine +siphonosome +siphonostele +siphonostelic +siphonostely +Siphonostoma +Siphonostomata +siphonostomatous +siphonostome +siphonostomous +siphonozooid +siphonula +siphorhinal +siphorhinian +siphosome +siphuncle +siphuncled +siphuncular +Siphunculata +siphunculate +siphunculated +Sipibo +sipid +sipidity +Siping +siping +sipling +sipper +sippet +sippingly +sippio +Sipunculacea +sipunculacean +sipunculid +Sipunculida +sipunculoid +Sipunculoidea +Sipunculus +sipylite +Sir +sir +sircar +sirdar +sirdarship +sire +Siredon +sireless +siren +sirene +Sirenia +sirenian +sirenic +sirenical +sirenically +Sirenidae +sirening +sirenize +sirenlike +sirenoid +Sirenoidea +Sirenoidei +sireny +sireship +siress +sirgang +Sirian +sirian +Sirianian +siriasis +siricid +Siricidae +Siricoidea +sirih +siriometer +Sirione +siris +Sirius +sirkeer +sirki +sirky +sirloin +sirloiny +Sirmian +Sirmuellera +siroc +sirocco +siroccoish +siroccoishly +sirpea +sirple +sirpoon +sirrah +sirree +sirship +siruaballi +siruelas +sirup +siruped +siruper +sirupy +Siryan +Sis +sis +sisal +siscowet +sise +sisel +siserara +siserary +siserskite +sish +sisham +sisi +siskin +Sisley +sismotherapy +siss +Sisseton +sissification +sissify +sissiness +sissoo +Sissu +sissy +sissyish +sissyism +sist +Sistani +sister +sisterhood +sisterin +sistering +sisterize +sisterless +sisterlike +sisterliness +sisterly +sistern +Sistine +sistle +sistomensin +sistrum +Sistrurus +Sisymbrium +Sisyphean +Sisyphian +Sisyphides +Sisyphism +Sisyphist +Sisyphus +Sisyrinchium +sisyrinchium +sit +Sita +sitao +sitar +sitatunga +sitch +site +sitfast +sith +sithcund +sithe +sithement +sithence +sithens +sitient +sitio +sitiology +sitiomania +sitiophobia +Sitka +Sitkan +sitology +sitomania +Sitophilus +sitophobia +sitophobic +sitosterin +sitosterol +sitotoxism +Sitta +sittee +sitten +sitter +Sittidae +Sittinae +sittine +sitting +sittringy +situal +situate +situated +situation +situational +situla +situlae +situs +Sium +Siusi +Siuslaw +Siva +siva +Sivaism +Sivaist +Sivaistic +Sivaite +Sivan +Sivapithecus +sivathere +Sivatheriidae +Sivatheriinae +sivatherioid +Sivatherium +siver +sivvens +Siwan +Siwash +siwash +six +sixain +sixer +sixfoil +sixfold +sixhaend +sixhynde +sixpence +sixpenny +sixpennyworth +sixscore +sixsome +sixte +sixteen +sixteener +sixteenfold +sixteenmo +sixteenth +sixteenthly +sixth +sixthet +sixthly +sixtieth +Sixtowns +Sixtus +sixty +sixtyfold +sixtypenny +sizable +sizableness +sizably +sizal +sizar +sizarship +size +sizeable +sizeableness +sized +sizeman +sizer +sizes +siziness +sizing +sizy +sizygia +sizygium +sizz +sizzard +sizzing +sizzle +sizzling +sizzlingly +Sjaak +sjambok +Sjouke +skaddle +skaff +skaffie +skag +skaillie +skainsmate +skair +skaitbird +skal +skalawag +skaldship +skance +Skanda +skandhas +skart +skasely +Skat +skat +skate +skateable +skater +skatikas +skatiku +skating +skatist +skatole +skatosine +skatoxyl +skaw +skean +skeanockle +skedaddle +skedaddler +skedge +skedgewith +skedlock +skee +skeed +skeeg +skeel +skeeling +skeely +skeen +skeenyie +skeer +skeered +skeery +skeesicks +skeet +Skeeter +skeeter +skeezix +Skef +skeg +skegger +skeif +skeigh +skeily +skein +skeiner +skeipp +skel +skelder +skelderdrake +skeldrake +skeletal +skeletin +skeletogenous +skeletogeny +skeletomuscular +skeleton +skeletonian +skeletonic +skeletonization +skeletonize +skeletonizer +skeletonless +skeletonweed +skeletony +skelf +skelgoose +skelic +skell +skellat +skeller +skelloch +skellum +skelly +skelp +skelper +skelpin +skelping +skelter +Skeltonian +Skeltonic +Skeltonical +Skeltonics +skemmel +skemp +sken +skene +skeo +skeough +skep +skepful +skeppist +skeppund +skeptic +skeptical +skeptically +skepticalness +skepticism +skepticize +sker +skere +skerret +skerrick +skerry +sketch +sketchability +sketchable +sketchbook +sketchee +sketcher +sketchily +sketchiness +sketching +sketchingly +sketchist +sketchlike +sketchy +skete +sketiotai +skeuomorph +skeuomorphic +skevish +skew +skewback +skewbacked +skewbald +skewed +skewer +skewerer +skewerwood +skewings +skewl +skewly +skewness +skewwhiff +skewwise +skewy +skey +skeyting +ski +skiagram +skiagraph +skiagrapher +skiagraphic +skiagraphical +skiagraphically +skiagraphy +skiameter +skiametry +skiapod +skiapodous +skiascope +skiascopy +skibby +skibslast +skice +skid +skidded +skidder +skidding +skiddingly +skiddoo +skiddy +Skidi +skidpan +skidproof +skidway +skied +skieppe +skiepper +skier +skies +skiff +skiffless +skiffling +skift +skiing +skijore +skijorer +skijoring +skil +skilder +skildfel +skilfish +skill +skillagalee +skilled +skillenton +skillessness +skillet +skillful +skillfully +skillfulness +skilligalee +skilling +skillion +skilly +skilpot +skilts +skim +skimback +skime +skimmed +skimmer +skimmerton +Skimmia +skimming +skimmingly +skimmington +skimmity +skimp +skimpily +skimpiness +skimpingly +skimpy +skin +skinbound +skinch +skinflint +skinflintily +skinflintiness +skinflinty +skinful +skink +skinker +skinking +skinkle +skinless +skinlike +skinned +skinner +skinnery +skinniness +skinning +skinny +skintight +skinworm +skiogram +skiograph +skiophyte +Skip +skip +skipbrain +Skipetar +skipjack +skipjackly +skipkennel +skipman +skippable +skippel +skipper +skippered +skippership +skippery +skippet +skipping +skippingly +skipple +skippund +skippy +skiptail +skirl +skirlcock +skirling +skirmish +skirmisher +skirmishing +skirmishingly +skirp +skirr +skirreh +skirret +skirt +skirtboard +skirted +skirter +skirting +skirtingly +skirtless +skirtlike +skirty +skirwhit +skirwort +skit +skite +skiter +skither +Skitswish +Skittaget +Skittagetan +skitter +skittish +skittishly +skittishness +skittle +skittled +skittler +skittles +skitty +skittyboot +skiv +skive +skiver +skiverwood +skiving +skivvies +sklate +sklater +sklent +skleropelite +sklinter +skoal +Skodaic +skogbolite +Skoinolon +skokiaan +Skokomish +skomerite +skoo +skookum +Skopets +skoptsy +skout +skraeling +skraigh +skrike +skrimshander +skrupul +skua +skulduggery +skulk +skulker +skulking +skulkingly +skull +skullbanker +skullcap +skulled +skullery +skullfish +skullful +skully +skulp +skun +skunk +skunkbill +skunkbush +skunkdom +skunkery +skunkhead +skunkish +skunklet +skunktop +skunkweed +skunky +Skupshtina +skuse +skutterudite +sky +skybal +skycraft +Skye +skyey +skyful +skyish +skylark +skylarker +skyless +skylight +skylike +skylook +skyman +skyphoi +skyphos +skyplast +skyre +skyrgaliard +skyrocket +skyrockety +skysail +skyscape +skyscraper +skyscraping +skyshine +skyugle +skyward +skywards +skyway +skywrite +skywriter +skywriting +sla +slab +slabbed +slabber +slabberer +slabbery +slabbiness +slabbing +slabby +slabman +slabness +slabstone +slack +slackage +slacked +slacken +slackener +slacker +slackerism +slacking +slackingly +slackly +slackness +slad +sladang +slade +slae +slag +slaggability +slaggable +slagger +slagging +slaggy +slagless +slaglessness +slagman +slain +slainte +slaister +slaistery +slait +slake +slakeable +slakeless +slaker +slaking +slaky +slam +slammakin +slammerkin +slammock +slammocking +slammocky +slamp +slampamp +slampant +slander +slanderer +slanderful +slanderfully +slandering +slanderingly +slanderous +slanderously +slanderousness +slanderproof +slane +slang +slangily +slanginess +slangish +slangishly +slangism +slangkop +slangous +slangster +slanguage +slangular +slangy +slank +slant +slantindicular +slantindicularly +slanting +slantingly +slantingways +slantly +slantways +slantwise +slap +slapdash +slapdashery +slape +slaphappy +slapjack +slapper +slapping +slapstick +slapsticky +slare +slart +slarth +Slartibartfast +slash +slashed +slasher +slashing +slashingly +slashy +slat +slatch +slate +slateful +slatelike +slatemaker +slatemaking +slater +slateworks +slateyard +slath +slather +slatify +slatiness +slating +slatish +slatted +slatter +slattern +slatternish +slatternliness +slatternly +slatternness +slattery +slatting +slaty +slaughter +slaughterer +slaughterhouse +slaughteringly +slaughterman +slaughterous +slaughterously +slaughteryard +slaum +Slav +Slavdom +Slave +slave +slaveborn +slaved +slaveholder +slaveholding +slaveland +slaveless +slavelet +slavelike +slaveling +slavemonger +slaveowner +slaveownership +slavepen +slaver +slaverer +slavering +slaveringly +slavery +Slavey +slavey +Slavi +Slavian +Slavic +Slavicism +Slavicize +Slavification +Slavify +slavikite +slaving +Slavish +slavish +slavishly +slavishness +Slavism +Slavist +Slavistic +Slavization +Slavize +slavocracy +slavocrat +slavocratic +Slavonian +Slavonianize +Slavonic +Slavonically +Slavonicize +Slavonish +Slavonism +Slavonization +Slavonize +Slavophile +Slavophilism +Slavophobe +Slavophobist +slaw +slay +slayable +slayer +slaying +sleathy +sleave +sleaved +sleaziness +sleazy +Sleb +sleck +sled +sledded +sledder +sledding +sledful +sledge +sledgeless +sledgemeter +sledger +sledging +sledlike +slee +sleech +sleechy +sleek +sleeken +sleeker +sleeking +sleekit +sleekly +sleekness +sleeky +sleep +sleeper +sleepered +sleepful +sleepfulness +sleepify +sleepily +sleepiness +sleeping +sleepingly +sleepland +sleepless +sleeplessly +sleeplessness +sleeplike +sleepmarken +sleepproof +sleepry +sleepwaker +sleepwaking +sleepwalk +sleepwalker +sleepwalking +sleepward +sleepwort +sleepy +sleepyhead +sleer +sleet +sleetiness +sleeting +sleetproof +sleety +sleeve +sleeveband +sleeveboard +sleeved +sleeveen +sleevefish +sleeveful +sleeveless +sleevelessness +sleevelet +sleevelike +sleever +sleigh +sleigher +sleighing +sleight +sleightful +sleighty +slendang +slender +slenderish +slenderize +slenderly +slenderness +slent +slepez +slept +slete +sleuth +sleuthdog +sleuthful +sleuthhound +sleuthlike +slew +slewed +slewer +slewing +sley +sleyer +slice +sliceable +sliced +slicer +slich +slicht +slicing +slicingly +slick +slicken +slickens +slickenside +slicker +slickered +slickery +slicking +slickly +slickness +slid +slidable +slidableness +slidably +slidage +slidden +slidder +sliddery +slide +slideable +slideableness +slideably +slided +slidehead +slideman +slideproof +slider +slideway +sliding +slidingly +slidingness +slidometer +slifter +slight +slighted +slighter +slightily +slightiness +slighting +slightingly +slightish +slightly +slightness +slighty +slim +slime +slimeman +slimer +slimily +sliminess +slimish +slimishness +slimly +slimmish +slimness +slimpsy +slimsy +slimy +sline +sling +slingball +slinge +slinger +slinging +slingshot +slingsman +slingstone +slink +slinker +slinkily +slinkiness +slinking +slinkingly +slinkskin +slinkweed +slinky +slip +slipback +slipband +slipboard +slipbody +slipcase +slipcoach +slipcoat +slipe +slipgibbet +sliphorn +sliphouse +slipknot +slipless +slipman +slipover +slippage +slipped +slipper +slippered +slipperflower +slipperily +slipperiness +slipperlike +slipperweed +slipperwort +slippery +slipperyback +slipperyroot +slippiness +slipping +slippingly +slipproof +slippy +slipshod +slipshoddiness +slipshoddy +slipshodness +slipshoe +slipslap +slipslop +slipsloppish +slipsloppism +slipsole +slipstep +slipstring +sliptopped +slipway +slirt +slish +slit +slitch +slite +slither +slithering +slitheroo +slithers +slithery +slithy +slitless +slitlike +slitshell +slitted +slitter +slitting +slitty +slitwise +slive +sliver +sliverer +sliverlike +sliverproof +slivery +sliving +slivovitz +sloan +Sloanea +slob +slobber +slobberchops +slobberer +slobbers +slobbery +slobby +slock +slocken +slod +slodder +slodge +slodger +sloe +sloeberry +sloebush +sloetree +slog +slogan +sloganeer +sloganize +slogger +slogging +slogwood +sloka +sloke +slommock +slon +slone +slonk +sloo +sloom +sloomy +sloop +sloopman +sloosh +slop +slopdash +slope +sloped +slopely +slopeness +sloper +slopeways +slopewise +sloping +slopingly +slopingness +slopmaker +slopmaking +sloppage +slopped +sloppery +sloppily +sloppiness +slopping +sloppy +slops +slopseller +slopselling +slopshop +slopstone +slopwork +slopworker +slopy +slorp +slosh +slosher +sloshily +sloshiness +sloshy +slot +slote +sloted +sloth +slothful +slothfully +slothfulness +slothound +slotted +slotter +slottery +slotting +slotwise +slouch +sloucher +slouchily +slouchiness +slouching +slouchingly +slouchy +slough +sloughiness +sloughy +slour +sloush +Slovak +Slovakian +Slovakish +sloven +Slovene +Slovenian +Slovenish +slovenlike +slovenliness +slovenly +slovenwood +Slovintzi +slow +slowbellied +slowbelly +slowdown +slowgoing +slowheaded +slowhearted +slowheartedness +slowhound +slowish +slowly +slowmouthed +slowpoke +slowrie +slows +slowworm +sloyd +slub +slubber +slubberdegullion +slubberer +slubbering +slubberingly +slubberly +slubbery +slubbing +slubby +slud +sludder +sluddery +sludge +sludged +sludger +sludgy +slue +sluer +slug +slugabed +sluggard +sluggarding +sluggardize +sluggardliness +sluggardly +sluggardness +sluggardry +slugged +slugger +slugging +sluggingly +sluggish +sluggishly +sluggishness +sluggy +sluglike +slugwood +sluice +sluicelike +sluicer +sluiceway +sluicing +sluicy +sluig +sluit +slum +slumber +slumberer +slumberful +slumbering +slumberingly +slumberland +slumberless +slumberous +slumberously +slumberousness +slumberproof +slumbersome +slumbery +slumbrous +slumdom +slumgullion +slumgum +slumland +slummage +slummer +slumminess +slumming +slummock +slummocky +slummy +slump +slumpproof +slumproof +slumpwork +slumpy +slumward +slumwise +slung +slungbody +slunge +slunk +slunken +slur +slurbow +slurp +slurry +slush +slusher +slushily +slushiness +slushy +slut +slutch +slutchy +sluther +sluthood +slutter +sluttery +sluttikin +sluttish +sluttishly +sluttishness +slutty +sly +slyboots +slyish +slyly +slyness +slype +sma +smachrie +smack +smackee +smacker +smackful +smacking +smackingly +smacksman +smaik +Smalcaldian +Smalcaldic +small +smallage +smallclothes +smallcoal +smallen +smaller +smallhearted +smallholder +smalling +smallish +smallmouth +smallmouthed +smallness +smallpox +smalls +smallsword +smalltime +smallware +smally +smalm +smalt +smalter +smaltine +smaltite +smalts +smaragd +smaragdine +smaragdite +smaragdus +smarm +smarmy +smart +smarten +smarting +smartingly +smartish +smartism +smartless +smartly +smartness +smartweed +smarty +smash +smashable +smashage +smashboard +smasher +smashery +smashing +smashingly +smashment +smashup +smatter +smatterer +smattering +smatteringly +smattery +smaze +smear +smearcase +smeared +smearer +smeariness +smearless +smeary +smectic +smectis +smectite +Smectymnuan +Smectymnuus +smeddum +smee +smeech +smeek +smeeky +smeer +smeeth +smegma +smell +smellable +smellage +smelled +smeller +smellful +smellfungi +smellfungus +smelliness +smelling +smellproof +smellsome +smelly +smelt +smelter +smelterman +smeltery +smeltman +smeth +smethe +smeuse +smew +smich +smicker +smicket +smiddie +smiddum +smidge +smidgen +smifligate +smifligation +smiggins +Smilacaceae +smilacaceous +Smilaceae +smilaceous +smilacin +Smilacina +Smilax +smilax +smile +smileable +smileage +smileful +smilefulness +smileless +smilelessly +smilelessness +smilemaker +smilemaking +smileproof +smiler +smilet +smiling +smilingly +smilingness +Smilodon +smily +Smintheus +Sminthian +sminthurid +Sminthuridae +Sminthurus +smirch +smircher +smirchless +smirchy +smiris +smirk +smirker +smirking +smirkingly +smirkish +smirkle +smirkly +smirky +smirtle +smit +smitch +smite +smiter +smith +smitham +smithcraft +smither +smithereens +smithery +Smithian +Smithianism +smithing +smithite +Smithsonian +smithsonite +smithwork +smithy +smithydander +smiting +smitten +smitting +smock +smocker +smockface +smocking +smockless +smocklike +smog +smokables +smoke +smokeable +smokebox +smokebush +smoked +smokefarthings +smokehouse +smokejack +smokeless +smokelessly +smokelessness +smokelike +smokeproof +smoker +smokery +smokestack +smokestone +smoketight +smokewood +smokily +smokiness +smoking +smokish +smoky +smokyseeming +smolder +smolderingness +smolt +smooch +smoochy +smoodge +smoodger +smook +smoorich +Smoos +smoot +smooth +smoothable +smoothback +smoothbore +smoothbored +smoothcoat +smoothen +smoother +smoothification +smoothify +smoothing +smoothingly +smoothish +smoothly +smoothmouthed +smoothness +smoothpate +smopple +smore +smorgasbord +smote +smother +smotherable +smotheration +smothered +smotherer +smotheriness +smothering +smotheringly +smothery +smotter +smouch +smoucher +smous +smouse +smouser +smout +smriti +smudge +smudged +smudgedly +smudgeless +smudgeproof +smudger +smudgily +smudginess +smudgy +smug +smuggery +smuggish +smuggishly +smuggishness +smuggle +smuggleable +smuggler +smugglery +smuggling +smugism +smugly +smugness +smuisty +smur +smurr +smurry +smuse +smush +smut +smutch +smutchin +smutchless +smutchy +smutproof +smutted +smutter +smuttily +smuttiness +smutty +Smyrna +Smyrnaite +Smyrnean +Smyrniot +Smyrniote +smyth +smytrie +snab +snabbie +snabble +snack +snackle +snackman +snaff +snaffle +snaffles +snafu +snag +snagbush +snagged +snagger +snaggled +snaggletooth +snaggy +snagrel +snail +snaileater +snailery +snailfish +snailflower +snailish +snailishly +snaillike +snails +snaily +snaith +snake +snakebark +snakeberry +snakebird +snakebite +snakefish +snakeflower +snakehead +snakeholing +snakeleaf +snakeless +snakelet +snakelike +snakeling +snakemouth +snakeneck +snakeology +snakephobia +snakepiece +snakepipe +snakeproof +snaker +snakeroot +snakery +snakeship +snakeskin +snakestone +snakeweed +snakewise +snakewood +snakeworm +snakewort +snakily +snakiness +snaking +snakish +snaky +snap +snapback +snapbag +snapberry +snapdragon +snape +snaper +snaphead +snapholder +snapjack +snapless +snappable +snapped +snapper +snappily +snappiness +snapping +snappingly +snappish +snappishly +snappishness +snapps +snappy +snaps +snapsack +snapshot +snapshotter +snapweed +snapwood +snapwort +snapy +snare +snareless +snarer +snaringly +snark +snarl +snarler +snarleyyow +snarlingly +snarlish +snarly +snary +snaste +snatch +snatchable +snatched +snatcher +snatchily +snatching +snatchingly +snatchproof +snatchy +snath +snathe +snavel +snavvle +snaw +snead +sneak +sneaker +sneakiness +sneaking +sneakingly +sneakingness +sneakish +sneakishly +sneakishness +sneaksby +sneaksman +sneaky +sneap +sneath +sneathe +sneb +sneck +sneckdraw +sneckdrawing +sneckdrawn +snecker +snecket +sned +snee +sneer +sneerer +sneerful +sneerfulness +sneering +sneeringly +sneerless +sneery +sneesh +sneeshing +sneest +sneesty +sneeze +sneezeless +sneezeproof +sneezer +sneezeweed +sneezewood +sneezewort +sneezing +sneezy +snell +snelly +Snemovna +snerp +snew +snib +snibble +snibbled +snibbler +snibel +snicher +snick +snickdraw +snickdrawing +snicker +snickering +snickeringly +snickersnee +snicket +snickey +snickle +sniddle +snide +snideness +sniff +sniffer +sniffily +sniffiness +sniffing +sniffingly +sniffish +sniffishness +sniffle +sniffler +sniffly +sniffy +snift +snifter +snifty +snig +snigger +sniggerer +sniggering +sniggle +sniggler +sniggoringly +snip +snipe +snipebill +snipefish +snipelike +sniper +sniperscope +sniping +snipish +snipjack +snipnose +snipocracy +snipper +snippersnapper +snipperty +snippet +snippetiness +snippety +snippiness +snipping +snippish +snippy +snipsnapsnorum +sniptious +snipy +snirl +snirt +snirtle +snitch +snitcher +snite +snithe +snithy +snittle +snivel +sniveled +sniveler +sniveling +snively +snivy +snob +snobber +snobbery +snobbess +snobbing +snobbish +snobbishly +snobbishness +snobbism +snobby +snobdom +snobling +snobocracy +snobocrat +snobographer +snobography +snobologist +snobonomer +snobscat +snocher +snock +snocker +snod +snodly +snoek +snoeking +snog +snoga +Snohomish +snoke +Snonowas +snood +snooded +snooding +snook +snooker +snookered +snoop +snooper +snooperscope +snoopy +snoose +snoot +snootily +snootiness +snooty +snoove +snooze +snoozer +snooziness +snoozle +snoozy +snop +Snoqualmie +Snoquamish +snore +snoreless +snorer +snoring +snoringly +snork +snorkel +snorker +snort +snorter +snorting +snortingly +snortle +snorty +snot +snotter +snottily +snottiness +snotty +snouch +snout +snouted +snouter +snoutish +snoutless +snoutlike +snouty +Snow +snow +Snowball +snowball +snowbank +snowbell +snowberg +snowberry +snowbird +snowblink +snowbound +snowbreak +snowbush +snowcap +snowcraft +Snowdonian +snowdrift +snowdrop +snowfall +snowflake +snowflight +snowflower +snowfowl +snowhammer +snowhouse +snowie +snowily +snowiness +snowish +snowk +snowl +snowland +snowless +snowlike +snowmanship +snowmobile +snowplow +snowproof +snowscape +snowshade +snowshed +snowshine +snowshoe +snowshoed +snowshoeing +snowshoer +snowslide +snowslip +snowstorm +snowsuit +snowworm +snowy +snozzle +snub +snubbable +snubbed +snubbee +snubber +snubbiness +snubbing +snubbingly +snubbish +snubbishly +snubbishness +snubby +snubproof +snuck +snudge +snuff +snuffbox +snuffboxer +snuffcolored +snuffer +snuffers +snuffiness +snuffing +snuffingly +snuffish +snuffle +snuffler +snuffles +snuffless +snuffliness +snuffling +snufflingly +snuffly +snuffman +snuffy +snug +snugger +snuggery +snuggish +snuggle +snugify +snugly +snugness +snum +snup +snupper +snur +snurl +snurly +snurp +snurt +snuzzle +sny +snying +so +soak +soakage +soakaway +soaked +soaken +soaker +soaking +soakingly +soakman +soaky +soally +soam +soap +soapbark +soapberry +soapbox +soapboxer +soapbubbly +soapbush +soaper +soapery +soapfish +soapily +soapiness +soaplees +soapless +soaplike +soapmaker +soapmaking +soapmonger +soaprock +soaproot +soapstone +soapsud +soapsuddy +soapsuds +soapsudsy +soapweed +soapwood +soapwort +soapy +soar +soarability +soarable +soarer +soaring +soaringly +soary +sob +sobber +sobbing +sobbingly +sobby +sobeit +sober +soberer +sobering +soberingly +soberize +soberlike +soberly +soberness +sobersault +sobersided +sobersides +soberwise +sobful +soboles +soboliferous +sobproof +Sobralia +sobralite +Sobranje +sobrevest +sobriety +sobriquet +sobriquetical +soc +socage +socager +soccer +soccerist +soccerite +soce +socht +sociability +sociable +sociableness +sociably +social +Sociales +socialism +socialist +socialistic +socialite +sociality +socializable +socialization +socialize +socializer +socially +socialness +sociation +sociative +societal +societally +societarian +societarianism +societary +societified +societism +societist +societologist +societology +society +societyish +societyless +socii +Socinian +Socinianism +Socinianistic +Socinianize +sociobiological +sociocentric +sociocracy +sociocrat +sociocratic +sociocultural +sociodrama +sociodramatic +socioeconomic +socioeducational +sociogenesis +sociogenetic +sociogeny +sociography +sociolatry +sociolegal +sociologian +sociologic +sociological +sociologically +sociologism +sociologist +sociologistic +sociologize +sociologizer +sociologizing +sociology +sociomedical +sociometric +sociometry +socionomic +socionomics +socionomy +sociophagous +sociopolitical +socioreligious +socioromantic +sociostatic +sociotechnical +socius +sock +sockdolager +socker +socket +socketful +socketless +sockeye +sockless +socklessness +sockmaker +sockmaking +socky +socle +socman +socmanry +soco +Socorrito +Socotran +Socotri +Socotrine +Socratean +Socratic +Socratical +Socratically +Socraticism +Socratism +Socratist +Socratize +sod +soda +sodaclase +sodaic +sodaless +sodalist +sodalite +sodalithite +sodality +sodamide +sodbuster +sodded +sodden +soddenly +soddenness +sodding +soddite +soddy +sodic +sodio +sodioaluminic +sodioaurous +sodiocitrate +sodiohydric +sodioplatinic +sodiosalicylate +sodiotartrate +sodium +sodless +sodoku +Sodom +sodomic +Sodomist +Sodomite +sodomitess +sodomitic +sodomitical +sodomitically +Sodomitish +sodomy +sodwork +sody +soe +soekoe +soever +sofa +sofane +sofar +soffit +Sofia +Sofoklis +Sofronia +soft +softa +softball +softbrained +soften +softener +softening +softhead +softheaded +softhearted +softheartedly +softheartedness +softhorn +softish +softling +softly +softner +softness +softship +softtack +softwood +softy +sog +Soga +Sogdian +Sogdianese +Sogdianian +Sogdoite +soger +soget +soggarth +soggendalite +soggily +sogginess +sogging +soggy +soh +soho +Soiesette +soiesette +soil +soilage +soiled +soiling +soilless +soilproof +soilure +soily +soiree +soixantine +Soja +soja +sojourn +sojourner +sojourney +sojournment +sok +soka +soke +sokeman +sokemanemot +sokemanry +soken +Sokoki +Sokotri +Sokulk +Sol +sol +sola +solace +solaceful +solacement +solaceproof +solacer +solacious +solaciously +solaciousness +solan +Solanaceae +solanaceous +solanal +Solanales +solander +solaneine +solaneous +solanidine +solanine +Solanum +solanum +solar +solarism +solarist +solaristic +solaristically +solaristics +Solarium +solarium +solarization +solarize +solarometer +solate +solatia +solation +solatium +solay +sold +soldado +Soldan +soldan +soldanel +Soldanella +soldanelle +soldanrie +solder +solderer +soldering +solderless +soldi +soldier +soldierbird +soldierbush +soldierdom +soldieress +soldierfish +soldierhearted +soldierhood +soldiering +soldierize +soldierlike +soldierliness +soldierly +soldierproof +soldiership +soldierwise +soldierwood +soldiery +soldo +sole +Solea +solea +soleas +solecism +solecist +solecistic +solecistical +solecistically +solecize +solecizer +Soleidae +soleiform +soleil +soleless +solely +solemn +solemncholy +solemnify +solemnitude +solemnity +solemnization +solemnize +solemnizer +solemnly +solemnness +Solen +solen +solenacean +solenaceous +soleness +solenette +solenial +Solenidae +solenite +solenitis +solenium +solenoconch +Solenoconcha +solenocyte +Solenodon +solenodont +Solenodontidae +solenogaster +Solenogastres +solenoglyph +Solenoglypha +solenoglyphic +solenoid +solenoidal +solenoidally +Solenopsis +solenostele +solenostelic +solenostomid +Solenostomidae +solenostomoid +solenostomous +Solenostomus +solent +solentine +solepiece +soleplate +soleprint +soler +Solera +soles +soleus +soleyn +solfataric +solfeggio +solferino +soli +soliative +solicit +solicitant +solicitation +solicitationism +solicited +solicitee +soliciter +soliciting +solicitor +solicitorship +solicitous +solicitously +solicitousness +solicitress +solicitrix +solicitude +solicitudinous +solid +Solidago +solidago +solidaric +solidarily +solidarism +solidarist +solidaristic +solidarity +solidarize +solidary +solidate +solidi +solidifiability +solidifiable +solidifiableness +solidification +solidifier +solidiform +solidify +solidish +solidism +solidist +solidistic +solidity +solidly +solidness +solidum +Solidungula +solidungular +solidungulate +solidus +solifidian +solifidianism +solifluction +solifluctional +soliform +Solifugae +solifuge +solifugean +solifugid +solifugous +soliloquacious +soliloquist +soliloquium +soliloquize +soliloquizer +soliloquizing +soliloquizingly +soliloquy +solilunar +Solio +solio +soliped +solipedal +solipedous +solipsism +solipsismal +solipsist +solipsistic +solist +solitaire +solitarian +solitarily +solitariness +solitary +soliterraneous +solitidal +solitude +solitudinarian +solitudinize +solitudinous +solivagant +solivagous +sollar +solleret +Sollya +solmizate +solmization +solo +solod +solodi +solodization +solodize +soloecophanes +soloist +Solomon +Solomonian +Solomonic +Solomonical +Solomonitic +Solon +solon +solonchak +solonetz +solonetzic +solonetzicity +Solonian +Solonic +solonist +soloth +solotink +solotnik +solpugid +Solpugida +Solpugidea +Solpugides +solstice +solsticion +solstitia +solstitial +solstitially +solstitium +solubility +solubilization +solubilize +soluble +solubleness +solubly +solum +solute +solution +solutional +solutioner +solutionist +solutize +solutizer +Solutrean +solvability +solvable +solvableness +solvate +solvation +solve +solvement +solvency +solvend +solvent +solvently +solventproof +solver +solvolysis +solvolytic +solvolyze +solvsbergite +Solyma +Solymaean +soma +somacule +Somal +somal +Somali +somaplasm +Somaschian +somasthenia +somata +somatasthenia +Somateria +somatic +somatical +somatically +somaticosplanchnic +somaticovisceral +somatics +somatism +somatist +somatization +somatochrome +somatocyst +somatocystic +somatoderm +somatogenetic +somatogenic +somatognosis +somatognostic +somatologic +somatological +somatologically +somatologist +somatology +somatome +somatomic +somatophyte +somatophytic +somatoplasm +somatopleural +somatopleure +somatopleuric +somatopsychic +somatosplanchnic +somatotonia +somatotonic +somatotropic +somatotropically +somatotropism +somatotype +somatotyper +somatotypy +somatous +somber +somberish +somberly +somberness +sombre +sombrerite +sombrero +sombreroed +sombrous +sombrously +sombrousness +some +somebody +someday +somedeal +somegate +somehow +someone +somepart +someplace +somers +somersault +somerset +Somersetian +somervillite +somesthesia +somesthesis +somesthetic +something +somethingness +sometime +sometimes +someway +someways +somewhat +somewhatly +somewhatness +somewhen +somewhence +somewhere +somewheres +somewhile +somewhiles +somewhither +somewhy +somewise +somital +somite +somitic +somma +sommaite +sommelier +somnambulance +somnambulancy +somnambulant +somnambular +somnambulary +somnambulate +somnambulation +somnambulator +somnambule +somnambulency +somnambulic +somnambulically +somnambulism +somnambulist +somnambulistic +somnambulize +somnambulous +somnial +somniative +somnifacient +somniferous +somniferously +somnific +somnifuge +somnify +somniloquacious +somniloquence +somniloquent +somniloquism +somniloquist +somniloquize +somniloquous +somniloquy +Somniosus +somnipathist +somnipathy +somnivolency +somnivolent +somnolence +somnolency +somnolent +somnolently +somnolescence +somnolescent +somnolism +somnolize +somnopathy +somnorific +somnus +sompay +sompne +sompner +Son +son +sonable +sonance +sonancy +sonant +sonantal +sonantic +sonantina +sonantized +sonar +sonata +sonatina +sonation +Sonchus +sond +sondation +sondeli +Sonderbund +sonderclass +Sondergotter +Sondylomorum +soneri +song +songbird +songbook +songcraft +songfest +songful +songfully +songfulness +Songhai +Songish +songish +songland +songle +songless +songlessly +songlessness +songlet +songlike +songman +Songo +Songoi +songster +songstress +songworthy +songwright +songy +sonhood +sonic +soniferous +sonification +soniou +Sonja +sonk +sonless +sonlike +sonlikeness +sonly +Sonneratia +Sonneratiaceae +sonneratiaceous +sonnet +sonnetary +sonneteer +sonneteeress +sonnetic +sonneting +sonnetish +sonnetist +sonnetize +sonnetlike +sonnetwise +sonnikins +Sonny +sonny +sonobuoy +sonometer +Sonoran +sonorant +sonorescence +sonorescent +sonoric +sonoriferous +sonoriferously +sonorific +sonority +sonorophone +sonorosity +sonorous +sonorously +sonorousness +Sonrai +sons +sonship +sonsy +sontag +soodle +soodly +Soohong +sook +Sooke +sooky +sool +sooloos +soon +sooner +soonish +soonly +Soorah +soorawn +soord +soorkee +Soot +soot +sooter +sooterkin +sooth +soothe +soother +sootherer +soothful +soothing +soothingly +soothingness +soothless +soothsay +soothsayer +soothsayership +soothsaying +sootily +sootiness +sootless +sootlike +sootproof +sooty +sootylike +sop +sope +soph +Sopheric +Sopherim +Sophia +sophia +Sophian +sophic +sophical +sophically +sophiologic +sophiology +sophism +Sophist +sophister +sophistic +sophistical +sophistically +sophisticalness +sophisticant +sophisticate +sophisticated +sophistication +sophisticative +sophisticator +sophisticism +Sophistress +sophistress +sophistry +Sophoclean +sophomore +sophomoric +sophomorical +sophomorically +Sophora +sophoria +Sophronia +sophronize +Sophy +sophy +sopite +sopition +sopor +soporiferous +soporiferously +soporiferousness +soporific +soporifical +soporifically +soporose +sopper +soppiness +sopping +soppy +soprani +sopranino +sopranist +soprano +sora +Sorabian +sorage +soral +Sorb +sorb +Sorbaria +sorbate +sorbefacient +sorbent +Sorbian +sorbic +sorbile +sorbin +sorbinose +Sorbish +sorbite +sorbitic +sorbitize +sorbitol +Sorbonic +Sorbonical +Sorbonist +Sorbonne +sorbose +sorboside +Sorbus +sorbus +sorcer +sorcerer +sorceress +sorcering +sorcerous +sorcerously +sorcery +sorchin +sorda +Sordaria +Sordariaceae +sordawalite +sordellina +Sordello +sordes +sordid +sordidity +sordidly +sordidness +sordine +sordino +sordor +sore +soredia +soredial +sorediate +sorediferous +sorediform +soredioid +soredium +soree +sorefalcon +sorefoot +sorehawk +sorehead +soreheaded +soreheadedly +soreheadedness +sorehearted +sorehon +sorely +sorema +soreness +Sorex +sorgho +Sorghum +sorghum +sorgo +sori +soricid +Soricidae +soricident +Soricinae +soricine +soricoid +Soricoidea +soriferous +sorite +sorites +soritical +sorn +sornare +sornari +sorner +sorning +soroban +Soroptimist +sororal +sororate +sororial +sororially +sororicidal +sororicide +sorority +sororize +sorose +sorosis +sorosphere +Sorosporella +Sorosporium +sorption +sorra +Sorrel +sorrel +sorrento +sorrily +sorriness +sorroa +sorrow +sorrower +sorrowful +sorrowfully +sorrowfulness +sorrowing +sorrowingly +sorrowless +sorrowproof +sorrowy +sorry +sorryhearted +sorryish +sort +sortable +sortably +sortal +sortation +sorted +sorter +sortie +sortilege +sortileger +sortilegic +sortilegious +sortilegus +sortilegy +sortiment +sortition +sortly +sorty +sorus +sorva +sory +sosh +soshed +Sosia +soso +sosoish +Sospita +soss +sossle +sostenuto +sot +Sotadean +Sotadic +Soter +Soteres +soterial +soteriologic +soteriological +soteriology +Sothiac +Sothiacal +Sothic +Sothis +Sotho +sotie +Sotik +sotnia +sotnik +sotol +sots +sottage +sotted +sotter +sottish +sottishly +sottishness +sou +souari +soubise +soubrette +soubrettish +soucar +souchet +Souchong +souchong +souchy +soud +soudagur +souffle +souffleed +sough +sougher +soughing +sought +Souhegan +soul +soulack +soulcake +souled +Souletin +soulful +soulfully +soulfulness +soulical +soulish +soulless +soullessly +soullessness +soullike +Soulmass +soulsaving +soulward +souly +soum +soumansite +soumarque +sound +soundable +soundage +soundboard +sounder +soundful +soundheaded +soundheadedness +soundhearted +soundheartednes +sounding +soundingly +soundingness +soundless +soundlessly +soundlessness +soundly +soundness +soundproof +soundproofing +soup +soupbone +soupcon +souper +souple +soupless +souplike +soupspoon +soupy +sour +sourbelly +sourberry +sourbread +sourbush +sourcake +source +sourceful +sourcefulness +sourceless +sourcrout +sourdeline +sourdine +soured +souredness +souren +sourer +sourhearted +souring +sourish +sourishly +sourishness +sourjack +sourling +sourly +sourness +sourock +soursop +sourtop +sourweed +sourwood +soury +sousaphone +sousaphonist +souse +souser +souslik +soutane +souter +souterrain +South +south +southard +southbound +Southcottian +Southdown +southeast +southeaster +southeasterly +southeastern +southeasternmost +southeastward +southeastwardly +southeastwards +souther +southerland +southerliness +southerly +southermost +southern +Southerner +southerner +southernism +southernize +southernliness +southernly +southernmost +southernness +southernwood +southing +southland +southlander +southmost +southness +southpaw +Southron +southron +Southronie +Southumbrian +southward +southwardly +southwards +southwest +southwester +southwesterly +southwestern +Southwesterner +southwesternmost +southwestward +southwestwardly +souvenir +souverain +souwester +sov +sovereign +sovereigness +sovereignly +sovereignness +sovereignship +sovereignty +soviet +sovietdom +sovietic +sovietism +sovietist +sovietization +sovietize +sovite +sovkhose +sovkhoz +sovran +sovranty +sow +sowable +sowan +sowans +sowar +sowarry +sowback +sowbacked +sowbane +sowbelly +sowbread +sowdones +sowel +sowens +sower +sowfoot +sowing +sowins +sowl +sowle +sowlike +sowlth +sown +sowse +sowt +sowte +Soxhlet +soy +soya +soybean +Soyot +sozin +sozolic +sozzle +sozzly +spa +Space +space +spaceband +spaced +spaceful +spaceless +spacer +spacesaving +spaceship +spaciness +spacing +spaciosity +spaciotemporal +spacious +spaciously +spaciousness +spack +spacy +spad +spade +spadebone +spaded +spadefish +spadefoot +spadeful +spadelike +spademan +spader +spadesman +spadewise +spadework +spadger +spadiceous +spadices +spadicifloral +spadiciflorous +spadiciform +spadicose +spadilla +spadille +spading +spadix +spadone +spadonic +spadonism +spadrone +spadroon +spae +spaebook +spaecraft +spaedom +spaeman +spaer +spaewife +spaewoman +spaework +spaewright +spaghetti +Spagnuoli +spagyric +spagyrical +spagyrically +spagyrist +spahi +spaid +spaik +spairge +spak +Spalacidae +spalacine +Spalax +spald +spalder +spalding +spale +spall +spallation +spaller +spalling +spalpeen +spalt +span +spancel +spandle +spandrel +spandy +spane +spanemia +spanemy +spang +spanghew +spangle +spangled +spangler +spanglet +spangly +spangolite +Spaniard +Spaniardization +Spaniardize +Spaniardo +spaniel +spaniellike +spanielship +spaning +Spaniol +Spaniolate +Spanioli +Spaniolize +spanipelagic +Spanish +Spanishize +Spanishly +spank +spanker +spankily +spanking +spankingly +spanky +spanless +spann +spannel +spanner +spannerman +spanopnoea +spanpiece +spantoon +spanule +spanworm +Spar +spar +sparable +sparada +sparadrap +sparagrass +sparagus +Sparassis +sparassodont +Sparassodonta +Sparaxis +sparaxis +sparch +spare +spareable +spareless +sparely +spareness +sparer +sparerib +sparesome +Sparganiaceae +Sparganium +sparganium +sparganosis +sparganum +sparge +sparger +spargosis +sparhawk +sparid +Sparidae +sparing +sparingly +sparingness +spark +sparkback +sparked +sparker +sparkiness +sparking +sparkish +sparkishly +sparkishness +sparkle +sparkleberry +sparkler +sparkless +sparklessly +sparklet +sparklike +sparkliness +sparkling +sparklingly +sparklingness +sparkly +sparkproof +sparks +sparky +sparlike +sparling +sparm +Sparmannia +Sparnacian +sparoid +sparpiece +sparred +sparrer +sparring +sparringly +sparrow +sparrowbill +sparrowcide +sparrowdom +sparrowgrass +sparrowish +sparrowless +sparrowlike +sparrowtail +sparrowtongue +sparrowwort +sparrowy +sparry +sparse +sparsedly +sparsely +sparsile +sparsioplast +sparsity +spart +Spartacan +Spartacide +Spartacism +Spartacist +spartacist +Spartan +Spartanhood +Spartanic +Spartanically +Spartanism +Spartanize +Spartanlike +Spartanly +sparteine +sparterie +sparth +Spartiate +Spartina +Spartium +spartle +Sparus +sparver +spary +spasm +spasmatic +spasmatical +spasmatomancy +spasmed +spasmic +spasmodic +spasmodical +spasmodically +spasmodicalness +spasmodism +spasmodist +spasmolytic +spasmophilia +spasmophilic +spasmotin +spasmotoxin +spasmous +Spass +spastic +spastically +spasticity +spat +spatalamancy +Spatangida +Spatangina +spatangoid +Spatangoida +Spatangoidea +spatangoidean +Spatangus +spatchcock +spate +spatha +spathaceous +spathal +spathe +spathed +spatheful +spathic +Spathiflorae +spathilae +spathilla +spathose +spathous +spathulate +Spathyema +spatial +spatiality +spatialization +spatialize +spatially +spatiate +spatiation +spatilomancy +spatiotemporal +spatling +spatted +spatter +spatterdashed +spatterdasher +spatterdock +spattering +spatteringly +spatterproof +spatterwork +spatting +spattle +spattlehoe +Spatula +spatula +spatulamancy +spatular +spatulate +spatulation +spatule +spatuliform +spatulose +spave +spaver +spavie +spavied +spaviet +spavin +spavindy +spavined +spawn +spawneater +spawner +spawning +spawny +spay +spayad +spayard +spaying +speak +speakable +speakableness +speakably +speaker +speakeress +speakership +speakhouse +speakies +speaking +speakingly +speakingness +speakless +speaklessly +speal +spealbone +spean +spear +spearcast +spearer +spearfish +spearflower +spearhead +spearing +spearman +spearmanship +spearmint +spearproof +spearsman +spearwood +spearwort +speary +spec +specchie +spece +special +specialism +specialist +specialistic +speciality +specialization +specialize +specialized +specializer +specially +specialness +specialty +speciation +specie +species +speciestaler +specifiable +specific +specifical +specificality +specifically +specificalness +specificate +specification +specificative +specificatively +specificity +specificize +specificly +specificness +specifier +specifist +specify +specillum +specimen +specimenize +speciology +speciosity +specious +speciously +speciousness +speck +specked +speckedness +speckfall +speckiness +specking +speckle +specklebelly +specklebreast +speckled +speckledbill +speckledness +speckless +specklessly +specklessness +speckling +speckly +speckproof +specks +specksioneer +specky +specs +spectacle +spectacled +spectacleless +spectaclelike +spectaclemaker +spectaclemaking +spectacles +spectacular +spectacularism +spectacularity +spectacularly +spectator +spectatordom +spectatorial +spectatorship +spectatory +spectatress +spectatrix +specter +spectered +specterlike +spectra +spectral +spectralism +spectrality +spectrally +spectralness +spectrobolograph +spectrobolographic +spectrobolometer +spectrobolometric +spectrochemical +spectrochemistry +spectrocolorimetry +spectrocomparator +spectroelectric +spectrogram +spectrograph +spectrographic +spectrographically +spectrography +spectroheliogram +spectroheliograph +spectroheliographic +spectrohelioscope +spectrological +spectrologically +spectrology +spectrometer +spectrometric +spectrometry +spectromicroscope +spectromicroscopical +spectrophobia +spectrophone +spectrophonic +spectrophotoelectric +spectrophotograph +spectrophotography +spectrophotometer +spectrophotometric +spectrophotometry +spectropolarimeter +spectropolariscope +spectropyrheliometer +spectropyrometer +spectroradiometer +spectroradiometric +spectroradiometry +spectroscope +spectroscopic +spectroscopically +spectroscopist +spectroscopy +spectrotelescope +spectrous +spectrum +spectry +specula +specular +Specularia +specularly +speculate +speculation +speculatist +speculative +speculatively +speculativeness +speculativism +speculator +speculatory +speculatrices +speculatrix +speculist +speculum +specus +sped +speech +speechcraft +speecher +speechful +speechfulness +speechification +speechifier +speechify +speeching +speechless +speechlessly +speechlessness +speechlore +speechmaker +speechmaking +speechment +speed +speedaway +speedboat +speedboating +speedboatman +speeder +speedful +speedfully +speedfulness +speedily +speediness +speeding +speedingly +speedless +speedometer +speedster +speedway +speedwell +speedy +speel +speelken +speelless +speen +speer +speering +speerity +speiskobalt +speiss +spekboom +spelaean +spelder +spelding +speldring +speleological +speleologist +speleology +spelk +spell +spellable +spellbind +spellbinder +spellbinding +spellbound +spellcraft +spelldown +speller +spellful +spelling +spellingdown +spellingly +spellmonger +spellproof +spellword +spellwork +spelt +spelter +spelterman +speltoid +speltz +speluncar +speluncean +spelunk +spelunker +spence +Spencean +Spencer +spencer +Spencerian +Spencerianism +Spencerism +spencerite +spend +spendable +spender +spendful +spendible +spending +spendless +spendthrift +spendthrifty +Spenerism +spense +Spenserian +spent +speos +Speotyto +sperable +Speranza +sperate +Spergula +Spergularia +sperity +sperket +sperling +sperm +sperma +spermaceti +spermacetilike +spermaduct +spermalist +Spermaphyta +spermaphyte +spermaphytic +spermarium +spermary +spermashion +spermatangium +spermatheca +spermathecal +spermatic +spermatically +spermatid +spermatiferous +spermatin +spermatiogenous +spermation +spermatiophore +spermatism +spermatist +spermatitis +spermatium +spermatize +spermatoblast +spermatoblastic +spermatocele +spermatocyst +spermatocystic +spermatocystitis +spermatocytal +spermatocyte +spermatogemma +spermatogenesis +spermatogenetic +spermatogenic +spermatogenous +spermatogeny +spermatogonial +spermatogonium +spermatoid +spermatolysis +spermatolytic +spermatophoral +spermatophore +spermatophorous +Spermatophyta +spermatophyte +spermatophytic +spermatoplasm +spermatoplasmic +spermatoplast +spermatorrhea +spermatospore +spermatotheca +spermatova +spermatovum +spermatoxin +spermatozoa +spermatozoal +spermatozoan +spermatozoic +spermatozoid +spermatozoon +spermaturia +spermic +spermidine +spermiducal +spermiduct +spermigerous +spermine +spermiogenesis +spermism +spermist +spermoblast +spermoblastic +spermocarp +spermocenter +spermoderm +spermoduct +spermogenesis +spermogenous +spermogone +spermogoniferous +spermogonium +spermogonous +spermologer +spermological +spermologist +spermology +spermolysis +spermolytic +spermophile +spermophiline +Spermophilus +spermophore +spermophorium +Spermophyta +spermophyte +spermophytic +spermosphere +spermotheca +spermotoxin +spermous +spermoviduct +spermy +speronara +speronaro +sperone +sperrylite +spessartite +spet +spetch +spetrophoby +speuchan +spew +spewer +spewiness +spewing +spewy +spex +sphacel +Sphacelaria +Sphacelariaceae +sphacelariaceous +Sphacelariales +sphacelate +sphacelated +sphacelation +sphacelia +sphacelial +sphacelism +sphaceloderma +Sphaceloma +sphacelotoxin +sphacelous +sphacelus +Sphaeralcea +sphaeraphides +Sphaerella +sphaerenchyma +Sphaeriaceae +sphaeriaceous +Sphaeriales +sphaeridia +sphaeridial +sphaeridium +Sphaeriidae +Sphaerioidaceae +sphaeristerium +sphaerite +Sphaerium +sphaeroblast +Sphaerobolaceae +Sphaerobolus +Sphaerocarpaceae +Sphaerocarpales +Sphaerocarpus +sphaerocobaltite +Sphaerococcaceae +sphaerococcaceous +Sphaerococcus +sphaerolite +sphaerolitic +Sphaeroma +Sphaeromidae +Sphaerophoraceae +Sphaerophorus +Sphaeropsidaceae +Sphaeropsidales +Sphaeropsis +sphaerosiderite +sphaerosome +sphaerospore +Sphaerostilbe +Sphaerotheca +Sphaerotilus +sphagion +Sphagnaceae +sphagnaceous +Sphagnales +sphagnicolous +sphagnologist +sphagnology +sphagnous +Sphagnum +sphagnum +Sphakiot +sphalerite +Sphargis +sphecid +Sphecidae +Sphecina +Sphecoidea +spheges +sphegid +Sphegidae +Sphegoidea +sphendone +sphene +sphenethmoid +sphenethmoidal +sphenic +sphenion +Sphenisci +Spheniscidae +Sphenisciformes +spheniscine +spheniscomorph +Spheniscomorphae +spheniscomorphic +Spheniscus +sphenobasilar +sphenobasilic +sphenocephalia +sphenocephalic +sphenocephalous +sphenocephaly +Sphenodon +sphenodon +sphenodont +Sphenodontia +Sphenodontidae +sphenoethmoid +sphenoethmoidal +sphenofrontal +sphenogram +sphenographic +sphenographist +sphenography +sphenoid +sphenoidal +sphenoiditis +sphenolith +sphenomalar +sphenomandibular +sphenomaxillary +sphenopalatine +sphenoparietal +sphenopetrosal +Sphenophorus +Sphenophyllaceae +sphenophyllaceous +Sphenophyllales +Sphenophyllum +Sphenopteris +sphenosquamosal +sphenotemporal +sphenotic +sphenotribe +sphenotripsy +sphenoturbinal +sphenovomerine +sphenozygomatic +spherable +spheral +spherality +spheraster +spheration +sphere +sphereless +spheric +spherical +sphericality +spherically +sphericalness +sphericist +sphericity +sphericle +sphericocylindrical +sphericotetrahedral +sphericotriangular +spherics +spheriform +spherify +spheroconic +spherocrystal +spherograph +spheroidal +spheroidally +spheroidic +spheroidical +spheroidically +spheroidicity +spheroidism +spheroidity +spheroidize +spheromere +spherometer +spheroquartic +spherula +spherular +spherulate +spherule +spherulite +spherulitic +spherulitize +sphery +spheterize +Sphex +sphexide +sphincter +sphincteral +sphincteralgia +sphincterate +sphincterectomy +sphincterial +sphincteric +sphincterismus +sphincteroscope +sphincteroscopy +sphincterotomy +sphindid +Sphindidae +Sphindus +sphingal +sphinges +sphingid +Sphingidae +sphingiform +sphingine +sphingoid +sphingometer +sphingomyelin +sphingosine +Sphingurinae +Sphingurus +sphinx +sphinxian +sphinxianness +sphinxlike +Sphoeroides +sphragide +sphragistic +sphragistics +sphygmia +sphygmic +sphygmochronograph +sphygmodic +sphygmogram +sphygmograph +sphygmographic +sphygmography +sphygmoid +sphygmology +sphygmomanometer +sphygmomanometric +sphygmomanometry +sphygmometer +sphygmometric +sphygmophone +sphygmophonic +sphygmoscope +sphygmus +Sphyraena +sphyraenid +Sphyraenidae +sphyraenoid +Sphyrapicus +Sphyrna +Sphyrnidae +Spica +spica +spical +spicant +Spicaria +spicate +spicated +spiccato +spice +spiceable +spiceberry +spicebush +spicecake +spiced +spiceful +spicehouse +spiceland +spiceless +spicelike +spicer +spicery +spicewood +spiciferous +spiciform +spicigerous +spicilege +spicily +spiciness +spicing +spick +spicket +spickle +spicknel +spicose +spicosity +spicous +spicousness +spicula +spiculae +spicular +spiculate +spiculated +spiculation +spicule +spiculiferous +spiculiform +spiculigenous +spiculigerous +spiculofiber +spiculose +spiculous +spiculum +spiculumamoris +spicy +spider +spidered +spiderflower +spiderish +spiderless +spiderlike +spiderling +spiderly +spiderweb +spiderwork +spiderwort +spidery +spidger +spied +spiegel +spiegeleisen +spiel +spieler +spier +spiff +spiffed +spiffily +spiffiness +spiffing +spiffy +spiflicate +spiflicated +spiflication +spig +Spigelia +Spigeliaceae +Spigelian +spiggoty +spignet +spigot +Spike +spike +spikebill +spiked +spikedness +spikefish +spikehorn +spikelet +spikelike +spikenard +spiker +spiketail +spiketop +spikeweed +spikewise +spikily +spikiness +spiking +spiky +Spilanthes +spile +spilehole +spiler +spileworm +spilikin +spiling +spilite +spilitic +spill +spillage +spiller +spillet +spillproof +spillway +spilly +Spilogale +spiloma +spilosite +spilt +spilth +spilus +spin +spina +spinacene +spinaceous +spinach +spinachlike +Spinacia +spinae +spinage +spinal +spinales +spinalis +spinally +spinate +spinder +spindlage +spindle +spindleage +spindled +spindleful +spindlehead +spindlelegs +spindlelike +spindler +spindleshanks +spindletail +spindlewise +spindlewood +spindleworm +spindliness +spindling +spindly +spindrift +spine +spinebill +spinebone +spined +spinel +spineless +spinelessly +spinelessness +spinelet +spinelike +spinescence +spinescent +spinet +spinetail +spingel +spinibulbar +spinicarpous +spinicerebellar +spinidentate +spiniferous +Spinifex +spinifex +spiniform +spinifugal +spinigerous +spinigrade +spininess +spinipetal +spinitis +spinituberculate +spink +spinnable +spinnaker +spinner +spinneret +spinnerular +spinnerule +spinnery +spinney +spinning +spinningly +spinobulbar +spinocarpous +spinocerebellar +spinogalvanization +spinoglenoid +spinoid +spinomuscular +spinoneural +spinoperipheral +spinose +spinosely +spinoseness +spinosity +spinosodentate +spinosodenticulate +spinosotubercular +spinosotuberculate +spinosympathetic +spinotectal +spinothalamic +spinotuberculous +spinous +spinousness +Spinozism +Spinozist +Spinozistic +spinster +spinsterdom +spinsterhood +spinsterial +spinsterish +spinsterishly +spinsterism +spinsterlike +spinsterly +spinsterous +spinstership +spinstress +spintext +spinthariscope +spinthariscopic +spintherism +spinulate +spinulation +spinule +spinulescent +spinuliferous +spinuliform +Spinulosa +spinulose +spinulosely +spinulosociliate +spinulosodentate +spinulosodenticulate +spinulosogranulate +spinulososerrate +spinulous +spiny +spionid +Spionidae +Spioniformia +spiracle +spiracula +spiracular +spiraculate +spiraculiferous +spiraculiform +spiraculum +Spiraea +Spiraeaceae +spiral +spirale +spiraled +spiraliform +spiralism +spirality +spiralization +spiralize +spirally +spiraloid +spiraltail +spiralwise +spiran +spirant +Spiranthes +spiranthic +spiranthy +spirantic +spirantize +spiraster +spirate +spirated +spiration +spire +spirea +spired +spiregrass +spireless +spirelet +spireme +spirepole +spireward +spirewise +spiricle +Spirifer +Spirifera +Spiriferacea +spiriferid +Spiriferidae +spiriferoid +spiriferous +spiriform +spirignath +spirignathous +spirilla +Spirillaceae +spirillaceous +spirillar +spirillolysis +spirillosis +spirillotropic +spirillotropism +spirillum +spiring +spirit +spiritally +spiritdom +spirited +spiritedly +spiritedness +spiriter +spiritful +spiritfully +spiritfulness +spirithood +spiriting +spiritism +spiritist +spiritistic +spiritize +spiritland +spiritleaf +spiritless +spiritlessly +spiritlessness +spiritlike +spiritmonger +spiritous +spiritrompe +spiritsome +spiritual +spiritualism +spiritualist +spiritualistic +spiritualistically +spirituality +spiritualization +spiritualize +spiritualizer +spiritually +spiritualness +spiritualship +spiritualty +spirituosity +spirituous +spirituously +spirituousness +spiritus +spiritweed +spirity +spirivalve +spirket +spirketing +spirling +spiro +Spirobranchia +Spirobranchiata +spirobranchiate +Spirochaeta +Spirochaetaceae +spirochaetal +Spirochaetales +Spirochaete +spirochetal +spirochete +spirochetemia +spirochetic +spirocheticidal +spirocheticide +spirochetosis +spirochetotic +Spirodela +spirogram +spirograph +spirographidin +spirographin +Spirographis +Spirogyra +spiroid +spiroloculine +spirometer +spirometric +spirometrical +spirometry +Spironema +spiropentane +Spirophyton +Spirorbis +spiroscope +Spirosoma +spirous +spirt +Spirula +spirulate +spiry +spise +spissated +spissitude +Spisula +spit +spital +spitball +spitballer +spitbox +spitchcock +spite +spiteful +spitefully +spitefulness +spiteless +spiteproof +spitfire +spitful +spithamai +spithame +spitish +spitpoison +spitscocked +spitstick +spitted +spitten +spitter +spitting +spittle +spittlefork +spittlestaff +spittoon +spitz +Spitzenburg +spitzkop +spiv +spivery +Spizella +spizzerinctum +Splachnaceae +splachnaceous +splachnoid +Splachnum +splacknuck +splairge +splanchnapophysial +splanchnapophysis +splanchnectopia +splanchnemphraxis +splanchnesthesia +splanchnesthetic +splanchnic +splanchnoblast +splanchnocoele +splanchnoderm +splanchnodiastasis +splanchnodynia +splanchnographer +splanchnographical +splanchnography +splanchnolith +splanchnological +splanchnologist +splanchnology +splanchnomegalia +splanchnomegaly +splanchnopathy +splanchnopleural +splanchnopleure +splanchnopleuric +splanchnoptosia +splanchnoptosis +splanchnosclerosis +splanchnoscopy +splanchnoskeletal +splanchnoskeleton +splanchnosomatic +splanchnotomical +splanchnotomy +splanchnotribe +splash +splashboard +splashed +splasher +splashiness +splashing +splashingly +splashproof +splashy +splat +splatch +splatcher +splatchy +splathering +splatter +splatterdash +splatterdock +splatterer +splatterfaced +splatterwork +splay +splayed +splayer +splayfoot +splayfooted +splaymouth +splaymouthed +spleen +spleenful +spleenfully +spleenish +spleenishly +spleenishness +spleenless +spleenwort +spleeny +spleet +spleetnew +splenadenoma +splenalgia +splenalgic +splenalgy +splenatrophia +splenatrophy +splenauxe +splenculus +splendacious +splendaciously +splendaciousness +splendent +splendently +splender +splendescent +splendid +splendidly +splendidness +splendiferous +splendiferously +splendiferousness +splendor +splendorous +splendorproof +splendourproof +splenectama +splenectasis +splenectomist +splenectomize +splenectomy +splenectopia +splenectopy +splenelcosis +splenemia +splenemphraxis +spleneolus +splenepatitis +splenetic +splenetical +splenetically +splenetive +splenial +splenic +splenical +splenicterus +splenification +spleniform +splenitis +splenitive +splenium +splenius +splenization +splenoblast +splenocele +splenoceratosis +splenocleisis +splenocolic +splenocyte +splenodiagnosis +splenodynia +splenography +splenohemia +splenoid +splenolaparotomy +splenology +splenolymph +splenolymphatic +splenolysin +splenolysis +splenoma +splenomalacia +splenomedullary +splenomegalia +splenomegalic +splenomegaly +splenomyelogenous +splenoncus +splenonephric +splenopancreatic +splenoparectama +splenoparectasis +splenopathy +splenopexia +splenopexis +splenopexy +splenophrenic +splenopneumonia +splenoptosia +splenoptosis +splenorrhagia +splenorrhaphy +splenotomy +splenotoxin +splenotyphoid +splenulus +splenunculus +splet +spleuchan +splice +spliceable +splicer +splicing +splinder +spline +splineway +splint +splintage +splinter +splinterd +splinterless +splinternew +splinterproof +splintery +splintwood +splinty +split +splitbeak +splitfinger +splitfruit +splitmouth +splitnew +splitsaw +splittail +splitten +splitter +splitting +splitworm +splodge +splodgy +splore +splosh +splotch +splotchily +splotchiness +splotchy +splother +splunge +splurge +splurgily +splurgy +splurt +spluther +splutter +splutterer +spoach +Spock +spode +spodiosite +spodium +spodogenic +spodogenous +spodomancy +spodomantic +spodumene +spoffish +spoffle +spoffy +spogel +spoil +spoilable +spoilage +spoilation +spoiled +spoiler +spoilfive +spoilful +spoiling +spoilless +spoilment +spoilsman +spoilsmonger +spoilsport +spoilt +Spokan +spoke +spokeless +spoken +spokeshave +spokesman +spokesmanship +spokester +spokeswoman +spokeswomanship +spokewise +spoky +spole +spolia +spoliarium +spoliary +spoliate +spoliation +spoliator +spoliatory +spolium +spondaic +spondaical +spondaize +spondean +spondee +spondiac +Spondiaceae +Spondias +spondulics +spondyl +spondylalgia +spondylarthritis +spondylarthrocace +spondylexarthrosis +spondylic +spondylid +Spondylidae +spondylioid +spondylitic +spondylitis +spondylium +spondylizema +spondylocace +Spondylocladium +spondylodiagnosis +spondylodidymia +spondylodymus +spondyloid +spondylolisthesis +spondylolisthetic +spondylopathy +spondylopyosis +spondyloschisis +spondylosis +spondylosyndesis +spondylotherapeutics +spondylotherapist +spondylotherapy +spondylotomy +spondylous +Spondylus +spondylus +spong +sponge +spongecake +sponged +spongeful +spongeless +spongelet +spongelike +spongeous +spongeproof +sponger +spongewood +Spongiae +spongian +spongicolous +spongiculture +Spongida +spongiferous +spongiform +Spongiidae +Spongilla +spongillid +Spongillidae +spongilline +spongily +spongin +sponginblast +sponginblastic +sponginess +sponging +spongingly +spongioblast +spongioblastoma +spongiocyte +spongiolin +spongiopilin +spongioplasm +spongioplasmic +spongiose +spongiosity +spongiousness +Spongiozoa +spongiozoon +spongoblast +spongoblastic +spongoid +spongology +spongophore +Spongospora +spongy +sponsal +sponsalia +sponsibility +sponsible +sponsing +sponsion +sponsional +sponson +sponsor +sponsorial +sponsorship +sponspeck +spontaneity +spontaneous +spontaneously +spontaneousness +spontoon +spoof +spoofer +spoofery +spoofish +spook +spookdom +spookery +spookily +spookiness +spookish +spookism +spookist +spookological +spookologist +spookology +spooky +spool +spooler +spoolful +spoollike +spoolwood +spoom +spoon +spoonbill +spoondrift +spooner +spoonerism +spooneyism +spooneyly +spooneyness +spoonflower +spoonful +spoonhutch +spoonily +spooniness +spooning +spoonism +spoonless +spoonlike +spoonmaker +spoonmaking +spoonways +spoonwood +spoony +spoonyism +spoor +spoorer +spoot +spor +sporabola +sporaceous +sporades +sporadial +sporadic +sporadical +sporadically +sporadicalness +sporadicity +sporadism +sporadosiderite +sporal +sporange +sporangia +sporangial +sporangidium +sporangiferous +sporangiform +sporangioid +sporangiola +sporangiole +sporangiolum +sporangiophore +sporangiospore +sporangite +Sporangites +sporangium +sporation +spore +spored +sporeformer +sporeforming +sporeling +sporicide +sporid +sporidesm +sporidia +sporidial +sporidiferous +sporidiole +sporidiolum +sporidium +sporiferous +sporification +sporiparity +sporiparous +sporoblast +Sporobolus +sporocarp +sporocarpium +Sporochnaceae +Sporochnus +sporocyst +sporocystic +sporocystid +sporocyte +sporodochia +sporodochium +sporoduct +sporogenesis +sporogenic +sporogenous +sporogeny +sporogone +sporogonial +sporogonic +sporogonium +sporogony +sporoid +sporologist +sporomycosis +sporont +sporophore +sporophoric +sporophorous +sporophydium +sporophyll +sporophyllary +sporophyllum +sporophyte +sporophytic +sporoplasm +sporosac +sporostegium +sporostrote +sporotrichosis +sporotrichotic +Sporotrichum +sporous +Sporozoa +sporozoal +sporozoan +sporozoic +sporozoite +sporozoon +sporran +sport +sportability +sportable +sportance +sporter +sportful +sportfully +sportfulness +sportily +sportiness +sporting +sportingly +sportive +sportively +sportiveness +sportless +sportling +sportly +sports +sportsman +sportsmanlike +sportsmanliness +sportsmanly +sportsmanship +sportsome +sportswear +sportswoman +sportswomanly +sportswomanship +sportula +sportulae +sporty +sporular +sporulate +sporulation +sporule +sporuliferous +sporuloid +sposh +sposhy +spot +spotless +spotlessly +spotlessness +spotlight +spotlighter +spotlike +spotrump +spotsman +spottable +spotted +spottedly +spottedness +spotteldy +spotter +spottily +spottiness +spotting +spottle +spotty +spoucher +spousage +spousal +spousally +spouse +spousehood +spouseless +spousy +spout +spouter +spoutiness +spouting +spoutless +spoutlike +spoutman +spouty +sprachle +sprack +sprackish +sprackle +sprackly +sprackness +sprad +spraddle +sprag +spragger +spraggly +spraich +sprain +spraint +spraints +sprang +sprangle +sprangly +sprank +sprat +spratter +spratty +sprauchle +sprawl +sprawler +sprawling +sprawlingly +sprawly +spray +sprayboard +sprayer +sprayey +sprayful +sprayfully +sprayless +spraylike +sprayproof +spread +spreadation +spreadboard +spreaded +spreader +spreadhead +spreading +spreadingly +spreadingness +spreadover +spready +spreaghery +spreath +spreckle +spree +spreeuw +Sprekelia +spreng +sprent +spret +sprew +sprewl +spridhogue +spried +sprier +spriest +sprig +sprigged +sprigger +spriggy +sprightful +sprightfully +sprightfulness +sprightlily +sprightliness +sprightly +sprighty +spriglet +sprigtail +Spring +spring +springal +springald +springboard +springbok +springbuck +springe +springer +springerle +springfinger +springfish +springful +springhaas +springhalt +springhead +springhouse +springily +springiness +springing +springingly +springle +springless +springlet +springlike +springly +springmaker +springmaking +springtail +springtide +springtime +springtrap +springwood +springworm +springwort +springwurzel +springy +sprink +sprinkle +sprinkled +sprinkleproof +sprinkler +sprinklered +sprinkling +sprint +sprinter +sprit +sprite +spritehood +spritsail +sprittail +sprittie +spritty +sproat +sprocket +sprod +sprogue +sproil +sprong +sprose +sprottle +sprout +sproutage +sprouter +sproutful +sprouting +sproutland +sproutling +sprowsy +spruce +sprucely +spruceness +sprucery +sprucification +sprucify +sprue +spruer +sprug +spruiker +spruit +sprung +sprunny +sprunt +spruntly +spry +spryly +spryness +spud +Spudboy +spudder +spuddle +spuddy +spuffle +spug +spuilyie +spuilzie +spuke +spume +spumescence +spumescent +spumiferous +spumification +spumiform +spumone +spumose +spumous +spumy +spun +spung +spunk +spunkie +spunkily +spunkiness +spunkless +spunky +spunny +spur +spurflower +spurgall +spurge +spurgewort +spuriae +spuriosity +spurious +spuriously +spuriousness +Spurius +spurl +spurless +spurlet +spurlike +spurling +spurmaker +spurmoney +spurn +spurner +spurnpoint +spurnwater +spurproof +spurred +spurrer +spurrial +spurrier +spurrings +spurrite +spurry +spurt +spurter +spurtive +spurtively +spurtle +spurway +spurwing +spurwinged +spurwort +sput +sputa +sputative +sputter +sputterer +sputtering +sputteringly +sputtery +sputum +sputumary +sputumose +sputumous +Spy +spy +spyboat +spydom +spyer +spyfault +spyglass +spyhole +spyism +spyproof +Spyros +spyship +spytower +squab +squabash +squabasher +squabbed +squabbish +squabble +squabbler +squabbling +squabblingly +squabbly +squabby +squacco +squad +squaddy +squadrate +squadrism +squadron +squadrone +squadroned +squail +squailer +squalene +Squali +squalid +Squalida +Squalidae +squalidity +squalidly +squalidness +squaliform +squall +squaller +squallery +squallish +squally +squalm +Squalodon +squalodont +Squalodontidae +squaloid +Squaloidei +squalor +Squalus +squam +squama +squamaceous +squamae +Squamariaceae +Squamata +squamate +squamated +squamatine +squamation +squamatogranulous +squamatotuberculate +squame +squamella +squamellate +squamelliferous +squamelliform +squameous +squamiferous +squamiform +squamify +squamigerous +squamipennate +Squamipennes +squamipinnate +Squamipinnes +squamocellular +squamoepithelial +squamoid +squamomastoid +squamoparietal +squamopetrosal +squamosa +squamosal +squamose +squamosely +squamoseness +squamosis +squamosity +squamosodentated +squamosoimbricated +squamosomaxillary +squamosoparietal +squamosoradiate +squamosotemporal +squamosozygomatic +squamosphenoid +squamosphenoidal +squamotemporal +squamous +squamously +squamousness +squamozygomatic +Squamscot +squamula +squamulae +squamulate +squamulation +squamule +squamuliform +squamulose +squander +squanderer +squanderingly +squandermania +squandermaniac +squantum +squarable +square +squareage +squarecap +squared +squaredly +squareface +squareflipper +squarehead +squarelike +squarely +squareman +squaremouth +squareness +squarer +squaretail +squarewise +squaring +squarish +squarishly +squark +squarrose +squarrosely +squarrous +squarrulose +squarson +squarsonry +squary +squash +squashberry +squasher +squashily +squashiness +squashy +squat +Squatarola +squatarole +Squatina +squatina +squatinid +Squatinidae +squatinoid +Squatinoidei +squatly +squatment +squatmore +squatness +squattage +squatted +squatter +squatterarchy +squatterdom +squatterproof +squattily +squattiness +squatting +squattingly +squattish +squattocracy +squattocratic +squatty +squatwise +squaw +squawberry +squawbush +squawdom +squawfish +squawflower +squawk +squawker +squawkie +squawking +squawkingly +squawky +Squawmish +squawroot +Squawtits +squawweed +Squaxon +squdge +squdgy +squeak +squeaker +squeakery +squeakily +squeakiness +squeaking +squeakingly +squeaklet +squeakproof +squeaky +squeakyish +squeal +squeald +squealer +squealing +squeam +squeamish +squeamishly +squeamishness +squeamous +squeamy +Squedunk +squeege +squeegee +squeezability +squeezable +squeezableness +squeezably +squeeze +squeezeman +squeezer +squeezing +squeezingly +squeezy +squelch +squelcher +squelchily +squelchiness +squelching +squelchingly +squelchingness +squelchy +squench +squencher +squeteague +squib +squibber +squibbery +squibbish +squiblet +squibling +squid +squiddle +squidge +squidgereen +squidgy +squiffed +squiffer +squiffy +squiggle +squiggly +squilgee +squilgeer +Squill +Squilla +squilla +squillagee +squillery +squillian +squillid +Squillidae +squilloid +Squilloidea +squimmidge +squin +squinance +squinancy +squinch +squinny +squinsy +squint +squinted +squinter +squinting +squintingly +squintingness +squintly +squintness +squinty +squirage +squiralty +squire +squirearch +squirearchal +squirearchical +squirearchy +squiredom +squireen +squirehood +squireless +squirelet +squirelike +squireling +squirely +squireocracy +squireship +squiress +squiret +squirewise +squirish +squirism +squirk +squirm +squirminess +squirming +squirmingly +squirmy +squirr +squirrel +squirrelfish +squirrelian +squirreline +squirrelish +squirrellike +squirrelproof +squirreltail +squirt +squirter +squirtiness +squirting +squirtingly +squirtish +squirty +squish +squishy +squit +squitch +squitchy +squitter +squoze +squush +squushy +sraddha +sramana +Sri +sri +Sridhar +Sridharan +Srikanth +Srinivas +Srinivasan +Sriram +Srivatsan +sruti +Ssi +ssu +st +staab +Staatsrat +stab +stabber +stabbing +stabbingly +stabile +stabilify +stabilist +stabilitate +stability +stabilization +stabilizator +stabilize +stabilizer +stable +stableboy +stableful +stablekeeper +stablelike +stableman +stableness +stabler +stablestand +stableward +stablewards +stabling +stablishment +stably +staboy +stabproof +stabulate +stabulation +stabwort +staccato +Stacey +stacher +stachydrin +stachydrine +stachyose +Stachys +stachys +Stachytarpheta +Stachyuraceae +stachyuraceous +Stachyurus +stack +stackage +stackencloud +stacker +stackfreed +stackful +stackgarth +Stackhousia +Stackhousiaceae +stackhousiaceous +stackless +stackman +stackstand +stackyard +stacte +stactometer +Stacy +stadda +staddle +staddling +stade +stadholder +stadholderate +stadholdership +stadhouse +stadia +stadic +stadimeter +stadiometer +stadion +stadium +stafette +staff +staffed +staffelite +staffer +staffless +staffman +stag +stagbush +stage +stageability +stageable +stageableness +stageably +stagecoach +stagecoaching +stagecraft +staged +stagedom +stagehand +stagehouse +stageland +stagelike +stageman +stager +stagery +stagese +stagewise +stageworthy +stagewright +staggard +staggart +staggarth +Stagger +stagger +staggerbush +staggerer +staggering +staggeringly +staggers +staggerweed +staggerwort +staggery +staggie +staggy +staghead +staghorn +staghound +staghunt +staghunter +staghunting +stagiary +stagily +staginess +staging +Stagirite +Stagiritic +staglike +stagmometer +stagnance +stagnancy +stagnant +stagnantly +stagnantness +stagnate +stagnation +stagnatory +stagnature +stagnicolous +stagnize +stagnum +Stagonospora +stagskin +stagworm +stagy +Stahlhelm +Stahlhelmer +Stahlhelmist +Stahlian +Stahlianism +Stahlism +staia +staid +staidly +staidness +stain +stainability +stainable +stainableness +stainably +stainer +stainful +stainierite +staining +stainless +stainlessly +stainlessness +stainproof +staio +stair +stairbeak +stairbuilder +stairbuilding +staircase +staired +stairhead +stairless +stairlike +stairstep +stairway +stairwise +stairwork +stairy +staith +staithman +staiver +stake +stakehead +stakeholder +stakemaster +staker +stakerope +Stakhanovism +Stakhanovite +stalactic +stalactical +stalactiform +stalactital +stalactite +stalactited +stalactitic +stalactitical +stalactitically +stalactitiform +stalactitious +stalagma +stalagmite +stalagmitic +stalagmitical +stalagmitically +stalagmometer +stalagmometric +stalagmometry +stale +stalely +stalemate +staleness +staling +Stalinism +Stalinist +Stalinite +stalk +stalkable +stalked +stalker +stalkily +stalkiness +stalking +stalkingly +stalkless +stalklet +stalklike +stalko +stalky +stall +stallage +stallar +stallboard +stallenger +staller +stallership +stalling +stallion +stallionize +stallman +stallment +stalwart +stalwartism +stalwartize +stalwartly +stalwartness +stam +stambha +stambouline +stamen +stamened +stamin +stamina +staminal +staminate +stamineal +stamineous +staminiferous +staminigerous +staminode +staminodium +staminody +stammel +stammer +stammerer +stammering +stammeringly +stammeringness +stammerwort +stamnos +stamp +stampable +stampage +stampedable +stampede +stampeder +stampedingly +stampee +stamper +stampery +stamphead +Stampian +stamping +stample +stampless +stampman +stampsman +stampweed +Stan +stance +stanch +stanchable +stanchel +stancheled +stancher +stanchion +stanchless +stanchly +stanchness +stand +standage +standard +standardbred +standardizable +standardization +standardize +standardized +standardizer +standardwise +standee +standel +standelwelks +standelwort +stander +standergrass +standerwort +standfast +standing +standish +standoff +standoffish +standoffishness +standout +standpat +standpatism +standpatter +standpipe +standpoint +standpost +standstill +stane +stanechat +stang +Stangeria +stanhope +Stanhopea +stanine +Stanislaw +stanjen +stank +stankie +Stanley +Stanly +stannane +stannary +stannate +stannator +stannel +stanner +stannery +stannic +stannide +stanniferous +stannite +stanno +stannotype +stannous +stannoxyl +stannum +stannyl +stanza +stanzaed +stanzaic +stanzaical +stanzaically +stanze +stap +stapedectomy +stapedial +stapediform +stapediovestibular +stapedius +Stapelia +stapelia +stapes +staphisagria +staphyle +Staphylea +Staphyleaceae +staphyleaceous +staphylectomy +staphyledema +staphylematoma +staphylic +staphyline +staphylinic +staphylinid +Staphylinidae +staphylinideous +Staphylinoidea +Staphylinus +staphylion +staphylitis +staphyloangina +staphylococcal +staphylococci +staphylococcic +Staphylococcus +staphylococcus +staphylodermatitis +staphylodialysis +staphyloedema +staphylohemia +staphylolysin +staphyloma +staphylomatic +staphylomatous +staphylomycosis +staphyloncus +staphyloplastic +staphyloplasty +staphyloptosia +staphyloptosis +staphyloraphic +staphylorrhaphic +staphylorrhaphy +staphyloschisis +staphylosis +staphylotome +staphylotomy +staphylotoxin +staple +stapled +stapler +staplewise +stapling +Star +star +starblind +starbloom +starboard +starbolins +starbright +Starbuck +starch +starchboard +starched +starchedly +starchedness +starcher +starchflower +starchily +starchiness +starchless +starchlike +starchly +starchmaker +starchmaking +starchman +starchness +starchroot +starchworks +starchwort +starchy +starcraft +stardom +stare +staree +starer +starets +starfish +starflower +starfruit +starful +stargaze +stargazer +stargazing +staring +staringly +stark +starken +starkly +starkness +starky +starless +starlessly +starlessness +starlet +starlight +starlighted +starlights +starlike +starling +starlit +starlite +starlitten +starmonger +starn +starnel +starnie +starnose +Staroobriadtsi +starost +starosta +starosty +starred +starrily +starriness +starring +starringly +starry +starshake +starshine +starship +starshoot +starshot +starstone +starstroke +start +starter +startful +startfulness +starthroat +starting +startingly +startish +startle +startler +startling +startlingly +startlingness +startlish +startlishness +startly +startor +starty +starvation +starve +starveacre +starved +starvedly +starveling +starver +starvy +starward +starwise +starworm +starwort +stary +stases +stash +stashie +stasidion +stasimetric +stasimon +stasimorphy +stasiphobia +stasis +stassfurtite +statable +statal +statant +statcoulomb +State +state +statecraft +stated +statedly +stateful +statefully +statefulness +statehood +Statehouse +stateless +statelet +statelich +statelily +stateliness +stately +statement +statemonger +statequake +stater +stateroom +statesboy +stateside +statesider +statesman +statesmanese +statesmanlike +statesmanly +statesmanship +statesmonger +stateswoman +stateway +statfarad +stathmoi +stathmos +static +statical +statically +Statice +staticproof +statics +station +stational +stationarily +stationariness +stationary +stationer +stationery +stationman +stationmaster +statiscope +statism +statist +statistic +statistical +statistically +statistician +statisticize +statistics +statistology +stative +statoblast +statocracy +statocyst +statolatry +statolith +statolithic +statometer +stator +statoreceptor +statorhab +statoscope +statospore +statuarism +statuarist +statuary +statue +statuecraft +statued +statueless +statuelike +statuesque +statuesquely +statuesqueness +statuette +stature +statured +status +statutable +statutableness +statutably +statutary +statute +statutorily +statutory +statvolt +staucher +stauk +staumer +staun +staunch +staunchable +staunchly +staunchness +staup +stauracin +stauraxonia +stauraxonial +staurion +staurolatry +staurolite +staurolitic +staurology +Stauromedusae +stauromedusan +stauropegial +stauropegion +stauroscope +stauroscopic +stauroscopically +staurotide +stauter +stave +staveable +staveless +staver +stavers +staverwort +stavesacre +stavewise +stavewood +staving +stavrite +staw +stawn +staxis +stay +stayable +stayed +stayer +staylace +stayless +staylessness +staymaker +staymaking +staynil +stays +staysail +stayship +stchi +stead +steadfast +steadfastly +steadfastness +steadier +steadily +steadiment +steadiness +steading +steadman +steady +steadying +steadyingly +steadyish +steak +steal +stealability +stealable +stealage +stealed +stealer +stealing +stealingly +stealth +stealthful +stealthfully +stealthily +stealthiness +stealthless +stealthlike +stealthwise +stealthy +stealy +steam +steamboat +steamboating +steamboatman +steamcar +steamer +steamerful +steamerless +steamerload +steamily +steaminess +steaming +steamless +steamlike +steampipe +steamproof +steamship +steamtight +steamtightness +steamy +stean +steaning +steapsin +stearate +stearic +steariform +stearin +stearolactone +stearone +stearoptene +stearrhea +stearyl +steatin +steatite +steatitic +steatocele +steatogenous +steatolysis +steatolytic +steatoma +steatomatous +steatopathic +steatopyga +steatopygia +steatopygic +steatopygous +Steatornis +Steatornithes +Steatornithidae +steatorrhea +steatosis +stech +stechados +steckling +steddle +Stedman +steed +steedless +steedlike +steek +steekkan +steekkannen +steel +Steelboy +steeler +steelhead +steelhearted +steelification +steelify +steeliness +steeling +steelless +steellike +steelmaker +steelmaking +steelproof +steelware +steelwork +steelworker +steelworks +steely +steelyard +Steen +steen +steenboc +steenbock +steenbok +Steenie +steenkirk +steenstrupine +steenth +steep +steepdown +steepen +steeper +steepgrass +steepish +steeple +steeplebush +steeplechase +steeplechaser +steeplechasing +steepled +steepleless +steeplelike +steepletop +steeply +steepness +steepweed +steepwort +steepy +steer +steerability +steerable +steerage +steerageway +steerer +steering +steeringly +steerling +steerman +steermanship +steersman +steerswoman +steeve +steevely +steever +steeving +Stefan +steg +steganogram +steganographical +steganographist +steganography +Steganophthalmata +steganophthalmate +steganophthalmatous +Steganophthalmia +steganopod +steganopodan +Steganopodes +steganopodous +stegnosis +stegnotic +stegocarpous +Stegocephalia +stegocephalian +stegocephalous +Stegodon +stegodont +stegodontine +Stegomus +Stegomyia +stegosaur +Stegosauria +stegosaurian +stegosauroid +Stegosaurus +steid +steigh +Stein +stein +Steinberger +steinbok +Steinerian +steinful +steinkirk +Steironema +stekan +stela +stelae +stelai +stelar +stele +stell +Stella +stella +stellar +Stellaria +stellary +stellate +stellated +stellately +stellature +stelleridean +stellerine +stelliferous +stellification +stelliform +stellify +stelling +stellionate +stelliscript +Stellite +stellite +stellular +stellularly +stellulate +stelography +stem +stema +stemhead +stemless +stemlet +stemlike +stemma +stemmata +stemmatiform +stemmatous +stemmed +stemmer +stemmery +stemming +stemmy +Stemona +Stemonaceae +stemonaceous +stemple +stempost +stemson +stemwards +stemware +sten +stenar +stench +stenchel +stenchful +stenching +stenchion +stenchy +stencil +stenciler +stencilmaker +stencilmaking +stend +steng +stengah +stenion +steno +stenobathic +stenobenthic +stenobragmatic +stenobregma +stenocardia +stenocardiac +Stenocarpus +stenocephalia +stenocephalic +stenocephalous +stenocephaly +stenochoria +stenochrome +stenochromy +stenocoriasis +stenocranial +stenocrotaphia +Stenofiber +stenog +stenogastric +stenogastry +Stenoglossa +stenograph +stenographer +stenographic +stenographical +stenographically +stenographist +stenography +stenohaline +stenometer +stenopaic +Stenopelmatidae +stenopetalous +stenophile +Stenophragma +stenophyllous +stenorhyncous +stenosed +stenosepalous +stenosis +stenosphere +stenostomatous +stenostomia +Stenotaphrum +stenotelegraphy +stenothermal +stenothorax +stenotic +stenotype +stenotypic +stenotypist +stenotypy +stent +stenter +stenterer +stenton +Stentor +stentorian +stentorianly +stentorine +stentorious +stentoriously +stentoriousness +stentoronic +stentorophonic +stentrel +step +stepaunt +stepbairn +stepbrother +stepbrotherhood +stepchild +stepdame +stepdaughter +stepfather +stepfatherhood +stepfatherly +stepgrandchild +stepgrandfather +stepgrandmother +stepgrandson +Stephan +Stephana +stephane +stephanial +Stephanian +stephanic +Stephanie +stephanion +stephanite +Stephanoceros +Stephanokontae +stephanome +stephanos +Stephanotis +stephanotis +Stephanurus +Stephe +Stephen +stepladder +stepless +steplike +stepminnie +stepmother +stepmotherhood +stepmotherless +stepmotherliness +stepmotherly +stepnephew +stepniece +stepparent +steppe +stepped +steppeland +stepper +stepping +steppingstone +steprelation +steprelationship +stepsire +stepsister +stepson +stepstone +stept +stepuncle +stepway +stepwise +steradian +stercobilin +stercolin +stercophagic +stercophagous +stercoraceous +stercoral +Stercoranism +Stercoranist +Stercorariidae +Stercorariinae +stercorarious +Stercorarius +stercorary +stercorate +stercoration +stercorean +stercoremia +stercoreous +Stercorianism +stercoricolous +Stercorist +stercorite +stercorol +stercorous +stercovorous +Sterculia +Sterculiaceae +sterculiaceous +sterculiad +stere +stereagnosis +Sterelmintha +sterelminthic +sterelminthous +stereo +stereobate +stereobatic +stereoblastula +stereocamera +stereocampimeter +stereochemic +stereochemical +stereochemically +stereochemistry +stereochromatic +stereochromatically +stereochrome +stereochromic +stereochromically +stereochromy +stereocomparagraph +stereocomparator +stereoelectric +stereofluoroscopic +stereofluoroscopy +stereogastrula +stereognosis +stereognostic +stereogoniometer +stereogram +stereograph +stereographer +stereographic +stereographical +stereographically +stereography +stereoisomer +stereoisomeric +stereoisomerical +stereoisomeride +stereoisomerism +stereomatrix +stereome +stereomer +stereomeric +stereomerical +stereomerism +stereometer +stereometric +stereometrical +stereometrically +stereometry +stereomicrometer +stereomonoscope +stereoneural +stereophantascope +stereophonic +stereophony +stereophotogrammetry +stereophotograph +stereophotographic +stereophotography +stereophotomicrograph +stereophotomicrography +stereophysics +stereopicture +stereoplanigraph +stereoplanula +stereoplasm +stereoplasma +stereoplasmic +stereopsis +stereoptician +stereopticon +stereoradiograph +stereoradiography +Stereornithes +stereornithic +stereoroentgenogram +stereoroentgenography +stereoscope +stereoscopic +stereoscopically +stereoscopism +stereoscopist +stereoscopy +Stereospondyli +stereospondylous +stereostatic +stereostatics +stereotactic +stereotactically +stereotaxis +stereotelemeter +stereotelescope +stereotomic +stereotomical +stereotomist +stereotomy +stereotropic +stereotropism +stereotypable +stereotype +stereotyped +stereotyper +stereotypery +stereotypic +stereotypical +stereotyping +stereotypist +stereotypographer +stereotypography +stereotypy +Stereum +sterhydraulic +steri +steric +sterically +sterics +steride +sterigma +sterigmata +sterigmatic +sterile +sterilely +sterileness +sterilisable +sterility +sterilizability +sterilizable +sterilization +sterilize +sterilizer +sterin +sterk +sterlet +Sterling +sterling +sterlingly +sterlingness +Stern +stern +Sterna +sterna +sternad +sternage +sternal +sternalis +sternbergite +sterncastle +sterneber +sternebra +sternebrae +sternebral +sterned +sternforemost +Sterninae +sternite +sternitic +sternly +sternman +sternmost +sternness +Sterno +sternoclavicular +sternocleidomastoid +sternoclidomastoid +sternocoracoid +sternocostal +sternofacial +sternofacialis +sternoglossal +sternohumeral +sternohyoid +sternohyoidean +sternomancy +sternomastoid +sternomaxillary +sternonuchal +sternopericardiac +sternopericardial +sternoscapular +sternothere +Sternotherus +sternothyroid +sternotracheal +sternotribe +sternovertebral +sternoxiphoid +sternpost +sternson +sternum +sternutation +sternutative +sternutator +sternutatory +sternward +sternway +sternways +sternworks +stero +steroid +sterol +Sterope +sterrinck +stert +stertor +stertorious +stertoriously +stertoriousness +stertorous +stertorously +stertorousness +sterve +Stesichorean +stet +stetch +stetharteritis +stethogoniometer +stethograph +stethographic +stethokyrtograph +stethometer +stethometric +stethometry +stethoparalysis +stethophone +stethophonometer +stethoscope +stethoscopic +stethoscopical +stethoscopically +stethoscopist +stethoscopy +stethospasm +Stevan +Steve +stevedorage +stevedore +stevedoring +stevel +Steven +steven +Stevensonian +Stevensoniana +Stevia +stevia +stew +stewable +steward +stewardess +stewardly +stewardry +stewardship +Stewart +Stewartia +stewartry +stewarty +stewed +stewpan +stewpond +stewpot +stewy +stey +sthenia +sthenic +sthenochire +stib +stibbler +stibblerig +stibethyl +stibial +stibialism +stibiate +stibiated +stibic +stibiconite +stibine +stibious +stibium +stibnite +stibonium +sticcado +stich +sticharion +sticheron +stichic +stichically +stichid +stichidium +stichomancy +stichometric +stichometrical +stichometrically +stichometry +stichomythic +stichomythy +stick +stickability +stickable +stickadore +stickadove +stickage +stickball +sticked +sticker +stickers +stickfast +stickful +stickily +stickiness +sticking +stickit +stickle +stickleaf +stickleback +stickler +stickless +sticklike +stickling +stickly +stickpin +sticks +stickseed +sticksmanship +sticktail +sticktight +stickum +stickwater +stickweed +stickwork +sticky +Sticta +Stictaceae +Stictidaceae +stictiform +Stictis +stid +stiddy +stife +stiff +stiffen +stiffener +stiffening +stiffhearted +stiffish +stiffleg +stifflike +stiffly +stiffneck +stiffness +stiffrump +stifftail +stifle +stifledly +stifler +stifling +stiflingly +stigma +stigmai +stigmal +stigmaria +stigmarian +stigmarioid +stigmasterol +stigmata +stigmatal +stigmatic +stigmatical +stigmatically +stigmaticalness +stigmatiferous +stigmatiform +stigmatism +stigmatist +stigmatization +stigmatize +stigmatizer +stigmatoid +stigmatose +stigme +stigmeology +stigmonose +stigonomancy +Stikine +Stilbaceae +Stilbella +stilbene +stilbestrol +stilbite +stilboestrol +Stilbum +stile +stileman +stilet +stiletto +stilettolike +still +stillage +stillatitious +stillatory +stillbirth +stillborn +stiller +stillhouse +stillicide +stillicidium +stilliform +stilling +Stillingia +stillion +stillish +stillman +stillness +stillroom +stillstand +Stillwater +stilly +Stilophora +Stilophoraceae +stilpnomelane +stilpnosiderite +stilt +stiltbird +stilted +stilter +stiltify +stiltiness +stiltish +stiltlike +Stilton +stilty +stim +stime +stimpart +stimpert +stimulability +stimulable +stimulance +stimulancy +stimulant +stimulate +stimulatingly +stimulation +stimulative +stimulator +stimulatory +stimulatress +stimulatrix +stimuli +stimulogenous +stimulus +stimy +stine +sting +stingaree +stingareeing +stingbull +stinge +stinger +stingfish +stingily +stinginess +stinging +stingingly +stingingness +stingless +stingo +stingproof +stingray +stingtail +stingy +stink +stinkard +stinkardly +stinkball +stinkberry +stinkbird +stinkbug +stinkbush +stinkdamp +stinker +stinkhorn +stinking +stinkingly +stinkingness +stinkpot +stinkstone +stinkweed +stinkwood +stinkwort +stint +stinted +stintedly +stintedness +stinter +stintingly +stintless +stinty +stion +stionic +Stipa +stipe +stiped +stipel +stipellate +stipend +stipendial +stipendiarian +stipendiary +stipendiate +stipendium +stipendless +stipes +stipiform +stipitate +stipitiform +stipiture +Stipiturus +stippen +stipple +stippled +stippler +stippling +stipply +stipula +stipulable +stipulaceous +stipulae +stipular +stipulary +stipulate +stipulation +stipulator +stipulatory +stipule +stipuled +stipuliferous +stipuliform +stir +stirabout +stirk +stirless +stirlessly +stirlessness +stirp +stirpicultural +stirpiculture +stirpiculturist +stirps +stirra +stirrable +stirrage +stirrer +stirring +stirringly +stirrup +stirrupless +stirruplike +stirrupwise +stitch +stitchbird +stitchdown +stitcher +stitchery +stitching +stitchlike +stitchwhile +stitchwork +stitchwort +stite +stith +stithy +stive +stiver +stivy +Stizolobium +stoa +stoach +stoat +stoater +stob +stocah +stoccado +stoccata +stochastic +stochastical +stochastically +stock +stockade +stockannet +stockbow +stockbreeder +stockbreeding +Stockbridge +stockbroker +stockbrokerage +stockbroking +stockcar +stocker +stockfather +stockfish +stockholder +stockholding +stockhouse +stockily +stockiness +stockinet +stocking +stockinger +stockingless +stockish +stockishly +stockishness +stockjobber +stockjobbery +stockjobbing +stockjudging +stockkeeper +stockkeeping +stockless +stocklike +stockmaker +stockmaking +stockman +stockowner +stockpile +stockpot +stockproof +stockrider +stockriding +stocks +stockstone +stocktaker +stocktaking +Stockton +stockwork +stockwright +stocky +stockyard +stod +stodge +stodger +stodgery +stodgily +stodginess +stodgy +stoechas +stoep +stof +stoff +stog +stoga +stogie +stogy +Stoic +stoic +stoical +stoically +stoicalness +stoicharion +stoichiological +stoichiology +stoichiometric +stoichiometrical +stoichiometrically +stoichiometry +Stoicism +stoicism +Stokavci +Stokavian +Stokavski +stoke +stokehold +stokehole +stoker +stokerless +Stokesia +stokesite +stola +stolae +stole +stoled +stolelike +stolen +stolenly +stolenness +stolenwise +stolewise +stolid +stolidity +stolidly +stolidness +stolist +stolkjaerre +stollen +stolon +stolonate +stoloniferous +stoloniferously +stolonlike +stolzite +stoma +stomacace +stomach +stomachable +stomachal +stomacher +stomachful +stomachfully +stomachfulness +stomachic +stomachically +stomachicness +stomaching +stomachless +stomachlessness +stomachy +stomapod +Stomapoda +stomapodiform +stomapodous +stomata +stomatal +stomatalgia +stomate +stomatic +stomatiferous +stomatitic +stomatitis +stomatocace +Stomatoda +stomatodaeal +stomatodaeum +stomatode +stomatodeum +stomatodynia +stomatogastric +stomatograph +stomatography +stomatolalia +stomatologic +stomatological +stomatologist +stomatology +stomatomalacia +stomatomenia +stomatomy +stomatomycosis +stomatonecrosis +stomatopathy +Stomatophora +stomatophorous +stomatoplastic +stomatoplasty +stomatopod +Stomatopoda +stomatopodous +stomatorrhagia +stomatoscope +stomatoscopy +stomatose +stomatosepsis +stomatotomy +stomatotyphus +stomatous +stomenorrhagia +stomium +stomodaea +stomodaeal +stomodaeum +Stomoisia +stomoxys +stomp +stomper +stonable +stond +Stone +stone +stoneable +stonebird +stonebiter +stoneboat +stonebow +stonebrash +stonebreak +stonebrood +stonecast +stonechat +stonecraft +stonecrop +stonecutter +stoned +stonedamp +stonefish +stonegale +stonegall +stonehand +stonehatch +stonehead +stonehearted +Stonehenge +stonelayer +stonelaying +stoneless +stonelessness +stonelike +stoneman +stonemason +stonemasonry +stonen +stonepecker +stoner +stoneroot +stoneseed +stoneshot +stonesmatch +stonesmich +stonesmitch +stonesmith +stonewall +stonewaller +stonewally +stoneware +stoneweed +stonewise +stonewood +stonework +stoneworker +stonewort +stoneyard +stong +stonied +stonifiable +stonify +stonily +stoniness +stoning +stonish +stonishment +stonker +stony +stonyhearted +stonyheartedly +stonyheartedness +stood +stooded +stooden +stoof +stooge +stook +stooker +stookie +stool +stoolball +stoollike +stoon +stoond +stoop +stooper +stoopgallant +stooping +stoopingly +stoory +stoot +stoothing +stop +stopa +stopback +stopblock +stopboard +stopcock +stope +stoper +stopgap +stophound +stoping +stopless +stoplessness +stopover +stoppability +stoppable +stoppableness +stoppably +stoppage +stopped +stopper +stopperless +stoppeur +stopping +stoppit +stopple +stopwater +stopwork +storable +storage +storax +store +storeen +storehouse +storehouseman +storekeep +storekeeper +storekeeping +storeman +storer +storeroom +storeship +storesman +storge +storiate +storiation +storied +storier +storiette +storify +storiological +storiologist +storiology +stork +storken +storkish +storklike +storkling +storkwise +storm +stormable +Stormberg +stormbird +stormbound +stormcock +stormer +stormful +stormfully +stormfulness +stormily +storminess +storming +stormingly +stormish +stormless +stormlessness +stormlike +stormproof +stormward +stormwind +stormwise +stormy +Storting +story +storybook +storyless +storymaker +storymonger +storyteller +storytelling +storywise +storywork +stosh +stoss +stosston +stot +stotinka +stotter +stotterel +stoun +stound +stoundmeal +stoup +stoupful +stour +stouring +stourliness +stourness +stoury +stoush +stout +stouten +stouth +stouthearted +stoutheartedly +stoutheartedness +stoutish +stoutly +stoutness +stoutwood +stouty +stove +stovebrush +stoveful +stovehouse +stoveless +stovemaker +stovemaking +stoveman +stoven +stovepipe +stover +stovewood +stow +stowable +stowage +stowaway +stowbord +stowbordman +stowce +stowdown +stower +stowing +stownlins +stowwood +stra +strabism +strabismal +strabismally +strabismic +strabismical +strabismometer +strabismometry +strabismus +strabometer +strabometry +strabotome +strabotomy +strack +strackling +stract +Strad +strad +stradametrical +straddle +straddleback +straddlebug +straddler +straddleways +straddlewise +straddling +straddlingly +strade +stradine +stradiot +Stradivari +Stradivarius +stradl +stradld +stradlings +strae +strafe +strafer +Straffordian +strag +straggle +straggler +straggling +stragglingly +straggly +stragular +stragulum +straight +straightabout +straightaway +straightedge +straighten +straightener +straightforward +straightforwardly +straightforwardness +straightforwards +straighthead +straightish +straightly +straightness +straighttail +straightup +straightwards +straightway +straightways +straightwise +straik +strain +strainable +strainableness +strainably +strained +strainedly +strainedness +strainer +strainerman +straining +strainingly +strainless +strainlessly +strainproof +strainslip +straint +strait +straiten +straitlacedness +straitlacing +straitly +straitness +straitsman +straitwork +Straka +strake +straked +straky +stram +stramash +stramazon +stramineous +stramineously +strammel +strammer +stramonium +stramony +stramp +strand +strandage +strander +stranding +strandless +strandward +strang +strange +strangeling +strangely +strangeness +stranger +strangerdom +strangerhood +strangerlike +strangership +strangerwise +strangle +strangleable +stranglement +strangler +strangles +strangletare +strangleweed +strangling +stranglingly +strangulable +strangulate +strangulation +strangulative +strangulatory +strangullion +strangurious +strangury +stranner +strany +strap +straphang +straphanger +straphead +strapless +straplike +strappable +strappado +strappan +strapped +strapper +strapping +strapple +strapwork +strapwort +strass +strata +stratagem +stratagematic +stratagematical +stratagematically +stratagematist +stratagemical +stratagemically +stratal +stratameter +stratege +strategetic +strategetics +strategi +strategian +strategic +strategical +strategically +strategics +strategist +strategize +strategos +strategy +Stratfordian +strath +strathspey +strati +stratic +straticulate +straticulation +stratification +stratified +stratiform +stratify +stratigrapher +stratigraphic +stratigraphical +stratigraphically +stratigraphist +stratigraphy +Stratiomyiidae +Stratiotes +stratlin +stratochamber +stratocracy +stratocrat +stratocratic +stratographic +stratographical +stratographically +stratography +stratonic +Stratonical +stratopedarch +stratoplane +stratose +stratosphere +stratospheric +stratospherical +stratotrainer +stratous +stratum +stratus +straucht +strauchten +stravage +strave +straw +strawberry +strawberrylike +strawbill +strawboard +strawbreadth +strawen +strawer +strawflower +strawfork +strawless +strawlike +strawman +strawmote +strawsmall +strawsmear +strawstack +strawstacker +strawwalker +strawwork +strawworm +strawy +strawyard +stray +strayaway +strayer +strayling +stre +streahte +streak +streaked +streakedly +streakedness +streaker +streakily +streakiness +streaklike +streakwise +streaky +stream +streamer +streamful +streamhead +streaminess +streaming +streamingly +streamless +streamlet +streamlike +streamline +streamlined +streamliner +streamling +streamside +streamward +streamway +streamwort +streamy +streck +streckly +stree +streek +streel +streeler +streen +streep +street +streetage +streetcar +streetful +streetless +streetlet +streetlike +streets +streetside +streetwalker +streetwalking +streetward +streetway +streetwise +streite +streke +Strelitz +Strelitzi +strelitzi +Strelitzia +Streltzi +streltzi +stremma +stremmatograph +streng +strengite +strength +strengthen +strengthener +strengthening +strengtheningly +strengthful +strengthfulness +strengthily +strengthless +strengthlessly +strengthlessness +strengthy +strent +strenth +strenuity +strenuosity +strenuous +strenuously +strenuousness +strepen +strepent +strepera +streperous +strephonade +strephosymbolia +strepitant +strepitantly +strepitation +strepitous +strepor +Strepsiceros +strepsiceros +strepsinema +Strepsiptera +strepsipteral +strepsipteran +strepsipteron +strepsipterous +strepsis +strepsitene +streptaster +streptobacilli +streptobacillus +Streptocarpus +streptococcal +streptococci +streptococcic +Streptococcus +streptococcus +streptolysin +Streptomyces +streptomycin +Streptoneura +streptoneural +streptoneurous +streptosepticemia +streptothricial +streptothricin +streptothricosis +Streptothrix +streptotrichal +streptotrichosis +stress +stresser +stressful +stressfully +stressless +stresslessness +stret +stretch +stretchable +stretchberry +stretcher +stretcherman +stretchiness +stretchneck +stretchproof +stretchy +stretman +strette +stretti +stretto +strew +strewage +strewer +strewment +strewn +strey +streyne +stria +striae +strial +Striaria +Striariaceae +striatal +striate +striated +striation +striatum +striature +strich +striche +strick +stricken +strickenly +strickenness +stricker +strickle +strickler +strickless +strict +striction +strictish +strictly +strictness +stricture +strictured +strid +stridden +striddle +stride +strideleg +stridelegs +stridence +stridency +strident +stridently +strider +strideways +stridhan +stridhana +stridhanum +stridingly +stridling +stridlins +stridor +stridulant +stridulate +stridulation +stridulator +stridulatory +stridulent +stridulous +stridulously +stridulousness +strife +strifeful +strifeless +strifemaker +strifemaking +strifemonger +strifeproof +striffen +strig +Striga +striga +strigae +strigal +strigate +Striges +striggle +stright +Strigidae +Strigiformes +strigil +strigilate +strigilation +strigilator +strigiles +strigilis +strigillose +strigilous +Striginae +strigine +strigose +strigous +strigovite +Strigula +Strigulaceae +strigulose +strike +strikeboat +strikebreaker +strikebreaking +strikeless +striker +striking +strikingly +strikingness +strind +string +stringboard +stringcourse +stringed +stringency +stringene +stringent +stringently +stringentness +stringer +stringful +stringhalt +stringhalted +stringhaltedness +stringiness +stringing +stringless +stringlike +stringmaker +stringmaking +stringman +stringpiece +stringsman +stringways +stringwood +stringy +stringybark +strinkle +striola +striolae +striolate +striolated +striolet +strip +stripe +striped +stripeless +striper +striplet +stripling +strippage +stripped +stripper +stripping +strippit +strippler +stript +stripy +strit +strive +strived +striven +striver +striving +strivingly +Strix +strix +stroam +strobic +strobila +strobilaceous +strobilae +strobilate +strobilation +strobile +strobili +strobiliferous +strobiliform +strobiline +strobilization +strobiloid +Strobilomyces +Strobilophyta +strobilus +stroboscope +stroboscopic +stroboscopical +stroboscopy +strobotron +strockle +stroddle +strode +stroil +stroke +stroker +strokesman +stroking +stroky +strold +stroll +strolld +stroller +strom +stroma +stromal +stromata +Stromateidae +stromateoid +stromatic +stromatiform +stromatology +Stromatopora +Stromatoporidae +stromatoporoid +Stromatoporoidea +stromatous +stromb +Strombidae +strombiform +strombite +stromboid +strombolian +strombuliferous +strombuliform +Strombus +strome +stromeyerite +stromming +strone +strong +strongback +strongbark +strongbox +strongbrained +strongfully +stronghand +stronghead +strongheadedly +strongheadedness +stronghearted +stronghold +strongish +stronglike +strongly +strongness +strongylate +strongyle +strongyliasis +strongylid +Strongylidae +strongylidosis +strongyloid +Strongyloides +strongyloidosis +strongylon +Strongyloplasmata +Strongylosis +strongylosis +Strongylus +strontia +strontian +strontianiferous +strontianite +strontic +strontion +strontitic +strontium +strook +strooken +stroot +strop +strophaic +strophanhin +Strophanthus +Stropharia +strophe +strophic +strophical +strophically +strophiolate +strophiolated +strophiole +strophoid +Strophomena +Strophomenacea +strophomenid +Strophomenidae +strophomenoid +strophosis +strophotaxis +strophulus +stropper +stroppings +stroth +stroud +strouding +strounge +stroup +strouthiocamel +strouthiocamelian +strouthocamelian +strove +strow +strowd +strown +stroy +stroyer +stroygood +strub +strubbly +struck +strucken +structural +structuralism +structuralist +structuralization +structuralize +structurally +structuration +structure +structured +structureless +structurely +structurist +strudel +strue +struggle +struggler +struggling +strugglingly +Struldbrug +Struldbruggian +Struldbruggism +strum +struma +strumae +strumatic +strumaticness +strumectomy +Strumella +strumiferous +strumiform +strumiprivic +strumiprivous +strumitis +strummer +strumose +strumous +strumousness +strumpet +strumpetlike +strumpetry +strumstrum +strumulose +strung +strunt +strut +struth +struthian +struthiform +Struthio +struthioid +Struthiomimus +Struthiones +Struthionidae +struthioniform +Struthioniformes +Struthiopteris +struthious +struthonine +strutter +strutting +struttingly +struv +struvite +strych +strychnia +strychnic +strychnin +strychnine +strychninic +strychninism +strychninization +strychninize +strychnize +strychnol +Strychnos +Strymon +Stu +Stuart +Stuartia +stub +stubachite +stubb +stubbed +stubbedness +stubber +stubbiness +stubble +stubbleberry +stubbled +stubbleward +stubbly +stubborn +stubbornhearted +stubbornly +stubbornness +stubboy +stubby +stubchen +stuber +stuboy +stubrunner +stucco +stuccoer +stuccowork +stuccoworker +stuccoyer +stuck +stuckling +stucturelessness +stud +studbook +studder +studdie +studding +studdle +stude +student +studenthood +studentless +studentlike +studentry +studentship +studerite +studfish +studflower +studhorse +studia +studiable +studied +studiedly +studiedness +studier +studio +studious +studiously +studiousness +Studite +Studium +studium +studwork +study +stue +stuff +stuffed +stuffender +stuffer +stuffgownsman +stuffily +stuffiness +stuffing +stuffy +stug +stuggy +stuiver +stull +stuller +stulm +stultification +stultifier +stultify +stultiloquence +stultiloquently +stultiloquious +stultioquy +stultloquent +stum +stumble +stumbler +stumbling +stumblingly +stumbly +stumer +stummer +stummy +stump +stumpage +stumper +stumpily +stumpiness +stumpish +stumpless +stumplike +stumpling +stumpnose +stumpwise +stumpy +stun +Stundism +Stundist +stung +stunk +stunkard +stunner +stunning +stunningly +stunpoll +stunsail +stunsle +stunt +stunted +stuntedly +stuntedness +stunter +stuntiness +stuntness +stunty +stupa +stupe +stupefacient +stupefaction +stupefactive +stupefactiveness +stupefied +stupefiedness +stupefier +stupefy +stupend +stupendly +stupendous +stupendously +stupendousness +stupent +stupeous +stupex +stupid +stupidhead +stupidish +stupidity +stupidly +stupidness +stupor +stuporific +stuporose +stuporous +stupose +stupp +stuprate +stupration +stuprum +stupulose +sturdied +sturdily +sturdiness +sturdy +sturdyhearted +sturgeon +sturine +Sturiones +sturionine +sturk +Sturmian +Sturnella +Sturnidae +sturniform +Sturninae +sturnine +sturnoid +Sturnus +sturt +sturtan +sturtin +sturtion +sturtite +stuss +stut +stutter +stutterer +stuttering +stutteringly +sty +styan +styca +styceric +stycerin +stycerinol +stychomythia +styful +styfziekte +Stygial +Stygian +stylar +Stylaster +Stylasteridae +stylate +style +stylebook +styledom +styleless +stylelessness +stylelike +styler +stylet +stylewort +Stylidiaceae +stylidiaceous +Stylidium +styliferous +styliform +styline +styling +stylish +stylishly +stylishness +stylist +stylistic +stylistical +stylistically +stylistics +stylite +stylitic +stylitism +stylization +stylize +stylizer +stylo +styloauricularis +stylobate +Stylochus +styloglossal +styloglossus +stylogonidium +stylograph +stylographic +stylographical +stylographically +stylography +stylohyal +stylohyoid +stylohyoidean +stylohyoideus +styloid +stylolite +stylolitic +stylomandibular +stylomastoid +stylomaxillary +stylometer +Stylommatophora +stylommatophorous +stylomyloid +Stylonurus +Stylonychia +stylopharyngeal +stylopharyngeus +stylopid +Stylopidae +stylopization +stylopized +stylopod +stylopodium +Stylops +stylops +Stylosanthes +stylospore +stylosporous +stylostegium +stylotypite +stylus +stymie +Stymphalian +Stymphalid +Stymphalides +Styphelia +styphnate +styphnic +stypsis +styptic +styptical +stypticalness +stypticity +stypticness +Styracaceae +styracaceous +styracin +Styrax +styrax +styrene +Styrian +styrogallol +styrol +styrolene +styrone +styryl +styrylic +stythe +styward +Styx +Styxian +suability +suable +suably +suade +Suaeda +suaharo +Sualocin +Suanitian +suant +suantly +suasible +suasion +suasionist +suasive +suasively +suasiveness +suasory +suavastika +suave +suavely +suaveness +suaveolent +suavify +suaviloquence +suaviloquent +suavity +sub +subabbot +subabdominal +subability +subabsolute +subacademic +subaccount +subacetate +subacid +subacidity +subacidly +subacidness +subacidulous +subacrid +subacrodrome +subacromial +subact +subacuminate +subacute +subacutely +subadditive +subadjacent +subadjutor +subadministrate +subadministration +subadministrator +subadult +subaduncate +subaerate +subaeration +subaerial +subaerially +subaetheric +subaffluent +subage +subagency +subagent +subaggregate +subah +subahdar +subahdary +subahship +subaid +Subakhmimic +subalary +subalate +subalgebra +subalkaline +suballiance +subalmoner +subalpine +subaltern +subalternant +subalternate +subalternately +subalternating +subalternation +subalternity +subanal +subandean +subangled +subangular +subangulate +subangulated +subanniversary +subantarctic +subantichrist +subantique +Subanun +subapical +subaponeurotic +subapostolic +subapparent +subappearance +subappressed +subapprobation +subapterous +subaquatic +subaquean +subaqueous +subarachnoid +subarachnoidal +subarachnoidean +subarboraceous +subarboreal +subarborescent +subarch +subarchesporial +subarchitect +subarctic +subarcuate +subarcuated +subarcuation +subarea +subareolar +subareolet +Subarian +subarmor +subarouse +subarrhation +subartesian +subarticle +subarytenoid +subascending +subassemblage +subassembly +subassociation +subastragalar +subastragaloid +subastral +subastringent +subatom +subatomic +subattenuate +subattenuated +subattorney +subaud +subaudible +subaudition +subauditionist +subauditor +subauditur +subaural +subauricular +subautomatic +subaverage +subaxillar +subaxillary +subbailie +subbailiff +subbailiwick +subballast +subband +subbank +subbasal +subbasaltic +subbase +subbasement +subbass +subbeadle +subbeau +subbias +subbifid +subbing +subbituminous +subbookkeeper +subboreal +subbourdon +subbrachycephalic +subbrachycephaly +subbrachyskelic +subbranch +subbranched +subbranchial +subbreed +subbrigade +subbrigadier +subbroker +subbromid +subbromide +subbronchial +subbureau +subcaecal +subcalcareous +subcalcarine +subcaliber +subcallosal +subcampanulate +subcancellate +subcandid +subcantor +subcapsular +subcaptain +subcaption +subcarbide +subcarbonate +Subcarboniferous +subcarbureted +subcarburetted +subcardinal +subcarinate +subcartilaginous +subcase +subcash +subcashier +subcasino +subcast +subcaste +subcategory +subcaudal +subcaudate +subcaulescent +subcause +subcavate +subcavity +subcelestial +subcell +subcellar +subcenter +subcentral +subcentrally +subchairman +subchamberer +subchancel +subchanter +subchapter +subchaser +subchela +subchelate +subcheliform +subchief +subchloride +subchondral +subchordal +subchorioid +subchorioidal +subchorionic +subchoroid +subchoroidal +subcinctorium +subcineritious +subcingulum +subcircuit +subcircular +subcision +subcity +subclaim +Subclamatores +subclan +subclass +subclassify +subclause +subclavate +subclavia +subclavian +subclavicular +subclavioaxillary +subclaviojugular +subclavius +subclerk +subclimate +subclimax +subclinical +subclover +subcoastal +subcollateral +subcollector +subcollegiate +subcolumnar +subcommander +subcommendation +subcommended +subcommissary +subcommissaryship +subcommission +subcommissioner +subcommit +subcommittee +subcompany +subcompensate +subcompensation +subcompressed +subconcave +subconcession +subconcessionaire +subconchoidal +subconference +subconformable +subconical +subconjunctival +subconjunctively +subconnate +subconnect +subconnivent +subconscience +subconscious +subconsciously +subconsciousness +subconservator +subconsideration +subconstable +subconstellation +subconsul +subcontained +subcontest +subcontiguous +subcontinent +subcontinental +subcontinual +subcontinued +subcontinuous +subcontract +subcontracted +subcontractor +subcontraoctave +subcontrariety +subcontrarily +subcontrary +subcontrol +subconvex +subconvolute +subcool +subcoracoid +subcordate +subcordiform +subcoriaceous +subcorneous +subcorporation +subcortex +subcortical +subcortically +subcorymbose +subcosta +subcostal +subcostalis +subcouncil +subcranial +subcreative +subcreek +subcrenate +subcrepitant +subcrepitation +subcrescentic +subcrest +subcriminal +subcrossing +subcrureal +subcrureus +subcrust +subcrustaceous +subcrustal +subcrystalline +subcubical +subcuboidal +subcultrate +subcultural +subculture +subcurate +subcurator +subcuratorship +subcurrent +subcutaneous +subcutaneously +subcutaneousness +subcuticular +subcutis +subcyaneous +subcyanide +subcylindric +subcylindrical +subdatary +subdate +subdeacon +subdeaconate +subdeaconess +subdeaconry +subdeaconship +subdealer +subdean +subdeanery +subdeb +subdebutante +subdecanal +subdecimal +subdecuple +subdeducible +subdefinition +subdelegate +subdelegation +subdelirium +subdeltaic +subdeltoid +subdeltoidal +subdemonstrate +subdemonstration +subdenomination +subdentate +subdentated +subdented +subdenticulate +subdepartment +subdeposit +subdepository +subdepot +subdepressed +subdeputy +subderivative +subdermal +subdeterminant +subdevil +subdiaconal +subdiaconate +subdial +subdialect +subdialectal +subdialectally +subdiapason +subdiapente +subdiaphragmatic +subdichotomize +subdichotomous +subdichotomously +subdichotomy +subdie +subdilated +subdirector +subdiscoidal +subdisjunctive +subdistich +subdistichous +subdistinction +subdistinguish +subdistinguished +subdistrict +subdititious +subdititiously +subdivecious +subdiversify +subdividable +subdivide +subdivider +subdividing +subdividingly +subdivine +subdivisible +subdivision +subdivisional +subdivisive +subdoctor +subdolent +subdolichocephalic +subdolichocephaly +subdolous +subdolously +subdolousness +subdominant +subdorsal +subdorsally +subdouble +subdrain +subdrainage +subdrill +subdruid +subduable +subduableness +subduably +subdual +subduce +subduct +subduction +subdue +subdued +subduedly +subduedness +subduement +subduer +subduing +subduingly +subduple +subduplicate +subdural +subdurally +subecho +subectodermal +subedit +subeditor +subeditorial +subeditorship +subeffective +subelection +subelectron +subelement +subelementary +subelliptic +subelliptical +subelongate +subemarginate +subencephalon +subencephaltic +subendocardial +subendorse +subendorsement +subendothelial +subendymal +subenfeoff +subengineer +subentire +subentitle +subentry +subepidermal +subepiglottic +subepithelial +subepoch +subequal +subequality +subequally +subequatorial +subequilateral +subequivalve +suber +suberane +suberate +suberect +subereous +suberic +suberiferous +suberification +suberiform +suberin +suberinization +suberinize +Suberites +Suberitidae +suberization +suberize +suberone +suberose +suberous +subescheator +subesophageal +subessential +subetheric +subexaminer +subexcitation +subexcite +subexecutor +subexternal +subface +subfacies +subfactor +subfactorial +subfactory +subfalcate +subfalcial +subfalciform +subfamily +subfascial +subfastigiate +subfebrile +subferryman +subfestive +subfeu +subfeudation +subfeudatory +subfibrous +subfief +subfigure +subfissure +subfix +subflavor +subflexuose +subfloor +subflooring +subflora +subflush +subfluvial +subfocal +subfoliar +subforeman +subform +subformation +subfossil +subfossorial +subfoundation +subfraction +subframe +subfreshman +subfrontal +subfulgent +subfumigation +subfumose +subfunctional +subfusc +subfuscous +subfusiform +subfusk +subgalea +subgallate +subganger +subgape +subgelatinous +subgeneric +subgenerical +subgenerically +subgeniculate +subgenital +subgens +subgenual +subgenus +subgeometric +subget +subgit +subglabrous +subglacial +subglacially +subglenoid +subglobose +subglobosely +subglobular +subglobulose +subglossal +subglossitis +subglottic +subglumaceous +subgod +subgoverness +subgovernor +subgrade +subgranular +subgrin +subgroup +subgular +subgwely +subgyre +subgyrus +subhalid +subhalide +subhall +subharmonic +subhastation +subhatchery +subhead +subheading +subheadquarters +subheadwaiter +subhealth +subhedral +subhemispherical +subhepatic +subherd +subhero +subhexagonal +subhirsute +subhooked +subhorizontal +subhornblendic +subhouse +subhuman +subhumid +subhyaline +subhyaloid +subhymenial +subhymenium +subhyoid +subhyoidean +subhypothesis +subhysteria +subicle +subicteric +subicular +subiculum +subidar +subidea +subideal +subimaginal +subimago +subimbricate +subimbricated +subimposed +subimpressed +subincandescent +subincident +subincise +subincision +subincomplete +subindex +subindicate +subindication +subindicative +subindices +subindividual +subinduce +subinfer +subinfeud +subinfeudate +subinfeudation +subinfeudatory +subinflammation +subinflammatory +subinform +subingression +subinguinal +subinitial +subinoculate +subinoculation +subinsert +subinsertion +subinspector +subinspectorship +subintegumental +subintellection +subintelligential +subintelligitur +subintent +subintention +subintercessor +subinternal +subinterval +subintestinal +subintroduce +subintroduction +subintroductory +subinvoluted +subinvolution +subiodide +subirrigate +subirrigation +subitane +subitaneous +subitem +Subiya +subjacency +subjacent +subjacently +subjack +subject +subjectability +subjectable +subjectdom +subjected +subjectedly +subjectedness +subjecthood +subjectibility +subjectible +subjectification +subjectify +subjectile +subjection +subjectional +subjectist +subjective +subjectively +subjectiveness +subjectivism +subjectivist +subjectivistic +subjectivistically +subjectivity +subjectivize +subjectivoidealistic +subjectless +subjectlike +subjectness +subjectship +subjee +subjicible +subjoin +subjoinder +subjoint +subjudge +subjudiciary +subjugable +subjugal +subjugate +subjugation +subjugator +subjugular +subjunct +subjunction +subjunctive +subjunctively +subjunior +subking +subkingdom +sublabial +sublaciniate +sublacustrine +sublanate +sublanceolate +sublanguage +sublapsarian +sublapsarianism +sublapsary +sublaryngeal +sublate +sublateral +sublation +sublative +subleader +sublease +sublecturer +sublegislation +sublegislature +sublenticular +sublessee +sublessor +sublet +sublethal +sublettable +subletter +sublevaminous +sublevate +sublevation +sublevel +sublibrarian +sublicense +sublicensee +sublid +sublieutenancy +sublieutenant +subligation +sublighted +sublimable +sublimableness +sublimant +sublimate +sublimation +sublimational +sublimationist +sublimator +sublimatory +sublime +sublimed +sublimely +sublimeness +sublimer +subliminal +subliminally +sublimish +sublimitation +sublimity +sublimize +sublinear +sublineation +sublingua +sublinguae +sublingual +sublinguate +sublittoral +sublobular +sublong +subloral +subloreal +sublot +sublumbar +sublunar +sublunary +sublunate +sublustrous +subluxate +subluxation +submaid +submain +submakroskelic +submammary +subman +submanager +submania +submanic +submanor +submarginal +submarginally +submarginate +submargined +submarine +submariner +submarinism +submarinist +submarshal +submaster +submaxilla +submaxillary +submaximal +submeaning +submedial +submedian +submediant +submediation +submediocre +submeeting +submember +submembranaceous +submembranous +submeningeal +submental +submentum +submerge +submerged +submergement +submergence +submergibility +submergible +submerse +submersed +submersibility +submersible +submersion +submetallic +submeter +submetering +submicron +submicroscopic +submicroscopically +submiliary +submind +subminimal +subminister +submiss +submissible +submission +submissionist +submissive +submissively +submissiveness +submissly +submissness +submit +submittal +submittance +submitter +submittingly +submolecule +submonition +submontagne +submontane +submontanely +submontaneous +submorphous +submortgage +submotive +submountain +submucosa +submucosal +submucous +submucronate +submultiple +submundane +submuriate +submuscular +Submytilacea +subnarcotic +subnasal +subnascent +subnatural +subnect +subnervian +subness +subneural +subnex +subnitrate +subnitrated +subniveal +subnivean +subnormal +subnormality +subnotation +subnote +subnotochordal +subnubilar +subnucleus +subnude +subnumber +subnuvolar +suboblique +subobscure +subobscurely +subobtuse +suboccipital +subocean +suboceanic +suboctave +suboctile +suboctuple +subocular +suboesophageal +suboffice +subofficer +subofficial +subolive +subopaque +subopercle +subopercular +suboperculum +subopposite +suboptic +suboptimal +suboptimum +suboral +suborbicular +suborbiculate +suborbiculated +suborbital +suborbitar +suborbitary +subordain +suborder +subordinacy +subordinal +subordinary +subordinate +subordinately +subordinateness +subordinating +subordinatingly +subordination +subordinationism +subordinationist +subordinative +suborganic +suborn +subornation +subornative +suborner +Suboscines +suboval +subovate +subovated +suboverseer +subovoid +suboxidation +suboxide +subpackage +subpagoda +subpallial +subpalmate +subpanel +subparagraph +subparallel +subpart +subpartition +subpartitioned +subpartitionment +subparty +subpass +subpassage +subpastor +subpatron +subpattern +subpavement +subpectinate +subpectoral +subpeduncle +subpeduncular +subpedunculate +subpellucid +subpeltate +subpeltated +subpentagonal +subpentangular +subpericardial +subperiod +subperiosteal +subperiosteally +subperitoneal +subperitoneally +subpermanent +subpermanently +subperpendicular +subpetiolar +subpetiolate +subpharyngeal +subphosphate +subphratry +subphrenic +subphylar +subphylum +subpial +subpilose +subpimp +subpiston +subplacenta +subplant +subplantigrade +subplat +subpleural +subplinth +subplot +subplow +subpodophyllous +subpoena +subpoenal +subpolar +subpolygonal +subpool +subpopular +subpopulation +subporphyritic +subport +subpostmaster +subpostmastership +subpostscript +subpotency +subpotent +subpreceptor +subpreceptorial +subpredicate +subpredication +subprefect +subprefectorial +subprefecture +subprehensile +subpress +subprimary +subprincipal +subprior +subprioress +subproblem +subproctor +subproduct +subprofessional +subprofessor +subprofessoriate +subprofitable +subproportional +subprotector +subprovince +subprovincial +subpubescent +subpubic +subpulmonary +subpulverizer +subpunch +subpunctuation +subpurchaser +subpurlin +subputation +subpyramidal +subpyriform +subquadrangular +subquadrate +subquality +subquestion +subquinquefid +subquintuple +Subra +subrace +subradial +subradiance +subradiate +subradical +subradius +subradular +subrailway +subrameal +subramose +subramous +subrange +subrational +subreader +subreason +subrebellion +subrectangular +subrector +subreference +subregent +subregion +subregional +subregular +subreguli +subregulus +subrelation +subreligion +subreniform +subrent +subrepand +subrepent +subreport +subreptary +subreption +subreptitious +subreputable +subresin +subretinal +subrhombic +subrhomboid +subrhomboidal +subrictal +subrident +subridently +subrigid +subrision +subrisive +subrisory +subrogate +subrogation +subroot +subrostral +subround +subrule +subruler +subsacral +subsale +subsaline +subsalt +subsample +subsartorial +subsatiric +subsatirical +subsaturated +subsaturation +subscapular +subscapularis +subscapulary +subschedule +subscheme +subschool +subscience +subscleral +subsclerotic +subscribable +subscribe +subscriber +subscribership +subscript +subscription +subscriptionist +subscriptive +subscriptively +subscripture +subscrive +subscriver +subsea +subsecive +subsecretarial +subsecretary +subsect +subsection +subsecurity +subsecute +subsecutive +subsegment +subsemifusa +subsemitone +subsensation +subsensible +subsensual +subsensuous +subsept +subseptuple +subsequence +subsequency +subsequent +subsequential +subsequentially +subsequently +subsequentness +subseries +subserosa +subserous +subserrate +subserve +subserviate +subservience +subserviency +subservient +subserviently +subservientness +subsessile +subset +subsewer +subsextuple +subshaft +subsheriff +subshire +subshrub +subshrubby +subside +subsidence +subsidency +subsident +subsider +subsidiarie +subsidiarily +subsidiariness +subsidiary +subsiding +subsidist +subsidizable +subsidization +subsidize +subsidizer +subsidy +subsilicate +subsilicic +subsill +subsimilation +subsimious +subsimple +subsinuous +subsist +subsistence +subsistency +subsistent +subsistential +subsistingly +subsizar +subsizarship +subsmile +subsneer +subsocial +subsoil +subsoiler +subsolar +subsolid +subsonic +subsorter +subsovereign +subspace +subspatulate +subspecialist +subspecialize +subspecialty +subspecies +subspecific +subspecifically +subsphenoidal +subsphere +subspherical +subspherically +subspinous +subspiral +subspontaneous +subsquadron +substage +substalagmite +substalagmitic +substance +substanceless +substanch +substandard +substandardize +substant +substantiability +substantial +substantialia +substantialism +substantialist +substantiality +substantialize +substantially +substantialness +substantiate +substantiation +substantiative +substantiator +substantify +substantious +substantival +substantivally +substantive +substantively +substantiveness +substantivity +substantivize +substantize +substation +substernal +substituent +substitutable +substitute +substituted +substituter +substituting +substitutingly +substitution +substitutional +substitutionally +substitutionary +substitutive +substitutively +substock +substoreroom +substory +substract +substraction +substratal +substrate +substrati +substrative +substrator +substratose +substratosphere +substratospheric +substratum +substriate +substruct +substruction +substructional +substructural +substructure +substylar +substyle +subsulfid +subsulfide +subsulphate +subsulphid +subsulphide +subsult +subsultive +subsultorily +subsultorious +subsultory +subsultus +subsumable +subsume +subsumption +subsumptive +subsuperficial +subsurety +subsurface +subsyndicate +subsynod +subsynodical +subsystem +subtack +subtacksman +subtangent +subtarget +subtartarean +subtectal +subtegminal +subtegulaneous +subtemperate +subtenancy +subtenant +subtend +subtense +subtenure +subtepid +subteraqueous +subterbrutish +subtercelestial +subterconscious +subtercutaneous +subterethereal +subterfluent +subterfluous +subterfuge +subterhuman +subterjacent +subtermarine +subterminal +subternatural +subterpose +subterposition +subterrane +subterraneal +subterranean +subterraneanize +subterraneanly +subterraneous +subterraneously +subterraneousness +subterranity +subterraqueous +subterrene +subterrestrial +subterritorial +subterritory +subtersensual +subtersensuous +subtersuperlative +subtersurface +subtertian +subtext +subthalamic +subthalamus +subthoracic +subthrill +subtile +subtilely +subtileness +subtilin +subtilism +subtilist +subtility +subtilization +subtilize +subtilizer +subtill +subtillage +subtilty +subtitle +subtitular +subtle +subtleness +subtlety +subtlist +subtly +subtone +subtonic +subtorrid +subtotal +subtotem +subtower +subtract +subtracter +subtraction +subtractive +subtrahend +subtranslucent +subtransparent +subtransverse +subtrapezoidal +subtread +subtreasurer +subtreasurership +subtreasury +subtrench +subtriangular +subtriangulate +subtribal +subtribe +subtribual +subtrifid +subtrigonal +subtrihedral +subtriplicate +subtriplicated +subtriquetrous +subtrist +subtrochanteric +subtrochlear +subtropic +subtropical +subtropics +subtrousers +subtrude +subtruncate +subtrunk +subtuberant +subtunic +subtunnel +subturbary +subturriculate +subturriculated +subtutor +subtwined +subtype +subtypical +subulate +subulated +subulicorn +Subulicornia +subuliform +subultimate +subumbellate +subumbonal +subumbral +subumbrella +subumbrellar +subuncinate +subunequal +subungual +subunguial +Subungulata +subungulate +subunit +subuniverse +suburb +suburban +suburbandom +suburbanhood +suburbanism +suburbanite +suburbanity +suburbanization +suburbanize +suburbanly +suburbed +suburbia +suburbican +suburbicarian +suburbicary +suburethral +subursine +subvaginal +subvaluation +subvarietal +subvariety +subvassal +subvassalage +subvein +subvendee +subvene +subvention +subventionary +subventioned +subventionize +subventitious +subventive +subventral +subventricose +subvermiform +subversal +subverse +subversed +subversion +subversionary +subversive +subversivism +subvert +subvertebral +subverter +subvertible +subvertical +subverticillate +subvesicular +subvestment +subvicar +subvicarship +subvillain +subvirate +subvirile +subvisible +subvitalized +subvitreous +subvocal +subvola +subwarden +subwater +subway +subwealthy +subweight +subwink +subworker +subworkman +subzonal +subzone +subzygomatic +succade +succedanea +succedaneous +succedaneum +succedent +succeed +succeedable +succeeder +succeeding +succeedingly +succent +succentor +succenturiate +succenturiation +success +successful +successfully +successfulness +succession +successional +successionally +successionist +successionless +successive +successively +successiveness +successivity +successless +successlessly +successlessness +successor +successoral +successorship +successory +succi +succin +succinamate +succinamic +succinamide +succinanil +succinate +succinct +succinctly +succinctness +succinctorium +succinctory +succincture +succinic +succiniferous +succinimide +succinite +succinoresinol +succinosulphuric +succinous +succinyl +Succisa +succise +succivorous +succor +succorable +succorer +succorful +succorless +succorrhea +succory +succotash +succourful +succourless +succous +succub +succuba +succubae +succube +succubine +succubous +succubus +succula +succulence +succulency +succulent +succulently +succulentness +succulous +succumb +succumbence +succumbency +succumbent +succumber +succursal +succuss +succussation +succussatory +succussion +succussive +such +suchlike +suchness +Suchos +suchwise +sucivilized +suck +suckable +suckabob +suckage +suckauhock +sucken +suckener +sucker +suckerel +suckerfish +suckerlike +suckfish +suckhole +sucking +suckle +suckler +suckless +suckling +suckstone +suclat +sucramine +sucrate +sucre +sucroacid +sucrose +suction +suctional +Suctoria +suctorial +suctorian +suctorious +sucupira +sucuri +sucuriu +sucuruju +sud +sudadero +sudamen +sudamina +sudaminal +Sudan +Sudanese +Sudani +Sudanian +Sudanic +sudarium +sudary +sudate +sudation +sudatorium +sudatory +Sudburian +sudburite +sudd +sudden +suddenly +suddenness +suddenty +Sudder +sudder +suddle +suddy +Sudic +sudiform +sudoral +sudoresis +sudoric +sudoriferous +sudoriferousness +sudorific +sudoriparous +sudorous +Sudra +suds +sudsman +sudsy +Sue +sue +Suecism +suede +suer +Suerre +Suessiones +suet +suety +Sueve +Suevi +Suevian +Suevic +Sufeism +suff +suffect +suffection +suffer +sufferable +sufferableness +sufferably +sufferance +sufferer +suffering +sufferingly +suffete +suffice +sufficeable +sufficer +sufficiency +sufficient +sufficiently +sufficientness +sufficing +sufficingly +sufficingness +suffiction +suffix +suffixal +suffixation +suffixion +suffixment +sufflaminate +sufflamination +sufflate +sufflation +sufflue +suffocate +suffocating +suffocatingly +suffocation +suffocative +Suffolk +suffragan +suffraganal +suffraganate +suffragancy +suffraganeous +suffragatory +suffrage +suffragette +suffragettism +suffragial +suffragism +suffragist +suffragistic +suffragistically +suffragitis +suffrago +suffrutescent +suffrutex +suffruticose +suffruticous +suffruticulose +suffumigate +suffumigation +suffusable +suffuse +suffused +suffusedly +suffusion +suffusive +Sufi +Sufiism +Sufiistic +Sufism +Sufistic +sugamo +sugan +sugar +sugarberry +sugarbird +sugarbush +sugared +sugarelly +sugarer +sugarhouse +sugariness +sugarless +sugarlike +sugarplum +sugarsweet +sugarworks +sugary +sugent +sugescent +suggest +suggestable +suggestedness +suggester +suggestibility +suggestible +suggestibleness +suggestibly +suggesting +suggestingly +suggestion +suggestionability +suggestionable +suggestionism +suggestionist +suggestionize +suggestive +suggestively +suggestiveness +suggestivity +suggestment +suggestress +suggestum +suggillate +suggillation +sugh +sugi +Sugih +suguaro +suhuaro +Sui +suicidal +suicidalism +suicidally +suicidalwise +suicide +suicidical +suicidism +suicidist +suid +Suidae +suidian +suiform +suilline +suimate +Suina +suine +suing +suingly +suint +Suiogoth +Suiogothic +Suiones +suisimilar +suist +suit +suitability +suitable +suitableness +suitably +suitcase +suite +suithold +suiting +suitor +suitoress +suitorship +suity +suji +Suk +Sukey +sukiyaki +sukkenye +Suku +Sula +Sulaba +Sulafat +Sulaib +sulbasutra +sulcal +sulcalization +sulcalize +sulcar +sulcate +sulcated +sulcation +sulcatoareolate +sulcatocostate +sulcatorimose +sulciform +sulcomarginal +sulcular +sulculate +sulculus +sulcus +suld +sulea +sulfa +sulfacid +sulfadiazine +sulfaguanidine +sulfamate +sulfamerazin +sulfamerazine +sulfamethazine +sulfamethylthiazole +sulfamic +sulfamidate +sulfamide +sulfamidic +sulfamine +sulfaminic +sulfamyl +sulfanilamide +sulfanilic +sulfanilylguanidine +sulfantimonide +sulfapyrazine +sulfapyridine +sulfaquinoxaline +sulfarsenide +sulfarsenite +sulfarseniuret +sulfarsphenamine +Sulfasuxidine +sulfatase +sulfathiazole +sulfatic +sulfatize +sulfato +sulfazide +sulfhydrate +sulfhydric +sulfhydryl +sulfindigotate +sulfindigotic +sulfindylic +sulfion +sulfionide +sulfoacid +sulfoamide +sulfobenzide +sulfobenzoate +sulfobenzoic +sulfobismuthite +sulfoborite +sulfocarbamide +sulfocarbimide +sulfocarbolate +sulfocarbolic +sulfochloride +sulfocyan +sulfocyanide +sulfofication +sulfogermanate +sulfohalite +sulfohydrate +sulfoindigotate +sulfoleic +sulfolysis +sulfomethylic +sulfonamic +sulfonamide +sulfonate +sulfonation +sulfonator +sulfonephthalein +sulfonethylmethane +sulfonic +sulfonium +sulfonmethane +sulfonyl +sulfophthalein +sulfopurpurate +sulfopurpuric +sulforicinate +sulforicinic +sulforicinoleate +sulforicinoleic +sulfoselenide +sulfosilicide +sulfostannide +sulfotelluride +sulfourea +sulfovinate +sulfovinic +sulfowolframic +sulfoxide +sulfoxism +sulfoxylate +sulfoxylic +sulfurage +sulfuran +sulfurate +sulfuration +sulfurator +sulfurea +sulfureous +sulfureously +sulfureousness +sulfuret +sulfuric +sulfurization +sulfurize +sulfurosyl +sulfurous +sulfury +sulfuryl +Sulidae +Sulides +Suliote +sulk +sulka +sulker +sulkily +sulkiness +sulky +sulkylike +sull +sulla +sullage +Sullan +sullen +sullenhearted +sullenly +sullenness +sulliable +sullow +sully +sulpha +sulphacid +sulphaldehyde +sulphamate +sulphamic +sulphamidate +sulphamide +sulphamidic +sulphamine +sulphaminic +sulphamino +sulphammonium +sulphamyl +sulphanilate +sulphanilic +sulphantimonate +sulphantimonial +sulphantimonic +sulphantimonide +sulphantimonious +sulphantimonite +sulpharsenate +sulpharseniate +sulpharsenic +sulpharsenide +sulpharsenious +sulpharsenite +sulpharseniuret +sulpharsphenamine +sulphatase +sulphate +sulphated +sulphatic +sulphation +sulphatization +sulphatize +sulphato +sulphatoacetic +sulphatocarbonic +sulphazide +sulphazotize +sulphbismuthite +sulphethylate +sulphethylic +sulphhemoglobin +sulphichthyolate +sulphidation +sulphide +sulphidic +sulphidize +sulphimide +sulphinate +sulphindigotate +sulphine +sulphinic +sulphinide +sulphinyl +sulphitation +sulphite +sulphitic +sulphmethemoglobin +sulpho +sulphoacetic +sulphoamid +sulphoamide +sulphoantimonate +sulphoantimonic +sulphoantimonious +sulphoantimonite +sulphoarsenic +sulphoarsenious +sulphoarsenite +sulphoazotize +sulphobenzide +sulphobenzoate +sulphobenzoic +sulphobismuthite +sulphoborite +sulphobutyric +sulphocarbamic +sulphocarbamide +sulphocarbanilide +sulphocarbimide +sulphocarbolate +sulphocarbolic +sulphocarbonate +sulphocarbonic +sulphochloride +sulphochromic +sulphocinnamic +sulphocyan +sulphocyanate +sulphocyanic +sulphocyanide +sulphocyanogen +sulphodichloramine +sulphofication +sulphofy +sulphogallic +sulphogel +sulphogermanate +sulphogermanic +sulphohalite +sulphohaloid +sulphohydrate +sulphoichthyolate +sulphoichthyolic +sulphoindigotate +sulphoindigotic +sulpholeate +sulpholeic +sulpholipin +sulpholysis +sulphonal +sulphonalism +sulphonamic +sulphonamide +sulphonamido +sulphonamine +sulphonaphthoic +sulphonate +sulphonated +sulphonation +sulphonator +sulphoncyanine +sulphone +sulphonephthalein +sulphonethylmethane +sulphonic +sulphonium +sulphonmethane +sulphonphthalein +sulphonyl +sulphoparaldehyde +sulphophosphate +sulphophosphite +sulphophosphoric +sulphophosphorous +sulphophthalein +sulphophthalic +sulphopropionic +sulphoproteid +sulphopupuric +sulphopurpurate +sulphoricinate +sulphoricinic +sulphoricinoleate +sulphoricinoleic +sulphosalicylic +sulphoselenide +sulphoselenium +sulphosilicide +sulphosol +sulphostannate +sulphostannic +sulphostannide +sulphostannite +sulphostannous +sulphosuccinic +sulphosulphurous +sulphotannic +sulphotelluride +sulphoterephthalic +sulphothionyl +sulphotoluic +sulphotungstate +sulphotungstic +sulphourea +sulphovanadate +sulphovinate +sulphovinic +sulphowolframic +sulphoxide +sulphoxism +sulphoxylate +sulphoxylic +sulphoxyphosphate +sulphozincate +sulphur +sulphurage +sulphuran +sulphurate +sulphuration +sulphurator +sulphurea +sulphurean +sulphureity +sulphureonitrous +sulphureosaline +sulphureosuffused +sulphureous +sulphureously +sulphureousness +sulphureovirescent +sulphuret +sulphureted +sulphuric +sulphuriferous +sulphurity +sulphurization +sulphurize +sulphurless +sulphurlike +sulphurosyl +sulphurous +sulphurously +sulphurousness +sulphurproof +sulphurweed +sulphurwort +sulphury +sulphuryl +sulphydrate +sulphydric +sulphydryl +Sulpician +sultam +sultan +sultana +sultanaship +sultanate +sultane +sultanesque +sultaness +sultanian +sultanic +sultanin +sultanism +sultanist +sultanize +sultanlike +sultanry +sultanship +sultone +sultrily +sultriness +sultry +Sulu +Suluan +sulung +sulvanite +sulvasutra +sum +sumac +Sumak +Sumass +Sumatra +sumatra +Sumatran +sumbul +sumbulic +Sumdum +Sumerian +Sumerology +Sumitro +sumless +sumlessness +summability +summable +summage +summand +summar +summarily +summariness +summarist +summarization +summarize +summarizer +summary +summate +summation +summational +summative +summatory +summed +summer +summerbird +summercastle +summerer +summerhead +summeriness +summering +summerings +summerish +summerite +summerize +summerland +summerlay +summerless +summerlike +summerliness +summerling +summerly +summerproof +summertide +summertime +summertree +summerward +summerwood +summery +summist +summit +summital +summitless +summity +summon +summonable +summoner +summoningly +summons +summula +summulist +summut +sumner +Sumo +sump +sumpage +sumper +sumph +sumphish +sumphishly +sumphishness +sumphy +sumpit +sumpitan +sumple +sumpman +sumpsimus +sumpter +sumption +sumptuary +sumptuosity +sumptuous +sumptuously +sumptuousness +sun +sunbeam +sunbeamed +sunbeamy +sunberry +sunbird +sunblink +sunbonnet +sunbonneted +sunbow +sunbreak +sunburn +sunburned +sunburnedness +sunburnproof +sunburnt +sunburntness +sunburst +suncherchor +suncup +sundae +Sundanese +Sundanesian +sundang +Sundar +Sundaresan +sundari +Sunday +Sundayfied +Sundayish +Sundayism +Sundaylike +Sundayness +Sundayproof +sundek +sunder +sunderable +sunderance +sunderer +sunderment +sunderwise +sundew +sundial +sundik +sundog +sundown +sundowner +sundowning +sundra +sundri +sundries +sundriesman +sundrily +sundriness +sundrops +sundry +sundryman +sune +sunfall +sunfast +sunfish +sunfisher +sunfishery +sunflower +Sung +sung +sungha +sunglade +sunglass +sunglo +sunglow +Sunil +sunk +sunken +sunket +sunkland +sunlamp +sunland +sunless +sunlessly +sunlessness +sunlet +sunlight +sunlighted +sunlike +sunlit +sunn +Sunna +Sunni +Sunniah +sunnily +sunniness +Sunnism +Sunnite +sunnud +sunny +sunnyhearted +sunnyheartedness +sunproof +sunquake +sunray +sunrise +sunrising +sunroom +sunscald +sunset +sunsetting +sunsetty +sunshade +sunshine +sunshineless +sunshining +sunshiny +sunsmit +sunsmitten +sunspot +sunspotted +sunspottedness +sunspottery +sunspotty +sunsquall +sunstone +sunstricken +sunstroke +sunt +sunup +sunward +sunwards +sunway +sunways +sunweed +sunwise +sunyie +Suomi +Suomic +suovetaurilia +sup +supa +Supai +supari +supawn +supe +supellex +super +superabduction +superabhor +superability +superable +superableness +superably +superabnormal +superabominable +superabomination +superabound +superabstract +superabsurd +superabundance +superabundancy +superabundant +superabundantly +superaccession +superaccessory +superaccommodating +superaccomplished +superaccrue +superaccumulate +superaccumulation +superaccurate +superacetate +superachievement +superacid +superacidulated +superacknowledgment +superacquisition +superacromial +superactive +superactivity +superacute +superadaptable +superadd +superaddition +superadditional +superadequate +superadequately +superadjacent +superadministration +superadmirable +superadmiration +superadorn +superadornment +superaerial +superaesthetical +superaffiliation +superaffiuence +superagency +superaggravation +superagitation +superagrarian +superalbal +superalbuminosis +superalimentation +superalkaline +superalkalinity +superallowance +superaltar +superaltern +superambitious +superambulacral +superanal +superangelic +superangelical +superanimal +superannuate +superannuation +superannuitant +superannuity +superapology +superappreciation +superaqueous +superarbiter +superarbitrary +superarctic +superarduous +superarrogant +superarseniate +superartificial +superartificially +superaspiration +superassertion +superassociate +superassume +superastonish +superastonishment +superattachment +superattainable +superattendant +superattraction +superattractive +superauditor +superaural +superaverage +superavit +superaward +superaxillary +superazotation +superb +superbelief +superbeloved +superbenefit +superbenevolent +superbenign +superbias +superbious +superbity +superblessed +superblunder +superbly +superbness +superbold +superborrow +superbrain +superbrave +superbrute +superbuild +superbungalow +superbusy +supercabinet +supercalender +supercallosal +supercandid +supercanine +supercanonical +supercanonization +supercanopy +supercapable +supercaption +supercarbonate +supercarbonization +supercarbonize +supercarbureted +supercargo +supercargoship +supercarpal +supercatastrophe +supercatholic +supercausal +supercaution +supercelestial +supercensure +supercentral +supercentrifuge +supercerebellar +supercerebral +superceremonious +supercharge +supercharged +supercharger +superchemical +superchivalrous +superciliary +superciliosity +supercilious +superciliously +superciliousness +supercilium +supercivil +supercivilization +supercivilized +superclaim +superclass +superclassified +supercloth +supercoincidence +supercolossal +supercolumnar +supercolumniation +supercombination +supercombing +supercommendation +supercommentary +supercommentator +supercommercial +supercompetition +supercomplete +supercomplex +supercomprehension +supercompression +superconception +superconductive +superconductivity +superconductor +superconfident +superconfirmation +superconformable +superconformist +superconformity +superconfusion +supercongestion +superconscious +superconsciousness +superconsecrated +superconsequency +superconservative +superconstitutional +supercontest +supercontribution +supercontrol +supercool +supercordial +supercorporation +supercow +supercredit +supercrescence +supercrescent +supercrime +supercritic +supercritical +supercrowned +supercrust +supercube +supercultivated +supercurious +supercycle +supercynical +superdainty +superdanger +superdebt +superdeclamatory +superdecoration +superdeficit +superdeity +superdejection +superdelegate +superdelicate +superdemand +superdemocratic +superdemonic +superdemonstration +superdensity +superdeposit +superdesirous +superdevelopment +superdevilish +superdevotion +superdiabolical +superdiabolically +superdicrotic +superdifficult +superdiplomacy +superdirection +superdiscount +superdistention +superdistribution +superdividend +superdivine +superdivision +superdoctor +superdominant +superdomineering +superdonation +superdose +superdramatist +superdreadnought +superdubious +superduplication +superdural +superdying +superearthly +supereconomy +superedification +superedify +supereducation +supereffective +supereffluence +supereffluently +superego +superelaborate +superelastic +superelated +superelegance +superelementary +superelevated +superelevation +supereligible +supereloquent +supereminence +supereminency +supereminent +supereminently +superemphasis +superemphasize +superendorse +superendorsement +superendow +superenergetic +superenforcement +superengrave +superenrollment +superepic +superepoch +superequivalent +supererogant +supererogantly +supererogate +supererogation +supererogative +supererogator +supererogatorily +supererogatory +superespecial +superessential +superessentially +superestablish +superestablishment +supereternity +superether +superethical +superethmoidal +superevangelical +superevident +superexacting +superexalt +superexaltation +superexaminer +superexceed +superexceeding +superexcellence +superexcellency +superexcellent +superexcellently +superexceptional +superexcitation +superexcited +superexcitement +superexcrescence +superexert +superexertion +superexiguity +superexist +superexistent +superexpand +superexpansion +superexpectation +superexpenditure +superexplicit +superexport +superexpressive +superexquisite +superexquisitely +superexquisiteness +superextend +superextension +superextol +superextreme +superfamily +superfantastic +superfarm +superfat +superfecundation +superfecundity +superfee +superfeminine +superfervent +superfetate +superfetation +superfeudation +superfibrination +superficial +superficialism +superficialist +superficiality +superficialize +superficially +superficialness +superficiary +superficies +superfidel +superfinance +superfine +superfinical +superfinish +superfinite +superfissure +superfit +superfix +superfleet +superflexion +superfluent +superfluid +superfluitance +superfluity +superfluous +superfluously +superfluousness +superflux +superfoliaceous +superfoliation +superfolly +superformal +superformation +superformidable +superfortunate +superfriendly +superfrontal +superfructified +superfulfill +superfulfillment +superfunction +superfunctional +superfuse +superfusibility +superfusible +superfusion +supergaiety +supergallant +supergene +supergeneric +supergenerosity +supergenerous +supergenual +supergiant +superglacial +superglorious +superglottal +supergoddess +supergoodness +supergovern +supergovernment +supergraduate +supergrant +supergratification +supergratify +supergravitate +supergravitation +superguarantee +supergun +superhandsome +superhearty +superheat +superheater +superheresy +superhero +superheroic +superhet +superheterodyne +superhighway +superhirudine +superhistoric +superhistorical +superhive +superhuman +superhumanity +superhumanize +superhumanly +superhumanness +superhumeral +superhypocrite +superideal +superignorant +superillustrate +superillustration +superimpend +superimpending +superimpersonal +superimply +superimportant +superimposable +superimpose +superimposed +superimposition +superimposure +superimpregnated +superimpregnation +superimprobable +superimproved +superincentive +superinclination +superinclusive +superincomprehensible +superincrease +superincumbence +superincumbency +superincumbent +superincumbently +superindependent +superindiction +superindifference +superindifferent +superindignant +superindividual +superindividualism +superindividualist +superinduce +superinducement +superinduct +superinduction +superindulgence +superindulgent +superindustrious +superindustry +superinenarrable +superinfection +superinfer +superinference +superinfeudation +superinfinite +superinfinitely +superinfirmity +superinfluence +superinformal +superinfuse +superinfusion +superingenious +superingenuity +superinitiative +superinjustice +superinnocent +superinquisitive +superinsaniated +superinscription +superinsist +superinsistence +superinsistent +superinstitute +superinstitution +superintellectual +superintend +superintendence +superintendency +superintendent +superintendential +superintendentship +superintender +superintense +superintolerable +superinundation +superior +superioress +superiority +superiorly +superiorness +superiorship +superirritability +superius +superjacent +superjudicial +superjurisdiction +superjustification +superknowledge +superlabial +superlaborious +superlactation +superlapsarian +superlaryngeal +superlation +superlative +superlatively +superlativeness +superlenient +superlie +superlikelihood +superline +superlocal +superlogical +superloyal +superlucky +superlunary +superlunatical +superluxurious +supermagnificent +supermagnificently +supermalate +superman +supermanhood +supermanifest +supermanism +supermanliness +supermanly +supermannish +supermarginal +supermarine +supermarket +supermarvelous +supermasculine +supermaterial +supermathematical +supermaxilla +supermaxillary +supermechanical +supermedial +supermedicine +supermediocre +supermental +supermentality +supermetropolitan +supermilitary +supermishap +supermixture +supermodest +supermoisten +supermolten +supermoral +supermorose +supermunicipal +supermuscan +supermystery +supernacular +supernaculum +supernal +supernalize +supernally +supernatant +supernatation +supernation +supernational +supernationalism +supernatural +supernaturaldom +supernaturalism +supernaturalist +supernaturality +supernaturalize +supernaturally +supernaturalness +supernature +supernecessity +supernegligent +supernormal +supernormally +supernormalness +supernotable +supernova +supernumeral +supernumerariness +supernumerary +supernumeraryship +supernumerous +supernutrition +superoanterior +superobedience +superobedient +superobese +superobject +superobjection +superobjectionable +superobligation +superobstinate +superoccipital +superoctave +superocular +superodorsal +superoexternal +superoffensive +superofficious +superofficiousness +superofrontal +superointernal +superolateral +superomedial +superoposterior +superopposition +superoptimal +superoptimist +superoratorical +superorbital +superordain +superorder +superordinal +superordinary +superordinate +superordination +superorganic +superorganism +superorganization +superorganize +superornament +superornamental +superosculate +superoutput +superoxalate +superoxide +superoxygenate +superoxygenation +superparamount +superparasite +superparasitic +superparasitism +superparliamentary +superpassage +superpatient +superpatriotic +superpatriotism +superperfect +superperfection +superperson +superpersonal +superpersonalism +superpetrosal +superphlogisticate +superphlogistication +superphosphate +superphysical +superpigmentation +superpious +superplausible +superplease +superplus +superpolite +superpolitic +superponderance +superponderancy +superponderant +superpopulation +superposable +superpose +superposed +superposition +superpositive +superpower +superpowered +superpraise +superprecarious +superprecise +superprelatical +superpreparation +superprinting +superprobability +superproduce +superproduction +superproportion +superprosperous +superpublicity +superpure +superpurgation +superquadrupetal +superqualify +superquote +superradical +superrational +superrationally +superreaction +superrealism +superrealist +superrefine +superrefined +superrefinement +superreflection +superreform +superreformation +superregal +superregeneration +superregenerative +superregistration +superregulation +superreliance +superremuneration +superrenal +superrequirement +superrespectable +superresponsible +superrestriction +superreward +superrheumatized +superrighteous +superromantic +superroyal +supersacerdotal +supersacral +supersacred +supersacrifice +supersafe +supersagacious +supersaint +supersaintly +supersalesman +supersaliency +supersalient +supersalt +supersanction +supersanguine +supersanity +supersarcastic +supersatisfaction +supersatisfy +supersaturate +supersaturation +superscandal +superscholarly +superscientific +superscribe +superscript +superscription +superscrive +superseaman +supersecret +supersecretion +supersecular +supersecure +supersedable +supersede +supersedeas +supersedence +superseder +supersedure +superselect +superseminate +supersemination +superseminator +supersensible +supersensibly +supersensitive +supersensitiveness +supersensitization +supersensory +supersensual +supersensualism +supersensualist +supersensualistic +supersensuality +supersensually +supersensuous +supersensuousness +supersentimental +superseptal +superseptuaginarian +superseraphical +superserious +superservice +superserviceable +superserviceableness +superserviceably +supersesquitertial +supersession +supersessive +supersevere +supershipment +supersignificant +supersilent +supersimplicity +supersimplify +supersincerity +supersingular +supersistent +supersize +supersmart +supersocial +supersoil +supersolar +supersolemn +supersolemness +supersolemnity +supersolemnly +supersolicit +supersolicitation +supersolid +supersonant +supersonic +supersovereign +supersovereignty +superspecialize +superspecies +superspecification +supersphenoid +supersphenoidal +superspinous +superspiritual +superspirituality +supersquamosal +superstage +superstamp +superstandard +superstate +superstatesman +superstimulate +superstimulation +superstition +superstitionist +superstitionless +superstitious +superstitiously +superstitiousness +superstoical +superstrain +superstrata +superstratum +superstrenuous +superstrict +superstrong +superstruct +superstruction +superstructor +superstructory +superstructural +superstructure +superstuff +superstylish +supersublimated +supersuborder +supersubsist +supersubstantial +supersubstantiality +supersubstantiate +supersubtilized +supersubtle +supersufficiency +supersufficient +supersulcus +supersulphate +supersulphuret +supersulphureted +supersulphurize +supersuperabundance +supersuperabundant +supersuperabundantly +supersuperb +supersuperior +supersupremacy +supersupreme +supersurprise +supersuspicious +supersweet +supersympathy +supersyndicate +supersystem +supertare +supertartrate +supertax +supertaxation +supertemporal +supertempt +supertemptation +supertension +superterranean +superterraneous +superterrene +superterrestrial +superthankful +superthorough +superthyroidism +supertoleration +supertonic +supertotal +supertower +supertragic +supertragical +supertrain +supertramp +supertranscendent +supertranscendently +supertreason +supertrivial +supertuchun +supertunic +supertutelary +superugly +superultrafrostified +superunfit +superunit +superunity +superuniversal +superuniverse +superurgent +supervalue +supervast +supervene +supervenience +supervenient +supervenosity +supervention +supervestment +supervexation +supervictorious +supervigilant +supervigorous +supervirulent +supervisal +supervisance +supervise +supervision +supervisionary +supervisive +supervisor +supervisorial +supervisorship +supervisory +supervisual +supervisure +supervital +supervive +supervolition +supervoluminous +supervolute +superwager +superwealthy +superweening +superwise +superwoman +superworldly +superwrought +superyacht +superzealous +supinate +supination +supinator +supine +supinely +supineness +suppedaneum +supper +suppering +supperless +suppertime +supperwards +supping +supplace +supplant +supplantation +supplanter +supplantment +supple +supplejack +supplely +supplement +supplemental +supplementally +supplementarily +supplementary +supplementation +supplementer +suppleness +suppletion +suppletive +suppletively +suppletorily +suppletory +suppliable +supplial +suppliance +suppliancy +suppliant +suppliantly +suppliantness +supplicancy +supplicant +supplicantly +supplicat +supplicate +supplicating +supplicatingly +supplication +supplicationer +supplicative +supplicator +supplicatory +supplicavit +supplice +supplier +suppling +supply +support +supportability +supportable +supportableness +supportably +supportance +supporter +supportful +supporting +supportingly +supportive +supportless +supportlessly +supportress +supposable +supposableness +supposably +supposal +suppose +supposed +supposedly +supposer +supposing +supposition +suppositional +suppositionally +suppositionary +suppositionless +suppositious +supposititious +supposititiously +supposititiousness +suppositive +suppositively +suppository +suppositum +suppost +suppress +suppressal +suppressed +suppressedly +suppresser +suppressible +suppression +suppressionist +suppressive +suppressively +suppressor +supprise +suppurant +suppurate +suppuration +suppurative +suppuratory +suprabasidorsal +suprabranchial +suprabuccal +supracaecal +supracargo +supracaudal +supracensorious +supracentenarian +suprachorioid +suprachorioidal +suprachorioidea +suprachoroid +suprachoroidal +suprachoroidea +supraciliary +supraclavicle +supraclavicular +supraclusion +supracommissure +supraconduction +supraconductor +supracondylar +supracondyloid +supraconscious +supraconsciousness +supracoralline +supracostal +supracoxal +supracranial +supracretaceous +supradecompound +supradental +supradorsal +supradural +suprafeminine +suprafine +suprafoliaceous +suprafoliar +supraglacial +supraglenoid +supraglottic +supragovernmental +suprahepatic +suprahistorical +suprahuman +suprahumanity +suprahyoid +suprailiac +suprailium +supraintellectual +suprainterdorsal +suprajural +supralabial +supralapsarian +supralapsarianism +supralateral +supralegal +supraliminal +supraliminally +supralineal +supralinear +supralocal +supralocally +supraloral +supralunar +supralunary +supramammary +supramarginal +supramarine +supramastoid +supramaxilla +supramaxillary +supramaximal +suprameatal +supramechanical +supramedial +supramental +supramolecular +supramoral +supramortal +supramundane +supranasal +supranational +supranatural +supranaturalism +supranaturalist +supranaturalistic +supranature +supranervian +supraneural +supranormal +supranuclear +supraoccipital +supraocclusion +supraocular +supraoesophagal +supraoesophageal +supraoptimal +supraoptional +supraoral +supraorbital +supraorbitar +supraordinary +supraordinate +supraordination +suprapapillary +suprapedal +suprapharyngeal +supraposition +supraprotest +suprapubian +suprapubic +suprapygal +supraquantivalence +supraquantivalent +suprarational +suprarationalism +suprarationality +suprarenal +suprarenalectomize +suprarenalectomy +suprarenalin +suprarenine +suprarimal +suprasaturate +suprascapula +suprascapular +suprascapulary +suprascript +suprasegmental +suprasensible +suprasensitive +suprasensual +suprasensuous +supraseptal +suprasolar +suprasoriferous +suprasphanoidal +supraspinal +supraspinate +supraspinatus +supraspinous +suprasquamosal +suprastandard +suprastapedial +suprastate +suprasternal +suprastigmal +suprasubtle +supratemporal +supraterraneous +supraterrestrial +suprathoracic +supratonsillar +supratrochlear +supratropical +supratympanic +supravaginal +supraventricular +supraversion +supravital +supraworld +supremacy +suprematism +supreme +supremely +supremeness +supremity +sur +sura +suraddition +surah +surahi +sural +suralimentation +suranal +surangular +surat +surbase +surbased +surbasement +surbate +surbater +surbed +surcease +surcharge +surcharger +surcingle +surcoat +surcrue +surculi +surculigerous +surculose +surculous +surculus +surd +surdation +surdeline +surdent +surdimutism +surdity +surdomute +sure +surely +sureness +sures +Suresh +surette +surety +suretyship +surexcitation +surf +surface +surfaced +surfacedly +surfaceless +surfacely +surfaceman +surfacer +surfacing +surfactant +surfacy +surfbird +surfboard +surfboarding +surfboat +surfboatman +surfeit +surfeiter +surfer +surficial +surfle +surflike +surfman +surfmanship +surfrappe +surfuse +surfusion +surfy +surge +surgeful +surgeless +surgent +surgeon +surgeoncy +surgeoness +surgeonfish +surgeonless +surgeonship +surgeproof +surgerize +surgery +surgical +surgically +surginess +surging +surgy +Suriana +Surianaceae +Suricata +suricate +suriga +Surinam +surinamine +surlily +surliness +surly +surma +surmark +surmaster +surmisable +surmisal +surmisant +surmise +surmised +surmisedly +surmiser +surmount +surmountable +surmountableness +surmountal +surmounted +surmounter +surmullet +surname +surnamer +surnap +surnay +surnominal +surpass +surpassable +surpasser +surpassing +surpassingly +surpassingness +surpeopled +surplice +surpliced +surplicewise +surplician +surplus +surplusage +surpreciation +surprint +surprisable +surprisal +surprise +surprisedly +surprisement +surpriseproof +surpriser +surprising +surprisingly +surprisingness +surquedry +surquidry +surquidy +surra +surrealism +surrealist +surrealistic +surrealistically +surrebound +surrebut +surrebuttal +surrebutter +surrection +surrejoin +surrejoinder +surrenal +surrender +surrenderee +surrenderer +surrenderor +surreption +surreptitious +surreptitiously +surreptitiousness +surreverence +surreverently +surrey +surrogacy +surrogate +surrogateship +surrogation +surrosion +surround +surrounded +surroundedly +surrounder +surrounding +surroundings +sursaturation +sursolid +sursumduction +sursumvergence +sursumversion +surtax +surtout +surturbrand +surveillance +surveillant +survey +surveyable +surveyage +surveyal +surveyance +surveying +surveyor +surveyorship +survigrous +survivability +survivable +survival +survivalism +survivalist +survivance +survivancy +survive +surviver +surviving +survivor +survivoress +survivorship +Surya +Sus +Susan +Susanchite +Susanna +Susanne +susannite +suscept +susceptance +susceptibility +susceptible +susceptibleness +susceptibly +susception +susceptive +susceptiveness +susceptivity +susceptor +suscitate +suscitation +susi +Susian +Susianian +Susie +suslik +susotoxin +suspect +suspectable +suspected +suspectedness +suspecter +suspectful +suspectfulness +suspectible +suspectless +suspector +suspend +suspended +suspender +suspenderless +suspenders +suspendibility +suspendible +suspensation +suspense +suspenseful +suspensely +suspensibility +suspensible +suspension +suspensive +suspensively +suspensiveness +suspensoid +suspensor +suspensorial +suspensorium +suspensory +suspercollate +suspicion +suspicionable +suspicional +suspicionful +suspicionless +suspicious +suspiciously +suspiciousness +suspiration +suspiratious +suspirative +suspire +suspirious +Susquehanna +Sussex +sussexite +Sussexman +sussultatory +sussultorial +sustain +sustainable +sustained +sustainer +sustaining +sustainingly +sustainment +sustanedly +sustenance +sustenanceless +sustentacula +sustentacular +sustentaculum +sustentation +sustentational +sustentative +sustentator +sustention +sustentive +sustentor +Susu +susu +Susuhunan +Susuidae +Susumu +susurr +susurrant +susurrate +susurration +susurringly +susurrous +susurrus +Sutaio +suterbery +suther +Sutherlandia +sutile +sutler +sutlerage +sutleress +sutlership +sutlery +Suto +sutor +sutorial +sutorian +sutorious +sutra +Suttapitaka +suttee +sutteeism +sutten +suttin +suttle +Sutu +sutural +suturally +suturation +suture +Suu +suum +Suwandi +suwarro +suwe +Suyog +suz +Suzan +Suzanne +suzerain +suzeraine +suzerainship +suzerainty +Suzy +Svan +Svanetian +Svanish +Svante +Svantovit +svarabhakti +svarabhaktic +Svarloka +svelte +Svetambara +sviatonosite +swa +Swab +swab +swabber +swabberly +swabble +Swabian +swack +swacken +swacking +swad +swaddle +swaddlebill +swaddler +swaddling +swaddy +Swadeshi +Swadeshism +swag +swagbellied +swagbelly +swage +swager +swagger +swaggerer +swaggering +swaggeringly +swaggie +swaggy +swaglike +swagman +swagsman +Swahilese +Swahili +Swahilian +Swahilize +swaimous +swain +swainish +swainishness +swainship +Swainsona +swainsona +swaird +swale +swaler +swaling +swalingly +swallet +swallo +swallow +swallowable +swallower +swallowlike +swallowling +swallowpipe +swallowtail +swallowwort +swam +swami +swamp +swampable +swampberry +swamper +swampish +swampishness +swampland +swampside +swampweed +swampwood +swampy +Swamy +swan +swandown +swanflower +swang +swangy +swanherd +swanhood +swanimote +swank +swanker +swankily +swankiness +swanking +swanky +swanlike +swanmark +swanmarker +swanmarking +swanneck +swannecked +swanner +swannery +swannish +swanny +swanskin +Swantevit +swanweed +swanwort +swap +swape +swapper +swapping +swaraj +swarajism +swarajist +swarbie +sward +swardy +sware +swarf +swarfer +swarm +swarmer +swarming +swarmy +swarry +swart +swartback +swarth +swarthily +swarthiness +swarthness +swarthy +swartish +swartly +swartness +swartrutter +swartrutting +swarty +Swartzbois +Swartzia +swarve +swash +swashbuckle +swashbuckler +swashbucklerdom +swashbucklering +swashbucklery +swashbuckling +swasher +swashing +swashway +swashwork +swashy +swastika +swastikaed +Swat +swat +swatch +Swatchel +swatcher +swatchway +swath +swathable +swathband +swathe +swatheable +swather +swathy +Swati +Swatow +swatter +swattle +swaver +sway +swayable +swayed +swayer +swayful +swaying +swayingly +swayless +Swazi +Swaziland +sweal +sweamish +swear +swearer +swearingly +swearword +sweat +sweatband +sweatbox +sweated +sweater +sweatful +sweath +sweatily +sweatiness +sweating +sweatless +sweatproof +sweatshop +sweatweed +sweaty +Swede +Swedenborgian +Swedenborgianism +Swedenborgism +swedge +Swedish +sweeny +sweep +sweepable +sweepage +sweepback +sweepboard +sweepdom +sweeper +sweeperess +sweepforward +sweeping +sweepingly +sweepingness +sweepings +sweepstake +sweepwasher +sweepwashings +sweepy +sweer +sweered +sweet +sweetberry +sweetbread +sweetbrier +sweetbriery +sweeten +sweetener +sweetening +sweetfish +sweetful +sweetheart +sweetheartdom +sweethearted +sweetheartedness +sweethearting +sweetheartship +sweetie +sweeting +sweetish +sweetishly +sweetishness +sweetleaf +sweetless +sweetlike +sweetling +sweetly +sweetmaker +sweetmeat +sweetmouthed +sweetness +sweetroot +sweetshop +sweetsome +sweetsop +sweetwater +sweetweed +sweetwood +sweetwort +sweety +swego +swelchie +swell +swellage +swelldom +swelldoodle +swelled +sweller +swellfish +swelling +swellish +swellishness +swellmobsman +swellness +swelltoad +swelly +swelp +swelt +swelter +sweltering +swelteringly +swelth +sweltry +swelty +swep +swept +swerd +Swertia +swerve +swerveless +swerver +swervily +swick +swidge +Swietenia +swift +swiften +swifter +swiftfoot +swiftlet +swiftlike +swiftness +swifty +swig +swigger +swiggle +swile +swill +swillbowl +swiller +swilltub +swim +swimmable +swimmer +swimmeret +swimmily +swimminess +swimming +swimmingly +swimmingness +swimmist +swimmy +swimsuit +swimy +Swinburnesque +Swinburnian +swindle +swindleable +swindledom +swindler +swindlership +swindlery +swindling +swindlingly +swine +swinebread +swinecote +swinehead +swineherd +swineherdship +swinehood +swinehull +swinelike +swinely +swinepipe +swinery +swinestone +swinesty +swiney +swing +swingable +swingback +swingdevil +swingdingle +swinge +swingeing +swinger +swinging +swingingly +Swingism +swingle +swinglebar +swingletail +swingletree +swingstock +swingtree +swingy +swinish +swinishly +swinishness +swink +swinney +swipe +swiper +swipes +swiple +swipper +swipy +swird +swire +swirl +swirlingly +swirly +swirring +swish +swisher +swishing +swishingly +swishy +Swiss +swiss +Swissess +swissing +switch +switchback +switchbacker +switchboard +switched +switchel +switcher +switchgear +switching +switchkeeper +switchlike +switchman +switchy +switchyard +swith +swithe +swithen +swither +Swithin +Switzer +Switzeress +swivel +swiveled +swiveleye +swiveleyed +swivellike +swivet +swivetty +swiz +swizzle +swizzler +swob +swollen +swollenly +swollenness +swom +swonken +swoon +swooned +swooning +swooningly +swoony +swoop +swooper +swoosh +sword +swordbill +swordcraft +swordfish +swordfisherman +swordfishery +swordfishing +swordick +swording +swordless +swordlet +swordlike +swordmaker +swordmaking +swordman +swordmanship +swordplay +swordplayer +swordproof +swordsman +swordsmanship +swordsmith +swordster +swordstick +swordswoman +swordtail +swordweed +swore +sworn +swosh +swot +swotter +swounds +swow +swum +swung +swungen +swure +syagush +sybarism +sybarist +Sybarital +Sybaritan +Sybarite +Sybaritic +Sybaritical +Sybaritically +Sybaritish +sybaritism +Sybil +sybotic +sybotism +sycamine +sycamore +syce +sycee +sychnocarpous +sycock +sycoma +sycomancy +Sycon +Syconaria +syconarian +syconate +Sycones +syconid +Syconidae +syconium +syconoid +syconus +sycophancy +sycophant +sycophantic +sycophantical +sycophantically +sycophantish +sycophantishly +sycophantism +sycophantize +sycophantry +sycosiform +sycosis +Syd +Sydneian +Sydneyite +sye +Syed +syenite +syenitic +syenodiorite +syenogabbro +sylid +syllab +syllabarium +syllabary +syllabatim +syllabation +syllabe +syllabi +syllabic +syllabical +syllabically +syllabicate +syllabication +syllabicness +syllabification +syllabify +syllabism +syllabize +syllable +syllabled +syllabus +syllepsis +sylleptic +sylleptical +sylleptically +Syllidae +syllidian +Syllis +sylloge +syllogism +syllogist +syllogistic +syllogistical +syllogistically +syllogistics +syllogization +syllogize +syllogizer +sylph +sylphic +sylphid +sylphidine +sylphish +sylphize +sylphlike +Sylphon +sylphy +sylva +sylvae +sylvage +Sylvan +sylvan +sylvanesque +sylvanite +sylvanitic +sylvanity +sylvanize +sylvanly +sylvanry +sylvate +sylvatic +Sylvester +sylvester +sylvestral +sylvestrene +Sylvestrian +sylvestrian +Sylvestrine +Sylvia +Sylvian +sylvic +Sylvicolidae +sylvicoline +Sylviidae +Sylviinae +sylviine +sylvine +sylvinite +sylvite +symbasic +symbasical +symbasically +symbasis +symbiogenesis +symbiogenetic +symbiogenetically +symbion +symbiont +symbiontic +symbionticism +symbiosis +symbiot +symbiote +symbiotic +symbiotically +symbiotics +symbiotism +symbiotrophic +symblepharon +symbol +symbolaeography +symbolater +symbolatrous +symbolatry +symbolic +symbolical +symbolically +symbolicalness +symbolicly +symbolics +symbolism +symbolist +symbolistic +symbolistical +symbolistically +symbolization +symbolize +symbolizer +symbolofideism +symbological +symbologist +symbolography +symbology +symbololatry +symbolology +symbolry +symbouleutic +symbranch +Symbranchia +symbranchiate +symbranchoid +symbranchous +symmachy +symmedian +symmelia +symmelian +symmelus +symmetalism +symmetral +symmetric +symmetrical +symmetricality +symmetrically +symmetricalness +symmetrist +symmetrization +symmetrize +symmetroid +symmetrophobia +symmetry +symmorphic +symmorphism +sympalmograph +sympathectomize +sympathectomy +sympathetectomy +sympathetic +sympathetical +sympathetically +sympatheticism +sympatheticity +sympatheticness +sympatheticotonia +sympatheticotonic +sympathetoblast +sympathicoblast +sympathicotonia +sympathicotonic +sympathicotripsy +sympathism +sympathist +sympathize +sympathizer +sympathizing +sympathizingly +sympathoblast +sympatholysis +sympatholytic +sympathomimetic +sympathy +sympatric +sympatry +Sympetalae +sympetalous +Symphalangus +symphenomena +symphenomenal +symphile +symphilic +symphilism +symphilous +symphily +symphogenous +symphonetic +symphonia +symphonic +symphonically +symphonion +symphonious +symphoniously +symphonist +symphonize +symphonous +symphony +Symphoricarpos +symphoricarpous +symphrase +symphronistic +symphyantherous +symphycarpous +Symphyla +symphylan +symphyllous +symphylous +symphynote +symphyogenesis +symphyogenetic +symphyostemonous +symphyseal +symphyseotomy +symphysial +symphysian +symphysic +symphysion +symphysiotomy +symphysis +symphysodactylia +symphysotomy +symphysy +Symphyta +symphytic +symphytically +symphytism +symphytize +Symphytum +sympiesometer +symplasm +symplectic +Symplegades +symplesite +Symplocaceae +symplocaceous +Symplocarpus +symploce +Symplocos +sympode +sympodia +sympodial +sympodially +sympodium +sympolity +symposia +symposiac +symposiacal +symposial +symposiarch +symposiast +symposiastic +symposion +symposium +symptom +symptomatic +symptomatical +symptomatically +symptomatics +symptomatize +symptomatography +symptomatological +symptomatologically +symptomatology +symptomical +symptomize +symptomless +symptosis +symtomology +synacme +synacmic +synacmy +synactic +synadelphite +synaeresis +synagogal +synagogian +synagogical +synagogism +synagogist +synagogue +synalgia +synalgic +synallactic +synallagmatic +synaloepha +synanastomosis +synange +synangia +synangial +synangic +synangium +synanthema +synantherological +synantherologist +synantherology +synantherous +synanthesis +synanthetic +synanthic +synanthous +synanthrose +synanthy +synaphea +synaposematic +synapse +synapses +Synapsida +synapsidan +synapsis +synaptai +synaptase +synapte +synaptene +Synaptera +synapterous +synaptic +synaptical +synaptically +synapticula +synapticulae +synapticular +synapticulate +synapticulum +Synaptosauria +synaptychus +synarchical +synarchism +synarchy +synarmogoid +Synarmogoidea +synarquism +synartesis +synartete +synartetic +synarthrodia +synarthrodial +synarthrodially +synarthrosis +Synascidiae +synascidian +synastry +synaxar +synaxarion +synaxarist +synaxarium +synaxary +synaxis +sync +Syncarida +syncarp +syncarpia +syncarpium +syncarpous +syncarpy +syncategorematic +syncategorematical +syncategorematically +syncategoreme +syncephalic +syncephalus +syncerebral +syncerebrum +synch +synchitic +synchondoses +synchondrosial +synchondrosially +synchondrosis +synchondrotomy +synchoresis +synchro +synchroflash +synchromesh +synchronal +synchrone +synchronic +synchronical +synchronically +synchronism +synchronistic +synchronistical +synchronistically +synchronizable +synchronization +synchronize +synchronized +synchronizer +synchronograph +synchronological +synchronology +synchronous +synchronously +synchronousness +synchrony +synchroscope +synchrotron +synchysis +Synchytriaceae +Synchytrium +syncladous +synclastic +synclinal +synclinally +syncline +synclinical +synclinore +synclinorial +synclinorian +synclinorium +synclitic +syncliticism +synclitism +syncoelom +syncopal +syncopate +syncopated +syncopation +syncopator +syncope +syncopic +syncopism +syncopist +syncopize +syncotyledonous +syncracy +syncraniate +syncranterian +syncranteric +syncrasy +syncretic +syncretical +syncreticism +syncretion +syncretism +syncretist +syncretistic +syncretistical +syncretize +syncrisis +Syncrypta +syncryptic +syncytia +syncytial +syncytioma +syncytiomata +syncytium +syndactyl +syndactylia +syndactylic +syndactylism +syndactylous +syndactyly +syndectomy +synderesis +syndesis +syndesmectopia +syndesmitis +syndesmography +syndesmology +syndesmoma +Syndesmon +syndesmoplasty +syndesmorrhaphy +syndesmosis +syndesmotic +syndesmotomy +syndetic +syndetical +syndetically +syndic +syndical +syndicalism +syndicalist +syndicalistic +syndicalize +syndicate +syndicateer +syndication +syndicator +syndicship +syndoc +syndrome +syndromic +syndyasmian +Syndyoceras +syne +synecdoche +synecdochic +synecdochical +synecdochically +synecdochism +synechia +synechiological +synechiology +synechological +synechology +synechotomy +synechthran +synechthry +synecology +synecphonesis +synectic +synecticity +Synedra +synedral +Synedria +synedria +synedrial +synedrian +Synedrion +synedrion +Synedrium +synedrium +synedrous +syneidesis +synema +synemmenon +synenergistic +synenergistical +synenergistically +synentognath +Synentognathi +synentognathous +syneresis +synergastic +synergetic +synergia +synergic +synergically +synergid +synergidae +synergidal +synergism +synergist +synergistic +synergistical +synergistically +synergize +synergy +synerize +synesis +synesthesia +synesthetic +synethnic +syngamic +syngamous +syngamy +Syngenesia +syngenesian +syngenesious +syngenesis +syngenetic +syngenic +syngenism +syngenite +Syngnatha +Syngnathi +syngnathid +Syngnathidae +syngnathoid +syngnathous +Syngnathus +syngraph +synizesis +synkaryon +synkatathesis +synkinesia +synkinesis +synkinetic +synneurosis +synneusis +synochoid +synochus +synocreate +synod +synodal +synodalian +synodalist +synodally +synodical +synodically +synodist +synodite +synodontid +Synodontidae +synodontoid +synodsman +Synodus +synoecete +synoeciosis +synoecious +synoeciously +synoeciousness +synoecism +synoecize +synoecy +synoicous +synomosy +synonym +synonymatic +synonymic +synonymical +synonymicon +synonymics +synonymist +synonymity +synonymize +synonymous +synonymously +synonymousness +synonymy +synophthalmus +synopses +synopsis +synopsize +synopsy +synoptic +synoptical +synoptically +Synoptist +synoptist +Synoptistic +synorchidism +synorchism +synorthographic +synosteology +synosteosis +synostose +synostosis +synostotic +synostotical +synostotically +synousiacs +synovectomy +synovia +synovial +synovially +synoviparous +synovitic +synovitis +synpelmous +synrhabdosome +synsacral +synsacrum +synsepalous +synspermous +synsporous +syntactic +syntactical +syntactically +syntactician +syntactics +syntagma +syntan +syntasis +syntax +syntaxis +syntaxist +syntechnic +syntectic +syntelome +syntenosis +synteresis +syntexis +syntheme +synthermal +syntheses +synthesis +synthesism +synthesist +synthesization +synthesize +synthesizer +synthete +synthetic +synthetical +synthetically +syntheticism +synthetism +synthetist +synthetization +synthetize +synthetizer +synthol +synthroni +synthronoi +synthronos +synthronus +syntomia +syntomy +syntone +syntonic +syntonical +syntonically +syntonin +syntonization +syntonize +syntonizer +syntonolydian +syntonous +syntony +syntripsis +syntrope +syntrophic +syntropic +syntropical +syntropy +syntype +syntypic +syntypicism +Synura +synusia +synusiast +syodicon +sypher +syphilide +syphilidography +syphilidologist +syphiliphobia +syphilis +syphilitic +syphilitically +syphilization +syphilize +syphiloderm +syphilodermatous +syphilogenesis +syphilogeny +syphilographer +syphilography +syphiloid +syphilologist +syphilology +syphiloma +syphilomatous +syphilophobe +syphilophobia +syphilophobic +syphilopsychosis +syphilosis +syphilous +Syracusan +syre +Syriac +Syriacism +Syriacist +Syrian +Syrianic +Syrianism +Syrianize +Syriarch +Syriasm +syringa +syringadenous +syringe +syringeal +syringeful +syringes +syringin +syringitis +syringium +syringocoele +syringomyelia +syringomyelic +syringotome +syringotomy +syrinx +Syriologist +Syrma +syrma +Syrmian +Syrnium +Syrophoenician +syrphian +syrphid +Syrphidae +syrt +syrtic +Syrtis +syrup +syruped +syruper +syruplike +syrupy +Syryenian +syssarcosis +syssel +sysselman +syssiderite +syssitia +syssition +systaltic +systasis +systatic +system +systematic +systematical +systematicality +systematically +systematician +systematicness +systematics +systematism +systematist +systematization +systematize +systematizer +systematology +systemed +systemic +systemically +systemist +systemizable +systemization +systemize +systemizer +systemless +systemproof +systemwise +systilius +systolated +systole +systolic +systyle +systylous +Syun +syzygetic +syzygetically +syzygial +syzygium +syzygy +szaibelyite +Szekler +szlachta +szopelka +T +t +ta +taa +Taal +Taalbond +taar +Tab +tab +tabacin +tabacosis +tabacum +tabanid +Tabanidae +tabaniform +tabanuco +Tabanus +tabard +tabarded +tabaret +Tabasco +tabasheer +tabashir +tabaxir +tabbarea +tabber +tabbinet +Tabby +tabby +Tabebuia +tabefaction +tabefy +tabella +Tabellaria +Tabellariaceae +tabellion +taberdar +taberna +tabernacle +tabernacler +tabernacular +Tabernaemontana +tabernariae +tabes +tabescence +tabescent +tabet +tabetic +tabetiform +tabetless +tabic +tabid +tabidly +tabidness +tabific +tabifical +tabinet +Tabira +Tabitha +tabitude +tabla +tablature +table +tableau +tableaux +tablecloth +tableclothwise +tableclothy +tabled +tablefellow +tablefellowship +tableful +tableity +tableland +tableless +tablelike +tablemaid +tablemaker +tablemaking +tableman +tablemate +tabler +tables +tablespoon +tablespoonful +tablet +tabletary +tableware +tablewise +tabling +tablinum +Tabloid +tabloid +tabog +taboo +tabooism +tabooist +taboot +taboparalysis +taboparesis +taboparetic +tabophobia +tabor +taborer +taboret +taborin +Taborite +tabour +tabourer +tabouret +tabret +Tabriz +tabu +tabula +tabulable +tabular +tabulare +tabularium +tabularization +tabularize +tabularly +tabulary +Tabulata +tabulate +tabulated +tabulation +tabulator +tabulatory +tabule +tabuliform +tabut +tacahout +tacamahac +Tacana +Tacanan +Tacca +Taccaceae +taccaceous +taccada +tach +Tachardia +Tachardiinae +tache +tacheless +tacheography +tacheometer +tacheometric +tacheometry +tacheture +tachhydrite +tachibana +Tachina +Tachinaria +tachinarian +tachinid +Tachinidae +tachiol +tachistoscope +tachistoscopic +tachogram +tachograph +tachometer +tachometry +tachoscope +tachycardia +tachycardiac +tachygen +tachygenesis +tachygenetic +tachygenic +tachyglossal +tachyglossate +Tachyglossidae +Tachyglossus +tachygraph +tachygrapher +tachygraphic +tachygraphical +tachygraphically +tachygraphist +tachygraphometer +tachygraphometry +tachygraphy +tachyhydrite +tachyiatry +tachylalia +tachylite +tachylyte +tachylytic +tachymeter +tachymetric +tachymetry +tachyphagia +tachyphasia +tachyphemia +tachyphrasia +tachyphrenia +tachypnea +tachyscope +tachyseism +tachysterol +tachysystole +tachythanatous +tachytomy +tachytype +tacit +Tacitean +tacitly +tacitness +taciturn +taciturnist +taciturnity +taciturnly +tack +tacker +tacket +tackety +tackey +tackiness +tacking +tackingly +tackle +tackled +tackleless +tackleman +tackler +tackless +tackling +tackproof +tacksman +tacky +taclocus +tacmahack +tacnode +Taconian +Taconic +taconite +tacso +Tacsonia +tact +tactable +tactful +tactfully +tactfulness +tactic +tactical +tactically +tactician +tactics +tactile +tactilist +tactility +tactilogical +tactinvariant +taction +tactite +tactive +tactless +tactlessly +tactlessness +tactometer +tactor +tactosol +tactual +tactualist +tactuality +tactually +tactus +tacuacine +Taculli +Tad +tad +tade +Tadjik +Tadousac +tadpole +tadpoledom +tadpolehood +tadpolelike +tadpolism +tae +tael +taen +taenia +taeniacidal +taeniacide +Taeniada +taeniafuge +taenial +taenian +taeniasis +Taeniata +taeniate +taenicide +Taenidia +taenidium +taeniform +taenifuge +taeniiform +Taeniobranchia +taeniobranchiate +Taeniodonta +Taeniodontia +Taeniodontidae +Taenioglossa +taenioglossate +taenioid +taeniosome +Taeniosomi +taeniosomous +taenite +taennin +Taetsia +taffarel +tafferel +taffeta +taffety +taffle +taffrail +Taffy +taffy +taffylike +taffymaker +taffymaking +taffywise +tafia +tafinagh +taft +tafwiz +tag +Tagabilis +Tagakaolo +Tagal +Tagala +Tagalize +Tagalo +Tagalog +tagasaste +Tagassu +Tagassuidae +tagatose +Tagaur +Tagbanua +tagboard +Tagetes +tagetol +tagetone +tagged +tagger +taggle +taggy +Taghlik +tagilite +Tagish +taglet +Tagliacotian +Tagliacozzian +taglike +taglock +tagrag +tagraggery +tagsore +tagtail +tagua +taguan +Tagula +tagwerk +taha +Tahami +taheen +tahil +tahin +Tahiti +Tahitian +tahkhana +Tahltan +tahr +tahseeldar +tahsil +tahsildar +Tahsin +tahua +Tai +tai +taiaha +taich +taiga +taigle +taiglesome +taihoa +taikhana +tail +tailage +tailband +tailboard +tailed +tailender +tailer +tailet +tailfirst +tailflower +tailforemost +tailge +tailhead +tailing +tailings +taille +tailless +taillessly +taillessness +taillie +taillight +taillike +tailor +tailorage +tailorbird +tailorcraft +tailordom +tailoress +tailorhood +tailoring +tailorism +tailorization +tailorize +tailorless +tailorlike +tailorly +tailorman +tailorship +tailorwise +tailory +tailpiece +tailpin +tailpipe +tailrace +tailsman +tailstock +Tailte +tailward +tailwards +tailwise +taily +tailzee +tailzie +taimen +taimyrite +tain +Tainan +Taino +taint +taintable +taintless +taintlessly +taintlessness +taintment +taintor +taintproof +tainture +taintworm +Tainui +taipan +Taipi +Taiping +taipo +tairge +tairger +tairn +taisch +taise +Taisho +taissle +taistrel +taistril +Tait +tait +taiver +taivers +taivert +Taiwanhemp +Taiyal +taj +Tajik +takable +takamaka +Takao +takar +Takayuki +take +takedown +takedownable +takeful +Takelma +taken +taker +Takeuchi +Takhaar +Takhtadjy +Takilman +takin +taking +takingly +takingness +takings +Takitumu +takosis +takt +Taku +taky +takyr +Tal +tal +tala +talabon +talahib +Talaing +talaje +talak +talalgia +Talamanca +Talamancan +talanton +talao +talapoin +talar +talari +talaria +talaric +talayot +talbot +talbotype +talc +talcer +Talcher +talcky +talclike +talcochlorite +talcoid +talcomicaceous +talcose +talcous +talcum +tald +tale +talebearer +talebearing +talebook +talecarrier +talecarrying +taled +taleful +Talegallinae +Talegallus +talemaster +talemonger +talemongering +talent +talented +talentless +talepyet +taler +tales +talesman +taleteller +taletelling +tali +Taliacotian +taliage +taliation +taliera +taligrade +Talinum +talion +talionic +talipat +taliped +talipedic +talipes +talipomanus +talipot +talis +talisay +Talishi +talisman +talismanic +talismanical +talismanically +talismanist +talite +Talitha +talitol +talk +talkability +talkable +talkathon +talkative +talkatively +talkativeness +talker +talkfest +talkful +talkie +talkiness +talking +talkworthy +talky +tall +tallage +tallageability +tallageable +tallboy +tallegalane +taller +tallero +talles +tallet +talliable +talliage +talliar +talliate +tallier +tallis +tallish +tallit +tallith +tallness +talloel +tallote +tallow +tallowberry +tallower +tallowiness +tallowing +tallowish +tallowlike +tallowmaker +tallowmaking +tallowman +tallowroot +tallowweed +tallowwood +tallowy +tallwood +tally +tallyho +tallyman +tallymanship +tallywag +tallywalka +tallywoman +talma +talmouse +Talmud +Talmudic +Talmudical +Talmudism +Talmudist +Talmudistic +Talmudistical +Talmudization +Talmudize +talocalcaneal +talocalcanean +talocrural +talofibular +talon +talonavicular +taloned +talonic +talonid +taloscaphoid +talose +talotibial +Talpa +talpacoti +talpatate +talpetate +talpicide +talpid +Talpidae +talpiform +talpify +talpine +talpoid +talthib +Taltushtuntude +Taluche +Taluhet +taluk +taluka +talukdar +talukdari +talus +taluto +talwar +talwood +Talyshin +tam +Tama +tamability +tamable +tamableness +tamably +Tamaceae +Tamachek +tamacoare +tamale +Tamanac +Tamanaca +Tamanaco +tamandu +tamandua +tamanoas +tamanoir +tamanowus +tamanu +Tamara +tamara +tamarack +tamaraite +tamarao +Tamaricaceae +tamaricaceous +tamarin +tamarind +Tamarindus +tamarisk +Tamarix +Tamaroa +tamas +tamasha +Tamashek +Tamaulipecan +tambac +tambaroora +tamber +tambo +tamboo +Tambookie +tambookie +tambor +Tambouki +tambour +tamboura +tambourer +tambouret +tambourgi +tambourin +tambourinade +tambourine +tambourist +tambreet +Tambuki +tamburan +tamburello +Tame +tame +tamehearted +tameheartedness +tamein +tameless +tamelessly +tamelessness +tamely +tameness +tamer +Tamerlanism +Tamias +tamidine +Tamil +Tamilian +Tamilic +tamis +tamise +tamlung +Tammanial +Tammanize +Tammany +Tammanyism +Tammanyite +Tammanyize +tammie +tammock +Tammy +tammy +Tamonea +Tamoyo +tamp +tampala +tampan +tampang +tamper +tamperer +tamperproof +tampin +tamping +tampion +tampioned +tampon +tamponade +tamponage +tamponment +tampoon +Tamul +Tamulian +Tamulic +Tamus +Tamworth +Tamzine +tan +tana +tanacetin +tanacetone +Tanacetum +tanacetyl +tanach +tanager +Tanagra +Tanagraean +Tanagridae +tanagrine +tanagroid +Tanaidacea +tanaist +tanak +Tanaka +Tanala +tanan +tanbark +tanbur +tancel +Tanchelmian +tanchoir +tandan +tandem +tandemer +tandemist +tandemize +tandemwise +tandle +tandour +Tandy +tane +tanekaha +Tang +tang +tanga +Tangaloa +tangalung +tangantangan +Tangaridae +Tangaroa +Tangaroan +tanged +tangeite +tangelo +tangence +tangency +tangent +tangental +tangentally +tangential +tangentiality +tangentially +tangently +tanger +Tangerine +tangfish +tangham +tanghan +tanghin +Tanghinia +tanghinin +tangi +tangibile +tangibility +tangible +tangibleness +tangibly +tangie +Tangier +tangilin +Tangipahoa +tangka +tanglad +tangle +tangleberry +tanglefish +tanglefoot +tanglement +tangleproof +tangler +tangleroot +tanglesome +tangless +tanglewrack +tangling +tanglingly +tangly +tango +tangoreceptor +tangram +tangs +tangue +tanguile +tangum +tangun +Tangut +tangy +tanh +tanha +tanhouse +tania +tanica +tanier +tanist +tanistic +tanistry +tanistship +Tanite +Tanitic +tanjib +tanjong +tank +tanka +tankage +tankah +tankard +tanked +tanker +tankerabogus +tankert +tankette +tankful +tankle +tankless +tanklike +tankmaker +tankmaking +tankman +tankodrome +tankroom +tankwise +tanling +tannable +tannage +tannaic +tannaim +tannaitic +tannalbin +tannase +tannate +tanned +tanner +tannery +tannic +tannide +tanniferous +tannin +tannined +tanning +tanninlike +tannocaffeic +tannogallate +tannogallic +tannogelatin +tannogen +tannoid +tannometer +tannyl +Tano +tanoa +Tanoan +tanproof +tanquam +Tanquelinian +tanquen +tanrec +tanstuff +tansy +tantadlin +tantafflin +tantalate +Tantalean +Tantalian +Tantalic +tantalic +tantaliferous +tantalifluoride +tantalite +tantalization +tantalize +tantalizer +tantalizingly +tantalizingness +tantalofluoride +tantalum +Tantalus +tantamount +tantara +tantarabobus +tantarara +tanti +tantivy +tantle +Tantony +tantra +tantric +tantrik +tantrism +tantrist +tantrum +tantum +tanwood +tanworks +Tanya +tanyard +Tanyoan +Tanystomata +tanystomatous +tanystome +tanzeb +tanzib +Tanzine +tanzy +Tao +tao +Taoism +Taoist +Taoistic +Taonurus +Taos +taotai +taoyin +tap +Tapa +tapa +Tapachula +Tapachulteca +tapacolo +tapaculo +Tapacura +tapadera +tapadero +Tapajo +tapalo +tapamaker +tapamaking +tapas +tapasvi +Tape +tape +Tapeats +tapeinocephalic +tapeinocephalism +tapeinocephaly +tapeless +tapelike +tapeline +tapemaker +tapemaking +tapeman +tapen +taper +taperbearer +tapered +taperer +tapering +taperingly +taperly +tapermaker +tapermaking +taperness +taperwise +tapesium +tapestring +tapestry +tapestrylike +tapet +tapetal +tapete +tapeti +tapetless +tapetum +tapework +tapeworm +taphephobia +taphole +taphouse +Taphria +Taphrina +Taphrinaceae +tapia +Tapijulapane +tapinceophalism +tapinocephalic +tapinocephaly +Tapinoma +tapinophobia +tapinophoby +tapinosis +tapioca +tapir +Tapiridae +tapiridian +tapirine +Tapiro +tapiroid +Tapirus +tapis +tapism +tapist +taplash +taplet +Tapleyism +tapmost +tapnet +tapoa +Taposa +tapoun +tappa +tappable +tappableness +tappall +tappaul +tappen +tapper +tapperer +Tappertitian +tappet +tappietoorie +tapping +tappoon +Taprobane +taproom +taproot +taprooted +taps +tapster +tapsterlike +tapsterly +tapstress +tapu +tapul +Tapuya +Tapuyan +Tapuyo +taqua +tar +tara +tarabooka +taraf +tarafdar +tarage +Tarahumar +Tarahumara +Tarahumare +Tarahumari +Tarai +tarairi +tarakihi +Taraktogenos +taramellite +Taramembe +Taranchi +tarand +Tarandean +Tarandian +tarantara +tarantass +tarantella +tarantism +tarantist +tarantula +tarantular +tarantulary +tarantulated +tarantulid +Tarantulidae +tarantulism +tarantulite +tarantulous +tarapatch +taraph +tarapin +Tarapon +Tarasc +Tarascan +Tarasco +tarassis +tarata +taratah +taratantara +taratantarize +tarau +taraxacerin +taraxacin +Taraxacum +Tarazed +tarbadillo +tarbet +tarboard +tarbogan +tarboggin +tarboosh +tarbooshed +tarboy +tarbrush +tarbush +tarbuttite +Tardenoisian +Tardigrada +tardigrade +tardigradous +tardily +tardiness +tarditude +tardive +tardle +tardy +tare +tarea +tarefa +tarefitch +tarentala +tarente +Tarentine +tarentism +tarentola +tarepatch +Tareq +tarfa +tarflower +targe +targeman +targer +target +targeted +targeteer +targetlike +targetman +Targum +Targumic +Targumical +Targumist +Targumistic +Targumize +Tarheel +Tarheeler +tarhood +tari +Tariana +tarie +tariff +tariffable +tariffication +tariffism +tariffist +tariffite +tariffize +tariffless +tarin +Tariri +tariric +taririnic +tarish +Tarkalani +Tarkani +tarkashi +tarkeean +tarkhan +tarlatan +tarlataned +tarletan +tarlike +tarltonize +Tarmac +tarmac +tarman +Tarmi +tarmined +tarn +tarnal +tarnally +tarnation +tarnish +tarnishable +tarnisher +tarnishment +tarnishproof +tarnlike +tarnside +taro +taroc +tarocco +tarok +taropatch +tarot +tarp +tarpan +tarpaulin +tarpaulinmaker +Tarpeia +Tarpeian +tarpon +tarpot +tarpum +Tarquin +Tarquinish +tarr +tarrack +tarradiddle +tarradiddler +tarragon +tarragona +tarras +tarrass +Tarrateen +Tarratine +tarred +tarrer +tarri +tarriance +tarrie +tarrier +tarrify +tarrily +tarriness +tarrish +tarrock +tarrow +tarry +tarrying +tarryingly +tarryingness +tars +tarsadenitis +tarsal +tarsale +tarsalgia +tarse +tarsectomy +tarsectopia +tarsi +tarsia +tarsier +Tarsiidae +tarsioid +Tarsipedidae +Tarsipedinae +Tarsipes +tarsitis +Tarsius +tarsochiloplasty +tarsoclasis +tarsomalacia +tarsome +tarsometatarsal +tarsometatarsus +tarsonemid +Tarsonemidae +Tarsonemus +tarsophalangeal +tarsophyma +tarsoplasia +tarsoplasty +tarsoptosis +tarsorrhaphy +tarsotarsal +tarsotibal +tarsotomy +tarsus +tart +tartago +Tartan +tartan +tartana +tartane +Tartar +tartar +tartarated +Tartarean +Tartareous +tartareous +tartaret +Tartarian +Tartaric +tartaric +Tartarin +tartarish +Tartarism +Tartarization +tartarization +Tartarize +tartarize +Tartarized +Tartarlike +tartarly +Tartarology +tartarous +tartarproof +tartarum +Tartarus +Tartary +tartemorion +tarten +tartish +tartishly +tartle +tartlet +tartly +tartness +tartramate +tartramic +tartramide +tartrate +tartrated +tartratoferric +tartrazine +tartrazinic +tartro +tartronate +tartronic +tartronyl +tartronylurea +tartrous +tartryl +tartrylic +Tartufe +tartufery +tartufian +tartufish +tartufishly +tartufism +tartwoman +Taruma +Tarumari +tarve +Tarvia +tarweed +tarwhine +tarwood +tarworks +taryard +Taryba +Tarzan +Tarzanish +tasajo +tascal +tasco +taseometer +tash +tasheriff +tashie +tashlik +Tashnagist +Tashnakist +tashreef +tashrif +Tasian +tasimeter +tasimetric +tasimetry +task +taskage +tasker +taskit +taskless +tasklike +taskmaster +taskmastership +taskmistress +tasksetter +tasksetting +taskwork +taslet +Tasmanian +tasmanite +Tass +tass +tassago +tassah +tassal +tassard +tasse +tassel +tasseler +tasselet +tasselfish +tassellus +tasselmaker +tasselmaking +tassely +tasser +tasset +tassie +tassoo +tastable +tastableness +tastably +taste +tasteable +tasteableness +tasteably +tasted +tasteful +tastefully +tastefulness +tastekin +tasteless +tastelessly +tastelessness +tasten +taster +tastily +tastiness +tasting +tastingly +tasty +tasu +Tat +tat +Tatar +Tatarian +Tataric +Tatarization +Tatarize +Tatary +tataupa +tatbeb +tatchy +tate +tater +Tates +tath +Tatian +Tatianist +tatie +tatinek +tatler +tatou +tatouay +tatpurusha +Tatsanottine +tatsman +tatta +tatter +tatterdemalion +tatterdemalionism +tatterdemalionry +tattered +tatteredly +tatteredness +tatterly +tatterwallop +tattery +tatther +tattied +tatting +tattle +tattlement +tattler +tattlery +tattletale +tattling +tattlingly +tattoo +tattooage +tattooer +tattooing +tattooist +tattooment +tattva +tatty +Tatu +tatu +tatukira +Tatusia +Tatusiidae +tau +Taube +Tauchnitz +taught +taula +Tauli +taum +taun +Taungthu +taunt +taunter +taunting +tauntingly +tauntingness +Taunton +tauntress +taupe +taupo +taupou +taur +tauranga +taurean +Tauri +Taurian +taurian +Tauric +tauric +tauricide +tauricornous +Taurid +Tauridian +tauriferous +tauriform +taurine +Taurini +taurite +taurobolium +tauroboly +taurocephalous +taurocholate +taurocholic +taurocol +taurocolla +Tauroctonus +taurodont +tauroesque +taurokathapsia +taurolatry +tauromachian +tauromachic +tauromachy +tauromorphic +tauromorphous +taurophile +taurophobe +Tauropolos +Taurotragus +Taurus +tauryl +taut +tautaug +tauted +tautegorical +tautegory +tauten +tautirite +tautit +tautly +tautness +tautochrone +tautochronism +tautochronous +tautog +tautologic +tautological +tautologically +tautologicalness +tautologism +tautologist +tautologize +tautologizer +tautologous +tautologously +tautology +tautomer +tautomeral +tautomeric +tautomerism +tautomerizable +tautomerization +tautomerize +tautomery +tautometer +tautometric +tautometrical +tautomorphous +tautonym +tautonymic +tautonymy +tautoousian +tautoousious +tautophonic +tautophonical +tautophony +tautopodic +tautopody +tautosyllabic +tautotype +tautourea +tautousian +tautousious +tautozonal +tautozonality +tav +Tavast +Tavastian +Tave +tave +tavell +taver +tavern +taverner +tavernize +tavernless +tavernlike +tavernly +tavernous +tavernry +tavernwards +tavers +tavert +Tavghi +tavistockite +tavola +tavolatite +Tavy +taw +tawa +tawdered +tawdrily +tawdriness +tawdry +tawer +tawery +Tawgi +tawie +tawite +tawkee +tawkin +tawn +tawney +tawnily +tawniness +tawnle +tawny +tawpi +tawpie +taws +tawse +tawtie +tax +taxability +taxable +taxableness +taxably +Taxaceae +taxaceous +taxameter +taxaspidean +taxation +taxational +taxative +taxatively +taxator +taxeater +taxeating +taxed +taxeme +taxemic +taxeopod +Taxeopoda +taxeopodous +taxeopody +taxer +taxgatherer +taxgathering +taxi +taxiable +taxiarch +taxiauto +taxibus +taxicab +Taxidea +taxidermal +taxidermic +taxidermist +taxidermize +taxidermy +taximan +taximeter +taximetered +taxine +taxing +taxingly +taxinomic +taxinomist +taxinomy +taxiplane +taxis +taxite +taxitic +taxless +taxlessly +taxlessness +taxman +Taxodiaceae +Taxodium +taxodont +taxology +taxometer +taxon +taxonomer +taxonomic +taxonomical +taxonomically +taxonomist +taxonomy +taxor +taxpaid +taxpayer +taxpaying +Taxus +taxwax +taxy +tay +Tayassu +Tayassuidae +tayer +Taygeta +tayir +Taylor +Taylorism +Taylorite +taylorite +Taylorize +tayra +Tayrona +taysaam +tazia +Tcawi +tch +tchai +tcharik +tchast +tche +tcheirek +Tcheka +Tcherkess +tchervonets +tchervonetz +Tchetchentsish +Tchetnitsi +Tchi +tchick +tchu +Tchwi +tck +Td +te +tea +teaberry +teaboard +teabox +teaboy +teacake +teacart +teach +teachability +teachable +teachableness +teachably +teache +teacher +teacherage +teacherdom +teacheress +teacherhood +teacherless +teacherlike +teacherly +teachership +teachery +teaching +teachingly +teachless +teachment +teachy +teacup +teacupful +tead +teadish +teaer +teaey +teagardeny +teagle +Teague +Teagueland +Teaguelander +teahouse +teaish +teaism +teak +teakettle +teakwood +teal +tealeafy +tealery +tealess +teallite +team +teamaker +teamaking +teaman +teameo +teamer +teaming +teamland +teamless +teamman +teammate +teamsman +teamster +teamwise +teamwork +tean +teanal +teap +teapot +teapotful +teapottykin +teapoy +tear +tearable +tearableness +tearably +tearage +tearcat +teardown +teardrop +tearer +tearful +tearfully +tearfulness +tearing +tearless +tearlessly +tearlessness +tearlet +tearlike +tearoom +tearpit +tearproof +tearstain +teart +tearthroat +tearthumb +teary +teasable +teasableness +teasably +tease +teaseable +teaseableness +teaseably +teasehole +teasel +teaseler +teaseller +teasellike +teaselwort +teasement +teaser +teashop +teasiness +teasing +teasingly +teasler +teaspoon +teaspoonful +teasy +teat +teataster +teated +teatfish +teathe +teather +teatime +teatlike +teatling +teatman +teaty +teave +teaware +teaze +teazer +tebbet +Tebet +Tebeth +Tebu +tec +Teca +teca +tecali +Tech +tech +techily +techiness +technetium +technic +technica +technical +technicalism +technicalist +technicality +technicalize +technically +technicalness +technician +technicism +technicist +technicological +technicology +Technicolor +technicon +technics +techniphone +technique +techniquer +technism +technist +technocausis +technochemical +technochemistry +technocracy +technocrat +technocratic +technographer +technographic +technographical +technographically +technography +technolithic +technologic +technological +technologically +technologist +technologue +technology +technonomic +technonomy +technopsychology +techous +techy +teck +Tecla +tecnoctonia +tecnology +Teco +Tecoma +tecomin +tecon +Tecpanec +tectal +tectibranch +Tectibranchia +tectibranchian +Tectibranchiata +tectibranchiate +tectiform +tectocephalic +tectocephaly +tectological +tectology +Tectona +tectonic +tectonics +tectorial +tectorium +Tectosages +tectosphere +tectospinal +Tectospondyli +tectospondylic +tectospondylous +tectrices +tectricial +tectum +tecum +tecuma +Tecuna +Ted +ted +Teda +tedder +Teddy +tedescan +tedge +tediosity +tedious +tediously +tediousness +tediousome +tedisome +tedium +tee +teedle +teel +teem +teemer +teemful +teemfulness +teeming +teemingly +teemingness +teemless +teems +teen +teenage +teenet +teens +teensy +teenty +teeny +teer +teerer +teest +Teeswater +teet +teetaller +teetan +teeter +teeterboard +teeterer +teetertail +teeth +teethache +teethbrush +teethe +teethful +teethily +teething +teethless +teethlike +teethridge +teethy +teeting +teetotal +teetotaler +teetotalism +teetotalist +teetotally +teetotum +teetotumism +teetotumize +teetotumwise +teety +teevee +teewhaap +teff +teg +Tegean +Tegeticula +tegmen +tegmental +tegmentum +tegmina +tegminal +Tegmine +tegua +teguexin +Teguima +tegula +tegular +tegularly +tegulated +tegumen +tegument +tegumental +tegumentary +tegumentum +tegurium +Teheran +tehseel +tehseeldar +tehsil +tehsildar +Tehuantepecan +Tehueco +Tehuelche +Tehuelchean +Tehuelet +Teian +teicher +teiglech +Teiidae +teil +teind +teindable +teinder +teinland +teinoscope +teioid +Teiresias +Tejon +tejon +teju +tekiah +Tekintsi +Tekke +tekke +tekken +Tekkintzi +teknonymous +teknonymy +tektite +tekya +telacoustic +telakucha +telamon +telang +telangiectasia +telangiectasis +telangiectasy +telangiectatic +telangiosis +Telanthera +telar +telarian +telary +telautogram +telautograph +telautographic +telautographist +telautography +telautomatic +telautomatically +telautomatics +Telchines +Telchinic +tele +teleanemograph +teleangiectasia +telebarograph +telebarometer +telecast +telecaster +telechemic +telechirograph +telecinematography +telecode +telecommunication +telecryptograph +telectroscope +teledendrion +teledendrite +teledendron +teledu +telega +telegenic +Telegn +telegnosis +telegnostic +telegonic +telegonous +telegony +telegram +telegrammatic +telegrammic +telegraph +telegraphee +telegrapheme +telegrapher +telegraphese +telegraphic +telegraphical +telegraphically +telegraphist +telegraphone +telegraphophone +telegraphoscope +telegraphy +Telegu +telehydrobarometer +Telei +Teleia +teleianthous +teleiosis +telekinematography +telekinesis +telekinetic +telelectric +telelectrograph +telelectroscope +telemanometer +Telemark +telemark +Telembi +telemechanic +telemechanics +telemechanism +telemetacarpal +telemeteorograph +telemeteorographic +telemeteorography +telemeter +telemetric +telemetrical +telemetrist +telemetrograph +telemetrographic +telemetrography +telemetry +telemotor +telencephal +telencephalic +telencephalon +telenergic +telenergy +teleneurite +teleneuron +Telenget +telengiscope +Telenomus +teleobjective +Teleocephali +teleocephalous +Teleoceras +Teleodesmacea +teleodesmacean +teleodesmaceous +teleodont +teleologic +teleological +teleologically +teleologism +teleologist +teleology +teleometer +teleophobia +teleophore +teleophyte +teleoptile +teleorganic +teleoroentgenogram +teleoroentgenography +teleosaur +teleosaurian +Teleosauridae +Teleosaurus +teleost +teleostean +Teleostei +teleosteous +teleostomate +teleostome +Teleostomi +teleostomian +teleostomous +teleotemporal +teleotrocha +teleozoic +teleozoon +telepathic +telepathically +telepathist +telepathize +telepathy +telepheme +telephone +telephoner +telephonic +telephonical +telephonically +telephonist +telephonograph +telephonographic +telephony +telephote +telephoto +telephotograph +telephotographic +telephotography +Telephus +telepicture +teleplasm +teleplasmic +teleplastic +telepost +teleprinter +teleradiophone +teleran +telergic +telergical +telergically +telergy +telescope +telescopic +telescopical +telescopically +telescopiform +telescopist +Telescopium +telescopy +telescriptor +teleseism +teleseismic +teleseismology +teleseme +telesia +telesis +telesmeter +telesomatic +telespectroscope +telestereograph +telestereography +telestereoscope +telesterion +telesthesia +telesthetic +telestial +telestic +telestich +teletactile +teletactor +teletape +teletherapy +telethermogram +telethermograph +telethermometer +telethermometry +telethon +teletopometer +teletranscription +Teletype +teletype +teletyper +teletypesetter +teletypewriter +teletyping +Teleut +teleuto +teleutoform +teleutosorus +teleutospore +teleutosporic +teleutosporiferous +teleview +televiewer +televise +television +televisional +televisionary +televisor +televisual +televocal +televox +telewriter +Telfairia +telfairic +telfer +telferage +telford +telfordize +telharmonic +telharmonium +telharmony +teli +telial +telic +telical +telically +teliferous +Telinga +teliosorus +teliospore +teliosporic +teliosporiferous +teliostage +telium +tell +tellable +tellach +tellee +teller +tellership +telligraph +Tellima +Tellina +Tellinacea +tellinacean +tellinaceous +telling +tellingly +Tellinidae +tellinoid +tellsome +tellt +telltale +telltalely +telltruth +tellural +tellurate +telluret +tellureted +tellurethyl +telluretted +tellurhydric +tellurian +telluric +telluride +telluriferous +tellurion +tellurism +tellurist +tellurite +tellurium +tellurize +telluronium +tellurous +telmatological +telmatology +teloblast +teloblastic +telocentric +telodendrion +telodendron +telodynamic +telokinesis +telolecithal +telolemma +telome +telomic +telomitic +telonism +Teloogoo +Telopea +telophase +telophragma +telopsis +teloptic +telosynapsis +telosynaptic +telosynaptist +teloteropathic +teloteropathically +teloteropathy +Telotremata +telotrematous +telotroch +telotrocha +telotrochal +telotrochous +telotrophic +telotype +telpath +telpher +telpherage +telpherman +telpherway +telson +telsonic +telt +Telugu +telurgy +telyn +Tema +temacha +temalacatl +Teman +teman +Temanite +tembe +temblor +Tembu +temenos +temerarious +temerariously +temerariousness +temeritous +temerity +temerous +temerously +temerousness +temiak +temin +Temiskaming +Temne +Temnospondyli +temnospondylous +temp +Tempe +Tempean +temper +tempera +temperability +temperable +temperably +temperality +temperament +temperamental +temperamentalist +temperamentally +temperamented +temperance +temperate +temperately +temperateness +temperative +temperature +tempered +temperedly +temperedness +temperer +temperish +temperless +tempersome +tempery +tempest +tempestical +tempestive +tempestively +tempestivity +tempestuous +tempestuously +tempestuousness +tempesty +tempi +Templar +templar +templardom +templarism +templarlike +templarlikeness +templary +template +templater +temple +templed +templeful +templeless +templelike +templet +Templetonia +templeward +templize +tempo +tempora +temporal +temporale +temporalism +temporalist +temporality +temporalize +temporally +temporalness +temporalty +temporaneous +temporaneously +temporaneousness +temporarily +temporariness +temporary +temporator +temporization +temporizer +temporizing +temporizingly +temporoalar +temporoauricular +temporocentral +temporocerebellar +temporofacial +temporofrontal +temporohyoid +temporomalar +temporomandibular +temporomastoid +temporomaxillary +temporooccipital +temporoparietal +temporopontine +temporosphenoid +temporosphenoidal +temporozygomatic +tempre +temprely +tempt +temptability +temptable +temptableness +temptation +temptational +temptationless +temptatious +temptatory +tempter +tempting +temptingly +temptingness +temptress +Tempyo +temse +temser +temulence +temulency +temulent +temulentive +temulently +ten +tenability +tenable +tenableness +tenably +tenace +tenacious +tenaciously +tenaciousness +tenacity +tenaculum +tenai +tenaille +tenaillon +Tenaktak +tenancy +tenant +tenantable +tenantableness +tenanter +tenantism +tenantless +tenantlike +tenantry +tenantship +tench +tenchweed +Tencteri +tend +tendance +tendant +tendence +tendency +tendent +tendential +tendentious +tendentiously +tendentiousness +tender +tenderability +tenderable +tenderably +tenderee +tenderer +tenderfoot +tenderfootish +tenderful +tenderfully +tenderheart +tenderhearted +tenderheartedly +tenderheartedness +tenderish +tenderize +tenderling +tenderloin +tenderly +tenderness +tenderometer +tendersome +tendinal +tending +tendingly +tendinitis +tendinous +tendinousness +tendomucoid +tendon +tendonous +tendoplasty +tendosynovitis +tendotome +tendotomy +tendour +tendovaginal +tendovaginitis +tendresse +tendril +tendriled +tendriliferous +tendrillar +tendrilly +tendrilous +tendron +tenebra +Tenebrae +tenebricose +tenebrific +tenebrificate +Tenebrio +tenebrionid +Tenebrionidae +tenebrious +tenebriously +tenebrity +tenebrose +tenebrosity +tenebrous +tenebrously +tenebrousness +tenectomy +tenement +tenemental +tenementary +tenementer +tenementization +tenementize +tenendas +tenendum +tenent +teneral +Teneriffe +tenesmic +tenesmus +tenet +tenfold +tenfoldness +teng +tengere +tengerite +Tenggerese +tengu +teniacidal +teniacide +tenible +Tenino +tenio +tenline +tenmantale +tennantite +tenne +tenner +Tennessean +tennis +tennisdom +tennisy +Tennysonian +Tennysonianism +Tenochtitlan +tenodesis +tenodynia +tenography +tenology +tenomyoplasty +tenomyotomy +tenon +tenonectomy +tenoner +Tenonian +tenonitis +tenonostosis +tenontagra +tenontitis +tenontodynia +tenontography +tenontolemmitis +tenontology +tenontomyoplasty +tenontomyotomy +tenontophyma +tenontoplasty +tenontothecitis +tenontotomy +tenophony +tenophyte +tenoplastic +tenoplasty +tenor +tenorist +tenorister +tenorite +tenorless +tenoroon +tenorrhaphy +tenositis +tenostosis +tenosuture +tenotome +tenotomist +tenotomize +tenotomy +tenovaginitis +tenpence +tenpenny +tenpin +tenrec +Tenrecidae +tense +tenseless +tenselessness +tensely +tenseness +tensibility +tensible +tensibleness +tensibly +tensify +tensile +tensilely +tensileness +tensility +tensimeter +tensiometer +tension +tensional +tensionless +tensity +tensive +tenson +tensor +tent +tentability +tentable +tentacle +tentacled +tentaclelike +tentacula +tentacular +Tentaculata +tentaculate +tentaculated +Tentaculifera +tentaculite +Tentaculites +Tentaculitidae +tentaculocyst +tentaculoid +tentaculum +tentage +tentamen +tentation +tentative +tentatively +tentativeness +tented +tenter +tenterbelly +tenterer +tenterhook +tentful +tenth +tenthly +tenthmeter +tenthredinid +Tenthredinidae +tenthredinoid +Tenthredinoidea +Tenthredo +tentiform +tentigo +tentillum +tention +tentless +tentlet +tentlike +tentmaker +tentmaking +tentmate +tentorial +tentorium +tenture +tentwards +tentwise +tentwork +tentwort +tenty +tenuate +tenues +tenuicostate +tenuifasciate +tenuiflorous +tenuifolious +tenuious +tenuiroster +tenuirostral +tenuirostrate +Tenuirostres +tenuis +tenuistriate +tenuity +tenuous +tenuously +tenuousness +tenure +tenurial +tenurially +teocalli +teopan +teosinte +Teotihuacan +tepache +tepal +Tepanec +Tepecano +tepee +tepefaction +tepefy +Tepehua +Tepehuane +tepetate +Tephillah +tephillin +tephramancy +tephrite +tephritic +tephroite +tephromalacia +tephromyelitic +Tephrosia +tephrosis +tepid +tepidarium +tepidity +tepidly +tepidness +tepomporize +teponaztli +tepor +tequila +Tequistlateca +Tequistlatecan +tera +teraglin +terakihi +teramorphous +terap +teraphim +teras +teratical +teratism +teratoblastoma +teratogenesis +teratogenetic +teratogenic +teratogenous +teratogeny +teratoid +teratological +teratologist +teratology +teratoma +teratomatous +teratoscopy +teratosis +terbia +terbic +terbium +tercel +tercelet +tercentenarian +tercentenarize +tercentenary +tercentennial +tercer +terceron +tercet +terchloride +tercia +tercine +tercio +terdiurnal +terebate +terebella +terebellid +Terebellidae +terebelloid +terebellum +terebene +terebenic +terebenthene +terebic +terebilic +terebinic +terebinth +Terebinthaceae +terebinthial +terebinthian +terebinthic +terebinthina +terebinthinate +terebinthine +terebinthinous +Terebinthus +terebra +terebral +terebrant +Terebrantia +terebrate +terebration +Terebratula +terebratular +terebratulid +Terebratulidae +terebratuliform +terebratuline +terebratulite +terebratuloid +Terebridae +Teredinidae +teredo +terek +Terence +Terentian +terephthalate +terephthalic +Teresa +Teresian +Teresina +terete +teretial +tereticaudate +teretifolious +teretipronator +teretiscapular +teretiscapularis +teretish +tereu +Tereus +terfez +Terfezia +Terfeziaceae +tergal +tergant +tergeminate +tergeminous +tergiferous +tergite +tergitic +tergiversant +tergiversate +tergiversation +tergiversator +tergiversatory +tergiverse +tergolateral +tergum +Teri +Teriann +terlinguaite +term +terma +termagancy +Termagant +termagant +termagantish +termagantism +termagantly +termage +termatic +termen +termer +Termes +termillenary +termin +terminability +terminable +terminableness +terminably +terminal +Terminalia +Terminaliaceae +terminalization +terminalized +terminally +terminant +terminate +termination +terminational +terminative +terminatively +terminator +terminatory +termine +terminer +termini +terminine +terminism +terminist +terministic +terminize +termino +terminological +terminologically +terminologist +terminology +terminus +termital +termitarium +termitary +termite +termitic +termitid +Termitidae +termitophagous +termitophile +termitophilous +termless +termlessly +termlessness +termly +termolecular +termon +termor +termtime +tern +terna +ternal +ternar +ternariant +ternarious +ternary +ternate +ternately +ternatipinnate +ternatisect +ternatopinnate +terne +terneplate +ternery +ternion +ternize +ternlet +Ternstroemia +Ternstroemiaceae +teroxide +terp +terpadiene +terpane +terpene +terpeneless +terphenyl +terpilene +terpin +terpine +terpinene +terpineol +terpinol +terpinolene +terpodion +Terpsichore +terpsichoreal +terpsichoreally +Terpsichorean +terpsichorean +Terraba +terrace +terraceous +terracer +terracette +terracewards +terracewise +terracework +terraciform +terracing +terraculture +terraefilial +terraefilian +terrage +terrain +terral +terramara +terramare +Terrance +terrane +terranean +terraneous +Terrapene +terrapin +terraquean +terraqueous +terraqueousness +terrar +terrarium +terrazzo +terrella +terremotive +Terrence +terrene +terrenely +terreneness +terreplein +terrestrial +terrestrialism +terrestriality +terrestrialize +terrestrially +terrestrialness +terrestricity +terrestrious +terret +terreted +Terri +terribility +terrible +terribleness +terribly +terricole +terricoline +terricolous +terrier +terrierlike +terrific +terrifical +terrifically +terrification +terrificly +terrificness +terrifiedly +terrifier +terrify +terrifying +terrifyingly +terrigenous +terrine +Territelae +territelarian +territorial +territorialism +territorialist +territoriality +territorialization +territorialize +territorially +territorian +territoried +territory +terron +terror +terrorful +terrorific +terrorism +terrorist +terroristic +terroristical +terrorization +terrorize +terrorizer +terrorless +terrorproof +terrorsome +Terry +terry +terse +tersely +terseness +tersion +tersulphate +tersulphide +tersulphuret +tertenant +tertia +tertial +tertian +tertiana +tertianship +tertiarian +tertiary +tertiate +tertius +terton +tertrinal +Tertullianism +Tertullianist +teruncius +terutero +Teruyuki +tervalence +tervalency +tervalent +tervariant +tervee +terzetto +terzina +terzo +tesack +tesarovitch +teschenite +teschermacherite +teskere +teskeria +Tess +tessara +tessarace +tessaraconter +tessaradecad +tessaraglot +tessaraphthong +tessarescaedecahedron +tessel +tessella +tessellar +tessellate +tessellated +tessellation +tessera +tesseract +tesseradecade +tesseraic +tesseral +Tesserants +tesserarian +tesserate +tesserated +tesseratomic +tesseratomy +tessular +test +testa +testable +Testacea +testacean +testaceography +testaceology +testaceous +testaceousness +testacy +testament +testamental +testamentally +testamentalness +testamentarily +testamentary +testamentate +testamentation +testamentum +testamur +testar +testata +testate +testation +testator +testatorship +testatory +testatrices +testatrix +testatum +teste +tested +testee +tester +testes +testibrachial +testibrachium +testicardinate +testicardine +Testicardines +testicle +testicond +testicular +testiculate +testiculated +testiere +testificate +testification +testificator +testificatory +testifier +testify +testily +testimonial +testimonialist +testimonialization +testimonialize +testimonializer +testimonium +testimony +testiness +testing +testingly +testis +teston +testone +testoon +testor +testosterone +testril +testudinal +Testudinaria +testudinarious +Testudinata +testudinate +testudinated +testudineal +testudineous +Testudinidae +testudinous +testudo +testy +Tesuque +tetanic +tetanical +tetanically +tetaniform +tetanigenous +tetanilla +tetanine +tetanism +tetanization +tetanize +tetanoid +tetanolysin +tetanomotor +tetanospasmin +tetanotoxin +tetanus +tetany +tetarcone +tetarconid +tetard +tetartemorion +tetartocone +tetartoconid +tetartohedral +tetartohedrally +tetartohedrism +tetartohedron +tetartoid +tetartosymmetry +tetch +tetchy +tete +tetel +teterrimous +teth +tethelin +tether +tetherball +tethery +tethydan +Tethys +Teton +tetra +tetraamylose +tetrabasic +tetrabasicity +Tetrabelodon +tetrabelodont +tetrabiblos +tetraborate +tetraboric +tetrabrach +tetrabranch +Tetrabranchia +tetrabranchiate +tetrabromid +tetrabromide +tetrabromo +tetrabromoethane +tetracadactylity +tetracarboxylate +tetracarboxylic +tetracarpellary +tetraceratous +tetracerous +Tetracerus +tetrachical +tetrachlorid +tetrachloride +tetrachloro +tetrachloroethane +tetrachloroethylene +tetrachloromethane +tetrachord +tetrachordal +tetrachordon +tetrachoric +tetrachotomous +tetrachromatic +tetrachromic +tetrachronous +tetracid +tetracoccous +tetracoccus +tetracolic +tetracolon +tetracoral +Tetracoralla +tetracoralline +tetracosane +tetract +tetractinal +tetractine +tetractinellid +Tetractinellida +tetractinellidan +tetractinelline +tetractinose +tetracyclic +tetrad +tetradactyl +tetradactylous +tetradactyly +tetradarchy +tetradecane +tetradecanoic +tetradecapod +Tetradecapoda +tetradecapodan +tetradecapodous +tetradecyl +Tetradesmus +tetradiapason +tetradic +Tetradite +tetradrachma +tetradrachmal +tetradrachmon +tetradymite +Tetradynamia +tetradynamian +tetradynamious +tetradynamous +tetraedron +tetraedrum +tetraethylsilane +tetrafluoride +tetrafolious +tetragamy +tetragenous +tetraglot +tetraglottic +tetragon +tetragonal +tetragonally +tetragonalness +Tetragonia +Tetragoniaceae +tetragonidium +tetragonous +tetragonus +tetragram +tetragrammatic +Tetragrammaton +tetragrammatonic +tetragyn +Tetragynia +tetragynian +tetragynous +tetrahedral +tetrahedrally +tetrahedric +tetrahedrite +tetrahedroid +tetrahedron +tetrahexahedral +tetrahexahedron +tetrahydrate +tetrahydrated +tetrahydric +tetrahydride +tetrahydro +tetrahydroxy +tetraiodid +tetraiodide +tetraiodo +tetraiodophenolphthalein +tetrakaidecahedron +tetraketone +tetrakisazo +tetrakishexahedron +tetralemma +Tetralin +tetralogic +tetralogue +tetralogy +tetralophodont +tetramastia +tetramastigote +Tetramera +tetrameral +tetrameralian +tetrameric +tetramerism +tetramerous +tetrameter +tetramethyl +tetramethylammonium +tetramethylene +tetramethylium +tetramin +tetramine +tetrammine +tetramorph +tetramorphic +tetramorphism +tetramorphous +tetrander +Tetrandria +tetrandrian +tetrandrous +tetrane +tetranitrate +tetranitro +tetranitroaniline +tetranuclear +Tetranychus +Tetrao +Tetraodon +tetraodont +Tetraodontidae +tetraonid +Tetraonidae +Tetraoninae +tetraonine +Tetrapanax +tetrapartite +tetrapetalous +tetraphalangeate +tetrapharmacal +tetrapharmacon +tetraphenol +tetraphony +tetraphosphate +tetraphyllous +tetrapla +tetraplegia +tetrapleuron +tetraploid +tetraploidic +tetraploidy +tetraplous +Tetrapneumona +Tetrapneumones +tetrapneumonian +tetrapneumonous +tetrapod +Tetrapoda +tetrapodic +tetrapody +tetrapolar +tetrapolis +tetrapolitan +tetrapous +tetraprostyle +tetrapteran +tetrapteron +tetrapterous +tetraptote +Tetrapturus +tetraptych +tetrapylon +tetrapyramid +tetrapyrenous +tetraquetrous +tetrarch +tetrarchate +tetrarchic +tetrarchy +tetrasaccharide +tetrasalicylide +tetraselenodont +tetraseme +tetrasemic +tetrasepalous +tetraskelion +tetrasome +tetrasomic +tetrasomy +tetraspermal +tetraspermatous +tetraspermous +tetraspheric +tetrasporange +tetrasporangiate +tetrasporangium +tetraspore +tetrasporic +tetrasporiferous +tetrasporous +tetraster +tetrastich +tetrastichal +tetrastichic +Tetrastichidae +tetrastichous +Tetrastichus +tetrastoon +tetrastyle +tetrastylic +tetrastylos +tetrastylous +tetrasubstituted +tetrasubstitution +tetrasulphide +tetrasyllabic +tetrasyllable +tetrasymmetry +tetrathecal +tetratheism +tetratheite +tetrathionates +tetrathionic +tetratomic +tetratone +tetravalence +tetravalency +tetravalent +tetraxial +tetraxon +Tetraxonia +tetraxonian +tetraxonid +Tetraxonida +tetrazane +tetrazene +tetrazin +tetrazine +tetrazo +tetrazole +tetrazolium +tetrazolyl +tetrazone +tetrazotization +tetrazotize +tetrazyl +tetremimeral +tetrevangelium +tetric +tetrical +tetricity +tetricous +tetrigid +Tetrigidae +tetriodide +Tetrix +tetrobol +tetrobolon +tetrode +Tetrodon +tetrodont +Tetrodontidae +tetrole +tetrolic +tetronic +tetronymal +tetrose +tetroxalate +tetroxide +tetrsyllabical +tetryl +tetrylene +tetter +tetterish +tetterous +tetterwort +tettery +Tettigidae +tettigoniid +Tettigoniidae +tettix +Tetum +Teucer +Teucri +Teucrian +teucrin +Teucrium +teufit +teuk +Teutolatry +Teutomania +Teutomaniac +Teuton +Teutondom +Teutonesque +Teutonia +Teutonic +Teutonically +Teutonicism +Teutonism +Teutonist +Teutonity +Teutonization +Teutonize +Teutonomania +Teutonophobe +Teutonophobia +Teutophil +Teutophile +Teutophilism +Teutophobe +Teutophobia +Teutophobism +teviss +tew +Tewa +tewel +tewer +tewit +tewly +tewsome +Texan +Texas +Texcocan +texguino +text +textarian +textbook +textbookless +textiferous +textile +textilist +textlet +textman +textorial +textrine +textual +textualism +textualist +textuality +textually +textuarist +textuary +textural +texturally +texture +textureless +tez +Tezcatlipoca +Tezcatzoncatl +Tezcucan +tezkere +th +tha +thack +thacker +Thackerayan +Thackerayana +Thackerayesque +thackless +Thad +Thai +Thais +thakur +thakurate +thalamencephalic +thalamencephalon +thalami +thalamic +Thalamiflorae +thalamifloral +thalamiflorous +thalamite +thalamium +thalamocele +thalamocoele +thalamocortical +thalamocrural +thalamolenticular +thalamomammillary +thalamopeduncular +Thalamophora +thalamotegmental +thalamotomy +thalamus +Thalarctos +thalassal +Thalassarctos +thalassian +thalassic +thalassinid +Thalassinidea +thalassinidian +thalassinoid +thalassiophyte +thalassiophytous +thalasso +Thalassochelys +thalassocracy +thalassocrat +thalassographer +thalassographic +thalassographical +thalassography +thalassometer +thalassophilous +thalassophobia +thalassotherapy +thalattology +thalenite +thaler +Thalesia +Thalesian +Thalessa +Thalia +Thaliacea +thaliacean +Thalian +Thaliard +Thalictrum +thalli +thallic +thalliferous +thalliform +thalline +thallious +thallium +thallochlore +thallodal +thallogen +thallogenic +thallogenous +thalloid +thallome +Thallophyta +thallophyte +thallophytic +thallose +thallous +thallus +thalposis +thalpotic +thalthan +thameng +Thamesis +Thamnidium +thamnium +thamnophile +Thamnophilinae +thamnophiline +Thamnophilus +Thamnophis +Thamudean +Thamudene +Thamudic +thamuria +Thamus +Thamyras +than +thana +thanadar +thanage +thanan +thanatism +thanatist +thanatobiologic +thanatognomonic +thanatographer +thanatography +thanatoid +thanatological +thanatologist +thanatology +thanatomantic +thanatometer +thanatophidia +thanatophidian +thanatophobe +thanatophobia +thanatophobiac +thanatophoby +thanatopsis +Thanatos +thanatosis +thanatotic +thanatousia +thane +thanedom +thanehood +thaneland +thaneship +thank +thankee +thanker +thankful +thankfully +thankfulness +thankless +thanklessly +thanklessness +thanks +thanksgiver +thanksgiving +thankworthily +thankworthiness +thankworthy +thapes +Thapsia +thapsia +thar +Tharen +tharf +tharfcake +Thargelion +tharginyah +tharm +Thasian +Thaspium +that +thatch +thatcher +thatching +thatchless +thatchwood +thatchwork +thatchy +thatn +thatness +thats +thaught +Thaumantian +Thaumantias +thaumasite +thaumatogeny +thaumatography +thaumatolatry +thaumatology +thaumatrope +thaumatropical +thaumaturge +thaumaturgia +thaumaturgic +thaumaturgical +thaumaturgics +thaumaturgism +thaumaturgist +thaumaturgy +thaumoscopic +thave +thaw +thawer +thawless +thawn +thawy +The +the +Thea +Theaceae +theaceous +theah +theandric +theanthropic +theanthropical +theanthropism +theanthropist +theanthropology +theanthropophagy +theanthropos +theanthroposophy +theanthropy +thearchic +thearchy +theasum +theat +theater +theatergoer +theatergoing +theaterless +theaterlike +theaterward +theaterwards +theaterwise +Theatine +theatral +theatric +theatricable +theatrical +theatricalism +theatricality +theatricalization +theatricalize +theatrically +theatricalness +theatricals +theatrician +theatricism +theatricize +theatrics +theatrize +theatrocracy +theatrograph +theatromania +theatromaniac +theatron +theatrophile +theatrophobia +theatrophone +theatrophonic +theatropolis +theatroscope +theatry +theave +theb +Thebaic +Thebaid +thebaine +Thebais +thebaism +Theban +Thebesian +theca +thecae +thecal +Thecamoebae +thecaphore +thecasporal +thecaspore +thecaspored +thecasporous +Thecata +thecate +thecia +thecitis +thecium +Thecla +thecla +theclan +thecodont +thecoglossate +thecoid +Thecoidea +Thecophora +Thecosomata +thecosomatous +thee +theek +theeker +theelin +theelol +Theemim +theer +theet +theetsee +theezan +theft +theftbote +theftdom +theftless +theftproof +theftuous +theftuously +thegether +thegidder +thegither +thegn +thegndom +thegnhood +thegnland +thegnlike +thegnly +thegnship +thegnworthy +theiform +Theileria +theine +theinism +their +theirn +theirs +theirselves +theirsens +theism +theist +theistic +theistical +theistically +thelalgia +Thelemite +thelemite +Thelephora +Thelephoraceae +Theligonaceae +theligonaceous +Theligonum +thelitis +thelium +Thelodontidae +Thelodus +theloncus +thelorrhagia +Thelphusa +thelphusian +Thelphusidae +thelyblast +thelyblastic +thelyotokous +thelyotoky +Thelyphonidae +Thelyphonus +thelyplasty +thelytocia +thelytoky +thelytonic +them +thema +themata +thematic +thematical +thematically +thematist +theme +themeless +themelet +themer +Themis +themis +Themistian +themsel +themselves +then +thenabouts +thenadays +thenal +thenar +thenardite +thence +thenceafter +thenceforth +thenceforward +thenceforwards +thencefrom +thenceward +thenness +Theo +theoanthropomorphic +theoanthropomorphism +theoastrological +Theobald +Theobroma +theobromic +theobromine +theocentric +theocentricism +theocentrism +theochristic +theocollectivism +theocollectivist +theocracy +theocrasia +theocrasical +theocrasy +theocrat +theocratic +theocratical +theocratically +theocratist +Theocritan +Theocritean +theodemocracy +theodicaea +theodicean +theodicy +theodidact +theodolite +theodolitic +Theodora +Theodore +Theodoric +Theodosia +Theodosian +Theodotian +theodrama +theody +theogamy +theogeological +theognostic +theogonal +theogonic +theogonism +theogonist +theogony +theohuman +theokrasia +theoktonic +theoktony +theolatrous +theolatry +theolepsy +theoleptic +theologal +theologaster +theologastric +theologate +theologeion +theologer +theologi +theologian +theologic +theological +theologically +theologician +theologicoastronomical +theologicoethical +theologicohistorical +theologicometaphysical +theologicomilitary +theologicomoral +theologiconatural +theologicopolitical +theologics +theologism +theologist +theologium +theologization +theologize +theologizer +theologoumena +theologoumenon +theologue +theologus +theology +theomachia +theomachist +theomachy +theomammomist +theomancy +theomania +theomaniac +theomantic +theomastix +theomicrist +theomisanthropist +theomorphic +theomorphism +theomorphize +theomythologer +theomythology +theonomy +theopantism +Theopaschist +Theopaschitally +Theopaschite +Theopaschitic +Theopaschitism +theopathetic +theopathic +theopathy +theophagic +theophagite +theophagous +theophagy +Theophania +theophania +theophanic +theophanism +theophanous +theophany +Theophila +theophilanthrope +theophilanthropic +theophilanthropism +theophilanthropist +theophilanthropy +theophile +theophilist +theophilosophic +Theophilus +theophobia +theophoric +theophorous +Theophrastaceae +theophrastaceous +Theophrastan +Theophrastean +theophylline +theophysical +theopneust +theopneusted +theopneustia +theopneustic +theopneusty +theopolitician +theopolitics +theopolity +theopsychism +theorbist +theorbo +theorem +theorematic +theorematical +theorematically +theorematist +theoremic +theoretic +theoretical +theoreticalism +theoretically +theoretician +theoreticopractical +theoretics +theoria +theoriai +theoric +theorical +theorically +theorician +theoricon +theorics +theorism +theorist +theorization +theorize +theorizer +theorum +theory +theoryless +theorymonger +theosoph +theosopheme +theosophic +theosophical +theosophically +theosophism +theosophist +theosophistic +theosophistical +theosophize +theosophy +theotechnic +theotechnist +theotechny +theoteleological +theoteleology +theotherapy +Theotokos +theow +theowdom +theowman +Theraean +theralite +therapeusis +Therapeutae +Therapeutic +therapeutic +therapeutical +therapeutically +therapeutics +therapeutism +therapeutist +Theraphosa +theraphose +theraphosid +Theraphosidae +theraphosoid +therapist +therapsid +Therapsida +therapy +therblig +there +thereabouts +thereabove +thereacross +thereafter +thereafterward +thereagainst +thereamong +thereamongst +thereanent +thereanents +therearound +thereas +thereat +thereaway +thereaways +therebeside +therebesides +therebetween +thereby +thereckly +therefor +therefore +therefrom +therehence +therein +thereinafter +thereinbefore +thereinto +therence +thereness +thereof +thereoid +thereologist +thereology +thereon +thereout +thereover +thereright +theres +Theresa +therese +therethrough +theretill +thereto +theretofore +theretoward +thereunder +thereuntil +thereunto +thereup +thereupon +Thereva +therevid +Therevidae +therewhile +therewith +therewithal +therewithin +Theria +theriac +theriaca +theriacal +therial +therianthropic +therianthropism +theriatrics +theridiid +Theridiidae +Theridion +theriodic +theriodont +Theriodonta +Theriodontia +theriolatry +theriomancy +theriomaniac +theriomimicry +theriomorph +theriomorphic +theriomorphism +theriomorphosis +theriomorphous +theriotheism +theriotrophical +theriozoic +therm +thermacogenesis +thermae +thermal +thermalgesia +thermality +thermally +thermanalgesia +thermanesthesia +thermantic +thermantidote +thermatologic +thermatologist +thermatology +thermesthesia +thermesthesiometer +thermetograph +thermetrograph +thermic +thermically +Thermidorian +thermion +thermionic +thermionically +thermionics +thermistor +Thermit +thermit +thermite +thermo +thermoammeter +thermoanalgesia +thermoanesthesia +thermobarograph +thermobarometer +thermobattery +thermocautery +thermochemic +thermochemical +thermochemically +thermochemist +thermochemistry +thermochroic +thermochrosy +thermocline +thermocouple +thermocurrent +thermodiffusion +thermoduric +thermodynamic +thermodynamical +thermodynamically +thermodynamician +thermodynamicist +thermodynamics +thermodynamist +thermoelectric +thermoelectrical +thermoelectrically +thermoelectricity +thermoelectrometer +thermoelectromotive +thermoelement +thermoesthesia +thermoexcitory +thermogalvanometer +thermogen +thermogenerator +thermogenesis +thermogenetic +thermogenic +thermogenous +thermogeny +thermogeographical +thermogeography +thermogram +thermograph +thermography +thermohyperesthesia +thermojunction +thermokinematics +thermolabile +thermolability +thermological +thermology +thermoluminescence +thermoluminescent +thermolysis +thermolytic +thermolyze +thermomagnetic +thermomagnetism +thermometamorphic +thermometamorphism +thermometer +thermometerize +thermometric +thermometrical +thermometrically +thermometrograph +thermometry +thermomotive +thermomotor +thermomultiplier +thermonastic +thermonasty +thermonatrite +thermoneurosis +thermoneutrality +thermonous +thermonuclear +thermopair +thermopalpation +thermopenetration +thermoperiod +thermoperiodic +thermoperiodicity +thermoperiodism +thermophile +thermophilic +thermophilous +thermophobous +thermophone +thermophore +thermophosphor +thermophosphorescence +thermopile +thermoplastic +thermoplasticity +thermoplegia +thermopleion +thermopolymerization +thermopolypnea +thermopolypneic +Thermopsis +thermoradiotherapy +thermoreduction +thermoregulation +thermoregulator +thermoresistance +thermoresistant +thermos +thermoscope +thermoscopic +thermoscopical +thermoscopically +thermosetting +thermosiphon +thermostability +thermostable +thermostat +thermostatic +thermostatically +thermostatics +thermostimulation +thermosynthesis +thermosystaltic +thermosystaltism +thermotactic +thermotank +thermotaxic +thermotaxis +thermotelephone +thermotensile +thermotension +thermotherapeutics +thermotherapy +thermotic +thermotical +thermotically +thermotics +thermotropic +thermotropism +thermotropy +thermotype +thermotypic +thermotypy +thermovoltaic +therodont +theroid +therolatry +therologic +therological +therologist +therology +Theromora +Theromores +theromorph +Theromorpha +theromorphia +theromorphic +theromorphism +theromorphological +theromorphology +theromorphous +Theron +theropod +Theropoda +theropodous +thersitean +Thersites +thersitical +thesauri +thesaurus +these +Thesean +theses +Theseum +Theseus +thesial +thesicle +thesis +Thesium +Thesmophoria +Thesmophorian +Thesmophoric +thesmothetae +thesmothete +thesmothetes +thesocyte +Thespesia +Thespesius +Thespian +Thessalian +Thessalonian +thestreen +theta +thetch +thetic +thetical +thetically +thetics +thetin +thetine +Thetis +theurgic +theurgical +theurgically +theurgist +theurgy +Thevetia +thevetin +thew +thewed +thewless +thewness +thewy +they +theyll +theyre +thiacetic +thiadiazole +thialdine +thiamide +thiamin +thiamine +thianthrene +thiasi +thiasine +thiasite +thiasoi +thiasos +thiasote +thiasus +thiazine +thiazole +thiazoline +thick +thickbrained +thicken +thickener +thickening +thicket +thicketed +thicketful +thickety +thickhead +thickheaded +thickheadedly +thickheadedness +thickish +thickleaf +thicklips +thickly +thickneck +thickness +thicknessing +thickset +thickskin +thickskull +thickskulled +thickwind +thickwit +thief +thiefcraft +thiefdom +thiefland +thiefmaker +thiefmaking +thiefproof +thieftaker +thiefwise +Thielavia +Thielaviopsis +thienone +thienyl +Thierry +thievable +thieve +thieveless +thiever +thievery +thieving +thievingly +thievish +thievishly +thievishness +thig +thigger +thigging +thigh +thighbone +thighed +thight +thightness +thigmonegative +thigmopositive +thigmotactic +thigmotactically +thigmotaxis +thigmotropic +thigmotropically +thigmotropism +Thilanottine +thilk +thill +thiller +thilly +thimber +thimble +thimbleberry +thimbled +thimbleflower +thimbleful +thimblelike +thimblemaker +thimblemaking +thimbleman +thimblerig +thimblerigger +thimbleriggery +thimblerigging +thimbleweed +thin +thinbrained +thine +thing +thingal +thingamabob +thinghood +thinginess +thingish +thingless +thinglet +thinglike +thinglikeness +thingliness +thingly +thingman +thingness +thingstead +thingum +thingumajig +thingumbob +thingummy +thingy +Think +think +thinkable +thinkableness +thinkably +thinker +thinkful +thinking +thinkingly +thinkingpart +thinkling +thinly +thinner +thinness +thinning +thinnish +Thinocoridae +Thinocorus +thinolite +thio +thioacetal +thioacetic +thioalcohol +thioaldehyde +thioamide +thioantimonate +thioantimoniate +thioantimonious +thioantimonite +thioarsenate +thioarseniate +thioarsenic +thioarsenious +thioarsenite +Thiobacillus +Thiobacteria +thiobacteria +Thiobacteriales +thiobismuthite +thiocarbamic +thiocarbamide +thiocarbamyl +thiocarbanilide +thiocarbimide +thiocarbonate +thiocarbonic +thiocarbonyl +thiochloride +thiochrome +thiocresol +thiocyanate +thiocyanation +thiocyanic +thiocyanide +thiocyano +thiocyanogen +thiodiazole +thiodiphenylamine +thiofuran +thiofurane +thiofurfuran +thiofurfurane +thiogycolic +thiohydrate +thiohydrolysis +thiohydrolyze +thioindigo +thioketone +thiol +thiolacetic +thiolactic +thiolic +thionamic +thionaphthene +thionate +thionation +thioneine +thionic +thionine +thionitrite +thionium +thionobenzoic +thionthiolic +thionurate +thionyl +thionylamine +thiophen +thiophene +thiophenic +thiophenol +thiophosgene +thiophosphate +thiophosphite +thiophosphoric +thiophosphoryl +thiophthene +thiopyran +thioresorcinol +thiosinamine +Thiospira +thiostannate +thiostannic +thiostannite +thiostannous +thiosulphate +thiosulphonic +thiosulphuric +Thiothrix +thiotolene +thiotungstate +thiotungstic +thiouracil +thiourea +thiourethan +thiourethane +thioxene +thiozone +thiozonide +thir +third +thirdborough +thirdings +thirdling +thirdly +thirdness +thirdsman +thirl +thirlage +thirling +thirst +thirster +thirstful +thirstily +thirstiness +thirsting +thirstingly +thirstland +thirstle +thirstless +thirstlessness +thirstproof +thirsty +thirt +thirteen +thirteener +thirteenfold +thirteenth +thirteenthly +thirtieth +thirty +thirtyfold +thirtyish +this +thishow +thislike +thisn +thisness +thissen +thistle +thistlebird +thistled +thistledown +thistlelike +thistleproof +thistlery +thistlish +thistly +thiswise +thither +thitherto +thitherward +thitsiol +thiuram +thivel +thixle +thixolabile +thixotropic +thixotropy +Thlaspi +Thlingchadinne +Thlinget +thlipsis +Tho +tho +thob +thocht +thof +thoft +thoftfellow +thoke +thokish +thole +tholeiite +tholepin +tholi +tholoi +tholos +tholus +Thomaean +Thomas +Thomasa +Thomasine +thomasing +Thomasite +thomisid +Thomisidae +Thomism +Thomist +Thomistic +Thomistical +Thomite +Thomomys +thomsenolite +Thomsonian +Thomsonianism +thomsonite +thon +thonder +Thondracians +Thondraki +Thondrakians +thone +thong +Thonga +thonged +thongman +thongy +thoo +thooid +thoom +thoracalgia +thoracaorta +thoracectomy +thoracentesis +thoraces +thoracic +Thoracica +thoracical +thoracicoabdominal +thoracicoacromial +thoracicohumeral +thoracicolumbar +thoraciform +thoracispinal +thoracoabdominal +thoracoacromial +thoracobronchotomy +thoracoceloschisis +thoracocentesis +thoracocyllosis +thoracocyrtosis +thoracodelphus +thoracodidymus +thoracodorsal +thoracodynia +thoracogastroschisis +thoracograph +thoracohumeral +thoracolumbar +thoracolysis +thoracomelus +thoracometer +thoracometry +thoracomyodynia +thoracopagus +thoracoplasty +thoracoschisis +thoracoscope +thoracoscopy +Thoracostei +thoracostenosis +thoracostomy +Thoracostraca +thoracostracan +thoracostracous +thoracotomy +thoral +thorascope +thorax +thore +thoria +thorianite +thoriate +thoric +thoriferous +thorina +thorite +thorium +thorn +thornback +thornbill +thornbush +thorned +thornen +thornhead +thornily +thorniness +thornless +thornlessness +thornlet +thornlike +thornproof +thornstone +thorntail +thorny +thoro +thorocopagous +thorogummite +thoron +thorough +Thoroughbred +thoroughbred +thoroughbredness +thoroughfare +thoroughfarer +thoroughfaresome +thoroughfoot +thoroughgoing +thoroughgoingly +thoroughgoingness +thoroughgrowth +thoroughly +thoroughness +thoroughpaced +thoroughpin +thoroughsped +thoroughstem +thoroughstitch +thoroughstitched +thoroughwax +thoroughwort +thorp +thort +thorter +thortveitite +Thos +Those +those +thou +though +thought +thoughted +thoughten +thoughtful +thoughtfully +thoughtfulness +thoughtkin +thoughtless +thoughtlessly +thoughtlessness +thoughtlet +thoughtness +thoughtsick +thoughty +thousand +thousandfold +thousandfoldly +thousandth +thousandweight +thouse +thow +thowel +thowless +thowt +Thraces +Thracian +thrack +thraep +thrail +thrain +thrall +thrallborn +thralldom +thram +thrammle +thrang +thrangity +thranite +thranitic +thrap +thrapple +thrash +thrashel +thrasher +thrasherman +thrashing +thrasonic +thrasonical +thrasonically +thrast +Thraupidae +thrave +thraver +thraw +thrawcrook +thrawn +thrawneen +Thrax +thread +threadbare +threadbareness +threadbarity +threaded +threaden +threader +threadfin +threadfish +threadflower +threadfoot +threadiness +threadle +threadless +threadlet +threadlike +threadmaker +threadmaking +threadway +threadweed +threadworm +thready +threap +threaper +threat +threaten +threatenable +threatener +threatening +threateningly +threatful +threatfully +threatless +threatproof +three +threefold +threefolded +threefoldedness +threefoldly +threefoldness +threeling +threeness +threepence +threepenny +threepennyworth +threescore +threesome +thremmatology +threne +threnetic +threnetical +threnode +threnodial +threnodian +threnodic +threnodical +threnodist +threnody +threnos +threonin +threonine +threose +threpsology +threptic +thresh +threshel +thresher +thresherman +threshingtime +threshold +Threskiornithidae +Threskiornithinae +threw +thribble +thrice +thricecock +thridacium +thrift +thriftbox +thriftily +thriftiness +thriftless +thriftlessly +thriftlessness +thriftlike +thrifty +thrill +thriller +thrillful +thrillfully +thrilling +thrillingly +thrillingness +thrillproof +thrillsome +thrilly +thrimble +thrimp +Thrinax +thring +thrinter +thrioboly +thrip +thripel +Thripidae +thripple +thrips +thrive +thriveless +thriven +thriver +thriving +thrivingly +thrivingness +thro +throat +throatal +throatband +throated +throatful +throatily +throatiness +throating +throatlash +throatlatch +throatless +throatlet +throatroot +throatstrap +throatwort +throaty +throb +throbber +throbbingly +throbless +throck +throdden +throddy +throe +thrombase +thrombin +thromboangiitis +thromboarteritis +thrombocyst +thrombocyte +thrombocytopenia +thrombogen +thrombogenic +thromboid +thrombokinase +thrombolymphangitis +thrombopenia +thrombophlebitis +thromboplastic +thromboplastin +thrombose +thrombosis +thrombostasis +thrombotic +thrombus +thronal +throne +thronedom +throneless +thronelet +thronelike +throneward +throng +thronger +throngful +throngingly +thronize +thropple +throstle +throstlelike +throttle +throttler +throttling +throttlingly +throu +throuch +throucht +through +throughbear +throughbred +throughcome +throughgang +throughganging +throughgoing +throughgrow +throughknow +throughout +throughput +throve +throw +throwaway +throwback +throwdown +thrower +throwing +thrown +throwoff +throwout +throwster +throwwort +thrum +thrummer +thrummers +thrummy +thrumwort +thrush +thrushel +thrushlike +thrushy +thrust +thruster +thrustful +thrustfulness +thrusting +thrustings +thrutch +thrutchings +Thruthvang +thruv +thrymsa +Thryonomys +Thuan +Thuban +Thucydidean +thud +thudding +thuddingly +thug +thugdom +thuggee +thuggeeism +thuggery +thuggess +thuggish +thuggism +Thuidium +Thuja +thujene +thujin +thujone +Thujopsis +thujyl +Thule +thulia +thulir +thulite +thulium +thulr +thuluth +thumb +thumbbird +thumbed +thumber +thumbkin +thumble +thumbless +thumblike +thumbmark +thumbnail +thumbpiece +thumbprint +thumbrope +thumbscrew +thumbstall +thumbstring +thumbtack +thumby +thumlungur +thump +thumper +thumping +thumpingly +Thunar +Thunbergia +thunbergilene +thunder +thunderation +thunderball +thunderbearer +thunderbearing +thunderbird +thunderblast +thunderbolt +thunderburst +thunderclap +thundercloud +thundercrack +thunderer +thunderfish +thunderflower +thunderful +thunderhead +thunderheaded +thundering +thunderingly +thunderless +thunderlike +thunderous +thunderously +thunderousness +thunderpeal +thunderplump +thunderproof +thundershower +thundersmite +thundersquall +thunderstick +thunderstone +thunderstorm +thunderstrike +thunderstroke +thunderstruck +thunderwood +thunderworm +thunderwort +thundery +thundrous +thundrously +thung +thunge +Thunnidae +Thunnus +Thunor +thuoc +Thurberia +thurible +thuribuler +thuribulum +thurifer +thuriferous +thurificate +thurificati +thurification +thurify +Thuringian +thuringite +Thurio +thurl +thurm +thurmus +Thurnia +Thurniaceae +thurrock +Thursday +thurse +thurt +thus +thusgate +Thushi +thusly +thusness +thuswise +thutter +Thuyopsis +thwack +thwacker +thwacking +thwackingly +thwackstave +thwaite +thwart +thwartedly +thwarteous +thwarter +thwarting +thwartingly +thwartly +thwartman +thwartness +thwartover +thwartsaw +thwartship +thwartships +thwartways +thwartwise +thwite +thwittle +thy +Thyestean +Thyestes +thyine +thylacine +thylacitis +Thylacoleo +Thylacynus +thymacetin +Thymallidae +Thymallus +thymate +thyme +thymectomize +thymectomy +thymegol +Thymelaea +Thymelaeaceae +thymelaeaceous +Thymelaeales +thymelcosis +thymele +thymelic +thymelical +thymelici +thymene +thymetic +thymic +thymicolymphatic +thymine +thymiosis +thymitis +thymocyte +thymogenic +thymol +thymolate +thymolize +thymolphthalein +thymolsulphonephthalein +thymoma +thymonucleic +thymopathy +thymoprivic +thymoprivous +thymopsyche +thymoquinone +thymotactic +thymotic +Thymus +thymus +thymy +thymyl +thymylic +thynnid +Thynnidae +Thyraden +thyratron +thyreoadenitis +thyreoantitoxin +thyreoarytenoid +thyreoarytenoideus +thyreocervical +thyreocolloid +Thyreocoridae +thyreoepiglottic +thyreogenic +thyreogenous +thyreoglobulin +thyreoglossal +thyreohyal +thyreohyoid +thyreoid +thyreoidal +thyreoideal +thyreoidean +thyreoidectomy +thyreoiditis +thyreoitis +thyreolingual +thyreoprotein +thyreosis +thyreotomy +thyreotoxicosis +thyreotropic +thyridial +Thyrididae +thyridium +Thyris +thyrisiferous +thyroadenitis +thyroantitoxin +thyroarytenoid +thyroarytenoideus +thyrocardiac +thyrocele +thyrocervical +thyrocolloid +thyrocricoid +thyroepiglottic +thyroepiglottidean +thyrogenic +thyroglobulin +thyroglossal +thyrohyal +thyrohyoid +thyrohyoidean +thyroid +thyroidal +thyroidea +thyroideal +thyroidean +thyroidectomize +thyroidectomy +thyroidism +thyroiditis +thyroidization +thyroidless +thyroidotomy +thyroiodin +thyrolingual +thyronine +thyroparathyroidectomize +thyroparathyroidectomy +thyroprival +thyroprivia +thyroprivic +thyroprivous +thyroprotein +Thyrostraca +thyrostracan +thyrotherapy +thyrotomy +thyrotoxic +thyrotoxicosis +thyrotropic +thyroxine +thyrse +thyrsiflorous +thyrsiform +thyrsoid +thyrsoidal +thyrsus +Thysanocarpus +thysanopter +Thysanoptera +thysanopteran +thysanopteron +thysanopterous +Thysanoura +thysanouran +thysanourous +Thysanura +thysanuran +thysanurian +thysanuriform +thysanurous +thysel +thyself +thysen +Ti +ti +Tiahuanacan +Tiam +tiang +tiao +tiar +tiara +tiaralike +tiarella +Tiatinagua +tib +Tibbie +Tibbu +tibby +Tiberian +Tiberine +Tiberius +tibet +Tibetan +tibey +tibia +tibiad +tibiae +tibial +tibiale +tibicinist +tibiocalcanean +tibiofemoral +tibiofibula +tibiofibular +tibiometatarsal +tibionavicular +tibiopopliteal +tibioscaphoid +tibiotarsal +tibiotarsus +Tibouchina +tibourbou +tiburon +Tiburtine +tic +tical +ticca +tice +ticement +ticer +Tichodroma +tichodrome +tichorrhine +tick +tickbean +tickbird +tickeater +ticked +ticken +ticker +ticket +ticketer +ticketing +ticketless +ticketmonger +tickey +tickicide +tickie +ticking +tickle +tickleback +ticklebrain +tickled +ticklely +ticklenburg +tickleness +tickleproof +tickler +ticklesome +tickless +tickleweed +tickling +ticklingly +ticklish +ticklishly +ticklishness +tickly +tickney +tickproof +tickseed +tickseeded +ticktack +ticktacker +ticktacktoe +ticktick +ticktock +tickweed +ticky +ticul +Ticuna +Ticunan +tid +tidal +tidally +tidbit +tiddle +tiddledywinks +tiddler +tiddley +tiddling +tiddlywink +tiddlywinking +tiddy +tide +tided +tideful +tidehead +tideland +tideless +tidelessness +tidelike +tidely +tidemaker +tidemaking +tidemark +tiderace +tidesman +tidesurveyor +Tideswell +tidewaiter +tidewaitership +tideward +tidewater +tideway +tidiable +tidily +tidiness +tiding +tidingless +tidings +tidley +tidological +tidology +tidy +tidyism +tidytips +tie +tieback +tied +Tiefenthal +tiemaker +tiemaking +tiemannite +tien +tiepin +tier +tierce +tierced +tierceron +tiered +tierer +tierlike +tiersman +tietick +tiewig +tiewigged +tiff +tiffany +tiffanyite +tiffie +tiffin +tiffish +tiffle +tiffy +tifinagh +tift +tifter +tig +tige +tigella +tigellate +tigelle +tigellum +tigellus +tiger +tigerbird +tigereye +tigerflower +tigerfoot +tigerhearted +tigerhood +tigerish +tigerishly +tigerishness +tigerism +tigerkin +tigerlike +tigerling +tigerly +tigernut +tigerproof +tigerwood +tigery +Tigger +tigger +tight +tighten +tightener +tightfisted +tightish +tightly +tightness +tightrope +tights +tightwad +tightwire +tiglaldehyde +tiglic +tiglinic +tignum +Tigrai +Tigre +Tigrean +tigress +tigresslike +Tigridia +Tigrina +tigrine +Tigris +tigroid +tigrolysis +tigrolytic +tigtag +Tigua +Tigurine +Tiki +tikitiki +tikka +tikker +tiklin +tikolosh +tikor +tikur +til +tilaite +tilaka +tilasite +tilbury +Tilda +tilde +tile +tiled +tilefish +tilelike +tilemaker +tilemaking +tiler +tileroot +tilery +tileseed +tilestone +tileways +tilework +tileworks +tilewright +tileyard +Tilia +Tiliaceae +tiliaceous +tilikum +tiling +till +tillable +Tillaea +Tillaeastrum +tillage +Tillamook +Tillandsia +tiller +tillering +tillerless +tillerman +Tilletia +Tilletiaceae +tilletiaceous +tilley +tillite +tillodont +Tillodontia +Tillodontidae +tillot +tillotter +tilly +tilmus +tilpah +Tilsit +tilt +tiltable +tiltboard +tilter +tilth +tilting +tiltlike +tiltmaker +tiltmaking +tiltup +tilty +tiltyard +tilyer +Tim +timable +Timaeus +Timalia +Timaliidae +Timaliinae +timaliine +timaline +Timani +timar +timarau +timawa +timazite +timbal +timbale +timbang +timbe +timber +timbered +timberer +timberhead +timbering +timberjack +timberland +timberless +timberlike +timberling +timberman +timbermonger +timbern +timbersome +timbertuned +timberwood +timberwork +timberwright +timbery +timberyard +Timbira +timbo +timbre +timbrel +timbreled +timbreler +timbrologist +timbrology +timbromania +timbromaniac +timbromanist +timbrophilic +timbrophilism +timbrophilist +timbrophily +time +timeable +timecard +timed +timeful +timefully +timefulness +timekeep +timekeeper +timekeepership +timeless +timelessly +timelessness +Timelia +Timeliidae +timeliine +timelily +timeliness +timeling +timely +timenoguy +timeous +timeously +timepiece +timepleaser +timeproof +timer +times +timesaver +timesaving +timeserver +timeserving +timeservingness +timetable +timetaker +timetaking +timeward +timework +timeworker +timeworn +Timias +timid +timidity +timidly +timidness +timing +timish +timist +Timne +Timo +timocracy +timocratic +timocratical +Timon +timon +timoneer +Timonian +Timonism +Timonist +Timonize +timor +Timorese +timorous +timorously +timorousness +Timote +Timotean +Timothean +Timothy +timothy +timpani +timpanist +timpano +Timucua +Timucuan +Timuquan +Timuquanan +tin +Tina +Tinamidae +tinamine +tinamou +tinampipi +tincal +tinchel +tinchill +tinclad +tinct +tinction +tinctorial +tinctorially +tinctorious +tinctumutation +tincture +tind +tindal +tindalo +tinder +tinderbox +tindered +tinderish +tinderlike +tinderous +tindery +tine +tinea +tineal +tinean +tined +tinegrass +tineid +Tineidae +Tineina +tineine +tineman +tineoid +Tineoidea +tinetare +tinety +tineweed +tinful +Ting +ting +tinge +tinged +tinger +Tinggian +tingi +tingibility +tingible +tingid +Tingidae +Tingis +tingitid +Tingitidae +tinglass +tingle +tingler +tingletangle +tingling +tinglingly +tinglish +tingly +tingtang +tinguaite +tinguaitic +Tinguian +tinguy +tinhorn +tinhouse +tinily +tininess +tining +tink +tinker +tinkerbird +tinkerdom +tinkerer +tinkerlike +tinkerly +tinkershire +tinkershue +tinkerwise +tinkle +tinkler +tinklerman +tinkling +tinklingly +tinkly +tinlet +tinlike +tinman +Tinne +tinned +tinner +tinnery +tinnet +Tinni +tinnified +tinnily +tinniness +tinning +tinnitus +tinnock +tinny +Tino +Tinoceras +tinosa +tinsel +tinsellike +tinselly +tinselmaker +tinselmaking +tinselry +tinselweaver +tinselwork +tinsman +tinsmith +tinsmithing +tinsmithy +tinstone +tinstuff +tint +tinta +tintage +tintamarre +tintarron +tinted +tinter +tintie +tintiness +tinting +tintingly +tintinnabula +tintinnabulant +tintinnabular +tintinnabulary +tintinnabulate +tintinnabulation +tintinnabulatory +tintinnabulism +tintinnabulist +tintinnabulous +tintinnabulum +tintist +tintless +tintometer +tintometric +tintometry +tinty +tintype +tintyper +tinwald +tinware +tinwoman +tinwork +tinworker +tinworking +tiny +tinzenite +Tionontates +Tionontati +Tiou +tip +tipburn +tipcart +tipcat +tipe +tipful +tiphead +Tiphia +Tiphiidae +tipiti +tiple +tipless +tiplet +tipman +tipmost +tiponi +tippable +tipped +tippee +tipper +tippet +tipping +tipple +tippleman +tippler +tipply +tipproof +tippy +tipsification +tipsifier +tipsify +tipsily +tipsiness +tipstaff +tipster +tipstock +tipsy +tiptail +tipteerer +tiptilt +tiptoe +tiptoeing +tiptoeingly +tiptop +tiptopness +tiptopper +tiptoppish +tiptoppishness +tiptopsome +Tipula +Tipularia +tipulid +Tipulidae +tipuloid +Tipuloidea +tipup +Tipura +tirade +tiralee +tire +tired +tiredly +tiredness +tiredom +tirehouse +tireless +tirelessly +tirelessness +tiremaid +tiremaker +tiremaking +tireman +tirer +tireroom +tiresmith +tiresome +tiresomely +tiresomeness +tiresomeweed +tirewoman +Tirhutia +tiriba +tiring +tiringly +tirl +tirma +tirocinium +Tirolean +Tirolese +Tironian +tirr +tirralirra +tirret +Tirribi +tirrivee +tirrlie +tirrwirr +tirthankara +Tirurai +tirve +tirwit +tisane +tisar +Tishiya +Tishri +Tisiphone +tissual +tissue +tissued +tissueless +tissuelike +tissuey +tisswood +tiswin +tit +Titan +titanate +titanaugite +Titanesque +Titaness +titania +Titanian +Titanic +titanic +Titanical +Titanically +Titanichthyidae +Titanichthys +titaniferous +titanifluoride +Titanism +titanite +titanitic +titanium +Titanlike +titano +titanocolumbate +titanocyanide +titanofluoride +Titanolater +Titanolatry +Titanomachia +Titanomachy +titanomagnetite +titanoniobate +titanosaur +Titanosaurus +titanosilicate +titanothere +Titanotheridae +Titanotherium +titanous +titanyl +titar +titbit +titbitty +tite +titer +titeration +titfish +tithable +tithal +tithe +tithebook +titheless +tithemonger +tithepayer +tither +titheright +tithing +tithingman +tithingpenny +tithonic +tithonicity +tithonographic +tithonometer +Tithymalopsis +Tithymalus +titi +Titian +titian +Titianesque +Titianic +titien +Tities +titilate +titillability +titillant +titillater +titillating +titillatingly +titillation +titillative +titillator +titillatory +titivate +titivation +titivator +titlark +title +titleboard +titled +titledom +titleholder +titleless +titleproof +titler +titleship +titlike +titling +titlist +titmal +titman +Titmarsh +Titmarshian +titmouse +Titoism +Titoist +titoki +titrable +titratable +titrate +titration +titre +titrimetric +titrimetry +titter +titterel +titterer +tittering +titteringly +tittery +tittie +tittle +tittlebat +tittler +tittup +tittupy +titty +tittymouse +titubancy +titubant +titubantly +titubate +titubation +titular +titularity +titularly +titulary +titulation +titule +titulus +Titurel +Titus +tiver +Tivoli +tivoli +tivy +Tiwaz +tiza +tizeur +tizzy +tjanting +tji +tjosite +tlaco +Tlakluit +Tlapallan +Tlascalan +Tlingit +tmema +Tmesipteris +tmesis +to +toa +toad +toadback +toadeat +toadeater +toader +toadery +toadess +toadfish +toadflax +toadflower +toadhead +toadier +toadish +toadless +toadlet +toadlike +toadlikeness +toadling +toadpipe +toadroot +toadship +toadstone +toadstool +toadstoollike +toadwise +toady +toadyish +toadyism +toadyship +Toag +toast +toastable +toastee +toaster +toastiness +toastmaster +toastmastery +toastmistress +toasty +toat +toatoa +Toba +tobacco +tobaccofied +tobaccoism +tobaccoite +tobaccoless +tobaccolike +tobaccoman +tobacconalian +tobacconist +tobacconistical +tobacconize +tobaccophil +tobaccoroot +tobaccoweed +tobaccowood +tobaccoy +tobe +Tobiah +Tobias +Tobikhar +tobine +tobira +toboggan +tobogganeer +tobogganer +tobogganist +Toby +toby +tobyman +tocalote +toccata +Tocharese +Tocharian +Tocharic +Tocharish +tocher +tocherless +tock +toco +Tocobaga +tocodynamometer +tocogenetic +tocogony +tocokinin +tocological +tocologist +tocology +tocome +tocometer +tocopherol +tocororo +tocsin +tocusso +Tod +tod +Toda +today +todayish +Todd +todder +toddick +toddite +toddle +toddlekins +toddler +toddy +toddyize +toddyman +tode +Todea +Todidae +Todus +tody +toe +toeboard +toecap +toecapped +toed +toeless +toelike +toellite +toenail +toeplate +Toerless +toernebohmite +toetoe +toff +toffee +toffeeman +toffing +toffish +toffy +toffyman +Tofieldia +Toft +toft +tofter +toftman +toftstead +tofu +tog +toga +togaed +togalike +togata +togate +togated +togawise +together +togetherhood +togetheriness +togetherness +toggel +toggery +toggle +toggler +togless +togs +togt +togue +toher +toheroa +toho +Tohome +tohubohu +tohunga +toi +toil +toiled +toiler +toilet +toileted +toiletry +toilette +toiletted +toiletware +toilful +toilfully +toilinet +toiling +toilingly +toilless +toillessness +toilsome +toilsomely +toilsomeness +toilworn +toise +toit +toitish +toity +Tokay +tokay +toke +Tokelau +token +tokened +tokenless +toko +tokology +tokonoma +tokopat +tol +tolamine +tolan +tolane +tolbooth +told +toldo +tole +Toledan +Toledo +Toledoan +tolerability +tolerable +tolerableness +tolerablish +tolerably +tolerance +tolerancy +Tolerant +tolerant +tolerantism +tolerantly +tolerate +toleration +tolerationism +tolerationist +tolerative +tolerator +tolerism +Toletan +tolfraedic +tolguacha +tolidine +tolite +toll +tollable +tollage +tollbooth +Tollefsen +toller +tollery +tollgate +tollgatherer +tollhouse +tolliker +tolling +tollkeeper +tollman +tollmaster +tollpenny +tolltaker +tolly +Tolowa +tolpatch +tolpatchery +tolsester +tolsey +Tolstoyan +Tolstoyism +Tolstoyist +tolt +Toltec +Toltecan +tolter +tolu +tolualdehyde +toluate +toluene +toluic +toluide +toluidide +toluidine +toluidino +toluido +Toluifera +tolunitrile +toluol +toluquinaldine +tolusafranine +toluyl +toluylene +toluylenediamine +toluylic +tolyl +tolylene +tolylenediamine +Tolypeutes +tolypeutine +Tom +Toma +tomahawk +tomahawker +tomalley +toman +Tomas +tomatillo +tomato +tomb +tombac +tombal +tombe +tombic +tombless +tomblet +tomblike +tombola +tombolo +tomboy +tomboyful +tomboyish +tomboyishly +tomboyishness +tomboyism +tombstone +tomcat +tomcod +tome +tomeful +tomelet +toment +tomentose +tomentous +tomentulose +tomentum +tomfool +tomfoolery +tomfoolish +tomfoolishness +tomial +tomin +tomish +Tomistoma +tomium +tomjohn +Tomkin +tomkin +Tommer +Tomming +Tommy +tommy +tommybag +tommycod +tommyrot +tomnoddy +tomnoup +tomogram +tomographic +tomography +Tomopteridae +Tomopteris +tomorn +tomorrow +tomorrower +tomorrowing +tomorrowness +tomosis +Tompion +tompiper +tompon +tomtate +tomtit +Tomtitmouse +ton +tonal +tonalamatl +tonalist +tonalite +tonalitive +tonality +tonally +tonant +tonation +tondino +tone +toned +toneless +tonelessly +tonelessness +toneme +toneproof +toner +tonetic +tonetically +tonetician +tonetics +tong +Tonga +tonga +Tongan +Tongas +tonger +tongkang +tongman +Tongrian +tongs +tongsman +tongue +tonguecraft +tongued +tonguedoughty +tonguefence +tonguefencer +tongueflower +tongueful +tongueless +tonguelet +tonguelike +tongueman +tonguemanship +tongueplay +tongueproof +tonguer +tongueshot +tonguesman +tonguesore +tonguester +tonguetip +tonguey +tonguiness +tonguing +tonic +tonically +tonicity +tonicize +tonicobalsamic +tonicoclonic +tonicostimulant +tonify +tonight +Tonikan +tonish +tonishly +tonishness +tonite +tonitrocirrus +tonitruant +tonitruone +tonitruous +tonjon +tonk +Tonkawa +Tonkawan +tonkin +Tonkinese +tonlet +Tonna +tonnage +tonneau +tonneaued +tonner +tonnish +tonnishly +tonnishness +tonoclonic +tonogram +tonograph +tonological +tonology +tonometer +tonometric +tonometry +tonophant +tonoplast +tonoscope +tonotactic +tonotaxis +tonous +tonsbergite +tonsil +tonsilectomy +tonsilitic +tonsillar +tonsillary +tonsillectome +tonsillectomic +tonsillectomize +tonsillectomy +tonsillith +tonsillitic +tonsillitis +tonsillolith +tonsillotome +tonsillotomy +tonsilomycosis +tonsor +tonsorial +tonsurate +tonsure +tonsured +tontine +tontiner +Tonto +tonus +Tony +tony +tonyhoop +too +toodle +toodleloodle +took +tooken +tool +toolbox +toolbuilder +toolbuilding +tooler +toolhead +toolholder +toolholding +tooling +toolless +toolmaker +toolmaking +toolman +toolmark +toolmarking +toolplate +toolroom +toolsetter +toolslide +toolsmith +toolstock +toolstone +toom +toomly +toon +Toona +toonwood +toop +toorie +toorock +tooroo +toosh +toot +tooter +tooth +toothache +toothaching +toothachy +toothbill +toothbrush +toothbrushy +toothchiseled +toothcomb +toothcup +toothdrawer +toothdrawing +toothed +toother +toothflower +toothful +toothill +toothing +toothless +toothlessly +toothlessness +toothlet +toothleted +toothlike +toothpick +toothplate +toothproof +toothsome +toothsomely +toothsomeness +toothstick +toothwash +toothwork +toothwort +toothy +tootle +tootler +tootlish +tootsy +toozle +toozoo +top +topalgia +toparch +toparchia +toparchical +toparchy +topass +Topatopa +topaz +topazfels +topazine +topazite +topazolite +topazy +topcap +topcast +topchrome +topcoat +topcoating +tope +topectomy +topee +topeewallah +topeng +topepo +toper +toperdom +topesthesia +topflight +topfull +topgallant +toph +tophaceous +tophaike +Tophet +tophetic +tophetize +tophus +tophyperidrosis +topi +topia +topiarian +topiarist +topiarius +topiary +topic +topical +topicality +topically +topinambou +Topinish +topknot +topknotted +topless +toplighted +toplike +topline +toploftical +toploftily +toploftiness +toplofty +topmaker +topmaking +topman +topmast +topmost +topmostly +topnotch +topnotcher +topo +topoalgia +topochemical +topognosia +topognosis +topograph +topographer +topographic +topographical +topographically +topographics +topographist +topographize +topographometric +topography +topolatry +topologic +topological +topologist +topology +toponarcosis +toponym +toponymal +toponymic +toponymical +toponymics +toponymist +toponymy +topophobia +topophone +topotactic +topotaxis +topotype +topotypic +topotypical +topped +topper +toppiece +topping +toppingly +toppingness +topple +toppler +topply +toppy +toprail +toprope +tops +topsail +topsailite +topside +topsl +topsman +topsoil +topstone +topswarm +Topsy +topsyturn +toptail +topwise +toque +Tor +tor +tora +torah +Toraja +toral +toran +torbanite +torbanitic +torbernite +torc +torcel +torch +torchbearer +torchbearing +torcher +torchless +torchlight +torchlighted +torchlike +torchman +torchon +torchweed +torchwood +torchwort +torcular +torculus +tordrillite +tore +toreador +tored +Torenia +torero +toreumatography +toreumatology +toreutic +toreutics +torfaceous +torfel +torgoch +Torgot +toric +Toriest +Torified +torii +Torilis +Torinese +Toriness +torma +tormen +torment +tormenta +tormentable +tormentation +tormentative +tormented +tormentedly +tormentful +tormentil +tormentilla +tormenting +tormentingly +tormentingness +tormentive +tormentor +tormentous +tormentress +tormentry +tormentum +tormina +torminal +torminous +tormodont +torn +tornachile +tornade +tornadic +tornado +tornadoesque +tornadoproof +tornal +tornaria +tornarian +tornese +torney +tornillo +Tornit +tornote +tornus +toro +toroid +toroidal +torolillo +Toromona +Torontonian +tororokombu +Torosaurus +torose +torosity +torotoro +torous +torpedineer +Torpedinidae +torpedinous +torpedo +torpedoer +torpedoist +torpedolike +torpedoplane +torpedoproof +torpent +torpescence +torpescent +torpid +torpidity +torpidly +torpidness +torpify +torpitude +torpor +torporific +torporize +torquate +torquated +torque +torqued +torques +torrefaction +torrefication +torrefy +torrent +torrentful +torrentfulness +torrential +torrentiality +torrentially +torrentine +torrentless +torrentlike +torrentuous +torrentwise +Torreya +Torricellian +torrid +torridity +torridly +torridness +Torridonian +Torrubia +torsade +torse +torsel +torsibility +torsigraph +torsile +torsimeter +torsiogram +torsiograph +torsiometer +torsion +torsional +torsionally +torsioning +torsionless +torsive +torsk +torso +torsoclusion +torsometer +torsoocclusion +Torsten +tort +torta +torteau +torticollar +torticollis +torticone +tortile +tortility +tortilla +tortille +tortious +tortiously +tortive +tortoise +tortoiselike +Tortonian +tortrices +tortricid +Tortricidae +Tortricina +tortricine +tortricoid +Tortricoidea +Tortrix +tortula +Tortulaceae +tortulaceous +tortulous +tortuose +tortuosity +tortuous +tortuously +tortuousness +torturable +torturableness +torture +tortured +torturedly +tortureproof +torturer +torturesome +torturing +torturingly +torturous +torturously +toru +torula +torulaceous +torulaform +toruliform +torulin +toruloid +torulose +torulosis +torulous +torulus +torus +torve +torvid +torvity +torvous +Tory +tory +Torydom +Toryess +Toryfication +Toryfy +toryhillite +Toryish +Toryism +Toryistic +Toryize +Toryship +toryweed +tosaphist +tosaphoth +toscanite +Tosephta +Tosephtas +tosh +toshakhana +tosher +toshery +toshly +toshnail +toshy +tosily +Tosk +Toskish +toss +tosser +tossicated +tossily +tossing +tossingly +tossment +tosspot +tossup +tossy +tost +tosticate +tostication +toston +tosy +tot +total +totalitarian +totalitarianism +totality +totalization +totalizator +totalize +totalizer +totally +totalness +totanine +Totanus +totaquin +totaquina +totaquine +totara +totchka +tote +toteload +totem +totemic +totemically +totemism +totemist +totemistic +totemite +totemization +totemy +toter +tother +totient +Totipalmatae +totipalmate +totipalmation +totipotence +totipotency +totipotent +totipotential +totipotentiality +totitive +toto +Totonac +Totonacan +Totonaco +totora +Totoro +totquot +totter +totterer +tottergrass +tottering +totteringly +totterish +tottery +Tottie +totting +tottle +tottlish +totty +tottyhead +totuava +totum +toty +totyman +tou +toucan +toucanet +Toucanid +touch +touchable +touchableness +touchback +touchbell +touchbox +touchdown +touched +touchedness +toucher +touchhole +touchily +touchiness +touching +touchingly +touchingness +touchless +touchline +touchous +touchpan +touchpiece +touchstone +touchwood +touchy +Toufic +toug +tough +toughen +toughener +toughhead +toughhearted +toughish +toughly +toughness +tought +tould +toumnah +Tounatea +toup +toupee +toupeed +toupet +tour +touraco +tourbillion +tourer +tourette +touring +tourism +tourist +touristdom +touristic +touristproof +touristry +touristship +touristy +tourize +tourmaline +tourmalinic +tourmaliniferous +tourmalinization +tourmalinize +tourmalite +tourn +tournament +tournamental +tournant +tournasin +tournay +tournee +Tournefortia +Tournefortian +tourney +tourneyer +tourniquet +tourte +tousche +touse +touser +tousle +tously +tousy +tout +touter +Tovah +tovar +Tovaria +Tovariaceae +tovariaceous +tovarish +tow +towable +towage +towai +towan +toward +towardliness +towardly +towardness +towards +towboat +towcock +towd +towel +towelette +toweling +towelry +tower +towered +towering +toweringly +towerless +towerlet +towerlike +towerman +towerproof +towerwise +towerwork +towerwort +towery +towght +towhead +towheaded +towhee +towing +towkay +towlike +towline +towmast +town +towned +townee +towner +townet +townfaring +townfolk +townful +towngate +townhood +townify +towniness +townish +townishly +townishness +townist +townland +townless +townlet +townlike +townling +townly +townman +townsboy +townscape +Townsendia +Townsendite +townsfellow +townsfolk +township +townside +townsite +townsman +townspeople +townswoman +townward +townwards +townwear +towny +towpath +towrope +towser +towy +tox +toxa +toxalbumic +toxalbumin +toxalbumose +toxamin +toxanemia +toxaphene +toxcatl +toxemia +toxemic +toxic +toxicaemia +toxical +toxically +toxicant +toxicarol +toxication +toxicemia +toxicity +toxicodendrol +Toxicodendron +toxicoderma +toxicodermatitis +toxicodermatosis +toxicodermia +toxicodermitis +toxicogenic +toxicognath +toxicohaemia +toxicohemia +toxicoid +toxicologic +toxicological +toxicologically +toxicologist +toxicology +toxicomania +toxicopathic +toxicopathy +toxicophagous +toxicophagy +toxicophidia +toxicophobia +toxicosis +toxicotraumatic +toxicum +toxidermic +toxidermitis +toxifer +Toxifera +toxiferous +toxigenic +toxihaemia +toxihemia +toxiinfection +toxiinfectious +toxin +toxinemia +toxinfection +toxinfectious +toxinosis +toxiphobia +toxiphobiac +toxiphoric +toxitabellae +toxity +Toxodon +toxodont +Toxodontia +toxogenesis +Toxoglossa +toxoglossate +toxoid +toxology +toxolysis +toxon +toxone +toxonosis +toxophil +toxophile +toxophilism +toxophilite +toxophilitic +toxophilitism +toxophilous +toxophily +toxophoric +toxophorous +toxoplasmosis +toxosis +toxosozin +Toxostoma +toxotae +Toxotes +Toxotidae +Toxylon +toy +toydom +toyer +toyful +toyfulness +toyhouse +toying +toyingly +toyish +toyishly +toyishness +toyland +toyless +toylike +toymaker +toymaking +toyman +toyon +toyshop +toysome +toytown +toywoman +toywort +toze +tozee +tozer +tra +trabacolo +trabal +trabant +trabascolo +trabea +trabeae +trabeatae +trabeated +trabeation +trabecula +trabecular +trabecularism +trabeculate +trabeculated +trabeculation +trabecule +trabuch +trabucho +Tracaulon +trace +traceability +traceable +traceableness +traceably +traceless +tracelessly +tracer +traceried +tracery +Tracey +trachea +tracheaectasy +tracheal +trachealgia +trachealis +trachean +Trachearia +trachearian +tracheary +Tracheata +tracheate +tracheation +tracheid +tracheidal +tracheitis +trachelagra +trachelate +trachelectomopexia +trachelectomy +trachelismus +trachelitis +trachelium +tracheloacromialis +trachelobregmatic +tracheloclavicular +trachelocyllosis +trachelodynia +trachelology +trachelomastoid +trachelopexia +tracheloplasty +trachelorrhaphy +tracheloscapular +Trachelospermum +trachelotomy +trachenchyma +tracheobronchial +tracheobronchitis +tracheocele +tracheochromatic +tracheoesophageal +tracheofissure +tracheolar +tracheolaryngeal +tracheolaryngotomy +tracheole +tracheolingual +tracheopathia +tracheopathy +tracheopharyngeal +Tracheophonae +tracheophone +tracheophonesis +tracheophonine +tracheophony +tracheoplasty +tracheopyosis +tracheorrhagia +tracheoschisis +tracheoscopic +tracheoscopist +tracheoscopy +tracheostenosis +tracheostomy +tracheotome +tracheotomist +tracheotomize +tracheotomy +Trachinidae +trachinoid +Trachinus +trachitis +trachle +Trachodon +trachodont +trachodontid +Trachodontidae +Trachoma +trachomatous +Trachomedusae +trachomedusan +trachyandesite +trachybasalt +trachycarpous +Trachycarpus +trachychromatic +trachydolerite +trachyglossate +Trachylinae +trachyline +Trachymedusae +trachymedusan +trachyphonia +trachyphonous +Trachypteridae +trachypteroid +Trachypterus +trachyspermous +trachyte +trachytic +trachytoid +tracing +tracingly +track +trackable +trackage +trackbarrow +tracked +tracker +trackhound +trackingscout +tracklayer +tracklaying +trackless +tracklessly +tracklessness +trackman +trackmanship +trackmaster +trackscout +trackshifter +tracksick +trackside +trackwalker +trackway +trackwork +tract +tractability +tractable +tractableness +tractably +tractarian +Tractarianism +tractarianize +tractate +tractator +tractatule +tractellate +tractellum +tractiferous +tractile +tractility +traction +tractional +tractioneering +Tractite +tractlet +tractor +tractoration +tractorism +tractorist +tractorization +tractorize +tractory +tractrix +Tracy +tradable +tradal +trade +tradecraft +tradeful +tradeless +trademaster +trader +tradership +Tradescantia +tradesfolk +tradesman +tradesmanlike +tradesmanship +tradesmanwise +tradespeople +tradesperson +tradeswoman +tradiment +trading +tradite +tradition +traditional +traditionalism +traditionalist +traditionalistic +traditionality +traditionalize +traditionally +traditionarily +traditionary +traditionate +traditionately +traditioner +traditionism +traditionist +traditionitis +traditionize +traditionless +traditionmonger +traditious +traditive +traditor +traditores +traditorship +traduce +traducement +traducent +traducer +traducian +traducianism +traducianist +traducianistic +traducible +traducing +traducingly +traduction +traductionist +trady +traffic +trafficability +trafficable +trafficableness +trafficless +trafficway +trafflicker +trafflike +trag +tragacanth +tragacantha +tragacanthin +tragal +Tragasol +tragedial +tragedian +tragedianess +tragedical +tragedienne +tragedietta +tragedist +tragedization +tragedize +tragedy +tragelaph +tragelaphine +Tragelaphus +tragi +tragic +tragical +tragicality +tragically +tragicalness +tragicaster +tragicize +tragicly +tragicness +tragicofarcical +tragicoheroicomic +tragicolored +tragicomedian +tragicomedy +tragicomic +tragicomical +tragicomicality +tragicomically +tragicomipastoral +tragicoromantic +tragicose +tragopan +Tragopogon +Tragulidae +Tragulina +traguline +traguloid +Traguloidea +Tragulus +tragus +trah +traheen +traik +trail +trailer +trailery +trailiness +trailing +trailingly +trailless +trailmaker +trailmaking +trailman +trailside +trailsman +traily +train +trainable +trainage +trainagraph +trainband +trainbearer +trainbolt +trainboy +trained +trainee +trainer +trainful +training +trainless +trainload +trainman +trainmaster +trainsick +trainster +traintime +trainway +trainy +traipse +trait +traitless +traitor +traitorhood +traitorism +traitorize +traitorlike +traitorling +traitorous +traitorously +traitorousness +traitorship +traitorwise +traitress +traject +trajectile +trajection +trajectitious +trajectory +trajet +tralatician +tralaticiary +tralatition +tralatitious +tralatitiously +tralira +Trallian +tram +trama +tramal +tramcar +trame +Trametes +tramful +tramless +tramline +tramman +trammel +trammeled +trammeler +trammelhead +trammeling +trammelingly +trammelled +trammellingly +trammer +tramming +trammon +tramontane +tramp +trampage +trampdom +tramper +trampess +tramphood +trampish +trampishly +trampism +trample +trampler +tramplike +trampolin +trampoline +trampoose +trampot +tramroad +tramsmith +tramway +tramwayman +tramyard +Tran +trance +tranced +trancedly +tranceful +trancelike +tranchefer +tranchet +trancoidal +traneen +trank +tranka +tranker +trankum +tranky +tranquil +tranquility +tranquilization +tranquilize +tranquilizer +tranquilizing +tranquilizingly +tranquillity +tranquillization +tranquillize +tranquilly +tranquilness +transaccidentation +transact +transaction +transactional +transactionally +transactioneer +transactor +transalpine +transalpinely +transalpiner +transamination +transanimate +transanimation +transannular +transapical +transappalachian +transaquatic +transarctic +transatlantic +transatlantically +transatlantican +transatlanticism +transaudient +transbaikal +transbaikalian +transbay +transboard +transborder +transcalency +transcalent +transcalescency +transcalescent +Transcaucasian +transceiver +transcend +transcendence +transcendency +transcendent +transcendental +transcendentalism +transcendentalist +transcendentalistic +transcendentality +transcendentalize +transcendentally +transcendently +transcendentness +transcendible +transcending +transcendingly +transcendingness +transcension +transchannel +transcolor +transcoloration +transconductance +transcondylar +transcondyloid +transconscious +transcontinental +transcorporate +transcorporeal +transcortical +transcreate +transcribable +transcribble +transcribbler +transcribe +transcriber +transcript +transcription +transcriptional +transcriptionally +transcriptitious +transcriptive +transcriptively +transcriptural +transcrystalline +transcurrent +transcurrently +transcurvation +transdermic +transdesert +transdialect +transdiaphragmatic +transdiurnal +transducer +transduction +transect +transection +transelement +transelementate +transelementation +transempirical +transenna +transept +transeptal +transeptally +transequatorial +transessentiate +transeunt +transexperiential +transfashion +transfeature +transfer +transferability +transferable +transferableness +transferably +transferal +transferee +transference +transferent +transferential +transferography +transferor +transferotype +transferred +transferrer +transferribility +transferring +transferror +transferrotype +transfigurate +transfiguration +transfigurative +transfigure +transfigurement +transfiltration +transfinite +transfix +transfixation +transfixion +transfixture +transfluent +transfluvial +transflux +transforation +transform +transformability +transformable +transformance +transformation +transformationist +transformative +transformator +transformer +transforming +transformingly +transformism +transformist +transformistic +transfrontal +transfrontier +transfuge +transfugitive +transfuse +transfuser +transfusible +transfusion +transfusionist +transfusive +transfusively +transgredient +transgress +transgressible +transgressing +transgressingly +transgression +transgressional +transgressive +transgressively +transgressor +transhape +transhuman +transhumanate +transhumanation +transhumance +transhumanize +transhumant +transience +transiency +transient +transiently +transientness +transigence +transigent +transiliac +transilience +transiliency +transilient +transilluminate +transillumination +transilluminator +transimpression +transincorporation +transindividual +transinsular +transire +transischiac +transisthmian +transistor +transit +transitable +transiter +transition +transitional +transitionally +transitionalness +transitionary +transitionist +transitival +transitive +transitively +transitiveness +transitivism +transitivity +transitman +transitorily +transitoriness +transitory +transitus +Transjordanian +translade +translatable +translatableness +translate +translater +translation +translational +translationally +translative +translator +translatorese +translatorial +translatorship +translatory +translatress +translatrix +translay +transleithan +transletter +translinguate +transliterate +transliteration +transliterator +translocalization +translocate +translocation +translocatory +translucence +translucency +translucent +translucently +translucid +transmarginal +transmarine +transmaterial +transmateriation +transmedial +transmedian +transmental +transmentation +transmeridional +transmethylation +transmigrant +transmigrate +transmigration +transmigrationism +transmigrationist +transmigrative +transmigratively +transmigrator +transmigratory +transmissibility +transmissible +transmission +transmissional +transmissionist +transmissive +transmissively +transmissiveness +transmissivity +transmissometer +transmissory +transmit +transmittable +transmittal +transmittance +transmittancy +transmittant +transmitter +transmittible +transmogrification +transmogrifier +transmogrify +transmold +transmontane +transmorphism +transmundane +transmural +transmuscle +transmutability +transmutable +transmutableness +transmutably +transmutation +transmutational +transmutationist +transmutative +transmutatory +transmute +transmuter +transmuting +transmutive +transmutual +transnatation +transnational +transnatural +transnaturation +transnature +transnihilation +transnormal +transocean +transoceanic +transocular +transom +transomed +transonic +transorbital +transpacific +transpadane +transpalatine +transpalmar +transpanamic +transparence +transparency +transparent +transparentize +transparently +transparentness +transparietal +transparish +transpeciate +transpeciation +transpeer +transpenetrable +transpeninsular +transperitoneal +transperitoneally +transpersonal +transphenomenal +transphysical +transpicuity +transpicuous +transpicuously +transpierce +transpirability +transpirable +transpiration +transpirative +transpiratory +transpire +transpirometer +transplace +transplant +transplantability +transplantable +transplantar +transplantation +transplantee +transplanter +transplendency +transplendent +transplendently +transpleural +transpleurally +transpolar +transponibility +transponible +transpontine +transport +transportability +transportable +transportableness +transportal +transportance +transportation +transportational +transportationist +transportative +transported +transportedly +transportedness +transportee +transporter +transporting +transportingly +transportive +transportment +transposability +transposable +transposableness +transposal +transpose +transposer +transposition +transpositional +transpositive +transpositively +transpositor +transpository +transpour +transprint +transprocess +transprose +transproser +transpulmonary +transpyloric +transradiable +transrational +transreal +transrectification +transrhenane +transrhodanian +transriverine +transsegmental +transsensual +transseptal +transsepulchral +transshape +transshift +transship +transshipment +transsolid +transstellar +transsubjective +transtemporal +Transteverine +transthalamic +transthoracic +transubstantial +transubstantially +transubstantiate +transubstantiation +transubstantiationalist +transubstantiationite +transubstantiative +transubstantiatively +transubstantiatory +transudate +transudation +transudative +transudatory +transude +transumpt +transumption +transumptive +transuranian +transuranic +transuranium +transuterine +transvaal +Transvaaler +Transvaalian +transvaluate +transvaluation +transvalue +transvasate +transvasation +transvase +transvectant +transvection +transvenom +transverbate +transverbation +transverberate +transverberation +transversal +transversale +transversalis +transversality +transversally +transversan +transversary +transverse +transversely +transverseness +transverser +transversion +transversive +transversocubital +transversomedial +transversospinal +transversovertical +transversum +transversus +transvert +transverter +transvest +transvestism +transvestite +transvestitism +transvolation +transwritten +Transylvanian +trant +tranter +trantlum +Tranzschelia +trap +Trapa +Trapaceae +trapaceous +trapball +trapes +trapezate +trapeze +trapezia +trapezial +trapezian +trapeziform +trapezing +trapeziometacarpal +trapezist +trapezium +trapezius +trapezohedral +trapezohedron +trapezoid +trapezoidal +trapezoidiform +trapfall +traphole +trapiferous +traplight +traplike +trapmaker +trapmaking +trappean +trapped +trapper +trapperlike +trappiness +trapping +trappingly +Trappist +trappist +Trappistine +trappoid +trappose +trappous +trappy +traprock +traps +trapshoot +trapshooter +trapshooting +trapstick +trapunto +trasformism +trash +trashery +trashify +trashily +trashiness +traship +trashless +trashrack +trashy +trass +Trastevere +Trasteverine +trasy +traulism +trauma +traumasthenia +traumatic +traumatically +traumaticin +traumaticine +traumatism +traumatize +traumatology +traumatonesis +traumatopnea +traumatopyra +traumatosis +traumatotactic +traumatotaxis +traumatropic +traumatropism +Trautvetteria +travail +travale +travally +travated +trave +travel +travelability +travelable +traveldom +traveled +traveler +traveleress +travelerlike +traveling +travellability +travellable +travelled +traveller +travelogue +traveloguer +traveltime +traversable +traversal +traversary +traverse +traversed +traversely +traverser +traversewise +traversework +traversing +traversion +travertin +travertine +travestier +travestiment +travesty +Travis +travis +travois +travoy +trawl +trawlboat +trawler +trawlerman +trawlnet +tray +trayful +traylike +treacher +treacherous +treacherously +treacherousness +treachery +treacle +treaclelike +treaclewort +treacliness +treacly +tread +treadboard +treader +treading +treadle +treadler +treadmill +treadwheel +treason +treasonable +treasonableness +treasonably +treasonful +treasonish +treasonist +treasonless +treasonmonger +treasonous +treasonously +treasonproof +treasurable +treasure +treasureless +treasurer +treasurership +treasuress +treasurous +treasury +treasuryship +treat +treatable +treatableness +treatably +treatee +treater +treating +treatise +treatiser +treatment +treator +treaty +treatyist +treatyite +treatyless +Trebellian +treble +trebleness +trebletree +trebly +trebuchet +trecentist +trechmannite +treckschuyt +Treculia +treddle +tredecile +tredille +tree +treebeard +treebine +treed +treefish +treeful +treehair +treehood +treeify +treeiness +treeless +treelessness +treelet +treelike +treeling +treemaker +treemaking +treeman +treen +treenail +treescape +treeship +treespeeler +treetop +treeward +treewards +treey +tref +trefgordd +trefle +trefoil +trefoiled +trefoillike +trefoilwise +tregadyne +tregerg +tregohm +trehala +trehalase +trehalose +treillage +trek +trekker +trekometer +trekpath +trellis +trellised +trellislike +trelliswork +Trema +Tremandra +Tremandraceae +tremandraceous +Trematoda +trematode +Trematodea +Trematodes +trematoid +Trematosaurus +tremble +tremblement +trembler +trembling +tremblingly +tremblingness +tremblor +trembly +Tremella +Tremellaceae +tremellaceous +Tremellales +tremelliform +tremelline +tremellineous +tremelloid +tremellose +tremendous +tremendously +tremendousness +tremetol +tremie +tremolando +tremolant +tremolist +tremolite +tremolitic +tremolo +tremor +tremorless +tremorlessly +tremulant +tremulate +tremulation +tremulous +tremulously +tremulousness +trenail +trench +trenchancy +trenchant +trenchantly +trenchantness +trenchboard +trenched +trencher +trencherless +trencherlike +trenchermaker +trenchermaking +trencherman +trencherside +trencherwise +trencherwoman +trenchful +trenchlet +trenchlike +trenchmaster +trenchmore +trenchward +trenchwise +trenchwork +trend +trendle +Trent +trental +Trentepohlia +Trentepohliaceae +trentepohliaceous +Trentine +Trenton +trepan +trepanation +trepang +trepanize +trepanner +trepanning +trepanningly +trephination +trephine +trephiner +trephocyte +trephone +trepid +trepidancy +trepidant +trepidate +trepidation +trepidatory +trepidity +trepidly +trepidness +Treponema +treponematous +treponemiasis +treponemiatic +treponemicidal +treponemicide +Trepostomata +trepostomatous +Treron +Treronidae +Treroninae +tresaiel +trespass +trespassage +trespasser +trespassory +tress +tressed +tressful +tressilate +tressilation +tressless +tresslet +tresslike +tresson +tressour +tressure +tressured +tressy +trest +trestle +trestletree +trestlewise +trestlework +trestling +tret +trevally +trevet +Trevor +trews +trewsman +Trey +trey +tri +triable +triableness +triace +triacetamide +triacetate +triacetonamine +triachenium +triacid +triacontaeterid +triacontane +triaconter +triact +triactinal +triactine +triad +triadelphous +Triadenum +triadic +triadical +triadically +triadism +triadist +triaene +triaenose +triage +triagonal +triakisicosahedral +triakisicosahedron +triakisoctahedral +triakisoctahedrid +triakisoctahedron +triakistetrahedral +triakistetrahedron +trial +trialate +trialism +trialist +triality +trialogue +triamid +triamide +triamine +triamino +triammonium +triamylose +triander +Triandria +triandrian +triandrous +triangle +triangled +triangler +triangleways +trianglewise +trianglework +Triangula +triangular +triangularity +triangularly +triangulate +triangulately +triangulation +triangulator +Triangulid +trianguloid +triangulopyramidal +triangulotriangular +Triangulum +triannual +triannulate +Trianon +Triantaphyllos +triantelope +trianthous +triapsal +triapsidal +triarch +triarchate +triarchy +triarctic +triarcuated +triareal +triarii +Triarthrus +triarticulate +Trias +Triassic +triaster +triatic +Triatoma +triatomic +triatomicity +triaxial +triaxon +triaxonian +triazane +triazin +triazine +triazo +triazoic +triazole +triazolic +tribade +tribadism +tribady +tribal +tribalism +tribalist +tribally +tribarred +tribase +tribasic +tribasicity +tribasilar +tribble +tribe +tribeless +tribelet +tribelike +tribesfolk +tribeship +tribesman +tribesmanship +tribespeople +tribeswoman +triblastic +triblet +triboelectric +triboelectricity +tribofluorescence +tribofluorescent +Tribolium +triboluminescence +triboluminescent +tribometer +Tribonema +Tribonemaceae +tribophosphorescence +tribophosphorescent +tribophosphoroscope +triborough +tribrac +tribrach +tribrachial +tribrachic +tribracteate +tribracteolate +tribromacetic +tribromide +tribromoethanol +tribromophenol +tribromphenate +tribromphenol +tribual +tribually +tribular +tribulate +tribulation +tribuloid +Tribulus +tribuna +tribunal +tribunate +tribune +tribuneship +tribunitial +tribunitian +tribunitiary +tribunitive +tributable +tributarily +tributariness +tributary +tribute +tributer +tributist +tributorian +tributyrin +trica +tricae +tricalcic +tricalcium +tricapsular +tricar +tricarballylic +tricarbimide +tricarbon +tricarboxylic +tricarinate +tricarinated +tricarpellary +tricarpellate +tricarpous +tricaudal +tricaudate +trice +tricellular +tricenarious +tricenarium +tricenary +tricennial +tricentenarian +tricentenary +tricentennial +tricentral +tricephal +tricephalic +tricephalous +tricephalus +triceps +Triceratops +triceria +tricerion +tricerium +trichatrophia +trichauxis +Trichechidae +trichechine +trichechodont +Trichechus +trichevron +trichi +trichia +trichiasis +Trichilia +Trichina +trichina +trichinae +trichinal +Trichinella +trichiniasis +trichiniferous +trichinization +trichinize +trichinoid +trichinopoly +trichinoscope +trichinoscopy +trichinosed +trichinosis +trichinotic +trichinous +trichite +trichitic +trichitis +trichiurid +Trichiuridae +trichiuroid +Trichiurus +trichloride +trichlormethane +trichloro +trichloroacetic +trichloroethylene +trichloromethane +trichloromethyl +trichobacteria +trichobezoar +trichoblast +trichobranchia +trichobranchiate +trichocarpous +trichocephaliasis +Trichocephalus +trichoclasia +trichoclasis +trichocyst +trichocystic +trichode +Trichoderma +Trichodesmium +Trichodontidae +trichoepithelioma +trichogen +trichogenous +trichoglossia +Trichoglossidae +Trichoglossinae +trichoglossine +Trichogramma +Trichogrammatidae +trichogyne +trichogynial +trichogynic +trichoid +Tricholaena +trichological +trichologist +trichology +Tricholoma +trichoma +Trichomanes +trichomaphyte +trichomatose +trichomatosis +trichomatous +trichome +trichomic +trichomonad +Trichomonadidae +Trichomonas +trichomoniasis +trichomycosis +trichonosus +trichopathic +trichopathy +trichophore +trichophoric +trichophyllous +trichophyte +trichophytia +trichophytic +Trichophyton +trichophytosis +Trichoplax +trichopore +trichopter +Trichoptera +trichoptera +trichopteran +trichopteron +trichopterous +trichopterygid +Trichopterygidae +trichord +trichorrhea +trichorrhexic +trichorrhexis +Trichosanthes +trichoschisis +trichosis +trichosporange +trichosporangial +trichosporangium +Trichosporum +trichostasis +Trichostema +trichostrongyle +trichostrongylid +Trichostrongylus +trichothallic +trichotillomania +trichotomic +trichotomism +trichotomist +trichotomize +trichotomous +trichotomously +trichotomy +trichroic +trichroism +trichromat +trichromate +trichromatic +trichromatism +trichromatist +trichrome +trichromic +trichronous +trichuriasis +Trichuris +trichy +Tricia +tricinium +tricipital +tricircular +trick +tricker +trickery +trickful +trickily +trickiness +tricking +trickingly +trickish +trickishly +trickishness +trickle +trickless +tricklet +tricklike +trickling +tricklingly +trickly +trickment +trickproof +tricksical +tricksily +tricksiness +tricksome +trickster +trickstering +trickstress +tricksy +tricktrack +tricky +triclad +Tricladida +triclinate +triclinia +triclinial +tricliniarch +tricliniary +triclinic +triclinium +triclinohedric +tricoccose +tricoccous +tricolette +tricolic +tricolon +tricolor +tricolored +tricolumnar +tricompound +triconch +Triconodon +triconodont +Triconodonta +triconodontid +triconodontoid +triconodonty +triconsonantal +triconsonantalism +tricophorous +tricorn +tricornered +tricornute +tricorporal +tricorporate +tricoryphean +tricosane +tricosanone +tricostate +tricosyl +tricosylic +tricot +tricotine +tricotyledonous +tricresol +tricrotic +tricrotism +tricrotous +tricrural +tricurvate +tricuspal +tricuspid +tricuspidal +tricuspidate +tricuspidated +tricussate +tricyanide +tricycle +tricyclene +tricycler +tricyclic +tricyclist +Tricyrtis +Tridacna +Tridacnidae +tridactyl +tridactylous +tridaily +triddler +tridecane +tridecene +tridecilateral +tridecoic +tridecyl +tridecylene +tridecylic +trident +tridental +tridentate +tridentated +tridentiferous +Tridentine +Tridentinian +tridepside +tridermic +tridiametral +tridiapason +tridigitate +tridimensional +tridimensionality +tridimensioned +tridiurnal +tridominium +tridrachm +triduan +triduum +tridymite +tridynamous +tried +triedly +trielaidin +triene +triennial +trienniality +triennially +triennium +triens +triental +Trientalis +triequal +trier +trierarch +trierarchal +trierarchic +trierarchy +trierucin +trieteric +trieterics +triethanolamine +triethyl +triethylamine +triethylstibine +trifa +trifacial +trifarious +trifasciated +triferous +trifid +trifilar +trifistulary +triflagellate +trifle +trifledom +trifler +triflet +trifling +triflingly +triflingness +trifloral +triflorate +triflorous +trifluoride +trifocal +trifoil +trifold +trifoliate +trifoliated +trifoliolate +trifoliosis +Trifolium +trifolium +trifoly +triforial +triforium +triform +triformed +triformin +triformity +triformous +trifoveolate +trifuran +trifurcal +trifurcate +trifurcation +trig +trigamist +trigamous +trigamy +trigeminal +trigeminous +trigeneric +trigesimal +trigger +triggered +triggerfish +triggerless +trigintal +trigintennial +Trigla +triglandular +triglid +Triglidae +triglochid +Triglochin +triglochin +triglot +trigly +triglyceride +triglyceryl +triglyph +triglyphal +triglyphed +triglyphic +triglyphical +trigness +trigon +Trigona +trigonal +trigonally +trigone +Trigonella +trigonelline +trigoneutic +trigoneutism +Trigonia +Trigoniaceae +trigoniacean +trigoniaceous +trigonic +trigonid +Trigoniidae +trigonite +trigonitis +trigonocephalic +trigonocephalous +Trigonocephalus +trigonocephaly +trigonocerous +trigonododecahedron +trigonodont +trigonoid +trigonometer +trigonometric +trigonometrical +trigonometrician +trigonometry +trigonon +trigonotype +trigonous +trigonum +trigram +trigrammatic +trigrammatism +trigrammic +trigraph +trigraphic +triguttulate +trigyn +Trigynia +trigynian +trigynous +trihalide +trihedral +trihedron +trihemeral +trihemimer +trihemimeral +trihemimeris +trihemiobol +trihemiobolion +trihemitetartemorion +trihoral +trihourly +trihybrid +trihydrate +trihydrated +trihydric +trihydride +trihydrol +trihydroxy +trihypostatic +trijugate +trijugous +trijunction +trikaya +trike +triker +trikeria +trikerion +triketo +triketone +trikir +trilabe +trilabiate +trilamellar +trilamellated +trilaminar +trilaminate +trilarcenous +trilateral +trilaterality +trilaterally +trilateralness +trilaurin +trilby +trilemma +trilinear +trilineate +trilineated +trilingual +trilinguar +trilinolate +trilinoleate +trilinolenate +trilinolenin +Trilisa +trilit +trilite +triliteral +triliteralism +triliterality +triliterally +triliteralness +trilith +trilithic +trilithon +trill +trillachan +trillet +trilli +Trilliaceae +trilliaceous +trillibub +trilliin +trilling +trillion +trillionaire +trillionize +trillionth +Trillium +trillium +trillo +trilobate +trilobated +trilobation +trilobe +trilobed +Trilobita +trilobite +trilobitic +trilocular +triloculate +trilogic +trilogical +trilogist +trilogy +Trilophodon +trilophodont +triluminar +triluminous +trim +trimacer +trimacular +trimargarate +trimargarin +trimastigate +trimellitic +trimembral +trimensual +trimer +Trimera +trimercuric +Trimeresurus +trimeric +trimeride +trimerite +trimerization +trimerous +trimesic +trimesinic +trimesitic +trimesitinic +trimester +trimestral +trimestrial +trimesyl +trimetalism +trimetallic +trimeter +trimethoxy +trimethyl +trimethylacetic +trimethylamine +trimethylbenzene +trimethylene +trimethylmethane +trimethylstibine +trimetric +trimetrical +trimetrogon +trimly +trimmer +trimming +trimmingly +trimness +trimodal +trimodality +trimolecular +trimonthly +trimoric +trimorph +trimorphic +trimorphism +trimorphous +trimotor +trimotored +trimstone +trimtram +trimuscular +trimyristate +trimyristin +trin +Trinacrian +trinal +trinality +trinalize +trinary +trinational +trindle +trine +trinely +trinervate +trinerve +trinerved +trineural +Tringa +tringine +tringle +tringoid +Trinidadian +trinidado +Trinil +Trinitarian +trinitarian +Trinitarianism +trinitrate +trinitration +trinitride +trinitrin +trinitro +trinitrocarbolic +trinitrocellulose +trinitrocresol +trinitroglycerin +trinitromethane +trinitrophenol +trinitroresorcin +trinitrotoluene +trinitroxylene +trinitroxylol +Trinity +trinity +trinityhood +trink +trinkerman +trinket +trinketer +trinketry +trinkety +trinkle +trinklement +trinklet +trinkums +Trinobantes +trinoctial +trinodal +trinode +trinodine +trinol +trinomial +trinomialism +trinomialist +trinomiality +trinomially +trinopticon +Trinorantum +Trinovant +Trinovantes +trintle +trinucleate +Trinucleus +Trio +trio +triobol +triobolon +trioctile +triocular +triode +triodia +triodion +Triodon +Triodontes +Triodontidae +triodontoid +Triodontoidea +Triodontoidei +Triodontophorus +Trioecia +trioecious +trioeciously +trioecism +triolcous +triole +trioleate +triolefin +trioleic +triolein +triolet +triology +Trionychidae +trionychoid +Trionychoideachid +trionychoidean +trionym +trionymal +Trionyx +trioperculate +Triopidae +Triops +trior +triorchis +triorchism +triorthogonal +triose +Triosteum +triovulate +trioxazine +trioxide +trioxymethylene +triozonide +trip +tripal +tripaleolate +tripalmitate +tripalmitin +tripara +tripart +triparted +tripartedly +tripartible +tripartient +tripartite +tripartitely +tripartition +tripaschal +tripe +tripedal +tripel +tripelike +tripeman +tripemonger +tripennate +tripenny +tripeptide +tripersonal +tripersonalism +tripersonalist +tripersonality +tripersonally +tripery +tripeshop +tripestone +tripetaloid +tripetalous +tripewife +tripewoman +triphammer +triphane +triphase +triphaser +Triphasia +triphasic +triphenyl +triphenylamine +triphenylated +triphenylcarbinol +triphenylmethane +triphenylmethyl +triphenylphosphine +triphibian +triphibious +triphony +Triphora +triphthong +triphyletic +triphyline +triphylite +triphyllous +Triphysite +tripinnate +tripinnated +tripinnately +tripinnatifid +tripinnatisect +Tripitaka +triplane +Triplaris +triplasian +triplasic +triple +tripleback +triplefold +triplegia +tripleness +triplet +tripletail +tripletree +triplewise +triplex +triplexity +triplicate +triplication +triplicative +triplicature +Triplice +Triplicist +triplicity +triplicostate +tripliform +triplinerved +tripling +triplite +triploblastic +triplocaulescent +triplocaulous +Triplochitonaceae +triploid +triploidic +triploidite +triploidy +triplopia +triplopy +triplum +triplumbic +triply +tripmadam +tripod +tripodal +tripodial +tripodian +tripodic +tripodical +tripody +tripointed +tripolar +tripoli +Tripoline +tripoline +Tripolitan +tripolite +tripos +tripotassium +trippant +tripper +trippet +tripping +trippingly +trippingness +trippist +tripple +trippler +Tripsacum +tripsill +tripsis +tripsome +tripsomely +triptane +tripterous +triptote +triptych +triptyque +tripudial +tripudiant +tripudiary +tripudiate +tripudiation +tripudist +tripudium +tripunctal +tripunctate +tripy +Tripylaea +tripylaean +Tripylarian +tripylarian +tripyrenous +triquadrantal +triquetra +triquetral +triquetric +triquetrous +triquetrously +triquetrum +triquinate +triquinoyl +triradial +triradially +triradiate +triradiated +triradiately +triradiation +Triratna +trirectangular +triregnum +trireme +trirhombohedral +trirhomboidal +triricinolein +trisaccharide +trisaccharose +trisacramentarian +Trisagion +trisalt +trisazo +trisceptral +trisect +trisected +trisection +trisector +trisectrix +triseme +trisemic +trisensory +trisepalous +triseptate +triserial +triserially +triseriate +triseriatim +trisetose +Trisetum +trishna +trisilane +trisilicane +trisilicate +trisilicic +trisinuate +trisinuated +triskele +triskelion +trismegist +trismegistic +trismic +trismus +trisoctahedral +trisoctahedron +trisodium +trisome +trisomic +trisomy +trisonant +Trisotropis +trispast +trispaston +trispermous +trispinose +trisplanchnic +trisporic +trisporous +trisquare +trist +tristachyous +Tristam +Tristan +Tristania +tristate +tristearate +tristearin +tristeness +tristetrahedron +tristeza +tristful +tristfully +tristfulness +tristich +Tristichaceae +tristichic +tristichous +tristigmatic +tristigmatose +tristiloquy +tristisonous +Tristram +tristylous +trisubstituted +trisubstitution +trisul +trisula +trisulcate +trisulcated +trisulphate +trisulphide +trisulphone +trisulphonic +trisulphoxide +trisylabic +trisyllabical +trisyllabically +trisyllabism +trisyllabity +trisyllable +tritactic +tritagonist +tritangent +tritangential +tritanope +tritanopia +tritanopic +tritaph +trite +Triteleia +tritely +tritemorion +tritencephalon +triteness +triternate +triternately +triterpene +tritetartemorion +tritheism +tritheist +tritheistic +tritheistical +tritheite +tritheocracy +trithing +trithioaldehyde +trithiocarbonate +trithiocarbonic +trithionate +trithionic +Trithrinax +tritical +triticality +tritically +triticalness +triticeous +triticeum +triticin +triticism +triticoid +Triticum +triticum +tritish +tritium +tritocerebral +tritocerebrum +tritocone +tritoconid +Tritogeneia +tritolo +Tritoma +tritomite +Triton +triton +tritonal +tritonality +tritone +Tritoness +Tritonia +Tritonic +Tritonidae +tritonoid +tritonous +tritonymph +tritonymphal +tritopatores +tritopine +tritor +tritoral +tritorium +tritoxide +tritozooid +tritriacontane +trittichan +tritubercular +Trituberculata +trituberculism +trituberculy +triturable +tritural +triturate +trituration +triturator +triturature +triturium +Triturus +trityl +Tritylodon +Triumfetta +Triumph +triumph +triumphal +triumphance +triumphancy +triumphant +triumphantly +triumphator +triumpher +triumphing +triumphwise +triumvir +triumviral +triumvirate +triumviri +triumvirship +triunal +triune +triungulin +triunification +triunion +triunitarian +triunity +triunsaturated +triurid +Triuridaceae +Triuridales +Triuris +trivalence +trivalency +trivalent +trivalerin +trivalve +trivalvular +trivant +trivantly +trivariant +triverbal +triverbial +trivet +trivetwise +trivia +trivial +trivialism +trivialist +triviality +trivialize +trivially +trivialness +trivirga +trivirgate +trivium +trivoltine +trivvet +triweekly +Trix +Trixie +Trixy +trizoic +trizomal +trizonal +trizone +Trizonia +Troad +troat +troca +trocaical +trocar +Trochaic +trochaic +trochaicality +trochal +trochalopod +Trochalopoda +trochalopodous +trochanter +trochanteric +trochanterion +trochantin +trochantinian +trochart +trochate +troche +trocheameter +trochee +trocheeize +trochelminth +Trochelminthes +trochi +trochid +Trochidae +trochiferous +trochiform +Trochila +Trochili +trochili +trochilic +trochilics +trochilidae +trochilidine +trochilidist +trochiline +trochilopodous +Trochilus +trochilus +troching +trochiscation +trochiscus +trochite +trochitic +Trochius +trochlea +trochlear +trochleariform +trochlearis +trochleary +trochleate +trochleiform +trochocephalia +trochocephalic +trochocephalus +trochocephaly +Trochodendraceae +trochodendraceous +Trochodendron +trochoid +trochoidal +trochoidally +trochoides +trochometer +trochophore +Trochosphaera +Trochosphaerida +trochosphere +trochospherical +Trochozoa +trochozoic +trochozoon +Trochus +trochus +trock +troco +troctolite +trod +trodden +trode +troegerite +Troezenian +troft +trog +trogger +troggin +troglodytal +troglodyte +Troglodytes +troglodytic +troglodytical +Troglodytidae +Troglodytinae +troglodytish +troglodytism +trogon +Trogones +Trogonidae +Trogoniformes +trogonoid +trogs +trogue +Troiades +Troic +troika +troilite +Trojan +troke +troker +troll +trolldom +trolleite +troller +trolley +trolleyer +trolleyful +trolleyman +trollflower +trollimog +trolling +Trollius +trollman +trollol +trollop +Trollopean +Trollopeanism +trollopish +trollops +trollopy +trolly +tromba +trombe +trombiculid +trombidiasis +Trombidiidae +Trombidium +trombone +trombonist +trombony +trommel +tromometer +tromometric +tromometrical +tromometry +tromp +trompe +trompil +trompillo +tromple +tron +trona +tronador +tronage +tronc +trondhjemite +trone +troner +troolie +troop +trooper +trooperess +troopfowl +troopship +troopwise +troostite +troostitic +troot +tropacocaine +tropaeolaceae +tropaeolaceous +tropaeolin +Tropaeolum +tropaion +tropal +troparia +troparion +tropary +tropate +trope +tropeic +tropeine +troper +tropesis +trophaea +trophaeum +trophal +trophallactic +trophallaxis +trophectoderm +trophedema +trophema +trophesial +trophesy +trophi +trophic +trophical +trophically +trophicity +trophied +Trophis +trophism +trophobiont +trophobiosis +trophobiotic +trophoblast +trophoblastic +trophochromatin +trophocyte +trophoderm +trophodisc +trophodynamic +trophodynamics +trophogenesis +trophogenic +trophogeny +trophology +trophonema +trophoneurosis +trophoneurotic +Trophonian +trophonucleus +trophopathy +trophophore +trophophorous +trophophyte +trophoplasm +trophoplasmatic +trophoplasmic +trophoplast +trophosomal +trophosome +trophosperm +trophosphere +trophospongia +trophospongial +trophospongium +trophospore +trophotaxis +trophotherapy +trophothylax +trophotropic +trophotropism +trophozoite +trophozooid +trophy +trophyless +trophywort +tropic +tropical +Tropicalia +Tropicalian +tropicality +tropicalization +tropicalize +tropically +tropicopolitan +tropidine +Tropidoleptus +tropine +tropism +tropismatic +tropist +tropistic +tropocaine +tropologic +tropological +tropologically +tropologize +tropology +tropometer +tropopause +tropophil +tropophilous +tropophyte +tropophytic +troposphere +tropostereoscope +tropoyl +troptometer +tropyl +trostera +trot +trotcozy +troth +trothful +trothless +trothlike +trothplight +trotlet +trotline +trotol +trotter +trottie +trottles +trottoir +trottoired +trotty +trotyl +troubadour +troubadourish +troubadourism +troubadourist +trouble +troubledly +troubledness +troublemaker +troublemaking +troublement +troubleproof +troubler +troublesome +troublesomely +troublesomeness +troubling +troublingly +troublous +troublously +troublousness +troubly +trough +troughful +troughing +troughlike +troughster +troughway +troughwise +troughy +trounce +trouncer +troupand +troupe +trouper +troupial +trouse +trouser +trouserdom +trousered +trouserettes +trouserian +trousering +trouserless +trousers +trousseau +trousseaux +trout +troutbird +trouter +troutflower +troutful +troutiness +troutless +troutlet +troutlike +trouty +trouvere +trouveur +trove +troveless +trover +trow +trowel +trowelbeak +troweler +trowelful +trowelman +trowing +trowlesworthite +trowman +trowth +Troy +troy +Troynovant +Troytown +truancy +truandise +truant +truantcy +truantism +truantlike +truantly +truantness +truantry +truantship +trub +trubu +truce +trucebreaker +trucebreaking +truceless +trucemaker +trucemaking +trucial +trucidation +truck +truckage +trucker +truckful +trucking +truckle +truckler +trucklike +truckling +trucklingly +truckload +truckman +truckmaster +trucks +truckster +truckway +truculence +truculency +truculent +truculental +truculently +truculentness +truddo +trudellite +trudge +trudgen +trudger +Trudy +true +trueborn +truebred +truehearted +trueheartedly +trueheartedness +truelike +truelove +trueness +truepenny +truer +truff +truffle +truffled +trufflelike +truffler +trufflesque +trug +truish +truism +truismatic +truistic +truistical +trull +Trullan +truller +trullization +trullo +truly +trumbash +trummel +trump +trumper +trumperiness +trumpery +trumpet +trumpetbush +trumpeter +trumpeting +trumpetless +trumpetlike +trumpetry +trumpetweed +trumpetwood +trumpety +trumph +trumpie +trumpless +trumplike +trun +truncage +truncal +truncate +truncated +Truncatella +Truncatellidae +truncately +truncation +truncator +truncatorotund +truncatosinuate +truncature +trunch +trunched +truncheon +truncheoned +truncher +trunchman +trundle +trundlehead +trundler +trundleshot +trundletail +trundling +trunk +trunkback +trunked +trunkfish +trunkful +trunking +trunkless +trunkmaker +trunknose +trunkway +trunkwork +trunnel +trunnion +trunnioned +trunnionless +trush +trusion +truss +trussed +trussell +trusser +trussing +trussmaker +trussmaking +trusswork +trust +trustability +trustable +trustableness +trustably +trustee +trusteeism +trusteeship +trusten +truster +trustful +trustfully +trustfulness +trustification +trustify +trustihood +trustily +trustiness +trusting +trustingly +trustingness +trustle +trustless +trustlessly +trustlessness +trustman +trustmonger +trustwoman +trustworthily +trustworthiness +trustworthy +trusty +truth +truthable +truthful +truthfully +truthfulness +truthify +truthiness +truthless +truthlessly +truthlessness +truthlike +truthlikeness +truthsman +truthteller +truthtelling +truthy +Trutta +truttaceous +truvat +truxillic +truxilline +try +trygon +Trygonidae +tryhouse +Trying +trying +tryingly +tryingness +tryma +tryout +tryp +trypa +trypan +trypaneid +Trypaneidae +trypanocidal +trypanocide +trypanolysin +trypanolysis +trypanolytic +Trypanosoma +trypanosoma +trypanosomacidal +trypanosomacide +trypanosomal +trypanosomatic +Trypanosomatidae +trypanosomatosis +trypanosomatous +trypanosome +trypanosomiasis +trypanosomic +Tryparsamide +Trypeta +trypetid +Trypetidae +Tryphena +Tryphosa +trypiate +trypograph +trypographic +trypsin +trypsinize +trypsinogen +tryptase +tryptic +tryptogen +tryptone +tryptonize +tryptophan +trysail +tryst +tryster +trysting +tryt +tryworks +tsadik +tsamba +tsantsa +tsar +tsardom +tsarevitch +tsarina +tsaritza +tsarship +tsatlee +Tsattine +tscharik +tscheffkinite +Tscherkess +tsere +tsessebe +tsetse +Tshi +tsia +Tsiltaden +Tsimshian +tsine +tsingtauite +tsiology +Tsoneca +Tsonecan +tst +tsuba +tsubo +Tsuga +Tsuma +tsumebite +tsun +tsunami +tsungtu +Tsutsutsi +tu +tua +Tualati +Tuamotu +Tuamotuan +Tuan +tuan +Tuareg +tuarn +tuart +tuatara +tuatera +tuath +tub +Tuba +tuba +tubae +tubage +tubal +tubaphone +tubar +tubate +tubatoxin +Tubatulabal +tubba +tubbable +tubbal +tubbeck +tubber +tubbie +tubbiness +tubbing +tubbish +tubboe +tubby +tube +tubeflower +tubeform +tubeful +tubehead +tubehearted +tubeless +tubelet +tubelike +tubemaker +tubemaking +tubeman +tuber +Tuberaceae +tuberaceous +Tuberales +tuberation +tubercle +tubercled +tuberclelike +tubercula +tubercular +Tubercularia +Tuberculariaceae +tuberculariaceous +tubercularization +tubercularize +tubercularly +tubercularness +tuberculate +tuberculated +tuberculatedly +tuberculately +tuberculation +tuberculatogibbous +tuberculatonodose +tuberculatoradiate +tuberculatospinous +tubercule +tuberculed +tuberculid +tuberculide +tuberculiferous +tuberculiform +tuberculin +tuberculinic +tuberculinization +tuberculinize +tuberculization +tuberculize +tuberculocele +tuberculocidin +tuberculoderma +tuberculoid +tuberculoma +tuberculomania +tuberculomata +tuberculophobia +tuberculoprotein +tuberculose +tuberculosectorial +tuberculosed +tuberculosis +tuberculotherapist +tuberculotherapy +tuberculotoxin +tuberculotrophic +tuberculous +tuberculously +tuberculousness +tuberculum +tuberiferous +tuberiform +tuberin +tuberization +tuberize +tuberless +tuberoid +tuberose +tuberosity +tuberous +tuberously +tuberousness +tubesmith +tubework +tubeworks +tubfish +tubful +tubicen +tubicinate +tubicination +Tubicola +Tubicolae +tubicolar +tubicolous +tubicorn +tubicornous +tubifacient +tubifer +tubiferous +Tubifex +Tubificidae +Tubiflorales +tubiflorous +tubiform +tubig +tubik +tubilingual +Tubinares +tubinarial +tubinarine +tubing +Tubingen +tubiparous +Tubipora +tubipore +tubiporid +Tubiporidae +tubiporoid +tubiporous +tublet +tublike +tubmaker +tubmaking +tubman +tuboabdominal +tubocurarine +tubolabellate +tuboligamentous +tuboovarial +tuboovarian +tuboperitoneal +tuborrhea +tubotympanal +tubovaginal +tubular +Tubularia +tubularia +Tubulariae +tubularian +Tubularida +tubularidan +Tubulariidae +tubularity +tubularly +tubulate +tubulated +tubulation +tubulator +tubulature +tubule +tubulet +tubuli +tubulibranch +tubulibranchian +Tubulibranchiata +tubulibranchiate +Tubulidentata +tubulidentate +Tubulifera +tubuliferan +tubuliferous +tubulifloral +tubuliflorous +tubuliform +Tubulipora +tubulipore +tubuliporid +Tubuliporidae +tubuliporoid +tubulization +tubulodermoid +tubuloracemose +tubulosaccular +tubulose +tubulostriato +tubulous +tubulously +tubulousness +tubulure +tubulus +tubwoman +Tucana +Tucanae +tucandera +Tucano +tuchit +tuchun +tuchunate +tuchunism +tuchunize +tuck +Tuckahoe +tuckahoe +tucker +tuckermanity +tucket +tucking +tuckner +tuckshop +tucktoo +tucky +tucum +tucuma +tucuman +Tucuna +tudel +Tudesque +Tudor +Tudoresque +tue +tueiron +Tuesday +tufa +tufaceous +tufalike +tufan +tuff +tuffaceous +tuffet +tuffing +tuft +tuftaffeta +tufted +tufter +tufthunter +tufthunting +tuftily +tufting +tuftlet +tufty +tug +tugboat +tugboatman +tugger +tuggery +tugging +tuggingly +tughra +tugless +tuglike +tugman +tugrik +tugui +tugurium +tui +tuik +tuille +tuillette +tuilyie +tuism +tuition +tuitional +tuitionary +tuitive +tuke +tukra +Tukuler +Tukulor +tula +Tulalip +tulare +tularemia +tulasi +Tulbaghia +tulchan +tulchin +tule +tuliac +tulip +Tulipa +tulipflower +tulipiferous +tulipist +tuliplike +tulipomania +tulipomaniac +tulipwood +tulipy +tulisan +Tulkepaia +tulle +Tullian +tullibee +Tulostoma +tulsi +Tulu +tulwar +tum +tumasha +tumatakuru +tumatukuru +tumbak +tumbester +tumble +tumblebug +tumbled +tumbledung +tumbler +tumblerful +tumblerlike +tumblerwise +tumbleweed +tumblification +tumbling +tumblingly +tumbly +Tumboa +tumbrel +tume +tumefacient +tumefaction +tumefy +tumescence +tumescent +tumid +tumidity +tumidly +tumidness +Tumion +tummals +tummel +tummer +tummock +tummy +tumor +tumored +tumorlike +tumorous +tump +tumpline +tumtum +tumular +tumulary +tumulate +tumulation +tumuli +tumulose +tumulosity +tumulous +tumult +tumultuarily +tumultuariness +tumultuary +tumultuate +tumultuation +tumultuous +tumultuously +tumultuousness +tumulus +Tumupasa +tun +Tuna +tuna +tunable +tunableness +tunably +tunbellied +tunbelly +tunca +tund +tundagslatta +tunder +tundish +tundra +tundun +tune +Tunebo +tuned +tuneful +tunefully +tunefulness +tuneless +tunelessly +tunelessness +tunemaker +tunemaking +tuner +tunesome +tunester +tunful +tung +Tunga +Tungan +tungate +tungo +tungstate +tungsten +tungstenic +tungsteniferous +tungstenite +tungstic +tungstite +tungstosilicate +tungstosilicic +Tungus +Tungusian +Tungusic +tunhoof +tunic +Tunica +Tunican +tunicary +Tunicata +tunicate +tunicated +tunicin +tunicked +tunicle +tunicless +tuniness +tuning +tunish +Tunisian +tunist +tunk +Tunker +tunket +tunlike +tunmoot +tunna +tunnel +tunneled +tunneler +tunneling +tunnelist +tunnelite +tunnellike +tunnelly +tunnelmaker +tunnelmaking +tunnelman +tunnelway +tunner +tunnery +Tunnit +tunnland +tunnor +tunny +tuno +tunu +tuny +tup +Tupaia +Tupaiidae +tupakihi +tupanship +tupara +tupek +tupelo +Tupi +Tupian +tupik +Tupinamba +Tupinaqui +tupman +tuppence +tuppenny +Tupperian +Tupperish +Tupperism +Tupperize +tupuna +tuque +tur +turacin +Turacus +Turanian +Turanianism +Turanism +turanose +turb +turban +turbaned +turbanesque +turbanette +turbanless +turbanlike +turbantop +turbanwise +turbary +turbeh +Turbellaria +turbellarian +turbellariform +turbescency +turbid +turbidimeter +turbidimetric +turbidimetry +turbidity +turbidly +turbidness +turbinaceous +turbinage +turbinal +turbinate +turbinated +turbination +turbinatoconcave +turbinatocylindrical +turbinatoglobose +turbinatostipitate +turbine +turbinectomy +turbined +turbinelike +Turbinella +Turbinellidae +turbinelloid +turbiner +turbines +Turbinidae +turbiniform +turbinoid +turbinotome +turbinotomy +turbit +turbith +turbitteen +Turbo +turbo +turboalternator +turboblower +turbocompressor +turbodynamo +turboexciter +turbofan +turbogenerator +turbomachine +turbomotor +turbopump +turbosupercharge +turbosupercharger +turbot +turbotlike +turboventilator +turbulence +turbulency +turbulent +turbulently +turbulentness +Turcian +Turcic +Turcification +Turcism +Turcize +Turco +turco +Turcoman +Turcophilism +turcopole +turcopolier +turd +Turdetan +Turdidae +turdiform +Turdinae +turdine +turdoid +Turdus +tureen +tureenful +turf +turfage +turfdom +turfed +turfen +turfiness +turfing +turfite +turfless +turflike +turfman +turfwise +turfy +turgency +turgent +turgently +turgesce +turgescence +turgescency +turgescent +turgescible +turgid +turgidity +turgidly +turgidness +turgite +turgoid +turgor +turgy +Turi +turicata +turio +turion +turioniferous +turjaite +turjite +Turk +turk +Turkana +Turkdom +Turkeer +turken +Turkery +Turkess +Turkey +turkey +turkeyback +turkeyberry +turkeybush +Turkeydom +turkeyfoot +Turkeyism +turkeylike +Turki +Turkic +Turkicize +Turkification +Turkify +turkis +Turkish +Turkishly +Turkishness +Turkism +Turkize +turkle +Turklike +Turkman +Turkmen +Turkmenian +Turkologist +Turkology +Turkoman +Turkomania +Turkomanic +Turkomanize +Turkophil +Turkophile +Turkophilia +Turkophilism +Turkophobe +Turkophobist +turlough +Turlupin +turm +turma +turment +turmeric +turmit +turmoil +turmoiler +turn +turnable +turnabout +turnagain +turnaround +turnaway +turnback +turnbout +turnbuckle +turncap +turncoat +turncoatism +turncock +turndown +turndun +turned +turnel +turner +Turnera +Turneraceae +turneraceous +Turneresque +Turnerian +Turnerism +turnerite +turnery +turney +turngate +turnhall +Turnhalle +Turnices +Turnicidae +turnicine +Turnicomorphae +turnicomorphic +turning +turningness +turnip +turniplike +turnipweed +turnipwise +turnipwood +turnipy +Turnix +turnix +turnkey +turnoff +turnout +turnover +turnpike +turnpiker +turnpin +turnplate +turnplow +turnrow +turns +turnscrew +turnsheet +turnskin +turnsole +turnspit +turnstile +turnstone +turntable +turntail +turnup +turnwrest +turnwrist +Turonian +turp +turpantineweed +turpentine +turpentineweed +turpentinic +turpeth +turpethin +turpid +turpidly +turpitude +turps +turquoise +turquoiseberry +turquoiselike +turr +turret +turreted +turrethead +turretlike +turrical +turricle +turricula +turriculae +turricular +turriculate +turriferous +turriform +turrigerous +Turrilepas +turrilite +Turrilites +turriliticone +Turrilitidae +Turritella +turritella +turritellid +Turritellidae +turritelloid +turse +Tursenoi +Tursha +tursio +Tursiops +Turtan +turtle +turtleback +turtlebloom +turtledom +turtledove +turtlehead +turtleize +turtlelike +turtler +turtlet +turtling +turtosa +tururi +turus +Turveydrop +Turveydropdom +Turveydropian +turwar +Tusayan +Tuscan +Tuscanism +Tuscanize +Tuscanlike +Tuscany +Tuscarora +tusche +Tusculan +Tush +tush +tushed +Tushepaw +tusher +tushery +tusk +tuskar +tusked +Tuskegee +tusker +tuskish +tuskless +tusklike +tuskwise +tusky +tussah +tussal +tusser +tussicular +Tussilago +tussis +tussive +tussle +tussock +tussocked +tussocker +tussocky +tussore +tussur +tut +tutania +tutball +tute +tutee +tutela +tutelage +tutelar +tutelary +Tutelo +tutenag +tuth +tutin +tutiorism +tutiorist +tutly +tutman +tutor +tutorage +tutorer +tutoress +tutorhood +tutorial +tutorially +tutoriate +tutorism +tutorization +tutorize +tutorless +tutorly +tutorship +tutory +tutoyer +tutress +tutrice +tutrix +tuts +tutsan +tutster +tutti +tuttiman +tutty +tutu +tutulus +Tututni +tutwork +tutworker +tutworkman +tuwi +tux +tuxedo +tuyere +Tuyuneiri +tuza +Tuzla +tuzzle +twa +Twaddell +twaddle +twaddledom +twaddleize +twaddlement +twaddlemonger +twaddler +twaddlesome +twaddling +twaddlingly +twaddly +twaddy +twae +twaesome +twafauld +twagger +twain +twaite +twal +twale +twalpenny +twalpennyworth +twalt +Twana +twang +twanger +twanginess +twangle +twangler +twangy +twank +twanker +twanking +twankingly +twankle +twanky +twant +twarly +twas +twasome +twat +twatchel +twatterlight +twattle +twattler +twattling +tway +twayblade +twazzy +tweag +tweak +tweaker +tweaky +twee +tweed +tweeded +tweedle +tweedledee +tweedledum +tweedy +tweeg +tweel +tween +tweenlight +tweeny +tweesh +tweesht +tweest +tweet +tweeter +tweeze +tweezer +tweezers +tweil +twelfhynde +twelfhyndeman +twelfth +twelfthly +Twelfthtide +twelve +twelvefold +twelvehynde +twelvehyndeman +twelvemo +twelvemonth +twelvepence +twelvepenny +twelvescore +twentieth +twentiethly +twenty +twentyfold +twentymo +twere +twerp +Twi +twibil +twibilled +twice +twicer +twicet +twichild +twick +twiddle +twiddler +twiddling +twiddly +twifoil +twifold +twifoldly +twig +twigful +twigged +twiggen +twigger +twiggy +twigless +twiglet +twiglike +twigsome +twigwithy +twilight +twilightless +twilightlike +twilighty +twilit +twill +twilled +twiller +twilling +twilly +twilt +twin +twinable +twinberry +twinborn +twindle +twine +twineable +twinebush +twineless +twinelike +twinemaker +twinemaking +twiner +twinflower +twinfold +twinge +twingle +twinhood +twiningly +twinism +twink +twinkle +twinkledum +twinkleproof +twinkler +twinkles +twinkless +twinkling +twinklingly +twinkly +twinleaf +twinlike +twinling +twinly +twinned +twinner +twinness +twinning +twinship +twinsomeness +twinter +twiny +twire +twirk +twirl +twirler +twirligig +twirly +twiscar +twisel +twist +twistable +twisted +twistedly +twistened +twister +twisterer +twistical +twistification +twistily +twistiness +twisting +twistingly +twistiways +twistiwise +twistle +twistless +twisty +twit +twitch +twitchel +twitcheling +twitcher +twitchet +twitchety +twitchfire +twitchily +twitchiness +twitchingly +twitchy +twite +twitlark +twitten +twitter +twitteration +twitterboned +twitterer +twittering +twitteringly +twitterly +twittery +twittingly +twitty +twixt +twixtbrain +twizzened +twizzle +two +twodecker +twofold +twofoldly +twofoldness +twoling +twoness +twopence +twopenny +twosome +twyblade +twyhynde +Tybalt +Tyburn +Tyburnian +Tyche +tychism +tychite +Tychonian +Tychonic +tychoparthenogenesis +tychopotamic +tycoon +tycoonate +tyddyn +tydie +tye +tyee +tyg +Tyigh +tying +tyke +tyken +tykhana +tyking +tylarus +tyleberry +Tylenchus +Tyler +Tylerism +Tylerite +Tylerize +tylion +tyloma +tylopod +Tylopoda +tylopodous +Tylosaurus +tylose +tylosis +tylosteresis +Tylostoma +Tylostomaceae +tylostylar +tylostyle +tylostylote +tylostylus +Tylosurus +tylotate +tylote +tylotic +tylotoxea +tylotoxeate +tylotus +tylus +tymbalon +tymp +tympan +tympana +tympanal +tympanectomy +tympani +tympanic +tympanichord +tympanichordal +tympanicity +tympaniform +tympaning +tympanism +tympanist +tympanites +tympanitic +tympanitis +tympanocervical +tympanohyal +tympanomalleal +tympanomandibular +tympanomastoid +tympanomaxillary +tympanon +tympanoperiotic +tympanosis +tympanosquamosal +tympanostapedial +tympanotemporal +tympanotomy +Tympanuchus +tympanum +tympany +tynd +Tyndallization +Tyndallize +tyndallmeter +Tynwald +typal +typarchical +type +typecast +Typees +typeholder +typer +typescript +typeset +typesetter +typesetting +typewrite +typewriter +typewriting +Typha +Typhaceae +typhaceous +typhemia +typhia +typhic +typhinia +typhization +typhlatonia +typhlatony +typhlectasis +typhlectomy +typhlenteritis +typhlitic +typhlitis +typhloalbuminuria +typhlocele +typhloempyema +typhloenteritis +typhlohepatitis +typhlolexia +typhlolithiasis +typhlology +typhlomegaly +Typhlomolge +typhlon +typhlopexia +typhlopexy +typhlophile +typhlopid +Typhlopidae +Typhlops +typhloptosis +typhlosis +typhlosolar +typhlosole +typhlostenosis +typhlostomy +typhlotomy +typhobacillosis +Typhoean +typhoemia +typhogenic +typhoid +typhoidal +typhoidin +typhoidlike +typholysin +typhomalaria +typhomalarial +typhomania +typhonia +Typhonian +Typhonic +typhonic +typhoon +typhoonish +typhopneumonia +typhose +typhosepsis +typhosis +typhotoxine +typhous +Typhula +typhus +typic +typica +typical +typicality +typically +typicalness +typicon +typicum +typification +typifier +typify +typist +typo +typobar +typocosmy +typographer +typographia +typographic +typographical +typographically +typographist +typography +typolithographic +typolithography +typologic +typological +typologically +typologist +typology +typomania +typometry +typonym +typonymal +typonymic +typonymous +typophile +typorama +typoscript +typotelegraph +typotelegraphy +typothere +Typotheria +Typotheriidae +typothetae +typp +typtological +typtologist +typtology +typy +tyramine +tyranness +Tyranni +tyrannial +tyrannic +tyrannical +tyrannically +tyrannicalness +tyrannicidal +tyrannicide +tyrannicly +Tyrannidae +Tyrannides +Tyranninae +tyrannine +tyrannism +tyrannize +tyrannizer +tyrannizing +tyrannizingly +tyrannoid +tyrannophobia +tyrannosaur +Tyrannosaurus +tyrannous +tyrannously +tyrannousness +Tyrannus +tyranny +tyrant +tyrantcraft +tyrantlike +tyrantship +tyre +tyremesis +Tyrian +tyriasis +tyro +tyrocidin +tyrocidine +tyroglyphid +Tyroglyphidae +Tyroglyphus +Tyrolean +Tyrolese +Tyrolienne +tyrolite +tyrology +tyroma +tyromancy +tyromatous +tyrone +tyronic +tyronism +tyrosinase +tyrosine +tyrosinuria +tyrosyl +tyrotoxicon +tyrotoxine +Tyrr +Tyrrhene +Tyrrheni +Tyrrhenian +Tyrsenoi +Tyrtaean +tysonite +tyste +tyt +Tyto +Tytonidae +Tzaam +Tzapotec +tzaritza +Tzendal +Tzental +tzolkin +tzontle +Tzotzil +Tzutuhil +U +u +uang +Uaraycu +Uarekena +Uaupe +uayeb +Ubbenite +Ubbonite +uberant +uberous +uberously +uberousness +uberty +ubi +ubication +ubiety +Ubii +Ubiquarian +ubiquarian +ubiquious +Ubiquist +ubiquit +Ubiquitarian +ubiquitarian +Ubiquitarianism +ubiquitariness +ubiquitary +Ubiquitism +Ubiquitist +ubiquitous +ubiquitously +ubiquitousness +ubiquity +ubussu +Uca +Ucal +Ucayale +Uchean +Uchee +uckia +Ud +udal +udaler +udaller +udalman +udasi +udder +uddered +udderful +udderless +udderlike +udell +Udi +Udic +Udish +udo +Udolphoish +udometer +udometric +udometry +udomograph +Uds +Ueueteotl +ug +Ugandan +Ugarono +ugh +uglification +uglifier +uglify +uglily +ugliness +uglisome +ugly +Ugrian +Ugric +Ugroid +ugsome +ugsomely +ugsomeness +uhlan +uhllo +uhtensang +uhtsong +Uigur +Uigurian +Uiguric +uily +uinal +Uinta +uintaite +uintathere +Uintatheriidae +Uintatherium +uintjie +Uirina +Uitotan +uitspan +uji +ukase +uke +ukiyoye +Ukrainer +Ukrainian +ukulele +ula +ulatrophia +ulcer +ulcerable +ulcerate +ulceration +ulcerative +ulcered +ulceromembranous +ulcerous +ulcerously +ulcerousness +ulcery +ulcuscle +ulcuscule +ule +ulema +ulemorrhagia +ulerythema +uletic +Ulex +ulex +ulexine +ulexite +Ulidia +Ulidian +uliginose +uliginous +ulitis +ull +ulla +ullage +ullaged +ullagone +uller +ulling +ullmannite +ulluco +Ulmaceae +ulmaceous +Ulmaria +ulmic +ulmin +ulminic +ulmo +ulmous +Ulmus +ulna +ulnad +ulnae +ulnar +ulnare +ulnaria +ulnocarpal +ulnocondylar +ulnometacarpal +ulnoradial +uloborid +Uloboridae +Uloborus +ulocarcinoma +uloid +Ulonata +uloncus +Ulophocinae +ulorrhagia +ulorrhagy +ulorrhea +Ulothrix +Ulotrichaceae +ulotrichaceous +Ulotrichales +ulotrichan +Ulotriches +Ulotrichi +ulotrichous +ulotrichy +ulrichite +ulster +ulstered +ulsterette +Ulsterian +ulstering +Ulsterite +Ulsterman +ulterior +ulteriorly +ultima +ultimacy +ultimata +ultimate +ultimately +ultimateness +ultimation +ultimatum +ultimity +ultimo +ultimobranchial +ultimogenitary +ultimogeniture +ultimum +Ultonian +ultra +ultrabasic +ultrabasite +ultrabelieving +ultrabenevolent +ultrabrachycephalic +ultrabrachycephaly +ultrabrilliant +ultracentenarian +ultracentenarianism +ultracentralizer +ultracentrifuge +ultraceremonious +ultrachurchism +ultracivil +ultracomplex +ultraconcomitant +ultracondenser +ultraconfident +ultraconscientious +ultraconservatism +ultraconservative +ultracordial +ultracosmopolitan +ultracredulous +ultracrepidarian +ultracrepidarianism +ultracrepidate +ultracritical +ultradandyism +ultradeclamatory +ultrademocratic +ultradespotic +ultradignified +ultradiscipline +ultradolichocephalic +ultradolichocephaly +ultradolichocranial +ultraeducationist +ultraeligible +ultraelliptic +ultraemphasis +ultraenergetic +ultraenforcement +ultraenthusiasm +ultraenthusiastic +ultraepiscopal +ultraevangelical +ultraexcessive +ultraexclusive +ultraexpeditious +ultrafantastic +ultrafashionable +ultrafastidious +ultrafederalist +ultrafeudal +ultrafidian +ultrafidianism +ultrafilter +ultrafilterability +ultrafilterable +ultrafiltrate +ultrafiltration +ultraformal +ultrafrivolous +ultragallant +ultragaseous +ultragenteel +ultragood +ultragrave +ultraheroic +ultrahonorable +ultrahuman +ultraimperialism +ultraimperialist +ultraimpersonal +ultrainclusive +ultraindifferent +ultraindulgent +ultraingenious +ultrainsistent +ultraintimate +ultrainvolved +ultraism +ultraist +ultraistic +ultralaborious +ultralegality +ultralenient +ultraliberal +ultraliberalism +ultralogical +ultraloyal +ultraluxurious +ultramarine +ultramaternal +ultramaximal +ultramelancholy +ultramicrochemical +ultramicrochemist +ultramicrochemistry +ultramicrometer +ultramicron +ultramicroscope +ultramicroscopic +ultramicroscopical +ultramicroscopy +ultraminute +ultramoderate +ultramodern +ultramodernism +ultramodernist +ultramodernistic +ultramodest +ultramontane +ultramontanism +ultramontanist +ultramorose +ultramulish +ultramundane +ultranational +ultranationalism +ultranationalist +ultranatural +ultranegligent +ultranice +ultranonsensical +ultraobscure +ultraobstinate +ultraofficious +ultraoptimistic +ultraornate +ultraorthodox +ultraorthodoxy +ultraoutrageous +ultrapapist +ultraparallel +ultraperfect +ultrapersuasive +ultraphotomicrograph +ultrapious +ultraplanetary +ultraplausible +ultrapopish +ultraproud +ultraprudent +ultraradical +ultraradicalism +ultrarapid +ultrareactionary +ultrared +ultrarefined +ultrarefinement +ultrareligious +ultraremuneration +ultrarepublican +ultrarevolutionary +ultrarevolutionist +ultraritualism +ultraromantic +ultraroyalism +ultraroyalist +ultrasanguine +ultrascholastic +ultraselect +ultraservile +ultrasevere +ultrashrewd +ultrasimian +ultrasolemn +ultrasonic +ultrasonics +ultraspartan +ultraspecialization +ultraspiritualism +ultrasplendid +ultrastandardization +ultrastellar +ultrasterile +ultrastrenuous +ultrastrict +ultrasubtle +ultrasystematic +ultratechnical +ultratense +ultraterrene +ultraterrestrial +ultratotal +ultratrivial +ultratropical +ultraugly +ultrauncommon +ultraurgent +ultravicious +ultraviolent +ultraviolet +ultravirtuous +ultravirus +ultravisible +ultrawealthy +ultrawise +ultrayoung +ultrazealous +ultrazodiacal +ultroneous +ultroneously +ultroneousness +ulu +Ulua +ulua +uluhi +ululant +ululate +ululation +ululative +ululatory +ululu +Ulva +Ulvaceae +ulvaceous +Ulvales +Ulvan +Ulyssean +Ulysses +um +umangite +Umatilla +Umaua +umbeclad +umbel +umbeled +umbella +Umbellales +umbellar +umbellate +umbellated +umbellately +umbellet +umbellic +umbellifer +Umbelliferae +umbelliferone +umbelliferous +umbelliflorous +umbelliform +umbelloid +Umbellula +Umbellularia +umbellulate +umbellule +Umbellulidae +umbelluliferous +umbelwort +umber +umbethink +umbilectomy +umbilic +umbilical +umbilically +umbilicar +Umbilicaria +umbilicate +umbilicated +umbilication +umbilici +umbiliciform +umbilicus +umbiliform +umbilroot +umble +umbo +umbolateral +umbonal +umbonate +umbonated +umbonation +umbone +umbones +umbonial +umbonic +umbonulate +umbonule +Umbra +umbra +umbracious +umbraciousness +umbraculate +umbraculiferous +umbraculiform +umbraculum +umbrae +umbrage +umbrageous +umbrageously +umbrageousness +umbral +umbrally +umbratile +umbrel +umbrella +umbrellaed +umbrellaless +umbrellalike +umbrellawise +umbrellawort +umbrette +Umbrian +Umbriel +umbriferous +umbriferously +umbriferousness +umbril +umbrine +umbrose +umbrosity +umbrous +Umbundu +ume +umiak +umiri +umlaut +ump +umph +umpirage +umpire +umpirer +umpireship +umpiress +umpirism +Umpqua +umpteen +umpteenth +umptekite +umptieth +umpty +umquhile +umu +un +Una +unabandoned +unabased +unabasedly +unabashable +unabashed +unabashedly +unabatable +unabated +unabatedly +unabating +unabatingly +unabbreviated +unabetted +unabettedness +unabhorred +unabiding +unabidingly +unabidingness +unability +unabject +unabjured +unable +unableness +unably +unabolishable +unabolished +unabraded +unabrased +unabridgable +unabridged +unabrogated +unabrupt +unabsent +unabsolute +unabsolvable +unabsolved +unabsolvedness +unabsorb +unabsorbable +unabsorbed +unabsorbent +unabstract +unabsurd +unabundance +unabundant +unabundantly +unabused +unacademic +unacademical +unaccelerated +unaccent +unaccented +unaccentuated +unaccept +unacceptability +unacceptable +unacceptableness +unacceptably +unacceptance +unacceptant +unaccepted +unaccessibility +unaccessible +unaccessibleness +unaccessibly +unaccessional +unaccessory +unaccidental +unaccidentally +unaccidented +unacclimated +unacclimation +unacclimatization +unacclimatized +unaccommodable +unaccommodated +unaccommodatedness +unaccommodating +unaccommodatingly +unaccommodatingness +unaccompanable +unaccompanied +unaccompanying +unaccomplishable +unaccomplished +unaccomplishedness +unaccord +unaccordable +unaccordance +unaccordant +unaccorded +unaccording +unaccordingly +unaccostable +unaccosted +unaccountability +unaccountable +unaccountableness +unaccountably +unaccounted +unaccoutered +unaccoutred +unaccreditated +unaccredited +unaccrued +unaccumulable +unaccumulate +unaccumulated +unaccumulation +unaccuracy +unaccurate +unaccurately +unaccurateness +unaccursed +unaccusable +unaccusably +unaccuse +unaccusing +unaccustom +unaccustomed +unaccustomedly +unaccustomedness +unachievable +unachieved +unaching +unacidulated +unacknowledged +unacknowledgedness +unacknowledging +unacknowledgment +unacoustic +unacquaint +unacquaintable +unacquaintance +unacquainted +unacquaintedly +unacquaintedness +unacquiescent +unacquirable +unacquirableness +unacquirably +unacquired +unacquit +unacquittable +unacquitted +unacquittedness +unact +unactability +unactable +unacted +unacting +unactinic +unaction +unactivated +unactive +unactively +unactiveness +unactivity +unactorlike +unactual +unactuality +unactually +unactuated +unacute +unacutely +unadapt +unadaptability +unadaptable +unadaptableness +unadaptably +unadapted +unadaptedly +unadaptedness +unadaptive +unadd +unaddable +unadded +unaddicted +unaddictedness +unadditional +unaddress +unaddressed +unadequate +unadequately +unadequateness +unadherence +unadherent +unadherently +unadhesive +unadjacent +unadjacently +unadjectived +unadjourned +unadjournment +unadjudged +unadjust +unadjustably +unadjusted +unadjustment +unadministered +unadmirable +unadmire +unadmired +unadmiring +unadmissible +unadmissibly +unadmission +unadmittable +unadmittableness +unadmittably +unadmitted +unadmittedly +unadmitting +unadmonished +unadopt +unadoptable +unadoptably +unadopted +unadoption +unadorable +unadoration +unadored +unadoring +unadorn +unadornable +unadorned +unadornedly +unadornedness +unadornment +unadult +unadulterate +unadulterated +unadulteratedly +unadulteratedness +unadulterately +unadulterous +unadulterously +unadvanced +unadvancedly +unadvancedness +unadvancement +unadvancing +unadvantaged +unadvantageous +unadventured +unadventuring +unadventurous +unadventurously +unadverse +unadversely +unadverseness +unadvertency +unadvertised +unadvertisement +unadvertising +unadvisability +unadvisable +unadvisableness +unadvisably +unadvised +unadvisedly +unadvisedness +unadvocated +unaerated +unaesthetic +unaesthetical +unafeard +unafeared +unaffable +unaffably +unaffected +unaffectedly +unaffectedness +unaffecting +unaffectionate +unaffectionately +unaffectioned +unaffianced +unaffied +unaffiliated +unaffiliation +unaffirmation +unaffirmed +unaffixed +unafflicted +unafflictedly +unafflicting +unaffliction +unaffordable +unafforded +unaffranchised +unaffrighted +unaffrightedly +unaffronted +unafire +unafloat +unaflow +unafraid +unaged +unaggravated +unaggravating +unaggregated +unaggression +unaggressive +unaggressively +unaggressiveness +unaghast +unagile +unagility +unaging +unagitated +unagitatedly +unagitatedness +unagitation +unagonize +unagrarian +unagreeable +unagreeableness +unagreeably +unagreed +unagreeing +unagreement +unagricultural +unaidable +unaided +unaidedly +unaiding +unailing +unaimed +unaiming +unaired +unaisled +Unakhotana +unakin +unakite +unal +Unalachtigo +unalarm +unalarmed +unalarming +Unalaska +unalcoholized +unaldermanly +unalert +unalertly +unalertness +unalgebraical +unalienable +unalienableness +unalienably +unalienated +unalignable +unaligned +unalike +unalimentary +unalist +unalive +unallayable +unallayably +unallayed +unalleged +unallegorical +unalleviably +unalleviated +unalleviation +unalliable +unallied +unalliedly +unalliedness +unallotment +unallotted +unallow +unallowable +unallowed +unallowedly +unallowing +unalloyed +unallurable +unallured +unalluring +unalluringly +unalmsed +unalone +unaloud +unalphabeted +unalphabetic +unalphabetical +unalterability +unalterable +unalterableness +unalterably +unalteration +unaltered +unaltering +unalternated +unamalgamable +unamalgamated +unamalgamating +unamassed +unamazed +unamazedly +unambiguity +unambiguous +unambiguously +unambiguousness +unambition +unambitious +unambitiously +unambitiousness +unambrosial +unambush +unamenability +unamenable +unamenableness +unamenably +unamend +unamendable +unamended +unamendedly +unamending +unamendment +unamerced +Unami +unamiability +unamiable +unamiableness +unamiably +unamicable +unamicably +unamiss +unamo +unamortization +unamortized +unample +unamplifiable +unamplified +unamply +unamputated +unamusable +unamusably +unamused +unamusement +unamusing +unamusingly +unamusive +unanalogical +unanalogous +unanalogously +unanalogousness +unanalytic +unanalytical +unanalyzable +unanalyzed +unanalyzing +unanatomizable +unanatomized +unancestored +unancestried +unanchor +unanchored +unanchylosed +unancient +unaneled +unangelic +unangelical +unangrily +unangry +unangular +unanimalized +unanimate +unanimated +unanimatedly +unanimatedness +unanimately +unanimism +unanimist +unanimistic +unanimistically +unanimity +unanimous +unanimously +unanimousness +unannealed +unannex +unannexed +unannexedly +unannexedness +unannihilable +unannihilated +unannotated +unannounced +unannoyed +unannoying +unannullable +unannulled +unanointed +unanswerability +unanswerable +unanswerableness +unanswerably +unanswered +unanswering +unantagonistic +unantagonizable +unantagonized +unantagonizing +unanticipated +unanticipating +unanticipatingly +unanticipation +unanticipative +unantiquated +unantiquatedness +unantique +unantiquity +unanxiety +unanxious +unanxiously +unanxiousness +unapart +unapocryphal +unapologetic +unapologizing +unapostatized +unapostolic +unapostolical +unapostolically +unapostrophized +unappalled +unappareled +unapparent +unapparently +unapparentness +unappealable +unappealableness +unappealably +unappealed +unappealing +unappeasable +unappeasableness +unappeasably +unappeased +unappeasedly +unappeasedness +unappendaged +unapperceived +unappertaining +unappetizing +unapplauded +unapplauding +unapplausive +unappliable +unappliableness +unappliably +unapplianced +unapplicable +unapplicableness +unapplicably +unapplied +unapplying +unappoint +unappointable +unappointableness +unappointed +unapportioned +unapposite +unappositely +unappraised +unappreciable +unappreciableness +unappreciably +unappreciated +unappreciating +unappreciation +unappreciative +unappreciatively +unappreciativeness +unapprehendable +unapprehendableness +unapprehendably +unapprehended +unapprehending +unapprehensible +unapprehensibleness +unapprehension +unapprehensive +unapprehensively +unapprehensiveness +unapprenticed +unapprised +unapprisedly +unapprisedness +unapproachability +unapproachable +unapproachableness +unapproached +unapproaching +unapprobation +unappropriable +unappropriate +unappropriated +unappropriately +unappropriateness +unappropriation +unapprovable +unapprovableness +unapprovably +unapproved +unapproving +unapprovingly +unapproximate +unapproximately +unaproned +unapropos +unapt +unaptitude +unaptly +unaptness +unarbitrarily +unarbitrariness +unarbitrary +unarbitrated +unarch +unarchdeacon +unarched +unarchitectural +unarduous +unarguable +unarguableness +unarguably +unargued +unarguing +unargumentative +unargumentatively +unarisen +unarising +unaristocratic +unaristocratically +unarithmetical +unarithmetically +unark +unarm +unarmed +unarmedly +unarmedness +unarmored +unarmorial +unaromatized +unarousable +unaroused +unarousing +unarraignable +unarraigned +unarranged +unarray +unarrayed +unarrestable +unarrested +unarresting +unarrival +unarrived +unarriving +unarrogance +unarrogant +unarrogating +unarted +unartful +unartfully +unartfulness +unarticled +unarticulate +unarticulated +unartificial +unartificiality +unartificially +unartistic +unartistical +unartistically +unartistlike +unary +unascendable +unascendableness +unascended +unascertainable +unascertainableness +unascertainably +unascertained +unashamed +unashamedly +unashamedness +unasinous +unaskable +unasked +unasking +unasleep +unaspersed +unasphalted +unaspirated +unaspiring +unaspiringly +unaspiringness +unassailable +unassailableness +unassailably +unassailed +unassailing +unassassinated +unassaultable +unassaulted +unassayed +unassaying +unassembled +unassented +unassenting +unasserted +unassertive +unassertiveness +unassessable +unassessableness +unassessed +unassibilated +unassiduous +unassignable +unassignably +unassigned +unassimilable +unassimilated +unassimilating +unassimilative +unassisted +unassisting +unassociable +unassociably +unassociated +unassociative +unassociativeness +unassoiled +unassorted +unassuageable +unassuaged +unassuaging +unassuetude +unassumable +unassumed +unassuming +unassumingly +unassumingness +unassured +unassuredly +unassuredness +unassuring +unasterisk +unastonish +unastonished +unastonishment +unastray +unathirst +unathletically +unatmospheric +unatonable +unatoned +unatoning +unattach +unattachable +unattached +unattackable +unattackableness +unattackably +unattacked +unattainability +unattainable +unattainableness +unattainably +unattained +unattaining +unattainment +unattaint +unattainted +unattaintedly +unattempered +unattemptable +unattempted +unattempting +unattendance +unattendant +unattended +unattentive +unattenuated +unattested +unattestedness +unattire +unattired +unattractable +unattractableness +unattracted +unattracting +unattractive +unattractively +unattractiveness +unattributable +unattributed +unattuned +unau +unauctioned +unaudible +unaudibleness +unaudibly +unaudienced +unaudited +unaugmentable +unaugmented +unauspicious +unauspiciously +unauspiciousness +unaustere +unauthentic +unauthentical +unauthentically +unauthenticated +unauthenticity +unauthorish +unauthoritative +unauthoritatively +unauthoritativeness +unauthoritied +unauthoritiveness +unauthorizable +unauthorize +unauthorized +unauthorizedly +unauthorizedness +unautomatic +unautumnal +unavailability +unavailable +unavailableness +unavailably +unavailed +unavailful +unavailing +unavailingly +unavengeable +unavenged +unavenging +unavenued +unaveraged +unaverred +unaverted +unavertible +unavertibleness +unavertibly +unavian +unavoidable +unavoidableness +unavoidably +unavoidal +unavoided +unavoiding +unavouchable +unavouchableness +unavouchably +unavouched +unavowable +unavowableness +unavowably +unavowed +unavowedly +unawakable +unawakableness +unawake +unawaked +unawakened +unawakenedness +unawakening +unawaking +unawardable +unawardableness +unawardably +unawarded +unaware +unawared +unawaredly +unawareness +unawares +unaway +unawed +unawful +unawfully +unawkward +unawned +unaxled +unazotized +unbackboarded +unbacked +unbackward +unbadged +unbaffled +unbaffling +unbag +unbagged +unbailable +unbailableness +unbailed +unbain +unbait +unbaited +unbaized +unbaked +unbalance +unbalanceable +unbalanceably +unbalanced +unbalancement +unbalancing +unbalconied +unbale +unbalked +unballast +unballasted +unballoted +unbandage +unbandaged +unbanded +unbanished +unbank +unbankable +unbankableness +unbankably +unbanked +unbankrupt +unbannered +unbaptize +unbaptized +unbar +unbarb +unbarbarize +unbarbarous +unbarbed +unbarbered +unbare +unbargained +unbark +unbarking +unbaronet +unbarrable +unbarred +unbarrel +unbarreled +unbarren +unbarrenness +unbarricade +unbarricaded +unbarricadoed +unbase +unbased +unbasedness +unbashful +unbashfully +unbashfulness +unbasket +unbastardized +unbaste +unbasted +unbastilled +unbastinadoed +unbated +unbathed +unbating +unbatted +unbatten +unbatterable +unbattered +unbattling +unbay +unbe +unbeached +unbeaconed +unbeaded +unbear +unbearable +unbearableness +unbearably +unbeard +unbearded +unbearing +unbeast +unbeatable +unbeatableness +unbeatably +unbeaten +unbeaued +unbeauteous +unbeauteously +unbeauteousness +unbeautified +unbeautiful +unbeautifully +unbeautifulness +unbeautify +unbeavered +unbeclogged +unbeclouded +unbecome +unbecoming +unbecomingly +unbecomingness +unbed +unbedabbled +unbedaggled +unbedashed +unbedaubed +unbedded +unbedecked +unbedewed +unbedimmed +unbedinned +unbedizened +unbedraggled +unbefit +unbefitting +unbefittingly +unbefittingness +unbefool +unbefriend +unbefriended +unbefringed +unbeget +unbeggar +unbegged +unbegilt +unbeginning +unbeginningly +unbeginningness +unbegirded +unbegirt +unbegot +unbegotten +unbegottenly +unbegottenness +unbegreased +unbegrimed +unbegrudged +unbeguile +unbeguiled +unbeguileful +unbegun +unbehaving +unbeheaded +unbeheld +unbeholdable +unbeholden +unbeholdenness +unbeholding +unbehoveful +unbehoving +unbeing +unbejuggled +unbeknown +unbeknownst +unbelied +unbelief +unbeliefful +unbelieffulness +unbelievability +unbelievable +unbelievableness +unbelievably +unbelieve +unbelieved +unbeliever +unbelieving +unbelievingly +unbelievingness +unbell +unbellicose +unbelligerent +unbelonging +unbeloved +unbelt +unbemoaned +unbemourned +unbench +unbend +unbendable +unbendableness +unbendably +unbended +unbending +unbendingly +unbendingness +unbendsome +unbeneficed +unbeneficent +unbeneficial +unbenefitable +unbenefited +unbenefiting +unbenetted +unbenevolence +unbenevolent +unbenevolently +unbenight +unbenighted +unbenign +unbenignant +unbenignantly +unbenignity +unbenignly +unbent +unbenumb +unbenumbed +unbequeathable +unbequeathed +unbereaved +unbereft +unberouged +unberth +unberufen +unbeseem +unbeseeming +unbeseemingly +unbeseemingness +unbeseemly +unbeset +unbesieged +unbesmeared +unbesmirched +unbesmutted +unbesot +unbesought +unbespeak +unbespoke +unbespoken +unbesprinkled +unbestarred +unbestowed +unbet +unbeteared +unbethink +unbethought +unbetide +unbetoken +unbetray +unbetrayed +unbetraying +unbetrothed +unbetterable +unbettered +unbeveled +unbewailed +unbewailing +unbewilder +unbewildered +unbewilled +unbewitch +unbewitched +unbewitching +unbewrayed +unbewritten +unbias +unbiasable +unbiased +unbiasedly +unbiasedness +unbibulous +unbickered +unbickering +unbid +unbidable +unbiddable +unbidden +unbigged +unbigoted +unbilled +unbillet +unbilleted +unbind +unbindable +unbinding +unbiographical +unbiological +unbirdlike +unbirdlimed +unbirdly +unbirthday +unbishop +unbishoply +unbit +unbiting +unbitt +unbitted +unbitten +unbitter +unblacked +unblackened +unblade +unblamable +unblamableness +unblamably +unblamed +unblaming +unblanched +unblanketed +unblasphemed +unblasted +unblazoned +unbleached +unbleaching +unbled +unbleeding +unblemishable +unblemished +unblemishedness +unblemishing +unblenched +unblenching +unblenchingly +unblendable +unblended +unblent +unbless +unblessed +unblessedness +unblest +unblighted +unblightedly +unblightedness +unblind +unblindfold +unblinking +unblinkingly +unbliss +unblissful +unblistered +unblithe +unblithely +unblock +unblockaded +unblocked +unblooded +unbloodied +unbloodily +unbloodiness +unbloody +unbloom +unbloomed +unblooming +unblossomed +unblossoming +unblotted +unbloused +unblown +unblued +unbluestockingish +unbluffed +unbluffing +unblunder +unblundered +unblundering +unblunted +unblurred +unblush +unblushing +unblushingly +unblushingness +unboarded +unboasted +unboastful +unboastfully +unboasting +unboat +unbodied +unbodiliness +unbodily +unboding +unbodkined +unbody +unbodylike +unbog +unboggy +unbohemianize +unboiled +unboisterous +unbokel +unbold +unbolden +unboldly +unboldness +unbolled +unbolster +unbolstered +unbolt +unbolted +unbombast +unbondable +unbondableness +unbonded +unbone +unboned +unbonnet +unbonneted +unbonny +unbooked +unbookish +unbooklearned +unboot +unbooted +unboraxed +unborder +unbordered +unbored +unboring +unborn +unborne +unborough +unborrowed +unborrowing +unbosom +unbosomer +unbossed +unbotanical +unbothered +unbothering +unbottle +unbottom +unbottomed +unbought +unbound +unboundable +unboundableness +unboundably +unbounded +unboundedly +unboundedness +unboundless +unbounteous +unbountiful +unbountifully +unbountifulness +unbow +unbowable +unbowdlerized +unbowed +unbowel +unboweled +unbowered +unbowing +unbowingness +unbowled +unbowsome +unbox +unboxed +unboy +unboyish +unboylike +unbrace +unbraced +unbracedness +unbracelet +unbraceleted +unbracing +unbragged +unbragging +unbraid +unbraided +unbrailed +unbrained +unbran +unbranched +unbranching +unbrand +unbranded +unbrandied +unbrave +unbraved +unbravely +unbraze +unbreachable +unbreached +unbreaded +unbreakable +unbreakableness +unbreakably +unbreakfasted +unbreaking +unbreast +unbreath +unbreathable +unbreathableness +unbreathed +unbreathing +unbred +unbreech +unbreeched +unbreezy +unbrent +unbrewed +unbribable +unbribableness +unbribably +unbribed +unbribing +unbrick +unbridegroomlike +unbridgeable +unbridged +unbridle +unbridled +unbridledly +unbridledness +unbridling +unbrief +unbriefed +unbriefly +unbright +unbrightened +unbrilliant +unbrimming +unbrined +unbrittle +unbroached +unbroad +unbroadcasted +unbroidered +unbroiled +unbroke +unbroken +unbrokenly +unbrokenness +unbronzed +unbrooch +unbrooded +unbrookable +unbrookably +unbrothered +unbrotherlike +unbrotherliness +unbrotherly +unbrought +unbrown +unbrowned +unbruised +unbrushed +unbrutalize +unbrutalized +unbrute +unbrutelike +unbrutify +unbrutize +unbuckle +unbuckramed +unbud +unbudded +unbudgeability +unbudgeable +unbudgeableness +unbudgeably +unbudged +unbudgeted +unbudging +unbuffed +unbuffered +unbuffeted +unbuild +unbuilded +unbuilt +unbulky +unbulled +unbulletined +unbumped +unbumptious +unbunched +unbundle +unbundled +unbung +unbungling +unbuoyant +unbuoyed +unburden +unburdened +unburdenment +unburdensome +unburdensomeness +unburgessed +unburiable +unburial +unburied +unburlesqued +unburly +unburn +unburnable +unburned +unburning +unburnished +unburnt +unburrow +unburrowed +unburst +unburstable +unburstableness +unburthen +unbury +unbush +unbusied +unbusily +unbusiness +unbusinesslike +unbusk +unbuskin +unbuskined +unbustling +unbusy +unbutchered +unbutcherlike +unbuttered +unbutton +unbuttoned +unbuttonment +unbuttressed +unbuxom +unbuxomly +unbuxomness +unbuyable +unbuyableness +unbuying +unca +uncabined +uncabled +uncadenced +uncage +uncaged +uncake +uncalcareous +uncalcified +uncalcined +uncalculable +uncalculableness +uncalculably +uncalculated +uncalculating +uncalculatingly +uncalendered +uncalk +uncalked +uncall +uncalled +uncallow +uncallower +uncalm +uncalmed +uncalmly +uncalumniated +uncambered +uncamerated +uncamouflaged +uncanceled +uncancellable +uncancelled +uncandid +uncandidly +uncandidness +uncandied +uncandor +uncaned +uncankered +uncanned +uncannily +uncanniness +uncanny +uncanonic +uncanonical +uncanonically +uncanonicalness +uncanonize +uncanonized +uncanopied +uncantoned +uncantonized +uncanvassably +uncanvassed +uncap +uncapable +uncapableness +uncapably +uncapacious +uncapacitate +uncaparisoned +uncapitalized +uncapped +uncapper +uncapsizable +uncapsized +uncaptained +uncaptioned +uncaptious +uncaptiously +uncaptivate +uncaptivated +uncaptivating +uncaptived +uncapturable +uncaptured +uncarbonated +uncarboned +uncarbureted +uncarded +uncardinal +uncardinally +uncareful +uncarefully +uncarefulness +uncaressed +uncargoed +Uncaria +uncaricatured +uncaring +uncarnate +uncarnivorous +uncaroled +uncarpentered +uncarpeted +uncarriageable +uncarried +uncart +uncarted +uncartooned +uncarved +uncase +uncased +uncasemated +uncask +uncasked +uncasketed +uncasque +uncassock +uncast +uncaste +uncastigated +uncastle +uncastled +uncastrated +uncasual +uncatalogued +uncatchable +uncate +uncatechised +uncatechisedness +uncatechized +uncatechizedness +uncategorized +uncathedraled +uncatholcity +uncatholic +uncatholical +uncatholicalness +uncatholicize +uncatholicly +uncaucusable +uncaught +uncausatively +uncaused +uncauterized +uncautious +uncautiously +uncautiousness +uncavalier +uncavalierly +uncave +unceasable +unceased +unceasing +unceasingly +unceasingness +unceded +unceiled +unceilinged +uncelebrated +uncelebrating +uncelestial +uncelestialized +uncellar +uncement +uncemented +uncementing +uncensorable +uncensored +uncensorious +uncensoriously +uncensoriousness +uncensurable +uncensured +uncensuring +uncenter +uncentered +uncentral +uncentrality +uncentrally +uncentred +uncentury +uncereclothed +unceremented +unceremonial +unceremonious +unceremoniously +unceremoniousness +uncertain +uncertainly +uncertainness +uncertainty +uncertifiable +uncertifiableness +uncertificated +uncertified +uncertifying +uncertitude +uncessant +uncessantly +uncessantness +unchafed +unchain +unchainable +unchained +unchair +unchaired +unchalked +unchallengeable +unchallengeableness +unchallengeably +unchallenged +unchallenging +unchambered +unchamfered +unchampioned +unchance +unchancellor +unchancy +unchange +unchangeability +unchangeable +unchangeableness +unchangeably +unchanged +unchangedness +unchangeful +unchangefulness +unchanging +unchangingly +unchangingness +unchanneled +unchannelled +unchanted +unchaperoned +unchaplain +unchapleted +unchapter +unchaptered +uncharacter +uncharactered +uncharacteristic +uncharacteristically +uncharacterized +uncharge +unchargeable +uncharged +uncharging +uncharily +unchariness +unchariot +uncharitable +uncharitableness +uncharitably +uncharity +uncharm +uncharmable +uncharmed +uncharming +uncharnel +uncharred +uncharted +unchartered +unchary +unchased +unchaste +unchastely +unchastened +unchasteness +unchastisable +unchastised +unchastising +unchastity +unchatteled +unchauffeured +unchawed +uncheat +uncheated +uncheating +uncheck +uncheckable +unchecked +uncheckered +uncheerable +uncheered +uncheerful +uncheerfully +uncheerfulness +uncheerily +uncheeriness +uncheering +uncheery +unchemical +unchemically +uncherished +uncherishing +unchested +unchevroned +unchewable +unchewableness +unchewed +unchid +unchidden +unchided +unchiding +unchidingly +unchild +unchildish +unchildishly +unchildishness +unchildlike +unchilled +unchiming +unchinked +unchipped +unchiseled +unchiselled +unchivalric +unchivalrous +unchivalrously +unchivalrousness +unchivalry +unchloridized +unchoicely +unchokable +unchoked +uncholeric +unchoosable +unchopped +unchoral +unchorded +unchosen +unchrisom +unchristen +unchristened +unchristian +unchristianity +unchristianize +unchristianized +unchristianlike +unchristianly +unchristianness +unchronicled +unchronological +unchronologically +unchurch +unchurched +unchurchlike +unchurchly +unchurn +unci +uncia +uncial +uncialize +uncially +uncicatrized +unciferous +unciform +unciliated +uncinal +Uncinaria +uncinariasis +uncinariatic +Uncinata +uncinate +uncinated +uncinatum +uncinch +uncinct +uncinctured +uncini +Uncinula +uncinus +uncipher +uncircular +uncircularized +uncirculated +uncircumcised +uncircumcisedness +uncircumcision +uncircumlocutory +uncircumscribable +uncircumscribed +uncircumscribedness +uncircumscript +uncircumscriptible +uncircumscription +uncircumspect +uncircumspection +uncircumspectly +uncircumspectness +uncircumstanced +uncircumstantial +uncirostrate +uncite +uncited +uncitied +uncitizen +uncitizenlike +uncitizenly +uncity +uncivic +uncivil +uncivilish +uncivility +uncivilizable +uncivilization +uncivilize +uncivilized +uncivilizedly +uncivilizedness +uncivilly +uncivilness +unclad +unclaimed +unclaiming +unclamorous +unclamp +unclamped +unclarified +unclarifying +unclarity +unclashing +unclasp +unclasped +unclassable +unclassableness +unclassably +unclassed +unclassible +unclassical +unclassically +unclassifiable +unclassifiableness +unclassification +unclassified +unclassify +unclassifying +unclawed +unclay +unclayed +uncle +unclead +unclean +uncleanable +uncleaned +uncleanlily +uncleanliness +uncleanly +uncleanness +uncleansable +uncleanse +uncleansed +uncleansedness +unclear +uncleared +unclearing +uncleavable +uncleave +uncledom +uncleft +unclehood +unclement +unclemently +unclementness +unclench +unclergy +unclergyable +unclerical +unclericalize +unclerically +unclericalness +unclerklike +unclerkly +uncleship +unclever +uncleverly +uncleverness +unclew +unclick +uncliented +unclify +unclimaxed +unclimb +unclimbable +unclimbableness +unclimbably +unclimbed +unclimbing +unclinch +uncling +unclinical +unclip +unclipped +unclipper +uncloak +uncloakable +uncloaked +unclog +unclogged +uncloister +uncloistered +uncloistral +unclosable +unclose +unclosed +uncloseted +unclothe +unclothed +unclothedly +unclothedness +unclotted +uncloud +unclouded +uncloudedly +uncloudedness +uncloudy +unclout +uncloven +uncloyable +uncloyed +uncloying +unclub +unclubbable +unclubby +unclustered +unclustering +unclutch +unclutchable +unclutched +unclutter +uncluttered +unco +uncoach +uncoachable +uncoachableness +uncoached +uncoacted +uncoagulable +uncoagulated +uncoagulating +uncoat +uncoated +uncoatedness +uncoaxable +uncoaxed +uncoaxing +uncock +uncocked +uncockneyfy +uncocted +uncodded +uncoddled +uncoded +uncodified +uncoerced +uncoffer +uncoffin +uncoffined +uncoffle +uncogent +uncogged +uncogitable +uncognizable +uncognizant +uncognized +uncognoscibility +uncognoscible +uncoguidism +uncoherent +uncoherently +uncoherentness +uncohesive +uncoif +uncoifed +uncoil +uncoiled +uncoin +uncoined +uncoked +uncoking +uncollapsed +uncollapsible +uncollar +uncollared +uncollated +uncollatedness +uncollected +uncollectedly +uncollectedness +uncollectible +uncollectibleness +uncollectibly +uncolleged +uncollegian +uncollegiate +uncolloquial +uncolloquially +uncolonellike +uncolonial +uncolonize +uncolonized +uncolorable +uncolorably +uncolored +uncoloredly +uncoloredness +uncoloured +uncolouredly +uncolouredness +uncolt +uncoly +uncombable +uncombatable +uncombated +uncombed +uncombinable +uncombinableness +uncombinably +uncombine +uncombined +uncombining +uncombiningness +uncombustible +uncome +uncomelily +uncomeliness +uncomely +uncomfort +uncomfortable +uncomfortableness +uncomfortably +uncomforted +uncomforting +uncomfy +uncomic +uncommanded +uncommandedness +uncommanderlike +uncommemorated +uncommenced +uncommendable +uncommendableness +uncommendably +uncommended +uncommensurability +uncommensurable +uncommensurableness +uncommensurate +uncommented +uncommenting +uncommerciable +uncommercial +uncommercially +uncommercialness +uncommingled +uncomminuted +uncommiserated +uncommiserating +uncommissioned +uncommitted +uncommitting +uncommixed +uncommodious +uncommodiously +uncommodiousness +uncommon +uncommonable +uncommonly +uncommonness +uncommonplace +uncommunicable +uncommunicableness +uncommunicably +uncommunicated +uncommunicating +uncommunicative +uncommunicatively +uncommunicativeness +uncommutable +uncommutative +uncommuted +uncompact +uncompacted +Uncompahgre +uncompahgrite +uncompaniable +uncompanied +uncompanioned +uncomparable +uncomparably +uncompared +uncompass +uncompassable +uncompassed +uncompassion +uncompassionate +uncompassionated +uncompassionately +uncompassionateness +uncompassionating +uncompassioned +uncompatible +uncompatibly +uncompellable +uncompelled +uncompelling +uncompensable +uncompensated +uncompetent +uncompetitive +uncompiled +uncomplacent +uncomplained +uncomplaining +uncomplainingly +uncomplainingness +uncomplaint +uncomplaisance +uncomplaisant +uncomplaisantly +uncomplemental +uncompletable +uncomplete +uncompleted +uncompletely +uncompleteness +uncomplex +uncompliability +uncompliable +uncompliableness +uncompliance +uncompliant +uncomplicated +uncomplimentary +uncomplimented +uncomplimenting +uncomplying +uncomposable +uncomposeable +uncomposed +uncompoundable +uncompounded +uncompoundedly +uncompoundedness +uncompounding +uncomprehended +uncomprehending +uncomprehendingly +uncomprehendingness +uncomprehensible +uncomprehension +uncomprehensive +uncomprehensively +uncomprehensiveness +uncompressed +uncompressible +uncomprised +uncomprising +uncomprisingly +uncompromised +uncompromising +uncompromisingly +uncompromisingness +uncompulsive +uncompulsory +uncomputable +uncomputableness +uncomputably +uncomputed +uncomraded +unconcatenated +unconcatenating +unconcealable +unconcealableness +unconcealably +unconcealed +unconcealing +unconcealingly +unconcealment +unconceded +unconceited +unconceivable +unconceivableness +unconceivably +unconceived +unconceiving +unconcern +unconcerned +unconcernedly +unconcernedness +unconcerning +unconcernment +unconcertable +unconcerted +unconcertedly +unconcertedness +unconcessible +unconciliable +unconciliated +unconciliatedness +unconciliating +unconciliatory +unconcludable +unconcluded +unconcluding +unconcludingness +unconclusive +unconclusively +unconclusiveness +unconcocted +unconcordant +unconcrete +unconcreted +unconcurrent +unconcurring +uncondemnable +uncondemned +uncondensable +uncondensableness +uncondensed +uncondensing +uncondescending +uncondescension +uncondition +unconditional +unconditionality +unconditionally +unconditionalness +unconditionate +unconditionated +unconditionately +unconditioned +unconditionedly +unconditionedness +uncondoled +uncondoling +unconducing +unconducive +unconduciveness +unconducted +unconductive +unconductiveness +unconfected +unconfederated +unconferred +unconfess +unconfessed +unconfessing +unconfided +unconfidence +unconfident +unconfidential +unconfidentialness +unconfidently +unconfiding +unconfinable +unconfine +unconfined +unconfinedly +unconfinedness +unconfinement +unconfining +unconfirm +unconfirmative +unconfirmed +unconfirming +unconfiscable +unconfiscated +unconflicting +unconflictingly +unconflictingness +unconformability +unconformable +unconformableness +unconformably +unconformed +unconformedly +unconforming +unconformist +unconformity +unconfound +unconfounded +unconfoundedly +unconfrontable +unconfronted +unconfusable +unconfusably +unconfused +unconfusedly +unconfutable +unconfuted +unconfuting +uncongeal +uncongealable +uncongealed +uncongenial +uncongeniality +uncongenially +uncongested +unconglobated +unconglomerated +unconglutinated +uncongratulate +uncongratulated +uncongratulating +uncongregated +uncongregational +uncongressional +uncongruous +unconjecturable +unconjectured +unconjoined +unconjugal +unconjugated +unconjunctive +unconjured +unconnected +unconnectedly +unconnectedness +unconned +unconnived +unconniving +unconquerable +unconquerableness +unconquerably +unconquered +unconscienced +unconscient +unconscientious +unconscientiously +unconscientiousness +unconscionable +unconscionableness +unconscionably +unconscious +unconsciously +unconsciousness +unconsecrate +unconsecrated +unconsecratedly +unconsecratedness +unconsecration +unconsecutive +unconsent +unconsentaneous +unconsented +unconsenting +unconsequential +unconsequentially +unconsequentialness +unconservable +unconservative +unconserved +unconserving +unconsiderable +unconsiderate +unconsiderately +unconsiderateness +unconsidered +unconsideredly +unconsideredness +unconsidering +unconsideringly +unconsignable +unconsigned +unconsistent +unconsociable +unconsociated +unconsolable +unconsolably +unconsolatory +unconsoled +unconsolidated +unconsolidating +unconsolidation +unconsoling +unconsonancy +unconsonant +unconsonantly +unconsonous +unconspicuous +unconspicuously +unconspicuousness +unconspired +unconspiring +unconspiringly +unconspiringness +unconstancy +unconstant +unconstantly +unconstantness +unconstellated +unconstipated +unconstituted +unconstitutional +unconstitutionalism +unconstitutionality +unconstitutionally +unconstrainable +unconstrained +unconstrainedly +unconstrainedness +unconstraining +unconstraint +unconstricted +unconstruable +unconstructed +unconstructive +unconstructural +unconstrued +unconsular +unconsult +unconsultable +unconsulted +unconsulting +unconsumable +unconsumed +unconsuming +unconsummate +unconsummated +unconsumptive +uncontagious +uncontainable +uncontainableness +uncontainably +uncontained +uncontaminable +uncontaminate +uncontaminated +uncontemned +uncontemnedly +uncontemplated +uncontemporaneous +uncontemporary +uncontemptuous +uncontended +uncontending +uncontent +uncontentable +uncontented +uncontentedly +uncontentedness +uncontenting +uncontentingness +uncontentious +uncontentiously +uncontentiousness +uncontestable +uncontestableness +uncontestably +uncontested +uncontestedly +uncontestedness +uncontinence +uncontinent +uncontinental +uncontinented +uncontinently +uncontinual +uncontinued +uncontinuous +uncontorted +uncontract +uncontracted +uncontractedness +uncontractile +uncontradictable +uncontradictableness +uncontradictably +uncontradicted +uncontradictedly +uncontradictious +uncontradictory +uncontrastable +uncontrasted +uncontrasting +uncontributed +uncontributing +uncontributory +uncontrite +uncontrived +uncontriving +uncontrol +uncontrollability +uncontrollable +uncontrollableness +uncontrollably +uncontrolled +uncontrolledly +uncontrolledness +uncontrolling +uncontroversial +uncontroversially +uncontrovertable +uncontrovertableness +uncontrovertably +uncontroverted +uncontrovertedly +uncontrovertible +uncontrovertibleness +uncontrovertibly +unconvenable +unconvened +unconvenience +unconvenient +unconveniently +unconventional +unconventionalism +unconventionality +unconventionalize +unconventionally +unconventioned +unconversable +unconversableness +unconversably +unconversant +unconversational +unconversion +unconvert +unconverted +unconvertedly +unconvertedness +unconvertibility +unconvertible +unconveyable +unconveyed +unconvicted +unconvicting +unconvince +unconvinced +unconvincedly +unconvincedness +unconvincibility +unconvincible +unconvincing +unconvincingly +unconvincingness +unconvoluted +unconvoyed +unconvulsed +uncookable +uncooked +uncooled +uncoop +uncooped +uncoopered +uncooping +uncope +uncopiable +uncopied +uncopious +uncopyrighted +uncoquettish +uncoquettishly +uncord +uncorded +uncordial +uncordiality +uncordially +uncording +uncore +uncored +uncork +uncorked +uncorker +uncorking +uncorned +uncorner +uncoronated +uncoroneted +uncorporal +uncorpulent +uncorrect +uncorrectable +uncorrected +uncorrectible +uncorrectly +uncorrectness +uncorrelated +uncorrespondency +uncorrespondent +uncorresponding +uncorrigible +uncorrigibleness +uncorrigibly +uncorroborated +uncorroded +uncorrugated +uncorrupt +uncorrupted +uncorruptedly +uncorruptedness +uncorruptibility +uncorruptible +uncorruptibleness +uncorruptibly +uncorrupting +uncorruption +uncorruptive +uncorruptly +uncorruptness +uncorseted +uncosseted +uncost +uncostliness +uncostly +uncostumed +uncottoned +uncouch +uncouched +uncouching +uncounselable +uncounseled +uncounsellable +uncounselled +uncountable +uncountableness +uncountably +uncounted +uncountenanced +uncounteracted +uncounterbalanced +uncounterfeit +uncounterfeited +uncountermandable +uncountermanded +uncountervailed +uncountess +uncountrified +uncouple +uncoupled +uncoupler +uncourageous +uncoursed +uncourted +uncourteous +uncourteously +uncourteousness +uncourtierlike +uncourting +uncourtlike +uncourtliness +uncourtly +uncous +uncousinly +uncouth +uncouthie +uncouthly +uncouthness +uncouthsome +uncovenant +uncovenanted +uncover +uncoverable +uncovered +uncoveredly +uncoveted +uncoveting +uncovetingly +uncovetous +uncowed +uncowl +uncoy +uncracked +uncradled +uncraftily +uncraftiness +uncrafty +uncram +uncramp +uncramped +uncrampedness +uncranked +uncrannied +uncrated +uncravatted +uncraven +uncraving +uncravingly +uncrazed +uncream +uncreased +uncreatability +uncreatable +uncreatableness +uncreate +uncreated +uncreatedness +uncreating +uncreation +uncreative +uncreativeness +uncreaturely +uncredentialed +uncredentialled +uncredibility +uncredible +uncredibly +uncreditable +uncreditableness +uncreditably +uncredited +uncrediting +uncredulous +uncreeping +uncreosoted +uncrest +uncrested +uncrevassed +uncrib +uncried +uncrime +uncriminal +uncriminally +uncrinkle +uncrinkled +uncrinkling +uncrippled +uncrisp +uncritical +uncritically +uncriticisable +uncriticised +uncriticising +uncriticisingly +uncriticism +uncriticizable +uncriticized +uncriticizing +uncriticizingly +uncrochety +uncrook +uncrooked +uncrooking +uncropped +uncropt +uncross +uncrossable +uncrossableness +uncrossed +uncrossexaminable +uncrossexamined +uncrossly +uncrowded +uncrown +uncrowned +uncrowning +uncrucified +uncrudded +uncrude +uncruel +uncrumbled +uncrumple +uncrumpling +uncrushable +uncrushed +uncrusted +uncrying +uncrystaled +uncrystalled +uncrystalline +uncrystallizability +uncrystallizable +uncrystallized +unction +unctional +unctioneer +unctionless +unctious +unctiousness +unctorium +unctuose +unctuosity +unctuous +unctuously +unctuousness +uncubbed +uncubic +uncuckold +uncuckolded +uncudgelled +uncuffed +uncular +unculled +uncultivability +uncultivable +uncultivate +uncultivated +uncultivation +unculturable +unculture +uncultured +uncumber +uncumbered +uncumbrous +uncunning +uncunningly +uncunningness +uncupped +uncurable +uncurableness +uncurably +uncurb +uncurbable +uncurbed +uncurbedly +uncurbing +uncurd +uncurdled +uncurdling +uncured +uncurious +uncuriously +uncurl +uncurled +uncurling +uncurrent +uncurrently +uncurrentness +uncurricularized +uncurried +uncurse +uncursed +uncursing +uncurst +uncurtailed +uncurtain +uncurtained +uncus +uncushioned +uncusped +uncustomable +uncustomarily +uncustomariness +uncustomary +uncustomed +uncut +uncuth +uncuticulate +uncuttable +uncynical +uncynically +uncypress +undabbled +undaggled +undaily +undaintiness +undainty +undallying +undam +undamageable +undamaged +undamaging +undamasked +undammed +undamming +undamn +undamped +undancing +undandiacal +undandled +undangered +undangerous +undangerousness +undared +undaring +undark +undarken +undarkened +undarned +undashed +undatable +undate +undateable +undated +undatedness +undaub +undaubed +undaughter +undaughterliness +undaughterly +undauntable +undaunted +undauntedly +undauntedness +undaunting +undawned +undawning +undazed +undazing +undazzle +undazzled +undazzling +unde +undead +undeadened +undeaf +undealable +undealt +undean +undear +undebarred +undebased +undebatable +undebated +undebating +undebauched +undebilitated +undebilitating +undecagon +undecanaphthene +undecane +undecatoic +undecayable +undecayableness +undecayed +undecayedness +undecaying +undeceased +undeceitful +undeceivable +undeceivableness +undeceivably +undeceive +undeceived +undeceiver +undeceiving +undecency +undecennary +undecennial +undecent +undecently +undeception +undeceptious +undeceptitious +undeceptive +undecidable +undecide +undecided +undecidedly +undecidedness +undeciding +undecimal +undeciman +undecimole +undecipher +undecipherability +undecipherable +undecipherably +undeciphered +undecision +undecisive +undecisively +undecisiveness +undeck +undecked +undeclaimed +undeclaiming +undeclamatory +undeclarable +undeclare +undeclared +undeclinable +undeclinableness +undeclinably +undeclined +undeclining +undecocted +undecoic +undecolic +undecomposable +undecomposed +undecompounded +undecorated +undecorative +undecorous +undecorously +undecorousness +undecorticated +undecoyed +undecreased +undecreasing +undecree +undecreed +undecried +undecyl +undecylenic +undecylic +undedicate +undedicated +undeducible +undeducted +undeeded +undeemed +undeemous +undeemously +undeep +undefaceable +undefaced +undefalcated +undefamed +undefaming +undefatigable +undefaulted +undefaulting +undefeasible +undefeat +undefeatable +undefeated +undefeatedly +undefeatedness +undefecated +undefectible +undefective +undefectiveness +undefendable +undefendableness +undefendably +undefended +undefending +undefense +undefensed +undefensible +undeferential +undeferentially +undeferred +undefiant +undeficient +undefied +undefilable +undefiled +undefiledly +undefiledness +undefinable +undefinableness +undefinably +undefine +undefined +undefinedly +undefinedness +undeflected +undeflowered +undeformed +undeformedness +undefrauded +undefrayed +undeft +undegeneracy +undegenerate +undegenerated +undegenerating +undegraded +undegrading +undeification +undeified +undeify +undeistical +undejected +undelated +undelayable +undelayed +undelayedly +undelaying +undelayingly +undelectable +undelectably +undelegated +undeleted +undeliberate +undeliberated +undeliberately +undeliberateness +undeliberating +undeliberatingly +undeliberative +undeliberativeness +undelible +undelicious +undelight +undelighted +undelightful +undelightfully +undelightfulness +undelighting +undelightsome +undelimited +undelineated +undeliverable +undeliverableness +undelivered +undelivery +undeludable +undelude +undeluded +undeluding +undeluged +undelusive +undelusively +undelve +undelved +undelylene +undemagnetizable +undemanded +undemised +undemocratic +undemocratically +undemocratize +undemolishable +undemolished +undemonstrable +undemonstrably +undemonstratable +undemonstrated +undemonstrative +undemonstratively +undemonstrativeness +undemure +undemurring +unden +undeniable +undeniableness +undeniably +undenied +undeniedly +undenizened +undenominated +undenominational +undenominationalism +undenominationalist +undenominationalize +undenominationally +undenoted +undenounced +undenuded +undepartableness +undepartably +undeparted +undeparting +undependable +undependableness +undependably +undependent +undepending +undephlegmated +undepicted +undepleted +undeplored +undeported +undeposable +undeposed +undeposited +undepraved +undepravedness +undeprecated +undepreciated +undepressed +undepressible +undepressing +undeprivable +undeprived +undepurated +undeputed +under +underabyss +underaccident +underaccommodated +underact +underacted +underacting +underaction +underactor +underadjustment +underadmiral +underadventurer +underage +underagency +underagent +underagitation +underaid +underaim +underair +underalderman +underanged +underarch +underargue +underarm +underaverage +underback +underbailiff +underbake +underbalance +underballast +underbank +underbarber +underbarring +underbasal +underbeadle +underbeak +underbeam +underbear +underbearer +underbearing +underbeat +underbeaten +underbed +underbelly +underbeveling +underbid +underbidder +underbill +underbillow +underbishop +underbishopric +underbit +underbite +underbitted +underbitten +underboard +underboated +underbodice +underbody +underboil +underboom +underborn +underborne +underbottom +underbough +underbought +underbound +underbowed +underbowser +underbox +underboy +underbrace +underbraced +underbranch +underbreath +underbreathing +underbred +underbreeding +underbrew +underbridge +underbrigadier +underbright +underbrim +underbrush +underbubble +underbud +underbuild +underbuilder +underbuilding +underbuoy +underburn +underburned +underburnt +underbursar +underbury +underbush +underbutler +underbuy +undercanopy +undercanvass +undercap +undercapitaled +undercapitalization +undercapitalize +undercaptain +undercarder +undercarriage +undercarry +undercarter +undercarve +undercarved +undercase +undercasing +undercast +undercause +underceiling +undercellar +undercellarer +underchamber +underchamberlain +underchancellor +underchanter +underchap +undercharge +undercharged +underchief +underchime +underchin +underchord +underchurched +undercircle +undercitizen +underclad +underclass +underclassman +underclay +underclearer +underclerk +underclerkship +undercliff +underclift +undercloak +undercloth +underclothe +underclothed +underclothes +underclothing +underclub +underclutch +undercoachman +undercoat +undercoated +undercoater +undercoating +undercollector +undercolor +undercolored +undercoloring +undercommander +undercomment +undercompounded +underconcerned +undercondition +underconsciousness +underconstable +underconsume +underconsumption +undercook +undercool +undercooper +undercorrect +undercountenance +undercourse +undercourtier +undercover +undercovering +undercovert +undercrawl +undercreep +undercrest +undercrier +undercroft +undercrop +undercrust +undercry +undercrypt +undercup +undercurl +undercurrent +undercurve +undercut +undercutter +undercutting +underdauber +underdeacon +underdead +underdebauchee +underdeck +underdepth +underdevelop +underdevelopment +underdevil +underdialogue +underdig +underdip +underdish +underdistinction +underdistributor +underditch +underdive +underdo +underdoctor +underdoer +underdog +underdoing +underdone +underdose +underdot +underdown +underdraft +underdrag +underdrain +underdrainage +underdrainer +underdraught +underdraw +underdrawers +underdrawn +underdress +underdressed +underdrift +underdrive +underdriven +underdrudgery +underdrumming +underdry +underdunged +underearth +undereat +undereaten +underedge +undereducated +underemployment +underengraver +underenter +underer +underescheator +underestimate +underestimation +underexcited +underexercise +underexpose +underexposure +undereye +underface +underfaction +underfactor +underfaculty +underfalconer +underfall +underfarmer +underfeathering +underfeature +underfed +underfeed +underfeeder +underfeeling +underfeet +underfellow +underfiend +underfill +underfilling +underfinance +underfind +underfire +underfitting +underflame +underflannel +underfleece +underflood +underfloor +underflooring +underflow +underfold +underfolded +underfong +underfoot +underfootage +underfootman +underforebody +underform +underfortify +underframe +underframework +underframing +underfreight +underfrequency +underfringe +underfrock +underfur +underfurnish +underfurnisher +underfurrow +undergabble +undergamekeeper +undergaoler +undergarb +undergardener +undergarment +undergarnish +undergauge +undergear +undergeneral +undergentleman +undergird +undergirder +undergirding +undergirdle +undergirth +underglaze +undergloom +underglow +undergnaw +undergo +undergod +undergoer +undergoing +undergore +undergoverness +undergovernment +undergovernor +undergown +undergrad +undergrade +undergraduate +undergraduatedom +undergraduateness +undergraduateship +undergraduatish +undergraduette +undergraining +undergrass +undergreen +undergrieve +undergroan +underground +undergrounder +undergroundling +undergrove +undergrow +undergrowl +undergrown +undergrowth +undergrub +underguard +underguardian +undergunner +underhabit +underhammer +underhand +underhanded +underhandedly +underhandedness +underhang +underhanging +underhangman +underhatch +underhead +underheat +underheaven +underhelp +underhew +underhid +underhill +underhint +underhistory +underhive +underhold +underhole +underhonest +underhorse +underhorsed +underhousemaid +underhum +underhung +underided +underinstrument +underisive +underissue +underivable +underivative +underived +underivedly +underivedness +underjacket +underjailer +underjanitor +underjaw +underjawed +underjobbing +underjudge +underjungle +underkeel +underkeeper +underkind +underking +underkingdom +underlaborer +underlaid +underlain +underland +underlanguaged +underlap +underlapper +underlash +underlaundress +underlawyer +underlay +underlayer +underlaying +underleaf +underlease +underleather +underlegate +underlessee +underlet +underletter +underlevel +underlever +underlid +underlie +underlier +underlieutenant +underlife +underlift +underlight +underliking +underlimbed +underlimit +underline +underlineation +underlineman +underlinement +underlinen +underliner +underling +underlining +underlip +underlive +underload +underlock +underlodging +underloft +underlook +underlooker +underlout +underlunged +underly +underlye +underlying +undermade +undermaid +undermaker +underman +undermanager +undermanned +undermanning +undermark +undermarshal +undermarshalman +undermasted +undermaster +undermatch +undermatched +undermate +undermath +undermeal +undermeaning +undermeasure +undermediator +undermelody +undermentioned +undermiller +undermimic +underminable +undermine +underminer +undermining +underminingly +underminister +underministry +undermist +undermoated +undermoney +undermoral +undermost +undermotion +undermount +undermountain +undermusic +undermuslin +undern +undername +undernatural +underneath +underness +underniceness +undernote +undernoted +undernourish +undernourished +undernourishment +undernsong +underntide +underntime +undernurse +undernutrition +underoccupied +underofficer +underofficered +underofficial +underogating +underogatory +underopinion +underorb +underorganization +underorseman +underoverlooker +underoxidize +underpacking +underpaid +underpain +underpainting +underpan +underpants +underparticipation +underpartner +underpass +underpassion +underpay +underpayment +underpeep +underpeer +underpen +underpeopled +underpetticoat +underpetticoated +underpick +underpier +underpilaster +underpile +underpin +underpinner +underpinning +underpitch +underpitched +underplain +underplan +underplant +underplate +underplay +underplot +underplotter +underply +underpoint +underpole +underpopulate +underpopulation +underporch +underporter +underpose +underpossessor +underpot +underpower +underpraise +underprefect +underprentice +underpresence +underpresser +underpressure +underprice +underpriest +underprincipal +underprint +underprior +underprivileged +underprize +underproduce +underproduction +underproductive +underproficient +underprompt +underprompter +underproof +underprop +underproportion +underproportioned +underproposition +underpropped +underpropper +underpropping +underprospect +underpry +underpuke +underqualified +underqueen +underquote +underranger +underrate +underratement +underrating +underreach +underread +underreader +underrealize +underrealm +underream +underreamer +underreceiver +underreckon +underrecompense +underregion +underregistration +underrent +underrented +underrenting +underrepresent +underrepresentation +underrespected +underriddle +underriding +underrigged +underring +underripe +underripened +underriver +underroarer +underroast +underrobe +underrogue +underroll +underroller +underroof +underroom +underroot +underrooted +underrower +underrule +underruler +underrun +underrunning +undersacristan +undersailed +undersally +undersap +undersatisfaction +undersaturate +undersaturation +undersavior +undersaw +undersawyer +underscale +underscheme +underschool +underscoop +underscore +underscribe +underscript +underscrub +underscrupulous +undersea +underseam +underseaman +undersearch +underseas +underseated +undersecretary +undersecretaryship +undersect +undersee +underseeded +underseedman +undersell +underseller +underselling +undersense +undersequence +underservant +underserve +underservice +underset +undersetter +undersetting +undersettle +undersettler +undersettling +undersexton +undershapen +undersharp +undersheathing +undershepherd +undersheriff +undersheriffry +undersheriffship +undersheriffwick +undershield +undershine +undershining +undershire +undershirt +undershoe +undershoot +undershore +undershorten +undershot +undershrievalty +undershrieve +undershrievery +undershrub +undershrubbiness +undershrubby +undershunter +undershut +underside +undersight +undersighted +undersign +undersignalman +undersigner +undersill +undersinging +undersitter +undersize +undersized +underskin +underskirt +undersky +undersleep +undersleeve +underslip +underslope +undersluice +underslung +undersneer +undersociety +undersoil +undersole +undersomething +undersong +undersorcerer +undersort +undersoul +undersound +undersovereign +undersow +underspar +undersparred +underspecies +underspecified +underspend +undersphere +underspin +underspinner +undersplice +underspore +underspread +underspring +undersprout +underspurleather +undersquare +understaff +understage +understain +understairs +understamp +understand +understandability +understandable +understandableness +understandably +understander +understanding +understandingly +understandingness +understate +understatement +understay +understeer +understem +understep +understeward +understewardship +understimulus +understock +understocking +understood +understory +understrain +understrap +understrapper +understrapping +understratum +understream +understress +understrew +understride +understriding +understrife +understrike +understring +understroke +understrung +understudy +understuff +understuffing +undersuck +undersuggestion +undersuit +undersupply +undersupport +undersurface +underswain +underswamp +undersward +underswearer +undersweat +undersweep +underswell +undertakable +undertake +undertakement +undertaker +undertakerish +undertakerlike +undertakerly +undertakery +undertaking +undertakingly +undertalk +undertapster +undertaxed +underteacher +underteamed +underteller +undertenancy +undertenant +undertenter +undertenure +underterrestrial +undertest +underthane +underthaw +underthief +underthing +underthink +underthirst +underthought +underthroating +underthrob +underthrust +undertide +undertided +undertie +undertime +undertimed +undertint +undertitle +undertone +undertoned +undertook +undertow +undertrader +undertrained +undertread +undertreasurer +undertreat +undertribe +undertrick +undertrodden +undertruck +undertrump +undertruss +undertub +undertune +undertunic +underturf +underturn +underturnkey +undertutor +undertwig +undertype +undertyrant +underusher +undervaluation +undervalue +undervaluement +undervaluer +undervaluing +undervaluinglike +undervaluingly +undervalve +undervassal +undervaulted +undervaulting +undervegetation +underventilation +underverse +undervest +undervicar +underviewer +undervillain +undervinedresser +undervitalized +undervocabularied +undervoice +undervoltage +underwage +underwaist +underwaistcoat +underwalk +underward +underwarden +underwarmth +underwarp +underwash +underwatch +underwatcher +underwater +underwave +underway +underweapon +underwear +underweft +underweigh +underweight +underweighted +underwent +underwheel +underwhistle +underwind +underwing +underwit +underwitch +underwitted +underwood +underwooded +underwork +underworker +underworking +underworkman +underworld +underwrap +underwrite +underwriter +underwriting +underwrought +underyield +underyoke +underzeal +underzealot +undescendable +undescended +undescendible +undescribable +undescribably +undescribed +undescried +undescript +undescriptive +undescrying +undesert +undeserted +undeserting +undeserve +undeserved +undeservedly +undeservedness +undeserver +undeserving +undeservingly +undeservingness +undesign +undesignated +undesigned +undesignedly +undesignedness +undesigning +undesigningly +undesigningness +undesirability +undesirable +undesirableness +undesirably +undesire +undesired +undesiredly +undesiring +undesirous +undesirously +undesirousness +undesisting +undespaired +undespairing +undespairingly +undespatched +undespised +undespising +undespoiled +undespondent +undespondently +undesponding +undespotic +undestined +undestroyable +undestroyed +undestructible +undestructive +undetachable +undetached +undetailed +undetainable +undetained +undetectable +undetected +undetectible +undeteriorated +undeteriorating +undeterminable +undeterminate +undetermination +undetermined +undetermining +undeterred +undeterring +undetested +undetesting +undethronable +undethroned +undetracting +undetractingly +undetrimental +undevelopable +undeveloped +undeveloping +undeviated +undeviating +undeviatingly +undevil +undevious +undeviously +undevisable +undevised +undevoted +undevotion +undevotional +undevoured +undevout +undevoutly +undevoutness +undewed +undewy +undexterous +undexterously +undextrous +undextrously +undiademed +undiagnosable +undiagnosed +undialed +undialyzed +undiametric +undiamonded +undiapered +undiaphanous +undiatonic +undichotomous +undictated +undid +undidactic +undies +undieted +undifferenced +undifferent +undifferential +undifferentiated +undifficult +undiffident +undiffracted +undiffused +undiffusible +undiffusive +undig +undigenous +undigest +undigestable +undigested +undigestible +undigesting +undigestion +undigged +undight +undighted +undigitated +undignified +undignifiedly +undignifiedness +undignify +undiked +undilapidated +undilatable +undilated +undilatory +undiligent +undiligently +undilute +undiluted +undilution +undiluvial +undim +undimensioned +undimerous +undimidiate +undiminishable +undiminishableness +undiminishably +undiminished +undiminishing +undiminutive +undimmed +undimpled +Undine +undine +undined +undinted +undiocesed +undiphthongize +undiplomaed +undiplomatic +undipped +undirect +undirected +undirectional +undirectly +undirectness +undirk +undisabled +undisadvantageous +undisagreeable +undisappearing +undisappointable +undisappointed +undisappointing +undisarmed +undisastrous +undisbanded +undisbarred +undisburdened +undisbursed +undiscardable +undiscarded +undiscerned +undiscernedly +undiscernible +undiscernibleness +undiscernibly +undiscerning +undiscerningly +undischargeable +undischarged +undiscipled +undisciplinable +undiscipline +undisciplined +undisciplinedness +undisclaimed +undisclosed +undiscolored +undiscomfitable +undiscomfited +undiscomposed +undisconcerted +undisconnected +undiscontinued +undiscordant +undiscording +undiscounted +undiscourageable +undiscouraged +undiscouraging +undiscoursed +undiscoverable +undiscoverableness +undiscoverably +undiscovered +undiscreditable +undiscredited +undiscreet +undiscreetly +undiscreetness +undiscretion +undiscriminated +undiscriminating +undiscriminatingly +undiscriminatingness +undiscriminative +undiscursive +undiscussable +undiscussed +undisdained +undisdaining +undiseased +undisestablished +undisfigured +undisfranchised +undisfulfilled +undisgorged +undisgraced +undisguisable +undisguise +undisguised +undisguisedly +undisguisedness +undisgusted +undisheartened +undished +undisheveled +undishonored +undisillusioned +undisinfected +undisinheritable +undisinherited +undisintegrated +undisinterested +undisjoined +undisjointed +undisliked +undislocated +undislodgeable +undislodged +undismantled +undismay +undismayable +undismayed +undismayedly +undismembered +undismissed +undismounted +undisobedient +undisobeyed +undisobliging +undisordered +undisorderly +undisorganized +undisowned +undisowning +undisparaged +undisparity +undispassionate +undispatchable +undispatched +undispatching +undispellable +undispelled +undispensable +undispensed +undispensing +undispersed +undispersing +undisplaced +undisplanted +undisplay +undisplayable +undisplayed +undisplaying +undispleased +undispose +undisposed +undisposedness +undisprivacied +undisprovable +undisproved +undisproving +undisputable +undisputableness +undisputably +undisputatious +undisputatiously +undisputed +undisputedly +undisputedness +undisputing +undisqualifiable +undisqualified +undisquieted +undisreputable +undisrobed +undisrupted +undissected +undissembled +undissembledness +undissembling +undissemblingly +undisseminated +undissenting +undissevered +undissimulated +undissipated +undissociated +undissoluble +undissolute +undissolvable +undissolved +undissolving +undissonant +undissuadable +undissuadably +undissuade +undistanced +undistant +undistantly +undistasted +undistasteful +undistempered +undistend +undistended +undistilled +undistinct +undistinctive +undistinctly +undistinctness +undistinguish +undistinguishable +undistinguishableness +undistinguishably +undistinguished +undistinguishing +undistinguishingly +undistorted +undistorting +undistracted +undistractedly +undistractedness +undistracting +undistractingly +undistrained +undistraught +undistress +undistressed +undistributed +undistrusted +undistrustful +undisturbable +undisturbance +undisturbed +undisturbedly +undisturbedness +undisturbing +undisturbingly +unditched +undithyrambic +undittoed +undiuretic +undiurnal +undivable +undivergent +undiverging +undiverse +undiversified +undiverted +undivertible +undivertibly +undiverting +undivested +undivestedly +undividable +undividableness +undividably +undivided +undividedly +undividedness +undividing +undivinable +undivined +undivinelike +undivinely +undivining +undivisible +undivisive +undivorceable +undivorced +undivorcedness +undivorcing +undivulged +undivulging +undizened +undizzied +undo +undoable +undock +undocked +undoctor +undoctored +undoctrinal +undoctrined +undocumentary +undocumented +undocumentedness +undodged +undoer +undoffed +undog +undogmatic +undogmatical +undoing +undoingness +undolled +undolorous +undomed +undomestic +undomesticate +undomesticated +undomestication +undomicilable +undomiciled +undominated +undomineering +undominical +undominoed +undon +undonated +undonating +undone +undoneness +undonkey +undonnish +undoomed +undoped +undormant +undose +undosed +undoting +undotted +undouble +undoubled +undoubtable +undoubtableness +undoubtably +undoubted +undoubtedly +undoubtedness +undoubtful +undoubtfully +undoubtfulness +undoubting +undoubtingly +undoubtingness +undouched +undoughty +undovelike +undoweled +undowered +undowned +undowny +undrab +undraftable +undrafted +undrag +undragoned +undragooned +undrainable +undrained +undramatic +undramatical +undramatically +undramatizable +undramatized +undrape +undraped +undraperied +undraw +undrawable +undrawn +undreaded +undreadful +undreadfully +undreading +undreamed +undreaming +undreamlike +undreamt +undreamy +undredged +undreggy +undrenched +undress +undressed +undried +undrillable +undrilled +undrinkable +undrinkableness +undrinkably +undrinking +undripping +undrivable +undrivableness +undriven +undronelike +undrooping +undropped +undropsical +undrossy +undrowned +undrubbed +undrugged +undrunk +undrunken +undry +undryable +undrying +undualize +undub +undubbed +undubitable +undubitably +unducal +unduchess +undue +unduelling +undueness +undug +unduke +undulant +undular +undularly +undulatance +undulate +undulated +undulately +undulating +undulatingly +undulation +undulationist +undulative +undulatory +undull +undulled +undullness +unduloid +undulose +undulous +unduly +undumped +unduncelike +undunged +undupable +unduped +unduplicability +unduplicable +unduplicity +undurable +undurableness +undurably +undust +undusted +unduteous +undutiable +undutiful +undutifully +undutifulness +unduty +undwarfed +undwelt +undwindling +undy +undye +undyeable +undyed +undying +undyingly +undyingness +uneager +uneagerly +uneagerness +uneagled +unearly +unearned +unearnest +unearth +unearthed +unearthliness +unearthly +unease +uneaseful +uneasefulness +uneasily +uneasiness +uneastern +uneasy +uneatable +uneatableness +uneaten +uneath +uneating +unebbed +unebbing +unebriate +uneccentric +unecclesiastical +unechoed +unechoing +uneclectic +uneclipsed +uneconomic +uneconomical +uneconomically +uneconomicalness +uneconomizing +unecstatic +unedge +unedged +unedible +unedibleness +unedibly +unedified +unedifying +uneditable +unedited +uneducable +uneducableness +uneducably +uneducate +uneducated +uneducatedly +uneducatedness +uneducative +uneduced +uneffaceable +uneffaceably +uneffaced +uneffected +uneffectible +uneffective +uneffectless +uneffectual +uneffectually +uneffectualness +uneffectuated +uneffeminate +uneffeminated +uneffervescent +uneffete +unefficacious +unefficient +uneffigiated +uneffused +uneffusing +uneffusive +unegoist +unegoistical +unegoistically +unegregious +unejaculated +unejected +unelaborate +unelaborated +unelaborately +unelaborateness +unelapsed +unelastic +unelasticity +unelated +unelating +unelbowed +unelderly +unelect +unelectable +unelected +unelective +unelectric +unelectrical +unelectrified +unelectrify +unelectrifying +unelectrized +unelectronic +uneleemosynary +unelegant +unelegantly +unelegantness +unelemental +unelementary +unelevated +unelicited +unelided +unelidible +uneligibility +uneligible +uneligibly +uneliminated +unelongated +uneloped +uneloping +uneloquent +uneloquently +unelucidated +unelucidating +uneluded +unelusive +unemaciated +unemancipable +unemancipated +unemasculated +unembalmed +unembanked +unembarrassed +unembarrassedly +unembarrassedness +unembarrassing +unembarrassment +unembased +unembattled +unembayed +unembellished +unembezzled +unembittered +unemblazoned +unembodied +unembodiment +unembossed +unembowelled +unembowered +unembraceable +unembraced +unembroidered +unembroiled +unembryonic +unemendable +unemended +unemerged +unemerging +unemigrating +uneminent +uneminently +unemitted +unemolumentary +unemolumented +unemotional +unemotionalism +unemotionally +unemotionalness +unemotioned +unempaneled +unemphatic +unemphatical +unemphatically +unempirical +unempirically +unemploy +unemployability +unemployable +unemployableness +unemployably +unemployed +unemployment +unempoisoned +unempowered +unempt +unemptiable +unemptied +unempty +unemulative +unemulous +unemulsified +unenabled +unenacted +unenameled +unenamored +unencamped +unenchafed +unenchant +unenchanted +unencircled +unenclosed +unencompassed +unencored +unencounterable +unencountered +unencouraged +unencouraging +unencroached +unencroaching +unencumber +unencumbered +unencumberedly +unencumberedness +unencumbering +unencysted +unendable +unendamaged +unendangered +unendeared +unendeavored +unended +unending +unendingly +unendingness +unendorsable +unendorsed +unendowed +unendowing +unendued +unendurability +unendurable +unendurably +unendured +unenduring +unenduringly +unenergetic +unenergized +unenervated +unenfeebled +unenfiladed +unenforceable +unenforced +unenforcedly +unenforcedness +unenforcibility +unenfranchised +unengaged +unengaging +unengendered +unengineered +unenglish +unengraved +unengraven +unengrossed +unenhanced +unenjoined +unenjoyable +unenjoyed +unenjoying +unenjoyingly +unenkindled +unenlarged +unenlightened +unenlightening +unenlisted +unenlivened +unenlivening +unennobled +unennobling +unenounced +unenquired +unenquiring +unenraged +unenraptured +unenrichable +unenrichableness +unenriched +unenriching +unenrobed +unenrolled +unenshrined +unenslave +unenslaved +unensnared +unensouled +unensured +unentailed +unentangle +unentangleable +unentangled +unentanglement +unentangler +unenterable +unentered +unentering +unenterprise +unenterprised +unenterprising +unenterprisingly +unenterprisingness +unentertainable +unentertained +unentertaining +unentertainingly +unentertainingness +unenthralled +unenthralling +unenthroned +unenthusiasm +unenthusiastic +unenthusiastically +unenticed +unenticing +unentire +unentitled +unentombed +unentomological +unentrance +unentranced +unentrapped +unentreated +unentreating +unentrenched +unentwined +unenumerable +unenumerated +unenveloped +unenvenomed +unenviable +unenviably +unenvied +unenviedly +unenvious +unenviously +unenvironed +unenvying +unenwoven +unepauleted +unephemeral +unepic +unepicurean +unepigrammatic +unepilogued +unepiscopal +unepiscopally +unepistolary +unepitaphed +unepithelial +unepitomized +unequable +unequableness +unequably +unequal +unequalable +unequaled +unequality +unequalize +unequalized +unequally +unequalness +unequated +unequatorial +unequestrian +unequiangular +unequiaxed +unequilateral +unequilibrated +unequine +unequipped +unequitable +unequitableness +unequitably +unequivalent +unequivalve +unequivalved +unequivocal +unequivocally +unequivocalness +uneradicable +uneradicated +unerasable +unerased +unerasing +unerect +unerected +unermined +uneroded +unerrable +unerrableness +unerrably +unerrancy +unerrant +unerratic +unerring +unerringly +unerringness +unerroneous +unerroneously +unerudite +unerupted +uneruptive +unescaladed +unescalloped +unescapable +unescapableness +unescapably +unescaped +unescheated +uneschewable +uneschewably +uneschewed +Unesco +unescorted +unescutcheoned +unesoteric +unespied +unespousable +unespoused +unessayed +unessence +unessential +unessentially +unessentialness +unestablish +unestablishable +unestablished +unestablishment +unesteemed +unestimable +unestimableness +unestimably +unestimated +unestopped +unestranged +unetched +uneternal +uneternized +unethereal +unethic +unethical +unethically +unethicalness +unethnological +unethylated +unetymological +unetymologizable +uneucharistical +uneugenic +uneulogized +uneuphemistical +uneuphonic +uneuphonious +uneuphoniously +uneuphoniousness +unevacuated +unevadable +unevaded +unevaluated +unevanescent +unevangelic +unevangelical +unevangelized +unevaporate +unevaporated +unevasive +uneven +unevenly +unevenness +uneventful +uneventfully +uneventfulness +uneverted +unevicted +unevidenced +unevident +unevidential +unevil +unevinced +unevirated +uneviscerated +unevitable +unevitably +unevokable +unevoked +unevolutionary +unevolved +unexacerbated +unexact +unexacted +unexactedly +unexacting +unexactingly +unexactly +unexactness +unexaggerable +unexaggerated +unexaggerating +unexalted +unexaminable +unexamined +unexamining +unexampled +unexampledness +unexasperated +unexasperating +unexcavated +unexceedable +unexceeded +unexcelled +unexcellent +unexcelling +unexceptable +unexcepted +unexcepting +unexceptionability +unexceptionable +unexceptionableness +unexceptionably +unexceptional +unexceptionally +unexceptionalness +unexceptive +unexcerpted +unexcessive +unexchangeable +unexchangeableness +unexchanged +unexcised +unexcitability +unexcitable +unexcited +unexciting +unexclaiming +unexcludable +unexcluded +unexcluding +unexclusive +unexclusively +unexclusiveness +unexcogitable +unexcogitated +unexcommunicated +unexcoriated +unexcorticated +unexcrescent +unexcreted +unexcruciating +unexculpable +unexculpably +unexculpated +unexcursive +unexcusable +unexcusableness +unexcusably +unexcused +unexcusedly +unexcusedness +unexcusing +unexecrated +unexecutable +unexecuted +unexecuting +unexecutorial +unexemplary +unexemplifiable +unexemplified +unexempt +unexempted +unexemptible +unexempting +unexercisable +unexercise +unexercised +unexerted +unexhalable +unexhaled +unexhausted +unexhaustedly +unexhaustedness +unexhaustible +unexhaustibleness +unexhaustibly +unexhaustion +unexhaustive +unexhaustiveness +unexhibitable +unexhibitableness +unexhibited +unexhilarated +unexhilarating +unexhorted +unexhumed +unexigent +unexilable +unexiled +unexistence +unexistent +unexisting +unexonerable +unexonerated +unexorable +unexorableness +unexorbitant +unexorcisable +unexorcisably +unexorcised +unexotic +unexpandable +unexpanded +unexpanding +unexpansive +unexpectable +unexpectant +unexpected +unexpectedly +unexpectedness +unexpecting +unexpectingly +unexpectorated +unexpedient +unexpeditated +unexpedited +unexpeditious +unexpelled +unexpendable +unexpended +unexpensive +unexpensively +unexpensiveness +unexperience +unexperienced +unexperiencedness +unexperient +unexperiential +unexperimental +unexperimented +unexpert +unexpertly +unexpertness +unexpiable +unexpiated +unexpired +unexpiring +unexplainable +unexplainableness +unexplainably +unexplained +unexplainedly +unexplainedness +unexplaining +unexplanatory +unexplicable +unexplicableness +unexplicably +unexplicated +unexplicit +unexplicitly +unexplicitness +unexploded +unexploitation +unexploited +unexplorable +unexplorative +unexplored +unexplosive +unexportable +unexported +unexporting +unexposable +unexposed +unexpostulating +unexpoundable +unexpounded +unexpress +unexpressable +unexpressableness +unexpressably +unexpressed +unexpressedly +unexpressible +unexpressibleness +unexpressibly +unexpressive +unexpressively +unexpressiveness +unexpressly +unexpropriable +unexpropriated +unexpugnable +unexpunged +unexpurgated +unexpurgatedly +unexpurgatedness +unextended +unextendedly +unextendedness +unextendible +unextensible +unextenuable +unextenuated +unextenuating +unexterminable +unexterminated +unexternal +unexternality +unexterritoriality +unextinct +unextinctness +unextinguishable +unextinguishableness +unextinguishably +unextinguished +unextirpated +unextolled +unextortable +unextorted +unextractable +unextracted +unextradited +unextraneous +unextraordinary +unextravagance +unextravagant +unextravagating +unextravasated +unextreme +unextricable +unextricated +unextrinsic +unextruded +unexuberant +unexuded +unexultant +uneye +uneyeable +uneyed +unfabled +unfabling +unfabricated +unfabulous +unfacaded +unface +unfaceable +unfaced +unfaceted +unfacetious +unfacile +unfacilitated +unfact +unfactional +unfactious +unfactitious +unfactorable +unfactored +unfactual +unfadable +unfaded +unfading +unfadingly +unfadingness +unfagged +unfagoted +unfailable +unfailableness +unfailably +unfailed +unfailing +unfailingly +unfailingness +unfain +unfaint +unfainting +unfaintly +unfair +unfairly +unfairminded +unfairness +unfairylike +unfaith +unfaithful +unfaithfully +unfaithfulness +unfaked +unfallacious +unfallaciously +unfallen +unfallenness +unfallible +unfallibleness +unfallibly +unfalling +unfallowed +unfalse +unfalsifiable +unfalsified +unfalsifiedness +unfalsity +unfaltering +unfalteringly +unfamed +unfamiliar +unfamiliarity +unfamiliarized +unfamiliarly +unfanatical +unfanciable +unfancied +unfanciful +unfancy +unfanged +unfanned +unfantastic +unfantastical +unfantastically +unfar +unfarced +unfarcical +unfarewelled +unfarmed +unfarming +unfarrowed +unfarsighted +unfasciated +unfascinate +unfascinated +unfascinating +unfashion +unfashionable +unfashionableness +unfashionably +unfashioned +unfast +unfasten +unfastenable +unfastened +unfastener +unfastidious +unfastidiously +unfastidiousness +unfasting +unfather +unfathered +unfatherlike +unfatherliness +unfatherly +unfathomability +unfathomable +unfathomableness +unfathomably +unfathomed +unfatigue +unfatigueable +unfatigued +unfatiguing +unfattable +unfatted +unfatten +unfauceted +unfaultfinding +unfaulty +unfavorable +unfavorableness +unfavorably +unfavored +unfavoring +unfavorite +unfawning +unfealty +unfeared +unfearful +unfearfully +unfearing +unfearingly +unfeary +unfeasable +unfeasableness +unfeasably +unfeasibility +unfeasible +unfeasibleness +unfeasibly +unfeasted +unfeather +unfeathered +unfeatured +unfecund +unfecundated +unfed +unfederal +unfederated +unfeeble +unfeed +unfeedable +unfeeding +unfeeing +unfeelable +unfeeling +unfeelingly +unfeelingness +unfeignable +unfeignableness +unfeignably +unfeigned +unfeignedly +unfeignedness +unfeigning +unfeigningly +unfeigningness +unfele +unfelicitated +unfelicitating +unfelicitous +unfelicitously +unfelicitousness +unfeline +unfellable +unfelled +unfellied +unfellow +unfellowed +unfellowlike +unfellowly +unfellowshiped +unfelon +unfelonious +unfeloniously +unfelony +unfelt +unfelted +unfemale +unfeminine +unfemininely +unfeminineness +unfemininity +unfeminist +unfeminize +unfence +unfenced +unfendered +unfenestrated +unfeoffed +unfermentable +unfermentableness +unfermentably +unfermented +unfermenting +unfernlike +unferocious +unferreted +unferried +unfertile +unfertileness +unfertility +unfertilizable +unfertilized +unfervent +unfervid +unfester +unfestered +unfestival +unfestive +unfestively +unfestooned +unfetchable +unfetched +unfeted +unfetter +unfettered +unfettled +unfeudal +unfeudalize +unfeudalized +unfeued +unfevered +unfeverish +unfew +unfibbed +unfibbing +unfiber +unfibered +unfibrous +unfickle +unfictitious +unfidelity +unfidgeting +unfielded +unfiend +unfiendlike +unfierce +unfiery +unfight +unfightable +unfighting +unfigurable +unfigurative +unfigured +unfilamentous +unfilched +unfile +unfiled +unfilial +unfilially +unfilialness +unfill +unfillable +unfilled +unfilleted +unfilling +unfilm +unfilmed +unfiltered +unfiltrated +unfinable +unfinancial +unfine +unfined +unfinessed +unfingered +unfinical +unfinish +unfinishable +unfinished +unfinishedly +unfinishedness +unfinite +unfired +unfireproof +unfiring +unfirm +unfirmamented +unfirmly +unfirmness +unfiscal +unfishable +unfished +unfishing +unfishlike +unfissile +unfistulous +unfit +unfitly +unfitness +unfittable +unfitted +unfittedness +unfitten +unfitting +unfittingly +unfittingness +unfitty +unfix +unfixable +unfixated +unfixed +unfixedness +unfixing +unfixity +unflag +unflagged +unflagging +unflaggingly +unflaggingness +unflagitious +unflagrant +unflaky +unflamboyant +unflaming +unflanged +unflank +unflanked +unflapping +unflashing +unflat +unflated +unflattened +unflatterable +unflattered +unflattering +unflatteringly +unflaunted +unflavored +unflawed +unflayed +unflead +unflecked +unfledge +unfledged +unfledgedness +unfleece +unfleeced +unfleeing +unfleeting +unflesh +unfleshed +unfleshliness +unfleshly +unfleshy +unfletched +unflexed +unflexible +unflexibleness +unflexibly +unflickering +unflickeringly +unflighty +unflinching +unflinchingly +unflinchingness +unflintify +unflippant +unflirtatious +unflitched +unfloatable +unfloating +unflock +unfloggable +unflogged +unflooded +unfloor +unfloored +unflorid +unflossy +unflounced +unfloured +unflourished +unflourishing +unflouted +unflower +unflowered +unflowing +unflown +unfluctuating +unfluent +unfluid +unfluked +unflunked +unfluorescent +unflurried +unflush +unflushed +unflustered +unfluted +unflutterable +unfluttered +unfluttering +unfluvial +unfluxile +unflying +unfoaled +unfoaming +unfocused +unfoggy +unfoilable +unfoiled +unfoisted +unfold +unfoldable +unfolded +unfolder +unfolding +unfoldment +unfoldure +unfoliaged +unfoliated +unfollowable +unfollowed +unfollowing +unfomented +unfond +unfondled +unfondness +unfoodful +unfool +unfoolable +unfooled +unfooling +unfoolish +unfooted +unfootsore +unfoppish +unforaged +unforbade +unforbearance +unforbearing +unforbid +unforbidden +unforbiddenly +unforbiddenness +unforbidding +unforceable +unforced +unforcedly +unforcedness +unforceful +unforcible +unforcibleness +unforcibly +unfordable +unfordableness +unforded +unforeboded +unforeboding +unforecasted +unforegone +unforeign +unforeknowable +unforeknown +unforensic +unforeordained +unforesee +unforeseeable +unforeseeableness +unforeseeably +unforeseeing +unforeseeingly +unforeseen +unforeseenly +unforeseenness +unforeshortened +unforest +unforestallable +unforestalled +unforested +unforetellable +unforethought +unforethoughtful +unforetold +unforewarned +unforewarnedness +unforfeit +unforfeitable +unforfeited +unforgeability +unforgeable +unforged +unforget +unforgetful +unforgettable +unforgettableness +unforgettably +unforgetting +unforgettingly +unforgivable +unforgivableness +unforgivably +unforgiven +unforgiveness +unforgiver +unforgiving +unforgivingly +unforgivingness +unforgone +unforgot +unforgotten +unfork +unforked +unforkedness +unforlorn +unform +unformal +unformality +unformalized +unformally +unformalness +unformative +unformed +unformidable +unformulable +unformularizable +unformularize +unformulated +unformulistic +unforsaken +unforsaking +unforsook +unforsworn +unforthright +unfortifiable +unfortified +unfortify +unfortuitous +unfortunate +unfortunately +unfortunateness +unfortune +unforward +unforwarded +unfossiliferous +unfossilized +unfostered +unfought +unfoughten +unfoul +unfoulable +unfouled +unfound +unfounded +unfoundedly +unfoundedness +unfoundered +unfountained +unfowllike +unfoxy +unfractured +unfragrance +unfragrant +unfragrantly +unfrail +unframable +unframableness +unframably +unframe +unframed +unfranchised +unfrank +unfrankable +unfranked +unfrankly +unfrankness +unfraternal +unfraternizing +unfraudulent +unfraught +unfrayed +unfreckled +unfree +unfreed +unfreedom +unfreehold +unfreely +unfreeman +unfreeness +unfreezable +unfreeze +unfreezing +unfreighted +unfrenchified +unfrenzied +unfrequency +unfrequent +unfrequented +unfrequentedness +unfrequently +unfrequentness +unfret +unfretful +unfretting +unfriable +unfriarlike +unfricative +unfrictioned +unfried +unfriend +unfriended +unfriendedness +unfriending +unfriendlike +unfriendlily +unfriendliness +unfriendly +unfriendship +unfrighted +unfrightenable +unfrightened +unfrightenedness +unfrightful +unfrigid +unfrill +unfrilled +unfringe +unfringed +unfrisky +unfrivolous +unfrizz +unfrizzled +unfrizzy +unfrock +unfrocked +unfroglike +unfrolicsome +unfronted +unfrost +unfrosted +unfrosty +unfrounced +unfroward +unfrowardly +unfrowning +unfroze +unfrozen +unfructed +unfructified +unfructify +unfructuous +unfructuously +unfrugal +unfrugally +unfrugalness +unfruitful +unfruitfully +unfruitfulness +unfruity +unfrustrable +unfrustrably +unfrustratable +unfrustrated +unfrutuosity +unfuddled +unfueled +unfulfill +unfulfillable +unfulfilled +unfulfilling +unfulfillment +unfull +unfulled +unfully +unfulminated +unfulsome +unfumbled +unfumbling +unfumed +unfumigated +unfunctional +unfundamental +unfunded +unfunnily +unfunniness +unfunny +unfur +unfurbelowed +unfurbished +unfurcate +unfurious +unfurl +unfurlable +unfurnish +unfurnished +unfurnishedness +unfurnitured +unfurred +unfurrow +unfurrowable +unfurrowed +unfurthersome +unfused +unfusible +unfusibleness +unfusibly +unfussed +unfussing +unfussy +unfutile +unfuturistic +ungabled +ungag +ungaged +ungagged +ungain +ungainable +ungained +ungainful +ungainfully +ungainfulness +ungaining +ungainlike +ungainliness +ungainly +ungainness +ungainsaid +ungainsayable +ungainsayably +ungainsaying +ungainsome +ungainsomely +ungaite +ungallant +ungallantly +ungallantness +ungalling +ungalvanized +ungamboling +ungamelike +unganged +ungangrened +ungarbed +ungarbled +ungardened +ungargled +ungarland +ungarlanded +ungarment +ungarmented +ungarnered +ungarnish +ungarnished +ungaro +ungarrisoned +ungarter +ungartered +ungashed +ungassed +ungastric +ungathered +ungaudy +ungauged +ungauntlet +ungauntleted +ungazetted +ungazing +ungear +ungeared +ungelatinizable +ungelatinized +ungelded +ungelt +ungeminated +ungenerable +ungeneral +ungeneraled +ungeneralized +ungenerate +ungenerated +ungenerative +ungeneric +ungenerical +ungenerosity +ungenerous +ungenerously +ungenerousness +ungenial +ungeniality +ungenially +ungenialness +ungenitured +ungenius +ungenteel +ungenteelly +ungenteelness +ungentile +ungentility +ungentilize +ungentle +ungentled +ungentleman +ungentlemanize +ungentlemanlike +ungentlemanlikeness +ungentlemanliness +ungentlemanly +ungentleness +ungentlewomanlike +ungently +ungenuine +ungenuinely +ungenuineness +ungeodetical +ungeographic +ungeographical +ungeographically +ungeological +ungeometric +ungeometrical +ungeometrically +ungeometricalness +ungerminated +ungerminating +ungermlike +ungerontic +ungesting +ungesturing +unget +ungettable +unghostlike +unghostly +ungiant +ungibbet +ungiddy +ungifted +ungiftedness +ungild +ungilded +ungill +ungilt +ungingled +unginned +ungird +ungirded +ungirdle +ungirdled +ungirlish +ungirt +ungirth +ungirthed +ungive +ungiveable +ungiven +ungiving +ungka +unglaciated +unglad +ungladden +ungladdened +ungladly +ungladness +ungladsome +unglamorous +unglandular +unglassed +unglaze +unglazed +ungleaned +unglee +ungleeful +unglimpsed +unglistening +unglittering +ungloating +unglobe +unglobular +ungloom +ungloomed +ungloomy +unglorified +unglorify +unglorifying +unglorious +ungloriously +ungloriousness +unglory +unglosed +ungloss +unglossaried +unglossed +unglossily +unglossiness +unglossy +unglove +ungloved +unglowing +unglozed +unglue +unglued +unglutinate +unglutted +ungluttonous +ungnarred +ungnaw +ungnawn +ungnostic +ungoaded +ungoatlike +ungod +ungoddess +ungodlike +ungodlily +ungodliness +ungodly +ungodmothered +ungold +ungolden +ungone +ungood +ungoodliness +ungoodly +ungored +ungorge +ungorged +ungorgeous +ungospel +ungospelized +ungospelled +ungospellike +ungossiping +ungot +ungothic +ungotten +ungouged +ungouty +ungovernable +ungovernableness +ungovernably +ungoverned +ungovernedness +ungoverning +ungown +ungowned +ungrace +ungraced +ungraceful +ungracefully +ungracefulness +ungracious +ungraciously +ungraciousness +ungradated +ungraded +ungradual +ungradually +ungraduated +ungraduating +ungraft +ungrafted +ungrain +ungrainable +ungrained +ungrammar +ungrammared +ungrammatic +ungrammatical +ungrammatically +ungrammaticalness +ungrammaticism +ungrand +ungrantable +ungranted +ungranulated +ungraphic +ungraphitized +ungrapple +ungrappled +ungrappler +ungrasp +ungraspable +ungrasped +ungrasping +ungrassed +ungrassy +ungrated +ungrateful +ungratefully +ungratefulness +ungratifiable +ungratified +ungratifying +ungrating +ungrave +ungraved +ungraveled +ungravelly +ungravely +ungraven +ungrayed +ungrazed +ungreased +ungreat +ungreatly +ungreatness +ungreeable +ungreedy +ungreen +ungreenable +ungreened +ungreeted +ungregarious +ungrieve +ungrieved +ungrieving +ungrilled +ungrimed +ungrindable +ungrip +ungripe +ungrizzled +ungroaning +ungroined +ungroomed +ungrooved +ungropeable +ungross +ungrotesque +unground +ungroundable +ungroundably +ungrounded +ungroundedly +ungroundedness +ungroupable +ungrouped +ungrow +ungrowing +ungrown +ungrubbed +ungrudged +ungrudging +ungrudgingly +ungrudgingness +ungruesome +ungruff +ungrumbling +ungual +unguaranteed +unguard +unguardable +unguarded +unguardedly +unguardedness +ungueal +unguent +unguentaria +unguentarium +unguentary +unguentiferous +unguentous +unguentum +unguerdoned +ungues +unguessable +unguessableness +unguessed +unguical +unguicorn +unguicular +Unguiculata +unguiculate +unguiculated +unguidable +unguidableness +unguidably +unguided +unguidedly +unguiferous +unguiform +unguiled +unguileful +unguilefully +unguilefulness +unguillotined +unguiltily +unguiltiness +unguilty +unguinal +unguinous +unguirostral +unguis +ungula +ungulae +ungular +Ungulata +ungulate +ungulated +unguled +unguligrade +ungull +ungulous +ungulp +ungum +ungummed +ungushing +ungutted +unguttural +unguyed +unguzzled +ungymnastic +ungypsylike +ungyve +ungyved +unhabit +unhabitable +unhabitableness +unhabited +unhabitual +unhabitually +unhabituate +unhabituated +unhacked +unhackled +unhackneyed +unhackneyedness +unhad +unhaft +unhafted +unhaggled +unhaggling +unhailable +unhailed +unhair +unhaired +unhairer +unhairily +unhairiness +unhairing +unhairy +unhallooed +unhallow +unhallowed +unhallowedness +unhaloed +unhalsed +unhalted +unhalter +unhaltered +unhalting +unhalved +unhammered +unhamper +unhampered +unhand +unhandcuff +unhandcuffed +unhandicapped +unhandily +unhandiness +unhandled +unhandseled +unhandsome +unhandsomely +unhandsomeness +unhandy +unhang +unhanged +unhap +unhappen +unhappily +unhappiness +unhappy +unharangued +unharassed +unharbor +unharbored +unhard +unharden +unhardenable +unhardened +unhardihood +unhardily +unhardiness +unhardness +unhardy +unharked +unharmable +unharmed +unharmful +unharmfully +unharming +unharmonic +unharmonical +unharmonious +unharmoniously +unharmoniousness +unharmonize +unharmonized +unharmony +unharness +unharnessed +unharped +unharried +unharrowed +unharsh +unharvested +unhashed +unhasp +unhasped +unhaste +unhasted +unhastened +unhastily +unhastiness +unhasting +unhasty +unhat +unhatchability +unhatchable +unhatched +unhatcheled +unhate +unhated +unhateful +unhating +unhatingly +unhatted +unhauled +unhaunt +unhaunted +unhave +unhawked +unhayed +unhazarded +unhazarding +unhazardous +unhazardousness +unhazed +unhead +unheaded +unheader +unheady +unheal +unhealable +unhealableness +unhealably +unhealed +unhealing +unhealth +unhealthful +unhealthfully +unhealthfulness +unhealthily +unhealthiness +unhealthsome +unhealthsomeness +unhealthy +unheaped +unhearable +unheard +unhearing +unhearsed +unheart +unhearten +unheartsome +unhearty +unheatable +unheated +unheathen +unheaved +unheaven +unheavenly +unheavily +unheaviness +unheavy +unhectored +unhedge +unhedged +unheed +unheeded +unheededly +unheedful +unheedfully +unheedfulness +unheeding +unheedingly +unheedy +unheeled +unheelpieced +unhefted +unheightened +unheired +unheld +unhele +unheler +unhelm +unhelmed +unhelmet +unhelmeted +unhelpable +unhelpableness +unhelped +unhelpful +unhelpfully +unhelpfulness +unhelping +unhelved +unhemmed +unheppen +unheralded +unheraldic +unherd +unherded +unhereditary +unheretical +unheritable +unhermetic +unhero +unheroic +unheroical +unheroically +unheroism +unheroize +unherolike +unhesitant +unhesitating +unhesitatingly +unhesitatingness +unheuristic +unhewable +unhewed +unhewn +unhex +unhid +unhidable +unhidableness +unhidably +unhidated +unhidden +unhide +unhidebound +unhideous +unhieratic +unhigh +unhilarious +unhinderable +unhinderably +unhindered +unhindering +unhinge +unhingement +unhinted +unhipped +unhired +unhissed +unhistoric +unhistorical +unhistorically +unhistory +unhistrionic +unhit +unhitch +unhitched +unhittable +unhive +unhoard +unhoarded +unhoarding +unhoary +unhoaxed +unhobble +unhocked +unhoed +unhogged +unhoist +unhoisted +unhold +unholiday +unholily +unholiness +unhollow +unhollowed +unholy +unhome +unhomelike +unhomelikeness +unhomeliness +unhomely +unhomish +unhomogeneity +unhomogeneous +unhomogeneously +unhomologous +unhoned +unhonest +unhonestly +unhoneyed +unhonied +unhonorable +unhonorably +unhonored +unhonoured +unhood +unhooded +unhoodwink +unhoodwinked +unhoofed +unhook +unhooked +unhoop +unhooped +unhooper +unhooted +unhoped +unhopedly +unhopedness +unhopeful +unhopefully +unhopefulness +unhoping +unhopingly +unhopped +unhoppled +unhorizoned +unhorizontal +unhorned +unhorny +unhoroscopic +unhorse +unhose +unhosed +unhospitable +unhospitableness +unhospitably +unhostile +unhostilely +unhostileness +unhostility +unhot +unhoundlike +unhouse +unhoused +unhouseled +unhouselike +unhousewifely +unhuddle +unhugged +unhull +unhulled +unhuman +unhumanize +unhumanized +unhumanly +unhumanness +unhumble +unhumbled +unhumbledness +unhumbleness +unhumbly +unhumbugged +unhumid +unhumiliated +unhumored +unhumorous +unhumorously +unhumorousness +unhumoured +unhung +unhuntable +unhunted +unhurdled +unhurled +unhurried +unhurriedly +unhurriedness +unhurrying +unhurryingly +unhurt +unhurted +unhurtful +unhurtfully +unhurtfulness +unhurting +unhusbanded +unhusbandly +unhushable +unhushed +unhushing +unhusk +unhusked +unhustled +unhustling +unhutched +unhuzzaed +unhydraulic +unhydrolyzed +unhygienic +unhygienically +unhygrometric +unhymeneal +unhymned +unhyphenated +unhyphened +unhypnotic +unhypnotizable +unhypnotize +unhypocritical +unhypocritically +unhypothecated +unhypothetical +unhysterical +uniambic +uniambically +uniangulate +uniarticular +uniarticulate +Uniat +uniat +Uniate +uniate +uniauriculate +uniauriculated +uniaxal +uniaxally +uniaxial +uniaxially +unibasal +unibivalent +unible +unibracteate +unibracteolate +unibranchiate +unicalcarate +unicameral +unicameralism +unicameralist +unicamerate +unicapsular +unicarinate +unicarinated +unice +uniced +unicell +unicellate +unicelled +unicellular +unicellularity +unicentral +unichord +uniciliate +unicism +unicist +unicity +uniclinal +unicolor +unicolorate +unicolored +unicolorous +uniconstant +unicorn +unicorneal +unicornic +unicornlike +unicornous +unicornuted +unicostate +unicotyledonous +unicum +unicursal +unicursality +unicursally +unicuspid +unicuspidate +unicycle +unicyclist +unidactyl +unidactyle +unidactylous +unideaed +unideal +unidealism +unidealist +unidealistic +unidealized +unidentate +unidentated +unidenticulate +unidentifiable +unidentifiableness +unidentifiably +unidentified +unidentifiedly +unidentifying +unideographic +unidextral +unidextrality +unidigitate +unidimensional +unidiomatic +unidiomatically +unidirect +unidirected +unidirection +unidirectional +unidle +unidleness +unidly +unidolatrous +unidolized +unidyllic +unie +uniembryonate +uniequivalent +uniface +unifaced +unifacial +unifactorial +unifarious +unifiable +unific +unification +unificationist +unificator +unified +unifiedly +unifiedness +unifier +unifilar +uniflagellate +unifloral +uniflorate +uniflorous +uniflow +uniflowered +unifocal +unifoliar +unifoliate +unifoliolate +Unifolium +uniform +uniformal +uniformalization +uniformalize +uniformally +uniformation +uniformed +uniformist +uniformitarian +uniformitarianism +uniformity +uniformization +uniformize +uniformless +uniformly +uniformness +unify +unigenesis +unigenetic +unigenist +unigenistic +unigenital +unigeniture +unigenous +uniglandular +uniglobular +unignitable +unignited +unignitible +unignominious +unignorant +unignored +unigravida +uniguttulate +unijugate +unijugous +unilabiate +unilabiated +unilamellar +unilamellate +unilaminar +unilaminate +unilateral +unilateralism +unilateralist +unilaterality +unilateralization +unilateralize +unilaterally +unilinear +unilingual +unilingualism +uniliteral +unilludedly +unillumed +unilluminated +unilluminating +unillumination +unillumined +unillusioned +unillusory +unillustrated +unillustrative +unillustrious +unilobal +unilobar +unilobate +unilobe +unilobed +unilobular +unilocular +unilocularity +uniloculate +unimacular +unimaged +unimaginable +unimaginableness +unimaginably +unimaginary +unimaginative +unimaginatively +unimaginativeness +unimagine +unimagined +unimanual +unimbanked +unimbellished +unimbezzled +unimbibed +unimbibing +unimbittered +unimbodied +unimboldened +unimbordered +unimbosomed +unimbowed +unimbowered +unimbroiled +unimbrowned +unimbrued +unimbued +unimedial +unimitable +unimitableness +unimitably +unimitated +unimitating +unimitative +unimmaculate +unimmanent +unimmediate +unimmerged +unimmergible +unimmersed +unimmigrating +unimmolated +unimmortal +unimmortalize +unimmortalized +unimmovable +unimmured +unimodal +unimodality +unimodular +unimolecular +unimolecularity +unimpair +unimpairable +unimpaired +unimpartable +unimparted +unimpartial +unimpassionate +unimpassioned +unimpassionedly +unimpassionedness +unimpatient +unimpawned +unimpeachability +unimpeachable +unimpeachableness +unimpeachably +unimpeached +unimpearled +unimped +unimpeded +unimpededly +unimpedible +unimpedness +unimpelled +unimpenetrable +unimperative +unimperial +unimperialistic +unimperious +unimpertinent +unimpinging +unimplanted +unimplicable +unimplicate +unimplicated +unimplicit +unimplicitly +unimplied +unimplorable +unimplored +unimpoisoned +unimportance +unimportant +unimportantly +unimported +unimporting +unimportunate +unimportunately +unimportuned +unimposed +unimposedly +unimposing +unimpostrous +unimpounded +unimpoverished +unimpowered +unimprecated +unimpregnable +unimpregnate +unimpregnated +unimpressed +unimpressibility +unimpressible +unimpressibleness +unimpressibly +unimpressionability +unimpressionable +unimpressive +unimpressively +unimpressiveness +unimprinted +unimprison +unimprisonable +unimprisoned +unimpropriated +unimprovable +unimprovableness +unimprovably +unimproved +unimprovedly +unimprovedness +unimprovement +unimproving +unimprovised +unimpugnable +unimpugned +unimpulsive +unimpurpled +unimputable +unimputed +unimucronate +unimultiplex +unimuscular +uninaugurated +unincantoned +unincarcerated +unincarnate +unincarnated +unincensed +uninchoative +unincidental +unincised +unincisive +unincited +uninclinable +uninclined +uninclining +uninclosed +uninclosedness +unincludable +unincluded +uninclusive +uninclusiveness +uninconvenienced +unincorporate +unincorporated +unincorporatedly +unincorporatedness +unincreasable +unincreased +unincreasing +unincubated +uninculcated +unincumbered +unindebted +unindebtedly +unindebtedness +unindemnified +unindentable +unindented +unindentured +unindexed +unindicable +unindicated +unindicative +unindictable +unindicted +unindifference +unindifferency +unindifferent +unindifferently +unindigent +unindignant +unindividual +unindividualize +unindividualized +unindividuated +unindorsed +uninduced +uninductive +unindulged +unindulgent +unindulgently +unindurated +unindustrial +unindustrialized +unindustrious +unindustriously +unindwellable +uninebriated +uninebriating +uninervate +uninerved +uninfallibility +uninfallible +uninfatuated +uninfectable +uninfected +uninfectious +uninfectiousness +uninfeft +uninferred +uninfested +uninfiltrated +uninfinite +uninfiniteness +uninfixed +uninflamed +uninflammability +uninflammable +uninflated +uninflected +uninflectedness +uninflicted +uninfluenceable +uninfluenced +uninfluencing +uninfluencive +uninfluential +uninfluentiality +uninfolded +uninformed +uninforming +uninfracted +uninfringeable +uninfringed +uninfringible +uninfuriated +uninfused +uningenious +uningeniously +uningeniousness +uningenuity +uningenuous +uningenuously +uningenuousness +uningested +uningrafted +uningrained +uninhabitability +uninhabitable +uninhabitableness +uninhabitably +uninhabited +uninhabitedness +uninhaled +uninheritability +uninheritable +uninherited +uninhibited +uninhibitive +uninhumed +uninimical +uniniquitous +uninitialed +uninitialled +uninitiate +uninitiated +uninitiatedness +uninitiation +uninjectable +uninjected +uninjurable +uninjured +uninjuredness +uninjuring +uninjurious +uninjuriously +uninjuriousness +uninked +uninlaid +uninn +uninnate +uninnocence +uninnocent +uninnocently +uninnocuous +uninnovating +uninoculable +uninoculated +uninodal +uninominal +uninquired +uninquiring +uninquisitive +uninquisitively +uninquisitiveness +uninquisitorial +uninsane +uninsatiable +uninscribed +uninserted +uninshrined +uninsinuated +uninsistent +uninsolvent +uninspected +uninspirable +uninspired +uninspiring +uninspiringly +uninspirited +uninspissated +uninstalled +uninstanced +uninstated +uninstigated +uninstilled +uninstituted +uninstructed +uninstructedly +uninstructedness +uninstructible +uninstructing +uninstructive +uninstructively +uninstructiveness +uninstrumental +uninsular +uninsulate +uninsulated +uninsultable +uninsulted +uninsulting +uninsurability +uninsurable +uninsured +unintegrated +unintellective +unintellectual +unintellectualism +unintellectuality +unintellectually +unintelligence +unintelligent +unintelligently +unintelligentsia +unintelligibility +unintelligible +unintelligibleness +unintelligibly +unintended +unintendedly +unintensive +unintent +unintentional +unintentionality +unintentionally +unintentionalness +unintently +unintentness +unintercalated +unintercepted +uninterchangeable +uninterdicted +uninterested +uninterestedly +uninterestedness +uninteresting +uninterestingly +uninterestingness +uninterferedwith +uninterjected +uninterlaced +uninterlarded +uninterleave +uninterleaved +uninterlined +uninterlinked +uninterlocked +unintermarrying +unintermediate +unintermingled +unintermission +unintermissive +unintermitted +unintermittedly +unintermittedness +unintermittent +unintermitting +unintermittingly +unintermittingness +unintermixed +uninternational +uninterpleaded +uninterpolated +uninterposed +uninterposing +uninterpretable +uninterpreted +uninterred +uninterrogable +uninterrogated +uninterrupted +uninterruptedly +uninterruptedness +uninterruptible +uninterruptibleness +uninterrupting +uninterruption +unintersected +uninterspersed +unintervening +uninterviewed +unintervolved +uninterwoven +uninthroned +unintimate +unintimated +unintimidated +unintitled +unintombed +unintoned +unintoxicated +unintoxicatedness +unintoxicating +unintrenchable +unintrenched +unintricate +unintrigued +unintriguing +unintroduced +unintroducible +unintroitive +unintromitted +unintrospective +unintruded +unintruding +unintrusive +unintrusively +unintrusted +unintuitive +unintwined +uninuclear +uninucleate +uninucleated +uninundated +uninured +uninurned +uninvadable +uninvaded +uninvaginated +uninvalidated +uninveighing +uninveigled +uninvented +uninventful +uninventibleness +uninventive +uninventively +uninventiveness +uninverted +uninvested +uninvestigable +uninvestigated +uninvestigating +uninvestigative +uninvidious +uninvidiously +uninvigorated +uninvincible +uninvite +uninvited +uninvitedly +uninviting +uninvoiced +uninvoked +uninvolved +uninweaved +uninwoven +uninwrapped +uninwreathed +Unio +unio +uniocular +unioid +Uniola +union +unioned +unionic +unionid +Unionidae +unioniform +unionism +unionist +unionistic +unionization +unionize +unionoid +unioval +uniovular +uniovulate +unipara +uniparental +uniparient +uniparous +unipartite +uniped +unipeltate +uniperiodic +unipersonal +unipersonalist +unipersonality +unipetalous +uniphase +uniphaser +uniphonous +uniplanar +uniplicate +unipod +unipolar +unipolarity +uniporous +unipotence +unipotent +unipotential +unipulse +uniquantic +unique +uniquely +uniqueness +uniquity +uniradial +uniradiate +uniradiated +uniradical +uniramose +uniramous +unirascible +unireme +unirenic +unirhyme +uniridescent +unironed +unironical +unirradiated +unirrigated +unirritable +unirritant +unirritated +unirritatedly +unirritating +unisepalous +uniseptate +uniserial +uniserially +uniseriate +uniseriately +uniserrate +uniserrulate +unisexed +unisexual +unisexuality +unisexually +unisilicate +unisoil +unisolable +unisolate +unisolated +unisomeric +unisometrical +unisomorphic +unison +unisonal +unisonally +unisonance +unisonant +unisonous +unisotropic +unisparker +unispiculate +unispinose +unispiral +unissuable +unissued +unistylist +unisulcate +unit +unitage +unital +unitalicized +Unitarian +unitarian +Unitarianism +Unitarianize +unitarily +unitariness +unitarism +unitarist +unitary +unite +uniteability +uniteable +uniteably +united +unitedly +unitedness +unitemized +unitentacular +uniter +uniting +unitingly +unition +unitism +unitistic +unitive +unitively +unitiveness +unitize +unitooth +unitrivalent +unitrope +unituberculate +unitude +unity +uniunguiculate +uniungulate +univalence +univalency +univalent +univalvate +univalve +univalvular +univariant +univerbal +universal +universalia +Universalian +Universalism +universalism +Universalist +universalist +Universalistic +universalistic +universality +universalization +universalize +universalizer +universally +universalness +universanimous +universe +universeful +universitarian +universitarianism +universitary +universitize +university +universityless +universitylike +universityship +universological +universologist +universology +univied +univocability +univocacy +univocal +univocalized +univocally +univocity +univoltine +univorous +unjacketed +unjaded +unjagged +unjailed +unjam +unjapanned +unjarred +unjarring +unjaundiced +unjaunty +unjealous +unjealoused +unjellied +unjesting +unjesuited +unjesuitical +unjesuitically +unjewel +unjeweled +unjewelled +Unjewish +unjilted +unjocose +unjocund +unjogged +unjogging +unjoin +unjoinable +unjoint +unjointed +unjointedness +unjointured +unjoking +unjokingly +unjolly +unjolted +unjostled +unjournalized +unjovial +unjovially +unjoyed +unjoyful +unjoyfully +unjoyfulness +unjoyous +unjoyously +unjoyousness +unjudgable +unjudge +unjudged +unjudgelike +unjudging +unjudicable +unjudicial +unjudicially +unjudicious +unjudiciously +unjudiciousness +unjuggled +unjuiced +unjuicy +unjumbled +unjumpable +unjust +unjustice +unjusticiable +unjustifiable +unjustifiableness +unjustifiably +unjustified +unjustifiedly +unjustifiedness +unjustify +unjustled +unjustly +unjustness +unjuvenile +unkaiserlike +unkamed +unked +unkeeled +unkembed +unkempt +unkemptly +unkemptness +unken +unkenned +unkennedness +unkennel +unkenneled +unkenning +unkensome +unkept +unkerchiefed +unket +unkey +unkeyed +unkicked +unkid +unkill +unkillability +unkillable +unkilled +unkilling +unkilned +unkin +unkind +unkindhearted +unkindled +unkindledness +unkindlily +unkindliness +unkindling +unkindly +unkindness +unkindred +unkindredly +unking +unkingdom +unkinged +unkinger +unkinglike +unkingly +unkink +unkinlike +unkirk +unkiss +unkissed +unkist +unknave +unkneaded +unkneeling +unknelled +unknew +unknight +unknighted +unknightlike +unknit +unknittable +unknitted +unknitting +unknocked +unknocking +unknot +unknotted +unknotty +unknow +unknowability +unknowable +unknowableness +unknowably +unknowing +unknowingly +unknowingness +unknowledgeable +unknown +unknownly +unknownness +unknownst +unkodaked +unkoshered +unlabeled +unlabialize +unlabiate +unlaborable +unlabored +unlaboring +unlaborious +unlaboriously +unlaboriousness +unlace +unlaced +unlacerated +unlackeyed +unlacquered +unlade +unladen +unladled +unladyfied +unladylike +unlagging +unlaid +unlame +unlamed +unlamented +unlampooned +unlanced +unland +unlanded +unlandmarked +unlanguaged +unlanguid +unlanguishing +unlanterned +unlap +unlapped +unlapsed +unlapsing +unlarded +unlarge +unlash +unlashed +unlasher +unlassoed +unlasting +unlatch +unlath +unlathed +unlathered +unlatinized +unlatticed +unlaudable +unlaudableness +unlaudably +unlauded +unlaugh +unlaughing +unlaunched +unlaundered +unlaureled +unlaved +unlaving +unlavish +unlavished +unlaw +unlawed +unlawful +unlawfully +unlawfulness +unlawlearned +unlawlike +unlawly +unlawyered +unlawyerlike +unlay +unlayable +unleached +unlead +unleaded +unleaderly +unleaf +unleafed +unleagued +unleaguer +unleakable +unleaky +unleal +unlean +unleared +unlearn +unlearnability +unlearnable +unlearnableness +unlearned +unlearnedly +unlearnedness +unlearning +unlearnt +unleasable +unleased +unleash +unleashed +unleathered +unleave +unleaved +unleavenable +unleavened +unlectured +unled +unleft +unlegacied +unlegal +unlegalized +unlegally +unlegalness +unlegate +unlegislative +unleisured +unleisuredness +unleisurely +unlenient +unlensed +unlent +unless +unlessened +unlessoned +unlet +unlettable +unletted +unlettered +unletteredly +unletteredness +unlettering +unletterlike +unlevel +unleveled +unlevelly +unlevelness +unlevied +unlevigated +unlexicographical +unliability +unliable +unlibeled +unliberal +unliberalized +unliberated +unlibidinous +unlicensed +unlicentiated +unlicentious +unlichened +unlickable +unlicked +unlid +unlidded +unlie +unlifelike +unliftable +unlifted +unlifting +unligable +unligatured +unlight +unlighted +unlightedly +unlightedness +unlightened +unlignified +unlikable +unlikableness +unlikably +unlike +unlikeable +unlikeableness +unlikeably +unliked +unlikelihood +unlikeliness +unlikely +unliken +unlikeness +unliking +unlimb +unlimber +unlime +unlimed +unlimitable +unlimitableness +unlimitably +unlimited +unlimitedly +unlimitedness +unlimitless +unlimned +unlimp +unline +unlineal +unlined +unlingering +unlink +unlinked +unlionlike +unliquefiable +unliquefied +unliquid +unliquidatable +unliquidated +unliquidating +unliquidation +unliquored +unlisping +unlist +unlisted +unlistened +unlistening +unlisty +unlit +unliteral +unliterally +unliteralness +unliterary +unliterate +unlitigated +unlitten +unlittered +unliturgical +unliturgize +unlivable +unlivableness +unlivably +unlive +unliveable +unliveableness +unliveably +unliveliness +unlively +unliveried +unlivery +unliving +unlizardlike +unload +unloaded +unloaden +unloader +unloafing +unloanably +unloaned +unloaning +unloath +unloathed +unloathful +unloathly +unloathsome +unlobed +unlocal +unlocalizable +unlocalize +unlocalized +unlocally +unlocated +unlock +unlockable +unlocked +unlocker +unlocking +unlocomotive +unlodge +unlodged +unlofty +unlogged +unlogic +unlogical +unlogically +unlogicalness +unlonely +unlook +unlooked +unloop +unlooped +unloosable +unloosably +unloose +unloosen +unloosening +unloosing +unlooted +unlopped +unloquacious +unlord +unlorded +unlordly +unlosable +unlosableness +unlost +unlotted +unlousy +unlovable +unlovableness +unlovably +unlove +unloveable +unloveableness +unloveably +unloved +unlovelily +unloveliness +unlovely +unloverlike +unloverly +unloving +unlovingly +unlovingness +unlowered +unlowly +unloyal +unloyally +unloyalty +unlubricated +unlucent +unlucid +unluck +unluckful +unluckily +unluckiness +unlucky +unlucrative +unludicrous +unluffed +unlugged +unlugubrious +unluminous +unlumped +unlunar +unlured +unlust +unlustily +unlustiness +unlustrous +unlusty +unlute +unluted +unluxated +unluxuriant +unluxurious +unlycanthropize +unlying +unlyrical +unlyrically +unmacadamized +unmacerated +unmachinable +unmackly +unmad +unmadded +unmaddened +unmade +unmagic +unmagical +unmagisterial +unmagistratelike +unmagnanimous +unmagnetic +unmagnetical +unmagnetized +unmagnified +unmagnify +unmaid +unmaidenlike +unmaidenliness +unmaidenly +unmail +unmailable +unmailableness +unmailed +unmaimable +unmaimed +unmaintainable +unmaintained +unmajestic +unmakable +unmake +unmaker +unmalevolent +unmalicious +unmalignant +unmaligned +unmalleability +unmalleable +unmalleableness +unmalled +unmaltable +unmalted +unmammalian +unmammonized +unman +unmanacle +unmanacled +unmanageable +unmanageableness +unmanageably +unmanaged +unmancipated +unmandated +unmanducated +unmaned +unmaneged +unmanful +unmanfully +unmangled +unmaniable +unmaniac +unmaniacal +unmanicured +unmanifest +unmanifested +unmanipulatable +unmanipulated +unmanlike +unmanlily +unmanliness +unmanly +unmanned +unmanner +unmannered +unmanneredly +unmannerliness +unmannerly +unmannish +unmanored +unmantle +unmantled +unmanufacturable +unmanufactured +unmanumissible +unmanumitted +unmanurable +unmanured +unmappable +unmapped +unmarbled +unmarch +unmarching +unmarginal +unmarginated +unmarine +unmaritime +unmarkable +unmarked +unmarketable +unmarketed +unmarled +unmarred +unmarriable +unmarriageability +unmarriageable +unmarried +unmarring +unmarry +unmarrying +unmarshaled +unmartial +unmartyr +unmartyred +unmarvelous +unmasculine +unmashed +unmask +unmasked +unmasker +unmasking +unmasquerade +unmassacred +unmassed +unmast +unmaster +unmasterable +unmastered +unmasterful +unmasticable +unmasticated +unmatchable +unmatchableness +unmatchably +unmatched +unmatchedness +unmate +unmated +unmaterial +unmaterialistic +unmateriate +unmaternal +unmathematical +unmathematically +unmating +unmatriculated +unmatrimonial +unmatronlike +unmatted +unmature +unmatured +unmaturely +unmatureness +unmaturing +unmaturity +unmauled +unmaze +unmeaning +unmeaningly +unmeaningness +unmeant +unmeasurable +unmeasurableness +unmeasurably +unmeasured +unmeasuredly +unmeasuredness +unmeated +unmechanic +unmechanical +unmechanically +unmechanistic +unmechanize +unmechanized +unmedaled +unmedalled +unmeddle +unmeddled +unmeddlesome +unmeddling +unmeddlingly +unmeddlingness +unmediaeval +unmediated +unmediatized +unmedicable +unmedical +unmedicated +unmedicative +unmedicinable +unmedicinal +unmeditated +unmeditative +unmediumistic +unmedullated +unmeek +unmeekly +unmeekness +unmeet +unmeetable +unmeetly +unmeetness +unmelancholy +unmeliorated +unmellow +unmellowed +unmelodic +unmelodious +unmelodiously +unmelodiousness +unmelodized +unmelodramatic +unmeltable +unmeltableness +unmeltably +unmelted +unmeltedness +unmelting +unmember +unmemoired +unmemorable +unmemorialized +unmemoried +unmemorized +unmenaced +unmenacing +unmendable +unmendableness +unmendably +unmendacious +unmended +unmenial +unmenseful +unmenstruating +unmensurable +unmental +unmentionability +unmentionable +unmentionableness +unmentionables +unmentionably +unmentioned +unmercantile +unmercenariness +unmercenary +unmercerized +unmerchantable +unmerchantlike +unmerchantly +unmerciful +unmercifully +unmercifulness +unmercurial +unmeretricious +unmerge +unmerged +unmeridional +unmerited +unmeritedly +unmeritedness +unmeriting +unmeritorious +unmeritoriously +unmeritoriousness +unmerry +unmesh +unmesmeric +unmesmerize +unmesmerized +unmet +unmetaled +unmetalized +unmetalled +unmetallic +unmetallurgical +unmetamorphosed +unmetaphorical +unmetaphysic +unmetaphysical +unmeted +unmeteorological +unmetered +unmethodical +unmethodically +unmethodicalness +unmethodized +unmethodizing +unmethylated +unmeticulous +unmetric +unmetrical +unmetrically +unmetricalness +unmetropolitan +unmettle +unmew +unmewed +unmicaceous +unmicrobic +unmicroscopic +unmidwifed +unmighty +unmigrating +unmildewed +unmilitant +unmilitarily +unmilitariness +unmilitaristic +unmilitarized +unmilitary +unmilked +unmilled +unmillinered +unmilted +unmimicked +unminable +unminced +unmincing +unmind +unminded +unmindful +unmindfully +unmindfulness +unminding +unmined +unmineralized +unmingle +unmingleable +unmingled +unmingling +unminimized +unminished +unminister +unministered +unministerial +unministerially +unminted +unminuted +unmiracled +unmiraculous +unmiraculously +unmired +unmirrored +unmirthful +unmirthfully +unmirthfulness +unmiry +unmisanthropic +unmiscarrying +unmischievous +unmiscible +unmisconceivable +unmiserly +unmisgiving +unmisgivingly +unmisguided +unmisinterpretable +unmisled +unmissable +unmissed +unmissionary +unmissionized +unmist +unmistakable +unmistakableness +unmistakably +unmistakedly +unmistaken +unmistakingly +unmistressed +unmistrusted +unmistrustful +unmistrusting +unmisunderstandable +unmisunderstanding +unmisunderstood +unmiter +unmitigable +unmitigated +unmitigatedly +unmitigatedness +unmitigative +unmittened +unmix +unmixable +unmixableness +unmixed +unmixedly +unmixedness +unmoaned +unmoated +unmobbed +unmobilized +unmocked +unmocking +unmockingly +unmodel +unmodeled +unmodelled +unmoderate +unmoderately +unmoderateness +unmoderating +unmodern +unmodernity +unmodernize +unmodernized +unmodest +unmodifiable +unmodifiableness +unmodifiably +unmodified +unmodifiedness +unmodish +unmodulated +unmoiled +unmoist +unmoisten +unmold +unmoldable +unmolded +unmoldered +unmoldering +unmoldy +unmolested +unmolestedly +unmolesting +unmollifiable +unmollifiably +unmollified +unmollifying +unmolten +unmomentary +unmomentous +unmomentously +unmonarch +unmonarchical +unmonastic +unmonetary +unmoneyed +unmonistic +unmonitored +unmonkish +unmonkly +unmonopolize +unmonopolized +unmonopolizing +unmonotonous +unmonumented +unmoor +unmoored +unmooted +unmopped +unmoral +unmoralist +unmorality +unmoralize +unmoralized +unmoralizing +unmorally +unmoralness +unmorbid +unmordanted +unmoribund +unmorose +unmorphological +unmortal +unmortared +unmortgage +unmortgageable +unmortgaged +unmortified +unmortifiedly +unmortifiedness +unmortise +unmortised +unmossed +unmothered +unmotherly +unmotionable +unmotivated +unmotivatedly +unmotivatedness +unmotived +unmotorized +unmottled +unmounded +unmount +unmountable +unmountainous +unmounted +unmounting +unmourned +unmournful +unmourning +unmouthable +unmouthed +unmouthpieced +unmovability +unmovable +unmovableness +unmovably +unmoved +unmovedly +unmoving +unmovingly +unmovingness +unmowed +unmown +unmucilaged +unmudded +unmuddied +unmuddle +unmuddled +unmuddy +unmuffle +unmuffled +unmulcted +unmulish +unmulled +unmullioned +unmultipliable +unmultiplied +unmultipliedly +unmultiply +unmummied +unmummify +unmunched +unmundane +unmundified +unmunicipalized +unmunificent +unmunitioned +unmurmured +unmurmuring +unmurmuringly +unmurmurous +unmuscled +unmuscular +unmusical +unmusicality +unmusically +unmusicalness +unmusicianly +unmusked +unmussed +unmusted +unmusterable +unmustered +unmutated +unmutation +unmuted +unmutilated +unmutinous +unmuttered +unmutual +unmutualized +unmuzzle +unmuzzled +unmuzzling +unmyelinated +unmysterious +unmysteriously +unmystery +unmystical +unmysticize +unmystified +unmythical +unnabbed +unnagged +unnagging +unnail +unnailed +unnaked +unnamability +unnamable +unnamableness +unnamably +unname +unnameability +unnameable +unnameableness +unnameably +unnamed +unnapkined +unnapped +unnarcotic +unnarrated +unnarrow +unnation +unnational +unnationalized +unnative +unnatural +unnaturalism +unnaturalist +unnaturalistic +unnaturality +unnaturalizable +unnaturalize +unnaturalized +unnaturally +unnaturalness +unnature +unnautical +unnavigability +unnavigable +unnavigableness +unnavigably +unnavigated +unneaped +unnearable +unneared +unnearly +unnearness +unneat +unneatly +unneatness +unnebulous +unnecessarily +unnecessariness +unnecessary +unnecessitated +unnecessitating +unnecessity +unneeded +unneedful +unneedfully +unneedfulness +unneedy +unnefarious +unnegated +unneglected +unnegligent +unnegotiable +unnegotiableness +unnegotiably +unnegotiated +unnegro +unneighbored +unneighborlike +unneighborliness +unneighborly +unnephritic +unnerve +unnerved +unnervous +unnest +unnestle +unnestled +unneth +unnethe +unnethes +unnethis +unnetted +unnettled +unneurotic +unneutral +unneutralized +unneutrally +unnew +unnewly +unnewness +unnibbed +unnibbied +unnice +unnicely +unniceness +unniched +unnicked +unnickeled +unnickelled +unnicknamed +unniggard +unniggardly +unnigh +unnimbed +unnimble +unnimbleness +unnimbly +unnipped +unnitrogenized +unnobilitated +unnobility +unnoble +unnobleness +unnobly +unnoised +unnomadic +unnominated +unnonsensical +unnoosed +unnormal +unnorthern +unnose +unnosed +unnotable +unnotched +unnoted +unnoteworthy +unnoticeable +unnoticeableness +unnoticeably +unnoticed +unnoticing +unnotified +unnotify +unnoting +unnourishable +unnourished +unnourishing +unnovel +unnovercal +unnucleated +unnullified +unnumberable +unnumberableness +unnumberably +unnumbered +unnumberedness +unnumerical +unnumerous +unnurtured +unnutritious +unnutritive +unnuzzled +unnymphlike +unoared +unobdurate +unobedience +unobedient +unobediently +unobese +unobeyed +unobeying +unobjected +unobjectionable +unobjectionableness +unobjectionably +unobjectional +unobjective +unobligated +unobligatory +unobliged +unobliging +unobligingly +unobligingness +unobliterable +unobliterated +unoblivious +unobnoxious +unobscene +unobscure +unobscured +unobsequious +unobsequiously +unobsequiousness +unobservable +unobservance +unobservant +unobservantly +unobservantness +unobserved +unobservedly +unobserving +unobservingly +unobsessed +unobsolete +unobstinate +unobstruct +unobstructed +unobstructedly +unobstructedness +unobstructive +unobstruent +unobtainable +unobtainableness +unobtainably +unobtained +unobtruded +unobtruding +unobtrusive +unobtrusively +unobtrusiveness +unobtunded +unobumbrated +unobverted +unobviated +unobvious +unoccasional +unoccasioned +unoccidental +unoccluded +unoccupancy +unoccupation +unoccupied +unoccupiedly +unoccupiedness +unoccurring +unoceanic +unocular +unode +unodious +unodoriferous +unoecumenic +unoecumenical +unoffendable +unoffended +unoffendedly +unoffender +unoffending +unoffendingly +unoffensive +unoffensively +unoffensiveness +unoffered +unofficed +unofficered +unofficerlike +unofficial +unofficialdom +unofficially +unofficialness +unofficiating +unofficinal +unofficious +unofficiously +unofficiousness +unoffset +unoften +unogled +unoil +unoiled +unoiling +unoily +unold +unomened +unominous +unomitted +unomnipotent +unomniscient +Unona +unonerous +unontological +unopaque +unoped +unopen +unopenable +unopened +unopening +unopenly +unopenness +unoperably +unoperated +unoperatic +unoperating +unoperative +unoperculate +unoperculated +unopined +unopinionated +unoppignorated +unopportune +unopportunely +unopportuneness +unopposable +unopposed +unopposedly +unopposedness +unopposite +unoppressed +unoppressive +unoppressively +unoppressiveness +unopprobrious +unoppugned +unopulence +unopulent +unoratorial +unoratorical +unorbed +unorbital +unorchestrated +unordain +unordainable +unordained +unorder +unorderable +unordered +unorderly +unordinarily +unordinariness +unordinary +unordinate +unordinately +unordinateness +unordnanced +unorganic +unorganical +unorganically +unorganicalness +unorganizable +unorganized +unorganizedly +unorganizedness +unoriental +unorientalness +unoriented +unoriginal +unoriginality +unoriginally +unoriginalness +unoriginate +unoriginated +unoriginatedness +unoriginately +unoriginateness +unorigination +unoriginative +unoriginatively +unoriginativeness +unorn +unornamental +unornamentally +unornamentalness +unornamented +unornate +unornithological +unornly +unorphaned +unorthodox +unorthodoxically +unorthodoxly +unorthodoxness +unorthodoxy +unorthographical +unorthographically +unoscillating +unosculated +unossified +unostensible +unostentation +unostentatious +unostentatiously +unostentatiousness +unoutgrown +unoutlawed +unoutraged +unoutspeakable +unoutspoken +unoutworn +unoverclouded +unovercome +unoverdone +unoverdrawn +unoverflowing +unoverhauled +unoverleaped +unoverlooked +unoverpaid +unoverpowered +unoverruled +unovert +unovertaken +unoverthrown +unovervalued +unoverwhelmed +unowed +unowing +unown +unowned +unoxidable +unoxidated +unoxidizable +unoxidized +unoxygenated +unoxygenized +unpacable +unpaced +unpacifiable +unpacific +unpacified +unpacifiedly +unpacifiedness +unpacifist +unpack +unpacked +unpacker +unpadded +unpadlocked +unpagan +unpaganize +unpaged +unpaginal +unpaid +unpained +unpainful +unpaining +unpainstaking +unpaint +unpaintability +unpaintable +unpaintableness +unpaintably +unpainted +unpaintedly +unpaintedness +unpaired +unpalatability +unpalatable +unpalatableness +unpalatably +unpalatal +unpalatial +unpale +unpaled +unpalisaded +unpalisadoed +unpalled +unpalliable +unpalliated +unpalpable +unpalped +unpalpitating +unpalsied +unpampered +unpanegyrized +unpanel +unpaneled +unpanelled +unpanged +unpanniered +unpanoplied +unpantheistic +unpanting +unpapal +unpapaverous +unpaper +unpapered +unparaded +unparadise +unparadox +unparagoned +unparagonized +unparagraphed +unparallel +unparallelable +unparalleled +unparalleledly +unparalleledness +unparallelness +unparalyzed +unparaphrased +unparasitical +unparcel +unparceled +unparceling +unparcelled +unparcelling +unparch +unparched +unparching +unpardon +unpardonable +unpardonableness +unpardonably +unpardoned +unpardonedness +unpardoning +unpared +unparented +unparfit +unpargeted +unpark +unparked +unparking +unparliamentary +unparliamented +unparodied +unparrel +unparriable +unparried +unparroted +unparrying +unparsed +unparsimonious +unparsonic +unparsonical +unpartable +unpartableness +unpartably +unpartaken +unpartaking +unparted +unpartial +unpartiality +unpartially +unpartialness +unparticipant +unparticipated +unparticipating +unparticipative +unparticular +unparticularized +unparticularizing +unpartisan +unpartitioned +unpartizan +unpartnered +unpartook +unparty +unpass +unpassable +unpassableness +unpassably +unpassed +unpassing +unpassionate +unpassionately +unpassionateness +unpassioned +unpassive +unpaste +unpasted +unpasteurized +unpasting +unpastor +unpastoral +unpastured +unpatched +unpatent +unpatentable +unpatented +unpaternal +unpathed +unpathetic +unpathwayed +unpatient +unpatiently +unpatientness +unpatriarchal +unpatrician +unpatriotic +unpatriotically +unpatriotism +unpatristic +unpatrolled +unpatronizable +unpatronized +unpatronizing +unpatted +unpatterned +unpaunch +unpaunched +unpauperized +unpausing +unpausingly +unpave +unpaved +unpavilioned +unpaving +unpawed +unpawn +unpawned +unpayable +unpayableness +unpayably +unpaying +unpayment +unpeace +unpeaceable +unpeaceableness +unpeaceably +unpeaceful +unpeacefully +unpeacefulness +unpealed +unpearled +unpebbled +unpeccable +unpecked +unpecuniarily +unpedagogical +unpedantic +unpeddled +unpedestal +unpedigreed +unpeel +unpeelable +unpeelableness +unpeeled +unpeerable +unpeered +unpeg +unpejorative +unpelagic +unpelted +unpen +unpenal +unpenalized +unpenanced +unpenciled +unpencilled +unpenetrable +unpenetrated +unpenetrating +unpenitent +unpenitently +unpenitentness +unpenned +unpennied +unpennoned +unpensionable +unpensionableness +unpensioned +unpensioning +unpent +unpenurious +unpeople +unpeopled +unpeopling +unperceived +unperceivedly +unperceptible +unperceptibly +unperceptive +unperch +unperched +unpercipient +unpercolated +unpercussed +unperfect +unperfected +unperfectedly +unperfectedness +unperfectly +unperfectness +unperfidious +unperflated +unperforate +unperforated +unperformable +unperformance +unperformed +unperforming +unperfumed +unperilous +unperiodic +unperiodical +unperiphrased +unperishable +unperishableness +unperishably +unperished +unperishing +unperjured +unpermanency +unpermanent +unpermanently +unpermeable +unpermeated +unpermissible +unpermissive +unpermitted +unpermitting +unpermixed +unpernicious +unperpendicular +unperpetrated +unperpetuated +unperplex +unperplexed +unperplexing +unpersecuted +unpersecutive +unperseverance +unpersevering +unperseveringly +unperseveringness +unpersonable +unpersonableness +unpersonal +unpersonality +unpersonified +unpersonify +unperspicuous +unperspirable +unperspiring +unpersuadable +unpersuadableness +unpersuadably +unpersuaded +unpersuadedness +unpersuasibleness +unpersuasion +unpersuasive +unpersuasively +unpersuasiveness +unpertaining +unpertinent +unpertinently +unperturbed +unperturbedly +unperturbedness +unperuked +unperused +unpervaded +unperverse +unpervert +unperverted +unpervious +unpessimistic +unpestered +unpestilential +unpetal +unpetitioned +unpetrified +unpetrify +unpetticoated +unpetulant +unpharasaic +unpharasaical +unphased +unphenomenal +unphilanthropic +unphilanthropically +unphilological +unphilosophic +unphilosophically +unphilosophicalness +unphilosophize +unphilosophized +unphilosophy +unphlegmatic +unphonetic +unphoneticness +unphonographed +unphosphatized +unphotographed +unphrasable +unphrasableness +unphrased +unphrenological +unphysical +unphysically +unphysicianlike +unphysicked +unphysiological +unpicaresque +unpick +unpickable +unpicked +unpicketed +unpickled +unpictorial +unpictorially +unpicturability +unpicturable +unpictured +unpicturesque +unpicturesquely +unpicturesqueness +unpiece +unpieced +unpierceable +unpierced +unpiercing +unpiety +unpigmented +unpile +unpiled +unpilfered +unpilgrimlike +unpillaged +unpillared +unpilled +unpilloried +unpillowed +unpiloted +unpimpled +unpin +unpinched +unpining +unpinion +unpinioned +unpinked +unpinned +unpious +unpiped +unpiqued +unpirated +unpitched +unpiteous +unpiteously +unpiteousness +unpitiable +unpitiably +unpitied +unpitiedly +unpitiedness +unpitiful +unpitifully +unpitifulness +unpitted +unpitying +unpityingly +unpityingness +unplacable +unplacably +unplacated +unplace +unplaced +unplacid +unplagiarized +unplagued +unplaid +unplain +unplained +unplainly +unplainness +unplait +unplaited +unplan +unplaned +unplanished +unplank +unplanked +unplanned +unplannedly +unplannedness +unplant +unplantable +unplanted +unplantlike +unplashed +unplaster +unplastered +unplastic +unplat +unplated +unplatted +unplausible +unplausibleness +unplausibly +unplayable +unplayed +unplayful +unplaying +unpleached +unpleadable +unpleaded +unpleading +unpleasable +unpleasant +unpleasantish +unpleasantly +unpleasantness +unpleasantry +unpleased +unpleasing +unpleasingly +unpleasingness +unpleasurable +unpleasurably +unpleasure +unpleat +unpleated +unplebeian +unpledged +unplenished +unplenteous +unplentiful +unplentifulness +unpliable +unpliableness +unpliably +unpliancy +unpliant +unpliantly +unplied +unplighted +unplodding +unplotted +unplotting +unplough +unploughed +unplow +unplowed +unplucked +unplug +unplugged +unplugging +unplumb +unplumbed +unplume +unplumed +unplummeted +unplump +unplundered +unplunge +unplunged +unplutocratic +unplutocratically +unpoached +unpocket +unpocketed +unpodded +unpoetic +unpoetically +unpoeticalness +unpoeticized +unpoetize +unpoetized +unpoignard +unpointed +unpointing +unpoise +unpoised +unpoison +unpoisonable +unpoisoned +unpoisonous +unpolarizable +unpolarized +unpoled +unpolemical +unpolemically +unpoliced +unpolicied +unpolish +unpolishable +unpolished +unpolishedness +unpolite +unpolitely +unpoliteness +unpolitic +unpolitical +unpolitically +unpoliticly +unpollarded +unpolled +unpollutable +unpolluted +unpollutedly +unpolluting +unpolymerized +unpompous +unpondered +unpontifical +unpooled +unpope +unpopular +unpopularity +unpopularize +unpopularly +unpopularness +unpopulate +unpopulated +unpopulous +unpopulousness +unporous +unportable +unportended +unportentous +unportioned +unportly +unportmanteaued +unportraited +unportrayable +unportrayed +unportuous +unposed +unposing +unpositive +unpossessable +unpossessed +unpossessedness +unpossessing +unpossibility +unpossible +unpossibleness +unpossibly +unposted +unpostered +unposthumous +unpostmarked +unpostponable +unpostponed +unpostulated +unpot +unpotted +unpouched +unpoulticed +unpounced +unpounded +unpoured +unpowdered +unpower +unpowerful +unpowerfulness +unpracticability +unpracticable +unpracticableness +unpracticably +unpractical +unpracticality +unpractically +unpracticalness +unpractice +unpracticed +unpragmatical +unpraisable +unpraise +unpraised +unpraiseful +unpraiseworthy +unpranked +unpray +unprayable +unprayed +unprayerful +unpraying +unpreach +unpreached +unpreaching +unprecarious +unprecautioned +unpreceded +unprecedented +unprecedentedly +unprecedentedness +unprecedential +unprecedently +unprecious +unprecipitate +unprecipitated +unprecise +unprecisely +unpreciseness +unprecluded +unprecludible +unprecocious +unpredacious +unpredestinated +unpredestined +unpredicable +unpredicated +unpredict +unpredictable +unpredictableness +unpredictably +unpredicted +unpredictedness +unpredicting +unpredisposed +unpredisposing +unpreened +unprefaced +unpreferable +unpreferred +unprefigured +unprefined +unprefixed +unpregnant +unprejudged +unprejudicated +unprejudice +unprejudiced +unprejudicedly +unprejudicedness +unprejudiciable +unprejudicial +unprejudicially +unprejudicialness +unprelatic +unprelatical +unpreluded +unpremature +unpremeditate +unpremeditated +unpremeditatedly +unpremeditatedness +unpremeditately +unpremeditation +unpremonished +unpremonstrated +unprenominated +unprenticed +unpreoccupied +unpreordained +unpreparation +unprepare +unprepared +unpreparedly +unpreparedness +unpreparing +unpreponderated +unpreponderating +unprepossessedly +unprepossessing +unprepossessingly +unprepossessingness +unpreposterous +unpresaged +unpresageful +unpresaging +unpresbyterated +unprescient +unprescinded +unprescribed +unpresentability +unpresentable +unpresentableness +unpresentably +unpresented +unpreservable +unpreserved +unpresidential +unpresiding +unpressed +unpresumable +unpresumed +unpresuming +unpresumingness +unpresumptuous +unpresumptuously +unpresupposed +unpretended +unpretending +unpretendingly +unpretendingness +unpretentious +unpretentiously +unpretentiousness +unpretermitted +unpreternatural +unprettiness +unpretty +unprevailing +unprevalent +unprevaricating +unpreventable +unpreventableness +unpreventably +unprevented +unpreventible +unpreventive +unpriceably +unpriced +unpricked +unprickled +unprickly +unpriest +unpriestlike +unpriestly +unpriggish +unprim +unprime +unprimed +unprimitive +unprimmed +unprince +unprincelike +unprinceliness +unprincely +unprincess +unprincipal +unprinciple +unprincipled +unprincipledly +unprincipledness +unprint +unprintable +unprintableness +unprintably +unprinted +unpriority +unprismatic +unprison +unprisonable +unprisoned +unprivate +unprivileged +unprizable +unprized +unprobated +unprobationary +unprobed +unprobity +unproblematic +unproblematical +unprocessed +unproclaimed +unprocrastinated +unprocreant +unprocreated +unproctored +unprocurable +unprocurableness +unprocure +unprocured +unproded +unproduceable +unproduceableness +unproduceably +unproduced +unproducedness +unproducible +unproducibleness +unproducibly +unproductive +unproductively +unproductiveness +unproductivity +unprofanable +unprofane +unprofaned +unprofessed +unprofessing +unprofessional +unprofessionalism +unprofessionally +unprofessorial +unproffered +unproficiency +unproficient +unproficiently +unprofit +unprofitable +unprofitableness +unprofitably +unprofited +unprofiteering +unprofiting +unprofound +unprofuse +unprofusely +unprofuseness +unprognosticated +unprogressed +unprogressive +unprogressively +unprogressiveness +unprohibited +unprohibitedness +unprohibitive +unprojected +unprojecting +unproliferous +unprolific +unprolix +unprologued +unprolonged +unpromiscuous +unpromise +unpromised +unpromising +unpromisingly +unpromisingness +unpromotable +unpromoted +unprompted +unpromptly +unpromulgated +unpronounce +unpronounceable +unpronounced +unpronouncing +unproofread +unprop +unpropagated +unpropelled +unpropense +unproper +unproperly +unproperness +unpropertied +unprophesiable +unprophesied +unprophetic +unprophetical +unprophetically +unprophetlike +unpropitiable +unpropitiated +unpropitiatedness +unpropitiatory +unpropitious +unpropitiously +unpropitiousness +unproportion +unproportionable +unproportionableness +unproportionably +unproportional +unproportionality +unproportionally +unproportionate +unproportionately +unproportionateness +unproportioned +unproportionedly +unproportionedness +unproposed +unproposing +unpropounded +unpropped +unpropriety +unprorogued +unprosaic +unproscribable +unproscribed +unprosecutable +unprosecuted +unprosecuting +unproselyte +unproselyted +unprosodic +unprospected +unprospective +unprosperably +unprospered +unprosperity +unprosperous +unprosperously +unprosperousness +unprostitute +unprostituted +unprostrated +unprotectable +unprotected +unprotectedly +unprotectedness +unprotective +unprotestant +unprotestantize +unprotested +unprotesting +unprotruded +unprotruding +unprotrusive +unproud +unprovability +unprovable +unprovableness +unprovably +unproved +unprovedness +unproven +unproverbial +unprovidable +unprovide +unprovided +unprovidedly +unprovidedness +unprovidenced +unprovident +unprovidential +unprovidently +unprovincial +unproving +unprovision +unprovisioned +unprovocative +unprovokable +unprovoke +unprovoked +unprovokedly +unprovokedness +unprovoking +unproximity +unprudence +unprudent +unprudently +unpruned +unprying +unpsychic +unpsychological +unpublic +unpublicity +unpublishable +unpublishableness +unpublishably +unpublished +unpucker +unpuckered +unpuddled +unpuffed +unpuffing +unpugilistic +unpugnacious +unpulled +unpulleyed +unpulped +unpulverable +unpulverize +unpulverized +unpulvinate +unpulvinated +unpumicated +unpummeled +unpummelled +unpumpable +unpumped +unpunched +unpunctated +unpunctilious +unpunctual +unpunctuality +unpunctually +unpunctuated +unpunctuating +unpunishable +unpunishably +unpunished +unpunishedly +unpunishedness +unpunishing +unpunishingly +unpurchasable +unpurchased +unpure +unpurely +unpureness +unpurgeable +unpurged +unpurifiable +unpurified +unpurifying +unpuritan +unpurled +unpurloined +unpurpled +unpurported +unpurposed +unpurposelike +unpurposely +unpurposing +unpurse +unpursed +unpursuable +unpursued +unpursuing +unpurveyed +unpushed +unput +unputrefiable +unputrefied +unputrid +unputtied +unpuzzle +unquadded +unquaffed +unquailed +unquailing +unquailingly +unquakerlike +unquakerly +unquaking +unqualifiable +unqualification +unqualified +unqualifiedly +unqualifiedness +unqualify +unqualifying +unqualifyingly +unqualitied +unquality +unquantified +unquantitative +unquarantined +unquarreled +unquarreling +unquarrelled +unquarrelling +unquarrelsome +unquarried +unquartered +unquashed +unquayed +unqueen +unqueened +unqueening +unqueenlike +unqueenly +unquellable +unquelled +unquenchable +unquenchableness +unquenchably +unquenched +unqueried +unquested +unquestionability +unquestionable +unquestionableness +unquestionably +unquestionate +unquestioned +unquestionedly +unquestionedness +unquestioning +unquestioningly +unquestioningness +unquibbled +unquibbling +unquick +unquickened +unquickly +unquicksilvered +unquiescence +unquiescent +unquiescently +unquiet +unquietable +unquieted +unquieting +unquietly +unquietness +unquietude +unquilleted +unquilted +unquit +unquittable +unquitted +unquivered +unquivering +unquizzable +unquizzed +unquotable +unquote +unquoted +unrabbeted +unrabbinical +unraced +unrack +unracked +unracking +unradiated +unradical +unradicalize +unraffled +unraftered +unraided +unrailed +unrailroaded +unrailwayed +unrainy +unraised +unrake +unraked +unraking +unrallied +unram +unrambling +unramified +unrammed +unramped +unranched +unrancid +unrancored +unrandom +unrank +unranked +unransacked +unransomable +unransomed +unrapacious +unraped +unraptured +unrare +unrarefied +unrash +unrasped +unratable +unrated +unratified +unrational +unrattled +unravaged +unravel +unravelable +unraveled +unraveler +unraveling +unravellable +unravelled +unraveller +unravelling +unravelment +unraving +unravished +unravishing +unray +unrayed +unrazed +unrazored +unreachable +unreachably +unreached +unreactive +unread +unreadability +unreadable +unreadableness +unreadably +unreadily +unreadiness +unready +unreal +unrealism +unrealist +unrealistic +unreality +unrealizable +unrealize +unrealized +unrealizing +unreally +unrealmed +unrealness +unreaped +unreared +unreason +unreasonability +unreasonable +unreasonableness +unreasonably +unreasoned +unreasoning +unreasoningly +unreassuring +unreassuringly +unreave +unreaving +unrebated +unrebel +unrebellious +unrebuffable +unrebuffably +unrebuilt +unrebukable +unrebukably +unrebuked +unrebuttable +unrebuttableness +unrebutted +unrecallable +unrecallably +unrecalled +unrecalling +unrecantable +unrecanted +unrecaptured +unreceding +unreceipted +unreceivable +unreceived +unreceiving +unrecent +unreceptant +unreceptive +unreceptivity +unreciprocal +unreciprocated +unrecited +unrecked +unrecking +unreckingness +unreckon +unreckonable +unreckoned +unreclaimable +unreclaimably +unreclaimed +unreclaimedness +unreclaiming +unreclined +unreclining +unrecognition +unrecognizable +unrecognizableness +unrecognizably +unrecognized +unrecognizing +unrecognizingly +unrecoined +unrecollected +unrecommendable +unrecompensable +unrecompensed +unreconcilable +unreconcilableness +unreconcilably +unreconciled +unrecondite +unreconnoitered +unreconsidered +unreconstructed +unrecordable +unrecorded +unrecordedness +unrecording +unrecountable +unrecounted +unrecoverable +unrecoverableness +unrecoverably +unrecovered +unrecreant +unrecreated +unrecreating +unrecriminative +unrecruitable +unrecruited +unrectangular +unrectifiable +unrectifiably +unrectified +unrecumbent +unrecuperated +unrecurrent +unrecurring +unrecusant +unred +unredacted +unredeemable +unredeemableness +unredeemably +unredeemed +unredeemedly +unredeemedness +unredeeming +unredressable +unredressed +unreduceable +unreduced +unreducible +unreducibleness +unreducibly +unreduct +unreefed +unreel +unreelable +unreeled +unreeling +unreeve +unreeving +unreferenced +unreferred +unrefilled +unrefine +unrefined +unrefinedly +unrefinedness +unrefinement +unrefining +unrefitted +unreflected +unreflecting +unreflectingly +unreflectingness +unreflective +unreflectively +unreformable +unreformed +unreformedness +unreforming +unrefracted +unrefracting +unrefrainable +unrefrained +unrefraining +unrefreshed +unrefreshful +unrefreshing +unrefreshingly +unrefrigerated +unrefulgent +unrefunded +unrefunding +unrefusable +unrefusably +unrefused +unrefusing +unrefusingly +unrefutable +unrefuted +unrefuting +unregainable +unregained +unregal +unregaled +unregality +unregally +unregard +unregardable +unregardant +unregarded +unregardedly +unregardful +unregeneracy +unregenerate +unregenerately +unregenerateness +unregenerating +unregeneration +unregimented +unregistered +unregressive +unregretful +unregretfully +unregretfulness +unregrettable +unregretted +unregretting +unregular +unregulated +unregulative +unregurgitated +unrehabilitated +unrehearsable +unrehearsed +unrehearsing +unreigning +unreimbodied +unrein +unreined +unreinstated +unreiterable +unreiterated +unrejectable +unrejoiced +unrejoicing +unrejuvenated +unrelapsing +unrelated +unrelatedness +unrelating +unrelational +unrelative +unrelatively +unrelaxable +unrelaxed +unrelaxing +unrelaxingly +unreleasable +unreleased +unreleasing +unrelegated +unrelentance +unrelented +unrelenting +unrelentingly +unrelentingness +unrelentor +unrelevant +unreliability +unreliable +unreliableness +unreliably +unreliance +unrelievable +unrelievableness +unrelieved +unrelievedly +unreligion +unreligioned +unreligious +unreligiously +unreligiousness +unrelinquishable +unrelinquishably +unrelinquished +unrelinquishing +unrelishable +unrelished +unrelishing +unreluctant +unreluctantly +unremaining +unremanded +unremarkable +unremarked +unremarried +unremediable +unremedied +unremember +unrememberable +unremembered +unremembering +unremembrance +unreminded +unremissible +unremittable +unremitted +unremittedly +unremittent +unremittently +unremitting +unremittingly +unremittingness +unremonstrant +unremonstrated +unremonstrating +unremorseful +unremorsefully +unremote +unremotely +unremounted +unremovable +unremovableness +unremovably +unremoved +unremunerated +unremunerating +unremunerative +unremuneratively +unremunerativeness +unrenderable +unrendered +unrenewable +unrenewed +unrenounceable +unrenounced +unrenouncing +unrenovated +unrenowned +unrenownedly +unrenownedness +unrent +unrentable +unrented +unreorganized +unrepaid +unrepair +unrepairable +unrepaired +unrepartable +unreparted +unrepealability +unrepealable +unrepealableness +unrepealably +unrepealed +unrepeatable +unrepeated +unrepellable +unrepelled +unrepellent +unrepent +unrepentable +unrepentance +unrepentant +unrepentantly +unrepentantness +unrepented +unrepenting +unrepentingly +unrepentingness +unrepetitive +unrepined +unrepining +unrepiningly +unrepiqued +unreplaceable +unreplaced +unreplenished +unrepleviable +unreplevined +unrepliable +unrepliably +unreplied +unreplying +unreportable +unreported +unreportedly +unreportedness +unrepose +unreposed +unreposeful +unreposefulness +unreposing +unrepossessed +unreprehended +unrepresentable +unrepresentation +unrepresentative +unrepresented +unrepresentedness +unrepressed +unrepressible +unreprievable +unreprievably +unreprieved +unreprimanded +unreprinted +unreproachable +unreproachableness +unreproachably +unreproached +unreproachful +unreproachfully +unreproaching +unreproachingly +unreprobated +unreproducible +unreprovable +unreprovableness +unreprovably +unreproved +unreprovedly +unreprovedness +unreproving +unrepublican +unrepudiable +unrepudiated +unrepugnant +unrepulsable +unrepulsed +unrepulsing +unrepulsive +unreputable +unreputed +unrequalified +unrequested +unrequickened +unrequired +unrequisite +unrequitable +unrequital +unrequited +unrequitedly +unrequitedness +unrequitement +unrequiter +unrequiting +unrescinded +unrescued +unresemblant +unresembling +unresented +unresentful +unresenting +unreserve +unreserved +unreservedly +unreservedness +unresifted +unresigned +unresistable +unresistably +unresistance +unresistant +unresistantly +unresisted +unresistedly +unresistedness +unresistible +unresistibleness +unresistibly +unresisting +unresistingly +unresistingness +unresolute +unresolvable +unresolve +unresolved +unresolvedly +unresolvedness +unresolving +unresonant +unresounded +unresounding +unresourceful +unresourcefulness +unrespect +unrespectability +unrespectable +unrespected +unrespectful +unrespectfully +unrespectfulness +unrespective +unrespectively +unrespectiveness +unrespirable +unrespired +unrespited +unresplendent +unresponding +unresponsible +unresponsibleness +unresponsive +unresponsively +unresponsiveness +unrest +unrestable +unrested +unrestful +unrestfully +unrestfulness +unresting +unrestingly +unrestingness +unrestorable +unrestored +unrestrainable +unrestrainably +unrestrained +unrestrainedly +unrestrainedness +unrestraint +unrestrictable +unrestricted +unrestrictedly +unrestrictedness +unrestrictive +unresty +unresultive +unresumed +unresumptive +unretainable +unretained +unretaliated +unretaliating +unretardable +unretarded +unretentive +unreticent +unretinued +unretired +unretiring +unretorted +unretouched +unretractable +unretracted +unretreating +unretrenchable +unretrenched +unretrievable +unretrieved +unretrievingly +unretted +unreturnable +unreturnably +unreturned +unreturning +unreturningly +unrevealable +unrevealed +unrevealedness +unrevealing +unrevealingly +unrevelationize +unrevenged +unrevengeful +unrevengefulness +unrevenging +unrevengingly +unrevenue +unrevenued +unreverberated +unrevered +unreverence +unreverenced +unreverend +unreverendly +unreverent +unreverential +unreverently +unreverentness +unreversable +unreversed +unreversible +unreverted +unrevertible +unreverting +unrevested +unrevetted +unreviewable +unreviewed +unreviled +unrevised +unrevivable +unrevived +unrevocable +unrevocableness +unrevocably +unrevoked +unrevolted +unrevolting +unrevolutionary +unrevolutionized +unrevolved +unrevolving +unrewardable +unrewarded +unrewardedly +unrewarding +unreworded +unrhetorical +unrhetorically +unrhetoricalness +unrhyme +unrhymed +unrhythmic +unrhythmical +unrhythmically +unribbed +unribboned +unrich +unriched +unricht +unricked +unrid +unridable +unridableness +unridably +unridden +unriddle +unriddleable +unriddled +unriddler +unriddling +unride +unridely +unridered +unridged +unridiculed +unridiculous +unrife +unriffled +unrifled +unrifted +unrig +unrigged +unrigging +unright +unrightable +unrighted +unrighteous +unrighteously +unrighteousness +unrightful +unrightfully +unrightfulness +unrightly +unrightwise +unrigid +unrigorous +unrimpled +unrind +unring +unringable +unringed +unringing +unrinsed +unrioted +unrioting +unriotous +unrip +unripe +unriped +unripely +unripened +unripeness +unripening +unrippable +unripped +unripping +unrippled +unrippling +unripplingly +unrisen +unrising +unriskable +unrisked +unrisky +unritual +unritualistic +unrivalable +unrivaled +unrivaledly +unrivaledness +unrived +unriven +unrivet +unriveted +unriveting +unroaded +unroadworthy +unroaming +unroast +unroasted +unrobbed +unrobe +unrobed +unrobust +unrocked +unrococo +unrodded +unroiled +unroll +unrollable +unrolled +unroller +unrolling +unrollment +unromantic +unromantical +unromantically +unromanticalness +unromanticized +unroof +unroofed +unroofing +unroomy +unroost +unroosted +unroosting +unroot +unrooted +unrooting +unrope +unroped +unrosed +unrosined +unrostrated +unrotated +unrotating +unroted +unrotted +unrotten +unrotund +unrouged +unrough +unroughened +unround +unrounded +unrounding +unrousable +unroused +unroutable +unrouted +unrove +unroved +unroving +unrow +unrowed +unroweled +unroyal +unroyalist +unroyalized +unroyally +unroyalness +Unrra +unrubbed +unrubbish +unrubified +unrubrical +unrubricated +unruddered +unruddled +unrueful +unruffable +unruffed +unruffle +unruffled +unruffling +unrugged +unruinable +unruinated +unruined +unrulable +unrulableness +unrule +unruled +unruledly +unruledness +unruleful +unrulily +unruliness +unruly +unruminated +unruminating +unruminatingly +unrummaged +unrumored +unrumple +unrumpled +unrun +unrung +unruptured +unrural +unrushed +Unrussian +unrust +unrusted +unrustic +unrusticated +unrustling +unruth +unsabbatical +unsabered +unsabled +unsabred +unsaccharic +unsacerdotal +unsacerdotally +unsack +unsacked +unsacramental +unsacramentally +unsacramentarian +unsacred +unsacredly +unsacrificeable +unsacrificeably +unsacrificed +unsacrificial +unsacrificing +unsacrilegious +unsad +unsadden +unsaddened +unsaddle +unsaddled +unsaddling +unsafe +unsafeguarded +unsafely +unsafeness +unsafety +unsagacious +unsage +unsagging +unsaid +unsailable +unsailed +unsailorlike +unsaint +unsainted +unsaintlike +unsaintly +unsalability +unsalable +unsalableness +unsalably +unsalaried +unsalesmanlike +unsaline +unsalivated +unsallying +unsalmonlike +unsalt +unsaltable +unsaltatory +unsalted +unsalubrious +unsalutary +unsaluted +unsaluting +unsalvability +unsalvable +unsalvableness +unsalvaged +unsalved +unsampled +unsanctification +unsanctified +unsanctifiedly +unsanctifiedness +unsanctify +unsanctifying +unsanctimonious +unsanctimoniously +unsanctimoniousness +unsanction +unsanctionable +unsanctioned +unsanctioning +unsanctitude +unsanctity +unsanctuaried +unsandaled +unsanded +unsane +unsanguinary +unsanguine +unsanguinely +unsanguineness +unsanguineous +unsanguineously +unsanitariness +unsanitary +unsanitated +unsanitation +unsanity +unsaponifiable +unsaponified +unsapped +unsappy +unsarcastic +unsardonic +unsartorial +unsash +unsashed +unsatable +unsatanic +unsated +unsatedly +unsatedness +unsatiability +unsatiable +unsatiableness +unsatiably +unsatiate +unsatiated +unsatiating +unsatin +unsatire +unsatirical +unsatirically +unsatirize +unsatirized +unsatisfaction +unsatisfactorily +unsatisfactoriness +unsatisfactory +unsatisfiable +unsatisfiableness +unsatisfiably +unsatisfied +unsatisfiedly +unsatisfiedness +unsatisfying +unsatisfyingly +unsatisfyingness +unsaturable +unsaturated +unsaturatedly +unsaturatedness +unsaturation +unsatyrlike +unsauced +unsaurian +unsavable +unsaveable +unsaved +unsaving +unsavored +unsavoredly +unsavoredness +unsavorily +unsavoriness +unsavory +unsawed +unsawn +unsay +unsayability +unsayable +unscabbard +unscabbarded +unscabbed +unscaffolded +unscalable +unscalableness +unscalably +unscale +unscaled +unscaledness +unscalloped +unscaly +unscamped +unscandalize +unscandalized +unscandalous +unscannable +unscanned +unscanted +unscanty +unscarb +unscarce +unscared +unscarfed +unscarified +unscarred +unscathed +unscathedly +unscathedness +unscattered +unscavengered +unscenic +unscent +unscented +unscepter +unsceptered +unsceptical +unsceptre +unsceptred +unscheduled +unschematic +unschematized +unscholar +unscholarlike +unscholarly +unscholastic +unschool +unschooled +unschooledly +unschooledness +unscienced +unscientific +unscientifical +unscientifically +unscintillating +unscioned +unscissored +unscoffed +unscoffing +unscolded +unsconced +unscooped +unscorched +unscored +unscorified +unscoring +unscorned +unscornful +unscornfully +unscornfulness +unscotch +unscotched +unscottify +unscoured +unscourged +unscowling +unscramble +unscrambling +unscraped +unscratchable +unscratched +unscratching +unscratchingly +unscrawled +unscreen +unscreenable +unscreenably +unscreened +unscrew +unscrewable +unscrewed +unscrewing +unscribal +unscribbled +unscribed +unscrimped +unscriptural +unscripturally +unscripturalness +unscrubbed +unscrupled +unscrupulosity +unscrupulous +unscrupulously +unscrupulousness +unscrutable +unscrutinized +unscrutinizing +unscrutinizingly +unsculptural +unsculptured +unscummed +unscutcheoned +unseafaring +unseal +unsealable +unsealed +unsealer +unsealing +unseam +unseamanlike +unseamanship +unseamed +unseaming +unsearchable +unsearchableness +unsearchably +unsearched +unsearcherlike +unsearching +unseared +unseason +unseasonable +unseasonableness +unseasonably +unseasoned +unseat +unseated +unseaworthiness +unseaworthy +unseceding +unsecluded +unseclusive +unseconded +unsecrecy +unsecret +unsecretarylike +unsecreted +unsecreting +unsecretly +unsecretness +unsectarian +unsectarianism +unsectarianize +unsectional +unsecular +unsecularize +unsecularized +unsecure +unsecured +unsecuredly +unsecuredness +unsecurely +unsecureness +unsecurity +unsedate +unsedentary +unseditious +unseduce +unseduced +unseducible +unseductive +unsedulous +unsee +unseeable +unseeded +unseeing +unseeingly +unseeking +unseeming +unseemingly +unseemlily +unseemliness +unseemly +unseen +unseethed +unsegmented +unsegregable +unsegregated +unsegregatedness +unseignorial +unseismic +unseizable +unseized +unseldom +unselect +unselected +unselecting +unselective +unself +unselfish +unselfishly +unselfishness +unselflike +unselfness +unselling +unsenatorial +unsenescent +unsensational +unsense +unsensed +unsensibility +unsensible +unsensibleness +unsensibly +unsensitive +unsensitize +unsensitized +unsensory +unsensual +unsensualize +unsensualized +unsensually +unsensuous +unsensuousness +unsent +unsentenced +unsententious +unsentient +unsentimental +unsentimentalist +unsentimentality +unsentimentalize +unsentimentally +unsentineled +unsentinelled +unseparable +unseparableness +unseparably +unseparate +unseparated +unseptate +unseptated +unsepulcher +unsepulchered +unsepulchral +unsepulchre +unsepulchred +unsepultured +unsequenced +unsequential +unsequestered +unseraphical +unserenaded +unserene +unserflike +unserious +unseriousness +unserrated +unserried +unservable +unserved +unserviceability +unserviceable +unserviceableness +unserviceably +unservicelike +unservile +unsesquipedalian +unset +unsetting +unsettle +unsettleable +unsettled +unsettledness +unsettlement +unsettling +unseverable +unseverableness +unsevere +unsevered +unseveredly +unseveredness +unsew +unsewed +unsewered +unsewing +unsewn +unsex +unsexed +unsexing +unsexlike +unsexual +unshackle +unshackled +unshackling +unshade +unshaded +unshadow +unshadowable +unshadowed +unshady +unshafted +unshakable +unshakably +unshakeable +unshakeably +unshaken +unshakenly +unshakenness +unshaking +unshakingness +unshaled +unshamable +unshamableness +unshamably +unshameable +unshameableness +unshameably +unshamed +unshamefaced +unshamefacedness +unshameful +unshamefully +unshamefulness +unshammed +unshanked +unshapable +unshape +unshapeable +unshaped +unshapedness +unshapeliness +unshapely +unshapen +unshapenly +unshapenness +unsharable +unshared +unsharedness +unsharing +unsharp +unsharped +unsharpen +unsharpened +unsharpening +unsharping +unshattered +unshavable +unshaveable +unshaved +unshavedly +unshavedness +unshaven +unshavenly +unshavenness +unshawl +unsheaf +unsheared +unsheathe +unsheathed +unsheathing +unshed +unsheet +unsheeted +unsheeting +unshell +unshelled +unshelling +unshelterable +unsheltered +unsheltering +unshelve +unshepherded +unshepherding +unsheriff +unshewed +unshieldable +unshielded +unshielding +unshiftable +unshifted +unshiftiness +unshifting +unshifty +unshimmering +unshingled +unshining +unship +unshiplike +unshipment +unshipped +unshipping +unshipshape +unshipwrecked +unshirking +unshirted +unshivered +unshivering +unshockable +unshocked +unshod +unshodden +unshoe +unshoed +unshoeing +unshop +unshore +unshored +unshorn +unshort +unshortened +unshot +unshotted +unshoulder +unshouted +unshouting +unshoved +unshoveled +unshowable +unshowed +unshowmanlike +unshown +unshowy +unshredded +unshrew +unshrewd +unshrewish +unshrill +unshrine +unshrined +unshrinement +unshrink +unshrinkability +unshrinkable +unshrinking +unshrinkingly +unshrived +unshriveled +unshrivelled +unshriven +unshroud +unshrouded +unshrubbed +unshrugging +unshrunk +unshrunken +unshuddering +unshuffle +unshuffled +unshunnable +unshunned +unshunted +unshut +unshutter +unshuttered +unshy +unshyly +unshyness +unsibilant +unsiccated +unsick +unsickened +unsicker +unsickerly +unsickerness +unsickled +unsickly +unsided +unsiding +unsiege +unsifted +unsighing +unsight +unsightable +unsighted +unsighting +unsightliness +unsightly +unsigmatic +unsignable +unsignaled +unsignalized +unsignalled +unsignatured +unsigned +unsigneted +unsignificancy +unsignificant +unsignificantly +unsignificative +unsignified +unsignifying +unsilenceable +unsilenceably +unsilenced +unsilent +unsilentious +unsilently +unsilicified +unsilly +unsilvered +unsimilar +unsimilarity +unsimilarly +unsimple +unsimplicity +unsimplified +unsimplify +unsimulated +unsimultaneous +unsin +unsincere +unsincerely +unsincereness +unsincerity +unsinew +unsinewed +unsinewing +unsinewy +unsinful +unsinfully +unsinfulness +unsing +unsingability +unsingable +unsingableness +unsinged +unsingle +unsingled +unsingleness +unsingular +unsinister +unsinkability +unsinkable +unsinking +unsinnable +unsinning +unsinningness +unsiphon +unsipped +unsister +unsistered +unsisterliness +unsisterly +unsizable +unsizableness +unsizeable +unsizeableness +unsized +unskaithd +unskeptical +unsketchable +unsketched +unskewed +unskewered +unskilful +unskilfully +unskilled +unskilledly +unskilledness +unskillful +unskillfully +unskillfulness +unskimmed +unskin +unskinned +unskirted +unslack +unslacked +unslackened +unslackening +unslacking +unslagged +unslain +unslakable +unslakeable +unslaked +unslammed +unslandered +unslanderous +unslapped +unslashed +unslate +unslated +unslating +unslaughtered +unslave +unslayable +unsleaved +unsleek +unsleepably +unsleeping +unsleepingly +unsleepy +unsleeve +unsleeved +unslender +unslept +unsliced +unsliding +unslighted +unsling +unslip +unslipped +unslippery +unslipping +unslit +unslockened +unsloped +unslopped +unslot +unslothful +unslothfully +unslothfulness +unslotted +unsloughed +unsloughing +unslow +unsluggish +unsluice +unsluiced +unslumbering +unslumberous +unslumbrous +unslung +unslurred +unsly +unsmacked +unsmart +unsmartly +unsmartness +unsmeared +unsmelled +unsmelling +unsmelted +unsmiled +unsmiling +unsmilingly +unsmilingness +unsmirched +unsmirking +unsmitten +unsmokable +unsmokeable +unsmoked +unsmokified +unsmoking +unsmoky +unsmooth +unsmoothed +unsmoothly +unsmoothness +unsmote +unsmotherable +unsmothered +unsmudged +unsmuggled +unsmutched +unsmutted +unsmutty +unsnaffled +unsnagged +unsnaggled +unsnaky +unsnap +unsnapped +unsnare +unsnared +unsnarl +unsnatch +unsnatched +unsneck +unsneering +unsnib +unsnipped +unsnobbish +unsnoring +unsnouted +unsnow +unsnubbable +unsnubbed +unsnuffed +unsoaked +unsoaped +unsoarable +unsober +unsoberly +unsoberness +unsobriety +unsociability +unsociable +unsociableness +unsociably +unsocial +unsocialism +unsocialistic +unsociality +unsocializable +unsocialized +unsocially +unsocialness +unsociological +unsocket +unsodden +unsoft +unsoftened +unsoftening +unsoggy +unsoil +unsoiled +unsoiledness +unsolaced +unsolacing +unsolar +unsold +unsolder +unsoldered +unsoldering +unsoldier +unsoldiered +unsoldierlike +unsoldierly +unsole +unsoled +unsolemn +unsolemness +unsolemnize +unsolemnized +unsolemnly +unsolicitated +unsolicited +unsolicitedly +unsolicitous +unsolicitously +unsolicitousness +unsolid +unsolidarity +unsolidifiable +unsolidified +unsolidity +unsolidly +unsolidness +unsolitary +unsolubility +unsoluble +unsolvable +unsolvableness +unsolvably +unsolved +unsomatic +unsomber +unsombre +unsome +unson +unsonable +unsonant +unsonlike +unsonneted +unsonorous +unsonsy +unsoothable +unsoothed +unsoothfast +unsoothing +unsooty +unsophistical +unsophistically +unsophisticate +unsophisticated +unsophisticatedly +unsophisticatedness +unsophistication +unsophomoric +unsordid +unsore +unsorrowed +unsorrowing +unsorry +unsort +unsortable +unsorted +unsorting +unsotted +unsought +unsoul +unsoulful +unsoulfully +unsoulish +unsound +unsoundable +unsoundableness +unsounded +unsounding +unsoundly +unsoundness +unsour +unsoured +unsoused +unsovereign +unsowed +unsown +unspaced +unspacious +unspaded +unspan +unspangled +unspanked +unspanned +unspar +unsparable +unspared +unsparing +unsparingly +unsparingness +unsparkling +unsparred +unsparse +unspatial +unspatiality +unspattered +unspawned +unspayed +unspeak +unspeakability +unspeakable +unspeakableness +unspeakably +unspeaking +unspeared +unspecialized +unspecializing +unspecific +unspecified +unspecifiedly +unspecious +unspecked +unspeckled +unspectacled +unspectacular +unspectacularly +unspecterlike +unspectrelike +unspeculating +unspeculative +unspeculatively +unsped +unspeed +unspeedy +unspeered +unspell +unspellable +unspelled +unspelt +unspendable +unspending +unspent +unspewed +unsphere +unsphered +unsphering +unspiable +unspiced +unspicy +unspied +unspike +unspillable +unspin +unspinsterlike +unspinsterlikeness +unspiral +unspired +unspirit +unspirited +unspiritedly +unspiriting +unspiritual +unspirituality +unspiritualize +unspiritualized +unspiritually +unspiritualness +unspissated +unspit +unspited +unspiteful +unspitted +unsplashed +unsplattered +unsplayed +unspleened +unspleenish +unspleenishly +unsplendid +unspliced +unsplinted +unsplintered +unsplit +unspoil +unspoilable +unspoilableness +unspoilably +unspoiled +unspoken +unspokenly +unsponged +unspongy +unsponsored +unspontaneous +unspontaneously +unspookish +unsported +unsportful +unsporting +unsportive +unsportsmanlike +unsportsmanly +unspot +unspotlighted +unspottable +unspotted +unspottedly +unspottedness +unspoused +unspouselike +unspouted +unsprained +unsprayed +unspread +unsprightliness +unsprightly +unspring +unspringing +unspringlike +unsprinkled +unsprinklered +unsprouted +unsproutful +unsprouting +unspruced +unsprung +unspun +unspurned +unspurred +unspying +unsquandered +unsquarable +unsquare +unsquared +unsquashed +unsqueamish +unsqueezable +unsqueezed +unsquelched +unsquinting +unsquire +unsquired +unsquirelike +unsquirted +unstabbed +unstability +unstable +unstabled +unstableness +unstablished +unstably +unstack +unstacked +unstacker +unstaffed +unstaged +unstaggered +unstaggering +unstagnating +unstagy +unstaid +unstaidly +unstaidness +unstain +unstainable +unstainableness +unstained +unstainedly +unstainedness +unstaled +unstalked +unstalled +unstammering +unstamped +unstampeded +unstanch +unstanchable +unstandard +unstandardized +unstanzaic +unstar +unstarch +unstarched +unstarlike +unstarred +unstarted +unstarting +unstartled +unstarved +unstatable +unstate +unstateable +unstated +unstately +unstatesmanlike +unstatic +unstating +unstation +unstationary +unstationed +unstatistic +unstatistical +unstatued +unstatuesque +unstatutable +unstatutably +unstaunch +unstaunchable +unstaunched +unstavable +unstaveable +unstaved +unstayable +unstayed +unstayedness +unstaying +unsteadfast +unsteadfastly +unsteadfastness +unsteadied +unsteadily +unsteadiness +unsteady +unsteadying +unstealthy +unsteamed +unsteaming +unsteck +unstecked +unsteel +unsteeled +unsteep +unsteeped +unsteepled +unsteered +unstemmable +unstemmed +unstentorian +unstep +unstercorated +unstereotyped +unsterile +unsterilized +unstern +unstethoscoped +unstewardlike +unstewed +unstick +unsticking +unstickingness +unsticky +unstiffen +unstiffened +unstifled +unstigmatized +unstill +unstilled +unstillness +unstilted +unstimulated +unstimulating +unsting +unstinged +unstinging +unstinted +unstintedly +unstinting +unstintingly +unstippled +unstipulated +unstirrable +unstirred +unstirring +unstitch +unstitched +unstitching +unstock +unstocked +unstocking +unstockinged +unstoic +unstoical +unstoically +unstoicize +unstoked +unstoken +unstolen +unstonable +unstone +unstoned +unstoniness +unstony +unstooping +unstop +unstoppable +unstopped +unstopper +unstoppered +unstopple +unstore +unstored +unstoried +unstormed +unstormy +unstout +unstoved +unstow +unstowed +unstraddled +unstrafed +unstraight +unstraightened +unstraightforward +unstraightness +unstrain +unstrained +unstraitened +unstrand +unstranded +unstrange +unstrangered +unstrangled +unstrangulable +unstrap +unstrapped +unstrategic +unstrategically +unstratified +unstraying +unstreaked +unstrength +unstrengthen +unstrengthened +unstrenuous +unstressed +unstressedly +unstressedness +unstretch +unstretched +unstrewed +unstrewn +unstriated +unstricken +unstrictured +unstridulous +unstrike +unstriking +unstring +unstringed +unstringing +unstrip +unstriped +unstripped +unstriving +unstroked +unstrong +unstructural +unstruggling +unstrung +unstubbed +unstubborn +unstuccoed +unstuck +unstudded +unstudied +unstudious +unstuff +unstuffed +unstuffing +unstultified +unstumbling +unstung +unstunned +unstunted +unstupefied +unstupid +unstuttered +unstuttering +unsty +unstyled +unstylish +unstylishly +unstylishness +unsubdivided +unsubduable +unsubduableness +unsubduably +unsubducted +unsubdued +unsubduedly +unsubduedness +unsubject +unsubjectable +unsubjected +unsubjectedness +unsubjection +unsubjective +unsubjectlike +unsubjugate +unsubjugated +unsublimable +unsublimated +unsublimed +unsubmerged +unsubmergible +unsubmerging +unsubmission +unsubmissive +unsubmissively +unsubmissiveness +unsubmitted +unsubmitting +unsubordinate +unsubordinated +unsuborned +unsubpoenaed +unsubscribed +unsubscribing +unsubservient +unsubsided +unsubsidiary +unsubsiding +unsubsidized +unsubstanced +unsubstantial +unsubstantiality +unsubstantialize +unsubstantially +unsubstantialness +unsubstantiate +unsubstantiated +unsubstantiation +unsubstituted +unsubtle +unsubtleness +unsubtlety +unsubtly +unsubtracted +unsubventioned +unsubventionized +unsubversive +unsubvertable +unsubverted +unsubvertive +unsucceedable +unsucceeded +unsucceeding +unsuccess +unsuccessful +unsuccessfully +unsuccessfulness +unsuccessive +unsuccessively +unsuccessiveness +unsuccinct +unsuccorable +unsuccored +unsucculent +unsuccumbing +unsucked +unsuckled +unsued +unsufferable +unsufferableness +unsufferably +unsuffered +unsuffering +unsufficed +unsufficience +unsufficiency +unsufficient +unsufficiently +unsufficing +unsufficingness +unsufflated +unsuffocate +unsuffocated +unsuffocative +unsuffused +unsugared +unsugary +unsuggested +unsuggestedness +unsuggestive +unsuggestiveness +unsuit +unsuitability +unsuitable +unsuitableness +unsuitably +unsuited +unsuiting +unsulky +unsullen +unsulliable +unsullied +unsulliedly +unsulliedness +unsulphonated +unsulphureous +unsulphurized +unsultry +unsummable +unsummarized +unsummed +unsummered +unsummerlike +unsummerly +unsummonable +unsummoned +unsumptuary +unsumptuous +unsun +unsunburned +unsundered +unsung +unsunk +unsunken +unsunned +unsunny +unsuperable +unsuperannuated +unsupercilious +unsuperficial +unsuperfluous +unsuperior +unsuperlative +unsupernatural +unsupernaturalize +unsupernaturalized +unsuperscribed +unsuperseded +unsuperstitious +unsupervised +unsupervisedly +unsupped +unsupplantable +unsupplanted +unsupple +unsuppled +unsupplemented +unsuppliable +unsupplicated +unsupplied +unsupportable +unsupportableness +unsupportably +unsupported +unsupportedly +unsupportedness +unsupporting +unsupposable +unsupposed +unsuppressed +unsuppressible +unsuppressibly +unsuppurated +unsuppurative +unsupreme +unsurcharge +unsurcharged +unsure +unsurfaced +unsurfeited +unsurfeiting +unsurgical +unsurging +unsurmised +unsurmising +unsurmountable +unsurmountableness +unsurmountably +unsurmounted +unsurnamed +unsurpassable +unsurpassableness +unsurpassably +unsurpassed +unsurplice +unsurpliced +unsurprised +unsurprising +unsurrendered +unsurrendering +unsurrounded +unsurveyable +unsurveyed +unsurvived +unsurviving +unsusceptibility +unsusceptible +unsusceptibleness +unsusceptibly +unsusceptive +unsuspectable +unsuspectably +unsuspected +unsuspectedly +unsuspectedness +unsuspectful +unsuspectfulness +unsuspectible +unsuspecting +unsuspectingly +unsuspectingness +unsuspective +unsuspended +unsuspicion +unsuspicious +unsuspiciously +unsuspiciousness +unsustainable +unsustained +unsustaining +unsutured +unswabbed +unswaddle +unswaddled +unswaddling +unswallowable +unswallowed +unswanlike +unswapped +unswarming +unswathable +unswathe +unswathed +unswathing +unswayable +unswayed +unswayedness +unswaying +unswear +unswearing +unsweat +unsweated +unsweating +unsweepable +unsweet +unsweeten +unsweetened +unsweetenedness +unsweetly +unsweetness +unswell +unswelled +unswelling +unsweltered +unswept +unswervable +unswerved +unswerving +unswervingly +unswilled +unswing +unswingled +unswitched +unswivel +unswollen +unswooning +unsworn +unswung +unsyllabic +unsyllabled +unsyllogistical +unsymbolic +unsymbolical +unsymbolically +unsymbolicalness +unsymbolized +unsymmetrical +unsymmetrically +unsymmetricalness +unsymmetrized +unsymmetry +unsympathetic +unsympathetically +unsympathizability +unsympathizable +unsympathized +unsympathizing +unsympathizingly +unsympathy +unsymphonious +unsymptomatic +unsynchronized +unsynchronous +unsyncopated +unsyndicated +unsynonymous +unsyntactical +unsynthetic +unsyringed +unsystematic +unsystematical +unsystematically +unsystematized +unsystematizedly +unsystematizing +unsystemizable +untabernacled +untabled +untabulated +untack +untacked +untacking +untackle +untackled +untactful +untactfully +untactfulness +untagged +untailed +untailorlike +untailorly +untaint +untaintable +untainted +untaintedly +untaintedness +untainting +untakable +untakableness +untakeable +untakeableness +untaken +untaking +untalented +untalkative +untalked +untalking +untall +untallied +untallowed +untamable +untamableness +untame +untamed +untamedly +untamedness +untamely +untameness +untampered +untangential +untangibility +untangible +untangibleness +untangibly +untangle +untangled +untangling +untanned +untantalized +untantalizing +untap +untaped +untapered +untapering +untapestried +untappable +untapped +untar +untarnishable +untarnished +untarred +untarried +untarrying +untartarized +untasked +untasseled +untastable +untaste +untasteable +untasted +untasteful +untastefully +untastefulness +untasting +untasty +untattered +untattooed +untaught +untaughtness +untaunted +untaut +untautological +untawdry +untawed +untax +untaxable +untaxed +untaxing +unteach +unteachable +unteachableness +unteachably +unteacherlike +unteaching +unteam +unteamed +unteaming +untearable +unteased +unteasled +untechnical +untechnicalize +untechnically +untedded +untedious +unteem +unteeming +unteethed +untelegraphed +untell +untellable +untellably +untelling +untemper +untemperamental +untemperate +untemperately +untemperateness +untempered +untempering +untempested +untempestuous +untempled +untemporal +untemporary +untemporizing +untemptability +untemptable +untemptably +untempted +untemptible +untemptibly +untempting +untemptingly +untemptingness +untenability +untenable +untenableness +untenably +untenacious +untenacity +untenant +untenantable +untenantableness +untenanted +untended +untender +untendered +untenderly +untenderness +untenible +untenibleness +untenibly +untense +untent +untentaculate +untented +untentered +untenty +unterminable +unterminableness +unterminably +unterminated +unterminating +unterraced +unterrestrial +unterrible +unterribly +unterrifiable +unterrific +unterrified +unterrifying +unterrorized +untessellated +untestable +untestamentary +untested +untestifying +untether +untethered +untethering +untewed +untextual +unthank +unthanked +unthankful +unthankfully +unthankfulness +unthanking +unthatch +unthatched +unthaw +unthawed +unthawing +untheatric +untheatrical +untheatrically +untheistic +unthematic +untheological +untheologically +untheologize +untheoretic +untheoretical +untheorizable +untherapeutical +unthick +unthicken +unthickened +unthievish +unthink +unthinkability +unthinkable +unthinkableness +unthinkably +unthinker +unthinking +unthinkingly +unthinkingness +unthinned +unthinning +unthirsting +unthirsty +unthistle +untholeable +untholeably +unthorn +unthorny +unthorough +unthought +unthoughted +unthoughtedly +unthoughtful +unthoughtfully +unthoughtfulness +unthoughtlike +unthrall +unthralled +unthrashed +unthread +unthreadable +unthreaded +unthreading +unthreatened +unthreatening +unthreshed +unthrid +unthridden +unthrift +unthriftihood +unthriftily +unthriftiness +unthriftlike +unthrifty +unthrilled +unthrilling +unthriven +unthriving +unthrivingly +unthrivingness +unthrob +unthrone +unthroned +unthronged +unthroning +unthrottled +unthrowable +unthrown +unthrushlike +unthrust +unthumbed +unthumped +unthundered +unthwacked +unthwarted +untiaraed +unticketed +untickled +untidal +untidily +untidiness +untidy +untie +untied +untight +untighten +untightness +until +untile +untiled +untill +untillable +untilled +untilling +untilt +untilted +untilting +untimbered +untimed +untimedness +untimeliness +untimely +untimeous +untimeously +untimesome +untimorous +untin +untinct +untinctured +untine +untinged +untinkered +untinned +untinseled +untinted +untippable +untipped +untippled +untipt +untirability +untirable +untire +untired +untiredly +untiring +untiringly +untissued +untithability +untithable +untithed +untitled +untittering +untitular +unto +untoadying +untoasted +untogaed +untoggle +untoggler +untoiled +untoileted +untoiling +untold +untolerable +untolerableness +untolerably +untolerated +untomb +untombed +untonality +untone +untoned +untongued +untonsured +untooled +untooth +untoothed +untoothsome +untoothsomeness +untop +untopographical +untopped +untopping +untormented +untorn +untorpedoed +untorpid +untorrid +untortuous +untorture +untortured +untossed +untotaled +untotalled +untottering +untouch +untouchability +untouchable +untouchableness +untouchably +untouched +untouchedness +untouching +untough +untoured +untouristed +untoward +untowardliness +untowardly +untowardness +untowered +untown +untownlike +untrace +untraceable +untraceableness +untraceably +untraced +untraceried +untracked +untractability +untractable +untractableness +untractably +untractarian +untractible +untractibleness +untradeable +untraded +untradesmanlike +untrading +untraditional +untraduced +untraffickable +untrafficked +untragic +untragical +untrailed +untrain +untrainable +untrained +untrainedly +untrainedness +untraitored +untraitorous +untrammed +untrammeled +untrammeledness +untramped +untrampled +untrance +untranquil +untranquilized +untranquillize +untranquillized +untransacted +untranscended +untranscendental +untranscribable +untranscribed +untransferable +untransferred +untransfigured +untransfixed +untransformable +untransformed +untransforming +untransfused +untransfusible +untransgressed +untransient +untransitable +untransitive +untransitory +untranslatability +untranslatable +untranslatableness +untranslatably +untranslated +untransmigrated +untransmissible +untransmitted +untransmutable +untransmuted +untransparent +untranspassable +untranspired +untranspiring +untransplanted +untransportable +untransported +untransposed +untransubstantiated +untrappable +untrapped +untrashed +untravelable +untraveled +untraveling +untravellable +untravelling +untraversable +untraversed +untravestied +untreacherous +untread +untreadable +untreading +untreasonable +untreasure +untreasured +untreatable +untreatableness +untreatably +untreated +untreed +untrekked +untrellised +untrembling +untremblingly +untremendous +untremulous +untrenched +untrepanned +untrespassed +untrespassing +untress +untressed +untriable +untribal +untributary +untriced +untrickable +untricked +untried +untrifling +untrig +untrigonometrical +untrill +untrim +untrimmable +untrimmed +untrimmedness +untrinitarian +untripe +untrippable +untripped +untripping +untrite +untriturated +untriumphable +untriumphant +untriumphed +untrochaic +untrod +untrodden +untroddenness +untrolled +untrophied +untropical +untrotted +untroublable +untrouble +untroubled +untroubledly +untroubledness +untroublesome +untroublesomeness +untrounced +untrowed +untruant +untruck +untruckled +untruckling +untrue +untrueness +untruism +untruly +untrumped +untrumpeted +untrumping +untrundled +untrunked +untruss +untrussed +untrusser +untrussing +untrust +untrustably +untrusted +untrustful +untrustiness +untrusting +untrustworthily +untrustworthiness +untrustworthy +untrusty +untruth +untruther +untruthful +untruthfully +untruthfulness +untrying +untubbed +untuck +untucked +untuckered +untucking +untufted +untugged +untumbled +untumefied +untumid +untumultuous +untunable +untunableness +untunably +untune +untuneable +untuneableness +untuneably +untuned +untuneful +untunefully +untunefulness +untuning +untunneled +untupped +unturbaned +unturbid +unturbulent +unturf +unturfed +unturgid +unturn +unturnable +unturned +unturning +unturpentined +unturreted +untusked +untutelar +untutored +untutoredly +untutoredness +untwilled +untwinable +untwine +untwineable +untwined +untwining +untwinkling +untwinned +untwirl +untwirled +untwirling +untwist +untwisted +untwister +untwisting +untwitched +untying +untypical +untypically +untyrannic +untyrannical +untyrantlike +untz +unubiquitous +unugly +unulcerated +unultra +unumpired +ununanimity +ununanimous +ununanimously +ununderstandable +ununderstandably +ununderstanding +ununderstood +unundertaken +unundulatory +Unungun +ununifiable +ununified +ununiform +ununiformed +ununiformity +ununiformly +ununiformness +ununitable +ununitableness +ununitably +ununited +ununiting +ununiversity +ununiversitylike +unupbraiding +unupbraidingly +unupholstered +unupright +unuprightly +unuprightness +unupset +unupsettable +unurban +unurbane +unurged +unurgent +unurging +unurn +unurned +unusable +unusableness +unusably +unuse +unused +unusedness +unuseful +unusefully +unusefulness +unushered +unusual +unusuality +unusually +unusualness +unusurious +unusurped +unusurping +unutilizable +unutterability +unutterable +unutterableness +unutterably +unuttered +unuxorial +unuxorious +unvacant +unvaccinated +unvacillating +unvailable +unvain +unvaleted +unvaletudinary +unvaliant +unvalid +unvalidated +unvalidating +unvalidity +unvalidly +unvalidness +unvalorous +unvaluable +unvaluableness +unvaluably +unvalue +unvalued +unvamped +unvanishing +unvanquishable +unvanquished +unvantaged +unvaporized +unvariable +unvariableness +unvariably +unvariant +unvaried +unvariedly +unvariegated +unvarnished +unvarnishedly +unvarnishedness +unvarying +unvaryingly +unvaryingness +unvascular +unvassal +unvatted +unvaulted +unvaulting +unvaunted +unvaunting +unvauntingly +unveering +unveil +unveiled +unveiledly +unveiledness +unveiler +unveiling +unveilment +unveined +unvelvety +unvendable +unvendableness +unvended +unvendible +unvendibleness +unveneered +unvenerable +unvenerated +unvenereal +unvenged +unveniable +unvenial +unvenom +unvenomed +unvenomous +unventable +unvented +unventilated +unventured +unventurous +unvenued +unveracious +unveracity +unverbalized +unverdant +unverdured +unveridical +unverifiable +unverifiableness +unverifiably +unverified +unverifiedness +unveritable +unverity +unvermiculated +unverminous +unvernicular +unversatile +unversed +unversedly +unversedness +unversified +unvertical +unvessel +unvesseled +unvest +unvested +unvetoed +unvexed +unviable +unvibrated +unvibrating +unvicar +unvicarious +unvicariously +unvicious +unvictimized +unvictorious +unvictualed +unvictualled +unviewable +unviewed +unvigilant +unvigorous +unvigorously +unvilified +unvillaged +unvindicated +unvindictive +unvindictively +unvindictiveness +unvinous +unvintaged +unviolable +unviolated +unviolenced +unviolent +unviolined +unvirgin +unvirginal +unvirginlike +unvirile +unvirility +unvirtue +unvirtuous +unvirtuously +unvirtuousness +unvirulent +unvisible +unvisibleness +unvisibly +unvision +unvisionary +unvisioned +unvisitable +unvisited +unvisor +unvisored +unvisualized +unvital +unvitalized +unvitalness +unvitiated +unvitiatedly +unvitiatedness +unvitrescibility +unvitrescible +unvitrifiable +unvitrified +unvitriolized +unvituperated +unvivacious +unvivid +unvivified +unvizard +unvizarded +unvocal +unvocalized +unvociferous +unvoice +unvoiced +unvoiceful +unvoicing +unvoidable +unvoided +unvolatile +unvolatilize +unvolatilized +unvolcanic +unvolitioned +unvoluminous +unvoluntarily +unvoluntariness +unvoluntary +unvolunteering +unvoluptuous +unvomited +unvoracious +unvote +unvoted +unvoting +unvouched +unvouchedly +unvouchedness +unvouchsafed +unvowed +unvoweled +unvoyageable +unvoyaging +unvulcanized +unvulgar +unvulgarize +unvulgarized +unvulgarly +unvulnerable +unwadable +unwadded +unwadeable +unwaded +unwading +unwafted +unwaged +unwagered +unwaggable +unwaggably +unwagged +unwailed +unwailing +unwainscoted +unwaited +unwaiting +unwaked +unwakeful +unwakefulness +unwakened +unwakening +unwaking +unwalkable +unwalked +unwalking +unwall +unwalled +unwallet +unwallowed +unwan +unwandered +unwandering +unwaning +unwanted +unwanton +unwarbled +unware +unwarely +unwareness +unwarily +unwariness +unwarlike +unwarlikeness +unwarm +unwarmable +unwarmed +unwarming +unwarn +unwarned +unwarnedly +unwarnedness +unwarnished +unwarp +unwarpable +unwarped +unwarping +unwarrant +unwarrantability +unwarrantable +unwarrantableness +unwarrantably +unwarranted +unwarrantedly +unwarrantedness +unwary +unwashable +unwashed +unwashedness +unwassailing +unwastable +unwasted +unwasteful +unwastefully +unwasting +unwastingly +unwatchable +unwatched +unwatchful +unwatchfully +unwatchfulness +unwatching +unwater +unwatered +unwaterlike +unwatermarked +unwatery +unwattled +unwaved +unwaverable +unwavered +unwavering +unwaveringly +unwaving +unwax +unwaxed +unwayed +unwayward +unweaken +unweakened +unweal +unwealsomeness +unwealthy +unweaned +unweapon +unweaponed +unwearable +unweariability +unweariable +unweariableness +unweariably +unwearied +unweariedly +unweariedness +unwearily +unweariness +unwearing +unwearisome +unwearisomeness +unweary +unwearying +unwearyingly +unweathered +unweatherly +unweatherwise +unweave +unweaving +unweb +unwebbed +unwebbing +unwed +unwedded +unweddedly +unweddedness +unwedge +unwedgeable +unwedged +unweeded +unweel +unweelness +unweened +unweeping +unweeting +unweetingly +unweft +unweighable +unweighed +unweighing +unweight +unweighted +unweighty +unwelcome +unwelcomed +unwelcomely +unwelcomeness +unweld +unweldable +unwelded +unwell +unwellness +unwelted +unwept +unwestern +unwesternized +unwet +unwettable +unwetted +unwheedled +unwheel +unwheeled +unwhelmed +unwhelped +unwhetted +unwhig +unwhiglike +unwhimsical +unwhining +unwhip +unwhipped +unwhirled +unwhisked +unwhiskered +unwhisperable +unwhispered +unwhispering +unwhistled +unwhite +unwhited +unwhitened +unwhitewashed +unwholesome +unwholesomely +unwholesomeness +unwidened +unwidowed +unwield +unwieldable +unwieldily +unwieldiness +unwieldly +unwieldy +unwifed +unwifelike +unwifely +unwig +unwigged +unwild +unwilily +unwiliness +unwill +unwilled +unwillful +unwillfully +unwillfulness +unwilling +unwillingly +unwillingness +unwilted +unwilting +unwily +unwincing +unwincingly +unwind +unwindable +unwinding +unwindingly +unwindowed +unwindy +unwingable +unwinged +unwinking +unwinkingly +unwinnable +unwinning +unwinnowed +unwinsome +unwinter +unwintry +unwiped +unwire +unwired +unwisdom +unwise +unwisely +unwiseness +unwish +unwished +unwishful +unwishing +unwist +unwistful +unwitch +unwitched +unwithdrawable +unwithdrawing +unwithdrawn +unwitherable +unwithered +unwithering +unwithheld +unwithholden +unwithholding +unwithstanding +unwithstood +unwitless +unwitnessed +unwitted +unwittily +unwitting +unwittingly +unwittingness +unwitty +unwive +unwived +unwoeful +unwoful +unwoman +unwomanish +unwomanize +unwomanized +unwomanlike +unwomanliness +unwomanly +unwomb +unwon +unwonder +unwonderful +unwondering +unwonted +unwontedly +unwontedness +unwooded +unwooed +unwoof +unwooly +unwordable +unwordably +unwordily +unwordy +unwork +unworkability +unworkable +unworkableness +unworkably +unworked +unworkedness +unworker +unworking +unworkmanlike +unworkmanly +unworld +unworldliness +unworldly +unwormed +unwormy +unworn +unworried +unworriedly +unworriedness +unworshiped +unworshipful +unworshiping +unworshipped +unworshipping +unworth +unworthily +unworthiness +unworthy +unwotting +unwound +unwoundable +unwoundableness +unwounded +unwoven +unwrangling +unwrap +unwrapped +unwrapper +unwrapping +unwrathful +unwrathfully +unwreaked +unwreathe +unwreathed +unwreathing +unwrecked +unwrench +unwrenched +unwrested +unwrestedly +unwresting +unwrestled +unwretched +unwriggled +unwrinkle +unwrinkleable +unwrinkled +unwrit +unwritable +unwrite +unwriting +unwritten +unwronged +unwrongful +unwrought +unwrung +unyachtsmanlike +unyeaned +unyearned +unyearning +unyielded +unyielding +unyieldingly +unyieldingness +unyoke +unyoked +unyoking +unyoung +unyouthful +unyouthfully +unze +unzealous +unzealously +unzealousness +unzen +unzephyrlike +unzone +unzoned +up +upaisle +upaithric +upalley +upalong +upanishadic +upapurana +uparch +uparching +uparise +uparm +uparna +upas +upattic +upavenue +upbank +upbar +upbay +upbear +upbearer +upbeat +upbelch +upbelt +upbend +upbid +upbind +upblacken +upblast +upblaze +upblow +upboil +upbolster +upbolt +upboost +upborne +upbotch +upboulevard +upbound +upbrace +upbraid +upbraider +upbraiding +upbraidingly +upbray +upbreak +upbred +upbreed +upbreeze +upbrighten +upbrim +upbring +upbristle +upbroken +upbrook +upbrought +upbrow +upbubble +upbuild +upbuilder +upbulging +upbuoy +upbuoyance +upburn +upburst +upbuy +upcall +upcanal +upcanyon +upcarry +upcast +upcatch +upcaught +upchamber +upchannel +upchariot +upchimney +upchoke +upchuck +upcity +upclimb +upclose +upcloser +upcoast +upcock +upcoil +upcolumn +upcome +upcoming +upconjure +upcountry +upcourse +upcover +upcrane +upcrawl +upcreek +upcreep +upcrop +upcrowd +upcry +upcurl +upcurrent +upcurve +upcushion +upcut +updart +update +updeck +updelve +updive +updo +updome +updraft +updrag +updraw +updrink +updry +upeat +upend +upeygan +upfeed +upfield +upfill +upfingered +upflame +upflare +upflash +upflee +upflicker +upfling +upfloat +upflood +upflow +upflower +upflung +upfly +upfold +upfollow +upframe +upfurl +upgale +upgang +upgape +upgather +upgaze +upget +upgird +upgirt +upgive +upglean +upglide +upgo +upgorge +upgrade +upgrave +upgrow +upgrowth +upgully +upgush +uphand +uphang +upharbor +upharrow +uphasp +upheal +upheap +uphearted +upheaval +upheavalist +upheave +upheaven +upheld +uphelm +uphelya +upher +uphill +uphillward +uphoard +uphoist +uphold +upholden +upholder +upholster +upholstered +upholsterer +upholsteress +upholsterous +upholstery +upholsterydom +upholstress +uphung +uphurl +upisland +upjerk +upjet +upkeep +upkindle +upknell +upknit +upla +upladder +uplaid +uplake +upland +uplander +uplandish +uplane +uplay +uplead +upleap +upleg +uplick +uplift +upliftable +uplifted +upliftedly +upliftedness +uplifter +uplifting +upliftingly +upliftingness +upliftitis +upliftment +uplight +uplimb +uplimber +upline +uplock +uplong +uplook +uplooker +uploom +uploop +uplying +upmaking +upmast +upmix +upmost +upmount +upmountain +upmove +upness +upo +upon +uppard +uppent +upper +upperch +uppercut +upperer +upperest +upperhandism +uppermore +uppermost +uppers +uppertendom +uppile +upping +uppish +uppishly +uppishness +uppity +upplough +upplow +uppluck +uppoint +uppoise +uppop +uppour +uppowoc +upprick +upprop +uppuff +uppull +uppush +upquiver +upraisal +upraise +upraiser +upreach +uprear +uprein +uprend +uprender +uprest +uprestore +uprid +upridge +upright +uprighteous +uprighteously +uprighteousness +uprighting +uprightish +uprightly +uprightness +uprights +uprip +uprisal +uprise +uprisement +uprisen +upriser +uprising +uprist +uprive +upriver +uproad +uproar +uproariness +uproarious +uproariously +uproariousness +uproom +uproot +uprootal +uprooter +uprose +uprouse +uproute +uprun +uprush +upsaddle +upscale +upscrew +upscuddle +upseal +upseek +upseize +upsend +upset +upsetment +upsettable +upsettal +upsetted +upsetter +upsetting +upsettingly +upsey +upshaft +upshear +upsheath +upshoot +upshore +upshot +upshoulder +upshove +upshut +upside +upsides +upsighted +upsiloid +upsilon +upsilonism +upsit +upsitten +upsitting +upslant +upslip +upslope +upsmite +upsnatch +upsoak +upsoar +upsolve +upspeak +upspear +upspeed +upspew +upspin +upspire +upsplash +upspout +upspread +upspring +upsprinkle +upsprout +upspurt +upstaff +upstage +upstair +upstairs +upstamp +upstand +upstander +upstanding +upstare +upstart +upstartism +upstartle +upstartness +upstate +upstater +upstaunch +upstay +upsteal +upsteam +upstem +upstep +upstick +upstir +upstraight +upstream +upstreamward +upstreet +upstretch +upstrike +upstrive +upstroke +upstruggle +upsuck +upsun +upsup +upsurge +upsurgence +upswallow +upswarm +upsway +upsweep +upswell +upswing +uptable +uptake +uptaker +uptear +uptemper +uptend +upthrow +upthrust +upthunder +uptide +uptie +uptill +uptilt +uptorn +uptoss +uptower +uptown +uptowner +uptrace +uptrack +uptrail +uptrain +uptree +uptrend +uptrill +uptrunk +uptruss +uptube +uptuck +upturn +uptwined +uptwist +Upupa +Upupidae +upupoid +upvalley +upvomit +upwaft +upwall +upward +upwardly +upwardness +upwards +upwarp +upwax +upway +upways +upwell +upwent +upwheel +upwhelm +upwhir +upwhirl +upwind +upwith +upwork +upwound +upwrap +upwreathe +upwrench +upwring +upwrought +upyard +upyoke +ur +ura +urachal +urachovesical +urachus +uracil +uraemic +uraeus +Uragoga +Ural +ural +urali +Uralian +Uralic +uraline +uralite +uralitic +uralitization +uralitize +uralium +uramido +uramil +uramilic +uramino +Uran +uran +uranalysis +uranate +Urania +Uranian +uranic +Uranicentric +uranidine +uraniferous +uraniid +Uraniidae +uranin +uranine +uraninite +uranion +uraniscochasma +uraniscoplasty +uraniscoraphy +uraniscorrhaphy +uranism +uranist +uranite +uranitic +uranium +uranocircite +uranographer +uranographic +uranographical +uranographist +uranography +uranolatry +uranolite +uranological +uranology +uranometria +uranometrical +uranometry +uranophane +uranophotography +uranoplastic +uranoplasty +uranoplegia +uranorrhaphia +uranorrhaphy +uranoschisis +uranoschism +uranoscope +uranoscopia +uranoscopic +Uranoscopidae +Uranoscopus +uranoscopy +uranospathite +uranosphaerite +uranospinite +uranostaphyloplasty +uranostaphylorrhaphy +uranotantalite +uranothallite +uranothorite +uranotil +uranous +Uranus +uranyl +uranylic +urao +urare +urari +Urartaean +Urartic +urase +urataemia +urate +uratemia +uratic +uratoma +uratosis +uraturia +urazine +urazole +urbacity +urbainite +Urban +urban +urbane +urbanely +urbaneness +urbanism +Urbanist +urbanist +urbanite +urbanity +urbanization +urbanize +urbarial +urbian +urbic +Urbicolae +urbicolous +urbification +urbify +urbinate +urceiform +urceolar +urceolate +urceole +urceoli +Urceolina +urceolus +urceus +urchin +urchiness +urchinlike +urchinly +urd +urde +urdee +Urdu +ure +urea +ureal +ureameter +ureametry +urease +urechitin +urechitoxin +uredema +Uredinales +uredine +Uredineae +uredineal +uredineous +uredinia +uredinial +Urediniopsis +urediniospore +urediniosporic +uredinium +uredinoid +uredinologist +uredinology +uredinous +Uredo +uredo +uredosorus +uredospore +uredosporic +uredosporiferous +uredosporous +uredostage +ureic +ureid +ureide +ureido +uremia +uremic +Urena +urent +ureometer +ureometry +ureosecretory +uresis +uretal +ureter +ureteral +ureteralgia +uretercystoscope +ureterectasia +ureterectasis +ureterectomy +ureteric +ureteritis +ureterocele +ureterocervical +ureterocolostomy +ureterocystanastomosis +ureterocystoscope +ureterocystostomy +ureterodialysis +ureteroenteric +ureteroenterostomy +ureterogenital +ureterogram +ureterograph +ureterography +ureterointestinal +ureterolith +ureterolithiasis +ureterolithic +ureterolithotomy +ureterolysis +ureteronephrectomy +ureterophlegma +ureteroplasty +ureteroproctostomy +ureteropyelitis +ureteropyelogram +ureteropyelography +ureteropyelonephritis +ureteropyelostomy +ureteropyosis +ureteroradiography +ureterorectostomy +ureterorrhagia +ureterorrhaphy +ureterosalpingostomy +ureterosigmoidostomy +ureterostegnosis +ureterostenoma +ureterostenosis +ureterostoma +ureterostomy +ureterotomy +ureterouteral +ureterovaginal +ureterovesical +urethan +urethane +urethra +urethrae +urethragraph +urethral +urethralgia +urethrameter +urethrascope +urethratome +urethratresia +urethrectomy +urethremphraxis +urethreurynter +urethrism +urethritic +urethritis +urethroblennorrhea +urethrobulbar +urethrocele +urethrocystitis +urethrogenital +urethrogram +urethrograph +urethrometer +urethropenile +urethroperineal +urethrophyma +urethroplastic +urethroplasty +urethroprostatic +urethrorectal +urethrorrhagia +urethrorrhaphy +urethrorrhea +urethrorrhoea +urethroscope +urethroscopic +urethroscopical +urethroscopy +urethrosexual +urethrospasm +urethrostaxis +urethrostenosis +urethrostomy +urethrotome +urethrotomic +urethrotomy +urethrovaginal +urethrovesical +urethylan +uretic +ureylene +urf +urfirnis +urge +urgence +urgency +urgent +urgently +urgentness +urger +Urginea +urging +urgingly +Urgonian +urheen +Uri +Uria +Uriah +urial +Urian +uric +uricacidemia +uricaciduria +uricaemia +uricaemic +uricemia +uricemic +uricolysis +uricolytic +uridrosis +Uriel +urinaemia +urinal +urinalist +urinalysis +urinant +urinarium +urinary +urinate +urination +urinative +urinator +urine +urinemia +uriniferous +uriniparous +urinocryoscopy +urinogenital +urinogenitary +urinogenous +urinologist +urinology +urinomancy +urinometer +urinometric +urinometry +urinoscopic +urinoscopist +urinoscopy +urinose +urinosexual +urinous +urinousness +urite +urlar +urled +urling +urluch +urman +urn +urna +urnae +urnal +urnflower +urnful +urning +urningism +urnism +urnlike +urnmaker +Uro +uroacidimeter +uroazotometer +urobenzoic +urobilin +urobilinemia +urobilinogen +urobilinogenuria +urobilinuria +urocanic +urocele +Urocerata +urocerid +Uroceridae +urochloralic +urochord +Urochorda +urochordal +urochordate +urochrome +urochromogen +Urocoptidae +Urocoptis +urocyanogen +Urocyon +urocyst +urocystic +Urocystis +urocystitis +urodaeum +Urodela +urodelan +urodele +urodelous +urodialysis +urodynia +uroedema +uroerythrin +urofuscohematin +urogaster +urogastric +urogenic +urogenital +urogenitary +urogenous +uroglaucin +Uroglena +urogram +urography +urogravimeter +urohematin +urohyal +urolagnia +uroleucic +uroleucinic +urolith +urolithiasis +urolithic +urolithology +urologic +urological +urologist +urology +urolutein +urolytic +uromancy +uromantia +uromantist +Uromastix +uromelanin +uromelus +uromere +uromeric +urometer +Uromyces +Uromycladium +uronephrosis +uronic +uronology +uropatagium +Uropeltidae +urophanic +urophanous +urophein +Urophlyctis +urophthisis +uroplania +uropod +uropodal +uropodous +uropoetic +uropoiesis +uropoietic +uroporphyrin +uropsile +Uropsilus +uroptysis +Uropygi +uropygial +uropygium +uropyloric +urorosein +urorrhagia +urorrhea +urorubin +urosaccharometry +urosacral +uroschesis +uroscopic +uroscopist +uroscopy +urosepsis +uroseptic +urosis +urosomatic +urosome +urosomite +urosomitic +urostea +urostealith +urostegal +urostege +urostegite +urosteon +urosternite +urosthene +urosthenic +urostylar +urostyle +urotoxia +urotoxic +urotoxicity +urotoxin +urotoxy +uroxanate +uroxanic +uroxanthin +uroxin +urradhus +urrhodin +urrhodinic +Urs +Ursa +ursal +ursicidal +ursicide +Ursid +Ursidae +ursiform +ursigram +ursine +ursoid +ursolic +urson +ursone +ursuk +Ursula +Ursuline +Ursus +Urtica +urtica +Urticaceae +urticaceous +Urticales +urticant +urticaria +urticarial +urticarious +Urticastrum +urticate +urticating +urtication +urticose +urtite +Uru +urubu +urucu +urucuri +Uruguayan +uruisg +Urukuena +urunday +urus +urushi +urushic +urushinic +urushiol +urushiye +urva +us +usability +usable +usableness +usage +usager +usance +usar +usara +usaron +usation +use +used +usedly +usedness +usednt +usee +useful +usefullish +usefully +usefulness +usehold +useless +uselessly +uselessness +usent +user +ush +ushabti +ushabtiu +Ushak +Usheen +usher +usherance +usherdom +usherer +usheress +usherette +Usherian +usherian +usherism +usherless +ushership +usings +Usipetes +usitate +usitative +Uskara +Uskok +Usnea +usnea +Usneaceae +usneaceous +usneoid +usnic +usninic +Uspanteca +usque +usquebaugh +usself +ussels +usselven +ussingite +ust +Ustarana +uster +Ustilaginaceae +ustilaginaceous +Ustilaginales +ustilagineous +Ustilaginoidea +Ustilago +ustion +ustorious +ustulate +ustulation +Ustulina +usual +usualism +usually +usualness +usuary +usucapient +usucapion +usucapionary +usucapt +usucaptable +usucaption +usucaptor +usufruct +usufructuary +Usun +usure +usurer +usurerlike +usuress +usurious +usuriously +usuriousness +usurp +usurpation +usurpative +usurpatively +usurpatory +usurpature +usurpedly +usurper +usurpership +usurping +usurpingly +usurpment +usurpor +usurpress +usury +usward +uswards +ut +Uta +uta +Utah +Utahan +utahite +utai +utas +utch +utchy +Ute +utees +utensil +uteralgia +uterectomy +uteri +uterine +uteritis +uteroabdominal +uterocele +uterocervical +uterocystotomy +uterofixation +uterogestation +uterogram +uterography +uterointestinal +uterolith +uterology +uteromania +uterometer +uteroovarian +uteroparietal +uteropelvic +uteroperitoneal +uteropexia +uteropexy +uteroplacental +uteroplasty +uterosacral +uterosclerosis +uteroscope +uterotomy +uterotonic +uterotubal +uterovaginal +uteroventral +uterovesical +uterus +utfangenethef +utfangethef +utfangthef +utfangthief +utick +utile +utilitarian +utilitarianism +utilitarianist +utilitarianize +utilitarianly +utility +utilizable +utilization +utilize +utilizer +utinam +utmost +utmostness +Utopia +utopia +Utopian +utopian +utopianism +utopianist +Utopianize +Utopianizer +utopianizer +utopiast +utopism +utopist +utopistic +utopographer +Utraquism +utraquist +utraquistic +Utrecht +utricle +utricul +utricular +Utricularia +Utriculariaceae +utriculate +utriculiferous +utriculiform +utriculitis +utriculoid +utriculoplastic +utriculoplasty +utriculosaccular +utriculose +utriculus +utriform +utrubi +utrum +utsuk +utter +utterability +utterable +utterableness +utterance +utterancy +utterer +utterless +utterly +uttermost +utterness +utu +utum +uturuncu +uva +uval +uvalha +uvanite +uvarovite +uvate +uvea +uveal +uveitic +uveitis +Uvella +uveous +uvic +uvid +uviol +uvitic +uvitinic +uvito +uvitonic +uvrou +uvula +uvulae +uvular +Uvularia +uvularly +uvulitis +uvuloptosis +uvulotome +uvulotomy +uvver +uxorial +uxoriality +uxorially +uxoricidal +uxoricide +uxorious +uxoriously +uxoriousness +uzan +uzara +uzarin +uzaron +Uzbak +Uzbeg +Uzbek +V +v +vaagmer +vaalite +Vaalpens +vacabond +vacancy +vacant +vacanthearted +vacantheartedness +vacantly +vacantness +vacantry +vacatable +vacate +vacation +vacational +vacationer +vacationist +vacationless +vacatur +Vaccaria +vaccary +vaccenic +vaccicide +vaccigenous +vaccina +vaccinable +vaccinal +vaccinate +vaccination +vaccinationist +vaccinator +vaccinatory +vaccine +vaccinee +vaccinella +vaccinia +Vacciniaceae +vacciniaceous +vaccinial +vaccinifer +vacciniform +vacciniola +vaccinist +Vaccinium +vaccinium +vaccinization +vaccinogenic +vaccinogenous +vaccinoid +vaccinophobia +vaccinotherapy +vache +Vachellia +vachette +vacillancy +vacillant +vacillate +vacillating +vacillatingly +vacillation +vacillator +vacillatory +vacoa +vacona +vacoua +vacouf +vacual +vacuate +vacuation +vacuefy +vacuist +vacuity +vacuolar +vacuolary +vacuolate +vacuolated +vacuolation +vacuole +vacuolization +vacuome +vacuometer +vacuous +vacuously +vacuousness +vacuum +vacuuma +vacuumize +vade +Vadim +vadimonium +vadimony +vadium +vadose +vady +vag +vagabond +vagabondage +vagabondager +vagabondia +vagabondish +vagabondism +vagabondismus +vagabondize +vagabondizer +vagabondry +vagal +vagarian +vagarious +vagariously +vagarish +vagarisome +vagarist +vagaristic +vagarity +vagary +vagas +vage +vagiform +vagile +vagina +vaginal +vaginalectomy +vaginaless +vaginalitis +vaginant +vaginate +vaginated +vaginectomy +vaginervose +Vaginicola +vaginicoline +vaginicolous +vaginiferous +vaginipennate +vaginismus +vaginitis +vaginoabdominal +vaginocele +vaginodynia +vaginofixation +vaginolabial +vaginometer +vaginomycosis +vaginoperineal +vaginoperitoneal +vaginopexy +vaginoplasty +vaginoscope +vaginoscopy +vaginotome +vaginotomy +vaginovesical +vaginovulvar +vaginula +vaginulate +vaginule +vagitus +Vagnera +vagoaccessorius +vagodepressor +vagoglossopharyngeal +vagogram +vagolysis +vagosympathetic +vagotomize +vagotomy +vagotonia +vagotonic +vagotropic +vagotropism +vagrance +vagrancy +vagrant +vagrantism +vagrantize +vagrantlike +vagrantly +vagrantness +vagrate +vagrom +vague +vaguely +vagueness +vaguish +vaguity +vagulous +vagus +vahine +Vai +Vaidic +vail +vailable +vain +vainful +vainglorious +vaingloriously +vaingloriousness +vainglory +vainly +vainness +vair +vairagi +vaire +vairy +Vaishnava +Vaishnavism +vaivode +vajra +vajrasana +vakass +vakia +vakil +vakkaliga +Val +valance +valanced +valanche +valbellite +vale +valediction +valedictorian +valedictorily +valedictory +valence +Valencia +Valencian +valencianite +Valenciennes +valency +valent +Valentide +Valentin +Valentine +valentine +Valentinian +Valentinianism +valentinite +valeral +valeraldehyde +valeramide +valerate +Valeria +valerian +Valeriana +Valerianaceae +valerianaceous +Valerianales +valerianate +Valerianella +Valerianoides +valeric +Valerie +valerin +valerolactone +valerone +valeryl +valerylene +valet +valeta +valetage +valetdom +valethood +valetism +valetry +valetudinarian +valetudinarianism +valetudinariness +valetudinarist +valetudinarium +valetudinary +valeur +valeward +valgoid +valgus +valhall +Valhalla +Vali +vali +valiance +valiancy +valiant +valiantly +valiantness +valid +validate +validation +validatory +validification +validity +validly +validness +valine +valise +valiseful +valiship +Valkyr +Valkyria +Valkyrian +Valkyrie +vall +vallancy +vallar +vallary +vallate +vallated +vallation +vallecula +vallecular +valleculate +vallevarite +valley +valleyful +valleyite +valleylet +valleylike +valleyward +valleywise +vallicula +vallicular +vallidom +vallis +Valliscaulian +Vallisneria +Vallisneriaceae +vallisneriaceous +Vallombrosan +Vallota +vallum +Valmy +Valois +valonia +Valoniaceae +valoniaceous +valor +valorization +valorize +valorous +valorously +valorousness +Valsa +Valsaceae +Valsalvan +valse +valsoid +valuable +valuableness +valuably +valuate +valuation +valuational +valuator +value +valued +valueless +valuelessness +valuer +valuta +valva +valval +Valvata +valvate +Valvatidae +valve +valved +valveless +valvelet +valvelike +valveman +valviferous +valviform +valvotomy +valvula +valvular +valvulate +valvule +valvulitis +valvulotome +valvulotomy +valyl +valylene +vambrace +vambraced +vamfont +vammazsa +vamoose +vamp +vamped +vamper +vamphorn +vampire +vampireproof +vampiric +vampirish +vampirism +vampirize +vamplate +vampproof +Vampyrella +Vampyrellidae +Vampyrum +Van +van +vanadate +vanadiate +vanadic +vanadiferous +vanadinite +vanadium +vanadosilicate +vanadous +vanadyl +Vanaheim +vanaprastha +Vance +vancourier +Vancouveria +Vanda +Vandal +Vandalic +vandalish +vandalism +vandalistic +vandalization +vandalize +vandalroot +Vandemonian +Vandemonianism +Vandiemenian +Vandyke +vane +vaned +vaneless +vanelike +Vanellus +Vanessa +vanessian +vanfoss +vang +vangee +vangeli +vanglo +vanguard +Vanguardist +Vangueria +vanilla +vanillal +vanillaldehyde +vanillate +vanille +vanillery +vanillic +vanillin +vanillinic +vanillism +vanilloes +vanillon +vanilloyl +vanillyl +Vanir +vanish +vanisher +vanishing +vanishingly +vanishment +Vanist +vanitarianism +vanitied +vanity +vanjarrah +vanman +vanmost +Vannai +vanner +vannerman +vannet +Vannic +vanquish +vanquishable +vanquisher +vanquishment +vansire +vantage +vantageless +vantbrace +vantbrass +vanward +vapid +vapidism +vapidity +vapidly +vapidness +vapocauterization +vapographic +vapography +vapor +vaporability +vaporable +vaporarium +vaporary +vaporate +vapored +vaporer +vaporescence +vaporescent +vaporiferous +vaporiferousness +vaporific +vaporiform +vaporimeter +vaporing +vaporingly +vaporish +vaporishness +vaporium +vaporizable +vaporization +vaporize +vaporizer +vaporless +vaporlike +vaporograph +vaporographic +vaporose +vaporoseness +vaporosity +vaporous +vaporously +vaporousness +vaportight +vapory +vapulary +vapulate +vapulation +vapulatory +vara +varahan +varan +Varanger +Varangi +Varangian +varanid +Varanidae +Varanoid +Varanus +Varda +vardapet +vardy +vare +varec +vareheaded +vareuse +vargueno +vari +variability +variable +variableness +variably +Variag +variance +variancy +variant +variate +variation +variational +variationist +variatious +variative +variatively +variator +varical +varicated +varication +varicella +varicellar +varicellate +varicellation +varicelliform +varicelloid +varicellous +varices +variciform +varicoblepharon +varicocele +varicoid +varicolored +varicolorous +varicose +varicosed +varicoseness +varicosis +varicosity +varicotomy +varicula +varied +variedly +variegate +variegated +variegation +variegator +varier +varietal +varietally +varietism +varietist +variety +variform +variformed +variformity +variformly +varigradation +variocoupler +variola +variolar +Variolaria +variolate +variolation +variole +variolic +varioliform +variolite +variolitic +variolitization +variolization +varioloid +variolous +variolovaccine +variolovaccinia +variometer +variorum +variotinted +various +variously +variousness +variscite +varisse +varix +varlet +varletaille +varletess +varletry +varletto +varment +varna +varnashrama +varnish +varnished +varnisher +varnishing +varnishlike +varnishment +varnishy +varnpliktige +varnsingite +Varolian +Varronia +Varronian +varsha +varsity +Varsovian +varsoviana +Varuna +varus +varve +varved +vary +varyingly +vas +Vasa +vasa +vasal +Vascons +vascular +vascularity +vascularization +vascularize +vascularly +vasculated +vasculature +vasculiferous +vasculiform +vasculitis +vasculogenesis +vasculolymphatic +vasculomotor +vasculose +vasculum +vase +vasectomize +vasectomy +vaseful +vaselet +vaselike +Vaseline +vasemaker +vasemaking +vasewise +vasework +vashegyite +vasicentric +vasicine +vasifactive +vasiferous +vasiform +vasoconstricting +vasoconstriction +vasoconstrictive +vasoconstrictor +vasocorona +vasodentinal +vasodentine +vasodilatation +vasodilatin +vasodilating +vasodilation +vasodilator +vasoepididymostomy +vasofactive +vasoformative +vasoganglion +vasohypertonic +vasohypotonic +vasoinhibitor +vasoinhibitory +vasoligation +vasoligature +vasomotion +vasomotor +vasomotorial +vasomotoric +vasomotory +vasoneurosis +vasoparesis +vasopressor +vasopuncture +vasoreflex +vasorrhaphy +vasosection +vasospasm +vasospastic +vasostimulant +vasostomy +vasotomy +vasotonic +vasotribe +vasotripsy +vasotrophic +vasovesiculectomy +vasquine +vassal +vassalage +vassaldom +vassaless +vassalic +vassalism +vassality +vassalize +vassalless +vassalry +vassalship +Vassos +vast +vastate +vastation +vastidity +vastily +vastiness +vastitude +vastity +vastly +vastness +vasty +vasu +Vasudeva +Vasundhara +vat +Vateria +vatful +vatic +vatically +Vatican +vaticanal +vaticanic +vaticanical +Vaticanism +Vaticanist +Vaticanization +Vaticanize +vaticide +vaticinal +vaticinant +vaticinate +vaticination +vaticinator +vaticinatory +vaticinatress +vaticinatrix +vatmaker +vatmaking +vatman +Vatteluttu +vatter +vau +Vaucheria +Vaucheriaceae +vaucheriaceous +vaudeville +vaudevillian +vaudevillist +Vaudism +Vaudois +vaudy +Vaughn +vaugnerite +vault +vaulted +vaultedly +vaulter +vaulting +vaultlike +vaulty +vaunt +vauntage +vaunted +vaunter +vauntery +vauntful +vauntiness +vaunting +vauntingly +vauntmure +vaunty +vauquelinite +Vauxhall +Vauxhallian +vauxite +vavasor +vavasory +vaward +Vayu +Vazimba +Veadar +veal +vealer +vealiness +veallike +vealskin +vealy +vectigal +vection +vectis +vectograph +vectographic +vector +vectorial +vectorially +vecture +Veda +Vedaic +Vedaism +Vedalia +vedana +Vedanga +Vedanta +Vedantic +Vedantism +Vedantist +Vedda +Veddoid +vedette +Vedic +vedika +Vediovis +Vedism +Vedist +vedro +Veduis +veduis +vee +veen +veep +veer +veerable +veeringly +veery +Vega +vegasite +vegeculture +vegetability +vegetable +vegetablelike +vegetablewise +vegetablize +vegetably +vegetal +vegetalcule +vegetality +vegetant +vegetarian +vegetarianism +vegetate +vegetation +vegetational +vegetationless +vegetative +vegetatively +vegetativeness +vegete +vegeteness +vegetism +vegetive +vegetivorous +vegetoalkali +vegetoalkaline +vegetoalkaloid +vegetoanimal +vegetobituminous +vegetocarbonaceous +vegetomineral +vehemence +vehemency +vehement +vehemently +vehicle +vehicular +vehicularly +vehiculary +vehiculate +vehiculation +vehiculatory +Vehmic +vei +veigle +veil +veiled +veiledly +veiledness +veiler +veiling +veilless +veillike +veilmaker +veilmaking +Veiltail +veily +vein +veinage +veinal +veinbanding +veined +veiner +veinery +veininess +veining +veinless +veinlet +veinous +veinstone +veinstuff +veinule +veinulet +veinwise +veinwork +veiny +Vejoces +vejoces +Vejovis +Vejoz +vela +velal +velamen +velamentous +velamentum +velar +velardenite +velaric +velarium +velarize +velary +velate +velated +velation +velatura +Velchanos +veldcraft +veldman +veldschoen +veldt +veldtschoen +Velella +velellidous +velic +veliferous +veliform +veliger +veligerous +Velika +velitation +vell +vellala +velleda +velleity +vellicate +vellication +vellicative +vellinch +vellon +vellosine +Vellozia +Velloziaceae +velloziaceous +vellum +vellumy +velo +velociman +velocimeter +velocious +velociously +velocipedal +velocipede +velocipedean +velocipedic +velocitous +velocity +velodrome +velometer +velours +veloutine +velte +velum +velumen +velure +Velutina +velutinous +velveret +velvet +velvetbreast +velveted +velveteen +velveteened +velvetiness +velveting +velvetleaf +velvetlike +velvetry +velvetseed +velvetweed +velvetwork +velvety +venada +venal +venality +venalization +venalize +venally +venalness +Venantes +venanzite +venatic +venatical +venatically +venation +venational +venator +venatorial +venatorious +venatory +vencola +Vend +vend +vendace +Vendean +vendee +vender +vendetta +vendettist +vendibility +vendible +vendibleness +vendibly +vendicate +Vendidad +vending +venditate +venditation +vendition +venditor +vendor +vendue +Vened +Venedotian +veneer +veneerer +veneering +venefical +veneficious +veneficness +veneficous +venenate +venenation +venene +veneniferous +venenific +venenosalivary +venenous +venenousness +venepuncture +venerability +venerable +venerableness +venerably +Veneracea +veneracean +veneraceous +veneral +Veneralia +venerance +venerant +venerate +veneration +venerational +venerative +veneratively +venerativeness +venerator +venereal +venerealness +venereologist +venereology +venerer +Veneres +venerial +Veneridae +veneriform +venery +venesect +venesection +venesector +venesia +Venetes +Veneti +Venetian +Venetianed +Venetic +venezolano +Venezuelan +vengeable +vengeance +vengeant +vengeful +vengefully +vengefulness +vengeously +venger +venial +veniality +venially +venialness +Venice +venie +venin +veniplex +venipuncture +venireman +venison +venisonivorous +venisonlike +venisuture +Venite +Venizelist +Venkata +vennel +venner +venoatrial +venoauricular +venom +venomed +venomer +venomization +venomize +venomly +venomness +venomosalivary +venomous +venomously +venomousness +venomproof +venomsome +venomy +venosal +venosclerosis +venose +venosinal +venosity +venostasis +venous +venously +venousness +vent +ventage +ventail +venter +Ventersdorp +venthole +ventiduct +ventifact +ventil +ventilable +ventilagin +ventilate +ventilating +ventilation +ventilative +ventilator +ventilatory +ventless +ventometer +ventose +ventoseness +ventosity +ventpiece +ventrad +ventral +ventrally +ventralmost +ventralward +ventric +ventricle +ventricolumna +ventricolumnar +ventricornu +ventricornual +ventricose +ventricoseness +ventricosity +ventricous +ventricular +ventricularis +ventriculite +Ventriculites +ventriculitic +Ventriculitidae +ventriculogram +ventriculography +ventriculoscopy +ventriculose +ventriculous +ventriculus +ventricumbent +ventriduct +ventrifixation +ventrilateral +ventrilocution +ventriloqual +ventriloqually +ventriloque +ventriloquial +ventriloquially +ventriloquism +ventriloquist +ventriloquistic +ventriloquize +ventriloquous +ventriloquously +ventriloquy +ventrimesal +ventrimeson +ventrine +ventripotency +ventripotent +ventripotential +ventripyramid +ventroaxial +ventroaxillary +ventrocaudal +ventrocystorrhaphy +ventrodorsad +ventrodorsal +ventrodorsally +ventrofixation +ventrohysteropexy +ventroinguinal +ventrolateral +ventrolaterally +ventromedial +ventromedian +ventromesal +ventromesial +ventromyel +ventroposterior +ventroptosia +ventroptosis +ventroscopy +ventrose +ventrosity +ventrosuspension +ventrotomy +venture +venturer +venturesome +venturesomely +venturesomeness +Venturia +venturine +venturous +venturously +venturousness +venue +venula +venular +venule +venulose +Venus +Venusian +venust +Venutian +venville +Veps +Vepse +Vepsish +vera +veracious +veraciously +veraciousness +veracity +veranda +verandaed +verascope +veratral +veratralbine +veratraldehyde +veratrate +veratria +veratric +veratridine +veratrine +veratrinize +veratrize +veratroidine +veratrole +veratroyl +Veratrum +veratryl +veratrylidene +verb +verbal +verbalism +verbalist +verbality +verbalization +verbalize +verbalizer +verbally +verbarian +verbarium +verbasco +verbascose +Verbascum +verbate +verbatim +verbena +Verbenaceae +verbenaceous +verbenalike +verbenalin +Verbenarius +verbenate +verbene +verbenone +verberate +verberation +verberative +Verbesina +verbiage +verbicide +verbiculture +verbid +verbification +verbify +verbigerate +verbigeration +verbigerative +verbile +verbless +verbolatry +verbomania +verbomaniac +verbomotor +verbose +verbosely +verboseness +verbosity +verbous +verby +verchok +verd +verdancy +verdant +verdantly +verdantness +verdea +verdelho +verderer +verderership +verdet +verdict +verdigris +verdigrisy +verdin +verditer +verdoy +verdugoship +verdun +verdure +verdured +verdureless +verdurous +verdurousness +verecund +verecundity +verecundness +verek +veretilliform +Veretillum +veretillum +verge +vergeboard +vergence +vergency +vergent +vergentness +verger +vergeress +vergerism +vergerless +vergership +vergery +vergi +vergiform +Vergilianism +verglas +vergobret +veri +veridic +veridical +veridicality +veridically +veridicalness +veridicous +veridity +verifiability +verifiable +verifiableness +verifiably +verificate +verification +verificative +verificatory +verifier +verify +verily +verine +verisimilar +verisimilarly +verisimilitude +verisimilitudinous +verisimility +verism +verist +veristic +veritability +veritable +veritableness +veritably +verite +veritism +veritist +veritistic +verity +verjuice +vermeil +vermeologist +vermeology +Vermes +vermetid +Vermetidae +vermetidae +Vermetus +vermian +vermicelli +vermicidal +vermicide +vermicious +vermicle +vermicular +Vermicularia +vermicularly +vermiculate +vermiculated +vermiculation +vermicule +vermiculite +vermiculose +vermiculosity +vermiculous +vermiform +Vermiformia +vermiformis +vermiformity +vermiformous +vermifugal +vermifuge +vermifugous +vermigerous +vermigrade +Vermilingues +Vermilinguia +vermilinguial +vermilion +vermilionette +vermilionize +vermin +verminal +verminate +vermination +verminer +verminicidal +verminicide +verminiferous +verminlike +verminly +verminosis +verminous +verminously +verminousness +verminproof +verminy +vermiparous +vermiparousness +vermis +vermivorous +vermivorousness +vermix +Vermont +Vermonter +Vermontese +vermorel +vermouth +Vern +vernacle +vernacular +vernacularism +vernacularist +vernacularity +vernacularization +vernacularize +vernacularly +vernacularness +vernaculate +vernal +vernality +vernalization +vernalize +vernally +vernant +vernation +vernicose +vernier +vernile +vernility +vernin +vernine +vernition +Vernon +Vernonia +vernoniaceous +Vernonieae +vernonin +Verona +Veronal +veronalism +Veronese +Veronica +Veronicella +Veronicellidae +Verpa +verre +verrel +verriculate +verriculated +verricule +verruca +verrucano +Verrucaria +Verrucariaceae +verrucariaceous +verrucarioid +verrucated +verruciferous +verruciform +verrucose +verrucoseness +verrucosis +verrucosity +verrucous +verruculose +verruga +versability +versable +versableness +versal +versant +versate +versatile +versatilely +versatileness +versatility +versation +versative +verse +versecraft +versed +verseless +verselet +versemaker +versemaking +verseman +versemanship +versemonger +versemongering +versemongery +verser +versesmith +verset +versette +verseward +versewright +versicle +versicler +versicolor +versicolorate +versicolored +versicolorous +versicular +versicule +versifiable +versifiaster +versification +versificator +versificatory +versificatrix +versifier +versiform +versify +versiloquy +versine +version +versional +versioner +versionist +versionize +versipel +verso +versor +verst +versta +versual +versus +vert +vertebra +vertebrae +vertebral +vertebraless +vertebrally +Vertebraria +vertebrarium +vertebrarterial +Vertebrata +vertebrate +vertebrated +vertebration +vertebre +vertebrectomy +vertebriform +vertebroarterial +vertebrobasilar +vertebrochondral +vertebrocostal +vertebrodymus +vertebrofemoral +vertebroiliac +vertebromammary +vertebrosacral +vertebrosternal +vertex +vertibility +vertible +vertibleness +vertical +verticalism +verticality +vertically +verticalness +vertices +verticil +verticillary +verticillaster +verticillastrate +verticillate +verticillated +verticillately +verticillation +verticilliaceous +verticilliose +Verticillium +verticillus +verticity +verticomental +verticordious +vertiginate +vertigines +vertiginous +vertigo +vertilinear +vertimeter +Vertumnus +Verulamian +veruled +verumontanum +vervain +vervainlike +verve +vervecine +vervel +verveled +vervelle +vervenia +vervet +very +Vesalian +vesania +vesanic +vesbite +vesicae +vesical +vesicant +vesicate +vesication +vesicatory +vesicle +vesicoabdominal +vesicocavernous +vesicocele +vesicocervical +vesicoclysis +vesicofixation +vesicointestinal +vesicoprostatic +vesicopubic +vesicorectal +vesicosigmoid +vesicospinal +vesicotomy +vesicovaginal +vesicular +Vesicularia +vesicularly +vesiculary +vesiculase +Vesiculata +Vesiculatae +vesiculate +vesiculation +vesicule +vesiculectomy +vesiculiferous +vesiculiform +vesiculigerous +vesiculitis +vesiculobronchial +vesiculocavernous +vesiculopustular +vesiculose +vesiculotomy +vesiculotubular +vesiculotympanic +vesiculotympanitic +vesiculous +vesiculus +vesicupapular +veskit +Vespa +vespacide +vespal +vesper +vesperal +vesperian +vespering +vespers +vespertide +vespertilian +Vespertilio +vespertilio +Vespertiliones +vespertilionid +Vespertilionidae +Vespertilioninae +vespertilionine +vespertinal +vespertine +vespery +vespiary +vespid +Vespidae +vespiform +Vespina +vespine +vespoid +Vespoidea +vessel +vesseled +vesselful +vessignon +vest +Vesta +vestal +Vestalia +vestalia +vestalship +Vestas +vestee +vester +vestiarian +vestiarium +vestiary +vestibula +vestibular +vestibulary +vestibulate +vestibule +vestibuled +vestibulospinal +vestibulum +vestige +vestigial +vestigially +Vestigian +vestigiary +vestigium +vestiment +vestimental +vestimentary +vesting +Vestini +Vestinian +vestiture +vestlet +vestment +vestmental +vestmented +vestral +vestralization +vestrical +vestrification +vestrify +vestry +vestrydom +vestryhood +vestryish +vestryism +vestryize +vestryman +vestrymanly +vestrymanship +vestuary +vestural +vesture +vesturer +Vesuvian +vesuvian +vesuvianite +vesuviate +vesuvite +vesuvius +veszelyite +vet +veta +vetanda +vetch +vetchling +vetchy +veteran +veterancy +veteraness +veteranize +veterinarian +veterinarianism +veterinary +vetitive +vetivene +vetivenol +vetiver +Vetiveria +vetiveria +vetivert +vetkousie +veto +vetoer +vetoism +vetoist +vetoistic +vetoistical +vetust +vetusty +veuglaire +veuve +vex +vexable +vexation +vexatious +vexatiously +vexatiousness +vexatory +vexed +vexedly +vexedness +vexer +vexful +vexil +vexillar +vexillarious +vexillary +vexillate +vexillation +vexillum +vexingly +vexingness +vext +via +viability +viable +viaduct +viaggiatory +viagram +viagraph +viajaca +vial +vialful +vialmaker +vialmaking +vialogue +viameter +viand +viander +viatic +viatica +viatical +viaticum +viatometer +viator +viatorial +viatorially +vibetoite +vibex +vibgyor +vibix +vibracular +vibracularium +vibraculoid +vibraculum +vibrance +vibrancy +vibrant +vibrantly +vibraphone +vibrate +vibratile +vibratility +vibrating +vibratingly +vibration +vibrational +vibrationless +vibratiuncle +vibratiunculation +vibrative +vibrato +vibrator +vibratory +Vibrio +vibrioid +vibrion +vibrionic +vibrissa +vibrissae +vibrissal +vibrograph +vibromassage +vibrometer +vibromotive +vibronic +vibrophone +vibroscope +vibroscopic +vibrotherapeutics +viburnic +viburnin +Viburnum +Vic +vicar +vicarage +vicarate +vicaress +vicarial +vicarian +vicarianism +vicariate +vicariateship +vicarious +vicariously +vicariousness +vicarly +vicarship +Vice +vice +vicecomes +vicecomital +vicegeral +vicegerency +vicegerent +vicegerentship +viceless +vicelike +vicenary +vicennial +viceregal +viceregally +vicereine +viceroy +viceroyal +viceroyalty +viceroydom +viceroyship +vicety +viceversally +Vichyite +vichyssoise +Vicia +vicianin +vicianose +vicilin +vicinage +vicinal +vicine +vicinity +viciosity +vicious +viciously +viciousness +vicissitous +vicissitude +vicissitudinary +vicissitudinous +vicissitudinousness +Vick +Vicki +Vickie +Vicky +vicoite +vicontiel +victim +victimhood +victimizable +victimization +victimize +victimizer +victless +Victor +victor +victordom +victorfish +Victoria +Victorian +Victorianism +Victorianize +Victorianly +victoriate +victoriatus +victorine +victorious +victoriously +victoriousness +victorium +victory +victoryless +victress +victrix +Victrola +victrola +victual +victualage +victualer +victualing +victuallership +victualless +victualry +victuals +vicuna +Viddhal +viddui +videndum +video +videogenic +vidette +Vidhyanath +Vidian +vidonia +vidry +Vidua +viduage +vidual +vidually +viduate +viduated +viduation +Viduinae +viduine +viduity +viduous +vidya +vie +vielle +Vienna +Viennese +vier +vierling +viertel +viertelein +Vietminh +Vietnamese +view +viewable +viewably +viewer +viewiness +viewless +viewlessly +viewly +viewpoint +viewsome +viewster +viewworthy +viewy +vifda +viga +vigentennial +vigesimal +vigesimation +vigia +vigil +vigilance +vigilancy +vigilant +vigilante +vigilantism +vigilantly +vigilantness +vigilate +vigilation +vigintiangular +vigneron +vignette +vignetter +vignettist +vignin +vigonia +vigor +vigorist +vigorless +vigorous +vigorously +vigorousness +vihara +vihuela +vijao +Vijay +viking +vikingism +vikinglike +vikingship +vila +vilayet +vile +vilehearted +Vilela +vilely +vileness +Vilhelm +Vili +vilicate +vilification +vilifier +vilify +vilifyingly +vilipend +vilipender +vilipenditory +vility +vill +villa +villadom +villaette +village +villageful +villagehood +villageless +villagelet +villagelike +villageous +villager +villageress +villagery +villaget +villageward +villagey +villagism +villain +villainage +villaindom +villainess +villainist +villainous +villainously +villainousness +villainproof +villainy +villakin +villaless +villalike +villanage +villanella +villanelle +villanette +villanous +villanously +Villanova +Villanovan +villar +villate +villatic +ville +villein +villeinage +villeiness +villeinhold +villenage +villiaumite +villiferous +villiform +villiplacental +Villiplacentalia +villitis +villoid +villose +villosity +villous +villously +villus +vim +vimana +vimen +vimful +Viminal +viminal +vimineous +vina +vinaceous +vinaconic +vinage +vinagron +vinaigrette +vinaigretted +vinaigrier +vinaigrous +vinal +Vinalia +vinasse +vinata +Vince +Vincent +vincent +Vincentian +Vincenzo +Vincetoxicum +vincetoxin +vincibility +vincible +vincibleness +vincibly +vincular +vinculate +vinculation +vinculum +Vindelici +vindemial +vindemiate +vindemiation +vindemiatory +Vindemiatrix +vindex +vindhyan +vindicability +vindicable +vindicableness +vindicably +vindicate +vindication +vindicative +vindicatively +vindicativeness +vindicator +vindicatorily +vindicatorship +vindicatory +vindicatress +vindictive +vindictively +vindictiveness +vindictivolence +vindresser +vine +vinea +vineal +vineatic +vined +vinegar +vinegarer +vinegarette +vinegarish +vinegarist +vinegarroon +vinegarweed +vinegary +vinegerone +vinegrower +vineity +vineland +vineless +vinelet +vinelike +viner +vinery +vinestalk +vinewise +vineyard +Vineyarder +vineyarding +vineyardist +vingerhoed +Vingolf +vinhatico +vinic +vinicultural +viniculture +viniculturist +vinifera +viniferous +vinification +vinificator +Vinland +vinny +vino +vinoacetous +Vinod +vinolence +vinolent +vinologist +vinology +vinometer +vinomethylic +vinose +vinosity +vinosulphureous +vinous +vinously +vinousness +vinquish +vint +vinta +vintage +vintager +vintaging +vintem +vintener +vintlite +vintner +vintneress +vintnership +vintnery +vintress +vintry +viny +vinyl +vinylbenzene +vinylene +vinylic +vinylidene +viol +viola +violability +violable +violableness +violably +Violaceae +violacean +violaceous +violaceously +violal +Violales +violanin +violaquercitrin +violate +violater +violation +violational +violative +violator +violatory +violature +violence +violent +violently +violentness +violer +violescent +violet +violetish +violetlike +violette +violetwise +violety +violin +violina +violine +violinette +violinist +violinistic +violinlike +violinmaker +violinmaking +violist +violmaker +violmaking +violon +violoncellist +violoncello +violone +violotta +violuric +viosterol +Vip +viper +Vipera +viperan +viperess +viperfish +viperian +viperid +Viperidae +viperiform +Viperina +Viperinae +viperine +viperish +viperishly +viperlike +viperling +viperoid +Viperoidea +viperous +viperously +viperousness +vipery +vipolitic +vipresident +viqueen +Vira +viragin +viraginian +viraginity +viraginous +virago +viragoish +viragolike +viragoship +viral +Virales +Virbius +vire +virelay +viremia +viremic +virent +vireo +vireonine +virescence +virescent +virga +virgal +virgate +virgated +virgater +virgation +virgilia +Virgilism +virgin +virginal +Virginale +virginalist +virginality +virginally +virgineous +virginhead +Virginia +Virginian +Virginid +virginitis +virginity +virginityship +virginium +virginlike +virginly +virginship +Virgo +virgula +virgular +Virgularia +virgularian +Virgulariidae +virgulate +virgule +virgultum +virial +viricide +virid +viridene +viridescence +viridescent +viridian +viridigenous +viridine +viridite +viridity +virific +virify +virile +virilely +virileness +virilescence +virilescent +virilify +viriliously +virilism +virilist +virility +viripotent +viritrate +virl +virole +viroled +virological +virologist +virology +viron +virose +virosis +virous +virtu +virtual +virtualism +virtualist +virtuality +virtualize +virtually +virtue +virtued +virtuefy +virtuelessness +virtueproof +virtuless +virtuosa +virtuose +virtuosi +virtuosic +virtuosity +virtuoso +virtuosoship +virtuous +virtuouslike +virtuously +virtuousness +virucidal +virucide +viruela +virulence +virulency +virulent +virulented +virulently +virulentness +viruliferous +virus +viruscidal +viruscide +virusemic +vis +visa +visage +visaged +visagraph +visarga +Visaya +Visayan +viscacha +viscera +visceral +visceralgia +viscerally +viscerate +visceration +visceripericardial +visceroinhibitory +visceromotor +visceroparietal +visceroperitioneal +visceropleural +visceroptosis +visceroptotic +viscerosensory +visceroskeletal +viscerosomatic +viscerotomy +viscerotonia +viscerotonic +viscerotrophic +viscerotropic +viscerous +viscid +viscidity +viscidize +viscidly +viscidness +viscidulous +viscin +viscoidal +viscolize +viscometer +viscometrical +viscometrically +viscometry +viscontal +viscoscope +viscose +viscosimeter +viscosimetry +viscosity +viscount +viscountcy +viscountess +viscountship +viscounty +viscous +viscously +viscousness +viscus +vise +viseman +Vishal +Vishnavite +Vishnu +Vishnuism +Vishnuite +Vishnuvite +visibility +visibilize +visible +visibleness +visibly +visie +Visigoth +Visigothic +visile +vision +visional +visionally +visionarily +visionariness +visionary +visioned +visioner +visionic +visionist +visionize +visionless +visionlike +visionmonger +visionproof +visit +visita +visitable +Visitandine +visitant +visitation +visitational +visitative +visitator +visitatorial +visite +visitee +visiter +visiting +visitment +visitor +visitoress +visitorial +visitorship +visitress +visitrix +visive +visne +vison +visor +visorless +visorlike +vista +vistaed +vistal +vistaless +vistamente +Vistlik +visto +Vistulian +visual +visualist +visuality +visualization +visualize +visualizer +visually +visuoauditory +visuokinesthetic +visuometer +visuopsychic +visuosensory +vita +Vitaceae +Vitaglass +vital +vitalic +vitalism +vitalist +vitalistic +vitalistically +vitality +vitalization +vitalize +vitalizer +vitalizing +vitalizingly +Vitallium +vitally +vitalness +vitals +vitamer +vitameric +vitamin +vitaminic +vitaminize +vitaminology +vitapath +vitapathy +vitaphone +vitascope +vitascopic +vitasti +vitativeness +vitellarian +vitellarium +vitellary +vitellicle +vitelliferous +vitelligenous +vitelligerous +vitellin +vitelline +vitellogene +vitellogenous +vitellose +vitellus +viterbite +Viti +vitiable +vitiate +vitiated +vitiation +vitiator +viticetum +viticulose +viticultural +viticulture +viticulturer +viticulturist +vitiferous +vitiliginous +vitiligo +vitiligoidea +vitiosity +Vitis +vitium +vitochemic +vitochemical +vitrage +vitrail +vitrailed +vitrailist +vitrain +vitraux +vitreal +vitrean +vitrella +vitremyte +vitreodentinal +vitreodentine +vitreoelectric +vitreosity +vitreous +vitreouslike +vitreously +vitreousness +vitrescence +vitrescency +vitrescent +vitrescibility +vitrescible +vitreum +vitric +vitrics +vitrifaction +vitrifacture +vitrifiability +vitrifiable +vitrification +vitriform +vitrify +Vitrina +vitrine +vitrinoid +vitriol +vitriolate +vitriolation +vitriolic +vitrioline +vitriolizable +vitriolization +vitriolize +vitriolizer +vitrite +vitrobasalt +vitrophyre +vitrophyric +vitrotype +vitrous +Vitruvian +Vitruvianism +vitta +vittate +vitular +vituline +vituperable +vituperate +vituperation +vituperative +vituperatively +vituperator +vituperatory +vituperious +viuva +viva +vivacious +vivaciously +vivaciousness +vivacity +vivandiere +vivarium +vivary +vivax +vive +Vivek +vively +vivency +viver +Viverridae +viverriform +Viverrinae +viverrine +vivers +vives +vivianite +vivicremation +vivid +vividialysis +vividiffusion +vividissection +vividity +vividly +vividness +vivific +vivificate +vivification +vivificative +vivificator +vivifier +vivify +viviparism +viviparity +viviparous +viviparously +viviparousness +vivipary +viviperfuse +vivisect +vivisection +vivisectional +vivisectionally +vivisectionist +vivisective +vivisector +vivisectorium +vivisepulture +vixen +vixenish +vixenishly +vixenishness +vixenlike +vixenly +vizard +vizarded +vizardless +vizardlike +vizardmonger +vizier +vizierate +viziercraft +vizierial +viziership +vizircraft +Vlach +Vladimir +Vladislav +vlei +voar +vocability +vocable +vocably +vocabular +vocabularian +vocabularied +vocabulary +vocabulation +vocabulist +vocal +vocalic +vocalion +vocalise +vocalism +vocalist +vocalistic +vocality +vocalization +vocalize +vocalizer +vocaller +vocally +vocalness +vocate +vocation +vocational +vocationalism +vocationalization +vocationalize +vocationally +vocative +vocatively +Vochysiaceae +vochysiaceous +vocicultural +vociferance +vociferant +vociferate +vociferation +vociferative +vociferator +vociferize +vociferosity +vociferous +vociferously +vociferousness +vocification +vocimotor +vocular +vocule +Vod +vodka +voe +voet +voeten +Voetian +vog +vogesite +voglite +vogue +voguey +voguish +Vogul +voice +voiced +voiceful +voicefulness +voiceless +voicelessly +voicelessness +voicelet +voicelike +voicer +voicing +void +voidable +voidableness +voidance +voided +voidee +voider +voiding +voidless +voidly +voidness +voile +voiturette +voivode +voivodeship +vol +volable +volage +Volans +volant +volantly +Volapuk +Volapuker +Volapukism +Volapukist +volar +volata +volatic +volatile +volatilely +volatileness +volatility +volatilizable +volatilization +volatilize +volatilizer +volation +volational +volborthite +Volcae +volcan +Volcanalia +volcanian +volcanic +volcanically +volcanicity +volcanism +volcanist +volcanite +volcanity +volcanization +volcanize +volcano +volcanoism +volcanological +volcanologist +volcanologize +volcanology +Volcanus +vole +volemitol +volency +volent +volently +volery +volet +volhynite +volipresence +volipresent +volitant +volitate +volitation +volitational +volitiency +volitient +volition +volitional +volitionalist +volitionality +volitionally +volitionary +volitionate +volitionless +volitive +volitorial +Volkerwanderung +volley +volleyball +volleyer +volleying +volleyingly +volost +volplane +volplanist +Volsci +Volscian +volsella +volsellum +Volstead +Volsteadism +volt +Volta +voltaelectric +voltaelectricity +voltaelectrometer +voltaelectrometric +voltage +voltagraphy +voltaic +Voltairian +Voltairianize +Voltairish +Voltairism +voltaism +voltaite +voltameter +voltametric +voltammeter +voltaplast +voltatype +voltinism +voltivity +voltize +voltmeter +voltzite +volubilate +volubility +voluble +volubleness +volubly +volucrine +volume +volumed +volumenometer +volumenometry +volumescope +volumeter +volumetric +volumetrical +volumetrically +volumetry +volumette +voluminal +voluminosity +voluminous +voluminously +voluminousness +volumist +volumometer +volumometrical +volumometry +voluntariate +voluntarily +voluntariness +voluntarism +voluntarist +voluntaristic +voluntarity +voluntary +voluntaryism +voluntaryist +voluntative +volunteer +volunteerism +volunteerly +volunteership +volupt +voluptary +voluptas +voluptuarian +voluptuary +voluptuate +voluptuosity +voluptuous +voluptuously +voluptuousness +volupty +Voluspa +voluta +volutate +volutation +volute +voluted +Volutidae +volutiform +volutin +volution +volutoid +volva +volvate +volvelle +volvent +Volvocaceae +volvocaceous +volvulus +vomer +vomerine +vomerobasilar +vomeronasal +vomeropalatine +vomica +vomicine +vomit +vomitable +vomiter +vomiting +vomitingly +vomition +vomitive +vomitiveness +vomito +vomitory +vomiture +vomiturition +vomitus +vomitwort +vondsira +vonsenite +voodoo +voodooism +voodooist +voodooistic +voracious +voraciously +voraciousness +voracity +voraginous +vorago +vorant +vorhand +vorlooper +vorondreo +vorpal +vortex +vortical +vortically +vorticel +Vorticella +vorticellid +Vorticellidae +vortices +vorticial +vorticiform +vorticism +vorticist +vorticity +vorticose +vorticosely +vorticular +vorticularly +vortiginous +Vortumnus +Vosgian +vota +votable +votal +votally +votaress +votarist +votary +votation +Vote +vote +voteen +voteless +voter +voting +Votish +votive +votively +votiveness +votometer +votress +Votyak +vouch +vouchable +vouchee +voucher +voucheress +vouchment +vouchsafe +vouchsafement +vouge +Vougeot +Vouli +voussoir +vow +vowed +vowel +vowelish +vowelism +vowelist +vowelization +vowelize +vowelless +vowellessness +vowellike +vowely +vower +vowess +vowless +vowmaker +vowmaking +voyage +voyageable +voyager +voyance +voyeur +voyeurism +vraic +vraicker +vraicking +vrbaite +vriddhi +vrother +Vu +vug +vuggy +Vulcan +Vulcanalia +Vulcanalial +Vulcanalian +Vulcanian +Vulcanic +vulcanicity +vulcanism +vulcanist +vulcanite +vulcanizable +vulcanizate +vulcanization +vulcanize +vulcanizer +vulcanological +vulcanologist +vulcanology +vulgar +vulgare +vulgarian +vulgarish +vulgarism +vulgarist +vulgarity +vulgarization +vulgarize +vulgarizer +vulgarlike +vulgarly +vulgarness +vulgarwise +Vulgate +vulgate +vulgus +vuln +vulnerability +vulnerable +vulnerableness +vulnerably +vulnerary +vulnerate +vulneration +vulnerative +vulnerose +vulnific +vulnose +Vulpecula +vulpecular +Vulpeculid +Vulpes +vulpic +vulpicidal +vulpicide +vulpicidism +Vulpinae +vulpine +vulpinism +vulpinite +vulsella +vulsellum +vulsinite +Vultur +vulture +vulturelike +vulturewise +Vulturidae +Vulturinae +vulturine +vulturish +vulturism +vulturn +vulturous +vulva +vulval +vulvar +vulvate +vulviform +vulvitis +vulvocrural +vulvouterine +vulvovaginal +vulvovaginitis +vum +vying +vyingly +W +w +Wa +wa +Waac +waag +waapa +waar +Waasi +wab +wabber +wabble +wabbly +wabby +wabe +Wabena +wabeno +Wabi +wabster +Wabuma +Wabunga +Wac +wacago +wace +Wachaga +Wachenheimer +wachna +Wachuset +wack +wacke +wacken +wacker +wackiness +wacky +Waco +wad +waddent +wadder +wadding +waddler +waddlesome +waddling +waddlingly +waddly +waddy +waddywood +Wade +wade +wadeable +wader +wadi +wading +wadingly +wadlike +wadmaker +wadmaking +wadmal +wadmeal +wadna +wadset +wadsetter +wae +waeg +waer +waesome +waesuck +Waf +Wafd +Wafdist +wafer +waferer +waferish +wafermaker +wafermaking +waferwoman +waferwork +wafery +waff +waffle +wafflike +waffly +waft +waftage +wafter +wafture +wafty +wag +Waganda +waganging +wagaun +wagbeard +wage +waged +wagedom +wageless +wagelessness +wagenboom +Wagener +wager +wagerer +wagering +wages +wagesman +wagework +wageworker +wageworking +waggable +waggably +waggel +wagger +waggery +waggie +waggish +waggishly +waggishness +waggle +waggling +wagglingly +waggly +Waggumbura +waggy +waglike +wagling +Wagneresque +Wagnerian +Wagneriana +Wagnerianism +Wagnerism +Wagnerist +Wagnerite +wagnerite +Wagnerize +Wagogo +Wagoma +wagon +wagonable +wagonage +wagoner +wagoness +wagonette +wagonful +wagonload +wagonmaker +wagonmaking +wagonman +wagonry +wagonsmith +wagonway +wagonwayman +wagonwork +wagonwright +wagsome +wagtail +Waguha +wagwag +wagwants +Wagweno +wagwit +wah +Wahabi +Wahabiism +Wahabit +Wahabitism +wahahe +Wahehe +Wahima +wahine +Wahlenbergia +wahoo +wahpekute +Wahpeton +waiata +Waibling +Waicuri +Waicurian +waif +Waiguli +Waiilatpuan +waik +waikly +waikness +wail +Wailaki +wailer +wailful +wailfully +wailingly +wailsome +waily +wain +wainage +wainbote +wainer +wainful +wainman +wainrope +wainscot +wainscoting +wainwright +waipiro +wairch +waird +wairepo +wairsh +waise +waist +waistband +waistcloth +waistcoat +waistcoated +waistcoateer +waistcoathole +waistcoating +waistcoatless +waisted +waister +waisting +waistless +waistline +wait +waiter +waiterage +waiterdom +waiterhood +waitering +waiterlike +waitership +waiting +waitingly +waitress +waivatua +waive +waiver +waivery +waivod +Waiwai +waiwode +wajang +waka +Wakamba +wakan +Wakashan +wake +wakeel +wakeful +wakefully +wakefulness +wakeless +waken +wakener +wakening +waker +wakes +waketime +wakf +Wakhi +wakif +wakiki +waking +wakingly +wakiup +wakken +wakon +wakonda +Wakore +Wakwafi +waky +Walach +Walachian +walahee +Walapai +Walchia +Waldenses +Waldensian +waldflute +waldgrave +waldgravine +Waldheimia +waldhorn +waldmeister +Waldsteinia +wale +waled +walepiece +Waler +waler +walewort +wali +waling +walk +walkable +walkaway +walker +walking +walkist +walkmill +walkmiller +walkout +walkover +walkrife +walkside +walksman +walkway +walkyrie +wall +wallaba +wallaby +Wallach +wallah +wallaroo +Wallawalla +wallbird +wallboard +walled +waller +Wallerian +wallet +walletful +walleye +walleyed +wallflower +wallful +wallhick +walling +wallise +wallless +wallman +Wallon +Wallonian +Walloon +walloon +wallop +walloper +walloping +wallow +wallower +wallowish +wallowishly +wallowishness +wallpaper +wallpapering +wallpiece +Wallsend +wallwise +wallwork +wallwort +wally +walnut +Walpapi +Walpolean +Walpurgis +walpurgite +walrus +walsh +Walt +walt +Walter +walter +walth +Waltonian +waltz +waltzer +waltzlike +walycoat +wamara +wambais +wamble +wambliness +wambling +wamblingly +wambly +Wambuba +Wambugu +Wambutti +wame +wamefou +wamel +wammikin +wamp +Wampanoag +wampee +wample +wampum +wampumpeag +wampus +wamus +wan +Wanapum +wanchancy +wand +wander +wanderable +wanderer +wandering +wanderingly +wanderingness +Wanderjahr +wanderlust +wanderluster +wanderlustful +wanderoo +wandery +wanderyear +wandflower +wandle +wandlike +wandoo +Wandorobo +wandsman +wandy +wane +Waneatta +waned +waneless +wang +wanga +wangala +wangan +Wangara +wangateur +wanghee +wangle +wangler +Wangoni +wangrace +wangtooth +wanhope +wanhorn +wanigan +waning +wankapin +wankle +wankliness +wankly +wanle +wanly +wanner +wanness +wannish +wanny +wanrufe +wansonsy +want +wantage +wanter +wantful +wanthill +wanthrift +wanting +wantingly +wantingness +wantless +wantlessness +wanton +wantoner +wantonlike +wantonly +wantonness +wantwit +wanty +wanwordy +wanworth +wany +Wanyakyusa +Wanyamwezi +Wanyasa +Wanyoro +wap +wapacut +Wapato +wapatoo +wapentake +Wapisiana +wapiti +Wapogoro +Wapokomo +wapp +Wappato +wappenschaw +wappenschawing +wapper +wapping +Wappinger +Wappo +war +warabi +waratah +warble +warbled +warblelike +warbler +warblerlike +warblet +warbling +warblingly +warbly +warch +warcraft +ward +wardable +wardage +wardapet +warday +warded +Warden +warden +wardency +wardenry +wardenship +warder +warderer +wardership +wardholding +warding +wardite +wardless +wardlike +wardmaid +wardman +wardmote +wardress +wardrobe +wardrober +wardroom +wardship +wardsmaid +wardsman +wardswoman +wardwite +wardwoman +ware +Waregga +warehou +warehouse +warehouseage +warehoused +warehouseful +warehouseman +warehouser +wareless +waremaker +waremaking +wareman +wareroom +warf +warfare +warfarer +warfaring +warful +warily +wariness +Waring +waringin +warish +warison +wark +warkamoowee +warl +warless +warlessly +warlike +warlikely +warlikeness +warlock +warluck +warly +warm +warmable +warman +warmed +warmedly +warmer +warmful +warmhearted +warmheartedly +warmheartedness +warmhouse +warming +warmish +warmly +warmness +warmonger +warmongering +warmouth +warmth +warmthless +warmus +warn +warnel +warner +warning +warningly +warningproof +warnish +warnoth +warnt +Warori +warp +warpable +warpage +warped +warper +warping +warplane +warple +warplike +warproof +warpwise +warragal +warrambool +warran +warrand +warrandice +warrant +warrantable +warrantableness +warrantably +warranted +warrantee +warranter +warrantise +warrantless +warrantor +warranty +warratau +Warrau +warree +Warren +warren +warrener +warrenlike +warrer +Warri +warrin +warrior +warrioress +warriorhood +warriorism +warriorlike +warriorship +warriorwise +warrok +Warsaw +warsaw +warse +warsel +warship +warsle +warsler +warst +wart +warted +wartern +wartflower +warth +wartime +wartless +wartlet +wartlike +wartproof +wartweed +wartwort +warty +wartyback +Warua +Warundi +warve +warwards +Warwick +warwickite +warwolf +warworn +wary +was +wasabi +Wasagara +Wasandawi +Wasango +Wasat +Wasatch +Wasco +wase +Wasegua +wasel +wash +washability +washable +washableness +Washaki +washaway +washbasin +washbasket +washboard +washbowl +washbrew +washcloth +washday +washdish +washdown +washed +washen +washer +washerless +washerman +washerwife +washerwoman +washery +washeryman +washhand +washhouse +washin +washiness +washing +Washington +Washingtonia +Washingtonian +Washingtoniana +Washita +washland +washmaid +washman +Washo +Washoan +washoff +washout +washpot +washproof +washrag +washroad +washroom +washshed +washstand +washtail +washtray +washtrough +washtub +washway +washwoman +washwork +washy +Wasir +wasnt +Wasoga +Wasp +wasp +waspen +wasphood +waspily +waspish +waspishly +waspishness +wasplike +waspling +waspnesting +waspy +wassail +wassailer +wassailous +wassailry +wassie +wast +wastable +wastage +waste +wastebasket +wasteboard +wasted +wasteful +wastefully +wastefulness +wastel +wasteland +wastelbread +wasteless +wasteman +wastement +wasteness +wastepaper +wasteproof +waster +wasterful +wasterfully +wasterfulness +wastethrift +wasteword +wasteyard +wasting +wastingly +wastingness +wastland +wastrel +wastrife +wasty +Wasukuma +Waswahili +Wat +wat +Watala +watap +watch +watchable +watchboat +watchcase +watchcry +watchdog +watched +watcher +watchfree +watchful +watchfully +watchfulness +watchglassful +watchhouse +watching +watchingly +watchkeeper +watchless +watchlessness +watchmaker +watchmaking +watchman +watchmanly +watchmanship +watchmate +watchment +watchout +watchtower +watchwise +watchwoman +watchword +watchwork +water +waterage +waterbailage +waterbelly +Waterberg +waterboard +waterbok +waterbosh +waterbrain +waterchat +watercup +waterdoe +waterdrop +watered +waterer +waterfall +waterfinder +waterflood +waterfowl +waterfront +waterhead +waterhorse +waterie +waterily +wateriness +watering +wateringly +wateringman +waterish +waterishly +waterishness +Waterlander +Waterlandian +waterleave +waterless +waterlessly +waterlessness +waterlike +waterline +waterlog +waterlogged +waterloggedness +waterlogger +waterlogging +Waterloo +waterman +watermanship +watermark +watermaster +watermelon +watermonger +waterphone +waterpot +waterproof +waterproofer +waterproofing +waterproofness +waterquake +waterscape +watershed +watershoot +waterside +watersider +waterskin +watersmeet +waterspout +waterstead +watertight +watertightal +watertightness +waterward +waterwards +waterway +waterweed +waterwise +waterwoman +waterwood +waterwork +waterworker +waterworm +waterworn +waterwort +watery +wath +wathstead +Watsonia +watt +wattage +wattape +wattle +wattlebird +wattled +wattless +wattlework +wattling +wattman +wattmeter +Watusi +wauble +wauch +wauchle +waucht +wauf +waugh +waughy +wauken +waukit +waukrife +waul +waumle +wauner +wauns +waup +waur +Waura +wauregan +wauve +wavable +wavably +Wave +wave +waved +waveless +wavelessly +wavelessness +wavelet +wavelike +wavellite +wavemark +wavement +wavemeter +waveproof +waver +waverable +waverer +wavering +waveringly +waveringness +waverous +wavery +waveson +waveward +wavewise +wavey +wavicle +wavily +waviness +waving +wavingly +Wavira +wavy +waw +wawa +wawah +wawaskeesh +wax +waxberry +waxbill +waxbird +waxbush +waxchandler +waxchandlery +waxen +waxer +waxflower +Waxhaw +waxhearted +waxily +waxiness +waxing +waxingly +waxlike +waxmaker +waxmaking +waxman +waxweed +waxwing +waxwork +waxworker +waxworking +waxy +way +wayaka +wayang +Wayao +wayback +wayberry +waybill +waybird +waybook +waybread +waybung +wayfare +wayfarer +wayfaring +wayfaringly +wayfellow +waygang +waygate +waygoing +waygone +waygoose +wayhouse +waying +waylaid +waylaidlessness +waylay +waylayer +wayleave +wayless +waymaker +wayman +waymark +waymate +Wayne +waypost +ways +wayside +waysider +waysliding +waythorn +wayward +waywarden +waywardly +waywardness +waywiser +waywode +waywodeship +wayworn +waywort +wayzgoose +Wazir +we +Wea +weak +weakbrained +weaken +weakener +weakening +weakfish +weakhanded +weakhearted +weakheartedly +weakheartedness +weakish +weakishly +weakishness +weakliness +weakling +weakly +weakmouthed +weakness +weaky +weal +weald +Wealden +wealdsman +wealth +wealthily +wealthiness +wealthless +wealthmaker +wealthmaking +wealthmonger +Wealthy +wealthy +weam +wean +weanable +weanedness +weanel +weaner +weanling +Weanoc +weanyer +Weapemeoc +weapon +weaponed +weaponeer +weaponless +weaponmaker +weaponmaking +weaponproof +weaponry +weaponshaw +weaponshow +weaponshowing +weaponsmith +weaponsmithy +wear +wearability +wearable +wearer +weariable +weariableness +wearied +weariedly +weariedness +wearier +weariful +wearifully +wearifulness +weariless +wearilessly +wearily +weariness +wearing +wearingly +wearish +wearishly +wearishness +wearisome +wearisomely +wearisomeness +wearproof +weary +wearying +wearyingly +weasand +weasel +weaselfish +weasellike +weaselly +weaselship +weaselskin +weaselsnout +weaselwise +weaser +weason +weather +weatherboard +weatherboarding +weatherbreak +weathercock +weathercockish +weathercockism +weathercocky +weathered +weatherer +weatherfish +weatherglass +weathergleam +weatherhead +weatherheaded +weathering +weatherliness +weatherly +weathermaker +weathermaking +weatherman +weathermost +weatherology +weatherproof +weatherproofed +weatherproofing +weatherproofness +weatherward +weatherworn +weathery +weavable +weave +weaveable +weaved +weavement +weaver +weaverbird +weaveress +weaving +weazen +weazened +weazeny +web +webbed +webber +webbing +webby +weber +Weberian +webeye +webfoot +webfooter +webless +weblike +webmaker +webmaking +webster +Websterian +websterite +webwork +webworm +wecht +wed +wedana +wedbed +wedbedrip +wedded +weddedly +weddedness +wedder +wedding +weddinger +wede +wedge +wedgeable +wedgebill +wedged +wedgelike +wedger +wedgewise +Wedgie +wedging +Wedgwood +wedgy +wedlock +Wednesday +wedset +wee +weeble +weed +weeda +weedable +weedage +weeded +weeder +weedery +weedful +weedhook +weediness +weedingtime +weedish +weedless +weedlike +weedling +weedow +weedproof +weedy +week +weekday +weekend +weekender +weekly +weekwam +weel +weelfard +weelfaured +weemen +ween +weendigo +weeness +weening +weenong +weeny +weep +weepable +weeper +weepered +weepful +weeping +weepingly +weeps +weepy +weesh +weeshy +weet +weetbird +weetless +weever +weevil +weeviled +weevillike +weevilproof +weevily +weewow +weeze +weft +weftage +wefted +wefty +Wega +wegenerian +wegotism +wehrlite +Wei +weibyeite +weichselwood +Weierstrassian +Weigela +weigelite +weigh +weighable +weighage +weighbar +weighbauk +weighbridge +weighbridgeman +weighed +weigher +weighership +weighhouse +weighin +weighing +weighman +weighment +weighshaft +weight +weightchaser +weighted +weightedly +weightedness +weightily +weightiness +weighting +weightless +weightlessly +weightlessness +weightometer +weighty +weinbergerite +Weinmannia +weinschenkite +weir +weirangle +weird +weirdful +weirdish +weirdless +weirdlessness +weirdlike +weirdliness +weirdly +weirdness +weirdsome +weirdward +weirdwoman +weiring +weisbachite +weiselbergite +weism +Weismannian +Weismannism +weissite +Weissnichtwo +Weitspekan +wejack +weka +wekau +wekeen +weki +welcome +welcomeless +welcomely +welcomeness +welcomer +welcoming +welcomingly +weld +weldability +weldable +welder +welding +weldless +weldment +weldor +Welf +welfare +welfaring +Welfic +welk +welkin +welkinlike +well +wellat +wellaway +wellborn +wellcurb +wellhead +wellhole +welling +wellington +Wellingtonia +wellish +wellmaker +wellmaking +wellman +wellnear +wellness +wellring +Wellsian +wellside +wellsite +wellspring +wellstead +wellstrand +welly +wellyard +wels +Welsh +welsh +welsher +Welshery +Welshism +Welshland +Welshlike +Welshman +Welshness +Welshry +Welshwoman +Welshy +welsium +welt +welted +welter +welterweight +welting +Welwitschia +wem +wemless +wen +wench +wencher +wenchless +wenchlike +Wenchow +Wenchowese +Wend +wend +wende +Wendell +Wendi +Wendic +Wendish +Wendy +wene +Wenlock +Wenlockian +wennebergite +wennish +wenny +Wenonah +Wenrohronon +went +wentletrap +wenzel +wept +wer +Werchowinci +were +werebear +werecalf +werefolk +werefox +werehyena +werejaguar +wereleopard +werent +weretiger +werewolf +werewolfish +werewolfism +werf +wergil +weri +Werner +Wernerian +Wernerism +wernerite +werowance +wert +Werther +Wertherian +Wertherism +wervel +Wes +wese +weskit +Wesleyan +Wesleyanism +Wesleyism +wesselton +Wessexman +west +westaway +westbound +weste +wester +westering +westerliness +westerly +westermost +western +westerner +westernism +westernization +westernize +westernly +westernmost +westerwards +westfalite +westing +westland +Westlander +westlandways +westmost +westness +Westphalian +Westralian +Westralianism +westward +westwardly +westwardmost +westwards +westy +wet +weta +wetback +wetbird +wetched +wetchet +wether +wetherhog +wetherteg +wetly +wetness +wettability +wettable +wetted +wetter +wetting +wettish +Wetumpka +weve +wevet +Wewenoc +wey +Wezen +Wezn +wha +whabby +whack +whacker +whacking +whacky +whafabout +whale +whaleback +whalebacker +whalebird +whaleboat +whalebone +whaleboned +whaledom +whalehead +whalelike +whaleman +whaler +whaleroad +whalery +whaleship +whaling +whalish +whally +whalm +whalp +whaly +wham +whamble +whame +whammle +whamp +whampee +whample +whan +whand +whang +whangable +whangam +whangdoodle +whangee +whanghee +whank +whap +whappet +whapuka +whapukee +whapuku +whar +whare +whareer +wharf +wharfage +wharfhead +wharfholder +wharfing +wharfinger +wharfland +wharfless +wharfman +wharfmaster +wharfrae +wharfside +wharl +wharp +wharry +whart +wharve +whase +whasle +what +whata +whatabouts +whatever +whatkin +whatlike +whatna +whatness +whatnot +whatreck +whats +whatso +whatsoeer +whatsoever +whatsomever +whatten +whau +whauk +whaup +whaur +whauve +wheal +whealworm +whealy +wheam +wheat +wheatbird +wheatear +wheateared +wheaten +wheatgrower +wheatland +wheatless +wheatlike +wheatstalk +wheatworm +wheaty +whedder +whee +wheedle +wheedler +wheedlesome +wheedling +wheedlingly +wheel +wheelage +wheelband +wheelbarrow +wheelbarrowful +wheelbird +wheelbox +wheeldom +wheeled +wheeler +wheelery +wheelhouse +wheeling +wheelingly +wheelless +wheellike +wheelmaker +wheelmaking +wheelman +wheelrace +wheelroad +wheelsman +wheelsmith +wheelspin +wheelswarf +wheelway +wheelwise +wheelwork +wheelwright +wheelwrighting +wheely +wheem +wheen +wheencat +wheenge +wheep +wheeple +wheer +wheerikins +wheesht +wheetle +wheeze +wheezer +wheezily +wheeziness +wheezingly +wheezle +wheezy +wheft +whein +whekau +wheki +whelk +whelked +whelker +whelklike +whelky +whelm +whelp +whelphood +whelpish +whelpless +whelpling +whelve +whemmel +when +whenabouts +whenas +whence +whenceeer +whenceforth +whenceforward +whencesoeer +whencesoever +whencever +wheneer +whenever +whenness +whenso +whensoever +whensomever +where +whereabout +whereabouts +whereafter +whereanent +whereas +whereat +whereaway +whereby +whereer +wherefor +wherefore +wherefrom +wherein +whereinsoever +whereinto +whereness +whereof +whereon +whereout +whereover +whereso +wheresoeer +wheresoever +wheresomever +wherethrough +wheretill +whereto +wheretoever +wheretosoever +whereunder +whereuntil +whereunto +whereup +whereupon +wherever +wherewith +wherewithal +wherret +wherrit +wherry +wherryman +whet +whether +whetile +whetrock +whetstone +whetter +whew +whewellite +whewer +whewl +whewt +whey +wheybeard +wheyey +wheyeyness +wheyface +wheyfaced +wheyish +wheyishness +wheylike +wheyness +whiba +which +whichever +whichsoever +whichway +whichways +whick +whicken +whicker +whid +whidah +whidder +whiff +whiffenpoof +whiffer +whiffet +whiffle +whiffler +whifflery +whiffletree +whiffling +whifflingly +whiffy +whift +Whig +whig +Whiggamore +whiggamore +Whiggarchy +Whiggery +Whiggess +Whiggification +Whiggify +Whiggish +Whiggishly +Whiggishness +Whiggism +Whiglet +Whigling +whigmaleerie +whigship +whikerby +while +whileen +whilere +whiles +whilie +whilk +Whilkut +whill +whillaballoo +whillaloo +whillilew +whilly +whillywha +whilock +whilom +whils +whilst +whilter +whim +whimberry +whimble +whimbrel +whimling +whimmy +whimper +whimperer +whimpering +whimperingly +whimsey +whimsic +whimsical +whimsicality +whimsically +whimsicalness +whimsied +whimstone +whimwham +whin +whinberry +whinchacker +whinchat +whincheck +whincow +whindle +whine +whiner +whinestone +whing +whinge +whinger +whininess +whiningly +whinnel +whinner +whinnock +whinny +whinstone +whiny +whinyard +whip +whipbelly +whipbird +whipcat +whipcord +whipcordy +whipcrack +whipcracker +whipcraft +whipgraft +whipjack +whipking +whiplash +whiplike +whipmaker +whipmaking +whipman +whipmanship +whipmaster +whippa +whippable +whipparee +whipped +whipper +whippersnapper +whippertail +whippet +whippeter +whippiness +whipping +whippingly +whippletree +whippoorwill +whippost +whippowill +whippy +whipsaw +whipsawyer +whipship +whipsocket +whipstaff +whipstalk +whipstall +whipster +whipstick +whipstitch +whipstock +whipt +whiptail +whiptree +whipwise +whipworm +whir +whirken +whirl +whirlabout +whirlblast +whirlbone +whirlbrain +whirled +whirler +whirley +whirlgig +whirlicane +whirligig +whirlimagig +whirling +whirlingly +whirlmagee +whirlpool +whirlpuff +whirlwig +whirlwind +whirlwindish +whirlwindy +whirly +whirlygigum +whirret +whirrey +whirroo +whirry +whirtle +whish +whisk +whisker +whiskerage +whiskerando +whiskerandoed +whiskered +whiskerer +whiskerette +whiskerless +whiskerlike +whiskery +whiskey +whiskful +whiskied +whiskified +whisking +whiskingly +whisky +whiskyfied +whiskylike +whisp +whisper +whisperable +whisperation +whispered +whisperer +whisperhood +whispering +whisperingly +whisperingness +whisperless +whisperous +whisperously +whisperproof +whispery +whissle +Whisson +whist +whister +whisterpoop +whistle +whistlebelly +whistlefish +whistlelike +whistler +Whistlerian +whistlerism +whistlewing +whistlewood +whistlike +whistling +whistlingly +whistly +whistness +Whistonian +Whit +whit +white +whiteback +whitebait +whitebark +whitebeard +whitebelly +whitebill +whitebird +whiteblaze +whiteblow +whitebottle +Whiteboy +Whiteboyism +whitecap +whitecapper +Whitechapel +whitecoat +whitecomb +whitecorn +whitecup +whited +whiteface +Whitefieldian +Whitefieldism +Whitefieldite +whitefish +whitefisher +whitefishery +Whitefoot +whitefoot +whitefootism +whitehanded +whitehass +whitehawse +whitehead +whiteheart +whitehearted +whitelike +whitely +whiten +whitener +whiteness +whitening +whitenose +whitepot +whiteroot +whiterump +whites +whitesark +whiteseam +whiteshank +whiteside +whitesmith +whitestone +whitetail +whitethorn +whitethroat +whitetip +whitetop +whitevein +whitewall +whitewards +whiteware +whitewash +whitewasher +whiteweed +whitewing +whitewood +whiteworm +whitewort +whitfinch +whither +whitherso +whithersoever +whitherto +whitherward +whiting +whitish +whitishness +whitleather +Whitleyism +whitling +whitlow +whitlowwort +Whitmanese +Whitmanesque +Whitmanism +Whitmanize +Whitmonday +whitneyite +whitrack +whits +whitster +Whitsun +Whitsunday +Whitsuntide +whittaw +whitten +whittener +whitter +whitterick +whittle +whittler +whittling +whittret +whittrick +whity +whiz +whizgig +whizzer +whizzerman +whizziness +whizzing +whizzingly +whizzle +who +whoa +whodunit +whoever +whole +wholehearted +wholeheartedly +wholeheartedness +wholeness +wholesale +wholesalely +wholesaleness +wholesaler +wholesome +wholesomely +wholesomeness +wholewise +wholly +whom +whomble +whomever +whomso +whomsoever +whone +whoo +whoof +whoop +whoopee +whooper +whooping +whoopingly +whooplike +whoops +whoosh +whop +whopper +whopping +whorage +whore +whoredom +whorelike +whoremaster +whoremasterly +whoremastery +whoremonger +whoremonging +whoreship +whoreson +whorish +whorishly +whorishness +whorl +whorled +whorlflower +whorly +whorlywort +whort +whortle +whortleberry +whose +whosen +whosesoever +whosever +whosomever +whosumdever +whud +whuff +whuffle +whulk +whulter +whummle +whun +whunstane +whup +whush +whuskie +whussle +whute +whuther +whutter +whuttering +whuz +why +whyever +whyfor +whyness +whyo +wi +wice +Wichita +wicht +wichtisite +wichtje +wick +wickawee +wicked +wickedish +wickedlike +wickedly +wickedness +wicken +wicker +wickerby +wickerware +wickerwork +wickerworked +wickerworker +wicket +wicketkeep +wicketkeeper +wicketkeeping +wicketwork +wicking +wickiup +wickless +wickup +wicky +wicopy +wid +widbin +widdendream +widder +widdershins +widdifow +widdle +widdy +wide +widegab +widehearted +widely +widemouthed +widen +widener +wideness +widespread +widespreadedly +widespreadly +widespreadness +widewhere +widework +widgeon +widish +widow +widowed +widower +widowered +widowerhood +widowership +widowery +widowhood +widowish +widowlike +widowly +widowman +widowy +width +widthless +widthway +widthways +widthwise +widu +wield +wieldable +wielder +wieldiness +wieldy +wiener +wienerwurst +wienie +wierangle +wiesenboden +wife +wifecarl +wifedom +wifehood +wifeism +wifekin +wifeless +wifelessness +wifelet +wifelike +wifeling +wifelkin +wifely +wifeship +wifeward +wifie +wifiekie +wifish +wifock +wig +wigan +wigdom +wigful +wigged +wiggen +wigger +wiggery +wigging +wiggish +wiggishness +wiggism +wiggle +wiggler +wiggly +wiggy +wight +wightly +wightness +wigless +wiglet +wiglike +wigmaker +wigmaking +wigtail +wigwag +wigwagger +wigwam +wiikite +Wikeno +Wikstroemia +Wilbur +Wilburite +wild +wildbore +wildcat +wildcatter +wildcatting +wildebeest +wilded +wilder +wilderedly +wildering +wilderment +wilderness +wildfire +wildfowl +wildgrave +wilding +wildish +wildishly +wildishness +wildlife +wildlike +wildling +wildly +wildness +wildsome +wildwind +wile +wileful +wileless +wileproof +Wilfred +wilga +wilgers +Wilhelm +Wilhelmina +Wilhelmine +wilily +wiliness +wilk +wilkeite +wilkin +Wilkinson +Will +will +willable +willawa +willed +willedness +willemite +willer +willet +willey +willeyer +willful +willfully +willfulness +William +williamsite +Williamsonia +Williamsoniaceae +Willie +willie +willier +willies +willing +willinghearted +willinghood +willingly +willingness +williwaw +willmaker +willmaking +willness +willock +willow +willowbiter +willowed +willower +willowish +willowlike +willowware +willowweed +willowworm +willowwort +willowy +Willugbaeya +Willy +willy +willyard +willyart +willyer +Wilmer +wilsome +wilsomely +wilsomeness +Wilson +Wilsonian +wilt +wilter +Wilton +wiltproof +Wiltshire +wily +wim +wimberry +wimble +wimblelike +wimbrel +wime +wimick +wimple +wimpleless +wimplelike +Win +win +winberry +wince +wincer +wincey +winch +wincher +Winchester +winchman +wincing +wincingly +Wind +wind +windable +windage +windbag +windbagged +windbaggery +windball +windberry +windbibber +windbore +windbracing +windbreak +Windbreaker +windbreaker +windbroach +windclothes +windcuffer +winddog +winded +windedly +windedness +winder +windermost +Windesheimer +windfall +windfallen +windfanner +windfirm +windfish +windflaw +windflower +windgall +windgalled +windhole +windhover +windigo +windily +windiness +winding +windingly +windingness +windjammer +windjamming +windlass +windlasser +windle +windles +windless +windlessly +windlessness +windlestrae +windlestraw +windlike +windlin +windling +windmill +windmilly +windock +windore +window +windowful +windowless +windowlessness +windowlet +windowlight +windowlike +windowmaker +windowmaking +windowman +windowpane +windowpeeper +windowshut +windowward +windowwards +windowwise +windowy +windpipe +windplayer +windproof +windring +windroad +windroot +windrow +windrower +windscreen +windshield +windshock +Windsor +windsorite +windstorm +windsucker +windtight +windup +windward +windwardly +windwardmost +windwardness +windwards +windway +windwayward +windwaywardly +windy +wine +wineball +wineberry +winebibber +winebibbery +winebibbing +Winebrennerian +wineconner +wined +wineglass +wineglassful +winegrower +winegrowing +winehouse +wineless +winelike +winemay +winepot +winer +winery +Winesap +wineshop +wineskin +winesop +winetaster +winetree +winevat +Winfred +winful +wing +wingable +wingbeat +wingcut +winged +wingedly +wingedness +winger +wingfish +winghanded +wingle +wingless +winglessness +winglet +winglike +wingman +wingmanship +wingpiece +wingpost +wingseed +wingspread +wingstem +wingy +Winifred +winish +wink +winkel +winkelman +winker +winkered +winking +winkingly +winkle +winklehawk +winklehole +winklet +winly +winna +winnable +winnard +Winnebago +Winnecowet +winnel +winnelstrae +winner +Winnie +winning +winningly +winningness +winnings +winninish +Winnipesaukee +winnle +winnonish +winnow +winnower +winnowing +winnowingly +Winona +winrace +winrow +winsome +winsomely +winsomeness +Winston +wint +winter +Winteraceae +winterage +Winteranaceae +winterberry +winterbloom +winterbourne +winterdykes +wintered +winterer +winterfeed +wintergreen +winterhain +wintering +winterish +winterishly +winterishness +winterization +winterize +winterkill +winterkilling +winterless +winterlike +winterliness +winterling +winterly +winterproof +wintersome +wintertide +wintertime +winterward +winterwards +winterweed +wintle +wintrify +wintrily +wintriness +wintrish +wintrous +wintry +Wintun +winy +winze +winzeman +wipe +wiper +wippen +wips +wir +wirable +wirble +wird +wire +wirebar +wirebird +wired +wiredancer +wiredancing +wiredraw +wiredrawer +wiredrawn +wirehair +wireless +wirelessly +wirelessness +wirelike +wiremaker +wiremaking +wireman +wiremonger +Wirephoto +wirepull +wirepuller +wirepulling +wirer +wiresmith +wirespun +wiretail +wireway +wireweed +wirework +wireworker +wireworking +wireworks +wireworm +wirily +wiriness +wiring +wirl +wirling +Wiros +wirr +wirra +wirrah +wirrasthru +wiry +wis +Wisconsinite +wisdom +wisdomful +wisdomless +wisdomproof +wisdomship +wise +wiseacre +wiseacred +wiseacredness +wiseacredom +wiseacreish +wiseacreishness +wiseacreism +wisecrack +wisecracker +wisecrackery +wisehead +wisehearted +wiseheartedly +wiseheimer +wiselike +wiseling +wisely +wiseman +wisen +wiseness +wisenheimer +wisent +wiser +wiseweed +wisewoman +wish +wisha +wishable +wishbone +wished +wishedly +wisher +wishful +wishfully +wishfulness +wishing +wishingly +wishless +wishly +wishmay +wishness +Wishoskan +Wishram +wisht +wishtonwish +Wisigothic +wisket +wiskinky +wisp +wispish +wisplike +wispy +wiss +wisse +wissel +wist +Wistaria +wistaria +wiste +wistened +Wisteria +wisteria +wistful +wistfully +wistfulness +wistit +wistiti +wistless +wistlessness +wistonwish +wit +witan +Witbooi +witch +witchbells +witchcraft +witched +witchedly +witchen +witchering +witchery +witchet +witchetty +witchhood +witching +witchingly +witchleaf +witchlike +witchman +witchmonger +witchuck +witchweed +witchwife +witchwoman +witchwood +witchwork +witchy +witcraft +wite +witeless +witenagemot +witepenny +witess +witful +with +withal +withamite +Withania +withdraught +withdraw +withdrawable +withdrawal +withdrawer +withdrawing +withdrawingness +withdrawment +withdrawn +withdrawnness +withe +withen +wither +witherband +withered +witheredly +witheredness +witherer +withergloom +withering +witheringly +witherite +witherly +withernam +withers +withershins +withertip +witherwards +witherweight +withery +withewood +withheld +withhold +withholdable +withholdal +withholder +withholdment +within +withindoors +withinside +withinsides +withinward +withinwards +withness +witholden +without +withoutdoors +withouten +withoutforth +withoutside +withoutwards +withsave +withstand +withstander +withstandingness +withstay +withstood +withstrain +withvine +withwind +withy +withypot +withywind +witjar +witless +witlessly +witlessness +witlet +witling +witloof +witmonger +witness +witnessable +witnessdom +witnesser +witney +witneyer +Witoto +witship +wittal +wittawer +witteboom +witted +witter +wittering +witticaster +wittichenite +witticism +witticize +wittified +wittily +wittiness +witting +wittingly +wittol +wittolly +witty +Witumki +witwall +witzchoura +wive +wiver +wivern +Wiyat +Wiyot +wiz +wizard +wizardess +wizardism +wizardlike +wizardly +wizardry +wizardship +wizen +wizened +wizenedness +wizier +wizzen +wloka +wo +woad +woader +woadman +woadwaxen +woady +woak +woald +woan +wob +wobbegong +wobble +wobbler +wobbliness +wobbling +wobblingly +wobbly +wobster +wocheinite +Wochua +wod +woddie +wode +Wodenism +wodge +wodgy +woe +woebegone +woebegoneness +woebegonish +woeful +woefully +woefulness +woehlerite +woesome +woevine +woeworn +woffler +woft +wog +wogiet +Wogulian +woibe +wokas +woke +wokowi +wold +woldlike +woldsman +woldy +Wolf +wolf +wolfachite +wolfberry +wolfdom +wolfen +wolfer +Wolffia +Wolffian +Wolffianism +Wolfgang +wolfhood +wolfhound +Wolfian +wolfish +wolfishly +wolfishness +wolfkin +wolfless +wolflike +wolfling +wolfram +wolframate +wolframic +wolframine +wolframinium +wolframite +wolfsbane +wolfsbergite +wolfskin +wolfward +wolfwards +wollastonite +wollomai +wollop +Wolof +wolter +wolve +wolveboon +wolver +wolverine +woman +womanbody +womandom +womanfolk +womanfully +womanhead +womanhearted +womanhood +womanhouse +womanish +womanishly +womanishness +womanism +womanist +womanity +womanization +womanize +womanizer +womankind +womanless +womanlike +womanliness +womanly +womanmuckle +womanness +womanpost +womanproof +womanship +womanways +womanwise +womb +wombat +wombed +womble +wombstone +womby +womenfolk +womenfolks +womenkind +womera +wommerala +won +wonder +wonderberry +wonderbright +wondercraft +wonderer +wonderful +wonderfully +wonderfulness +wondering +wonderingly +wonderland +wonderlandish +wonderless +wonderment +wondermonger +wondermongering +wondersmith +wondersome +wonderstrong +wonderwell +wonderwork +wonderworthy +wondrous +wondrously +wondrousness +wone +wonegan +wong +wonga +Wongara +wongen +wongshy +wongsky +woning +wonky +wonna +wonned +wonner +wonning +wonnot +wont +wonted +wontedly +wontedness +wonting +woo +wooable +wood +woodagate +woodbark +woodbin +woodbind +woodbine +woodbined +woodbound +woodburytype +woodbush +woodchat +woodchuck +woodcock +woodcockize +woodcracker +woodcraft +woodcrafter +woodcraftiness +woodcraftsman +woodcrafty +woodcut +woodcutter +woodcutting +wooded +wooden +woodendite +woodenhead +woodenheaded +woodenheadedness +woodenly +woodenness +woodenware +woodenweary +woodeny +woodfish +woodgeld +woodgrub +woodhack +woodhacker +woodhole +woodhorse +woodhouse +woodhung +woodine +woodiness +wooding +woodish +woodjobber +woodkern +woodknacker +woodland +woodlander +woodless +woodlessness +woodlet +woodlike +woodlocked +woodly +woodman +woodmancraft +woodmanship +woodmonger +woodmote +woodness +woodpeck +woodpecker +woodpenny +woodpile +woodprint +woodranger +woodreeve +woodrick +woodrock +woodroof +woodrow +woodrowel +Woodruff +woodruff +woodsere +woodshed +woodshop +Woodsia +woodside +woodsilver +woodskin +woodsman +woodspite +woodstone +woodsy +woodwall +woodward +Woodwardia +woodwardship +woodware +woodwax +woodwaxen +woodwise +woodwork +woodworker +woodworking +woodworm +woodwose +woodwright +Woody +woody +woodyard +wooer +woof +woofed +woofell +woofer +woofy +woohoo +wooing +wooingly +wool +woold +woolder +woolding +wooled +woolen +woolenet +woolenization +woolenize +wooler +woolert +woolfell +woolgatherer +woolgathering +woolgrower +woolgrowing +woolhead +wooliness +woollike +woolly +woollyhead +woollyish +woolman +woolpack +woolpress +woolsack +woolsey +woolshearer +woolshearing +woolshears +woolshed +woolskin +woolsorter +woolsorting +woolsower +woolstock +woolulose +Woolwa +woolwasher +woolweed +woolwheel +woolwinder +woolwork +woolworker +woolworking +woom +woomer +woomerang +woon +woons +woorali +woorari +woosh +wootz +woozle +woozy +wop +woppish +wops +worble +worcester +word +wordable +wordably +wordage +wordbook +wordbuilding +wordcraft +wordcraftsman +worded +Worden +worder +wordily +wordiness +wording +wordish +wordishly +wordishness +wordle +wordless +wordlessly +wordlessness +wordlike +wordlorist +wordmaker +wordmaking +wordman +wordmanship +wordmonger +wordmongering +wordmongery +wordplay +wordsman +wordsmanship +wordsmith +wordspite +wordster +Wordsworthian +Wordsworthianism +wordy +wore +work +workability +workable +workableness +workaday +workaway +workbag +workbasket +workbench +workbook +workbox +workbrittle +workday +worked +worker +workfellow +workfolk +workfolks +workgirl +workhand +workhouse +workhoused +working +workingly +workingman +workingwoman +workless +worklessness +workloom +workman +workmanlike +workmanlikeness +workmanliness +workmanly +workmanship +workmaster +workmistress +workout +workpan +workpeople +workpiece +workplace +workroom +works +workship +workshop +worksome +workstand +worktable +worktime +workways +workwise +workwoman +workwomanlike +workwomanly +worky +workyard +world +worlded +worldful +worldish +worldless +worldlet +worldlike +worldlily +worldliness +worldling +worldly +worldmaker +worldmaking +worldproof +worldquake +worldward +worldwards +worldway +worldy +worm +wormed +wormer +wormhole +wormholed +wormhood +Wormian +wormil +worming +wormless +wormlike +wormling +wormproof +wormroot +wormseed +wormship +wormweed +wormwood +wormy +worn +wornil +wornness +worral +worriable +worricow +worried +worriedly +worriedness +worrier +worriless +worriment +worrisome +worrisomely +worrisomeness +worrit +worriter +worry +worrying +worryingly +worryproof +worrywart +worse +worsement +worsen +worseness +worsening +worser +worserment +worset +worship +worshipability +worshipable +worshiper +worshipful +worshipfully +worshipfulness +worshipingly +worshipless +worshipworth +worshipworthy +worst +worsted +wort +worth +worthful +worthfulness +worthiest +worthily +worthiness +worthless +worthlessly +worthlessness +worthship +worthward +worthy +wosbird +wot +wote +wots +wottest +wotteth +woubit +wouch +wouf +wough +would +wouldest +wouldnt +wouldst +wound +woundability +woundable +woundableness +wounded +woundedly +wounder +woundily +wounding +woundingly +woundless +wounds +woundwort +woundworth +woundy +wourali +wourari +wournil +wove +woven +Wovoka +wow +wowser +wowserdom +wowserian +wowserish +wowserism +wowsery +wowt +woy +Woyaway +wrack +wracker +wrackful +Wraf +wraggle +wrainbolt +wrainstaff +wrainstave +wraith +wraithe +wraithlike +wraithy +wraitly +wramp +wran +wrang +wrangle +wrangler +wranglership +wranglesome +wranglingly +wrannock +wranny +wrap +wrappage +wrapped +wrapper +wrapperer +wrappering +wrapping +wraprascal +wrasse +wrastle +wrastler +wrath +wrathful +wrathfully +wrathfulness +wrathily +wrathiness +wrathlike +wrathy +wraw +wrawl +wrawler +wraxle +wreak +wreakful +wreakless +wreat +wreath +wreathage +wreathe +wreathed +wreathen +wreather +wreathingly +wreathless +wreathlet +wreathlike +wreathmaker +wreathmaking +wreathwise +wreathwork +wreathwort +wreathy +wreck +wreckage +wrecker +wreckfish +wreckful +wrecking +wrecky +Wren +wren +wrench +wrenched +wrencher +wrenchingly +wrenlet +wrenlike +wrentail +wrest +wrestable +wrester +wresting +wrestingly +wrestle +wrestler +wrestlerlike +wrestling +wretch +wretched +wretchedly +wretchedness +wretchless +wretchlessly +wretchlessness +wretchock +wricht +wrick +wride +wried +wrier +wriest +wrig +wriggle +wriggler +wrigglesome +wrigglingly +wriggly +wright +wrightine +wring +wringbolt +wringer +wringman +wringstaff +wrinkle +wrinkleable +wrinkled +wrinkledness +wrinkledy +wrinkleful +wrinkleless +wrinkleproof +wrinklet +wrinkly +wrist +wristband +wristbone +wristed +wrister +wristfall +wristikin +wristlet +wristlock +wristwork +writ +writability +writable +writation +writative +write +writeable +writee +writer +writeress +writerling +writership +writh +writhe +writhed +writhedly +writhedness +writhen +writheneck +writher +writhing +writhingly +writhy +writing +writinger +writmaker +writmaking +writproof +written +writter +wrive +wrizzled +wro +wrocht +wroke +wroken +wrong +wrongdoer +wrongdoing +wronged +wronger +wrongful +wrongfully +wrongfulness +wronghead +wrongheaded +wrongheadedly +wrongheadedness +wronghearted +wrongheartedly +wrongheartedness +wrongish +wrongless +wronglessly +wrongly +wrongness +wrongous +wrongously +wrongousness +wrongwise +Wronskian +wrossle +wrote +wroth +wrothful +wrothfully +wrothily +wrothiness +wrothly +wrothsome +wrothy +wrought +wrox +wrung +wrungness +wry +wrybill +wryly +wrymouth +wryneck +wryness +wrytail +Wu +Wuchereria +wud +wuddie +wudge +wudu +wugg +wulfenite +wulk +wull +wullawins +wullcat +Wullie +wulliwa +wumble +wumman +wummel +wun +Wundtian +wungee +wunna +wunner +wunsome +wup +wur +wurley +wurmal +Wurmian +wurrus +wurset +wurtzilite +wurtzite +Wurzburger +wurzel +wush +wusp +wuss +wusser +wust +wut +wuther +wuzu +wuzzer +wuzzle +wuzzy +wy +Wyandot +Wyandotte +Wycliffian +Wycliffism +Wycliffist +Wycliffite +wyde +wye +Wyethia +wyke +Wykehamical +Wykehamist +wyle +wyliecoat +wymote +wyn +wynd +wyne +wynkernel +wynn +Wyomingite +wyomingite +wype +wyson +wyss +wyve +wyver +X +x +xanthaline +xanthamic +xanthamide +xanthane +xanthate +xanthation +xanthein +xanthelasma +xanthelasmic +xanthelasmoidea +xanthene +Xanthian +xanthic +xanthide +Xanthidium +xanthin +xanthine +xanthinuria +xanthione +Xanthisma +xanthite +Xanthium +xanthiuria +xanthocarpous +Xanthocephalus +Xanthoceras +Xanthochroi +xanthochroia +Xanthochroic +xanthochroid +xanthochroism +xanthochromia +xanthochromic +xanthochroous +xanthocobaltic +xanthocone +xanthoconite +xanthocreatinine +xanthocyanopsia +xanthocyanopsy +xanthocyanopy +xanthoderm +xanthoderma +xanthodont +xanthodontous +xanthogen +xanthogenamic +xanthogenamide +xanthogenate +xanthogenic +xantholeucophore +xanthoma +xanthomata +xanthomatosis +xanthomatous +Xanthomelanoi +xanthomelanous +xanthometer +Xanthomonas +xanthomyeloma +xanthone +xanthophane +xanthophore +xanthophose +Xanthophyceae +xanthophyll +xanthophyllite +xanthophyllous +Xanthopia +xanthopia +xanthopicrin +xanthopicrite +xanthoproteic +xanthoprotein +xanthoproteinic +xanthopsia +xanthopsin +xanthopsydracia +xanthopterin +xanthopurpurin +xanthorhamnin +Xanthorrhiza +Xanthorrhoea +xanthorrhoea +xanthosiderite +xanthosis +Xanthosoma +xanthospermous +xanthotic +Xanthoura +xanthous +Xanthoxalis +xanthoxenite +xanthoxylin +xanthuria +xanthydrol +xanthyl +xarque +Xaverian +xebec +Xema +xenacanthine +Xenacanthini +xenagogue +xenagogy +Xenarchi +Xenarthra +xenarthral +xenarthrous +xenelasia +xenelasy +xenia +xenial +xenian +Xenicidae +Xenicus +xenium +xenobiosis +xenoblast +Xenocratean +Xenocratic +xenocryst +xenodochium +xenogamous +xenogamy +xenogenesis +xenogenetic +xenogenic +xenogenous +xenogeny +xenolite +xenolith +xenolithic +xenomania +xenomaniac +Xenomi +Xenomorpha +xenomorphic +xenomorphosis +xenon +xenoparasite +xenoparasitism +xenopeltid +Xenopeltidae +Xenophanean +xenophile +xenophilism +xenophobe +xenophobia +xenophobian +xenophobism +xenophoby +Xenophonic +Xenophontean +Xenophontian +Xenophontic +Xenophontine +Xenophora +xenophoran +Xenophoridae +xenophthalmia +xenophya +xenopodid +Xenopodidae +xenopodoid +Xenopsylla +xenopteran +Xenopteri +xenopterygian +Xenopterygii +Xenopus +Xenorhynchus +Xenos +xenosaurid +Xenosauridae +xenosauroid +Xenosaurus +xenotime +Xenurus +xenyl +xenylamine +xerafin +xeransis +Xeranthemum +xeranthemum +xerantic +xerarch +xerasia +Xeres +xeric +xerically +xeriff +xerocline +xeroderma +xerodermatic +xerodermatous +xerodermia +xerodermic +xerogel +xerography +xeroma +xeromata +xeromenia +xeromorph +xeromorphic +xeromorphous +xeromorphy +xeromyron +xeromyrum +xeronate +xeronic +xerophagia +xerophagy +xerophil +xerophile +xerophilous +xerophily +xerophobous +xerophthalmia +xerophthalmos +xerophthalmy +Xerophyllum +xerophyte +xerophytic +xerophytically +xerophytism +xeroprinting +xerosis +xerostoma +xerostomia +xerotes +xerotherm +xerotic +xerotocia +xerotripsis +Xerus +xi +Xicak +Xicaque +Ximenia +Xina +Xinca +Xipe +Xiphias +xiphias +xiphihumeralis +xiphiid +Xiphiidae +xiphiiform +xiphioid +xiphiplastra +xiphiplastral +xiphiplastron +xiphisterna +xiphisternal +xiphisternum +Xiphisura +xiphisuran +Xiphiura +Xiphius +xiphocostal +Xiphodon +Xiphodontidae +xiphodynia +xiphoid +xiphoidal +xiphoidian +xiphopagic +xiphopagous +xiphopagus +xiphophyllous +xiphosterna +xiphosternum +Xiphosura +xiphosuran +xiphosure +Xiphosuridae +xiphosurous +Xiphosurus +xiphuous +Xiphura +Xiphydria +xiphydriid +Xiphydriidae +Xiraxara +Xmas +xoana +xoanon +Xosa +xurel +xyla +xylan +Xylaria +Xylariaceae +xylate +Xyleborus +xylem +xylene +xylenol +xylenyl +xyletic +Xylia +xylic +xylidic +xylidine +Xylina +xylindein +xylinid +xylite +xylitol +xylitone +xylobalsamum +xylocarp +xylocarpous +Xylocopa +xylocopid +Xylocopidae +xylogen +xyloglyphy +xylograph +xylographer +xylographic +xylographical +xylographically +xylography +xyloid +xyloidin +xylol +xylology +xyloma +xylomancy +xylometer +xylon +xylonic +Xylonite +xylonitrile +Xylophaga +xylophagan +xylophage +xylophagid +Xylophagidae +xylophagous +Xylophagus +xylophilous +xylophone +xylophonic +xylophonist +Xylopia +xyloplastic +xylopyrography +xyloquinone +xylorcin +xylorcinol +xylose +xyloside +Xylosma +xylostroma +xylostromata +xylostromatoid +xylotile +xylotomist +xylotomous +xylotomy +Xylotrya +xylotypographic +xylotypography +xyloyl +xylyl +xylylene +xylylic +xyphoid +Xyrichthys +xyrid +Xyridaceae +xyridaceous +Xyridales +Xyris +xyst +xyster +xysti +xystos +xystum +xystus +Y +y +ya +yaba +yabber +yabbi +yabble +yabby +yabu +yacal +yacca +yachan +yacht +yachtdom +yachter +yachting +yachtist +yachtman +yachtmanship +yachtsman +yachtsmanlike +yachtsmanship +yachtswoman +yachty +yad +Yadava +yade +yaff +yaffingale +yaffle +yagger +yaghourt +yagi +Yagnob +yagourundi +Yagua +yagua +yaguarundi +yaguaza +yah +yahan +Yahgan +Yahganan +Yahoo +yahoo +Yahoodom +Yahooish +Yahooism +Yahuna +Yahuskin +Yahweh +Yahwism +Yahwist +Yahwistic +yair +yaird +yaje +yajeine +yajenine +Yajna +Yajnavalkya +yajnopavita +yak +Yaka +Yakala +yakalo +yakamik +Yakan +yakattalo +Yakima +yakin +yakka +yakman +Yakona +Yakonan +Yakut +Yakutat +yalb +Yale +yale +Yalensian +yali +yalla +yallaer +yallow +yam +Yamacraw +Yamamadi +yamamai +yamanai +yamaskite +Yamassee +Yamato +Yamel +yamen +Yameo +yamilke +yammadji +yammer +yamp +yampa +yamph +yamshik +yamstchik +yan +Yana +Yanan +yancopin +yander +yang +yangtao +yank +Yankee +Yankeedom +Yankeefy +Yankeeism +Yankeeist +Yankeeize +Yankeeland +Yankeeness +yanking +Yankton +Yanktonai +yanky +Yannigan +Yao +yaoort +yaourti +yap +yapa +yaply +Yapman +yapness +yapok +yapp +yapped +yapper +yappiness +yapping +yappingly +yappish +yappy +yapster +Yaqui +Yaquina +yar +yarak +yaray +yarb +Yarborough +yard +yardage +yardang +yardarm +yarder +yardful +yarding +yardkeep +yardland +yardman +yardmaster +yardsman +yardstick +yardwand +yare +yareta +yark +Yarkand +yarke +yarl +yarly +yarm +yarn +yarnen +yarner +yarnwindle +yarpha +yarr +yarraman +yarran +yarringle +yarrow +yarth +yarthen +Yaru +Yarura +Yaruran +Yaruro +yarwhelp +yarwhip +yas +yashiro +yashmak +Yasht +Yasna +yat +yataghan +yatalite +yate +yati +Yatigan +yatter +Yatvyag +Yauapery +yaud +yauld +yaupon +yautia +yava +Yavapai +yaw +yawl +yawler +yawlsman +yawmeter +yawn +yawner +yawney +yawnful +yawnfully +yawnily +yawniness +yawning +yawningly +yawnproof +yawnups +yawny +yawp +yawper +yawroot +yaws +yawweed +yawy +yaxche +yaya +Yazdegerdian +Yazoo +ycie +yday +ye +yea +yeah +yealing +yean +yeanling +year +yeara +yearbird +yearbook +yeard +yearday +yearful +yearling +yearlong +yearly +yearn +yearnful +yearnfully +yearnfulness +yearning +yearnling +yearock +yearth +yeast +yeastily +yeastiness +yeasting +yeastlike +yeasty +yeat +yeather +yed +yede +yee +yeel +yeelaman +yees +yegg +yeggman +yeguita +yeld +yeldrin +yeldrock +yelk +yell +yeller +yelling +yelloch +yellow +yellowammer +yellowback +yellowbelly +yellowberry +yellowbill +yellowbird +yellowcrown +yellowcup +yellowfin +yellowfish +yellowhammer +yellowhead +yellowing +yellowish +yellowishness +Yellowknife +yellowlegs +yellowly +yellowness +yellowroot +yellowrump +yellows +yellowseed +yellowshank +yellowshanks +yellowshins +yellowtail +yellowthorn +yellowthroat +yellowtop +yellowware +yellowweed +yellowwood +yellowwort +yellowy +yelm +yelmer +yelp +yelper +yelt +Yemen +Yemeni +Yemenic +Yemenite +yen +yender +Yengee +Yengeese +yeni +Yenisei +Yeniseian +yenite +yentnite +yeo +yeoman +yeomaness +yeomanette +yeomanhood +yeomanlike +yeomanly +yeomanry +yeomanwise +yeorling +yeowoman +yep +yer +Yerava +Yeraver +yerb +yerba +yercum +yerd +yere +yerga +yerk +yern +yerth +yes +yese +Yeshibah +Yeshiva +yeso +yesso +yest +yester +yesterday +yestereve +yestereven +yesterevening +yestermorn +yestermorning +yestern +yesternight +yesternoon +yesterweek +yesteryear +yestreen +yesty +yet +yeta +yetapa +yeth +yether +yetlin +yeuk +yeukieness +yeuky +yeven +yew +yex +yez +Yezdi +Yezidi +yezzy +ygapo +Yid +Yiddish +Yiddisher +Yiddishism +Yiddishist +yield +yieldable +yieldableness +yieldance +yielden +yielder +yielding +yieldingly +yieldingness +yieldy +yigh +Yikirgaulit +Yildun +yill +yilt +Yin +yin +yince +yinst +yip +yird +yirk +yirm +yirmilik +yirn +yirr +yirth +yis +yite +ym +yn +ynambu +yo +yobi +yocco +yochel +yock +yockel +yodel +yodeler +yodelist +yodh +yoe +yoga +yogasana +yogh +yoghurt +yogi +yogin +yogism +yogist +yogoite +yohimbe +yohimbi +yohimbine +yohimbinization +yohimbinize +yoi +yoick +yoicks +yojan +yojana +Yojuane +yok +yoke +yokeable +yokeableness +yokeage +yokefellow +yokel +yokeldom +yokeless +yokelish +yokelism +yokelry +yokemate +yokemating +yoker +yokewise +yokewood +yoking +Yokuts +yoky +yolden +Yoldia +yoldring +yolk +yolked +yolkiness +yolkless +yolky +yom +yomer +Yomud +yon +yoncopin +yond +yonder +Yonkalla +yonner +yonside +yont +yook +yoop +yor +yore +yoretime +york +Yorker +yorker +Yorkish +Yorkist +Yorkshire +Yorkshireism +Yorkshireman +Yoruba +Yoruban +yot +yotacism +yotacize +yote +you +youd +youden +youdendrift +youdith +youff +youl +young +youngberry +younger +younghearted +youngish +younglet +youngling +youngly +youngness +youngster +youngun +younker +youp +your +yourn +yours +yoursel +yourself +yourselves +youse +youth +youthen +youthful +youthfullity +youthfully +youthfulness +youthhead +youthheid +youthhood +youthily +youthless +youthlessness +youthlike +youthlikeness +youthsome +youthtide +youthwort +youthy +youve +youward +youwards +youze +yoven +yow +yowie +yowl +yowler +yowley +yowlring +yowt +yox +yoy +yperite +Yponomeuta +Yponomeutid +Yponomeutidae +ypsiliform +ypsiloid +Ypurinan +Yquem +yr +ytterbia +ytterbic +ytterbium +yttria +yttrialite +yttric +yttriferous +yttrious +yttrium +yttrocerite +yttrocolumbite +yttrocrasite +yttrofluorite +yttrogummite +yttrotantalite +Yuan +yuan +Yuapin +yuca +Yucatec +Yucatecan +Yucateco +Yucca +yucca +Yuchi +yuck +yuckel +yucker +yuckle +yucky +Yuechi +yuft +Yuga +yugada +Yugoslav +Yugoslavian +Yugoslavic +yuh +Yuit +Yukaghir +Yuki +Yukian +yukkel +yulan +yule +yuleblock +yuletide +Yuma +Yuman +yummy +Yun +Yunca +Yuncan +yungan +Yunnanese +Yurak +Yurok +yurt +yurta +Yurucare +Yurucarean +Yurucari +Yurujure +Yuruk +Yuruna +Yurupary +yus +yusdrum +Yustaga +yutu +yuzlik +yuzluk +Yvonne +Z +z +za +Zabaean +zabaglione +Zabaism +Zaberma +zabeta +Zabian +Zabism +zabra +zabti +zabtie +zac +zacate +Zacatec +Zacateco +zacaton +Zach +Zachariah +zachun +zad +Zadokite +zadruga +zaffar +zaffer +zafree +zag +zagged +Zaglossus +zaibatsu +zain +Zaitha +zak +zakkeu +Zaklohpakap +zalambdodont +Zalambdodonta +Zalophus +zaman +zamang +zamarra +zamarro +Zambal +Zambezian +zambo +zamboorak +Zamenis +Zamia +Zamiaceae +Zamicrus +zamindar +zamindari +zamorin +zamouse +Zan +Zanclidae +Zanclodon +Zanclodontidae +Zande +zander +zandmole +zanella +Zaniah +Zannichellia +Zannichelliaceae +Zanonia +zant +zante +Zantedeschia +zantewood +Zanthorrhiza +Zanthoxylaceae +Zanthoxylum +zanthoxylum +Zantiot +zantiote +zany +zanyish +zanyism +zanyship +Zanzalian +zanze +Zanzibari +Zapara +Zaparan +Zaparo +Zaparoan +zapas +zapatero +zaphara +Zaphetic +zaphrentid +Zaphrentidae +Zaphrentis +zaphrentoid +Zapodidae +Zapodinae +Zaporogian +Zaporogue +zapota +Zapotec +Zapotecan +Zapoteco +zaptiah +zaptieh +Zaptoeca +zapupe +Zapus +zaqqum +Zaque +zar +zarabanda +Zaramo +Zarathustrian +Zarathustrianism +Zarathustrism +zaratite +Zardushti +zareba +Zarema +zarf +zarnich +zarp +zarzuela +zat +zati +zattare +Zaurak +Zauschneria +Zavijava +zax +zayat +zayin +Zea +zeal +Zealander +zealful +zealless +zeallessness +zealot +zealotic +zealotical +zealotism +zealotist +zealotry +zealous +zealously +zealousness +zealousy +zealproof +zebra +zebraic +zebralike +zebrass +zebrawood +Zebrina +zebrine +zebrinny +zebroid +zebrula +zebrule +zebu +zebub +Zebulunite +zeburro +zecchini +zecchino +zechin +Zechstein +zed +zedoary +zee +zeed +Zeelander +Zeguha +zehner +Zeidae +zein +zeism +zeist +Zeke +zel +Zelanian +zelator +zelatrice +zelatrix +Zelkova +Zeltinger +zemeism +zemi +zemimdari +zemindar +zemmi +zemni +zemstroist +zemstvo +Zen +Zenaga +Zenaida +Zenaidinae +Zenaidura +zenana +Zend +Zendic +zendician +zendik +zendikite +Zenelophon +zenick +zenith +zenithal +zenithward +zenithwards +Zenobia +zenocentric +zenographic +zenographical +zenography +Zenonian +Zenonic +zenu +Zeoidei +zeolite +zeolitic +zeolitization +zeolitize +zeoscope +Zep +zepharovichite +zephyr +Zephyranthes +zephyrean +zephyrless +zephyrlike +zephyrous +zephyrus +zephyry +Zeppelin +zeppelin +zequin +zer +zerda +Zerma +zermahbub +zero +zeroaxial +zeroize +zerumbet +zest +zestful +zestfully +zestfulness +zesty +zeta +zetacism +zetetic +Zeuctocoelomata +zeuctocoelomatic +zeuctocoelomic +Zeuglodon +zeuglodon +zeuglodont +Zeuglodonta +Zeuglodontia +Zeuglodontidae +zeuglodontoid +zeugma +zeugmatic +zeugmatically +Zeugobranchia +Zeugobranchiata +zeunerite +Zeus +Zeuxian +Zeuzera +zeuzerian +Zeuzeridae +Zhmud +ziamet +ziara +ziarat +zibeline +zibet +zibethone +zibetone +zibetum +ziega +zieger +zietrisikite +ziffs +zig +ziganka +ziggurat +zigzag +zigzagged +zigzaggedly +zigzaggedness +zigzagger +zigzaggery +zigzaggy +zigzagwise +zihar +zikurat +Zilla +zillah +zimarra +zimb +zimbabwe +zimbalon +zimbaloon +zimbi +zimentwater +zimme +Zimmerwaldian +Zimmerwaldist +zimmi +zimmis +zimocca +zinc +Zincalo +zincate +zincic +zincide +zinciferous +zincification +zincify +zincing +zincite +zincize +zincke +zincky +zinco +zincograph +zincographer +zincographic +zincographical +zincography +zincotype +zincous +zincum +zincuret +zinfandel +zing +zingaresca +zingel +zingerone +Zingiber +Zingiberaceae +zingiberaceous +zingiberene +zingiberol +zingiberone +zink +zinkenite +Zinnia +zinnwaldite +zinsang +zinyamunga +Zinzar +Zinziberaceae +zinziberaceous +Zion +Zionism +Zionist +Zionistic +Zionite +Zionless +Zionward +zip +Zipa +ziphian +Ziphiidae +Ziphiinae +ziphioid +Ziphius +Zipper +zipper +zipping +zippingly +zippy +Zips +zira +zirai +Zirak +Zirbanit +zircite +zircofluoride +zircon +zirconate +zirconia +zirconian +zirconic +zirconiferous +zirconifluoride +zirconium +zirconofluoride +zirconoid +zirconyl +Zirian +Zirianian +zirkelite +zither +zitherist +Zizania +Zizia +Zizyphus +zizz +zloty +Zmudz +zo +Zoa +zoa +zoacum +Zoanthacea +zoanthacean +Zoantharia +zoantharian +zoanthid +Zoanthidae +Zoanthidea +zoanthodeme +zoanthodemic +zoanthoid +zoanthropy +Zoanthus +Zoarces +zoarcidae +zoaria +zoarial +Zoarite +zoarium +zobo +zobtenite +zocco +zoccolo +zodiac +zodiacal +zodiophilous +zoea +zoeaform +zoeal +zoeform +zoehemera +zoehemerae +zoetic +zoetrope +zoetropic +zogan +zogo +Zohak +Zoharist +Zoharite +zoiatria +zoiatrics +zoic +zoid +zoidiophilous +zoidogamous +Zoilean +Zoilism +Zoilist +zoisite +zoisitization +zoism +zoist +zoistic +zokor +Zolaesque +Zolaism +Zolaist +Zolaistic +Zolaize +zoll +zolle +Zollernia +zollpfund +zolotink +zolotnik +zombi +zombie +zombiism +zomotherapeutic +zomotherapy +zonal +zonality +zonally +zonar +Zonaria +zonary +zonate +zonated +zonation +zone +zoned +zoneless +zonelet +zonelike +zonesthesia +Zongora +zonic +zoniferous +zoning +zonite +Zonites +zonitid +Zonitidae +Zonitoides +zonochlorite +zonociliate +zonoid +zonolimnetic +zonoplacental +Zonoplacentalia +zonoskeleton +Zonotrichia +Zonta +Zontian +zonular +zonule +zonulet +zonure +zonurid +Zonuridae +zonuroid +Zonurus +zoo +zoobenthos +zooblast +zoocarp +zoocecidium +zoochemical +zoochemistry +zoochemy +Zoochlorella +zoochore +zoocoenocyte +zoocultural +zooculture +zoocurrent +zoocyst +zoocystic +zoocytial +zoocytium +zoodendria +zoodendrium +zoodynamic +zoodynamics +zooecia +zooecial +zooecium +zooerastia +zooerythrin +zoofulvin +zoogamete +zoogamous +zoogamy +zoogene +zoogenesis +zoogenic +zoogenous +zoogeny +zoogeographer +zoogeographic +zoogeographical +zoogeographically +zoogeography +zoogeological +zoogeologist +zoogeology +zoogloea +zoogloeal +zoogloeic +zoogonic +zoogonidium +zoogonous +zoogony +zoograft +zoografting +zoographer +zoographic +zoographical +zoographically +zoographist +zoography +zooid +zooidal +zooidiophilous +zooks +zoolater +zoolatria +zoolatrous +zoolatry +zoolite +zoolith +zoolithic +zoolitic +zoologer +zoologic +zoological +zoologically +zoologicoarchaeologist +zoologicobotanical +zoologist +zoologize +zoology +zoom +zoomagnetic +zoomagnetism +zoomancy +zoomania +zoomantic +zoomantist +Zoomastigina +Zoomastigoda +zoomechanical +zoomechanics +zoomelanin +zoometric +zoometry +zoomimetic +zoomimic +zoomorph +zoomorphic +zoomorphism +zoomorphize +zoomorphy +zoon +zoonal +zoonerythrin +zoonic +zoonist +zoonite +zoonitic +zoonomia +zoonomic +zoonomical +zoonomist +zoonomy +zoonosis +zoonosologist +zoonosology +zoonotic +zoons +zoonule +zoopaleontology +zoopantheon +zooparasite +zooparasitic +zoopathological +zoopathologist +zoopathology +zoopathy +zooperal +zooperist +zoopery +Zoophaga +zoophagan +Zoophagineae +zoophagous +zoopharmacological +zoopharmacy +zoophile +zoophilia +zoophilic +zoophilism +zoophilist +zoophilite +zoophilitic +zoophilous +zoophily +zoophobia +zoophobous +zoophoric +zoophorus +zoophysical +zoophysics +zoophysiology +Zoophyta +zoophytal +zoophyte +zoophytic +zoophytical +zoophytish +zoophytography +zoophytoid +zoophytological +zoophytologist +zoophytology +zooplankton +zooplanktonic +zooplastic +zooplasty +zoopraxiscope +zoopsia +zoopsychological +zoopsychologist +zoopsychology +zooscopic +zooscopy +zoosis +zoosmosis +zoosperm +zoospermatic +zoospermia +zoospermium +zoosphere +zoosporange +zoosporangia +zoosporangial +zoosporangiophore +zoosporangium +zoospore +zoosporic +zoosporiferous +zoosporocyst +zoosporous +zootaxy +zootechnic +zootechnics +zootechny +zooter +zoothecia +zoothecial +zoothecium +zootheism +zootheist +zootheistic +zootherapy +zoothome +zootic +Zootoca +zootomic +zootomical +zootomically +zootomist +zootomy +zoototemism +zootoxin +zootrophic +zootrophy +zootype +zootypic +zooxanthella +zooxanthellae +zooxanthin +zoozoo +zopilote +Zoque +Zoquean +Zoraptera +zorgite +zoril +zorilla +Zorillinae +zorillo +Zoroastrian +Zoroastrianism +Zoroastrism +Zorotypus +zorrillo +zorro +Zosma +zoster +Zostera +Zosteraceae +zosteriform +Zosteropinae +Zosterops +Zouave +zounds +zowie +Zoysia +Zubeneschamali +zuccarino +zucchetto +zucchini +zudda +zugtierlast +zugtierlaster +zuisin +Zuleika +Zulhijjah +Zulinde +Zulkadah +Zulu +Zuludom +Zuluize +zumatic +zumbooruk +Zuni +Zunian +zunyite +zupanate +Zutugil +zuurveldt +zuza +zwanziger +Zwieback +zwieback +Zwinglian +Zwinglianism +Zwinglianist +zwitter +zwitterion +zwitterionic +zyga +zygadenine +Zygadenus +Zygaena +zygaenid +Zygaenidae +zygal +zygantra +zygantrum +zygapophyseal +zygapophysis +zygion +zygite +Zygnema +Zygnemaceae +Zygnemales +Zygnemataceae +zygnemataceous +Zygnematales +zygobranch +Zygobranchia +Zygobranchiata +zygobranchiate +Zygocactus +zygodactyl +Zygodactylae +Zygodactyli +zygodactylic +zygodactylism +zygodactylous +zygodont +zygolabialis +zygoma +zygomata +zygomatic +zygomaticoauricular +zygomaticoauricularis +zygomaticofacial +zygomaticofrontal +zygomaticomaxillary +zygomaticoorbital +zygomaticosphenoid +zygomaticotemporal +zygomaticum +zygomaticus +zygomaxillare +zygomaxillary +zygomorphic +zygomorphism +zygomorphous +zygomycete +Zygomycetes +zygomycetous +zygon +zygoneure +zygophore +zygophoric +Zygophyceae +zygophyceous +Zygophyllaceae +zygophyllaceous +Zygophyllum +zygophyte +zygopleural +Zygoptera +Zygopteraceae +zygopteran +zygopterid +Zygopterides +Zygopteris +zygopteron +zygopterous +Zygosaccharomyces +zygose +zygosis +zygosperm +zygosphenal +zygosphene +zygosphere +zygosporange +zygosporangium +zygospore +zygosporic +zygosporophore +zygostyle +zygotactic +zygotaxis +zygote +zygotene +zygotic +zygotoblast +zygotoid +zygotomere +zygous +zygozoospore +zymase +zyme +zymic +zymin +zymite +zymogen +zymogene +zymogenesis +zymogenic +zymogenous +zymoid +zymologic +zymological +zymologist +zymology +zymolyis +zymolysis +zymolytic +zymome +zymometer +zymomin +zymophore +zymophoric +zymophosphate +zymophyte +zymoplastic +zymoscope +zymosimeter +zymosis +zymosterol +zymosthenic +zymotechnic +zymotechnical +zymotechnics +zymotechny +zymotic +zymotically +zymotize +zymotoxic +zymurgy +Zyrenian +Zyrian +Zyryan +zythem +Zythia +zythum +Zyzomys +Zyzzogeton diff --git a/python-mega-algo/strings/z_function.py b/python-mega-algo/strings/z_function.py new file mode 100644 index 00000000..d8d823a3 --- /dev/null +++ b/python-mega-algo/strings/z_function.py @@ -0,0 +1,90 @@ +""" +https://cp-algorithms.com/string/z-function.html + +Z-function or Z algorithm + +Efficient algorithm for pattern occurrence in a string + +Time Complexity: O(n) - where n is the length of the string + +""" + + +def z_function(input_str: str) -> list: + """ + For the given string this function computes value for each index, + which represents the maximal length substring starting from the index + and is the same as the prefix of the same size + + e.x. for string 'abab' for second index value would be 2 + + For the value of the first element the algorithm always returns 0 + + >>> z_function("abracadabra") + [0, 0, 0, 1, 0, 1, 0, 4, 0, 0, 1] + >>> z_function("aaaa") + [0, 3, 2, 1] + >>> z_function("zxxzxxz") + [0, 0, 0, 4, 0, 0, 1] + """ + z_result = [0] * len(input_str) + + # initialize interval's left pointer and right pointer + left_pointer, right_pointer = 0, 0 + + for i in range(1, len(input_str)): + # case when current index is inside the interval + if i <= right_pointer: + min_edge = min(right_pointer - i + 1, z_result[i - left_pointer]) + z_result[i] = min_edge + + while go_next(i, z_result, input_str): + z_result[i] += 1 + + # if new index's result gives us more right interval, + # we've to update left_pointer and right_pointer + if i + z_result[i] - 1 > right_pointer: + left_pointer, right_pointer = i, i + z_result[i] - 1 + + return z_result + + +def go_next(i, z_result, s): + """ + Check if we have to move forward to the next characters or not + """ + return i + z_result[i] < len(s) and s[z_result[i]] == s[i + z_result[i]] + + +def find_pattern(pattern: str, input_str: str) -> int: + """ + Example of using z-function for pattern occurrence + Given function returns the number of times 'pattern' + appears in 'input_str' as a substring + + >>> find_pattern("abr", "abracadabra") + 2 + >>> find_pattern("a", "aaaa") + 4 + >>> find_pattern("xz", "zxxzxxz") + 2 + """ + answer = 0 + # concatenate 'pattern' and 'input_str' and call z_function + # with concatenated string + z_result = z_function(pattern + input_str) + + for val in z_result: + # if value is greater then length of the pattern string + # that means this index is starting position of substring + # which is equal to pattern string + if val >= len(pattern): + answer += 1 + + return answer + + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/python-mega-algo/web_programming/__init__.py b/python-mega-algo/web_programming/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python-mega-algo/web_programming/co2_emission.py b/python-mega-algo/web_programming/co2_emission.py new file mode 100644 index 00000000..97927e7e --- /dev/null +++ b/python-mega-algo/web_programming/co2_emission.py @@ -0,0 +1,25 @@ +""" +Get CO2 emission data from the UK CarbonIntensity API +""" +from datetime import date + +import requests + +BASE_URL = "https://api.carbonintensity.org.uk/intensity" + + +# Emission in the last half hour +def fetch_last_half_hour() -> str: + last_half_hour = requests.get(BASE_URL).json()["data"][0] + return last_half_hour["intensity"]["actual"] + + +# Emissions in a specific date range +def fetch_from_to(start, end) -> list: + return requests.get(f"{BASE_URL}/{start}/{end}").json()["data"] + + +if __name__ == "__main__": + for entry in fetch_from_to(start=date(2020, 10, 1), end=date(2020, 10, 3)): + print("from {from} to {to}: {intensity[actual]}".format(**entry)) + print(f"{fetch_last_half_hour() = }") diff --git a/python-mega-algo/web_programming/covid_stats_via_xpath.py b/python-mega-algo/web_programming/covid_stats_via_xpath.py new file mode 100644 index 00000000..85ea5d94 --- /dev/null +++ b/python-mega-algo/web_programming/covid_stats_via_xpath.py @@ -0,0 +1,23 @@ +""" +This is to show simple COVID19 info fetching from worldometers site using lxml +* The main motivation to use lxml in place of bs4 is that it is faster and therefore +more convenient to use in Python web projects (e.g. Django or Flask-based) +""" + +from collections import namedtuple + +import requests +from lxml import html # type: ignore + +covid_data = namedtuple("covid_data", "cases deaths recovered") + + +def covid_stats(url: str = "https://www.worldometers.info/coronavirus/") -> covid_data: + xpath_str = '//div[@class = "maincounter-number"]/span/text()' + return covid_data(*html.fromstring(requests.get(url).content).xpath(xpath_str)) + + +fmt = """Total COVID-19 cases in the world: {} +Total deaths due to COVID-19 in the world: {} +Total COVID-19 patients recovered in the world: {}""" +print(fmt.format(*covid_stats())) diff --git a/python-mega-algo/web_programming/crawl_google_results.py b/python-mega-algo/web_programming/crawl_google_results.py new file mode 100644 index 00000000..a33a3f3b --- /dev/null +++ b/python-mega-algo/web_programming/crawl_google_results.py @@ -0,0 +1,24 @@ +import sys +import webbrowser + +import requests +from bs4 import BeautifulSoup +from fake_useragent import UserAgent + +if __name__ == "__main__": + print("Googling.....") + url = "https://www.google.com/search?q=" + " ".join(sys.argv[1:]) + res = requests.get(url, headers={"UserAgent": UserAgent().random}) + # res.raise_for_status() + with open("project1a.html", "wb") as out_file: # only for knowing the class + for data in res.iter_content(10000): + out_file.write(data) + soup = BeautifulSoup(res.text, "html.parser") + links = list(soup.select(".eZt8xd"))[:5] + + print(len(links)) + for link in links: + if link.text == "Maps": + webbrowser.open(link.get("href")) + else: + webbrowser.open(f"http://google.com{link.get('href')}") diff --git a/python-mega-algo/web_programming/crawl_google_scholar_citation.py b/python-mega-algo/web_programming/crawl_google_scholar_citation.py new file mode 100644 index 00000000..d023380c --- /dev/null +++ b/python-mega-algo/web_programming/crawl_google_scholar_citation.py @@ -0,0 +1,32 @@ +""" +Get the citation from google scholar +using title and year of publication, and volume and pages of journal. +""" + +import requests +from bs4 import BeautifulSoup + + +def get_citation(base_url: str, params: dict) -> str: + """ + Return the citation number. + """ + soup = BeautifulSoup(requests.get(base_url, params=params).content, "html.parser") + div = soup.find("div", attrs={"class": "gs_ri"}) + anchors = div.find("div", attrs={"class": "gs_fl"}).find_all("a") + return anchors[2].get_text() + + +if __name__ == "__main__": + params = { + "title": ( + "Precisely geometry controlled microsupercapacitors for ultrahigh areal " + "capacitance, volumetric capacitance, and energy density" + ), + "journal": "Chem. Mater.", + "volume": 30, + "pages": "3979-3990", + "year": 2018, + "hl": "en", + } + print(get_citation("http://scholar.google.com/scholar_lookup", params=params)) diff --git a/python-mega-algo/web_programming/currency_converter.py b/python-mega-algo/web_programming/currency_converter.py new file mode 100644 index 00000000..447595b0 --- /dev/null +++ b/python-mega-algo/web_programming/currency_converter.py @@ -0,0 +1,192 @@ +""" +This is used to convert the currency using the Amdoren Currency API +https://www.amdoren.com +""" + +import os + +import requests + +URL_BASE = "https://www.amdoren.com/api/currency.php" +TESTING = os.getenv("CI", False) +API_KEY = os.getenv("AMDOREN_API_KEY", "") +if not API_KEY and not TESTING: + raise KeyError("Please put your API key in an environment variable.") + + +# Currency and their description +list_of_currencies = """ +AED United Arab Emirates Dirham +AFN Afghan Afghani +ALL Albanian Lek +AMD Armenian Dram +ANG Netherlands Antillean Guilder +AOA Angolan Kwanza +ARS Argentine Peso +AUD Australian Dollar +AWG Aruban Florin +AZN Azerbaijani Manat +BAM Bosnia & Herzegovina Convertible Mark +BBD Barbadian Dollar +BDT Bangladeshi Taka +BGN Bulgarian Lev +BHD Bahraini Dinar +BIF Burundian Franc +BMD Bermudian Dollar +BND Brunei Dollar +BOB Bolivian Boliviano +BRL Brazilian Real +BSD Bahamian Dollar +BTN Bhutanese Ngultrum +BWP Botswana Pula +BYN Belarus Ruble +BZD Belize Dollar +CAD Canadian Dollar +CDF Congolese Franc +CHF Swiss Franc +CLP Chilean Peso +CNY Chinese Yuan +COP Colombian Peso +CRC Costa Rican Colon +CUC Cuban Convertible Peso +CVE Cape Verdean Escudo +CZK Czech Republic Koruna +DJF Djiboutian Franc +DKK Danish Krone +DOP Dominican Peso +DZD Algerian Dinar +EGP Egyptian Pound +ERN Eritrean Nakfa +ETB Ethiopian Birr +EUR Euro +FJD Fiji Dollar +GBP British Pound Sterling +GEL Georgian Lari +GHS Ghanaian Cedi +GIP Gibraltar Pound +GMD Gambian Dalasi +GNF Guinea Franc +GTQ Guatemalan Quetzal +GYD Guyanaese Dollar +HKD Hong Kong Dollar +HNL Honduran Lempira +HRK Croatian Kuna +HTG Haiti Gourde +HUF Hungarian Forint +IDR Indonesian Rupiah +ILS Israeli Shekel +INR Indian Rupee +IQD Iraqi Dinar +IRR Iranian Rial +ISK Icelandic Krona +JMD Jamaican Dollar +JOD Jordanian Dinar +JPY Japanese Yen +KES Kenyan Shilling +KGS Kyrgystani Som +KHR Cambodian Riel +KMF Comorian Franc +KPW North Korean Won +KRW South Korean Won +KWD Kuwaiti Dinar +KYD Cayman Islands Dollar +KZT Kazakhstan Tenge +LAK Laotian Kip +LBP Lebanese Pound +LKR Sri Lankan Rupee +LRD Liberian Dollar +LSL Lesotho Loti +LYD Libyan Dinar +MAD Moroccan Dirham +MDL Moldovan Leu +MGA Malagasy Ariary +MKD Macedonian Denar +MMK Myanma Kyat +MNT Mongolian Tugrik +MOP Macau Pataca +MRO Mauritanian Ouguiya +MUR Mauritian Rupee +MVR Maldivian Rufiyaa +MWK Malawi Kwacha +MXN Mexican Peso +MYR Malaysian Ringgit +MZN Mozambican Metical +NAD Namibian Dollar +NGN Nigerian Naira +NIO Nicaragua Cordoba +NOK Norwegian Krone +NPR Nepalese Rupee +NZD New Zealand Dollar +OMR Omani Rial +PAB Panamanian Balboa +PEN Peruvian Nuevo Sol +PGK Papua New Guinean Kina +PHP Philippine Peso +PKR Pakistani Rupee +PLN Polish Zloty +PYG Paraguayan Guarani +QAR Qatari Riyal +RON Romanian Leu +RSD Serbian Dinar +RUB Russian Ruble +RWF Rwanda Franc +SAR Saudi Riyal +SBD Solomon Islands Dollar +SCR Seychellois Rupee +SDG Sudanese Pound +SEK Swedish Krona +SGD Singapore Dollar +SHP Saint Helena Pound +SLL Sierra Leonean Leone +SOS Somali Shilling +SRD Surinamese Dollar +SSP South Sudanese Pound +STD Sao Tome and Principe Dobra +SYP Syrian Pound +SZL Swazi Lilangeni +THB Thai Baht +TJS Tajikistan Somoni +TMT Turkmenistani Manat +TND Tunisian Dinar +TOP Tonga Paanga +TRY Turkish Lira +TTD Trinidad and Tobago Dollar +TWD New Taiwan Dollar +TZS Tanzanian Shilling +UAH Ukrainian Hryvnia +UGX Ugandan Shilling +USD United States Dollar +UYU Uruguayan Peso +UZS Uzbekistan Som +VEF Venezuelan Bolivar +VND Vietnamese Dong +VUV Vanuatu Vatu +WST Samoan Tala +XAF Central African CFA franc +XCD East Caribbean Dollar +XOF West African CFA franc +XPF CFP Franc +YER Yemeni Rial +ZAR South African Rand +ZMW Zambian Kwacha +""" + + +def convert_currency( + from_: str = "USD", to: str = "INR", amount: float = 1.0, api_key: str = API_KEY +) -> str: + """https://www.amdoren.com/currency-api/""" + params = locals() + params["from"] = params.pop("from_") + res = requests.get(URL_BASE, params=params).json() + return str(res["amount"]) if res["error"] == 0 else res["error_message"] + + +if __name__ == "__main__": + print( + convert_currency( + input("Enter from currency: ").strip(), + input("Enter to currency: ").strip(), + float(input("Enter the amount: ").strip()), + ) + ) diff --git a/python-mega-algo/web_programming/current_stock_price.py b/python-mega-algo/web_programming/current_stock_price.py new file mode 100644 index 00000000..df44da4e --- /dev/null +++ b/python-mega-algo/web_programming/current_stock_price.py @@ -0,0 +1,14 @@ +import requests +from bs4 import BeautifulSoup + + +def stock_price(symbol: str = "AAPL") -> str: + url = f"https://in.finance.yahoo.com/quote/{symbol}?s={symbol}" + soup = BeautifulSoup(requests.get(url).text, "html.parser") + class_ = "My(6px) Pos(r) smartphone_Mt(6px)" + return soup.find("div", class_=class_).find("span").text + + +if __name__ == "__main__": + for symbol in "AAPL AMZN IBM GOOG MSFT ORCL".split(): + print(f"Current {symbol:<4} stock price is {stock_price(symbol):>8}") diff --git a/python-mega-algo/web_programming/current_weather.py b/python-mega-algo/web_programming/current_weather.py new file mode 100644 index 00000000..e043b438 --- /dev/null +++ b/python-mega-algo/web_programming/current_weather.py @@ -0,0 +1,30 @@ +import requests + +APPID = "" # <-- Put your OpenWeatherMap appid here! +URL_BASE = "http://api.openweathermap.org/data/2.5/" + + +def current_weather(q: str = "Chicago", appid: str = APPID) -> dict: + """https://openweathermap.org/api""" + return requests.get(URL_BASE + "weather", params=locals()).json() + + +def weather_forecast(q: str = "Kolkata, India", appid: str = APPID) -> dict: + """https://openweathermap.org/forecast5""" + return requests.get(URL_BASE + "forecast", params=locals()).json() + + +def weather_onecall(lat: float = 55.68, lon: float = 12.57, appid: str = APPID) -> dict: + """https://openweathermap.org/api/one-call-api""" + return requests.get(URL_BASE + "onecall", params=locals()).json() + + +if __name__ == "__main__": + from pprint import pprint + + while True: + location = input("Enter a location:").strip() + if location: + pprint(current_weather(location)) + else: + break diff --git a/python-mega-algo/web_programming/daily_horoscope.py b/python-mega-algo/web_programming/daily_horoscope.py new file mode 100644 index 00000000..b0dd1cd6 --- /dev/null +++ b/python-mega-algo/web_programming/daily_horoscope.py @@ -0,0 +1,35 @@ +import requests +from bs4 import BeautifulSoup + + +def horoscope(zodiac_sign: int, day: str) -> str: + url = ( + "https://www.horoscope.com/us/horoscopes/general/" + f"horoscope-general-daily-{day}.aspx?sign={zodiac_sign}" + ) + soup = BeautifulSoup(requests.get(url).content, "html.parser") + return soup.find("div", class_="main-horoscope").p.text + + +if __name__ == "__main__": + print("Daily Horoscope. \n") + print( + "enter your Zodiac sign number:\n", + "1. Aries\n", + "2. Taurus\n", + "3. Gemini\n", + "4. Cancer\n", + "5. Leo\n", + "6. Virgo\n", + "7. Libra\n", + "8. Scorpio\n", + "9. Sagittarius\n", + "10. Capricorn\n", + "11. Aquarius\n", + "12. Pisces\n", + ) + zodiac_sign = int(input("number> ").strip()) + print("choose some day:\n", "yesterday\n", "today\n", "tomorrow\n") + day = input("enter the day> ") + horoscope_text = horoscope(zodiac_sign, day) + print(horoscope_text) diff --git a/python-mega-algo/web_programming/emails_from_url.py b/python-mega-algo/web_programming/emails_from_url.py new file mode 100644 index 00000000..0571ac33 --- /dev/null +++ b/python-mega-algo/web_programming/emails_from_url.py @@ -0,0 +1,104 @@ +"""Get the site emails from URL.""" +__author__ = "Muhammad Umer Farooq" +__license__ = "MIT" +__version__ = "1.0.0" +__maintainer__ = "Muhammad Umer Farooq" +__email__ = "contact@muhammadumerfarooq.me" +__status__ = "Alpha" + +import re +from html.parser import HTMLParser +from typing import Optional +from urllib import parse + +import requests + + +class Parser(HTMLParser): + def __init__(self, domain: str) -> None: + super().__init__() + self.urls: list[str] = [] + self.domain = domain + + def handle_starttag(self, tag: str, attrs: list[tuple[str, Optional[str]]]) -> None: + """ + This function parse html to take takes url from tags + """ + # Only parse the 'anchor' tag. + if tag == "a": + # Check the list of defined attributes. + for name, value in attrs: + # If href is defined, and not empty nor # print it. + if name == "href" and value != "#" and value != "": + # If not already in urls. + if value not in self.urls: + url = parse.urljoin(self.domain, value) + self.urls.append(url) + + +# Get main domain name (example.com) +def get_domain_name(url: str) -> str: + """ + This function get the main domain name + + >>> get_domain_name("https://a.b.c.d/e/f?g=h,i=j#k") + 'c.d' + >>> get_domain_name("Not a URL!") + '' + """ + return ".".join(get_sub_domain_name(url).split(".")[-2:]) + + +# Get sub domain name (sub.example.com) +def get_sub_domain_name(url: str) -> str: + """ + >>> get_sub_domain_name("https://a.b.c.d/e/f?g=h,i=j#k") + 'a.b.c.d' + >>> get_sub_domain_name("Not a URL!") + '' + """ + return parse.urlparse(url).netloc + + +def emails_from_url(url: str = "https://github.com") -> list[str]: + """ + This function takes url and return all valid urls + """ + # Get the base domain from the url + domain = get_domain_name(url) + + # Initialize the parser + parser = Parser(domain) + + try: + # Open URL + r = requests.get(url) + + # pass the raw HTML to the parser to get links + parser.feed(r.text) + + # Get links and loop through + valid_emails = set() + for link in parser.urls: + # open URL. + # read = requests.get(link) + try: + read = requests.get(link) + # Get the valid email. + emails = re.findall("[a-zA-Z0-9]+@" + domain, read.text) + # If not in list then append it. + for email in emails: + valid_emails.add(email) + except ValueError: + pass + except ValueError: + exit(-1) + + # Finally return a sorted list of email addresses with no duplicates. + return sorted(valid_emails) + + +if __name__ == "__main__": + emails = emails_from_url("https://github.com") + print(f"{len(emails)} emails found:") + print("\n".join(sorted(emails))) diff --git a/python-mega-algo/web_programming/fetch_bbc_news.py b/python-mega-algo/web_programming/fetch_bbc_news.py new file mode 100644 index 00000000..7f8bc57b --- /dev/null +++ b/python-mega-algo/web_programming/fetch_bbc_news.py @@ -0,0 +1,17 @@ +# Created by sarathkaul on 12/11/19 + +import requests + +_NEWS_API = "https://newsapi.org/v1/articles?source=bbc-news&sortBy=top&apiKey=" + + +def fetch_bbc_news(bbc_news_api_key: str) -> None: + # fetching a list of articles in json format + bbc_news_page = requests.get(_NEWS_API + bbc_news_api_key).json() + # each article in the list is a dict + for i, article in enumerate(bbc_news_page["articles"], 1): + print(f"{i}.) {article['title']}") + + +if __name__ == "__main__": + fetch_bbc_news(bbc_news_api_key="") diff --git a/python-mega-algo/web_programming/fetch_github_info.py b/python-mega-algo/web_programming/fetch_github_info.py new file mode 100644 index 00000000..c9198460 --- /dev/null +++ b/python-mega-algo/web_programming/fetch_github_info.py @@ -0,0 +1,50 @@ +#!/usr/bin/env python3 +""" +Created by sarathkaul on 14/11/19 +Updated by lawric1 on 24/11/20 + +Authentication will be made via access token. +To generate your personal access token visit https://github.com/settings/tokens. + +NOTE: +Never hardcode any credential information in the code. Always use an environment +file to store the private information and use the `os` module to get the information +during runtime. + +Create a ".env" file in the root directory and write these two lines in that file +with your token:: + +#!/usr/bin/env bash +export USER_TOKEN="" +""" +import os +from typing import Any, Dict + +import requests + +BASE_URL = "https://api.github.com" + +# https://docs.github.com/en/free-pro-team@latest/rest/reference/users#get-the-authenticated-user +AUTHENTICATED_USER_ENDPOINT = BASE_URL + "/user" + +# https://github.com/settings/tokens +USER_TOKEN = os.environ.get("USER_TOKEN", "") + + +def fetch_github_info(auth_token: str) -> Dict[Any, Any]: + """ + Fetch GitHub info of a user using the requests module + """ + headers = { + "Authorization": f"token {auth_token}", + "Accept": "application/vnd.github.v3+json", + } + return requests.get(AUTHENTICATED_USER_ENDPOINT, headers=headers).json() + + +if __name__ == "__main__": # pragma: no cover + if USER_TOKEN: + for key, value in fetch_github_info(USER_TOKEN).items(): + print(f"{key}: {value}") + else: + raise ValueError("'USER_TOKEN' field cannot be empty.") diff --git a/python-mega-algo/web_programming/fetch_jobs.py b/python-mega-algo/web_programming/fetch_jobs.py new file mode 100644 index 00000000..bb2171e1 --- /dev/null +++ b/python-mega-algo/web_programming/fetch_jobs.py @@ -0,0 +1,25 @@ +""" +Scraping jobs given job title and location from indeed website +""" +from __future__ import annotations + +from typing import Generator + +import requests +from bs4 import BeautifulSoup + +url = "https://www.indeed.co.in/jobs?q=mobile+app+development&l=" + + +def fetch_jobs(location: str = "mumbai") -> Generator[tuple[str, str], None, None]: + soup = BeautifulSoup(requests.get(url + location).content, "html.parser") + # This attribute finds out all the specifics listed in a job + for job in soup.find_all("div", attrs={"data-tn-component": "organicJob"}): + job_title = job.find("a", attrs={"data-tn-element": "jobTitle"}).text.strip() + company_name = job.find("span", {"class": "company"}).text.strip() + yield job_title, company_name + + +if __name__ == "__main__": + for i, job in enumerate(fetch_jobs("Bangalore"), 1): + print(f"Job {i:>2} is {job[0]} at {job[1]}") diff --git a/python-mega-algo/web_programming/get_imdb_top_250_movies_csv.py b/python-mega-algo/web_programming/get_imdb_top_250_movies_csv.py new file mode 100644 index 00000000..e54b076e --- /dev/null +++ b/python-mega-algo/web_programming/get_imdb_top_250_movies_csv.py @@ -0,0 +1,30 @@ +from __future__ import annotations + +import csv + +import requests +from bs4 import BeautifulSoup + + +def get_imdb_top_250_movies(url: str = "") -> dict[str, float]: + url = url or "https://www.imdb.com/chart/top/?ref_=nv_mv_250" + soup = BeautifulSoup(requests.get(url).text, "html.parser") + titles = soup.find_all("td", attrs="titleColumn") + ratings = soup.find_all("td", class_="ratingColumn imdbRating") + return { + title.a.text: float(rating.strong.text) + for title, rating in zip(titles, ratings) + } + + +def write_movies(filename: str = "IMDb_Top_250_Movies.csv") -> None: + movies = get_imdb_top_250_movies() + with open(filename, "w", newline="") as out_file: + writer = csv.writer(out_file) + writer.writerow(["Movie title", "IMDb rating"]) + for title, rating in movies.items(): + writer.writerow([title, rating]) + + +if __name__ == "__main__": + write_movies() diff --git a/python-mega-algo/web_programming/get_imdbtop.py b/python-mega-algo/web_programming/get_imdbtop.py new file mode 100644 index 00000000..669e7f89 --- /dev/null +++ b/python-mega-algo/web_programming/get_imdbtop.py @@ -0,0 +1,20 @@ +import requests +from bs4 import BeautifulSoup + + +def imdb_top(imdb_top_n): + base_url = ( + f"https://www.imdb.com/search/title?title_type=" + f"feature&sort=num_votes,desc&count={imdb_top_n}" + ) + source = BeautifulSoup(requests.get(base_url).content, "html.parser") + for m in source.findAll("div", class_="lister-item mode-advanced"): + print("\n" + m.h3.a.text) # movie's name + print(m.find("span", attrs={"class": "genre"}).text) # genre + print(m.strong.text) # movie's rating + print(f"https://www.imdb.com{m.a.get('href')}") # movie's page link + print("*" * 40) + + +if __name__ == "__main__": + imdb_top(input("How many movies would you like to see? ")) diff --git a/python-mega-algo/web_programming/instagram_crawler.py b/python-mega-algo/web_programming/instagram_crawler.py new file mode 100644 index 00000000..4536257a --- /dev/null +++ b/python-mega-algo/web_programming/instagram_crawler.py @@ -0,0 +1,140 @@ +#!/usr/bin/env python3 +from __future__ import annotations + +import json + +import requests +from bs4 import BeautifulSoup +from fake_useragent import UserAgent + +headers = {"UserAgent": UserAgent().random} + + +def extract_user_profile(script) -> dict: + """ + May raise json.decoder.JSONDecodeError + """ + data = script.contents[0] + info = json.loads(data[data.find('{"config"') : -1]) + return info["entry_data"]["ProfilePage"][0]["graphql"]["user"] + + +class InstagramUser: + """ + Class Instagram crawl instagram user information + + Usage: (doctest failing on GitHub Actions) + # >>> instagram_user = InstagramUser("github") + # >>> instagram_user.is_verified + True + # >>> instagram_user.biography + 'Built for developers.' + """ + + def __init__(self, username): + self.url = f"https://www.instagram.com/{username}/" + self.user_data = self.get_json() + + def get_json(self) -> dict: + """ + Return a dict of user information + """ + html = requests.get(self.url, headers=headers).text + scripts = BeautifulSoup(html, "html.parser").find_all("script") + try: + return extract_user_profile(scripts[4]) + except (json.decoder.JSONDecodeError, KeyError): + return extract_user_profile(scripts[3]) + + def __repr__(self) -> str: + return f"{self.__class__.__name__}('{self.username}')" + + def __str__(self) -> str: + return f"{self.fullname} ({self.username}) is {self.biography}" + + @property + def username(self) -> str: + return self.user_data["username"] + + @property + def fullname(self) -> str: + return self.user_data["full_name"] + + @property + def biography(self) -> str: + return self.user_data["biography"] + + @property + def email(self) -> str: + return self.user_data["business_email"] + + @property + def website(self) -> str: + return self.user_data["external_url"] + + @property + def number_of_followers(self) -> int: + return self.user_data["edge_followed_by"]["count"] + + @property + def number_of_followings(self) -> int: + return self.user_data["edge_follow"]["count"] + + @property + def number_of_posts(self) -> int: + return self.user_data["edge_owner_to_timeline_media"]["count"] + + @property + def profile_picture_url(self) -> str: + return self.user_data["profile_pic_url_hd"] + + @property + def is_verified(self) -> bool: + return self.user_data["is_verified"] + + @property + def is_private(self) -> bool: + return self.user_data["is_private"] + + +def test_instagram_user(username: str = "github") -> None: + """ + A self running doctest + >>> test_instagram_user() + """ + import os + + if os.environ.get("CI"): + return None # test failing on GitHub Actions + instagram_user = InstagramUser(username) + assert instagram_user.user_data + assert isinstance(instagram_user.user_data, dict) + assert instagram_user.username == username + if username != "github": + return + assert instagram_user.fullname == "GitHub" + assert instagram_user.biography == "Built for developers." + assert instagram_user.number_of_posts > 150 + assert instagram_user.number_of_followers > 120000 + assert instagram_user.number_of_followings > 15 + assert instagram_user.email == "support@github.com" + assert instagram_user.website == "https://github.com/readme" + assert instagram_user.profile_picture_url.startswith("https://instagram.") + assert instagram_user.is_verified is True + assert instagram_user.is_private is False + + +if __name__ == "__main__": + import doctest + + doctest.testmod() + instagram_user = InstagramUser("github") + print(instagram_user) + print(f"{instagram_user.number_of_posts = }") + print(f"{instagram_user.number_of_followers = }") + print(f"{instagram_user.number_of_followings = }") + print(f"{instagram_user.email = }") + print(f"{instagram_user.website = }") + print(f"{instagram_user.profile_picture_url = }") + print(f"{instagram_user.is_verified = }") + print(f"{instagram_user.is_private = }") diff --git a/python-mega-algo/web_programming/instagram_pic.py b/python-mega-algo/web_programming/instagram_pic.py new file mode 100644 index 00000000..8521da67 --- /dev/null +++ b/python-mega-algo/web_programming/instagram_pic.py @@ -0,0 +1,16 @@ +from datetime import datetime + +import requests +from bs4 import BeautifulSoup + +if __name__ == "__main__": + url = input("Enter image url: ").strip() + print(f"Downloading image from {url} ...") + soup = BeautifulSoup(requests.get(url).content, "html.parser") + # The image URL is in the content field of the first meta tag with property og:image + image_url = soup.find("meta", {"property": "og:image"})["content"] + image_data = requests.get(image_url).content + file_name = f"{datetime.now():%Y-%m-%d_%H:%M:%S}.jpg" + with open(file_name, "wb") as fp: + fp.write(image_data) + print(f"Done. Image saved to disk as {file_name}.") diff --git a/python-mega-algo/web_programming/instagram_video.py b/python-mega-algo/web_programming/instagram_video.py new file mode 100644 index 00000000..243cece1 --- /dev/null +++ b/python-mega-algo/web_programming/instagram_video.py @@ -0,0 +1,17 @@ +from datetime import datetime + +import requests + + +def download_video(url: str) -> bytes: + base_url = "https://downloadgram.net/wp-json/wppress/video-downloader/video?url=" + video_url = requests.get(base_url + url).json()[0]["urls"][0]["src"] + return requests.get(video_url).content + + +if __name__ == "__main__": + url = input("Enter Video/IGTV url: ").strip() + file_name = f"{datetime.now():%Y-%m-%d_%H:%M:%S}.mp4" + with open(file_name, "wb") as fp: + fp.write(download_video(url)) + print(f"Done. Video saved to disk as {file_name}.") diff --git a/python-mega-algo/web_programming/recaptcha_verification.py b/python-mega-algo/web_programming/recaptcha_verification.py new file mode 100644 index 00000000..47c6c42f --- /dev/null +++ b/python-mega-algo/web_programming/recaptcha_verification.py @@ -0,0 +1,66 @@ +""" +Recaptcha is a free captcha service offered by Google in order to secure websites and +forms. At https://www.google.com/recaptcha/admin/create you can create new recaptcha +keys and see the keys that your have already created. +* Keep in mind that recaptcha doesn't work with localhost +When you create a recaptcha key, your will get two separate keys: ClientKey & SecretKey. +ClientKey should be kept in your site's front end +SecretKey should be kept in your site's back end + +# An example HTML login form with recaptcha tag is shown below + +
    +

    Log in

    + {% csrf_token %} +
    + +
    +
    + +
    +
    + +
    + +
    +
    + + + + +Below a Django function for the views.py file contains a login form for demonstrating +recaptcha verification. +""" +import requests + +try: + from django.contrib.auth import authenticate, login + from django.shortcuts import redirect, render +except ImportError: + authenticate = login = render = redirect = print + + +def login_using_recaptcha(request): + # Enter your recaptcha secret key here + secret_key = "secretKey" + url = "https://www.google.com/recaptcha/api/siteverify" + + # when method is not POST, direct user to login page + if request.method != "POST": + return render(request, "login.html") + + # from the frontend, get username, password, and client_key + username = request.POST.get("username") + password = request.POST.get("password") + client_key = request.POST.get("g-recaptcha-response") + + # post recaptcha response to Google's recaptcha api + response = requests.post(url, data={"secret": secret_key, "response": client_key}) + # if the recaptcha api verified our keys + if response.json().get("success", False): + # authenticate the user + user_in_database = authenticate(request, username=username, password=password) + if user_in_database: + login(request, user_in_database) + return redirect("/your-webpage") + return render(request, "login.html") diff --git a/python-mega-algo/web_programming/right.html b/python-mega-algo/web_programming/right.html new file mode 100644 index 00000000..b9a4df1c --- /dev/null +++ b/python-mega-algo/web_programming/right.html @@ -0,0 +1,34 @@ + + + + + +C:/Users/bryan/Downloads/PYTHON-REPO/python-mega-algo/web_programming + + + + + + + + +
    Folders
    <Go Back>
    +
    + + + + + + + + + +
    FileFileFileFile
    co2_emission.py current_weather.py get_imdbtop.py recaptcha...ion.py 
    covid_sta...ath.py daily_horoscope.py get_imdb_...csv.py slack_message.py 
    crawl_goo...lts.py emails_from_url.py instagram...ler.py test_fetc...nfo.py 
    crawl_goo...ion.py fetch_bbc_news.py instagram_pic.py world_cov...ats.py 
    currency_...ter.py fetch_git...nfo.py instagram_video.py __init__.py 
    current_s...ice.py fetch_jobs.py 
    + +

    +Folders: 1
    +Files: 22
    +Size of all files: 27866 KB

    + + + \ No newline at end of file diff --git a/python-mega-algo/web_programming/slack_message.py b/python-mega-algo/web_programming/slack_message.py new file mode 100644 index 00000000..f35aa3ca --- /dev/null +++ b/python-mega-algo/web_programming/slack_message.py @@ -0,0 +1,19 @@ +# Created by sarathkaul on 12/11/19 + +import requests + + +def send_slack_message(message_body: str, slack_url: str) -> None: + headers = {"Content-Type": "application/json"} + response = requests.post(slack_url, json={"text": message_body}, headers=headers) + if response.status_code != 200: + raise ValueError( + f"Request to slack returned an error {response.status_code}, " + f"the response is:\n{response.text}" + ) + + +if __name__ == "__main__": + # Set the slack url to the one provided by Slack when you create the webhook at + # https://my.slack.com/services/new/incoming-webhook/ + send_slack_message("", "") diff --git a/python-mega-algo/web_programming/test_fetch_github_info.py b/python-mega-algo/web_programming/test_fetch_github_info.py new file mode 100644 index 00000000..2da97c78 --- /dev/null +++ b/python-mega-algo/web_programming/test_fetch_github_info.py @@ -0,0 +1,27 @@ +import json + +import requests + +from .fetch_github_info import AUTHENTICATED_USER_ENDPOINT, fetch_github_info + + +def test_fetch_github_info(monkeypatch): + class FakeResponse: + def __init__(self, content) -> None: + assert isinstance(content, (bytes, str)) + self.content = content + + def json(self): + return json.loads(self.content) + + def mock_response(*args, **kwargs): + assert args[0] == AUTHENTICATED_USER_ENDPOINT + assert "Authorization" in kwargs["headers"] + assert kwargs["headers"]["Authorization"].startswith("token ") + assert "Accept" in kwargs["headers"] + return FakeResponse(b'{"login":"test","id":1}') + + monkeypatch.setattr(requests, "get", mock_response) + result = fetch_github_info("token") + assert result["login"] == "test" + assert result["id"] == 1 diff --git a/python-mega-algo/web_programming/world_covid19_stats.py b/python-mega-algo/web_programming/world_covid19_stats.py new file mode 100644 index 00000000..1dd1ff6d --- /dev/null +++ b/python-mega-algo/web_programming/world_covid19_stats.py @@ -0,0 +1,27 @@ +#!/usr/bin/env python3 + +""" +Provide the current worldwide COVID-19 statistics. +This data is being scrapped from 'https://www.worldometers.info/coronavirus/'. +""" + +import requests +from bs4 import BeautifulSoup + + +def world_covid19_stats(url: str = "https://www.worldometers.info/coronavirus") -> dict: + """ + Return a dict of current worldwide COVID-19 statistics + """ + soup = BeautifulSoup(requests.get(url).text, "html.parser") + keys = soup.findAll("h1") + values = soup.findAll("div", {"class": "maincounter-number"}) + keys += soup.findAll("span", {"class": "panel-title"}) + values += soup.findAll("div", {"class": "number-table-main"}) + return {key.text.strip(): value.text.strip() for key, value in zip(keys, values)} + + +if __name__ == "__main__": + print("\033[1m" + "COVID-19 Status of the World" + "\033[0m\n") + for key, value in world_covid19_stats().items(): + print(f"{key}\n{value}\n") diff --git a/right.html b/right.html new file mode 100644 index 00000000..f99fb30b --- /dev/null +++ b/right.html @@ -0,0 +1,22 @@ + + + + + +/Users/bryan/Downloads/PYTHON-REPO + + + + + + + + +
    FileFileFileFile
    directory.html left.html 
    + +

    +Files: 2
    +Size of all files: 1716 KB

    + + + \ No newline at end of file

    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%0Aex}QjgBBZAe)o4`CXl;Z)rkhO%=|a z&rxLu=g(h2?&Ulb&<4n=tExpm?@_>J#mDcxj{o)F{~Z72pMIZqST;Sg=;^7%xeG_> z^S5H#?p-)?{4};~-;Znb`@PO6%9}f3rr&ouWry0Ja8NiLU+co;eKzq@w7g1!4UqPXM&R&Pv^DLc)kG9R1oZ)#+z~m>6 z4H2(Wwz~~BT)tL}D+PrL_nU}0+S|zWi1`ef4g{S2XsNga8*P`2M)da7q50YwROKE+ z0neu>kG?nnKn);kzmypDnC>xfO=;<}53lp2h! z@gChka{LBu!Wt5jHxZw>iRkDWLc=QvWEWI`DVUyujU1;-Yvz6IRei*Idc@}#;33{h zQJzM!#89J4*mGbf_8rTso`67?M%!%Y6i3>rDbOjz9ox2u=dEvJ-!`NHTC5?_MQB#(WyvsQR zpC@trguim*CIw>}HVGi8^;s~1M{`Wpxavz_<&qr*dC$S$ zms#tw+^I?Uq}gGb-%01;2*%OV-2k_-6{Fd>+L@N!yylKhw6ry=o&=W*i*SlYW8Yz3 zgA*qpGmFbADo|NfjYbMhR5A-*zl-mG_$oelasyA7hA}nZhKXSM8kO_N=^PrJGdOhS zGWHg9qf(bZc4!ElmJkVp7Z!^dPMcOW8cU`KT7m(BikC(_?8|CkUM&kd!h6)tf+N4#=8TfIvE0uLlu$lvHItj_?@d`vG1jp9Bj+128## zyuNN&2+C}M5XlmOep)gMrc}ToDZ7jWAt^4YS(ew=vlzxy+NL8o04)tjkR(g8T_VXL z)htqWt0hZ8rc3A@KJ?i9zhVcT>;4CH=5IV+#@x&>EOrY?X8}&;oWtSchp>0gW*j-V z6$kdbf=JMT?yffK)>%}OD9FyZ))9k~z*t7Qm`pMnDTd*(6kI+!7dpvQassbEdmVrG zw?D;S|M{o*?eD&h*Y1p{ekJ#p2UM`&`n1gDPGW5_rFxW<7Ukg5#bdZcdvoIC0g{#- zcxCe|c=?r=v2p80y!i49c=44N@#4l8@zN_V@pV}*^YM##dGkwje%rD8;6Cg*B)_{C zIXNd4@qd-}?R#H)3m?693r}xOp|`0NrXK2)i8^lTAyLr7PC#NO2n~CUG{Rbhqd{KJ zq}lxzJ~$yAu7}Y{huPK9jG@tC3{&P}$u!EU z>(Ni=+N-moxV!_q|QJD8odE#i$Tq99v`Eekq~CG zg9Od0pr93axR=9Xpl^gEjUG+{P6L83{Ol_H^wkbhbxhG z85tKJ7jQkNWL5~Z$b6s9f>S&X83U#1??%zJi|FaBh0m$QK+p(lUk&=23o)JXsM^Ku z`U2D!Uqo}+RWuamQU9;Nts{x`IgsWW@>+2-6UMO9fB~D1V8INpp$Ene0xN=xJF^Me zLmOpt9B(~d!`+*Ul-~p$@gPzpF_CCOWp<2DP2$F_dzAAz0;2__vjp;K0;cqgDo2nB zC2}oP4+9|wv<*?}y_BV_mm^VbXxlV)F9D%h1q`&*PYE6f*-$-ANI2vu&n0jm0RkDd zDzC|Nd0loK<+Tp2h4yk-1q#G3h<%Xk1bHr51!hlJ1rq*ey8rs4MWy==hm9bu2xrb; z#Icjduy@}!?AyB$2ls6xDfgkTy8|aroi_2pn z`oAB$_wL5Ui)R$ke0FaI-}~yD_>j8)WNi|f)(RL&Je|facx@U)eMXhqZZWhXKn!4W z=n#pAsrxC&C`&Kzmt+OHsP|411?fE$7+iooLV1-5CbaRx(@VJb^i2c>)J2D=?-Ov6 zT(}4l-O{&6vIPkSy^^+0Y#?PwqWhsi*^ORAWOTiAdU)&xfi#GOD1+s-bt;>%Pj5y^Wvwbj_~I*@@xq3UICAC;iizK@5)Tv-cn_!Ic<+t7m>x+X z;IJY_U+J*QJoa*2ymW~e=^`!{UBelYtjooXXx6(ie)9ng?jY}P7He#)J;vy?$mcMB zcM-wVu)+vY`ZUpb85td;>zTQFhk9&vOByl>7yXMY=}#aT25Pf`*G9fq zf(4SjAbm2VX=0EVpx5G}3`v&T0P)2b@zW4Iams8gi9V|nW^a&o=JQ7;fAHmHJbXBh zh2;feeitqk<|2p0>*(nN*u9&&zk4Hg@A!3|w-Ftbl_N)vpsurv1UW`>?1$Oyhs*DU zk@sX|ascU3`pB@9v<_i%Y!$CPdWwJi3zrqp^cpTeE#_-8AD2MZa6 z!)odG^DiF7#d8O7;`nZC+qns^Y@wcSdKs^5eGy-J<%{^zhA-iTm%fCTXaio}^b$61 z+klrgtz&^5d$;4r(c?IJ_yl%s-Ga;Kj-jWe46hN#{pLrn;v3X~x9%)J+fqUOFNfXG z1dF~F0e=si?k?DzozR)ucn(guLtgk|G0Lcv$BMtE?o*fTiCLH;)3B!(VWU6yiESs| zAD&yrjfank#rQjd&B+7I#03TkF7S7))PD&A=%XWieG2Z(9C5*vDn)S7j<`pz!!@)9 z=g=x#*?A01Em9|j(bQUp_O2EcoQtMX^f75vHxdhI$i1{$RMpfYH}4uYZrX;IUVH_o zPvxMop#|6S3Q&<>j5KZYM{mD|nUOgB&Tb@P)O|-Azq1_qg|xA!$epNXIhU@Xu)GN^ zIuFLzUWMKrfz3zR;oq>(@5^ZBvGH;E$ng@HVPwZ;T;~uXi2?pkBgCU~7@xllDVvj$ z3FY_q@cwQ5B2J&)kEhS>U}Aa{!B_;NGZHKxgPYgIIk*V_@G^Y-{V?rog1@h^IaQ<9 zy5*s zS0-X)y?Wdl3SuH)!YFw_!lg%m{6W`T4s%SeOZ?|HN^hWDS`!{eK4fEXaiB~vhbnFX%J&&tYpp2UA1 z;seP<>$3*Xsk1?E^Qh@(zCaAwf zWJb~5*N^x>454U*wj)cw!22;E6O{&_vDoSNeK2@DzoPrUyq?>E=Rg1IV8PelS;qZa zlgJK+5D2;84wArlT*xag#DSxGaNx);T)uRiH;QCU+e9O$hlzl|7@Oppf-W?!z>eEv z#U#nt+RY^@(>Qeg5m=%^2FEd$iQ_3r*ju*;F_*QF;1QtP+TqeQB4BJn#M%nCz6qL^ z5}Y`;6I%!rw(j1Et$TN2J01U~og@uAxOm*Sb0;?L*!J1l{@;%qwr}Iwf(?BB%1(LA z@7S{)C#e($lHzZ__fXX={`7nA;QcpNkr@nNZZd_{#bFY_0hNv{9lwVXPF$Z!V1~qJ zdTIhwvjl}C#A+l;Vq7&SazuvUhz`S<7*h=k{RD~$I?AP$6)dh&i0B;r{JhjQg#;|} zW{2d4(}BqDa`ZDWDNEASq#2_6ewCKIo}nN+b^@Sfw@pK*Y2&pT%S16iLN1dNq|ua} z1W$GvZT=W~Og5C%G~itRH5@y82FFhw$DV@+N!SZ0kTHDu*=^ifoyPQd8p{(2WaBP1 zU7)U^o{qT=on5>SQ93U=8Iy~OXmmhp3BXL}ZMK+cXzVno7I;Z&E#4R$;S5O>0aQ#H zH1V47C^g(^A-cR40fN}ls&X7Zu@6U&?L`3{c{&+DdPvF?#&{kAme!l~36PeCeG)K` z;DH1TtZvGo#Rw0{iB{8#{DOS7b7bgi#6ZA+OvD6pe=|IWHWGjibQYaN!I?eCIk5*P z_HV`EU7K<8;7*)9whtGM?nD38i^z00q5ASUoFo}8xpWjc$M@jE=|gBL&OumHMLF!i zNX)7N2DerhRWmUek0gBtWUSc$jpg(_6?=j}Cne<~BXG(NGs&|{$|)!xJ_5xc&p}Ev zo*!k-{_~y`vODdGkH8vC!Q_jnd*=ux2qZED`usZt7n0H}#A5wgNDxJOSnw!;0Lq$t zpFEeeSn0}b_L0~H<0Q5N{GIil32HPWU$@gB*<*vhVh5h<{?C5&5#D*@4yL9?Fg7)f zn-5;a)ci6^%1f|k&qf^By8%~okHJh}ZP05}_x&KRiH`tDqQb5~8eSS#m&ZbaIDoHy z@)4|*OPwhMhiibcBdN`Wh=lrZb0LO+wGrm-VszDAAh|n^w(9ffZMlZ-<^r@f6ktF9 z=5PG^zro8JzMufZR+9hCyS8C7^?CD7KIU;F^?JkBP3pLv_F*G+ev|0@woQ0>%Oa;Z{yRieHmYV{XSwoJM_I;)YrD7*I>XLfw0jxh&G)cRjoR7 zX!t&frj|PIBB0di`(d-2VKf@}TuRMC>VJ^tTr#!A5|BwAG6{g7pE_PzS&Adny?y() zCsnY-avj>rLWCu>|-GY6azKE?a{2I1=>DRFN3%`aW>{ubm=o_12ca*vaYzVsV7xb+2;Q@#!DWpHU52(Zk!w>F1c^kKKBzQKUc2gx#rgIPSd-zPDg#@aHkr&|M=*MIBgEany`aqr1P+i;8Edmf@3OYaf?kn}5AR((ri)cb_&Hj_{b z!Ay*=QunX(cUR~SreO>W!y22RO_@-5LdqN6J|B8IThP_njN$QN#0OIZ>il0xUiGxA z5t73&bwyIoW%5ONLo*JXI)g3y_Tx8RcnK$uoyO!y7C-vUkMUjV{UIyHvm$S{4pj0xj8(5K4sQI=K7 zm6UVxb;&Mp1WBHUMj+FrOhygQW3MVX>2I$_mLy;%6Qb_7qo07^PXAwc{wU5I*n$(g zH(~F_FJQ;Z{}wwp{5p^S4qLwXYq(6?5$UbR1(M*+|Mu5Vl5-53e&aW=fAfndyKoqm zj!L-uiGA!^yn1I1ch{~XO5&TQ9!9B0iA0v9VF-8cJj5Vzi^VBfPzf0PX&8eU*uq1^ z02!sHe(I%{m`E}vWyz+JOR`b`j28J>wHO$9SsvtTp zdMuyw@v%#Gxrvc{#34F&7L7a9sIwY8bxSOx(Nb1Au6S<%^ChGbBW>tn>M_8w^Ju0dB%a(C?{wDnhE zXdw=u{`a+(;q>8Ms(fJErWde#$42bkw_TMNY~1paTAR0Rz?SW=VAGZjcxBT|*sxK8 zgWG5yw(>Q8P9}J4-j0`F+JqOs@EbU^XA62-O7W*Z`wsr^|Lt$^$3OfSzw@0BFiqL{ z?l<1XcRzU>x7S9ow#NGv&>)_2W=dMQlGuqCHO{fz)jL9#8^rZBU3jKnZ1oL_1-6a zjEDi;B$n+?;=sf_`oqK)w5?vziGdVa+ndnY+fE|Rzn4iPGciGX?x#<7DjOgr$+2Ws zO}?nCYQT}Br+E!_(uQuv`Qv9WML+eU?|zDJeE4O2`t1+#;YY9It#=>5&8$r?4nV6^aejKuu`epa%7-Sm4wa)lU- zo;3Zw)bY;~`;VclqJ(Fh?_HS_Q++l2g>DO^!%Zn(va0o`q zNPxB^;n3s3@&X>*xPfROjCf=aN$T@JEX`vY_wPPJhQ3uxvfuAaKtum#2#&)-?(3j0 za0Ml>^x4L5VhYaW4D39L>{$7_i|6PhH;}$mZho&ToP;NmMws>>!S}P7B@Ct)=wqkh z=l43j^xwfT+QLy-f$nSyI+6Jew2^NC2&Zc4#xjon<1Y!41Y$0ISv}fmkC;uuSuwy$m@%bw>6tD2{ zD?${wBuKDf#};hd$=69NWLB&YjFYF2p{1@|&DQ+(2lw#(4mqc-Pl0r%0j;5sJHGwU`ze6$tq--EK%ySzexaUm_j}ko5fRivt^k;l} z4tMU{QlKlyYp|XjFr{`8)lMQGON2>wBLngtf6vFG{JukWYkeu+Xf9uxLNTb)lC>o3 z7JUaI1T>SQNmUmg;_tY^G%_|DjT8+u38AF#chN{!G`8WwwIbwPEyU@(LgbZ{6Wlwn zG$X0>(YlM%dhZVfH1kg=QR&K{ycyGHU8qR|*s zPF0M91RB;IsvM~xd@KaqMc}P7J76>590W~Z8%5+v2W)V65bs+zIQv?E}y}0dp%ln&#P41{0qlXz;*HL zQ8bsFN1(S1VQVYFWCX9@oyE$cq*#rs>#dp+a)pv31e1$&F49|Km`?nEka!6Ugt;Pv zlM1v8*$kX)Jvt_VPDllBpoU3Vx5; zh52j=p^(>QCs9(3CDyqj$fd^NJpoWHBb{T%z4m{WWWWs`Q*oMaD z1{9Um;OwPh6=}{dxQ3FF%cv+h2Td2jl)WF_1g^nQ4DCkB0>N{6n;9BQi1vX0gTsu0 z!4U2|x{CpVSErvcke=uNl)}Vx20#D#_wn`jZmMj8XSYW%K48S$kQ2i(Bjs9}Om?D= zphRliw{72mU3;j*TL}!dk^FDlj2E}AAH@!A*|kIIwFC$xIPjwEJdzx2;NuM>5AxoY zUEBG51CF0Kh|2PO%uS^5#=}+o;OlQGz*%wa92zR}apl5Ev^7=Y;oU{NdT$9Iy!8MJ zGs7xCWwhHVhY5l~>LP)mhB~PwFlex#By%q~c# z3msTyL^URpky}#hYW0Zjhp78b)V67Gxugd91P_;sD^Ofs38Tfpdqd~pC&=b!n_HSu zU0H%NCy(RA(X%*w_$*FcxWM13!{xFz*mz!T8UYMJ^qXDqN8;$!Xc3ZzrV(jqlu-Rh zWRi*OCd4vy_6f>jgkYHZAQ@$u@kunaHjpTs;ypNk%9>J=>?9n4hzf)Xz+Rsek*3q7 z{|FQG@EQo%veTFJ=q%_bIO*>0QGvp$(tLCfH0ZkZ$MvDDGZ%8=pvbD zt0}19jd=oi})?_r77u?|PunEB>3hFVm3jJte_dx~+o3Y64Pf z7WU-q`p#04pHsR|y{FtrDWQ}qdI&CU#1vXj7F~8;UrQAIt_1I!pWs{zo0R_~!&q2Z zR9Q|j8M8$>6e6$cUrA65yvH3H3+mc>ky~7e{PJ4lmsFytuoPAT{p|1n??o7X+OgW^ zMpV?6sm#kmBp3Us`^R$5;YwvKE?2h0#q+7?)TnGxqs>P)|$ZK-X3Sb9W=L zX*rrJuPNO>b#OZl?bv|*TVKNdZ7<`Pi6pDr~HELF7o5< zs}CU~UR?oc1WX$j&tQ^z_qTuk+xYOcHQb&az?(NFaA!P%`Gg%)v^`OKC+%(*`rE5; z{P1?{*zy8)(&z8lzFAFS+9H904KJ=|6K$fNZ`y#Z5+oGNzu{$Urd`;=wec0&hfQ0s zY2!9*-?kguHf_e4wuLQ*G+10&Fo7|I5zH7*!lc9f?uGP#UL)cv`| z+lbQ#NMO;GoP#q(B0Mk)2X)*(I1f*D3C`>SZNfAxCsCQ|~LzezC1ijs@8m&rj!obh=YVD}3ZO7HZY7~~%qp+|F zLw{wF2SjslQ?qnh|0dqxtx#U>Qp&76xf^qNyPje2P#X(i4*TM%+(-<&*#iIi3WyMkZ&_On;I?+bTrAv8e*F zfiUb|+N%NTdmsT5b-q6|g#O4F^yF0fF!2v|G5oQ0HxJb?7X=hOXKY+DkI5nZinB{j#qEa1@)b(|IIkRdu&l<_Sxy1LedbD z98CB{YHArl^3(wBlATrvnBwD6Oiv8q&07gh?SDK zyBpj0?ZLMFd$48SE^OJm3!C@s#HQT@3;WhTvqc3IcJlQd*tT~McJi}3_U~4KhRyuk z7Ltn#=TD)&x)`ftQGEUF8~DcCx9B)sD6g+UUg1@ozHkmbJ)LT9zl=|OxH_)JjfLVQ zL7^0^B=HUcdr7^PB|GS{gxGpW6s2jAbOaX=I5s^`r?Q6Gr4{v_{GRkEaKvQsJ7^>v zYK`%G*HfC;*C>TxR0SVQR33AL>$9VcN@UV^!J%))NYaDU&?ucX9Rh{U?DW9lk!Yij zO6KG}G^3_ni}I!}RJ8P>q^TFxZQWFS7ZQmWKQFVl!?;x3jPrS=ICJhYPMkWAlc&$4 z;L0U}#Y&v4v7*mCNWv0EhbaIvNt2)CNtzt0rb8Yt$#R+?gk*uvNyZ1tZnj(xQ3L@4 zVnmF-0n{}%5OkhHN&YFcHkGTLZf7*B$byX^%pMsgSdh-r(hGvuQ&w!4=axZ7zaAxJ zC8(+_hL#4Rwz3Gd)#d1EuSL)z-Hsd3-&_W3e-nJ#7POUKK;h+6IC*3*_DiFy?HjRU z>nqr~Yb%cJ*@m9H9872kGAatO@8CYl^&#Y)J%pqDeBs68u(jmFr?1Cw*o2kw1TyIq zJamw5E)Rjd>V6+i@w~HGnx$i=@r)6euV(>#79`+vS@Kv?57iU|McgH`K*|HwcN(P= zwxp|?d`W1j)H;F%6aS8r*G_=HloH6!q+}wf-ANi^0U7ISJ##>P5C12rkvB^d9xus8 zIIec3)RYb`*#AT=07pH7D|I*qGEO(?H!M{eE~m4n5pX4iFrN2$rR1 zM})FKov;efpi^;B4+MCJX@j(VT`CnYPNy$pnxe@pT)_nIyQHwjp|J$eWAvi6&raRf zp`@V;)g2ntb@ZXWxedOMA45~4{EPt8IF6ss$B|R#a3)6@5MIEM!{>4F>Q!7QEW_FS zTH5nCZHWh+I)@4t*wo|;2_)<3z^y9PFg-GXEcJe5_6B8@#7IgrXuDjrX(o3Vu22}I zl_e-FzJj9SJd{@z6Kup0Bw%n*CY_SfExlX_xZG)(5;I4@Awk(Gl@Zg?XTrG)c_=C> zRt*+w$_ptU`RHz`gwNUst&GO4D}>wFg|JhPa+!Q_`XEm3--ZJu1ba5Wh`j`!d$+xU zLj<0cSI%QL;e)Zc8i%%R!j-efaE+wl=$?(Zd}yC^L4wi{+iep`CLn%nfe`rjsQ6^Dg7i-dAvJ?~6Ej z;3Xu2HtI+ZYMVOIZVtmXcpcT5SFva3MuPoUaPZJx96GWehmIYhZtugc zeS6i~zGoM9?Aoc;u06YP=j~>PG@GQoh1PX{c-^lPJIQEO z(Hlo}f~0vuWfnLj-I>_Hm&hU*i$d4mg(iahSaJZP(U=JW z%gSLi>QGU74fR!p=%McWt^Kg{(bv}$!=`Dc?i)z}FCahXIF9e#iUT`d!QL$|V~?zD z8>rtqP+xEfb0ix2`ZAo@y$zR797Msz(|m6;3eO*grnwkK64t0whtXshA+H+-o~xOF z+d{t_A@TM3B1opPc>Lsz^+4gsJn#JyLb8VVnD|e~y_8i3c^=aEFi1Ntx-UT@2?~3Y zqe}k;ADN}GvFyrH_ocD(^UR_3j6nKt>a5Bv;F1zJIZ76SY&Q6br+vv0v}#N$dq6S_ z?4g7ra&na5fn+R6Fu|M1e6H?KPD#I?FuL`2T&-?HPDwScRF%^YTqI$C1^c(ZfTMfA zh=G_6dSf?gTY9MbKDdYGP~K+Z-;^xIBs69nR`0E1=K7NQzlHEb(@V6M(f~G!S=t!s z4HdC;z}sC5S8EwuZRK!vRYKQN3^ed08qAN}vaf=wG<#zm6Hs?zh2sVAR){Z;(- zr(Z_Et^mV8JikF>#Wj>rUJlStn28}RB%ky1Ls(gvLQ-@;lO{%`EsdtB=j%S-o|uMB zN(!XTK286hSyYV)r4&g<+>K7I;QpgGF~59|=Rd@2PQM?WRQha{W0*FCIxgQMz8J=A+E zb=!u@hF+A`cA=%)N}u0{Zt8!8vM@Heh<=j?y=E^?(eNcb;}t@YPWime=9r zCF=h*+F@TBjd~B7H5Qf1F2MqsdLjQupTUB}@FWKKeF@^6!5K-vAAvEDQaHy;JvLBR zEKcwG=;kunY`TKlx-vv!VT48Zc}<@=qMxD2EIf8yjXY6f4H}%-r*M_9ajEdZI%9kG|j@!QNWo+5@61Hr83A=V~ z#-6PkQ9-{ylk%anrVvM{`+4V&;mXAmII?deE}q_l{?-!c+A0xt=`faw(eG3Dbq1IX zHh9RXvb4kTKpdImFdjX83x3|aFnxYt=sE(!l5x7q=L?AN93n&10WKeXgMVZh9-f<& zmAL6A?35!bF{G6o$s$ zO>00|V;c&q>M3|l$So?s@zaNJiXg1C;0)~D<-B29cp^~>)}U(i(dQpl(KnOJ3zyT1 z$!vn;U|8+G^?S4Eai`GZilNJBg@&NlM1!GgFF{{R5jvZS(A!c10}Y1|22)=>iC_h; zKrYcSRF~&tKJCGK4`=ZHvsF4=8%pTVF6Zar?1gja>uN`TUn`vE9(Wyk zxNRD^-4=Lg5Iw2&9RxRTh;%HMZpK3RU0kv|C_9E?Si~WO_*uy=kjV(LbEXRnK_8Gz z1Ugb72oVW3(0C9K*yuD>{WG6Gf6b+wiZ}$4OCgv9e=ZvSo{oB$dTWp!@X|pO2uiRa zkcQ6Yg~94pj=j%JfNyl8N$Wrj!9yL5NPV9}Ir&&T0DmlnOZ66E3lbmKq8rBJ|_p{)D>?k_IGLJf= z(wX%%Tx~ihiYqEv%r zQv2qRT~itgYj~L8aEL@PyWRwk=WOP=%X4{Of(Yx=FxJ0Ejsi4g$#=+-_vO0DsHPqR z4V*ioQUj$ap3Lud@-y@JZ zU5XMOi%356ie*&Tc^p4;9EVRFQETU(?W%+G4(j{X?VDBaf(=_<#4DR$K;D%z$j>{8 z+3`4@+?iDqU&3xZE}uKh^V^S|J2#Qc=A*Nt5t{CLRU4-zK=%dw2#_H9NZ2Ltse%PU z80Z)U;M?gmWS+83WgBJG9CZ^7w=|ZMjFL7w-A-E+U5*sGU1{`tNDgTyZTzeR4JDP^ zNnjxQE<18=+7H=jaMLOHhNKpDQAO|Fen0A^6LnJqhDIk4il^Wu2=G%5d-N{oZL-rq zQo*IQMbKsPQEyymp$+KJ*`YUCks8h*Jw1tIdDYl=t`5iZ8*t=eG4>uKVLFye`+gM{ zu3lAX%q@NV9eWHx{$H&--`VN z3I}*!4^sd4@$Vm?4ahmV7aatO(jC2wc0<$INCHwo;BXANXAY2jTt!34c@;EtnKg(< zrDjtHgV9Mc?8EweeXlC77@H-)@egoG6G{?5*=hD=VI}}D^K}aWlr<>Pf9msR%NFLn zCz-d97|791(j-fQ25L!ATE3IID*7u&X@)6F8skY|SeAU|`E&VPYrh40XGjqa2^z@w zSqT~l*^r|=mkg%Q)%_2jAr|wYzO4iK)va8es3pCw3$E!C4Ej6-BwqS7%AeL~L}rva;PKHG`RH$w=+!6D+-0Zj>_vN98TwnUk{n!t zwW|a@wU?l8ErvtW0838;?7DU}3RQX)oH%g+=V*`5UO0o2%3`h(lvkIdjO%IFR5?*-a3)r~j1p>{pxJoQBJCVSHn^XAk?fVG1 zw75urbn5s%?Ao;%B_yIf-OcFhtfT$ugW0Ho$LB?8U=RV4GSPkMKd`R*>)C}aE*Xg| znFU5a@2T83-V^B+A;eCCsofHAa}xWw2chw%398q1Up5=0lu5D(1wY8BEjLMoBS9ZZ z0O}uJRb>k@mtV5@8tW?2*4l*82?FwPO!W`)5p;KJ?a-L~Fgas924SGi_8R>vVAw@} z(4isTG77*SL}qRp$8xKw|7|#Qp$bRO7h?bM3pjEj4=2y&<4QSgY;z0hsB_(vrReB1 zzsCr@*##4EMK(JDlg-1|^ax1}KYc)AdWpngndeJ#OI##1$HR*^k(ruBd~lFB?E<#% z*uwj=g}T3+y6=XJW>fxtfMg-Y>q!D;mh^7oqCVNZbqzr0NuXT_Y-u%pKUYaHS{iC_ z{?uVyrH{@#dsLBwE9Z{kZ4wI6R=Ao%Mg9E_y=M-mjp)W)5Qij=!3;Jn5dIh z>bqS^k%%d*)Lm;(bf2$LXVsCfJzt{3w!mlahmvXoAdnnY_ee+EB)yMhXh4g}O z@VPUb zUsqw|d70=3oe}_->^jOvpHYj!i43u*m%fJ>)S9CFMbU5Zp{Au4t;7x8#QA-7`LOe` zx%w&$Re1>O8e#9PRnw2GwjNx)O22>f5OU97pl`lN%u#_Vndre)QC5P2{Hr*B_8g8K zK7y0SPvG3?vpBeqn144h|Bl_*vT+-}^hL=$*omE#xx)N&$j?23iL3`t?~3l!J;F24ZScM=<|-uwY7&dIPb$f%jD}{y#aV zQqcvgI%%Wh#Jyo+;7+|88p?5(V*tJGEVRV_!UL?*d`Jml2lUNWmB?Dr?Zv(Sg($`9Ua5*&@dC(>EGi(AdN1r@!yDM4)%k&X^;_ z{y~z*0b(x~3BDQW%s9s8ZsXLYN*v9t#s2f`td@Vs5oNA>*4hF^-R8Zjj zr3-3p0HiIUfZ#$X5%w{YnLhje;^A(fY@JnA(v`~9h4=_?j?Xc2_12TjWXlrb+*!e*ki<_>2cyq2Qhzi z-JW=9C&(#m{JUmy2;mlTG!y&(vhM%#dTs}v|NN_i1@~4-@?v4M>Iv+%Rsu~6YPyXm zt8YL}`DL`!XJ(80yDhP=lDa2LWpvqV{$Ktu65LvE9&uqWqKCOCj5L_y7(Z-j5?( z`w#5F?tQzkb1#9xo}JjfX9u?K*@hkac48Ob+jo?PgHB_`krlI}Kwgu3P$RMr+lr|ZC2CWzro6w{MK7#1XMI#Y7*C%J1I3R>p=%+e7(D} zq~^(vgAhs^g-muFwHAkJ>=y}GkQpRU6v8RrOCjkoI?!(F0gbQE^Nb3w&NTY;G_AmS3d`TPXMr{;xvv)lLbQlaGT0Op>N%A$e_RszPb`CAAt` zs-UsCNd{u78?=zlekYBeErw=O1a*cms&pY#YD1{fhEdVyMPW@7s;kOWlS)l*8!izf zNE0kMo$@B+1iM*PoAw=Rc#Wu-jX*?uoAPR3) zBtw30{rVdCzK+*iNT;N&TjlrUbyr*w#6F7~7O!L|keCv<*l0-9t`C<48h+UhJlFk| zn^G$og3c<9eJFnpk~Uoc{e3z#)E1$qy^ylg3!k$aZOyglCSWv>+|`)~PF*9Em8i;U zkPrc};ZuOHSY3Sfg%0Ooz6Lr%iW5~4^JRER0D>}RXKaNIbs3?dMR+p{H2Qp>M8ruaYN7Mc@!t1(2)0}a^g1KZ zIV8nUr)u`og98|yB&qNQxk7LeM7H*r(WP@k?;wew+zCLHOa&7GYp*>7Bb|v%O^Buj zFub&k1DERX(vd3cy3~NP6X< zcAi%V-R3ZQoJn->nl|WtsO@v1qQi{pb|V_QO{i<>Lw=#?T{(6U@TcP;96PuJm#FhX z6wcA!UphtLAkAzK?d95ov()dS1QGkG_j^bbr1n*o*n&%E4x_)R5{+e72{sOqEbhli z+6@68<@5~=v`-aRPNDenNmLf);_}6F*tv5zcI`fheFu-@T5&0fu@%#ciwGstD&xZJ zAwee@G!hgVJ%cdFxl`{Xqe=n?7DXJWf7D-x1OP}5WH}}CCMv;$6p4m>UZ!CP(H|g4 zOsOD%)HOd}W^Y{GOF7DCBv2sP29jkUWTJ)yzsulMghH0l9f4MA$@!h~zGS?8p6=gV z9z$x7WRtotc1q((qov=5_RbEp)fGbDR)CDZM~$X!Yi&da0jPkxYI77F&J4P3agqWL zIyD56Q6E(dd;qhtj-EbYJPe=>Chpfen0Z`;N`nLERU9KXdvx_7fYNI&~Bm zE}ceEDeZVyJv9BzxRA3SU9F{XncIw1w&Conud zMV(9|o}s-6i0)g^XYi{afz?C%BRiNpnt2Zm&IE0OlqDGm@Z%Vmo5h}-D!hEK0(;Ka zBe$X#XD(Oc_^DzXK9-BUC+JhFD@bC}u*S3ezi2~Te)MR}&}b|wyGCzusU7TocL=SN z{azQz3a?AAHLPsBmh!3L`#Oj8yz--~ryV+NH#*uIsr!232OBgdC*?AXE)ttw*C3h= z5mfhjQPJfPcx`s~Vvy4NWCrV3cW6JW6?^)J03F;^*o9 z?X@u^(^B%m`|O~dB6)2$Sbj=z9l^?HF?PA>rvq zfGZre<67Y*Y~Hv52X^hl{vCUpE4~vPQvfYpvRr0Zzdl06LS;qb@9F%NC;i@ z^J3Fe6LXlo@nC&pAvpz0VjA|rMYu`+z1ao$hnI*0R$!;!ccy6r2Io|EfrePBj|8*P z5<`n4g$@UGpK>DiQL8f{ogGGIa*DP*06+CoHi+7_E;RSM&|@Wz_EMHeEKMY^I`WcU zR|?(M5NaAa5u%JtU4M-jzXrQ_H?!)H*+&q_9fjU2?A znM9Atfgak9-oAb~T`oAiUTBHiHLegkslPpx{eE79KAGr18Sm#g^txyp?LK122s(Q@ z>G#{w-PHo8(+-P+{)O_W;Wg}X4x-hbLIeGO70;ux&yLa#6Dm7RXwo?7`;925s3$LL z$4eVFAV$BxpSb?qIr{li2T)ji3Ax1V$I0_f9;DwFZn$?R4j5e_*jt356 z7v67Ro2WhP-Q93VK<~igKXU-nPxikAvU49X*4f(iq;UHf>f|F;DDsH)VpY&SV zhvK3l*ladT&&;5mV=XT)v&%ZiY5D7RG7;Nk@p`n|AjW@2O zsSou{jp%AFg}J*LGci2|g8c+>T?7;!5>k@VAO$ock>M;%P6r$|9d1o0acgaXiogpK zAkm3S?}9;sP9p|EElEu zvcqr+^(B|oc%LZ;YjYhwdfYF{%#!c$1+If`65>f5u z^BxkOPN~UjuU6^imfi~ZTn2O!aP?5A`(=C#mwc{`Mz7vT;9v-&hR1pm(PqBZYz&~f zxeIko&1i0^htsSZAsh-;Tmqnt*muC@%t73CiA*|AWhgkZzW`(+`J`(-=uT=(_%4rs0YD64NlX-yxlmG&U_YCVl)Iog`b2(+(a zcG83Cu@DM*?aWq>O0n$=PZ9Lqpj^+A0J>qcTkwcrd-dKORg2{aOO54SI@|$VE-Qu3 z)Q%^&#|aR+5U@65G%g+OE8#JoYW1bjy6EZmDsCIPoy3mMVla@ka=jW?FU?Ak*NFWy0L zXkKL!NDv@MFc6RoAUapsaTEd|X{l0EK0LF6Nq%0{ zu%V%Y(KyA)(g90W0D-@jHq%HDBAF)Aw5s1gg5BQ@ug|4+>%E~E9K6pu0(faa*roTN z$LJ^d4$`S43DyE=HF#0pZcsanGPk&{r5Wdn%J9;WLgX}tP-aM@pv!|ZMJ>p=(unQ5 z&tTVq12})>DykZ2-@8asECdL&Et0il5He|V!4r%^GFN0btDAti&ql)F5F(YJort1U zA5<8Btl1heqmq3-!`xCz0uB#g&{h$UA=qXO17nIg)~71Q4R@ zd-rUi?n|(6GxqP_P8)F?O_lkoPsyocd)02mW$O7U+Kf}jcF<2;Ku3K6YKt#J)7gS# zA_}X`4u2pDUm$`=f`n~i409_>7#yEe_2R0D;lM2X1M~1DXDJ)&jVYzvL;`>kBzUg( z&zIUs6rCjKm$D-X6c|WKEqpG40SN*~=7p3UJTFO*(gtaCD!~DHPd+C>0|_8VdZ}a< zh@Pu5DUw#%-IkG!lDgbO8{DR`ey;9Yja|^{`%ux?j?z{G3L5puD{Dk;eI0sQ%b;($ ziq%o-{%{!iS1+#zNCw8C9hiobMA(y}9WXoTANug@-N(53esUX5mzIL2Gzp&^EiVCmLMpuxKHld!n-_lfz@``IHDkGrGJE?R(_u?T`mE=(O zLwNJ)Dqeql9h2iprTaRbdoRiO$Z!f_w;8(b7I>XD-tQ1X1m^R%9%E?XHvHK+RT>}- zswB9#Zi_`nN06AjLEV=znX^jw$L4RT`){OgH-^WdSItmI*ZU7ipC_(9`uBe7s_0HH zL0%8_pvx}f)P_kiW?&+D5OSzBn$?VPpWlnrkTft2p-XFp&Jy5}zE$HxFLh31Ch3$6 zCS8#BAc$%b?{1?9O+8YESch{JRoHyG0+$=YDD95(Ub}Fqs0|l$8+bj>V(Wo@IC<>~ ziC`~kd-dot*{G*h7kU!IprY#9J%af->9P zZ=@~u5La4IS$qvGHS|Z#wFo#Y=xb}nrPIfed+szYoH?O%UsBlj5i{@5oO>qu7YObQT=mIR7b~UC`2!e~Y&K-y$ zmXHZfQ<$8b#+Z!ICYkqB52P`rDxFHsAVj%{NOr06|HEACjgKX}z)jhaW`|O8C^o=7 zFa{g#fPtW2mNlG$JIU9R{GCKrJ@#kD;ZKX-A5o=6vH>OfEkObw_1{kY@6ypON+yzI zAo&ui-+^R1N|Qth_G)Mwy0rGs)qRtp6^+DIh1Jym4i`?9Hsjcp0#r9PqocVIy7n5Z z%tSFW6+wQ*nfFlY)FU6I}F7Zo8fL-Oc-(!Q#zVF|u$^O(}7u zXUStE2ry2PKM5;symnv`;raVW%-u$q`k$Sc=%NqKF zZu;sP~`_5ItT5! zi`bgP-NN7V4%43SyImQy*#=PFL(EUi-leypvZ)6-1ufWcs1&&^A=Dbi(5TBGx3rI> zxDc4;DZX)^fG zPTV4C`C5Arjh#B;7Cr244*~%nN=vVytGgL(oeeNM_2}qqL_t1reC`FDJbDN@IcIU; z@Bw1Q-Pl1}wnK>iA=-n3$55Pq6)n{zD9p|9!T)&Qy*(KU>68FRuOvwcp(~B?+%%~uMPBwe| zvW8%wU$74FGn4^6^f*fd0mxmNBd= z)O+boM88gZ;f;5mV=XT)v z&%ZiY;B?#2Dvj~lbtq`)#sva~i$&EaEVzW~k_$A_SK!xGBWSEeV?#B8zY98V2HK!p zq!G2lE|GTWjyX4$!Ptb<=F^z)AD1+Hy`SV)Z@}n)8`CK|V{;2!x&~PL>(JX;0c}S) zx|)j6QkRda@;sb5djz{k_I4fEgW2pHf|t(V=<$O%NC7%@bU)4ru_(Gs2UCUjAI#w^udU#n$BT%B?Jya8)qM7* z<{B6bJ|(B0F9P6CjomL_z`ENL2KAC0}*&6lW=IDT0Y6%@xWsn`--l4zrU5HkKx z>hCptT~d{_UWrbw3zIzWh@=HC+V-Ko*45{ZF` z6X}eky=5r0{2dYv$pjHHud(@|b45uy>AcMZ^HluiE*(L=9~}lKI(qwYrMeAUFVx^- zy#-gBtSG3IrYIH2D=eeIxPYUl&!Moa2DKeVv=GEgnp3;pMTg+vvXG!SNGv@ngG6Q{ zOX{q2_EdFv6lk>*E?EyGyfSB6BHm5aSJ73UhwjFFSd9H@w?;A`r1QHmILPanRy*c$ z-PA5Tm+Y2HKtyI(cl7FL)Jf<%o6*`*gR;U)sIR=r@6D&Y6r!dimrmgn!NLKYIkX)o z5AMLB{kyPl&o(+7$uQW8y}P#HAPK~&WBZVM=^V;SucD5GvLN>~a%ebCQigKRpF~~Z zd34tmDN@5-Uuvysb5Z#gb%4yLrH}d0N~`c zwuy1zbr<4qbb3kJ+~_k}NER)SW?ZgN96=iPSb7vPxgnAoQ5{z`bUfY0&nFDNhzISO z9yIo7P}!m(h-|{OqDEZF%|`{VM}7HeShS@Gdi#)nTTMCZojLN8KC-_{rv4CvKqZ+2!4bA9lFGF3~dFp=|nyN@rOE06g z>KYCBN!1kV=*dIW_r28fT{v)jKaQV0hLh($Ys_Tv`~Y>vgrIsH`kPFP%|W zTMb%CZfa_(P)Q)t+-u;y8B*!;k`C5wj}sin6~UM6f*vcuyDdunC2+F@dCo!AV?qK4 zeSBYn0iySkim3GwFwj0|sqZ~b0(&}&UXlgLtdW3<*bf6qf{CD^UpnoI9*|7767YBS zv?G~GW0cNHN=?jC=kAWEU_dX4gY4|-J<@guWlF$Oa; zGkQ2Pb9j&kGbtp6Sjv=AN-pN=>T0g(>6vL5p1JcbJR7_By}z{HTF2!z>ao0L^}=l1 z=N#_eclO?E?X!W8dD81htrL`MH+W?ogElWN)(&IDzk@#45(Zrv3|NA&xKp@Y*@D{U zcG!I(lD|EZsgPKpv(cCz0{lQC$J<;(xja9Mgpq4h_4oS^KOvF&%#4uSpwryG{|VQ< z*84*O*+q(?>+nXe^YGfwTOviRlJqtcH^?WAXQ-F*PPbD^M{O!JQ z0+CpP*Jl>dkcXt84j$^J%QDWjGl|);Aq;i5qrIsHO=_(<)^WRozB)MF0Jv#}Ijt~HgLj1IMDMMK!u#KMOCf=iF2ue4c6g?KbLh1@*iUbuAiyT88SzN;3kvoi@I)y%Ckw zmtu0f9X{6({=fh4f5e~v`ZN5? zzy1mKNmz2(F!g*IR@;=({Uk9!Jm`VbX@}MBf-9Uhq)%l>(n|%vlLW=eGRSBbZR6Nv z8x#mLi8HU=I_>!BlQ(?L9ohr}e(JHxHs-1O();Y@ed?t2o_>FW&r>qQ4>_fy9;t?z zz*9Sf^!aKS9ZaOT{zG{1SWN>9r7vp)t4k!)$|y>cFf0>8EYq$m@tDrj7UhrOjOH;f z!cE;ztgK?t;ll^j0~qjZpx3d0N&g}SrhKqElf+OxsBUh>Y#>YmzsuhudvatpAi{}7 z(>yIjf+7r{@-nUOEs`Zo!%@E$^&H8cJjLo6*Z1iIqu-f@C5(*?!fxZWogG9r6UEl{ zE`hFgy-23iJzUKn&(zc5V^fZxvMgam>HiYfxI3IeJiTDbko;aZb-x*Y`wacj7nOc_%{0o>bA2r}@bbOcs1KHjVRSUt&|Z{d ztiKiZseXi9({Rp`Sh%f7M1!!~ZRjO=ZtUnoQ+qcSme=v?Km7|c(shAkYH8~Pi`&F8 zTn|emO)I?Sd9I5>83HjJ$%8~C35Coel6+;9nljdBroTg;x--wu(OBaI&->DW`r|yo z!K0Trd|c@Dr3?i1cu_f_^nQ`Dz_q7LB9)yUJ)rK>hG;^HMy@KmP0dZ!KR}o;wernl zQ#bcExQ3SDh^=ANn?=uD2m{ppj;?-85BDN8*N?TN1&2Ek3=DR{8O)I^Ds%N2*Dd`T zeU}23OFR3x`{D(jeDO8zz52dc>l=4Tu4%)g`8+=P`W5cqBR-AHVrS8hjGMS^ssjlZ z&$VNaq<#n%;<@(DMl>}w@EQ`2HMW=@Buy=iXzOU>bM4gcX4KZzp`x+^HFdQpE3d%y z>%@08#QC-Le69iI6_vPEa>MjIQs1-j(N?4T|DXTj2>f1Dc|Svp809(%6F(?G5a(@e3@AHc{^SKxrDZE}UL8 zfyDt!2-h0M(eGNtsAm)7&O8Pu!f<)#iJ_X&&_a%PZn>qc2+8Mtpvi*n5Gb zeZfq)QK_qTxOX3XhAsJf9yjUx=jq4uB(^Imi{|%Ekmrq!5zEo<&x|V@IA$j191|Pl zPhKKVlD(=42#-F+s(KfYP%mrql=`7fG!bBbG=o?&i&@JY0)8(#+naf9CNW1}F*ezQ z8OtDfUJKf&(~WhNsIRR=9esb9$`5L)ar<^DZeA}z>CI9!R8*js{Ln?+PDi~MppR*9 ztL6GCLw{dAW~Mt44$okg>wV5XPR``Qz$9(U)F@gz+bHeiyNmcG{eC9DNj|2`4`qQq zMS73d*6=p+G1_^vflIunV8OCV)QD$tv}X&%z>B9Zu%gn-d#{Lhh>MArl%XD8IYN+l zExAS9PrI~503EQkqEDL%J1;EI_A|o#&zq zS`l)Ok?ak@V;h21JGiq0bO61Wo$Q5WY7oQ2BKrh>YH+3?K|M)9T{$WV3d%?XZ`1gf zRF#+phd0YhOuDj;DoH4>;p_B1l83tHdK&shjE(fb!G-1^D0y|VgjY`w@cq{hu(z{_ z{Bjb@OL1(iWk_ar@#^Ed`1*UF;Ni0;1m6U5bi{J{NiGVbkaYCnwfhKBF+*#2&3Oo| z@-_`=m=dKD3nVE`T(`q|4JERE4>5H+C0LNeXmBOP`zqy7jiWlRrsen*VJ8{Q?(lIs z@l+;Bf|J9;^ScIwX8C+#or=Xp6Q(ndE$tvq!V=};Q^#uUE_yRt@XhbQkyydFBZN_R z98FUJG)+Wcjjf`8)PjzlVe|})qN=$Y^{pKknwY_eHH=aJ8til=HUbZ4oWz5ma$$K9 z>0B0hO-I-}!s)#SI95%!$Sg^foT4TK2(+q3KC`?DJB@~#R(kBiNGAeV-`S%dx<&@;u)9mmW>KZ$=E z`kKnnQd>#`Qh{2fBP+9@^d?FO9I8ktTL>nm2fN{(A>f!9AxItI`}ms&Ix*1Kj$z73 ze>-|eOos+KU~^bu@rGdWMKI?Ln%dsw)pdOI@*|u-Cb20Je>#eHMJa^aB>URoD>Nsf zkO1g-aJSIN=ukp3Z^mQtwOdL*Bv{zcF2e~ymv#_%9(8UNkTJan)HQzpu1WJ>Qpw5A z84U?R>*6MX;*JR*Xnf+jGF~VvBrO6o$`Hwt$h>O@in_nHP0+KkkNM3#uAMDd!x_xj zLU23Wh`3Z&Y{BctOITebc@B87Ou!snxnt6=asm!qhbxB!(N9bZ90LQWo5WkUW!XMu9!?D*#+5%mbM0ynmo|YYiJpU&pC$S zo+>;(%j3cEB7XGQIkuNW*j-jqftsEO8FVXD)LA!4I=eJF-4UHi4r8g1G?eX{TBe-~o(DErFe1B|B zdi&t5(77rThrlZ)p}kCPDbwhY2}I?2tutJ2fkcGIJnlSyP5t0C<+YE}q5IOS@Mriu zokB3D|F>ywOG0$+e%f4XB!l)53!JefOgK_#?y-_U9-^gp9Ji|*(MTd(*Vcv7+Gg~P z+0fEAiy=!C*5C?#KpL)yb}6;nuxrRie(#v;{vLMEpPSCR8zlM51UoBqkeceE8b%R` z?D`(Y#z)|xWB1MWVLt9bj^I&bL||rtI=;l;qGpfF1XW7}*a{LV?ORzgv4uRM*&J5Z zS1~m`f&5Ym<0SYV0?S<7XL=6A{A!FhZpsEaNEqs?Zj%Hk9r+gO=pV{&T|wFHE3^YQ zQD1qTL}LIx+aNr1gK*Cc(Qfo$WS|wDtySpjswV&;D5c-&A0ROf@$-`j_~RMl@1mI% zv$OvE)9>NMXFo6ieUEy+PyIfiZfhrRpL(omDJIBAVxV1tqX(~kFS>thnjjWLk7<&M znw=JUo2UX~_gDBj^*YJy93w~{GZS9Glp_YG%SXRIgSFH&-aO1=dr?H%i8X#+V&RC_ z>0{bx0-&A8v`GX^dHx^TnEM}niA9m;r6XkXT%*}Ng0DQ>zL4o??{SRL=a0fZGk}@V z4wLm~;WZc?Y=w<}qJN-`V2^g2IsJMnJw=d&HS)nZHR(Toqo?wuol+&xq zHoShBw`nUHD$&^5fM)7{Pj4$6jtO|(6X@+M$AhyK+^6n;|Fiqppzd$2CTP=QINr9)csd)UQ_o;%6QJ=`BOyc+rz8pM)!j&r@zq;eeAf$A;i?j>6>_LMr9M(()?x z{}35sA*J2U^Y<;EJfZGCrtUv9_CWm#($xLv!a5@91+LF6OifKXv!*jfV5M^O~7Y{#rgI8bvkUsXV(fz}_3gpv& zlNjsv;oU;dDl_4V`Y+LKH90LdJk?S6i?30JibgIgc(B3GTBq)-Oi_)ZC7K$s#5JYT zCS@MZn;l$bB%L8Zn-rQ~;d(FOT-+KF${{iS^pUt)*w+7aAK z>zJXRm~mv_b4QT$&0sS%hfmL!akA+n&YHo}5;5rVaiKXUNsRoQ`fo%@Fc)Z>?tJ_O zv8#09fIjS$er_M0>=LG2R*cVd!(#2CT_M)D_hD?Po;bf96JxE!S&f(^IqN0%s;DYM zb!`o9mzJWYrUn)C@l{n-B!9PY?b;>x_u!pvu1bjIg$11<~0`2F*j<_Ou6tU?tal;}B^}GnN zHV)Fr?9fb?=!4SVhizq0HKHl@q``IRT zKWM71LQP2-DsOTP-6}_Y$!*xj`w_5?5%&+#Zp;yPwqvNT5$&yI=SR`dX9ct9i*&niyh}`f@1N=ZyHd0R#lJr|STIO%*fHTZ z(lhBJSqx&%<0h#eN7Orth3G6EZijK2cVT%xg2RIYvy+wDd4lx*GbBkI6b)b9J;Vc& z*~c$mB1w`P+k9XEu$v3mMesc9c4K042vcKSrolw7W@NV3ppDYfTxE8MZ3Gpaz0Cv* zrKqT>Ky_UuYG}l7R%jI3RT6`%xOnrb0SQ-bU&jrSK}|eR%JQws60~&?D3I`}@nJoU zM?*^;I@;<@l*=;Fi<6}YzIc9&UwlPFzrT#7#ROK?(m21fjc4b3_|1=A;UE6`XZY;% zPffHdxA&NeTnHA#N#dg$=Oq3l4pg3EupmHSSmP6 z6kgm$jASv9-=l#en4?1uiY(B%`=VL6`~?0kFZ_`h?%qAc!QM9JYz{0huV8R|2KDU& zsA(HSP5U6~+I!G9I>zho#bjg+?gWWQdX0o+193X=qbTBi#9ruhQ6PhC!ao}(_hnLUJaHM(m1TabgUEe*y?(u!x zef%7se)bs+28ja6fswZX0TUp&tM26z)eRMbClV7lF!xCaP6{Oit6VGU{jj{NMkONn z3J8cO7J?}&CO}XKqNtIQf-DMRE%5aMSc`Pj$|Q-Yj&gIKPUVcEz{@=Xi(?Xn6Rt;o zES!0#Swn-{iitF&0=qrI&nY{ z@%k}7d43WsJzx&~o%JM1f9Hve75$(tpg`bt&;BkXCWs_pEi&Xzdz@VMT?PrJ!sPOZ& z!xmXsKrj=d;U{P(@Jp;7nGBxn7Qcf49KpYCs~M@lc7TLoE|kNBJ7Kz9cTL)<$4hwe zR-w zZ|s&bF%;ko6IA(gJ0w^erZKC=a;6D1)2myUusR4dr*Y@*F>c?wik|iw>S_~7<}l{Q z`!GA&gX!UJ6D;UyZ!k59J=%RP(Ik{>xOVA%zV8a{z%2~Xx8&)&+?FA;D>*UPjt;K5 zp7wf7j`d?>bpfmS1uQOR@cPY1_~oyDhO=|(+WMX$NebjicOQK8IX?ONXXf_t`HRBj z6CM==R0fb5pcbZ=kWk&zcsvqT*k?%|Iz#rR$#o@=$P&bAKTTP?ewq}C3 zs_UqwO)kB0h5osUBx2HJ6yCUX8BHzqC|CcPj#}#e6?}M2x_^nfe~HKIxO|g7pTwb* zz)h9_O7r11F{KgZoy zKSZA`j76@WVY?5F-TkO(ZbwslFY20m(9t&oyFUkSa?RKfKmC3vtKH`fuCGnRa_fla zct5v^@O+_WTDIMtA$iJ)AZ;K*BIAy(Ady)`KEH_l-Fb?}zV0AR@}J_`NE0iGF!`29 zhG;MRe6NRgM7kfLJxGh_=65hL=fe231$XY;!L1wDN$Q(0*55$_GHL=%)4Z;8; zbhTEaqos<+I@FZkKt;(l+`M`LCA1m0i4_Ov32JY9IR?9{xi;Fd zy`IMQMiwi}alEE4`1P-TXnJ|9Z0})yUFB#GjHv$qiy!}q=})1t#2Rg^X%Ghr5>WQf zo)HUtMBRU7#$uYXQ|i5%9O@|DR~F(DeYdi~GF%^No(pB6DN9s7Q-0lSq)@+CRnBCj zkhQ5`s-DwPy^k~xKfJI;TyO_F#3IFBDDjnT`ko_`@u~g@-=zE1B#UKjLnv+OM`iyI z`t4r0g1iPn+Gyf_l^}g`ZxKi9UaT&}aDM)ZxbMWQXO$Nl;=*;OUOtbxzCQoeUm?7* zOT9RRcb>SBYbLO`jtQp?Bhy`&ob4o$uS9dpEmT%sGLx1n$}Xe1u@r9i40>pv)ey5@ z*#*tb=;-J$!2yj$mE5{Td{5DcR6VXBf`SE=m6aGC9>%}`*E6}oZQ_6i`v1zR5{yp{ zV1(B@j1Cm4C^aC+&@{RJvhflPtWkzfAw?xr~mQ~c=g$9tnHr|th7L0 zGr#vSvHwR%Y(J--J~0?wb^1wNJJspSZ&M$Y4Iq-Z|LiNIcWDnv^z@isqx*VYg6B)+ zx3UWgEX1kn3JxY{W0J&ANn(EKg{BLr*OxZQLg6?zc9cDIjHT^@Jy#zyH;JOkePxfb zhc65VbI$K$HoA(*;F1}E+B-H4Z!C$AzWgx`9=*Z99P#(@b4=KyJih~|sA@r1&nQaD zo6t8h2VY_Z9{Or79cXE?_jyk_|00-@mHKS{N z#OKIGk~wUw&Ese*iS3mz?jCMoDZ5FIb{}0n?Mc=MGD!U4ioJ z*HCulIvUEVc)Wq}o*r!F(ug=_iSc`2BUaFcVt;2Nc|<>!v{Aghi1d6AFW)@Epa1nQ zaQ^rNODmfEwua5ET^t;p;rPx2eEQ{2a7Z0LzORWNpHlbV@b(wH{Ux#fr?mf{nNf)* zP{8%Ds$lA!k4&>eHMP`H*(8Pap#BZCh2%M=B=xPBo(Fr6Ot${JqQ_0<>5&2nPfehD zp08irSGN08Y~AD9J^hG2<{lqY6T~+rEACz0e^-ijp!oL(2MgY>8OL{PM)94RVO(z> zM^nEQ9V2#3Pfa4OX$5gBo*g6!utRVYM8skl6TOIYp{Ea?A@R1!!`A*WUcY>fk3Rd# z1PMYL58&V;_U29qAeZ6r`_Mnqhu+>Mba&O8h84BE&~=TKs3oXxC#iQ?Ct#rr4E11Q zd0uFRSs#jYSVBq^SK2oV?rZ0k#C#HVM^gG~MlPLW-xgt<=h}GR=Y#rajuKF2} z+?Ww|W(QQ?@0&rx#jCxzc(WHDlyu_#(oS3`?;`nbMN>mN5`{oUrmoFdQ76*3M4uc zIXGhl63{v3#)Z;049`W)=v!+rfr{2nls2?rXxf2HUX4p1(UxeP-ZQ&^X!g7d4$EM&2@6vgJe4|k9GoLxG6f{AhSi10Tp99r9@7#T1 zM7K36$&5=ndu}oc64bXm$>tj0uW2mWwN&sy@6}`-jqv>@-M@0X8Q;BLiSL%w;6hCc z-Y;*)g`16NXzHTwyGR-a@X>h|FCML%tP5{o9*YFcE5`&vC!f&Yy)G$Jk>ug4+e12;snn(~DYHyhawf)`N;i)v42VSquq_El@ z7R=dZsQV+RZ>OE8k?xmM@72SI{+&cY!Gf!|Z&LrS8~?9>fijHBsw&J_MJwN*PDhYV z_%J)sWr*R{N(4Xs-gA8Q`W(Oev!CG4fAs@Ay?=y-Ow5qm{5oy@;|-GdUSKxIR! z>6`+E&p-Wv3HEDqz+?f@Pb)|#{mW^0SpJ;nF-Bd85GNJ&Up82}uiLTAzKD!V|L2AYtgDO@T?cu5`p*gRHzUQ={3{9f^uEvQMVWbOEz`u>!9w`YO`2M;y> z{@FL`{R5qC8&CmW4pZxT<2rj9Y*(qkjSwvTf2UCl1Ct~R2xo+>Oq)<1@KQzID zuFe|tk?0Nex58$dgxh1s;Lrf(91e_6&tPj3ph-xz_0`6HB$5&M{7#IH(f;>TV`C$XAAJ8le(=3>{OiB{34Z&_FU^SD zb>hm^)kWj?6FK?YErgeL%*K`3*xR7*-hGaFlJez~kIjzy`rTKCxQPgw`gH35`RBjD zgD-wbY=74fK?M;cx^HkUeY`NQ0tHbL<`5r~zPm}X9l1Tj3Eb3SM{JSAeE}Kz*@NRd zc>VeJ@!+G+V4B+P-bIqS;vp`v#@AsZkyloMXOZ?cwgDSSyfB3H(iY(QO)nA~te|nw zM%||`oQ=|--+?c>gy!}kRMxg(WQulvQRPJng4{)X`(6Q?FA<*-*C+V>lKlJ-|Cc|p zMINyUTWl2;+MhYDY`A zH+93kctE^QT`|2}PKlZBV0G^feJ=5eKa6|#&N0ii;IP>c4f%0=xQ>Ip1>PSq5~IG_ zEhA=wprN`P&2=?s<{If}YN4(VqmxJL*aXIVHCnY3Zp#dstF@t^2I=i^T4!OMn}Wk> zK{6G=?*1l@PSu<>WU`qTm-1NK*u}D%vafFA^;bWk-~SQuK7FyW0k{TM$$vLaUl~y^ zg5vcKD${i704`pOx%es^JU2dKBRyu;0@r{EG?CcnN%AGakdos4;#!lKG2F`L;8CJr zfrqwN{zZ)vB`SqbsjO~q-lKo!XS}QX?@G}Q6#xFg*Fk<_lc#v^V&K#atCg^T%=WLBead@HB$t=@wr zO>oGCG8f6g;_;Z;!?yMsv{PEzYS7f8I`S5RxlT;cXitoGV{)P&eI)rqgPk-mji_y? zL}^tyt}8%5xk8YjwBu`~*Kzsw4b%Max@yxJtI^!iKt-rWM^}?+W--doQ2OdnZzH-0 zP6m6Lk&C+VCttt7uSgnx`1&4RJ=(|f$EUda=o}B8zrgcPKEa)bBxMI@{GE5{{O=o4 zSw(F1%*1F6kZ0}eze z5>%|LqUqX2BgkGm(H!Q7*rX#i!pD~B5VP4d_IFm{cUdtpJP6CUQVA#Fw~d)HmI-WT1hOs+S*A>d(qw9O>)|b;f`iZ^>t%vxR266qOq1O#%s_e_R>z>yldsRx2&-Q3sX4@^0RGI%r&N1~BD1>xruAES{K zsPm^+kX_p`smV%5mS_Z>(h${YT{W=p+JU0(FRY!z5hd`9FB#Bhi!IYJY#^6ggPTq~ z<{iLdY7CDbZXlLUV#b}}Z+MF6)&nGWMSw+k4^6P+;hP_mpmME|yo%6HdNU-yyBO!u zm&~Dqgrl#&odm7}ot-3e)YFO4J`#md3=edg+jjdDhDUlZJlborgtWtW>E>m#tEk4N z+DX*T;w^#)5e5YdN=OjedOFbB(~5!d0d(_vYLsF>kFDx`P<0(Om6y@kQeqk%{@q{y z6uTV#rLr}ekh`Rn0kD=738QGbtV`&{n#}9QZ~Z^?W%T|R}YSH^pJ$%%dc?s*LT&g;ce4f9rc`Sf!@C;8zOr_!Y^AK zT_kw@pG0IXnLj{=pnT3pQp2Ol6cjX0uI`!dq+SRr`%v$SZ_@pF5<72l1#|pO_H>@> zc$3$Bmo_dBHwjqSJ&0Ul3{M|#6FjA0Ax228JwRmj-1t28-3V$2in@RB>`MbuU9=qv zgiiZ%PzlbsQ>olb=%p^Ubv9s>K3+|T6);d5>Fo3%`stIEE#`Jv(BI!h=|L}#DnYt* z^AbM1_8~6cQdXgK|2l4#mzk_0Wf+y$5+HWA6IXO%aC{gYJ>4iLq3G}LMRRi<^`7gY z`UX0i%gj#nzxu16<4=C}Ilg-R1a}WN>G#j@)1UkRKl<6v@teQ;9p3!#=cX5jc5sr^ z*Vxum5{4)A<>%CY`rPcE*?Dsk^v=<4s+>>RH8$#&0!zCHD_Eokh8rqp zRM7A_ZTd@s{+C$Tdu|%W<&K{GzOFS)459uerV*-wW?cUVckkoHr(fajlg|+0`87ha zpg@yIsK}^9I?Up)!PLkoM*8~DP*rV4^bPk7(*O6uNj+c5EyFfrMZ_1z)F{cT(}!qsp1yD%o^aCW zzAKnCSp^zNnpob!yt2BK!Lvy}OB^Ioj{@m>QQsxS`+N6a{a)`S%04jn?`lT+Ln8_T z3pbdlJ1R|~A5|8X?7Zy0ME6xToT6^e_+rM^s#&V^UKs^yysht*SW$W5|3eu9@qmlE zZ%r)0wJ6F~?BkPX5AoIKpW{bA{T2T5U;ZP$`q^*k_vM?_ zkL?llUKzn8_Qd*r5qtVWJ2A6#UOVd|f+Bv}jTaddQS>fQ=ST`g29;G{I^!Ry(J^&J zNBV+g)vuHIEuX!@(%C0iyz>(3Ul!qcO{}R=^(nRv?-F0$!;9Bn;pEXv>ih=vQk!_{ zD{zV+zmGNvoB2c!9D+ z9bUcj3WxV!V`Gk)+;-V`-#wD@f(?CQDmQgmW7TqR{Ve2+N-vvYzI(Q-=5geMT{hK!GF$k#xV9 zd7{z-Wgh7E`hD6z^>N_qlsTZ_lSEksD(zLKYJ~o|DB%_2F_Zib~m)nXS)ySNGqQq8%vy{lUS4c#_62m4Q2+C1A{(G%$_bi_9;<@0~`{KZ%p| z2+j}E=$p2qWjYNKYEahY6sHiC`NNoj5`MA2Q))Qo^5n_91Bb`PU)|X=V-phM<_4p7E z?`-4jFpu-Qbj+t`R8pS&J(7AUBtf&+?DErLQCtMjuBBsm_;`ShU6Dtn4l3h7(Zs^> zzDXUu_w-}r_DHDI)QAfyWr74sH&#mWIZ2)}6cikwL7|h$P_!GdNT8smc^ac9=OI!a zQ_XV1hm+l9oZdS(^tJT9o10OS6Ts69H zYwnkK&yZYPLn@oW{_Zv$b{ni#3tZM|_(_j9f5yE>8tt{eOC z1U(oT9Y9A{Gxfe6t)@h%0qxXHH6>M)cWQbBjmu7}rPTG(>IxGSxLsMu zDv+oIp|qyTWEPayR+>@-Wf++LC45~?V=alpZM3!3p|_`zq_7F=`8Ym%{Q$@N%M{Jg zUBl_o7P7ev?cE~R{vvFVc~~L@QMv~6$2>Qua4jg~N2Ns4V}f2f0M(PFb{-m{Z#v;B zyNV9r=@-AE?ml^2XQrsRdXVtkkbI<7w?_h!+EjBKItB#|sqfi+8hSeBwKH{Ir!zTK z2GKn@BT3A9JtPX34<%HJ_SB_6FH37!_T7x5+gPVXkZZa;E zHoRf#H~l1p%8CfmR;YeenFbz`4Oe^t!Ds|K%L!zI7R)CDIJ*15H2oA5*Qv)>oR+ z1C_MYR9E8K^=r6%DTa_9#jHoZmDh9tseM z03->_WoML@suGbP$-O{~K&DDpRDL8fU;+l4%0l_(Kw(sXP`kpk0U`dDRWkSuzi{atJZIlyubq%>_zs?CJ&q#(9G{0x`KS-ODqwbsT-n4T%3bY8&IN}@p zo&?$EFw1 ztBojNpbP_v?7+?PQtJLqsEOr~B(T zJs|L#S6_-nUZ-VPBU#Lb7meL@-NZY>Im(!n-_Gq(?+FgI12nJ9LF(@s zN#FTrKQRFV1<>`ng6^w1UvicNh2U|KXT~)AFM-PeMv^xkVKcm;;!$e>S!Tfy^ zx-HBG^Ry}R^y7!H`4hNG-EZg_qEDjVCzdE=E0CCEH{nz7gUEuJlBH&?RMPi?_=+S+jocI{KYn5|Go|}# z=qmjeSzg#WH324nG;Kyk_K?sA13viO4*LB$c&2Ay8y|ypYz$L_Lujn3K}AU^ZeF>8 z+Uk0e%v;p|+qiavc=2W_b$^Vy9*4sk;yMeHVD!Q3jA4s@c`>tr`y}!seKT=>KdWYqG>_kwrLS%O>cnpu4VR(atMypo~4)er-x< z)_Q=to1<@E+E-r#5(MhJ`r6DBlPJ)r(aYbY`zl*?@!Bc{Jk4vfe23Rz^98cBRUZ2U zyp}#ZJYB*5UYfYN0s|8PQ%a)%fi{Sw^l;X5~kCUKB70Duax;F|)A^ zi)#);W4+YYrgP!g-(^znFasr)Q-F&XeNK;db=}RC{;6S3Rg3{7b z)1#oizTN~3iv0^zqEJqs|G|Y1h%H*pYdbpI`9E5@ej2fu^WoLYW9;vwaI(LM!>vW! z+22MgnMEYc^UQTH7n;Y6GWAHLojfmd#Jn2s=hihP-d8hnjZRl5d+iDrOA!8=bh8T8z2p2G>M*~bmDk_=UVdK>@#k!aeu$qL%u&y&>k5>* z=--tY;8c*3nAXAf3M-|FNu#M8qEQbvR)`ZlV@QNOI6HlceKos2{sb%cULku{7$vx@ zX#v!|EcJhp>(um!TR)^NCf5kd?|;l|*GCRY-S@cRvdzF@8N=-4AS_cum>lUd{mHaJ zP*F;pPaJq#874Pwm>^Th?Gg<14$^J}5%h#GGi618H}88xCU}`n&g0JMeGK%EVw%r+ z+yQiT_QUH9V|aW9wN0J$KTW7?=s;uFu$fGzk@#wGtAMUHJyebw;q?~}RBwu6_JBmU zi-Dx6&?06c%jP)d%VN}H5jcDDJVALi{yBqt`L3D0t_EOg=%?{_&YT*6C%0L$yb$PgcEFL3CS> z#i_hW9<@V!bpILea}lZOp)wFuZlEZof+#C@%sCVI2$5t+qI5)I zI`PbkM)?q!(ov{KfX-`h`2-;X`sjlC7O3Hc#*r1ksvL}NN9i!abn=QG_D?xc-ZqA^ zZYvtyduaC`qSrBxj;SD;#{9U==X!?65hG|)+F>HUZ_OZgHY- zVh#fY55ra;6+6XqtxohxzoKCvXwv9683qx2j{-HhJ@_OBP!&Lx&j?>j@$fk#Z}0n; zBs9nhCeQ%uT*L?rOie5ex2bh9o4AM^E@i*9ADbt`aLA6yn|&mL?S^@ z6GYu!Q0L~I<9}ucin{NNXJGLMxdtXtJv@TWSr-9J1atNP5|I#=QXc%~XRmSp{vGOH zH%8|2{C-bNiHvFT$@Q(KUuxu~wW{^0=9-SgnhA*Lx+)MdV)vt-0RH0T3%GjY5^mhQ zLT7&kRh6Y^6gjB4jrR5?I0!5(Bo6h>1Qx1YrZcE%sz+5r9V+T-c)NiBuF2dllq8gz zV8O-fS8?^WdKuin#T!>m5TTQ6Ks`@dTI*3m($Ux3fkzJx@#Ntlo<2IlPk#6YFP`4T z{kws`DMcWrJ|%II`NZyX$_vD{pCh)VEQ1FGMYID-3FfuXZeVifp-DYc z`raZz|IxFr3hDTKOu-$cj0F}?co(NHrRP_?j=LHE+-6`rL?YY)< zVf`PP3=+*rR>_o{n40BAlL@S30@z)OARcny-qRN(Nd!+icU;?Qz^IgIHEarT{S?+a z9inz+)hA(vfIBgdNsApd^>xVSmoYg$YG$tY(l-ouwV=1Ho_3%K-EB=6?CVBndkaav z3zJjRuvqPwp0m+*gkZ6|Ff}uW?d=0ReDn;nvo?485j3tRO*ObBKO)eozTfIQSpj2edYL_f2HTjV5r`}7x zN%uVjg0t?J>1)w2G>g`0Fa3WUbFL`ju?Xgq4*c?G&v5=|50&-J7@kW}*ZDu`>;3fo zLHb8Guf2!YE-2ego1~pKrCoYy>q7KV)|hs)BB*a~!-v-{;=+{+C@Ck%FS&}Us@rI8 zs4^Yw+o|hLy9L&{88kFd$EEMJ6{u|~U;qUJs~YIT+cdeO(F6@ul2GhjB2mWCl^X<& zwRPy|>O?*5N?U6q>Z-~y+~0*K_YUyv{0Pq<9OEb7{}eAC-^2NxV{GphbU#Bonc;a& z?mYOt?x*%&8cFWZpKC1E84FxAvG zU}}69+1dT$u&xUE!h+2rQAv5HDJyIgB_wsH4t) zaQOpVzJ38^!sVscQKt^}wbXs;abp8@-$@%g=Ri|)JL+g_%!GqlO*v~p6EU625gHpC zO^~42ui(Ok3nu$OeGC*hxOMv$Zk1?rpaYea)qGtwYHO-7MlSK_!9Jco-p4b_uYUTO zDL;C0?+n|tjd_y)_^R}p7@jsPNzxiu2HXKL|Gu(BkF^C z0IiwEr9Qq-pC6#@k%*`G#j!{t_5b30PPR!s&9s@*I3B_W<^A~fZQ|j%3l#DLz!WMvhEOvwjWE|$bnhHau2DaA-A6kvTW*4Z)Nw;zsjKQwWS-;ock#7e`Y)9s zXk%5u!rbyY(&-@9RsuNKP9Yibl8`^e(wZ`6o|+(pi`c+P9g+B{3#M-i*LIk?QPlll zB8Ty58!D>mutM%LH8F{%x@rt|x1poC4t<@PgwjBrZ^ZBbu}e!Md_E7x#>QZ?QSY4& zc)VV&D-Wh8=Wwuhg1cuA;rE6S@Y5!R6POsEMQ`sgrY3FZ?jFL-v;*T~7Wn*exco6p z5bMu*r2F$wS+@eI&g2T5ycQ1P7E4N{+-s&3!$R9=r!MF^s|2A~hM?;z(c?wYdDZ$T z_OlTASB8LiWHBp1QoLW7xL3$F(Cww;=OzG=&;~Q{=F**yOlF#HE8}C4w^MucVSN5w z-G5h#cA)t82L}u4hV7^uw4=Pwjw>BjTcq_KkV$=1r{$imX1MKB`10j_{Pg?J@mrFhfBM}|@E5=Q6hHso zGd#SvkK;3SnkNCEvlNk6R)LEE-jO}PTza1iWEYm?E@l%un2v2>Dq4`4=q6@)-xAj@ z@wSNyO-0u!o91;he7)Xl&FsTAe`v%$e?)~jCSWLt`V+Wmi1a^w6tB6h8SE!!#^&Cc z(!TGQ-5ehsZlOCfo$T_iX+D^wk=97JwCU!0$m5CGVb+w2#kEa1>GW>YcjLXL8I(Hq zF`7K3L0`eptdqcD05@x?fWs3A&?yQqm?kF4JbY;?2bID@V<0COCOHj|*o62!G(Jk> zq%{65N2j6P(4{>&GlALrNG;}(iQ2K6bzyzMivyA}rO0a}hynv5n1$MX?Uw7e@-u0y z;=Hd~X3bv>@&5^|_m7NWio`+V9{a~;d4G~Jgb z=3$F1!4@I#2+U)~KW}!^WAQA;>_JRA!*rY(SR*+;pN600#K-rk0c0Q;hdo3G8eW7Y zv|x4x)G1m~e^)$D!>*LGw*do+ZtJM-xN@q6-$W42>!-{D{iY;u8z4{w1IkPg>E}67 z9ApHmR^B{)Tt&SYux&@^FO-rO}=8_LWmzE5-5vjl?g z+JU0(SGG=~vCo3~ff-zB>cjh$?I>#=ftBZFJ{2QqaN_&fZ~@BS3$ zPaosp@k^*nca+ygk$NX}bS|||9p1)7coP$$RgC$UFzU?_bQdDS{q_Xyg5;toSP)t!;K<)07~RGE z<}r>*ZXbT~C3TFtuQX&j8|j85rlUYTk4XX=1(GCcl)B8{vUx(C+##qZ(70OOiHo&E zXq!#KOWv;h zLx{gYX_!%!KN&kfP)$&g$?ss+;luFQq?w^TJv9ZFbp~@&!>~_|!7`x+r=yq{8K9#d z#^}fh5{V=-*#$%sBm~I}e^Uyv^gNtiKT_F6grW&d&CX$R#)42JiYV`=Ga1Y;EFh6g z;NJOtlaiQBrQxQ{w0R?#bp_!Jr7-OZ!{Uu2zCuu-bZ?$31qYPHr2wJ8m4aj;5-d%o zDPEuAHOkUPN|a5euJ;Rj53zWl%nH^2s{hSXtkT)9ne2;#=>96tZ=Ph-?8NRDUN1tR zMw99yo!L-1#IdPa&S~1rfhJCHJ!}z}tbeoaS2YfzeURjwpz%^&C*G@~?zfDSAcc@7 z*;|_TK{dX={FAR}OXILn2R!rii6ng57_f7#DqyU2WTS5wqkVM{FsTmJPTw&TTjN?j zrS1!CMNm)O?j7mJ0IyYRdm};qC0x4rU0nR|yQr-$M@PFxrZtjGl;FzME4Xs=Dz4GT zOFpE1P@v(G%8;n{SBMp=8X8bf;@HvGho%k^1d_^zwswq?Ec$~1437+%a+Jo}3QUg= z;7@=41N{4c^Dppk|J7gP|N1}vEB-BS|Lx!W8P1i!xgf-4yJEn?J@pbcYIV15@n0`MP*=LaF*-V+CZH*`x zNjsq1$}m$&+Prp|D4ND1-CsMti|h{l(!v(5RCeQ1?J&A$Qv7_9zRVuMa2VAsefaLR z5;W3(+LAf?^$q&NMYv)saMRD(BTJNJV~gAgWfv+H`oNS{sTYgt*Yl^!uy~9ug4V75 zXE-^2f?Otx1a*IHF@zk+!`aCLd9$w-+Z)TSyj@OdD(C9wTRg~9O*C$3B5PvJ?8qqH6`e^*N5#BZ< zn5on12cX^;nh+zAz88+q%ySw=E}Nl@)ddneQ)aetWJJC}Jr1-xt86W0Xb6*OeSDMd zmpAmHZP<#2K?{9C3$8Wwpt{wD>A489nFw+zH-7N-Q~c&Hz6W0lo6H`qS2agg9j`&l?woL}5`#JPmljya^C=uF#IELusd*;ICexEIB zj=~1h;UyC|b@Dt(M7DKQu)t2dWKGe3aNWnaE>yxGY_EWsE3u4Zeiw%iKf?1benh<{ zmP+N#2AkPPB571b1;#4$cjyD@7ub|8_QM=+G2U81ce?mxNn!0>`Zh8RDX z!i0*B-VHsYWd@rfh74x5DE)3LA%J2{a=cH9JPbS?Qib^Be>;|dO_$)Pey z6kyUMsbar^<>NwGm&y^|ZEk3?Rw>0Mh{_z$x{A?PC3epdA>LDvK)2KCJHzXs+j{<8 z-G5h#cA)t82L}trNodu0LaC*5JPBRCRdl%);qcLD#y!|r4CBWykMPqk@8RQ*pJ4yN zM?6WVJXuGu(twBn&xr(+P&>6-MiLpI(GTSdJM?ZEQ0+Dbc@gX`o2gk=W3$?t5;G@R zb;utQ{FhgiV_=|@hP=A_E3<63DjhaL@BwA z+4L^Y#U2f%b|}@a;DjXLxDW{>xmWW-6Hp-_5Fl}>@dq7^gXgU%c9Ik)&!tAAC`b`l zIK;{hox#z$31TSi*UxjT=4eqF8>OZ$Yv%qco$4+P#v=x z8fnMdjC&z*RjsW?^%dq1-!Zk0i}^e@^9k&4&SQ0D#iY}!IifNKOe$k;2Ywn+0d60` zx4I)Mf~v>VC0#p~O6Ro(Qs^BTA<&${7-f853`3oL7;5jvU|Sb@T07C++J@Gq7IaaD z2t0?nI?<))y86)9H*9tjXRI!`JU*`L7$!*=re-aewJH+nhRx}LTd9stD;zTdB0~h3 z;{=>N1h*aN8XCj6D?rf1b3$DaAt**(1G-HKza?@a1_>IzB(H;dG>FKV)O=o>1)e7n zeUW+7t3c%!I`Y0D_-_LN%ey?EJdY}AP@}o%@{!rGHoLg+U(MIFpo(^6dWHmOdKhJ8*N}{P z@#y>rcaFF4NexjJm^g`ayKg1kh=Tpx4edXU|dy5F85_bQ3)ImM}%q zFdJE+eo!w=sRF?x?Oid=aO3Vv96$dW>m;37(HPl#@Gsuu^`Kp(Zrf9v zm?bEmiY{Ryya;D{2Q#5n%;F+Gexki^&nAzMx`I>Sgm!a z9eSV2DhPN+9T9X)_%IvYFg9nJL@vs;I2lahk4Y9q+DnHHI)v zz(gOzwK7TY<CTVLZ0-ai;N^SMi#%Q-*sn809*#mLYwY{H&rn9rhWDvDCYaVwU zTDVr46(FjsL2YeKAx*WW4mGunxLsDs>)(iy@*0dz&0@yx!0^N*i3G_WkCU^rn3$Qy zEJ29XVaJSR8cweZ9bAVkZL}l3eYjCxi|ZBj=p3HLlrw~IZrw~Q(8x;Fk7`%c1O-W+ zQrqV|H#`q}N~;#3e{7B>W!(?~f&o6J+ag&j1Pl^AuKOxuk?0z##7u$M;`P<_R-L?T zvo*T%R+e~;a=gYQq@k2)WT}8bcxjXNW{==Z*&4L9^lRUw`^(z7pj}xxdxEuxuLwTr ztGFiB04q+gm0t|t2j9DoAN=GKJpJS|Jpby?xz0Cg>`FntUF zc{g3cW`#NjVI@)Se{QHMjL1McrfCQpv&S%*K7dY zBm!M?2_DnvwapvdANDR{JfJjE`qA(*b@XkS63L==kpvD+FAjpXqmRC4>QPmmRG1j^ zlte)F-uDq)zEAz9?#s{1$8zn@#PgU|Cv!h-N_Yd-$T}Rn@6Y7vFW0EY)JghHKmV8d zpr{{8Ogp@)XQl6vq`CeU1SV;7^_;SSr2BK>BnBNJv`_kIuVkZ-F-QB7T|I-{pT>Ka zZ=qv&l74-K{%ajx>bfJGGvzW$p;s!rdfF(HAh)Y&Erk+FQ$ET2k_>-$X7`M1kM=E2 zl21L}+StVUN*sF|DXc6ekxtN-`Iiw$(qGW_Sh&WVv;z`tN)$`k^`ByKOu_E8pslBg#I_zigWb4RT46@Yw)XRN^bHZ( zA_WSR;icf;?;8}aYxj@mVfTqCzsd33=vqkB=ysWaKTkg(Sv^v}hZoo&K`6>9NrG&G zY=dltO4nq|Wm}~C#aBU$>HZu^oZW0(XcHuDY_+h3vKo}RpiLb$==JdYexvRy zdyWKV_3UHh?>|S9Sk;?2f;YH?R3eDg#UOt2!;kRg51!%4XK(QQ`+rH>d{Q8~{4Q#6 zH_PuKoG9G0a_0pJ>PLvIA0fP^-C|;$ePY7>JFxobQ;E-Sl$PPcOP6q&x_#-=1ze+_noJ*o(Du&MK zD7tMCbj}6PG3TXt&_}{J9?D`Ow1A1g0`*?0;v&!VOFR$CCYA21Btf<4Dn-yyWeFmL z#S8;Ow0S+1Wl-38)@B6plQvX%E|r?D9!Tmrrp+jgK8`GHn+zcZ>AfoZqi@vbXre%D z>m2^oQ+W9~Ns-B;C*&LS{lp*IK(wbx_Q~toEGe|kB zbIQffIf9L!ZK2*x#a4_h_i=qYh{>J2-ujIqxGI|}lF*n+QT84n%G(Mas2o$71!;1S zjjcuO>?U!rpTXMNJTY|)5n@Ge>VVuzr5&sMezYrT>ObG(RN#p=!^`hrGB3zAQuGyiNSy4gXUyYk3x2gMeD6Oo(DE-4E z*U7}>BqH=_6O+^Q`xfK>ogP1ZzmsdgV=|80y86-4GiXN2UN3LL#nMJJ^i04K%oa8< zh~ooGdnSV}OgtajJVlU451&(pMU1#e>p)~)eJY9p0rf9fB_`DE;-m~6&2yAua6kb8 zWex~SsMn1)oK^NAo~Aw-Dl3uSnG7z_4;KRT!i*ASzDRU^boB5V>-xQ``|nE84ix|X z;9!BG=h_*M5TMP|7|zgH4SQEGWRJqhAZeEIr_jwXo-Pu_rr0F7j5^8q4U zxUr2BI-pGh5MMrjgwuyKoI9%5rE}yLcM@DpI(?|3ftTY~eetczTew+q(=;*DL% z4WlsvS{j9!^d7;{0i22&D`j4(^Sqb>#Y(@*C^D=FvFS5V=zhP<3wCn$2=^X+WSZWn zmfy@{=VvH7YfJBAj-NZ5Br%Zi|4hdz30?=@w-SVDiiFaWREMMnasm$Nr4?))sa~zn zvD7rb;CE67YV91lwc|%(uV!m*MKI}vwa{kOIh6)UyM&?45_b0w;N|Dd1QN(CW)X{e zaI>-!4P8T+a>Woz(WxtHMuX#`g9_2n`%)`ZVgVQ$1S)cr&xh!k0;*-={}*vK6B77; z?dq7CAn@S(HrH}E+F8W@_6iobK7s<+B#_D&P;;D^cHXIkBG#(yPpqjfM+Q=BMrr+f zMkYv{n%g?iSXF_p@-lRiIJR8Biq=~<&{9@{n(|UQh!T{S=|~|ct*TJdlTuWb-9k0N z!vq09*r^6*%^2)%#n?a>r2`Wq{ib8Gjo`sKM{qgXi>BIg)K-rcj~qkkCV zRu583tGIJdBg05GN#+-~3jG00V?lzZ6-u7BCAz($;J{n?{p(CHMLiBk@RW{7pl*5_ z{9brY%ub7TB}quQ4m8fDkkT$GWH2c0TRjj23~V$SzT^@TG-x3@6^SxH+&qug3{BCeHI63UJdH(EM|5b)TMjZfq0qXqo#Z+~ji`pX*zsrv+@J5P~0 z{Md8}PLm)hO-e@Z&CmWChtIw;pef78JzO6)0+!B6J1*Y50gXRYDM3p|J1Pn4n_8Mp z%JA64IEKeYX|x?Acr_#lBn&sNp?h$U0ImnaH1@%G4E`ty{ZJn!EK?YpnJ^gz3Kp~y zEVOiWqkCWovn~fF)J=VM0^`%#ZHi)*>u_Z;h3ScY0?cx_2@YM333yzS$Yg?;wp%e9 zO2fzXDd%5kVoE~1tA;h7VEKdq;LfK6SDJwEshN>0S$psqmhZm8BEgbo2B)d}>m&@D z=bsq8&~8GZZjE+T&Bel+X-$9--7(I5MxBL|c^ZC#K^k{;GY%{%0QV4U$1hB6`m85P zU0cT%KUaYW0m?#9iuQ=QBmyb$Sd`h&BBld55|0Ivg%ms_4ce*KDAs$ge?}*?jS*Lz zI<`TQdPX~Y6ICr;=oy=%gU*|>CSPjROe_#-S0KtBUxA&^nI0%==qBRIHD!8iBzNH? zNtg*_34BOq2?896B`oCgxOcdLd;2Rm;W53kPT+Keq}B%QrFK76tDL3HR2{6+TeWlI z<#})rFllGg8Ob5a-+sNc7FTYRqp`UYH*eg+4eEZ$?VALfB`7T^H9>;1GIh+ZLkU5C zc|{F@Lj$hgE+g^0K@iY~cs657SrlvNh5#e=jk@19U`6Y&6_W(Rv%I$TqYg9=x~Xqd@OoTG$E|q$FpuB;i=U&jSA83X z>Az@~4n9Wq^bJynA0e^##Ekw*QTIRl(|?7%=U*dx_zVjtFHKO&1oZDiz}O zq8)7_*{^G=M@w51THBj2O#3@T@^7UMR#jKwkKcO_A6~s`^uE2f+vv9|;Dskd+tk;E z!SNAu{aU)Z_}my;yLydu(LUQfUfPOr*k}VLr^gYCg|NS~j)iOj(_;f9nbq*p2e|E% zW>jk~6DDD_l7P({-50PAnO%PR_PrM*{GSley`kQJM!lxo|CI9D%oyLK?rR5cnS@W^ zPidtJ7HmFv{kHMhuJNHd2Wl`j9p1uhY?uC+xPtg%HX&UhIe4r0QKdq!KA_E378tpt*m0Ck=svOlYI+GGxDHYcod=aZk1 zjBJ{@>oKmGjs3g0bhF$vH*Fucz?oh#Bt4*DAxVRLy_c`ItBIo__4FgLbyy+<`}FV1 z94j<>q`e7c3|8>)IX{WjDs}(#c%9^I1$(<1rMQjk;t>`$s3X+>#bae8J*DpOylE`8 zu;lWQ0mu&8GZ)1jBXQ;WzFpObOV>(KURiHa&TrqkM!lEr-$Y5t4cxkY%}AAc+mzp; zzo!4ET)9E~cX?c+B;GLs3k>#wfk`VI5cfy@qV|MuJ6KLt{GofNdybrSKH z=yp+bU!@lc2PYn3+S<@Z zTRS;1hC%vxyWMU|58nUaA}(LKfzD1|8|t^x%H3`^A`z1K&Q22;m?ReHp>5D}t^7>M zz`y|JY!*0NPR!2CnH2N+>@rrC@>pM6HVsr8YHw2SN0E-Y;ImI58TKIc>-2*M_Ut zOX%CHaO2u7`ucL}eFgn}IVvlZT~deY>RJ;ZD&b>QynU;r1eNq7m#$nUw(Kxv_H|8l zwD)46S) z^GHLlA3{eH&+i$6q&@{Y!AggB?-#3 z_n>cR5M6!!sB0%Etgb;-V=FpGr_nVsgMJ!-k;y3x4DgXA6+Y7es%l`&Y; z2UPO6!q-cbN#M}uED`)GMNhj_bTlbN?6g}+<&c#ZjXqqe1NUHf!D7%iel`Kwn z7jd+m!^y!qG=5PT1*-QG!PSmM(Yg5~G^!#CX67r6VPOY-$7DHla~<^d4Pms0*I2vD zWhH2=tU!ahAy-$L`nM_)`>HB6!zn{!Lp7Qj>u5--(Maj*X~*337{^JA;8K8-|@>jJRW%piWE%G6oo_Zb@l~B3*^R3`O6Yq6`UT zL@02g`b!c0_)4LUJVDV;p020rPPO|Vp@Ih&3LoI{XA!2kt5Z=$vYs|va(di$;&DC)k44or1&qXd={5jvPS z$)-1hei9?U%Z`w17^{m8JbJtji_4Fa#z~S~{yu`f@Ww+Lrn@k`D!2~Sqd`p=)f7iy zQb7cP<*7&>Qgb)k4^%_E&{?^1e4?AgGfaE z@Hl5NG1_Yg!uj1j+&S66`YN4UE`t0v*XHUr9X79pbf3RP0K%c*U5t)Cwq-=SbF)zr ze%iC?SRRwqi*W*VInf!4ob`mCdPYO7odT8l2qaiFp+rH)9GzlDQYdq9@w$7L_uy9t zbsG8Xftnybq0_jB^u~Rz8)b*=;@-=zu|aUAYb(1d{W2LqyzW{rN`IB^sT@SRP(k5BVASqLU(`I{9KuqU++xdyX`T)zrh?U}U7Anlhuv5Z`P1;@L2ob4^+>_nMm zIj-k5Ix?`Xa4UZU`H)XY9NV-2W15Y>t ztJ{Oz>KbOl(yCO4 zuh;i~n{A?9XNd_8@Hz+ioPy}uO)36n>9pQ&=jT{s{4TW9GX%0zfkoOL?P?Y5uyo7G z*Qv=-MEXyXpay9=S8kP!@jR+|naG1rSy~HQ->Ccke;?bjRlX+2EH^A?}_iQ{tX!9{VD+II)T*tij4y{41)o~I<`IaQf(;P|i zWMBp3?j&{JLfx-0yZ_4Qs%vUQV{;?zc@GALdNDLQWYUzo`uj|IK`nKE*5NRj0|R5D zn6S(kGN--;J=E{U_EyxlQr~Gen(6cFn%k-SgXkgg=o;w8z~}&OmEFMT*dWrWD1VP8 z>GWYK8^@#jhq!yPjji>0>V6FQt#$fT+H37*@tR2YHTA%ypgwh9MBfsn#5SqR+Epb; z=K41_Ak1sT;|#CWcpyiDl*JVFWQJ>E#^}i!{iR3)bv=6m2ld`TeR1gX-vYcK&zpLm zBs8LN?Gcg$)%l|rro1q`yor;KJ|{^1*sLr0R_!*cX|Z%Y!1JyN7RokIda;5BKKchW z*o&#j9Cd%l5k~8n1EabQ79RrXB`na^<*EN45FlSFsYLILi)(I)Yn*;1u>vbWsEzB} zO4}xTKFi-ZN4uv$!CaJUokT<_`10NUg>C9R*CN++LSvAr)5|L>*xO&h;ep1GZXlgm zHdzPmIPn7CYZJ+kZREML@o@zr)bLmKM4y|~?wSIjp?M5VIcfXnFlC|clTcRD*Von8 znZ6d)^!=5@0G0InCBy@_N^WsoHK3L2qnbFgtGkmvrGq|Xifd__y1#_+85;&Ch$VS+ zhm)A|gpl7k!i+mWBDIPsr{DA^P&Q^r*#xWd%j;&Woh3;7PBJz_!l(119Y6gZC(pV3 zwE`%*J_-Ve*sG`2{~S0_AV2|vVwRxE9N@K7=76T`SR%``i#+H2{3(CVi2k3+CZNq% zHioXfK0`V_OVsq()(XQCzI^{AZSpwz(uDN=E&10`rHD$~FP0w^ zg9IXql0slWBMynr-#%VUS65@$VgNa%0JD4qzt6!_>i*pq^bfqQ#Kf`}bG*I^6u5XD zl+~q%giiVp2RVRmk)O+Ruk1es^~ZyYs2g^o-yS#9sl4$OEUq7#K4kA-xsC5!DMQD! zm-c_zG%Zy2@U*ZD{hYxx^a+!~GW5@*v~7CM!|&~;?Q-(>d3oLSK5YsK%PM}58_2a{%@8+{izvHD-%**FPQG7RnwspOAgi*MH9mII>O~KE z-o&JZ*T0#%PyMf~M_G9_%FAm|QBjLB`ux(e3fwL!qtEZ8{x=gN5bx7B6gHy9Ffl!a zh2>>pfC

  • h!FgYG3t(o}UpjLKrv9^TJRClVLd=aVGQn+i&^J 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%0AG4C~R z{|$Lqi4b3E^gJcm7?=7!rxFQ8I*@Y3YpS~GD2NkG4kh`R`+XQ3m1F$?`k~I?-8Z0=KiJs5 zvtbruf%*mt|3S1bZ@>4EV(?&%c&G1P57!$u#UWgZ5`$I|!AL4T~p)#mC_hWm1JXE&Ti^|AeW1z+7<^PAs%$<@_MF5Z96ql+!i-oNC_ zpS@w6J&!oyz4bGkUXh1LQGwm-YwVnP`sflH5+UA^fN=<{w<}agT&59M3@QflGSI3F zVMIqm*L0*38O9yPW&#PHThNZMNW#(E7Ox$xa;TKRN`lDsEy*gPhNKdyM6B^75+T(j zWQLpZnxFjQr+o59&zU-l)*UH#^!*8spP!?a0W$a`hD_EQe)Ly=iFsnV{`arx&m1>5 z*QBYi8xuL6@Z@B}Y1{Jn$q6@MBEP<;sKUx*yiyd`()1_TRl&P0>x)Y)TB=WcM=^$? z#0a+2nJ@1SH1@!^6+AudSa(k9gHqtEZFzh#alcL&-%_M_jinEyb>J?K^mi?N<0xSu z#hIuA+Jk8oCK`;*lr%Hti4pKPR4nBE0l#V}$go=}B_alLAP+e*%wY5+!%*j$V4X0H#zbK3@w` zyGS3LJRj9V@0>!`dW^2P>HuDn3RzdI;W2q}G)`a;X(h;#l`een-vQ zpR2MU&~h;-+u=5sC^fSmZ}@zdY5&VFNc{;n*|o{Z30DWg+*hHqBDtN6R3c)3&uc1QM5s8&+{jjeD^z_ zaryi`n(YZH6-?GBXTUq0nsLU`H$BctYD^o2^9HZPFlCJ;guu9r{Pget3wt8U_cZG* zpFI0M#6fqe#jb(N56hCK%agnn~9iAC0>4J+@L$EVsOUi+?%yeiP zrCDMiI>TZ$b1wANaM@Z(qwV6teVhn!pv;Oz&8Vz6j0ajLB##gbB^H)&ATNsyqH}?e z1ieg4=Oa$fc-`Z4&-Jk5^_v_1tnD~Ec}!!sb%?g0lBUd#I7GtXK)3Pu<6gPe>ZAxo zoYt&2r&tf&$q5wAvL8_gF_WVdePZPwh5!H{07*naR9R@%!eSzw8d32UYa*?(tel0_ zhO5&HvU4yT;4s1*$+yU(x=8#ZUFx{o@t&BFL99e9vM*LC}LxKxF?QeLR7Vckt#o^^Id8WVO+`Qo6 z0^4rQ=A@(V4QBO(>^@=_CW61BC1czvQ?X1Gd<$D!&>4E=N#n?RWBB2pf5vA&{vrSK z|Mq`!xVa}}gA19h(yX+iXva8b`r2QaYQ>cfM_?;G0F7GojL5sKmVm%k<6UempQO4~V3)+cm+z^IHfmT?JO-`vm}gR8!qzB%eb)D=3X~4c0af6=cd-F-MnzO^MhRFb-v9*qX^0lQ7QIgjwe4hwt<8 z_rJ$_wc`5K8;n)N!@`RfUt$+eNr}}apjCr5ElnROIp8-dSud7|X&RPsA}$f_3a)P< zCzQ(MlF&(#s<|3Oa*QM=WSm@N->Qs583#q+LnwoF2GezfNs`;k5*Wt=F)Xqkry_q# zq-iYYCnub4PsH#Vm%5J0Y^ub7N|A!#TN`Jv#xRFa6aKnB!RvgDTsygCjWp6XKu$;k z-6)#2=d|%`ADy#WZ}8p|Q)E00=w;@RCY-ex43lv+xv6N-pgrf!iora9GPO;mGiN<#dWg8J6oMH}{2SEU5-nG%VA=Fwd2GmaC92gWF|Uq>Ah?;q-yi{*-O+ z`OW9oynOW9u z@cjIO&Es>L^Cvtxd&0(Aw%ZoJ7Lt;i6La=_aXWH126nH1&-vfA{6*LE`EP&86n1Fi zuvXy}U@aEtv}V*AMaHO%R~oWmE|%mSbJ=lmV)*o1@A2Ws->1xhyO+NvFZU1^f^D$t z6@BN?UJ_$X*Rk5Hv1Xys2|~c&=rE zDoLggqY}zPk`%k#Gj;w_1S4ByXeeSyF=!kZB~+n$?TTo8?9Q!%eOY8isccPONEjo= z$bKBzk1bu}aNg0cdSZfjxMvAVyRWDgo$CEH5a3MKO~qlN5hb)vD*J2-0_zWw|$&GYXtw^#i7>sO4sfhlH+ zG6dI}G}P9j8w;|N3A5kk3B(7^@vhdw%%- z6V&BntWsbj$~eMi=5Tez?!KT)i&iU!G2t6S+lsQLT1V0iuWmEra=-<{Y6VU2WCn;9 z14mH|LnO=!ZyiQuA+MxB-!*L3E0oUIs8LHH=}ed+^RN(;u2sPe4ofVF#u>ab*p#Ja zH$^O!te})2sJ#NcFvr3n1g5yq4h8R>ki=^3PL7uC<^bz6iWb_EQkD`mX;$cHXz*xd z&`po)6X*RJYg*<7?sf+b^N5n0Tj+RJt{ZD=Rg|+>74fwP+Luh8M_i7qoF*G;ZSgzQ zPA&6}hv$N>qWnA4&s=-0k4A1&Q`Qec;KMo##z?we0-Q-^gH~pAvL=hzCo^Uv1k`jC zgrn$LwURm40FO4dK0CzptxI`J#FIgHH5EuGM9}l~-;R~4HDK~~o>=cY#lt*1AwsE~ zi{&{eDgOHVYDsH5ukfX136_!~*(C1gJt2-L3Lz(gVEa(EK66SHtF@d_kF(NLgG=Q> zI8|?J3H~totQ0zBR8Ezh0xFw_`c$hyD+%Z-eN50xI$4sN8l@biNR77A76rtdgalD! zPj0LiP)SiJWl;&CpejvKxf*~gHNZIeK1$1MwZ2}X4arzp3*xbMTa&GWY%oO#LQ{^s zaxK4G9%1w)@w~ymw-EMk$Zbz{=O{eeiw&nIXAFlOH+Q!Thda_TlBN-*0#;`+X4pyq z1X31FASq4Ih7m`bGdc#;GGdkqpA~pWID8Dm{XKWDElnQj;=p|M2AeH9C0q{VGV|rv zzvK4yB_)q|n`rBGlf5CdmaGl2Rvf!rXwXuf?JXNTtG1;e^`$WujPgLkFebshqrn)m z(JU!5ghaa(8rQHCjmZ-BvQ38vp~_VAb1ZdFtYs}MrF^3r_h@*_HPE5du~NM}P#BN; zv8lnVA`2qa3N}-zgRO7ryr;Dmh?uPEwQ@A)$xJIH#Zn415Re+2X^AYc5VL+DfE(XH zHY{^yREZJ`DQZxjti&7`E45I7Izm)OTM4sjh1w?0F63-ht{0}mj!+`TdN~F}c}`eu zP^D7lm6%t&Hh5h>KP~4(YaMekge(L*t7`OKP{aDcRXERr8z?0U3SA2_+h|E^?cuLE?6R|ig?nIP3;*v%2Syfs?>56&vSkd%2KX%6@W6e3m_^?1g#TA z6&4^WD+$}Q&}2nx8c+>MTb7h@Dr3E>iHM`K=xr*NEZ8Nj1G6o*U* zlk{0@k1h(G3zmX4hLSQRWx^6jB`_&V_KwyYHtUYY3&swLIJAl&zg1C^ZZ-<71U+Ff zG{(|d`Ac&~P>MIxjGhd=UgMo%DTXa<>;O;N_F|Ie+$)kG}gU-}}LL_~#dI z`1cS{|YO%4Xx^f9Vw7Q~-rfXV^ z@~r!YX&Pu(YtGl6-mKU@K4+f-U%&p6G|rrMo~G-Gwq+?1Lq;cYfoqqrS(BG43N&(9 zCgkeK7mQs}mR=Q_(+Pdu5{z^R6)i-H5@%FSyt#VC)y-b68>7+A5KE@@4HxH+IE0Dm z_7%$^qr$+Glc!v4*K+vW9|$>P=h;yn#S<> zWW)K%nrYgz-)T~mXK2y|lOqnre5@>}2xq0_-757dUW%Zi-o?{PXYyMe|7bS&Z}r%# z|0;D~9*6-b_YN+(yz@2xKaS3Cd=Bq8K##vie#a$>^rjviw5q17m44@E14|_$f?YL>goG*MIdd_|CUK;KTPmq&qtSXF*4tRyA>Dz*xfJ zhOfW+Eom9q?eDl-ZE8nWWIv38K2!=-BIJlQTGEzMiYHj94Cz>{QISkXP(rF?iIfUS zm0BTCO+$;AIOISA&Kaz0WFQe|mNAIa(ppkdgp!z3B+LtGn((e;z3%XxCl+z2RscB5 zvLJ9;L5v=qyGOHFuGg+ILVn3q9CfanMOCmlLlO}rHF1lm%U@RZMpjD6<4pMC#Kn=lK>0F6O+l7QAK!!)B7a70K8c@eXt_ZsI5bQ)6+J5hNy>z2-GR0_)F4rm@&Y zh7qOK^5`tRa}zx6h&NG&D9~jbd^g_!g_2r00@?MWMVLrcyP8C0&QFSq26w2nDT&62W) z6R&uF*7ErBG4H?sDR(z}o_+n2r`tztPM?z8mU&3%-N?8sjA*W|ceD#MjmKEU+uof> zP6Y!rO^bJ$)k%k4^}Kp<#p~^|!I_OrArZ4-G%H?ydBA@Wuy)INUkJ;A z-qe9&t|=ZXd+BTn$;rMkW>xpWGISZzJtszU{pKZq_n-bFU;pz@Id_T2ms@(@aC)}p z(ZwkrKK+oh%^9!vuSv0>Ja|Bj12!Z|kn`nsEyjpAO?>}HpYiSYpYt!@{}>+=|Mq|X zH*A>E(?AbwwMV6y6b4G1uubi3E>Y$H*$`8b1eLLLeMj51+~rgSjDj+)80~6@>oUwR z?il09>zjMN`uG12r$78Y<;^YY+5v8~)cmYhux=AN$uqg}9V&%dZDSdinW8Pm8JxBF z#^D<2@4mRW;O2hh_WFulE)*WK?t5ZyKv_~oF#?_U4XwX=fF}5LQA=2d_19oGMlrhhvr=N29 z{97mrPPJ&`Y1ij`G9`SzV|#K+#tQ8yCdw>H)nR@^+j>ZeW_yb7*NoGR48XG_vQw&P zVIvfiqBPz$lv*1?F&Nbnu&i^W>5Pc>%A$;=X*-(jidA>co9l&`GII!ooXH^*vf?m| zT;IGQr^wm%gvK?5alw@IFo4uW=3dsw-q#x0lcJ<{t>lb0wNEuAC{lTXu4$}?S~5wO zmx>2p#>iZfG=N(>xYOV?>kQemi+sp2dm{Az`_ zS_YbVq2vW!QvEDsAe@vY7D;;t1#?)q+1)eEvbI^ZFwT*vHGcNkN`EkTTr{Np#C~_f zVcuc-fW^7Uyo{W67TdnZm#-Rz+u!r?2T$>>X1zM+laIfL z*N#W0E7Evi8Lqi|1L_7&&K?tJaO^2%#jF~F-LTuw3|Fr>Q8Oza!3C0YPzAGGnu-tQYF6q*JJwe*g0%0)--Zl&hG{mL=2B9GcJi4 z9)x>^h%>e#h(k$Y>OOWP*L|m|Cj0VESm+@ffg+X6JkJcnfI2_nWP8GTwP&{*>)Zlz z7IRPt3o+LFSXI*FA5aUAuU9LX&uMMY$vlwY-hS=d@B&)NezDFjLKdo{gh_-*ke5WU zGNZE!Y*Oeb@v$Wp4k;2+;9_&m>DejTdzO&!s}52Y%B(Rc>nS?cOF#?0I#+>Hn>yQw zw6?HziqqEc{CrLK>@jzx=g}`e=c^aj%%PyXMjO!zj>N+ti$Nu*WQy`A(@=aza6L&U zypEV$FgcS-lv#OBb^kZB><{F)=koCyqYk|MhyTdk7r&taeAA+=r&~GB9&Op2Zc(Kp zW0{r%kKDx5(-~)@B*JnM6OBHK2^yjy2SdyX*J!dzBo@~FnyeBr2CReCYDME)dT&{b zmFHC|u*@i(AV<7*vJMqZS*YJPGmZ<^!^v5XUv=a;P!`Rw3yk}L-R_3{ejpbMrXymR zW1?tijiXExd706wNZqVyNIBCw&DqHbB^!bYOkw2iZqFD3jgNF~Pvhk|Jud}qXJVcS zMZ`gp!WK>AqUm0Z^)p<~9lD)zfp z2$iOgt;~u_qwvMirj9WUL={j8Ldn&@qH7ae!6>1xs){^MwSJ(ew|(@wCftv69l1Yp zHD#xF=CA7Qth3YuVR;9^uf(ifa!p`o^)T~OH4!GFdp(n;^0s>wG2Wr%_j&N;y)y+Z zl@*_Ic{qQTs&^fWI)xT11|yAr!1GI;t*RP{JOix~b2VCYh>$HY1~J=ESfor&o)40G zti7*CYOO{YP*$ExIT!i=nuJ&1pr#&mvHC~7HC(Bx3&?LOwIm^BVlrr>DMjJ57eb>h zVy@C6WE7RV zFoVkyIc16w+zFcWfr`8NSV2=OA=xbqL5YKONS2z(?Lv6zx^Wu`0(*RQYG?FM2JYOGh9R6|OQ)+q0#a@8OtmAaPNV$n$i zeCs?bT0$t09m@iTDTsOBc`+gP9-_sU1#RUcjD%{`EHq6=)Kcqgt(94Oj`G@TXi;k( zw2a!nKrU|s70Q^p4^|Jv34ILQX;lS#QyU;elP$^+jf7RZrlIof_uAyr!t&uuw zn@uKGm#hM;)2w|-WbIg(NJW=a$?MqAR7vC4`g>Y=mpfpGwe zdSTUWk&4-nhia@MkQ{2tG5MH}TYxI8=v>9ODx8)qLwWTU+wnHRnkrT(a4g&_**qlk zcu1<&%~r0R%11=Bs>z%fD%!+UBn#vi2+KsWnQ5Nb4}0$KZXgCo5tSl3=_=+GFtPSb z7eVzGIi$ug6GNuNOj@$I*Q@KyDzIq0)-+bg2HH867ztxQO%c_5jBW6)qg!2IR3Hr# zn!x$#hWFol&Ue545#RdcLvHS_`T5mre)+rK^7p^~1^fGZ(lBv<^#x6ET=qR5oSm@x z^{?^mnh!sGMo0tm&j((PBQJ)?_3Is--O?G0%JOn&Q*f2x z%(UH>wRHsVnJJX8V2cRQ*$O2hSxrWxt-@qEs7NbcCZ!2iES=Fb!vO1!fyAN;Gm5ir zg|m*`-JabN7>0>qH_-Pz(H7Efff%qUpwrB{vzXJ4)iSf)^mOYL0mXh=IE0Bg1eRrF z3V{?N!@Ni@Rqc6~ho7wnp10-)RchQFxrRmdQ*~n_V!c8f)k~O|=E$>)OIE8D-nERw zfH4m5H1o8ts6p8{NKccliM4kt%d7j^=!YtaQpCBZwIq$z@$h);C90o2fK#&Ad+*t< z*W5LCTo)0&RW9|=SH6KTLLJf8(rbH6!ym=jqtQrdNl+9d0bg{*mM9VN-!&7w9k?o# zDG!45al?@xo(Yn?J&M96Mzl4|LHgm}9@GS1rXS2d>OmCF%2G-o6@}M4B!1sMgLHL; z)${YwZC3l0%sVafA{NUgGF6dMmx5E8u5Ic2p04Zg*0C^)Tl7d0Nd>HVr^CLy(+STv zu{3|s9e)(?sRI6g-EDsqLDV0h@ayMRhh5^Z%zv;stk)3w!8q{W`mbd9tfWWs4}aOW zzlWfvWOMXD{7{M|hMLxu_x1Q*#FF18>#2l*ddHolyf;& zazCI|MI1WzFeg%oB%g>%5tcwHEp5|bQb5@t?|;YVuU_)W$@}bY_V^MpW=Gd=&`pn>1DnnZF-Bz?uZc=y zddKV6J8WApK7gC)8xLe!<*|Cj{q=zm4Zr>B_q@J+!`01ezWUv7IB8p)vHa*y{|vk7 z*q)wo+I76Q-Lh?0fZ^nF%b+F(JCWOfF@cy1^Bj16bIrQfoSk(9Egg|I7hIfCrD5+B z7iTM;oNnY`oh>L&B9LtcX8Bx-LM@Us5?OVYjc+mNph+PU$TU_lzS%JhfjkCUZOAcj zNCp=ZB#qIH48<5RCewSzryqXAcRu=vN82qg_iyOe4jo(m=5POot5+Z4oacMr{gkt3 z&#;Xmph55C8Eb4$MYnrH7lV;(KL7hf^$4)}I03B@IHAEDKSZBm>#%kyo| zS!-yz!hU~`wSvQI&5;1r038>bOE&8*(RqgGaear=4f`RGRYS2Iy2;`sH%j`ga;!B> z1)~y9Wf7sY7IsKd=qPCJCC-d#W{xw;K+}5qu1BewX3qs@4PE2vGulYsansT@Ejnw4 z-Ja>N5JRehnqpZZA!eFJqfN#*i)oAuwH6IgM2SOC%qa^JSm~O4GSw9)>!5xoNmXU| z2Lsdtu|;B#q_@o$RPP6xz1{3YVzUO zbts3-TnceU_C6_-vj{7(D50Nthq3ZL#+13Sclf5IP-v{DLDO1=wHl@6Gq6bNG9X62 zqQ!jblng;cB#D(+1F8t3)Yg4TNrDk=8%tw6Yj2sCL}3={l#=8?&PkBpm4c!TxCDLH ztWu$mLX#=~A6@U!Ygv|_={?JBbKEs?!(^nZ$||~IlWm07K;S@-pg*gj00Dvs2yMjf z7TM@7Qr#?;%dB)^uRUg)Wi|NLIXAM{%1PuP5ck}D_Fnrl@B6&L%RrYvR8FwdB(hSN z)d&2&PAt(+8-1DdC#U*cV0>AiH z#MpoE$tV2m;|qTN+k3uro`uykXjU!!acekVZ+K#R7V47i;ht~4vwZ*6gxU|R^bBD~ z@H5I9tZ5{|Eo2OVq$f}odyJ)ln$34~O{&wQctqnK$uZ#u&pu)Amf-9J$F z?-+Jx+^Z2a51g5Vjw5;ALl`lQWGwm|8n3O1h|#P)hPstGm-GMei(Ut0jRBtuxUF zV(`Rb2+51U+bppC8LnT-vMx&=JS9QRS?sYmWtmf9@`+#qWg0NHFa_A_6}S5tAE2#n zwxSfaX*oMP<9xAZ_4KKzhg8cnMYPe(^T2O@`z5>W9m}@o$&)LZrsw+lmS@kOvREz1 zS(a*zH56;BLrYxgnkcRn-GJ#)O`+);I-5|9+(%X$v{}lIHgp0KiB95hZMhq8E37g2FiYG?E11n>3X86zu`QEs$Pv2r2De;6-a*q4v|OL2 zZ*e+fW*Htgt`)LW4n!aEJ`uywJfYCqi#xnEf-}|z)oGM!m_sDSiKHCK39eVCByo{C z(>5*Ev>Zmy95O~bS)eK{c!T87G&CyWO~H1c)B&6JP+&VMwu8(GdZjTTk(|Mo!W=!T z;;|(XOrf*qY!*Mplok8&*9`fV216)InJtxxC!OJoXV3Zc;v?qK5sPPIHQmbKgQZz4 zd3yGQzAgOG%PXE-euA|dw%Z-we)(Hozx|eR9I#gN*=L{8Z?0$?!JF%x&?#`SS@Zd) zpYid_kNNt|mi6L>#>(@SQo;y$UIy1nh(1A!Jl-G%B3&dhXVW(P^wUrIFJwlgWCl|zEijiK_W7kQ zg-Y%Bl*)BH5-GY?V_N!QF%wl6_;E68>a0eqAL{Fm^h1>&=QUbmvO3jkC-Br*|Fju##GK8Fos?IQq#9|hVPy}k^q|iYNV+ag$fJWo2W3g&kbgf)}n`t{oo+naC z^{y=S-=)^;^B%(#^ zl?oW+XjO+X9a#m5$BGG+W?~$<3j>E?;_O%7^U){YGv>t2yVrdGu;t(UtN)WPmL17k z=vsn{cpX@^XI!nHarNY5o?U&y?sms_-!weAfdBgM{uQrY{FXob)BlmhdP78sK(+4d zL+qH#3d{o~k6 zITy~_jyOifyrrsvXW{a=XBI z5mk>5JJcLm9*r0PB{C&LE{a4;PKq&$5zW%#ib7dKzv$6z%OUL9?F0Mdi81o=#MwC4vRFEt?%B_YY4!|rA|zS* zrc(1S5i-V6T%C`baHURWHKlW1+*8RFk0g$|X@4BrDTMm0)Ja@(+!0Zy69Vx(I)cR| zo@*>>#Q>c8)^c(Km&fQe^%zsCKCm?%7x72hhdS=Tj^t6TPUf#;{<^MkNTn3o%4e;9 zABn3a$XSHKl53>9sgC%g=}dl3I-c!ywrXn+Tq^BV9Z9xYpL+IE<3sYv?JQ^ZvDPm{ zikeYaIej!38niJeZD^a0#=&G!ty!-Y^j(8B5~0&rdDp4})>y&Sm+FMq64O<(fs{%9 zfGQGAWz_Nl-S3itcKFnjKI19$s@hyBd$ZepA>54!>HXQH2&hb<-U zF$}C0D^zSG&cr&hb}}ndg-|)M8klpIrFsUBB3X;Vp-Lv^NSreP5zkyZ*p zDzek9v+`VNp1!hZLlQBTF_xkX&N)gdHJ+lNZNa)s+kkb34nto&I_(Kr6NlM{zh*yVyB4ou^~!|j1-3glx9qgL|6>vLd? z!8t=?4Smycb#cy>zhJXovt0BTAFw$oj9w6{da!X8?-DT_n0%r&t~ya7%0#r*IOp(Q zibAqvA1S4=T2$B9D$n zhnj(M%su9WY?eh)&UImu6*|gDQR_#Aqt^Q5t}Gn$QUsYnPLvp{`cvati*Z_T_;Dte z!Z;kbzrSYp@Bq;Z-c041?;#J;=ts7Pz&sxaaiXXMN*eT{61hYa5v{B!FiBFFrGPF8 zs|!{oiq4`&_X9cvy5wj}k2Ni=E38|E?)RK8HBUAjfBYw(@x>QkFvrCG*0bBsynT1a z928kO-rT<9?dw}QTDI=MZhzoxvEncWUcGtGtBVCXO|%!!7?Pq@J;n$=UUDb|juNvG z)Nz97s{=D6jFMay!6O=+0jCWPjZqpWn_a9DIBd$X7RRFKb&a80^nfGH;7TEtNHm2) zM8%BNic~cFQ5NMfM^f-o1e6(F23oVg8cVwnl0m9VUCCF^#0U{2dus;OK(a07VMo-C z@84hZjkD;@8SP;bET#tCbTqwS<&`poG@*6D&ojI0Yj)wl{{AiN?0I^=W_huuJwGEh z4MU9F4I?22rV#O231)JPn4GcBN>&{j+gNn5loIQp{8*&O^QSdrW$H6fDmqA4+l^;0We;7xvAD8q>eX!*}g`@l+w_Z$)`SCnHIr;TtVO{vZVShyR zr`lcf1Esw>E@e-R$>V3#zb7<^QJkM8C&_%{cwed`-~WW~Hv+7zGy_hm`eX5Y`d*c( z`NsN@P@syOCCZUamO-L15;;*UXb}YEoEdY#51w)cjq63W=tokV(XNw%w{bY9Xd3YI z%y<}CJICi|E&Z~WOY0+ZjFMATB+CvX#qHOxUh(Buza`8ELfCK^BBkwVOpDTv6n#Yz z7L*RPG1nAr>-VEUOPqqCpo|EwR7rG=!&jomF_#%71B%7P1^cpNU$g#FOf}{LQI)1T zq=-QjjtOFngg6stPxb+844ciG^=5@W;u{sX#?dH;4Y7VNl8=6*@Z{P=9kT?Fgr5_$ zLW|JHFkx)NqUlAEN}(xWi>A|-cG066OCT}j%-#JRfA_23a@kqFc>aVhC(U2~hreMN z;eYt&f6nFiTXt#W5JtvfxKwaPVldEPFLf zv&Y2D#&zH<_xl}(-2>5kh#8}*ATej5z8E8e8Kq9aA5z&lK{q-PR5fkA?@`>|-|=n? zJnRolF)_!8!pj+66|YWPa&+X<^2v(}e)`D^+Eie-=lQDV@}sA?%};px&5!s${`bG+ z-M8QIvp@I||I7dU7o4AMxZX{47niKO;xGRDzu-?ld&&Rxzx}U-2vZ1r_x25oPcImP z!bimv3yo2X#WLrHqEOMV9tof5lSG0g3sboTP!;$nFhtWZzadq7f2cH46V};211ya{fJhDwy`8%L}+4^ zsKA{SG_Mv!Y1cTig4T*_#yCae4JA8bF{oLZjhquoAyG%gVU3Y^nyd-RNSzm{^+c|N z#mD#3iB=QqfY*qMTIZVKTLo5Gwo!6^*2c_eeH!p-T?IuPk%t!Tv_zQrAn_H}VK6_) z<}2!hDRg!FD;^_fN_7&6{R+VaDlO4kniID8*aw6dNwFasMWZ^5+YogTkxOGJ9+EIw9B~vv9AxkxVOJZib z-E)1nDE2AF&u^iK8`FGJs86@WyX|tn}NQqzl>Kk^G z=Ir^$Y!-(9?oWTrPd@*czx(@NG6vv&VD?*F-=I`OZw)pkmQ3i7us$)rdBgSYhMSu= zgu@a<*P`;Tpm)@&45t zUVZlsaoXZ^;Yr`{^0UwQvrnEf?r-?+ZerYi$A0Lz$qT*-h1*hCUCmrQ`w4}YE`2xjU+WOHZ6bq+b{7bw%c>&>4D+lo^CD_y}*+hoJGe8(;A6P zD@t5*MQW0TBnm+(nr6w`tvO$6N?P#QpZ`nF|LhC+`g?Zy z@A>}iYkp&Ao__S4Kl;N@=ns3kwxNuk!#vSh$EtIL800-_WeKBIIT;eHYw6Z&R_B+b zQaIc{up1_B?jM+9#s`me3+cI!3ezmLtoQyg>EB{T3yz^KwhY~}WAlDZPM)WiPq5a?68x~`?VCW;D!RTC@=I3an9+?yHrfw{ z@nEY9TNn)&a+_sqakP!eXBH6@`Py{lr|Dg z6%xbV6QhXDtx+tOt;F6;QVXVhq`^qYZ!|^RTR^WJx`0!bu4!>ihc%ixCbVftF*8pd z?-Le{Yg(Za)O=r4V{%SJKP7Qts%>y+am)p&Lt~Q6?ZQlZae;br&Z}wSdbefS89J9C zc_t4rC6?WS&z?TxV!7n?Zj$9$2ux*9Oqy0(o~;*j+2SY9`05pRyRW$)2L8*h|DK28 zf#qt+YPG_+7T5LS4$PL$8dM3)u)A4ef<)_I~a@@>oIlHb)Fh4Ko>LBzvF zmUEj$%d^drv%ZC#2-8T86V?=#s}=obC63e(=-Qt3<_u>nhdB^K#4N->WsRe28jO~F z=u|~OLL^dkv3wNKs~?E!`M@l3T$q*eh@4hR1nc#msSA%xG13R*c>H%ODOEo@W2poQ zgCXl&*@23plNdUbCKt^d3;QXMy=RJYCWnv-sgQ!FxPjcXOeqoTqMek8Q6eT3=Hz%i zb?r*kf&Y=>lm&;4CTC4a5=&N6VxA+1!$`Mk==+|&@7NGo_`6BhUu42MeKV4Kc%1c!zyfLy6F$(K6rr6r|2DH{RR#ReN zoc4@<1XDO$t$1?2X0vE<$UMlYg0fKZOo|1qYNSZc5*J#MOc9w&W(x>}a1F%#zLRnOOm*p&rJ?#uj1&b1yb-?R@Fe4)|Ol%JWgHwDz zdcMBfqO@Tc3txTnhF|>hmwfRr{s`A!vfJ-5YsE!($@`lT``v3+Ig;{g7PjE*HN$qv z`&ajztu`zd_rL;|FDV!z5T-<$MocJ}Vo|Om(4twP=_;Aa0u9P6s%tpXV#vjkV`0uR z*QCgM8!c$}5EH}fIZQK!f*m3y27GVPiv}DV=EVE^J$J**5Jdb&38<_nRm>|Q;3_aS zVw7qftQMAHEX50bHrS4wlg!JlBcT~Xz|R3p?Zrc3KSqiVxELUMnSB}|R}9`WO*12r zq7?W0fw#(FfkW_wAhSQMucGDMRHdaM7COvZq@bVoV&y zz{752e~^1p9cx9ZVd@CPR~6^3M2L_}swiz!m-b4cbC34$saLPm-$T_sS;^ICrcR&Hpda=2x<lw>%=J9w@Vg_m6*hwqi-7)UCZU!8BedSaK@5?& z?%%WDU$fo4N9oA3bxR0_mW~c5q>G#d%dUlfDUwQ9C8pRsfhh)66y6N@knw&JVS7@jkSOyGWk!mQ zgbe%C&{~P*n$kehiJ}rk87NNLz%2KbHl@Z8$7#s`KU|vDX<*%n*{1{-v6) zb<)Hd#jH>@ZLr0-o#QL+AmEXN)tb(_6ZOL>i&KU$&dfR1`1tzVYl(4IMdn$>wIpTH?Sj>XrqB@m zfy4fQ>j(DJ#H42Y?1>==EinY<$&*8r+y{k$o)i;STaxbjfClmY3TxzxqShY|)_Smc}q zv5=CWGD{J~snJz=Dnqz(%wE>wlx(!6=ps2HN{X?E!5RqC2mBOi8zT>Eby^u`DWO#HN32WSa*91D$IPspiOCZ}Bt|J_QmPp-My`L%fjN7& z`vYvvBgaXoAjzt*QsCy3EL{JW8W|nDgy=UE9K6>$#_0<)+Zy94|h%;00@)9Z;f5c3OfT@MN zU`1qsskIeXJtjfex$rNZb0dzi*fr@&>0ci?WOW~rkxQkEZiaOj&RugjKVc0WF1G~eP zah?gPpq-&qL4L6c)mT&#v5(feVz1Mq^Zx@ux2ns94{>8h;zq2I6+A{;KmHx9t81K7 z_L)-UACcHO>BCMsu~YWiNt{$p3F;p#4}>0Z%vmogRf>oREy@XkuTE}mRUQv0rPS}a z@yiM4E6u-<15zx65b)kZiWmdV7!gSwi^;4`MeOn7{kN9#Cyl83#|!;(L?``Vi7jy` zh2MAB^TAT(xW-Q({7(9$SU4gfAAgqq0aE{@Zur2Me-r^6o&7~We%_pNEr4Zdd?K%? zN_;Ny49e;OK9w`q}rx%KH#G0usVlRWLjjuYXR;fc9Q=g@LdcVXRu_58T zXPzQZv8f8ys|EMN!2SIlU2ExD!~gv^{}2EA-~N04r$7H0X4%0Uz(-NoYKyXpVl0cM zp>0~w4quB>r#16oWY|sg?FCEMajP3*7MD2{6P$?@C3q^OU2P=P>A65hOv#uc11VA= zr-UkX>7*3aIacd6D___T6Nhmp^q+HZ7CF7V;|ie^*JkA8a}kbc4wFvNyQ6>PD!SwZ7sIb z?8Yrkv8=kngUyoRG-=w)mn_y7eEI#rw>OEu__IIb=|_J=iA(nPJ6^wjPfUU3=8F5f zfHBXQLtw`7^v7S|Ee^`IrBix7#Kk%cU{4t+?^ocmgbiwJwi;Feu&N753 z_}@G;mcUv^l51!?OVb!anB+9Ga-Z%W?zy?SVbioUZ6nJQYcR!-wL;He%?4{z~Pki_O9pkj)t1o}WS-;>9 zfAmv+`m;agpZ|+LBP?F>yNd;f*WdH=|M%Ct-Cm>CPnenw%d;!&5}LIL28Wz@Q0KJe z30tMPVPXmyYkFEblr#7#;deXU{?}iix*k0%o}7Qg;3LsC+$YCvTyx_!@9rX7b;;bU zDaw;e!6(m{JjyrBlci)4DTExE^Nf!k!i+96r3~b7#EnDa9EWKpdXH%w%1PcO1!9mo zSQ}HZy3*hpC-=%~)f2K}N&`wIv?;V&NJu#r;+#l8XFB?>M`_JG9mH&zYy6862Zuah z>V$|nCCwaj;VbS_A;KsWBx@+)gI#|uC{%U93m&kZvDQjlkxkVJA1S7J{I^vVar9uu7izUWH%$}Ge+Dk+a$1!ILeXk=+> z8>t~oXi#2ivf?z+i2A)$j|x`AgjOqbmLQR06iJJ~xh>FZL$5pD-97O7?K=*;_dHyG zRhOn`w9N&*>QS*pCr@t;%U1HCr;zX^QPRk`Po&B7_Q?oV zaQ4D}(8B-#AOJ~3K~xe?LeV5`(b{u(|DHQzX-q?Reo1dEA;S=*_Imel%fsD{S2u6j z4F}c>$N8#d&W7%+=f%?vLpO8#K5+ZyHGTV>UMc3A2UOG34h_qFhwIOoL&M!+$Gp2? zdboz|9dnAXJcmwU?G@*XbEd@wLpyVyBX92#!#1)$*IcYL7c0fE_waB}X&mM3hNdx; zI5PMh!|fZkH{UVuud#k0noOrH%J!8GRIu7Y(@3A6o#1ne#FZV%NJ>KQW=aT`c zK7zm~Q@~nB#N*>gQ3+=oap}#GVLLE%I}V#`iFYf3%cbS%*#&2tD-J=hy;d2N_pBG- z;(@Qf{0H*x9)m`;9h1*=XB)ox?Qh6_qPLb-X@+@;A9ff&5r+$wXB+y>3WFgg0~umT zgn5FPX}b>RT6Qr@cDGSAV^!+PfYd@4-Gb%WQ!ZbA4C^J@DGs|Ez8mgX#61u50dx6` zt7S*qIGmSEWUUol-*Vn;h`GT>&^h6>ETDuSC^M0Ev0|mQxX6bcQ%a1L=%khASb>%* z39ngH{Qj1M%>{@bEy2k+yBI>mHNE9kkuvv)^uIp=cB;MiE&$!{x8{Ox<@SU@|RX~@Y?3UqFPwKYf8wv+&kRfH7L#&UUa z&Z03~y?8-u1)bhl%h%t0&HHz6dGXP6tX+^o#OH)|?j*P_wKiAUohV=mTVF{M@uG4; zl@`(jjC5?2Ap5gs9$?pj{FnAdx8)NWM z&hobDh%wS@OW!X5abX%`F|NZ0d9UcA=!`5=W6mT6p&+PtrO+*OT_Yl=qG*(6-L<57 zCWb^YiDG0{WQ>-3vXZ8fQXIyS{b5A6A~YIvK{uJ!NNki1MS^~-U{}a#TJY&ckx=Af z@JSKJC=2_XWcg{@inx}0N;ev(4AEh1%f-brF3vB=s;~=z zdp~p7KcKE}c(Q)NdhwLE+k3wI{yW~?z2ko8*^h;X{lNRX_t-|;v3i+)MlZMc5FBm4pB~xfq+DAN$D$xU$avZzE=SF5%(jTq0S@xX9Uq%g5O>v{U5VYTe)bVH+cUCzh) z%xhICfKqjqQfakH#5lT0Z*Psp^^VdiqJyLhHqESCN4Gko>6bKz110P+$`O$zM@JGu zsA?!^oN_oUC1mF61WxftyV4XKCN0qO1G-7LGlzP9L8CT2xqQhdn;V`kmNeG#ez#>x ziKkc3_;kI%{^kv@zkZLudCTt>iBLRa?6}x`!L)_lrxvCKEGifXxUAPVb;vv5R(vuMfP5Z2~tQXUx}YbbhNhg#emZk+f!VRGltT(_;6tMp1$d1 zZW0rd4;bg@`VM0>e$Mz9$y#b0$rqRCUK0yT>*(8#Vl@`cZnp=Om{pRQQZZQVaIF@y zmo8{)X%o67v!=(_ENSK@;d3gvQs0gAp%NXN9t}}SpUhULk*pF-`*C)dYY!;2Qt2U&J#0D6 zK~?QjB}cvDZ|iyUfdT6T!#|pjjuT;hBENAOnb(-xqE2XT>iJOWxv7uH|0)nLrq1c| z2LzK3`sSlco+HWngP6KlW1YpO$Z4s6?A!Cvz^WX^<|=8BbKE#f;|$I|0r#A?ZE>!n z>({K;8y1TmYoKwOzAKM|Hj`MEG?%|Ht?_V*G6Ps?uvTf+vLbvF#-HNVpEE`KlX5A@PeS@|Q-D<_M z(Wp)4Pwmw&} z$R0T4f+>*{y^Qnf&NU@@H|t zGSX2PWhqJ%Q(z7=Ar!_T$=>lWQFJ2e1*$XX+@N$I&R)*s9K_(#HuQ_0r86|v(zg~@ zeQu2vAzdytMq0w+g&JcT6h;halg1z-;fzo(glyYTQlZ1*vSNY5S}==(TJ)SPH>`V4 z3Ina#GWjTI{#=;mz%)sOXo#8F2fPn#W8&`qK)l%z$rxj>MtL%!VjnZU%sA&sT>>>j z=^=YeF0@9mTAj1rT(W%_2vfvqC(F5`jOmzJEgPv*;ioEJAQgYg_bJt>d(4>BN(wi$ zeH^;!iXg7I@8l#Oo|GyoL{+D>ECp4TzhAVj9V-<#Q4t15)IN%s5+O>nmy|426t!@x zIiWcvdDvB|80vIF{!non>KG1nL{?i}bH3^zQ^PP%+-*z_X!x+WbI_9=xN2WMO91oNvm|}5Pf^BV$ zrp}Zh*G#~8iVqN_u22L@7F?K*kr)N>no=NUOU!k#V(I~HVDJ+U!R)(+HNK+C^796}0$ANa@x=tnGQ{eXcjz&A?G^2{RWOL5MltkE4C)-A8vM!<= z%1N4rlrSVgfYk+NJT0&@ral+P+Q}uJ}6XiucqO?9x za2Q=(A?5>gmr_^_Dag=YtLhfj^$V?NcCQlFYJ!j4-ER5OG!s*xkZ_H|_=vLxbY}N( z!@D=%vtBIulb`$)qeb0Jil|~xjTJFW%2*}YLj}d%{XN@ zBH2{DeHIdmH8>+~Gev|_8&e&K%!nD=QW}G66(z~?J=>mQGAmnn(OafP!+U20_0u_g zwuFPm`$F)UIV~B=K<*VfD{|3-QuUrW&o~XeX;>^)bp485zNJH>b41%ruRBqdRzXH> zyN+QXq98u9jLHdmCNz$s@F}BmRo<2?%^{$pLFJ56j%l|iris=X)?H7N6eeZjB#zoY z`TSF!pD)O1U`X(rZ@=Ny_itFchKJQ_rex?l&HnztFaG`C@|jw2`A--8{1^X~|M>NH zynp|ef7bp}uDlvC?{46$1)`zROaI1oXu6U%$KKql@Phz2W@hm;5*nbQIFydHLc~FiW1kxZ&;dSNM5?<{Z0L z^iMaG?C>GsS8MX(B@T@)4-AvWnT}!{JDqraDEynh{yG2YKl}}2QT+UR%XjY%L^Ll} z3*NBd-@eKG?sm^_<`p++4n-mak}6Uw5kwf6EZIBeDKO=kkiX6NG+Kk@t}ei=5ZTe>geGZ7u+oZ^k?%BRa89wYi6IHJ#ooTuXJ%p)6KQ^j67%Ie51Ffp5P1j_GhM!jPO;^gWwpk2CW3$_K;!l!VNdVr24( z-67!G1x?>!+vbGwG)94Sr=Ua+ z&ljJ)pgVg)(}6Rv*_^RluE+$Y@sy=C6+7;fKE=Dp;PDF?Bj zx&`N#FX-)xIcjKE%z5H^o4Ma6noh2B(>5qP!}fuFJn;Jc&*_&FB~1*|miuX7`}Qqv zm{=4;lZp(jjr4Qmgf<=8TC&P8XH=3H8lgzl9#|DYdzLExuXx3B6w@E?mm+!Cb4Vne zF-8+oBx7is79AiA6A!o7*f`L%mLHv6@$~YH_0mzM89N-(plyW5I8K^Zy) zCKYz?-qH3Bg_p%9FscXa;+#1~@^m1F3zT|_?N&5yg;xb1B8S7C5@wuhcye{cu)8OP zkznNBut^rcKFvfX`mUk3GvEL2m*`zXKW_PK*%MNrS$6o8G1~)^N@P4!oQOG)hna&; zY(9F))6Fv;wiD~V<9xMZ(KuN?Wr>+fMpK%WX0;|H&o~_LDdF0NuJ7o&{uJ@&oT~^( zNYPVrpjDb|T4Iibq8X#&ehf^9JYmllXcP%Aq@P)2f(y4;di`wgn;D{L#8XpbHSP}V|9&F3y z^A{AIm?qEN7F>FdWoC1BfpQBVU{NFtXa_ZZPnl9PX>A<<7SIuuoz%B^qF)$Ze)17t zeEuWuzWtuO-4Pnc95aV8vY$Lx)^TxmPT5}*y=R&ehgfKvhNjMUbVXV=ZHKWHJ6mdx zqV#DzF7b%+?yI0rjDn^vLvs@MPNOv{XW~4Gc*`2eU-f~I6UG>HDI(%hNaRW>60H{_ z;~c~Q(>hXtdGKThOV^R3qJ&780)F&_m{G=Ij3JbW%34G(MM+F!lE|B*J6fCL`(E6= zi>ARIvwBmaq*?l|Y$Wbbi;=@xi*ia9J55X1wAdqN9U&zYs5 z2AD7kNhPdAQKGV>%*u$!XkT}G_tWiWF<9IE-bg@$XK62Aym#+)KYq^I>-)ancgj8q z;sVJC`*~u{N$0eR2FEo7-w?(^lFYamc9T%V(XUpxMmw$#+s0CaY&@m*F&pY`5bbNm z7-G)M^GHr3nM@QV8D`1MDRMu}>|!Be=n)#9(hA{9_Mse-&YhJvVjUafgFS}j<` zw_Ht5D(+iNEIW%g!Z?hWyE~fIIp^o+y!*~EO|yo!(8MU^P>tttH8KCt)>}nGbC{ES zH7OM(XO*m}hf1oCcXxKFG$Px;{a6E>R$ms-jI*O&L~ulJmsZ20Jdk65ig=1m^>;>&?wezWl6 z=WB8~VAK=Kv}YV{*zIoVLZazGT`d%J=ZOD~mZ4YN^YcWo%mD;wWU-hh3 zC#<_QA+&mZJ4fRSHciAiGscDMl(^|yF28?Eiix}1J-cCMoF|5PAW7EOxEP$XG|u7F zy;tcHn!b;-o{2F^?@DD+fm&cmIunjD5@XVSaRFZ`w6;Efb51NJF&BM~2iN07t1g;V z4}C-KJM4bTlfe>4$3+jjt8aPx{de5njigxcMEa08Kk3wd^>&8RT{?FZ% ziDKDows>#pHd{)wru18)7{Vwt^A0oJ^Za~6V+Y<2cSypN{J8eeWf6p<1^jjf>vxA{eX}Jl2ikiwHW8IUh6oFafoQm zxmHfudhS>1nl)JM|QVm*YvEmCW7 zQWS14H`w;t~;A*gAvkPu14JQF1m zr64I{jmH_U;7BR#t8VF%Rj1YuNZe?;My^YZ3Jv?pq-k$I4iO?-A!H z&XbK}ToOwql;^B7`#h@AWf~`zX=WTo{Hi-cyu-u<-m!8E`*;t2pezexp0Q)bH4RPE zaC-KXi}Qh-%R8oBM6#vCRJ-OZsYK-1V^asSqBm4qpwK)T+z!b6QUf}N430U9KGuS( zZb)6YRU}GLH<~*nD-XThP7tR9l99u@{($4uS0ow5s^yxO&4;zW)r3GwMH7G1Ok5U9 zP8C0quvrJII&~m2ljeysNAk2_C25~)k)vR5jm3Cdm!GHf>xJM9zF8C66~=gC(jm?i zs|QdKmL-v8U|2k9E>Ik)WR__rF9lg3E+ca&gw>YwZOfCDnKLe5m6vUu*pIcoVP@Ygdm!xL}-g}@#KPU?gsYvnfGzw zS!;OW0{#6$d%9(A*1VbT*u^XIaEWa?W?(9b91X9!XIyMfX+uj0h41f$%d7W{<6Bw` zFV8>VWOYJVuXV|xeth~iX!o*Y;@t(${3-wGFMi6qr!RQ(yKlK4_WX8t$@Or}t#K^7 z9rN8S?Yd{(ctYd2djFQZf6tSZ<%82TpIn@=Jv%#!heh;&G!7%vG!eYR1RZ|t0kgpY zFXjkd7p!WOsJ-pp>SDQiWXeH!v=3cOSdSP*R*mDx)%6txA#|Pool*s4Yip&24u_>C zZDYwyab{c=x{~O+9@jMZBaWz6QB=qHVUn>GBV^kXWcmQg>$-V;JY+c%^U z!okgIYXYDcb#ogzO1{=S#vF01wQxl-H7eR?4(C# zJ-$97nwU7;u^#^wF+UW#jU43ehrS~Y_ebOh;3Qj3MGpx7+K(jqb71PCqaL0}PM7U> zJBB>5p9iL8AxW+^4|-_SD?9z*r+zGU|9;y32fsf|x;EG0^r2>eM=APa7XE;qKM?Vb z!*Q-tul;u$21Nc{f2fOu!>jrGNqgid9GYs1I9w+p^?IlVt7D(k(H(1!gSsgXZ=kDq z!;VkGb>sM?|w~{@^2);lgVEqQS%G|j<-|xQVgKxf|@q)7nI=H=h z&(-^Pe0IL&;`AKJ&^8@E`T5Uq7agUv;2dJK-%juZV{r|Hm7rfSAl8;IhXAi}MzjE85dI6~9x0l9WhO zGR9jxL1%$VxUnv%`_mZO(BVu^PHKvYDYMLKG6})5*{tZ-EAW z$xjh0oUS`s-!krJE^qGm_Wd>MRm;9ue1xI8`y~r5CwxqrUa-Puy{Z)+dLp#WGmaDc zVUK_DR83s+L#xj1-5uY)dCQO5fbDzmUa{**9kTj4sNIV4h|qDUj;KgA(C*yv{*Kd= zRtMZRFl58&=7hiZ%U|&9^qhB>iJQTbr%6qMEI1FVu4CK}?8lk&(+jL^Kw1p2e|wGD z-7(z0=c}(@^KLKfa?kRA{cCPlnLq#jSM>QgfAaVKAr~i4IX}JN{oGcO~~E7Hx0t(bOG@t%eh6Zi8qVgjKl zm_=DJ&Umu7DgbEl-=q7mUI)4sb&pmb`q@)TPED_%CR-)6Sc0oYzr(ZA=@ZcVKx{TJ zPFe$G3a%*_Gb1(~sW@etkd&~}YiC`4jK)uh3A(H{swpL7kfEp8l&OQI2>v?+8^YYa>|L8yak1%=S%P;;<@;8~rIa-wDBSuB)oCV3XPQ+9bkx|@X z$`O|qa!!=$DtEqS(qblb0oz#S7?CCFGo)+iY(1n`glrNI3;5tM(&8I63S>!2&@fVG z37yA_#JX;>lx!5YYAsmDQr+Em_dDkMJK{J%N`z3@@9y~a+uyN$3DFeV*3kD2)1;z_ zRN}+g*$QL(BT>fJK2&3!E<`0T&Li*Nzv1@w8v2H5Ni0hw8G)RuKq)Mel(?1_cGJS` z%?HBxR)7>q4C6?f23(pkF3^Og z($p$7*9a0k1&=X3*7x}JR?T@u@r&2HiRo&`VJ@g2Kq;oYX4_aFcOAOJ~3 zK~%dp?01SOkF%xVx!ot`((>77zhL|FM?7hT)vDos+7ol+{p+{HWltBLkYt55x>Uct ze8c5X*zE`8?j3YiFOIYYb3*^*W6oZFN)9Xba|G*1(r`J#Z@=F$70-Tx6diLaENNi4 z{5!tg|1Dzgh%quOd$KpoOQdm4t-pg}v);$8qjiqp8ZZGPfh`1&)znioSt!he!=c;=KlVU zC#!SLw`+2;%;Q4N5t(*eyn4m?$qT;u^v7J^T+*~_#8{#=7~|PykCDWkXd*rf?C%G% zv$(#+whbYyFj=wojbA9m5K9kX#TX{$G!m>OS=brNt!+tWVQX7jX=rTEm?PFl+BPza zWiB22#jqa+R_%=U!eAP5=rHr7H6=wW*?j1Da(bbaLv?W++J?q^mXxq2Y1pFJBP}ch zPofZfCAL^S?99WSaTqw+p77)>@T=c^$2VX8Th6u}Kl{a+zG88gX{qEGdpvI(e6k18 zutuE~;h7dnnhDhz3{pTFSm)@$D1-a{%ZF>y8Qd2@Hi(|JJ(#3^wX_e8IhLsv4y zg;F&6Vw_f$fL1Dq9L|{4yjZl#FpH3qt7mPc5cyi;mUAMfNXd=%+K*$c^-?2bDw$#m z-qloa-7Ptz2mg|#rtCD-(%7I2{$(LYFd<+|(S&$Pl$>$i5Lyq`G0qEfT=2oFkW+F! zQ&kdIQA&)dpL?9c_@E2TS?{l`g)Yw zg-R(%%DA9H;rZE?VZP_)?mbQ0uYO}-lLqH{iiz0J>Yk%fvr?29ZyhCNVqDa8(5%>xBeyp@ zOzUxtSKPZ8Y(-o&T|?-)igon_6EMnv)g7k`b)TW;w?zuM_PsZ4V7)oz{OJpxJbTF# z+mg%~^ZQHfosEgc2a0ptPBU!QbX}+B?Rt&ms1=r}Do(cUE`E5%*2TE)Dj(&pDn?jM z^D4aBN;%c!qpJzfTG1z(h|}}FRZ`>cZCWf=)3jBvvXxe0>vf`Hx>jxGiXAUiaww*f z7d)6)j>JQ)C_Drq48}PPVilbYixsjhTInZ;%8{fLNeYIj##UpvP8m|-i7T9TaIs!< z*KL`m8Iw9S7?qKdMr_gdDpM;^(d#`lmbUkVw#B&~=fIQ^jKf*4=jx&rCP|dGV9^BP z0j=+x!+71RAE|^!SZqOTq6q=PGt4kzS)H8llaK#^pFG==r-em4^E_ZBLy0Od1g%^} z49+`BO1giyx*^ZYOf*1Psi2t*P8yIvEMCvx*05Uj^u4B>Z4Jy($p+;>x~kvu!I&(S zHi%QUl;kQaS$n)61Y_BBE7o04BOQHcktIVCPSz*C zP@_-A6ud83?{GGdW2U5}J@R5nb77wfA%x@S%hoWL4}p1^S!SgeX)@Iu4La1bmPw)s zTW1mL)F6~Ik`1mntkE9j5VYE*w*_Ydp*ZgI#O*XQk2B*kvTqY}ayaLS%Z#L%U^8Ja zbiuM-t?Ak|%VHRJnQ>V#A=8W*l_)K~Y3K+nd1Q(+sbo^c+Yn2Xvr|z!Pfmm9M21`w;yLEd^u$x0aYTX?jvqvIz*IOxVaUQP)x$4j88%~hUJjS zs#=IM5R82g?5hx*MJUc-y~Dad+nx|YOVf3f#u0;~SjRL?TwY%@?}cSQkwZ`Ng?BeM zkQX++#ho;qKYc~_@)N?@Ioq={8t1sVzGHfQ$yZ-~#n=DhZwP5(yACv~miA=B>BWW* zUY%h=&#=2?-rrKueliprNF<8O z8d^<}k}Zu5tonxT?7UWE8QQL8({yy=S<=EXPIXU`z!st;4f#+h36QD}p(!sCt7`^pLAl!+;m z3+%^<`~5whalx!wRZm-o$-=TM>a@(lGHW7m8+!V%=AO3jNl8R$2nY%eL z=FCtce%G?wYiFdmjEy^x$m#Z!i_^fTA3x*O`Ia%>Gv~;ZB5u9n^?v5{t}rf%aTgfx zS7bRSg$XN(z|1xYVP4q9nM_A+T4*e`gZup*LlWlfh`A8jo@kR^ym`T8!I!8mWOONO zNcwPd`Y;fqT{gL*@vU<>A8@|Gx&|+XdETqJqYHFx&w90H+pk&oJ9d7;h(nUltpojf zLlno`>mBdk->}5O>@3q%@HnaZ8b&ucnh%a2FJAU)#YnJ^rb}n4MUHIVXOWMAJ zRS(??TN3L{&)Hc=_L<9f9jmmk=~uKbKj!^6??^T>+J>)g?zqc^ITrfX(F9AkZurfY zzvj!=-!e~^^lstl(+$s_pEG;QQWS@Gdwv{ji6FnXN;AEQN87xJHG(EC;9X!?8+JGJ2rOIWwk(>-{~q_jf!A zEyj8Jpj~)Y>I20*s->{@h$+lSMcLQI-4aPwXhMf69#;}Ygs~(fF0_DY8`fP*+h;;r zkfmTHQ}9Q;raVr?KSr%tM>daW0Y`ICsRp9zpsfjvhh%mI)ILtNA94F~#2ir%g4%^v zAEZ^FD*50@d*seMm<1?x_%p{YcFXT~96drRsZZhP!aT_R#gsaP*FnxYjQ5lbbBZ_{ za3SFHf*8?W%j%bK6|4JLtUnwCh2J~8iySdf{J@A{eqdNIhc4mA;{T&xI+)rYA_NZj zdHMg&_5c5g_2vhT2swHNAATJGeLO-~JredYBpY!Bd=-$gQ8civ*t}R0h^48+pQ#8Y z8#;UmNNC6u?L0zLnW^XkPMQN5M4wT?^-NW;^as)aK8@z&oYMtdA*o47)R|mr!p>H^rHFQzulk;*Z78{;E#L?&6_;e3 zqiZ~p*R*bhvn|6uQi?Fmnfv=a(=cFtVBPktx*jp8qf{?&tkvbAb~cw|vi4YQll2C8 zAi&sT1h*QDEBacE9TsoE5_Op%wUR_ieO5)pTc$ko{`Q);*BxK&Jm0?CVa9iyTwSxd z8TtNhrgW$58p~}KE=)s^KzIIxWl8+{SAR|Zb%U|6yW8>c%Tv}R(c8q!4`1^6yXU-# zGrzvNX4ihh+xKr+opo&2Jug1~5g-5br!)vps^}oVes{}#$^_qWzrR&Xc585**V5Uf z_p_WJM@NYc8v~6GY_}Vlrm3e=%Q((l-P~e*%jxMEJ~T{O-Mz*(dViUrU$5D&wcC6d zN0toEd3~*Mh^fyFV<@sbx=syCT$tvGaoBS|4!nMU#mYpk-o4>wF$`f%@C~1Q^f8~k z`hd4rh3~Es%djKw8}5f&YysbOELn)D;Elslz%0!B!uM~#=esv=7>1E0YZu?i>4vkD zE&t|Mzvbp{694!={6}1@d)ie8w(#V%N8-f4zWFVAjP&9-v4%0v_?&4Ygh4oK*Z7TN zTMCiPcl$l}CU94Je*W=?{OQkM@cc&~QvT+1{>lIL7s&M+x+PNbin%$(Kf55zdt~%P zc8WPmFl7U_$CQO7W@2>e3eTCbWKA?Ig`5piv~#R)TUL#x>Qi12uU+M)=s_nJP4juD zrq-NQ0L|LSh&Ptq7@1SX6tBww=O`(XTtTv~)~)d*7qF%!E|8X)B5M}u5EH;ULU0rU zvMi7-)&`7JbF3)l-5)?{#VfHxbSa6kIFbtXS?g|WHGoDbI_n=Wr^aA>gLpX-b4tmY z4thjP5$%(zlqd5;DomyAR0InWs~{lT0@k$zV>BtA7wwCeUehI_eTi8VVHdonR&vGmyT)ThO*_|j zcg)K|$!hlKyi!?qch}rpHALUioov~zHb_jQaZ<6j@$AP1i}q-itOlya>B9L?(~!k5 z&Wl#}7-5WwoBhPOggvYEmff%? z=8=E@PyUowAAQJw|KI(${F}e}YgTQcHxQ%S>yvpWKKVL7mYnWG4F-1$eWPM?$8 zo~3EYF~U-a#q#;}#9zG`d7t2K-`;S&6RdA(8F29{mU7RnQT!rZhYOBXQ*iZMrSp)! z=1zoQOzmIRp3udBxWjC1A9dE(8KkI5t3s7^Y8F!s+y-nU<&4jsU|Ndx*ibMo(~@XR zCdiD8YOa@^_C#NL!|a723vtevsOHInr8EuA=@#3xYSKtEdAP-tfowA3Ec1b`WW6p$ zB@yGqHhC_*qBPU8htMN9=A~iW4?H_DT%20IZxXjV$5SapBKvklzd6VFo)jIIL*(19 z-_gJREf=pH(F=C#$i-2XnUA(lkdrN+zx|S7mw39}u(~+oK0BuUTYSFfyxFmO@rs}Q z@gH$N&&2VLXd)&A*6YAJt?=1s3MVB-Ss3TYXbr2PWHswOz6sd55SN*Trq+w7@a9CX z*~S<;@94c_FDleHQ~S16S|qp@ar&N`YHSq&lL}r6Er#qIjTIVeSvL*0_ob5JD%GQ6 zqth4}?(bNy1Kz7pK~69)+GA-9mZIj@k|{YejT5D0+TdtT&-nP$hQIiW|D9j|_L_?q zAM*4SSZ68*|4}VU?XwkI31+yuKT^6#u|mlS$(hbMo}6r1cMYW^a?!-|^*r%rf6uF7 z&p0K9VPOahe!If>Krx2pF!%aE2!XzB@y?SDLX>$Rgh^4OLX^y$)WDSGP&suV5*4ho zgeD+HSaKwm#F8UPGR12WJ-CJtG=b%<#~Y{bYcV)6bfy8@qP7k2;_(PBE9cajOxv^= z*C@@<2i*gR()Jv3Jf9wr#E06*!{@pbON_!~RgfKriQDUYz|k}gYYV9;*~*Gk>Qz$1 zt&eK-DVj`n?h#Q2o{WX5xLlNQ#R$7eh==(Lc>mY1+ zcOPl}!ushe{5l}HVbjCe*_N}-2^hnYB6G~N;#jXvDZ|Kq7;wQ8Y@qWEt@B4=Qlc(@ z*RAH9r#aFcw4Rc*b2l_}F3>t~-mu!9kW-=SJaM!H8d|Z~lrdSb#^dYP$fbaFxTd98 zt-;)GPkHv@175xSkdth9dtJD^y5jogrW$6Il-6|GEv%s$MNB(qF}3#8)aURa^>!GG z%3+sc^(u_C z|CSd;0*k28D?3BRk{3T-0#sM7wXJw*Tl3)|i9-rgR@sfm}od zg#%sBR0`EW3@fD&=Y`$A$r6~dl}yJ&-m$#qu>)>|6e)D)^E7sGCx+3yCW z2PFZkB32foNp~`d!sIf=M!XAnwCCAa!FxS_Ny&I?@Sd7*g(mB@d>}+>%ax&Rw65Wh z%FZ!SvI=T($q0h?4b}x+&w8fa=g`FNz6YG}wEcBW#F^c4Mj)#!9EE7TpfGY)69_Mq`CUAG3?FpQDm ze!%*ONd=j2=o*i+9Xal`@?hDqpYIrl9cdT|HsQ^LGlFrQl4If><~&TTCHZpR%5Ul0I9l$)cSzztX54`lSZioUSoB4OK8D1h-;XO zCCzGH%r+8DMCOUPbF5c^^XKQ7X2<32tW{Ormd%TgIs3_HoSeU6)1C12>MT&-0X5BvK=;ICA3n#Dy&Dy3FGSd0sZDE+cH z4XavmrI^dHt~@kKVU=8~8mie!X$gYOYG|>?s#MWkh%LH@HHTVdPnKMNMor%vks}ee zhz7hww2Bu8Wsc;i<}=j}JxyqF4cK5cR4sVq%oF1Hk|FfdN%zQfttw;tOCOlWAzDQD&-{?Gr}|47qV#0e%i#K6t3 zoNh1hv=q}TqSV%4c^2k5F;Cj%l$H!7QB1CQg#!XXkfhx?rYL6H1$80kQphN_7N-v^ z?F*FJIazU<2fTHusXE(WOSRn`gt20(JIG>wauVjYc3{%XSLQkGFMWUO?vS(qBaZn|T$6{YtOG=XEXreCmnQyO#Reu)gFFvvol8j@IbEyjV6XHI>?vrWs#&nh-B z2-m|crU`7%PPo0@A!FwL^(B|Dca+ky+FY<3c8I;gwJo`{?1qKyDo}#O`i9l|91|>4 z4iwXInROU-ZHM><*LuD0I>Qtv6%cDiUESW=4IjJ*35aR1W~pMTV%jsgI_e@ZW_2W% z1(PkoH*`%;-v!QBE9T8iYaG3WO=}6>vtJVLZ*JM`?y*?rxv+TQ$+qYD>6(k}hGw&Y z#&Ngoxw?AC<>e*B1tvq@-?I!>5gD5mni5c{f=dS$1h)fz(=2agmi(sW#HSlU*qDyFMjeFXCHikJvoDlwwq&Ox7)ES z3)WeB-_ozvjMId3u^zBQ#Y3-Meyt05WAHe|;8&sfFpJnM$05ell#(PtQgtSZVOSEO zEv$mq-nx=&M-x@F0&&!Iyj9WHz?>7~vXGlrjXCzv9jk;4{cV6;oyGvPKufu^9nx4Xhna8gXY8nsN-OG+dkAyOQCL>tS%+Ke z>hOg;5`+(3NDqSW;m;5K+bDiq+ybSE(+8BD_6*kkU2zptR*f*q&p8rB4g(=a2k8&}?sDu}dL+yndBlx> z-R`{L>Y+#LJn4b@?2AAd{c z5y`+DyZ0W@$Ws6R2V;lgnvZS*isjfLrM`lSAWcbyk&3d+IqPt2wZ7!|b6Ru6TOAA> zkJ0(w8$~Qv(!Ys`7I^jI1?TG%t}bsF_5ptaItOEdwL~J{ynfAo9$Bvg;1ng6BF;hM9nlqa3f5$&7>F^kxCqkIG#<&O_U7rK zFE3z?#~NR;ixJ7C_7JHE*7`sQN}WK!drgyw1YFbL?81rf=-QrMPdgw3Wl6+@rZuM# zzge?sTQ;jTE@)q)SagYy;tz0M#ys?J$wcurR>pM3fmAO8H0$+l;>xrG9;2&qJn z#HQ~FHgI?Ip54uRF19amERbhxNgTGpVmw(ql0DWqwwnz;coi(IrzFcbEm#|lbCo?V z>k9k>RHwhv zeGHJT$JtD-^%bcaWu!(Jb6qSv5LV>4OgKJ&56<1=Gwc|D)B~T0E|pWFc!Mck&m)z^ zT1wVg!&!V2Fcp_5xnSJE;jDu6!K`TNpYeEEXb$GPQWI7Mq~ZdN);md23O-{KKDp$m#-0C|DAvB)ro_!#EB!rqiFVI{0GBq?~GX4m$6OAzMq%rOv_nIw@AZ zAUQ)#4$QG|eZObZwD`8eWKAF^iARTbjF3}JEZTsTf~n$=uQQyfbApt7Ot0#K!`6%o zNX|_2L@rv{Q;K#1I%`?RnYZuX^L3Lsjly|+#-{i5ZKwC7IUOsLyobgGa7Mdzjn(B- zeKN;VxEppXal$ta=Ne2Cz-diKE|E+jVv$rxX=a!PE^qHyO2W1s=g(i@1I$b0{>@u9 z+f&-s^YY~jo__F>Wr^5q$@2_lVRLq&?tj}>L}WD-XG;)MeXfEDmRPjs6DI@{h{h4E z(a%*%BvV-8%znRPaEaarjO{UDi?=IcR{GhJ4Jj!mbr~mi*H`T3#I~EUn>D9r7o1-_ z=XLW1Z5dceCJiGy40EXGWfyAyvp%F9Yh-&ydwz=RJEq#9u1iP7F29)#|MI){{O0nW z_v66T(lgDG&2-0;e8st$Iq?pg^&Gs!g)9YEQOyM*JA?HFkwri2$`n3AGP2a_Ed*_o;XDnwxm{n8EPHUft+QJbT=yYQ@qno@vH)Cw`ys+pyI!%L1CXF@5h0=MQ4eW zGpR8&K47g=f=D$cI9tgy2kPAcC|9fI=6PhEC#Gq_T77>WD0%(|&(5xG=+`~2zD8mV zQHoZ_DH027H2IW7a5k!#Y;^uU>DQcXPxSuj1A-%^1ta?Y*_w1}T2Eie0|g=FNNZMF zadb$$numU0tR~nF2tNb5yj+x+k%~o3Q@c0^f@>>9!(hFEq{JuNDWS{P)+}Qz&Ur$k z=Y^DYCU97Sv8=pj@sY+_Hhs^!U+K?2UNYUjBj>DD1g53wPI&d~CH?6s=NHfU@WY?; z>Bm1MyNnz@A64m%Z-+KDhignY|2T$8r`t62kKhidVy-7II5yNh*3UkvubMx++)yW<| zM(mQcf7TX4$gEn+YPDte{yV<-{B!QVea$LGW(N|$Hy$4iq3D9yY4c7sHP!BgA_s5a zaVC)}5DS6^^aLrn){!30-G_aN3O%KWhL}<&Es0VJ)4cHh-6hjF)zFgWf6JpeP?z?l zrthT^2JJ&|z}RZU)cw^F>3iIbs6ktbo~iX*D98D(h*AVh5nNW$*w<%^FG9&`zE_jx zql!Oy*nK$bn3u?~-!ty^G@GrGH?0a=!F!sg7QEvv>+%Ea}}6<5tIR|QIrj7w%eEsRs|CpDPMiv^X8k8o7X#j`#1js|LTAKzxnXwIsg36 z|2Zd5dj9MG=Ff296b4JYzbDQMX*%oYP@Wm6OnqxxM zN# zN`ot8Q)-y4o@K342aYukSu4AaHLI0&;~te~);Jc2BGqE*K0WDP%sY?s)y!Qo*2PC5 zr^h?P<8t_z5Z6RB#H=%#6pJnGF^nWuzqYZeyd3^b=j@}ZIMvxCXQlk)sQWE*AnCap zxYK)P@tK$xtXN8!81^IMG!vSRviHnR=t7H=hB!OsB{Rj5Aq^~f!Ft2G4-mB0*_DNq zM8)yq5YyIOv<8Rr;aOn+)}tH^Gh&o9w!|95sXCDJIulzZP3IJ`B5XG&T%4S+-E6Q9=6R}VeKjb} zX=Yd!#<=L7AHk$bt*WG4HEH?>N|uFa4N;(!N)Qr@5np+Qj$j?Zg+rk(-dg>=fn^zS z){$+)VJn)dIblf}Y<6O3YH+UPOvsj|?J&vGhK{!F@L&AhciioE6lb`(y=Pb!hTX_7 zfBuL3;-?Lpm8IzeO_xY{&$o9seErRLyng+TtM^w&JcIR$RLnY?*B^+7KGS+vYJI1J zQqh~`L8Y-a9S1Uu(R7e0jHO_`!8JjLgZW+`p3YG!E(v33k|kJ!l?9fW#)>ZeB>5El`W)sW?uA-@!qp;8=P3yzQL40*8p)M&yby>dBkL_^N1wwr-hr{#QiW6lQ5cz zMMi9yS)0sHUp?WEKY7Nh)0RyrtQrBcU^+{)Ui0qi|6%J*dnCEiEWPKhX69Qgxo2`K zvexdNnw}mB12sm_m-)96FwifMAhZBMm{xa>dSexfEHX(ZbBo1Sv%BiUd)*_lMjwdG zB$?q6?q+uHea|`1xn{SXc>VS*Z(m;#M~`<4rp{vf1*V%rf}9Q7X`VlM%K1kxxK=%} zSmt_yt`g`t)Q-XQ81KPWicU;*V$2y81eH|V15yqIvdK41NHs>`jK*2{y>7!+YrrXo zFU@V41#zKUzot`))zFbwbLLgic};H;B_G)AWq1~*NxB`aLl@258Xhg@JUCl0%$Mxy z$m{o4+^lbyQX+>+RUT|lI3xzGSh_;l2I818F%s4{)ZQ?Z%7h`M%*uJw&9DBPi>IGpFP>8Jo9Hs-Cbz<3d^xeR#-H7Wp;1nt=N>=Dj9%`rL^y#3-32W5y6vukpdwuk@ z>r>W}dK^5cyZ*cnkol)St9yy?mdw4UaMyOl*Lza9Iws3cNYHvh^6PqsXs0C)>OHK{ z@v(XT3m(6hqCw-DF-gwgI*HLo8%r_rdFX1eIO#jAlDfz=*Q~ZjIql>!KN$p$v#sNU z`)Hi1oP_YBSK?G#qVB}{`&oQ-vXT5Lv7iYWoC={%UH7N||9FzUr%InboBH1-^0_0h zp;i5`o9~F8YJB^86l;qJ^yM^*me9LDpt?wtfZY>mX2y;EZJm2u1q15Lu97lY(B7B zESU`hCQcYDL-b>^pZn;uQw4*j)FW*}hK}lp4=d&Fv$_L>odkYCAtk($p-ok$5e5vt z_gq|F^2Haw;6e9{r;i45dcw?G44(PLCBylWAHMsBG+*)X;u-I54t)E~HyGRTXTSNJ z%cr04emye$bWPv&eEa@AyO-ZHRZTaE_&2kf&!2yUdGwUGKYWJ`3ANc!>O_xW90O5R zu!_DLpei=ETc$B#wP!v%Lun_^;ceMrN=N5<`pr93FUh>J-?4r7mSJXKu)O){8@~PHAGp2R zaoA>ROn9F$ox=2n|M>6!jQ{>W{Fbu^pJEngOnIW}NG)4x+%p>r=a-d-A%PC8Hxq|R zvq=LnD~2+0t^)7V8*Vr6Nt*+9(yT6@@}P4(d-jZee#zy$$CD_o;Fdjp?nvXB-Fi>X zk;Td}3>~&syeaHc5MmGoujG&)L!qRRkdj~+E2Jt1o>ZC`V+2E3$BDxjNFiap$CPH| ztBM?>938ZX6e(AVm7%Ou-f&vKsgi}??#Fh}kX}LBno=^9Sc$cg5o}^@_tud(C_$*Z z^b)l;vG_QEZGCh!b5uk6YSSLi`PgBWWeBMG086R0#TwK4{N#`=&SXjDX$46OHANvq zos)5`mX-{ZfqT`8R4TdT(}9dyNmXbbjv}4d6b7q!b~)qGlLfPLMhYbci4a8BgcVA2ZF-8a17Z|SR; zvTk>4QkuwzD;}*6JeelE(+r&;+~Xwsw{94)t`~oX7UY{TTFkp3zb}=|c1uoy+0auG zgqTPv3*xn8VuP$$1S~8^?v;pfJSi_-Kc2$v_W1k}5e*Z1T1pI2r;@LUN;Q#Wn(pV*+qQYQF1~P_{9V$mUJ)xPXIL6}S8PkM| zl8wM5bb)Fy%HTYBt1(pw9KM}dQWY{?ZNw`X#I+vlhV-mCQeq}&jaGfDk^^Fq;Yl&5 zq#=UNMy~yeR6x{13VU)j)J}8QZMnI=V&>*@c1i)O99k8&+YLXBBM;}Y_bViV(sEzN ziCPlV6q!QCbsg3AtjCU<+;P?qoY}(ma7%AGRM-+WZ_s8%XB`*kb3Xg{5!s4)E9-R~I3k(e{a zS@z?^c6Y#e&)I6pgXN0lJdv)h*=!>o$K%TjFpk;mhTE=VWi^ZW3~L-tb$B=6ki-(& zkc*~-14d`*cC@C6jT&bio$biV0g=PBqf|lshH=N2zx$eR{_r)=ADnT!S+m~n>ARkb z%L`(MW(*4@N0E+hMF{jEUV|`XggZOhaL2WY0dBuYbgMSdHoBpIk0n&c z;u@(!=x3TzN8*%7QIh)BYK&E~=B9`#wwXEF-)#qS#T}yE8H=qE4I;Q2gHg~~jhoH5 zi4*U(H)N~Oen$2K$~l$~A9D8SF`coTnZnZtmXBTx{P=E5+}@%Ibc=Hq=PPiINrO_J zvu?q~!m>QK{FoIluSZJhu&$6&U_S4e4L#dkrsP0v#GGn9>sVRGiBWr2z2ba6@ZiA% zj2!?NtYSHIES$rlFg0Naq*4gEG#oK($BD0B{=iN8SAP8Q9lQNV3bGcioae!Og-?bz z*K1zCf6M!;_lzN6j72#k;CZdl&NL(KsppTHg;*h(RuMl+`}8R46i5*9Rj5X~rP_tG znq?hKQJ#G%lVT)JfiOks%g%}Ic29~3*{F%Msx-6Yu_B^Xq?OZ%L$!8!d9B>&tE!ZC zj!{SVOIw+gJd3JsL4np*Tw53YY2C?feNd9AWS1Er#oTp81ztbulmkY zl@p=g$ho>xid+n-$n$HeunQymoawrbNh_jpbVJYbY(X-fX$<6jp^gzkL>HJ_&(qZf z7Z(>465G8zCu7W{s?f%iBiQe;2wsKzqIkyKK94n+)(Lkieh8pT4h7?yOi zj&BY-{_gMoiNF1uzhOa--Fb$PdHLNd{+IvxKl9@czvDmskN*kJIk&sl46_cW9WiE< ztvIWxD#<+UG|j76YegJVuA$0v3xBj`XyYi#5^}}0=a;gEqTBVSw9NbmPc=Ph8f8|I zG*~Cb;Vfr(2`DH9R?FjPSHX1Ra<{=1IaKN+_SD3b|H! zA=6c>Th)YAPE^^*QEEg}ailhXsHZHNYWot23EoYIkJa3A?kE^nsm92ey;Z`A7#;vi zEQ-l!>e*5>f|Tf$!K2BC!2Wh5j0%6bA}7N(RBpzR-c0n}z~#k?7Y`rs(Ss-KZ};r? ziM^Rvp9OX$Gg?K!khCK=LAdkam16EXJet&~H6;Z~3Z#~>*X{RJudx0C=Q1hp#Te4a zzCuPa?HuPQ)gE&RLQd5RNElsFzK~-k21TyTgbG5pFha1%EjZ_lkg|%B=UPaL!&K=s zxTJ|8vp*zkHP}{#SydsHENhz9qzW-)O1xL0DU%&i6)iVcshV}lw%~vS_)@9FQL!I0 z+r!9VlCN2eqD+;U^7Nf!IiGW}I_Kf}C8|~q_0@k37 z!Rdy=*S4+WqBm#bz9E?+bv-Fc;L23dsD;)ZvH$L`|0lL#%hh4StJ@v__|IQ)i0_CwpvZjp z_AR5CbGfVZB>wK@cYOQJAK6~rayTNHFl4QmN;zTZOJjuS=G=*GBh#z>-OZ%$yNVh% z$VgX#b%I~WMTU6V2u8#esP|ANN@=XMSPM=UOpWL~p{p1GO64wzrxLNW2bGeItD*=V zvUR7`1TiZ))D$Dz3@u_w%7TJRDH1~<#z55yqqVp&+c5Fy#v*5O>xW4(5kkP>P~M<) z2Y8$URRc9?N|HfGqA*2GjEVQ_1FzR3H`_!=kkf`dt-0`(7ppUV`^9s9`Qn_R&-8<$ z^NNc{4;gCZ58uDy?N8Udes#^u>uV0yGj}t2Ae4x;n%OXr4ihyS=JSqUe)cJU^&kHS zejF8FzrI3^x41fzrb;)=uq@=W(3zAEVpyo7I8Y6gD2s>pvJg6hU{Pv;90XI>4vL8+ z2x>CA2I@3{F4zjXlMR$Ml@t%;a=@v=_Hf|sbwt-dp9`b&q;Zm-qY9ld%zekja>>PV z#n5*sqZp^m^?qV~bKAN=EM{1uyCvgc!deaez*r17H#^?G+p%;ne)EK zbRE|lgY|dk zuY#`3yN<N8s#Nl0%;V8PP z_O*2rShLmb^_ytagn6TMOIS55P)i2hx$*KTy|0djlTtD5fML*7t%)&8TF)9(PGVA^ zqKr8S^`?o=^}`r6x;8YD;s`{#t2e0szl8V?@cPF?jcQnLO+&Dq&_MUPcpmM*yQ@(cGuUt zV_ZFbe;>YvQtHmNqVDvfW7l52he5yN)*buq)jghpy7wdLQ|jP^wYpd4Cj*X3HOI7$ zRBs3lteiI7THWyn?kWW&)n}B(Y0aa{3x4s%=lpP6*vEukEX8_LrN0klFt+1tc_zKg zF@fq%Ly!~dsNQvkqcyKKulSeWf62{e!}4qpp&Bv3Ijx(ar@7!8X$oy92#z@>Nsc(H zvD%6wSZj=R#MCNaw5Dj?(sy#uH^ySE!N!7jp4|8JUSX9ZOq!IV>;<%>o^p}S%7(>Y zOocH-aj8=zVL#01x}IEubg)(34pyy$Pq$~~sir}Mi#vnJJ%ffm-9Rm=bSl$n__6i` zh!Nw&7^Is6{l(*F{QC2s^NUY^MtS@Nk3RhvZD2Oc*{*k}oLS9#K3mR-Q(=Djlz;f$ zAGmz|9iLu)!e9N_pJUI@`P-L2ar^S031!dk*Kc|KW=&T;Oe59>vh%3bLk_oFf}2sC z#^{Kxg(+5|sW|OqXqpgw5}GMwj2-Cw9AgGCqP0YZ$`iQ+AYpT5ZaNmOhj1-ojZ&<4 z2WG~wIA1WEbp+FM(5j_7!S;rnGIf*54MA?JgDB~WViMV8ls1$iB8k^dx{TWzVU)pX zOB^$HoOp71$@7nY#^uAusIyD-)oY%dEh+CaIw+p3=1gVcu)pH=N>Es3zh!G+cbL;{ zdS3qUnw#y0G*kSSZ@%V-AAe%I9~raMBE9_a3d;{X`>X$sk3ai@)wAcAesQXH*lo5P zHaltzD zSh>oi19}*kuLjaSF6?3rT&aTqQM}kNa;$DGF^p-VKeY;V4yv z!JHB5j+K;SF_xyw+$r|0!?ct;liIQ8S|b=XZItZ&k5w@UAxnAN3~Tk&cd3*)r5KLS zEm`-Z@AOz#bHu-iL5foajk;eOau=g&eQKut*?_ZPGPx#Fj^t8=6{SU3JX`eGUQ?%qoW*xwt+>lEmZGg(L$Q)03~q^1?yjP!^#Ru-;_@_WWYKqY zUi13xHOB25F(^|)U^*PQ-R|f$EFY}!U5B*_vJ5BvtYbDCcyqHMr5#3BW?pl?7)1Cg z;Hp8zOid%JrRU>Mp7F=;UNgQmbXt-Yxr!OvD?_SA`lCyeGOQw5Nuem!i!rJ1=mx1F z$jOp(VLVcQ;to_HJI`34xQeqA{jw)I&DCLIj^Qw$GtJ*{^X^}H_s###eshIY3p%gp z^2lv=?6V|Bl@8Pr!Ox&SBXvvWvpMtmiaIO^+DU(5yRULBY%A<5bj2~xg<059_wSj7 z8ww*jH*s8X8ra?K@ftS1C9ahc6tBsN&R9uZAgF7>6-rV)kr=hYYDdlbL<35tGNpK` zkJ7oJKb2J2nO0$^j|0mhMk6sQw{rx?{f%y+oI*8Xz^kQ_RVL)XZrqVdX68*ZU?9nz zA_F|tu>7X=jh2+D#&dPE=F6|X=E0=Uiwp2Q+BgcZ8z;8=cch`P-|Yz{QzAIyAr@+= zSO)T>NkLKdjLE|5$)Vo|F3v5cXpHSPNhJ*c03ZNKL_t*W-IDq2jBYsR-DX3I0qrWY z^BETp9+2&VKfL^j$N%p?ad|fI(bFgV{=4^l|Hs!j6uon7i&Tz${P-cCfBG@g7+6n% z?{2Pnv%Z!yiZOWSSe-eR&axUj&R9y!7=`o$cYIlzP)A~_snJsVl2FU_nt9EiYZ)g*A(R$T;#j& ze&FlxzTx8OQ~vrtKEziU2-412v(>2YNW4QiH8dZWaQtLw?&Zm5JP z@2OFSR29Vt#y!MDDVmw@Fk0apm`<@Lk#f85R29>q)&$j2_mXb&Xl8)%73;z3!c5D6 z*J(veiS=%W?-sZ=pP0gq+YM~S%Iz-D50~`)oW-JNIGZ!f&#AFcw>zo{ym|W#(FT5a zJM!+QTY6Q23A0!+#<#qGcY`%O=gSLz_Q@wadi;dJzhk>k9L5RNTe_um!mC=yC1RXG z8&BQsPa@B;W87$icb=~6u&zgyO79fj`_pVNhm6h^uPiE7YEqPHFn*w4E;+==``b0U zF`}c;$~t2kiK)>h4mnaA(zq7c*XiS2;AomWp1W0*fqE$?<3ufrk`p=R zQ(tV3kr*Q>NQF&q0j7{8R8xy!VvnZJDawop)dCQWU{{LNs~zXHMYXwX5d^euqCHj1 zo>Y~#Z@mi@9DAAbiQZ*oUW=SVRjw2(*Jy2Xo}%sqaOtlWVPB|;r8Q_ApB+cjkIZC3 zh-^1odfyR3ASL-H#EHWJa;lAJrO>sUzB8$IszQS@GQ)P(;8eo|lL_OFakn9cJtYNd zP83~EbrVX7F`(;vO7&uZH%5l~S~1t2tPE4qa@H{u_`)!BtX2d4#Y61inRPQ#E!^zZ zT;E<3rhqDq5^$tiYQ^n-6s`zkJ2BU;UDgK6$_= zpS|Gn>@kW$&LX5zRQoK;DLJECx?XAyz#7*Aq*W>yG<2OqF|>V#>}kBJVxCbNqaDgw zw9zbeM=b@bDyq#Kjc=*$oYB>{qf|@T8U?m8>wA*xVJ~~?9E)_@Yq@5M&RDM{1PG|9 z)m4N*4zSzoiEU1vOCpyEa>Sr1+OZoWX}9MPMslqjf*6acQWyuelvZ_>DJfup*)X81 z2+39nEv>|WF&fud`p#plZO@MYF=DdpBW#OSxhnUpwqTWMq+Z#NmPXQ0RtfgH{k>X| zuI@JC%T(EuR86OCo2|M=sE~7HY(qh-B!O(Ps3Nm~njyu6(&bd=kh9D#a;s8P^+>g? zja+h9&!)7(c49n8S-QQoc35MX5`?T!#i6Q4XGLzMoHA={8kH82&^HRTHntH+3`%FT z&8RMuToD1?7_6~aXM|>Hj@8Z*%yQ0QtyEM?dRc1ca!wfS&`J>V^)z4>W1Z~%D>(*g zO?W5R@f;#KPk5K90mgM?eS2WNJ)l&@XJR{E6^g%bnRn z6J_qIHMzhT3t3qr5ONX&n5v8^vfdro@1@r7^1)+F%8Vu9oF-}L=L3(QKIiG<7kvBe z8*aCIbZ1c6kfwq|^YGCHX1qjC9%Yr(LDhmuida26fSAbBL^zD7D7blxtho#0u$K>b zd^RIzsqLm}N{o~gajw-#C{M1I(2T2YP*~M5tqoZps5&w=O=i1?l5W_IBQrN=H6Nf% zr(}QE6_zupt=uO?H$j_H@eN(3A|ZO0ooHo0iia zG)e|*5piquDmAg7CExBrpjDAgO-ZG7b_;`FHk)$l^2RlpOB`9&8mv_~qp&K`nas=< zI-Suui{PmXRx5c}w0^x)SF}Ws<>s!(A)6d*45nd_X?+Yz+^QmOe8Pk;EHcW-XFdb6hZ8I$c;)XdDoVK9_rF{LLO zhcaacQYQK$+jRJsC(0=;$(Eg}oNGL;-A zDuz-uPIaI>xlF_=htp6YH1tNPg1ymIdZLa&$fDp7Cw7MeB^M4<(ss`{RnA96Sy;31>9R!LwM+aI+5W6e&+^_ZwcVcTAfdK0{}mELzg3K;QNFzUOM6cy+s>j5l2N znddswd&|sP7S_@^$89Ohyv21h!r?7(pRm4Qa$>W-;WoI{0!skSKL8?cBt>TE*Z} zX?^cUCz92eYU#R;<#Ne#xom=KA%*D!ZL_pq^W210N$YD=iYM2!D*Dv@F6rWi)K_=? z@mdL%x)g{haaMLjyJR`LV4Usw_-9X`?)mbo_qYyRPIzVT8gvGi3?4|A=R=_tf`#`geE3q?3SL?>@>S-snC&zXA6@NS~{F*#CNpJc?`bh>lnHT-^6X za@7X6Cll2@grvHUn?HST<@7B6uwPyh($90sqdws)hV%g zKg`MfB>jihh!5YH<9)#g&W9!@a`!&9jkDI04mhIrj)&0WwQ=;#sJ7Wuw2BB++eq6x z!i2sfCnyT36s&bzo}Y34;wjTCbG_aRmWs@NeS=kS_TVAI#W_P~*@t$qYXvHw`oc8# zuT%Mad^cmUT(LSo10vQ)w`HCJmVv={-00j$02<>xgYPJ6A_wW0jX7bJ#W;&0%4cuH zV3)I`Q)`u^MXd$jbu^-6;C z9dp0r{OKjX`uyiSdGMIDoZ;q!AeFV@qVK6WF>{)yb4#rXb9O=KA~C;bF;0ARJ}`TH z!ME#o{Op&X^62sb=TBeodQIVV$vrpC7 zT4Wf|_5AdH!|Tm0&*zSZox;@2*gz^>jpPyur7{*nZ#>Rw=EDpX-$}3P5iK?yxVW6L zSkBu%%aHaXU9TB;TVB6^gImrR&d){MEO%rU3Z!;Oa>i2&q#T8=bI%AA!o);ic(CNf zXD_&X`UKT=K<09>;Q8f4UcJ3$+8xkEvFzsb)^nXA(=-xOX3CK2VZR=^zTJ_=p6P+Cf#d#`>-AgaGsk==l(1&MxhBQfh5-dzCrmSqIwKuiDek#m zf6qP^l$$Y|pP{-rg^m*1-r4tpGt5qU2xBH@8Cu39hR<<25JDovi7ASa#km26m3?DX zq?+YGq!pAxj1gUA5RkH~`i@c~gXi{4 zDEV0SCx?HlyOguJDi73ReC#+OXa6mU-EbV z_5a}g`zx0IA@%_3ux7Cs=pR02+HW{aZ;A0BX3VVc#$lAuL2}Myttm!JJ%h1ys>c^e z!WL^W#^JptR7Z@Jn3afEHKLTG7Qq~M-r`Uk)@yEJM6Xs{4~F&bE#Lm|1Fzm>)>}!o zIM-n&(8*(JhpJZgT}FZJsCI^R9ol+O?nK`zrAR$m+sD_IP)w?liR8Lxnyw&kaZXGu zsodY+I(V!s%eA&&QPpoL^|nH0blomC^m&$61uc5 zbt`+NS`?`&jB*seU{sE6tPDkoVFp9ima!`Ky9tvs27?>s#B@NXMDIMk(&Q-E<40#_ z)L;IRUw!f^fBmb^*#Gp;Y~KBj_wQeEwMi@s(t2b}>>id^`^7M?)K7Yad$uoZS z>!0(tfB&!i-~aMoc`!tN`S~Y2=^pa@$qP20MFWoc1Fs^UduWz`$Srf;I?>sR?u5NF*+K;@yde7C(74#kB#U*N3i0P;t zg=tQG?^>ybgO^!K&IzY9)_II|_%;CDZ8xMGPl+|}r3Ptrw!(EC*Xw|`9k!eCk6-?t z@n62=vtRt0FP=Xm#)NlEZr)w<_17=?{F6_a4?}BKDJ&Lq9xgj(^M&9^sy;!vxVM*= z)mnrTa}Rl~t8`u$TJpGLtoO_o3%qlrZ1J{3r_Anp&Gz~h6+jnF2!Z{6hmpu5wI(`i z(YcU=COYY)?0hHbv6=~Cl2lyDGE{D8Tb(r3W@<@jt+Cn&9Vr*K+XKt9k#06n4A{se zLL8#ajat1zu9jFOL0sCkn39OHDP^V*$x;4WjEOJ>NtdTPf?BRZP(21DPP2?wDVC6A za7GgEr5W5$c=V$%bdT(GGQ^i=%4^2_e8Pl@e;43#lOrYVx5IdyDT-S*ITQ@DHN!iKTV zg3DJLVhC(+-mu$TQF1^_L9v*yHO*`wL{isDm6`$W^pbz` zmw(28__x1harTfrO^n;X6t=v7|C+bAYdYO=c5%+61=Ag-iT(b-&Fu}>x7VzoYnidX`s8el+chjty^V9``M zy#OMn1~Q4NpdT!1env`_Fos4t>Ci@qO{im1yD}IjGD)rEBnWI{>}gJ=wN#JQR=H@5 z)PY)S3Dpp4Y;>_>6{#fCd*|t_rL#_`7^*f(i*4xXjwxs{dsid$rs~n%0$pRP0Um`q zn-fvhW~>&YV6Kjw4~?2Dg7GmVB$aHMoMGG?P^#iP!_)-(loI0I{OCZdsQhSb6u z-g&ygp;LP;r7+I6pXqqUtfEH=^R^k<#6((3X*Dw)wsUeVYlZh6T@&GqF?7z$oH&B- zJgHG}j1?obHKtYNs8dypQeq0MwTiJq0e#m91VWZO63CosiF+!(6GC1o<%A`TAu>$| zavh~=*!NgvWj@>}Y`G-%yA2^6h+)EeOW${RV+n_moCD4&(x|z<+Vb-IA9?xe4eMP% z_XCUbfu|47IGYU&s-sf|tut$;X6&&8L3533Z;b@ zEF(Tirpt51oPLJmyx>?5n~!scB2^{YI;?e4|5dw2rIA^mF&3>IQCTM2v8{?7il`tv zg_(JhHe4UJY`3qeqIny0RR%76iu56Zb z9(??QK}D>S@5yS#xEXnSJMwB1NLI8}T54X5WrksZ%lUxyOS-|evy#xpONJD)=#W&Z zGK?Xy-HpUjaeknpd40X%5DSatjF~HVqj`0+=k?(qF>}Y`Up(dU#Tm}bae6^-9W@=W zy5Kuc$(8MPPcGnHheD|2B?fYuh+$986LC6FN@TH`vsljQI!`|gl%g>uqf)|DDJR!f z6H06deDP?^yBVa)bO_w6x4eG)mI=+cc!((r@}zmce#bhjx!tX~T&@_L!q-FzvUcRu zh=)l?hzdw$#F&aUniMltOQ~BaS+pJ_rf#JwMtX&02Bg4w%ak(K7zvyeMQy>stJ48= zVz7$yS;zTeki@x$n{mfa>otFTyJvH=<8b|sANPB%uCA$LU~W95N=ii#DAqF!GmJK9 zZP8lp#A-B2DT=DZY+FZzI;ClHX}u*y9A`$!gDK_Qka!{NZk-F#3!ESe-cvSO z^(40CEJL%9GoeTagX=oNWJyKI1)-&zQ=y2dQi2TRBT9xqC6U_(b*3xP6zsWWsTTaj zr%(C!A3x)xM+?p$4%{AYc>n$#n-ux>cVF>;efcGSc=?9Iy8{mwmt0<4a1|yjBj;yJ zN;i=vS&$dA8PzJ5R)*Hg-Y}aK)=KyCvx{?9N^^6)!FoOri%bbnBRR|P_>d#JAP1Of zw`S_Z%{dz?=t$=*K~<)b=%&Pa99bU@(sQO1AtgyyO@UA~Qz`6XWEUc&LUc31R!(qu zzhgF4YBm_N6l97v^n=AOdYBK;8wwNa{hA+dZW+@7og%$8(&bSTv(B&@JX%$5$30im zgvyyAC2B}4wdK+pUKES&EN4$25N;H&cRSv#w}e_4HP~m=|&cb`QR`bcKa=x!+|knVvEBwI+1ek*YlKpX^Y&trMFh}#zG7e{e@$>ShAVV*xZW4sOyA;kV|0-L2$mMiVN7t zaM3ACEYk0!?p3qPVMg4#`Cd2uNrb+4s4VTDdU9{ym&4TwEqI5|<^yp%qa{sNAszp2 z>kqHxe(C&CSZ~SyhQC**?sfHnxO@~8j)&Si9a@Q->t3Sz2qdIRhjeX+p*u8q>sL9Z z4)vXrvD9=D?bY%1?tN{=ahTgaKXoU_fB1H&dq>m{qU`q$tbFhu)>{8mQ9p_EBAnc> z7P#v$KI!bLevp<_>Q5N?iVp-Mb@~QqowGJ%RL?|&aiR~riO3|_jruUe>!ahKb)creh*x@u>zy1lmxn=Gh{>fvk zZdmtwwE@R61KGGs57qkShF7m&v)%5P&oo-)X5x^20POgRzy)dz1}?&0Z>D zauWQX(O4|H3Q?sh+4ve`D5{C~6|8jt$v`&0%w_}2<$~oQGxP&f+{-XhiGe|rPNtny zG^*U;Pb-y>GGhpY7{p0$6rFci=R{ztpi~l+|Is+2Of%dmK|HojOx1+=({&Cqv@Osp zE0rIrkW`|oL@||sCA0*f&XG>T+;oC`b(Lw_v)=4+{Xvk3ag^s{b!4RprDC-dkx=%W ztsKujddT6&H(c-5q+8Ef?>PVLBYyVmDUUz;8EW2TPv6cuMCC*SkIA zdP}`nQA435aRX~**yjnYGhJ2Kngn~=$+eViM>0;*7gaH-j-)%PcI2vw#Sm>_)Crq2 zWtw0b*+Z7s{yf`2*e`2Ba^(p{WWyoZ#~Ma+*jwTc5>*+(&l zS?`#PC08TE%FeSs9GGHdwY*?He}wfb4xUD`p~Q8uGqSOmZ60{rMA=u zOT+OQXtj})ce^g`cJnR0&<^YzD@2;XO}8YLSVFUWeWlPc`8ut+s+JS#w6>K0aV@Wn z%u%bRNH} zayC{i_&Ou>l%kAwy46`}IVo3tIZ*nAL=?E=FP^7uihJKZz4PSlx9sl^R|G@8l_a)c+4exe0R6p=V zt=OT*cAC@;T*sdEcE{j5EDjqooq?K@Ag8UT=7v;1UXu~&0oOgcD_E2NKepbiN46_X z&wJLm_l}61PM(2NkwsOts-+$*!8Rbtl4Z3FK?eLg4E-oy_{x9*`!@*km26l>OYU|T zy9O3nB+rm1rx^CIMqhj@A`iQL!2)XHkQuS}THp7+&x19YkOUu}LM9*zse%lctP=-g zOo?e8d8irJPjqX|J|se2lXU=HFgmiXPH=m37UhMNP)xR-q7^w$EYpnN2ArQUgOfIe zHB@5>HKVoAbXK~uQiYy~DGR=2OoSy_CZt(&)Da!OYqdFLp<DxuWU8L1 zCZVzn^Q#iFR8m62%c-EV5ayO#P|mcLny6TeiNJz38mr{lR7)e$wdY7}Nlc~NFgCY< zs7cWrjOWf)lv?XG| zI0BmelDX;(mlx+OKJXY5j6!9J;ec@lXDUnF@~{8JKjP2+n}5Z*bKHM(&0qb8k>7m# zH8AzkWk^@fpv~ zF8TDck9fR)V44G)2q;S^s9nnT001BWNklS1*A zkLU_UiR-$yeRXdPoi^lUA|(kQCF6M9UvjrQ;NpnZBOABIR70!>S(Yg|E6+ zZiGLlC7gEHPvlsreJ>H(lpE62P-AN@7irzrj5M~}B2XzuY`?FZD{)>3MG7mWsp@Ef zTnX?PGKGw0oDy%gGncC~uAjZYYYi!J`}Q^4-GTM$n$7x>ese}OYg~8Ev#V>)h7})Q zU-Ec=!+-pbf5F4|-%>;1r=R@}^~Ex}M>^K@X13Te;+d|YPp(Y3+u*5*jGa<_7B!oc8LP409rG>DSkWGuw z`S`Huj%rkw+Lqt)Gsv})K<2u~fcu9;q;_wU#+*7885(R8lO_0@3*?6BPsdAiDJ}ek zsHAkkYekn4rBTUPmGHTsW0tzCb=c}!gFj14SXT@}U*V)md{W-k`V;`Dz#JF$(}-;| z5uq|QEM0A+zNP>>5}s(GCX7s$Ll9->m}U}*oF)#hzvJQVhLUEit}J9~O%1ay3Rk6- z+RXBL}WmmVf+5zu>?9Xa9s8HSfRv9r^K=yPF&CAMe>M3-+wz z`SWYWn9c^Bm_otaUgy;B=vPjX0O(pV1iA2)mZ*Ah!0hw^p77#tI5u z@TXwJVP9%xEw>C=rDRgdxC*`;OI4?DWt(gs6_%NrWe+nrc_$R# zknc(w*`?_WOPg(Wosdlc`OG0W{9~irS}RMpb{0+z&91G%d*2ioqE@t8GxQzK^=Lcb zt!3~|2xKJ*0L@tm&$TnPchaz5b%XpK6&wx|r7G6zwS)z&!8q4Kvifv}c_MW_{S35{ zXK^V;b|gs}*Q!W(kQV%|CDS>1hR^dP&&UdMni#`KrO-3sYlm$FJEesLkxRzviG4lb zOlI(!i?a@IJ?e5Jvk>bDivqvpW*Vv6J8~`f^}zY{C7*rqF&|%E;G#yyOjx#*_=vL! z@(A9y&RKJW8!6MM)MT!AbC8$79S<11|QBr0cw`|9RHHv4K zJ(rzlaSNZGZE(Hkk3RZ{7w4k8^LE3!>rtgAm$B(!D&^T)o*%}Z6z4I_Ok-jHDB6X2 zs>D>;tQ40Q9cLGpY|hr?no+q3%D)Q11S@1MF*V72*eQ#thV6Dl>$i+!-P;#ykGt%U`fOKJfONUqKG+sv%Y(OXNmHx6Yvm7@cue&fG>>nNJ>dsz=gr z&G5kvLK`7rqNS{5sB$JOvh+XO47|EJ)du&{xg3yFF#UC#XnC30pKJEu=+;9MY<@q_TjuDC5!A3;Vycw2)D#D0n)pWzn6Fp627B zQ0O>hCEn%ZVo7vMxuKOlSpKy3dREeIN?9z{wJ37U?cm&82^o|eE7n?Sq+lM+AatdfH8q=r?iC7gn z$;U+3fXYdhl35xDwp6Zq!+Pk*XzKcsE35g%XCL!-UcF%5f$KdrTY}cy-`?}x`v>;> zi5LPu{mCbMarF`1s^>C}#J#8Vj_vK15*Nz6po>A*o~~O_Qel}FYR#;M6}B4AhczrS z&sH0{wPxi#!>Z?O_!yJ+tX(3=fcH}WrtVUxH4rQ$%U*g2d!)D##*Pf*W zw&OkHbVoSc@VG4KkTBiE%Jr;Fhjjzlc1%koEPL|!fGL4$1lr?FB@%eE?0NP5mKb(? z^Zl>+c7G4kp3QX2v)NN+IPFZtU0^FI6rwjYN+&ZNZ*lzuR-Z8TbeP;2)x1 ze$3%7zh?jDcho#FA0EkZlGJocr$y+|pHo@_7WFhd*V>TF($YtUQ*@)Xj>QvO|9_UW ziku4}WnT6xo?l+G^5W|l=ZSf|W4qs@jV4Ty$8cb~-7=4(eE({}%Ic7$jzdLxZWR4N zll@2S@%p!R!@2p(N^9jE7s~nrtF_k6|Dv_<6OZAAmcA~kHW!eDl*$ode#D8MF1J5M z^2!pSP^&pD6rWJ-^{Gv+BvJR_TD*ZAKfu;M)x}G5gw^IxKmH!o3G4o0C_z0T|Eu~N ze)%Jozy7$j&xZtqZ3D z2tgg2)I3$~tNI({0Hr=~)HM&)2ZkfnJj_qqf6=X!)6Y_UpcxPZUX=o+95D6Mz*rnh zrTvbde2hwIif*m#nu%1j^Z4^~@SdV(w)-95eK(Q91AqP>{ylHsZu$7^oX5*^-o1Uz z`s!MiaoV1KN41e3^wB!ozNcC%Z1WhFTqJO&AcjQDj$$n+p?CP^u&qjluWFE%LRb=R z@brTvhJem;Y15`+V-Tu@@kEtLc}7=H2$t=kfC{WvGvN?%#ZXg4sRSmGmWoM+j3bg! z2gXt%OylTwR2CZhxS?1e^W`(0ymYmP?2T7 zK?K@L$r7@nSVWd@}Ros+XfXDumN z#@hqoab`HbWaBpIBCX70l?JMki=AuV^(h1%c8{bt-}CzB2T+CE_qY7^ufF2b zPrnddim9ko&u)9*=H`Y~x289aI8ThzMDKc>?w-C^N}iDwd8gExan+)*lvLPlA8-#d zo0!p|keA4O*mJ+%GS$M}!#$7l#BQAN-~OKU`59rE+U!J9*(FD)Nm@X~o(4ir8P?9R z83xWS&bipU;LDGH!B0Q=lFj-|nnYm+67O!_^7`Fd4%38JvYc|Zr}GZ)d%*<9=4!Vq zjP6lvu)4?C38l{=W>WGn^en!U_A}6RYm8Yz(5!WjGnT+Cc4yzClq29-auyX*NrWlj zj3dkgl#0=oY-D<=wGfB2*0QWmsRhm;Wz~H58EdR8H*z|C*i%mEQt)kfSfX4&70}g+ z^$MqD;AFL;w}$I=$MxBYmf4lF*Zm zA*LTwuH+mqctL3=)Z@D}7ik$PeL~h9+c?LCuu`Tqu_RbwtUe7rjzeQORymB2A+of$ z%<+|A6j>{%nOYV~o@7X_J)^cvN!l>hR-gkMV^Qti5z#pkV?McuYc0&BvXo3#1*2Qj zOj#%zQwcZ4ajvJR6YSr@b!P?HA>T4%DX?J-s3v&FhI zHmb6!l`bdoC)SE>K5>&3C`Z*2rm2nlFHH}Jt{PJ`-pWuVhKMze)#eP{IjlEK)5txA zpFDrXX6Oj>Oo*AHH)w0|&f~oogmX4>KFre0FClW~9Yg1s_6K%prY}AB)5vyN2q|-M ze#L5iM&}$MEz}Y)ouStQVaY5B#wBsT+w-#Xn7#+^QNH8--6OyJ>R0UV?y>8ES!v$g zZF#Z2=F^Wq;<7iK*_Yhi-?B^*uRQzvd&2l2$XGOP=ucQ&m1c@#7kTft z!AMrEJy)eQf1(qqr-7P0RE*%KHN;XN6|zzi&i9s;ALvX$#Y9O4w3i@wt>m`g2nwqA zXgyHOK<+Lu=g(2Ab8$+RqkmEG-!T=e@?4!=pjL(P@sVjaEPzP!e+&k2Ve_jBSf?b$604^!av%>!@V-f?yLoa>91TwnG4?B}2J^)L7Q z{>?of-#_s3CzqU`_v~he&XIMMkmZ;Rhk0f`Ol%(?3ClzZ3r1;%ZXnJJH}7sFuo7on zjHDD!YAfB4?fc!1?RL+y1Y*+<#v)DIFb9kim-G_ERjq4A8KFCP*U=AaY?dHqO`_~D z!v#}?eRu@+=(^CkHQnkN-DalG5tTj4h$gXLJ!7?g#Wum4`H|0u=de2C`SYGKd_;FO z$jd<&6oD5PD_*{O4sInIJuMqQO>B3G7SK33Oyw-E|G_|w@n*<9x?{LnrgqiIa zC@vCkbn7+O&n`IEiJ>M?J*8G+%I*DEWkBA}`&KEewGG27t)nR<4oj4U28uZ(Vpyo9 zvg&#U-?fHfLTg$eRov+{XPj}IuQ$Z05Jtp3sx8KPTn9rf_^!tqPgRCks`#zFLt7#F zEvcY2*jT7e5ex)X2(>o4RTVd~k+xq~G$B@L03!kXsw!!bpuR~3S0JW>iUs2hRlzt< z9F|NfPE-Y@QetWNS-FGEDU!9!YS5Na71J^kn@%C-gmd-uu21ccnkykgM6=pF~=-*NZwp4EE8)zvkZ*K3}=c!BAAdf)T%Y|SUnE_ii*#_O_>Yvk_!Et_t` z<+E$tW}xK6e!pimtoVC>_zSM)9kE2#!v!S+Sv7i8rG!N=)TXKq& zEVyE8L`hndB4zpOEQ>gcQ?95~iF1%Z-W*uc%n~EZEYzywO+Gb3qCVa;KcN2A4+{^f zp=`69*L2fA)cQomJSrWIh;UUarq&Ncj-Y=;hLmu~k+vqvxuXV8w?%rz)Ph$DZ8Bbq zen?Ys3T%~7j)1epnXZb2At_2i^}5Yhihc?rG`-z%X|J>dzEX_L^Nc|h4Wa>&KT3TH z&8s7=P01q3X(I%fnwh7Gx9{H*#~m??dtDs@AqWXcqwx(9pNgi?k(`FE!&r?iO2ULB zlCEUsP^m+k5oaq?l|Az!?BdCBwV&v?9t zWjt^=+_Rl`+)a_)oG3VyP1qW-I%8bM4dDCA`I+I_xuWD9^Ws^rKj-@SHS6`7Fl}W) zTemRiU;3Q<+bEZ$IYTGJV6hj-55t)V8cTF&e3XhJH9kY_2k zDaGS%!Gdd1nzq-|07_ z7^A^imJlc@qdJ3gPL!K8T|_PD%!w9OW0vKj$}JKLP8kN{@ES}mm{Lzl7JV#6YK2o3 zr{xb-6S}#qOI!$P#(G1su*5?n!UUOzv_fU6()dIV%ux}x3#C?4k`Qz(@?NmcHwt4W zWbrQ_2`W-9DX06RwH>7z#yQAh+{xa?IfFG#l~#@y6-}=dFIEa`Jt&QF9&0;>VTH9q z`pG$?FnI6e|KFD1N-4;hz6jYw>$ZoOW~LyEPuq1^-(kIzP`eY=W9L1qRnO25qJOat z@2rHCVj`D(8t29m<=-n!$*nS0X2LX6$1ST)vmp?3lyFW!$R=$zDH?_LtVw|-OynY3 zUTPsPp?#O0zCWc_SpcR)&P9SENZ>pbA*sZaM7dy*C1p`9j4uJoYAmr>7Z8AT|}x@q-v6=I6$6^o$m+w43e&jQ&KG$wG)SSv*uV>&X9kSfLw zs8pzF#4Afe3dBZxDF#$|Zs`>9WZY`Sb`^P;0@Hp^uQIo{Gq-Qw!Dk;aTnsqhp;b>U z6RIXIyylBn*Svdq&D*yF^EeV>;rrVg*1!2RKh>{r-r}{T%#m_9pzF-T_Lhf3V%hI; z!x~kDPAN?I}vcXi@%!SO`f`t0U&jINdXj0dE4M zKBEhs@%DG%?-rKh49vnFUwO(Ui3CCF9eOk<9krYr=W)b1H2Hg!}B87&js zzt0@@2VB=N=2-%^Swg7FSXtCt`Ry4kpQTQFyzSU-M{c)!9uoAuN2P?dj>8yOtt@~4 zPyQbN!@v1AqG3DZ*Cg(AMI=IRM4vYRGc=$@9Ky2>xD$dbUeLvSh$ z6%#8RRss}f7x=!XYzEGa;pOI>Ro@f!#39YxOndH^1IupV+2#V*Z}{?)FZg(K#q(he zE5{G>1M_3xehHNOH&g_fQ(~dSjK5x?bkE^1vpY-_z;zvS$dp+5;>Am@&o{hycE!h^ zek3jq64q8y4x}Qe_Rw6%hrQ!PVPrFOT&~vO6^HmhDdJdM;UGrR zGVyE}_}M2vCG84&T^Np9jglcGR)eLiHP^OhoM0#(@x+iGQWIGlr-|Qp%?|w&E4!n8)!0j}$pA*`5 zU^I6RJM3!U?)Hw$q2uMpFX%pc0ooG}6J6(7tyXN#HjHu4G9OS>5|$Jp$3#gPZ4I64 z(AI&n7%NF(Rm!RTEB72(5Qz^=i#xVvd3pL3io*5TE8NAW==0Bb=J(9T5#z+e;~l;2 z#ASQ*Og1;+5j9)NQ@XFTBvet0Bx=zzASt@-j@1c?{$acQh-ptLF)a~gMn3+$a^@}M z$T-f-<3d;h^D+~rJ!#%^_qb);kHl!?(xoL_BVIN+y&r?xMLogde*|GaVK=pW$4}_b z56I{z*Z5P{UFqWiom1#Xom%vzq2bEOw_e)7^G81R4^a2DJ|Xz)NxQC27Wf}wgpqKN z`q8rgxRh;;q$k^1TYQw0b6ry2<%tY(#1bnRj_MzI+dpWmpZ-Q2XmXC+zPsV>Hn3kFcrz{BRmER?|DI1D6ES)=ogk{AVj8MP8BNNDSPZH- z@s{aAnBTFC?+7(e+(rT-MX^M<50=`Up{+rcM^u)}U(xbrF4oFmEEf8%;EfXhp0%VT zmmF&nMagg|m)x4OFfI%4-oNJ|ZpkTOoyBDFk)0Nd6;g^UAyPv@rA*3!QW8dKLWs=s z!hSz88TncD!@%C!)|ArZl!UxfD#eH%1fyv&m=Dww>V!D_5bPjcLrF~^a}LLJZLOwV zDh*Z}Tx;DQ#+e`9-td)kbiLu_s-yaj1%)v(EULLsN^{-CMBi&Ze*TR87JF3oUIhjL~1UrNh0bVR1r+OMh@5^gVwy??)d7PZ@F9)ciTsP_1oX_o4=e`8OzVU z{2BlJU;Rt2zW9WgBfA(`ouBjK>;h{Y)3UIHfOlRJw?(&Bju2fU0qPPb%AqK|% zBbU`;P~3g{1LNHzV@WJ3lczh++|fBoGL{Q5V)VZYn)e6wMtd-~0q zk}B4CO4TeOf$6dC4CmLBv?2$OGUs3~sWoBsGfM2lX_iHW)VYpzch0?8QCjOYgoQW< z$OhYW#G=KCm$O{RjK&*QB|3XShSrR&m6g$)uR5MzY>R zkTT^&$w3g9rJ!^oIA^@M;dkGB z&-VTiqZKG=Xf1PQce~{ee)1Ww{>%T2pL}wK^Pbz=Ej4QH-oNFq{^I}So3Fnj%n_wm zgklIqvBb!fD^WQ*Z*Z#%y3GZuwZvl9%psF^2bS%DyhN%o_ow0k$2FeeVX0}o4pA_LQy zMfG5nhbkDzReyo5o^hO+lENBr*2$o=ThkAgB_$pvFh#R=y)pI6Oxr#CDbi<+_7~*pNXw42-$7n5R$7TMX_Q^F z`I-txugpYV8h%UI#<-94M@XPlp{SkgH+tuYg; zW{wK2Bc)C}jx&dy#^nKD6iEf{%Yoa&j>G+grBIzES%s^aYT(`(l2JIn#;ZyxQ4A?v zhR(p`)e#xr001BWNklrKCioEe?45Ct^xyC74^|{OOJ-Zd)V%+#*Z+Qd?l+*dJ6- zij*{rsZD_=s>ib#cWqR>pn7nL=m0VENlU$F}FYQc9jnT7r1JHLX!y@L8iX zWL=m`Vor%U3Vkc5N(i#}^eQn}N44st%&9HVCOSz@cN(pPoZ+mes6;6vDa(BznNuRUD9e5f+E~&wu`E&qqKLAmD0ycpZ84o;=q=~ZuDI|W!@&q~a=&nY z^M-GK_#Mi@=JEnRXs%vvc=75v`$I&h%vvQbJB`&9wFteTl0YYlia57ob#_UZBH9o5 z>nkqi10e=p3@e6yEx)^xTd2GeL%_BBkD!gU3|f`U4@zs4)`m@wC9z})m6&SCF;a8F zXbsxpR%@<5`Iy>YGE>M(1BMhL^SEc+?btqU+3oklD4K;-Qdi9vf<%4sY%tx}WsQh&OK4l-NC@or) zT5Hpq3MsV}{!amGb?i1A6?kH%5k+X5%hn=-i&QnXAfDTjuqo1&fKeG+3$_}p@~x#C z1@l~cbg_+p7p1wYtbF&6>c_UEKLtD67kKD;YD`SiL`e~&p=!&LJ+&lEO(c~lZK0x( z_f;)fzSl9Z+wJ)Non}7lP&ISbc{bKzhc(K1iX=be{T7AFs=dd0C+CN#unHVP#nf7p zNaFj|hNxSEeYoWIkon*Lum8mT+Zmq?IaRiYi5L^BVa=86xgG{`(u8}%ct|W{rjSn| zajh*iTT0H-JXJynD!HJOMkR}K1DzjE_iAl4sv+@@v$85FA2dc9h;3e{j1o_{ky$r2 z$ulMjMT(TDAwaH_BrW0;QX?rz7^b8s%j~5PrKk{U9~^7px}*e1jP24k2RB>!P}KMA7&Uviqan|Fs;#@^pl2Xye;;g0bdyKXiWrTdJl$2JAEZt-W zB)WzeXR5M7FSZ?Kr8qlVvpK)Q`X1k}WJd%Nj4GK_0*8a>&0=2UNmwc+rB+Umf5y^+ zDltYO&MCz_&C=kHkr;#;v|8P>d)%{xL`gcnTpH zW3Wf^!7^QK_mfwgcb23&`TI_ZQUXdF&IZfX*_!L~ z=e(ar9;ZF}Fk|m;Dc=Up&ewF>P^Uzf6P|@|*i+_=3IRV1crCLY*wTascAvQ z1B4M*3tf#k<3v@Qi`=VJk!OI??J=gv)j_HFPO&i#>kCuZqoUzqchBQ^N3;vO>73q4 zak-?@%GncI&!7S+cPNc0Agm?C$g(V?B+v2?gXp^Y0kmhyn%#CL+)r{Ys5@%bsAK3; z8)BAOMNtJ~3~T3Ebt|;-+}>?T%3*qsUppZ@WQ7?#FJE^2cmMjoVr2@m%Dg(i;J1f8 zh7nU0-f5gwRBI{yieaQDK)UfnV=kf zt!(VTX0R;`Fp&!qP_mXWMh??VicpVl>s+jef5EGz5F^OZ)YTf+wreXQYX}O@Z!dBaoq>@z9Ra*Z=i&$OKvxZ_cwZ!IJ zZp~REzE6N91?H4k=0He=x-8PnY^h|3C!BaSj#LZF@e-JzSDBTwY?$%2U{b=TN@C&G zj1*IdGlVIUrb5?sTwh%9s(E2z5;qwo(#MFgitRY!Ym|0cai|Ge>W04 z=xk+QA{EcG%_Udb@ssN-KKuMLKK=3w%x3+!aM(}FGkrRm7o>?;@^QfxD0Pva{ZcqQ z-thiD5EeIT3?Y;4HU8or_v(-M*f(k+{qprkTf-+0F~9SeB}J91~%COISvJ_NPDR`Jet>7*-G} zR&~-?(~5qzChmI1!wzaeJCD&ymh@d_u;$dDk)^$n^kGA-rCh}^lom=(twomGlCVloPcIdh*y}rX|ge4e;X5yvhKY{3wU zQ%f#-<9vZ3V!G- zY{>okfy2Ij5HO(D57yiD^h`M}Tb~@}azQZOA|HuDYTVn8U8QPU@ZpjZ*z#rn~pZ*!Os^Va>$P%F(X$k6s z?`Zq0mSf+sQBK;jT%O7G2{A9%hm%|91jkq91ALR>xV}DK%uB<$sSh6$KNbQsZ>bDP zp`3y#v_wCDGg#3Y&GooIZ||Vm{(6!=RW1A=IAhn`utlFH1=6Nc(zZ6G-~e9>S|wDC zcnnrKVs&WSq1y{pX&GWk*}Gz_A!pUTHwZ$SjL{yYGH8c4iq+~2J*>f5suD-6Dw%PT z6d-8Ed0`qdx*wQRAndnL*5s0?LE3lL7{TvrA;*AYo@R2)s4AE5oTLF;wI;VtseIlnrm|L9|a zR;0X;+hP%8DPp0<*2?*?;*-xlN2`}!8sU$Laj_uDOBef3uy?jQNtuYbep)pP#Et7}}pBJOAA$34SpgD#aR zB~nRGPq8*!G)QnyTH(@4l@VVig@84h&E}lq9B=O)SY;?yF~x}-11e-3o@G9;-5%(y z!*~c~ISrnnM_1dDS<{UC?@3*8Nm!HlLU{^T5qIVmV?y1GH9@!mRIHK--As&Lh5Vn~DpyG3&dihz;J za7mDZyklDfxo9ix)FOya!I26ozbM^8uPv}uBBTYZIt_AC!^r0%XMLk+&B#P5av87M zP_+|uwoxRl1zndjF$-;=zQdpCf}EMbEAK(U^=WYK~-gEP=qC1H@1 zSO_Si>0FOihR%2_hIv|exZe|U=HkUAo2x5gu`DHW;Viyi5kny?j|@(8d3izAmT?YT z^c83I2}j+zj+848yDjrL@%i-&&bp4EFELVRs-`aY#CAv8qy+K-HC(SI_yymw$(!efA}{`^f9>zo#sfVtSshR-|3#&A7!4 zG9*=6Q>{k1_I^{M$0)jpC$P+Dq*0USE$nWvrt)%q&F7bnbECi;E_uf1FP`!I*-M;t zGKe`+YT8My7V&wHhnabralU677k>5CulfD2e@j@R(7kfS)z}WrnP-=4UOxW`l?~hZ zJ*8|(R+inSI$U?gvlmy=ARTWRmqK3!(;DVViVL+a7%k!J&8DaC^Wn5j`%HYGoN;5_y^Fj65HW75ao2hV2D~FwLk@{zEX7C| z%7)B37an8f?hr|)(0wLT(7O6RD}|ja+1$m3;iBX zP`N46j;LsIVabt@Cu(*Q)>%dtYuOaj76XxYZ(sA9|MxHXvp@cv!w>KI<^S_NKmEhM z&&SU{V=xPx!)~9r`Ti?dUh{WFk8fNB4EP8RFryS6NmB?kH5TQ7I{l0~&*i!^j{X~hmxycQvO0JnDW>PMAYw5e5kOK)zNtGBQF)rvv8B679 zevzBjL>jb4LUPA@-SK>mEF_HSS)HvpyL?X9JFK25+Z}iB-tenmf5qdx<@qPCKwG-b za<&=hI>-Clk=_MSds#(Ekr)z}{hAx=n9_nR9VKU+vCwIhui^r>ig_B@SVPH)s0+@6 zj)lW?fFkNI?;OiKQ)0w-o_^&U4XzcD+N-~)LassxjmClZ5>d*~`+<*Ne99mH;U9CT zhG%D&+}ai1bXe`!?hkzP`g_jL*6g-hw);oHE*mK~#T-#3GsXXpt2gq@ize!D&A zL~|RGBGsibmCCMM^oa#ZObtJ##6Z&sNWB*;mE4MqY|xhg6FO~Bz= zwUDgcX`Zn8@UL7N0O&tnu3O*{44gYJu+< zs^!_mIYw3XX~A1V=Pb%dg4NfaLXn|=iBJ;D+|EUVp=uG>QFzP^56sg< zS^^~{j5W;6@`@J;>Ii+dnVyUox1`1ijFx&jt&X#hipq*H2F7t>oC7ICDivE6x~^kT z9o8D0H5lhH&dTeP*S6&h|W;tK9 znxLgrp(vCj^93@Lgfhp(v4lJ4c;N0~VYeIQ{X;R8!u=fh?%f^x-HsYW#7$Z8=I(*F zHxr>aQk8u{Dbr{IQiXk_1=Hx2DHnOB8UarB8bgV4Rw-4Zj`P2U^UtjY&$%9FEthBK zY}Xgms(Ja%E5><2n?lTmiUT7m6J1f z>Yguu{S|jtcch@1Lq$2zCUJhg=3@N>-S_y-IrjDfqYYzHd~R+*`AfP zbXuWHFL%0{P&J`)M3se{?FIENi_{@_W5UH&NSx%$P$!7b}JrZPCUz zQ(rS-6ge-`J}=%#rG=}FimEi)RGfN8XoE!$W^5?Q#>-$e@%UY!sy-d$J((kwGFwuujHkl+L8GP?KvY zzlt#hYHV#=7MBH!leG{Ct_~AJ=ooBjXc&do?GT0>472qdvSOSfbzX3(FuHs8J3%BF zr?Fad*q(E<+lmRnDCU|tObbpKDkD~De6Lutbd|+a7{`g41H1i>8VcTcLf1joIN#&C z6-jG$%gj{71?i2Zq{I?u&W3@mWY#sKmbrbvj#TvbP~@cz@tfeQo4>*+ane=|R?DFe zrC{t?s$st<`r6~HW4+l*D#Ul7pHP$HlTSXuueN`LwT2lO_~`aEuV25x-dyva{>5ML z^FR9~`ur(a&o6gBV?P~;Rq=oPhkwuC{Pka=cMq()j`iB(9Na(b=yc+vCu_8E^uA+b z6`PgEb&iKQaQ*I%aC1$V0<~C{YK5ARMplDiK-@e}FQ4$qN6+!S46sRtlH}m!yMgW5 z1^IB#yuYQUjA>X}V>G7g=(NTfOW$=^KOC=47_9`yPL=^1g{m4_irjjdBicxRUR*}r z-Y+~WPwDPPu3mk~+pBNr>OwBkJ*||H4M7R!@`Sf<2N9)YSeUb5h*Q=leC6>nFSw-U z;%jbg!N<3hfzoKBk-JAlO%v1oEjcat-f1X2ld@J;QKQOil{ zEsaU8kGQq>JJ;(e;@*OQ(xrxKNrxk4<9IQB@2S%DC}}_T=+Xqf2G*BkhZ5{G^*yov zvBCXc^ty|9T6i=HJZg*Tgk?YeTv6(jv_A>*?;F27|44lA4$zI z@PC35R|TdC`SsZKt6PVCeT3H?(}0Q-%AP8r%2OJu^4L9yZsK`8eVx+7^oXi|tRzq; z7p~T-IS8b?>QU2|G%Ag*ass0?%0hYHNby)=-e>{p2rO$L{qo++{~k(T%k!X{nagO0 zX~MXqN^}#0nkl3lUHZJ2`ZOm)fxIr9u%QOUdNttIYrvCLr8Ly}+6{bi@dP()`IDdh zDK9>F!Eb-_Yp!mu+223#V!V_-dFxtlP!;4{j%X`ugtwk`*W-=F`IQJKxglOLT&!2P zq340jxId8EdoHtkjddQc71T(M72`FXbu2b9H&&cu@BGu?(k8A&6rO;1&cs^Jhv#=8SrCq8|<=F^)`cy{p& z?M+Kc$ziqBW6-!=fPw91!>2#`1ajoecmUZzCciE=TY9BYA+qUu2IskX_l9pv;_BUw z-@d%&pTB-dUPk`EU;iHOSJ0iIUB~&VSB zDE3(W0PaD$l5@tzgpZZFpV?pEaWhWni!JrZC5I(qpFU+uk?H;prxeRH;c{ZLU7?&K z9vc2lKc3-grKKMYkclxu>$+9Qd9HJgi>FUnZ_mk9Gc8#XKWV|LX6(?0sVa6;VAvn% zJR}t<(}JENtRQEkX2MvsQeXP<|H_apSGI6)l#FUxt1%0>78Si>Fea~jt zpsVbGah?fb5mcWx(!GbGYpH0A!8_08(U;c*8;Fz`p z*`2Yg8?NHWy#|BBYLE5?s|qF=LWsm18Fa@|6H5-#H(UyO378nsh`2UWDS5=HfUOl} zI&y_jH73tkmB<>jb_`W9L|C%)6IUk{3xm~Ir`wP~T-cKGGR>7=o1iCThTdtcSL6ds zDHBUXtBN&}o)MsnoC|c;n4-wIQ?-uac(0H>*(tI8<+MPJ4UZ$n8)K@F3M!4((*$*0 zsqI3qt#tOL6e%fEqNMVUSpTBMC0~ySe3ehhudE-3(qcl)a#lSi$P`p#&-@`*lc<>+ksdM``rOjV)JxMcYcoBY^b)AWKaqWDqxpe z@PU=~;0NklSo_Ml2a^q`9;GrNC&p!w$H*A8ThR~aY}Z>!5Ging^PYL0=(LF0PAf<= zIf1t3WSm^DSEM=d+rRsd+$?)uzy2K$_j`05h_z>&3zZ-S)>5QW%^Xdk8dU^csdPcb zh)b2ORZuJ`5|@#)PVu9a;a`7r$z|`z54Uv1@a*X&m(PEIt{PV+QkH#IYINH9J!j@c zI=QtrOykU}H?J7W!u`A_XNc21wob&XB(Y?BKFyXVmrr>1anE%1hW&UTHgaD^)0vKo zvlaeOczv_y%~Du9i*;)bA)t+7-5WNW6>hykdrP*4Y%~rn=@DZ|N{L~gf;O41%R~&t zdUO#1QaKBD17(YI9sPREaB%^Bk8>+bRYCyjI+Ru{VIsyz(UqE$)T>xaZylHG4R>A7 z?lAK1_JJ2q&v@~{2mE&ZhWo2~HjC^PrBvo+rqn1#(_Dy4M5oF{zhdbP%67OaXyP+% z*>s+V+Xtq12fCd2;MvD`J23PsoV}MMjCJzk&N45BLsdLXJKo*iz&x@!J7efIwW!gw zRR91W07*naR7O&sah<_BLkNLsJcuDoZAhsQW0s1Ynn`gXH<6Fl8(!a|gB^nwr3DFc z8`M*ZB&YL?Nj)V7LR?6+Iu<1&^wrHZ|M6G9;_ELy;O^bXuYUC##+v!*hn8NCJOs__ zt36-;;Va%=zu{(i;Jg3r-=WPwH_wb$-}CkNZ~5WB`V0Pt|M7nUQ=v{+U}ZWXK(bKj zqz>hXO{Jd9(t;3Gtv;=u`e3QjTUl$CeMdW1!O4}yX$lWl<()Jk{iYr|yI8qMG^Gv5L?rhDf8>l#zqVP?eibnRoR1|Yolwwi7 zM=MJ$wAanHE^~#^LKu+beJ?nm8Wi4rm zjE9BIY75qLC<$vEQTIIGJ|q4pa&>=0sW49qH|ZAVJBl$l?|8E5$yVc)!aC44qm1AT zYlXvp&-$<@Z!efbfSga1&r%AhJXXpbLk%fs5=E+Ij2D_&jbsO_^EH=e=a>ansS=jR z;8!eBW9}DjUS9LH=`m^IV*7$=R~bVlVEK6c9BUlQ;enzQ*C{?S@=7IVO{unZ$t&?b zRa%O-VvRkWx$5a|Us0w}$!el1-GcT_h($WLOY4U{3RG2zU@cwl8e_$jaKsJQs!pb% z+Geq)B}I#pIjOC!qq=Ijo3(J2+}|oC##1t1%&RR%kP~HDP#KhQxGFuka-Ij{3tlP4 zET64hLPVTDBZiH0%I*vx5c9v`A7i)wFb~w!;^&QJ( zFxD~6l|#HECrhoCWzLM_j!-8Gd$0j(R(JzMc`cSU(6GkH8c;G>RhC>i90F^jS@#!M zBa|Ei^iH#Ah>bKTo$IAlXNp1iIIk!f!75iywKqyvjImhfuvR`tO9pw6UgDwjnKHaiTaJe~S)%C1aYjC}oedm#7x~JshY+6Z2 zwzq^9E~~1vfwi3D=Vf6WXI8dHxis}+N{B9x(| zB1wU&lKw7@oE%air-hp3brJKRXhzl=R$b4wAJ}%Cq>+=%W@fJ-FJi8Vk+>{)Z%A=M zDS7WoEreJwZjIGFst)wS6KXY_Z=Yf{a)$JVuspC#d){4rL&*#Ccp!z?MDj{Wm6`?K z9)P7JF`OKUaxEyQjgj}+n3EooTY{Tb9VZzdA+wdRP;*8rP3JV7H+ZM%yq4$4D6CRc zqe)~!O@ug;^FoU0R5Kt3O!++3%43?o2+2TBOg4*IsZ>-hCsJ!Fnk5%fTjwf~ z6f~hkYMawKjhq=`A}%73E8}G5X*!ZN&<#vEl42!?!n|Z2#!OZnuJ0IQI+1U6BYdTN zoWsd^?N~=rOJZrpf8D5UV{XKTsw5nP)Vm$2*SZCGJMa1M@&zA#@F6)Cma7M@b_=&v zDguhLU^THMYEG@HPkPC9sI0Mk&~MqVFWGH&oW02G{lI*`<>6uEKm6T4F=(hb_NhQ` z=!eQrKKqEzKd$WajPZuE%^ICF)mI`5`*C5tN%URM+2#y&*pZhYL5E}IV_I0|10evZ zh^bOla?UU%32wzA+DJ-5qO2m)ixD?4hnZXw*bYoDcq|O-(g7CRC{a4WU@afNc#d6f z>0B>nyEIXXA;$_+M%#*ZP<4<6eV&<1J838(Uxt*)F%e4;P06(iQl&BGSYj({j8PVA zJRI+JHAz*uk>_s-nUKJATl8>->d(l=uQ=#iMFiG9ywBV{@?HtKkit9zs zE{3kRsJ^2Mm9Dq+N^!RGOeHbK#F!x~StCmjlGSSH>3U1niGJ(JRBUndX5h?tTngOR zK&h6xUGwaG&BsqJ7?eYAG$woYRSRKCCBmF2Y$?T%ie|se+}@Ae-|yJ(cQ~tX-r;RW zEg5YJb2i*Q?4_P9r%1L&TwgiKA=-NSbx%0RCP3BXmZqs8U@Ou|Zt6*(txdc=X-=g| zFMvv@954xS-zhEKa#}xPpxcgKnjn*oIAnWtdTWMHMh)XlPSW36h+S-NLi&n)8)s_x+ypLDQXe&?zX9 z%gYUyms_A`@$lx&_q_S-KgmVKd9t$je$BIIf^n3-mX6L;wq9e6BF~lEys$s)h~tRW zYmC`I(s;i@cMxl&H;(hohRdfPVET0v!>WkmwP3BI>wB#8r^Bi>mRQQELlWEivD;8t zX(tqm5J-6u_gRYM5>FUQ}sdwdec$g}?soYwF=UUTkf{ zbBp_^l!~<;=lzjPDNep49fK@Rxs;mlEq!CP(hlH{h{AHjxwg-DX@hW(%h$_g=H=Tr z3?F^M?_Ph)_1$afHZF;ko>}!BzVFyhfxc7RPq7_JwG8EKZJpC{QOl(Y9lgpSR@`>& zV%pXra!dXn`<#?u+c;uDntA=zpD$B6F$RIr(2_m(ga9`@!;r?DH`bjK& ztb!A)Z%gn?n)y+P7g4?S02k>!Rqyq^Da!AhYVoq}^ z|8a4^BQm}j9@J?eFAZA63IC7LCp04E5#+C%yZ+d9cf>=9+^ixCTHo8sx6U9IhsV&Y0s-IH6iEDCJz$le&?jKkWD^{B` zN~m}Yow2xn#b&)mJ57l*OIRqWVyeL#O*I=VSo(tw^=y*Q`A(!AlDjAcNI6i9;eBY7L(QtS2Z*0Tr!W<`F-xprK z+w%SEH}n^m3{Ni5s%=TN#h_H{QbnOs#dntTwdZCq=&T3{rcmgr1*3V`&wTyr4g39? zVY_g@WV(wFINV)xef2<$Bca~0J51;j>C(umbM%{YO38fu>0ym zd)zss!Lp=?)lxU4Y{d_nq$5)b4KE(hOTy`bY>q2g8}owInmI*ARoIzK))}7y`Qets zX5g@_u=9qHEpy+I^oD~D7`w;nLfX%~d3Vpup10!zQyejNz>?@{0`|C4DcLbq>4#sN ziphbf3X2b1jqsO${kQzpzx%(rihFV>th)U2W2zFN&Kl6Q5{npZ zjaE3F1-oCG;MoR9w#we7i#X7A42dZhf`a~R%LgBQ$mgH^m>++VdGh21!?2=vmTnN- zq@+a@bBw&bzr*!CKmO@Y`NhwF!oz;YZvQ)`=}rdQ+M%^$)%SGkL8wZ~;Q9e$lo-h> zDCMDK#>1X*8R`}v--9GK?=(>xPn#5pGzVpmDt5|m=U1n#FjIUO)@Pns7}?&vQ&sc9Magn1OQ zj2R$<(}uHQMXwXyb-1d zyLZ3i<-1puVkGG`k1XAqzTe`KA?FQ=PKXrRp|nFGz0^e+F^MmMZk#}Al5_CEhF`p} z{M-NXhkWtulB+j~+jLG{qzkd1?$B74lu<=vRVCLM>P*iOft|2c&UU-|cc`2Q&U4@H zVr2=$ni)&M7Q@Yb;rIXi9qOk8&p-Nz#lX!!e?tfX)m090;dZxUI6vouCl^e{@%7aM zF(=N?wwzzCQ95B&=3?-ytt4>D>7Zz&0t7ARij)XNzJB96*4~P-HC0y5v)ZgkRnp)q zKQIgfy_c#6XBx&-TeMN6=A;xdh6vO#%PGC8!fMs?{DWucJkeXn;5yDPFR>SA_;H8# zo*Jvv$#sf;ZBJyVuoR~I873iQ*nUM0Gpc4(mb;uIGffk3uWlH}8Nc09Qehbs*w_hZNsXTlUP|(LX{$e;4HHs=LZ4??K-S+9Cmw3Sa4Rc)X4SWo~!G( zJav`t?+dT5Z@9g?;rpv=cCQty(PFz5FV>n*KYGFP-8Fyz_h0hsfA|&u#b5jc2z>c} z{S|-pzyF{7;-~-pv30u%WpXDhF`<#Q3Dx>YOXe6Tt}V@2ib5-k(FJ2WwwFC$eEws8 z_~~aX^?Tge6INAd3%xPK8W}_6uq-&OSeby%h19AWjL~A!T4sW&^qt)8b$b?UBgF_R zyfS!8-#bbU)GTMrqFY*0i^=y$v_oq#3u#TMnH&Q9J=EG$jP!YiIWaC*eEsr!4zqOe zrld$plN$MM3{_@JDM`>IOBGaZLwz~3i2yszGioJ0(y<}IsX`2+7OW{`Wh5z|VHy{_ zQmj@h&evO(EY&w&85Y~t%v2yDqLCjk+KBk8HP(m``sAy9kC0`IVDqifP>q<}bYVQ~ z7^jJ@ALJTe6dFtK*9^mkY&rs&Kt)@R(Uy=By3<@f-;zDJVa4s;tq^fYq^MBElS{!_ zMK?%rV(12$2gZ@ze$Vf|eM#B9<=_15Q+!u=eSah5n$?!QLQ>|8}amLzBkI?y+vzz&O%CP zl_k>E#Q@ln9)k2gow%!ol7(M$ogWGZuF=^OtJMR zx4Ds0{83&h7m5)Yoo=tQv0|p`x?bo4sbY&_Fw(&t!%QtjObt0V4iy+B6=T}8*+siU zrwrDv@OFjrmz;n21^@Mb``-}`5B%NV{f2qkF^30c4EvCw%;+2manD0c+}-SnF=Kot zlor0r1)_+PDP@!`EO{oVC?o)2y}9J#{5fOtq!=kBVV$9BSgJCyrsi#)?2;k3gVgHalbY6LeiEZ1XQN}GSBELAQwM|3HaITEJ;YY#f3jm+x3b{N$} zVFmLnlP9YjOVf&qYNnlPn}`@OI^j*mIfccdd`Bvgm;zd9R`#5lkgD8f8qYaMWwG-@ z|H_raIB~-*i`y|+i#?h?YLPlXZAhiEfmPSB9R}8eC&t8{ zd**3k9QRCzJ@YgYmW2|dkeXsTc7HbPzdF$qDlq5tNEO!a*&MZQ1Ur4Aiy9+AR@-Pl zS_z3URfx+>N*T04Td8uUYEn$-qA6Kwo}`*2lf%d|jq+L^&vr*+Wqk}^)ml$A1jisz zN)otJTBEvFT~eTy+}3(c%&-(tu50F!%#tN2V0FP6jdzxm4Ra7fM6Q~m3>ipO&I2;P zh%&>@h1duTM}o((d;WbQZBDHUr&SAv5YP&8w9SZFn%O}!>0^PO!I@0d@wBg{QqWqn z&zZwv;%s$BXF6FMmKjwOI)YaQRiy@VV;uc@#jxtB&Jki^unKYztt-u_F!9OL3(h|N zfZgLX6By5Wzmm=P<+tb6DiFMk3{icA6gi!cjbX)z69IVu9jibO>t_hhMgO*w*+KhL{P66Ok4z9%Y&(mlRglfptQ zS^{X7mzIGJx)7uq}gw+X? zHKmD%DL0&Bt#YVPReDL3r5Mwas4d-E3c7VYf*?MWmK0<;l8Ke{iz%7|lX5zAzSmBC zYHik~HsPZ68aJV-luSyHRZGb?1axUbu#%;ZOWbYx)HzeD5|>o_aXtz(Ja%&`C6^0( zOe5u%D$^RPouuuuh?z;NCRQ1Y?eV>47*@Qw-t#c;cvj)rW`pak3`#4<7eb5!PN7$x z92~ocg~J$GYlmGjrewzqUO|N{YPSGb48h^ z(UmHFs0CPJW-*RtL7@ff6l;!wzDk*Au3nsmjaSQX;4XdPA5;cK5e@_50uR z>SsUW2fz4pN$RE+!?hYb^!Y$^FA1?DZn_QGj+d`eMP6x5Gq6OKct_I}CN-Q3HKym0!H z+WH`eHvY)uaHIxs+#S>r!~giYNzI~uOj0)y{)qa2#OS{-?3VYc0cxv2c%P2&_?pQ6 z(J;uho)B0fm}qpP1H_aGu@aMGXoiF%QnJ=c?=)*K7eCPSUB`AakYnLtH*z^_`Qo!5 zvUzqvN||9jkW(g%6KE$Sft)bbNzz6Y8Dg~8akE zi}Oxs76nXII4dJX>ny(SAXSz$3tlU0j526zoACvye9>|-R|Qfmj3J;@M%W*6nUU0~ z9FkC4gb(AXrjvcL2x1E*UFLHLq?jNVoG}cm0oQkgd8U%FS_Do>b+=2)={Yt>561svEo?H}BSClQ(BA7Ufre-TBa9zO#&<5`cMrG3BKsX$zy(86y8Zu!H?V=p; zC9&bH)Jo9>V;gb57HW+$fXq_wBLYgsDd^gOPZ=2oO${fn zbH$X5Ddv?J4}A3NZ~60bPyb;hhQxZc;oi$2$XGGiwZEBI5+Meu%(50^3t3m` zw#*4r3n4`@vjjmo>eBZ8s+mG$JVdE_sFk20Q!yn`IS#i^8b6i7Zd~~G_Li%=9S>9D z5Hne6O#eWCec;VL;j5wVR-A1%n9j<&u4FBqLSQKcJ#C zkkGVsSm&|EiDc0mTXuSO)1icm~upu@eY*nO))6gQm|REI8ClIjuDe9%680lLwA;Vaj~LmPf%OD z->_0MUQLW4@paxa?nZ9zW)7ogE->c@l1gY5iK<6)fpO>ZoYW$w2W6-#Q*A-1o}voN z^uTuX7&I#ue(-~5{5SvkkNCI$)xW~b6aUZscSx&!K}A6bSL28(31VI;l1iv1(t;*c z#gr2BVdP<&*e?r9tdw#jad>L+c%#WRb6X>2x1)UhnxC63&$mz5e?0T;%Wrwu@6lz2 z-Xtz#;LI6*c(&#tB-AwV?CCk{wP&0jNb^AkJ~?BomAj;pAxKq*SSuk{mQ*RRV#)N@ zi*ep6j0JBTN@-HesHy~Y+OI*0anY5k=VS=I;j05d7Oc8@%Z+*YQ zInRDKV#`A_=|nU_r0Kd2-L1LIhP!tUXrt+R%``^#y8}z=s3f$hcxM_hP0-(jC^MCo zc8$j*Q!`(SfmXG1WTRF!Tz>0dX!PQGGCgV~d%S8jXk>*^4re=-DhV@hEvASdI(+;A zXTSNLsTN*c-|+J8HLpgvx_-y2@4qEXJGN)f_)mWNClqbi)Oi&3yZ`_o07*naR6T$C z*#|sZU-Iw&_DlZP|K)$i?f;xlKD^-f-~JP+W_C9>gm-V4Q-@!z$t5tXyxgs-^dh4w z%1YW@6rpyv(?$liUduVJ4cMPtoO5}$W$@Q%t4LMj`W2?pR+b!yWI{FQP|&ubbitH@ z&I%pt$*2TtoO4p!lPe(vQWPVXMMF&(<>XmwC}nG$^zycQCK#;uLeGc`hv~rKutTF5 zM;ODsq=!PH&NCT!`R3#s)L8&z?tlJkU$9$ho0(^LbwC`_>u zzG0*oMb;hTEc3AQRmGV^jfTEHW#}#6n=AIY5R>e--CCioMO)8$d(Qn_8PkIHQf1<_ zCC7yCJf;`%&s$I5^-Xki%yVIxMy%18&Qgt`EpaYXrHQ4`n1x-l9^Hz zN@)>fw+K%1eOYTyeapkpGYlOmXAaXu%!xS$LKIwhEfR=QH4{?{W;G+wv39Q=d}MY| zq_P23#k`{Bd|6dPGC#u986rn7y1%~9+gWv&CrgY(@-*F4LI!}X`Wte`S5JZpfa#$|L%Lf{q5iL)mQ(-{r$I0 z^NuO>lsaHapwpR{d&Y4`wH80DCDEM&g~(wUp%gkImrvI0$)s*(c;-3(=$vQU4&zo# z@z@6*sc9rR1J=_!FXV>f?C4l`tCWbAO3vFSyft!;h(*4)5Erg)Zh7_kJJx50!*q}{ zdlO4F6_XZHtCdPhOMNUI)vgJupsd`%qw*93a}Ep!O4vc^$W}r#Nyz};IWIG?MjbUq z(Ch6Gig7*K^yFelv0^(-t_q6??v^TqG86_Q>wYRMQNl_gfs5)y{d8JGm3e%wS?F#_ z)`DCs#yCpJ!~ii?bWB)nNVCj-OK<3^#uvkw7Vh>3W*xcMp2;)lrR%<^LT$a$)^}K2 zL6=6Z5Yiw?(Eg<*WpfdNi!%;7EuSS_$pwnmWGyBa8V!Y_q>8N2_OStN3^8O%7ITSK zzMV6YtdS;3A9K;nQJ$eCih)5YU@hYqc*i}{{=n9I2JfY6pcZU_DYS58t9l%BVOX6} zRnK~LM!z|uH;&#aY8)942j0DT$vE%WS21X$kU8u}bk!_N#G8)esYj{f1TePxF_{;Z zD$gnJ=}{-Ta1)d{uBS?jI!0@ZX+Kt)MH!Se(*2#Hpu=@9uv4z5$!N}566HnotU5L-Dyo^Tgg=@pq@r;pgY8H$5<;fr zfKnB272X<5HY~BS8xvE^5(>~-Qt@HrVVCeZp+X>s$h_o6)=Z5!uzIBTo;u;)pU@(8 z6Gdv#j1pZ>eviWXt{EGvJe$aDJGWZvu}D>q(KGhyHFxubHOw3LV=Uvi;CwFzxg6=dB^5;o3Z*m71*wPZ90#4G?nsMSyiXRQTo z32}rHpe8XjTf-P4xjK$xq`Tb8tTtt8jJUdDQh~e!yB+Xsfi*R04$~+#9l0adEdh_p zdk7Dl4jH;@!hR7-lrF?Pqn!b*S*_P>FRmH3R~YMCsLaaqIz>v9ef&{rl%AOmGdV{g zz&kI`MCB+&5i`t7Vwn~~&8TA0S?;@2n28k3Fz{r1h0=~`PSgZiIZB2x%;@Ba5v=Lx zw4%2wYzVS34_7Fc2+^dggQ}rHcea2WSd2J;na)_jmu*PDwB*|)(lwd9L=}5PD0W{Y24E-9q z#QqSe_eX3N2U^!_!3-OPX|8ZfW!-mhb%`^UatipY1aDs|t~z|_pm<94DCM!fM>$Wi zP8`hEN#CeaEV&ZW!eNdar-f+>)C|4vSoIyN^#<)7%2{zXW~o4M#$mjn>jpuvDkC)l z#(?ipwV<+e>WEm{#1i#h98+iUE@!z0N^O+@;vVzPN;jDkthRISk; zh(Rp{psNMlF~^A|X{zp7vJvcZOX-%_aO=J!hZCkwbT-quLJAY(actcvk)pw-fsj1L zDwLC9kgYSiOyrPo#^Ic1(;K$KnsukC@jysNzVq4V{NN9MK(~4VY9oB!Dv4cjL(Agt zyr=Jb;xds_B&DTwj3{!+oaRW*m5`Kl)wM2h*HC0tYe8jd>7#L4`bmebV6QY!Y{&ob z7k|q0mFHjl;ZKNm#sB=j{_ni|$H)&qd4V=goaC+{NpdBp`e>TTC9%XnNDIp{F^(r< z3|wxmxw(4Adb?v-Z?WAV>0YBn(AMe^kB@>-3WsTC$%Xwm^J3NWN8kIL#K1mz%5Ka3 z{FYz*-M{7V%fF&qMsl@`apE}LlEZ>2P8`|Ygwh=f_jtfm6xoe&p%@J-`BUR59r+= zp!7dv)<5#Z-uDnaR=ab4KW&4lWcVokq=lTN-}JG|s?jgb9rjA8-$h}5AljeB`bXnU z`@8y#8h(5Zw})?0ZB57@yx!VO3h&+OwH@Hj>Hb>JJy4Hd!TTP~_kYl`^X*$v=kG%` zj8W@%J!AXZ+VI$}cdqhkZsGGYs_`uUS?l>ZeV|%@k}=I4+o=Dk(F#;^9&5l@gX^SY z(zkkx^Y^39seV=PRjz_78h%bi^e#v0GlBZSM;T+6fg#JA-O#zqJ%_EYGfDb`l%Rguv!qKDHlSFE!6sViG&@o__Dvt2;J*w)X*+i*^C2QAd&W)N-D(^iqg{&2|?K>V#AKE}JLMi}a=5+jo`w~(8KtXfSZ}{x# zGd}z189_y+B{$b|L#kou`X28D$tR9)^GKk0?88Jg%(B85N2(E3D+Vp3f>K#(Aeo8H z<_6X2R+EtAV5W8J9C!474H%AbB4mXccJ$ss?>U7N7#S*NtqDblNmVstqOp{iNl^rN zt3BR09D<_PEsb}~6+djbeEuN}j#97~pT zVO5lDxDSbaP^7W~W0|Vq{se2+aW!nX+`M2Z3y0%tmeYY;b6dlNuybBQmJpdjKq*Z~ zm6);!FiBE-7KbTT=9{(RFnG72kF43y<(cVt zPtgk(*Bu(i!-K5d>aw8xj5iLiHjp(XO!(fR-Gp(8q3bY3M7EeCATsx}Y@ZFD|vff@WB}Xk9lN|fIJ@c|BtDf826JLLO$HT*(lnq69 z=%ItIBO1@5*A%^yJ#{VA>RQ)|Af&sR2sO!bmIG@8z0Ul}%?tkgvlo2#YQ^o_1D%O% zdg!_}8}t6`Y)EpB#b6pmN*776S`@v~c&Az2Y`A}0xb&|%0ln@>zH(d=B`=^AV=1Ii z=no64uiosmw`x( zk^OOIoFljI-tq0-#O|4)9~ArjJ5m@}R7Q2+jG-S^_+cOc<1{jjCowmj&Be|#tX3H7 zNGUK3hT-~(WrBx?JMmOd+>O{HtN%#tH+-DADya9a4qufOEstDo^Y_0(j@rQ_+7 z=X~_(XZ-l{?~&BNl~4Tfcc1Zd_fPzv|JUEL>UZ4Sd>`W+@Aigw$HLcNeZ|ewuR(1v z_MR9|?A9He7OEr9zFk5Cv;(m$nBj#8_BDAS9uM7;R7~2?|%s9jq~Jp=jOPy~jC8 zy~b(b?#(T)-@apinm}8IazSLKnuS6lmO==cF=#3srth#dvYbwM9Lj1**0(dzwmJ%$ z5HndBw09!B)gskUQBh+dYY}gaaVR6TkU2)CSn#g2bEk;ZORAj4K&~w`QwlN59;sB- zh+qkY7D2pqD3>NO=aeD6r;}Oh&?dC~yTN$JuvzosJ0Ef5cKqz;|0pTGn&tf8%!0;R ztTog!6Xpe@W$$VXQsGeoWLdkGIgn$*Iz`_(at@@}YI|yPjTudv7Gj9pzq#lB?twWa zN@wW$4vb=&N1VxM1KvAg)k5m5< z%d@>GM^uhd9R!-OsnGj#O{3J;IU{REZw$UxY%(mZE+}V3GMZ@3BhBdCZ(mCVqeM_@ zL;;P^9j$jFDCI1srji+qVz8S1;l%NHY66>3O^j9_G#-AC*hhp>=N!&C0t%d`q(WU1 zYMwcM`z2rg^xyM;{4ZZoW8%%1ula|+`M-Jh=2xVYnadXAuBc_9mLrOekOI2vF}7zq zjpSt{6FDt2s)ARAmmfW0Z{UF8*{7fI>E}OS8zz#L^HmOonv)=mwIYYeqGqWdv^)yB zoWmb2rA*N+kf+|y$&@10g3+>GjnhbVGfOJWNfNYHY2p&dtWjDja5a`(4XGLwnNAx_ zG%Pida-gcp&Ux0_vy@EGMFMwCm$1&0NT^&{^*zpLq3Lu341=5rs?_mm>xJ@HEuls+ z$TaPsRx#VE+Pdkp7!riS>zcVu$O2*vzd z$hDxg!w#NQz{b!_K~?5LwThuG7jh6b%~ zrYf_&DN0qbwi)9!9!083DsY;SDyxcZ=KEBHFfuQR7y~&Ma&5EwbKOY&prW&p*ErK) zB}v(y$!9a>c`eqY$LdalbCz5SsVH(WsM7R^STVJ*gu*cdLTKv_ic||J7D?Erh>npE z5>v>;3dvYB$^5#Ib0Opf;@RjXpQ%y`6Gsv5t;OoLt{E+7U?p@0 zl)`o$b4t9vzmux#Bx|r63{za7D5|o|HDXQ*yAx`S)G{c>)5N&%?IfcxO=9nT% zXQB$6YUFNN=x~e*oPkqLY|4%}o!G}nT^aIr#WYUbY_7Q2Ueeh$>(z!hofzj6(-=AI zCl1FG#}GJ96_XA1{zwcRowjr>yoAj>7|#*;USqV_V981G*+(yNuH*0j{ugXlnzS6y z^#DaP+Z}P|SkxYCdsfM!PMVlBlY)do9YzTr)rI@}H+0V9RmY*6IMkUz_jF-kUfxk^ z#ruv*7K3r?TQ7~GQF6t(A_N_;B*fclRzh*|=T*zTPa6b^Rx#F7l+2Stt}I2Pve5f# zkr0(G3cp&>8_VwcC7s(zy;aWiy}@>l`)T4(J+DuJJRh-fq@b9%W5@;Hd3o(IF^3bj z^IWsy;>xk@)?8j(w$Ne4w17fYo+&4G7Z=3Q^7X6VG9K?(?bc2Ev@A>Fq-JtTJRFYf zj|Xy3msh-e`V7RqHTSk0OfPSZxqq&!UVZQH#-(G&j_9 zk-ijV9uulcsmIJCyvIe>CjQd|y7zk-5p8r;?(Xy0Be4HkTWUb5!T4+F`AwA1s@-XE&@M2bLW1o#Ar3roVn7uQkbH zDv0mqpv-d7dFSZ*ffN^(D1!j&JQm0?Q4-RjmkJ?fI`8SUA(y~XGN~*;!qy7L5nStd znHAk3vo#&73(pV#;K%Gf{Sj~O_8i@oFl@2A8&>^Fu6v^hwY7Zb3bA5}xaG)^-YRkp ztfmu`%+29b92Fue)3~{cSTie zM(_FQuYbzdzxr$La^*BiEyVG-kc)JGRAsQ*OY*I%$F%hs>8Q?5ZGA>$%K`oa{k(Ok zmq$a;IgO{P{#}8%4Mxuv%S!8fuT79X_v?O;LjS!Q^vAw;c|O+1iu$u)T_08V`eEJn z*_H9ngmg(RK4!ifPDVYp<37IJc0UP4Jz7VTQs~^!_4<7c z!5PJ0+IOH4)6!!KROz;6<@W#Pcl$ff@1gnlTfw5B*;=ap+^MWu#emk5#KtOmEx6*^ zHdV5b2WJgk@90;(h+|8}l**H*H+=Q>fmdICLr0<7BF@AT@SUR{dgic@!-94ev7og& z2PH#TW#rEl;FX9(IVP;NXjLFaO3Cc+@0s_NIY-KQ@K8nAOu3R(!7d72qYORI-G;_t zx*q3eoL$g1$*?mQAx$K~mD?uPV=QQcwFX@+R=ZY(lBwo=ot|q01izbkT}#=;)l0WlvkQam-P(KQ0Zq zH}K|^*na&DAFl>Bn;WWGGo`}aVdQT4HSg~3SeDG2+XFFw%_+Sl8%Iq?rtyJd*F21Y zcMp3?TG(vX{P6of;>Vx=h!;1{`TVobxq9}5-+uW|9A5vHAAS6skH7O7Gd;g}^$yp~ z{FI5)@x(Yy?ADImx}#)RiXvx)N((s4GA}$FCstZ|(4{g&4zRyts`-$VK}B0F-SAmb z(fwwFwjJNzzv1@y4cqdBi~b4J!c1(}3sg0tv`1^(s7HojyQ5#N(AH7I$T%H{rQy$= zC)G-fiJU}m?Y$SVwnlUbSe5Cl!?!NEqzXYp%n7G5FR!2Q?B*Cx#J-vrfit2rQpb^)j}!FHg{~SVUCpm;y@k0X@-OEF;|$Tg=ri~W272`szDAPHDgV| z5>R?-NeoGs7^CPqjkg7FwCtyB#;J-55qi+OUV8g{mG864fZ~kl)vBVj@H$c!fJ;6A_EJVr`7uR`v80eWP7l1gJM!w?0l(?EItHrl*zBG%sDkeXy3k?QJD$IM&PO*} zhSfFIh@qmC`q=krw3uO1PRw&+Nedw*`p(ihi&37W6jm!zg)v5yDsetg2yUu=1MJV0KEDUhocqJhrsR3-i1|8#pGcb=EMuPAY&I)$+LD)>aIq$%`R3a_ zVGd9tF+_R=+SO*vv9d=j8Sg|ad-Luc_xJB`@g(UQ+p&~FES0LI&)gVA@2z0t$AyRe ziPzu0;^F?5HP8)yo;aeEkjI-cEde`4X++ z?b~m7I2nvl>~@~(wda$MpW*tB<6-7-JhXjqCd?BtOt@i-?K_6`3Tq7BD>}1gIvf}e zBPA!415zd}nG)pro}(B~hSdsZ4LQo5t~PV64Ec5IIXzRaK1|X#DpoD%^Le01YBlI0 z1RB6sNl;fM#FZWe%R(8Cgu8bf4+l0j=67BBh3fAxL7|HV)E{KtRD-~Ri*;SdwuX2p+Q^pmk-t-9X8#22W=c3Q3P0mp#wF{{vp-p2K)z zm1cT1f!%PdJ)JVxqVPIPcXScsU&>L?=f;rY4BnuX!PtRZ5=tdjy<_PMIUTV|ljZ}9 z1>?Q!V@ncqBa+o>Q|Rij*GN+ZU0Xs1ak5ppKXFfEBCMtNo` zNsvh!T5VJtC26!MH6ApgLMuej}yho*@W%2S_o=u(cR4?bTB`M+< z-y7Yl782e0jDc+^YOW}D`#?vgeju5!+MYL9aD^?TKV|J6Tbhw@A30r z{ES!MzLK=Fk^UXk(&aHF>ANT_xDW4i6v$F)rMic;!rYaS@0JtdgmU+n{u8JXf0x2GXZ*|r3y0&TGm_5$1h*- zFaPwEBapZJ7Vzj2~I{Mz@oMBnSK)Ty)*={$)c@{&F z(>QN9?)Qw-h_(jbd3@i~`3|LEQbB}DCB4krJ5um+U6h1I;Fsu@w=PML-&8CGOA|De zP++`~`crE>F~E|dq(n_6mI75QMyU*|o2lq3MgUU_frwKIw8Q!pV^I9N|M2(N!SHYX;@`0O_*?$NFMdh*=1bOo zz?Kyw3S|t=^%T9Ps|jTtCHI`d%rqzb$`I_pbjqlhNpBZUD#7}a?Zsz&_QOA;-hIRE zAyCsTak*nInXCrpkWr?h)1hJETbH*{WECV4uZqkoy(29XMi;EofG0Z0CUAMt@dw}k zlplTm1;IS!;`&Q5c521S%S?NT24g`Pg;pZ^<`&W!l!dHiwmZ%2j|Wz4CG=DZtJMnU zoz#^ebCX;YwL~l#(n2i@{a_%DpgWY4GtR|Ii)p+Kx2=8zF-h%a>ok|= zQKp7OEt%xSkmPNLYd=(zT+0eg7^NER9DGVC5sd6Dz1EUwHIjn&Hq&=KO3Uvu#yr-f zQXr*5T7(#6r@*`Jq|4+K&JXm) zumiu@qi-gybkN`Lnpp|K# zhpb~+*T zQIslSSA}%m+ZH5@sgZt*a8FWFgp?Skg3S?~GBFiSsd6luQ5m8(Ldk5T*K>%G7QBf$ zwMtUalVlA`c<&j84(~gP1&gM$p59r!^LQ&^QyOsrt%Od6VmXa0<4Dztv}ES8W6r;1@1yphQ@i9?A}7uIc(rzfDYb%f8>Sx*FJq$kmG@bKNk7h!3HO(Td;f zAMpAB6x^bD9ZyWFp84*c!*+vR59|kzcZzvBaN56PKc6@S&6qoiu0Y5BWQnEY+0$#> z%JIo(AJKWo!!i)&JIZn*%mJ$n|Kd;ogwHlnp6uh zS5lR0Z`H4G^jO_fvc_sp2y#7+b;elBlqAH~IiUgM3`5_eQG`;NQi86h+Mc3483VDh z$@gem`Q<W`Gth^eNPS<=RI5J@jHd+5T7t}f}ZblPK3JnWB*$2YvSg)vWb7A|%JFP`0C zLzaQFnY9%3?!*kO6F`cP2&U?W*RV{-->*;;RkS*R=I&JCuj+8Q|CGz%g z0%N$;8@kr{DtK!V8oYv)@5sh8J4c)s!Zfx1FWG?BxS&)*8;!xBVg?d9D`FAk>2y3Y z-rh2eBTFn4Z5jNE>(!23zn0!Lr$}L;1nE{!t*cxmSW?>%-yO(d;`QsdY=)lgs>f>S zWl(MRt(-B-mD`+Vv9f&SUKW*`w+T-BlP0=t!?D zHYEy$v1G=uV06c}AK0kM%8Yn3v9cSU_ZvRGeoEGk*ZUL2boA%gH6@Oq z5~`eQ6*Q(=y4q8_HS=oVI6kn9fjJ7kTvdhFntnUbt=Cd7Q47)nBDn3t92vujFitEn z5~2*K7X!h9%Y{Qc^5n%+Ru?y59LqGb?K{-pNnuGrtgJRayDj_GZCQm_m&TTt_kkv zPxtqQy+>P?dgR`}PXwrDoOt}(su?wupy$sxstIV|+m zbGd!W<;t?Xx~5QAO$)d0?)lmAYd(8fF@D98k?$lTXx4pTygl;#*(Lw-kAK3|%>{iw z&^yO^yCG@C^7Yr0euKTZg58$RZCIa1Hoaqe^^{XkgcMo#n)P5Movti8FIcre6){~nL#d>Yor6Nhmkj|bwzYjQ34UY?mLPRvyf*Q?xccqL2vJyqr~ zbGIbwx-xWw>v8LQ>q>Q^1syK@N=#uQBJ`*s*i zF<9fMcytM@J4xIx%gj;=OID0g1`^P4%|=s{Cge(pS%&s`p|?)bsm9^8)GU>vm={Gg zuHCnql&jzmlb};`hJ;4dK&go-RzhyX5-q0U1`-r9gI%%nmYbnt@Q`cAlGdDZVpO2I zL6X2ZQ_^|8&M1|nvY_T>T7haax>`&%ZNOqteJ@zhR0uJUQG!A)6&(t7PAo>SfMl>$ zp{rcSNhu-@G2WLvD)# ztaq2(9)+k8W5ydJ*NoO!<#D!`;j#C4=WyPz-Cl8VafKQMN@Klat+yy=(cQqa7awtb zeZ_Wl$M?SbJ+4=ulVai*zrEx6C!g`J|GWQ^t}eX#@>_JxTz*qS291k z+VI_{o{u(_-2mt;D9;?QF|zH}C}UZSMR|`2au0^0i7I2L*eXVlh$5GW>pD5BY_HJW zhN&8y>qt6L)l9XTw2auSSXo6V@M@ai{s>O9yI8Znykrv;$GZonC3CwJ)K2ly%CYTM z49?)S7$208T_{&LIdbjxqPykm1Ua&ghK@s(x1rIZ6-{pyx?Z{9M7h5O@y+xr7ox3{>h){Jair@VmCWIA$9lhE+ifxHfz4`Qy&Bj=kDVPU%6e#& z1`07I<|(kufxcT4$t=sn>9j}tK?Grarsk+eGS``|K|x4J@13>MPg!fTs8%wj(L?WF(Z9(Iwb}JL#r#Yeu7%RWY>E>{qzg|=!ai0z54}9Eo`l4 z922#OnQhe#{P;&d;N^Edhv7N9%||@EdW9;HFTVH*3@fb3++1x5bxWiW!o(7TblFcc z^KnKQD_ynIk(_4UzO5YY?{FwqPBBmSben z-y6e{^rP@>l=QD#W9Xfw>pF(M)y1`{0h24nou=0R*J6ps-zda&971sH0`n^a*?6G%*W(=)m22v*aTW#6<*8UJC<{2 zw$N{;l7-TU7c!03kA2)4g)<88I;;_-cuc98)#PNJveeSlBK_(`K~-nbUof#%iP)p7 z!YYN;hN>J@NnO>FA*G0~m3~-bJ5Pv#ahh1KF8T96|5N_qXaB%&zy1o0Mj62jE3HX6 zb3C1(X2G?u26SGiQ^a>YyUPovIrH}Zp1jW}V<@T;a-u5Dk|L(F#GJ6TpvX+i$lb#| zr}>2IS14`iyAD)O=Pl$y$wCH`YK9i_sUl9q5LlK)=oUIj8eBV!>!{X~RRt`IIBAJ1hDx0C>=4!<$h#^BpZH*RJMc6sdGPSlM>@1O-GtN1baguC2n=OnH?0cJ& z>ULH(EpxNotk~^#6wiWDXNbS5DK&!^1t+IkwvkyUPn)C)fWH z0x={~h@8feFwb~nu^qA}sX$%GBx(_ghc`yhsrx^M*&WTZ@u*kX?y$qU5MU^D;9<3=UF-;SvIWSF&v}xLoc!n*QM!BlU zZ>l0@)fUVs=b1##ggJ5d_8qTx1C|>G112kc(pV*i%xXGnx1#nlInEeUp(X~U=sG9+ zwpxX=Y!-4%sM@nqD@jid9ih|Ii)++o;D>+wpYz2}{)8ug5c%mZf63vu->_DhWpzPP zPQqYmVZyW0ncfRY^vzVUM)UO91&3*7tPgZuPp}175-T-uV^_HCCDeo)zhOMwu}pi6 zE-2SSTqvrdokf+}Qn&SyCRtl$Q>_`DlJvkg!)?wHT{63V;Ms-a#nlBr`0l5?y3?$k z{ma>uGf%eY%>&L z{39aX7$N^{E-!ia%MIWA^b>gUl7IYnf5n%-_$m2xk6~i3*NkCi$&pN}ZEB&R(!wsK zGf2*I57d}YxzKlraX@=|uhD4wEJ48-f>alk$~aA8xH5uht_o~XkYrA)tD@6} zYOKth&ZGvdz({>yLJ?v@O*4mi;YG@*TqU_{dpg&VLnbFdr~8!?f<={?S!+uomdu>8 zRI=tM^VBLLRE{FDDSZwU8B|CpBE9oiYfxBfDVTDep$V18DUIz1ypw&NR|-$XYoRQj zNhih`oYkxbgV7deJHj}Vm1TaIIgLkBisTZRmkF&6Q%D%?$wjKRVvH2kQA?5QPSd`7 zsbn@STvtnKK`l*DN$91m*798Wsv6%ny4u#UFlR}R|C2}nsPA3YI zIJcdX86R2*F^?f8A$p{oiE|__k>i{QQ79<6K+IB`S6gj_%noU!)r_fN&-2)vNX7~I zvuSJR+UPT$-nOqNR|z$gB2_rDHCC%@`S6)9m^Qd zC2@7N!8y2IZRqtg29!h@tVzanI0qbWV}e z!Zgps3e|V?%3+I=#Ct1Fji-@edyTJ}k1ucdB0193L!CMC4*O!qU;K~%ldPw}fA->r zfBV0|>GWg%?zdm@Dm?HoA0TxMT=6bNk~S1$$;yzN#`Zn7+sZ7qSi)49ANFW_$>IJr zrvUn5#gZaXFA~_PwspY^rCD+Th0`*lyA93_SldHUWaS7o5ldoTBAFl+8qP2kse!g? zpk|E$Vk#V`f?xG0*2$n1Eos)$1bd10y>~61btzkA5iAWgT-&Cmo`adXHsL1AK|#}; zJTj!WXSlU6bepL4UbsIye=52q81*CmUqT3lg)CjEx#2%lV2P0!Q%kf$DbjUpvymiY zuBaU8N@383*mr~i#~9H2Bf2Oqw`){yTMD-}xlmG&#Te|SCz046BOw$Fa$xFIZT%~< z2`Y%|Pg^7D)*{`-R(rgwtc)YpN^d=#w%A%pDKgF#og>zQ>KwV@estBK5-BMTIgsMS zyW@yeiosc&kq0WeimR^oB3_-15iQlKjlraZ$^nf0Hx)uo1Ts}?oE}l?fX^G0Jrds( ze)Zd5^UI(8oEQJ!CI7|0`ZF$HzLfN=QYbRVanJp)|BmqO&*_aPR7sNdA&F3L6uB1c z|IgK%{YaLccY4pao+TnOa;eIy>S{K3kt0!}C3$4X_F%3C7{E947utX?eCG>$Fo4H~ z0m-%`+mf|$B$5&-vdQkQ?yjobVmar0t1sR!vZ{4Kup3=jRT&v^&iUT=_j{fgh|`hl z?G^nuzsKlCjwN%sOi-ZD8XZgf87IO#Gb+ty7}&)FZg+`aKxf5z9C>oN<(M;X9s=|J zo@XDu;Mq4n5|mP^kQ7R}mL4moj0vuDP&%wOXe8Bsc(|v=!st8Bwi}*3KjY&1DN(_3 znI+K}XO4SCpd-~vc8ZELCIXt6<=66XKsimxjvVEKad~;gZ-4vS{Qb1&%^_fFqIVu} zk`UH%z*NROE;N+}Z8cS8z|*(n-t9C~Yak>Eekg5P2!=-&_4njqtCC^6TNzOKWF;zFToh-9V^UZ1AA(Bd4SnGe@rvGQn`tsP0fBzMz&2!bl z1CQ<|^;NRKd$fT1__#_-QkEt^dH-upe)<-c(5ij!@9rfhD#0nDP#=?_f@9Jr&OklI z2i^@GTL$d$wG*(Ne*9aVzQ@x&Ku}Sp`T8W7P*rW$^(>SIPJyrbh}4&G*gLo5i9}Gy z(&TSylu=vGI*)dWDK9J)R^Ic}R-U@ds&i;N0G%9;b)@qeZ9D~yYd5;A<-4{l*cvIU zn2RMCL6CYQe`YQY@ZyD}fG#XCi~b@hVkm?Zn8Qp6Grj5{_9*XB+RCC^gzLqOKp=u6**9(lqgz!pVFw%Eu5=w=2f8 z6|n_8l#-;pb5@ew)5H>1;@4{wp_5avz8}1y$^$&$oR{Z^hRA>U@z?!NIlAkZb7hGU-wo1i zJ$cx3WR6GXI1_R}XL0Q<#bWRUKSA?3nh zo-lSKldx5mthHofN`w$8VZmxI3ufaf$+iG&Wr>w&M$D?GghYx5Tn%`@Dnn4F4Om+H ze+d|?abriVMTW{<#d=3ff(%_M%uB?m!teDvWsb9YOKk(?sCgDgC=a?${4eY}_pQz#r=AyrN1 zG`-gJI?FIZNdRX(T8t@JBcJ`LIPQ;@v}8stRlfV0NYzk+;%thfSsFldEm-eRDp0M1 zA<~(|i@xXSxMEy8x{E8ejF<|C*MWI?%^U)~k^zKPic*$_*e(rEd3rXGn^x6rvfGGM zA8;vQ7m?BG@IW9BDWg&!xlH_?zm)2g0 z6UvT^=P%h_Tyk-7#rAAXah7mAN_b}&_}72%U*eo$7}k9ETi@m7vulny6aVQKghiuE z^RpU5Y)_Kscg3ATwGjJa%I2Up*mSm)Yd}OS{7f<_Vm6G zb6_V;5&=g8t*d2Iac1V9z5&Lp{D~+2hSh=?(bmg#E<^wZ@50|`8R*~ zFZu1?`WJlmv%lxTD$!TzN-Y^}>br1;Q5XludCzev7&I4W1KvqfELKIBCvNw9TyTum z(>q5piUk=eoozR)S8K8|9HRJOd+X@?0c#vlE2@fgR-REpDLg+r<69qni%%XRzdF1o zSBG+)G-&%ZetnKNo)i@DK*^Qjp|_T?E(OEI03m|y=(-IXr@1~~LoI}yNMRwDi1u=3O=MD5lv*%3F)KJ2aiALK zNXG|CoF7rT-g%t0lq3WMMWtSuMiBr2AOJ~3K~(pe&Q+#dn8VEdabn)>>BEsuX{;NB zUV@=gSw^9T--}|!$RNC8s16RPa(g_o-FB?DE0$km!4)SP^J9)M$ph z$CI$7qb4Qaugk>Q2)Qnap3m6Ianj7ylNFSt1dnf^=p@U+~3|k@OMA^nC)TV z(@$Q}Z4LAK5=Y0XANk&Ie2=ex?InNz<Um%8s5ROd89f#wdqBY0efrp&f&xOH8hH=f= z0N(UGeEA6vIT9y@ZM41;76v!c>r6JDTo+E4@ssjTRRp(;66#dWkW16aKq*mXUJAlI zgS9y4rFql*x6XOS)rxVoqGUsErBXeVQzym6Zmxmd2vin$2d-{S>%=*s(iKbaqXw z?Y*ltxyWnY4;_8q;jBSvhqsYpG~RBADYJUjKZX&67*`r+1428~WI%jarLz_{pF)8x`?|L$dx-5drFEU@X z#>#sZOX&kV?0ohrk={pFI^15IC6%ypRquS9=Jj;Gg&2yPSm!bGgVQFV@Z`| zE~0cO0qY9rjK^Y15vq#Lg0IzvpcLUmYb^?Mnv18x?VB4pgNKDP@9DEK%Vi(h~Ce5 z@5yCBX+>`=OA4T1G&8;JF`XgWh#e9tD)c^~_Y==AH@M4l?(QE@Qy}c_c=+U(-2B5& ziN`(D@s5X^FHl7^eK`lAJRplhqur^dAxp$oTsW0%Y@=72D!6&8z#-?3b?5M=V2CV- znfdTQ41wu5^TnID+`oOztGgR=!#I~J3+deGmpWHUOx!Os-IH^E=Z8OJ^WvNQ-Cz7Q zfA&{D=z zEemrqM?a2 z8nMjceT822bjFi)VyT8@kygHT7TbAwrnVO2J8YGO{hSJOlIy%vn$CDe-_x0nW1T2T zv~}9aJgXE@Y~*%LJ%+%;J}^&9BcR!)8!l32GDhfLs!CZf6>1R=bmuLmT2c;JJW6;5 zLXx21oTKkOW7lD8!PU}&EpknA-pjHVuz4XbfqmNZaDPM_C;E<59;szA=Y?gdD79dW zeJpvzTw57Ov^2GX)}kU7wU3ZBwNjj{4x*hb?LN^;O+|=)xgqbZ))d{!qbj!oL2ZOh zjj@$#3b`!OhHnbS6N29vp}Uwz!hUH4oI;L?B?RUrFwgR{P8A7z7eV5e{BGK*bqf_1 zITx4IN?}!_Ymzx!BT1ta$~ug(Xzj=-=A1}M9O*Fz(FCb*dJz0?=YR_ z>iV3`cBD&Buny*Gv4evQU6FusFcmdwI^T2I8J=#hS!(7tyK8KTgxfppyin?fd099t zia8tzVZtiW&D9j?N`)^UxPN1qZ|`s+67wxzez9<5B|q2W9<$%$jz_wArp8EGW(EqX zyrZ#}P+7>-oSEl|r5o6XfHe}9O-YKFxytiWYQ&+w6BXO-n_CDoUw-l_zq~wW6>cfT z)1Pg*P4{f~&)NRz|I7!^KcXvvpZ(}>_)lNFVTy*2=geL7gnU6<6wVq#2)I&kS+2=e zD@JeFXoIbap&#kbueiyYfBN*6o2YqxFnrKoQ|H3N&EL`)$EZMs7OZxTh0IhlswtAQ zZb}C)iX3dE#zL|yVoEscu)d?H+BATgT4jD1;*n`8m`-N0nS~`4LRQpu#ceyj^ZYmX z{ttghRRd7io;~Gk^91KCm)9>SL6Ll6zrO{S*=|Rko_9PO*UVjq%ZhuylR26)TwFY1 z>?I&yQ7j>#)Ie2^ITy6iOu4XCLDVI^V|%{FYbYU;LLoJskk)XvJ;ND;_nv+jS#p&* zLMo#A9!7F19QOyg9%$WEo-uFRY{zgSPNrFshRf`u(W#D%oIGnkyMw~XeBO}oHJQhXzlYt zC6!DJfe^&?RN9hXX$1*V3NTNEVkx;|fvzerp4>y2WSF2@({QU-Xb064iq;Jio3T~l z&}@9qeps=@1GgnmO~=MdYg5-sNr6hcaVEik4*fvq2D}}y%S>02xYbi2)y%O@xS~j* zkgH?aO}M4Q*$%YfXvGbtv?CiuF-9iAMjSv?5Z8QwNhBCFhw*DvdC{?1EpnQ z?|bpSObf>_6O*Lwlxhz+3T$rv#3BQ|WsW?(ddk;6`Yz|2YuE=&swi)X3c?%+Av1Jq z)}@b3S#J z74o^SK*`c8IpLG2fy%!2lnp#wQaBn`&_I}dZ%CNdU1XnV;U60A4NRio$IG#_#s#EJh zt3p*pbS2s_*p7`cLJ3h8JB+Nn;=`*al<$0->*rs`jptA_EiQ#Kj%i+)mV(=OsN#&T zF`;V0^d93q%frO&?JW=c9V>q>4OM65vzR2Nkd-X6Qx;-MEHbpVZb0jfuIq7rr1M_< zdMSz9G1o^|oiZBhEPm*v<<*8!Ct8Dd7F}idChreX)o{X^r9>nX=LsDbdf&CiQYFPi z2!Rl0vVwWuvp?K1&j)hzY*v#cbdzgazDT-QYuf@H;;EwuA%WI}Ix#M0<77x)rO|`7 zgq+x=OlClPLoya>Pge$U342Sw@vNQV>eBOKz2@m=#q$@}^uwB~?FHwXGwjeam)u%! z(h^pw;1XQ+Yql?6@+QICzkJ0%{p2Tn|2J2B^yHkwa*wK!zT5Eh{DPainfv=h*RS~S zgXh$wSc2jFe2p7sih7{$6hm+D-e7FUygL%Yf*(7kWnzvIRltpBFm5Q*Oo@Swv#feY z??;}TZ+P>!f&&$GKEYF`j#SUBQvWR-+MEoe_y=zx}rzmMpiGtrX zeDLfgKlrU5@c;bLAMxewj*mb7gw9>?+^rdh0j(9`Sg~5JWgf%I4;=fEeVqjtmm_mH zGAz(N$z8N^&z9vi$EXy8pLX|*`Gu8;zA=T1cgq097a|o0eamETJKUbzD@Y(AxnI9%T ziv_w3gOOpPah@Ed8DSJSCD+d-$>-5|QB`Qw(T`_%D>&1rB3dQ!(WS&_fF3UUz}GGv zXXhTRBK5LEDUU;QH99`{;GASTe*I=JI*0lz#!TV0=RPFXwfT(BDWm)L8LY2z> zabcbg?59B11AcQxS1nFkc@9&R6c=>wIXm03T5mbOe9H5ybM|TCW;(E0tvLVYxB2kt z6V6rxXBQVd``S0q)-!za3v|_Vwu1soN~q(3dD`QRX1iKptz(IT2lu_l=t>9^DMtE! zKvm6r+%t5J{%kA3xJA%`s3M=ISg5h!jiK|7&Pgk$Bt9FaDQ{di>ph1 z>wDkjv)gTmyw<>nr>{W{vLC<(UXin{7peG&NbM&V44u`86@pzMaC4OLH6TzeN4 z2obL`XQp!I6X%_$!V{Av(ful+cwKC8#rNn1%?g=XJ^4XTrf!lgi9T>Y6 zm#a&zHkno5kz=5!Ob9a%yB&SkVZE28Y{`H$iA}96`yFql9WfW)-XAdCIc^xqNfUCS z)0$EZ80eg(^D+QeMewUe8;ti*Bg(GHN|RM=Dxbm>Cl0|28OJMBtdtTT!!{)=9u9$J zQJg2kv4CabrX-GL!@XLu-MpmWDbAu-BkEzxkT>)=l1^-1Jf)1_-vrD8&Rx*!4K-;F zb6^*am|k&qz9yu?>zf1GzUBJaGyLT_<96iw`kHui#jE3v!*ODo_Ht(KMy4t7*=Jvn zbZF-?&m0okWCq{Ubv@IRSyE(9;y{%W@VjuZY0tl^g?CjuN7XFo|B@pqCh(;V*~B*; zQy^xC(gvkFc6-Ioe{sWluSmJ)YI8}}mceO$=LbLF+u!^qT9p>+EI2K}w45TOOpbxe z^D`mPb$KwOr`dnH)rOJ}QI(hzUp?jN^Xm02Z{OUZmOU;n+{}?(3!7_askPv&p+^0v>C%n*)ebROCByquO@u1S zC4~fNLtLma6OqB!I1boulyJ4m=$b{tVysZ_l(YiH?`cuSfw5F=g&?N1wD+`};Z6&S zniooxB8902l@`1c;>i@H$zz?tI4h2EYp_bURYWC8r}MCSF9cszc|6Ujayrwsdt1%uoT=4ftf3z~R%vvp=vrA06R$r1od5LG zpYf|tKjpYA=&}JTy29fUS+d-Bov{pECj;b~>ADV8HOJj8PAmG(J#TL1jOw(Z_m)*R(D$C+Iy&z-h62jUbF#H9_$;SeV>C%Q zC?1S_x~Nwj{g<)c+a2z#a|F^{+_R054?T7=e+Cr=;|6}M{bw5kDrqg zqs(5aV4PEGK5Z171gd31`-bErG!AkU8uhgODEHKiD0 z%A_c>shZ>&Ew;HrRS^0;`^T2yVS{W?^|8YRTWEX!C;Y3EmY+sBmg z-jZ|T%P-%s%o8hXxq0=PU#@=1u}Hw33TZmx$*i4b-3fImVHmY$Forp|uxo)7TdAy< z>($V2@TO-uF1$Lt;ZOhL|G@`#r23Ix{lm{WySzfxg=13aT-opTlrnL7*|Axjp(=!w za8_}1*m1nM!KB28Prl8#y?|V~i*LDI?)mkrpYz#Ie#}KR-02-3|NLj%zkQ8P(n?N^ zWT&*J^={=gsTJL*jz(L#9w|doTCQI$cv_1zoI@xq^F&w<7;A_rv73%88SLte{TFYz zscTYc{_a{u>DkVmv8Q;; zi}b3Mj5V$PH-+7PcSgYW45K*?}e0{iJmu9<8! zuHBbV641eGLJ^fw$*r}G%rLdMz=%Ow<|$X|5=pT(eXVQt7LCyvt1_iZ$gva!)sk}- zwShM1szjTVlQ`T}BKjmjwk#n(izZi1NFT+Gih1?WqIfHE>*NS0UCX`L&Dq$X@qVrc zqw|bI&+hiX@?_0n?ZIk_sW@FIae;D6iV3F+rWiu31ZFAe43>@Guw891xe&s_7hir( z3`gvAAin*QGTq?%4fhWR_REoJ*%Q)&)g8|CW>3rXmtrcD58Fc6@q(}^3qI4i9!yFS? z3B|1#OE+3JXFdLM%d_*9?1NQd9DA-VE(we0!wChkVdK zXO4ka-t(q2Dht&?J|>)6i=p;l7L41LFHwUPaTQdr{|`VKnLL-xa(Y(4$@jP_qwFQ!kqN;YF zkS$tEM#w@>ur8-Isr(k1ip^k)CKtsdwLw9L)Pk-C0~95LJ4hIeB$A3_Ru&NdX|;-C zJ*hfkUD&5eznkf_VYTw8zP9vP8#c6L-MR5Bn{y^4ac8?8w0T^j)gsvBN|uJ-DH(>w z7+4MRKwe^dz^bx*YU@cdGK@>LGNmYPb8WEJqMXC&O47}nOk2>N99>!l#o8E*6$F=7 z(rGR2Vw7;qxna|4dBj`CS||$crwNk^9SY+u`yBYy+atfeop}8axj6eJzQDNIkW>{c zRITLf==8|OuUYvueZQt(ZAhIZX@zkPRbbOOw%aW(R9Q^-9e4?fIAyTfQj`K`9~Z+p zW%dTn{_&^$`qeAWv>-aR2%f zcK2_Xjt7?GLJ6RYqb7?{1HIi)qGLHIjyt%yS=xa*vBVjT!dQ>dhN2}wA4!B9AtY9Q zV7orYngJ4=UtRLsgJm@i+`YNuaC48U6|0(mCPw)@8+kx7>f|YxWS9)Ss-QB5k*X9+ z%#aeLzB`oHnurZQtE*sw#5r^VR#U{`w9@*B(vR*QeoSgdo+MW){4BAk>6|D2=n4zI5pLF3dDtx6hgm^Qpo z8mA@M`t;>D* z5-KZ&n)4&>OAvnV;VqkMt3^cUe9zE(tkI+#NlFuHA*Vowc$1!frN&(AsUJ=?Q^Zt!U9QK>TTj}(=7m>;k$=(s-|3CD@;II!(j3@AQ& za?bjrue1B?Gk*Q)$Ebe9*ec7VLyy;;Lm^W_xQj5xBtlB{_H0_>?gkUaL+ft{~MIvV(P-$8|K+CD9_5T*$;(7(c}^- zeUDB(U9UkGj1y#-N`~VSd6;JI4ioz&kW-mOWle*FQjUVq8m{+|7D&v8C*cXz|Izhig2#iyA;7m9KO3WuCI zrot36u?oTFZhymaG`QPm!~qVKoRvWpn(3~hZN=JzCgZH5GX|&R{+BE0 zB2GQ0z{}$ob4)CUdtQI>Ich%QbRii<$P$L?aTv4=FsdBXH)jKVuSrJYe=8F?bCvT! z8jUqWuMOV27Bs7mbefb!Ga#Py@*a8T{XnrK?^RKc4NZkC07N07Fse56u*PUf!PmBk z@TTCk!4FQ06%S07-;3yc}jRikS~dCgoSr7V1~GF(4>LC%`vaiN%m zr4r{oT6J7sZn;=@JbQV?#mh_HJ{+kmOw&E{w8Q#y>XJ~*q!i`3&}dXDZLuRdl@KGl zyEojtdBu9{Nf#r7_pHvhD8Fvcz4HAjviKh}l$e>PBgDX}>mXJ3@jy}*-FHHuFdpqX z{J16Sftxq?gt@YP`V{3W=TD#W`t=^A45cU@jte*UJ01=*%0sU!t6^lEBX>79+`PTz z^_yF!5I8IWt%WdKaG2Ks03ZNKL_t)iwE<;FB<_zBZ{EJ;a%~_F>~@)_PtUl1enq!E zV!3Gdf&BXqT-92xBT7De#+C%&@GF&_^Ld9 zXuqOVL!w}eTpx51JZB)uf#88ah94NJl>X z@}8U*zVWrEJik6i#Y~qKYqda{3CD`_1FBY5UC-tAjD(`!tg)`6PZei;bB?ypeg|oII&kD3PsqJl(7bK2t-Fspriz5-2%9%~+%9drLp8 zsK7i2p+__abPSOxNoeEQRmbMyg7xMKz6_+f<81w$?b#Dzt)v>Ly~9^@1?D4*Xl zf4K1c@+mJrEQHzMHY>WzOWf*=Ib?J-yuAK^Z9kA>;?40bu>_tyzht=B;y2HDzP;df z7*OS27EEEmb)C>(6zmTNs;em1327lkrX>?bN3KdVWhXM2q)>%|)EIL(|o^QSUfIs_x|CImmM}NZp{tjhUbhdE$v7XNPMy!ZT$32JrJ;wHw zoJ5DGb09CVP3G#Qffr6I!eyOd68E|D|Uwm=EdWzXXtyTR9Ow4 z%{bzmB_}!KXf0>qQfmu7%Z$bO9;Cw3RrC%yF;LaJ68RIHw#`_7A)wD(}9(N z!4KT2ipdk5sjNIC)nQD=*Yem>7w>k11UDt6Dg|Q_Nw<)Hd!GuuL8FLR3Tr39uaGj% zC<#*~$+}GiL*i&4etD$YO4#4hllYzQ zev_U^RG|FGIC#A6uzo~4hqIbt=%BM)JbB9bX3hHY2~haA|N8g%>;LuNb72--*>kg8 zhytW2P);bSRgq&Q}{rt9pp*M5~VQ5fNt*V)2uDWBpQXJ(FwB3lsU2FNXUs}Scpl!c7L21ttaG+ zDglMGt*uqkptX+9_T=6%G7y(Qj-rgwRR|_lNkL5&p^N2MYFb_6MOPJ46jDx#vSbeuB8*wE+_e#xla?Y|F^Z+6rtT>?+lZG%!Ug42 z;B2MKlVY{1D#3%MQmySeVYJ-eQ_*dnuUpVW&IYO}g>sc(&m0!8TJZnY$_}VhvI5tf z@~Ku*t}WCdbFUmDvB(Hit13Uorbw9QMJP=B9m{g$=3(Y_d?2M;_74*wCSs75e<_iyBn0BKP)QU@ zNTC?qY7L#^^7$3rc8k$HF~TQr5B%b@2Y&VOKcWt|q=y?K_gp@C#@*eXm@_Faq!cA6 zU7hR)Nu)T-UP618lu;5cQkvR8Oh$5!o}wsXoK_?Xn1SOGfv4Or4_F0koMT?1Jv_fPTGZI_$X`&w2jj8@RYojp&(*O3X?0%!N+wAqAFWD}t9Iim4VDIoob| zesRri-f@_#JU{IxRLtlC&Nz&g0&7l{IR)9DnT10xphW>V_8q=+ZEh;z)LNT5C1px3 zs9Y&a;1GAjIWmQS74LeF@rq%6WW7CyEX|L@@xXDGn*#4Sk{+A&@9&e|Th^p8PSJ505Pw35RT zHOrDYMsmsMtf4Lq*Jc~uIHJkTr`C{ewJ8Y@$7ilkQzq9a%h+hp(O^_&Rt2jq8vSlD zr8LHfqajzYu9Ib#by(}6DvZ(;Ylz;7qf@uPf2mM2sb)wSYh-v?HDE2{#Z%6n95~$X zczr+f`4@YJMMLjM$HbBoyJNwq9%lzO;~CdapW`pLEH!e>5p4`kS(2*Mc2H8e;H{G( z>}e5|7IDa=%n}lP*I^7?U!3v7?|+wh+EI3Ubngfy5Yt3nCZ50ii09w=4s5sWy)G&1 z$5eTdhI6fz!||S*+qdL-k_A`XIyMOsuY&6aF}QEl8G@B zY9^-uIiPC9T4_Fy#^8(aS3^q7^Bt?+^Yr3^zV}#DaSnPX2kETkVWdeE8Xnw8O9k=t zIBQWQkmdw&#?(bpiAsr!rpS9rYemVq5j7;tF&%fje)TD5S5L6xNXi-O4XVc0q7#hr zs(MDF=v2We!SBRa(YS_8Q4O(Izq%$pEt*drc`eEX-4KPU;qj#v+R~$~1+N=nLk@QJ zpUc~2>Dt~m*2u6#{%55*QPrc*h<8`JcZ=@#UG2zV<7&Y6q=ZNtj7S3Av(z$ps^+9!VlTy3OCci0|hU$L^}S_xrI{?t zS8V|;M0L8xtN)*^H|volJJ0o=HAX}ZHCOGSckiAkl1=f*#}Y_OfPD-YHhgQqxBdl`;W~JfmPa*I`CjyYwB{-GkvP6r-}Q%Q&mM{Y0hIsPxbYCT=X(k}kCOP! zEw35^Ryr1ireYq__wt!8d;EHB_kUf#UwN>vLTF@}qFSGNX{h6em#@)QqXrFL5w<&S zZtlo^&&kCZ!)i$#Ghug+bs95hjt3tu-(Z) zw^r$KudN$?|6)rP5`fkUXSEDlve87L1z%=-qban0M`Oq-%0Z&aVyHCYg;j-&q*HSW z%+ts)IE>XOs|Y2LYLU7^s|jObx0~3dK$%CpxA?B1k#Z7b*_p5Ilj{VH(`2|Nu$E;TetXB(;4h~r? zML2kJaYENQj*bplFBh1umxr)fG*|J^I1_Ut`2eBda%CHLlH}2voD19C4yvN>2I=WC zmM4o9>Ewc&n+-QPaMmq|)0VG)H!}DIho?vQX~)UoifMPt-Q5k#u16cq9CrjF{i@^Q z`5CK~p~Ni)OYfl8KrS=4@4w}{uYQdl6Tg^7YS{7ZvRuxI z-g{0@&N(}KhINi%Sa5iJ%5ZQ%*DqKuSM-C&bzrlH7&+(+Rtf5|R#~vkWhCav7)G?J z9Ip?UjHGgc*63X&RYO*mSQ8;7S!xtTm?w(XIBg{@*pdfMTb6cUZI_%M9^tx$IE?kk zVvsJYTncI2lB#|%KkU2XN{Ga1Buo=?*R|>bhr&>@CeN8npt?d-k%f&Iy-&fFCcrqf zHh7)IPj9q{!rsclsLZ4+*j}ZjBUL3aELv?@bdII7EWKr%GhSEFMivnB9XD^UiI;|d z{O7N^yqoBhrp_bQI?KnF=rtdlt!i^XDMU`Y7 z3b3*O(YBzKpkQk=4%g-)QMHhYBs)s2%sF$lx#OGHuOVz%_a0nNNLkE|ZrO+iFjp8b z(xtc-fF3D ziX%CVdnH09%-Mwddbb#}+K%B=d zHOzt;w-$}mnn2|K_J-Hrea-IflCy)4SvbeSJIrdqm?aIR5DJZ=_2?ELW?~cUjgq+m z<3Kl4#599<++JU^xxK?{%fbmpd*KYpR-84Q9j#e9O`a!oE-aUx&N;fHbB+d&=@z(t z#d2Ly+M|poq={4|(URNzS+L^2wH%%j=S+c#IIXzlnOviSN7&l<`78?R8J6S3j z2pOUFXt9anJC|p0_bdOaI=e%IWRb;vLSbxFS?>2n* z^>4YpxxyQZULUl6)R|NRIaZ1`GSioe_lhUyhs4>T(@Y&T*2k^Sm5;?iMpstgIF8&H#!q;zq&$qXC96f!)(UTXPt{v;uv6$tx!F68J zRaC0gRBH&WB1^ZWaH)d+Ey|#*q*YU^@5_6ft@;qWs4eZ2OP0@F$}LR|CCi=$Wub@x zeb2IrDKV!?t_DoO^gWvpSxlM3Q_aE3@{^x@%FqA&&oCvC;*9S--gy$1-gm@sN3IpJ znB5kO1*_Fc2vNXhv*G&Ymb?2AVg_Z%MPt3Z53yva@yS(|{)J}PNs_!vg_2DCBq+|mlwc)_}TeW#6}LK}gzRC(^H zMp@HJ;f!wAm2R_Tn_ZjWRI-Ew_F)`JE;gjH6{=s=3g20VDn0R~2qnmR$XXJZ+i_-0 zit0N|-;t{#Och-mCc)BqRzu%Zq&a#UdCzR66^Mo;ypquBwJWec^OOB6^IXXGw`0SJ?Po6L=7yQRR_dNZ- z&iS|h>;KGkNqqk0=S=q%=NyY}VA&^3t*ES_xJH^2%&fOPgnPnR(b?mT#^cet;k!1CH;W=1))=Fc_Bq1j6u|_rAd=lh! zfho*XYx(T6=N$V3-hX$6j*+8&;C8&?AHVsA%W2C;pMQ#W29;-)stU0r1&mQFS8Kdl zve|Bk1~O|bJ*#fX(P3fPTi$=W;j3SNO|_A6dIz1N6u8-K`1+rI!N2{>|AV)0@6oQu zTEPV?1y)1N@!`Iks3>t@qKla4Y7Xr)Da5{FT4fWN&RZ6XiY77d?g*2Jo2rT_f42*y z3}%{%<4%&<);$DhjQ3b=F%{O+hWFz=)(xzWPf6Rt+0&0(B}NtFmNqEYx3EjWJ83+q zDUfr3-7WM-lo05D6F94J~*vZfZ%CTec=A2|!XGA0rkiSNnt!7GimPE1^5M=8>a zUXl<;biORjZa&q?DNFnK5K)EVydW2F5TGa>8jtt}+jmIZ;9)&q=Py z5QrrcLlSdDL5u|z=9Gys5GE*96B@B~;gh_MEFl`>HEUZ?xnq~$KF#b(CY6HIN)p-y zQniE}(as8yxCl9>7P{d`> z5NuU`xu}K}FY-PhwPV@{Jw}X%nkluU{5}ra%yg~o5~C$SUy}&;-dK#Wgg2}Q&xsekBrMx5 za!(R9@}(R3RjIw`+lZ{K{zP`U56kkluT>9qvlQ8jmy}Uf%o9dyvUBpJj-l;DvjlP5 z=U$Zx7O7!X1xgluODlXgus%KK==?bc$LDklsqZ*8;7pshLgf1To>#A4algIces@RC zg>jnE+A)VnjFJ>DHKDbHcCe;}$PDZCG2SP3VZ^N#gu59QhMI)1;tx(q{tdTxTSh$3 zpS;8$KZE>^JWZ4mAO$deqp~ElN~o?URLJ7AzMNyK_%pR&^tC%%Z+pACv%4w#Yab7B0D30~&6wJu_#NbQB28ZHU z=4q4Y!cK@vqY`SxqOkA_HoM3!MB+jSt09hT#}QNpT?x5xn>D#VU^i#xT>0C-`w#r+ zhflfv^?%@3fBiSiU%%$|?v~!&JmlzE|K#j9`M^XBb$yn6eJ2n@Yk$30fd%C_O zhsqRZa@E8N${MWKSkrUh4^WF9J>D|Eenou$Epgro8BX^oH&Ex1-Q9cg4i?VPRYlc8 zCalAf9*++Ry|YYtaWVOI2pU8&+9FWxY>4 zN}prhD>+qv&|eho0k-d1R;>fkVT{7)ECcJKmT2`T@ujtT5L2W(S2eeA>lstcSz+|| zgqzwPgta1FJq=?*OigIj4eirzrmEquYjbe5uaT>ye<^~%cgA6Q8MJq4CXFLiS5E7a z^>U!|o}wU@DyUtZS(_g1J;n&)wNx3f=O8E^r79^)^4TbHg;Kz3K?zslhiU^Y33{bW z6Q4B7=!ZjsYEJ6C1HURqZi!uF^u-`9{end`giApNW}S;H#H$hqVE%xvuJr>zoQAQ( zDs+3$q?E+#1Yeihqp(&&*kSvQlU2{p|M#zQa+j+~ow{NJW^7Q!& zmPf~6EhWh^*U&nxo1ZOeO;j-LChqSxs2rpp872KZRT0v}c6-gcx0>yENj6%bGbU1U zz&OF{gb)Ssnz9`JO2Vij29K;6tf616VX;KVO%s=anov5TbfV-*@Np$J!;1{$xypcG zj7K^1uxu`>5XLRHF*eshot($;ic(n4FzSr6+E%7t-oBZIh`AFD$DmT z`&#*$#4(zrSC73z5!*iRs+oCq7+qxPhj}pc(2z&<5ib8j+j_g+YH0=~>DEVz=9p?jm!|Sd%fX$9XS{5p)|oMC>+3 zW372`2CF8Z%rOe@re>@)^xm*=7UvwsSr)4$#yJj8PFO4#tPT%xoyS;*_Z@w|_$4j;^6EBcmMJoZ(ejG;DC4U6}R)qZs)kX ze9!vmgoD$k%t9Re=i(mbQ(O90me8E@muX*#;H{9Ld z5_Ve#JX<>xu}qs&zW&u$#LbqA7cbFfpyDAbtexq7WLS3et5pMJ#I^`54_JJfqqvs6 zFsZSv8#1Siu?k9L;WeLs{F2p^C;aNyzhT_mb942U_wT;r>GO~9t2KUo$kEX`3B$0t zXLGkDQb}I!!nPk!rUzx1#)()GX`Wbk%^!XIoEJ}ySS{Cd-qW{~m2(yi7`Y*`sR^9~ zQ9Di7P-arBEqEZ8OfIrWkS@?jO_90~ zTw=vgGSpnLUeOs)CSuBnC8FwtRT*s!x*9nnYmG8OSTV-Y`3|LFnnrOF?@dfeQH!P) zO-WfQFti}UvQqeAz?h8o3&xPRe1A(A@3@_2{^noa@yp+RN2e`>NbfrehL|&}g99=h zo$L7I#f-C#epqm`3xbMuJ=O~r9_3oiMx#f?f_53>v>1$lBFO{;{ckIZmF1S_rgrIgxc5$R_%Mp263B2x}jEXH-x7uq@j*g*;c` zullS203ZNKL_t&z*Or$TXZ-vpKjQ4;msIOXNnF}wNrCOAf%`?zlnZgL+=q#}o9K0B zo_2)I%6lLXX?=3hH z2+$rE1LM5Gt`o*CWmbxX&UV<~NP6tv2cH0&HjNze9Xwm%Iafa6mbV_|W0L4R~X%!xYh7^)+tdk)v0^V21BkYdWtSk8w^IkZ>@ z2Ww5&MGTR_7QFB2-N3usJ8q^8Z*Q-7{`MI^n195nD)^zp`A+6`h)Vmfol)8102d^sup9FXang1(YxPYRODHg3lH?J7$e>qdES*mO^GzkXw#wH zf=^z4Dm4+)7R*4#F!-nRoyPe)!Yq52v^T>kP0E2eOc<*%rlPfbFv*r8&mnD$B-GHv zlGuep9}+{?OsG{8OJRG@SDV>^qp8nf)^){0cNSZ%1v5o(}z9VvGlc8&#>(`Ao$p3Pjyy=K%iC13H$=or=~ zte(8&Xy`aN7#Nl-p%RV;R}AaLg7nh1Aqc=y|Hn0A$2+0d;|7*si%)5~= zZlv}z1h#1wGY8Ol3+n}a-${D4WX3SD99AsXD^AbPI6psQdAMSAaVAN-Jo8`um;Z)* zcg5fS<^RI&_L3LRKIfyS=j`5pjdK>J)~rw!MYj~KHWcHT$3(af42v`RZo&JTk(?Dv zYtgzghSE|n z$NcLbf5OGlQ{Fti;r2Q(g_#l~zkBtXJb2RkOAd}!*c^F#ea%7dg?Km4oUIRW$q?eq zE>0-hV|q_#J+_QEr8qo4h7_H9e}psxv%$a!$U|#57Y%=H%pvo9i2rHbRJ05K@&LV3n|7RFWpo zQ$o4KYGH*~=@;zg!tMRYiE$`nP)W7@U1>BD*~7&~t|_JMA(cVpN{va<*rl>`g%}b! z7gQ8lZ`F#JH8E&Xt7e?0jENJ@NkAy)OvssO3v-xQ_8ooSq5XoxW0}cQDeUHeij^EB zOf=QPCI><_OtnaQy2yPTB|Dy2GB!nGsqC`QZmlkOqsT3kG}xY@Q`mKf(v?sqra86w zEK_PgRS98frNqdlTTKiinj4%@FpLtTv{x*;9{sRot@vCpsy1pxCP%4f6N#o$bZx;) zxi(5OX(viER97)hRH^9G*0j(-Ggs^Kh*&EB7;B|&pb^ew*3K=&V=&r0kW`gvpwveF zR7(CgqeZkIx*p>UDdiR@YV>AfP{zvVAw!M1y)I3RnTbNwmFyJBYO*A(z9-P9lu*i1 z&~0zq4B?HKsvc8R_Yd`RB{%*XaDThogo#e1(36&=ytyEh(U}SbBI`1vECxTdWE(|D!*m87X-fE zQ^DoBmNpc5pL4EQCB{sz4N5n%Z%vJ~TP5~hAcjgV8lMBqni`Or3vUTnlD6P1bJ?Q1 zBZ5hIE!042Vn%bDD|Kg>7LH_L8b@xg-ZI`hZu=$UT)7+ryAV*-b2}Nr)t3M9fB2s` zvYA5z@m@0IM>`u!cRUtMx_b%VBGI*ZaB+AgReVpU5m)<pws}%LkX1AZ-meMq`vD;`i!QRU#@{ zBPbB7wDjE>(-1sGXv5{Pm?T4vX)Y;2W~T?dzpgD=Rq{g$Ql7n;qLp;Z?E8;f?}x&) zjv9lt4y+|-5!N1(p6Y|ZrSyZk)T#pZ8dAgj8-wY4=_ns3-rsN0MKQRZ!5cwNsY*6L zNpvb;-CnR)6lFnsj8V)%w?t?pXF+I75?-)cs-zFt?k3b5ZDr`wwmGX!>vERKd~a6x zkX%*Gxz*h2Mx3gpx!H`-tw2!8WM~ZPk>;nH0YEo*_5;a9Nf(+#R>KxBT|iYYtaSPM(~xK3t+}#i1#xxtx(MnbNwAY41+~=~>kx zJXqugT+pPD@Y?X=$rGMEf62l6n13Jd_}wr6hP2)B?BtB)(JAzOyHTe`8_ZCWIIdgI z%$y;`hLKODxg2%-xgE6@w%Z+VUPsj1M?{EPF{P4KVXP4yDm5#d5%*8kmaN2zp@Zgp zv0~)}t(~calIWABj5{iUzBep;kExlQ9|@jCP;RjelR6b@k%M3?;v`KCHDsIUUXe80 zUPP@e6{nS@vleN&b=c~$)lhOFVllcCSLyB+lLAIp3Nv%r5o{!RN%wXp<5ZNzkOJTC z1-S|OsQQouFs+BtwEi(v>mI7=0h=z=#N1M{`;=a37+X2i86~OelnaFj*?^Hs0@Q~N zXZ1+))DQR3W^gFwL3pk$!IGPqsgflfT-E;UL}ibM|8U^i_q*?tEOq|_JQQ{CJ>k5v z?-#5OV)CADubaSKz9*Qs*ZoMee+b+>>Sp}DcCWrqAwWN*=l7kT54XX+lwUtY&FlW} zi`}%L>Gr0q?>WC7$NwMxg?f}&+*3l-_c8dDKOiMM^wpO?Ncw-E3W!Idl97AAQi7t} z_fYM-xr=)A^m_ED`H<^Z54AA5b=T97Nyd4!6=d$^?H$+Gceny!o-uw#nS#e*dk3~+ z$%JvsZ-4QR_|Ee5`4f%~j2bA*|=f#Lr3t7q1K{pbC)&^Cbm^iAK z5qP+S1nU)Z1TCr4R28u*=3JR(abgQDyD-JVoa7mnmGqsJs@ZHt^r#6jGR~2Ni2Ws0 zO48ta!5lhpiypiqAPJXhy=2#8qBjaZ^mN03?>an^RJO~R#W1j5tvEkD;rQr?lcOUJ zRx1wHYfev2S*%wapP!>DbVtXsa1N2(c7rB!aBxhwTD6ZrfZRm-TBK{P7U_trvV5e9 z8IO`tRY*3*8*y$HIX`G6y_v>YvQ_MMGxysY!hA=LBd;&7aBhQh*KA32LuNN#@%mNe z$-yzkbnNDlufO^gpTGQsFP=Ri?e2K}?ut?!%RUnBH~cza#WqT zd-Imx{QW<0=nVhafBWC?=5ouw```W@-D1TbpRO3J;ay&F9~0wFke2UWzvtrg1mE|B z)Xq{?Q)=Y)=7!DPz0h-t5-)>qW~OG&kyK$3JbuF<*2)8UC#NK-xy6bvzW5P;`m=w- z-~H7;@#g9k@qWiwms{5FZh8LkC!Ag=wsk@3BCFNFs69oCyVRIwLNbn6VG5EGG|sW| z9_Lzjm;z@d;U?E)p`^@imO(M?MmC$7m;>W{T=8{+| z{qmSp3qN?iWOa1Gt9j)5YAb!$b>e6+eE!8}JbnHVH#fI@^}Da-9NYE8EZDDw&uq4t z9B-IXA(n)8V2}Ynr!1YdwwV@-U}Zz9QdLx@8kSqDWWa-HdIz^DloH&AE1 zGjgVG_vPAf@U;oWrN9_RVjN}Q*P5K;{N`Q)8iwaKe^!L%a3>)Do%HFUO~5J zlXhI+B{o-Eva%d3E;v1|++1Bj4CEZ~UFFHe5sTv!-i$|#(ctYs=PD=1r)0aJ>j(VM zW2}}1vvqsKiagV_VB~EvVD<*F0;LMYBZ-^5(;AE5zP(O(Ge{4lHl$i{B{$QOpbGb0 zHd-qo4j4^mE!u*1(w(dtm8Di5&I!3KQ%j?0)raaX(^CH}ky#X}RKeF5S^P`4tt4ZW zvlwU42{5)Ti7mT1GR4e+>gB9lD|HH(S_q}E36c9TLecaqi|v;5{elvc7^gyzdsePu zfU=I|a!sE`wq6rT!MM!4x#artlAD`bPM>{DQI2dizVF4Tm=v#Gzhkov?X2JWo4p~V zncsi=d)~i(&E0k;X+vI!8<{9D3=#HhGH=nh@^E zOEBK0mwQ`H3fH&B1y_oOi?+C^d3_ca14C zADygu`CtDR=#v-3?T!~0XZX%SO}u-3&4E#zScM|9(T-hG6or_;tl{2R`8-W`baBIw zE1f<=nSqchG0g3dC+3``cdV>pyt|>RhNs78RA3kG>5PzhO373$;$y8)ozy>>s&Eb2 zXlKYdG}=dcm|06y6jc!#yBMXFwyi%j00S}1ynBDcyQSy&qjSzL&WJaO-TemN^%$p! zA=5brWKxX~M>gBc#>{dbsF|aqQ;rXg=(+_*{f2V5;IKO;gbKMAEUB58RHjr(_*&az zZQyi`(5SmWB_SxgJLDmtezsp6cbGNVz1-97U*G8V-&AV~Nx{mE`i|aMxykj@r(-|wmaV;dI z1GdD>qU&)=5w~}+y%z#gOmdd=j-oVUjO^mfG9~=5z9nMOKLMer|ilSxS&L&Y+mN~FWlDFzkI-gA@tBkg=xtr+5zz;tC zlz;u@m#my)zLVM@Lq=(ba}L|}5A%j{R%TEPzx>rNIDY;)pMLQ}l=E~$&++Lw7Z*=J z8CiJOLP?>S4>GkRtk&pSWT{Z3zdDs7u>z&V*kH97KDFTDixz`eOp4AJhQ$g~3ToP6 zyMV7fCQB-xJ?cCKRFwsLElyI$^NiLS@4pz$Tf3)bH~%w6P)v0US9J5{Po|kd-n~y>wCOe5z;lodScG6`0kr;n6@*e z6s9oA`>QoIX2$J3szh|2S(r*^4LUj|Ghm%#4uNqT>4%Pkg99&tDPWaUbD|xkz&uXm4JcEJg15+S6Sa+FFWI;Q!agOy{kT#>Hs8FwRxYl}98-MnL}0jp!I%zE9VInrVzPLfe_jbXqt)hmX5^1dQHkB*V7hdJl1z83gak5%%xdVI_R97 z?P`9sPtlrKDxJ3b2!jZBcHbqP(W&6OCIYsK8rycoMQi3ckwPSeB=^EnAtn0G^4W`L z{OpU5SRFs(=Rf-k-o3u%FaP~ta{u-_eDQ=`L|0APWopTEt3y(qsVQ(cbQo=!>WofR z&d|1yZ6MS@m@>E1HM$@8__I$rSX^-P<`p^J^3jtQ96tS+diI85rM0hA#XL_;Xi6hm zrg_90+r-cereaOO8z(zC64qwYEVT~02CAxf3k#=MS;OER>%lRX%AjXX4tsw5)1UCe zKlwSYuM1}PS8PVds0|5=u@;IU+{19V=IPT@j$`0vlhKo>j>ufsK`|K{J8GU~XIL^? ziBP6%5)w^C@b0;^#ZqSN6$f3#Zf8QBNhGS409YYEVA-j19jZ)whH7e%dtqq;tkCKu-R-^vB#nUe0;El?&Ak+Lwo9{Zh~~NA96;uu}_tpEvgYx zh_RMh;zJNrHTp&ogpthnsbalu71LU<^two@w<>B)=$4Qd0}+HdQH+<_vdD~C)t>VC z{h-xDpyHvnt^N0Yf7$k#T8VLQA4)1kUWZZ!-FD;kp+>cQfGZZMLEP_s&_WtotX3SK zKjrA;8LQ)Sj9(B_r9=t%Tq%#%LIr$#yW#cKEw}ggIGaHw5ll5GlN(J+68)v^Ru{Tw zDv2?SkSBJxmPI#G?l)X-?>Jj@+-{FKI6lQW#oAiFI6q-U=I!kgv-t+*kxm!7_I||N zuB#*jpPVx>i3wkRLk?%G1d5pDt!(t`s%Ugwsj8L0iVz)Yk$qxm1n;U0+GRjYOY#{_ zC>**OpdV@(kg$}qqVtVmq7q5k3t=%!-9ikRQYNsLm?6~6;Cn)yFuo)A9Z738b!MY) zSj3rJm&~STQ(!h7Gm790c!M{Vp)LuVJ6wz`ddFQ*sH2bBct_F`rD|dt$hzmr@def| z$O-!6uF zC#gZV9;Ga)AT=MmNDQJ&#Nvp`WAGF_wHneW1Vvji^Jd3Yd@I*R+;RE#J+Hrg!~2_C zaEjHz0za%#0uU5Bm1;sc8H_Rv{eW4l7&ZZCJG6FaT|hfDikxG^Z16~ct{*b=5531N zar#)-r-Eup(w6wFNS`_-U|M&E;Dt3xw*`VWa!53ia&lJEcScKZO4%>lLnb%GPJM`l zf4`Es6uH3)%IibNHIzosG7s+avagul|4a?Fmx}a88|$dbQfq8~M2n-H$0mmMb2gDN zS1}5RgGqjVV=djVB%s;d-Ep;@8Ttuj9oj1J4d9&;)du-Kt)4(DamRbN#=A}sw>l6) z5ImgLXk*(Ax82f}3{OfsjCNQf>BK!Y9Q6Ukv&Y7$)+=51&a%C`OzmT@O*AX@L$X$$ zP!E5{Hn*2864Zcg0ZZ`o`&tPTzut_r3&b8~;s>-X>2 z++3k@;OY4(>ysl?=h3N>s-_r&su@F+4vQiWC)3hRk`NGjLv6UA7!yS+@FL!M+wtPX z3x4(&f6m>_8-D-(isR!8UjF!xF&9s%^OiczXg`SAAtvei)0$Wlg^YI{L%(E7i5Nz5 z%_wc#-Fq%Lk!8DTu0KvLweSlDw^m>(UrQuc6xf(Bq!kQsM(?LmpNJgEFoE zJ8PT~Azc|6^t3hbKzon_L@AY&3OUN5%o;1s*Gj|ms7C_)hlIIqg7k;u57Z<}FIvCQ z9$migaLPsK2C6L^VvMqMQ_}HW+F`E($|-a)@;XZ6OEkesHC%daNxJgA1LLE9_$tPW zqUt_J-(LS7mEV4*Hek#Bv5Co#kou(|3;%#yBG*n8hoHE=bNgC*yy5qI>mLi^`VqSQ zLt1~|eIiDdha34H@B?Vqt=v58_l5RH>Guz!x_M1F#Oc{b zIOjluat zZ>=nmT)XFJ(}uf7gs9Scb$|7)(Hkmd+6Vy2KsLWpwz*#S_p}e))3QvdB&x1d)4IrV zkIq^?ttygzl0$hGce1mc45eX*Zn(cWXKu%PIt{y;P&sjYa7f=Tm_nk{hM`*!L*ie4 z_cc$SKjV+S_!0c>w_Lw_M_(1(-0(hZ@qNMc$nuMbx0bi>-to`B_*+a#{Pd51%ISK= zxBv1DE1g+i9P=0d(N8%4=p)|eCEvWgQK!gdb75YfNydvc1XQs}G`FQSVH(-Z6H|=LX(ZG@?>jWGS`64~A<5D#OgrXrWE*F0#|>p#a`NLZ z`N4nsXM7tYZ@0gph8d?ue)!3!{OF4(q?*Wm;`wRMupBr!KW9#bZ@+y@7_Ycd7PDAV zwVYoTeUEmEq4Q{^ndTXznh0^EkTDvx$ylA}ZD3A2V%%VRg(-m= zXGzUFE7#b*cBP%wLr9D|3N0#T#&IHqStu0IL6v$6isjo)fr?yqln{^B`@rzaepu6g~fE4|YD zX1BWCoc`bd1VJ)eD>K!VszPB^*j26zUpUIQekebJAHWg5cZ6?j%N3zj^spihzX_xQ$rE6RA;!l5nQK{bk;sa8lw`*LEf8|Rq+SwL$XSj zfz$qc5mQ2|MDUV44s{u3Dp{SRX;=)S`)5u_up1`s9|x2cBtJ1R`9N}sq#YX%>uAxY zA$G@9izDi~#h98f>?9?UGr4rDYBgaU;98EtM5bn-X5H3I-7O~lJC;L&)5$ADQ$PZ3bdWwDlQ&&^$47UVipl zrp<;|udh+nk`Mx$&5C|=&*vvCi@Ij$0}rF(o7I-?5W$*@X|5j3x{R%&Be zm_6gHJ>%ROG!4tgmjk){b<)wERw zMtUb>nq;4&k#r_XdVQN3H$&Z4wpoFcD{1xL%8=sijqw&RX(u5YN?n(uw@1&gyYK^^ZVY#7mD z#7T})hzMCsFuoYAhq0$^YhoDb+8JJJT31nZGma{$n9xd4-$w1JK|*2a`$3EhDdC(V zMInz&!;YLH=Uqip86L-x<_Av*uH*8wLv<}GP1u|W!^AKq?nj8-2}8ePRGR5_%gkA} zqsC5fd+S+0fSFe!98go)jz!bZ=vT~VCwz4Af;QKD^XV7(Nu#r3F`IL`JmK`@6jd9J zk4`Yg9L&;^)=|`2u%WH9ESieWiJ-X0r3N4H-ph9%Bf$%~LnoPGgqTFUB@f$MxhBSJTPFO4Td@)Xp{g&T;`2}xpdM-{b z!8yj@4;4@3$mf6m5B$R~e#xKw*?+~=i%%dX{C0=dt^^{)5GPe<`!hg#hvO=SDpJNM zg)51CbVX85&fj?|#$g9(MCXxlSWzu5@XD|mww%?8N(II=(KQXG;Dcj!#37KTp4v6o z#-Ni3Qz=OQYf9i;gSJ2~!bl7rofAGM#vBPb$iysorp=mhvw}E5@&qrq+bTwI23H$~ zU8bw&tot<^Rq^p3{V8FJy!_SA$h%iG7Qz@+jZ%+4yI++~ou zwPHHYIigZJIMR)Y=>4QdzpF0GhkD6`EobV=X-VsAsamM4V>vsbX=aQVDrcE5J9?iP zbE27_&^Se#6D}E=`3cjeXWQ?naCkowvg73Bn2&YMY&l~JJvuqMs>9V4kLxY|tCy^& z45R0lyGO$62IUiBxFh5hO}An^u%$XwVJkeV(7>sYMB@q zLqcoIa(+bPDpuYz^a^LCDpMPog`_Z%ai_NL$Np z8u{htzhN9k{;a9FUq5nl|Atvt^ZoC9f;l-xCCk-EKfwRRoG)L!=EDzblvm@^p5QB_mb9o=jx2A{1|pG;+*gq9hCRt94&Aty0F zr&#JG%dHeMwlY|4$zg&JG0Ko*AWRcs90_A0MX3-`A+hY{e6Vc!qd)r>=*1I;o#M#W zY`*!18`se#2ZKjxhjLcX?m9D@cleEm0Lo_kG|{w`Ttj*yRj`>LZznph=$=*(H|#dA znb{r7c*Ew)zvkxG|BkEqCDqePQou-nB}WldW1d5yb&vvzNYxr@V>mW}cG_V~j}Kl< z^mQ(M?FKhYjCVbcbHgwH;qQ6a8g>t_uxjAV+t=LOuc_*D5{hUYNjX9+0;5l$74vSv zi{~E_NW8sU)75QBT+3cQMyXqPpZ+L&kK~ALuj29E8)j4+|7S$ld^C%5ce#fu5dJ2^~2n ziO_{8WV;ymbOx!!Ny-S4KP9FhI)pNYh@3I2Y~@*CELkZgA0Px!vQOM?Cv=pq=Bd19 zXEhj$F-~T~h325GrK%j(YMfR$64qykfnX#JACr(>rt&LfY}SMrNm}-sF=Yaoun(>w zYojXkV2ar#@1B(#`PDzwT-+E<&s zS92;Id1O!#ldEV8u%KldLCR4=r5?nomRTYMe)dr(sd{6t?zmJ$8 zMSU>2qm6`^w9uJn%TwmZr`Wb5Bt;G-*^d$;i2{`pyX}r))3aOkMVEeV4$ z6*)$xendy9;7qB-1F@3Y%{cZ5f;A*TmLg!ob2TIBqJ;$q7WyHn;NH zD@!tk)@MX_j2XEn!hl5|jAGVWtWFRIB8`|mmBM6$lL4m85sfL;R9ZgI5Ya{v^Mtmb zTxRYANo%}zY=Rfc#}HX|LRKX!nyMy@5|nQ12CqGX+S0U+TFpp7Q6pO~xcpUJ+FyPXo)Y;?zc#x~DY*dT!|4oVqexo?r0f@+s4h*ll|r?{4v- zN2`EqXUub^rQ$A61cY8=oI^WJ*R`~D$D*F0QzrC1+qEKEi*XfOANl6~5kHP>d_p&K z7Pb;SAP#JO!Y;PVo(96O!Pyqy2Z)Kv%{V`P!i%%#d~*H~>2U+&BaL<}DDmRAsfpPTd}f#en{8x_$QjpZ zx_KuxTOo72-Qag?rqN5?rD;i}ifim8D6O&~WXsyauo=-ih^Chrt8K(^Q&r>#&o}-N znw_{QVLar6YX-q6AHMK{_YY_}f z`ZVS}h6GeDJ=#e_Qinbwlys)+gC?dirlM*!(I+-T&o`?TlY*l~M_V}v@`r z_d|ObZfLCwCM6eLPkvvh1jTP^|3=|^;8&a;b90Y%ZuBhq`V{3d&q&T8- z!YBwuB+W+iI1Sw2ZD_UT^UuHL*^_6?FV5us_WLQSGS;8DokO0qNPXNE$&I zL((z?QT<4r4ApGL&Ef>FG^giF{`v2JkEfT%@UTPK4x=65C8_ILbdn9Z4v%!E=XiO- z>i&+$$2&rb7@K9$!IPC-|7eHR;$jqMstn00YiJsWs~W0qfvRdbjD;Q_BE~~cMjI>l zYr#3EZ16rXPU1GSRV9>$1QtODDr2xp;dG|TH8H0{a$J`R2b4ItVtD7g3qi#1v_}l( zEQ3Gou&Tynx&9ZkIkm0i01_h=GRz*wfe<}9O3&AnCqYK}Sd1H4zPm)}_KojlsPm!n zqDb4AlB^6qFfs^QEX6{ZfGLTvlj2_G6$H2U;%Js(lDyZHgDiR3U~MkKdD&F$QQ7;x z@`DqR!{@-akobG@#yd&{O1+1uFPLBTZ8OY)+@a*4pZ8JrLSER9OmcZ$DTT786=Q?m z-%kf{{XdyL=lwy~I~AJu7ju=RbN1W+-~PSDfBg6I?L>aw8yCJM=)W)G=YpPkhkMHJ zn+Mdp{`kGv|Lynj|1Z`b67od!zWZtKGf3)NE_r$PLPUr~+|IdJpx^Tnd>gy34)%v! z5@$N4;<8mVZNt&=8S}HJFgxbyM^Cu8N>~M|%EVzqRGNpoJFZ{9Wb_;Qeq`(e-~Hsf zeDcE|k}HLpCX#FD`w^WI+B#5%rkm5W9VV^|xx+Jso}40;N}vQyJta|!lFyPbNaa0d zP@$OFbdWBl3{#vW?HK}tPc*8dYg%;csfM zP`jg0G$j zr>EzPs}O`?uPb*4|(zXe~dd?GM@}X){KAubIz6vUc7itb9}_O*-C=5R7fOXwcXN`zHN+P z9f_e-$_V~UDH(#x+OVez$stWJ-esTYN1Qf%=lqg?_M;y&uWNjaRJP(|cEr5tSax%& zxvS zYM-{EbxW$MLZ`%Rwq#Mw*gS4{Tzw5$akM-pY*zGXqFc7S_~1ECX?)+KLqz+Li)G8l z&o0T)^YWWFT;JT$RTZc66Fzx*#%7qfdHsgnFw(n`HaWUkhcz0NBEzaDkDfSrwEfP5fHa^h%NS?f;piHLHk%|$McUa^fCOMeLJ$g@NqK=fxMKP{uLkOACXTkR+ z&6E{G$n2(p6MKZhGKEa*EKi?4=l6d6dpvvb0e7Em=~s`~DiW)jK5e<(^`I?JKKPK+ z7ti_p_L~3vH-E!)ch507jf649bukgDSi=$&cc<~_*-tx=O zzaUQ|^R_;a6wtOjn@2*7XbDZq?-$3vPO{fGS_>&d$*?92i6IP3Dv)bKaGGrlsNgYK zqpTKWcFJW-Xk;y@E2tdWh#4ScP0$dE_?}Q?WpLSGlEP7{sdNUbab?eB5~b5!F{O-k zvL}l%mms}DmS2tXJ#%FVTC*~imCtO3fz9@j`SA%kJEke1NSHcN104oc&xmeL(=M1d zEfpG@H3S(X=|Xx@B`KtJL}M{YI`L++CE3WKw{e*y-O@qCVM8^UoA> zbjUqBo3Usrrl9e<|97JdBE6)AwnE7udml+zvKAy zil$wnvZ1b9thu16TdbYoV`dtAreVXAWy@@Fgsy6$ww!(P1FE*h)|PoY$Lb1|G&gVG z@YPqpX0y6Mr^My)F~^G&zVqUo?qbO|w~x$C#19YLJ~-YyZcx>n5IiACf=0WFILT0U zoFesXPRejOQ~18aHJX$aukP-+y}uk-VeE-Kxx#f$S75>3X^_UgBB}$1oISF1o7ST85 zT>4?vfvT|IZ7RK|57k0u!pMe(RG%b zESINOyt#X%n=PnkH5V6`%oYn?eRa*v-4>G~vu4Km={X-feMUX+SRS3S+YD4jVTs^9 z1VybJ+9+zRX_Thcs#FFR@}N>!C36-r{a1w!C%E&hrHfTd4qHSpAIWtjX-~Epr7R{% zbz4Tn_%U0y;~;|9W(B)P)NIa_CMu=S1hT3aeamM*{}o9scpN=V<;Y(8e}D4HQ-1ut zGcp72@(Dw>IHkZXAb24pBr)RDRa5-G<{e3XNmB-k*YptQq{oGS~ z8D}(=b2uxaj?)@dXm)B}e?$4zM^qAnTF8Nr6?LtM;}**ax3@jfYW~}Q`)|2?@ex<& z&-vmX{*M3ofBGMpwl~bGnm7fP^Ok9PO;epq=W3yi#gxe@kZqD4Vy)zJ%(-B}wY;wV z30nn{HG<34`(&f686dQd${Dn-aaK^aDQBvx;^=tE>D3hxg&)1t+l7&NHKWsV?mq20 z(r!i09_K7|)vz6;quqzV5M*ttoujKeOcoNMHBz6|j}svWc1bYHN9`Q#I<$^dPI2Gw z@H$b?8*JAQl_n-lv#0G4nKg69zUO|oWl{lE$O@h$AUx>onHYXmiARy{7GE?6zyZ{PMSa{Ng!IYwjLySv@{* ze|O8>-5uUfC~Zht%aFdF5t9<4QA~y8nXq-D?Pkp8bK3batL;QT?5MjLpMLf^!}gvZ zeE&O4(?qjdqq<|Be)yb!`Dg!{|NVdcikIKK;_~u}b}{GvjYg%CSjz$L#Vn~~Vw<51F@` zdDGI+;6r8zFnXB*J6qAU9rMKz^Jd0;z7RT$G4xSLbA}R*l3oazXB3~m)$+4+vSkh) z#q6CTT6u!wkgqPLr4xCTdX&n%^E(woU=T8&a?AV>e-Ar6Ifk7xvQuVR#$SPW=waoUJM%t`=LQ=T88=txGro6DtQ65ZD?ALfVqK&Zkf5#LSG z5-WSG^bg(}5(TvpwMFb(wh)W#+21B87>B z6=QeVOYOC<{fu%?;}OV#!&RmP+7hEq462X|b4F!(K828oArY&9F*V9a_d<$$4X*^B zVxf>~4nK1rwxsMqB$)DUZk*D-;!wKbO{o((=tKM2m_lAhR%C7DnN>oasSuTIJHs_I zvaGCe6} zS{A6JnJP!pnLdpuqj>Z7hI!j^akQkHALCWTTjx!o9M8wWW6=CpFH=GQ$vxJYYpg{^07qh`pK?)Z%Jrx%=FoN{)2&g1J_-hTB34{yI_*l9w! zb|o9*F-BujnTKZROwHMo6P_HO(R52p)iJxQP}ySh;hW{h)Eh}n-bzlY z-f`TXVXx+5$`6Uv{hEH;QzwVLuNx$bsRphG+ZtovS+R9$E(nLQoPM+;BF?vPRmMS;2Ngd1> zuC2+H6P-XiR3Q_nn88E|!VH1I2h>z5t8B#D3T-3Ram8ZR&~+X2uEA!D-)-4!Co+kn zlO^?Xjxv#UR^wcUred>NVM$3ASd|Z5TUAwYG@sG7YdO##1R=qUX(fwlE;qj_V!4PE z>0NUA+p5jC7TNa`no8wE`o|Opn^VwQLtR&L!&DAqMR-bC3wE9II`-mL=`A{lDSM1$ z7O_P{Eb(dStlmrFzr&~GxOXDSVwG}n+bP*_2_i$IO~M$3Gg?yTPEubvCbTl;kgIW8 zx{6$?u*S-tMI2OnaPb`_;((^_uIiuOVl;^COzJVhR%}DaiIPc-6?T#~F>)k`^THlkG|92IZk|6yOxo zu;cC9H-s?JG!6A~0m~zBolKXsToX!_1o7cPEuBHOGW%7vAeIX$f&D&3L=LBwEV^2- zGa6g^AtQ-MBH&E9H?qQp2$RAXMPnPRtst9X2$33xX$)usbz4a?#>axkO+v7!9Hy2< zJZrfo1u>{(1C#>2?+H^BLr9Q>#@>~>@3PMsbQbFcq4dAzg4WaGFvS>h2>59rMo-ES z?}J=NS(om@lIBb$xxC+ym7e!}xaZ#`uf;u?7)MFc=Q5NqR!~M`@}yXLu`#mQiC)$&i8y-kBi|$ou!G0GV%x?Y~8{ zFB|LpJ_f&t{*cORE#{v0e{L~&y-VxwYg7uw1ADL&==VhXy;y$`?GNes_m5tCr}BFa z>wP|?^e=`O!3xUJT8k@PbNdfT5iPnVn`YI^7<8@e*G2C zJ75e9VIVh4sWZ(HKPJZP@RfoP$=(yEh}DW%Iwj|q?#%PD>oH#J8AzLxqX{~9lHh^QCJo8zLHJRD0=HlX%=T}!O=Q9Y3 zo7cCb=$X4Y-}~VEeDB5gp`FY193yGkk@A+5WYCIwXGam^N-P7ja^36)C~Ds?o&E{q zN34$=_r*Bdl0P^m9s1t3r^=9&#s=}W=p0iFeQafiQp%e^CiDF zu-LPe)|;_L&RDJ2oIX2c zOcVFJ9oLU5ybe4$nW3WN_Vq2Db9`{N6 z_%Sl{9_Lz)PER<$y232yEbKryno*kpUs*_7cAIOSF6Mmr^q7;U=Un$|GMQK3yyb__ zzQc=;KjG~BlKIsI&z}B@$4{lh@Z#i*%O~etRx`4NyW4vfZH<$Y07+}sn+-~7>JVhm zZ51YER21rpc2;N(e!yvH>ISVk7!pzU%(|N8qGPw7p>@KU30GyBMpIR(G&gCEj}}~< z&uL~BWo4M-eIVq>l!J&GDHBxLH=t2T6@#g)5N1Ez(8YYmA><(D#w1A=@x00)L+yK3 zOhze#H5|GaL(Ys*h6$68XfoYY5z$yx(N%L&HDfWG(Kd|;Q+^_6FGd<0md{H? zoK~pd3H^rt@qsW6oE{x>d9)O~<+v4Oc7|`h{DN_Pk8+imq??4QWYPH@yhYiPTZ>pK7O{~>G>G}OVkZ-SC6cQ z8U1#{)$)XY`A6U7`PCDiediN;GLO3r$#gusI^oOTe9Fa45UNj~f5`FWbEYh&R;{FR zO5290Esqb6JltOMqJic46Z&k(uA-iG?D`GM*<7|uUd$E0*uCV-{u_3;FVR!P?>yb^ zn1}E+H(!0tsB1!H*d05ri44@_G*DMHahjwGBq`E3(eE|{FT!q5B?k1$g00cH?S=m8rTJDQB*~dBelo6@Bj6jtZ+~Am}QMu^F_%2e`SuCvMiH`&Y~=i>YQT zPfs~(E%Qoqx5{GJilgj*tYRF3)cqjF#i)cnaO&KcBvP&Fo8a9*VX0_%1 z`hmax>z^|1Uh~tR{hVMID0jwudBMp%^Zn-+oXs?s=QFN15p64e@w30>)u%tD$}^r_ zJm+y2d3fv@c9A$fa=8q&M;$|d&;4WKe*K15*ROdptEuZ#&gLDToL?}-9V+(n-3>eD zi<-s;3^3&#y7!oMM;dyP8d#VWLwKO7PlPI9G}(Yp6HF6LQ26AT>O^d6+ToOO^t5fj z>xp(~$Q2~(Q6@NTyX}hI;~n+kYxxQX`>KN!dwFoG#tD+p)(N^Y$=$2JhJo6WeJb z#mv#NMJaHVrm9-%BKBtFUJD^IO%txvX&LKKTCnXtK~M|o5U^I!v@LNnaCN!hPk-`V z{>{Js*J!oi=Zl74{l}m1^S}FlNVz434pk?dUC?GDRh3#x!ZsyhEa}ZXrQtxvG-Q=f z$|4*sO(Mt><**elAq^#Ak5JO3&Kgoy7!4^Zy4j4A^K*`t3($@qTs>u)Jpb-5{(_j- zEY6-1CONAs1=dL)c1jYMX^ou4w!=U_4T3_>8H-RTwa)b8Kx=E1kr(H*X4cMVn~tN| z3?Dr6TTP6Cqva9FSawrpJqQuZPdk*7^|@C)rmE?>jx_C1?0iq% zHiux6wYGf!^6(ENLX4FVvL?) z*wUzsc9PIc*3!*t0)hiqSz}$KaglBUJJlGS7}CVaydmXCh!ZN0s6|a(J5p^SW@fV) zX7p(7$yH5EFzZ?>+o3UN6{%b#GmyiGGd0fE#2{-zwnC2E#}14#BHUu$&2@4VDwCCY zREUwyZbB`jes+jb<)u|-URBg+mW@Tn5$h7i#|=kkE#0CbW>4c<2mu!(I!=TzKp2_W zvD)?wJ`$Xzsx)>tfmf(#Sj>)5RU-5o9v>cAKRmEnZ1=nPQS&_414gQO>GXWt>uCkZYu- zAS;9Nq4cgRLV7oH&?P{!Pkjd!F(B1nT6*FSBwRAKs!+z@Q!B$CTOi0Z#=+t~+BD)`7NE;k(EaU zP4>dXetr26hs;G@+c6!B1YrcN{nsL1)DvxmqKX`mn*s2p6QchIP9!Rz_ zhE{|rf|-bEV0nB*Wg6~oAE>RR->%6d+S*|%htdgclZf_6Evk;Ne7c}*8+<3#bVCUtV5@WO+qbioaU%& zX`Mn>8kOMntGB#)c|%Y&(I}i-V5+$g3j2x1NR{Kb>lt=C#(v=8@lFDsS@ugQWvW?6 zreeGC++JU!{e+5%5EGTjXf4;YHJLZ#hPN-T`TAMIo7KmhKAB-%MIv#0x#tC0%{Yzds-s;VF<*Af<}I~tajNG2<_^1G>O^>wUbnWcna}6cb&V;A zaH(Pv^dzbvvr_t<2OIBth2IaSy?1!hD0JE%r1n_oeI1q{uboynr7$^4GCV5j(nc5I z(H6&VDnocB_^IT{CCw0HAO%e@8Jomyg?hJ%mP4Qj8Se!Cbm)xs9%4|^&02b~55gew zP~D4T+8CTwcr_C89xY<9T2mQ|t}5zOiNm5`dS&k~-MC6~NY!exxURdFO&ocgCfsh2 z)OQ4%Bt@W7NeLMa=$D`+4UU4KAy*D(49W;1Rzn%U#InGv!!$7#Q966+05sa*R7ukp zgMm_DvbgC}mQ>QdKP4L@i)v1iUM(A!_jJj9(={OlF^EtS_E|dZtu~VUDx00CWXP|S zlD=MwX}e*lI{I&;RFM}teNPfq|x@YrnN7!yT>pHGJd;x6>QxaFLRRs&F4jA%Oj15Lt z%$GCjx?lyauxDWW?F}1-@9zP{Q@EBA2 zcS~|U7TjVk2{TphgQJrps`-qx?}jQHD^#YcYMigJ&S4GIh`<+PFB?vy4~e(DuXZRK zPt@M@qxQBTQcCn=j|v8(t$e3igV}eJyh9=BB1~7hY`l#w!;8HLD?dkPF))au^IheG zD#M_?f#Be1EGVw`%GbXYXV(bQ=-on@3dX1y1XN<5-A%=;pvrH?{2p0gk7nAZe3izQ z;fti~-}ST~hAjCXC&Uk%S*`w2GQCvAlT{g7z9;I-8juenWhzZ69L1$&qQ4U)a6M`*l{G>Bc@4qeCXp2`SqqW6YMeQ2e#SzqW5sBEyw!I;48NRwO}`ys7dAH_6S+|ha8e^cDeAZxuf(wl0^A$V_I`F35zKTg{3 zuTg#YH#cJIP$~O;O-aOLJm;6~}*z9(EaCFQ< zD^}Zq>nZbUw`Np<%gbZx+N0Epwt}Wf>~{C~u##Tg`J9|JXGcf;(NBJ#izk=t9&Y%w zn?vf$8mdS>5)Wh%88uj?sEoy1O-vKM4S1@^v$@|fyEx_IXu*@C z3tqJYs&B~{mggFX=hoTwlf*$3mxvrx=t`--Qm#2gt5ktk%L`1mMdPKbdtCOW6UCUN5{Nf)Vd zF0s}~9aAdLd!wbtF$wO`pvb{Wzg`Yx0?HkX5=Vu$vA8f_bP+Xoz;u2nR)rcxRoGhcrBCDW~= z$$`tO5BTWC2YmeD6P}&Vc~qyYw>x(IfY#8p4SpIJW1vq#YDoGCKbCW<(TpLIC&(jg z2sCxa=mWteHvR@;=Fk7PKW7+ryd5^Q%Yh$!&~eFzpTGV&ai%H$1>={4$yB~|$r(Xa?2#?m*gq*$&PN11$Ak;djIc8E8^T#v> zNmbc|L1tOsG!lxbIM$FdSqYV;v6gnZr0IGvqg1pNMM(`h7F=i9g@Nc4r^^;UT+z4@ za*LZc{LlZ>zu?!u`z?O>=YPYC7ZWxOlq|#=t;Aerl%Z%tK-YAoB2`M%ZjkVA48g1zyChXV$B#5VYiq4Ov*H!XMJ+cdby@khA)13LD=lX5LC3xZ#6-?J~`oG zdRQyg#Jq~)Sjm-YMV&E*wkA=f21hZL%oGzL3XL%-7^aCS2Ie@CFc>GlLYx`qK*o|% z6nrnbnxL&R4az!F6kNMQNJ>rL^61fHzW@F21Buh+lFxqm5&!<*{uwWx zJw@llei+C}Q>-k;lM0lgu-TxaukB(olgFGX#uCcR<;^R+Ry;VrhjxyeSlDA}Pw%4p z6LhnbYQ}jj`yU?&ZqHyw_WNrVFGk${CG+lztE)XB8e)nRwHHCgHYj6xaB{|+VV~rz zvThwAMPj4L&e8zOM!x@Cq(-$d7L^M-MkotLw?G?3$g%GJ93jn2DKm`FG(EX%F*ajt z5WKy1ES5`J2CR-4l~5(1iPB>&2@{z`tH3BLKoOW?DaZUossfqCps^z4C&Lgk=!Ut7 z@x^#YDw%PbP$@Fq+`#SzpC=fuVd1fEMz@K6-4Mcz4gozz(zM5xnXCevapZb85;CaR z&?SS`1L#1AN)o$DGh+xSMl@!%MwtMu=biW7=C|K{!qtllUR~|jPZ8ZFgqmKYCtbr> zGRkOdET{-NXOtf;=l6!v1&UoqT4iG~jg_#fnjVmnfoU(rNExz@^@30GNe)4Q4 z`Iew6nVlr0H`D>#qDK!oeB zg$<3aG!Z2`BH5qkN|lp)UaIs+tNE4tEBWnWj0 zA;lVXR6-=uTFLz`h@kEp&uX!tF$Sv*&RSBG>M~snGZA#b*n_bGu#tB5^j*V#nwi2x z(uG(nI()Mvt5nIgkvYuFl?>s4MaU>8vtXD*t(VYpjn-XoDf%`wO&73nDE7!9I?<0M$FnVU1t|@U6{Y+`*U66ZWPRD2KG|$Y#NDdQW++da+eSgMV zZ@tTthi`Co@roBOU+~4t7kvKmIX7KTvv3&e>6Q(yaI6FFyyg5($Gx*Vs9AAywZm%9 zX6_k_XeSy+(Vo`#Bn{b4y!~j+x1X%}@BjEaeCzE~KK=ODyzNI8D|qkszRjm!E&1fj zr#!v5;foh9NGdYT15*O0MBkg@%rNZWG|=dR0lFAjrc7V;p_C*0amT!$+1^}J(oEYo zSl`fkh4z^-Ib74B`!!L?%wV<5fgvQmym-O(=90~J%XYtE&XFkuocDBnhtY;nZMoX) zczGrL?W!13(F6k4MS7=E+7gxG<>eJ0{_h7AxTHM0n%#sGF zjW#CHs>H%6R$Ytggf0`ZR1V5KB6CFNT4HZ-&SOr_Xiv`Q7Cnu25F)N?Fzq?2IU%YQ z^PCuI31&%b8f>$mJAcfbhj%zXKcTlhIvSk*3VT4-OQ%jE=YZBNPAkabK8!hth?1p? z%ap^=a~o$r9PEp_U3?dHi(1YHVfVENrg}Z9b~x-;v}y{0DHY;8qi4AxC@11ZF)aoq z4^D17kaG;AFrq_1#!eu7??4 z6uzQGXsanA8;UNs4l!!aa`hx=q(979Tl=x(01#t1ifP&!bR9fP&dfPN5?7eZ37<5&0v^P7J%LS$}SPD~tQaiEp!5yB3+Muke zPQrrnnpRtUu@D2=8?v)(UOeMxKlu^6iLt!VnCT&F5xVx(w;GV*XT zUd!fKMX2NjMaEl)YaCuXtkSf;!5P65DI+xx2UODQA~af|jizsUW;5e#A_Vz!horrV z5lbee%sh#JuS+H>g>fRTg^+71{niNLyv7CT! z9L-4Tcyc;)%^!ZZ{6>cNmN=pg=dE&(uI0}c1qOq99aFFMkuHBoKF9%Ip|U;>CaCf? zw#n;h`10CKxm44Deyw(Za{Kk%_RDij>c4KvIxKKNQeqT2j2~$Nnxn(_KqR<*4Z(9& zH$s)@#c)w-ZHeIQ4~B@}!17c65!K+>QeV^40NX$$zlYbM)DEazj=wh_t*w#TgZuN+_4`vOl@D&$1Np}Vtz}8IRwhI!`ca>jC_q& zF~y0ZHS?i~O&RGVD+=cwUKdXaub&W+_qKl&@|e#_&NHS}v*)39DIFiydonfD_(%;;Q5p&V;m zc&)-kmWZ!i530I_Yu!Pvz0%mc%I&#>7MhLK^j=n^Iqc~p3<*dn)Q;?H{WJ|J(ARCBxM+e zk>Rs1=)Uz$bh}_(J65wnOd`8o{r<&rXQVE|jQ{{307*naRE(F@TgA>%X%vE)(1O0x zwIU=1N)(J<%7uBeA*aCAvyb@k&wjx_eE1R9`-x$nxZds|!LT1GMd6&4XRy*NeMjFa zeA|$VV&PWDWI(AVB;Rk#eHz77WwG%grZz^6@9+-JU1!J;a=@IazeL zuI0DC|6Ts%kN<$P^K)>^`ZJZ}=?CvfeMBLn^NboIPj7CxJ3b-JGfQL8B@t}H(p-Ci-B)r0mEs<;^0~0D)8m%E4!Z4xSjCYo-V#OOmNMcCySuw2 zAxoJlMN*t`+6pc|7j)xU_6tszD}2*(wb?O@*DU%5qZ0dR&n}LPYQ{Rny64-xUON{cf5V?KIDSejTj&+f>&4Lt+S4{b;smMP8nz9 zdFQMb0WzlA{8DNygvQh*Ny^kDKsCqJXPKn!HAM*#YMN(?4Opd*OQf7LTG_hn%NS$n zd`s*y79(fGtgu=!hY1~%7*Z@~1FmzlixzDp*^&=cI@(aM7{u`}Uz0(_k)kv?C5B;O z7$g4SIg3RPH1z$FVLS2Fs}1)ay-7b!T<&I~UeKz6kPTA^(s5Zbxy;*9_a8iAxwyyb{#(rU6n~kpS2rwAA8_~n+r;9SVrB@D#px;ItQfZw zO|zhc$TW`leu+bK+IKXrBSym<9EA?&mgJ;}Art2bVj!i6Z8Rk$#@!&FV=rBcDile= zPcvcK@oGP??$7x2)6e+TCm-?m|M2(x_$NQ*>T;m>3+6GRmEyCjErS^;&quzS;k%n1 zZ#Nxt&RDBhtXfpqVdjJ~Vied714GIzl%|Y(rqOalGLb29W`A?Z&1OShJ)o$JQ4=Z` zuCA}yy}01aU9<2vH1V2TMpTimXk9c{yT~TNnRT4e;B54)wE{DmPAN_Xc9$7 zaz&n(OzkL7a?Vn9QHLUx2z8l#F!+L#bX(DNv8k&eS+LPoi@DKiYQLprOo=8&w4S*R zJu2^M+=kXf?!V#r()IlKvzH92<+uErm3z(y?>WZ(8QZJC5G{MxaMirx{{95FwEXm! zKjYQ7<^3m5IK$)ez^n};iHlIM+ekC-$o`s7p1tJlci*9yC6C|w4x4G_<@E-qJtuub z+dwjzeUv(`>1Kyck$&M(jb)C3w67vVyku3EFVSnBzUt|X;oZCUao)4h@bJldJih-n z!_^IMfB9{G{_CG{-a0Nn|AJ``pFZ33vtQk?dFk2CcX_#8GHXk)0j&yl(c%_sXcp|p z%;n9%c8JVL^VR3SrddvCb0S0$t8taqq^+StaiSDK6(&=-4m+k4xwEyD>l<=REW0J! znMy^A%=5@NO;{gEWu{p;v?+|kND3n*20;xQTWNrrMcZOc!8t<-B7&1Lu9DeM3fHup zpWVT&&w+-t({#>btS867I1MaXja_s&HL{~oPF!4Eu-^@I-9i{-T9TD= zHjlOTFr%~(<5U$nZo7(Q_fSef7fHRUI&3XzlDB6IP-HIi#ZY?RyL>t(qz_V*ZoC81o;lIUocPYyA`0*1Szxjymp!oOy z?l0NDxZ%XYnB{XTwT|jo1DI=tqU?gyaV9$mQn~KtB4RSiMJSF1`MZfiPO2{TRqg*( zgaBBJ?>c<9;GMS~^W^O}z!Xdw`TgJhHc#IF0N+1iHyA$q_+xh0pEHfu6b;(8C{q}w z9XagqWx+5F46{`85i_Y2j4t@b9tF2jsW@p4WE^3f`1qq=@~40PuTXjBYPw=|_JCj) zY^KbjX;^ihb=z?7;RCdBgkeVvnMJ$6HJ;5ru#J1E5vgI3w(DrTqw$V1&4d){*}_0p zB1SpKVzH$04In~H%9)g-bUr&rHlE!m7*~&G6QKB0id_+6!4T=4101?UTp1u5R9Qfl z#JOoecY(IgO#2;iKjLejxVDb<*&V+Bo!{f(qc@K=Vvioq+`s#Xn^#|v=1Ai^aGsP4 zxr~*xkTF?{u!5v!OQ|LoBhP}EW~OOizuV!Rr)wPNrzb?MxOj2FhdJ>4v(I>Nvf>-R z^F6d%QsM|1UOxSb*(cJpXD*pdm?hKEK%-k)y`b$HPFHJ&J8x1gqWm)k(z)nFij&l#VYhFT37pZ>#o3QsTYVLvA_5TlV)<< z5vDC++!5wNvXHDoVe4i`C>)2-Mk*OoG|2=p`X`IVV@e~Gi|pA?d$zIAD2w(Ta}-Ks z*S7R1b}uft`TTS8tM`SJWm_6wSfBOy&XMQLeluVOg_?HQKBGPCr;+`BWK0U>5^++@ z!(I$VMPp1$$(do;$$Qf@7-z{-Bo$bloO18(eXd`=Vz<@2*v(9hW7L*}%nMl+IfvI? z?-UAChD_vCX|!3g>h7?MTIi)(gOem;%zK)~usA*E!Q;1h`@Q#h`l8S+&RDI_ajwBx zgV%L;r}Zo1arN{6*NqUvwwUR4qI zy6VQ|NLG==z53cR?GUn(-2un2jLiP>`I%D`0)(j0M{)R2N$Jcjhxm2TzK}7EP-b$y z2gRJxAs=^d(=^o_UPfyKpYJu1LZfd(hl-3hhSg%hYT1kUsTJAxj49z&!fVYwMA>I5 zx!=xlkJbj)Sge(v_YkJz{?QtXsb@lRA?89zN#3knnDiiXlS|BV#<(ITgab`8rQcE*J6EnBFKVut=u}3jmlI&UdF-9t3VmgG1 zinPiidX5CAM2FH!cInHmW7)RoB1C{;9*A?4bL2ErG&q-0_Ha!Yl5!N=l4pnsViY4l z(V83zT3N7`lxOxTGN)7x;t4m+Sgk3>l4795MAn69Zo?|K0V^@;=Sq$(Ia5NSnA+@^ zq%K-&aSFvK@|;o8U~8>mPMV}3OoeHb=Pkyd8!Pp{#YrMxYm{z;oKQ*)?#XL}S}m(m z;&Qj+dUMG*Z3$_TxkAevn_t_Tmx?n#);-|1Af38@V#8FHCXIts-j3~V-6Jb&eA z8%xuzXiSTanKmcpMl-n%wK^xg+AszMDw2v}$nxIF{&=c`%xK?{uNBL)6`NVY4Q0$+m&|6XXs&1G62V$A znNE@I<&GRD+-8sQE&DO@aunlPw`ghFmQWOp_4Hn$-Ixm6xfa<7)?-tahj!uCudqMXNbNv*jl=Be2Ar->jFzqR58iH zQlYC`u+-#96~<)SbSu)=o5TS_e+WlvUK9E2hauOLs8I&3jHF5hN?h^$N*sYfW343P zv~g&YYARiDW{2fe&NXo#L1`ziTa$gNOThYm#Ow%XLhs*zM) z$*-9XO2utg%#1P8SzmH}VAr9sh!9gss_wQ!`t#Q5b?AGS^{GY~L*FdOF%!bfbxL$f zOGN+)tE_ahWxyIq7+3L0*Fo~wkzE~x2XltiB39&>m}5M46`D#0Fx5a1g7j5rttI*F z#mSdyU(;bAKA_N#4)sI25hZD%Lr2Wv_@g1!>q}`{Q=(GIKvonj=_Bjp;ghlmEi;9i zY2bQ$#l2}y8)l*wuY63h=ved(&U=PA@^Z6dHiq`P=VZBOdDf%7#TthysU~7&aMjgC znSpU0*^L8X7+Dz0y6XfjngW*>JO1i#{}Z47@)!KU_kN4_AHMc zSDm-HP?8)@iq^zj*bOsr43HFEqtULds2L5;pslWk5hrQYeu-^-J@9m3T%`cy+DT}j zIJ~xkoUaKnRRw6@I8Ih)SZisW!z;lb>)#NmBr%XHMWdqEjVyp|O)*%Lan|FkBUHhD z3NtBZVoWHaIPJ5>YD>H9plk5DA(27L;Ye%27#-*q&N*DNl47rpc`Qm z1EW;}o@t#YsaUH7jNk@!?VzgNKq(7xLX)fLpO4guLK2?RQRvM_yu4QCH7)t;V(#JI z_&QqtU2=^@UBtQ@LDbO_QT z230h!rYVf{Hy8DrCGXX$Qfl{YK33W1ij}N+`Fd5CuYm*pkzB40*!tIhzkE$NSO2JY z{?_1Aej_DwxZjqdZ?DsXApf<$^tIgcZ8HDB(KoViFy%F~!Qqfwu~W_zoUU~e2}$up zSx72#YmktPe>Ef2dwNP4d!QnqkKe1cny&Gc)fKA-swrB_J+8=bK(Tb)67S>$+qE6b zenI0qyz?}^Ljk_EBKBKHj)`f1!^!D_{$#~XOq9}a{c6wB`YPfiA_3<#i>~2xy~6d4 zbb30C>sox@vRKClqj5&EOG?^tes<2HU$E?#WHOEO)d8+=F_}u= zR)Qos3kd3K2lF1)HWVDIMT;gf-drQ|heINnKjxog*~+ZBG< z@x~kPa`xa`fViAh5m$EYb|L79$r?om=N)$zC)`bi;pU3C->_ITsPi-KCD_k1OrxX( zc3VmiJ5bv?3?h(TZ*FKB$Ah~op1k>h-}=sbjJ9XB^wlf|+hNZT8gv%qr?(cXEg`Ro zvm+(B@1?w#l%5qKZHm$fHim#Qnj8WV>G6#r5VEAajMX&WvE4?l_7iiMaXR6%T;nti zC(9H5$shj_|Ll+dgvFxeCPeg$FPW!3i&cm38=mhjc(Hkj^WUa(mg|cbeDUS4iF(5K znzPe0*8LKb<-WOIGw7oH52=s~CUijnujji&Ti1N@O`a zHxBo?oE2GR5e(FAcVa0SU6*oGlnN@R6LU$@)0!hT8d-R0L+={SS8Ez=QQ9-+B6x6P z*y&kNl~#jOD644N2H$#Fd{|jdi|8V=NiG!wT1KV={hY#nd(D2g5&wIVHSp1Uy?3-pJC(W^d~!{1wxANEMDIIV-;ol`ap0`) zIK98-?8zhiIB;DWZuXhB>1o@Jkgl2Mz;f33)=`YiSGLxaX(b6#V;qr)YC4j3G`^uD zVAE8oSXPX-mDH9B%*u!?e^z{}k=yJ^R?-;mlh z#jYvVVm+KLB2Apg#_+{;VDsb8P^IVGE->fUG)+rmkhE45f`C?qr4#d#aeeyjX{oWsO)^!Xop7D2o z{;wF-C7->xV%5LP5B|wNFdqfEt)o7tHZD%Yn zj}yawz@Mz4b&TVHZO$OUG)-tV3!zUt#zA_Dmy7P`HdY)+XysVRMge2Zk@|BxKj`Da zS5>N)O0|cs9EfllUBrOol;XjiJ3M;$ko)If(I}11k!90Rs+e~W>ksEdV{Q%6^7|5W zm}9~v$ll|MqHPY;7758DWl$zzokwM!GF(W0qMWri`%zd6r!jI-(mzAal9h zbJ|+2FFxkZ<0t&i_r8x)h5zgS{Fi+6^B-~685W%-(Fmw4LyGD4*;NW9CYb=MnfcJy zEDI0`Ys92LWfBUTg#wg? zHc$M)_rA-6H-3w!Pj{SY!^ar zk{nAZIHf76rl7UOYR$ACc>er?ms3j~GhP>TN@z)d$y}JZoj>($*g{53Eh)s3Np*p( zkbdg1z>pN%F%y&_)IA{zLWm6eJvtP27gv1v|NV&jUC(d-$$yDGd(8XqzQgbT;CK1+ zKl>rqn`_plCq~7voe0C8(k3?hfoV$2p|FpEpfV#upbJ?8d--gK5!-rnPRvupluXw) ztX2!!MUQcokTRQLW|u6Z6LY^V3SYomEh1vkD5Ds4B$UXc8)oeZ##81R_9}*)1(#gp zsf$&H&KOp0$Iv8BT*JzBvQG(<5J>7iPF1lyVJjM0W}h(x8s{*^VV#ixiONC%oo1on z*4Gf9`EAH8E2#^Nbw7S6lN1u4?6-{)sU0l_t&;2OR1sKy_UgD(RZ5W)^bko;2q;HlXA%>FuBIfVYu|i~N7_qC2hyrRSqVWErAUW8ev!nueEo^0 z^;qAK(gxxxbaYMKt^Z;O6wyHLDecF zp}8uI%Jn>=1tFg`B#lWLE6FK_VdBN}S2)#hb_!ivV4T^<$ol?*`*+S+bqgMzoigpW zq-m1x-+HEbMl)l|#A4ABvto*Y2lwu9?__~Jy@#_6?>>HuJF7Fiv8+#89)5L?KTrkV zd7+VNMPm$J8>#I`kq{CzBhE;eE{!b|MVLn+92FrNIMeXr;uX(cykeF1Jbm$$uReXs zzkK$msFO8sz40EKr>{71j%XVmKe|u1K4lD<)#(|=8SdS=!}WGx7&Y4U?56?Ck}}QA z8KymqV_~-p_yJm_|xCzpWJ(lvujjJ++Ch<(e#|7plxYfi)KQ(hUZsXru_{+`2HXB zhky8AvmFBSFFt1b{3SLdiV7s8M#SSuQA^EYhHNxOi+-21VOf?ayJA#@S80cdie{Qw z`7<$OTF)@=Db%p)aLwcmS1A$!|1xmeww$fjw2KAGwd7*a%3)Q*JO_sTHEH89jbY&w zSWR=@A(0f73EH!bkSFO3w-h!ME)@g~HiK4) zqH?GddPzAHpC6a|s&;Njy8TwPIXI;=nN%WL2T7DTc_4{{k=l(`J3msYODeGm5E2N`)SAT%;m6b&DLzORjz7uZduX zG%%VYcGEjAi{9FmHphTb^}uh%p=RpAA*Mu}BQY0T25W0~i?UxA;SaxR$8*VtE*o_` zgovR_(xyp?^DgHo?`6n1Bq0#8EYC`HZ6A>Mt`VnsQu10cWfGdC6#Hppx7}iffvcNq zzIgG1eTF;x38O5_rlo0Q@ru4h8_yw9Qj{+D0{bxW>GS72y?n{bXU{mZ9p8HVCU?$H ziAM3svoHABFFs`H9ru?@?%%l&t#mGzlqgm7mlJ8Gq%2hprJ}bIkTtFA>AN-4B2c`z z1-o{^YO%x^C?$XvanKlX=PwrvmdiESnTpxhaxGTEfi;$lCC;FDtaE5{NHAB_y{r@JXI6x{SZ-Z-`ryng8s{Y08$!VEb`+#n zQE6EufZ*KAP2k|!-bRFR2peygakaE@WekWgVIR<=Hkr=tE z_<8vZnq#W`=<mJCZ94XP*Pop_ymq<0 z$KIw;I96C36ZKVyeEm*+`;~rO^UsR^Y?pjiw_Wq)HwE>=Z}eV&y-wwrb}p|A`Q_NN zsEfYsE&oS-#cW5;SpLFa*SAGS+Cbe=eNZZ>+_~* z8%XjDTsDqn;~A!jeJ*%qaNf~)FNi7IVY>xqu5f;O##?Vb=F$DToZq>FUoS~%WAv{++gFepTKgQd_!OSXl* zp0KNqVVbzUx#8ZUH_%qmu2(4E64ec1-Z4)jT~bFMfYz#3w3S<9P0~m67$h;jR7~Z8 z=wYmMn}4mk;5fYoXPgX6 z-r*XL$zZ#lJF7Fk>^9ZrL;wIF07*naR4@3upMS_NKKzK4Zs>GFV;f9UaCK;JQ{u+A z?6)IdZU)B9C25+OrU=$^z0YVojY@PrayzB{@ z)BmvLTVFjVTPGH?G%~2jMVfhWeaYXuJ#E^tUi2iT`ReH_E-#)l?625dU(>jjSC>~T zPglHrbxFIp!#G(=u_&WCyMM-F6*zB}xTfbKwQTp1M-Lyd>Q0EGVi-lRQXV3PIa@+h zq&PFF8B;Q$Qfzi15Ob1WC1IRpu~?$5!x>Mk6%kr%w6(;N*bXDFu5Y;BY`Ei=tQISZ zYnV%6Su)>!^DcS!oSYKY%Awgi13D7NE!KKWcSf2Mj5j#jQewh-!>6Bo$@!w;q0h7^ znt08$c}nY6=p4DYxnYy`v|h8&5#M(>?-++2&aQ~_4ZEwS?3)#ze*P=6PMEe~$_3*Z zJPK=Np;)GoUA`g3K-+qf>gCyKJ=R#lEHs^56r_Z$7!#`!ZR40VjHwZPosrXG3JK#I zoNaM2v1nUL5!%)}?|hT*fA`xg-*`l!aP`S2#ChO+wZaFEjm$qBY!v7IBk?VfoIxTb-eP}b7<4&8$5I@*3g=M_ao z&QfO3dz^N%tea=NvP7Rrv%`y|NYRaS$sTGOVkW7GwK5py12L@PZA+Gg(xC>ds4U(p zDHI~6K+H3Z)q>rOnG_>QCovDzJH#9!g+z=Q2>@0DNL{*QRiqEM;Npx*bzgY0$r(g23fA}dMeDgh4>yDp){2#fzx#r=M`y|!i zyTn<)2K@8bFneX?SaJo_S8-tB(R)n>=dG|{#_*?7j3Y1#&zqfneE z_^t&F*SjljHrFhdXUxqxyV){Ng_|MbJH@JBp-_DJ)z5kP)ffEgr$6EH>XOzd>1)rq zer60dEJ(WLaz8TMT$84WFh_#%Y-fd1f$NJMzx?o*+)Ohk5AV@*j{Cjmq|aQBnwT9V zhjtdwB%{DOQXFX2L?{Z!5|cA!xQ5N=EY`5riAig6fzGu!;|0-e;QpN@Pu_ilw?Fs> z>EsUo;XnPD-P2FVsfdwbnkBVsJx*H^xk6~PWCBg4(I`nxTdS~LLo+vW0#8{gyqqit zwXHbK`dJZSA`)VuadK{Q#>xzopmiNyXC@tadUefY1MBXDdk-GbuY1Pa@%fiu@ZrbL zIi=-|#bZ=}q!P`_Vqa=pDGUZKE;kIrh#n@+isFuG*xyV<6PYh>DC0!4Xt7R z%_(IF++4mQtC{uBdiJNDH@@>yxGSqmw!T=wjz1gVcT*rhM$b&2?z7+ComUKhpYZG&T_pgY8^!)MR9(wg2HR#S$kiSvZ*4Ax9^uA%EBV3V^TimkTn$BAEm@-aXBH$UV@fAe=d z+e{P#Q*+Jx?lHkiIHW6<6&)dZ$d*QXOah%0YKj;PT}4~3`z0s+k~odn*;B%VCCmP* z8g-S?Sf^-l+<$b3C*OFRSC?1B5XezFjk~60(KL8#$T?6_tZ7f#pXD5w=ZSHKd7g>M z(pXaylbXi)W7V4}wcamh*&Viuc^GM0N7Jo%^zc6S?%bs?p`ruh$-|zj7thdT#u~`k z3feWr+9fLl!cv7SY30roCA3Jfk;uPml@^-JJg_3;y`e9TdDiTwz;3t0Iz#7A`0}%_ zaINO*VHNt zF_KuVj-n6N)--OxF=SNmT`m}Yj7!x$Y+hrkB7PoRRae`YZ~p@ZlG&4sR+fg zaTaG3UJJP>)yUOxf%1BK0RtFHnPp$AG`Se|Au;BeT}fS9`8DTf%&S>gCK( zl0`=)Bt0dwQ>pbEB?oLNXwv`B*L(C@mSkCapUHEseA2ZDks&gRrC43n#TH~&gJME} zV#)yrobV^{2e1i{1e)C-IBgItHkz3%c2#zzsL0I7(Bb0w(^ni}ii2(UK94NnKujJy z{9R$kY}?*zeG3&0g#lE?HyTZr*eGx5QlN`lLW&|J&mLt0CM$|nBosM~kTeNFRL2s? zjb$m2*1JtYVEes`uc@36(- zW>aiCMdk7x>Z=enGe(yxII2B=WkBgF1Qw%Qs(1CBt5=Zt^^Q>2NGz(}v&w!rT==fB zW@ijYC4-f|KrRJc6uQXIQ;I;`8<&hxC}nqPepNVJ-T8nuo}^Qy!U*v+sftq94igJg zrzlQ~m|a%~e=2C}$QVqjbV;R%h(N0!MI>!>B=&)jL{NcNC|x8nKs#(ZCFCAwc80D< zE*h=NzSkc^q?l?FV@EKPym(X1Lp$PO%0-aq_475x?6cK(-$BWx&T>RlH}1~yB*uvt zqz*OJcomEM4y*OvT$WN2p<>BW$5<;p^cV=^D4*{>%3?RT7qM4NvJSGkBOpWyL(UAU zqu*?~vN!wQtM-nVVN4=MsZCoEau-8W3iD};Z(6#3!sX=^>&=$N!D8A-J#ID1YUUHo zq|t1Lj)cNkOG`CX))?cIq6o!{2#D@_xp^-_NYzND0Aj>IHMnVc7HfT!P+0BIwp7Au zt&dW{7)8_AN;vXR93eY$Me!%?30S(ZpvOd`#V{aZCaHm9jI1{uH>)+SBoV1;5mm$* zN34pF=wePa;-HG2t0Abv)c&gjv}Js)P`+|jALS~QNtw!yb%Fc2$>KSsD{nWEhZ_vnegiTnvQi?3L}_?FXFb1?I~Qm=?b2`yO#oR_}PI6@dR-@g2cu3up%9^+@M zT%j9RY{r4U8W+5kdO0K*lO`5TE{UcJM^*Mryk~uCw;4s~(zN)ZnNAm| z6k!;oPLEOI&gX}q6k#(El?68;ljv2%+YL<_m|D+)@~lIL>3Z6%NyW1nHQUQILv|d` z=KPQU%m2YCoS%#lzEAt%P|hLM7D zmQ5Vk4kN)094{Bdnd8*WWsPM`3K>;|a=E#_X5AQir|EUVc}ocyi;CnD$yk&TMQD*b zD~bdulHx#&BT9J`Q?dk$)q_xp1JTI99&IVw?z4hbZHA|u>RcmZ%CJY7*6p!2-R&OT zy{ke+@S|!bWJc+XD>CFz)yc*VZ&m~ulhP=7u53t2To%$;&=jqRCWVaKyCX55)C?X2ytYkE3$*Q>aI3ok=>4NEehVo7b3fhqsgqZ2ZC@7$=XKl88^X8n(F0mRCR$Ce+4beqd zFenWg0+H>ulT5HwXl=u&Igly1JKlgIIZvjCEM+L3_{+t2I$8an??km;+I>?v$c2j{EE;RWs)) zJC}8Bbd=h-Ruu!U?}}4p>(JDQizZevOwQr}ANxcJipI|Xiz}J2c+fKvH_T1pP-nK| zNCJv8q_M}Ah*yR!au_tqV3LsxcO_H^Sx<5xCX=z=(N0>)yRlX>aCXz%>N2zJviC&& zxqDw(Aqq%pc6^;c?}P%SW(vouyezrq0++YP#d`1P-T%Ds7M5Fm7vZjUuKB9ct-qsu zmr?)S;h~CEa8hcXcCJ)_e24bd-*uLkx1P;AA4smRSAEARd?yVk`(b@4x&B*1G~sWW zW&Rz1vf6J6=)dFdeFs7Q8^7mHKT!4}gq_FOJtM_bU_Oi z+SE&;(Ii9!ly`(43dT$rN6AB-A1r7l6E;^H#%+SGLrof*`2yF>8On|1bcZOTI4vB2B{D62U=Izbr^5%gqA(W0K!J46GKtCyeh?W@oD#V`MYpZxg`v2M=n;XVHN@Bar( zXA@%9pc=mV`hsqoSo#%y((?4#54hc|`1Za&UCO;e5fP=Z`o#J_4;cJibp#hDo!)&KvL<%DA&F^61e+KKc2SZneTH%g{x( zU7!y=Nf)*u(~X()?TXdy4GK9w%P91tgssgE@z+l#Q~V@@mH}9)LZ?{8lYNX_uh*=$ zTa?xu&JM8i1zYcEogszV)>=95 z`vIjj6K_zt5RwpfPEPLeIa^`nF{)iGI?R3t1OsrO0i7rTy2lwx> zI6h(32ZnE65rQ-x*mktj2H#AXEe<)FF31_Wu*EPkh7DN5`euzTg4@-bEh7q-Gg%qD zR@fqE>X0I1NfmJ^mA$ui?|Ml^gn+wkS8C<;gO3CBlE?zNs`9JyGYJUHZg&+gOA=WJr6>u)*omiq^W^(wJ!7u;J8 zTwcE6z-8uin7Bgco;KYu2^WN$$kjQ#xEXo*;x!XBl2l@`4J@7I^^gB==Ep7DoLIXB zb7Q&c){M8G5xQ^D_giAwGH>rQ#Sp_tUkbT8ZPSnmo501JH^f|+ozJm0LhhMN0=}Ix znJ&0FJLBffYc9Y2g0xy;lYIVNGPSW=?^W8OjjNFvBADHw!&3d}%d<0n{pFX8XiDp7 zI!miH50^&_DKm_bGRnXlEeK?`kVC@p)ubuzeVti~H5 zkjxizo;-fUhIW>)vWGS{%DYRSZ6m!hlnEZqJ=t zbFFeMVf0-jl`(e|CT+mh%I; zHy4~=^_*X>af>Umi99}-;U6C}tUGScx4eG+nzNU$czSe-SDvs=B&E^LGi@J{U57q> z#PV?9?5kf>a?hu4HvH=^U-HiD&$;*Th{aU1-VAiZfQlKbJl0uK1Y=vU;z;yk!MO&F zA!D&Q2yww=#yE<@XV@}cpR?U=Ssb6jWP)!jrMo7DffP2lc_S3BqeGS_Ky${3C-ent zU@VCkw&bwIq#m0xelkJ%InHOMM=cN6TcR#JfA@V>OnLd$Yr2;gbhn*2U!4cz=}MxH ziA_kfddkUsPTMS5*)5?&w6&BVk#p85`ff!jh2Q%A$4nLzzJBo~aSY@v&C^|vW=s%r zLZwIyf^Nh>vV!R@LB#23m@QilmQz0c#ZP!}-@)T&=-fkN0mt^uE$gcd2Om5JC87~Z zWV5{?1fiUeL`;2iv%*?UJF~TLR(o>X9s{d)v5k2j!Ns1=Rqs7-H|5EdXr*h!V3Hio zu@}dpQp6nhagDaR-&7W7+RpKnYKE*bsz!I!`acR1UlkcPCY>QCjCGVG&bO2@+GJc- zlu^h!b}FV8<0pW}q47jEQPGEj)r!$!xmU z++Myy-@ivFf~QZVB^5&o*ED8CCutCiTUDcTPsxguHL+4S4MJxOCF78xldg9|4OnBq zXuNS0rD$5kCPt3ubKZOYoOho+<&XdH@A2M8Kj0Vt?l1V~|NMW&XvOnq?_+3K%;xmn zn&rIV-~0IcJi30!>zA*%vady~dwwnhTH8{rmng{CGmHbufO8Fv_b4pgc0?g(@6Bq> zPyXr?e(~97Y{JOFvv+7F6YRth+=S~sFi{p=L13ZCkkL5sjppR^fNqimiJSvgDO%%X zFjW*-i%~M@Ek-k299G(%kOsP8g>4&-9-I#6IDSWzu+BuQ-^^nNKDtogoBJ4ePTv zoW1-OYci8*!)BYS2wPRkl)MjBM3_>P2(-kQpen@&z+zM)l|(m=Y=(|WJEzTxS<^Cl zPuCB)Vc^TpUvP5bdH%sO<_8ZsdiI!q|KbIo{P16bpK^5ii0R}7>(v`tqbL@}BuMUV zSo77ZbIz_dtRrlaCEEs!6%@BBI4fiiteiG}C^!P+X)KRd@CCk~h z8AdP~lXqg9j7H%#7$be>k|HGqaXM=yS;t29nq11hT_Xg-U0kTXLy=c^FiI0L+>U{q zI>r>(rod!z$kAfXL_5ZAAap%bYne4OEQZT(-%t)LfBA3zjAnVvvp@OInERH)<&yWm z_W`diI=ZuKwqb-4WM5VCj809%CKrkpGhHeow8^DrL~BinQQlW6*hbbus&O5W!a5|n zDCl58vWu}x?)HfiM;J3YX-bry8nXtYL?}NXbPlxi4oj&+XO+;d(nU={IWg*m7$|_T z4w9H4td)VKGSa8a7@B6va<;%(Md-Jr5>QI^M%5lN`hhfdG7nHudRiHA8Usm1IXjHP zlq`fvEdi+tiP%a`2ri~*a!lx)#Bf$)c}o`ZU(Th@CxkM)i#5$D60^j@u*c*r?m!CBSq`pl5-|R znKkHQ(5BR${~f6}r&2}LRlZc`2U)AT_`_V}b<{`{lp=>HrW~vB*`c)}7fnimO$ba= zr12hWEn|v|d!wbe zNLHit*b!{HvxdG83}azCW+p}pfvYG$ViQxX)SMRcrZJYW3xqVHq8O}to5{*DX&YSI zF!c^y5<|`e6;MrsZym?Sha4OqFZ_hDqaCPG_`sMsF3yPRV+tPlbUA1rNRA`m*EG&)@LR{>8uIUmyRBqxmtuJz^LP zsVQ9EzQXl^ak#?+#sZ(5z2WdLe!|RHUc9+t(qS9EE_O3hU zjbtZOoDy$gbCfbt=xS+l7;B~Ei*IGzR2TeyVxwwy_RhUq6>&vZnVqs|(+Cbl86iui$IHM&mr(T9bihGx< z(FVK6Agg`Oj#7F*_sP{+v`6qMNMzRAp6lydQXes?uxutAkCFLe%EX$AcoB7Z>pX|c zCEJq|%4Q(sSO=Y&q%^Ma_@*%W!w3Tc0NJpB$(;e zGM_An&M|QhG51agXg1%T5wd1^bdQY=yuQ8V>h^|5i#f~23sx*^8BV1to=|&3XB~RW zdvUcnXVn2yKWFNvg5Pr@K0r%>^r~c5t81pN#j4D5I%7Ur5L6M3ZjtQ1RFa@Ns!}u+ zg)UAm(5_}lrGQqEHfG|OAh-A|4Zd8T4K39ag@n~knloxQd@lPpQfg+ME@rQM+$-PE zI21;r_T;$9|bKJ^}JE(+T^5U$9;U0%IZS#Pr@ z?r`@zbX?iL((;{Q{XR;f?px|R?tAfh-(|5EPzi1Br~%|kF{y@UW7R&_yS(Kd0N_9$ zzpl1%aSrZ;PPOpeO)M1ZtxKkQYao9&)c@NCoBB82-`_O=eH&^2o4MhC+u!|;6MrvQ zsM%G#wTIpXng5Mqg13LB3vxL#3YF9zi>!>ip+tnDMJ<;TIwb-cSBr4-9r(VilbFG1 zi+2v+ctYwyM||U%Ox)dK*u^L85O2HBZw!*lS&_M^WX54cVwx>6YI3*1+QM|w5Vu?W zbi#l0U;bD8@$dgGrER(1CSH8|n$@e<*fFx0PuUc(^8=c&=3qLdoiAu+3z$qmD`MZH z%w2Sc)w+GKRCNFVAOJ~3K~y@%3P~lhQS@QN?}RLMjfE8Dvo8e*Z=J~nW5mUvRo!1u zSRAD*cXihxQi=oZkK z7&kaqI6hd2dH{{KT5{jyV$Gy`d9v;2NM~^<@ z*^~QtZ?TgJpFH@ApZx3-9+-~zKX{kP@_<#h;l;c6=r=v{>6GKcV>wT}VXSc<<2W#M z9V!*N&5BQ6Uhw+%lE?2p#~On(o}=S?oZP!dLbKj%=}Y3XZ@wTmjvxHqKjec)k2pA5 z@bukhES@QjPZkXQHOB`>LaQ*1oE5t4U2&ip$1Q2IB6nL#9%)UBSCN_X=(eGxg7%um zOjvb=&Df!Gpu|kSz2Wxu3S+=24N)%DgO&$AYpJEQ5hs;kz^RwliWM}59K@Z3QcRXh z?mu`&vs~ilEr+M4+@DYR;ZHx|c74hF&)?zk`6bIokBCb1!=L<=AOG;r_~_|#{!n|K zfA}HBXi7||$(&T+CM$mW`L_(4#QExqRqQ!DJfW1FCKCZbBP1?>~CN(Lel0ynC?Z?CO#(S~Qtw_fL8L^f@Ps6Sg_?<=Gk2tJiEV z&Utupiq@K|+m+x)3zQVGPSeahw(%mqYbTT}aRM=}iK*joHpfKBAv2VbUaLJeU#9R< zucj<@CRK!sQ8;G^!%)vo8JzDlaau`6W+dH_dlXfOB(tMf3aQ&N1|?YjI;=1##yWse zwSk#JrdY79K`T*7D{Jscfp$XwQ4&REl*TG8%}BjNhNfD3NY<_7^#-h;)+UTb<;2m{ zaXe{QuWq?5nVVtD5C)7<6@6K7dMAMMnAl^pp&tu_N~F@$Hip~F6}M=b`M}s*V`poQ zz2aAY@ngo&)2fcsW#)L|85P_PBYo)j`s*)QG?uPgGo%rH{~^O_%k||gt8w7X`i4!n zruB)`uOM8q(hvCLvuiHCe93_w+31$fF9%+}JY#MXMJK+#iKu4aYPIFrf#o(P&Whth zZMf>z{P>qYCu&0osx~;X?D+{1$XbPSo>hO#m#<#%<=G3KHkSMMo?^Ad`4*=Be~54fhGu@VF2j0P=D zIPVMuiA=Co?g_?eQW_b@4rj&1tLjBtRRYJp#xezBrQ+y##G#;haj3I)V$N;n6 z4{ER-y2b#Jl#r*$bRl83BlE_SttX|CFrG7=G@Q(im`vw%3EEV6xIAKM8?LgZzrE(o zuwmIxv9V)T0tXLIxgIvG!pQN-FLp~wWO)p>WxZLkIJ(d5V8MJjXSviBGwfO2t_eA?SJp~+i0p&9 zV5p?A+6ziRDG^hsZgRO3g%U-)R76BY38d6ha;EhQaxj!UF!n2^c4XOVN`Nr7B;T^u zg;*@u-90A?wNDAI*E%oekSzJa+DiGC#(^>fQi_aa#uznW407(~jJ6Z(knmPX7I+CH zEiOod#7v}67(-!ZGZUpT7OZPA#xipTt)#y)#>C5uD;__6iY}3FF1B1oOKX>0TwRf( zW`1zU?P|-x>>epx(vWd}DufAwJl8qxMX6-Lzl-2JRsmBbY$T~OwH9}FNfF~cw!qPR z%6m_q@WHd^{K0SkHsAmFW43QD_`m+u|4BRby#K+6Sktnc9uWIc2z>ntlOnCM94!tw zT}&a5{NnR3XoiGorWEb&V%c)W*_LTD!5d2m5u*fWI)s6K2!x{Wvl;i=hWCE(eI7h` zKum$jVnHr)PPA=a7GU!T#Bfe_(zdO&Cg!seQk1I`#4@0hj?6K_djB=ke=c?mu^>q<4L zAh%Sh207P3vZ?6nSgI2hytVXWr0Y7g_w?%ljpJ}O!?sPmsAnjV6b9lL#Qb55M2GGO zb4u43C`D8V#$6e-72%_*W-2imWt8@$)RVPlJ@jbX$exfgjcbXqXDCv0Jb3zq=kI@j znM}ku)hrlB%WQVa@o8c@Kjh|R?J;^8oGViZ{g!Vp1Hby_hU+2I70aj`8Hr7mH~~}N zizZYNg?5_RyyfBJhbVVRGnwFw7lg7BZV9&s(Dg8k41I?-@ZP)6c=GNPZ9Kosw`{k!XqQMu;Rz2iD+Whg4qx2Sm* zqa4PF@LwFSvcDR`SP-61+PoiC(N` zD1$*a(0EVDBIxp7_8w=Ahyr4DgXdh02eJ*9>iExl+a$g9tZ;QurzEihxkf^2MEoh@JNCnKag&!y6BXm8^x6tB2l+cn&iH;u zBR~_gR0>9EvUZFikb5zP`5kpf>1y7Pc4ARRddvB4)Lys~8C(qmV-g3yaE0Wa<%|(x zma}MEBV;K;-c8haSVdHd%@8PKV!a*dBJ@Rs9jkt}7*I8d)0C5os;8;NSeD9Dbk&%~k7 z$H~j?kHs#2lxRD{cIakXwqx zJ?9!v;FZklqN-LDE#KSiM#O+ROUJ))(;BgvnNAzJxZ?8FE57)*f6BaU`RcPzdHu~d zJbnHSi{l5l#VN$dh^xi|*}EERm`xg5-(a+12(@-M7T>fi+7{;=B}7t4qzGe>h{}|7 zjW@A4t!WkXPV>c0&$pXb5<%^3C097+vjxstD2c^16Md#J;EjT$(W-;SF+H9$pBQep zEpM(a*sc>P7rbw2nkm+K=5xz~hmY{HIo;UPhmNc=Q8{wj(x@X=+X-J&*cOcsiJNU< zGbps0NL+B%%w}^=A6jn5MD#6R+?;bbolq7NT6KVP4MiEEHbiCV`jIZ|NNEXEGOiRh zYZ!;ubQc$_Z(j5A?2K3f?PP+tjv*>;wvo%*jLh8xMeNKZf#o0)7DnTV2V8^TIZVC9R|73$Ldg{?3@0(Jm|d}TZ!sVy0S(x zlPcOW<-iycB^$i4Xj2_Pbr7zNCKHJz5fVgVb;Z>@tJtH8LhYPOS`kVHL}4d5q(~y8 zaeSL2`svw=2#sugQHt$Hdk) z4CBDPa*A~t@BJP(WR+z$n{s@7OsiIMsMgceC`H?}qTU=v#!12`#ZVNnA30d9xVQ1l z)*h2QN0Wxb!xN4c$C%brtQ=b2RwtUX=+-fQ?|r@=6JywLaq)t$E?)BT*T3W)wd7!V z3a5{yf~mz2F<_j=P zV`>|w?Sw8!BiLEV9@6_MU#WBpg(^u3?K;$eEVJZ_?UrGD6vwPCduqhaOa*{nST3a*cEAsE;qp^>5j&4O;%HE#)}X&Ot+f<(05 z3KldAVpgdvO28_JNad{|dC80+(``FZzwa`TY9VLPBn>6*o(om?vYp!~ztzCJ8+h+7 zrl}5u@~%-psn&7*-2r=bB<$VOsy^Fw0GP^mhu`A-yHhIdvIBPm_PdDow^8$VE^~CI z?6AIC2|6!^y&_eL3jG^H@mvWFWzV($>mzRU)`+_n`bzyZhx~7j+I9KsnEbzK`2IJ! z>fg=_|J$AW={xpx_4do&4O;)2%;3APFYhv{3j4?bRbTiJ0}e&VlJ%5JCaa9Hdhg(s z_)E3_F4!wtMR7l$A26Rz@e{+<^*Q5uz*-@$kV6#})Mvt2QDYY55~Va*iQ6*N!Aq*d zl`tl>@zR(ddrHyR$qbUh+lC)}{4r=xWX7Av=Y09|zhYcnqqL%pnSo4GG)6%jI^xhn z-+|Gj?G|Hw1w$yZwQtEa6edAa>^>ety(QB6j%;JUFG~iNF>asZ3lP z*d%n3yPUMDh~8b;D3ZGrKx`@j6(IDhdK{p}kbE@%9w|Kv|NyD4=2P&q~!Wem3U zgfg<~bIq;G2=P#GcxVH4057;^i_tAc8Rl)nv~4h|Q0f{HTyAwVj02R+$-x1$wq-Uw zX3@+zoOtdX&iVU)?~gb;zvArjlJ}lIK{pFPW9@|Fljq#5e#94FzUDvtBL{gPX2Gr+ zr6uKehbm#}`bdQ*s>9T=D4seI7l2%#)er z^vMIVZt2G@{g|=VGjVb`jk@d+f`S{39H_|2qlbjkM_k@)0LQx@e8}S`k14LO-ClFM zy5jo$6~Fk&U$XuDOKcfv$an&qvBhVNc9Q*VjKYiw6E#sAk~i2!@yCDgJN(h_{x-&1 za4p$+`t3%1rcTqxfH#)k{oo@u_fDbP;&4lGLM-pL_{N5_P0*;4rO&1;UPmbtSW zoE$+(f(XW-a>h8v;nAGKlSA6YLB;$VQZ6{_8L~oUIoEYIR#v;4vK(moR3aPaC>nO&>+Dr^x84{fig8@Mz%LM=vjB&8`? z+`4E5-qX$|w2h@FVe^)8`-1JoFEQJf9Ow~8rjJ4!nfiv-IgAptC1&?sk9hNTVOHbQ zQex=0^h3YLe=B7KWnXq@Xc5$;kuy9cA<@hxEyv3lm$zG1X+x|H48MPVRE>p`J8LNt zX@N3?lRXI0td&L`EMeO6?dvmKx8~$v%6vZI z@x2pFr=SZM48Q*7Tkb!)&&TgP;Qoo@AOGR+GM~(O^zeJ!`|$U<{rV@ob9%|2|K*?a ztE<8%=bAxJ=#s%?F9*I$jNOVcB{tg)R{82kQk8O)AtuH$(uV@2W5}=_ddP)sx8~;R zlI~zd<6CCS1FV8E2HM85zS&{r1Dk$B7*=fhfv-RR1Y+XTzk19&@7!m7eZh-wzhSs| zg^OF-AN&pn2MdatvbnkXMFt8N4)sv8@~MP3x>FcggA9;4HaUfZL~x~ z0lCCVvyu8KiI)Ud5;kNGY{Pc5noB|lRSKZ#;GHh>{wVs2Cg~qX%H7plXyeSwJC9)5Pby7zw zh2*dnX~e1;0~xtPE5~sV>}rY(-I^E^LqD+Iu3;-giZEZ0lp!}Q%W%S&2gVd?yko9; zz#5ZAY_USZG0<00z%IMnHXh^Wl%g4jz<=~l{$sLhq4rmdKBb)=^VL^hbNl8iUVZTs z;`SD+z&Bn9L30?Cg|jF zdctyX%sbCNqIEOIZc9IOT%5h(|NZr+yx83EUhGMIj}0B$+mX%n1>JhZ*I#_j`PDVI zs|~N-T(LYnW^s7R`yYJBlZW?s`J!VOgU~DQZjOWyq}HqZcFKv8q}P|~J#~jgW*-eE zWW89|h%SPp_TJMrBXJyo!oAr6_fC&68i)yug)$1IYUeOlG8`x-SBIIYq{UqSQ{qNc zp^6|yK&z@~!YG4MLcbbQBrEXFQKAg{#{fw=j-MTI^yCEHh>H>w$0w(hXt{o~=HT8_ zmiLZ%^;Jtuqh$P+QHT-4NGz5f|j}dY$VW84f!kY2+Zt zUhPn|Hq^?>Sz66wTAO;tCrpx&na#02>rr|vF%VNG#zb~rT+RE7WIa!-*G)w08Lj1h z60>Cp0i6e-(~ z-ce49kX4l6;RO+2#ZSgCoy};jHk7gwaYU+4ax}xxv)y(SbxhMVIOoYF6Dnm>RYRSz zR_c}-gP>}EzE~w@#VS&}YinqH)8Ksr&hPR0RtuGQKfvF`u;m?zzm7?59iA#E*BB?R9NqfWLj4N0VPqAth4-9R9}ixi-dhYreLfX2ej7s#?#bZd=~>lNiwuEw&vM; zw6<6Ux+F>p7~`;}V05N+j;2whEd5x~VMUpn6rqdcu|sR9Y3LQY#2$)1cJ1ax- zYFIMPVvODAtM9s}N-He&|EexcmQoJjZ%AJ zVoFKkv5dI2ed|!6Cq`BK*ENuIj~BgjrVGDc?JkHl)j|jmtuq)cLTg=PhP}6Vr*YO` zY>isYA^<1~RIUavon*SC64q*F^EoyKsZCU_W=h%j!`Ne#qA8iyI-K)(l02(gp`Auy z>QG;1JE@4UZciaKZ%4pMES#=5d|h_g@s)&OBp$*VQzPdR##B7Mv2r(v5Ou+5P$7{M zkP^xZ^_CJzW1v`rYYg7F8X2cZlJ|@E4mX>i6=W?j8b)czFl#5w=W~`v$1LYFn%NPP z)k=DC6ifkc9R~*o933BFy_gISmj_ISo)kyC)-C8oF&pXiy>E2Bd=3}v=jA6KVe5<+R^!}ad*$F(sdp0PI&3RTcfdML@R?) zM)VK$_wA7X(zCFH+8x0ZX497MJ$cNbH~ezD;OkG%`T0*?aWI*3b2#Jq@`zcOkjErZ z)CKx(WE@A9^CeBw(6lYyInMhlAsbpxa1F|PSx2UzQ^B{6rZMEwGB2&fHz~ysp^u7? zdt&IxWn>s5IcZ^W1Wh+~GXKaBQzDEbTe66#av}^Jx;X;Vk|_l3*v7(UOfq*>PN+RG zF>egdA0Bc4cq#&*TI-Clg_1cwa2zcT@y4_1Mz+Ji_00{TkF;*ia$;y~AzQeA|AD_=nMEg|hKdnZQxc3JvDx;lwmquRj9HPiLphIa z8f>cB+BxetZIz`ZQqIg9%{CV~^Zh%Qb^RRqYC1u>^mDo6uK z-zNoq3IzqCiij4=ph0jYf?E|Qm?{I)lmw$vRSw@rmPW*DXUk?$SxGk~Nj%8%Wn@82 z8lzL`a#7-1P2wC&6ZXF_3rG=NI{$o13{gx3ZBtXZ3Z+Uiy7Y)k|A+MRpzMAjyx(P? zvpCQ7B=)6HQoVWq!U-WT^do)W$%Y0IT9g&R)EI-UEY=8eG{s0r;-d2*5RAc@C}}ri zWHBkIXOlB3ibGqaj2kmuj@PmGItd>wj!z; zg(LbNa$r$qX2zhBq-L_!Y*M1PmZ&V(vFFxzY-6U%Vk~j4rLE_<)ts0k{WuVE!XUrj zTvfdDLq+I!gpe3FZ|QE%X%-9S^CNNYDd~$(sic0V?t}?jUkni2i2D%hxriy=5%*{Gzwb5ZZF)t)dh#m>`YY?yjJ^H(;9>R$Xl zet-K{%Q#Rz0W;=O}xJ^-2YXH`aJ>U>&X3k@2S12dJlBTbWi3Y z&=%n&@zp-^`{{h0l{jBDOg`zokwH(@W^x!*IT2DKX2FK(EM^!Hgyp!n$4`|3(yVEC zczQ%tS)5jEoWsl(q^jAQd&FcT#v_%I;HtD7Xq1tAPSrEP&BchxP#cYS$PCKP1kIZj zc(DU~eIWW#b|OjE6I~p~Qg<_TwHL}mPFSTS zwfZmd*IqckXJ*MclQpG^B9%u+4mr+hVi@VWfkl!{URzZ-C%tlACk6vsH+!SeB&vzI zPhqVg`mpaPo2V}0Zk54|Q!-Rg#Uye61`R35p~EOrh}f#y4|8RIpip?UEqMJ>S*Wx_ zn+j|NA#u6$Tz7#V|Kz8fe)bu8?0NP1&v||Emd`%j^2OO}b}@0?ZD=aP_kZ(uc=Yfw zu3qA?+}zyot1q8({>A6KefJ3uA3fpczxV|vR}49Fd2=JzRf|ZkjdTWg-A0`IVUYJ- zD8oBzsmZ8uWR^9qb}Uk6mLkR^o-P}ntXrrmj+;yqHoQKVanQ~=Y8*5*L`~l9(2W5b z`RNb;h_lyknAsH%kDu}EH-C$|b%bt%ZXG}Wi$CXo|D%7*`O7cZy?Mdk`h(wRJby#a z5g~#~k~mPNRFP!xUf#^c8tPfia<#;2M`as~&f?~^7V8|fv2u?XM_t$0vUZqaq)0?T zmixf6o%8`+=-p|)e8@ZR9P=lC{7)Fh zk#9U$(ySJI``xEJUDf>d_rA@^yC3rB|M-u%czcP-3KIjZYYEPPb5t0TcHH)XgY}HM zq|6rc6$i%;`N8l1bw2p$J5;sfdUwU;B;L#(h<41TByO0HKx2UE0FiZNcR++{60JWOqL&lpO z?Q*`y#CB;!GM9=?*JE>HeR{%nwQ@3JLQ($XD;}!dze^|_$g?Did1BVXmHk|TTsfPl_Kd(DBa0m zNH`)jO0RJ3DYv&BTCHhUYn(FF*5GiAI-{EkjiU3K&tANh;grq<1Gk$EE< zQY%d`iPl(Vx+Uv|YH`SNwq}0vh?qxQYpC6v`D{T>4Jtbp0ghLPERP?v&XL98A?qMy zq($4(Z#E2m$Le53$eHbSz@J^yC73N%oE#ssm@iqkEp>a$)*kbAmr>&-2gipzet3$R zjWm_vXjv2b9ez+OmM8q~cfQ3*lkq9=bdbT-(GYolcEjt7b1GL;wH3)^c5z@xp55ja z9|q>j6(M9U&Tmj5a@x+B&FAub4<#XyGRb>F-;=#Zg@`4i6Bs3=nQ+fgXe7ihTkwz| z%GznP2rA>y)2GP%_=q}#ZW?su*rvd(9}DU=lgl2MVq`Ow0p)3RhYt~b`-1-BbL{RM zt0Gwib`tBRc8HnfUEY#*%~?|NN(;J`lFCfM6DQQCR^)8(1lgmeNZO~QJSj!O zFfu=JJUBVx?e#6b-_XYalQp&s_XQ=Hh^0pptx-7%dNu@9?P%Lp2Izjn!Y-+r8dOEl z6(JkOU1D>yAq_ndLpSb-S0kIZuV{59DnlRNNUEl(xR}p*VJsg!dceQ+Z~Ot@|G{tY z&WBI=#(U5B=YRSmRv~kmJm;h4o4@xrdGNj8m!bij(Bi%f}PD-yITI6 z2{6u>&nw2wCB5&sc>ap*#U&4pk2zT`_{Mwh^62p+&R)La&DmSHe$7j*(0ydr8_uuK zdGPdrtOwp)-_j4iq&wU3;>(wu?auMZV|~XmH&kYhZ)OZ+a@dh}8%D3`Qe>ktb^8Ej zGcM1s2^iK*%TYb&>ijidzI@Fv>|wOoynxoe22A>1Uc&OhbzmtU~UlKy$|#SyjfP|Z;5Cv?H^=%nTM{`z;R zzxhpm^rIg!_B}_-BbN41-q$6`tDPezjmfn~7ET<28mFry@fN5?=9&h?n$vF7;$qM2Q#$x9vk9 zq{ujqjDw(ivlYzjFm!bNj*tZ_J@^5i8loFG8hW;U&$in!j$W|JrJpp}hHPgfR}-l4 zG0=^P-4LWlK4w~H&?;ftn&17`zQ^ILpJO6^S^K)(oxZXzAhX*X4o-l4AF&R>-$XsJxBq`1H)t0l%9ZFl)3kOC^Rie>U zwZ&m@RtCL(6ndssrkFAmsu)a^Qp{#Gj~_qe!RaZxJ~DWZ(Q=A+W!9CvN5_GjJ5EoR zoUFb<97g=masJ?d92HhuxY+U8o44HFT=C-ND_*^N$;I^rFJ690CKKXFU0EK6$hVKy zm{vQF&mdOw~kjIzh&dSe2<|gZ8vmRmwfk|AMxS$ zK4N})%Af!FpYiJR&+uKDy{ZUG>PnQBv@$sgRZnHX*Nfc&t7_S!#3%$&pGaQ1uXRc1 zYNgReQz`S6nU1R}8Y`bcKohgt)9O^70zk2#zwhX;)2txpER+s~bjNEUAc!bkgI0__ z5YsdlDyZyk;AXQU#6(@Y5)_ik1BVtmrcx+vN{wWxlFjBWU_+sOrK!hUo(F3!&N-5` z1t%_cFDqB1XcM{!FL^&Jq*Si#4FJVJ?8N28=shtde2OAU7ilDwI#~JtN+qYsQa|H` zfS3|{k#V9sj0%?RtdMwZ;e*OOiZ$i?i|$Gmx~ko?--Q-iS&elDA2K-^5`uq^IWdkM z5rcEK%oEik@LDF!@qPQuHDt`&N|9*>uw6C=~^H z3O|)mq$%$tlQP;mTveee*@yZmgbG@#hYBq)SEaglMi zzXE=mlNX9!8U4#lH;d^)Wym2Dy(bo0s4YRE5T~jNjj^%#I%IyOt;JyXwR#f)yw|pv zMJzd+LWC4;Kx-pZ@LUWiO5t41^5BRceE+ZUJKz5{b$!I?>4&`g-ZxoPn$@ggR$Ic@ zqm=Ap{OH+jw_ILa;Jwrm`Z(Z2$IbSZi%n0j4Y6*}m1XEFX0FC*Lykh>byY>n8wAJ{OvF)7WhmX-J zvz)gyt}2gyqOBE`lYM|HbLk;eVp^o*=JEog47SoZ2QiM=YDP0#W15P{NI!HWrD>an z+B%L7k9l}{%5Jm6?-V(1rD`362aHR!vq(&(A|)jp2}i~%O?Tz#^#ZeS7^{g?48ch? zny#eEF=X=1IotjgKaO%f(~jspe)Nn(VzgneF<31``@wsZ)y!5)7BeRV(8Cq$gE_Oh z#=5yI0%07`amS*u%$E)IqGrCBu~^Qrts#s%f*lzW%yKO+EL-7Ri!#!)nxi6!M!4?@ z&XP-I&qPs*tn3~ootcD!$?;4{oT@vldg3dBk-l$;Dld&pEDj}zlte)Yg1yNRTY74< zF1WrFWsxYjU#kSKW=(M@6)cHS8DsK(LDyCn@yqP{Y2Dx=XUp>wI@ zQ4qB(%sDGm)Qlmq9eb`ex9s|!S?y??X67=LqL?8x{n*oo5vN3yw^c>3hA|30s1F{3 zr*;)NXKXg&#Ma_=n>w&E;DeVTm{FyU0EU#=^gTD#j-!5tX>GyWhy!tE9gDgmB50ND zYn+qbNK%k)G3QVT99mwcF+dUr`{)zOdp0}I?RLXzyTI0!Y?4xv{$-WO<4Elsr>iyg z(a7z^CBEx8IyzuJ`!0`85Bbh_K9ba*_atQyCX5!EfHK8Uk%WMp1LO#%Y?#xA&|i`I z9cdg1eMe^uH`h0eG4cG<&*-kMc(h({FrP_3OpL{;XNcK{xY>ElUh-}gg~ z(zjfm6H2wklpxQk;FG>4z;X}BE`6ALe*0Hb&gxE2l}ZM|#ir5$t0%q_so=O|(;pY1+no>MAfLAqD(uI`8wAwRK4l|xXvXOId(7MPIZR}N565&}S5dko?|!dTgy)R56)}rg zZ**p^K&MRI&gd<89q~Dnv?F@WylJu8p|YdV6)N_G?1)w~8iQ3yhF!A5MMrSibKKU< z7b^~zYqrC{$?+0q3;E?jE)*19Is(~0SJP+A{wDmlJePYT81epSHq_c)Fvm4A1j zicxUES=zwGkWqTRb0OX2ub~rEzB9r7i--vSYJZjcF{?t=sA(!k@}BKx$B7TD=5tQg zYu?OeXlv<)fo^xpaNL#Va5Iw|!{_>n*J94$z@smIMG3VE}{OJ4wGkC0m=Wk!~=H`mS zG{?*vo;-WPN2@u{PEYxr@BcPUJHxIH`SHiU;LTtDl-r99=lzC@+cQqzyrc`zW%%?L zf5z(XPfr3l0}6a?_wxW(<*PHiz8uNB_(Jz(4p0|1D>)Uh@8vkN8jj zqyHT83WhD#)PTmghBud2{PNQ;S*3wECgycRO-srK6*JCFM!(XNY;37`NgS=0v~`Qs z4bHYWBkO5WGQ6<}DM9vCg0GVOlN_9=Bw0|`kpnG5U8R&55yL>EEz9MCw{N~=c6-Hg zv1U;@`tC|FWkbg0p5OcaZ?GMX%w2#ma$H+<>u7X9=K)tKjH!#!%rIZ9SuPJ) z9;~rp;OcCLF$>15u=5%72M5$D^X{{6uzvCkr6P8>L5Cf#GN`m58poD|k3F?bn4Abv z&IKo{nizKUp{GlkIBXfOu4%)npiMp3Z+f;}N9R5H@DN+oq^x=V#Y@Ir;GHLq=5#H+ zfFVFr)2arSH2u|gN#$fT*$6c&2(z5*#Nmwtr`M=?RP6V5Xj|G*Nk{EfdE(gDabx!vE zS_byHq_I-gSUY33IOgZ&4HMXOqB zTTxp}RvOz>g?N%->0pF5*JPEM4>exF(?^d{+YNK$IXzsHZH2$SMb9dZzx6)L)d?wC zR!&jRW|C^rnzn7Zw3%@<%oYta>8%tD((aJ2g|k}T|6x9H)QeEDL_^-c!BRr5_A zJ~^Uk*L?oP3qJkHU-JCrYu?-pxcLze_C8jP))kdCVwjCvg7+jcwrM#&TJ!p5U^Z*G zPKiyo17nIYA+p_#R90hLjnG)v9 zqmwl$)%3n)JejdgaC6n+`+?jwR3YO14dKPW&~Mp3ZuoEhtIv6GbjYhK&5wWhF{h88 zaq(u$@zDxZIZXEWAitM(wTP4|QCEhs?@6OjHz;RCV+=keR7nk|Jnnmf(Uy!B%3VtQ z^yfe4?Q_lf#lWY(`h@M~iu~}HoFZckl(JO`6Qn@SQBrF*?mvSV0%J^!Aux_3!{7-i zVXY>4xyO_iwD{;FgO7|M6ADo%qX`kADaMjk)Rv@b#_Vv(F~meSL@sV_`QrI=4qL~w z_uiwnR%RbDpp$3aRLt9kbyeeRfZS0tqWTRsd1Cf5v#A@xbePvhgdZzrP*sFkmyM** zbV50eQAIG%ndAdWYnH1utD|EM4-T2ta~>Z*q+YD~(Leb=`G^1T4|(#<-{YP4zlE_C zhYuc!U|8ORJ`IHgsI@Kw{8&=J z6?I*)S}kz30)o&Lf>e*ywW6|uqjn}!*#wMWoqRqw9p`6nc=6&3{MjdTqvxmRpYr0> zE6%SsygEDM_VyNxVtu&a@NmVmCl5I~Tye0Tv!2h0en16ZLJ}HfMHrdHrM~Y8KFT|~ zm>_f|RYuwv^5`WfF!nNcN>S(#l(SEYq#R{_SQ3D{+iOy+=!XL~+grwNE8XJWb9HsW zuJ2IB6pE;zkQ0fZz-c*4`$VCC${95#SLPN4E3Wf?wrf;{$_X1QlF#HulWZoYftJMD zG%Wps{%qibZ#<+)5@ii$&gVOifBl9B?|#Umqa%J{EwS@xompgy2|^OgX{w4-1TsM- zg3^)(Ekt8BZU-&&^Qbx-E;7hVA7g&)>Y|WIp5O)eDvumNN&9;puzt@cz5+W0R%ZZcr|u zoebw=5VZX?J25Kl=XWV4k{7dUOo|X9IoC2r%UNg@&S6~KcV%l)PK$`5%9&1;QF4`raU_o8SIY*CMOz`bqJ<7X(FaQ595T(9X_K)I>uNC% zDk}uj5`4;gLZjLDi{~<1%PH+=r}t-|m8+=h2I`vH8e*Z@rji)Y_e=*di?%QYex?-v ze$J4Ea-mYflxo5z0a7dne1Y9-{pGw{Zu~kn){SDD19-bwRBv&^#7L{rse#+&Yir1YNtDN zC#UF9rUu>Y6V(Rka-V3Z)1NVskM%v8>O_%L`|Bn1d|iZkseR1*Ad4zPa)E;7a-Zh% zK2Lj0dm@$E2Kn4&Chv%$XGk8aHA!3gA+YT{AqhS_JB79yT^SLWjhI0yXJ~6p>yV&R z@Z=Dwa*u9WG#XPovK7Mhtggh|VKj|(R7RoGNEpOO;@o5<(o&%(Pair6l_r;9pe<$& zCNM&=NhxO}(H%#e5?v`}gamef?mk`nEP}1~K?pQO<4Zx_+s56^+*Q%rbh@j<)yd$p z`wCeiCHYx=p|F@-cGOAjtDP_~=8TUCV;ly>;k>3AR&aGey1Zm&Z}}kacy?@vVI;*4 ze?5R7B@o)oP%)9lj@{;(ZrD&a5+-eD0c9h79O;6>$AIcJqfrdbQ5z>g25m7_CH3E0 z_MK?K-y7Egm6$jRB`AhKOp)4Hlor~!kMgD!okZKw@7ZlO%+-v=b!l*!PjMUi3fCplb8rBrahlk8<#ddp*A9`|>d4o<7A4Dr!t>*;Q zF~kjH=Zi+27pq7BZx3YwE>}X1SzZE-+0^G75{UrL!uI zEOpE3$-A^}PKc6r(z*guGcb@7>=L*vABv?Wq>7XbK7vn3?@20Y^768#q!gteA!4&8 z6>LM!(xa|Q-{QVMwzzFlW|I8n@Sqf0Plqm5kZg%qF#EX(6)BB`2)dxS$0R5sr8U`< zMJ!JVdqvh$A0Jdoa4=IEa0p3Wa8^U`tkeRH!-q^viptHXTt^o?*4Eev4K+F$e98

    }fnk;_)f-bX!bQA^c6dA=W;VVv9nmj#K3%5%?f= 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