From d33c53b691cdd34a622f72ed2a8add12af5b30a7 Mon Sep 17 00:00:00 2001 From: Ciro Mattia Gonano Date: Thu, 14 Nov 2013 15:49:46 +0100 Subject: [PATCH 01/50] Version 4.0 - first draft for Python3 conversion --- kcc.iss | 2 +- kcc.py | 12 +-- kcc/KCC_gui.py | 181 ++++++++++++++++++++++--------------------- kcc/KCC_rc.py | 10 +-- kcc/KCC_ui.py | 2 +- kcc/KCC_ui_linux.py | 2 +- kcc/KCC_ui_osx.py | 2 +- kcc/__init__.py | 2 +- kcc/__main__.py | 2 + kcc/cbxarchive.py | 8 +- kcc/comic2ebook.py | 76 +++++++++--------- kcc/comic2panel.py | 32 ++++---- kcc/image.py | 24 +++--- kcc/kindlesplit.py | 24 ++++-- kcc/pdfjpgextract.py | 2 +- kcc/rarfile.py | 6 +- requirements.txt | 4 + setup.py | 8 +- setup.sh | 2 +- 19 files changed, 210 insertions(+), 191 deletions(-) create mode 100644 kcc/__main__.py create mode 100644 requirements.txt diff --git a/kcc.iss b/kcc.iss index fe6b807..7d5bffd 100644 --- a/kcc.iss +++ b/kcc.iss @@ -1,5 +1,5 @@ #define MyAppName "Kindle Comic Converter" -#define MyAppVersion "3.6" +#define MyAppVersion "4.0" #define MyAppPublisher "Ciro Mattia Gonano, Paweł Jastrzębski" #define MyAppURL "http://kcc.vulturis.eu/" #define MyAppExeName "KCC.exe" diff --git a/kcc.py b/kcc.py index 4d60f5e..a6f9c23 100644 --- a/kcc.py +++ b/kcc.py @@ -18,7 +18,7 @@ # TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. -__version__ = '3.6' +__version__ = '4.0' __license__ = 'ISC' __copyright__ = '2012-2013, Ciro Mattia Gonano , Pawel Jastrzebski ' __docformat__ = 'restructuredtext en' @@ -29,13 +29,13 @@ try: #noinspection PyUnresolvedReferences from PyQt4 import QtCore, QtGui, QtNetwork except ImportError: - print "ERROR: PyQT4 is not installed!" + print("ERROR: PyQT4 is not installed!") if sys.platform.startswith('linux'): - import Tkinter - import tkMessageBox - importRoot = Tkinter.Tk() + import tkinter + import tkinter.messagebox + importRoot = tkinter.Tk() importRoot.withdraw() - tkMessageBox.showerror("KCC - Error", "PyQT4 is not installed!") + tkinter.messagebox.showerror("KCC - Error", "PyQT4 is not installed!") exit(1) from kcc import KCC_gui from multiprocessing import freeze_support diff --git a/kcc/KCC_gui.py b/kcc/KCC_gui.py index 3713f65..0142767 100644 --- a/kcc/KCC_gui.py +++ b/kcc/KCC_gui.py @@ -17,7 +17,7 @@ # TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. -__version__ = '3.6' +__version__ = '4.0' __license__ = 'ISC' __copyright__ = '2012-2013, Ciro Mattia Gonano , Pawel Jastrzebski ' __docformat__ = 'restructuredtext en' @@ -25,39 +25,38 @@ __docformat__ = 'restructuredtext en' import os import sys import traceback -import urllib2 +import urllib.request, urllib.error, urllib.parse import socket -import comic2ebook -import kindlesplit -from string import split +from . import comic2ebook +from . import kindlesplit from time import sleep from shutil import move -from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer -from SocketServer import ThreadingMixIn -from image import ProfileData +from http.server import BaseHTTPRequestHandler, HTTPServer +from socketserver import ThreadingMixIn +from .image import ProfileData from subprocess import STDOUT, PIPE from PyQt4 import QtGui, QtCore from xml.dom.minidom import parse -from HTMLParser import HTMLParser -from KCC_rc_web import WebContent +from html.parser import HTMLParser +from .KCC_rc_web import WebContent try: #noinspection PyUnresolvedReferences from psutil import TOTAL_PHYMEM, Popen except ImportError: - print "ERROR: Psutil is not installed!" + print("ERROR: Psutil is not installed!") if sys.platform.startswith('linux'): - import Tkinter - import tkMessageBox - importRoot = Tkinter.Tk() + import tkinter + import tkinter.messagebox + importRoot = tkinter.Tk() importRoot.withdraw() - tkMessageBox.showerror("KCC - Error", "Psutil is not installed!") + tkinter.messagebox.showerror("KCC - Error", "Psutil is not installed!") exit(1) if sys.platform.startswith('darwin'): - import KCC_ui_osx as KCC_ui + from . import KCC_ui_osx as KCC_ui elif sys.platform.startswith('linux'): - import KCC_ui_linux as KCC_ui + from . import KCC_ui_linux as KCC_ui else: - import KCC_ui + from . import KCC_ui class Icons: @@ -130,8 +129,8 @@ class WebServerHandler(BaseHTTPRequestHandler): '

- -

\n') if len(GUI.completedWork) > 0 and not GUI.conversionAlive: - for key in sorted(GUI.completedWork.iterkeys()): - self.wfile.write('

' + split(key, '.')[0] + '

\n') + for key in sorted(GUI.completedWork.keys()): + self.wfile.write('

' + key.split('.')[0] + '

\n') else: self.wfile.write('

No downloads are available.
' 'Convert some files and refresh this page.

\n') @@ -139,7 +138,7 @@ class WebServerHandler(BaseHTTPRequestHandler): '\n' '\n') elif sendReply: - outputFile = GUI.completedWork[urllib2.unquote(self.path[1:])].decode('utf-8') + outputFile = GUI.completedWork[urllib.parse.unquote(self.path[1:])].decode('utf-8') fp = open(outputFile, 'rb') self.send_response(200) self.send_header('Content-type', mimetype) @@ -173,7 +172,7 @@ class WebServerThread(QtCore.QThread): try: # Sweet cross-platform one-liner to get LAN ip address lIP = [ip for ip in socket.gethostbyname_ex(socket.gethostname())[2] if not ip.startswith("127.")][:1][0] - except StandardError: + except Exception: # Sadly it can fail on some Linux configurations lIP = None try: @@ -186,7 +185,7 @@ class WebServerThread(QtCore.QThread): self.emit(QtCore.SIGNAL("addMessage"), 'Content server started on port 4242.', 'info') while self.running: self.server.handle_request() - except StandardError: + except Exception: self.emit(QtCore.SIGNAL("addMessage"), 'Content server failed to start!', 'error') def stop(self): @@ -202,9 +201,9 @@ class VersionThread(QtCore.QThread): def run(self): try: - XML = urllib2.urlopen('http://kcc.vulturis.eu/Version.php') + XML = urllib.request.urlopen('http://kcc.vulturis.eu/Version.php') XML = parse(XML) - except StandardError: + except Exception: return latestVersion = XML.childNodes[0].getElementsByTagName('latest')[0].childNodes[0].toxml() if tuple(map(int, (latestVersion.split(".")))) > tuple(map(int, (__version__.split(".")))): @@ -253,9 +252,10 @@ class KindleGenThread(QtCore.QRunnable): kindlegenError = '' try: if os.path.getsize(self.work) < 367001600: - output = Popen('kindlegen -locale en "' + self.work.encode(sys.getfilesystemencoding()) + '"', - stdout=PIPE, stderr=STDOUT, shell=True) + output = Popen('kindlegen -locale en "' + self.work.encode(sys.getfilesystemencoding()).decode('utf-8') + + '"', stdout=PIPE, stderr=STDOUT, shell=True) for line in output.stdout: + line = line.decode('utf-8') # ERROR: Generic error if "Error(" in line: kindlegenErrorCode = 1 @@ -269,9 +269,10 @@ class KindleGenThread(QtCore.QRunnable): # ERROR: EPUB too big kindlegenErrorCode = 23026 self.signals.result.emit([kindlegenErrorCode, kindlegenError, self.work]) - except StandardError: - # ERROR: Unknown generic error + except Exception as err: + # ERROR: KCC unknown generic error kindlegenErrorCode = 1 + kindlegenError = format(err) self.signals.result.emit([kindlegenErrorCode, kindlegenError, self.work]) @@ -297,8 +298,9 @@ class KindleUnpackThread(QtCore.QRunnable): mobisplit = kindlesplit.mobi_split(mobiPath + '_toclean', newKindle) open(mobiPath, 'wb').write(mobisplit.getResult()) self.signals.result.emit([True]) - except StandardError: - self.signals.result.emit([False]) + except Exception as err: + traceback.print_exc() + self.signals.result.emit([False, format(err)]) class WorkerThread(QtCore.QThread): @@ -385,7 +387,7 @@ class WorkerThread(QtCore.QThread): for i in range(GUI.JobList.count()): # Make sure that we don't consider any system message as job to do if GUI.JobList.item(i).icon().isNull(): - currentJobs.append(unicode(GUI.JobList.item(i).text())) + currentJobs.append(str(GUI.JobList.item(i).text())) GUI.JobList.clear() for job in currentJobs: sleep(0.5) @@ -466,42 +468,45 @@ class WorkerThread(QtCore.QThread): if self.kindlegenErrorCode[0] == 0: GUI.progress.content = '' self.emit(QtCore.SIGNAL("addMessage"), 'Creating MOBI files... Done!', 'info', True) - self.emit(QtCore.SIGNAL("addMessage"), 'Cleaning MOBI files', 'info') - GUI.progress.content = 'Cleaning MOBI files' - self.workerOutput = [] - # Multithreading KindleUnpack in current form is a waste of resources. - # Unless we higly optimise KindleUnpack or drop 32bit support this will not change. - self.pool.setMaxThreadCount(1) - for item in outputPath: - worker = KindleUnpackThread([item, profile]) - worker.signals.result.connect(self.addResult) - self.pool.start(worker) - self.pool.waitForDone() - sleep(0.5) - for success in self.workerOutput: - if not success: - self.errors = True - break - if not self.errors: - for item in outputPath: - GUI.progress.content = '' - mobiPath = item.replace('.epub', '.mobi') - os.remove(mobiPath + '_toclean') - GUI.completedWork[os.path.basename(mobiPath).encode('utf-8')] = \ - mobiPath.encode('utf-8') - self.emit(QtCore.SIGNAL("addMessage"), 'Cleaning MOBI files... Done!', 'info', - True) - else: - GUI.progress.content = '' - for item in outputPath: - mobiPath = item.replace('.epub', '.mobi') - if os.path.exists(mobiPath): - os.remove(mobiPath) - if os.path.exists(mobiPath + '_toclean'): - os.remove(mobiPath + '_toclean') - self.emit(QtCore.SIGNAL("addMessage"), 'KindleUnpack failed to clean MOBI file!', 'error') - self.emit(QtCore.SIGNAL("addTrayMessage"), 'KindleUnpack failed to clean MOBI file!', - 'Critical') + self.emit(QtCore.SIGNAL("addMessage"), 'Cleaning MOBI files is currently disabled in this branch', 'info') + GUI.progress.content = 'Cleaning MOBI files is currently disabled in this branch' + #self.emit(QtCore.SIGNAL("addMessage"), 'Cleaning MOBI files', 'info') + #GUI.progress.content = 'Cleaning MOBI files' + #self.workerOutput = [] + ## Multithreading KindleUnpack in current form is a waste of resources. + ## Unless we higly optimise KindleUnpack or drop 32bit support this will not change. + #self.pool.setMaxThreadCount(1) + #for item in outputPath: + # worker = KindleUnpackThread([item, profile]) + # worker.signals.result.connect(self.addResult) + # self.pool.start(worker) + #self.pool.waitForDone() + #sleep(0.5) + #for success in self.workerOutput: + # if not success[0]: + # self.errors = True + # print(success[1]) + # break + #if not self.errors: + # for item in outputPath: + # GUI.progress.content = '' + # mobiPath = item.replace('.epub', '.mobi') + # os.remove(mobiPath + '_toclean') + # GUI.completedWork[os.path.basename(mobiPath).encode('utf-8')] = \ + # mobiPath.encode('utf-8') + # self.emit(QtCore.SIGNAL("addMessage"), 'Cleaning MOBI files... Done!', 'info', + # True) + #else: + # GUI.progress.content = '' + # for item in outputPath: + # mobiPath = item.replace('.epub', '.mobi') + # if os.path.exists(mobiPath): + # os.remove(mobiPath) + # if os.path.exists(mobiPath + '_toclean'): + # os.remove(mobiPath + '_toclean') + # self.emit(QtCore.SIGNAL("addMessage"), 'KindleUnpack failed to clean MOBI file!', 'error') + # self.emit(QtCore.SIGNAL("addTrayMessage"), 'KindleUnpack failed to clean MOBI file!', + # 'Critical') else: GUI.progress.content = '' epubSize = (os.path.getsize(self.kindlegenErrorCode[2]))/1024/1024 @@ -571,10 +576,10 @@ class KCCGUI(KCC_ui.Ui_KCC): else: dnames = "" for dname in dnames: - if unicode(dname) != "": + if str(dname) != "": if sys.platform == 'win32': dname = dname.replace('/', '\\') - self.lastPath = os.path.abspath(os.path.join(unicode(dname), os.pardir)) + self.lastPath = os.path.abspath(os.path.join(str(dname), os.pardir)) GUI.JobList.addItem(dname) MW.setFocus() @@ -597,8 +602,8 @@ class KCCGUI(KCC_ui.Ui_KCC): fnames = QtGui.QFileDialog.getOpenFileNames(MW, 'Select file', self.lastPath, '*.cbz *.zip *.pdf') for fname in fnames: - if unicode(fname) != "": - self.lastPath = os.path.abspath(os.path.join(unicode(fname), os.pardir)) + if str(fname) != "": + self.lastPath = os.path.abspath(os.path.join(str(fname), os.pardir)) GUI.JobList.addItem(fname) def clearJobs(self): @@ -884,19 +889,19 @@ class KCCGUI(KCC_ui.Ui_KCC): self.settings.setValue('currentFormat', GUI.FormatBox.currentIndex()) self.settings.setValue('currentMode', self.currentMode) self.settings.setValue('firstStart', False) - self.settings.setValue('options', QtCore.QVariant({'MangaBox': GUI.MangaBox.checkState(), - 'RotateBox': GUI.RotateBox.checkState(), - 'QualityBox': GUI.QualityBox.checkState(), - 'ProcessingBox': GUI.ProcessingBox.checkState(), - 'UpscaleBox': GUI.UpscaleBox.checkState(), - 'NoRotateBox': GUI.NoRotateBox.checkState(), - 'BorderBox': GUI.BorderBox.checkState(), - 'WebtoonBox': GUI.WebtoonBox.checkState(), - 'NoDitheringBox': GUI.NoDitheringBox.checkState(), - 'ColorBox': GUI.ColorBox.checkState(), - 'customWidth': GUI.customWidth.text(), - 'customHeight': GUI.customHeight.text(), - 'GammaSlider': float(self.GammaValue)*100})) + self.settings.setValue('options', {'MangaBox': GUI.MangaBox.checkState(), + 'RotateBox': GUI.RotateBox.checkState(), + 'QualityBox': GUI.QualityBox.checkState(), + 'ProcessingBox': GUI.ProcessingBox.checkState(), + 'UpscaleBox': GUI.UpscaleBox.checkState(), + 'NoRotateBox': GUI.NoRotateBox.checkState(), + 'BorderBox': GUI.BorderBox.checkState(), + 'WebtoonBox': GUI.WebtoonBox.checkState(), + 'NoDitheringBox': GUI.NoDitheringBox.checkState(), + 'ColorBox': GUI.ColorBox.checkState(), + 'customWidth': GUI.customWidth.text(), + 'customHeight': GUI.customHeight.text(), + 'GammaSlider': float(self.GammaValue)*100}) self.settings.sync() def handleMessage(self, message): @@ -947,8 +952,7 @@ class KCCGUI(KCC_ui.Ui_KCC): self.currentMode = self.settings.value('currentMode', 1, type=int) self.currentFormat = self.settings.value('currentFormat', 0, type=int) self.firstStart = self.settings.value('firstStart', True, type=bool) - self.options = self.settings.value('options', QtCore.QVariant({'GammaSlider': 0})) - self.options = self.options.toPyObject() + self.options = self.settings.value('options', {'GammaSlider': 0}) self.worker = WorkerThread() self.versionCheck = VersionThread() self.contentServer = WebServerThread() @@ -996,7 +1000,8 @@ class KCCGUI(KCC_ui.Ui_KCC): formats = ['MOBI', 'EPUB', 'CBZ'] versionCheck = Popen('kindlegen -locale en', stdout=PIPE, stderr=STDOUT, shell=True) for line in versionCheck.stdout: - if "Amazon kindlegen" in line: + line = line.decode("utf-8") + if 'Amazon kindlegen' in line: versionCheck = line.split('V')[1].split(' ')[0] if tuple(map(int, (versionCheck.split(".")))) < tuple(map(int, ('2.9'.split(".")))): self.addMessage('Your @@ -18,7 +18,7 @@ # TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. # -__version__ = '3.6' +__version__ = '4.0' __license__ = 'ISC' __copyright__ = '2012-2013, Ciro Mattia Gonano , Pawel Jastrzebski ' __docformat__ = 'restructuredtext en' @@ -35,14 +35,15 @@ from optparse import OptionParser, OptionGroup from multiprocessing import Pool, freeze_support from xml.dom.minidom import parse from uuid import uuid4 +from slugify import slugify try: from PyQt4 import QtCore except ImportError: QtCore = None -import comic2panel -import image -import cbxarchive -import pdfjpgextract +from . import comic2panel +from . import image +from . import cbxarchive +from . import pdfjpgextract def buildHTML(path, imgfile): @@ -172,7 +173,6 @@ def buildHTML(path, imgfile): def buildNCX(dstdir, title, chapters): options.uuid = str(uuid4()) - options.uuid = options.uuid.encode('utf-8') ncxfile = os.path.join(dstdir, 'OEBPS', 'toc.ncx') f = open(ncxfile, "w") f.writelines(["\n", @@ -186,7 +186,7 @@ def buildNCX(dstdir, title, chapters): "\n", "\n", "\n", - "", title.encode('utf-8'), "\n", + "", title, "\n", "" ]) for chapter in chapters: @@ -195,7 +195,7 @@ def buildNCX(dstdir, title, chapters): title = os.path.basename(folder) filename = getImageFileName(os.path.join(folder, chapter[1])) f.write("" - + title.encode('utf-8') + "\n") f.write("\n") f.close() @@ -216,11 +216,11 @@ def buildOPF(dstdir, title, filelist, cover=None): "xmlns=\"http://www.idpf.org/2007/opf\">\n", "\n", - "", title.encode('utf-8'), "\n", + "", title, "\n", "en-US\n", "", options.uuid, "\n"]) for author in options.authors: - f.writelines(["", author.encode('utf-8'), "\n"]) + f.writelines(["", author, "\n"]) f.writelines(["\n", "\n", "\n", @@ -356,9 +356,9 @@ def fileImgProcess(work): dirpath = work[1] opt = work[2] if opt.verbose: - print "Optimizing " + afile + " for " + opt.profile + print("Optimizing " + afile + " for " + opt.profile) else: - print ".", + print(".", end=' ') img = image.ComicPage(os.path.join(dirpath, afile), opt.profileData) if opt.quality == 2: wipe = False @@ -370,7 +370,7 @@ def fileImgProcess(work): split = img.splitPage(dirpath, opt.righttoleft, opt.rotate) if split is not None: if opt.verbose: - print "Splitted " + afile + print("Splitted " + afile) img0 = image.ComicPage(split[0], opt.profileData) applyImgOptimization(img0, opt) img0.saveToDir(dirpath, opt.forcepng, opt.forcecolor, wipe) @@ -394,7 +394,9 @@ def fileImgProcess(work): img2.rotated = True applyImgOptimization(img2, opt, 0) img2.saveToDir(dirpath, opt.forcepng, opt.forcecolor, True) - except StandardError: + except Exception: + import traceback + traceback.print_tb(sys.exc_info()[2]) return str(sys.exc_info()[1]) @@ -565,7 +567,7 @@ def getWorkFolder(afile): path = cbx.extract(workdir) except OSError: rmtree(workdir, True) - print 'UnRAR/7za not found or file failed to extract!' + print('UnRAR/7za not found or file failed to extract!') sys.exit(21) else: rmtree(workdir, True) @@ -592,7 +594,7 @@ def checkComicInfo(path, originalPath): if os.path.exists(xmlPath): try: xml = parse(xmlPath) - except StandardError: + except Exception: os.remove(xmlPath) return options.authors = [] @@ -628,18 +630,14 @@ def checkComicInfo(path, originalPath): os.remove(xmlPath) -def slugify(value): - # Normalizes string, converts to lowercase, removes non-alpha characters and converts spaces to hyphens. - if isinstance(value, str): - #noinspection PyArgumentList - value = unicodedata.normalize('NFKD', unicode(value, 'latin1')).encode('ascii', 'ignore') - elif isinstance(value, unicode): - value = unicodedata.normalize('NFKD', value).encode('ascii', 'ignore') - value = re.sub('[^\w\s\.-]', '', value).strip().lower() - value = re.sub('[-\.\s]+', '-', value) - value = re.sub(r'([0-9]+)', r'00000\1', value) - value = re.sub(r'0*([0-9]{6,})', r'\1', value) - return value +#def slugify(value): +# # Normalizes string, converts to lowercase, removes non-alpha characters and converts spaces to hyphens. +# value = unicodedata.normalize('NFKD', value).encode('ascii', 'ignore') +# value = re.sub('[^\w\s\.-]', '', value).strip().lower() +# value = re.sub('[-\.\s]+', '-', value) +# value = re.sub(r'([0-9]+)', r'00000\1', value) +# value = re.sub(r'0*([0-9]{6,})', r'\1', value) +# return value def sanitizeTree(filetree): @@ -775,7 +773,7 @@ def preSplitDirectory(path): mode = 0 else: if filesNumber > 0: - print '\nWARNING: Automatic output splitting failed.' + print('\nWARNING: Automatic output splitting failed.') if GUI: GUI.emit(QtCore.SIGNAL("addMessage"), 'Automatic output splitting failed. 1: filepath.append(getOutputFilename(args[0], options.output, '.cbz', ' ' + str(tomeNumber))) else: filepath.append(getOutputFilename(args[0], options.output, '.cbz', '')) make_archive(tome + '_comic', 'zip', tome + '/OEBPS/Images') else: - print "\nCreating EPUB structure..." + print("\nCreating EPUB structure...") genEpubStruct(tome) # actually zip the ePub if len(tomes) > 1: @@ -1017,7 +1015,7 @@ def checkOptions(): options.quality = 0 # Kindle for Android profile require target resolution. if options.profile == 'KFA' and (options.customwidth == 0 or options.customheight == 0): - print "ERROR: Kindle for Android profile require --customwidth and --customheight options!" + print("ERROR: Kindle for Android profile require --customwidth and --customheight options!") sys.exit(1) # Override profile data if options.customwidth != 0 or options.customheight != 0: diff --git a/kcc/comic2panel.py b/kcc/comic2panel.py index d194acd..787eec8 100644 --- a/kcc/comic2panel.py +++ b/kcc/comic2panel.py @@ -18,7 +18,7 @@ # TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. # -__version__ = '3.6' +__version__ = '4.0' __license__ = 'ISC' __copyright__ = '2012-2013, Ciro Mattia Gonano , Pawel Jastrzebski ' __docformat__ = 'restructuredtext en' @@ -32,26 +32,26 @@ try: #noinspection PyUnresolvedReferences from PIL import Image, ImageStat if tuple(map(int, ('2.2.1'.split(".")))) > tuple(map(int, (Image.PILLOW_VERSION.split(".")))): - print "ERROR: Pillow 2.2.1 or newer is required!" + print("ERROR: Pillow 2.2.1 or newer is required!") if sys.platform.startswith('linux'): #noinspection PyUnresolvedReferences - import Tkinter + import tkinter #noinspection PyUnresolvedReferences - import tkMessageBox - importRoot = Tkinter.Tk() + import tkinter.messagebox + importRoot = tkinter.Tk() importRoot.withdraw() - tkMessageBox.showerror("KCC - Error", "Pillow 2.2.1 or newer is required!") + tkinter.messagebox.showerror("KCC - Error", "Pillow 2.2.1 or newer is required!") exit(1) except ImportError: - print "ERROR: Pillow is not installed!" + print("ERROR: Pillow is not installed!") if sys.platform.startswith('linux'): #noinspection PyUnresolvedReferences - import Tkinter + import tkinter #noinspection PyUnresolvedReferences - import tkMessageBox - importRoot = Tkinter.Tk() + import tkinter.messagebox + importRoot = tkinter.Tk() importRoot.withdraw() - tkMessageBox.showerror("KCC - Error", "Pillow 2.2.1 or newer is required!") + tkinter.messagebox.showerror("KCC - Error", "Pillow 2.2.1 or newer is required!") exit(1) try: from PyQt4 import QtCore @@ -118,7 +118,7 @@ def splitImage(work): # Harcoded opttions threshold = 1.0 delta = 15 - print ".", + print(".", end=' ') fileExpanded = os.path.splitext(name) filePath = os.path.join(path, name) # Detect corrupted files @@ -210,13 +210,13 @@ def splitImage(work): str(pageNumber) + '.png'), 'PNG') pageNumber += 1 os.remove(filePath) - except StandardError: + except Exception: return str(sys.exc_info()[1]) def Copyright(): - print ('comic2panel v%(__version__)s. ' - 'Written 2013 by Ciro Mattia Gonano and Pawel Jastrzebski.' % globals()) + print(('comic2panel v%(__version__)s. ' + 'Written 2013 by Ciro Mattia Gonano and Pawel Jastrzebski.' % globals())) def main(argv=None, qtGUI=None): @@ -245,7 +245,7 @@ def main(argv=None, qtGUI=None): if options.height > 0: options.sourceDir = args[0] options.targetDir = args[0] + "-Splitted" - print "\nSplitting images..." + print("\nSplitting images...") if os.path.isdir(options.sourceDir): rmtree(options.targetDir, True) copytree(options.sourceDir, options.targetDir) diff --git a/kcc/image.py b/kcc/image.py index 3c80d74..1174eb2 100755 --- a/kcc/image.py +++ b/kcc/image.py @@ -26,26 +26,26 @@ try: # noinspection PyUnresolvedReferences from PIL import Image, ImageOps, ImageStat, ImageChops if tuple(map(int, ('2.2.1'.split(".")))) > tuple(map(int, (Image.PILLOW_VERSION.split(".")))): - print "ERROR: Pillow 2.2.1 or newer is required!" + print("ERROR: Pillow 2.2.1 or newer is required!") if platform.startswith('linux'): #noinspection PyUnresolvedReferences - import Tkinter + import tkinter #noinspection PyUnresolvedReferences - import tkMessageBox - importRoot = Tkinter.Tk() + import tkinter.messagebox + importRoot = tkinter.Tk() importRoot.withdraw() - tkMessageBox.showerror("KCC - Error", "Pillow 2.2.1 or newer is required!") + tkinter.messagebox.showerror("KCC - Error", "Pillow 2.2.1 or newer is required!") exit(1) except ImportError: - print "ERROR: Pillow is not installed!" + print("ERROR: Pillow is not installed!") if platform.startswith('linux'): #noinspection PyUnresolvedReferences - import Tkinter + import tkinter #noinspection PyUnresolvedReferences - import tkMessageBox - importRoot = Tkinter.Tk() + import tkinter.messagebox + importRoot = tkinter.Tk() importRoot.withdraw() - tkMessageBox.showerror("KCC - Error", "Pillow 2.2.1 or newer is required!") + tkinter.messagebox.showerror("KCC - Error", "Pillow 2.2.1 or newer is required!") exit(1) @@ -287,10 +287,10 @@ class ComicPage: ratioDev = float(self.size[0]) / float(self.size[1]) if (float(self.image.size[0]) / float(self.image.size[1])) < ratioDev: diff = int(self.image.size[1] * ratioDev) - self.image.size[0] - self.image = ImageOps.expand(self.image, border=(diff / 2, 0), fill=fill) + self.image = ImageOps.expand(self.image, border=(int(diff / 2), 0), fill=fill) elif (float(self.image.size[0]) / float(self.image.size[1])) > ratioDev: diff = int(self.image.size[0] / ratioDev) - self.image.size[1] - self.image = ImageOps.expand(self.image, border=(0, diff / 2), fill=fill) + self.image = ImageOps.expand(self.image, border=(0, int(diff / 2)), fill=fill) self.image = ImageOps.fit(self.image, size, method=method, centering=(0.5, 0.5)) if generateBorder: if fill == 'white': diff --git a/kcc/kindlesplit.py b/kcc/kindlesplit.py index c8ae74d..c74ff95 100644 --- a/kcc/kindlesplit.py +++ b/kcc/kindlesplit.py @@ -1,3 +1,6 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +# # Based on initial version of KindleUnpack. Copyright (C) 2009 Charles M. Hannum # Improvements Copyright (C) 2009-2012 P. Durrant, K. Hendricks, S. Siebert, fandrieu, DiapDealer, nickredding # Copyright (C) 2013 Pawel Jastrzebski @@ -105,8 +108,8 @@ def nullsection(datain, secno): # make it zero-length without deleting it datalst.append('\0' * lpad) datalst.append(datain[zerosecstart: secstart]) datalst.append(datain[secend:]) - dataout = "".join(datalst) - return dataout + dataout = "".join(str(datalst)[1:-1]) + return dataout.encode('utf-8') def deletesectionrange(datain, firstsec, lastsec): # delete a range of sections @@ -135,8 +138,8 @@ def deletesectionrange(datain, firstsec, lastsec): # delete a range of sections datalst.append('\0' * lpad) datalst.append(datain[zerosecstart:firstsecstart]) datalst.append(datain[lastsecend:]) - dataout = "".join(datalst) - return dataout + dataout = "".join(str(datalst)[1:-1]) + return dataout.encode('utf-8') def insertsection(datain, secno, secdata): # insert a new section @@ -166,13 +169,14 @@ def insertsection(datain, secno, secdata): # insert a new section datalst.append(datain[zerosecstart:secstart]) datalst.append(secdata) datalst.append(datain[secstart:]) - dataout = "".join(datalst) - return dataout + dataout = "".join(str(datalst)[1:-1]) + return dataout.encode('utf-8') def insertsectionrange(sectionsource, firstsec, lastsec, sectiontarget, targetsec): # insert a range of sections dataout = sectiontarget for idx in range(lastsec, firstsec-1, -1): + print(dataout) dataout = insertsection(dataout, targetsec, readsection(sectionsource, idx)) return dataout @@ -381,4 +385,10 @@ class mobi_split: raise def getResult(self): - return self.result_file \ No newline at end of file + return self.result_file + + +if __name__ == "__main__": + import sys + mobi_split(sys.argv[1], False) + sys.exit(0) diff --git a/kcc/pdfjpgextract.py b/kcc/pdfjpgextract.py index d9dad09..76f8a0e 100644 --- a/kcc/pdfjpgextract.py +++ b/kcc/pdfjpgextract.py @@ -63,7 +63,7 @@ class PdfJpgExtract: istart += startfix iend += endfix - print "JPG %d from %d to %d" % (njpg, istart, iend) + print("JPG %d from %d to %d" % (njpg, istart, iend)) jpg = pdf[istart:iend] jpgfile = file(self.path + "/jpg%d.jpg" % njpg, "wb") jpgfile.write(jpg) diff --git a/kcc/rarfile.py b/kcc/rarfile.py index d7340ae..fe7db2a 100644 --- a/kcc/rarfile.py +++ b/kcc/rarfile.py @@ -633,7 +633,7 @@ class RarFile(object): def printdir(self): """Print archive file list to stdout.""" for f in self._info_list: - print(f.filename) + print((f.filename)) def extract(self, member, path=None, pwd=None): """Extract single file into current directory. @@ -1138,7 +1138,7 @@ class RarFile(object): if self._crc_check: crc = crc32(cmt) if crc < 0: - crc += (long(1) << 32) + crc += (int(1) << 32) if crc != inf.CRC: return None @@ -1342,7 +1342,7 @@ class RarExtFile(RawIOBase): raise BadRarFile("Failed the read enough data") crc = self.CRC if crc < 0: - crc += (long(1) << 32) + crc += (int(1) << 32) if crc != self.inf.CRC: raise BadRarFile("Corrupt file - CRC check failed: " + self.inf.filename) diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..264dcd4 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,4 @@ +Pillow==2.2.1 +Unidecode==0.04.14 +psutil==1.1.3 +python-slugify==0.0.6 diff --git a/setup.py b/setup.py index ace85f9..149cb48 100644 --- a/setup.py +++ b/setup.py @@ -11,7 +11,7 @@ Usage (Windows): from sys import platform NAME = "KindleComicConverter" -VERSION = "3.6" +VERSION = "4.0" MAIN = "kcc.py" if platform == "darwin": @@ -72,7 +72,7 @@ elif platform == "win32": appendScriptToLibrary=False, compress=True)]) else: - print 'Please use setup.sh to build Linux package.' + print('Please use setup.sh to build Linux package.') exit() #noinspection PyUnboundLocalVariable @@ -91,5 +91,5 @@ setup( if platform == "darwin": from os import chmod - chmod('dist/' + NAME + '.app/Contents/Resources/unrar', 0777) - chmod('dist/' + NAME + '.app/Contents/Resources/7za', 0777) \ No newline at end of file + chmod('dist/' + NAME + '.app/Contents/Resources/unrar', 0o777) + chmod('dist/' + NAME + '.app/Contents/Resources/7za', 0o777) \ No newline at end of file diff --git a/setup.sh b/setup.sh index a36d7f0..f4382d1 100644 --- a/setup.sh +++ b/setup.sh @@ -1,7 +1,7 @@ #!/bin/bash # Linux Python package build script -VERSION="3.6" +VERSION="4.0" cp kcc.py __main__.py zip kcc.zip __main__.py kcc/*.py From 116dce09fd20893b9440acdb5dec114dec720f92 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Jastrz=C4=99bski?= Date: Wed, 15 Jan 2014 10:00:05 +0100 Subject: [PATCH 02/50] Updated rarfile --- kcc/rarfile.py | 145 +++++++++++++++++++++++++++++++++++-------------- 1 file changed, 103 insertions(+), 42 deletions(-) diff --git a/kcc/rarfile.py b/kcc/rarfile.py index fe7db2a..63fdcf7 100644 --- a/kcc/rarfile.py +++ b/kcc/rarfile.py @@ -108,6 +108,8 @@ if sys.hexversion < 0x3000000: # py2.6 has broken bytes() def bytes(s, enc): return str(s) +else: + unicode = str # see if compat bytearray() is needed try: @@ -188,10 +190,6 @@ NEED_COMMENTS = 1 #: whether to convert comments to unicode strings UNICODE_COMMENTS = 0 -#: When RAR is corrupt, stopping on bad header is better -#: On unknown/misparsed RAR headers reporting is better -REPORT_BAD_HEADER = 0 - #: Convert RAR time tuple into datetime() object USE_DATETIME = 0 @@ -340,9 +338,11 @@ class RarSignalExit(RarExecError): """Unrar exited with signal""" -def is_rarfile(fn): +def is_rarfile(xfile): '''Check quickly whether file is rar archive.''' - buf = open(fn, "rb").read(len(RAR_ID)) + fd = XFile(xfile) + buf = fd.read(len(RAR_ID)) + fd.close() return buf == RAR_ID @@ -453,11 +453,12 @@ class RarFile(object): '''Parse RAR structure, provide access to files in archive. ''' - #: Archive comment. Byte string or None. Use UNICODE_COMMENTS + #: Archive comment. Byte string or None. Use :data:`UNICODE_COMMENTS` #: to get automatic decoding to unicode. comment = None - def __init__(self, rarfile, mode="r", charset=None, info_callback=None, crc_check = True): + def __init__(self, rarfile, mode="r", charset=None, info_callback=None, + crc_check = True, errors = "stop"): """Open and parse a RAR archive. Parameters: @@ -472,6 +473,9 @@ class RarFile(object): debug callback, gets to see all archive entries. crc_check set to False to disable CRC checks + errors + Either "stop" to quietly stop parsing on errors, + or "strict" to raise errors. Default is "stop". """ self.rarfile = rarfile self.comment = None @@ -485,6 +489,13 @@ class RarFile(object): self._crc_check = crc_check self._vol_list = [] + if errors == "stop": + self._strict = False + elif errors == "strict": + self._strict = True + else: + raise ValueError("Invalid value for 'errors' parameter.") + self._main = None if mode != "r": @@ -548,8 +559,9 @@ class RarFile(object): '''Returns file-like object (:class:`RarExtFile`), from where the data can be read. - The object implements io.RawIOBase interface, so it can - be further wrapped with io.BufferedReader and io.TextIOWrapper. + The object implements :class:`io.RawIOBase` interface, so it can + be further wrapped with :class:`io.BufferedReader` + and :class:`io.TextIOWrapper`. On older Python where io module is not available, it implements only .read(), .seek(), .tell() and .close() methods. @@ -588,16 +600,19 @@ class RarFile(object): psw = None # is temp write usable? - if not USE_EXTRACT_HACK or not self._main: + use_hack = 1 + if not self._main: use_hack = 0 elif self._main.flags & (RAR_MAIN_SOLID | RAR_MAIN_PASSWORD): use_hack = 0 elif inf.flags & (RAR_FILE_SPLIT_BEFORE | RAR_FILE_SPLIT_AFTER): use_hack = 0 + elif is_filelike(self.rarfile): + pass elif inf.file_size > HACK_SIZE_LIMIT: use_hack = 0 - else: - use_hack = 1 + elif not USE_EXTRACT_HACK: + use_hack = 0 # now extract if inf.compress_type == RAR_M0 and (inf.flags & RAR_FILE_PASSWORD) == 0: @@ -610,7 +625,7 @@ class RarFile(object): def read(self, fname, psw = None): """Return uncompressed data for archive entry. - For longer files using .open() may be better idea. + For longer files using :meth:`RarFile.open` may be better idea. Parameters: @@ -633,7 +648,7 @@ class RarFile(object): def printdir(self): """Print archive file list to stdout.""" for f in self._info_list: - print((f.filename)) + print(f.filename) def extract(self, member, path=None, pwd=None): """Extract single file into current directory. @@ -641,7 +656,7 @@ class RarFile(object): Parameters: member - filename or RarInfo instance + filename or :class:`RarInfo` instance path optional destination path pwd @@ -661,7 +676,7 @@ class RarFile(object): path optional destination path members - optional filename or RarInfo instance list to extract + optional filename or :class:`RarInfo` instance list to extract pwd optional password to use """ @@ -687,10 +702,23 @@ class RarFile(object): output = p.communicate()[0] check_returncode(p, output) + def strerror(self): + """Return error string if parsing failed, + or None if no problems. + """ + return self._parse_error + ## ## private methods ## + def _set_error(self, msg, *args): + if args: + msg = msg % args + self._parse_error = msg + if self._strict: + raise BadRarFile(msg) + # store entry def _process_entry(self, item): if item.type == RAR_BLOCK_FILE: @@ -738,7 +766,7 @@ class RarFile(object): self._fd = None def _parse_real(self): - fd = open(self.rarfile, "rb") + fd = XFile(self.rarfile) self._fd = fd id = fd.read(len(RAR_ID)) if id != RAR_ID: @@ -757,9 +785,13 @@ class RarFile(object): if not h: if more_vols: volume += 1 - volfile = self._next_volname(volfile) fd.close() - fd = open(volfile, "rb") + try: + volfile = self._next_volname(volfile) + fd = XFile(volfile) + except IOError: + self._set_error("Cannot open next volume: %s", volfile) + break self._fd = fd more_vols = 0 endarc = 0 @@ -824,8 +856,7 @@ class RarFile(object): # now read actual header return self._parse_block_header(fd) except struct.error: - if REPORT_BAD_HEADER: - raise BadRarFile('Broken header in RAR file') + self._set_error('Broken header in RAR file') return None # common header @@ -852,8 +883,7 @@ class RarFile(object): # unexpected EOF? if len(h.header_data) != h.header_size: - if REPORT_BAD_HEADER: - raise BadRarFile('Unexpected EOF when reading header') + self._set_error('Unexpected EOF when reading header') return None # block has data assiciated with it? @@ -896,18 +926,9 @@ class RarFile(object): if h.header_crc == calc_crc: return h - # need to panic? - if REPORT_BAD_HEADER: - xlen = len(crcdat) - crcdat = h.header_data[2:] - msg = 'Header CRC error (%02x): exp=%x got=%x (xlen = %d)' % ( h.type, h.header_crc, calc_crc, xlen ) - xlen = len(crcdat) - while xlen >= S_BLK_HDR.size - 2: - crc = crc32(crcdat[:xlen]) & 0xFFFF - if crc == h.header_crc: - msg += ' / crc match, xlen = %d' % xlen - xlen -= 1 - raise BadRarFile(msg) + # header parsing failed. + self._set_error('Header CRC error (%02x): exp=%x got=%x (xlen = %d)', + h.type, h.header_crc, calc_crc, len(crcdat)) # instead panicing, send eof return None @@ -1053,6 +1074,8 @@ class RarFile(object): # given current vol name, construct next one def _next_volname(self, volfile): + if is_filelike(volfile): + raise IOError("Working on single FD") if self._main.flags & RAR_MAIN_NEWNUMBERING: return self._next_newvol(volfile) return self._next_oldvol(volfile) @@ -1093,7 +1116,7 @@ class RarFile(object): BSIZE = 32*1024 size = inf.compress_size + inf.header_size - rf = open(inf.volume_file, "rb", 0) + rf = XFile(inf.volume_file, 0) rf.seek(inf.header_offset) tmpfd, tmpname = mkstemp(suffix='.rar') @@ -1125,7 +1148,7 @@ class RarFile(object): def _read_comment_v3(self, inf, psw=None): # read data - rf = open(inf.volume_file, "rb") + rf = XFile(inf.volume_file) rf.seek(inf.file_offset) data = rf.read(inf.compress_size) rf.close() @@ -1138,7 +1161,7 @@ class RarFile(object): if self._crc_check: crc = crc32(cmt) if crc < 0: - crc += (int(1) << 32) + crc += (long(1) << 32) if crc != inf.CRC: return None @@ -1146,6 +1169,8 @@ class RarFile(object): # extract using unrar def _open_unrar(self, rarfile, inf, psw = None, tmpfile = None): + if is_filelike(rarfile): + raise ValueError("Cannot use unrar directly on memory buffer") cmd = [UNRAR_TOOL] + list(OPEN_ARGS) if psw is not None: cmd.append("-p" + psw) @@ -1342,7 +1367,7 @@ class RarExtFile(RawIOBase): raise BadRarFile("Failed the read enough data") crc = self.CRC if crc < 0: - crc += (int(1) << 32) + crc += (long(1) << 32) if crc != self.inf.CRC: raise BadRarFile("Corrupt file - CRC check failed: " + self.inf.filename) @@ -1553,7 +1578,7 @@ class DirectReader(RarExtFile): RarExtFile._open(self) self.volfile = self.inf.volume_file - self.fd = open(self.volfile, "rb", 0) + self.fd = XFile(self.volfile, 0) self.fd.seek(self.inf.header_offset, 0) self.cur = self.rf._parse_header(self.fd) self.cur_avail = self.cur.add_size @@ -1705,10 +1730,47 @@ class HeaderDecrypt: return res +# handle (filename|filelike) object +class XFile(object): + __slots__ = ('_fd', '_need_close') + def __init__(self, xfile, bufsize = 1024): + if is_filelike(xfile): + self._need_close = False + self._fd = xfile + self._fd.seek(0) + else: + self._need_close = True + self._fd = open(xfile, 'rb', bufsize) + def read(self, n=None): + return self._fd.read(n) + def tell(self): + return self._fd.tell() + def seek(self, ofs, whence=0): + return self._fd.seek(ofs, whence) + def readinto(self, dst): + return self._fd.readinto(dst) + def close(self): + if self._need_close: + self._fd.close() + def __enter__(self): + return self + def __exit__(self, typ, val, tb): + self.close() + ## ## Utility functions ## +def is_filelike(obj): + if isinstance(obj, str) or isinstance(obj, unicode): + return False + res = True + for a in ('read', 'tell', 'seek'): + res = res and hasattr(obj, a) + if not res: + raise ValueError("Invalid object passed as file") + return True + def rar3_s2k(psw, salt): """String-to-key hash for RAR3.""" @@ -1874,4 +1936,3 @@ def check_returncode(p, out): msg = "%s [%d]" % (exc.__doc__, p.returncode) raise exc(msg) - From 878e92b5278085c3b09939cdc0dd8ff162147a63 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Jastrz=C4=99bski?= Date: Wed, 15 Jan 2014 10:22:54 +0100 Subject: [PATCH 03/50] Added proper startup scripts Hacks that allow standalone startup of script inside module are messy. --- kcc-c2e.py | 33 +++++++++++++++++++++++++++++++++ kcc-c2p.py | 33 +++++++++++++++++++++++++++++++++ kcc.py | 2 +- kcc/__main__.py | 2 -- kcc/comic2ebook.py | 10 +--------- kcc/comic2panel.py | 10 +--------- kcc/kindlesplit.py | 7 ------- 7 files changed, 69 insertions(+), 28 deletions(-) create mode 100644 kcc-c2e.py create mode 100644 kcc-c2p.py delete mode 100644 kcc/__main__.py diff --git a/kcc-c2e.py b/kcc-c2e.py new file mode 100644 index 0000000..744555b --- /dev/null +++ b/kcc-c2e.py @@ -0,0 +1,33 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +# +# Copyright (c) 2012-2013 Ciro Mattia Gonano +# Copyright (c) 2013 Pawel Jastrzebski +# +# Permission to use, copy, modify, and/or distribute this software for +# any purpose with or without fee is hereby granted, provided that the +# above copyright notice and this permission notice appear in all +# copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL +# WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED +# WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE +# AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL +# DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA +# OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. + +__version__ = '4.0' +__license__ = 'ISC' +__copyright__ = '2012-2013, Ciro Mattia Gonano , Pawel Jastrzebski ' +__docformat__ = 'restructuredtext en' + +import sys +from multiprocessing import freeze_support +from kcc.comic2ebook import main, Copyright + +freeze_support() +Copyright() +main(sys.argv[1:]) +sys.exit(0) \ No newline at end of file diff --git a/kcc-c2p.py b/kcc-c2p.py new file mode 100644 index 0000000..87bcd1c --- /dev/null +++ b/kcc-c2p.py @@ -0,0 +1,33 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +# +# Copyright (c) 2012-2013 Ciro Mattia Gonano +# Copyright (c) 2013 Pawel Jastrzebski +# +# Permission to use, copy, modify, and/or distribute this software for +# any purpose with or without fee is hereby granted, provided that the +# above copyright notice and this permission notice appear in all +# copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL +# WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED +# WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE +# AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL +# DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA +# OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. + +__version__ = '4.0' +__license__ = 'ISC' +__copyright__ = '2012-2013, Ciro Mattia Gonano , Pawel Jastrzebski ' +__docformat__ = 'restructuredtext en' + +import sys +from multiprocessing import freeze_support +from kcc.comic2panel import main, Copyright + +freeze_support() +Copyright() +main(sys.argv[1:]) +sys.exit(0) \ No newline at end of file diff --git a/kcc.py b/kcc.py index f7bd864..4ebd829 100644 --- a/kcc.py +++ b/kcc.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python2 +#!/usr/bin/env python3 # -*- coding: utf-8 -*- # # Copyright (c) 2012-2013 Ciro Mattia Gonano diff --git a/kcc/__main__.py b/kcc/__main__.py deleted file mode 100644 index 03034f1..0000000 --- a/kcc/__main__.py +++ /dev/null @@ -1,2 +0,0 @@ -from kcc.comic2ebook import main -main() \ No newline at end of file diff --git a/kcc/comic2ebook.py b/kcc/comic2ebook.py index 38bc07c..a0d8d15 100755 --- a/kcc/comic2ebook.py +++ b/kcc/comic2ebook.py @@ -1,4 +1,3 @@ -#!/usr/bin/env python2 # -*- coding: utf-8 -*- # # Copyright (c) 2012-2013 Ciro Mattia Gonano @@ -1110,11 +1109,4 @@ def checkOptions(): (int(X*1.5), int(Y*1.5))) image.ProfileData.Profiles["Custom"] = newProfile options.profile = "Custom" - options.profileData = image.ProfileData.Profiles[options.profile] - - -if __name__ == "__main__": - freeze_support() - Copyright() - main(sys.argv[1:]) - sys.exit(0) + options.profileData = image.ProfileData.Profiles[options.profile] \ No newline at end of file diff --git a/kcc/comic2panel.py b/kcc/comic2panel.py index 592db77..2716a3b 100644 --- a/kcc/comic2panel.py +++ b/kcc/comic2panel.py @@ -1,4 +1,3 @@ -#!/usr/bin/env python2 # -*- coding: utf-8 -*- # # Copyright (c) 2012-2013 Ciro Mattia Gonano @@ -343,11 +342,4 @@ def main(argv=None, qtGUI=None): else: raise UserWarning("Provided path is not a directory.") else: - raise UserWarning("Target height is not set.") - - -if __name__ == "__main__": - freeze_support() - Copyright() - main(sys.argv[1:]) - sys.exit(0) \ No newline at end of file + raise UserWarning("Target height is not set.") \ No newline at end of file diff --git a/kcc/kindlesplit.py b/kcc/kindlesplit.py index e6b7841..fac6253 100644 --- a/kcc/kindlesplit.py +++ b/kcc/kindlesplit.py @@ -1,4 +1,3 @@ -#!/usr/bin/env python3 # -*- coding: utf-8 -*- # # Based on initial version of KindleUnpack. Copyright (C) 2009 Charles M. Hannum @@ -382,9 +381,3 @@ class mobi_split: def getResult(self): return self.result_file - - -if __name__ == "__main__": - import sys - mobi_split(sys.argv[1], False) - sys.exit(0) From 19b438844d46243ac3a5f489b71a28d55cb2b30b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Jastrz=C4=99bski?= Date: Wed, 15 Jan 2014 10:24:31 +0100 Subject: [PATCH 04/50] Bucket of various tweaks --- kcc.py | 6 +++--- kcc/KCC_gui.py | 2 +- kcc/comic2ebook.py | 26 +++++++++++++------------- kcc/comic2panel.py | 4 ++-- setup.py | 2 +- setup.sh | 2 +- 6 files changed, 21 insertions(+), 21 deletions(-) diff --git a/kcc.py b/kcc.py index 4ebd829..397dc0b 100644 --- a/kcc.py +++ b/kcc.py @@ -27,15 +27,15 @@ import sys import os try: # noinspection PyUnresolvedReferences - from PyQt4 import QtCore, QtGui, QtNetwork + from PyQt5 import QtCore, QtGui, QtNetwork except ImportError: - print("ERROR: PyQT4 is not installed!") + print("ERROR: PyQT5 is not installed!") if sys.platform.startswith('linux'): import tkinter import tkinter.messagebox importRoot = tkinter.Tk() importRoot.withdraw() - tkinter.messagebox.showerror("KCC - Error", "PyQT4 is not installed!") + tkinter.messagebox.showerror("KCC - Error", "PyQT5 is not installed!") exit(1) from kcc import KCC_gui from multiprocessing import freeze_support diff --git a/kcc/KCC_gui.py b/kcc/KCC_gui.py index 7c4b303..e6731dc 100644 --- a/kcc/KCC_gui.py +++ b/kcc/KCC_gui.py @@ -34,7 +34,7 @@ from shutil import move from http.server import BaseHTTPRequestHandler, HTTPServer from socketserver import ThreadingMixIn from subprocess import STDOUT, PIPE -from PyQt4 import QtGui, QtCore +from PyQt5 import QtGui, QtCore from xml.dom.minidom import parse from html.parser import HTMLParser from .KCC_rc_web import WebContent diff --git a/kcc/comic2ebook.py b/kcc/comic2ebook.py index a0d8d15..6e6f91f 100755 --- a/kcc/comic2ebook.py +++ b/kcc/comic2ebook.py @@ -27,12 +27,11 @@ import sys import re import stat import string -import unicodedata import zipfile from tempfile import mkdtemp from shutil import move, copyfile, copytree, rmtree from optparse import OptionParser, OptionGroup -from multiprocessing import Pool, freeze_support +from multiprocessing import Pool from xml.dom.minidom import parse from uuid import uuid4 from slugify import slugify @@ -40,25 +39,25 @@ try: # noinspection PyUnresolvedReferences from PIL import Image if tuple(map(int, ('2.3.0'.split(".")))) > tuple(map(int, (Image.PILLOW_VERSION.split(".")))): - print "ERROR: Pillow 2.3.0 or newer is required!" + print("ERROR: Pillow 2.3.0 or newer is required!") if sys.platform.startswith('linux'): - import Tkinter - import tkMessageBox - importRoot = Tkinter.Tk() + import tkinter + import tkinter.messagebox + importRoot = tkinter.Tk() importRoot.withdraw() - tkMessageBox.showerror("KCC - Error", "Pillow 2.3.0 or newer is required!") + tkinter.messagebox.showerror("KCC - Error", "Pillow 2.3.0 or newer is required!") exit(1) except ImportError: - print "ERROR: Pillow is not installed!" + print("ERROR: Pillow is not installed!") if sys.platform.startswith('linux'): - import Tkinter - import tkMessageBox - importRoot = Tkinter.Tk() + import tkinter + import tkinter.messagebox + importRoot = tkinter.Tk() importRoot.withdraw() - tkMessageBox.showerror("KCC - Error", "Pillow 2.3.0 or newer is required!") + tkinter.messagebox.showerror("KCC - Error", "Pillow 2.3.0 or newer is required!") exit(1) try: - from PyQt4 import QtCore + from PyQt5 import QtCore except ImportError: QtCore = None from . import comic2panel @@ -672,6 +671,7 @@ def checkComicInfo(path, originalPath): os.remove(xmlPath) +# TODO: Check if replacement work correctly #def slugify(value): # # Normalizes string, converts to lowercase, removes non-alpha characters and converts spaces to hyphens. # value = unicodedata.normalize('NFKD', value).encode('ascii', 'ignore') diff --git a/kcc/comic2panel.py b/kcc/comic2panel.py index 2716a3b..34d9763 100644 --- a/kcc/comic2panel.py +++ b/kcc/comic2panel.py @@ -26,7 +26,7 @@ import os import sys from shutil import rmtree, copytree, move from optparse import OptionParser, OptionGroup -from multiprocessing import Pool, freeze_support +from multiprocessing import Pool try: # noinspection PyUnresolvedReferences from PIL import Image, ImageStat @@ -49,7 +49,7 @@ except ImportError: tkinter.messagebox.showerror("KCC - Error", "Pillow 2.3.0 or newer is required!") exit(1) try: - from PyQt4 import QtCore + from PyQt5 import QtCore except ImportError: QtCore = None diff --git a/setup.py b/setup.py index 1243ab2..dbea2f2 100644 --- a/setup.py +++ b/setup.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python2 +#!/usr/bin/env python3 """ cx_Freeze build script for KCC. diff --git a/setup.sh b/setup.sh index f4382d1..fe68a57 100644 --- a/setup.sh +++ b/setup.sh @@ -5,7 +5,7 @@ VERSION="4.0" cp kcc.py __main__.py zip kcc.zip __main__.py kcc/*.py -echo "#!/usr/bin/env python2" > kcc-bin +echo "#!/usr/bin/env python3" > kcc-bin cat kcc.zip >> kcc-bin chmod +x kcc-bin tar --xform s:^.*/:: --xform s/kcc-bin/kcc/ --xform s/comic2ebook/kcc/ -czf KindleComicConverter_linux_$VERSION.tar.gz kcc-bin LICENSE.txt icons/comic2ebook.png From cccbd36463fbd3395e200eed0a20e7d7782e549d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Jastrz=C4=99bski?= Date: Wed, 15 Jan 2014 11:32:29 +0100 Subject: [PATCH 05/50] And one more bucket... --- kcc-c2e.py | 9 +++++---- kcc-c2p.py | 9 +++++---- kcc.py | 35 ++++++++++++++++++----------------- kcc/cbxarchive.py | 8 ++++---- kcc/comic2ebook.py | 26 ++++++++++++-------------- kcc/comic2panel.py | 13 ++++++------- kcc/image.py | 15 ++++++++------- kcc/pdfjpgextract.py | 5 +++-- 8 files changed, 61 insertions(+), 59 deletions(-) diff --git a/kcc-c2e.py b/kcc-c2e.py index 744555b..cfd6766 100644 --- a/kcc-c2e.py +++ b/kcc-c2e.py @@ -27,7 +27,8 @@ import sys from multiprocessing import freeze_support from kcc.comic2ebook import main, Copyright -freeze_support() -Copyright() -main(sys.argv[1:]) -sys.exit(0) \ No newline at end of file +if __name__ == "__main__": + freeze_support() + Copyright() + main(sys.argv[1:]) + sys.exit(0) \ No newline at end of file diff --git a/kcc-c2p.py b/kcc-c2p.py index 87bcd1c..d112569 100644 --- a/kcc-c2p.py +++ b/kcc-c2p.py @@ -27,7 +27,8 @@ import sys from multiprocessing import freeze_support from kcc.comic2panel import main, Copyright -freeze_support() -Copyright() -main(sys.argv[1:]) -sys.exit(0) \ No newline at end of file +if __name__ == "__main__": + freeze_support() + Copyright() + main(sys.argv[1:]) + sys.exit(0) \ No newline at end of file diff --git a/kcc.py b/kcc.py index 397dc0b..c445924 100644 --- a/kcc.py +++ b/kcc.py @@ -94,21 +94,22 @@ class QApplicationMessaging(QtGui.QApplication): return True return False -freeze_support() -KCCAplication = QApplicationMessaging(sys.argv) -if KCCAplication.isRunning(): +if __name__ == "__main__": + freeze_support() + KCCAplication = QApplicationMessaging(sys.argv) + if KCCAplication.isRunning(): + if len(sys.argv) > 1: + KCCAplication.sendMessage(sys.argv[1].decode(sys.getfilesystemencoding())) + sys.exit(0) + else: + messageBox = QtGui.QMessageBox() + icon = QtGui.QIcon() + icon.addPixmap(QtGui.QPixmap(':/Icon/icons/comic2ebook.png'), QtGui.QIcon.Normal, QtGui.QIcon.Off) + messageBox.setWindowIcon(icon) + QtGui.QMessageBox.critical(messageBox, 'KCC - Error', 'KCC is already running!', QtGui.QMessageBox.Ok) + sys.exit(1) + KCCWindow = QtGui.QMainWindow() + KCCUI = KCC_gui.KCCGUI(KCCAplication, KCCWindow) if len(sys.argv) > 1: - KCCAplication.sendMessage(sys.argv[1].decode(sys.getfilesystemencoding())) - sys.exit(0) - else: - messageBox = QtGui.QMessageBox() - icon = QtGui.QIcon() - icon.addPixmap(QtGui.QPixmap(':/Icon/icons/comic2ebook.png'), QtGui.QIcon.Normal, QtGui.QIcon.Off) - messageBox.setWindowIcon(icon) - QtGui.QMessageBox.critical(messageBox, 'KCC - Error', 'KCC is already running!', QtGui.QMessageBox.Ok) - sys.exit(1) -KCCWindow = QtGui.QMainWindow() -KCCUI = KCC_gui.KCCGUI(KCCAplication, KCCWindow) -if len(sys.argv) > 1: - KCCUI.handleMessage(sys.argv[1].decode(sys.getfilesystemencoding())) -sys.exit(KCCAplication.exec_()) + KCCUI.handleMessage(sys.argv[1].decode(sys.getfilesystemencoding())) + sys.exit(KCCAplication.exec_()) diff --git a/kcc/cbxarchive.py b/kcc/cbxarchive.py index 459a4c1..baa3036 100644 --- a/kcc/cbxarchive.py +++ b/kcc/cbxarchive.py @@ -31,11 +31,11 @@ try: except ImportError: print("ERROR: Psutil is not installed!") if platform.startswith('linux'): - import Tkinter - import tkMessageBox - importRoot = Tkinter.Tk() + import tkinter + import tkinter.messagebox + importRoot = tkinter.Tk() importRoot.withdraw() - tkMessageBox.showerror("KCC - Error", "Psutil is not installed!") + tkinter.messagebox.showerror("KCC - Error", "Psutil is not installed!") exit(1) from shutil import move diff --git a/kcc/comic2ebook.py b/kcc/comic2ebook.py index 6e6f91f..ba9025b 100755 --- a/kcc/comic2ebook.py +++ b/kcc/comic2ebook.py @@ -26,7 +26,6 @@ import os import sys import re import stat -import string import zipfile from tempfile import mkdtemp from shutil import move, copyfile, copytree, rmtree @@ -153,10 +152,10 @@ def buildHTML(path, imgfile): "'{\"targetId\":\"" + boxes[i] + "-Panel-Parent\", \"ordinal\":" + str(order[i]), "}'>\n"]) if options.quality == 2: - imgfilepv = string.split(imgfile, ".") + imgfilepv = str.split(imgfile, ".") imgfilepv[0] = imgfilepv[0].split("_kccxl")[0].replace("_kccnh", "").replace("_kccnv", "") imgfilepv[0] += "_kcchq" - imgfilepv = string.join(imgfilepv, ".") + imgfilepv = ".".join(imgfilepv) else: imgfilepv = imgfile if "_kccxl" in filename[0]: @@ -210,7 +209,7 @@ def buildHTML(path, imgfile): def buildNCX(dstdir, title, chapters): options.uuid = str(uuid4()) - options.uuid = options.uuid.encode('utf-8') + #options.uuid = options.uuid.encode('utf-8') ncxfile = os.path.join(dstdir, 'OEBPS', 'toc.ncx') f = open(ncxfile, "w") f.writelines(["\n", @@ -258,7 +257,7 @@ def buildOPF(dstdir, title, filelist, cover=None): "en-US\n", "", options.uuid, "\n"]) for author in options.authors: - f.writelines(["", author.encode('utf-8'), "\n"]) + f.writelines(["", author, "\n"]) f.writelines(["\n", "\n", "\n", @@ -289,14 +288,14 @@ def buildOPF(dstdir, title, filelist, cover=None): filename = getImageFileName(path[1]) uniqueid = os.path.join(folder, filename[0]).replace('/', '_').replace('\\', '_') reflist.append(uniqueid) - f.write("\n") if '.png' == filename[1]: mt = 'image/png' else: mt = 'image/jpeg' - f.write("\n") f.write("\n") f.write("\n\n") @@ -648,19 +647,19 @@ def checkComicInfo(path, originalPath): titleSuffix += ' #' + xml.getElementsByTagName('Number')[0].firstChild.nodeValue options.title += titleSuffix if len(xml.getElementsByTagName('Writer')) != 0: - authorsTemp = string.split(xml.getElementsByTagName('Writer')[0].firstChild.nodeValue, ', ') + authorsTemp = str.split(xml.getElementsByTagName('Writer')[0].firstChild.nodeValue, ', ') for author in authorsTemp: options.authors.append(author) if len(xml.getElementsByTagName('Penciller')) != 0: - authorsTemp = string.split(xml.getElementsByTagName('Penciller')[0].firstChild.nodeValue, ', ') + authorsTemp = str.split(xml.getElementsByTagName('Penciller')[0].firstChild.nodeValue, ', ') for author in authorsTemp: options.authors.append(author) if len(xml.getElementsByTagName('Inker')) != 0: - authorsTemp = string.split(xml.getElementsByTagName('Inker')[0].firstChild.nodeValue, ', ') + authorsTemp = str.split(xml.getElementsByTagName('Inker')[0].firstChild.nodeValue, ', ') for author in authorsTemp: options.authors.append(author) if len(xml.getElementsByTagName('Colorist')) != 0: - authorsTemp = string.split(xml.getElementsByTagName('Colorist')[0].firstChild.nodeValue, ', ') + authorsTemp = str.split(xml.getElementsByTagName('Colorist')[0].firstChild.nodeValue, ', ') for author in authorsTemp: options.authors.append(author) if len(options.authors) > 0: @@ -671,7 +670,7 @@ def checkComicInfo(path, originalPath): os.remove(xmlPath) -# TODO: Check if replacement work correctly +# TODO: Check if replacement work correctly. No zero padding!!! #def slugify(value): # # Normalizes string, converts to lowercase, removes non-alpha characters and converts spaces to hyphens. # value = unicodedata.normalize('NFKD', value).encode('ascii', 'ignore') @@ -898,8 +897,7 @@ def makeZIP(zipFilename, baseDir, isEPUB=False): def Copyright(): - print(('comic2ebook v%(__version__)s. ' - 'Written 2013 by Ciro Mattia Gonano and Pawel Jastrzebski.' % globals())) + print(('comic2ebook v%(__version__)s. Written by Ciro Mattia Gonano and Pawel Jastrzebski.' % globals())) def Usage(): diff --git a/kcc/comic2panel.py b/kcc/comic2panel.py index 34d9763..5994b3e 100644 --- a/kcc/comic2panel.py +++ b/kcc/comic2panel.py @@ -117,14 +117,14 @@ def mergeDirectory(work): os.remove(i[1]) savePath = os.path.split(imagesClear[0][1]) result.save(os.path.join(savePath[0], os.path.splitext(savePath[1])[0] + '.png'), 'PNG') - except StandardError: + except Exception: return str(sys.exc_info()[1]) def sanitizePanelSize(panel, opt): newPanels = [] if panel[2] > 8 * opt.height: - diff = (panel[2] / 8) + diff = int(panel[2] / 8) newPanels.append([panel[0], panel[1] - diff*7, diff]) newPanels.append([panel[1] - diff*7, panel[1] - diff*6, diff]) newPanels.append([panel[1] - diff*6, panel[1] - diff*5, diff]) @@ -134,14 +134,14 @@ def sanitizePanelSize(panel, opt): newPanels.append([panel[1] - diff*2, panel[1] - diff, diff]) newPanels.append([panel[1] - diff, panel[1], diff]) elif panel[2] > 4 * opt.height: - diff = (panel[2] / 4) + diff = int(panel[2] / 4) newPanels.append([panel[0], panel[1] - diff*3, diff]) newPanels.append([panel[1] - diff*3, panel[1] - diff*2, diff]) newPanels.append([panel[1] - diff*2, panel[1] - diff, diff]) newPanels.append([panel[1] - diff, panel[1], diff]) elif panel[2] > 2 * opt.height: - newPanels.append([panel[0], panel[1] - (panel[2] / 2), (panel[2] / 2)]) - newPanels.append([panel[1] - (panel[2] / 2), panel[1], (panel[2] / 2)]) + newPanels.append([panel[0], panel[1] - int(panel[2] / 2), int(panel[2] / 2)]) + newPanels.append([panel[1] - int(panel[2] / 2), panel[1], int(panel[2] / 2)]) else: newPanels = [panel] return newPanels @@ -248,8 +248,7 @@ def splitImage(work): def Copyright(): - print(('comic2panel v%(__version__)s. ' - 'Written 2013 by Ciro Mattia Gonano and Pawel Jastrzebski.' % globals())) + print(('comic2panel v%(__version__)s. Written by Ciro Mattia Gonano and Pawel Jastrzebski.' % globals())) def main(argv=None, qtGUI=None): diff --git a/kcc/image.py b/kcc/image.py index a703177..7a53a0a 100755 --- a/kcc/image.py +++ b/kcc/image.py @@ -22,6 +22,7 @@ __docformat__ = 'restructuredtext en' import os from sys import platform +from functools import reduce try: # noinspection PyUnresolvedReferences from PIL import Image, ImageOps, ImageStat, ImageChops @@ -248,8 +249,8 @@ class ComicPage: return self.image # If image is smaller than target resolution and upscale is off - Just expand it by adding margins if self.image.size[0] <= size[0] and self.image.size[1] <= size[1] and not upscale: - borderw = (size[0] - self.image.size[0]) / 2 - borderh = (size[1] - self.image.size[1]) / 2 + borderw = int((size[0] - self.image.size[0]) / 2) + borderh = int((size[1] - self.image.size[1]) / 2) # PV is disabled when source image is smaller than device screen and upscale is off - So we drop HQ image if qualityMode == 2 and self.image.size[0] <= self.size[0] and self.image.size[1] <= self.size[1]: self.purge = True @@ -265,7 +266,7 @@ class ComicPage: self.image = ImageOps.expand(self.image, border=(int(diff / 2), 0), fill=fill) elif (float(self.image.size[0]) / float(self.image.size[1])) > ratioDev: diff = int(self.image.size[0] / ratioDev) - self.image.size[1] - self.image = ImageOps.expand(self.image, border=(0, diff / 2), fill=fill) + self.image = ImageOps.expand(self.image, border=(0, int(diff / 2)), fill=fill) if self.image.size[0] <= size[0] and self.image.size[1] <= size[1]: method = Image.BICUBIC else: @@ -286,12 +287,12 @@ class ComicPage: self.rotated = False if width > height: # Source is landscape, so split by the width - leftbox = (0, 0, width / 2, height) - rightbox = (width / 2, 0, width, height) + leftbox = (0, 0, int(width / 2), height) + rightbox = (int(width / 2), 0, width, height) else: # Source is portrait and target is landscape, so split by the height - leftbox = (0, 0, width, height / 2) - rightbox = (0, height / 2, width, height) + leftbox = (0, 0, width, int(height / 2)) + rightbox = (0, int(height / 2), width, height) filename = os.path.splitext(self.filename) fileone = targetdir + '/' + filename[0] + '_kcca' + filename[1] filetwo = targetdir + '/' + filename[0] + '_kccb' + filename[1] diff --git a/kcc/pdfjpgextract.py b/kcc/pdfjpgextract.py index 34ea74d..cb3f084 100644 --- a/kcc/pdfjpgextract.py +++ b/kcc/pdfjpgextract.py @@ -28,6 +28,7 @@ from random import choice from string import ascii_uppercase, digits +#TODO: Check entire code. Replacing file() with open() is not enought. class PdfJpgExtract: def __init__(self, origFileName): self.origFileName = origFileName @@ -39,7 +40,7 @@ class PdfJpgExtract: return self.path def extract(self): - pdf = file(self.origFileName, "rb").read() + pdf = open(self.origFileName, "rb").read() startmark = "\xff\xd8" startfix = 0 @@ -67,7 +68,7 @@ class PdfJpgExtract: istart += startfix iend += endfix jpg = pdf[istart:iend] - jpgfile = file(self.path + "/jpg%d.jpg" % njpg, "wb") + jpgfile = open(self.path + "/jpg%d.jpg" % njpg, "wb") jpgfile.write(jpg) jpgfile.close() From 87009f27a65f64b18f76b10e4256f28fafba28b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Jastrz=C4=99bski?= Date: Wed, 15 Jan 2014 14:04:05 +0100 Subject: [PATCH 06/50] Preliminary QT5 update --- KCC-Linux.ui | 4 +- KCC-OSX.ui | 4 +- KCC.ui | 4 +- kcc.py | 28 +- kcc/KCC_gui.py | 237 +- kcc/KCC_rc.py | 5142 +++++++++++++++++++++---------------------- kcc/KCC_ui.py | 277 ++- kcc/KCC_ui_linux.py | 341 ++- kcc/KCC_ui_osx.py | 341 ++- kcc/comic2ebook.py | 52 +- kcc/comic2panel.py | 14 +- 11 files changed, 3208 insertions(+), 3236 deletions(-) diff --git a/KCC-Linux.ui b/KCC-Linux.ui index 03bba46..26b8683 100644 --- a/KCC-Linux.ui +++ b/KCC-Linux.ui @@ -700,7 +700,7 @@ p, li { white-space: pre-wrap; } Resolution of target device. - 0000; + 0000 4 @@ -751,7 +751,7 @@ p, li { white-space: pre-wrap; } Resolution of target device. - 0000; + 0000 4 diff --git a/KCC-OSX.ui b/KCC-OSX.ui index 465af4b..3873816 100644 --- a/KCC-OSX.ui +++ b/KCC-OSX.ui @@ -708,7 +708,7 @@ <html><head/><body><p><span style=" font-size:12pt;">Resolution of target device.</span></p></body></html> - 0000; + 0000 4 @@ -763,7 +763,7 @@ <html><head/><body><p><span style=" font-size:12pt;">Resolution of target device.</span></p></body></html> - 0000; + 0000 4 diff --git a/KCC.ui b/KCC.ui index 3d2e7b0..ab89d23 100644 --- a/KCC.ui +++ b/KCC.ui @@ -599,7 +599,7 @@ p, li { white-space: pre-wrap; } Resolution of target device. - 0000; + 0000 4 @@ -640,7 +640,7 @@ p, li { white-space: pre-wrap; } Resolution of target device. - 0000; + 0000 4 diff --git a/kcc.py b/kcc.py index c445924..2f06a09 100644 --- a/kcc.py +++ b/kcc.py @@ -27,7 +27,7 @@ import sys import os try: # noinspection PyUnresolvedReferences - from PyQt5 import QtCore, QtGui, QtNetwork + from PyQt5 import QtCore, QtGui, QtNetwork, QtWidgets except ImportError: print("ERROR: PyQT5 is not installed!") if sys.platform.startswith('linux'): @@ -55,9 +55,11 @@ elif sys.platform.startswith('win'): # Implementing detection of already running KCC instance and forwarding argv to it -class QApplicationMessaging(QtGui.QApplication): +class QApplicationMessaging(QtWidgets.QApplication): + messageFromOtherInstance = QtCore.pyqtSignal(str) + def __init__(self, argv): - QtGui.QApplication.__init__(self, argv) + QtWidgets.QApplication.__init__(self, argv) self._memory = QtCore.QSharedMemory(self) self._memory.setKey('KCC') if self._memory.attach(): @@ -79,7 +81,7 @@ class QApplicationMessaging(QtGui.QApplication): def handleMessage(self): socket = self._server.nextPendingConnection() if socket.waitForReadyRead(self._timeout): - self.emit(QtCore.SIGNAL('messageFromOtherInstance'), socket.readAll().data().decode('utf8')) + self.messageFromOtherInstance.emit(socket.readAll().data().decode('utf8')) def sendMessage(self, message): if self.isRunning(): @@ -94,6 +96,17 @@ class QApplicationMessaging(QtGui.QApplication): return True return False + +# Adding signals to QMainWindow +class QMainWindowKCC(QtWidgets.QMainWindow): + progressBarTick = QtCore.pyqtSignal(str, str) + modeConvert = QtCore.pyqtSignal(str) + addMessage = QtCore.pyqtSignal(str, str, bool) + addTrayMessage = QtCore.pyqtSignal(str, str) + showDialog = QtCore.pyqtSignal(str) + hideProgressBar = QtCore.pyqtSignal() + + if __name__ == "__main__": freeze_support() KCCAplication = QApplicationMessaging(sys.argv) @@ -102,13 +115,14 @@ if __name__ == "__main__": KCCAplication.sendMessage(sys.argv[1].decode(sys.getfilesystemencoding())) sys.exit(0) else: - messageBox = QtGui.QMessageBox() + messageBox = QtWidgets.QMessageBox() icon = QtGui.QIcon() icon.addPixmap(QtGui.QPixmap(':/Icon/icons/comic2ebook.png'), QtGui.QIcon.Normal, QtGui.QIcon.Off) messageBox.setWindowIcon(icon) - QtGui.QMessageBox.critical(messageBox, 'KCC - Error', 'KCC is already running!', QtGui.QMessageBox.Ok) + QtWidgets.QMessageBox.critical(messageBox, 'KCC - Error', 'KCC is already running!', + QtWidgets.QMessageBox.Ok) sys.exit(1) - KCCWindow = QtGui.QMainWindow() + KCCWindow = QMainWindowKCC() KCCUI = KCC_gui.KCCGUI(KCCAplication, KCCWindow) if len(sys.argv) > 1: KCCUI.handleMessage(sys.argv[1].decode(sys.getfilesystemencoding())) diff --git a/kcc/KCC_gui.py b/kcc/KCC_gui.py index e6731dc..64ece41 100644 --- a/kcc/KCC_gui.py +++ b/kcc/KCC_gui.py @@ -25,7 +25,9 @@ __docformat__ = 'restructuredtext en' import os import sys import traceback -import urllib.request, urllib.error, urllib.parse +import urllib.request +import urllib.error +import urllib.parse import socket from . import comic2ebook from . import kindlesplit @@ -34,7 +36,7 @@ from shutil import move from http.server import BaseHTTPRequestHandler, HTTPServer from socketserver import ThreadingMixIn from subprocess import STDOUT, PIPE -from PyQt5 import QtGui, QtCore +from PyQt5 import QtGui, QtCore, QtWidgets from xml.dom.minidom import parse from html.parser import HTMLParser from .KCC_rc_web import WebContent @@ -180,14 +182,14 @@ class WebServerThread(QtCore.QThread): self.server = WebServerThreaded(('', 4242), WebServerHandler) self.running = True if lIP: - self.emit(QtCore.SIGNAL("addMessage"), 'Content server started.', 'info') + MW.addMessage.emit('Content server started.', 'info', + False) else: - self.emit(QtCore.SIGNAL("addMessage"), 'Content server started on port 4242.', 'info') + MW.addMessage.emit('Content server started on port 4242.', 'info', False) while self.running: self.server.handle_request() except Exception: - self.emit(QtCore.SIGNAL("addMessage"), 'Content server failed to start!', 'error') + MW.addMessage.emit('Content server failed to start!', 'error', False) def stop(self): self.running = False @@ -208,10 +210,10 @@ class VersionThread(QtCore.QThread): return latestVersion = XML.childNodes[0].getElementsByTagName('latest')[0].childNodes[0].toxml() if tuple(map(int, (latestVersion.split(".")))) > tuple(map(int, (__version__.split(".")))): - self.emit(QtCore.SIGNAL("addMessage"), '' - 'New version is available! ' - '(' - 'Changelog)', 'warning') + MW.addMessage.emit('' + 'New version is available! ' + '(' + 'Changelog)', 'warning', False) class ProgressThread(QtCore.QThread): @@ -229,7 +231,7 @@ class ProgressThread(QtCore.QThread): while self.running: sleep(1) if self.content: - self.emit(QtCore.SIGNAL("addMessage"), self.content + self.progress * '.', 'info', True) + MW.addMessage.emit(self.content + self.progress * '.', 'info', True) self.progress += 1 if self.progress == 4: self.progress = 0 @@ -335,17 +337,17 @@ class WorkerThread(QtCore.QThread): GUI.progress.content = '' GUI.progress.stop() GUI.needClean = True - self.emit(QtCore.SIGNAL("hideProgressBar")) - self.emit(QtCore.SIGNAL("addMessage"), 'Conversion interrupted.', 'error') - self.emit(QtCore.SIGNAL("addTrayMessage"), 'Conversion interrupted.', 'Critical') - self.emit(QtCore.SIGNAL("modeConvert"), True) + MW.hideProgressBar.emit() + MW.addMessage.emit('Conversion interrupted.', 'error', False) + MW.addTrayMessage.emit('Conversion interrupted.', 'Critical') + MW.modeConvert.emit(True) def addResult(self, output): - self.emit(QtCore.SIGNAL("progressBarTick")) + MW.progressBarTick.emit(False, False) self.workerOutput.append(output) def run(self): - self.emit(QtCore.SIGNAL("modeConvert"), False) + MW.modeConvert.emit(False) profile = GUI.profiles[str(GUI.DeviceBox.currentText())]['Label'] argv = ["--profile=" + profile] currentJobs = [] @@ -400,18 +402,18 @@ class WorkerThread(QtCore.QThread): self.clean() return self.errors = False - self.emit(QtCore.SIGNAL("addMessage"), 'Source: ' + job, 'info') + MW.addMessage.emit('Source: ' + job, 'info', False) if str(GUI.FormatBox.currentText()) == 'CBZ': - self.emit(QtCore.SIGNAL("addMessage"), 'Creating CBZ files', 'info') + MW.addMessage.emit('Creating CBZ files', 'info', False) GUI.progress.content = 'Creating CBZ files' else: - self.emit(QtCore.SIGNAL("addMessage"), 'Creating EPUB files', 'info') + MW.addMessage.emit('Creating EPUB files', 'info', False) GUI.progress.content = 'Creating EPUB files' jobargv = list(argv) jobargv.append(job) try: outputPath = comic2ebook.main(jobargv, self) - self.emit(QtCore.SIGNAL("hideProgressBar")) + MW.hideProgressBar.emit() except UserWarning as warn: if not self.conversionAlive: self.clean() @@ -419,17 +421,17 @@ class WorkerThread(QtCore.QThread): else: GUI.progress.content = '' self.errors = True - self.emit(QtCore.SIGNAL("addMessage"), str(warn), 'warning') - self.emit(QtCore.SIGNAL("addMessage"), 'Failed to create output file!', 'warning') - self.emit(QtCore.SIGNAL("addTrayMessage"), 'Failed to create output file!', 'Critical') + MW.addMessage.emit(str(warn), 'warning', False) + MW.addMessage.emit('Failed to create output file!', 'warning', False) + MW.addTrayMessage.emit('Failed to create output file!', 'Critical') except Exception as err: GUI.progress.content = '' self.errors = True type_, value_, traceback_ = sys.exc_info() - self.emit(QtCore.SIGNAL("showDialog"), "Error during conversion %s:\n\n%s\n\nTraceback:\n%s" - % (jobargv[-1], str(err), traceback.format_tb(traceback_))) - self.emit(QtCore.SIGNAL("addMessage"), 'Failed to create EPUB!', 'error') - self.emit(QtCore.SIGNAL("addTrayMessage"), 'Failed to create EPUB!', 'Critical') + MW.showDialog.emit("Error during conversion %s:\n\n%s\n\nTraceback:\n%s" + % (jobargv[-1], str(err), traceback.format_tb(traceback_))) + MW.addMessage.emit('Failed to create EPUB!', 'error', False) + MW.addTrayMessage.emit('Failed to create EPUB!', 'Critical') if not self.conversionAlive: for item in outputPath: if os.path.exists(item): @@ -439,14 +441,14 @@ class WorkerThread(QtCore.QThread): if not self.errors: GUI.progress.content = '' if str(GUI.FormatBox.currentText()) == 'CBZ': - self.emit(QtCore.SIGNAL("addMessage"), 'Creating CBZ files... Done!', 'info', True) + MW.addMessage.emit('Creating CBZ files... Done!', 'info', True) else: - self.emit(QtCore.SIGNAL("addMessage"), 'Creating EPUB files... Done!', 'info', True) + MW.addMessage.emit('Creating EPUB files... Done!', 'info', True) if str(GUI.FormatBox.currentText()) == 'MOBI': - self.emit(QtCore.SIGNAL("progressBarTick"), 'status', 'Creating MOBI files') - self.emit(QtCore.SIGNAL("progressBarTick"), len(outputPath)*2+1) - self.emit(QtCore.SIGNAL("progressBarTick")) - self.emit(QtCore.SIGNAL("addMessage"), 'Creating MOBI files', 'info') + MW.progressBarTick.emit('status', 'Creating MOBI files') + MW.progressBarTick.emit(len(outputPath)*2+1, False) + MW.progressBarTick.emit(False, False) + MW.addMessage.emit('Creating MOBI files', 'info', False) GUI.progress.content = 'Creating MOBI files' self.workerOutput = [] # Number of KindleGen threads depends on the size of RAM @@ -472,44 +474,42 @@ class WorkerThread(QtCore.QThread): return if self.kindlegenErrorCode[0] == 0: GUI.progress.content = '' - self.emit(QtCore.SIGNAL("addMessage"), 'Creating MOBI files... Done!', 'info', True) - self.emit(QtCore.SIGNAL("addMessage"), 'Cleaning MOBI files is currently disabled in this branch', 'info') + MW.addMessage.emit('Creating MOBI files... Done!', 'info', True) + MW.addMessage.emit('Cleaning MOBI files is currently disabled in this branch', 'info', False) GUI.progress.content = 'Cleaning MOBI files is currently disabled in this branch' - #self.emit(QtCore.SIGNAL("addMessage"), 'Cleaning MOBI files', 'info') - #GUI.progress.content = 'Cleaning MOBI files' - #self.workerOutput = [] - ## Multithreading KindleUnpack in current form is a waste of resources. - ## Unless we higly optimise KindleUnpack or drop 32bit support this will not change. - #self.pool.setMaxThreadCount(1) - #for item in outputPath: - # worker = KindleUnpackThread([item, profile]) - # worker.signals.result.connect(self.addResult) - # self.pool.start(worker) - #self.pool.waitForDone() - #sleep(0.5) - #for success in self.workerOutput: - # if not success[0]: - # self.errors = True - # print(success[1]) - # break - #if not self.errors: - # for item in outputPath: - # GUI.completedWork[os.path.basename(mobiPath).encode('utf-8')] = mobiPath.encode('utf-8') - # self.emit(QtCore.SIGNAL("addMessage"), 'Cleaning MOBI files... Done!', 'info', True) - # mobiPath.encode('utf-8') - # self.emit(QtCore.SIGNAL("addMessage"), 'Cleaning MOBI files... Done!', 'info', - # True) - #else: - # GUI.progress.content = '' - # for item in outputPath: - # mobiPath = item.replace('.epub', '.mobi') - # if os.path.exists(mobiPath): - # os.remove(mobiPath) - # if os.path.exists(mobiPath + '_toclean'): - # os.remove(mobiPath + '_toclean') - # self.emit(QtCore.SIGNAL("addMessage"), 'KindleUnpack failed to clean MOBI file!', 'error') - # self.emit(QtCore.SIGNAL("addTrayMessage"), 'KindleUnpack failed to clean MOBI file!', - # 'Critical') + MW.addMessage.emit('Cleaning MOBI files', 'info', False) + GUI.progress.content = 'Cleaning MOBI files' + self.workerOutput = [] + # Multithreading KindleUnpack in current form is a waste of resources. + # Unless we higly optimise KindleUnpack or drop 32bit support this will not change. + self.pool.setMaxThreadCount(1) + for item in outputPath: + worker = KindleUnpackThread([item, profile]) + worker.signals.result.connect(self.addResult) + self.pool.start(worker) + self.pool.waitForDone() + sleep(0.5) + for success in self.workerOutput: + if not success: + self.errors = True + break + if not self.errors: + for item in outputPath: + GUI.progress.content = '' + mobiPath = item.replace('.epub', '.mobi') + os.remove(mobiPath + '_toclean') + GUI.completedWork[os.path.basename(mobiPath).encode('utf-8')] = mobiPath.encode('utf-8') + MW.addMessage.emit('Cleaning MOBI files... Done!', 'info', True) + else: + GUI.progress.content = '' + for item in outputPath: + mobiPath = item.replace('.epub', '.mobi') + if os.path.exists(mobiPath): + os.remove(mobiPath) + if os.path.exists(mobiPath + '_toclean'): + os.remove(mobiPath + '_toclean') + MW.addMessage.emit('KindleUnpack failed to clean MOBI file!', 'error', False) + MW.addTrayMessage.emit('KindleUnpack failed to clean MOBI file!', 'Critical') else: GUI.progress.content = '' epubSize = (os.path.getsize(self.kindlegenErrorCode[2]))/1024/1024 @@ -518,32 +518,30 @@ class WorkerThread(QtCore.QThread): os.remove(item) if os.path.exists(item.replace('.epub', '.mobi')): os.remove(item.replace('.epub', '.mobi')) - self.emit(QtCore.SIGNAL("addMessage"), 'KindleGen failed to create MOBI!', 'error') - self.emit(QtCore.SIGNAL("addTrayMessage"), 'KindleGen failed to create MOBI!', 'Critical') + MW.addMessage.emit('KindleGen failed to create MOBI!', 'error', False) + MW.addTrayMessage.emit('KindleGen failed to create MOBI!', 'Critical') if self.kindlegenErrorCode[0] == 1 and self.kindlegenErrorCode[1] != '': - self.emit(QtCore.SIGNAL("showDialog"), "KindleGen error:\n\n" + - self.kindlegenErrorCode[1]) + MW.showDialog.emit("KindleGen error:\n\n" + self.kindlegenErrorCode[1]) if self.kindlegenErrorCode[0] == 23026: - self.emit(QtCore.SIGNAL("addMessage"), 'Created EPUB file was too big.', - 'error') - self.emit(QtCore.SIGNAL("addMessage"), 'EPUB file: ' + str(epubSize) + 'MB.' - ' Supported size: ~300MB.', 'error') + MW.addMessage.emit('Created EPUB file was too big.', 'error', False) + MW.addMessage.emit('EPUB file: ' + str(epubSize) + 'MB. Supported size: ~300MB.', 'error', + False) else: for item in outputPath: GUI.completedWork[os.path.basename(item).encode('utf-8')] = item.encode('utf-8') GUI.progress.content = '' GUI.progress.stop() - self.emit(QtCore.SIGNAL("hideProgressBar")) + MW.hideProgressBar.emit() GUI.needClean = True - self.emit(QtCore.SIGNAL("addMessage"), 'All jobs completed.', 'info') - self.emit(QtCore.SIGNAL("addTrayMessage"), 'All jobs completed.', 'Information') - self.emit(QtCore.SIGNAL("modeConvert"), True) + MW.addMessage.emit('All jobs completed.', 'info', False) + MW.addTrayMessage.emit('All jobs completed.', 'Information') + MW.modeConvert.emit(True) -class SystemTrayIcon(QtGui.QSystemTrayIcon): - def __init__(self, parent=None): +class SystemTrayIcon(QtWidgets.QSystemTrayIcon): + def __init__(self): if not sys.platform.startswith('darwin') and self.isSystemTrayAvailable(): - QtGui.QSystemTrayIcon.__init__(self, GUI.icons.programIcon, MW) + QtWidgets.QSystemTrayIcon.__init__(self, GUI.icons.programIcon, MW) self.activated.connect(self.catchClicks) def catchClicks(self): @@ -559,21 +557,22 @@ class SystemTrayIcon(QtGui.QSystemTrayIcon): class KCCGUI(KCC_ui.Ui_KCC): + # TODO: Check dialog def selectDir(self): if self.needClean: self.needClean = False GUI.JobList.clear() # Dirty, dirty way but OS native QFileDialogs don't support directory multiselect - dirDialog = QtGui.QFileDialog(MW, 'Select directory', self.lastPath) + dirDialog = QtWidgets.QFileDialog(MW, 'Select directory', self.lastPath) dirDialog.setFileMode(dirDialog.Directory) dirDialog.setOption(dirDialog.ShowDirsOnly, True) dirDialog.setOption(dirDialog.DontUseNativeDialog, True) - l = dirDialog.findChild(QtGui.QListView, "listView") - t = dirDialog.findChild(QtGui.QTreeView) + l = dirDialog.findChild(QtWidgets.QListView, "listView") + t = dirDialog.findChild(QtWidgets.QTreeView) if l: - l.setSelectionMode(QtGui.QAbstractItemView.ExtendedSelection) + l.setSelectionMode(QtWidgets.QAbstractItemView.ExtendedSelection) if t: - t.setSelectionMode(QtGui.QAbstractItemView.ExtendedSelection) + t.setSelectionMode(QtWidgets.QAbstractItemView.ExtendedSelection) if dirDialog.exec_() == 1: dnames = dirDialog.selectedFiles() else: @@ -586,24 +585,25 @@ class KCCGUI(KCC_ui.Ui_KCC): GUI.JobList.addItem(dname) MW.setFocus() + # TODO: Check dialog def selectFile(self): if self.needClean: self.needClean = False GUI.JobList.clear() if self.UnRAR: if self.sevenza: - fnames = QtGui.QFileDialog.getOpenFileNames(MW, 'Select file', self.lastPath, - '*.cbz *.cbr *.cb7 *.zip *.rar *.7z *.pdf') + fnames = QtWidgets.QFileDialog.getOpenFileNames(MW, 'Select file', self.lastPath, + '*.cbz *.cbr *.cb7 *.zip *.rar *.7z *.pdf') else: - fnames = QtGui.QFileDialog.getOpenFileNames(MW, 'Select file', self.lastPath, - '*.cbz *.cbr *.zip *.rar *.pdf') + fnames = QtWidgets.QFileDialog.getOpenFileNames(MW, 'Select file', self.lastPath, + '*.cbz *.cbr *.zip *.rar *.pdf') else: if self.sevenza: - fnames = QtGui.QFileDialog.getOpenFileNames(MW, 'Select file', self.lastPath, - '*.cbz *.cb7 *.zip *.7z *.pdf') + fnames = QtWidgets.QFileDialog.getOpenFileNames(MW, 'Select file', self.lastPath, + '*.cbz *.cb7 *.zip *.7z *.pdf') else: - fnames = QtGui.QFileDialog.getOpenFileNames(MW, 'Select file', self.lastPath, - '*.cbz *.zip *.pdf') + fnames = QtWidgets.QFileDialog.getOpenFileNames(MW, 'Select file', self.lastPath, + '*.cbz *.zip *.pdf') for fname in fnames: if str(fname) != "": self.lastPath = os.path.abspath(os.path.join(str(fname), os.pardir)) @@ -864,16 +864,16 @@ class KCCGUI(KCC_ui.Ui_KCC): def addMessage(self, message, icon=None, replace=False): if icon: icon = eval('self.icons.' + icon) - item = QtGui.QListWidgetItem(icon, ' ' + self.stripTags(message)) + item = QtWidgets.QListWidgetItem(icon, ' ' + self.stripTags(message)) else: - item = QtGui.QListWidgetItem(' ' + self.stripTags(message)) + item = QtWidgets.QListWidgetItem(' ' + self.stripTags(message)) if replace: GUI.JobList.takeItem(GUI.JobList.count()-1) # Due to lack of HTML support in QListWidgetItem we overlay text field with QLabel # We still fill original text field with transparent content to trigger creation of horizontal scrollbar - item.setTextColor(QtGui.QColor('transparent')) - label = QtGui.QLabel(message) - label.setStyleSheet('background-image:url('');background-color:rgba(255,0,0,0.5);') + item.setForeground(QtGui.QColor('transparent')) + label = QtWidgets.QLabel(message) + label.setStyleSheet('background-image:url('');background-color:rgba(0,0,0,0);') label.setOpenExternalLinks(True) font = QtGui.QFont() font.setPointSize(self.listFontSize) @@ -883,7 +883,7 @@ class KCCGUI(KCC_ui.Ui_KCC): GUI.JobList.scrollToBottom() def showDialog(self, message): - QtGui.QMessageBox.critical(MW, 'KCC - Error', message, QtGui.QMessageBox.Ok) + QtWidgets.QMessageBox.critical(MW, 'KCC - Error', message, QtWidgets.QMessageBox.Ok) def updateProgressbar(self, new=False, status=False): if new == "status": @@ -982,6 +982,7 @@ class KCCGUI(KCC_ui.Ui_KCC): else: self.addMessage('This file type is unsupported!', 'error') + # noinspection PyArgumentList def __init__(self, KCCAplication, KCCWindow): global APP, MW, GUI APP = KCCAplication @@ -1085,11 +1086,10 @@ class KCCGUI(KCC_ui.Ui_KCC): "Kindle 2", ] - statusBarLabel = QtGui.QLabel('HOMEPAGE - DONATE' - ' - WIKI' - ' - FORUM' - '') + statusBarLabel = QtWidgets.QLabel('HOMEPAGE - DO' + 'NATE - WIKI - FORUM') statusBarLabel.setAlignment(QtCore.Qt.AlignCenter) statusBarLabel.setStyleSheet(self.statusBarStyle) statusBarLabel.setOpenExternalLinks(True) @@ -1145,7 +1145,7 @@ class KCCGUI(KCC_ui.Ui_KCC): self.addMessage('Cannot find 7za!' ' Processing of CB7/7Z files will be disabled.', 'warning') - APP.connect(APP, QtCore.SIGNAL('messageFromOtherInstance'), self.handleMessage) + APP.messageFromOtherInstance.connect(self.handleMessage) GUI.BasicModeButton.clicked.connect(self.modeBasic) GUI.AdvModeButton.clicked.connect(self.modeAdvanced) GUI.DirectoryButton.clicked.connect(self.selectDir) @@ -1158,15 +1158,12 @@ class KCCGUI(KCC_ui.Ui_KCC): GUI.ProcessingBox.stateChanged.connect(self.toggleProcessingBox) GUI.DeviceBox.activated.connect(self.changeDevice) GUI.FormatBox.activated.connect(self.changeFormat) - MW.connect(self.worker, QtCore.SIGNAL("progressBarTick"), self.updateProgressbar) - MW.connect(self.worker, QtCore.SIGNAL("modeConvert"), self.modeConvert) - MW.connect(self.worker, QtCore.SIGNAL("addMessage"), self.addMessage) - MW.connect(self.worker, QtCore.SIGNAL("addTrayMessage"), self.tray.addTrayMessage) - MW.connect(self.worker, QtCore.SIGNAL("showDialog"), self.showDialog) - MW.connect(self.worker, QtCore.SIGNAL("hideProgressBar"), self.hideProgressBar) - MW.connect(self.versionCheck, QtCore.SIGNAL("addMessage"), self.addMessage) - MW.connect(self.contentServer, QtCore.SIGNAL("addMessage"), self.addMessage) - MW.connect(self.progress, QtCore.SIGNAL("addMessage"), self.addMessage) + MW.progressBarTick.connect(self.updateProgressbar) + MW.modeConvert.connect(self.modeConvert) + MW.addMessage.connect(self.addMessage) + MW.addTrayMessage.connect(self.tray.addTrayMessage) + MW.showDialog.connect(self.showDialog) + MW.hideProgressBar.connect(self.hideProgressBar) MW.closeEvent = self.saveSettings for profile in profilesGUI: diff --git a/kcc/KCC_rc.py b/kcc/KCC_rc.py index 084d287..c473be9 100644 --- a/kcc/KCC_rc.py +++ b/kcc/KCC_rc.py @@ -2,1151 +2,14 @@ # Resource object code # -# Created: mer nov 13 21:20:16 2013 -# by: The Resource Compiler for PyQt (Qt v4.8.6) +# Created: Śr sty 15 11:35:43 2014 +# by: The Resource Compiler for PyQt (Qt v5.2.0) # # WARNING! All changes made in this file will be lost! -from PyQt4 import QtCore +from PyQt5 import QtCore qt_resource_data = b"\ -\x00\x00\x09\x59\ -\x89\ -\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ -\x00\x00\x30\x00\x00\x00\x30\x08\x06\x00\x00\x00\x57\x02\xf9\x87\ -\x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\ -\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x05\x31\x00\x00\x05\x31\ -\x01\xb7\xed\x28\x52\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\ -\x74\x77\x61\x72\x65\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\ -\x70\x65\x2e\x6f\x72\x67\x9b\xee\x3c\x1a\x00\x00\x08\xd6\x49\x44\ -\x41\x54\x68\x81\xd5\x9a\x5d\x8c\x5d\x55\x15\xc7\x7f\x6b\x9f\x73\ -\xee\xdc\x8f\xce\x67\x5b\x5a\x86\x52\x19\xb4\x02\x03\x83\x11\x22\ -\xd0\x00\x6d\x89\x48\x14\xe4\x81\x07\xc6\x1a\x41\x34\x46\x5f\x0c\ -\x10\xe2\x43\x5f\x88\xe3\x84\xc4\x48\xd0\x60\xd1\x07\x8c\x0f\x52\ -\xc1\x88\xf0\xd0\x07\x40\x49\xd5\x58\x08\x0d\xa1\x04\x42\xa4\x1d\ -\x1b\x09\xe9\x30\x54\x68\x69\xe7\xa3\xd3\x99\x7b\xef\xcc\xf9\x58\ -\x3e\x9c\x73\xef\x3d\xe7\xde\x73\xee\xdc\x69\x6b\x0c\x2b\x59\x77\ -\x9f\x8f\xbd\xd7\xfe\xff\xd7\x5e\x7b\xed\x7d\xf6\x8c\xa8\x2a\x9f\ -\x66\x31\xff\x6f\x00\xe7\x2a\x9f\x7a\x02\xf6\xf9\x30\x22\x82\x70\ -\xf7\xde\x1b\x31\x72\x2d\x04\xc3\x88\x19\x06\x2e\x07\x71\x80\x0a\ -\x22\x65\xd0\x32\x62\x0e\xa3\xbc\x0a\xbc\xc2\x1f\xef\x9c\x50\xe5\ -\x9c\xe3\x57\xce\x65\x0e\xc8\xe8\x0b\x43\x58\xee\x7d\xa8\xdc\x07\ -\x72\x09\x02\x84\x3f\x20\x52\xab\x45\xc6\xf3\x53\x88\x3c\x85\xb2\ -\x5b\x9f\xf9\xda\xb1\xb3\xc6\x70\x36\x04\x64\xf4\x85\x21\x8c\xff\ -\x04\xc2\x1d\x75\x44\x22\xac\xc9\xdb\x5c\x71\x51\x37\xeb\x7b\x72\ -\xf4\x15\x73\xf4\x95\x1c\x00\xe6\xca\x2e\x73\x65\x8f\x93\x67\x96\ -\xf9\xd7\x47\x0b\x2c\x54\x83\x38\x29\x0f\x35\xcf\x22\x3c\xaa\xbf\ -\xbf\xed\xd0\xff\x94\x80\x8c\x3e\x6f\x61\xe5\x1e\x02\xc6\x11\x29\ -\x02\xf4\x97\x72\xec\x18\x5e\xcb\xc8\xe6\x1e\x2e\x1e\x28\x44\x74\ -\x24\xd6\x28\x79\xaf\x0a\x1f\xce\x54\x79\xf7\xd8\x02\xfb\x8f\xcc\ -\x32\xbb\xe8\xd6\x7c\xe0\x82\x19\x63\xe8\xb5\x47\x75\x6c\x2c\x38\ -\xef\x04\x64\xf4\xc5\xcd\x38\xc1\x5e\x94\x6b\x40\xb8\xa0\xb7\x8b\ -\xdb\xae\x5e\xcf\x97\x2e\xed\xc3\x32\xb1\x5c\x10\x61\x55\x60\xb1\ -\xea\xa3\x0a\x6b\x0a\x76\x8c\x82\xd4\xeb\xf8\x81\xf2\xe6\xd1\x33\ -\xec\x3b\x3c\xcd\x27\xf3\x6e\xf4\xdc\xec\xc7\x92\x7b\xf5\xb7\x3b\ -\x3a\x0a\xab\x8e\x08\xc8\xb7\x5e\xdc\x02\xfa\x37\x90\xcd\x22\xb0\ -\xfd\x8a\x75\x7c\xf5\xea\xf5\xd8\x56\x53\x12\x13\x08\x14\xde\x3f\ -\xbe\x80\x2d\x70\xd9\xe0\x1a\x1c\x4b\x38\xf2\xf1\x22\x0b\x55\x9f\ -\xcf\x5f\xd4\x83\x65\x62\x73\x23\x2a\x3c\x5f\x79\xf9\xd0\x0c\xaf\ -\xfc\x7b\x0e\x55\x01\x98\x26\x30\xb7\xe8\xef\xb6\xbd\x7b\xce\x04\ -\xe4\x9e\x3f\x8f\x80\xfe\x15\xd8\xd0\x9d\xb7\xf9\xc6\xd6\x41\x2e\ -\x59\x57\x20\xee\xc9\x1a\x12\x05\x26\xa6\xe6\xf8\xee\xf6\x8b\xf9\ -\xca\xc8\xfa\x84\x9d\xd7\xdf\x9b\xe5\xd7\xfb\x3e\xe0\xb2\x8b\x7b\ -\x5b\x49\x44\x97\x93\xa7\x96\xf8\xd3\x9b\x9f\x70\x66\x29\x00\x38\ -\x81\xc5\xcd\xfa\xe4\xb6\xf7\xce\x9a\x80\xdc\xf3\x97\x4d\xc0\x3b\ -\x88\xae\xed\x29\x38\xdc\x73\xe3\x20\x03\x6b\x72\xad\x9d\x03\x88\ -\xf0\xc1\xc9\x45\x46\xaf\xdb\xc0\xd7\xbf\xb8\x21\xd5\xde\xeb\xef\ -\xcd\xb2\x7b\xdf\x14\x5b\x06\x7b\xea\x6d\x9a\x8c\x30\xb3\xe8\xf2\ -\xcc\x1b\x27\x99\xaf\xfa\x80\x4c\x21\xdc\xac\xbf\xb9\x71\x2a\x0b\ -\x63\xe6\x42\x26\xe3\xe3\x06\xe1\x69\x8c\xac\xed\x2d\xe5\xd8\xb9\ -\x75\x90\x62\x97\x4d\xd5\x0d\xa8\xba\x4a\xd5\x0b\x62\xaa\x54\xdd\ -\x00\xd7\xf5\x33\xc1\x03\x6c\xdd\xd2\xcf\x40\xd1\xa2\xec\x2a\x55\ -\x5f\x1b\x6d\xeb\x1a\x50\xcc\xdb\xec\xbc\xee\x02\x7a\x8b\x0e\x18\ -\xd9\x8c\x98\xbd\x32\xfa\xbc\xb5\x6a\x02\xbc\x7f\xfd\x2e\x8c\xd9\ -\x61\x59\x86\xdb\xbf\x70\x01\x39\xdb\x4a\x76\xe6\xc6\xd4\x53\xe6\ -\x2b\x3e\x9f\xdd\x50\xcc\x34\x57\x93\xe1\x4d\xdd\xcc\x2e\xb8\x89\ -\xb6\xa1\x12\xaa\xab\xe4\x6c\xc3\xed\x23\x6b\xb1\x2c\x0b\xc4\x5c\ -\xc3\xc0\xe6\x87\x56\x45\x40\xbe\xbd\xef\x2a\xc4\x8c\x23\x86\x1b\ -\x3e\xd7\x4f\x29\xef\x24\x41\xc7\x3d\x17\x79\x72\xc9\x57\x5c\x7f\ -\xe5\x84\xe0\xfa\xca\x92\x1f\x03\x1c\xf3\x7e\x9c\x4c\x29\x6f\x71\ -\xc3\xa5\xdd\x61\x98\x59\x66\x5c\xee\x3f\x38\x94\x66\x2f\x7d\x2b\ -\x61\x64\x17\x22\xce\x60\x5f\x17\x43\xeb\x8b\x54\xbd\x80\x78\xd6\ -\x68\xa2\x5b\x2f\x0f\x1f\x5b\x40\xd3\xaa\xc4\xe4\xed\xc9\x79\x24\ -\x57\xa0\xea\xc5\xc9\xd6\x12\x82\x26\x4c\x0e\xad\x2b\x70\x74\xda\ -\xe5\xa3\x79\xaf\x88\xf2\x04\x70\x67\x0b\xd4\x16\x38\xdf\xdf\xbf\ -\x09\xcc\x4e\xc4\x30\x7c\x51\x77\x53\x8c\x2a\x55\x97\x48\x9b\x3c\ -\xe7\x2b\x8b\x81\xc5\x1f\x0e\x7c\x94\x09\xfe\xe5\x77\x4f\x31\x39\ -\xe7\xb1\xe4\x93\x0c\x1b\xaf\x39\x94\x1a\xe5\xf0\x60\x31\x1c\x05\ -\x31\x77\xc8\xfd\xff\x6c\x19\x85\xd6\x11\xf0\x79\x10\xcb\xd8\x1b\ -\x7b\x73\xe4\x73\x56\xe4\x29\x09\xbd\x53\xf7\x52\xf3\xfe\x26\x2c\ -\xd6\x94\xf2\xfc\xea\xef\xc7\xb0\x8c\xf0\xcd\xad\x17\x26\xcc\xbe\ -\xf8\xce\x49\x7e\xfa\xd2\x24\x03\x03\xbd\x49\x9b\xf5\xf6\x29\x23\ -\x2c\x90\xcf\x59\x6c\xec\xed\xe2\xf8\x19\x4f\x20\xb8\x0f\xf8\x49\ -\xc2\xe1\xf1\x34\x2a\x82\xf0\xbd\xfd\x9f\x80\xac\xbb\x6e\xa8\x3b\ -\xcc\x04\x71\xab\x75\xe3\x4d\xbd\xc4\x6e\x55\x60\xee\x74\x85\xfe\ -\xbc\x30\xb2\x29\x5c\xc8\x0e\xfd\x67\x81\x8f\x17\x94\x81\xbe\x12\ -\x92\xb9\xb9\x4b\xb3\x1f\x96\xa7\xab\x01\x07\xa7\xca\x80\x4c\xb2\ -\x7b\xe4\xd2\xf8\x2e\x36\x49\xe0\x07\x07\xae\x44\xfd\x43\x39\xdb\ -\x70\xfd\x50\x4f\x13\xce\xe6\xc5\x27\x85\x54\x13\x30\xcf\x0f\x40\ -\xc1\xb6\x4d\x92\x74\xcb\x4e\x75\xa5\x3e\x84\x37\x3e\x28\xb3\xec\ -\x03\x96\xdc\xac\x3f\x1f\x7e\xad\xd6\xa4\x29\x84\x74\x3b\x62\xe8\ -\x29\x38\x54\xeb\x19\xa5\x79\xc5\xad\xd7\x6d\xea\x54\xa3\xeb\x5a\ -\x88\x29\xb5\x29\xe6\xf9\x34\x9e\xc7\xa5\x85\x7c\xed\x36\x1e\x62\ -\xa1\xad\x9e\x82\xcd\xa9\x45\x1f\x90\x6b\x81\x0c\x02\x22\xdb\x40\ -\x08\x10\x2a\xf5\x4d\x62\x13\xb0\x38\x90\xe8\xfd\xf2\x92\xc7\x62\ -\xb9\xd2\xf4\x3c\x71\x01\x40\xa9\xbb\x44\xae\xcb\x49\xb1\xa5\x64\ -\x8f\x4a\xb8\x83\x0d\x30\x60\x14\x30\xc3\x71\x9b\x4d\x04\xcc\x95\ -\x00\x33\x95\x80\xb2\xb7\xc4\xc6\x9e\x1c\x8e\x9d\x16\xa3\x49\x99\ -\x3f\x53\xe1\xf8\xe3\x5b\xd3\x5f\xc6\x64\xe3\x8f\x0e\xd2\x33\xd0\ -\xd7\x6a\x2b\x2b\xef\x8a\xe0\x06\xca\xf1\x79\x3f\x8c\x08\x31\x00\ -\x6d\x09\x14\x6b\x71\x5c\xf5\x60\x6a\xce\xa5\xaf\x68\x53\x74\x0c\ -\x22\x92\x1c\xda\x98\xc7\xdc\x0e\x3f\x29\xdc\x20\x4c\x9b\xed\xe6\ -\x4d\x4d\x54\xa1\xec\x29\x73\x15\x9f\x40\x25\x7a\x27\x00\x97\xb7\ -\x21\x20\xc5\x38\xb0\x00\x98\x29\x07\xcc\x49\x40\x3e\x67\x51\x70\ -\x0c\xa6\x6e\xa7\x81\xc1\xf5\x57\x41\xc0\x57\xd2\x33\x4f\x28\x81\ -\x42\x25\xda\x2b\x05\x0a\x60\xa2\xa9\x54\x27\xe9\xc4\xeb\x27\x09\ -\x18\x53\x68\xf5\x86\x10\x08\x94\x5d\x28\xbb\x01\xb6\x11\x1c\xdb\ -\x60\x44\x31\xd1\xa8\x04\x4e\x81\xc2\x0f\x5f\x07\x04\xf5\x3d\xaa\ -\x4f\xde\x94\x4e\xc0\x07\xfc\x98\x07\x22\xef\x07\x0a\x01\xe1\x36\ -\xa3\xb1\xe8\x9b\xc6\xe8\x24\x47\xa9\xd2\x8e\x80\x1b\x26\x97\xac\ -\xa1\x15\x3c\xc0\xf3\xa2\xbb\x5a\x1f\x38\x48\x21\x87\x20\x04\x8b\ -\xa7\x53\xc1\x03\x2c\x2b\x78\x9e\xa0\x68\xf8\xe1\x22\xe1\x34\x56\ -\x8d\xf5\x21\xed\xd6\x09\x01\x28\x67\x13\xc0\x1c\x41\xb8\xa9\x83\ -\x13\x85\x46\xe7\xb5\x3a\x1a\xbd\x53\x21\x4b\x02\x95\x30\x9e\x91\ -\x24\x30\xd3\x59\x7f\xd1\x4f\x1b\x02\x22\x13\x88\xdc\x94\x6a\xac\ -\x33\xe3\x49\x60\xcd\x22\xd2\xd0\xb3\xea\x03\x40\x0e\x67\x13\x40\ -\x26\xa2\x54\xb5\x0a\xc0\x4d\x75\xda\x11\x40\xa2\xb8\x4b\x05\xd6\ -\x61\x7f\xe6\xd5\x6c\x02\x8e\xfd\x16\x41\xa3\x5d\xaa\xb1\xb6\xc6\ -\x57\x20\x20\x02\x66\x95\x0e\x6a\xb9\xe7\x95\xb8\xc9\xe4\x76\xfa\ -\x17\xc3\x07\x10\x99\x0c\xbd\x94\xa1\x26\xed\x3a\x02\xd6\xc8\xd5\ -\xd9\x04\xda\xd9\xae\xd9\x8a\x97\x46\xe2\x7d\x9c\xe2\x91\x8d\x13\ -\x99\x04\x54\x51\x8c\xec\x69\x05\x99\x6a\x2c\xf6\xbc\x09\x44\x26\ -\x81\x55\xda\x6a\xbd\x7e\xaa\xf9\x3c\x35\xa5\x37\xd9\x83\x88\x26\ -\xbd\xd1\x89\xd6\xea\x66\xe3\xaf\xcf\x81\x2c\x90\x59\xa3\x10\x96\ -\x1e\x98\xdd\xcd\x16\x5b\x08\xe8\x63\x97\x1d\x45\xe4\xa5\xd6\x8e\ -\xb2\x3c\x26\xad\x60\xda\xe0\x6f\x03\x30\xdd\x56\x6d\x5e\x29\xcf\ -\xea\xd8\x40\xcb\x69\x5d\x7a\x6f\x81\xf3\x00\x46\xca\x49\xc0\x1d\ -\x8e\x42\xdb\x39\xb0\x62\x88\x34\x00\x27\xc5\x05\xf3\x68\x9a\xc9\ -\x54\x02\xfa\xd8\x67\x8e\x22\x66\x2c\x15\x60\x9a\xf7\xdd\x65\x38\ -\x33\x0d\xf3\xd3\xe0\xbb\xd9\x04\x7c\x17\x4e\x9f\x0a\xd5\x5d\x6a\ -\x07\xb8\x59\xc6\x74\xac\x3f\xf5\xe4\x3a\xf3\x64\x4e\x46\xb1\xd8\ -\xf2\xe1\x41\x44\xae\x89\x9e\x90\x99\xf6\xe6\x4f\xa2\xbf\x1c\x59\ -\x09\x44\xd2\xfe\x43\x13\xd0\x9f\x7d\x08\xd6\xa8\xc8\x7e\x82\xb5\ -\x5f\xd6\x31\x52\x4f\xac\x33\x03\x56\x9f\xc3\xc7\xb7\xef\x42\xcc\ -\xd4\x4a\x13\x4c\x56\xf6\x60\x8b\x74\xd9\xd2\xd8\x41\x64\xcb\x34\ -\x81\xdc\x9b\x05\xbe\x2d\x01\x00\xfd\xd9\x85\x53\x10\xdc\x8a\x98\ -\x13\xe9\x13\xcc\x90\xcf\x59\x14\x9d\xb6\x66\x52\xa5\xe8\x40\x5f\ -\x5e\xc8\xdb\x99\x2c\x4e\x20\xe6\x96\xb4\x89\x1b\x97\xce\x8e\xd7\ -\x7f\x7c\x62\x04\x4b\xfe\x81\xca\xda\xf0\x41\xf8\x63\x09\x94\xba\ -\x0c\x5d\x7e\x15\xa9\xcc\xd3\x65\x09\x5d\x36\x74\x59\xd0\x65\x09\ -\x39\x4b\xb0\x0d\x78\x01\x2c\x47\x27\x72\x4b\x3e\x2c\x79\x60\x4a\ -\x3d\x2c\x5b\x79\x16\x5d\x65\x7e\xa9\x05\xc3\x14\x26\xb8\x55\x1f\ -\x5e\xdf\xf6\x64\xba\x63\x02\x00\x32\x3e\xb3\x09\x82\xa7\x11\xd9\ -\x11\x7f\x5e\x72\x84\x52\x4e\x28\x3a\x50\x74\x84\xa2\x23\x14\x6c\ -\x21\x6f\x43\xce\x12\x2c\x03\x7e\x44\xa0\xea\x41\xc5\x53\xca\x6e\ -\x4d\x61\xb6\x12\xe0\x26\x03\xe4\x6d\xd4\xdc\xa5\x63\xfd\x53\x1d\ -\xe1\x5a\xd5\x9f\x98\xc6\x31\xc8\xf4\x2e\x60\x1c\xa8\x7f\x19\x39\ -\x06\x4a\xb9\x24\x70\xc7\x02\x4b\x24\x4c\xe1\x0a\xbe\x2a\xae\x1f\ -\x12\xa9\x78\x30\xbf\xa4\x54\xdc\xc4\xb2\x5a\x46\x74\x8c\xcb\xd7\ -\x3d\xae\x77\xd3\xe1\x37\xde\x2a\x09\x34\x88\xcc\x5e\x05\xc1\x2e\ -\x84\x9d\x34\x6d\x08\x2d\x01\xcb\x80\x6d\xa4\xbe\x22\x28\xe1\xa7\ -\xa2\x17\x28\xd1\x51\x51\x5c\x14\xe1\x25\xc4\x7e\x40\x1f\xee\x3d\ -\xba\x6a\x2c\xe7\xf4\x67\xd6\xf1\x99\x4d\xc0\x83\x48\xf0\x1d\x90\ -\x75\xab\x6c\x3e\x09\xba\x07\xe3\xec\x39\x1b\xe0\x75\x0c\xe7\xe3\ -\x7f\x25\x04\x84\x47\x66\x86\x41\xb7\xa3\xba\x0d\xe4\x4a\x90\x22\ -\x68\x11\x28\x80\xba\xc0\x11\xd4\x4c\x20\x4c\xa0\xf2\x16\x63\xfd\ -\x07\xb4\x65\x30\xce\x03\x81\x28\xa7\xdb\x80\xb5\x82\x9a\x48\x6b\ -\xd7\x12\x2b\xb3\xf6\x14\x1a\xd3\x20\x56\xfa\x29\x65\x96\x7a\x89\ -\xe3\x50\x55\x45\x44\xac\x08\xb4\x13\x95\xe7\x4b\xad\x88\x88\x02\ -\x5e\x0d\xc0\x79\x50\x17\x58\x06\xbc\xac\x11\x30\x29\x1a\xf7\x7c\ -\xda\x88\xd8\x29\x75\x6a\x2b\x5c\xb0\x0a\x0f\x37\x8f\x46\xe2\x5a\ -\x9b\x00\xff\x17\x83\xe5\xeb\x32\x4d\x9a\x90\x76\x00\x00\x00\x00\ -\x49\x45\x4e\x44\xae\x42\x60\x82\ -\x00\x00\x15\x39\ -\x89\ -\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ -\x00\x00\x30\x00\x00\x00\x30\x08\x06\x00\x00\x00\x57\x02\xf9\x87\ -\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0b\x13\x00\x00\x0b\x13\ -\x01\x00\x9a\x9c\x18\x00\x00\x0a\x4d\x69\x43\x43\x50\x50\x68\x6f\ -\x74\x6f\x73\x68\x6f\x70\x20\x49\x43\x43\x20\x70\x72\x6f\x66\x69\ -\x6c\x65\x00\x00\x78\xda\x9d\x53\x77\x58\x93\xf7\x16\x3e\xdf\xf7\ -\x65\x0f\x56\x42\xd8\xf0\xb1\x97\x6c\x81\x00\x22\x23\xac\x08\xc8\ -\x10\x59\xa2\x10\x92\x00\x61\x84\x10\x12\x40\xc5\x85\x88\x0a\x56\ -\x14\x15\x11\x9c\x48\x55\xc4\x82\xd5\x0a\x48\x9d\x88\xe2\xa0\x28\ -\xb8\x67\x41\x8a\x88\x5a\x8b\x55\x5c\x38\xee\x1f\xdc\xa7\xb5\x7d\ -\x7a\xef\xed\xed\xfb\xd7\xfb\xbc\xe7\x9c\xe7\xfc\xce\x79\xcf\x0f\ -\x80\x11\x12\x26\x91\xe6\xa2\x6a\x00\x39\x52\x85\x3c\x3a\xd8\x1f\ -\x8f\x4f\x48\xc4\xc9\xbd\x80\x02\x15\x48\xe0\x04\x20\x10\xe6\xcb\ -\xc2\x67\x05\xc5\x00\x00\xf0\x03\x79\x78\x7e\x74\xb0\x3f\xfc\x01\ -\xaf\x6f\x00\x02\x00\x70\xd5\x2e\x24\x12\xc7\xe1\xff\x83\xba\x50\ -\x26\x57\x00\x20\x91\x00\xe0\x22\x12\xe7\x0b\x01\x90\x52\x00\xc8\ -\x2e\x54\xc8\x14\x00\xc8\x18\x00\xb0\x53\xb3\x64\x0a\x00\x94\x00\ -\x00\x6c\x79\x7c\x42\x22\x00\xaa\x0d\x00\xec\xf4\x49\x3e\x05\x00\ -\xd8\xa9\x93\xdc\x17\x00\xd8\xa2\x1c\xa9\x08\x00\x8d\x01\x00\x99\ -\x28\x47\x24\x02\x40\xbb\x00\x60\x55\x81\x52\x2c\x02\xc0\xc2\x00\ -\xa0\xac\x40\x22\x2e\x04\xc0\xae\x01\x80\x59\xb6\x32\x47\x02\x80\ -\xbd\x05\x00\x76\x8e\x58\x90\x0f\x40\x60\x00\x80\x99\x42\x2c\xcc\ -\x00\x20\x38\x02\x00\x43\x1e\x13\xcd\x03\x20\x4c\x03\xa0\x30\xd2\ -\xbf\xe0\xa9\x5f\x70\x85\xb8\x48\x01\x00\xc0\xcb\x95\xcd\x97\x4b\ -\xd2\x33\x14\xb8\x95\xd0\x1a\x77\xf2\xf0\xe0\xe2\x21\xe2\xc2\x6c\ -\xb1\x42\x61\x17\x29\x10\x66\x09\xe4\x22\x9c\x97\x9b\x23\x13\x48\ -\xe7\x03\x4c\xce\x0c\x00\x00\x1a\xf9\xd1\xc1\xfe\x38\x3f\x90\xe7\ -\xe6\xe4\xe1\xe6\x66\xe7\x6c\xef\xf4\xc5\xa2\xfe\x6b\xf0\x6f\x22\ -\x3e\x21\xf1\xdf\xfe\xbc\x8c\x02\x04\x00\x10\x4e\xcf\xef\xda\x5f\ -\xe5\xe5\xd6\x03\x70\xc7\x01\xb0\x75\xbf\x6b\xa9\x5b\x00\xda\x56\ -\x00\x68\xdf\xf9\x5d\x33\xdb\x09\xa0\x5a\x0a\xd0\x7a\xf9\x8b\x79\ -\x38\xfc\x40\x1e\x9e\xa1\x50\xc8\x3c\x1d\x1c\x0a\x0b\x0b\xed\x25\ -\x62\xa1\xbd\x30\xe3\x8b\x3e\xff\x33\xe1\x6f\xe0\x8b\x7e\xf6\xfc\ -\x40\x1e\xfe\xdb\x7a\xf0\x00\x71\x9a\x40\x99\xad\xc0\xa3\x83\xfd\ -\x71\x61\x6e\x76\xae\x52\x8e\xe7\xcb\x04\x42\x31\x6e\xf7\xe7\x23\ -\xfe\xc7\x85\x7f\xfd\x8e\x29\xd1\xe2\x34\xb1\x5c\x2c\x15\x8a\xf1\ -\x58\x89\xb8\x50\x22\x4d\xc7\x79\xb9\x52\x91\x44\x21\xc9\x95\xe2\ -\x12\xe9\x7f\x32\xf1\x1f\x96\xfd\x09\x93\x77\x0d\x00\xac\x86\x4f\ -\xc0\x4e\xb6\x07\xb5\xcb\x6c\xc0\x7e\xee\x01\x02\x8b\x0e\x58\xd2\ -\x76\x00\x40\x7e\xf3\x2d\x8c\x1a\x0b\x91\x00\x10\x67\x34\x32\x79\ -\xf7\x00\x00\x93\xbf\xf9\x8f\x40\x2b\x01\x00\xcd\x97\xa4\xe3\x00\ -\x00\xbc\xe8\x18\x5c\xa8\x94\x17\x4c\xc6\x08\x00\x00\x44\xa0\x81\ -\x2a\xb0\x41\x07\x0c\xc1\x14\xac\xc0\x0e\x9c\xc1\x1d\xbc\xc0\x17\ -\x02\x61\x06\x44\x40\x0c\x24\xc0\x3c\x10\x42\x06\xe4\x80\x1c\x0a\ -\xa1\x18\x96\x41\x19\x54\xc0\x3a\xd8\x04\xb5\xb0\x03\x1a\xa0\x11\ -\x9a\xe1\x10\xb4\xc1\x31\x38\x0d\xe7\xe0\x12\x5c\x81\xeb\x70\x17\ -\x06\x60\x18\x9e\xc2\x18\xbc\x86\x09\x04\x41\xc8\x08\x13\x61\x21\ -\x3a\x88\x11\x62\x8e\xd8\x22\xce\x08\x17\x99\x8e\x04\x22\x61\x48\ -\x34\x92\x80\xa4\x20\xe9\x88\x14\x51\x22\xc5\xc8\x72\xa4\x02\xa9\ -\x42\x6a\x91\x5d\x48\x23\xf2\x2d\x72\x14\x39\x8d\x5c\x40\xfa\x90\ -\xdb\xc8\x20\x32\x8a\xfc\x8a\xbc\x47\x31\x94\x81\xb2\x51\x03\xd4\ -\x02\x75\x40\xb9\xa8\x1f\x1a\x8a\xc6\xa0\x73\xd1\x74\x34\x0f\x5d\ -\x80\x96\xa2\x6b\xd1\x1a\xb4\x1e\x3d\x80\xb6\xa2\xa7\xd1\x4b\xe8\ -\x75\x74\x00\x7d\x8a\x8e\x63\x80\xd1\x31\x0e\x66\x8c\xd9\x61\x5c\ -\x8c\x87\x45\x60\x89\x58\x1a\x26\xc7\x16\x63\xe5\x58\x35\x56\x8f\ -\x35\x63\x1d\x58\x37\x76\x15\x1b\xc0\x9e\x61\xef\x08\x24\x02\x8b\ -\x80\x13\xec\x08\x5e\x84\x10\xc2\x6c\x82\x90\x90\x47\x58\x4c\x58\ -\x43\xa8\x25\xec\x23\xb4\x12\xba\x08\x57\x09\x83\x84\x31\xc2\x27\ -\x22\x93\xa8\x4f\xb4\x25\x7a\x12\xf9\xc4\x78\x62\x3a\xb1\x90\x58\ -\x46\xac\x26\xee\x21\x1e\x21\x9e\x25\x5e\x27\x0e\x13\x5f\x93\x48\ -\x24\x0e\xc9\x92\xe4\x4e\x0a\x21\x25\x90\x32\x49\x0b\x49\x6b\x48\ -\xdb\x48\x2d\xa4\x53\xa4\x3e\xd2\x10\x69\x9c\x4c\x26\xeb\x90\x6d\ -\xc9\xde\xe4\x08\xb2\x80\xac\x20\x97\x91\xb7\x90\x0f\x90\x4f\x92\ -\xfb\xc9\xc3\xe4\xb7\x14\x3a\xc5\x88\xe2\x4c\x09\xa2\x24\x52\xa4\ -\x94\x12\x4a\x35\x65\x3f\xe5\x04\xa5\x9f\x32\x42\x99\xa0\xaa\x51\ -\xcd\xa9\x9e\xd4\x08\xaa\x88\x3a\x9f\x5a\x49\x6d\xa0\x76\x50\x2f\ -\x53\x87\xa9\x13\x34\x75\x9a\x25\xcd\x9b\x16\x43\xcb\xa4\x2d\xa3\ -\xd5\xd0\x9a\x69\x67\x69\xf7\x68\x2f\xe9\x74\xba\x09\xdd\x83\x1e\ -\x45\x97\xd0\x97\xd2\x6b\xe8\x07\xe9\xe7\xe9\x83\xf4\x77\x0c\x0d\ -\x86\x0d\x83\xc7\x48\x62\x28\x19\x6b\x19\x7b\x19\xa7\x18\xb7\x19\ -\x2f\x99\x4c\xa6\x05\xd3\x97\x99\xc8\x54\x30\xd7\x32\x1b\x99\x67\ -\x98\x0f\x98\x6f\x55\x58\x2a\xf6\x2a\x7c\x15\x91\xca\x12\x95\x3a\ -\x95\x56\x95\x7e\x95\xe7\xaa\x54\x55\x73\x55\x3f\xd5\x79\xaa\x0b\ -\x54\xab\x55\x0f\xab\x5e\x56\x7d\xa6\x46\x55\xb3\x50\xe3\xa9\x09\ -\xd4\x16\xab\xd5\xa9\x1d\x55\xbb\xa9\x36\xae\xce\x52\x77\x52\x8f\ -\x50\xcf\x51\x5f\xa3\xbe\x5f\xfd\x82\xfa\x63\x0d\xb2\x86\x85\x46\ -\xa0\x86\x48\xa3\x54\x63\xb7\xc6\x19\x8d\x21\x16\xc6\x32\x65\xf1\ -\x58\x42\xd6\x72\x56\x03\xeb\x2c\x6b\x98\x4d\x62\x5b\xb2\xf9\xec\ -\x4c\x76\x05\xfb\x1b\x76\x2f\x7b\x4c\x53\x43\x73\xaa\x66\xac\x66\ -\x91\x66\x9d\xe6\x71\xcd\x01\x0e\xc6\xb1\xe0\xf0\x39\xd9\x9c\x4a\ -\xce\x21\xce\x0d\xce\x7b\x2d\x03\x2d\x3f\x2d\xb1\xd6\x6a\xad\x66\ -\xad\x7e\xad\x37\xda\x7a\xda\xbe\xda\x62\xed\x72\xed\x16\xed\xeb\ -\xda\xef\x75\x70\x9d\x40\x9d\x2c\x9d\xf5\x3a\x6d\x3a\xf7\x75\x09\ -\xba\x36\xba\x51\xba\x85\xba\xdb\x75\xcf\xea\x3e\xd3\x63\xeb\x79\ -\xe9\x09\xf5\xca\xf5\x0e\xe9\xdd\xd1\x47\xf5\x6d\xf4\xa3\xf5\x17\ -\xea\xef\xd6\xef\xd1\x1f\x37\x30\x34\x08\x36\x90\x19\x6c\x31\x38\ -\x63\xf0\xcc\x90\x63\xe8\x6b\x98\x69\xb8\xd1\xf0\x84\xe1\xa8\x11\ -\xcb\x68\xba\x91\xc4\x68\xa3\xd1\x49\xa3\x27\xb8\x26\xee\x87\x67\ -\xe3\x35\x78\x17\x3e\x66\xac\x6f\x1c\x62\xac\x34\xde\x65\xdc\x6b\ -\x3c\x61\x62\x69\x32\xdb\xa4\xc4\xa4\xc5\xe4\xbe\x29\xcd\x94\x6b\ -\x9a\x66\xba\xd1\xb4\xd3\x74\xcc\xcc\xc8\x2c\xdc\xac\xd8\xac\xc9\ -\xec\x8e\x39\xd5\x9c\x6b\x9e\x61\xbe\xd9\xbc\xdb\xfc\x8d\x85\xa5\ -\x45\x9c\xc5\x4a\x8b\x36\x8b\xc7\x96\xda\x96\x7c\xcb\x05\x96\x4d\ -\x96\xf7\xac\x98\x56\x3e\x56\x79\x56\xf5\x56\xd7\xac\x49\xd6\x5c\ -\xeb\x2c\xeb\x6d\xd6\x57\x6c\x50\x1b\x57\x9b\x0c\x9b\x3a\x9b\xcb\ -\xb6\xa8\xad\x9b\xad\xc4\x76\x9b\x6d\xdf\x14\xe2\x14\x8f\x29\xd2\ -\x29\xf5\x53\x6e\xda\x31\xec\xfc\xec\x0a\xec\x9a\xec\x06\xed\x39\ -\xf6\x61\xf6\x25\xf6\x6d\xf6\xcf\x1d\xcc\x1c\x12\x1d\xd6\x3b\x74\ -\x3b\x7c\x72\x74\x75\xcc\x76\x6c\x70\xbc\xeb\xa4\xe1\x34\xc3\xa9\ -\xc4\xa9\xc3\xe9\x57\x67\x1b\x67\xa1\x73\x9d\xf3\x35\x17\xa6\x4b\ -\x90\xcb\x12\x97\x76\x97\x17\x53\x6d\xa7\x8a\xa7\x6e\x9f\x7a\xcb\ -\x95\xe5\x1a\xee\xba\xd2\xb5\xd3\xf5\xa3\x9b\xbb\x9b\xdc\xad\xd9\ -\x6d\xd4\xdd\xcc\x3d\xc5\x7d\xab\xfb\x4d\x2e\x9b\x1b\xc9\x5d\xc3\ -\x3d\xef\x41\xf4\xf0\xf7\x58\xe2\x71\xcc\xe3\x9d\xa7\x9b\xa7\xc2\ -\xf3\x90\xe7\x2f\x5e\x76\x5e\x59\x5e\xfb\xbd\x1e\x4f\xb3\x9c\x26\ -\x9e\xd6\x30\x6d\xc8\xdb\xc4\x5b\xe0\xbd\xcb\x7b\x60\x3a\x3e\x3d\ -\x65\xfa\xce\xe9\x03\x3e\xc6\x3e\x02\x9f\x7a\x9f\x87\xbe\xa6\xbe\ -\x22\xdf\x3d\xbe\x23\x7e\xd6\x7e\x99\x7e\x07\xfc\x9e\xfb\x3b\xfa\ -\xcb\xfd\x8f\xf8\xbf\xe1\x79\xf2\x16\xf1\x4e\x05\x60\x01\xc1\x01\ -\xe5\x01\xbd\x81\x1a\x81\xb3\x03\x6b\x03\x1f\x04\x99\x04\xa5\x07\ -\x35\x05\x8d\x05\xbb\x06\x2f\x0c\x3e\x15\x42\x0c\x09\x0d\x59\x1f\ -\x72\x93\x6f\xc0\x17\xf2\x1b\xf9\x63\x33\xdc\x67\x2c\x9a\xd1\x15\ -\xca\x08\x9d\x15\x5a\x1b\xfa\x30\xcc\x26\x4c\x1e\xd6\x11\x8e\x86\ -\xcf\x08\xdf\x10\x7e\x6f\xa6\xf9\x4c\xe9\xcc\xb6\x08\x88\xe0\x47\ -\x6c\x88\xb8\x1f\x69\x19\x99\x17\xf9\x7d\x14\x29\x2a\x32\xaa\x2e\ -\xea\x51\xb4\x53\x74\x71\x74\xf7\x2c\xd6\xac\xe4\x59\xfb\x67\xbd\ -\x8e\xf1\x8f\xa9\x8c\xb9\x3b\xdb\x6a\xb6\x72\x76\x67\xac\x6a\x6c\ -\x52\x6c\x63\xec\x9b\xb8\x80\xb8\xaa\xb8\x81\x78\x87\xf8\x45\xf1\ -\x97\x12\x74\x13\x24\x09\xed\x89\xe4\xc4\xd8\xc4\x3d\x89\xe3\x73\ -\x02\xe7\x6c\x9a\x33\x9c\xe4\x9a\x54\x96\x74\x63\xae\xe5\xdc\xa2\ -\xb9\x17\xe6\xe9\xce\xcb\x9e\x77\x3c\x59\x35\x59\x90\x7c\x38\x85\ -\x98\x12\x97\xb2\x3f\xe5\x83\x20\x42\x50\x2f\x18\x4f\xe5\xa7\x6e\ -\x4d\x1d\x13\xf2\x84\x9b\x85\x4f\x45\xbe\xa2\x8d\xa2\x51\xb1\xb7\ -\xb8\x4a\x3c\x92\xe6\x9d\x56\x95\xf6\x38\xdd\x3b\x7d\x43\xfa\x68\ -\x86\x4f\x46\x75\xc6\x33\x09\x4f\x52\x2b\x79\x91\x19\x92\xb9\x23\ -\xf3\x4d\x56\x44\xd6\xde\xac\xcf\xd9\x71\xd9\x2d\x39\x94\x9c\x94\ -\x9c\xa3\x52\x0d\x69\x96\xb4\x2b\xd7\x30\xb7\x28\xb7\x4f\x66\x2b\ -\x2b\x93\x0d\xe4\x79\xe6\x6d\xca\x1b\x93\x87\xca\xf7\xe4\x23\xf9\ -\x73\xf3\xdb\x15\x6c\x85\x4c\xd1\xa3\xb4\x52\xae\x50\x0e\x16\x4c\ -\x2f\xa8\x2b\x78\x5b\x18\x5b\x78\xb8\x48\xbd\x48\x5a\xd4\x33\xdf\ -\x66\xfe\xea\xf9\x23\x0b\x82\x16\x7c\xbd\x90\xb0\x50\xb8\xb0\xb3\ -\xd8\xb8\x78\x59\xf1\xe0\x22\xbf\x45\xbb\x16\x23\x8b\x53\x17\x77\ -\x2e\x31\x5d\x52\xba\x64\x78\x69\xf0\xd2\x7d\xcb\x68\xcb\xb2\x96\ -\xfd\x50\xe2\x58\x52\x55\xf2\x6a\x79\xdc\xf2\x8e\x52\x83\xd2\xa5\ -\xa5\x43\x2b\x82\x57\x34\x95\xa9\x94\xc9\xcb\x6e\xae\xf4\x5a\xb9\ -\x63\x15\x61\x95\x64\x55\xef\x6a\x97\xd5\x5b\x56\x7f\x2a\x17\x95\ -\x5f\xac\x70\xac\xa8\xae\xf8\xb0\x46\xb8\xe6\xe2\x57\x4e\x5f\xd5\ -\x7c\xf5\x79\x6d\xda\xda\xde\x4a\xb7\xca\xed\xeb\x48\xeb\xa4\xeb\ -\x6e\xac\xf7\x59\xbf\xaf\x4a\xbd\x6a\x41\xd5\xd0\x86\xf0\x0d\xad\ -\x1b\xf1\x8d\xe5\x1b\x5f\x6d\x4a\xde\x74\xa1\x7a\x6a\xf5\x8e\xcd\ -\xb4\xcd\xca\xcd\x03\x35\x61\x35\xed\x5b\xcc\xb6\xac\xdb\xf2\xa1\ -\x36\xa3\xf6\x7a\x9d\x7f\x5d\xcb\x56\xfd\xad\xab\xb7\xbe\xd9\x26\ -\xda\xd6\xbf\xdd\x77\x7b\xf3\x0e\x83\x1d\x15\x3b\xde\xef\x94\xec\ -\xbc\xb5\x2b\x78\x57\x6b\xbd\x45\x7d\xf5\x6e\xd2\xee\x82\xdd\x8f\ -\x1a\x62\x1b\xba\xbf\xe6\x7e\xdd\xb8\x47\x77\x4f\xc5\x9e\x8f\x7b\ -\xa5\x7b\x07\xf6\x45\xef\xeb\x6a\x74\x6f\x6c\xdc\xaf\xbf\xbf\xb2\ -\x09\x6d\x52\x36\x8d\x1e\x48\x3a\x70\xe5\x9b\x80\x6f\xda\x9b\xed\ -\x9a\x77\xb5\x70\x5a\x2a\x0e\xc2\x41\xe5\xc1\x27\xdf\xa6\x7c\x7b\ -\xe3\x50\xe8\xa1\xce\xc3\xdc\xc3\xcd\xdf\x99\x7f\xb7\xf5\x08\xeb\ -\x48\x79\x2b\xd2\x3a\xbf\x75\xac\x2d\xa3\x6d\xa0\x3d\xa1\xbd\xef\ -\xe8\x8c\xa3\x9d\x1d\x5e\x1d\x47\xbe\xb7\xff\x7e\xef\x31\xe3\x63\ -\x75\xc7\x35\x8f\x57\x9e\xa0\x9d\x28\x3d\xf1\xf9\xe4\x82\x93\xe3\ -\xa7\x64\xa7\x9e\x9d\x4e\x3f\x3d\xd4\x99\xdc\x79\xf7\x4c\xfc\x99\ -\x6b\x5d\x51\x5d\xbd\x67\x43\xcf\x9e\x3f\x17\x74\xee\x4c\xb7\x5f\ -\xf7\xc9\xf3\xde\xe7\x8f\x5d\xf0\xbc\x70\xf4\x22\xf7\x62\xdb\x25\ -\xb7\x4b\xad\x3d\xae\x3d\x47\x7e\x70\xfd\xe1\x48\xaf\x5b\x6f\xeb\ -\x65\xf7\xcb\xed\x57\x3c\xae\x74\xf4\x4d\xeb\x3b\xd1\xef\xd3\x7f\ -\xfa\x6a\xc0\xd5\x73\xd7\xf8\xd7\x2e\x5d\x9f\x79\xbd\xef\xc6\xec\ -\x1b\xb7\x6e\x26\xdd\x1c\xb8\x25\xba\xf5\xf8\x76\xf6\xed\x17\x77\ -\x0a\xee\x4c\xdc\x5d\x7a\x8f\x78\xaf\xfc\xbe\xda\xfd\xea\x07\xfa\ -\x0f\xea\x7f\xb4\xfe\xb1\x65\xc0\x6d\xe0\xf8\x60\xc0\x60\xcf\xc3\ -\x59\x0f\xef\x0e\x09\x87\x9e\xfe\x94\xff\xd3\x87\xe1\xd2\x47\xcc\ -\x47\xd5\x23\x46\x23\x8d\x8f\x9d\x1f\x1f\x1b\x0d\x1a\xbd\xf2\x64\ -\xce\x93\xe1\xa7\xb2\xa7\x13\xcf\xca\x7e\x56\xff\x79\xeb\x73\xab\ -\xe7\xdf\xfd\xe2\xfb\x4b\xcf\x58\xfc\xd8\xf0\x0b\xf9\x8b\xcf\xbf\ -\xae\x79\xa9\xf3\x72\xef\xab\xa9\xaf\x3a\xc7\x23\xc7\x1f\xbc\xce\ -\x79\x3d\xf1\xa6\xfc\xad\xce\xdb\x7d\xef\xb8\xef\xba\xdf\xc7\xbd\ -\x1f\x99\x28\xfc\x40\xfe\x50\xf3\xd1\xfa\x63\xc7\xa7\xd0\x4f\xf7\ -\x3e\xe7\x7c\xfe\xfc\x2f\xf7\x84\xf3\xfb\x25\xd2\x9f\x33\x00\x00\ -\x00\x04\x67\x41\x4d\x41\x00\x00\xb1\x8e\x7c\xfb\x51\x93\x00\x00\ -\x00\x20\x63\x48\x52\x4d\x00\x00\x7a\x25\x00\x00\x80\x83\x00\x00\ -\xf9\xff\x00\x00\x80\xe9\x00\x00\x75\x30\x00\x00\xea\x60\x00\x00\ -\x3a\x98\x00\x00\x17\x6f\x92\x5f\xc5\x46\x00\x00\x0a\x56\x49\x44\ -\x41\x54\x78\xda\xec\x9a\x6b\x6c\x14\xd7\x15\xc7\x7f\x33\xb3\xeb\ -\xf5\x7a\xfd\xc0\x6f\xb0\xcd\xc3\x84\xe0\x10\xf3\x34\x06\x63\xb1\ -\x89\x49\x08\xaf\x24\x6a\x90\x5a\xa9\x95\xd5\x28\x54\x55\x1e\x9b\ -\x54\x45\x45\x72\x55\xea\x94\x48\x29\x91\x22\x55\x54\x91\x9a\x60\ -\x91\xa7\x4b\xa3\x56\xfd\xd2\xb4\x88\xa8\x51\x93\x94\x84\xa6\x09\ -\xa5\x21\x69\x42\x09\x14\x08\x84\x57\x8c\x8d\x0d\xf6\x7a\xd7\xbb\ -\x3b\x33\x77\x6e\x3f\xcc\xdd\x97\x1f\x24\x06\x43\x1a\xa9\x23\x1d\ -\xdd\xbb\x73\xcf\x39\xf7\xfc\xcf\x39\xf7\x39\xab\x49\x29\xf9\x3a\ -\x3f\x3a\x5f\xf3\xe7\xff\x00\xbe\xea\xc7\x73\x2d\x94\x76\x6c\xc8\ -\x6f\x05\x42\x80\x01\xbc\x0a\x74\x84\x3a\x23\x17\xaf\x45\x5f\xda\ -\x44\x0f\xe2\x8e\x0d\xf9\xdb\xe7\x2c\x5b\x10\x5a\x74\xc7\x9d\x68\ -\xba\xce\xe9\xc3\x1f\xb3\xef\x4f\xaf\x61\x99\xd6\x83\xa1\xce\xc8\ -\xb3\x13\x8e\x40\x4a\x39\x61\xb4\xfd\xbe\xc0\x53\xef\xff\xee\x2e\ -\x29\xa3\xfb\xa5\x8c\x7d\x22\x65\xec\xb0\x94\xd1\x0f\xe5\xe0\xa9\ -\x67\xe4\x8b\xa1\x32\xb9\xfd\xbe\x40\x70\x22\xfb\x93\x52\x4e\xdc\ -\x18\xe8\xd8\x90\xdf\x5a\x35\xa3\x66\x63\xc3\x5d\x9b\x41\x2f\x06\ -\x2d\xcf\x25\xa3\x98\xfc\xf2\x16\xd6\xde\xff\x20\x2a\xad\xfe\x67\ -\x07\x71\x68\xc5\x7d\x3f\x44\xf3\x54\x80\xec\x02\xeb\x55\xb0\x76\ -\x83\xf8\x18\xf4\x7c\xa6\xd4\x7d\x87\x99\xf3\x6f\x6c\xed\xd8\x90\ -\xff\xc0\x84\x0f\xe2\x68\x34\x7a\x55\x4a\x76\x3e\x52\xb9\x69\xfe\ -\xad\x4b\x82\x45\x95\xb7\x80\x73\x12\xac\x3d\x19\xbe\x39\x07\xfa\ -\xa7\xe0\x59\x4d\xf0\x5b\x3f\xe2\xc4\xc7\x0f\x87\xa2\xd1\xe8\x55\ -\x8f\x85\x40\x20\x90\x06\xd0\xdf\xdf\x7f\xc5\x8a\x76\xb5\xd7\xe5\ -\x18\x1e\x63\x5b\xc3\x9a\x87\x41\x44\xc1\xfc\x2b\x20\xb2\x99\xc4\ -\x39\x90\xfb\x08\x14\xcf\x67\xe1\x8a\xe6\x85\x3b\x1f\xa9\x6c\xff\ -\xc6\x13\xff\x79\x62\xc2\x00\xf4\xf5\xf5\x5d\x8d\xae\x2d\x4b\xd6\ -\xac\xc2\x5f\x50\x03\x89\xbd\xe0\x24\x46\xe7\x12\x07\xc1\x37\x83\ -\x86\xd5\x0f\x73\x78\xdf\x81\xad\xbb\xda\xeb\x9e\x5d\xbe\xe9\xdd\ -\x0b\x57\xda\x69\x75\x75\x75\x1a\x40\x4f\x4f\xcf\x15\x29\x39\xf6\ -\xf2\xfa\x5a\x7f\xc0\xdf\x3e\x77\xf9\xb7\xc1\xfe\x1c\xac\xcf\x40\ -\xbb\x8c\x40\xe2\x6f\xf8\x02\x2d\x2c\x59\xbb\x96\x77\xfe\xb8\xab\ -\xad\xa7\xa7\xe7\xc7\x13\x32\x06\x2e\x5c\xb8\x62\x47\x6c\x6c\x5a\ -\x77\x17\x5e\x7f\x3e\xc4\xde\x00\x19\x77\x73\x7f\x34\x10\x12\x10\ -\xa7\x40\x3f\xcf\x9c\x65\x77\xf3\xd1\x5b\x6f\xb7\x1d\x7b\x79\xfd\ -\xae\x49\x6b\x9e\x7b\xe7\xaa\x01\xf4\xf6\xf6\x8e\x5f\xf0\xc0\xe6\ -\x60\x71\x45\xc9\xc6\xba\xc6\x15\xae\xe7\xad\x6e\xd7\xf0\xcb\x45\ -\x40\x02\xb1\xb7\xf0\xe4\xad\x25\x78\xcf\x37\xf9\xf3\xaf\x5f\x0c\ -\xf5\xf6\xf6\x5e\x3d\x80\x8b\x17\xc7\xbf\xca\x57\x40\x68\xe9\xea\ -\x3b\xd1\x0d\x1f\x44\x5e\x07\xe2\x0a\x80\x36\x76\x04\xa4\x04\x19\ -\x03\xf3\x28\xd3\xe7\x2c\xa0\xa2\xa6\xaa\xb5\xe7\xc0\xe6\x57\x7b\ -\x6a\xdb\x7e\x7b\x55\x00\xc2\xe1\xf0\xb8\x84\x66\xf5\xed\x68\x9d\ -\x3c\x7d\x7a\xeb\xcc\x79\x4b\x21\x71\x08\xc4\x80\xbb\xeb\x91\xc9\ -\x08\x8c\x81\x20\xb9\x6b\x19\x7a\x0f\xad\x60\x3d\xc1\x7b\xd6\xf3\ -\x87\x67\xb6\x87\xc2\xe1\xf0\xd5\x01\x48\x24\x12\xe3\x5e\xb4\x9a\ -\xd7\xad\x01\x99\x80\xd8\x7e\xd0\x1d\xd7\x38\x1d\x90\x1a\x47\x8e\ -\x84\x79\xe1\xb9\xe3\x0c\x0d\xd9\x34\x34\x94\xf0\xfd\xfb\x67\x29\ -\x70\x12\x1c\xdc\x68\xc5\xfe\x49\xe5\x8c\x25\xdc\xb8\x60\x5e\x90\ -\x8f\x76\x6c\x3a\x94\xbf\xe1\x97\xd7\x65\x25\xae\x8f\x74\x6e\x9a\ -\x35\xaf\x3e\x38\x79\xe6\x5c\x88\x7f\x00\x0c\xa9\xf4\x89\xbb\xa5\ -\x11\x67\xf7\xee\x2e\x7c\xba\x43\x49\x81\xce\xd1\xc3\x97\xf8\xe0\ -\x5f\xdd\x60\xc4\xb3\xf9\xcc\x8f\xc0\x19\xa4\x69\xcd\x3a\x74\xc3\ -\xd8\x56\x1f\xe9\x2c\xba\xe6\x00\xea\x23\x9d\x39\xba\x61\x6c\x6b\ -\x5a\xb7\x16\x44\x0f\x98\x1f\x82\x96\x70\x89\x04\x18\x26\x90\xa0\ -\xaf\x2b\x8c\xa6\xb2\x28\xc7\xa3\x91\x30\x8b\xb2\xda\x5d\x99\x38\ -\x0c\xbd\x49\x41\xd9\x34\x16\xb5\x2c\x07\x68\xbf\x1e\x11\xd8\x32\ -\x77\x59\x23\x85\xa5\x35\x10\x79\x5b\x2d\x5a\x71\xd7\x28\x3d\x91\ -\xf2\x70\xf9\xe4\xb2\x61\xbd\x68\x69\xcf\xeb\x0a\x2c\x71\x48\x1c\ -\x07\xf3\x38\x8b\x5a\xee\xc0\xe7\xf7\xb7\xd5\x47\x3a\xe7\x5d\x33\ -\x00\xf5\x91\xce\xda\x9c\x5c\x7f\x7b\xe3\xca\xdb\x21\x71\x04\xec\ -\xa3\xa0\x0d\x01\x31\x55\xaa\xba\x1e\x23\xd7\x9f\x93\x25\x5b\x5a\ -\xe1\x05\x3d\xe6\xb6\x33\x94\x2d\x17\x7d\x03\xaf\x2f\xc0\xb2\xb5\ -\xb7\x5f\xd1\x6e\x75\x3c\x11\xd8\xb8\xb8\xa5\x19\x9f\xbf\x00\x22\ -\x6f\x82\x34\x01\x95\x12\x24\x40\x33\xc1\x70\x23\x31\xa9\x2c\x3f\ -\x4b\xd0\xef\x0f\xbb\x9e\x37\x14\x5f\x52\x06\xd3\xdd\x27\xc5\xf6\ -\x31\xa7\xb1\x89\xd2\x29\x95\xa1\xfa\x48\x67\xeb\x84\x03\xa8\x8f\ -\x74\x06\x0b\x8b\x8b\x37\xce\x0f\x2e\x85\xd8\x3f\x40\x74\xa5\x01\ -\x48\xd3\x35\x4a\x26\x52\x54\x5c\xe6\xcd\x8e\x40\x79\x76\xbb\xcb\ -\x9f\x21\x1f\x7d\x1d\x4d\x13\xdc\x72\xf7\xea\x71\x47\xe1\xcb\x46\ -\x20\xd4\xb8\xa2\x19\x5d\xb7\x60\xf0\x4d\xb5\x65\x88\x8f\x2c\x15\ -\x15\x97\xa6\x8f\xa9\xfe\x80\x9f\x3c\x7f\x77\x56\xfb\x08\x39\x67\ -\x10\xc2\x7f\x61\x4a\xed\x34\x66\xce\x99\x1d\xac\x8f\x74\x6e\x1a\ -\x17\x00\x5d\xd7\xc7\xa4\xfa\x48\xe7\xbd\xe5\xd5\x35\xad\xb3\x17\ -\xcf\xc1\x19\x78\x07\xc7\x0e\x23\x1d\xcb\x25\x69\x65\xd7\x15\x15\ -\x97\xa6\xd7\x95\x29\xd3\x2a\x91\x4e\x38\xab\x7d\x34\x79\x27\xfa\ -\x1e\xd2\xec\xa6\x69\x75\x30\x35\xad\x5e\xce\xae\x2f\x0d\x00\x08\ -\x35\xad\x5a\x86\xb4\x2e\x22\x06\xdf\x45\x3a\x36\x8e\x63\xe3\x48\ -\x45\xb8\x24\xb1\x91\xd2\xa5\xea\xa9\xe9\x03\x52\x51\xa9\x81\x74\ -\xd2\x6d\x92\xb4\x4c\x4a\x87\x63\x23\x1d\x13\xfb\xe2\x6e\x0a\xcb\ -\x26\x51\xbf\xa4\x01\xa0\xfd\x4b\x03\x30\x0c\x63\x54\xaa\xeb\x7f\ -\xbe\x7d\xda\xec\xba\xe6\xaa\xda\x72\xec\x4b\x6f\x23\x6d\x13\x21\ -\x04\x42\x0a\x84\x23\x90\xd2\x25\x1c\x81\x14\x02\x69\xbb\xa5\xdf\ -\x7b\x16\x7f\x5e\x2e\x00\xc5\x25\x1a\x72\x58\x3b\x19\xb2\xc2\x51\ -\xfa\x84\x40\xc6\x4e\xe2\x44\x0f\xd1\xb0\x72\x01\xfe\xfc\x82\xb6\ -\xba\xfe\xe7\x83\x63\xd9\xf6\x85\x00\x66\xf5\xed\x28\xf2\x78\x73\ -\xb6\x36\xaf\x5d\x84\x1c\x3a\x83\x13\x3e\x08\xd2\x01\xcd\x71\x4b\ -\xe9\x20\x45\x06\x39\x8a\x84\x83\x14\x51\xa6\x4c\xaf\x04\xc0\xe7\ -\x4b\xa4\xdf\x67\xf1\xb8\x94\xd4\x95\xd4\xeb\xf4\xee\xc1\xe7\xd1\ -\x69\xbc\x75\x29\x40\xe8\x8a\x01\x00\xed\x37\xce\xbd\x99\x82\x42\ -\x3f\x89\x9e\xbd\x08\x07\x2c\x01\x8e\x05\x8e\x00\xe5\xf8\x54\x99\ -\xac\x4b\x01\xd2\x82\xca\x6a\x3f\x00\x55\xd5\x06\xd2\x4a\xb7\x39\ -\x62\x0c\x79\xcb\xd5\x6f\x99\x97\xb0\xfa\xf6\x53\xd7\x30\x8d\xc2\ -\x92\x8a\xd6\xda\x9e\xed\xad\xe3\x06\x30\xad\xeb\x57\xcd\xb9\x79\ -\xf9\x6d\x8b\x5b\x6e\xc0\xee\x3f\x8c\x13\xe9\xc2\xb1\x5d\x47\x09\ -\x07\x84\x3d\x92\x1c\xcb\x2d\xa5\x22\x9f\x37\xe6\x1e\xfd\x2a\x7b\ -\x53\xef\x32\xf9\x46\x90\x0a\x84\x63\x83\xd5\xb3\x1f\x61\x0d\xb0\ -\xf4\xf6\x85\x63\x46\xe1\xb2\x00\x80\xd0\xdc\xa5\xf3\xf0\xe4\x08\ -\xcc\xf3\xef\x21\x1c\xe5\x25\x3b\x4d\xc2\x4e\x7b\xd3\xb1\xd3\xa5\ -\xb0\x5c\x0a\xde\x56\xc2\x63\xdb\x1f\xc5\x8e\x9f\x4d\xbd\xcb\xe4\ -\x4b\xca\x0a\x3b\x5b\xaf\x23\x40\x08\x0b\xf3\xfc\xbb\x4c\x9d\x35\ -\x89\xea\x19\xb3\x82\xd5\x67\x9f\x6a\x1f\x0b\x80\x27\x09\x60\xcb\ -\x96\x2d\xa9\x0b\xaa\x40\x51\xd9\xbd\x73\x16\x95\x61\xf5\x1c\xc2\ -\x4e\x0c\xa1\x1b\xee\x16\x5f\x6a\xee\x8e\x38\xb5\xe5\x17\xea\x0c\ -\x60\xb8\x67\x15\x4d\x57\x3c\x3a\x88\xfe\x3d\x88\xfe\x3d\xe9\xd3\ -\x80\xa3\x8e\x04\x0e\xee\x96\x5a\xa4\xd3\x1f\xa1\x22\x97\xac\x0b\ -\xb0\x2e\x7e\x8a\x51\x74\x13\x4d\x2b\x6f\x60\xd7\x6f\xce\x6d\x9d\ -\x7c\x6a\xdb\xae\x50\x67\xe4\x20\xc0\xe3\x8f\x3f\x3e\x32\x02\x59\ -\x8b\xd6\xad\xb3\x91\x76\x98\xf8\xf9\x7f\xa7\xbc\x9d\x0a\xbf\xf2\ -\x9a\x34\xc1\x31\xd5\x98\x50\x75\x61\xb9\xbf\x2f\x74\xeb\xec\x78\ -\x3e\x8f\xb6\xcd\x85\xec\x7c\xd9\x8f\x50\x7c\x22\x83\x37\x29\x27\ -\x4d\xa5\x5f\x64\xa7\x97\x63\x43\xfc\xf4\x7e\x02\x45\x5e\x6e\x9a\ -\x7f\x73\xd6\x0a\x3d\x6a\x0a\x29\xef\x6f\x2a\xab\x98\x1e\x9c\x5e\ -\x9b\x4b\xe2\xdc\x41\xa4\x65\x67\xa7\x89\xca\x65\x27\xa3\x93\xa4\ -\xd1\xc9\xc1\xeb\xd8\xf0\xca\xee\x02\xba\xbb\xbc\x94\x14\xe8\x9c\ -\x3c\x91\xc3\x9e\xbd\x3e\x57\x56\xf1\x39\x19\x29\x25\x86\xe9\xcd\ -\x4c\x2f\x7b\xf0\x02\x76\xef\x71\x16\x36\x17\x92\x57\x50\x1a\x52\ -\xb7\xde\xa3\x03\xe8\xd8\x90\x9f\xaf\xe9\xc6\xb6\xc6\x96\x4a\xcc\ -\xa1\x0b\xc4\x7b\xcf\x62\x59\x60\xdb\x19\x64\x81\x65\x66\x78\x2a\ -\xc3\x08\xdb\x4c\x47\xe9\xfc\xe7\xe0\x35\xb4\xd4\x79\xe0\xcc\xb9\ -\xf2\x94\x4c\x8a\x2f\x39\x5e\x94\x8c\x65\xba\xfa\x33\xfb\xb3\x2c\ -\x88\x9e\xf9\x04\x61\x0f\xd1\xb0\xbc\x36\x15\x85\x11\x00\xd4\xca\ -\xd6\x36\x65\xea\x4c\x8a\x2b\x0c\x86\x4e\x1c\x46\x58\xd2\x9d\xe6\ -\x92\x33\x8b\x48\xe7\xaf\x10\xe9\xce\x6d\x2b\x23\xfc\xa6\x6b\xe0\ -\xec\x9b\x66\x66\xed\x57\x6a\xa6\xd7\xb8\x86\x9b\xe9\x34\xb4\x33\ -\x9c\x20\x84\xab\x57\x3a\xaa\x9f\x64\x44\x04\xd8\xf1\x18\xf1\x33\ -\x47\x99\x7a\x83\x97\x8a\xaa\x99\xc1\x8e\x0d\xf9\x5b\x47\xac\xc4\ -\x79\x07\x1f\xf3\x6b\xba\x67\xcb\xc2\x60\x2e\x66\xcf\x29\x62\xfd\ -\x03\xae\x17\x44\xb6\x37\x6c\x4b\x95\x2a\xdf\x53\x46\x28\xef\x25\ -\x73\x7b\xd5\x9a\x9b\x99\x5c\x3d\x05\x80\x19\xb3\x6a\x69\x5a\x5c\ -\x94\xca\x79\x5b\x01\x4d\x81\x57\xfa\xb2\xf4\x27\xa3\xa0\xfa\x8f\ -\x74\x9d\xc3\x0a\xf7\xb0\x74\x65\x00\xdd\x93\xdb\x9e\x77\xf0\xb1\ -\xea\xe1\x5f\x68\x5a\x02\xfe\x72\x02\x7e\x9b\x81\xc3\xa7\x71\x4c\ -\xd0\x0c\x35\xab\xe8\x2e\x97\xa1\x83\xf0\xb8\x33\x8e\xa6\xa9\x52\ -\x57\x75\xdd\xad\x3b\xba\x3b\x3b\x79\xe4\x6b\x7c\xf7\x7b\xf7\x62\ -\xf8\x6b\xb0\x23\xc7\x18\x3a\xbd\x13\x69\xa7\x67\xa1\x64\x24\xa5\ -\xcc\x98\x79\xa4\x9a\xd5\xd4\x9a\x80\x9d\xe6\x95\x42\x32\x78\xf4\ -\x04\x85\xf3\xea\xa9\xaa\x99\xca\xd9\xcf\x8e\x85\x80\x47\x33\x01\ -\xd4\xfa\x72\x7d\x44\x4e\x9e\x21\x31\x90\x40\xf7\xba\x9d\xe9\x1e\ -\x05\x44\x03\xa1\xb9\xe1\xd2\xa4\x3b\x55\xa6\x6e\x4a\x92\x53\xab\ -\x54\x46\x48\x10\x89\x3e\x22\xc7\x9e\xca\xba\x12\x72\x6f\x23\x94\ -\x4c\xf2\x86\x25\xe3\xa6\x25\x59\x77\xd4\x74\x2d\x35\xa5\xcb\x76\ -\x81\xc5\x7b\x23\x78\xcf\x9c\xa1\x6a\x6a\x39\x67\x3f\x63\xd5\x70\ -\x00\x11\xd3\xb4\x18\xfc\xb4\xd7\xf5\x8c\x3a\xc6\x3a\x1a\x18\x06\ -\x68\xde\xb4\xc7\x93\x11\xd0\xd4\xda\x80\xe6\xf2\xa2\xbc\xaf\x8d\ -\x72\x3b\xa7\xa9\x64\x95\xea\xea\x45\x77\xc0\x51\x60\x35\xe9\x46\ -\x59\x4a\xd0\x84\xd2\x2f\x14\x18\x15\x19\x47\x0d\xf4\xfe\xa3\xdd\ -\x44\x8b\x8a\x01\x06\x86\xa7\xd0\xae\xc8\x50\x37\x17\xa5\xa0\x30\ -\x1f\x0c\xe5\x59\xc3\xa3\xbc\xa5\x81\x6e\x80\xf4\xa4\x53\x46\x66\ -\x80\x90\x5a\xda\xf8\x64\x74\x52\x8b\xdd\x70\x2f\xa7\xee\x8f\xd4\ -\x6f\xa1\xf8\x1c\x17\x88\x6e\x83\x90\xe9\x74\x13\xb6\x5a\x63\x4c\ -\x30\xe3\x82\x23\xa7\xba\x00\x3a\xb2\x00\x88\xc6\x27\x07\x3c\x07\ -\x7e\xfa\xb3\x4f\x22\xbe\x9f\x97\x85\x4d\xaa\x26\x49\x0a\x4a\xfd\ -\x78\x73\x4b\xd0\x73\x35\x0c\xaf\xa6\xa2\xa0\xa5\xc7\x80\x5a\x71\ -\xc9\xf0\x7e\x96\xc7\x33\x7f\x67\x82\x50\x40\x34\xb5\x32\x27\xc1\ -\xa4\x22\xa0\x81\xa1\x4b\x04\x12\x4d\x4a\x74\x47\x62\x85\xbb\x39\ -\xdb\xeb\x70\xce\xca\x41\x6a\x89\x5f\x88\xc6\x27\x5f\x19\xf1\x99\ -\xf5\xa1\x97\xc2\x4f\x3c\xf7\x40\xd9\xdf\x2f\x39\x56\x68\x20\x2e\ -\x6f\xf3\x9e\xd7\xca\x72\x2e\xc5\xf0\x7a\x35\x0c\x03\x74\x5d\x1b\ -\xfb\xd6\x70\xc2\xbe\x38\xa6\xaf\x50\x6d\x5b\x62\x0b\x89\x65\x81\ -\x99\xc8\xc3\x96\x72\xaf\xe6\xd1\x3b\x1e\x7a\x61\xe0\xf7\x4f\x3f\ -\xfd\xf4\xa8\xdf\x89\xe5\xfd\xcf\xf6\xbe\x05\xec\x55\xef\x3d\x40\ -\x2e\xe0\x03\xbc\xca\x57\xd7\xe3\xc3\x78\x72\xb7\x64\x67\x5f\x7b\ -\x60\xab\xf7\x72\xc4\xdd\xa8\xf1\xfe\x4f\x80\x1f\x64\x2a\xb0\x33\ -\x14\x99\xe9\xe1\x7a\x4d\xfd\x9f\x35\x69\x0d\xb3\x43\x64\x1a\x9e\ -\x69\xaf\xe7\x32\x5e\x50\x43\x09\xfb\x3a\x1a\x9f\x75\x19\x3f\x0a\ -\x7d\xe1\x5f\x0d\x86\x33\x89\xcc\x71\xf9\x15\x3c\xf2\x32\xb6\x01\ -\xf0\xdf\x01\x00\x6d\xbe\xca\x6b\x94\x7f\xd6\xea\x00\x00\x00\x00\ -\x49\x45\x4e\x44\xae\x42\x60\x82\ -\x00\x00\x0c\x9c\ -\x89\ -\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ -\x00\x00\x30\x00\x00\x00\x30\x08\x06\x00\x00\x00\x57\x02\xf9\x87\ -\x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\ -\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x05\x31\x00\x00\x05\x31\ -\x01\xb7\xed\x28\x52\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\ -\x74\x77\x61\x72\x65\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\ -\x70\x65\x2e\x6f\x72\x67\x9b\xee\x3c\x1a\x00\x00\x0c\x19\x49\x44\ -\x41\x54\x68\x81\x9d\x99\x7b\x8c\x15\xd5\x1d\xc7\x3f\x67\x66\x2e\ -\xe8\x2a\x25\x48\xc1\xa5\x20\x2a\x01\x5c\x05\x71\x45\x0b\xcb\xc3\ -\xda\xb8\x96\x44\xdb\xc2\x0a\xd1\x8d\xa0\x8b\x0f\xda\x8a\x6f\x94\ -\x6a\xfa\x07\x58\xff\x6a\xb4\xa9\x0d\x88\xca\x23\x36\x54\xc5\x68\ -\xa5\xb1\x2d\x52\xa5\xb0\x60\x5b\x82\x8d\xc6\xb0\xab\x18\x50\xd8\ -\x16\x58\x1e\xae\x2f\x28\xec\xe3\xde\x3b\x73\xce\xe9\x1f\x73\xce\ -\xdc\x33\xb3\x77\x97\xdd\x4e\xf2\xcb\x9c\x39\x33\x73\xe6\xfb\xfd\ -\xbd\x67\x46\x68\xad\xe9\xef\x56\x2f\x84\xff\xf8\x73\xcf\xed\xbe\ -\x78\xda\xb4\x31\x68\x4d\x6a\x85\x9e\xd6\xb3\x0f\x12\x22\xb9\x46\ -\x4b\x09\xa0\xbf\xdc\xb7\xef\xc4\xb3\xcb\x97\x57\x3f\x77\xe8\xd0\ -\x89\xfe\x62\x11\xfd\x25\x50\x2f\x84\xd7\xb0\x70\xe1\xce\xcb\xc7\ -\x8e\x9d\xd2\x75\xf0\xa0\x8f\x10\x69\x9c\xc9\xca\xa2\xdb\xbd\xc2\ -\x9e\x0f\x43\x74\x18\x26\x44\x72\xe7\x9d\xc7\xd7\xe7\x9e\x7b\xf0\ -\xa5\x57\x5f\x9d\xdc\x5f\x12\xfd\x22\x50\x2f\x84\xb7\x60\xc1\x82\ -\x7f\x4c\xa8\xac\xac\x29\x1c\x39\xe2\x77\xbb\x53\x08\xca\xae\x26\ -\x04\x5a\x29\x74\x14\x25\xc0\x85\x21\x28\x8c\xe4\x86\x0d\xe3\xe4\ -\xf0\xe1\x07\x5f\xda\xb0\xa1\x5f\x24\xfa\x4c\xa0\x5e\x08\xef\xe6\ -\xb9\x73\xdf\xbd\x7c\xe8\xd0\x69\xd1\x89\x13\x81\xee\x01\xb0\x9d\ -\x4f\x8e\xb5\x46\x4b\x89\x0e\x43\xb4\x52\x09\x68\x17\x3c\x42\x20\ -\x80\x60\xc8\x10\xda\x2f\xbc\xf0\xe0\x86\xd7\x5e\x9b\xbc\x62\xff\ -\xfe\x3e\x91\xe8\x13\x81\x7a\x21\xbc\x1f\xd7\xd6\x36\x5e\x39\x7c\ -\xf8\x4c\x55\x28\x04\x09\x50\xd2\x2e\x93\x5d\x49\x49\x19\x83\x8f\ -\xa2\x54\x6c\xb8\xda\xcf\x12\x09\x06\x0d\x22\x7f\xe9\xa5\x87\x5e\ -\x7e\xe5\x95\x2b\xfb\x42\xe2\x8c\x04\xea\x85\xf0\x6a\x27\x4d\xda\ -\x52\x33\x66\xcc\xf7\xd1\x3a\xd0\x06\xb4\x30\x80\xdd\xbb\x13\xab\ -\x68\x8d\x8a\xa2\x12\x78\x33\xef\x82\x4e\x80\x67\x5c\x09\x20\xa8\ -\xa8\x20\x9a\x32\xe5\xf0\xfa\x75\xeb\xae\x58\xd9\xd2\x72\xf2\xff\ -\x26\x50\x2f\x84\x3f\x63\xf4\xe8\xcd\xdf\x9b\x38\xb1\x56\x7b\x5e\ -\xd0\x13\x68\xed\xba\x8c\x52\x31\x78\xa5\x6c\x96\xc9\x3c\x51\xa4\ -\x34\x5f\x8e\x88\x9f\xcb\x91\x1b\x34\x08\x39\x6d\xda\xd1\x17\x57\ -\xae\x9c\xd8\x1b\x89\x1e\x09\xd4\x0b\xe1\x4f\x1f\x3d\x7a\xf3\x35\ -\x97\x5d\x56\x8b\x10\x81\x7b\x4e\x1b\x22\x91\x10\xf8\x4e\x1a\x55\ -\x4a\xc5\xc0\x4d\xc0\xba\xa0\xbb\x3d\xd8\x21\xa3\x00\xdf\x1c\xfb\ -\x03\x07\x12\xe4\x72\x31\xa9\x20\x40\x5c\x7b\xed\xd1\xf5\xcf\x3f\ -\x7f\xf9\x33\x7b\xf7\x96\x75\x27\xaf\x47\xf0\xa3\x46\x6d\xbe\x66\ -\xfc\xf8\x5a\x2d\x65\xa0\xa2\x08\x25\x25\x4a\x4a\xa4\x94\xa8\x28\ -\xe2\x44\x75\x35\xa2\xa1\x81\xbc\xe7\xa1\x95\x22\x0a\x43\xa4\x91\ -\xa8\x50\x40\x29\x85\x52\x0a\xa9\x14\xd2\xdc\x27\xa5\x4c\xcd\x2b\ -\x29\xf9\xaa\xba\x9a\x13\x75\x75\x84\x41\x00\x41\x00\x9e\x57\xba\ -\xbe\x58\x44\x35\x36\x8e\xbc\x7d\xd1\xa2\x8f\x1e\xb9\xf4\xd2\x21\ -\x7d\xb2\x40\xbd\x10\xfe\xb4\x11\x23\x36\x5f\x53\x55\x55\xab\x3d\ -\x2f\x28\xe7\x32\xa7\xa7\x4c\xa1\x7a\xc9\x12\x3c\xdf\xa7\x65\xc7\ -\x0e\xda\xd7\xae\x25\x57\x2c\xa2\x01\x15\x86\xe9\x60\xee\x45\xfb\ -\xff\xbd\xfa\x6a\x2e\x5a\xb8\x10\x3f\x08\x38\xf2\xcf\x7f\x72\xf6\ -\xa6\x4d\x0c\xd4\x3a\xe5\x5a\x1e\xb1\x7b\x45\x35\x35\x87\x37\x6e\ -\xdc\x58\xfd\x74\x73\x73\xca\x12\x29\x02\x16\xfc\xcc\xf1\xe3\x6b\ -\x11\x22\x50\x38\x81\x69\xc6\x5d\x35\x35\x4c\x32\xe0\x21\x4e\x93\ -\x2d\xdb\xb7\x73\x7a\xcd\x1a\xbc\xce\x4e\xd0\x3a\x89\x89\x72\x75\ -\xc2\x6e\xed\x53\xa7\x32\xf6\xee\xbb\x11\x42\xa0\x4c\x7a\xfd\xfc\ -\xbd\xf7\x18\xf0\xe6\x9b\xe4\xa2\x08\x61\xdc\xcb\x95\xae\x89\x13\ -\x0f\x6e\xda\xb6\x6d\xb2\x4b\x22\x21\x50\x2f\x84\x37\xbd\xb2\x72\ -\xd3\x8c\x71\xe3\x66\x69\x08\xb4\x03\x5a\x99\x8b\xf3\x35\x35\x4c\ -\xfa\xf9\xcf\xf1\x0d\x78\x77\xdb\xb7\x65\x0b\x27\x57\xad\x22\x17\ -\x86\xc9\x9c\xce\x68\x5f\x1b\x20\x9d\x33\x66\x50\xf5\xd3\x9f\x26\ -\xe0\xa5\x13\xec\xc7\x77\xed\x22\xf7\xc7\x3f\x12\x44\x51\xca\x02\ -\x96\xc4\x37\x23\x46\xec\x6f\x6c\x6e\x9e\x6a\x49\x08\xad\x35\xf5\ -\x42\x78\x33\x2a\x2b\xff\x34\x7d\xcc\x98\x1b\xb4\x10\x81\x05\x6d\ -\x33\x8c\x06\xc2\xe9\xd3\x99\xb8\x74\x69\x1c\x60\x65\xdc\x42\x6b\ -\xcd\xde\xb7\xdf\xe6\xeb\x67\x9f\x4d\x48\x94\x73\xa5\xfc\xcc\x99\ -\x4c\xbc\xf7\xde\xe4\x1e\x4b\x40\x6b\x9d\xb4\x4b\x9f\xef\xda\x45\ -\xb0\x71\x63\x42\x22\x11\x43\xe4\xb8\xef\x7f\xb2\xbd\xa5\x65\xe6\ -\xca\x96\x96\x93\x1e\x40\xf5\xb0\x61\x2b\xa6\x8f\x1e\x7d\x83\x92\ -\x32\xd0\x4e\xc0\x6a\x13\xb0\xf9\xc9\x93\x99\xf0\xe8\xa3\xe4\x06\ -\x0c\x88\x17\x31\xe2\x79\x5e\xea\xf8\xb2\x1b\x6f\x64\xc8\xfd\xf7\ -\x93\xf7\xbc\x24\x58\xdd\x40\xce\xcf\x9c\x49\xf5\x83\x0f\x92\xcb\ -\xe5\xf0\x7d\x1f\xcf\xf3\x12\x71\x95\x52\x39\x7d\x3a\x85\xba\x3a\ -\x22\x29\xe3\x60\xb7\x62\x70\x55\x16\x8b\x13\xae\x1e\x3e\x7c\x13\ -\x40\x00\xf0\xad\x8a\x8a\x31\x5a\xa9\x24\x60\x13\x31\xda\x97\x07\ -\x0e\x70\xf2\xf0\x61\xce\x1f\x3f\x3e\x05\xd8\xd5\xbe\xdd\x5f\xfe\ -\xa3\x1f\xf1\x91\xd6\x7c\xb9\x62\x05\x41\xb1\x98\x68\x5f\x5e\x77\ -\x1d\x57\x2f\x59\xd2\xed\x7a\x57\x19\x00\x52\x4a\xa2\x30\xa4\x73\ -\xcf\x1e\x72\x26\x36\x6c\xe1\xb4\x96\xf0\x80\xc1\x15\x15\x83\x30\ -\x63\xb4\xd6\x5a\x3b\x39\xdc\x32\xd6\x86\xf1\x80\xb6\x36\x0e\x2c\ -\x5b\xc6\x17\xfb\xf7\xa7\x08\x94\xb3\x84\xe7\x79\x5c\x31\x7b\x36\ -\xc3\x1e\x7a\x88\x7c\x10\xc4\xda\xbf\xee\x3a\xa6\x2e\x5d\x4a\x10\ -\x04\xdd\x34\x9f\xb5\x82\x8c\x22\xfe\xbd\x76\x2d\xe7\xee\xde\x5d\ -\xb2\x5e\x26\x15\xcb\x18\xa7\x4c\x2c\x80\x75\x19\x21\x50\x94\x82\ -\xd6\x1d\xe7\x8e\x1e\x65\xef\x2f\x7e\x81\xff\xd4\x53\x54\x56\x55\ -\xf5\x18\x07\xd6\xaf\xaf\x98\x3d\x1b\x0d\x7c\xd5\xd4\xc4\xcc\xc7\ -\x1e\x4b\x02\x56\x29\x95\x10\x75\x2d\xa1\x4c\x2d\x39\xb0\x7a\x35\ -\xe7\xec\xde\x8d\x04\x84\x94\xb1\xc6\x9d\x2a\x6d\xc7\xca\x8f\x9b\ -\xe1\x00\x4a\x15\xd4\x4d\x9b\x16\xbc\xd6\x3a\xf6\x3d\x60\xc0\xb1\ -\x63\x7c\xbc\x74\x29\xe2\x99\x67\x18\x51\x55\x65\xbc\x43\xa4\xdc\ -\xc2\x5a\x42\x29\xc5\x95\x73\xe6\xa0\x67\xcf\x4e\x0a\x98\x4b\x5a\ -\x29\x95\x90\xf0\x3c\x8f\x62\xb1\xc8\xde\x55\xab\x38\xeb\xc3\x0f\ -\x89\x84\x88\xb3\x8f\x71\x11\xe5\x8c\xad\x5b\x2b\x93\xb9\x3c\xf3\ -\x74\xa5\xa5\x04\x1b\xb8\x4e\x17\xa9\xc2\xb0\x44\x50\x4a\x82\x63\ -\xc7\x68\x5a\xb2\x84\xb6\xfd\xfb\xbb\xb9\x80\x75\x0f\xab\x61\x77\ -\xec\xfb\x3e\x42\x88\xd4\x35\xf6\x5c\x58\x2c\xb2\x67\xc5\x0a\x72\ -\x1f\x7c\x90\x0a\xfc\xc8\x48\xe2\x46\xc6\x52\x26\xa0\x75\x3a\x06\ -\xa2\x08\xdb\x32\x10\x45\x09\x78\x6d\xc7\x96\x94\x94\xf8\x47\x8f\ -\xf2\xc1\x7d\xf7\x71\x7c\xdf\xbe\x14\x10\x97\x88\x05\x6a\xc7\x16\ -\xbc\xbd\xde\x8e\xa3\x30\xe4\xc3\x5f\xff\x1a\xb5\x6b\x57\x02\x38\ -\x92\x32\xc9\x40\x2e\x09\xe5\xc4\x80\x34\xbd\x56\x4c\xc0\x09\x60\ -\x1b\x0f\x32\x0c\x63\x6b\x38\x01\x6d\xad\xa3\xa4\xc4\x6b\x6d\xe5\ -\x5f\x8b\x17\x73\xfc\xd3\x4f\x7b\x0c\x4a\x57\xd3\x16\xb0\x6b\x0d\ -\x19\x45\xec\xfa\xd5\xaf\x50\x3b\x77\xa2\xa2\x28\x06\xee\x80\x8e\ -\x6c\xff\x64\x70\x44\x6e\x3a\x55\x4a\xbb\x2e\xa4\xb5\x94\x60\x5d\ -\x25\x8a\x12\x77\xd2\x52\x96\xcd\x4e\x3a\x8a\xf0\x5a\x5b\xd9\xf9\ -\x93\x9f\xd0\xfa\xc9\x27\xf1\xbc\x49\x8b\xbd\x59\xc3\xce\xcb\x28\ -\xe2\xef\x4f\x3e\x49\xf8\xee\xbb\x44\x52\x52\x8c\x22\xa2\x28\x2a\ -\x35\x85\xc6\x23\x64\x14\xc5\x5a\xb7\xc7\x25\x52\x3a\x65\x01\x4c\ -\x0b\x9c\xb8\x8d\x03\xb8\x1b\x19\x6b\x19\x29\xe1\xd0\x21\xfe\xb1\ -\x68\x11\xc7\x5a\x5a\x92\xaa\x6a\x03\xb6\x1c\x70\x2b\x7f\x7b\xe2\ -\x09\x0a\x3b\x76\xc4\x79\xdf\x00\xb4\xbe\x1e\x39\x69\xd3\xed\x82\ -\x6d\x27\x6c\x89\x94\x08\x38\x01\x9b\x80\x37\x80\x71\x2b\xa1\x01\ -\x2f\xa3\x28\xd5\xfb\x9f\x3b\x79\x32\x43\x47\x8e\x4c\xb7\xcb\x66\ -\x6c\xdd\x28\x4b\xe6\xe2\x6b\xaf\x25\xf4\xfd\x52\x80\x9a\x34\x9a\ -\xf5\x7d\x4b\xc6\xba\x91\x74\x94\x9a\xa4\x51\x19\x45\x28\xdb\x0e\ -\x0b\x91\xa4\x2a\x5b\x05\x93\x96\xda\x36\x78\x4a\x25\x4d\xde\x59\ -\x75\x75\x5c\xff\xd4\x53\x71\xb5\x95\xb2\x5b\x81\x03\x92\x74\xe9\ -\x76\xbe\x57\xce\x99\x83\x52\x8a\x3d\x4f\x3e\x89\x57\x28\x94\x2a\ -\xad\x52\xe0\x79\xc9\x27\x18\x8b\xc5\x77\xf0\x00\x84\x42\x94\xea\ -\x80\x2c\x16\x95\x04\xb4\xe7\x41\x10\x94\x72\xad\x5b\x0f\xdc\xb1\ -\x91\xb3\xea\xea\xa8\x7d\xfa\xe9\xb8\x6e\x28\x5b\xf2\x48\x15\x2a\ -\x2b\x36\x16\xec\xa6\xb5\x66\x72\x5d\x1d\x4a\x29\x3e\xfa\xe5\x2f\ -\x93\xb6\xc3\x33\x9f\x60\x3c\xcf\x8b\xf3\x7e\x69\x51\x30\x44\x54\ -\x5c\x47\x9c\x42\x16\x86\x5a\x86\x61\x02\x50\x09\x81\xf6\x3c\x94\ -\xef\xa3\x3d\x0f\xed\xfb\xb1\x78\x5e\x42\x6e\xe0\xdc\xb9\x5c\xff\ -\x9b\xdf\x24\xe0\x5d\xed\xda\x42\xe6\x56\x5b\xa0\x2c\x89\xab\x6e\ -\xba\x09\x0d\x34\x2f\x5b\x86\x5f\x2c\xa2\x8c\x5f\x7b\x42\xe0\x1b\ -\x12\xae\xe6\x2d\x19\x69\x08\x25\xef\xba\xa9\xc6\xc0\x7e\xcb\x91\ -\x12\x49\xa9\xa5\x50\xc6\x4a\x03\x6e\xbd\x95\x1f\xfc\xf6\xb7\xb1\ -\x95\x0c\x78\x2b\xc9\xcb\xb9\xf9\x3a\xe1\xb6\x0b\x5a\x6b\x82\x20\ -\x48\x88\x59\x32\x57\xd5\xd5\x21\xa5\xe4\xa3\xe5\xcb\x53\x24\xb4\ -\x94\x78\x42\x10\x18\x57\x74\x5b\x6b\x2d\x84\xd3\x0b\x39\x24\xb2\ -\x1d\x4e\x76\x6e\x60\x7d\x3d\x3f\x5c\xb7\x0e\xa5\x35\x91\x09\xe6\ -\x24\x5b\x39\x16\xf0\x3c\x8f\x7c\x67\x27\xdf\x1c\x3f\xce\xe8\x4b\ -\x2e\x49\x11\xcc\x5a\xc1\xf7\x7d\xbe\x3b\x77\x2e\x52\x29\x9a\x97\ -\x2f\x27\x57\x28\xa4\xdf\xea\xa4\x4c\xda\x08\xeb\x4a\xca\xb5\x80\ -\xcb\xac\x37\x22\xb9\xfa\x7a\x66\xaf\x5f\x1f\x9b\xb0\x58\x4c\x9a\ -\xb0\x24\x43\x39\xee\x12\x16\x0a\xfc\xf9\x67\x3f\xa3\xb8\x77\x2f\ -\xd7\x6f\xd8\xc0\x45\x93\x26\xa5\x80\xfb\xbe\x9f\x6a\xfe\x7c\xdf\ -\x67\xea\xbc\x79\x28\x29\x69\x5e\xb6\x2c\x26\x41\xec\xf3\x6e\x10\ -\x5b\x5c\x61\x18\x96\x62\xc0\x3d\x51\x8e\x88\x00\xf4\xbc\x79\xcc\ -\x5a\xb3\x06\xcf\xf7\x13\x6d\xbb\x00\x5c\x57\x2a\xe6\xf3\xbc\xb5\ -\x78\x31\xc5\xad\x5b\x51\xc0\xdf\x16\x2c\x60\x96\x21\x61\x2d\x64\ -\x2d\x61\x2d\x60\xad\x33\x65\xde\x3c\x8a\xf9\x3c\x4d\x8f\x3f\xce\ -\x80\x42\x01\xdf\x80\xf4\x8d\x48\xb3\xcf\xc7\xc3\x38\x46\x14\x08\ -\xd5\x0b\xf8\xfc\xac\x59\x7c\x6f\xe5\x4a\x84\x79\xd3\x72\xdf\xa0\ -\x5c\x02\x52\x4a\xba\x3a\x3a\x78\xeb\x9e\x7b\x90\x5b\xb7\x26\xf7\ -\xcb\xc3\x87\x79\x67\xfe\x7c\xfe\xd3\xdc\x9c\xea\xeb\x2d\xf8\x6c\ -\xd5\x9e\x31\x7f\x3e\x97\x3c\xf1\x44\x2a\xe3\x65\x3f\x65\x6a\x03\ -\xd5\x03\x38\x0c\x2f\x1f\x80\xb6\x28\x03\x3c\x71\xa3\xa6\x26\x8e\ -\x99\x87\x67\xdb\x62\xd7\x0a\x5d\x1d\x1d\xbc\x73\xef\xbd\xb0\x6d\ -\x5b\x37\xf7\x93\xad\xad\xbc\xbd\x60\x41\x37\x12\x6e\x7f\x64\x89\ -\x14\xba\xba\x38\xee\xac\xe1\x82\x97\x40\x1b\x9c\x3a\x04\x7f\x4f\ -\x08\xac\xd1\xfa\xcd\x26\x78\xe0\x33\x68\xcb\x67\x2c\xe0\x01\x15\ -\x5f\x7c\xc1\xde\x3b\xef\xe4\xe0\xfb\xef\xa7\x1e\xea\x92\xc8\x77\ -\x76\xb2\xed\xfe\xfb\xf1\x1a\x1b\xcb\x2a\x41\x00\xaa\xb5\x95\xcd\ -\x65\x2c\x91\x05\xff\xfa\xdd\x77\x73\x6a\xfb\xf6\x6e\xe0\x23\xe0\ -\x38\x9c\x6e\x81\xd5\x6b\xb5\x5e\x9e\x10\x30\x24\xde\xd8\x03\x0f\ -\x7f\x06\x5f\xb6\x53\x7a\x89\xb0\x52\xd1\xd6\xc6\xc7\x0d\x0d\xb4\ -\xbc\xf7\x1e\x52\xca\x94\x1b\x15\xba\xba\x68\xbc\xef\x3e\x7c\x07\ -\xbc\x07\x65\xc7\xfa\xc8\x11\xde\xca\x90\xb0\x2f\x35\x5d\x1d\x1d\ -\xbc\xd4\xd0\xc0\xc9\x6d\xdb\xba\x7d\x3f\x2d\x00\xc7\xa0\xfd\x28\ -\xac\x5e\xaf\xf5\xe3\x16\x77\xea\xd3\xe2\x3a\xad\x5f\xfb\x14\x1e\ -\x38\x00\x5f\x9d\x32\x8c\x5d\x00\x15\x6d\x6d\x34\xdd\x76\x1b\x9f\ -\xee\xdc\x99\x68\xac\x98\xcf\xd3\xb8\x78\x31\xb9\xc6\xc6\xb8\x00\ -\xf5\x00\xdc\x3d\xa7\x5a\x5b\xd9\x74\xeb\xad\xfc\xbb\xa9\x29\x21\ -\xd1\xd5\xd1\xc1\x4b\xb7\xdf\xce\xc9\xad\x5b\x53\x6f\x63\x00\x9d\ -\xb1\xe6\xdb\xdb\x60\xf5\xef\xb5\x7e\xcc\xc5\x5c\xf6\xe3\xee\x22\ -\x21\xea\x2f\x80\x55\x17\xc2\xb7\x07\x13\x67\x01\x5b\xc8\x24\xd0\ -\x51\x59\x49\xcd\x1b\x6f\x30\xac\xaa\x8a\xbf\xdc\x76\x1b\x62\xcb\ -\x96\xe4\x9c\xca\x5c\xab\x7a\x11\x31\x6a\x14\x73\x5e\x7f\x9d\xf3\ -\xc7\x8e\x65\x43\x43\x03\xdf\x6c\xd9\x92\x00\xf7\xcd\xbe\x03\xf8\ -\x1a\xda\x4f\xc1\x9a\x0d\x5a\x2f\xcd\x62\xed\xf1\xeb\xf4\x5d\x42\ -\xdc\x32\x12\x9e\x1f\x0d\x43\x87\x66\x48\x28\xe0\x74\x65\x25\xfe\ -\x84\x09\xf8\x8d\x8d\x3d\x02\x3e\x13\x01\x6d\x48\x9c\x3d\x6e\x1c\ -\xa7\x77\xec\x88\x01\x39\x9a\x6f\x07\xbe\x80\xf6\x4e\x58\xfb\xaa\ -\xd6\x8f\x96\xc3\xd9\xeb\xff\x81\xbb\x84\xb8\xf9\x7c\x78\x61\x14\ -\x0c\x3d\x1f\x18\x70\x06\x60\x67\x02\x9c\x05\xef\xa6\xc9\x04\x90\ -\xd9\x9f\x04\x3e\x87\xce\x3c\xac\x7d\x4d\xeb\x25\x3d\x61\x3c\xe3\ -\x1f\x9a\xbb\x84\xb8\x79\x08\xbc\x70\x01\x0c\x1d\x09\x0c\x3c\x03\ -\xd0\x9e\xce\xe9\x32\xe3\x6c\x7e\xb7\xff\x0a\xbe\x06\x8e\x41\x67\ -\x11\xd6\xbc\xae\xf5\x23\xbd\xe1\xeb\xd3\x3f\xb2\x3b\x84\xb8\x65\ -\x70\x4c\xe2\xbc\x0b\x80\xb3\xcf\x40\xa2\x2f\x04\xca\x15\x28\x05\ -\xb4\x01\x47\xa1\x33\x84\x75\x7f\xd0\xfa\xe1\x33\x61\xeb\xf3\x5f\ -\xca\x3b\x84\xb8\xe5\x1c\x43\xe2\x62\x43\xc2\x6a\xdc\x16\x98\x2c\ -\xd0\xde\x5c\x26\x4b\x40\xc6\xc0\x39\x02\x9d\x51\x1f\xc1\xf7\x8b\ -\x00\xc0\x42\x21\x6e\x39\x0b\x56\x8f\x82\x21\xe3\x80\x8a\x1e\xc0\ -\xf6\xe6\x32\xe5\x5c\x27\x02\x0e\x03\x87\xa0\x53\xc1\xba\x37\xfa\ -\x08\xbe\xdf\x04\x20\xb6\x44\x0e\xd6\x7e\x07\x06\x8f\xa3\x7b\x76\ -\xb2\x02\xdd\x5d\xa6\xa7\xde\xa6\x15\x38\x08\x5d\x1a\xd6\x6d\xd4\ -\xfa\xa1\xfe\xe0\xe9\x37\x01\x80\x3b\x85\x98\xaf\xe0\xf9\x41\x30\ -\xd8\xce\xb9\xc0\x54\x99\xb9\x72\xbf\xaa\xec\x76\x0a\xba\x04\xbc\ -\xb8\x51\xeb\x07\xfa\x8b\xa5\x2c\x01\x11\xf7\x08\x6e\x17\x6b\xc5\ -\xd6\x18\xff\x06\x98\x55\x01\xb3\x8d\x56\x95\xe9\x0e\x85\xb6\xeb\ -\x66\x80\x96\x51\x53\xc2\x49\x43\xf3\x5f\xe1\x77\x94\xc2\xca\x8a\ -\x7b\x1c\x01\x52\x67\x00\x0b\xd3\x87\xfb\x40\xce\x80\xcb\x19\xf0\ -\xff\x8f\xf8\x99\xb1\xed\x0a\xac\x61\x2c\x10\x57\x24\x10\xf6\x63\ -\x6f\xef\x2b\x02\x51\xca\x02\xa6\x39\xb3\x0f\xb5\x60\x12\xad\x3b\ -\x73\xd9\x7d\xd6\x5a\x76\x0d\x1c\x02\x56\xeb\x29\x8d\x66\x88\x64\ -\xcf\x95\x13\xed\x5a\xe1\x7f\x98\x41\x2d\x15\x18\x86\xae\x05\x00\ -\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ -\x00\x00\x0c\x65\ -\x89\ -\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ -\x00\x00\x30\x00\x00\x00\x30\x08\x06\x00\x00\x00\x57\x02\xf9\x87\ -\x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\ -\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x05\x31\x00\x00\x05\x31\ -\x01\xb7\xed\x28\x52\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\ -\x74\x77\x61\x72\x65\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\ -\x70\x65\x2e\x6f\x72\x67\x9b\xee\x3c\x1a\x00\x00\x0b\xe2\x49\x44\ -\x41\x54\x68\x81\xd5\x99\x7b\x70\x5d\xc5\x7d\xc7\x3f\xfb\x38\x8f\ -\x7b\xaf\x9e\x96\x84\x2c\x8c\xcd\xcb\x60\x17\x30\x0e\x1e\xa0\xc4\ -\xb2\xc1\x86\x31\xc6\x21\x24\xb4\x09\x4d\xa7\x24\x24\x99\x69\x68\ -\x69\xa6\x9d\xd0\xd0\x4e\xa8\x3b\x24\x0d\xa5\x90\x76\x32\x6e\x60\ -\x32\x06\xc2\x4c\x03\x49\x4a\x93\x40\xc0\x71\x28\x61\xa0\x60\x22\ -\x0b\xdb\xb1\x15\xe1\x67\xb1\xc1\xf8\x21\x20\xf2\x53\x92\xad\x7b\ -\x75\x5e\xbb\xdb\x3f\xee\x95\x2c\x64\xf9\x21\x5b\x4e\x27\xbf\x99\ -\xdf\xf9\xed\x9e\xdd\x73\xf6\xfb\xdd\xf3\xf8\x7d\xcf\x59\xe1\x9c\ -\xe3\xf7\xd9\xe4\xff\x37\x80\xd3\xb5\xdf\x7b\x02\x62\xe2\x57\x2f\ -\x92\x81\x17\xfc\xdd\xac\x29\x33\xe7\xd5\xe6\x6a\x3c\x29\xa4\x10\ -\x42\x30\x14\x11\x08\x21\x85\x14\xe5\x58\x6e\x13\x95\xb6\xe1\x75\ -\x89\x10\x62\xb0\x1f\xe5\x9a\x40\x08\x21\x9c\x73\xce\xe1\x70\xce\ -\x61\x9d\x73\xce\xd9\x4a\x74\x38\x67\x9d\x2d\xb7\x95\x4b\xce\x39\ -\x3b\xb8\xff\xc3\xed\x58\x67\x9d\x73\x8e\x81\x34\xca\xde\xec\xda\ -\xf0\x7a\x4f\xb1\xf7\x41\x8d\xe0\x8e\x85\x33\xe6\x3d\x24\xfc\x94\ -\xc4\x16\x91\x5a\xa2\xb5\x44\x29\x85\xd6\x02\x25\x15\x9e\xf2\xf0\ -\x84\x46\x2b\x81\x96\x1a\x4f\x69\x34\x0a\xad\x34\x4a\x6a\xb4\x54\ -\x28\xa1\xd0\x42\xa3\xa4\x42\x4a\x8d\x12\x8a\x41\x32\x95\xc1\x31\ -\xce\x60\x6d\x46\x66\x0d\xc6\x19\x8c\x2b\x97\x33\x9b\x91\x99\x0c\ -\xe3\x0c\xa9\xcd\xca\x75\x6b\x49\x8d\x21\x75\x09\xc6\x58\x8c\x71\ -\xa4\xa9\xc1\x1a\x4b\xb5\xd3\xfc\x51\xf3\xa2\x1b\xbf\xdf\xf6\x5f\ -\xbf\xd5\x42\x60\x56\xed\x6a\x47\x54\x95\xd0\x9e\x40\x69\x50\x9e\ -\x40\x69\x81\x57\x01\xe7\x29\x55\x06\x2e\x55\x19\xac\x54\x28\x29\ -\x51\x62\x30\x4a\x86\xcd\x3c\x95\x99\x47\x0c\xbb\xd4\x0e\x28\xcf\ -\xb8\xa3\x3c\xa3\x16\xeb\x1c\xc6\x59\x8c\x2d\x93\x33\xd6\x62\xac\ -\x21\xb3\x86\xb4\x42\x2c\x35\x83\xf5\x0c\x93\x39\x4c\xea\x30\x19\ -\xa4\x7d\x21\xf5\x85\xba\x48\x0b\x21\x9e\x3e\xd0\x5b\xfc\xd3\x5a\ -\x2d\x3e\x16\xe6\x05\xca\x03\xad\x25\x5e\x65\xa6\x8f\x90\x28\xc7\ -\xe1\xae\x84\x44\x49\x89\x14\x83\x2e\x90\x42\x96\x81\x8f\x42\x00\ -\xe7\x70\x80\xad\x80\x2f\xc7\x41\x02\xb6\x72\x35\x0c\xaa\xe2\xa9\ -\x91\x28\x51\x06\x2f\x8d\x20\x21\x43\x08\x4b\xe9\x90\xa5\xe7\x60\ -\xe9\xbf\xa1\xf4\x53\xe1\x9c\xe3\x9c\x7b\xa7\x85\x08\x5e\x68\x68\ -\x91\xd7\xd7\x35\x68\x7c\x55\x06\xef\x84\x23\x73\xd9\x10\x10\x51\ -\x46\xc6\x91\x6d\xb9\x24\x8e\x14\x4f\xde\xdc\xf0\x30\x7c\x5b\x2e\ -\x0d\xbe\xdd\x7d\x19\xa0\x90\xa4\x36\x23\x35\x19\x07\xf6\x27\xec\ -\x7d\x3f\x7b\x15\xc7\xcd\xef\x3d\xb8\x35\x12\x83\x79\xe0\x9c\x7f\ -\x98\x56\x10\x42\xbc\x7c\xf6\x14\xff\xa3\x8d\x0d\xb9\x21\x12\x91\ -\x1d\x20\x32\xf1\x18\x90\x8d\x9f\xe5\x75\x8e\x82\x2a\x0c\x81\xdf\ -\xbb\x7f\x80\xdd\x3b\x4b\xab\x9c\x73\x0b\xde\xfb\x97\xad\x45\x00\ -\x31\x3c\x91\x4d\x5e\x3c\xad\x56\x08\x5e\x9d\x3a\xb5\x66\x56\x53\ -\x43\x01\x5f\x69\x7c\xa9\xe8\x4d\x0e\x51\xcc\x06\x7e\xa7\xe0\xab\ -\xbd\x02\x13\x82\x3a\x32\x6b\x48\x6c\x46\xf7\xfe\x7e\xb6\x6d\xeb\ -\xf9\x8d\x75\x5c\xdf\xf5\xc0\xd6\xbe\xc1\x7e\x62\x64\x26\x9e\xf2\ -\x8f\xd3\x1a\x84\x14\x2b\x66\x4c\x6f\xbc\x6c\x62\x43\xcd\xd0\x73\ -\xb0\x67\x60\x1f\x87\x92\xfe\xdf\x09\xf8\xda\xa0\x9a\x49\x85\x89\ -\x64\x26\xab\x80\x3f\xc4\x9b\x5b\xba\x37\x19\xeb\xe6\xed\xfe\xe7\ -\xad\x07\x86\xf7\x3d\x8a\x00\xc0\xb9\xf7\x4d\x6f\x56\x52\xb6\xfd\ -\xe1\xe5\x93\x2e\x6a\xae\xaf\x90\x10\x8a\x9d\xc5\xf7\xe9\x8b\x0f\ -\x9f\x51\xf0\xf5\x41\x0d\x17\xd6\x4c\x39\x32\xf3\x07\xfb\x68\x7f\ -\x73\xf7\xdb\xc6\xda\xb9\xbb\xbe\xf9\xd6\x9e\x91\xfd\x47\xcd\xc4\ -\xbb\xbe\xf9\xd6\x1e\xeb\xdc\xf5\xeb\x36\x7f\xb0\xab\xd8\x9f\x12\ -\x2a\x9f\xd0\x0b\xb8\x74\xc2\x54\x26\x84\x35\x48\xc1\x19\xf1\x86\ -\x5c\x2d\x97\x37\x4d\x23\xd4\x3e\x81\xf6\xe9\xef\x4f\x59\xbd\xb1\ -\x6b\x97\x75\xee\xfa\xd1\xc0\xc3\x31\xae\xc0\xa0\x5d\xf8\x8d\x4b\ -\xcf\x0f\xb4\x6e\xbf\xe9\x9a\xe9\x2d\xcd\x75\xb5\x78\x52\x23\xa5\ -\xa0\x73\xdf\x16\x7a\xe3\x43\xa7\x3c\xcb\xa3\x59\x7d\x50\xcb\x95\ -\xcd\x97\xe1\xac\x23\xb5\x86\xee\xde\x3e\x7e\xb1\x66\xd3\x6f\xe3\ -\x24\x6b\xdd\xfe\xf5\xcd\x3b\x8e\x75\xdc\x71\xb5\xd0\xf6\x6f\x6c\ -\xde\x81\x90\xf3\x57\x74\xee\xd8\x57\x1a\x48\x09\xb4\x47\x5e\x87\ -\xcc\x39\x7b\x16\xf5\x61\xed\x91\x84\x75\x9a\x5e\x1f\xd6\xd2\x7a\ -\xf6\x15\x14\xbc\x1c\x81\xf6\x29\x46\x09\xaf\x74\xbc\xbd\x0f\x2b\ -\xe7\x1f\x0f\xfc\x09\x09\x00\x6c\x59\xdc\xb9\x55\x4b\xef\x86\xd7\ -\xd7\xef\xe8\x8d\x63\x5b\x49\x68\x9a\xd6\x96\x2b\xa8\x0b\xab\x91\ -\x52\x9c\x96\xd7\x85\xd5\xb4\xb6\xcc\xc2\x93\x1a\x80\x81\x38\xe3\ -\xb5\xce\x77\x7b\x7d\xe5\xdf\xb0\x65\x71\xe7\xd6\x13\xe1\x3b\x29\ -\x35\xfa\xeb\xaf\xb6\x6f\xcc\x7b\xb9\x05\x6f\x6c\xde\xd5\x5f\x8a\ -\x13\x04\x02\x4f\x7a\xcc\x6e\xb9\x82\x6a\xbf\x50\xc9\xc0\x63\xf7\ -\x1a\xbf\xc0\xec\x96\x59\xf8\x4a\x03\x82\x81\x38\xa5\x6d\xe3\x8e\ -\xfe\x50\x07\x0b\x56\xff\xed\xca\x8d\x27\x83\x4d\x38\xe7\xf8\xe2\ -\xd3\xb7\xdf\x54\x13\xd6\xce\xad\x0e\xaa\x03\xa8\xe4\x56\x01\x4a\ -\xca\x61\x82\x40\x10\x67\xd1\x15\x25\xd3\x37\xff\xd2\xf3\xeb\xf0\ -\x3d\x85\x40\x10\x65\x31\x6f\xec\xf9\x0d\xa5\x31\xe6\x89\xbc\xce\ -\x31\xbb\x79\x16\xa1\x0e\x00\x88\xd3\x8c\x4d\x3b\x7a\xa8\xd2\xf5\ -\xaf\x05\x3a\xe8\x2c\x3f\x9a\x83\x19\xda\x55\x92\x73\xb9\x1e\x65\ -\x51\x7a\xa0\xb8\xff\xf5\x27\x3e\xf3\x83\x5f\x8a\xfb\x5f\xb9\xe7\ -\xe3\x2d\x75\x93\x96\x57\xe7\x0b\x80\xad\xe8\x1c\x3d\x24\xda\xb4\ -\x50\x08\x21\x11\x15\x91\xd6\x17\xef\x67\xef\xc0\x4e\x02\xbf\x42\ -\x4b\x08\xa2\x2c\xa2\x7d\xef\x3a\xa2\xec\xe4\x32\x76\xa8\x43\x5a\ -\xcf\xba\x92\x9c\x0e\x86\x44\x5e\x92\xc0\x84\x70\x32\x0d\xb9\x89\ -\x38\xe7\x86\xe9\x26\x43\x56\x11\x7a\xd6\x59\x52\x9b\xe1\x9c\xc3\ -\x64\x82\xed\xfb\xb6\xdd\xac\xa7\xb7\x9c\x7b\xee\x81\xf8\x00\x1d\ -\xfb\x56\x13\x7a\x3e\xa1\x2a\xbf\xc2\x02\xed\x11\x28\x1f\x25\xe5\ -\x90\xfa\x19\xd4\x42\x83\xe0\xcb\xd7\x47\x50\xf0\xf2\xb4\x36\x5f\ -\xc9\xaa\xee\x0e\x22\x7b\x7c\x12\xa1\x0a\x98\xdd\x7c\x25\x05\x9d\ -\x3b\xa2\x50\x05\xf8\xbe\xa3\xdf\x76\x71\xb8\xd8\xc5\x11\x2d\x54\ -\x26\x61\xac\x25\x36\x09\x71\x96\x12\x67\x09\x91\x49\x38\x27\x7f\ -\x21\x33\x26\x5d\x3c\x45\xb4\xbf\xff\x74\xb5\xc5\xae\xe9\xe8\x5e\ -\xfb\x07\x87\xd3\x3e\x02\xed\x13\x2a\x8f\x40\xfb\x78\x4a\x1f\x05\ -\x5e\x54\x66\x5d\x20\x90\x82\x4a\x2c\xd7\xfb\xd3\x7e\xda\xf6\xae\ -\x23\xb1\xe9\xa8\xe0\x7d\xe9\x31\xb7\xf9\x2a\xaa\x75\xa1\x0c\x1e\ -\x87\x2d\x7f\xea\x60\xcb\x77\x49\x99\xd0\xe0\x8d\x33\x8c\x44\x6a\ -\xb2\x0a\xf8\x94\x82\xaa\xe6\xb2\xc6\x99\xff\x2b\x91\x57\x0b\xe7\ -\x1c\xcf\x6e\x5a\x3a\xd1\x3a\xd3\xf6\x41\xb2\x7d\xaa\x93\x29\xa1\ -\x2e\x13\xd8\x5d\x7c\x8f\xfd\xf1\xc1\x51\xf4\xe7\x91\xcd\x48\x01\ -\x3a\x90\x45\x94\xcc\xe8\xcf\x43\x5e\xe7\xc8\xab\x90\x91\x99\x67\ -\x48\x8b\x3a\x46\xb4\x39\x1a\x83\x06\x26\x17\x26\x01\x10\x67\x09\ -\xce\xf8\x34\xa9\x29\xef\x08\x21\xe7\x7e\xea\xb2\xbb\xba\x87\x12\ -\xd9\xe3\x6f\x7c\x6b\x32\xc2\xae\xcc\xc2\x83\x53\x7c\x1f\x94\x94\ -\x38\x67\xd9\xd0\xb7\x85\x9e\xa4\x77\x54\x40\x67\xda\xea\xfd\x7a\ -\x66\xd6\x5d\x82\x40\xe0\x80\x2c\x51\xd8\x62\xd5\x6e\x9c\x9c\xf3\ -\x17\xad\x5f\xeb\x82\x11\x99\xf8\xc1\x5f\x2e\xbe\x40\x4a\xd7\x3e\ -\xa1\xd9\x4c\xf4\x7c\x00\x81\xc5\xb2\xa1\x77\x13\x7d\x69\xdf\xe8\ -\xa3\x9c\x21\xab\xf5\x6a\x99\x59\x37\x03\x29\x04\xce\x41\x9a\x38\ -\x0e\xee\x51\xdd\xd6\x8a\xd6\x7b\x6f\x7a\xe0\xdd\xc1\x7e\x47\x49\ -\x89\xaf\x3d\x73\xf7\x74\xa5\x69\x9b\x72\x9e\xdf\x18\x86\x02\x10\ -\x18\x97\xb1\xa1\x77\x13\x87\xb3\x33\x2b\xe4\x06\xad\x46\x57\x33\ -\xb3\x7e\x06\x12\x85\x03\xe2\xd8\xb2\xf3\xdd\x78\xbf\xc9\x98\xfb\ -\xad\xdb\xfe\xfd\xad\xe1\x7d\x47\xd5\x42\x77\x3d\x79\xe7\xe5\xbe\ -\x27\x5f\xbf\xe4\xd2\x9a\xba\x5c\xa0\x10\xa2\x4c\xe2\xcd\xbe\x0d\ -\xf4\x67\xc5\x33\x0a\xbe\x4a\x57\x31\xab\xee\x72\x14\x1a\x8b\x63\ -\x20\x32\x6c\xde\xdc\xd7\x9b\xa4\xf6\xba\xa5\x9f\x7f\x7c\xc3\xc8\ -\xfe\xc7\x14\x73\x9f\x5d\xfa\xb9\xab\xc2\x40\xbf\x7a\xf5\xac\xa6\ -\xaa\x7c\x4e\x23\x85\xc4\xba\x94\x8e\xde\xf5\x14\x4d\xe9\x8c\x80\ -\x2f\xa8\x3c\x57\xd6\x7d\x04\x2d\x3d\x8c\x73\x94\x06\x12\x56\x75\ -\xec\xed\x8f\xe2\xec\xfa\x1f\xdd\xf5\xc3\xb5\xa3\x1d\x73\x5c\x35\ -\x7a\xeb\x92\xdb\xe6\x54\xe5\xbd\x97\xe6\x7f\x74\x72\x3e\x1f\x7a\ -\x28\x21\x49\x5d\xca\xba\xde\x4e\x06\xec\xf8\x7e\xa1\xe5\x65\x8e\ -\xab\xea\x66\xe1\x49\x0f\xeb\x1c\xfd\x51\xc2\xab\x6f\xec\x2e\xf5\ -\x97\xd2\x85\xcf\xdf\xfd\xd3\x95\xc7\x3a\xee\xb8\x04\x00\x6e\x7c\ -\xf0\x96\x1b\x6a\xab\xc3\x17\x3e\x3e\x6f\x6a\x90\x0f\x7c\xa4\x10\ -\x24\x36\x61\x6d\x5f\x07\x91\x8d\xc6\x05\x7c\x4e\x86\x5c\x53\x7f\ -\x15\x9e\xf0\x31\xce\x52\x8c\x52\x96\xaf\xd8\x16\xf7\x1e\x8e\x6e\ -\x7e\xf9\xde\xe5\xff\x73\xbc\x63\x4f\x48\x00\x60\xee\x3f\x2d\xbc\ -\xb9\xb1\x2e\xff\xfc\xa7\x6f\xbc\x44\xe7\x7d\x1f\x2d\x24\xb1\x8b\ -\x58\xdd\xb3\xee\x84\x99\xf7\x44\x16\xca\x80\xd6\x09\x57\x13\xca\ -\x1c\x99\x35\x14\xe3\x84\x1f\xbf\xbc\x29\xdb\xdf\x53\xba\xb5\xed\ -\xeb\x2f\xbd\x70\xa2\xe3\x4f\x8a\x00\xc0\x55\x8b\xe7\x7f\xaa\xa5\ -\xb1\xfa\x27\xb7\x2f\xfa\x88\x2c\x04\x3e\x5a\x28\x22\x5b\xa2\xad\ -\x77\xcd\x31\x33\xef\x89\x2c\x90\x3e\xd7\xd5\x5f\x43\x5e\xe5\x49\ -\xad\xa5\x98\x24\x3c\xf5\x42\x87\xfd\x60\xff\xe1\x3f\x59\xfb\xc0\ -\x6b\xcf\x9e\xcc\x39\x4e\x9a\x00\xc0\x8c\xbf\x9f\x73\xfb\xb9\x13\ -\xeb\x9e\xfa\xd2\x2d\x57\xcb\x9c\xef\xa3\xa5\xa4\x3f\x2b\xd2\xd6\ -\xb3\x8a\xc4\x65\x63\x02\xef\x4b\x8f\xf9\x13\x66\x53\xa5\xaa\xc8\ -\x9c\x61\x20\x49\x79\x74\xd9\x6a\xbb\xb3\xbb\xe7\x8e\x8d\xff\xba\ -\xf2\x47\x27\x7b\x9e\x31\x11\x00\x98\x7e\xf7\x35\x7f\x7e\xd1\xe4\ -\xc6\xc7\xff\xea\xd6\xd9\x22\xe7\x79\x68\xa9\x38\x64\x0e\xb3\xe2\ -\xe0\x1b\xa4\x27\x49\xc2\x13\x9a\x05\x0d\x73\xa8\xd5\xb5\x24\x36\ -\x23\x4a\x53\x1e\xfe\xd9\x4a\xb7\xad\x6b\xdf\x9d\x6f\x2d\x59\xfd\ -\xc4\x58\xf0\x8c\xf9\xf7\xfa\x5b\x4b\x56\x3f\xb1\x65\xc7\x9e\xaf\ -\x3c\xb6\x6c\x15\xc6\x39\x24\x82\xb3\xbc\x09\x2c\x68\x6c\xc5\x97\ -\xfa\x84\x1f\x31\xbe\xf4\x58\xd4\x74\x2d\xcd\x41\x23\x12\x81\xb5\ -\x8e\xef\x3e\xdf\xce\xe6\x1d\xdd\x5f\x19\x2b\xf8\x53\x22\x00\xb0\ -\xfd\x91\xb5\x0f\x77\x6c\x7b\xef\xde\xef\x3e\xd7\x8e\x73\x65\x75\ -\x3a\xd1\x3f\x8b\x05\x8d\x73\x50\x4a\x22\x24\xa3\xba\x52\x92\x45\ -\x4d\x73\x39\x3b\x38\xab\xac\x6f\x1c\x3c\xfc\x5c\x1b\xeb\xb6\x76\ -\xdd\xbb\xfd\x91\xb5\x0f\x9f\x0a\x96\x53\x5e\xe0\xe8\x5a\xda\xf9\ -\xd0\x9a\x2d\x3b\xef\x7f\xe4\xf9\x5f\x61\x9d\x43\x00\x53\x82\x16\ -\x16\x35\xcc\x45\x4b\x75\xd4\xcc\x6b\xa9\xf8\x64\xd3\x7c\xce\xcb\ -\x4d\xaa\x80\x77\x2c\x79\x6e\x05\xab\x36\xef\xb8\xbf\x6b\x69\xe7\ -\x43\xa7\x8a\xe3\xb4\x56\x68\xde\x7f\x6c\xfd\x7d\x2b\xd6\xbf\xf3\ -\xed\x47\x96\xfd\x0a\x5b\x11\xc2\xe7\xe7\x26\xb3\xa8\x61\x0e\x6a\ -\x18\x78\x25\x04\x9f\x68\xba\x8e\x0b\x72\x93\x81\xb2\xc2\x5f\xf2\ -\xdc\x0a\x5e\x7d\x73\xdb\xb7\xdf\x7f\x6c\xfd\x7d\xa7\x83\xe1\xb4\ -\x97\x98\xba\xbf\xb7\xf1\x9e\x17\xd7\x6e\x59\xfa\xc8\xf2\x32\x09\ -\xeb\x1c\x53\x73\xe7\xb1\xb0\x71\x4e\x79\xed\x40\x4a\x3e\xd6\x74\ -\x2d\x17\xe5\xcf\xaf\xfc\x52\x77\x2c\x59\xb6\x82\x5f\xfc\x7a\xe3\ -\xd2\xee\xef\x6d\xbc\xe7\x74\xc7\xd7\xa7\x7b\x02\x00\x63\xcc\x97\ -\x9f\x6d\xeb\xcc\x85\x4a\x7f\xe1\x6f\x6e\x99\x47\xea\x0c\x17\xe7\ -\x2e\x20\xab\x37\x08\x60\x5a\xee\x02\x52\x6b\x48\x9d\xe1\x3b\xcb\ -\x5f\xe3\x27\x6d\x1d\xdf\x07\xbe\x3c\x1e\x63\x8f\xf9\x35\x7a\x2c\ -\xab\xff\xc2\x74\x09\xfc\xe7\x97\x16\xce\xfe\xcc\x9d\x37\xb6\x0e\ -\x2d\x80\x08\xca\x5f\x59\xc6\x59\x1e\x7d\xb1\x8d\xc7\x5e\x5a\xf9\ -\x63\xe0\xcf\x7a\x9e\xdc\x6a\xc7\x63\xdc\x71\x23\x00\x50\xf7\xf9\ -\x69\x1a\x78\xe6\xaf\x6f\xb9\xf6\x93\x77\xcc\xbf\x86\xc1\x9f\x32\ -\x0e\x78\xea\xb5\x35\x7c\xe7\xe7\x2b\x96\x01\x9f\xee\x7d\x72\xeb\ -\xd8\xb2\xde\x71\x6c\x5c\x09\x00\xd4\xde\x71\xb1\x0f\xfc\xfc\x9e\ -\x3f\xbe\x61\xe1\x6d\x73\xae\x00\x04\xcf\xac\xec\xe4\xdf\x7e\xf6\ -\xca\x4b\xc0\x27\xfa\x9e\xda\x96\x8c\xe7\x78\xe3\x4e\x00\xa0\xfa\ -\x73\x17\xe5\x84\x10\x2f\xfe\xe5\xa2\xd6\xeb\x00\x1e\x7d\xb1\xfd\ -\x75\xe7\xdc\xa2\xc3\x3f\x78\x7b\xdc\x57\x49\xce\x08\x01\x80\xaa\ -\xcf\x4e\xcd\x01\x5f\xac\x54\xff\xa3\xff\x87\xef\x9c\x91\x25\x9e\ -\x63\x11\xd0\x40\x15\x90\x03\x54\xa5\xae\x86\xb9\x06\x94\xb5\x56\ -\x8d\x6c\x17\x42\x8c\xec\x0f\x60\x2a\x9e\x39\xe7\xcc\xf0\x3a\x60\ -\xa4\x94\x1f\xaa\x8f\x6c\x07\x06\x80\xfe\x4a\xfd\x28\xa0\x1e\x70\ -\x9e\x73\xee\x9c\x0a\xe8\xaa\x38\x8e\xc3\x28\x8a\x18\xe9\x71\x1c\ -\x13\x45\x11\x49\x92\x10\xc7\x31\x49\x92\x90\xa6\xe9\x90\x67\x59\ -\x86\x31\x06\x63\x0c\xd6\xda\xa1\x75\xe1\xc1\xdf\xe8\x52\x4a\xa4\ -\x1c\x5c\x44\xd7\x78\x9e\x37\xe4\xbe\xef\x13\x04\xc1\x87\x3c\x0c\ -\xc3\x21\xcf\xe5\x72\x84\x61\x18\x05\x41\xd0\x0f\xf4\x0b\x21\xde\ -\x03\x76\xea\x24\x49\x0a\x51\x14\x35\x16\x8b\xc5\xa6\x52\xa9\x94\ -\x2f\x16\x8b\xa2\x54\x2a\x51\x2a\x95\x28\x16\x8b\x8c\x2c\x8f\xb6\ -\xef\x78\xe5\x38\x8e\xd1\x5a\x93\xcf\xe7\x87\xbc\x50\x28\x8c\x39\ -\x56\xca\x61\xa1\x50\x08\xf2\xf9\x7c\xae\x50\x28\x44\x41\x10\xec\ -\x1b\x79\x0b\xc9\x9e\x9e\x9e\x5c\x96\x65\x55\xa5\x52\xa9\x50\x2a\ -\x95\x72\x71\x1c\xab\x28\x8a\x74\x14\x45\xaa\xe2\x3a\x8e\x63\x95\ -\xa6\xa9\x8a\xa2\x48\xa7\x69\xaa\x92\x24\x51\x69\x9a\xaa\x2c\xcb\ -\x74\x96\x65\xca\x18\xa3\xac\xb5\xca\x39\xa7\x2a\xe7\x37\x52\xca\ -\x21\xd7\x5a\x67\x5a\x6b\xe3\x79\x9e\xf1\x7d\xdf\xf8\xbe\x9f\x55\ -\xa2\xc9\xe5\x72\x59\x25\x9a\x30\x0c\x33\xdf\xf7\x4d\x3e\x9f\x1f\ -\xc8\xe7\xf3\x45\xcf\xf3\xfa\x5b\x5a\x5a\x06\x80\xa1\x1c\xf2\x7f\ -\x06\x43\x29\xed\xd9\xa6\xc2\x42\x00\x00\x00\x00\x49\x45\x4e\x44\ -\xae\x42\x60\x82\ -\x00\x00\x04\x5b\ -\x89\ -\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ -\x00\x00\x30\x00\x00\x00\x30\x08\x06\x00\x00\x00\x57\x02\xf9\x87\ -\x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\ -\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x05\x31\x00\x00\x05\x31\ -\x01\xb7\xed\x28\x52\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\ -\x74\x77\x61\x72\x65\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\ -\x70\x65\x2e\x6f\x72\x67\x9b\xee\x3c\x1a\x00\x00\x03\xd8\x49\x44\ -\x41\x54\x68\x81\xed\x99\x6b\x8b\x14\x47\x14\x86\x9f\xd3\xb3\x42\ -\x8b\xa8\x7f\xc1\x5f\x10\x08\x61\x41\x84\xe0\x22\xc1\x4c\x12\x08\ -\x03\x21\x08\x22\xa8\x10\x84\xb1\x10\xc4\x3f\x10\xe6\x9b\x20\x48\ -\x20\x0c\x2e\x8b\x60\x02\x22\x88\x04\x16\xc1\x75\x67\x91\x65\x45\ -\x30\x42\x10\x89\x8b\x9f\x37\x7f\xc1\x4b\x24\x97\xcd\x9e\x7c\xe8\ -\x6a\xec\xed\x6b\x55\x75\x4f\x86\x80\x2f\x1c\x7a\x87\xad\x3e\xe7\ -\x7d\xab\xea\x9c\xae\x8b\xa8\x2a\xff\x67\x44\xb3\x26\xd0\x16\xef\ -\x05\xcc\x1a\x4e\x02\x46\x22\xf1\x65\x91\xfe\xb4\xc9\xa4\xb8\x2c\ -\xd2\x1f\x89\xc4\x2e\x6d\x1b\x05\x8c\x44\xe2\xbd\xb0\x1c\xc1\xca\ -\x15\x91\x61\x7b\x7a\xf5\xb8\x22\x32\xec\xc1\xca\x3e\x58\x76\x11\ -\x21\x75\x55\x68\x24\x12\xef\x83\x65\xe0\x53\x00\x01\x15\x30\x97\ -\x54\xaf\x75\x47\xf9\x1d\xae\x8a\x0c\x15\xc6\x49\x28\x00\x26\x6f\ -\x60\xf0\xad\xea\x1f\x55\xef\x54\x0a\x18\x89\xc4\xfb\x33\xe4\x79\ -\xe7\x55\x75\x0a\x22\xae\x8a\x0c\x65\x37\xf9\x24\x18\x4c\x5e\xd7\ -\x88\x28\x15\x30\x12\x89\x0f\xe6\xc8\xe7\xa0\x80\xb9\xd8\x91\x88\ -\xef\x2a\xc8\x67\x30\x39\x08\x83\x33\x25\x22\x0a\x02\x7e\x10\x89\ -\x5f\xc3\xb2\x56\x93\x4f\x5e\xb4\x22\x2e\xb4\x14\xf1\x7d\x92\x57\ -\x75\xe4\x53\x4c\xf6\x97\x88\x28\x24\xf1\x5b\x58\x10\x38\x1e\xd9\ -\x7f\xd6\x98\x44\x30\x1e\xb7\x48\xec\xb1\xc8\x30\x82\xb1\xf5\xd5\ -\x14\xef\xf8\x5b\x58\xc8\xfb\x28\x08\x38\xaf\xba\x2a\x60\x22\xd0\ -\x3a\x87\x92\x98\x08\x8c\x17\x03\x44\x2c\xfa\x91\xd7\x1e\x98\xf3\ -\xaa\xab\x79\x3f\x95\x49\xbc\xe8\x3e\xb4\x90\x88\x35\xe7\x1c\xa7\ -\xd3\x52\xb1\xda\xd4\xfa\x96\x1a\xdf\xb5\x65\x74\xc9\x43\x84\xd8\ -\xea\xd4\x24\x62\xa9\x39\x61\xb3\x68\xf4\x59\x2b\x00\xe0\xba\xe7\ -\x48\x00\xe6\x9b\x8a\x80\xd7\x03\xc8\x57\xf9\x4a\xd1\x28\x00\xe0\ -\x46\xc0\x90\x9f\xcd\x05\xbe\x11\xd0\x11\x79\x1f\x65\x70\x12\x90\ -\x12\x70\xed\xbd\xb4\xc4\x9e\xb6\x04\x7e\x0c\x20\x7f\xda\x31\x9f\ -\x9c\x05\xa4\x44\x5c\x44\xa4\x5f\x6c\x01\x63\x19\x79\x8d\xde\x29\ -\x8f\x6f\x8b\x97\x00\x80\x9b\x9e\xbd\x69\x1b\x39\x93\x3f\xe9\xf9\ -\x61\xf4\x16\x00\x70\xcb\xaf\x3a\xb9\x40\x35\x80\x3c\x04\x0a\x00\ -\xb8\xed\x98\xd8\x0e\x02\x14\x30\x27\x02\x97\x24\xc1\x02\x00\xee\ -\xf8\x55\xa7\x24\xe0\xee\x9f\x0a\x98\xaf\x5b\xac\xa7\x5a\x09\x80\ -\x44\x84\x47\x6d\xcf\x36\x52\xc0\x7c\xd5\x72\x31\xd8\x5a\x00\xc0\ -\x4f\x7e\x25\x16\x6c\xc2\x0e\x3a\x58\x8e\xcf\xb5\x75\x00\xd0\xeb\ -\xc2\x49\x20\x5a\x8f\xc0\x5d\xbf\xb2\x9a\x85\x02\xe6\xcb\x59\x4e\ -\xa1\x7b\x01\x49\xbc\x2b\xb8\x15\xf1\xc5\x2c\x92\xf8\x7e\x4b\xf2\ -\x19\xa8\x80\xf9\xec\xbf\x2c\xa3\xf7\x3d\x2b\x8f\x03\x54\x03\x45\ -\x78\x0b\x58\xf3\x5f\x98\xe1\xda\x36\x02\xf3\xc9\x34\x97\x12\x0f\ -\x02\x56\x95\xf6\x6f\xaf\x4d\x91\x8f\x08\xe7\x32\xba\x6e\xf7\xb0\ -\x2e\x44\xb0\xe4\x8f\x59\x22\xeb\x22\xe0\xf6\xae\x08\x8c\xd7\x45\ -\x38\xd6\xe5\x72\xfa\x61\xc0\x86\xe6\x68\x8e\x40\x17\x3e\xca\xd0\ -\x28\xe0\x61\xc0\x36\xb0\x2a\xb0\x8f\xaf\xb4\xc4\x7e\xdc\x66\x4b\ -\xf9\x28\x80\x7c\x53\xc0\xae\x7d\x56\x0a\x78\x6c\x87\x5c\x3c\xe6\ -\xfc\x11\xc7\x79\xfb\x38\xa0\x18\x54\xf9\x2e\x15\xf0\xa4\x62\xbe\ -\x56\x44\x53\xc0\x1c\xf6\x2c\x7f\x4f\x02\x44\x94\xc5\x28\x08\xf8\ -\x59\xa4\x1f\xc1\x4a\x99\xe3\x92\x48\x2a\x60\xe6\x03\xbf\xa2\xbf\ -\xf8\x27\xf6\xe7\xf3\xb9\xd3\xb9\xc2\xd1\xe2\x9f\xb0\x11\xc1\x9a\ -\xeb\x71\x5f\x28\x79\x80\x79\xd5\x6b\x3d\x87\x63\x4c\x7b\x94\xb9\ -\xf6\x3b\x6c\xe4\x7d\x94\x4e\xa1\x8d\x92\xbb\x81\x1c\x14\x30\x1f\ -\x75\x74\xbc\xfe\xd4\xe1\x78\xfd\x15\x0c\x16\x5c\x8e\xd7\x53\x6c\ -\x54\xdf\x11\x28\x60\x3e\xec\xf8\x82\xe3\x59\xcd\x05\xc7\xcb\x0a\ -\xf2\xd0\x50\x46\x7f\x13\x89\x5f\xee\x16\xa1\x02\xe6\x83\x29\x5d\ -\x31\x3d\x2f\x26\xf6\xe4\x00\x0c\x0e\xd5\x5c\x31\xa1\xaa\xb5\xb6\ -\x05\xf1\x26\xac\x3e\x87\x9d\x5f\x61\xd8\xd4\xbe\xad\x6d\xc2\x70\ -\x13\x76\x36\x61\x75\x0b\xe2\xa6\xf6\x4e\x4e\xb7\x20\x7e\x01\xfd\ -\x69\x93\x4f\xed\x05\xf4\x5d\xc8\xab\x6a\x37\x9b\xfa\x59\xa2\xb0\ -\x1a\x95\x64\xe5\x38\x47\xb2\x57\xaf\xb3\x28\xf3\xcc\x5e\xdc\x64\ -\x2e\x70\x0a\x50\x6b\x3b\x99\x67\x6a\xff\x64\x9e\x75\xb6\x9d\xed\ -\x74\x51\x55\x44\xa4\x67\x49\xef\xb1\xcf\x2e\x2d\xb2\xc4\xb6\x3b\ -\xb4\xbf\x81\xbf\x80\xed\xc2\x14\xb2\x23\x50\xf6\x2d\xc9\xf6\x7a\ -\xd3\xc8\xcc\x65\xde\xa3\xa4\xa7\x53\x4b\x7f\x6f\x97\x8c\x40\xd9\ -\xe8\xec\x68\x8e\xf0\xbf\xac\xa9\x36\x72\x5a\xb3\xcd\xe8\x00\x00\ -\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ -\x00\x00\x0a\x32\ -\x89\ -\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ -\x00\x00\x30\x00\x00\x00\x30\x08\x06\x00\x00\x00\x57\x02\xf9\x87\ -\x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\ -\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x05\x31\x00\x00\x05\x31\ -\x01\xb7\xed\x28\x52\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\ -\x74\x77\x61\x72\x65\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\ -\x70\x65\x2e\x6f\x72\x67\x9b\xee\x3c\x1a\x00\x00\x09\xaf\x49\x44\ -\x41\x54\x68\x81\xd5\x9a\x5b\x6c\x1c\xd5\x19\xc7\x7f\x67\x6e\xbb\ -\xeb\x75\xbc\x1b\x1b\x3b\xb6\x93\xe0\x24\x02\x52\x54\x29\x50\xa4\ -\xf2\x12\xc1\x5b\x40\x80\xfa\xc0\x45\x48\x40\x21\x45\x5c\x4a\x08\ -\x97\xaa\x55\x29\xb4\x52\xa5\x42\xa9\x5a\xf5\x82\xd3\x96\x36\x6d\ -\x85\x20\x04\xd2\x96\xaa\x28\xa9\xa0\xa1\xdc\x1e\xa0\xb4\x8d\x2a\ -\x6e\x29\xa1\x4a\x42\x62\x43\x0c\xd8\xbb\xb6\xb3\xeb\x9d\x9d\x99\ -\xdd\xb9\x9c\x3e\xcc\x8e\xb3\x6b\xef\xec\xae\x43\x68\xd5\x4f\x1e\ -\x9d\x39\x67\x8f\xbf\xf3\xff\x7f\x97\x73\xbe\xb3\xb6\x90\x52\xf2\ -\xbf\x12\xf1\x03\x91\x60\x1d\x5b\x31\xb9\x18\x9b\x7e\x12\x18\x28\ -\x74\xa1\x60\xe0\xf1\x06\x65\x76\xf3\x0f\x76\xca\x5d\xd2\x8d\xd5\ -\xd1\x8c\x80\x10\x42\x03\xc4\xa7\x86\xfc\x06\xb2\x6c\xe0\x3b\xe8\ -\x5c\x83\x42\x56\x4b\x68\x8c\x2c\x1f\xe1\x8c\xfe\x33\xa0\x02\xef\ -\x95\xde\xe3\x7d\xfb\x7d\xbc\xa2\x07\x92\x22\x49\x9e\xc7\xe1\xab\ -\xf2\x0e\x39\xd1\x96\x40\x0d\xfc\x17\x80\xd3\x3f\x15\x12\x9b\xf9\ -\x3c\xe7\x70\x39\x29\x52\x7d\xcb\xfb\xb8\xe9\x33\x37\x71\xe1\x8a\ -\x0b\xd1\x14\xed\xc4\x6a\x01\x78\x78\xbc\x32\xf3\x0a\x8f\xbc\xfe\ -\x08\x33\xe6\x0c\x38\x94\x28\x71\xbd\xfc\xb6\xdc\xd3\x8e\x80\x0e\ -\xdc\x2e\xa5\x1c\xad\x54\x2a\xd1\x68\xf4\xb3\x40\xe2\xc6\x17\x4e\ -\x13\x48\x29\xf9\xc3\xd8\x53\x6c\x7e\x69\x33\x7e\xd2\xe7\x92\x91\ -\x4b\xb8\xe2\xcc\x2b\x48\xa8\x09\x24\x12\xd7\x73\x41\x32\xaf\x4c\ -\xd7\x74\x84\x10\x54\xfc\x0a\x4f\x1f\x7d\x9a\xbd\x87\xf6\x82\x85\ -\x83\xc1\x8d\xf2\x36\xf9\xbb\x48\xb5\x16\xb7\x64\xa5\x52\x65\x7a\ -\x66\x06\x10\x08\x21\x10\x02\x84\x10\xb5\x7e\xb3\xf7\x13\x6d\xb3\ -\xf7\xbd\xe3\x7b\xb9\xf9\xb5\x9b\xf1\x35\x9f\x0b\x46\x2e\x60\xd3\ -\x19\x9b\x28\xc9\x12\x73\xde\x1c\x66\xa1\xc0\xb9\xdd\x9f\xa3\x4b\ -\x4b\x01\x60\x7b\x36\x6f\x17\xdf\xa4\x27\x9b\xc5\x47\xb0\x69\x64\ -\x13\xa6\x6f\xf2\xea\xa1\x57\x93\x78\x3c\x21\x9e\x14\x49\xbe\xc8\ -\x0e\x29\xa5\x8c\x23\x00\xc8\x3a\x90\xcd\x41\x37\x03\x3c\xdf\xd6\ -\x2c\x0f\x30\x65\x4f\x72\xfb\xdf\xb6\xe0\x24\x1c\xce\x5a\x75\x16\ -\x1b\x57\x6f\x24\xef\xe6\xd1\x14\x30\x84\x64\xba\x34\xc9\xc6\x33\ -\xef\xa4\x2f\xd5\x0f\xc0\x8c\x93\xe7\xa5\xd7\xff\x84\x9e\x71\xf1\ -\x02\x41\x45\xc2\xc6\x55\x1b\x99\xb2\xa7\x38\x34\x75\x48\x65\x86\ -\x6d\xdc\xc0\xb3\x40\x5e\x69\xe5\x76\x21\x1a\xc1\x2f\x7c\x22\xc0\ -\x0d\x4f\x44\xa2\xd6\x0f\x82\x80\x7b\xde\xb8\x87\x22\x45\x48\xc0\ -\x86\xe1\x0d\xe4\xfd\x3c\x45\x3f\x47\x39\xc8\x61\x07\x39\xe6\xcc\ -\x49\xa4\x0c\x4e\x98\x2e\x08\x28\x59\x93\x54\x82\x1c\xb6\xcc\x51\ -\xf6\x73\x14\x83\x3c\x1b\x56\x6d\x00\x1d\x48\xd0\xc3\x67\xf9\x9e\ -\x10\x42\x89\xf5\x40\x64\xc7\x66\x04\x9a\x59\xba\xde\xe2\xf5\x9f\ -\x59\x8e\xc5\xcb\xe3\x2f\x83\x06\xbd\x43\xbd\x54\x83\x2a\x45\x3f\ -\x4f\xba\x36\x5d\x55\x24\x96\x3d\x4d\x10\xf8\xf3\x6b\x07\x81\x4f\ -\xc5\x9e\xc6\x97\x3a\x2e\xa1\x07\xac\x00\x7c\x19\xea\x98\xfd\x78\ -\x16\x6c\xae\x66\x13\x5f\x8b\x23\x20\x1b\xad\x4b\x73\xf0\x71\x6d\ -\x8d\x8c\x0c\x02\x1e\x3f\xb8\x83\xb2\x5b\x86\x41\x30\x14\x83\xbc\ -\x97\x23\x03\x28\x12\x74\x01\x7a\x20\x71\xac\xd9\x46\x0f\xc8\x00\ -\xc7\x9a\x25\x08\x54\x3c\x29\xa8\x04\x60\xfb\x60\x49\x30\x34\x23\ -\xf4\x82\x46\x0f\x57\xf0\xf5\x16\x39\x40\x2c\xf8\x85\x56\x8f\x6b\ -\xbd\x20\xe0\x99\x0f\x9f\x81\x9e\x50\xdf\x64\x30\xc9\xdc\x3f\xa7\ -\xe9\xf3\xbb\xe8\x51\x74\x52\x2a\xa4\x14\x28\xe5\xaa\xd4\xef\x86\ -\x52\x4a\x3e\x18\xcb\x53\xb2\x8a\x38\x01\x58\x3e\xcc\xf9\x2e\x45\ -\xdd\x62\x76\xb5\x07\x09\x20\x03\xcc\x70\x51\x0b\x02\x31\xe0\x3b\ -\xf4\x02\x52\xe2\xba\x2e\x87\xab\x87\x43\x7f\x76\x03\x53\x70\xdb\ -\xf2\x3b\xb8\xfb\xa2\xaf\xd4\x74\x87\xde\x12\xc0\xc0\xb2\xe1\xf9\ -\x95\x07\x96\x0d\xb3\x7b\xcb\xbf\x42\x35\xd1\x13\xc0\x4f\x5f\x18\ -\xe5\xe1\xc2\x28\x6e\x0f\x50\x01\x1c\x56\xc4\x13\xa8\x8f\xfb\xc8\ -\xb2\x4b\xf0\x02\x40\xc5\x71\xc0\x03\x96\x03\x3e\xe0\x42\x26\x99\ -\xe5\xf4\xde\x91\x78\xbb\x01\x8a\x50\x19\xce\x2e\x9e\xd3\xa3\x65\ -\x51\x6d\x20\x20\xf4\x82\x4e\xa2\x65\x12\xb7\x05\x1f\x47\x08\x90\ -\xb5\x1d\x48\x53\xb5\x90\x84\x04\xe2\xf7\xbc\x8e\x45\x40\x78\x7a\ -\x49\x20\x85\xde\x3a\x89\xeb\x80\x2e\xd9\x0b\x80\xa2\x28\xa8\xa8\ -\xa1\xb6\x30\xf1\x28\x7a\x05\x3e\x98\x7d\x7f\x51\x08\x0d\x66\x56\ -\xa1\x08\x15\x80\x40\xfa\x4c\x15\x27\x4e\x84\x0f\x20\x25\xcc\x79\ -\x85\x50\x4f\x15\x30\x80\x34\xf1\xdb\x28\x31\xe0\x5b\x81\x6e\xc8\ -\x03\x29\x51\x14\x85\x6c\x4f\x96\x8f\xd4\x8f\xc0\x05\x7a\x61\xfb\ -\xd1\x51\x1e\x7f\x7c\x94\x6e\x15\xba\x35\xe8\x56\xc0\x9e\x86\xe7\ -\xee\x1c\x67\xb0\x27\x0c\x9b\x7c\x69\x82\xcb\x7f\xb9\x86\x65\x03\ -\x50\xf6\xa1\xe4\x83\xe9\x83\xad\x43\x75\x2d\xa1\x2e\x15\x30\x39\ -\xd6\x76\x17\x6a\x4a\xa4\x43\x42\x8a\xaa\x72\x9e\x7e\x1e\xef\xfa\ -\xef\x86\x8b\x0a\x90\xeb\xa0\x2b\x01\xcb\x0d\xe8\x4f\x40\x9f\x0a\ -\xb9\xfd\x8b\xd7\xee\x3f\x1d\xd6\x9c\x0b\xc7\x7d\xc8\x57\x21\x5f\ -\x81\xa0\x0a\x55\x9b\x30\x9f\x04\x30\xc6\x5f\x5b\x9e\xc4\x11\x89\ -\x06\x22\x31\xe0\x45\x93\x56\x53\x55\xae\x4d\x5f\x4b\x8a\x54\x18\ -\xb7\x1e\xd8\x55\xb0\x6a\x8f\x59\x85\x39\x0f\x5c\x9d\xc6\x8a\x50\ -\x40\x55\x83\xe3\x1e\x14\x6b\xf3\x2c\x17\x0a\x36\xc8\xc8\xfa\x01\ -\x36\xdb\xf9\x6d\xcb\xb4\x12\x75\xf1\xdc\x2a\x94\xea\x4b\x87\xf9\ -\xcf\x15\x85\x54\x2a\xc5\xf0\xc0\x30\xe7\x7b\xe7\x87\x00\xd5\xd0\ -\x7a\xa6\x0d\x73\x4e\x08\xe8\xb8\x0d\x96\x02\xb2\x8e\x80\x14\xe1\ -\x58\xde\x82\x59\x1b\x0a\x16\xcc\x5a\x50\xaa\xd6\x11\xcd\xb3\x9f\ -\x32\x93\xb1\x04\xa2\xe4\x6a\x97\x07\xf3\xa0\x9b\x78\xc1\x30\x0c\ -\x4e\x3b\xed\x34\xb6\x74\x6f\x21\x29\x93\xe1\x2e\xa4\x83\x53\x81\ -\x82\x09\xc7\xcb\x30\x53\x06\x33\xa8\xed\x1a\x75\x04\x4a\x01\x4c\ -\x97\x61\xc6\x84\x19\x0b\xa6\x4d\x90\x0a\xe1\xf6\xe9\x61\xf1\x0b\ -\x7e\x0e\x14\xdb\x27\x71\x1c\x91\x26\xe0\x59\x30\xa6\x28\x0a\x3d\ -\x3d\x3d\x9c\xbd\xfa\x6c\xae\x7b\xeb\x3a\x1e\x1d\x7e\x94\x40\x04\ -\x90\x02\xbb\x0c\xbe\x0f\xae\x02\x09\x09\xbf\x39\x30\x4a\x36\x91\ -\x45\x00\xc5\x6a\x81\x39\x09\xae\x09\x85\x4a\x98\xc8\x72\x19\xa1\ -\x01\x04\x2e\xbb\xf9\x35\xef\x72\x00\xb0\x5a\x27\x71\x0d\xec\x22\ -\x22\xcd\xc0\x37\x23\x52\xf3\x42\x7f\x7f\x3f\x57\xf6\x5f\x89\x77\ -\xcc\x63\xd7\x9a\x5d\xb8\x09\x17\x34\xa8\x16\x60\xda\x07\xcd\x85\ -\x1f\x1f\x1c\x45\x55\x00\x19\x9e\x53\x55\x03\x2a\x25\x90\x1a\x90\ -\xac\x59\x3e\x41\xc0\x93\x3c\xc1\x63\xec\x06\x8e\x01\xce\x92\x3c\ -\xb0\x54\xf0\xd4\xbc\x90\xc9\x64\x58\xbf\x7e\x3d\x57\xf9\x57\x91\ -\x3c\x96\x64\xe7\x9a\x9d\x58\x3d\x56\x58\x5e\xe4\xc1\x4b\x40\xc9\ -\x24\xcc\x11\x8d\x90\x81\x0a\xf4\x12\xee\xfb\x69\x60\x0e\x97\xc7\ -\x78\x8a\xc7\xf8\x3d\x70\x18\x28\x48\x29\xfd\x25\x7b\x60\x29\xe0\ -\xa3\xbe\xae\xeb\x0c\x0e\x0e\xa2\x28\x0a\xc6\x21\x83\xb5\x07\xd6\ -\xb2\x2b\xb3\x8b\x83\xab\x0f\x52\x19\xa9\x40\x01\xe8\x03\x8a\x84\ -\xa4\x12\x80\x1d\x8e\x25\xfd\x24\xe7\x4c\x9c\xc3\xbe\x5b\xf6\xfd\ -\x99\x59\x9e\x02\xfe\x0d\x4c\x4b\x29\x3d\x88\xbf\x52\x2e\xf2\x40\ -\x04\x96\xfa\xfe\xc2\xf7\x26\xe0\xa3\xd6\x30\x0c\x06\x07\x07\x31\ -\x0c\x83\x54\x2a\xc5\xd0\xd8\x10\xd3\x6f\x4e\xf3\x5a\xf6\x35\xde\ -\x5e\xfe\x36\x53\xfa\x14\x4a\x8f\x82\x86\x86\x2a\x54\xd2\x76\x9a\ -\xf5\xaf\xaf\xe7\xe2\xca\xc5\x0c\xf5\x0f\x71\xcd\xec\x35\xe3\xc0\ -\x5b\xc0\x24\xe1\xa9\x42\x2b\x02\x0d\xa5\xc4\x22\xe0\x4d\xce\x88\ -\xb8\xfb\x70\xfd\x98\xae\xeb\xf4\xf5\xf5\x91\x4c\x26\x19\x1a\x1a\ -\x22\x97\xcb\xb1\x2e\xb7\x8e\x4b\x73\x97\xe2\x38\x0e\xb2\x76\x7a\ -\x0b\x21\xd0\x34\x8d\x4c\x36\xc3\xca\x95\x2b\x59\xb5\x6a\x15\xc0\ -\xc7\x40\x5e\x4a\x59\xad\xd7\xdb\xa2\x1a\x6d\x1e\x3a\x0b\xad\xde\ -\x0e\xfc\xc2\xbe\xa6\x69\x64\x32\x19\xd2\xe9\x34\x03\x03\x03\x58\ -\x96\x45\xa9\x54\xc2\x34\xcd\xb0\xf8\xd3\x34\x54\x55\xc5\x30\x0c\ -\xd2\xe9\x34\xdd\xdd\xdd\x74\x75\x75\x41\x58\x01\x79\x0b\x61\xb6\ -\xb9\x52\xd2\xb1\x07\x9a\xdb\x20\x9e\x8c\xae\xeb\x68\x9a\x46\x57\ -\x57\x17\xbd\xbd\xbd\x78\x9e\xd7\xe0\x01\x45\x51\x50\x55\x75\xfe\ -\x9d\xc6\xa3\xa2\x3d\x81\x79\xc0\xd4\x85\x52\xfd\x78\x4c\x98\x74\ -\x02\x3e\x92\x1a\x30\x54\x55\x45\xd7\xf5\x56\x50\x62\xa5\x6d\x12\ -\x2f\xb4\x7e\x27\xa1\xd3\x0e\x7c\x2b\xaf\x2d\x55\x3a\xf2\x00\x4d\ -\x00\xb4\x4b\xda\xb8\xcf\xe2\xe6\x4a\x29\xe7\xef\xc5\xf5\xf7\xe3\ -\xfa\x90\x6d\x26\xad\x3d\x10\x29\xe9\x40\x51\x33\x80\x9d\x80\x0f\ -\x82\xa0\x01\x7c\xd4\x6f\xf8\x1d\x45\x8d\x5d\xaf\x7d\x08\xd5\x77\ -\x39\x75\x61\x24\xa5\x9c\x07\xeb\xfb\x3e\xbe\xef\x13\x04\x41\x03\ -\xa1\xf9\xb5\x34\x03\x4e\x3a\x89\x3b\xb4\x7c\x4b\x3d\x0b\x88\x45\ -\x40\x83\x20\xc0\x75\x5d\x3c\xcf\xc3\xf7\x7d\xaa\xd5\x6a\xd8\xf7\ -\xc3\x2f\xb9\x14\x21\x50\x74\x83\xc3\x47\xde\x99\x00\x72\xcd\x48\ -\x9c\xb2\x10\xea\xd4\x13\x11\x70\xcf\xf3\x70\x5d\x17\xd7\x75\x71\ -\x1c\x07\xcb\xb2\xb1\x1d\x1b\xb7\xea\xe2\xd7\x08\xa4\x7b\x32\x14\ -\x73\xd3\xd6\xad\x37\x6e\xfe\x15\xf0\x6c\x54\x3e\x2c\x99\xc0\x22\ -\x22\x31\xe0\xda\x49\x14\x36\x11\xf8\x6a\xb5\xca\x5c\xa9\x44\xa1\ -\x50\xc0\xb6\x2c\xca\x96\x45\xb5\xea\x92\xcd\x66\x18\x1a\x5e\xc9\ -\xcc\xcc\xb4\x7f\xcb\xcd\x5f\xfa\xc9\x91\x23\x47\x7e\x26\xa5\x9c\ -\x6b\xa6\xb3\x65\x29\x71\x32\xa1\xd3\x8a\x60\x44\x20\x02\x5f\x28\ -\x14\x99\x98\x38\x46\xd9\xb6\xe8\xee\xea\x66\x60\x60\x80\xc1\x15\ -\x2b\x30\x0c\x83\xa3\x63\x63\xc1\x9d\x5b\xb7\x3e\x74\x60\xff\x3b\ -\x3f\x92\x52\x16\xe3\xd6\xeb\xac\x1a\x5d\x02\xe8\x38\xa9\xb7\xbe\ -\xe7\x79\x98\xa6\xc9\xf1\xe3\xc7\x29\x95\x4d\x2e\xbb\xe4\xd2\x5a\ -\x32\x7b\x98\x66\x99\xb1\xf1\x31\x79\xcf\x7d\xdf\xd8\xbe\x6f\xdf\ -\xbe\x07\xe2\x2c\x1f\x49\xdb\xaf\x9a\xe2\xe2\xff\x93\x84\x8f\xe3\ -\x38\x98\xa6\x49\xa9\x34\x47\x77\x57\xba\x01\xfc\xf8\xf8\x18\xf7\ -\x3f\x78\xff\xce\x97\x9f\x7f\xf1\xbe\x76\xe0\x3b\x22\xb0\x88\x48\ -\xa7\xf3\xeb\xe6\x46\xdb\x62\xb4\x5d\xda\xb6\x43\xb9\x6c\x61\x5a\ -\x16\x99\x4c\xa6\x01\xfc\x43\xdb\x46\xf7\xec\xf9\xe3\x9e\x3b\x3a\ -\x01\x0f\x4b\x4c\xe2\xa5\x80\x5e\x28\xf5\x1e\xa8\x54\x1c\x1c\xc7\ -\xa1\xe2\x38\x0c\x0d\x0d\x46\x61\xc3\xe8\xb6\xd1\x3d\x3b\x77\xec\ -\xbc\x5e\x4a\x59\xea\x74\xcd\xd6\x49\x7c\x8a\xa4\xfe\x94\xf5\x3c\ -\x8f\x6a\x2d\x89\xb3\xd9\x2c\x89\x44\x92\xb1\xf1\x31\x79\xff\x77\ -\x1f\xd8\xb1\xe7\xe9\xdd\x77\x2d\x05\x3c\x9c\x62\x0f\xb4\x92\x86\ -\x30\xf2\x7c\x02\x29\x19\x19\x59\xcb\xd1\xb1\xb1\xe0\xde\x6f\xde\ -\xfb\xf0\x8b\x7f\x79\xe1\x5b\x4b\x05\x0f\xff\x05\x02\x51\x58\xd5\ -\x17\x6a\x52\x4a\x32\xbd\x7d\x14\x8b\x05\xff\xae\xbb\xb6\xfe\x70\ -\xdf\xdf\xf7\x3d\x28\xa5\x34\x4f\x46\x7f\xfc\x85\xe6\x14\x95\xbc\ -\x11\xf0\xa8\xae\x51\x14\x05\x3d\x95\xc6\x9e\x2b\x5a\x5b\xbf\x7c\ -\xcb\xf7\xf7\xef\xdf\xff\xd0\xc9\x82\x87\x16\x39\xa0\x28\x0a\x89\ -\x44\xa2\x61\xf0\x64\x77\x21\x84\x40\x0a\x05\xa9\xea\x88\x44\x17\ -\x1f\x7c\x7c\x78\xe2\xee\x2d\xb7\x6e\x3b\x7a\xf8\xf0\xf6\x4f\x02\ -\x1e\x88\xfd\x57\x83\xcb\x80\x35\xd4\xdd\x2c\x4f\xa1\x48\xe0\x43\ -\xe0\xb9\x4f\x0a\x1e\x9a\x10\x00\x10\x42\xa8\x9c\x92\xbf\xa7\xc4\ -\x8a\x6c\x56\x98\x9d\x8c\x34\x25\xf0\xff\x24\xff\x01\x04\xe4\x96\ -\x06\x80\x39\xb3\x6b\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\ -\x82\ \x00\x00\x24\x35\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ @@ -1729,6 +592,445 @@ qt_resource_data = b"\ \xd7\x1d\x45\xc4\x5f\xd2\x4b\xfe\x1d\xe4\xdf\x8f\x67\x8f\xff\x0f\ \x43\x93\xec\x91\x11\x6b\x72\x1d\x00\x00\x00\x00\x49\x45\x4e\x44\ \xae\x42\x60\x82\ +\x00\x00\x0c\x65\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x00\x30\x00\x00\x00\x30\x08\x06\x00\x00\x00\x57\x02\xf9\x87\ +\x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\ +\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x05\x31\x00\x00\x05\x31\ +\x01\xb7\xed\x28\x52\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\ +\x74\x77\x61\x72\x65\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\ +\x70\x65\x2e\x6f\x72\x67\x9b\xee\x3c\x1a\x00\x00\x0b\xe2\x49\x44\ +\x41\x54\x68\x81\xd5\x99\x7b\x70\x5d\xc5\x7d\xc7\x3f\xfb\x38\x8f\ +\x7b\xaf\x9e\x96\x84\x2c\x8c\xcd\xcb\x60\x17\x30\x0e\x1e\xa0\xc4\ +\xb2\xc1\x86\x31\xc6\x21\x24\xb4\x09\x4d\xa7\x24\x24\x99\x69\x68\ +\x69\xa6\x9d\xd0\xd0\x4e\xa8\x3b\x24\x0d\xa5\x90\x76\x32\x6e\x60\ +\x32\x06\xc2\x4c\x03\x49\x4a\x93\x40\xc0\x71\x28\x61\xa0\x60\x22\ +\x0b\xdb\xb1\x15\xe1\x67\xb1\xc1\xf8\x21\x20\xf2\x53\x92\xad\x7b\ +\x75\x5e\xbb\xdb\x3f\xee\x95\x2c\x64\xf9\x21\x5b\x4e\x27\xbf\x99\ +\xdf\xf9\xed\x9e\xdd\x73\xf6\xfb\xdd\xf3\xf8\x7d\xcf\x59\xe1\x9c\ +\xe3\xf7\xd9\xe4\xff\x37\x80\xd3\xb5\xdf\x7b\x02\x62\xe2\x57\x2f\ +\x92\x81\x17\xfc\xdd\xac\x29\x33\xe7\xd5\xe6\x6a\x3c\x29\xa4\x10\ +\x42\x30\x14\x11\x08\x21\x85\x14\xe5\x58\x6e\x13\x95\xb6\xe1\x75\ +\x89\x10\x62\xb0\x1f\xe5\x9a\x40\x08\x21\x9c\x73\xce\xe1\x70\xce\ +\x61\x9d\x73\xce\xd9\x4a\x74\x38\x67\x9d\x2d\xb7\x95\x4b\xce\x39\ +\x3b\xb8\xff\xc3\xed\x58\x67\x9d\x73\x8e\x81\x34\xca\xde\xec\xda\ +\xf0\x7a\x4f\xb1\xf7\x41\x8d\xe0\x8e\x85\x33\xe6\x3d\x24\xfc\x94\ +\xc4\x16\x91\x5a\xa2\xb5\x44\x29\x85\xd6\x02\x25\x15\x9e\xf2\xf0\ +\x84\x46\x2b\x81\x96\x1a\x4f\x69\x34\x0a\xad\x34\x4a\x6a\xb4\x54\ +\x28\xa1\xd0\x42\xa3\xa4\x42\x4a\x8d\x12\x8a\x41\x32\x95\xc1\x31\ +\xce\x60\x6d\x46\x66\x0d\xc6\x19\x8c\x2b\x97\x33\x9b\x91\x99\x0c\ +\xe3\x0c\xa9\xcd\xca\x75\x6b\x49\x8d\x21\x75\x09\xc6\x58\x8c\x71\ +\xa4\xa9\xc1\x1a\x4b\xb5\xd3\xfc\x51\xf3\xa2\x1b\xbf\xdf\xf6\x5f\ +\xbf\xd5\x42\x60\x56\xed\x6a\x47\x54\x95\xd0\x9e\x40\x69\x50\x9e\ +\x40\x69\x81\x57\x01\xe7\x29\x55\x06\x2e\x55\x19\xac\x54\x28\x29\ +\x51\x62\x30\x4a\x86\xcd\x3c\x95\x99\x47\x0c\xbb\xd4\x0e\x28\xcf\ +\xb8\xa3\x3c\xa3\x16\xeb\x1c\xc6\x59\x8c\x2d\x93\x33\xd6\x62\xac\ +\x21\xb3\x86\xb4\x42\x2c\x35\x83\xf5\x0c\x93\x39\x4c\xea\x30\x19\ +\xa4\x7d\x21\xf5\x85\xba\x48\x0b\x21\x9e\x3e\xd0\x5b\xfc\xd3\x5a\ +\x2d\x3e\x16\xe6\x05\xca\x03\xad\x25\x5e\x65\xa6\x8f\x90\x28\xc7\ +\xe1\xae\x84\x44\x49\x89\x14\x83\x2e\x90\x42\x96\x81\x8f\x42\x00\ +\xe7\x70\x80\xad\x80\x2f\xc7\x41\x02\xb6\x72\x35\x0c\xaa\xe2\xa9\ +\x91\x28\x51\x06\x2f\x8d\x20\x21\x43\x08\x4b\xe9\x90\xa5\xe7\x60\ +\xe9\xbf\xa1\xf4\x53\xe1\x9c\xe3\x9c\x7b\xa7\x85\x08\x5e\x68\x68\ +\x91\xd7\xd7\x35\x68\x7c\x55\x06\xef\x84\x23\x73\xd9\x10\x10\x51\ +\x46\xc6\x91\x6d\xb9\x24\x8e\x14\x4f\xde\xdc\xf0\x30\x7c\x5b\x2e\ +\x0d\xbe\xdd\x7d\x19\xa0\x90\xa4\x36\x23\x35\x19\x07\xf6\x27\xec\ +\x7d\x3f\x7b\x15\xc7\xcd\xef\x3d\xb8\x35\x12\x83\x79\xe0\x9c\x7f\ +\x98\x56\x10\x42\xbc\x7c\xf6\x14\xff\xa3\x8d\x0d\xb9\x21\x12\x91\ +\x1d\x20\x32\xf1\x18\x90\x8d\x9f\xe5\x75\x8e\x82\x2a\x0c\x81\xdf\ +\xbb\x7f\x80\xdd\x3b\x4b\xab\x9c\x73\x0b\xde\xfb\x97\xad\x45\x00\ +\x31\x3c\x91\x4d\x5e\x3c\xad\x56\x08\x5e\x9d\x3a\xb5\x66\x56\x53\ +\x43\x01\x5f\x69\x7c\xa9\xe8\x4d\x0e\x51\xcc\x06\x7e\xa7\xe0\xab\ +\xbd\x02\x13\x82\x3a\x32\x6b\x48\x6c\x46\xf7\xfe\x7e\xb6\x6d\xeb\ +\xf9\x8d\x75\x5c\xdf\xf5\xc0\xd6\xbe\xc1\x7e\x62\x64\x26\x9e\xf2\ +\x8f\xd3\x1a\x84\x14\x2b\x66\x4c\x6f\xbc\x6c\x62\x43\xcd\xd0\x73\ +\xb0\x67\x60\x1f\x87\x92\xfe\xdf\x09\xf8\xda\xa0\x9a\x49\x85\x89\ +\x64\x26\xab\x80\x3f\xc4\x9b\x5b\xba\x37\x19\xeb\xe6\xed\xfe\xe7\ +\xad\x07\x86\xf7\x3d\x8a\x00\xc0\xb9\xf7\x4d\x6f\x56\x52\xb6\xfd\ +\xe1\xe5\x93\x2e\x6a\xae\xaf\x90\x10\x8a\x9d\xc5\xf7\xe9\x8b\x0f\ +\x9f\x51\xf0\xf5\x41\x0d\x17\xd6\x4c\x39\x32\xf3\x07\xfb\x68\x7f\ +\x73\xf7\xdb\xc6\xda\xb9\xbb\xbe\xf9\xd6\x9e\x91\xfd\x47\xcd\xc4\ +\xbb\xbe\xf9\xd6\x1e\xeb\xdc\xf5\xeb\x36\x7f\xb0\xab\xd8\x9f\x12\ +\x2a\x9f\xd0\x0b\xb8\x74\xc2\x54\x26\x84\x35\x48\xc1\x19\xf1\x86\ +\x5c\x2d\x97\x37\x4d\x23\xd4\x3e\x81\xf6\xe9\xef\x4f\x59\xbd\xb1\ +\x6b\x97\x75\xee\xfa\xd1\xc0\xc3\x31\xae\xc0\xa0\x5d\xf8\x8d\x4b\ +\xcf\x0f\xb4\x6e\xbf\xe9\x9a\xe9\x2d\xcd\x75\xb5\x78\x52\x23\xa5\ +\xa0\x73\xdf\x16\x7a\xe3\x43\xa7\x3c\xcb\xa3\x59\x7d\x50\xcb\x95\ +\xcd\x97\xe1\xac\x23\xb5\x86\xee\xde\x3e\x7e\xb1\x66\xd3\x6f\xe3\ +\x24\x6b\xdd\xfe\xf5\xcd\x3b\x8e\x75\xdc\x71\xb5\xd0\xf6\x6f\x6c\ +\xde\x81\x90\xf3\x57\x74\xee\xd8\x57\x1a\x48\x09\xb4\x47\x5e\x87\ +\xcc\x39\x7b\x16\xf5\x61\xed\x91\x84\x75\x9a\x5e\x1f\xd6\xd2\x7a\ +\xf6\x15\x14\xbc\x1c\x81\xf6\x29\x46\x09\xaf\x74\xbc\xbd\x0f\x2b\ +\xe7\x1f\x0f\xfc\x09\x09\x00\x6c\x59\xdc\xb9\x55\x4b\xef\x86\xd7\ +\xd7\xef\xe8\x8d\x63\x5b\x49\x68\x9a\xd6\x96\x2b\xa8\x0b\xab\x91\ +\x52\x9c\x96\xd7\x85\xd5\xb4\xb6\xcc\xc2\x93\x1a\x80\x81\x38\xe3\ +\xb5\xce\x77\x7b\x7d\xe5\xdf\xb0\x65\x71\xe7\xd6\x13\xe1\x3b\x29\ +\x35\xfa\xeb\xaf\xb6\x6f\xcc\x7b\xb9\x05\x6f\x6c\xde\xd5\x5f\x8a\ +\x13\x04\x02\x4f\x7a\xcc\x6e\xb9\x82\x6a\xbf\x50\xc9\xc0\x63\xf7\ +\x1a\xbf\xc0\xec\x96\x59\xf8\x4a\x03\x82\x81\x38\xa5\x6d\xe3\x8e\ +\xfe\x50\x07\x0b\x56\xff\xed\xca\x8d\x27\x83\x4d\x38\xe7\xf8\xe2\ +\xd3\xb7\xdf\x54\x13\xd6\xce\xad\x0e\xaa\x03\xa8\xe4\x56\x01\x4a\ +\xca\x61\x82\x40\x10\x67\xd1\x15\x25\xd3\x37\xff\xd2\xf3\xeb\xf0\ +\x3d\x85\x40\x10\x65\x31\x6f\xec\xf9\x0d\xa5\x31\xe6\x89\xbc\xce\ +\x31\xbb\x79\x16\xa1\x0e\x00\x88\xd3\x8c\x4d\x3b\x7a\xa8\xd2\xf5\ +\xaf\x05\x3a\xe8\x2c\x3f\x9a\x83\x19\xda\x55\x92\x73\xb9\x1e\x65\ +\x51\x7a\xa0\xb8\xff\xf5\x27\x3e\xf3\x83\x5f\x8a\xfb\x5f\xb9\xe7\ +\xe3\x2d\x75\x93\x96\x57\xe7\x0b\x80\xad\xe8\x1c\x3d\x24\xda\xb4\ +\x50\x08\x21\x11\x15\x91\xd6\x17\xef\x67\xef\xc0\x4e\x02\xbf\x42\ +\x4b\x08\xa2\x2c\xa2\x7d\xef\x3a\xa2\xec\xe4\x32\x76\xa8\x43\x5a\ +\xcf\xba\x92\x9c\x0e\x86\x44\x5e\x92\xc0\x84\x70\x32\x0d\xb9\x89\ +\x38\xe7\x86\xe9\x26\x43\x56\x11\x7a\xd6\x59\x52\x9b\xe1\x9c\xc3\ +\x64\x82\xed\xfb\xb6\xdd\xac\xa7\xb7\x9c\x7b\xee\x81\xf8\x00\x1d\ +\xfb\x56\x13\x7a\x3e\xa1\x2a\xbf\xc2\x02\xed\x11\x28\x1f\x25\xe5\ +\x90\xfa\x19\xd4\x42\x83\xe0\xcb\xd7\x47\x50\xf0\xf2\xb4\x36\x5f\ +\xc9\xaa\xee\x0e\x22\x7b\x7c\x12\xa1\x0a\x98\xdd\x7c\x25\x05\x9d\ +\x3b\xa2\x50\x05\xf8\xbe\xa3\xdf\x76\x71\xb8\xd8\xc5\x11\x2d\x54\ +\x26\x61\xac\x25\x36\x09\x71\x96\x12\x67\x09\x91\x49\x38\x27\x7f\ +\x21\x33\x26\x5d\x3c\x45\xb4\xbf\xff\x74\xb5\xc5\xae\xe9\xe8\x5e\ +\xfb\x07\x87\xd3\x3e\x02\xed\x13\x2a\x8f\x40\xfb\x78\x4a\x1f\x05\ +\x5e\x54\x66\x5d\x20\x90\x82\x4a\x2c\xd7\xfb\xd3\x7e\xda\xf6\xae\ +\x23\xb1\xe9\xa8\xe0\x7d\xe9\x31\xb7\xf9\x2a\xaa\x75\xa1\x0c\x1e\ +\x87\x2d\x7f\xea\x60\xcb\x77\x49\x99\xd0\xe0\x8d\x33\x8c\x44\x6a\ +\xb2\x0a\xf8\x94\x82\xaa\xe6\xb2\xc6\x99\xff\x2b\x91\x57\x0b\xe7\ +\x1c\xcf\x6e\x5a\x3a\xd1\x3a\xd3\xf6\x41\xb2\x7d\xaa\x93\x29\xa1\ +\x2e\x13\xd8\x5d\x7c\x8f\xfd\xf1\xc1\x51\xf4\xe7\x91\xcd\x48\x01\ +\x3a\x90\x45\x94\xcc\xe8\xcf\x43\x5e\xe7\xc8\xab\x90\x91\x99\x67\ +\x48\x8b\x3a\x46\xb4\x39\x1a\x83\x06\x26\x17\x26\x01\x10\x67\x09\ +\xce\xf8\x34\xa9\x29\xef\x08\x21\xe7\x7e\xea\xb2\xbb\xba\x87\x12\ +\xd9\xe3\x6f\x7c\x6b\x32\xc2\xae\xcc\xc2\x83\x53\x7c\x1f\x94\x94\ +\x38\x67\xd9\xd0\xb7\x85\x9e\xa4\x77\x54\x40\x67\xda\xea\xfd\x7a\ +\x66\xd6\x5d\x82\x40\xe0\x80\x2c\x51\xd8\x62\xd5\x6e\x9c\x9c\xf3\ +\x17\xad\x5f\xeb\x82\x11\x99\xf8\xc1\x5f\x2e\xbe\x40\x4a\xd7\x3e\ +\xa1\xd9\x4c\xf4\x7c\x00\x81\xc5\xb2\xa1\x77\x13\x7d\x69\xdf\xe8\ +\xa3\x9c\x21\xab\xf5\x6a\x99\x59\x37\x03\x29\x04\xce\x41\x9a\x38\ +\x0e\xee\x51\xdd\xd6\x8a\xd6\x7b\x6f\x7a\xe0\xdd\xc1\x7e\x47\x49\ +\x89\xaf\x3d\x73\xf7\x74\xa5\x69\x9b\x72\x9e\xdf\x18\x86\x02\x10\ +\x18\x97\xb1\xa1\x77\x13\x87\xb3\x33\x2b\xe4\x06\xad\x46\x57\x33\ +\xb3\x7e\x06\x12\x85\x03\xe2\xd8\xb2\xf3\xdd\x78\xbf\xc9\x98\xfb\ +\xad\xdb\xfe\xfd\xad\xe1\x7d\x47\xd5\x42\x77\x3d\x79\xe7\xe5\xbe\ +\x27\x5f\xbf\xe4\xd2\x9a\xba\x5c\xa0\x10\xa2\x4c\xe2\xcd\xbe\x0d\ +\xf4\x67\xc5\x33\x0a\xbe\x4a\x57\x31\xab\xee\x72\x14\x1a\x8b\x63\ +\x20\x32\x6c\xde\xdc\xd7\x9b\xa4\xf6\xba\xa5\x9f\x7f\x7c\xc3\xc8\ +\xfe\xc7\x14\x73\x9f\x5d\xfa\xb9\xab\xc2\x40\xbf\x7a\xf5\xac\xa6\ +\xaa\x7c\x4e\x23\x85\xc4\xba\x94\x8e\xde\xf5\x14\x4d\xe9\x8c\x80\ +\x2f\xa8\x3c\x57\xd6\x7d\x04\x2d\x3d\x8c\x73\x94\x06\x12\x56\x75\ +\xec\xed\x8f\xe2\xec\xfa\x1f\xdd\xf5\xc3\xb5\xa3\x1d\x73\x5c\x35\ +\x7a\xeb\x92\xdb\xe6\x54\xe5\xbd\x97\xe6\x7f\x74\x72\x3e\x1f\x7a\ +\x28\x21\x49\x5d\xca\xba\xde\x4e\x06\xec\xf8\x7e\xa1\xe5\x65\x8e\ +\xab\xea\x66\xe1\x49\x0f\xeb\x1c\xfd\x51\xc2\xab\x6f\xec\x2e\xf5\ +\x97\xd2\x85\xcf\xdf\xfd\xd3\x95\xc7\x3a\xee\xb8\x04\x00\x6e\x7c\ +\xf0\x96\x1b\x6a\xab\xc3\x17\x3e\x3e\x6f\x6a\x90\x0f\x7c\xa4\x10\ +\x24\x36\x61\x6d\x5f\x07\x91\x8d\xc6\x05\x7c\x4e\x86\x5c\x53\x7f\ +\x15\x9e\xf0\x31\xce\x52\x8c\x52\x96\xaf\xd8\x16\xf7\x1e\x8e\x6e\ +\x7e\xf9\xde\xe5\xff\x73\xbc\x63\x4f\x48\x00\x60\xee\x3f\x2d\xbc\ +\xb9\xb1\x2e\xff\xfc\xa7\x6f\xbc\x44\xe7\x7d\x1f\x2d\x24\xb1\x8b\ +\x58\xdd\xb3\xee\x84\x99\xf7\x44\x16\xca\x80\xd6\x09\x57\x13\xca\ +\x1c\x99\x35\x14\xe3\x84\x1f\xbf\xbc\x29\xdb\xdf\x53\xba\xb5\xed\ +\xeb\x2f\xbd\x70\xa2\xe3\x4f\x8a\x00\xc0\x55\x8b\xe7\x7f\xaa\xa5\ +\xb1\xfa\x27\xb7\x2f\xfa\x88\x2c\x04\x3e\x5a\x28\x22\x5b\xa2\xad\ +\x77\xcd\x31\x33\xef\x89\x2c\x90\x3e\xd7\xd5\x5f\x43\x5e\xe5\x49\ +\xad\xa5\x98\x24\x3c\xf5\x42\x87\xfd\x60\xff\xe1\x3f\x59\xfb\xc0\ +\x6b\xcf\x9e\xcc\x39\x4e\x9a\x00\xc0\x8c\xbf\x9f\x73\xfb\xb9\x13\ +\xeb\x9e\xfa\xd2\x2d\x57\xcb\x9c\xef\xa3\xa5\xa4\x3f\x2b\xd2\xd6\ +\xb3\x8a\xc4\x65\x63\x02\xef\x4b\x8f\xf9\x13\x66\x53\xa5\xaa\xc8\ +\x9c\x61\x20\x49\x79\x74\xd9\x6a\xbb\xb3\xbb\xe7\x8e\x8d\xff\xba\ +\xf2\x47\x27\x7b\x9e\x31\x11\x00\x98\x7e\xf7\x35\x7f\x7e\xd1\xe4\ +\xc6\xc7\xff\xea\xd6\xd9\x22\xe7\x79\x68\xa9\x38\x64\x0e\xb3\xe2\ +\xe0\x1b\xa4\x27\x49\xc2\x13\x9a\x05\x0d\x73\xa8\xd5\xb5\x24\x36\ +\x23\x4a\x53\x1e\xfe\xd9\x4a\xb7\xad\x6b\xdf\x9d\x6f\x2d\x59\xfd\ +\xc4\x58\xf0\x8c\xf9\xf7\xfa\x5b\x4b\x56\x3f\xb1\x65\xc7\x9e\xaf\ +\x3c\xb6\x6c\x15\xc6\x39\x24\x82\xb3\xbc\x09\x2c\x68\x6c\xc5\x97\ +\xfa\x84\x1f\x31\xbe\xf4\x58\xd4\x74\x2d\xcd\x41\x23\x12\x81\xb5\ +\x8e\xef\x3e\xdf\xce\xe6\x1d\xdd\x5f\x19\x2b\xf8\x53\x22\x00\xb0\ +\xfd\x91\xb5\x0f\x77\x6c\x7b\xef\xde\xef\x3e\xd7\x8e\x73\x65\x75\ +\x3a\xd1\x3f\x8b\x05\x8d\x73\x50\x4a\x22\x24\xa3\xba\x52\x92\x45\ +\x4d\x73\x39\x3b\x38\xab\xac\x6f\x1c\x3c\xfc\x5c\x1b\xeb\xb6\x76\ +\xdd\xbb\xfd\x91\xb5\x0f\x9f\x0a\x96\x53\x5e\xe0\xe8\x5a\xda\xf9\ +\xd0\x9a\x2d\x3b\xef\x7f\xe4\xf9\x5f\x61\x9d\x43\x00\x53\x82\x16\ +\x16\x35\xcc\x45\x4b\x75\xd4\xcc\x6b\xa9\xf8\x64\xd3\x7c\xce\xcb\ +\x4d\xaa\x80\x77\x2c\x79\x6e\x05\xab\x36\xef\xb8\xbf\x6b\x69\xe7\ +\x43\xa7\x8a\xe3\xb4\x56\x68\xde\x7f\x6c\xfd\x7d\x2b\xd6\xbf\xf3\ +\xed\x47\x96\xfd\x0a\x5b\x11\xc2\xe7\xe7\x26\xb3\xa8\x61\x0e\x6a\ +\x18\x78\x25\x04\x9f\x68\xba\x8e\x0b\x72\x93\x81\xb2\xc2\x5f\xf2\ +\xdc\x0a\x5e\x7d\x73\xdb\xb7\xdf\x7f\x6c\xfd\x7d\xa7\x83\xe1\xb4\ +\x97\x98\xba\xbf\xb7\xf1\x9e\x17\xd7\x6e\x59\xfa\xc8\xf2\x32\x09\ +\xeb\x1c\x53\x73\xe7\xb1\xb0\x71\x4e\x79\xed\x40\x4a\x3e\xd6\x74\ +\x2d\x17\xe5\xcf\xaf\xfc\x52\x77\x2c\x59\xb6\x82\x5f\xfc\x7a\xe3\ +\xd2\xee\xef\x6d\xbc\xe7\x74\xc7\xd7\xa7\x7b\x02\x00\x63\xcc\x97\ +\x9f\x6d\xeb\xcc\x85\x4a\x7f\xe1\x6f\x6e\x99\x47\xea\x0c\x17\xe7\ +\x2e\x20\xab\x37\x08\x60\x5a\xee\x02\x52\x6b\x48\x9d\xe1\x3b\xcb\ +\x5f\xe3\x27\x6d\x1d\xdf\x07\xbe\x3c\x1e\x63\x8f\xf9\x35\x7a\x2c\ +\xab\xff\xc2\x74\x09\xfc\xe7\x97\x16\xce\xfe\xcc\x9d\x37\xb6\x0e\ +\x2d\x80\x08\xca\x5f\x59\xc6\x59\x1e\x7d\xb1\x8d\xc7\x5e\x5a\xf9\ +\x63\xe0\xcf\x7a\x9e\xdc\x6a\xc7\x63\xdc\x71\x23\x00\x50\xf7\xf9\ +\x69\x1a\x78\xe6\xaf\x6f\xb9\xf6\x93\x77\xcc\xbf\x86\xc1\x9f\x32\ +\x0e\x78\xea\xb5\x35\x7c\xe7\xe7\x2b\x96\x01\x9f\xee\x7d\x72\xeb\ +\xd8\xb2\xde\x71\x6c\x5c\x09\x00\xd4\xde\x71\xb1\x0f\xfc\xfc\x9e\ +\x3f\xbe\x61\xe1\x6d\x73\xae\x00\x04\xcf\xac\xec\xe4\xdf\x7e\xf6\ +\xca\x4b\xc0\x27\xfa\x9e\xda\x96\x8c\xe7\x78\xe3\x4e\x00\xa0\xfa\ +\x73\x17\xe5\x84\x10\x2f\xfe\xe5\xa2\xd6\xeb\x00\x1e\x7d\xb1\xfd\ +\x75\xe7\xdc\xa2\xc3\x3f\x78\x7b\xdc\x57\x49\xce\x08\x01\x80\xaa\ +\xcf\x4e\xcd\x01\x5f\xac\x54\xff\xa3\xff\x87\xef\x9c\x91\x25\x9e\ +\x63\x11\xd0\x40\x15\x90\x03\x54\xa5\xae\x86\xb9\x06\x94\xb5\x56\ +\x8d\x6c\x17\x42\x8c\xec\x0f\x60\x2a\x9e\x39\xe7\xcc\xf0\x3a\x60\ +\xa4\x94\x1f\xaa\x8f\x6c\x07\x06\x80\xfe\x4a\xfd\x28\xa0\x1e\x70\ +\x9e\x73\xee\x9c\x0a\xe8\xaa\x38\x8e\xc3\x28\x8a\x18\xe9\x71\x1c\ +\x13\x45\x11\x49\x92\x10\xc7\x31\x49\x92\x90\xa6\xe9\x90\x67\x59\ +\x86\x31\x06\x63\x0c\xd6\xda\xa1\x75\xe1\xc1\xdf\xe8\x52\x4a\xa4\ +\x1c\x5c\x44\xd7\x78\x9e\x37\xe4\xbe\xef\x13\x04\xc1\x87\x3c\x0c\ +\xc3\x21\xcf\xe5\x72\x84\x61\x18\x05\x41\xd0\x0f\xf4\x0b\x21\xde\ +\x03\x76\xea\x24\x49\x0a\x51\x14\x35\x16\x8b\xc5\xa6\x52\xa9\x94\ +\x2f\x16\x8b\xa2\x54\x2a\x51\x2a\x95\x28\x16\x8b\x8c\x2c\x8f\xb6\ +\xef\x78\xe5\x38\x8e\xd1\x5a\x93\xcf\xe7\x87\xbc\x50\x28\x8c\x39\ +\x56\xca\x61\xa1\x50\x08\xf2\xf9\x7c\xae\x50\x28\x44\x41\x10\xec\ +\x1b\x79\x0b\xc9\x9e\x9e\x9e\x5c\x96\x65\x55\xa5\x52\xa9\x50\x2a\ +\x95\x72\x71\x1c\xab\x28\x8a\x74\x14\x45\xaa\xe2\x3a\x8e\x63\x95\ +\xa6\xa9\x8a\xa2\x48\xa7\x69\xaa\x92\x24\x51\x69\x9a\xaa\x2c\xcb\ +\x74\x96\x65\xca\x18\xa3\xac\xb5\xca\x39\xa7\x2a\xe7\x37\x52\xca\ +\x21\xd7\x5a\x67\x5a\x6b\xe3\x79\x9e\xf1\x7d\xdf\xf8\xbe\x9f\x55\ +\xa2\xc9\xe5\x72\x59\x25\x9a\x30\x0c\x33\xdf\xf7\x4d\x3e\x9f\x1f\ +\xc8\xe7\xf3\x45\xcf\xf3\xfa\x5b\x5a\x5a\x06\x80\xa1\x1c\xf2\x7f\ +\x06\x43\x29\xed\xd9\xa6\xc2\x42\x00\x00\x00\x00\x49\x45\x4e\x44\ +\xae\x42\x60\x82\ +\x00\x00\x04\x5b\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x00\x30\x00\x00\x00\x30\x08\x06\x00\x00\x00\x57\x02\xf9\x87\ +\x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\ +\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x05\x31\x00\x00\x05\x31\ +\x01\xb7\xed\x28\x52\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\ +\x74\x77\x61\x72\x65\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\ +\x70\x65\x2e\x6f\x72\x67\x9b\xee\x3c\x1a\x00\x00\x03\xd8\x49\x44\ +\x41\x54\x68\x81\xed\x99\x6b\x8b\x14\x47\x14\x86\x9f\xd3\xb3\x42\ +\x8b\xa8\x7f\xc1\x5f\x10\x08\x61\x41\x84\xe0\x22\xc1\x4c\x12\x08\ +\x03\x21\x08\x22\xa8\x10\x84\xb1\x10\xc4\x3f\x10\xe6\x9b\x20\x48\ +\x20\x0c\x2e\x8b\x60\x02\x22\x88\x04\x16\xc1\x75\x67\x91\x65\x45\ +\x30\x42\x10\x89\x8b\x9f\x37\x7f\xc1\x4b\x24\x97\xcd\x9e\x7c\xe8\ +\x6a\xec\xed\x6b\x55\x75\x4f\x86\x80\x2f\x1c\x7a\x87\xad\x3e\xe7\ +\x7d\xab\xea\x9c\xae\x8b\xa8\x2a\xff\x67\x44\xb3\x26\xd0\x16\xef\ +\x05\xcc\x1a\x4e\x02\x46\x22\xf1\x65\x91\xfe\xb4\xc9\xa4\xb8\x2c\ +\xd2\x1f\x89\xc4\x2e\x6d\x1b\x05\x8c\x44\xe2\xbd\xb0\x1c\xc1\xca\ +\x15\x91\x61\x7b\x7a\xf5\xb8\x22\x32\xec\xc1\xca\x3e\x58\x76\x11\ +\x21\x75\x55\x68\x24\x12\xef\x83\x65\xe0\x53\x00\x01\x15\x30\x97\ +\x54\xaf\x75\x47\xf9\x1d\xae\x8a\x0c\x15\xc6\x49\x28\x00\x26\x6f\ +\x60\xf0\xad\xea\x1f\x55\xef\x54\x0a\x18\x89\xc4\xfb\x33\xe4\x79\ +\xe7\x55\x75\x0a\x22\xae\x8a\x0c\x65\x37\xf9\x24\x18\x4c\x5e\xd7\ +\x88\x28\x15\x30\x12\x89\x0f\xe6\xc8\xe7\xa0\x80\xb9\xd8\x91\x88\ +\xef\x2a\xc8\x67\x30\x39\x08\x83\x33\x25\x22\x0a\x02\x7e\x10\x89\ +\x5f\xc3\xb2\x56\x93\x4f\x5e\xb4\x22\x2e\xb4\x14\xf1\x7d\x92\x57\ +\x75\xe4\x53\x4c\xf6\x97\x88\x28\x24\xf1\x5b\x58\x10\x38\x1e\xd9\ +\x7f\xd6\x98\x44\x30\x1e\xb7\x48\xec\xb1\xc8\x30\x82\xb1\xf5\xd5\ +\x14\xef\xf8\x5b\x58\xc8\xfb\x28\x08\x38\xaf\xba\x2a\x60\x22\xd0\ +\x3a\x87\x92\x98\x08\x8c\x17\x03\x44\x2c\xfa\x91\xd7\x1e\x98\xf3\ +\xaa\xab\x79\x3f\x95\x49\xbc\xe8\x3e\xb4\x90\x88\x35\xe7\x1c\xa7\ +\xd3\x52\xb1\xda\xd4\xfa\x96\x1a\xdf\xb5\x65\x74\xc9\x43\x84\xd8\ +\xea\xd4\x24\x62\xa9\x39\x61\xb3\x68\xf4\x59\x2b\x00\xe0\xba\xe7\ +\x48\x00\xe6\x9b\x8a\x80\xd7\x03\xc8\x57\xf9\x4a\xd1\x28\x00\xe0\ +\x46\xc0\x90\x9f\xcd\x05\xbe\x11\xd0\x11\x79\x1f\x65\x70\x12\x90\ +\x12\x70\xed\xbd\xb4\xc4\x9e\xb6\x04\x7e\x0c\x20\x7f\xda\x31\x9f\ +\x9c\x05\xa4\x44\x5c\x44\xa4\x5f\x6c\x01\x63\x19\x79\x8d\xde\x29\ +\x8f\x6f\x8b\x97\x00\x80\x9b\x9e\xbd\x69\x1b\x39\x93\x3f\xe9\xf9\ +\x61\xf4\x16\x00\x70\xcb\xaf\x3a\xb9\x40\x35\x80\x3c\x04\x0a\x00\ +\xb8\xed\x98\xd8\x0e\x02\x14\x30\x27\x02\x97\x24\xc1\x02\x00\xee\ +\xf8\x55\xa7\x24\xe0\xee\x9f\x0a\x98\xaf\x5b\xac\xa7\x5a\x09\x80\ +\x44\x84\x47\x6d\xcf\x36\x52\xc0\x7c\xd5\x72\x31\xd8\x5a\x00\xc0\ +\x4f\x7e\x25\x16\x6c\xc2\x0e\x3a\x58\x8e\xcf\xb5\x75\x00\xd0\xeb\ +\xc2\x49\x20\x5a\x8f\xc0\x5d\xbf\xb2\x9a\x85\x02\xe6\xcb\x59\x4e\ +\xa1\x7b\x01\x49\xbc\x2b\xb8\x15\xf1\xc5\x2c\x92\xf8\x7e\x4b\xf2\ +\x19\xa8\x80\xf9\xec\xbf\x2c\xa3\xf7\x3d\x2b\x8f\x03\x54\x03\x45\ +\x78\x0b\x58\xf3\x5f\x98\xe1\xda\x36\x02\xf3\xc9\x34\x97\x12\x0f\ +\x02\x56\x95\xf6\x6f\xaf\x4d\x91\x8f\x08\xe7\x32\xba\x6e\xf7\xb0\ +\x2e\x44\xb0\xe4\x8f\x59\x22\xeb\x22\xe0\xf6\xae\x08\x8c\xd7\x45\ +\x38\xd6\xe5\x72\xfa\x61\xc0\x86\xe6\x68\x8e\x40\x17\x3e\xca\xd0\ +\x28\xe0\x61\xc0\x36\xb0\x2a\xb0\x8f\xaf\xb4\xc4\x7e\xdc\x66\x4b\ +\xf9\x28\x80\x7c\x53\xc0\xae\x7d\x56\x0a\x78\x6c\x87\x5c\x3c\xe6\ +\xfc\x11\xc7\x79\xfb\x38\xa0\x18\x54\xf9\x2e\x15\xf0\xa4\x62\xbe\ +\x56\x44\x53\xc0\x1c\xf6\x2c\x7f\x4f\x02\x44\x94\xc5\x28\x08\xf8\ +\x59\xa4\x1f\xc1\x4a\x99\xe3\x92\x48\x2a\x60\xe6\x03\xbf\xa2\xbf\ +\xf8\x27\xf6\xe7\xf3\xb9\xd3\xb9\xc2\xd1\xe2\x9f\xb0\x11\xc1\x9a\ +\xeb\x71\x5f\x28\x79\x80\x79\xd5\x6b\x3d\x87\x63\x4c\x7b\x94\xb9\ +\xf6\x3b\x6c\xe4\x7d\x94\x4e\xa1\x8d\x92\xbb\x81\x1c\x14\x30\x1f\ +\x75\x74\xbc\xfe\xd4\xe1\x78\xfd\x15\x0c\x16\x5c\x8e\xd7\x53\x6c\ +\x54\xdf\x11\x28\x60\x3e\xec\xf8\x82\xe3\x59\xcd\x05\xc7\xcb\x0a\ +\xf2\xd0\x50\x46\x7f\x13\x89\x5f\xee\x16\xa1\x02\xe6\x83\x29\x5d\ +\x31\x3d\x2f\x26\xf6\xe4\x00\x0c\x0e\xd5\x5c\x31\xa1\xaa\xb5\xb6\ +\x05\xf1\x26\xac\x3e\x87\x9d\x5f\x61\xd8\xd4\xbe\xad\x6d\xc2\x70\ +\x13\x76\x36\x61\x75\x0b\xe2\xa6\xf6\x4e\x4e\xb7\x20\x7e\x01\xfd\ +\x69\x93\x4f\xed\x05\xf4\x5d\xc8\xab\x6a\x37\x9b\xfa\x59\xa2\xb0\ +\x1a\x95\x64\xe5\x38\x47\xb2\x57\xaf\xb3\x28\xf3\xcc\x5e\xdc\x64\ +\x2e\x70\x0a\x50\x6b\x3b\x99\x67\x6a\xff\x64\x9e\x75\xb6\x9d\xed\ +\x74\x51\x55\x44\xa4\x67\x49\xef\xb1\xcf\x2e\x2d\xb2\xc4\xb6\x3b\ +\xb4\xbf\x81\xbf\x80\xed\xc2\x14\xb2\x23\x50\xf6\x2d\xc9\xf6\x7a\ +\xd3\xc8\xcc\x65\xde\xa3\xa4\xa7\x53\x4b\x7f\x6f\x97\x8c\x40\xd9\ +\xe8\xec\x68\x8e\xf0\xbf\xac\xa9\x36\x72\x5a\xb3\xcd\xe8\x00\x00\ +\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ +\x00\x00\x0a\x32\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x00\x30\x00\x00\x00\x30\x08\x06\x00\x00\x00\x57\x02\xf9\x87\ +\x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\ +\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x05\x31\x00\x00\x05\x31\ +\x01\xb7\xed\x28\x52\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\ +\x74\x77\x61\x72\x65\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\ +\x70\x65\x2e\x6f\x72\x67\x9b\xee\x3c\x1a\x00\x00\x09\xaf\x49\x44\ +\x41\x54\x68\x81\xd5\x9a\x5b\x6c\x1c\xd5\x19\xc7\x7f\x67\x6e\xbb\ +\xeb\x75\xbc\x1b\x1b\x3b\xb6\x93\xe0\x24\x02\x52\x54\x29\x50\xa4\ +\xf2\x12\xc1\x5b\x40\x80\xfa\xc0\x45\x48\x40\x21\x45\x5c\x4a\x08\ +\x97\xaa\x55\x29\xb4\x52\xa5\x42\xa9\x5a\xf5\x82\xd3\x96\x36\x6d\ +\x85\x20\x04\xd2\x96\xaa\x28\xa9\xa0\xa1\xdc\x1e\xa0\xb4\x8d\x2a\ +\x6e\x29\xa1\x4a\x42\x62\x43\x0c\xd8\xbb\xb6\xb3\xeb\x9d\x9d\x99\ +\xdd\xb9\x9c\x3e\xcc\x8e\xb3\x6b\xef\xec\xae\x43\x68\xd5\x4f\x1e\ +\x9d\x39\x67\x8f\xbf\xf3\xff\x7f\x97\x73\xbe\xb3\xb6\x90\x52\xf2\ +\xbf\x12\xf1\x03\x91\x60\x1d\x5b\x31\xb9\x18\x9b\x7e\x12\x18\x28\ +\x74\xa1\x60\xe0\xf1\x06\x65\x76\xf3\x0f\x76\xca\x5d\xd2\x8d\xd5\ +\xd1\x8c\x80\x10\x42\x03\xc4\xa7\x86\xfc\x06\xb2\x6c\xe0\x3b\xe8\ +\x5c\x83\x42\x56\x4b\x68\x8c\x2c\x1f\xe1\x8c\xfe\x33\xa0\x02\xef\ +\x95\xde\xe3\x7d\xfb\x7d\xbc\xa2\x07\x92\x22\x49\x9e\xc7\xe1\xab\ +\xf2\x0e\x39\xd1\x96\x40\x0d\xfc\x17\x80\xd3\x3f\x15\x12\x9b\xf9\ +\x3c\xe7\x70\x39\x29\x52\x7d\xcb\xfb\xb8\xe9\x33\x37\x71\xe1\x8a\ +\x0b\xd1\x14\xed\xc4\x6a\x01\x78\x78\xbc\x32\xf3\x0a\x8f\xbc\xfe\ +\x08\x33\xe6\x0c\x38\x94\x28\x71\xbd\xfc\xb6\xdc\xd3\x8e\x80\x0e\ +\xdc\x2e\xa5\x1c\xad\x54\x2a\xd1\x68\xf4\xb3\x40\xe2\xc6\x17\x4e\ +\x13\x48\x29\xf9\xc3\xd8\x53\x6c\x7e\x69\x33\x7e\xd2\xe7\x92\x91\ +\x4b\xb8\xe2\xcc\x2b\x48\xa8\x09\x24\x12\xd7\x73\x41\x32\xaf\x4c\ +\xd7\x74\x84\x10\x54\xfc\x0a\x4f\x1f\x7d\x9a\xbd\x87\xf6\x82\x85\ +\x83\xc1\x8d\xf2\x36\xf9\xbb\x48\xb5\x16\xb7\x64\xa5\x52\x65\x7a\ +\x66\x06\x10\x08\x21\x10\x02\x84\x10\xb5\x7e\xb3\xf7\x13\x6d\xb3\ +\xf7\xbd\xe3\x7b\xb9\xf9\xb5\x9b\xf1\x35\x9f\x0b\x46\x2e\x60\xd3\ +\x19\x9b\x28\xc9\x12\x73\xde\x1c\x66\xa1\xc0\xb9\xdd\x9f\xa3\x4b\ +\x4b\x01\x60\x7b\x36\x6f\x17\xdf\xa4\x27\x9b\xc5\x47\xb0\x69\x64\ +\x13\xa6\x6f\xf2\xea\xa1\x57\x93\x78\x3c\x21\x9e\x14\x49\xbe\xc8\ +\x0e\x29\xa5\x8c\x23\x00\xc8\x3a\x90\xcd\x41\x37\x03\x3c\xdf\xd6\ +\x2c\x0f\x30\x65\x4f\x72\xfb\xdf\xb6\xe0\x24\x1c\xce\x5a\x75\x16\ +\x1b\x57\x6f\x24\xef\xe6\xd1\x14\x30\x84\x64\xba\x34\xc9\xc6\x33\ +\xef\xa4\x2f\xd5\x0f\xc0\x8c\x93\xe7\xa5\xd7\xff\x84\x9e\x71\xf1\ +\x02\x41\x45\xc2\xc6\x55\x1b\x99\xb2\xa7\x38\x34\x75\x48\x65\x86\ +\x6d\xdc\xc0\xb3\x40\x5e\x69\xe5\x76\x21\x1a\xc1\x2f\x7c\x22\xc0\ +\x0d\x4f\x44\xa2\xd6\x0f\x82\x80\x7b\xde\xb8\x87\x22\x45\x48\xc0\ +\x86\xe1\x0d\xe4\xfd\x3c\x45\x3f\x47\x39\xc8\x61\x07\x39\xe6\xcc\ +\x49\xa4\x0c\x4e\x98\x2e\x08\x28\x59\x93\x54\x82\x1c\xb6\xcc\x51\ +\xf6\x73\x14\x83\x3c\x1b\x56\x6d\x00\x1d\x48\xd0\xc3\x67\xf9\x9e\ +\x10\x42\x89\xf5\x40\x64\xc7\x66\x04\x9a\x59\xba\xde\xe2\xf5\x9f\ +\x59\x8e\xc5\xcb\xe3\x2f\x83\x06\xbd\x43\xbd\x54\x83\x2a\x45\x3f\ +\x4f\xba\x36\x5d\x55\x24\x96\x3d\x4d\x10\xf8\xf3\x6b\x07\x81\x4f\ +\xc5\x9e\xc6\x97\x3a\x2e\xa1\x07\xac\x00\x7c\x19\xea\x98\xfd\x78\ +\x16\x6c\xae\x66\x13\x5f\x8b\x23\x20\x1b\xad\x4b\x73\xf0\x71\x6d\ +\x8d\x8c\x0c\x02\x1e\x3f\xb8\x83\xb2\x5b\x86\x41\x30\x14\x83\xbc\ +\x97\x23\x03\x28\x12\x74\x01\x7a\x20\x71\xac\xd9\x46\x0f\xc8\x00\ +\xc7\x9a\x25\x08\x54\x3c\x29\xa8\x04\x60\xfb\x60\x49\x30\x34\x23\ +\xf4\x82\x46\x0f\x57\xf0\xf5\x16\x39\x40\x2c\xf8\x85\x56\x8f\x6b\ +\xbd\x20\xe0\x99\x0f\x9f\x81\x9e\x50\xdf\x64\x30\xc9\xdc\x3f\xa7\ +\xe9\xf3\xbb\xe8\x51\x74\x52\x2a\xa4\x14\x28\xe5\xaa\xd4\xef\x86\ +\x52\x4a\x3e\x18\xcb\x53\xb2\x8a\x38\x01\x58\x3e\xcc\xf9\x2e\x45\ +\xdd\x62\x76\xb5\x07\x09\x20\x03\xcc\x70\x51\x0b\x02\x31\xe0\x3b\ +\xf4\x02\x52\xe2\xba\x2e\x87\xab\x87\x43\x7f\x76\x03\x53\x70\xdb\ +\xf2\x3b\xb8\xfb\xa2\xaf\xd4\x74\x87\xde\x12\xc0\xc0\xb2\xe1\xf9\ +\x95\x07\x96\x0d\xb3\x7b\xcb\xbf\x42\x35\xd1\x13\xc0\x4f\x5f\x18\ +\xe5\xe1\xc2\x28\x6e\x0f\x50\x01\x1c\x56\xc4\x13\xa8\x8f\xfb\xc8\ +\xb2\x4b\xf0\x02\x40\xc5\x71\xc0\x03\x96\x03\x3e\xe0\x42\x26\x99\ +\xe5\xf4\xde\x91\x78\xbb\x01\x8a\x50\x19\xce\x2e\x9e\xd3\xa3\x65\ +\x51\x6d\x20\x20\xf4\x82\x4e\xa2\x65\x12\xb7\x05\x1f\x47\x08\x90\ +\xb5\x1d\x48\x53\xb5\x90\x84\x04\xe2\xf7\xbc\x8e\x45\x40\x78\x7a\ +\x49\x20\x85\xde\x3a\x89\xeb\x80\x2e\xd9\x0b\x80\xa2\x28\xa8\xa8\ +\xa1\xb6\x30\xf1\x28\x7a\x05\x3e\x98\x7d\x7f\x51\x08\x0d\x66\x56\ +\xa1\x08\x15\x80\x40\xfa\x4c\x15\x27\x4e\x84\x0f\x20\x25\xcc\x79\ +\x85\x50\x4f\x15\x30\x80\x34\xf1\xdb\x28\x31\xe0\x5b\x81\x6e\xc8\ +\x03\x29\x51\x14\x85\x6c\x4f\x96\x8f\xd4\x8f\xc0\x05\x7a\x61\xfb\ +\xd1\x51\x1e\x7f\x7c\x94\x6e\x15\xba\x35\xe8\x56\xc0\x9e\x86\xe7\ +\xee\x1c\x67\xb0\x27\x0c\x9b\x7c\x69\x82\xcb\x7f\xb9\x86\x65\x03\ +\x50\xf6\xa1\xe4\x83\xe9\x83\xad\x43\x75\x2d\xa1\x2e\x15\x30\x39\ +\xd6\x76\x17\x6a\x4a\xa4\x43\x42\x8a\xaa\x72\x9e\x7e\x1e\xef\xfa\ +\xef\x86\x8b\x0a\x90\xeb\xa0\x2b\x01\xcb\x0d\xe8\x4f\x40\x9f\x0a\ +\xb9\xfd\x8b\xd7\xee\x3f\x1d\xd6\x9c\x0b\xc7\x7d\xc8\x57\x21\x5f\ +\x81\xa0\x0a\x55\x9b\x30\x9f\x04\x30\xc6\x5f\x5b\x9e\xc4\x11\x89\ +\x06\x22\x31\xe0\x45\x93\x56\x53\x55\xae\x4d\x5f\x4b\x8a\x54\x18\ +\xb7\x1e\xd8\x55\xb0\x6a\x8f\x59\x85\x39\x0f\x5c\x9d\xc6\x8a\x50\ +\x40\x55\x83\xe3\x1e\x14\x6b\xf3\x2c\x17\x0a\x36\xc8\xc8\xfa\x01\ +\x36\xdb\xf9\x6d\xcb\xb4\x12\x75\xf1\xdc\x2a\x94\xea\x4b\x87\xf9\ +\xcf\x15\x85\x54\x2a\xc5\xf0\xc0\x30\xe7\x7b\xe7\x87\x00\xd5\xd0\ +\x7a\xa6\x0d\x73\x4e\x08\xe8\xb8\x0d\x96\x02\xb2\x8e\x80\x14\xe1\ +\x58\xde\x82\x59\x1b\x0a\x16\xcc\x5a\x50\xaa\xd6\x11\xcd\xb3\x9f\ +\x32\x93\xb1\x04\xa2\xe4\x6a\x97\x07\xf3\xa0\x9b\x78\xc1\x30\x0c\ +\x4e\x3b\xed\x34\xb6\x74\x6f\x21\x29\x93\xe1\x2e\xa4\x83\x53\x81\ +\x82\x09\xc7\xcb\x30\x53\x06\x33\xa8\xed\x1a\x75\x04\x4a\x01\x4c\ +\x97\x61\xc6\x84\x19\x0b\xa6\x4d\x90\x0a\xe1\xf6\xe9\x61\xf1\x0b\ +\x7e\x0e\x14\xdb\x27\x71\x1c\x91\x26\xe0\x59\x30\xa6\x28\x0a\x3d\ +\x3d\x3d\x9c\xbd\xfa\x6c\xae\x7b\xeb\x3a\x1e\x1d\x7e\x94\x40\x04\ +\x90\x02\xbb\x0c\xbe\x0f\xae\x02\x09\x09\xbf\x39\x30\x4a\x36\x91\ +\x45\x00\xc5\x6a\x81\x39\x09\xae\x09\x85\x4a\x98\xc8\x72\x19\xa1\ +\x01\x04\x2e\xbb\xf9\x35\xef\x72\x00\xb0\x5a\x27\x71\x0d\xec\x22\ +\x22\xcd\xc0\x37\x23\x52\xf3\x42\x7f\x7f\x3f\x57\xf6\x5f\x89\x77\ +\xcc\x63\xd7\x9a\x5d\xb8\x09\x17\x34\xa8\x16\x60\xda\x07\xcd\x85\ +\x1f\x1f\x1c\x45\x55\x00\x19\x9e\x53\x55\x03\x2a\x25\x90\x1a\x90\ +\xac\x59\x3e\x41\xc0\x93\x3c\xc1\x63\xec\x06\x8e\x01\xce\x92\x3c\ +\xb0\x54\xf0\xd4\xbc\x90\xc9\x64\x58\xbf\x7e\x3d\x57\xf9\x57\x91\ +\x3c\x96\x64\xe7\x9a\x9d\x58\x3d\x56\x58\x5e\xe4\xc1\x4b\x40\xc9\ +\x24\xcc\x11\x8d\x90\x81\x0a\xf4\x12\xee\xfb\x69\x60\x0e\x97\xc7\ +\x78\x8a\xc7\xf8\x3d\x70\x18\x28\x48\x29\xfd\x25\x7b\x60\x29\xe0\ +\xa3\xbe\xae\xeb\x0c\x0e\x0e\xa2\x28\x0a\xc6\x21\x83\xb5\x07\xd6\ +\xb2\x2b\xb3\x8b\x83\xab\x0f\x52\x19\xa9\x40\x01\xe8\x03\x8a\x84\ +\xa4\x12\x80\x1d\x8e\x25\xfd\x24\xe7\x4c\x9c\xc3\xbe\x5b\xf6\xfd\ +\x99\x59\x9e\x02\xfe\x0d\x4c\x4b\x29\x3d\x88\xbf\x52\x2e\xf2\x40\ +\x04\x96\xfa\xfe\xc2\xf7\x26\xe0\xa3\xd6\x30\x0c\x06\x07\x07\x31\ +\x0c\x83\x54\x2a\xc5\xd0\xd8\x10\xd3\x6f\x4e\xf3\x5a\xf6\x35\xde\ +\x5e\xfe\x36\x53\xfa\x14\x4a\x8f\x82\x86\x86\x2a\x54\xd2\x76\x9a\ +\xf5\xaf\xaf\xe7\xe2\xca\xc5\x0c\xf5\x0f\x71\xcd\xec\x35\xe3\xc0\ +\x5b\xc0\x24\xe1\xa9\x42\x2b\x02\x0d\xa5\xc4\x22\xe0\x4d\xce\x88\ +\xb8\xfb\x70\xfd\x98\xae\xeb\xf4\xf5\xf5\x91\x4c\x26\x19\x1a\x1a\ +\x22\x97\xcb\xb1\x2e\xb7\x8e\x4b\x73\x97\xe2\x38\x0e\xb2\x76\x7a\ +\x0b\x21\xd0\x34\x8d\x4c\x36\xc3\xca\x95\x2b\x59\xb5\x6a\x15\xc0\ +\xc7\x40\x5e\x4a\x59\xad\xd7\xdb\xa2\x1a\x6d\x1e\x3a\x0b\xad\xde\ +\x0e\xfc\xc2\xbe\xa6\x69\x64\x32\x19\xd2\xe9\x34\x03\x03\x03\x58\ +\x96\x45\xa9\x54\xc2\x34\xcd\xb0\xf8\xd3\x34\x54\x55\xc5\x30\x0c\ +\xd2\xe9\x34\xdd\xdd\xdd\x74\x75\x75\x41\x58\x01\x79\x0b\x61\xb6\ +\xb9\x52\xd2\xb1\x07\x9a\xdb\x20\x9e\x8c\xae\xeb\x68\x9a\x46\x57\ +\x57\x17\xbd\xbd\xbd\x78\x9e\xd7\xe0\x01\x45\x51\x50\x55\x75\xfe\ +\x9d\xc6\xa3\xa2\x3d\x81\x79\xc0\xd4\x85\x52\xfd\x78\x4c\x98\x74\ +\x02\x3e\x92\x1a\x30\x54\x55\x45\xd7\xf5\x56\x50\x62\xa5\x6d\x12\ +\x2f\xb4\x7e\x27\xa1\xd3\x0e\x7c\x2b\xaf\x2d\x55\x3a\xf2\x00\x4d\ +\x00\xb4\x4b\xda\xb8\xcf\xe2\xe6\x4a\x29\xe7\xef\xc5\xf5\xf7\xe3\ +\xfa\x90\x6d\x26\xad\x3d\x10\x29\xe9\x40\x51\x33\x80\x9d\x80\x0f\ +\x82\xa0\x01\x7c\xd4\x6f\xf8\x1d\x45\x8d\x5d\xaf\x7d\x08\xd5\x77\ +\x39\x75\x61\x24\xa5\x9c\x07\xeb\xfb\x3e\xbe\xef\x13\x04\x41\x03\ +\xa1\xf9\xb5\x34\x03\x4e\x3a\x89\x3b\xb4\x7c\x4b\x3d\x0b\x88\x45\ +\x40\x83\x20\xc0\x75\x5d\x3c\xcf\xc3\xf7\x7d\xaa\xd5\x6a\xd8\xf7\ +\xc3\x2f\xb9\x14\x21\x50\x74\x83\xc3\x47\xde\x99\x00\x72\xcd\x48\ +\x9c\xb2\x10\xea\xd4\x13\x11\x70\xcf\xf3\x70\x5d\x17\xd7\x75\x71\ +\x1c\x07\xcb\xb2\xb1\x1d\x1b\xb7\xea\xe2\xd7\x08\xa4\x7b\x32\x14\ +\x73\xd3\xd6\xad\x37\x6e\xfe\x15\xf0\x6c\x54\x3e\x2c\x99\xc0\x22\ +\x22\x31\xe0\xda\x49\x14\x36\x11\xf8\x6a\xb5\xca\x5c\xa9\x44\xa1\ +\x50\xc0\xb6\x2c\xca\x96\x45\xb5\xea\x92\xcd\x66\x18\x1a\x5e\xc9\ +\xcc\xcc\xb4\x7f\xcb\xcd\x5f\xfa\xc9\x91\x23\x47\x7e\x26\xa5\x9c\ +\x6b\xa6\xb3\x65\x29\x71\x32\xa1\xd3\x8a\x60\x44\x20\x02\x5f\x28\ +\x14\x99\x98\x38\x46\xd9\xb6\xe8\xee\xea\x66\x60\x60\x80\xc1\x15\ +\x2b\x30\x0c\x83\xa3\x63\x63\xc1\x9d\x5b\xb7\x3e\x74\x60\xff\x3b\ +\x3f\x92\x52\x16\xe3\xd6\xeb\xac\x1a\x5d\x02\xe8\x38\xa9\xb7\xbe\ +\xe7\x79\x98\xa6\xc9\xf1\xe3\xc7\x29\x95\x4d\x2e\xbb\xe4\xd2\x5a\ +\x32\x7b\x98\x66\x99\xb1\xf1\x31\x79\xcf\x7d\xdf\xd8\xbe\x6f\xdf\ +\xbe\x07\xe2\x2c\x1f\x49\xdb\xaf\x9a\xe2\xe2\xff\x93\x84\x8f\xe3\ +\x38\x98\xa6\x49\xa9\x34\x47\x77\x57\xba\x01\xfc\xf8\xf8\x18\xf7\ +\x3f\x78\xff\xce\x97\x9f\x7f\xf1\xbe\x76\xe0\x3b\x22\xb0\x88\x48\ +\xa7\xf3\xeb\xe6\x46\xdb\x62\xb4\x5d\xda\xb6\x43\xb9\x6c\x61\x5a\ +\x16\x99\x4c\xa6\x01\xfc\x43\xdb\x46\xf7\xec\xf9\xe3\x9e\x3b\x3a\ +\x01\x0f\x4b\x4c\xe2\xa5\x80\x5e\x28\xf5\x1e\xa8\x54\x1c\x1c\xc7\ +\xa1\xe2\x38\x0c\x0d\x0d\x46\x61\xc3\xe8\xb6\xd1\x3d\x3b\x77\xec\ +\xbc\x5e\x4a\x59\xea\x74\xcd\xd6\x49\x7c\x8a\xa4\xfe\x94\xf5\x3c\ +\x8f\x6a\x2d\x89\xb3\xd9\x2c\x89\x44\x92\xb1\xf1\x31\x79\xff\x77\ +\x1f\xd8\xb1\xe7\xe9\xdd\x77\x2d\x05\x3c\x9c\x62\x0f\xb4\x92\x86\ +\x30\xf2\x7c\x02\x29\x19\x19\x59\xcb\xd1\xb1\xb1\xe0\xde\x6f\xde\ +\xfb\xf0\x8b\x7f\x79\xe1\x5b\x4b\x05\x0f\xff\x05\x02\x51\x58\xd5\ +\x17\x6a\x52\x4a\x32\xbd\x7d\x14\x8b\x05\xff\xae\xbb\xb6\xfe\x70\ +\xdf\xdf\xf7\x3d\x28\xa5\x34\x4f\x46\x7f\xfc\x85\xe6\x14\x95\xbc\ +\x11\xf0\xa8\xae\x51\x14\x05\x3d\x95\xc6\x9e\x2b\x5a\x5b\xbf\x7c\ +\xcb\xf7\xf7\xef\xdf\xff\xd0\xc9\x82\x87\x16\x39\xa0\x28\x0a\x89\ +\x44\xa2\x61\xf0\x64\x77\x21\x84\x40\x0a\x05\xa9\xea\x88\x44\x17\ +\x1f\x7c\x7c\x78\xe2\xee\x2d\xb7\x6e\x3b\x7a\xf8\xf0\xf6\x4f\x02\ +\x1e\x88\xfd\x57\x83\xcb\x80\x35\xd4\xdd\x2c\x4f\xa1\x48\xe0\x43\ +\xe0\xb9\x4f\x0a\x1e\x9a\x10\x00\x10\x42\xa8\x9c\x92\xbf\xa7\xc4\ +\x8a\x6c\x56\x98\x9d\x8c\x34\x25\xf0\xff\x24\xff\x01\x04\xe4\x96\ +\x06\x80\x39\xb3\x6b\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\ +\x82\ \x00\x00\x09\x53\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ @@ -6452,963 +5754,433 @@ qt_resource_data = b"\ \xea\xae\xee\xea\xae\xee\xea\xae\xee\xea\xae\xee\xea\xae\xee\xea\ \xae\xee\xfa\x59\xaf\xff\x07\xd5\x2d\x49\x75\xbc\xee\x3b\xc6\x00\ \x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ -\x00\x00\x1c\x4b\ +\x00\x00\x05\xe0\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x80\x00\x00\x00\x80\x08\x06\x00\x00\x00\xc3\x3e\x61\xcb\ -\x00\x00\x00\x06\x62\x4b\x47\x44\x00\xff\x00\xff\x00\xff\xa0\xbd\ -\xa7\x93\x00\x00\x1c\x00\x49\x44\x41\x54\x78\x9c\xed\x5d\x7d\x78\ -\x14\xf5\x9d\xff\xcc\xee\x66\x43\x02\x24\x40\x81\x24\x10\x36\x09\ -\x04\xa4\x68\x39\x11\x09\xef\xbe\xa1\xd5\xf3\xb9\xe3\x6a\x78\x17\ -\xa5\x22\x2a\x20\xa0\x28\xa5\xa5\xa5\x16\xc4\xb7\x5a\xb5\xda\x37\ -\x7a\x6d\xef\xec\x95\x0a\x24\x28\xb6\x3d\x78\xee\x7a\x02\x9e\x1e\ -\x28\x04\x4c\x80\x20\xef\x92\xf0\x26\x0d\x21\xef\xd9\xf7\x79\xbb\ -\x3f\x66\x67\x76\x66\x76\x5e\x7e\xb3\x3b\xbb\x6c\x6c\x3e\xcf\x33\ -\xcf\xce\xfc\xe6\xf7\x36\xfb\xf9\xbe\xfd\x5e\x66\x17\xe8\xc6\xdf\ -\x35\xa8\x04\xf2\x5b\x2d\xdb\x0d\xfb\xc1\xeb\x9c\x13\xc3\x65\x21\ -\x2f\x15\x39\x1c\xb2\x73\xf1\xe8\x46\x6a\xc1\xab\x0e\x4e\x96\x6e\ -\x09\xa4\xe4\x89\xc4\x3b\x21\x08\x8d\x33\x72\xc8\x85\xa1\x1b\xa9\ -\x81\x9c\x74\x36\x72\x30\x91\x4f\x0e\x16\x85\x80\xd4\x02\x50\x10\ -\x08\x77\x03\xe8\x01\x20\x33\x72\xee\x42\x54\x08\xba\x91\x1a\x88\ -\xe4\x33\x00\xc2\x00\x42\x00\x82\x91\x73\x51\x38\x88\x41\x22\x00\ -\x72\xed\xef\x01\xa0\x57\xe4\xc8\x82\x20\x08\x8e\xc8\xd1\x8d\xd4\ -\x80\x8b\x1c\x21\x00\x01\x00\xde\x48\xba\xdc\x02\x10\x0b\x81\x15\ -\x0b\xe0\x82\x40\x78\x2f\x00\x7d\x00\xe4\x40\x10\x08\xd1\x0a\x74\ -\x23\x35\x10\xb5\x3f\x08\xa0\x23\x92\x46\x43\x10\x08\xc6\x6a\x65\ -\xf1\xb8\x80\x6c\x08\xe4\xf7\x8d\x9c\x67\xa0\x5b\x00\x52\x09\x0e\ -\x02\xe1\xfe\xc8\x75\x18\x80\x0f\x02\x3f\x96\x5d\x31\xa9\x0b\x10\ -\xdd\x80\x0b\xd1\x38\x20\x1b\x40\x4f\x9e\xe7\xdf\xb4\xda\x68\x37\ -\xec\x03\x45\x51\x53\xa1\x8c\xc5\x28\x24\xc1\x05\x00\xb1\x23\x81\ -\x0c\x08\xc2\x80\x6b\x4d\x4d\x08\x87\xc3\x10\x05\x90\xa2\xa0\x3a\ -\xd7\xba\x16\xd2\xac\x5d\x03\x94\x3a\x41\x5e\x7b\x1c\xf7\xa2\x3d\ -\x33\xce\xa3\xc8\x47\x98\xdf\xb4\x7c\x02\x70\x3a\x9d\xe8\xd5\xab\ -\x17\xa0\x1c\x8d\x59\x86\x15\x17\x20\x3f\x1c\xb2\x03\xe1\x30\x0d\ -\x6b\xe4\x5b\x27\xda\x6e\xe2\x49\x48\x8f\x87\x70\xc3\x1c\x16\x05\ -\xc6\x08\x2c\x27\x0e\xfd\x13\x9b\x93\xb1\x62\x01\x0c\x11\x3f\xd9\ -\x09\x68\x7d\x32\xad\x81\x49\xbe\x98\xbc\x84\x65\xd2\x0d\xb6\x08\ -\x00\x19\xf9\xb1\x2e\xc0\x4c\xcb\x53\x45\x3c\x29\xe9\x89\xb8\x80\ -\x74\x15\x0b\xdb\x2c\x80\x31\xd9\xd6\xb4\xde\x2e\xe2\xcd\xcc\xbc\ -\x65\x37\x90\xa8\x0b\x20\xac\x23\x95\xb0\x49\x00\xe2\x27\x9f\x44\ -\xeb\x0d\x09\xb6\x48\xbc\x19\xa1\x56\xb4\x5c\xf7\x4e\x9a\x91\x6c\ -\x04\xdb\x5d\x00\x39\xd9\x64\xbe\xde\xb2\x40\xc4\x71\x4f\x71\x9f\ -\x34\x8f\x49\x5e\xa2\xb2\x69\x80\xb4\x70\x01\x96\x48\x96\xa5\x4d\ -\x9d\x32\x45\x3a\xe7\xf9\xe8\xd0\xd7\xe9\x74\x22\x27\x27\x07\x1e\ -\x8f\x07\x13\x27\x4e\xc4\xf4\xe9\xd3\xd1\xa7\x6f\x5f\xcd\x36\xc6\ -\x8f\x1f\x2f\x95\x3d\x78\xe8\x90\x76\x3f\x94\x1d\xc0\xd8\x5b\x6e\ -\x91\x2e\xab\x6b\x6a\x62\xf2\x4e\x9c\x38\x11\x14\x45\x69\x1e\xd9\ -\xd9\xd9\x18\x30\x60\x00\x46\xdd\x78\x23\xee\xbf\xff\x7e\x8c\x1e\ -\x3d\x3a\xa6\xcd\x54\xc2\xa6\x19\x3c\x2a\x86\x6c\x3d\xf2\x85\x2f\ -\x42\x79\x1d\x53\x9b\xb2\x82\x48\x2d\xfa\x31\x80\x1a\x2c\xcb\xa2\ -\xb5\xb5\x15\x47\x8e\x1c\xc1\xaf\x7f\xfd\x6b\xcc\x9b\x37\x0f\xd5\ -\xd5\xd5\xca\xba\x84\x86\x74\x9e\x46\x95\x47\x7e\x18\xe5\x25\x40\ -\x30\x18\xc4\xe5\xcb\x97\xb1\xeb\x83\x0f\xf0\xcc\xca\x95\x78\xeb\ -\xcd\x37\xc1\x45\x87\x74\x29\xc7\x75\x73\x01\xf1\x6a\xbd\x22\xaf\ -\x0c\x9f\x7c\xfa\xa9\x94\x4e\xd3\x34\x2e\x5c\xbc\x88\x4d\x9b\x36\ -\x61\xd7\x07\x1f\xa0\xad\xad\x0d\xdf\x5d\xbd\x1a\x5b\xb7\x6e\x45\ -\x5e\x5e\x5e\xdc\x41\x61\x3c\x3e\x7f\xdf\x27\x9f\x48\xe5\x78\x9e\ -\x47\x5b\x5b\x1b\xaa\xaa\xaa\xb0\x71\xe3\x46\x78\xbd\x5e\xec\xd8\ -\xb1\x03\xc5\xc5\xc5\x78\xe0\x81\x07\x74\xeb\x48\x26\x6c\x9c\xc3\ -\x37\xd2\x74\xca\x9c\x7c\x42\xad\xa7\x8c\xf2\x0a\x15\x21\xc3\xed\ -\x46\x69\x69\x29\x36\x6c\xd8\x80\x69\xd3\xa6\x01\x00\xfc\x7e\x3f\ -\x36\x6f\xde\xac\x28\xa7\x19\xf0\xe9\xd4\x4b\x42\xbe\x56\x3e\x45\ -\xd4\x43\x51\xe8\xdb\xb7\x2f\xee\xbb\xef\x3e\xac\x5a\xb5\x4a\x4a\ -\xdf\xb9\x73\x67\xac\xa5\xd1\x3a\x92\x80\x24\xb8\x00\xe3\x60\x8f\ -\x38\xd0\xd3\x21\x43\xf7\x8b\x50\xe5\x17\xc9\x98\x3f\x7f\xbe\x94\ -\x56\x55\x55\xa5\xb8\xa7\x87\x18\xd2\x0d\x88\x20\x12\x10\x8d\xa3\ -\x6c\xfc\x78\x29\xcb\xe5\xcb\x97\x0d\x7a\x63\x50\x97\x0d\x48\xaa\ -\x0b\x30\x9d\xe8\x89\x14\xf6\x85\x1b\x70\xbc\x71\x2b\x2e\x75\xec\ -\x43\x7b\xe8\x02\x18\x2e\x88\x1e\xae\x3e\xc8\xeb\x75\x33\x6e\x1c\ -\x38\x0f\x9e\x9c\x29\x96\x1e\x58\x4e\xdc\xb0\x61\xc3\xa4\xf4\x86\ -\x86\x06\x7b\x87\x88\x26\xf9\x8d\xca\xc9\xd3\xdc\x6e\xf7\x75\x1b\ -\x25\x24\x69\x14\x40\xe0\xef\x23\x69\xa7\x9b\xde\xc7\xde\x0b\x1b\ -\xc0\xf2\x21\xc5\xfd\x00\xdd\x8c\xf3\xad\x7b\x70\xbe\x75\x0f\x46\ -\x0d\x9c\x83\xdb\x8a\xd6\x83\xa2\x1c\x91\x96\xf4\x7a\x20\x55\x6e\ -\xd0\x4d\x6b\xf7\x4c\x89\x31\x72\x29\x06\xe5\x0f\xc9\x46\x1c\xa3\ -\x47\x8f\x36\x17\x70\x3e\xae\x3d\x9f\xa6\x48\xc2\x44\x10\x39\xf9\ -\x67\x9a\xff\x82\x8f\xce\xaf\x15\x3a\xe2\xc8\x42\x59\xe1\x4a\x94\ -\xf6\xfb\x47\x64\x3a\xfb\xa0\xc9\xff\x39\xf6\x5e\x78\x11\x4d\xfe\ -\x13\x38\xd1\x58\x89\x2c\x57\x3f\x94\x15\xae\xb4\x34\x29\x44\x01\ -\xa8\xab\xab\x93\xae\xf3\xf3\xf3\x95\xf9\x75\x9f\x46\x2b\xd1\x62\ -\x60\xa8\x51\x8e\xe7\x79\x74\x74\x74\xe0\xc0\x81\x03\xd8\xf8\xab\ -\x5f\x01\x00\x7a\xf6\xec\x89\xc7\x9f\x78\xc2\xb0\x2e\xde\xa0\xfd\ -\x44\x61\xb3\x0b\x20\x27\x3f\xc0\x34\x63\xdf\x85\x0d\x00\x00\x07\ -\xe5\xc2\xfd\xc3\x7f\x83\x41\x39\x65\x42\x1e\x00\xf9\xbd\xc7\x62\ -\xfa\xc8\xff\x40\xe5\xe7\xd3\xe1\x0b\x37\xa0\xe6\x6f\xbf\xc1\x88\ -\xaf\xfd\x33\xfa\x66\x97\x9a\x76\x42\xde\xea\xe6\x2d\x5b\xa4\xf3\ -\xb2\xb2\x32\x43\x33\xaf\x19\x14\x1a\xdd\x37\xc9\x0f\x00\x93\x54\ -\x73\x02\x0e\x87\x03\x14\x45\xa1\x4f\x9f\x3e\x98\x3e\x7d\x3a\xe6\ -\xcd\x9b\x87\x82\x82\x02\xe3\x6a\xcd\xda\x4d\x00\xb6\xee\xe4\x21\ -\x25\x1f\x00\x4e\x34\x56\x82\xe6\x84\x4d\x2d\xa3\x06\xce\x55\x90\ -\x2f\x7e\x91\x99\xae\x5c\x94\x15\x3e\x0d\x00\xe0\x79\x0e\xb5\x57\ -\xff\x10\xad\x4b\xab\xfd\xc8\xc1\x30\x0c\xce\xd5\xd5\x61\xfd\xfa\ -\xf5\xd8\xbd\x6b\x17\x00\x20\x2b\x2b\x0b\x0f\x3d\xf4\x10\x59\x10\ -\x25\xbb\x6f\x25\xc8\x33\x0b\x2e\xe5\x68\x6f\x6f\xc7\xa9\x53\xa7\ -\x70\xfa\xf4\x69\xc3\xf6\x93\x0d\x1b\x97\x83\xf5\xc9\xd7\x32\xcf\ -\x97\xda\xff\x4f\x3a\x1f\xd9\xbf\x5c\xd7\x84\x97\xf4\x99\x86\xff\ -\x95\xca\x7c\xaa\xeb\xe7\x27\x4e\x98\x10\xd3\x27\x71\x86\x2f\x37\ -\x37\x17\x2f\xbd\xfc\x32\x0a\x06\x0d\x52\xf6\x29\xf6\x21\xf4\xef\ -\x69\xb4\x69\x98\x37\x82\xfd\xfb\xf7\x2b\xca\x05\x02\x01\xd4\xd7\ -\xd7\xe3\xfd\xed\xdb\xb1\x7b\xf7\x6e\xac\x5f\xbf\x1e\xb3\x66\xcd\ -\xc2\xf2\xe5\xcb\x4d\xdb\x4b\x46\x14\x60\x93\x0b\xb0\x46\x3e\x45\ -\x51\x68\x0b\xd6\x4b\xd7\xdb\x4f\xcc\x92\xdd\x15\x1e\x33\x3a\xb5\ -\x1b\x7d\x6c\x1f\xdd\x20\x56\x60\xd8\x1f\x71\xb7\x4c\x71\x71\x31\ -\x26\x4c\x98\x80\x07\xca\xcb\xd1\x37\x32\x15\x9c\x88\xef\x8f\xc7\ -\x05\xa8\xbf\x8f\xec\xac\x2c\xdc\x38\x6a\x14\x6e\x1c\x35\x0a\x14\ -\x45\x61\xd7\xae\x5d\xd8\xb6\x6d\x1b\x6e\xbe\xf9\x66\x4c\x91\x4d\ -\x6d\x13\xf7\x2f\x41\xd8\x38\x0a\x30\x1f\xf6\xc9\xd3\xc2\x9c\x57\ -\x4a\xe3\x79\x96\xa8\x7e\x96\xa3\x75\xc9\x3f\x20\x1b\xe3\xcb\x1a\ -\x8b\x9e\xc6\x76\x44\xea\x8f\x28\x6c\x0c\xc3\xc0\xe5\x72\x19\x96\ -\xa3\x69\x5a\x3a\x77\x38\x1c\xd6\x04\x44\x85\xd9\xb3\x67\x63\x57\ -\xc4\x45\x6d\xdf\xbe\xdd\x54\x00\x92\x81\xa4\xb8\x00\xcd\x6b\x21\ -\x51\xba\x76\x52\x99\x60\xf8\x00\x00\xe0\xb1\xb1\x35\xc8\x70\xf6\ -\xd4\x34\xef\x86\x69\xea\xfa\x49\xf2\xaa\xcc\x7c\x76\x76\x36\xbc\ -\x5e\x41\x18\x3b\xbd\x5e\x53\x4b\xd1\xd1\xd9\x29\x9d\xf7\xec\xd9\ -\xd3\x1a\xe9\xaa\xef\xa4\xb8\xa4\x44\x3a\x3f\x75\xea\x94\xa6\xc2\ -\xa8\x61\xb7\x1b\xb0\x25\x08\xb4\x4a\x3e\x00\xe4\xf6\x28\x92\xce\ -\xdb\x43\x17\x95\x0b\x2f\xea\x72\x26\x02\x01\x79\x9a\x2a\x78\x53\ -\xdf\x53\xa7\x0f\x19\x32\x44\x3a\xaf\xaf\xab\xd3\x0e\xe4\x64\x81\ -\x5e\xdd\xb9\x73\x9a\x65\xf5\xa0\x58\x0d\x94\xf5\x4b\xdd\x8e\xb0\ -\xa9\xd6\x1c\xa6\x41\xa9\x45\xd8\xbe\x9f\x9f\x34\x06\x18\x92\x1b\ -\x35\x77\x97\xdb\xf7\xc6\x90\xac\x2e\xa7\x48\xd3\x23\x5f\xde\xa6\ -\x3c\x5d\x2f\x42\xa7\x28\x8c\x1b\x37\x4e\xba\xfc\xe8\xa3\x8f\x62\ -\xca\x41\x45\xdc\x87\x1f\x7e\x28\x65\x19\x2f\x4e\xe7\x8a\xf9\x28\ -\x2a\xe6\xf9\x8d\x70\xfe\xfc\x79\xe9\x7c\xc0\x80\x01\xc4\xe5\xec\ -\x44\xd2\x86\x81\x80\x0e\x89\x91\xeb\x9b\x06\xce\x87\xd3\xe1\x06\ -\x00\x1c\x6d\xf8\x03\x7c\xf4\xd5\x68\x19\x8d\x72\xba\x69\xaa\xf6\ -\x14\x79\xf5\xa2\x7a\x19\xb1\xe5\xe5\xe5\x70\x3a\x9d\x00\x80\xf7\ -\xde\x7b\x0f\xe7\xea\xea\x62\x48\x17\x71\xe6\xcc\x19\x6c\xdf\xbe\ -\x1d\x80\x10\x68\xce\x9a\x35\x4b\xa1\xd9\x44\x90\x09\x56\x65\x65\ -\xa5\x94\x3c\x61\xc2\x04\xa5\xb5\x30\x38\xec\x1c\x26\xda\x26\x00\ -\x24\xe4\xcb\xaf\x7b\x67\x0e\xc2\x14\x8f\x30\x0b\xe8\xa7\x9b\xb0\ -\xed\xf3\x72\x1c\x6b\xd8\x84\xf6\xe0\x05\xb0\x3c\x03\x96\xa3\xe1\ -\x0b\x37\xe2\x4a\x47\x15\x0e\x5d\xfe\x25\x2a\x6a\xff\x49\xaa\x87\ -\x34\x06\x20\x71\x03\x45\x45\x45\x58\xbc\x78\x31\x00\x61\xad\x7e\ -\xe1\x23\x8f\xe0\xf7\x6f\xbf\x8d\xfa\xfa\x7a\x84\x42\x21\x84\x42\ -\x21\xd4\xd7\xd7\xe3\xdf\xdf\x7e\x1b\x8f\x2c\x5c\x88\x50\x48\x98\ -\xb2\x5e\xb1\x62\x85\x75\x17\x40\x51\x08\x05\x83\x38\x79\xe2\x04\ -\x9e\x5f\xbf\x5e\x0a\x00\x73\x72\x72\xb0\x60\xc1\x02\xd3\xba\xe4\ -\xcf\x6a\x97\x0b\x20\xa9\xc7\x01\xe1\x05\x90\x5e\x00\xfa\x03\xc8\ -\x8f\x1c\xfd\x01\xf4\xe2\x79\xfe\x95\xe6\xe6\x66\x43\xb2\x35\xdd\ -\x40\x24\xed\x74\xd3\x9f\xf1\x71\xfd\x8f\xc0\x70\x41\xd3\x8e\xac\ -\x98\xf8\x45\xa4\xb0\x50\xd7\x04\xd9\x8a\x5a\x55\x55\x95\xb1\xc6\ -\x9b\xa4\x6f\xde\xbc\x19\x6f\xbd\xf5\x16\x68\x9a\x56\xec\x2e\x12\ -\x21\xa6\xb9\xdd\x6e\x3c\xfb\xec\xb3\x8a\x55\x46\x75\xfd\x63\xc7\ -\x8e\xd5\xd5\x5e\x71\x26\x50\x54\x98\xfc\xfc\x7c\xbc\xf0\xc2\x0b\ -\x18\x39\x72\xa4\xe9\xf3\xab\x91\x99\x99\x09\x8a\xa2\xee\x04\xd0\ -\x00\xa0\x09\xc2\x8b\xa2\x61\x44\x7f\x2f\xc0\x14\xf6\x8c\x02\xe2\ -\x24\x1f\x00\x6e\xe8\xff\x2d\x78\x72\xa7\xe2\x78\x63\x05\x2e\xb5\ -\xef\x45\x6b\xa0\x0e\x61\xd6\x0b\x07\xe5\x42\x76\x46\x7f\xf4\xcd\ -\x2a\xc5\xe0\x9c\x5b\x51\xd2\xf7\xee\x98\xb6\xb4\xfa\xa0\x67\x09\ -\xb4\xf2\xcb\xd3\xe7\xcf\x9f\x8f\x7b\xef\xbd\x17\xef\xbf\xff\x3e\ -\x0e\x1d\x3a\x84\xba\xba\x3a\x74\x74\x08\xef\x5e\xe6\xe4\xe4\x60\ -\xe8\xd0\xa1\x28\x2b\x2b\x43\x79\x79\x39\xfa\xf7\xef\x1f\x53\x9e\ -\x14\x6e\xb7\x1b\xb9\xb9\xb9\x18\x3e\x7c\x38\x26\x4f\x9e\x8c\xfb\ -\xee\xbb\x0f\x59\x59\x59\x96\xeb\xb1\x6b\x34\x60\x8f\x05\x68\x69\ -\x89\x56\x66\x26\x0c\xf1\xe6\x91\xa5\x11\x91\x6c\x90\xae\xfb\xd0\ -\x66\xa4\x5a\x21\x3d\x4e\x01\xb1\x02\xb7\xdb\x9d\x26\x16\x00\xc9\ -\x21\xdf\x34\xf8\xb3\x43\x20\x22\xf7\xe2\x16\x0a\xab\xf9\xd2\x0c\ -\xf6\xcd\x04\xa6\x92\x7c\x2b\x24\x27\x91\x78\x2b\x43\x3e\x3b\xca\ -\x25\x03\xb6\xaf\x05\x44\x12\xb4\x32\x45\x4f\x49\xae\x65\x69\x89\ -\x68\xbd\x55\xe2\xcd\xc8\xb1\x42\x5e\x3a\x11\xad\x07\x5b\xd7\x02\ -\x80\xd8\x87\x26\x22\xdb\x6e\xf2\xe3\xf0\xff\x86\x64\x11\x9a\xf7\ -\xae\x40\xb8\x1a\xf6\x2e\x06\x69\x5d\x27\x99\xfc\x44\xb5\xde\x88\ -\x34\x3b\xad\x41\xba\x22\xb5\x41\x60\x02\xe4\xa7\x8b\x1b\xf8\x2a\ -\x90\x2e\x87\x3d\x31\x00\x90\x1c\xf2\x13\xb1\x04\xd0\x21\xab\x9b\ -\x78\x05\x52\x3e\x11\x94\x12\xf2\x2d\x9a\xfb\xbf\x47\xe2\x45\xd8\ -\x1f\x03\x90\x90\xad\xbe\x26\x24\x9f\x88\x68\xa2\x34\x1e\x47\xaf\ -\xbc\x83\x93\x8d\x7f\x86\xcb\xd1\x03\x5f\xcf\xfb\x16\x6e\xcc\x9b\ -\x09\x69\xdb\x79\x92\x48\x4f\x47\x61\xb2\x7d\x14\x20\x22\x6e\xb2\ -\x13\x88\x01\x48\xb4\x9e\xe7\x59\xfc\xf5\xcc\x6a\x9c\x68\x78\x4f\ -\x4a\xbb\xd0\xba\x17\xc7\x1b\xde\xc5\xf4\x9b\x7e\x8b\xec\x8c\x7e\ -\xda\x0f\x64\x11\xe9\x48\xb6\x16\xec\x5b\x0d\x04\xac\x93\x9b\x4c\ -\xf2\xa9\xd8\xb5\x79\x8e\x67\xf0\x5f\xa7\x9e\x52\x90\x2f\xe2\x52\ -\xdb\x01\x6c\x3b\x32\x07\xfe\x70\x73\xcc\x3d\x12\xc4\x2c\xd9\x76\ -\x11\xd8\xb3\x23\x08\x50\x98\x7a\xc8\xae\xed\x26\x9f\x32\xcb\xa3\ -\x93\xc6\xf1\x0c\x76\x9e\x5c\x86\x53\x8d\x3b\x74\x9f\xe3\x9a\xf7\ -\x24\x2a\x8e\xcc\x84\x2f\x7c\x4d\x37\x8f\xb2\x99\xae\x47\xb8\x1a\ -\xf6\x58\x00\x03\xbf\x2f\xbf\x6f\x07\xf9\xea\x7a\x63\x5c\x8d\x0e\ -\xf9\xff\x79\x7c\x31\xce\x5e\xfb\x6f\xa3\xa7\x00\x00\x34\xfb\xce\ -\xa2\xe2\xf0\x2c\x78\x43\x57\x75\xf3\x74\x75\xd2\xe5\xb0\x77\x47\ -\x10\xa0\x2b\x0c\x86\x64\xab\xaf\xe3\x21\x5f\x8b\x14\x8a\x02\xcb\ -\x87\xf1\xa7\xcf\x1f\xc5\xb9\xe6\x5d\x64\x0f\x01\xa0\xc5\xff\x85\ -\x20\x04\xe1\x06\x59\x55\x5d\x5f\xdb\xb5\x60\x6f\x0c\xa0\xbe\x36\ -\xb3\x04\x91\x34\xab\xe4\xc7\x68\xb9\x4e\x1e\x86\x0d\xe0\x4f\xc7\ -\x16\xe2\x7c\xcb\x47\xa6\xfd\x57\xa3\x35\x50\x87\x2d\xd5\xe5\xe8\ -\x0c\x5d\x49\x0a\xe9\xa4\xdb\xbf\x74\xb7\x85\xd9\x04\x7b\x37\x85\ -\x92\x68\xb7\x2a\x7f\x3c\xe4\x1b\xd6\x11\xc9\x43\xb3\x7e\xbc\x7f\ -\x6c\x01\x2e\xb4\xee\x35\xef\xb7\x0e\xda\x83\x17\xb1\xa5\xa6\x1c\ -\x1d\x41\xc2\xf7\xf7\x35\x90\x2c\x02\xed\x12\x82\xeb\x1e\x04\xca\ -\xf3\xdb\x45\x7e\x88\xe9\xc4\xf6\xda\x87\x71\xa9\xed\x00\xd9\x03\ -\x18\xa0\x23\x78\x19\x5b\x6a\xca\xd1\x1e\xbc\x48\x94\xbf\xab\x8d\ -\x06\xec\xdf\x16\x0e\xc4\x3d\x02\x80\xec\xda\x8c\x7c\xad\x60\x4f\ -\x20\xbf\x03\xdb\x8f\x3d\x8c\xcb\xed\x07\xe3\xe9\xbe\x26\x3a\x82\ -\x5f\x62\x4b\xcd\x0c\xb4\x06\xea\x34\xef\x77\x25\xc2\xd5\xb0\x75\ -\x14\xa0\xf9\xf8\x71\x08\x03\x09\xf9\xea\x36\x28\x8a\x42\x90\x6e\ -\xc3\xb6\xa3\xf3\x70\xa5\xbd\x1a\x76\xa3\x33\x78\x05\x5b\x6b\x66\ -\xa1\xc5\xff\x85\xa2\x1f\x5d\x91\x74\x39\xec\x0f\x02\x8d\x84\x41\ -\x9d\x57\xa7\xac\xe2\x1e\x09\xf9\x00\xfc\x74\x0b\xb6\x1d\x9d\x87\ -\xab\x9d\xb5\x64\x1d\x06\x30\xb9\xe4\x59\x4c\x2e\x59\x65\x9e\x31\ -\x02\x6f\xa8\x01\x5b\x0f\xcf\x42\xb3\xef\x6c\x97\x27\x5e\x84\xbd\ -\x53\xc1\x56\xb5\x5b\x4b\xdb\x35\xea\x33\xba\x16\xc8\x6f\xc6\xbb\ -\x47\xe6\xe2\x9a\xef\x14\x71\x57\xe5\xe4\x53\xa0\xb0\xaf\xfe\x75\ -\xa2\x72\xbe\x50\x23\x2a\x0e\xcf\xc4\x9c\x5b\xb6\x61\x40\x4f\xeb\ -\x5b\xb9\xf5\x60\x26\x50\x5a\x5b\xd5\xed\x80\x7d\x41\x60\x4c\x62\ -\x82\x41\x1f\xe1\xb5\x2f\xdc\x88\xca\xc3\x33\x2d\x91\x3f\xa9\xe4\ -\x19\x85\xe6\x4f\x2a\x79\x06\x53\x4a\xbe\x43\x5c\xde\x17\x6e\x42\ -\x45\xf5\x4c\x34\x7a\x8f\x13\x97\x01\x8c\x87\x7e\xf1\x94\xb5\x03\ -\xf6\x05\x81\x1a\xa6\xdf\xb6\x11\x80\xce\xb5\x37\xdc\x80\xca\x23\ -\xb3\xd1\x2c\xf3\xcb\x66\x98\x54\xbc\x52\x93\x6c\xab\x42\xe0\xa7\ -\x5b\x50\x51\x33\x0b\x57\x3b\x8f\xe9\xe6\xe9\x0a\x23\x82\xe4\x04\ -\x81\x5a\xbe\x5c\xef\x3a\x4e\xf2\x3b\x43\x57\xb0\xb5\x66\x06\x5a\ -\xfc\xe7\x40\x8a\x49\xc5\x2b\x31\x65\xe8\x6a\xfd\xfb\x25\xcf\x18\ -\xde\x57\x23\x40\xb7\xa1\xa2\x66\x36\x1a\x3a\x8e\xca\xba\x97\xde\ -\x84\xab\x61\xff\xbf\x7d\xc5\x31\xc4\x53\xdc\x26\xb8\x6e\x0f\x5e\ -\xc2\xd6\xc3\x33\x88\xc7\xe6\x00\x30\xb1\xf8\x29\x22\x72\x27\x97\ -\x3c\x83\x31\x85\xe4\xef\xe9\x05\x99\x76\x54\x1c\x9e\x83\xf6\xe0\ -\xc5\x2e\x43\xba\x1c\xf6\xee\x09\x54\x9f\x5b\x0d\x02\x4d\x22\x7e\ -\x8a\xa2\xd0\x16\x38\x8f\xca\x23\xb3\xd1\x19\xfa\x1b\x71\xdf\x26\ -\x16\x3f\x85\xa9\x43\xbf\x67\x98\x47\x6c\xab\xa1\xf3\x28\x4e\x34\ -\xfc\x99\xb8\x6e\x00\xf8\x46\xc1\x6c\xf4\xc9\xf2\x58\x2a\x93\x2e\ -\xb0\x6f\x4f\x20\x40\x64\xfa\xa3\x37\x8c\x85\x41\x8b\xfc\x16\xff\ -\x17\xa8\x3c\x32\x17\xbe\xb0\xfe\x4a\x9d\x1a\x13\x8a\x56\x58\x22\ -\xbf\xa2\x66\x0e\x42\x4c\x87\x61\x7e\x39\x6e\x1d\xf2\x18\xee\xbe\ -\x61\x03\x8c\x07\xbe\xe9\x0b\xdb\xdf\x0c\x8a\xcb\xf4\x13\x58\x82\ -\x66\xdf\x59\x54\x1e\x9d\x03\x3f\xe1\x5a\x3d\x20\x90\x7f\xdb\xb0\ -\x35\x86\x79\xae\x07\xf9\xe9\xe4\x2a\x92\xb6\x25\x0c\x20\x37\xfd\ -\x66\x73\x01\xd7\xbc\x27\xf0\x6e\xed\x83\x96\x76\xeb\x98\x91\x2f\ -\x27\x21\xd9\xe4\xa7\x13\xe1\x6a\xd8\xba\x2b\xd8\x68\x3a\x17\x7a\ -\xf7\x4c\xfc\x7e\x63\xe7\x31\xbc\x57\x3b\x1f\x01\xba\x95\xb8\x3b\ -\xe3\x8b\x96\x27\x95\xfc\xb1\x43\x16\x99\x92\x9f\xce\xa4\xcb\x91\ -\xfc\xff\xfc\x4d\x40\x18\xae\x76\xd6\xe2\xdd\xa3\xf3\x2c\x92\xbf\ -\x0c\xb7\x0f\xfb\xbe\x41\x77\x12\x27\xff\x9e\x1b\x5e\x80\x16\xf9\ -\xea\x21\x60\xab\xff\x3c\xbe\x4c\xc2\xba\x84\x9d\x48\xca\x5a\x00\ -\x29\xe1\x46\x6e\xe1\x4a\xc7\x67\x78\xb7\xf6\x41\x04\x99\x76\xe2\ -\x3e\x08\xe4\xff\x40\xbf\x8f\x09\x93\xff\xa8\x26\xf9\x5a\xe3\xfe\ -\x56\x7f\x3d\x36\x57\x97\xa3\xb2\x66\x2e\x2e\xb5\x55\x11\xb7\x91\ -\x6a\x24\x65\x43\x88\xfc\xda\x28\x0e\x50\x5c\xca\xce\xbf\x6c\x3f\ -\x88\xed\xc7\x16\x58\x22\xa7\xcc\xb3\x34\x05\xe4\xbf\xa8\xe8\xa9\ -\xde\x84\x4f\x8b\xbf\x0e\x9b\xab\x67\xa0\x33\x78\x05\x21\xa6\x13\ -\xdb\x6a\x1e\xc4\xc5\xd6\xfd\xc4\x6d\xa5\x12\xb6\xaf\x05\x18\x0d\ -\x09\xf5\xca\x40\x41\xce\x11\x6c\x3f\xb6\x00\x61\xc6\x1b\x53\x46\ -\x0f\x65\x9e\xa5\xb8\xa3\xf4\x87\xfa\x6d\x25\x48\xfe\x2d\x85\x0b\ -\x15\xe4\x1b\xcd\xf4\xb5\xf8\xeb\xb0\xa5\x7a\x26\x3a\x83\x57\xa4\ -\xb4\x30\xeb\xc3\xb6\xc3\x0f\xe2\x7c\xcb\x3e\xcd\xbe\x59\x59\x0b\ -\xb0\x1b\xb6\xaf\x05\x28\x92\x64\xf7\x48\xb4\x9f\xe5\xc2\xd8\x79\ -\x62\x19\x68\xd6\x4f\xdc\xec\x38\xcf\x92\xa4\x93\xff\xcd\x91\x2f\ -\x41\x4e\xbe\x1e\x5a\xfc\xe7\xb0\xe5\xb3\x19\x0a\xf2\x45\xd0\x6c\ -\x00\xef\x1d\x79\x18\x0d\x1d\xca\xe5\x6a\x9e\xe7\x63\x56\xfa\x48\ -\xd3\xec\x80\xfd\xbb\x82\x01\x4b\xda\x2f\xff\x42\xeb\x5a\x3e\x44\ -\x7b\xf0\x12\x71\x7b\xe3\x3c\x8b\x71\x67\xe9\x73\xfa\xed\x24\x4c\ -\xfe\x23\x12\xf9\x66\x1a\x28\x90\x3f\xd3\x70\x86\x92\x66\x03\xd8\ -\x73\x66\x9d\x44\xa6\xde\x21\x82\x34\x5f\x22\x48\xfe\xab\x61\x46\ -\xda\xaf\xfa\x42\xbd\x61\xf2\xe9\xdd\x9b\xf2\x67\xe3\xce\xd2\x1f\ -\xe9\xb7\x2f\xab\xbb\x3d\x70\x29\x4e\xf2\x5f\x86\x48\xbe\x11\x5a\ -\xfc\xe7\xb0\xf9\xb3\x19\xf0\x86\x1a\x0c\xf3\x01\x40\x93\x57\xf8\ -\x7f\x80\x44\x09\x4c\xaf\xe5\x60\x55\xb0\x47\x94\x0f\xb1\x71\x40\ -\x1f\xd9\xef\x07\x9b\xa1\xae\x79\x37\xae\x79\x4f\x10\xe5\xcd\xcd\ -\x2a\xc4\x8d\xf9\xe5\xc4\x75\x8f\x29\xfc\x36\x31\xf9\xcd\xbe\x2f\ -\x88\xc9\x07\x00\x4f\xbf\x29\x12\xf9\x66\x1a\x6e\xa4\xf9\x76\x59\ -\x80\xa4\xcc\x03\x90\x0e\x09\xd5\x65\x8a\xfa\xde\x86\xdc\x1e\xe6\ -\xbf\xbe\x09\x08\xeb\xf1\x95\x87\xe7\x68\x0a\x41\x2c\x69\x14\xee\ -\xb9\xe1\x25\x8c\x1d\xf2\xa8\x69\xbd\x63\x0a\xbf\x8d\x7b\x47\xbe\ -\x02\x8a\x72\x10\x91\xbf\xa5\x9a\x9c\x7c\x00\x18\x33\x78\x81\x65\ -\x53\xaf\x97\xdf\x0e\x24\x6f\x47\x50\x4c\x26\x63\xed\x07\x00\xa7\ -\x23\x03\x53\x4c\x16\x6e\xe4\xf0\xd3\x2d\xa8\x3c\x32\x57\x21\x04\ -\xfa\xa4\x51\xb8\x7b\xc4\x0b\xb8\x75\xc8\x63\xba\xf5\x8d\x29\x5c\ -\x20\x91\x6f\x86\x66\xdf\xd9\x08\xf9\xe4\x0b\x53\x77\x96\xfe\x08\ -\x85\xb9\x13\x2c\xfb\x7c\xbd\xfb\x76\xc0\xf6\x79\x80\x78\xb5\x5f\ -\xc4\xa8\xbc\x6f\xe1\xce\xd2\x75\xc4\x4d\xfa\xc3\xcd\x92\x10\x98\ -\x69\x2c\x45\x39\x70\xf7\x0d\x1b\x30\xce\xf3\x78\xcc\x3d\x81\xfc\ -\x1f\x5b\x20\x7f\xa6\x25\xf2\x6f\x1f\xb6\x16\xb7\x0e\x11\xfe\x1d\ -\x4c\x4e\x22\xc7\x71\xd2\xa1\x27\x00\x7a\x79\xec\x40\xf2\xa7\x82\ -\x23\x30\xd3\x7e\x39\x6e\x1d\xf2\x38\xee\x18\xa6\x1f\xdd\xab\x21\ -\x17\x02\x92\x9e\x4c\x1b\xb1\x01\x65\x9e\xc5\x52\xca\xcd\x83\x1f\ -\xb6\x44\xfe\x66\x8b\x9a\x7f\xdb\xd0\xef\x63\xdc\x90\x25\x12\x99\ -\x72\x62\x8d\xc8\xd6\xbb\x9f\x9e\xa3\x00\x0b\x1a\xaf\xb8\xa5\xc8\ -\x16\xbd\x1a\xe7\x59\x0c\x1e\x1c\x3e\x3e\xf7\x12\x51\xf3\xfe\x70\ -\x33\x2a\x0e\xcf\xc1\xdc\x31\x95\x18\xd0\x6b\x94\x46\x17\x94\x7d\ -\xb8\x6b\xc4\x7a\x00\x40\x98\xf5\xe3\xbe\xaf\xbf\x4a\x44\x7e\x53\ -\xc4\xec\xfb\x42\x8d\x44\x7d\x02\x80\xa9\x43\xbf\x87\x71\x43\x96\ -\x1a\x06\x70\x46\x64\xca\xef\x89\xcf\x60\xe7\x7c\x00\x89\xfb\x36\ -\xfd\xad\x60\x9f\xcf\x67\x68\xfe\xe5\x5f\x3e\xa5\x1a\x06\x1a\x6d\ -\x02\x01\x80\x83\x17\x37\xe2\xe3\x73\x2f\x93\x3c\x0b\x00\x20\xdb\ -\xfd\x35\xcc\x1d\xb3\x0d\x03\x7a\x7d\xdd\xb0\xde\x28\x78\x32\xcd\ -\xf7\x7f\x81\xcd\x87\x1e\x20\xfe\xed\x00\x00\x98\x5c\xbc\x1a\xe3\ -\x3d\xc2\xbf\x81\xa9\x7d\xb9\x3a\x4d\xd1\xa3\x48\xba\x5e\xbf\xc5\ -\xf4\xec\xec\x6c\x50\x09\xfe\x56\x70\x4a\x56\x03\x75\x6f\x29\xb2\ -\x69\xe7\x2b\xf3\x3c\x89\xdb\x86\xea\xaf\xee\xa9\x21\x58\x82\xd9\ -\xb8\xe6\x3d\x69\x58\x6f\xb4\x5d\x02\xcd\xf7\x9e\xb1\x4c\xfe\xa4\ -\xe2\x55\x18\xef\x59\xae\x6b\xc2\xd5\xe6\x5d\xcb\xec\xeb\xb9\x02\ -\xf1\xda\x0e\x24\x65\x1e\xc0\x8a\xbf\x27\xc1\x84\x62\xe3\xf5\x7d\ -\x35\xd4\x42\x90\x08\x9a\xbc\x67\x04\xb3\x6f\x81\xfc\x89\x45\xcf\ -\x60\xfc\x90\x15\x31\x64\x6b\x91\x6f\x16\x00\xea\xe5\xe3\x38\x49\ -\xc9\x79\xd9\x61\x19\x29\x0b\x02\x01\x7d\x8d\x27\x99\xd5\x22\xd9\ -\xdb\x27\x87\x28\x04\x8d\x9d\xfa\x81\xa1\x59\xbb\x02\xf9\xe5\x16\ -\xc9\x5f\x89\x09\x9e\xa7\x75\x35\x5e\xfe\xa9\xa7\xed\x5a\x87\x96\ -\x20\x68\xc0\xb2\x10\x24\x57\x00\x0c\xa6\x7d\xc9\xab\x88\x96\x13\ -\x76\xf7\x7e\x97\xb8\xac\x24\x04\x1a\x96\xc0\x8c\xfc\x6b\xde\xd3\ -\x11\xf2\x9b\x88\xdb\x1b\xef\x59\x81\xf1\x43\x9e\x36\x8d\xe0\x6d\ -\xb6\x00\x1c\x94\x16\xc0\x92\x10\xd8\x3b\x11\x64\x60\xfe\xed\x70\ -\x05\x00\x30\xb1\xf8\x69\x4b\x2f\x6f\xf8\xc3\xcd\xa8\xa8\x99\xa5\ -\x29\x04\x7a\x68\xf2\x9d\xb1\x4c\xfe\xb8\xc2\x27\x31\xd1\xf3\xac\ -\x2e\x79\x66\xe9\x56\x2c\x80\x6a\x18\xc8\x00\x60\x11\xa7\x1b\x48\ -\xa9\x0b\x10\x41\x12\xfc\x19\xdd\x9b\x54\xbc\xd2\xd2\x5b\xbd\x6a\ -\x21\x30\x6a\xf3\x9a\xf7\x14\x36\x7f\xf6\x80\xa5\x0d\xa8\xb7\x16\ -\x2e\xc1\xa4\xa2\xef\xe8\x06\x6b\x24\x71\x40\xf4\x5c\x2e\x0c\xfa\ -\x75\xc9\x10\x06\x40\x23\x2a\x04\x96\x90\x3c\x01\xb0\xc1\xfc\x1b\ -\x61\xca\xd0\x55\x98\x32\xd4\xba\x10\x18\xbd\x44\xda\xe8\x3d\x89\ -\x2d\xd5\x33\x2c\x91\x3f\x76\xf0\x13\x98\x5c\xf4\x5d\x5d\x6d\xd7\ -\x13\x02\x91\x68\x96\xe5\xc0\xb2\x2c\x58\x96\x05\xc3\x30\x60\x18\ -\x06\x34\x2d\x1c\xe2\x35\xcb\xb2\x52\x5e\xb1\x2c\x00\x9c\x3c\x79\ -\xf2\x20\x80\x00\x04\x21\xb8\xfe\x02\x90\x6c\xf3\x1f\xad\x42\xa8\ -\x63\x72\xc9\x2a\x4c\x2e\x79\x86\xb8\x9c\x3f\xdc\x8c\xad\xd5\x33\ -\x71\xcd\x1b\x2b\x04\x8d\xde\x93\xd8\x5a\x3d\xd3\x12\xf9\xb7\x0c\ -\x7e\x0c\x53\x8a\xd7\x98\x9a\x76\x91\x40\xf1\x5c\x20\x95\x01\x4d\ -\xd3\xa0\xe9\x30\xc2\xe1\xe8\x11\x0a\x85\x10\x0e\x87\x23\xf7\x68\ -\x49\x00\x58\x96\x05\xcf\x0b\x75\xf8\x7c\x5e\x9c\x3b\x77\xae\x73\ -\xe1\xc2\x85\x6b\x00\xf8\x01\x84\x20\xb8\x02\x31\x1e\x20\x46\x52\ -\xfe\x32\xc6\x30\x9b\xa2\x88\x75\xf3\xaf\x86\x18\x0f\x7c\x52\xff\ -\x26\x51\x7e\x7f\xb8\x19\x5b\xaa\x67\xe0\xc1\xb1\xdb\x31\xa0\x97\ -\xf0\x7e\x7f\x63\xe7\x71\x6c\xad\x99\x6d\x91\xfc\x45\x98\x5a\xfc\ -\x03\xc3\xa9\x5c\x7d\xa1\xe0\xc1\xf3\x11\xc1\xe0\x79\x70\x2c\x2b\ -\xa4\x8b\x7e\x9d\x17\x9e\xdf\x95\xe1\x82\xd3\xe9\x84\xd3\xe1\x80\ -\xc3\xe1\x00\x4d\xd3\x68\x6b\x6b\x83\xdf\xef\x67\x5e\x7e\xf9\xe5\ -\x05\x55\x55\x55\x97\x21\x08\x40\xdc\x16\x20\x39\x1b\x42\x52\xbc\ -\x27\x7e\xca\xd0\xd5\xe0\xc1\xe1\xd3\xfa\x9f\x11\xe5\x97\x0b\x01\ -\xcf\xb3\x71\x90\xff\x28\xa6\x16\xaf\xd5\x24\x5e\xd4\x56\xb5\xe6\ -\xcb\xfd\x3a\xc7\x73\xe0\x58\x36\x62\xd2\xa3\x9f\x3c\xcf\x83\x07\ -\xe0\x74\x38\xe1\x72\xb9\x90\xc1\x65\xc0\x9d\x91\x01\xb8\x5c\xf0\ -\xf9\x7c\xf0\xfb\xfd\x08\x87\xc3\xdc\x3b\xef\xbc\xb3\x7c\xc7\x8e\ -\x1d\xa7\x21\xcc\xfc\x05\x20\xc4\x00\xc4\xb3\x7f\x72\x24\xf5\xcd\ -\x20\x00\xb6\xc7\x02\x7a\x96\x61\xea\xd0\xef\x81\xe7\x79\xec\x3f\ -\xff\x73\xa2\x7a\x44\x21\x00\xcf\xc3\x4f\xb7\x10\xb7\x3f\x66\xd0\ -\xc2\x18\xf2\x45\x01\x88\xfa\x70\x1a\xe1\x70\x18\x0c\x23\x98\x7b\ -\x8e\x63\xa3\x3e\x9f\x63\xc1\x32\x4c\x24\x3f\x2b\x09\x00\xcf\x73\ -\xa0\x28\x0a\x0e\xa7\x13\x19\x19\x19\x70\xbb\xdd\x70\xbb\x33\xc0\ -\xf3\x3c\x7c\x3e\x9f\xf4\x2f\xa6\xbb\x77\xef\x5e\xbf\x71\xe3\xc6\ -\x7d\x00\x3a\x10\xab\xfd\xd7\xc9\x02\x10\x0e\xff\xec\x36\xff\x6a\ -\xdc\x5e\xfa\x7d\xf0\xe0\x71\xe0\xfc\x2f\x88\xf2\x5b\xfd\x61\xe8\ -\x9b\x07\x3d\x82\xdb\x4a\x7e\x08\x9e\x8f\x5d\xd2\x15\x7d\x7b\x30\ -\x18\x44\x20\x10\x90\x7c\x39\xc3\x30\xa0\x23\x84\xb3\x2c\x1b\xd1\ -\xfc\xc8\xc1\x71\x92\xf9\xa7\x28\x0a\x4e\x97\x0b\x99\x99\x99\xe8\ -\xd3\xa7\x0f\x72\x72\x72\xc0\xb1\xac\x22\x2e\xa8\xad\xad\xfd\xb7\ -\x75\xeb\xd6\xfd\x05\x02\xf9\x3e\x24\xe0\xfb\x45\x24\xdf\x02\xa4\ -\x08\xa2\xd0\xdc\x51\xfa\x03\x00\x3c\x0e\x9c\xff\xa5\xad\xf5\xff\ -\x43\xc1\x02\xdc\x5e\xf2\x5c\x0c\xf9\x72\x01\xa0\x69\x1a\x81\x40\ -\x00\x3e\x9f\x0f\x5e\xaf\x0f\xc1\x60\x00\x34\x4d\x6b\xba\x05\xd1\ -\xec\x8b\x7d\xcf\xcb\xcb\xc3\xe0\xc1\x83\xd1\xaf\x5f\x3f\xb0\x2c\ -\x2b\x91\x2e\x7e\xd6\xd7\xd7\xff\xcf\xd2\xa5\x4b\x7f\x05\xa0\x1d\ -\x36\x91\x0f\x24\x43\x00\x92\xe8\xff\x49\x2d\xc3\x1d\xa5\x6b\xc1\ -\xf3\x1c\xaa\x2e\x6c\xb4\xa5\xdd\xd1\x05\x0f\xe1\xce\x61\xeb\x23\ -\xe4\xeb\xaf\xe1\x8b\x66\xda\xeb\xf5\xa2\xb3\xb3\x13\x7e\xbf\x1f\ -\xa1\x70\x18\x6c\xc4\xd4\xcb\xe3\x00\x87\xc3\x81\xbc\xbc\x81\xf0\ -\x78\x3c\xf0\x78\x3c\x70\xb9\x5c\x12\xe1\x22\xe9\xe2\x71\xf5\xea\ -\xd5\xa3\x4f\x3d\xf5\xd4\x3a\x08\xe4\x7b\x01\x04\x91\xc0\xd8\x5f\ -\x8e\xe4\x5a\x80\x38\xfc\xbf\x5d\xbb\x5d\xef\x1c\xfe\x1c\x78\x70\ -\x38\x78\xe1\x5f\x13\xaa\x67\x74\xc1\x7c\xdc\x35\x6c\x83\xa4\xf9\ -\x80\xf6\xd6\x2d\xd1\xff\x07\x83\x41\x04\x83\x41\xf8\xfc\x7e\xf8\ -\x7d\x3e\x30\x0c\x03\x87\xc3\x81\xec\xec\x6c\xe4\xe4\xe6\x62\xe0\ -\x80\x01\x28\x2c\x2c\x44\x7e\x7e\x3e\x78\x9e\x57\x68\xb9\x9a\xf8\ -\x50\x28\x84\xb6\xb6\xb6\xf3\xcf\x3d\xf7\xdc\xca\xe6\xe6\x66\x71\ -\xb9\x57\x24\x3f\x21\xcd\x17\x61\xff\xff\x06\x92\x9c\xdb\x6c\x25\ -\xf4\xea\xbb\x6b\xf8\x3a\x50\x00\xaa\xe2\x14\x82\x6f\x14\xcc\xc3\ -\xb4\xd2\x17\x63\x34\x1f\x80\xca\xfc\x8b\x31\x80\xe0\x06\x42\xe1\ -\x30\x42\xc1\x20\x18\x86\xc1\x92\x25\x4b\x34\xeb\x66\x18\xc6\x90\ -\xfc\x70\x38\x0c\xaf\xd7\xdb\xf4\xc6\x1b\x6f\xac\xf8\xfc\xf3\xcf\ -\xbf\x04\xd0\x09\xe5\xa4\x4f\x5c\x51\xbf\x1a\xa9\xdb\x14\x9a\x68\ -\x1b\x71\x0a\xcd\x5d\x23\xd6\xa3\xac\x68\xb1\x79\x46\x15\x6e\xca\ -\x9f\x83\x7b\x86\xbf\xa2\xab\xf9\xf2\x6b\xd1\xbc\xb3\x2c\x03\x86\ -\x65\xc1\x44\xfc\xbe\xde\x37\xc3\x30\x8c\x26\xe1\x72\x41\xf0\xf9\ -\x7c\xfe\x4d\x9b\x36\xad\xdc\xb3\x67\xcf\x59\xc4\x92\x6f\xdb\x96\ -\xa0\xeb\xb2\x16\x90\x2a\x88\x42\x33\x6d\xc4\xf3\x28\x2b\x7a\x82\ -\xb8\xdc\x37\x0a\xe6\xe2\x9b\x23\x5e\x85\x34\x2f\xa3\x41\xba\xb6\ -\x25\x60\xc1\xd0\xd1\x21\x5e\xcf\x9e\xd9\x31\x75\xcb\xc9\xd7\x32\ -\xf9\xe1\x70\x18\x81\x40\x80\xd9\xb9\x73\xe7\x9a\x77\xde\x79\xa7\ -\x1a\xd1\xe1\x9e\x18\xf4\xc5\xbd\xf6\xaf\x85\xe4\xbe\x1d\x6c\xb9\ -\x78\xf2\x6c\xc9\xb4\x11\xcf\x6b\xee\x06\x56\xe3\xa6\x82\x39\xb8\ -\x67\xf8\x8f\x01\x50\x9a\x44\xcb\xcf\xc5\xb1\x3d\xcf\xf3\x60\x59\ -\x4e\x1a\xf3\x33\x0c\x03\x9e\xe7\x90\x93\x93\xa3\xa8\x5b\x34\xfb\ -\x5a\x5a\x2f\x13\x06\x7e\xef\xde\xbd\xaf\xbc\xf5\xd6\x5b\x7b\xa0\ -\x24\x3f\xee\xb1\xbe\x11\x52\xb3\x18\x94\x44\x90\x0b\x0d\x85\xbb\ -\x6f\xd8\x80\x5b\x3d\xfa\xef\x05\xdc\x94\x3f\x1b\xf7\x8e\x10\x36\ -\x88\x1a\x11\x2f\x9e\x03\x7c\x84\xfc\xe8\x30\x8f\x61\x04\x37\xc0\ -\xb2\x2c\x06\x0e\xcc\x93\xea\xd6\xf3\xf9\x6a\x2b\x70\xf0\xe0\xc1\ -\x37\xd7\xad\x5b\x57\x89\x58\xcd\xb7\x25\xe8\x53\x23\x35\xf3\x00\ -\x16\x77\xff\x24\xb1\x23\xb8\xe7\x86\x17\xd0\xcb\x3d\x10\x7b\xeb\ -\x5e\x03\xcb\xd1\x00\x80\xec\x8c\x7e\x98\x54\xb2\x0a\x37\x0f\x7a\ -\x08\x3c\x4f\xa9\x48\x86\xe2\x3c\xea\x02\xa0\x18\x02\x8a\x33\x80\ -\x0c\xc3\x08\x93\x3d\x1c\x87\xc2\xc2\xc1\x00\x62\x35\x5f\x8f\xfc\ -\xda\xda\xda\xdf\xad\x5e\xbd\xfa\xf7\x10\xc8\xb7\x3d\xe2\xd7\x42\ -\x4a\xfe\x37\x30\x51\xca\xe3\x11\x1a\xa3\x37\x84\x26\x96\x3c\x85\ -\x91\x79\xff\x82\x73\x4d\xbb\xd0\x23\xa3\x1f\x86\xf7\xbf\x17\x4e\ -\x2a\x53\xd2\x6a\x20\x96\x70\x79\x9a\x00\xa5\xef\x67\x39\x56\x5a\ -\xb9\x63\x18\x16\x4e\x87\x03\x05\x05\x05\x60\x23\xb3\x79\x7a\x91\ -\xbe\x98\x7e\xfa\xf4\xe9\xad\x2b\x56\xac\xf8\x05\x94\x63\xfd\xa4\ -\x69\xbe\x88\xa4\xfe\x7b\x78\x3a\xa3\x4f\x96\x07\xb7\x14\x0a\xef\ -\x0a\xaa\x76\xd8\x10\x5a\x00\xb9\xff\x17\x22\x7f\xd1\x0a\x70\x1c\ -\x87\xbc\xbc\x3c\x50\x14\x65\x6a\xf2\x43\xa1\x10\xea\xea\xea\x76\ -\x2c\x5b\xb6\xec\x55\x44\x67\xf9\x44\xf2\x6d\x8d\xf8\xb5\xf0\x95\ -\x1e\x05\x90\x40\xa9\xd5\xe6\xe4\x8b\x9f\x62\x10\xc8\xc6\xac\xf3\ -\x0b\xd7\x45\x45\x45\xba\x1a\x2f\x0f\xfc\x2e\x5d\xba\xb4\x7b\xd9\ -\xb2\x65\xeb\x68\x9a\x6e\x83\x72\x75\x2f\xe9\xe4\x03\x5d\x5c\x00\ -\xec\x72\x0d\xda\x26\xde\xfc\x1e\xc0\x83\xe7\x38\xd9\xe6\x0d\x21\ -\x10\xa4\x1c\x14\x4a\x4a\x4a\x74\x7d\xbe\x6c\x7e\x7f\xc7\xe2\xc5\ -\x8b\x57\xfb\xfd\xfe\x16\x08\x63\x7d\xdb\xa6\x78\x49\x91\x36\x8b\ -\x41\xa9\x0a\x0e\xb5\x89\xd4\xce\xa3\x67\x0d\xc4\x43\x18\xfa\x09\ -\x01\x1f\xc3\xb2\x60\x58\x61\x98\x3e\xa8\xa0\x00\x6e\xb7\x5b\x61\ -\x01\xd4\xe4\x9f\x3e\x7d\x7a\xeb\x93\x4f\x3e\xf9\x2a\x4d\xd3\xad\ -\x88\xfa\x7c\xf1\xad\x9e\x94\x90\x0f\xa4\x91\x00\xa4\x12\xd6\x35\ -\x3d\xb6\x9c\x20\x04\x91\x0d\x1d\x0c\x03\x96\x61\x00\x9e\x87\xc3\ -\xe1\x84\xc7\x53\x64\x38\xc5\x5b\x5b\x5b\xfb\xdb\xe5\xcb\x97\xff\ -\x02\xd1\x68\x5f\xbe\xa9\xc3\x96\x29\x5e\x52\x74\x69\x17\x90\x4c\ -\xe8\x09\x84\x38\x04\x14\x26\x81\x84\x18\x80\x15\xd7\xf4\x1d\x0e\ -\xf4\xe8\x91\x89\x81\x03\x07\xe8\x99\x7e\xfe\xe0\xc1\x83\x6f\x2c\ -\x5f\xbe\xfc\xe7\x10\x02\x3e\x71\x8a\xf7\xba\x90\x0f\x5c\x87\x3d\ -\x81\x5d\x15\xb1\x43\x40\x41\xfb\x85\x0d\x1d\x00\x40\x21\xc3\x95\ -\x81\xfe\xf9\x05\xe0\x38\x2e\x46\xeb\x83\xc1\x20\xb3\x6f\xdf\xbe\ -\x17\xd7\xae\x5d\xbb\x0d\xca\x0d\x1d\x29\xf5\xf9\x6a\x7c\x25\x5d\ -\x00\x49\x3c\x61\xe4\x06\x48\xca\xca\x0f\x8a\x02\x32\x32\x5c\x00\ -\x78\xe4\xe5\x0d\x8c\xd1\x7e\xbf\xdf\xef\xdd\xb1\x63\xc7\x9a\x9f\ -\xfe\xf4\xa7\xe2\xf4\xae\x7c\x43\xc7\x75\x23\x1f\xf8\x8a\x0a\x40\ -\x2a\x41\x51\x14\x1c\x0e\x07\x32\x32\x32\xd0\xbb\x77\x6f\x00\x50\ -\x04\x7e\x1d\x1d\x1d\xd7\xfe\xf8\xc7\x3f\xae\xd8\xb4\x69\xd3\x61\ -\x08\x26\xdf\xb6\xdd\x3c\x76\xa0\x5b\x00\x12\x00\x45\x51\x70\x46\ -\x36\x71\x3a\x1c\x0e\xf4\xee\xdd\x5b\xa1\xfd\x6d\x6d\x6d\x75\x3f\ -\xf9\xc9\x4f\x96\xed\xd9\xb3\xe7\x0b\x08\xe4\x8b\x9b\x38\xd3\x82\ -\x7c\xa0\x5b\x00\xe2\x86\xa8\xf9\x4e\xa7\x13\x6e\xb7\x1b\x80\xe0\ -\x1a\x44\xf2\xaf\x5e\xbd\x5a\xbd\x66\xcd\x9a\x95\xc7\x8f\x1f\xbf\ -\x02\xed\xcd\x1c\xd7\x9d\x7c\xe0\x2b\x2a\x00\xe2\x2e\x5b\xab\xa0\ -\x28\x8a\x38\x0e\x10\x05\xc0\xe5\x72\x81\xa2\x28\x45\xe0\x77\xe1\ -\xc2\x85\xbf\x2e\x5d\xba\x74\x6d\x53\x53\x53\x0b\xa2\xc3\xbc\x84\ -\xb6\x6f\x27\x0b\xf6\x09\x00\xcf\x77\xa9\x91\x80\x15\xb2\xb5\xca\ -\x0a\x02\xe0\x84\xd3\x29\x3c\x7a\x30\x18\x44\x28\x14\xc2\xb1\x63\ -\xc7\x7e\xb7\x68\xd1\xa2\x9f\x21\x1a\xec\xa9\x67\xf7\xd2\x86\x7c\ -\x80\x7c\x1e\x80\x57\x1d\x1c\xae\xd3\xb8\x35\xd5\x10\x2d\x49\xd4\ -\xa2\x50\x00\x04\xed\xa7\x1c\x14\x9c\x4e\x07\x42\xa1\x20\x68\x9a\ -\xe6\x3f\xfe\xf8\xe3\x1f\x2e\x5a\xb4\xe8\x4d\x00\xf2\x79\xfd\xb4\ -\x33\xfb\x72\x58\xb1\x00\x22\xf1\x2c\x84\x20\x86\x86\xf0\x70\x5d\ -\x0e\x46\xda\x2f\xde\xd3\xcb\x43\x51\xc2\xc1\xf3\x80\x83\xa2\x10\ -\xa4\x69\x04\x83\x41\xb6\xa2\xa2\xe2\xf1\xd7\x5f\x7f\xfd\x13\x44\ -\x83\xbd\xb4\x18\xe6\x99\x81\x44\x00\xe4\x5a\xcf\x40\x20\x3d\x08\ -\xe1\x21\x01\x00\x0e\x87\x23\x6e\xbf\x2b\x35\x92\x60\xf9\x44\x21\ -\x27\x5e\xec\x87\xc3\xe1\x00\xc7\x71\x31\x9f\x91\x12\xa0\x28\x0a\ -\x5e\xaf\xd7\xff\xda\x6b\xaf\xcd\xa9\xac\xac\x3c\x09\x41\xeb\xd3\ -\x2e\xd2\x37\x02\xa9\x05\xe0\x21\x48\x72\x18\xc2\x03\x8a\x3f\xbb\ -\x1d\x00\x80\xcc\xcc\x4c\xfb\x7b\x96\x64\xd8\x21\x6c\x67\xcf\x9e\ -\xad\x5a\xb2\x64\xc9\xb3\xfb\xf7\xef\xbf\x02\xc1\xdf\xa7\xbd\xc9\ -\x57\x83\xe4\x5b\xa0\x00\x38\x01\x64\x00\xe8\x09\xe1\xf7\x02\x7b\ -\x01\xc8\x02\x90\x09\x21\x8e\xf8\xaa\xaf\x29\xc8\x7f\x7f\x87\x83\ -\xe0\xfe\x42\x10\x94\x41\x3c\x42\x48\xd3\x48\xdf\x08\xa4\x2e\x40\ -\xf4\xfd\xc1\x48\x1a\x0d\x41\xe2\x5d\x10\xc8\xef\x3a\xe1\x7f\x7c\ -\x50\x0b\x00\x8b\xa8\x10\x84\x11\xfd\x99\x16\xf5\x0f\x36\xa5\x3d\ -\xc8\xb7\xd4\x0a\x44\x3b\x21\x90\xee\x8c\x1c\x22\xf9\x5f\x75\x01\ -\x00\xb4\x85\x40\x0c\x88\xbb\x8c\xc9\x57\xc3\x0a\x71\x22\xd1\x72\ -\xd2\xff\x5e\xc8\x17\x21\x17\x02\x51\x10\xe4\xc3\xe3\x2e\x07\xab\ -\xe4\xd9\xb9\xd9\xb7\x2b\x83\xd7\x39\xef\x46\x37\xba\xd1\x8d\x6e\ -\x74\xa3\xab\xe0\xff\x01\xdd\x54\x8b\x5c\xc7\x61\xe8\xd6\x00\x00\ -\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ -\x00\x00\x1f\x38\ +\x00\x00\x00\x06\x62\x4b\x47\x44\x00\x00\x00\x00\x00\x00\xf9\x43\ +\xbb\x7f\x00\x00\x05\x95\x49\x44\x41\x54\x78\xda\xed\x5d\xc1\x6a\ +\x25\x45\x14\x3d\xd5\x69\xd1\x30\x82\x82\x0b\xa1\x47\x88\x9b\x2c\ +\x14\x5c\x48\xe1\x07\x08\x32\x2b\x41\x44\xc1\x9d\x0b\xc1\x45\xb2\ +\x57\xf0\x0f\xfc\x00\xc1\xac\xdd\x89\x2e\x5c\xa9\x2b\x71\x40\x44\ +\x1c\x0a\x92\x85\x0c\x48\x22\x44\x85\xde\x08\x2a\x12\x83\x3a\xe9\ +\x76\x31\x79\x43\xa7\xd2\xd5\xaf\xfa\xbd\x7e\xdd\xf7\x56\x9f\x03\ +\x43\x42\x32\x79\xdd\xef\x9e\x53\xa7\xee\xbd\x5d\xaf\x0a\x20\x08\ +\x82\x20\x08\x82\x20\x08\x82\x20\x08\x82\x20\x08\x22\x7d\x18\x09\ +\x37\x61\xad\xbd\x09\xe0\x16\x80\x1d\x00\x8f\xcd\x28\xfe\x7f\x03\ +\xf8\x15\xc0\xd7\xce\xb9\xbb\xb3\x13\x80\xb5\xf6\x19\x00\xef\x03\ +\x78\x19\x40\x36\xf3\xc1\xf8\x3d\x80\x77\x9d\x73\xb7\xc7\xbc\xe8\ +\xd6\x84\xe4\xbf\x06\xe0\x73\x00\xcf\x49\x71\xa2\x89\x71\x13\xc0\ +\x9b\x45\x51\xfc\x5b\x96\xe5\x37\x49\x0b\xc0\x5a\xfb\x22\x80\xcf\ +\x00\x3c\x42\xde\xaf\x39\xf2\x4b\x45\x51\xfc\x56\x96\xe5\x9d\x24\ +\xa7\x00\x6b\xed\x36\x80\x1f\x01\x3c\x45\xbe\x83\xf8\x07\xc0\xb3\ +\xce\xb9\x9f\x36\x7d\xa1\x29\xe6\xdd\xb7\x49\xfe\x52\x3c\x0c\xe0\ +\xbd\x31\x2e\x34\x85\x00\x5e\x27\xbf\x51\x78\xd5\x5a\xbb\x95\xa2\ +\x00\x9e\x27\xb7\x51\x78\xe2\xb2\x2c\x4e\x47\x00\xd6\xda\x1b\x00\ +\x1e\x25\xb7\xd1\x78\x32\x35\x07\x78\x88\x9c\xca\x8a\x57\xc6\x18\ +\xcf\x1b\xb9\xa4\x9b\xd9\xde\xde\xc6\xce\x4e\xdc\xb4\x67\xcc\xfd\ +\x0a\x36\xcb\x32\x18\x63\x50\xd7\xf5\x95\x7f\xd2\x71\x7e\x7e\x8e\ +\xd3\xd3\x53\x0a\xa0\x89\xdd\xdd\x5d\x1c\x1c\x1c\xcc\x62\xe4\x1d\ +\x1d\x1d\x61\x6f\x6f\x8f\x02\x58\x07\x0b\x17\xf0\xa1\xc1\x01\x38\ +\x05\x0c\x40\x7c\x53\x00\x8b\x69\xa0\xf9\x3d\x85\x90\xa0\x00\x8c\ +\x31\x57\x04\xe0\x8b\xa0\xe9\x00\x14\x42\x62\x02\x58\x10\xee\x8b\ +\x20\xf4\x7f\x9b\xc4\x53\x04\x89\x39\x40\x88\xf8\xb6\xa9\xa1\xaa\ +\x2a\x8a\x40\xbb\x00\xda\x46\x7f\x28\x19\x6c\x4e\x01\x8b\x52\xb1\ +\xae\x6b\x54\x55\x45\x11\x78\xc8\x52\x23\xbf\xed\x67\x8b\xbf\xcb\ +\xb2\xec\x41\xdf\x80\x50\xe2\x00\x7d\xc9\xef\x4a\x08\x59\x2e\x2a\ +\x13\x80\x4f\xfe\x2a\x23\xf7\x41\x32\x58\x5d\xc0\x64\x5b\xec\x1b\ +\x68\x11\xc0\x32\xf2\xfb\x88\xc1\x18\x83\xfa\x92\xfc\xc5\x6b\xb5\ +\xb5\x8d\xe7\x28\x84\x5c\x1a\xe9\x5d\x75\xbf\x3f\x6a\x7b\x8b\xa0\ +\x41\x70\x5f\x21\xa4\xda\x75\x14\x25\x80\x2c\xcb\xa2\x4a\xbd\x55\ +\x93\x38\x5f\x04\xcd\xd7\x6a\x8a\xa1\x99\x3f\xf4\xb9\x96\x46\x31\ +\x88\x76\x80\x50\xa7\x6f\xdd\x6b\x84\x44\xe0\x27\x8f\x21\x47\xf2\ +\x9d\x44\xf3\x34\x22\xd2\x01\x86\x22\x3b\x46\x68\x3e\x99\x31\x42\ +\xf0\x2b\x0c\xcd\x4e\x90\x4b\x1a\xfd\xcd\x29\x60\x28\xdb\x8f\x15\ +\x43\x88\xb4\x98\x52\xb3\xcd\x55\xb4\x88\x40\x5c\x15\xd0\x95\x6c\ +\x8d\xe1\x0a\xab\x12\xa7\xb5\xcf\x20\x46\x00\xcb\x82\xd5\x45\xfe\ +\x90\xe2\x58\x27\xe9\xd3\x28\x02\x51\xad\xe0\xae\x5e\xfd\xb2\x40\ +\x4e\x11\xe8\x50\x7f\x42\x53\xab\x59\x9c\x00\x34\x66\xd2\x5d\xfd\ +\x0b\xe9\x62\x10\x29\x80\x95\x45\x30\xa1\x70\xfc\x0a\x42\x8b\x13\ +\x88\x12\xc0\x2a\xa4\x5f\xf9\x1b\x81\x01\xa7\x03\xac\x40\x66\xf3\ +\x6b\x6c\x93\x45\x42\xa0\x43\x2e\x20\x59\x04\x62\xd7\x03\xc4\x26\ +\x83\x92\x83\xbb\x6c\xd9\x1a\x05\x10\x21\x02\xed\x09\xa1\x74\x17\ +\x50\xe1\x00\x9a\x45\x20\xdd\x05\x92\x70\x00\xe9\x89\x96\x64\x11\ +\xa8\x58\x13\xa8\x71\xe1\xc6\x3a\x0b\x58\x28\x00\xc5\x39\x80\x36\ +\x87\xca\xb5\x38\x80\x1f\xcc\xae\xc5\x9e\x44\x42\x53\x40\x97\x0b\ +\x68\x21\x5f\xb2\x8b\xa9\xd9\x20\x82\x9f\xf1\x63\x12\xa8\xaa\x24\ +\xd4\xb2\x40\x44\xd5\x16\x31\x5a\x57\xdd\xd0\x01\x06\x74\x01\x8d\ +\xa4\x4b\x76\x2f\x95\x9b\x44\x49\x17\x41\x5b\xcf\x82\x53\xc0\x86\ +\x12\x41\x89\x81\xe5\x8a\xa0\x99\x43\x53\xae\x42\x01\x30\x09\xd4\ +\x0d\x76\x02\x67\x24\x00\x92\x4d\x07\x50\xb7\xec\x9a\x02\x20\x28\ +\x80\x21\x47\xfe\xd0\x9f\x16\xa6\x00\x14\x0b\x80\x98\x89\x00\x48\ +\xfe\x8c\x05\x10\x5a\x5f\xcf\xb5\x00\x33\x10\x80\xf6\x91\xaf\xe1\ +\xc1\x95\x2a\x07\xd0\x0a\xc9\x4f\x31\x33\xe9\xc4\xb7\xd9\xbd\x64\ +\x31\x68\x5b\xb3\xa0\xc2\x01\xb4\x90\xcf\x29\x60\xc3\xe4\x6b\x9c\ +\xff\xa5\x2f\x62\xc9\x48\x3e\xcb\x40\x71\xa4\x87\xca\x3d\xe9\xa2\ +\xd0\xb8\x5c\x2d\x63\x00\x37\x7b\xef\xdc\x1f\x60\x26\xb6\xaf\x75\ +\xb3\x28\xf1\x0e\xa0\x7d\x37\x6f\x3a\xc0\x8c\xa6\x82\xae\x92\x95\ +\x9f\x0e\x5e\x41\x04\xcb\x1c\x81\x0e\x90\x78\x1f\x40\x43\x1d\x1d\ +\x9b\xc7\xd0\x01\x56\x24\x5e\xbb\x0b\x48\x9f\x06\x54\xee\x10\x22\ +\x5d\x04\x9a\xda\xd7\xb9\x06\xf2\x63\x8f\x6b\x31\xf7\xa3\xcd\x24\ +\x36\x25\x07\xe8\x3d\x7a\x04\x04\x5f\x53\x3f\x43\xf5\xf1\xf1\xb1\ +\x22\xa8\x47\x26\x85\x27\x86\x0c\x94\x30\xc5\x6c\xb7\x7a\xed\xe7\ +\x8b\xe0\x37\x5f\x6b\x82\xf7\xc1\x13\x43\x06\x4a\x9e\x7a\x9f\x19\ +\xc8\x1c\x40\x6f\x0e\xd0\x7c\x1a\xa8\xad\x9e\xbe\x7e\x8f\x5c\x0f\ +\x30\x48\xf2\x24\xae\x8e\x8e\x21\xb3\xae\x81\xba\x52\xe1\x0c\xfc\ +\x68\x58\x7f\x95\x46\xf4\x2c\xaa\x2b\x42\xe1\xa2\xd0\x35\xe6\x4e\ +\x4d\x4f\x03\x17\x44\xff\x77\xef\x02\xc8\x72\x15\x6d\x6c\xb1\x07\ +\x46\x4c\x7d\x28\x63\xdb\xe1\x15\xa1\xaf\xcd\xfb\x35\xc6\x20\xcf\ +\xf3\xe0\xef\x59\x05\xf4\x70\x80\xd0\xa9\x9e\x6d\x47\xb7\xfa\xbf\ +\x1f\xa2\x14\x8b\x15\x81\xe6\x6a\x40\xac\x00\x62\x4f\xf0\x0e\x91\ +\x31\x55\xf0\xfd\x4d\x2d\xa5\x4f\x03\xa2\x3b\x81\xd2\xcf\x08\x0a\ +\x09\x57\xd3\xce\xa6\x2a\x1e\x06\xf9\xd6\x2e\xdd\xb5\x34\x6d\x6b\ +\xab\x6e\xbb\xf8\xa1\xe6\xf7\xb1\xa7\x2f\x0a\x60\x43\x01\x96\xe2\ +\x08\x5a\xd7\x31\xaa\x7f\x1a\xc8\x0d\xa3\x13\x12\xc0\xd9\xd9\x19\ +\x0e\x0f\x0f\x67\x11\xf8\xe3\xe3\x63\x0a\xc0\xc7\xc9\xc9\x09\xf6\ +\xf7\xf7\x39\x2c\x47\x04\x9f\x05\x50\x00\x04\x05\x40\x50\x00\x04\ +\x05\x40\x50\x00\x04\x05\x40\x50\x00\x1b\x04\xdb\x76\xc2\xe2\x35\ +\xb6\x00\xfe\x02\x70\x8f\xbc\x46\xe3\x8f\xa4\x04\xe0\x9c\xab\x00\ +\xfc\x4c\x5e\xa3\x70\x31\x46\xac\xa6\xc8\x01\xbe\x20\xb7\x51\xf8\ +\xd6\x39\xf7\x67\x8a\x02\xf8\xf0\x52\xdd\x44\x37\x3e\x48\xb2\x0a\ +\x70\xce\xfd\x30\xd6\x9b\x53\x8c\xaf\x00\x7c\x92\x72\x19\xf8\x0e\ +\x80\x2f\xc9\x73\x2b\xee\x02\x78\xc3\x39\x37\x4a\xc5\xb4\x35\xc5\ +\x3b\x2c\xcb\xb2\x2a\x8a\xe2\x63\x00\x37\x00\xbc\x30\xd5\x7d\x08\ +\x2c\xf9\x3e\x05\xf0\x8a\x73\xee\xf7\xb1\x2e\x3a\xf9\x7a\x2a\x6b\ +\xed\x2e\x80\xb7\x00\xdc\x02\xf0\x34\x80\xc7\x67\x44\xfa\x19\x80\ +\x5f\x00\xdc\x06\xf0\x91\x73\xee\x3b\x8e\x03\x82\x20\x08\x82\x20\ +\x08\x82\x20\x08\x82\x20\x08\x62\x23\xf8\x1f\x8e\x96\x1e\x7d\x49\ +\xfc\xce\x76\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ +\x00\x00\x09\x54\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x80\x00\x00\x00\x80\x08\x06\x00\x00\x00\xc3\x3e\x61\xcb\ -\x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\ -\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ -\x01\x42\x28\x9b\x78\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\ -\x74\x77\x61\x72\x65\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\ -\x70\x65\x2e\x6f\x72\x67\x9b\xee\x3c\x1a\x00\x00\x1e\xb5\x49\x44\ -\x41\x54\x78\x9c\xed\x9d\x79\x94\x14\xd5\xd9\xff\x3f\xb7\x7b\x7a\ -\x16\x40\xc6\x99\x61\x16\x90\x45\x07\x51\x5e\x01\x17\x14\x09\x60\ -\xd0\xf8\x06\xf5\xa7\xe6\xc5\x2d\x1a\xf2\xc6\xbc\x2a\x27\x2a\x68\ -\x50\x41\xc9\x49\x3c\xc2\x2f\xaf\x22\xe6\x3d\x01\x17\x40\x93\x9f\ -\x5b\x24\x90\x1c\x63\x14\x09\x42\x04\x44\x16\x0f\x20\xca\xe2\x04\ -\x10\x90\x45\x18\x06\x18\x66\x84\x61\x66\x98\x99\xde\xaa\xea\xf7\ -\x47\x75\x55\x57\x75\x57\x75\x57\xf7\x54\xcf\xc2\xcb\xf7\x9c\x3a\ -\x5d\xf7\xde\xe7\xde\xba\x55\xdf\xe7\x3e\xcf\xdd\xaa\x5a\x28\x8a\ -\xc2\x59\xfc\xef\x45\x96\x1b\x85\x08\x21\x84\x1b\xe5\x9c\x45\x6a\ -\x50\x5c\x68\xbd\x22\xd5\x32\x62\xc8\x3e\x4b\x7c\xc7\x80\x4e\x62\ -\xaa\x4a\x91\x92\x05\x88\x90\x1f\x7b\xc0\x59\x45\x68\x2f\x28\x86\ -\x5f\x05\x50\x84\x10\x29\x29\x81\x63\x05\x30\x90\xef\x89\x1c\x5e\ -\xc3\xb9\x51\x19\xce\xa2\x6d\xa0\x91\x2e\x47\x0e\x49\x3b\x4f\x45\ -\x09\x52\xb1\x00\x1a\xf9\x5e\xc0\x07\x64\x47\x7e\xb3\x88\x2a\x01\ -\x9c\x55\x84\x4c\xc3\xd8\xea\x65\x20\x0c\x84\x80\x60\xe4\x97\x48\ -\xbc\x7b\x0a\x60\x68\xfd\x5e\x54\xe2\x73\x81\x2e\x91\xdf\x1c\xa2\ -\xd6\xe0\x2c\xf9\x6d\x03\x8d\x7c\x09\x08\x00\x7e\xa0\x19\xf5\xf9\ -\x07\x51\x5d\x81\x70\x62\x05\x92\x2a\x80\xa1\xd3\xa7\x59\x00\x1f\ -\x2a\xf9\xdd\x81\x73\x50\x95\x20\x1b\x55\x09\x34\xb9\xb3\xc8\x1c\ -\x34\x52\x25\x54\xb2\xfd\x40\xa3\x21\x2e\x4c\x84\x03\x27\x4a\xe0\ -\xd4\x05\xc4\x5a\x80\x3c\x54\xf2\xcf\x55\x14\x65\x69\x2a\xb5\x3f\ -\x0b\x77\x21\x84\xb8\x25\x72\x1a\x42\xb5\x06\x41\xa2\x4a\xd0\x7a\ -\x0b\x60\xbc\x16\xd1\x3e\x80\xa6\x04\xdd\x00\x4e\x9c\x38\x89\x3f\ -\x10\x20\x3a\x40\x14\x91\xca\x45\xc3\xf6\x69\xb1\xe9\x56\x61\xb0\ -\x9a\x6a\x10\xf1\x05\xb5\x3a\xcd\x5c\xcb\xe4\x72\x26\xd9\xb8\x84\ -\xcc\x19\xc3\xac\xac\x2c\xba\x76\xe9\x02\x2a\x07\x01\xa2\x56\x38\ -\x25\x57\x9c\xaa\x02\x58\x75\x04\x0d\xe4\xc7\x13\x9f\x5a\x38\x9e\ -\xe8\xb6\x24\xde\x09\xe9\x8a\xa2\x10\x0c\x04\x00\xc8\xce\xce\xc6\ -\xe3\xf1\xa4\x45\xb4\x2c\xcb\x04\x83\x41\x00\x72\x72\x72\x10\x42\ -\xd8\xb2\x66\xd5\x8c\xc3\xe1\xb0\x76\xaa\x75\xc6\x8d\xe4\x3b\xae\ -\x90\xc7\xa9\x60\x04\xb1\x4a\xe0\x05\x1c\x93\x2f\x44\xb2\xb0\x79\ -\x8e\xc9\x92\x7c\x73\x26\x73\xc5\xd2\x4d\x33\xa6\x27\x92\x01\xf6\ -\x7e\xf3\x0d\x65\x65\x65\x94\x95\x95\xf1\xee\xbb\xef\x3a\xb2\x24\ -\x56\xc7\x27\x2b\x57\x52\x56\x5a\x4a\x59\x69\x29\x9f\x6f\xdc\x98\ -\x90\x31\xbb\x32\x22\xd0\x78\x48\x6b\x38\x9e\xce\x54\xb0\xb1\x0e\ -\x9e\x68\x54\xfa\x26\xdf\x51\xab\x4f\xb1\x55\x3b\x6a\xed\x4e\xac\ -\x41\xac\x5c\xa2\x7a\x58\x26\xd8\xa4\xc4\x96\x99\xbe\xbb\x30\x12\ -\x9f\x72\x21\xae\xac\x05\x80\x53\xf2\x93\xf9\x7a\x0b\xdf\x6f\x2e\ -\x20\xed\xf8\x68\x6d\x1c\xa4\x27\x90\x49\xb5\x4c\xa7\x65\x38\xcd\ -\xed\xf6\xd2\x9d\x4b\x8b\x41\x90\x2a\xd9\xe9\xb6\x7a\xb7\x89\x77\ -\x4a\xba\x88\xf9\xd5\xe5\x9d\x5a\x91\x18\x8c\xfe\xfe\xf7\xd9\xbc\ -\x79\x33\x00\x7d\xfa\xf4\x49\x20\xe9\xbc\xcc\x74\xe0\x92\x05\x70\ -\x97\x7c\x5b\x92\xed\x08\x4e\xb7\x43\xe8\x24\x3d\x56\x2e\x99\x12\ -\x59\x57\x30\x2e\xaa\x4b\xd7\xae\x5c\x74\xf1\xc5\xc9\x72\x66\x1c\ -\x19\x77\x01\xc9\x14\x21\x10\x08\xe0\xf7\xfb\x01\xc8\xcf\xcf\x47\ -\x08\x81\x24\x49\x7c\xb1\x69\x13\xdf\x1e\x3c\x88\x2f\x2b\x8b\x21\ -\x43\x86\xf0\x6f\x97\x5c\x12\x77\xcd\x70\x28\xc4\xa6\x2f\xbe\xe0\ -\xd0\xc1\x83\x14\x16\x15\x31\x74\xe8\x50\x4a\x4b\x4b\x13\x5b\x09\ -\x43\x85\x5b\x5a\x5a\xd8\xb5\x6b\x17\xbb\xbe\xfe\x9a\xa2\xa2\x22\ -\x06\x0f\x1e\x6c\x6e\x8d\x0e\x3b\x78\x00\xdf\x7c\xf3\x0d\xff\xda\ -\xbe\x9d\x60\x20\xc0\xd0\x2b\xaf\xe4\xe2\x8b\x2f\xb6\x55\x4c\x50\ -\x7b\xf1\x4d\x4d\x4d\x08\xa0\x5b\xb7\x6e\x78\xbd\x5e\x5b\x59\x23\ -\x3a\xad\x0b\xb0\x6b\xf5\xb3\x67\xcf\x66\xf6\xac\x59\x00\x1c\xab\ -\xae\x66\xd5\xaa\x55\x3c\x39\x65\x0a\xd5\xd5\xd5\x26\xf9\x31\x63\ -\xc6\xf0\xff\x5e\x7f\x9d\xee\xdd\xbb\x23\x80\x85\x0b\x17\xf2\xec\ -\xb3\xcf\x52\x53\x53\x63\x92\xbb\xff\x81\x07\xf8\xdd\xef\x7e\x87\ -\xcf\xe7\x8b\x5e\x2b\xa6\xb2\x75\x75\x75\x3c\xfe\xd8\x63\x2c\x59\ -\xb2\x04\x59\x96\x4d\xf9\x8b\x8b\x8b\x99\x3d\x7b\x36\xff\x31\x76\ -\xac\xb9\xbe\x56\x65\x01\xfb\xf6\xef\x67\xc2\xc3\x0f\xb3\x69\xd3\ -\x26\x53\x7c\x61\x61\x21\xaf\xbe\xfa\x2a\xb7\xdc\x72\x0b\x56\xf8\ -\x74\xd5\x2a\xee\xba\xeb\x2e\x00\x96\x2f\x5f\xce\xc8\x91\x23\x2d\ -\xe5\x62\xe1\xb6\x0b\x48\x75\x18\x68\x83\xf4\xc8\x8f\xc5\xe2\x0f\ -\x3f\xe4\xde\x9f\xfd\x8c\xea\xea\x6a\xca\xca\xca\x18\x3c\x78\x30\ -\xd9\xd9\xd9\x00\xac\x5c\xb9\x92\x9f\x8e\x1b\x07\xc0\x8b\x2f\xbd\ -\xc4\x2f\x7f\xf9\x4b\x6a\x6a\x6a\xe8\xdd\xbb\x37\x97\x5c\x72\x09\ -\x59\x59\xaa\x2e\xbf\xfd\xd6\x5b\x4c\x9c\x38\x51\xaf\x95\x6e\x0d\ -\x22\xc7\xd6\xad\x5b\x19\x35\x72\x24\x8b\x17\x2f\x46\x96\x65\xba\ -\x74\xe9\xc2\xc8\x91\x23\xe9\xdf\xbf\x3f\x00\xb5\xb5\xb5\xdc\x7b\ -\xef\xbd\x3c\x36\x69\x12\x28\x8a\xb9\x83\x16\xe3\xf3\x0f\x55\x56\ -\xf2\xef\xd7\x5f\xcf\xa6\x4d\x9b\x28\x28\x28\x60\xf4\xe8\xd1\x9c\ -\x7f\xfe\xf9\x00\x9c\x3c\x79\x92\x71\xe3\xc6\xf1\xf2\xcb\x2f\x1b\ -\x6f\xdc\xba\xdf\x60\x8c\x4f\xe5\x70\x01\x2e\x29\x80\x33\xf2\x85\ -\x88\x1f\xdb\x1b\x43\x8f\x3f\xfe\x38\x97\x5e\x7a\x29\x9b\xbe\xf8\ -\x82\x9d\x5f\x7f\xcd\xda\x75\xeb\xd8\xbd\x67\x0f\x63\xc6\x8c\x01\ -\x60\xe3\xc6\x8d\x4c\x9b\x36\x8d\xe7\x67\xcc\x60\xd4\xa8\x51\x54\ -\x54\x54\xb0\x7d\xfb\x76\xd6\x6f\xd8\xc0\xce\x9d\x3b\xb9\x7a\xf8\ -\x70\x00\x3e\x78\xff\x7d\xf6\xed\xdd\x1b\xf7\xa0\x24\x49\x62\xe2\ -\x84\x09\x1c\x3d\x7a\x14\x21\x04\xd3\xa7\x4f\xa7\xea\xc8\x11\xfe\ -\xf9\xf1\xc7\x6c\xdd\xb6\x8d\x6d\x5f\x7d\xc5\x80\x01\x03\x00\xf8\ -\xd3\x9f\xfe\xc4\x7b\xef\xbd\x97\xf0\x81\xcf\xfa\xfd\xef\x69\x6c\ -\x6c\x64\xce\x9c\x39\x54\x56\x56\xb2\x74\xe9\x52\xb6\xef\xd8\xc1\ -\x86\x8d\x1b\xe9\xd5\xab\x17\x8a\xa2\xf0\xcc\x33\xcf\xb0\x63\xe7\ -\xce\xa4\x9d\xc5\x54\x0f\xb7\xe0\x8a\x02\xd8\xfb\x7f\x33\xf9\xa6\ -\x3c\x16\x71\x45\x45\x45\x2c\x5d\xb6\x8c\x0b\x2f\xbc\x50\x8f\x3b\ -\x37\x3f\x9f\xb9\x73\xe7\xea\x96\x60\xde\xdc\xb9\x0c\x18\x30\x80\ -\xc5\x8b\x17\xd3\xb7\x5f\x3f\xfd\xe2\x25\xa5\xa5\xcc\x9d\x33\x07\ -\x21\x04\xb2\x2c\xb3\x70\xe1\xc2\xb8\xeb\x2d\x5c\xb0\x80\xdd\xbb\ -\x77\x03\xf0\x9b\xdf\xfc\x86\xc9\x53\xa6\xe0\xf5\x7a\xf5\x87\xda\ -\xbf\xbc\x9c\x95\x2b\x57\x52\x58\x58\x08\xc0\x6f\xff\xfb\xbf\x09\ -\x44\x66\xfd\xac\x1e\x7e\x30\x18\xe4\xf9\x99\x33\xb9\xef\xfe\xfb\ -\x4d\x4a\x32\x64\xc8\x10\x3e\xfe\xf8\x63\xb2\xb2\xb2\x50\x14\x85\ -\x19\xcf\x3d\xe7\x3a\x81\x6e\x29\x81\x6b\x16\x20\x51\xe7\xcf\xd2\ -\x05\x58\xb4\x88\xa9\xbf\xfa\x15\x79\x79\x79\x86\x12\x01\x21\x28\ -\x2e\x29\xe1\xca\x2b\xaf\xd4\xe3\x7f\xf3\xf4\xd3\x78\xb3\xcc\xdd\ -\x17\x01\x5c\x74\xd1\x45\x5c\x3c\x70\x20\x00\x07\x0e\x1c\xd0\xe3\ -\xb5\x72\x5e\x7b\xed\x35\x00\xba\x77\xef\xce\x84\x89\x13\x2d\xcd\ -\x7b\x61\x51\x11\x0f\x4f\x98\x00\xc0\xe1\xca\x4a\x96\x2d\x5d\x6a\ -\x3b\x54\x2c\x2e\x2e\xe6\xfe\xfb\xef\xb7\x6c\xa1\xe5\xe5\xe5\xba\ -\x8f\xff\xe8\xa3\x8f\xa8\xac\xac\x34\x5d\xc7\x15\x37\xe0\x02\x5c\ -\xeb\x03\xb4\xd6\xff\x03\x3a\xc9\xba\x75\x30\xc8\xf6\xee\xdd\x3b\ -\x4e\x4e\x97\x55\x0b\x06\x21\xe8\xd5\xb3\x27\x00\x95\x95\x95\xa6\ -\x78\x59\x96\xd9\xbf\x7f\x3f\x00\x37\xdc\x70\x03\xdd\xcf\x39\x47\ -\xab\x90\xe9\x3a\x02\xb8\xe7\xee\xbb\xf5\xf0\x5e\xa3\x2b\x89\xa9\ -\xfb\xcd\x37\xdf\x4c\x5e\x6e\x6e\xfc\x8d\x44\x64\x6f\xbf\xe3\x8e\ -\x68\x39\xfb\xf6\xe9\xf9\xad\xac\x40\x7b\xb9\x01\x57\x5d\x80\xea\ -\xe3\x8d\xf1\x89\xc9\xd7\x09\x8a\xa0\x5f\xbf\x7e\x96\x43\x38\x01\ -\x9c\x5b\x50\x00\xa8\x0b\x30\x3d\x7b\xf6\x8c\xef\xe0\x45\x70\x4e\ -\x84\xd8\x53\xa7\x4e\x99\xe2\x8f\x1e\x39\xa2\x2f\xbe\x5c\x70\xc1\ -\x05\x96\xc4\x6b\xa1\x3e\x7d\xfa\xa8\x8b\x3c\xc4\x5b\x12\x63\xcd\ -\x74\xa5\xb4\x68\x99\x02\xe8\x6b\x18\x52\x7e\x7b\xe0\x80\xeb\xfe\ -\xdb\x0d\xb8\xd8\x09\x34\xde\x9a\x45\x67\x2f\x09\xf9\xa0\x92\x6b\ -\x45\xbe\x31\xce\xeb\xf5\xe2\xb1\x68\x91\x76\x0f\x57\x8b\x3f\x7c\ -\xf8\xb0\x1e\xd7\xb3\x57\x2f\x53\x5a\xac\x1b\xf0\x65\x67\x53\x5c\ -\x5c\x0c\x91\x7c\x76\xa4\x95\x96\x95\x81\x10\xb6\xad\xb3\xb4\xb4\ -\x54\x97\xad\xaa\xaa\x8a\xa9\x98\x30\x9f\xb7\x83\xf9\x07\xf7\xde\ -\x0b\x30\x86\xcc\xf7\xa6\x0a\x24\x90\xb7\x29\xd3\x22\x9f\xa1\x80\ -\x78\x59\x2d\x3e\x46\x29\xb4\xf8\x12\x03\x19\x27\xbe\xfb\xce\xd6\ -\xaf\x0b\xd4\xa5\xda\xba\xba\x3a\x00\x4a\x4a\x4a\xcc\x32\x06\xd9\ -\xba\x93\x27\xed\x5b\xb4\x10\x9c\x8c\x94\x01\x50\x5c\x52\x62\xeb\ -\x02\xd2\xb2\x0c\x2e\x29\x81\x6b\x33\x81\x2a\x12\xbb\x00\xab\x38\ -\xbb\x56\x6b\x4b\xb2\x55\x9c\x03\x45\xe9\xdb\xb7\x2f\x1e\x8f\x07\ -\x59\x96\x39\x74\xe8\x50\xc2\xf2\x8f\x1d\x3b\xa6\xbb\x8b\xf2\xf2\ -\x72\xbd\x95\xc7\xca\x1d\x39\x72\xc4\xf2\x5a\x9a\xdc\x51\x43\x7a\ -\xff\xf2\xf2\x0e\x67\xfe\xc1\x65\x17\x90\xd0\xff\xdb\xc4\xc5\x95\ -\xa3\x66\x36\xe7\xb3\x93\x4b\x41\x36\x27\x3b\x5b\xf7\xd9\xeb\xd6\ -\xad\xd3\x37\x54\xc4\xe5\x11\x82\x4f\x56\xad\xd2\x83\xfd\xfb\xf7\ -\xb7\x25\x6e\xed\xba\x75\xea\xd4\xac\x85\x1b\x00\x58\xb3\x66\x8d\ -\x2e\x7b\xc1\x05\x17\xd8\x94\x42\xbb\x99\x7f\x70\xad\x13\x98\xba\ -\xbf\xb7\x1a\x0a\xc6\xc6\xd9\xb5\x70\xbd\xbc\x04\xbd\xea\xb8\x78\ -\x21\xf8\x49\x64\x26\xb1\xb2\xb2\x92\xbf\xbf\xf7\x5e\xbc\x1b\x88\ -\x8c\x16\x5e\x7a\xf1\x45\x40\x1d\x2e\xde\x7c\xf3\xcd\xa6\x74\x23\ -\xf6\xec\xde\x1d\x3f\x4c\x8c\xa0\xa1\xa1\x81\x37\xde\x78\x03\x80\ -\x2b\xae\xb8\x42\x5d\xcb\x10\x02\xbb\xc9\xb0\x94\x0e\x8b\x32\xd2\ -\x85\x8b\xf3\x00\x2a\x1c\x93\x9f\xac\x1c\x2d\x9f\x95\xac\x9d\x92\ -\x24\x71\x05\x53\x26\x4f\xd6\x7d\xfa\xe4\xc9\x93\x59\xf5\xe9\xa7\ -\x7a\x3e\x01\xf8\x5b\x5a\xf8\xf9\xbd\xf7\xaa\x43\x3f\xe0\xa9\xa7\ -\x9e\xa2\xa8\x47\x0f\x93\xa2\xc5\x62\xe2\xc4\x89\xfa\xb2\xae\x56\ -\xd6\xa9\xfa\x7a\xee\xba\xeb\x2e\x1a\x1a\x1a\x00\x98\x3e\x7d\x7a\ -\x87\x1c\x01\x80\xcb\x7d\x00\x37\xc8\xb7\x33\xed\xb6\x72\x16\xd7\ -\xb0\x8a\x17\x40\xd7\xae\x5d\x99\x3d\x7b\x36\xe3\xc7\x8f\xa7\xb1\ -\xb1\x91\x3b\xef\xb8\x83\xe1\xc3\x87\x73\xf9\xe5\x97\x53\x53\x53\ -\xc3\x86\x0d\x1b\x74\xbf\x3e\x7c\xf8\x70\x26\x3e\xf2\x48\x42\xd2\ -\x1e\x18\x3f\x9e\xf9\xef\xbc\xc3\x8d\x37\xde\xc8\xe8\xd1\xa3\xb9\ -\xf4\xd2\x4b\xa9\xac\xac\x64\xed\xda\xb5\xfa\x62\xd6\x1d\x77\xdc\ -\xc1\x8d\x37\xde\x98\xf0\x9e\x13\xde\x83\x86\x0c\xbd\xc5\xed\xe2\ -\x72\x70\xea\xe4\x5b\xf9\x7b\xec\xe2\x62\xf3\x25\x93\xb3\x6a\xb5\ -\x42\x70\xdb\xed\xb7\x53\xde\xbf\x3f\xff\xf5\xf3\x9f\xb3\x77\xef\ -\x5e\xd6\xaf\x5f\xcf\xfa\xf5\xeb\x4d\x75\x9c\x3c\x79\x32\xd3\xa7\ -\x4f\xd7\x17\x98\x4c\x65\x1a\xae\x39\xe2\x7b\xdf\xe3\x86\x31\x63\ -\xf8\xc5\x2f\x7e\xc1\xf2\xe5\xcb\x59\xbe\x7c\xb9\x49\x7c\xea\xd4\ -\xa9\xfc\xdf\xdf\xfe\xd6\xb2\x9e\x71\x6b\x24\x16\xf7\x69\x75\x3f\ -\x6e\x23\xe9\xdb\xc1\x86\xb7\x82\x7c\xa8\x5b\xc1\xf3\x81\x62\xa0\ -\x0c\x28\x56\x14\xe5\xad\x13\x27\x4f\x9a\xf3\xa8\x19\x6d\xc3\xc6\ -\xb8\xca\xca\x4a\x7d\xd6\x6e\xd4\x35\xd7\x98\x1f\x8c\x21\xdf\x81\ -\x03\x07\x38\x7a\xe4\x08\x5e\xaf\x57\x5d\x3a\xb5\x51\x9c\xdd\xbb\ -\x77\x53\x5b\x5b\x4b\x5e\x6e\x2e\xc3\x86\x0d\x33\xde\x88\x49\xb6\ -\xa5\xa5\x85\xcd\x9b\x37\xb3\x63\xe7\x4e\xbe\xde\xb9\x93\xa2\x1e\ -\x3d\x18\x32\x78\x30\x43\x87\x0e\x55\x7b\xfe\xe6\x87\xa0\xe7\x6d\ -\x6e\x6e\xd6\x4d\xfe\xc0\x81\x03\x29\x29\x29\xe1\xd4\xa9\x53\x2c\ -\x5e\xbc\x98\x1d\x3b\x76\x10\x08\x04\xb8\xf2\xaa\xab\x18\x39\x62\ -\x04\x17\x5d\x74\x91\xed\x73\x3d\x79\xf2\x24\x3b\x76\xec\x00\xe0\ -\xb2\xcb\x2e\x23\x3f\x3f\xdf\x56\xd6\x0e\x91\xdd\xc4\x0f\x00\xb5\ -\x40\x75\xe4\xb7\x1e\x68\x41\x7d\x4f\x40\x49\xf6\x62\x88\xeb\x0a\ -\x90\x0a\xf9\x09\xc3\xa9\xc4\x19\xe2\x1d\x59\x82\x44\xe5\x24\xcb\ -\x97\xae\x5c\x06\xe0\x86\x02\xb8\xdb\x07\x80\xb6\x27\x3f\x4d\x85\ -\xb0\x4c\x8b\xa4\x27\x24\x33\x5d\xc2\x9d\x98\xf9\x76\x80\x7b\x7d\ -\x00\x48\x4e\x6c\x6b\xfa\x00\x36\x3e\x3d\x2e\xce\xcd\x78\xa7\xe9\ -\xe9\xca\x76\x00\xb8\x33\x15\x0c\xae\x93\x9f\x56\x0b\xcf\x00\xf1\ -\x4e\x49\xef\x2c\x84\xc7\xc2\x1d\x0b\x10\xdb\x43\x4d\x12\x6e\x15\ -\xf9\x99\x54\x08\x43\x7a\x32\x37\x90\x0e\xe1\x1d\xf1\x53\x4a\x2e\ -\xaf\x05\xc4\xdf\xa4\xa3\xa1\x5f\x86\xdc\x40\x4a\x3e\xde\x2d\x6b\ -\x40\xc7\x24\xda\x0e\x99\x9f\x08\x8a\x0d\xa7\x40\x7e\x5a\x2d\x3c\ -\x0d\x85\xb0\x94\x4f\x96\xcf\x24\xd2\x79\x08\x8f\x45\x9b\x4d\x04\ -\x65\x82\x7c\x47\x24\x27\x22\x38\x01\xb9\x49\x67\x2c\x3b\x31\xe9\ -\x46\xb8\xd7\x09\x8c\x0d\xbb\x41\x7e\x3b\xb8\x81\x44\xb4\x66\x9a\ -\x74\xbb\xf2\x33\xf9\x31\x4f\xd7\x3b\x81\x6e\x93\x9f\x49\x37\x10\ -\x0e\x87\xa9\xae\xae\x26\x10\x0c\xd2\xb7\x4f\x1f\x7d\xe7\x71\x7c\ -\xb6\xd6\x13\xdf\x9a\x32\x32\xa9\x78\x6d\x3a\x11\x94\x09\xf2\x53\ -\x69\xf5\xdf\x1e\x38\xc0\xc2\x85\x0b\xf9\xe7\x3f\xff\x49\x55\x55\ -\x15\xb5\xb5\xb5\x7a\xeb\xf2\x78\x3c\xf4\xee\xdd\x9b\xf2\xf2\x72\ -\x06\x0e\x1c\xc8\xb8\x71\xe3\x18\x31\x62\x44\x82\xbb\xb5\x47\x67\ -\x72\x0f\xae\x4c\x05\xd7\x9d\x3a\x95\x71\xf2\x9d\xfa\x7b\xab\xb8\ -\x0f\x17\x2d\x62\xce\x9c\x39\x6c\xd8\xb0\xc1\xfe\x46\x2d\x70\xd9\ -\x65\x97\xf1\xda\x6b\xaf\x71\xd5\x55\x57\x25\x94\x6b\x2f\xc2\xb3\ -\xb2\xb2\x68\xed\x54\xb0\x7b\xfb\x01\x9c\x90\x1d\x1b\x4e\x87\x7c\ -\x21\x2c\xe3\x2c\x57\xd4\x84\xe0\xf9\x19\x33\x18\x37\x6e\x5c\xca\ -\xe4\x03\x54\x54\x54\x30\x7a\xf4\x68\xe6\xcd\x9b\x17\x97\xa6\x6d\ -\xca\xe8\x4c\xad\xdd\x0a\xee\xec\x08\xb2\x39\x37\x85\x93\x91\xed\ -\x94\xfc\x64\x32\x91\x38\xed\x35\xb0\x67\x9f\x7d\x36\xf9\x0d\x24\ -\x40\x38\x1c\x66\xca\x94\x29\x7c\xfa\xe9\xa7\x91\xa2\x3b\x3f\xe9\ -\x46\xb8\x63\x01\x6c\x66\xfe\xda\x8b\x7c\x01\x3c\xf9\xe4\x93\xbc\ -\xfd\xf6\xdb\x4e\xef\x20\x21\x64\x59\xe6\xbe\xfb\xee\xe3\xf4\xe9\ -\xd3\xae\x94\xd7\x91\xe0\xea\x96\xb0\x58\xd3\x8f\x21\xdc\x5a\xf2\ -\x45\x32\x19\xd0\xdd\xc0\xd7\x5f\x7f\xcd\xeb\xaf\xbf\x9e\xb4\xbe\ -\xf9\xf9\xf9\x5c\x77\xdd\x75\xf4\xed\xdb\x37\xa9\x6c\x75\x75\x35\ -\xcb\x96\x2d\x4b\x2a\xe7\x04\x46\xf7\xd1\x9a\xc3\x0d\xb8\xb7\x2b\ -\x18\x6c\xfb\x01\x6e\x90\x4f\x32\x19\xc3\xb5\xe7\xce\x9d\x8b\x24\ -\x49\xb6\x75\xbd\xe7\x9e\x7b\xf8\xf4\xd3\x4f\x39\x76\xec\x18\x2b\ -\x56\xac\x60\xdf\xbe\x7d\x2c\x5b\xb6\x8c\x82\xc8\xdb\x47\x76\x58\ -\xb2\x64\x49\xc2\xf4\xf8\x6a\x66\x8e\x38\xb7\xe0\x5e\x1f\x20\x41\ -\x27\x10\xab\xb0\x51\xd6\x20\x93\x16\xf9\x86\xa0\xa2\x28\x7c\xf4\ -\xd1\x47\xb6\x75\x1d\x3b\x76\x2c\xf3\xe7\xcf\xe7\x9a\x6b\xae\x31\ -\x6d\xf9\xfa\xe1\x0f\x7f\xc8\x1f\xff\xf8\x47\xdb\x7c\x00\x7b\xf6\ -\xec\x49\x98\xae\x56\xa7\x63\x12\x6d\x07\xf7\x77\x05\x3b\x0d\x27\ -\x23\x3b\x81\x89\x4f\x24\x73\xe2\xc4\x89\xb8\xaf\x86\x18\xf1\xeb\ -\x5f\xff\xda\x92\x1c\x21\x04\x37\xdd\x74\x13\x5d\xbb\x76\xb5\xcd\ -\xdb\xd4\xd4\x64\x19\xdf\xd9\x48\x37\x22\xa3\xcb\xc1\xc9\x4c\xbf\ -\x51\xde\x09\xf9\x09\xf3\x44\x64\x8a\x8b\x8b\xf9\xdb\xdf\xfe\xc6\ -\x97\x5f\x7e\xc9\x91\x23\x47\x38\x72\xe4\x08\x87\x0f\x1f\xe6\xe8\ -\xd1\xa3\xdc\x70\xc3\x0d\x0c\x1d\x3a\xd4\xb6\xdc\xbc\xbc\x3c\x06\ -\x0c\x18\xc0\x57\x5f\x7d\x65\x79\x9b\x2d\x2d\x2d\xf6\xf5\xe9\xa4\ -\xc8\xd8\x4c\x60\xaa\x23\x00\xec\xc2\x38\x27\x5f\xc3\xd8\xb1\x63\ -\xb9\xed\xb6\xdb\x12\xd7\xd5\x86\xc0\xb8\x9d\xc0\x06\x34\x35\x35\ -\x9d\x31\xc4\x6b\xc8\xd8\x96\x30\x0c\xe1\xd6\x0e\x07\x63\xcb\x4c\ -\xd9\x5a\x38\x4c\x3f\x71\xe2\x84\xfe\x4e\xa0\x15\xec\x5c\x40\x6b\ -\xe1\x54\xa9\x32\xb1\x28\x94\xb9\xd5\xc0\x64\xb2\x56\x64\xc7\x86\ -\xd3\xec\x27\x24\x82\xa2\x28\x54\x54\x54\xb0\x7a\xf5\x6a\x76\xec\ -\xd8\x41\x55\x55\x15\x87\x0f\x1f\xa6\xaa\xaa\xca\x64\xe2\xad\x90\ -\x48\x39\x92\xa1\xbd\x17\x94\xec\xe0\x9e\x0b\x70\xd0\xba\x5d\x25\ -\x3b\x05\xf2\x8f\x1d\x3b\xc6\xa2\x45\x8b\x58\xb3\x66\x0d\xeb\xd6\ -\xad\xe3\x64\xcc\x7b\x0c\x99\x40\x67\x71\x15\x6d\xda\x09\x34\xa6\ -\xb7\x05\xf9\xe1\x70\x98\x57\x5e\x79\x85\xe7\x9e\x7b\xae\x4d\x66\ -\xf1\x3a\x0b\xe9\x46\xb8\xdf\x09\x8c\x8b\xcc\xb0\x32\x60\xfd\xe0\ -\xeb\xeb\xeb\xb9\xf9\xe6\x9b\xf9\xf2\xcb\x2f\x93\xd6\xbb\x35\xe8\ -\x8c\xa4\x1b\xe1\x6e\x27\x10\x2c\x7d\xbb\xab\xc3\xc1\xd8\xb0\x05\ -\x01\x4d\x4d\x4d\x8c\x1d\x3b\x36\x29\xf9\x3e\x9f\x8f\x6b\xaf\xbd\ -\x96\x6b\xae\xb9\x86\xe2\xe2\x62\x8a\x8a\x8a\x98\x3e\x7d\xba\xe3\ -\x09\x9f\x33\x01\xee\xee\x0a\x4e\x46\x30\x16\x04\x3a\x4c\x53\x8b\ -\x13\x09\xc3\x1a\xa6\x4e\x9d\x9a\x70\xf9\xd7\xeb\xf5\xf2\xc2\x0b\ -\x2f\xf0\xc0\x03\x0f\xc4\xbd\x93\x37\x2b\xf2\xd9\x5a\x3b\x9c\x29\ -\xc4\x6b\xc8\xc8\x28\x40\x8d\x4c\xd2\x09\xb4\x08\x9b\x83\xa9\x85\ -\x35\x1c\x3b\x76\x8c\x77\xde\x79\xc7\xb6\xae\x79\x79\x79\x2c\x58\ -\xb0\x80\xb1\x31\xdf\x02\xd6\xa0\x7d\x18\x32\x93\xe8\x48\x4a\x94\ -\xb9\x51\x00\xad\x30\xf5\x69\x92\x0f\x30\x67\xce\x9c\x84\xc3\xb5\ -\x7b\xef\xbd\xd7\x96\x7c\x70\x5f\x01\x3a\x12\xd9\x56\x70\x75\x3f\ -\x40\x2a\xa6\xdf\x98\x37\x91\x32\xa4\x42\xbe\x10\x22\xe9\xce\x9f\ -\x1f\xfc\xe0\x07\x09\xd3\x4f\x9d\x3a\x95\x30\x3d\xf6\xeb\xe2\x76\ -\xf5\xe8\x2c\x6b\x03\xae\x2f\x06\x69\x70\x6a\xfa\x5b\x63\x09\xac\ -\xd2\xb4\xaf\x81\xda\x61\xf4\xe8\xd1\xb6\x69\x5b\xb6\x6c\xe1\xf8\ -\xf1\xe3\x09\xf3\xef\xda\xb5\xcb\xf6\xfa\x9d\x85\x74\x23\xdc\xdd\ -\x0f\x00\x96\xad\x1f\x43\x5a\x42\x82\xed\xca\x4c\x76\xed\x48\x39\ -\x4d\x4d\x4d\x49\x09\x4c\x44\xd0\xfb\xef\xbf\x9f\xf4\x5a\xb1\xff\ -\x0b\xd0\x19\x49\x37\xc2\x5d\x0b\xe0\x60\xf6\x0f\xbb\xb4\x34\xfd\ -\x7e\xec\x6a\x9e\xf1\x63\xd3\x56\xd8\xbe\x7d\xbb\x65\x7c\x4d\x4d\ -\x0d\x0b\x16\x2c\x48\x98\x17\xe0\xb3\xcf\x3e\xd3\xaf\xdb\x99\x89\ -\xd7\x90\xb9\x4d\xa1\x49\x3a\x7e\x6e\x98\xfe\xd8\x78\x8f\xc7\xc3\ -\xc0\xc8\xd7\xc2\xed\x30\x63\xc6\x8c\xb8\xdd\x42\x4d\x4d\x4d\xdc\ -\x7a\xeb\xad\x1c\x3d\x7a\x34\x61\x5e\x80\xbf\xfc\xe5\x2f\x6c\xdd\ -\xba\x35\xa9\x9c\x53\xb4\xc7\x36\x30\x23\x32\xb2\x2d\x5c\x8f\xb2\ -\x4b\x4b\xc1\xf4\x3b\x25\x5f\xc3\x90\x21\x43\xec\xeb\x88\xfa\x91\ -\xc8\x9b\x6e\xba\x89\x65\xcb\x96\xb1\x65\xcb\x16\x66\xcc\x98\xc1\ -\xf0\xe1\xc3\x1d\x93\x1a\x0e\x87\xb9\xef\xbe\xfb\xd2\x5a\x18\x72\ -\x83\x50\xb7\x95\x21\x33\x53\xc1\x49\x94\x21\xdd\x8e\x9e\x13\x0c\ -\x1b\x36\x8c\xf9\xf3\xe7\x27\x94\x59\xbd\x7a\x35\xab\x57\xaf\x4e\ -\xfb\x1a\x3b\x77\xee\x64\xed\xda\xb5\xfa\x3f\x99\xd8\xa1\x33\xb8\ -\x88\xcc\x6c\x0b\xc7\x61\x3f\x80\x78\x57\x60\x0e\xa6\xd6\xfa\x01\ -\xc6\x8f\x1f\xcf\xa0\x41\x83\x12\x5c\x31\x31\xce\x39\xe7\x1c\xae\ -\xbf\xfe\xfa\x84\x32\xa3\x46\x8d\x4a\xf8\x27\x4f\x9d\xa9\x7f\x90\ -\x91\x51\x40\xda\x1d\x3f\x53\x52\xea\xe4\x83\xfa\xc9\xf9\x37\xdf\ -\x7c\xd3\xf1\xdf\xb0\x19\x51\x52\x52\xc2\xaa\x55\xab\xf8\xe0\x83\ -\x0f\x38\xff\xfc\xf3\x2d\x65\xee\xbe\xfb\x6e\x56\xae\x5c\x19\xb7\ -\x77\x30\x1d\xd3\xac\x28\x4a\x5a\x87\x9b\x70\xfd\x0b\x21\x26\xa4\ -\xa0\x0c\x4e\x1e\x9c\xd3\x9d\x3e\x57\x5d\x75\x15\x6f\xbe\xf9\x26\ -\x4f\x3c\xf1\x84\xfe\xd9\xf7\x64\xb8\xf6\xda\x6b\x79\xfd\xf5\xd7\ -\xd5\x8f\x43\x0b\xc1\x7b\xef\xbd\xc7\x98\x31\x63\x4c\x13\x43\x53\ -\xa7\x4e\x65\xe6\xcc\x99\xa6\x7a\xa4\x4a\xb8\x65\xdc\x91\x75\x88\ -\xe3\x9f\x43\xc3\x41\x68\x38\x88\x68\x3c\x08\xc1\x7a\xc8\x2b\x46\ -\xc9\x2b\x81\xbc\x52\x28\xff\x11\x4a\xf9\xed\x08\x6f\xb6\x5e\x8e\ -\x2b\x9b\x4c\xdc\x78\x39\x54\xdf\x2a\x95\x68\x18\x28\x04\xde\x13\ -\x5f\x21\x8e\x7f\x81\xdc\xff\xc7\x90\x5b\x68\xbc\x88\x2b\xad\x3f\ -\x36\xbd\xb6\xb6\x96\xa7\x9e\x7a\x8a\x77\xdf\x7d\x97\x50\x28\x14\ -\x27\xef\xf1\x78\x18\x31\x62\x04\x13\x27\x4e\xe4\x27\x3f\xf9\x49\ -\x5c\x19\xdb\xb6\x6d\xe3\xc6\x1b\x6f\xa4\xbe\xbe\x9e\x57\x5e\x79\ -\x85\x87\x1e\x7a\x28\xa5\xfa\x40\x3c\xe9\x7a\x58\x0a\x22\xf6\xbd\ -\x8b\xa8\x78\x19\x6a\xad\x37\xa1\xc6\x95\xd5\xfb\x7a\x94\xb1\x2b\ -\x4c\xf5\x17\x1d\xe1\x43\x91\x46\x05\x48\xd4\xd9\xcb\x3a\xb4\x04\ -\xdf\x8a\x7b\x20\xfb\x1c\xa4\x41\x13\x91\x2e\x9d\x84\x92\x53\xe8\ -\xa8\x45\xa5\xbb\xcf\x0f\x20\x14\x0a\xb1\x7f\xff\x7e\x76\xed\xda\ -\x45\x4d\x4d\x0d\x05\x05\x05\x14\x16\x16\x32\x74\xe8\x50\x8a\x8a\ -\x8a\x12\x96\xd1\xdc\xdc\x4c\x6e\x6e\xae\xfe\x17\x32\x4e\xea\x62\ -\x7c\xa6\x96\xcf\x77\xdf\x7b\x78\x3e\x7b\x02\x9a\xab\xe3\xd3\x12\ -\xa1\x4b\x19\xd2\x7d\xd1\x7f\x3e\xf1\x7a\xbd\x1d\x48\x01\x92\xb4\ -\x7e\xed\xdc\xfb\xed\x22\x7c\xeb\x26\x40\xb0\x01\x7c\xdd\x90\x06\ -\x4d\x40\xba\xf4\x31\xc8\xeb\xa1\x5d\xcf\xaa\x0e\xc9\xea\xd8\xaa\ -\x74\xa7\x32\xc9\xe4\xec\x88\x8f\x7d\xc6\xa2\xe2\x65\xa8\xdb\x03\ -\x79\x25\xd0\xa5\x04\x25\xaf\x58\x3d\xcf\x2d\x82\x70\x0b\x04\xeb\ -\x11\x0d\xdf\x22\x76\xbd\x85\xa8\xd9\x1c\xcd\x98\x9d\x4f\x78\x7c\ -\xad\x5e\x8f\x0e\xa7\x00\x8e\xe6\xff\x85\xc0\xd3\x70\x00\xdf\x27\ -\x3f\x43\x7c\xb7\x4d\x8d\xf3\x75\x45\xba\xe4\x61\xe4\xcb\x9f\x80\ -\xbc\x62\xab\x3a\x24\xaa\x5f\xb2\xfa\x27\x4c\x77\x43\xc6\x09\xf1\ -\xb6\xfe\x3f\x09\x7c\x6f\x97\x41\x40\xed\xc7\x28\x65\x23\x08\xdf\ -\xb6\x46\xaf\x4b\xc7\xfa\x3e\x80\x1d\x2c\x66\x00\x95\xee\xe5\x04\ -\xc7\xae\x46\x1a\xf4\xb0\x1a\x19\x6a\xc2\x5b\x31\x0b\xdf\x5f\x2e\ -\xc6\xfb\xf9\xaf\xa1\xa5\xc6\x90\x3d\xb3\xc3\x29\xb7\xc8\x77\xd2\ -\x73\xb7\x4d\x0f\x07\xa0\x76\x2b\x8a\xff\x24\xb2\x2c\x9b\x0e\xa5\ -\xfb\x05\xd1\x6b\x15\x0e\x72\x7d\x34\xe0\xda\x3c\x80\x23\x9a\x8c\ -\x0f\xd2\x9b\x83\x74\xcd\x4b\x84\xc7\x2c\x84\xec\xee\x6a\x5c\xa8\ -\x09\xcf\x57\xb3\xf1\xfd\xb9\x9c\xac\x65\x63\xf1\xec\xf9\xb3\xda\ -\x1b\xb6\x2d\xae\xfd\x5c\x83\x1d\xc1\xc6\x34\x2b\x39\x45\x51\x74\ -\x72\xc5\xf1\xcf\xf1\x7e\x36\x09\xdf\x9f\xfb\xe1\x7b\x7f\x04\x59\ -\x4b\x6e\x8a\x2f\xf7\x74\xf4\x7f\x87\xe4\x82\x41\xa6\xfc\x6e\xc0\ -\xfd\x61\x60\xa2\x39\xff\x18\x39\x00\xb9\xfc\x4e\x42\x3d\xae\x20\ -\x6b\xe5\x4f\x11\xdf\x45\x7a\xc3\x72\x08\x51\xf9\x31\xde\xca\x8f\ -\x61\xdd\x23\x28\x7d\x6e\x40\xbe\xf0\x2e\x94\xf3\x7f\x04\xbe\x6e\ -\x91\xec\xed\x4b\x7e\xa2\xdf\x84\x69\xf5\x07\xf0\xee\xfb\x2b\xde\ -\xbd\x7f\x45\x34\x98\x97\xae\xe5\x92\xe1\x26\xe5\xf1\x34\x1d\x46\ -\xb4\x44\x56\x37\x3d\x59\x84\xfb\xfd\x07\x8a\x2c\xbb\x6a\x15\x33\ -\x3e\x0f\x60\x3c\xb7\x55\x8c\xfc\xfe\x84\x6f\x5f\x87\x77\xc3\x54\ -\x3c\x3b\xff\x60\x2e\x43\x0a\x20\x0e\x2e\xc1\x7b\x70\x09\x64\xe5\ -\xa1\xf4\xfd\x3f\xc8\x17\xde\x05\xe7\xdf\x02\x59\x5d\x6c\x2e\x9b\ -\x19\xf2\xd3\x21\x5c\x51\x14\x38\xb9\x0b\xcf\xd1\xd5\x78\xf7\xff\ -\x1d\xcf\xf1\x8d\xf1\xe5\x76\xe9\x49\xf0\xea\xe7\x08\x97\xdf\x0d\ -\x86\x96\x2d\xaa\xa3\x9b\x5b\xc2\x7d\x6e\x41\xce\x2b\x85\x88\x82\ -\x74\xa8\xb5\x00\xbb\xce\x5f\xb2\xd6\x6f\x82\x37\x07\xe9\xfb\x2f\ -\x23\x0f\xb8\x07\xef\xe6\xe7\x10\x55\xab\xe2\x65\xc2\x2d\x88\x03\ -\x1f\xe0\x3d\xf0\x01\xf8\xba\xa2\xf4\xba\x16\x4a\xae\x44\x29\x1e\ -\x8a\x52\x3c\x14\xba\xf6\x6a\xd5\x7d\x44\xab\xe7\x9c\x7c\xab\x5f\ -\x71\x6a\x0f\x9e\xa3\x6b\x11\x47\xd6\xe2\x39\xf6\x19\xa2\xc5\xe6\ -\x6d\x65\x8f\x8f\xe0\x25\x8f\x10\xba\xe2\x57\x28\x59\x5d\xe3\xfe\ -\x16\xc6\x7b\xe0\x03\xfd\x3c\x34\x70\xbc\xea\x36\x22\x75\x73\xab\ -\x0f\x90\x39\x0b\x90\x68\x9a\xd7\x24\x66\x96\x53\xca\x46\x12\xbe\ -\x75\x19\x9e\xe3\x1b\xf1\x7c\xf9\x1c\xa2\xea\x13\xeb\xf2\x43\x4d\ -\x88\x43\xcb\xe0\xd0\xb2\x68\x79\x5d\x7b\xa2\xf4\x18\x0a\xa5\x57\ -\x46\x14\xe3\x4a\xe8\x52\x16\x53\xad\xd4\xad\x83\x2d\xd9\x52\x08\ -\xd1\xf8\x2d\xd4\xed\x41\xd4\xed\x41\xd4\x6e\x45\x1c\x5d\x17\x35\ -\xdb\x09\x10\xee\xf5\xef\x04\x86\xff\x0e\x39\x5f\xfd\xbb\x7a\x25\ -\xc6\xa7\x8b\x40\x1d\x59\x47\x56\x02\x20\x77\xbf\x90\x70\xcf\xd1\ -\x7a\xeb\x77\x72\x1f\x4e\x91\x59\x17\xa0\x21\xc5\xca\x0a\x21\x50\ -\xca\x46\x22\xfd\x68\x19\xa2\x7a\x23\x9e\xcd\xcf\x21\x0e\xaf\x4c\ -\x9e\xb1\xe9\x18\xa2\x69\x29\x1c\x5a\xaa\x96\x03\xd0\xb5\x17\x4a\ -\xe1\x60\xc8\xeb\x81\xc8\x2d\x84\xdc\x42\x94\xec\x7c\xc8\x29\x50\ -\x67\x23\x73\x0a\x20\xb7\x00\x72\x0a\x11\x79\x85\x80\x07\x42\x8d\ -\x10\x6c\x84\x50\x23\x4a\xa0\x41\x0f\x8b\x40\x1d\x9c\xda\x87\xa8\ -\xdb\x03\xa7\xf6\x20\x1a\xbe\x05\x39\x7e\x86\x31\x11\xe4\x6e\xfd\ -\xf0\x0f\x7b\x9e\x70\xdf\x5b\x80\x78\xe2\x35\xf8\x0e\x7e\x00\x52\ -\x10\xbc\x39\x34\x8f\x9a\x87\x2c\x2b\x80\xd2\x81\x2d\x40\x6b\xcc\ -\x7f\x02\x28\x65\x23\x90\x6e\x5d\x8a\x38\xfe\xb9\x6a\x11\x0e\xaf\ -\x48\x9e\xc9\x88\xa6\xa3\x88\x26\xf3\x46\x8f\x54\x6a\xe0\x4e\x3b\ -\x13\x84\x4b\x47\x11\x1a\xf0\x33\x82\xfd\xc6\x82\x37\xd7\xd4\x9a\ -\x21\x9e\x50\xdf\xfe\xbf\x01\xd0\x74\xf5\xef\x09\x15\x5d\x85\x30\ -\xba\x18\xf3\x33\x54\x0c\x47\xca\xc8\x8c\x05\x48\xd3\xfc\xdb\xc5\ -\x01\x28\xa5\xdf\x43\xfe\xd1\x52\xc4\xf1\x4d\x88\xcd\xcf\x23\x2a\ -\x97\x83\x62\xff\x1d\xa0\x8e\x00\xa5\x6b\x6f\x82\xfd\x7f\x4a\xe8\ -\xc2\x9f\x22\x75\xeb\xa7\xc6\x29\x8a\x89\x7c\xab\x96\xec\x39\x5d\ -\x49\x56\xed\x17\xf8\xff\x6d\x22\x81\xf2\x71\x71\xa6\x5f\x51\x14\ -\xe3\xd4\xb4\x62\x71\x38\x46\xe6\x5d\x80\xcb\x13\x39\x4a\xe9\x70\ -\x94\x5b\x16\x43\xcb\x77\x88\x03\x1f\x20\xf6\xfd\x1d\x71\x74\x5d\ -\xc7\x51\x06\x6f\x0e\xe1\xbe\xb7\x12\xbc\xf0\x3f\x09\xf7\xbc\x0e\ -\x05\x61\x4b\xba\xc9\x02\xa8\x11\x00\x08\x39\x4c\xf3\xe0\x27\x69\ -\x1e\x3c\x59\x1d\x15\x18\xac\xab\x66\x01\x0c\x79\x65\x40\x8a\xfc\ -\xca\xa4\xa8\x04\xae\xbd\x1d\x6c\xdb\xca\x63\xe4\xd2\xbf\x44\x4c\ -\xde\xbc\x1e\x28\x83\x1e\x44\x19\xf4\x20\x34\x1f\xc7\x73\x70\x31\ -\x1c\x5e\x8d\xa8\x5e\x0f\x4d\xc7\xd2\xbe\x4e\xca\xf0\xe6\x20\x17\ -\x5d\x8e\x54\x3c\x0c\xa9\x64\x18\xe1\x9e\xd7\x21\xfb\xf2\x0d\xe3\ -\x79\xfb\xc9\x22\xab\x5f\x00\xb9\x4b\x5f\x42\x83\xa6\xa0\xc8\x0a\ -\x42\xa8\x7d\x04\xed\xfe\x35\xf2\x85\x10\x6c\xdd\xba\x75\x37\xea\ -\x94\x6f\x08\x08\xd3\x6e\x0a\x60\x44\xa2\x79\x7b\x93\x58\xea\x8b\ -\x3e\xb6\xe5\x76\x2d\x43\x19\xf4\x10\x0c\x7a\x48\xbd\xf3\xfa\xfd\ -\x88\x63\xeb\xe1\xd8\x7a\xc4\x89\x7f\x41\xfd\x7e\xf0\xbb\xf3\x4d\ -\x00\xe5\x9c\x7e\xc8\x25\x57\x23\x97\x0c\x43\x2a\xbe\x1a\xa9\x60\ -\x08\x8a\xc7\x97\x70\xe6\x4f\x8f\x57\x4f\x6c\x66\x0a\xc1\xc8\x9b\ -\x51\x21\x84\xf0\x20\x04\xfa\x86\x93\x86\x86\x06\xea\xea\xea\xfc\ -\x3f\xfe\xf1\x8f\xe7\xa1\xce\xfb\x07\x80\x20\x69\x28\x41\xdb\x4d\ -\x04\xb5\x25\xf2\xfb\xa3\xe4\xf7\x87\x81\x3f\x8f\xd6\x21\x70\x4a\ -\x55\x84\xfa\x7d\xd0\x78\x08\x11\xe9\xe5\x13\x3c\x1d\xed\xf5\x0b\ -\x01\xb9\x3d\x50\x72\x8b\x50\x72\x0a\x55\x2b\x93\x5b\x84\x92\x53\ -\x04\x79\x3d\x90\x73\x4b\x50\x72\x0a\xd5\x39\x7a\x87\x73\xfe\x46\ -\x59\x73\x1a\x80\xa2\x4f\xe9\xca\x31\x6e\xc2\x08\xe1\xf1\xe0\x11\ -\x82\x60\x30\x48\x7d\x7d\x3d\x7e\xbf\x5f\x7a\xf4\xd1\x47\x9f\x3d\ -\x74\xe8\x50\x2d\xd0\x04\x34\xa3\x2a\x41\x08\xd5\x1d\x44\x74\x2d\ -\xf9\x50\xc1\xfd\xff\x0c\xb2\x4d\x70\xd1\xfc\xa7\x93\x96\x73\x2e\ -\x94\xa8\xf3\x03\x76\xf5\xb1\x22\xca\x78\xee\xf4\xd0\x49\x35\x90\ -\x1f\xab\x34\x51\xc2\x41\x51\xb4\xc5\x1f\x05\x45\x89\xca\xa9\x2d\ -\xde\x83\xd7\xeb\xc1\xef\xf7\xd3\xd2\xd2\x42\x30\x18\x54\x5e\x78\ -\xe1\x85\xd9\x5b\xb6\x6c\x39\x04\x34\x46\x8e\x26\xc0\x4f\x8c\x02\ -\x38\x41\xe6\xde\x0e\xc6\xbe\x2f\xe0\xa6\xf9\x77\x0b\x76\x43\xb2\ -\x74\xc8\xd7\x0e\x49\x92\x4c\x71\xd1\x73\x25\x4a\xba\xa2\xa0\xc8\ -\x32\x92\x2c\x23\x4b\x92\x2e\x07\xea\xfe\x46\x9f\xcf\x47\x20\xe0\ -\x27\x18\x0c\x12\x0c\x06\x99\x3f\x7f\xfe\xdb\xff\xf8\xc7\x3f\xb6\ -\x03\x0d\xa8\x4b\xbf\xb1\x0a\x20\xe3\x60\x19\x58\x43\x46\xbe\x0f\ -\xd0\x56\x70\xc5\x32\x18\xe0\xb4\xd5\xdb\xa5\x6b\x44\x87\xc3\x61\ -\x24\x49\x22\x14\x0e\x13\x0e\x85\x91\x65\x09\x29\x42\xae\x2c\x2b\ -\xc8\x8a\xac\x92\x2e\x49\x84\xc3\x12\x8a\x22\x13\x96\x24\x64\x49\ -\x26\x2b\xcb\x4b\x7e\x7e\x3e\x79\x79\x79\xc8\xb2\x4c\x20\x10\x20\ -\x18\x0c\x12\x08\x04\xf8\xe4\x93\x4f\x96\xfc\xe1\x0f\x7f\x58\x87\ -\x4a\x7a\x3d\xaa\x12\x34\xa2\xf6\x03\x82\xa4\xd8\xfa\xa1\xad\xa6\ -\x82\x33\x64\xfe\xdd\x82\x91\x58\x2d\x6c\x95\xee\xa4\xe5\x87\xc3\ -\x61\x9d\xb0\x60\x30\x48\x28\x14\x22\x18\x0c\xa9\x0a\xa0\xc8\x51\ -\x45\x90\x54\xa5\x08\x4b\x12\x8a\xac\x50\x58\x58\x40\x49\xcf\x9e\ -\x74\xe9\xd2\x85\x50\x28\xa4\xe7\xd7\x8e\x8a\x8a\x8a\x4d\xd3\xa6\ -\x4d\x5b\x84\x4a\xf8\x29\xa2\x0a\xa0\xf9\x7f\xbd\x03\xe8\xb4\xf5\ -\x43\x5b\x4d\x05\x1b\xd0\xde\xe6\x3f\x95\x9d\x3d\x89\x5a\xbc\x55\ -\x9c\xda\xa2\xc3\x04\x02\x01\x9a\x9b\x9b\x69\x6e\x6e\xc6\xef\xf7\ -\x13\x08\x04\x0c\x64\x47\x5d\x43\x41\x41\x01\x7d\xcf\x3b\x8f\x5e\ -\x3d\x7b\x22\x84\x30\xb5\x76\xe3\xef\xbe\x7d\xfb\x76\x3d\xf1\xc4\ -\x13\x6f\x10\x6d\xf9\xb1\xe4\xeb\xbe\x3f\x15\xf2\x21\x83\x1f\x89\ -\x72\x34\x2d\xdc\x9a\x6b\xb5\x62\x9b\x98\x11\x89\x5a\xbf\x53\x25\ -\x30\xfa\xfc\x50\x28\x84\xdf\xef\xa7\xa9\xa9\x89\xc6\xc6\x46\x02\ -\xc1\x20\x1e\x21\xf0\xf9\x7c\x74\xe9\xd2\x85\x82\x82\x02\x4a\x4b\ -\x4b\x29\x2d\x2d\x45\x51\x14\x5b\xd2\xb5\xdf\xaa\xaa\xaa\xca\x49\ -\x93\x26\xcd\xf5\xfb\xfd\x1a\xf1\xa7\x50\xc9\xd7\xfc\xbe\x6e\xfa\ -\x53\x25\x1f\x32\xf0\x85\x90\xce\x0a\x2b\xe2\x8d\xe7\x4e\x47\x04\ -\x9a\x0b\x68\x69\x69\xc1\xef\x0f\x70\xdb\x6d\xd6\x5f\x23\xd1\xe4\ -\x12\x1d\xb5\xb5\xb5\x35\x53\xa6\x4c\x79\xb1\xae\xae\xee\x04\x66\ -\xf2\x4f\x63\xf6\xfb\x72\x3a\xe4\x43\xa6\xf6\x04\xba\xa4\x0c\x6e\ -\xbb\x86\xb8\xa5\x67\x0b\x5f\x6f\x3c\x77\xa4\x04\x91\xb0\xe6\xdb\ -\x35\x2b\x10\x08\x04\x6d\x1f\x43\x6c\x3f\xc1\xea\xb7\xbe\xbe\xbe\ -\xe1\x99\x67\x9e\x79\xb1\xb2\xb2\xb2\x9a\x28\xf9\xf5\xa8\xe4\xa7\ -\x35\xe4\xb3\x42\x9b\x6c\x0a\x4d\x9c\x9c\x59\x92\x93\xc1\xae\xc3\ -\x67\x77\x1e\x17\x36\x8c\xef\x25\xad\x67\x2f\x49\x84\xc3\x21\x7c\ -\x16\xff\x43\xe8\xa4\xe5\x9f\x3e\x7d\xba\x65\xe6\xcc\x99\x2f\x55\ -\x54\x54\x1c\x22\x9e\xfc\x56\x75\xfa\x62\x91\x79\x05\x30\xc0\x2d\ -\xb2\xdd\x56\x1a\xab\xe7\x97\xac\x5f\x60\x3c\xd7\x47\x02\x92\xaa\ -\x00\x52\x38\x4c\x28\x1c\x26\x27\x3b\xc7\x54\xa6\x24\x49\x3a\xc9\ -\x76\xad\xbf\xb9\xb9\x39\x3c\x6f\xde\xbc\x57\xd7\xae\x5d\xbb\x07\ -\x33\xf9\x8d\xa8\xe4\x9b\xa6\x7c\x5b\x43\x3e\x64\xe2\xe5\xd0\x04\ -\xe7\xed\x09\x27\xe6\xdf\xae\x95\xdb\x9d\x1b\x5d\x80\x66\xfe\x8d\ -\xbf\x05\x05\xe7\xea\xe5\x4b\x92\x94\xb4\xc3\xe7\xf7\xfb\xe5\x05\ -\x0b\x16\xbc\xf1\xe1\x87\x1f\x6e\xc3\x9a\x7c\xad\xc7\xef\x0a\xf9\ -\xd0\xc6\x16\x20\x15\xb4\xd5\xf8\x3f\x59\x5a\x52\x25\x90\xcd\x73\ -\x01\xe1\xc8\xf8\x5e\x0a\x87\x29\x2d\x53\xb7\xa3\x19\x5b\x7e\xa2\ -\x63\xf1\xe2\xc5\x7f\x7d\xeb\xad\xb7\x36\x10\x9d\xe5\x33\xce\xf4\ -\xb9\x66\xf6\x8d\xe8\xb0\x0a\x90\x0e\xd2\x51\x9a\x44\xe6\xdf\xca\ -\x0d\xc4\xb6\x7e\x6d\x41\x47\x55\x00\x95\xf8\x70\x38\x8c\x2c\xcb\ -\x94\x95\x96\xea\xe4\x27\x6b\xfd\x6b\xd6\xac\x59\xf2\xe2\x8b\x2f\ -\xae\x20\xda\xf2\x8d\xc3\x3d\x8d\xfc\xb4\x87\x7b\x76\xc8\xd8\x07\ -\x22\x3a\x13\xec\x88\xb6\x8b\x53\xa2\x09\x3a\xf9\x92\x24\x23\x49\ -\x72\xa4\x03\x18\xa6\xb0\x50\x7d\xe9\xd5\x49\xcb\xdf\xb6\x6d\xdb\ -\xba\x69\xd3\xa6\xfd\x1d\x95\x70\x3b\xb3\xef\x3a\xf9\x90\x09\x0b\ -\xd0\x01\x5e\xe5\x4a\x96\xc7\xae\xd5\x3b\x22\x5f\x89\x2e\xdb\x46\ -\x4d\xbf\x3a\xbf\x1f\x96\xd4\xd6\x1f\x0e\x87\x39\xef\xbc\xf3\x92\ -\xb6\xfa\x40\x20\xc0\xee\xdd\xbb\xb7\x4c\x9e\x3c\xf9\x6d\xcc\xe4\ -\x1b\x27\x7a\x5c\xf5\xf9\xb1\x68\x57\x17\xd0\x9e\x2b\x80\x4e\x9e\ -\xa5\x25\xf9\xc4\x76\x18\x89\xce\xf1\x4b\x12\xe1\x50\x08\x49\x92\ -\xe9\xd3\xa7\x4f\x52\xf2\xb7\x6d\xdb\xb6\x6e\xc2\x84\x09\x73\x25\ -\x49\x32\x9a\x7d\xab\xb1\x7e\xda\x13\x3d\xc9\x90\x59\x05\xe8\xe0\ -\xae\xc1\x89\xff\x4f\xf6\xdc\x15\x45\x56\x5d\x81\x24\x11\x0a\x85\ -\x09\x85\xc2\x14\x97\x14\xe3\xf1\x78\x12\x9a\xfd\x35\x6b\xd6\x2c\ -\x79\xec\xb1\xc7\xde\x92\x24\xe9\x14\x50\x47\x94\xfc\xd8\x29\xde\ -\x8c\x91\x0f\xed\xb0\x18\xd4\x91\x91\xca\xa8\x40\x6d\xf9\xd1\x5f\ -\x49\x96\x91\x64\x09\x49\x0a\xd3\xab\x67\x4f\xdb\x56\x1f\x08\x04\ -\xe4\xc5\x8b\x17\xff\x75\xd6\xac\x59\xcb\x89\x9a\x7d\xd7\xa7\x78\ -\x9d\xa2\xcd\x14\xa0\xbd\x37\x7c\xd8\xc1\xe9\x28\xc0\x22\x67\xa4\ -\x2f\x20\x47\x4c\x7f\x98\x70\x28\x84\xd7\x9b\xc5\xb9\xe7\x9e\x6b\ -\xd9\xea\x5b\x5a\x5a\xc2\x0b\x16\x2c\x78\xe3\x8d\x37\xde\x58\x4f\ -\x74\x98\x67\xec\xed\xb7\x29\xf9\x70\x06\x59\x80\x4c\x2a\x58\x22\ -\x85\x88\xae\x03\xa8\x93\x3f\x25\x25\xc5\xa6\xf5\x7c\xed\xb7\xb1\ -\xb1\xb1\x65\xee\xdc\xb9\xf3\x16\x2d\x5a\xb4\x0d\xfb\x0e\x9f\x4e\ -\x7e\xc6\x6e\x26\x06\x67\x8c\x02\xb4\x15\xa2\xe3\x7f\xd4\xad\x5d\ -\xa8\x2e\x40\x8e\x6c\xeb\x2a\x28\x28\x88\x23\xbf\xae\xae\xae\x61\ -\xe6\xcc\x99\xb3\xd7\xac\x59\xf3\x0d\xf1\x33\x7c\xb1\xfb\xf9\xda\ -\xa4\xe5\x6b\xc8\xa8\x02\x74\x4c\xa3\x6f\x8d\x54\x9f\xb9\x71\xe3\ -\xa7\x2c\xa9\xe4\x77\xeb\xd6\xcd\xb4\xb1\x23\x18\x0c\x52\x53\x53\ -\x53\xf3\xf4\xd3\x4f\xcf\xb2\x58\xd8\xb1\x1a\xe7\xb7\x29\xf9\x70\ -\xd6\x02\xb4\x0a\x46\xae\x84\x10\xe4\x77\xef\x6e\x6a\xfd\x55\x55\ -\x55\x95\x8f\x3f\xfe\xf8\xac\xca\xca\xca\x63\x44\x7d\xbe\xdd\xdc\ -\x7e\x9b\x93\x0f\x67\x15\xc0\x15\x08\x8f\x20\x2f\x37\xd7\xd4\xfa\ -\xf7\xee\xdd\xbb\xeb\xd1\x47\x1f\x7d\x39\xb2\x99\x43\x6b\xf5\x76\ -\x4b\xba\xed\x42\x3e\x64\x58\x01\x14\x3a\x8f\x1b\x88\x79\xdf\x2e\ -\xa1\x1c\x8a\xb6\x67\x3f\xfa\xb6\x4e\x76\x76\xb6\x4e\xfe\xb6\x6d\ -\xdb\x3e\x9f\x34\x69\xd2\xeb\x7e\xbf\x5f\x23\x5e\xeb\xe9\x1b\x77\ -\xf0\x66\x64\x6e\x3f\x55\x9c\x51\x8b\x41\x99\x86\xfe\x7e\x9e\x21\ -\xec\x11\x82\x2c\xaf\x57\xf7\xf9\x2b\x56\xac\xf8\xc7\x83\x0f\x3e\ -\xf8\xaa\xdf\xef\x3f\x09\x68\x87\xa6\x00\x19\x9f\xdb\x4f\x15\x67\ -\x8c\x0b\x50\x94\xf4\xbe\x9b\x93\xa8\xe5\x1b\x5f\xc4\xb4\x92\xd1\ -\xde\xdc\x89\x90\xaf\xbc\xf3\xce\x3b\x6f\xce\x9d\x3b\x77\x0d\xe6\ -\xe5\x5c\xe3\x18\xdf\xf4\x12\x67\x7b\x93\x0f\xe9\x29\x80\x62\x38\ -\x1c\x8f\x57\xd3\x25\xa8\x2d\x91\x8c\xf0\x88\x90\x4e\x3c\x42\x21\ -\x14\x0a\x12\x08\x04\xe4\xe7\x9f\x7f\xfe\x7f\x16\x2d\x5a\xf4\x2f\ -\xa2\x63\xfc\x06\xa2\xad\x5e\x23\x5f\x1b\xe3\x77\x08\xf2\x21\x75\ -\x05\x30\x12\x2f\x45\x0e\xbc\x5e\x2f\xb2\xd4\x41\xde\xcf\x4f\x01\ -\x4e\xfc\x7e\xac\x52\x78\x84\x40\x16\x02\x8f\x47\x00\x1e\x4e\x9f\ -\x3e\x1d\x7c\xe4\x91\x47\xa6\x6d\xda\xb4\xe9\x5b\xcc\x2d\xff\x34\ -\xd1\xb5\x7c\xd3\x04\x4f\x47\x21\x1f\x52\x53\x80\x58\xf2\x43\xa8\ -\x37\x46\xb6\xcf\x07\x3e\x9f\xfb\xb5\xcb\x10\xb4\x8e\x5b\x6b\x51\ -\x51\x51\xb1\xeb\xce\x3b\xef\x7c\xe5\xc0\x81\x03\x35\x44\xc9\x37\ -\xce\xe9\xfb\x89\x76\xf6\x3a\x1c\xf9\x40\x4a\xdf\x0a\xf6\x02\x39\ -\x40\x37\xe0\x5c\xa0\x30\xf2\xdb\x35\x12\x9f\x45\xe7\xe9\xf4\xb7\ -\x06\xc6\x46\x10\x40\x25\xfa\x34\xd1\x5e\xbe\xe6\xef\x3b\xc4\x30\ -\x2f\x19\x9c\x5a\x00\xad\xf5\x4b\xa8\xad\xbe\x05\xf5\x66\x41\xd5\ -\xf2\x6c\x54\x05\x81\x33\x5f\x09\x34\x05\x08\x13\x7d\x16\xcd\x44\ -\xc7\xf7\xc6\x39\xfd\x0e\xd1\xd3\x4f\x84\xa4\x0a\xa0\x28\x8a\x12\ -\xb1\x02\xda\x8d\x87\x50\x6f\x14\xd4\x1b\xcd\x41\x25\xdf\xc3\x99\ -\x4f\x3e\x58\xbb\x41\x7f\xe4\x30\x4d\xeb\xd2\xc1\xc9\x07\x07\x2e\ -\x40\x17\x14\xc2\x83\x4a\xb2\x17\xf5\xd3\xf1\xd9\x91\xdf\x2c\xcc\ -\xe4\x9f\xc9\x4a\xa0\x18\x7e\x8d\x4a\xa0\x0d\xef\xf4\xc9\x1d\x3a\ -\x01\xf9\x90\x7a\x27\x50\x36\x9c\x6b\x3e\x50\x23\xff\x4c\x26\x3e\ -\x16\xc6\x0e\xb1\x76\xe8\xad\x1e\x3a\x5e\x67\xcf\x0e\x8e\x2d\x00\ -\x98\x3a\x84\xc6\x03\xfe\x77\x91\xaf\xc1\x68\x0d\xf4\xa3\xb3\x10\ -\xaf\x21\x25\x05\x00\x5d\x09\xf4\xa0\xbb\xd5\xe9\x94\xe8\x54\x2d\ -\x3e\x16\x29\x2b\x80\x65\x21\x1d\x7d\x8a\x2f\x03\xe8\xac\x84\xc7\ -\xe2\xff\x03\x8b\x04\xf0\x49\x6a\x2c\xa5\x0d\x00\x00\x00\x00\x49\ -\x45\x4e\x44\xae\x42\x60\x82\ +\x00\x00\x09\x1b\x49\x44\x41\x54\x78\xda\xed\x9d\x7f\x8c\x14\x67\ +\x19\xc7\x3f\xef\xec\xec\x71\xcb\x1d\x72\x77\xd8\xbb\x63\x0f\x7a\ +\xb6\x0d\x28\x98\x6a\xea\x4a\x8c\xa5\x35\xa9\x56\x62\xa2\x89\x11\ +\x88\xd4\xc6\x98\x02\x96\x06\x42\x4d\xda\x44\x8b\xda\x54\x8d\x36\ +\xd5\xc4\x68\x62\xa9\x50\x51\x92\xca\x1f\x4d\x2d\xa8\x69\x54\x1a\ +\xff\xb0\x92\xa0\xa9\xe0\x24\x10\x8b\x28\x1c\xe5\xc7\x71\x2c\x5c\ +\xe1\xe0\x7e\x71\x77\xbb\x33\xf3\xfa\x47\xef\x70\x6f\xd9\x99\xdb\ +\xe3\x6e\x77\xe7\xc7\xf3\x4d\x36\x7b\xb7\xb7\xb7\x33\xfb\x3c\x9f\ +\xf7\x79\x9e\xf7\xc7\xcc\x0b\x22\x91\x48\x24\x12\x89\x44\x22\x91\ +\x48\x24\x12\x89\x44\x22\x91\x28\xfa\x52\x41\x38\x89\x4c\x26\xd3\ +\x01\xac\x02\x3a\x81\xf9\x31\xb2\xff\x75\xe0\x3c\xf0\x57\xcb\xb2\ +\x8e\xc7\x0e\x80\x4c\x26\xb3\x0c\xf8\x21\xf0\x39\xc0\x88\x79\x63\ +\x3c\x04\x7c\xc3\xb2\xac\x03\xd5\x3c\x68\xa2\x86\xce\x5f\x03\xfc\ +\x09\xb8\x3b\x28\x91\xa8\xc6\xea\x00\xbe\x92\x4e\xa7\x73\xd9\x6c\ +\xf6\x60\xa4\x01\xc8\x64\x32\x0f\x00\xbf\x07\xea\xc5\xef\x37\x45\ +\xe4\x07\xd3\xe9\xf4\xe5\x6c\x36\x7b\x38\x92\x29\x20\x93\xc9\xa4\ +\x80\x13\xc0\x22\xf1\xb7\xa7\xc6\x80\xe5\x96\x65\xbd\x5d\xe9\x03\ +\xd5\x22\xef\x3e\x2a\xce\x9f\x52\x73\x80\x6f\x56\xe3\x40\xb5\x00\ +\x60\xad\xf8\xb7\x2c\x7d\x21\x93\xc9\x24\xa2\x08\xc0\x3d\xe2\xdb\ +\xb2\xb4\x60\xbc\x5b\x1c\x1d\x00\x32\x99\x4c\x03\xd0\x28\xbe\x2d\ +\x5b\x6d\x51\x8b\x00\x49\xf1\x69\xb0\xec\x65\x88\x8d\xe3\x2d\x33\ +\x48\x27\x93\x4a\xa5\xe8\xec\x2c\x2f\xed\x29\xf5\x6e\x0f\xd6\x30\ +\x0c\x94\x52\x68\xad\x27\x3d\x82\xae\x91\x91\x11\xce\x9e\x3d\x2b\ +\x00\x14\x6a\xc9\x92\x25\xec\xdc\xb9\x33\x16\x2d\xef\xe8\xd1\xa3\ +\x6c\xde\xbc\x59\x00\x98\x89\x26\xa2\x40\xb1\xc2\x10\x01\x24\x05\ +\xcc\x82\xe3\x0b\x01\x98\x48\x03\x85\x3f\x0b\x08\x11\x04\x40\x29\ +\x35\x09\x80\x62\x08\x0a\x23\x80\x80\x10\x31\x00\x26\x1c\x5e\x0c\ +\x81\xd7\x7b\x0b\x1d\x2f\x10\x44\x2c\x02\x78\x39\xbe\x54\x6a\x70\ +\x5d\x57\x20\x08\x3b\x00\xa5\x5a\xbf\x57\x31\x58\x98\x02\x26\xba\ +\x8a\x5a\x6b\x5c\xd7\x15\x08\x8a\x64\x44\xcd\xf9\xa5\x5e\x9b\xf8\ +\x3f\xc3\x30\x6e\x8c\x1b\x88\x42\x12\x01\xa6\xeb\x7c\xbf\x82\x50\ +\xba\x8b\x21\x03\xa0\xd8\xf9\xb7\xd2\x72\x6f\x14\x83\xae\x83\x32\ +\x12\x32\x6e\x10\x16\x00\xa6\x72\xfe\x74\x60\x50\x4a\xa1\xc7\x9d\ +\x3f\xf1\x59\xa5\x86\x8d\xe3\x08\x82\x19\x34\xa7\xfb\xf5\xfb\x8b\ +\x5b\xed\xb4\x21\x28\x70\xf0\x74\x41\x88\xea\xa8\x63\xa0\x00\x30\ +\x0c\xa3\xac\xae\xde\xad\x16\x71\xc5\x10\x14\x7e\x56\x21\x0c\x85\ +\xf5\xc3\x74\x8e\x15\x46\x18\x02\x1d\x01\xbc\x46\xfa\x66\x7a\x0c\ +\x2f\x08\x8a\x8b\x47\xaf\x88\x54\x1c\x49\xc2\x9c\x46\x02\x19\x01\ +\x26\x0c\xfb\xef\x1e\x87\xbd\x87\xf2\x8c\xd9\x35\x34\xaa\xc6\x7b\ +\xed\xb4\x9e\x78\xd2\x93\x5e\x9b\xf4\x3b\x30\xc7\x54\xac\x59\x61\ +\xb2\x2c\x6d\x08\x00\x7e\x2d\xb3\x30\x05\x1c\xef\x71\xf8\xea\xaf\ +\x46\x22\x53\x6c\xfd\xf9\x2d\x87\x17\xd7\xcf\x09\x1c\x04\x81\x43\ +\x72\x22\xec\xbe\x7a\x28\x1f\xb9\x8a\x7b\xdf\x61\x3b\x70\xe7\x14\ +\x18\x00\x8a\x73\x67\x4d\xc3\x7e\x85\x14\xc4\xef\x14\xa8\x08\x20\ +\x63\xf5\x31\x2f\x02\x67\x6b\xd6\xce\x9d\xe2\xdf\x0d\x99\x0a\x08\ +\x36\x00\x33\x91\xe3\xc2\x86\x95\x39\x96\xb6\xe9\x92\x8e\x3f\x91\ +\x75\xd8\x75\x30\x89\x69\xca\x0a\xf5\xc0\x01\x30\x1b\xe1\xdf\xd5\ +\x70\x7b\xb3\xcb\xf2\x76\xb7\x24\x00\xa3\xa3\x36\xb9\xbe\x33\x98\ +\xb7\x2d\x05\x65\xc6\x1e\x00\x23\x88\x00\x54\xb6\x0e\x70\x41\xbb\ +\xe4\xfa\xba\xfe\xdf\x91\x17\x00\x02\x28\x5d\x31\xca\xc6\x9f\x1d\ +\x72\x57\xfe\x0b\x6e\x5e\x00\x88\x95\x0a\xeb\x0c\xed\x90\xbb\xda\ +\x05\xda\x11\x00\x82\x17\x00\x2a\x14\x02\x8a\x7b\x00\xda\x25\xd7\ +\x77\x32\xb6\xe9\x40\xae\x0d\xbc\x91\x0e\xfe\x53\xf1\x74\xa0\x02\ +\x78\x2b\x24\x01\xa0\x30\x12\xc4\x30\x1d\x08\x00\x31\x4f\x07\x02\ +\x40\x8d\xd2\x81\x00\x10\x8a\x74\xe0\xa2\xc7\xe3\x81\xd7\x23\xec\ +\x92\xa1\x30\x0f\xe5\xf3\x0e\x1f\x6d\xee\xe6\xae\xce\x85\xe0\xb3\ +\x34\xed\xd2\x35\x9b\x83\x6f\xd7\x13\xd6\x4b\x0d\x04\x80\x52\x01\ +\x40\xc3\xa7\x3e\xd4\xc8\xf7\x1f\x6e\x63\x2c\xef\x3d\x87\xdf\xd3\ +\x67\xb3\x71\x7b\x37\x24\xe7\x61\xbe\xe7\x76\x01\x20\x2a\xce\x5f\ +\xfc\xde\x3a\xbe\xb5\xb6\x95\xa1\x51\xef\xc9\x29\x17\xd8\xfa\x8b\ +\x9e\x77\x67\x1e\x73\x83\xe4\xfb\xcf\x92\x9c\xdf\x19\xba\xef\x2b\ +\x35\x40\x91\x16\x36\x27\x79\x61\x53\x1a\xc7\x67\x62\xd2\x76\x34\ +\x1b\x7e\xd6\x3d\x09\x10\x9d\x1f\x24\x7f\xcd\xff\xc6\x9e\x1a\x59\ +\x10\x12\x68\x35\x37\x9a\x6c\xdf\x94\xc6\x4c\x78\x27\x74\x57\xc3\ +\xb6\x3d\x59\x7a\xfb\xed\xa2\xbc\xaf\xd0\xf6\x08\xf6\xc0\x39\x89\ +\x00\x61\x94\x52\xf0\x93\xf5\x0b\x49\xd5\x79\x9b\xc4\x50\xf0\xec\ +\xde\x5e\x8e\x9f\x1f\xf3\x2c\xfa\xdc\xdc\x20\xf9\xfe\x33\x02\x40\ +\x98\x94\x30\x14\x2f\x6e\x5e\x44\x7b\x93\xe9\xeb\xfc\xe7\xf6\xf5\ +\x72\xf0\xf8\xd0\xd4\x75\x44\x7e\x88\xfc\xb5\xd3\x02\x40\x18\xe4\ +\xb8\xf0\xd4\xea\xdb\xe8\x68\x49\x7a\x2e\x25\xab\x33\x15\xfb\xde\ +\xec\xe7\xc0\xb1\x61\xcc\xb2\xd6\x93\x29\xb4\x7d\x1d\x7b\xa0\x5b\ +\x00\x08\xba\x9e\x5e\xdb\xca\x7d\xcb\x1a\x7c\xdf\xf3\xbb\x7f\x0c\ +\xb0\xf3\xf5\x2b\xd3\xee\xeb\xbb\xb9\x81\xc0\xa7\x83\xd8\x02\x90\ +\xb3\x35\x1b\x1f\x6c\xe1\x13\x1f\x6c\xc0\x6b\x01\x52\xc2\x50\x1c\ +\x3a\x79\x9d\x9f\xef\xbf\xec\x5b\x18\x86\x39\x1d\xc4\x12\x80\xbc\ +\xa3\xf9\x6c\x66\x1e\x5f\xbc\xb7\xc9\x33\xec\x1b\x0a\xba\xb2\x63\ +\x3c\xf3\xf2\xc5\x99\x96\x97\x81\x4e\x07\xf1\x03\x40\xc3\xfd\xcb\ +\x1b\x79\x6a\x75\x2b\xb6\xcf\xfa\xf1\x2b\x83\x0e\x8f\xed\x38\x4f\ +\x62\x96\xd6\x90\xbb\xb9\x01\xec\xc1\xf3\x02\x40\x8d\x7d\x4f\x6b\ +\x93\xc9\xb7\xd7\xb6\x32\x96\xf7\x76\xbe\xd6\xb0\x75\x57\x0f\x49\ +\x33\xfa\x17\x10\xc4\x6a\x28\x58\x6b\xe8\x58\x90\xc4\x6f\xd1\x71\ +\xde\xd6\xac\xdf\x7e\x9e\xab\x43\x0e\x71\xb8\x97\x54\xec\x52\x80\ +\x9f\xf3\xeb\xeb\x14\x4f\xbf\x7c\x89\xab\x43\x36\x71\xb9\x91\x58\ +\xec\x00\xf0\x73\xec\x58\x5e\xb3\xe5\x33\x2d\xbe\xb5\x81\x00\x10\ +\x72\xe7\x5f\xee\xb7\x71\x3c\x1c\xac\x35\xdc\xd1\x5a\xc7\x8e\xc7\ +\x16\x49\x04\x88\x24\x00\x40\xf7\xe5\x3c\x3f\x7d\xed\x1d\xea\x3d\ +\xc6\xfc\x5d\x0d\x77\xb6\xd5\xf1\xdd\x75\xed\x8c\xe4\x5c\x01\xa0\ +\x76\xce\x52\x15\xa3\xe0\x0f\xff\x1c\xe4\xf9\x3f\xbe\xe3\x3b\xb8\ +\x73\xef\x07\xe6\xf2\xbd\x87\xda\x7d\xa7\x85\x05\x80\x90\x6a\x4e\ +\x52\xf1\x9b\xbf\xf5\xf3\xda\xa1\x01\xcf\x4b\xc5\x73\xb6\xe6\x81\ +\xbb\x1b\x79\xe4\x93\xcd\x44\xb9\x24\x88\xed\x50\x70\x9d\xa9\x78\ +\x61\xff\x65\xde\xf8\xd7\x90\xe7\x60\x8f\xed\x68\xbe\x74\x7f\x13\ +\x0f\xdd\xd7\xe4\x59\x37\x08\x00\x95\x4c\xd8\x55\xd0\x0f\xf6\xf6\ +\xf2\xc6\x5b\x43\x9e\x45\x9f\xd6\xb0\xe9\xd3\x2d\xac\xfd\x78\x13\ +\x51\xbc\x79\x49\xa0\x00\x98\x6a\x13\x88\x4a\x45\x82\x1f\xfd\xb6\ +\x97\x33\xbd\x39\xcf\x74\x30\x66\x6b\x1e\x5d\xd5\xc2\x47\xee\x4a\ +\xe1\xba\x02\x40\xc5\x54\xcb\xfb\x03\x3d\xbe\xeb\x02\xa7\x7b\x73\ +\x3e\xe7\x06\xcf\x3e\xdc\xce\xc7\x96\xce\x15\x00\x2a\x1d\x01\x6a\ +\x21\xc7\xd5\x3c\xb9\x3b\xcb\x85\x3e\xef\x2b\x82\x34\xf0\xcc\xba\ +\x56\x96\x2f\xae\x8f\x4c\x3a\x90\x08\x50\xa0\xd1\xbc\xcb\x13\xbb\ +\x2f\x70\x7d\xcc\xf5\x2c\x41\x0c\xa5\x78\xee\xcb\xed\xb4\x35\x99\ +\x91\x80\x20\x90\x45\x60\x2d\x41\x18\x1c\x71\x59\xff\x7c\x37\xc3\ +\x63\xde\xc9\xde\x4c\x28\x76\x6d\x59\x44\x5b\x93\x29\x00\x54\x8e\ +\x82\x5a\xa5\x21\x18\x1a\x75\xd9\xb6\x27\xeb\xdb\xc2\xcd\x84\xe2\ +\xc7\x8f\xa4\x69\x98\x63\x84\xfa\x1a\x41\x59\x15\xec\xa1\xae\x8b\ +\x39\xb6\xee\xea\xf1\xed\xff\x2f\x98\x97\x60\xf7\xe3\x8b\x99\x5b\ +\x67\x08\x00\xb3\x1f\x00\x6e\xb5\x5d\x29\x52\x49\x97\xc6\x7a\xe3\ +\xe6\x47\x2a\xe1\xbb\xee\xbf\x78\x18\xe2\xf4\xa5\x1c\xdb\xf6\x5c\ +\x64\x5e\xca\x28\xfd\x79\xf5\x06\x0b\x9b\x4d\x5e\xfa\xda\x62\x92\ +\x65\xac\x19\x0c\xe2\xfc\x52\xe4\x16\x84\x24\x13\x9a\x27\x5e\x49\ +\x32\xd2\x77\x0a\xed\xe4\x6e\x32\xbb\x99\xa0\x7c\x08\x14\x1c\x3b\ +\x37\xca\x3d\x4f\x9e\x9c\xf2\x7d\x8d\xf5\xe1\x8c\x02\x91\x5c\x11\ +\x94\xaa\x4f\x92\x4a\xbf\x9f\x7c\xdf\x09\xb4\x3b\xb3\x3b\x74\x2b\ +\x05\xf3\x52\xd1\xcd\x94\x11\xae\x01\x14\xc9\xe6\x25\xa8\x84\xdc\ +\x12\x36\xbe\x45\xa0\x32\x48\xce\xbf\x13\x65\xc8\x55\xf0\xa1\x00\ +\xa0\x70\x24\xb0\x3e\x39\x4b\x25\x93\x61\x92\x6c\x59\x1a\x08\x08\ +\x82\xb8\xca\x38\xb0\x00\xac\x59\x31\x9b\x0e\x1b\x4f\x07\x46\x6d\ +\xd3\xc1\xea\x95\x6d\x52\x04\x96\x03\x80\x52\x8a\xe5\x1d\x26\xbf\ +\xdc\x68\xb0\xf7\x70\x9e\xb1\xd9\xda\x69\xc5\x5d\x8a\x3d\x7c\xb1\ +\x3a\x5f\xa6\x60\x14\x29\x69\x2a\x56\xaf\x6c\xe3\xc3\x77\x34\x04\ +\x6e\x43\x8c\x40\x6f\x1b\xb7\xac\x23\xc1\x77\x16\x27\x3d\xff\x7e\ +\x6b\x9a\x3f\x73\xc7\x4e\x75\x1e\x5a\xa3\xb5\x03\x2a\x31\x69\x63\ +\x4a\x37\x80\x73\xc9\x32\x12\x78\x2b\xfd\x42\x5f\xdf\x6b\xb4\x76\ +\x27\x45\x80\xe2\x9d\x49\x05\x00\x1f\xe3\xf9\xbd\x16\xf4\xfd\x84\ +\x26\x1c\x9d\xb7\x1d\x30\xcc\x40\x3b\x3e\xd0\x00\xf8\x19\xae\x5a\ +\x06\x2d\xde\xbc\xc2\xef\xb9\xf0\x7c\x95\x52\x98\xa6\xe9\xf9\x77\ +\x29\x02\xa7\x11\x01\x8a\xb7\x68\xf5\x7a\xbd\x78\x9b\xd7\x89\xdf\ +\x67\x6a\xf4\x72\x21\x98\x4e\x44\x13\x00\xca\x34\x58\xb9\x3b\x78\ +\x7b\x39\xa3\x56\xc6\x2f\x6c\xed\x41\x6f\xfd\x81\x03\x60\x3a\x2d\ +\x48\x05\xe8\xda\x2d\x5d\xa2\xe0\xab\xce\xfe\x47\x11\x07\xa0\x94\ +\x71\x55\xc0\x2e\xda\x2b\x15\xb5\xc2\xe2\xfc\x50\x00\xe0\x05\x41\ +\xd0\x8c\x1b\xd6\x2d\xe4\x43\x33\x4b\xe2\x65\xe0\xa0\x44\x84\xb0\ +\x6e\x79\x1b\xfa\x69\x32\xd9\x6b\x38\x42\x00\x0c\x0f\x0f\x73\xe4\ +\xc8\x91\x58\x18\xbe\xab\xab\x4b\x00\x28\xd6\xa9\x53\xa7\xd8\xb2\ +\x65\x8b\x34\xcb\x2a\x4a\xe6\x02\x04\x00\x91\x00\x20\x12\x00\x44\ +\x02\x80\x48\x00\x10\x09\x00\x22\x01\xa0\x82\x92\x61\xbb\x80\xd9\ +\xab\xda\x00\x0c\x02\xb6\xf8\xb5\x6c\x5d\x8b\x14\x00\x96\x65\xb9\ +\xc0\x39\xf1\x6b\x59\x72\xaa\x61\xab\x5a\xd4\x00\xfb\xc5\xb7\x65\ +\xe9\xef\x96\x65\xf5\x47\x11\x80\x1d\xe3\x74\x8b\xfc\xb5\x3d\x92\ +\xbd\x00\xcb\xb2\x8e\x55\xeb\xcb\x85\x58\x7f\x01\x5e\x8d\x72\x37\ +\xf0\xeb\xc0\xeb\xe2\xe7\x92\x3a\x0e\xac\xb3\x2c\xab\x2a\x3d\xa6\ +\x44\x2d\xbe\x61\x36\x9b\x75\xd3\xe9\xf4\x2b\x40\x03\xb0\xa2\x56\ +\xe7\x11\xc0\x2e\xdf\x5e\xe0\xf3\x96\x65\x5d\xad\xd6\x41\x6b\xbe\ +\x9e\x2a\x93\xc9\x2c\x01\x36\x00\xab\x80\xf7\x01\x4d\x31\x72\xfa\ +\x30\xd0\x0d\x1c\x00\x7e\x6d\x59\xd6\x9b\xd2\x0e\x44\x22\x91\x48\ +\x24\x12\x89\x44\x22\x91\x48\x24\x12\x89\x44\x15\xd1\xff\x00\x56\ +\x1c\x01\xcd\xc9\x01\xf3\xd5\x00\x00\x00\x00\x49\x45\x4e\x44\xae\ +\x42\x60\x82\ +\x00\x00\x0b\x03\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x00\x80\x00\x00\x00\x80\x08\x06\x00\x00\x00\xc3\x3e\x61\xcb\ +\x00\x00\x0a\xca\x49\x44\x41\x54\x78\xda\xed\x9d\x0b\x50\x15\xd7\ +\x19\xc7\xff\xf7\x5e\xa0\xe1\x21\x08\x68\xc1\x40\x85\x04\xb4\x89\ +\x46\x62\x44\x3b\x49\x8c\xf8\xac\x8f\xe8\x54\x89\x71\x68\x6a\x6d\ +\x14\x05\x9f\x15\x13\xa7\x9a\x4e\xd3\xaa\x89\x1a\xa3\x13\x91\x12\ +\x1b\x49\x93\xa6\x68\xd3\x44\xa5\x65\x62\x45\x4d\xad\xa9\x4a\x6c\ +\x5a\xad\xaf\xf8\x00\x8d\x1a\x6d\x7c\x2b\x88\x4f\xc4\xfb\xd8\x7e\ +\xbb\x34\xd6\xf6\x9e\xbd\x97\xc7\xdd\xdd\x7b\xd9\xef\x37\x73\x66\ +\x07\x76\xd9\xef\xec\xd9\xdf\xee\x7e\xbb\x9c\x3d\x6b\x01\x63\x6a\ +\x2c\x46\x57\x80\x31\x16\x16\xc0\xe4\xb0\x00\x26\x87\x05\x30\x39\ +\x2c\x80\xc9\x61\x01\x4c\x0e\x0b\x60\x72\x58\x00\x93\xc3\x02\x98\ +\x1c\xbf\x10\x20\x3d\x3d\x3d\x81\x26\x03\xa9\x24\x51\x89\x32\xba\ +\x3e\x3a\x72\x8b\xca\x69\x2a\x5b\x77\xef\xde\x5d\x61\x44\x05\x0c\ +\x15\x80\x76\xfc\xc3\x34\x59\x44\x65\x18\x15\xab\x91\x75\xf1\x03\ +\x76\x52\x99\x45\x22\x6c\xd3\x33\xa8\x61\x02\xd0\xce\x1f\x49\x93\ +\x62\x2a\xe1\x46\xd5\xc1\x0f\x71\x51\xf9\x19\x49\xb0\x48\xaf\x80\ +\x86\x08\x40\x3b\xbf\x2f\x4d\x3e\xa6\x12\x6c\x44\xfc\x00\x60\x1a\ +\x49\xb0\x5c\x8f\x40\xba\x0b\x40\x3b\x3f\x94\x26\x47\xa9\x24\xea\ +\x1d\x3b\x80\xa8\xa3\xd2\x89\x24\x38\xa1\x75\x20\x23\x04\x98\x4e\ +\x93\x02\xbd\xe3\x06\x20\xef\x90\x00\x39\x5a\x07\x31\x42\x80\xed\ +\x34\xe9\xa5\x77\xdc\x00\xa4\x8a\x4a\x1c\x49\xe0\xd4\x32\x88\x11\ +\x02\x5c\xa7\x49\x84\xde\x71\x03\x94\x14\xad\x2f\x03\xba\x0a\x40\ +\x3b\x5f\xce\xf8\x6f\xe8\x19\x33\xc0\x79\x92\x04\xf8\x4c\xcb\x00\ +\x7a\x0b\xd0\x9a\x26\x57\xf4\x8c\x19\xe0\xf4\x26\x01\xb6\x6b\x19\ +\x80\x05\xf0\x6f\xcc\x25\x40\x68\x68\x28\x92\x92\x92\xf4\xac\x92\ +\x61\xd4\xd6\xd6\xe2\xd4\xa9\x53\xde\x16\x33\x97\x00\x69\x69\x69\ +\x58\xb1\x62\x85\x9e\x55\x32\x8c\xfd\xfb\xf7\x63\xf2\xe4\xc9\xde\ +\x16\x63\x01\x5a\x2a\x2c\x80\x00\x16\xc0\x0d\x16\xa0\xa5\xc2\x02\ +\x08\x60\x01\xdc\x60\x01\x5a\x2a\x2c\x80\x00\x16\xc0\x0d\x16\xa0\ +\xa5\xc2\x02\x08\xd0\x54\x00\x49\xa2\xad\xf5\x8b\x2e\x90\x0a\x2c\ +\x80\x00\x4d\x04\xa8\xad\x81\xf5\xe8\x46\x58\x8f\x6f\x81\xe3\x99\ +\x77\xf4\xdc\x5c\x8f\xb0\x00\x02\x7c\x26\x00\x1d\xed\x96\xb3\x7b\ +\x60\xad\xf8\x08\xd6\x13\xdb\x60\x71\xd9\x21\xb5\xba\x1f\xf6\xd1\ +\x25\x7a\x6e\xae\x47\x58\x00\x01\xcd\x16\xa0\xf6\x0a\xac\x47\x36\ +\xc0\x56\xb1\x0e\x96\xab\x5f\xdd\xfd\xf5\x97\xb7\x42\x91\x30\xed\ +\x4f\x40\x48\x98\x9e\x9b\xeb\x11\x16\x40\x40\x93\x04\x90\x5c\xb0\ +\x9c\xd9\x5d\x7f\xb4\x7f\xb9\x9d\x8e\x76\x87\xdb\x22\x7b\xe3\x46\ +\xa1\x73\xe6\x0b\x7a\x6e\xaa\x57\x58\x00\x01\x8d\x12\xe0\x56\xd5\ +\x7f\x8f\xf6\x6b\x67\x3c\x2e\x6a\x1f\xfe\x16\xa4\x76\x8f\xea\xb9\ +\xa9\x5e\x61\x01\x04\x34\x44\x00\xcb\xd9\xbd\xb0\x1d\x5c\x0b\xcb\ +\xc9\x4f\x85\x47\xbb\x08\xfb\x88\x15\x90\xe2\xd3\xf4\xdc\x54\xaf\ +\xb0\x00\x02\x1a\x22\x40\x50\x69\x2e\xac\x17\x0e\x36\x2a\x2e\x0b\ +\xa0\x4e\x40\x09\xb0\x70\xe1\x42\x74\xad\x2a\x43\x4d\x9d\x84\xc3\ +\x97\x81\x4b\xb5\x40\x1c\xe5\x75\xd9\x5d\x80\x8e\x31\xea\x71\x59\ +\x00\x75\x02\x4a\x80\xb1\x63\xc7\xe2\xe8\xd1\xa3\x88\x8b\x8b\x43\ +\x6c\x6c\x2c\x2e\x5c\xb8\x80\xaa\xaa\x2a\x44\x86\x00\x25\x23\x80\ +\x98\xfb\xc4\x7f\xc7\x02\xa8\x13\x50\x02\xec\xdc\xb9\x13\xa9\xa9\ +\xa9\x88\x89\xa9\x3f\xdc\x5d\x2e\x17\x56\xad\x5a\x85\xa2\xa2\x22\ +\xbc\xd0\x1d\x18\xdd\x49\xfc\x77\x2c\x80\x3a\x01\x25\x80\x08\x49\ +\x92\x90\x93\x93\x83\xa4\xda\xc3\x78\x55\xe5\x75\x13\x16\x40\x9d\ +\x80\x17\x40\xa6\xb8\xb8\x18\x07\xd7\x17\xa1\xa0\xbf\x78\x3e\x0b\ +\xa0\x4e\x8b\x10\x60\xf3\xe6\xcd\xd8\x58\x34\x07\x6f\x0e\x10\xcf\ +\x67\x01\xd4\x69\x11\x02\x94\x97\x97\xa3\xb4\x60\x36\x0b\xd0\x04\ +\x58\x00\x83\x60\x01\x04\xb0\x00\x6e\xb0\x00\x0d\x81\x05\x68\x3a\ +\x2c\x80\x41\xb0\x00\x02\x58\x00\x37\x58\x80\x86\xc0\x02\x34\x1d\ +\x16\xc0\x20\x58\x00\x01\x46\x09\x60\x2b\x7f\x03\xb8\xe3\xbb\x81\ +\x4b\x9c\x8f\x4f\x01\xc2\xdb\x7a\x5c\x86\x05\x10\x60\x84\x00\x57\ +\xaf\x5e\x45\x4c\xe9\x0f\x60\xbb\xed\xbb\x71\x2b\xec\x59\xbf\x87\ +\x14\x9d\xec\x71\x19\x16\x40\x80\x11\x02\x0c\x1a\x34\x08\xe9\xad\ +\xaf\xa3\x6d\x18\x90\x1c\x05\xf4\x4c\x00\x12\x5b\x35\x2e\xbe\xc3\ +\x05\xec\xbb\x48\x3b\x95\xca\xf0\xe7\xa7\x21\xf2\xb1\xe1\x40\x88\ +\xe7\x01\x50\x59\x00\x01\x46\x08\x90\x95\x95\x85\x73\xe7\xce\xc1\ +\xe1\x70\xdc\x6d\x10\xb9\x83\xc9\xe4\xc7\xbc\xc7\x3d\x7f\x13\xf8\ +\xb0\x02\x58\x7f\x1c\xa8\xa9\x03\x22\x22\x22\xb0\x72\xe5\x4a\xc4\ +\xc7\xc7\x7b\xfd\x5b\x16\x40\x80\x51\x39\x80\xdc\xaf\xe0\xf4\xe9\ +\xd3\xd8\xb1\x63\x87\xb2\x03\xe5\xcb\xc2\x47\x99\x40\x82\xca\x99\ +\xe0\x2a\xed\xec\x5f\xef\x07\x36\x9e\x0e\xc3\x53\xbd\xfb\x22\x23\ +\x23\x43\xa9\x7b\x54\x54\xc3\x07\x3a\x67\x01\x04\xf8\xc3\x5d\xc0\ +\xc9\x93\x27\x31\x66\xcc\x18\xac\x1c\xe2\xc4\xb7\xff\xaf\x9b\x99\ +\xfc\x76\x59\xd9\x09\xe0\xbd\x63\x51\x18\x3a\x72\x34\x32\x33\x33\ +\x11\x1e\xde\xb4\xb1\xae\x59\x00\x01\xfe\x20\x80\xcc\x8f\x27\xfc\ +\x10\xcb\xbb\x9d\x40\xd0\x3d\x03\xd8\x57\xdf\x06\x5e\xfb\x87\x0d\ +\x71\x4f\x8c\x42\x76\x76\xb6\x72\xba\x6f\x0e\x2c\x80\x00\x7f\x10\ +\x40\xbe\x1c\x7c\x32\x77\x18\x9e\xbe\xbf\xe6\xee\xef\x76\x9f\xa7\ +\xa3\xfe\x5c\x2a\x26\xcd\x7c\x19\x1d\x3b\x76\xf4\x49\x5b\xb0\x00\ +\x02\xfc\x41\x80\x9b\x15\x5b\x10\xf9\xd7\x9f\xc3\x66\xad\x3f\xe5\ +\x7f\x58\x49\xc9\x5e\x6a\x16\x72\x26\x4e\x46\x48\x48\x88\xcf\xda\ +\x82\x05\x10\x60\xb4\x00\x96\x0b\x87\x10\xb4\x3e\x0f\x16\xfb\x2d\ +\xdc\x71\x02\x85\x07\xc3\x91\xf6\xfd\x97\xd1\xbb\x77\x6f\x9f\xb7\ +\x05\x0b\x20\xc0\x48\x01\x2c\xa7\xfe\x86\xa0\xbf\xfc\x42\xd9\xf9\ +\xf2\xf5\xbe\xf0\x78\x22\x9e\x9b\xb9\x18\xc9\xc9\xc9\x9a\xb4\x05\ +\x0b\x20\xc0\x10\x01\xe8\x3c\x6f\xdd\xf7\x3e\x6c\x3b\x57\xc0\x22\ +\xb9\xf0\x05\xd5\xee\x83\xeb\xdd\x31\xe5\xa5\xf9\x88\x8c\x8c\xd4\ +\xac\x2d\x58\x00\x01\xba\x0b\xe0\xa8\x83\x6d\xeb\x6b\xb0\x1d\xfb\ +\xb3\xf2\xe3\xd6\x7f\xd1\x8e\x89\x1b\x89\x9c\xa9\x79\x08\x0a\x0a\ +\xd2\xb4\x2d\x58\x00\x01\xba\x0a\x70\xe3\x22\x82\x3e\x7e\x09\xd6\ +\x4b\x95\x4a\xb2\xb7\xaa\xd2\x86\xd0\xbe\x2f\x62\xf8\x88\x4c\x5d\ +\xda\x82\x05\x10\xa0\x97\x00\x96\xf3\x07\x68\xe7\xff\x14\x96\xda\ +\x6a\xd4\x39\x80\x82\xc3\x91\xe8\x35\x7e\x81\x5c\x3f\xdd\xda\x82\ +\x05\x10\xa0\x87\x00\xd6\xca\xf5\xb0\x6d\x5f\xa2\x0c\x1b\x73\xe9\ +\x16\xb0\xfc\x64\x32\x7e\x34\x6b\x31\x12\x13\xf5\xfd\x86\x15\x0b\ +\x20\x40\x53\x01\xbe\xd9\x19\xb6\xcf\x0a\x61\x3b\xb0\xe6\xee\xef\ +\x8f\xde\x08\x43\xdb\x89\x7f\x40\x78\x2b\xfd\x3f\x56\xca\x02\x08\ +\xd0\x4c\x80\xc1\x8b\x69\xc7\xaf\x85\xf5\xcc\x2e\xb7\x79\xce\x2e\ +\xa3\xe0\xec\xa9\xff\xf0\x31\x2c\x80\x00\xad\x04\x90\x82\xc3\x94\ +\xfb\x7b\x35\x1c\xfd\xe7\xc0\xd5\x61\x90\x9e\x4d\xc1\x02\x88\xd0\ +\x4a\x80\x77\x3f\x07\xc6\x75\xa1\xeb\xbf\xca\xd6\x4a\x41\xf7\xc1\ +\x91\xf9\x36\xa4\xd8\x54\xdd\xda\x82\x05\x10\xa0\x95\x00\xe3\x37\ +\x02\xdd\xe2\x80\xa9\xdd\xd4\xd7\x21\x45\x26\xc0\x3e\xf2\x37\xc0\ +\x37\x1a\xd9\x1d\xa8\x89\xb0\x00\x02\xb4\x12\x60\xf2\x96\x10\xec\ +\x3a\x73\x07\xaf\xf7\x06\xfa\x7b\xf8\x24\x91\xab\xfd\x13\x70\x0c\ +\x59\x42\xad\xa2\xfd\x87\xcc\x59\x00\x01\x5a\x09\x70\xe8\xe1\x17\ +\x91\x3b\x77\x39\xac\xce\x3a\xfc\xf6\x69\x20\xa5\xb5\xfa\xba\x9c\ +\xe9\xd9\x70\xf6\x98\xa0\x79\x5b\xb0\x00\x02\xb4\xbc\x0d\xdc\xb4\ +\xff\x1c\xe6\xcd\x9b\x87\x6f\xd1\x19\xbe\x78\x28\x94\x71\x85\x44\ +\x48\xd4\x24\x8e\x21\x8b\x21\x25\xf5\xd4\xb4\x2d\x58\x00\x01\x5a\ +\x3f\x08\x2a\x28\x28\xc0\xea\xd5\xab\x95\x9e\xbf\xf9\xfd\x3c\x24\ +\x85\x21\x11\xf5\xf9\x40\x94\x76\x0f\x87\x58\x00\x01\x5a\x0b\x20\ +\xf7\xfc\x9d\x31\x63\x06\xf6\xec\xd9\xa3\xf4\xfc\x9d\xe2\xa1\xe7\ +\xaf\x14\x93\x02\x3b\xdd\x19\x20\x38\x54\x93\xb6\x60\x01\x04\xe8\ +\xf1\x28\xb8\xa6\xa6\x06\xe3\xc6\x8d\x53\x86\x98\x5b\x4c\x49\x61\ +\x3f\x0f\x49\xa1\x33\x75\x00\x9c\xfd\xe7\x69\xf2\x9d\x01\x16\x40\ +\x80\x5e\xff\x0c\x3a\x72\xe4\x08\x26\x4e\x9c\x88\x20\xd7\x1d\x25\ +\x29\x7c\xd0\x43\x52\xe8\x78\x7c\x2a\x5c\x5d\x47\xfb\xbc\x2d\x58\ +\x00\x01\x7a\xfe\x3b\x78\xd3\xa6\x4d\x78\xe5\x95\x57\xd0\xfe\x3f\ +\x49\x61\x2b\xb5\xa4\x90\x6e\x09\x1d\x83\x5f\xf7\x79\x52\xc8\x02\ +\x08\xd0\xbb\x43\xc8\xb2\x65\xcb\xb0\x66\xcd\x1a\x3c\x45\x49\xe1\ +\x52\x4f\x49\x21\xe5\x01\x8e\xef\x2d\x87\xd4\xf6\x21\x9f\xb5\x05\ +\x0b\x20\x40\x6f\x01\xe4\xa4\x30\x2f\x2f\x0f\x7b\xf7\xee\xc5\x78\ +\x2f\xaf\x83\x49\xa1\xd1\xb0\x0f\xff\x15\xd0\xda\x37\x1f\xb7\x66\ +\x01\x04\x34\x47\x80\x75\xbf\x9c\xdd\xa4\x81\x22\xaf\x5c\xb9\xa2\ +\xbc\xe8\x71\x51\x4e\x0a\xfb\x00\x7d\xdb\xab\xc7\x91\xc2\xdb\xc2\ +\x4e\x67\x02\x5f\xdc\x1e\xb2\x00\x02\x9a\x23\x40\xf9\xdb\xb3\x31\ +\x57\xe5\x32\xed\xad\x57\x70\x65\x65\x25\x26\x4d\x9a\xa4\x24\x85\ +\xc5\x94\x14\x3e\xe0\x21\x29\x94\xc2\xda\xc0\x31\x2c\x5f\xb9\x4d\ +\x6c\x0e\x2c\x80\x80\xe6\x8c\x14\x5a\xbd\x6e\x0e\xc6\x74\x16\xcf\ +\xb7\x7f\xf7\x55\x48\x29\xfd\x3d\xae\x63\xc3\x86\x0d\x98\x3f\x7f\ +\x3e\xda\x47\x02\x2b\x49\x82\x08\x0f\xef\x80\xc8\x0f\x8a\x1c\x03\ +\x17\x40\x4a\xec\xd1\xe4\xb6\x60\x01\x04\x34\x55\x80\xf7\x7f\xb7\ +\x0a\xfd\xce\xbe\x85\x24\x95\x5e\xdc\xce\x0e\x03\xe9\x7e\x7e\xae\ +\xd7\xf5\xe4\xe7\xe7\x63\xed\xda\xb5\xe8\x45\x67\xf8\x37\xfa\xaa\ +\x27\x85\x32\x92\xc5\x06\xe7\x77\x72\xeb\x6f\x11\x9b\xf0\xcf\x23\ +\x16\x40\x40\x53\x05\xd8\xf5\xee\x2c\xf4\xb4\x7f\xaa\x3a\x5f\xb9\ +\x95\x1b\x9a\xef\xf5\x88\xbd\x37\x29\x9c\x40\x57\x8c\x49\x5d\xbd\ +\xc7\x76\xc5\x3f\x0a\x67\xc6\x4f\xe8\x92\xf0\x60\xa3\xea\xcc\x02\ +\x08\x68\xb4\x00\x75\x37\x60\xfb\xfc\x03\x58\xfe\xf9\x9e\xc7\xa3\ +\x55\x46\xb2\x85\xc0\xd9\x7d\x3c\x5c\x9d\x9f\xf1\x38\x7a\x47\x75\ +\x75\xb5\x92\x14\x5e\xba\x78\x11\x4b\xfa\x00\x7d\xda\xc3\x2b\xb2\ +\x60\x2e\x3a\xcb\xb8\xba\x8c\x82\xd4\xe6\xa1\x06\x3d\x39\x64\x01\ +\x04\x34\x44\x00\xeb\xa1\x3f\xc2\x72\xf9\x0b\x58\x6a\x4e\xc1\x72\ +\xf1\x10\x2c\x4e\x7b\xa3\xea\x20\x8b\x20\x77\x10\x95\xa2\x93\x20\ +\xc5\x76\x20\x21\xdc\xdf\x03\xa8\xa8\xa8\x50\x76\x4e\xb0\x54\xff\ +\xa4\xf0\x81\x46\xf4\x19\x95\x5a\xb5\x83\x2b\xee\x11\x65\x8c\x20\ +\x57\xfa\x38\xd5\xe5\x58\x00\x01\x5a\x7d\x34\x4a\x0d\x57\x7c\x17\ +\x38\x46\x14\x09\xe7\x95\x95\x95\x61\xc1\x82\x05\x4a\x5e\x51\xec\ +\x25\x29\x14\xa1\x3c\x37\x78\xbe\x4c\x75\x3e\x0b\x20\xc0\x9b\x00\ +\xb9\xb9\xb9\xe8\xe4\x38\x88\x76\x4d\x1b\x94\xe3\x7f\x90\xbf\x3b\ +\xd4\x6f\xc4\x68\xb8\x1e\x79\x56\x75\x99\xa5\x4b\x97\xa2\xa4\xa4\ +\x04\x3d\xe2\x81\x27\x13\x1a\xbe\xee\xf0\xf0\x30\x0c\x7f\xf6\x39\ +\xe5\x92\xa3\x06\x0b\x20\xa0\xa1\x1f\x8d\xf2\x51\x5d\x50\x58\x58\ +\xe8\x71\x19\x39\x29\x9c\x3e\x7d\x3a\xf6\xed\xdb\xd7\xa8\x75\xcb\ +\x72\x95\x96\x96\x7a\x5c\x86\x05\x10\xe0\x4d\x00\x39\x41\xfb\x7a\ +\x34\xaf\xe6\x12\x1c\x1c\x8c\xe8\xe8\x68\xaf\xcb\xdd\xbe\x7d\x1b\ +\xd7\xae\x5d\x6b\xd4\xba\xad\x56\x2b\xda\xb4\x69\xe3\x71\x19\x16\ +\x40\x80\x26\x9f\x8f\xf7\x53\x58\x00\x01\x2c\x80\x1b\x2c\x40\x4b\ +\x85\x05\x10\xc0\x02\xb8\xc1\x02\xb4\x54\x58\x00\x01\x2c\x80\x1b\ +\x2c\x40\x4b\x85\x05\x10\x90\x92\x92\x82\x99\x33\x67\xea\x59\x25\ +\xc3\x38\x76\xec\x98\xf2\xa4\xd1\x0b\xe6\x12\x80\x71\x83\x05\x30\ +\x39\x2c\x80\xc9\x61\x01\x4c\x0e\x0b\x60\x72\x58\x00\x93\xc3\x02\ +\x98\x1c\x16\xc0\xe4\xb4\x38\x01\xe4\xee\x95\x35\xcd\x5e\x91\x79\ +\xc8\x20\x01\xca\xb5\x0c\xa0\xb7\x00\xf2\x1b\x14\x75\x54\xb4\x1d\ +\x8b\xbd\xe5\x90\x46\x02\x1c\xd0\x32\x80\xae\x02\xc8\x90\x04\xc7\ +\x69\xd2\xb8\xb7\x28\xcc\x89\x93\x4a\x2c\x09\x70\x55\xcb\x20\x46\ +\x08\xf0\x26\x4d\xa6\xea\x1d\x37\x00\x29\xa7\x9d\x9f\xa1\x75\x10\ +\x23\x04\x90\x5f\xe1\xdc\x4f\xc5\xa6\x77\xec\x00\x23\x8b\x04\x58\ +\xd3\xfc\xd5\x78\x46\x77\x01\x64\x48\x82\x65\x34\xc9\x33\x22\x76\ +\x80\xf0\x09\x95\x01\x24\x80\xa4\x75\x20\xa3\x04\x08\xa6\xc9\x3a\ +\x2a\x83\x8d\x88\xef\xe7\x54\xa0\x3e\xfb\xbf\xac\x47\x30\x43\x04\ +\x90\x21\x09\xe4\x3b\x81\x45\x54\xa6\x53\x09\x36\xaa\x1e\x7e\x84\ +\x7c\xb4\x97\x50\xc9\xd1\x3a\xf1\xbb\x17\xc3\x04\xf8\x1a\x12\xa1\ +\x03\x4d\xb2\xa9\x0c\xa4\x92\x4c\xa5\x75\xb3\x56\x18\x58\xdc\xa4\ +\xf2\x15\x95\x6d\x54\x56\xd2\x8e\xff\xbb\xde\x15\x30\x5c\x00\xc6\ +\x58\x58\x00\x93\xc3\x02\x98\x1c\x16\xc0\xe4\xb0\x00\x26\x87\x05\ +\x30\x39\x2c\x80\xc9\x61\x01\x4c\x0e\x0b\x60\x72\xfe\x0d\x3d\x48\ +\xb1\xea\xac\xcd\x38\x11\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\ +\x60\x82\ \x00\x00\x29\xf7\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ @@ -8083,444 +6855,1676 @@ qt_resource_data = b"\ \x04\xc1\xc2\xa3\xeb\xb6\x6c\xd9\x72\xd4\x91\x7a\xbc\x6d\x78\x3c\ \xf8\xff\x7f\x6c\xd3\x30\xd0\x13\xb0\x11\x00\x00\x00\x00\x49\x45\ \x4e\x44\xae\x42\x60\x82\ -\x00\x00\x0b\x03\ +\x00\x00\x1f\x38\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x80\x00\x00\x00\x80\x08\x06\x00\x00\x00\xc3\x3e\x61\xcb\ -\x00\x00\x0a\xca\x49\x44\x41\x54\x78\xda\xed\x9d\x0b\x50\x15\xd7\ -\x19\xc7\xff\xf7\x5e\xa0\xe1\x21\x08\x68\xc1\x40\x85\x04\xb4\x89\ -\x46\x62\x44\x3b\x49\x8c\xf8\xac\x8f\xe8\x54\x89\x71\x68\x6a\x6d\ -\x14\x05\x9f\x15\x13\xa7\x9a\x4e\xd3\xaa\x89\x1a\xa3\x13\x91\x12\ -\x1b\x49\x93\xa6\x68\xd3\x44\xa5\x65\x62\x45\x4d\xad\xa9\x4a\x6c\ -\x5a\xad\xaf\xf8\x00\x8d\x1a\x6d\x7c\x2b\x88\x4f\xc4\xfb\xd8\x7e\ -\xbb\x34\xd6\xf6\x9e\xbd\x97\xc7\xdd\xdd\x7b\xd9\xef\x37\x73\x66\ -\x07\x76\xd9\xef\xec\xd9\xdf\xee\x7e\xbb\x9c\x3d\x6b\x01\x63\x6a\ -\x2c\x46\x57\x80\x31\x16\x16\xc0\xe4\xb0\x00\x26\x87\x05\x30\x39\ -\x2c\x80\xc9\x61\x01\x4c\x0e\x0b\x60\x72\x58\x00\x93\xc3\x02\x98\ -\x1c\xbf\x10\x20\x3d\x3d\x3d\x81\x26\x03\xa9\x24\x51\x89\x32\xba\ -\x3e\x3a\x72\x8b\xca\x69\x2a\x5b\x77\xef\xde\x5d\x61\x44\x05\x0c\ -\x15\x80\x76\xfc\xc3\x34\x59\x44\x65\x18\x15\xab\x91\x75\xf1\x03\ -\x76\x52\x99\x45\x22\x6c\xd3\x33\xa8\x61\x02\xd0\xce\x1f\x49\x93\ -\x62\x2a\xe1\x46\xd5\xc1\x0f\x71\x51\xf9\x19\x49\xb0\x48\xaf\x80\ -\x86\x08\x40\x3b\xbf\x2f\x4d\x3e\xa6\x12\x6c\x44\xfc\x00\x60\x1a\ -\x49\xb0\x5c\x8f\x40\xba\x0b\x40\x3b\x3f\x94\x26\x47\xa9\x24\xea\ -\x1d\x3b\x80\xa8\xa3\xd2\x89\x24\x38\xa1\x75\x20\x23\x04\x98\x4e\ -\x93\x02\xbd\xe3\x06\x20\xef\x90\x00\x39\x5a\x07\x31\x42\x80\xed\ -\x34\xe9\xa5\x77\xdc\x00\xa4\x8a\x4a\x1c\x49\xe0\xd4\x32\x88\x11\ -\x02\x5c\xa7\x49\x84\xde\x71\x03\x94\x14\xad\x2f\x03\xba\x0a\x40\ -\x3b\x5f\xce\xf8\x6f\xe8\x19\x33\xc0\x79\x92\x04\xf8\x4c\xcb\x00\ -\x7a\x0b\xd0\x9a\x26\x57\xf4\x8c\x19\xe0\xf4\x26\x01\xb6\x6b\x19\ -\x80\x05\xf0\x6f\xcc\x25\x40\x68\x68\x28\x92\x92\x92\xf4\xac\x92\ -\x61\xd4\xd6\xd6\xe2\xd4\xa9\x53\xde\x16\x33\x97\x00\x69\x69\x69\ -\x58\xb1\x62\x85\x9e\x55\x32\x8c\xfd\xfb\xf7\x63\xf2\xe4\xc9\xde\ -\x16\x63\x01\x5a\x2a\x2c\x80\x00\x16\xc0\x0d\x16\xa0\xa5\xc2\x02\ -\x08\x60\x01\xdc\x60\x01\x5a\x2a\x2c\x80\x00\x16\xc0\x0d\x16\xa0\ -\xa5\xc2\x02\x08\xd0\x54\x00\x49\xa2\xad\xf5\x8b\x2e\x90\x0a\x2c\ -\x80\x00\x4d\x04\xa8\xad\x81\xf5\xe8\x46\x58\x8f\x6f\x81\xe3\x99\ -\x77\xf4\xdc\x5c\x8f\xb0\x00\x02\x7c\x26\x00\x1d\xed\x96\xb3\x7b\ -\x60\xad\xf8\x08\xd6\x13\xdb\x60\x71\xd9\x21\xb5\xba\x1f\xf6\xd1\ -\x25\x7a\x6e\xae\x47\x58\x00\x01\xcd\x16\xa0\xf6\x0a\xac\x47\x36\ -\xc0\x56\xb1\x0e\x96\xab\x5f\xdd\xfd\xf5\x97\xb7\x42\x91\x30\xed\ -\x4f\x40\x48\x98\x9e\x9b\xeb\x11\x16\x40\x40\x93\x04\x90\x5c\xb0\ -\x9c\xd9\x5d\x7f\xb4\x7f\xb9\x9d\x8e\x76\x87\xdb\x22\x7b\xe3\x46\ -\xa1\x73\xe6\x0b\x7a\x6e\xaa\x57\x58\x00\x01\x8d\x12\xe0\x56\xd5\ -\x7f\x8f\xf6\x6b\x67\x3c\x2e\x6a\x1f\xfe\x16\xa4\x76\x8f\xea\xb9\ -\xa9\x5e\x61\x01\x04\x34\x44\x00\xcb\xd9\xbd\xb0\x1d\x5c\x0b\xcb\ -\xc9\x4f\x85\x47\xbb\x08\xfb\x88\x15\x90\xe2\xd3\xf4\xdc\x54\xaf\ -\xb0\x00\x02\x1a\x22\x40\x50\x69\x2e\xac\x17\x0e\x36\x2a\x2e\x0b\ -\xa0\x4e\x40\x09\xb0\x70\xe1\x42\x74\xad\x2a\x43\x4d\x9d\x84\xc3\ -\x97\x81\x4b\xb5\x40\x1c\xe5\x75\xd9\x5d\x80\x8e\x31\xea\x71\x59\ -\x00\x75\x02\x4a\x80\xb1\x63\xc7\xe2\xe8\xd1\xa3\x88\x8b\x8b\x43\ -\x6c\x6c\x2c\x2e\x5c\xb8\x80\xaa\xaa\x2a\x44\x86\x00\x25\x23\x80\ -\x98\xfb\xc4\x7f\xc7\x02\xa8\x13\x50\x02\xec\xdc\xb9\x13\xa9\xa9\ -\xa9\x88\x89\xa9\x3f\xdc\x5d\x2e\x17\x56\xad\x5a\x85\xa2\xa2\x22\ -\xbc\xd0\x1d\x18\xdd\x49\xfc\x77\x2c\x80\x3a\x01\x25\x80\x08\x49\ -\x92\x90\x93\x93\x83\xa4\xda\xc3\x78\x55\xe5\x75\x13\x16\x40\x9d\ -\x80\x17\x40\xa6\xb8\xb8\x18\x07\xd7\x17\xa1\xa0\xbf\x78\x3e\x0b\ -\xa0\x4e\x8b\x10\x60\xf3\xe6\xcd\xd8\x58\x34\x07\x6f\x0e\x10\xcf\ -\x67\x01\xd4\x69\x11\x02\x94\x97\x97\xa3\xb4\x60\x36\x0b\xd0\x04\ -\x58\x00\x83\x60\x01\x04\xb0\x00\x6e\xb0\x00\x0d\x81\x05\x68\x3a\ -\x2c\x80\x41\xb0\x00\x02\x58\x00\x37\x58\x80\x86\xc0\x02\x34\x1d\ -\x16\xc0\x20\x58\x00\x01\x46\x09\x60\x2b\x7f\x03\xb8\xe3\xbb\x81\ -\x4b\x9c\x8f\x4f\x01\xc2\xdb\x7a\x5c\x86\x05\x10\x60\x84\x00\x57\ -\xaf\x5e\x45\x4c\xe9\x0f\x60\xbb\xed\xbb\x71\x2b\xec\x59\xbf\x87\ -\x14\x9d\xec\x71\x19\x16\x40\x80\x11\x02\x0c\x1a\x34\x08\xe9\xad\ -\xaf\xa3\x6d\x18\x90\x1c\x05\xf4\x4c\x00\x12\x5b\x35\x2e\xbe\xc3\ -\x05\xec\xbb\x48\x3b\x95\xca\xf0\xe7\xa7\x21\xf2\xb1\xe1\x40\x88\ -\xe7\x01\x50\x59\x00\x01\x46\x08\x90\x95\x95\x85\x73\xe7\xce\xc1\ -\xe1\x70\xdc\x6d\x10\xb9\x83\xc9\xe4\xc7\xbc\xc7\x3d\x7f\x13\xf8\ -\xb0\x02\x58\x7f\x1c\xa8\xa9\x03\x22\x22\x22\xb0\x72\xe5\x4a\xc4\ -\xc7\xc7\x7b\xfd\x5b\x16\x40\x80\x51\x39\x80\xdc\xaf\xe0\xf4\xe9\ -\xd3\xd8\xb1\x63\x87\xb2\x03\xe5\xcb\xc2\x47\x99\x40\x82\xca\x99\ -\xe0\x2a\xed\xec\x5f\xef\x07\x36\x9e\x0e\xc3\x53\xbd\xfb\x22\x23\ -\x23\x43\xa9\x7b\x54\x54\xc3\x07\x3a\x67\x01\x04\xf8\xc3\x5d\xc0\ -\xc9\x93\x27\x31\x66\xcc\x18\xac\x1c\xe2\xc4\xb7\xff\xaf\x9b\x99\ -\xfc\x76\x59\xd9\x09\xe0\xbd\x63\x51\x18\x3a\x72\x34\x32\x33\x33\ -\x11\x1e\xde\xb4\xb1\xae\x59\x00\x01\xfe\x20\x80\xcc\x8f\x27\xfc\ -\x10\xcb\xbb\x9d\x40\xd0\x3d\x03\xd8\x57\xdf\x06\x5e\xfb\x87\x0d\ -\x71\x4f\x8c\x42\x76\x76\xb6\x72\xba\x6f\x0e\x2c\x80\x00\x7f\x10\ -\x40\xbe\x1c\x7c\x32\x77\x18\x9e\xbe\xbf\xe6\xee\xef\x76\x9f\xa7\ -\xa3\xfe\x5c\x2a\x26\xcd\x7c\x19\x1d\x3b\x76\xf4\x49\x5b\xb0\x00\ -\x02\xfc\x41\x80\x9b\x15\x5b\x10\xf9\xd7\x9f\xc3\x66\xad\x3f\xe5\ -\x7f\x58\x49\xc9\x5e\x6a\x16\x72\x26\x4e\x46\x48\x48\x88\xcf\xda\ -\x82\x05\x10\x60\xb4\x00\x96\x0b\x87\x10\xb4\x3e\x0f\x16\xfb\x2d\ -\xdc\x71\x02\x85\x07\xc3\x91\xf6\xfd\x97\xd1\xbb\x77\x6f\x9f\xb7\ -\x05\x0b\x20\xc0\x48\x01\x2c\xa7\xfe\x86\xa0\xbf\xfc\x42\xd9\xf9\ -\xf2\xf5\xbe\xf0\x78\x22\x9e\x9b\xb9\x18\xc9\xc9\xc9\x9a\xb4\x05\ -\x0b\x20\xc0\x10\x01\xe8\x3c\x6f\xdd\xf7\x3e\x6c\x3b\x57\xc0\x22\ -\xb9\xf0\x05\xd5\xee\x83\xeb\xdd\x31\xe5\xa5\xf9\x88\x8c\x8c\xd4\ -\xac\x2d\x58\x00\x01\xba\x0b\xe0\xa8\x83\x6d\xeb\x6b\xb0\x1d\xfb\ -\xb3\xf2\xe3\xd6\x7f\xd1\x8e\x89\x1b\x89\x9c\xa9\x79\x08\x0a\x0a\ -\xd2\xb4\x2d\x58\x00\x01\xba\x0a\x70\xe3\x22\x82\x3e\x7e\x09\xd6\ -\x4b\x95\x4a\xb2\xb7\xaa\xd2\x86\xd0\xbe\x2f\x62\xf8\x88\x4c\x5d\ -\xda\x82\x05\x10\xa0\x97\x00\x96\xf3\x07\x68\xe7\xff\x14\x96\xda\ -\x6a\xd4\x39\x80\x82\xc3\x91\xe8\x35\x7e\x81\x5c\x3f\xdd\xda\x82\ -\x05\x10\xa0\x87\x00\xd6\xca\xf5\xb0\x6d\x5f\xa2\x0c\x1b\x73\xe9\ -\x16\xb0\xfc\x64\x32\x7e\x34\x6b\x31\x12\x13\xf5\xfd\x86\x15\x0b\ -\x20\x40\x53\x01\xbe\xd9\x19\xb6\xcf\x0a\x61\x3b\xb0\xe6\xee\xef\ -\x8f\xde\x08\x43\xdb\x89\x7f\x40\x78\x2b\xfd\x3f\x56\xca\x02\x08\ -\xd0\x4c\x80\xc1\x8b\x69\xc7\xaf\x85\xf5\xcc\x2e\xb7\x79\xce\x2e\ -\xa3\xe0\xec\xa9\xff\xf0\x31\x2c\x80\x00\xad\x04\x90\x82\xc3\x94\ -\xfb\x7b\x35\x1c\xfd\xe7\xc0\xd5\x61\x90\x9e\x4d\xc1\x02\x88\xd0\ -\x4a\x80\x77\x3f\x07\xc6\x75\xa1\xeb\xbf\xca\xd6\x4a\x41\xf7\xc1\ -\x91\xf9\x36\xa4\xd8\x54\xdd\xda\x82\x05\x10\xa0\x95\x00\xe3\x37\ -\x02\xdd\xe2\x80\xa9\xdd\xd4\xd7\x21\x45\x26\xc0\x3e\xf2\x37\xc0\ -\x37\x1a\xd9\x1d\xa8\x89\xb0\x00\x02\xb4\x12\x60\xf2\x96\x10\xec\ -\x3a\x73\x07\xaf\xf7\x06\xfa\x7b\xf8\x24\x91\xab\xfd\x13\x70\x0c\ -\x59\x42\xad\xa2\xfd\x87\xcc\x59\x00\x01\x5a\x09\x70\xe8\xe1\x17\ -\x91\x3b\x77\x39\xac\xce\x3a\xfc\xf6\x69\x20\xa5\xb5\xfa\xba\x9c\ -\xe9\xd9\x70\xf6\x98\xa0\x79\x5b\xb0\x00\x02\xb4\xbc\x0d\xdc\xb4\ -\xff\x1c\xe6\xcd\x9b\x87\x6f\xd1\x19\xbe\x78\x28\x94\x71\x85\x44\ -\x48\xd4\x24\x8e\x21\x8b\x21\x25\xf5\xd4\xb4\x2d\x58\x00\x01\x5a\ -\x3f\x08\x2a\x28\x28\xc0\xea\xd5\xab\x95\x9e\xbf\xf9\xfd\x3c\x24\ -\x85\x21\x11\xf5\xf9\x40\x94\x76\x0f\x87\x58\x00\x01\x5a\x0b\x20\ -\xf7\xfc\x9d\x31\x63\x06\xf6\xec\xd9\xa3\xf4\xfc\x9d\xe2\xa1\xe7\ -\xaf\x14\x93\x02\x3b\xdd\x19\x20\x38\x54\x93\xb6\x60\x01\x04\xe8\ -\xf1\x28\xb8\xa6\xa6\x06\xe3\xc6\x8d\x53\x86\x98\x5b\x4c\x49\x61\ -\x3f\x0f\x49\xa1\x33\x75\x00\x9c\xfd\xe7\x69\xf2\x9d\x01\x16\x40\ -\x80\x5e\xff\x0c\x3a\x72\xe4\x08\x26\x4e\x9c\x88\x20\xd7\x1d\x25\ -\x29\x7c\xd0\x43\x52\xe8\x78\x7c\x2a\x5c\x5d\x47\xfb\xbc\x2d\x58\ -\x00\x01\x7a\xfe\x3b\x78\xd3\xa6\x4d\x78\xe5\x95\x57\xd0\xfe\x3f\ -\x49\x61\x2b\xb5\xa4\x90\x6e\x09\x1d\x83\x5f\xf7\x79\x52\xc8\x02\ -\x08\xd0\xbb\x43\xc8\xb2\x65\xcb\xb0\x66\xcd\x1a\x3c\x45\x49\xe1\ -\x52\x4f\x49\x21\xe5\x01\x8e\xef\x2d\x87\xd4\xf6\x21\x9f\xb5\x05\ -\x0b\x20\x40\x6f\x01\xe4\xa4\x30\x2f\x2f\x0f\x7b\xf7\xee\xc5\x78\ -\x2f\xaf\x83\x49\xa1\xd1\xb0\x0f\xff\x15\xd0\xda\x37\x1f\xb7\x66\ -\x01\x04\x34\x47\x80\x75\xbf\x9c\xdd\xa4\x81\x22\xaf\x5c\xb9\xa2\ -\xbc\xe8\x71\x51\x4e\x0a\xfb\x00\x7d\xdb\xab\xc7\x91\xc2\xdb\xc2\ -\x4e\x67\x02\x5f\xdc\x1e\xb2\x00\x02\x9a\x23\x40\xf9\xdb\xb3\x31\ -\x57\xe5\x32\xed\xad\x57\x70\x65\x65\x25\x26\x4d\x9a\xa4\x24\x85\ -\xc5\x94\x14\x3e\xe0\x21\x29\x94\xc2\xda\xc0\x31\x2c\x5f\xb9\x4d\ -\x6c\x0e\x2c\x80\x80\xe6\x8c\x14\x5a\xbd\x6e\x0e\xc6\x74\x16\xcf\ -\xb7\x7f\xf7\x55\x48\x29\xfd\x3d\xae\x63\xc3\x86\x0d\x98\x3f\x7f\ -\x3e\xda\x47\x02\x2b\x49\x82\x08\x0f\xef\x80\xc8\x0f\x8a\x1c\x03\ -\x17\x40\x4a\xec\xd1\xe4\xb6\x60\x01\x04\x34\x55\x80\xf7\x7f\xb7\ -\x0a\xfd\xce\xbe\x85\x24\x95\x5e\xdc\xce\x0e\x03\xe9\x7e\x7e\xae\ -\xd7\xf5\xe4\xe7\xe7\x63\xed\xda\xb5\xe8\x45\x67\xf8\x37\xfa\xaa\ -\x27\x85\x32\x92\xc5\x06\xe7\x77\x72\xeb\x6f\x11\x9b\xf0\xcf\x23\ -\x16\x40\x40\x53\x05\xd8\xf5\xee\x2c\xf4\xb4\x7f\xaa\x3a\x5f\xb9\ -\x95\x1b\x9a\xef\xf5\x88\xbd\x37\x29\x9c\x40\x57\x8c\x49\x5d\xbd\ -\xc7\x76\xc5\x3f\x0a\x67\xc6\x4f\xe8\x92\xf0\x60\xa3\xea\xcc\x02\ -\x08\x68\xb4\x00\x75\x37\x60\xfb\xfc\x03\x58\xfe\xf9\x9e\xc7\xa3\ -\x55\x46\xb2\x85\xc0\xd9\x7d\x3c\x5c\x9d\x9f\xf1\x38\x7a\x47\x75\ -\x75\xb5\x92\x14\x5e\xba\x78\x11\x4b\xfa\x00\x7d\xda\xc3\x2b\xb2\ -\x60\x2e\x3a\xcb\xb8\xba\x8c\x82\xd4\xe6\xa1\x06\x3d\x39\x64\x01\ -\x04\x34\x44\x00\xeb\xa1\x3f\xc2\x72\xf9\x0b\x58\x6a\x4e\xc1\x72\ -\xf1\x10\x2c\x4e\x7b\xa3\xea\x20\x8b\x20\x77\x10\x95\xa2\x93\x20\ -\xc5\x76\x20\x21\xdc\xdf\x03\xa8\xa8\xa8\x50\x76\x4e\xb0\x54\xff\ -\xa4\xf0\x81\x46\xf4\x19\x95\x5a\xb5\x83\x2b\xee\x11\x65\x8c\x20\ -\x57\xfa\x38\xd5\xe5\x58\x00\x01\x5a\x7d\x34\x4a\x0d\x57\x7c\x17\ -\x38\x46\x14\x09\xe7\x95\x95\x95\x61\xc1\x82\x05\x4a\x5e\x51\xec\ -\x25\x29\x14\xa1\x3c\x37\x78\xbe\x4c\x75\x3e\x0b\x20\xc0\x9b\x00\ -\xb9\xb9\xb9\xe8\xe4\x38\x88\x76\x4d\x1b\x94\xe3\x7f\x90\xbf\x3b\ -\xd4\x6f\xc4\x68\xb8\x1e\x79\x56\x75\x99\xa5\x4b\x97\xa2\xa4\xa4\ -\x04\x3d\xe2\x81\x27\x13\x1a\xbe\xee\xf0\xf0\x30\x0c\x7f\xf6\x39\ -\xe5\x92\xa3\x06\x0b\x20\xa0\xa1\x1f\x8d\xf2\x51\x5d\x50\x58\x58\ -\xe8\x71\x19\x39\x29\x9c\x3e\x7d\x3a\xf6\xed\xdb\xd7\xa8\x75\xcb\ -\x72\x95\x96\x96\x7a\x5c\x86\x05\x10\xe0\x4d\x00\x39\x41\xfb\x7a\ -\x34\xaf\xe6\x12\x1c\x1c\x8c\xe8\xe8\x68\xaf\xcb\xdd\xbe\x7d\x1b\ -\xd7\xae\x5d\x6b\xd4\xba\xad\x56\x2b\xda\xb4\x69\xe3\x71\x19\x16\ -\x40\x80\x26\x9f\x8f\xf7\x53\x58\x00\x01\x2c\x80\x1b\x2c\x40\x4b\ -\x85\x05\x10\xc0\x02\xb8\xc1\x02\xb4\x54\x58\x00\x01\x2c\x80\x1b\ -\x2c\x40\x4b\x85\x05\x10\x90\x92\x92\x82\x99\x33\x67\xea\x59\x25\ -\xc3\x38\x76\xec\x98\xf2\xa4\xd1\x0b\xe6\x12\x80\x71\x83\x05\x30\ -\x39\x2c\x80\xc9\x61\x01\x4c\x0e\x0b\x60\x72\x58\x00\x93\xc3\x02\ -\x98\x1c\x16\xc0\xe4\xb4\x38\x01\xe4\xee\x95\x35\xcd\x5e\x91\x79\ -\xc8\x20\x01\xca\xb5\x0c\xa0\xb7\x00\xf2\x1b\x14\x75\x54\xb4\x1d\ -\x8b\xbd\xe5\x90\x46\x02\x1c\xd0\x32\x80\xae\x02\xc8\x90\x04\xc7\ -\x69\xd2\xb8\xb7\x28\xcc\x89\x93\x4a\x2c\x09\x70\x55\xcb\x20\x46\ -\x08\xf0\x26\x4d\xa6\xea\x1d\x37\x00\x29\xa7\x9d\x9f\xa1\x75\x10\ -\x23\x04\x90\x5f\xe1\xdc\x4f\xc5\xa6\x77\xec\x00\x23\x8b\x04\x58\ -\xd3\xfc\xd5\x78\x46\x77\x01\x64\x48\x82\x65\x34\xc9\x33\x22\x76\ -\x80\xf0\x09\x95\x01\x24\x80\xa4\x75\x20\xa3\x04\x08\xa6\xc9\x3a\ -\x2a\x83\x8d\x88\xef\xe7\x54\xa0\x3e\xfb\xbf\xac\x47\x30\x43\x04\ -\x90\x21\x09\xe4\x3b\x81\x45\x54\xa6\x53\x09\x36\xaa\x1e\x7e\x84\ -\x7c\xb4\x97\x50\xc9\xd1\x3a\xf1\xbb\x17\xc3\x04\xf8\x1a\x12\xa1\ -\x03\x4d\xb2\xa9\x0c\xa4\x92\x4c\xa5\x75\xb3\x56\x18\x58\xdc\xa4\ -\xf2\x15\x95\x6d\x54\x56\xd2\x8e\xff\xbb\xde\x15\x30\x5c\x00\xc6\ -\x58\x58\x00\x93\xc3\x02\x98\x1c\x16\xc0\xe4\xb0\x00\x26\x87\x05\ -\x30\x39\x2c\x80\xc9\x61\x01\x4c\x0e\x0b\x60\x72\xfe\x0d\x3d\x48\ -\xb1\xea\xac\xcd\x38\x11\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\ -\x60\x82\ -\x00\x00\x05\xe0\ +\x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\ +\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01\x42\x28\x9b\x78\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\ +\x74\x77\x61\x72\x65\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\ +\x70\x65\x2e\x6f\x72\x67\x9b\xee\x3c\x1a\x00\x00\x1e\xb5\x49\x44\ +\x41\x54\x78\x9c\xed\x9d\x79\x94\x14\xd5\xd9\xff\x3f\xb7\x7b\x7a\ +\x16\x40\xc6\x99\x61\x16\x90\x45\x07\x51\x5e\x01\x17\x14\x09\x60\ +\xd0\xf8\x06\xf5\xa7\xe6\xc5\x2d\x1a\xf2\xc6\xbc\x2a\x27\x2a\x68\ +\x50\x41\xc9\x49\x3c\xc2\x2f\xaf\x22\xe6\x3d\x01\x17\x40\x93\x9f\ +\x5b\x24\x90\x1c\x63\x14\x09\x42\x04\x44\x16\x0f\x20\xca\xe2\x04\ +\x10\x90\x45\x18\x06\x18\x66\x84\x61\x66\x98\x99\xde\xaa\xea\xf7\ +\x47\x75\x55\x57\x75\x57\x75\x57\xf7\x54\xcf\xc2\xcb\xf7\x9c\x3a\ +\x5d\xf7\xde\xe7\xde\xba\x55\xdf\xe7\x3e\xcf\xdd\xaa\x5a\x28\x8a\ +\xc2\x59\xfc\xef\x45\x96\x1b\x85\x08\x21\x84\x1b\xe5\x9c\x45\x6a\ +\x50\x5c\x68\xbd\x22\xd5\x32\x62\xc8\x3e\x4b\x7c\xc7\x80\x4e\x62\ +\xaa\x4a\x91\x92\x05\x88\x90\x1f\x7b\xc0\x59\x45\x68\x2f\x28\x86\ +\x5f\x05\x50\x84\x10\x29\x29\x81\x63\x05\x30\x90\xef\x89\x1c\x5e\ +\xc3\xb9\x51\x19\xce\xa2\x6d\xa0\x91\x2e\x47\x0e\x49\x3b\x4f\x45\ +\x09\x52\xb1\x00\x1a\xf9\x5e\xc0\x07\x64\x47\x7e\xb3\x88\x2a\x01\ +\x9c\x55\x84\x4c\xc3\xd8\xea\x65\x20\x0c\x84\x80\x60\xe4\x97\x48\ +\xbc\x7b\x0a\x60\x68\xfd\x5e\x54\xe2\x73\x81\x2e\x91\xdf\x1c\xa2\ +\xd6\xe0\x2c\xf9\x6d\x03\x8d\x7c\x09\x08\x00\x7e\xa0\x19\xf5\xf9\ +\x07\x51\x5d\x81\x70\x62\x05\x92\x2a\x80\xa1\xd3\xa7\x59\x00\x1f\ +\x2a\xf9\xdd\x81\x73\x50\x95\x20\x1b\x55\x09\x34\xb9\xb3\xc8\x1c\ +\x34\x52\x25\x54\xb2\xfd\x40\xa3\x21\x2e\x4c\x84\x03\x27\x4a\xe0\ +\xd4\x05\xc4\x5a\x80\x3c\x54\xf2\xcf\x55\x14\x65\x69\x2a\xb5\x3f\ +\x0b\x77\x21\x84\xb8\x25\x72\x1a\x42\xb5\x06\x41\xa2\x4a\xd0\x7a\ +\x0b\x60\xbc\x16\xd1\x3e\x80\xa6\x04\xdd\x00\x4e\x9c\x38\x89\x3f\ +\x10\x20\x3a\x40\x14\x91\xca\x45\xc3\xf6\x69\xb1\xe9\x56\x61\xb0\ +\x9a\x6a\x10\xf1\x05\xb5\x3a\xcd\x5c\xcb\xe4\x72\x26\xd9\xb8\x84\ +\xcc\x19\xc3\xac\xac\x2c\xba\x76\xe9\x02\x2a\x07\x01\xa2\x56\x38\ +\x25\x57\x9c\xaa\x02\x58\x75\x04\x0d\xe4\xc7\x13\x9f\x5a\x38\x9e\ +\xe8\xb6\x24\xde\x09\xe9\x8a\xa2\x10\x0c\x04\x00\xc8\xce\xce\xc6\ +\xe3\xf1\xa4\x45\xb4\x2c\xcb\x04\x83\x41\x00\x72\x72\x72\x10\x42\ +\xd8\xb2\x66\xd5\x8c\xc3\xe1\xb0\x76\xaa\x75\xc6\x8d\xe4\x3b\xae\ +\x90\xc7\xa9\x60\x04\xb1\x4a\xe0\x05\x1c\x93\x2f\x44\xb2\xb0\x79\ +\x8e\xc9\x92\x7c\x73\x26\x73\xc5\xd2\x4d\x33\xa6\x27\x92\x01\xf6\ +\x7e\xf3\x0d\x65\x65\x65\x94\x95\x95\xf1\xee\xbb\xef\x3a\xb2\x24\ +\x56\xc7\x27\x2b\x57\x52\x56\x5a\x4a\x59\x69\x29\x9f\x6f\xdc\x98\ +\x90\x31\xbb\x32\x22\xd0\x78\x48\x6b\x38\x9e\xce\x54\xb0\xb1\x0e\ +\x9e\x68\x54\xfa\x26\xdf\x51\xab\x4f\xb1\x55\x3b\x6a\xed\x4e\xac\ +\x41\xac\x5c\xa2\x7a\x58\x26\xd8\xa4\xc4\x96\x99\xbe\xbb\x30\x12\ +\x9f\x72\x21\xae\xac\x05\x80\x53\xf2\x93\xf9\x7a\x0b\xdf\x6f\x2e\ +\x20\xed\xf8\x68\x6d\x1c\xa4\x27\x90\x49\xb5\x4c\xa7\x65\x38\xcd\ +\xed\xf6\xd2\x9d\x4b\x8b\x41\x90\x2a\xd9\xe9\xb6\x7a\xb7\x89\x77\ +\x4a\xba\x88\xf9\xd5\xe5\x9d\x5a\x91\x18\x8c\xfe\xfe\xf7\xd9\xbc\ +\x79\x33\x00\x7d\xfa\xf4\x49\x20\xe9\xbc\xcc\x74\xe0\x92\x05\x70\ +\x97\x7c\x5b\x92\xed\x08\x4e\xb7\x43\xe8\x24\x3d\x56\x2e\x99\x12\ +\x59\x57\x30\x2e\xaa\x4b\xd7\xae\x5c\x74\xf1\xc5\xc9\x72\x66\x1c\ +\x19\x77\x01\xc9\x14\x21\x10\x08\xe0\xf7\xfb\x01\xc8\xcf\xcf\x47\ +\x08\x81\x24\x49\x7c\xb1\x69\x13\xdf\x1e\x3c\x88\x2f\x2b\x8b\x21\ +\x43\x86\xf0\x6f\x97\x5c\x12\x77\xcd\x70\x28\xc4\xa6\x2f\xbe\xe0\ +\xd0\xc1\x83\x14\x16\x15\x31\x74\xe8\x50\x4a\x4b\x4b\x13\x5b\x09\ +\x43\x85\x5b\x5a\x5a\xd8\xb5\x6b\x17\xbb\xbe\xfe\x9a\xa2\xa2\x22\ +\x06\x0f\x1e\x6c\x6e\x8d\x0e\x3b\x78\x00\xdf\x7c\xf3\x0d\xff\xda\ +\xbe\x9d\x60\x20\xc0\xd0\x2b\xaf\xe4\xe2\x8b\x2f\xb6\x55\x4c\x50\ +\x7b\xf1\x4d\x4d\x4d\x08\xa0\x5b\xb7\x6e\x78\xbd\x5e\x5b\x59\x23\ +\x3a\xad\x0b\xb0\x6b\xf5\xb3\x67\xcf\x66\xf6\xac\x59\x00\x1c\xab\ +\xae\x66\xd5\xaa\x55\x3c\x39\x65\x0a\xd5\xd5\xd5\x26\xf9\x31\x63\ +\xc6\xf0\xff\x5e\x7f\x9d\xee\xdd\xbb\x23\x80\x85\x0b\x17\xf2\xec\ +\xb3\xcf\x52\x53\x53\x63\x92\xbb\xff\x81\x07\xf8\xdd\xef\x7e\x87\ +\xcf\xe7\x8b\x5e\x2b\xa6\xb2\x75\x75\x75\x3c\xfe\xd8\x63\x2c\x59\ +\xb2\x04\x59\x96\x4d\xf9\x8b\x8b\x8b\x99\x3d\x7b\x36\xff\x31\x76\ +\xac\xb9\xbe\x56\x65\x01\xfb\xf6\xef\x67\xc2\xc3\x0f\xb3\x69\xd3\ +\x26\x53\x7c\x61\x61\x21\xaf\xbe\xfa\x2a\xb7\xdc\x72\x0b\x56\xf8\ +\x74\xd5\x2a\xee\xba\xeb\x2e\x00\x96\x2f\x5f\xce\xc8\x91\x23\x2d\ +\xe5\x62\xe1\xb6\x0b\x48\x75\x18\x68\x83\xf4\xc8\x8f\xc5\xe2\x0f\ +\x3f\xe4\xde\x9f\xfd\x8c\xea\xea\x6a\xca\xca\xca\x18\x3c\x78\x30\ +\xd9\xd9\xd9\x00\xac\x5c\xb9\x92\x9f\x8e\x1b\x07\xc0\x8b\x2f\xbd\ +\xc4\x2f\x7f\xf9\x4b\x6a\x6a\x6a\xe8\xdd\xbb\x37\x97\x5c\x72\x09\ +\x59\x59\xaa\x2e\xbf\xfd\xd6\x5b\x4c\x9c\x38\x51\xaf\x95\x6e\x0d\ +\x22\xc7\xd6\xad\x5b\x19\x35\x72\x24\x8b\x17\x2f\x46\x96\x65\xba\ +\x74\xe9\xc2\xc8\x91\x23\xe9\xdf\xbf\x3f\x00\xb5\xb5\xb5\xdc\x7b\ +\xef\xbd\x3c\x36\x69\x12\x28\x8a\xb9\x83\x16\xe3\xf3\x0f\x55\x56\ +\xf2\xef\xd7\x5f\xcf\xa6\x4d\x9b\x28\x28\x28\x60\xf4\xe8\xd1\x9c\ +\x7f\xfe\xf9\x00\x9c\x3c\x79\x92\x71\xe3\xc6\xf1\xf2\xcb\x2f\x1b\ +\x6f\xdc\xba\xdf\x60\x8c\x4f\xe5\x70\x01\x2e\x29\x80\x33\xf2\x85\ +\x88\x1f\xdb\x1b\x43\x8f\x3f\xfe\x38\x97\x5e\x7a\x29\x9b\xbe\xf8\ +\x82\x9d\x5f\x7f\xcd\xda\x75\xeb\xd8\xbd\x67\x0f\x63\xc6\x8c\x01\ +\x60\xe3\xc6\x8d\x4c\x9b\x36\x8d\xe7\x67\xcc\x60\xd4\xa8\x51\x54\ +\x54\x54\xb0\x7d\xfb\x76\xd6\x6f\xd8\xc0\xce\x9d\x3b\xb9\x7a\xf8\ +\x70\x00\x3e\x78\xff\x7d\xf6\xed\xdd\x1b\xf7\xa0\x24\x49\x62\xe2\ +\x84\x09\x1c\x3d\x7a\x14\x21\x04\xd3\xa7\x4f\xa7\xea\xc8\x11\xfe\ +\xf9\xf1\xc7\x6c\xdd\xb6\x8d\x6d\x5f\x7d\xc5\x80\x01\x03\x00\xf8\ +\xd3\x9f\xfe\xc4\x7b\xef\xbd\x97\xf0\x81\xcf\xfa\xfd\xef\x69\x6c\ +\x6c\x64\xce\x9c\x39\x54\x56\x56\xb2\x74\xe9\x52\xb6\xef\xd8\xc1\ +\x86\x8d\x1b\xe9\xd5\xab\x17\x8a\xa2\xf0\xcc\x33\xcf\xb0\x63\xe7\ +\xce\xa4\x9d\xc5\x54\x0f\xb7\xe0\x8a\x02\xd8\xfb\x7f\x33\xf9\xa6\ +\x3c\x16\x71\x45\x45\x45\x2c\x5d\xb6\x8c\x0b\x2f\xbc\x50\x8f\x3b\ +\x37\x3f\x9f\xb9\x73\xe7\xea\x96\x60\xde\xdc\xb9\x0c\x18\x30\x80\ +\xc5\x8b\x17\xd3\xb7\x5f\x3f\xfd\xe2\x25\xa5\xa5\xcc\x9d\x33\x07\ +\x21\x04\xb2\x2c\xb3\x70\xe1\xc2\xb8\xeb\x2d\x5c\xb0\x80\xdd\xbb\ +\x77\x03\xf0\x9b\xdf\xfc\x86\xc9\x53\xa6\xe0\xf5\x7a\xf5\x87\xda\ +\xbf\xbc\x9c\x95\x2b\x57\x52\x58\x58\x08\xc0\x6f\xff\xfb\xbf\x09\ +\x44\x66\xfd\xac\x1e\x7e\x30\x18\xe4\xf9\x99\x33\xb9\xef\xfe\xfb\ +\x4d\x4a\x32\x64\xc8\x10\x3e\xfe\xf8\x63\xb2\xb2\xb2\x50\x14\x85\ +\x19\xcf\x3d\xe7\x3a\x81\x6e\x29\x81\x6b\x16\x20\x51\xe7\xcf\xd2\ +\x05\x58\xb4\x88\xa9\xbf\xfa\x15\x79\x79\x79\x86\x12\x01\x21\x28\ +\x2e\x29\xe1\xca\x2b\xaf\xd4\xe3\x7f\xf3\xf4\xd3\x78\xb3\xcc\xdd\ +\x17\x01\x5c\x74\xd1\x45\x5c\x3c\x70\x20\x00\x07\x0e\x1c\xd0\xe3\ +\xb5\x72\x5e\x7b\xed\x35\x00\xba\x77\xef\xce\x84\x89\x13\x2d\xcd\ +\x7b\x61\x51\x11\x0f\x4f\x98\x00\xc0\xe1\xca\x4a\x96\x2d\x5d\x6a\ +\x3b\x54\x2c\x2e\x2e\xe6\xfe\xfb\xef\xb7\x6c\xa1\xe5\xe5\xe5\xba\ +\x8f\xff\xe8\xa3\x8f\xa8\xac\xac\x34\x5d\xc7\x15\x37\xe0\x02\x5c\ +\xeb\x03\xb4\xd6\xff\x03\x3a\xc9\xba\x75\x30\xc8\xf6\xee\xdd\x3b\ +\x4e\x4e\x97\x55\x0b\x06\x21\xe8\xd5\xb3\x27\x00\x95\x95\x95\xa6\ +\x78\x59\x96\xd9\xbf\x7f\x3f\x00\x37\xdc\x70\x03\xdd\xcf\x39\x47\ +\xab\x90\xe9\x3a\x02\xb8\xe7\xee\xbb\xf5\xf0\x5e\xa3\x2b\x89\xa9\ +\xfb\xcd\x37\xdf\x4c\x5e\x6e\x6e\xfc\x8d\x44\x64\x6f\xbf\xe3\x8e\ +\x68\x39\xfb\xf6\xe9\xf9\xad\xac\x40\x7b\xb9\x01\x57\x5d\x80\xea\ +\xe3\x8d\xf1\x89\xc9\xd7\x09\x8a\xa0\x5f\xbf\x7e\x96\x43\x38\x01\ +\x9c\x5b\x50\x00\xa8\x0b\x30\x3d\x7b\xf6\x8c\xef\xe0\x45\x70\x4e\ +\x84\xd8\x53\xa7\x4e\x99\xe2\x8f\x1e\x39\xa2\x2f\xbe\x5c\x70\xc1\ +\x05\x96\xc4\x6b\xa1\x3e\x7d\xfa\xa8\x8b\x3c\xc4\x5b\x12\x63\xcd\ +\x74\xa5\xb4\x68\x99\x02\xe8\x6b\x18\x52\x7e\x7b\xe0\x80\xeb\xfe\ +\xdb\x0d\xb8\xd8\x09\x34\xde\x9a\x45\x67\x2f\x09\xf9\xa0\x92\x6b\ +\x45\xbe\x31\xce\xeb\xf5\xe2\xb1\x68\x91\x76\x0f\x57\x8b\x3f\x7c\ +\xf8\xb0\x1e\xd7\xb3\x57\x2f\x53\x5a\xac\x1b\xf0\x65\x67\x53\x5c\ +\x5c\x0c\x91\x7c\x76\xa4\x95\x96\x95\x81\x10\xb6\xad\xb3\xb4\xb4\ +\x54\x97\xad\xaa\xaa\x8a\xa9\x98\x30\x9f\xb7\x83\xf9\x07\xf7\xde\ +\x0b\x30\x86\xcc\xf7\xa6\x0a\x24\x90\xb7\x29\xd3\x22\x9f\xa1\x80\ +\x78\x59\x2d\x3e\x46\x29\xb4\xf8\x12\x03\x19\x27\xbe\xfb\xce\xd6\ +\xaf\x0b\xd4\xa5\xda\xba\xba\x3a\x00\x4a\x4a\x4a\xcc\x32\x06\xd9\ +\xba\x93\x27\xed\x5b\xb4\x10\x9c\x8c\x94\x01\x50\x5c\x52\x62\xeb\ +\x02\xd2\xb2\x0c\x2e\x29\x81\x6b\x33\x81\x2a\x12\xbb\x00\xab\x38\ +\xbb\x56\x6b\x4b\xb2\x55\x9c\x03\x45\xe9\xdb\xb7\x2f\x1e\x8f\x07\ +\x59\x96\x39\x74\xe8\x50\xc2\xf2\x8f\x1d\x3b\xa6\xbb\x8b\xf2\xf2\ +\x72\xbd\x95\xc7\xca\x1d\x39\x72\xc4\xf2\x5a\x9a\xdc\x51\x43\x7a\ +\xff\xf2\xf2\x0e\x67\xfe\xc1\x65\x17\x90\xd0\xff\xdb\xc4\xc5\x95\ +\xa3\x66\x36\xe7\xb3\x93\x4b\x41\x36\x27\x3b\x5b\xf7\xd9\xeb\xd6\ +\xad\xd3\x37\x54\xc4\xe5\x11\x82\x4f\x56\xad\xd2\x83\xfd\xfb\xf7\ +\xb7\x25\x6e\xed\xba\x75\xea\xd4\xac\x85\x1b\x00\x58\xb3\x66\x8d\ +\x2e\x7b\xc1\x05\x17\xd8\x94\x42\xbb\x99\x7f\x70\xad\x13\x98\xba\ +\xbf\xb7\x1a\x0a\xc6\xc6\xd9\xb5\x70\xbd\xbc\x04\xbd\xea\xb8\x78\ +\x21\xf8\x49\x64\x26\xb1\xb2\xb2\x92\xbf\xbf\xf7\x5e\xbc\x1b\x88\ +\x8c\x16\x5e\x7a\xf1\x45\x40\x1d\x2e\xde\x7c\xf3\xcd\xa6\x74\x23\ +\xf6\xec\xde\x1d\x3f\x4c\x8c\xa0\xa1\xa1\x81\x37\xde\x78\x03\x80\ +\x2b\xae\xb8\x42\x5d\xcb\x10\x02\xbb\xc9\xb0\x94\x0e\x8b\x32\xd2\ +\x85\x8b\xf3\x00\x2a\x1c\x93\x9f\xac\x1c\x2d\x9f\x95\xac\x9d\x92\ +\x24\x71\x05\x53\x26\x4f\xd6\x7d\xfa\xe4\xc9\x93\x59\xf5\xe9\xa7\ +\x7a\x3e\x01\xf8\x5b\x5a\xf8\xf9\xbd\xf7\xaa\x43\x3f\xe0\xa9\xa7\ +\x9e\xa2\xa8\x47\x0f\x93\xa2\xc5\x62\xe2\xc4\x89\xfa\xb2\xae\x56\ +\xd6\xa9\xfa\x7a\xee\xba\xeb\x2e\x1a\x1a\x1a\x00\x98\x3e\x7d\x7a\ +\x87\x1c\x01\x80\xcb\x7d\x00\x37\xc8\xb7\x33\xed\xb6\x72\x16\xd7\ +\xb0\x8a\x17\x40\xd7\xae\x5d\x99\x3d\x7b\x36\xe3\xc7\x8f\xa7\xb1\ +\xb1\x91\x3b\xef\xb8\x83\xe1\xc3\x87\x73\xf9\xe5\x97\x53\x53\x53\ +\xc3\x86\x0d\x1b\x74\xbf\x3e\x7c\xf8\x70\x26\x3e\xf2\x48\x42\xd2\ +\x1e\x18\x3f\x9e\xf9\xef\xbc\xc3\x8d\x37\xde\xc8\xe8\xd1\xa3\xb9\ +\xf4\xd2\x4b\xa9\xac\xac\x64\xed\xda\xb5\xfa\x62\xd6\x1d\x77\xdc\ +\xc1\x8d\x37\xde\x98\xf0\x9e\x13\xde\x83\x86\x0c\xbd\xc5\xed\xe2\ +\x72\x70\xea\xe4\x5b\xf9\x7b\xec\xe2\x62\xf3\x25\x93\xb3\x6a\xb5\ +\x42\x70\xdb\xed\xb7\x53\xde\xbf\x3f\xff\xf5\xf3\x9f\xb3\x77\xef\ +\x5e\xd6\xaf\x5f\xcf\xfa\xf5\xeb\x4d\x75\x9c\x3c\x79\x32\xd3\xa7\ +\x4f\xd7\x17\x98\x4c\x65\x1a\xae\x39\xe2\x7b\xdf\xe3\x86\x31\x63\ +\xf8\xc5\x2f\x7e\xc1\xf2\xe5\xcb\x59\xbe\x7c\xb9\x49\x7c\xea\xd4\ +\xa9\xfc\xdf\xdf\xfe\xd6\xb2\x9e\x71\x6b\x24\x16\xf7\x69\x75\x3f\ +\x6e\x23\xe9\xdb\xc1\x86\xb7\x82\x7c\xa8\x5b\xc1\xf3\x81\x62\xa0\ +\x0c\x28\x56\x14\xe5\xad\x13\x27\x4f\x9a\xf3\xa8\x19\x6d\xc3\xc6\ +\xb8\xca\xca\x4a\x7d\xd6\x6e\xd4\x35\xd7\x98\x1f\x8c\x21\xdf\x81\ +\x03\x07\x38\x7a\xe4\x08\x5e\xaf\x57\x5d\x3a\xb5\x51\x9c\xdd\xbb\ +\x77\x53\x5b\x5b\x4b\x5e\x6e\x2e\xc3\x86\x0d\x33\xde\x88\x49\xb6\ +\xa5\xa5\x85\xcd\x9b\x37\xb3\x63\xe7\x4e\xbe\xde\xb9\x93\xa2\x1e\ +\x3d\x18\x32\x78\x30\x43\x87\x0e\x55\x7b\xfe\xe6\x87\xa0\xe7\x6d\ +\x6e\x6e\xd6\x4d\xfe\xc0\x81\x03\x29\x29\x29\xe1\xd4\xa9\x53\x2c\ +\x5e\xbc\x98\x1d\x3b\x76\x10\x08\x04\xb8\xf2\xaa\xab\x18\x39\x62\ +\x04\x17\x5d\x74\x91\xed\x73\x3d\x79\xf2\x24\x3b\x76\xec\x00\xe0\ +\xb2\xcb\x2e\x23\x3f\x3f\xdf\x56\xd6\x0e\x91\xdd\xc4\x0f\x00\xb5\ +\x40\x75\xe4\xb7\x1e\x68\x41\x7d\x4f\x40\x49\xf6\x62\x88\xeb\x0a\ +\x90\x0a\xf9\x09\xc3\xa9\xc4\x19\xe2\x1d\x59\x82\x44\xe5\x24\xcb\ +\x97\xae\x5c\x06\xe0\x86\x02\xb8\xdb\x07\x80\xb6\x27\x3f\x4d\x85\ +\xb0\x4c\x8b\xa4\x27\x24\x33\x5d\xc2\x9d\x98\xf9\x76\x80\x7b\x7d\ +\x00\x48\x4e\x6c\x6b\xfa\x00\x36\x3e\x3d\x2e\xce\xcd\x78\xa7\xe9\ +\xe9\xca\x76\x00\xb8\x33\x15\x0c\xae\x93\x9f\x56\x0b\xcf\x00\xf1\ +\x4e\x49\xef\x2c\x84\xc7\xc2\x1d\x0b\x10\xdb\x43\x4d\x12\x6e\x15\ +\xf9\x99\x54\x08\x43\x7a\x32\x37\x90\x0e\xe1\x1d\xf1\x53\x4a\x2e\ +\xaf\x05\xc4\xdf\xa4\xa3\xa1\x5f\x86\xdc\x40\x4a\x3e\xde\x2d\x6b\ +\x40\xc7\x24\xda\x0e\x99\x9f\x08\x8a\x0d\xa7\x40\x7e\x5a\x2d\x3c\ +\x0d\x85\xb0\x94\x4f\x96\xcf\x24\xd2\x79\x08\x8f\x45\x9b\x4d\x04\ +\x65\x82\x7c\x47\x24\x27\x22\x38\x01\xb9\x49\x67\x2c\x3b\x31\xe9\ +\x46\xb8\xd7\x09\x8c\x0d\xbb\x41\x7e\x3b\xb8\x81\x44\xb4\x66\x9a\ +\x74\xbb\xf2\x33\xf9\x31\x4f\xd7\x3b\x81\x6e\x93\x9f\x49\x37\x10\ +\x0e\x87\xa9\xae\xae\x26\x10\x0c\xd2\xb7\x4f\x1f\x7d\xe7\x71\x7c\ +\xb6\xd6\x13\xdf\x9a\x32\x32\xa9\x78\x6d\x3a\x11\x94\x09\xf2\x53\ +\x69\xf5\xdf\x1e\x38\xc0\xc2\x85\x0b\xf9\xe7\x3f\xff\x49\x55\x55\ +\x15\xb5\xb5\xb5\x7a\xeb\xf2\x78\x3c\xf4\xee\xdd\x9b\xf2\xf2\x72\ +\x06\x0e\x1c\xc8\xb8\x71\xe3\x18\x31\x62\x44\x82\xbb\xb5\x47\x67\ +\x72\x0f\xae\x4c\x05\xd7\x9d\x3a\x95\x71\xf2\x9d\xfa\x7b\xab\xb8\ +\x0f\x17\x2d\x62\xce\x9c\x39\x6c\xd8\xb0\xc1\xfe\x46\x2d\x70\xd9\ +\x65\x97\xf1\xda\x6b\xaf\x71\xd5\x55\x57\x25\x94\x6b\x2f\xc2\xb3\ +\xb2\xb2\x68\xed\x54\xb0\x7b\xfb\x01\x9c\x90\x1d\x1b\x4e\x87\x7c\ +\x21\x2c\xe3\x2c\x57\xd4\x84\xe0\xf9\x19\x33\x18\x37\x6e\x5c\xca\ +\xe4\x03\x54\x54\x54\x30\x7a\xf4\x68\xe6\xcd\x9b\x17\x97\xa6\x6d\ +\xca\xe8\x4c\xad\xdd\x0a\xee\xec\x08\xb2\x39\x37\x85\x93\x91\xed\ +\x94\xfc\x64\x32\x91\x38\xed\x35\xb0\x67\x9f\x7d\x36\xf9\x0d\x24\ +\x40\x38\x1c\x66\xca\x94\x29\x7c\xfa\xe9\xa7\x91\xa2\x3b\x3f\xe9\ +\x46\xb8\x63\x01\x6c\x66\xfe\xda\x8b\x7c\x01\x3c\xf9\xe4\x93\xbc\ +\xfd\xf6\xdb\x4e\xef\x20\x21\x64\x59\xe6\xbe\xfb\xee\xe3\xf4\xe9\ +\xd3\xae\x94\xd7\x91\xe0\xea\x96\xb0\x58\xd3\x8f\x21\xdc\x5a\xf2\ +\x45\x32\x19\xd0\xdd\xc0\xd7\x5f\x7f\xcd\xeb\xaf\xbf\x9e\xb4\xbe\ +\xf9\xf9\xf9\x5c\x77\xdd\x75\xf4\xed\xdb\x37\xa9\x6c\x75\x75\x35\ +\xcb\x96\x2d\x4b\x2a\xe7\x04\x46\xf7\xd1\x9a\xc3\x0d\xb8\xb7\x2b\ +\x18\x6c\xfb\x01\x6e\x90\x4f\x32\x19\xc3\xb5\xe7\xce\x9d\x8b\x24\ +\x49\xb6\x75\xbd\xe7\x9e\x7b\xf8\xf4\xd3\x4f\x39\x76\xec\x18\x2b\ +\x56\xac\x60\xdf\xbe\x7d\x2c\x5b\xb6\x8c\x82\xc8\xdb\x47\x76\x58\ +\xb2\x64\x49\xc2\xf4\xf8\x6a\x66\x8e\x38\xb7\xe0\x5e\x1f\x20\x41\ +\x27\x10\xab\xb0\x51\xd6\x20\x93\x16\xf9\x86\xa0\xa2\x28\x7c\xf4\ +\xd1\x47\xb6\x75\x1d\x3b\x76\x2c\xf3\xe7\xcf\xe7\x9a\x6b\xae\x31\ +\x6d\xf9\xfa\xe1\x0f\x7f\xc8\x1f\xff\xf8\x47\xdb\x7c\x00\x7b\xf6\ +\xec\x49\x98\xae\x56\xa7\x63\x12\x6d\x07\xf7\x77\x05\x3b\x0d\x27\ +\x23\x3b\x81\x89\x4f\x24\x73\xe2\xc4\x89\xb8\xaf\x86\x18\xf1\xeb\ +\x5f\xff\xda\x92\x1c\x21\x04\x37\xdd\x74\x13\x5d\xbb\x76\xb5\xcd\ +\xdb\xd4\xd4\x64\x19\xdf\xd9\x48\x37\x22\xa3\xcb\xc1\xc9\x4c\xbf\ +\x51\xde\x09\xf9\x09\xf3\x44\x64\x8a\x8b\x8b\xf9\xdb\xdf\xfe\xc6\ +\x97\x5f\x7e\xc9\x91\x23\x47\x38\x72\xe4\x08\x87\x0f\x1f\xe6\xe8\ +\xd1\xa3\xdc\x70\xc3\x0d\x0c\x1d\x3a\xd4\xb6\xdc\xbc\xbc\x3c\x06\ +\x0c\x18\xc0\x57\x5f\x7d\x65\x79\x9b\x2d\x2d\x2d\xf6\xf5\xe9\xa4\ +\xc8\xd8\x4c\x60\xaa\x23\x00\xec\xc2\x38\x27\x5f\xc3\xd8\xb1\x63\ +\xb9\xed\xb6\xdb\x12\xd7\xd5\x86\xc0\xb8\x9d\xc0\x06\x34\x35\x35\ +\x9d\x31\xc4\x6b\xc8\xd8\x96\x30\x0c\xe1\xd6\x0e\x07\x63\xcb\x4c\ +\xd9\x5a\x38\x4c\x3f\x71\xe2\x84\xfe\x4e\xa0\x15\xec\x5c\x40\x6b\ +\xe1\x54\xa9\x32\xb1\x28\x94\xb9\xd5\xc0\x64\xb2\x56\x64\xc7\x86\ +\xd3\xec\x27\x24\x82\xa2\x28\x54\x54\x54\xb0\x7a\xf5\x6a\x76\xec\ +\xd8\x41\x55\x55\x15\x87\x0f\x1f\xa6\xaa\xaa\xca\x64\xe2\xad\x90\ +\x48\x39\x92\xa1\xbd\x17\x94\xec\xe0\x9e\x0b\x70\xd0\xba\x5d\x25\ +\x3b\x05\xf2\x8f\x1d\x3b\xc6\xa2\x45\x8b\x58\xb3\x66\x0d\xeb\xd6\ +\xad\xe3\x64\xcc\x7b\x0c\x99\x40\x67\x71\x15\x6d\xda\x09\x34\xa6\ +\xb7\x05\xf9\xe1\x70\x98\x57\x5e\x79\x85\xe7\x9e\x7b\xae\x4d\x66\ +\xf1\x3a\x0b\xe9\x46\xb8\xdf\x09\x8c\x8b\xcc\xb0\x32\x60\xfd\xe0\ +\xeb\xeb\xeb\xb9\xf9\xe6\x9b\xf9\xf2\xcb\x2f\x93\xd6\xbb\x35\xe8\ +\x8c\xa4\x1b\xe1\x6e\x27\x10\x2c\x7d\xbb\xab\xc3\xc1\xd8\xb0\x05\ +\x01\x4d\x4d\x4d\x8c\x1d\x3b\x36\x29\xf9\x3e\x9f\x8f\x6b\xaf\xbd\ +\x96\x6b\xae\xb9\x86\xe2\xe2\x62\x8a\x8a\x8a\x98\x3e\x7d\xba\xe3\ +\x09\x9f\x33\x01\xee\xee\x0a\x4e\x46\x30\x16\x04\x3a\x4c\x53\x8b\ +\x13\x09\xc3\x1a\xa6\x4e\x9d\x9a\x70\xf9\xd7\xeb\xf5\xf2\xc2\x0b\ +\x2f\xf0\xc0\x03\x0f\xc4\xbd\x93\x37\x2b\xf2\xd9\x5a\x3b\x9c\x29\ +\xc4\x6b\xc8\xc8\x28\x40\x8d\x4c\xd2\x09\xb4\x08\x9b\x83\xa9\x85\ +\x35\x1c\x3b\x76\x8c\x77\xde\x79\xc7\xb6\xae\x79\x79\x79\x2c\x58\ +\xb0\x80\xb1\x31\xdf\x02\xd6\xa0\x7d\x18\x32\x93\xe8\x48\x4a\x94\ +\xb9\x51\x00\xad\x30\xf5\x69\x92\x0f\x30\x67\xce\x9c\x84\xc3\xb5\ +\x7b\xef\xbd\xd7\x96\x7c\x70\x5f\x01\x3a\x12\xd9\x56\x70\x75\x3f\ +\x40\x2a\xa6\xdf\x98\x37\x91\x32\xa4\x42\xbe\x10\x22\xe9\xce\x9f\ +\x1f\xfc\xe0\x07\x09\xd3\x4f\x9d\x3a\x95\x30\x3d\xf6\xeb\xe2\x76\ +\xf5\xe8\x2c\x6b\x03\xae\x2f\x06\x69\x70\x6a\xfa\x5b\x63\x09\xac\ +\xd2\xb4\xaf\x81\xda\x61\xf4\xe8\xd1\xb6\x69\x5b\xb6\x6c\xe1\xf8\ +\xf1\xe3\x09\xf3\xef\xda\xb5\xcb\xf6\xfa\x9d\x85\x74\x23\xdc\xdd\ +\x0f\x00\x96\xad\x1f\x43\x5a\x42\x82\xed\xca\x4c\x76\xed\x48\x39\ +\x4d\x4d\x4d\x49\x09\x4c\x44\xd0\xfb\xef\xbf\x9f\xf4\x5a\xb1\xff\ +\x0b\xd0\x19\x49\x37\xc2\x5d\x0b\xe0\x60\xf6\x0f\xbb\xb4\x34\xfd\ +\x7e\xec\x6a\x9e\xf1\x63\xd3\x56\xd8\xbe\x7d\xbb\x65\x7c\x4d\x4d\ +\x0d\x0b\x16\x2c\x48\x98\x17\xe0\xb3\xcf\x3e\xd3\xaf\xdb\x99\x89\ +\xd7\x90\xb9\x4d\xa1\x49\x3a\x7e\x6e\x98\xfe\xd8\x78\x8f\xc7\xc3\ +\xc0\xc8\xd7\xc2\xed\x30\x63\xc6\x8c\xb8\xdd\x42\x4d\x4d\x4d\xdc\ +\x7a\xeb\xad\x1c\x3d\x7a\x34\x61\x5e\x80\xbf\xfc\xe5\x2f\x6c\xdd\ +\xba\x35\xa9\x9c\x53\xb4\xc7\x36\x30\x23\x32\xb2\x2d\x5c\x8f\xb2\ +\x4b\x4b\xc1\xf4\x3b\x25\x5f\xc3\x90\x21\x43\xec\xeb\x88\xfa\x91\ +\xc8\x9b\x6e\xba\x89\x65\xcb\x96\xb1\x65\xcb\x16\x66\xcc\x98\xc1\ +\xf0\xe1\xc3\x1d\x93\x1a\x0e\x87\xb9\xef\xbe\xfb\xd2\x5a\x18\x72\ +\x83\x50\xb7\x95\x21\x33\x53\xc1\x49\x94\x21\xdd\x8e\x9e\x13\x0c\ +\x1b\x36\x8c\xf9\xf3\xe7\x27\x94\x59\xbd\x7a\x35\xab\x57\xaf\x4e\ +\xfb\x1a\x3b\x77\xee\x64\xed\xda\xb5\xfa\x3f\x99\xd8\xa1\x33\xb8\ +\x88\xcc\x6c\x0b\xc7\x61\x3f\x80\x78\x57\x60\x0e\xa6\xd6\xfa\x01\ +\xc6\x8f\x1f\xcf\xa0\x41\x83\x12\x5c\x31\x31\xce\x39\xe7\x1c\xae\ +\xbf\xfe\xfa\x84\x32\xa3\x46\x8d\x4a\xf8\x27\x4f\x9d\xa9\x7f\x90\ +\x91\x51\x40\xda\x1d\x3f\x53\x52\xea\xe4\x83\xfa\xc9\xf9\x37\xdf\ +\x7c\xd3\xf1\xdf\xb0\x19\x51\x52\x52\xc2\xaa\x55\xab\xf8\xe0\x83\ +\x0f\x38\xff\xfc\xf3\x2d\x65\xee\xbe\xfb\x6e\x56\xae\x5c\x19\xb7\ +\x77\x30\x1d\xd3\xac\x28\x4a\x5a\x87\x9b\x70\xfd\x0b\x21\x26\xa4\ +\xa0\x0c\x4e\x1e\x9c\xd3\x9d\x3e\x57\x5d\x75\x15\x6f\xbe\xf9\x26\ +\x4f\x3c\xf1\x84\xfe\xd9\xf7\x64\xb8\xf6\xda\x6b\x79\xfd\xf5\xd7\ +\xd5\x8f\x43\x0b\xc1\x7b\xef\xbd\xc7\x98\x31\x63\x4c\x13\x43\x53\ +\xa7\x4e\x65\xe6\xcc\x99\xa6\x7a\xa4\x4a\xb8\x65\xdc\x91\x75\x88\ +\xe3\x9f\x43\xc3\x41\x68\x38\x88\x68\x3c\x08\xc1\x7a\xc8\x2b\x46\ +\xc9\x2b\x81\xbc\x52\x28\xff\x11\x4a\xf9\xed\x08\x6f\xb6\x5e\x8e\ +\x2b\x9b\x4c\xdc\x78\x39\x54\xdf\x2a\x95\x68\x18\x28\x04\xde\x13\ +\x5f\x21\x8e\x7f\x81\xdc\xff\xc7\x90\x5b\x68\xbc\x88\x2b\xad\x3f\ +\x36\xbd\xb6\xb6\x96\xa7\x9e\x7a\x8a\x77\xdf\x7d\x97\x50\x28\x14\ +\x27\xef\xf1\x78\x18\x31\x62\x04\x13\x27\x4e\xe4\x27\x3f\xf9\x49\ +\x5c\x19\xdb\xb6\x6d\xe3\xc6\x1b\x6f\xa4\xbe\xbe\x9e\x57\x5e\x79\ +\x85\x87\x1e\x7a\x28\xa5\xfa\x40\x3c\xe9\x7a\x58\x0a\x22\xf6\xbd\ +\x8b\xa8\x78\x19\x6a\xad\x37\xa1\xc6\x95\xd5\xfb\x7a\x94\xb1\x2b\ +\x4c\xf5\x17\x1d\xe1\x43\x91\x46\x05\x48\xd4\xd9\xcb\x3a\xb4\x04\ +\xdf\x8a\x7b\x20\xfb\x1c\xa4\x41\x13\x91\x2e\x9d\x84\x92\x53\xe8\ +\xa8\x45\xa5\xbb\xcf\x0f\x20\x14\x0a\xb1\x7f\xff\x7e\x76\xed\xda\ +\x45\x4d\x4d\x0d\x05\x05\x05\x14\x16\x16\x32\x74\xe8\x50\x8a\x8a\ +\x8a\x12\x96\xd1\xdc\xdc\x4c\x6e\x6e\xae\xfe\x17\x32\x4e\xea\x62\ +\x7c\xa6\x96\xcf\x77\xdf\x7b\x78\x3e\x7b\x02\x9a\xab\xe3\xd3\x12\ +\xa1\x4b\x19\xd2\x7d\xd1\x7f\x3e\xf1\x7a\xbd\x1d\x48\x01\x92\xb4\ +\x7e\xed\xdc\xfb\xed\x22\x7c\xeb\x26\x40\xb0\x01\x7c\xdd\x90\x06\ +\x4d\x40\xba\xf4\x31\xc8\xeb\xa1\x5d\xcf\xaa\x0e\xc9\xea\xd8\xaa\ +\x74\xa7\x32\xc9\xe4\xec\x88\x8f\x7d\xc6\xa2\xe2\x65\xa8\xdb\x03\ +\x79\x25\xd0\xa5\x04\x25\xaf\x58\x3d\xcf\x2d\x82\x70\x0b\x04\xeb\ +\x11\x0d\xdf\x22\x76\xbd\x85\xa8\xd9\x1c\xcd\x98\x9d\x4f\x78\x7c\ +\xad\x5e\x8f\x0e\xa7\x00\x8e\xe6\xff\x85\xc0\xd3\x70\x00\xdf\x27\ +\x3f\x43\x7c\xb7\x4d\x8d\xf3\x75\x45\xba\xe4\x61\xe4\xcb\x9f\x80\ +\xbc\x62\xab\x3a\x24\xaa\x5f\xb2\xfa\x27\x4c\x77\x43\xc6\x09\xf1\ +\xb6\xfe\x3f\x09\x7c\x6f\x97\x41\x40\xed\xc7\x28\x65\x23\x08\xdf\ +\xb6\x46\xaf\x4b\xc7\xfa\x3e\x80\x1d\x2c\x66\x00\x95\xee\xe5\x04\ +\xc7\xae\x46\x1a\xf4\xb0\x1a\x19\x6a\xc2\x5b\x31\x0b\xdf\x5f\x2e\ +\xc6\xfb\xf9\xaf\xa1\xa5\xc6\x90\x3d\xb3\xc3\x29\xb7\xc8\x77\xd2\ +\x73\xb7\x4d\x0f\x07\xa0\x76\x2b\x8a\xff\x24\xb2\x2c\x9b\x0e\xa5\ +\xfb\x05\xd1\x6b\x15\x0e\x72\x7d\x34\xe0\xda\x3c\x80\x23\x9a\x8c\ +\x0f\xd2\x9b\x83\x74\xcd\x4b\x84\xc7\x2c\x84\xec\xee\x6a\x5c\xa8\ +\x09\xcf\x57\xb3\xf1\xfd\xb9\x9c\xac\x65\x63\xf1\xec\xf9\xb3\xda\ +\x1b\xb6\x2d\xae\xfd\x5c\x83\x1d\xc1\xc6\x34\x2b\x39\x45\x51\x74\ +\x72\xc5\xf1\xcf\xf1\x7e\x36\x09\xdf\x9f\xfb\xe1\x7b\x7f\x04\x59\ +\x4b\x6e\x8a\x2f\xf7\x74\xf4\x7f\x87\xe4\x82\x41\xa6\xfc\x6e\xc0\ +\xfd\x61\x60\xa2\x39\xff\x18\x39\x00\xb9\xfc\x4e\x42\x3d\xae\x20\ +\x6b\xe5\x4f\x11\xdf\x45\x7a\xc3\x72\x08\x51\xf9\x31\xde\xca\x8f\ +\x61\xdd\x23\x28\x7d\x6e\x40\xbe\xf0\x2e\x94\xf3\x7f\x04\xbe\x6e\ +\x91\xec\xed\x4b\x7e\xa2\xdf\x84\x69\xf5\x07\xf0\xee\xfb\x2b\xde\ +\xbd\x7f\x45\x34\x98\x97\xae\xe5\x92\xe1\x26\xe5\xf1\x34\x1d\x46\ +\xb4\x44\x56\x37\x3d\x59\x84\xfb\xfd\x07\x8a\x2c\xbb\x6a\x15\x33\ +\x3e\x0f\x60\x3c\xb7\x55\x8c\xfc\xfe\x84\x6f\x5f\x87\x77\xc3\x54\ +\x3c\x3b\xff\x60\x2e\x43\x0a\x20\x0e\x2e\xc1\x7b\x70\x09\x64\xe5\ +\xa1\xf4\xfd\x3f\xc8\x17\xde\x05\xe7\xdf\x02\x59\x5d\x6c\x2e\x9b\ +\x19\xf2\xd3\x21\x5c\x51\x14\x38\xb9\x0b\xcf\xd1\xd5\x78\xf7\xff\ +\x1d\xcf\xf1\x8d\xf1\xe5\x76\xe9\x49\xf0\xea\xe7\x08\x97\xdf\x0d\ +\x86\x96\x2d\xaa\xa3\x9b\x5b\xc2\x7d\x6e\x41\xce\x2b\x85\x88\x82\ +\x74\xa8\xb5\x00\xbb\xce\x5f\xb2\xd6\x6f\x82\x37\x07\xe9\xfb\x2f\ +\x23\x0f\xb8\x07\xef\xe6\xe7\x10\x55\xab\xe2\x65\xc2\x2d\x88\x03\ +\x1f\xe0\x3d\xf0\x01\xf8\xba\xa2\xf4\xba\x16\x4a\xae\x44\x29\x1e\ +\x8a\x52\x3c\x14\xba\xf6\x6a\xd5\x7d\x44\xab\xe7\x9c\x7c\xab\x5f\ +\x71\x6a\x0f\x9e\xa3\x6b\x11\x47\xd6\xe2\x39\xf6\x19\xa2\xc5\xe6\ +\x6d\x65\x8f\x8f\xe0\x25\x8f\x10\xba\xe2\x57\x28\x59\x5d\xe3\xfe\ +\x16\xc6\x7b\xe0\x03\xfd\x3c\x34\x70\xbc\xea\x36\x22\x75\x73\xab\ +\x0f\x90\x39\x0b\x90\x68\x9a\xd7\x24\x66\x96\x53\xca\x46\x12\xbe\ +\x75\x19\x9e\xe3\x1b\xf1\x7c\xf9\x1c\xa2\xea\x13\xeb\xf2\x43\x4d\ +\x88\x43\xcb\xe0\xd0\xb2\x68\x79\x5d\x7b\xa2\xf4\x18\x0a\xa5\x57\ +\x46\x14\xe3\x4a\xe8\x52\x16\x53\xad\xd4\xad\x83\x2d\xd9\x52\x08\ +\xd1\xf8\x2d\xd4\xed\x41\xd4\xed\x41\xd4\x6e\x45\x1c\x5d\x17\x35\ +\xdb\x09\x10\xee\xf5\xef\x04\x86\xff\x0e\x39\x5f\xfd\xbb\x7a\x25\ +\xc6\xa7\x8b\x40\x1d\x59\x47\x56\x02\x20\x77\xbf\x90\x70\xcf\xd1\ +\x7a\xeb\x77\x72\x1f\x4e\x91\x59\x17\xa0\x21\xc5\xca\x0a\x21\x50\ +\xca\x46\x22\xfd\x68\x19\xa2\x7a\x23\x9e\xcd\xcf\x21\x0e\xaf\x4c\ +\x9e\xb1\xe9\x18\xa2\x69\x29\x1c\x5a\xaa\x96\x03\xd0\xb5\x17\x4a\ +\xe1\x60\xc8\xeb\x81\xc8\x2d\x84\xdc\x42\x94\xec\x7c\xc8\x29\x50\ +\x67\x23\x73\x0a\x20\xb7\x00\x72\x0a\x11\x79\x85\x80\x07\x42\x8d\ +\x10\x6c\x84\x50\x23\x4a\xa0\x41\x0f\x8b\x40\x1d\x9c\xda\x87\xa8\ +\xdb\x03\xa7\xf6\x20\x1a\xbe\x05\x39\x7e\x86\x31\x11\xe4\x6e\xfd\ +\xf0\x0f\x7b\x9e\x70\xdf\x5b\x80\x78\xe2\x35\xf8\x0e\x7e\x00\x52\ +\x10\xbc\x39\x34\x8f\x9a\x87\x2c\x2b\x80\xd2\x81\x2d\x40\x6b\xcc\ +\x7f\x02\x28\x65\x23\x90\x6e\x5d\x8a\x38\xfe\xb9\x6a\x11\x0e\xaf\ +\x48\x9e\xc9\x88\xa6\xa3\x88\x26\xf3\x46\x8f\x54\x6a\xe0\x4e\x3b\ +\x13\x84\x4b\x47\x11\x1a\xf0\x33\x82\xfd\xc6\x82\x37\xd7\xd4\x9a\ +\x21\x9e\x50\xdf\xfe\xbf\x01\xd0\x74\xf5\xef\x09\x15\x5d\x85\x30\ +\xba\x18\xf3\x33\x54\x0c\x47\xca\xc8\x8c\x05\x48\xd3\xfc\xdb\xc5\ +\x01\x28\xa5\xdf\x43\xfe\xd1\x52\xc4\xf1\x4d\x88\xcd\xcf\x23\x2a\ +\x97\x83\x62\xff\x1d\xa0\x8e\x00\xa5\x6b\x6f\x82\xfd\x7f\x4a\xe8\ +\xc2\x9f\x22\x75\xeb\xa7\xc6\x29\x8a\x89\x7c\xab\x96\xec\x39\x5d\ +\x49\x56\xed\x17\xf8\xff\x6d\x22\x81\xf2\x71\x71\xa6\x5f\x51\x14\ +\xe3\xd4\xb4\x62\x71\x38\x46\xe6\x5d\x80\xcb\x13\x39\x4a\xe9\x70\ +\x94\x5b\x16\x43\xcb\x77\x88\x03\x1f\x20\xf6\xfd\x1d\x71\x74\x5d\ +\xc7\x51\x06\x6f\x0e\xe1\xbe\xb7\x12\xbc\xf0\x3f\x09\xf7\xbc\x0e\ +\x05\x61\x4b\xba\xc9\x02\xa8\x11\x00\x08\x39\x4c\xf3\xe0\x27\x69\ +\x1e\x3c\x59\x1d\x15\x18\xac\xab\x66\x01\x0c\x79\x65\x40\x8a\xfc\ +\xca\xa4\xa8\x04\xae\xbd\x1d\x6c\xdb\xca\x63\xe4\xd2\xbf\x44\x4c\ +\xde\xbc\x1e\x28\x83\x1e\x44\x19\xf4\x20\x34\x1f\xc7\x73\x70\x31\ +\x1c\x5e\x8d\xa8\x5e\x0f\x4d\xc7\xd2\xbe\x4e\xca\xf0\xe6\x20\x17\ +\x5d\x8e\x54\x3c\x0c\xa9\x64\x18\xe1\x9e\xd7\x21\xfb\xf2\x0d\xe3\ +\x79\xfb\xc9\x22\xab\x5f\x00\xb9\x4b\x5f\x42\x83\xa6\xa0\xc8\x0a\ +\x42\xa8\x7d\x04\xed\xfe\x35\xf2\x85\x10\x6c\xdd\xba\x75\x37\xea\ +\x94\x6f\x08\x08\xd3\x6e\x0a\x60\x44\xa2\x79\x7b\x93\x58\xea\x8b\ +\x3e\xb6\xe5\x76\x2d\x43\x19\xf4\x10\x0c\x7a\x48\xbd\xf3\xfa\xfd\ +\x88\x63\xeb\xe1\xd8\x7a\xc4\x89\x7f\x41\xfd\x7e\xf0\xbb\xf3\x4d\ +\x00\xe5\x9c\x7e\xc8\x25\x57\x23\x97\x0c\x43\x2a\xbe\x1a\xa9\x60\ +\x08\x8a\xc7\x97\x70\xe6\x4f\x8f\x57\x4f\x6c\x66\x0a\xc1\xc8\x9b\ +\x51\x21\x84\xf0\x20\x04\xfa\x86\x93\x86\x86\x06\xea\xea\xea\xfc\ +\x3f\xfe\xf1\x8f\xe7\xa1\xce\xfb\x07\x80\x20\x69\x28\x41\xdb\x4d\ +\x04\xb5\x25\xf2\xfb\xa3\xe4\xf7\x87\x81\x3f\x8f\xd6\x21\x70\x4a\ +\x55\x84\xfa\x7d\xd0\x78\x08\x11\xe9\xe5\x13\x3c\x1d\xed\xf5\x0b\ +\x01\xb9\x3d\x50\x72\x8b\x50\x72\x0a\x55\x2b\x93\x5b\x84\x92\x53\ +\x04\x79\x3d\x90\x73\x4b\x50\x72\x0a\xd5\x39\x7a\x87\x73\xfe\x46\ +\x59\x73\x1a\x80\xa2\x4f\xe9\xca\x31\x6e\xc2\x08\xe1\xf1\xe0\x11\ +\x82\x60\x30\x48\x7d\x7d\x3d\x7e\xbf\x5f\x7a\xf4\xd1\x47\x9f\x3d\ +\x74\xe8\x50\x2d\xd0\x04\x34\xa3\x2a\x41\x08\xd5\x1d\x44\x74\x2d\ +\xf9\x50\xc1\xfd\xff\x0c\xb2\x4d\x70\xd1\xfc\xa7\x93\x96\x73\x2e\ +\x94\xa8\xf3\x03\x76\xf5\xb1\x22\xca\x78\xee\xf4\xd0\x49\x35\x90\ +\x1f\xab\x34\x51\xc2\x41\x51\xb4\xc5\x1f\x05\x45\x89\xca\xa9\x2d\ +\xde\x83\xd7\xeb\xc1\xef\xf7\xd3\xd2\xd2\x42\x30\x18\x54\x5e\x78\ +\xe1\x85\xd9\x5b\xb6\x6c\x39\x04\x34\x46\x8e\x26\xc0\x4f\x8c\x02\ +\x38\x41\xe6\xde\x0e\xc6\xbe\x2f\xe0\xa6\xf9\x77\x0b\x76\x43\xb2\ +\x74\xc8\xd7\x0e\x49\x92\x4c\x71\xd1\x73\x25\x4a\xba\xa2\xa0\xc8\ +\x32\x92\x2c\x23\x4b\x92\x2e\x07\xea\xfe\x46\x9f\xcf\x47\x20\xe0\ +\x27\x18\x0c\x12\x0c\x06\x99\x3f\x7f\xfe\xdb\xff\xf8\xc7\x3f\xb6\ +\x03\x0d\xa8\x4b\xbf\xb1\x0a\x20\xe3\x60\x19\x58\x43\x46\xbe\x0f\ +\xd0\x56\x70\xc5\x32\x18\xe0\xb4\xd5\xdb\xa5\x6b\x44\x87\xc3\x61\ +\x24\x49\x22\x14\x0e\x13\x0e\x85\x91\x65\x09\x29\x42\xae\x2c\x2b\ +\xc8\x8a\xac\x92\x2e\x49\x84\xc3\x12\x8a\x22\x13\x96\x24\x64\x49\ +\x26\x2b\xcb\x4b\x7e\x7e\x3e\x79\x79\x79\xc8\xb2\x4c\x20\x10\x20\ +\x18\x0c\x12\x08\x04\xf8\xe4\x93\x4f\x96\xfc\xe1\x0f\x7f\x58\x87\ +\x4a\x7a\x3d\xaa\x12\x34\xa2\xf6\x03\x82\xa4\xd8\xfa\xa1\xad\xa6\ +\x82\x33\x64\xfe\xdd\x82\x91\x58\x2d\x6c\x95\xee\xa4\xe5\x87\xc3\ +\x61\x9d\xb0\x60\x30\x48\x28\x14\x22\x18\x0c\xa9\x0a\xa0\xc8\x51\ +\x45\x90\x54\xa5\x08\x4b\x12\x8a\xac\x50\x58\x58\x40\x49\xcf\x9e\ +\x74\xe9\xd2\x85\x50\x28\xa4\xe7\xd7\x8e\x8a\x8a\x8a\x4d\xd3\xa6\ +\x4d\x5b\x84\x4a\xf8\x29\xa2\x0a\xa0\xf9\x7f\xbd\x03\xe8\xb4\xf5\ +\x43\x5b\x4d\x05\x1b\xd0\xde\xe6\x3f\x95\x9d\x3d\x89\x5a\xbc\x55\ +\x9c\xda\xa2\xc3\x04\x02\x01\x9a\x9b\x9b\x69\x6e\x6e\xc6\xef\xf7\ +\x13\x08\x04\x0c\x64\x47\x5d\x43\x41\x41\x01\x7d\xcf\x3b\x8f\x5e\ +\x3d\x7b\x22\x84\x30\xb5\x76\xe3\xef\xbe\x7d\xfb\x76\x3d\xf1\xc4\ +\x13\x6f\x10\x6d\xf9\xb1\xe4\xeb\xbe\x3f\x15\xf2\x21\x83\x1f\x89\ +\x72\x34\x2d\xdc\x9a\x6b\xb5\x62\x9b\x98\x11\x89\x5a\xbf\x53\x25\ +\x30\xfa\xfc\x50\x28\x84\xdf\xef\xa7\xa9\xa9\x89\xc6\xc6\x46\x02\ +\xc1\x20\x1e\x21\xf0\xf9\x7c\x74\xe9\xd2\x85\x82\x82\x02\x4a\x4b\ +\x4b\x29\x2d\x2d\x45\x51\x14\x5b\xd2\xb5\xdf\xaa\xaa\xaa\xca\x49\ +\x93\x26\xcd\xf5\xfb\xfd\x1a\xf1\xa7\x50\xc9\xd7\xfc\xbe\x6e\xfa\ +\x53\x25\x1f\x32\xf0\x85\x90\xce\x0a\x2b\xe2\x8d\xe7\x4e\x47\x04\ +\x9a\x0b\x68\x69\x69\xc1\xef\x0f\x70\xdb\x6d\xd6\x5f\x23\xd1\xe4\ +\x12\x1d\xb5\xb5\xb5\x35\x53\xa6\x4c\x79\xb1\xae\xae\xee\x04\x66\ +\xf2\x4f\x63\xf6\xfb\x72\x3a\xe4\x43\xa6\xf6\x04\xba\xa4\x0c\x6e\ +\xbb\x86\xb8\xa5\x67\x0b\x5f\x6f\x3c\x77\xa4\x04\x91\xb0\xe6\xdb\ +\x35\x2b\x10\x08\x04\x6d\x1f\x43\x6c\x3f\xc1\xea\xb7\xbe\xbe\xbe\ +\xe1\x99\x67\x9e\x79\xb1\xb2\xb2\xb2\x9a\x28\xf9\xf5\xa8\xe4\xa7\ +\x35\xe4\xb3\x42\x9b\x6c\x0a\x4d\x9c\x9c\x59\x92\x93\xc1\xae\xc3\ +\x67\x77\x1e\x17\x36\x8c\xef\x25\xad\x67\x2f\x49\x84\xc3\x21\x7c\ +\x16\xff\x43\xe8\xa4\xe5\x9f\x3e\x7d\xba\x65\xe6\xcc\x99\x2f\x55\ +\x54\x54\x1c\x22\x9e\xfc\x56\x75\xfa\x62\x91\x79\x05\x30\xc0\x2d\ +\xb2\xdd\x56\x1a\xab\xe7\x97\xac\x5f\x60\x3c\xd7\x47\x02\x92\xaa\ +\x00\x52\x38\x4c\x28\x1c\x26\x27\x3b\xc7\x54\xa6\x24\x49\x3a\xc9\ +\x76\xad\xbf\xb9\xb9\x39\x3c\x6f\xde\xbc\x57\xd7\xae\x5d\xbb\x07\ +\x33\xf9\x8d\xa8\xe4\x9b\xa6\x7c\x5b\x43\x3e\x64\xe2\xe5\xd0\x04\ +\xe7\xed\x09\x27\xe6\xdf\xae\x95\xdb\x9d\x1b\x5d\x80\x66\xfe\x8d\ +\xbf\x05\x05\xe7\xea\xe5\x4b\x92\x94\xb4\xc3\xe7\xf7\xfb\xe5\x05\ +\x0b\x16\xbc\xf1\xe1\x87\x1f\x6e\xc3\x9a\x7c\xad\xc7\xef\x0a\xf9\ +\xd0\xc6\x16\x20\x15\xb4\xd5\xf8\x3f\x59\x5a\x52\x25\x90\xcd\x73\ +\x01\xe1\xc8\xf8\x5e\x0a\x87\x29\x2d\x53\xb7\xa3\x19\x5b\x7e\xa2\ +\x63\xf1\xe2\xc5\x7f\x7d\xeb\xad\xb7\x36\x10\x9d\xe5\x33\xce\xf4\ +\xb9\x66\xf6\x8d\xe8\xb0\x0a\x90\x0e\xd2\x51\x9a\x44\xe6\xdf\xca\ +\x0d\xc4\xb6\x7e\x6d\x41\x47\x55\x00\x95\xf8\x70\x38\x8c\x2c\xcb\ +\x94\x95\x96\xea\xe4\x27\x6b\xfd\x6b\xd6\xac\x59\xf2\xe2\x8b\x2f\ +\xae\x20\xda\xf2\x8d\xc3\x3d\x8d\xfc\xb4\x87\x7b\x76\xc8\xd8\x07\ +\x22\x3a\x13\xec\x88\xb6\x8b\x53\xa2\x09\x3a\xf9\x92\x24\x23\x49\ +\x72\xa4\x03\x18\xa6\xb0\x50\x7d\xe9\xd5\x49\xcb\xdf\xb6\x6d\xdb\ +\xba\x69\xd3\xa6\xfd\x1d\x95\x70\x3b\xb3\xef\x3a\xf9\x90\x09\x0b\ +\xd0\x01\x5e\xe5\x4a\x96\xc7\xae\xd5\x3b\x22\x5f\x89\x2e\xdb\x46\ +\x4d\xbf\x3a\xbf\x1f\x96\xd4\xd6\x1f\x0e\x87\x39\xef\xbc\xf3\x92\ +\xb6\xfa\x40\x20\xc0\xee\xdd\xbb\xb7\x4c\x9e\x3c\xf9\x6d\xcc\xe4\ +\x1b\x27\x7a\x5c\xf5\xf9\xb1\x68\x57\x17\xd0\x9e\x2b\x80\x4e\x9e\ +\xa5\x25\xf9\xc4\x76\x18\x89\xce\xf1\x4b\x12\xe1\x50\x08\x49\x92\ +\xe9\xd3\xa7\x4f\x52\xf2\xb7\x6d\xdb\xb6\x6e\xc2\x84\x09\x73\x25\ +\x49\x32\x9a\x7d\xab\xb1\x7e\xda\x13\x3d\xc9\x90\x59\x05\xe8\xe0\ +\xae\xc1\x89\xff\x4f\xf6\xdc\x15\x45\x56\x5d\x81\x24\x11\x0a\x85\ +\x09\x85\xc2\x14\x97\x14\xe3\xf1\x78\x12\x9a\xfd\x35\x6b\xd6\x2c\ +\x79\xec\xb1\xc7\xde\x92\x24\xe9\x14\x50\x47\x94\xfc\xd8\x29\xde\ +\x8c\x91\x0f\xed\xb0\x18\xd4\x91\x91\xca\xa8\x40\x6d\xf9\xd1\x5f\ +\x49\x96\x91\x64\x09\x49\x0a\xd3\xab\x67\x4f\xdb\x56\x1f\x08\x04\ +\xe4\xc5\x8b\x17\xff\x75\xd6\xac\x59\xcb\x89\x9a\x7d\xd7\xa7\x78\ +\x9d\xa2\xcd\x14\xa0\xbd\x37\x7c\xd8\xc1\xe9\x28\xc0\x22\x67\xa4\ +\x2f\x20\x47\x4c\x7f\x98\x70\x28\x84\xd7\x9b\xc5\xb9\xe7\x9e\x6b\ +\xd9\xea\x5b\x5a\x5a\xc2\x0b\x16\x2c\x78\xe3\x8d\x37\xde\x58\x4f\ +\x74\x98\x67\xec\xed\xb7\x29\xf9\x70\x06\x59\x80\x4c\x2a\x58\x22\ +\x85\x88\xae\x03\xa8\x93\x3f\x25\x25\xc5\xa6\xf5\x7c\xed\xb7\xb1\ +\xb1\xb1\x65\xee\xdc\xb9\xf3\x16\x2d\x5a\xb4\x0d\xfb\x0e\x9f\x4e\ +\x7e\xc6\x6e\x26\x06\x67\x8c\x02\xb4\x15\xa2\xe3\x7f\xd4\xad\x5d\ +\xa8\x2e\x40\x8e\x6c\xeb\x2a\x28\x28\x88\x23\xbf\xae\xae\xae\x61\ +\xe6\xcc\x99\xb3\xd7\xac\x59\xf3\x0d\xf1\x33\x7c\xb1\xfb\xf9\xda\ +\xa4\xe5\x6b\xc8\xa8\x02\x74\x4c\xa3\x6f\x8d\x54\x9f\xb9\x71\xe3\ +\xa7\x2c\xa9\xe4\x77\xeb\xd6\xcd\xb4\xb1\x23\x18\x0c\x52\x53\x53\ +\x53\xf3\xf4\xd3\x4f\xcf\xb2\x58\xd8\xb1\x1a\xe7\xb7\x29\xf9\x70\ +\xd6\x02\xb4\x0a\x46\xae\x84\x10\xe4\x77\xef\x6e\x6a\xfd\x55\x55\ +\x55\x95\x8f\x3f\xfe\xf8\xac\xca\xca\xca\x63\x44\x7d\xbe\xdd\xdc\ +\x7e\x9b\x93\x0f\x67\x15\xc0\x15\x08\x8f\x20\x2f\x37\xd7\xd4\xfa\ +\xf7\xee\xdd\xbb\xeb\xd1\x47\x1f\x7d\x39\xb2\x99\x43\x6b\xf5\x76\ +\x4b\xba\xed\x42\x3e\x64\x58\x01\x14\x3a\x8f\x1b\x88\x79\xdf\x2e\ +\xa1\x1c\x8a\xb6\x67\x3f\xfa\xb6\x4e\x76\x76\xb6\x4e\xfe\xb6\x6d\ +\xdb\x3e\x9f\x34\x69\xd2\xeb\x7e\xbf\x5f\x23\x5e\xeb\xe9\x1b\x77\ +\xf0\x66\x64\x6e\x3f\x55\x9c\x51\x8b\x41\x99\x86\xfe\x7e\x9e\x21\ +\xec\x11\x82\x2c\xaf\x57\xf7\xf9\x2b\x56\xac\xf8\xc7\x83\x0f\x3e\ +\xf8\xaa\xdf\xef\x3f\x09\x68\x87\xa6\x00\x19\x9f\xdb\x4f\x15\x67\ +\x8c\x0b\x50\x94\xf4\xbe\x9b\x93\xa8\xe5\x1b\x5f\xc4\xb4\x92\xd1\ +\xde\xdc\x89\x90\xaf\xbc\xf3\xce\x3b\x6f\xce\x9d\x3b\x77\x0d\xe6\ +\xe5\x5c\xe3\x18\xdf\xf4\x12\x67\x7b\x93\x0f\xe9\x29\x80\x62\x38\ +\x1c\x8f\x57\xd3\x25\xa8\x2d\x91\x8c\xf0\x88\x90\x4e\x3c\x42\x21\ +\x14\x0a\x12\x08\x04\xe4\xe7\x9f\x7f\xfe\x7f\x16\x2d\x5a\xf4\x2f\ +\xa2\x63\xfc\x06\xa2\xad\x5e\x23\x5f\x1b\xe3\x77\x08\xf2\x21\x75\ +\x05\x30\x12\x2f\x45\x0e\xbc\x5e\x2f\xb2\xd4\x41\xde\xcf\x4f\x01\ +\x4e\xfc\x7e\xac\x52\x78\x84\x40\x16\x02\x8f\x47\x00\x1e\x4e\x9f\ +\x3e\x1d\x7c\xe4\x91\x47\xa6\x6d\xda\xb4\xe9\x5b\xcc\x2d\xff\x34\ +\xd1\xb5\x7c\xd3\x04\x4f\x47\x21\x1f\x52\x53\x80\x58\xf2\x43\xa8\ +\x37\x46\xb6\xcf\x07\x3e\x9f\xfb\xb5\xcb\x10\xb4\x8e\x5b\x6b\x51\ +\x51\x51\xb1\xeb\xce\x3b\xef\x7c\xe5\xc0\x81\x03\x35\x44\xc9\x37\ +\xce\xe9\xfb\x89\x76\xf6\x3a\x1c\xf9\x40\x4a\xdf\x0a\xf6\x02\x39\ +\x40\x37\xe0\x5c\xa0\x30\xf2\xdb\x35\x12\x9f\x45\xe7\xe9\xf4\xb7\ +\x06\xc6\x46\x10\x40\x25\xfa\x34\xd1\x5e\xbe\xe6\xef\x3b\xc4\x30\ +\x2f\x19\x9c\x5a\x00\xad\xf5\x4b\xa8\xad\xbe\x05\xf5\x66\x41\xd5\ +\xf2\x6c\x54\x05\x81\x33\x5f\x09\x34\x05\x08\x13\x7d\x16\xcd\x44\ +\xc7\xf7\xc6\x39\xfd\x0e\xd1\xd3\x4f\x84\xa4\x0a\xa0\x28\x8a\x12\ +\xb1\x02\xda\x8d\x87\x50\x6f\x14\xd4\x1b\xcd\x41\x25\xdf\xc3\x99\ +\x4f\x3e\x58\xbb\x41\x7f\xe4\x30\x4d\xeb\xd2\xc1\xc9\x07\x07\x2e\ +\x40\x17\x14\xc2\x83\x4a\xb2\x17\xf5\xd3\xf1\xd9\x91\xdf\x2c\xcc\ +\xe4\x9f\xc9\x4a\xa0\x18\x7e\x8d\x4a\xa0\x0d\xef\xf4\xc9\x1d\x3a\ +\x01\xf9\x90\x7a\x27\x50\x36\x9c\x6b\x3e\x50\x23\xff\x4c\x26\x3e\ +\x16\xc6\x0e\xb1\x76\xe8\xad\x1e\x3a\x5e\x67\xcf\x0e\x8e\x2d\x00\ +\x98\x3a\x84\xc6\x03\xfe\x77\x91\xaf\xc1\x68\x0d\xf4\xa3\xb3\x10\ +\xaf\x21\x25\x05\x00\x5d\x09\xf4\xa0\xbb\xd5\xe9\x94\xe8\x54\x2d\ +\x3e\x16\x29\x2b\x80\x65\x21\x1d\x7d\x8a\x2f\x03\xe8\xac\x84\xc7\ +\xe2\xff\x03\x8b\x04\xf0\x49\x6a\x2c\xa5\x0d\x00\x00\x00\x00\x49\ +\x45\x4e\x44\xae\x42\x60\x82\ +\x00\x00\x1c\x4b\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x80\x00\x00\x00\x80\x08\x06\x00\x00\x00\xc3\x3e\x61\xcb\ -\x00\x00\x00\x06\x62\x4b\x47\x44\x00\x00\x00\x00\x00\x00\xf9\x43\ -\xbb\x7f\x00\x00\x05\x95\x49\x44\x41\x54\x78\xda\xed\x5d\xc1\x6a\ -\x25\x45\x14\x3d\xd5\x69\xd1\x30\x82\x82\x0b\xa1\x47\x88\x9b\x2c\ -\x14\x5c\x48\xe1\x07\x08\x32\x2b\x41\x44\xc1\x9d\x0b\xc1\x45\xb2\ -\x57\xf0\x0f\xfc\x00\xc1\xac\xdd\x89\x2e\x5c\xa9\x2b\x71\x40\x44\ -\x1c\x0a\x92\x85\x0c\x48\x22\x44\x85\xde\x08\x2a\x12\x83\x3a\xe9\ -\x76\x31\x79\x43\xa7\xd2\xd5\xaf\xfa\xbd\x7e\xdd\xf7\x56\x9f\x03\ -\x43\x42\x32\x79\xdd\xef\x9e\x53\xa7\xee\xbd\x5d\xaf\x0a\x20\x08\ -\x82\x20\x08\x82\x20\x08\x82\x20\x08\x82\x20\x08\x22\x7d\x18\x09\ -\x37\x61\xad\xbd\x09\xe0\x16\x80\x1d\x00\x8f\xcd\x28\xfe\x7f\x03\ -\xf8\x15\xc0\xd7\xce\xb9\xbb\xb3\x13\x80\xb5\xf6\x19\x00\xef\x03\ -\x78\x19\x40\x36\xf3\xc1\xf8\x3d\x80\x77\x9d\x73\xb7\xc7\xbc\xe8\ -\xd6\x84\xe4\xbf\x06\xe0\x73\x00\xcf\x49\x71\xa2\x89\x71\x13\xc0\ -\x9b\x45\x51\xfc\x5b\x96\xe5\x37\x49\x0b\xc0\x5a\xfb\x22\x80\xcf\ -\x00\x3c\x42\xde\xaf\x39\xf2\x4b\x45\x51\xfc\x56\x96\xe5\x9d\x24\ -\xa7\x00\x6b\xed\x36\x80\x1f\x01\x3c\x45\xbe\x83\xf8\x07\xc0\xb3\ -\xce\xb9\x9f\x36\x7d\xa1\x29\xe6\xdd\xb7\x49\xfe\x52\x3c\x0c\xe0\ -\xbd\x31\x2e\x34\x85\x00\x5e\x27\xbf\x51\x78\xd5\x5a\xbb\x95\xa2\ -\x00\x9e\x27\xb7\x51\x78\xe2\xb2\x2c\x4e\x47\x00\xd6\xda\x1b\x00\ -\x1e\x25\xb7\xd1\x78\x32\x35\x07\x78\x88\x9c\xca\x8a\x57\xc6\x18\ -\xcf\x1b\xb9\xa4\x9b\xd9\xde\xde\xc6\xce\x4e\xdc\xb4\x67\xcc\xfd\ -\x0a\x36\xcb\x32\x18\x63\x50\xd7\xf5\x95\x7f\xd2\x71\x7e\x7e\x8e\ -\xd3\xd3\x53\x0a\xa0\x89\xdd\xdd\x5d\x1c\x1c\x1c\xcc\x62\xe4\x1d\ -\x1d\x1d\x61\x6f\x6f\x8f\x02\x58\x07\x0b\x17\xf0\xa1\xc1\x01\x38\ -\x05\x0c\x40\x7c\x53\x00\x8b\x69\xa0\xf9\x3d\x85\x90\xa0\x00\x8c\ -\x31\x57\x04\xe0\x8b\xa0\xe9\x00\x14\x42\x62\x02\x58\x10\xee\x8b\ -\x20\xf4\x7f\x9b\xc4\x53\x04\x89\x39\x40\x88\xf8\xb6\xa9\xa1\xaa\ -\x2a\x8a\x40\xbb\x00\xda\x46\x7f\x28\x19\x6c\x4e\x01\x8b\x52\xb1\ -\xae\x6b\x54\x55\x45\x11\x78\xc8\x52\x23\xbf\xed\x67\x8b\xbf\xcb\ -\xb2\xec\x41\xdf\x80\x50\xe2\x00\x7d\xc9\xef\x4a\x08\x59\x2e\x2a\ -\x13\x80\x4f\xfe\x2a\x23\xf7\x41\x32\x58\x5d\xc0\x64\x5b\xec\x1b\ -\x68\x11\xc0\x32\xf2\xfb\x88\xc1\x18\x83\xfa\x92\xfc\xc5\x6b\xb5\ -\xb5\x8d\xe7\x28\x84\x5c\x1a\xe9\x5d\x75\xbf\x3f\x6a\x7b\x8b\xa0\ -\x41\x70\x5f\x21\xa4\xda\x75\x14\x25\x80\x2c\xcb\xa2\x4a\xbd\x55\ -\x93\x38\x5f\x04\xcd\xd7\x6a\x8a\xa1\x99\x3f\xf4\xb9\x96\x46\x31\ -\x88\x76\x80\x50\xa7\x6f\xdd\x6b\x84\x44\xe0\x27\x8f\x21\x47\xf2\ -\x9d\x44\xf3\x34\x22\xd2\x01\x86\x22\x3b\x46\x68\x3e\x99\x31\x42\ -\xf0\x2b\x0c\xcd\x4e\x90\x4b\x1a\xfd\xcd\x29\x60\x28\xdb\x8f\x15\ -\x43\x88\xb4\x98\x52\xb3\xcd\x55\xb4\x88\x40\x5c\x15\xd0\x95\x6c\ -\x8d\xe1\x0a\xab\x12\xa7\xb5\xcf\x20\x46\x00\xcb\x82\xd5\x45\xfe\ -\x90\xe2\x58\x27\xe9\xd3\x28\x02\x51\xad\xe0\xae\x5e\xfd\xb2\x40\ -\x4e\x11\xe8\x50\x7f\x42\x53\xab\x59\x9c\x00\x34\x66\xd2\x5d\xfd\ -\x0b\xe9\x62\x10\x29\x80\x95\x45\x30\xa1\x70\xfc\x0a\x42\x8b\x13\ -\x88\x12\xc0\x2a\xa4\x5f\xf9\x1b\x81\x01\xa7\x03\xac\x40\x66\xf3\ -\x6b\x6c\x93\x45\x42\xa0\x43\x2e\x20\x59\x04\x62\xd7\x03\xc4\x26\ -\x83\x92\x83\xbb\x6c\xd9\x1a\x05\x10\x21\x02\xed\x09\xa1\x74\x17\ -\x50\xe1\x00\x9a\x45\x20\xdd\x05\x92\x70\x00\xe9\x89\x96\x64\x11\ -\xa8\x58\x13\xa8\x71\xe1\xc6\x3a\x0b\x58\x28\x00\xc5\x39\x80\x36\ -\x87\xca\xb5\x38\x80\x1f\xcc\xae\xc5\x9e\x44\x42\x53\x40\x97\x0b\ -\x68\x21\x5f\xb2\x8b\xa9\xd9\x20\x82\x9f\xf1\x63\x12\xa8\xaa\x24\ -\xd4\xb2\x40\x44\xd5\x16\x31\x5a\x57\xdd\xd0\x01\x06\x74\x01\x8d\ -\xa4\x4b\x76\x2f\x95\x9b\x44\x49\x17\x41\x5b\xcf\x82\x53\xc0\x86\ -\x12\x41\x89\x81\xe5\x8a\xa0\x99\x43\x53\xae\x42\x01\x30\x09\xd4\ -\x0d\x76\x02\x67\x24\x00\x92\x4d\x07\x50\xb7\xec\x9a\x02\x20\x28\ -\x80\x21\x47\xfe\xd0\x9f\x16\xa6\x00\x14\x0b\x80\x98\x89\x00\x48\ -\xfe\x8c\x05\x10\x5a\x5f\xcf\xb5\x00\x33\x10\x80\xf6\x91\xaf\xe1\ -\xc1\x95\x2a\x07\xd0\x0a\xc9\x4f\x31\x33\xe9\xc4\xb7\xd9\xbd\x64\ -\x31\x68\x5b\xb3\xa0\xc2\x01\xb4\x90\xcf\x29\x60\xc3\xe4\x6b\x9c\ -\xff\xa5\x2f\x62\xc9\x48\x3e\xcb\x40\x71\xa4\x87\xca\x3d\xe9\xa2\ -\xd0\xb8\x5c\x2d\x63\x00\x37\x7b\xef\xdc\x1f\x60\x26\xb6\xaf\x75\ -\xb3\x28\xf1\x0e\xa0\x7d\x37\x6f\x3a\xc0\x8c\xa6\x82\xae\x92\x95\ -\x9f\x0e\x5e\x41\x04\xcb\x1c\x81\x0e\x90\x78\x1f\x40\x43\x1d\x1d\ -\x9b\xc7\xd0\x01\x56\x24\x5e\xbb\x0b\x48\x9f\x06\x54\xee\x10\x22\ -\x5d\x04\x9a\xda\xd7\xb9\x06\xf2\x63\x8f\x6b\x31\xf7\xa3\xcd\x24\ -\x36\x25\x07\xe8\x3d\x7a\x04\x04\x5f\x53\x3f\x43\xf5\xf1\xf1\xb1\ -\x22\xa8\x47\x26\x85\x27\x86\x0c\x94\x30\xc5\x6c\xb7\x7a\xed\xe7\ -\x8b\xe0\x37\x5f\x6b\x82\xf7\xc1\x13\x43\x06\x4a\x9e\x7a\x9f\x19\ -\xc8\x1c\x40\x6f\x0e\xd0\x7c\x1a\xa8\xad\x9e\xbe\x7e\x8f\x5c\x0f\ -\x30\x48\xf2\x24\xae\x8e\x8e\x21\xb3\xae\x81\xba\x52\xe1\x0c\xfc\ -\x68\x58\x7f\x95\x46\xf4\x2c\xaa\x2b\x42\xe1\xa2\xd0\x35\xe6\x4e\ -\x4d\x4f\x03\x17\x44\xff\x77\xef\x02\xc8\x72\x15\x6d\x6c\xb1\x07\ -\x46\x4c\x7d\x28\x63\xdb\xe1\x15\xa1\xaf\xcd\xfb\x35\xc6\x20\xcf\ -\xf3\xe0\xef\x59\x05\xf4\x70\x80\xd0\xa9\x9e\x6d\x47\xb7\xfa\xbf\ -\x1f\xa2\x14\x8b\x15\x81\xe6\x6a\x40\xac\x00\x62\x4f\xf0\x0e\x91\ -\x31\x55\xf0\xfd\x4d\x2d\xa5\x4f\x03\xa2\x3b\x81\xd2\xcf\x08\x0a\ -\x09\x57\xd3\xce\xa6\x2a\x1e\x06\xf9\xd6\x2e\xdd\xb5\x34\x6d\x6b\ -\xab\x6e\xbb\xf8\xa1\xe6\xf7\xb1\xa7\x2f\x0a\x60\x43\x01\x96\xe2\ -\x08\x5a\xd7\x31\xaa\x7f\x1a\xc8\x0d\xa3\x13\x12\xc0\xd9\xd9\x19\ -\x0e\x0f\x0f\x67\x11\xf8\xe3\xe3\x63\x0a\xc0\xc7\xc9\xc9\x09\xf6\ -\xf7\xf7\x39\x2c\x47\x04\x9f\x05\x50\x00\x04\x05\x40\x50\x00\x04\ -\x05\x40\x50\x00\x04\x05\x40\x50\x00\x1b\x04\xdb\x76\xc2\xe2\x35\ -\xb6\x00\xfe\x02\x70\x8f\xbc\x46\xe3\x8f\xa4\x04\xe0\x9c\xab\x00\ -\xfc\x4c\x5e\xa3\x70\x31\x46\xac\xa6\xc8\x01\xbe\x20\xb7\x51\xf8\ -\xd6\x39\xf7\x67\x8a\x02\xf8\xf0\x52\xdd\x44\x37\x3e\x48\xb2\x0a\ -\x70\xce\xfd\x30\xd6\x9b\x53\x8c\xaf\x00\x7c\x92\x72\x19\xf8\x0e\ -\x80\x2f\xc9\x73\x2b\xee\x02\x78\xc3\x39\x37\x4a\xc5\xb4\x35\xc5\ -\x3b\x2c\xcb\xb2\x2a\x8a\xe2\x63\x00\x37\x00\xbc\x30\xd5\x7d\x08\ -\x2c\xf9\x3e\x05\xf0\x8a\x73\xee\xf7\xb1\x2e\x3a\xf9\x7a\x2a\x6b\ -\xed\x2e\x80\xb7\x00\xdc\x02\xf0\x34\x80\xc7\x67\x44\xfa\x19\x80\ -\x5f\x00\xdc\x06\xf0\x91\x73\xee\x3b\x8e\x03\x82\x20\x08\x82\x20\ -\x08\x82\x20\x08\x82\x20\x08\x62\x23\xf8\x1f\x8e\x96\x1e\x7d\x49\ -\xfc\xce\x76\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ -\x00\x00\x09\x54\ +\x00\x00\x00\x06\x62\x4b\x47\x44\x00\xff\x00\xff\x00\xff\xa0\xbd\ +\xa7\x93\x00\x00\x1c\x00\x49\x44\x41\x54\x78\x9c\xed\x5d\x7d\x78\ +\x14\xf5\x9d\xff\xcc\xee\x66\x43\x02\x24\x40\x81\x24\x10\x36\x09\ +\x04\xa4\x68\x39\x11\x09\xef\xbe\xa1\xd5\xf3\xb9\xe3\x6a\x78\x17\ +\xa5\x22\x2a\x20\xa0\x28\xa5\xa5\xa5\x16\xc4\xb7\x5a\xb5\xda\x37\ +\x7a\x6d\xef\xec\x95\x0a\x24\x28\xb6\x3d\x78\xee\x7a\x02\x9e\x1e\ +\x28\x04\x4c\x80\x20\xef\x92\xf0\x26\x0d\x21\xef\xd9\xf7\x79\xbb\ +\x3f\x66\x67\x76\x66\x76\x5e\x7e\xb3\x3b\xbb\x6c\x6c\x3e\xcf\x33\ +\xcf\xce\xfc\xe6\xf7\x36\xfb\xf9\xbe\xfd\x5e\x66\x17\xe8\xc6\xdf\ +\x35\xa8\x04\xf2\x5b\x2d\xdb\x0d\xfb\xc1\xeb\x9c\x13\xc3\x65\x21\ +\x2f\x15\x39\x1c\xb2\x73\xf1\xe8\x46\x6a\xc1\xab\x0e\x4e\x96\x6e\ +\x09\xa4\xe4\x89\xc4\x3b\x21\x08\x8d\x33\x72\xc8\x85\xa1\x1b\xa9\ +\x81\x9c\x74\x36\x72\x30\x91\x4f\x0e\x16\x85\x80\xd4\x02\x50\x10\ +\x08\x77\x03\xe8\x01\x20\x33\x72\xee\x42\x54\x08\xba\x91\x1a\x88\ +\xe4\x33\x00\xc2\x00\x42\x00\x82\x91\x73\x51\x38\x88\x41\x22\x00\ +\x72\xed\xef\x01\xa0\x57\xe4\xc8\x82\x20\x08\x8e\xc8\xd1\x8d\xd4\ +\x80\x8b\x1c\x21\x00\x01\x00\xde\x48\xba\xdc\x02\x10\x0b\x81\x15\ +\x0b\xe0\x82\x40\x78\x2f\x00\x7d\x00\xe4\x40\x10\x08\xd1\x0a\x74\ +\x23\x35\x10\xb5\x3f\x08\xa0\x23\x92\x46\x43\x10\x08\xc6\x6a\x65\ +\xf1\xb8\x80\x6c\x08\xe4\xf7\x8d\x9c\x67\xa0\x5b\x00\x52\x09\x0e\ +\x02\xe1\xfe\xc8\x75\x18\x80\x0f\x02\x3f\x96\x5d\x31\xa9\x0b\x10\ +\xdd\x80\x0b\xd1\x38\x20\x1b\x40\x4f\x9e\xe7\xdf\xb4\xda\x68\x37\ +\xec\x03\x45\x51\x53\xa1\x8c\xc5\x28\x24\xc1\x05\x00\xb1\x23\x81\ +\x0c\x08\xc2\x80\x6b\x4d\x4d\x08\x87\xc3\x10\x05\x90\xa2\xa0\x3a\ +\xd7\xba\x16\xd2\xac\x5d\x03\x94\x3a\x41\x5e\x7b\x1c\xf7\xa2\x3d\ +\x33\xce\xa3\xc8\x47\x98\xdf\xb4\x7c\x02\x70\x3a\x9d\xe8\xd5\xab\ +\x17\xa0\x1c\x8d\x59\x86\x15\x17\x20\x3f\x1c\xb2\x03\xe1\x30\x0d\ +\x6b\xe4\x5b\x27\xda\x6e\xe2\x49\x48\x8f\x87\x70\xc3\x1c\x16\x05\ +\xc6\x08\x2c\x27\x0e\xfd\x13\x9b\x93\xb1\x62\x01\x0c\x11\x3f\xd9\ +\x09\x68\x7d\x32\xad\x81\x49\xbe\x98\xbc\x84\x65\xd2\x0d\xb6\x08\ +\x00\x19\xf9\xb1\x2e\xc0\x4c\xcb\x53\x45\x3c\x29\xe9\x89\xb8\x80\ +\x74\x15\x0b\xdb\x2c\x80\x31\xd9\xd6\xb4\xde\x2e\xe2\xcd\xcc\xbc\ +\x65\x37\x90\xa8\x0b\x20\xac\x23\x95\xb0\x49\x00\xe2\x27\x9f\x44\ +\xeb\x0d\x09\xb6\x48\xbc\x19\xa1\x56\xb4\x5c\xf7\x4e\x9a\x91\x6c\ +\x04\xdb\x5d\x00\x39\xd9\x64\xbe\xde\xb2\x40\xc4\x71\x4f\x71\x9f\ +\x34\x8f\x49\x5e\xa2\xb2\x69\x80\xb4\x70\x01\x96\x48\x96\xa5\x4d\ +\x9d\x32\x45\x3a\xe7\xf9\xe8\xd0\xd7\xe9\x74\x22\x27\x27\x07\x1e\ +\x8f\x07\x13\x27\x4e\xc4\xf4\xe9\xd3\xd1\xa7\x6f\x5f\xcd\x36\xc6\ +\x8f\x1f\x2f\x95\x3d\x78\xe8\x90\x76\x3f\x94\x1d\xc0\xd8\x5b\x6e\ +\x91\x2e\xab\x6b\x6a\x62\xf2\x4e\x9c\x38\x11\x14\x45\x69\x1e\xd9\ +\xd9\xd9\x18\x30\x60\x00\x46\xdd\x78\x23\xee\xbf\xff\x7e\x8c\x1e\ +\x3d\x3a\xa6\xcd\x54\xc2\xa6\x19\x3c\x2a\x86\x6c\x3d\xf2\x85\x2f\ +\x42\x79\x1d\x53\x9b\xb2\x82\x48\x2d\xfa\x31\x80\x1a\x2c\xcb\xa2\ +\xb5\xb5\x15\x47\x8e\x1c\xc1\xaf\x7f\xfd\x6b\xcc\x9b\x37\x0f\xd5\ +\xd5\xd5\xca\xba\x84\x86\x74\x9e\x46\x95\x47\x7e\x18\xe5\x25\x40\ +\x30\x18\xc4\xe5\xcb\x97\xb1\xeb\x83\x0f\xf0\xcc\xca\x95\x78\xeb\ +\xcd\x37\xc1\x45\x87\x74\x29\xc7\x75\x73\x01\xf1\x6a\xbd\x22\xaf\ +\x0c\x9f\x7c\xfa\xa9\x94\x4e\xd3\x34\x2e\x5c\xbc\x88\x4d\x9b\x36\ +\x61\xd7\x07\x1f\xa0\xad\xad\x0d\xdf\x5d\xbd\x1a\x5b\xb7\x6e\x45\ +\x5e\x5e\x5e\xdc\x41\x61\x3c\x3e\x7f\xdf\x27\x9f\x48\xe5\x78\x9e\ +\x47\x5b\x5b\x1b\xaa\xaa\xaa\xb0\x71\xe3\x46\x78\xbd\x5e\xec\xd8\ +\xb1\x03\xc5\xc5\xc5\x78\xe0\x81\x07\x74\xeb\x48\x26\x6c\x9c\xc3\ +\x37\xd2\x74\xca\x9c\x7c\x42\xad\xa7\x8c\xf2\x0a\x15\x21\xc3\xed\ +\x46\x69\x69\x29\x36\x6c\xd8\x80\x69\xd3\xa6\x01\x00\xfc\x7e\x3f\ +\x36\x6f\xde\xac\x28\xa7\x19\xf0\xe9\xd4\x4b\x42\xbe\x56\x3e\x45\ +\xd4\x43\x51\xe8\xdb\xb7\x2f\xee\xbb\xef\x3e\xac\x5a\xb5\x4a\x4a\ +\xdf\xb9\x73\x67\xac\xa5\xd1\x3a\x92\x80\x24\xb8\x00\xe3\x60\x8f\ +\x38\xd0\xd3\x21\x43\xf7\x8b\x50\xe5\x17\xc9\x98\x3f\x7f\xbe\x94\ +\x56\x55\x55\xa5\xb8\xa7\x87\x18\xd2\x0d\x88\x20\x12\x10\x8d\xa3\ +\x6c\xfc\x78\x29\xcb\xe5\xcb\x97\x0d\x7a\x63\x50\x97\x0d\x48\xaa\ +\x0b\x30\x9d\xe8\x89\x14\xf6\x85\x1b\x70\xbc\x71\x2b\x2e\x75\xec\ +\x43\x7b\xe8\x02\x18\x2e\x88\x1e\xae\x3e\xc8\xeb\x75\x33\x6e\x1c\ +\x38\x0f\x9e\x9c\x29\x96\x1e\x58\x4e\xdc\xb0\x61\xc3\xa4\xf4\x86\ +\x86\x06\x7b\x87\x88\x26\xf9\x8d\xca\xc9\xd3\xdc\x6e\xf7\x75\x1b\ +\x25\x24\x69\x14\x40\xe0\xef\x23\x69\xa7\x9b\xde\xc7\xde\x0b\x1b\ +\xc0\xf2\x21\xc5\xfd\x00\xdd\x8c\xf3\xad\x7b\x70\xbe\x75\x0f\x46\ +\x0d\x9c\x83\xdb\x8a\xd6\x83\xa2\x1c\x91\x96\xf4\x7a\x20\x55\x6e\ +\xd0\x4d\x6b\xf7\x4c\x89\x31\x72\x29\x06\xe5\x0f\xc9\x46\x1c\xa3\ +\x47\x8f\x36\x17\x70\x3e\xae\x3d\x9f\xa6\x48\xc2\x44\x10\x39\xf9\ +\x67\x9a\xff\x82\x8f\xce\xaf\x15\x3a\xe2\xc8\x42\x59\xe1\x4a\x94\ +\xf6\xfb\x47\x64\x3a\xfb\xa0\xc9\xff\x39\xf6\x5e\x78\x11\x4d\xfe\ +\x13\x38\xd1\x58\x89\x2c\x57\x3f\x94\x15\xae\xb4\x34\x29\x44\x01\ +\xa8\xab\xab\x93\xae\xf3\xf3\xf3\x95\xf9\x75\x9f\x46\x2b\xd1\x62\ +\x60\xa8\x51\x8e\xe7\x79\x74\x74\x74\xe0\xc0\x81\x03\xd8\xf8\xab\ +\x5f\x01\x00\x7a\xf6\xec\x89\xc7\x9f\x78\xc2\xb0\x2e\xde\xa0\xfd\ +\x44\x61\xb3\x0b\x20\x27\x3f\xc0\x34\x63\xdf\x85\x0d\x00\x00\x07\ +\xe5\xc2\xfd\xc3\x7f\x83\x41\x39\x65\x42\x1e\x00\xf9\xbd\xc7\x62\ +\xfa\xc8\xff\x40\xe5\xe7\xd3\xe1\x0b\x37\xa0\xe6\x6f\xbf\xc1\x88\ +\xaf\xfd\x33\xfa\x66\x97\x9a\x76\x42\xde\xea\xe6\x2d\x5b\xa4\xf3\ +\xb2\xb2\x32\x43\x33\xaf\x19\x14\x1a\xdd\x37\xc9\x0f\x00\x93\x54\ +\x73\x02\x0e\x87\x03\x14\x45\xa1\x4f\x9f\x3e\x98\x3e\x7d\x3a\xe6\ +\xcd\x9b\x87\x82\x82\x02\xe3\x6a\xcd\xda\x4d\x00\xb6\xee\xe4\x21\ +\x25\x1f\x00\x4e\x34\x56\x82\xe6\x84\x4d\x2d\xa3\x06\xce\x55\x90\ +\x2f\x7e\x91\x99\xae\x5c\x94\x15\x3e\x0d\x00\xe0\x79\x0e\xb5\x57\ +\xff\x10\xad\x4b\xab\xfd\xc8\xc1\x30\x0c\xce\xd5\xd5\x61\xfd\xfa\ +\xf5\xd8\xbd\x6b\x17\x00\x20\x2b\x2b\x0b\x0f\x3d\xf4\x10\x59\x10\ +\x25\xbb\x6f\x25\xc8\x33\x0b\x2e\xe5\x68\x6f\x6f\xc7\xa9\x53\xa7\ +\x70\xfa\xf4\x69\xc3\xf6\x93\x0d\x1b\x97\x83\xf5\xc9\xd7\x32\xcf\ +\x97\xda\xff\x4f\x3a\x1f\xd9\xbf\x5c\xd7\x84\x97\xf4\x99\x86\xff\ +\x95\xca\x7c\xaa\xeb\xe7\x27\x4e\x98\x10\xd3\x27\x71\x86\x2f\x37\ +\x37\x17\x2f\xbd\xfc\x32\x0a\x06\x0d\x52\xf6\x29\xf6\x21\xf4\xef\ +\x69\xb4\x69\x98\x37\x82\xfd\xfb\xf7\x2b\xca\x05\x02\x01\xd4\xd7\ +\xd7\xe3\xfd\xed\xdb\xb1\x7b\xf7\x6e\xac\x5f\xbf\x1e\xb3\x66\xcd\ +\xc2\xf2\xe5\xcb\x4d\xdb\x4b\x46\x14\x60\x93\x0b\xb0\x46\x3e\x45\ +\x51\x68\x0b\xd6\x4b\xd7\xdb\x4f\xcc\x92\xdd\x15\x1e\x33\x3a\xb5\ +\x1b\x7d\x6c\x1f\xdd\x20\x56\x60\xd8\x1f\x71\xb7\x4c\x71\x71\x31\ +\x26\x4c\x98\x80\x07\xca\xcb\xd1\x37\x32\x15\x9c\x88\xef\x8f\xc7\ +\x05\xa8\xbf\x8f\xec\xac\x2c\xdc\x38\x6a\x14\x6e\x1c\x35\x0a\x14\ +\x45\x61\xd7\xae\x5d\xd8\xb6\x6d\x1b\x6e\xbe\xf9\x66\x4c\x91\x4d\ +\x6d\x13\xf7\x2f\x41\xd8\x38\x0a\x30\x1f\xf6\xc9\xd3\xc2\x9c\x57\ +\x4a\xe3\x79\x96\xa8\x7e\x96\xa3\x75\xc9\x3f\x20\x1b\xe3\xcb\x1a\ +\x8b\x9e\xc6\x76\x44\xea\x8f\x28\x6c\x0c\xc3\xc0\xe5\x72\x19\x96\ +\xa3\x69\x5a\x3a\x77\x38\x1c\xd6\x04\x44\x85\xd9\xb3\x67\x63\x57\ +\xc4\x45\x6d\xdf\xbe\xdd\x54\x00\x92\x81\xa4\xb8\x00\xcd\x6b\x21\ +\x51\xba\x76\x52\x99\x60\xf8\x00\x00\xe0\xb1\xb1\x35\xc8\x70\xf6\ +\xd4\x34\xef\x86\x69\xea\xfa\x49\xf2\xaa\xcc\x7c\x76\x76\x36\xbc\ +\x5e\x41\x18\x3b\xbd\x5e\x53\x4b\xd1\xd1\xd9\x29\x9d\xf7\xec\xd9\ +\xd3\x1a\xe9\xaa\xef\xa4\xb8\xa4\x44\x3a\x3f\x75\xea\x94\xa6\xc2\ +\xa8\x61\xb7\x1b\xb0\x25\x08\xb4\x4a\x3e\x00\xe4\xf6\x28\x92\xce\ +\xdb\x43\x17\x95\x0b\x2f\xea\x72\x26\x02\x01\x79\x9a\x2a\x78\x53\ +\xdf\x53\xa7\x0f\x19\x32\x44\x3a\xaf\xaf\xab\xd3\x0e\xe4\x64\x81\ +\x5e\xdd\xb9\x73\x9a\x65\xf5\xa0\x58\x0d\x94\xf5\x4b\xdd\x8e\xb0\ +\xa9\xd6\x1c\xa6\x41\xa9\x45\xd8\xbe\x9f\x9f\x34\x06\x18\x92\x1b\ +\x35\x77\x97\xdb\xf7\xc6\x90\xac\x2e\xa7\x48\xd3\x23\x5f\xde\xa6\ +\x3c\x5d\x2f\x42\xa7\x28\x8c\x1b\x37\x4e\xba\xfc\xe8\xa3\x8f\x62\ +\xca\x41\x45\xdc\x87\x1f\x7e\x28\x65\x19\x2f\x4e\xe7\x8a\xf9\x28\ +\x2a\xe6\xf9\x8d\x70\xfe\xfc\x79\xe9\x7c\xc0\x80\x01\xc4\xe5\xec\ +\x44\xd2\x86\x81\x80\x0e\x89\x91\xeb\x9b\x06\xce\x87\xd3\xe1\x06\ +\x00\x1c\x6d\xf8\x03\x7c\xf4\xd5\x68\x19\x8d\x72\xba\x69\xaa\xf6\ +\x14\x79\xf5\xa2\x7a\x19\xb1\xe5\xe5\xe5\x70\x3a\x9d\x00\x80\xf7\ +\xde\x7b\x0f\xe7\xea\xea\x62\x48\x17\x71\xe6\xcc\x19\x6c\xdf\xbe\ +\x1d\x80\x10\x68\xce\x9a\x35\x4b\xa1\xd9\x44\x90\x09\x56\x65\x65\ +\xa5\x94\x3c\x61\xc2\x04\xa5\xb5\x30\x38\xec\x1c\x26\xda\x26\x00\ +\x24\xe4\xcb\xaf\x7b\x67\x0e\xc2\x14\x8f\x30\x0b\xe8\xa7\x9b\xb0\ +\xed\xf3\x72\x1c\x6b\xd8\x84\xf6\xe0\x05\xb0\x3c\x03\x96\xa3\xe1\ +\x0b\x37\xe2\x4a\x47\x15\x0e\x5d\xfe\x25\x2a\x6a\xff\x49\xaa\x87\ +\x34\x06\x20\x71\x03\x45\x45\x45\x58\xbc\x78\x31\x00\x61\xad\x7e\ +\xe1\x23\x8f\xe0\xf7\x6f\xbf\x8d\xfa\xfa\x7a\x84\x42\x21\x84\x42\ +\x21\xd4\xd7\xd7\xe3\xdf\xdf\x7e\x1b\x8f\x2c\x5c\x88\x50\x48\x98\ +\xb2\x5e\xb1\x62\x85\x75\x17\x40\x51\x08\x05\x83\x38\x79\xe2\x04\ +\x9e\x5f\xbf\x5e\x0a\x00\x73\x72\x72\xb0\x60\xc1\x02\xd3\xba\xe4\ +\xcf\x6a\x97\x0b\x20\xa9\xc7\x01\xe1\x05\x90\x5e\x00\xfa\x03\xc8\ +\x8f\x1c\xfd\x01\xf4\xe2\x79\xfe\x95\xe6\xe6\x66\x43\xb2\x35\xdd\ +\x40\x24\xed\x74\xd3\x9f\xf1\x71\xfd\x8f\xc0\x70\x41\xd3\x8e\xac\ +\x98\xf8\x45\xa4\xb0\x50\xd7\x04\xd9\x8a\x5a\x55\x55\x95\xb1\xc6\ +\x9b\xa4\x6f\xde\xbc\x19\x6f\xbd\xf5\x16\x68\x9a\x56\xec\x2e\x12\ +\x21\xa6\xb9\xdd\x6e\x3c\xfb\xec\xb3\x8a\x55\x46\x75\xfd\x63\xc7\ +\x8e\xd5\xd5\x5e\x71\x26\x50\x54\x98\xfc\xfc\x7c\xbc\xf0\xc2\x0b\ +\x18\x39\x72\xa4\xe9\xf3\xab\x91\x99\x99\x09\x8a\xa2\xee\x04\xd0\ +\x00\xa0\x09\xc2\x8b\xa2\x61\x44\x7f\x2f\xc0\x14\xf6\x8c\x02\xe2\ +\x24\x1f\x00\x6e\xe8\xff\x2d\x78\x72\xa7\xe2\x78\x63\x05\x2e\xb5\ +\xef\x45\x6b\xa0\x0e\x61\xd6\x0b\x07\xe5\x42\x76\x46\x7f\xf4\xcd\ +\x2a\xc5\xe0\x9c\x5b\x51\xd2\xf7\xee\x98\xb6\xb4\xfa\xa0\x67\x09\ +\xb4\xf2\xcb\xd3\xe7\xcf\x9f\x8f\x7b\xef\xbd\x17\xef\xbf\xff\x3e\ +\x0e\x1d\x3a\x84\xba\xba\x3a\x74\x74\x08\xef\x5e\xe6\xe4\xe4\x60\ +\xe8\xd0\xa1\x28\x2b\x2b\x43\x79\x79\x39\xfa\xf7\xef\x1f\x53\x9e\ +\x14\x6e\xb7\x1b\xb9\xb9\xb9\x18\x3e\x7c\x38\x26\x4f\x9e\x8c\xfb\ +\xee\xbb\x0f\x59\x59\x59\x96\xeb\xb1\x6b\x34\x60\x8f\x05\x68\x69\ +\x89\x56\x66\x26\x0c\xf1\xe6\x91\xa5\x11\x91\x6c\x90\xae\xfb\xd0\ +\x66\xa4\x5a\x21\x3d\x4e\x01\xb1\x02\xb7\xdb\x9d\x26\x16\x00\xc9\ +\x21\xdf\x34\xf8\xb3\x43\x20\x22\xf7\xe2\x16\x0a\xab\xf9\xd2\x0c\ +\xf6\xcd\x04\xa6\x92\x7c\x2b\x24\x27\x91\x78\x2b\x43\x3e\x3b\xca\ +\x25\x03\xb6\xaf\x05\x44\x12\xb4\x32\x45\x4f\x49\xae\x65\x69\x89\ +\x68\xbd\x55\xe2\xcd\xc8\xb1\x42\x5e\x3a\x11\xad\x07\x5b\xd7\x02\ +\x80\xd8\x87\x26\x22\xdb\x6e\xf2\xe3\xf0\xff\x86\x64\x11\x9a\xf7\ +\xae\x40\xb8\x1a\xf6\x2e\x06\x69\x5d\x27\x99\xfc\x44\xb5\xde\x88\ +\x34\x3b\xad\x41\xba\x22\xb5\x41\x60\x02\xe4\xa7\x8b\x1b\xf8\x2a\ +\x90\x2e\x87\x3d\x31\x00\x90\x1c\xf2\x13\xb1\x04\xd0\x21\xab\x9b\ +\x78\x05\x52\x3e\x11\x94\x12\xf2\x2d\x9a\xfb\xbf\x47\xe2\x45\xd8\ +\x1f\x03\x90\x90\xad\xbe\x26\x24\x9f\x88\x68\xa2\x34\x1e\x47\xaf\ +\xbc\x83\x93\x8d\x7f\x86\xcb\xd1\x03\x5f\xcf\xfb\x16\x6e\xcc\x9b\ +\x09\x69\xdb\x79\x92\x48\x4f\x47\x61\xb2\x7d\x14\x20\x22\x6e\xb2\ +\x13\x88\x01\x48\xb4\x9e\xe7\x59\xfc\xf5\xcc\x6a\x9c\x68\x78\x4f\ +\x4a\xbb\xd0\xba\x17\xc7\x1b\xde\xc5\xf4\x9b\x7e\x8b\xec\x8c\x7e\ +\xda\x0f\x64\x11\xe9\x48\xb6\x16\xec\x5b\x0d\x04\xac\x93\x9b\x4c\ +\xf2\xa9\xd8\xb5\x79\x8e\x67\xf0\x5f\xa7\x9e\x52\x90\x2f\xe2\x52\ +\xdb\x01\x6c\x3b\x32\x07\xfe\x70\x73\xcc\x3d\x12\xc4\x2c\xd9\x76\ +\x11\xd8\xb3\x23\x08\x50\x98\x7a\xc8\xae\xed\x26\x9f\x32\xcb\xa3\ +\x93\xc6\xf1\x0c\x76\x9e\x5c\x86\x53\x8d\x3b\x74\x9f\xe3\x9a\xf7\ +\x24\x2a\x8e\xcc\x84\x2f\x7c\x4d\x37\x8f\xb2\x99\xae\x47\xb8\x1a\ +\xf6\x58\x00\x03\xbf\x2f\xbf\x6f\x07\xf9\xea\x7a\x63\x5c\x8d\x0e\ +\xf9\xff\x79\x7c\x31\xce\x5e\xfb\x6f\xa3\xa7\x00\x00\x34\xfb\xce\ +\xa2\xe2\xf0\x2c\x78\x43\x57\x75\xf3\x74\x75\xd2\xe5\xb0\x77\x47\ +\x10\xa0\x2b\x0c\x86\x64\xab\xaf\xe3\x21\x5f\x8b\x14\x8a\x02\xcb\ +\x87\xf1\xa7\xcf\x1f\xc5\xb9\xe6\x5d\x64\x0f\x01\xa0\xc5\xff\x85\ +\x20\x04\xe1\x06\x59\x55\x5d\x5f\xdb\xb5\x60\x6f\x0c\xa0\xbe\x36\ +\xb3\x04\x91\x34\xab\xe4\xc7\x68\xb9\x4e\x1e\x86\x0d\xe0\x4f\xc7\ +\x16\xe2\x7c\xcb\x47\xa6\xfd\x57\xa3\x35\x50\x87\x2d\xd5\xe5\xe8\ +\x0c\x5d\x49\x0a\xe9\xa4\xdb\xbf\x74\xb7\x85\xd9\x04\x7b\x37\x85\ +\x92\x68\xb7\x2a\x7f\x3c\xe4\x1b\xd6\x11\xc9\x43\xb3\x7e\xbc\x7f\ +\x6c\x01\x2e\xb4\xee\x35\xef\xb7\x0e\xda\x83\x17\xb1\xa5\xa6\x1c\ +\x1d\x41\xc2\xf7\xf7\x35\x90\x2c\x02\xed\x12\x82\xeb\x1e\x04\xca\ +\xf3\xdb\x45\x7e\x88\xe9\xc4\xf6\xda\x87\x71\xa9\xed\x00\xd9\x03\ +\x18\xa0\x23\x78\x19\x5b\x6a\xca\xd1\x1e\xbc\x48\x94\xbf\xab\x8d\ +\x06\xec\xdf\x16\x0e\xc4\x3d\x02\x80\xec\xda\x8c\x7c\xad\x60\x4f\ +\x20\xbf\x03\xdb\x8f\x3d\x8c\xcb\xed\x07\xe3\xe9\xbe\x26\x3a\x82\ +\x5f\x62\x4b\xcd\x0c\xb4\x06\xea\x34\xef\x77\x25\xc2\xd5\xb0\x75\ +\x14\xa0\xf9\xf8\x71\x08\x03\x09\xf9\xea\x36\x28\x8a\x42\x90\x6e\ +\xc3\xb6\xa3\xf3\x70\xa5\xbd\x1a\x76\xa3\x33\x78\x05\x5b\x6b\x66\ +\xa1\xc5\xff\x85\xa2\x1f\x5d\x91\x74\x39\xec\x0f\x02\x8d\x84\x41\ +\x9d\x57\xa7\xac\xe2\x1e\x09\xf9\x00\xfc\x74\x0b\xb6\x1d\x9d\x87\ +\xab\x9d\xb5\x64\x1d\x06\x30\xb9\xe4\x59\x4c\x2e\x59\x65\x9e\x31\ +\x02\x6f\xa8\x01\x5b\x0f\xcf\x42\xb3\xef\x6c\x97\x27\x5e\x84\xbd\ +\x53\xc1\x56\xb5\x5b\x4b\xdb\x35\xea\x33\xba\x16\xc8\x6f\xc6\xbb\ +\x47\xe6\xe2\x9a\xef\x14\x71\x57\xe5\xe4\x53\xa0\xb0\xaf\xfe\x75\ +\xa2\x72\xbe\x50\x23\x2a\x0e\xcf\xc4\x9c\x5b\xb6\x61\x40\x4f\xeb\ +\x5b\xb9\xf5\x60\x26\x50\x5a\x5b\xd5\xed\x80\x7d\x41\x60\x4c\x62\ +\x82\x41\x1f\xe1\xb5\x2f\xdc\x88\xca\xc3\x33\x2d\x91\x3f\xa9\xe4\ +\x19\x85\xe6\x4f\x2a\x79\x06\x53\x4a\xbe\x43\x5c\xde\x17\x6e\x42\ +\x45\xf5\x4c\x34\x7a\x8f\x13\x97\x01\x8c\x87\x7e\xf1\x94\xb5\x03\ +\xf6\x05\x81\x1a\xa6\xdf\xb6\x11\x80\xce\xb5\x37\xdc\x80\xca\x23\ +\xb3\xd1\x2c\xf3\xcb\x66\x98\x54\xbc\x52\x93\x6c\xab\x42\xe0\xa7\ +\x5b\x50\x51\x33\x0b\x57\x3b\x8f\xe9\xe6\xe9\x0a\x23\x82\xe4\x04\ +\x81\x5a\xbe\x5c\xef\x3a\x4e\xf2\x3b\x43\x57\xb0\xb5\x66\x06\x5a\ +\xfc\xe7\x40\x8a\x49\xc5\x2b\x31\x65\xe8\x6a\xfd\xfb\x25\xcf\x18\ +\xde\x57\x23\x40\xb7\xa1\xa2\x66\x36\x1a\x3a\x8e\xca\xba\x97\xde\ +\x84\xab\x61\xff\xbf\x7d\xc5\x31\xc4\x53\xdc\x26\xb8\x6e\x0f\x5e\ +\xc2\xd6\xc3\x33\x88\xc7\xe6\x00\x30\xb1\xf8\x29\x22\x72\x27\x97\ +\x3c\x83\x31\x85\xe4\xef\xe9\x05\x99\x76\x54\x1c\x9e\x83\xf6\xe0\ +\xc5\x2e\x43\xba\x1c\xf6\xee\x09\x54\x9f\x5b\x0d\x02\x4d\x22\x7e\ +\x8a\xa2\xd0\x16\x38\x8f\xca\x23\xb3\xd1\x19\xfa\x1b\x71\xdf\x26\ +\x16\x3f\x85\xa9\x43\xbf\x67\x98\x47\x6c\xab\xa1\xf3\x28\x4e\x34\ +\xfc\x99\xb8\x6e\x00\xf8\x46\xc1\x6c\xf4\xc9\xf2\x58\x2a\x93\x2e\ +\xb0\x6f\x4f\x20\x40\x64\xfa\xa3\x37\x8c\x85\x41\x8b\xfc\x16\xff\ +\x17\xa8\x3c\x32\x17\xbe\xb0\xfe\x4a\x9d\x1a\x13\x8a\x56\x58\x22\ +\xbf\xa2\x66\x0e\x42\x4c\x87\x61\x7e\x39\x6e\x1d\xf2\x18\xee\xbe\ +\x61\x03\x8c\x07\xbe\xe9\x0b\xdb\xdf\x0c\x8a\xcb\xf4\x13\x58\x82\ +\x66\xdf\x59\x54\x1e\x9d\x03\x3f\xe1\x5a\x3d\x20\x90\x7f\xdb\xb0\ +\x35\x86\x79\xae\x07\xf9\xe9\xe4\x2a\x92\xb6\x25\x0c\x20\x37\xfd\ +\x66\x73\x01\xd7\xbc\x27\xf0\x6e\xed\x83\x96\x76\xeb\x98\x91\x2f\ +\x27\x21\xd9\xe4\xa7\x13\xe1\x6a\xd8\xba\x2b\xd8\x68\x3a\x17\x7a\ +\xf7\x4c\xfc\x7e\x63\xe7\x31\xbc\x57\x3b\x1f\x01\xba\x95\xb8\x3b\ +\xe3\x8b\x96\x27\x95\xfc\xb1\x43\x16\x99\x92\x9f\xce\xa4\xcb\x91\ +\xfc\xff\xfc\x4d\x40\x18\xae\x76\xd6\xe2\xdd\xa3\xf3\x2c\x92\xbf\ +\x0c\xb7\x0f\xfb\xbe\x41\x77\x12\x27\xff\x9e\x1b\x5e\x80\x16\xf9\ +\xea\x21\x60\xab\xff\x3c\xbe\x4c\xc2\xba\x84\x9d\x48\xca\x5a\x00\ +\x29\xe1\x46\x6e\xe1\x4a\xc7\x67\x78\xb7\xf6\x41\x04\x99\x76\xe2\ +\x3e\x08\xe4\xff\x40\xbf\x8f\x09\x93\xff\xa8\x26\xf9\x5a\xe3\xfe\ +\x56\x7f\x3d\x36\x57\x97\xa3\xb2\x66\x2e\x2e\xb5\x55\x11\xb7\x91\ +\x6a\x24\x65\x43\x88\xfc\xda\x28\x0e\x50\x5c\xca\xce\xbf\x6c\x3f\ +\x88\xed\xc7\x16\x58\x22\xa7\xcc\xb3\x34\x05\xe4\xbf\xa8\xe8\xa9\ +\xde\x84\x4f\x8b\xbf\x0e\x9b\xab\x67\xa0\x33\x78\x05\x21\xa6\x13\ +\xdb\x6a\x1e\xc4\xc5\xd6\xfd\xc4\x6d\xa5\x12\xb6\xaf\x05\x18\x0d\ +\x09\xf5\xca\x40\x41\xce\x11\x6c\x3f\xb6\x00\x61\xc6\x1b\x53\x46\ +\x0f\x65\x9e\xa5\xb8\xa3\xf4\x87\xfa\x6d\x25\x48\xfe\x2d\x85\x0b\ +\x15\xe4\x1b\xcd\xf4\xb5\xf8\xeb\xb0\xa5\x7a\x26\x3a\x83\x57\xa4\ +\xb4\x30\xeb\xc3\xb6\xc3\x0f\xe2\x7c\xcb\x3e\xcd\xbe\x59\x59\x0b\ +\xb0\x1b\xb6\xaf\x05\x28\x92\x64\xf7\x48\xb4\x9f\xe5\xc2\xd8\x79\ +\x62\x19\x68\xd6\x4f\xdc\xec\x38\xcf\x92\xa4\x93\xff\xcd\x91\x2f\ +\x41\x4e\xbe\x1e\x5a\xfc\xe7\xb0\xe5\xb3\x19\x0a\xf2\x45\xd0\x6c\ +\x00\xef\x1d\x79\x18\x0d\x1d\xca\xe5\x6a\x9e\xe7\x63\x56\xfa\x48\ +\xd3\xec\x80\xfd\xbb\x82\x01\x4b\xda\x2f\xff\x42\xeb\x5a\x3e\x44\ +\x7b\xf0\x12\x71\x7b\xe3\x3c\x8b\x71\x67\xe9\x73\xfa\xed\x24\x4c\ +\xfe\x23\x12\xf9\x66\x1a\x28\x90\x3f\xd3\x70\x86\x92\x66\x03\xd8\ +\x73\x66\x9d\x44\xa6\xde\x21\x82\x34\x5f\x22\x48\xfe\xab\x61\x46\ +\xda\xaf\xfa\x42\xbd\x61\xf2\xe9\xdd\x9b\xf2\x67\xe3\xce\xd2\x1f\ +\xe9\xb7\x2f\xab\xbb\x3d\x70\x29\x4e\xf2\x5f\x86\x48\xbe\x11\x5a\ +\xfc\xe7\xb0\xf9\xb3\x19\xf0\x86\x1a\x0c\xf3\x01\x40\x93\x57\xf8\ +\x7f\x80\x44\x09\x4c\xaf\xe5\x60\x55\xb0\x47\x94\x0f\xb1\x71\x40\ +\x1f\xd9\xef\x07\x9b\xa1\xae\x79\x37\xae\x79\x4f\x10\xe5\xcd\xcd\ +\x2a\xc4\x8d\xf9\xe5\xc4\x75\x8f\x29\xfc\x36\x31\xf9\xcd\xbe\x2f\ +\x88\xc9\x07\x00\x4f\xbf\x29\x12\xf9\x66\x1a\x6e\xa4\xf9\x76\x59\ +\x80\xa4\xcc\x03\x90\x0e\x09\xd5\x65\x8a\xfa\xde\x86\xdc\x1e\xe6\ +\xbf\xbe\x09\x08\xeb\xf1\x95\x87\xe7\x68\x0a\x41\x2c\x69\x14\xee\ +\xb9\xe1\x25\x8c\x1d\xf2\xa8\x69\xbd\x63\x0a\xbf\x8d\x7b\x47\xbe\ +\x02\x8a\x72\x10\x91\xbf\xa5\x9a\x9c\x7c\x00\x18\x33\x78\x81\x65\ +\x53\xaf\x97\xdf\x0e\x24\x6f\x47\x50\x4c\x26\x63\xed\x07\x00\xa7\ +\x23\x03\x53\x4c\x16\x6e\xe4\xf0\xd3\x2d\xa8\x3c\x32\x57\x21\x04\ +\xfa\xa4\x51\xb8\x7b\xc4\x0b\xb8\x75\xc8\x63\xba\xf5\x8d\x29\x5c\ +\x20\x91\x6f\x86\x66\xdf\xd9\x08\xf9\xe4\x0b\x53\x77\x96\xfe\x08\ +\x85\xb9\x13\x2c\xfb\x7c\xbd\xfb\x76\xc0\xf6\x79\x80\x78\xb5\x5f\ +\xc4\xa8\xbc\x6f\xe1\xce\xd2\x75\xc4\x4d\xfa\xc3\xcd\x92\x10\x98\ +\x69\x2c\x45\x39\x70\xf7\x0d\x1b\x30\xce\xf3\x78\xcc\x3d\x81\xfc\ +\x1f\x5b\x20\x7f\xa6\x25\xf2\x6f\x1f\xb6\x16\xb7\x0e\x11\xfe\x1d\ +\x4c\x4e\x22\xc7\x71\xd2\xa1\x27\x00\x7a\x79\xec\x40\xf2\xa7\x82\ +\x23\x30\xd3\x7e\x39\x6e\x1d\xf2\x38\xee\x18\xa6\x1f\xdd\xab\x21\ +\x17\x02\x92\x9e\x4c\x1b\xb1\x01\x65\x9e\xc5\x52\xca\xcd\x83\x1f\ +\xb6\x44\xfe\x66\x8b\x9a\x7f\xdb\xd0\xef\x63\xdc\x90\x25\x12\x99\ +\x72\x62\x8d\xc8\xd6\xbb\x9f\x9e\xa3\x00\x0b\x1a\xaf\xb8\xa5\xc8\ +\x16\xbd\x1a\xe7\x59\x0c\x1e\x1c\x3e\x3e\xf7\x12\x51\xf3\xfe\x70\ +\x33\x2a\x0e\xcf\xc1\xdc\x31\x95\x18\xd0\x6b\x94\x46\x17\x94\x7d\ +\xb8\x6b\xc4\x7a\x00\x40\x98\xf5\xe3\xbe\xaf\xbf\x4a\x44\x7e\x53\ +\xc4\xec\xfb\x42\x8d\x44\x7d\x02\x80\xa9\x43\xbf\x87\x71\x43\x96\ +\x1a\x06\x70\x46\x64\xca\xef\x89\xcf\x60\xe7\x7c\x00\x89\xfb\x36\ +\xfd\xad\x60\x9f\xcf\x67\x68\xfe\xe5\x5f\x3e\xa5\x1a\x06\x1a\x6d\ +\x02\x01\x80\x83\x17\x37\xe2\xe3\x73\x2f\x93\x3c\x0b\x00\x20\xdb\ +\xfd\x35\xcc\x1d\xb3\x0d\x03\x7a\x7d\xdd\xb0\xde\x28\x78\x32\xcd\ +\xf7\x7f\x81\xcd\x87\x1e\x20\xfe\xed\x00\x00\x98\x5c\xbc\x1a\xe3\ +\x3d\xc2\xbf\x81\xa9\x7d\xb9\x3a\x4d\xd1\xa3\x48\xba\x5e\xbf\xc5\ +\xf4\xec\xec\x6c\x50\x09\xfe\x56\x70\x4a\x56\x03\x75\x6f\x29\xb2\ +\x69\xe7\x2b\xf3\x3c\x89\xdb\x86\xea\xaf\xee\xa9\x21\x58\x82\xd9\ +\xb8\xe6\x3d\x69\x58\x6f\xb4\x5d\x02\xcd\xf7\x9e\xb1\x4c\xfe\xa4\ +\xe2\x55\x18\xef\x59\xae\x6b\xc2\xd5\xe6\x5d\xcb\xec\xeb\xb9\x02\ +\xf1\xda\x0e\x24\x65\x1e\xc0\x8a\xbf\x27\xc1\x84\x62\xe3\xf5\x7d\ +\x35\xd4\x42\x90\x08\x9a\xbc\x67\x04\xb3\x6f\x81\xfc\x89\x45\xcf\ +\x60\xfc\x90\x15\x31\x64\x6b\x91\x6f\x16\x00\xea\xe5\xe3\x38\x49\ +\xc9\x79\xd9\x61\x19\x29\x0b\x02\x01\x7d\x8d\x27\x99\xd5\x22\xd9\ +\xdb\x27\x87\x28\x04\x8d\x9d\xfa\x81\xa1\x59\xbb\x02\xf9\xe5\x16\ +\xc9\x5f\x89\x09\x9e\xa7\x75\x35\x5e\xfe\xa9\xa7\xed\x5a\x87\x96\ +\x20\x68\xc0\xb2\x10\x24\x57\x00\x0c\xa6\x7d\xc9\xab\x88\x96\x13\ +\x76\xf7\x7e\x97\xb8\xac\x24\x04\x1a\x96\xc0\x8c\xfc\x6b\xde\xd3\ +\x11\xf2\x9b\x88\xdb\x1b\xef\x59\x81\xf1\x43\x9e\x36\x8d\xe0\x6d\ +\xb6\x00\x1c\x94\x16\xc0\x92\x10\xd8\x3b\x11\x64\x60\xfe\xed\x70\ +\x05\x00\x30\xb1\xf8\x69\x4b\x2f\x6f\xf8\xc3\xcd\xa8\xa8\x99\xa5\ +\x29\x04\x7a\x68\xf2\x9d\xb1\x4c\xfe\xb8\xc2\x27\x31\xd1\xf3\xac\ +\x2e\x79\x66\xe9\x56\x2c\x80\x6a\x18\xc8\x00\x60\x11\xa7\x1b\x48\ +\xa9\x0b\x10\x41\x12\xfc\x19\xdd\x9b\x54\xbc\xd2\xd2\x5b\xbd\x6a\ +\x21\x30\x6a\xf3\x9a\xf7\x14\x36\x7f\xf6\x80\xa5\x0d\xa8\xb7\x16\ +\x2e\xc1\xa4\xa2\xef\xe8\x06\x6b\x24\x71\x40\xf4\x5c\x2e\x0c\xfa\ +\x75\xc9\x10\x06\x40\x23\x2a\x04\x96\x90\x3c\x01\xb0\xc1\xfc\x1b\ +\x61\xca\xd0\x55\x98\x32\xd4\xba\x10\x18\xbd\x44\xda\xe8\x3d\x89\ +\x2d\xd5\x33\x2c\x91\x3f\x76\xf0\x13\x98\x5c\xf4\x5d\x5d\x6d\xd7\ +\x13\x02\x91\x68\x96\xe5\xc0\xb2\x2c\x58\x96\x05\xc3\x30\x60\x18\ +\x06\x34\x2d\x1c\xe2\x35\xcb\xb2\x52\x5e\xb1\x2c\x00\x9c\x3c\x79\ +\xf2\x20\x80\x00\x04\x21\xb8\xfe\x02\x90\x6c\xf3\x1f\xad\x42\xa8\ +\x63\x72\xc9\x2a\x4c\x2e\x79\x86\xb8\x9c\x3f\xdc\x8c\xad\xd5\x33\ +\x71\xcd\x1b\x2b\x04\x8d\xde\x93\xd8\x5a\x3d\xd3\x12\xf9\xb7\x0c\ +\x7e\x0c\x53\x8a\xd7\x98\x9a\x76\x91\x40\xf1\x5c\x20\x95\x01\x4d\ +\xd3\xa0\xe9\x30\xc2\xe1\xe8\x11\x0a\x85\x10\x0e\x87\x23\xf7\x68\ +\x49\x00\x58\x96\x05\xcf\x0b\x75\xf8\x7c\x5e\x9c\x3b\x77\xae\x73\ +\xe1\xc2\x85\x6b\x00\xf8\x01\x84\x20\xb8\x02\x31\x1e\x20\x46\x52\ +\xfe\x32\xc6\x30\x9b\xa2\x88\x75\xf3\xaf\x86\x18\x0f\x7c\x52\xff\ +\x26\x51\x7e\x7f\xb8\x19\x5b\xaa\x67\xe0\xc1\xb1\xdb\x31\xa0\x97\ +\xf0\x7e\x7f\x63\xe7\x71\x6c\xad\x99\x6d\x91\xfc\x45\x98\x5a\xfc\ +\x03\xc3\xa9\x5c\x7d\xa1\xe0\xc1\xf3\x11\xc1\xe0\x79\x70\x2c\x2b\ +\xa4\x8b\x7e\x9d\x17\x9e\xdf\x95\xe1\x82\xd3\xe9\x84\xd3\xe1\x80\ +\xc3\xe1\x00\x4d\xd3\x68\x6b\x6b\x83\xdf\xef\x67\x5e\x7e\xf9\xe5\ +\x05\x55\x55\x55\x97\x21\x08\x40\xdc\x16\x20\x39\x1b\x42\x52\xbc\ +\x27\x7e\xca\xd0\xd5\xe0\xc1\xe1\xd3\xfa\x9f\x11\xe5\x97\x0b\x01\ +\xcf\xb3\x71\x90\xff\x28\xa6\x16\xaf\xd5\x24\x5e\xd4\x56\xb5\xe6\ +\xcb\xfd\x3a\xc7\x73\xe0\x58\x36\x62\xd2\xa3\x9f\x3c\xcf\x83\x07\ +\xe0\x74\x38\xe1\x72\xb9\x90\xc1\x65\xc0\x9d\x91\x01\xb8\x5c\xf0\ +\xf9\x7c\xf0\xfb\xfd\x08\x87\xc3\xdc\x3b\xef\xbc\xb3\x7c\xc7\x8e\ +\x1d\xa7\x21\xcc\xfc\x05\x20\xc4\x00\xc4\xb3\x7f\x72\x24\xf5\xcd\ +\x20\x00\xb6\xc7\x02\x7a\x96\x61\xea\xd0\xef\x81\xe7\x79\xec\x3f\ +\xff\x73\xa2\x7a\x44\x21\x00\xcf\xc3\x4f\xb7\x10\xb7\x3f\x66\xd0\ +\xc2\x18\xf2\x45\x01\x88\xfa\x70\x1a\xe1\x70\x18\x0c\x23\x98\x7b\ +\x8e\x63\xa3\x3e\x9f\x63\xc1\x32\x4c\x24\x3f\x2b\x09\x00\xcf\x73\ +\xa0\x28\x0a\x0e\xa7\x13\x19\x19\x19\x70\xbb\xdd\x70\xbb\x33\xc0\ +\xf3\x3c\x7c\x3e\x9f\xf4\x2f\xa6\xbb\x77\xef\x5e\xbf\x71\xe3\xc6\ +\x7d\x00\x3a\x10\xab\xfd\xd7\xc9\x02\x10\x0e\xff\xec\x36\xff\x6a\ +\xdc\x5e\xfa\x7d\xf0\xe0\x71\xe0\xfc\x2f\x88\xf2\x5b\xfd\x61\xe8\ +\x9b\x07\x3d\x82\xdb\x4a\x7e\x08\x9e\x8f\x5d\xd2\x15\x7d\x7b\x30\ +\x18\x44\x20\x10\x90\x7c\x39\xc3\x30\xa0\x23\x84\xb3\x2c\x1b\xd1\ +\xfc\xc8\xc1\x71\x92\xf9\xa7\x28\x0a\x4e\x97\x0b\x99\x99\x99\xe8\ +\xd3\xa7\x0f\x72\x72\x72\xc0\xb1\xac\x22\x2e\xa8\xad\xad\xfd\xb7\ +\x75\xeb\xd6\xfd\x05\x02\xf9\x3e\x24\xe0\xfb\x45\x24\xdf\x02\xa4\ +\x08\xa2\xd0\xdc\x51\xfa\x03\x00\x3c\x0e\x9c\xff\xa5\xad\xf5\xff\ +\x43\xc1\x02\xdc\x5e\xf2\x5c\x0c\xf9\x72\x01\xa0\x69\x1a\x81\x40\ +\x00\x3e\x9f\x0f\x5e\xaf\x0f\xc1\x60\x00\x34\x4d\x6b\xba\x05\xd1\ +\xec\x8b\x7d\xcf\xcb\xcb\xc3\xe0\xc1\x83\xd1\xaf\x5f\x3f\xb0\x2c\ +\x2b\x91\x2e\x7e\xd6\xd7\xd7\xff\xcf\xd2\xa5\x4b\x7f\x05\xa0\x1d\ +\x36\x91\x0f\x24\x43\x00\x92\xe8\xff\x49\x2d\xc3\x1d\xa5\x6b\xc1\ +\xf3\x1c\xaa\x2e\x6c\xb4\xa5\xdd\xd1\x05\x0f\xe1\xce\x61\xeb\x23\ +\xe4\xeb\xaf\xe1\x8b\x66\xda\xeb\xf5\xa2\xb3\xb3\x13\x7e\xbf\x1f\ +\xa1\x70\x18\x6c\xc4\xd4\xcb\xe3\x00\x87\xc3\x81\xbc\xbc\x81\xf0\ +\x78\x3c\xf0\x78\x3c\x70\xb9\x5c\x12\xe1\x22\xe9\xe2\x71\xf5\xea\ +\xd5\xa3\x4f\x3d\xf5\xd4\x3a\x08\xe4\x7b\x01\x04\x91\xc0\xd8\x5f\ +\x8e\xe4\x5a\x80\x38\xfc\xbf\x5d\xbb\x5d\xef\x1c\xfe\x1c\x78\x70\ +\x38\x78\xe1\x5f\x13\xaa\x67\x74\xc1\x7c\xdc\x35\x6c\x83\xa4\xf9\ +\x80\xf6\xd6\x2d\xd1\xff\x07\x83\x41\x04\x83\x41\xf8\xfc\x7e\xf8\ +\x7d\x3e\x30\x0c\x03\x87\xc3\x81\xec\xec\x6c\xe4\xe4\xe6\x62\xe0\ +\x80\x01\x28\x2c\x2c\x44\x7e\x7e\x3e\x78\x9e\x57\x68\xb9\x9a\xf8\ +\x50\x28\x84\xb6\xb6\xb6\xf3\xcf\x3d\xf7\xdc\xca\xe6\xe6\x66\x71\ +\xb9\x57\x24\x3f\x21\xcd\x17\x61\xff\xff\x06\x92\x9c\xdb\x6c\x25\ +\xf4\xea\xbb\x6b\xf8\x3a\x50\x00\xaa\xe2\x14\x82\x6f\x14\xcc\xc3\ +\xb4\xd2\x17\x63\x34\x1f\x80\xca\xfc\x8b\x31\x80\xe0\x06\x42\xe1\ +\x30\x42\xc1\x20\x18\x86\xc1\x92\x25\x4b\x34\xeb\x66\x18\xc6\x90\ +\xfc\x70\x38\x0c\xaf\xd7\xdb\xf4\xc6\x1b\x6f\xac\xf8\xfc\xf3\xcf\ +\xbf\x04\xd0\x09\xe5\xa4\x4f\x5c\x51\xbf\x1a\xa9\xdb\x14\x9a\x68\ +\x1b\x71\x0a\xcd\x5d\x23\xd6\xa3\xac\x68\xb1\x79\x46\x15\x6e\xca\ +\x9f\x83\x7b\x86\xbf\xa2\xab\xf9\xf2\x6b\xd1\xbc\xb3\x2c\x03\x86\ +\x65\xc1\x44\xfc\xbe\xde\x37\xc3\x30\x8c\x26\xe1\x72\x41\xf0\xf9\ +\x7c\xfe\x4d\x9b\x36\xad\xdc\xb3\x67\xcf\x59\xc4\x92\x6f\xdb\x96\ +\xa0\xeb\xb2\x16\x90\x2a\x88\x42\x33\x6d\xc4\xf3\x28\x2b\x7a\x82\ +\xb8\xdc\x37\x0a\xe6\xe2\x9b\x23\x5e\x85\x34\x2f\xa3\x41\xba\xb6\ +\x25\x60\xc1\xd0\xd1\x21\x5e\xcf\x9e\xd9\x31\x75\xcb\xc9\xd7\x32\ +\xf9\xe1\x70\x18\x81\x40\x80\xd9\xb9\x73\xe7\x9a\x77\xde\x79\xa7\ +\x1a\xd1\xe1\x9e\x18\xf4\xc5\xbd\xf6\xaf\x85\xe4\xbe\x1d\x6c\xb9\ +\x78\xf2\x6c\xc9\xb4\x11\xcf\x6b\xee\x06\x56\xe3\xa6\x82\x39\xb8\ +\x67\xf8\x8f\x01\x50\x9a\x44\xcb\xcf\xc5\xb1\x3d\xcf\xf3\x60\x59\ +\x4e\x1a\xf3\x33\x0c\x03\x9e\xe7\x90\x93\x93\xa3\xa8\x5b\x34\xfb\ +\x5a\x5a\x2f\x13\x06\x7e\xef\xde\xbd\xaf\xbc\xf5\xd6\x5b\x7b\xa0\ +\x24\x3f\xee\xb1\xbe\x11\x52\xb3\x18\x94\x44\x90\x0b\x0d\x85\xbb\ +\x6f\xd8\x80\x5b\x3d\xfa\xef\x05\xdc\x94\x3f\x1b\xf7\x8e\x10\x36\ +\x88\x1a\x11\x2f\x9e\x03\x7c\x84\xfc\xe8\x30\x8f\x61\x04\x37\xc0\ +\xb2\x2c\x06\x0e\xcc\x93\xea\xd6\xf3\xf9\x6a\x2b\x70\xf0\xe0\xc1\ +\x37\xd7\xad\x5b\x57\x89\x58\xcd\xb7\x25\xe8\x53\x23\x35\xf3\x00\ +\x16\x77\xff\x24\xb1\x23\xb8\xe7\x86\x17\xd0\xcb\x3d\x10\x7b\xeb\ +\x5e\x03\xcb\xd1\x00\x80\xec\x8c\x7e\x98\x54\xb2\x0a\x37\x0f\x7a\ +\x08\x3c\x4f\xa9\x48\x86\xe2\x3c\xea\x02\xa0\x18\x02\x8a\x33\x80\ +\x0c\xc3\x08\x93\x3d\x1c\x87\xc2\xc2\xc1\x00\x62\x35\x5f\x8f\xfc\ +\xda\xda\xda\xdf\xad\x5e\xbd\xfa\xf7\x10\xc8\xb7\x3d\xe2\xd7\x42\ +\x4a\xfe\x37\x30\x51\xca\xe3\x11\x1a\xa3\x37\x84\x26\x96\x3c\x85\ +\x91\x79\xff\x82\x73\x4d\xbb\xd0\x23\xa3\x1f\x86\xf7\xbf\x17\x4e\ +\x2a\x53\xd2\x6a\x20\x96\x70\x79\x9a\x00\xa5\xef\x67\x39\x56\x5a\ +\xb9\x63\x18\x16\x4e\x87\x03\x05\x05\x05\x60\x23\xb3\x79\x7a\x91\ +\xbe\x98\x7e\xfa\xf4\xe9\xad\x2b\x56\xac\xf8\x05\x94\x63\xfd\xa4\ +\x69\xbe\x88\xa4\xfe\x7b\x78\x3a\xa3\x4f\x96\x07\xb7\x14\x0a\xef\ +\x0a\xaa\x76\xd8\x10\x5a\x00\xb9\xff\x17\x22\x7f\xd1\x0a\x70\x1c\ +\x87\xbc\xbc\x3c\x50\x14\x65\x6a\xf2\x43\xa1\x10\xea\xea\xea\x76\ +\x2c\x5b\xb6\xec\x55\x44\x67\xf9\x44\xf2\x6d\x8d\xf8\xb5\xf0\x95\ +\x1e\x05\x90\x40\xa9\xd5\xe6\xe4\x8b\x9f\x62\x10\xc8\xc6\xac\xf3\ +\x0b\xd7\x45\x45\x45\xba\x1a\x2f\x0f\xfc\x2e\x5d\xba\xb4\x7b\xd9\ +\xb2\x65\xeb\x68\x9a\x6e\x83\x72\x75\x2f\xe9\xe4\x03\x5d\x5c\x00\ +\xec\x72\x0d\xda\x26\xde\xfc\x1e\xc0\x83\xe7\x38\xd9\xe6\x0d\x21\ +\x10\xa4\x1c\x14\x4a\x4a\x4a\x74\x7d\xbe\x6c\x7e\x7f\xc7\xe2\xc5\ +\x8b\x57\xfb\xfd\xfe\x16\x08\x63\x7d\xdb\xa6\x78\x49\x91\x36\x8b\ +\x41\xa9\x0a\x0e\xb5\x89\xd4\xce\xa3\x67\x0d\xc4\x43\x18\xfa\x09\ +\x01\x1f\xc3\xb2\x60\x58\x61\x98\x3e\xa8\xa0\x00\x6e\xb7\x5b\x61\ +\x01\xd4\xe4\x9f\x3e\x7d\x7a\xeb\x93\x4f\x3e\xf9\x2a\x4d\xd3\xad\ +\x88\xfa\x7c\xf1\xad\x9e\x94\x90\x0f\xa4\x91\x00\xa4\x12\xd6\x35\ +\x3d\xb6\x9c\x20\x04\x91\x0d\x1d\x0c\x03\x96\x61\x00\x9e\x87\xc3\ +\xe1\x84\xc7\x53\x64\x38\xc5\x5b\x5b\x5b\xfb\xdb\xe5\xcb\x97\xff\ +\x02\xd1\x68\x5f\xbe\xa9\xc3\x96\x29\x5e\x52\x74\x69\x17\x90\x4c\ +\xe8\x09\x84\x38\x04\x14\x26\x81\x84\x18\x80\x15\xd7\xf4\x1d\x0e\ +\xf4\xe8\x91\x89\x81\x03\x07\xe8\x99\x7e\xfe\xe0\xc1\x83\x6f\x2c\ +\x5f\xbe\xfc\xe7\x10\x02\x3e\x71\x8a\xf7\xba\x90\x0f\x5c\x87\x3d\ +\x81\x5d\x15\xb1\x43\x40\x41\xfb\x85\x0d\x1d\x00\x40\x21\xc3\x95\ +\x81\xfe\xf9\x05\xe0\x38\x2e\x46\xeb\x83\xc1\x20\xb3\x6f\xdf\xbe\ +\x17\xd7\xae\x5d\xbb\x0d\xca\x0d\x1d\x29\xf5\xf9\x6a\x7c\x25\x5d\ +\x00\x49\x3c\x61\xe4\x06\x48\xca\xca\x0f\x8a\x02\x32\x32\x5c\x00\ +\x78\xe4\xe5\x0d\x8c\xd1\x7e\xbf\xdf\xef\xdd\xb1\x63\xc7\x9a\x9f\ +\xfe\xf4\xa7\xe2\xf4\xae\x7c\x43\xc7\x75\x23\x1f\xf8\x8a\x0a\x40\ +\x2a\x41\x51\x14\x1c\x0e\x07\x32\x32\x32\xd0\xbb\x77\x6f\x00\x50\ +\x04\x7e\x1d\x1d\x1d\xd7\xfe\xf8\xc7\x3f\xae\xd8\xb4\x69\xd3\x61\ +\x08\x26\xdf\xb6\xdd\x3c\x76\xa0\x5b\x00\x12\x00\x45\x51\x70\x46\ +\x36\x71\x3a\x1c\x0e\xf4\xee\xdd\x5b\xa1\xfd\x6d\x6d\x6d\x75\x3f\ +\xf9\xc9\x4f\x96\xed\xd9\xb3\xe7\x0b\x08\xe4\x8b\x9b\x38\xd3\x82\ +\x7c\xa0\x5b\x00\xe2\x86\xa8\xf9\x4e\xa7\x13\x6e\xb7\x1b\x80\xe0\ +\x1a\x44\xf2\xaf\x5e\xbd\x5a\xbd\x66\xcd\x9a\x95\xc7\x8f\x1f\xbf\ +\x02\xed\xcd\x1c\xd7\x9d\x7c\xe0\x2b\x2a\x00\xe2\x2e\x5b\xab\xa0\ +\x28\x8a\x38\x0e\x10\x05\xc0\xe5\x72\x81\xa2\x28\x45\xe0\x77\xe1\ +\xc2\x85\xbf\x2e\x5d\xba\x74\x6d\x53\x53\x53\x0b\xa2\xc3\xbc\x84\ +\xb6\x6f\x27\x0b\xf6\x09\x00\xcf\x77\xa9\x91\x80\x15\xb2\xb5\xca\ +\x0a\x02\xe0\x84\xd3\x29\x3c\x7a\x30\x18\x44\x28\x14\xc2\xb1\x63\ +\xc7\x7e\xb7\x68\xd1\xa2\x9f\x21\x1a\xec\xa9\x67\xf7\xd2\x86\x7c\ +\x80\x7c\x1e\x80\x57\x1d\x1c\xae\xd3\xb8\x35\xd5\x10\x2d\x49\xd4\ +\xa2\x50\x00\x04\xed\xa7\x1c\x14\x9c\x4e\x07\x42\xa1\x20\x68\x9a\ +\xe6\x3f\xfe\xf8\xe3\x1f\x2e\x5a\xb4\xe8\x4d\x00\xf2\x79\xfd\xb4\ +\x33\xfb\x72\x58\xb1\x00\x22\xf1\x2c\x84\x20\x86\x86\xf0\x70\x5d\ +\x0e\x46\xda\x2f\xde\xd3\xcb\x43\x51\xc2\xc1\xf3\x80\x83\xa2\x10\ +\xa4\x69\x04\x83\x41\xb6\xa2\xa2\xe2\xf1\xd7\x5f\x7f\xfd\x13\x44\ +\x83\xbd\xb4\x18\xe6\x99\x81\x44\x00\xe4\x5a\xcf\x40\x20\x3d\x08\ +\xe1\x21\x01\x00\x0e\x87\x23\x6e\xbf\x2b\x35\x92\x60\xf9\x44\x21\ +\x27\x5e\xec\x87\xc3\xe1\x00\xc7\x71\x31\x9f\x91\x12\xa0\x28\x0a\ +\x5e\xaf\xd7\xff\xda\x6b\xaf\xcd\xa9\xac\xac\x3c\x09\x41\xeb\xd3\ +\x2e\xd2\x37\x02\xa9\x05\xe0\x21\x48\x72\x18\xc2\x03\x8a\x3f\xbb\ +\x1d\x00\x80\xcc\xcc\x4c\xfb\x7b\x96\x64\xd8\x21\x6c\x67\xcf\x9e\ +\xad\x5a\xb2\x64\xc9\xb3\xfb\xf7\xef\xbf\x02\xc1\xdf\xa7\xbd\xc9\ +\x57\x83\xe4\x5b\xa0\x00\x38\x01\x64\x00\xe8\x09\xe1\xf7\x02\x7b\ +\x01\xc8\x02\x90\x09\x21\x8e\xf8\xaa\xaf\x29\xc8\x7f\x7f\x87\x83\ +\xe0\xfe\x42\x10\x94\x41\x3c\x42\x48\xd3\x48\xdf\x08\xa4\x2e\x40\ +\xf4\xfd\xc1\x48\x1a\x0d\x41\xe2\x5d\x10\xc8\xef\x3a\xe1\x7f\x7c\ +\x50\x0b\x00\x8b\xa8\x10\x84\x11\xfd\x99\x16\xf5\x0f\x36\xa5\x3d\ +\xc8\xb7\xd4\x0a\x44\x3b\x21\x90\xee\x8c\x1c\x22\xf9\x5f\x75\x01\ +\x00\xb4\x85\x40\x0c\x88\xbb\x8c\xc9\x57\xc3\x0a\x71\x22\xd1\x72\ +\xd2\xff\x5e\xc8\x17\x21\x17\x02\x51\x10\xe4\xc3\xe3\x2e\x07\xab\ +\xe4\xd9\xb9\xd9\xb7\x2b\x83\xd7\x39\xef\x46\x37\xba\xd1\x8d\x6e\ +\x74\xa3\xab\xe0\xff\x01\xdd\x54\x8b\x5c\xc7\x61\xe8\xd6\x00\x00\ +\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ +\x00\x00\x0c\x9c\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ -\x00\x00\x80\x00\x00\x00\x80\x08\x06\x00\x00\x00\xc3\x3e\x61\xcb\ -\x00\x00\x09\x1b\x49\x44\x41\x54\x78\xda\xed\x9d\x7f\x8c\x14\x67\ -\x19\xc7\x3f\xef\xec\xec\x71\xcb\x1d\x72\x77\xd8\xbb\x63\x0f\x7a\ -\xb6\x0d\x28\x98\x6a\xea\x4a\x8c\xa5\x35\xa9\x56\x62\xa2\x89\x11\ -\x88\xd4\xc6\x98\x02\x96\x06\x42\x4d\xda\x44\x8b\xda\x54\x8d\x36\ -\xd5\xc4\x68\x62\xa9\x50\x51\x92\xca\x1f\x4d\x2d\xa8\x69\x54\x1a\ -\xff\xb0\x92\xa0\xa9\xe0\x24\x10\x8b\x28\x1c\xe5\xc7\x71\x2c\x5c\ -\xe1\xe0\x7e\x71\x77\xbb\x33\xf3\xfa\x47\xef\x70\x6f\xd9\x99\xdb\ -\xe3\x6e\x77\xe7\xc7\xf3\x4d\x36\x7b\xb7\xb7\xb7\x33\xfb\x3c\x9f\ -\xf7\x79\x9e\xf7\xc7\xcc\x0b\x22\x91\x48\x24\x12\x89\x44\x22\x91\ -\x48\x24\x12\x89\x44\x22\x91\x28\xfa\x52\x41\x38\x89\x4c\x26\xd3\ -\x01\xac\x02\x3a\x81\xf9\x31\xb2\xff\x75\xe0\x3c\xf0\x57\xcb\xb2\ -\x8e\xc7\x0e\x80\x4c\x26\xb3\x0c\xf8\x21\xf0\x39\xc0\x88\x79\x63\ -\x3c\x04\x7c\xc3\xb2\xac\x03\xd5\x3c\x68\xa2\x86\xce\x5f\x03\xfc\ -\x09\xb8\x3b\x28\x91\xa8\xc6\xea\x00\xbe\x92\x4e\xa7\x73\xd9\x6c\ -\xf6\x60\xa4\x01\xc8\x64\x32\x0f\x00\xbf\x07\xea\xc5\xef\x37\x45\ -\xe4\x07\xd3\xe9\xf4\xe5\x6c\x36\x7b\x38\x92\x29\x20\x93\xc9\xa4\ -\x80\x13\xc0\x22\xf1\xb7\xa7\xc6\x80\xe5\x96\x65\xbd\x5d\xe9\x03\ -\xd5\x22\xef\x3e\x2a\xce\x9f\x52\x73\x80\x6f\x56\xe3\x40\xb5\x00\ -\x60\xad\xf8\xb7\x2c\x7d\x21\x93\xc9\x24\xa2\x08\xc0\x3d\xe2\xdb\ -\xb2\xb4\x60\xbc\x5b\x1c\x1d\x00\x32\x99\x4c\x03\xd0\x28\xbe\x2d\ -\x5b\x6d\x51\x8b\x00\x49\xf1\x69\xb0\xec\x65\x88\x8d\xe3\x2d\x33\ -\x48\x27\x93\x4a\xa5\xe8\xec\x2c\x2f\xed\x29\xf5\x6e\x0f\xd6\x30\ -\x0c\x94\x52\x68\xad\x27\x3d\x82\xae\x91\x91\x11\xce\x9e\x3d\x2b\ -\x00\x14\x6a\xc9\x92\x25\xec\xdc\xb9\x33\x16\x2d\xef\xe8\xd1\xa3\ -\x6c\xde\xbc\x59\x00\x98\x89\x26\xa2\x40\xb1\xc2\x10\x01\x24\x05\ -\xcc\x82\xe3\x0b\x01\x98\x48\x03\x85\x3f\x0b\x08\x11\x04\x40\x29\ -\x35\x09\x80\x62\x08\x0a\x23\x80\x80\x10\x31\x00\x26\x1c\x5e\x0c\ -\x81\xd7\x7b\x0b\x1d\x2f\x10\x44\x2c\x02\x78\x39\xbe\x54\x6a\x70\ -\x5d\x57\x20\x08\x3b\x00\xa5\x5a\xbf\x57\x31\x58\x98\x02\x26\xba\ -\x8a\x5a\x6b\x5c\xd7\x15\x08\x8a\x64\x44\xcd\xf9\xa5\x5e\x9b\xf8\ -\x3f\xc3\x30\x6e\x8c\x1b\x88\x42\x12\x01\xa6\xeb\x7c\xbf\x82\x50\ -\xba\x8b\x21\x03\xa0\xd8\xf9\xb7\xd2\x72\x6f\x14\x83\xae\x83\x32\ -\x12\x32\x6e\x10\x16\x00\xa6\x72\xfe\x74\x60\x50\x4a\xa1\xc7\x9d\ -\x3f\xf1\x59\xa5\x86\x8d\xe3\x08\x82\x19\x34\xa7\xfb\xf5\xfb\x8b\ -\x5b\xed\xb4\x21\x28\x70\xf0\x74\x41\x88\xea\xa8\x63\xa0\x00\x30\ -\x0c\xa3\xac\xae\xde\xad\x16\x71\xc5\x10\x14\x7e\x56\x21\x0c\x85\ -\xf5\xc3\x74\x8e\x15\x46\x18\x02\x1d\x01\xbc\x46\xfa\x66\x7a\x0c\ -\x2f\x08\x8a\x8b\x47\xaf\x88\x54\x1c\x49\xc2\x9c\x46\x02\x19\x01\ -\x26\x0c\xfb\xef\x1e\x87\xbd\x87\xf2\x8c\xd9\x35\x34\xaa\xc6\x7b\ -\xed\xb4\x9e\x78\xd2\x93\x5e\x9b\xf4\x3b\x30\xc7\x54\xac\x59\x61\ -\xb2\x2c\x6d\x08\x00\x7e\x2d\xb3\x30\x05\x1c\xef\x71\xf8\xea\xaf\ -\x46\x22\x53\x6c\xfd\xf9\x2d\x87\x17\xd7\xcf\x09\x1c\x04\x81\x43\ -\x72\x22\xec\xbe\x7a\x28\x1f\xb9\x8a\x7b\xdf\x61\x3b\x70\xe7\x14\ -\x18\x00\x8a\x73\x67\x4d\xc3\x7e\x85\x14\xc4\xef\x14\xa8\x08\x20\ -\x63\xf5\x31\x2f\x02\x67\x6b\xd6\xce\x9d\xe2\xdf\x0d\x99\x0a\x08\ -\x36\x00\x33\x91\xe3\xc2\x86\x95\x39\x96\xb6\xe9\x92\x8e\x3f\x91\ -\x75\xd8\x75\x30\x89\x69\xca\x0a\xf5\xc0\x01\x30\x1b\xe1\xdf\xd5\ -\x70\x7b\xb3\xcb\xf2\x76\xb7\x24\x00\xa3\xa3\x36\xb9\xbe\x33\x98\ -\xb7\x2d\x05\x65\xc6\x1e\x00\x23\x88\x00\x54\xb6\x0e\x70\x41\xbb\ -\xe4\xfa\xba\xfe\xdf\x91\x17\x00\x02\x28\x5d\x31\xca\xc6\x9f\x1d\ -\x72\x57\xfe\x0b\x6e\x5e\x00\x88\x95\x0a\xeb\x0c\xed\x90\xbb\xda\ -\x05\xda\x11\x00\x82\x17\x00\x2a\x14\x02\x8a\x7b\x00\xda\x25\xd7\ -\x77\x32\xb6\xe9\x40\xae\x0d\xbc\x91\x0e\xfe\x53\xf1\x74\xa0\x02\ -\x78\x2b\x24\x01\xa0\x30\x12\xc4\x30\x1d\x08\x00\x31\x4f\x07\x02\ -\x40\x8d\xd2\x81\x00\x10\x8a\x74\xe0\xa2\xc7\xe3\x81\xd7\x23\xec\ -\x92\xa1\x30\x0f\xe5\xf3\x0e\x1f\x6d\xee\xe6\xae\xce\x85\xe0\xb3\ -\x34\xed\xd2\x35\x9b\x83\x6f\xd7\x13\xd6\x4b\x0d\x04\x80\x52\x01\ -\x40\xc3\xa7\x3e\xd4\xc8\xf7\x1f\x6e\x63\x2c\xef\x3d\x87\xdf\xd3\ -\x67\xb3\x71\x7b\x37\x24\xe7\x61\xbe\xe7\x76\x01\x20\x2a\xce\x5f\ -\xfc\xde\x3a\xbe\xb5\xb6\x95\xa1\x51\xef\xc9\x29\x17\xd8\xfa\x8b\ -\x9e\x77\x67\x1e\x73\x83\xe4\xfb\xcf\x92\x9c\xdf\x19\xba\xef\x2b\ -\x35\x40\x91\x16\x36\x27\x79\x61\x53\x1a\xc7\x67\x62\xd2\x76\x34\ -\x1b\x7e\xd6\x3d\x09\x10\x9d\x1f\x24\x7f\xcd\xff\xc6\x9e\x1a\x59\ -\x10\x12\x68\x35\x37\x9a\x6c\xdf\x94\xc6\x4c\x78\x27\x74\x57\xc3\ -\xb6\x3d\x59\x7a\xfb\xed\xa2\xbc\xaf\xd0\xf6\x08\xf6\xc0\x39\x89\ -\x00\x61\x94\x52\xf0\x93\xf5\x0b\x49\xd5\x79\x9b\xc4\x50\xf0\xec\ -\xde\x5e\x8e\x9f\x1f\xf3\x2c\xfa\xdc\xdc\x20\xf9\xfe\x33\x02\x40\ -\x98\x94\x30\x14\x2f\x6e\x5e\x44\x7b\x93\xe9\xeb\xfc\xe7\xf6\xf5\ -\x72\xf0\xf8\xd0\xd4\x75\x44\x7e\x88\xfc\xb5\xd3\x02\x40\x18\xe4\ -\xb8\xf0\xd4\xea\xdb\xe8\x68\x49\x7a\x2e\x25\xab\x33\x15\xfb\xde\ -\xec\xe7\xc0\xb1\x61\xcc\xb2\xd6\x93\x29\xb4\x7d\x1d\x7b\xa0\x5b\ -\x00\x08\xba\x9e\x5e\xdb\xca\x7d\xcb\x1a\x7c\xdf\xf3\xbb\x7f\x0c\ -\xb0\xf3\xf5\x2b\xd3\xee\xeb\xbb\xb9\x81\xc0\xa7\x83\xd8\x02\x90\ -\xb3\x35\x1b\x1f\x6c\xe1\x13\x1f\x6c\xc0\x6b\x01\x52\xc2\x50\x1c\ -\x3a\x79\x9d\x9f\xef\xbf\xec\x5b\x18\x86\x39\x1d\xc4\x12\x80\xbc\ -\xa3\xf9\x6c\x66\x1e\x5f\xbc\xb7\xc9\x33\xec\x1b\x0a\xba\xb2\x63\ -\x3c\xf3\xf2\xc5\x99\x96\x97\x81\x4e\x07\xf1\x03\x40\xc3\xfd\xcb\ -\x1b\x79\x6a\x75\x2b\xb6\xcf\xfa\xf1\x2b\x83\x0e\x8f\xed\x38\x4f\ -\x62\x96\xd6\x90\xbb\xb9\x01\xec\xc1\xf3\x02\x40\x8d\x7d\x4f\x6b\ -\x93\xc9\xb7\xd7\xb6\x32\x96\xf7\x76\xbe\xd6\xb0\x75\x57\x0f\x49\ -\x33\xfa\x17\x10\xc4\x6a\x28\x58\x6b\xe8\x58\x90\xc4\x6f\xd1\x71\ -\xde\xd6\xac\xdf\x7e\x9e\xab\x43\x0e\x71\xb8\x97\x54\xec\x52\x80\ -\x9f\xf3\xeb\xeb\x14\x4f\xbf\x7c\x89\xab\x43\x36\x71\xb9\x91\x58\ -\xec\x00\xf0\x73\xec\x58\x5e\xb3\xe5\x33\x2d\xbe\xb5\x81\x00\x10\ -\x72\xe7\x5f\xee\xb7\x71\x3c\x1c\xac\x35\xdc\xd1\x5a\xc7\x8e\xc7\ -\x16\x49\x04\x88\x24\x00\x40\xf7\xe5\x3c\x3f\x7d\xed\x1d\xea\x3d\ -\xc6\xfc\x5d\x0d\x77\xb6\xd5\xf1\xdd\x75\xed\x8c\xe4\x5c\x01\xa0\ -\x76\xce\x52\x15\xa3\xe0\x0f\xff\x1c\xe4\xf9\x3f\xbe\xe3\x3b\xb8\ -\x73\xef\x07\xe6\xf2\xbd\x87\xda\x7d\xa7\x85\x05\x80\x90\x6a\x4e\ -\x52\xf1\x9b\xbf\xf5\xf3\xda\xa1\x01\xcf\x4b\xc5\x73\xb6\xe6\x81\ -\xbb\x1b\x79\xe4\x93\xcd\x44\xb9\x24\x88\xed\x50\x70\x9d\xa9\x78\ -\x61\xff\x65\xde\xf8\xd7\x90\xe7\x60\x8f\xed\x68\xbe\x74\x7f\x13\ -\x0f\xdd\xd7\xe4\x59\x37\x08\x00\x95\x4c\xd8\x55\xd0\x0f\xf6\xf6\ -\xf2\xc6\x5b\x43\x9e\x45\x9f\xd6\xb0\xe9\xd3\x2d\xac\xfd\x78\x13\ -\x51\xbc\x79\x49\xa0\x00\x98\x6a\x13\x88\x4a\x45\x82\x1f\xfd\xb6\ -\x97\x33\xbd\x39\xcf\x74\x30\x66\x6b\x1e\x5d\xd5\xc2\x47\xee\x4a\ -\xe1\xba\x02\x40\xc5\x54\xcb\xfb\x03\x3d\xbe\xeb\x02\xa7\x7b\x73\ -\x3e\xe7\x06\xcf\x3e\xdc\xce\xc7\x96\xce\x15\x00\x2a\x1d\x01\x6a\ -\x21\xc7\xd5\x3c\xb9\x3b\xcb\x85\x3e\xef\x2b\x82\x34\xf0\xcc\xba\ -\x56\x96\x2f\xae\x8f\x4c\x3a\x90\x08\x50\xa0\xd1\xbc\xcb\x13\xbb\ -\x2f\x70\x7d\xcc\xf5\x2c\x41\x0c\xa5\x78\xee\xcb\xed\xb4\x35\x99\ -\x91\x80\x20\x90\x45\x60\x2d\x41\x18\x1c\x71\x59\xff\x7c\x37\xc3\ -\x63\xde\xc9\xde\x4c\x28\x76\x6d\x59\x44\x5b\x93\x29\x00\x54\x8e\ -\x82\x5a\xa5\x21\x18\x1a\x75\xd9\xb6\x27\xeb\xdb\xc2\xcd\x84\xe2\ -\xc7\x8f\xa4\x69\x98\x63\x84\xfa\x1a\x41\x59\x15\xec\xa1\xae\x8b\ -\x39\xb6\xee\xea\xf1\xed\xff\x2f\x98\x97\x60\xf7\xe3\x8b\x99\x5b\ -\x67\x08\x00\xb3\x1f\x00\x6e\xb5\x5d\x29\x52\x49\x97\xc6\x7a\xe3\ -\xe6\x47\x2a\xe1\xbb\xee\xbf\x78\x18\xe2\xf4\xa5\x1c\xdb\xf6\x5c\ -\x64\x5e\xca\x28\xfd\x79\xf5\x06\x0b\x9b\x4d\x5e\xfa\xda\x62\x92\ -\x65\xac\x19\x0c\xe2\xfc\x52\xe4\x16\x84\x24\x13\x9a\x27\x5e\x49\ -\x32\xd2\x77\x0a\xed\xe4\x6e\x32\xbb\x99\xa0\x7c\x08\x14\x1c\x3b\ -\x37\xca\x3d\x4f\x9e\x9c\xf2\x7d\x8d\xf5\xe1\x8c\x02\x91\x5c\x11\ -\x94\xaa\x4f\x92\x4a\xbf\x9f\x7c\xdf\x09\xb4\x3b\xb3\x3b\x74\x2b\ -\x05\xf3\x52\xd1\xcd\x94\x11\xae\x01\x14\xc9\xe6\x25\xa8\x84\xdc\ -\x12\x36\xbe\x45\xa0\x32\x48\xce\xbf\x13\x65\xc8\x55\xf0\xa1\x00\ -\xa0\x70\x24\xb0\x3e\x39\x4b\x25\x93\x61\x92\x6c\x59\x1a\x08\x08\ -\x82\xb8\xca\x38\xb0\x00\xac\x59\x31\x9b\x0e\x1b\x4f\x07\x46\x6d\ -\xd3\xc1\xea\x95\x6d\x52\x04\x96\x03\x80\x52\x8a\xe5\x1d\x26\xbf\ -\xdc\x68\xb0\xf7\x70\x9e\xb1\xd9\xda\x69\xc5\x5d\x8a\x3d\x7c\xb1\ -\x3a\x5f\xa6\x60\x14\x29\x69\x2a\x56\xaf\x6c\xe3\xc3\x77\x34\x04\ -\x6e\x43\x8c\x40\x6f\x1b\xb7\xac\x23\xc1\x77\x16\x27\x3d\xff\x7e\ -\x6b\x9a\x3f\x73\xc7\x4e\x75\x1e\x5a\xa3\xb5\x03\x2a\x31\x69\x63\ -\x4a\x37\x80\x73\xc9\x32\x12\x78\x2b\xfd\x42\x5f\xdf\x6b\xb4\x76\ -\x27\x45\x80\xe2\x9d\x49\x05\x00\x1f\xe3\xf9\xbd\x16\xf4\xfd\x84\ -\x26\x1c\x9d\xb7\x1d\x30\xcc\x40\x3b\x3e\xd0\x00\xf8\x19\xae\x5a\ -\x06\x2d\xde\xbc\xc2\xef\xb9\xf0\x7c\x95\x52\x98\xa6\xe9\xf9\x77\ -\x29\x02\xa7\x11\x01\x8a\xb7\x68\xf5\x7a\xbd\x78\x9b\xd7\x89\xdf\ -\x67\x6a\xf4\x72\x21\x98\x4e\x44\x13\x00\xca\x34\x58\xb9\x3b\x78\ -\x7b\x39\xa3\x56\xc6\x2f\x6c\xed\x41\x6f\xfd\x81\x03\x60\x3a\x2d\ -\x48\x05\xe8\xda\x2d\x5d\xa2\xe0\xab\xce\xfe\x47\x11\x07\xa0\x94\ -\x71\x55\xc0\x2e\xda\x2b\x15\xb5\xc2\xe2\xfc\x50\x00\xe0\x05\x41\ -\xd0\x8c\x1b\xd6\x2d\xe4\x43\x33\x4b\xe2\x65\xe0\xa0\x44\x84\xb0\ -\x6e\x79\x1b\xfa\x69\x32\xd9\x6b\x38\x42\x00\x0c\x0f\x0f\x73\xe4\ -\xc8\x91\x58\x18\xbe\xab\xab\x4b\x00\x28\xd6\xa9\x53\xa7\xd8\xb2\ -\x65\x8b\x34\xcb\x2a\x4a\xe6\x02\x04\x00\x91\x00\x20\x12\x00\x44\ -\x02\x80\x48\x00\x10\x09\x00\x22\x01\xa0\x82\x92\x61\xbb\x80\xd9\ -\xab\xda\x00\x0c\x02\xb6\xf8\xb5\x6c\x5d\x8b\x14\x00\x96\x65\xb9\ -\xc0\x39\xf1\x6b\x59\x72\xaa\x61\xab\x5a\xd4\x00\xfb\xc5\xb7\x65\ -\xe9\xef\x96\x65\xf5\x47\x11\x80\x1d\xe3\x74\x8b\xfc\xb5\x3d\x92\ -\xbd\x00\xcb\xb2\x8e\x55\xeb\xcb\x85\x58\x7f\x01\x5e\x8d\x72\x37\ -\xf0\xeb\xc0\xeb\xe2\xe7\x92\x3a\x0e\xac\xb3\x2c\xab\x2a\x3d\xa6\ -\x44\x2d\xbe\x61\x36\x9b\x75\xd3\xe9\xf4\x2b\x40\x03\xb0\xa2\x56\ -\xe7\x11\xc0\x2e\xdf\x5e\xe0\xf3\x96\x65\x5d\xad\xd6\x41\x6b\xbe\ -\x9e\x2a\x93\xc9\x2c\x01\x36\x00\xab\x80\xf7\x01\x4d\x31\x72\xfa\ -\x30\xd0\x0d\x1c\x00\x7e\x6d\x59\xd6\x9b\xd2\x0e\x44\x22\x91\x48\ -\x24\x12\x89\x44\x22\x91\x48\x24\x12\x89\x44\x15\xd1\xff\x00\x56\ -\x1c\x01\xcd\xc9\x01\xf3\xd5\x00\x00\x00\x00\x49\x45\x4e\x44\xae\ -\x42\x60\x82\ +\x00\x00\x30\x00\x00\x00\x30\x08\x06\x00\x00\x00\x57\x02\xf9\x87\ +\x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\ +\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x05\x31\x00\x00\x05\x31\ +\x01\xb7\xed\x28\x52\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\ +\x74\x77\x61\x72\x65\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\ +\x70\x65\x2e\x6f\x72\x67\x9b\xee\x3c\x1a\x00\x00\x0c\x19\x49\x44\ +\x41\x54\x68\x81\x9d\x99\x7b\x8c\x15\xd5\x1d\xc7\x3f\x67\x66\x2e\ +\xe8\x2a\x25\x48\xc1\xa5\x20\x2a\x01\x5c\x05\x71\x45\x0b\xcb\xc3\ +\xda\xb8\x96\x44\xdb\xc2\x0a\xd1\x8d\xa0\x8b\x0f\xda\x8a\x6f\x94\ +\x6a\xfa\x07\x58\xff\x6a\xb4\xa9\x0d\x88\xca\x23\x36\x54\xc5\x68\ +\xa5\xb1\x2d\x52\xa5\xb0\x60\x5b\x82\x8d\xc6\xb0\xab\x18\x50\xd8\ +\x16\x58\x1e\xae\x2f\x28\xec\xe3\xde\x3b\x73\xce\xe9\x1f\x73\xce\ +\xdc\x33\xb3\x77\x97\xdd\x4e\xf2\xcb\x9c\x39\x33\x73\xe6\xfb\xfd\ +\xbd\x67\x46\x68\xad\xe9\xef\x56\x2f\x84\xff\xf8\x73\xcf\xed\xbe\ +\x78\xda\xb4\x31\x68\x4d\x6a\x85\x9e\xd6\xb3\x0f\x12\x22\xb9\x46\ +\x4b\x09\xa0\xbf\xdc\xb7\xef\xc4\xb3\xcb\x97\x57\x3f\x77\xe8\xd0\ +\x89\xfe\x62\x11\xfd\x25\x50\x2f\x84\xd7\xb0\x70\xe1\xce\xcb\xc7\ +\x8e\x9d\xd2\x75\xf0\xa0\x8f\x10\x69\x9c\xc9\xca\xa2\xdb\xbd\xc2\ +\x9e\x0f\x43\x74\x18\x26\x44\x72\xe7\x9d\xc7\xd7\xe7\x9e\x7b\xf0\ +\xa5\x57\x5f\x9d\xdc\x5f\x12\xfd\x22\x50\x2f\x84\xb7\x60\xc1\x82\ +\x7f\x4c\xa8\xac\xac\x29\x1c\x39\xe2\x77\xbb\x53\x08\xca\xae\x26\ +\x04\x5a\x29\x74\x14\x25\xc0\x85\x21\x28\x8c\xe4\x86\x0d\xe3\xe4\ +\xf0\xe1\x07\x5f\xda\xb0\xa1\x5f\x24\xfa\x4c\xa0\x5e\x08\xef\xe6\ +\xb9\x73\xdf\xbd\x7c\xe8\xd0\x69\xd1\x89\x13\x81\xee\x01\xb0\x9d\ +\x4f\x8e\xb5\x46\x4b\x89\x0e\x43\xb4\x52\x09\x68\x17\x3c\x42\x20\ +\x80\x60\xc8\x10\xda\x2f\xbc\xf0\xe0\x86\xd7\x5e\x9b\xbc\x62\xff\ +\xfe\x3e\x91\xe8\x13\x81\x7a\x21\xbc\x1f\xd7\xd6\x36\x5e\x39\x7c\ +\xf8\x4c\x55\x28\x04\x09\x50\xd2\x2e\x93\x5d\x49\x49\x19\x83\x8f\ +\xa2\x54\x6c\xb8\xda\xcf\x12\x09\x06\x0d\x22\x7f\xe9\xa5\x87\x5e\ +\x7e\xe5\x95\x2b\xfb\x42\xe2\x8c\x04\xea\x85\xf0\x6a\x27\x4d\xda\ +\x52\x33\x66\xcc\xf7\xd1\x3a\xd0\x06\xb4\x30\x80\xdd\xbb\x13\xab\ +\x68\x8d\x8a\xa2\x12\x78\x33\xef\x82\x4e\x80\x67\x5c\x09\x20\xa8\ +\xa8\x20\x9a\x32\xe5\xf0\xfa\x75\xeb\xae\x58\xd9\xd2\x72\xf2\xff\ +\x26\x50\x2f\x84\x3f\x63\xf4\xe8\xcd\xdf\x9b\x38\xb1\x56\x7b\x5e\ +\xd0\x13\x68\xed\xba\x8c\x52\x31\x78\xa5\x6c\x96\xc9\x3c\x51\xa4\ +\x34\x5f\x8e\x88\x9f\xcb\x91\x1b\x34\x08\x39\x6d\xda\xd1\x17\x57\ +\xae\x9c\xd8\x1b\x89\x1e\x09\xd4\x0b\xe1\x4f\x1f\x3d\x7a\xf3\x35\ +\x97\x5d\x56\x8b\x10\x81\x7b\x4e\x1b\x22\x91\x10\xf8\x4e\x1a\x55\ +\x4a\xc5\xc0\x4d\xc0\xba\xa0\xbb\x3d\xd8\x21\xa3\x00\xdf\x1c\xfb\ +\x03\x07\x12\xe4\x72\x31\xa9\x20\x40\x5c\x7b\xed\xd1\xf5\xcf\x3f\ +\x7f\xf9\x33\x7b\xf7\x96\x75\x27\xaf\x47\xf0\xa3\x46\x6d\xbe\x66\ +\xfc\xf8\x5a\x2d\x65\xa0\xa2\x08\x25\x25\x4a\x4a\xa4\x94\xa8\x28\ +\xe2\x44\x75\x35\xa2\xa1\x81\xbc\xe7\xa1\x95\x22\x0a\x43\xa4\x91\ +\xa8\x50\x40\x29\x85\x52\x0a\xa9\x14\xd2\xdc\x27\xa5\x4c\xcd\x2b\ +\x29\xf9\xaa\xba\x9a\x13\x75\x75\x84\x41\x00\x41\x00\x9e\x57\xba\ +\xbe\x58\x44\x35\x36\x8e\xbc\x7d\xd1\xa2\x8f\x1e\xb9\xf4\xd2\x21\ +\x7d\xb2\x40\xbd\x10\xfe\xb4\x11\x23\x36\x5f\x53\x55\x55\xab\x3d\ +\x2f\x28\xe7\x32\xa7\xa7\x4c\xa1\x7a\xc9\x12\x3c\xdf\xa7\x65\xc7\ +\x0e\xda\xd7\xae\x25\x57\x2c\xa2\x01\x15\x86\xe9\x60\xee\x45\xfb\ +\xff\xbd\xfa\x6a\x2e\x5a\xb8\x10\x3f\x08\x38\xf2\xcf\x7f\x72\xf6\ +\xa6\x4d\x0c\xd4\x3a\xe5\x5a\x1e\xb1\x7b\x45\x35\x35\x87\x37\x6e\ +\xdc\x58\xfd\x74\x73\x73\xca\x12\x29\x02\x16\xfc\xcc\xf1\xe3\x6b\ +\x11\x22\x50\x38\x81\x69\xc6\x5d\x35\x35\x4c\x32\xe0\x21\x4e\x93\ +\x2d\xdb\xb7\x73\x7a\xcd\x1a\xbc\xce\x4e\xd0\x3a\x89\x89\x72\x75\ +\xc2\x6e\xed\x53\xa7\x32\xf6\xee\xbb\x11\x42\xa0\x4c\x7a\xfd\xfc\ +\xbd\xf7\x18\xf0\xe6\x9b\xe4\xa2\x08\x61\xdc\xcb\x95\xae\x89\x13\ +\x0f\x6e\xda\xb6\x6d\xb2\x4b\x22\x21\x50\x2f\x84\x37\xbd\xb2\x72\ +\xd3\x8c\x71\xe3\x66\x69\x08\xb4\x03\x5a\x99\x8b\xf3\x35\x35\x4c\ +\xfa\xf9\xcf\xf1\x0d\x78\x77\xdb\xb7\x65\x0b\x27\x57\xad\x22\x17\ +\x86\xc9\x9c\xce\x68\x5f\x1b\x20\x9d\x33\x66\x50\xf5\xd3\x9f\x26\ +\xe0\xa5\x13\xec\xc7\x77\xed\x22\xf7\xc7\x3f\x12\x44\x51\xca\x02\ +\x96\xc4\x37\x23\x46\xec\x6f\x6c\x6e\x9e\x6a\x49\x08\xad\x35\xf5\ +\x42\x78\x33\x2a\x2b\xff\x34\x7d\xcc\x98\x1b\xb4\x10\x81\x05\x6d\ +\x33\x8c\x06\xc2\xe9\xd3\x99\xb8\x74\x69\x1c\x60\x65\xdc\x42\x6b\ +\xcd\xde\xb7\xdf\xe6\xeb\x67\x9f\x4d\x48\x94\x73\xa5\xfc\xcc\x99\ +\x4c\xbc\xf7\xde\xe4\x1e\x4b\x40\x6b\x9d\xb4\x4b\x9f\xef\xda\x45\ +\xb0\x71\x63\x42\x22\x11\x43\xe4\xb8\xef\x7f\xb2\xbd\xa5\x65\xe6\ +\xca\x96\x96\x93\x1e\x40\xf5\xb0\x61\x2b\xa6\x8f\x1e\x7d\x83\x92\ +\x32\xd0\x4e\xc0\x6a\x13\xb0\xf9\xc9\x93\x99\xf0\xe8\xa3\xe4\x06\ +\x0c\x88\x17\x31\xe2\x79\x5e\xea\xf8\xb2\x1b\x6f\x64\xc8\xfd\xf7\ +\x93\xf7\xbc\x24\x58\xdd\x40\xce\xcf\x9c\x49\xf5\x83\x0f\x92\xcb\ +\xe5\xf0\x7d\x1f\xcf\xf3\x12\x71\x95\x52\x39\x7d\x3a\x85\xba\x3a\ +\x22\x29\xe3\x60\xb7\x62\x70\x55\x16\x8b\x13\xae\x1e\x3e\x7c\x13\ +\x40\x00\xf0\xad\x8a\x8a\x31\x5a\xa9\x24\x60\x13\x31\xda\x97\x07\ +\x0e\x70\xf2\xf0\x61\xce\x1f\x3f\x3e\x05\xd8\xd5\xbe\xdd\x5f\xfe\ +\xa3\x1f\xf1\x91\xd6\x7c\xb9\x62\x05\x41\xb1\x98\x68\x5f\x5e\x77\ +\x1d\x57\x2f\x59\xd2\xed\x7a\x57\x19\x00\x52\x4a\xa2\x30\xa4\x73\ +\xcf\x1e\x72\x26\x36\x6c\xe1\xb4\x96\xf0\x80\xc1\x15\x15\x83\x30\ +\x63\xb4\xd6\x5a\x3b\x39\xdc\x32\xd6\x86\xf1\x80\xb6\x36\x0e\x2c\ +\x5b\xc6\x17\xfb\xf7\xa7\x08\x94\xb3\x84\xe7\x79\x5c\x31\x7b\x36\ +\xc3\x1e\x7a\x88\x7c\x10\xc4\xda\xbf\xee\x3a\xa6\x2e\x5d\x4a\x10\ +\x04\xdd\x34\x9f\xb5\x82\x8c\x22\xfe\xbd\x76\x2d\xe7\xee\xde\x5d\ +\xb2\x5e\x26\x15\xcb\x18\xa7\x4c\x2c\x80\x75\x19\x21\x50\x94\x82\ +\xd6\x1d\xe7\x8e\x1e\x65\xef\x2f\x7e\x81\xff\xd4\x53\x54\x56\x55\ +\xf5\x18\x07\xd6\xaf\xaf\x98\x3d\x1b\x0d\x7c\xd5\xd4\xc4\xcc\xc7\ +\x1e\x4b\x02\x56\x29\x95\x10\x75\x2d\xa1\x4c\x2d\x39\xb0\x7a\x35\ +\xe7\xec\xde\x8d\x04\x84\x94\xb1\xc6\x9d\x2a\x6d\xc7\xca\x8f\x9b\ +\xe1\x00\x4a\x15\xd4\x4d\x9b\x16\xbc\xd6\x3a\xf6\x3d\x60\xc0\xb1\ +\x63\x7c\xbc\x74\x29\xe2\x99\x67\x18\x51\x55\x65\xbc\x43\xa4\xdc\ +\xc2\x5a\x42\x29\xc5\x95\x73\xe6\xa0\x67\xcf\x4e\x0a\x98\x4b\x5a\ +\x29\x95\x90\xf0\x3c\x8f\x62\xb1\xc8\xde\x55\xab\x38\xeb\xc3\x0f\ +\x89\x84\x88\xb3\x8f\x71\x11\xe5\x8c\xad\x5b\x2b\x93\xb9\x3c\xf3\ +\x74\xa5\xa5\x04\x1b\xb8\x4e\x17\xa9\xc2\xb0\x44\x50\x4a\x82\x63\ +\xc7\x68\x5a\xb2\x84\xb6\xfd\xfb\xbb\xb9\x80\x75\x0f\xab\x61\x77\ +\xec\xfb\x3e\x42\x88\xd4\x35\xf6\x5c\x58\x2c\xb2\x67\xc5\x0a\x72\ +\x1f\x7c\x90\x0a\xfc\xc8\x48\xe2\x46\xc6\x52\x26\xa0\x75\x3a\x06\ +\xa2\x08\xdb\x32\x10\x45\x09\x78\x6d\xc7\x96\x94\x94\xf8\x47\x8f\ +\xf2\xc1\x7d\xf7\x71\x7c\xdf\xbe\x14\x10\x97\x88\x05\x6a\xc7\x16\ +\xbc\xbd\xde\x8e\xa3\x30\xe4\xc3\x5f\xff\x1a\xb5\x6b\x57\x02\x38\ +\x92\x32\xc9\x40\x2e\x09\xe5\xc4\x80\x34\xbd\x56\x4c\xc0\x09\x60\ +\x1b\x0f\x32\x0c\x63\x6b\x38\x01\x6d\xad\xa3\xa4\xc4\x6b\x6d\xe5\ +\x5f\x8b\x17\x73\xfc\xd3\x4f\x7b\x0c\x4a\x57\xd3\x16\xb0\x6b\x0d\ +\x19\x45\xec\xfa\xd5\xaf\x50\x3b\x77\xa2\xa2\x28\x06\xee\x80\x8e\ +\x6c\xff\x64\x70\x44\x6e\x3a\x55\x4a\xbb\x2e\xa4\xb5\x94\x60\x5d\ +\x25\x8a\x12\x77\xd2\x52\x96\xcd\x4e\x3a\x8a\xf0\x5a\x5b\xd9\xf9\ +\x93\x9f\xd0\xfa\xc9\x27\xf1\xbc\x49\x8b\xbd\x59\xc3\xce\xcb\x28\ +\xe2\xef\x4f\x3e\x49\xf8\xee\xbb\x44\x52\x52\x8c\x22\xa2\x28\x2a\ +\x35\x85\xc6\x23\x64\x14\xc5\x5a\xb7\xc7\x25\x52\x3a\x65\x01\x4c\ +\x0b\x9c\xb8\x8d\x03\xb8\x1b\x19\x6b\x19\x29\xe1\xd0\x21\xfe\xb1\ +\x68\x11\xc7\x5a\x5a\x92\xaa\x6a\x03\xb6\x1c\x70\x2b\x7f\x7b\xe2\ +\x09\x0a\x3b\x76\xc4\x79\xdf\x00\xb4\xbe\x1e\x39\x69\xd3\xed\x82\ +\x6d\x27\x6c\x89\x94\x08\x38\x01\x9b\x80\x37\x80\x71\x2b\xa1\x01\ +\x2f\xa3\x28\xd5\xfb\x9f\x3b\x79\x32\x43\x47\x8e\x4c\xb7\xcb\x66\ +\x6c\xdd\x28\x4b\xe6\xe2\x6b\xaf\x25\xf4\xfd\x52\x80\x9a\x34\x9a\ +\xf5\x7d\x4b\xc6\xba\x91\x74\x94\x9a\xa4\x51\x19\x45\x28\xdb\x0e\ +\x0b\x91\xa4\x2a\x5b\x05\x93\x96\xda\x36\x78\x4a\x25\x4d\xde\x59\ +\x75\x75\x5c\xff\xd4\x53\x71\xb5\x95\xb2\x5b\x81\x03\x92\x74\xe9\ +\x76\xbe\x57\xce\x99\x83\x52\x8a\x3d\x4f\x3e\x89\x57\x28\x94\x2a\ +\xad\x52\xe0\x79\xc9\x27\x18\x8b\xc5\x77\xf0\x00\x84\x42\x94\xea\ +\x80\x2c\x16\x95\x04\xb4\xe7\x41\x10\x94\x72\xad\x5b\x0f\xdc\xb1\ +\x91\xb3\xea\xea\xa8\x7d\xfa\xe9\xb8\x6e\x28\x5b\xf2\x48\x15\x2a\ +\x2b\x36\x16\xec\xa6\xb5\x66\x72\x5d\x1d\x4a\x29\x3e\xfa\xe5\x2f\ +\x93\xb6\xc3\x33\x9f\x60\x3c\xcf\x8b\xf3\x7e\x69\x51\x30\x44\x54\ +\x5c\x47\x9c\x42\x16\x86\x5a\x86\x61\x02\x50\x09\x81\xf6\x3c\x94\ +\xef\xa3\x3d\x0f\xed\xfb\xb1\x78\x5e\x42\x6e\xe0\xdc\xb9\x5c\xff\ +\x9b\xdf\x24\xe0\x5d\xed\xda\x42\xe6\x56\x5b\xa0\x2c\x89\xab\x6e\ +\xba\x09\x0d\x34\x2f\x5b\x86\x5f\x2c\xa2\x8c\x5f\x7b\x42\xe0\x1b\ +\x12\xae\xe6\x2d\x19\x69\x08\x25\xef\xba\xa9\xc6\xc0\x7e\xcb\x91\ +\x12\x49\xa9\xa5\x50\xc6\x4a\x03\x6e\xbd\x95\x1f\xfc\xf6\xb7\xb1\ +\x95\x0c\x78\x2b\xc9\xcb\xb9\xf9\x3a\xe1\xb6\x0b\x5a\x6b\x82\x20\ +\x48\x88\x59\x32\x57\xd5\xd5\x21\xa5\xe4\xa3\xe5\xcb\x53\x24\xb4\ +\x94\x78\x42\x10\x18\x57\x74\x5b\x6b\x2d\x84\xd3\x0b\x39\x24\xb2\ +\x1d\x4e\x76\x6e\x60\x7d\x3d\x3f\x5c\xb7\x0e\xa5\x35\x91\x09\xe6\ +\x24\x5b\x39\x16\xf0\x3c\x8f\x7c\x67\x27\xdf\x1c\x3f\xce\xe8\x4b\ +\x2e\x49\x11\xcc\x5a\xc1\xf7\x7d\xbe\x3b\x77\x2e\x52\x29\x9a\x97\ +\x2f\x27\x57\x28\xa4\xdf\xea\xa4\x4c\xda\x08\xeb\x4a\xca\xb5\x80\ +\xcb\xac\x37\x22\xb9\xfa\x7a\x66\xaf\x5f\x1f\x9b\xb0\x58\x4c\x9a\ +\xb0\x24\x43\x39\xee\x12\x16\x0a\xfc\xf9\x67\x3f\xa3\xb8\x77\x2f\ +\xd7\x6f\xd8\xc0\x45\x93\x26\xa5\x80\xfb\xbe\x9f\x6a\xfe\x7c\xdf\ +\x67\xea\xbc\x79\x28\x29\x69\x5e\xb6\x2c\x26\x41\xec\xf3\x6e\x10\ +\x5b\x5c\x61\x18\x96\x62\xc0\x3d\x51\x8e\x88\x00\xf4\xbc\x79\xcc\ +\x5a\xb3\x06\xcf\xf7\x13\x6d\xbb\x00\x5c\x57\x2a\xe6\xf3\xbc\xb5\ +\x78\x31\xc5\xad\x5b\x51\xc0\xdf\x16\x2c\x60\x96\x21\x61\x2d\x64\ +\x2d\x61\x2d\x60\xad\x33\x65\xde\x3c\x8a\xf9\x3c\x4d\x8f\x3f\xce\ +\x80\x42\x01\xdf\x80\xf4\x8d\x48\xb3\xcf\xc7\xc3\x38\x46\x14\x08\ +\xd5\x0b\xf8\xfc\xac\x59\x7c\x6f\xe5\x4a\x84\x79\xd3\x72\xdf\xa0\ +\x5c\x02\x52\x4a\xba\x3a\x3a\x78\xeb\x9e\x7b\x90\x5b\xb7\x26\xf7\ +\xcb\xc3\x87\x79\x67\xfe\x7c\xfe\xd3\xdc\x9c\xea\xeb\x2d\xf8\x6c\ +\xd5\x9e\x31\x7f\x3e\x97\x3c\xf1\x44\x2a\xe3\x65\x3f\x65\x6a\x03\ +\xd5\x03\x38\x0c\x2f\x1f\x80\xb6\x28\x03\x3c\x71\xa3\xa6\x26\x8e\ +\x99\x87\x67\xdb\x62\xd7\x0a\x5d\x1d\x1d\xbc\x73\xef\xbd\xb0\x6d\ +\x5b\x37\xf7\x93\xad\xad\xbc\xbd\x60\x41\x37\x12\x6e\x7f\x64\x89\ +\x14\xba\xba\x38\xee\xac\xe1\x82\x97\x40\x1b\x9c\x3a\x04\x7f\x4f\ +\x08\xac\xd1\xfa\xcd\x26\x78\xe0\x33\x68\xcb\x67\x2c\xe0\x01\x15\ +\x5f\x7c\xc1\xde\x3b\xef\xe4\xe0\xfb\xef\xa7\x1e\xea\x92\xc8\x77\ +\x76\xb2\xed\xfe\xfb\xf1\x1a\x1b\xcb\x2a\x41\x00\xaa\xb5\x95\xcd\ +\x65\x2c\x91\x05\xff\xfa\xdd\x77\x73\x6a\xfb\xf6\x6e\xe0\x23\xe0\ +\x38\x9c\x6e\x81\xd5\x6b\xb5\x5e\x9e\x10\x30\x24\xde\xd8\x03\x0f\ +\x7f\x06\x5f\xb6\x53\x7a\x89\xb0\x52\xd1\xd6\xc6\xc7\x0d\x0d\xb4\ +\xbc\xf7\x1e\x52\xca\x94\x1b\x15\xba\xba\x68\xbc\xef\x3e\x7c\x07\ +\xbc\x07\x65\xc7\xfa\xc8\x11\xde\xca\x90\xb0\x2f\x35\x5d\x1d\x1d\ +\xbc\xd4\xd0\xc0\xc9\x6d\xdb\xba\x7d\x3f\x2d\x00\xc7\xa0\xfd\x28\ +\xac\x5e\xaf\xf5\xe3\x16\x77\xea\xd3\xe2\x3a\xad\x5f\xfb\x14\x1e\ +\x38\x00\x5f\x9d\x32\x8c\x5d\x00\x15\x6d\x6d\x34\xdd\x76\x1b\x9f\ +\xee\xdc\x99\x68\xac\x98\xcf\xd3\xb8\x78\x31\xb9\xc6\xc6\xb8\x00\ +\xf5\x00\xdc\x3d\xa7\x5a\x5b\xd9\x74\xeb\xad\xfc\xbb\xa9\x29\x21\ +\xd1\xd5\xd1\xc1\x4b\xb7\xdf\xce\xc9\xad\x5b\x53\x6f\x63\x00\x9d\ +\xb1\xe6\xdb\xdb\x60\xf5\xef\xb5\x7e\xcc\xc5\x5c\xf6\xe3\xee\x22\ +\x21\xea\x2f\x80\x55\x17\xc2\xb7\x07\x13\x67\x01\x5b\xc8\x24\xd0\ +\x51\x59\x49\xcd\x1b\x6f\x30\xac\xaa\x8a\xbf\xdc\x76\x1b\x62\xcb\ +\x96\xe4\x9c\xca\x5c\xab\x7a\x11\x31\x6a\x14\x73\x5e\x7f\x9d\xf3\ +\xc7\x8e\x65\x43\x43\x03\xdf\x6c\xd9\x92\x00\xf7\xcd\xbe\x03\xf8\ +\x1a\xda\x4f\xc1\x9a\x0d\x5a\x2f\xcd\x62\xed\xf1\xeb\xf4\x5d\x42\ +\xdc\x32\x12\x9e\x1f\x0d\x43\x87\x66\x48\x28\xe0\x74\x65\x25\xfe\ +\x84\x09\xf8\x8d\x8d\x3d\x02\x3e\x13\x01\x6d\x48\x9c\x3d\x6e\x1c\ +\xa7\x77\xec\x88\x01\x39\x9a\x6f\x07\xbe\x80\xf6\x4e\x58\xfb\xaa\ +\xd6\x8f\x96\xc3\xd9\xeb\xff\x81\xbb\x84\xb8\xf9\x7c\x78\x61\x14\ +\x0c\x3d\x1f\x18\x70\x06\x60\x67\x02\x9c\x05\xef\xa6\xc9\x04\x90\ +\xd9\x9f\x04\x3e\x87\xce\x3c\xac\x7d\x4d\xeb\x25\x3d\x61\x3c\xe3\ +\x1f\x9a\xbb\x84\xb8\x79\x08\xbc\x70\x01\x0c\x1d\x09\x0c\x3c\x03\ +\xd0\x9e\xce\xe9\x32\xe3\x6c\x7e\xb7\xff\x0a\xbe\x06\x8e\x41\x67\ +\x11\xd6\xbc\xae\xf5\x23\xbd\xe1\xeb\xd3\x3f\xb2\x3b\x84\xb8\x65\ +\x70\x4c\xe2\xbc\x0b\x80\xb3\xcf\x40\xa2\x2f\x04\xca\x15\x28\x05\ +\xb4\x01\x47\xa1\x33\x84\x75\x7f\xd0\xfa\xe1\x33\x61\xeb\xf3\x5f\ +\xca\x3b\x84\xb8\xe5\x1c\x43\xe2\x62\x43\xc2\x6a\xdc\x16\x98\x2c\ +\xd0\xde\x5c\x26\x4b\x40\xc6\xc0\x39\x02\x9d\x51\x1f\xc1\xf7\x8b\ +\x00\xc0\x42\x21\x6e\x39\x0b\x56\x8f\x82\x21\xe3\x80\x8a\x1e\xc0\ +\xf6\xe6\x32\xe5\x5c\x27\x02\x0e\x03\x87\xa0\x53\xc1\xba\x37\xfa\ +\x08\xbe\xdf\x04\x20\xb6\x44\x0e\xd6\x7e\x07\x06\x8f\xa3\x7b\x76\ +\xb2\x02\xdd\x5d\xa6\xa7\xde\xa6\x15\x38\x08\x5d\x1a\xd6\x6d\xd4\ +\xfa\xa1\xfe\xe0\xe9\x37\x01\x80\x3b\x85\x98\xaf\xe0\xf9\x41\x30\ +\xd8\xce\xb9\xc0\x54\x99\xb9\x72\xbf\xaa\xec\x76\x0a\xba\x04\xbc\ +\xb8\x51\xeb\x07\xfa\x8b\xa5\x2c\x01\x11\xf7\x08\x6e\x17\x6b\xc5\ +\xd6\x18\xff\x06\x98\x55\x01\xb3\x8d\x56\x95\xe9\x0e\x85\xb6\xeb\ +\x66\x80\x96\x51\x53\xc2\x49\x43\xf3\x5f\xe1\x77\x94\xc2\xca\x8a\ +\x7b\x1c\x01\x52\x67\x00\x0b\xd3\x87\xfb\x40\xce\x80\xcb\x19\xf0\ +\xff\x8f\xf8\x99\xb1\xed\x0a\xac\x61\x2c\x10\x57\x24\x10\xf6\x63\ +\x6f\xef\x2b\x02\x51\xca\x02\xa6\x39\xb3\x0f\xb5\x60\x12\xad\x3b\ +\x73\xd9\x7d\xd6\x5a\x76\x0d\x1c\x02\x56\xeb\x29\x8d\x66\x88\x64\ +\xcf\x95\x13\xed\x5a\xe1\x7f\x98\x41\x2d\x15\x18\x86\xae\x05\x00\ +\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ +\x00\x00\x15\x39\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x00\x30\x00\x00\x00\x30\x08\x06\x00\x00\x00\x57\x02\xf9\x87\ +\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0b\x13\x00\x00\x0b\x13\ +\x01\x00\x9a\x9c\x18\x00\x00\x0a\x4d\x69\x43\x43\x50\x50\x68\x6f\ +\x74\x6f\x73\x68\x6f\x70\x20\x49\x43\x43\x20\x70\x72\x6f\x66\x69\ +\x6c\x65\x00\x00\x78\xda\x9d\x53\x77\x58\x93\xf7\x16\x3e\xdf\xf7\ +\x65\x0f\x56\x42\xd8\xf0\xb1\x97\x6c\x81\x00\x22\x23\xac\x08\xc8\ +\x10\x59\xa2\x10\x92\x00\x61\x84\x10\x12\x40\xc5\x85\x88\x0a\x56\ +\x14\x15\x11\x9c\x48\x55\xc4\x82\xd5\x0a\x48\x9d\x88\xe2\xa0\x28\ +\xb8\x67\x41\x8a\x88\x5a\x8b\x55\x5c\x38\xee\x1f\xdc\xa7\xb5\x7d\ +\x7a\xef\xed\xed\xfb\xd7\xfb\xbc\xe7\x9c\xe7\xfc\xce\x79\xcf\x0f\ +\x80\x11\x12\x26\x91\xe6\xa2\x6a\x00\x39\x52\x85\x3c\x3a\xd8\x1f\ +\x8f\x4f\x48\xc4\xc9\xbd\x80\x02\x15\x48\xe0\x04\x20\x10\xe6\xcb\ +\xc2\x67\x05\xc5\x00\x00\xf0\x03\x79\x78\x7e\x74\xb0\x3f\xfc\x01\ +\xaf\x6f\x00\x02\x00\x70\xd5\x2e\x24\x12\xc7\xe1\xff\x83\xba\x50\ +\x26\x57\x00\x20\x91\x00\xe0\x22\x12\xe7\x0b\x01\x90\x52\x00\xc8\ +\x2e\x54\xc8\x14\x00\xc8\x18\x00\xb0\x53\xb3\x64\x0a\x00\x94\x00\ +\x00\x6c\x79\x7c\x42\x22\x00\xaa\x0d\x00\xec\xf4\x49\x3e\x05\x00\ +\xd8\xa9\x93\xdc\x17\x00\xd8\xa2\x1c\xa9\x08\x00\x8d\x01\x00\x99\ +\x28\x47\x24\x02\x40\xbb\x00\x60\x55\x81\x52\x2c\x02\xc0\xc2\x00\ +\xa0\xac\x40\x22\x2e\x04\xc0\xae\x01\x80\x59\xb6\x32\x47\x02\x80\ +\xbd\x05\x00\x76\x8e\x58\x90\x0f\x40\x60\x00\x80\x99\x42\x2c\xcc\ +\x00\x20\x38\x02\x00\x43\x1e\x13\xcd\x03\x20\x4c\x03\xa0\x30\xd2\ +\xbf\xe0\xa9\x5f\x70\x85\xb8\x48\x01\x00\xc0\xcb\x95\xcd\x97\x4b\ +\xd2\x33\x14\xb8\x95\xd0\x1a\x77\xf2\xf0\xe0\xe2\x21\xe2\xc2\x6c\ +\xb1\x42\x61\x17\x29\x10\x66\x09\xe4\x22\x9c\x97\x9b\x23\x13\x48\ +\xe7\x03\x4c\xce\x0c\x00\x00\x1a\xf9\xd1\xc1\xfe\x38\x3f\x90\xe7\ +\xe6\xe4\xe1\xe6\x66\xe7\x6c\xef\xf4\xc5\xa2\xfe\x6b\xf0\x6f\x22\ +\x3e\x21\xf1\xdf\xfe\xbc\x8c\x02\x04\x00\x10\x4e\xcf\xef\xda\x5f\ +\xe5\xe5\xd6\x03\x70\xc7\x01\xb0\x75\xbf\x6b\xa9\x5b\x00\xda\x56\ +\x00\x68\xdf\xf9\x5d\x33\xdb\x09\xa0\x5a\x0a\xd0\x7a\xf9\x8b\x79\ +\x38\xfc\x40\x1e\x9e\xa1\x50\xc8\x3c\x1d\x1c\x0a\x0b\x0b\xed\x25\ +\x62\xa1\xbd\x30\xe3\x8b\x3e\xff\x33\xe1\x6f\xe0\x8b\x7e\xf6\xfc\ +\x40\x1e\xfe\xdb\x7a\xf0\x00\x71\x9a\x40\x99\xad\xc0\xa3\x83\xfd\ +\x71\x61\x6e\x76\xae\x52\x8e\xe7\xcb\x04\x42\x31\x6e\xf7\xe7\x23\ +\xfe\xc7\x85\x7f\xfd\x8e\x29\xd1\xe2\x34\xb1\x5c\x2c\x15\x8a\xf1\ +\x58\x89\xb8\x50\x22\x4d\xc7\x79\xb9\x52\x91\x44\x21\xc9\x95\xe2\ +\x12\xe9\x7f\x32\xf1\x1f\x96\xfd\x09\x93\x77\x0d\x00\xac\x86\x4f\ +\xc0\x4e\xb6\x07\xb5\xcb\x6c\xc0\x7e\xee\x01\x02\x8b\x0e\x58\xd2\ +\x76\x00\x40\x7e\xf3\x2d\x8c\x1a\x0b\x91\x00\x10\x67\x34\x32\x79\ +\xf7\x00\x00\x93\xbf\xf9\x8f\x40\x2b\x01\x00\xcd\x97\xa4\xe3\x00\ +\x00\xbc\xe8\x18\x5c\xa8\x94\x17\x4c\xc6\x08\x00\x00\x44\xa0\x81\ +\x2a\xb0\x41\x07\x0c\xc1\x14\xac\xc0\x0e\x9c\xc1\x1d\xbc\xc0\x17\ +\x02\x61\x06\x44\x40\x0c\x24\xc0\x3c\x10\x42\x06\xe4\x80\x1c\x0a\ +\xa1\x18\x96\x41\x19\x54\xc0\x3a\xd8\x04\xb5\xb0\x03\x1a\xa0\x11\ +\x9a\xe1\x10\xb4\xc1\x31\x38\x0d\xe7\xe0\x12\x5c\x81\xeb\x70\x17\ +\x06\x60\x18\x9e\xc2\x18\xbc\x86\x09\x04\x41\xc8\x08\x13\x61\x21\ +\x3a\x88\x11\x62\x8e\xd8\x22\xce\x08\x17\x99\x8e\x04\x22\x61\x48\ +\x34\x92\x80\xa4\x20\xe9\x88\x14\x51\x22\xc5\xc8\x72\xa4\x02\xa9\ +\x42\x6a\x91\x5d\x48\x23\xf2\x2d\x72\x14\x39\x8d\x5c\x40\xfa\x90\ +\xdb\xc8\x20\x32\x8a\xfc\x8a\xbc\x47\x31\x94\x81\xb2\x51\x03\xd4\ +\x02\x75\x40\xb9\xa8\x1f\x1a\x8a\xc6\xa0\x73\xd1\x74\x34\x0f\x5d\ +\x80\x96\xa2\x6b\xd1\x1a\xb4\x1e\x3d\x80\xb6\xa2\xa7\xd1\x4b\xe8\ +\x75\x74\x00\x7d\x8a\x8e\x63\x80\xd1\x31\x0e\x66\x8c\xd9\x61\x5c\ +\x8c\x87\x45\x60\x89\x58\x1a\x26\xc7\x16\x63\xe5\x58\x35\x56\x8f\ +\x35\x63\x1d\x58\x37\x76\x15\x1b\xc0\x9e\x61\xef\x08\x24\x02\x8b\ +\x80\x13\xec\x08\x5e\x84\x10\xc2\x6c\x82\x90\x90\x47\x58\x4c\x58\ +\x43\xa8\x25\xec\x23\xb4\x12\xba\x08\x57\x09\x83\x84\x31\xc2\x27\ +\x22\x93\xa8\x4f\xb4\x25\x7a\x12\xf9\xc4\x78\x62\x3a\xb1\x90\x58\ +\x46\xac\x26\xee\x21\x1e\x21\x9e\x25\x5e\x27\x0e\x13\x5f\x93\x48\ +\x24\x0e\xc9\x92\xe4\x4e\x0a\x21\x25\x90\x32\x49\x0b\x49\x6b\x48\ +\xdb\x48\x2d\xa4\x53\xa4\x3e\xd2\x10\x69\x9c\x4c\x26\xeb\x90\x6d\ +\xc9\xde\xe4\x08\xb2\x80\xac\x20\x97\x91\xb7\x90\x0f\x90\x4f\x92\ +\xfb\xc9\xc3\xe4\xb7\x14\x3a\xc5\x88\xe2\x4c\x09\xa2\x24\x52\xa4\ +\x94\x12\x4a\x35\x65\x3f\xe5\x04\xa5\x9f\x32\x42\x99\xa0\xaa\x51\ +\xcd\xa9\x9e\xd4\x08\xaa\x88\x3a\x9f\x5a\x49\x6d\xa0\x76\x50\x2f\ +\x53\x87\xa9\x13\x34\x75\x9a\x25\xcd\x9b\x16\x43\xcb\xa4\x2d\xa3\ +\xd5\xd0\x9a\x69\x67\x69\xf7\x68\x2f\xe9\x74\xba\x09\xdd\x83\x1e\ +\x45\x97\xd0\x97\xd2\x6b\xe8\x07\xe9\xe7\xe9\x83\xf4\x77\x0c\x0d\ +\x86\x0d\x83\xc7\x48\x62\x28\x19\x6b\x19\x7b\x19\xa7\x18\xb7\x19\ +\x2f\x99\x4c\xa6\x05\xd3\x97\x99\xc8\x54\x30\xd7\x32\x1b\x99\x67\ +\x98\x0f\x98\x6f\x55\x58\x2a\xf6\x2a\x7c\x15\x91\xca\x12\x95\x3a\ +\x95\x56\x95\x7e\x95\xe7\xaa\x54\x55\x73\x55\x3f\xd5\x79\xaa\x0b\ +\x54\xab\x55\x0f\xab\x5e\x56\x7d\xa6\x46\x55\xb3\x50\xe3\xa9\x09\ +\xd4\x16\xab\xd5\xa9\x1d\x55\xbb\xa9\x36\xae\xce\x52\x77\x52\x8f\ +\x50\xcf\x51\x5f\xa3\xbe\x5f\xfd\x82\xfa\x63\x0d\xb2\x86\x85\x46\ +\xa0\x86\x48\xa3\x54\x63\xb7\xc6\x19\x8d\x21\x16\xc6\x32\x65\xf1\ +\x58\x42\xd6\x72\x56\x03\xeb\x2c\x6b\x98\x4d\x62\x5b\xb2\xf9\xec\ +\x4c\x76\x05\xfb\x1b\x76\x2f\x7b\x4c\x53\x43\x73\xaa\x66\xac\x66\ +\x91\x66\x9d\xe6\x71\xcd\x01\x0e\xc6\xb1\xe0\xf0\x39\xd9\x9c\x4a\ +\xce\x21\xce\x0d\xce\x7b\x2d\x03\x2d\x3f\x2d\xb1\xd6\x6a\xad\x66\ +\xad\x7e\xad\x37\xda\x7a\xda\xbe\xda\x62\xed\x72\xed\x16\xed\xeb\ +\xda\xef\x75\x70\x9d\x40\x9d\x2c\x9d\xf5\x3a\x6d\x3a\xf7\x75\x09\ +\xba\x36\xba\x51\xba\x85\xba\xdb\x75\xcf\xea\x3e\xd3\x63\xeb\x79\ +\xe9\x09\xf5\xca\xf5\x0e\xe9\xdd\xd1\x47\xf5\x6d\xf4\xa3\xf5\x17\ +\xea\xef\xd6\xef\xd1\x1f\x37\x30\x34\x08\x36\x90\x19\x6c\x31\x38\ +\x63\xf0\xcc\x90\x63\xe8\x6b\x98\x69\xb8\xd1\xf0\x84\xe1\xa8\x11\ +\xcb\x68\xba\x91\xc4\x68\xa3\xd1\x49\xa3\x27\xb8\x26\xee\x87\x67\ +\xe3\x35\x78\x17\x3e\x66\xac\x6f\x1c\x62\xac\x34\xde\x65\xdc\x6b\ +\x3c\x61\x62\x69\x32\xdb\xa4\xc4\xa4\xc5\xe4\xbe\x29\xcd\x94\x6b\ +\x9a\x66\xba\xd1\xb4\xd3\x74\xcc\xcc\xc8\x2c\xdc\xac\xd8\xac\xc9\ +\xec\x8e\x39\xd5\x9c\x6b\x9e\x61\xbe\xd9\xbc\xdb\xfc\x8d\x85\xa5\ +\x45\x9c\xc5\x4a\x8b\x36\x8b\xc7\x96\xda\x96\x7c\xcb\x05\x96\x4d\ +\x96\xf7\xac\x98\x56\x3e\x56\x79\x56\xf5\x56\xd7\xac\x49\xd6\x5c\ +\xeb\x2c\xeb\x6d\xd6\x57\x6c\x50\x1b\x57\x9b\x0c\x9b\x3a\x9b\xcb\ +\xb6\xa8\xad\x9b\xad\xc4\x76\x9b\x6d\xdf\x14\xe2\x14\x8f\x29\xd2\ +\x29\xf5\x53\x6e\xda\x31\xec\xfc\xec\x0a\xec\x9a\xec\x06\xed\x39\ +\xf6\x61\xf6\x25\xf6\x6d\xf6\xcf\x1d\xcc\x1c\x12\x1d\xd6\x3b\x74\ +\x3b\x7c\x72\x74\x75\xcc\x76\x6c\x70\xbc\xeb\xa4\xe1\x34\xc3\xa9\ +\xc4\xa9\xc3\xe9\x57\x67\x1b\x67\xa1\x73\x9d\xf3\x35\x17\xa6\x4b\ +\x90\xcb\x12\x97\x76\x97\x17\x53\x6d\xa7\x8a\xa7\x6e\x9f\x7a\xcb\ +\x95\xe5\x1a\xee\xba\xd2\xb5\xd3\xf5\xa3\x9b\xbb\x9b\xdc\xad\xd9\ +\x6d\xd4\xdd\xcc\x3d\xc5\x7d\xab\xfb\x4d\x2e\x9b\x1b\xc9\x5d\xc3\ +\x3d\xef\x41\xf4\xf0\xf7\x58\xe2\x71\xcc\xe3\x9d\xa7\x9b\xa7\xc2\ +\xf3\x90\xe7\x2f\x5e\x76\x5e\x59\x5e\xfb\xbd\x1e\x4f\xb3\x9c\x26\ +\x9e\xd6\x30\x6d\xc8\xdb\xc4\x5b\xe0\xbd\xcb\x7b\x60\x3a\x3e\x3d\ +\x65\xfa\xce\xe9\x03\x3e\xc6\x3e\x02\x9f\x7a\x9f\x87\xbe\xa6\xbe\ +\x22\xdf\x3d\xbe\x23\x7e\xd6\x7e\x99\x7e\x07\xfc\x9e\xfb\x3b\xfa\ +\xcb\xfd\x8f\xf8\xbf\xe1\x79\xf2\x16\xf1\x4e\x05\x60\x01\xc1\x01\ +\xe5\x01\xbd\x81\x1a\x81\xb3\x03\x6b\x03\x1f\x04\x99\x04\xa5\x07\ +\x35\x05\x8d\x05\xbb\x06\x2f\x0c\x3e\x15\x42\x0c\x09\x0d\x59\x1f\ +\x72\x93\x6f\xc0\x17\xf2\x1b\xf9\x63\x33\xdc\x67\x2c\x9a\xd1\x15\ +\xca\x08\x9d\x15\x5a\x1b\xfa\x30\xcc\x26\x4c\x1e\xd6\x11\x8e\x86\ +\xcf\x08\xdf\x10\x7e\x6f\xa6\xf9\x4c\xe9\xcc\xb6\x08\x88\xe0\x47\ +\x6c\x88\xb8\x1f\x69\x19\x99\x17\xf9\x7d\x14\x29\x2a\x32\xaa\x2e\ +\xea\x51\xb4\x53\x74\x71\x74\xf7\x2c\xd6\xac\xe4\x59\xfb\x67\xbd\ +\x8e\xf1\x8f\xa9\x8c\xb9\x3b\xdb\x6a\xb6\x72\x76\x67\xac\x6a\x6c\ +\x52\x6c\x63\xec\x9b\xb8\x80\xb8\xaa\xb8\x81\x78\x87\xf8\x45\xf1\ +\x97\x12\x74\x13\x24\x09\xed\x89\xe4\xc4\xd8\xc4\x3d\x89\xe3\x73\ +\x02\xe7\x6c\x9a\x33\x9c\xe4\x9a\x54\x96\x74\x63\xae\xe5\xdc\xa2\ +\xb9\x17\xe6\xe9\xce\xcb\x9e\x77\x3c\x59\x35\x59\x90\x7c\x38\x85\ +\x98\x12\x97\xb2\x3f\xe5\x83\x20\x42\x50\x2f\x18\x4f\xe5\xa7\x6e\ +\x4d\x1d\x13\xf2\x84\x9b\x85\x4f\x45\xbe\xa2\x8d\xa2\x51\xb1\xb7\ +\xb8\x4a\x3c\x92\xe6\x9d\x56\x95\xf6\x38\xdd\x3b\x7d\x43\xfa\x68\ +\x86\x4f\x46\x75\xc6\x33\x09\x4f\x52\x2b\x79\x91\x19\x92\xb9\x23\ +\xf3\x4d\x56\x44\xd6\xde\xac\xcf\xd9\x71\xd9\x2d\x39\x94\x9c\x94\ +\x9c\xa3\x52\x0d\x69\x96\xb4\x2b\xd7\x30\xb7\x28\xb7\x4f\x66\x2b\ +\x2b\x93\x0d\xe4\x79\xe6\x6d\xca\x1b\x93\x87\xca\xf7\xe4\x23\xf9\ +\x73\xf3\xdb\x15\x6c\x85\x4c\xd1\xa3\xb4\x52\xae\x50\x0e\x16\x4c\ +\x2f\xa8\x2b\x78\x5b\x18\x5b\x78\xb8\x48\xbd\x48\x5a\xd4\x33\xdf\ +\x66\xfe\xea\xf9\x23\x0b\x82\x16\x7c\xbd\x90\xb0\x50\xb8\xb0\xb3\ +\xd8\xb8\x78\x59\xf1\xe0\x22\xbf\x45\xbb\x16\x23\x8b\x53\x17\x77\ +\x2e\x31\x5d\x52\xba\x64\x78\x69\xf0\xd2\x7d\xcb\x68\xcb\xb2\x96\ +\xfd\x50\xe2\x58\x52\x55\xf2\x6a\x79\xdc\xf2\x8e\x52\x83\xd2\xa5\ +\xa5\x43\x2b\x82\x57\x34\x95\xa9\x94\xc9\xcb\x6e\xae\xf4\x5a\xb9\ +\x63\x15\x61\x95\x64\x55\xef\x6a\x97\xd5\x5b\x56\x7f\x2a\x17\x95\ +\x5f\xac\x70\xac\xa8\xae\xf8\xb0\x46\xb8\xe6\xe2\x57\x4e\x5f\xd5\ +\x7c\xf5\x79\x6d\xda\xda\xde\x4a\xb7\xca\xed\xeb\x48\xeb\xa4\xeb\ +\x6e\xac\xf7\x59\xbf\xaf\x4a\xbd\x6a\x41\xd5\xd0\x86\xf0\x0d\xad\ +\x1b\xf1\x8d\xe5\x1b\x5f\x6d\x4a\xde\x74\xa1\x7a\x6a\xf5\x8e\xcd\ +\xb4\xcd\xca\xcd\x03\x35\x61\x35\xed\x5b\xcc\xb6\xac\xdb\xf2\xa1\ +\x36\xa3\xf6\x7a\x9d\x7f\x5d\xcb\x56\xfd\xad\xab\xb7\xbe\xd9\x26\ +\xda\xd6\xbf\xdd\x77\x7b\xf3\x0e\x83\x1d\x15\x3b\xde\xef\x94\xec\ +\xbc\xb5\x2b\x78\x57\x6b\xbd\x45\x7d\xf5\x6e\xd2\xee\x82\xdd\x8f\ +\x1a\x62\x1b\xba\xbf\xe6\x7e\xdd\xb8\x47\x77\x4f\xc5\x9e\x8f\x7b\ +\xa5\x7b\x07\xf6\x45\xef\xeb\x6a\x74\x6f\x6c\xdc\xaf\xbf\xbf\xb2\ +\x09\x6d\x52\x36\x8d\x1e\x48\x3a\x70\xe5\x9b\x80\x6f\xda\x9b\xed\ +\x9a\x77\xb5\x70\x5a\x2a\x0e\xc2\x41\xe5\xc1\x27\xdf\xa6\x7c\x7b\ +\xe3\x50\xe8\xa1\xce\xc3\xdc\xc3\xcd\xdf\x99\x7f\xb7\xf5\x08\xeb\ +\x48\x79\x2b\xd2\x3a\xbf\x75\xac\x2d\xa3\x6d\xa0\x3d\xa1\xbd\xef\ +\xe8\x8c\xa3\x9d\x1d\x5e\x1d\x47\xbe\xb7\xff\x7e\xef\x31\xe3\x63\ +\x75\xc7\x35\x8f\x57\x9e\xa0\x9d\x28\x3d\xf1\xf9\xe4\x82\x93\xe3\ +\xa7\x64\xa7\x9e\x9d\x4e\x3f\x3d\xd4\x99\xdc\x79\xf7\x4c\xfc\x99\ +\x6b\x5d\x51\x5d\xbd\x67\x43\xcf\x9e\x3f\x17\x74\xee\x4c\xb7\x5f\ +\xf7\xc9\xf3\xde\xe7\x8f\x5d\xf0\xbc\x70\xf4\x22\xf7\x62\xdb\x25\ +\xb7\x4b\xad\x3d\xae\x3d\x47\x7e\x70\xfd\xe1\x48\xaf\x5b\x6f\xeb\ +\x65\xf7\xcb\xed\x57\x3c\xae\x74\xf4\x4d\xeb\x3b\xd1\xef\xd3\x7f\ +\xfa\x6a\xc0\xd5\x73\xd7\xf8\xd7\x2e\x5d\x9f\x79\xbd\xef\xc6\xec\ +\x1b\xb7\x6e\x26\xdd\x1c\xb8\x25\xba\xf5\xf8\x76\xf6\xed\x17\x77\ +\x0a\xee\x4c\xdc\x5d\x7a\x8f\x78\xaf\xfc\xbe\xda\xfd\xea\x07\xfa\ +\x0f\xea\x7f\xb4\xfe\xb1\x65\xc0\x6d\xe0\xf8\x60\xc0\x60\xcf\xc3\ +\x59\x0f\xef\x0e\x09\x87\x9e\xfe\x94\xff\xd3\x87\xe1\xd2\x47\xcc\ +\x47\xd5\x23\x46\x23\x8d\x8f\x9d\x1f\x1f\x1b\x0d\x1a\xbd\xf2\x64\ +\xce\x93\xe1\xa7\xb2\xa7\x13\xcf\xca\x7e\x56\xff\x79\xeb\x73\xab\ +\xe7\xdf\xfd\xe2\xfb\x4b\xcf\x58\xfc\xd8\xf0\x0b\xf9\x8b\xcf\xbf\ +\xae\x79\xa9\xf3\x72\xef\xab\xa9\xaf\x3a\xc7\x23\xc7\x1f\xbc\xce\ +\x79\x3d\xf1\xa6\xfc\xad\xce\xdb\x7d\xef\xb8\xef\xba\xdf\xc7\xbd\ +\x1f\x99\x28\xfc\x40\xfe\x50\xf3\xd1\xfa\x63\xc7\xa7\xd0\x4f\xf7\ +\x3e\xe7\x7c\xfe\xfc\x2f\xf7\x84\xf3\xfb\x25\xd2\x9f\x33\x00\x00\ +\x00\x04\x67\x41\x4d\x41\x00\x00\xb1\x8e\x7c\xfb\x51\x93\x00\x00\ +\x00\x20\x63\x48\x52\x4d\x00\x00\x7a\x25\x00\x00\x80\x83\x00\x00\ +\xf9\xff\x00\x00\x80\xe9\x00\x00\x75\x30\x00\x00\xea\x60\x00\x00\ +\x3a\x98\x00\x00\x17\x6f\x92\x5f\xc5\x46\x00\x00\x0a\x56\x49\x44\ +\x41\x54\x78\xda\xec\x9a\x6b\x6c\x14\xd7\x15\xc7\x7f\x33\xb3\xeb\ +\xf5\x7a\xfd\xc0\x6f\xb0\xcd\xc3\x84\xe0\x10\xf3\x34\x06\x63\xb1\ +\x89\x49\x08\xaf\x24\x6a\x90\x5a\xa9\x95\xd5\x28\x54\x55\x1e\x9b\ +\x54\x45\x45\x72\x55\xea\x94\x48\x29\x91\x22\x55\x54\x91\x9a\x60\ +\x91\xa7\x4b\xa3\x56\xfd\xd2\xb4\x88\xa8\x51\x93\x94\x84\xa6\x09\ +\xa5\x21\x69\x42\x09\x14\x08\x84\x57\x8c\x8d\x0d\xf6\x7a\xd7\xbb\ +\x3b\x33\x77\x6e\x3f\xcc\xdd\x97\x1f\x24\x06\x43\x1a\xa9\x23\x1d\ +\xdd\xbb\x73\xcf\x39\xf7\xfc\xcf\x39\xf7\x39\xab\x49\x29\xf9\x3a\ +\x3f\x3a\x5f\xf3\xe7\xff\x00\xbe\xea\xc7\x73\x2d\x94\x76\x6c\xc8\ +\x6f\x05\x42\x80\x01\xbc\x0a\x74\x84\x3a\x23\x17\xaf\x45\x5f\xda\ +\x44\x0f\xe2\x8e\x0d\xf9\xdb\xe7\x2c\x5b\x10\x5a\x74\xc7\x9d\x68\ +\xba\xce\xe9\xc3\x1f\xb3\xef\x4f\xaf\x61\x99\xd6\x83\xa1\xce\xc8\ +\xb3\x13\x8e\x40\x4a\x39\x61\xb4\xfd\xbe\xc0\x53\xef\xff\xee\x2e\ +\x29\xa3\xfb\xa5\x8c\x7d\x22\x65\xec\xb0\x94\xd1\x0f\xe5\xe0\xa9\ +\x67\xe4\x8b\xa1\x32\xb9\xfd\xbe\x40\x70\x22\xfb\x93\x52\x4e\xdc\ +\x18\xe8\xd8\x90\xdf\x5a\x35\xa3\x66\x63\xc3\x5d\x9b\x41\x2f\x06\ +\x2d\xcf\x25\xa3\x98\xfc\xf2\x16\xd6\xde\xff\x20\x2a\xad\xfe\x67\ +\x07\x71\x68\xc5\x7d\x3f\x44\xf3\x54\x80\xec\x02\xeb\x55\xb0\x76\ +\x83\xf8\x18\xf4\x7c\xa6\xd4\x7d\x87\x99\xf3\x6f\x6c\xed\xd8\x90\ +\xff\xc0\x84\x0f\xe2\x68\x34\x7a\x55\x4a\x76\x3e\x52\xb9\x69\xfe\ +\xad\x4b\x82\x45\x95\xb7\x80\x73\x12\xac\x3d\x19\xbe\x39\x07\xfa\ +\xa7\xe0\x59\x4d\xf0\x5b\x3f\xe2\xc4\xc7\x0f\x87\xa2\xd1\xe8\x55\ +\x8f\x85\x40\x20\x90\x06\xd0\xdf\xdf\x7f\xc5\x8a\x76\xb5\xd7\xe5\ +\x18\x1e\x63\x5b\xc3\x9a\x87\x41\x44\xc1\xfc\x2b\x20\xb2\x99\xc4\ +\x39\x90\xfb\x08\x14\xcf\x67\xe1\x8a\xe6\x85\x3b\x1f\xa9\x6c\xff\ +\xc6\x13\xff\x79\x62\xc2\x00\xf4\xf5\xf5\x5d\x8d\xae\x2d\x4b\xd6\ +\xac\xc2\x5f\x50\x03\x89\xbd\xe0\x24\x46\xe7\x12\x07\xc1\x37\x83\ +\x86\xd5\x0f\x73\x78\xdf\x81\xad\xbb\xda\xeb\x9e\x5d\xbe\xe9\xdd\ +\x0b\x57\xda\x69\x75\x75\x75\x1a\x40\x4f\x4f\xcf\x15\x29\x39\xf6\ +\xf2\xfa\x5a\x7f\xc0\xdf\x3e\x77\xf9\xb7\xc1\xfe\x1c\xac\xcf\x40\ +\xbb\x8c\x40\xe2\x6f\xf8\x02\x2d\x2c\x59\xbb\x96\x77\xfe\xb8\xab\ +\xad\xa7\xa7\xe7\xc7\x13\x32\x06\x2e\x5c\xb8\x62\x47\x6c\x6c\x5a\ +\x77\x17\x5e\x7f\x3e\xc4\xde\x00\x19\x77\x73\x7f\x34\x10\x12\x10\ +\xa7\x40\x3f\xcf\x9c\x65\x77\xf3\xd1\x5b\x6f\xb7\x1d\x7b\x79\xfd\ +\xae\x49\x6b\x9e\x7b\xe7\xaa\x01\xf4\xf6\xf6\x8e\x5f\xf0\xc0\xe6\ +\x60\x71\x45\xc9\xc6\xba\xc6\x15\xae\xe7\xad\x6e\xd7\xf0\xcb\x45\ +\x40\x02\xb1\xb7\xf0\xe4\xad\x25\x78\xcf\x37\xf9\xf3\xaf\x5f\x0c\ +\xf5\xf6\xf6\x5e\x3d\x80\x8b\x17\xc7\xbf\xca\x57\x40\x68\xe9\xea\ +\x3b\xd1\x0d\x1f\x44\x5e\x07\xe2\x0a\x80\x36\x76\x04\xa4\x04\x19\ +\x03\xf3\x28\xd3\xe7\x2c\xa0\xa2\xa6\xaa\xb5\xe7\xc0\xe6\x57\x7b\ +\x6a\xdb\x7e\x7b\x55\x00\xc2\xe1\xf0\xb8\x84\x66\xf5\xed\x68\x9d\ +\x3c\x7d\x7a\xeb\xcc\x79\x4b\x21\x71\x08\xc4\x80\xbb\xeb\x91\xc9\ +\x08\x8c\x81\x20\xb9\x6b\x19\x7a\x0f\xad\x60\x3d\xc1\x7b\xd6\xf3\ +\x87\x67\xb6\x87\xc2\xe1\xf0\xd5\x01\x48\x24\x12\xe3\x5e\xb4\x9a\ +\xd7\xad\x01\x99\x80\xd8\x7e\xd0\x1d\xd7\x38\x1d\x90\x1a\x47\x8e\ +\x84\x79\xe1\xb9\xe3\x0c\x0d\xd9\x34\x34\x94\xf0\xfd\xfb\x67\x29\ +\x70\x12\x1c\xdc\x68\xc5\xfe\x49\xe5\x8c\x25\xdc\xb8\x60\x5e\x90\ +\x8f\x76\x6c\x3a\x94\xbf\xe1\x97\xd7\x65\x25\xae\x8f\x74\x6e\x9a\ +\x35\xaf\x3e\x38\x79\xe6\x5c\x88\x7f\x00\x0c\xa9\xf4\x89\xbb\xa5\ +\x11\x67\xf7\xee\x2e\x7c\xba\x43\x49\x81\xce\xd1\xc3\x97\xf8\xe0\ +\x5f\xdd\x60\xc4\xb3\xf9\xcc\x8f\xc0\x19\xa4\x69\xcd\x3a\x74\xc3\ +\xd8\x56\x1f\xe9\x2c\xba\xe6\x00\xea\x23\x9d\x39\xba\x61\x6c\x6b\ +\x5a\xb7\x16\x44\x0f\x98\x1f\x82\x96\x70\x89\x04\x18\x26\x90\xa0\ +\xaf\x2b\x8c\xa6\xb2\x28\xc7\xa3\x91\x30\x8b\xb2\xda\x5d\x99\x38\ +\x0c\xbd\x49\x41\xd9\x34\x16\xb5\x2c\x07\x68\xbf\x1e\x11\xd8\x32\ +\x77\x59\x23\x85\xa5\x35\x10\x79\x5b\x2d\x5a\x71\xd7\x28\x3d\x91\ +\xf2\x70\xf9\xe4\xb2\x61\xbd\x68\x69\xcf\xeb\x0a\x2c\x71\x48\x1c\ +\x07\xf3\x38\x8b\x5a\xee\xc0\xe7\xf7\xb7\xd5\x47\x3a\xe7\x5d\x33\ +\x00\xf5\x91\xce\xda\x9c\x5c\x7f\x7b\xe3\xca\xdb\x21\x71\x04\xec\ +\xa3\xa0\x0d\x01\x31\x55\xaa\xba\x1e\x23\xd7\x9f\x93\x25\x5b\x5a\ +\xe1\x05\x3d\xe6\xb6\x33\x94\x2d\x17\x7d\x03\xaf\x2f\xc0\xb2\xb5\ +\xb7\x5f\xd1\x6e\x75\x3c\x11\xd8\xb8\xb8\xa5\x19\x9f\xbf\x00\x22\ +\x6f\x82\x34\x01\x95\x12\x24\x40\x33\xc1\x70\x23\x31\xa9\x2c\x3f\ +\x4b\xd0\xef\x0f\xbb\x9e\x37\x14\x5f\x52\x06\xd3\xdd\x27\xc5\xf6\ +\x31\xa7\xb1\x89\xd2\x29\x95\xa1\xfa\x48\x67\xeb\x84\x03\xa8\x8f\ +\x74\x06\x0b\x8b\x8b\x37\xce\x0f\x2e\x85\xd8\x3f\x40\x74\xa5\x01\ +\x48\xd3\x35\x4a\x26\x52\x54\x5c\xe6\xcd\x8e\x40\x79\x76\xbb\xcb\ +\x9f\x21\x1f\x7d\x1d\x4d\x13\xdc\x72\xf7\xea\x71\x47\xe1\xcb\x46\ +\x20\xd4\xb8\xa2\x19\x5d\xb7\x60\xf0\x4d\xb5\x65\x88\x8f\x2c\x15\ +\x15\x97\xa6\x8f\xa9\xfe\x80\x9f\x3c\x7f\x77\x56\xfb\x08\x39\x67\ +\x10\xc2\x7f\x61\x4a\xed\x34\x66\xce\x99\x1d\xac\x8f\x74\x6e\x1a\ +\x17\x00\x5d\xd7\xc7\xa4\xfa\x48\xe7\xbd\xe5\xd5\x35\xad\xb3\x17\ +\xcf\xc1\x19\x78\x07\xc7\x0e\x23\x1d\xcb\x25\x69\x65\xd7\x15\x15\ +\x97\xa6\xd7\x95\x29\xd3\x2a\x91\x4e\x38\xab\x7d\x34\x79\x27\xfa\ +\x1e\xd2\xec\xa6\x69\x75\x30\x35\xad\x5e\xce\xae\x2f\x0d\x00\x08\ +\x35\xad\x5a\x86\xb4\x2e\x22\x06\xdf\x45\x3a\x36\x8e\x63\xe3\x48\ +\x45\xb8\x24\xb1\x91\xd2\xa5\xea\xa9\xe9\x03\x52\x51\xa9\x81\x74\ +\xd2\x6d\x92\xb4\x4c\x4a\x87\x63\x23\x1d\x13\xfb\xe2\x6e\x0a\xcb\ +\x26\x51\xbf\xa4\x01\xa0\xfd\x4b\x03\x30\x0c\x63\x54\xaa\xeb\x7f\ +\xbe\x7d\xda\xec\xba\xe6\xaa\xda\x72\xec\x4b\x6f\x23\x6d\x13\x21\ +\x04\x42\x0a\x84\x23\x90\xd2\x25\x1c\x81\x14\x02\x69\xbb\xa5\xdf\ +\x7b\x16\x7f\x5e\x2e\x00\xc5\x25\x1a\x72\x58\x3b\x19\xb2\xc2\x51\ +\xfa\x84\x40\xc6\x4e\xe2\x44\x0f\xd1\xb0\x72\x01\xfe\xfc\x82\xb6\ +\xba\xfe\xe7\x83\x63\xd9\xf6\x85\x00\x66\xf5\xed\x28\xf2\x78\x73\ +\xb6\x36\xaf\x5d\x84\x1c\x3a\x83\x13\x3e\x08\xd2\x01\xcd\x71\x4b\ +\xe9\x20\x45\x06\x39\x8a\x84\x83\x14\x51\xa6\x4c\xaf\x04\xc0\xe7\ +\x4b\xa4\xdf\x67\xf1\xb8\x94\xd4\x95\xd4\xeb\xf4\xee\xc1\xe7\xd1\ +\x69\xbc\x75\x29\x40\xe8\x8a\x01\x00\xed\x37\xce\xbd\x99\x82\x42\ +\x3f\x89\x9e\xbd\x08\x07\x2c\x01\x8e\x05\x8e\x00\xe5\xf8\x54\x99\ +\xac\x4b\x01\xd2\x82\xca\x6a\x3f\x00\x55\xd5\x06\xd2\x4a\xb7\x39\ +\x62\x0c\x79\xcb\xd5\x6f\x99\x97\xb0\xfa\xf6\x53\xd7\x30\x8d\xc2\ +\x92\x8a\xd6\xda\x9e\xed\xad\xe3\x06\x30\xad\xeb\x57\xcd\xb9\x79\ +\xf9\x6d\x8b\x5b\x6e\xc0\xee\x3f\x8c\x13\xe9\xc2\xb1\x5d\x47\x09\ +\x07\x84\x3d\x92\x1c\xcb\x2d\xa5\x22\x9f\x37\xe6\x1e\xfd\x2a\x7b\ +\x53\xef\x32\xf9\x46\x90\x0a\x84\x63\x83\xd5\xb3\x1f\x61\x0d\xb0\ +\xf4\xf6\x85\x63\x46\xe1\xb2\x00\x80\xd0\xdc\xa5\xf3\xf0\xe4\x08\ +\xcc\xf3\xef\x21\x1c\xe5\x25\x3b\x4d\xc2\x4e\x7b\xd3\xb1\xd3\xa5\ +\xb0\x5c\x0a\xde\x56\xc2\x63\xdb\x1f\xc5\x8e\x9f\x4d\xbd\xcb\xe4\ +\x4b\xca\x0a\x3b\x5b\xaf\x23\x40\x08\x0b\xf3\xfc\xbb\x4c\x9d\x35\ +\x89\xea\x19\xb3\x82\xd5\x67\x9f\x6a\x1f\x0b\x80\x27\x09\x60\xcb\ +\x96\x2d\xa9\x0b\xaa\x40\x51\xd9\xbd\x73\x16\x95\x61\xf5\x1c\xc2\ +\x4e\x0c\xa1\x1b\xee\x16\x5f\x6a\xee\x8e\x38\xb5\xe5\x17\xea\x0c\ +\x60\xb8\x67\x15\x4d\x57\x3c\x3a\x88\xfe\x3d\x88\xfe\x3d\xe9\xd3\ +\x80\xa3\x8e\x04\x0e\xee\x96\x5a\xa4\xd3\x1f\xa1\x22\x97\xac\x0b\ +\xb0\x2e\x7e\x8a\x51\x74\x13\x4d\x2b\x6f\x60\xd7\x6f\xce\x6d\x9d\ +\x7c\x6a\xdb\xae\x50\x67\xe4\x20\xc0\xe3\x8f\x3f\x3e\x32\x02\x59\ +\x8b\xd6\xad\xb3\x91\x76\x98\xf8\xf9\x7f\xa7\xbc\x9d\x0a\xbf\xf2\ +\x9a\x34\xc1\x31\xd5\x98\x50\x75\x61\xb9\xbf\x2f\x74\xeb\xec\x78\ +\x3e\x8f\xb6\xcd\x85\xec\x7c\xd9\x8f\x50\x7c\x22\x83\x37\x29\x27\ +\x4d\xa5\x5f\x64\xa7\x97\x63\x43\xfc\xf4\x7e\x02\x45\x5e\x6e\x9a\ +\x7f\x73\xd6\x0a\x3d\x6a\x0a\x29\xef\x6f\x2a\xab\x98\x1e\x9c\x5e\ +\x9b\x4b\xe2\xdc\x41\xa4\x65\x67\xa7\x89\xca\x65\x27\xa3\x93\xa4\ +\xd1\xc9\xc1\xeb\xd8\xf0\xca\xee\x02\xba\xbb\xbc\x94\x14\xe8\x9c\ +\x3c\x91\xc3\x9e\xbd\x3e\x57\x56\xf1\x39\x19\x29\x25\x86\xe9\xcd\ +\x4c\x2f\x7b\xf0\x02\x76\xef\x71\x16\x36\x17\x92\x57\x50\x1a\x52\ +\xb7\xde\xa3\x03\xe8\xd8\x90\x9f\xaf\xe9\xc6\xb6\xc6\x96\x4a\xcc\ +\xa1\x0b\xc4\x7b\xcf\x62\x59\x60\xdb\x19\x64\x81\x65\x66\x78\x2a\ +\xc3\x08\xdb\x4c\x47\xe9\xfc\xe7\xe0\x35\xb4\xd4\x79\xe0\xcc\xb9\ +\xf2\x94\x4c\x8a\x2f\x39\x5e\x94\x8c\x65\xba\xfa\x33\xfb\xb3\x2c\ +\x88\x9e\xf9\x04\x61\x0f\xd1\xb0\xbc\x36\x15\x85\x11\x00\xd4\xca\ +\xd6\x36\x65\xea\x4c\x8a\x2b\x0c\x86\x4e\x1c\x46\x58\xd2\x9d\xe6\ +\x92\x33\x8b\x48\xe7\xaf\x10\xe9\xce\x6d\x2b\x23\xfc\xa6\x6b\xe0\ +\xec\x9b\x66\x66\xed\x57\x6a\xa6\xd7\xb8\x86\x9b\xe9\x34\xb4\x33\ +\x9c\x20\x84\xab\x57\x3a\xaa\x9f\x64\x44\x04\xd8\xf1\x18\xf1\x33\ +\x47\x99\x7a\x83\x97\x8a\xaa\x99\xc1\x8e\x0d\xf9\x5b\x47\xac\xc4\ +\x79\x07\x1f\xf3\x6b\xba\x67\xcb\xc2\x60\x2e\x66\xcf\x29\x62\xfd\ +\x03\xae\x17\x44\xb6\x37\x6c\x4b\x95\x2a\xdf\x53\x46\x28\xef\x25\ +\x73\x7b\xd5\x9a\x9b\x99\x5c\x3d\x05\x80\x19\xb3\x6a\x69\x5a\x5c\ +\x94\xca\x79\x5b\x01\x4d\x81\x57\xfa\xb2\xf4\x27\xa3\xa0\xfa\x8f\ +\x74\x9d\xc3\x0a\xf7\xb0\x74\x65\x00\xdd\x93\xdb\x9e\x77\xf0\xb1\ +\xea\xe1\x5f\x68\x5a\x02\xfe\x72\x02\x7e\x9b\x81\xc3\xa7\x71\x4c\ +\xd0\x0c\x35\xab\xe8\x2e\x97\xa1\x83\xf0\xb8\x33\x8e\xa6\xa9\x52\ +\x57\x75\xdd\xad\x3b\xba\x3b\x3b\x79\xe4\x6b\x7c\xf7\x7b\xf7\x62\ +\xf8\x6b\xb0\x23\xc7\x18\x3a\xbd\x13\x69\xa7\x67\xa1\x64\x24\xa5\ +\xcc\x98\x79\xa4\x9a\xd5\xd4\x9a\x80\x9d\xe6\x95\x42\x32\x78\xf4\ +\x04\x85\xf3\xea\xa9\xaa\x99\xca\xd9\xcf\x8e\x85\x80\x47\x33\x01\ +\xd4\xfa\x72\x7d\x44\x4e\x9e\x21\x31\x90\x40\xf7\xba\x9d\xe9\x1e\ +\x05\x44\x03\xa1\xb9\xe1\xd2\xa4\x3b\x55\xa6\x6e\x4a\x92\x53\xab\ +\x54\x46\x48\x10\x89\x3e\x22\xc7\x9e\xca\xba\x12\x72\x6f\x23\x94\ +\x4c\xf2\x86\x25\xe3\xa6\x25\x59\x77\xd4\x74\x2d\x35\xa5\xcb\x76\ +\x81\xc5\x7b\x23\x78\xcf\x9c\xa1\x6a\x6a\x39\x67\x3f\x63\xd5\x70\ +\x00\x11\xd3\xb4\x18\xfc\xb4\xd7\xf5\x8c\x3a\xc6\x3a\x1a\x18\x06\ +\x68\xde\xb4\xc7\x93\x11\xd0\xd4\xda\x80\xe6\xf2\xa2\xbc\xaf\x8d\ +\x72\x3b\xa7\xa9\x64\x95\xea\xea\x45\x77\xc0\x51\x60\x35\xe9\x46\ +\x59\x4a\xd0\x84\xd2\x2f\x14\x18\x15\x19\x47\x0d\xf4\xfe\xa3\xdd\ +\x44\x8b\x8a\x01\x06\x86\xa7\xd0\xae\xc8\x50\x37\x17\xa5\xa0\x30\ +\x1f\x0c\xe5\x59\xc3\xa3\xbc\xa5\x81\x6e\x80\xf4\xa4\x53\x46\x66\ +\x80\x90\x5a\xda\xf8\x64\x74\x52\x8b\xdd\x70\x2f\xa7\xee\x8f\xd4\ +\x6f\xa1\xf8\x1c\x17\x88\x6e\x83\x90\xe9\x74\x13\xb6\x5a\x63\x4c\ +\x30\xe3\x82\x23\xa7\xba\x00\x3a\xb2\x00\x88\xc6\x27\x07\x3c\x07\ +\x7e\xfa\xb3\x4f\x22\xbe\x9f\x97\x85\x4d\xaa\x26\x49\x0a\x4a\xfd\ +\x78\x73\x4b\xd0\x73\x35\x0c\xaf\xa6\xa2\xa0\xa5\xc7\x80\x5a\x71\ +\xc9\xf0\x7e\x96\xc7\x33\x7f\x67\x82\x50\x40\x34\xb5\x32\x27\xc1\ +\xa4\x22\xa0\x81\xa1\x4b\x04\x12\x4d\x4a\x74\x47\x62\x85\xbb\x39\ +\xdb\xeb\x70\xce\xca\x41\x6a\x89\x5f\x88\xc6\x27\x5f\x19\xf1\x99\ +\xf5\xa1\x97\xc2\x4f\x3c\xf7\x40\xd9\xdf\x2f\x39\x56\x68\x20\x2e\ +\x6f\xf3\x9e\xd7\xca\x72\x2e\xc5\xf0\x7a\x35\x0c\x03\x74\x5d\x1b\ +\xfb\xd6\x70\xc2\xbe\x38\xa6\xaf\x50\x6d\x5b\x62\x0b\x89\x65\x81\ +\x99\xc8\xc3\x96\x72\xaf\xe6\xd1\x3b\x1e\x7a\x61\xe0\xf7\x4f\x3f\ +\xfd\xf4\xa8\xdf\x89\xe5\xfd\xcf\xf6\xbe\x05\xec\x55\xef\x3d\x40\ +\x2e\xe0\x03\xbc\xca\x57\xd7\xe3\xc3\x78\x72\xb7\x64\x67\x5f\x7b\ +\x60\xab\xf7\x72\xc4\xdd\xa8\xf1\xfe\x4f\x80\x1f\x64\x2a\xb0\x33\ +\x14\x99\xe9\xe1\x7a\x4d\xfd\x9f\x35\x69\x0d\xb3\x43\x64\x1a\x9e\ +\x69\xaf\xe7\x32\x5e\x50\x43\x09\xfb\x3a\x1a\x9f\x75\x19\x3f\x0a\ +\x7d\xe1\x5f\x0d\x86\x33\x89\xcc\x71\xf9\x15\x3c\xf2\x32\xb6\x01\ +\xf0\xdf\x01\x00\x6d\xbe\xca\x6b\x94\x7f\xd6\xea\x00\x00\x00\x00\ +\x49\x45\x4e\x44\xae\x42\x60\x82\ +\x00\x00\x09\x59\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x00\x30\x00\x00\x00\x30\x08\x06\x00\x00\x00\x57\x02\xf9\x87\ +\x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\ +\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x05\x31\x00\x00\x05\x31\ +\x01\xb7\xed\x28\x52\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\ +\x74\x77\x61\x72\x65\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\ +\x70\x65\x2e\x6f\x72\x67\x9b\xee\x3c\x1a\x00\x00\x08\xd6\x49\x44\ +\x41\x54\x68\x81\xd5\x9a\x5d\x8c\x5d\x55\x15\xc7\x7f\x6b\x9f\x73\ +\xee\xdc\x8f\xce\x67\x5b\x5a\x86\x52\x19\xb4\x02\x03\x83\x11\x22\ +\xd0\x00\x6d\x89\x48\x14\xe4\x81\x07\xc6\x1a\x41\x34\x46\x5f\x0c\ +\x10\xe2\x43\x5f\x88\xe3\x84\xc4\x48\xd0\x60\xd1\x07\x8c\x0f\x52\ +\xc1\x88\xf0\xd0\x07\x40\x49\xd5\x58\x08\x0d\xa1\x04\x42\xa4\x1d\ +\x1b\x09\xe9\x30\x54\x68\x69\xe7\xa3\xd3\x99\x7b\xef\xcc\xf9\x58\ +\x3e\x9c\x73\xef\x3d\xe7\xde\x73\xee\xdc\x69\x6b\x0c\x2b\x59\x77\ +\x9f\x8f\xbd\xd7\xfe\xff\xd7\x5e\x7b\xed\x7d\xf6\x8c\xa8\x2a\x9f\ +\x66\x31\xff\x6f\x00\xe7\x2a\x9f\x7a\x02\xf6\xf9\x30\x22\x82\x70\ +\xf7\xde\x1b\x31\x72\x2d\x04\xc3\x88\x19\x06\x2e\x07\x71\x80\x0a\ +\x22\x65\xd0\x32\x62\x0e\xa3\xbc\x0a\xbc\xc2\x1f\xef\x9c\x50\xe5\ +\x9c\xe3\x57\xce\x65\x0e\xc8\xe8\x0b\x43\x58\xee\x7d\xa8\xdc\x07\ +\x72\x09\x02\x84\x3f\x20\x52\xab\x45\xc6\xf3\x53\x88\x3c\x85\xb2\ +\x5b\x9f\xf9\xda\xb1\xb3\xc6\x70\x36\x04\x64\xf4\x85\x21\x8c\xff\ +\x04\xc2\x1d\x75\x44\x22\xac\xc9\xdb\x5c\x71\x51\x37\xeb\x7b\x72\ +\xf4\x15\x73\xf4\x95\x1c\x00\xe6\xca\x2e\x73\x65\x8f\x93\x67\x96\ +\xf9\xd7\x47\x0b\x2c\x54\x83\x38\x29\x0f\x35\xcf\x22\x3c\xaa\xbf\ +\xbf\xed\xd0\xff\x94\x80\x8c\x3e\x6f\x61\xe5\x1e\x02\xc6\x11\x29\ +\x02\xf4\x97\x72\xec\x18\x5e\xcb\xc8\xe6\x1e\x2e\x1e\x28\x44\x74\ +\x24\xd6\x28\x79\xaf\x0a\x1f\xce\x54\x79\xf7\xd8\x02\xfb\x8f\xcc\ +\x32\xbb\xe8\xd6\x7c\xe0\x82\x19\x63\xe8\xb5\x47\x75\x6c\x2c\x38\ +\xef\x04\x64\xf4\xc5\xcd\x38\xc1\x5e\x94\x6b\x40\xb8\xa0\xb7\x8b\ +\xdb\xae\x5e\xcf\x97\x2e\xed\xc3\x32\xb1\x5c\x10\x61\x55\x60\xb1\ +\xea\xa3\x0a\x6b\x0a\x76\x8c\x82\xd4\xeb\xf8\x81\xf2\xe6\xd1\x33\ +\xec\x3b\x3c\xcd\x27\xf3\x6e\xf4\xdc\xec\xc7\x92\x7b\xf5\xb7\x3b\ +\x3a\x0a\xab\x8e\x08\xc8\xb7\x5e\xdc\x02\xfa\x37\x90\xcd\x22\xb0\ +\xfd\x8a\x75\x7c\xf5\xea\xf5\xd8\x56\x53\x12\x13\x08\x14\xde\x3f\ +\xbe\x80\x2d\x70\xd9\xe0\x1a\x1c\x4b\x38\xf2\xf1\x22\x0b\x55\x9f\ +\xcf\x5f\xd4\x83\x65\x62\x73\x23\x2a\x3c\x5f\x79\xf9\xd0\x0c\xaf\ +\xfc\x7b\x0e\x55\x01\x98\x26\x30\xb7\xe8\xef\xb6\xbd\x7b\xce\x04\ +\xe4\x9e\x3f\x8f\x80\xfe\x15\xd8\xd0\x9d\xb7\xf9\xc6\xd6\x41\x2e\ +\x59\x57\x20\xee\xc9\x1a\x12\x05\x26\xa6\xe6\xf8\xee\xf6\x8b\xf9\ +\xca\xc8\xfa\x84\x9d\xd7\xdf\x9b\xe5\xd7\xfb\x3e\xe0\xb2\x8b\x7b\ +\x5b\x49\x44\x97\x93\xa7\x96\xf8\xd3\x9b\x9f\x70\x66\x29\x00\x38\ +\x81\xc5\xcd\xfa\xe4\xb6\xf7\xce\x9a\x80\xdc\xf3\x97\x4d\xc0\x3b\ +\x88\xae\xed\x29\x38\xdc\x73\xe3\x20\x03\x6b\x72\xad\x9d\x03\x88\ +\xf0\xc1\xc9\x45\x46\xaf\xdb\xc0\xd7\xbf\xb8\x21\xd5\xde\xeb\xef\ +\xcd\xb2\x7b\xdf\x14\x5b\x06\x7b\xea\x6d\x9a\x8c\x30\xb3\xe8\xf2\ +\xcc\x1b\x27\x99\xaf\xfa\x80\x4c\x21\xdc\xac\xbf\xb9\x71\x2a\x0b\ +\x63\xe6\x42\x26\xe3\xe3\x06\xe1\x69\x8c\xac\xed\x2d\xe5\xd8\xb9\ +\x75\x90\x62\x97\x4d\xd5\x0d\xa8\xba\x4a\xd5\x0b\x62\xaa\x54\xdd\ +\x00\xd7\xf5\x33\xc1\x03\x6c\xdd\xd2\xcf\x40\xd1\xa2\xec\x2a\x55\ +\x5f\x1b\x6d\xeb\x1a\x50\xcc\xdb\xec\xbc\xee\x02\x7a\x8b\x0e\x18\ +\xd9\x8c\x98\xbd\x32\xfa\xbc\xb5\x6a\x02\xbc\x7f\xfd\x2e\x8c\xd9\ +\x61\x59\x86\xdb\xbf\x70\x01\x39\xdb\x4a\x76\xe6\xc6\xd4\x53\xe6\ +\x2b\x3e\x9f\xdd\x50\xcc\x34\x57\x93\xe1\x4d\xdd\xcc\x2e\xb8\x89\ +\xb6\xa1\x12\xaa\xab\xe4\x6c\xc3\xed\x23\x6b\xb1\x2c\x0b\xc4\x5c\ +\xc3\xc0\xe6\x87\x56\x45\x40\xbe\xbd\xef\x2a\xc4\x8c\x23\x86\x1b\ +\x3e\xd7\x4f\x29\xef\x24\x41\xc7\x3d\x17\x79\x72\xc9\x57\x5c\x7f\ +\xe5\x84\xe0\xfa\xca\x92\x1f\x03\x1c\xf3\x7e\x9c\x4c\x29\x6f\x71\ +\xc3\xa5\xdd\x61\x98\x59\x66\x5c\xee\x3f\x38\x94\x66\x2f\x7d\x2b\ +\x61\x64\x17\x22\xce\x60\x5f\x17\x43\xeb\x8b\x54\xbd\x80\x78\xd6\ +\x68\xa2\x5b\x2f\x0f\x1f\x5b\x40\xd3\xaa\xc4\xe4\xed\xc9\x79\x24\ +\x57\xa0\xea\xc5\xc9\xd6\x12\x82\x26\x4c\x0e\xad\x2b\x70\x74\xda\ +\xe5\xa3\x79\xaf\x88\xf2\x04\x70\x67\x0b\xd4\x16\x38\xdf\xdf\xbf\ +\x09\xcc\x4e\xc4\x30\x7c\x51\x77\x53\x8c\x2a\x55\x97\x48\x9b\x3c\ +\xe7\x2b\x8b\x81\xc5\x1f\x0e\x7c\x94\x09\xfe\xe5\x77\x4f\x31\x39\ +\xe7\xb1\xe4\x93\x0c\x1b\xaf\x39\x94\x1a\xe5\xf0\x60\x31\x1c\x05\ +\x31\x77\xc8\xfd\xff\x6c\x19\x85\xd6\x11\xf0\x79\x10\xcb\xd8\x1b\ +\x7b\x73\xe4\x73\x56\xe4\x29\x09\xbd\x53\xf7\x52\xf3\xfe\x26\x2c\ +\xd6\x94\xf2\xfc\xea\xef\xc7\xb0\x8c\xf0\xcd\xad\x17\x26\xcc\xbe\ +\xf8\xce\x49\x7e\xfa\xd2\x24\x03\x03\xbd\x49\x9b\xf5\xf6\x29\x23\ +\x2c\x90\xcf\x59\x6c\xec\xed\xe2\xf8\x19\x4f\x20\xb8\x0f\xf8\x49\ +\xc2\xe1\xf1\x34\x2a\x82\xf0\xbd\xfd\x9f\x80\xac\xbb\x6e\xa8\x3b\ +\xcc\x04\x71\xab\x75\xe3\x4d\xbd\xc4\x6e\x55\x60\xee\x74\x85\xfe\ +\xbc\x30\xb2\x29\x5c\xc8\x0e\xfd\x67\x81\x8f\x17\x94\x81\xbe\x12\ +\x92\xb9\xb9\x4b\xb3\x1f\x96\xa7\xab\x01\x07\xa7\xca\x80\x4c\xb2\ +\x7b\xe4\xd2\xf8\x2e\x36\x49\xe0\x07\x07\xae\x44\xfd\x43\x39\xdb\ +\x70\xfd\x50\x4f\x13\xce\xe6\xc5\x27\x85\x54\x13\x30\xcf\x0f\x40\ +\xc1\xb6\x4d\x92\x74\xcb\x4e\x75\xa5\x3e\x84\x37\x3e\x28\xb3\xec\ +\x03\x96\xdc\xac\x3f\x1f\x7e\xad\xd6\xa4\x29\x84\x74\x3b\x62\xe8\ +\x29\x38\x54\xeb\x19\xa5\x79\xc5\xad\xd7\x6d\xea\x54\xa3\xeb\x5a\ +\x88\x29\xb5\x29\xe6\xf9\x34\x9e\xc7\xa5\x85\x7c\xed\x36\x1e\x62\ +\xa1\xad\x9e\x82\xcd\xa9\x45\x1f\x90\x6b\x81\x0c\x02\x22\xdb\x40\ +\x08\x10\x2a\xf5\x4d\x62\x13\xb0\x38\x90\xe8\xfd\xf2\x92\xc7\x62\ +\xb9\xd2\xf4\x3c\x71\x01\x40\xa9\xbb\x44\xae\xcb\x49\xb1\xa5\x64\ +\x8f\x4a\xb8\x83\x0d\x30\x60\x14\x30\xc3\x71\x9b\x4d\x04\xcc\x95\ +\x00\x33\x95\x80\xb2\xb7\xc4\xc6\x9e\x1c\x8e\x9d\x16\xa3\x49\x99\ +\x3f\x53\xe1\xf8\xe3\x5b\xd3\x5f\xc6\x64\xe3\x8f\x0e\xd2\x33\xd0\ +\xd7\x6a\x2b\x2b\xef\x8a\xe0\x06\xca\xf1\x79\x3f\x8c\x08\x31\x00\ +\x6d\x09\x14\x6b\x71\x5c\xf5\x60\x6a\xce\xa5\xaf\x68\x53\x74\x0c\ +\x22\x92\x1c\xda\x98\xc7\xdc\x0e\x3f\x29\xdc\x20\x4c\x9b\xed\xe6\ +\x4d\x4d\x54\xa1\xec\x29\x73\x15\x9f\x40\x25\x7a\x27\x00\x97\xb7\ +\x21\x20\xc5\x38\xb0\x00\x98\x29\x07\xcc\x49\x40\x3e\x67\x51\x70\ +\x0c\xa6\x6e\xa7\x81\xc1\xf5\x57\x41\xc0\x57\xd2\x33\x4f\x28\x81\ +\x42\x25\xda\x2b\x05\x0a\x60\xa2\xa9\x54\x27\xe9\xc4\xeb\x27\x09\ +\x18\x53\x68\xf5\x86\x10\x08\x94\x5d\x28\xbb\x01\xb6\x11\x1c\xdb\ +\x60\x44\x31\xd1\xa8\x04\x4e\x81\xc2\x0f\x5f\x07\x04\xf5\x3d\xaa\ +\x4f\xde\x94\x4e\xc0\x07\xfc\x98\x07\x22\xef\x07\x0a\x01\xe1\x36\ +\xa3\xb1\xe8\x9b\xc6\xe8\x24\x47\xa9\xd2\x8e\x80\x1b\x26\x97\xac\ +\xa1\x15\x3c\xc0\xf3\xa2\xbb\x5a\x1f\x38\x48\x21\x87\x20\x04\x8b\ +\xa7\x53\xc1\x03\x2c\x2b\x78\x9e\xa0\x68\xf8\xe1\x22\xe1\x34\x56\ +\x8d\xf5\x21\xed\xd6\x09\x01\x28\x67\x13\xc0\x1c\x41\xb8\xa9\x83\ +\x13\x85\x46\xe7\xb5\x3a\x1a\xbd\x53\x21\x4b\x02\x95\x30\x9e\x91\ +\x24\x30\xd3\x59\x7f\xd1\x4f\x1b\x02\x22\x13\x88\xdc\x94\x6a\xac\ +\x33\xe3\x49\x60\xcd\x22\xd2\xd0\xb3\xea\x03\x40\x0e\x67\x13\x40\ +\x26\xa2\x54\xb5\x0a\xc0\x4d\x75\xda\x11\x40\xa2\xb8\x4b\x05\xd6\ +\x61\x7f\xe6\xd5\x6c\x02\x8e\xfd\x16\x41\xa3\x5d\xaa\xb1\xb6\xc6\ +\x57\x20\x20\x02\x66\x95\x0e\x6a\xb9\xe7\x95\xb8\xc9\xe4\x76\xfa\ +\x17\xc3\x07\x10\x99\x0c\xbd\x94\xa1\x26\xed\x3a\x02\xd6\xc8\xd5\ +\xd9\x04\xda\xd9\xae\xd9\x8a\x97\x46\xe2\x7d\x9c\xe2\x91\x8d\x13\ +\x99\x04\x54\x51\x8c\xec\x69\x05\x99\x6a\x2c\xf6\xbc\x09\x44\x26\ +\x81\x55\xda\x6a\xbd\x7e\xaa\xf9\x3c\x35\xa5\x37\xd9\x83\x88\x26\ +\xbd\xd1\x89\xd6\xea\x66\xe3\xaf\xcf\x81\x2c\x90\x59\xa3\x10\x96\ +\x1e\x98\xdd\xcd\x16\x5b\x08\xe8\x63\x97\x1d\x45\xe4\xa5\xd6\x8e\ +\xb2\x3c\x26\xad\x60\xda\xe0\x6f\x03\x30\xdd\x56\x6d\x5e\x29\xcf\ +\xea\xd8\x40\xcb\x69\x5d\x7a\x6f\x81\xf3\x00\x46\xca\x49\xc0\x1d\ +\x8e\x42\xdb\x39\xb0\x62\x88\x34\x00\x27\xc5\x05\xf3\x68\x9a\xc9\ +\x54\x02\xfa\xd8\x67\x8e\x22\x66\x2c\x15\x60\x9a\xf7\xdd\x65\x38\ +\x33\x0d\xf3\xd3\xe0\xbb\xd9\x04\x7c\x17\x4e\x9f\x0a\xd5\x5d\x6a\ +\x07\xb8\x59\xc6\x74\xac\x3f\xf5\xe4\x3a\xf3\x64\x4e\x46\xb1\xd8\ +\xf2\xe1\x41\x44\xae\x89\x9e\x90\x99\xf6\xe6\x4f\xa2\xbf\x1c\x59\ +\x09\x44\xd2\xfe\x43\x13\xd0\x9f\x7d\x08\xd6\xa8\xc8\x7e\x82\xb5\ +\x5f\xd6\x31\x52\x4f\xac\x33\x03\x56\x9f\xc3\xc7\xb7\xef\x42\xcc\ +\xd4\x4a\x13\x4c\x56\xf6\x60\x8b\x74\xd9\xd2\xd8\x41\x64\xcb\x34\ +\x81\xdc\x9b\x05\xbe\x2d\x01\x00\xfd\xd9\x85\x53\x10\xdc\x8a\x98\ +\x13\xe9\x13\xcc\x90\xcf\x59\x14\x9d\xb6\x66\x52\xa5\xe8\x40\x5f\ +\x5e\xc8\xdb\x99\x2c\x4e\x20\xe6\x96\xb4\x89\x1b\x97\xce\x8e\xd7\ +\x7f\x7c\x62\x04\x4b\xfe\x81\xca\xda\xf0\x41\xf8\x63\x09\x94\xba\ +\x0c\x5d\x7e\x15\xa9\xcc\xd3\x65\x09\x5d\x36\x74\x59\xd0\x65\x09\ +\x39\x4b\xb0\x0d\x78\x01\x2c\x47\x27\x72\x4b\x3e\x2c\x79\x60\x4a\ +\x3d\x2c\x5b\x79\x16\x5d\x65\x7e\xa9\x05\xc3\x14\x26\xb8\x55\x1f\ +\x5e\xdf\xf6\x64\xba\x63\x02\x00\x32\x3e\xb3\x09\x82\xa7\x11\xd9\ +\x11\x7f\x5e\x72\x84\x52\x4e\x28\x3a\x50\x74\x84\xa2\x23\x14\x6c\ +\x21\x6f\x43\xce\x12\x2c\x03\x7e\x44\xa0\xea\x41\xc5\x53\xca\x6e\ +\x4d\x61\xb6\x12\xe0\x26\x03\xe4\x6d\xd4\xdc\xa5\x63\xfd\x53\x1d\ +\xe1\x5a\xd5\x9f\x98\xc6\x31\xc8\xf4\x2e\x60\x1c\xa8\x7f\x19\x39\ +\x06\x4a\xb9\x24\x70\xc7\x02\x4b\x24\x4c\xe1\x0a\xbe\x2a\xae\x1f\ +\x12\xa9\x78\x30\xbf\xa4\x54\xdc\xc4\xb2\x5a\x46\x74\x8c\xcb\xd7\ +\x3d\xae\x77\xd3\xe1\x37\xde\x2a\x09\x34\x88\xcc\x5e\x05\xc1\x2e\ +\x84\x9d\x34\x6d\x08\x2d\x01\xcb\x80\x6d\xa4\xbe\x22\x28\xe1\xa7\ +\xa2\x17\x28\xd1\x51\x51\x5c\x14\xe1\x25\xc4\x7e\x40\x1f\xee\x3d\ +\xba\x6a\x2c\xe7\xf4\x67\xd6\xf1\x99\x4d\xc0\x83\x48\xf0\x1d\x90\ +\x75\xab\x6c\x3e\x09\xba\x07\xe3\xec\x39\x1b\xe0\x75\x0c\xe7\xe3\ +\x7f\x25\x04\x84\x47\x66\x86\x41\xb7\xa3\xba\x0d\xe4\x4a\x90\x22\ +\x68\x11\x28\x80\xba\xc0\x11\xd4\x4c\x20\x4c\xa0\xf2\x16\x63\xfd\ +\x07\xb4\x65\x30\xce\x03\x81\x28\xa7\xdb\x80\xb5\x82\x9a\x48\x6b\ +\xd7\x12\x2b\xb3\xf6\x14\x1a\xd3\x20\x56\xfa\x29\x65\x96\x7a\x89\ +\xe3\x50\x55\x45\x44\xac\x08\xb4\x13\x95\xe7\x4b\xad\x88\x88\x02\ +\x5e\x0d\xc0\x79\x50\x17\x58\x06\xbc\xac\x11\x30\x29\x1a\xf7\x7c\ +\xda\x88\xd8\x29\x75\x6a\x2b\x5c\xb0\x0a\x0f\x37\x8f\x46\xe2\x5a\ +\x9b\x00\xff\x17\x83\xe5\xeb\x32\x4d\x9a\x90\x76\x00\x00\x00\x00\ +\x49\x45\x4e\x44\xae\x42\x60\x82\ " qt_resource_name = b"\ -\x00\x07\ -\x0a\xcc\xf9\x43\ -\x00\x44\ -\x00\x65\x00\x76\x00\x69\x00\x63\x00\x65\x00\x73\ +\x00\x06\ +\x05\xaa\x8b\xc3\ +\x00\x53\ +\x00\x74\x00\x61\x00\x74\x00\x75\x00\x73\ \x00\x07\ \x0d\x69\x38\x33\ \x00\x46\ \x00\x6f\x00\x72\x00\x6d\x00\x61\x00\x74\x00\x73\ +\x00\x07\ +\x0a\xcc\xf9\x43\ +\x00\x44\ +\x00\x65\x00\x76\x00\x69\x00\x63\x00\x65\x00\x73\ \x00\x04\ \x00\x04\xfa\x5e\ \x00\x49\ @@ -8529,26 +8533,15 @@ qt_resource_name = b"\ \x00\x56\xae\xc2\ \x00\x4f\ \x00\x74\x00\x68\x00\x65\x00\x72\ -\x00\x06\ -\x05\xaa\x8b\xc3\ -\x00\x53\ -\x00\x74\x00\x61\x00\x74\x00\x75\x00\x73\ \x00\x05\ \x00\x6f\xa6\x53\ \x00\x69\ \x00\x63\x00\x6f\x00\x6e\x00\x73\ -\x00\x08\ -\x04\xd2\x59\x47\ -\x00\x69\ -\x00\x6e\x00\x66\x00\x6f\x00\x2e\x00\x70\x00\x6e\x00\x67\ -\x00\x0b\ -\x00\xb5\x45\xe7\ -\x00\x77\ -\x00\x61\x00\x72\x00\x6e\x00\x69\x00\x6e\x00\x67\x00\x2e\x00\x70\x00\x6e\x00\x67\ -\x00\x09\ -\x09\x65\x8e\x67\ -\x00\x65\ -\x00\x72\x00\x72\x00\x6f\x00\x72\x00\x2e\x00\x70\x00\x6e\x00\x67\ +\x00\x13\ +\x0b\x2e\x10\x07\ +\x00\x6c\ +\x00\x69\x00\x73\x00\x74\x00\x5f\x00\x62\x00\x61\x00\x63\x00\x6b\x00\x67\x00\x72\x00\x6f\x00\x75\x00\x6e\x00\x64\x00\x2e\x00\x70\ +\x00\x6e\x00\x67\ \x00\x0b\ \x0c\x43\x9c\xc7\ \x00\x63\ @@ -8561,11 +8554,6 @@ qt_resource_name = b"\ \x0c\xbc\x3d\x27\ \x00\x64\ \x00\x6f\x00\x63\x00\x75\x00\x6d\x00\x65\x00\x6e\x00\x74\x00\x5f\x00\x6e\x00\x65\x00\x77\x00\x2e\x00\x70\x00\x6e\x00\x67\ -\x00\x13\ -\x0b\x2e\x10\x07\ -\x00\x6c\ -\x00\x69\x00\x73\x00\x74\x00\x5f\x00\x62\x00\x61\x00\x63\x00\x6b\x00\x67\x00\x72\x00\x6f\x00\x75\x00\x6e\x00\x64\x00\x2e\x00\x70\ -\x00\x6e\x00\x67\ \x00\x0e\ \x08\x9f\xcb\x47\ \x00\x66\ @@ -8574,22 +8562,6 @@ qt_resource_name = b"\ \x05\xb2\xe9\xe7\ \x00\x63\ \x00\x6f\x00\x6d\x00\x69\x00\x63\x00\x32\x00\x65\x00\x62\x00\x6f\x00\x6f\x00\x6b\x00\x2e\x00\x70\x00\x6e\x00\x67\ -\x00\x08\ -\x05\x95\x5e\x07\ -\x00\x45\ -\x00\x50\x00\x55\x00\x42\x00\x2e\x00\x70\x00\x6e\x00\x67\ -\x00\x08\ -\x03\x6c\x5d\x07\ -\x00\x4d\ -\x00\x4f\x00\x42\x00\x49\x00\x2e\x00\x70\x00\x6e\x00\x67\ -\x00\x07\ -\x07\x7d\x57\xc7\ -\x00\x43\ -\x00\x42\x00\x5a\x00\x2e\x00\x70\x00\x6e\x00\x67\ -\x00\x0a\ -\x0b\x2e\x17\xc7\ -\x00\x4b\ -\x00\x69\x00\x6e\x00\x64\x00\x6c\x00\x65\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x09\ \x0e\xc5\xfa\x07\ \x00\x4f\ @@ -8598,35 +8570,63 @@ qt_resource_name = b"\ \x05\x92\x5d\x07\ \x00\x4b\ \x00\x6f\x00\x62\x00\x6f\x00\x2e\x00\x70\x00\x6e\x00\x67\ +\x00\x0a\ +\x0b\x2e\x17\xc7\ +\x00\x4b\ +\x00\x69\x00\x6e\x00\x64\x00\x6c\x00\x65\x00\x2e\x00\x70\x00\x6e\x00\x67\ +\x00\x07\ +\x07\x7d\x57\xc7\ +\x00\x43\ +\x00\x42\x00\x5a\x00\x2e\x00\x70\x00\x6e\x00\x67\ +\x00\x08\ +\x03\x6c\x5d\x07\ +\x00\x4d\ +\x00\x4f\x00\x42\x00\x49\x00\x2e\x00\x70\x00\x6e\x00\x67\ +\x00\x08\ +\x05\x95\x5e\x07\ +\x00\x45\ +\x00\x50\x00\x55\x00\x42\x00\x2e\x00\x70\x00\x6e\x00\x67\ +\x00\x09\ +\x09\x65\x8e\x67\ +\x00\x65\ +\x00\x72\x00\x72\x00\x6f\x00\x72\x00\x2e\x00\x70\x00\x6e\x00\x67\ +\x00\x0b\ +\x00\xb5\x45\xe7\ +\x00\x77\ +\x00\x61\x00\x72\x00\x6e\x00\x69\x00\x6e\x00\x67\x00\x2e\x00\x70\x00\x6e\x00\x67\ +\x00\x08\ +\x04\xd2\x59\x47\ +\x00\x69\ +\x00\x6e\x00\x66\x00\x6f\x00\x2e\x00\x70\x00\x6e\x00\x67\ " qt_resource_struct = b"\ \x00\x00\x00\x00\x00\x02\x00\x00\x00\x05\x00\x00\x00\x01\ -\x00\x00\x00\x28\x00\x02\x00\x00\x00\x01\x00\x00\x00\x18\ -\x00\x00\x00\x36\x00\x02\x00\x00\x00\x01\x00\x00\x00\x12\ -\x00\x00\x00\x46\x00\x02\x00\x00\x00\x01\x00\x00\x00\x0e\ -\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x0a\ -\x00\x00\x00\x14\x00\x02\x00\x00\x00\x01\x00\x00\x00\x06\ +\x00\x00\x00\x3a\x00\x02\x00\x00\x00\x01\x00\x00\x00\x18\ +\x00\x00\x00\x48\x00\x02\x00\x00\x00\x01\x00\x00\x00\x12\ +\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x0e\ +\x00\x00\x00\x26\x00\x02\x00\x00\x00\x01\x00\x00\x00\x0a\ +\x00\x00\x00\x12\x00\x02\x00\x00\x00\x01\x00\x00\x00\x06\ \x00\x00\x00\x58\x00\x02\x00\x00\x00\x03\x00\x00\x00\x07\ -\x00\x00\x01\x94\x00\x00\x00\x00\x00\x01\x00\x01\xad\xa7\ -\x00\x00\x01\x7e\x00\x00\x00\x00\x00\x01\x00\x01\x91\x58\ -\x00\x00\x01\xaa\x00\x00\x00\x00\x00\x01\x00\x01\xcc\xe3\ +\x00\x00\x01\x90\x00\x00\x00\x00\x00\x01\x00\x01\xaa\x5c\ +\x00\x00\x01\xa6\x00\x00\x00\x00\x00\x01\x00\x01\xc9\x98\ +\x00\x00\x01\x7c\x00\x00\x00\x00\x00\x01\x00\x01\x80\x61\ \x00\x00\x00\x58\x00\x02\x00\x00\x00\x03\x00\x00\x00\x0b\ -\x00\x00\x01\xf0\x00\x00\x00\x00\x00\x01\x00\x02\x07\xc9\ -\x00\x00\x01\xbe\x00\x00\x00\x00\x00\x01\x00\x01\xf6\xde\ -\x00\x00\x01\xd8\x00\x00\x00\x00\x00\x01\x00\x02\x01\xe5\ +\x00\x00\x01\x4c\x00\x00\x00\x00\x00\x01\x00\x01\x6c\x02\ +\x00\x00\x01\x62\x00\x00\x00\x00\x00\x01\x00\x01\x75\x5a\ +\x00\x00\x01\x34\x00\x00\x00\x00\x00\x01\x00\x01\x66\x1e\ \x00\x00\x00\x58\x00\x02\x00\x00\x00\x03\x00\x00\x00\x0f\ -\x00\x00\x00\x7e\x00\x00\x00\x00\x00\x01\x00\x00\x09\x5d\ -\x00\x00\x00\x68\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\ -\x00\x00\x00\x9a\x00\x00\x00\x00\x00\x01\x00\x00\x1e\x9a\ +\x00\x00\x01\xd4\x00\x00\x00\x00\x00\x01\x00\x01\xf2\x87\ +\x00\x00\x01\xf0\x00\x00\x00\x00\x00\x01\x00\x02\x07\xc4\ +\x00\x00\x01\xbc\x00\x00\x00\x00\x00\x01\x00\x01\xe5\xe7\ \x00\x00\x00\x58\x00\x02\x00\x00\x00\x05\x00\x00\x00\x13\ -\x00\x00\x01\x38\x00\x00\x00\x00\x00\x01\x00\x00\x6a\x71\ -\x00\x00\x01\x0c\x00\x00\x00\x00\x00\x01\x00\x00\x46\x38\ -\x00\x00\x00\xce\x00\x00\x00\x00\x00\x01\x00\x00\x37\xa3\ -\x00\x00\x00\xb2\x00\x00\x00\x00\x00\x01\x00\x00\x2b\x3a\ -\x00\x00\x00\xe6\x00\x00\x00\x00\x00\x01\x00\x00\x3c\x02\ +\x00\x00\x00\xee\x00\x00\x00\x00\x00\x01\x00\x00\x3f\x37\ +\x00\x00\x00\x68\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\ +\x00\x00\x00\xb0\x00\x00\x00\x00\x00\x01\x00\x00\x30\xa2\ +\x00\x00\x00\x94\x00\x00\x00\x00\x00\x01\x00\x00\x24\x39\ +\x00\x00\x00\xc8\x00\x00\x00\x00\x00\x01\x00\x00\x35\x01\ \x00\x00\x00\x58\x00\x02\x00\x00\x00\x01\x00\x00\x00\x19\ -\x00\x00\x01\x5a\x00\x00\x00\x00\x00\x01\x00\x00\x73\xc8\ +\x00\x00\x01\x10\x00\x00\x00\x00\x00\x01\x00\x00\x48\x8e\ " def qInitResources(): diff --git a/kcc/KCC_ui.py b/kcc/KCC_ui.py index f3d2e1b..917c894 100644 --- a/kcc/KCC_ui.py +++ b/kcc/KCC_ui.py @@ -2,30 +2,16 @@ # Form implementation generated from reading ui file 'KCC.ui' # -# Created: Tue Jan 14 15:50:02 2014 -# by: PyQt4 UI code generator 4.10.3 +# Created: Wed Jan 15 11:34:09 2014 +# by: PyQt5 UI code generator 5.2 # # WARNING! All changes made in this file will be lost! -from PyQt4 import QtCore, QtGui - -try: - _fromUtf8 = QtCore.QString.fromUtf8 -except AttributeError: - def _fromUtf8(s): - return s - -try: - _encoding = QtGui.QApplication.UnicodeUTF8 - def _translate(context, text, disambig): - return QtGui.QApplication.translate(context, text, disambig, _encoding) -except AttributeError: - def _translate(context, text, disambig): - return QtGui.QApplication.translate(context, text, disambig) +from PyQt5 import QtCore, QtGui, QtWidgets class Ui_KCC(object): def setupUi(self, KCC): - KCC.setObjectName(_fromUtf8("KCC")) + KCC.setObjectName("KCC") KCC.resize(420, 397) KCC.setMinimumSize(QtCore.QSize(420, 397)) KCC.setMaximumSize(QtCore.QSize(420, 397)) @@ -33,62 +19,62 @@ class Ui_KCC(object): font.setPointSize(9) KCC.setFont(font) icon = QtGui.QIcon() - icon.addPixmap(QtGui.QPixmap(_fromUtf8(":/Icon/icons/comic2ebook.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off) + icon.addPixmap(QtGui.QPixmap(":/Icon/icons/comic2ebook.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) KCC.setWindowIcon(icon) KCC.setLocale(QtCore.QLocale(QtCore.QLocale.C, QtCore.QLocale.AnyCountry)) - self.Form = QtGui.QWidget(KCC) - self.Form.setObjectName(_fromUtf8("Form")) - self.OptionsAdvanced = QtGui.QFrame(self.Form) + self.Form = QtWidgets.QWidget(KCC) + self.Form.setObjectName("Form") + self.OptionsAdvanced = QtWidgets.QFrame(self.Form) self.OptionsAdvanced.setEnabled(True) self.OptionsAdvanced.setGeometry(QtCore.QRect(10, 254, 421, 61)) font = QtGui.QFont() font.setPointSize(9) self.OptionsAdvanced.setFont(font) - self.OptionsAdvanced.setObjectName(_fromUtf8("OptionsAdvanced")) - self.gridLayout = QtGui.QGridLayout(self.OptionsAdvanced) + self.OptionsAdvanced.setObjectName("OptionsAdvanced") + self.gridLayout = QtWidgets.QGridLayout(self.OptionsAdvanced) self.gridLayout.setContentsMargins(9, -1, -1, -1) - self.gridLayout.setObjectName(_fromUtf8("gridLayout")) - self.ProcessingBox = QtGui.QCheckBox(self.OptionsAdvanced) + self.gridLayout.setObjectName("gridLayout") + self.ProcessingBox = QtWidgets.QCheckBox(self.OptionsAdvanced) self.ProcessingBox.setFocusPolicy(QtCore.Qt.NoFocus) - self.ProcessingBox.setObjectName(_fromUtf8("ProcessingBox")) + self.ProcessingBox.setObjectName("ProcessingBox") self.gridLayout.addWidget(self.ProcessingBox, 1, 0, 1, 1) - self.UpscaleBox = QtGui.QCheckBox(self.OptionsAdvanced) + self.UpscaleBox = QtWidgets.QCheckBox(self.OptionsAdvanced) self.UpscaleBox.setFocusPolicy(QtCore.Qt.NoFocus) self.UpscaleBox.setTristate(True) - self.UpscaleBox.setObjectName(_fromUtf8("UpscaleBox")) + self.UpscaleBox.setObjectName("UpscaleBox") self.gridLayout.addWidget(self.UpscaleBox, 1, 1, 1, 1) - self.WebtoonBox = QtGui.QCheckBox(self.OptionsAdvanced) + self.WebtoonBox = QtWidgets.QCheckBox(self.OptionsAdvanced) self.WebtoonBox.setFocusPolicy(QtCore.Qt.NoFocus) - self.WebtoonBox.setObjectName(_fromUtf8("WebtoonBox")) + self.WebtoonBox.setObjectName("WebtoonBox") self.gridLayout.addWidget(self.WebtoonBox, 3, 1, 1, 1) - self.NoDitheringBox = QtGui.QCheckBox(self.OptionsAdvanced) + self.NoDitheringBox = QtWidgets.QCheckBox(self.OptionsAdvanced) self.NoDitheringBox.setFocusPolicy(QtCore.Qt.NoFocus) - self.NoDitheringBox.setObjectName(_fromUtf8("NoDitheringBox")) + self.NoDitheringBox.setObjectName("NoDitheringBox") self.gridLayout.addWidget(self.NoDitheringBox, 3, 2, 1, 1) - self.BorderBox = QtGui.QCheckBox(self.OptionsAdvanced) + self.BorderBox = QtWidgets.QCheckBox(self.OptionsAdvanced) self.BorderBox.setFocusPolicy(QtCore.Qt.NoFocus) self.BorderBox.setTristate(True) - self.BorderBox.setObjectName(_fromUtf8("BorderBox")) + self.BorderBox.setObjectName("BorderBox") self.gridLayout.addWidget(self.BorderBox, 3, 0, 1, 1) - self.NoRotateBox = QtGui.QCheckBox(self.OptionsAdvanced) + self.NoRotateBox = QtWidgets.QCheckBox(self.OptionsAdvanced) self.NoRotateBox.setFocusPolicy(QtCore.Qt.NoFocus) - self.NoRotateBox.setObjectName(_fromUtf8("NoRotateBox")) + self.NoRotateBox.setObjectName("NoRotateBox") self.gridLayout.addWidget(self.NoRotateBox, 1, 2, 1, 1) - self.DeviceBox = QtGui.QComboBox(self.Form) + self.DeviceBox = QtWidgets.QComboBox(self.Form) self.DeviceBox.setGeometry(QtCore.QRect(10, 200, 141, 31)) font = QtGui.QFont() font.setPointSize(8) self.DeviceBox.setFont(font) self.DeviceBox.setFocusPolicy(QtCore.Qt.NoFocus) - self.DeviceBox.setObjectName(_fromUtf8("DeviceBox")) - self.FormatBox = QtGui.QComboBox(self.Form) + self.DeviceBox.setObjectName("DeviceBox") + self.FormatBox = QtWidgets.QComboBox(self.Form) self.FormatBox.setGeometry(QtCore.QRect(260, 200, 151, 31)) font = QtGui.QFont() font.setPointSize(8) self.FormatBox.setFont(font) self.FormatBox.setFocusPolicy(QtCore.Qt.NoFocus) - self.FormatBox.setObjectName(_fromUtf8("FormatBox")) - self.ConvertButton = QtGui.QPushButton(self.Form) + self.FormatBox.setObjectName("FormatBox") + self.ConvertButton = QtWidgets.QPushButton(self.Form) self.ConvertButton.setGeometry(QtCore.QRect(160, 200, 91, 32)) font = QtGui.QFont() font.setPointSize(9) @@ -97,99 +83,99 @@ class Ui_KCC(object): self.ConvertButton.setFont(font) self.ConvertButton.setFocusPolicy(QtCore.Qt.NoFocus) icon1 = QtGui.QIcon() - icon1.addPixmap(QtGui.QPixmap(_fromUtf8(":/Other/icons/convert.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off) + icon1.addPixmap(QtGui.QPixmap(":/Other/icons/convert.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.ConvertButton.setIcon(icon1) - self.ConvertButton.setObjectName(_fromUtf8("ConvertButton")) - self.DirectoryButton = QtGui.QPushButton(self.Form) + self.ConvertButton.setObjectName("ConvertButton") + self.DirectoryButton = QtWidgets.QPushButton(self.Form) self.DirectoryButton.setGeometry(QtCore.QRect(10, 160, 141, 32)) font = QtGui.QFont() font.setPointSize(8) self.DirectoryButton.setFont(font) self.DirectoryButton.setFocusPolicy(QtCore.Qt.NoFocus) icon2 = QtGui.QIcon() - icon2.addPixmap(QtGui.QPixmap(_fromUtf8(":/Other/icons/folder_new.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off) + icon2.addPixmap(QtGui.QPixmap(":/Other/icons/folder_new.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.DirectoryButton.setIcon(icon2) - self.DirectoryButton.setObjectName(_fromUtf8("DirectoryButton")) - self.FileButton = QtGui.QPushButton(self.Form) + self.DirectoryButton.setObjectName("DirectoryButton") + self.FileButton = QtWidgets.QPushButton(self.Form) self.FileButton.setGeometry(QtCore.QRect(260, 160, 151, 32)) font = QtGui.QFont() font.setPointSize(8) self.FileButton.setFont(font) self.FileButton.setFocusPolicy(QtCore.Qt.NoFocus) icon3 = QtGui.QIcon() - icon3.addPixmap(QtGui.QPixmap(_fromUtf8(":/Other/icons/document_new.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off) + icon3.addPixmap(QtGui.QPixmap(":/Other/icons/document_new.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.FileButton.setIcon(icon3) - self.FileButton.setObjectName(_fromUtf8("FileButton")) - self.ClearButton = QtGui.QPushButton(self.Form) + self.FileButton.setObjectName("FileButton") + self.ClearButton = QtWidgets.QPushButton(self.Form) self.ClearButton.setGeometry(QtCore.QRect(160, 160, 91, 32)) font = QtGui.QFont() font.setPointSize(8) self.ClearButton.setFont(font) self.ClearButton.setFocusPolicy(QtCore.Qt.NoFocus) icon4 = QtGui.QIcon() - icon4.addPixmap(QtGui.QPixmap(_fromUtf8(":/Other/icons/clear.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off) + icon4.addPixmap(QtGui.QPixmap(":/Other/icons/clear.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.ClearButton.setIcon(icon4) - self.ClearButton.setObjectName(_fromUtf8("ClearButton")) - self.OptionsBasic = QtGui.QFrame(self.Form) + self.ClearButton.setObjectName("ClearButton") + self.OptionsBasic = QtWidgets.QFrame(self.Form) self.OptionsBasic.setGeometry(QtCore.QRect(10, 230, 421, 41)) font = QtGui.QFont() font.setPointSize(9) self.OptionsBasic.setFont(font) - self.OptionsBasic.setObjectName(_fromUtf8("OptionsBasic")) - self.MangaBox = QtGui.QCheckBox(self.OptionsBasic) + self.OptionsBasic.setObjectName("OptionsBasic") + self.MangaBox = QtWidgets.QCheckBox(self.OptionsBasic) self.MangaBox.setGeometry(QtCore.QRect(9, 10, 130, 18)) self.MangaBox.setFocusPolicy(QtCore.Qt.NoFocus) - self.MangaBox.setObjectName(_fromUtf8("MangaBox")) - self.QualityBox = QtGui.QCheckBox(self.OptionsBasic) + self.MangaBox.setObjectName("MangaBox") + self.QualityBox = QtWidgets.QCheckBox(self.OptionsBasic) self.QualityBox.setGeometry(QtCore.QRect(282, 10, 130, 18)) self.QualityBox.setFocusPolicy(QtCore.Qt.NoFocus) self.QualityBox.setTristate(True) - self.QualityBox.setObjectName(_fromUtf8("QualityBox")) - self.RotateBox = QtGui.QCheckBox(self.OptionsBasic) + self.QualityBox.setObjectName("QualityBox") + self.RotateBox = QtWidgets.QCheckBox(self.OptionsBasic) self.RotateBox.setGeometry(QtCore.QRect(145, 10, 130, 18)) self.RotateBox.setFocusPolicy(QtCore.Qt.NoFocus) - self.RotateBox.setObjectName(_fromUtf8("RotateBox")) - self.JobList = QtGui.QListWidget(self.Form) + self.RotateBox.setObjectName("RotateBox") + self.JobList = QtWidgets.QListWidget(self.Form) self.JobList.setGeometry(QtCore.QRect(10, 50, 401, 101)) self.JobList.setFocusPolicy(QtCore.Qt.NoFocus) - self.JobList.setStyleSheet(_fromUtf8("QListWidget#JobList {background:#ffffff;background-image:url(:/Other/icons/list_background.png);background-position:center center;background-repeat:no-repeat;}QScrollBar:vertical{border:1px solid #999;background:#FFF;width:5px;margin:0}QScrollBar::handle:vertical{background:DarkGray;min-height:0}QScrollBar::add-line:vertical{height:0;background:DarkGray;subcontrol-position:bottom;subcontrol-origin:margin}QScrollBar::sub-line:vertical{height:0;background:DarkGray;subcontrol-position:top;subcontrol-origin:margin}QScrollBar:horizontal{border:1px solid #999;background:#FFF;height:5px;margin:0}QScrollBar::handle:horizontal{background:DarkGray;min-width:0}QScrollBar::add-line:horizontal{width:0;background:DarkGray;subcontrol-position:bottom;subcontrol-origin:margin}QScrollBar::sub-line:horizontal{width:0;background:DarkGray;subcontrol-position:top;subcontrol-origin:margin}")) + self.JobList.setStyleSheet("QListWidget#JobList {background:#ffffff;background-image:url(:/Other/icons/list_background.png);background-position:center center;background-repeat:no-repeat;}QScrollBar:vertical{border:1px solid #999;background:#FFF;width:5px;margin:0}QScrollBar::handle:vertical{background:DarkGray;min-height:0}QScrollBar::add-line:vertical{height:0;background:DarkGray;subcontrol-position:bottom;subcontrol-origin:margin}QScrollBar::sub-line:vertical{height:0;background:DarkGray;subcontrol-position:top;subcontrol-origin:margin}QScrollBar:horizontal{border:1px solid #999;background:#FFF;height:5px;margin:0}QScrollBar::handle:horizontal{background:DarkGray;min-width:0}QScrollBar::add-line:horizontal{width:0;background:DarkGray;subcontrol-position:bottom;subcontrol-origin:margin}QScrollBar::sub-line:horizontal{width:0;background:DarkGray;subcontrol-position:top;subcontrol-origin:margin}") self.JobList.setProperty("showDropIndicator", False) - self.JobList.setSelectionMode(QtGui.QAbstractItemView.NoSelection) - self.JobList.setVerticalScrollMode(QtGui.QAbstractItemView.ScrollPerPixel) - self.JobList.setHorizontalScrollMode(QtGui.QAbstractItemView.ScrollPerPixel) - self.JobList.setObjectName(_fromUtf8("JobList")) - self.BasicModeButton = QtGui.QPushButton(self.Form) + self.JobList.setSelectionMode(QtWidgets.QAbstractItemView.NoSelection) + self.JobList.setVerticalScrollMode(QtWidgets.QAbstractItemView.ScrollPerPixel) + self.JobList.setHorizontalScrollMode(QtWidgets.QAbstractItemView.ScrollPerPixel) + self.JobList.setObjectName("JobList") + self.BasicModeButton = QtWidgets.QPushButton(self.Form) self.BasicModeButton.setGeometry(QtCore.QRect(10, 10, 195, 32)) font = QtGui.QFont() font.setPointSize(9) self.BasicModeButton.setFont(font) self.BasicModeButton.setFocusPolicy(QtCore.Qt.NoFocus) - self.BasicModeButton.setObjectName(_fromUtf8("BasicModeButton")) - self.AdvModeButton = QtGui.QPushButton(self.Form) + self.BasicModeButton.setObjectName("BasicModeButton") + self.AdvModeButton = QtWidgets.QPushButton(self.Form) self.AdvModeButton.setGeometry(QtCore.QRect(217, 10, 195, 32)) font = QtGui.QFont() font.setPointSize(9) self.AdvModeButton.setFont(font) self.AdvModeButton.setFocusPolicy(QtCore.Qt.NoFocus) - self.AdvModeButton.setObjectName(_fromUtf8("AdvModeButton")) - self.OptionsAdvancedGamma = QtGui.QFrame(self.Form) + self.AdvModeButton.setObjectName("AdvModeButton") + self.OptionsAdvancedGamma = QtWidgets.QFrame(self.Form) self.OptionsAdvancedGamma.setEnabled(True) self.OptionsAdvancedGamma.setGeometry(QtCore.QRect(10, 305, 401, 41)) font = QtGui.QFont() font.setPointSize(9) self.OptionsAdvancedGamma.setFont(font) - self.OptionsAdvancedGamma.setObjectName(_fromUtf8("OptionsAdvancedGamma")) - self.GammaLabel = QtGui.QLabel(self.OptionsAdvancedGamma) + self.OptionsAdvancedGamma.setObjectName("OptionsAdvancedGamma") + self.GammaLabel = QtWidgets.QLabel(self.OptionsAdvancedGamma) self.GammaLabel.setGeometry(QtCore.QRect(15, 0, 100, 40)) - self.GammaLabel.setObjectName(_fromUtf8("GammaLabel")) - self.GammaSlider = QtGui.QSlider(self.OptionsAdvancedGamma) + self.GammaLabel.setObjectName("GammaLabel") + self.GammaSlider = QtWidgets.QSlider(self.OptionsAdvancedGamma) self.GammaSlider.setGeometry(QtCore.QRect(110, 10, 270, 22)) self.GammaSlider.setFocusPolicy(QtCore.Qt.ClickFocus) self.GammaSlider.setMaximum(500) self.GammaSlider.setSingleStep(5) self.GammaSlider.setOrientation(QtCore.Qt.Horizontal) - self.GammaSlider.setObjectName(_fromUtf8("GammaSlider")) - self.ProgressBar = QtGui.QProgressBar(self.Form) + self.GammaSlider.setObjectName("GammaSlider") + self.ProgressBar = QtWidgets.QProgressBar(self.Form) self.ProgressBar.setGeometry(QtCore.QRect(10, 10, 401, 31)) font = QtGui.QFont() font.setPointSize(10) @@ -198,28 +184,28 @@ class Ui_KCC(object): self.ProgressBar.setFont(font) self.ProgressBar.setProperty("value", 0) self.ProgressBar.setAlignment(QtCore.Qt.AlignJustify|QtCore.Qt.AlignVCenter) - self.ProgressBar.setFormat(_fromUtf8("")) - self.ProgressBar.setObjectName(_fromUtf8("ProgressBar")) - self.OptionsExpert = QtGui.QFrame(self.Form) + self.ProgressBar.setFormat("") + self.ProgressBar.setObjectName("ProgressBar") + self.OptionsExpert = QtWidgets.QFrame(self.Form) self.OptionsExpert.setGeometry(QtCore.QRect(10, 337, 421, 41)) font = QtGui.QFont() font.setPointSize(9) self.OptionsExpert.setFont(font) - self.OptionsExpert.setObjectName(_fromUtf8("OptionsExpert")) - self.ColorBox = QtGui.QCheckBox(self.OptionsExpert) + self.OptionsExpert.setObjectName("OptionsExpert") + self.ColorBox = QtWidgets.QCheckBox(self.OptionsExpert) self.ColorBox.setGeometry(QtCore.QRect(9, 11, 130, 18)) self.ColorBox.setFocusPolicy(QtCore.Qt.NoFocus) - self.ColorBox.setObjectName(_fromUtf8("ColorBox")) - self.OptionsExpertInternal = QtGui.QFrame(self.OptionsExpert) + self.ColorBox.setObjectName("ColorBox") + self.OptionsExpertInternal = QtWidgets.QFrame(self.OptionsExpert) self.OptionsExpertInternal.setGeometry(QtCore.QRect(100, 0, 295, 40)) - self.OptionsExpertInternal.setObjectName(_fromUtf8("OptionsExpertInternal")) - self.gridLayout_2 = QtGui.QGridLayout(self.OptionsExpertInternal) - self.gridLayout_2.setObjectName(_fromUtf8("gridLayout_2")) - self.wLabel = QtGui.QLabel(self.OptionsExpertInternal) - self.wLabel.setObjectName(_fromUtf8("wLabel")) + self.OptionsExpertInternal.setObjectName("OptionsExpertInternal") + self.gridLayout_2 = QtWidgets.QGridLayout(self.OptionsExpertInternal) + self.gridLayout_2.setObjectName("gridLayout_2") + self.wLabel = QtWidgets.QLabel(self.OptionsExpertInternal) + self.wLabel.setObjectName("wLabel") self.gridLayout_2.addWidget(self.wLabel, 0, 0, 1, 1) - self.customWidth = QtGui.QLineEdit(self.OptionsExpertInternal) - sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed) + self.customWidth = QtWidgets.QLineEdit(self.OptionsExpertInternal) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.customWidth.sizePolicy().hasHeightForWidth()) @@ -228,13 +214,13 @@ class Ui_KCC(object): self.customWidth.setFocusPolicy(QtCore.Qt.ClickFocus) self.customWidth.setAcceptDrops(False) self.customWidth.setMaxLength(4) - self.customWidth.setObjectName(_fromUtf8("customWidth")) + self.customWidth.setObjectName("customWidth") self.gridLayout_2.addWidget(self.customWidth, 0, 1, 1, 1) - self.hLabel = QtGui.QLabel(self.OptionsExpertInternal) - self.hLabel.setObjectName(_fromUtf8("hLabel")) + self.hLabel = QtWidgets.QLabel(self.OptionsExpertInternal) + self.hLabel.setObjectName("hLabel") self.gridLayout_2.addWidget(self.hLabel, 0, 2, 1, 1) - self.customHeight = QtGui.QLineEdit(self.OptionsExpertInternal) - sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed) + self.customHeight = QtWidgets.QLineEdit(self.OptionsExpertInternal) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.customHeight.sizePolicy().hasHeightForWidth()) @@ -243,27 +229,27 @@ class Ui_KCC(object): self.customHeight.setFocusPolicy(QtCore.Qt.ClickFocus) self.customHeight.setAcceptDrops(False) self.customHeight.setMaxLength(4) - self.customHeight.setObjectName(_fromUtf8("customHeight")) + self.customHeight.setObjectName("customHeight") self.gridLayout_2.addWidget(self.customHeight, 0, 3, 1, 1) KCC.setCentralWidget(self.Form) - self.statusBar = QtGui.QStatusBar(KCC) + self.statusBar = QtWidgets.QStatusBar(KCC) font = QtGui.QFont() - font.setFamily(_fromUtf8("MS Shell Dlg 2")) + font.setFamily("MS Shell Dlg 2") font.setPointSize(8) self.statusBar.setFont(font) self.statusBar.setSizeGripEnabled(False) - self.statusBar.setObjectName(_fromUtf8("statusBar")) + self.statusBar.setObjectName("statusBar") KCC.setStatusBar(self.statusBar) - self.ActionBasic = QtGui.QAction(KCC) + self.ActionBasic = QtWidgets.QAction(KCC) self.ActionBasic.setCheckable(True) self.ActionBasic.setChecked(False) font = QtGui.QFont() font.setPointSize(9) self.ActionBasic.setFont(font) - self.ActionBasic.setObjectName(_fromUtf8("ActionBasic")) - self.ActionAdvanced = QtGui.QAction(KCC) + self.ActionBasic.setObjectName("ActionBasic") + self.ActionAdvanced = QtWidgets.QAction(KCC) self.ActionAdvanced.setCheckable(True) - self.ActionAdvanced.setObjectName(_fromUtf8("ActionAdvanced")) + self.ActionAdvanced.setObjectName("ActionAdvanced") self.retranslateUi(KCC) QtCore.QMetaObject.connectSlotsByName(KCC) @@ -272,51 +258,52 @@ class Ui_KCC(object): KCC.setTabOrder(self.ConvertButton, self.ClearButton) def retranslateUi(self, KCC): - KCC.setWindowTitle(_translate("KCC", "Kindle Comic Converter", None)) - self.ProcessingBox.setToolTip(_translate("KCC", "Disable image optimizations.", None)) - self.ProcessingBox.setText(_translate("KCC", "No optimisation", None)) - self.UpscaleBox.setToolTip(_translate("KCC", "

Unchecked - Nothing
Images smaller than device resolution will not be resized.

Indeterminate - Stretching
Images smaller than device resolution will be resized. Aspect ratio will be not preserved.

Checked - Upscaling
Images smaller than device resolution will be resized. Aspect ratio will be preserved.

", None)) - self.UpscaleBox.setText(_translate("KCC", "Stretch/Upscale", None)) - self.WebtoonBox.setToolTip(_translate("KCC", "

Enable auto-splitting of webtoons like Tower of God or Noblesse.
Pages with a low width, high height and vertical panel flow.

", None)) - self.WebtoonBox.setText(_translate("KCC", "Webtoon mode", None)) - self.NoDitheringBox.setToolTip(_translate("KCC", "

Create PNG files instead JPEG.
Quality increase is not noticeable on most of devices.
Output files might be smaller.
MOBI conversion will be much slower.

", None)) - self.NoDitheringBox.setText(_translate("KCC", "PNG output", None)) - self.BorderBox.setToolTip(_translate("KCC", "

Unchecked - Autodetection
Color of margins fill will be detected automatically.

Indeterminate - White
Margins will be filled with white color.

Checked - Black
Margins will be filled with black color.

", None)) - self.BorderBox.setText(_translate("KCC", "W/B margins", None)) - self.NoRotateBox.setToolTip(_translate("KCC", "

Disable splitting and rotation.

", None)) - self.NoRotateBox.setText(_translate("KCC", "No split/rotate", None)) - self.DeviceBox.setToolTip(_translate("KCC", "Target device.", None)) - self.FormatBox.setToolTip(_translate("KCC", "Output format.", None)) - self.ConvertButton.setText(_translate("KCC", "Convert", None)) - self.DirectoryButton.setText(_translate("KCC", "Add directory", None)) - self.FileButton.setText(_translate("KCC", "Add file", None)) - self.ClearButton.setText(_translate("KCC", "Clear list", None)) - self.MangaBox.setToolTip(_translate("KCC", "Enable right-to-left reading.", None)) - self.MangaBox.setText(_translate("KCC", "Manga mode", None)) + _translate = QtCore.QCoreApplication.translate + KCC.setWindowTitle(_translate("KCC", "Kindle Comic Converter")) + self.ProcessingBox.setToolTip(_translate("KCC", "Disable image optimizations.")) + self.ProcessingBox.setText(_translate("KCC", "No optimisation")) + self.UpscaleBox.setToolTip(_translate("KCC", "

Unchecked - Nothing
Images smaller than device resolution will not be resized.

Indeterminate - Stretching
Images smaller than device resolution will be resized. Aspect ratio will be not preserved.

Checked - Upscaling
Images smaller than device resolution will be resized. Aspect ratio will be preserved.

")) + self.UpscaleBox.setText(_translate("KCC", "Stretch/Upscale")) + self.WebtoonBox.setToolTip(_translate("KCC", "

Enable auto-splitting of webtoons like Tower of God or Noblesse.
Pages with a low width, high height and vertical panel flow.

")) + self.WebtoonBox.setText(_translate("KCC", "Webtoon mode")) + self.NoDitheringBox.setToolTip(_translate("KCC", "

Create PNG files instead JPEG.
Quality increase is not noticeable on most of devices.
Output files might be smaller.
MOBI conversion will be much slower.

")) + self.NoDitheringBox.setText(_translate("KCC", "PNG output")) + self.BorderBox.setToolTip(_translate("KCC", "

Unchecked - Autodetection
Color of margins fill will be detected automatically.

Indeterminate - White
Margins will be filled with white color.

Checked - Black
Margins will be filled with black color.

")) + self.BorderBox.setText(_translate("KCC", "W/B margins")) + self.NoRotateBox.setToolTip(_translate("KCC", "

Disable splitting and rotation.

")) + self.NoRotateBox.setText(_translate("KCC", "No split/rotate")) + self.DeviceBox.setToolTip(_translate("KCC", "Target device.")) + self.FormatBox.setToolTip(_translate("KCC", "Output format.")) + self.ConvertButton.setText(_translate("KCC", "Convert")) + self.DirectoryButton.setText(_translate("KCC", "Add directory")) + self.FileButton.setText(_translate("KCC", "Add file")) + self.ClearButton.setText(_translate("KCC", "Clear list")) + self.MangaBox.setToolTip(_translate("KCC", "Enable right-to-left reading.")) + self.MangaBox.setText(_translate("KCC", "Manga mode")) self.QualityBox.setToolTip(_translate("KCC", "\n" "\n" "

Unchecked - Normal quality mode
Use it when Panel View support is not needed.
- Maximum quality when zoom is not enabled.
- Poor quality when zoom is enabled.
- Lowest file size.

\n" "

Indeterminate - High quality mode
Not zoomed image might be a little blurry.
Smaller images might be forcefully upscaled in this mode.

- Medium/High quality when zoom is not enabled.
- Maximum quality when zoom is enabled.

\n" -"

Checked - Ultra quality mode
Maximum possible quality.
- Maximum quality when zoom is not enabled.
- Maximum quality when zoom is enabled.
- Very high file size.

", None)) - self.QualityBox.setText(_translate("KCC", "High/Ultra quality", None)) - self.RotateBox.setToolTip(_translate("KCC", "

Disable splitting of two-page spreads.
They will be rotated instead.

", None)) - self.RotateBox.setText(_translate("KCC", "Horizontal mode", None)) - self.BasicModeButton.setText(_translate("KCC", "Basic", None)) - self.AdvModeButton.setText(_translate("KCC", "Advanced", None)) - self.GammaLabel.setText(_translate("KCC", "Gamma: Auto", None)) - self.ColorBox.setToolTip(_translate("KCC", "

Don\'t convert images to grayscale.

", None)) - self.ColorBox.setText(_translate("KCC", "Color mode", None)) - self.wLabel.setToolTip(_translate("KCC", "Resolution of target device.", None)) - self.wLabel.setText(_translate("KCC", "Custom width: ", None)) - self.customWidth.setToolTip(_translate("KCC", "Resolution of target device.", None)) - self.customWidth.setInputMask(_translate("KCC", "0000; ", None)) - self.hLabel.setToolTip(_translate("KCC", "Resolution of target device.", None)) - self.hLabel.setText(_translate("KCC", "Custom height: ", None)) - self.customHeight.setToolTip(_translate("KCC", "Resolution of target device.", None)) - self.customHeight.setInputMask(_translate("KCC", "0000; ", None)) - self.ActionBasic.setText(_translate("KCC", "Basic", None)) - self.ActionAdvanced.setText(_translate("KCC", "Advanced", None)) +"

Checked - Ultra quality mode
Maximum possible quality.
- Maximum quality when zoom is not enabled.
- Maximum quality when zoom is enabled.
- Very high file size.

")) + self.QualityBox.setText(_translate("KCC", "High/Ultra quality")) + self.RotateBox.setToolTip(_translate("KCC", "

Disable splitting of two-page spreads.
They will be rotated instead.

")) + self.RotateBox.setText(_translate("KCC", "Horizontal mode")) + self.BasicModeButton.setText(_translate("KCC", "Basic")) + self.AdvModeButton.setText(_translate("KCC", "Advanced")) + self.GammaLabel.setText(_translate("KCC", "Gamma: Auto")) + self.ColorBox.setToolTip(_translate("KCC", "

Don\'t convert images to grayscale.

")) + self.ColorBox.setText(_translate("KCC", "Color mode")) + self.wLabel.setToolTip(_translate("KCC", "Resolution of target device.")) + self.wLabel.setText(_translate("KCC", "Custom width: ")) + self.customWidth.setToolTip(_translate("KCC", "Resolution of target device.")) + self.customWidth.setInputMask(_translate("KCC", "0000")) + self.hLabel.setToolTip(_translate("KCC", "Resolution of target device.")) + self.hLabel.setText(_translate("KCC", "Custom height: ")) + self.customHeight.setToolTip(_translate("KCC", "Resolution of target device.")) + self.customHeight.setInputMask(_translate("KCC", "0000")) + self.ActionBasic.setText(_translate("KCC", "Basic")) + self.ActionAdvanced.setText(_translate("KCC", "Advanced")) from . import KCC_rc diff --git a/kcc/KCC_ui_linux.py b/kcc/KCC_ui_linux.py index a45005d..983c077 100644 --- a/kcc/KCC_ui_linux.py +++ b/kcc/KCC_ui_linux.py @@ -2,30 +2,16 @@ # Form implementation generated from reading ui file 'KCC-Linux.ui' # -# Created: Tue Jan 14 15:50:14 2014 -# by: PyQt4 UI code generator 4.10.3 +# Created: Wed Jan 15 11:34:18 2014 +# by: PyQt5 UI code generator 5.2 # # WARNING! All changes made in this file will be lost! -from PyQt4 import QtCore, QtGui - -try: - _fromUtf8 = QtCore.QString.fromUtf8 -except AttributeError: - def _fromUtf8(s): - return s - -try: - _encoding = QtGui.QApplication.UnicodeUTF8 - def _translate(context, text, disambig): - return QtGui.QApplication.translate(context, text, disambig, _encoding) -except AttributeError: - def _translate(context, text, disambig): - return QtGui.QApplication.translate(context, text, disambig) +from PyQt5 import QtCore, QtGui, QtWidgets class Ui_KCC(object): def setupUi(self, KCC): - KCC.setObjectName(_fromUtf8("KCC")) + KCC.setObjectName("KCC") KCC.resize(420, 397) KCC.setMinimumSize(QtCore.QSize(420, 397)) KCC.setMaximumSize(QtCore.QSize(420, 397)) @@ -33,306 +19,306 @@ class Ui_KCC(object): font.setPointSize(9) KCC.setFont(font) icon = QtGui.QIcon() - icon.addPixmap(QtGui.QPixmap(_fromUtf8(":/Icon/icons/comic2ebook.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off) + icon.addPixmap(QtGui.QPixmap(":/Icon/icons/comic2ebook.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) KCC.setWindowIcon(icon) KCC.setLocale(QtCore.QLocale(QtCore.QLocale.C, QtCore.QLocale.AnyCountry)) - self.Form = QtGui.QWidget(KCC) - self.Form.setObjectName(_fromUtf8("Form")) - self.OptionsAdvanced = QtGui.QFrame(self.Form) + self.Form = QtWidgets.QWidget(KCC) + self.Form.setObjectName("Form") + self.OptionsAdvanced = QtWidgets.QFrame(self.Form) self.OptionsAdvanced.setEnabled(True) self.OptionsAdvanced.setGeometry(QtCore.QRect(1, 254, 421, 61)) font = QtGui.QFont() - font.setFamily(_fromUtf8("DejaVu Sans")) + font.setFamily("DejaVu Sans") font.setPointSize(9) self.OptionsAdvanced.setFont(font) - self.OptionsAdvanced.setObjectName(_fromUtf8("OptionsAdvanced")) - self.gridLayout = QtGui.QGridLayout(self.OptionsAdvanced) + self.OptionsAdvanced.setObjectName("OptionsAdvanced") + self.gridLayout = QtWidgets.QGridLayout(self.OptionsAdvanced) self.gridLayout.setContentsMargins(9, -1, -1, -1) - self.gridLayout.setObjectName(_fromUtf8("gridLayout")) - self.ProcessingBox = QtGui.QCheckBox(self.OptionsAdvanced) + self.gridLayout.setObjectName("gridLayout") + self.ProcessingBox = QtWidgets.QCheckBox(self.OptionsAdvanced) font = QtGui.QFont() - font.setFamily(_fromUtf8("DejaVu Sans")) + font.setFamily("DejaVu Sans") self.ProcessingBox.setFont(font) self.ProcessingBox.setFocusPolicy(QtCore.Qt.NoFocus) - self.ProcessingBox.setObjectName(_fromUtf8("ProcessingBox")) + self.ProcessingBox.setObjectName("ProcessingBox") self.gridLayout.addWidget(self.ProcessingBox, 1, 0, 1, 1) - self.UpscaleBox = QtGui.QCheckBox(self.OptionsAdvanced) + self.UpscaleBox = QtWidgets.QCheckBox(self.OptionsAdvanced) font = QtGui.QFont() - font.setFamily(_fromUtf8("DejaVu Sans")) + font.setFamily("DejaVu Sans") self.UpscaleBox.setFont(font) self.UpscaleBox.setFocusPolicy(QtCore.Qt.NoFocus) self.UpscaleBox.setTristate(True) - self.UpscaleBox.setObjectName(_fromUtf8("UpscaleBox")) + self.UpscaleBox.setObjectName("UpscaleBox") self.gridLayout.addWidget(self.UpscaleBox, 1, 1, 1, 1) - self.WebtoonBox = QtGui.QCheckBox(self.OptionsAdvanced) + self.WebtoonBox = QtWidgets.QCheckBox(self.OptionsAdvanced) font = QtGui.QFont() - font.setFamily(_fromUtf8("DejaVu Sans")) + font.setFamily("DejaVu Sans") self.WebtoonBox.setFont(font) self.WebtoonBox.setFocusPolicy(QtCore.Qt.NoFocus) - self.WebtoonBox.setObjectName(_fromUtf8("WebtoonBox")) + self.WebtoonBox.setObjectName("WebtoonBox") self.gridLayout.addWidget(self.WebtoonBox, 3, 1, 1, 1) - self.NoDitheringBox = QtGui.QCheckBox(self.OptionsAdvanced) + self.NoDitheringBox = QtWidgets.QCheckBox(self.OptionsAdvanced) font = QtGui.QFont() - font.setFamily(_fromUtf8("DejaVu Sans")) + font.setFamily("DejaVu Sans") self.NoDitheringBox.setFont(font) self.NoDitheringBox.setFocusPolicy(QtCore.Qt.NoFocus) - self.NoDitheringBox.setObjectName(_fromUtf8("NoDitheringBox")) + self.NoDitheringBox.setObjectName("NoDitheringBox") self.gridLayout.addWidget(self.NoDitheringBox, 3, 2, 1, 1) - self.BorderBox = QtGui.QCheckBox(self.OptionsAdvanced) + self.BorderBox = QtWidgets.QCheckBox(self.OptionsAdvanced) font = QtGui.QFont() - font.setFamily(_fromUtf8("DejaVu Sans")) + font.setFamily("DejaVu Sans") self.BorderBox.setFont(font) self.BorderBox.setFocusPolicy(QtCore.Qt.NoFocus) self.BorderBox.setTristate(True) - self.BorderBox.setObjectName(_fromUtf8("BorderBox")) + self.BorderBox.setObjectName("BorderBox") self.gridLayout.addWidget(self.BorderBox, 3, 0, 1, 1) - self.NoRotateBox = QtGui.QCheckBox(self.OptionsAdvanced) + self.NoRotateBox = QtWidgets.QCheckBox(self.OptionsAdvanced) font = QtGui.QFont() - font.setFamily(_fromUtf8("DejaVu Sans")) + font.setFamily("DejaVu Sans") self.NoRotateBox.setFont(font) self.NoRotateBox.setFocusPolicy(QtCore.Qt.NoFocus) - self.NoRotateBox.setObjectName(_fromUtf8("NoRotateBox")) + self.NoRotateBox.setObjectName("NoRotateBox") self.gridLayout.addWidget(self.NoRotateBox, 1, 2, 1, 1) - self.DeviceBox = QtGui.QComboBox(self.Form) + self.DeviceBox = QtWidgets.QComboBox(self.Form) self.DeviceBox.setGeometry(QtCore.QRect(10, 200, 141, 31)) font = QtGui.QFont() - font.setFamily(_fromUtf8("DejaVu Sans")) + font.setFamily("DejaVu Sans") font.setPointSize(8) self.DeviceBox.setFont(font) self.DeviceBox.setFocusPolicy(QtCore.Qt.NoFocus) - self.DeviceBox.setObjectName(_fromUtf8("DeviceBox")) - self.FormatBox = QtGui.QComboBox(self.Form) + self.DeviceBox.setObjectName("DeviceBox") + self.FormatBox = QtWidgets.QComboBox(self.Form) self.FormatBox.setGeometry(QtCore.QRect(260, 200, 151, 31)) font = QtGui.QFont() - font.setFamily(_fromUtf8("DejaVu Sans")) + font.setFamily("DejaVu Sans") font.setPointSize(8) self.FormatBox.setFont(font) self.FormatBox.setFocusPolicy(QtCore.Qt.NoFocus) - self.FormatBox.setObjectName(_fromUtf8("FormatBox")) - self.ConvertButton = QtGui.QPushButton(self.Form) + self.FormatBox.setObjectName("FormatBox") + self.ConvertButton = QtWidgets.QPushButton(self.Form) self.ConvertButton.setGeometry(QtCore.QRect(160, 200, 91, 32)) font = QtGui.QFont() - font.setFamily(_fromUtf8("DejaVu Sans")) + font.setFamily("DejaVu Sans") font.setPointSize(9) font.setBold(True) font.setWeight(75) self.ConvertButton.setFont(font) self.ConvertButton.setFocusPolicy(QtCore.Qt.NoFocus) icon1 = QtGui.QIcon() - icon1.addPixmap(QtGui.QPixmap(_fromUtf8(":/Other/icons/convert.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off) + icon1.addPixmap(QtGui.QPixmap(":/Other/icons/convert.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.ConvertButton.setIcon(icon1) - self.ConvertButton.setObjectName(_fromUtf8("ConvertButton")) - self.DirectoryButton = QtGui.QPushButton(self.Form) + self.ConvertButton.setObjectName("ConvertButton") + self.DirectoryButton = QtWidgets.QPushButton(self.Form) self.DirectoryButton.setGeometry(QtCore.QRect(10, 160, 141, 32)) font = QtGui.QFont() - font.setFamily(_fromUtf8("DejaVu Sans")) + font.setFamily("DejaVu Sans") font.setPointSize(8) self.DirectoryButton.setFont(font) self.DirectoryButton.setFocusPolicy(QtCore.Qt.NoFocus) icon2 = QtGui.QIcon() - icon2.addPixmap(QtGui.QPixmap(_fromUtf8(":/Other/icons/folder_new.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off) + icon2.addPixmap(QtGui.QPixmap(":/Other/icons/folder_new.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.DirectoryButton.setIcon(icon2) - self.DirectoryButton.setObjectName(_fromUtf8("DirectoryButton")) - self.FileButton = QtGui.QPushButton(self.Form) + self.DirectoryButton.setObjectName("DirectoryButton") + self.FileButton = QtWidgets.QPushButton(self.Form) self.FileButton.setGeometry(QtCore.QRect(260, 160, 151, 32)) font = QtGui.QFont() - font.setFamily(_fromUtf8("DejaVu Sans")) + font.setFamily("DejaVu Sans") font.setPointSize(8) self.FileButton.setFont(font) self.FileButton.setFocusPolicy(QtCore.Qt.NoFocus) icon3 = QtGui.QIcon() - icon3.addPixmap(QtGui.QPixmap(_fromUtf8(":/Other/icons/document_new.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off) + icon3.addPixmap(QtGui.QPixmap(":/Other/icons/document_new.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.FileButton.setIcon(icon3) - self.FileButton.setObjectName(_fromUtf8("FileButton")) - self.ClearButton = QtGui.QPushButton(self.Form) + self.FileButton.setObjectName("FileButton") + self.ClearButton = QtWidgets.QPushButton(self.Form) self.ClearButton.setGeometry(QtCore.QRect(160, 160, 91, 32)) font = QtGui.QFont() - font.setFamily(_fromUtf8("DejaVu Sans")) + font.setFamily("DejaVu Sans") font.setPointSize(8) self.ClearButton.setFont(font) self.ClearButton.setFocusPolicy(QtCore.Qt.NoFocus) icon4 = QtGui.QIcon() - icon4.addPixmap(QtGui.QPixmap(_fromUtf8(":/Other/icons/clear.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off) + icon4.addPixmap(QtGui.QPixmap(":/Other/icons/clear.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.ClearButton.setIcon(icon4) - self.ClearButton.setObjectName(_fromUtf8("ClearButton")) - self.OptionsBasic = QtGui.QFrame(self.Form) + self.ClearButton.setObjectName("ClearButton") + self.OptionsBasic = QtWidgets.QFrame(self.Form) self.OptionsBasic.setGeometry(QtCore.QRect(1, 230, 421, 41)) font = QtGui.QFont() - font.setFamily(_fromUtf8("DejaVu Sans")) + font.setFamily("DejaVu Sans") font.setPointSize(9) self.OptionsBasic.setFont(font) - self.OptionsBasic.setObjectName(_fromUtf8("OptionsBasic")) - self.MangaBox = QtGui.QCheckBox(self.OptionsBasic) + self.OptionsBasic.setObjectName("OptionsBasic") + self.MangaBox = QtWidgets.QCheckBox(self.OptionsBasic) self.MangaBox.setGeometry(QtCore.QRect(9, 10, 130, 18)) font = QtGui.QFont() - font.setFamily(_fromUtf8("DejaVu Sans")) + font.setFamily("DejaVu Sans") self.MangaBox.setFont(font) self.MangaBox.setFocusPolicy(QtCore.Qt.NoFocus) - self.MangaBox.setObjectName(_fromUtf8("MangaBox")) - self.QualityBox = QtGui.QCheckBox(self.OptionsBasic) + self.MangaBox.setObjectName("MangaBox") + self.QualityBox = QtWidgets.QCheckBox(self.OptionsBasic) self.QualityBox.setGeometry(QtCore.QRect(282, 10, 135, 18)) font = QtGui.QFont() - font.setFamily(_fromUtf8("DejaVu Sans")) + font.setFamily("DejaVu Sans") self.QualityBox.setFont(font) self.QualityBox.setFocusPolicy(QtCore.Qt.NoFocus) self.QualityBox.setTristate(True) - self.QualityBox.setObjectName(_fromUtf8("QualityBox")) - self.RotateBox = QtGui.QCheckBox(self.OptionsBasic) + self.QualityBox.setObjectName("QualityBox") + self.RotateBox = QtWidgets.QCheckBox(self.OptionsBasic) self.RotateBox.setGeometry(QtCore.QRect(145, 10, 130, 18)) font = QtGui.QFont() - font.setFamily(_fromUtf8("DejaVu Sans")) + font.setFamily("DejaVu Sans") self.RotateBox.setFont(font) self.RotateBox.setFocusPolicy(QtCore.Qt.NoFocus) - self.RotateBox.setObjectName(_fromUtf8("RotateBox")) - self.JobList = QtGui.QListWidget(self.Form) + self.RotateBox.setObjectName("RotateBox") + self.JobList = QtWidgets.QListWidget(self.Form) self.JobList.setGeometry(QtCore.QRect(10, 50, 401, 101)) font = QtGui.QFont() - font.setFamily(_fromUtf8("DejaVu Sans")) + font.setFamily("DejaVu Sans") font.setPointSize(8) font.setItalic(False) self.JobList.setFont(font) self.JobList.setFocusPolicy(QtCore.Qt.NoFocus) - self.JobList.setStyleSheet(_fromUtf8("QListWidget#JobList {background:#ffffff;background-image:url(:/Other/icons/list_background.png);background-position:center center;background-repeat:no-repeat;}QScrollBar:vertical{border:1px solid #999;background:#FFF;width:5px;margin:0}QScrollBar::handle:vertical{background:DarkGray;min-height:0}QScrollBar::add-line:vertical{height:0;background:DarkGray;subcontrol-position:bottom;subcontrol-origin:margin}QScrollBar::sub-line:vertical{height:0;background:DarkGray;subcontrol-position:top;subcontrol-origin:margin}QScrollBar:horizontal{border:1px solid #999;background:#FFF;height:5px;margin:0}QScrollBar::handle:horizontal{background:DarkGray;min-width:0}QScrollBar::add-line:horizontal{width:0;background:DarkGray;subcontrol-position:bottom;subcontrol-origin:margin}QScrollBar::sub-line:horizontal{width:0;background:DarkGray;subcontrol-position:top;subcontrol-origin:margin}")) + self.JobList.setStyleSheet("QListWidget#JobList {background:#ffffff;background-image:url(:/Other/icons/list_background.png);background-position:center center;background-repeat:no-repeat;}QScrollBar:vertical{border:1px solid #999;background:#FFF;width:5px;margin:0}QScrollBar::handle:vertical{background:DarkGray;min-height:0}QScrollBar::add-line:vertical{height:0;background:DarkGray;subcontrol-position:bottom;subcontrol-origin:margin}QScrollBar::sub-line:vertical{height:0;background:DarkGray;subcontrol-position:top;subcontrol-origin:margin}QScrollBar:horizontal{border:1px solid #999;background:#FFF;height:5px;margin:0}QScrollBar::handle:horizontal{background:DarkGray;min-width:0}QScrollBar::add-line:horizontal{width:0;background:DarkGray;subcontrol-position:bottom;subcontrol-origin:margin}QScrollBar::sub-line:horizontal{width:0;background:DarkGray;subcontrol-position:top;subcontrol-origin:margin}") self.JobList.setProperty("showDropIndicator", False) - self.JobList.setSelectionMode(QtGui.QAbstractItemView.NoSelection) + self.JobList.setSelectionMode(QtWidgets.QAbstractItemView.NoSelection) self.JobList.setIconSize(QtCore.QSize(18, 18)) - self.JobList.setVerticalScrollMode(QtGui.QAbstractItemView.ScrollPerPixel) - self.JobList.setHorizontalScrollMode(QtGui.QAbstractItemView.ScrollPerPixel) - self.JobList.setObjectName(_fromUtf8("JobList")) - self.BasicModeButton = QtGui.QPushButton(self.Form) + self.JobList.setVerticalScrollMode(QtWidgets.QAbstractItemView.ScrollPerPixel) + self.JobList.setHorizontalScrollMode(QtWidgets.QAbstractItemView.ScrollPerPixel) + self.JobList.setObjectName("JobList") + self.BasicModeButton = QtWidgets.QPushButton(self.Form) self.BasicModeButton.setGeometry(QtCore.QRect(10, 10, 195, 32)) font = QtGui.QFont() - font.setFamily(_fromUtf8("DejaVu Sans")) + font.setFamily("DejaVu Sans") font.setPointSize(9) self.BasicModeButton.setFont(font) self.BasicModeButton.setFocusPolicy(QtCore.Qt.NoFocus) - self.BasicModeButton.setObjectName(_fromUtf8("BasicModeButton")) - self.AdvModeButton = QtGui.QPushButton(self.Form) + self.BasicModeButton.setObjectName("BasicModeButton") + self.AdvModeButton = QtWidgets.QPushButton(self.Form) self.AdvModeButton.setGeometry(QtCore.QRect(217, 10, 195, 32)) font = QtGui.QFont() - font.setFamily(_fromUtf8("DejaVu Sans")) + font.setFamily("DejaVu Sans") font.setPointSize(9) self.AdvModeButton.setFont(font) self.AdvModeButton.setFocusPolicy(QtCore.Qt.NoFocus) - self.AdvModeButton.setObjectName(_fromUtf8("AdvModeButton")) - self.OptionsAdvancedGamma = QtGui.QFrame(self.Form) + self.AdvModeButton.setObjectName("AdvModeButton") + self.OptionsAdvancedGamma = QtWidgets.QFrame(self.Form) self.OptionsAdvancedGamma.setEnabled(True) self.OptionsAdvancedGamma.setGeometry(QtCore.QRect(10, 305, 401, 41)) font = QtGui.QFont() - font.setFamily(_fromUtf8("DejaVu Sans")) + font.setFamily("DejaVu Sans") font.setPointSize(9) self.OptionsAdvancedGamma.setFont(font) - self.OptionsAdvancedGamma.setObjectName(_fromUtf8("OptionsAdvancedGamma")) - self.GammaLabel = QtGui.QLabel(self.OptionsAdvancedGamma) + self.OptionsAdvancedGamma.setObjectName("OptionsAdvancedGamma") + self.GammaLabel = QtWidgets.QLabel(self.OptionsAdvancedGamma) self.GammaLabel.setGeometry(QtCore.QRect(15, 0, 100, 40)) font = QtGui.QFont() - font.setFamily(_fromUtf8("DejaVu Sans")) + font.setFamily("DejaVu Sans") self.GammaLabel.setFont(font) - self.GammaLabel.setObjectName(_fromUtf8("GammaLabel")) - self.GammaSlider = QtGui.QSlider(self.OptionsAdvancedGamma) + self.GammaLabel.setObjectName("GammaLabel") + self.GammaSlider = QtWidgets.QSlider(self.OptionsAdvancedGamma) self.GammaSlider.setGeometry(QtCore.QRect(110, 10, 275, 22)) font = QtGui.QFont() - font.setFamily(_fromUtf8("DejaVu Sans")) + font.setFamily("DejaVu Sans") self.GammaSlider.setFont(font) self.GammaSlider.setFocusPolicy(QtCore.Qt.ClickFocus) self.GammaSlider.setMaximum(500) self.GammaSlider.setSingleStep(5) self.GammaSlider.setOrientation(QtCore.Qt.Horizontal) - self.GammaSlider.setObjectName(_fromUtf8("GammaSlider")) - self.ProgressBar = QtGui.QProgressBar(self.Form) + self.GammaSlider.setObjectName("GammaSlider") + self.ProgressBar = QtWidgets.QProgressBar(self.Form) self.ProgressBar.setGeometry(QtCore.QRect(10, 10, 401, 31)) font = QtGui.QFont() - font.setFamily(_fromUtf8("DejaVu Sans")) + font.setFamily("DejaVu Sans") font.setPointSize(10) font.setBold(True) font.setWeight(75) self.ProgressBar.setFont(font) self.ProgressBar.setProperty("value", 0) self.ProgressBar.setAlignment(QtCore.Qt.AlignJustify|QtCore.Qt.AlignVCenter) - self.ProgressBar.setFormat(_fromUtf8("")) - self.ProgressBar.setObjectName(_fromUtf8("ProgressBar")) - self.OptionsExpert = QtGui.QFrame(self.Form) + self.ProgressBar.setFormat("") + self.ProgressBar.setObjectName("ProgressBar") + self.OptionsExpert = QtWidgets.QFrame(self.Form) self.OptionsExpert.setGeometry(QtCore.QRect(1, 337, 421, 41)) font = QtGui.QFont() - font.setFamily(_fromUtf8("DejaVu Sans")) + font.setFamily("DejaVu Sans") font.setPointSize(9) self.OptionsExpert.setFont(font) - self.OptionsExpert.setObjectName(_fromUtf8("OptionsExpert")) - self.ColorBox = QtGui.QCheckBox(self.OptionsExpert) + self.OptionsExpert.setObjectName("OptionsExpert") + self.ColorBox = QtWidgets.QCheckBox(self.OptionsExpert) self.ColorBox.setGeometry(QtCore.QRect(9, 11, 130, 18)) font = QtGui.QFont() - font.setFamily(_fromUtf8("DejaVu Sans")) + font.setFamily("DejaVu Sans") self.ColorBox.setFont(font) self.ColorBox.setFocusPolicy(QtCore.Qt.NoFocus) - self.ColorBox.setObjectName(_fromUtf8("ColorBox")) - self.OptionsExpertInternal = QtGui.QFrame(self.OptionsExpert) + self.ColorBox.setObjectName("ColorBox") + self.OptionsExpertInternal = QtWidgets.QFrame(self.OptionsExpert) self.OptionsExpertInternal.setGeometry(QtCore.QRect(105, 0, 295, 40)) font = QtGui.QFont() - font.setFamily(_fromUtf8("DejaVu Sans")) + font.setFamily("DejaVu Sans") self.OptionsExpertInternal.setFont(font) - self.OptionsExpertInternal.setObjectName(_fromUtf8("OptionsExpertInternal")) - self.gridLayout_2 = QtGui.QGridLayout(self.OptionsExpertInternal) - self.gridLayout_2.setObjectName(_fromUtf8("gridLayout_2")) - self.wLabel = QtGui.QLabel(self.OptionsExpertInternal) + self.OptionsExpertInternal.setObjectName("OptionsExpertInternal") + self.gridLayout_2 = QtWidgets.QGridLayout(self.OptionsExpertInternal) + self.gridLayout_2.setObjectName("gridLayout_2") + self.wLabel = QtWidgets.QLabel(self.OptionsExpertInternal) font = QtGui.QFont() - font.setFamily(_fromUtf8("DejaVu Sans")) + font.setFamily("DejaVu Sans") self.wLabel.setFont(font) - self.wLabel.setObjectName(_fromUtf8("wLabel")) + self.wLabel.setObjectName("wLabel") self.gridLayout_2.addWidget(self.wLabel, 0, 0, 1, 1) - self.customWidth = QtGui.QLineEdit(self.OptionsExpertInternal) - sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed) + self.customWidth = QtWidgets.QLineEdit(self.OptionsExpertInternal) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.customWidth.sizePolicy().hasHeightForWidth()) self.customWidth.setSizePolicy(sizePolicy) self.customWidth.setMaximumSize(QtCore.QSize(40, 16777215)) font = QtGui.QFont() - font.setFamily(_fromUtf8("DejaVu Sans")) + font.setFamily("DejaVu Sans") self.customWidth.setFont(font) self.customWidth.setFocusPolicy(QtCore.Qt.ClickFocus) self.customWidth.setAcceptDrops(False) self.customWidth.setMaxLength(4) - self.customWidth.setObjectName(_fromUtf8("customWidth")) + self.customWidth.setObjectName("customWidth") self.gridLayout_2.addWidget(self.customWidth, 0, 1, 1, 1) - self.hLabel = QtGui.QLabel(self.OptionsExpertInternal) + self.hLabel = QtWidgets.QLabel(self.OptionsExpertInternal) font = QtGui.QFont() - font.setFamily(_fromUtf8("DejaVu Sans")) + font.setFamily("DejaVu Sans") self.hLabel.setFont(font) - self.hLabel.setObjectName(_fromUtf8("hLabel")) + self.hLabel.setObjectName("hLabel") self.gridLayout_2.addWidget(self.hLabel, 0, 2, 1, 1) - self.customHeight = QtGui.QLineEdit(self.OptionsExpertInternal) - sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed) + self.customHeight = QtWidgets.QLineEdit(self.OptionsExpertInternal) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.customHeight.sizePolicy().hasHeightForWidth()) self.customHeight.setSizePolicy(sizePolicy) self.customHeight.setMaximumSize(QtCore.QSize(40, 16777215)) font = QtGui.QFont() - font.setFamily(_fromUtf8("DejaVu Sans")) + font.setFamily("DejaVu Sans") self.customHeight.setFont(font) self.customHeight.setFocusPolicy(QtCore.Qt.ClickFocus) self.customHeight.setAcceptDrops(False) self.customHeight.setMaxLength(4) - self.customHeight.setObjectName(_fromUtf8("customHeight")) + self.customHeight.setObjectName("customHeight") self.gridLayout_2.addWidget(self.customHeight, 0, 3, 1, 1) KCC.setCentralWidget(self.Form) - self.statusBar = QtGui.QStatusBar(KCC) + self.statusBar = QtWidgets.QStatusBar(KCC) font = QtGui.QFont() - font.setFamily(_fromUtf8("DejaVu Sans")) + font.setFamily("DejaVu Sans") font.setPointSize(8) self.statusBar.setFont(font) self.statusBar.setSizeGripEnabled(False) - self.statusBar.setObjectName(_fromUtf8("statusBar")) + self.statusBar.setObjectName("statusBar") KCC.setStatusBar(self.statusBar) - self.ActionBasic = QtGui.QAction(KCC) + self.ActionBasic = QtWidgets.QAction(KCC) self.ActionBasic.setCheckable(True) self.ActionBasic.setChecked(False) font = QtGui.QFont() self.ActionBasic.setFont(font) - self.ActionBasic.setObjectName(_fromUtf8("ActionBasic")) - self.ActionAdvanced = QtGui.QAction(KCC) + self.ActionBasic.setObjectName("ActionBasic") + self.ActionAdvanced = QtWidgets.QAction(KCC) self.ActionAdvanced.setCheckable(True) - self.ActionAdvanced.setObjectName(_fromUtf8("ActionAdvanced")) + self.ActionAdvanced.setObjectName("ActionAdvanced") self.retranslateUi(KCC) QtCore.QMetaObject.connectSlotsByName(KCC) @@ -341,51 +327,52 @@ class Ui_KCC(object): KCC.setTabOrder(self.ConvertButton, self.ClearButton) def retranslateUi(self, KCC): - KCC.setWindowTitle(_translate("KCC", "Kindle Comic Converter", None)) - self.ProcessingBox.setToolTip(_translate("KCC", "Disable image optimizations.", None)) - self.ProcessingBox.setText(_translate("KCC", "No optimisation", None)) - self.UpscaleBox.setToolTip(_translate("KCC", "

Unchecked - Nothing
Images smaller than device resolution will not be resized.

Indeterminate - Stretching
Images smaller than device resolution will be resized. Aspect ratio will be not preserved.

Checked - Upscaling
Images smaller than device resolution will be resized. Aspect ratio will be preserved.

", None)) - self.UpscaleBox.setText(_translate("KCC", "Stretch/Upscale", None)) - self.WebtoonBox.setToolTip(_translate("KCC", "

Enable auto-splitting of webtoons like Tower of God or Noblesse.
Pages with a low width, high height and vertical panel flow.

", None)) - self.WebtoonBox.setText(_translate("KCC", "Webtoon mode", None)) - self.NoDitheringBox.setToolTip(_translate("KCC", "

Create PNG files instead JPEG.
Quality increase is not noticeable on most of devices.
Output files might be smaller.
MOBI conversion will be much slower.

", None)) - self.NoDitheringBox.setText(_translate("KCC", "PNG output", None)) - self.BorderBox.setToolTip(_translate("KCC", "

Unchecked - Autodetection
Color of margins fill will be detected automatically.

Indeterminate - White
Margins will be filled with white color.

Checked - Black
Margins will be filled with black color.

", None)) - self.BorderBox.setText(_translate("KCC", "W/B margins", None)) - self.NoRotateBox.setToolTip(_translate("KCC", "

Disable splitting and rotation.

", None)) - self.NoRotateBox.setText(_translate("KCC", "No split/rotate", None)) - self.DeviceBox.setToolTip(_translate("KCC", "Target device.", None)) - self.FormatBox.setToolTip(_translate("KCC", "Output format.", None)) - self.ConvertButton.setText(_translate("KCC", "Convert", None)) - self.DirectoryButton.setText(_translate("KCC", "Add directory", None)) - self.FileButton.setText(_translate("KCC", "Add file", None)) - self.ClearButton.setText(_translate("KCC", "Clear list", None)) - self.MangaBox.setToolTip(_translate("KCC", "Enable right-to-left reading.", None)) - self.MangaBox.setText(_translate("KCC", "Manga mode", None)) + _translate = QtCore.QCoreApplication.translate + KCC.setWindowTitle(_translate("KCC", "Kindle Comic Converter")) + self.ProcessingBox.setToolTip(_translate("KCC", "Disable image optimizations.")) + self.ProcessingBox.setText(_translate("KCC", "No optimisation")) + self.UpscaleBox.setToolTip(_translate("KCC", "

Unchecked - Nothing
Images smaller than device resolution will not be resized.

Indeterminate - Stretching
Images smaller than device resolution will be resized. Aspect ratio will be not preserved.

Checked - Upscaling
Images smaller than device resolution will be resized. Aspect ratio will be preserved.

")) + self.UpscaleBox.setText(_translate("KCC", "Stretch/Upscale")) + self.WebtoonBox.setToolTip(_translate("KCC", "

Enable auto-splitting of webtoons like Tower of God or Noblesse.
Pages with a low width, high height and vertical panel flow.

")) + self.WebtoonBox.setText(_translate("KCC", "Webtoon mode")) + self.NoDitheringBox.setToolTip(_translate("KCC", "

Create PNG files instead JPEG.
Quality increase is not noticeable on most of devices.
Output files might be smaller.
MOBI conversion will be much slower.

")) + self.NoDitheringBox.setText(_translate("KCC", "PNG output")) + self.BorderBox.setToolTip(_translate("KCC", "

Unchecked - Autodetection
Color of margins fill will be detected automatically.

Indeterminate - White
Margins will be filled with white color.

Checked - Black
Margins will be filled with black color.

")) + self.BorderBox.setText(_translate("KCC", "W/B margins")) + self.NoRotateBox.setToolTip(_translate("KCC", "

Disable splitting and rotation.

")) + self.NoRotateBox.setText(_translate("KCC", "No split/rotate")) + self.DeviceBox.setToolTip(_translate("KCC", "Target device.")) + self.FormatBox.setToolTip(_translate("KCC", "Output format.")) + self.ConvertButton.setText(_translate("KCC", "Convert")) + self.DirectoryButton.setText(_translate("KCC", "Add directory")) + self.FileButton.setText(_translate("KCC", "Add file")) + self.ClearButton.setText(_translate("KCC", "Clear list")) + self.MangaBox.setToolTip(_translate("KCC", "Enable right-to-left reading.")) + self.MangaBox.setText(_translate("KCC", "Manga mode")) self.QualityBox.setToolTip(_translate("KCC", "\n" "\n" "

Unchecked - Normal quality mode
Use it when Panel View support is not needed.
- Maximum quality when zoom is not enabled.
- Poor quality when zoom is enabled.
- Lowest file size.

\n" "

Indeterminate - High quality mode
Not zoomed image might be a little blurry.
Smaller images might be forcefully upscaled in this mode.
- Medium/High quality when zoom is not enabled.
- Maximum quality when zoom is enabled.

\n" -"

Checked - Ultra quality mode
Maximum possible quality.
- Maximum quality when zoom is not enabled.
- Maximum quality when zoom is enabled.
- Very high file size.

", None)) - self.QualityBox.setText(_translate("KCC", "High/Ultra quality", None)) - self.RotateBox.setToolTip(_translate("KCC", "

Disable splitting of two-page spreads.
They will be rotated instead.

", None)) - self.RotateBox.setText(_translate("KCC", "Horizontal mode", None)) - self.BasicModeButton.setText(_translate("KCC", "Basic", None)) - self.AdvModeButton.setText(_translate("KCC", "Advanced", None)) - self.GammaLabel.setText(_translate("KCC", "Gamma: Auto", None)) - self.ColorBox.setToolTip(_translate("KCC", "

Don\'t convert images to grayscale.

", None)) - self.ColorBox.setText(_translate("KCC", "Color mode", None)) - self.wLabel.setToolTip(_translate("KCC", "Resolution of target device.", None)) - self.wLabel.setText(_translate("KCC", "Custom width: ", None)) - self.customWidth.setToolTip(_translate("KCC", "Resolution of target device.", None)) - self.customWidth.setInputMask(_translate("KCC", "0000; ", None)) - self.hLabel.setToolTip(_translate("KCC", "Resolution of target device.", None)) - self.hLabel.setText(_translate("KCC", "Custom height: ", None)) - self.customHeight.setToolTip(_translate("KCC", "Resolution of target device.", None)) - self.customHeight.setInputMask(_translate("KCC", "0000; ", None)) - self.ActionBasic.setText(_translate("KCC", "Basic", None)) - self.ActionAdvanced.setText(_translate("KCC", "Advanced", None)) +"

Checked - Ultra quality mode
Maximum possible quality.
- Maximum quality when zoom is not enabled.
- Maximum quality when zoom is enabled.
- Very high file size.

")) + self.QualityBox.setText(_translate("KCC", "High/Ultra quality")) + self.RotateBox.setToolTip(_translate("KCC", "

Disable splitting of two-page spreads.
They will be rotated instead.

")) + self.RotateBox.setText(_translate("KCC", "Horizontal mode")) + self.BasicModeButton.setText(_translate("KCC", "Basic")) + self.AdvModeButton.setText(_translate("KCC", "Advanced")) + self.GammaLabel.setText(_translate("KCC", "Gamma: Auto")) + self.ColorBox.setToolTip(_translate("KCC", "

Don\'t convert images to grayscale.

")) + self.ColorBox.setText(_translate("KCC", "Color mode")) + self.wLabel.setToolTip(_translate("KCC", "Resolution of target device.")) + self.wLabel.setText(_translate("KCC", "Custom width: ")) + self.customWidth.setToolTip(_translate("KCC", "Resolution of target device.")) + self.customWidth.setInputMask(_translate("KCC", "0000")) + self.hLabel.setToolTip(_translate("KCC", "Resolution of target device.")) + self.hLabel.setText(_translate("KCC", "Custom height: ")) + self.customHeight.setToolTip(_translate("KCC", "Resolution of target device.")) + self.customHeight.setInputMask(_translate("KCC", "0000")) + self.ActionBasic.setText(_translate("KCC", "Basic")) + self.ActionAdvanced.setText(_translate("KCC", "Advanced")) -from . import KCC_rc +import KCC_rc diff --git a/kcc/KCC_ui_osx.py b/kcc/KCC_ui_osx.py index e993b68..d6b49a8 100644 --- a/kcc/KCC_ui_osx.py +++ b/kcc/KCC_ui_osx.py @@ -2,30 +2,16 @@ # Form implementation generated from reading ui file 'KCC-OSX.ui' # -# Created: Tue Jan 14 15:50:25 2014 -# by: PyQt4 UI code generator 4.10.3 +# Created: Wed Jan 15 11:34:51 2014 +# by: PyQt5 UI code generator 5.2 # # WARNING! All changes made in this file will be lost! -from PyQt4 import QtCore, QtGui - -try: - _fromUtf8 = QtCore.QString.fromUtf8 -except AttributeError: - def _fromUtf8(s): - return s - -try: - _encoding = QtGui.QApplication.UnicodeUTF8 - def _translate(context, text, disambig): - return QtGui.QApplication.translate(context, text, disambig, _encoding) -except AttributeError: - def _translate(context, text, disambig): - return QtGui.QApplication.translate(context, text, disambig) +from PyQt5 import QtCore, QtGui, QtWidgets class Ui_KCC(object): def setupUi(self, KCC): - KCC.setObjectName(_fromUtf8("KCC")) + KCC.setObjectName("KCC") KCC.resize(420, 397) KCC.setMinimumSize(QtCore.QSize(420, 397)) KCC.setMaximumSize(QtCore.QSize(420, 397)) @@ -33,229 +19,229 @@ class Ui_KCC(object): font.setPointSize(9) KCC.setFont(font) icon = QtGui.QIcon() - icon.addPixmap(QtGui.QPixmap(_fromUtf8(":/Icon/icons/comic2ebook.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off) + icon.addPixmap(QtGui.QPixmap(":/Icon/icons/comic2ebook.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) KCC.setWindowIcon(icon) KCC.setLocale(QtCore.QLocale(QtCore.QLocale.C, QtCore.QLocale.AnyCountry)) - self.Form = QtGui.QWidget(KCC) - self.Form.setObjectName(_fromUtf8("Form")) - self.OptionsAdvanced = QtGui.QFrame(self.Form) + self.Form = QtWidgets.QWidget(KCC) + self.Form.setObjectName("Form") + self.OptionsAdvanced = QtWidgets.QFrame(self.Form) self.OptionsAdvanced.setEnabled(True) self.OptionsAdvanced.setGeometry(QtCore.QRect(4, 253, 421, 61)) font = QtGui.QFont() - font.setFamily(_fromUtf8("Lucida Grande")) + font.setFamily("Lucida Grande") font.setPointSize(9) self.OptionsAdvanced.setFont(font) - self.OptionsAdvanced.setObjectName(_fromUtf8("OptionsAdvanced")) - self.gridLayout = QtGui.QGridLayout(self.OptionsAdvanced) - self.gridLayout.setObjectName(_fromUtf8("gridLayout")) - self.ProcessingBox = QtGui.QCheckBox(self.OptionsAdvanced) + self.OptionsAdvanced.setObjectName("OptionsAdvanced") + self.gridLayout = QtWidgets.QGridLayout(self.OptionsAdvanced) + self.gridLayout.setObjectName("gridLayout") + self.ProcessingBox = QtWidgets.QCheckBox(self.OptionsAdvanced) font = QtGui.QFont() - font.setFamily(_fromUtf8("Lucida Grande")) + font.setFamily("Lucida Grande") font.setPointSize(12) self.ProcessingBox.setFont(font) self.ProcessingBox.setFocusPolicy(QtCore.Qt.NoFocus) - self.ProcessingBox.setObjectName(_fromUtf8("ProcessingBox")) + self.ProcessingBox.setObjectName("ProcessingBox") self.gridLayout.addWidget(self.ProcessingBox, 1, 0, 1, 1) - self.UpscaleBox = QtGui.QCheckBox(self.OptionsAdvanced) + self.UpscaleBox = QtWidgets.QCheckBox(self.OptionsAdvanced) font = QtGui.QFont() - font.setFamily(_fromUtf8("Lucida Grande")) + font.setFamily("Lucida Grande") font.setPointSize(12) self.UpscaleBox.setFont(font) self.UpscaleBox.setFocusPolicy(QtCore.Qt.NoFocus) self.UpscaleBox.setTristate(True) - self.UpscaleBox.setObjectName(_fromUtf8("UpscaleBox")) + self.UpscaleBox.setObjectName("UpscaleBox") self.gridLayout.addWidget(self.UpscaleBox, 1, 1, 1, 1) - self.WebtoonBox = QtGui.QCheckBox(self.OptionsAdvanced) + self.WebtoonBox = QtWidgets.QCheckBox(self.OptionsAdvanced) font = QtGui.QFont() - font.setFamily(_fromUtf8("Lucida Grande")) + font.setFamily("Lucida Grande") font.setPointSize(12) self.WebtoonBox.setFont(font) self.WebtoonBox.setFocusPolicy(QtCore.Qt.NoFocus) - self.WebtoonBox.setObjectName(_fromUtf8("WebtoonBox")) + self.WebtoonBox.setObjectName("WebtoonBox") self.gridLayout.addWidget(self.WebtoonBox, 3, 1, 1, 1) - self.NoDitheringBox = QtGui.QCheckBox(self.OptionsAdvanced) + self.NoDitheringBox = QtWidgets.QCheckBox(self.OptionsAdvanced) font = QtGui.QFont() - font.setFamily(_fromUtf8("Lucida Grande")) + font.setFamily("Lucida Grande") font.setPointSize(12) self.NoDitheringBox.setFont(font) self.NoDitheringBox.setFocusPolicy(QtCore.Qt.NoFocus) - self.NoDitheringBox.setObjectName(_fromUtf8("NoDitheringBox")) + self.NoDitheringBox.setObjectName("NoDitheringBox") self.gridLayout.addWidget(self.NoDitheringBox, 3, 2, 1, 1) - self.BorderBox = QtGui.QCheckBox(self.OptionsAdvanced) + self.BorderBox = QtWidgets.QCheckBox(self.OptionsAdvanced) font = QtGui.QFont() - font.setFamily(_fromUtf8("Lucida Grande")) + font.setFamily("Lucida Grande") font.setPointSize(12) self.BorderBox.setFont(font) self.BorderBox.setFocusPolicy(QtCore.Qt.NoFocus) self.BorderBox.setTristate(True) - self.BorderBox.setObjectName(_fromUtf8("BorderBox")) + self.BorderBox.setObjectName("BorderBox") self.gridLayout.addWidget(self.BorderBox, 3, 0, 1, 1) - self.NoRotateBox = QtGui.QCheckBox(self.OptionsAdvanced) + self.NoRotateBox = QtWidgets.QCheckBox(self.OptionsAdvanced) font = QtGui.QFont() - font.setFamily(_fromUtf8("Lucida Grande")) + font.setFamily("Lucida Grande") font.setPointSize(12) self.NoRotateBox.setFont(font) self.NoRotateBox.setFocusPolicy(QtCore.Qt.NoFocus) - self.NoRotateBox.setObjectName(_fromUtf8("NoRotateBox")) + self.NoRotateBox.setObjectName("NoRotateBox") self.gridLayout.addWidget(self.NoRotateBox, 1, 2, 1, 1) - self.DeviceBox = QtGui.QComboBox(self.Form) + self.DeviceBox = QtWidgets.QComboBox(self.Form) self.DeviceBox.setGeometry(QtCore.QRect(8, 201, 151, 34)) font = QtGui.QFont() - font.setFamily(_fromUtf8("Lucida Grande")) + font.setFamily("Lucida Grande") font.setPointSize(11) self.DeviceBox.setFont(font) self.DeviceBox.setFocusPolicy(QtCore.Qt.NoFocus) - self.DeviceBox.setObjectName(_fromUtf8("DeviceBox")) - self.FormatBox = QtGui.QComboBox(self.Form) + self.DeviceBox.setObjectName("DeviceBox") + self.FormatBox = QtWidgets.QComboBox(self.Form) self.FormatBox.setGeometry(QtCore.QRect(262, 201, 152, 34)) font = QtGui.QFont() - font.setFamily(_fromUtf8("Lucida Grande")) + font.setFamily("Lucida Grande") font.setPointSize(11) self.FormatBox.setFont(font) self.FormatBox.setFocusPolicy(QtCore.Qt.NoFocus) - self.FormatBox.setObjectName(_fromUtf8("FormatBox")) - self.ConvertButton = QtGui.QPushButton(self.Form) + self.FormatBox.setObjectName("FormatBox") + self.ConvertButton = QtWidgets.QPushButton(self.Form) self.ConvertButton.setGeometry(QtCore.QRect(160, 200, 101, 41)) font = QtGui.QFont() - font.setFamily(_fromUtf8("Lucida Grande")) + font.setFamily("Lucida Grande") font.setPointSize(11) font.setBold(True) font.setWeight(75) self.ConvertButton.setFont(font) self.ConvertButton.setFocusPolicy(QtCore.Qt.NoFocus) icon1 = QtGui.QIcon() - icon1.addPixmap(QtGui.QPixmap(_fromUtf8(":/Other/icons/convert.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off) + icon1.addPixmap(QtGui.QPixmap(":/Other/icons/convert.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.ConvertButton.setIcon(icon1) - self.ConvertButton.setObjectName(_fromUtf8("ConvertButton")) - self.DirectoryButton = QtGui.QPushButton(self.Form) + self.ConvertButton.setObjectName("ConvertButton") + self.DirectoryButton = QtWidgets.QPushButton(self.Form) self.DirectoryButton.setGeometry(QtCore.QRect(5, 160, 156, 41)) font = QtGui.QFont() - font.setFamily(_fromUtf8("Lucida Grande")) + font.setFamily("Lucida Grande") font.setPointSize(11) self.DirectoryButton.setFont(font) self.DirectoryButton.setFocusPolicy(QtCore.Qt.NoFocus) icon2 = QtGui.QIcon() - icon2.addPixmap(QtGui.QPixmap(_fromUtf8(":/Other/icons/folder_new.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off) + icon2.addPixmap(QtGui.QPixmap(":/Other/icons/folder_new.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.DirectoryButton.setIcon(icon2) - self.DirectoryButton.setObjectName(_fromUtf8("DirectoryButton")) - self.FileButton = QtGui.QPushButton(self.Form) + self.DirectoryButton.setObjectName("DirectoryButton") + self.FileButton = QtWidgets.QPushButton(self.Form) self.FileButton.setGeometry(QtCore.QRect(260, 160, 157, 41)) font = QtGui.QFont() - font.setFamily(_fromUtf8("Lucida Grande")) + font.setFamily("Lucida Grande") font.setPointSize(11) self.FileButton.setFont(font) self.FileButton.setFocusPolicy(QtCore.Qt.NoFocus) icon3 = QtGui.QIcon() - icon3.addPixmap(QtGui.QPixmap(_fromUtf8(":/Other/icons/document_new.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off) + icon3.addPixmap(QtGui.QPixmap(":/Other/icons/document_new.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.FileButton.setIcon(icon3) - self.FileButton.setObjectName(_fromUtf8("FileButton")) - self.ClearButton = QtGui.QPushButton(self.Form) + self.FileButton.setObjectName("FileButton") + self.ClearButton = QtWidgets.QPushButton(self.Form) self.ClearButton.setGeometry(QtCore.QRect(160, 160, 101, 41)) font = QtGui.QFont() - font.setFamily(_fromUtf8("Lucida Grande")) + font.setFamily("Lucida Grande") font.setPointSize(11) self.ClearButton.setFont(font) self.ClearButton.setFocusPolicy(QtCore.Qt.NoFocus) icon4 = QtGui.QIcon() - icon4.addPixmap(QtGui.QPixmap(_fromUtf8(":/Other/icons/clear.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off) + icon4.addPixmap(QtGui.QPixmap(":/Other/icons/clear.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.ClearButton.setIcon(icon4) - self.ClearButton.setObjectName(_fromUtf8("ClearButton")) - self.OptionsBasic = QtGui.QFrame(self.Form) + self.ClearButton.setObjectName("ClearButton") + self.OptionsBasic = QtWidgets.QFrame(self.Form) self.OptionsBasic.setGeometry(QtCore.QRect(5, 233, 421, 41)) font = QtGui.QFont() - font.setFamily(_fromUtf8("Lucida Grande")) + font.setFamily("Lucida Grande") font.setPointSize(12) self.OptionsBasic.setFont(font) - self.OptionsBasic.setObjectName(_fromUtf8("OptionsBasic")) - self.MangaBox = QtGui.QCheckBox(self.OptionsBasic) + self.OptionsBasic.setObjectName("OptionsBasic") + self.MangaBox = QtWidgets.QCheckBox(self.OptionsBasic) self.MangaBox.setGeometry(QtCore.QRect(9, 10, 130, 18)) font = QtGui.QFont() - font.setFamily(_fromUtf8("Lucida Grande")) + font.setFamily("Lucida Grande") font.setPointSize(12) self.MangaBox.setFont(font) self.MangaBox.setFocusPolicy(QtCore.Qt.NoFocus) - self.MangaBox.setObjectName(_fromUtf8("MangaBox")) - self.QualityBox = QtGui.QCheckBox(self.OptionsBasic) + self.MangaBox.setObjectName("MangaBox") + self.QualityBox = QtWidgets.QCheckBox(self.OptionsBasic) self.QualityBox.setGeometry(QtCore.QRect(282, 10, 135, 18)) font = QtGui.QFont() - font.setFamily(_fromUtf8("Lucida Grande")) + font.setFamily("Lucida Grande") font.setPointSize(12) self.QualityBox.setFont(font) self.QualityBox.setFocusPolicy(QtCore.Qt.NoFocus) self.QualityBox.setTristate(True) - self.QualityBox.setObjectName(_fromUtf8("QualityBox")) - self.RotateBox = QtGui.QCheckBox(self.OptionsBasic) + self.QualityBox.setObjectName("QualityBox") + self.RotateBox = QtWidgets.QCheckBox(self.OptionsBasic) self.RotateBox.setGeometry(QtCore.QRect(145, 10, 130, 18)) font = QtGui.QFont() - font.setFamily(_fromUtf8("Lucida Grande")) + font.setFamily("Lucida Grande") font.setPointSize(12) self.RotateBox.setFont(font) self.RotateBox.setFocusPolicy(QtCore.Qt.NoFocus) - self.RotateBox.setObjectName(_fromUtf8("RotateBox")) - self.JobList = QtGui.QListWidget(self.Form) + self.RotateBox.setObjectName("RotateBox") + self.JobList = QtWidgets.QListWidget(self.Form) self.JobList.setGeometry(QtCore.QRect(10, 50, 401, 101)) font = QtGui.QFont() - font.setFamily(_fromUtf8("Lucida Grande")) + font.setFamily("Lucida Grande") font.setPointSize(11) self.JobList.setFont(font) self.JobList.setFocusPolicy(QtCore.Qt.NoFocus) - self.JobList.setStyleSheet(_fromUtf8("QListWidget#JobList {background:#ffffff;background-image:url(:/Other/icons/list_background.png);background-position:center center;background-repeat:no-repeat;}QScrollBar:vertical{border:1px solid #999;background:#FFF;width:5px;margin:0}QScrollBar::handle:vertical{background:DarkGray;min-height:0}QScrollBar::add-line:vertical{height:0;background:DarkGray;subcontrol-position:bottom;subcontrol-origin:margin}QScrollBar::sub-line:vertical{height:0;background:DarkGray;subcontrol-position:top;subcontrol-origin:margin}QScrollBar:horizontal{border:1px solid #999;background:#FFF;height:5px;margin:0}QScrollBar::handle:horizontal{background:DarkGray;min-width:0}QScrollBar::add-line:horizontal{width:0;background:DarkGray;subcontrol-position:bottom;subcontrol-origin:margin}QScrollBar::sub-line:horizontal{width:0;background:DarkGray;subcontrol-position:top;subcontrol-origin:margin}")) + self.JobList.setStyleSheet("QListWidget#JobList {background:#ffffff;background-image:url(:/Other/icons/list_background.png);background-position:center center;background-repeat:no-repeat;}QScrollBar:vertical{border:1px solid #999;background:#FFF;width:5px;margin:0}QScrollBar::handle:vertical{background:DarkGray;min-height:0}QScrollBar::add-line:vertical{height:0;background:DarkGray;subcontrol-position:bottom;subcontrol-origin:margin}QScrollBar::sub-line:vertical{height:0;background:DarkGray;subcontrol-position:top;subcontrol-origin:margin}QScrollBar:horizontal{border:1px solid #999;background:#FFF;height:5px;margin:0}QScrollBar::handle:horizontal{background:DarkGray;min-width:0}QScrollBar::add-line:horizontal{width:0;background:DarkGray;subcontrol-position:bottom;subcontrol-origin:margin}QScrollBar::sub-line:horizontal{width:0;background:DarkGray;subcontrol-position:top;subcontrol-origin:margin}") self.JobList.setProperty("showDropIndicator", False) - self.JobList.setSelectionMode(QtGui.QAbstractItemView.NoSelection) - self.JobList.setVerticalScrollMode(QtGui.QAbstractItemView.ScrollPerPixel) - self.JobList.setHorizontalScrollMode(QtGui.QAbstractItemView.ScrollPerPixel) - self.JobList.setObjectName(_fromUtf8("JobList")) - self.BasicModeButton = QtGui.QPushButton(self.Form) + self.JobList.setSelectionMode(QtWidgets.QAbstractItemView.NoSelection) + self.JobList.setVerticalScrollMode(QtWidgets.QAbstractItemView.ScrollPerPixel) + self.JobList.setHorizontalScrollMode(QtWidgets.QAbstractItemView.ScrollPerPixel) + self.JobList.setObjectName("JobList") + self.BasicModeButton = QtWidgets.QPushButton(self.Form) self.BasicModeButton.setGeometry(QtCore.QRect(5, 10, 210, 41)) font = QtGui.QFont() - font.setFamily(_fromUtf8("Lucida Grande")) + font.setFamily("Lucida Grande") font.setPointSize(12) font.setBold(False) font.setWeight(50) self.BasicModeButton.setFont(font) self.BasicModeButton.setFocusPolicy(QtCore.Qt.NoFocus) - self.BasicModeButton.setObjectName(_fromUtf8("BasicModeButton")) - self.AdvModeButton = QtGui.QPushButton(self.Form) + self.BasicModeButton.setObjectName("BasicModeButton") + self.AdvModeButton = QtWidgets.QPushButton(self.Form) self.AdvModeButton.setGeometry(QtCore.QRect(207, 10, 210, 41)) font = QtGui.QFont() - font.setFamily(_fromUtf8("Lucida Grande")) + font.setFamily("Lucida Grande") font.setPointSize(12) font.setBold(False) font.setWeight(50) self.AdvModeButton.setFont(font) self.AdvModeButton.setFocusPolicy(QtCore.Qt.NoFocus) - self.AdvModeButton.setObjectName(_fromUtf8("AdvModeButton")) - self.OptionsAdvancedGamma = QtGui.QFrame(self.Form) + self.AdvModeButton.setObjectName("AdvModeButton") + self.OptionsAdvancedGamma = QtWidgets.QFrame(self.Form) self.OptionsAdvancedGamma.setEnabled(True) self.OptionsAdvancedGamma.setGeometry(QtCore.QRect(5, 303, 401, 41)) font = QtGui.QFont() - font.setFamily(_fromUtf8("Lucida Grande")) + font.setFamily("Lucida Grande") font.setPointSize(9) self.OptionsAdvancedGamma.setFont(font) - self.OptionsAdvancedGamma.setObjectName(_fromUtf8("OptionsAdvancedGamma")) - self.GammaLabel = QtGui.QLabel(self.OptionsAdvancedGamma) + self.OptionsAdvancedGamma.setObjectName("OptionsAdvancedGamma") + self.GammaLabel = QtWidgets.QLabel(self.OptionsAdvancedGamma) self.GammaLabel.setGeometry(QtCore.QRect(20, 0, 100, 40)) font = QtGui.QFont() - font.setFamily(_fromUtf8("Lucida Grande")) + font.setFamily("Lucida Grande") font.setPointSize(12) font.setBold(False) font.setWeight(50) self.GammaLabel.setFont(font) - self.GammaLabel.setObjectName(_fromUtf8("GammaLabel")) - self.GammaSlider = QtGui.QSlider(self.OptionsAdvancedGamma) + self.GammaLabel.setObjectName("GammaLabel") + self.GammaSlider = QtWidgets.QSlider(self.OptionsAdvancedGamma) self.GammaSlider.setGeometry(QtCore.QRect(110, 10, 290, 22)) font = QtGui.QFont() - font.setFamily(_fromUtf8("Lucida Grande")) + font.setFamily("Lucida Grande") self.GammaSlider.setFont(font) self.GammaSlider.setFocusPolicy(QtCore.Qt.ClickFocus) self.GammaSlider.setMaximum(500) self.GammaSlider.setSingleStep(5) self.GammaSlider.setOrientation(QtCore.Qt.Horizontal) - self.GammaSlider.setObjectName(_fromUtf8("GammaSlider")) - self.ProgressBar = QtGui.QProgressBar(self.Form) + self.GammaSlider.setObjectName("GammaSlider") + self.ProgressBar = QtWidgets.QProgressBar(self.Form) self.ProgressBar.setGeometry(QtCore.QRect(10, 10, 401, 35)) font = QtGui.QFont() - font.setFamily(_fromUtf8("Lucida Grande")) + font.setFamily("Lucida Grande") font.setPointSize(10) font.setBold(True) font.setWeight(75) @@ -263,100 +249,100 @@ class Ui_KCC(object): self.ProgressBar.setAutoFillBackground(True) self.ProgressBar.setProperty("value", 0) self.ProgressBar.setAlignment(QtCore.Qt.AlignJustify|QtCore.Qt.AlignVCenter) - self.ProgressBar.setFormat(_fromUtf8("")) - self.ProgressBar.setObjectName(_fromUtf8("ProgressBar")) - self.OptionsExpert = QtGui.QFrame(self.Form) + self.ProgressBar.setFormat("") + self.ProgressBar.setObjectName("ProgressBar") + self.OptionsExpert = QtWidgets.QFrame(self.Form) self.OptionsExpert.setGeometry(QtCore.QRect(5, 335, 421, 41)) font = QtGui.QFont() - font.setFamily(_fromUtf8("Lucida Grande")) + font.setFamily("Lucida Grande") font.setPointSize(9) self.OptionsExpert.setFont(font) - self.OptionsExpert.setObjectName(_fromUtf8("OptionsExpert")) - self.ColorBox = QtGui.QCheckBox(self.OptionsExpert) + self.OptionsExpert.setObjectName("OptionsExpert") + self.ColorBox = QtWidgets.QCheckBox(self.OptionsExpert) self.ColorBox.setGeometry(QtCore.QRect(9, 11, 130, 18)) font = QtGui.QFont() - font.setFamily(_fromUtf8("Lucida Grande")) + font.setFamily("Lucida Grande") font.setPointSize(12) self.ColorBox.setFont(font) self.ColorBox.setFocusPolicy(QtCore.Qt.NoFocus) - self.ColorBox.setObjectName(_fromUtf8("ColorBox")) - self.OptionsExpertInternal = QtGui.QFrame(self.OptionsExpert) + self.ColorBox.setObjectName("ColorBox") + self.OptionsExpertInternal = QtWidgets.QFrame(self.OptionsExpert) self.OptionsExpertInternal.setGeometry(QtCore.QRect(95, 0, 315, 40)) font = QtGui.QFont() - font.setFamily(_fromUtf8("Lucida Grande")) + font.setFamily("Lucida Grande") self.OptionsExpertInternal.setFont(font) - self.OptionsExpertInternal.setObjectName(_fromUtf8("OptionsExpertInternal")) - self.gridLayout_2 = QtGui.QGridLayout(self.OptionsExpertInternal) - self.gridLayout_2.setObjectName(_fromUtf8("gridLayout_2")) - self.wLabel = QtGui.QLabel(self.OptionsExpertInternal) + self.OptionsExpertInternal.setObjectName("OptionsExpertInternal") + self.gridLayout_2 = QtWidgets.QGridLayout(self.OptionsExpertInternal) + self.gridLayout_2.setObjectName("gridLayout_2") + self.wLabel = QtWidgets.QLabel(self.OptionsExpertInternal) font = QtGui.QFont() - font.setFamily(_fromUtf8("Lucida Grande")) + font.setFamily("Lucida Grande") font.setPointSize(12) font.setBold(False) font.setWeight(50) self.wLabel.setFont(font) - self.wLabel.setObjectName(_fromUtf8("wLabel")) + self.wLabel.setObjectName("wLabel") self.gridLayout_2.addWidget(self.wLabel, 0, 0, 1, 1) - self.customWidth = QtGui.QLineEdit(self.OptionsExpertInternal) - sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed) + self.customWidth = QtWidgets.QLineEdit(self.OptionsExpertInternal) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.customWidth.sizePolicy().hasHeightForWidth()) self.customWidth.setSizePolicy(sizePolicy) self.customWidth.setMaximumSize(QtCore.QSize(45, 16777215)) font = QtGui.QFont() - font.setFamily(_fromUtf8("Lucida Grande")) + font.setFamily("Lucida Grande") font.setPointSize(12) self.customWidth.setFont(font) self.customWidth.setFocusPolicy(QtCore.Qt.ClickFocus) self.customWidth.setAcceptDrops(False) self.customWidth.setMaxLength(4) - self.customWidth.setObjectName(_fromUtf8("customWidth")) + self.customWidth.setObjectName("customWidth") self.gridLayout_2.addWidget(self.customWidth, 0, 1, 1, 1) - self.hLabel = QtGui.QLabel(self.OptionsExpertInternal) + self.hLabel = QtWidgets.QLabel(self.OptionsExpertInternal) font = QtGui.QFont() - font.setFamily(_fromUtf8("Lucida Grande")) + font.setFamily("Lucida Grande") font.setPointSize(12) font.setBold(False) font.setWeight(50) self.hLabel.setFont(font) - self.hLabel.setObjectName(_fromUtf8("hLabel")) + self.hLabel.setObjectName("hLabel") self.gridLayout_2.addWidget(self.hLabel, 0, 2, 1, 1) - self.customHeight = QtGui.QLineEdit(self.OptionsExpertInternal) - sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Fixed) + self.customHeight = QtWidgets.QLineEdit(self.OptionsExpertInternal) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.customHeight.sizePolicy().hasHeightForWidth()) self.customHeight.setSizePolicy(sizePolicy) self.customHeight.setMaximumSize(QtCore.QSize(45, 16777215)) font = QtGui.QFont() - font.setFamily(_fromUtf8("Lucida Grande")) + font.setFamily("Lucida Grande") font.setPointSize(12) self.customHeight.setFont(font) self.customHeight.setFocusPolicy(QtCore.Qt.ClickFocus) self.customHeight.setAcceptDrops(False) self.customHeight.setMaxLength(4) - self.customHeight.setObjectName(_fromUtf8("customHeight")) + self.customHeight.setObjectName("customHeight") self.gridLayout_2.addWidget(self.customHeight, 0, 3, 1, 1) KCC.setCentralWidget(self.Form) - self.statusBar = QtGui.QStatusBar(KCC) + self.statusBar = QtWidgets.QStatusBar(KCC) font = QtGui.QFont() - font.setFamily(_fromUtf8("Aharoni")) + font.setFamily("Aharoni") font.setPointSize(8) self.statusBar.setFont(font) self.statusBar.setSizeGripEnabled(False) - self.statusBar.setObjectName(_fromUtf8("statusBar")) + self.statusBar.setObjectName("statusBar") KCC.setStatusBar(self.statusBar) - self.ActionBasic = QtGui.QAction(KCC) + self.ActionBasic = QtWidgets.QAction(KCC) self.ActionBasic.setCheckable(True) self.ActionBasic.setChecked(False) font = QtGui.QFont() font.setPointSize(9) self.ActionBasic.setFont(font) - self.ActionBasic.setObjectName(_fromUtf8("ActionBasic")) - self.ActionAdvanced = QtGui.QAction(KCC) + self.ActionBasic.setObjectName("ActionBasic") + self.ActionAdvanced = QtWidgets.QAction(KCC) self.ActionAdvanced.setCheckable(True) - self.ActionAdvanced.setObjectName(_fromUtf8("ActionAdvanced")) + self.ActionAdvanced.setObjectName("ActionAdvanced") self.retranslateUi(KCC) QtCore.QMetaObject.connectSlotsByName(KCC) @@ -365,45 +351,46 @@ class Ui_KCC(object): KCC.setTabOrder(self.ConvertButton, self.ClearButton) def retranslateUi(self, KCC): - KCC.setWindowTitle(_translate("KCC", "Kindle Comic Converter", None)) - self.ProcessingBox.setToolTip(_translate("KCC", "

Disable image optimizations.

", None)) - self.ProcessingBox.setText(_translate("KCC", "No optimisation", None)) - self.UpscaleBox.setToolTip(_translate("KCC", "

Unchecked - Nothing
Images smaller than device resolution will not be resized.

Indeterminate - Stretching
Images smaller than device resolution will be resized. Aspect ratio will be not preserved.

Checked - Upscaling
Images smaller than device resolution will be resized. Aspect ratio will be preserved.

", None)) - self.UpscaleBox.setText(_translate("KCC", "Stretch/Upscale", None)) - self.WebtoonBox.setToolTip(_translate("KCC", "

Enable auto-splitting of webtoons like Tower of God or Noblesse.
Pages with a low width, high height and vertical panel flow.

", None)) - self.WebtoonBox.setText(_translate("KCC", "Webtoon mode", None)) - self.NoDitheringBox.setToolTip(_translate("KCC", "

Create PNG files instead JPEG.
Quality increase is not noticeable on most of devices.
Output files
might be smaller.
MOBI conversion will be much slower.

", None)) - self.NoDitheringBox.setText(_translate("KCC", "PNG output", None)) - self.BorderBox.setToolTip(_translate("KCC", "

Unchecked - Autodetection
Color of margins fill will be detected automatically.

Indeterminate - White
Margins will be filled with white color.

Checked - Black
Margins will be filled with black color.

", None)) - self.BorderBox.setText(_translate("KCC", "W/B margins", None)) - self.NoRotateBox.setToolTip(_translate("KCC", "

Disable splitting and rotation.

", None)) - self.NoRotateBox.setText(_translate("KCC", "No split/rotate", None)) - self.DeviceBox.setToolTip(_translate("KCC", "

Target device.

", None)) - self.FormatBox.setToolTip(_translate("KCC", "

Output format.

", None)) - self.ConvertButton.setText(_translate("KCC", "Convert", None)) - self.DirectoryButton.setText(_translate("KCC", "Add directory", None)) - self.FileButton.setText(_translate("KCC", "Add file", None)) - self.ClearButton.setText(_translate("KCC", "Clear list", None)) - self.MangaBox.setToolTip(_translate("KCC", "

Enable right-to-left reading.

", None)) - self.MangaBox.setText(_translate("KCC", "Manga mode", None)) - self.QualityBox.setToolTip(_translate("KCC", "

Unchecked - Normal quality mode
Use it when Panel View support is not needed.
- Maximum quality when zoom is not enabled.
- Poor quality when zoom is enabled.
- Lowest file size.

Indeterminate - High quality mode
Not zoomed image might be a little blurry.
Smaller images might be forcefully upscaled in this mode.

- Medium/High quality when zoom is not enabled.
- Maximum quality when zoom is enabled.

Checked - Ultra quality mode
Maximum possible quality.
- Maximum quality when zoom is not enabled.
- Maximum quality when zoom is enabled.
- Very high file size.

", None)) - self.QualityBox.setText(_translate("KCC", "High/Ultra quality", None)) - self.RotateBox.setToolTip(_translate("KCC", "

Disable splitting of two-page spreads.
They will be rotated instead.

", None)) - self.RotateBox.setText(_translate("KCC", "Horizontal mode", None)) - self.BasicModeButton.setText(_translate("KCC", "Basic", None)) - self.AdvModeButton.setText(_translate("KCC", "Advanced", None)) - self.GammaLabel.setText(_translate("KCC", "Gamma: Auto", None)) - self.ColorBox.setToolTip(_translate("KCC", "

Don\'t convert images to grayscale.

", None)) - self.ColorBox.setText(_translate("KCC", "Color mode", None)) - self.wLabel.setToolTip(_translate("KCC", "

Resolution of target device.

", None)) - self.wLabel.setText(_translate("KCC", "Custom width: ", None)) - self.customWidth.setToolTip(_translate("KCC", "

Resolution of target device.

", None)) - self.customWidth.setInputMask(_translate("KCC", "0000; ", None)) - self.hLabel.setToolTip(_translate("KCC", "

Resolution of target device.

", None)) - self.hLabel.setText(_translate("KCC", "Custom height: ", None)) - self.customHeight.setToolTip(_translate("KCC", "

Resolution of target device.

", None)) - self.customHeight.setInputMask(_translate("KCC", "0000; ", None)) - self.ActionBasic.setText(_translate("KCC", "Basic", None)) - self.ActionAdvanced.setText(_translate("KCC", "Advanced", None)) + _translate = QtCore.QCoreApplication.translate + KCC.setWindowTitle(_translate("KCC", "Kindle Comic Converter")) + self.ProcessingBox.setToolTip(_translate("KCC", "

Disable image optimizations.

")) + self.ProcessingBox.setText(_translate("KCC", "No optimisation")) + self.UpscaleBox.setToolTip(_translate("KCC", "

Unchecked - Nothing
Images smaller than device resolution will not be resized.

Indeterminate - Stretching
Images smaller than device resolution will be resized. Aspect ratio will be not preserved.

Checked - Upscaling
Images smaller than device resolution will be resized. Aspect ratio will be preserved.

")) + self.UpscaleBox.setText(_translate("KCC", "Stretch/Upscale")) + self.WebtoonBox.setToolTip(_translate("KCC", "

Enable auto-splitting of webtoons like Tower of God or Noblesse.
Pages with a low width, high height and vertical panel flow.

")) + self.WebtoonBox.setText(_translate("KCC", "Webtoon mode")) + self.NoDitheringBox.setToolTip(_translate("KCC", "

Create PNG files instead JPEG.
Quality increase is not noticeable on most of devices.
Output files
might be smaller.
MOBI conversion will be much slower.

")) + self.NoDitheringBox.setText(_translate("KCC", "PNG output")) + self.BorderBox.setToolTip(_translate("KCC", "

Unchecked - Autodetection
Color of margins fill will be detected automatically.

Indeterminate - White
Margins will be filled with white color.

Checked - Black
Margins will be filled with black color.

")) + self.BorderBox.setText(_translate("KCC", "W/B margins")) + self.NoRotateBox.setToolTip(_translate("KCC", "

Disable splitting and rotation.

")) + self.NoRotateBox.setText(_translate("KCC", "No split/rotate")) + self.DeviceBox.setToolTip(_translate("KCC", "

Target device.

")) + self.FormatBox.setToolTip(_translate("KCC", "

Output format.

")) + self.ConvertButton.setText(_translate("KCC", "Convert")) + self.DirectoryButton.setText(_translate("KCC", "Add directory")) + self.FileButton.setText(_translate("KCC", "Add file")) + self.ClearButton.setText(_translate("KCC", "Clear list")) + self.MangaBox.setToolTip(_translate("KCC", "

Enable right-to-left reading.

")) + self.MangaBox.setText(_translate("KCC", "Manga mode")) + self.QualityBox.setToolTip(_translate("KCC", "

Unchecked - Normal quality mode
Use it when Panel View support is not needed.
- Maximum quality when zoom is not enabled.
- Poor quality when zoom is enabled.
- Lowest file size.

Indeterminate - High quality mode
Not zoomed image might be a little blurry.
Smaller images might be forcefully upscaled in this mode.

- Medium/High quality when zoom is not enabled.
- Maximum quality when zoom is enabled.

Checked - Ultra quality mode
Maximum possible quality.
- Maximum quality when zoom is not enabled.
- Maximum quality when zoom is enabled.
- Very high file size.

")) + self.QualityBox.setText(_translate("KCC", "High/Ultra quality")) + self.RotateBox.setToolTip(_translate("KCC", "

Disable splitting of two-page spreads.
They will be rotated instead.

")) + self.RotateBox.setText(_translate("KCC", "Horizontal mode")) + self.BasicModeButton.setText(_translate("KCC", "Basic")) + self.AdvModeButton.setText(_translate("KCC", "Advanced")) + self.GammaLabel.setText(_translate("KCC", "Gamma: Auto")) + self.ColorBox.setToolTip(_translate("KCC", "

Don\'t convert images to grayscale.

")) + self.ColorBox.setText(_translate("KCC", "Color mode")) + self.wLabel.setToolTip(_translate("KCC", "

Resolution of target device.

")) + self.wLabel.setText(_translate("KCC", "Custom width: ")) + self.customWidth.setToolTip(_translate("KCC", "

Resolution of target device.

")) + self.customWidth.setInputMask(_translate("KCC", "0000")) + self.hLabel.setToolTip(_translate("KCC", "

Resolution of target device.

")) + self.hLabel.setText(_translate("KCC", "Custom height: ")) + self.customHeight.setToolTip(_translate("KCC", "

Resolution of target device.

")) + self.customHeight.setInputMask(_translate("KCC", "0000")) + self.ActionBasic.setText(_translate("KCC", "Basic")) + self.ActionAdvanced.setText(_translate("KCC", "Advanced")) -from . import KCC_rc +import KCC_rc diff --git a/kcc/comic2ebook.py b/kcc/comic2ebook.py index ba9025b..0a154de 100755 --- a/kcc/comic2ebook.py +++ b/kcc/comic2ebook.py @@ -363,7 +363,7 @@ def dirImgProcess(path): pagenumber += 1 work.append([afile, dirpath, options]) if GUI: - GUI.emit(QtCore.SIGNAL("progressBarTick"), pagenumber) + GUI.progressBarTick.emit(pagenumber, False) if len(work) > 0: for i in work: workerPool.apply_async(func=fileImgProcess, args=(i, ), callback=fileImgProcess_tick) @@ -385,7 +385,7 @@ def fileImgProcess_tick(output): workerOutput.append(output) workerPool.terminate() if GUI: - GUI.emit(QtCore.SIGNAL("progressBarTick")) + GUI.progressBarTick.emit(False, False) if not GUI.conversionAlive: workerPool.terminate() @@ -813,11 +813,11 @@ def preSplitDirectory(path): if filesNumber > 0: print('\nWARNING: Automatic output splitting failed.') if GUI: - GUI.emit(QtCore.SIGNAL("addMessage"), 'Automatic output splitting failed. ' - 'More details.', 'warning') - GUI.emit(QtCore.SIGNAL("addMessage"), '') + GUI.progressBarTick.emit('Automatic output splitting failed. ' + 'More details.', 'warning', False) + GUI.progressBarTick.emit('', False, False) return [path] detectedSubSubdirectories = False detectedFilesInSubdirectories = False @@ -828,11 +828,11 @@ def preSplitDirectory(path): elif len(dirs) == 0 and detectedSubSubdirectories: print('\nWARNING: Automatic output splitting failed.') if GUI: - GUI.emit(QtCore.SIGNAL("addMessage"), 'Automatic output splitting failed. ' - 'More details.', 'warning') - GUI.emit(QtCore.SIGNAL("addMessage"), '') + GUI.progressBarTick.emit('Automatic output splitting failed. ' + 'More details.', 'warning', False) + GUI.progressBarTick.emit('', False, False) return [path] if len(files) != 0: detectedFilesInSubdirectories = True @@ -845,11 +845,11 @@ def preSplitDirectory(path): if detectedFilesInSubdirectories and detectedSubSubdirectories: print('\nWARNING: Automatic output splitting failed.') if GUI: - GUI.emit(QtCore.SIGNAL("addMessage"), 'Automatic output splitting failed. ' - 'More details.', 'warning') - GUI.emit(QtCore.SIGNAL("addMessage"), '') + GUI.progressBarTick.emit('Automatic output splitting failed. ' + 'More details.', 'warning', False) + GUI.progressBarTick.emit('', False, False) return [path] # Split directories split = splitDirectory(os.path.join(path, 'OEBPS', 'Images'), mode) @@ -876,7 +876,7 @@ def detectCorruption(tmpPath, orgPath): img.verify() img = Image.open(path) img.load() - except: + except Exception: rmtree(os.path.join(tmpPath, '..', '..'), True) raise RuntimeError('Image file %s is corrupted.' % pathOrg) @@ -969,7 +969,7 @@ def main(argv=None, qtGUI=None): checkOptions() if qtGUI: GUI = qtGUI - GUI.emit(QtCore.SIGNAL("progressBarTick"), 1) + GUI.progressBarTick.emit(1, False) else: GUI = None if len(args) != 1: @@ -986,10 +986,10 @@ def main(argv=None, qtGUI=None): if options.imgproc: print("\nProcessing images...") if GUI: - GUI.emit(QtCore.SIGNAL("progressBarTick"), 'status', 'Processing images') + GUI.progressBarTick.emit('status', 'Processing images') dirImgProcess(path + "/OEBPS/Images/") if GUI: - GUI.emit(QtCore.SIGNAL("progressBarTick"), 1) + GUI.progressBarTick.emit(1, False) sanitizeTree(os.path.join(path, 'OEBPS', 'Images')) if options.batchsplit: tomes = preSplitDirectory(path) @@ -999,11 +999,11 @@ def main(argv=None, qtGUI=None): tomeNumber = 0 if GUI: if options.cbzoutput: - GUI.emit(QtCore.SIGNAL("progressBarTick"), 'status', 'Compressing CBZ files') + GUI.progressBarTick.emit('status', 'Compressing CBZ files') else: - GUI.emit(QtCore.SIGNAL("progressBarTick"), 'status', 'Compressing EPUB files') - GUI.emit(QtCore.SIGNAL("progressBarTick"), len(tomes) + 1) - GUI.emit(QtCore.SIGNAL("progressBarTick")) + GUI.progressBarTick.emit('status', 'Compressing EPUB files') + GUI.progressBarTick.emit(len(tomes) + 1, False) + GUI.progressBarTick.emit(False, False) options.baseTitle = options.title for tome in tomes: if len(tomes) > 1: @@ -1029,7 +1029,7 @@ def main(argv=None, qtGUI=None): move(tome + '_comic.zip', filepath[-1]) rmtree(tome, True) if GUI: - GUI.emit(QtCore.SIGNAL("progressBarTick")) + GUI.progressBarTick.emit(False, False) return filepath diff --git a/kcc/comic2panel.py b/kcc/comic2panel.py index 5994b3e..3c4cdd3 100644 --- a/kcc/comic2panel.py +++ b/kcc/comic2panel.py @@ -84,7 +84,7 @@ def mergeDirectory_tick(output): mergeWorkerOutput.append(output) mergeWorkerPool.terminate() if GUI: - GUI.emit(QtCore.SIGNAL("progressBarTick")) + GUI.progressBarTick.emit(False, False) if not GUI.conversionAlive: mergeWorkerPool.terminate() @@ -152,7 +152,7 @@ def splitImage_tick(output): splitWorkerOutput.append(output) splitWorkerPool.terminate() if GUI: - GUI.emit(QtCore.SIGNAL("progressBarTick")) + GUI.progressBarTick.emit(False, False) if not GUI.conversionAlive: splitWorkerPool.terminate() @@ -298,8 +298,8 @@ def main(argv=None, qtGUI=None): directoryNumer += 1 mergeWork.append([os.path.join(root, directory)]) if GUI: - GUI.emit(QtCore.SIGNAL("progressBarTick"), 'status', 'Combining images') - GUI.emit(QtCore.SIGNAL("progressBarTick"), directoryNumer) + GUI.progressBarTick.emit('status', 'Combining images') + GUI.progressBarTick.emit(directoryNumer, False) for i in mergeWork: mergeWorkerPool.apply_async(func=mergeDirectory, args=(i, ), callback=mergeDirectory_tick) mergeWorkerPool.close() @@ -318,9 +318,9 @@ def main(argv=None, qtGUI=None): else: os.remove(os.path.join(root, name)) if GUI: - GUI.emit(QtCore.SIGNAL("progressBarTick"), 'status', 'Splitting images') - GUI.emit(QtCore.SIGNAL("progressBarTick"), pagenumber) - GUI.emit(QtCore.SIGNAL("progressBarTick")) + GUI.progressBarTick.emit('status', 'Splitting images') + GUI.progressBarTick.emit(pagenumber, False) + GUI.progressBarTick.emit(False, False) if len(work) > 0: for i in work: splitWorkerPool.apply_async(func=splitImage, args=(i, ), callback=splitImage_tick) From cf3df581e1f1e9277eac1507b2fefeef304b038d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Jastrz=C4=99bski?= Date: Wed, 15 Jan 2014 14:58:45 +0100 Subject: [PATCH 07/50] Moved dependiences check out of module --- kcc-c2e.py | 28 ++++++++++++++++++++++++++++ kcc-c2p.py | 18 ++++++++++++++++++ kcc.py | 41 +++++++++++++++++++++++++++++++---------- kcc/KCC_gui.py | 22 +++++----------------- kcc/cbxarchive.py | 16 ++-------------- kcc/comic2ebook.py | 22 +--------------------- kcc/comic2panel.py | 22 +--------------------- kcc/image.py | 23 +---------------------- requirements.txt | 4 ---- 9 files changed, 87 insertions(+), 109 deletions(-) delete mode 100644 requirements.txt diff --git a/kcc-c2e.py b/kcc-c2e.py index cfd6766..76dcf81 100644 --- a/kcc-c2e.py +++ b/kcc-c2e.py @@ -23,6 +23,34 @@ __license__ = 'ISC' __copyright__ = '2012-2013, Ciro Mattia Gonano , Pawel Jastrzebski ' __docformat__ = 'restructuredtext en' +# Dependiences check +missing = [] +try: + # noinspection PyUnresolvedReferences + from psutil import TOTAL_PHYMEM, Popen +except ImportError: + missing.append('psutil') +try: + # noinspection PyUnresolvedReferences + from slugify import slugify +except ImportError: + missing.append('python-slugify') +try: + # noinspection PyUnresolvedReferences + from PIL import Image, ImageOps, ImageStat, ImageChops + if tuple(map(int, ('2.3.0'.split(".")))) > tuple(map(int, (Image.PILLOW_VERSION.split(".")))): + missing.append('Pillow 2.3.0+') +except ImportError: + missing.append('Pillow 2.3.0+') +if len(missing) > 0: + print('ERROR: ' + ', '.join(missing) + ' is not installed!') + import tkinter + import tkinter.messagebox + importRoot = tkinter.Tk() + importRoot.withdraw() + tkinter.messagebox.showerror('KCC - Error', 'ERROR: ' + ', '.join(missing) + ' is not installed!') + exit(1) + import sys from multiprocessing import freeze_support from kcc.comic2ebook import main, Copyright diff --git a/kcc-c2p.py b/kcc-c2p.py index d112569..a8463d4 100644 --- a/kcc-c2p.py +++ b/kcc-c2p.py @@ -23,6 +23,24 @@ __license__ = 'ISC' __copyright__ = '2012-2013, Ciro Mattia Gonano , Pawel Jastrzebski ' __docformat__ = 'restructuredtext en' +# Dependiences check +missing = [] +try: + # noinspection PyUnresolvedReferences + from PIL import Image, ImageOps, ImageStat, ImageChops + if tuple(map(int, ('2.3.0'.split(".")))) > tuple(map(int, (Image.PILLOW_VERSION.split(".")))): + missing.append('Pillow 2.3.0+') +except ImportError: + missing.append('Pillow 2.3.0+') +if len(missing) > 0: + print('ERROR: ' + ', '.join(missing) + ' is not installed!') + import tkinter + import tkinter.messagebox + importRoot = tkinter.Tk() + importRoot.withdraw() + tkinter.messagebox.showerror('KCC - Error', 'ERROR: ' + ', '.join(missing) + ' is not installed!') + exit(1) + import sys from multiprocessing import freeze_support from kcc.comic2panel import main, Copyright diff --git a/kcc.py b/kcc.py index 2f06a09..ba23c4d 100644 --- a/kcc.py +++ b/kcc.py @@ -23,22 +23,43 @@ __license__ = 'ISC' __copyright__ = '2012-2013, Ciro Mattia Gonano , Pawel Jastrzebski ' __docformat__ = 'restructuredtext en' -import sys -import os +# Dependiences check +missing = [] try: # noinspection PyUnresolvedReferences from PyQt5 import QtCore, QtGui, QtNetwork, QtWidgets except ImportError: - print("ERROR: PyQT5 is not installed!") - if sys.platform.startswith('linux'): - import tkinter - import tkinter.messagebox - importRoot = tkinter.Tk() - importRoot.withdraw() - tkinter.messagebox.showerror("KCC - Error", "PyQT5 is not installed!") + missing.append('PyQt5') +try: + # noinspection PyUnresolvedReferences + from psutil import TOTAL_PHYMEM, Popen +except ImportError: + missing.append('psutil') +try: + # noinspection PyUnresolvedReferences + from slugify import slugify +except ImportError: + missing.append('python-slugify') +try: + # noinspection PyUnresolvedReferences + from PIL import Image, ImageOps, ImageStat, ImageChops + if tuple(map(int, ('2.3.0'.split(".")))) > tuple(map(int, (Image.PILLOW_VERSION.split(".")))): + missing.append('Pillow 2.3.0+') +except ImportError: + missing.append('Pillow 2.3.0+') +if len(missing) > 0: + print('ERROR: ' + ', '.join(missing) + ' is not installed!') + import tkinter + import tkinter.messagebox + importRoot = tkinter.Tk() + importRoot.withdraw() + tkinter.messagebox.showerror('KCC - Error', 'ERROR: ' + ', '.join(missing) + ' is not installed!') exit(1) -from kcc import KCC_gui + +import sys +import os from multiprocessing import freeze_support +from kcc import KCC_gui # OS specific PATH variable workarounds if sys.platform.startswith('darwin'): diff --git a/kcc/KCC_gui.py b/kcc/KCC_gui.py index 64ece41..905c41f 100644 --- a/kcc/KCC_gui.py +++ b/kcc/KCC_gui.py @@ -26,11 +26,8 @@ import os import sys import traceback import urllib.request -import urllib.error import urllib.parse import socket -from . import comic2ebook -from . import kindlesplit from time import sleep from shutil import move from http.server import BaseHTTPRequestHandler, HTTPServer @@ -39,19 +36,10 @@ from subprocess import STDOUT, PIPE from PyQt5 import QtGui, QtCore, QtWidgets from xml.dom.minidom import parse from html.parser import HTMLParser -from .KCC_rc_web import WebContent -try: - # noinspection PyUnresolvedReferences - from psutil import TOTAL_PHYMEM, Popen -except ImportError: - print("ERROR: Psutil is not installed!") - if sys.platform.startswith('linux'): - import tkinter - import tkinter.messagebox - importRoot = tkinter.Tk() - importRoot.withdraw() - tkinter.messagebox.showerror("KCC - Error", "Psutil is not installed!") - exit(1) +from psutil import TOTAL_PHYMEM, Popen +from . import comic2ebook +from . import kindlesplit +from . import KCC_rc_web if sys.platform.startswith('darwin'): from . import KCC_ui_osx as KCC_ui elif sys.platform.startswith('linux'): @@ -993,7 +981,7 @@ class KCCGUI(KCC_ui.Ui_KCC): # Empty string cover all versions before this system was implemented purgeSettingsVersions = [''] self.icons = Icons() - self.webContent = WebContent() + self.webContent = KCC_rc_web.WebContent() self.tray = SystemTrayIcon() self.settings = QtCore.QSettings('KindleComicConverter', 'KindleComicConverter') self.settingsVersion = self.settings.value('settingsVersion', '', type=str) diff --git a/kcc/cbxarchive.py b/kcc/cbxarchive.py index baa3036..1e288cd 100644 --- a/kcc/cbxarchive.py +++ b/kcc/cbxarchive.py @@ -21,23 +21,11 @@ __docformat__ = 'restructuredtext en' import os import zipfile -from . import rarfile import locale -from sys import platform from subprocess import STDOUT, PIPE -try: - # noinspection PyUnresolvedReferences - from psutil import Popen -except ImportError: - print("ERROR: Psutil is not installed!") - if platform.startswith('linux'): - import tkinter - import tkinter.messagebox - importRoot = tkinter.Tk() - importRoot.withdraw() - tkinter.messagebox.showerror("KCC - Error", "Psutil is not installed!") - exit(1) +from psutil import Popen from shutil import move +from . import rarfile class CBxArchive: diff --git a/kcc/comic2ebook.py b/kcc/comic2ebook.py index 0a154de..1c88ed1 100755 --- a/kcc/comic2ebook.py +++ b/kcc/comic2ebook.py @@ -34,27 +34,7 @@ from multiprocessing import Pool from xml.dom.minidom import parse from uuid import uuid4 from slugify import slugify -try: - # noinspection PyUnresolvedReferences - from PIL import Image - if tuple(map(int, ('2.3.0'.split(".")))) > tuple(map(int, (Image.PILLOW_VERSION.split(".")))): - print("ERROR: Pillow 2.3.0 or newer is required!") - if sys.platform.startswith('linux'): - import tkinter - import tkinter.messagebox - importRoot = tkinter.Tk() - importRoot.withdraw() - tkinter.messagebox.showerror("KCC - Error", "Pillow 2.3.0 or newer is required!") - exit(1) -except ImportError: - print("ERROR: Pillow is not installed!") - if sys.platform.startswith('linux'): - import tkinter - import tkinter.messagebox - importRoot = tkinter.Tk() - importRoot.withdraw() - tkinter.messagebox.showerror("KCC - Error", "Pillow 2.3.0 or newer is required!") - exit(1) +from PIL import Image try: from PyQt5 import QtCore except ImportError: diff --git a/kcc/comic2panel.py b/kcc/comic2panel.py index 3c4cdd3..34c405f 100644 --- a/kcc/comic2panel.py +++ b/kcc/comic2panel.py @@ -27,27 +27,7 @@ import sys from shutil import rmtree, copytree, move from optparse import OptionParser, OptionGroup from multiprocessing import Pool -try: - # noinspection PyUnresolvedReferences - from PIL import Image, ImageStat - if tuple(map(int, ('2.3.0'.split(".")))) > tuple(map(int, (Image.PILLOW_VERSION.split(".")))): - print("ERROR: Pillow 2.3.0 or newer is required!") - if sys.platform.startswith('linux'): - import tkinter - import tkinter.messagebox - importRoot = tkinter.Tk() - importRoot.withdraw() - tkinter.messagebox.showerror("KCC - Error", "Pillow 2.3.0 or newer is required!") - exit(1) -except ImportError: - print("ERROR: Pillow is not installed!") - if sys.platform.startswith('linux'): - import tkinter - import tkinter.messagebox - importRoot = tkinter.Tk() - importRoot.withdraw() - tkinter.messagebox.showerror("KCC - Error", "Pillow 2.3.0 or newer is required!") - exit(1) +from PIL import Image, ImageStat try: from PyQt5 import QtCore except ImportError: diff --git a/kcc/image.py b/kcc/image.py index 7a53a0a..f6d14a8 100755 --- a/kcc/image.py +++ b/kcc/image.py @@ -21,29 +21,8 @@ __copyright__ = '2012-2013, Ciro Mattia Gonano , Pawel Jas __docformat__ = 'restructuredtext en' import os -from sys import platform from functools import reduce -try: - # noinspection PyUnresolvedReferences - from PIL import Image, ImageOps, ImageStat, ImageChops - if tuple(map(int, ('2.3.0'.split(".")))) > tuple(map(int, (Image.PILLOW_VERSION.split(".")))): - print("ERROR: Pillow 2.3.0 or newer is required!") - if platform.startswith('linux'): - import tkinter - import tkinter.messagebox - importRoot = tkinter.Tk() - importRoot.withdraw() - tkinter.messagebox.showerror("KCC - Error", "Pillow 2.3.0 or newer is required!") - exit(1) -except ImportError: - print("ERROR: Pillow is not installed!") - if platform.startswith('linux'): - import tkinter - import tkinter.messagebox - importRoot = tkinter.Tk() - importRoot.withdraw() - tkinter.messagebox.showerror("KCC - Error", "Pillow 2.3.0 or newer is required!") - exit(1) +from PIL import Image, ImageOps, ImageStat, ImageChops class ProfileData: diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index 264dcd4..0000000 --- a/requirements.txt +++ /dev/null @@ -1,4 +0,0 @@ -Pillow==2.2.1 -Unidecode==0.04.14 -psutil==1.1.3 -python-slugify==0.0.6 From d76a624a82bf593425ae4b87917c7f0f66d593f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Jastrz=C4=99bski?= Date: Wed, 15 Jan 2014 22:03:48 +0100 Subject: [PATCH 08/50] Bucket #3 --- kcc.py | 4 +-- kcc/KCC_gui.py | 75 ++++++++++++++++++++++---------------------- kcc/KCC_ui_linux.py | 2 +- kcc/KCC_ui_osx.py | 2 +- kcc/comic2ebook.py | 50 ++++++++++++++--------------- kcc/comic2panel.py | 14 ++++----- kcc/pdfjpgextract.py | 4 +-- 7 files changed, 76 insertions(+), 75 deletions(-) diff --git a/kcc.py b/kcc.py index ba23c4d..f53ab11 100644 --- a/kcc.py +++ b/kcc.py @@ -120,8 +120,8 @@ class QApplicationMessaging(QtWidgets.QApplication): # Adding signals to QMainWindow class QMainWindowKCC(QtWidgets.QMainWindow): - progressBarTick = QtCore.pyqtSignal(str, str) - modeConvert = QtCore.pyqtSignal(str) + progressBarTick = QtCore.pyqtSignal(str) + modeConvert = QtCore.pyqtSignal(bool) addMessage = QtCore.pyqtSignal(str, str, bool) addTrayMessage = QtCore.pyqtSignal(str, str) showDialog = QtCore.pyqtSignal(str) diff --git a/kcc/KCC_gui.py b/kcc/KCC_gui.py index 905c41f..da5d036 100644 --- a/kcc/KCC_gui.py +++ b/kcc/KCC_gui.py @@ -89,7 +89,7 @@ class HTMLStripper(HTMLParser): class WebServerHandler(BaseHTTPRequestHandler): - #noinspection PyAttributeOutsideInit + # noinspection PyAttributeOutsideInit, PyArgumentList def do_GET(self): if self.path == '/': self.path = '/index.html' @@ -109,7 +109,7 @@ class WebServerHandler(BaseHTTPRequestHandler): self.send_response(200) self.send_header('Content-type', 'text/html') self.end_headers() - self.wfile.write('\n' + self.wfile.write(bytes('\n' '\n' '\n' '\n' @@ -118,16 +118,16 @@ class WebServerHandler(BaseHTTPRequestHandler): '\n' '
\n' '

- -

\n') + 'alt="KCC Logo" src="' + GUI.webContent.logo + '" /> -

\n', 'UTF-8')) if len(GUI.completedWork) > 0 and not GUI.conversionAlive: for key in sorted(GUI.completedWork.keys()): - self.wfile.write('

' + key.split('.')[0] + '

\n') + self.wfile.write(bytes('

' + key.split('.')[0] + '

\n', 'UTF-8')) else: - self.wfile.write('

No downloads are available.
' - 'Convert some files and refresh this page.

\n') - self.wfile.write('
\n' + self.wfile.write(bytes('

No downloads are available.
' + 'Convert some files and refresh this page.

\n', 'UTF-8')) + self.wfile.write(bytes('\n' '\n' - '\n') + '\n', 'UTF-8')) elif sendReply: outputFile = GUI.completedWork[urllib.parse.unquote(self.path[1:])].decode('utf-8') fp = open(outputFile, 'rb') @@ -314,6 +314,8 @@ class WorkerThread(QtCore.QThread): # Let's make sure that we don't use too many threads if self.threadNumber > QtCore.QThread.idealThreadCount(): self.threadNumber = QtCore.QThread.idealThreadCount() + self.progressBarTick = MW.progressBarTick + self.addMessage = MW.addMessage def __del__(self): self.wait() @@ -331,7 +333,7 @@ class WorkerThread(QtCore.QThread): MW.modeConvert.emit(True) def addResult(self, output): - MW.progressBarTick.emit(False, False) + MW.progressBarTick.emit('tick') self.workerOutput.append(output) def run(self): @@ -433,9 +435,9 @@ class WorkerThread(QtCore.QThread): else: MW.addMessage.emit('Creating EPUB files... Done!', 'info', True) if str(GUI.FormatBox.currentText()) == 'MOBI': - MW.progressBarTick.emit('status', 'Creating MOBI files') - MW.progressBarTick.emit(len(outputPath)*2+1, False) - MW.progressBarTick.emit(False, False) + MW.progressBarTick.emit('Creating MOBI files') + MW.progressBarTick.emit(str(len(outputPath)*2+1)) + MW.progressBarTick.emit('tick') MW.addMessage.emit('Creating MOBI files', 'info', False) GUI.progress.content = 'Creating MOBI files' self.workerOutput = [] @@ -463,8 +465,6 @@ class WorkerThread(QtCore.QThread): if self.kindlegenErrorCode[0] == 0: GUI.progress.content = '' MW.addMessage.emit('Creating MOBI files... Done!', 'info', True) - MW.addMessage.emit('Cleaning MOBI files is currently disabled in this branch', 'info', False) - GUI.progress.content = 'Cleaning MOBI files is currently disabled in this branch' MW.addMessage.emit('Cleaning MOBI files', 'info', False) GUI.progress.content = 'Cleaning MOBI files' self.workerOutput = [] @@ -528,7 +528,7 @@ class WorkerThread(QtCore.QThread): class SystemTrayIcon(QtWidgets.QSystemTrayIcon): def __init__(self): - if not sys.platform.startswith('darwin') and self.isSystemTrayAvailable(): + if self.isSystemTrayAvailable(): QtWidgets.QSystemTrayIcon.__init__(self, GUI.icons.programIcon, MW) self.activated.connect(self.catchClicks) @@ -538,23 +538,22 @@ class SystemTrayIcon(QtWidgets.QSystemTrayIcon): MW.activateWindow() def addTrayMessage(self, message, icon): - if not sys.platform.startswith('darwin'): - icon = eval('QtGui.QSystemTrayIcon.' + icon) - if self.supportsMessages() and not MW.isActiveWindow(): - self.showMessage('Kindle Comic Converter', message, icon) + icon = eval('QtWidgets.QSystemTrayIcon.' + icon) + if self.supportsMessages() and not MW.isActiveWindow(): + self.showMessage('Kindle Comic Converter', message, icon) class KCCGUI(KCC_ui.Ui_KCC): - # TODO: Check dialog def selectDir(self): if self.needClean: self.needClean = False GUI.JobList.clear() # Dirty, dirty way but OS native QFileDialogs don't support directory multiselect - dirDialog = QtWidgets.QFileDialog(MW, 'Select directory', self.lastPath) + dirDialog = QtWidgets.QFileDialog(MW, 'Select directory', self.lastPath, 'Directory (*.abcdefg)') dirDialog.setFileMode(dirDialog.Directory) dirDialog.setOption(dirDialog.ShowDirsOnly, True) dirDialog.setOption(dirDialog.DontUseNativeDialog, True) + dirDialog.setOption(dirDialog.HideNameFilterDetails, True) l = dirDialog.findChild(QtWidgets.QListView, "listView") t = dirDialog.findChild(QtWidgets.QTreeView) if l: @@ -573,7 +572,6 @@ class KCCGUI(KCC_ui.Ui_KCC): GUI.JobList.addItem(dname) MW.setFocus() - # TODO: Check dialog def selectFile(self): if self.needClean: self.needClean = False @@ -581,20 +579,22 @@ class KCCGUI(KCC_ui.Ui_KCC): if self.UnRAR: if self.sevenza: fnames = QtWidgets.QFileDialog.getOpenFileNames(MW, 'Select file', self.lastPath, - '*.cbz *.cbr *.cb7 *.zip *.rar *.7z *.pdf') + 'Comic (*.cbz *.cbr *.cb7 *.zip *.rar *.7z *.pdf)') else: fnames = QtWidgets.QFileDialog.getOpenFileNames(MW, 'Select file', self.lastPath, - '*.cbz *.cbr *.zip *.rar *.pdf') + 'Comic (*.cbz *.cbr *.zip *.rar *.pdf)') else: if self.sevenza: fnames = QtWidgets.QFileDialog.getOpenFileNames(MW, 'Select file', self.lastPath, - '*.cbz *.cb7 *.zip *.7z *.pdf') + 'Comic (*.cbz *.cb7 *.zip *.7z *.pdf)') else: fnames = QtWidgets.QFileDialog.getOpenFileNames(MW, 'Select file', self.lastPath, - '*.cbz *.zip *.pdf') - for fname in fnames: - if str(fname) != "": - self.lastPath = os.path.abspath(os.path.join(str(fname), os.pardir)) + 'Comic (*.cbz *.zip *.pdf)') + for fname in fnames[0]: + if fname != '': + if sys.platform.startswith('win'): + fname = fname.replace('/', '\\') + self.lastPath = os.path.abspath(os.path.join(fname, os.pardir)) GUI.JobList.addItem(fname) def clearJobs(self): @@ -849,8 +849,8 @@ class KCCGUI(KCC_ui.Ui_KCC): s.feed(html) return s.get_data() - def addMessage(self, message, icon=None, replace=False): - if icon: + def addMessage(self, message, icon, replace=False): + if icon != '': icon = eval('self.icons.' + icon) item = QtWidgets.QListWidgetItem(icon, ' ' + self.stripTags(message)) else: @@ -873,15 +873,15 @@ class KCCGUI(KCC_ui.Ui_KCC): def showDialog(self, message): QtWidgets.QMessageBox.critical(MW, 'KCC - Error', message, QtWidgets.QMessageBox.Ok) - def updateProgressbar(self, new=False, status=False): - if new == "status": - GUI.ProgressBar.setFormat(status) - elif new: - GUI.ProgressBar.setMaximum(new - 1) + def updateProgressbar(self, command): + if command == 'tick': + GUI.ProgressBar.setValue(GUI.ProgressBar.value() + 1) + elif command.isdigit(): + GUI.ProgressBar.setMaximum(int(command) - 1) GUI.ProgressBar.reset() GUI.ProgressBar.show() else: - GUI.ProgressBar.setValue(GUI.ProgressBar.value() + 1) + GUI.ProgressBar.setFormat(command) def convertStart(self): if self.conversionAlive: @@ -923,6 +923,7 @@ class KCCGUI(KCC_ui.Ui_KCC): if not GUI.ConvertButton.isEnabled(): event.ignore() self.contentServer.stop() + self.tray.hide() self.settings.setValue('settingsVersion', __version__) self.settings.setValue('lastPath', self.lastPath) self.settings.setValue('lastDevice', GUI.DeviceBox.currentIndex()) diff --git a/kcc/KCC_ui_linux.py b/kcc/KCC_ui_linux.py index 983c077..233ef5e 100644 --- a/kcc/KCC_ui_linux.py +++ b/kcc/KCC_ui_linux.py @@ -375,4 +375,4 @@ class Ui_KCC(object): self.ActionBasic.setText(_translate("KCC", "Basic")) self.ActionAdvanced.setText(_translate("KCC", "Advanced")) -import KCC_rc +from . import KCC_rc diff --git a/kcc/KCC_ui_osx.py b/kcc/KCC_ui_osx.py index d6b49a8..d4793ba 100644 --- a/kcc/KCC_ui_osx.py +++ b/kcc/KCC_ui_osx.py @@ -393,4 +393,4 @@ class Ui_KCC(object): self.ActionBasic.setText(_translate("KCC", "Basic")) self.ActionAdvanced.setText(_translate("KCC", "Advanced")) -import KCC_rc +from . import KCC_rc diff --git a/kcc/comic2ebook.py b/kcc/comic2ebook.py index 1c88ed1..4cc0573 100755 --- a/kcc/comic2ebook.py +++ b/kcc/comic2ebook.py @@ -343,7 +343,7 @@ def dirImgProcess(path): pagenumber += 1 work.append([afile, dirpath, options]) if GUI: - GUI.progressBarTick.emit(pagenumber, False) + GUI.progressBarTick.emit(str(pagenumber)) if len(work) > 0: for i in work: workerPool.apply_async(func=fileImgProcess, args=(i, ), callback=fileImgProcess_tick) @@ -365,7 +365,7 @@ def fileImgProcess_tick(output): workerOutput.append(output) workerPool.terminate() if GUI: - GUI.progressBarTick.emit(False, False) + GUI.progressBarTick.emit('tick') if not GUI.conversionAlive: workerPool.terminate() @@ -793,11 +793,11 @@ def preSplitDirectory(path): if filesNumber > 0: print('\nWARNING: Automatic output splitting failed.') if GUI: - GUI.progressBarTick.emit('Automatic output splitting failed. ' - 'More details.', 'warning', False) - GUI.progressBarTick.emit('', False, False) + GUI.addMessage.emit('Automatic output splitting failed. ' + 'More details.', 'warning', False) + GUI.addMessage.emit('', '', False) return [path] detectedSubSubdirectories = False detectedFilesInSubdirectories = False @@ -808,11 +808,11 @@ def preSplitDirectory(path): elif len(dirs) == 0 and detectedSubSubdirectories: print('\nWARNING: Automatic output splitting failed.') if GUI: - GUI.progressBarTick.emit('Automatic output splitting failed. ' - 'More details.', 'warning', False) - GUI.progressBarTick.emit('', False, False) + GUI.addMessage.emit('Automatic output splitting failed. ' + 'More details.', 'warning', False) + GUI.addMessage.emit('', '', False) return [path] if len(files) != 0: detectedFilesInSubdirectories = True @@ -825,11 +825,11 @@ def preSplitDirectory(path): if detectedFilesInSubdirectories and detectedSubSubdirectories: print('\nWARNING: Automatic output splitting failed.') if GUI: - GUI.progressBarTick.emit('Automatic output splitting failed. ' - 'More details.', 'warning', False) - GUI.progressBarTick.emit('', False, False) + GUI.addMessage.emit('Automatic output splitting failed. ' + 'More details.', 'warning', False) + GUI.addMessage.emit('', '', False) return [path] # Split directories split = splitDirectory(os.path.join(path, 'OEBPS', 'Images'), mode) @@ -949,7 +949,7 @@ def main(argv=None, qtGUI=None): checkOptions() if qtGUI: GUI = qtGUI - GUI.progressBarTick.emit(1, False) + GUI.progressBarTick.emit('1') else: GUI = None if len(args) != 1: @@ -966,10 +966,10 @@ def main(argv=None, qtGUI=None): if options.imgproc: print("\nProcessing images...") if GUI: - GUI.progressBarTick.emit('status', 'Processing images') + GUI.progressBarTick.emit('Processing images') dirImgProcess(path + "/OEBPS/Images/") if GUI: - GUI.progressBarTick.emit(1, False) + GUI.progressBarTick.emit('1') sanitizeTree(os.path.join(path, 'OEBPS', 'Images')) if options.batchsplit: tomes = preSplitDirectory(path) @@ -979,11 +979,11 @@ def main(argv=None, qtGUI=None): tomeNumber = 0 if GUI: if options.cbzoutput: - GUI.progressBarTick.emit('status', 'Compressing CBZ files') + GUI.progressBarTick.emit('Compressing CBZ files') else: - GUI.progressBarTick.emit('status', 'Compressing EPUB files') - GUI.progressBarTick.emit(len(tomes) + 1, False) - GUI.progressBarTick.emit(False, False) + GUI.progressBarTick.emit('Compressing EPUB files') + GUI.progressBarTick.emit(str(len(tomes) + 1)) + GUI.progressBarTick.emit('tick') options.baseTitle = options.title for tome in tomes: if len(tomes) > 1: @@ -1009,7 +1009,7 @@ def main(argv=None, qtGUI=None): move(tome + '_comic.zip', filepath[-1]) rmtree(tome, True) if GUI: - GUI.progressBarTick.emit(False, False) + GUI.progressBarTick.emit('tick') return filepath diff --git a/kcc/comic2panel.py b/kcc/comic2panel.py index 34c405f..9e92d78 100644 --- a/kcc/comic2panel.py +++ b/kcc/comic2panel.py @@ -64,7 +64,7 @@ def mergeDirectory_tick(output): mergeWorkerOutput.append(output) mergeWorkerPool.terminate() if GUI: - GUI.progressBarTick.emit(False, False) + GUI.progressBarTick.emit('tick') if not GUI.conversionAlive: mergeWorkerPool.terminate() @@ -132,7 +132,7 @@ def splitImage_tick(output): splitWorkerOutput.append(output) splitWorkerPool.terminate() if GUI: - GUI.progressBarTick.emit(False, False) + GUI.progressBarTick.emit('tick') if not GUI.conversionAlive: splitWorkerPool.terminate() @@ -278,8 +278,8 @@ def main(argv=None, qtGUI=None): directoryNumer += 1 mergeWork.append([os.path.join(root, directory)]) if GUI: - GUI.progressBarTick.emit('status', 'Combining images') - GUI.progressBarTick.emit(directoryNumer, False) + GUI.progressBarTick.emit('Combining images') + GUI.progressBarTick.emit(str(directoryNumer)) for i in mergeWork: mergeWorkerPool.apply_async(func=mergeDirectory, args=(i, ), callback=mergeDirectory_tick) mergeWorkerPool.close() @@ -298,9 +298,9 @@ def main(argv=None, qtGUI=None): else: os.remove(os.path.join(root, name)) if GUI: - GUI.progressBarTick.emit('status', 'Splitting images') - GUI.progressBarTick.emit(pagenumber, False) - GUI.progressBarTick.emit(False, False) + GUI.progressBarTick.emit('Splitting images') + GUI.progressBarTick.emit(str(pagenumber)) + GUI.progressBarTick.emit('tick') if len(work) > 0: for i in work: splitWorkerPool.apply_async(func=splitImage, args=(i, ), callback=splitImage_tick) diff --git a/kcc/pdfjpgextract.py b/kcc/pdfjpgextract.py index cb3f084..e322bdf 100644 --- a/kcc/pdfjpgextract.py +++ b/kcc/pdfjpgextract.py @@ -40,7 +40,7 @@ class PdfJpgExtract: return self.path def extract(self): - pdf = open(self.origFileName, "rb").read() + pdf = open(self.origFileName, "r").read() startmark = "\xff\xd8" startfix = 0 @@ -69,7 +69,7 @@ class PdfJpgExtract: iend += endfix jpg = pdf[istart:iend] jpgfile = open(self.path + "/jpg%d.jpg" % njpg, "wb") - jpgfile.write(jpg) + jpgfile.write(bytearray(jpg, 'utf-8')) jpgfile.close() njpg += 1 From 921511dcf29dd26a4401dc839a2730c955dc9edb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Jastrz=C4=99bski?= Date: Thu, 16 Jan 2014 11:40:49 +0100 Subject: [PATCH 09/50] Full UTF-8 awareness (close #74) Tested only on Windows. But he had the biggest problems with it. --- kcc.py | 11 ++++++----- kcc/KCC_gui.py | 9 ++++----- kcc/cbxarchive.py | 16 +++++++++------- kcc/comic2ebook.py | 11 +++++------ 4 files changed, 24 insertions(+), 23 deletions(-) diff --git a/kcc.py b/kcc.py index f53ab11..ea8fe68 100644 --- a/kcc.py +++ b/kcc.py @@ -77,7 +77,7 @@ elif sys.platform.startswith('win'): # Implementing detection of already running KCC instance and forwarding argv to it class QApplicationMessaging(QtWidgets.QApplication): - messageFromOtherInstance = QtCore.pyqtSignal(str) + messageFromOtherInstance = QtCore.pyqtSignal(bytes) def __init__(self, argv): QtWidgets.QApplication.__init__(self, argv) @@ -102,7 +102,7 @@ class QApplicationMessaging(QtWidgets.QApplication): def handleMessage(self): socket = self._server.nextPendingConnection() if socket.waitForReadyRead(self._timeout): - self.messageFromOtherInstance.emit(socket.readAll().data().decode('utf8')) + self.messageFromOtherInstance.emit(socket.readAll().data()) def sendMessage(self, message): if self.isRunning(): @@ -110,7 +110,8 @@ class QApplicationMessaging(QtWidgets.QApplication): socket.connectToServer(self._key, QtCore.QIODevice.WriteOnly) if not socket.waitForConnected(self._timeout): return False - socket.write(message.encode('utf8')) + # noinspection PyArgumentList + socket.write(bytes(message, 'UTF-8')) if not socket.waitForBytesWritten(self._timeout): return False socket.disconnectFromServer() @@ -133,7 +134,7 @@ if __name__ == "__main__": KCCAplication = QApplicationMessaging(sys.argv) if KCCAplication.isRunning(): if len(sys.argv) > 1: - KCCAplication.sendMessage(sys.argv[1].decode(sys.getfilesystemencoding())) + KCCAplication.sendMessage(sys.argv[1]) sys.exit(0) else: messageBox = QtWidgets.QMessageBox() @@ -146,5 +147,5 @@ if __name__ == "__main__": KCCWindow = QMainWindowKCC() KCCUI = KCC_gui.KCCGUI(KCCAplication, KCCWindow) if len(sys.argv) > 1: - KCCUI.handleMessage(sys.argv[1].decode(sys.getfilesystemencoding())) + KCCUI.handleMessage(sys.argv[1]) sys.exit(KCCAplication.exec_()) diff --git a/kcc/KCC_gui.py b/kcc/KCC_gui.py index da5d036..b8528c0 100644 --- a/kcc/KCC_gui.py +++ b/kcc/KCC_gui.py @@ -129,7 +129,7 @@ class WebServerHandler(BaseHTTPRequestHandler): '\n' '\n', 'UTF-8')) elif sendReply: - outputFile = GUI.completedWork[urllib.parse.unquote(self.path[1:])].decode('utf-8') + outputFile = GUI.completedWork[urllib.parse.unquote(self.path[1:])] fp = open(outputFile, 'rb') self.send_response(200) self.send_header('Content-type', mimetype) @@ -243,8 +243,7 @@ class KindleGenThread(QtCore.QRunnable): kindlegenError = '' try: if os.path.getsize(self.work) < 367001600: - output = Popen('kindlegen -locale en "' + self.work.encode(sys.getfilesystemencoding()).decode('utf-8') - + '"', stdout=PIPE, stderr=STDOUT, shell=True) + output = Popen('kindlegen -locale en "' + self.work + '"', stdout=PIPE, stderr=STDOUT, shell=True) for line in output.stdout: line = line.decode('utf-8') # ERROR: Generic error @@ -486,7 +485,7 @@ class WorkerThread(QtCore.QThread): GUI.progress.content = '' mobiPath = item.replace('.epub', '.mobi') os.remove(mobiPath + '_toclean') - GUI.completedWork[os.path.basename(mobiPath).encode('utf-8')] = mobiPath.encode('utf-8') + GUI.completedWork[os.path.basename(mobiPath)] = mobiPath MW.addMessage.emit('Cleaning MOBI files... Done!', 'info', True) else: GUI.progress.content = '' @@ -516,7 +515,7 @@ class WorkerThread(QtCore.QThread): False) else: for item in outputPath: - GUI.completedWork[os.path.basename(item).encode('utf-8')] = item.encode('utf-8') + GUI.completedWork[os.path.basename(item)] = item GUI.progress.content = '' GUI.progress.stop() MW.hideProgressBar.emit() diff --git a/kcc/cbxarchive.py b/kcc/cbxarchive.py index 1e288cd..09ce2f9 100644 --- a/kcc/cbxarchive.py +++ b/kcc/cbxarchive.py @@ -21,7 +21,6 @@ __docformat__ = 'restructuredtext en' import os import zipfile -import locale from subprocess import STDOUT, PIPE from psutil import Popen from shutil import move @@ -59,7 +58,7 @@ class CBxArchive: cbzFile.extractall(targetdir, filelist) def extractCBR(self, targetdir): - cbrFile = rarfile.RarFile(self.origFileName.encode(locale.getpreferredencoding())) + cbrFile = rarfile.RarFile(self.origFileName) filelist = [] for f in cbrFile.namelist(): if f.startswith('__MACOSX') or f.endswith('.DS_Store') or f.endswith('thumbs.db'): @@ -70,16 +69,15 @@ class CBxArchive: except Exception: pass # the dir exists so we are going to extract the images only. else: - filelist.append(f.encode(locale.getpreferredencoding())) + filelist.append(f) cbrFile.extractall(targetdir, filelist) def extractCB7(self, targetdir): - output = Popen('7za x "' + self.origFileName.encode(locale.getpreferredencoding()) + - '" -xr!__MACOSX -xr!.DS_Store -xr!thumbs.db -o"' + targetdir + '"', - stdout=PIPE, stderr=STDOUT, shell=True) + output = Popen('7za x "' + self.origFileName + '" -xr!__MACOSX -xr!.DS_Store -xr!thumbs.db -o"' + + targetdir + '"', stdout=PIPE, stderr=STDOUT, shell=True) extracted = False for line in output.stdout: - if "Everything is Ok" in line: + if b"Everything is Ok" in line: extracted = True if not extracted: raise OSError @@ -97,6 +95,10 @@ class CBxArchive: adir.remove('ComicInfo.xml') if len(adir) == 1 and os.path.isdir(os.path.join(targetdir, adir[0])): for f in os.listdir(os.path.join(targetdir, adir[0])): + # If directory names contain UTF-8 chars shutil.move can't clean up the mess alone + if os.path.isdir(os.path.join(targetdir, f)): + os.rename(os.path.join(targetdir, adir[0], f), os.path.join(targetdir, adir[0], f + '-A')) + f += '-A' move(os.path.join(targetdir, adir[0], f), targetdir) os.rmdir(os.path.join(targetdir, adir[0])) return targetdir diff --git a/kcc/comic2ebook.py b/kcc/comic2ebook.py index 4cc0573..7a7edb7 100755 --- a/kcc/comic2ebook.py +++ b/kcc/comic2ebook.py @@ -78,7 +78,7 @@ def buildHTML(path, imgfile): if not os.path.exists(htmlpath): os.makedirs(htmlpath) htmlfile = os.path.join(htmlpath, filename[0] + '.html') - f = open(htmlfile, "w") + f = open(htmlfile, "w", encoding='UTF-8') f.writelines(["\n", "\n", @@ -189,9 +189,8 @@ def buildHTML(path, imgfile): def buildNCX(dstdir, title, chapters): options.uuid = str(uuid4()) - #options.uuid = options.uuid.encode('utf-8') ncxfile = os.path.join(dstdir, 'OEBPS', 'toc.ncx') - f = open(ncxfile, "w") + f = open(ncxfile, "w", encoding='UTF-8') f.writelines(["\n", "\n", @@ -227,7 +226,7 @@ def buildOPF(dstdir, title, filelist, cover=None): writingmode = "horizontal-rl" else: writingmode = "horizontal-lr" - f = open(opffile, "w") + f = open(opffile, "w", encoding='UTF-8') f.writelines(["\n", "\n", @@ -284,7 +283,7 @@ def buildOPF(dstdir, title, filelist, cover=None): f.write("
\n\n\n\n") f.close() os.mkdir(os.path.join(dstdir, 'META-INF')) - f = open(os.path.join(dstdir, 'META-INF', 'container.xml'), 'w') + f = open(os.path.join(dstdir, 'META-INF', 'container.xml'), 'w', encoding='UTF-8') f.writelines(["\n", "\n", "\n", @@ -426,7 +425,7 @@ def genEpubStruct(path): cover = None _, deviceres, _, _, panelviewsize = options.profileData os.mkdir(os.path.join(path, 'OEBPS', 'Text')) - f = open(os.path.join(path, 'OEBPS', 'Text', 'style.css'), 'w') + f = open(os.path.join(path, 'OEBPS', 'Text', 'style.css'), 'w', encoding='UTF-8') # DON'T COMPRESS CSS. KINDLE WILL FAIL TO PARSE IT. # Generic Panel View support + Margins fix for Non-Kindle devices. f.writelines(["@page {\n", From 6d445ae151983df50986992a0b79018b2a0534c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Jastrz=C4=99bski?= Date: Thu, 16 Jan 2014 12:34:36 +0100 Subject: [PATCH 10/50] Fully implemented new slugify library --- kcc/comic2ebook.py | 33 ++++++++++++++------------------- kcc/image.py | 18 +++++++++--------- 2 files changed, 23 insertions(+), 28 deletions(-) diff --git a/kcc/comic2ebook.py b/kcc/comic2ebook.py index 7a7edb7..35df89b 100755 --- a/kcc/comic2ebook.py +++ b/kcc/comic2ebook.py @@ -33,7 +33,7 @@ from optparse import OptionParser, OptionGroup from multiprocessing import Pool from xml.dom.minidom import parse from uuid import uuid4 -from slugify import slugify +from slugify import slugify as slugifyExt from PIL import Image try: from PyQt5 import QtCore @@ -48,19 +48,19 @@ from . import pdfjpgextract def buildHTML(path, imgfile): filename = getImageFileName(imgfile) if filename is not None: - if "_kccrot" in str(filename): + if "-kccrot" in str(filename): rotatedPage = True else: rotatedPage = False - if "_kccnpv" in str(filename): + if "-kccnpv" in str(filename): noPV = True else: noPV = False - if "_kccnh" in str(filename): + if "-kccnh" in str(filename): noHorizontalPV = True else: noHorizontalPV = False - if "_kccnv" in str(filename): + if "-kccnv" in str(filename): noVerticalPV = True else: noVerticalPV = False @@ -133,13 +133,13 @@ def buildHTML(path, imgfile): "}'>\n"]) if options.quality == 2: imgfilepv = str.split(imgfile, ".") - imgfilepv[0] = imgfilepv[0].split("_kccxl")[0].replace("_kccnh", "").replace("_kccnv", "") - imgfilepv[0] += "_kcchq" + imgfilepv[0] = imgfilepv[0].split("-kccxl")[0].replace("-kccnh", "").replace("-kccnv", "") + imgfilepv[0] += "-kcchq" imgfilepv = ".".join(imgfilepv) else: imgfilepv = imgfile - if "_kccxl" in filename[0]: - borders = filename[0].split('_kccxl')[1] + if "-kccxl" in filename[0]: + borders = filename[0].split('-kccxl')[1] borders = re.findall('[0-9]{1,6}', borders) xl = borders[0].lstrip("0") yu = borders[1].lstrip("0") @@ -539,7 +539,7 @@ def genEpubStruct(path): chapter = False for afile in filenames: filename = getImageFileName(afile) - if filename is not None and not "_kcchq" in filename[0]: + if filename is not None and not "-kcchq" in filename[0]: filelist.append(buildHTML(dirpath, afile)) if not chapter: chapterlist.append((dirpath.replace('Images', 'Text'), filelist[-1][1])) @@ -649,15 +649,10 @@ def checkComicInfo(path, originalPath): os.remove(xmlPath) -# TODO: Check if replacement work correctly. No zero padding!!! -#def slugify(value): -# # Normalizes string, converts to lowercase, removes non-alpha characters and converts spaces to hyphens. -# value = unicodedata.normalize('NFKD', value).encode('ascii', 'ignore') -# value = re.sub('[^\w\s\.-]', '', value).strip().lower() -# value = re.sub('[-\.\s]+', '-', value) -# value = re.sub(r'([0-9]+)', r'00000\1', value) -# value = re.sub(r'0*([0-9]{6,})', r'\1', value) -# return value +def slugify(value): + value = slugifyExt(value) + value = re.sub(r'0*([0-9]{4,})', r'\1', re.sub(r'([0-9]+)', r'0000\1', value)) + return value def sanitizeTree(filetree): diff --git a/kcc/image.py b/kcc/image.py index f6d14a8..c9e84e9 100755 --- a/kcc/image.py +++ b/kcc/image.py @@ -123,21 +123,21 @@ class ComicPage: if not color and not forcepng: self.image = self.image.convert('L') if self.rotated: - suffix += "_kccrot" + suffix += "-kccrot" if wipe: os.remove(os.path.join(targetdir, self.filename)) else: - suffix += "_kcchq" + suffix += "-kcchq" if self.noPV: - suffix += "_kccnpv" + suffix += "-kccnpv" else: if self.noHPV: - suffix += "_kccnh" + suffix += "-kccnh" if self.noVPV: - suffix += "_kccnv" + suffix += "-kccnv" if self.border: - suffix += "_kccxl" + str(self.border[0]) + "_kccyu" + str(self.border[1]) + "_kccxr" +\ - str(self.border[2]) + "_kccyd" + str(self.border[3]) + suffix += "-kccxl" + str(self.border[0]) + "-kccyu" + str(self.border[1]) + "-kccxr" +\ + str(self.border[2]) + "-kccyd" + str(self.border[3]) if not self.purge: if forcepng: self.image.save(os.path.join(targetdir, os.path.splitext(self.filename)[0] + suffix + ".png"), @@ -273,8 +273,8 @@ class ComicPage: leftbox = (0, 0, width, int(height / 2)) rightbox = (0, int(height / 2), width, height) filename = os.path.splitext(self.filename) - fileone = targetdir + '/' + filename[0] + '_kcca' + filename[1] - filetwo = targetdir + '/' + filename[0] + '_kccb' + filename[1] + fileone = targetdir + '/' + filename[0] + '-kcca' + filename[1] + filetwo = targetdir + '/' + filename[0] + '-kccb' + filename[1] try: if righttoleft: pageone = self.image.crop(rightbox) From 450076e6e84a346d35392322d758fd22c16b3a1a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Jastrz=C4=99bski?= Date: Thu, 16 Jan 2014 12:48:04 +0100 Subject: [PATCH 11/50] pdfjpgextract: Python3 update --- kcc/KCC_gui.py | 2 +- kcc/pdfjpgextract.py | 17 ++++++----------- 2 files changed, 7 insertions(+), 12 deletions(-) diff --git a/kcc/KCC_gui.py b/kcc/KCC_gui.py index b8528c0..0ef137a 100644 --- a/kcc/KCC_gui.py +++ b/kcc/KCC_gui.py @@ -411,7 +411,7 @@ class WorkerThread(QtCore.QThread): GUI.progress.content = '' self.errors = True MW.addMessage.emit(str(warn), 'warning', False) - MW.addMessage.emit('Failed to create output file!', 'warning', False) + MW.addMessage.emit('Failed to create output file!', 'error', False) MW.addTrayMessage.emit('Failed to create output file!', 'Critical') except Exception as err: GUI.progress.content = '' diff --git a/kcc/pdfjpgextract.py b/kcc/pdfjpgextract.py index e322bdf..96ac979 100644 --- a/kcc/pdfjpgextract.py +++ b/kcc/pdfjpgextract.py @@ -28,7 +28,6 @@ from random import choice from string import ascii_uppercase, digits -#TODO: Check entire code. Replacing file() with open() is not enought. class PdfJpgExtract: def __init__(self, origFileName): self.origFileName = origFileName @@ -40,38 +39,34 @@ class PdfJpgExtract: return self.path def extract(self): - pdf = open(self.origFileName, "r").read() - - startmark = "\xff\xd8" + pdf = open(self.origFileName, "rb").read() + startmark = b"\xff\xd8" startfix = 0 - endmark = "\xff\xd9" + endmark = b"\xff\xd9" endfix = 2 i = 0 - njpg = 0 os.makedirs(self.path) while True: - istream = pdf.find("stream", i) + istream = pdf.find(b"stream", i) if istream < 0: break istart = pdf.find(startmark, istream, istream + 20) if istart < 0: i = istream + 20 continue - iend = pdf.find("endstream", istart) + iend = pdf.find(b"endstream", istart) if iend < 0: raise Exception("Didn't find end of stream!") iend = pdf.find(endmark, iend - 20) if iend < 0: raise Exception("Didn't find end of JPG!") - istart += startfix iend += endfix jpg = pdf[istart:iend] jpgfile = open(self.path + "/jpg%d.jpg" % njpg, "wb") - jpgfile.write(bytearray(jpg, 'utf-8')) + jpgfile.write(jpg) jpgfile.close() - njpg += 1 i = iend return self.path, njpg From f12361e7cfa3767d9c025446eaee9800ca7c8295 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Jastrz=C4=99bski?= Date: Thu, 16 Jan 2014 13:37:36 +0100 Subject: [PATCH 12/50] kindlesplit: Python3 update --- kcc/kindlesplit.py | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/kcc/kindlesplit.py b/kcc/kindlesplit.py index fac6253..26e017f 100644 --- a/kcc/kindlesplit.py +++ b/kcc/kindlesplit.py @@ -100,11 +100,11 @@ def nullsection(datain, secno): # make it zero-length without deleting it datalst.append(struct.pack('>L', ofs) + struct.pack('>L', flgval)) lpad = zerosecstart - (first_pdb_record + 8*nsec) if lpad > 0: - datalst.append('\0' * lpad) + datalst.append(b'\0' * lpad) datalst.append(datain[zerosecstart: secstart]) datalst.append(datain[secend:]) - dataout = "".join(str(datalst)[1:-1]) - return dataout.encode('utf-8') + dataout = b"".join(datalst) + return dataout def deletesectionrange(datain, firstsec, lastsec): # delete a range of sections @@ -130,11 +130,11 @@ def deletesectionrange(datain, firstsec, lastsec): # delete a range of sections datalst.append(struct.pack('>L', ofs) + struct.pack('>L', flgval)) lpad = newstart - (first_pdb_record + 8*(nsec - (lastsec - firstsec + 1))) if lpad > 0: - datalst.append('\0' * lpad) + datalst.append(b'\0' * lpad) datalst.append(datain[zerosecstart:firstsecstart]) datalst.append(datain[lastsecend:]) - dataout = "".join(str(datalst)[1:-1]) - return dataout.encode('utf-8') + dataout = b"".join(datalst) + return dataout def insertsection(datain, secno, secdata): # insert a new section @@ -160,18 +160,17 @@ def insertsection(datain, secno, secdata): # insert a new section datalst.append(struct.pack('>L', ofs) + struct.pack('>L', flgval)) lpad = newstart - (first_pdb_record + 8*(nsec + 1)) if lpad > 0: - datalst.append('\0' * lpad) + datalst.append(b'\0' * lpad) datalst.append(datain[zerosecstart:secstart]) datalst.append(secdata) datalst.append(datain[secstart:]) - dataout = "".join(str(datalst)[1:-1]) - return dataout.encode('utf-8') + dataout = b"".join(datalst) + return dataout def insertsectionrange(sectionsource, firstsec, lastsec, sectiontarget, targetsec): # insert a range of sections dataout = sectiontarget for idx in range(lastsec, firstsec-1, -1): - print(dataout) dataout = insertsection(dataout, targetsec, readsection(sectionsource, idx)) return dataout @@ -287,7 +286,7 @@ class mobi_split: # datain_rec0 = del_exth(datain_rec0,534) # don't remove the EXTH 125 KF8 Count of Resources, seems to be present in mobi6 files as well # set the EXTH 129 KF8 Masthead / Cover Image string to the null string - datain_rec0 = write_exth(datain_rec0, 129, '') + datain_rec0 = write_exth(datain_rec0, 129, b'') # don't remove the EXTH 131 KF8 Unidentified Count, seems to be present in mobi6 files as well # Make sure we have an ASIN & cdeType set... From 0f446292736b8b12ecf3a88a6382885844edd400 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Jastrz=C4=99bski?= Date: Thu, 16 Jan 2014 13:56:37 +0100 Subject: [PATCH 13/50] Dropping unnecessary debug --- kcc/KCC_gui.py | 2 -- kcc/cbxarchive.py | 1 - kcc/comic2ebook.py | 4 +--- 3 files changed, 1 insertion(+), 6 deletions(-) diff --git a/kcc/KCC_gui.py b/kcc/KCC_gui.py index 0ef137a..bc72681 100644 --- a/kcc/KCC_gui.py +++ b/kcc/KCC_gui.py @@ -289,7 +289,6 @@ class KindleUnpackThread(QtCore.QRunnable): open(mobiPath, 'wb').write(mobisplit.getResult()) self.signals.result.emit([True]) except Exception as err: - traceback.print_exc() self.signals.result.emit([False, format(err)]) @@ -729,7 +728,6 @@ class KCCGUI(KCC_ui.Ui_KCC): GUI.QualityBox.setChecked(False) GUI.MangaBox.setEnabled(False) GUI.MangaBox.setChecked(False) - self.addMessage('If images will be too dark after conversion: Set Gamma to 1.0.', 'info') else: if not GUI.ProcessingBox.isChecked(): GUI.NoRotateBox.setEnabled(True) diff --git a/kcc/cbxarchive.py b/kcc/cbxarchive.py index 09ce2f9..5927226 100644 --- a/kcc/cbxarchive.py +++ b/kcc/cbxarchive.py @@ -83,7 +83,6 @@ class CBxArchive: raise OSError def extract(self, targetdir): - print("\n" + targetdir + "\n") if self.compressor == 'rar': self.extractCBR(targetdir) elif self.compressor == 'zip': diff --git a/kcc/comic2ebook.py b/kcc/comic2ebook.py index 35df89b..ff9199d 100755 --- a/kcc/comic2ebook.py +++ b/kcc/comic2ebook.py @@ -414,8 +414,6 @@ def fileImgProcess(work): applyImgOptimization(img2, opt, img) img2.saveToDir(dirpath, opt.forcepng, opt.forcecolor, True) except Exception: - import traceback - traceback.print_tb(sys.exc_info()[2]) return str(sys.exc_info()[1]) @@ -1081,4 +1079,4 @@ def checkOptions(): (int(X*1.5), int(Y*1.5))) image.ProfileData.Profiles["Custom"] = newProfile options.profile = "Custom" - options.profileData = image.ProfileData.Profiles[options.profile] \ No newline at end of file + options.profileData = image.ProfileData.Profiles[options.profile] \ No newline at end of file From a8521dbc9af24e074381322c01e97232e36ce7eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Jastrz=C4=99bski?= Date: Thu, 16 Jan 2014 18:49:51 +0100 Subject: [PATCH 14/50] Fixed multi-instance lock --- kcc.py | 16 +++++++--------- kcc/KCC_gui.py | 3 ++- kcc/comic2ebook.py | 2 +- 3 files changed, 10 insertions(+), 11 deletions(-) diff --git a/kcc.py b/kcc.py index ea8fe68..74a02e6 100644 --- a/kcc.py +++ b/kcc.py @@ -87,8 +87,7 @@ class QApplicationMessaging(QtWidgets.QApplication): self._running = True else: self._running = False - if not self._memory.create(1): - raise RuntimeError(self._memory.errorString().toLocal8Bit().data()) + self._memory.create(1) self._key = 'KCC' self._timeout = 1000 self._server = QtNetwork.QLocalServer(self) @@ -96,6 +95,10 @@ class QApplicationMessaging(QtWidgets.QApplication): self._server.newConnection.connect(self.handleMessage) self._server.listen(self._key) + def __del__(self): + if self._memory.isAttached(): + self._memory.detach() + def isRunning(self): return self._running @@ -137,13 +140,8 @@ if __name__ == "__main__": KCCAplication.sendMessage(sys.argv[1]) sys.exit(0) else: - messageBox = QtWidgets.QMessageBox() - icon = QtGui.QIcon() - icon.addPixmap(QtGui.QPixmap(':/Icon/icons/comic2ebook.png'), QtGui.QIcon.Normal, QtGui.QIcon.Off) - messageBox.setWindowIcon(icon) - QtWidgets.QMessageBox.critical(messageBox, 'KCC - Error', 'KCC is already running!', - QtWidgets.QMessageBox.Ok) - sys.exit(1) + KCCAplication.sendMessage('ARISE') + sys.exit(0) KCCWindow = QMainWindowKCC() KCCUI = KCC_gui.KCCGUI(KCCAplication, KCCWindow) if len(sys.argv) > 1: diff --git a/kcc/KCC_gui.py b/kcc/KCC_gui.py index bc72681..03618af 100644 --- a/kcc/KCC_gui.py +++ b/kcc/KCC_gui.py @@ -945,7 +945,8 @@ class KCCGUI(KCC_ui.Ui_KCC): def handleMessage(self, message): MW.raise_() MW.activateWindow() - if not self.conversionAlive: + message = message.decode('UTF-8') + if not self.conversionAlive and message != 'ARISE': if self.needClean: self.needClean = False GUI.JobList.clear() diff --git a/kcc/comic2ebook.py b/kcc/comic2ebook.py index ff9199d..d3d45e7 100755 --- a/kcc/comic2ebook.py +++ b/kcc/comic2ebook.py @@ -1079,4 +1079,4 @@ def checkOptions(): (int(X*1.5), int(Y*1.5))) image.ProfileData.Profiles["Custom"] = newProfile options.profile = "Custom" - options.profileData = image.ProfileData.Profiles[options.profile] \ No newline at end of file + options.profileData = image.ProfileData.Profiles[options.profile] \ No newline at end of file From c7e9d883fab8f3375cc1ae506b2e1c12a24a0dd2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Jastrz=C4=99bski?= Date: Thu, 16 Jan 2014 19:17:49 +0100 Subject: [PATCH 15/50] Manga mode is now always available (close #78) --- kcc/KCC_gui.py | 61 +++++++++++++++++++++++++------------------------- 1 file changed, 30 insertions(+), 31 deletions(-) diff --git a/kcc/KCC_gui.py b/kcc/KCC_gui.py index 03618af..19833ad 100644 --- a/kcc/KCC_gui.py +++ b/kcc/KCC_gui.py @@ -601,12 +601,12 @@ class KCCGUI(KCC_ui.Ui_KCC): def modeBasic(self): self.currentMode = 1 if sys.platform.startswith('darwin'): - MW.setMinimumSize(QtCore.QSize(420, 291)) MW.setMaximumSize(QtCore.QSize(420, 291)) + MW.setMinimumSize(QtCore.QSize(420, 291)) MW.resize(420, 291) else: - MW.setMinimumSize(QtCore.QSize(420, 287)) MW.setMaximumSize(QtCore.QSize(420, 287)) + MW.setMinimumSize(QtCore.QSize(420, 287)) MW.resize(420, 287) GUI.BasicModeButton.setEnabled(True) GUI.AdvModeButton.setEnabled(True) @@ -634,8 +634,8 @@ class KCCGUI(KCC_ui.Ui_KCC): def modeAdvanced(self): self.currentMode = 2 - MW.setMinimumSize(QtCore.QSize(420, 365)) MW.setMaximumSize(QtCore.QSize(420, 365)) + MW.setMinimumSize(QtCore.QSize(420, 365)) MW.resize(420, 365) GUI.BasicModeButton.setEnabled(True) GUI.AdvModeButton.setEnabled(True) @@ -663,8 +663,8 @@ class KCCGUI(KCC_ui.Ui_KCC): def modeExpert(self): self.currentMode = 3 - MW.setMinimumSize(QtCore.QSize(420, 397)) MW.setMaximumSize(QtCore.QSize(420, 397)) + MW.setMinimumSize(QtCore.QSize(420, 397)) MW.resize(420, 397) GUI.BasicModeButton.setEnabled(False) GUI.AdvModeButton.setEnabled(False) @@ -732,7 +732,6 @@ class KCCGUI(KCC_ui.Ui_KCC): if not GUI.ProcessingBox.isChecked(): GUI.NoRotateBox.setEnabled(True) GUI.QualityBox.setEnabled(True) - if GUI.profiles[str(GUI.DeviceBox.currentText())]['MangaMode']: GUI.MangaBox.setEnabled(True) def toggleNoSplitRotate(self, value): @@ -745,6 +744,8 @@ class KCCGUI(KCC_ui.Ui_KCC): def toggleProcessingBox(self, value): if value: + GUI.MangaBox.setEnabled(False) + GUI.MangaBox.setChecked(False) GUI.RotateBox.setEnabled(False) GUI.RotateBox.setChecked(False) GUI.QualityBox.setEnabled(False) @@ -764,6 +765,7 @@ class KCCGUI(KCC_ui.Ui_KCC): GUI.GammaSlider.setEnabled(False) GUI.GammaLabel.setEnabled(False) else: + GUI.MangaBox.setEnabled(True) GUI.RotateBox.setEnabled(True) GUI.UpscaleBox.setEnabled(True) GUI.NoRotateBox.setEnabled(True) @@ -776,6 +778,11 @@ class KCCGUI(KCC_ui.Ui_KCC): if GUI.profiles[str(GUI.DeviceBox.currentText())]['Quality']: GUI.QualityBox.setEnabled(True) + def toggleQualityBox(self, value): + if value == 2 and 'Kobo' in str(GUI.DeviceBox.currentText()): + self.addMessage('Kobo devices can\'t use ultra quality mode!', 'warning') + GUI.QualityBox.setCheckState(0) + def changeGamma(self, value): value = float(value) value = '%.2f' % (value/100) @@ -824,16 +831,12 @@ class KCCGUI(KCC_ui.Ui_KCC): else: tmpFormat = 0 GUI.FormatBox.setCurrentIndex(tmpFormat) - if (str(GUI.FormatBox.currentText()) == 'CBZ' and not 'Kobo' in str(GUI.DeviceBox.currentText())) or \ - GUI.WebtoonBox.isChecked(): + if GUI.WebtoonBox.isChecked(): GUI.MangaBox.setEnabled(False) GUI.QualityBox.setEnabled(False) GUI.MangaBox.setChecked(False) GUI.QualityBox.setChecked(False) else: - GUI.MangaBox.setEnabled(profile['MangaMode']) - if not profile['MangaMode']: - GUI.MangaBox.setChecked(False) GUI.QualityBox.setEnabled(profile['Quality']) if not profile['Quality']: GUI.QualityBox.setChecked(False) @@ -900,11 +903,6 @@ class KCCGUI(KCC_ui.Ui_KCC): self.addMessage('Target resolution is not set!', 'error') self.needClean = True return - if 'Kobo' in str(GUI.DeviceBox.currentText()) and GUI.QualityBox.checkState() == 2: - GUI.JobList.clear() - self.addMessage('Kobo devices can\'t use ultra quality mode!', 'error') - self.needClean = True - return self.worker.start() def hideProgressBar(self): @@ -1017,37 +1015,37 @@ class KCCGUI(KCC_ui.Ui_KCC): self.tray.show() self.profiles = { - "Kindle Paperwhite": {'MangaMode': True, 'Quality': True, 'ForceExpert': False, 'DefaultFormat': 0, + "Kindle Paperwhite": {'Quality': True, 'ForceExpert': False, 'DefaultFormat': 0, 'DefaultUpscale': False, 'Label': 'KHD'}, - "Kindle": {'MangaMode': True, 'Quality': True, 'ForceExpert': False, 'DefaultFormat': 0, + "Kindle": {'Quality': True, 'ForceExpert': False, 'DefaultFormat': 0, 'DefaultUpscale': False, 'Label': 'K345'}, - "Kindle DX/DXG": {'MangaMode': False, 'Quality': False, 'ForceExpert': False, 'DefaultFormat': 0, + "Kindle DX/DXG": {'Quality': False, 'ForceExpert': False, 'DefaultFormat': 0, 'DefaultUpscale': False, 'Label': 'KDX'}, - "Kindle Fire": {'MangaMode': True, 'Quality': True, 'ForceExpert': False, 'DefaultFormat': 0, + "Kindle Fire": {'Quality': True, 'ForceExpert': False, 'DefaultFormat': 0, 'DefaultUpscale': False, 'Label': 'KF'}, - "K. Fire HD 7\"": {'MangaMode': True, 'Quality': True, 'ForceExpert': False, 'DefaultFormat': 0, + "K. Fire HD 7\"": {'Quality': True, 'ForceExpert': False, 'DefaultFormat': 0, 'DefaultUpscale': True, 'Label': 'KFHD'}, - "K. Fire HD 8.9\"": {'MangaMode': True, 'Quality': True, 'ForceExpert': False, 'DefaultFormat': 0, + "K. Fire HD 8.9\"": {'Quality': True, 'ForceExpert': False, 'DefaultFormat': 0, 'DefaultUpscale': True, 'Label': 'KFHD8'}, - "K. Fire HDX 7\"": {'MangaMode': True, 'Quality': True, 'ForceExpert': False, 'DefaultFormat': 0, + "K. Fire HDX 7\"": {'Quality': True, 'ForceExpert': False, 'DefaultFormat': 0, 'DefaultUpscale': True, 'Label': 'KFHDX'}, - "K. Fire HDX 8.9\"": {'MangaMode': True, 'Quality': True, 'ForceExpert': False, 'DefaultFormat': 0, + "K. Fire HDX 8.9\"": {'Quality': True, 'ForceExpert': False, 'DefaultFormat': 0, 'DefaultUpscale': True, 'Label': 'KFHDX8'}, - "Kobo Mini/Touch": {'MangaMode': False, 'Quality': True, 'ForceExpert': False, 'DefaultFormat': 2, + "Kobo Mini/Touch": {'Quality': True, 'ForceExpert': False, 'DefaultFormat': 2, 'DefaultUpscale': False, 'Label': 'KoMT'}, - "Kobo Glow": {'MangaMode': False, 'Quality': True, 'ForceExpert': False, 'DefaultFormat': 2, + "Kobo Glow": {'Quality': True, 'ForceExpert': False, 'DefaultFormat': 2, 'DefaultUpscale': False, 'Label': 'KoG'}, - "Kobo Aura": {'MangaMode': False, 'Quality': True, 'ForceExpert': False, 'DefaultFormat': 2, + "Kobo Aura": {'Quality': True, 'ForceExpert': False, 'DefaultFormat': 2, 'DefaultUpscale': False, 'Label': 'KoA'}, - "Kobo Aura HD": {'MangaMode': False, 'Quality': True, 'ForceExpert': False, 'DefaultFormat': 2, + "Kobo Aura HD": {'Quality': True, 'ForceExpert': False, 'DefaultFormat': 2, 'DefaultUpscale': False, 'Label': 'KoAHD'}, - "Other": {'MangaMode': False, 'Quality': False, 'ForceExpert': True, 'DefaultFormat': 1, + "Other": {'Quality': False, 'ForceExpert': True, 'DefaultFormat': 1, 'DefaultUpscale': False, 'Label': 'OTHER'}, - "Kindle for Android": {'MangaMode': True, 'Quality': False, 'ForceExpert': True, 'DefaultFormat': 0, + "Kindle for Android": {'Quality': False, 'ForceExpert': True, 'DefaultFormat': 0, 'DefaultUpscale': False, 'Label': 'KFA'}, - "Kindle 1": {'MangaMode': False, 'Quality': False, 'ForceExpert': False, 'DefaultFormat': 0, + "Kindle 1": {'Quality': False, 'ForceExpert': False, 'DefaultFormat': 0, 'DefaultUpscale': False, 'Label': 'K1'}, - "Kindle 2": {'MangaMode': False, 'Quality': False, 'ForceExpert': False, 'DefaultFormat': 0, + "Kindle 2": {'Quality': False, 'ForceExpert': False, 'DefaultFormat': 0, 'DefaultUpscale': False, 'Label': 'K2'} } profilesGUI = [ @@ -1143,6 +1141,7 @@ class KCCGUI(KCC_ui.Ui_KCC): GUI.NoRotateBox.stateChanged.connect(self.toggleNoSplitRotate) GUI.WebtoonBox.stateChanged.connect(self.toggleWebtoonBox) GUI.ProcessingBox.stateChanged.connect(self.toggleProcessingBox) + GUI.QualityBox.stateChanged.connect(self.toggleQualityBox) GUI.DeviceBox.activated.connect(self.changeDevice) GUI.FormatBox.activated.connect(self.changeFormat) MW.progressBarTick.connect(self.updateProgressbar) From 170064853c794d784df535aa746d83f02948a16d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Jastrz=C4=99bski?= Date: Thu, 16 Jan 2014 22:11:06 +0100 Subject: [PATCH 16/50] Added drag & drop support --- kcc/KCC_gui.py | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/kcc/KCC_gui.py b/kcc/KCC_gui.py index 19833ad..ccb300b 100644 --- a/kcc/KCC_gui.py +++ b/kcc/KCC_gui.py @@ -712,6 +712,7 @@ class KCCGUI(KCC_ui.Ui_KCC): icon.addPixmap(QtGui.QPixmap(":/Other/icons/convert.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) GUI.ConvertButton.setIcon(icon) GUI.ConvertButton.setText('Convert') + GUI.Form.setAcceptDrops(True) else: self.conversionAlive = True self.worker.sync() @@ -719,6 +720,7 @@ class KCCGUI(KCC_ui.Ui_KCC): icon.addPixmap(QtGui.QPixmap(":/Other/icons/clear.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) GUI.ConvertButton.setIcon(icon) GUI.ConvertButton.setText('Abort') + GUI.Form.setAcceptDrops(False) def toggleWebtoonBox(self, value): if value: @@ -943,7 +945,8 @@ class KCCGUI(KCC_ui.Ui_KCC): def handleMessage(self, message): MW.raise_() MW.activateWindow() - message = message.decode('UTF-8') + if type(message) is bytes: + message = message.decode('UTF-8') if not self.conversionAlive and message != 'ARISE': if self.needClean: self.needClean = False @@ -967,6 +970,16 @@ class KCCGUI(KCC_ui.Ui_KCC): else: self.addMessage('This file type is unsupported!', 'error') + def dragAndDrop(self, e): + e.accept() + + def dragAndDropAccepted(self, e): + for message in e.mimeData().urls(): + message = urllib.parse.unquote(message.toString().replace('file:///', '')) + if sys.platform.startswith('win'): + message = message.replace('/', '\\') + self.handleMessage(message) + # noinspection PyArgumentList def __init__(self, KCCAplication, KCCWindow): global APP, MW, GUI @@ -1152,6 +1165,10 @@ class KCCGUI(KCC_ui.Ui_KCC): MW.hideProgressBar.connect(self.hideProgressBar) MW.closeEvent = self.saveSettings + GUI.Form.setAcceptDrops(True) + GUI.Form.dragEnterEvent = self.dragAndDrop + GUI.Form.dropEvent = self.dragAndDropAccepted + for profile in profilesGUI: if profile == "Other": GUI.DeviceBox.addItem(self.icons.deviceOther, profile) From 65ef77bace080a2ac39e0768e63d5b3575f7c6a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Jastrz=C4=99bski?= Date: Fri, 17 Jan 2014 09:31:51 +0100 Subject: [PATCH 17/50] Improved NCX creation (close #79) --- kcc/comic2ebook.py | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/kcc/comic2ebook.py b/kcc/comic2ebook.py index d3d45e7..9c990e2 100755 --- a/kcc/comic2ebook.py +++ b/kcc/comic2ebook.py @@ -187,7 +187,7 @@ def buildHTML(path, imgfile): return path, imgfile -def buildNCX(dstdir, title, chapters): +def buildNCX(dstdir, title, chapters, chapterNames): options.uuid = str(uuid4()) ncxfile = os.path.join(dstdir, 'OEBPS', 'toc.ncx') f = open(ncxfile, "w", encoding='UTF-8') @@ -208,7 +208,7 @@ def buildNCX(dstdir, title, chapters): for chapter in chapters: folder = chapter[0].replace(os.path.join(dstdir, 'OEBPS'), '').lstrip('/').lstrip('\\\\') if os.path.basename(folder) != "Text": - title = os.path.basename(folder) + title = chapterNames[os.path.basename(folder)] filename = getImageFileName(os.path.join(folder, chapter[1])) f.write("" + title + " 1: filepath.append(getOutputFilename(args[0], options.output, '.epub', ' ' + str(tomeNumber))) From 509d78c0a6bc182fbb3d069bfecf342b78ad983e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Jastrz=C4=99bski?= Date: Fri, 17 Jan 2014 12:25:20 +0100 Subject: [PATCH 18/50] Updated OSX setup --- other/qt.conf | 3 +++ setup.py | 14 +++++++------- 2 files changed, 10 insertions(+), 7 deletions(-) create mode 100644 other/qt.conf diff --git a/other/qt.conf b/other/qt.conf new file mode 100644 index 0000000..d9a44c7 --- /dev/null +++ b/other/qt.conf @@ -0,0 +1,3 @@ +; Qt Configuration file +[Paths] +Plugins = PlugIns diff --git a/setup.py b/setup.py index dbea2f2..c8a6e38 100644 --- a/setup.py +++ b/setup.py @@ -23,12 +23,9 @@ if platform == "darwin": py2app=dict( argv_emulation=True, iconfile='icons/comic2ebook.icns', - includes=['PIL', 'sip', 'PyQt4', 'PyQt4.QtCore', 'PyQt4.QtGui', 'PyQt4.QtNetwork'], - qt_plugins=[], - excludes=['PyQt4.QtDeclarative', 'PyQt4.QtDesigner', 'PyQt4.QtHelp', 'PyQt4.QtMultimedia', - 'PyQt4.QtOpenGL', 'PyQt4.QtScript', 'PyQt4.QtScriptTools', 'PyQt4.QtSql', 'PyQt4.QtSvg', - 'PyQt4.QtXmlPatterns', 'PyQt4.QtXml', 'PyQt4.QtWebKit', 'PyQt4.QtTest', 'Tkinter'], - resources=['LICENSE.txt', 'other/Additional-LICENSE.txt', 'other/unrar', 'other/7za'], + includes=['PIL', 'sip', 'PyQt5', 'PyQt5.QtCore', 'PyQt5.QtGui', 'PyQt5.QtNetwork', 'PyQt5.QtWidgets', + 'PyQt5.QtPrintSupport'], + resources=['LICENSE.txt', 'other/qt.conf', 'other/Additional-LICENSE.txt', 'other/unrar', 'other/7za'], plist=dict( CFBundleName=NAME, CFBundleShortVersionString=VERSION, @@ -90,6 +87,9 @@ setup( ) if platform == "darwin": - from os import chmod + from os import chmod, makedirs + from shutil import copyfile + makedirs('dist/' + NAME + '.app/Contents/PlugIns/platform') + copyfile('other/libqcocoa.dylib', 'dist/' + NAME + '.app/Contents/PlugIns/platform') chmod('dist/' + NAME + '.app/Contents/Resources/unrar', 0o777) chmod('dist/' + NAME + '.app/Contents/Resources/7za', 0o777) \ No newline at end of file From b0c6315feefb3a265ff1870f06a1c5b442ec9bc5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Jastrz=C4=99bski?= Date: Fri, 17 Jan 2014 12:34:05 +0100 Subject: [PATCH 19/50] Updated Windows setup + OSX fix --- other/QT-4.8.5-QListWidget.patch | 35 -------------------------------- setup.py | 6 +++--- 2 files changed, 3 insertions(+), 38 deletions(-) delete mode 100644 other/QT-4.8.5-QListWidget.patch diff --git a/other/QT-4.8.5-QListWidget.patch b/other/QT-4.8.5-QListWidget.patch deleted file mode 100644 index 130e562..0000000 --- a/other/QT-4.8.5-QListWidget.patch +++ /dev/null @@ -1,35 +0,0 @@ ---- qt-4.8.5/src/gui/kernel/qwidget_mac.mm 2013-06-07 07:16:59.000000000 +0200 -+++ qt-4.8.5-fix/src/gui/kernel/qwidget_mac.mm 2013-10-11 23:00:15.000000000 +0200 -@@ -4715,15 +4715,13 @@ void QWidgetPrivate::scroll_sys(int dx, - } - - // Scroll the whole widget if qscrollRect is not valid: -- QRect validScrollRect = qscrollRect.isValid() ? qscrollRect : q->rect(); -- validScrollRect &= clipRect(); -+ QRect validScrollRect = qscrollRect.isValid() ? qscrollRect : QRect(0, 0, q->width(), q->height()); - - // If q is overlapped by other widgets, we cannot just blit pixels since - // this will move overlapping widgets as well. In case we just update: - const bool overlapped = isOverlapped(validScrollRect.translated(data.crect.topLeft())); - const bool accelerateScroll = accelEnv && isOpaque && !overlapped; - const bool isAlien = (q->internalWinId() == 0); -- const QPoint scrollDelta(dx, dy); - - // If qscrollRect is valid, we are _not_ supposed to scroll q's children (as documented). - // But we do scroll children (and the whole of q) if qscrollRect is invalid. This case is -@@ -4745,7 +4743,6 @@ void QWidgetPrivate::scroll_sys(int dx, - }else { - update_sys(qscrollRect); - } -- return; - } - - #ifdef QT_MAC_USE_COCOA -@@ -4762,6 +4759,7 @@ void QWidgetPrivate::scroll_sys(int dx, - // moved when the parent is scrolled. All directly or indirectly moved - // children will receive a move event before the function call returns. - QWidgetList movedChildren; -+ const QPoint scrollDelta(dx, dy); - if (scrollChildren) { - QObjectList children = q->children(); - diff --git a/setup.py b/setup.py index c8a6e38..3c83f75 100644 --- a/setup.py +++ b/setup.py @@ -59,7 +59,7 @@ elif platform == "win32": ['other/7za.exe', '7za.exe'], ['other/Additional-LICENSE.txt', 'Additional-LICENSE.txt'] ], "compressed": True, - "excludes": ['Tkinter']}}, + "excludes": ['tkinter']}}, executables=[Executable(MAIN, base=base, targetName="KCC.exe", @@ -89,7 +89,7 @@ setup( if platform == "darwin": from os import chmod, makedirs from shutil import copyfile - makedirs('dist/' + NAME + '.app/Contents/PlugIns/platform') - copyfile('other/libqcocoa.dylib', 'dist/' + NAME + '.app/Contents/PlugIns/platform') + makedirs('dist/' + NAME + '.app/Contents/PlugIns/platforms') + copyfile('other/libqcocoa.dylib', 'dist/' + NAME + '.app/Contents/PlugIns/platforms/libqcocoa.dylib') chmod('dist/' + NAME + '.app/Contents/Resources/unrar', 0o777) chmod('dist/' + NAME + '.app/Contents/Resources/7za', 0o777) \ No newline at end of file From aaa2de81fc0a1c220f3e0ba2ecb0814355c8ad28 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Jastrz=C4=99bski?= Date: Fri, 17 Jan 2014 14:37:58 +0100 Subject: [PATCH 20/50] Updated Inno Setup --- kcc.iss | 64 +++++++++++++-------------------------------------------- 1 file changed, 14 insertions(+), 50 deletions(-) diff --git a/kcc.iss b/kcc.iss index 6a8df5c..f964c53 100644 --- a/kcc.iss +++ b/kcc.iss @@ -42,56 +42,20 @@ Name: "CB7association"; Description: "CB7"; GroupDescription: "File associations [Files] ; x64 files -Source: "build\exe.win-amd64-2.7\{#MyAppExeName}"; DestDir: "{app}"; Flags: ignoreversion; Check: Is64BitInstallMode -Source: "build\exe.win-amd64-2.7\_ctypes.pyd"; DestDir: "{app}"; Flags: ignoreversion; Check: Is64BitInstallMode -Source: "build\exe.win-amd64-2.7\_hashlib.pyd"; DestDir: "{app}"; Flags: ignoreversion; Check: Is64BitInstallMode -Source: "build\exe.win-amd64-2.7\_multiprocessing.pyd"; DestDir: "{app}"; Flags: ignoreversion; Check: Is64BitInstallMode -Source: "build\exe.win-amd64-2.7\_socket.pyd"; DestDir: "{app}"; Flags: ignoreversion; Check: Is64BitInstallMode -Source: "build\exe.win-amd64-2.7\_ssl.pyd"; DestDir: "{app}"; Flags: ignoreversion; Check: Is64BitInstallMode -Source: "build\exe.win-amd64-2.7\bz2.pyd"; DestDir: "{app}"; Flags: ignoreversion; Check: Is64BitInstallMode -Source: "build\exe.win-amd64-2.7\LIBEAY32.dll"; DestDir: "{app}"; Flags: ignoreversion; Check: Is64BitInstallMode -Source: "build\exe.win-amd64-2.7\library.zip"; DestDir: "{app}"; Flags: ignoreversion; Check: Is64BitInstallMode -Source: "build\exe.win-amd64-2.7\PIL._imaging.pyd"; DestDir: "{app}"; Flags: ignoreversion; Check: Is64BitInstallMode -Source: "build\exe.win-amd64-2.7\PIL._imagingft.pyd"; DestDir: "{app}"; Flags: ignoreversion; Check: Is64BitInstallMode -Source: "build\exe.win-amd64-2.7\pyexpat.pyd"; DestDir: "{app}"; Flags: ignoreversion; Check: Is64BitInstallMode -Source: "build\exe.win-amd64-2.7\PyQt4.QtCore.pyd"; DestDir: "{app}"; Flags: ignoreversion; Check: Is64BitInstallMode -Source: "build\exe.win-amd64-2.7\PyQt4.QtGui.pyd"; DestDir: "{app}"; Flags: ignoreversion; Check: Is64BitInstallMode -Source: "build\exe.win-amd64-2.7\PyQt4.QtNetwork.pyd"; DestDir: "{app}"; Flags: ignoreversion; Check: Is64BitInstallMode -Source: "build\exe.win-amd64-2.7\python27.dll"; DestDir: "{app}"; Flags: ignoreversion; Check: Is64BitInstallMode -Source: "build\exe.win-amd64-2.7\QtCore4.dll"; DestDir: "{app}"; Flags: ignoreversion; Check: Is64BitInstallMode -Source: "build\exe.win-amd64-2.7\QtGui4.dll"; DestDir: "{app}"; Flags: ignoreversion; Check: Is64BitInstallMode -Source: "build\exe.win-amd64-2.7\QtNetwork4.dll"; DestDir: "{app}"; Flags: ignoreversion; Check: Is64BitInstallMode -Source: "build\exe.win-amd64-2.7\select.pyd"; DestDir: "{app}"; Flags: ignoreversion; Check: Is64BitInstallMode -Source: "build\exe.win-amd64-2.7\sip.pyd"; DestDir: "{app}"; Flags: ignoreversion; Check: Is64BitInstallMode -Source: "build\exe.win-amd64-2.7\SSLEAY32.dll"; DestDir: "{app}"; Flags: ignoreversion; Check: Is64BitInstallMode -Source: "build\exe.win-amd64-2.7\unicodedata.pyd"; DestDir: "{app}"; Flags: ignoreversion; Check: Is64BitInstallMode -Source: "build\exe.win-amd64-2.7\_psutil_mswindows.pyd"; DestDir: "{app}"; Flags: ignoreversion; Check: Is64BitInstallMode +Source: "build\exe.win-amd64-3.3\imageformats\*"; DestDir: "{app}\imageformats\"; Flags: ignoreversion; Check: Is64BitInstallMode +Source: "build\exe.win-amd64-3.3\platforms\*"; DestDir: "{app}\platforms\"; Flags: ignoreversion; Check: Is64BitInstallMode +Source: "build\exe.win-amd64-3.3\{#MyAppExeName}"; DestDir: "{app}"; Flags: ignoreversion; Check: Is64BitInstallMode +Source: "build\exe.win-amd64-3.3\*.pyd"; DestDir: "{app}"; Flags: ignoreversion; Check: Is64BitInstallMode +Source: "build\exe.win-amd64-3.3\*.dll"; DestDir: "{app}"; Flags: ignoreversion; Check: Is64BitInstallMode +Source: "build\exe.win-amd64-3.3\*.zip"; DestDir: "{app}"; Flags: ignoreversion; Check: Is64BitInstallMode Source: "other\vcredist_x64.exe"; DestDir: "{tmp}"; Flags: ignoreversion deleteafterinstall; Check: Is64BitInstallMode ; x86 files -Source: "build\exe.win32-2.7\{#MyAppExeName}"; DestDir: "{app}"; Flags: ignoreversion solidbreak; Check: not Is64BitInstallMode -Source: "build\exe.win32-2.7\_ctypes.pyd"; DestDir: "{app}"; Flags: ignoreversion; Check: not Is64BitInstallMode -Source: "build\exe.win32-2.7\_hashlib.pyd"; DestDir: "{app}"; Flags: ignoreversion; Check: not Is64BitInstallMode -Source: "build\exe.win32-2.7\_multiprocessing.pyd"; DestDir: "{app}"; Flags: ignoreversion; Check: not Is64BitInstallMode -Source: "build\exe.win32-2.7\_socket.pyd"; DestDir: "{app}"; Flags: ignoreversion; Check: not Is64BitInstallMode -Source: "build\exe.win32-2.7\_ssl.pyd"; DestDir: "{app}"; Flags: ignoreversion; Check: not Is64BitInstallMode -Source: "build\exe.win32-2.7\bz2.pyd"; DestDir: "{app}"; Flags: ignoreversion; Check: not Is64BitInstallMode -Source: "build\exe.win32-2.7\LIBEAY32.dll"; DestDir: "{app}"; Flags: ignoreversion; Check: not Is64BitInstallMode -Source: "build\exe.win32-2.7\library.zip"; DestDir: "{app}"; Flags: ignoreversion; Check: not Is64BitInstallMode -Source: "build\exe.win32-2.7\PIL._imaging.pyd"; DestDir: "{app}"; Flags: ignoreversion; Check: not Is64BitInstallMode -Source: "build\exe.win32-2.7\PIL._imagingft.pyd"; DestDir: "{app}"; Flags: ignoreversion; Check: not Is64BitInstallMode -Source: "build\exe.win32-2.7\pyexpat.pyd"; DestDir: "{app}"; Flags: ignoreversion; Check: not Is64BitInstallMode -Source: "build\exe.win32-2.7\PyQt4.QtCore.pyd"; DestDir: "{app}"; Flags: ignoreversion; Check: not Is64BitInstallMode -Source: "build\exe.win32-2.7\PyQt4.QtGui.pyd"; DestDir: "{app}"; Flags: ignoreversion; Check: not Is64BitInstallMode -Source: "build\exe.win32-2.7\PyQt4.QtNetwork.pyd"; DestDir: "{app}"; Flags: ignoreversion; Check: not Is64BitInstallMode -Source: "build\exe.win32-2.7\python27.dll"; DestDir: "{app}"; Flags: ignoreversion; Check: not Is64BitInstallMode -Source: "build\exe.win32-2.7\QtCore4.dll"; DestDir: "{app}"; Flags: ignoreversion; Check: not Is64BitInstallMode -Source: "build\exe.win32-2.7\QtGui4.dll"; DestDir: "{app}"; Flags: ignoreversion; Check: not Is64BitInstallMode -Source: "build\exe.win32-2.7\QtNetwork4.dll"; DestDir: "{app}"; Flags: ignoreversion; Check: not Is64BitInstallMode -Source: "build\exe.win32-2.7\select.pyd"; DestDir: "{app}"; Flags: ignoreversion; Check: not Is64BitInstallMode -Source: "build\exe.win32-2.7\sip.pyd"; DestDir: "{app}"; Flags: ignoreversion; Check: not Is64BitInstallMode -Source: "build\exe.win32-2.7\SSLEAY32.dll"; DestDir: "{app}"; Flags: ignoreversion; Check: not Is64BitInstallMode -Source: "build\exe.win32-2.7\unicodedata.pyd"; DestDir: "{app}"; Flags: ignoreversion; Check: not Is64BitInstallMode -Source: "build\exe.win32-2.7\_psutil_mswindows.pyd"; DestDir: "{app}"; Flags: ignoreversion; Check: not Is64BitInstallMode +Source: "build\exe.win32-3.3\imageformats\*"; DestDir: "{app}\imageformats\"; Flags: ignoreversion; Check: not Is64BitInstallMode +Source: "build\exe.win32-3.3\platforms\*"; DestDir: "{app}\platforms\"; Flags: ignoreversion; Check: not Is64BitInstallMode +Source: "build\exe.win32-3.3\{#MyAppExeName}"; DestDir: "{app}"; Flags: ignoreversion; Check: not Is64BitInstallMode +Source: "build\exe.win32-3.3\*.pyd"; DestDir: "{app}"; Flags: ignoreversion; Check: not Is64BitInstallMode +Source: "build\exe.win32-3.3\*.dll"; DestDir: "{app}"; Flags: ignoreversion; Check: not Is64BitInstallMode +Source: "build\exe.win32-3.3\*.zip"; DestDir: "{app}"; Flags: ignoreversion; Check: not Is64BitInstallMode Source: "other\vcredist_x86.exe"; DestDir: "{tmp}"; Flags: ignoreversion deleteafterinstall; Check: not Is64BitInstallMode ; Common files Source: "LICENSE.txt"; DestDir: "{app}"; Flags: ignoreversion solidbreak @@ -106,8 +70,8 @@ Name: "{commondesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: [Run] Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent -Filename: "{tmp}\vcredist_x64.exe"; Parameters: "/passive /Q:a /c:""msiexec /qb /i vcredist.msi"" "; StatusMsg: "Installing Microsoft Visual C++ 2008 Redistributable Package..."; Check: Is64BitInstallMode -Filename: "{tmp}\vcredist_x86.exe"; Parameters: "/passive /Q:a /c:""msiexec /qb /i vcredist.msi"" "; StatusMsg: "Installing Microsoft Visual C++ 2008 Redistributable Package..."; Check: not Is64BitInstallMode +Filename: "{tmp}\vcredist_x64.exe"; Parameters: "/passive /Q:a /c:""msiexec /qb /i vcredist.msi"" "; StatusMsg: "Installing Microsoft Visual C++ 2010 Redistributable Package..."; Check: Is64BitInstallMode +Filename: "{tmp}\vcredist_x86.exe"; Parameters: "/passive /Q:a /c:""msiexec /qb /i vcredist.msi"" "; StatusMsg: "Installing Microsoft Visual C++ 2010 Redistributable Package..."; Check: not Is64BitInstallMode [Messages] WelcomeLabel1=Welcome to the KCC Setup Wizard From b46ada95964331e26c2a75c46289f37f708af640 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Jastrz=C4=99bski?= Date: Fri, 17 Jan 2014 16:19:54 +0100 Subject: [PATCH 21/50] Drag & drop for OSX and Linux --- kcc/KCC_gui.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/kcc/KCC_gui.py b/kcc/KCC_gui.py index ccb300b..afe4d7e 100644 --- a/kcc/KCC_gui.py +++ b/kcc/KCC_gui.py @@ -978,6 +978,8 @@ class KCCGUI(KCC_ui.Ui_KCC): message = urllib.parse.unquote(message.toString().replace('file:///', '')) if sys.platform.startswith('win'): message = message.replace('/', '\\') + else: + message = '/' + message self.handleMessage(message) # noinspection PyArgumentList From 66b867c1ca7d28d394a9312d07da01e4afd05724 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Jastrz=C4=99bski?= Date: Fri, 17 Jan 2014 19:37:35 +0100 Subject: [PATCH 22/50] Various multi-os tweaks --- kcc-c2e.py | 16 ++++++++++------ kcc-c2p.py | 16 ++++++++++------ kcc.py | 20 ++++++++++---------- kcc/KCC_gui.py | 5 ++--- 4 files changed, 32 insertions(+), 25 deletions(-) diff --git a/kcc-c2e.py b/kcc-c2e.py index 76dcf81..54b2e03 100644 --- a/kcc-c2e.py +++ b/kcc-c2e.py @@ -43,12 +43,16 @@ try: except ImportError: missing.append('Pillow 2.3.0+') if len(missing) > 0: - print('ERROR: ' + ', '.join(missing) + ' is not installed!') - import tkinter - import tkinter.messagebox - importRoot = tkinter.Tk() - importRoot.withdraw() - tkinter.messagebox.showerror('KCC - Error', 'ERROR: ' + ', '.join(missing) + ' is not installed!') + try: + # noinspection PyUnresolvedReferences + import tkinter + # noinspection PyUnresolvedReferences + import tkinter.messagebox + importRoot = tkinter.Tk() + importRoot.withdraw() + tkinter.messagebox.showerror('KCC - Error', 'ERROR: ' + ', '.join(missing) + ' is not installed!') + except ImportError: + print('ERROR: ' + ', '.join(missing) + ' is not installed!') exit(1) import sys diff --git a/kcc-c2p.py b/kcc-c2p.py index a8463d4..8b3feaa 100644 --- a/kcc-c2p.py +++ b/kcc-c2p.py @@ -33,12 +33,16 @@ try: except ImportError: missing.append('Pillow 2.3.0+') if len(missing) > 0: - print('ERROR: ' + ', '.join(missing) + ' is not installed!') - import tkinter - import tkinter.messagebox - importRoot = tkinter.Tk() - importRoot.withdraw() - tkinter.messagebox.showerror('KCC - Error', 'ERROR: ' + ', '.join(missing) + ' is not installed!') + try: + # noinspection PyUnresolvedReferences + import tkinter + # noinspection PyUnresolvedReferences + import tkinter.messagebox + importRoot = tkinter.Tk() + importRoot.withdraw() + tkinter.messagebox.showerror('KCC - Error', 'ERROR: ' + ', '.join(missing) + ' is not installed!') + except ImportError: + print('ERROR: ' + ', '.join(missing) + ' is not installed!') exit(1) import sys diff --git a/kcc.py b/kcc.py index 74a02e6..95f927e 100644 --- a/kcc.py +++ b/kcc.py @@ -48,12 +48,16 @@ try: except ImportError: missing.append('Pillow 2.3.0+') if len(missing) > 0: - print('ERROR: ' + ', '.join(missing) + ' is not installed!') - import tkinter - import tkinter.messagebox - importRoot = tkinter.Tk() - importRoot.withdraw() - tkinter.messagebox.showerror('KCC - Error', 'ERROR: ' + ', '.join(missing) + ' is not installed!') + try: + # noinspection PyUnresolvedReferences + import tkinter + # noinspection PyUnresolvedReferences + import tkinter.messagebox + importRoot = tkinter.Tk() + importRoot.withdraw() + tkinter.messagebox.showerror('KCC - Error', 'ERROR: ' + ', '.join(missing) + ' is not installed!') + except ImportError: + print('ERROR: ' + ', '.join(missing) + ' is not installed!') exit(1) import sys @@ -95,10 +99,6 @@ class QApplicationMessaging(QtWidgets.QApplication): self._server.newConnection.connect(self.handleMessage) self._server.listen(self._key) - def __del__(self): - if self._memory.isAttached(): - self._memory.detach() - def isRunning(self): return self._running diff --git a/kcc/KCC_gui.py b/kcc/KCC_gui.py index afe4d7e..0cc6057 100644 --- a/kcc/KCC_gui.py +++ b/kcc/KCC_gui.py @@ -1021,13 +1021,11 @@ class KCCGUI(KCC_ui.Ui_KCC): elif sys.platform.startswith('linux'): self.listFontSize = 8 self.statusBarFontSize = 8 - self.statusBarStyle = 'QLabel{padding-top:5px;padding-bottom:3px;border-top:2px solid #C2C7CB}' - self.tray.show() + self.statusBarStyle = 'QLabel{padding-top:2px;padding-bottom:3px;border-top:2px solid #C2C7CB}' else: self.listFontSize = 9 self.statusBarFontSize = 8 self.statusBarStyle = 'QLabel{padding-top:3px;padding-bottom:3px;border-top:2px solid #C2C7CB}' - self.tray.show() self.profiles = { "Kindle Paperwhite": {'Quality': True, 'ForceExpert': False, 'DefaultFormat': 0, @@ -1212,3 +1210,4 @@ class KCCGUI(KCC_ui.Ui_KCC): MW.setWindowTitle("Kindle Comic Converter " + __version__) MW.show() MW.raise_() + self.tray.show() From 562dad02fa5a85a5e829633b73aeedcc41c1535e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Jastrz=C4=99bski?= Date: Sat, 18 Jan 2014 09:51:17 +0100 Subject: [PATCH 23/50] Miscellaneous GUI tweaks --- KCC-OSX.ui | 5 +---- kcc.py | 5 +++++ kcc/KCC_gui.py | 13 ++++++++++--- kcc/KCC_ui_osx.py | 3 +-- kcc/comic2ebook.py | 3 +-- 5 files changed, 18 insertions(+), 11 deletions(-) diff --git a/KCC-OSX.ui b/KCC-OSX.ui index 3873816..bc88ec1 100644 --- a/KCC-OSX.ui +++ b/KCC-OSX.ui @@ -581,7 +581,7 @@ 10 10 401 - 35 + 29 @@ -592,9 +592,6 @@ true - - true - 0 diff --git a/kcc.py b/kcc.py index 95f927e..727d075 100644 --- a/kcc.py +++ b/kcc.py @@ -99,6 +99,11 @@ class QApplicationMessaging(QtWidgets.QApplication): self._server.newConnection.connect(self.handleMessage) self._server.listen(self._key) + def __del__(self): + if self._memory.isAttached(): + self._memory.detach() + self._server.close() + def isRunning(self): return self._running diff --git a/kcc/KCC_gui.py b/kcc/KCC_gui.py index 0cc6057..139a282 100644 --- a/kcc/KCC_gui.py +++ b/kcc/KCC_gui.py @@ -880,6 +880,8 @@ class KCCGUI(KCC_ui.Ui_KCC): GUI.ProgressBar.setValue(GUI.ProgressBar.value() + 1) elif command.isdigit(): GUI.ProgressBar.setMaximum(int(command) - 1) + GUI.BasicModeButton.hide() + GUI.AdvModeButton.hide() GUI.ProgressBar.reset() GUI.ProgressBar.show() else: @@ -909,6 +911,8 @@ class KCCGUI(KCC_ui.Ui_KCC): def hideProgressBar(self): GUI.ProgressBar.hide() + GUI.BasicModeButton.show() + GUI.AdvModeButton.show() def saveSettings(self, event): if self.conversionAlive: @@ -1017,15 +1021,18 @@ class KCCGUI(KCC_ui.Ui_KCC): if sys.platform.startswith('darwin'): self.listFontSize = 11 self.statusBarFontSize = 10 - self.statusBarStyle = 'QLabel{padding-top:5px;padding-bottom:5px;border-top:2px solid #C2C7CB}' + self.statusBarStyle = 'QLabel{padding-top:2px;padding-bottom:3px;}' + self.ProgressBar.setStyleSheet('QProgressBar{padding-top:5px;text-align:center;}') elif sys.platform.startswith('linux'): self.listFontSize = 8 self.statusBarFontSize = 8 - self.statusBarStyle = 'QLabel{padding-top:2px;padding-bottom:3px;border-top:2px solid #C2C7CB}' + self.statusBarStyle = 'QLabel{padding-top:5px;padding-bottom:3px;}' + self.statusBar.setStyleSheet('QStatusBar::item{border:0px;border-top:2px solid #C2C7CB;}') else: self.listFontSize = 9 self.statusBarFontSize = 8 - self.statusBarStyle = 'QLabel{padding-top:3px;padding-bottom:3px;border-top:2px solid #C2C7CB}' + self.statusBarStyle = 'QLabel{padding-top:3px;padding-bottom:3px}' + self.statusBar.setStyleSheet('QStatusBar::item{border:0px;border-top:2px solid #C2C7CB;}') self.profiles = { "Kindle Paperwhite": {'Quality': True, 'ForceExpert': False, 'DefaultFormat': 0, diff --git a/kcc/KCC_ui_osx.py b/kcc/KCC_ui_osx.py index d4793ba..b58659d 100644 --- a/kcc/KCC_ui_osx.py +++ b/kcc/KCC_ui_osx.py @@ -239,14 +239,13 @@ class Ui_KCC(object): self.GammaSlider.setOrientation(QtCore.Qt.Horizontal) self.GammaSlider.setObjectName("GammaSlider") self.ProgressBar = QtWidgets.QProgressBar(self.Form) - self.ProgressBar.setGeometry(QtCore.QRect(10, 10, 401, 35)) + self.ProgressBar.setGeometry(QtCore.QRect(10, 10, 401, 29)) font = QtGui.QFont() font.setFamily("Lucida Grande") font.setPointSize(10) font.setBold(True) font.setWeight(75) self.ProgressBar.setFont(font) - self.ProgressBar.setAutoFillBackground(True) self.ProgressBar.setProperty("value", 0) self.ProgressBar.setAlignment(QtCore.Qt.AlignJustify|QtCore.Qt.AlignVCenter) self.ProgressBar.setFormat("") diff --git a/kcc/comic2ebook.py b/kcc/comic2ebook.py index 9c990e2..f2cffac 100755 --- a/kcc/comic2ebook.py +++ b/kcc/comic2ebook.py @@ -584,8 +584,7 @@ def getWorkFolder(afile): path = cbx.extract(workdir) except OSError: rmtree(workdir, True) - print('UnRAR/7za not found or file failed to extract!') - sys.exit(21) + raise UserWarning("Failed to extract file.") else: rmtree(workdir, True) raise TypeError From f8610e1cd7843d6185ce5177963aacd61de40385 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Jastrz=C4=99bski?= Date: Sat, 18 Jan 2014 10:20:43 +0100 Subject: [PATCH 24/50] Linux: Disabling systray icon --- kcc/KCC_gui.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/kcc/KCC_gui.py b/kcc/KCC_gui.py index 139a282..deff9a6 100644 --- a/kcc/KCC_gui.py +++ b/kcc/KCC_gui.py @@ -1023,16 +1023,20 @@ class KCCGUI(KCC_ui.Ui_KCC): self.statusBarFontSize = 10 self.statusBarStyle = 'QLabel{padding-top:2px;padding-bottom:3px;}' self.ProgressBar.setStyleSheet('QProgressBar{padding-top:5px;text-align:center;}') + self.tray.show() elif sys.platform.startswith('linux'): self.listFontSize = 8 self.statusBarFontSize = 8 self.statusBarStyle = 'QLabel{padding-top:5px;padding-bottom:3px;}' self.statusBar.setStyleSheet('QStatusBar::item{border:0px;border-top:2px solid #C2C7CB;}') + # Linux implementation QSystemTrayIcon is simply broken in Qt 5.2.0 + #self.tray.show() else: self.listFontSize = 9 self.statusBarFontSize = 8 self.statusBarStyle = 'QLabel{padding-top:3px;padding-bottom:3px}' self.statusBar.setStyleSheet('QStatusBar::item{border:0px;border-top:2px solid #C2C7CB;}') + self.tray.show() self.profiles = { "Kindle Paperwhite": {'Quality': True, 'ForceExpert': False, 'DefaultFormat': 0, @@ -1217,4 +1221,3 @@ class KCCGUI(KCC_ui.Ui_KCC): MW.setWindowTitle("Kindle Comic Converter " + __version__) MW.show() MW.raise_() - self.tray.show() From b1e7a88353e19b15473c34d2154804cd6cc3c3bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Jastrz=C4=99bski?= Date: Sat, 18 Jan 2014 11:14:14 +0100 Subject: [PATCH 25/50] Removing QFileDialog hack Now when KCC support drag&drop we can return to native dialog. --- kcc/KCC_gui.py | 29 ++++++----------------------- 1 file changed, 6 insertions(+), 23 deletions(-) diff --git a/kcc/KCC_gui.py b/kcc/KCC_gui.py index deff9a6..3af388a 100644 --- a/kcc/KCC_gui.py +++ b/kcc/KCC_gui.py @@ -546,29 +546,12 @@ class KCCGUI(KCC_ui.Ui_KCC): if self.needClean: self.needClean = False GUI.JobList.clear() - # Dirty, dirty way but OS native QFileDialogs don't support directory multiselect - dirDialog = QtWidgets.QFileDialog(MW, 'Select directory', self.lastPath, 'Directory (*.abcdefg)') - dirDialog.setFileMode(dirDialog.Directory) - dirDialog.setOption(dirDialog.ShowDirsOnly, True) - dirDialog.setOption(dirDialog.DontUseNativeDialog, True) - dirDialog.setOption(dirDialog.HideNameFilterDetails, True) - l = dirDialog.findChild(QtWidgets.QListView, "listView") - t = dirDialog.findChild(QtWidgets.QTreeView) - if l: - l.setSelectionMode(QtWidgets.QAbstractItemView.ExtendedSelection) - if t: - t.setSelectionMode(QtWidgets.QAbstractItemView.ExtendedSelection) - if dirDialog.exec_() == 1: - dnames = dirDialog.selectedFiles() - else: - dnames = "" - for dname in dnames: - if str(dname) != "": - if sys.platform.startswith('win'): - dname = dname.replace('/', '\\') - self.lastPath = os.path.abspath(os.path.join(str(dname), os.pardir)) - GUI.JobList.addItem(dname) - MW.setFocus() + dname = QtWidgets.QFileDialog.getExistingDirectory(MW, 'Select directory', self.lastPath) + if dname != '': + if sys.platform.startswith('win'): + dname = dname.replace('/', '\\') + self.lastPath = os.path.abspath(os.path.join(dname, os.pardir)) + GUI.JobList.addItem(dname) def selectFile(self): if self.needClean: From d99064596a6d3d20467647303582173a11d0fecf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Jastrz=C4=99bski?= Date: Sat, 18 Jan 2014 12:15:45 +0100 Subject: [PATCH 26/50] Detect Python 2 + README update --- README.md | 12 +++++++----- kcc-c2e.py | 6 +++++- kcc-c2p.py | 6 +++++- kcc.py | 6 +++++- setup.py | 0 setup.sh | 0 6 files changed, 22 insertions(+), 8 deletions(-) mode change 100644 => 100755 kcc-c2e.py mode change 100644 => 100755 kcc-c2p.py mode change 100644 => 100755 kcc.py mode change 100644 => 100755 setup.py mode change 100644 => 100755 setup.sh diff --git a/README.md b/README.md index 5935b47..142a9c9 100644 --- a/README.md +++ b/README.md @@ -40,11 +40,11 @@ You can find the latest released binary at the following links: - [7za](http://www.7-zip.org/download.html) *(For 7z/CB7 support)* ### For compiling/running from source: -- Python 2.7 - Included in MacOS and Linux, follow the [official documentation](http://www.python.org/getit/windows/) to install on Windows. -- [PyQt4](http://www.riverbankcomputing.co.uk/software/pyqt/download) - Please refer to official documentation for installing into your system. -- [Pillow](http://pypi.python.org/pypi/Pillow/) 2.3.0+ - For comic optimizations. Please refer to official documentation for installing into your system. -- [Psutil](https://code.google.com/p/psutil/) - Please refer to official documentation for installing into your system. -- **To build OS X release you need a modified QT:** [patch](https://github.com/ciromattia/kcc/blob/master/other/QT-4.8.5-QListWidget.patch) +- Python 3.3 +- [PyQt5](http://www.riverbankcomputing.co.uk/software/pyqt/download5) +- [Pillow](http://pypi.python.org/pypi/Pillow/) 2.3.0+ +- [psutil](https://pypi.python.org/pypi/psutil) +- [python-slugify](http://pypi.python.org/pypi/python-slugify) ## USAGE @@ -312,6 +312,8 @@ The app relies and includes the following scripts/binaries: ####3.7.2: * Fixed problems with HQ mode +####4.0: + ## COPYRIGHT Copyright (c) 2012-2013 Ciro Mattia Gonano and Paweł Jastrzębski. diff --git a/kcc-c2e.py b/kcc-c2e.py old mode 100644 new mode 100755 index 54b2e03..71a3936 --- a/kcc-c2e.py +++ b/kcc-c2e.py @@ -23,6 +23,11 @@ __license__ = 'ISC' __copyright__ = '2012-2013, Ciro Mattia Gonano , Pawel Jastrzebski ' __docformat__ = 'restructuredtext en' +import sys +if sys.version_info[0] != 3: + print('ERROR: This is Python 3 script!') + exit(1) + # Dependiences check missing = [] try: @@ -55,7 +60,6 @@ if len(missing) > 0: print('ERROR: ' + ', '.join(missing) + ' is not installed!') exit(1) -import sys from multiprocessing import freeze_support from kcc.comic2ebook import main, Copyright diff --git a/kcc-c2p.py b/kcc-c2p.py old mode 100644 new mode 100755 index 8b3feaa..cf194d1 --- a/kcc-c2p.py +++ b/kcc-c2p.py @@ -18,6 +18,11 @@ # TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. +import sys +if sys.version_info[0] != 3: + print('ERROR: This is Python 3 script!') + exit(1) + __version__ = '4.0' __license__ = 'ISC' __copyright__ = '2012-2013, Ciro Mattia Gonano , Pawel Jastrzebski ' @@ -45,7 +50,6 @@ if len(missing) > 0: print('ERROR: ' + ', '.join(missing) + ' is not installed!') exit(1) -import sys from multiprocessing import freeze_support from kcc.comic2panel import main, Copyright diff --git a/kcc.py b/kcc.py old mode 100644 new mode 100755 index 727d075..71c5877 --- a/kcc.py +++ b/kcc.py @@ -23,6 +23,11 @@ __license__ = 'ISC' __copyright__ = '2012-2013, Ciro Mattia Gonano , Pawel Jastrzebski ' __docformat__ = 'restructuredtext en' +import sys +if sys.version_info[0] != 3: + print('ERROR: This is Python 3 script!') + exit(1) + # Dependiences check missing = [] try: @@ -60,7 +65,6 @@ if len(missing) > 0: print('ERROR: ' + ', '.join(missing) + ' is not installed!') exit(1) -import sys import os from multiprocessing import freeze_support from kcc import KCC_gui diff --git a/setup.py b/setup.py old mode 100644 new mode 100755 diff --git a/setup.sh b/setup.sh old mode 100644 new mode 100755 From 42cf9e099fd9ed63fb099f987eccda06ffdb7d41 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Jastrz=C4=99bski?= Date: Sat, 18 Jan 2014 12:24:16 +0100 Subject: [PATCH 27/50] Updated Linux installer --- setup.sh | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/setup.sh b/setup.sh index fe68a57..ed1f9e5 100755 --- a/setup.sh +++ b/setup.sh @@ -8,5 +8,18 @@ zip kcc.zip __main__.py kcc/*.py echo "#!/usr/bin/env python3" > kcc-bin cat kcc.zip >> kcc-bin chmod +x kcc-bin -tar --xform s:^.*/:: --xform s/kcc-bin/kcc/ --xform s/comic2ebook/kcc/ -czf KindleComicConverter_linux_$VERSION.tar.gz kcc-bin LICENSE.txt icons/comic2ebook.png -rm __main__.py kcc.zip kcc-bin + +cp kcc-c2e.py __main__.py +zip kcc-c2e.zip __main__.py kcc/*.py +echo "#!/usr/bin/env python3" > kcc-c2e-bin +cat kcc-c2e.zip >> kcc-c2e-bin +chmod +x kcc-c2e-bin + +cp kcc-c2p.py __main__.py +zip kcc-c2p.zip __main__.py kcc/*.py +echo "#!/usr/bin/env python3" > kcc-c2p-bin +cat kcc-c2p.zip >> kcc-c2p-bin +chmod +x kcc-c2p-bin + +tar --xform s:^.*/:: --xform s/kcc-bin/kcc/ --xform s/kcc-c2p-bin/kcc-c2p/ --xform s/kcc-c2e-bin/kcc-c2e/ --xform s/comic2ebook/kcc/ -czf KindleComicConverter_linux_$VERSION.tar.gz kcc-bin kcc-c2e-bin kcc-c2p-bin LICENSE.txt icons/comic2ebook.png +rm __main__.py kcc.zip kcc-c2e.zip kcc-c2p.zip kcc-bin kcc-c2e-bin kcc-c2p-bin From c2e6a0b791c3ed6e8a2eda25b2af7003dd78af7c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Jastrz=C4=99bski?= Date: Sun, 19 Jan 2014 10:53:00 +0100 Subject: [PATCH 28/50] README update --- README.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 142a9c9..6e2c121 100644 --- a/README.md +++ b/README.md @@ -39,13 +39,17 @@ You can find the latest released binary at the following links: - [UnRAR](http://www.rarlab.com/download.htm) *(For CBR/RAR support)* - [7za](http://www.7-zip.org/download.html) *(For 7z/CB7 support)* -### For compiling/running from source: +### For running from source: - Python 3.3 - [PyQt5](http://www.riverbankcomputing.co.uk/software/pyqt/download5) - [Pillow](http://pypi.python.org/pypi/Pillow/) 2.3.0+ - [psutil](https://pypi.python.org/pypi/psutil) - [python-slugify](http://pypi.python.org/pypi/python-slugify) +### For freezing code: +- Windows - [cx_Freeze](https://bitbucket.org/anthony_tuininga/cx_freeze) version 4.3.2 with [this](https://bitbucket.org/anthony_tuininga/cx_freeze/pull-request/29/conversions-to-support-untranslated-wide) patchset. +- OS X - [py2app](https://bitbucket.org/ronaldoussoren/py2app) HEAD version. + ## USAGE Should be pretty self-explanatory. All options have detailed informations in tooltips. @@ -314,6 +318,9 @@ The app relies and includes the following scripts/binaries: ####4.0: +## KNOWN ISSUES +Please check [wiki page](https://github.com/ciromattia/kcc/wiki/Known-issues). + ## COPYRIGHT Copyright (c) 2012-2013 Ciro Mattia Gonano and Paweł Jastrzębski. From aa8b78b4e4bb0bb67f342cba75b4167dc2839f1b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Jastrz=C4=99bski?= Date: Mon, 20 Jan 2014 10:17:14 +0100 Subject: [PATCH 29/50] Autoupdater for Windows (#68) --- kcc.iss | 2 +- kcc.py | 6 ++- kcc/KCC_gui.py | 103 ++++++++++++++++++++++++++++++++++++------------- 3 files changed, 81 insertions(+), 30 deletions(-) diff --git a/kcc.iss b/kcc.iss index f964c53..6dfa659 100644 --- a/kcc.iss +++ b/kcc.iss @@ -69,7 +69,7 @@ Name: "{group}\Readme"; Filename: "https://github.com/ciromattia/kcc#kcc" Name: "{commondesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon [Run] -Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent +Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall Filename: "{tmp}\vcredist_x64.exe"; Parameters: "/passive /Q:a /c:""msiexec /qb /i vcredist.msi"" "; StatusMsg: "Installing Microsoft Visual C++ 2010 Redistributable Package..."; Check: Is64BitInstallMode Filename: "{tmp}\vcredist_x86.exe"; Parameters: "/passive /Q:a /c:""msiexec /qb /i vcredist.msi"" "; StatusMsg: "Installing Microsoft Visual C++ 2010 Redistributable Package..."; Check: not Is64BitInstallMode diff --git a/kcc.py b/kcc.py index 71c5877..41a1c1b 100755 --- a/kcc.py +++ b/kcc.py @@ -134,11 +134,13 @@ class QApplicationMessaging(QtWidgets.QApplication): # Adding signals to QMainWindow class QMainWindowKCC(QtWidgets.QMainWindow): progressBarTick = QtCore.pyqtSignal(str) - modeConvert = QtCore.pyqtSignal(bool) + modeConvert = QtCore.pyqtSignal(int) addMessage = QtCore.pyqtSignal(str, str, bool) addTrayMessage = QtCore.pyqtSignal(str, str) - showDialog = QtCore.pyqtSignal(str) + showDialog = QtCore.pyqtSignal(str, str) hideProgressBar = QtCore.pyqtSignal() + forceShutdown = QtCore.pyqtSignal() + dialogAnswer = QtCore.pyqtSignal(int) if __name__ == "__main__": diff --git a/kcc/KCC_gui.py b/kcc/KCC_gui.py index 3af388a..e947604 100644 --- a/kcc/KCC_gui.py +++ b/kcc/KCC_gui.py @@ -186,6 +186,7 @@ class WebServerThread(QtCore.QThread): class VersionThread(QtCore.QThread): def __init__(self): QtCore.QThread.__init__(self) + self.newVersion = '' def __del__(self): self.wait() @@ -198,10 +199,39 @@ class VersionThread(QtCore.QThread): return latestVersion = XML.childNodes[0].getElementsByTagName('latest')[0].childNodes[0].toxml() if tuple(map(int, (latestVersion.split(".")))) > tuple(map(int, (__version__.split(".")))): - MW.addMessage.emit('' - 'New version is available! ' - '(' - 'Changelog)', 'warning', False) + if sys.platform.startswith('win'): + self.newVersion = latestVersion + MW.showDialog.emit('New version released! ' + 'See changelog.<

Installed version: ' + __version__ + + '
Current version: ' + latestVersion + + '

Would you like to start automatic update?', 'question') + else: + MW.addMessage.emit('' + 'New version is available! ' + '(' + 'Changelog)', 'warning', False) + + def getNewVersion(self, dialogAnswer): + if dialogAnswer == QtWidgets.QMessageBox.Yes: + try: + MW.modeConvert.emit(-1) + MW.progressBarTick.emit('Downloading update') + path = urllib.request.urlretrieve('http://kcc.vulturis.eu/Windows/KindleComicConverter_win_' + + self.newVersion + '.exe', reporthook=self.getNewVersionTick) + move(path[0], path[0] + '.exe') + MW.hideProgressBar.emit() + MW.modeConvert.emit(1) + Popen(path[0] + '.exe /SP- /silent /noicons') + MW.forceShutdown.emit() + except Exception: + MW.addMessage.emit('Failed to download update!', 'warning', False) + MW.hideProgressBar.emit() + MW.modeConvert.emit(1) + + def getNewVersionTick(self, size, blockSize, totalSize): + if size == 0: + MW.progressBarTick.emit(str(int(totalSize / blockSize))) + MW.progressBarTick.emit('tick') class ProgressThread(QtCore.QThread): @@ -328,14 +358,14 @@ class WorkerThread(QtCore.QThread): MW.hideProgressBar.emit() MW.addMessage.emit('Conversion interrupted.', 'error', False) MW.addTrayMessage.emit('Conversion interrupted.', 'Critical') - MW.modeConvert.emit(True) + MW.modeConvert.emit(1) def addResult(self, output): MW.progressBarTick.emit('tick') self.workerOutput.append(output) def run(self): - MW.modeConvert.emit(False) + MW.modeConvert.emit(0) profile = GUI.profiles[str(GUI.DeviceBox.currentText())]['Label'] argv = ["--profile=" + profile] currentJobs = [] @@ -417,7 +447,7 @@ class WorkerThread(QtCore.QThread): self.errors = True type_, value_, traceback_ = sys.exc_info() MW.showDialog.emit("Error during conversion %s:\n\n%s\n\nTraceback:\n%s" - % (jobargv[-1], str(err), traceback.format_tb(traceback_))) + % (jobargv[-1], str(err), traceback.format_tb(traceback_)), 'error') MW.addMessage.emit('Failed to create EPUB!', 'error', False) MW.addTrayMessage.emit('Failed to create EPUB!', 'Critical') if not self.conversionAlive: @@ -507,7 +537,7 @@ class WorkerThread(QtCore.QThread): MW.addMessage.emit('KindleGen failed to create MOBI!', 'error', False) MW.addTrayMessage.emit('KindleGen failed to create MOBI!', 'Critical') if self.kindlegenErrorCode[0] == 1 and self.kindlegenErrorCode[1] != '': - MW.showDialog.emit("KindleGen error:\n\n" + self.kindlegenErrorCode[1]) + MW.showDialog.emit("KindleGen error:\n\n" + self.kindlegenErrorCode[1], 'error') if self.kindlegenErrorCode[0] == 23026: MW.addMessage.emit('Created EPUB file was too big.', 'error', False) MW.addMessage.emit('EPUB file: ' + str(epubSize) + 'MB. Supported size: ~300MB.', 'error', @@ -521,7 +551,7 @@ class WorkerThread(QtCore.QThread): GUI.needClean = True MW.addMessage.emit('All jobs completed.', 'info', False) MW.addTrayMessage.emit('All jobs completed.', 'Information') - MW.modeConvert.emit(True) + MW.modeConvert.emit(1) class SystemTrayIcon(QtWidgets.QSystemTrayIcon): @@ -674,21 +704,25 @@ class KCCGUI(KCC_ui.Ui_KCC): GUI.ColorBox.setChecked(False) def modeConvert(self, enable): + if enable < 1: + status = False + else: + status = True if self.currentMode != 3: - GUI.BasicModeButton.setEnabled(enable) - GUI.AdvModeButton.setEnabled(enable) + GUI.BasicModeButton.setEnabled(status) + GUI.AdvModeButton.setEnabled(status) if self.currentMode != 1: - GUI.FormatBox.setEnabled(enable) - GUI.DirectoryButton.setEnabled(enable) - GUI.ClearButton.setEnabled(enable) - GUI.FileButton.setEnabled(enable) - GUI.DeviceBox.setEnabled(enable) - GUI.OptionsBasic.setEnabled(enable) - GUI.OptionsAdvanced.setEnabled(enable) - GUI.OptionsAdvancedGamma.setEnabled(enable) - GUI.OptionsExpert.setEnabled(enable) + GUI.FormatBox.setEnabled(status) + GUI.DirectoryButton.setEnabled(status) + GUI.ClearButton.setEnabled(status) + GUI.FileButton.setEnabled(status) + GUI.DeviceBox.setEnabled(status) + GUI.OptionsBasic.setEnabled(status) + GUI.OptionsAdvanced.setEnabled(status) + GUI.OptionsAdvancedGamma.setEnabled(status) + GUI.OptionsExpert.setEnabled(status) GUI.ConvertButton.setEnabled(True) - if enable: + if enable == 1: self.conversionAlive = False self.worker.sync() icon = QtGui.QIcon() @@ -696,7 +730,7 @@ class KCCGUI(KCC_ui.Ui_KCC): GUI.ConvertButton.setIcon(icon) GUI.ConvertButton.setText('Convert') GUI.Form.setAcceptDrops(True) - else: + elif enable == 0: self.conversionAlive = True self.worker.sync() icon = QtGui.QIcon() @@ -704,6 +738,11 @@ class KCCGUI(KCC_ui.Ui_KCC): GUI.ConvertButton.setIcon(icon) GUI.ConvertButton.setText('Abort') GUI.Form.setAcceptDrops(False) + elif enable == -1: + self.conversionAlive = True + self.worker.sync() + GUI.ConvertButton.setEnabled(False) + GUI.Form.setAcceptDrops(False) def toggleWebtoonBox(self, value): if value: @@ -855,8 +894,13 @@ class KCCGUI(KCC_ui.Ui_KCC): GUI.JobList.setItemWidget(item, label) GUI.JobList.scrollToBottom() - def showDialog(self, message): - QtWidgets.QMessageBox.critical(MW, 'KCC - Error', message, QtWidgets.QMessageBox.Ok) + def showDialog(self, message, kind): + if kind == 'error': + QtWidgets.QMessageBox.critical(MW, 'KCC - Error', message, QtWidgets.QMessageBox.Ok) + elif kind == 'question': + dialogResponse = QtWidgets.QMessageBox.question(MW, 'KCC - Question', message, + QtWidgets.QMessageBox.Yes, QtWidgets.QMessageBox.No) + MW.dialogAnswer.emit(dialogResponse) def updateProgressbar(self, command): if command == 'tick': @@ -969,6 +1013,10 @@ class KCCGUI(KCC_ui.Ui_KCC): message = '/' + message self.handleMessage(message) + def forceShutdown(self): + self.saveSettings(None) + sys.exit(0) + # noinspection PyArgumentList def __init__(self, KCCAplication, KCCWindow): global APP, MW, GUI @@ -1157,6 +1205,8 @@ class KCCGUI(KCC_ui.Ui_KCC): MW.addTrayMessage.connect(self.tray.addTrayMessage) MW.showDialog.connect(self.showDialog) MW.hideProgressBar.connect(self.hideProgressBar) + MW.forceShutdown.connect(self.forceShutdown) + MW.dialogAnswer.connect(self.versionCheck.getNewVersion) MW.closeEvent = self.saveSettings GUI.Form.setAcceptDrops(True) @@ -1196,11 +1246,10 @@ class KCCGUI(KCC_ui.Ui_KCC): else: if eval('GUI.' + str(option)).isEnabled(): eval('GUI.' + str(option)).setCheckState(self.options[option]) - - self.versionCheck.start() - self.contentServer.start() self.hideProgressBar() self.worker.sync() + self.versionCheck.start() + self.contentServer.start() MW.setWindowTitle("Kindle Comic Converter " + __version__) MW.show() MW.raise_() From 991bf5d4a97cb0b2b83d1c95f51a5c6ea42a0ac7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Jastrz=C4=99bski?= Date: Mon, 20 Jan 2014 11:58:15 +0100 Subject: [PATCH 30/50] Miscellaneous tweaks --- KCC-Linux.ui | 2 +- KCC-OSX.ui | 2 +- KCC.ui | 2 +- kcc/KCC_gui.py | 5 +---- kcc/KCC_ui.py | 4 ++-- kcc/KCC_ui_linux.py | 4 ++-- kcc/KCC_ui_osx.py | 4 ++-- 7 files changed, 10 insertions(+), 13 deletions(-) diff --git a/KCC-Linux.ui b/KCC-Linux.ui index 26b8683..e08ef60 100644 --- a/KCC-Linux.ui +++ b/KCC-Linux.ui @@ -71,7 +71,7 @@ Qt::NoFocus - Disable image optimizations. + <html><head/><body><p>Disable image optimizations.<br/>Input images must be already resized.</p></body></html> No optimisation diff --git a/KCC-OSX.ui b/KCC-OSX.ui index bc88ec1..21dc000 100644 --- a/KCC-OSX.ui +++ b/KCC-OSX.ui @@ -69,7 +69,7 @@ Qt::NoFocus - <html><head/><body><p><span style=" font-size:12pt;">Disable image optimizations.</span></p></body></html> + <html><head/><body><p><span style=" font-size:12pt;">Disable image optimizations.<br/>Input images must be already resized.</span></p></body></html> No optimisation diff --git a/KCC.ui b/KCC.ui index ab89d23..a067723 100644 --- a/KCC.ui +++ b/KCC.ui @@ -65,7 +65,7 @@ Qt::NoFocus - Disable image optimizations. + <html><head/><body><p>Disable image optimizations.<br/>Input images must be already resized.</p></body></html> No optimisation diff --git a/kcc/KCC_gui.py b/kcc/KCC_gui.py index e947604..9158dca 100644 --- a/kcc/KCC_gui.py +++ b/kcc/KCC_gui.py @@ -756,7 +756,7 @@ class KCCGUI(KCC_ui.Ui_KCC): if not GUI.ProcessingBox.isChecked(): GUI.NoRotateBox.setEnabled(True) GUI.QualityBox.setEnabled(True) - GUI.MangaBox.setEnabled(True) + GUI.MangaBox.setEnabled(True) def toggleNoSplitRotate(self, value): if value: @@ -768,8 +768,6 @@ class KCCGUI(KCC_ui.Ui_KCC): def toggleProcessingBox(self, value): if value: - GUI.MangaBox.setEnabled(False) - GUI.MangaBox.setChecked(False) GUI.RotateBox.setEnabled(False) GUI.RotateBox.setChecked(False) GUI.QualityBox.setEnabled(False) @@ -789,7 +787,6 @@ class KCCGUI(KCC_ui.Ui_KCC): GUI.GammaSlider.setEnabled(False) GUI.GammaLabel.setEnabled(False) else: - GUI.MangaBox.setEnabled(True) GUI.RotateBox.setEnabled(True) GUI.UpscaleBox.setEnabled(True) GUI.NoRotateBox.setEnabled(True) diff --git a/kcc/KCC_ui.py b/kcc/KCC_ui.py index 917c894..d370c57 100644 --- a/kcc/KCC_ui.py +++ b/kcc/KCC_ui.py @@ -2,7 +2,7 @@ # Form implementation generated from reading ui file 'KCC.ui' # -# Created: Wed Jan 15 11:34:09 2014 +# Created: Mon Jan 20 10:34:14 2014 # by: PyQt5 UI code generator 5.2 # # WARNING! All changes made in this file will be lost! @@ -260,7 +260,7 @@ class Ui_KCC(object): def retranslateUi(self, KCC): _translate = QtCore.QCoreApplication.translate KCC.setWindowTitle(_translate("KCC", "Kindle Comic Converter")) - self.ProcessingBox.setToolTip(_translate("KCC", "Disable image optimizations.")) + self.ProcessingBox.setToolTip(_translate("KCC", "

Disable image optimizations.
Input images must be already resized.

")) self.ProcessingBox.setText(_translate("KCC", "No optimisation")) self.UpscaleBox.setToolTip(_translate("KCC", "

Unchecked - Nothing
Images smaller than device resolution will not be resized.

Indeterminate - Stretching
Images smaller than device resolution will be resized. Aspect ratio will be not preserved.

Checked - Upscaling
Images smaller than device resolution will be resized. Aspect ratio will be preserved.

")) self.UpscaleBox.setText(_translate("KCC", "Stretch/Upscale")) diff --git a/kcc/KCC_ui_linux.py b/kcc/KCC_ui_linux.py index 233ef5e..089647c 100644 --- a/kcc/KCC_ui_linux.py +++ b/kcc/KCC_ui_linux.py @@ -2,7 +2,7 @@ # Form implementation generated from reading ui file 'KCC-Linux.ui' # -# Created: Wed Jan 15 11:34:18 2014 +# Created: Mon Jan 20 10:34:24 2014 # by: PyQt5 UI code generator 5.2 # # WARNING! All changes made in this file will be lost! @@ -329,7 +329,7 @@ class Ui_KCC(object): def retranslateUi(self, KCC): _translate = QtCore.QCoreApplication.translate KCC.setWindowTitle(_translate("KCC", "Kindle Comic Converter")) - self.ProcessingBox.setToolTip(_translate("KCC", "Disable image optimizations.")) + self.ProcessingBox.setToolTip(_translate("KCC", "

Disable image optimizations.
Input images must be already resized.

")) self.ProcessingBox.setText(_translate("KCC", "No optimisation")) self.UpscaleBox.setToolTip(_translate("KCC", "

Unchecked - Nothing
Images smaller than device resolution will not be resized.

Indeterminate - Stretching
Images smaller than device resolution will be resized. Aspect ratio will be not preserved.

Checked - Upscaling
Images smaller than device resolution will be resized. Aspect ratio will be preserved.

")) self.UpscaleBox.setText(_translate("KCC", "Stretch/Upscale")) diff --git a/kcc/KCC_ui_osx.py b/kcc/KCC_ui_osx.py index b58659d..5009adb 100644 --- a/kcc/KCC_ui_osx.py +++ b/kcc/KCC_ui_osx.py @@ -2,7 +2,7 @@ # Form implementation generated from reading ui file 'KCC-OSX.ui' # -# Created: Wed Jan 15 11:34:51 2014 +# Created: Mon Jan 20 10:34:32 2014 # by: PyQt5 UI code generator 5.2 # # WARNING! All changes made in this file will be lost! @@ -352,7 +352,7 @@ class Ui_KCC(object): def retranslateUi(self, KCC): _translate = QtCore.QCoreApplication.translate KCC.setWindowTitle(_translate("KCC", "Kindle Comic Converter")) - self.ProcessingBox.setToolTip(_translate("KCC", "

Disable image optimizations.

")) + self.ProcessingBox.setToolTip(_translate("KCC", "

Disable image optimizations.
Input images must be already resized.

")) self.ProcessingBox.setText(_translate("KCC", "No optimisation")) self.UpscaleBox.setToolTip(_translate("KCC", "

Unchecked - Nothing
Images smaller than device resolution will not be resized.

Indeterminate - Stretching
Images smaller than device resolution will be resized. Aspect ratio will be not preserved.

Checked - Upscaling
Images smaller than device resolution will be resized. Aspect ratio will be preserved.

")) self.UpscaleBox.setText(_translate("KCC", "Stretch/Upscale")) From 237ef728e1c4a0d58c6dccb3b1a542379f4db044 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Jastrz=C4=99bski?= Date: Mon, 20 Jan 2014 12:07:26 +0100 Subject: [PATCH 31/50] Hotfixed cx_freeze packing --- other/libEGL32.dll | Bin 0 -> 47104 bytes other/libEGL64.dll | Bin 0 -> 56320 bytes setup.py | 11 +++++++++-- 3 files changed, 9 insertions(+), 2 deletions(-) create mode 100644 other/libEGL32.dll create mode 100644 other/libEGL64.dll diff --git a/other/libEGL32.dll b/other/libEGL32.dll new file mode 100644 index 0000000000000000000000000000000000000000..28cc8115c944fc843fc8d74fc4321f7c3c4aaa81 GIT binary patch literal 47104 zcmeIbe_T|@)jxiL1y^0=Y8FGHNk~Ex6O3Kh1r~OJMOj26x`2Sj0209fK_IZJXw_g= z6RuYh+WO=%ebUA>woTKdk46WCb6WkiOt8RmqHV4tigo3-}jk&?{XIx zvF+#c$M^LrI`_xSnKNh3oH=vm%*@@~yW6=ij^lI)J|D+*;7)%IcD?*%2+31#_|;Ty z|HR+k*b%b$w>K`Us&0yDXso}lv3zaJ>hij}dUwpdl`)N;x|r&^n5?A*F>C89D(6m_ zGAUL;{p8$>5BDx@e_suEh3Mb^0PlxROjYiw@4w654ex)1`#Z^D@Be|pf9w4xS-kE2 z_t<^10zZY_^Q%`^5zet{;Bs=@;*fBzcjK?~RhZLU=#7&@CUM+0#F*sRoe$&ABkW=C zJbMo1xNt6nMW}af5U*fjfhU9uW;dSCdvPK9sIH(}`xnD;tL8RVl)KA0PPzdp zdk_%GwIXQ#94LCO494jRM<)V!!##_j`Ewv;Zevs9YQ(X+qRtHNISmjV9fYs3vbG+8 zH=!B0(+CEH=Mgl24vw3rdHv7hzrg`9Q@6d-6W-x|n&S^0J9g~p+C3cawQ@z`S+`!~ zihMoZ!#Z(>I8QGg_x03p>OWu9CIB8gMtQV<-62&9COKAxui?}jTIgfP3dMo*PJIZ9 z>yDtD?ukXxo(DLNO6@8wIjG|q2 zvsqfs*01huL(bT(Up@UDj`LVAfo%rt90og!A?|h!= zXP)qWB5ghBG7-QmAt$!mVS1EaToxe*xb4(?wqE?vR*-#*`&!#s_q44Se~33vTDQYN zc>3do97q2gyhYR7&08=27|Cwq){BGam7W<&g3#RDKMBt<01|SV#ljfT6DznDNB-|g z!L>{*oF%xHi-n-?9`gy?2X9zGL*#!Q6q<8{juvDo6B=Bl!g9BelO^P=5^^epoT_d| zEm0@98oC{u!tp4yZlm{B(gs57PFz=(9E?%g3GIpY*_uk2-FFrIB1D`A0dpsMhkS06 z7#jZZ+diLnXx94J$d_7&%M|CH7hq5b;S6=D5htt)iig9;|k zD=0$8wJqfS3&8CNBElmG-$nQy0v8e*7Cy$GP9s8~FHdyp#X>_-vAEG9o)vQ}wzu7e znVn@{_Lho&Dmkd<#2k~j(PVqu^Oqe{&Ax3%-C<%gU$CPzq_t%7wh!H5Va>)JrJ=1Q zk@8FQj?%E!5}*7Mv!hfeKg}|qXIUHhmd%qns3P(Jh;O>>*~`hbt*%mhGZD z(%fmgSQhzIr=JRg*l4gFX9>s4BA*;dXb>A4Y{xx+7IWNUqZ?0u5OW-2qXSRxifHx5 zW;`7gb7IBDSUkNU=2VG|Re1WP=&*|UR@*@!J!(6sL0XoeqSr7BkJO%Em%ind@1dbN z&lK^1|Hb`9$sxJD#n2+LK`$iW((<|t7$y|y#6}&urnpdFYRl7krU;oj!KD}G>8LHm zMLJuao+9-lkwVDGvrLClevY4jsUX1r=KfpBCEfXC%)3H-SGS=IK=Mt08Zq-ZsfIRp7;ZHQGJkXMiUZ83OqwW*P!w#7w;w)PmQl?x5)7oPgD6W?|}a4U7Z|n{*9~6d9LCaMpUle+`0XzJ7wzypU;=E-q@yt zG6Jw90uxjtRQ7e<&OwUnb`I=>-fYVq=yncMgp~4?&nM=ds}QEp>k5+T5iJV-@M`@Q zja1z;bA(G%#5esf?k|Xe{h`xQ4HzVa6yrWdHN#JBsA(p)7bK0AbH?5;xNrK z83LfjkYK3KBRmFvbllB`wgtW?;tq;~?_5mT%x|8L;XvOXM(ver6sL*0U*x;ma-*fG z!#>}(PPZ8mg6`F}Y?kNZJ450ia&3B7bQ(pyV0d+9S!u~3vCt@nin)40_lo}&nOIst z`2`^0g1Eqt)-bC(r15GXaY=uzVeL}&JetB6RfVAu=p4cVgXp9>h)eah10G(;qbFgS zxPWB7|HhWh2F^VN!iD4z&vap0|5U`&Tc+LQx7UT>DO)Gz z=xlgrsIYQ59q`tIw6M<^MKA14)*s?MU*Yx zqZ2~ClFYbU@Wd zMjH}r^Yj#@r>G|oB}}5H$0%{4Lb>P0*4l3WhB{~=-T`h8{czHnAUu`paCW(VZ z;@gt=HKhA;6z1r~X~ac;ufK%Ca8QVvgSJrAd=hF7@52)n6wOjSXT;4zV(u{L60Y%fGlDi7 zBDZgZN`X*AEs#cH^y>@AkP@#i7OjNAD4iT)giWCCkS<&!7V;?RS~=}kY8oWlDqIf` zF$Gy!zVEAPg_Q5wveK2K^)t$Y#zU__k2Msvxo3u=H|vEGgKcp0H>m$+y*w-$UUubC z_gyNZ3t1u>Ulxo{i66DOlR|ACe$xj)U>k%;EPiBIFg(?^+_%Fy3wBMbbGU83PbeHx zbwi0^vt3aMFOy0blD__uRV`7}y)5XSQdGi6OeK^U{3_uokWL(8N&#@{D`^){qP&8C zFkHn57&sGMQr{Y;1G>o!#wJkA7$I+4ycClBCi0e7CL) zZ3b_daJ{fZkCAw#YD!c2nL3zgMPht$T-O^!1>`R7E89?$mYA@E=;LuGQKs$Sx*Ns6 zz4I9Zjk{?3s!3-)(H|Oi($>=yD)!_{w*v<>raZ{7_BBxBw!F#)-J)V4ci26-s*}~T z0`lCJYY<9?q(-XSWW}yFZ5+ab?`EpM=Bu}KHT zxL!wcovBY*PHL=K*FQPsdi3OU^yDq*uKJW{&-F?M;OXi&6iXH~J2KI<0tzgYEQ8#0 zDJ%4m+jpRSRNx6>7qnCV#$st3gFgp&il~OJ6ekOM+kCx8Cl2;sr;^hklOv>ycVYga z7YoR|A>tP5Q&#wO>|MH)Yy3J^EPxfH+wmPzGCNx7+S<;pB3(u2&@V!)OdUpUUq$L3 z$nx~Ijk?Hfcj49g6hTF9&!D6TXqfH)O}VncH%j0<*T|}>sOw?&F5QnlM596Ou)^8M z?LVa)yp`#APo(J5%a4)UL`qO!VG{82IN(y0u@re;#kJ#c!mbeheR>uh`Xae#X$ZXQ z`#$1SnxaS1)ctqhi5MZtGi#*OSU+Xgs$)Q=Uc4x-)7hGJk=uu%llz^1n3>2pipY)B za)dkxjhsrN6BM*ER*JbpdD2{X9Ej1G1~fQ2H+qvUN65tJO)~|IcWhojRsiIi#{bQF zRRTT`zx3P)2D`+!q>s@P#H3>B<9nGVP)r~3qWfdulsgFW=P3q+UTn~*Ah`yycV7t9 zmuFtfW}a(9(I1I#yQjI@vJEb2!55^nB6oH6PiiYNCteDsQlxT9F^qqC z7&2(U;l-}F1I1827!bTevm+n<0f|wG(eZ@$lL=u54-AF18GnN)uFbxk-E@%x+T*ZL z$nU@uHoDcN!!Q6<7IwgupC=_ipX|tuhB^dDbSs8(r=iU_A>S3(?UJG>u~1GFkH@`T z6zAddgyWS#QUCeal%zA40F7Icd zG}JqXXtX@LIZ?KE7h}9MzMPlemOCijaF#U|#!Ivo#y5|F224Tsn9ZZ#^ge21JL{P$ zE_-YktXU`+9}xhSOXbp#d{}^zFrZFt&LLMpUa|Bo$be}U=ub=ZB(0CZd>4}nq{qqv`qM}5kI8~|=;+F^M}7AK1IY;5$UoFF3K{=VF(b1# z&~bUOJMIvK4o!e2d}jz%Z?kyC!`|-U;vzv`K;lsR57yw!iW|0l)O08G$&z8RNsQ8~ zpA(Ng*NWN0E-?Zog;9D|j+)@@0&wHIw#_`t!R$Pvv_npf79$E6^hWtz50ea#jVECU ziXTy)`E3=koH#+8Di@S5!`*^H#0e~?LynnAn(AutfcJn7;)@9kFGMQH4%kWz>oP#? zT?(~R zm2^M^dsW{zg%srkjHr=981nc1gDh>*wZo(^Fg*H24ef{d@{y7G^45VpXlIDcrL$&O zg|T9847^+}(HTu@CLihuGi+WKZXSr4m9KAWTLuaQmqB{I-{-@04bx^*3CEdFKxe@_ zl1sz6o{i}`T-%xr7~IzgY@D`z<(~3NEONB{l8}7yL)evtXY!%`V*)4Mvc7<4Oeh>2 znWYPb!_t5M#pl!XADGuPu9AgrYx2A~BcGHT2&G^G}6}7JarHy=R(ugfxLejd%Y=a2oR4 z3WxJSMI0%5(3Q)39?=pqLO+xVsdIf?mw3ec$Khh{1>KhH9VJFtKP`)(rXSD?iz9~H znupO6g&0YAfp1+7O=G}V0*#ng!xc$?BxTVp{?7Xev~aZdE8T+!Y1j5+J0a^Yb0KUkDMbhqS_b zP->9$cQa*dJLI+s*`$AQfhwk}UM$kXig}3HgG=NGAum_dj+!ysHZ~7))Tqy zE3%U@i_mYqz?|LNHXs6eOzj_A51f7*9J_E+>01))@!q&7$bOM9R5nPT!sE z9@}>dyT|lh$L_QGqS$?L-xRvAIi|lgTTu{>3tdP+k zLvK0i+jMc!@_sn0?tv+~XcgeUcL1*MI=HF4ohswEGjEFXR9mB=t#DBA3}X5?SIq6T zy}AB2@o#Zw4_pkjIZu0dGF5w}LUaoxiq2CQgKiKFKNs}<(Ud+#PEVwCmKZ9S*sye} zEmxARhc*|{@CBIHMbMa1qPKkv9fok_%EN=AIHa_acvYmi4f> zFF{BVb?SjUQW~=73LZ=J@P%|MUUJx7d>VI0GSm4xhep%Dge?Q0ND@#xk(Gz+5*mK zfm^6sYvJ3e=LckA-CIlZY%RQNjutrQ9xZam@&L$L0g$l)kfs30S}kNQ-%ahwsf@R4 z6LS^^pm7DDS*C$Z=%hw$e|8SXzl3lY;RM2IgwGI$5hmTq@zDskBCJ6B--mD)f(7p$ z+~+BG7w)A9wFny#M1&_1UO*tY*Kt3F@OuOa;XHy4@zW7v5auGJAt>g|G4F;f&OM#P zG2v664+0#)1Q_xw+aa=iGkFbxz4B%6%+4=+H47{-%bSgSW2ne!;c3NcLloyRw9Bhk zcy|9?nm4zBgnl7)> zOqQ3eDD^XSiH6Z{fIZ@g@@`;+PTavJ(XF~^)F^6XSgzg``8wwMc~S~C$Y5GbscQdb z^_ixr&$LVHL&<7=kUUZ!Rt@*a;v7+YwOTuqydcLIq^!nK`ZTrW5A3d=^Xz{&hW zc^dqnM8=N?6+aQI;zx8Kek3ydNEnSD{L4cbE*McX;oW}1T}{^Un@u|Lo&JzTYU9&9 zvjh`MKJxX5Vsh9XmL2&Js2gE@O7CNaX&ZFk8TtAW-;&}yEr91^0I1DShD{K02Ndr~ zS*iDk&+kc*B^K7aOR9Hi*B5Djgl0W<3)rV!jMe??i?JwDmPar~mPb4=dBj~SkJR3( zJR)h7JR&tf9!JrO4FC7&^=`O_Z_CW_cS!GsX1rJU->E;Ke9d}gaDM$uiUdtMxA(lf2jD8{5S)TC*!)qK5&J7 z9QICuvLqyC)2dKhw|9$?7qa=4jZ?*`UAhpC#D(o(IIewDbsOEOzF4Z8r)z1R#ubRa z_axBLPqCQZwl|g(yVzi`ec2QaZ*D)|vJov6VY^6fek?(7l*Ro~St*OBWid<{L0%}u zLkuv5oY-#5F*HR0oP#Oo(6bz55D3_EqJs-m?_W4mhzi30pzZ%}@E`M^N^#J8Jkopd;yUv2-zJtBJAV4ybI*PGsrc4Aeee9m_U5{)I$%`#;tsS~uCev5 z3xA#7+Ok8;AEIAlw&z=4=aQtw;9@WQ2-`n&mw_o*$G_J5AXKeRoB(ch=V1bQnqYF_ zY&NizsbXZF^qd-}>zcp`Hwf#E!cyLQk;am*yL6F&_b=%yhNGS{cfw<+@hv!qCEM@S zsTAWd@i$YS20}BGrRsSo2h?ensvQMbhy z$5=}YSgp1q4hyH#g;cCoH)B1RE%Am48}(wbPVBbc%|~v397aNsJU+qY(x|h|h}?dF zq-&ktTFQH7b<6=HhTT%>^fuy(_N_Urj5+&3Fr37H({L zFp3LU6V{EfCalAn@JxbM7lggE+NCTA>u5n3&U9K3_B1mnWhMCjVkwmYsw=^Fk6H=7 zmQgVFGO%u(W#9tijvQmF%h-CCQC|98j_$zxNbpfYwbHupAh@XdtE^>6{}>Up`0J^J z+pVS9$a$`6U2ZHw584v$HlkaZFF@xkmD%v zn&sG0#7HSc_rhZCa-;MSoWK2UR>E|D2~Q9_TfLE3>tL%sktB45ujz{|)NDEK$zi{FvMx4QV& zyRhm@TML$Bc)qNBA$^p5@l3vW$QRE^cTuY;@&!wc$rrE47q7?{FUuDX`9h9sr~@hT z#Yic|a8L5ZOBc}$Bwr{2@}-o}N9zExe4zkYzIYFlFWv+Bg1;=dd{MC^UrM=8t8%)d zNG+D+iC{~tuV(Bl8~s2eT*e*!tD#s5#{F(uft1?d;v zpFn0c?g7$&YJO<0VEKQb=0|$a{CN=k0%X05_Q{cj4ITXRkmAKh^M(-1l zo*YC1Cbw9`SzySw%`-G%$!)kOudR@$C9pQiN1b!jwgBl^Ciu*@1iD%o)63NF4NnuHvid=Guy@odnlSq>qy2763?i8| zz7yEsvAq+D-I_fOlWWrJkp5ZN${E3)?o`(Ely~>}{+YB_k$`yG^f?)j4)*RI6bEhV zt)9K&0wXIYAB9L?Bx64gWYUwN;-2BhJx6^4))*CQ6tmxhp*DJcCN9k)vh_r^XL?nb z2@9xCCo#dNo#cnqqI0R}4x3VR>ZL{BrYZXJ6*78$QMNB+WG9_0FIs-)`T5EFPO!TE zTLoG@FIG*ZiXBOmD@J9@<;i^2w4cFu0^Q|^IFI-Bu#(f&s$Q#B&=bej_ph}5jGnz^ zC{WQCkQuqmm2fK&PnUt&Sb{5Lg=MORUFR=st~#H;^75W7D^2KR%Brk%9~pYIKLh3G z!46Rz22gwkPjr!(oYG*Bodi0X>ys3^2WW1A#a&yEJ6epiEiyDt!}=~$A_89~@1TOm ztPQ&XNU`|i0=j=dc~RV$<)M53Un`F-Ce!*m?>*{^J7Rll{p6~1{#}`v#cwWdvqyV< z7qMG&Bwk!%w7uPw=qkn<`F}%cz=MPHH3neGFK{95J6Jwt?wKuoW1<+*rL!{c4A`pY zw);Hq30rvY1s;x@h_WuIjxHJ|^b7>A>{;vz$RzWL1`h~>PQ-qhZ(@Y`0^^UoS>|5a zPl?Sk_u5CspO4(10G92P(a}yBJYuH|+mecLi9FP3U*`XUKNBo~Cv%jGs)UD&>JU6Y zy<_qxavSaS8=FVhGafZz+X+enn;JW4UXU`+*m#FHsed+@@mVlt7&OeliqD%V*+$G| zBj7^m3d44)JaGvhb|g>wFDMuCqmU;Itd0y|HS%eh2nROxC)#;TmDLxE8+hB-fj&7W zANRHFlf!1I8)|%EUsDSw4)}ZpH5~1Sz!SOI&_wW-j~0q-Bl6A$t5}^M{445=JzhR{ zm0agcBfL2isU~-zCRFu5Q`Lt?$-$_qcNK@dmFJRvn)*-GG>E*wq8O2vMj8SkF9{5- zt_6Ni@rvXH{xqEW(wtuj=1x0XgV{sM$c`E(ojri&Vh0fDiZw#R8l02EhL#D?Dq@C^ z0;?*Y@$G6NtvkTsrRa~*J85#e1H4^Kp0SRL=JjsDL9T2aGzg4FGT2--A;r>lG`x4S z-S22Vk_2p!yj5Iku-#>d^qwO*1}OGRQlk$-WLJ(r+j_Cb274S_23s+JyA@zp4OcAv zCJ+?1k!`-ADHm3iP{K1Y(5H<#%(b7z2DD9a(@H5h!n2lNcJ=Q->~qO&4z zU|S~k!Dh?$Nyz08R86EZKDzUAWym&96^^pP>Typ-0dv7FJicACSUM|PKZ282&SAkN zJRJ(PpeV0cJR)s_4FRWesQJ8jTv^`7_DtzcOG*5ghBj5dh2~`yu;+($#3tB-1awgqLIBhXYfXQb0#Uq3+%bA z2c9DVxsVX~2*yP&@+D#K5)zWOZMe}cpMm~VY=O)j#8wr3+qd=-@K>RckI+#g@q>QM z8pSua_EGuniQc}j$n7nZ@VEYOoN@N7*X~g9>=JVawjYgbT?i+%=o|!jt?77#%q~S+ z-nI2>h9y@vecN9H9%lW%B!WFCDiR|2Q%q(t zb=bBC*dT^A7AC;~Vu)R2gJR)85ys411GYr!^YTd~%OPx+h@@Wnu9=DCRS?Og5J_aovC$|KqP0_KJ+dq25@6&YOistllBdRPVtF466W7jyit5iTOUg@Dx& z{sO}Nxmd$Tz}emjSN0dC3n##c2*1vf^;LA6X1t=M+n^iZQcANtGlJ2G3H1^-->E84 zy8dy=EN_hOp)-WJyjYaw!Zx!!?9E@3fQB%NL(<21z_uY+>GQ-TRt$bcR&wv-Q5pP} z^R~C#p+XAw1!Dtg+Y*a(J?N$g1nf_Jfady$r0KAKu)uI$+Oh$L z={ufzv^kaLr`NKbsq{3tU46v*FgBy!pm;DmSJ6Jyss4SaG@tmZW)teIFuJI4Y(o8k zwlvj#g;9JKOYtjUl#@}dn2ENY#s!*JaSIBYR@xYPwk$P*NWKXUZ{`lDfS7=jza*Mf4Wo8wX=9AvPBS6*8C(dO^yX;3k??fwkP zDzM^ey~my_krE(zA47is2->4D!g^OE}Up%Sui|MCEe#r|yN`3*LmEQ=q({K#= z#dw;d)ld3h+jFsDlF^E@0T^zW4FQ?sq7VpB*JvXP^)k<^o(vPuL$n0@TQ z&yjXK}QDTDG5=QjzhYPZqhvvr>a> zhA`N|A*Rwq!htz|?hr^X)U&uB1BY?~1o=__=79PK*UzXW(-vqOY}mNqxkj7>`+y8; zwp&3bVv{plA{r38ZCiAhRZOxiH8jl^udRue3P6~;xj$!&sfZD}D_pn+Cz)NvL@7A) zGjc`4YuO2B@#xie-KG2b-}u$2*@!Y9A@%9q63rFkix^@y&YX)I4A`uU-oRr7zx@`> zI;5XsoP_~FyYAbZgE;-kOD@O z8jO>XIET?*gKRXIOh^jP!JuL1Us>F342hld9K^VlFJZ?s6PtZp}?q9dd+pHwwcSF(PYj zuiB|ZEkIOFOjVWgY9(?u4{?B*S+!V+yjjgQw`!IW#Uo0wzD}`X$posIQKeJT2Vs)b zgw*)pVuG=m)8!nFkrw|Rxbf|g+r*{I9kv7Or`Px>O{zFWVoZbUp|}GzWSr(mgP5)> zadKyo^@n$0v0^TO#Wd2?OsH2hNg=)*qXG3+!+psrn;UG3G|ZJwP0k z@&-rB+d6OIQO->hvKJ907M{TY02r*eV6Vuc*~0S-1(2eeQN-5HrJ&OKN_TrMT2S5OW)2W{@5C%pZ^bw)j!ad;;^|AkzsNu$_kP2n+f; z&dHcRtT76u(bAh3YoTjxha$JVfU<>bBb}fzvJ*78!b4`HZ8_Kr*fnoj2>K0(f-rEB z`52U&5%mfcO6`(YMdMy3WLpV^m7%~@k7q2BhG1am%A6L`L0d6|?0baL<*lVT7&?XQ zW}(#GT3Ue}R6=Q1z_g7iL|DN>3BD#H$-ISmrKB9k`&*M}q z4xUcM96B!#^V$^<2yw6tZw!svs^11SY{=@;jO2l;jnQ8ueKiw3U~ub2@~gNbdvHK^yvOEr6LHW6QrTFbfJvYm3`Svx8Tfqu2aMD@kUGz*~P1}D0y&Z0%h;EL$ zD|2triw-Zc3_T&F)d4V$0<3@yYb_kNNe@nEVSuf8^No>o}<#^LLrF zKS#5AjzOAEA?<(ybw(jgm4CFa=?duc`1yNY7RDjbHZ#Ss1i za~G#ZKJpkCi*Lxal(TQh)#4`CWu`*qGU(k)+04*N=rash9FzvGR(kdru*U$~e?msx zDZ_Ty$3V?|U46G=T$0xGImVm-{u^PWO<>jRKZwOnxV(5+CGaQGgj7#%eQ72JQ!x>xWHh$ECi=sdA~oIvAMFRu1}&mm^jv;0#FT;NsN}s1qP=a6?PRBptg0i26o9Pp%Tq2L_bwALbNPTJ^wttSNZ8p zB&o-Nb(H@Z&WK%FzN*XHuaa3?U5WC8)kI#8hW;G90(!8Q0%x+w;)mwrBrnVvx&5ce z4SADXTCj3dhWMt-1ieE9vF20y7vDbq_=3}1TKPNVFMk@0pPQ@L@c(_efM7J}8N)VX ziY=4dq|m}f%S)P2uXLMS1*&k3Lb2R_rYobDyizK^t_nu)XVVx%g3${F=;XtDG2Em* z4t}p+8u?P|^Y^i(r`@>GCvoxJDcnN)!|8>69~bID2$Ade9U1l5Dv$JI-$wsnv08x- z2l7LruK+hILI#2pVFLp9PYo0yp;rn|@}wg}MZqt><3)|QY`O9{BukU3uU-Fq`!vBC zk>yzUFu>3X2Kq`d%&^JKLom%o#MR*a3TQG^g_7}FtG z@?$p(+sbxQf%;*UzoRG>RK}w#sGn1{chdHtrQJ8nD`A^t%)ulMb{0WOf(#;y(c;U} ztD0uFDp2dIgVWnSKD}x`i32KDG>oISr!r;*%$XDinQY$=O2OZwf>qh0yQ1I6FHiIs1N0fK=gIPyz7?P4gkZrPMT^vQU^6<; zMe5#nI+(i05YHAlpPn+Nu&P$T78#@?|9+Khncl%Gpm&u1pYNwPMV6GC6x_iTsyYM= z8)W(a2T>4&znV{5GPcU}@!z_l@j2fUU^U% z7y~P*Psb>IdO}qwu=Kw{aagwS^`xo?wUm1owyR(WBkvD*K%Xyi8?iQxjRMDgCsGd~iFPLS|Csj3 zmFSBLq#ZD!WWo9$5su{C0T}+p*m^(xV{&^T`^}2{%Y+0`-st0OV{_k9zYzRMFAKr) zdadyL^=bPEKgaYxjIs~s`^l8YbLM`+o;(_Tg9`|0*cY%$E|XuNP;~j$zf*zoG$?e- z?Z58|=*7N`&FT;hEkD&&EIo#81~O|+@Nv%**Jn{nRMmt~TR?QLrPm7i1#D)U!+$zq z%qpS1OAJ_cpIT5X?ee33UvA{7Ma9yC{>aW^>7b0LKQ2KMa-2 z3dRA|IQSTo05Xox5;-yll<{Ev@>!i#COj@93RafN?IxwH61TrBDpAqj@f*J9itcTvh5)tv_@_Oip3e@L; zwNdNSeg*YG`+4*(e|=VCQAE~7tUg%cuVAalN_{MHfx$Qo(}sC=rU9h?Ls_=N75d)r z1aMoWZ{PUzc`@5kcpbU(1&o&7%|3xKvzp6$ID)_9;;+6p@5uVah4zvJf}@M*qL`|)UfWPJXsKcu6| z`&It^m$xg`2`ZtAVh&ee&aFq4g9wdQ-$9cUd56LxAE8#p@3Zta!|M?h4fotL_jKZO z^h4+^_?Ro5f2c9mIDAn?Br(h5!KVqJ2)i11MBzi|(8Kr;I?Za8521Hw!?2|{o^GtU z7$R{B<;?R%8ITd|O9T!*9yJhA1cC3LC=e4A2v#JXbpg=rKLOFVA*3Tbf*@-%Chuwv zLIjm5=(YPP0uu2JC+MSqD8T3FG#LUC9Xk3wlz=FL*A@_v=+Fm+H;jqj5EPyt6P`ar z8#kBmuxa(!t%Hy2VZXzY9EJUeol2+pvV14Hvva6HaBwfv=$8fJnV1OE%EyJOV5 zI&#Py7c(uR(yamS;1@=EAu~tm6k=vhK)RSYOZ}7dgl;bui|1kKyy_S_ z6$C&+b3$^aUex+nivZ1U^hts zcc6ALvGQ|=$qzd}#Ew{;_4-0K<$J#l*@SbBII;k%y`b24B8?0~eDnw#*1&V$3FTa! zo=c++;hyf2*2xQ;{sdu5Y?)9RBOklN8dZ@U`0^2pNZ@ejsrUPO%FIU@ic)+EoNaql z=}|t0dRETJa^x2mV1~>nxe9x2Xph(`V33daX-MhEwg@Oge}b?j2BgGxVK10Uj@**+ z74796h}P_fqK&~u{Q68DnqYu6foB^1mQe1n`L~h;n}hZ%VZIs)whhIV41#gz;x-S^ z{2d=Km_{>Mn(Fj)Ir}+VuUm(ENDFNmnp{A;MrUD)(jVEfxgY!YS;RN7x=-n4D?Je` z`rA@3s(?>SM-@rm$CFFaqg0nP%tm||MIZ!A(b7E%E!x^J{z3kr@-L(;u)7z~&$BGB zgMsZs=nlRUh{Rz9EdFc?YePJzq)$_K8`%QW^}q*HTAv)WR(-BJ`P9y=!7Af1P^fCaTy+hc?qh^`S7fMK_0o&M`M3P#g469Brbo20AQjvdsMH+)<&N6o1dzs zYCg8Hj>IEPi3t=B(*JDpCcaQGfi^T??u;=*%#MXP^KHg!Y(4l5jsw`Bgs;M9$Iv$D zHpA7nBZ%x4docG~if!q4$;!dO&R!H0V>jTX{c~d%7|;0hMb(<;qqn zRE(lieFeQtKap)LrjbtcejV<)ifO+h-|x_F6X0Y?0w$(65hYtydHDr2ZVw^@JiH^n za07gFz5tDZtluogN8PETp8}XT1@|pQRqI4-JzYQSORB*Sq~I4#Ir=3=_k<$$o1ZJ74f>5z{zNsp zSb{qOKPT2*MnkplmS(h<@0J#J-G-}e%C1hF*9raNP~X+S1?qOPv|YH?7^|$m#7?j4 zF*)`n>JEdJ#ATFvQgEIjgVNyh=zUSoB5Fl{MU7tiGcc_1Rt_uB49=IxAtODWZgZZ- zj>9u9 zBrLdrHNYn214jO+=ZYMRTfU;I7G&^6Jx`?J7pQzuR2;+2&|-!XZtirH9>R`1=_qhj zIRsSnd7$am#ZIN?J$POLgIO*lFR#GdSyY_jGzh*Kz&xI!m`;%dXN%?L;^H_xB|Z&;L)R)C>IJ$xo#M-?palIlfFv~MnO}29=?b* zGe!GY)%*HT#%0N6n;#ju-l0(U6c9U|3hvv7jH4w9`>!Imd0B!iDNxH!$ODec>gl%$ z@cRZ!yf)7Lg)eG9ks0Rh^O;GWpvfpg2=f&V$w+-CWoe_dlQ_GOf|Ez#DNeonWdTY9 zKVSqM(%b(W32xLrWL+U+U?RbU!`%4{v4)hR-lgybasu6Yl;%x*)pF_&Q)$q-ApQ-W zT_mC}n2+Ko9fZU^ouCH4zi`&Wr!c9&Z+PXN>3f;DHRulaUJUijecH4ao$i1eJ`h-X z)Q>iw;p872LyYtoOiV-)OInbPqGGUQL~s{FJh2dm7<`yiG9V5*yFe-fJVS}5il7** zqn@Xt!aVaSa|Y6pDeOkMAh%pTfNxRD#|KHUTUswp6mn1Fv#|}ZzgD1URZ8B7_i6=KqUs5_i0i!S1m`v*z5CtR{3H}!5Dtt&K0$Ix|G$P>=07Gm7{)E7uSUff~1K68fNx1Ywi(H$Ox=Md~re3}xUc@LcL4nKnH zL><@J9exZ?R3T>G3){)AetI|JgzcyB=!>%KL8fTrtO=1aP=ggT*jo`%ageKZrQ`GdvR5V=&HU}xLVQq@F!-)@R4sZ4 zgwvQMZD8J`=#oQK1EjGU@Jd5MQOB_#;S17qDHexpT}_eV1PFX6eiIqL-Ey(V(|OynmWlPd`gK!tf#XrS=NS_3{>macUge9rhcbJH%^t);b}ye@I>&f8u%T=bY!WcEQTK= zOKCusHVh-nHSmkh063F?tppq&0L<|B_C-IYq31ooPb2sWf)BYAexPs2tAUpQ|3~cY z>DW#1@8IbY`j2Sg2LMmM1kiDq;OQG~0r0fhBp77Hzb9Ede_^qSiajd0J!roN6w;*3z?y0^ilt=Fk z8azAZ$a0cRsQ8}%RT4vm^1KK5zDgY9VUIC=-vu`IXz5$3#^&_tVBz9Z0DT6ATk6w| zuG3#}bh5)ji2r~mKMycEyQDV|qiH{?((44?PT+Lr(hq)&9pUJk@r;H8LjZq_z+WTq z2Lr&5`GtbysG6XR&jD(M3KfvPkkV@@Jtb)R?Ua6)(ys}cK9SOA{S@gJU`8>b1Mv4D zw!=;79|TQ5O6kWa{gt5UKcV#4=aK$I&~$;)H&ObApy}0={vM^T2%5f-(&xN@^pv3K zw^KUKDWU#B((Db8}zLU~l37Y;BNQ{8U%+mkAoWLV$2m&>;F5Gw zLPsfm@z0U|$|dO}zdxb$y_Eh$&~$;)hbetS(DZ6bU-lx>R|HL8Na@d0dP>mr+bLc5 z3#4BYG<_na-$UsaJ`Y-d#CGhb^bdljAEk7|ex$z=H2o)(UP0+k1Wgwx{WVJ85H!7- z(v7fe`c|mvu)eU~wp;YC=fluZyxH(5D8Ijs1LHR#gZU`z8qBa3JhQ(OMlkm@yE$~q zT`x|d2>jqxrcq>v*Q(mT!||>2qNEp)8+kQb!^s7Tuhb~tYR4oG1A+9|CWUJw`c9_r zxkvr<_BjvIvWbQ0kp!d`?{1UJGegn0<52(bu81RVnRnq0=oUvb<^2rUTo*YgU; z9S6RT2qyxE_ZbK=2=@TSf_pl`a)f&k8W5Th9ztkG*p2Wk!hVE<2zMZSf^Z&T4)V`a z%GnLv=?IGvN)c)hHX`gqNI;;!pM$J#A-st2ZG`V2>_TWq_&x#y!etOEwCeNq-jU~6 zI0s>@b2lsZo0NN+a;Gyft(Y9O@W_LI4g^o#{dM*0>tZUKS64Q;tLy8KzefYJ3NY&` zSG(&Q?aR_*-1YS_we@xPaopPShHo@gx&tDs>(-UmR#(Jm(yHB+jpfM9scB8_#_GEJ zVjAk3s#$5uyC1Q0!Q!$dMP*2Lmo<6rExXsVW=&-y$5DLdk_C&Mh;3X`zPhrk!dy}2 zu55OD8Y{~ZD$1Iw%JEQDURP0D8500szs9|u(kiN(8fwco#At9m;Hhlf;K$fdUtI@! zkz1Re%F!Y(TU}dSS?5+LBVeMc+})cV*e?dSGdGmo?Vk>uGY=RW>yNsEJ$8 zRdZ`NH=e4va;}1_ z??VL_)~%k)&H5q7ch2K@(|nGPpKFPk%@`CDKR02nX>NkWg5TfbmNrz@5qSm3+x!fh z4)MEi=dj;^K9fM@Ro+*dM~oraz3vE&0xpy9Gi6up-FLxg(O~tS`gY1 zo(J5(R+)Bk7?2}@>XAd2fAMb@@Nk&bB#h3F_$SdH)M)Bo&*Oc+8b|q*KUlFodUPOY z^H5w2;LfOd@Q!IccaGjs7Zn%55Ptg8;?m}$GzZ{J$VbogM|m80&r#wioh9I+#iPwb z>8k+OJPJ=M-rJQpN)Ludn}^aj0j_fto*umSDshw^439PsrNiCAVKn6M3#;4^0)Bas z!>^@q_`)NHul#ZN(i?}bXL0yK4TrC^aQM;$hp#_yI04V$lsAWwio@w%4kv6m{xOa- zA-E745ZV#;A@m>&BJk}J2kL6Od~G`JE(y*jRPCAbA*O_ z#({MKmS~}}iEfhD)^YOSH{<+ud~F=qeHvJ49N5zuSR-bdm*WTDHbR4A99V}2wssuY z1`X`)abWjoU=NQ2+XGmt&uQF=-@VFRQgFaG%ne=!2enNEV3uS4Nq9#8sWO!XD~|B< zxKrFr+^J3N%KcW{sjPV139bQmRbE@i!M#TVyZ{ zzaaA=8u!cb;fXcl)9V5bl@F^Fyba^v_1-r=-e)yc&#<#)4NZDw^PB}GY;OLUjbe{yhdufMdO+HFdO&F@uBMe z@#$Tq!P}tVZ5apeU#7w^M_+N5Ok~9K0b7EehWDaqzzP z!1(kY(ctY>@Ji$0&1oDTZw$PNDj!UECO$ZDzZ@UJo5si6tiju=;N3kA-sUU7+oQpI zTEROw4&Djw@#&onucyifE1roDIk;br4^3Bqw?%`uUBSC&9K4yH@#*c=;FT1-L*wB6 z;}zgF!8@z+!GUMugA4b|@!>Q0Nyf9IS~YlgD|nwB2k#$o_+dP}r!{y76}%ig$fN0{ zy<`-3Ou4J?7qO{;;??(_QR!PBmeX@_FGo<}w0KS+{%ZwJO@D6`p5>1OmeZ?A7k6;{ z_Ys!8M3l&XvE=XE1KkW?uKKqhai{-@DMyDcsC4JnS9oeGbD00M7{8RLTUOhY-B?-4<%BJ+UtM0yp1Ua)z(wV?o=WZr zy%nf$Su$K^ZEZcAdB34FmSHq8r=)0WxOPq_%33DrIYdP-2kcCaf)pZs1>p8AEG{16f{klrPHWYJ* zLs5pDv=|O+)aZV~Cns`7hMW0u^Wog)uIJ{L*VfA5R8}$f0_9hr_Y$<6D3eDZGC5pf zfiqvFrndTCIH(KO$;4H185w5Bip=G%%;k=|A+e!laDvz0Us<-k+}%Wu_SJw$00aOQ z5=3f9S=s#N=IqAuwMs)YnmO*B@U@j|sbbvQ^t8HR1IPWAJyn61@6uCKr5j#?@TLa% z*4=B$nz-D8qWSspCX>viHeH#g4y|%Ow-P0QarJeT&DC!1=CCprdo-*}iLr#0tpy|M zSHqX>=EU$dBmmqsp=FhItLrN&E6VCTVEaC*Nwpge>b2a@N1n?nx!;78m9K5OuZ*GR z;;B9j4a-+IxU;Kk0nUYnWKgc^I{3*Q#GB=JbDwb;W$q0PmB6{CzN`X^1$Y8fU3qQU z+Ddm-eTBoH>~Q2|Iw=$PbqJAIR#ADc=f3+Y8_TNd>+k2d8$l^s$WRsn8ZGd~gL!pa z0ccrWTUlPGDXR{AZt@q#aSw!Ml;xLKH>t}AjgBUFg~MTXC1ozpoLA&uBB5wF_#F<% z-I-XyL9XSsm38;ItI8@#z~x-j@bj|JtdCN9y~kZvzox9QyzairQR&oHE`MA7g>y1i zD^7UsO)jgFSg*bhgf1lJP`g!DIGa~v!Q;M4?nPZeZDnNx*QZULU%$2i>mGg}u2Z*6 zWxgW8*xYn!FXP_T71qfMDO7^IETl9b_e1KtV<(3#Y|2ua#MM~YgbvO9IE*bWxGEdh z)HkjzuUlO?zurT2;J!n8VOjO+`&k6XZJ_sp4NdOKwacp4R%SM#&`NsJDE8iszs{%E zCx0!^^>4y6g&eH!^&l)qJYNDoMk)M92z$z4^Q}TX%kg|K7SW)a9MCR<2rYzo4g9tU zrfR?=tg1mgv`G)$AyF~VGBIm`6aBRZA*KO$guw^k_eKAUX#!pZ$`^xP*p9Hu19;&0 zF=%-a;UK~Zgg+wu4dJTSIW7)i9>NNQ`w=!Hv?F{U;TH%;5dMJBkMJeJ#5XwZYJ^)6 z5)kGguo{RBjfh;|!b;1NwCC1}=&V<0851pdX>zu*}8u36_NBLFZ<=7Siev zJua(kUbwa#a)|f&=!s2e;<`1}_p$f-h7I!4Q4@P*Yh*~KC9;tSm%PrG-B`bNK2ytb zmP-JXB`QsPbu*S5FNv15wI({N5-W}M8#DzgF&Y?1pG^J}QX&2*Mm)XA!;}Wk zNMx40z^LYvAp`LTg2>~cTnzQd%!&$h8dlUoDA;POrfy_R%`LybQYo3Rvks;3pFL~H zkyrBADyttG1tdGsj$PA)vv7W9;zqh=ijEz)&WgM8UFxml%91au+lhmip zuhh|>u1(VnH{25Jru_LeZ)6e8goFO*`9FXE?>L}is6(KSu-*qXtd^w4ha$ohBz__Q zXbpII569gNrFKTnz}d^2nkv`cTe~5qd2MZ7Q`$|Q#=6v|)m4>i%bV_8TfMrmz6pB- z?u4a~THdsF?z;G!u!W(ndJR-YQDtKjHbtb}6hGH=Q~H!iF)?;`BUben!dAILY-Twh zayC`2_B2+zH!wUg__H@wKHxzql@+eW>U9|G?yGF_Cu)$>8!P-1-KeD`PsY(1a`O9R3^_$kmtA4(ri=Q4B|AQA#R8@H->A->VvY<|)F zsb$F0mH1U6mvo2KWPLbwXX>Z+0Xs2dIpD5Nye{z@iHV6(Ni&m@lhTq3l2#-|BpZ^m zk{2Z>Sr=IMTa!|AQrl8@rKBKsQqgZ7>F|F(Z*Uz5Hr{q^)u)6b{x&iGNrOBviM*lM8PY|1tjnL16~rVmV( z_=@=2_=b3Qd~^J!_^$Yq@w*a!l<-nQgPAD!h9%olWZ7XkV>xe$NUTVFIPvkszb8f{ z%}Dxj(o0EQNp~h&lE0O_JNe1vJ;{5MpG_{ZuCZR9l9ZC2ay;eJl=CUsscTZ#rM{7R zGWFBcb+(6XkE4BWwI|u9r`?*Clr|}SM*6MkN7GNDO}GYmTUey&R#OrvJ8AmV^hx~r z_=tp}gmnoICtPK|)tm&Heq?^h9A&xHl4RLxdED|N%hJR(iR%(SXEY5b-JD#P{BZK) z$)6|RY`xt&*P3NrYAv=3)^_XvSbu7L(fVuaLF-X#ul1DmwDpYjob_w#w3O(S*p#@G z%#@szWhpCD9!P0U*_I-vJe~4v%KnsBQ{GAGO?f5tQ0kkhAEy2(^)IP^PffPx+8<53 zEqz}4M;TJa*CanJ99Ih+7YWMKO$$whrV`T{Q=@5zsonIXiI0Ch{&4)8@jc+}srXOg zrTF3a)C5ODcEaL>dlK$Vs7`PvY)oiN_(8%835OCsO!!m6Y;%G+*=#rGn@i0Pn%m6Z zH9uwkjrq9wWAm40gJqiKYRfk)7K_8;Lfe#B+?I`&N5P5LEr%_?vwUgMCtj5}GjV?6 zqQs?%%Mw>6RwZsgt38wWYU0!+Taq{F#Uws?Q}RQ}t;vrj?@In|^3!Oy|4n`=`Pa#Z zlix~yH~GWl{{#LFCI2Hi%sRz7!+N9jPHTd79^^XLT41fVHdvdjTddox-?IJ;{Nqw0 zQ?5_BIVCG)VTwL=O6m=%X{mXs#i_5S9tO{PQvZ<3*{0a8vE699-Ii!8wXLx=+L~=! zY};%*Y|q*LV4Gx5wb$6cYyYkNAND)a?oQj0_N%n;^wRXU^rz8(KS>YGxG7^^#=RL2 zW&9xHV8$mITs!(1;XpP?) z-yXj!-ek6zt>#tc3UigY*4$v`EINzcVzBTQqb1rh%MxRWwam86L3>y&n=CDsUFfsV zTAsJ;w;Z#avYfUITFyb2aEZ~0vlHhe+7lg#If<(h8xq}#+Y(z7+Y_Hn>_~hq@mOL{ zVsGML;;AGlNuO*)uW}@>O0G@biGJ0Yd@OkY?GbH_g*>~!|4r5>p+}Ec--84XTXiW0 z$gn--o|KA|+7x%nCdlv3l-(&EDThEdU_$HwQxFN?nix@%MXp7`hE_s1WLe=mM0UYB4=v`&n WWTKb<{QZXm|KY%YIPm{Z4*Y-mOfgCT literal 0 HcmV?d00001 diff --git a/other/libEGL64.dll b/other/libEGL64.dll new file mode 100644 index 0000000000000000000000000000000000000000..8389fa8a709ebcf35946dae3461b4299810a6d18 GIT binary patch literal 56320 zcmeFaeSB2K^*?^|$PyBE11yB+1%pO|7zx_Y1>GgPa2IxUd5(xCm;{3a5|dpGiW-_k zvR>CuirQ+ce)!m0wY9BPKMFo3fFwKz6$SAjKGfcH(MD?}D0aW^Gc$Mh?j}6gPd|VB zUcb+Uo4GS{=A1KUX3or?$*Mz#5I>MtCBmx@z0cxn4!wc!{X^FsI>_LA4*is+FFSOYg*OQJ zN)|3yRa!wfwHkPxl2mqQs`SF+TNh|)J<>$Wpu{vuYC($3Q@uY$XkyRx2^7$Cq9moz zA6!}}S&$2%Jv1T#IW|OiAuZ?|=PC6EC8>i1zFU&&7{&zYIU>{}Nflrva+wmO<&nq_ zc-SmSUe0R2g{Jt*>wL&Lc@O>&%PqL6@pYF)l1ir3l&$csfLJa;#%A1?;=T{J?y{kq zOyOWsM=CP9a1(9RO@G-WsdY*<2V`|bU8Qu~d-YI2M)+!KYf6#KWFkQ@gzs>FaOIU% z0Q@UuK~@az-9B)$VpIMv7B2x=nQxGTDX(loQ#ZXK8=c#>@6}(ng>u8OJXuM379B-a zj>ruKk}olAl9eP`*%S7focX()`K|eHYkvCZ1wS;o&gq@<`93xHGWK5?az9lz?VXgqPu)Oz?>1P>f1hcxVz-hlwzY zLcor}oej9Wd-5d7QLrq1ix&?s72uE2xgD7W$ecmr*dCZQO_`hAw96-N=zeSiYIZ4V znS*=Oh7+y>PVwnG7;s zdtj~`=?>!`JM0RWm|Nrw%vz4rMV`R26690>M

eeU`y^e=EvVqbXd0U(_Q_R?t#N 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 Date: Mon, 20 Jan 2014 21:26:18 +0100 Subject: [PATCH 32/50] Linux: Completly disabled QSystemTrayIcon Not showing tray was not enought. Even creating object cause instability. --- kcc/KCC_gui.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/kcc/KCC_gui.py b/kcc/KCC_gui.py index 9158dca..463bb02 100644 --- a/kcc/KCC_gui.py +++ b/kcc/KCC_gui.py @@ -248,7 +248,7 @@ class ProgressThread(QtCore.QThread): self.running = True while self.running: sleep(1) - if self.content: + if self.content and GUI.conversionAlive: MW.addMessage.emit(self.content + self.progress * '.', 'info', True) self.progress += 1 if self.progress == 4: @@ -948,7 +948,6 @@ class KCCGUI(KCC_ui.Ui_KCC): if not GUI.ConvertButton.isEnabled(): event.ignore() self.contentServer.stop() - self.tray.hide() self.settings.setValue('settingsVersion', __version__) self.settings.setValue('lastPath', self.lastPath) self.settings.setValue('lastDevice', GUI.DeviceBox.currentIndex()) @@ -969,6 +968,8 @@ class KCCGUI(KCC_ui.Ui_KCC): 'customHeight': GUI.customHeight.text(), 'GammaSlider': float(self.GammaValue)*100}) self.settings.sync() + if not sys.platform.startswith('linux'): + self.tray.hide() def handleMessage(self, message): MW.raise_() @@ -1026,7 +1027,6 @@ class KCCGUI(KCC_ui.Ui_KCC): purgeSettingsVersions = [''] self.icons = Icons() self.webContent = KCC_rc_web.WebContent() - self.tray = SystemTrayIcon() self.settings = QtCore.QSettings('KindleComicConverter', 'KindleComicConverter') self.settingsVersion = self.settings.value('settingsVersion', '', type=str) if self.settingsVersion in purgeSettingsVersions: @@ -1051,20 +1051,22 @@ class KCCGUI(KCC_ui.Ui_KCC): self.statusBarFontSize = 10 self.statusBarStyle = 'QLabel{padding-top:2px;padding-bottom:3px;}' self.ProgressBar.setStyleSheet('QProgressBar{padding-top:5px;text-align:center;}') + self.tray = SystemTrayIcon() self.tray.show() + MW.addTrayMessage.connect(self.tray.addTrayMessage) elif sys.platform.startswith('linux'): self.listFontSize = 8 self.statusBarFontSize = 8 self.statusBarStyle = 'QLabel{padding-top:5px;padding-bottom:3px;}' self.statusBar.setStyleSheet('QStatusBar::item{border:0px;border-top:2px solid #C2C7CB;}') - # Linux implementation QSystemTrayIcon is simply broken in Qt 5.2.0 - #self.tray.show() else: self.listFontSize = 9 self.statusBarFontSize = 8 self.statusBarStyle = 'QLabel{padding-top:3px;padding-bottom:3px}' self.statusBar.setStyleSheet('QStatusBar::item{border:0px;border-top:2px solid #C2C7CB;}') + self.tray = SystemTrayIcon() self.tray.show() + MW.addTrayMessage.connect(self.tray.addTrayMessage) self.profiles = { "Kindle Paperwhite": {'Quality': True, 'ForceExpert': False, 'DefaultFormat': 0, @@ -1199,7 +1201,6 @@ class KCCGUI(KCC_ui.Ui_KCC): MW.progressBarTick.connect(self.updateProgressbar) MW.modeConvert.connect(self.modeConvert) MW.addMessage.connect(self.addMessage) - MW.addTrayMessage.connect(self.tray.addTrayMessage) MW.showDialog.connect(self.showDialog) MW.hideProgressBar.connect(self.hideProgressBar) MW.forceShutdown.connect(self.forceShutdown) From 786d2a9e1f313305b88e1b83d1023402e9c4b1d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Jastrz=C4=99bski?= Date: Mon, 20 Jan 2014 22:26:50 +0100 Subject: [PATCH 33/50] Added option to select output directory --- KCC-Linux.ui | 3 +++ KCC-OSX.ui | 3 +++ KCC.ui | 3 +++ kcc/KCC_gui.py | 24 ++++++++++++++++++++++++ kcc/KCC_ui.py | 3 ++- kcc/KCC_ui_linux.py | 3 ++- kcc/KCC_ui_osx.py | 3 ++- setup.py | 4 ++-- 8 files changed, 41 insertions(+), 5 deletions(-) diff --git a/KCC-Linux.ui b/KCC-Linux.ui index e08ef60..c69f1ce 100644 --- a/KCC-Linux.ui +++ b/KCC-Linux.ui @@ -240,6 +240,9 @@ Qt::NoFocus + + <html><head/><body><p>Shift+Click to select the output directory.</p></body></html> + Convert diff --git a/KCC-OSX.ui b/KCC-OSX.ui index 21dc000..38365a5 100644 --- a/KCC-OSX.ui +++ b/KCC-OSX.ui @@ -243,6 +243,9 @@ Qt::NoFocus + + <html><head/><body><p><span style=" font-size:12pt;">Shift+Click to select the output directory.</span></p></body></html> + Convert diff --git a/KCC.ui b/KCC.ui index a067723..d062fec 100644 --- a/KCC.ui +++ b/KCC.ui @@ -206,6 +206,9 @@ Qt::NoFocus + + <html><head/><body><p>Shift+Click to select the output directory.</p></body></html> + Convert diff --git a/kcc/KCC_gui.py b/kcc/KCC_gui.py index 463bb02..726089f 100644 --- a/kcc/KCC_gui.py +++ b/kcc/KCC_gui.py @@ -514,6 +514,12 @@ class WorkerThread(QtCore.QThread): GUI.progress.content = '' mobiPath = item.replace('.epub', '.mobi') os.remove(mobiPath + '_toclean') + if GUI.targetDirectory and GUI.targetDirectory != os.path.split(mobiPath)[0]: + try: + move(mobiPath, GUI.targetDirectory) + mobiPath = os.path.join(GUI.targetDirectory, os.path.basename(mobiPath)) + except Exception: + pass GUI.completedWork[os.path.basename(mobiPath)] = mobiPath MW.addMessage.emit('Cleaning MOBI files... Done!', 'info', True) else: @@ -544,6 +550,12 @@ class WorkerThread(QtCore.QThread): False) else: for item in outputPath: + if GUI.targetDirectory and GUI.targetDirectory != os.path.split(item)[0]: + try: + move(item, GUI.targetDirectory) + item = os.path.join(GUI.targetDirectory, os.path.basename(item)) + except Exception: + pass GUI.completedWork[os.path.basename(item)] = item GUI.progress.content = '' GUI.progress.stop() @@ -918,6 +930,17 @@ class KCCGUI(KCC_ui.Ui_KCC): self.conversionAlive = False self.worker.sync() else: + # noinspection PyArgumentList + if QtWidgets.QApplication.keyboardModifiers() == QtCore.Qt.ShiftModifier: + dname = QtWidgets.QFileDialog.getExistingDirectory(MW, 'Select output directory', self.lastPath) + if dname != '': + if sys.platform.startswith('win'): + dname = dname.replace('/', '\\') + GUI.targetDirectory = dname + else: + GUI.targetDirectory = '' + else: + GUI.targetDirectory = '' self.progress.start() if self.needClean: self.needClean = False @@ -1046,6 +1069,7 @@ class KCCGUI(KCC_ui.Ui_KCC): self.needClean = True self.GammaValue = 1.0 self.completedWork = {} + self.targetDirectory = '' if sys.platform.startswith('darwin'): self.listFontSize = 11 self.statusBarFontSize = 10 diff --git a/kcc/KCC_ui.py b/kcc/KCC_ui.py index d370c57..8d28591 100644 --- a/kcc/KCC_ui.py +++ b/kcc/KCC_ui.py @@ -2,7 +2,7 @@ # Form implementation generated from reading ui file 'KCC.ui' # -# Created: Mon Jan 20 10:34:14 2014 +# Created: Mon Jan 20 22:02:01 2014 # by: PyQt5 UI code generator 5.2 # # WARNING! All changes made in this file will be lost! @@ -274,6 +274,7 @@ class Ui_KCC(object): self.NoRotateBox.setText(_translate("KCC", "No split/rotate")) self.DeviceBox.setToolTip(_translate("KCC", "Target device.")) self.FormatBox.setToolTip(_translate("KCC", "Output format.")) + self.ConvertButton.setToolTip(_translate("KCC", "

Shift+Click to select the output directory.

")) self.ConvertButton.setText(_translate("KCC", "Convert")) self.DirectoryButton.setText(_translate("KCC", "Add directory")) self.FileButton.setText(_translate("KCC", "Add file")) diff --git a/kcc/KCC_ui_linux.py b/kcc/KCC_ui_linux.py index 089647c..25592d8 100644 --- a/kcc/KCC_ui_linux.py +++ b/kcc/KCC_ui_linux.py @@ -2,7 +2,7 @@ # Form implementation generated from reading ui file 'KCC-Linux.ui' # -# Created: Mon Jan 20 10:34:24 2014 +# Created: Mon Jan 20 22:02:12 2014 # by: PyQt5 UI code generator 5.2 # # WARNING! All changes made in this file will be lost! @@ -343,6 +343,7 @@ class Ui_KCC(object): self.NoRotateBox.setText(_translate("KCC", "No split/rotate")) self.DeviceBox.setToolTip(_translate("KCC", "Target device.")) self.FormatBox.setToolTip(_translate("KCC", "Output format.")) + self.ConvertButton.setToolTip(_translate("KCC", "

Shift+Click to select the output directory.

")) self.ConvertButton.setText(_translate("KCC", "Convert")) self.DirectoryButton.setText(_translate("KCC", "Add directory")) self.FileButton.setText(_translate("KCC", "Add file")) diff --git a/kcc/KCC_ui_osx.py b/kcc/KCC_ui_osx.py index 5009adb..aea2ae6 100644 --- a/kcc/KCC_ui_osx.py +++ b/kcc/KCC_ui_osx.py @@ -2,7 +2,7 @@ # Form implementation generated from reading ui file 'KCC-OSX.ui' # -# Created: Mon Jan 20 10:34:32 2014 +# Created: Mon Jan 20 22:02:21 2014 # by: PyQt5 UI code generator 5.2 # # WARNING! All changes made in this file will be lost! @@ -366,6 +366,7 @@ class Ui_KCC(object): self.NoRotateBox.setText(_translate("KCC", "No split/rotate")) self.DeviceBox.setToolTip(_translate("KCC", "

Target device.

")) self.FormatBox.setToolTip(_translate("KCC", "

Output format.

")) + self.ConvertButton.setToolTip(_translate("KCC", "

Shift+Click to select the output directory.

")) self.ConvertButton.setText(_translate("KCC", "Convert")) self.DirectoryButton.setText(_translate("KCC", "Add directory")) self.FileButton.setText(_translate("KCC", "Add file")) diff --git a/setup.py b/setup.py index 8f5e2f1..6e5b5b9 100755 --- a/setup.py +++ b/setup.py @@ -52,9 +52,9 @@ if platform == "darwin": ) ) elif platform == "win32": - import platform + import platform as arch from cx_Freeze import setup, Executable - if platform.architecture()[0] == '64bit': + if arch.architecture()[0] == '64bit': library = 'libEGL64.dll' else: library = 'libEGL32.dll' From 25a68ebdea90f2fe96fb4ca81a051aeea470a63e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Jastrz=C4=99bski?= Date: Tue, 21 Jan 2014 10:57:54 +0100 Subject: [PATCH 34/50] Reformated tooltips --- KCC-Linux.ui | 48 ++++++++++++++++++++++++++++--------------- KCC-OSX.ui | 34 +++++++++++++++--------------- KCC.ui | 30 +++++++++++++-------------- kcc/KCC_ui.py | 32 ++++++++++++++--------------- kcc/KCC_ui_linux.py | 50 +++++++++++++++++++++++++++++---------------- kcc/KCC_ui_osx.py | 36 ++++++++++++++++---------------- 6 files changed, 129 insertions(+), 101 deletions(-) diff --git a/KCC-Linux.ui b/KCC-Linux.ui index c69f1ce..078432d 100644 --- a/KCC-Linux.ui +++ b/KCC-Linux.ui @@ -71,7 +71,7 @@ Qt::NoFocus
- <html><head/><body><p>Disable image optimizations.<br/>Input images must be already resized.</p></body></html> + <html><head/><body><p style='white-space:pre'>Disable image optimizations.<br/>Input images must be already resized.</p></body></html> No optimisation @@ -110,7 +110,7 @@ Qt::NoFocus - <html><head/><body><p>Enable auto-splitting of webtoons like <span style=" font-style:italic;">Tower of God</span> or <span style=" font-style:italic;">Noblesse</span>.<br/>Pages with a low width, high height and vertical panel flow.</p></body></html> + <html><head/><body><p style='white-space:pre'>Enable auto-splitting of webtoons like <span style=" font-style:italic;">Tower of God</span> or <span style=" font-style:italic;">Noblesse</span>.<br/>Pages with a low width, high height and vertical panel flow.</p></body></html> Webtoon mode @@ -128,7 +128,7 @@ Qt::NoFocus - <html><head/><body><p>Create PNG files instead JPEG.<br/>Quality increase is not noticeable on most of devices.<br/>Output files <span style=" font-weight:600;">might</span> be smaller.<br/><span style=" font-weight:600;">MOBI conversion will be much slower.</span></p></body></html> + <html><head/><body><p style='white-space:pre'>Create PNG files instead JPEG.<br/>Quality increase is not noticeable on most of devices.<br/>Output files <span style=" font-weight:600;">might</span> be smaller.<br/><span style=" font-weight:600;">MOBI conversion will be much slower.</span></p></body></html> PNG output @@ -167,7 +167,7 @@ Qt::NoFocus - <html><head/><body><p>Disable splitting and rotation.</p></body></html> + <html><head/><body><p style='white-space:pre'>Disable splitting and rotation.</p></body></html> No split/rotate @@ -195,7 +195,7 @@ Qt::NoFocus - Target device. + <html><head/><body><p style='white-space:pre'>Target device.</p></body></html> @@ -217,7 +217,7 @@ Qt::NoFocus - Output format. + <html><head/><body><p style='white-space:pre'>Output format.</p></body></html> @@ -241,7 +241,7 @@ Qt::NoFocus - <html><head/><body><p>Shift+Click to select the output directory.</p></body></html> + <html><head/><body><p style='white-space:pre'>Shift+Click to select the output directory.</p></body></html> Convert @@ -362,7 +362,7 @@ Qt::NoFocus - Enable right-to-left reading. + <html><head/><body><p style='white-space:pre'>Enable right-to-left reading.</p></body></html> Manga mode @@ -390,9 +390,23 @@ <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:9pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-weight:600; text-decoration: underline;">Unchecked - Normal quality mode<br /></span><span style=" font-family:'MS Shell Dlg 2'; font-style:italic;">Use it when Panel View support is not needed.</span><span style=" font-family:'MS Shell Dlg 2'; font-weight:600; text-decoration: underline;"><br /></span><span style=" font-family:'MS Shell Dlg 2';">- Maximum quality when zoom is not enabled.<br />- Poor quality when zoom is enabled.<br />- Lowest file size.</span></p> -<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-weight:600; text-decoration: underline;">Indeterminate - High quality mode<br /></span><span style=" font-family:'MS Shell Dlg 2'; font-style:italic;">Not zoomed image </span><span style=" font-family:'MS Shell Dlg 2'; font-weight:600; font-style:italic;">might </span><span style=" font-family:'MS Shell Dlg 2'; font-style:italic;">be a little blurry.<br /></span><span style=" font-family:'MS Shell Dlg 2'; font-style:italic;">Smaller images might be forcefully upscaled in this mode.</span><span style=" font-family:'MS Shell Dlg 2'; font-weight:600; text-decoration: underline;"><br /></span><span style=" font-family:'MS Shell Dlg 2';">- Medium/High quality when zoom is not enabled.<br />- Maximum quality when zoom is enabled.</span></p> -<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-weight:600; text-decoration: underline;">Checked - Ultra quality mode<br /></span><span style=" font-family:'MS Shell Dlg 2'; font-style:italic;">Maximum possible quality.</span><span style=" font-family:'MS Shell Dlg 2'; font-weight:600; text-decoration: underline;"><br /></span><span style=" font-family:'MS Shell Dlg 2';">- Maximum quality when zoom is not enabled.<br />- Maximum quality when zoom is enabled.<br />- Very high file size.</span></p></body></html> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600; text-decoration: underline;">Unchecked - Normal quality mode</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-style:italic;">Use it when Panel View support is not needed.</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">- Maximum quality when zoom is not enabled.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">- Poor quality when zoom is enabled.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">- Lowest file size.</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600; text-decoration: underline;">Indeterminate - High quality mode</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-style:italic;">Not zoomed image might be a little blurry.</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-style:italic;">Smaller images might be forcefully upscaled in this mode.</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">- Medium/High quality when zoom is not enabled.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">- Maximum quality when zoom is enabled.</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600; text-decoration: underline;">Checked - Ultra quality mode</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-style:italic;">Maximum possible quality.</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">- Maximum quality when zoom is not enabled.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">- Maximum quality when zoom is enabled.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">- Very high file size.</p></body></html> High/Ultra quality @@ -419,7 +433,7 @@ p, li { white-space: pre-wrap; } Qt::NoFocus - <html><head/><body><p>Disable splitting of two-page spreads.<br/>They will be rotated instead.</p></body></html> + <html><head/><body><p style='white-space:pre'>Disable splitting of two-page spreads.<br/>They will be rotated instead.</p></body></html> Horizontal mode @@ -638,7 +652,7 @@ p, li { white-space: pre-wrap; } Qt::NoFocus - <html><head/><body><p>Don't convert images to grayscale.</p></body></html> + <html><head/><body><p style='white-space:pre'>Don't convert images to grayscale.</p></body></html> Color mode @@ -667,7 +681,7 @@ p, li { white-space: pre-wrap; } - Resolution of target device. + <html><head/><body><p>Resolution of target device.</p></body></html> Custom width: @@ -700,7 +714,7 @@ p, li { white-space: pre-wrap; } false - Resolution of target device. + <html><head/><body><p>Resolution of target device.</p></body></html> 0000 @@ -718,7 +732,7 @@ p, li { white-space: pre-wrap; } - Resolution of target device. + <html><head/><body><p>Resolution of target device.</p></body></html> Custom height: @@ -751,7 +765,7 @@ p, li { white-space: pre-wrap; } false - Resolution of target device. + <html><head/><body><p>Resolution of target device.</p></body></html> 0000 diff --git a/KCC-OSX.ui b/KCC-OSX.ui index 38365a5..3360839 100644 --- a/KCC-OSX.ui +++ b/KCC-OSX.ui @@ -69,7 +69,7 @@ Qt::NoFocus - <html><head/><body><p><span style=" font-size:12pt;">Disable image optimizations.<br/>Input images must be already resized.</span></p></body></html> + <html><head/><body><p style='white-space:pre'>Disable image optimizations.<br/>Input images must be already resized.</p></body></html> No optimisation @@ -88,7 +88,7 @@ Qt::NoFocus - <html><head/><body><p><span style=" font-size:12pt; font-weight:600; text-decoration: underline;">Unchecked - Nothing<br/></span><span style=" font-size:12pt;">Images smaller than device resolution will not be resized.</span></p><p><span style=" font-size:12pt; font-weight:600; text-decoration: underline;">Indeterminate - Stretching<br/></span><span style=" font-size:12pt;">Images smaller than device resolution will be resized. Aspect ratio will be not preserved.</span></p><p><span style=" font-size:12pt; font-weight:600; text-decoration: underline;">Checked - Upscaling<br/></span><span style=" font-size:12pt;">Images smaller than device resolution will be resized. Aspect ratio will be preserved.</span></p></body></html> + <html><head/><body><p><span style=" font-weight:600; text-decoration: underline;">Unchecked - Nothing<br/></span>Images smaller than device resolution will not be resized.</p><p><span style=" font-weight:600; text-decoration: underline;">Indeterminate - Stretching<br/></span>Images smaller than device resolution will be resized. Aspect ratio will be not preserved.</p><p><span style=" font-weight:600; text-decoration: underline;">Checked - Upscaling<br/></span>Images smaller than device resolution will be resized. Aspect ratio will be preserved.</p></body></html> Stretch/Upscale @@ -110,7 +110,7 @@ Qt::NoFocus - <html><head/><body><p><span style=" font-size:12pt;">Enable auto-splitting of webtoons like </span><span style=" font-size:12pt; font-style:italic;">Tower of God</span><span style=" font-size:12pt;"> or </span><span style=" font-size:12pt; font-style:italic;">Noblesse</span><span style=" font-size:12pt;">.<br/>Pages with a low width, high height and vertical panel flow.</span></p></body></html> + <html><head/><body><p style='white-space:pre'>Enable auto-splitting of webtoons like <span style=" font-style:italic;">Tower of God</span> or <span style=" font-style:italic;">Noblesse</span>.<br/>Pages with a low width, high height and vertical panel flow.</p></body></html> Webtoon mode @@ -129,7 +129,7 @@ Qt::NoFocus - <html><head/><body><p><span style=" font-size:12pt;">Create PNG files instead JPEG.<br/>Quality increase is not noticeable on most of devices.<br/>Output files </span><span style=" font-size:12pt; font-weight:600;">might</span><span style=" font-size:12pt;"> be smaller.<br/></span><span style=" font-size:12pt; font-weight:600;">MOBI conversion will be much slower.</span></p></body></html> + <html><head/><body><p style='white-space:pre'>Create PNG files instead JPEG.<br/>Quality increase is not noticeable on most of devices.<br/>Output files <span style=" font-weight:600;">might</span> be smaller.<br/><span style=" font-weight:600;">MOBI conversion will be much slower.</span></p></body></html> PNG output @@ -148,7 +148,7 @@ Qt::NoFocus - <html><head/><body><p><span style=" font-size:12pt; font-weight:600; text-decoration: underline;">Unchecked - Autodetection<br/></span><span style=" font-size:12pt;">Color of margins fill will be detected automatically.</span></p><p><span style=" font-size:12pt; font-weight:600; text-decoration: underline;">Indeterminate - White<br/></span><span style=" font-size:12pt;">Margins will be filled with white color.</span></p><p><span style=" font-size:12pt; font-weight:600; text-decoration: underline;">Checked - Black<br/></span><span style=" font-size:12pt;">Margins will be filled with black color.</span></p></body></html> + <html><head/><body><p><span style=" font-weight:600; text-decoration: underline;">Unchecked - Autodetection<br/></span>Color of margins fill will be detected automatically.</p><p><span style=" font-weight:600; text-decoration: underline;">Indeterminate - White<br/></span>Margins will be filled with white color.</p><p><span style=" font-weight:600; text-decoration: underline;">Checked - Black<br/></span>Margins will be filled with black color.</p></body></html> W/B margins @@ -170,7 +170,7 @@ Qt::NoFocus - <html><head/><body><p><span style=" font-size:12pt;">Disable splitting and rotation.</span></p></body></html> + <html><head/><body><p style='white-space:pre'>Disable splitting and rotation.</p></body></html> No split/rotate @@ -198,7 +198,7 @@ Qt::NoFocus - <html><head/><body><p><span style=" font-size:12pt;">Target device.</span></p></body></html> + <html><head/><body><p style='white-space:pre'>Target device.</p></body></html> @@ -220,7 +220,7 @@ Qt::NoFocus - <html><head/><body><p><span style=" font-size:12pt;">Output format.</span></p></body></html> + <html><head/><body><p style='white-space:pre'>Output format.</p></body></html> @@ -244,7 +244,7 @@ Qt::NoFocus - <html><head/><body><p><span style=" font-size:12pt;">Shift+Click to select the output directory.</span></p></body></html> + <html><head/><body><p style='white-space:pre'>Shift+Click to select the output directory.</p></body></html> Convert @@ -366,7 +366,7 @@ Qt::NoFocus - <html><head/><body><p><span style=" font-size:12pt;">Enable right-to-left reading.</span></p></body></html> + <html><head/><body><p style='white-space:pre'>Enable right-to-left reading.</p></body></html> Manga mode @@ -391,7 +391,7 @@ Qt::NoFocus - <html><head/><body><p><span style=" font-size:12pt; font-weight:600; text-decoration: underline;">Unchecked - Normal quality mode<br/></span><span style=" font-size:12pt; font-style:italic;">Use it when Panel View support is not needed.</span><span style=" font-size:12pt; font-weight:600; text-decoration: underline;"><br/></span><span style=" font-size:12pt;">- Maximum quality when zoom is not enabled.<br/>- Poor quality when zoom is enabled.<br/>- Lowest file size.</span></p><p><span style=" font-size:12pt; font-weight:600; text-decoration: underline;">Indeterminate - High quality mode<br/></span><span style=" font-size:12pt; font-style:italic;">Not zoomed image </span><span style=" font-size:12pt; font-weight:600; font-style:italic;">might </span><span style=" font-size:12pt; font-style:italic;">be a little blurry.<br/>Smaller images might be forcefully upscaled in this mode.</span><span style=" font-size:12pt; font-weight:600; text-decoration: underline;"><br/></span><span style=" font-size:12pt;">- Medium/High quality when zoom is not enabled.<br/>- Maximum quality when zoom is enabled.</span></p><p><span style=" font-size:12pt; font-weight:600; text-decoration: underline;">Checked - Ultra quality mode<br/></span><span style=" font-size:12pt; font-style:italic;">Maximum possible quality.</span><span style=" font-size:12pt; font-weight:600; text-decoration: underline;"><br/></span><span style=" font-size:12pt;">- Maximum quality when zoom is not enabled.<br/>- Maximum quality when zoom is enabled.<br/>- Very high file size.</span></p></body></html> + <html><head/><body><p><span style=" font-weight:600; text-decoration: underline;">Unchecked - Normal quality mode<br/></span><span style=" font-style:italic;">Use it when Panel View support is not needed.<br/></span>- Maximum quality when zoom is not enabled.<br/>- Poor quality when zoom is enabled.<br/>- Lowest file size.</p><p><span style=" font-weight:600; text-decoration: underline;">Indeterminate - High quality mode<br/></span><span style=" font-style:italic;">Not zoomed image might be a little blurry.<br/>Smaller images might be forcefully upscaled in this mode.<br/></span>- Medium/High quality when zoom is not enabled.<br/>- Maximum quality when zoom is enabled.</p><p><span style=" font-weight:600; text-decoration: underline;">Checked - Ultra quality mode<br/></span><span style=" font-style:italic;">Maximum possible quality.<br/></span>- Maximum quality when zoom is not enabled.<br/>- Maximum quality when zoom is enabled.<br/>- Very high file size.</p></body></html> High/Ultra quality @@ -419,7 +419,7 @@ Qt::NoFocus - <html><head/><body><p><span style=" font-size:12pt;">Disable splitting of two-page spreads.<br/>They will be rotated instead.</span></p></body></html> + <html><head/><body><p style='white-space:pre'>Disable splitting of two-page spreads.<br/>They will be rotated instead.</p></body></html> Horizontal mode @@ -639,7 +639,7 @@ Qt::NoFocus - <html><head/><body><p><span style=" font-size:12pt;">Don't convert images to grayscale.</span></p></body></html> + <html><head/><body><p style='white-space:pre'>Don't convert images to grayscale.</p></body></html> Color mode @@ -671,7 +671,7 @@ - <html><head/><body><p><span style=" font-size:12pt;">Resolution of target device.</span></p></body></html> + <html><head/><body><p style='white-space:pre'>Resolution of target device.</p></body></html> Custom width: @@ -705,7 +705,7 @@ false - <html><head/><body><p><span style=" font-size:12pt;">Resolution of target device.</span></p></body></html> + <html><head/><body><p style='white-space:pre'>Resolution of target device.</p></body></html> 0000 @@ -726,7 +726,7 @@ - <html><head/><body><p><span style=" font-size:12pt;">Resolution of target device.</span></p></body></html> + <html><head/><body><p style='white-space:pre'>Resolution of target device.</p></body></html> Custom height: @@ -760,7 +760,7 @@ false - <html><head/><body><p><span style=" font-size:12pt;">Resolution of target device.</span></p></body></html> + <html><head/><body><p style='white-space:pre'>Resolution of target device.</p></body></html> 0000 diff --git a/KCC.ui b/KCC.ui index d062fec..f91dabe 100644 --- a/KCC.ui +++ b/KCC.ui @@ -65,7 +65,7 @@ Qt::NoFocus - <html><head/><body><p>Disable image optimizations.<br/>Input images must be already resized.</p></body></html> + <html><head/><body><p style='white-space:pre'>Disable image optimizations.<br/>Input images must be already resized.</p></body></html> No optimisation @@ -94,7 +94,7 @@ Qt::NoFocus - <html><head/><body><p>Enable auto-splitting of webtoons like <span style=" font-style:italic;">Tower of God</span> or <span style=" font-style:italic;">Noblesse</span>.<br/>Pages with a low width, high height and vertical panel flow.</p></body></html> + <html><head/><body><p style='white-space:pre'>Enable auto-splitting of webtoons like <span style=" font-style:italic;">Tower of God</span> or <span style=" font-style:italic;">Noblesse</span>.<br/>Pages with a low width, high height and vertical panel flow.</p></body></html> Webtoon mode @@ -107,7 +107,7 @@ Qt::NoFocus - <html><head/><body><p>Create PNG files instead JPEG.<br/>Quality increase is not noticeable on most of devices.<br/>Output files <span style=" font-weight:600;">might</span> be smaller.<br/><span style=" font-weight:600;">MOBI conversion will be much slower.</span></p></body></html> + <html><head/><body><p style='white-space:pre'>Create PNG files instead JPEG.<br/>Quality increase is not noticeable on most of devices.<br/>Output files <span style=" font-weight:600;">might</span> be smaller.<br/><span style=" font-weight:600;">MOBI conversion will be much slower.</span></p></body></html> PNG output @@ -136,7 +136,7 @@ Qt::NoFocus - <html><head/><body><p>Disable splitting and rotation.</p></body></html> + <html><head/><body><p style='white-space:pre'>Disable splitting and rotation.</p></body></html> No split/rotate @@ -163,7 +163,7 @@ Qt::NoFocus - Target device. + <html><head/><body><p style='white-space:pre'>Target device.</p></body></html> @@ -184,7 +184,7 @@ Qt::NoFocus - Output format. + <html><head/><body><p style='white-space:pre'>Output format.</p></body></html> @@ -207,7 +207,7 @@ Qt::NoFocus - <html><head/><body><p>Shift+Click to select the output directory.</p></body></html> + <html><head/><body><p style='white-space:pre'>Shift+Click to select the output directory.</p></body></html> Convert @@ -319,7 +319,7 @@ Qt::NoFocus - Enable right-to-left reading. + <html><head/><body><p style='white-space:pre'>Enable right-to-left reading.</p></body></html> Manga mode @@ -341,7 +341,7 @@ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8pt; font-weight:400; font-style:normal;"> +</style></head><body> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600; text-decoration: underline;">Unchecked - Normal quality mode<br /></span><span style=" font-style:italic;">Use it when Panel View support is not needed.</span><span style=" font-weight:600; text-decoration: underline;"><br /></span>- Maximum quality when zoom is not enabled.<br />- Poor quality when zoom is enabled.<br />- Lowest file size.</p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600; text-decoration: underline;">Indeterminate - High quality mode<br /></span><span style=" font-style:italic;">Not zoomed image </span><span style=" font-weight:600; font-style:italic;">might </span><span style=" font-style:italic;">be a little blurry.<br />Smaller images might be forcefully upscaled in this mode.</span><span style=" font-weight:600; text-decoration: underline;"><br /></span>- Medium/High quality when zoom is not enabled.<br />- Maximum quality when zoom is enabled.</p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600; text-decoration: underline;">Checked - Ultra quality mode<br /></span><span style=" font-style:italic;">Maximum possible quality.</span><span style=" font-weight:600; text-decoration: underline;"><br /></span>- Maximum quality when zoom is not enabled.<br />- Maximum quality when zoom is enabled.<br />- Very high file size.</p></body></html> @@ -366,7 +366,7 @@ p, li { white-space: pre-wrap; } Qt::NoFocus - <html><head/><body><p>Disable splitting of two-page spreads.<br/>They will be rotated instead.</p></body></html> + <html><head/><body><p style='white-space:pre'>Disable splitting of two-page spreads.<br/>They will be rotated instead.</p></body></html> Horizontal mode @@ -552,7 +552,7 @@ p, li { white-space: pre-wrap; } Qt::NoFocus - <html><head/><body><p>Don't convert images to grayscale.</p></body></html> + <html><head/><body><p style='white-space:pre'>Don't convert images to grayscale.</p></body></html> Color mode @@ -571,7 +571,7 @@ p, li { white-space: pre-wrap; } - Resolution of target device. + <html><head/><body><p style='white-space:pre'>Resolution of target device.</p></body></html> Custom width: @@ -599,7 +599,7 @@ p, li { white-space: pre-wrap; } false - Resolution of target device. + <html><head/><body><p style='white-space:pre'>Resolution of target device.</p></body></html> 0000 @@ -612,7 +612,7 @@ p, li { white-space: pre-wrap; } - Resolution of target device. + <html><head/><body><p style='white-space:pre'>Resolution of target device.</p></body></html> Custom height: @@ -640,7 +640,7 @@ p, li { white-space: pre-wrap; } false - Resolution of target device. + <html><head/><body><p style='white-space:pre'>Resolution of target device.</p></body></html> 0000 diff --git a/kcc/KCC_ui.py b/kcc/KCC_ui.py index 8d28591..eb6b9f3 100644 --- a/kcc/KCC_ui.py +++ b/kcc/KCC_ui.py @@ -2,7 +2,7 @@ # Form implementation generated from reading ui file 'KCC.ui' # -# Created: Mon Jan 20 22:02:01 2014 +# Created: Tue Jan 21 10:54:31 2014 # by: PyQt5 UI code generator 5.2 # # WARNING! All changes made in this file will be lost! @@ -260,49 +260,49 @@ class Ui_KCC(object): def retranslateUi(self, KCC): _translate = QtCore.QCoreApplication.translate KCC.setWindowTitle(_translate("KCC", "Kindle Comic Converter")) - self.ProcessingBox.setToolTip(_translate("KCC", "

Disable image optimizations.
Input images must be already resized.

")) + self.ProcessingBox.setToolTip(_translate("KCC", "

Disable image optimizations.
Input images must be already resized.

")) self.ProcessingBox.setText(_translate("KCC", "No optimisation")) self.UpscaleBox.setToolTip(_translate("KCC", "

Unchecked - Nothing
Images smaller than device resolution will not be resized.

Indeterminate - Stretching
Images smaller than device resolution will be resized. Aspect ratio will be not preserved.

Checked - Upscaling
Images smaller than device resolution will be resized. Aspect ratio will be preserved.

")) self.UpscaleBox.setText(_translate("KCC", "Stretch/Upscale")) - self.WebtoonBox.setToolTip(_translate("KCC", "

Enable auto-splitting of webtoons like Tower of God or Noblesse.
Pages with a low width, high height and vertical panel flow.

")) + self.WebtoonBox.setToolTip(_translate("KCC", "

Enable auto-splitting of webtoons like Tower of God or Noblesse.
Pages with a low width, high height and vertical panel flow.

")) self.WebtoonBox.setText(_translate("KCC", "Webtoon mode")) - self.NoDitheringBox.setToolTip(_translate("KCC", "

Create PNG files instead JPEG.
Quality increase is not noticeable on most of devices.
Output files might be smaller.
MOBI conversion will be much slower.

")) + self.NoDitheringBox.setToolTip(_translate("KCC", "

Create PNG files instead JPEG.
Quality increase is not noticeable on most of devices.
Output files might be smaller.
MOBI conversion will be much slower.

")) self.NoDitheringBox.setText(_translate("KCC", "PNG output")) self.BorderBox.setToolTip(_translate("KCC", "

Unchecked - Autodetection
Color of margins fill will be detected automatically.

Indeterminate - White
Margins will be filled with white color.

Checked - Black
Margins will be filled with black color.

")) self.BorderBox.setText(_translate("KCC", "W/B margins")) - self.NoRotateBox.setToolTip(_translate("KCC", "

Disable splitting and rotation.

")) + self.NoRotateBox.setToolTip(_translate("KCC", "

Disable splitting and rotation.

")) self.NoRotateBox.setText(_translate("KCC", "No split/rotate")) - self.DeviceBox.setToolTip(_translate("KCC", "Target device.")) - self.FormatBox.setToolTip(_translate("KCC", "Output format.")) - self.ConvertButton.setToolTip(_translate("KCC", "

Shift+Click to select the output directory.

")) + self.DeviceBox.setToolTip(_translate("KCC", "

Target device.

")) + self.FormatBox.setToolTip(_translate("KCC", "

Output format.

")) + self.ConvertButton.setToolTip(_translate("KCC", "

Shift+Click to select the output directory.

")) self.ConvertButton.setText(_translate("KCC", "Convert")) self.DirectoryButton.setText(_translate("KCC", "Add directory")) self.FileButton.setText(_translate("KCC", "Add file")) self.ClearButton.setText(_translate("KCC", "Clear list")) - self.MangaBox.setToolTip(_translate("KCC", "Enable right-to-left reading.")) + self.MangaBox.setToolTip(_translate("KCC", "

Enable right-to-left reading.

")) self.MangaBox.setText(_translate("KCC", "Manga mode")) self.QualityBox.setToolTip(_translate("KCC", "\n" "\n" +"\n" "

Unchecked - Normal quality mode
Use it when Panel View support is not needed.
- Maximum quality when zoom is not enabled.
- Poor quality when zoom is enabled.
- Lowest file size.

\n" "

Indeterminate - High quality mode
Not zoomed image might be a little blurry.
Smaller images might be forcefully upscaled in this mode.

- Medium/High quality when zoom is not enabled.
- Maximum quality when zoom is enabled.

\n" "

Checked - Ultra quality mode
Maximum possible quality.
- Maximum quality when zoom is not enabled.
- Maximum quality when zoom is enabled.
- Very high file size.

")) self.QualityBox.setText(_translate("KCC", "High/Ultra quality")) - self.RotateBox.setToolTip(_translate("KCC", "

Disable splitting of two-page spreads.
They will be rotated instead.

")) + self.RotateBox.setToolTip(_translate("KCC", "

Disable splitting of two-page spreads.
They will be rotated instead.

")) self.RotateBox.setText(_translate("KCC", "Horizontal mode")) self.BasicModeButton.setText(_translate("KCC", "Basic")) self.AdvModeButton.setText(_translate("KCC", "Advanced")) self.GammaLabel.setText(_translate("KCC", "Gamma: Auto")) - self.ColorBox.setToolTip(_translate("KCC", "

Don\'t convert images to grayscale.

")) + self.ColorBox.setToolTip(_translate("KCC", "

Don\'t convert images to grayscale.

")) self.ColorBox.setText(_translate("KCC", "Color mode")) - self.wLabel.setToolTip(_translate("KCC", "Resolution of target device.")) + self.wLabel.setToolTip(_translate("KCC", "

Resolution of target device.

")) self.wLabel.setText(_translate("KCC", "Custom width: ")) - self.customWidth.setToolTip(_translate("KCC", "Resolution of target device.")) + self.customWidth.setToolTip(_translate("KCC", "

Resolution of target device.

")) self.customWidth.setInputMask(_translate("KCC", "0000")) - self.hLabel.setToolTip(_translate("KCC", "Resolution of target device.")) + self.hLabel.setToolTip(_translate("KCC", "

Resolution of target device.

")) self.hLabel.setText(_translate("KCC", "Custom height: ")) - self.customHeight.setToolTip(_translate("KCC", "Resolution of target device.")) + self.customHeight.setToolTip(_translate("KCC", "

Resolution of target device.

")) self.customHeight.setInputMask(_translate("KCC", "0000")) self.ActionBasic.setText(_translate("KCC", "Basic")) self.ActionAdvanced.setText(_translate("KCC", "Advanced")) diff --git a/kcc/KCC_ui_linux.py b/kcc/KCC_ui_linux.py index 25592d8..1f36255 100644 --- a/kcc/KCC_ui_linux.py +++ b/kcc/KCC_ui_linux.py @@ -2,7 +2,7 @@ # Form implementation generated from reading ui file 'KCC-Linux.ui' # -# Created: Mon Jan 20 22:02:12 2014 +# Created: Tue Jan 21 10:54:38 2014 # by: PyQt5 UI code generator 5.2 # # WARNING! All changes made in this file will be lost! @@ -329,49 +329,63 @@ class Ui_KCC(object): def retranslateUi(self, KCC): _translate = QtCore.QCoreApplication.translate KCC.setWindowTitle(_translate("KCC", "Kindle Comic Converter")) - self.ProcessingBox.setToolTip(_translate("KCC", "

Disable image optimizations.
Input images must be already resized.

")) + self.ProcessingBox.setToolTip(_translate("KCC", "

Disable image optimizations.
Input images must be already resized.

")) self.ProcessingBox.setText(_translate("KCC", "No optimisation")) self.UpscaleBox.setToolTip(_translate("KCC", "

Unchecked - Nothing
Images smaller than device resolution will not be resized.

Indeterminate - Stretching
Images smaller than device resolution will be resized. Aspect ratio will be not preserved.

Checked - Upscaling
Images smaller than device resolution will be resized. Aspect ratio will be preserved.

")) self.UpscaleBox.setText(_translate("KCC", "Stretch/Upscale")) - self.WebtoonBox.setToolTip(_translate("KCC", "

Enable auto-splitting of webtoons like Tower of God or Noblesse.
Pages with a low width, high height and vertical panel flow.

")) + self.WebtoonBox.setToolTip(_translate("KCC", "

Enable auto-splitting of webtoons like Tower of God or Noblesse.
Pages with a low width, high height and vertical panel flow.

")) self.WebtoonBox.setText(_translate("KCC", "Webtoon mode")) - self.NoDitheringBox.setToolTip(_translate("KCC", "

Create PNG files instead JPEG.
Quality increase is not noticeable on most of devices.
Output files might be smaller.
MOBI conversion will be much slower.

")) + self.NoDitheringBox.setToolTip(_translate("KCC", "

Create PNG files instead JPEG.
Quality increase is not noticeable on most of devices.
Output files might be smaller.
MOBI conversion will be much slower.

")) self.NoDitheringBox.setText(_translate("KCC", "PNG output")) self.BorderBox.setToolTip(_translate("KCC", "

Unchecked - Autodetection
Color of margins fill will be detected automatically.

Indeterminate - White
Margins will be filled with white color.

Checked - Black
Margins will be filled with black color.

")) self.BorderBox.setText(_translate("KCC", "W/B margins")) - self.NoRotateBox.setToolTip(_translate("KCC", "

Disable splitting and rotation.

")) + self.NoRotateBox.setToolTip(_translate("KCC", "

Disable splitting and rotation.

")) self.NoRotateBox.setText(_translate("KCC", "No split/rotate")) - self.DeviceBox.setToolTip(_translate("KCC", "Target device.")) - self.FormatBox.setToolTip(_translate("KCC", "Output format.")) - self.ConvertButton.setToolTip(_translate("KCC", "

Shift+Click to select the output directory.

")) + self.DeviceBox.setToolTip(_translate("KCC", "

Target device.

")) + self.FormatBox.setToolTip(_translate("KCC", "

Output format.

")) + self.ConvertButton.setToolTip(_translate("KCC", "

Shift+Click to select the output directory.

")) self.ConvertButton.setText(_translate("KCC", "Convert")) self.DirectoryButton.setText(_translate("KCC", "Add directory")) self.FileButton.setText(_translate("KCC", "Add file")) self.ClearButton.setText(_translate("KCC", "Clear list")) - self.MangaBox.setToolTip(_translate("KCC", "Enable right-to-left reading.")) + self.MangaBox.setToolTip(_translate("KCC", "

Enable right-to-left reading.

")) self.MangaBox.setText(_translate("KCC", "Manga mode")) self.QualityBox.setToolTip(_translate("KCC", "\n" "\n" -"

Unchecked - Normal quality mode
Use it when Panel View support is not needed.
- Maximum quality when zoom is not enabled.
- Poor quality when zoom is enabled.
- Lowest file size.

\n" -"

Indeterminate - High quality mode
Not zoomed image might be a little blurry.
Smaller images might be forcefully upscaled in this mode.
- Medium/High quality when zoom is not enabled.
- Maximum quality when zoom is enabled.

\n" -"

Checked - Ultra quality mode
Maximum possible quality.
- Maximum quality when zoom is not enabled.
- Maximum quality when zoom is enabled.
- Very high file size.

")) +"

Unchecked - Normal quality mode

\n" +"

Use it when Panel View support is not needed.

\n" +"

- Maximum quality when zoom is not enabled.

\n" +"

- Poor quality when zoom is enabled.

\n" +"

- Lowest file size.

\n" +"


\n" +"

Indeterminate - High quality mode

\n" +"

Not zoomed image might be a little blurry.

\n" +"

Smaller images might be forcefully upscaled in this mode.

\n" +"

- Medium/High quality when zoom is not enabled.

\n" +"

- Maximum quality when zoom is enabled.

\n" +"


\n" +"

Checked - Ultra quality mode

\n" +"

Maximum possible quality.

\n" +"

- Maximum quality when zoom is not enabled.

\n" +"

- Maximum quality when zoom is enabled.

\n" +"

- Very high file size.

")) self.QualityBox.setText(_translate("KCC", "High/Ultra quality")) - self.RotateBox.setToolTip(_translate("KCC", "

Disable splitting of two-page spreads.
They will be rotated instead.

")) + self.RotateBox.setToolTip(_translate("KCC", "

Disable splitting of two-page spreads.
They will be rotated instead.

")) self.RotateBox.setText(_translate("KCC", "Horizontal mode")) self.BasicModeButton.setText(_translate("KCC", "Basic")) self.AdvModeButton.setText(_translate("KCC", "Advanced")) self.GammaLabel.setText(_translate("KCC", "Gamma: Auto")) - self.ColorBox.setToolTip(_translate("KCC", "

Don\'t convert images to grayscale.

")) + self.ColorBox.setToolTip(_translate("KCC", "

Don\'t convert images to grayscale.

")) self.ColorBox.setText(_translate("KCC", "Color mode")) - self.wLabel.setToolTip(_translate("KCC", "Resolution of target device.")) + self.wLabel.setToolTip(_translate("KCC", "

Resolution of target device.

")) self.wLabel.setText(_translate("KCC", "Custom width: ")) - self.customWidth.setToolTip(_translate("KCC", "Resolution of target device.")) + self.customWidth.setToolTip(_translate("KCC", "

Resolution of target device.

")) self.customWidth.setInputMask(_translate("KCC", "0000")) - self.hLabel.setToolTip(_translate("KCC", "Resolution of target device.")) + self.hLabel.setToolTip(_translate("KCC", "

Resolution of target device.

")) self.hLabel.setText(_translate("KCC", "Custom height: ")) - self.customHeight.setToolTip(_translate("KCC", "Resolution of target device.")) + self.customHeight.setToolTip(_translate("KCC", "

Resolution of target device.

")) self.customHeight.setInputMask(_translate("KCC", "0000")) self.ActionBasic.setText(_translate("KCC", "Basic")) self.ActionAdvanced.setText(_translate("KCC", "Advanced")) diff --git a/kcc/KCC_ui_osx.py b/kcc/KCC_ui_osx.py index aea2ae6..12ed497 100644 --- a/kcc/KCC_ui_osx.py +++ b/kcc/KCC_ui_osx.py @@ -2,7 +2,7 @@ # Form implementation generated from reading ui file 'KCC-OSX.ui' # -# Created: Mon Jan 20 22:02:21 2014 +# Created: Tue Jan 21 10:56:30 2014 # by: PyQt5 UI code generator 5.2 # # WARNING! All changes made in this file will be lost! @@ -352,43 +352,43 @@ class Ui_KCC(object): def retranslateUi(self, KCC): _translate = QtCore.QCoreApplication.translate KCC.setWindowTitle(_translate("KCC", "Kindle Comic Converter")) - self.ProcessingBox.setToolTip(_translate("KCC", "

Disable image optimizations.
Input images must be already resized.

")) + self.ProcessingBox.setToolTip(_translate("KCC", "

Disable image optimizations.
Input images must be already resized.

")) self.ProcessingBox.setText(_translate("KCC", "No optimisation")) - self.UpscaleBox.setToolTip(_translate("KCC", "

Unchecked - Nothing
Images smaller than device resolution will not be resized.

Indeterminate - Stretching
Images smaller than device resolution will be resized. Aspect ratio will be not preserved.

Checked - Upscaling
Images smaller than device resolution will be resized. Aspect ratio will be preserved.

")) + self.UpscaleBox.setToolTip(_translate("KCC", "

Unchecked - Nothing
Images smaller than device resolution will not be resized.

Indeterminate - Stretching
Images smaller than device resolution will be resized. Aspect ratio will be not preserved.

Checked - Upscaling
Images smaller than device resolution will be resized. Aspect ratio will be preserved.

")) self.UpscaleBox.setText(_translate("KCC", "Stretch/Upscale")) - self.WebtoonBox.setToolTip(_translate("KCC", "

Enable auto-splitting of webtoons like Tower of God or Noblesse.
Pages with a low width, high height and vertical panel flow.

")) + self.WebtoonBox.setToolTip(_translate("KCC", "

Enable auto-splitting of webtoons like Tower of God or Noblesse.
Pages with a low width, high height and vertical panel flow.

")) self.WebtoonBox.setText(_translate("KCC", "Webtoon mode")) - self.NoDitheringBox.setToolTip(_translate("KCC", "

Create PNG files instead JPEG.
Quality increase is not noticeable on most of devices.
Output files
might be smaller.
MOBI conversion will be much slower.

")) + self.NoDitheringBox.setToolTip(_translate("KCC", "

Create PNG files instead JPEG.
Quality increase is not noticeable on most of devices.
Output files might be smaller.
MOBI conversion will be much slower.

")) self.NoDitheringBox.setText(_translate("KCC", "PNG output")) - self.BorderBox.setToolTip(_translate("KCC", "

Unchecked - Autodetection
Color of margins fill will be detected automatically.

Indeterminate - White
Margins will be filled with white color.

Checked - Black
Margins will be filled with black color.

")) + self.BorderBox.setToolTip(_translate("KCC", "

Unchecked - Autodetection
Color of margins fill will be detected automatically.

Indeterminate - White
Margins will be filled with white color.

Checked - Black
Margins will be filled with black color.

")) self.BorderBox.setText(_translate("KCC", "W/B margins")) - self.NoRotateBox.setToolTip(_translate("KCC", "

Disable splitting and rotation.

")) + self.NoRotateBox.setToolTip(_translate("KCC", "

Disable splitting and rotation.

")) self.NoRotateBox.setText(_translate("KCC", "No split/rotate")) - self.DeviceBox.setToolTip(_translate("KCC", "

Target device.

")) - self.FormatBox.setToolTip(_translate("KCC", "

Output format.

")) - self.ConvertButton.setToolTip(_translate("KCC", "

Shift+Click to select the output directory.

")) + self.DeviceBox.setToolTip(_translate("KCC", "

Target device.

")) + self.FormatBox.setToolTip(_translate("KCC", "

Output format.

")) + self.ConvertButton.setToolTip(_translate("KCC", "

Shift+Click to select the output directory.

")) self.ConvertButton.setText(_translate("KCC", "Convert")) self.DirectoryButton.setText(_translate("KCC", "Add directory")) self.FileButton.setText(_translate("KCC", "Add file")) self.ClearButton.setText(_translate("KCC", "Clear list")) - self.MangaBox.setToolTip(_translate("KCC", "

Enable right-to-left reading.

")) + self.MangaBox.setToolTip(_translate("KCC", "

Enable right-to-left reading.

")) self.MangaBox.setText(_translate("KCC", "Manga mode")) - self.QualityBox.setToolTip(_translate("KCC", "

Unchecked - Normal quality mode
Use it when Panel View support is not needed.
- Maximum quality when zoom is not enabled.
- Poor quality when zoom is enabled.
- Lowest file size.

Indeterminate - High quality mode
Not zoomed image might be a little blurry.
Smaller images might be forcefully upscaled in this mode.

- Medium/High quality when zoom is not enabled.
- Maximum quality when zoom is enabled.

Checked - Ultra quality mode
Maximum possible quality.
- Maximum quality when zoom is not enabled.
- Maximum quality when zoom is enabled.
- Very high file size.

")) + self.QualityBox.setToolTip(_translate("KCC", "

Unchecked - Normal quality mode
Use it when Panel View support is not needed.
- Maximum quality when zoom is not enabled.
- Poor quality when zoom is enabled.
- Lowest file size.

Indeterminate - High quality mode
Not zoomed image might be a little blurry.
Smaller images might be forcefully upscaled in this mode.
- Medium/High quality when zoom is not enabled.
- Maximum quality when zoom is enabled.

Checked - Ultra quality mode
Maximum possible quality.
- Maximum quality when zoom is not enabled.
- Maximum quality when zoom is enabled.
- Very high file size.

")) self.QualityBox.setText(_translate("KCC", "High/Ultra quality")) - self.RotateBox.setToolTip(_translate("KCC", "

Disable splitting of two-page spreads.
They will be rotated instead.

")) + self.RotateBox.setToolTip(_translate("KCC", "

Disable splitting of two-page spreads.
They will be rotated instead.

")) self.RotateBox.setText(_translate("KCC", "Horizontal mode")) self.BasicModeButton.setText(_translate("KCC", "Basic")) self.AdvModeButton.setText(_translate("KCC", "Advanced")) self.GammaLabel.setText(_translate("KCC", "Gamma: Auto")) - self.ColorBox.setToolTip(_translate("KCC", "

Don\'t convert images to grayscale.

")) + self.ColorBox.setToolTip(_translate("KCC", "

Don\'t convert images to grayscale.

")) self.ColorBox.setText(_translate("KCC", "Color mode")) - self.wLabel.setToolTip(_translate("KCC", "

Resolution of target device.

")) + self.wLabel.setToolTip(_translate("KCC", "

Resolution of target device.

")) self.wLabel.setText(_translate("KCC", "Custom width: ")) - self.customWidth.setToolTip(_translate("KCC", "

Resolution of target device.

")) + self.customWidth.setToolTip(_translate("KCC", "

Resolution of target device.

")) self.customWidth.setInputMask(_translate("KCC", "0000")) - self.hLabel.setToolTip(_translate("KCC", "

Resolution of target device.

")) + self.hLabel.setToolTip(_translate("KCC", "

Resolution of target device.

")) self.hLabel.setText(_translate("KCC", "Custom height: ")) - self.customHeight.setToolTip(_translate("KCC", "

Resolution of target device.

")) + self.customHeight.setToolTip(_translate("KCC", "

Resolution of target device.

")) self.customHeight.setInputMask(_translate("KCC", "0000")) self.ActionBasic.setText(_translate("KCC", "Basic")) self.ActionAdvanced.setText(_translate("KCC", "Advanced")) From 1e5bfc9f66996dc60dc068201c43bd4dcc26f390 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Jastrz=C4=99bski?= Date: Tue, 21 Jan 2014 18:09:22 +0100 Subject: [PATCH 35/50] OSX: Fixed file association (close #65) --- kcc.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/kcc.py b/kcc.py index 41a1c1b..2b1edd5 100755 --- a/kcc.py +++ b/kcc.py @@ -108,6 +108,14 @@ class QApplicationMessaging(QtWidgets.QApplication): self._memory.detach() self._server.close() + def event(self, e): + if e.type() == QtCore.QEvent.FileOpen: + # noinspection PyArgumentList + self.messageFromOtherInstance.emit(bytes(e.file(), 'UTF-8')) + return True + else: + return QtWidgets.QApplication.event(self, e) + def isRunning(self): return self._running From a2b9b5aa8b0624caf196ed7940695c3cc6e23372 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Jastrz=C4=99bski?= Date: Tue, 21 Jan 2014 22:02:15 +0100 Subject: [PATCH 36/50] Linux/OSX: Drag&Drop fix --- kcc/KCC_gui.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/kcc/KCC_gui.py b/kcc/KCC_gui.py index 726089f..f82e538 100644 --- a/kcc/KCC_gui.py +++ b/kcc/KCC_gui.py @@ -1032,6 +1032,8 @@ class KCCGUI(KCC_ui.Ui_KCC): message = message.replace('/', '\\') else: message = '/' + message + if message[-1] == '/': + message = message[:-1] self.handleMessage(message) def forceShutdown(self): From aa96381eb5839590bf5d3856b4fcb42552858a73 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Jastrz=C4=99bski?= Date: Wed, 22 Jan 2014 16:47:55 +0100 Subject: [PATCH 37/50] Added experimental Linux setup --- README.md | 10 +++++++-- kcc.iss | 2 -- other/LinuxInit.py | 14 ++++++++++++ setup.py | 54 ++++++++++++++++++++++++++++++++++++---------- setup.sh | 25 --------------------- 5 files changed, 65 insertions(+), 40 deletions(-) create mode 100644 other/LinuxInit.py delete mode 100755 setup.sh diff --git a/README.md b/README.md index 6e2c121..6f58a76 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,7 @@ If you find **KCC** valuable you can consider donating to the authors: You can find the latest released binary at the following links: - **Windows:** [http://kcc.vulturis.eu/Windows/](http://kcc.vulturis.eu/Windows/) - **Linux:** [http://kcc.vulturis.eu/Linux/](http://kcc.vulturis.eu/Linux/) -- **OS X 10.8+:** [http://kcc.vulturis.eu/OSX/](http://kcc.vulturis.eu/OSX/) +- **OS X (10.8+):** [http://kcc.vulturis.eu/OSX/](http://kcc.vulturis.eu/OSX/) ## INPUT FORMATS **KCC** can understand and convert, at the moment, the following input types: @@ -46,8 +46,14 @@ You can find the latest released binary at the following links: - [psutil](https://pypi.python.org/pypi/psutil) - [python-slugify](http://pypi.python.org/pypi/python-slugify) +On Debian based distributions these two commands should install all dependencies: +``` +sudo apt-get install python3 python3-dev python3-pip python3-pyqt5 libtiff-dev libpng-dev libjpeg-dev p7zip-full unrar +sudo pip3 install pillow python-slugify psutil +``` + ### For freezing code: -- Windows - [cx_Freeze](https://bitbucket.org/anthony_tuininga/cx_freeze) version 4.3.2 with [this](https://bitbucket.org/anthony_tuininga/cx_freeze/pull-request/29/conversions-to-support-untranslated-wide) patchset. +- Windows/Linux - [cx_Freeze](https://bitbucket.org/anthony_tuininga/cx_freeze) version 4.3.2 with [this](https://bitbucket.org/anthony_tuininga/cx_freeze/pull-request/29/conversions-to-support-untranslated-wide) patchset. - OS X - [py2app](https://bitbucket.org/ronaldoussoren/py2app) HEAD version. ## USAGE diff --git a/kcc.iss b/kcc.iss index 6dfa659..8aebf13 100644 --- a/kcc.iss +++ b/kcc.iss @@ -47,7 +47,6 @@ Source: "build\exe.win-amd64-3.3\platforms\*"; DestDir: "{app}\platforms\"; Flag Source: "build\exe.win-amd64-3.3\{#MyAppExeName}"; DestDir: "{app}"; Flags: ignoreversion; Check: Is64BitInstallMode Source: "build\exe.win-amd64-3.3\*.pyd"; DestDir: "{app}"; Flags: ignoreversion; Check: Is64BitInstallMode Source: "build\exe.win-amd64-3.3\*.dll"; DestDir: "{app}"; Flags: ignoreversion; Check: Is64BitInstallMode -Source: "build\exe.win-amd64-3.3\*.zip"; DestDir: "{app}"; Flags: ignoreversion; Check: Is64BitInstallMode Source: "other\vcredist_x64.exe"; DestDir: "{tmp}"; Flags: ignoreversion deleteafterinstall; Check: Is64BitInstallMode ; x86 files Source: "build\exe.win32-3.3\imageformats\*"; DestDir: "{app}\imageformats\"; Flags: ignoreversion; Check: not Is64BitInstallMode @@ -55,7 +54,6 @@ Source: "build\exe.win32-3.3\platforms\*"; DestDir: "{app}\platforms\"; Flags: i Source: "build\exe.win32-3.3\{#MyAppExeName}"; DestDir: "{app}"; Flags: ignoreversion; Check: not Is64BitInstallMode Source: "build\exe.win32-3.3\*.pyd"; DestDir: "{app}"; Flags: ignoreversion; Check: not Is64BitInstallMode Source: "build\exe.win32-3.3\*.dll"; DestDir: "{app}"; Flags: ignoreversion; Check: not Is64BitInstallMode -Source: "build\exe.win32-3.3\*.zip"; DestDir: "{app}"; Flags: ignoreversion; Check: not Is64BitInstallMode Source: "other\vcredist_x86.exe"; DestDir: "{tmp}"; Flags: ignoreversion deleteafterinstall; Check: not Is64BitInstallMode ; Common files Source: "LICENSE.txt"; DestDir: "{app}"; Flags: ignoreversion solidbreak diff --git a/other/LinuxInit.py b/other/LinuxInit.py new file mode 100644 index 0000000..7fa1150 --- /dev/null +++ b/other/LinuxInit.py @@ -0,0 +1,14 @@ +import os +import sys +import zipimport + +sys.frozen = True +sys.path = sys.path[:4] +sys.path.insert(0, '/usr/lib/kcc') +sys.path.insert(0, '/usr/local/lib/kcc') +sys.path.insert(0, os.path.join(DIR_NAME, '..', 'lib')) + +m = __import__("__main__") +importer = zipimport.zipimporter(INITSCRIPT_ZIP_FILE_NAME) +code = importer.get_code(m.__name__) +exec(code, m.__dict__) diff --git a/setup.py b/setup.py index 6e5b5b9..9d73375 100755 --- a/setup.py +++ b/setup.py @@ -5,10 +5,13 @@ cx_Freeze build script for KCC. Usage (Mac OS X): python setup.py py2app -Usage (Windows): +Usage (Windows/Linux): python setup.py build """ -from sys import platform +from sys import platform, version_info +if version_info[0] != 3: + print('ERROR: This is Python 3 script!') + exit(1) NAME = "KindleComicConverter" VERSION = "4.0" @@ -60,24 +63,40 @@ elif platform == "win32": library = 'libEGL32.dll' base = "Win32GUI" extra_options = dict( - options={"build_exe": {"include_files": ['LICENSE.txt', + options={"build_exe": {"optimize": 2, + "include_files": ['LICENSE.txt', ['other/UnRAR.exe', 'UnRAR.exe'], ['other/7za.exe', '7za.exe'], ['other/Additional-LICENSE.txt', 'Additional-LICENSE.txt'], ['other/' + library, 'libEGL.dll'] - ], "compressed": True, + ], + "copy_dependent_files": True, + "create_shared_zip": False, + "append_script_to_exe": True, "excludes": ['tkinter']}}, executables=[Executable(MAIN, base=base, targetName="KCC.exe", icon="icons/comic2ebook.ico", - copyDependentFiles=True, - appendScriptToExe=True, - appendScriptToLibrary=False, - compress=True)]) + compress=False)]) else: - print('Please use setup.sh to build Linux package.') - exit() + import platform as arch + import os + from cx_Freeze import setup, Executable + if arch.architecture()[0] == '64bit': + library = 'x86_64' + else: + library = 'x86' + extra_options = dict( + options={"build_exe": {"optimize": 2, + "copy_dependent_files": True, + "create_shared_zip": False, + "append_script_to_exe": True, + "init_script": os.path.join(os.getcwd(), 'other', 'LinuxInit.py'), + "excludes": ['tkinter']}}, + executables=[Executable(MAIN, + base=None, + compress=False)]) #noinspection PyUnboundLocalVariable setup( @@ -99,4 +118,17 @@ if platform == "darwin": makedirs('dist/' + NAME + '.app/Contents/PlugIns/platforms') copyfile('other/libqcocoa.dylib', 'dist/' + NAME + '.app/Contents/PlugIns/platforms/libqcocoa.dylib') chmod('dist/' + NAME + '.app/Contents/Resources/unrar', 0o777) - chmod('dist/' + NAME + '.app/Contents/Resources/7za', 0o777) \ No newline at end of file + chmod('dist/' + NAME + '.app/Contents/Resources/7za', 0o777) + +if platform == "linux": + from os import chmod, makedirs, remove + from shutil import copyfile, copytree + makedirs('dist/kcc/bin') + # noinspection PyUnboundLocalVariable + copyfile('build/exe.linux-' + library + '-3.3/kcc', 'dist/kcc/bin/kcc') + chmod('dist/kcc/bin/kcc', 0o755) + # noinspection PyUnboundLocalVariable + copytree('build/exe.linux-' + library + '-3.3', 'dist/kcc/lib') + remove('dist/kcc/lib/kcc') + copyfile('LICENSE.txt', 'dist/kcc/LICENSE.txt') + copyfile('icons/comic2ebook.png', 'dist/kcc/kcc.png') \ No newline at end of file diff --git a/setup.sh b/setup.sh deleted file mode 100755 index ed1f9e5..0000000 --- a/setup.sh +++ /dev/null @@ -1,25 +0,0 @@ -#!/bin/bash -# Linux Python package build script - -VERSION="4.0" - -cp kcc.py __main__.py -zip kcc.zip __main__.py kcc/*.py -echo "#!/usr/bin/env python3" > kcc-bin -cat kcc.zip >> kcc-bin -chmod +x kcc-bin - -cp kcc-c2e.py __main__.py -zip kcc-c2e.zip __main__.py kcc/*.py -echo "#!/usr/bin/env python3" > kcc-c2e-bin -cat kcc-c2e.zip >> kcc-c2e-bin -chmod +x kcc-c2e-bin - -cp kcc-c2p.py __main__.py -zip kcc-c2p.zip __main__.py kcc/*.py -echo "#!/usr/bin/env python3" > kcc-c2p-bin -cat kcc-c2p.zip >> kcc-c2p-bin -chmod +x kcc-c2p-bin - -tar --xform s:^.*/:: --xform s/kcc-bin/kcc/ --xform s/kcc-c2p-bin/kcc-c2p/ --xform s/kcc-c2e-bin/kcc-c2e/ --xform s/comic2ebook/kcc/ -czf KindleComicConverter_linux_$VERSION.tar.gz kcc-bin kcc-c2e-bin kcc-c2p-bin LICENSE.txt icons/comic2ebook.png -rm __main__.py kcc.zip kcc-c2e.zip kcc-c2p.zip kcc-bin kcc-c2e-bin kcc-c2p-bin From ebe7d910deb304ec0941d47e3e6f30c52b20a5b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Jastrz=C4=99bski?= Date: Wed, 22 Jan 2014 17:43:19 +0100 Subject: [PATCH 38/50] Reverting setup changes --- README.md | 2 +- other/LinuxInit.py | 14 -------------- setup.py | 36 ++++-------------------------------- setup.sh | 25 +++++++++++++++++++++++++ 4 files changed, 30 insertions(+), 47 deletions(-) delete mode 100644 other/LinuxInit.py create mode 100644 setup.sh diff --git a/README.md b/README.md index 6f58a76..26037cd 100644 --- a/README.md +++ b/README.md @@ -53,7 +53,7 @@ sudo pip3 install pillow python-slugify psutil ``` ### For freezing code: -- Windows/Linux - [cx_Freeze](https://bitbucket.org/anthony_tuininga/cx_freeze) version 4.3.2 with [this](https://bitbucket.org/anthony_tuininga/cx_freeze/pull-request/29/conversions-to-support-untranslated-wide) patchset. +- Windows - [cx_Freeze](https://bitbucket.org/anthony_tuininga/cx_freeze) version 4.3.2 with [this](https://bitbucket.org/anthony_tuininga/cx_freeze/pull-request/29/conversions-to-support-untranslated-wide) patchset. - OS X - [py2app](https://bitbucket.org/ronaldoussoren/py2app) HEAD version. ## USAGE diff --git a/other/LinuxInit.py b/other/LinuxInit.py deleted file mode 100644 index 7fa1150..0000000 --- a/other/LinuxInit.py +++ /dev/null @@ -1,14 +0,0 @@ -import os -import sys -import zipimport - -sys.frozen = True -sys.path = sys.path[:4] -sys.path.insert(0, '/usr/lib/kcc') -sys.path.insert(0, '/usr/local/lib/kcc') -sys.path.insert(0, os.path.join(DIR_NAME, '..', 'lib')) - -m = __import__("__main__") -importer = zipimport.zipimporter(INITSCRIPT_ZIP_FILE_NAME) -code = importer.get_code(m.__name__) -exec(code, m.__dict__) diff --git a/setup.py b/setup.py index 9d73375..6ca1a59 100755 --- a/setup.py +++ b/setup.py @@ -5,7 +5,7 @@ cx_Freeze build script for KCC. Usage (Mac OS X): python setup.py py2app -Usage (Windows/Linux): +Usage (Windows): python setup.py build """ from sys import platform, version_info @@ -80,23 +80,8 @@ elif platform == "win32": icon="icons/comic2ebook.ico", compress=False)]) else: - import platform as arch - import os - from cx_Freeze import setup, Executable - if arch.architecture()[0] == '64bit': - library = 'x86_64' - else: - library = 'x86' - extra_options = dict( - options={"build_exe": {"optimize": 2, - "copy_dependent_files": True, - "create_shared_zip": False, - "append_script_to_exe": True, - "init_script": os.path.join(os.getcwd(), 'other', 'LinuxInit.py'), - "excludes": ['tkinter']}}, - executables=[Executable(MAIN, - base=None, - compress=False)]) + print('Please use setup.sh to build Linux package.') + exit() #noinspection PyUnboundLocalVariable setup( @@ -118,17 +103,4 @@ if platform == "darwin": makedirs('dist/' + NAME + '.app/Contents/PlugIns/platforms') copyfile('other/libqcocoa.dylib', 'dist/' + NAME + '.app/Contents/PlugIns/platforms/libqcocoa.dylib') chmod('dist/' + NAME + '.app/Contents/Resources/unrar', 0o777) - chmod('dist/' + NAME + '.app/Contents/Resources/7za', 0o777) - -if platform == "linux": - from os import chmod, makedirs, remove - from shutil import copyfile, copytree - makedirs('dist/kcc/bin') - # noinspection PyUnboundLocalVariable - copyfile('build/exe.linux-' + library + '-3.3/kcc', 'dist/kcc/bin/kcc') - chmod('dist/kcc/bin/kcc', 0o755) - # noinspection PyUnboundLocalVariable - copytree('build/exe.linux-' + library + '-3.3', 'dist/kcc/lib') - remove('dist/kcc/lib/kcc') - copyfile('LICENSE.txt', 'dist/kcc/LICENSE.txt') - copyfile('icons/comic2ebook.png', 'dist/kcc/kcc.png') \ No newline at end of file + chmod('dist/' + NAME + '.app/Contents/Resources/7za', 0o777) \ No newline at end of file diff --git a/setup.sh b/setup.sh new file mode 100644 index 0000000..0190722 --- /dev/null +++ b/setup.sh @@ -0,0 +1,25 @@ +#!/bin/bash +# Linux Python package build script + +VERSION="4.0" + +cp kcc.py __main__.py +zip kcc.zip __main__.py kcc/*.py +echo "#!/usr/bin/env python3" > kcc-bin +cat kcc.zip >> kcc-bin +chmod +x kcc-bin + +cp kcc-c2e.py __main__.py +zip kcc-c2e.zip __main__.py kcc/*.py +echo "#!/usr/bin/env python3" > kcc-c2e-bin +cat kcc-c2e.zip >> kcc-c2e-bin +chmod +x kcc-c2e-bin + +cp kcc-c2p.py __main__.py +zip kcc-c2p.zip __main__.py kcc/*.py +echo "#!/usr/bin/env python3" > kcc-c2p-bin +cat kcc-c2p.zip >> kcc-c2p-bin +chmod +x kcc-c2p-bin + +tar --xform s:^.*/:: --xform s/kcc-bin/kcc/ --xform s/kcc-c2p-bin/kcc-c2p/ --xform s/kcc-c2e-bin/kcc-c2e/ --xform s/comic2ebook/kcc/ -czf KindleComicConverter_linux_$VERSION.tar.gz kcc-bin kcc-c2e-bin kcc-c2p-bin LICENSE.txt icons/comic2ebook.png +rm __main__.py kcc.zip kcc-c2e.zip kcc-c2p.zip kcc-bin kcc-c2e-bin kcc-c2p-bin \ No newline at end of file From e4750fc965ba7eefae2201de35cc3d8cd61abf22 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Jastrz=C4=99bski?= Date: Wed, 22 Jan 2014 21:02:06 +0100 Subject: [PATCH 39/50] OSX: Fixed 7zip parsing --- kcc/cbxarchive.py | 9 ++++++++- setup.sh | 0 2 files changed, 8 insertions(+), 1 deletion(-) mode change 100644 => 100755 setup.sh diff --git a/kcc/cbxarchive.py b/kcc/cbxarchive.py index 5927226..0050704 100644 --- a/kcc/cbxarchive.py +++ b/kcc/cbxarchive.py @@ -19,11 +19,12 @@ __license__ = 'ISC' __copyright__ = '2012-2013, Ciro Mattia Gonano , Pawel Jastrzebski ' __docformat__ = 'restructuredtext en' +import sys import os import zipfile from subprocess import STDOUT, PIPE from psutil import Popen -from shutil import move +from shutil import move, copy from . import rarfile @@ -73,6 +74,10 @@ class CBxArchive: cbrFile.extractall(targetdir, filelist) def extractCB7(self, targetdir): + # Workaround for some wide UTF-8 + Popen abnormalities + if sys.platform.startswith('darwin'): + copy(self.origFileName, os.path.join(os.path.dirname(self.origFileName), 'TMP_KCC_TMP')) + self.origFileName = os.path.join(os.path.dirname(self.origFileName), 'TMP_KCC_TMP') output = Popen('7za x "' + self.origFileName + '" -xr!__MACOSX -xr!.DS_Store -xr!thumbs.db -o"' + targetdir + '"', stdout=PIPE, stderr=STDOUT, shell=True) extracted = False @@ -81,6 +86,8 @@ class CBxArchive: extracted = True if not extracted: raise OSError + if sys.platform.startswith('darwin'): + os.remove(self.origFileName) def extract(self, targetdir): if self.compressor == 'rar': diff --git a/setup.sh b/setup.sh old mode 100644 new mode 100755 From 162c146bed79eea7e2ee51716896dd2da97822ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Jastrz=C4=99bski?= Date: Thu, 23 Jan 2014 11:23:58 +0100 Subject: [PATCH 40/50] Windows: Fixed possible problems with file locks OSX: Tweaked last fix --- kcc/cbxarchive.py | 4 ++-- kcc/comic2ebook.py | 21 +++++++++++++++------ kcc/image.py | 5 +---- 3 files changed, 18 insertions(+), 12 deletions(-) diff --git a/kcc/cbxarchive.py b/kcc/cbxarchive.py index 0050704..ea68cd6 100644 --- a/kcc/cbxarchive.py +++ b/kcc/cbxarchive.py @@ -84,10 +84,10 @@ class CBxArchive: for line in output.stdout: if b"Everything is Ok" in line: extracted = True - if not extracted: - raise OSError if sys.platform.startswith('darwin'): os.remove(self.origFileName) + if not extracted: + raise OSError def extract(self, targetdir): if self.compressor == 'rar': diff --git a/kcc/comic2ebook.py b/kcc/comic2ebook.py index f2cffac..22c4dae 100755 --- a/kcc/comic2ebook.py +++ b/kcc/comic2ebook.py @@ -392,27 +392,36 @@ def fileImgProcess(work): print("Splitted " + afile) img0 = image.ComicPage(split[0], opt.profileData) applyImgOptimization(img0, opt) - img0.saveToDir(dirpath, opt.forcepng, opt.forcecolor, wipe) + img0.saveToDir(dirpath, opt.forcepng, opt.forcecolor) img1 = image.ComicPage(split[1], opt.profileData) applyImgOptimization(img1, opt) - img1.saveToDir(dirpath, opt.forcepng, opt.forcecolor, wipe) + img1.saveToDir(dirpath, opt.forcepng, opt.forcecolor) + if wipe: + os.remove(os.path.join(dirpath, img0.filename)) + os.remove(os.path.join(dirpath, img1.filename)) if opt.quality == 2: img0b = image.ComicPage(split[0], opt.profileData, img0.fill) applyImgOptimization(img0b, opt, img0) - img0b.saveToDir(dirpath, opt.forcepng, opt.forcecolor, True) + img0b.saveToDir(dirpath, opt.forcepng, opt.forcecolor) img1b = image.ComicPage(split[1], opt.profileData, img1.fill) applyImgOptimization(img1b, opt, img1) - img1b.saveToDir(dirpath, opt.forcepng, opt.forcecolor, True) + img1b.saveToDir(dirpath, opt.forcepng, opt.forcecolor) + os.remove(os.path.join(dirpath, img0b.filename)) + os.remove(os.path.join(dirpath, img1b.filename)) + os.remove(img.origFileName) else: applyImgOptimization(img, opt) - img.saveToDir(dirpath, opt.forcepng, opt.forcecolor, wipe) + img.saveToDir(dirpath, opt.forcepng, opt.forcecolor) + if wipe: + os.remove(os.path.join(dirpath, img.filename)) if opt.quality == 2: img2 = image.ComicPage(os.path.join(dirpath, afile), opt.profileData, img.fill) if img.rotated: img2.image = img2.image.rotate(90) img2.rotated = True applyImgOptimization(img2, opt, img) - img2.saveToDir(dirpath, opt.forcepng, opt.forcecolor, True) + img2.saveToDir(dirpath, opt.forcepng, opt.forcecolor) + os.remove(os.path.join(dirpath, img2.filename)) except Exception: return str(sys.exc_info()[1]) diff --git a/kcc/image.py b/kcc/image.py index c9e84e9..90055c9 100755 --- a/kcc/image.py +++ b/kcc/image.py @@ -117,15 +117,13 @@ class ComicPage: else: self.fill = None - def saveToDir(self, targetdir, forcepng, color, wipe): + def saveToDir(self, targetdir, forcepng, color): try: suffix = "" if not color and not forcepng: self.image = self.image.convert('L') if self.rotated: suffix += "-kccrot" - if wipe: - os.remove(os.path.join(targetdir, self.filename)) else: suffix += "-kcchq" if self.noPV: @@ -284,7 +282,6 @@ class ComicPage: pagetwo = self.image.crop(rightbox) pageone.save(fileone) pagetwo.save(filetwo) - os.remove(self.origFileName) except IOError as e: raise RuntimeError('Cannot write image in directory %s: %s' % (targetdir, e)) return fileone, filetwo From 3d8bcb4020a49ec9d0157df601a19e72981b7e4b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Jastrz=C4=99bski?= Date: Thu, 23 Jan 2014 18:06:14 +0100 Subject: [PATCH 41/50] Image flags are not part of filename anymore --- kcc/comic2ebook.py | 107 ++++++++++++++++++++++++--------------------- kcc/image.py | 41 ++++++++++------- 2 files changed, 83 insertions(+), 65 deletions(-) diff --git a/kcc/comic2ebook.py b/kcc/comic2ebook.py index 22c4dae..06682e7 100755 --- a/kcc/comic2ebook.py +++ b/kcc/comic2ebook.py @@ -45,22 +45,22 @@ from . import cbxarchive from . import pdfjpgextract -def buildHTML(path, imgfile): +def buildHTML(path, imgfile, imgfilepath): filename = getImageFileName(imgfile) if filename is not None: - if "-kccrot" in str(filename): + if "Rotated" in theGreatIndex[imgfilepath]: rotatedPage = True else: rotatedPage = False - if "-kccnpv" in str(filename): + if "NoPanelView" in theGreatIndex[imgfilepath]: noPV = True else: noPV = False - if "-kccnh" in str(filename): + if "NoHorizontalPanelView" in theGreatIndex[imgfilepath]: noHorizontalPV = True else: noHorizontalPV = False - if "-kccnv" in str(filename): + if "NoVerticalPanelView" in theGreatIndex[imgfilepath]: noVerticalPV = True else: noVerticalPV = False @@ -133,39 +133,11 @@ def buildHTML(path, imgfile): "}'>
\n"]) if options.quality == 2: imgfilepv = str.split(imgfile, ".") - imgfilepv[0] = imgfilepv[0].split("-kccxl")[0].replace("-kccnh", "").replace("-kccnv", "") - imgfilepv[0] += "-kcchq" + imgfilepv[0] += "-hq" imgfilepv = ".".join(imgfilepv) else: imgfilepv = imgfile - if "-kccxl" in filename[0]: - borders = filename[0].split('-kccxl')[1] - borders = re.findall('[0-9]{1,6}', borders) - xl = borders[0].lstrip("0") - yu = borders[1].lstrip("0") - xr = borders[2].lstrip("0") - yd = borders[3].lstrip("0") - if xl != "": - xl = "-" + str(float(xl)/100) + "%" - else: - xl = "0%" - if xr != "": - xr = "-" + str(float(xr)/100) + "%" - else: - xr = "0%" - if yu != "": - yu = "-" + str(float(yu)/100) + "%" - else: - yu = "0%" - if yd != "": - yd = "-" + str(float(yd)/100) + "%" - else: - yd = "0%" - else: - xl = "0%" - yu = "0%" - xr = "0%" - yd = "0%" + xl, yu, xr, yd = checkMargins(imgfilepath) boxStyles = {"BoxTL": "left:" + xl + ";top:" + yu + ";", "BoxTR": "right:" + xr + ";top:" + yu + ";", "BoxBL": "left:" + xl + ";bottom:" + yd + ";", @@ -187,6 +159,34 @@ def buildHTML(path, imgfile): return path, imgfile +def checkMargins(path): + for flag in theGreatIndex[path]: + if "Margins-" in flag: + flag = flag.split('-') + xl = flag[1] + yu = flag[2] + xr = flag[3] + yd = flag[4] + if xl != "0": + xl = "-" + str(float(xl)/100) + "%" + else: + xl = "0%" + if xr != "0": + xr = "-" + str(float(xr)/100) + "%" + else: + xr = "0%" + if yu != "0": + yu = "-" + str(float(yu)/100) + "%" + else: + yu = "0%" + if yd != "0": + yd = "-" + str(float(yd)/100) + "%" + else: + yd = "0%" + return xl, yu, xr, yd + return '0%', '0%', '0%', '0%' + + def buildNCX(dstdir, title, chapters, chapterNames): options.uuid = str(uuid4()) ncxfile = os.path.join(dstdir, 'OEBPS', 'toc.ncx') @@ -331,10 +331,11 @@ def applyImgOptimization(img, opt, hqImage=None): def dirImgProcess(path): - global workerPool, workerOutput + global workerPool, workerOutput, theGreatIndex workerPool = Pool() workerOutput = [] work = [] + theGreatIndex = {} pagenumber = 0 for (dirpath, dirnames, filenames) in os.walk(path): for afile in filenames: @@ -360,9 +361,15 @@ def dirImgProcess(path): def fileImgProcess_tick(output): - if output: + if isinstance(output, str): workerOutput.append(output) workerPool.terminate() + else: + for page in output: + if page is not None: + if sys.platform.startswith('win'): + page[0] = page[0].replace('/', '\\') + theGreatIndex[page[0]] = page[1] if GUI: GUI.progressBarTick.emit('tick') if not GUI.conversionAlive: @@ -374,6 +381,7 @@ def fileImgProcess(work): afile = work[0] dirpath = work[1] opt = work[2] + output = [] if opt.verbose: print("Optimizing " + afile + " for " + opt.profile) else: @@ -392,26 +400,21 @@ def fileImgProcess(work): print("Splitted " + afile) img0 = image.ComicPage(split[0], opt.profileData) applyImgOptimization(img0, opt) - img0.saveToDir(dirpath, opt.forcepng, opt.forcecolor) + output.append(img0.saveToDir(dirpath, opt.forcepng, opt.forcecolor)) img1 = image.ComicPage(split[1], opt.profileData) applyImgOptimization(img1, opt) - img1.saveToDir(dirpath, opt.forcepng, opt.forcecolor) - if wipe: - os.remove(os.path.join(dirpath, img0.filename)) - os.remove(os.path.join(dirpath, img1.filename)) + output.append(img1.saveToDir(dirpath, opt.forcepng, opt.forcecolor)) if opt.quality == 2: img0b = image.ComicPage(split[0], opt.profileData, img0.fill) applyImgOptimization(img0b, opt, img0) - img0b.saveToDir(dirpath, opt.forcepng, opt.forcecolor) + output.append(img0b.saveToDir(dirpath, opt.forcepng, opt.forcecolor)) img1b = image.ComicPage(split[1], opt.profileData, img1.fill) applyImgOptimization(img1b, opt, img1) - img1b.saveToDir(dirpath, opt.forcepng, opt.forcecolor) - os.remove(os.path.join(dirpath, img0b.filename)) - os.remove(os.path.join(dirpath, img1b.filename)) + output.append(img1b.saveToDir(dirpath, opt.forcepng, opt.forcecolor)) os.remove(img.origFileName) else: applyImgOptimization(img, opt) - img.saveToDir(dirpath, opt.forcepng, opt.forcecolor) + output.append(img.saveToDir(dirpath, opt.forcepng, opt.forcecolor)) if wipe: os.remove(os.path.join(dirpath, img.filename)) if opt.quality == 2: @@ -420,8 +423,9 @@ def fileImgProcess(work): img2.image = img2.image.rotate(90) img2.rotated = True applyImgOptimization(img2, opt, img) - img2.saveToDir(dirpath, opt.forcepng, opt.forcecolor) + output.append(img2.saveToDir(dirpath, opt.forcepng, opt.forcecolor)) os.remove(os.path.join(dirpath, img2.filename)) + return output except Exception: return str(sys.exc_info()[1]) @@ -546,8 +550,9 @@ def genEpubStruct(path, chapterNames): chapter = False for afile in filenames: filename = getImageFileName(afile) - if filename is not None and not "-kcchq" in filename[0]: - filelist.append(buildHTML(dirpath, afile)) + if filename is not None and not ('-kcc-hq' in filename[0] or '-kcc-a-hq' in filename[0] + or '-kcc-b-hq' in filename[0]): + filelist.append(buildHTML(dirpath, afile, os.path.join(dirpath, afile))) if not chapter: chapterlist.append((dirpath.replace('Images', 'Text'), filelist[-1][1])) chapter = True @@ -674,6 +679,8 @@ def sanitizeTree(filetree): != slugified.upper(): slugified += "A" os.rename(os.path.join(root, name), os.path.join(root, slugified + splitname[1])) + theGreatIndex[os.path.join(root, slugified + splitname[1])] = theGreatIndex[os.path.join(root, name)] + del theGreatIndex[os.path.join(root, name)] for name in dirs: if name.startswith('.'): os.remove(os.path.join(root, name)) diff --git a/kcc/image.py b/kcc/image.py index 90055c9..d879e24 100755 --- a/kcc/image.py +++ b/kcc/image.py @@ -112,6 +112,7 @@ class ComicPage: self.noVPV = None self.noPV = None self.purge = False + self.hq = False if fill: self.fill = fill else: @@ -119,30 +120,37 @@ class ComicPage: def saveToDir(self, targetdir, forcepng, color): try: - suffix = "" + flags = [] + filename = os.path.join(targetdir, os.path.splitext(self.filename)[0]) + if not filename.endswith('-KCC-A') and not filename.endswith('-KCC-B'): + filename += '-KCC' if not color and not forcepng: self.image = self.image.convert('L') if self.rotated: - suffix += "-kccrot" - else: - suffix += "-kcchq" + flags.append('Rotated') + if self.hq: + flags.append('HighQuality') + filename += '-HQ' if self.noPV: - suffix += "-kccnpv" + flags.append('NoPanelView') else: if self.noHPV: - suffix += "-kccnh" + flags.append('NoHorizontalPanelView') if self.noVPV: - suffix += "-kccnv" + flags.append('NoVerticalPanelView') if self.border: - suffix += "-kccxl" + str(self.border[0]) + "-kccyu" + str(self.border[1]) + "-kccxr" +\ - str(self.border[2]) + "-kccyd" + str(self.border[3]) + flags.append("Margins-" + str(self.border[0]) + "-" + str(self.border[1]) + "-" + + str(self.border[2]) + "-" + str(self.border[3])) if not self.purge: if forcepng: - self.image.save(os.path.join(targetdir, os.path.splitext(self.filename)[0] + suffix + ".png"), - "PNG", optimize=1) + filename += ".png" + self.image.save(filename, "PNG", optimize=1) else: - self.image.save(os.path.join(targetdir, os.path.splitext(self.filename)[0] + suffix + ".jpg"), - "JPEG", optimize=1) + filename += ".jpg" + self.image.save(filename, "JPEG", optimize=1) + return [filename, flags] + else: + return None except IOError as e: raise RuntimeError('Cannot write image in directory %s: %s' % (targetdir, e)) @@ -211,7 +219,10 @@ class ComicPage: # Set target size if qualityMode == 0: size = (self.size[0], self.size[1]) + elif qualityMode == 1: + size = (self.panelviewsize[0], self.panelviewsize[1]) else: + self.hq = True size = (self.panelviewsize[0], self.panelviewsize[1]) # If image is small and HQ mode is on we have to force upscaling. Otherwise non-zoomed image will be distorted if self.image.size[0] <= size[0] and self.image.size[1] <= size[1] and qualityMode == 1 and not stretch: @@ -271,8 +282,8 @@ class ComicPage: leftbox = (0, 0, width, int(height / 2)) rightbox = (0, int(height / 2), width, height) filename = os.path.splitext(self.filename) - fileone = targetdir + '/' + filename[0] + '-kcca' + filename[1] - filetwo = targetdir + '/' + filename[0] + '-kccb' + filename[1] + fileone = targetdir + '/' + filename[0] + '-KCC-A' + filename[1] + filetwo = targetdir + '/' + filename[0] + '-KCC-B' + filename[1] try: if righttoleft: pageone = self.image.crop(rightbox) From bd53c6108ddff6c6d743cb8fb851c5ae9addd110 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Jastrz=C4=99bski?= Date: Fri, 24 Jan 2014 09:08:39 +0100 Subject: [PATCH 42/50] Great Index: Slugification fix --- kcc/comic2ebook.py | 35 +++++++++++++++++++++++++++-------- kcc/image.py | 8 +++----- 2 files changed, 30 insertions(+), 13 deletions(-) diff --git a/kcc/comic2ebook.py b/kcc/comic2ebook.py index 06682e7..ce80873 100755 --- a/kcc/comic2ebook.py +++ b/kcc/comic2ebook.py @@ -404,6 +404,9 @@ def fileImgProcess(work): img1 = image.ComicPage(split[1], opt.profileData) applyImgOptimization(img1, opt) output.append(img1.saveToDir(dirpath, opt.forcepng, opt.forcecolor)) + if wipe: + os.remove(img0.origFileName) + os.remove(img1.origFileName) if opt.quality == 2: img0b = image.ComicPage(split[0], opt.profileData, img0.fill) applyImgOptimization(img0b, opt, img0) @@ -411,12 +414,14 @@ def fileImgProcess(work): img1b = image.ComicPage(split[1], opt.profileData, img1.fill) applyImgOptimization(img1b, opt, img1) output.append(img1b.saveToDir(dirpath, opt.forcepng, opt.forcecolor)) + os.remove(img0.origFileName) + os.remove(img1.origFileName) os.remove(img.origFileName) else: applyImgOptimization(img, opt) output.append(img.saveToDir(dirpath, opt.forcepng, opt.forcecolor)) if wipe: - os.remove(os.path.join(dirpath, img.filename)) + os.remove(img.origFileName) if opt.quality == 2: img2 = image.ComicPage(os.path.join(dirpath, afile), opt.profileData, img.fill) if img.rotated: @@ -424,7 +429,7 @@ def fileImgProcess(work): img2.rotated = True applyImgOptimization(img2, opt, img) output.append(img2.saveToDir(dirpath, opt.forcepng, opt.forcecolor)) - os.remove(os.path.join(dirpath, img2.filename)) + os.remove(img.origFileName) return output except Exception: return str(sys.exc_info()[1]) @@ -550,8 +555,7 @@ def genEpubStruct(path, chapterNames): chapter = False for afile in filenames: filename = getImageFileName(afile) - if filename is not None and not ('-kcc-hq' in filename[0] or '-kcc-a-hq' in filename[0] - or '-kcc-b-hq' in filename[0]): + if filename is not None and not '-kcc-hq' in filename[0]: filelist.append(buildHTML(dirpath, afile, os.path.join(dirpath, afile))) if not chapter: chapterlist.append((dirpath.replace('Images', 'Text'), filelist[-1][1])) @@ -667,6 +671,7 @@ def slugify(value): def sanitizeTree(filetree): + global theGreatIndex chapterNames = {} for root, dirs, files in os.walk(filetree, False): for name in files: @@ -678,9 +683,12 @@ def sanitizeTree(filetree): while os.path.exists(os.path.join(root, slugified + splitname[1])) and splitname[0].upper()\ != slugified.upper(): slugified += "A" - os.rename(os.path.join(root, name), os.path.join(root, slugified + splitname[1])) - theGreatIndex[os.path.join(root, slugified + splitname[1])] = theGreatIndex[os.path.join(root, name)] - del theGreatIndex[os.path.join(root, name)] + newKey = os.path.join(root, slugified + splitname[1]) + key = os.path.join(root, name) + if key != newKey: + os.rename(key, newKey) + theGreatIndex[newKey] = theGreatIndex[key] + del theGreatIndex[key] for name in dirs: if name.startswith('.'): os.remove(os.path.join(root, name)) @@ -690,7 +698,18 @@ def sanitizeTree(filetree): while os.path.exists(os.path.join(root, slugified)) and name.upper() != slugified.upper(): slugified += "A" chapterNames[slugified] = tmpName - os.rename(os.path.join(root, name), os.path.join(root, slugified)) + newKey = os.path.join(root, slugified) + key = os.path.join(root, name) + if key != newKey: + os.rename(key, newKey) + theGreatIndexTmp = theGreatIndex.copy() + for keyI in theGreatIndex: + if key in keyI: + newKeyI = keyI.replace(key, newKey) + if newKeyI != keyI: + theGreatIndexTmp[newKeyI] = theGreatIndexTmp[keyI] + del theGreatIndexTmp[keyI] + theGreatIndex = theGreatIndexTmp.copy() return chapterNames diff --git a/kcc/image.py b/kcc/image.py index d879e24..edde36d 100755 --- a/kcc/image.py +++ b/kcc/image.py @@ -121,9 +121,7 @@ class ComicPage: def saveToDir(self, targetdir, forcepng, color): try: flags = [] - filename = os.path.join(targetdir, os.path.splitext(self.filename)[0]) - if not filename.endswith('-KCC-A') and not filename.endswith('-KCC-B'): - filename += '-KCC' + filename = os.path.join(targetdir, os.path.splitext(self.filename)[0]) + '-KCC' if not color and not forcepng: self.image = self.image.convert('L') if self.rotated: @@ -282,8 +280,8 @@ class ComicPage: leftbox = (0, 0, width, int(height / 2)) rightbox = (0, int(height / 2), width, height) filename = os.path.splitext(self.filename) - fileone = targetdir + '/' + filename[0] + '-KCC-A' + filename[1] - filetwo = targetdir + '/' + filename[0] + '-KCC-B' + filename[1] + fileone = targetdir + '/' + filename[0] + '-A' + filename[1] + filetwo = targetdir + '/' + filename[0] + '-B' + filename[1] try: if righttoleft: pageone = self.image.crop(rightbox) From 3bb8cc77788f7822ceb77af0f9e01223c4a514f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Jastrz=C4=99bski?= Date: Fri, 24 Jan 2014 22:43:24 +0100 Subject: [PATCH 43/50] Great Index: Using MD5 checksums instead file paths. Performance impact is negligible, it simplify the code and is much more error resistant. --- kcc/comic2ebook.py | 24 +++++++++++++----------- kcc/image.py | 14 +++++++++++++- 2 files changed, 26 insertions(+), 12 deletions(-) diff --git a/kcc/comic2ebook.py b/kcc/comic2ebook.py index ce80873..f0f80ec 100755 --- a/kcc/comic2ebook.py +++ b/kcc/comic2ebook.py @@ -35,6 +35,7 @@ from xml.dom.minidom import parse from uuid import uuid4 from slugify import slugify as slugifyExt from PIL import Image +from hashlib import md5 try: from PyQt5 import QtCore except ImportError: @@ -45,7 +46,19 @@ from . import cbxarchive from . import pdfjpgextract +def md5Checksum(filePath): + with open(filePath, 'rb') as fh: + m = md5() + while True: + data = fh.read(8192) + if not data: + break + m.update(data) + return m.hexdigest() + + def buildHTML(path, imgfile, imgfilepath): + imgfilepath = md5Checksum(imgfilepath) filename = getImageFileName(imgfile) if filename is not None: if "Rotated" in theGreatIndex[imgfilepath]: @@ -671,7 +684,6 @@ def slugify(value): def sanitizeTree(filetree): - global theGreatIndex chapterNames = {} for root, dirs, files in os.walk(filetree, False): for name in files: @@ -687,8 +699,6 @@ def sanitizeTree(filetree): key = os.path.join(root, name) if key != newKey: os.rename(key, newKey) - theGreatIndex[newKey] = theGreatIndex[key] - del theGreatIndex[key] for name in dirs: if name.startswith('.'): os.remove(os.path.join(root, name)) @@ -702,14 +712,6 @@ def sanitizeTree(filetree): key = os.path.join(root, name) if key != newKey: os.rename(key, newKey) - theGreatIndexTmp = theGreatIndex.copy() - for keyI in theGreatIndex: - if key in keyI: - newKeyI = keyI.replace(key, newKey) - if newKeyI != keyI: - theGreatIndexTmp[newKeyI] = theGreatIndexTmp[keyI] - del theGreatIndexTmp[keyI] - theGreatIndex = theGreatIndexTmp.copy() return chapterNames diff --git a/kcc/image.py b/kcc/image.py index edde36d..b3016cd 100755 --- a/kcc/image.py +++ b/kcc/image.py @@ -21,10 +21,22 @@ __copyright__ = '2012-2013, Ciro Mattia Gonano , Pawel Jas __docformat__ = 'restructuredtext en' import os +from hashlib import md5 from functools import reduce from PIL import Image, ImageOps, ImageStat, ImageChops +def md5Checksum(filePath): + with open(filePath, 'rb') as fh: + m = md5() + while True: + data = fh.read(8192) + if not data: + break + m.update(data) + return m.hexdigest() + + class ProfileData: def __init__(self): pass @@ -146,7 +158,7 @@ class ComicPage: else: filename += ".jpg" self.image.save(filename, "JPEG", optimize=1) - return [filename, flags] + return [md5Checksum(filename), flags] else: return None except IOError as e: From 35bc4a29873734ad5d481482c41faeabf976bdb1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Jastrz=C4=99bski?= Date: Fri, 24 Jan 2014 22:53:29 +0100 Subject: [PATCH 44/50] Added MD5 check to update mechanism --- kcc/KCC_gui.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/kcc/KCC_gui.py b/kcc/KCC_gui.py index f82e538..5a0c03f 100644 --- a/kcc/KCC_gui.py +++ b/kcc/KCC_gui.py @@ -37,6 +37,7 @@ from PyQt5 import QtGui, QtCore, QtWidgets from xml.dom.minidom import parse from html.parser import HTMLParser from psutil import TOTAL_PHYMEM, Popen +from hashlib import md5 from . import comic2ebook from . import kindlesplit from . import KCC_rc_web @@ -187,10 +188,21 @@ class VersionThread(QtCore.QThread): def __init__(self): QtCore.QThread.__init__(self) self.newVersion = '' + self.md5 = '' def __del__(self): self.wait() + def md5Checksum(self, filePath): + with open(filePath, 'rb') as fh: + m = md5() + while True: + data = fh.read(8192) + if not data: + break + m.update(data) + return m.hexdigest() + def run(self): try: XML = urllib.request.urlopen('http://kcc.vulturis.eu/Version.php') @@ -201,6 +213,7 @@ class VersionThread(QtCore.QThread): if tuple(map(int, (latestVersion.split(".")))) > tuple(map(int, (__version__.split(".")))): if sys.platform.startswith('win'): self.newVersion = latestVersion + self.md5 = XML.childNodes[0].getElementsByTagName('WindowsMD5')[0].childNodes[0].toxml() MW.showDialog.emit('New version released! ' 'See changelog.<

Installed version: ' + __version__ + '
Current version: ' + latestVersion + @@ -218,6 +231,8 @@ class VersionThread(QtCore.QThread): MW.progressBarTick.emit('Downloading update') path = urllib.request.urlretrieve('http://kcc.vulturis.eu/Windows/KindleComicConverter_win_' + self.newVersion + '.exe', reporthook=self.getNewVersionTick) + if self.md5 != self.md5Checksum(path[0]): + raise Exception move(path[0], path[0] + '.exe') MW.hideProgressBar.emit() MW.modeConvert.emit(1) From 3a536df626798d4895039c6596fd03bedcfd6b66 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Jastrz=C4=99bski?= Date: Sat, 25 Jan 2014 10:42:38 +0100 Subject: [PATCH 45/50] Code cleanup --- LICENSE.txt | 4 +-- README.md | 2 +- kcc-c2e.py | 6 ++-- kcc-c2p.py | 6 ++-- kcc.iss | 2 +- kcc.py | 6 ++-- kcc/KCC_gui.py | 42 +++++++++-------------- kcc/__init__.py | 2 +- kcc/cbxarchive.py | 13 +++---- kcc/comic2ebook.py | 81 +++++++++++++------------------------------- kcc/comic2panel.py | 33 +++--------------- kcc/image.py | 19 +++-------- kcc/kindlesplit.py | 2 +- kcc/pdfjpgextract.py | 6 ++-- kcc/shared.py | 60 ++++++++++++++++++++++++++++++++ setup.py | 2 +- 16 files changed, 134 insertions(+), 152 deletions(-) create mode 100644 kcc/shared.py diff --git a/LICENSE.txt b/LICENSE.txt index 3c42aaa..ba9aa2e 100644 --- a/LICENSE.txt +++ b/LICENSE.txt @@ -1,7 +1,7 @@ ISC LICENSE -Copyright (c) 2013 Ciro Mattia Gonano -Copyright (c) 2013 Paweł Jastrzębski +Copyright (c) 2012-2014 Ciro Mattia Gonano +Copyright (c) 2013-2014 Paweł Jastrzębski Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the diff --git a/README.md b/README.md index 26037cd..25499c0 100644 --- a/README.md +++ b/README.md @@ -329,5 +329,5 @@ Please check [wiki page](https://github.com/ciromattia/kcc/wiki/Known-issues). ## COPYRIGHT -Copyright (c) 2012-2013 Ciro Mattia Gonano and Paweł Jastrzębski. +Copyright (c) 2012-2014 Ciro Mattia Gonano and Paweł Jastrzębski. **KCC** is released under ISC LICENSE; see LICENSE.txt for further details. diff --git a/kcc-c2e.py b/kcc-c2e.py index 71a3936..d9c548e 100755 --- a/kcc-c2e.py +++ b/kcc-c2e.py @@ -1,8 +1,8 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- # -# Copyright (c) 2012-2013 Ciro Mattia Gonano -# Copyright (c) 2013 Pawel Jastrzebski +# Copyright (c) 2012-2014 Ciro Mattia Gonano +# Copyright (c) 2013-2014 Pawel Jastrzebski # # Permission to use, copy, modify, and/or distribute this software for # any purpose with or without fee is hereby granted, provided that the @@ -20,7 +20,7 @@ __version__ = '4.0' __license__ = 'ISC' -__copyright__ = '2012-2013, Ciro Mattia Gonano , Pawel Jastrzebski ' +__copyright__ = '2012-2014, Ciro Mattia Gonano , Pawel Jastrzebski ' __docformat__ = 'restructuredtext en' import sys diff --git a/kcc-c2p.py b/kcc-c2p.py index cf194d1..c915409 100755 --- a/kcc-c2p.py +++ b/kcc-c2p.py @@ -1,8 +1,8 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- # -# Copyright (c) 2012-2013 Ciro Mattia Gonano -# Copyright (c) 2013 Pawel Jastrzebski +# Copyright (c) 2012-2014 Ciro Mattia Gonano +# Copyright (c) 2013-2014 Pawel Jastrzebski # # Permission to use, copy, modify, and/or distribute this software for # any purpose with or without fee is hereby granted, provided that the @@ -25,7 +25,7 @@ if sys.version_info[0] != 3: __version__ = '4.0' __license__ = 'ISC' -__copyright__ = '2012-2013, Ciro Mattia Gonano , Pawel Jastrzebski ' +__copyright__ = '2012-2014, Ciro Mattia Gonano , Pawel Jastrzebski ' __docformat__ = 'restructuredtext en' # Dependiences check diff --git a/kcc.iss b/kcc.iss index 8aebf13..798a1d7 100644 --- a/kcc.iss +++ b/kcc.iss @@ -12,7 +12,7 @@ AppPublisher={#MyAppPublisher} AppPublisherURL={#MyAppURL} AppSupportURL={#MyAppURL} AppUpdatesURL={#MyAppURL} -AppCopyright=Copyright (C) 2012-2013 Ciro Mattia Gonano and Paweł Jastrzębski +AppCopyright=Copyright (C) 2012-2014 Ciro Mattia Gonano and Paweł Jastrzębski DefaultDirName={pf}\{#MyAppName} DefaultGroupName={#MyAppName} AllowNoIcons=yes diff --git a/kcc.py b/kcc.py index 2b1edd5..684fda1 100755 --- a/kcc.py +++ b/kcc.py @@ -1,8 +1,8 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- # -# Copyright (c) 2012-2013 Ciro Mattia Gonano -# Copyright (c) 2013 Pawel Jastrzebski +# Copyright (c) 2012-2014 Ciro Mattia Gonano +# Copyright (c) 2013-2014 Pawel Jastrzebski # # Permission to use, copy, modify, and/or distribute this software for # any purpose with or without fee is hereby granted, provided that the @@ -20,7 +20,7 @@ __version__ = '4.0' __license__ = 'ISC' -__copyright__ = '2012-2013, Ciro Mattia Gonano , Pawel Jastrzebski ' +__copyright__ = '2012-2014, Ciro Mattia Gonano , Pawel Jastrzebski ' __docformat__ = 'restructuredtext en' import sys diff --git a/kcc/KCC_gui.py b/kcc/KCC_gui.py index 5a0c03f..44d2da3 100644 --- a/kcc/KCC_gui.py +++ b/kcc/KCC_gui.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- # -# Copyright (c) 2012-2013 Ciro Mattia Gonano -# Copyright (c) 2013 Pawel Jastrzebski +# Copyright (c) 2012-2014 Ciro Mattia Gonano +# Copyright (c) 2013-2014 Pawel Jastrzebski # # Permission to use, copy, modify, and/or distribute this software for # any purpose with or without fee is hereby granted, provided that the @@ -19,15 +19,15 @@ __version__ = '4.0' __license__ = 'ISC' -__copyright__ = '2012-2013, Ciro Mattia Gonano , Pawel Jastrzebski ' +__copyright__ = '2012-2014, Ciro Mattia Gonano , Pawel Jastrzebski ' __docformat__ = 'restructuredtext en' import os import sys -import traceback -import urllib.request -import urllib.parse -import socket +from urllib.parse import unquote +from urllib.request import urlopen, urlretrieve +from socket import gethostbyname_ex, gethostname +from traceback import format_tb from time import sleep from shutil import move from http.server import BaseHTTPRequestHandler, HTTPServer @@ -37,7 +37,7 @@ from PyQt5 import QtGui, QtCore, QtWidgets from xml.dom.minidom import parse from html.parser import HTMLParser from psutil import TOTAL_PHYMEM, Popen -from hashlib import md5 +from .shared import md5Checksum from . import comic2ebook from . import kindlesplit from . import KCC_rc_web @@ -130,7 +130,7 @@ class WebServerHandler(BaseHTTPRequestHandler): '\n' '\n', 'UTF-8')) elif sendReply: - outputFile = GUI.completedWork[urllib.parse.unquote(self.path[1:])] + outputFile = GUI.completedWork[unquote(self.path[1:])] fp = open(outputFile, 'rb') self.send_response(200) self.send_header('Content-type', mimetype) @@ -163,7 +163,7 @@ class WebServerThread(QtCore.QThread): def run(self): try: # Sweet cross-platform one-liner to get LAN ip address - lIP = [ip for ip in socket.gethostbyname_ex(socket.gethostname())[2] if not ip.startswith("127.")][:1][0] + lIP = [ip for ip in gethostbyname_ex(gethostname())[2] if not ip.startswith("127.")][:1][0] except Exception: # Sadly it can fail on some Linux configurations lIP = None @@ -193,19 +193,9 @@ class VersionThread(QtCore.QThread): def __del__(self): self.wait() - def md5Checksum(self, filePath): - with open(filePath, 'rb') as fh: - m = md5() - while True: - data = fh.read(8192) - if not data: - break - m.update(data) - return m.hexdigest() - def run(self): try: - XML = urllib.request.urlopen('http://kcc.vulturis.eu/Version.php') + XML = urlopen('http://kcc.vulturis.eu/Version.php') XML = parse(XML) except Exception: return @@ -229,9 +219,9 @@ class VersionThread(QtCore.QThread): try: MW.modeConvert.emit(-1) MW.progressBarTick.emit('Downloading update') - path = urllib.request.urlretrieve('http://kcc.vulturis.eu/Windows/KindleComicConverter_win_' + - self.newVersion + '.exe', reporthook=self.getNewVersionTick) - if self.md5 != self.md5Checksum(path[0]): + path = urlretrieve('http://kcc.vulturis.eu/Windows/KindleComicConverter_win_' + + self.newVersion + '.exe', reporthook=self.getNewVersionTick) + if self.md5 != md5Checksum(path[0]): raise Exception move(path[0], path[0] + '.exe') MW.hideProgressBar.emit() @@ -462,7 +452,7 @@ class WorkerThread(QtCore.QThread): self.errors = True type_, value_, traceback_ = sys.exc_info() MW.showDialog.emit("Error during conversion %s:\n\n%s\n\nTraceback:\n%s" - % (jobargv[-1], str(err), traceback.format_tb(traceback_)), 'error') + % (jobargv[-1], str(err), format_tb(traceback_)), 'error') MW.addMessage.emit('Failed to create EPUB!', 'error', False) MW.addTrayMessage.emit('Failed to create EPUB!', 'Critical') if not self.conversionAlive: @@ -1042,7 +1032,7 @@ class KCCGUI(KCC_ui.Ui_KCC): def dragAndDropAccepted(self, e): for message in e.mimeData().urls(): - message = urllib.parse.unquote(message.toString().replace('file:///', '')) + message = unquote(message.toString().replace('file:///', '')) if sys.platform.startswith('win'): message = message.replace('/', '\\') else: diff --git a/kcc/__init__.py b/kcc/__init__.py index ca08060..56d1258 100644 --- a/kcc/__init__.py +++ b/kcc/__init__.py @@ -1,4 +1,4 @@ __version__ = '4.0' __license__ = 'ISC' -__copyright__ = '2012-2013, Ciro Mattia Gonano , Pawel Jastrzebski ' +__copyright__ = '2012-2014, Ciro Mattia Gonano , Pawel Jastrzebski ' __docformat__ = 'restructuredtext en' \ No newline at end of file diff --git a/kcc/cbxarchive.py b/kcc/cbxarchive.py index ea68cd6..eb2f4da 100644 --- a/kcc/cbxarchive.py +++ b/kcc/cbxarchive.py @@ -1,5 +1,5 @@ -# Copyright (c) 2012-2013 Ciro Mattia Gonano -# Copyright (c) 2013 Pawel Jastrzebski +# Copyright (c) 2012-2014 Ciro Mattia Gonano +# Copyright (c) 2013-2014 Pawel Jastrzebski # # Permission to use, copy, modify, and/or distribute this software for # any purpose with or without fee is hereby granted, provided that the @@ -15,13 +15,14 @@ # TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. # + __license__ = 'ISC' -__copyright__ = '2012-2013, Ciro Mattia Gonano , Pawel Jastrzebski ' +__copyright__ = '2012-2014, Ciro Mattia Gonano , Pawel Jastrzebski ' __docformat__ = 'restructuredtext en' import sys import os -import zipfile +from zipfile import is_zipfile, ZipFile from subprocess import STDOUT, PIPE from psutil import Popen from shutil import move, copy @@ -31,7 +32,7 @@ from . import rarfile class CBxArchive: def __init__(self, origFileName): self.origFileName = origFileName - if zipfile.is_zipfile(origFileName): + if is_zipfile(origFileName): self.compressor = 'zip' elif rarfile.is_rarfile(origFileName): self.compressor = 'rar' @@ -44,7 +45,7 @@ class CBxArchive: return self.compressor is not None def extractCBZ(self, targetdir): - cbzFile = zipfile.ZipFile(self.origFileName) + cbzFile = ZipFile(self.origFileName) filelist = [] for f in cbzFile.namelist(): if f.startswith('__MACOSX') or f.endswith('.DS_Store') or f.endswith('thumbs.db'): diff --git a/kcc/comic2ebook.py b/kcc/comic2ebook.py index f0f80ec..6237e19 100755 --- a/kcc/comic2ebook.py +++ b/kcc/comic2ebook.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- # -# Copyright (c) 2012-2013 Ciro Mattia Gonano -# Copyright (c) 2013 Pawel Jastrzebski +# Copyright (c) 2012-2014 Ciro Mattia Gonano +# Copyright (c) 2013-2014 Pawel Jastrzebski # # Permission to use, copy, modify, and/or distribute this software for # any purpose with or without fee is hereby granted, provided that the @@ -17,16 +17,17 @@ # TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. # + __version__ = '4.0' __license__ = 'ISC' -__copyright__ = '2012-2013, Ciro Mattia Gonano , Pawel Jastrzebski ' +__copyright__ = '2012-2014, Ciro Mattia Gonano , Pawel Jastrzebski ' __docformat__ = 'restructuredtext en' import os import sys -import re -import stat -import zipfile +from re import split, sub +from stat import S_IWRITE, S_IREAD, S_IEXEC +from zipfile import ZipFile, ZIP_STORED, ZIP_DEFLATED from tempfile import mkdtemp from shutil import move, copyfile, copytree, rmtree from optparse import OptionParser, OptionGroup @@ -35,28 +36,17 @@ from xml.dom.minidom import parse from uuid import uuid4 from slugify import slugify as slugifyExt from PIL import Image -from hashlib import md5 try: from PyQt5 import QtCore except ImportError: QtCore = None +from .shared import md5Checksum, getImageFileName, walkLevel from . import comic2panel from . import image from . import cbxarchive from . import pdfjpgextract -def md5Checksum(filePath): - with open(filePath, 'rb') as fh: - m = md5() - while True: - data = fh.read(8192) - if not data: - break - m.update(data) - return m.hexdigest() - - def buildHTML(path, imgfile, imgfilepath): imgfilepath = md5Checksum(imgfilepath) filename = getImageFileName(imgfile) @@ -307,20 +297,6 @@ def buildOPF(dstdir, title, filelist, cover=None): return -def getImageFileName(imgfile): - filename = os.path.splitext(imgfile) - if filename[0].startswith('.') or\ - (filename[1].lower() != '.png' and - filename[1].lower() != '.jpg' and - filename[1].lower() != '.gif' and - filename[1].lower() != '.tif' and - filename[1].lower() != '.tiff' and - filename[1].lower() != '.bmp' and - filename[1].lower() != '.jpeg'): - return None - return filename - - def applyImgOptimization(img, opt, hqImage=None): if not img.fill: img.getImageFill(opt.webtoon) @@ -405,26 +381,26 @@ def fileImgProcess(work): else: wipe = True if opt.nosplitrotate: - split = None + splitter = None else: - split = img.splitPage(dirpath, opt.righttoleft, opt.rotate) - if split is not None: + splitter = img.splitPage(dirpath, opt.righttoleft, opt.rotate) + if splitter is not None: if opt.verbose: print("Splitted " + afile) - img0 = image.ComicPage(split[0], opt.profileData) + img0 = image.ComicPage(splitter[0], opt.profileData) applyImgOptimization(img0, opt) output.append(img0.saveToDir(dirpath, opt.forcepng, opt.forcecolor)) - img1 = image.ComicPage(split[1], opt.profileData) + img1 = image.ComicPage(splitter[1], opt.profileData) applyImgOptimization(img1, opt) output.append(img1.saveToDir(dirpath, opt.forcepng, opt.forcecolor)) if wipe: os.remove(img0.origFileName) os.remove(img1.origFileName) if opt.quality == 2: - img0b = image.ComicPage(split[0], opt.profileData, img0.fill) + img0b = image.ComicPage(splitter[0], opt.profileData, img0.fill) applyImgOptimization(img0b, opt, img0) output.append(img0b.saveToDir(dirpath, opt.forcepng, opt.forcecolor)) - img1b = image.ComicPage(split[1], opt.profileData, img1.fill) + img1b = image.ComicPage(splitter[1], opt.profileData, img1.fill) applyImgOptimization(img1b, opt, img1) output.append(img1b.saveToDir(dirpath, opt.forcepng, opt.forcecolor)) os.remove(img0.origFileName) @@ -580,7 +556,7 @@ def genEpubStruct(path, chapterNames): buildNCX(path, options.title, chapterlist, chapterNames) # Ensure we're sorting files alphabetically convert = lambda text: int(text) if text.isdigit() else text - alphanum_key = lambda key: [convert(c) for c in re.split('([0-9]+)', key)] + alphanum_key = lambda key: [convert(c) for c in split('([0-9]+)', key)] filelist.sort(key=lambda name: (alphanum_key(name[0].lower()), alphanum_key(name[1].lower()))) buildOPF(path, options.title, filelist, cover) @@ -679,7 +655,7 @@ def checkComicInfo(path, originalPath): def slugify(value): value = slugifyExt(value) - value = re.sub(r'0*([0-9]{4,})', r'\1', re.sub(r'([0-9]+)', r'0000\1', value)) + value = sub(r'0*([0-9]{4,})', r'\1', sub(r'([0-9]+)', r'0000\1', value)) return value @@ -718,9 +694,9 @@ def sanitizeTree(filetree): def sanitizeTreeBeforeConversion(filetree): for root, dirs, files in os.walk(filetree, False): for name in files: - os.chmod(os.path.join(root, name), stat.S_IWRITE | stat.S_IREAD) + os.chmod(os.path.join(root, name), S_IWRITE | S_IREAD) for name in dirs: - os.chmod(os.path.join(root, name), stat.S_IWRITE | stat.S_IREAD | stat.S_IEXEC) + os.chmod(os.path.join(root, name), S_IWRITE | S_IREAD | S_IEXEC) def getDirectorySize(start_path='.'): @@ -739,17 +715,6 @@ def createNewTome(): return tomePath, tomePathRoot -def walkLevel(some_dir, level=1): - some_dir = some_dir.rstrip(os.path.sep) - assert os.path.isdir(some_dir) - num_sep = some_dir.count(os.path.sep) - for root, dirs, files in os.walk(some_dir): - yield root, dirs, files - num_sep_this = root.count(os.path.sep) - if num_sep + level <= num_sep_this: - del dirs[:] - - def splitDirectory(path, mode): output = [] currentSize = 0 @@ -864,9 +829,9 @@ def preSplitDirectory(path): GUI.addMessage.emit('', '', False) return [path] # Split directories - split = splitDirectory(os.path.join(path, 'OEBPS', 'Images'), mode) + splitter = splitDirectory(os.path.join(path, 'OEBPS', 'Images'), mode) path = [path] - for tome in split: + for tome in splitter: path.append(tome) return path else: @@ -895,9 +860,9 @@ def detectCorruption(tmpPath, orgPath): def makeZIP(zipFilename, baseDir, isEPUB=False): zipFilename = os.path.abspath(zipFilename) + '.zip' - zipOutput = zipfile.ZipFile(zipFilename, 'w', zipfile.ZIP_DEFLATED) + zipOutput = ZipFile(zipFilename, 'w', ZIP_DEFLATED) if isEPUB: - zipOutput.writestr('mimetype', 'application/epub+zip', zipfile.ZIP_STORED) + zipOutput.writestr('mimetype', 'application/epub+zip', ZIP_STORED) for dirpath, dirnames, filenames in os.walk(baseDir): for name in filenames: path = os.path.normpath(os.path.join(dirpath, name)) diff --git a/kcc/comic2panel.py b/kcc/comic2panel.py index 9e92d78..8612ca3 100644 --- a/kcc/comic2panel.py +++ b/kcc/comic2panel.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- # -# Copyright (c) 2012-2013 Ciro Mattia Gonano -# Copyright (c) 2013 Pawel Jastrzebski +# Copyright (c) 2012-2014 Ciro Mattia Gonano +# Copyright (c) 2013-2014 Pawel Jastrzebski # # Permission to use, copy, modify, and/or distribute this software for # any purpose with or without fee is hereby granted, provided that the @@ -17,9 +17,10 @@ # TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. # + __version__ = '4.0' __license__ = 'ISC' -__copyright__ = '2012-2013, Ciro Mattia Gonano , Pawel Jastrzebski ' +__copyright__ = '2012-2014, Ciro Mattia Gonano , Pawel Jastrzebski ' __docformat__ = 'restructuredtext en' import os @@ -28,37 +29,13 @@ from shutil import rmtree, copytree, move from optparse import OptionParser, OptionGroup from multiprocessing import Pool from PIL import Image, ImageStat +from .shared import getImageFileName, walkLevel try: from PyQt5 import QtCore except ImportError: QtCore = None -def getImageFileName(imgfile): - filename = os.path.splitext(imgfile) - if filename[0].startswith('.') or\ - (filename[1].lower() != '.png' and - filename[1].lower() != '.jpg' and - filename[1].lower() != '.gif' and - filename[1].lower() != '.tif' and - filename[1].lower() != '.tiff' and - filename[1].lower() != '.bmp' and - filename[1].lower() != '.jpeg'): - return None - return filename - - -def walkLevel(some_dir, level=1): - some_dir = some_dir.rstrip(os.path.sep) - assert os.path.isdir(some_dir) - num_sep = some_dir.count(os.path.sep) - for root, dirs, files in os.walk(some_dir): - yield root, dirs, files - num_sep_this = root.count(os.path.sep) - if num_sep + level <= num_sep_this: - del dirs[:] - - def mergeDirectory_tick(output): if output: mergeWorkerOutput.append(output) diff --git a/kcc/image.py b/kcc/image.py index b3016cd..5821e48 100755 --- a/kcc/image.py +++ b/kcc/image.py @@ -1,7 +1,7 @@ # Copyright (C) 2010 Alex Yatskov # Copyright (C) 2011 Stanislav (proDOOMman) Kosolapov -# Copyright (C) 2012-2013 Ciro Mattia Gonano -# Copyright (C) 2013 Pawel Jastrzebski +# Copyright (c) 2012-2014 Ciro Mattia Gonano +# Copyright (c) 2013-2014 Pawel Jastrzebski # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -17,24 +17,13 @@ # along with this program. If not, see . __license__ = 'ISC' -__copyright__ = '2012-2013, Ciro Mattia Gonano , Pawel Jastrzebski ' +__copyright__ = '2012-2014, Ciro Mattia Gonano , Pawel Jastrzebski ' __docformat__ = 'restructuredtext en' import os -from hashlib import md5 from functools import reduce from PIL import Image, ImageOps, ImageStat, ImageChops - - -def md5Checksum(filePath): - with open(filePath, 'rb') as fh: - m = md5() - while True: - data = fh.read(8192) - if not data: - break - m.update(data) - return m.hexdigest() +from .shared import md5Checksum class ProfileData: diff --git a/kcc/kindlesplit.py b/kcc/kindlesplit.py index 26e017f..fb7385b 100644 --- a/kcc/kindlesplit.py +++ b/kcc/kindlesplit.py @@ -2,7 +2,7 @@ # # Based on initial version of KindleUnpack. Copyright (C) 2009 Charles M. Hannum # Improvements Copyright (C) 2009-2012 P. Durrant, K. Hendricks, S. Siebert, fandrieu, DiapDealer, nickredding -# Changes for KCC Copyright (C) 2013 Pawel Jastrzebski +# Changes for KCC Copyright (C) 2013-2014 Pawel Jastrzebski # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/kcc/pdfjpgextract.py b/kcc/pdfjpgextract.py index 96ac979..c004f2d 100644 --- a/kcc/pdfjpgextract.py +++ b/kcc/pdfjpgextract.py @@ -1,5 +1,5 @@ -# Copyright (c) 2012-2013 Ciro Mattia Gonano -# Copyright (c) 2013 Pawel Jastrzebski +# Copyright (c) 2012-2014 Ciro Mattia Gonano +# Copyright (c) 2013-2014 Pawel Jastrzebski # # Based upon the code snippet by Ned Batchelder # (http://nedbatchelder.com/blog/200712/extracting_jpgs_from_pdfs.html) @@ -20,7 +20,7 @@ # __license__ = 'ISC' -__copyright__ = '2012-2013, Ciro Mattia Gonano , Pawel Jastrzebski ' +__copyright__ = '2012-2014, Ciro Mattia Gonano , Pawel Jastrzebski ' __docformat__ = 'restructuredtext en' import os diff --git a/kcc/shared.py b/kcc/shared.py new file mode 100644 index 0000000..a0aba28 --- /dev/null +++ b/kcc/shared.py @@ -0,0 +1,60 @@ +# Copyright (c) 2012-2014 Ciro Mattia Gonano +# Copyright (c) 2013-2014 Pawel Jastrzebski +# +# Permission to use, copy, modify, and/or distribute this software for +# any purpose with or without fee is hereby granted, provided that the +# above copyright notice and this permission notice appear in all +# copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL +# WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED +# WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE +# AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL +# DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA +# OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# + +__license__ = 'ISC' +__copyright__ = '2012-2014, Ciro Mattia Gonano , Pawel Jastrzebski ' +__docformat__ = 'restructuredtext en' + +import os +from hashlib import md5 + + +def getImageFileName(imgfile): + filename = os.path.splitext(imgfile) + if filename[0].startswith('.') or\ + (filename[1].lower() != '.png' and + filename[1].lower() != '.jpg' and + filename[1].lower() != '.gif' and + filename[1].lower() != '.tif' and + filename[1].lower() != '.tiff' and + filename[1].lower() != '.bmp' and + filename[1].lower() != '.jpeg'): + return None + return filename + + +def walkLevel(some_dir, level=1): + some_dir = some_dir.rstrip(os.path.sep) + assert os.path.isdir(some_dir) + num_sep = some_dir.count(os.path.sep) + for root, dirs, files in os.walk(some_dir): + yield root, dirs, files + num_sep_this = root.count(os.path.sep) + if num_sep + level <= num_sep_this: + del dirs[:] + + +def md5Checksum(filePath): + with open(filePath, 'rb') as fh: + m = md5() + while True: + data = fh.read(8192) + if not data: + break + m.update(data) + return m.hexdigest() diff --git a/setup.py b/setup.py index 6ca1a59..f805c66 100755 --- a/setup.py +++ b/setup.py @@ -33,7 +33,7 @@ if platform == "darwin": CFBundleName=NAME, CFBundleShortVersionString=VERSION, CFBundleGetInfoString=NAME + " " + VERSION + - ", written 2012-2013 by Ciro Mattia Gonano and Pawel Jastrzebski", + ", written 2012-2014 by Ciro Mattia Gonano and Pawel Jastrzebski", CFBundleExecutable=NAME, CFBundleIdentifier='com.github.ciromattia.kcc', CFBundleSignature='dplt', From 63413fa4ba188adae56aa5f4f0bd1c476a3c6025 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Jastrz=C4=99bski?= Date: Sat, 25 Jan 2014 10:57:18 +0100 Subject: [PATCH 46/50] GUI: Link to important tips appear now 5 times --- kcc/KCC_gui.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/kcc/KCC_gui.py b/kcc/KCC_gui.py index 44d2da3..0d1fafd 100644 --- a/kcc/KCC_gui.py +++ b/kcc/KCC_gui.py @@ -981,7 +981,7 @@ class KCCGUI(KCC_ui.Ui_KCC): self.settings.setValue('lastDevice', GUI.DeviceBox.currentIndex()) self.settings.setValue('currentFormat', GUI.FormatBox.currentIndex()) self.settings.setValue('currentMode', self.currentMode) - self.settings.setValue('firstStart', False) + self.settings.setValue('startNumber', self.startNumber + 1) self.settings.setValue('options', {'MangaBox': GUI.MangaBox.checkState(), 'RotateBox': GUI.RotateBox.checkState(), 'QualityBox': GUI.QualityBox.checkState(), @@ -1066,7 +1066,7 @@ class KCCGUI(KCC_ui.Ui_KCC): self.lastDevice = self.settings.value('lastDevice', 0, type=int) self.currentMode = self.settings.value('currentMode', 1, type=int) self.currentFormat = self.settings.value('currentFormat', 0, type=int) - self.firstStart = self.settings.value('firstStart', True, type=bool) + self.startNumber = self.settings.value('startNumber', 0, type=int) self.options = self.settings.value('options', {'GammaSlider': 0}) self.worker = WorkerThread() self.versionCheck = VersionThread() @@ -1170,8 +1170,8 @@ class KCCGUI(KCC_ui.Ui_KCC): self.addMessage('Welcome!', 'info') self.addMessage('Remember: All options have additional informations in tooltips.', 'info') - if self.firstStart: - self.addMessage('Since you are using KCC for first time please see few ' + if self.startNumber < 5: + self.addMessage('Since you are new user of KCC please see few ' 'important tips.', 'info') kindleGenExitCode = Popen('kindlegen -locale en', stdout=PIPE, stderr=STDOUT, shell=True) From 60b7a905897cfd59f971e697007000eef5b652b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Jastrz=C4=99bski?= Date: Sat, 25 Jan 2014 17:46:10 +0100 Subject: [PATCH 47/50] Improved Panel View logic --- KCC-Linux.ui | 22 +----------------- KCC-OSX.ui | 2 +- KCC.ui | 8 +------ kcc/KCC_ui.py | 10 ++------ kcc/KCC_ui_linux.py | 24 ++----------------- kcc/KCC_ui_osx.py | 4 ++-- kcc/image.py | 56 ++++++++++++++++++++++++--------------------- 7 files changed, 39 insertions(+), 87 deletions(-) diff --git a/KCC-Linux.ui b/KCC-Linux.ui index 078432d..4b1ac81 100644 --- a/KCC-Linux.ui +++ b/KCC-Linux.ui @@ -386,27 +386,7 @@ Qt::NoFocus - <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> -<html><head><meta name="qrichtext" content="1" /><style type="text/css"> -p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Sans'; font-size:9pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600; text-decoration: underline;">Unchecked - Normal quality mode</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-style:italic;">Use it when Panel View support is not needed.</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">- Maximum quality when zoom is not enabled.</p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">- Poor quality when zoom is enabled.</p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">- Lowest file size.</p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600; text-decoration: underline;">Indeterminate - High quality mode</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-style:italic;">Not zoomed image might be a little blurry.</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-style:italic;">Smaller images might be forcefully upscaled in this mode.</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">- Medium/High quality when zoom is not enabled.</p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">- Maximum quality when zoom is enabled.</p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600; text-decoration: underline;">Checked - Ultra quality mode</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-style:italic;">Maximum possible quality.</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">- Maximum quality when zoom is not enabled.</p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">- Maximum quality when zoom is enabled.</p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">- Very high file size.</p></body></html> + <html><head/><body><p><span style=" font-weight:600; text-decoration: underline;">Unchecked - Normal quality mode<br/></span><span style=" font-style:italic;">Use it when Panel View support is not needed.<br/></span>- Maximum quality when zoom is not enabled.<br/>- Poor quality when zoom is enabled.<br/>- Lowest file size.</p><p><span style=" font-weight:600; text-decoration: underline;">Indeterminate - High quality mode<br/></span><span style=" font-style:italic;">Not zoomed images </span><span style=" font-weight:600; font-style:italic;">might</span><span style=" font-style:italic;"> be blurry.<br/></span>- High quality when zoom is not enabled.<br/>- Maximum quality when zoom is enabled.</p><p><span style=" font-weight:600; text-decoration: underline;">Checked - Ultra quality mode<br/></span><span style=" font-style:italic;">Maximum possible quality.<br/></span>- Maximum quality when zoom is not enabled.<br/>- Maximum quality when zoom is enabled.<br/>- Very high file size.</p></body></html> High/Ultra quality diff --git a/KCC-OSX.ui b/KCC-OSX.ui index 3360839..1b61e5d 100644 --- a/KCC-OSX.ui +++ b/KCC-OSX.ui @@ -391,7 +391,7 @@ Qt::NoFocus - <html><head/><body><p><span style=" font-weight:600; text-decoration: underline;">Unchecked - Normal quality mode<br/></span><span style=" font-style:italic;">Use it when Panel View support is not needed.<br/></span>- Maximum quality when zoom is not enabled.<br/>- Poor quality when zoom is enabled.<br/>- Lowest file size.</p><p><span style=" font-weight:600; text-decoration: underline;">Indeterminate - High quality mode<br/></span><span style=" font-style:italic;">Not zoomed image might be a little blurry.<br/>Smaller images might be forcefully upscaled in this mode.<br/></span>- Medium/High quality when zoom is not enabled.<br/>- Maximum quality when zoom is enabled.</p><p><span style=" font-weight:600; text-decoration: underline;">Checked - Ultra quality mode<br/></span><span style=" font-style:italic;">Maximum possible quality.<br/></span>- Maximum quality when zoom is not enabled.<br/>- Maximum quality when zoom is enabled.<br/>- Very high file size.</p></body></html> + <html><head/><body><p><span style=" font-weight:600; text-decoration: underline;">Unchecked - Normal quality mode<br/></span><span style=" font-style:italic;">Use it when Panel View support is not needed.<br/></span>- Maximum quality when zoom is not enabled.<br/>- Poor quality when zoom is enabled.<br/>- Lowest file size.</p><p><span style=" font-weight:600; text-decoration: underline;">Indeterminate - High quality mode<br/></span><span style=" font-style:italic;">Not zoomed image </span><span style=" font-weight:600; font-style:italic;">might</span><span style=" font-style:italic;"> be a little blurry.<br/></span>- High quality when zoom is not enabled.<br/>- Maximum quality when zoom is enabled.</p><p><span style=" font-weight:600; text-decoration: underline;">Checked - Ultra quality mode<br/></span><span style=" font-style:italic;">Maximum possible quality.<br/></span>- Maximum quality when zoom is not enabled.<br/>- Maximum quality when zoom is enabled.<br/>- Very high file size.</p></body></html> High/Ultra quality diff --git a/KCC.ui b/KCC.ui index f91dabe..be1630f 100644 --- a/KCC.ui +++ b/KCC.ui @@ -338,13 +338,7 @@ Qt::NoFocus - <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> -<html><head><meta name="qrichtext" content="1" /><style type="text/css"> -p, li { white-space: pre-wrap; } -</style></head><body> -<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600; text-decoration: underline;">Unchecked - Normal quality mode<br /></span><span style=" font-style:italic;">Use it when Panel View support is not needed.</span><span style=" font-weight:600; text-decoration: underline;"><br /></span>- Maximum quality when zoom is not enabled.<br />- Poor quality when zoom is enabled.<br />- Lowest file size.</p> -<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600; text-decoration: underline;">Indeterminate - High quality mode<br /></span><span style=" font-style:italic;">Not zoomed image </span><span style=" font-weight:600; font-style:italic;">might </span><span style=" font-style:italic;">be a little blurry.<br />Smaller images might be forcefully upscaled in this mode.</span><span style=" font-weight:600; text-decoration: underline;"><br /></span>- Medium/High quality when zoom is not enabled.<br />- Maximum quality when zoom is enabled.</p> -<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600; text-decoration: underline;">Checked - Ultra quality mode<br /></span><span style=" font-style:italic;">Maximum possible quality.</span><span style=" font-weight:600; text-decoration: underline;"><br /></span>- Maximum quality when zoom is not enabled.<br />- Maximum quality when zoom is enabled.<br />- Very high file size.</p></body></html> + <html><head/><body><p><span style=" font-weight:600; text-decoration: underline;">Unchecked - Normal quality mode<br/></span><span style=" font-style:italic;">Use it when Panel View support is not needed.</span><span style=" font-weight:600; text-decoration: underline;"><br/></span>- Maximum quality when zoom is not enabled.<br/>- Poor quality when zoom is enabled.<br/>- Lowest file size.</p><p><span style=" font-weight:600; text-decoration: underline;">Indeterminate - High quality mode<br/></span><span style=" font-style:italic;">Not zoomed images </span><span style=" font-weight:600; font-style:italic;">might </span><span style=" font-style:italic;">be blurry.</span><span style=" font-weight:600; text-decoration: underline;"><br/></span>- High quality when zoom is not enabled.<br/>- Maximum quality when zoom is enabled.</p><p><span style=" font-weight:600; text-decoration: underline;">Checked - Ultra quality mode<br/></span><span style=" font-style:italic;">Maximum possible quality.</span><span style=" font-weight:600; text-decoration: underline;"><br/></span>- Maximum quality when zoom is not enabled.<br/>- Maximum quality when zoom is enabled.<br/>- Very high file size.</p></body></html> High/Ultra quality diff --git a/kcc/KCC_ui.py b/kcc/KCC_ui.py index eb6b9f3..28255c0 100644 --- a/kcc/KCC_ui.py +++ b/kcc/KCC_ui.py @@ -2,7 +2,7 @@ # Form implementation generated from reading ui file 'KCC.ui' # -# Created: Tue Jan 21 10:54:31 2014 +# Created: Sat Jan 25 17:36:53 2014 # by: PyQt5 UI code generator 5.2 # # WARNING! All changes made in this file will be lost! @@ -281,13 +281,7 @@ class Ui_KCC(object): self.ClearButton.setText(_translate("KCC", "Clear list")) self.MangaBox.setToolTip(_translate("KCC", "

Enable right-to-left reading.

")) self.MangaBox.setText(_translate("KCC", "Manga mode")) - self.QualityBox.setToolTip(_translate("KCC", "\n" -"\n" -"

Unchecked - Normal quality mode
Use it when Panel View support is not needed.
- Maximum quality when zoom is not enabled.
- Poor quality when zoom is enabled.
- Lowest file size.

\n" -"

Indeterminate - High quality mode
Not zoomed image might be a little blurry.
Smaller images might be forcefully upscaled in this mode.

- Medium/High quality when zoom is not enabled.
- Maximum quality when zoom is enabled.

\n" -"

Checked - Ultra quality mode
Maximum possible quality.
- Maximum quality when zoom is not enabled.
- Maximum quality when zoom is enabled.
- Very high file size.

")) + self.QualityBox.setToolTip(_translate("KCC", "

Unchecked - Normal quality mode
Use it when Panel View support is not needed.
- Maximum quality when zoom is not enabled.
- Poor quality when zoom is enabled.
- Lowest file size.

Indeterminate - High quality mode
Not zoomed images might be blurry.
- High quality when zoom is not enabled.
- Maximum quality when zoom is enabled.

Checked - Ultra quality mode
Maximum possible quality.
- Maximum quality when zoom is not enabled.
- Maximum quality when zoom is enabled.
- Very high file size.

")) self.QualityBox.setText(_translate("KCC", "High/Ultra quality")) self.RotateBox.setToolTip(_translate("KCC", "

Disable splitting of two-page spreads.
They will be rotated instead.

")) self.RotateBox.setText(_translate("KCC", "Horizontal mode")) diff --git a/kcc/KCC_ui_linux.py b/kcc/KCC_ui_linux.py index 1f36255..cd2e146 100644 --- a/kcc/KCC_ui_linux.py +++ b/kcc/KCC_ui_linux.py @@ -2,7 +2,7 @@ # Form implementation generated from reading ui file 'KCC-Linux.ui' # -# Created: Tue Jan 21 10:54:38 2014 +# Created: Sat Jan 25 17:37:02 2014 # by: PyQt5 UI code generator 5.2 # # WARNING! All changes made in this file will be lost! @@ -350,27 +350,7 @@ class Ui_KCC(object): self.ClearButton.setText(_translate("KCC", "Clear list")) self.MangaBox.setToolTip(_translate("KCC", "

Enable right-to-left reading.

")) self.MangaBox.setText(_translate("KCC", "Manga mode")) - self.QualityBox.setToolTip(_translate("KCC", "\n" -"\n" -"

Unchecked - Normal quality mode

\n" -"

Use it when Panel View support is not needed.

\n" -"

- Maximum quality when zoom is not enabled.

\n" -"

- Poor quality when zoom is enabled.

\n" -"

- Lowest file size.

\n" -"


\n" -"

Indeterminate - High quality mode

\n" -"

Not zoomed image might be a little blurry.

\n" -"

Smaller images might be forcefully upscaled in this mode.

\n" -"

- Medium/High quality when zoom is not enabled.

\n" -"

- Maximum quality when zoom is enabled.

\n" -"


\n" -"

Checked - Ultra quality mode

\n" -"

Maximum possible quality.

\n" -"

- Maximum quality when zoom is not enabled.

\n" -"

- Maximum quality when zoom is enabled.

\n" -"

- Very high file size.

")) + self.QualityBox.setToolTip(_translate("KCC", "

Unchecked - Normal quality mode
Use it when Panel View support is not needed.
- Maximum quality when zoom is not enabled.
- Poor quality when zoom is enabled.
- Lowest file size.

Indeterminate - High quality mode
Not zoomed images might be blurry.
- High quality when zoom is not enabled.
- Maximum quality when zoom is enabled.

Checked - Ultra quality mode
Maximum possible quality.
- Maximum quality when zoom is not enabled.
- Maximum quality when zoom is enabled.
- Very high file size.

")) self.QualityBox.setText(_translate("KCC", "High/Ultra quality")) self.RotateBox.setToolTip(_translate("KCC", "

Disable splitting of two-page spreads.
They will be rotated instead.

")) self.RotateBox.setText(_translate("KCC", "Horizontal mode")) diff --git a/kcc/KCC_ui_osx.py b/kcc/KCC_ui_osx.py index 12ed497..144ec19 100644 --- a/kcc/KCC_ui_osx.py +++ b/kcc/KCC_ui_osx.py @@ -2,7 +2,7 @@ # Form implementation generated from reading ui file 'KCC-OSX.ui' # -# Created: Tue Jan 21 10:56:30 2014 +# Created: Sat Jan 25 17:37:10 2014 # by: PyQt5 UI code generator 5.2 # # WARNING! All changes made in this file will be lost! @@ -373,7 +373,7 @@ class Ui_KCC(object): self.ClearButton.setText(_translate("KCC", "Clear list")) self.MangaBox.setToolTip(_translate("KCC", "

Enable right-to-left reading.

")) self.MangaBox.setText(_translate("KCC", "Manga mode")) - self.QualityBox.setToolTip(_translate("KCC", "

Unchecked - Normal quality mode
Use it when Panel View support is not needed.
- Maximum quality when zoom is not enabled.
- Poor quality when zoom is enabled.
- Lowest file size.

Indeterminate - High quality mode
Not zoomed image might be a little blurry.
Smaller images might be forcefully upscaled in this mode.
- Medium/High quality when zoom is not enabled.
- Maximum quality when zoom is enabled.

Checked - Ultra quality mode
Maximum possible quality.
- Maximum quality when zoom is not enabled.
- Maximum quality when zoom is enabled.
- Very high file size.

")) + self.QualityBox.setToolTip(_translate("KCC", "

Unchecked - Normal quality mode
Use it when Panel View support is not needed.
- Maximum quality when zoom is not enabled.
- Poor quality when zoom is enabled.
- Lowest file size.

Indeterminate - High quality mode
Not zoomed image might be a little blurry.
- High quality when zoom is not enabled.
- Maximum quality when zoom is enabled.

Checked - Ultra quality mode
Maximum possible quality.
- Maximum quality when zoom is not enabled.
- Maximum quality when zoom is enabled.
- Very high file size.

")) self.QualityBox.setText(_translate("KCC", "High/Ultra quality")) self.RotateBox.setToolTip(_translate("KCC", "

Disable splitting of two-page spreads.
They will be rotated instead.

")) self.RotateBox.setText(_translate("KCC", "Horizontal mode")) diff --git a/kcc/image.py b/kcc/image.py index 5821e48..e74e092 100755 --- a/kcc/image.py +++ b/kcc/image.py @@ -121,26 +121,26 @@ class ComicPage: def saveToDir(self, targetdir, forcepng, color): try: - flags = [] - filename = os.path.join(targetdir, os.path.splitext(self.filename)[0]) + '-KCC' - if not color and not forcepng: - self.image = self.image.convert('L') - if self.rotated: - flags.append('Rotated') - if self.hq: - flags.append('HighQuality') - filename += '-HQ' - if self.noPV: - flags.append('NoPanelView') - else: - if self.noHPV: - flags.append('NoHorizontalPanelView') - if self.noVPV: - flags.append('NoVerticalPanelView') - if self.border: - flags.append("Margins-" + str(self.border[0]) + "-" + str(self.border[1]) + "-" - + str(self.border[2]) + "-" + str(self.border[3])) if not self.purge: + flags = [] + filename = os.path.join(targetdir, os.path.splitext(self.filename)[0]) + '-KCC' + if not color and not forcepng: + self.image = self.image.convert('L') + if self.rotated: + flags.append('Rotated') + if self.hq: + flags.append('HighQuality') + filename += '-HQ' + if self.noPV: + flags.append('NoPanelView') + else: + if self.noHPV: + flags.append('NoHorizontalPanelView') + if self.noVPV: + flags.append('NoVerticalPanelView') + if self.border: + flags.append("Margins-" + str(self.border[0]) + "-" + str(self.border[1]) + "-" + + str(self.border[2]) + "-" + str(self.border[3])) if forcepng: filename += ".png" self.image.save(filename, "PNG", optimize=1) @@ -181,7 +181,7 @@ class ComicPage: return int(round(float(x)/float(img.image.size[1]), 4) * 10000 * 1.5) def calculateBorder(self, sourceImage, isHQ=False): - if isHQ and sourceImage.purge: + if (isHQ and sourceImage.purge) or self.noPV: self.border = [0, 0, 0, 0] self.noPV = True return @@ -218,14 +218,18 @@ class ComicPage: # Set target size if qualityMode == 0: size = (self.size[0], self.size[1]) + elif qualityMode == 1 and not stretch and not upscale and self.image.size[0] <=\ + self.size[0] and self.image.size[1] <= self.size[1]: + size = (self.size[0], self.size[1]) elif qualityMode == 1: size = (self.panelviewsize[0], self.panelviewsize[1]) + elif qualityMode == 2 and not stretch and not upscale and self.image.size[0] <=\ + self.size[0] and self.image.size[1] <= self.size[1]: + self.purge = True + return self.image else: self.hq = True size = (self.panelviewsize[0], self.panelviewsize[1]) - # If image is small and HQ mode is on we have to force upscaling. Otherwise non-zoomed image will be distorted - if self.image.size[0] <= size[0] and self.image.size[1] <= size[1] and qualityMode == 1 and not stretch: - upscale = True # If stretching is on - Resize without other considerations if stretch: if self.image.size[0] <= size[0] and self.image.size[1] <= size[1]: @@ -238,9 +242,9 @@ class ComicPage: if self.image.size[0] <= size[0] and self.image.size[1] <= size[1] and not upscale: borderw = int((size[0] - self.image.size[0]) / 2) borderh = int((size[1] - self.image.size[1]) / 2) - # PV is disabled when source image is smaller than device screen and upscale is off - So we drop HQ image - if qualityMode == 2 and self.image.size[0] <= self.size[0] and self.image.size[1] <= self.size[1]: - self.purge = True + # PV is disabled when source image is smaller than device screen and upscale is off + if self.image.size[0] <= self.size[0] and self.image.size[1] <= self.size[1]: + self.noPV = True self.image = ImageOps.expand(self.image, border=(borderw, borderh), fill=fill) # Border can't be float so sometimes image might be 1px too small/large if self.image.size[0] != size[0] or self.image.size[1] != size[1]: From 63d752280aebdd496c40bed9d3e35cb3b5469bd1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Jastrz=C4=99bski?= Date: Sun, 26 Jan 2014 10:25:26 +0100 Subject: [PATCH 48/50] Margin color detection tweaks --- kcc/image.py | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/kcc/image.py b/kcc/image.py index e74e092..cbdcc88 100755 --- a/kcc/image.py +++ b/kcc/image.py @@ -107,6 +107,7 @@ class ComicPage: self.filename = os.path.basename(self.origFileName) self.image = Image.open(source) self.image = self.image.convert('RGB') + self.color = self.isImageColor() self.rotated = None self.border = None self.noHPV = None @@ -156,7 +157,7 @@ class ComicPage: def optimizeImage(self, gamma): if gamma < 0.1: gamma = self.gamma - if self.gamma != 1.0 and self.isImageColor(self.image): + if self.gamma != 1.0 and self.color: gamma = 1.0 if gamma == 1.0: self.image = ImageOps.autocontrast(self.image) @@ -414,30 +415,37 @@ class ComicPage: return False def getImageFill(self, webtoon): + if not webtoon and self.color: + self.fill = 'black' + return fill = 0 if not webtoon and not self.rotated: # Search for horizontal solid lines startY = 0 while startY < self.image.size[1]: - checkSolid = self.getImageHistogram(self.image.crop((0, startY, self.image.size[0], startY+1))) + if startY + 5 > self.image.size[1]: + startY = self.image.size[1] - 5 + checkSolid = self.getImageHistogram(self.image.crop((0, startY, self.image.size[0], startY+5))) if checkSolid: fill += checkSolid - startY += 1 + startY += 5 else: # Search for vertical solid lines startX = 0 while startX < self.image.size[0]: - checkSolid = self.getImageHistogram(self.image.crop((startX, 0, startX+1, self.image.size[1]))) + if startX + 5 > self.image.size[0]: + startX = self.image.size[0] - 5 + checkSolid = self.getImageHistogram(self.image.crop((startX, 0, startX+5, self.image.size[1]))) if checkSolid: fill += checkSolid - startX += 1 + startX += 5 if fill > 0: self.fill = 'black' else: self.fill = 'white' - def isImageColor(self, image): - v = ImageStat.Stat(image).var + def isImageColor(self): + v = ImageStat.Stat(self.image).var isMonochromatic = reduce(lambda x, y: x and y < 0.005, v, True) if isMonochromatic: # Monochromatic From 27e5cc3b0055c977398ca013280cb1aedd333fc7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Jastrz=C4=99bski?= Date: Mon, 27 Jan 2014 20:51:13 +0100 Subject: [PATCH 49/50] Removed redundant output --- README.md | 1 - kcc/comic2ebook.py | 9 +-------- kcc/comic2panel.py | 6 +++--- 3 files changed, 4 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 25499c0..1071a79 100644 --- a/README.md +++ b/README.md @@ -105,7 +105,6 @@ Options: Replace screen height provided by device profile OTHER: - -v, --verbose Verbose output -h, --help Show this help message and exit ``` diff --git a/kcc/comic2ebook.py b/kcc/comic2ebook.py index 6237e19..bd4c8f4 100755 --- a/kcc/comic2ebook.py +++ b/kcc/comic2ebook.py @@ -371,10 +371,6 @@ def fileImgProcess(work): dirpath = work[1] opt = work[2] output = [] - if opt.verbose: - print("Optimizing " + afile + " for " + opt.profile) - else: - print(".", end=' ') img = image.ComicPage(os.path.join(dirpath, afile), opt.profileData) if opt.quality == 2: wipe = False @@ -385,8 +381,6 @@ def fileImgProcess(work): else: splitter = img.splitPage(dirpath, opt.righttoleft, opt.rotate) if splitter is not None: - if opt.verbose: - print("Splitted " + afile) img0 = image.ComicPage(splitter[0], opt.profileData) applyImgOptimization(img0, opt) output.append(img0.saveToDir(dirpath, opt.forcepng, opt.forcecolor)) @@ -933,8 +927,6 @@ def main(argv=None, qtGUI=None): help="Replace screen width provided by device profile") customProfileOptions.add_option("--customheight", type="int", dest="customheight", default=0, help="Replace screen height provided by device profile") - otherOptions.add_option("-v", "--verbose", action="store_true", dest="verbose", default=False, - help="Verbose output") otherOptions.add_option("-h", "--help", action="help", help="Show this help message and exit") parser.add_option_group(mainOptions) @@ -953,6 +945,7 @@ def main(argv=None, qtGUI=None): parser.print_help() return path = getWorkFolder(args[0]) + print("\nChecking images...") detectCorruption(path + "/OEBPS/Images/", args[0]) checkComicInfo(path + "/OEBPS/Images/", args[0]) if options.webtoon: diff --git a/kcc/comic2panel.py b/kcc/comic2panel.py index 8612ca3..0169019 100644 --- a/kcc/comic2panel.py +++ b/kcc/comic2panel.py @@ -123,7 +123,6 @@ def splitImage(work): # Harcoded opttions threshold = 1.0 delta = 15 - print(".", end=' ') fileExpanded = os.path.splitext(name) filePath = os.path.join(path, name) image = Image.open(filePath) @@ -236,15 +235,15 @@ def main(argv=None, qtGUI=None): if options.height > 0: options.sourceDir = args[0] options.targetDir = args[0] + "-Splitted" - print("\nSplitting images...") if os.path.isdir(options.sourceDir): rmtree(options.targetDir, True) copytree(options.sourceDir, options.targetDir) work = [] - pagenumber = 0 + pagenumber = 1 splitWorkerOutput = [] splitWorkerPool = Pool() if options.merge: + print("\nMerging images...") directoryNumer = 1 mergeWork = [] mergeWorkerOutput = [] @@ -267,6 +266,7 @@ def main(argv=None, qtGUI=None): if len(mergeWorkerOutput) > 0: rmtree(options.targetDir, True) raise RuntimeError("One of workers crashed. Cause: " + mergeWorkerOutput[0]) + print("\nSplitting images...") for root, dirs, files in os.walk(options.targetDir, False): for name in files: if getImageFileName(name) is not None: From a229ba44bfa42bf3d2749e097b80d4a30a9dd44a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Jastrz=C4=99bski?= Date: Tue, 28 Jan 2014 12:10:33 +0100 Subject: [PATCH 50/50] README update --- README.md | 11 ++++++++++- setup.py | 1 - 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 1071a79..b6b6dc9 100644 --- a/README.md +++ b/README.md @@ -322,11 +322,20 @@ The app relies and includes the following scripts/binaries: * Fixed problems with HQ mode ####4.0: +* KCC now use Python 3.3 and Qt 5.2 +* Full UTF-8 awareness +* CBZ output now support Manga mode +* Improved Panel View support and margin color detection +* Added drag&drop support +* Output directory can be now selected +* Windows release now have auto-updater +* Names of chapters on Kindle should be now more user friendly +* Fixed OSX file association support +* Many extensive internal changes and tweaks ## KNOWN ISSUES Please check [wiki page](https://github.com/ciromattia/kcc/wiki/Known-issues). ## COPYRIGHT - Copyright (c) 2012-2014 Ciro Mattia Gonano and Paweł Jastrzębski. **KCC** is released under ISC LICENSE; see LICENSE.txt for further details. diff --git a/setup.py b/setup.py index f805c66..5912dab 100755 --- a/setup.py +++ b/setup.py @@ -93,7 +93,6 @@ setup( license="ISC License (ISCL)", keywords="kindle comic mobipocket mobi cbz cbr manga", url="http://github.com/ciromattia/kcc", - packages=['kcc'], requires=['Pillow'], **extra_options )