From fbe5386e5698805c6583724b39fe0b62036aaa00 Mon Sep 17 00:00:00 2001 From: Daniel Date: Sat, 19 Sep 2015 20:06:15 +0200 Subject: [PATCH 001/104] Initial version of website downloader Saving websites as MHTML via :download-whole Still needs some cleanup and a "ask for save path". --- qutebrowser/browser/commands.py | 12 +- qutebrowser/browser/downloads.py | 14 ++ qutebrowser/misc/mhtml.py | 211 +++++++++++++++++++++++++++++++ 3 files changed, 236 insertions(+), 1 deletion(-) create mode 100644 qutebrowser/misc/mhtml.py diff --git a/qutebrowser/browser/commands.py b/qutebrowser/browser/commands.py index ae4b1da39..10f1d0233 100644 --- a/qutebrowser/browser/commands.py +++ b/qutebrowser/browser/commands.py @@ -42,7 +42,7 @@ from qutebrowser.keyinput import modeman from qutebrowser.utils import (message, usertypes, log, qtutils, urlutils, objreg, utils) from qutebrowser.utils.usertypes import KeyMode -from qutebrowser.misc import editor, guiprocess +from qutebrowser.misc import editor, guiprocess, mhtml class CommandDispatcher: @@ -1157,6 +1157,16 @@ class CommandDispatcher: page = self._current_widget().page() download_manager.get(self._current_url(), page=page) + @cmdutils.register(instance='command-dispatcher', scope='window') + def download_whole(self, dest): + """Download the current page as a MHTML file, including all assets + (e.g. images) + + Args: + dest: The file path to write the download to. + """ + mhtml.start_download(dest) + @cmdutils.register(instance='command-dispatcher', scope='window', deprecated="Use :download instead.") def download_page(self): diff --git a/qutebrowser/browser/downloads.py b/qutebrowser/browser/downloads.py index 70760acb5..568e7bf67 100644 --- a/qutebrowser/browser/downloads.py +++ b/qutebrowser/browser/downloads.py @@ -201,6 +201,7 @@ class DownloadItem(QObject): fileobj: The file object to download the file to. reply: The QNetworkReply associated with this download. retry_info: A RetryInfo instance. + raw_headers: The headers sent by the server. _filename: The filename of the download. _redirects: How many time we were redirected already. _buffer: A BytesIO object to buffer incoming data until we know the @@ -255,6 +256,7 @@ class DownloadItem(QObject): self._filename = None self.init_reply(reply) self._win_id = win_id + self.raw_headers = {} def __repr__(self): return utils.get_repr(self, basename=self.basename) @@ -354,6 +356,7 @@ class DownloadItem(QObject): reply.finished.connect(self.on_reply_finished) reply.error.connect(self.on_reply_error) reply.readyRead.connect(self.on_ready_read) + reply.metaDataChanged.connect(self.on_meta_data_change) self.retry_info = RetryInfo(request=reply.request(), manager=reply.manager()) if not self.fileobj: @@ -582,6 +585,9 @@ class DownloadItem(QObject): if code == QNetworkReply.OperationCanceledError: return else: + if self.reply is None: + log.downloads.debug("QNetworkReply disappeared %s", self) + return self._die(self.reply.errorString()) @pyqtSlot() @@ -593,6 +599,14 @@ class DownloadItem(QObject): if data is not None: self._buffer.write(data) + @pyqtSlot() + def on_meta_data_change(self): + if self.reply is None: + return + self.raw_headers = {} + for key, value in self.reply.rawHeaderPairs(): + self.raw_headers[bytes(key)] = bytes(value) + def _handle_redirect(self): """Handle a HTTP redirect. diff --git a/qutebrowser/misc/mhtml.py b/qutebrowser/misc/mhtml.py new file mode 100644 index 000000000..3afc32c02 --- /dev/null +++ b/qutebrowser/misc/mhtml.py @@ -0,0 +1,211 @@ +# vim: ft=python fileencoding=utf-8 sts=4 sw=4 et: + +# Copyright 2015 Daniel Schadt +# +# This file is part of qutebrowser. +# +# qutebrowser is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# qutebrowser is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with qutebrowser. If not, see . + +"""Utils for writing a MHTML file.""" + +import functools +import io + +from collections import namedtuple +from base64 import b64encode +from urllib.parse import urljoin + +from PyQt5.QtCore import QUrl +from PyQt5.QtNetwork import QNetworkRequest, QNetworkReply + +from qutebrowser.utils import log, objreg + + +_File = namedtuple("_File", + "content content_type content_location transfer_encoding") + + +E_NONE = (None, lambda x: x) +"""No transfer encoding, copy the bytes from input to output""" + +E_BASE64 = ("BASE64", b64encode) +"""Encode the file using base64 encoding""" + + +class MHTMLWriter(object): + """A class for aggregating multiple files and outputting them to a MHTML + file.""" + + BOUNDARY = b"qute-mhtml" + + def __init__(self, root_content=None, content_location=None, + content_type=None): + self.root_content = root_content + self.content_location = content_location + self.content_type = None + + self._files = {} + + def add_file(self, location, content, content_type=None, + transfer_encoding=E_BASE64): + """Add a file to the given MHTML collection. + + Args: + location: The original location (URL) of the file. + content: The binary content of the file. + content_type: The MIME-type of the content (if available) + transfer_encoding: The transfer encoding to use for this file. + """ + self._files[location] = _File( + content=content, content_type=content_type, + content_location=location, transfer_encoding=transfer_encoding, + ) + + def remove_file(self, location): + """Remove a file. + + Args: + location: The URL that identifies the file. + """ + del self._files[location] + + def write_to(self, fp): + """Output the MHTML file to the given file-like object + + Args: + fp: The file-object, openend in "wb" mode. + """ + self._output_header(fp) + self._output_root_file(fp) + for file_data in self._files.values(): + self._output_file(fp, file_data) + + def _output_header(self, fp): + if self.content_location is None: + raise ValueError("content_location must be set") + if self.content_type is None: + raise ValueError("content_type must be set for the root document") + + fp.write(b"Content-Location: ") + fp.write(self.content_location.encode("utf-8")) + fp.write(b'\nContent-Type: multipart/related;boundary="') + fp.write(self.BOUNDARY) + fp.write(b'";type="') + fp.write(self.content_type.encode("utf-8")) + fp.write(b'"\n\n') + + def _output_root_file(self, fp): + root_file = _File( + content=self.root_content, content_type=self.content_type, + content_location=self.content_location, transfer_encoding=E_BASE64 + ) + self._output_file(fp, root_file) + + def _output_file(self, fp, file_struct): + fp.write(b"--") + fp.write(self.BOUNDARY) + fp.write(b"\nContent-Location: ") + fp.write(file_struct.content_location.encode("utf-8")) + if file_struct.content_type is not None: + fp.write(b"\nContent-Type: ") + fp.write(file_struct.content_type.encode("utf-8")) + encoding_name, encoding_func = file_struct.transfer_encoding + if encoding_name: + fp.write(b"\nContent-Transfer-Encoding: ") + fp.write(encoding_name.encode("utf-8")) + fp.write(b"\n\n") + fp.write(encoding_func(file_struct.content)) + fp.write(b"\n\n") + + +def start_download(dest): + """Start downloading the current page and all assets to a MHTML file. + + Args: + dest: The filename where the resulting file should be saved. + """ + download_manager = objreg.get("download-manager", scope="window", + window="current") + web_view = objreg.get("webview", scope="tab", tab="current") + web_url_str = web_view.url().toString() + web_frame = web_view.page().mainFrame() + + writer = MHTMLWriter() + writer.root_content = web_frame.toHtml().encode("utf-8") + writer.content_location = web_url_str + # I've found no way of getting the content type of a QWebView, but since + # we're using .toHtml, it's probably safe to say that the content-type is + # HTML + writer.content_type = "text/html" + # Currently only downloading (stylesheets), + + + + + + + + + +

foobar

+ + + + diff --git a/tests/integration/data/downloads/mhtml/complex/complex.mht b/tests/integration/data/downloads/mhtml/complex/complex.mht new file mode 100644 index 000000000..1063ff229 --- /dev/null +++ b/tests/integration/data/downloads/mhtml/complex/complex.mht @@ -0,0 +1,795 @@ +Content-Type: multipart/related; boundary="---=_qute-510287e3-01a6-4b99-8ec9-d0f703c87fef" +MIME-Version: 1.0 + +-----=_qute-510287e3-01a6-4b99-8ec9-d0f703c87fef +Content-Location: http://localhost:1234/data/downloads/mhtml/complex/complex.html +MIME-Version: 1.0 +Content-Type: text/html; charset="UTF-8" +Content-Transfer-Encoding: quoted-printable + + +=20=20=20=20=20=20=20=20 +=20=20=20=20=20=20=20=20 +=20=20=20=20=20=20=20=20 +=20=20=20=20=20=20=20=20 +=20=20=20=20=20=20=20=20 +=20=20=20=20=20=20=20=20 +@import=20"actually-it's-css"; +=20=20=20=20=20=20=20=20 +=20=20=20=20=20=20=20=20 +=20=20=20=20=20=20=20=20 +=20=20=20=20=20=20=20=20 +=20=20=20=20=20=20=20=20 +=20=20=20=20=20=20=20=20 +=20=20=20=20=20=20=20=20The=20story=20so=20far:=20In=20the=20beginning=20= +the=20Universe=20was=20created.=20This=20has=20made=20a=20lot=20of=20people= +=20very=20angry=20and=20has=20been=20widely=20regarded=20as=20a=20bad=20mov= +e.=20-=20Douglas=20Adams
+=20=20=20=20=20=20=20=20 +=20=20=20=20=20=20=20=20 +=20=20=20=20 +=20=20=20=20 +=20=20=20=20=20=20=20=20 +=20=20=20=20=20=20=20=20 +=20=20=20=20=20=20=20=20 +=20=20=20=20=20=20=20=20 +=20=20=20=20=20=20=20=20 +=20=20=20=20=20=20=20=20foobar

+=20=20=20=20=20=20=20=20 +=20=20=20=20=20=20=20=20 +=20=20=20=20 + + +-----=_qute-510287e3-01a6-4b99-8ec9-d0f703c87fef +Content-Location: http://localhost:1234/data/downloads/mhtml/complex/background.png +MIME-Version: 1.0 +Content-Type: image/png +Content-Transfer-Encoding: base64 + +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 +4n8BgjXlKCMEM1EAAAAASUVORK5CYII= + +-----=_qute-510287e3-01a6-4b99-8ec9-d0f703c87fef +Content-Location: http://localhost:1234/data/downloads/mhtml/complex/base.css +MIME-Version: 1.0 +Content-Type: text/css; charset=utf-8 +Content-Transfer-Encoding: quoted-printable + +div.fancy=20{ +=20=20=20=20background-color:=20url("div-image.png"); +} + +-----=_qute-510287e3-01a6-4b99-8ec9-d0f703c87fef +Content-Location: http://localhost:1234/data/downloads/mhtml/complex/div-image.png +MIME-Version: 1.0 +Content-Type: image/png +Content-Transfer-Encoding: base64 + +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 +m+48GgAAAABJRU5ErkJggg== + +-----=_qute-510287e3-01a6-4b99-8ec9-d0f703c87fef +Content-Location: http://localhost:1234/data/downloads/mhtml/complex/extern-css.css +MIME-Version: 1.0 +Content-Type: text/css; charset=utf-8 +Content-Transfer-Encoding: quoted-printable + +@import=20"external-in-external.css"; +p=20{ +=20=20=20=20font-family:=20"Monospace"; +} + +-----=_qute-510287e3-01a6-4b99-8ec9-d0f703c87fef +Content-Location: http://localhost:1234/data/downloads/mhtml/complex/external-in-external.css +MIME-Version: 1.0 +Content-Type: text/css; charset=utf-8 +Content-Transfer-Encoding: quoted-printable + +img=20{ +=20=20=20=20width:=20100%; +} + +-----=_qute-510287e3-01a6-4b99-8ec9-d0f703c87fef +Content-Location: http://localhost:1234/data/downloads/mhtml/complex/favicon.ico +MIME-Version: 1.0 +Content-Type: image/x-icon +Content-Transfer-Encoding: base64 + +AAABAAEAQEAAAAEAIAAoQgAAFgAAACgAAABAAAAAgAAAAAEAIAAAAAAAAEAAAIEXAACBFwAAAAAA +AAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A +////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wDxmEwl7pRFlOyTRLvs +lUbU6ZZI5+iWSfTol0v755lN/ueYTv/pmlH96ZVG8eN1FL/kdhWn5HYUjeZ3FmfjcQ4S////AP// +/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A//// +AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A +////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD/ +//8A7JA8N+2WR7TpmEzy5phO/+aYTv/mmE7/5phO/+eaUf/pnlf/66Jc/+ylYf/spWH/66Jc/+me +V//jeBf/4nUT/+J1E//idRP/4nQT/ON1FM/meBOE5HIUJv///wD///8A////AP///wD///8A//// +AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A +////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD/ +//8A////AP///wD///8A////AOyhTBvpk0O96JZJ9uaYTv/mmU//6J5W/+6pZv/ztHX/9rl8//e9 +gf/4voP/+L6D//i+g//4voP/+L6D//i+g//4voL/8X8Z//B/Gf/vfhj/7XwX/+l6Fv/kdxT/4nUT +/+J1E//jdhTe5XYTkduAEg7///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A +////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD/ +//8A////AP///wD///8A////AP///wD///8A////AP///wD///8A1YAABuZ4FILkgSb055lQ/+uh +W//wrWz/9rh8//m/hf/5v4X/+b+F//m/hf/5v4X/+b+F//m/hf/5v4X/+b+F//m/hf/5v4X/+b+F +//WdS//xgBn/8YAZ//GAGf/xgBn/8YAZ/+5+GP/qexb/5XgV/+J2E//idhTw5ngUgtWAAAb///8A +////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD/ +//8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// +/wD///8A53gWauN3FOfjdxP/6osy//a6f//5wIf/+cCH//nAh//5wIf/+cCH//nAh//5wIf/+cCH +//nAh//5wIf/+cCH//nAh//5wIf/+cCH//nAh//5wIf/97Ju//SSN//yhB7/8oEZ//KBGf/ygRn/ +8oEZ//KBGf/wfxj/6HoV/+N3E//jdxTn53gWav///wD///8A////AP///wD///8A////AP///wD/ +//8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// +/wD///8A////AP///wD///8A////AP///wDmdRQy5HcU2uN3FP/nehX/74AZ//WcSf/5wYn/+cGJ +//nBif/5wYn/+cGJ//nBif/5wYn/+cGJ//nBif/5wYn/+cGJ//nBif/5wYn/+cGJ//nBif/5wYn/ ++cGJ//nBif/5wYn/+cGJ//amWv/yghr/8oIa//KCGv/yghr/8oIa//KCGv/vgBn/53oV/+N3FP/k +dxTa5nUUMv///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// +/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wDoehda43gU +9eZ6Ff/ugBj/8oMa//KDGv/1n0z/+cKK//nCiv/5wor/+cKK//nCiv/5wor/+cKK//nCiv/5wor/ ++cKK//nCiv/5wor/+cKK//nCiv/5wor/+cKK//nCiv/5wor/+cKK//nCiv/5wor/85Ax//KDGv/y +gxr/8oMa//KDGv/ygxr/8oMa//KDGv/ugBj/5noV/+N4FPXoehda////AP///wD///8A////AP// +/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A//// +AP///wD///8A////AP///wDnehWI43gU/el9F//yhBr/8oQa//KEGv/yhBr/9qxi//nDjP/5w4z/ ++cOM//nDjP/5w4z/+cOM//nDjP/5w4z/+cOM//nDjP/5w4z/+cOM//nDjP/5w4z/+cOM//nDjP/5 +w4z/+cOM//nDjP/5w4z/+cOM//evaf/yhBr/8oQa//KEGv/yhBr/8oQa//KEGv/yhBr/8oQa//KE +Gv/pfRf/43gU/ed6FYj///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A//// +AP///wD///8A////AP///wD///8A////AP///wD///8A////AP+SJAfkehW243kU/+yAGP/yhRr/ +8oUa//KFGv/yhRr/840p//i+hP/5xI7/+cSO//nEjv/5xI7/+cSO//nEjv/5xI7/+cSO//nEjv/5 +xI7/+cSO//nEjv/5xI7/+cSO//nEjv/5xI7/+cSO//nEjv/1wIr/6rWA/+KteP/ssHT/8YUa//KF +Gv/yhRr/8oUa//KFGv/yhRr/8oUa//KFGv/yhRr/8oUa/+yAGP/jeRT/5HoVtv+SJAf///8A//// +AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A +////AP+SJAfjexXS5HsV/++DGf/yhhr/8oYa//KGGv/yhhv/9JpA//jAh//5xZD/+cWQ//nFkP/5 +xZD/+cWQ//nFkP/5xZD/+cWQ//nFkP/5xZD/+cWQ//nFkP/5xZD/+cWQ//nFkP/5xZD/4Kx4/6Nu +Pf91QBD/bjkK/245Cv9uOQr/bjkK/3E7C/99Qgz/ikoN/5hRD/+xYBL/2ngX//KGGv/yhhr/8oYa +//KGGv/yhhr/74MZ/+R7Ff/jexXS/5IkB////wD///8A////AP///wD///8A////AP///wD///8A +////AP///wD///8A////AP///wD///8A////AP///wDkexW25n0V//GGGf/yhxr/8oca//KHGv/0 +mTv/+LyA//nGkv/5xpL/+caS//nGkv/5xpL/+caS/9Ogbf/Wo3D/9sOP//nGkv/5xpL/+caS//nG +kv/5xpL/+caS//nGkv/5xpL/rHdG/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK +/245Cv9uOQr/bjkK/245Cv9+Qgz/ploR/9l4F//yhxr/8oca//KHGv/xhhn/5n0V/+R7Fbb///8A +////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wDn +fhWI5XwV//KHGv/ziBr/84ga//OIGv/1nUH/+caS//nHk//5x5P/+ceT//nHk//5x5P/+ceT//nH +k/+rd0b/bjkK/3ZBEv+caDf/xJFf/+y6hv/5x5P/+ceT//nHk//5x5P/y5hm/245Cv9uOQr/bjkK +/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9vOQr/ +nVUQ/+J+GP/ziBr/84ga//KHGv/lfBX/534ViP///wD///8A////AP///wD///8A////AP///wD/ +//8A////AP///wD///8A////AP///wDogBda5XwU/fGHGf/ziRr/84ka//OJGv/zihz/+L6C//nI +lf/5yJX/+ciV//nIlf/5yJX/+ciV//nIlf/5yJX/q3dH/245Cv9uOQr/bjkK/245Cv9vOgv/ilYm +/7J/Tv/bqXf/+ciV/5VhMf9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/ +bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9xOwr/q14R//GIGv/ziRr/8YcZ/+V8FP3o +gBda////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wDmehQy5HwU9e+G +GP/zihr/84oa//OKGv/zihr/96pa//rJl//6yZf/+smX//rJl//6yZf/+smX//rJl//6yZf/+smX +/6t4R/9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK//bEk/+MWCj/bjkK/245Cv9uOQr/ +bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9u +OQr/bjkK/245Cv+PTQ7/6IMZ//OKGv/vhhj/5HwU9eZ6FDL///8A////AP///wD///8A////AP// +/wD///8A////AP///wD///8A5X0V2u2FGP/zixv/84sb//OLG//zixv/9JMq//rIlf/6ypn/+sqZ +//rKmf/6ypn/+sqZ//rKmf/6ypn/+sqZ//rKmf+reEj/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/ +bjkK/245Cv/2xZX/jFgp/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9u +OQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/35DDP/ffhj/84sb/+2F +GP/lfRXa////AP///wD///8A////AP///wD///8A////AP///wD///8A54AWaumCF//zjBv/84wb +//OMG//zjBv/84wb//i1bv/6y5r/+sua//rLmv/6y5r/+sua//rLmv/6y5r/+sua//rLmv/6y5r/ +q3lJ/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/9saV/4xYKf9uOQr/bjkK/245Cv9u +OQr/cDsM/4dTI/+kckL/vYtb/7qIWP+reUn/iE8a/285Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245 +Cv9uOQr/bjkK/245Cv9uOQr/hEcN/+6JGv/zjBv/6YIX/+eAFmr///8A////AP///wD///8A//// +AP///wD///8A1YAABuR+Febxixr/840b//ONG//zjRv/840b//WdO//6zJv/+syc//rMnP/6zJz/ ++syc//rMnP/6zJz/+syc//rMnP/6zJz/+syc/6t5Sv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9u +OQr/bjkK//bHl/+MWSn/bjkK/245Cv9vOgv/r31O//TGlv/6zJz/+syc//rMnP/6zJz/+syc//nD +iv/afRj/kE8O/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv+gWBD/840b +//GLGv/kfhXm1YAABv///wD///8A////AP///wD///8A////AOaBFoLrhhj/844b//OOG//zjhv/ +844b//SXL//5xo//+s2e//rNnv/6zZ7/+s2e//rNnv/6zZ7/+s2e//rNnv/6zZ7/+s2e//rNnv+r +eUr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv/2yJn/jFkq/245Cv9uOQr/xJRl//rN +nv/6zZ7/+s2e//rNnv/6zZ7/+s2e//rNnv/4vn7/844b//OOG//DbxX/dT4L/245Cv9uOQr/bjkK +/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/812Fv/zjhv/64YY/+aBFoL///8A////AP///wD///8A +////AO2SEg7lgRXv844b//SPG//0jxv/9I8b//SPG//4vHr/+s6g//rOoP/6zqD/+s6g//rOoP/6 +zqD/+s6g//rOoP/6zqD/+s6g//rOoP/6zqD/q3pL/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245 +Cv9uOQr/9smb/4xZKv9uOQr/ekYX//jMnv/6zqD/+s6g//rOoP/6zqD/+s6g//rOoP/5v4D/9qFA +//SPG//0jxv/9I8b/+GDGf97QQz/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv+MTA7/ +9I8b//OOG//lgRXv7ZISDv///wD///8A////AP///wDmghWR7ooZ//SQG//0kBv/9JAb//SQG//0 +kBv/+Ldv//rPov/6z6L/+s+i//rPov/6z6L/+s+i//rPov/6z6L/+s+i//rPov/6z6L/+s+i/6t6 +TP9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK//bKnf+MWSv/bjkK/4NQIf/6z6L/+s+i +//rPov/6z6L/+s+i//rLmf/2pkv/9JAb//SQG//0kBv/9JAb//SQG//0kBv/2X8Y/3Q9C/9uOQr/ +bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/9J6F//0kBv/7ooZ/+aCFZH///8A////AP///wD/ +//8A6IQW2vSRG//0kRv/9JEb//SRG//0kRv/9JEb//ajQv/60KP/9cue/8qcbv+zhFb/nm0//5dl +N/+ndkj/todZ/8udb//zyZz/+tCj//rQo/+re03/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK +/245Cv/2y57/jFor/245Cv+DUCH/+tCj//nKl//4unP/965a//anS//0lSX/9JEb//SRG//0kRv/ +9JEb//SRG//0kRv/9JEb//SRG//Ndxb/bzkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv+g +WhD/9JEb//SRG//ohBba////AP///wD///8A5IAUJu2KGP/0khv/9JIb//SSG//0khv/9JIb//SS +G//1smX/wZRm/3xIGv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/cz8Q/6FwQv/swpb/q3tN +/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/9syg/4xaK/9uOQr/g1Ag//i8dv/1nzj/ +9JIb//SSG//0khv/9JIb//SSG//0khv/9JIb//SSG//0khv/9JIb//SSG//0khv/9JIb/5tXEP9u +OQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/eUAL//ORG//0khv/7YoY/+SAFCb///8A////AOaF +FYTykRr/9JMb//STG//0kxv/9JMb//STG//pjBr/hksS/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK +/245Cv9uOQr/bjkK/245Cv9uOQr/eUUW/4xaLP9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/ +bjkK//fNov+MWSn/bjkK/4JHDf/0kxv/9JMb//STG//0kxv/9JMb//STG//0kxv/9JMb//STG//0 +kxv/9JMb//STG//0kxv/9JMb//STG//Ufhf/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245 +Cv/XgBf/9JMb//KRGv/mhRWE////AP///wDpiBfI9JQc//SUHP/0lBz/9JQc//SUHP/sjhv/h0oN +/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/ +bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv/3zqT/jFMb/245Cv+CRw3/9JQc//SUHP/0 +lBz/9JQc//SUHP/0lBz/9JQc//SUHP/0lBz/9JQc//SUHP/0lBz/9JQc//SUHP/0lBz/8pMc/3c/ +C/9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/wXEV//SUHP/0lBz/6YgXyP///wDjjg4S7YwY ++vSVHP/0lRz/9JUc//SVHP/ukRv/i00O/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/ +bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9u +OQr/98uc/4tOEP9uOQr/gkcN//SVHP/0lRz/9JUc//SVHP/0lRz/9JUc//SVHP/0lRz/9JUc//SV +HP/0lRz/9JUc//SVHP/0lRz/9JUc//SVHP+eWhD/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK +/65lE//0lRz/9JUc/+2MGPrjjg4S6YYWZ/OTG//1lhz/9ZYc//WWHP/1lhz/lVQP/245Cv9uOQr/ +bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9u +OQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK//S0Z/+LTQ7/bjkK/4NHDf/1lhz/9ZYc//WW +HP/1lhz/9ZYc//WWHP/1lhz/9ZYc//WWHP/1lhz/9ZYc//WWHP/1lhz/9ZYc//WWHP/1lhz/u24U +/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv+cWBD/9ZYc//WWHP/zkxv/6YYWZ+2NGIL1lxz/ +9Zcc//WXHP/1lxz/zHoW/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9u +OQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245 +Cv/xlBz/kVEP/245Cv+DRw3/9Zcc//WXHP/1lxz/9Zcc//WXHP/1lxz/9Zcc//WXHP/1lxz/9Zcc +//WXHP/1lxz/9Zcc//WXHP/1lxz/9Zcc/8d3Fv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/ +ilMf//nEhf/4u3D/9qI2/+2NGILukBmX9Zgc//WYHP/1mBz/85cc/4JHDf9uOQr/bjkK/245Cv9u +OQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245 +Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/75Qb//CUG/+yaRP/iUwO//WYHP/1mBz/9Zgc +//WYHP/1mBz/9Zgc//WYHP/1mBz/9Zgc//WYHP/1mBz/9Zgc//WYHP/1mBz/9Zgc//WYHP/Gdxb/ +bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/4BNH//717D/+9ew//vXsP/0u3vW8JMZrfWZHP/1 +mRz/9Zkc/9aDGP9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9xPA3/r4NY/9y1 +jf/00ar/8Myl/8iedf98SRv/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK +/4RIDf/Pfhf/9Zkc/+6UG//1mRz/9Zkc//WZHP/1mRz/9Zkc//WZHP/1mRz/9Zkc//WZHP/1mRz/ +9Zkc//WZHP/1mRz/9Zkc//WZHP/1mRz/wHMV/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv+A +TR//+9iy//vYsv/72LL/9sSJ6vKUGsT1mhz/9Zoc//WaHP+waRP/bjkK/245Cv9uOQr/bjkK/245 +Cv9uOQr/bjkK/245Cv9xPQ3/3LaO//vZs//72LD/+9mz//vZs//72bP/9dKs/7GGW/9yPg//bjkK +/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/5ZWD//hjBn/9Zoc//WaHP/1mhz/ +9Zoc//WaHP/1mhz/9Zoc//WaHP/1mhz/9Zoc//WaHP/1mhz/9Zoc//WaHP/1mhz/9Zoc/7pwFP9u +OQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/iFYp//vZs//72bP/+9mz//fIkfTxlxvc9Zsc//Wb +HP/1mxz/i04O/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/s3Ag//vVq//72bX/+9ew +//vZtf/72bX/+cWE//i9cP/3r03/57Fv/5pgIv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/ +bjkK/245Cv9uOQr/cTsK/6tlEv/tlRv/9Zsc//WbHP/1mxz/9Zsc//WbHP/1mxz/9Zsc//WbHP/1 +mxz/9Zsc//WbHP/1mxz/9Zsc//WbHP+rcTD/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/5Zn +O//72bX/+9m1//vZtf/3zJv78Zkb9PWcHP/1nBz/9Jsc/3A6Cv9uOQr/bjkK/245Cv9uOQr/bjkK +/245Cv9uOQr/hUoN//KaHP/1nB3/96xE//i8a//3rET/961F//WcHP/1nBz/9Zwc//WcHP/1nBz/ +04MX/4ZLDf9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/ekIM/8B1Ff/0 +mxz/9Zwc//WcHP/1nBz/9Zwc//WcHP/1nBz/9Zwc//WcHP/1nBz/9Zwc//WcHP/3tVn/g1Ek/245 +Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv+kd0z/+9u3//vbt//727f/99Kn//WbHfP2nB3/9pwe +/+ygOv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/7FqE//2nB3/9pwd//acHf/2nB3/ +9pwd//acHf/2nB3/9pwd//acHf/2nB3/9pwd//acHf/0mx3/vnMV/3lBC/9uOQr/bjkK/245Cv9u +OQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/iEwO/9WEGP/2nB3/9pwd//acHf/2nB3/9pwd//ac +Hf/2nB3/9pwd//acHf/2nB7/5sGd/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/s4hf +//zbuf/827n//Nu5//rWr//2nR3Z+LJQ//zXr//lwZ7/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/ +bjkK/245Cv/Nfxf/9p0d//adHf/2nR3/9p0d//adHf/2nR3/9p0d//adHf/2nR3/9p0d//adHf/2 +nR3/9p0d//adHf/tlhz/qWUS/3A7Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245 +Cv9uOQr/m1oQ/+WRG//2nR3/9p0d//adHf/2nR3/9p0d//adHf/2nR3/96Uy/5hqP/9uOQr/bjkK +/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/86ngf/83Lv//Ny7//zcu//71q37+cN84fzcuv/83bz/ +2LSP/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/6ZQb//aeHf/2nh3/9p4d//aeHf/2 +nh3/9p4d//aeHf/2nh3/9p4d//aeHf/2nh3/9p4d//aeHf/2nh3/9p4d//KbHP/gjhr/lFUP/245 +Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9yPAv/sGoT//CaHP/2nh3/9p4d +//aeHf/2nh3/9p4d/8F2Fv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/286C//x0K7/ +/N28//zdvP/83bz/+9Sm9Pzbtff83r7//N6+/8ymgf9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9u +OQr/ekIM//afHf/2nx3/9p8d//afHf/2nx3/9p8d//afHf/2nx3/9p8d//afHf/2nx3/9p8d//af +Hf/2nx3/9p8d//afHf+OUQ7/wHYV//WeHf/NgRf/cTsK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK +/245Cv9uOQr/bjkK/245Cv98RAz/xXoW//WfHf/2nx3/6ZUb/5tbEP9uOQr/bjkK/245Cv9uOQr/ +bjkK/245Cv9uOQr/bjkK/245Cv+HVir//N6+//zevv/83r7//N6+//vToun5wne5+siD//vWqf/I +on7/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/39GDP/2oB3/9qAd//agHf/2oB3/9qAd//ag +Hf/2oB3/9qAd//agHf/2oB3/9qAd//agHf/2oB3/9qAd//agHf/2oB3/g0kN/245Cv+SVA//9qAd +/3Y/C/9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9zPQv/ +f0YM/3E7Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/upJr//zfwP/8 +38D//N/A//zfwP/70p/Z9qAdcfahHf/2pCT/3LF//245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245 +Cv93QAv/9qEd//ahHf/2oR3/9qEd//ahHf/2oR3/9qEd//ahHf/2oR3/9qEd//ahHf/2oR3/9qEd +//ahHf/2oR3/9qEd/4NJDf9uOQr/f0YM//ahHf92Pwv/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/ +bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9u +OQr/bjkK/245Cv9uOQr/fkse//favP/84ML//ODC//zgwv/84ML/+cyPuPWhHU/2oh3/9qId/+6i +Lf9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/+aWG//2oh3/9qId//aiHf/2oh3/9qId +//aiHf/2oh3/9qId//aiHf/2oh3/9qId//aiHf/2oh3/9qId//aiHf+DSQ3/bjkK/39GDP/2oh3/ +dj8L/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9u +OQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/8ahff/84cT//OHE//zh +xP/84cT//OHE//nEd37/nRQN96Md+fejHf/3ox3/f0YM/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK +/245Cv/Nghf/96Md//ejHf/3ox3/96Md//ejHf/3ox3/96Md//ejHf/3ox3/96Md//ejHf/3ox3/ +96Md//ejHf/3ox3/g0kN/245Cv9/Rgz/96Md/3Y/C/9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9u +OQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245 +Cv9uOQr/bjkK/4dWKv/74cT//OLF//zixf/84sX//OLF//zhw///v2oY////APekHbj3pB3/96Qd +/6ZlEv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/sW0T//ekHf/3pB3/96Qd//ekHf/3pB3/ +96Qd//ekHf/3pB3/96Qd//ekHf/3pB3/96Qd//ekHf/3pB3/96Qd/4NJDf9uOQr/f0YM//ekHf92 +Pwv/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245 +Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/3VBE//bu5v//OPH//zjx//848f//OPH +//zjx//72q7x////AP///wD4pR1p96Ue//elHv/PhRj/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/ +bjkK/39HDf/2pB7/96Ue//elHv/3pR7/96Ue//elHv/3pR7/96Ue//elHv/3pR7/96Ue//elHv/3 +pR7/96Ue//elHv+DSg3/bjkK/39GDP/3pR7/dj8L/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245 +Cv99RQz/qmgT/286Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK +/3xKHf/hw6T//OTJ//zkyf/85Mn//OTJ//zkyf/85Mn/+9Odu////wD///8A9qocG/emHv/3ph7/ +8qId/3dAC/9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/yoMX//emHv/3ph7/96Ye//emHv/3 +ph7/96Ye//emHv/3ph7/96Ye//emHv/3ph7/96Ye//emHv/3ph7/g0oN/245Cv9/Rgz/96Ye/3Y/ +C/9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/f0YM//emHv/glBv/mFsQ/245Cv9uOQr/bjkK +/245Cv9uOQr/bjkK/245Cv9uOQr/cDsM/5xwSP/s0bT//eXL//3ly//95cv//eXL//3ly//95cv/ +/eXL//vRk0L///8A////AP///wD4qB7M96ce//enHv+xbhT/bjkK/245Cv9uOQr/bjkK/245Cv9u +OQr/bjkK/3tEDP/tnx3/96ce//enHv/3px7/96ce//enHv/3px7/96ce//enHv/3px7/96ce//en +Hv/3px7/96ce/4NKDf9uOQr/f0YM//enHv92Pwv/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK +/39GDP/3px7/96ce//enHv/snhz/0YkZ/7dzFf+cXhH/lVgQ/55fEf+taxP/zoYY/++iIP/71Zz/ +/ebM//3mzP/95sz//ebM//3mzP/95sz//ebM//3br/T///8A////AP///wD///8A9qgfdfeoHv/4 +sjr/7KQo/3M9C/9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/llkQ//OlHf/3qB7/96ge//eo +Hv/3qB7/96ge//eoHv/3qB7/96ge//eoHv/3qB7/96ge//eoHv+CSg3/bjkK/39GDP/3qB7/dkAL +/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9/Rgz/96ge//eoHv/3qB7/96ge//eoHv/3qB7/ +96ge//eoHv/3qB7/96ge//eoHv/3qB7/96ge//nAYv/95sv//efO//3nzv/9587//efO//3nzv/7 +zYit////AP///wD///8A////AP/Ykxr947/8/ejQ//3lyP+rdjf/bjkK/245Cv9uOQr/bjkK/245 +Cv9uOQr/bjkK/245Cv+NUg//7KAc//epHv/3qR7/96ke//epHv/3qR7/96ke//epHv/3qR7/96ke +//epHv/Sixn/bzkK/245Cv9/Rwz/96ke/3ZAC/9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/ +f0cM//epHv/3qR7/96ke//epHv/3qR7/96ke//epHv/3qR7/96ke//epHv/3qR7/96ke//epHv/3 +qR7/+cBg//3o0P/96ND//ejQ//3o0P/95sn+/9WKGP///wD///8A////AP///wD///8A+9unvf3p +0v/96dL/9N7F/4BPI/9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/3pDDP+3dBX/76Md +//iqHv/4qh7/+Koe//iqHv/4qh7/+Koe//iqHv/PiBj/cz0L/245Cv9uOQr/f0cM//iqHv92QAv/ +bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/39HDP/4qh7/+Koe//iqHv/4qh7/+Koe//iqHv/4 +qh7/+Koe//iqHv/4qh7/+Koe//iqHv/4qh7/+Koe//itJv/96M7//enS//3p0v/96dL//Neesv// +/wD///8A////AP///wD///8A////AP/grRn958z9/erU//3q1P/exKj/cTwO/245Cv9uOQr/bjkK +/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/3U/C/+YXBD/q2sT/716Ff/PiRj/25Ma/7V0FP+HTg7/ +bjkK/245Cv9uOQr/bjkK/39HDP/4qx7/dkAL/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9/ +Rwz/+Kse//irHv/4qx7/+Kse//irHv/4qx7/+Kse//irHv/4qx7/+Kse//irHv/4qx7/+Kse//ir +Hv/4qx7/+sdu//3q1P/96tT//OTC+//bkg7///8A////AP///wD///8A////AP///wD///8A/Nyo +p/3r1f/969X//evV/72bef9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/ +bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9/Rwz/+Kwe/3ZAC/9u +OQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/f0cM//isHv/4rB7/+Kwe//isHv/4rB7/+Kwe//is +Hv/4rB7/+Kwe//isHv/4rB7/+Kwe//isHv/4rB7/+Kwe//isHv/6wFf//ebF//vVk5D///8A//// +AP///wD///8A////AP///wD///8A////AP/b2wf84rv1/ezX//3s1//869b/pH1Y/245Cv9uOQr/ +bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9u +OQr/bjkK/245Cv9uOQr/f0cM//itHv92QAv/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/39H +DP/4rR7/+K0e//itHv/4rR7/+K0e//itHv/4rR7/+K0e//itHv/4rR7/+K0e//itHv/4rR7/+K0e +//itHv/4rR7/+K0e//q/U9T///8B////AP///wD///8A////AP///wD///8A////AP///wD///8A ++9WKSP3r0/797dn//e3Z//3t2f+/n4D/cDwN/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9u +OQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/39HDf/4rh//dkAL/245 +Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9/Rw3/+K4f//iuH//4rh//+K4f//iuH//4rh//+K4f +//iuH//4rh//+K4f//iuH//4rh//+K4f//iuH//4rh//+K8j//m6RPH4sRwk////AP///wD///8A +////AP///wD///8A////AP///wD///8A////AP///wD93qmS/u7b//7u2//+7tv//u7b/9rBp/96 +SBv/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245 +Cv9uOQr/bjkK/245Cv9/Rw3/+K8f/3ZAC/9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/f0cN +//ivH//4rx//+K8f//ivH//4rx//+K8f//ivH//4rx//+K8f//ivH//4rx//+K8f//ivH//4rx// ++K8f//nBU/372JuE////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD/ +//8A////AP7juMr+793//u/d//7v3f/+793/7drE/6J7Vv9yPhD/bjkK/245Cv9uOQr/bjkK/245 +Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/gUoN//iwH/92QAv/bjkK +/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/39HDf/4sB//+LAf//iwH//4sB//+LAf//iwH//4sB// ++LAf//iwH//4sB//+LAf//iwH//4sB//+LAf//iwH//5vkl9////AP///wD///8A////AP///wD/ +//8A////AP///wD///8A////AP///wD///8A////AP///wD//78E/eS24f7w3v/+8N7//vDe//7w +3v/+8N7/8+LO/72dfv+DVCn/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK +/245Cv9uOQr/cz4L/9eUGv/5sR//w4IX/4hPDv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9/SA3/ ++bEf//mxH//5sR//+bEf//mxH//5sR//+bEf//mxH//5sR//+bEf//mxH//5sR//+bEf//mxH//4 +sh+b////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// +/wD///8A////AP/EnQ395Lvv/vDd//3fqv/+8eD//vDb//vRfv/83aP//fDd/9jBqP+tiWf/nXZQ +/49jO/+AUCX/cj0N/245Cv9uOQr/bjkK/3M+C/+KUg7/uHkV/+qlHf/5sh//+bIf//myH//5sh// +2ZYa/59kEf9xPAr/bjkK/245Cv9uOQr/f0gN//myH//5sh//+bIf//myH//5sh//+bIf//myH//5 +sh//+bIf//myH//5sh//+bIf//myH//6sh+8/5kzBf///wD///8A////AP///wD///8A////AP// +/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A/+SuE/3lu+L6v0P//eO1 +//7y4v/968z//ejD//7y4v/95Lf//eGt//7y4v/+8uL//vLi//7u1v/wuk7/4J0b/+ikHP/5wEn/ ++bMf//mzH//5sx//+bMf//mzH//5sx//+bMf//mzH//5sx//7agd/7d5Ff9/SA3/bjkK/39IDf/5 +sx//+bMf//mzH//5sx//+bMf//mzH//5sx//+bMf//mzH//5sx//+bMf//mzH//4sx+b/8wzBf// +/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A//// +AP///wD///8A////AP///wD///8D/N2dq/rCSv3+79j//eCp//m5MP/825r//vPk//7z5P/+8+T/ +/vPk//7z5P/+8+T//vPk//3ry//82I///efA//3ktv/70Xn/+r49//m0H//5tB//+bQf//m0H//5 +tB//+bQf//m0H//5tB//+LMf/8+PGf+laRL/+bQf//m0H//5tB//+bQf//m0H//5tB//+bQf//m0 +H//5tB//+bQf//m0H/z4tB5t////AP///wD///8A////AP///wD///8A////AP///wD///8A//// +AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD72JF2 +/eKt+v3tzv/82Y///eSz//705f/+9OX//vTl//705f/+9OX//vTl//705f/+9OX//vTl//705f/+ +9OT//NiN//vSev/6yFr/+bUf//m1H//5tR//+bUf//m1H//5tR//+bUf//m1H//5tR//+bUf//m1 +H//5tR//+bUf//m1H//5tR//+bUf//m1H//5tR//+bUf//m1H+74tB5E////AP///wD///8A//// +AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A +////AP///wD///8A////AP///wD///8A////APi4HCT81X7e/vXn//715//+9ef//vXn//715//+ +9ef//vXn//715//+9ef//vXn//715//+9ef//vPg//m6LP/5th//+bYf//m2H//6xEr/+81q//zY +jP/84KX/+bYf//m2H//5th//+bYf//m2H//5th//+bYf//m2H//5th//+bYf//m2H//5th//+bYf +//m2H8f4uBwk////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A +////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD/ +//8A////A/3ippX98NX7/vbp//726f/+9un//vbp//726f/+9un//vbp//726f/+9un//vbp//7w +1f/7z27/+boq//m6Kf/5tyD/+9V///726f/+9un//eSv//m3IP/5tyD/+bcg//m3IP/5tyD/+bcg +//m3IP/5tyD/+bcg//m3IP/5tyD/+bcg2Pm3H1L///8A////AP///wD///8A////AP///wD///8A +////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD/ +//8A////AP///wD///8A////AP///wD///8A////AP///wD///8A/+qqDPzhqKz+8979/vfr//73 +6//+9+v//vfr//736//+9+v//vfr//736//96sL//NV+//3ou//82Yv//NN4//vBPv/82Yv//evE +//q7Kv/6uCD/+rgg//q4IP/6uCD/+rgg//q4IP/6uCD/+rgg//q4IP/5uCDm+rcgZ/+/QAT///8A +////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD/ +//8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// +/wD///8A////AP///wD///8A/96bF/7hprX+8NT4//jt///47f//+O3///jt///47f//+O3///jt +///47f//+O3///jt///47f//+Ov//uWx///25//7w0D/+rkg//q5IP/6uSD/+rkg//q5IP/6uSD/ ++rkg//q5Icz7uSF1/7MaCv///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD/ +//8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// +/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A//// +APvjoj/+5Ker/uvB6//36P//+e7///nu///57v//+e7///nu///57v//+e7///nu///57v//+e7/ +/NmF//q6IP/6uiD/+rog//q6IPn5uiC4+rsgafa9HBv///8A////AP///wD///8A////AP///wD/ +//8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// +/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A//// +AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD/0XQW/d+Wgf7nrbX+57XO +/uu/4v7vyvD+89f6/vfo///46///9+X8/vTb9/vFQq/5ux+L+rsgcfm7IE//xCcN////AP///wD/ +//8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// +/wD///8A////AP///wD///8A////AP///wD///8A////AAD///////gAAB//////wAAAA/////8A +AAAA/////gAAAAB////4AAAAAB////AAAAAAD///4AAAAAAH//+AAAAAAAH//wAAAAAAAP//AAAA +AAAA//4AAAAAAAB//AAAAAAAAD/4AAAAAAAAH/gAAAAAAAAf8AAAAAAAAA/gAAAAAAAAB+AAAAAA +AAAHwAAAAAAAAAPAAAAAAAAAA8AAAAAAAAADgAAAAAAAAAGAAAAAAAAAAYAAAAAAAAABAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAACAAAAAAAAAAYAAAAAAAAABgAAAAAAAAAHAAAAAAAAAA8AAAAAAAAADwAAAAAAAAAPg +AAAAAAAAB+AAAAAAAAAH8AAAAAAAAA/wAAAAAAAAD/gAAAAAAAAf/AAAAAAAAD/+AAAAAAAAf/4A +AAAAAAD//wAAAAAAAP//gAAAAAAB///AAAAAAAf///AAAAAAD///+AAAAAAf///8AAAAAH////8A +AAAA/////8AAAAP/////+AAAH///////AAD///8= + +-----=_qute-510287e3-01a6-4b99-8ec9-d0f703c87fef +Content-Location: http://localhost:1234/data/downloads/mhtml/complex/image.gif +MIME-Version: 1.0 +Content-Type: image/gif +Content-Transfer-Encoding: base64 + +R0lGODlhhQBkAPcAAAAAAAMADAoBDwIBFAsCEwQBGwsEHAwIGhIFHRUGGgYBIgsEJAwEKw4JKBMF +IxMKJRIELBoGLBQLKxwKLBoIJRsRLRcQJw0IMxQGMxULMxwMNBQLOxwNOxgGNR0SNB0SOxsVPCML +LSIZLCQLMywMMyYOOSMUPCsTPCQZPSobPCMXNTcUOzEMMCshOzEmPEUUOxoOQhQMQx0SRB0USxcT +RhwVUiMVRCkWQiUaRCsbRCIWSiUaTCsdSzIaRDUcSCUbUyseUiQbWSwhQy4hTDMkTTcnSi0hUywi +WyYhXDMkUzUpUzoqVTMmWzUqXDsrWzkmVT4yXT0yVD0yTy0lYTQrYTstYjEnZT0zZDszazw1dEcc +REknSVIsTUIuXEUrVVQqVUIzXEc3Wlg3WU8zTUM0Y0Q6ZUs7ZEQ2a0U6a0s8a0w3Z1k5ZUY7c0k1 +ZmI9ZGA7X1ZHXE5CZU1CbEdAZ1JDbFhIaUxCc0xEe1JFc1ZKdFpMdFRKeVtMe1dFdV1SfF1SdGRH +aWNMdWdKdWJTfWdXeXJYe2VWbmxkenxqf0U+gl1Tg1xTiFNKhGNUgmVZg2pdhGRai2tdi2xUgXNc +h2pekmtihW1ijHJkjHRqjHlniGxjk3JlknRqk3lslXVrm3ltmnxylXxzm396m3xzinx1o3x2pnRs +oYN1m4R7m4Z5l4Jxj4R8pIl9pYR7qIyBnYyKmo2Hk4yDpIaCrIyErIyHqJOLrJSJqJmTqo2LtIqF +sZONtJeMs5WRtJyUtJWTuZyZvJyXt6Kas6Kcu6SataukvKilubSxvJ+cwKOewqaiw6qlwqypxa2p +ybKsw7Ouy7CnwbWyy7u6zLe1yL270rq10sG9y8G91L/Ex8XCzcTC1cbD2snG3MzL3cjL09LT3dXb +3c7P2tHO4dPU49zd5dvc6tfY5c3N4N7h69zj5d/i8OHl7OTq7uXr6u797+n07eXr8eru8+vz9O/9 +8O72+fD+8fX6+vD/7wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAAAAAAALAAAAACFAGQA +AAj+AAEIHEiwoMGDCBMqXMiwocOHECNKnEixosWLGDNq3Mixo8ePIEOKHEmypMmTKFOqXMmypcuX +MGN+FCAggE2ZOC0GEEDgQQgVN3LwGIrCw4QDAXIqTRiAAIIQJXLkGLLEyRMfQJ4occK1SAoNBJaK +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 + +-----=_qute-510287e3-01a6-4b99-8ec9-d0f703c87fef +Content-Location: http://localhost:1234/data/downloads/mhtml/complex/inline.png +MIME-Version: 1.0 +Content-Type: image/png +Content-Transfer-Encoding: base64 + +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 +cmeb7jwaAAAAAElFTkSuQmCC + +-----=_qute-510287e3-01a6-4b99-8ec9-d0f703c87fef +Content-Location: http://localhost:1234/data/downloads/mhtml/complex/script.js +MIME-Version: 1.0 +Content-Type: application/javascript +Content-Transfer-Encoding: base64 + +ZG9jdW1lbnQud3JpdGUoIlRoZSBzdG9yeSBzbyBmYXI6IEluIHRoZSBiZWdpbm5pbmcgdGhlIFVu +aXZlcnNlIHdhcyBjcmVhdGVkLiBUaGlzIGhhcyBtYWRlIGEgbG90IG9mIHBlb3BsZSB2ZXJ5IGFu +Z3J5IGFuZCBoYXMgYmVlbiB3aWRlbHkgcmVnYXJkZWQgYXMgYSBiYWQgbW92ZS4gLSBEb3VnbGFz +IEFkYW1zPGJyPiIpCg== + +-----=_qute-510287e3-01a6-4b99-8ec9-d0f703c87fef-- diff --git a/tests/integration/data/downloads/mhtml/complex/div-image.png b/tests/integration/data/downloads/mhtml/complex/div-image.png new file mode 100644 index 0000000000000000000000000000000000000000..c65a1cf65c69b45f59eddf6f5136decde84622c5 GIT binary patch literal 4633 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 M#SD0vy@0>|7lpqHW&i*H literal 0 HcmV?d00001 diff --git a/tests/integration/data/downloads/mhtml/complex/image.gif b/tests/integration/data/downloads/mhtml/complex/image.gif new file mode 100644 index 0000000000000000000000000000000000000000..3acc7b8512c0c14c3df7cc033b015ea95791e54b GIT binary patch literal 6477 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 P=l_-a>W&)>0TKTPBc--X literal 0 HcmV?d00001 diff --git a/tests/integration/data/downloads/mhtml/complex/inline.png b/tests/integration/data/downloads/mhtml/complex/inline.png new file mode 100644 index 0000000000000000000000000000000000000000..4414857c5dcea81c78c3b006661d3eea2feb7ea0 GIT binary patch literal 4635 zcmZ`+WmMGN*ZmDKq=YnzfPi#&hsY4pN(o2`Lr4$ZgA&r+UD7Q`BV8&XJ;2ZnLr4t% zc|N`$-gVd6d)~42O7OgCf`>F|gskPopK?E-q+G(m9q=ET+SDMb}3kn7G* zqzfT)dw`a{J!qJe>EaX{Jx3d<62IEWKE(4k$KbFK>DSI|H_g;ajo!75)?9@r)du+G z_yoX|pZ(miWFTTemOF0W5qH?=%DRZaR|IAZ9HBOSbUA-IdpNIJFpH|l1Z#DV+y#@Af|Uvx9$29@YukVd2Xfn`r>iu-p@G>=p5dS zOV{Lz&V^827cTITixC2znQZZF`*XE0^tv78hP|(fRg*K#H9Y@3ZOk{ktDG~Fr2(i;jGyl5ffJgU2UG#>bJ^+YvR&}f)btIahSQGlEoWml zwy#k2Zcj=t*WjsLkIl$;C1^(P)k@5hR__5>(ZQwhXzj6?{t!&<@#>F<-nFr>lgY2K zW*B=S3j}FHzr#sH$Gu)$TZm*^QMT_THcXSHCPyB3{;3#mZFPRvRPdaQB!vH+wU+bL zo8cv6dB@h3b1X$$+B^vu;Dz4{;!*+ss9Jpv!^lJe;*!pf7FI%5%ec2r zq8GPmG8-^fkFW4h#d@d53m6SmWxSf}+vGoDVzXff?R-}CeIDu|*twheVl^yp$94?IC2`Qw{ zY85MT>7(|41}!37m-hre`ek_J{L1jUMX99v?q`QRp`^ab=8+i3y!Qc9;1t}HfPPF? zrT1jFm>jA=vQ;gF>3-~rM=VZ7Oie{R+3yoA1ix43R#NHT0MZ!H)$^PAp=g`vW$BxV z?^`ELI7B2g6hJQYj)TIpm^|(Y(b?g5r+%$;H#gB)$X%7b%0U2K_Lo>MrxsDt#d}u2 zhOI>383Y3%${&+qt$Xqb-A4KSa*D`}>r73zp=`I{H!P8{!g}tt>J$tG@Y3y-zLvHG z3lh-VCv6M#<~^n3E!4#m*!)pGAn{xi9n#3MrCEVYc3pL97JkDj%YK@k@IgAzMpwfNjueDyb(LU*DJg@F3 zM;_S)C*q0wJR({~%mK<;*(`8SHyT%gPnZjr+a&(zYiazG!{V#3!C%#$$j`RlaI8SR z>ZA-OClZAjw$py(a zrA_-7(iJWHO7xoKr3j{6=FttvaSYl(dcT?$Di+U^5Ph7JZdXt`p9l1V(I|CD=W|v&mNMK~kqGuB4ST2CV9AqEfQcT()mj3h)(_77o)p|8v z+Wb#oA8te`v%;i;-0v{Nxz);*hd|7e!}~xa2-AI0J(cVvlc_zAyT|ozB+n{FY9&S`Dsp-|GSooK;66eQDMWOs^B{^k&hMH5pD$7UADEm zyL1S?LMx8)!rK>C?I$>R*LfN1eVm!gQEGBngoi{w}$;MiHh4UIdn0f4K0G!!*LPvqh50@0zch4eMO6lOD z%D^$&l2%5pU%n@0Fn0tO=&q!B+kU@A0`T$FpOcB({%G1dvNX&JUz*8?@6&uI+J8j+r`9*a^1?tSZuHAu+)0rn^h!Ay)FH zrG8lyJ}SO%1Dh}`xad*pJUUhg1|d)yZsZRu>lHY_u4uhwog{1MNjh=R{r4Re#nKPz zIgsjMYzeZj?)t=znz*nMtA1&5Z2tqXGTXICXs{Kpr>81G^hX{H;1itv)-#PEUL;X% zf!Y8-tr4vN2B6hw#XV&@2kGl!%KIFN|6S7fE`Xkess>4xS~GBNAl{s@7w#AcX8j%C zwAKgxx-q z>fZ^QVMDk5qNLLzKAu+kJFE}a4p~DHf^oF5ZtA&_b+yVmkIA`e;$HKf{wrlfD@7@* zGzy-x=zjI4*He@JFe5ebLfUO^&GM7eP7gCEu4gP&v5|=bVkrOmmK)strROxwSz7BskeK}=6^qm4y5IQLbgDJKy|tr9H_u(&>+?PT-Rmf_cl zJ4#YDUdRp#%l&yE^Xng%ZTC$pI7$s7n_Je)(K{-e!edLW`fSBx#EV{GWE;$CuBGL9 z_Kb=8Kq->+h@y$QsXn9Jd;ZraRG5N1Aq!+kMdCy;dt4LtPRP9#>NC9b+*NNmlDacF zM&WX}aE_HIn4G%DtYuGQMGzyX07rs}79E6-rKFfvu|-P`R)hgw?B2x4;qh_vc^0Y| z_G4Q`lxm`6Sz^tN-~-=RQBoWNg56$6d4adh1E+QCkJ>U;o09g9f3mwING0fe^3VX!Q1H7d8(oD!tnP zctTlFSJNBv5`UgVO4A=D9p#rbsZM%5-IS6k_xv!Ad@Jqrjb-FYr~g$O)^E!ov*kA7 zN|Wyym(8%4r_h3?CW>P6>+9>R7Bdm=Vv1+Qp=9D32UVpvHM1e0#(f9M%*zt&R?^cZ z2i?Wc!7jsV;*sOb{VYn7KjQ*rvgy5-LBXX7|EQ&OR5>^}%gQQG7_8h~EteG$UgU>H zY+b}q+DFCjB`;UQ>y&2Hc4KLK%wDG}8Huss;_JQEw_(A}QK^@t-SxkgU+N@Ef|_B4 z^5>sJAV@lo&)oBKZ54<6)}GY)KY6QcbEl7fCe?fuDck><^(ETvjJ98(N|<|`d-|}# z60zd{t@)+Yv+XbO`*Bi#X-_+NgJ7hp7I1}X%SF#5Cp*L@4G?suei%!Kcw=f0cf0S8 zybL)KHNZCz)IDAFzw9pja>@D_k9O}$x1}cL#^2+ds6t8&B)Kv-(eC!bcW=5V1Ho8# z9Q&=VT7FGQ4Ck;7!Hbx_H=sl%X$*?$OGoWL+-QY6=9Hqaw!70j^=;}LzLpa3po^I6 zU%r^cYw-4-ea#wXg`Txz^ONHNy9y=`cUFzbpZV&z!K8$tNt4L|O`9XH1qQJ5)_Cr& zt#v(vOs!Z8cFYHC^YZ&PiEka(Q(FEJetES?K~ZVYl<=yl>F?d{VkV5vy`DIGr(a#k z*~h4E;c`t;>Dh0%4s|de!{vFS=zF0nkigbfj)hjA$zRlHMF1!KTd&4|OV#;uK5M@B zId_zSoht)joH;eT*Bm1l_(X=>3Zq2o`2x@zzB~EG*~yE>CS%#0(;N_W9umRxFDGtb zIVL$_0-F0n`n^p<%krYNwTRGn1J}de(_`Xf*>C~>YS`g%>PLs$1pVvzJ4^WQXvg=i z#`~1kHx?h*aG=zo^A^yLu=4spuwgM4uXB0$QDQX#S)I9kzKh ztiH4!J_Yuq4EI;|itnV}YNxO&2^+J8(GXf<_2IHS(V7@Ji?)Q^*4gTKE8lvK%5sLe z#0H%)(Wx{a9WljcED4kiB^n!7Jz!d)UlB)M$k;YrW9n5ISF7xT0dk zhiqIPO9GgU7qbOl&2oI0H^Z${I75wI{&wAsDcOlIV&=vfo&9EMrHS!(%ubepM1i45 zQ5m!R^^bA_=_-%H?qv>(eBVeBx^S;QNB)4BSjWwEK~y2Tf9xi0h4Gt(;AIzK_Qn2s z6RuKvLS4MqFI}P0#4jJoK3lh~y22gwR=V9_VtIeSYniPg!3hwSR^?7)?u$-uhsB|c zQ}OjHo<|RP2nYP3P$hsP+dj?}9f#Noo;m91d#a=%p+}7` z_o^OFg2nxnfxDHtyS0R+tMvl`0(|_!-2D99`~q+I1tj>zCHVL_`S>637DvMJ{}>#d zte_vf|9?ZIQ3&F}K=WS*U8fK3p60IBfTyP?5A>tGo29w4HII|4P3Dml?L!fu@=8Oo ITEQ&jfA#C{^Z)<= literal 0 HcmV?d00001 diff --git a/tests/integration/data/downloads/mhtml/complex/requests b/tests/integration/data/downloads/mhtml/complex/requests new file mode 100644 index 000000000..97dab9e23 --- /dev/null +++ b/tests/integration/data/downloads/mhtml/complex/requests @@ -0,0 +1,19 @@ +background.png +background.png +base.css +base.css +complex.html +# There are no divs, so this image is only loaded when saving as mhtml +div-image.png +extern-css.css +extern-css.css +external-in-external.css +external-in-external.css +favicon.ico +favicon.ico +image.gif +image.gif +inline.png +inline.png +script.js +script.js diff --git a/tests/integration/data/downloads/mhtml/complex/script.js b/tests/integration/data/downloads/mhtml/complex/script.js new file mode 100644 index 000000000..85f18a0f4 --- /dev/null +++ b/tests/integration/data/downloads/mhtml/complex/script.js @@ -0,0 +1 @@ +document.write("The story so far: In the beginning the Universe was created. This has made a lot of people very angry and has been widely regarded as a bad move. - Douglas Adams
") From 354259777adf9d8c233a51a67313759d51dbefce Mon Sep 17 00:00:00 2001 From: Daniel Schadt Date: Thu, 12 Nov 2015 21:07:14 +0100 Subject: [PATCH 076/104] mhtml: don't test with dynamically modified page --- .../data/downloads/mhtml/complex/complex.mht | 38 ++++++++----------- .../data/downloads/mhtml/complex/script.js | 3 +- 2 files changed, 18 insertions(+), 23 deletions(-) diff --git a/tests/integration/data/downloads/mhtml/complex/complex.mht b/tests/integration/data/downloads/mhtml/complex/complex.mht index 1063ff229..5defe64ef 100644 --- a/tests/integration/data/downloads/mhtml/complex/complex.mht +++ b/tests/integration/data/downloads/mhtml/complex/complex.mht @@ -1,7 +1,7 @@ -Content-Type: multipart/related; boundary="---=_qute-510287e3-01a6-4b99-8ec9-d0f703c87fef" +Content-Type: multipart/related; boundary="---=_qute-e6103319-e76c-4b6a-bcae-c568a6307a42" MIME-Version: 1.0 ------=_qute-510287e3-01a6-4b99-8ec9-d0f703c87fef +-----=_qute-e6103319-e76c-4b6a-bcae-c568a6307a42 Content-Location: http://localhost:1234/data/downloads/mhtml/complex/complex.html MIME-Version: 1.0 Content-Type: text/html; charset="UTF-8" @@ -33,17 +33,14 @@ body=20{ =20=20=20=20=20=20=20=20 =20=20=20=20=20=20=20=20 =20=20=20=20=20=20=20=20The=20story=20so=20far:=20In=20the=20beginning=20= -the=20Universe=20was=20created.=20This=20has=20made=20a=20lot=20of=20people= -=20very=20angry=20and=20has=20been=20widely=20regarded=20as=20a=20bad=20mov= -e.=20-=20Douglas=20Adams
+js"> =20=20=20=20=20=20=20=20 =20=20=20=20=20=20=20=20 -=20=20=20=20 -=20=20=20=20 +=20=20=20=20 +=20=20=20=20 =20=20=20=20=20=20=20=20 =20=20=20=20=20=20=20=20 =20=20=20=20=20=20=20=20 =20=20=20=20 ------=_qute-510287e3-01a6-4b99-8ec9-d0f703c87fef +-----=_qute-e6103319-e76c-4b6a-bcae-c568a6307a42 Content-Location: http://localhost:1234/data/downloads/mhtml/complex/background.png MIME-Version: 1.0 Content-Type: image/png @@ -146,7 +143,7 @@ YZ94xJLOaok75NKBIQU+U2KZEsvoI8N2NbajeKsqheMOXh7iCiEOa8N4XaTUhuYfFXm7UTEBXBIC BuP2n3WVJR33K1qrcikplMLNFeiIFPil1IbQCENK1WvTc7A6dVAI0aChTgpZlUi5mzr/vTj9za0p 4n8BgjXlKCMEM1EAAAAASUVORK5CYII= ------=_qute-510287e3-01a6-4b99-8ec9-d0f703c87fef +-----=_qute-e6103319-e76c-4b6a-bcae-c568a6307a42 Content-Location: http://localhost:1234/data/downloads/mhtml/complex/base.css MIME-Version: 1.0 Content-Type: text/css; charset=utf-8 @@ -156,7 +153,7 @@ div.fancy=20{ =20=20=20=20background-color:=20url("div-image.png"); } ------=_qute-510287e3-01a6-4b99-8ec9-d0f703c87fef +-----=_qute-e6103319-e76c-4b6a-bcae-c568a6307a42 Content-Location: http://localhost:1234/data/downloads/mhtml/complex/div-image.png MIME-Version: 1.0 Content-Type: image/png @@ -245,7 +242,7 @@ dGUAMjAxNS0xMS0xMlQxMjoxOTowMCswMTowMPsHOmMAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMTUt MTEtMTJUMTI6MTk6MDArMDE6MDCKWoLfAAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jn m+48GgAAAABJRU5ErkJggg== ------=_qute-510287e3-01a6-4b99-8ec9-d0f703c87fef +-----=_qute-e6103319-e76c-4b6a-bcae-c568a6307a42 Content-Location: http://localhost:1234/data/downloads/mhtml/complex/extern-css.css MIME-Version: 1.0 Content-Type: text/css; charset=utf-8 @@ -256,7 +253,7 @@ p=20{ =20=20=20=20font-family:=20"Monospace"; } ------=_qute-510287e3-01a6-4b99-8ec9-d0f703c87fef +-----=_qute-e6103319-e76c-4b6a-bcae-c568a6307a42 Content-Location: http://localhost:1234/data/downloads/mhtml/complex/external-in-external.css MIME-Version: 1.0 Content-Type: text/css; charset=utf-8 @@ -266,7 +263,7 @@ img=20{ =20=20=20=20width:=20100%; } ------=_qute-510287e3-01a6-4b99-8ec9-d0f703c87fef +-----=_qute-e6103319-e76c-4b6a-bcae-c568a6307a42 Content-Location: http://localhost:1234/data/downloads/mhtml/complex/favicon.ico MIME-Version: 1.0 Content-Type: image/x-icon @@ -571,7 +568,7 @@ AAAAAAAAB+AAAAAAAAAH8AAAAAAAAA/wAAAAAAAAD/gAAAAAAAAf/AAAAAAAAD/+AAAAAAAAf/4A AAAAAAD//wAAAAAAAP//gAAAAAAB///AAAAAAAf///AAAAAAD///+AAAAAAf///8AAAAAH////8A AAAA/////8AAAAP/////+AAAH///////AAD///8= ------=_qute-510287e3-01a6-4b99-8ec9-d0f703c87fef +-----=_qute-e6103319-e76c-4b6a-bcae-c568a6307a42 Content-Location: http://localhost:1234/data/downloads/mhtml/complex/image.gif MIME-Version: 1.0 Content-Type: image/gif @@ -692,7 +689,7 @@ Sn3aREkRHjZVrlyp0WAAw6BlzZ4VWmBBhxtAnpxRYyfPIEh1NWmixOjMmSty8GChIqMBWbSFDR+W SMAABBM8mDipQiaNnD2V7dhhQ+YIDhBiCSNABh26cIAABh5k+KBjSBIjSowMkZFhQYHPom3fPsuQ 9O7auH3/Bh5c+HDixY0fR55c+XLmzZ0/hx5d+nTq1R0GBAA7 ------=_qute-510287e3-01a6-4b99-8ec9-d0f703c87fef +-----=_qute-e6103319-e76c-4b6a-bcae-c568a6307a42 Content-Location: http://localhost:1234/data/downloads/mhtml/complex/inline.png MIME-Version: 1.0 Content-Type: image/png @@ -781,15 +778,12 @@ ZWF0ZQAyMDE1LTExLTEyVDEyOjE5OjAwKzAxOjAw+wc6YwAAACV0RVh0ZGF0ZTptb2RpZnkAMjAx NS0xMS0xMlQxMjoxOTowMCswMTowMIpagt8AAAAZdEVYdFNvZnR3YXJlAHd3dy5pbmtzY2FwZS5v cmeb7jwaAAAAAElFTkSuQmCC ------=_qute-510287e3-01a6-4b99-8ec9-d0f703c87fef +-----=_qute-e6103319-e76c-4b6a-bcae-c568a6307a42 Content-Location: http://localhost:1234/data/downloads/mhtml/complex/script.js MIME-Version: 1.0 Content-Type: application/javascript Content-Transfer-Encoding: base64 -ZG9jdW1lbnQud3JpdGUoIlRoZSBzdG9yeSBzbyBmYXI6IEluIHRoZSBiZWdpbm5pbmcgdGhlIFVu -aXZlcnNlIHdhcyBjcmVhdGVkLiBUaGlzIGhhcyBtYWRlIGEgbG90IG9mIHBlb3BsZSB2ZXJ5IGFu -Z3J5IGFuZCBoYXMgYmVlbiB3aWRlbHkgcmVnYXJkZWQgYXMgYSBiYWQgbW92ZS4gLSBEb3VnbGFz -IEFkYW1zPGJyPiIpCg== +ZnVuY3Rpb24gbm9vcCgpIHt9Cm5vb3AoKTsK ------=_qute-510287e3-01a6-4b99-8ec9-d0f703c87fef-- +-----=_qute-e6103319-e76c-4b6a-bcae-c568a6307a42-- diff --git a/tests/integration/data/downloads/mhtml/complex/script.js b/tests/integration/data/downloads/mhtml/complex/script.js index 85f18a0f4..15103db67 100644 --- a/tests/integration/data/downloads/mhtml/complex/script.js +++ b/tests/integration/data/downloads/mhtml/complex/script.js @@ -1 +1,2 @@ -document.write("The story so far: In the beginning the Universe was created. This has made a lot of people very angry and has been widely regarded as a bad move. - Douglas Adams
") +function noop() {} +noop(); From 4210d7e15d9d250e831cef7470281de879ecd707 Mon Sep 17 00:00:00 2001 From: Daniel Schadt Date: Thu, 12 Nov 2015 21:58:33 +0100 Subject: [PATCH 077/104] mhtml: use png instead of ico for test Seems like httpbin sends a different MIME-type on travis than on my laptop, something 'clear' like image/png should fix this. --- .../data/downloads/mhtml/complex/complex.html | 2 +- .../data/downloads/mhtml/complex/complex.mht | 409 ++++-------------- .../data/downloads/mhtml/complex/favicon.ico | Bin 16958 -> 0 bytes .../data/downloads/mhtml/complex/favicon.png | Bin 0 -> 4564 bytes .../data/downloads/mhtml/complex/requests | 4 +- 5 files changed, 99 insertions(+), 316 deletions(-) delete mode 100644 tests/integration/data/downloads/mhtml/complex/favicon.ico create mode 100644 tests/integration/data/downloads/mhtml/complex/favicon.png diff --git a/tests/integration/data/downloads/mhtml/complex/complex.html b/tests/integration/data/downloads/mhtml/complex/complex.html index ef886f66c..9249a9d6b 100644 --- a/tests/integration/data/downloads/mhtml/complex/complex.html +++ b/tests/integration/data/downloads/mhtml/complex/complex.html @@ -17,7 +17,7 @@ body { @import "actually-it's-css"; - + diff --git a/tests/integration/data/downloads/mhtml/complex/complex.mht b/tests/integration/data/downloads/mhtml/complex/complex.mht index 5defe64ef..eba652818 100644 --- a/tests/integration/data/downloads/mhtml/complex/complex.mht +++ b/tests/integration/data/downloads/mhtml/complex/complex.mht @@ -1,7 +1,7 @@ -Content-Type: multipart/related; boundary="---=_qute-e6103319-e76c-4b6a-bcae-c568a6307a42" +Content-Type: multipart/related; boundary="---=_qute-986aec6d-ef0d-4d36-8a81-0b9c0f826384" MIME-Version: 1.0 ------=_qute-e6103319-e76c-4b6a-bcae-c568a6307a42 +-----=_qute-986aec6d-ef0d-4d36-8a81-0b9c0f826384 Content-Location: http://localhost:1234/data/downloads/mhtml/complex/complex.html MIME-Version: 1.0 Content-Type: text/html; charset="UTF-8" @@ -27,7 +27,7 @@ body=20{ @import=20"actually-it's-css"; =20=20=20=20=20=20=20=20 =20=20=20=20=20=20=20=20 -=20=20=20=20=20=20=20=20 +=20=20=20=20=20=20=20=20 =20=20=20=20=20=20=20=20 =20=20=20=20=20=20=20=20 @@ -56,7 +56,7 @@ requested=20once=20--> =20=20=20=20 ------=_qute-e6103319-e76c-4b6a-bcae-c568a6307a42 +-----=_qute-986aec6d-ef0d-4d36-8a81-0b9c0f826384 Content-Location: http://localhost:1234/data/downloads/mhtml/complex/background.png MIME-Version: 1.0 Content-Type: image/png @@ -143,7 +143,7 @@ YZ94xJLOaok75NKBIQU+U2KZEsvoI8N2NbajeKsqheMOXh7iCiEOa8N4XaTUhuYfFXm7UTEBXBIC BuP2n3WVJR33K1qrcikplMLNFeiIFPil1IbQCENK1WvTc7A6dVAI0aChTgpZlUi5mzr/vTj9za0p 4n8BgjXlKCMEM1EAAAAASUVORK5CYII= ------=_qute-e6103319-e76c-4b6a-bcae-c568a6307a42 +-----=_qute-986aec6d-ef0d-4d36-8a81-0b9c0f826384 Content-Location: http://localhost:1234/data/downloads/mhtml/complex/base.css MIME-Version: 1.0 Content-Type: text/css; charset=utf-8 @@ -153,7 +153,7 @@ div.fancy=20{ =20=20=20=20background-color:=20url("div-image.png"); } ------=_qute-e6103319-e76c-4b6a-bcae-c568a6307a42 +-----=_qute-986aec6d-ef0d-4d36-8a81-0b9c0f826384 Content-Location: http://localhost:1234/data/downloads/mhtml/complex/div-image.png MIME-Version: 1.0 Content-Type: image/png @@ -242,7 +242,7 @@ dGUAMjAxNS0xMS0xMlQxMjoxOTowMCswMTowMPsHOmMAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMTUt MTEtMTJUMTI6MTk6MDArMDE6MDCKWoLfAAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jn m+48GgAAAABJRU5ErkJggg== ------=_qute-e6103319-e76c-4b6a-bcae-c568a6307a42 +-----=_qute-986aec6d-ef0d-4d36-8a81-0b9c0f826384 Content-Location: http://localhost:1234/data/downloads/mhtml/complex/extern-css.css MIME-Version: 1.0 Content-Type: text/css; charset=utf-8 @@ -253,7 +253,7 @@ p=20{ =20=20=20=20font-family:=20"Monospace"; } ------=_qute-e6103319-e76c-4b6a-bcae-c568a6307a42 +-----=_qute-986aec6d-ef0d-4d36-8a81-0b9c0f826384 Content-Location: http://localhost:1234/data/downloads/mhtml/complex/external-in-external.css MIME-Version: 1.0 Content-Type: text/css; charset=utf-8 @@ -263,312 +263,95 @@ img=20{ =20=20=20=20width:=20100%; } ------=_qute-e6103319-e76c-4b6a-bcae-c568a6307a42 -Content-Location: http://localhost:1234/data/downloads/mhtml/complex/favicon.ico +-----=_qute-986aec6d-ef0d-4d36-8a81-0b9c0f826384 +Content-Location: http://localhost:1234/data/downloads/mhtml/complex/favicon.png MIME-Version: 1.0 -Content-Type: image/x-icon +Content-Type: image/png Content-Transfer-Encoding: base64 -AAABAAEAQEAAAAEAIAAoQgAAFgAAACgAAABAAAAAgAAAAAEAIAAAAAAAAEAAAIEXAACBFwAAAAAA -AAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A -////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wDxmEwl7pRFlOyTRLvs -lUbU6ZZI5+iWSfTol0v755lN/ueYTv/pmlH96ZVG8eN1FL/kdhWn5HYUjeZ3FmfjcQ4S////AP// -/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A//// -AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A -////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD/ -//8A7JA8N+2WR7TpmEzy5phO/+aYTv/mmE7/5phO/+eaUf/pnlf/66Jc/+ylYf/spWH/66Jc/+me -V//jeBf/4nUT/+J1E//idRP/4nQT/ON1FM/meBOE5HIUJv///wD///8A////AP///wD///8A//// -AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A -////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD/ -//8A////AP///wD///8A////AOyhTBvpk0O96JZJ9uaYTv/mmU//6J5W/+6pZv/ztHX/9rl8//e9 -gf/4voP/+L6D//i+g//4voP/+L6D//i+g//4voL/8X8Z//B/Gf/vfhj/7XwX/+l6Fv/kdxT/4nUT -/+J1E//jdhTe5XYTkduAEg7///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A -////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD/ -//8A////AP///wD///8A////AP///wD///8A////AP///wD///8A1YAABuZ4FILkgSb055lQ/+uh -W//wrWz/9rh8//m/hf/5v4X/+b+F//m/hf/5v4X/+b+F//m/hf/5v4X/+b+F//m/hf/5v4X/+b+F -//WdS//xgBn/8YAZ//GAGf/xgBn/8YAZ/+5+GP/qexb/5XgV/+J2E//idhTw5ngUgtWAAAb///8A -////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD/ -//8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// -/wD///8A53gWauN3FOfjdxP/6osy//a6f//5wIf/+cCH//nAh//5wIf/+cCH//nAh//5wIf/+cCH -//nAh//5wIf/+cCH//nAh//5wIf/+cCH//nAh//5wIf/97Ju//SSN//yhB7/8oEZ//KBGf/ygRn/ -8oEZ//KBGf/wfxj/6HoV/+N3E//jdxTn53gWav///wD///8A////AP///wD///8A////AP///wD/ -//8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// -/wD///8A////AP///wD///8A////AP///wDmdRQy5HcU2uN3FP/nehX/74AZ//WcSf/5wYn/+cGJ -//nBif/5wYn/+cGJ//nBif/5wYn/+cGJ//nBif/5wYn/+cGJ//nBif/5wYn/+cGJ//nBif/5wYn/ -+cGJ//nBif/5wYn/+cGJ//amWv/yghr/8oIa//KCGv/yghr/8oIa//KCGv/vgBn/53oV/+N3FP/k -dxTa5nUUMv///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// -/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wDoehda43gU -9eZ6Ff/ugBj/8oMa//KDGv/1n0z/+cKK//nCiv/5wor/+cKK//nCiv/5wor/+cKK//nCiv/5wor/ -+cKK//nCiv/5wor/+cKK//nCiv/5wor/+cKK//nCiv/5wor/+cKK//nCiv/5wor/85Ax//KDGv/y -gxr/8oMa//KDGv/ygxr/8oMa//KDGv/ugBj/5noV/+N4FPXoehda////AP///wD///8A////AP// -/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A//// -AP///wD///8A////AP///wDnehWI43gU/el9F//yhBr/8oQa//KEGv/yhBr/9qxi//nDjP/5w4z/ -+cOM//nDjP/5w4z/+cOM//nDjP/5w4z/+cOM//nDjP/5w4z/+cOM//nDjP/5w4z/+cOM//nDjP/5 -w4z/+cOM//nDjP/5w4z/+cOM//evaf/yhBr/8oQa//KEGv/yhBr/8oQa//KEGv/yhBr/8oQa//KE -Gv/pfRf/43gU/ed6FYj///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A//// -AP///wD///8A////AP///wD///8A////AP///wD///8A////AP+SJAfkehW243kU/+yAGP/yhRr/ -8oUa//KFGv/yhRr/840p//i+hP/5xI7/+cSO//nEjv/5xI7/+cSO//nEjv/5xI7/+cSO//nEjv/5 -xI7/+cSO//nEjv/5xI7/+cSO//nEjv/5xI7/+cSO//nEjv/1wIr/6rWA/+KteP/ssHT/8YUa//KF -Gv/yhRr/8oUa//KFGv/yhRr/8oUa//KFGv/yhRr/8oUa/+yAGP/jeRT/5HoVtv+SJAf///8A//// -AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A -////AP+SJAfjexXS5HsV/++DGf/yhhr/8oYa//KGGv/yhhv/9JpA//jAh//5xZD/+cWQ//nFkP/5 -xZD/+cWQ//nFkP/5xZD/+cWQ//nFkP/5xZD/+cWQ//nFkP/5xZD/+cWQ//nFkP/5xZD/4Kx4/6Nu -Pf91QBD/bjkK/245Cv9uOQr/bjkK/3E7C/99Qgz/ikoN/5hRD/+xYBL/2ngX//KGGv/yhhr/8oYa -//KGGv/yhhr/74MZ/+R7Ff/jexXS/5IkB////wD///8A////AP///wD///8A////AP///wD///8A -////AP///wD///8A////AP///wD///8A////AP///wDkexW25n0V//GGGf/yhxr/8oca//KHGv/0 -mTv/+LyA//nGkv/5xpL/+caS//nGkv/5xpL/+caS/9Ogbf/Wo3D/9sOP//nGkv/5xpL/+caS//nG -kv/5xpL/+caS//nGkv/5xpL/rHdG/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK -/245Cv9uOQr/bjkK/245Cv9+Qgz/ploR/9l4F//yhxr/8oca//KHGv/xhhn/5n0V/+R7Fbb///8A -////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wDn -fhWI5XwV//KHGv/ziBr/84ga//OIGv/1nUH/+caS//nHk//5x5P/+ceT//nHk//5x5P/+ceT//nH -k/+rd0b/bjkK/3ZBEv+caDf/xJFf/+y6hv/5x5P/+ceT//nHk//5x5P/y5hm/245Cv9uOQr/bjkK -/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9vOQr/ -nVUQ/+J+GP/ziBr/84ga//KHGv/lfBX/534ViP///wD///8A////AP///wD///8A////AP///wD/ -//8A////AP///wD///8A////AP///wDogBda5XwU/fGHGf/ziRr/84ka//OJGv/zihz/+L6C//nI -lf/5yJX/+ciV//nIlf/5yJX/+ciV//nIlf/5yJX/q3dH/245Cv9uOQr/bjkK/245Cv9vOgv/ilYm -/7J/Tv/bqXf/+ciV/5VhMf9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/ -bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9xOwr/q14R//GIGv/ziRr/8YcZ/+V8FP3o -gBda////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wDmehQy5HwU9e+G -GP/zihr/84oa//OKGv/zihr/96pa//rJl//6yZf/+smX//rJl//6yZf/+smX//rJl//6yZf/+smX -/6t4R/9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK//bEk/+MWCj/bjkK/245Cv9uOQr/ -bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9u -OQr/bjkK/245Cv+PTQ7/6IMZ//OKGv/vhhj/5HwU9eZ6FDL///8A////AP///wD///8A////AP// -/wD///8A////AP///wD///8A5X0V2u2FGP/zixv/84sb//OLG//zixv/9JMq//rIlf/6ypn/+sqZ -//rKmf/6ypn/+sqZ//rKmf/6ypn/+sqZ//rKmf+reEj/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/ -bjkK/245Cv/2xZX/jFgp/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9u -OQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/35DDP/ffhj/84sb/+2F -GP/lfRXa////AP///wD///8A////AP///wD///8A////AP///wD///8A54AWaumCF//zjBv/84wb -//OMG//zjBv/84wb//i1bv/6y5r/+sua//rLmv/6y5r/+sua//rLmv/6y5r/+sua//rLmv/6y5r/ -q3lJ/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/9saV/4xYKf9uOQr/bjkK/245Cv9u -OQr/cDsM/4dTI/+kckL/vYtb/7qIWP+reUn/iE8a/285Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245 -Cv9uOQr/bjkK/245Cv9uOQr/hEcN/+6JGv/zjBv/6YIX/+eAFmr///8A////AP///wD///8A//// -AP///wD///8A1YAABuR+Febxixr/840b//ONG//zjRv/840b//WdO//6zJv/+syc//rMnP/6zJz/ -+syc//rMnP/6zJz/+syc//rMnP/6zJz/+syc/6t5Sv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9u -OQr/bjkK//bHl/+MWSn/bjkK/245Cv9vOgv/r31O//TGlv/6zJz/+syc//rMnP/6zJz/+syc//nD -iv/afRj/kE8O/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv+gWBD/840b -//GLGv/kfhXm1YAABv///wD///8A////AP///wD///8A////AOaBFoLrhhj/844b//OOG//zjhv/ -844b//SXL//5xo//+s2e//rNnv/6zZ7/+s2e//rNnv/6zZ7/+s2e//rNnv/6zZ7/+s2e//rNnv+r -eUr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv/2yJn/jFkq/245Cv9uOQr/xJRl//rN -nv/6zZ7/+s2e//rNnv/6zZ7/+s2e//rNnv/4vn7/844b//OOG//DbxX/dT4L/245Cv9uOQr/bjkK -/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/812Fv/zjhv/64YY/+aBFoL///8A////AP///wD///8A -////AO2SEg7lgRXv844b//SPG//0jxv/9I8b//SPG//4vHr/+s6g//rOoP/6zqD/+s6g//rOoP/6 -zqD/+s6g//rOoP/6zqD/+s6g//rOoP/6zqD/q3pL/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245 -Cv9uOQr/9smb/4xZKv9uOQr/ekYX//jMnv/6zqD/+s6g//rOoP/6zqD/+s6g//rOoP/5v4D/9qFA -//SPG//0jxv/9I8b/+GDGf97QQz/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv+MTA7/ -9I8b//OOG//lgRXv7ZISDv///wD///8A////AP///wDmghWR7ooZ//SQG//0kBv/9JAb//SQG//0 -kBv/+Ldv//rPov/6z6L/+s+i//rPov/6z6L/+s+i//rPov/6z6L/+s+i//rPov/6z6L/+s+i/6t6 -TP9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK//bKnf+MWSv/bjkK/4NQIf/6z6L/+s+i -//rPov/6z6L/+s+i//rLmf/2pkv/9JAb//SQG//0kBv/9JAb//SQG//0kBv/2X8Y/3Q9C/9uOQr/ -bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/9J6F//0kBv/7ooZ/+aCFZH///8A////AP///wD/ -//8A6IQW2vSRG//0kRv/9JEb//SRG//0kRv/9JEb//ajQv/60KP/9cue/8qcbv+zhFb/nm0//5dl -N/+ndkj/todZ/8udb//zyZz/+tCj//rQo/+re03/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK -/245Cv/2y57/jFor/245Cv+DUCH/+tCj//nKl//4unP/965a//anS//0lSX/9JEb//SRG//0kRv/ -9JEb//SRG//0kRv/9JEb//SRG//Ndxb/bzkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv+g -WhD/9JEb//SRG//ohBba////AP///wD///8A5IAUJu2KGP/0khv/9JIb//SSG//0khv/9JIb//SS -G//1smX/wZRm/3xIGv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/cz8Q/6FwQv/swpb/q3tN -/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/9syg/4xaK/9uOQr/g1Ag//i8dv/1nzj/ -9JIb//SSG//0khv/9JIb//SSG//0khv/9JIb//SSG//0khv/9JIb//SSG//0khv/9JIb/5tXEP9u -OQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/eUAL//ORG//0khv/7YoY/+SAFCb///8A////AOaF -FYTykRr/9JMb//STG//0kxv/9JMb//STG//pjBr/hksS/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK -/245Cv9uOQr/bjkK/245Cv9uOQr/eUUW/4xaLP9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/ -bjkK//fNov+MWSn/bjkK/4JHDf/0kxv/9JMb//STG//0kxv/9JMb//STG//0kxv/9JMb//STG//0 -kxv/9JMb//STG//0kxv/9JMb//STG//Ufhf/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245 -Cv/XgBf/9JMb//KRGv/mhRWE////AP///wDpiBfI9JQc//SUHP/0lBz/9JQc//SUHP/sjhv/h0oN -/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/ -bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv/3zqT/jFMb/245Cv+CRw3/9JQc//SUHP/0 -lBz/9JQc//SUHP/0lBz/9JQc//SUHP/0lBz/9JQc//SUHP/0lBz/9JQc//SUHP/0lBz/8pMc/3c/ -C/9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/wXEV//SUHP/0lBz/6YgXyP///wDjjg4S7YwY -+vSVHP/0lRz/9JUc//SVHP/ukRv/i00O/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/ -bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9u -OQr/98uc/4tOEP9uOQr/gkcN//SVHP/0lRz/9JUc//SVHP/0lRz/9JUc//SVHP/0lRz/9JUc//SV -HP/0lRz/9JUc//SVHP/0lRz/9JUc//SVHP+eWhD/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK -/65lE//0lRz/9JUc/+2MGPrjjg4S6YYWZ/OTG//1lhz/9ZYc//WWHP/1lhz/lVQP/245Cv9uOQr/ -bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9u -OQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK//S0Z/+LTQ7/bjkK/4NHDf/1lhz/9ZYc//WW -HP/1lhz/9ZYc//WWHP/1lhz/9ZYc//WWHP/1lhz/9ZYc//WWHP/1lhz/9ZYc//WWHP/1lhz/u24U -/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv+cWBD/9ZYc//WWHP/zkxv/6YYWZ+2NGIL1lxz/ -9Zcc//WXHP/1lxz/zHoW/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9u -OQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245 -Cv/xlBz/kVEP/245Cv+DRw3/9Zcc//WXHP/1lxz/9Zcc//WXHP/1lxz/9Zcc//WXHP/1lxz/9Zcc -//WXHP/1lxz/9Zcc//WXHP/1lxz/9Zcc/8d3Fv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/ -ilMf//nEhf/4u3D/9qI2/+2NGILukBmX9Zgc//WYHP/1mBz/85cc/4JHDf9uOQr/bjkK/245Cv9u -OQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245 -Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/75Qb//CUG/+yaRP/iUwO//WYHP/1mBz/9Zgc -//WYHP/1mBz/9Zgc//WYHP/1mBz/9Zgc//WYHP/1mBz/9Zgc//WYHP/1mBz/9Zgc//WYHP/Gdxb/ -bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/4BNH//717D/+9ew//vXsP/0u3vW8JMZrfWZHP/1 -mRz/9Zkc/9aDGP9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9xPA3/r4NY/9y1 -jf/00ar/8Myl/8iedf98SRv/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK -/4RIDf/Pfhf/9Zkc/+6UG//1mRz/9Zkc//WZHP/1mRz/9Zkc//WZHP/1mRz/9Zkc//WZHP/1mRz/ -9Zkc//WZHP/1mRz/9Zkc//WZHP/1mRz/wHMV/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv+A -TR//+9iy//vYsv/72LL/9sSJ6vKUGsT1mhz/9Zoc//WaHP+waRP/bjkK/245Cv9uOQr/bjkK/245 -Cv9uOQr/bjkK/245Cv9xPQ3/3LaO//vZs//72LD/+9mz//vZs//72bP/9dKs/7GGW/9yPg//bjkK -/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/5ZWD//hjBn/9Zoc//WaHP/1mhz/ -9Zoc//WaHP/1mhz/9Zoc//WaHP/1mhz/9Zoc//WaHP/1mhz/9Zoc//WaHP/1mhz/9Zoc/7pwFP9u -OQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/iFYp//vZs//72bP/+9mz//fIkfTxlxvc9Zsc//Wb -HP/1mxz/i04O/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/s3Ag//vVq//72bX/+9ew -//vZtf/72bX/+cWE//i9cP/3r03/57Fv/5pgIv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/ -bjkK/245Cv9uOQr/cTsK/6tlEv/tlRv/9Zsc//WbHP/1mxz/9Zsc//WbHP/1mxz/9Zsc//WbHP/1 -mxz/9Zsc//WbHP/1mxz/9Zsc//WbHP+rcTD/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/5Zn -O//72bX/+9m1//vZtf/3zJv78Zkb9PWcHP/1nBz/9Jsc/3A6Cv9uOQr/bjkK/245Cv9uOQr/bjkK -/245Cv9uOQr/hUoN//KaHP/1nB3/96xE//i8a//3rET/961F//WcHP/1nBz/9Zwc//WcHP/1nBz/ -04MX/4ZLDf9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/ekIM/8B1Ff/0 -mxz/9Zwc//WcHP/1nBz/9Zwc//WcHP/1nBz/9Zwc//WcHP/1nBz/9Zwc//WcHP/3tVn/g1Ek/245 -Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv+kd0z/+9u3//vbt//727f/99Kn//WbHfP2nB3/9pwe -/+ygOv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/7FqE//2nB3/9pwd//acHf/2nB3/ -9pwd//acHf/2nB3/9pwd//acHf/2nB3/9pwd//acHf/0mx3/vnMV/3lBC/9uOQr/bjkK/245Cv9u -OQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/iEwO/9WEGP/2nB3/9pwd//acHf/2nB3/9pwd//ac -Hf/2nB3/9pwd//acHf/2nB7/5sGd/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/s4hf -//zbuf/827n//Nu5//rWr//2nR3Z+LJQ//zXr//lwZ7/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/ -bjkK/245Cv/Nfxf/9p0d//adHf/2nR3/9p0d//adHf/2nR3/9p0d//adHf/2nR3/9p0d//adHf/2 -nR3/9p0d//adHf/tlhz/qWUS/3A7Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245 -Cv9uOQr/m1oQ/+WRG//2nR3/9p0d//adHf/2nR3/9p0d//adHf/2nR3/96Uy/5hqP/9uOQr/bjkK -/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/86ngf/83Lv//Ny7//zcu//71q37+cN84fzcuv/83bz/ -2LSP/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/6ZQb//aeHf/2nh3/9p4d//aeHf/2 -nh3/9p4d//aeHf/2nh3/9p4d//aeHf/2nh3/9p4d//aeHf/2nh3/9p4d//KbHP/gjhr/lFUP/245 -Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9yPAv/sGoT//CaHP/2nh3/9p4d -//aeHf/2nh3/9p4d/8F2Fv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/286C//x0K7/ -/N28//zdvP/83bz/+9Sm9Pzbtff83r7//N6+/8ymgf9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9u -OQr/ekIM//afHf/2nx3/9p8d//afHf/2nx3/9p8d//afHf/2nx3/9p8d//afHf/2nx3/9p8d//af -Hf/2nx3/9p8d//afHf+OUQ7/wHYV//WeHf/NgRf/cTsK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK -/245Cv9uOQr/bjkK/245Cv98RAz/xXoW//WfHf/2nx3/6ZUb/5tbEP9uOQr/bjkK/245Cv9uOQr/ -bjkK/245Cv9uOQr/bjkK/245Cv+HVir//N6+//zevv/83r7//N6+//vToun5wne5+siD//vWqf/I -on7/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/39GDP/2oB3/9qAd//agHf/2oB3/9qAd//ag -Hf/2oB3/9qAd//agHf/2oB3/9qAd//agHf/2oB3/9qAd//agHf/2oB3/g0kN/245Cv+SVA//9qAd -/3Y/C/9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9zPQv/ -f0YM/3E7Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/upJr//zfwP/8 -38D//N/A//zfwP/70p/Z9qAdcfahHf/2pCT/3LF//245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245 -Cv93QAv/9qEd//ahHf/2oR3/9qEd//ahHf/2oR3/9qEd//ahHf/2oR3/9qEd//ahHf/2oR3/9qEd -//ahHf/2oR3/9qEd/4NJDf9uOQr/f0YM//ahHf92Pwv/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/ -bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9u -OQr/bjkK/245Cv9uOQr/fkse//favP/84ML//ODC//zgwv/84ML/+cyPuPWhHU/2oh3/9qId/+6i -Lf9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/+aWG//2oh3/9qId//aiHf/2oh3/9qId -//aiHf/2oh3/9qId//aiHf/2oh3/9qId//aiHf/2oh3/9qId//aiHf+DSQ3/bjkK/39GDP/2oh3/ -dj8L/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9u -OQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/8ahff/84cT//OHE//zh -xP/84cT//OHE//nEd37/nRQN96Md+fejHf/3ox3/f0YM/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK -/245Cv/Nghf/96Md//ejHf/3ox3/96Md//ejHf/3ox3/96Md//ejHf/3ox3/96Md//ejHf/3ox3/ -96Md//ejHf/3ox3/g0kN/245Cv9/Rgz/96Md/3Y/C/9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9u -OQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245 -Cv9uOQr/bjkK/4dWKv/74cT//OLF//zixf/84sX//OLF//zhw///v2oY////APekHbj3pB3/96Qd -/6ZlEv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/sW0T//ekHf/3pB3/96Qd//ekHf/3pB3/ -96Qd//ekHf/3pB3/96Qd//ekHf/3pB3/96Qd//ekHf/3pB3/96Qd/4NJDf9uOQr/f0YM//ekHf92 -Pwv/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245 -Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/3VBE//bu5v//OPH//zjx//848f//OPH -//zjx//72q7x////AP///wD4pR1p96Ue//elHv/PhRj/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/ -bjkK/39HDf/2pB7/96Ue//elHv/3pR7/96Ue//elHv/3pR7/96Ue//elHv/3pR7/96Ue//elHv/3 -pR7/96Ue//elHv+DSg3/bjkK/39GDP/3pR7/dj8L/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245 -Cv99RQz/qmgT/286Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK -/3xKHf/hw6T//OTJ//zkyf/85Mn//OTJ//zkyf/85Mn/+9Odu////wD///8A9qocG/emHv/3ph7/ -8qId/3dAC/9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/yoMX//emHv/3ph7/96Ye//emHv/3 -ph7/96Ye//emHv/3ph7/96Ye//emHv/3ph7/96Ye//emHv/3ph7/g0oN/245Cv9/Rgz/96Ye/3Y/ -C/9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/f0YM//emHv/glBv/mFsQ/245Cv9uOQr/bjkK -/245Cv9uOQr/bjkK/245Cv9uOQr/cDsM/5xwSP/s0bT//eXL//3ly//95cv//eXL//3ly//95cv/ -/eXL//vRk0L///8A////AP///wD4qB7M96ce//enHv+xbhT/bjkK/245Cv9uOQr/bjkK/245Cv9u -OQr/bjkK/3tEDP/tnx3/96ce//enHv/3px7/96ce//enHv/3px7/96ce//enHv/3px7/96ce//en -Hv/3px7/96ce/4NKDf9uOQr/f0YM//enHv92Pwv/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK -/39GDP/3px7/96ce//enHv/snhz/0YkZ/7dzFf+cXhH/lVgQ/55fEf+taxP/zoYY/++iIP/71Zz/ -/ebM//3mzP/95sz//ebM//3mzP/95sz//ebM//3br/T///8A////AP///wD///8A9qgfdfeoHv/4 -sjr/7KQo/3M9C/9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/llkQ//OlHf/3qB7/96ge//eo -Hv/3qB7/96ge//eoHv/3qB7/96ge//eoHv/3qB7/96ge//eoHv+CSg3/bjkK/39GDP/3qB7/dkAL -/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9/Rgz/96ge//eoHv/3qB7/96ge//eoHv/3qB7/ -96ge//eoHv/3qB7/96ge//eoHv/3qB7/96ge//nAYv/95sv//efO//3nzv/9587//efO//3nzv/7 -zYit////AP///wD///8A////AP/Ykxr947/8/ejQ//3lyP+rdjf/bjkK/245Cv9uOQr/bjkK/245 -Cv9uOQr/bjkK/245Cv+NUg//7KAc//epHv/3qR7/96ke//epHv/3qR7/96ke//epHv/3qR7/96ke -//epHv/Sixn/bzkK/245Cv9/Rwz/96ke/3ZAC/9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/ -f0cM//epHv/3qR7/96ke//epHv/3qR7/96ke//epHv/3qR7/96ke//epHv/3qR7/96ke//epHv/3 -qR7/+cBg//3o0P/96ND//ejQ//3o0P/95sn+/9WKGP///wD///8A////AP///wD///8A+9unvf3p -0v/96dL/9N7F/4BPI/9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/3pDDP+3dBX/76Md -//iqHv/4qh7/+Koe//iqHv/4qh7/+Koe//iqHv/PiBj/cz0L/245Cv9uOQr/f0cM//iqHv92QAv/ -bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/39HDP/4qh7/+Koe//iqHv/4qh7/+Koe//iqHv/4 -qh7/+Koe//iqHv/4qh7/+Koe//iqHv/4qh7/+Koe//itJv/96M7//enS//3p0v/96dL//Neesv// -/wD///8A////AP///wD///8A////AP/grRn958z9/erU//3q1P/exKj/cTwO/245Cv9uOQr/bjkK -/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/3U/C/+YXBD/q2sT/716Ff/PiRj/25Ma/7V0FP+HTg7/ -bjkK/245Cv9uOQr/bjkK/39HDP/4qx7/dkAL/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9/ -Rwz/+Kse//irHv/4qx7/+Kse//irHv/4qx7/+Kse//irHv/4qx7/+Kse//irHv/4qx7/+Kse//ir -Hv/4qx7/+sdu//3q1P/96tT//OTC+//bkg7///8A////AP///wD///8A////AP///wD///8A/Nyo -p/3r1f/969X//evV/72bef9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/ -bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9/Rwz/+Kwe/3ZAC/9u -OQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/f0cM//isHv/4rB7/+Kwe//isHv/4rB7/+Kwe//is -Hv/4rB7/+Kwe//isHv/4rB7/+Kwe//isHv/4rB7/+Kwe//isHv/6wFf//ebF//vVk5D///8A//// -AP///wD///8A////AP///wD///8A////AP/b2wf84rv1/ezX//3s1//869b/pH1Y/245Cv9uOQr/ -bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9u -OQr/bjkK/245Cv9uOQr/f0cM//itHv92QAv/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/39H -DP/4rR7/+K0e//itHv/4rR7/+K0e//itHv/4rR7/+K0e//itHv/4rR7/+K0e//itHv/4rR7/+K0e -//itHv/4rR7/+K0e//q/U9T///8B////AP///wD///8A////AP///wD///8A////AP///wD///8A -+9WKSP3r0/797dn//e3Z//3t2f+/n4D/cDwN/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9u -OQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/39HDf/4rh//dkAL/245 -Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9/Rw3/+K4f//iuH//4rh//+K4f//iuH//4rh//+K4f -//iuH//4rh//+K4f//iuH//4rh//+K4f//iuH//4rh//+K8j//m6RPH4sRwk////AP///wD///8A -////AP///wD///8A////AP///wD///8A////AP///wD93qmS/u7b//7u2//+7tv//u7b/9rBp/96 -SBv/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245 -Cv9uOQr/bjkK/245Cv9/Rw3/+K8f/3ZAC/9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/f0cN -//ivH//4rx//+K8f//ivH//4rx//+K8f//ivH//4rx//+K8f//ivH//4rx//+K8f//ivH//4rx// -+K8f//nBU/372JuE////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD/ -//8A////AP7juMr+793//u/d//7v3f/+793/7drE/6J7Vv9yPhD/bjkK/245Cv9uOQr/bjkK/245 -Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/gUoN//iwH/92QAv/bjkK -/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/39HDf/4sB//+LAf//iwH//4sB//+LAf//iwH//4sB// -+LAf//iwH//4sB//+LAf//iwH//4sB//+LAf//iwH//5vkl9////AP///wD///8A////AP///wD/ -//8A////AP///wD///8A////AP///wD///8A////AP///wD//78E/eS24f7w3v/+8N7//vDe//7w -3v/+8N7/8+LO/72dfv+DVCn/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9uOQr/bjkK -/245Cv9uOQr/cz4L/9eUGv/5sR//w4IX/4hPDv9uOQr/bjkK/245Cv9uOQr/bjkK/245Cv9/SA3/ -+bEf//mxH//5sR//+bEf//mxH//5sR//+bEf//mxH//5sR//+bEf//mxH//5sR//+bEf//mxH//4 -sh+b////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// -/wD///8A////AP/EnQ395Lvv/vDd//3fqv/+8eD//vDb//vRfv/83aP//fDd/9jBqP+tiWf/nXZQ -/49jO/+AUCX/cj0N/245Cv9uOQr/bjkK/3M+C/+KUg7/uHkV/+qlHf/5sh//+bIf//myH//5sh// -2ZYa/59kEf9xPAr/bjkK/245Cv9uOQr/f0gN//myH//5sh//+bIf//myH//5sh//+bIf//myH//5 -sh//+bIf//myH//5sh//+bIf//myH//6sh+8/5kzBf///wD///8A////AP///wD///8A////AP// -/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A/+SuE/3lu+L6v0P//eO1 -//7y4v/968z//ejD//7y4v/95Lf//eGt//7y4v/+8uL//vLi//7u1v/wuk7/4J0b/+ikHP/5wEn/ -+bMf//mzH//5sx//+bMf//mzH//5sx//+bMf//mzH//5sx//7agd/7d5Ff9/SA3/bjkK/39IDf/5 -sx//+bMf//mzH//5sx//+bMf//mzH//5sx//+bMf//mzH//5sx//+bMf//mzH//4sx+b/8wzBf// -/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A//// -AP///wD///8A////AP///wD///8D/N2dq/rCSv3+79j//eCp//m5MP/825r//vPk//7z5P/+8+T/ -/vPk//7z5P/+8+T//vPk//3ry//82I///efA//3ktv/70Xn/+r49//m0H//5tB//+bQf//m0H//5 -tB//+bQf//m0H//5tB//+LMf/8+PGf+laRL/+bQf//m0H//5tB//+bQf//m0H//5tB//+bQf//m0 -H//5tB//+bQf//m0H/z4tB5t////AP///wD///8A////AP///wD///8A////AP///wD///8A//// -AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD72JF2 -/eKt+v3tzv/82Y///eSz//705f/+9OX//vTl//705f/+9OX//vTl//705f/+9OX//vTl//705f/+ -9OT//NiN//vSev/6yFr/+bUf//m1H//5tR//+bUf//m1H//5tR//+bUf//m1H//5tR//+bUf//m1 -H//5tR//+bUf//m1H//5tR//+bUf//m1H//5tR//+bUf//m1H+74tB5E////AP///wD///8A//// -AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A -////AP///wD///8A////AP///wD///8A////APi4HCT81X7e/vXn//715//+9ef//vXn//715//+ -9ef//vXn//715//+9ef//vXn//715//+9ef//vPg//m6LP/5th//+bYf//m2H//6xEr/+81q//zY -jP/84KX/+bYf//m2H//5th//+bYf//m2H//5th//+bYf//m2H//5th//+bYf//m2H//5th//+bYf -//m2H8f4uBwk////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A -////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD/ -//8A////A/3ippX98NX7/vbp//726f/+9un//vbp//726f/+9un//vbp//726f/+9un//vbp//7w -1f/7z27/+boq//m6Kf/5tyD/+9V///726f/+9un//eSv//m3IP/5tyD/+bcg//m3IP/5tyD/+bcg -//m3IP/5tyD/+bcg//m3IP/5tyD/+bcg2Pm3H1L///8A////AP///wD///8A////AP///wD///8A -////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD/ -//8A////AP///wD///8A////AP///wD///8A////AP///wD///8A/+qqDPzhqKz+8979/vfr//73 -6//+9+v//vfr//736//+9+v//vfr//736//96sL//NV+//3ou//82Yv//NN4//vBPv/82Yv//evE -//q7Kv/6uCD/+rgg//q4IP/6uCD/+rgg//q4IP/6uCD/+rgg//q4IP/5uCDm+rcgZ/+/QAT///8A -////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD/ -//8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// -/wD///8A////AP///wD///8A/96bF/7hprX+8NT4//jt///47f//+O3///jt///47f//+O3///jt -///47f//+O3///jt///47f//+Ov//uWx///25//7w0D/+rkg//q5IP/6uSD/+rkg//q5IP/6uSD/ -+rkg//q5Icz7uSF1/7MaCv///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD/ -//8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// -/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A//// -APvjoj/+5Ker/uvB6//36P//+e7///nu///57v//+e7///nu///57v//+e7///nu///57v//+e7/ -/NmF//q6IP/6uiD/+rog//q6IPn5uiC4+rsgafa9HBv///8A////AP///wD///8A////AP///wD/ -//8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// -/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A//// -AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD/0XQW/d+Wgf7nrbX+57XO -/uu/4v7vyvD+89f6/vfo///46///9+X8/vTb9/vFQq/5ux+L+rsgcfm7IE//xCcN////AP///wD/ -//8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// -/wD///8A////AP///wD///8A////AP///wD///8A////AAD///////gAAB//////wAAAA/////8A -AAAA/////gAAAAB////4AAAAAB////AAAAAAD///4AAAAAAH//+AAAAAAAH//wAAAAAAAP//AAAA -AAAA//4AAAAAAAB//AAAAAAAAD/4AAAAAAAAH/gAAAAAAAAf8AAAAAAAAA/gAAAAAAAAB+AAAAAA -AAAHwAAAAAAAAAPAAAAAAAAAA8AAAAAAAAADgAAAAAAAAAGAAAAAAAAAAYAAAAAAAAABAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAACAAAAAAAAAAYAAAAAAAAABgAAAAAAAAAHAAAAAAAAAA8AAAAAAAAADwAAAAAAAAAPg -AAAAAAAAB+AAAAAAAAAH8AAAAAAAAA/wAAAAAAAAD/gAAAAAAAAf/AAAAAAAAD/+AAAAAAAAf/4A -AAAAAAD//wAAAAAAAP//gAAAAAAB///AAAAAAAf///AAAAAAD///+AAAAAAf///8AAAAAH////8A -AAAA/////8AAAAP/////+AAAH///////AAD///8= +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 +rkJggg== ------=_qute-e6103319-e76c-4b6a-bcae-c568a6307a42 +-----=_qute-986aec6d-ef0d-4d36-8a81-0b9c0f826384 Content-Location: http://localhost:1234/data/downloads/mhtml/complex/image.gif MIME-Version: 1.0 Content-Type: image/gif @@ -689,7 +472,7 @@ Sn3aREkRHjZVrlyp0WAAw6BlzZ4VWmBBhxtAnpxRYyfPIEh1NWmixOjMmSty8GChIqMBWbSFDR+W SMAABBM8mDipQiaNnD2V7dhhQ+YIDhBiCSNABh26cIAABh5k+KBjSBIjSowMkZFhQYHPom3fPsuQ 9O7auH3/Bh5c+HDixY0fR55c+XLmzZ0/hx5d+nTq1R0GBAA7 ------=_qute-e6103319-e76c-4b6a-bcae-c568a6307a42 +-----=_qute-986aec6d-ef0d-4d36-8a81-0b9c0f826384 Content-Location: http://localhost:1234/data/downloads/mhtml/complex/inline.png MIME-Version: 1.0 Content-Type: image/png @@ -778,7 +561,7 @@ ZWF0ZQAyMDE1LTExLTEyVDEyOjE5OjAwKzAxOjAw+wc6YwAAACV0RVh0ZGF0ZTptb2RpZnkAMjAx NS0xMS0xMlQxMjoxOTowMCswMTowMIpagt8AAAAZdEVYdFNvZnR3YXJlAHd3dy5pbmtzY2FwZS5v cmeb7jwaAAAAAElFTkSuQmCC ------=_qute-e6103319-e76c-4b6a-bcae-c568a6307a42 +-----=_qute-986aec6d-ef0d-4d36-8a81-0b9c0f826384 Content-Location: http://localhost:1234/data/downloads/mhtml/complex/script.js MIME-Version: 1.0 Content-Type: application/javascript @@ -786,4 +569,4 @@ Content-Transfer-Encoding: base64 ZnVuY3Rpb24gbm9vcCgpIHt9Cm5vb3AoKTsK ------=_qute-e6103319-e76c-4b6a-bcae-c568a6307a42-- +-----=_qute-986aec6d-ef0d-4d36-8a81-0b9c0f826384-- diff --git a/tests/integration/data/downloads/mhtml/complex/favicon.ico b/tests/integration/data/downloads/mhtml/complex/favicon.ico deleted file mode 100644 index 73e4f62da420680448ec62095065c960be5722bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16958 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 M#SD0vy@0>|7lpqHW&i*H diff --git a/tests/integration/data/downloads/mhtml/complex/favicon.png b/tests/integration/data/downloads/mhtml/complex/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..1f609565726af96b5dffe7bbc99297be4db6626a GIT binary patch literal 4564 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 Date: Wed, 18 Nov 2015 19:15:18 +0100 Subject: [PATCH 078/104] mhtml: remove non-existing ftp asset This could be the cause of failing tests, depending on the OS. --- tests/integration/data/downloads/mhtml/complex/complex.html | 2 -- tests/integration/data/downloads/mhtml/complex/complex.mht | 3 --- 2 files changed, 5 deletions(-) diff --git a/tests/integration/data/downloads/mhtml/complex/complex.html b/tests/integration/data/downloads/mhtml/complex/complex.html index 9249a9d6b..0a7e4c22c 100644 --- a/tests/integration/data/downloads/mhtml/complex/complex.html +++ b/tests/integration/data/downloads/mhtml/complex/complex.html @@ -30,8 +30,6 @@ var l = 1+1; - -

foobar

diff --git a/tests/integration/data/downloads/mhtml/complex/complex.mht b/tests/integration/data/downloads/mhtml/complex/complex.mht index eba652818..1bce2f10a 100644 --- a/tests/integration/data/downloads/mhtml/complex/complex.mht +++ b/tests/integration/data/downloads/mhtml/complex/complex.mht @@ -43,9 +43,6 @@ var=20l=20=3D=201+1; =20=20=20=20 =20=20=20=20=20=20=20=20 =20=20=20=20=20=20=20=20 -=20=20=20=20=20=20=20=20 -=20=20=20=20=20=20=20=20 =20=20=20=20=20=20=20=20 =20=20=20=20=20=20=20=20 Date: Wed, 18 Nov 2015 19:56:49 +0100 Subject: [PATCH 079/104] Fix mhtml tests --- tests/integration/test_mhtml_e2e.py | 5 ++++- tests/integration/webserver.py | 13 +++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/tests/integration/test_mhtml_e2e.py b/tests/integration/test_mhtml_e2e.py index fedf6bd69..4fa0654c6 100644 --- a/tests/integration/test_mhtml_e2e.py +++ b/tests/integration/test_mhtml_e2e.py @@ -97,7 +97,10 @@ def test_mhtml(test_name, download_dir, quteproc, httpbin): if line.startswith('#'): continue path = '/{}/{}'.format(test_path, line.strip()) - expected_requests.append(httpbin.Request('GET', path)) + expected_requests.append(httpbin.ExpectedRequest('GET', path)) actual_requests = httpbin.get_requests() + # Requests are unorderable, we need to convert to ExpectedRequests + actual_requests = map(httpbin.ExpectedRequest.from_request, + actual_requests) assert sorted(actual_requests) == sorted(expected_requests) diff --git a/tests/integration/webserver.py b/tests/integration/webserver.py index 5932e9042..fa8ba0a88 100644 --- a/tests/integration/webserver.py +++ b/tests/integration/webserver.py @@ -26,6 +26,7 @@ import re import sys import socket import os.path +import functools import pytest from PyQt5.QtCore import pyqtSignal @@ -89,6 +90,7 @@ class Request(testprocess.Line): return NotImplemented +@functools.total_ordering class ExpectedRequest: """Class to compare expected requests easily.""" @@ -97,6 +99,11 @@ class ExpectedRequest: self.verb = verb self.path = path + @classmethod + def from_request(cls, request): + """Create an ExpectedRequest from a Request.""" + return cls(request.verb, request.path) + def __eq__(self, other): if isinstance(other, (Request, ExpectedRequest)): return (self.verb == other.verb and @@ -104,6 +111,12 @@ class ExpectedRequest: else: return NotImplemented + def __lt__(self, other): + if isinstance(other, (Request, ExpectedRequest)): + return (self.verb, self.path) < (other.verb, other.path) + else: + return NotImplemented + class HTTPBin(testprocess.Process): From 452c6f5310b49e13839a26c1cdfb67579d57b7d5 Mon Sep 17 00:00:00 2001 From: Daniel Schadt Date: Thu, 19 Nov 2015 00:30:16 +0100 Subject: [PATCH 080/104] Add __str__ method to ExpectedRequest Better for reading test logs. --- tests/integration/webserver.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tests/integration/webserver.py b/tests/integration/webserver.py index fa8ba0a88..a27d7d185 100644 --- a/tests/integration/webserver.py +++ b/tests/integration/webserver.py @@ -117,6 +117,11 @@ class ExpectedRequest: else: return NotImplemented + def __str__(self): + return ''.format(self.verb, self.path) + + __repr__ = __str__ + class HTTPBin(testprocess.Process): From 3466ee03f60d1f949a9e40271854806987e6a260 Mon Sep 17 00:00:00 2001 From: Daniel Schadt Date: Fri, 20 Nov 2015 13:24:38 +0100 Subject: [PATCH 081/104] Change development server to cherrypy.wsgiserver The Flask/Werkzeug development servers had some issues which lead to failing tests (together with some Qt bugs). --- tests/integration/webserver_sub.py | 49 ++++++++++++++++++++++++++++-- tox.ini | 1 + 2 files changed, 48 insertions(+), 2 deletions(-) diff --git a/tests/integration/webserver_sub.py b/tests/integration/webserver_sub.py index b8d75b041..a39e079cc 100644 --- a/tests/integration/webserver_sub.py +++ b/tests/integration/webserver_sub.py @@ -24,12 +24,17 @@ This script gets called as a QProcess from integration/conftest.py. import sys import time -import os.path +import signal +import os +import threading +from datetime import datetime from httpbin.core import app from httpbin.structures import CaseInsensitiveDict +import cherrypy.wsgiserver import flask +server = None @app.route('/data/') def send_data(path): @@ -51,11 +56,51 @@ def redirect_later(): return flask.redirect('/') +@app.after_request +def log_request(response): + request = flask.request + template = '127.0.0.1 - - [{date}] "{verb} {path} {http}" {status} -' + print(template.format( + date=datetime.now().strftime('%d/%b/%Y %H:%M:%S'), + verb=request.method, + path=request.full_path if request.query_string else request.path, + http=request.environ['SERVER_PROTOCOL'], + status=response.status_code, + ), file=sys.stderr, flush=True) + return response + + +def ready_checker(server): + """Wait until the server is ready and display the ready message.""" + while not server.ready: + time.sleep(0.2) + print(' * Running on http://127.0.0.1:{}/ (Press CTRL+C to quit)' + .format(server.bind_addr[1]), file=sys.stderr, flush=True) + + +def shutdown(*args): + """Stop the server.""" + if server is None: + return + server.stop() + + def main(): + global server if hasattr(sys, 'frozen'): basedir = os.path.realpath(os.path.dirname(sys.executable)) app.template_folder = os.path.join(basedir, 'integration', 'templates') - app.run(port=int(sys.argv[1]), debug=True, use_reloader=False) + port = int(sys.argv[1]) + server = cherrypy.wsgiserver.CherryPyWSGIServer(('0.0.0.0', port), app) + + checker = threading.Thread(target=ready_checker, args=[server]) + checker.start() + signal.signal(signal.SIGTERM, shutdown) + + try: + server.start() + except KeyboardInterrupt: + shutdown() if __name__ == '__main__': diff --git a/tox.ini b/tox.ini index d96e7d202..4f21edd1d 100644 --- a/tox.ini +++ b/tox.ini @@ -42,6 +42,7 @@ deps = Werkzeug==0.11.2 wheel==0.26.0 xvfbwrapper==0.2.5 + cherrypy==3.8.0 commands = {envpython} scripts/link_pyqt.py --tox {envdir} {envpython} -m py.test --strict -rfEsw --faulthandler-timeout=70 --cov --cov-report xml --cov-report=html --cov-report= {posargs:tests} From a991a8c43cfe879195530fd2e5f368bf0b2b98ed Mon Sep 17 00:00:00 2001 From: Daniel Schadt Date: Fri, 20 Nov 2015 13:42:32 +0100 Subject: [PATCH 082/104] Don't compare requests triggered by loading a page --- .../integration/data/downloads/mhtml/complex/requests | 10 ---------- tests/integration/data/downloads/mhtml/simple/requests | 1 - tests/integration/test_mhtml_e2e.py | 1 + 3 files changed, 1 insertion(+), 11 deletions(-) diff --git a/tests/integration/data/downloads/mhtml/complex/requests b/tests/integration/data/downloads/mhtml/complex/requests index 9cc83327f..2c1efd144 100644 --- a/tests/integration/data/downloads/mhtml/complex/requests +++ b/tests/integration/data/downloads/mhtml/complex/requests @@ -1,19 +1,9 @@ background.png -background.png base.css -base.css -complex.html -# There are no divs, so this image is only loaded when saving as mhtml div-image.png extern-css.css -extern-css.css -external-in-external.css external-in-external.css favicon.png -favicon.png -image.gif image.gif inline.png -inline.png -script.js script.js diff --git a/tests/integration/data/downloads/mhtml/simple/requests b/tests/integration/data/downloads/mhtml/simple/requests index aff865ec9..e69de29bb 100644 --- a/tests/integration/data/downloads/mhtml/simple/requests +++ b/tests/integration/data/downloads/mhtml/simple/requests @@ -1 +0,0 @@ -simple.html diff --git a/tests/integration/test_mhtml_e2e.py b/tests/integration/test_mhtml_e2e.py index 4fa0654c6..f8f7389ef 100644 --- a/tests/integration/test_mhtml_e2e.py +++ b/tests/integration/test_mhtml_e2e.py @@ -83,6 +83,7 @@ def test_mhtml(test_name, download_dir, quteproc, httpbin): quteproc.open_path('{}/{}.html'.format(test_path, test_name)) download_dest = os.path.join(download_dir.location, '{}-downloaded.mht'.format(test_name)) + httpbin.after_test() quteproc.send_cmd(':download --mhtml --dest "{}"'.format(download_dest)) quteproc.wait_for(category='downloads', module='mhtml', function='finish_file', From cb40b1020c08a5acc9f2de87bb7cfdcaa356d8bb Mon Sep 17 00:00:00 2001 From: Daniel Schadt Date: Fri, 20 Nov 2015 14:00:17 +0100 Subject: [PATCH 083/104] Add cherrypy.wsgiserver to frozen tests --- scripts/dev/freeze_tests.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/scripts/dev/freeze_tests.py b/scripts/dev/freeze_tests.py index 309e00357..232787809 100755 --- a/scripts/dev/freeze_tests.py +++ b/scripts/dev/freeze_tests.py @@ -55,7 +55,8 @@ def get_build_exe_options(): opts = freeze.get_build_exe_options(skip_html=True) opts['includes'] += pytest.freeze_includes() # pylint: disable=no-member opts['includes'] += ['unittest.mock', 'PyQt5.QtTest', 'hypothesis', 'bs4', - 'httpbin', 'jinja2.ext', 'xvfbwrapper'] + 'httpbin', 'jinja2.ext', 'xvfbwrapper', + 'cherrypy.wsgiserver'] httpbin_dir = os.path.dirname(httpbin.__file__) opts['include_files'] += [ From 097a14d5f3782afc4601eb7a2b60735c3040a60d Mon Sep 17 00:00:00 2001 From: Daniel Schadt Date: Fri, 20 Nov 2015 14:03:51 +0100 Subject: [PATCH 084/104] Disable pylint no-member for cherrypy.wsgiserver --- tests/integration/webserver_sub.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/integration/webserver_sub.py b/tests/integration/webserver_sub.py index a39e079cc..8bd584004 100644 --- a/tests/integration/webserver_sub.py +++ b/tests/integration/webserver_sub.py @@ -91,7 +91,8 @@ def main(): basedir = os.path.realpath(os.path.dirname(sys.executable)) app.template_folder = os.path.join(basedir, 'integration', 'templates') port = int(sys.argv[1]) - server = cherrypy.wsgiserver.CherryPyWSGIServer(('0.0.0.0', port), app) + server = cherrypy.wsgiserver.CherryPyWSGIServer( + ('0.0.0.0', port), app) # pylint: disable=no-member checker = threading.Thread(target=ready_checker, args=[server]) checker.start() From fe1c8ee4e84452f68891f42f223c0e086aa17324 Mon Sep 17 00:00:00 2001 From: Daniel Schadt Date: Fri, 20 Nov 2015 15:27:17 +0100 Subject: [PATCH 085/104] Also add cherrypy.wsgiserver.wsgiserver3 to freeze --- scripts/dev/freeze_tests.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/scripts/dev/freeze_tests.py b/scripts/dev/freeze_tests.py index 232787809..e8e3e6f78 100755 --- a/scripts/dev/freeze_tests.py +++ b/scripts/dev/freeze_tests.py @@ -56,7 +56,8 @@ def get_build_exe_options(): opts['includes'] += pytest.freeze_includes() # pylint: disable=no-member opts['includes'] += ['unittest.mock', 'PyQt5.QtTest', 'hypothesis', 'bs4', 'httpbin', 'jinja2.ext', 'xvfbwrapper', - 'cherrypy.wsgiserver'] + 'cherrypy.wsgiserver', + 'cherrypy.wsgiserver.wsgiserver3'] httpbin_dir = os.path.dirname(httpbin.__file__) opts['include_files'] += [ From 613faf84efc52b7be721b785909ec382b0ea11a6 Mon Sep 17 00:00:00 2001 From: Daniel Schadt Date: Fri, 20 Nov 2015 15:30:27 +0100 Subject: [PATCH 086/104] Move pylint comment --- tests/integration/webserver_sub.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/integration/webserver_sub.py b/tests/integration/webserver_sub.py index 8bd584004..9a4ae30fa 100644 --- a/tests/integration/webserver_sub.py +++ b/tests/integration/webserver_sub.py @@ -91,8 +91,8 @@ def main(): basedir = os.path.realpath(os.path.dirname(sys.executable)) app.template_folder = os.path.join(basedir, 'integration', 'templates') port = int(sys.argv[1]) - server = cherrypy.wsgiserver.CherryPyWSGIServer( - ('0.0.0.0', port), app) # pylint: disable=no-member + server = cherrypy.wsgiserver.CherryPyWSGIServer( # pylint: disable=no-member + ('0.0.0.0', port), app) checker = threading.Thread(target=ready_checker, args=[server]) checker.start() From fb8f20029178c9147eb00a6e0c39573d15ed7fd3 Mon Sep 17 00:00:00 2001 From: Daniel Schadt Date: Fri, 20 Nov 2015 16:11:13 +0100 Subject: [PATCH 087/104] Remove polling in webserver, use property instead --- tests/integration/webserver_sub.py | 32 ++++++++++++++++++++---------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/tests/integration/webserver_sub.py b/tests/integration/webserver_sub.py index 9a4ae30fa..81efa9c6e 100644 --- a/tests/integration/webserver_sub.py +++ b/tests/integration/webserver_sub.py @@ -26,7 +26,6 @@ import sys import time import signal import os -import threading from datetime import datetime from httpbin.core import app @@ -70,12 +69,26 @@ def log_request(response): return response -def ready_checker(server): - """Wait until the server is ready and display the ready message.""" - while not server.ready: - time.sleep(0.2) - print(' * Running on http://127.0.0.1:{}/ (Press CTRL+C to quit)' - .format(server.bind_addr[1]), file=sys.stderr, flush=True) +class WSGIServer(cherrypy.wsgiserver.CherryPyWSGIServer): + """A custom WSGIServer that prints a line on stderr when it's ready.""" + # pylint: disable=no-member + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self._ready = False + self._printed_ready = False + + @property + def ready(self): + return self._ready + + @ready.setter + def ready(self, value): + if value and not self._printed_ready: + print(' * Running on http://127.0.0.1:{}/ (Press CTRL+C to quit)' + .format(self.bind_addr[1]), file=sys.stderr, flush=True) + self._printed_ready = True + self._ready = value def shutdown(*args): @@ -91,11 +104,8 @@ def main(): basedir = os.path.realpath(os.path.dirname(sys.executable)) app.template_folder = os.path.join(basedir, 'integration', 'templates') port = int(sys.argv[1]) - server = cherrypy.wsgiserver.CherryPyWSGIServer( # pylint: disable=no-member - ('0.0.0.0', port), app) + server = WSGIServer(('0.0.0.0', port), app) - checker = threading.Thread(target=ready_checker, args=[server]) - checker.start() signal.signal(signal.SIGTERM, shutdown) try: From 09e310277d66e46dc61b1a921fde293c33887edd Mon Sep 17 00:00:00 2001 From: Daniel Schadt Date: Fri, 20 Nov 2015 16:13:30 +0100 Subject: [PATCH 088/104] Remove server global, use lambda instead --- tests/integration/webserver_sub.py | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/tests/integration/webserver_sub.py b/tests/integration/webserver_sub.py index 81efa9c6e..a15ac4df5 100644 --- a/tests/integration/webserver_sub.py +++ b/tests/integration/webserver_sub.py @@ -33,7 +33,6 @@ from httpbin.structures import CaseInsensitiveDict import cherrypy.wsgiserver import flask -server = None @app.route('/data/') def send_data(path): @@ -91,27 +90,19 @@ class WSGIServer(cherrypy.wsgiserver.CherryPyWSGIServer): self._ready = value -def shutdown(*args): - """Stop the server.""" - if server is None: - return - server.stop() - - def main(): - global server if hasattr(sys, 'frozen'): basedir = os.path.realpath(os.path.dirname(sys.executable)) app.template_folder = os.path.join(basedir, 'integration', 'templates') port = int(sys.argv[1]) server = WSGIServer(('0.0.0.0', port), app) - signal.signal(signal.SIGTERM, shutdown) + signal.signal(signal.SIGTERM, lambda *args: server.stop()) try: server.start() except KeyboardInterrupt: - shutdown() + server.stop() if __name__ == '__main__': From 729d29b8a7bd510caab8e000410342ba16292702 Mon Sep 17 00:00:00 2001 From: Daniel Schadt Date: Fri, 20 Nov 2015 16:17:34 +0100 Subject: [PATCH 089/104] webserver: listen on 127.0.0.1 instead of 0.0.0.0 --- tests/integration/webserver_sub.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/integration/webserver_sub.py b/tests/integration/webserver_sub.py index a15ac4df5..4bf72bf58 100644 --- a/tests/integration/webserver_sub.py +++ b/tests/integration/webserver_sub.py @@ -95,7 +95,7 @@ def main(): basedir = os.path.realpath(os.path.dirname(sys.executable)) app.template_folder = os.path.join(basedir, 'integration', 'templates') port = int(sys.argv[1]) - server = WSGIServer(('0.0.0.0', port), app) + server = WSGIServer(('127.0.0.1', port), app) signal.signal(signal.SIGTERM, lambda *args: server.stop()) From cd78086d10502664448ed49c7c1fa1d2e58bb3df Mon Sep 17 00:00:00 2001 From: Daniel Schadt Date: Fri, 20 Nov 2015 16:23:46 +0100 Subject: [PATCH 090/104] Fix pep257 --- tests/integration/webserver_sub.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/integration/webserver_sub.py b/tests/integration/webserver_sub.py index 4bf72bf58..cd9a98803 100644 --- a/tests/integration/webserver_sub.py +++ b/tests/integration/webserver_sub.py @@ -69,7 +69,9 @@ def log_request(response): class WSGIServer(cherrypy.wsgiserver.CherryPyWSGIServer): + """A custom WSGIServer that prints a line on stderr when it's ready.""" + # pylint: disable=no-member def __init__(self, *args, **kwargs): From b38a3caa4c74ff0c48b792a89013f96ca3fbb4e6 Mon Sep 17 00:00:00 2001 From: Daniel Schadt Date: Fri, 20 Nov 2015 16:34:27 +0100 Subject: [PATCH 091/104] Hide dest-old in the documentation of download --- qutebrowser/browser/commands.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/qutebrowser/browser/commands.py b/qutebrowser/browser/commands.py index bbc04089b..d14c07ac9 100644 --- a/qutebrowser/browser/commands.py +++ b/qutebrowser/browser/commands.py @@ -1139,7 +1139,8 @@ class CommandDispatcher: cur.inspector.show() @cmdutils.register(instance='command-dispatcher', scope='window') - def download(self, url=None, dest_old=None, *, mhtml_=False, dest=None): + def download(self, url=None, dest_old: {'hide': True}=None, *, + mhtml_=False, dest=None): """Download a given URL, or current page if no URL given. The form `:download [url] [dest]` is deprecated, use `:download --dest From 7f8c118991e9c781012a4b45fcd8e17d0a39cfd5 Mon Sep 17 00:00:00 2001 From: Daniel Schadt Date: Fri, 20 Nov 2015 16:57:27 +0100 Subject: [PATCH 092/104] Fix pylint --- tests/integration/webserver_sub.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/integration/webserver_sub.py b/tests/integration/webserver_sub.py index cd9a98803..c6ac8b2cd 100644 --- a/tests/integration/webserver_sub.py +++ b/tests/integration/webserver_sub.py @@ -93,6 +93,10 @@ class WSGIServer(cherrypy.wsgiserver.CherryPyWSGIServer): def main(): + # pylint: disable=no-member + # "Instance of 'WSGIServer' has no 'start' member (no-member)" + # "Instance of 'WSGIServer' has no 'stop' member (no-member)" + if hasattr(sys, 'frozen'): basedir = os.path.realpath(os.path.dirname(sys.executable)) app.template_folder = os.path.join(basedir, 'integration', 'templates') From d5bc962046689537f084c5df063e55b658b2bf59 Mon Sep 17 00:00:00 2001 From: Daniel Schadt Date: Fri, 20 Nov 2015 18:15:03 +0100 Subject: [PATCH 093/104] mhtml: Current index != Current tab_id --- qutebrowser/browser/commands.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qutebrowser/browser/commands.py b/qutebrowser/browser/commands.py index d14c07ac9..d039bc291 100644 --- a/qutebrowser/browser/commands.py +++ b/qutebrowser/browser/commands.py @@ -1184,7 +1184,7 @@ class CommandDispatcher: Args: dest: The file path to write the download to. """ - tab_id = self._current_index() + tab_id = self._current_widget().tab_id if dest is None: suggested_fn = self._current_title() + ".mht" suggested_fn = utils.sanitize_filename(suggested_fn) From 0c2a285fef1af75a8cb0cb8ffcf8520466508b58 Mon Sep 17 00:00:00 2001 From: Daniel Schadt Date: Fri, 20 Nov 2015 18:30:08 +0100 Subject: [PATCH 094/104] Convert to QUrl before waiting for the logline webview uses QUrl to output the url and thus might convert some escape sequences to their unicode characters. If we don't do the same conversions here, we will "miss" the log message and fail the test. --- tests/integration/quteprocess.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/integration/quteprocess.py b/tests/integration/quteprocess.py index d99665e41..8f664ad82 100644 --- a/tests/integration/quteprocess.py +++ b/tests/integration/quteprocess.py @@ -31,7 +31,7 @@ import tempfile import yaml import pytest -from PyQt5.QtCore import pyqtSignal +from PyQt5.QtCore import pyqtSignal, QUrl import testprocess # pylint: disable=import-error from qutebrowser.misc import ipc @@ -229,6 +229,7 @@ class QuteProc(testprocess.Process): def wait_for_load_finished(self, path, timeout=15000): """Wait until any tab has finished loading.""" url = self._path_to_url(path) + url = QUrl(url).toString() pattern = re.compile( r"(load status for : LoadStatus.success|fetch: " From 0a9a75c3372865ed5d6535ca9b3a541443a040ba Mon Sep 17 00:00:00 2001 From: Daniel Schadt Date: Fri, 20 Nov 2015 18:31:39 +0100 Subject: [PATCH 095/104] Add more tests for the :download command --- tests/integration/features/downloads.feature | 23 ++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/tests/integration/features/downloads.feature b/tests/integration/features/downloads.feature index f81b5677d..0b89ece20 100644 --- a/tests/integration/features/downloads.feature +++ b/tests/integration/features/downloads.feature @@ -42,3 +42,26 @@ Feature: Downloading things from a website. Scenario: Retrying with no downloads When I run :download-retry Then the error "No failed downloads!" should be shown. + + Scenario: :download with deprecated dest-old argument + When I run :download http://localhost:(port)/ deprecated-argument + Then the warning ":download [url] [dest] is deprecated - use download --dest [dest] [url]" should be shown. + + Scenario: Two destinations given + When I run :download --dest destination2 http://localhost:(port)/ destination1 + Then the warning ":download [url] [dest] is deprecated - use download --dest [dest] [url]" should be shown. + Then the error "Can't give two destinations for the download." should be shown. + + Scenario: :download --mhtml with an URL given + When I run :download --mhtml http://foobar/ + Then the error "Can only download the current page as mhtml." should be shown. + + Scenario: Downloading as mhtml is available + When I open html + And I run :download --mhtml + Then no crash should happen + + Scenario: Downloading as mhtml with non-ASCII headers + When I open response-headers?Content-Type=text%2Fpl%C3%A4in + And I run :download --dest mhtml-response-headers.mht + Then no crash should happen From b776aeac84bd926673612102b6a2fd10dc10bd3d Mon Sep 17 00:00:00 2001 From: Daniel Schadt Date: Fri, 20 Nov 2015 19:10:14 +0100 Subject: [PATCH 096/104] Use same representation in webview and quteprocess Otherwise the "page loaded" message will not be recognized. Also use percent-encoding to avoid unicode-related bugs on different systems. --- qutebrowser/browser/webview.py | 2 +- tests/integration/quteprocess.py | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/qutebrowser/browser/webview.py b/qutebrowser/browser/webview.py index 54620a0fd..ede9f9a88 100644 --- a/qutebrowser/browser/webview.py +++ b/qutebrowser/browser/webview.py @@ -159,7 +159,7 @@ class WebView(QWebView): return page def __repr__(self): - url = utils.elide(self.url().toDisplayString(), 100) + url = utils.elide(self.url().toDisplayString(QUrl.EncodeUnicode), 100) return utils.get_repr(self, tab_id=self.tab_id, url=url) def __del__(self): diff --git a/tests/integration/quteprocess.py b/tests/integration/quteprocess.py index 8f664ad82..910f73950 100644 --- a/tests/integration/quteprocess.py +++ b/tests/integration/quteprocess.py @@ -35,7 +35,7 @@ from PyQt5.QtCore import pyqtSignal, QUrl import testprocess # pylint: disable=import-error from qutebrowser.misc import ipc -from qutebrowser.utils import log +from qutebrowser.utils import log, utils def is_ignored_qt_message(message): @@ -229,7 +229,9 @@ class QuteProc(testprocess.Process): def wait_for_load_finished(self, path, timeout=15000): """Wait until any tab has finished loading.""" url = self._path_to_url(path) - url = QUrl(url).toString() + # We really need the same representation that the webview uses in its + # __repr__ + url = utils.elide(QUrl(url).toDisplayString(QUrl.EncodeUnicode), 100) pattern = re.compile( r"(load status for : LoadStatus.success|fetch: " From c12011c84d1bd8f5e150b0169027353ed4a8f3b7 Mon Sep 17 00:00:00 2001 From: Daniel Schadt Date: Sat, 21 Nov 2015 00:10:49 +0100 Subject: [PATCH 097/104] Style fixes --- qutebrowser/browser/commands.py | 13 +-- qutebrowser/browser/downloads.py | 4 +- qutebrowser/browser/mhtml.py | 102 +++++++++---------- tests/integration/features/downloads.feature | 2 +- tests/integration/test_mhtml_e2e.py | 5 +- tests/integration/testprocess.py | 8 +- tests/integration/webserver.py | 7 +- tests/integration/webserver_sub.py | 2 + tests/unit/browser/test_mhtml.py | 21 ++++ 9 files changed, 93 insertions(+), 71 deletions(-) diff --git a/qutebrowser/browser/commands.py b/qutebrowser/browser/commands.py index d039bc291..d2f157c78 100644 --- a/qutebrowser/browser/commands.py +++ b/qutebrowser/browser/commands.py @@ -1184,24 +1184,21 @@ class CommandDispatcher: Args: dest: The file path to write the download to. """ - tab_id = self._current_widget().tab_id + web_view = self._current_widget() if dest is None: suggested_fn = self._current_title() + ".mht" suggested_fn = utils.sanitize_filename(suggested_fn) filename, q = downloads.ask_for_filename( - suggested_fn, self._win_id, parent=self, + suggested_fn, self._win_id, parent=web_view, ) if filename is not None: - mhtml.start_download_checked(filename, win_id=self._win_id, - tab_id=tab_id) + mhtml.start_download_checked(filename, web_view=web_view) else: q.answered.connect(functools.partial( - mhtml.start_download_checked, win_id=self._win_id, - tab_id=tab_id)) + mhtml.start_download_checked, web_view=web_view)) q.ask() else: - mhtml.start_download_checked(dest, win_id=self._win_id, - tab_id=tab_id) + mhtml.start_download_checked(dest, web_view=web_view) @cmdutils.register(instance='command-dispatcher', scope='window', deprecated="Use :download instead.") diff --git a/qutebrowser/browser/downloads.py b/qutebrowser/browser/downloads.py index 8e88f0826..7d2202301 100644 --- a/qutebrowser/browser/downloads.py +++ b/qutebrowser/browser/downloads.py @@ -139,7 +139,7 @@ def ask_for_filename(suggested_filename, win_id, *, parent=None, 'prompt-download-directory') if not prompt_download_directory: - return DownloadPath(download_dir(), None) + return DownloadPath(filename=download_dir(), question=None) encoding = sys.getfilesystemencoding() suggested_filename = utils.force_encoding(suggested_filename, @@ -154,7 +154,7 @@ def ask_for_filename(suggested_filename, win_id, *, parent=None, message_bridge = objreg.get('message-bridge', scope='window', window=win_id) q.ask = lambda: message_bridge.ask(q, blocking=False) - return DownloadPath(None, q) + return DownloadPath(filename=None, question=q) class DownloadItemStats(QObject): diff --git a/qutebrowser/browser/mhtml.py b/qutebrowser/browser/mhtml.py index 066686614..a202b5639 100644 --- a/qutebrowser/browser/mhtml.py +++ b/qutebrowser/browser/mhtml.py @@ -146,7 +146,7 @@ E_BASE64 = email.encoders.encode_base64 E_QUOPRI = email.encoders.encode_quopri -class MHTMLWriter(): +class MHTMLWriter: """A class for outputting multiple files to a MHTML document. @@ -217,7 +217,7 @@ class MHTMLWriter(): return msg -class _Downloader(): +class _Downloader: """A class to download whole websites. @@ -227,20 +227,21 @@ class _Downloader(): writer: The MHTMLWriter object which is used to save the page. loaded_urls: A set of QUrls of finished asset downloads. pending_downloads: A set of unfinished (url, DownloadItem) tuples. - _finished: A flag indicating if the file has already been written. + _finished_file: A flag indicating if the file has already been + written. _used: A flag indicating if the downloader has already been used. _win_id: The window this downloader belongs to. """ - def __init__(self, web_view, dest, win_id): + def __init__(self, web_view, dest): self.web_view = web_view self.dest = dest self.writer = None self.loaded_urls = {web_view.url()} self.pending_downloads = set() - self._finished = False + self._finished_file = False self._used = False - self._win_id = win_id + self._win_id = web_view.win_id def run(self): """Download and save the page. @@ -280,31 +281,36 @@ class _Downloader(): # Might be a local