Path: csiph.com!v102.xanadu-bbs.net!xanadu-bbs.net!news.mixmin.net!border2.nntp.ams2.giganews.com!backlog4.nntp.ams3.giganews.com!backlog4.nntp.ams.giganews.com!border2.nntp.ams.giganews.com!nntp.giganews.com!usenetcore.com!newsfeed.xs4all.nl!newsfeed1.news.xs4all.nl!xs4all!post.news.xs4all.nl!not-for-mail Return-Path: X-Original-To: python-list@python.org Delivered-To: python-list@mail.python.org X-Spam-Status: OK 0.010 X-Spam-Evidence: '*H*': 0.98; '*S*': 0.00; 'url:pypi': 0.03; 'output': 0.05; 'python)': 0.05; 'subject:ANN': 0.07; 'subject:released': 0.07; 'sys': 0.07; '------------': 0.09; 'python': 0.11; 'def': 0.12; 'bug': 0.12; "'setup.py'": 0.16; '-------': 0.16; '6.0': 0.16; '[01]': 0.16; '[02]': 0.16; '[03]': 0.16; 'concat': 0.16; 'fixes.': 0.16; 'platform:': 0.16; 'skip:@ 20': 0.16; 'skip:j 30': 0.16; 'sudo': 0.16; 'user-defined': 0.16; 'sender:addr:gmail.com': 0.17; 'fix': 0.17; 'wrote:': 0.18; 'code.': 0.18; 'skip:f 30': 0.19; 'example': 0.22; 'import': 0.22; 'to:name:python- list@python.org': 0.22; 'install': 0.23; 'installation': 0.23; 'parse': 0.24; 'script.': 0.24; 'mon,': 0.24; '15,': 0.26; 'pass': 0.26; '(for': 0.26; 'header:In-Reply-To:1': 0.27; 'properties': 0.29; "doesn't": 0.30; 'dec': 0.30; 'label': 0.30; 'skip:@ 10': 0.30; 'message-id:@mail.gmail.com': 0.30; 'code': 0.31; 'gcc': 0.31; 'compatible': 0.32; 'skip:c 30': 0.32; 'skip:m 30': 0.32; 'url:python': 0.33; 'message.': 0.35; 'skip:- 50': 0.35; 'test': 0.35; 'received:google.com': 0.35; 'add': 0.35; '8bit%:80': 0.36; 'skip:f 40': 0.36; 'version:': 0.36; 'url:org': 0.36; 'skip:& 10': 0.38; 'apple': 0.38; 'to:addr:python-list': 0.38; 'pm,': 0.38; 'skip:& 20': 0.39; 'to:addr:python.org': 0.39; 'skip:p 20': 0.39; 'release': 0.40; '8bit%:47': 0.60; 'skip:\xc2 10': 0.60; 'details.': 0.61; 'skip:* 10': 0.61; 'times': 0.62; 'show': 0.63; 'real': 0.63; '8bit%:74': 0.68; '8bit%:84': 0.69; 'skip:r 30': 0.69; 'user,': 0.69; '8bit%:96': 0.70; '8bit%:100': 0.72; '8bit%:27': 0.74; '8bit%:57': 0.74; '(total': 0.84; '4.2.1': 0.84; '8bit%:77': 0.84; '8bit%:82': 0.84; 'benchmark': 0.84; '\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0': 0.84; '8bit%:56': 0.91; '8bit%:90': 0.93; 'fun!': 0.93; 'ranking': 0.96 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:sender:in-reply-to:references:date:message-id:subject :from:to:content-type; bh=Cq9ojh3NlW2XkVv5encq1Ih9sUF4VLRFXQNnQPtsAgw=; b=ZdjXnZlyjLi/r/nyUiUZcAnoZkpF/lpdfeWSb2v0ittcNJ1PXivMLpSx1DDpmnG91c 4C5X4+DbiCyt/yBXBJKTYRvKKmjutaflRhCTVQetD+9sXRpMnUeeWZ107iHaYhfM8nav DDXGugZgbZsl/pZzoc6Up176/hWnYo8TibwCF9Qytu7L3q7MlQwH1rOxwgO1poEZEPAB ueYs00GuQrgiRkUJ4Zx8PsOY9RklCgLhHzjGJyMyqimT7yHR3nRk0h4ZaXi8yc9XLCeH F9wS0Uo7reQZDsfanIW2yPV7Q/v5J80VuTdWBvjvWbzrA5k03afUWBYnTKWIkiEclSru Lc8Q== MIME-Version: 1.0 X-Received: by 10.50.61.132 with SMTP id p4mr626792igr.43.1418780304978; Tue, 16 Dec 2014 17:38:24 -0800 (PST) Sender: kwatch@gmail.com In-Reply-To: References: Date: Wed, 17 Dec 2014 10:38:24 +0900 X-Google-Sender-Auth: EvmzQjw7Hg3Y-YZmw2T5wa8LM-M Subject: Re: ANN: Benchmarker 4.0.0 released - small but awesome benchmark utility From: Makoto Kuwata To: "python-list@python.org" Content-Type: multipart/alternative; boundary=047d7bdc15ea17b86c050a5f880f X-BeenThere: python-list@python.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: General discussion list for the Python programming language List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Newsgroups: comp.lang.python Message-ID: Lines: 222 NNTP-Posting-Host: 2001:888:2000:d::a6 X-Trace: 1418780308 news.xs4all.nl 2935 [2001:888:2000:d::a6]:40249 X-Complaints-To: abuse@xs4all.nl Xref: csiph.com comp.lang.python:82587 X-Original-Bytes: 15430 --047d7bdc15ea17b86c050a5f880f Content-Type: text/plain; charset=UTF-8 I released Benchmarker.py ver 4.0.1 which includes several bug fixes. If you failed to install Benchmarker.py 4.0.0, try 4.0.1. http://pypi.python.org/pypi/Benchmarker/ http://pythonhosted.org/Benchmarker/ Bugfix ------ * Fix 'setup.py' not to import 'ez_setup' * Fix to parse user-defined properties in command-line. * Add description about user-defined properties. * Fix example code to work on Python 2.6. * Fix test script. -- regards, makoto kuwata On Mon, Dec 15, 2014 at 9:43 PM, Makoto Kuwata wrote: > > I released Benchmarker ver 4.0.0 > http://pypi.python.org/pypi/Benchmarker/ > http://pythonhosted.org/Benchmarker/ > > Benchmarker is a small utility to benchmark your code. > > *NOTICE* This release doesn't have compatibility with ver 3.x. > > > Installation > ------------ > > $ sudo pip install Benchmarker > > > Example > ------- > > example.py:: > > from benchmarker import Benchmarker > > with Benchmarker(1000*1000, width=20) as bench: > > s1, s2, s3, s4, s5 = "Haruhi", "Mikuru", "Yuki", "Itsuki", "Kyon" > > @bench(None) > def _(bm): > for _ in bm: ## empty loop > pass > > @bench("concat") > def _(bm): > for _ in bm: > s = s1 + s2 + s3 + s4 + s5 > > @bench("join") > def _(bm): > for _ in bm: > s = "".join((s1, s2, s3, s4, s5)) > > @bench("format") > def _(bm): > for _ in bm: > s = "%s%s%s%s%s" % (s1, s2, s3, s4, s5) > > Output example:: > > $ python example.py -h # show help message. > $ python example.py # or python example.py -n 1000000 > ## benchmarker: release 4.0.0 (for python) > ## python version: 3.4.1 > ## python compiler: GCC 4.2.1 Compatible Apple LLVM 6.0 > (clang-600.0.51) > ## python platform: Darwin-14.0.0-x86_64-i386-64bit > ## python executable: /usr/local/bin/python > ## cpu model: Intel(R) Core(TM) i7-4650U CPU @ 1.70GHz > ## parameters: loop=1000000, cycle=1, extra=0 > > ## real (total = user + sys) > (Empty) 0.0335 0.0300 0.0300 0.0000 > concat 0.4192 0.4200 0.4100 0.0100 > join 0.3674 0.3700 0.3700 0.0000 > format 0.4765 0.4600 0.4600 0.0000 > > ## Ranking real > join 0.3674 (100.0) ******************** > concat 0.4192 ( 87.6) ****************** > format 0.4765 ( 77.1) *************** > > ## Matrix real [01] [02] [03] > [01] join 0.3674 100.0 114.1 129.7 > [02] concat 0.4192 87.6 100.0 113.7 > [03] format 0.4765 77.1 88.0 100.0 > > Notice that empty loop times (real, user, sys and total) are > subtracted from other benchmark times automatically. > For example:: > > =================================================== > benchmark label real (second) > --------------------------------------------------- > join 0.3674 (= 0.4009 - 0.0335) > concat 0.4192 (= 0.4527 - 0.0335) > format 0.4765 (= 0.5100 - 0.0335) > =================================================== > > > See http://pythonhosted.org/Benchmarker/ for details. > > > Have fun! > > -- > regards, > makoto kuwata > > --047d7bdc15ea17b86c050a5f880f Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: base64 PGRpdiBkaXI9Imx0ciI+PGRpdj5JIHJlbGVhc2VkIEJlbmNobWFya2VyLnB5IHZlciA0LjAuMSB3 aGljaCBpbmNsdWRlcyBzZXZlcmFsIGJ1ZyBmaXhlcy48YnI+SWYgeW91IGZhaWxlZCB0byBpbnN0 YWxsIEJlbmNobWFya2VyLnB5IDQuMC4wLCB0cnkgNC4wLjEuPGJyPjxicj48YSBocmVmPSJodHRw Oi8vcHlwaS5weXRob24ub3JnL3B5cGkvQmVuY2htYXJrZXIvIiB0YXJnZXQ9Il9ibGFuayI+aHR0 cDovL3B5cGkucHl0aG9uLm9yZy9weXBpL0JlbmNobWFya2VyLzwvYT48YnI+PGEgaHJlZj0iaHR0 cDovL3B5dGhvbmhvc3RlZC5vcmcvQmVuY2htYXJrZXIvIiB0YXJnZXQ9Il9ibGFuayI+aHR0cDov L3B5dGhvbmhvc3RlZC5vcmcvQmVuY2htYXJrZXIvPC9hPjxicj48YnI+QnVnZml4PGJyPi0tLS0t LTxicj48YnI+KiBGaXggJiMzOTtzZXR1cC5weSYjMzk7IG5vdCB0byBpbXBvcnQgJiMzOTtlel9z ZXR1cCYjMzk7PGJyPiogRml4IHRvIHBhcnNlIHVzZXItZGVmaW5lZCBwcm9wZXJ0aWVzIGluIGNv bW1hbmQtbGluZS48YnI+KiBBZGQgZGVzY3JpcHRpb24gYWJvdXQgdXNlci1kZWZpbmVkIHByb3Bl cnRpZXMuPGJyPiogRml4IGV4YW1wbGUgY29kZSB0byB3b3JrIG9uIFB5dGhvbiAyLjYuPGJyPiog Rml4IHRlc3Qgc2NyaXB0Ljxicj48YnI+LS08YnI+PC9kaXY+PGRpdj5yZWdhcmRzLDxicj5tYWtv dG8ga3V3YXRhPGJyPjwvZGl2PjxkaXY+PGJyPjwvZGl2PjwvZGl2PjxkaXYgY2xhc3M9ImdtYWls X2V4dHJhIj48YnI+PGRpdiBjbGFzcz0iZ21haWxfcXVvdGUiPk9uIE1vbiwgRGVjIDE1LCAyMDE0 IGF0IDk6NDMgUE0sIE1ha290byBLdXdhdGEgPHNwYW4gZGlyPSJsdHIiPiZsdDs8YSBocmVmPSJt YWlsdG86a3dhQGt1d2F0YS1sYWIuY29tIiB0YXJnZXQ9Il9ibGFuayI+a3dhQGt1d2F0YS1sYWIu Y29tPC9hPiZndDs8L3NwYW4+IHdyb3RlOjxibG9ja3F1b3RlIGNsYXNzPSJnbWFpbF9xdW90ZSIg c3R5bGU9Im1hcmdpbjowIDAgMCAuOGV4O2JvcmRlci1sZWZ0OjFweCAjY2NjIHNvbGlkO3BhZGRp bmctbGVmdDoxZXgiPjxkaXYgZGlyPSJsdHIiPkkgcmVsZWFzZWQgQmVuY2htYXJrZXIgdmVyIDQu MC4wPGJyPjxhIGhyZWY9Imh0dHA6Ly9weXBpLnB5dGhvbi5vcmcvcHlwaS9CZW5jaG1hcmtlci8i IHRhcmdldD0iX2JsYW5rIj5odHRwOi8vcHlwaS5weXRob24ub3JnL3B5cGkvQmVuY2htYXJrZXIv PC9hPjxicj48YSBocmVmPSJodHRwOi8vcHl0aG9uaG9zdGVkLm9yZy9CZW5jaG1hcmtlci8iIHRh cmdldD0iX2JsYW5rIj5odHRwOi8vcHl0aG9uaG9zdGVkLm9yZy9CZW5jaG1hcmtlci88L2E+PGJy Pjxicj5CZW5jaG1hcmtlciBpcyBhIHNtYWxsIHV0aWxpdHkgdG8gYmVuY2htYXJrIHlvdXIgY29k ZS48YnI+PGJyPipOT1RJQ0UqIFRoaXMgcmVsZWFzZSBkb2VzbiYjMzk7dCBoYXZlIGNvbXBhdGli aWxpdHkgd2l0aCB2ZXIgMy54Ljxicj48YnI+PGJyPkluc3RhbGxhdGlvbjxicj4tLS0tLS0tLS0t LS08YnI+PGJyPsKgwqDCoCAkIHN1ZG8gcGlwIGluc3RhbGwgQmVuY2htYXJrZXI8YnI+PGJyPjxi cj5FeGFtcGxlPGJyPi0tLS0tLS08YnI+PGJyPmV4YW1wbGUucHk6Ojxicj48YnI+wqDCoMKgIGZy b20gYmVuY2htYXJrZXIgaW1wb3J0IEJlbmNobWFya2VyPGJyPjxicj7CoMKgwqAgd2l0aCBCZW5j aG1hcmtlcigxMDAwKjEwMDAsIHdpZHRoPTIwKSBhcyBiZW5jaDo8YnI+PGJyPsKgwqDCoMKgwqDC oMKgIHMxLCBzMiwgczMsIHM0LCBzNSA9ICZxdW90O0hhcnVoaSZxdW90OywgJnF1b3Q7TWlrdXJ1 JnF1b3Q7LCAmcXVvdDtZdWtpJnF1b3Q7LCAmcXVvdDtJdHN1a2kmcXVvdDssICZxdW90O0t5b24m cXVvdDs8YnI+PGJyPsKgwqDCoMKgwqDCoMKgIEBiZW5jaChOb25lKTxicj7CoMKgwqDCoMKgwqDC oCBkZWYgXyhibSk6PGJyPsKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZm9yIF8gaW4gYm06wqDCoMKg wqDCoMKgICMjIGVtcHR5IGxvb3A8YnI+wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHBh c3M8YnI+PGJyPsKgwqDCoMKgwqDCoMKgIEBiZW5jaCgmcXVvdDtjb25jYXQmcXVvdDspPGJyPsKg wqDCoMKgwqDCoMKgIGRlZiBfKGJtKTo8YnI+wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBmb3IgXyBp biBibTo8YnI+wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHMgPSBzMSArIHMyICsgczMg KyBzNCArIHM1PGJyPjxicj7CoMKgwqDCoMKgwqDCoCBAYmVuY2goJnF1b3Q7am9pbiZxdW90Oyk8 YnI+wqDCoMKgwqDCoMKgwqAgZGVmIF8oYm0pOjxicj7CoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGZv ciBfIGluIGJtOjxicj7CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcyA9ICZxdW90OyZx dW90Oy5qb2luKChzMSwgczIsIHMzLCBzNCwgczUpKTxicj48YnI+wqDCoMKgwqDCoMKgwqAgQGJl bmNoKCZxdW90O2Zvcm1hdCZxdW90Oyk8YnI+wqDCoMKgwqDCoMKgwqAgZGVmIF8oYm0pOjxicj7C oMKgwqDCoMKgwqDCoMKgwqDCoMKgIGZvciBfIGluIGJtOjxicj7CoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqAgcyA9ICZxdW90OyVzJXMlcyVzJXMmcXVvdDsgJSAoczEsIHMyLCBzMywgczQs IHM1KTxicj48YnI+T3V0cHV0IGV4YW1wbGU6Ojxicj48YnI+wqDCoMKgICQgcHl0aG9uIGV4YW1w bGUucHkgLWjCoCAjIHNob3cgaGVscCBtZXNzYWdlLjxicj7CoMKgwqAgJCBweXRob24gZXhhbXBs ZS5wecKgICMgb3IgcHl0aG9uIGV4YW1wbGUucHkgLW4gMTAwMDAwMDxicj7CoMKgwqAgIyMgYmVu Y2htYXJrZXI6wqDCoMKgwqDCoMKgwqDCoCByZWxlYXNlIDQuMC4wIChmb3IgcHl0aG9uKTxicj7C oMKgwqAgIyMgcHl0aG9uIHZlcnNpb246wqDCoMKgwqDCoCAzLjQuMTxicj7CoMKgwqAgIyMgcHl0 aG9uIGNvbXBpbGVyOsKgwqDCoMKgIEdDQyA0LjIuMSBDb21wYXRpYmxlIEFwcGxlIExMVk0gNi4w IChjbGFuZy02MDAuMC41MSk8YnI+wqDCoMKgICMjIHB5dGhvbiBwbGF0Zm9ybTrCoMKgwqDCoCBE YXJ3aW4tMTQuMC4wLXg4Nl82NC1pMzg2LTY0Yml0PGJyPsKgwqDCoCAjIyBweXRob24gZXhlY3V0 YWJsZTrCoMKgIC91c3IvbG9jYWwvYmluL3B5dGhvbjxicj7CoMKgwqAgIyMgY3B1IG1vZGVsOsKg wqDCoMKgwqDCoMKgwqDCoMKgIEludGVsKFIpIENvcmUoVE0pIGk3LTQ2NTBVIENQVSBAIDEuNzBH SHo8YnI+wqDCoMKgICMjIHBhcmFtZXRlcnM6wqDCoMKgwqDCoMKgwqDCoMKgIGxvb3A9MTAwMDAw MCwgY3ljbGU9MSwgZXh0cmE9MDxicj7CoMKgwqAgPGJyPsKgwqDCoCAjI8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcmVhbMKgwqDCoCAodG90YWzCoMKgwqAg PSB1c2VywqDCoMKgICsgc3lzKTxicj7CoMKgwqAgKEVtcHR5KcKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgIDAuMDMzNcKgwqDCoCAwLjAzMDDCoMKgwqAgMC4wMzAwwqDCoMKgIDAuMDAw MDxicj7CoMKgwqAgY29uY2F0wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAwLjQx OTLCoMKgwqAgMC40MjAwwqDCoMKgIDAuNDEwMMKgwqDCoCAwLjAxMDA8YnI+wqDCoMKgIGpvaW7C oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAwLjM2NzTCoMKgwqAgMC4zNzAw wqDCoMKgIDAuMzcwMMKgwqDCoCAwLjAwMDA8YnI+wqDCoMKgIGZvcm1hdMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqAgMC40NzY1wqDCoMKgIDAuNDYwMMKgwqDCoCAwLjQ2MDDCoMKg wqAgMC4wMDAwPGJyPsKgwqDCoCA8YnI+wqDCoMKgICMjIFJhbmtpbmfCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqAgcmVhbDxicj7CoMKgwqAgam9pbsKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgIDAuMzY3NMKgICgxMDAuMCkgKioqKioqKioqKioqKioqKioqKio8YnI+ wqDCoMKgIGNvbmNhdMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgMC40MTkywqAg KCA4Ny42KSAqKioqKioqKioqKioqKioqKio8YnI+wqDCoMKgIGZvcm1hdMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqAgMC40NzY1wqAgKCA3Ny4xKSAqKioqKioqKioqKioqKio8YnI+ wqDCoMKgIDxicj7CoMKgwqAgIyMgTWF0cml4wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqAgcmVhbMKgwqDCoCBbMDFdwqDCoMKgIFswMl3CoMKgwqAgWzAzXTxicj7CoMKgwqAgWzAxXSBq b2luwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAwLjM2NzTCoMKgIDEwMC4wwqDCoCAxMTQu McKgwqAgMTI5Ljc8YnI+wqDCoMKgIFswMl0gY29uY2F0wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg IDAuNDE5MsKgwqDCoCA4Ny42wqDCoCAxMDAuMMKgwqAgMTEzLjc8YnI+wqDCoMKgIFswM10gZm9y bWF0wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIDAuNDc2NcKgwqDCoCA3Ny4xwqDCoMKgIDg4LjDC oMKgIDEwMC4wPGJyPjxicj5Ob3RpY2UgdGhhdCBlbXB0eSBsb29wIHRpbWVzIChyZWFsLCB1c2Vy LCBzeXMgYW5kIHRvdGFsKSBhcmU8YnI+c3VidHJhY3RlZCBmcm9tIG90aGVyIGJlbmNobWFyayB0 aW1lcyBhdXRvbWF0aWNhbGx5Ljxicj5Gb3IgZXhhbXBsZTo6PGJyPjxicj7CoMKgwqAgPT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PGJyPsKgwqDCoMKg IGJlbmNobWFyayBsYWJlbMKgwqDCoMKgwqDCoMKgIHJlYWwgKHNlY29uZCk8YnI+wqDCoMKgIC0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTxicj7CoMKg wqDCoCBqb2luwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIDAuMzY3NCAoPSAw LjQwMDkgLSAwLjAzMzUpPGJyPsKgwqDCoMKgIGNvbmNhdMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgIDAuNDE5MiAoPSAwLjQ1MjcgLSAwLjAzMzUpPGJyPsKgwqDCoMKgIGZvcm1hdMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIDAuNDc2NSAoPSAwLjUxMDAgLSAwLjAzMzUp PGJyPsKgwqDCoCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT08YnI+PGJyPjxicj5TZWUgPGEgaHJlZj0iaHR0cDovL3B5dGhvbmhvc3RlZC5vcmcvQmVu Y2htYXJrZXIvIiB0YXJnZXQ9Il9ibGFuayI+aHR0cDovL3B5dGhvbmhvc3RlZC5vcmcvQmVuY2ht YXJrZXIvPC9hPiBmb3IgZGV0YWlscy48YnI+PGJyPjxicj5IYXZlIGZ1biE8YnI+PGJyPi0tPGJy PnJlZ2FyZHMsPGJyPm1ha290byBrdXdhdGE8YnI+PGJyPjwvZGl2Pg0KPC9ibG9ja3F1b3RlPjwv ZGl2PjwvZGl2Pg0K --047d7bdc15ea17b86c050a5f880f--