root/branches/0.3/src/plugins/albumart.py

Revision 959, 34.1 kB (checked in by nicfit, 2 months ago)

Amazon album plugin work

Line 
1 # -*- coding: utf-8 -*-
2 ################################################################################
3 #  Copyright (C) 2007  Travis Shirk <travis@pobox.com>
4 #
5 #  This program is free software; you can redistribute it and/or modify
6 #  it under the terms of the GNU General Public License as published by
7 #  the Free Software Foundation; either version 2 of the License, or
8 #  (at your option) any later version.
9 #
10 #  This program is distributed in the hope that it will be useful,
11 #  but WITHOUT ANY WARRANTY; without even the implied warranty of
12 #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 #  GNU General Public License for more details.
14 #
15 #  You should have received a copy of the GNU General Public License
16 #  along with this program; if not, write to the Free Software
17 #  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
18 #
19 ################################################################################
20 import urllib, time
21
22 import ecs
23 ecs.setLicenseKey('0XMTPCQ85ZMFF2PAT402')
24
25 import mesk
26 import mesk.plugin
27 from mesk.i18n import _
28 from mesk.plugin.plugin import PluginInfo, Plugin
29 from mesk.plugin.interfaces import MetaDataSearch
30
31 def soundex(name, len=6):
32     # digits holds the soundex values for the alphabet
33     digits = '01230120022455012623010202'
34     sndx = ''
35     fc = ''
36
37     # translate alpha chars in name to soundex digits
38     for c in name.upper():
39         if c.isalpha():
40             if not fc:
41                 fc = c   # remember first letter
42             try:
43                 d = digits[ord(c)-ord('A')]
44             except IndexError, ex:
45                 # Most likely c is not an ascii character
46                 mesk.log.warning("Invalid character '%s' (%x) in soundex "
47                                  "algorithm, skipping" % (c, ord(c)))
48                 continue
49             # duplicate consecutive soundex digits are skipped
50             if not sndx or (d != sndx[-1]):
51                 sndx += d
52
53     sndx = fc + sndx[1:]   # replace first digit with first char
54     sndx = sndx.replace('0','')       # remove all 0s
55     return (sndx + (len * '0'))[:len] # padded to len characters
56
57 class AmazonAlbum(object):
58    # Image sizes
59    IMG_SMALL  = 0x1;
60    IMG_MEDIUM = 0x2;
61    IMG_LARGE  = 0x4;
62
63    def __init__(self, bag):
64       self.bag = bag;
65
66    def get_title(self):
67       return self.bag.ProductName.encode("utf-8");
68
69    def get_artists(self):
70       try:
71           if type(self.bag.Artists.Artist) is list:
72               return [a.encode("utf-8") for a in self.bag.Artists.Artist]
73           else:
74               return [self.bag.Artists.Artist.encode("utf-8")]
75       except AttributeError:
76           return []
77
78    def get_release_date(self):
79       if hasattr(self.bag, "ReleaseDate"):
80          return self.bag.ReleaseDate.encode("utf-8");
81       else:
82          return None;
83
84    def get_label(self):
85       if hasattr(self.bag, "Manufacturer"):
86          return self.bag.Manufacturer.encode("utf-8");
87       else:
88          return None;
89
90    def get_num_tracks(self):
91       t = self.get_tracks();
92       if t:
93          return len(t);
94       else:
95          return 0;
96
97    def get_tracks(self):
98       if hasattr(self.bag, "Tracks"):
99          tracks = [];
100          for t in self.bag.Tracks.Track:
101             tracks.append(t.encode("utf-8"));
102          return tracks;
103       else:
104          return None;
105
106    def get_img_url(self, size):
107       if size == self.IMG_SMALL and hasattr(self.bag, "ImageUrlSmall"):
108          return self.bag.ImageUrlSmall.encode("utf-8");
109       elif size == self.IMG_MEDIUM and hasattr(self.bag, "ImageUrlMedium"):
110          return self.bag.ImageUrlMedium.encode("utf-8");
111       elif size == self.IMG_LARGE and hasattr(self.bag, "ImageUrlLarge"):
112          return self.bag.ImageUrlLarge.encode("utf-8");
113       else:
114          return None;
115
116    def get_amazon_url(self):
117       return self.bag.URL.encode("utf-8");
118
119    def get_amazon_price(self):
120        try:
121            return self.bag.OurPrice.encode("utf-8");
122        except AttributeError:
123            return None;
124
125    def get_used_price(self):
126       if hasattr(self.bag, "UsedPrice"):
127          return self.bag.UsedPrice.encode("utf-8");
128       else:
129          return None;
130
131    def __str__(self):
132       s = "";
133       s += "\nTitle: %s" % self.get_title();
134       s += "\nArtists:\n"
135       for a in self.get_artists():
136           s += "\t%s\n" % a
137
138       s += "\nRelease Date: %s" % self.get_release_date();
139       s += "\nLabel: %s" % self.get_label();
140       s += "\nTracks:"
141       c = 1;
142       n = self.get_num_tracks();
143       tracks = self.get_tracks();
144       if tracks:
145          for t in tracks:
146             s += "\n\t(%d/%d) %s" % (c, n, t)
147             c += 1;
148       else:
149          s += "\nNo tracks! :(";
150       s += "\nImage URL (Large): %s" % self.get_img_url(self.IMG_LARGE);
151       s += "\nImage URL (Medium): %s" % self.get_img_url(self.IMG_MEDIUM);
152       s += "\nImage URL (Small): %s" % self.get_img_url(self.IMG_SMALL);
153       s += "\nAmazon Price: %s" % self.get_amazon_price();
154       s += "\nUsed Price: %s" % self.get_used_price();
155       s += "\nSee Amazon: %s" % self.get_amazon_url();
156       # XXX: There is a lot of other stuff in the amazon search result.
157       # See the README
158       return s;
159
160
161 MAX_SEARCH_RESULTS = 25
162 MAX_CACHE_SIZE = 8
163 class AlbumArtPlugin(Plugin, MetaDataSearch):
164     def __init__(self):
165         Plugin.__init__(self, PLUGIN_INFO)
166         MetaDataSearch.__init__(self, MetaDataSearch.CAP_ALBUM_ART)
167         self._cache = {}  # query: (last_time, {cap: img})
168
169     def plugin_metadata_search(self, artist, album, track):
170         artist = artist.lower()
171         artist_soundex = soundex(artist)
172         query = artist.encode('utf-8')
173
174         if album:
175             album = album.lower()
176             query += ' %s ' % album.encode('utf-8')
177         album_soundex  = soundex(album)
178
179         # Check cache
180         if self._cache.has_key(query):
181             self.log.debug("Returning cached album cover: %s" % query)
182             retval = self._cache[query][1]
183             retval[0] = time.time()
184             self._cache[query] = (time.time(), retval)
185             return retval
186
187         self.log.debug("Searching amazon.com: %s" % query)
188         results = amazon.OnDemandAmazonList(amazon.searchByKeyword,
189                                             {'keyword': query,
190                                              'product_line': 'music'})
191         search_match = None
192         search_fuzzy_matches = {}
193
194         result_count = 0
195         for result in results:
196             if search_match:
197                 # Found a match, bail
198                 break
199
200             result_count += 1
201             if result_count > MAX_SEARCH_RESULTS:
202                 # Stop looking, there could be hundreds and each batch hits the
203                 # network
204                 self.log.verbose("No album cover found for artist: %s,"
205                                                            "album: %s" %
206                                  (artist, album))
207                 break
208
209             amazon_album = AmazonAlbum(result)
210             self.log.debug("Amazon result:\n%s" % str(amazon_album))
211
212             am_artists = amazon_album.get_artists()
213             am_artists = [a.lower() for a in am_artists]
214             am_album = amazon_album.get_title().lower()
215
216             if artist in am_artists and album == am_album:
217                 # Definite match
218                 self.log.debug("albumart found exact match")
219                 search_match = amazon_album
220             else:
221                 # Fuzzy matching results go into an ordered list
222
223                 # Compare soundex values and insert fuzzy matches in priority
224                 # order
225                 am_artist_soundex = [soundex(a) for a in am_artists]
226                 am_album_soundex = soundex(am_album)
227                 if (artist_soundex in am_artist_soundex and
228                         album == am_album):
229                     self.log.debug("amazon artist soundex AND album match")
230                     search_fuzzy_matches[1] = amazon_album
231                 elif (artist in am_artists and
232                         album_soundex == am_album_soundex):
233                     self.log.debug("amazon artist match AND album soundex")
234                     search_fuzzy_matches[2] = amazon_album
235                 elif (artist_soundex in am_artist_soundex and
236                         album_soundex == am_album_soundex):
237                     self.log.debug("amazon artist soundex AND album soundex")
238                     search_fuzzy_matches[3] = amazon_album
239                     found = True
240                 elif (artist_soundex in am_artist_soundex) or \
241                         (album_soundex == am_album_soundex):
242                     self.log.debug("amazon artist soundex OR album soundex")
243                     search_fuzzy_matches[4] = amazon_album
244                 else:
245                     continue
246
247         if not search_match and search_fuzzy_matches:
248             # No exact match, use highest prority fuzzy result
249             keys = search_fuzzy_matches.keys()
250             keys.sort()
251             search_match = search_fuzzy_matches[keys[0]]
252
253         cover_image = None
254         if search_match:
255             for url in [search_match.get_img_url(AmazonAlbum.IMG_LARGE),
256                         search_match.get_img_url(AmazonAlbum.IMG_MEDIUM),
257                         search_match.get_img_url(AmazonAlbum.IMG_SMALL)]:
258                 img = self._fetch_image(url)
259                 if img and len(img) == 807:
260                     # 807 is the size of an empty image result from amazon
261                     continue
262                 elif img:
263                     # Got a cover
264                     cover_image = img
265                     break
266         else:
267             self.log.debug("amazon.com no match found")
268
269         if not cover_image:
270             self.log.debug("amazon.com no image available")
271
272         retval = {MetaDataSearch.CAP_ALBUM_ART: cover_image}
273
274         # Update/clean cache
275         now = time.time()
276         self._cache[query] = (now, retval)
277
278         # Prune cache
279         cached_keys = []
280         for key in self._cache:
281             if self._cache[key][1][1]:
282                 # Only add if there is an image, this is the mem being saved
283                 cached_keys.append(key)
284
285         if len(cached_keys) > MAX_CACHE_SIZE:
286             access_times_to_keys = {}
287             for key in cached_keys:
288                 access_times_to_keys[self._cache[key][0]] = key
289             times = access_times_to_keys.keys()
290             times.sort()
291
292             size = len(cached_keys)
293             while size > MAX_CACHE_SIZE:
294                 t = times.pop(0)
295                 key = access_times_to_keys[t]
296                 self.log.debug('Removing \'%s\' from album cover cache' % key)
297                 size -= 1
298                 del self._cache[key]
299
300         return retval
301
302     def _fetch_image(self, url):
303         if not url:
304             return None
305         else:
306             self.log.debug("Fetching image URL: " + url)
307             resp = urllib.urlopen(url)
308             img_data = resp.read()
309             resp.close()
310             return img_data
311
312 XPM = [
313 "150 60 158 2",
314 "       c #030303",
315 ".      c #070708",
316 "+      c #080707",
317 "@      c #090708",
318 "#      c #0C0B0B",
319 "$      c #110E0F",
320 "% c #120F10",
321 "&      c #141212",
322 "*      c #191616",
323 "=      c #1A1718",
324 "-      c #1D1A1B",
325 ";      c #211D1E",
326 ">      c #221F20",
327 ",      c #21201F",
328 "'      c #252223",
329 ")      c #282626",
330 "!      c #2A2728",
331 "~      c #2C2B2C",
332 "{      c #312E2F",
333 "]      c #312F30",
334 "^      c #333233",
335 "/      c #383637",
336 "(      c #393738",
337 "_      c #3C3B3C",
338 ":      c #403E3E",
339 "<      c #413F40",
340 "[      c #444343",
341 "}      c #484647",
342 "|      c #4A4748",
343 "1      c #4D4B4C",
344 "2      c #504E4F",
345 "3      c #504F50",
346 "4      c #545354",
347 "5      c #575857",
348 "6      c #585757",
349 "7      c #595758",
350 "8      c #5B5A5B",
351 "9      c #625F5D",
352 "0      c #636263",
353 "a      c #686766",
354 "b      c #6A6966",
355 "c      c #6D6B6C",
356 "d      c #706E6D",
357 "e      c #706F70",
358 "f      c #747374",
359 "g      c #787676",
360 "h      c #797778",
361 "i      c #797876",
362 "j      c #7D7C7C",
363 "k      c #807F7E",
364 "l      c #817F80",
365 "m      c #F7A505",
366 "n      c #F7A709",
367 "o      c #F7A80D",
368 "p      c #F7AA13",
369 "q      c #F7AD1A",
370 "r      c #F8AB16",
371 "s      c #F8AE1D",
372 "t      c #F7AF21",
373 "u      c #F8AF21",
374 "v      c #F7B023",
375 "w      c #F8B124",
376 "x      c #F8B42C",
377 "y      c #F8B633",
378 "z      c #F8B738",
379 "A      c #F8B93A",
380 "B      c #F9BC44",
381 "C      c #F9BF4C",
382 "D      c #F9C04F",
383 "E      c #F9C253",
384 "F      c #F9C55D",
385 "G      c #F9C662",
386 "H      c #FAC866",
387 "I      c #F9CA6C",
388 "J      c #FACD75",
389 "K      c #FACF7C",
390 "L      c #FBD17E",
391 "M      c #848383",
392 "N      c #888687",
393 "O      c #898788",
394 "P      c #8A8886",
395 "Q      c #8C8B8C",
396 "R      c #908F8F",
397 "S      c #908F90",
398 "T      c #94928C",
399 "U      c #949394",
400 "V      c #989697",
401 "W      c #989798",
402 "X      c #9C9B9B",
403 "Y      c #A09E9D",
404 "Z      c #A19FA0",
405 "`      c #A5A29C",
406 " .     c #A4A3A4",
407 "..     c #A8A7A7",
408 "+.     c #A9A7A8",
409 "@.     c #ACABAB",
410 "#.     c #B1AEA7",
411 "$.     c #B0AFAF",
412 "%.     c #B1AFB0",
413 "&.     c #B5B2AE",
414 "*.     c #B3B3B3",
415 "=.     c #B8B7B7",
416 "-.     c #B8B7B8",
417 ";.     c #BCB8B2",
418 ">.     c #BCBBBB",
419 ",.     c #C0BFBF",
420 "'.     c #C0BFC0",
421 ").     c #C5C2BD",
422 "!.     c #FBD383",
423 "~.     c #FBD68B",
424 "{.     c #FBD88F",
425 "].     c #FCD791",
426 "^.     c #FBD994",
427 "/.     c #FBDB9B",
428 "(.     c #FCDEA3",
429 "_.     c #FCE0A7",
430 ":.     c #FCE1AC",
431 "<.     c #FCE4B3",
432 "[.     c #FDE7BB",
433 "}.     c #FDE8BD",
434 "|.     c #C5C4C5",
435 "1.     c #C8C7C7",
436 "2.     c #C8C7C8",
437 "3.     c #CBC9C7",
438 "4.     c #CCCCCC",
439 "5.     c #D1CECC",
440 "6.     c #D1CFD0",
441 "7.     c #D3D2CF",
442 "8.     c #D3D3D3",
443 "9.     c #D9D7D4",
444 "0.     c #DBD9D7",
445 "a.     c #DCDBDB",
446 "b.     c #E0DEDF",
447 "c.     c #E0DFE0",
448 "d.     c #E3E0DA",
449 "e.     c #FDEAC4",
450 "f.     c #FDEDCC",
451 "g.     c #FCEED3",
452 "h.     c #FAEFDB",
453 "i.     c #FDF0D6",
454 "j.     c #FDF2DC",
455 "k.     c #E3E3E3",
456 "l.     c #E8E7E6",
457 "m.     c #E8E7E8",
458 "n.     c #EBE9E4",
459 "o.     c #ECEBEC",
460 "p.     c #F0EDE7",
461 "q.     c #F2EFEB",
462 "r.     c #F6F3EC",
463 "s.     c #FEF6E5",
464 "t.     c #FEF7E9",
465 "u.     c #FEF8EC",
466 "v.     c #F4F4F4",
467 "w.     c #F7F7F8",
468 "x.     c #F9F7F6",
469 "y.     c #F8F7F8",
470 "z.     c #FEFBF4",
471 "A.     c #FFFFFF",
472 "A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.",
473 "A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.",
474 "A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.",
475 "A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.t.g.e./.<.e.j.z.A.A.A.A.A.A.A.A.A.A.A.t.e.}./.}.f.u.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.",
476 "A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.j.<.<.J x o n n o C ^.<.e.z.A.A.A.A.A.e.:.{.H p n n n r J <.<.j.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.",
477 "A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.}.I y m m n o o n m o A !.u.A.A.A.A.A.{.C q m n o o n m m y I }.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.",
478 "A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.s.(.:.s.A.e.!.J y n n A J ~.j.A.f.<.z.f.].[.A.z.(.K B o m y F !.e.A.i./.e.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.",
479 "A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.s.C q E K :.s.y.e.~.~.f.A.j./.K A F z.K m y J !.e.A.i.{.~.[.z.A.:.L D n J A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.",
480 "A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.y.I m m m t C J <.A.A.(.I C p m m I A.L m n m m y I L y.A.e.K I w m n m J A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.",
481 "A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.I m o o t o n x r.h.w m n o o m I A.L m n o s p m n {.s.A m m o o o m J A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.",
482 "A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.y.I m o o q o o r h.j.p o o o o m I A.L m o o p o o o K s.x o o o o o m J A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.",
483 "A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.I m o o o o o q h.h.r o o o o m F z.L m o o o o n p ~.s.z o o o o o m J A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.",
484 "A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.I m o o o o o q h.s.r o o o o n B i.!.m o o o o o p ~.s.z o o o o o m J A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.",
485 "A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.I m o o o o o q h.g.r o o o o m B g.!.m o o o o o p ~.s.z o o o o o m J A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.",
486 "A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.y.I m o o t p o q h.g.r o o o o n B g.!.m o o o o o p ~.s.z o o o o o m J A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.",
487 "A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.I m p o o o o q h.g.p o o o o m B g.!.m o o o o o p ~.s.z o o o o o m K A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.",
488 "A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.I m s p o o o q h.g.p p p o o n B g.!.m n o o o o p ~.s.z o o o o n m J A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.",
489 "A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.{.z y q n n o q h.g.p p t n p w H i.:.B x p n n n p ~.s.z o o n o u z ].A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.",
490 "A.A.A.A.A.A.A.A.A.s.i.u.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.u.g.h.A.s.~.C B t p h.g.p m q A I f.A.A.A.A.f.H B v o o ~.s.y n o y F <.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.",
491 "A.A.A.A.A.z.e.<.(.H B I _.}.i.A.A.A.A.A.A.A.A.A.i.[.:.K x B /.<.f.u.x.(.H s.g.t F ~.s.A.A.A.A.A.A.A.A.A.(.G A ~.s.y B H e.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.",
492 "A.A.A.u.(.J v m n n n n m p B /.j.A.A.A.A.A.i.~.B p m m o o m m w I e.A.A.A.u.^.A.A.A.A.A.A.A.A.A.A.A.A.A.A.e.[.z.:.s.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.",
493 "A.s.z.u.!.J F q m n n m p B I ~.i.y.y.z.f.A.f.J I B o m m m m u G J <.A.i.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.",
494 "z.(.I {.f.y.z.(.!.F A I ^.i.A.j.^.!.g.s.B !.^.s.A.g.].K C C K (.A.z._.~.F u.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.",
495 "z.!.n o y G ~.f.A.s.f.z.z./.J C o p f.s.p m p D J ^.t.A.g.i.A.f.!.F v n p u.A.A.A.A.A.A.v.-.l c c c N |.A.A.A.A.A.x.|.|.,.1.A.q. .Q Q X o.A.A.y...V V Y A.A.A.A.A.A.A.A.k.+.j c e c Q 4.A.A.A.A.A.q.=.|.|.|.|.|.|.|.|.|.|.v.A.A.A.A.A.+.N V U @.o.A.A.A.A.A.c.2.|.=.l.A.o.X V U =.A.A.A.A.A.A.A.A.A.A.A.A.A.",
496 "z.!.p o n m p z E <.A.(.E q m n o q j.s.p o o o m r D ~.s.[.I z o m n o q u.A.A.A.A.A.6.3 ^ = # # # - ( 7 m.A.A.A.k._ ^ ~ 0 9.6 = & ; ; 4 9.o.e - ' ) = a k.A.A.A.A.v...} ~ * # # # > _ f w.A.A.A.7.) ^ ] ^ ] ] ^ ^ ^ ^ _ a.A.A.A.=.7 ' - ) ; ' 1 @.A.A.A.A.j / ] ~ i n.5 ) ' ; ) U A.A.A.A.A.A.A.A.A.A.A.A.",
497 "z.!.o o o o n n m !.w.G m o o o o q h.s.p o o p v n m B i.~.o m o o o o q u.A.A.A.A.6.^ $ * ; & * > - & 4 o.A.A.c.. % % : d   & * ; *   S 0 * & - - & & 8 A.A.A.A. .> $ = - $ = > - % . j w.A.A.|.  & & % & % % % $ $ ~ a.A.A.Z ~ $ & ; - - & & ) @.A.A.A.b * % & _ [ & ; ; = & = U A.A.A.A.A.A.A.A.A.A.A.",
498 "z.!.p o o o o o m K w.H m o o o o p j.s.p p w p p o m C i.{.r o o o o o q u.A.A.A.m.c   ; ; $ ^ ( # * ; * # 4.A.A.c.# ; ; ' ) $ + & ; ; = ' = # + = ; ; = = >.A.A.-.; * > & & } - # = - = , q.A.A.1.  + + + . & ; ; ; # / a.A.k.~ & ; = & ^ & $ ; * { -.A.A.f ' ; ; ' & + # ; ; ; # 1 o.A.A.A.A.A.A.A.A.A.A.",
499 "z.!.p o o o o q q !.w.H m o o o o q j.t.p o p o o o m B i.{.r n o o o o q u.A.A.A.2.& - ; = f a.a.W ) * ; . j v.A.k.# ; ; - - 2 c - & ; ; * # ] j { ; ; = # f A.A.V   ; & - W c.9.7 ' ; - & 8.A.A.v.).-.-.|...^ % ; ; . +.y.y.f - - * ~ 5.a. .; # ' . V A.A.f ' ; ; - & f g $ ; ; $ / 3.A.A.A.A.A.A.A.A.A.A.",
500 "z.!.o o o o o o n K w.G m o o o o q h.s.p o o o o o o B i.{.r n o o o o q u.A.A.A.4.= # $ 5 m.A.A.q.[ $ ; . j v.A.k.# - ; & 1 o.q.M = - > # 1 4.v.0.- - - ; b A.A.$.& # # N w.A.A...- = - & 9.A.A.A.A.A.A.z.S & - ; # 8 k.A.v.' - ; - | A.A.v.M   ; # 1 9.A.f ' - ; # l o.o.Q + ; $ ^ |.A.A.A.A.A.A.A.A.A.A.",
501 "z.!.p o o o o o m K w.G n o o o o p h.s.p o o o o o n B i.{.r o o o o o q u.A.A.A.y.o.k.k.m.v.q.q.o.| % ; . k v.A.c.# - - > M A.A.9.[ % >   #.A.A.v.- - ; ' b A.A.v.k.k.k.o.v.q.o.*.; = - & a.A.A.A.A.A.A.X & = ; - $ *.A.A.4.= - - = @.A.A.A.X   ; - = $.A.f ' ; - % k.A.A.4.  ; $ / |.A.A.A.A.A.A.A.A.A.A.",
502 "z.!.p p o o o o m !.w.G m o o o o q h.s.p o o o o o n B i.{.r o o o o o q u.A.A.A.A.A.w.9. .c _ - & * ; ; + k v.A.k.# ; & - ..A.A.4._ # >   ;.A.A.v.= - ; > c A.A.A.A.v.|.N 8 ) & & = ; - & a.A.A.A.A.A.a.1 # - - % ..y.A.A.Y % - = & X A.A.A. .@ ; ;    .A.g ' - ; & o.A.A.4.. ; % ^ |.A.A.A.A.A.A.A.A.A.A.",
503 "z.L r w o o o o m !.A.G n o o o o q g.s.p o o o o o o B i.{.p o o o o o q u.A.A.A.A.v.T # # & = - ' ; ; ; + M v.A.k.# ; & ) -.A.A.4._ $ >   ,.A.A.v.= - ; > b A.A.y.4.5 # # & * - - - ; ; & a.A.A.A.A.v.Q # - - # j v.A.A.A.X % - = ' r.A.A.A.=.{ ; ;    .A.g ' ; ; ] o.A.A.4.. ; % ^ |.A.A.A.A.A.A.A.A.A.A.",
504 "z.L v m n o o o m !.y.H n o o o n t e.t.y p n n o o n B i.{.p o o o n n y u.A.A.A.v.l # ; - = ~ 4 b ] - ; + M v.A.c.# ; & ) -.A.A.4._ # ;   ,.A.A.v.= ; ; > b A.A.3.( $ ; = ) ^ 7 } - - - & a.A.A.A.w.W + ; ; # ^ |.A.A.A.A.X & = = ' d.A.A.A.=.~ - ;    .A.g > ; ; 1 q.A.A.4.. ; $ ^ |.A.A.A.A.A.A.A.A.A.A.",
505 "A.z./.B y p n n m !.A.G m n n v B ~.z.A.e.G B v m n m C g.{.p n n q B C e.A.A.A.A.*.. ; - & b l.A.A.1 % ; + k v.A.k.# - & ) -.A.A.5._ $ ; . ,.A.A.v.= - ; > c A.v.h . ; = - %.A.A.'., = - & a.A.A.A.|.' $ ; * ) *.A.A.A.A.A.W % - = & U A.A.A...& ; ;    .A.g > - ; 1 v.A.A.4.. ; $ ^ |.A.A.A.A.A.A.A.A.A.A.",
506 "A.A.A.A.f.!.C v m K y.F p A E (.A.A.A.i.z.A.A./.E z p z f.~.n v C !.z.A.A.A.A.A.o.j . ; # _ 8.A.A.v.[ % ; . Q v.A.k.# ; & ) -.A.A.4._ $ ; . '.A.A.v.= - ; > b A.|.- % ; + h v.A.A...* = - & k.A.A.o.c # ; ; # c ).4.k.A.A.A.%.& - - = U A.A.A.Y   ; ; % ..A.g > - ; | v.A.A.4.  ; % ^ 1.A.A.A.A.A.A.A.A.A.A.",
507 "A.A.A.A.A.A.u.^.E /.y./.~.g.A.z.}._./.D !._.[.s.A.f.!.K i.(.F /.z.A.A.A.A.A.A.A.o.c . ; # 7 v.A.A.-.~ * ; $ 0 v.A.k.# - & ) -.A.A.4._ # ;   >.A.A.v.= ; ; > b A.,.' - ; . U A.A.A.f * = - & 2.A.v. .  > ; - ; ~ ' ^ 8 U |.w.o.= - - - 4 A.A.v.N   ; * ( 2.A.g ' - ; 1 q.A.A.4.. ; $ ^ |.A.A.A.A.A.A.A.A.A.A.",
508 "A.A.A.A.A.A.A.A.z.t.A.A.A.<.~.J v m m o m o v F ~.[.A.A.A.A.A.A.A.A.A.A.A.A.A.A.m.0 + ; * ~ *.A.9.[ * ; ; ; . 3.A.c.# - & ) -.A.A.4._ $ ; . >.A.A.v.= - ; > c A.|.' ; ; $ 7 b.A.>.~ * ; - & 4 A.k._ $ ; ; ; ; - ; & # . ] a.z.1 & ; * - |.A.|.{ & >   c o.A.f ' ; ; 1 v.A.A.3.. ; % ^ 1.A.A.A.A.A.A.A.A.A.A.",
509 "A.A.A.A.A.A.A.A.A.A.u.A.A.(.K C o m n o o m p E L :.A.z.u.A.A.A.A.A.A.A.A.A.A.A.v.R + ; ; % [ j [ % + = ; - & 4 v.c.# ; & ) -.A.A.4._ $ ;   ,.A.A.v.- - ; > c A.8._ & ; ; * 6 j / - # - - - # U 0.~ ; ; * # + + . # = ;   ).A.|.# - - & : j 1 $ ; & ~ >.A.A.g ' - ; 1 v.A.A.4.. ; % ^ |.A.A.A.A.A.A.A.A.A.A.",
510 "A.A.A.A.A.A.A.A.A.A.(.H !.g.A.s.(.^.D o B ~.(.t.A.f.L ~.i.A.A.A.A.A.A.A.A.A.A.A.A.3.+ $ ; ; & #     7 ) = ; # N v.k.# - & ) -.A.A.4._ $ ; . >.A.A.v.= ; ; ' b A.y.Q   ; ; ; % # # & 3 = = # . Z a.' + # ~ 5 c P b ^ # .   *.A.z.Q # $ ; * # % > & # N v.A.A.g ' - > 1 v.A.A.4.. ; $ ^ |.A.A.A.A.A.A.A.A.A.A.",
511 "A.A.A.A.A.A.A.A.A.A.!.m o A G /.j.A.s.:.f.A.i.^.F z m B f.A.A.A.A.A.A.A.A.A.A.A.A.o.N * . .   . . c c.X - . Q A.A.c.  .   - @.A.A.|.]   .   >.A.A.v.& .   # 0 A.A.a.a @   . . + = Q a.[ . ~  .A.k.8 8  .>.a.v.A.o.2...h ' |.A.A.A.V $ . + @ +   ~ U k.A.A.A.9 +   . ] q.A.A.3.  .   ) >.A.A.A.A.A.A.A.A.A.A.",
512 "A.A.A.A.A.A.A.A.A.A.{.p n n n s A F L A.f.E A s m o n B f.A.A.A.A.A.A.A.A.A.A.A.A.A.v.>...V W  .*.o.A.v.$.@.y.A.A.v.@.V W ..k.A.A.o.@.W W +.o.A.A.A.=.W X X 8.A.A.A.o.$.X X V  .>.w.A.4. .2.A.A.y.a.k.A.A.A.A.A.A.A.A.v.|.v.A.A.A.A.>. .f 7 0 ..3.y.A.A.A.A.3.X X W -.y.A.A.v.+.W W @.o.A.A.A.A.A.A.A.A.A.A.",
513 "A.A.A.A.A.A.A.A.A.A.{.p o o o n o n v s.~.o v o o o n B f.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.y.A.A.A.A.A.A.A.A.A.A.A.A.y.A.A.A.A.o.o.A.y.A.A.A.A.A.A.A.y.A.A.A.A.A.A.A.A.A.A.y.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.o.A.A.A.A.A.o.k.o.A.A.A.A.A.A.A.A.A.A.y.A.A.A.A.A.A.A.y.A.A.A.A.A.A.A.A.A.A.A.A.",
514 "A.A.A.A.A.A.A.A.A.A.{.p t p o o o o s s.!.o p o o o n B f.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.b.b ~  .A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.5 { X w.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.",
515 "A.A.A.A.A.A.A.A.A.A.{.p p p o o o o t s.!.o o o o o n C f.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.9.1   P A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.^   4 v.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.",
516 "A.A.A.A.A.A.A.A.A.A.{.p o o o o o o s s.!.p o o o o n B f.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.v.v.v.y.A.A.a.1   Q z.y.y.A.A.A.A.A.A.A.A.A.v.z.A.A.A.A.A.A.A.w.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.8.M c.A.A.A.y.x.A.A.A.A.A.A.A.A.y.y.A.A.A.A.A.A.A.z.x.A.A.A.A.A.A.A.A.A.A.A.A.A.A.",
517 "A.A.A.A.A.A.A.A.A.A.{.p o o o o o o s t.!.o o o o p o B f.A.A.A.A.A.A.A.A.A.A.A.A.w.a.6.v.A.A.8.6.v.A.A.o.>.v.A.a.3 } 1 R o.A.a.1   l =.N N 4.y.A.A.A.A.w.k.-.j -.o.w.A.A.A.o.|.M  .a.w.A.A.k.m.v.9.8.v.8.1.v.A.A.A.o.8.v.o.9.o.A.A.k.|.U |.o.z.A.A.A.r.2.N U 9.w.A.A.A.v.c.+.M |.o.A.v.k.l.k.o.o.y.A.o.v.A.",
518 "A.A.A.A.A.A.A.A.A.A.^.q o o o o o o s s.!.o o o o q s B f.A.A.A.A.A.A.A.A.A.A.A.A.4.* * Q A.k.7 . ..A.A._ . 4.'.= . ; = . } k.a.1 # * . # # # *.y.A.A.y.X & . # . ~ ` v.A.9.| + # . $ U w.m.* ) Q + ^ M & = X A.A.v.4 . |._ # i v.|.$ . . . _ 8.A.A.o.0 . # # # U v.A.o.0 # . # + [ 9.@.~ > ) 0 ) *.v.^ l v.",
519 "A.A.A.A.A.A.A.A.A.A.e.A n o o o o o s s.!.o o o o o n B f.A.A.A.A.A.A.A.A.A.A.A.A.o.f   8 A.-.{   W A.v.^ # 3.- * [ a.@.' # 8 k.1 # # - f < * # 4.A.A.8.# = _ 7 ~ # , @.o.8 # ) 5 < * # 4.a.% =   & 2 Y 1   f z.A.=.) # 3.^   Q a.$   ' [ ~ # 4 o.o.0 + ) 5 4 - # &.v.V # ; _ 7 ~ + 4 l.8.[ V $.- } X ' c v.",
520 "A.A.A.A.A.A.A.A.A.A.f.B m n o p o o s s.!.p o o o n m D i.A.A.A.A.A.A.A.A.A.A.A.A.A.+.  1 v.T & # 8 k.*.- 1 N $ ' r.A.A...  1 8.3 . ^ -.A.1.~   V v.y.f   ~ A.A.7._ ~ X U % - >.A.A.5 . 5 c.& * % Q v.q.f   5 k.A.M # 8 k.^   W  .. * -.A.|.# # U ..& & =.A.A.0 = ; a.[   : A.A.|.~ 4 3.v.4 V $.~   # _ b q.",
521 "A.A.A.A.A.A.A.A.A.A.t./.F y o s p o s s.!.o o m p B D /.A.A.A.A.A.A.A.A.A.A.A.A.A.A.>.# ~ >.P + ; ' |.c #  .[ # [ +.*.*.N . ~  .9   P A.A.A.[   6 o.y.O . ' *.3.k.k.9.y.e   7 -.3.2.U - # 4.% * 5 A.A.A.+.# ~ @.y.5   R v.^   V 0 . ^ A.A.k.e ) X N   1 @.1.1.@.' + 0.: . ^ *.5.k.9.k.A.o.4 V *.1 ~ ' Q 0 o.",
522 "A.A.A.A.A.A.A.A.A.A.A.A.A.}.J E s m q s.!.m p E L i.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.9._ # M j # '   @.[   6.) = #           ' X 0   Q A.A.A.0 . _ o.A.3.# # # / 7 U 4.b.| # ' ' - - # # .  .# - 8.A.A.A.4._   N k.< # |.A.{   X ] # l A.A.A.a.=.k.k @ ' ' - ; ; $   5. .  +   ( c Y 3.A.y. .|.9.V @.*.=.$.w.",
523 "A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.t./.J B t./.J {.u.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.v.M   ( _ } 1 # 0 { # 8.' & [ c c c c f N *.6   Q A.A.A.g # _ l.A.v.k [ '       _  .4 . _ 8 0 0 0 b a -.# , q.A.A.A.v.h   j ..= [ a.A.{ . +.* %  .A.A.A.A.A.A.f . : 0 9 0 0 b 0 a.v.f [ &       _ 8.A.A.A.A.A.A.A.A.A.A.",
524 "A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.}.A.s.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.@.  *   N Y ' & $ _ a.~ . 0 A.A.A.A.4.b.a.1   Q A.A.A.7 . 2 o.A.A.A.9.X k 0 *   4 0   Q w.z.y.A.x.A.k.# , k.A.A.A.A.X # 4 1   U v.A.~ . X / # f A.A.A.3.k |.l   h q.y.y.A.x.A.A.A.v.0.X j 9 & $ l A.A.A.A.A.A.A.A.A.A.",
525 "A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.=.& & . Q k._ $ . j o.0 . - a.A.A.>./ 0 2.5   f v.A.A._   j v.v.M c @.A.A.r.f   a c   0 o.A.A.6.c e 9.# , m.A.A.A.A.'.] = )   @.A.A.^   V c . _ A.A.a.[   k Q   [ 8.A.A.c.f c k.f 0 l.A.A.a.1   d A.A.A.A.A.A.A.A.A.A.",
526 "A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.a.1 + - X x.4 $ . -.A.4.& * 3 +.W _   [ 6.4 . ' V y.S '   >.A.v.^   ~ >.A.a.4 . i X # * j q.6.1   ' a.$ , k.A.A.A.A.q.d . & ~ |.A.A.~   Q |.. - Q v.j   ) -.@., % 8 k.k.8 . # 9.. & 5 1.A.3.{ + c A.A.A.A.A.A.A.A.A.A.",
527 "A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.x.U   ^ -.A.b . # 4.A.A.W #   > *   / 4.8.<     = | ' . f v.A.y.=.    ~ 1 (   -  .k.4   & [ ^     $.a.# , c.A.A.A.A.A.N     h v.A.A.]   f o.3 # ' [ *   4 w.o.0   . _ _ .    .v.` #   { 1 ( @ ^ ).A.A.A.A.A.A.A.A.A.A.",
528 "A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.+.# f v.A.=.^ a k.A.A.y.>.0 = _ k 8.A.v.e 7 W )   ' O m.A.A.A.A.$.~       ' X o.A.a.b #     } $.A.m.# - q.A.A.A.A.A.>._ $ ..A.A.A.: = ).y.9.0 .   . 9 0.A.A.a.e #     ) ..y.A.A.*.~       } |.A.A.A.A.A.A.A.A.A.A.A.",
529 "A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.o.6.o.A.A.v.a.o.A.A.A.A.A.o.9.a.v.A.A.A.l.m.y.a.4.9.v.A.A.A.A.A.A.a.4.4.4.9.v.A.A.A.o.8.4.4.k.A.A.A.6.9.A.A.A.A.A.A.x.a.8.o.A.A.A.a.9.y.A.A.k.4.4.6.m.A.A.A.A.o.8.6.4.0.A.A.A.A.A.a.4.4.4.c.A.A.A.A.A.A.A.A.A.A.A.A.",
530 "A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.",
531 "A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A."
532 ]
533
534 ## Required for plugins ##
535 PLUGIN_INFO = PluginInfo(name='albumart', display_name='Album Artwork',
536                          desc=_('Download missing album art from amazon.com.'),
537                          author='Travis Shirk <travis@pobox.com>',
538                          url='http://mesk.nicfit.net/',
539                          copyright=\
540 '''Copyright © 2007-2008 Travis Shirk