Received: from localhost (unknown [200.46.204.183]) by postgresql.org (Postfix) with ESMTP id EB21F65034B for ; Fri, 25 Jul 2008 18:52:01 -0300 (ADT) Received: from postgresql.org ([200.46.204.86]) by localhost (mx1.hub.org [200.46.204.183]) (amavisd-maia, port 10024) with ESMTP id 77236-02 for ; Fri, 25 Jul 2008 18:51:54 -0300 (ADT) X-Greylist: from auto-whitelisted by SQLgrey-1.7.6 Received: from mk-outboundfilter-6-a-2.mail.uk.tiscali.com (mk-outboundfilter-6-a-2.mail.uk.tiscali.com [212.74.114.16]) by postgresql.org (Postfix) with ESMTP id BA74565025B for ; Fri, 25 Jul 2008 18:51:56 -0300 (ADT) X-Trace: 6499981/mk-outboundfilter-6.mail.uk.tiscali.com/F2S/$F2S-NILDRAM-ACCEPTED/f2s-temporary-group/85.211.229.155 X-SBRS: None X-RemoteIP: 85.211.229.155 X-IP-MAIL-FROM: simon@2ndquadrant.com X-IP-BHB: Once X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AkkBACLoiUhV0+Wb/2dsb2JhbAAIsDw X-IronPort-AV: E=Sophos;i="4.31,254,1215385200"; d="c'?scan'208,49?tar'208,49,49?sql'208,49,49";a="6499981" X-IP-Direction: IN Received: from 85-211-229-155.dyn.gotadsl.co.uk (HELO [192.168.0.3]) ([85.211.229.155]) by smtp.f2s.tiscali.co.uk with ESMTP; 25 Jul 2008 22:51:54 +0100 Subject: WIP: Transportable Optimizer Mode From: Simon Riggs To: List pgsql-patches Content-Type: multipart/mixed; boundary="=-VfGQGMCgy5vPVgrIjSeE" Date: Fri, 25 Jul 2008 22:58:27 +0100 Message-Id: <1217023107.3894.1053.camel@ebony.2ndQuadrant> Mime-Version: 1.0 X-Mailer: Evolution 2.12.0 X-Virus-Scanned: Maia Mailguard 1.0.1 X-Spam-Status: No, hits=0 tagged_above=0 required=5 tests=none X-Spam-Level: X-Archive-Number: 200807/250 X-Sequence-Number: 6944 --=-VfGQGMCgy5vPVgrIjSeE Content-Type: text/plain Content-Transfer-Encoding: 7bit I've written a contrib module that allows planning information to be extracted from one server and transported to another server to allow SQL analysis: Transportable Optimizer Mode (TOM). TOM works, yet is incomplete because of the lack of a stats hook within the server. So TOM is the application which would seek to use the recent patch requesting stats hooks in Postgres. I'm posting this as background to later patches that will * re-introduce a stats hook * complete TOM so that it works fully with the stats hook That way we can all see where I'm going with this, and why, as well as providing a test harness for the stats hook patches. The main purpose of all of this is to literally "get data for Tom" - enhance the ability of experts to diagnose SQL query plans without requiring access to the data on remote servers. I see this as an enabling tool that will provide more information about optimizer issues and opportunities. Comments welcome. -- Simon Riggs www.2ndQuadrant.com PostgreSQL Training, Services and Support --=-VfGQGMCgy5vPVgrIjSeE Content-Disposition: attachment; filename=TOM.tar Content-Type: application/x-tar; name=TOM.tar Content-Transfer-Encoding: base64 VE9NLwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMDA3NTUAMDAwMTc1 MAAwMDAwMTQ0ADAwMDAwMDAwMDAwADExMDQyNDQ1MjQxADAxMDcyNwAgNQAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c3RhciAgAHNyaWdncwAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAdXNlcnMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABU T00vZ2V0X21hcHBpbmdfZm9yX3RvbS5zcWwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwMDY0NAAwMDAxNzUw ADAwMDAxNDQAMDAwMDAwMDEwMDEAMTEwNDE1NTQ3NzMAMDE1NDcxACAwAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHVzdGFyICAAc3JpZ2dzAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAB1c2VycwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC0t Ci0tIEdldCBtYXBwaW5nIGZvciBUcmFuc3BvcnRhYmxlIE9wdGltaXplciBNb2RlCi0tCi0tIHNp bW9uQDJuZHF1YWRyYW50LmNvbQotLQotLSBFZGl0IHRoaXMgdG8gY3JlYXRlIGEgY3VzdG9tIG1h cHBpbmcgaWYgcmVxdWlyZWQKLS0gb3IganVzdCBhZGQgbWFwcGluZyBkYXRhIHRvIHN1aXQgeW91 ciBuZWVkcwoKLS0gTm90ZSB0aGF0IHdlIGFyZSB1c2luZyBhbiBpbm5lciBqb2luCgpJTlNFUlQg SU5UTyA6VE9NX1NDSEVNQS50b21fbWFwcGluZwoKU0VMRUNUCiBjLm9pZAoscy5zY2hlbWFuYW1l CixzLnJlbG5hbWUKCkZST00KIDpUT01fU0NIRU1BLnRvbV9wZ19jbGFzcyBzCixwZ19jbGFzcyBj CixwZ19uYW1lc3BhY2UgbgoKV0hFUkUKCglzLnJlbG5hbWUgPSBjLnJlbG5hbWUKQU5EIHMuc2No ZW1hbmFtZSA9IG4ubnNwbmFtZQpBTkQgYy5yZWxuYW1lc3BhY2UgPSBuLm9pZAo7CgotLQotLSBF bmQgb2YgZ2V0IG1hcHBpbmcgZm9yIFRyYW5zcG9ydGFibGUgT3B0aW1pemVyIE1vZGUKLS0KCgAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABUT00v Z2V0X2RhdGFfZm9yX3RvbS5zcWwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwMDY0NAAwMDAxNzUwADAw MDAxNDQAMDAwMDAwMDMyNzcAMTEwNDE1NTU2NDAAMDE0NzYyACAwAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHVzdGFyICAAc3JpZ2dzAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAB1c2VycwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC0tCi0t IEdldCBkYXRhIGZvciBUcmFuc3BvcnRhYmxlIE9wdGltaXplciBNb2RlCi0tCi0tIHNpbW9uQDJu ZHF1YWRyYW50LmNvbQoKLS0gT3V0cHV0IG11c3QgYmUgYSBzZXQgb2YgZmlsZXMuIFdlIHdhbnQg dGhpcyB0byBydW4gYnkgYW4gdW5wcml2aWxlZ2VkIHVzZXIsCgpEUk9QIFZJRVcgSUYgRVhJU1RT IHRvbV9nZXRfc3RhdHM7CkNSRUFURSBPUiBSRVBMQUNFIFZJRVcgdG9tX2dldF9zdGF0cyBBUwpT RUxFQ1QgCiAgbi5uc3BuYW1lIEFTIHNjaGVtYW5hbWUKLCBjLnJlbG5hbWUgQVMgdGFibGVuYW1l CiwgYS5hdHRudW0gQVMgYXR0bnVtCiwgc3RhbnVsbGZyYWMgQVMgczEKLCBzdGF3aWR0aCBBUyBz MgosIHN0YWRpc3RpbmN0IEFTIHMzCiwgc3Rha2luZDEgQVMgczQKLCBzdGFraW5kMiBBUyBzNQos IHN0YWtpbmQzIEFTIHM2Ciwgc3Rha2luZDQgQVMgczcKLCBzdGFvcDEgQVMgczgKLCBzdGFvcDIg QVMgczkKLCBzdGFvcDMgQVMgczEwCiwgc3Rhb3A0IEFTIHMxMQosIHN0YW51bWJlcnMxIEFTIHMx MgosIHN0YW51bWJlcnMyIEFTIHMxMwosIHN0YW51bWJlcnMzIEFTIHMxNAosIHN0YW51bWJlcnM0 IEFTIHMxNQosIHN0YXZhbHVlczE6OnRleHQgQVMgczE2Ciwgc3RhdmFsdWVzMjo6dGV4dCBBUyBz MTcKLCBzdGF2YWx1ZXMzOjp0ZXh0IEFTIHMxOAosIHN0YXZhbHVlczQ6OnRleHQgQVMgczE5CgpG Uk9NCiBwZ19zdGF0aXN0aWMgcwoscGdfY2xhc3MgYwoscGdfYXR0cmlidXRlIGEKLHBnX25hbWVz cGFjZSBuCgpXSEVSRSBoYXNfdGFibGVfcHJpdmlsZWdlKGMub2lkLCAnc2VsZWN0Jzo6dGV4dCkK ICBBTkQgbi5uc3BuYW1lIG5vdCBpbiAoJ3BnX2NhdGFsb2cnLCAnaW5mb3JtYXRpb25fc2NoZW1h JywgJ3BnX3RvYXN0JykKICBBTkQgYS5hdHRuYW1lIG5vdCBpbiAoJ2N0aWQnLCd4bWluJywneG1h eCcsJ2NtaW4nLCdjbWF4JywndGFibGVvaWQnKQogIEFORCBjLnJlbG5hbWUgbm90IGxpa2UgJ3Rv bV8lJwoKICBBTkQgYy5vaWQgPSBzLnN0YXJlbGlkCiAgQU5EIGEuYXR0bnVtID0gcy5zdGFhdHRu dW0KICBBTkQgYy5vaWQgPSBhLmF0dHJlbGlkCiAgQU5EIG4ub2lkID0gYy5yZWxuYW1lc3BhY2UK Ck9SREVSIEJZIG4ubnNwbmFtZQo7Clxjb3B5IChzZWxlY3QgKiBmcm9tIHRvbV9nZXRfc3RhdHMp IFRPICd0b21fcGdfc3RhdGlzdGljLmRhdGEnCgpEUk9QIFZJRVcgSUYgRVhJU1RTIHRvbV9nZXRf cGdfY2xhc3M7CkNSRUFURSBPUiBSRVBMQUNFIFZJRVcgdG9tX2dldF9wZ19jbGFzcyBBUwpTRUxF Q1QgCiAgbi5uc3BuYW1lIEFTIHNjaGVtYW5hbWUKLCBjLnJlbG5hbWUgQVMgcmVsbmFtZQosIHBn X3JlbGF0aW9uX3NpemUoYy5vaWQpLzgxOTIgQVMgcGFnZXMKLCAwIEFTIHR1cGxlcwpGUk9NCiBw Z19jbGFzcyBjCixwZ19uYW1lc3BhY2UgbgoKV0hFUkUgaGFzX3RhYmxlX3ByaXZpbGVnZShjLm9p ZCwgJ3NlbGVjdCc6OnRleHQpCiAgQU5EIG4ubnNwbmFtZSBub3QgaW4gKCdwZ19jYXRhbG9nJywg J2luZm9ybWF0aW9uX3NjaGVtYScsICdwZ190b2FzdCcpCiAgQU5EIGMucmVsbmFtZSBub3QgbGlr ZSAndG9tXyUnCgogIEFORCBuLm9pZCA9IGMucmVsbmFtZXNwYWNlCgpPUkRFUiBCWSBuLm5zcG5h bWUKOwpcY29weSAoc2VsZWN0ICogZnJvbSBnZXRfdG9tX3BnX2NsYXNzKSBUTyAndG9tX3BnX2Ns YXNzLmRhdGEnCgotLQotLSBFbmQgb2YgZ2V0IGRhdGEgZm9yIFRyYW5zcG9ydGFibGUgT3B0aW1p emVyIE1vZGUKLS0KAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVE9NL3RvbV9o b29rcy5jAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMDA2NDQAMDAwMTc1MAAwMDAwMTQ0 ADAwMDAwMDEyNTc3ADExMDQxNTc2MzE2ADAxMzEyMAAgMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAB1c3RhciAgAHNyaWdncwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAdXNlcnMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvKi0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0KICoKICogdG9tX2hvb2tzLmMKICoKICoJICBQb3N0Z3JlcyBwbGFubmluZyBob29r cyBmb3IgVE9NCiAqCiAqCSAgJFBvc3RncmVTUUwkCiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKi8KCiNp bmNsdWRlICJwb3N0Z3Jlcy5oIgoKI2luY2x1ZGUgImZtZ3IuaCIKI2luY2x1ZGUgImZ1bmNhcGku aCIKI2luY2x1ZGUgIm1pc2NhZG1pbi5oIgoKI2luY2x1ZGUgImFjY2Vzcy9odHVwLmgiCiNpbmNs dWRlICJjYXRhbG9nL3BnX3N0YXRpc3RpYy5oIgojaW5jbHVkZSAiZXhlY3V0b3Ivc3BpLmgiCiNp bmNsdWRlICJvcHRpbWl6ZXIvcGxhbmNhdC5oIgojaW5jbHVkZSAidXRpbHMvZWxvZy5oIgojaW5j bHVkZSAidXRpbHMvYnVpbHRpbnMuaCIKI2luY2x1ZGUgInV0aWxzL3N5c2NhY2hlLmgiCgpQR19N T0RVTEVfTUFHSUM7CS8qIFRlbGwgdGhlIHNlcnZlciBhYm91dCBvdXIgY29tcGlsZSBlbnZpcm9u bWVudCAqLwoKdHlwZWRlZiBzdHJ1Y3QgdG9tX3BsYW5faW5mbwp7CglpbnQJCQloYXZlX3BsYW47 Cgl2b2lkCSAgICpwbGFuX3RvbV9wZ19jbGFzczsJCS8qIHBsYW4gb2YgYWNjZXNzIHRvIHRvbV9w Z19jbGFzcyAqLwoJdm9pZAkgICAqcGxhbl90b21fcGdfc3RhdGlzdGljOwkvKiBwbGFuIG9mIGFj Y2VzcyB0byB0b21fcGdfc3RhdGlzdGljICovCgp9IHRvbV9wbGFuX2luZm87CgpzdGF0aWMgdG9t X3BsYW5faW5mbyAqdHBpOwoKdm9pZApwbHVnaW5fZ2V0X3JlbGF0aW9uX2luZm8oUGxhbm5lcklu Zm8gKnJvb3QsCgkJCQkJCQkJT2lkIHJlbGF0aW9uT2JqZWN0SWQsCgkJCQkJCQkJYm9vbCBpbmhw YXJlbnQsCgkJCQkJCQkJUmVsT3B0SW5mbyAqcmVsKTsKSGVhcFR1cGxlIHBsdWdpbl9nZXRfcmVs YXRpb25fc3RhdHMoRGF0dW0gcmVsaWQsIERhdHVtIGF0dG51bSk7CmludDMyIHBsdWdpbl9nZXRf cmVsYXRpb25fYXZnX3dpZHRoKERhdHVtIHJlbGlkLCBEYXR1bSBhdHRudW0pOwp2b2lkIF9QR19p bml0KHZvaWQpOwoKc3RhdGljIHZvaWQgZ2V0X3RvbV9yZWxhdGlvbl9zaXplKE9pZCByZWxpZCwg ZG91YmxlICp0dXBsZXMsIEJsb2NrTnVtYmVyICpwYWdlcyk7Cgp2b2lkCl9QR19pbml0KHZvaWQp CnsKCWludAkJCXJjOwoJY2hhcgkJcXVlcnlbMTAyNF07CglPaWQJCQlwbGFuX3R5cGVzWzNdOwoK CWlmICh0cGkgPT0gTlVMTCkKCXsKCQkvKgoJCSAqIE5vIHRwaSBmb3VuZCwgc28gY3JlYXRlIGl0 CgkJICovCgkJdHBpID0gKHRvbV9wbGFuX2luZm8gKikgbWFsbG9jKHNpemVvZih0b21fcGxhbl9p bmZvKSk7CgkJbWVtc2V0KHRwaSwgMCwgc2l6ZW9mKHRvbV9wbGFuX2luZm8pKTsKCX0KCgkvKgoJ ICogUHJlcGFyZSBhbmQgc2F2ZSB0aGUgcGxhbnMKCSAqLwoJaWYgKCF0cGktPmhhdmVfcGxhbikK CXsKCQlpZiAoKHJjID0gU1BJX2Nvbm5lY3QoKSkgPCAwKQoJCQllbG9nKEVSUk9SLCAidG9tOiBT UElfY29ubmVjdCgpIGZhaWxlZCBpbiBfUEdfaW5pdCIpOwoKCQkvKgoJCSAqIEdldCBzdGF0cyBm b3IgYSByZWxhdGlvbgoJCSAqLwoJCXNwcmludGYocXVlcnksIAoJCSJTRUxFQ1QgbnVtYmVyXzhr YmxvY2tzLCBudW1iZXJfdHVwbGVzIEZST00gdG9tLnRvbV9wZ19jbGFzcyBjIgoJCSIgSk9JTiB0 b20udG9tX21hcHBpbmcgbSAiCgkJIiBPTiBtLnNjaGVtYW5hbWUgPSBjLnNjaGVtYW5hbWUgQU5E IG0ucmVsbmFtZSA9IGMucmVsbmFtZSIKCQkiIFdIRVJFIGxvY2FsX3JlbGlkID0gJDEiCgkJIiBM SU1JVCAxIik7CgoJCXBsYW5fdHlwZXNbMF0gPSBJTlQ0T0lEOwoKCQl0cGktPnBsYW5fdG9tX3Bn X2NsYXNzID0gU1BJX3NhdmVwbGFuKFNQSV9wcmVwYXJlKHF1ZXJ5LCAxLCBwbGFuX3R5cGVzKSk7 CgkJaWYgKHRwaS0+cGxhbl90b21fcGdfY2xhc3MgPT0gTlVMTCkKCQkJZWxvZyhFUlJPUiwgInRv bTogU1BJX3ByZXBhcmUoKSBmYWlsZWQgZm9yIHBsYW5fdG9tX3BnX2NsYXNzIik7CgoJCS8qCgkJ ICogR2V0IHN0YXRpc3RpY3MgZm9yIGEgY29sdW1uCgkJICovCgkJc3ByaW50ZihxdWVyeSwgCgkJ IlNFTEVDVCAqIEZST00gdG9tLnRvbV9wZ19zdGF0aXN0aWMgcyIKCQkiIEpPSU4gdG9tLnRvbV9t YXBwaW5nIG0iCgkJIiBPTiBtLnNjaGVtYW5hbWUgPSBzLnNjaGVtYW5hbWUgQU5EIG0ucmVsbmFt ZSA9IHMucmVsbmFtZSIKCQkiIFdIRVJFIG0ubG9jYWxfcmVsaWQgPSAkMSBBTkQgcy5hdHRudW0g PSAkMiIKCQkiIExJTUlUIDEiKTsKCgkJcGxhbl90eXBlc1swXSA9IElOVDRPSUQ7CgkJcGxhbl90 eXBlc1sxXSA9IElOVDRPSUQ7CgoJCXRwaS0+cGxhbl90b21fcGdfc3RhdGlzdGljID0gU1BJX3Nh dmVwbGFuKFNQSV9wcmVwYXJlKHF1ZXJ5LCAyLCBwbGFuX3R5cGVzKSk7CgkJaWYgKHRwaS0+cGxh bl90b21fcGdfc3RhdGlzdGljID09IE5VTEwpCgkJCWVsb2coRVJST1IsICJ0b206IFNQSV9wcmVw YXJlKCkgZmFpbGVkIGZvciBwbGFuX3RvbV9wZ19zdGF0aXN0aWMiKTsKCgkJdHBpLT5oYXZlX3Bs YW4gPSB0cnVlOwoKCQlTUElfZmluaXNoKCk7Cgl9CgoJZ2V0X3JlbGF0aW9uX2luZm9faG9vayA9 ICZwbHVnaW5fZ2V0X3JlbGF0aW9uX2luZm87Ci8vCWdldF9yZWxhdGlvbl9zdGF0c19ob29rID0g JnBsdWdpbl9nZXRfcmVsYXRpb25fc3RhdHM7Ci8vCWdldF9yZWxhdGlvbl9hdmdfd2lkdGhfaG9v ayA9ICZwbHVnaW5fZ2V0X3JlbGF0aW9uX2F2Z193aWR0aDsKfQoKdm9pZApwbHVnaW5fZ2V0X3Jl bGF0aW9uX2luZm8oUGxhbm5lckluZm8gKnJvb3QsCgkJCQkJCQkJT2lkIHJlbGF0aW9uT2JqZWN0 SWQsCgkJCQkJCQkJYm9vbCBpbmhwYXJlbnQsIAoJCQkJCQkJCVJlbE9wdEluZm8gKnJlbCkKewoJ ZWxvZyhMT0csICJwbHVnaW5fZ2V0X3JlbGF0aW9uX2luZm8gcmVsYXRpb25PYmplY3RJZCA9ICV1 IiwgCgkJCQkJcmVsYXRpb25PYmplY3RJZCk7CgoJLyogCgkgKiBPdmVycmlkZSB0aGUgYWN0dWFs IHNpemUgb2YgcmVsYXRpb24gb24gdGhpcyBzZXJ2ZXIuCgkgKiBTZXQgdGhlIHR1cGxlcyBhbmQg cGFnZXMgdmFsdWVzIGRpcmVjdGx5IGZyb20gdG9tX3BnX2NsYXNzLAoJICogd2l0aG91dCB0cnlp bmcgdG8gY2FsY3VsYXRlIHR1cGxlcyBkZW5zaXR5IGV0YyBhcyB3ZSBkbyBpbiB0aGUKCSAqIHN0 YW5kYXJkIHBsYW5uZXIuCgkgKi8KCWdldF90b21fcmVsYXRpb25fc2l6ZShyZWxhdGlvbk9iamVj dElkLCAmcmVsLT50dXBsZXMsICZyZWwtPnBhZ2VzKTsKCgkvKgoJICogR2V0IHNpemUgZm9yIGFu eSBJbmRleE9wdEluZm8gbm9kZXMgcHJlc2VudAoJICovCglpZiAocmVsLT5pbmRleGxpc3QpCgl7 CgkJTGlzdAkgICAqaW5kZXhsaXN0OwoJCUxpc3RDZWxsICAgKmw7CgoJCWluZGV4bGlzdCA9IHJl bC0+aW5kZXhsaXN0OwoKCQlmb3JlYWNoKGwsIGluZGV4bGlzdCkKCQl7CgkJCUluZGV4T3B0SW5m byAqaW5mbyA9IGxmaXJzdChsKTsKCgkJCS8qIAoJCQkgKiBPdmVycmlkZSB0aGUgYWN0dWFsIHNp emUgb2YgaW5kZXggb24gdGhpcyBzZXJ2ZXIuCgkJCSAqIFNldCB0aGUgdHVwbGVzIGFuZCBwYWdl cyB2YWx1ZXMgZGlyZWN0bHkgZnJvbSB0b21fcGdfY2xhc3MKCQkJICovCgkJCWdldF90b21fcmVs YXRpb25fc2l6ZShpbmZvLT5pbmRleG9pZCwgJmluZm8tPnR1cGxlcywgJmluZm8tPnBhZ2VzKTsK CQl9Cgl9Cn0KCnN0YXRpYyB2b2lkCmdldF90b21fcmVsYXRpb25fc2l6ZShPaWQgcmVsaWQsIGRv dWJsZSAqdHVwbGVzLCBCbG9ja051bWJlciAqcGFnZXMpCnsKCWludAkJCXJjOwoJRGF0dW0gCQl0 b21fcGdfY2xhc3NfdmFsdWVzWzFdOwoKCWlmICgocmMgPSBTUElfY29ubmVjdCgpKSA8IDApCgkJ ZWxvZyhFUlJPUiwgInRvbTogU1BJX2Nvbm5lY3QoKSBmYWlsZWQgaW4gZ2V0X3RvbV9yZWxhdGlv bl9zaXplKCkiKTsKCgl0b21fcGdfY2xhc3NfdmFsdWVzWzBdID0gT2JqZWN0SWRHZXREYXR1bShy ZWxpZCk7CglyYyA9IFNQSV9leGVjcCh0cGktPnBsYW5fdG9tX3BnX2NsYXNzLCB0b21fcGdfY2xh c3NfdmFsdWVzLCBOVUxMLCAxKTsKCglpZiAocmMgIT0gU1BJX09LX1NFTEVDVCkKCQllbG9nKEVS Uk9SLCAidG9tOiBjYW5ub3QgZ2V0IHRvbV9wZ19jbGFzcyB0dXBsZSIpOwoKCS8qCgkgKiBJZiB0 aGVyZSBpcyBhIHJvdyBpbiB0b21fcGdfY2xhc3MgdGFibGUsIGFwcGx5IHZhbHVlcwoJICovCQoJ aWYgKFNQSV9wcm9jZXNzZWQgPT0gMSkKCXsKCQkqcGFnZXMgPSBEYXR1bUdldEludDMyKFNQSV9n ZXRiaW52YWwoU1BJX3R1cHRhYmxlLT52YWxzWzBdLAoJCQkJCQkJCQlTUElfdHVwdGFibGUtPnR1 cGRlc2MsIDEsIE5VTEwpKTsKCQkqdHVwbGVzID0gKGRvdWJsZSkgRGF0dW1HZXRJbnQ2NChTUElf Z2V0YmludmFsKFNQSV90dXB0YWJsZS0+dmFsc1swXSwKCQkJCQkJCQkJU1BJX3R1cHRhYmxlLT50 dXBkZXNjLCAyLCBOVUxMKSk7Cgl9CgoJU1BJX2ZyZWV0dXB0YWJsZShTUElfdHVwdGFibGUpOwoK CVNQSV9maW5pc2goKTsKfQoKSGVhcFR1cGxlIApwbHVnaW5fZ2V0X3JlbGF0aW9uX3N0YXRzKERh dHVtIHJlbGlkLCBEYXR1bSBhdHRudW0pCnsKCWludAkJCXJjOwoJRGF0dW0gCQl0b21fcGdfc3Rh dGlzdGljX3ZhbHVlc1syXTsKCglpZiAoKHJjID0gU1BJX2Nvbm5lY3QoKSkgPCAwKQoJCWVsb2co RVJST1IsICJ0b206IFNQSV9jb25uZWN0KCkgZmFpbGVkIGluIGdldF90b21fcmVsYXRpb25fc3Rh dHMoKSIpOwoKCXRvbV9wZ19zdGF0aXN0aWNfdmFsdWVzWzBdID0gcmVsaWQ7Cgl0b21fcGdfc3Rh dGlzdGljX3ZhbHVlc1sxXSA9IGF0dG51bTsKCXJjID0gU1BJX2V4ZWNwKHRwaS0+cGxhbl90b21f cGdfc3RhdGlzdGljLCB0b21fcGdfc3RhdGlzdGljX3ZhbHVlcywgTlVMTCwgMSk7CgoJaWYgKHJj ICE9IFNQSV9PS19TRUxFQ1QpCgkJZWxvZyhFUlJPUiwgInRvbTogY2Fubm90IGdldCB0b21fcGdf c3RhdGlzdGljIHR1cGxlIik7CgoJLyoKCSAqIEdldCBzdGF0cyBpZiBwcmVzZW50CgkgKi8JCglp ZiAoU1BJX3Byb2Nlc3NlZCA9PSAxKQoJewoKCgoKCX0KCglTUElfZnJlZXR1cHRhYmxlKFNQSV90 dXB0YWJsZSk7CgoJU1BJX2ZpbmlzaCgpOwoKCXJldHVybiBTZWFyY2hTeXNDYWNoZShTVEFUUkVM QVRULCByZWxpZCwgYXR0bnVtLCAwLCAwKTsKfQoKaW50MzIgCnBsdWdpbl9nZXRfcmVsYXRpb25f YXZnX3dpZHRoKERhdHVtIHJlbGlkLCBEYXR1bSBhdHRudW0pCnsKCUhlYXBUdXBsZQl0cDsKCgl0 cCA9IFNlYXJjaFN5c0NhY2hlKFNUQVRSRUxBVFQsCgkJCQkJCXJlbGlkLAoJCQkJCQlhdHRudW0s CgkJCQkJCTAsIDApOwoJaWYgKEhlYXBUdXBsZUlzVmFsaWQodHApKQoJewoJCWludDMyCQlzdGF3 aWR0aCA9ICgoRm9ybV9wZ19zdGF0aXN0aWMpIEdFVFNUUlVDVCh0cCkpLT5zdGF3aWR0aDsKCgkJ UmVsZWFzZVN5c0NhY2hlKHRwKTsKCQlpZiAoc3Rhd2lkdGggPiAwKQoJCQlyZXR1cm4gc3Rhd2lk dGg7Cgl9CglyZXR1cm4gMDsKfQoKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVE9NL2xvYWRfZGF0YV9mb3JfdG9t LnNxbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMDA2NDQAMDAwMTc1MAAwMDAwMTQ0ADAwMDAwMDAwNDU0 ADExMDQxNTc2NTU0ADAxNTEyMwAgMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAB1c3RhciAgAHNyaWdncwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdXNlcnMAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAtLQotLSBMb2FkIGRhdGEgZm9yIFRy YW5zcG9ydGFibGUgT3B0aW1pemVyIE1vZGUKLS0KLS0gc2ltb25AMm5kcXVhZHJhbnQuY29tCgpU UlVOQ0FURSBUT00udG9tX3BnX3N0YXRpc3RpYzsKXGNvcHkgdG9tLnRvbV9wZ19zdGF0aXN0aWMg ZnJvbSAndG9tX3BnX3N0YXRpc3RpYy5kYXRhJwoKVFJVTkNBVEUgVE9NLnRvbV9wZ19jbGFzczsK XGNvcHkgdG9tLnRvbV9wZ19jbGFzcyBmcm9tICd0b21fcGdfY2xhc3MuZGF0YScKCi0tCi0tIEVu ZCBvZiBnZXQgZGF0YSBmb3IgVHJhbnNwb3J0YWJsZSBPcHRpbWl6ZXIgTW9kZQotLQoAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFRPTS9SRUFETUUAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAwMDAwNjQ0ADAwMDE3NTAAMDAwMDE0NAAwMDAwMDAwNDE3NgAx MTA0MTU3NjYzNQAwMTE2MzIAIDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAdXN0YXIgIABzcmlnZ3MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHVzZXJzAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALS0KLS0gVHJhbnNwb3J0YWJsZSBPcHRp bWl6ZXIgTW9kZSAoVE9NKSBmb3IgUG9zdGdyZVNRTAotLQotLSBzaW1vbkAybmRxdWFkcmFudC5j b20KLS0KClRPTSBpcyBkZXNpZ25lZCB0byBhbGxvdyB5b3UgdG8gdGFrZSBzdGF0aXN0aWNzIGZy b20gb25lIGRhdGFiYXNlCnNlcnZlciB0byBhbm90aGVyLCBhbGxvd2luZyB5b3UgdG8gcmVjcmVh dGUgdGhlIHNhbWUgZW52aXJvbm1lbnQKdW5kZXIgd2hpY2ggU1FMIHBsYW5uaW5nIG9jY3VycmVk LgoKWW91IG1heSB3aXNoIHRvIGRvIHRoaXMgZm9yIHRoZSBmb2xsb3dpbmcgcmVhc29ucwoqIGNy ZWF0aW5nIGEgZGV2ZWxvcG1lbnQgc2VydmVyCiogcHJvdmlkaW5nIGRldGFpbHMgb2YgYSBwcm9i bGVtIFNRTCBzdGF0ZW1lbnQgdG8gYSByZW1vdGUgYW5hbHlzdAoKUHJvY2VzcyBpcyBzdHJhaWdo dGZvcndhcmQgaWYgeW91IGFyZSB1c2luZyBzYW1lIHNjaGVtYSBhbmQgdGFibGVuYW1lcwpvbiBi b3RoIGRhdGFiYXNlIHNlcnZlcnMgKHJlY29tbWVuZGVkKS4KCkFjdGlvbnMgb24gU291cmNlIGRh dGFiYXNlOgo9PT09PT09PT09PT09PT09PT09PT09PT09PT0KWzAuIEluc3RhbGwgVE9NLCBpZiBu b3QgYWxyZWFkeSBpbnN0YWxsZWRdCgoxLiBBTkFMWVpFIGFsbCByZXF1aXJlZCB0YWJsZXMgCgoJ QU5BTFlaRSBbdGFibGVuYW1lXTsKCglUaGlzIGlzIGp1c3QgdG8gbWFrZSBzdXJlIHN0YXRzIGFy ZSB1cCB0byBkYXRlIGJlZm9yZSB3ZSB0cmFuc3BvcnQgdGhlbS4KCjIuIEdldCBzdGF0cyBkYXRh IGZvciBUT00gCgoJcHNxbCAtZiBnZXRfZGF0YV9mb3JfdG9tLnNxbAoKCVByb2R1Y2VzIAoJCXRv bV9wZ19zdGF0aXN0aWMuZGF0YSAKCQl0b21fcGdfY2xhc3MuZGF0YQoKCVRoaXMgaW5jbHVkZXMg YWxsIHN0YXRzIGZvciB0YWJsZXMgeW91IGhhdmUgYWNjZXNzIHRvLCBzbyB5b3UgbWF5IHdpc2gK CXRvIGVkaXQgdGhpcyBkb3duIGlmIHlvdSBoYXZlIHNlY3VyaXR5IGNvbmNlcm5zLgoKMy4gR2V0 IHRhYmxlIG1ldGFkYXRhIChhbmQgcG9zc2libHkgZGF0YSwgb3IgYSBzYW1wbGUgb2YgaXQpCgoJ cGdkdW1wIFstc10gLXQgdGFibGVuYW1lID4gdXNlcl90YWJsZXMuc3FsCgoJSWYgeW91IGluY2x1 ZGUgZGF0YSBhcyB3ZWxsLCB0aGVuIGl0IG1heSBiZSBwb3NzaWJsZSB0byBydW4gYW4KCUVYUExB SU4gQU5BTFlaRSBhcyB3ZWxsIGFzIGFuIEVYUExBSU4uIE9mIGNvdXJzZSwgZXh0cmFjdGluZyBh CglyZXByZXNlbnRhdGl2ZSBzYW1wbGUgaXMgZGlmZmljdWx0LgoKQmV0d2VlbiBkYXRhYmFzZXM6 Cj09PT09PT09PT09PT09PT09PQo0LiBUcmFuc3BvcnQgZGF0YSB0byB0YXJnZXQgc3lzdGVtCmUu Zy4gUkZDIDExNDksIGVtYWlsIGV0YwoKQWN0aW9ucyBvbiBUYXJnZXQgZGF0YWJhc2U6Cj09PT09 PT09PT09PT09PT09PT09PT09PT09PQoKNS4gQ3JlYXRlIHVzZXIgdGFibGVzIChhbmQgbG9hZCBk YXRhIGlmIHJlcXVpcmVkKQoKCWUuZy4KCXBzcWwgLWYgdXNlcl90YWJsZXMuc3FsCgo2LiBDcmVh dGUgVE9NIHRhYmxlcwoKCXBzcWwgLWMgImNyZWF0ZSBzY2hlbWEgdG9tOyIKCglwc3FsIC1mIGNy ZWF0ZV90b21fdGFibGVzLnNxbCAtLXNpbmdsZS10cmFuc2FjdGlvbiAtdiBUT01fU0NIRU1BPSd0 b20nCgoJVXNlIHRoZSBjdXJyZW50IHNjaGVtYQoKNy4gTG9hZCBUT00gZGF0YSBpbnRvIHRhcmdl dCBkYXRhYmFzZQoKCWUuZy4KCXBzcWwgLWYgbG9hZF9kYXRhX2Zvcl90b20uc3FsIC0tc2luZ2xl LXRyYW5zYWN0aW9uICAtdiBUT01fU0NIRU1BPSd0b20nCgo4LiBDcmVhdGUgbWFwcGluZyBiZXR3 ZWVuIHRhcmdldCBjYXRhbG9nIGFuZCBzb3VyY2Ugc3RhdHMKCglwc3FsIC1mIGdldF9tYXBwaW5n X2Zvcl90b20uc3FsIC12IFRPTV9TQ0hFTUE9dG9tCgoJV2UgbmVlZCB0byBiZSBhYmxlIHRvIG1h dGNoIHVwIG9iamVjdHMgYmV0d2VlbiBzb3VyY2UgYW5kIHRhcmdldC4gVGhpcwoJc2NyaXB0IG1h dGNoZXMgdXAgb2JqZWN0cyB0aGF0IGhhdmUgbWF0Y2hpbmcgc2NoZW1hIGFuZCB0YWJsZW5hbWVz LiBJZgoJeW91IGhhdmUgYSBkaWZmZXJlbnQgb3IgbW9yZSBjb21wbGV4IG1hdGNoaW5nIGFsZ29y aXRobSwgcnVuIGl0IG5vdy4KCjkuIFNldHVwIFRPTSBwbHVnaW4gCgoJTE9BRCAnJGxpYmRpci9w bHVnaW5zL3RvbSc7CgoxMC4gRVhQTEFJTiB5b3VyIHF1ZXJpZXMKCgoAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFRPTS9jcmVhdGVfdG9tX3RhYmxlcy5zcWwAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAwMDAwNjQ0ADAwMDE3NTAAMDAwMDE0NAAwMDAwMDAwMzU0NwAxMTA0MTU1 MjAyMQAwMTUxMjcAIDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA dXN0YXIgIABzcmlnZ3MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHVzZXJzAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALS0KLS0gVGFibGVzIGZvciBUcmFuc3BvcnRhYmxl IE9wdGltaXplciBNb2RlCi0tCi0tIHNpbW9uQDJuZHF1YWRyYW50LmNvbQoKU0VUIHNlYXJjaF9w YXRoPTpUT01fU0NIRU1BOwpTRVQgY2xpZW50X21pbl9tZXNzYWdlcz1FUlJPUjsKCkRST1AgVEFC TEUgSUYgRVhJU1RTIHRvbV9tYXBwaW5nOwpDUkVBVEUgVEFCTEUgdG9tX21hcHBpbmcgKAogICAg bG9jYWxfcmVsaWQgb2lkIG5vdCBudWxsLAoJc2NoZW1hbmFtZSBuYW1lIG5vdCBudWxsLAoJcmVs bmFtZSBuYW1lIG5vdCBudWxsCik7CgpDT01NRU5UIG9uIFRBQkxFIHRvbV9tYXBwaW5nIElTIAon TWFwcGluZyBiZXR3ZWVuIGxvY2FsIGNhdGFsb2cgZW50cmllcyBhbmQgdG9tX3BnX3N0YXRpc3Rp YyB0YWJsZSc7CgpDUkVBVEUgVU5JUVVFIElOREVYIHRvbV9pZHhfb25fdG9tX21hcHBpbmdfdXNp bmdfbG9jYWxfcmVsaWQKT04gdG9tX21hcHBpbmcgVVNJTkcgYnRyZWUgKGxvY2FsX3JlbGlkKTsK CkFMVEVSIFRBQkxFIHRvbV9tYXBwaW5nIEFERCBQUklNQVJZIEtFWSAoc2NoZW1hbmFtZSwgcmVs bmFtZSk7CgotLQotLSBUYWJsZXMsIEluZGV4ZXMKLS0KRFJPUCBUQUJMRSBJRiBFWElTVFMgdG9t X3BnX2NsYXNzOwpDUkVBVEUgVEFCTEUgdG9tX3BnX2NsYXNzICgKCXNjaGVtYW5hbWUgbmFtZSBu b3QgbnVsbCwKCXJlbG5hbWUgbmFtZSBub3QgbnVsbCwKCW51bWJlcl84a2Jsb2NrcyBpbnRlZ2Vy IG5vdCBudWxsLAoJbnVtYmVyX3R1cGxlcyBiaWdpbnQgbm90IG51bGwpOwoKQ09NTUVOVCBvbiBU QUJMRSB0b21fcGdfY2xhc3MgSVMgCidNYXBwaW5nIGJldHdlZW4gbG9jYWwgY2F0YWxvZyBlbnRy aWVzIGFuZCB0b21fcGdfc3RhdGlzdGljIHRhYmxlJzsKCkFMVEVSIFRBQkxFIHRvbV9wZ19jbGFz cyBBREQgUFJJTUFSWSBLRVkgKHNjaGVtYW5hbWUsIHJlbG5hbWUpOwoKLS0KLS0gU3RhdHMgZm9y IFRhYmxlcyBvbmx5IGF0IHByZXNlbnQKLS0KRFJPUCBUQUJMRSBJRiBFWElTVFMgdG9tX3BnX3N0 YXRpc3RpYzsKQ1JFQVRFIFRBQkxFIHRvbV9wZ19zdGF0aXN0aWMgKAoJc2NoZW1hbmFtZSBuYW1l IG5vdCBudWxsLAoJcmVsbmFtZSBuYW1lIG5vdCBudWxsLAoJYXR0bnVtIHNtYWxsaW50IG5vdCBu dWxsLAogICAgc3RhbnVsbGZyYWMgcmVhbCBOT1QgTlVMTCwKICAgIHN0YXdpZHRoIGludGVnZXIg Tk9UIE5VTEwsCiAgICBzdGFkaXN0aW5jdCByZWFsIE5PVCBOVUxMLAogICAgc3Rha2luZDEgc21h bGxpbnQgTk9UIE5VTEwsCiAgICBzdGFraW5kMiBzbWFsbGludCBOT1QgTlVMTCwKICAgIHN0YWtp bmQzIHNtYWxsaW50IE5PVCBOVUxMLAogICAgc3Rha2luZDQgc21hbGxpbnQgTk9UIE5VTEwsCiAg ICBzdGFvcDEgb2lkIE5PVCBOVUxMLAogICAgc3Rhb3AyIG9pZCBOT1QgTlVMTCwKICAgIHN0YW9w MyBvaWQgTk9UIE5VTEwsCiAgICBzdGFvcDQgb2lkIE5PVCBOVUxMLAogICAgc3RhbnVtYmVyczEg cmVhbFtdLAogICAgc3RhbnVtYmVyczIgcmVhbFtdLAogICAgc3RhbnVtYmVyczMgcmVhbFtdLAog ICAgc3RhbnVtYmVyczQgcmVhbFtdLAogICAgc3RhdmFsdWVzMSB0ZXh0LAogICAgc3RhdmFsdWVz MiB0ZXh0LAogICAgc3RhdmFsdWVzMyB0ZXh0LAogICAgc3RhdmFsdWVzNCB0ZXh0Cik7CgpDT01N RU5UIG9uIFRBQkxFIHRvbV9wZ19zdGF0aXN0aWMgSVMgCidFeHRlcm5hbCBkYXRhIHRha2VuIGZy b20gcmVtb3RlIHBnX3N0YXRpc3RpYyB0YWJsZXMgcGx1cyBvYmplY3RuYW1lcyc7CgpBTFRFUiBU QUJMRSB0b21fcGdfc3RhdGlzdGljIEFERCBQUklNQVJZIEtFWSAgKHNjaGVtYW5hbWUsIHJlbG5h bWUsIGF0dG51bSk7CgpSRVNFVCBjbGllbnRfbWluX21lc3NhZ2VzOwoKLS0KLS0gRW5kIG9mIHRh YmxlcyBmb3IgVHJhbnNwb3J0YWJsZSBPcHRpbWl6ZXIgTW9kZQotLQoAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAABUT00vTWFrZWZpbGUAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAMDAwMDY0NAAwMDAxNzUwADAwMDAxNDQAMDAwMDAwMDA0NDYAMTEwNDE1NzUxMDcA MDEyMzc3ACAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHVzdGFy ICAAc3JpZ2dzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c2VycwAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAACMgJFBvc3RncmVTUUwkCgpNT0RVTEVTID0gdG9tX2hvb2tz Ck9CSlMJPSB0b21faG9va3Muc28KCmlmZGVmIFVTRV9QR1hTClBHX0NPTkZJRyA9IHBnX2NvbmZp ZwpQR1hTIDo9ICQoc2hlbGwgJChQR19DT05GSUcpIC0tcGd4cykJCmluY2x1ZGUgJChQR1hTKQpl bHNlCnN1YmRpciA9IGNvbnRyaWIvVE9NCnRvcF9idWlsZGRpciA9IC4uLy4uCmluY2x1ZGUgJCh0 b3BfYnVpbGRkaXIpL3NyYy9NYWtlZmlsZS5nbG9iYWwKaW5jbHVkZSAkKHRvcF9zcmNkaXIpL2Nv bnRyaWIvY29udHJpYi1nbG9iYWwubWsKZW5kaWYKCgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAA= --=-VfGQGMCgy5vPVgrIjSeE--