├── static ├── script.js ├── favicon.ico ├── pokesprite.png ├── touch-icon-120.png ├── touch-icon-152.png ├── touch-icon-180.png ├── touch-icon-76.png ├── userdata_as_csv.js ├── editdex.js ├── progressbar.js ├── style_mobile.css ├── dexpicker.js ├── pokesprite.css ├── dexes.js ├── style.css └── pokesprite.min.js ├── Procfile ├── erase_db.bash ├── backup_db.bash ├── .gitmodules ├── todo.md ├── requirements.txt ├── usersession.py ├── templates ├── baduser.html ├── badusersforcompare.html ├── home.html ├── login.html ├── compare.html ├── layout.html └── user.html ├── working_on.md ├── setup.sh ├── .gitignore ├── user.py ├── pokedex.py ├── Readme.md ├── license ├── test_user_operations.py ├── livingdex.py └── users.py /static/script.js: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Procfile: -------------------------------------------------------------------------------- 1 | web: gunicorn livingdex:app --log-file=- 2 | -------------------------------------------------------------------------------- /erase_db.bash: -------------------------------------------------------------------------------- 1 | !/bin/bash 2 | 3 | heroku pg:reset DATABASE 4 | -------------------------------------------------------------------------------- /static/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/peterhajas/LivingDex/HEAD/static/favicon.ico -------------------------------------------------------------------------------- /static/pokesprite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/peterhajas/LivingDex/HEAD/static/pokesprite.png -------------------------------------------------------------------------------- /static/touch-icon-120.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/peterhajas/LivingDex/HEAD/static/touch-icon-120.png -------------------------------------------------------------------------------- /static/touch-icon-152.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/peterhajas/LivingDex/HEAD/static/touch-icon-152.png -------------------------------------------------------------------------------- /static/touch-icon-180.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/peterhajas/LivingDex/HEAD/static/touch-icon-180.png -------------------------------------------------------------------------------- /static/touch-icon-76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/peterhajas/LivingDex/HEAD/static/touch-icon-76.png -------------------------------------------------------------------------------- /backup_db.bash: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | heroku pgbackups:capture 4 | curl -o latest.dump `heroku pgbackups:url` 5 | -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "pokesprite"] 2 | path = pokesprite 3 | url = https://github.com/msikma/pokesprite.git 4 | -------------------------------------------------------------------------------- /todo.md: -------------------------------------------------------------------------------- 1 | # Enhancements 2 | - Download-as-CSV 3 | - partially done 4 | - ORAS additions 5 | - Achievements 6 | - Could be easily defined (all Kanto starters, all Fire starters, all bug Pokémon, etc.) clientside 7 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | Flask==0.10.1 2 | Flask-SQLAlchemy==2.0 3 | Jinja2==2.7.3 4 | MarkupSafe==0.23 5 | SQLAlchemy==0.9.8 6 | Werkzeug==0.9.6 7 | gunicorn==19.1.1 8 | itsdangerous==0.24 9 | psycopg2==2.5.4 10 | wsgiref==0.1.2 11 | -------------------------------------------------------------------------------- /usersession.py: -------------------------------------------------------------------------------- 1 | from flask import session 2 | 3 | def logInUser(username): 4 | session['username'] = username 5 | 6 | def logout(): 7 | session['username'] = None 8 | 9 | def currentUser(): 10 | return session['username'] 11 | 12 | def userIsLoggedIn(username): 13 | return currentUser() == username 14 | -------------------------------------------------------------------------------- /templates/baduser.html: -------------------------------------------------------------------------------- 1 | {% extends "layout.html" %} 2 | {% block title %}LivingDex | No user by that name{% endblock %} 3 | {% block content %} 4 | Sorry! LivingDex doesn't know of {{ username }}. 5 | {% if not session.username %} 6 | 7 | Maybe you'd like to register for that name? 8 | {% endif %} 9 | {% endblock %} 10 | -------------------------------------------------------------------------------- /templates/badusersforcompare.html: -------------------------------------------------------------------------------- 1 | {% extends "layout.html" %} 2 | {% block title %}LivingDex | Invalid users to compare{% endblock %} 3 | {% block content %} 4 | Sorry! LivingDex doesn't know of either {{ username1 }} or {{ username2 }} or both. It's a mystery! 5 | 6 | {% set betterUser= [username1, username2]|random %} 7 | Therefore, they can't be compared. To be honest, I prefer {{ betterUser }}. 8 | {% endblock %} 9 | -------------------------------------------------------------------------------- /working_on.md: -------------------------------------------------------------------------------- 1 | # Getting Ready to Work on LivingDex 2 | 3 | I mostly wrote this for myself (so I can remember how to get started), but this should help for anyone contributing. 4 | 5 | - run `setup.sh` to grab submodules and generate sprites 6 | - install the [heroku toolbelt](https://toolbelt.heroku.com) 7 | - run `source venv/bin/activate.fish` to activate the virtualenv 8 | - install requirements with `pip install -r requirements.txt` 9 | - run using `heroku local`, then open `http://localhost:5000` 10 | -------------------------------------------------------------------------------- /setup.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # Setup script for LivingDex to prepare dependencies and set up the 'static' 3 | # directory for Flask 4 | 5 | # Updata our submodules. PokeSprite is a submodule of LivingDex, so it will be 6 | # downloaded & updated 7 | 8 | git submodule init 9 | git submodule update 10 | 11 | # Activate virtualenv 12 | 13 | virtualenv venv 14 | 15 | # Generate the PokeSprite spritesheet, CSS and JavaScript 16 | 17 | cd pokesprite 18 | ./pokesprite.php 19 | cd .. 20 | 21 | # Copy the PokeSprite spritesheet, CSS and JavaScript so that Flask's 'url_for' 22 | # can find them in resource lookups 23 | 24 | cp pokesprite/output/pokesprite.png static/ 25 | cp pokesprite/output/pokesprite.css static/ 26 | cp pokesprite/output/pokesprite.js static/ 27 | cp pokesprite/output/pokesprite.min.js static/ 28 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Database 2 | *.csv 3 | 4 | # Byte-compiled / optimized / DLL files 5 | __pycache__/ 6 | *.py[cod] 7 | 8 | # C extensions 9 | *.so 10 | 11 | # Distribution / packaging 12 | .Python 13 | env/ 14 | build/ 15 | develop-eggs/ 16 | dist/ 17 | eggs/ 18 | lib/ 19 | lib64/ 20 | parts/ 21 | sdist/ 22 | var/ 23 | *.egg-info/ 24 | .installed.cfg 25 | *.egg 26 | 27 | # PyInstaller 28 | # Usually these files are written by a python script from a template 29 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 30 | *.manifest 31 | *.spec 32 | 33 | # Installer logs 34 | pip-log.txt 35 | pip-delete-this-directory.txt 36 | 37 | # Unit test / coverage reports 38 | htmlcov/ 39 | .tox/ 40 | .coverage 41 | .cache 42 | nosetests.xml 43 | coverage.xml 44 | 45 | # Translations 46 | *.mo 47 | *.pot 48 | 49 | # Django stuff: 50 | *.log 51 | 52 | # Sphinx documentation 53 | docs/_build/ 54 | 55 | # PyBuilder 56 | target/ 57 | 58 | # virtualenv 59 | venv/ 60 | -------------------------------------------------------------------------------- /user.py: -------------------------------------------------------------------------------- 1 | from livingdex import db 2 | 3 | # This will be replaced once we have a proper relational database for pokedex entries 4 | number_of_pokemon_str_entries = 1000 5 | 6 | import flask.ext.sqlalchemy as flask_sqlalchemy 7 | import sqlalchemy.sql.schema as sqlalchemy_schema 8 | import sqlalchemy.sql.sqltypes as sqlalchemy_types 9 | 10 | Model = db.Model 11 | Column = sqlalchemy_schema.Column 12 | String = sqlalchemy_types.String 13 | Integer = sqlalchemy_types.Integer 14 | 15 | class User(Model): 16 | id = Column(Integer, primary_key=True) 17 | username = Column(String(20), unique=True) 18 | password = Column(String(20)) 19 | friendCode = Column(String(16)) 20 | pokemon = Column(String(number_of_pokemon_str_entries)) 21 | def __init__(self): 22 | self.username = '' 23 | self.password = '' 24 | self.friendCode = '' 25 | self.pokemon = '0' * number_of_pokemon_str_entries 26 | 27 | def __repr__(self): 28 | return '' % self.username 29 | 30 | -------------------------------------------------------------------------------- /pokedex.py: -------------------------------------------------------------------------------- 1 | import json 2 | from collections import defaultdict 3 | 4 | class NationalDex: 5 | def __init__(self, pathToNationalDex): 6 | dexfile = open(pathToNationalDex, 'r') 7 | self.dexdata = json.load(dexfile) 8 | self.numberOfPokemon = len(self.dexdata.keys()) 9 | self.pokemonNames = [] 10 | self.pokemonSlugs = [] 11 | self.pokemonForms = defaultdict(list) 12 | 13 | for i in range (1, self.numberOfPokemon+1): 14 | dexKey = str(i).zfill(3) 15 | name = self.dexdata[dexKey]['name']['eng'] 16 | slug = self.dexdata[dexKey]['slug']['eng'] 17 | forms = self.dexdata[dexKey]['icons'] 18 | 19 | self.pokemonNames.append(name) 20 | self.pokemonSlugs.append(slug) 21 | 22 | for form in forms: 23 | if form == '.': 24 | if 'has_female' in forms['.'].keys(): 25 | self.pokemonForms[dexKey].append('female') 26 | continue 27 | self.pokemonForms[dexKey].append(form) 28 | -------------------------------------------------------------------------------- /Readme.md: -------------------------------------------------------------------------------- 1 | # LivingDex 2 | 3 | In Pokémon, a [Pokédex](https://en.wikipedia.org/wiki/Pokedex") is a device given to a player early on in the game. It's used to keep track of how many Pokémon are seen, and how many the player has caught. 4 | 5 | For some players of Pokémon, simply seeing (or catching) all the Pokémon is not enough. Some players want to have one of every Pokémon. This is called a [living Pokédex](http://bulbapedia.bulbagarden.net/wiki/Living_Pokédex) 6 | 7 | LivingDex is a website to help players track their living Pokédex. 8 | 9 | If you're looking for the website, you can find it at [www.livingdex.xyz](http://www.livingdex.xyz). 10 | 11 | ## Getting Started 12 | 13 | See the `working_on.md` file in teh root of the repository for instructions on getting started. 14 | 15 | ## Libraries Used 16 | 17 | LivingDex is written in Python, using the [Flask](http://flask.pocoo.org) web framework. 18 | 19 | For the Pokémon sprites and data, LivingDex relies on the [pokesprite](https://github.com/msikma/pokesprite) library. 20 | 21 | ## License 22 | 23 | BSD. Check the `license` file at the root of the project directory. 24 | -------------------------------------------------------------------------------- /static/userdata_as_csv.js: -------------------------------------------------------------------------------- 1 | function prepareCSVLink() 2 | { 3 | var pokemonCells = document.getElementsByClassName('pokemonCell'); 4 | 5 | var csvString = 'Number, Name, Caught\n' 6 | 7 | for(var i = 0; i < pokemonCells.length; i++) 8 | { 9 | var pokemonCell = pokemonCells[i]; 10 | var number = pokemonCell.getElementsByClassName("pokemonCellNumber")[0].innerHTML; 11 | var name = pokemonCell.getElementsByClassName("pokemonCellName")[0].innerHTML; 12 | var caughtState = pokemonCell.className.split(/\s+/)[1]; 13 | 14 | csvString+=number; 15 | csvString+=', '; 16 | csvString+=name; 17 | csvString+=', '; 18 | csvString+=caughtState; 19 | csvString+='\n'; 20 | } 21 | 22 | var downloadLink = document.createElement("a"); 23 | var csvURI = 'data:text/csv;charset=utf-8,' + csvString; 24 | downloadLink.href = csvURI; 25 | downloadLink.download = 'dex.csv'; 26 | downloadLink.innerHTML = "Download as CSV (experimental)"; 27 | 28 | var container = document.getElementsByClassName("csvDownloadLinkContainer")[0]; 29 | container.appendChild(downloadLink); 30 | } 31 | -------------------------------------------------------------------------------- /license: -------------------------------------------------------------------------------- 1 | Copyright (c) 2014, Peter Hajas 2 | All rights reserved. 3 | 4 | Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 5 | 6 | 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 7 | 8 | 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 9 | 10 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 11 | -------------------------------------------------------------------------------- /templates/home.html: -------------------------------------------------------------------------------- 1 | {% extends "layout.html" %} 2 | {% block title %}LivingDex{% endblock %} 3 | {% block content %} 4 |

5 | Welcome to LivingDex 6 |

7 |

8 | A website to help you manage your Living Pokedex 9 |

10 | 11 |

12 | What's a Living Pokedex? 13 |

14 | 15 |

16 | In Pokémon, a Pokédex is a device given to a player early on in the game. It's used to keep track of how many Pokémon are seen, and how many the player has caught. 17 |

18 | 19 |

20 | For some players of Pokémon, simply seeing (or catching) all the Pokémon is not enough. Some players want to have one of every Pokémon. This is called a Living Pokédex. 21 |

22 | 23 |

24 | Interested in starting your own Living Pokédex? LivingDex is here to help! Register an account for free, and get on your way to Catching them All! 25 |

26 | 27 |

28 | LivingDex is open source software. Patches, bug reports, feature ideas, and more are encouraged. Check out the repository on Github. 29 |

30 | 31 | {% endblock %} 32 | -------------------------------------------------------------------------------- /static/editdex.js: -------------------------------------------------------------------------------- 1 | $('ul').click 2 | ( 3 | function (event) 4 | { 5 | var clickedElement = event.target; 6 | 7 | if(!$(clickedElement).hasClass('pokemonCell')) 8 | { 9 | while(true) 10 | { 11 | if($(clickedElement).hasClass('pokemonCell')) 12 | { 13 | break; 14 | } 15 | var parentElement = clickedElement.parentNode; 16 | if(parentElement != null) 17 | { 18 | clickedElement = parentElement; 19 | } 20 | else 21 | { 22 | // No clicked pokemon here. Return. 23 | return; 24 | } 25 | } 26 | } 27 | 28 | 29 | pokemon = clickedElement.id; 30 | 31 | var requestContents = {username : user, pokemon : pokemon}; 32 | var requestURL = '/uncatchPokemon' 33 | 34 | if($(clickedElement).hasClass('uncaught')) 35 | { 36 | requestURL = '/catchPokemon' 37 | } 38 | 39 | $.post(requestURL, requestContents); 40 | 41 | $(clickedElement).toggleClass('uncaught'); 42 | $(clickedElement).toggleClass('caught'); 43 | 44 | updateProgressBar(); 45 | } 46 | ); 47 | -------------------------------------------------------------------------------- /static/progressbar.js: -------------------------------------------------------------------------------- 1 | function progressBarRGBAString(percentage) 2 | { 3 | var unitPercentage = percentage / 100.0; 4 | var distanceFromHalf = 2 * Math.abs(Math.abs(unitPercentage) - 0.5); 5 | var nonFullComponent = 255 * distanceFromHalf; 6 | nonFullComponent = 255 - nonFullComponent; 7 | nonFullComponent = Math.round(nonFullComponent); 8 | var redComponent; 9 | var greenComponent; 10 | 11 | if (unitPercentage <= 0.5) 12 | { 13 | redComponent = 255; 14 | greenComponent = nonFullComponent; 15 | } 16 | else 17 | { 18 | greenComponent = 255; 19 | redComponent = nonFullComponent; 20 | } 21 | 22 | return 'rgba(' + redComponent + ',' + greenComponent + ',0,1)' 23 | } 24 | 25 | function updateProgressBar() 26 | { 27 | var allPokemon = document.getElementsByClassName('valid').length; 28 | var capturedPokemon = document.getElementsByClassName('caught valid').length; 29 | 30 | var progressBarFilledElement = document.getElementsByClassName('filledBar')[0]; 31 | var progressBarText = document.getElementsByClassName('progressBarText')[0]; 32 | 33 | var percentComplete = capturedPokemon / allPokemon; 34 | percentComplete *= 100; 35 | 36 | var percentCompleteText = (percentComplete).toFixed(1) + '%'; 37 | var percentCompleteFilledWidth = percentComplete + '%'; 38 | var percentCompleteRGBA = progressBarRGBAString(percentComplete); 39 | 40 | progressBarText.innerHTML = percentCompleteText; 41 | progressBarFilledElement.style.width = percentCompleteFilledWidth; 42 | progressBarFilledElement.style.backgroundColor = percentCompleteRGBA; 43 | } 44 | -------------------------------------------------------------------------------- /static/style_mobile.css: -------------------------------------------------------------------------------- 1 | @media (max-width: 520px) 2 | { 3 | #header a 4 | { 5 | padding: 16px 2px; 6 | font-size: 14pt; 7 | } 8 | 9 | #content 10 | { 11 | padding-top:0px; 12 | } 13 | 14 | .headerLink 15 | { 16 | border-left: solid 1px black; 17 | } 18 | 19 | .headerCircleContainer 20 | { 21 | display:none; 22 | } 23 | 24 | .headerSwoopContainer 25 | { 26 | display:none; 27 | } 28 | 29 | .headerSwoopLine 30 | { 31 | height:1px; 32 | } 33 | 34 | #topLine 35 | { 36 | left:0px; 37 | } 38 | 39 | .friendCode 40 | { 41 | font-size:14pt; 42 | width:90%; 43 | display:block; 44 | margin:auto; 45 | } 46 | 47 | .friendCodeForm 48 | { 49 | display:block; 50 | } 51 | 52 | .submitButton 53 | { 54 | display: block; 55 | margin:auto; 56 | } 57 | 58 | .progressBar 59 | { 60 | margin-top:50px; 61 | height: 30pt; 62 | } 63 | 64 | .progressBarText 65 | { 66 | font-size: 20pt; 67 | color: white; 68 | bottom: 30pt; 69 | } 70 | 71 | .csvDownloadLinkContainer 72 | { 73 | display: none; 74 | } 75 | 76 | .pokemonCellNumber 77 | { 78 | font-size:12pt; 79 | } 80 | 81 | .pokemonCellName 82 | { 83 | font-size:6pt; 84 | line-height:20px; 85 | } 86 | 87 | .boxTitle 88 | { 89 | font-size:18pt; 90 | margin-top:6px; 91 | margin-bottom:6px; 92 | } 93 | 94 | .dexPickerDexTitle 95 | { 96 | font-size:12pt; 97 | } 98 | } 99 | -------------------------------------------------------------------------------- /templates/login.html: -------------------------------------------------------------------------------- 1 | {% extends "layout.html" %} 2 | {% block title %}Login{% endblock %} 3 | {% block content %} 4 |
5 | {% if error %} 6 |

{{ error }}

7 | {% endif %} 8 |
9 |

Login:

10 | 11 | 12 | 13 |
14 |
15 |

Register:

16 | 17 | 18 | 19 | 20 |
21 |

An important note on security.

22 |
23 |

24 | You may have noticed that your password is not obscured with bullets. This is because your password is stored in plain text on LivingDex 25 |

26 |

27 | To protect the security of your other accounts online, use a different password for every site, especially LivingDex. 28 |

29 |
30 |
31 | {% endblock %} 32 | -------------------------------------------------------------------------------- /static/dexpicker.js: -------------------------------------------------------------------------------- 1 | function arrayCount(array) // what 2 | { 3 | var count = array.filter(function(value) { return value !== undefined }).length; 4 | return count; 5 | } 6 | 7 | function updateDisplayForDex(dexName) 8 | { 9 | var allDexItems = document.getElementsByClassName('dexPickerDexTitle'); 10 | 11 | for(var i = 0; i < allDexItems.length; i++) 12 | { 13 | var dexItem = allDexItems[i]; 14 | $(dexItem).removeClass('selected'); 15 | } 16 | 17 | var selectedDexElement = document.getElementById(dexName); 18 | 19 | $(selectedDexElement).addClass('selected'); 20 | 21 | var pokemonInDex = dexes[dexName]; 22 | 23 | var allPokemon = document.getElementsByClassName('pokemonCell'); 24 | 25 | for(var i = 0; i < allPokemon.length; i++) 26 | { 27 | var pokemonElement = allPokemon[i]; 28 | var pokemonNumber = pokemonElement.id; 29 | var pokemonNumber = Math.round(pokemonNumber); 30 | 31 | if(pokemonInDex.indexOf(pokemonNumber) == -1) 32 | { 33 | $(pokemonElement).removeClass('valid'); 34 | $(pokemonElement).addClass('invalid'); 35 | } 36 | else 37 | { 38 | $(pokemonElement).removeClass('invalid'); 39 | $(pokemonElement).addClass('valid'); 40 | } 41 | } 42 | 43 | updateProgressBar(); 44 | } 45 | 46 | function populateDexPicker() 47 | { 48 | var dexNames = Object.keys(dexes); 49 | var numberOfDexes = arrayCount(dexNames); 50 | 51 | for(var i = 0; i < numberOfDexes; i++) 52 | { 53 | var dexName = dexNames[i]; 54 | console.log(dexName); 55 | 56 | var dexPickerContainerElement = document.getElementsByClassName('dexPicker')[0]; 57 | var dexPickerDexTitleElement = document.createElement('div'); 58 | dexPickerDexTitleElement.innerHTML = dexName; 59 | dexPickerDexTitleElement.className = 'dexPickerDexTitle'; 60 | 61 | $(dexPickerDexTitleElement).click(function() { 62 | updateDisplayForDex(this.innerHTML); 63 | }); 64 | 65 | dexPickerDexTitleElement.id = dexName; 66 | dexPickerContainerElement.appendChild(dexPickerDexTitleElement); 67 | } 68 | } 69 | 70 | -------------------------------------------------------------------------------- /templates/compare.html: -------------------------------------------------------------------------------- 1 | {% extends "layout.html" %} 2 | {% block head %} 3 | {{ super ()}} 4 | 5 | 6 | {% endblock %} 7 | 8 | {% block title %}LivingDex: Comparing {{ username1 }} and {{ username2 }}{% endblock %} 9 | {% block content %} 10 | 11 |

12 |

13 | Comparing the LivingDex of 14 |

15 |

16 | 17 | {{ username1 }} 18 | 19 | 20 | {{ friendCode1 }} 21 | 22 |

23 |

24 | and 25 |

26 |

27 | 28 | {{ username2 }} 29 | 30 | 31 | {{ friendCode2 }} 32 | 33 |

34 | 35 |

36 | 37 | {% if session.username == username1 or session.username == username2 %} 38 |
39 | Caught by neither - Caught by {{ username1 }} - Caught by {{ username2 }} - Caught by both 40 |
41 | {% endif %} 42 | 43 | 72 | 73 | 76 | {% endblock %} 77 | -------------------------------------------------------------------------------- /templates/layout.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | {% block head %} 5 | 6 | 7 | 8 | 9 | LivingDex 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | {% endblock %} 18 | 19 | 20 | 50 |
51 | {% block content %} 52 | {% endblock %} 53 |
54 | 58 | 59 | 60 | -------------------------------------------------------------------------------- /templates/user.html: -------------------------------------------------------------------------------- 1 | {% extends "layout.html" %} 2 | {% block head %} 3 | {{ super ()}} 4 | 5 | 6 | 7 | 8 | 9 | 10 | {% endblock %} 11 | 12 | {% block title %}{{ username }}'s Living Dex{% endblock %} 13 | {% block content %} 14 | 15 | {% set isCurrentUser = (session.username == username) %} 16 | 17 |

18 | 19 | {{ username }} 20 | 21 | {% if isCurrentUser %} 22 | {% set friendCodeTextFieldPlaceholder = "friend code" %} 23 | {% if friendCode %} 24 | {% set friendCodeTextFieldPlaceholder = friendCode %} 25 | {% endif %} 26 |
27 | 28 | 29 |
30 | {% else %} 31 | 32 | {{ friendCode }} 33 | 34 | {% endif %} 35 |

36 | 37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 | 46 | {% if isCurrentUser %} 47 |

48 | This is your LivingDex! It keeps track of how many Pokémon you currently have in your PC Box in game. It helps you name and lay out your boxes - each section is the same size as a PC Box. 49 |

50 |

51 | To mark a Pokémon as caught, click it so that it turns green. Catch ´Em All! 52 |

53 | {% elif session.username %} 54 |
55 |

56 | Compare your LivingDex with {{ username }} 57 |

58 |
59 | {% endif %} 60 | 61 | 64 | 65 | 90 | 91 | 92 | {% if session.username == username%} 93 | 94 | {% endif %} 95 | 102 | {% endblock %} 103 | -------------------------------------------------------------------------------- /static/pokesprite.css: -------------------------------------------------------------------------------- 1 | @charset "UTF-8";/*! 2 | * PokéSprite 1.0 3 | * (C) 2014, Michiel Sikma and PokéSprite contributors 4 | * (C) 1995-2014 Nintendo/Creatures Inc./GAME FREAK Inc. 5 | * For a full list of contributors, view the project commit history. 6 | * Generated on 2014-08-12 22:56:37. 7 | */.pkspr{display:inline-block;position:relative;vertical-align:baseline}.pkspr>i{background-image:url("pokesprite.png");content:' ';display:block}.pksprspan{display:inline-block}.pksprblock{display:block}.pksprspan.display-over{height:1px;vertical-align:middle}.pksprspan.display-over>i{position:absolute;top:-20px;left:0}.pkspr.pkspr-faux-right{-moz-transform:scaleX(-1);-o-transform:scaleX(-1);-webkit-transform:scaleX(-1);filter:FlipH;-ms-filter:'FlipH';transform:scaleX(-1)}.pkspr[class*='pkmn-'],.pkspr[class*='pkmn-']>i{width:40px}.pkspr[class*='pkmn-'],.pkspr[class*='pkmn-']>i{height:30px}.pkspr[class*='body-style-'],.pkspr[class*='body-style-']>i{width:32px}.pkspr[class*='body-style-'],.pkspr[class*='body-style-']>i{height:32px}.pkspr[class*='apricorn-'],.pkspr[class*='apricorn-']>i{width:30px}.pkspr[class*='apricorn-'],.pkspr[class*='apricorn-']>i{height:30px}.pkspr[class*='battle-item-'],.pkspr[class*='battle-item-']>i{width:30px}.pkspr[class*='battle-item-'],.pkspr[class*='battle-item-']>i{height:30px}.pkspr[class*='berry-'],.pkspr[class*='berry-']>i{width:30px}.pkspr[class*='berry-'],.pkspr[class*='berry-']>i{height:30px}.pkspr[class*='ev-item-'],.pkspr[class*='ev-item-']>i{width:30px}.pkspr[class*='ev-item-'],.pkspr[class*='ev-item-']>i{height:30px}.pkspr[class*='evo-item-'],.pkspr[class*='evo-item-']>i{width:30px}.pkspr[class*='evo-item-'],.pkspr[class*='evo-item-']>i{height:30px}.pkspr[class*='flute-'],.pkspr[class*='flute-']>i{width:30px}.pkspr[class*='flute-'],.pkspr[class*='flute-']>i{height:30px}.pkspr[class*='fossil-'],.pkspr[class*='fossil-']>i{width:30px}.pkspr[class*='fossil-'],.pkspr[class*='fossil-']>i{height:30px}.pkspr[class*='gem-'],.pkspr[class*='gem-']>i{width:30px}.pkspr[class*='gem-'],.pkspr[class*='gem-']>i{height:30px}.pkspr[class*='hm-'],.pkspr[class*='hm-']>i{width:30px}.pkspr[class*='hm-'],.pkspr[class*='hm-']>i{height:30px}.pkspr[class*='hold-item-'],.pkspr[class*='hold-item-']>i{width:30px}.pkspr[class*='hold-item-'],.pkspr[class*='hold-item-']>i{height:30px}.pkspr[class*='incense-'],.pkspr[class*='incense-']>i{width:30px}.pkspr[class*='incense-'],.pkspr[class*='incense-']>i{height:30px}.pkspr[class*='other-item-'],.pkspr[class*='other-item-']>i{width:30px}.pkspr[class*='other-item-'],.pkspr[class*='other-item-']>i{height:30px}.pkspr[class*='key-item-'],.pkspr[class*='key-item-']>i{width:30px}.pkspr[class*='key-item-'],.pkspr[class*='key-item-']>i{height:30px}.pkspr[class*='mail-'],.pkspr[class*='mail-']>i{width:30px}.pkspr[class*='mail-'],.pkspr[class*='mail-']>i{height:30px}.pkspr[class*='medicine-'],.pkspr[class*='medicine-']>i{width:30px}.pkspr[class*='medicine-'],.pkspr[class*='medicine-']>i{height:30px}.pkspr[class*='mega-stone-'],.pkspr[class*='mega-stone-']>i{width:30px}.pkspr[class*='mega-stone-'],.pkspr[class*='mega-stone-']>i{height:30px}.pkspr[class*='mulch-'],.pkspr[class*='mulch-']>i{width:30px}.pkspr[class*='mulch-'],.pkspr[class*='mulch-']>i{height:30px}.pkspr[class*='plate-'],.pkspr[class*='plate-']>i{width:30px}.pkspr[class*='plate-'],.pkspr[class*='plate-']>i{height:30px}.pkspr[class*='pokeball-'],.pkspr[class*='pokeball-']>i{width:30px}.pkspr[class*='pokeball-'],.pkspr[class*='pokeball-']>i{height:30px}.pkspr[class*='scarf-'],.pkspr[class*='scarf-']>i{width:30px}.pkspr[class*='scarf-'],.pkspr[class*='scarf-']>i{height:30px}.pkspr[class*='shard-'],.pkspr[class*='shard-']>i{width:30px}.pkspr[class*='shard-'],.pkspr[class*='shard-']>i{height:30px}.pkspr[class*='tm-'],.pkspr[class*='tm-']>i{width:30px}.pkspr[class*='tm-'],.pkspr[class*='tm-']>i{height:30px}.pkspr[class*='valuable-item-'],.pkspr[class*='valuable-item-']>i{width:30px}.pkspr[class*='valuable-item-'],.pkspr[class*='valuable-item-']>i{height:30px}.pkspr[class*='wonder-launcher-'],.pkspr[class*='wonder-launcher-']>i{width:30px}.pkspr[class*='wonder-launcher-'],.pkspr[class*='wonder-launcher-']>i{height:30px}.pkspr[class*='status-'],.pkspr[class*='status-']>i{width:10px}.pkspr[class*='status-'],.pkspr[class*='status-']>i{height:10px} 8 | -------------------------------------------------------------------------------- /test_user_operations.py: -------------------------------------------------------------------------------- 1 | import unittest 2 | import user 3 | from users import UserDatabase 4 | from users import CapturedState 5 | from users import ComparisonResult 6 | 7 | class FakeDatabaseSession: 8 | def __init__(self): 9 | self.didCommit = False 10 | self.things = [ ] 11 | def commit(self): 12 | self.didCommit = True 13 | def add(self, thingToAdd): 14 | self.things.append(thingToAdd) 15 | 16 | class FakeDatabase: 17 | def __init__(self): 18 | self.session = FakeDatabaseSession() 19 | 20 | class TestUserOperations(unittest.TestCase): 21 | def setUp(self): 22 | self.userDB = UserDatabase() 23 | self.appDB = FakeDatabase() 24 | self.appDBSession = self.appDB.session 25 | 26 | self.register_ash() 27 | self.register_misty() 28 | def tearDown(self): 29 | self.userDB = None 30 | self.appDB = None 31 | self.appDBSession = None 32 | 33 | # Convenience 34 | def register_ash(self): 35 | self.userDB.registerUser("AshKetchum", "pallettown123", "000000000000", self.appDB) 36 | def register_misty(self): 37 | self.userDB.registerUser("Misty", "cerulean456", "111111111111", self.appDB) 38 | def ash_user(self): 39 | return self.appDBSession.things[0] 40 | def misty_user(self): 41 | return self.appDBSession.things[1] 42 | 43 | # Registration 44 | def test_registration(self): 45 | user = self.ash_user() 46 | self.assertEqual(user.username, "AshKetchum") 47 | self.assertTrue(self.appDB.session.didCommit) 48 | 49 | # Catching / Releasing 50 | def test_catching_pokemon_works(self): 51 | user = self.ash_user() 52 | # Catch Pikachu 53 | self.userDB.catchPokemonForUser(user, 25, self.appDB) 54 | # Grab the state of the Pokemon @ 25 55 | state = self.userDB._stateOfPokemonForUser(user, 25) 56 | self.assertEqual(state, CapturedState.Caught) 57 | def test_new_user_hasnt_caught_pokemon(self): 58 | user = self.ash_user() 59 | # Grab the state of the Pokemon @ 25 60 | # It should be 0 61 | state = self.userDB._stateOfPokemonForUser(user, 25) 62 | self.assertEqual(state, CapturedState.Uncaught) 63 | def test_catching_then_releasing_pokemon_works(self): 64 | user = self.ash_user() 65 | # Catch Pikachu 66 | self.userDB.catchPokemonForUser(user, 25, self.appDB) 67 | # Release Pikachu :-( 68 | self.userDB.uncatchPokemonForUser(user, 25, self.appDB) 69 | # Grab the state of the Pokemon @ 25 70 | state = self.userDB._stateOfPokemonForUser(user, 25) 71 | self.assertEqual(state, CapturedState.Uncaught) 72 | 73 | # Comparison 74 | ## Keep in mind that comparisonResultBetweenUsers() accepts a 0-indexed 75 | ## Pokedex index 76 | def test_comparing_user_without_pokemon_and_user_without_pokemon_returns_neither_having_pokemon(self): 77 | ash = self.ash_user() 78 | misty = self.misty_user() 79 | state_of_pikachu = self.userDB.comparisonResultBetweenUsers(ash, misty, 24) 80 | self.assertEqual(state_of_pikachu, ComparisonResult.NeitherCaught) 81 | def test_comparing_user_with_pokemon_and_user_without_pokemon_returns_first_having_pokemon(self): 82 | ash = self.ash_user() 83 | misty = self.misty_user() 84 | self.userDB.catchPokemonForUser(ash, 25, self.appDB) 85 | state_of_pikachu = self.userDB.comparisonResultBetweenUsers(ash, misty, 24) 86 | self.assertEqual(state_of_pikachu, ComparisonResult.FirstCaught) 87 | def test_comparing_user_without_pokemon_and_user_with_pokemon_returns_second_having_pokemon(self): 88 | ash = self.ash_user() 89 | misty = self.misty_user() 90 | self.userDB.catchPokemonForUser(misty, 116, self.appDB) 91 | state_of_horsea = self.userDB.comparisonResultBetweenUsers(ash, misty, 115) 92 | self.assertEqual(state_of_horsea, ComparisonResult.SecondCaught) 93 | def test_comparing_user_with_pokemon_and_user_with_pokemon_returns_both_having_pokemon(self): 94 | ash = self.ash_user() 95 | misty = self.misty_user() 96 | self.userDB.catchPokemonForUser(ash, 128, self.appDB) 97 | self.userDB.catchPokemonForUser(misty, 128, self.appDB) 98 | state_of_tauros = self.userDB.comparisonResultBetweenUsers(ash, misty, 127) 99 | self.assertEqual(state_of_tauros, ComparisonResult.BothCaught) 100 | 101 | if __name__ == '__main__': 102 | unittest.main() 103 | -------------------------------------------------------------------------------- /livingdex.py: -------------------------------------------------------------------------------- 1 | import sys, os 2 | 3 | from flask import Flask 4 | from flask import render_template 5 | from flask import request 6 | from flask import url_for 7 | from flask import redirect 8 | 9 | from flask.ext.sqlalchemy import SQLAlchemy 10 | 11 | from usersession import * 12 | from pokedex import * 13 | 14 | app = Flask(__name__) 15 | app.config['SQLALCHEMY_DATABASE_URI'] = os.environ.get( 16 | 'DATABASE_URL', 'sqlite:////tmp/test.db') 17 | 18 | if app.config['SQLALCHEMY_DATABASE_URI'] == 'sqlite:////tmp/test.db': 19 | app.config['DEBUG'] = True 20 | 21 | db = SQLAlchemy(app) 22 | 23 | import user 24 | 25 | from users import * 26 | 27 | db.create_all() 28 | db.session.commit() 29 | 30 | database = UserDatabase() 31 | nationalDex = NationalDex('pokesprite/data/pkmn.json') 32 | 33 | app.secret_key = 'A0Zr98j/3yX R~XHH!jmN]LWX/,?RT' 34 | 35 | @app.route('/') 36 | def home(): 37 | return render_template('home.html') 38 | 39 | @app.route('/user/') 40 | def user(username): 41 | if database.userExists(username): 42 | user = database.userForUsername(username) 43 | friendCode = user.friendCode 44 | friendCode = database.displayFriendlyFriendCodeForFriendCode(friendCode) 45 | dex = database.dexForUser(user, nationalDex.numberOfPokemon) 46 | pokemonNames = nationalDex.pokemonNames 47 | pokemonSlugs = nationalDex.pokemonSlugs 48 | 49 | return render_template('user.html', username=username, friendCode=friendCode, dex=dex, pokemonNames=pokemonNames, pokemonSlugs=pokemonSlugs) 50 | else: 51 | return render_template('baduser.html', username=username) 52 | 53 | @app.route('/compare//') 54 | def compareUsers(username1, username2): 55 | if database.userExists(username1) and database.userExists(username2): 56 | user1 = database.userForUsername(username1) 57 | user2 = database.userForUsername(username2) 58 | 59 | friendCode1 = database.displayFriendlyFriendCodeForFriendCode(user1.friendCode) 60 | friendCode2 = database.displayFriendlyFriendCodeForFriendCode(user2.friendCode) 61 | 62 | comparedDex = database.comparedDexBetweenUsers(user1, user2, nationalDex.numberOfPokemon) 63 | 64 | pokemonNames = nationalDex.pokemonNames 65 | pokemonSlugs = nationalDex.pokemonSlugs 66 | 67 | return render_template('compare.html', username1=username1, username2=username2, friendCode1=friendCode1, friendCode2=friendCode2, comparedDex=comparedDex, pokemonNames=pokemonNames, pokemonSlugs=pokemonSlugs) 68 | else: 69 | return render_template('badusersforcompare.html', username1=username1, username2=username2) 70 | 71 | @app.route('/catchPokemon', methods=['POST']) 72 | def catchPokemon(): 73 | username = request.form['username'] 74 | if username == currentUser(): 75 | pokemon = request.form['pokemon'] 76 | user = database.userForUsername(username) 77 | database.catchPokemonForUser(user, int(pokemon), db) 78 | return 'OK' 79 | 80 | @app.route('/uncatchPokemon', methods=['POST']) 81 | def uncatchPokemon(): 82 | username = request.form['username'] 83 | if username == currentUser(): 84 | pokemon = request.form['pokemon'] 85 | user = database.userForUsername(username) 86 | database.uncatchPokemonForUser(user, int(pokemon), db) 87 | return 'OK' 88 | 89 | @app.route('/editFriendCode', methods=['POST']) 90 | def editFriendCode(): 91 | currentUsername = currentUser() 92 | friendCode = request.form['friendCode'] 93 | database.changeFriendCodeForUser(currentUsername, friendCode, db) 94 | return redirect(url_for('user', username=currentUsername)) 95 | 96 | @app.route('/register', methods=['POST', 'GET']) 97 | def register(): 98 | if request.method == 'GET': 99 | return redirect(url_for('login')) 100 | registerUsername = request.form['registerUsername'] 101 | registerUsername = registerUsername.lower() 102 | registerPassword = request.form['registerPassword'] 103 | registerFriendCode = request.form['registerFriendCode'] 104 | 105 | usernameIsValid, usernameError = database.verifyNewUsername(registerUsername) 106 | passwordIsValid, passwordError = database.verifyNewPassword(registerPassword) 107 | friendCodeIsValid, friendCodeError = database.verifyNewFriendCode(registerFriendCode) 108 | 109 | if not usernameIsValid: 110 | return render_template('login.html', error=usernameError) 111 | elif not passwordIsValid: 112 | return render_template('login.html', error=passwordError) 113 | elif not friendCodeIsValid: 114 | return render_template('login.html', error=friendCodeError) 115 | else: 116 | database.registerUser(registerUsername, registerPassword, registerFriendCode, db) 117 | logInUser(registerUsername) 118 | return redirect(url_for('user', username=registerUsername)) 119 | 120 | @app.route('/login', methods=['POST', 'GET']) 121 | def login(): 122 | error = None 123 | if request.method == 'POST': 124 | loginUsername = request.form['loginUsername'] 125 | loginPassword = request.form['loginPassword'] 126 | 127 | if len(loginUsername) > 0: 128 | if not database.userExists(loginUsername): 129 | error = 'User {} does not exist'.format(loginUsername) 130 | elif database.userHasPassword(loginUsername, loginPassword): 131 | logInUser(loginUsername) 132 | return redirect(url_for('user', username=loginUsername)) 133 | else: 134 | error = 'Incorrect username / password' 135 | else: 136 | error = 'You need to enter in a username and password to register or log in as.' 137 | 138 | return render_template('login.html', error=error) 139 | 140 | @app.route('/logout') 141 | def logoutAndGoHome(): 142 | logout() 143 | return home() 144 | 145 | -------------------------------------------------------------------------------- /static/dexes.js: -------------------------------------------------------------------------------- 1 | function dexListInRange(start, end) 2 | { 3 | var dexList = []; 4 | for(var i = start; i <= end; i++) 5 | { 6 | dexList.push(i); 7 | } 8 | 9 | return dexList; 10 | } 11 | 12 | var dexes = {}; 13 | 14 | dexes['Kanto'] = dexListInRange(1,151); 15 | 16 | dexes['Johto'] = dexListInRange(1,251); 17 | dexes['Johto'] = dexes['Johto'].concat([424, 463, 465, 469, 473]); 18 | 19 | dexes['Hoenn'] = [25, 26, 27, 28, 37, 38, 39, 40, 41, 42, 43, 44, 45, 54, 55, 63, 64, 65, 66, 67, 68, 72, 73, 74, 75, 76, 81, 82, 84, 85, 88, 89, 100, 101, 109, 110, 111, 112, 116, 117, 118, 119, 120, 121, 127, 129, 130, 169, 170, 171, 172, 174, 177, 178, 182, 183, 184, 202, 203, 214, 218, 219, 222, 227, 230, 231, 232, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 386, 386, 386, 406, 407, 433, 462, 464, 475, 476, 477, 478] 20 | 21 | dexes['Sinnoh'] = [25, 26, 35, 36, 41, 42, 54, 55, 63, 64, 65, 66, 67, 68, 72, 73, 74, 75, 76, 77, 78, 81, 82, 92, 93, 94, 95, 108, 111, 112, 113, 114, 118, 119, 122, 123, 125, 126, 129, 130, 133, 134, 135, 136, 137, 143, 163, 164, 169, 172, 173, 175, 176, 183, 184, 185, 190, 193, 194, 195, 196, 197, 198, 200, 201, 203, 207, 208, 212, 214, 215, 220, 221, 223, 224, 226, 228, 229, 233, 239, 240, 242, 265, 266, 267, 268, 269, 278, 279, 280, 281, 282, 298, 299, 307, 308, 315, 333, 334, 339, 340, 349, 350, 355, 356, 357, 358, 359, 361, 362, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 487, 490] 22 | 23 | dexes['Unova'] = [19, 20, 27, 28, 35, 36, 37, 38, 39, 40, 41, 42, 54, 55, 58, 59, 81, 82, 86, 87, 88, 89, 95, 108, 109, 110, 114, 120, 121, 125, 126, 127, 131, 132, 133, 134, 135, 136, 169, 173, 174, 179, 180, 181, 183, 184, 191, 192, 193, 196, 197, 206, 207, 208, 213, 214, 215, 220, 221, 222, 223, 224, 225, 226, 227, 239, 240, 246, 247, 248, 278, 279, 287, 288, 289, 298, 299, 300, 301, 304, 305, 306, 315, 320, 321, 322, 323, 325, 326, 328, 329, 330, 333, 334, 335, 336, 337, 338, 341, 342, 343, 344, 351, 353, 354, 357, 359, 363, 364, 365, 374, 375, 376, 406, 407, 415, 416, 418, 419, 425, 426, 427, 428, 436, 437, 447, 448, 451, 452, 453, 454, 455, 458, 461, 462, 463, 465, 466, 467, 469, 470, 471, 472, 473, 476, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, 649] 24 | 25 | dexes['Kalos'] = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 39, 40, 41, 42, 43, 44, 45, 50, 51, 54, 55, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 79, 80, 81, 82, 83, 84, 85, 90, 91, 92, 93, 94, 95, 100, 101, 102, 103, 104, 105, 108, 111, 112, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 142, 143, 144, 145, 146, 147, 148, 149, 150, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 174, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 193, 194, 195, 196, 197, 198, 199, 202, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 235, 238, 241, 246, 247, 248, 261, 262, 263, 264, 270, 271, 272, 276, 277, 278, 279, 280, 281, 282, 283, 284, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 324, 325, 326, 327, 328, 329, 330, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 352, 353, 354, 358, 359, 360, 366, 367, 368, 369, 370, 371, 372, 373, 396, 397, 398, 399, 400, 406, 407, 412, 413, 414, 415, 416, 417, 418, 419, 425, 426, 430, 433, 434, 435, 438, 439, 441, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 458, 459, 460, 461, 462, 463, 464, 469, 470, 471, 472, 473, 475, 476, 479, 504, 505, 509, 510, 511, 512, 513, 514, 515, 516, 524, 525, 526, 527, 528, 531, 532, 533, 534, 538, 539, 543, 544, 545, 550, 551, 552, 553, 557, 558, 559, 560, 561, 568, 569, 570, 571, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, 587, 588, 589, 590, 591, 594, 597, 598, 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, 631, 632, 633, 634, 635, 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, 680, 681, 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, 718, 719] 26 | 27 | dexes['All'] = dexListInRange(1,721); 28 | -------------------------------------------------------------------------------- /users.py: -------------------------------------------------------------------------------- 1 | import string 2 | import sys 3 | import user 4 | 5 | def enum(**enums): 6 | return type('Enum', (), enums) 7 | 8 | # This enum specifies the captured state of a Pokemon 9 | # 0 is the user hasn't caught the Pokemon 10 | # 1 is the user has caught the Pokemon 11 | 12 | CapturedState = enum(Uncaught = 0, Caught = 1) 13 | 14 | # This enum specifies the comparison state (between two users) of a Pokemon 15 | # 0 means neither user has caught the Pokemon 16 | # 1 means the first user has caught the Pokemon 17 | # 2 means the second user has caught the Pokemon 18 | # 3 means both users have caught the Pokemon 19 | 20 | ComparisonResult = enum(NeitherCaught = 0, FirstCaught = 1, SecondCaught = 2, BothCaught = 3) 21 | 22 | class UserDatabase: 23 | def __init__(self): 24 | pass 25 | 26 | ''' Adding Users ''' 27 | 28 | def _verifyStringContainsCharactersFromList(self, stringToVerify, validCharacters): 29 | for character in stringToVerify: 30 | if character not in validCharacters: 31 | return False 32 | return True 33 | 34 | def _verifyStringisASCII(self, stringToVerify): 35 | validCharacters = string.ascii_letters + string.digits 36 | return self._verifyStringContainsCharactersFromList(stringToVerify, validCharacters) 37 | 38 | 39 | def verifyNewUsername(self, username): 40 | if self.userExists(username): 41 | return (False, "That username is already taken") 42 | elif len(username) == 0: 43 | return (False, "Username can't be empty") 44 | elif len(username) > 20: 45 | return (False, "Username is too long. Must be 20 characters or less") 46 | elif not self._verifyStringisASCII(username): 47 | return (False, "A username may only contain uppercase, lowercase and digits") 48 | else: 49 | return (True, None) 50 | 51 | def verifyNewPassword(self, password): 52 | if not self._verifyStringisASCII(password): 53 | return (False, "A password may only contain uppercase, lowercase and digits") 54 | if len(password) == 0: 55 | return (False, "You need to have a password that's at least one character. But don't make it just one character, that's insecure.") 56 | elif len(password) > 20: 57 | return (False, "Password is too long. Must be 20 characters or less") 58 | else: 59 | return (True, None) 60 | 61 | def verifyNewFriendCode(self, friendCode): 62 | friendCode = self._validatedFriendCode(friendCode) 63 | validCharacters = string.digits 64 | if not self._verifyStringContainsCharactersFromList(friendCode, validCharacters): 65 | return (False, "A friend code may only contain digits") 66 | elif len(friendCode) > 16: 67 | return (False, "A friend code is 16 numbers") 68 | else: 69 | return (True, None) 70 | 71 | def _validatedFriendCode(self, friendCode): 72 | friendCode = friendCode.encode('ascii', 'ignore') 73 | return friendCode.translate(None, ' -') 74 | 75 | def displayFriendlyFriendCodeForFriendCode(self, friendCode): 76 | displayFriendlyFriendCode = '' 77 | 78 | for i in range(len(friendCode)): 79 | if i % 4 == 0 and i is not 0: 80 | displayFriendlyFriendCode = displayFriendlyFriendCode + '-' 81 | displayFriendlyFriendCode = displayFriendlyFriendCode + friendCode[i] 82 | 83 | return displayFriendlyFriendCode 84 | 85 | def registerUser(self, username, password, friendCode, db): 86 | newuser = user.User() 87 | newuser.username = username 88 | newuser.password = password 89 | newuser.friendCode = self._validatedFriendCode(friendCode) 90 | 91 | db.session.add(newuser) 92 | db.session.commit() 93 | 94 | ''' User Access and Query ''' 95 | 96 | def userForUsername(self, username): 97 | foundUser = user.User.query.filter_by(username=username).first() 98 | return foundUser 99 | 100 | def userExists(self, username): 101 | return self.userForUsername(username) is not None 102 | 103 | def pokemonCaughtForUser(self, user): 104 | unicodePokemon = user.pokemon 105 | return unicodePokemon 106 | 107 | def dexForUser(self, user, pokemonCount): 108 | dex = self.pokemonCaughtForUser(user) 109 | dex = dex[:pokemonCount] 110 | return dex 111 | 112 | def comparisonResultBetweenUsers(self, user1, user2, pokemonIndex): 113 | # Why +1? Because these indexes are 0-indexed, but 114 | # _stateOfPokemonForUser assumes logical indices 115 | logicalPokemonIndex = pokemonIndex+1 116 | stateForUser1 = self._stateOfPokemonForUser(user1, logicalPokemonIndex) 117 | stateForUser2 = self._stateOfPokemonForUser(user2, logicalPokemonIndex) 118 | 119 | if stateForUser1 == CapturedState.Uncaught: 120 | if stateForUser2 == CapturedState.Uncaught: 121 | return ComparisonResult.NeitherCaught 122 | else: 123 | return ComparisonResult.SecondCaught 124 | if stateForUser1 == CapturedState.Caught: 125 | if stateForUser2 == CapturedState.Uncaught: 126 | return ComparisonResult.FirstCaught 127 | else: 128 | return ComparisonResult.BothCaught 129 | 130 | # We need a better error case, but -1 will do for now 131 | return -1 132 | 133 | def comparedDexBetweenUsers(self, user1, user2, pokemonCount): 134 | comparedDex = [] 135 | 136 | for i in range(pokemonCount): 137 | comparisonResult = self.comparisonResultBetweenUsers(user1, user2, i) 138 | 139 | newStatus = unicode(comparisonResult) 140 | comparedDex.append(newStatus) 141 | 142 | comparedDex = "".join(comparedDex) 143 | 144 | return comparedDex 145 | 146 | def _setStateForPokemonForUser(self, user, pokemon, state, db): 147 | pokemon = pokemon - 1 148 | dex = self.pokemonCaughtForUser(user) 149 | dex = list(dex) 150 | 151 | dex[pokemon] = state 152 | 153 | dex = "".join(dex) 154 | user.pokemon = dex 155 | 156 | db.session.commit() 157 | 158 | def _stateOfPokemonForUser(self, user, pokemon): 159 | pokemon = pokemon - 1 160 | dex = self.pokemonCaughtForUser(user) 161 | dex = list(dex) 162 | dexState = dex[pokemon] 163 | 164 | if int(dexState) == 0: 165 | return CapturedState.Uncaught 166 | else: 167 | return CapturedState.Caught 168 | 169 | def catchPokemonForUser(self, user, pokemon, db): 170 | self._setStateForPokemonForUser(user, pokemon, u'1', db) 171 | 172 | def uncatchPokemonForUser(self, user, pokemon, db): 173 | self._setStateForPokemonForUser(user, pokemon, u'0', db) 174 | 175 | def changeFriendCodeForUser(self, username, friendCode, db): 176 | friendCode = self._validatedFriendCode(friendCode) 177 | if self.verifyNewFriendCode(friendCode)[0] is not False: 178 | user = self.userForUsername(username) 179 | user.friendCode = friendCode 180 | db.session.commit() 181 | 182 | def userHasPassword(self, username, password): 183 | if self.userExists(username): 184 | return password == self.userForUsername(username).password 185 | else: 186 | return False 187 | 188 | -------------------------------------------------------------------------------- /static/style.css: -------------------------------------------------------------------------------- 1 | .welcomeHeading 2 | { 3 | text-align: center; 4 | font-family: "HelveticaNeue", sans-serif; 5 | font-weight: lighter; 6 | } 7 | 8 | h2 9 | { 10 | text-align: center; 11 | font-family: "HelveticaNeue", sans-serif; 12 | } 13 | 14 | p 15 | { 16 | font-size: 12pt; 17 | font-family: "HelveticaNeue", sans-serif; 18 | } 19 | 20 | a 21 | { 22 | text-decoration: none; 23 | color: red; 24 | } 25 | 26 | form 27 | { 28 | text-align: center; 29 | } 30 | 31 | .colorKey 32 | { 33 | text-align: center; 34 | } 35 | 36 | #header a 37 | { 38 | display: inline-block; 39 | padding: 12px 10px; 40 | font-family: "HelveticaNeue", sans-serif; 41 | font-size: 19pt; 42 | color: white; 43 | } 44 | 45 | #content 46 | { 47 | margin-left:auto; 48 | margin-right:auto; 49 | padding-left:5px; 50 | padding-right:5px; 51 | padding-top:36px; 52 | max-width: 600px; 53 | } 54 | 55 | body 56 | { 57 | margin: 0; 58 | padding-top:40px; 59 | } 60 | 61 | #header 62 | { 63 | width:100%; 64 | height:56px; 65 | position:fixed; 66 | top:0; 67 | background-color: #ec1d1d; 68 | z-index: 100; 69 | } 70 | 71 | .headerNavigation 72 | { 73 | margin-right:10px; 74 | float:right; 75 | } 76 | 77 | .headerLink 78 | { 79 | border-left: solid 2px black; 80 | } 81 | 82 | .headerCircleContainer 83 | { 84 | margin-left:10px; 85 | padding-top:9px; 86 | float:left; 87 | } 88 | 89 | .headerCircle 90 | { 91 | border:solid 3px black; 92 | width:15px; 93 | height:15px; 94 | border-radius:50%; 95 | display:inline-block; 96 | vertical-align:top; 97 | } 98 | 99 | #redCircle 100 | { 101 | background-color:red; 102 | } 103 | 104 | #yellowCircle 105 | { 106 | background-color:yellow; 107 | } 108 | 109 | #greenCircle 110 | { 111 | background-color:green; 112 | } 113 | 114 | .headerCircle#bigCircle 115 | { 116 | border-color:#eee; 117 | width:30px; 118 | height:30px; 119 | background-color:rgb(64, 89, 219); 120 | } 121 | 122 | .headerSwoopContainer 123 | { 124 | top:0; 125 | left:0; 126 | bottom:0; 127 | position:absolute; 128 | } 129 | 130 | .headerSwoopLine 131 | { 132 | padding:0px; 133 | height:2px; 134 | background-color:black; 135 | position:absolute; 136 | } 137 | 138 | #bottomLine 139 | { 140 | width:100%; 141 | bottom:0; 142 | } 143 | 144 | #topLine 145 | { 146 | left:206px; 147 | width:5000px; 148 | top:0; 149 | } 150 | 151 | .headerSwoopCircle 152 | { 153 | height:28px; 154 | width:28px; 155 | margin-left: -4px; 156 | border-style:solid; 157 | border-width:2px; 158 | border-color:black; 159 | background-color:#ec1d1d; 160 | position:absolute; 161 | } 162 | 163 | #leftCircle 164 | { 165 | bottom:0; 166 | left:150px; 167 | border-radius:0 0 56px 0; 168 | } 169 | 170 | #rightCircle 171 | { 172 | top:0; 173 | left:180px; 174 | border-radius:56px 0 0 0; 175 | } 176 | 177 | .headerSwoopCircle.coverup 178 | { 179 | width:32px; 180 | height:32px; 181 | border-width:0px; 182 | background-color:red; 183 | } 184 | 185 | .headerSwoopCircle.coverup#leftCircle 186 | { 187 | left:148px; 188 | bottom:2px; 189 | } 190 | 191 | .headerSwoopCircle.coverup#rightCircle 192 | { 193 | left:182px; 194 | top:2px; 195 | } 196 | 197 | #footer 198 | { 199 | text-align:center; 200 | width:100%; 201 | position:fixed; 202 | bottom:0; 203 | } 204 | 205 | /* User-specific CSS */ 206 | 207 | .userInfoHeader 208 | { 209 | height: 40px; 210 | } 211 | 212 | .usernameHeading 213 | { 214 | font-family:"HelveticaNeue", sans-serif; 215 | font-weight:lighter; 216 | font-size:20pt; 217 | } 218 | 219 | .friendCode 220 | { 221 | font-family:"Menlo", "Lucida Console", Monaco, monospace; 222 | font-weight:lighter; 223 | font-size:24pt; 224 | text-align:center; 225 | width:370px; 226 | } 227 | 228 | .friendCode.label 229 | { 230 | font-family:"Helvetica", sans-serif; 231 | font-weight:lighter; 232 | font-size:36pt; 233 | display:inline-block; 234 | color:#555; 235 | } 236 | 237 | .friendCodeForm 238 | { 239 | display:inline-block; 240 | } 241 | 242 | .submitButton 243 | { 244 | padding: 0px; 245 | border: 0px; 246 | background-color: rgba(0, 0, 0, 0.0); 247 | color: red; 248 | font-size: 14pt; 249 | } 250 | 251 | .dexPickerProgressContainer 252 | { 253 | margin: auto; 254 | } 255 | 256 | 257 | 258 | .dexPicker 259 | { 260 | width:100%; 261 | height:20pt; 262 | vertical-align:top; 263 | text-align: left; 264 | margin: auto; 265 | background-color: #ddd; 266 | } 267 | 268 | .dexPickerDexTitle 269 | { 270 | font-family:"Menlo", "Lucida Console", Monaco, monospace; 271 | font-size:16pt; 272 | display: inline-block; 273 | width: 14.28%; 274 | height: 100%; 275 | text-align: center; 276 | line-height: 30px; 277 | } 278 | 279 | .selected 280 | { 281 | background-color: blue; 282 | color: white; 283 | } 284 | 285 | .progressBar 286 | { 287 | background-color: #777; 288 | text-align: left; 289 | margin: auto; 290 | width: 100%; 291 | height: 55pt; 292 | display: inline-block; 293 | } 294 | 295 | .filledBar 296 | { 297 | background-color: green; 298 | height: 100%; 299 | } 300 | 301 | .progressBarText 302 | { 303 | text-align: right; 304 | font-size: 29pt; 305 | font-family: monospace; 306 | margin-top: 14px; 307 | margin-right: 14px; 308 | color: white; 309 | bottom: 55pt; 310 | position: relative; 311 | } 312 | 313 | .csvDownloadLinkContainer 314 | { 315 | text-align: center; 316 | font-size: 12pt; 317 | } 318 | 319 | .caught 320 | { 321 | background-color: rgba(0, 255, 0, 0.35); 322 | } 323 | 324 | .uncaught 325 | { 326 | opacity: 0.65; 327 | } 328 | 329 | .invalid 330 | { 331 | opacity: 0.15; 332 | } 333 | 334 | .caughtByOther 335 | { 336 | background-color: rgba(255, 0, 0, 0.35); 337 | } 338 | 339 | .caughtByBoth 340 | { 341 | background-color: rgba(0, 255, 0, 0.7); 342 | } 343 | 344 | .pokemonCell 345 | { 346 | display:inline-block; 347 | margin-left: -4px; 348 | width: 16.66%; 349 | text-align: center; 350 | padding: 5px 0; 351 | } 352 | 353 | .pokemonCellNumber 354 | { 355 | font-family:"Menlo", "Lucida Console", Monaco, monospace; 356 | font-size:24pt; 357 | } 358 | 359 | .pokemonCellName 360 | { 361 | font-family:"Helvetica", sans-serif; 362 | font-weight:lighter; 363 | font-size:10pt; 364 | line-height:20px; 365 | white-space: nowrap; 366 | overflow:hidden; 367 | text-overflow:ellipsis; 368 | } 369 | 370 | .boxTitle 371 | { 372 | text-align: center; 373 | font-family:"Menlo", "Lucida Console", Monaco, monospace; 374 | font-size:24pt; 375 | margin-top:12px; 376 | margin-bottom:12px; 377 | } 378 | 379 | ul 380 | { 381 | list-style-type: none; 382 | padding:0px; 383 | padding-left:6px; 384 | } 385 | 386 | /* Compare-specific CSS */ 387 | 388 | .compareDexHeader 389 | { 390 | text-align: center; 391 | } 392 | 393 | /* Login-specific CSS */ 394 | 395 | .loginContainer 396 | { 397 | max-width:300px; 398 | margin-left:auto; 399 | margin-right:auto; 400 | } 401 | 402 | .loginLabel 403 | { 404 | font-family:"HelveticaNeue", sans-serif; 405 | font-weight: lighter; 406 | text-align:center; 407 | } 408 | 409 | .error 410 | { 411 | font-family:"HelveticaNeue", sans-serif; 412 | font-size:22pt; 413 | } 414 | 415 | input.textBox 416 | { 417 | font-size:24pt; 418 | font-family:"HelveticaNeue", sans-serif; 419 | font-style: lighter; 420 | display:block; 421 | width:100%; 422 | } 423 | 424 | input.textBox#registerUsername 425 | { 426 | text-transform:lowercase; 427 | } 428 | 429 | input.textBox#loginUsername 430 | { 431 | text-transform:lowercase; 432 | } 433 | 434 | input.textBox#registerFriendCode 435 | { 436 | font-family:"Menlo", "Lucida Console", Monaco, monospace; 437 | font-size:19pt; 438 | text-align:center; 439 | height:38px; 440 | } 441 | 442 | .securityText 443 | { 444 | font-size:14pt; 445 | font-family:"HelveticaNeue", sans-serif; 446 | } 447 | 448 | .securityWarning 449 | { 450 | color: red; 451 | font-weight: bold; 452 | } 453 | -------------------------------------------------------------------------------- /static/pokesprite.min.js: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | PokéSprite 1.0 4 | (C) 2014, Michiel Sikma and PokéSprite contributors 5 | (C) 1995-2014 Nintendo/Creatures Inc./GAME FREAK Inc. 6 | For a full list of contributors, view the project commit history. 7 | Generated on 2014-08-12 22:56:37. 8 | 9 | */ 10 | window.PkSpr=function(){var a=this;a.A="pkspr";a.B={pkmn:{w:40,h:30},etc:{},"body-style":{w:32,h:32},apricorn:{w:30,h:30},"battle-item":{w:30,h:30},berry:{w:30,h:30},"ev-item":{w:30,h:30},"evo-item":{w:30,h:30},flute:{w:30,h:30},fossil:{w:30,h:30},gem:{w:30,h:30},hm:{w:30,h:30},"hold-item":{w:30,h:30},incense:{w:30,h:30},"other-item":{w:30,h:30},"key-item":{w:30,h:30},mail:{w:30,h:30},medicine:{w:30,h:30},"mega-stone":{w:30,h:30},mulch:{w:30,h:30},plate:{w:30,h:30},pokeball:{w:30,h:30},scarf:{w:30, 11 | h:30},shard:{w:30,h:30},tm:{w:30,h:30},"valuable-item":{w:30,h:30},"wonder-launcher":{w:30,h:30},status:{w:10,h:10}};a.J={pkmn:{bulbasaur:{".":{".":{regular:{x:0,y:0},shiny:{x:40,y:0}}}},ivysaur:{".":{".":{regular:{x:80,y:0},shiny:{x:120,y:0}}}},venusaur:{".":{".":{regular:{x:160,y:0},shiny:{x:200,y:0}}},mega:{".":{regular:{x:240,y:0},shiny:{x:280,y:0}}}},charmander:{".":{".":{regular:{x:320,y:0},shiny:{x:360,y:0}}}},charmeleon:{".":{".":{regular:{x:400,y:0},shiny:{x:440,y:0}}}},charizard:{".":{".":{regular:{x:480, 12 | y:0},shiny:{x:520,y:0}}},"mega-x":{".":{regular:{x:560,y:0},shiny:{x:600,y:0}}},"mega-y":{".":{regular:{x:640,y:0},shiny:{x:680,y:0}}}},squirtle:{".":{".":{regular:{x:720,y:0},shiny:{x:760,y:0}}}},wartortle:{".":{".":{regular:{x:800,y:0},shiny:{x:840,y:0}}}},blastoise:{".":{".":{regular:{x:880,y:0},shiny:{x:920,y:0}}},mega:{".":{regular:{x:960,y:0},shiny:{x:1E3,y:0}}}},caterpie:{".":{".":{regular:{x:1040,y:0},shiny:{x:1080,y:0}}}},metapod:{".":{".":{regular:{x:1120,y:0},shiny:{x:1160,y:0}}}},butterfree:{".":{".":{regular:{x:1200, 13 | y:0},shiny:{x:1240,y:0}}}},weedle:{".":{".":{regular:{x:0,y:30},shiny:{x:40,y:30}}}},kakuna:{".":{".":{regular:{x:80,y:30},shiny:{x:120,y:30}}}},beedrill:{".":{".":{regular:{x:160,y:30},shiny:{x:200,y:30}}}},pidgey:{".":{".":{regular:{x:240,y:30},shiny:{x:280,y:30}}}},pidgeotto:{".":{".":{regular:{x:320,y:30},shiny:{x:360,y:30}}}},pidgeot:{".":{".":{regular:{x:400,y:30},shiny:{x:440,y:30}}}},rattata:{".":{".":{regular:{x:480,y:30},shiny:{x:520,y:30}}}},raticate:{".":{".":{regular:{x:560,y:30},shiny:{x:600, 14 | y:30}}}},spearow:{".":{".":{regular:{x:640,y:30},shiny:{x:680,y:30}}}},fearow:{".":{".":{regular:{x:720,y:30},shiny:{x:760,y:30}}}},ekans:{".":{".":{regular:{x:800,y:30},shiny:{x:840,y:30}}}},arbok:{".":{".":{regular:{x:880,y:30},shiny:{x:920,y:30}}}},pikachu:{".":{".":{regular:{x:960,y:30},shiny:{x:1E3,y:30}}}},raichu:{".":{".":{regular:{x:1040,y:30},shiny:{x:1080,y:30}}}},sandshrew:{".":{".":{regular:{x:1120,y:30},shiny:{x:1160,y:30}}}},sandslash:{".":{".":{regular:{x:1200,y:30},shiny:{x:1240,y:30}}}}, 15 | "nidoran-f":{".":{".":{regular:{x:0,y:60},shiny:{x:40,y:60}}}},nidorina:{".":{".":{regular:{x:80,y:60},shiny:{x:120,y:60}}}},nidoqueen:{".":{".":{regular:{x:160,y:60},shiny:{x:200,y:60}}}},"nidoran-m":{".":{".":{regular:{x:240,y:60},shiny:{x:280,y:60}}}},nidorino:{".":{".":{regular:{x:320,y:60},shiny:{x:360,y:60}}}},nidoking:{".":{".":{regular:{x:400,y:60},shiny:{x:440,y:60}}}},clefairy:{".":{".":{regular:{x:480,y:60},shiny:{x:560,y:60}},right:{regular:{x:520,y:60},shiny:{x:600,y:60}}}},clefable:{".":{".":{regular:{x:640, 16 | y:60},shiny:{x:720,y:60}},right:{regular:{x:680,y:60},shiny:{x:760,y:60}}}},vulpix:{".":{".":{regular:{x:800,y:60},shiny:{x:840,y:60}}}},ninetales:{".":{".":{regular:{x:880,y:60},shiny:{x:920,y:60}}}},jigglypuff:{".":{".":{regular:{x:960,y:60},shiny:{x:1040,y:60}},right:{regular:{x:1E3,y:60},shiny:{x:1080,y:60}}}},wigglytuff:{".":{".":{regular:{x:1120,y:60},shiny:{x:1200,y:60}},right:{regular:{x:1160,y:60},shiny:{x:1240,y:60}}}},zubat:{".":{".":{regular:{x:0,y:90},shiny:{x:40,y:90}}}},golbat:{".":{".":{regular:{x:80, 17 | y:90},shiny:{x:120,y:90}}}},oddish:{".":{".":{regular:{x:160,y:90},shiny:{x:200,y:90}}}},gloom:{".":{".":{regular:{x:240,y:90},shiny:{x:280,y:90}}}},vileplume:{".":{".":{regular:{x:320,y:90},shiny:{x:360,y:90}}}},paras:{".":{".":{regular:{x:400,y:90},shiny:{x:440,y:90}}}},parasect:{".":{".":{regular:{x:480,y:90},shiny:{x:520,y:90}}}},venonat:{".":{".":{regular:{x:560,y:90},shiny:{x:600,y:90}}}},venomoth:{".":{".":{regular:{x:640,y:90},shiny:{x:680,y:90}}}},diglett:{".":{".":{regular:{x:720,y:90}, 18 | shiny:{x:760,y:90}}}},dugtrio:{".":{".":{regular:{x:800,y:90},shiny:{x:840,y:90}}}},meowth:{".":{".":{regular:{x:880,y:90},shiny:{x:920,y:90}}}},persian:{".":{".":{regular:{x:960,y:90},shiny:{x:1E3,y:90}}}},psyduck:{".":{".":{regular:{x:1040,y:90},shiny:{x:1080,y:90}}}},golduck:{".":{".":{regular:{x:1120,y:90},shiny:{x:1160,y:90}}}},mankey:{".":{".":{regular:{x:1200,y:90},shiny:{x:1240,y:90}}}},primeape:{".":{".":{regular:{x:0,y:120},shiny:{x:40,y:120}}}},growlithe:{".":{".":{regular:{x:80,y:120}, 19 | shiny:{x:120,y:120}}}},arcanine:{".":{".":{regular:{x:160,y:120},shiny:{x:200,y:120}}}},poliwag:{".":{".":{regular:{x:240,y:120},shiny:{x:280,y:120}}}},poliwhirl:{".":{".":{regular:{x:320,y:120},shiny:{x:400,y:120}},right:{regular:{x:360,y:120},shiny:{x:440,y:120}}}},poliwrath:{".":{".":{regular:{x:480,y:120},shiny:{x:560,y:120}},right:{regular:{x:520,y:120},shiny:{x:600,y:120}}}},abra:{".":{".":{regular:{x:640,y:120},shiny:{x:680,y:120}}}},kadabra:{".":{".":{regular:{x:720,y:120},shiny:{x:760,y:120}}}}, 20 | alakazam:{".":{".":{regular:{x:800,y:120},shiny:{x:840,y:120}}},mega:{".":{regular:{x:880,y:120},shiny:{x:920,y:120}}}},machop:{".":{".":{regular:{x:960,y:120},shiny:{x:1E3,y:120}}}},machoke:{".":{".":{regular:{x:1040,y:120},shiny:{x:1080,y:120}}}},machamp:{".":{".":{regular:{x:1120,y:120},shiny:{x:1160,y:120}}}},bellsprout:{".":{".":{regular:{x:1200,y:120},shiny:{x:1240,y:120}}}},weepinbell:{".":{".":{regular:{x:0,y:150},shiny:{x:40,y:150}}}},victreebel:{".":{".":{regular:{x:80,y:150},shiny:{x:120, 21 | y:150}}}},tentacool:{".":{".":{regular:{x:160,y:150},shiny:{x:200,y:150}}}},tentacruel:{".":{".":{regular:{x:240,y:150},shiny:{x:280,y:150}}}},geodude:{".":{".":{regular:{x:320,y:150},shiny:{x:360,y:150}}}},graveler:{".":{".":{regular:{x:400,y:150},shiny:{x:440,y:150}}}},golem:{".":{".":{regular:{x:480,y:150},shiny:{x:520,y:150}}}},ponyta:{".":{".":{regular:{x:560,y:150},shiny:{x:600,y:150}}}},rapidash:{".":{".":{regular:{x:640,y:150},shiny:{x:680,y:150}}}},slowpoke:{".":{".":{regular:{x:720,y:150}, 22 | shiny:{x:760,y:150}}}},slowbro:{".":{".":{regular:{x:800,y:150},shiny:{x:840,y:150}}}},magnemite:{".":{".":{regular:{x:880,y:150},shiny:{x:920,y:150}}}},magneton:{".":{".":{regular:{x:960,y:150},shiny:{x:1E3,y:150}}}},farfetchd:{".":{".":{regular:{x:1040,y:150},shiny:{x:1080,y:150}}}},doduo:{".":{".":{regular:{x:1120,y:150},shiny:{x:1160,y:150}}}},dodrio:{".":{".":{regular:{x:1200,y:150},shiny:{x:1240,y:150}}}},seel:{".":{".":{regular:{x:0,y:180},shiny:{x:40,y:180}}}},dewgong:{".":{".":{regular:{x:80, 23 | y:180},shiny:{x:120,y:180}}}},grimer:{".":{".":{regular:{x:160,y:180},shiny:{x:200,y:180}}}},muk:{".":{".":{regular:{x:240,y:180},shiny:{x:280,y:180}}}},shellder:{".":{".":{regular:{x:320,y:180},shiny:{x:360,y:180}}}},cloyster:{".":{".":{regular:{x:400,y:180},shiny:{x:440,y:180}}}},gastly:{".":{".":{regular:{x:480,y:180},shiny:{x:520,y:180}}}},haunter:{".":{".":{regular:{x:560,y:180},shiny:{x:600,y:180}}}},gengar:{".":{".":{regular:{x:640,y:180},shiny:{x:680,y:180}}},mega:{".":{regular:{x:720,y:180}, 24 | shiny:{x:760,y:180}}}},onix:{".":{".":{regular:{x:800,y:180},shiny:{x:840,y:180}}}},drowzee:{".":{".":{regular:{x:880,y:180},shiny:{x:920,y:180}}}},hypno:{".":{".":{regular:{x:960,y:180},shiny:{x:1E3,y:180}}}},krabby:{".":{".":{regular:{x:1040,y:180},shiny:{x:1080,y:180}}}},kingler:{".":{".":{regular:{x:1120,y:180},shiny:{x:1200,y:180}},right:{regular:{x:1160,y:180},shiny:{x:1240,y:180}}}},voltorb:{".":{".":{regular:{x:0,y:210},shiny:{x:40,y:210}}}},electrode:{".":{".":{regular:{x:80,y:210},shiny:{x:120, 25 | y:210}}}},exeggcute:{".":{".":{regular:{x:160,y:210},shiny:{x:200,y:210}}}},exeggutor:{".":{".":{regular:{x:240,y:210},shiny:{x:280,y:210}}}},cubone:{".":{".":{regular:{x:320,y:210},shiny:{x:360,y:210}}}},marowak:{".":{".":{regular:{x:400,y:210},shiny:{x:440,y:210}}}},hitmonlee:{".":{".":{regular:{x:480,y:210},shiny:{x:520,y:210}}}},hitmonchan:{".":{".":{regular:{x:560,y:210},shiny:{x:600,y:210}}}},lickitung:{".":{".":{regular:{x:640,y:210},shiny:{x:680,y:210}}}},koffing:{".":{".":{regular:{x:720, 26 | y:210},shiny:{x:760,y:210}}}},weezing:{".":{".":{regular:{x:800,y:210},shiny:{x:840,y:210}}}},rhyhorn:{".":{".":{regular:{x:880,y:210},shiny:{x:920,y:210}}}},rhydon:{".":{".":{regular:{x:960,y:210},shiny:{x:1E3,y:210}}}},chansey:{".":{".":{regular:{x:1040,y:210},shiny:{x:1080,y:210}}}},tangela:{".":{".":{regular:{x:1120,y:210},shiny:{x:1160,y:210}}}},kangaskhan:{".":{".":{regular:{x:1200,y:210},shiny:{x:1240,y:210}}},mega:{".":{regular:{x:0,y:240},shiny:{x:40,y:240}}}},horsea:{".":{".":{regular:{x:80, 27 | y:240},shiny:{x:120,y:240}}}},seadra:{".":{".":{regular:{x:160,y:240},shiny:{x:200,y:240}}}},goldeen:{".":{".":{regular:{x:240,y:240},shiny:{x:280,y:240}}}},seaking:{".":{".":{regular:{x:320,y:240},shiny:{x:360,y:240}}}},staryu:{".":{".":{regular:{x:400,y:240},shiny:{x:440,y:240}}}},starmie:{".":{".":{regular:{x:480,y:240},shiny:{x:520,y:240}}}},"mr-mime":{".":{".":{regular:{x:560,y:240},shiny:{x:600,y:240}}}},scyther:{".":{".":{regular:{x:640,y:240},shiny:{x:680,y:240}}}},jynx:{".":{".":{regular:{x:720, 28 | y:240},shiny:{x:760,y:240}}}},electabuzz:{".":{".":{regular:{x:800,y:240},shiny:{x:840,y:240}}}},magmar:{".":{".":{regular:{x:880,y:240},shiny:{x:920,y:240}}}},pinsir:{".":{".":{regular:{x:960,y:240},shiny:{x:1E3,y:240}}},mega:{".":{regular:{x:1040,y:240},shiny:{x:1080,y:240}}}},tauros:{".":{".":{regular:{x:1120,y:240},shiny:{x:1160,y:240}}}},magikarp:{".":{".":{regular:{x:1200,y:240},shiny:{x:1240,y:240}}}},gyarados:{".":{".":{regular:{x:0,y:270},shiny:{x:40,y:270}}},mega:{".":{regular:{x:80,y:270}, 29 | shiny:{x:120,y:270}}}},lapras:{".":{".":{regular:{x:160,y:270},shiny:{x:200,y:270}}}},ditto:{".":{".":{regular:{x:240,y:270},shiny:{x:280,y:270}}}},eevee:{".":{".":{regular:{x:320,y:270},shiny:{x:360,y:270}}}},vaporeon:{".":{".":{regular:{x:400,y:270},shiny:{x:440,y:270}}}},jolteon:{".":{".":{regular:{x:480,y:270},shiny:{x:520,y:270}}}},flareon:{".":{".":{regular:{x:560,y:270},shiny:{x:600,y:270}}}},porygon:{".":{".":{regular:{x:640,y:270},shiny:{x:680,y:270}}}},omanyte:{".":{".":{regular:{x:720, 30 | y:270},shiny:{x:760,y:270}}}},omastar:{".":{".":{regular:{x:800,y:270},shiny:{x:840,y:270}}}},kabuto:{".":{".":{regular:{x:880,y:270},shiny:{x:920,y:270}}}},kabutops:{".":{".":{regular:{x:960,y:270},shiny:{x:1E3,y:270}}}},aerodactyl:{".":{".":{regular:{x:1040,y:270},shiny:{x:1080,y:270}}},mega:{".":{regular:{x:1120,y:270},shiny:{x:1160,y:270}}}},snorlax:{".":{".":{regular:{x:1200,y:270},shiny:{x:1240,y:270}}}},articuno:{".":{".":{regular:{x:0,y:300},shiny:{x:40,y:300}}}},zapdos:{".":{".":{regular:{x:80, 31 | y:300},shiny:{x:120,y:300}}}},moltres:{".":{".":{regular:{x:160,y:300},shiny:{x:200,y:300}}}},dratini:{".":{".":{regular:{x:240,y:300},shiny:{x:280,y:300}}}},dragonair:{".":{".":{regular:{x:320,y:300},shiny:{x:360,y:300}}}},dragonite:{".":{".":{regular:{x:400,y:300},shiny:{x:440,y:300}}}},mewtwo:{".":{".":{regular:{x:480,y:300},shiny:{x:520,y:300}}},"mega-x":{".":{regular:{x:560,y:300},shiny:{x:600,y:300}}},"mega-y":{".":{regular:{x:640,y:300},shiny:{x:680,y:300}}}},mew:{".":{".":{regular:{x:720, 32 | y:300},shiny:{x:760,y:300}}}},chikorita:{".":{".":{regular:{x:800,y:300},shiny:{x:840,y:300}}}},bayleef:{".":{".":{regular:{x:880,y:300},shiny:{x:920,y:300}}}},meganium:{".":{".":{regular:{x:960,y:300},shiny:{x:1E3,y:300}}}},cyndaquil:{".":{".":{regular:{x:1040,y:300},shiny:{x:1080,y:300}}}},quilava:{".":{".":{regular:{x:1120,y:300},shiny:{x:1160,y:300}}}},typhlosion:{".":{".":{regular:{x:1200,y:300},shiny:{x:1240,y:300}}}},totodile:{".":{".":{regular:{x:0,y:330},shiny:{x:40,y:330}}}},croconaw:{".":{".":{regular:{x:80, 33 | y:330},shiny:{x:160,y:330}},right:{regular:{x:120,y:330},shiny:{x:200,y:330}}}},feraligatr:{".":{".":{regular:{x:240,y:330},shiny:{x:280,y:330}}}},sentret:{".":{".":{regular:{x:320,y:330},shiny:{x:360,y:330}}}},furret:{".":{".":{regular:{x:400,y:330},shiny:{x:440,y:330}}}},hoothoot:{".":{".":{regular:{x:480,y:330},shiny:{x:520,y:330}}}},noctowl:{".":{".":{regular:{x:560,y:330},shiny:{x:600,y:330}}}},ledyba:{".":{".":{regular:{x:640,y:330},shiny:{x:680,y:330}}}},ledian:{".":{".":{regular:{x:720,y:330}, 34 | shiny:{x:760,y:330}}}},spinarak:{".":{".":{regular:{x:800,y:330},shiny:{x:840,y:330}}}},ariados:{".":{".":{regular:{x:880,y:330},shiny:{x:920,y:330}}}},crobat:{".":{".":{regular:{x:960,y:330},shiny:{x:1E3,y:330}}}},chinchou:{".":{".":{regular:{x:1040,y:330},shiny:{x:1080,y:330}}}},lanturn:{".":{".":{regular:{x:1120,y:330},shiny:{x:1160,y:330}}}},pichu:{".":{".":{regular:{x:1200,y:330},shiny:{x:1240,y:330}}}},cleffa:{".":{".":{regular:{x:0,y:360},shiny:{x:80,y:360}},right:{regular:{x:40,y:360},shiny:{x:120, 35 | y:360}}}},igglybuff:{".":{".":{regular:{x:160,y:360},shiny:{x:240,y:360}},right:{regular:{x:200,y:360},shiny:{x:280,y:360}}}},togepi:{".":{".":{regular:{x:320,y:360},shiny:{x:360,y:360}}}},togetic:{".":{".":{regular:{x:400,y:360},shiny:{x:440,y:360}}}},natu:{".":{".":{regular:{x:480,y:360},shiny:{x:520,y:360}}}},xatu:{".":{".":{regular:{x:560,y:360},shiny:{x:600,y:360}}}},mareep:{".":{".":{regular:{x:640,y:360},shiny:{x:680,y:360}}}},flaaffy:{".":{".":{regular:{x:720,y:360},shiny:{x:760,y:360}}}}, 36 | ampharos:{".":{".":{regular:{x:800,y:360},shiny:{x:840,y:360}}},mega:{".":{regular:{x:880,y:360},shiny:{x:920,y:360}}}},bellossom:{".":{".":{regular:{x:960,y:360},shiny:{x:1E3,y:360}}}},marill:{".":{".":{regular:{x:1040,y:360},shiny:{x:1080,y:360}}}},azumarill:{".":{".":{regular:{x:1120,y:360},shiny:{x:1160,y:360}}}},sudowoodo:{".":{".":{regular:{x:1200,y:360},shiny:{x:1240,y:360}}}},politoed:{".":{".":{regular:{x:0,y:390},shiny:{x:80,y:390}},right:{regular:{x:40,y:390},shiny:{x:120,y:390}}}},hoppip:{".":{".":{regular:{x:160, 37 | y:390},shiny:{x:200,y:390}}}},skiploom:{".":{".":{regular:{x:240,y:390},shiny:{x:280,y:390}}}},jumpluff:{".":{".":{regular:{x:320,y:390},shiny:{x:360,y:390}}}},aipom:{".":{".":{regular:{x:400,y:390},shiny:{x:440,y:390}}}},sunkern:{".":{".":{regular:{x:480,y:390},shiny:{x:520,y:390}}}},sunflora:{".":{".":{regular:{x:560,y:390},shiny:{x:600,y:390}}}},yanma:{".":{".":{regular:{x:640,y:390},shiny:{x:680,y:390}}}},wooper:{".":{".":{regular:{x:720,y:390},shiny:{x:760,y:390}}}},quagsire:{".":{".":{regular:{x:800, 38 | y:390},shiny:{x:840,y:390}}}},espeon:{".":{".":{regular:{x:880,y:390},shiny:{x:920,y:390}}}},umbreon:{".":{".":{regular:{x:960,y:390},shiny:{x:1E3,y:390}}}},murkrow:{".":{".":{regular:{x:1040,y:390},shiny:{x:1080,y:390}}}},slowking:{".":{".":{regular:{x:1120,y:390},shiny:{x:1160,y:390}}}},misdreavus:{".":{".":{regular:{x:1200,y:390},shiny:{x:1240,y:390}}}},unown:{".":{".":{regular:{x:0,y:420},shiny:{x:40,y:420}}},a:{".":{regular:{x:0,y:420},shiny:{x:40,y:420}}},b:{".":{regular:{x:80,y:420},shiny:{x:160, 39 | y:420}},right:{regular:{x:120,y:420},shiny:{x:200,y:420}}},c:{".":{regular:{x:240,y:420},shiny:{x:320,y:420}},right:{regular:{x:280,y:420},shiny:{x:360,y:420}}},d:{".":{regular:{x:400,y:420},shiny:{x:480,y:420}},right:{regular:{x:440,y:420},shiny:{x:520,y:420}}},e:{".":{regular:{x:560,y:420},shiny:{x:640,y:420}},right:{regular:{x:600,y:420},shiny:{x:680,y:420}}},exclamation:{".":{regular:{x:720,y:420},shiny:{x:760,y:420}}},f:{".":{regular:{x:800,y:420},shiny:{x:880,y:420}},right:{regular:{x:840,y:420}, 40 | shiny:{x:920,y:420}}},g:{".":{regular:{x:960,y:420},shiny:{x:1040,y:420}},right:{regular:{x:1E3,y:420},shiny:{x:1080,y:420}}},h:{".":{regular:{x:1120,y:420},shiny:{x:1200,y:420}},right:{regular:{x:1160,y:420},shiny:{x:1240,y:420}}},i:{".":{regular:{x:0,y:450},shiny:{x:40,y:450}}},j:{".":{regular:{x:80,y:450},shiny:{x:160,y:450}},right:{regular:{x:120,y:450},shiny:{x:200,y:450}}},k:{".":{regular:{x:240,y:450},shiny:{x:320,y:450}},right:{regular:{x:280,y:450},shiny:{x:360,y:450}}},l:{".":{regular:{x:400, 41 | y:450},shiny:{x:480,y:450}},right:{regular:{x:440,y:450},shiny:{x:520,y:450}}},m:{".":{regular:{x:560,y:450},shiny:{x:640,y:450}},right:{regular:{x:600,y:450},shiny:{x:680,y:450}}},n:{".":{regular:{x:720,y:450},shiny:{x:800,y:450}},right:{regular:{x:760,y:450},shiny:{x:840,y:450}}},o:{".":{regular:{x:880,y:450},shiny:{x:920,y:450}}},p:{".":{regular:{x:960,y:450},shiny:{x:1040,y:450}},right:{regular:{x:1E3,y:450},shiny:{x:1080,y:450}}},q:{".":{regular:{x:1120,y:450},shiny:{x:1200,y:450}},right:{regular:{x:1160, 42 | y:450},shiny:{x:1240,y:450}}},question:{".":{regular:{x:0,y:480},shiny:{x:80,y:480}},right:{regular:{x:40,y:480},shiny:{x:120,y:480}}},r:{".":{regular:{x:160,y:480},shiny:{x:240,y:480}},right:{regular:{x:200,y:480},shiny:{x:280,y:480}}},s:{".":{regular:{x:320,y:480},shiny:{x:400,y:480}},right:{regular:{x:360,y:480},shiny:{x:440,y:480}}},t:{".":{regular:{x:480,y:480},shiny:{x:560,y:480}},right:{regular:{x:520,y:480},shiny:{x:600,y:480}}},u:{".":{regular:{x:640,y:480},shiny:{x:680,y:480}}},v:{".":{regular:{x:720, 43 | y:480},shiny:{x:800,y:480}},right:{regular:{x:760,y:480},shiny:{x:840,y:480}}},w:{".":{regular:{x:880,y:480},shiny:{x:920,y:480}}},x:{".":{regular:{x:960,y:480},shiny:{x:1E3,y:480}}},y:{".":{regular:{x:1040,y:480},shiny:{x:1080,y:480}}},z:{".":{regular:{x:1120,y:480},shiny:{x:1200,y:480}},right:{regular:{x:1160,y:480},shiny:{x:1240,y:480}}}},wobbuffet:{".":{".":{regular:{x:0,y:510},shiny:{x:40,y:510}}}},girafarig:{".":{".":{regular:{x:80,y:510},shiny:{x:120,y:510}}}},pineco:{".":{".":{regular:{x:160, 44 | y:510},shiny:{x:200,y:510}}}},forretress:{".":{".":{regular:{x:240,y:510},shiny:{x:280,y:510}}}},dunsparce:{".":{".":{regular:{x:320,y:510},shiny:{x:360,y:510}}}},gligar:{".":{".":{regular:{x:400,y:510},shiny:{x:440,y:510}}}},steelix:{".":{".":{regular:{x:480,y:510},shiny:{x:520,y:510}}}},snubbull:{".":{".":{regular:{x:560,y:510},shiny:{x:600,y:510}}}},granbull:{".":{".":{regular:{x:640,y:510},shiny:{x:680,y:510}}}},qwilfish:{".":{".":{regular:{x:720,y:510},shiny:{x:760,y:510}}}},scizor:{".":{".":{regular:{x:800, 45 | y:510},shiny:{x:840,y:510}}},mega:{".":{regular:{x:880,y:510},shiny:{x:920,y:510}}}},shuckle:{".":{".":{regular:{x:960,y:510},shiny:{x:1E3,y:510}}}},heracross:{".":{".":{regular:{x:1040,y:510},shiny:{x:1080,y:510}}},mega:{".":{regular:{x:1120,y:510},shiny:{x:1160,y:510}}}},sneasel:{".":{".":{regular:{x:1200,y:510},shiny:{x:0,y:540}},right:{regular:{x:1240,y:510},shiny:{x:40,y:540}}}},teddiursa:{".":{".":{regular:{x:80,y:540},shiny:{x:160,y:540}},right:{regular:{x:120,y:540},shiny:{x:200,y:540}}}}, 46 | ursaring:{".":{".":{regular:{x:240,y:540},shiny:{x:280,y:540}}}},slugma:{".":{".":{regular:{x:320,y:540},shiny:{x:360,y:540}}}},magcargo:{".":{".":{regular:{x:400,y:540},shiny:{x:440,y:540}}}},swinub:{".":{".":{regular:{x:480,y:540},shiny:{x:520,y:540}}}},piloswine:{".":{".":{regular:{x:560,y:540},shiny:{x:600,y:540}}}},corsola:{".":{".":{regular:{x:640,y:540},shiny:{x:680,y:540}}}},remoraid:{".":{".":{regular:{x:720,y:540},shiny:{x:760,y:540}}}},octillery:{".":{".":{regular:{x:800,y:540},shiny:{x:840, 47 | y:540}}}},delibird:{".":{".":{regular:{x:880,y:540},shiny:{x:920,y:540}}}},mantine:{".":{".":{regular:{x:960,y:540},shiny:{x:1E3,y:540}}}},skarmory:{".":{".":{regular:{x:1040,y:540},shiny:{x:1080,y:540}}}},houndour:{".":{".":{regular:{x:1120,y:540},shiny:{x:1160,y:540}}}},houndoom:{".":{".":{regular:{x:1200,y:540},shiny:{x:1240,y:540}}},mega:{".":{regular:{x:0,y:570},shiny:{x:40,y:570}}}},kingdra:{".":{".":{regular:{x:80,y:570},shiny:{x:120,y:570}}}},phanpy:{".":{".":{regular:{x:160,y:570},shiny:{x:200, 48 | y:570}}}},donphan:{".":{".":{regular:{x:240,y:570},shiny:{x:280,y:570}}}},porygon2:{".":{".":{regular:{x:320,y:570},shiny:{x:360,y:570}}}},stantler:{".":{".":{regular:{x:400,y:570},shiny:{x:440,y:570}}}},smeargle:{".":{".":{regular:{x:480,y:570},shiny:{x:520,y:570}}}},tyrogue:{".":{".":{regular:{x:560,y:570},shiny:{x:600,y:570}}}},hitmontop:{".":{".":{regular:{x:640,y:570},shiny:{x:680,y:570}}}},smoochum:{".":{".":{regular:{x:720,y:570},shiny:{x:760,y:570}}}},elekid:{".":{".":{regular:{x:800,y:570}, 49 | shiny:{x:840,y:570}}}},magby:{".":{".":{regular:{x:880,y:570},shiny:{x:920,y:570}}}},miltank:{".":{".":{regular:{x:960,y:570},shiny:{x:1E3,y:570}}}},blissey:{".":{".":{regular:{x:1040,y:570},shiny:{x:1080,y:570}}}},raikou:{".":{".":{regular:{x:1120,y:570},shiny:{x:1160,y:570}}}},entei:{".":{".":{regular:{x:1200,y:570},shiny:{x:1240,y:570}}}},suicune:{".":{".":{regular:{x:0,y:600},shiny:{x:40,y:600}}}},larvitar:{".":{".":{regular:{x:80,y:600},shiny:{x:120,y:600}}}},pupitar:{".":{".":{regular:{x:160, 50 | y:600},shiny:{x:200,y:600}}}},tyranitar:{".":{".":{regular:{x:240,y:600},shiny:{x:280,y:600}}},mega:{".":{regular:{x:320,y:600},shiny:{x:360,y:600}}}},lugia:{".":{".":{regular:{x:400,y:600},shiny:{x:440,y:600}}}},"ho-oh":{".":{".":{regular:{x:480,y:600},shiny:{x:520,y:600}}}},celebi:{".":{".":{regular:{x:560,y:600},shiny:{x:600,y:600}}}},treecko:{".":{".":{regular:{x:640,y:600},shiny:{x:680,y:600}}}},grovyle:{".":{".":{regular:{x:720,y:600},shiny:{x:760,y:600}}}},sceptile:{".":{".":{regular:{x:800, 51 | y:600},shiny:{x:840,y:600}}}},torchic:{".":{".":{regular:{x:880,y:600},shiny:{x:920,y:600}}}},combusken:{".":{".":{regular:{x:960,y:600},shiny:{x:1E3,y:600}}}},blaziken:{".":{".":{regular:{x:1040,y:600},shiny:{x:1080,y:600}}},mega:{".":{regular:{x:1120,y:600},shiny:{x:1160,y:600}}}},mudkip:{".":{".":{regular:{x:1200,y:600},shiny:{x:1240,y:600}}}},marshtomp:{".":{".":{regular:{x:0,y:630},shiny:{x:40,y:630}}}},swampert:{".":{".":{regular:{x:80,y:630},shiny:{x:120,y:630}}}},poochyena:{".":{".":{regular:{x:160, 52 | y:630},shiny:{x:200,y:630}}}},mightyena:{".":{".":{regular:{x:240,y:630},shiny:{x:280,y:630}}}},zigzagoon:{".":{".":{regular:{x:320,y:630},shiny:{x:360,y:630}}}},linoone:{".":{".":{regular:{x:400,y:630},shiny:{x:440,y:630}}}},wurmple:{".":{".":{regular:{x:480,y:630},shiny:{x:520,y:630}}}},silcoon:{".":{".":{regular:{x:560,y:630},shiny:{x:600,y:630}}}},beautifly:{".":{".":{regular:{x:640,y:630},shiny:{x:680,y:630}}}},cascoon:{".":{".":{regular:{x:720,y:630},shiny:{x:760,y:630}}}},dustox:{".":{".":{regular:{x:800, 53 | y:630},shiny:{x:840,y:630}}}},lotad:{".":{".":{regular:{x:880,y:630},shiny:{x:920,y:630}}}},lombre:{".":{".":{regular:{x:960,y:630},shiny:{x:1E3,y:630}}}},ludicolo:{".":{".":{regular:{x:1040,y:630},shiny:{x:1080,y:630}}}},seedot:{".":{".":{regular:{x:1120,y:630},shiny:{x:1160,y:630}}}},nuzleaf:{".":{".":{regular:{x:1200,y:630},shiny:{x:1240,y:630}}}},shiftry:{".":{".":{regular:{x:0,y:660},shiny:{x:40,y:660}}}},taillow:{".":{".":{regular:{x:80,y:660},shiny:{x:120,y:660}}}},swellow:{".":{".":{regular:{x:160, 54 | y:660},shiny:{x:200,y:660}}}},wingull:{".":{".":{regular:{x:240,y:660},shiny:{x:280,y:660}}}},pelipper:{".":{".":{regular:{x:320,y:660},shiny:{x:360,y:660}}}},ralts:{".":{".":{regular:{x:400,y:660},shiny:{x:440,y:660}}}},kirlia:{".":{".":{regular:{x:480,y:660},shiny:{x:520,y:660}}}},gardevoir:{".":{".":{regular:{x:560,y:660},shiny:{x:600,y:660}}},mega:{".":{regular:{x:640,y:660},shiny:{x:680,y:660}}}},surskit:{".":{".":{regular:{x:720,y:660},shiny:{x:760,y:660}}}},masquerain:{".":{".":{regular:{x:800, 55 | y:660},shiny:{x:840,y:660}}}},shroomish:{".":{".":{regular:{x:880,y:660},shiny:{x:920,y:660}}}},breloom:{".":{".":{regular:{x:960,y:660},shiny:{x:1E3,y:660}}}},slakoth:{".":{".":{regular:{x:1040,y:660},shiny:{x:1080,y:660}}}},vigoroth:{".":{".":{regular:{x:1120,y:660},shiny:{x:1160,y:660}}}},slaking:{".":{".":{regular:{x:1200,y:660},shiny:{x:1240,y:660}}}},nincada:{".":{".":{regular:{x:0,y:690},shiny:{x:40,y:690}}}},ninjask:{".":{".":{regular:{x:80,y:690},shiny:{x:120,y:690}}}},shedinja:{".":{".":{regular:{x:160, 56 | y:690},shiny:{x:200,y:690}}}},whismur:{".":{".":{regular:{x:240,y:690},shiny:{x:280,y:690}}}},loudred:{".":{".":{regular:{x:320,y:690},shiny:{x:360,y:690}}}},exploud:{".":{".":{regular:{x:400,y:690},shiny:{x:440,y:690}}}},makuhita:{".":{".":{regular:{x:480,y:690},shiny:{x:520,y:690}}}},hariyama:{".":{".":{regular:{x:560,y:690},shiny:{x:600,y:690}}}},azurill:{".":{".":{regular:{x:640,y:690},shiny:{x:680,y:690}}}},nosepass:{".":{".":{regular:{x:720,y:690},shiny:{x:760,y:690}}}},skitty:{".":{".":{regular:{x:800, 57 | y:690},shiny:{x:840,y:690}}}},delcatty:{".":{".":{regular:{x:880,y:690},shiny:{x:920,y:690}}}},sableye:{".":{".":{regular:{x:960,y:690},shiny:{x:1E3,y:690}}}},mawile:{".":{".":{regular:{x:1040,y:690},shiny:{x:1080,y:690}}},mega:{".":{regular:{x:1120,y:690},shiny:{x:1160,y:690}}}},aron:{".":{".":{regular:{x:1200,y:690},shiny:{x:1240,y:690}}}},lairon:{".":{".":{regular:{x:0,y:720},shiny:{x:40,y:720}}}},aggron:{".":{".":{regular:{x:80,y:720},shiny:{x:120,y:720}}},mega:{".":{regular:{x:160,y:720},shiny:{x:200, 58 | y:720}}}},meditite:{".":{".":{regular:{x:240,y:720},shiny:{x:280,y:720}}}},medicham:{".":{".":{regular:{x:320,y:720},shiny:{x:360,y:720}}},mega:{".":{regular:{x:400,y:720},shiny:{x:440,y:720}}}},electrike:{".":{".":{regular:{x:480,y:720},shiny:{x:520,y:720}}}},manectric:{".":{".":{regular:{x:560,y:720},shiny:{x:600,y:720}}},mega:{".":{regular:{x:640,y:720},shiny:{x:680,y:720}}}},plusle:{".":{".":{regular:{x:720,y:720},shiny:{x:760,y:720}}}},minun:{".":{".":{regular:{x:800,y:720},shiny:{x:840,y:720}}}}, 59 | volbeat:{".":{".":{regular:{x:880,y:720},shiny:{x:920,y:720}}}},illumise:{".":{".":{regular:{x:960,y:720},shiny:{x:1E3,y:720}}}},roselia:{".":{".":{regular:{x:1040,y:720},shiny:{x:1120,y:720}},right:{regular:{x:1080,y:720},shiny:{x:1160,y:720}}}},gulpin:{".":{".":{regular:{x:1200,y:720},shiny:{x:1240,y:720}}}},swalot:{".":{".":{regular:{x:0,y:750},shiny:{x:40,y:750}}}},carvanha:{".":{".":{regular:{x:80,y:750},shiny:{x:120,y:750}}}},sharpedo:{".":{".":{regular:{x:160,y:750},shiny:{x:200,y:750}}}}, 60 | wailmer:{".":{".":{regular:{x:240,y:750},shiny:{x:280,y:750}}}},wailord:{".":{".":{regular:{x:320,y:750},shiny:{x:360,y:750}}}},numel:{".":{".":{regular:{x:400,y:750},shiny:{x:440,y:750}}}},camerupt:{".":{".":{regular:{x:480,y:750},shiny:{x:520,y:750}}}},torkoal:{".":{".":{regular:{x:560,y:750},shiny:{x:600,y:750}}}},spoink:{".":{".":{regular:{x:640,y:750},shiny:{x:680,y:750}}}},grumpig:{".":{".":{regular:{x:720,y:750},shiny:{x:760,y:750}}}},spinda:{".":{".":{regular:{x:800,y:750},shiny:{x:840,y:750}}}}, 61 | trapinch:{".":{".":{regular:{x:880,y:750},shiny:{x:920,y:750}}}},vibrava:{".":{".":{regular:{x:960,y:750},shiny:{x:1E3,y:750}}}},flygon:{".":{".":{regular:{x:1040,y:750},shiny:{x:1080,y:750}}}},cacnea:{".":{".":{regular:{x:1120,y:750},shiny:{x:1160,y:750}}}},cacturne:{".":{".":{regular:{x:1200,y:750},shiny:{x:1240,y:750}}}},swablu:{".":{".":{regular:{x:0,y:780},shiny:{x:40,y:780}}}},altaria:{".":{".":{regular:{x:80,y:780},shiny:{x:120,y:780}}}},zangoose:{".":{".":{regular:{x:160,y:780},shiny:{x:240, 62 | y:780}},right:{regular:{x:200,y:780},shiny:{x:280,y:780}}}},seviper:{".":{".":{regular:{x:320,y:780},shiny:{x:400,y:780}},right:{regular:{x:360,y:780},shiny:{x:440,y:780}}}},lunatone:{".":{".":{regular:{x:480,y:780},shiny:{x:520,y:780}}}},solrock:{".":{".":{regular:{x:560,y:780},shiny:{x:600,y:780}}}},barboach:{".":{".":{regular:{x:640,y:780},shiny:{x:680,y:780}}}},whiscash:{".":{".":{regular:{x:720,y:780},shiny:{x:760,y:780}}}},corphish:{".":{".":{regular:{x:800,y:780},shiny:{x:840,y:780}}}},crawdaunt:{".":{".":{regular:{x:880, 63 | y:780},shiny:{x:920,y:780}}}},baltoy:{".":{".":{regular:{x:960,y:780},shiny:{x:1E3,y:780}}}},claydol:{".":{".":{regular:{x:1040,y:780},shiny:{x:1080,y:780}}}},lileep:{".":{".":{regular:{x:1120,y:780},shiny:{x:1160,y:780}}}},cradily:{".":{".":{regular:{x:1200,y:780},shiny:{x:1240,y:780}}}},anorith:{".":{".":{regular:{x:0,y:810},shiny:{x:40,y:810}}}},armaldo:{".":{".":{regular:{x:80,y:810},shiny:{x:120,y:810}}}},feebas:{".":{".":{regular:{x:160,y:810},shiny:{x:200,y:810}}}},milotic:{".":{".":{regular:{x:240, 64 | y:810},shiny:{x:280,y:810}}}},castform:{".":{".":{regular:{x:320,y:810},shiny:{x:360,y:810}}},rainy:{".":{regular:{x:400,y:810},shiny:{x:440,y:810}}},snowy:{".":{regular:{x:480,y:810},shiny:{x:560,y:810}},right:{regular:{x:520,y:810},shiny:{x:600,y:810}}},sunny:{".":{regular:{x:640,y:810},shiny:{x:680,y:810}}}},kecleon:{".":{".":{regular:{x:720,y:810},shiny:{x:760,y:810}}}},shuppet:{".":{".":{regular:{x:800,y:810},shiny:{x:840,y:810}}}},banette:{".":{".":{regular:{x:880,y:810},shiny:{x:920,y:810}}}, 65 | mega:{".":{regular:{x:960,y:810},shiny:{x:1E3,y:810}}}},duskull:{".":{".":{regular:{x:1040,y:810},shiny:{x:1080,y:810}}}},dusclops:{".":{".":{regular:{x:1120,y:810},shiny:{x:1160,y:810}}}},tropius:{".":{".":{regular:{x:1200,y:810},shiny:{x:1240,y:810}}}},chimecho:{".":{".":{regular:{x:0,y:840},shiny:{x:40,y:840}}}},absol:{".":{".":{regular:{x:80,y:840},shiny:{x:160,y:840}},right:{regular:{x:120,y:840},shiny:{x:200,y:840}}},mega:{".":{regular:{x:240,y:840},shiny:{x:320,y:840}},right:{regular:{x:280, 66 | y:840},shiny:{x:360,y:840}}}},wynaut:{".":{".":{regular:{x:400,y:840},shiny:{x:440,y:840}}}},snorunt:{".":{".":{regular:{x:480,y:840},shiny:{x:520,y:840}}}},glalie:{".":{".":{regular:{x:560,y:840},shiny:{x:600,y:840}}}},spheal:{".":{".":{regular:{x:640,y:840},shiny:{x:680,y:840}}}},sealeo:{".":{".":{regular:{x:720,y:840},shiny:{x:760,y:840}}}},walrein:{".":{".":{regular:{x:800,y:840},shiny:{x:840,y:840}}}},clamperl:{".":{".":{regular:{x:880,y:840},shiny:{x:920,y:840}}}},huntail:{".":{".":{regular:{x:960, 67 | y:840},shiny:{x:1E3,y:840}}}},gorebyss:{".":{".":{regular:{x:1040,y:840},shiny:{x:1080,y:840}}}},relicanth:{".":{".":{regular:{x:1120,y:840},shiny:{x:1160,y:840}}}},luvdisc:{".":{".":{regular:{x:1200,y:840},shiny:{x:1240,y:840}}}},bagon:{".":{".":{regular:{x:0,y:870},shiny:{x:40,y:870}}}},shelgon:{".":{".":{regular:{x:80,y:870},shiny:{x:120,y:870}}}},salamence:{".":{".":{regular:{x:160,y:870},shiny:{x:200,y:870}}}},beldum:{".":{".":{regular:{x:240,y:870},shiny:{x:280,y:870}}}},metang:{".":{".":{regular:{x:320, 68 | y:870},shiny:{x:360,y:870}}}},metagross:{".":{".":{regular:{x:400,y:870},shiny:{x:440,y:870}}}},regirock:{".":{".":{regular:{x:480,y:870},shiny:{x:560,y:870}},right:{regular:{x:520,y:870},shiny:{x:600,y:870}}}},regice:{".":{".":{regular:{x:640,y:870},shiny:{x:680,y:870}}}},registeel:{".":{".":{regular:{x:720,y:870},shiny:{x:760,y:870}}}},latias:{".":{".":{regular:{x:800,y:870},shiny:{x:840,y:870}}},mega:{".":{regular:{x:880,y:870},shiny:{x:920,y:870}}}},latios:{".":{".":{regular:{x:960,y:870},shiny:{x:1E3, 69 | y:870}}},mega:{".":{regular:{x:1040,y:870},shiny:{x:1080,y:870}}}},kyogre:{".":{".":{regular:{x:1120,y:870},shiny:{x:1160,y:870}}}},groudon:{".":{".":{regular:{x:1200,y:870},shiny:{x:1240,y:870}}}},rayquaza:{".":{".":{regular:{x:0,y:900},shiny:{x:40,y:900}}}},jirachi:{".":{".":{regular:{x:80,y:900},shiny:{x:120,y:900}}}},deoxys:{".":{".":{regular:{x:160,y:900},shiny:{x:200,y:900}}},attack:{".":{regular:{x:240,y:900},shiny:{x:280,y:900}}},defense:{".":{regular:{x:320,y:900},shiny:{x:360,y:900}}},normal:{".":{regular:{x:160, 70 | y:900},shiny:{x:200,y:900}}},speed:{".":{regular:{x:400,y:900},shiny:{x:440,y:900}}}},turtwig:{".":{".":{regular:{x:480,y:900},shiny:{x:520,y:900}}}},grotle:{".":{".":{regular:{x:560,y:900},shiny:{x:600,y:900}}}},torterra:{".":{".":{regular:{x:640,y:900},shiny:{x:720,y:900}},right:{regular:{x:680,y:900},shiny:{x:760,y:900}}}},chimchar:{".":{".":{regular:{x:800,y:900},shiny:{x:840,y:900}}}},monferno:{".":{".":{regular:{x:880,y:900},shiny:{x:920,y:900}}}},infernape:{".":{".":{regular:{x:960,y:900}, 71 | shiny:{x:1E3,y:900}}}},piplup:{".":{".":{regular:{x:1040,y:900},shiny:{x:1080,y:900}}}},prinplup:{".":{".":{regular:{x:1120,y:900},shiny:{x:1160,y:900}}}},empoleon:{".":{".":{regular:{x:1200,y:900},shiny:{x:1240,y:900}}}},starly:{".":{".":{regular:{x:0,y:930},shiny:{x:40,y:930}}}},staravia:{".":{".":{regular:{x:80,y:930},shiny:{x:120,y:930}}}},staraptor:{".":{".":{regular:{x:160,y:930},shiny:{x:200,y:930}}}},bidoof:{".":{".":{regular:{x:240,y:930},shiny:{x:280,y:930}}}},bibarel:{".":{".":{regular:{x:320, 72 | y:930},shiny:{x:360,y:930}}}},kricketot:{".":{".":{regular:{x:400,y:930},shiny:{x:440,y:930}}}},kricketune:{".":{".":{regular:{x:480,y:930},shiny:{x:520,y:930}}}},shinx:{".":{".":{regular:{x:560,y:930},shiny:{x:600,y:930}}}},luxio:{".":{".":{regular:{x:640,y:930},shiny:{x:680,y:930}}}},luxray:{".":{".":{regular:{x:720,y:930},shiny:{x:760,y:930}}}},budew:{".":{".":{regular:{x:800,y:930},shiny:{x:880,y:930}},right:{regular:{x:840,y:930},shiny:{x:920,y:930}}}},roserade:{".":{".":{regular:{x:960,y:930}, 73 | shiny:{x:1040,y:930}},right:{regular:{x:1E3,y:930},shiny:{x:1080,y:930}}}},cranidos:{".":{".":{regular:{x:1120,y:930},shiny:{x:1160,y:930}}}},rampardos:{".":{".":{regular:{x:1200,y:930},shiny:{x:1240,y:930}}}},shieldon:{".":{".":{regular:{x:0,y:960},shiny:{x:40,y:960}}}},bastiodon:{".":{".":{regular:{x:80,y:960},shiny:{x:120,y:960}}}},burmy:{".":{".":{regular:{x:160,y:960},shiny:{x:200,y:960}}},plant:{".":{regular:{x:160,y:960},shiny:{x:200,y:960}}},sandy:{".":{regular:{x:240,y:960},shiny:{x:280, 74 | y:960}}},trash:{".":{regular:{x:320,y:960},shiny:{x:360,y:960}}}},wormadam:{".":{".":{regular:{x:400,y:960},shiny:{x:440,y:960}}},plant:{".":{regular:{x:400,y:960},shiny:{x:440,y:960}}},sandy:{".":{regular:{x:480,y:960},shiny:{x:520,y:960}}},trash:{".":{regular:{x:560,y:960},shiny:{x:600,y:960}}}},mothim:{".":{".":{regular:{x:640,y:960},shiny:{x:680,y:960}}}},combee:{".":{".":{regular:{x:720,y:960},shiny:{x:760,y:960}}}},vespiquen:{".":{".":{regular:{x:800,y:960},shiny:{x:840,y:960}}}},pachirisu:{".":{".":{regular:{x:880, 75 | y:960},shiny:{x:920,y:960}}}},buizel:{".":{".":{regular:{x:960,y:960},shiny:{x:1E3,y:960}}}},floatzel:{".":{".":{regular:{x:1040,y:960},shiny:{x:1080,y:960}}}},cherubi:{".":{".":{regular:{x:1120,y:960},shiny:{x:1160,y:960}}}},cherrim:{".":{".":{regular:{x:1200,y:960},shiny:{x:1240,y:960}}},overcast:{".":{regular:{x:1200,y:960},shiny:{x:1240,y:960}}},sunshine:{".":{regular:{x:0,y:990},shiny:{x:40,y:990}}}},shellos:{".":{".":{regular:{x:80,y:990},shiny:{x:120,y:990}}},east:{".":{regular:{x:160,y:990}, 76 | shiny:{x:200,y:990}}},west:{".":{regular:{x:80,y:990},shiny:{x:120,y:990}}}},gastrodon:{".":{".":{regular:{x:240,y:990},shiny:{x:280,y:990}}},east:{".":{regular:{x:320,y:990},shiny:{x:360,y:990}}},west:{".":{regular:{x:240,y:990},shiny:{x:280,y:990}}}},ambipom:{".":{".":{regular:{x:400,y:990},shiny:{x:440,y:990}}}},drifloon:{".":{".":{regular:{x:480,y:990},shiny:{x:520,y:990}}}},drifblim:{".":{".":{regular:{x:560,y:990},shiny:{x:600,y:990}}}},buneary:{".":{".":{regular:{x:640,y:990},shiny:{x:680, 77 | y:990}}}},lopunny:{".":{".":{regular:{x:720,y:990},shiny:{x:760,y:990}}}},mismagius:{".":{".":{regular:{x:800,y:990},shiny:{x:840,y:990}}}},honchkrow:{".":{".":{regular:{x:880,y:990},shiny:{x:920,y:990}}}},glameow:{".":{".":{regular:{x:960,y:990},shiny:{x:1E3,y:990}}}},purugly:{".":{".":{regular:{x:1040,y:990},shiny:{x:1080,y:990}}}},chingling:{".":{".":{regular:{x:1120,y:990},shiny:{x:1160,y:990}}}},stunky:{".":{".":{regular:{x:1200,y:990},shiny:{x:1240,y:990}}}},skuntank:{".":{".":{regular:{x:0, 78 | y:1020},shiny:{x:40,y:1020}}}},bronzor:{".":{".":{regular:{x:80,y:1020},shiny:{x:120,y:1020}}}},bronzong:{".":{".":{regular:{x:160,y:1020},shiny:{x:200,y:1020}}}},bonsly:{".":{".":{regular:{x:240,y:1020},shiny:{x:280,y:1020}}}},"mime-jr":{".":{".":{regular:{x:320,y:1020},shiny:{x:360,y:1020}}}},happiny:{".":{".":{regular:{x:400,y:1020},shiny:{x:440,y:1020}}}},chatot:{".":{".":{regular:{x:480,y:1020},shiny:{x:520,y:1020}}}},spiritomb:{".":{".":{regular:{x:560,y:1020},shiny:{x:600,y:1020}}}},gible:{".":{".":{regular:{x:640, 79 | y:1020},shiny:{x:680,y:1020}}}},gabite:{".":{".":{regular:{x:720,y:1020},shiny:{x:760,y:1020}}}},garchomp:{".":{".":{regular:{x:800,y:1020},shiny:{x:840,y:1020}}},mega:{".":{regular:{x:880,y:1020},shiny:{x:920,y:1020}}}},munchlax:{".":{".":{regular:{x:960,y:1020},shiny:{x:1E3,y:1020}}}},riolu:{".":{".":{regular:{x:1040,y:1020},shiny:{x:1080,y:1020}}}},lucario:{".":{".":{regular:{x:1120,y:1020},shiny:{x:1160,y:1020}}},mega:{".":{regular:{x:1200,y:1020},shiny:{x:1240,y:1020}}}},hippopotas:{".":{".":{regular:{x:0, 80 | y:1050},shiny:{x:40,y:1050}}}},hippowdon:{".":{".":{regular:{x:80,y:1050},shiny:{x:120,y:1050}}}},skorupi:{".":{".":{regular:{x:160,y:1050},shiny:{x:200,y:1050}}}},drapion:{".":{".":{regular:{x:240,y:1050},shiny:{x:280,y:1050}}}},croagunk:{".":{".":{regular:{x:320,y:1050},shiny:{x:360,y:1050}}}},toxicroak:{".":{".":{regular:{x:400,y:1050},shiny:{x:440,y:1050}}}},carnivine:{".":{".":{regular:{x:480,y:1050},shiny:{x:520,y:1050}}}},finneon:{".":{".":{regular:{x:560,y:1050},shiny:{x:600,y:1050}}}},lumineon:{".":{".":{regular:{x:640, 81 | y:1050},shiny:{x:680,y:1050}}}},mantyke:{".":{".":{regular:{x:720,y:1050},shiny:{x:760,y:1050}}}},snover:{".":{".":{regular:{x:800,y:1050},shiny:{x:840,y:1050}}}},abomasnow:{".":{".":{regular:{x:880,y:1050},shiny:{x:920,y:1050}}},mega:{".":{regular:{x:960,y:1050},shiny:{x:1E3,y:1050}}}},weavile:{".":{".":{regular:{x:1040,y:1050},shiny:{x:1080,y:1050}}}},magnezone:{".":{".":{regular:{x:1120,y:1050},shiny:{x:1160,y:1050}}}},lickilicky:{".":{".":{regular:{x:1200,y:1050},shiny:{x:1240,y:1050}}}},rhyperior:{".":{".":{regular:{x:0, 82 | y:1080},shiny:{x:40,y:1080}}}},tangrowth:{".":{".":{regular:{x:80,y:1080},shiny:{x:120,y:1080}}}},electivire:{".":{".":{regular:{x:160,y:1080},shiny:{x:200,y:1080}}}},magmortar:{".":{".":{regular:{x:240,y:1080},shiny:{x:320,y:1080}},right:{regular:{x:280,y:1080},shiny:{x:360,y:1080}}}},togekiss:{".":{".":{regular:{x:400,y:1080},shiny:{x:480,y:1080}},right:{regular:{x:440,y:1080},shiny:{x:520,y:1080}}}},yanmega:{".":{".":{regular:{x:560,y:1080},shiny:{x:600,y:1080}}}},leafeon:{".":{".":{regular:{x:640, 83 | y:1080},shiny:{x:680,y:1080}}}},glaceon:{".":{".":{regular:{x:720,y:1080},shiny:{x:760,y:1080}}}},gliscor:{".":{".":{regular:{x:800,y:1080},shiny:{x:840,y:1080}}}},mamoswine:{".":{".":{regular:{x:880,y:1080},shiny:{x:920,y:1080}}}},"porygon-z":{".":{".":{regular:{x:960,y:1080},shiny:{x:1E3,y:1080}}}},gallade:{".":{".":{regular:{x:1040,y:1080},shiny:{x:1080,y:1080}}}},probopass:{".":{".":{regular:{x:1120,y:1080},shiny:{x:1160,y:1080}}}},dusknoir:{".":{".":{regular:{x:1200,y:1080},shiny:{x:1240,y:1080}}}}, 84 | froslass:{".":{".":{regular:{x:0,y:1110},shiny:{x:40,y:1110}}}},rotom:{".":{".":{regular:{x:80,y:1110},shiny:{x:120,y:1110}}},fan:{".":{regular:{x:160,y:1110},shiny:{x:200,y:1110}}},frost:{".":{regular:{x:240,y:1110},shiny:{x:280,y:1110}}},heat:{".":{regular:{x:320,y:1110},shiny:{x:360,y:1110}}},mow:{".":{regular:{x:400,y:1110},shiny:{x:440,y:1110}}},wash:{".":{regular:{x:480,y:1110},shiny:{x:560,y:1110}},right:{regular:{x:520,y:1110},shiny:{x:600,y:1110}}}},uxie:{".":{".":{regular:{x:640,y:1110}, 85 | shiny:{x:680,y:1110}}}},mesprit:{".":{".":{regular:{x:720,y:1110},shiny:{x:760,y:1110}}}},azelf:{".":{".":{regular:{x:800,y:1110},shiny:{x:840,y:1110}}}},dialga:{".":{".":{regular:{x:880,y:1110},shiny:{x:920,y:1110}}}},palkia:{".":{".":{regular:{x:960,y:1110},shiny:{x:1E3,y:1110}}}},heatran:{".":{".":{regular:{x:1040,y:1110},shiny:{x:1080,y:1110}}}},regigigas:{".":{".":{regular:{x:1120,y:1110},shiny:{x:1160,y:1110}}}},giratina:{".":{".":{regular:{x:1200,y:1110},shiny:{x:1240,y:1110}}},altered:{".":{regular:{x:1200, 86 | y:1110},shiny:{x:1240,y:1110}}},origin:{".":{regular:{x:0,y:1140},shiny:{x:40,y:1140}}}},cresselia:{".":{".":{regular:{x:80,y:1140},shiny:{x:120,y:1140}}}},phione:{".":{".":{regular:{x:160,y:1140},shiny:{x:200,y:1140}}}},manaphy:{".":{".":{regular:{x:240,y:1140},shiny:{x:280,y:1140}}}},darkrai:{".":{".":{regular:{x:320,y:1140},shiny:{x:360,y:1140}}}},shaymin:{".":{".":{regular:{x:400,y:1140},shiny:{x:440,y:1140}}},land:{".":{regular:{x:400,y:1140},shiny:{x:440,y:1140}}},sky:{".":{regular:{x:480,y:1140}, 87 | shiny:{x:560,y:1140}},right:{regular:{x:520,y:1140},shiny:{x:600,y:1140}}}},arceus:{".":{".":{regular:{x:640,y:1140},shiny:{x:680,y:1140}}},bug:{".":{regular:{x:640,y:1140},shiny:{x:680,y:1140}}},dark:{".":{regular:{x:640,y:1140},shiny:{x:680,y:1140}}},dragon:{".":{regular:{x:640,y:1140},shiny:{x:680,y:1140}}},electric:{".":{regular:{x:640,y:1140},shiny:{x:680,y:1140}}},fairy:{".":{regular:{x:640,y:1140},shiny:{x:680,y:1140}}},fighting:{".":{regular:{x:640,y:1140},shiny:{x:680,y:1140}}},fire:{".":{regular:{x:640, 88 | y:1140},shiny:{x:680,y:1140}}},flying:{".":{regular:{x:640,y:1140},shiny:{x:680,y:1140}}},ghost:{".":{regular:{x:640,y:1140},shiny:{x:680,y:1140}}},grass:{".":{regular:{x:640,y:1140},shiny:{x:680,y:1140}}},ground:{".":{regular:{x:640,y:1140},shiny:{x:680,y:1140}}},ice:{".":{regular:{x:640,y:1140},shiny:{x:680,y:1140}}},normal:{".":{regular:{x:640,y:1140},shiny:{x:680,y:1140}}},poison:{".":{regular:{x:640,y:1140},shiny:{x:680,y:1140}}},psychic:{".":{regular:{x:640,y:1140},shiny:{x:680,y:1140}}},rock:{".":{regular:{x:640, 89 | y:1140},shiny:{x:680,y:1140}}},steel:{".":{regular:{x:640,y:1140},shiny:{x:680,y:1140}}},water:{".":{regular:{x:640,y:1140},shiny:{x:680,y:1140}}}},victini:{".":{".":{regular:{x:720,y:1140},shiny:{x:760,y:1140}}}},snivy:{".":{".":{regular:{x:800,y:1140},shiny:{x:840,y:1140}}}},servine:{".":{".":{regular:{x:880,y:1140},shiny:{x:920,y:1140}}}},serperior:{".":{".":{regular:{x:960,y:1140},shiny:{x:1E3,y:1140}}}},tepig:{".":{".":{regular:{x:1040,y:1140},shiny:{x:1080,y:1140}}}},pignite:{".":{".":{regular:{x:1120, 90 | y:1140},shiny:{x:1160,y:1140}}}},emboar:{".":{".":{regular:{x:1200,y:1140},shiny:{x:0,y:1170}},right:{regular:{x:1240,y:1140},shiny:{x:40,y:1170}}}},oshawott:{".":{".":{regular:{x:80,y:1170},shiny:{x:120,y:1170}}}},dewott:{".":{".":{regular:{x:160,y:1170},shiny:{x:200,y:1170}}}},samurott:{".":{".":{regular:{x:240,y:1170},shiny:{x:280,y:1170}}}},patrat:{".":{".":{regular:{x:320,y:1170},shiny:{x:360,y:1170}}}},watchog:{".":{".":{regular:{x:400,y:1170},shiny:{x:440,y:1170}}}},lillipup:{".":{".":{regular:{x:480, 91 | y:1170},shiny:{x:520,y:1170}}}},herdier:{".":{".":{regular:{x:560,y:1170},shiny:{x:600,y:1170}}}},stoutland:{".":{".":{regular:{x:640,y:1170},shiny:{x:680,y:1170}}}},purrloin:{".":{".":{regular:{x:720,y:1170},shiny:{x:760,y:1170}}}},liepard:{".":{".":{regular:{x:800,y:1170},shiny:{x:840,y:1170}}}},pansage:{".":{".":{regular:{x:880,y:1170},shiny:{x:920,y:1170}}}},simisage:{".":{".":{regular:{x:960,y:1170},shiny:{x:1E3,y:1170}}}},pansear:{".":{".":{regular:{x:1040,y:1170},shiny:{x:1120,y:1170}},right:{regular:{x:1080, 92 | y:1170},shiny:{x:1160,y:1170}}}},simisear:{".":{".":{regular:{x:1200,y:1170},shiny:{x:0,y:1200}},right:{regular:{x:1240,y:1170},shiny:{x:40,y:1200}}}},panpour:{".":{".":{regular:{x:80,y:1200},shiny:{x:120,y:1200}}}},simipour:{".":{".":{regular:{x:160,y:1200},shiny:{x:200,y:1200}}}},munna:{".":{".":{regular:{x:240,y:1200},shiny:{x:280,y:1200}}}},musharna:{".":{".":{regular:{x:320,y:1200},shiny:{x:360,y:1200}}}},pidove:{".":{".":{regular:{x:400,y:1200},shiny:{x:440,y:1200}}}},tranquill:{".":{".":{regular:{x:480, 93 | y:1200},shiny:{x:520,y:1200}}}},unfezant:{".":{".":{regular:{x:560,y:1200},shiny:{x:640,y:1200}},female:{regular:{x:600,y:1200},shiny:{x:680,y:1200}}}},blitzle:{".":{".":{regular:{x:720,y:1200},shiny:{x:760,y:1200}}}},zebstrika:{".":{".":{regular:{x:800,y:1200},shiny:{x:840,y:1200}}}},roggenrola:{".":{".":{regular:{x:880,y:1200},shiny:{x:920,y:1200}}}},boldore:{".":{".":{regular:{x:960,y:1200},shiny:{x:1E3,y:1200}}}},gigalith:{".":{".":{regular:{x:1040,y:1200},shiny:{x:1080,y:1200}}}},woobat:{".":{".":{regular:{x:1120, 94 | y:1200},shiny:{x:1160,y:1200}}}},swoobat:{".":{".":{regular:{x:1200,y:1200},shiny:{x:1240,y:1200}}}},drilbur:{".":{".":{regular:{x:0,y:1230},shiny:{x:80,y:1230}},right:{regular:{x:40,y:1230},shiny:{x:120,y:1230}}}},excadrill:{".":{".":{regular:{x:160,y:1230},shiny:{x:240,y:1230}},right:{regular:{x:200,y:1230},shiny:{x:280,y:1230}}}},audino:{".":{".":{regular:{x:320,y:1230},shiny:{x:360,y:1230}}}},timburr:{".":{".":{regular:{x:400,y:1230},shiny:{x:440,y:1230}}}},gurdurr:{".":{".":{regular:{x:480,y:1230}, 95 | shiny:{x:520,y:1230}}}},conkeldurr:{".":{".":{regular:{x:560,y:1230},shiny:{x:600,y:1230}}}},tympole:{".":{".":{regular:{x:640,y:1230},shiny:{x:680,y:1230}}}},palpitoad:{".":{".":{regular:{x:720,y:1230},shiny:{x:760,y:1230}}}},seismitoad:{".":{".":{regular:{x:800,y:1230},shiny:{x:840,y:1230}}}},throh:{".":{".":{regular:{x:880,y:1230},shiny:{x:920,y:1230}}}},sawk:{".":{".":{regular:{x:960,y:1230},shiny:{x:1040,y:1230}},right:{regular:{x:1E3,y:1230},shiny:{x:1080,y:1230}}}},sewaddle:{".":{".":{regular:{x:1120, 96 | y:1230},shiny:{x:1160,y:1230}}}},swadloon:{".":{".":{regular:{x:1200,y:1230},shiny:{x:1240,y:1230}}}},leavanny:{".":{".":{regular:{x:0,y:1260},shiny:{x:40,y:1260}}}},venipede:{".":{".":{regular:{x:80,y:1260},shiny:{x:120,y:1260}}}},whirlipede:{".":{".":{regular:{x:160,y:1260},shiny:{x:200,y:1260}}}},scolipede:{".":{".":{regular:{x:240,y:1260},shiny:{x:280,y:1260}}}},cottonee:{".":{".":{regular:{x:320,y:1260},shiny:{x:360,y:1260}}}},whimsicott:{".":{".":{regular:{x:400,y:1260},shiny:{x:440,y:1260}}}}, 97 | petilil:{".":{".":{regular:{x:480,y:1260},shiny:{x:520,y:1260}}}},lilligant:{".":{".":{regular:{x:560,y:1260},shiny:{x:640,y:1260}},right:{regular:{x:600,y:1260},shiny:{x:680,y:1260}}}},basculin:{".":{".":{regular:{x:720,y:1260},shiny:{x:760,y:1260}}},"blue-striped":{".":{regular:{x:800,y:1260},shiny:{x:840,y:1260}}},"red-striped":{".":{regular:{x:720,y:1260},shiny:{x:760,y:1260}}}},sandile:{".":{".":{regular:{x:880,y:1260},shiny:{x:920,y:1260}}}},krokorok:{".":{".":{regular:{x:960,y:1260},shiny:{x:1E3, 98 | y:1260}}}},krookodile:{".":{".":{regular:{x:1040,y:1260},shiny:{x:1080,y:1260}}}},darumaka:{".":{".":{regular:{x:1120,y:1260},shiny:{x:1160,y:1260}}}},darmanitan:{".":{".":{regular:{x:1200,y:1260},shiny:{x:1240,y:1260}}},standard:{".":{regular:{x:1200,y:1260},shiny:{x:1240,y:1260}}},zen:{".":{regular:{x:0,y:1290},shiny:{x:40,y:1290}}}},maractus:{".":{".":{regular:{x:80,y:1290},shiny:{x:120,y:1290}}}},dwebble:{".":{".":{regular:{x:160,y:1290},shiny:{x:200,y:1290}}}},crustle:{".":{".":{regular:{x:240, 99 | y:1290},shiny:{x:280,y:1290}}}},scraggy:{".":{".":{regular:{x:320,y:1290},shiny:{x:360,y:1290}}}},scrafty:{".":{".":{regular:{x:400,y:1290},shiny:{x:440,y:1290}}}},sigilyph:{".":{".":{regular:{x:480,y:1290},shiny:{x:520,y:1290}}}},yamask:{".":{".":{regular:{x:560,y:1290},shiny:{x:600,y:1290}}}},cofagrigus:{".":{".":{regular:{x:640,y:1290},shiny:{x:680,y:1290}}}},tirtouga:{".":{".":{regular:{x:720,y:1290},shiny:{x:760,y:1290}}}},carracosta:{".":{".":{regular:{x:800,y:1290},shiny:{x:840,y:1290}}}}, 100 | archen:{".":{".":{regular:{x:880,y:1290},shiny:{x:920,y:1290}}}},archeops:{".":{".":{regular:{x:960,y:1290},shiny:{x:1E3,y:1290}}}},trubbish:{".":{".":{regular:{x:1040,y:1290},shiny:{x:1080,y:1290}}}},garbodor:{".":{".":{regular:{x:1120,y:1290},shiny:{x:1200,y:1290}},right:{regular:{x:1160,y:1290},shiny:{x:1240,y:1290}}}},zorua:{".":{".":{regular:{x:0,y:1320},shiny:{x:40,y:1320}}}},zoroark:{".":{".":{regular:{x:80,y:1320},shiny:{x:120,y:1320}}}},minccino:{".":{".":{regular:{x:160,y:1320},shiny:{x:200, 101 | y:1320}}}},cinccino:{".":{".":{regular:{x:240,y:1320},shiny:{x:280,y:1320}}}},gothita:{".":{".":{regular:{x:320,y:1320},shiny:{x:360,y:1320}}}},gothorita:{".":{".":{regular:{x:400,y:1320},shiny:{x:440,y:1320}}}},gothitelle:{".":{".":{regular:{x:480,y:1320},shiny:{x:520,y:1320}}}},solosis:{".":{".":{regular:{x:560,y:1320},shiny:{x:640,y:1320}},right:{regular:{x:600,y:1320},shiny:{x:680,y:1320}}}},duosion:{".":{".":{regular:{x:720,y:1320},shiny:{x:760,y:1320}}}},reuniclus:{".":{".":{regular:{x:800, 102 | y:1320},shiny:{x:840,y:1320}}}},ducklett:{".":{".":{regular:{x:880,y:1320},shiny:{x:920,y:1320}}}},swanna:{".":{".":{regular:{x:960,y:1320},shiny:{x:1E3,y:1320}}}},vanillite:{".":{".":{regular:{x:1040,y:1320},shiny:{x:1080,y:1320}}}},vanillish:{".":{".":{regular:{x:1120,y:1320},shiny:{x:1160,y:1320}}}},vanilluxe:{".":{".":{regular:{x:1200,y:1320},shiny:{x:0,y:1350}},right:{regular:{x:1240,y:1320},shiny:{x:40,y:1350}}}},deerling:{".":{".":{regular:{x:80,y:1350},shiny:{x:120,y:1350}}},autumn:{".":{regular:{x:160, 103 | y:1350},shiny:{x:200,y:1350}}},spring:{".":{regular:{x:80,y:1350},shiny:{x:120,y:1350}}},summer:{".":{regular:{x:240,y:1350},shiny:{x:280,y:1350}}},winter:{".":{regular:{x:320,y:1350},shiny:{x:360,y:1350}}}},sawsbuck:{".":{".":{regular:{x:400,y:1350},shiny:{x:440,y:1350}}},autumn:{".":{regular:{x:480,y:1350},shiny:{x:520,y:1350}}},spring:{".":{regular:{x:400,y:1350},shiny:{x:440,y:1350}}},summer:{".":{regular:{x:560,y:1350},shiny:{x:600,y:1350}}},winter:{".":{regular:{x:640,y:1350},shiny:{x:680,y:1350}}}}, 104 | emolga:{".":{".":{regular:{x:720,y:1350},shiny:{x:760,y:1350}}}},karrablast:{".":{".":{regular:{x:800,y:1350},shiny:{x:840,y:1350}}}},escavalier:{".":{".":{regular:{x:880,y:1350},shiny:{x:920,y:1350}}}},foongus:{".":{".":{regular:{x:960,y:1350},shiny:{x:1E3,y:1350}}}},amoonguss:{".":{".":{regular:{x:1040,y:1350},shiny:{x:1120,y:1350}},right:{regular:{x:1080,y:1350},shiny:{x:1160,y:1350}}}},frillish:{".":{".":{regular:{x:1200,y:1350},shiny:{x:0,y:1380}},female:{regular:{x:1240,y:1350},shiny:{x:40, 105 | y:1380}}}},jellicent:{".":{".":{regular:{x:80,y:1380},shiny:{x:160,y:1380}},female:{regular:{x:120,y:1380},shiny:{x:200,y:1380}}}},alomomola:{".":{".":{regular:{x:240,y:1380},shiny:{x:280,y:1380}}}},joltik:{".":{".":{regular:{x:320,y:1380},shiny:{x:360,y:1380}}}},galvantula:{".":{".":{regular:{x:400,y:1380},shiny:{x:440,y:1380}}}},ferroseed:{".":{".":{regular:{x:480,y:1380},shiny:{x:520,y:1380}}}},ferrothorn:{".":{".":{regular:{x:560,y:1380},shiny:{x:600,y:1380}}}},klink:{".":{".":{regular:{x:640, 106 | y:1380},shiny:{x:720,y:1380}},right:{regular:{x:680,y:1380},shiny:{x:760,y:1380}}}},klang:{".":{".":{regular:{x:800,y:1380},shiny:{x:880,y:1380}},right:{regular:{x:840,y:1380},shiny:{x:920,y:1380}}}},klinklang:{".":{".":{regular:{x:960,y:1380},shiny:{x:1040,y:1380}},right:{regular:{x:1E3,y:1380},shiny:{x:1080,y:1380}}}},tynamo:{".":{".":{regular:{x:1120,y:1380},shiny:{x:1160,y:1380}}}},eelektrik:{".":{".":{regular:{x:1200,y:1380},shiny:{x:1240,y:1380}}}},eelektross:{".":{".":{regular:{x:0,y:1410}, 107 | shiny:{x:40,y:1410}}}},elgyem:{".":{".":{regular:{x:80,y:1410},shiny:{x:120,y:1410}}}},beheeyem:{".":{".":{regular:{x:160,y:1410},shiny:{x:200,y:1410}}}},litwick:{".":{".":{regular:{x:240,y:1410},shiny:{x:320,y:1410}},right:{regular:{x:280,y:1410},shiny:{x:360,y:1410}}}},lampent:{".":{".":{regular:{x:400,y:1410},shiny:{x:440,y:1410}}}},chandelure:{".":{".":{regular:{x:480,y:1410},shiny:{x:520,y:1410}}}},axew:{".":{".":{regular:{x:560,y:1410},shiny:{x:600,y:1410}}}},fraxure:{".":{".":{regular:{x:640, 108 | y:1410},shiny:{x:680,y:1410}}}},haxorus:{".":{".":{regular:{x:720,y:1410},shiny:{x:760,y:1410}}}},cubchoo:{".":{".":{regular:{x:800,y:1410},shiny:{x:840,y:1410}}}},beartic:{".":{".":{regular:{x:880,y:1410},shiny:{x:920,y:1410}}}},cryogonal:{".":{".":{regular:{x:960,y:1410},shiny:{x:1E3,y:1410}}}},shelmet:{".":{".":{regular:{x:1040,y:1410},shiny:{x:1080,y:1410}}}},accelgor:{".":{".":{regular:{x:1120,y:1410},shiny:{x:1160,y:1410}}}},stunfisk:{".":{".":{regular:{x:1200,y:1410},shiny:{x:1240,y:1410}}}}, 109 | mienfoo:{".":{".":{regular:{x:0,y:1440},shiny:{x:40,y:1440}}}},mienshao:{".":{".":{regular:{x:80,y:1440},shiny:{x:120,y:1440}}}},druddigon:{".":{".":{regular:{x:160,y:1440},shiny:{x:200,y:1440}}}},golett:{".":{".":{regular:{x:240,y:1440},shiny:{x:320,y:1440}},right:{regular:{x:280,y:1440},shiny:{x:360,y:1440}}}},golurk:{".":{".":{regular:{x:400,y:1440},shiny:{x:480,y:1440}},right:{regular:{x:440,y:1440},shiny:{x:520,y:1440}}}},pawniard:{".":{".":{regular:{x:560,y:1440},shiny:{x:600,y:1440}}}},bisharp:{".":{".":{regular:{x:640, 110 | y:1440},shiny:{x:680,y:1440}}}},bouffalant:{".":{".":{regular:{x:720,y:1440},shiny:{x:760,y:1440}}}},rufflet:{".":{".":{regular:{x:800,y:1440},shiny:{x:840,y:1440}}}},braviary:{".":{".":{regular:{x:880,y:1440},shiny:{x:920,y:1440}}}},vullaby:{".":{".":{regular:{x:960,y:1440},shiny:{x:1E3,y:1440}}}},mandibuzz:{".":{".":{regular:{x:1040,y:1440},shiny:{x:1080,y:1440}}}},heatmor:{".":{".":{regular:{x:1120,y:1440},shiny:{x:1160,y:1440}}}},durant:{".":{".":{regular:{x:1200,y:1440},shiny:{x:1240,y:1440}}}}, 111 | deino:{".":{".":{regular:{x:0,y:1470},shiny:{x:40,y:1470}}}},zweilous:{".":{".":{regular:{x:80,y:1470},shiny:{x:120,y:1470}}}},hydreigon:{".":{".":{regular:{x:160,y:1470},shiny:{x:200,y:1470}}}},larvesta:{".":{".":{regular:{x:240,y:1470},shiny:{x:280,y:1470}}}},volcarona:{".":{".":{regular:{x:320,y:1470},shiny:{x:360,y:1470}}}},cobalion:{".":{".":{regular:{x:400,y:1470},shiny:{x:440,y:1470}}}},terrakion:{".":{".":{regular:{x:480,y:1470},shiny:{x:520,y:1470}}}},virizion:{".":{".":{regular:{x:560,y:1470}, 112 | shiny:{x:600,y:1470}}}},tornadus:{".":{".":{regular:{x:640,y:1470},shiny:{x:680,y:1470}}},incarnate:{".":{regular:{x:640,y:1470},shiny:{x:680,y:1470}}},therian:{".":{regular:{x:720,y:1470},shiny:{x:760,y:1470}}}},thundurus:{".":{".":{regular:{x:800,y:1470},shiny:{x:840,y:1470}}},incarnate:{".":{regular:{x:800,y:1470},shiny:{x:840,y:1470}}},therian:{".":{regular:{x:880,y:1470},shiny:{x:920,y:1470}}}},reshiram:{".":{".":{regular:{x:960,y:1470},shiny:{x:1E3,y:1470}}}},zekrom:{".":{".":{regular:{x:1040, 113 | y:1470},shiny:{x:1080,y:1470}}}},landorus:{".":{".":{regular:{x:1120,y:1470},shiny:{x:1160,y:1470}}},incarnate:{".":{regular:{x:1120,y:1470},shiny:{x:1160,y:1470}}},therian:{".":{regular:{x:1200,y:1470},shiny:{x:1240,y:1470}}}},kyurem:{".":{".":{regular:{x:0,y:1500},shiny:{x:80,y:1500}},right:{regular:{x:40,y:1500},shiny:{x:120,y:1500}}},black:{".":{regular:{x:160,y:1500},shiny:{x:240,y:1500}},right:{regular:{x:200,y:1500},shiny:{x:280,y:1500}}},white:{".":{regular:{x:320,y:1500},shiny:{x:400,y:1500}}, 114 | right:{regular:{x:360,y:1500},shiny:{x:440,y:1500}}}},keldeo:{".":{".":{regular:{x:480,y:1500},shiny:{x:520,y:1500}}},ordinary:{".":{regular:{x:480,y:1500},shiny:{x:520,y:1500}}},resolute:{".":{regular:{x:560,y:1500},shiny:{x:640,y:1500}},right:{regular:{x:600,y:1500},shiny:{x:680,y:1500}}}},meloetta:{".":{".":{regular:{x:720,y:1500},shiny:{x:800,y:1500}},right:{regular:{x:760,y:1500},shiny:{x:840,y:1500}}},aria:{".":{regular:{x:720,y:1500},shiny:{x:800,y:1500}},right:{regular:{x:720,y:1500},shiny:{x:800, 115 | y:1500}}},pirouette:{".":{regular:{x:880,y:1500},shiny:{x:920,y:1500}}}},genesect:{".":{".":{regular:{x:960,y:1500},shiny:{x:1E3,y:1500}}},burn:{".":{regular:{x:960,y:1500},shiny:{x:1E3,y:1500}}},chill:{".":{regular:{x:960,y:1500},shiny:{x:1E3,y:1500}}},douse:{".":{regular:{x:960,y:1500},shiny:{x:1E3,y:1500}}},shock:{".":{regular:{x:960,y:1500},shiny:{x:1E3,y:1500}}}},chespin:{".":{".":{regular:{x:1040,y:1500},shiny:{x:1080,y:1500}}}},quilladin:{".":{".":{regular:{x:1120,y:1500},shiny:{x:1160,y:1500}}}}, 116 | chesnaught:{".":{".":{regular:{x:1200,y:1500},shiny:{x:1240,y:1500}}}},fennekin:{".":{".":{regular:{x:0,y:1530},shiny:{x:40,y:1530}}}},braixen:{".":{".":{regular:{x:80,y:1530},shiny:{x:120,y:1530}}}},delphox:{".":{".":{regular:{x:160,y:1530},shiny:{x:200,y:1530}}}},froakie:{".":{".":{regular:{x:240,y:1530},shiny:{x:280,y:1530}}}},frogadier:{".":{".":{regular:{x:320,y:1530},shiny:{x:360,y:1530}}}},greninja:{".":{".":{regular:{x:400,y:1530},shiny:{x:480,y:1530}},right:{regular:{x:440,y:1530},shiny:{x:520, 117 | y:1530}}}},bunnelby:{".":{".":{regular:{x:560,y:1530},shiny:{x:600,y:1530}}}},diggersby:{".":{".":{regular:{x:640,y:1530},shiny:{x:680,y:1530}}}},fletchling:{".":{".":{regular:{x:720,y:1530},shiny:{x:760,y:1530}}}},fletchinder:{".":{".":{regular:{x:800,y:1530},shiny:{x:840,y:1530}}}},talonflame:{".":{".":{regular:{x:880,y:1530},shiny:{x:920,y:1530}}}},scatterbug:{".":{".":{regular:{x:960,y:1530},shiny:{x:1E3,y:1530}}}},spewpa:{".":{".":{regular:{x:1040,y:1530},shiny:{x:1080,y:1530}}}},vivillon:{".":{".":{regular:{x:1120, 118 | y:1530},shiny:{x:1160,y:1530}}},archipelago:{".":{regular:{x:1200,y:1530},shiny:{x:1240,y:1530}}},continental:{".":{regular:{x:0,y:1560},shiny:{x:40,y:1560}}},elegant:{".":{regular:{x:80,y:1560},shiny:{x:120,y:1560}}},fancy:{".":{regular:{x:160,y:1560},shiny:{x:200,y:1560}}},garden:{".":{regular:{x:240,y:1560},shiny:{x:280,y:1560}}},"high-plains":{".":{regular:{x:320,y:1560},shiny:{x:360,y:1560}}},"icy-snow":{".":{regular:{x:400,y:1560},shiny:{x:440,y:1560}}},jungle:{".":{regular:{x:480,y:1560},shiny:{x:520, 119 | y:1560}}},marine:{".":{regular:{x:560,y:1560},shiny:{x:600,y:1560}}},meadow:{".":{regular:{x:1120,y:1530},shiny:{x:1160,y:1530}}},modern:{".":{regular:{x:640,y:1560},shiny:{x:680,y:1560}}},monsoon:{".":{regular:{x:720,y:1560},shiny:{x:760,y:1560}}},ocean:{".":{regular:{x:800,y:1560},shiny:{x:840,y:1560}}},"poke-ball":{".":{regular:{x:880,y:1560},shiny:{x:920,y:1560}}},polar:{".":{regular:{x:960,y:1560},shiny:{x:1E3,y:1560}}},river:{".":{regular:{x:1040,y:1560},shiny:{x:1080,y:1560}}},sandstorm:{".":{regular:{x:1120, 120 | y:1560},shiny:{x:1160,y:1560}}},savanna:{".":{regular:{x:1200,y:1560},shiny:{x:1240,y:1560}}},sun:{".":{regular:{x:0,y:1590},shiny:{x:40,y:1590}}},tundra:{".":{regular:{x:80,y:1590},shiny:{x:120,y:1590}}}},litleo:{".":{".":{regular:{x:160,y:1590},shiny:{x:200,y:1590}}}},pyroar:{".":{".":{regular:{x:240,y:1590},shiny:{x:320,y:1590}},female:{regular:{x:280,y:1590},shiny:{x:360,y:1590}}}},flabebe:{".":{".":{regular:{x:400,y:1590},shiny:{x:440,y:1590}}},blue:{".":{regular:{x:480,y:1590},shiny:{x:520, 121 | y:1590}}},orange:{".":{regular:{x:560,y:1590},shiny:{x:600,y:1590}}},red:{".":{regular:{x:400,y:1590},shiny:{x:440,y:1590}}},white:{".":{regular:{x:640,y:1590},shiny:{x:680,y:1590}}},yellow:{".":{regular:{x:720,y:1590},shiny:{x:760,y:1590}}}},floette:{".":{".":{regular:{x:800,y:1590},shiny:{x:840,y:1590}}},blue:{".":{regular:{x:880,y:1590},shiny:{x:920,y:1590}}},eternal:{".":{regular:{x:960,y:1590},shiny:{x:1E3,y:1590}}},orange:{".":{regular:{x:1040,y:1590},shiny:{x:1080,y:1590}}},red:{".":{regular:{x:800, 122 | y:1590},shiny:{x:840,y:1590}}},white:{".":{regular:{x:1120,y:1590},shiny:{x:1160,y:1590}}},yellow:{".":{regular:{x:1200,y:1590},shiny:{x:1240,y:1590}}}},florges:{".":{".":{regular:{x:0,y:1620},shiny:{x:40,y:1620}}},blue:{".":{regular:{x:80,y:1620},shiny:{x:120,y:1620}}},orange:{".":{regular:{x:160,y:1620},shiny:{x:200,y:1620}}},red:{".":{regular:{x:0,y:1620},shiny:{x:40,y:1620}}},white:{".":{regular:{x:240,y:1620},shiny:{x:280,y:1620}}},yellow:{".":{regular:{x:320,y:1620},shiny:{x:360,y:1620}}}}, 123 | skiddo:{".":{".":{regular:{x:400,y:1620},shiny:{x:440,y:1620}}}},gogoat:{".":{".":{regular:{x:480,y:1620},shiny:{x:520,y:1620}}}},pancham:{".":{".":{regular:{x:560,y:1620},shiny:{x:600,y:1620}}}},pangoro:{".":{".":{regular:{x:640,y:1620},shiny:{x:680,y:1620}}}},furfrou:{".":{".":{regular:{x:720,y:1620},shiny:{x:760,y:1620}}},dandy:{".":{regular:{x:800,y:1620},shiny:{x:840,y:1620}}},debutante:{".":{regular:{x:880,y:1620},shiny:{x:960,y:1620}},right:{regular:{x:920,y:1620},shiny:{x:1E3,y:1620}}},diamond:{".":{regular:{x:1040, 124 | y:1620},shiny:{x:1080,y:1620}}},heart:{".":{regular:{x:1120,y:1620},shiny:{x:1160,y:1620}}},kabuki:{".":{regular:{x:1200,y:1620},shiny:{x:1240,y:1620}}},"la-reine":{".":{regular:{x:0,y:1650},shiny:{x:40,y:1650}}},matron:{".":{regular:{x:80,y:1650},shiny:{x:120,y:1650}}},pharaoh:{".":{regular:{x:160,y:1650},shiny:{x:200,y:1650}}},star:{".":{regular:{x:240,y:1650},shiny:{x:280,y:1650}}}},espurr:{".":{".":{regular:{x:320,y:1650},shiny:{x:360,y:1650}}}},meowstic:{".":{".":{regular:{x:400,y:1650},shiny:{x:480, 125 | y:1650}},female:{regular:{x:440,y:1650},shiny:{x:520,y:1650}}}},honedge:{".":{".":{regular:{x:560,y:1650},shiny:{x:600,y:1650}}}},doublade:{".":{".":{regular:{x:640,y:1650},shiny:{x:680,y:1650}}}},aegislash:{".":{".":{regular:{x:720,y:1650},shiny:{x:760,y:1650}}},blade:{".":{regular:{x:800,y:1650},shiny:{x:840,y:1650}}},shield:{".":{regular:{x:720,y:1650},shiny:{x:760,y:1650}}}},spritzee:{".":{".":{regular:{x:880,y:1650},shiny:{x:920,y:1650}}}},aromatisse:{".":{".":{regular:{x:960,y:1650},shiny:{x:1E3, 126 | y:1650}}}},swirlix:{".":{".":{regular:{x:1040,y:1650},shiny:{x:1080,y:1650}}}},slurpuff:{".":{".":{regular:{x:1120,y:1650},shiny:{x:1160,y:1650}}}},inkay:{".":{".":{regular:{x:1200,y:1650},shiny:{x:1240,y:1650}}}},malamar:{".":{".":{regular:{x:0,y:1680},shiny:{x:40,y:1680}}}},binacle:{".":{".":{regular:{x:80,y:1680},shiny:{x:120,y:1680}}}},barbaracle:{".":{".":{regular:{x:160,y:1680},shiny:{x:240,y:1680}},right:{regular:{x:200,y:1680},shiny:{x:280,y:1680}}}},skrelp:{".":{".":{regular:{x:320,y:1680}, 127 | shiny:{x:360,y:1680}}}},dragalge:{".":{".":{regular:{x:400,y:1680},shiny:{x:440,y:1680}}}},clauncher:{".":{".":{regular:{x:480,y:1680},shiny:{x:560,y:1680}},right:{regular:{x:520,y:1680},shiny:{x:600,y:1680}}}},clawitzer:{".":{".":{regular:{x:640,y:1680},shiny:{x:720,y:1680}},right:{regular:{x:680,y:1680},shiny:{x:760,y:1680}}}},helioptile:{".":{".":{regular:{x:800,y:1680},shiny:{x:840,y:1680}}}},heliolisk:{".":{".":{regular:{x:880,y:1680},shiny:{x:920,y:1680}}}},tyrunt:{".":{".":{regular:{x:960, 128 | y:1680},shiny:{x:1E3,y:1680}}}},tyrantrum:{".":{".":{regular:{x:1040,y:1680},shiny:{x:1080,y:1680}}}},amaura:{".":{".":{regular:{x:1120,y:1680},shiny:{x:1160,y:1680}}}},aurorus:{".":{".":{regular:{x:1200,y:1680},shiny:{x:1240,y:1680}}}},sylveon:{".":{".":{regular:{x:0,y:1710},shiny:{x:80,y:1710}},right:{regular:{x:40,y:1710},shiny:{x:120,y:1710}}}},hawlucha:{".":{".":{regular:{x:160,y:1710},shiny:{x:200,y:1710}}}},dedenne:{".":{".":{regular:{x:240,y:1710},shiny:{x:280,y:1710}}}},carbink:{".":{".":{regular:{x:320, 129 | y:1710},shiny:{x:360,y:1710}}}},goomy:{".":{".":{regular:{x:400,y:1710},shiny:{x:440,y:1710}}}},sliggoo:{".":{".":{regular:{x:480,y:1710},shiny:{x:520,y:1710}}}},goodra:{".":{".":{regular:{x:560,y:1710},shiny:{x:600,y:1710}}}},klefki:{".":{".":{regular:{x:640,y:1710},shiny:{x:720,y:1710}},right:{regular:{x:680,y:1710},shiny:{x:760,y:1710}}}},phantump:{".":{".":{regular:{x:800,y:1710},shiny:{x:840,y:1710}}}},trevenant:{".":{".":{regular:{x:880,y:1710},shiny:{x:920,y:1710}}}},pumpkaboo:{".":{".":{regular:{x:960, 130 | y:1710},shiny:{x:1E3,y:1710}}},average:{".":{regular:{x:960,y:1710},shiny:{x:1E3,y:1710}}},large:{".":{regular:{x:960,y:1710},shiny:{x:1E3,y:1710}}},small:{".":{regular:{x:960,y:1710},shiny:{x:1E3,y:1710}}},"super":{".":{regular:{x:960,y:1710},shiny:{x:1E3,y:1710}}}},gourgeist:{".":{".":{regular:{x:1040,y:1710},shiny:{x:1080,y:1710}}},average:{".":{regular:{x:1040,y:1710},shiny:{x:1080,y:1710}}},large:{".":{regular:{x:1040,y:1710},shiny:{x:1080,y:1710}}},small:{".":{regular:{x:1040,y:1710},shiny:{x:1080, 131 | y:1710}}},"super":{".":{regular:{x:1040,y:1710},shiny:{x:1080,y:1710}}}},bergmite:{".":{".":{regular:{x:1120,y:1710},shiny:{x:1160,y:1710}}}},avalugg:{".":{".":{regular:{x:1200,y:1710},shiny:{x:1240,y:1710}}}},noibat:{".":{".":{regular:{x:0,y:1740},shiny:{x:40,y:1740}}}},noivern:{".":{".":{regular:{x:80,y:1740},shiny:{x:120,y:1740}}}},xerneas:{".":{".":{regular:{x:160,y:1740},shiny:{x:200,y:1740}}},active:{".":{regular:{x:160,y:1740},shiny:{x:200,y:1740}}},neutral:{".":{regular:{x:240,y:1740},shiny:{x:280, 132 | y:1740}}}},yveltal:{".":{".":{regular:{x:320,y:1740},shiny:{x:360,y:1740}}}},zygarde:{".":{".":{regular:{x:400,y:1740},shiny:{x:480,y:1740}},right:{regular:{x:440,y:1740},shiny:{x:520,y:1740}}}},diancie:{".":{".":{regular:{x:560,y:1740},shiny:{x:600,y:1740}}}},hoopa:{".":{".":{regular:{x:640,y:1740},shiny:{x:680,y:1740}}}},volcanion:{".":{".":{regular:{x:720,y:1740},shiny:{x:760,y:1740}}}}},etc:{egg:{x:0,y:1770,w:40,h:30},"unknown-pkmn":{x:40,y:1770,w:40,h:30},"unknown-item":{x:450,y:1832,w:30,h:30}, 133 | "ball-mega":{x:870,y:2252,w:16,h:16},"ball-fainted":{x:886,y:2252,w:14,h:14},"ball-normal":{x:900,y:2252,w:14,h:14},"ball-null":{x:914,y:2252,w:14,h:14},"ball-sick":{x:928,y:2252,w:14,h:14}},"body-style":{"bipedal-tailed":{x:0,y:1800},"bipedal-tailless":{x:32,y:1800},fins:{x:64,y:1800},"head-arms":{x:96,y:1800},"head-base":{x:128,y:1800},"head-legs":{x:160,y:1800},head:{x:192,y:1800},insectoid:{x:224,y:1800},multiple:{x:256,y:1800},quadruped:{x:288,y:1800},serpentine:{x:320,y:1800},tentacles:{x:352, 134 | y:1800},"wings-multiple":{x:384,y:1800},"wings-single":{x:416,y:1800}},apricorn:{black:{x:448,y:1800},blue:{x:478,y:1800},green:{x:508,y:1800},pink:{x:538,y:1800},red:{x:568,y:1800},white:{x:598,y:1800},yellow:{x:628,y:1800}},"battle-item":{"dire-hit":{x:658,y:1800},"guard-spec":{x:688,y:1800},"x-accuracy":{x:718,y:1800},"x-attack":{x:748,y:1800},"x-defense":{x:778,y:1800},"x-sp-atk":{x:808,y:1800},"x-sp-def":{x:838,y:1800},"x-speed":{x:868,y:1800}},berry:{aguav:{x:898,y:1800},apicot:{x:928,y:1800}, 135 | aspear:{x:958,y:1800},babiri:{x:988,y:1800},belue:{x:1018,y:1800},bluk:{x:1048,y:1800},charti:{x:1078,y:1800},cheri:{x:1108,y:1800},chesto:{x:1138,y:1800},chilan:{x:1168,y:1800},chople:{x:1198,y:1800},coba:{x:1228,y:1800},colbur:{x:80,y:1770},cornn:{x:110,y:1770},custap:{x:140,y:1770},durin:{x:170,y:1770},enigma:{x:200,y:1770},figy:{x:230,y:1770},ganlon:{x:260,y:1770},grepa:{x:290,y:1770},haban:{x:320,y:1770},hondew:{x:350,y:1770},iapapa:{x:380,y:1770},jaboca:{x:410,y:1770},kasib:{x:440,y:1770},kebia:{x:470, 136 | y:1770},kee:{x:500,y:1770},kelpsy:{x:530,y:1770},lansat:{x:560,y:1770},leppa:{x:590,y:1770},liechi:{x:620,y:1770},lum:{x:650,y:1770},mago:{x:680,y:1770},magost:{x:710,y:1770},maranga:{x:740,y:1770},micle:{x:770,y:1770},nanab:{x:800,y:1770},nomel:{x:830,y:1770},occa:{x:860,y:1770},oran:{x:890,y:1770},pamtre:{x:920,y:1770},passho:{x:950,y:1770},payapa:{x:980,y:1770},pecha:{x:1010,y:1770},persim:{x:1040,y:1770},petaya:{x:1070,y:1770},pinap:{x:1100,y:1770},pomeg:{x:1130,y:1770},qualot:{x:1160,y:1770}, 137 | rabuta:{x:1190,y:1770},rawst:{x:1220,y:1770},razz:{x:1250,y:1770},rindo:{x:0,y:1832},roseli:{x:30,y:1832},rowap:{x:60,y:1832},salac:{x:90,y:1832},shuca:{x:120,y:1832},sitrus:{x:150,y:1832},spelon:{x:180,y:1832},starf:{x:210,y:1832},tamato:{x:240,y:1832},tanga:{x:270,y:1832},wacan:{x:300,y:1832},watmel:{x:330,y:1832},wepear:{x:360,y:1832},wiki:{x:390,y:1832},yache:{x:420,y:1832}},"ev-item":{"macho-brace":{x:480,y:1832},"power-anklet":{x:510,y:1832},"power-band":{x:540,y:1832},"power-belt":{x:570,y:1832}, 138 | "power-bracer":{x:600,y:1832},"power-lens":{x:630,y:1832},"power-weight":{x:660,y:1832}},"evo-item":{"dawn-stone":{x:690,y:1832},"deep-sea-scale":{x:720,y:1832},"deep-sea-tooth":{x:750,y:1832},"dragon-scale":{x:780,y:1832},"dubious-disc":{x:810,y:1832},"dusk-stone":{x:840,y:1832},electirizer:{x:870,y:1832},everstone:{x:900,y:1832},"fire-stone":{x:930,y:1832},"kings-rock":{x:960,y:1832},"leaf-stone":{x:990,y:1832},magmarizer:{x:1020,y:1832},"metal-coat":{x:1050,y:1832},"moon-stone":{x:1080,y:1832}, 139 | "oval-stone":{x:1110,y:1832},"prism-scale":{x:1140,y:1832},protector:{x:1170,y:1832},"razor-claw":{x:1200,y:1832},"razor-fang":{x:1230,y:1832},"reaper-cloth":{x:0,y:1862},sachet:{x:30,y:1862},"shiny-stone":{x:60,y:1862},"sun-stone":{x:90,y:1862},"thunder-stone":{x:120,y:1862},"up-grade":{x:150,y:1862},"water-stone":{x:180,y:1862},"whipped-dream":{x:210,y:1862}},flute:{black:{x:240,y:1862},blue:{x:270,y:1862},red:{x:300,y:1862},white:{x:330,y:1862},yellow:{x:360,y:1862}},fossil:{armor:{x:390,y:1862}, 140 | claw:{x:420,y:1862},cover:{x:450,y:1862},dome:{x:480,y:1862},helix:{x:510,y:1862},jaw:{x:540,y:1862},plume:{x:570,y:1862},root:{x:600,y:1862},sail:{x:630,y:1862},skull:{x:660,y:1862}},gem:{bug:{x:690,y:1862},dark:{x:720,y:1862},dragon:{x:750,y:1862},electric:{x:780,y:1862},fairy:{x:810,y:1862},fighting:{x:840,y:1862},fire:{x:870,y:1862},flying:{x:900,y:1862},ghost:{x:930,y:1862},grass:{x:960,y:1862},ground:{x:990,y:1862},ice:{x:1020,y:1862},normal:{x:1050,y:1862},poison:{x:1080,y:1862},psychic:{x:1110, 141 | y:1862},rock:{x:1140,y:1862},steel:{x:1170,y:1862},water:{x:1200,y:1862}},hm:{fighting:{x:1230,y:1862},flying:{x:0,y:1892},normal:{x:30,y:1892},water:{x:60,y:1892}},"hold-item":{"absorb-bulb":{x:90,y:1892},"adamant-orb":{x:120,y:1892},"air-balloon":{x:150,y:1892},"amulet-coin":{x:180,y:1892},"assault-vest":{x:210,y:1892},"big-root":{x:240,y:1892},"binding-band":{x:270,y:1892},"black-belt":{x:300,y:1892},"black-glasses":{x:330,y:1892},"black-sludge":{x:360,y:1892},"bright-powder":{x:390,y:1892},"burn-drive":{x:420, 142 | y:1892},"cell-battery":{x:450,y:1892},charcoal:{x:480,y:1892},"chill-drive":{x:510,y:1892},"choice-band":{x:540,y:1892},"choice-scarf":{x:570,y:1892},"choice-specs":{x:600,y:1892},"cleanse-tag":{x:630,y:1892},"damp-rock":{x:660,y:1892},"destiny-knot":{x:690,y:1892},"douse-drive":{x:720,y:1892},"dragon-fang":{x:750,y:1892},"eject-button":{x:780,y:1892},eviolite:{x:810,y:1892},"expert-belt":{x:840,y:1892},"flame-orb":{x:870,y:1892},"float-stone":{x:900,y:1892},"focus-band":{x:930,y:1892},"focus-sash":{x:960, 143 | y:1892},"grip-claw":{x:990,y:1892},"griseous-orb":{x:1020,y:1892},"hard-stone":{x:1050,y:1892},"heat-rock":{x:1080,y:1892},"icy-rock":{x:1110,y:1892},"kings-rock":{x:1140,y:1892},"lagging-tail":{x:1170,y:1892},leftovers:{x:1200,y:1892},"life-orb":{x:1230,y:1892},"light-ball":{x:0,y:1922},"light-clay":{x:30,y:1922},"lucky-egg":{x:60,y:1922},"lucky-punch":{x:90,y:1922},"luminous-moss":{x:120,y:1922},"lustrous-orb":{x:150,y:1922},magnet:{x:180,y:1922},"mental-herb":{x:210,y:1922},"metal-coat":{x:240, 144 | y:1922},"metal-powder":{x:270,y:1922},metronome:{x:300,y:1922},"miracle-seed":{x:330,y:1922},"muscle-band":{x:360,y:1922},"mystic-water":{x:390,y:1922},"never-melt-ice":{x:420,y:1922},"poison-barb":{x:450,y:1922},"power-herb":{x:480,y:1922},"quick-claw":{x:510,y:1922},"quick-powder":{x:540,y:1922},"red-card":{x:570,y:1922},"ring-target":{x:600,y:1922},"rocky-helmet":{x:630,y:1922},"safety-goggles":{x:660,y:1922},"scope-lens":{x:690,y:1922},"sharp-beak":{x:720,y:1922},"shed-shell":{x:750,y:1922},"shell-bell":{x:780, 145 | y:1922},"shock-drive":{x:810,y:1922},"silk-scarf":{x:840,y:1922},"silver-powder":{x:870,y:1922},"smoke-ball":{x:900,y:1922},"smooth-rock":{x:930,y:1922},snowball:{x:960,y:1922},"soft-sand":{x:990,y:1922},"soul-dew":{x:1020,y:1922},"spell-tag":{x:1050,y:1922},stick:{x:1080,y:1922},"sticky-barb":{x:1110,y:1922},"thick-club":{x:1140,y:1922},"toxic-orb":{x:1170,y:1922},"twisted-spoon":{x:1200,y:1922},"weakness-policy":{x:1230,y:1922},"white-herb":{x:0,y:1952},"wide-lens":{x:30,y:1952},"wise-glasses":{x:60, 146 | y:1952},"zoom-lens":{x:90,y:1952}},incense:{full:{x:120,y:1952},lax:{x:150,y:1952},luck:{x:180,y:1952},odd:{x:210,y:1952},pure:{x:240,y:1952},rock:{x:270,y:1952},rose:{x:300,y:1952},sea:{x:330,y:1952},wave:{x:360,y:1952}},"other-item":{"discount-coupon":{x:390,y:1952},"escape-rope":{x:420,y:1952},"fluffy-tail":{x:450,y:1952},"heart-scale":{x:480,y:1952},honey:{x:510,y:1952},"max-repel":{x:540,y:1952},"odd-keystone":{x:570,y:1952},"pass-orb":{x:600,y:1952},"poke-doll":{x:630,y:1952},"poke-toy":{x:660, 147 | y:1952},repel:{x:690,y:1952},"soothe-bell":{x:720,y:1952},"strange-souvenir":{x:750,y:1952},"super-repel":{x:780,y:1952}},"key-item":{"acro-bike":{x:810,y:1952},"adventure-rules":{x:840,y:1952},"apricorn-box":{x:870,y:1952},auroraticket:{x:900,y:1952},"azure-flute":{x:930,y:1952},"basement-key":{x:960,y:1952},"berry-pots":{x:990,y:1952},"berry-pouch":{x:1020,y:1952},"bicycle-turquoise":{x:1050,y:1952},"bicycle-yellow":{x:1080,y:1952},bicycle:{x:1110,y:1952},"bike-voucher":{x:1140,y:1952},"blue-card":{x:1170, 148 | y:1952},"blue-orb-gen3":{x:1200,y:1952},"blue-orb":{x:1230,y:1952},"card-key-gen3":{x:0,y:1982},"card-key":{x:30,y:1982},"clear-bell":{x:60,y:1982},"coin-case":{x:90,y:1982},"colress-machine":{x:120,y:1982},"common-stone":{x:150,y:1982},"contest-pass":{x:180,y:1982},"coupon-1":{x:210,y:1982},"coupon-2":{x:240,y:1982},"coupon-3":{x:270,y:1982},"dark-stone":{x:300,y:1982},"data-card":{x:330,y:1982},"devon-goods":{x:360,y:1982},"devon-scope":{x:390,y:1982},"dna-splicers":{x:420,y:1982},"dowsing-machine-gen5":{x:450, 149 | y:1982},"dowsing-machine":{x:480,y:1982},"dragon-skull":{x:510,y:1982},"dropped-item-red":{x:540,y:1982},"dropped-item-yellow":{x:570,y:1982},"dropped-item":{x:600,y:1982},"elevator-key":{x:630,y:1982},"enigma-stone":{x:660,y:1982},"eon-ticket":{x:690,y:1982},"exp-share":{x:720,y:1982},"explorer-kit":{x:750,y:1982},"fame-checker":{x:780,y:1982},"fashion-case":{x:810,y:1982},"galactic-key":{x:840,y:1982},"gb-sounds":{x:870,y:1982},"go-goggles":{x:900,y:1982},"god-stone":{x:930,y:1982},"gold-teeth":{x:960, 150 | y:1982},"good-rod":{x:990,y:1982},gracidea:{x:1020,y:1982},"gram-1":{x:1050,y:1982},"gram-2":{x:1080,y:1982},"gram-3":{x:1110,y:1982},"grubby-hanky":{x:1140,y:1982},"holo-caster-green":{x:1170,y:1982},"holo-caster-red":{x:1200,y:1982},"holo-caster":{x:1230,y:1982},"honor-of-kalos":{x:0,y:2012},"intriguing-stone":{x:30,y:2012},itemfinder:{x:60,y:2012},"jade-orb":{x:90,y:2012},journal:{x:120,y:2012},"lens-case":{x:150,y:2012},letter:{x:180,y:2012},"liberty-pass":{x:210,y:2012},"lift-key":{x:240,y:2012}, 151 | "light-stone":{x:270,y:2012},"lock-capsule-gen4":{x:300,y:2012},"lock-capsule":{x:330,y:2012},"looker-ticket":{x:360,y:2012},"loot-sack":{x:390,y:2012},"lost-item-mimejr":{x:420,y:2012},"lost-item":{x:450,y:2012},"lunar-wing":{x:480,y:2012},"mach-bike":{x:510,y:2012},"machine-part":{x:540,y:2012},"magma-emblem":{x:570,y:2012},"magma-stone":{x:600,y:2012},"medal-box":{x:630,y:2012},"mega-ring":{x:660,y:2012},"member-card":{x:690,y:2012},meteorite:{x:720,y:2012},"mystery-egg":{x:750,y:2012},mysticticket:{x:780, 152 | y:2012},"oaks-letter":{x:810,y:2012},"oaks-parcel":{x:840,y:2012},"old-amber":{x:870,y:2012},"old-charm":{x:900,y:2012},"old-rod":{x:930,y:2012},"old-sea-map":{x:960,y:2012},"oval-charm":{x:990,y:2012},"pal-pad":{x:1020,y:2012},parcel:{x:1050,y:2012},pass:{x:1080,y:2012},permit:{x:1110,y:2012},"photo-album":{x:1140,y:2012},"plasma-card":{x:1170,y:2012},"poffin-case":{x:1200,y:2012},"point-card":{x:1230,y:2012},"poke-flute-gen3":{x:0,y:2042},"poke-flute":{x:30,y:2042},"poke-radar":{x:60,y:2042},"pokeblock-case":{x:90, 153 | y:2042},"powder-jar":{x:120,y:2042},"power-plant-pass":{x:150,y:2042},"profs-letter":{x:180,y:2042},"prop-case":{x:210,y:2042},"rainbow-pass":{x:240,y:2042},"rainbow-wing":{x:270,y:2042},"red-chain":{x:300,y:2042},"red-orb-gen3":{x:330,y:2042},"red-orb":{x:360,y:2042},"red-scale":{x:390,y:2042},"reveal-glass":{x:420,y:2042},"rm-1-key":{x:450,y:2042},"rm-2-key":{x:480,y:2042},"rm-4-key":{x:510,y:2042},"rm-6-key":{x:540,y:2042},"roller-skates":{x:570,y:2042},ruby:{x:600,y:2042},"rule-book":{x:630,y:2042}, 154 | sapphire:{x:660,y:2042},scanner:{x:690,y:2042},"seal-bag":{x:720,y:2042},"seal-case":{x:750,y:2042},"secret-key-gen3":{x:780,y:2042},"secret-key":{x:810,y:2042},"secret-potion":{x:840,y:2042},"shiny-charm":{x:870,y:2042},"silph-scope":{x:900,y:2042},"silver-wing":{x:930,y:2042},"soot-sack":{x:960,y:2042},sprayduck:{x:990,y:2042},sprinklotad:{x:1020,y:2042},"squirt-bottle":{x:1050,y:2042},"ss-ticket":{x:1080,y:2042},"storage-key-gen3":{x:1110,y:2042},"storage-key":{x:1140,y:2042},"suite-key":{x:1170, 155 | y:2042},"super-rod":{x:1200,y:2042},tea:{x:1230,y:2042},"teachy-tv":{x:0,y:2072},"tidal-bell":{x:30,y:2072},"tm-case":{x:60,y:2072},"tmv-pass":{x:90,y:2072},"town-map-gen3":{x:120,y:2072},"town-map":{x:150,y:2072},"travel-trunk-gold":{x:180,y:2072},"travel-trunk-silver":{x:210,y:2072},"tri-pass":{x:240,y:2072},"unown-report":{x:270,y:2072},"vs-recorder":{x:300,y:2072},"vs-seeker":{x:330,y:2072},"wailmer-pail":{x:360,y:2072},"works-key":{x:390,y:2072},"xtransceiver-blue":{x:420,y:2072},"xtransceiver-red":{x:450, 156 | y:2072},"xtransceiver-yellow":{x:480,y:2072},xtransceiver:{x:510,y:2072}},mail:{air:{x:540,y:2072},bead:{x:570,y:2072},bloom:{x:600,y:2072},brick:{x:630,y:2072},"bridge-d":{x:660,y:2072},"bridge-m":{x:690,y:2072},"bridge-s":{x:720,y:2072},"bridge-t":{x:750,y:2072},"bridge-v":{x:780,y:2072},bubble:{x:810,y:2072},dream:{x:840,y:2072},fab:{x:870,y:2072},favored:{x:900,y:2072},flame:{x:930,y:2072},glitter:{x:960,y:2072},grass:{x:990,y:2072},greet:{x:1020,y:2072},harbor:{x:1050,y:2072},heart:{x:1080,y:2072}, 157 | inquiry:{x:1110,y:2072},like:{x:1140,y:2072},mech:{x:1170,y:2072},mosaic:{x:1200,y:2072},orange:{x:1230,y:2072},reply:{x:0,y:2102},retro:{x:30,y:2102},rsvp:{x:60,y:2102},shadow:{x:90,y:2102},snow:{x:120,y:2102},space:{x:150,y:2102},steel:{x:180,y:2102},thanks:{x:210,y:2102},tropic:{x:240,y:2102},tunnel:{x:270,y:2102},wave:{x:300,y:2102},wood:{x:330,y:2102}},medicine:{"ability-capsule":{x:360,y:2102},antidote:{x:390,y:2102},awakening:{x:420,y:2102},"berry-juice":{x:450,y:2102},"burn-heal":{x:480,y:2102}, 158 | calcium:{x:510,y:2102},carbos:{x:540,y:2102},casteliacone:{x:570,y:2102},"clever-wing":{x:600,y:2102},elixir:{x:630,y:2102},"energy-powder":{x:660,y:2102},"energy-root":{x:690,y:2102},ether:{x:720,y:2102},"fresh-water":{x:750,y:2102},"full-heal":{x:780,y:2102},"full-restore":{x:810,y:2102},"genius-wing":{x:840,y:2102},"heal-powder":{x:870,y:2102},"health-wing":{x:900,y:2102},"hp-up":{x:930,y:2102},"hyper-potion":{x:960,y:2102},"ice-heal":{x:990,y:2102},iron:{x:1020,y:2102},"lava-cookie":{x:1050,y:2102}, 159 | lemonade:{x:1080,y:2102},"lumiose-galette":{x:1110,y:2102},"max-elixir":{x:1140,y:2102},"max-ether":{x:1170,y:2102},"max-potion":{x:1200,y:2102},"max-revive":{x:1230,y:2102},"moomoo-milk":{x:0,y:2132},"muscle-wing":{x:30,y:2132},"old-gateau":{x:60,y:2132},"paralyze-heal":{x:90,y:2132},potion:{x:120,y:2132},"pp-max":{x:150,y:2132},"pp-up":{x:180,y:2132},protein:{x:210,y:2132},"rage-candy-bar":{x:240,y:2132},"rare-candy":{x:270,y:2132},"resist-wing":{x:300,y:2132},"revival-herb":{x:330,y:2132},revive:{x:360, 160 | y:2132},"sacred-ash":{x:390,y:2132},"shalour-sable":{x:420,y:2132},"soda-pop":{x:450,y:2132},"super-potion":{x:480,y:2132},"sweet-heart":{x:510,y:2132},"swift-wing":{x:540,y:2132},zinc:{x:570,y:2132}},"mega-stone":{abomasite:{x:600,y:2132},absolite:{x:630,y:2132},aerodactylite:{x:660,y:2132},aggronite:{x:690,y:2132},alakazite:{x:720,y:2132},ampharosite:{x:750,y:2132},banettite:{x:780,y:2132},blastoisinite:{x:810,y:2132},blazikenite:{x:840,y:2132},"charizardite-x":{x:870,y:2132},"charizardite-y":{x:900, 161 | y:2132},garchompite:{x:930,y:2132},gardevoirite:{x:960,y:2132},gengarite:{x:990,y:2132},gyaradosite:{x:1020,y:2132},heracronite:{x:1050,y:2132},houndoominite:{x:1080,y:2132},kangaskhanite:{x:1110,y:2132},latiasite:{x:1140,y:2132},latiosite:{x:1170,y:2132},lucarionite:{x:1200,y:2132},manectite:{x:1230,y:2132},mawilite:{x:0,y:2162},medichamite:{x:30,y:2162},"mewtwonite-x":{x:60,y:2162},"mewtwonite-y":{x:90,y:2162},pinsirite:{x:120,y:2162},scizorite:{x:150,y:2162},tyranitarite:{x:180,y:2162},venusaurite:{x:210, 162 | y:2162}},mulch:{amaze:{x:240,y:2162},boost:{x:270,y:2162},damp:{x:300,y:2162},gooey:{x:330,y:2162},growth:{x:360,y:2162},rich:{x:390,y:2162},stable:{x:420,y:2162},surprise:{x:450,y:2162}},plate:{draco:{x:480,y:2162},dread:{x:510,y:2162},earth:{x:540,y:2162},fist:{x:570,y:2162},flame:{x:600,y:2162},icicle:{x:630,y:2162},insect:{x:660,y:2162},iron:{x:690,y:2162},meadow:{x:720,y:2162},mind:{x:750,y:2162},pixie:{x:780,y:2162},sky:{x:810,y:2162},splash:{x:840,y:2162},spooky:{x:870,y:2162},stone:{x:900, 163 | y:2162},toxic:{x:930,y:2162},zap:{x:960,y:2162}},pokeball:{cherish:{x:990,y:2162},dive:{x:1020,y:2162},dream:{x:1050,y:2162},dusk:{x:1080,y:2162},fast:{x:1110,y:2162},friend:{x:1140,y:2162},great:{x:1170,y:2162},heal:{x:1200,y:2162},heavy:{x:1230,y:2162},level:{x:0,y:2192},love:{x:30,y:2192},lure:{x:60,y:2192},luxury:{x:90,y:2192},master:{x:120,y:2192},moon:{x:150,y:2192},nest:{x:180,y:2192},net:{x:210,y:2192},park:{x:240,y:2192},poke:{x:270,y:2192},premier:{x:300,y:2192},quick:{x:330,y:2192},repeat:{x:360, 164 | y:2192},safari:{x:390,y:2192},sport:{x:420,y:2192},timer:{x:450,y:2192},ultra:{x:480,y:2192}},scarf:{blue:{x:510,y:2192},green:{x:540,y:2192},pink:{x:570,y:2192},red:{x:600,y:2192},yellow:{x:630,y:2192}},shard:{blue:{x:660,y:2192},green:{x:690,y:2192},red:{x:720,y:2192},yellow:{x:750,y:2192}},tm:{bug:{x:780,y:2192},dark:{x:810,y:2192},dragon:{x:840,y:2192},electric:{x:870,y:2192},fairy:{x:900,y:2192},fighting:{x:930,y:2192},fire:{x:960,y:2192},flying:{x:990,y:2192},ghost:{x:1020,y:2192},grass:{x:1050, 165 | y:2192},ground:{x:1080,y:2192},ice:{x:1110,y:2192},normal:{x:1140,y:2192},poison:{x:1170,y:2192},psychic:{x:1200,y:2192},rock:{x:1230,y:2192},steel:{x:0,y:2222},water:{x:30,y:2222}},"valuable-item":{"balm-mushroom":{x:60,y:2222},"big-mushroom":{x:90,y:2222},"big-nugget":{x:120,y:2222},"big-pearl":{x:150,y:2222},"comet-shard":{x:180,y:2222},nugget:{x:210,y:2222},"pearl-string":{x:240,y:2222},pearl:{x:270,y:2222},"pretty-wing":{x:300,y:2222},"rare-bone":{x:330,y:2222},"relic-band":{x:360,y:2222},"relic-copper":{x:390, 166 | y:2222},"relic-crown":{x:420,y:2222},"relic-gold":{x:450,y:2222},"relic-silver":{x:480,y:2222},"relic-statue":{x:510,y:2222},"relic-vase":{x:540,y:2222},"shoal-salt":{x:570,y:2222},"shoal-shell":{x:600,y:2222},"slowpoke-tail":{x:630,y:2222},"star-piece":{x:660,y:2222},stardust:{x:690,y:2222},"tiny-mushroom":{x:720,y:2222}},"wonder-launcher":{"ability-urge":{x:750,y:2222},antidote:{x:780,y:2222},awakening:{x:810,y:2222},"burn-heal":{x:840,y:2222},"dire-hit-1":{x:870,y:2222},"dire-hit-2":{x:900,y:2222}, 167 | "dire-hit-3":{x:930,y:2222},ether:{x:960,y:2222},"full-heal":{x:990,y:2222},"full-restore":{x:1020,y:2222},"guard-spec":{x:1050,y:2222},"hyper-potion":{x:1080,y:2222},"ice-heal":{x:1110,y:2222},"item-drop":{x:1140,y:2222},"item-urge":{x:1170,y:2222},"max-potion":{x:1200,y:2222},"max-revive":{x:1230,y:2222},"paralyze-heal":{x:0,y:2252},potion:{x:30,y:2252},"reset-urge":{x:60,y:2252},revive:{x:90,y:2252},"super-potion":{x:120,y:2252},"x-accuracy-1":{x:150,y:2252},"x-accuracy-2":{x:180,y:2252},"x-accuracy-3":{x:210, 168 | y:2252},"x-accuracy-6":{x:240,y:2252},"x-attack-1":{x:270,y:2252},"x-attack-2":{x:300,y:2252},"x-attack-3":{x:330,y:2252},"x-attack-6":{x:360,y:2252},"x-defense-1":{x:390,y:2252},"x-defense-2":{x:420,y:2252},"x-defense-3":{x:450,y:2252},"x-defense-6":{x:480,y:2252},"x-sp-atk-1":{x:510,y:2252},"x-sp-atk-2":{x:540,y:2252},"x-sp-atk-3":{x:570,y:2252},"x-sp-atk-6":{x:600,y:2252},"x-sp-def-1":{x:630,y:2252},"x-sp-def-2":{x:660,y:2252},"x-sp-def-3":{x:690,y:2252},"x-sp-def-6":{x:720,y:2252},"x-speed-1":{x:750, 169 | y:2252},"x-speed-2":{x:780,y:2252},"x-speed-3":{x:810,y:2252},"x-speed-6":{x:840,y:2252}},status:{"holding-item":{x:942,y:2252},pentagon:{x:952,y:2252},"pokerus-cured":{x:962,y:2252},shiny:{x:972,y:2252}}};a.process_dom=function(){a.K(a.H)};a.decorate=function(c){!1==a.S(c)&&(c=[c]);var b,d,e,f;b=0;for(d=c.length;b