From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [IPv6:2a01:7e0:0:424::9]) by lore.proxmox.com (Postfix) with ESMTPS id D4BD41FF183 for ; Wed, 27 Aug 2025 15:05:30 +0200 (CEST) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id B70D819FA8; Wed, 27 Aug 2025 15:05:31 +0200 (CEST) Message-ID: <00725d88-402f-4216-9dbd-e13879782fe4@proxmox.com> Date: Wed, 27 Aug 2025 15:04:55 +0200 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird To: Dominik Csapak , Proxmox Datacenter Manager development discussion References: <20250827113427.199253-1-s.hanreich@proxmox.com> <20250827113427.199253-18-s.hanreich@proxmox.com> <7703ad1d-df00-432b-9bdd-c78136c382ff@proxmox.com> Content-Language: en-US From: Stefan Hanreich In-Reply-To: <7703ad1d-df00-432b-9bdd-c78136c382ff@proxmox.com> X-SPAM-LEVEL: Spam detection results: 0 AWL 0.707 Adjusted score from AWL reputation of From: address BAYES_00 -1.9 Bayes spam probability is 0 to 1% DMARC_MISSING 0.1 Missing DMARC policy KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment RCVD_IN_VALIDITY_CERTIFIED_BLOCKED 0.001 ADMINISTRATOR NOTICE: The query to Validity was blocked. See https://knowledge.validity.com/hc/en-us/articles/20961730681243 for more information. RCVD_IN_VALIDITY_RPBL_BLOCKED 0.001 ADMINISTRATOR NOTICE: The query to Validity was blocked. See https://knowledge.validity.com/hc/en-us/articles/20961730681243 for more information. RCVD_IN_VALIDITY_SAFE_BLOCKED 0.001 ADMINISTRATOR NOTICE: The query to Validity was blocked. See https://knowledge.validity.com/hc/en-us/articles/20961730681243 for more information. SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_PASS -0.001 SPF: sender matches SPF record URIBL_BLOCKED 0.001 ADMINISTRATOR NOTICE: The query to URIBL was blocked. See http://wiki.apache.org/spamassassin/DnsBlocklists#dnsbl-block for more information. [self.data, remote.id, lib.rs] Subject: Re: [pdm-devel] [PATCH proxmox-datacenter-manager 01/16] server: add locked sdn client helpers X-BeenThere: pdm-devel@lists.proxmox.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Proxmox Datacenter Manager development discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: Proxmox Datacenter Manager development discussion Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: pdm-devel-bounces@lists.proxmox.com Sender: "pdm-devel" T24gOC8yNy8yNSAyOjI3IFBNLCBEb21pbmlrIENzYXBhayB3cm90ZToKPiBzb21lIGNvbW1lbnRz IGlubGluZQo+IAo+IE9uIDgvMjcvMjUgMTozNSBQTSwgU3RlZmFuIEhhbnJlaWNoIHdyb3RlOgo+ PiBBZGQgYSBuZXcgY2xpZW50IHRoYXQgcmVwcmVzZW50cyBhIHJlbW90ZSB3aXRoIGEgbG9ja2Vk IFNETgo+PiBjb25maWd1cmF0aW9uLiBJdCB3b3JrcyBieSBjcmVhdGluZyBhIG5ldyBQdmVDbGll bnQgYW5kIHRoZW4gbG9ja2luZwo+PiB0aGUgU0ROIGNvbmZpZ3VyYXRpb24gdmlhIHRoZSBjbGll bnQuIEl0IGVuc3VyZXMgdGhhdCwgd2hpbGUgdGhlIGxvY2sKPj4gaXMgaGVsZCwgYWxsIG1ldGhv ZHMgYXJlIGNhbGxlZCB3aXRoIHRoZSBwcm9wZXIgbG9jayBzZWNyZXQuIEl0IGFsc28KPj4gcHJv dmlkZXMgaGVscGVycyBmb3IgYXBwbHlpbmcgLyByb2xsYmFja2luZyB0aGUgY29uZmlndXJhdGlv biBhbmQKPj4gcmVsZWFzaW5nIHRoZSBsb2NrLgo+Pgo+PiBBZGRpdGlvbmFsbHksIGEgY29sbGVj dGlvbiB0eXBlIGlzIGludHJvZHVjZWQsIHRoYXQgY2FuIGhvbGQgbXVsdGlwbGUKPj4gbG9ja2Vk IFNETiBjbGllbnRzLiBJdCBwcm92aWRlcyBhIGhlbHBlciBmb3IgZXhlY3V0aW5nIFNETiBBUEkg Y2FsbHMKPj4gYWNyb3NzIG11bHRpcGxlIHJlbW90ZXMgYW5kIHJvbGxpbmcgYmFjayB0aGUgU0RO IGNvbmZpZ3VyYXRpb24gb2YgYWxsCj4+IHJlbW90ZXMgaWYgYW55IEFQSSBjb21tYW5kIG9uIGFu eSByZW1vdGUgZmFpbHMuIFRoaXMgY2xpZW50IHdpbGwgYmUKPj4gdXNlZCBmb3IgbWFraW5nIGNo YW5nZXMgYWNyb3NzIGFsbCByZW1vdGVzIGluIFBETSB3b3JrZXIgdGFza3MuCj4+Cj4+IEFmdGVy IGFwcGx5aW5nLCB3ZSBjYW5ub3Qgcm9sbGJhY2sgdGhlIGNvbmZpZ3VyYXRpb24gLSBzbyB0aGUK Pj4gY29sbGVjdGlvbiBvbmx5IGxvZ3MgYW55IGVycm9ycyAtIHdhaXRzIGZvciB0aGUgZXhlY3V0 aW9uIHRvIGZpbmlzaCBvbgo+PiBhbGwgcmVtb3RlcyBhbmQgdGhlbiByZXR1cm5zIGEgUmVzdWx0 IGluZGljYXRpbmcgd2hldGhlciB0aGUgb3BlcmF0aW9uCj4+IHdhcyBzdWNjZXNzZnVsIG9uICph bGwqIHJlbW90ZXMuCj4gCj4gaW1obyB0aGlzIGlzIGEgYml0IGNvbmZ1c2luZ2x5IHdvcmRlZC4g SSB0aGluayB3aGF0IHlvdSBtZWFuIGlzCj4gdGhhdCB3ZSBjYW4ndCByb2xsYmFjayBhZnRlciAq c3RhcnRpbmcqIHRvIGFwcGx5IGNoYW5nZXMgbm8/Cj4gCj4gc28gb25jZSB3ZSBzdGFydGVkIGFw cGx5aW5nIG9uIHJlbW90ZXMsIHdlIGNhbm5vdCBnbyBiYWNrLgo+IHdoaWNoIG1ha2VzIGtpbmRh IHNlbnNlLCBidXQgdGhlIGZpcnN0IHNlbnRlbmNlIHdvdWxkIHJlYWQKPiBsaWtlICdhZnRlciBh cHBseWluZyBmaW5pc2hlZCcKCkkgd2lsbCB0cnkgdG8gbWFrZSB0aGlzIG1vcmUgY2xlYXIgaW4g dGhlIG5leHQgaXRlcmF0aW9uIQoKPj4KPj4gU2lnbmVkLW9mZi1ieTogU3RlZmFuIEhhbnJlaWNo IDxzLmhhbnJlaWNoQHByb3htb3guY29tPgo+PiAtLS0KPj4gwqAgc2VydmVyL3NyYy9saWIucnPC oMKgwqDCoMKgwqDCoCB8wqDCoCAxICsKPj4gwqAgc2VydmVyL3NyYy9zZG5fY2xpZW50LnJzIHwg Mzg5ICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKwo+PiDCoCAyIGZpbGVz IGNoYW5nZWQsIDM5MCBpbnNlcnRpb25zKCspCj4+IMKgIGNyZWF0ZSBtb2RlIDEwMDY0NCBzZXJ2 ZXIvc3JjL3Nkbl9jbGllbnQucnMKPj4KPj4gZGlmZiAtLWdpdCBhL3NlcnZlci9zcmMvbGliLnJz IGIvc2VydmVyL3NyYy9saWIucnMKPj4gaW5kZXggNDg1YmM3OS4uNzYwZGU3ZCAxMDA2NDQKPj4g LS0tIGEvc2VydmVyL3NyYy9saWIucnMKPj4gKysrIGIvc2VydmVyL3NyYy9saWIucnMKPj4gQEAg LTEzLDYgKzEzLDcgQEAgcHViIG1vZCB0YXNrX3V0aWxzOwo+PiDCoCDCoCBwdWIgbW9kIGNvbm5l Y3Rpb247Cj4+IMKgIHB1YiBtb2QgcGJzX2NsaWVudDsKPj4gK3B1YiBtb2Qgc2RuX2NsaWVudDsK Pj4gwqAgwqAgI1tjZmcoYW55KHJlbW90ZV9jb25maWcgPSAiZmFrZWQiLCB0ZXN0KSldCj4+IMKg IHB1YiBtb2QgdGVzdF9zdXBwb3J0Owo+PiBkaWZmIC0tZ2l0IGEvc2VydmVyL3NyYy9zZG5fY2xp ZW50LnJzIGIvc2VydmVyL3NyYy9zZG5fY2xpZW50LnJzCj4+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0 Cj4+IGluZGV4IDAwMDAwMDAuLjBmZGUzMDcKPj4gLS0tIC9kZXYvbnVsbAo+PiArKysgYi9zZXJ2 ZXIvc3JjL3Nkbl9jbGllbnQucnMKPj4gQEAgLTAsMCArMSwzODkgQEAKPj4gK3VzZSBzdGQ6OnN5 bmM6OkFyYzsKPj4gK3VzZSBzdGQ6OnRpbWU6OkR1cmF0aW9uOwo+PiArCj4+ICt1c2UgYW55aG93 Ojp7c2VsZiwgYmFpbCwgQ29udGV4dH07Cj4+ICsKPj4gK3VzZSBmdXR1cmVzOjp7ZnV0dXJlOjpq b2luX2FsbCwgc3RyZWFtOjpGdXR1cmVzVW5vcmRlcmVkLCBTdHJlYW1FeHQsCj4+IFRyeUZ1dHVy ZUV4dH07Cj4+ICt1c2UgcGRtX2FwaV90eXBlczo6e3JlbW90ZXM6OlJlbW90ZSwgUmVtb3RlVXBp ZH07Cj4+ICt1c2UgcHZlX2FwaV90eXBlczo6ewo+PiArwqDCoMKgIGNsaWVudDo6UHZlQ2xpZW50 LCBDcmVhdGVTZG5Mb2NrLCBDcmVhdGVWbmV0LCBDcmVhdGVab25lLAo+PiBQdmVVcGlkLCBSZWxl YXNlU2RuTG9jaywgUmVsb2FkU2RuLAo+PiArwqDCoMKgIFJvbGxiYWNrU2RuLAo+PiArfTsKPj4g Kwo+PiArdXNlIGNyYXRlOjphcGk6OnB2ZTo6e2Nvbm5lY3QsIGdldF9yZW1vdGV9Owo+PiArCj4+ ICsvLy8gV3JhcHBlciBmb3IgW2BQdmVDbGllbnRgXSBmb3IgcmVwcmVzZW50aW5nIGEgbG9ja2Vk IFNETgo+PiBjb25maWd1cmF0aW9uLgo+PiArLy8vCj4+ICsvLy8gSXQgc3RvcmVzIHRoZSBjbGll bnQgdGhhdCBoYXMgYmVlbiBsb2NrZWQsIGFzIHdlbGwgYXMgdGhlCj4+IGxvY2tfdG9rZW4gdGhh dCBpcyByZXF1aXJlZCBmb3IKPj4gKy8vLyBtYWtpbmcgY2hhbmdlcyB0byB0aGUgU0ROIGNvbmZp Z3VyYXRpb24uIEl0IHByb3ZpZGVzIG1ldGhvZHMgdGhhdAo+PiBwcm94eSB0aGUgcmVzcGVjdGl2 ZSBTRE4KPj4gKy8vLyBlbmRwb2ludHMsIHdoZXJlIGl0IGFkZHMgdGhlIGxvY2tfdG9rZW4gd2hl biBtYWtpbmcgdGhlIHByb3hpZWQKPj4gY2FsbHMuCj4+ICtwdWIgc3RydWN0IExvY2tlZFNkbkNs aWVudCB7Cj4+ICvCoMKgwqAgc2VjcmV0OiBTdHJpbmcsCj4+ICvCoMKgwqAgY2xpZW50OiBBcmM8 ZHluIFB2ZUNsaWVudCArIFNlbmQgKyBTeW5jPiwKPj4gK30KPj4gKwo+PiAraW1wbCBMb2NrZWRT ZG5DbGllbnQgewo+PiArwqDCoMKgIC8vLyBDcmVhdGVzIGEgbmV3IFB2ZUNsaWVudCBmb3IgYSBn aXZlbiBbYFJlbW90ZWBdIGFuZCBsb2NrcyB0aGUKPj4gU0ROIGNvbmZpZ3VyYXRpb24gdGhlcmUu Cj4+ICvCoMKgwqAgLy8vCj4+ICvCoMKgwqAgLy8vICMgRXJyb3JzCj4+ICvCoMKgwqAgLy8vCj4+ ICvCoMKgwqAgLy8vIFRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gYW4gZXJyb3IgaWYgbG9ja2lu ZyB0aGUgcmVtb3RlIGZhaWxzLgo+PiArwqDCoMKgIHB1YiBhc3luYyBmbiBuZXcoCj4+ICvCoMKg wqDCoMKgwqDCoCByZW1vdGU6ICZSZW1vdGUsCj4+ICvCoMKgwqDCoMKgwqDCoCBhbGxvd19wZW5k aW5nOiBpbXBsIEludG88T3B0aW9uPGJvb2w+PiwKPiAKPiBpIGdldCB3aHkgeW91J2QgbWF5YmUg d2FudCB0byBoYXZlIHRoaXMgYXMgYW4gb3B0aW9uLCBidXQKPiB0aGUgb25seSBjYWxsIHNpdGUg c2ltcGx5IHBhc3NlcyBpbiBhIGJvb2xlYW4gaGVyZSwKPiBzbyB3ZSBjb3VsZCBzaW1wbHkgdGFr ZSBhIGJvb2xlYW4gaGVyZSB0b28/Cgp5ZWFoLCBpdCdzIHByb2JhYmx5IGJldHRlciB0byBhc2sg Y2FsbGVycyB0byBleHBsaWNpdGx5IGFsbG93IC8gZGVueQpwZW5kaW5nLgoKPj4gK8KgwqDCoCAp IC0+IFJlc3VsdDxTZWxmLCBhbnlob3c6OkVycm9yPiB7Cj4+ICvCoMKgwqDCoMKgwqDCoCBsZXQg Y2xpZW50ID0gY29ubmVjdChyZW1vdGUpPzsKPj4gKwo+PiArwqDCoMKgwqDCoMKgwqAgbGV0IHBh cmFtcyA9IENyZWF0ZVNkbkxvY2sgewo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBhbGxvd19w ZW5kaW5nOiBhbGxvd19wZW5kaW5nLmludG8oKSwKPj4gK8KgwqDCoMKgwqDCoMKgIH07Cj4+ICsK Pj4gK8KgwqDCoMKgwqDCoMKgIGxldCBzZWNyZXQgPSBjbGllbnQuYWNxdWlyZV9zZG5fbG9jayhw YXJhbXMpLmF3YWl0PzsKPj4gKwo+PiArwqDCoMKgwqDCoMKgwqAgT2soU2VsZiB7IHNlY3JldCwg Y2xpZW50IH0pCj4+ICvCoMKgwqAgfQo+PiArCj4+ICvCoMKgwqAgLy8vIHByb3hpZXMgW2BQdmVD bGllbnQ6OmNyZWF0ZV92bmV0YF0gYW5kIGFkZHMgbG9ja190b2tlbiB0byB0aGUKPj4gcGFzc2Vk IHBhcmFtZXRlcnMgYmVmb3JlCj4+ICvCoMKgwqAgLy8vIG1ha2luZyB0aGUgY2FsbC4KPj4gK8Kg wqDCoCBwdWIgYXN5bmMgZm4gY3JlYXRlX3ZuZXQoJnNlbGYsIG11dCBwYXJhbXM6IENyZWF0ZVZu ZXQpIC0+Cj4+IFJlc3VsdDwoKSwgcHJveG1veF9jbGllbnQ6OkVycm9yPiB7Cj4+ICvCoMKgwqDC oMKgwqDCoCBwYXJhbXMubG9ja190b2tlbiA9IFNvbWUoc2VsZi5zZWNyZXQuY2xvbmUoKSk7Cj4+ ICsKPj4gK8KgwqDCoMKgwqDCoMKgIHNlbGYuY2xpZW50LmNyZWF0ZV92bmV0KHBhcmFtcykuYXdh aXQKPj4gK8KgwqDCoCB9Cj4+ICsKPj4gK8KgwqDCoCAvLy8gcHJveGllcyBbYFB2ZUNsaWVudDo6 Y3JlYXRlX3pvbmVgXSBhbmQgYWRkcyBsb2NrX3Rva2VuIHRvIHRoZQo+PiBwYXNzZWQgcGFyYW1l dGVycyBiZWZvcmUKPj4gK8KgwqDCoCAvLy8gbWFraW5nIHRoZSBjYWxsLgo+PiArwqDCoMKgIHB1 YiBhc3luYyBmbiBjcmVhdGVfem9uZSgmc2VsZiwgbXV0IHBhcmFtczogQ3JlYXRlWm9uZSkgLT4K Pj4gUmVzdWx0PCgpLCBwcm94bW94X2NsaWVudDo6RXJyb3I+IHsKPj4gK8KgwqDCoMKgwqDCoMKg IHBhcmFtcy5sb2NrX3Rva2VuID0gU29tZShzZWxmLnNlY3JldC5jbG9uZSgpKTsKPj4gKwo+PiAr wqDCoMKgwqDCoMKgwqAgc2VsZi5jbGllbnQuY3JlYXRlX3pvbmUocGFyYW1zKS5hd2FpdAo+PiAr wqDCoMKgIH0KPj4gKwo+PiArwqDCoMKgIC8vLyBhcHBsaWVzIHRoZSBjaGFuZ2VzIG1hZGUgd2hp bGUgdGhlIGNsaWVudCB3YXMgbG9ja2VkIGFuZAo+PiByZXR1cm5zIHRoZSBvcmlnaW5hbCBbYFB2 ZUNsaWVudGBdIGlmIHRoZQo+PiArwqDCoMKgIC8vLyBjaGFuZ2VzIGhhdmUgYmVlbiBhcHBsaWVk IHN1Y2Nlc3NmdWxseS4KPj4gK8KgwqDCoCBwdWIgYXN5bmMgZm4gYXBwbHlfYW5kX3JlbGVhc2Uo Cj4+ICvCoMKgwqDCoMKgwqDCoCBzZWxmLAo+PiArwqDCoMKgICkgLT4gUmVzdWx0PChQdmVVcGlk LCBBcmM8ZHluIFB2ZUNsaWVudCArIFNlbmQgKyBTeW5jPiksCj4+IHByb3htb3hfY2xpZW50OjpF cnJvcj4gewo+PiArwqDCoMKgwqDCoMKgwqAgbGV0IHBhcmFtcyA9IFJlbG9hZFNkbiB7Cj4+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgIGxvY2tfdG9rZW46IFNvbWUoc2VsZi5zZWNyZXQuY2xvbmUo KSksCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHJlbGVhc2VfbG9jazogU29tZSh0cnVlKSwK Pj4gK8KgwqDCoMKgwqDCoMKgIH07Cj4+ICsKPj4gK8KgwqDCoMKgwqDCoMKgIHNlbGYuY2xpZW50 Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIC5zZG5fYXBwbHkocGFyYW1zKQo+PiArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCAuYXdhaXQKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgLm1hcCht b3ZlIHx1cGlkfCAodXBpZCwgc2VsZi5jbGllbnQpKQo+PiArwqDCoMKgIH0KPj4gKwo+PiArwqDC oMKgIC8vLyByZWxlYXNlcyB0aGUgbG9jayBvbiB0aGUgW2BQdmVDbGllbnRgXSB3aXRob3V0IGFw cGx5aW5nCj4+IHBlbmRpbmcgY2hhbmdlcy4KPj4gK8KgwqDCoCBwdWIgYXN5bmMgZm4gcmVsZWFz ZSgKPj4gK8KgwqDCoMKgwqDCoMKgIHNlbGYsCj4+ICvCoMKgwqDCoMKgwqDCoCBmb3JjZTogaW1w bCBJbnRvPE9wdGlvbjxib29sPj4sCj4+ICvCoMKgwqAgKSAtPiBSZXN1bHQ8QXJjPGR5biBQdmVD bGllbnQgKyBTZW5kICsgU3luYz4sCj4+IHByb3htb3hfY2xpZW50OjpFcnJvcj4gewo+PiArwqDC oMKgwqDCoMKgwqAgbGV0IHBhcmFtcyA9IFJlbGVhc2VTZG5Mb2NrIHsKPj4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqAgZm9yY2U6IGZvcmNlLmludG8oKSwKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqAgbG9ja190b2tlbjogU29tZShzZWxmLnNlY3JldCksCj4+ICvCoMKgwqDCoMKgwqDCoCB9Owo+ PiArCj4+ICvCoMKgwqDCoMKgwqDCoCBzZWxmLmNsaWVudC5yZWxlYXNlX3Nkbl9sb2NrKHBhcmFt cykuYXdhaXQ/Owo+PiArwqDCoMKgwqDCoMKgwqAgT2soc2VsZi5jbGllbnQpCj4+ICvCoMKgwqAg fQo+PiArCj4+ICvCoMKgwqAgLy8vIHJvbGxzIGJhY2sgYWxsIHBlbmRpbmcgY2hhbmdlcyBhbmQg dGhlbiByZWxlYXNlcyB0aGUgbG9jawo+PiArwqDCoMKgIHB1YiBhc3luYyBmbiByb2xsYmFja19h bmRfcmVsZWFzZSgKPj4gK8KgwqDCoMKgwqDCoMKgIHNlbGYsCj4+ICvCoMKgwqAgKSAtPiBSZXN1 bHQ8QXJjPGR5biBQdmVDbGllbnQgKyBTZW5kICsgU3luYz4sCj4+IHByb3htb3hfY2xpZW50OjpF cnJvcj4gewo+PiArwqDCoMKgwqDCoMKgwqAgbGV0IHBhcmFtcyA9IFJvbGxiYWNrU2RuIHsKPj4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgbG9ja190b2tlbjogU29tZShzZWxmLnNlY3JldCksCj4+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHJlbGVhc2VfbG9jazogU29tZSh0cnVlKSwKPj4gK8Kg wqDCoMKgwqDCoMKgIH07Cj4+ICsKPj4gK8KgwqDCoMKgwqDCoMKgIHNlbGYuY2xpZW50LnJvbGxi YWNrX3Nkbl9jaGFuZ2VzKHBhcmFtcykuYXdhaXQ/Owo+PiArwqDCoMKgwqDCoMKgwqAgT2soc2Vs Zi5jbGllbnQpCj4+ICvCoMKgwqAgfQo+PiArfQo+PiArCj4+ICsvLy8gQ29udGV4dCBmb3IgW2BM b2NrZWRTZG5DbGllbnRgXSBzdG9yZWQgaW4gW2BMb2NrZWRTZG5DbGllbnRzYF0uCj4+ICtwdWIg c3RydWN0IExvY2tlZFNkbkNsaWVudENvbnRleHQ8Qz4gewo+PiArwqDCoMKgIHJlbW90ZV9pZDog U3RyaW5nLAo+PiArwqDCoMKgIGRhdGE6IEMsCj4+ICt9Cj4+ICsKPj4gK2ltcGw8Qz4gTG9ja2Vk U2RuQ2xpZW50Q29udGV4dDxDPiB7Cj4+ICvCoMKgwqAgZm4gbmV3KHJlbW90ZV9pZDogU3RyaW5n LCBkYXRhOiBDKSAtPiBTZWxmIHsKPj4gK8KgwqDCoMKgwqDCoMKgIFNlbGYgeyByZW1vdGVfaWQs IGRhdGEgfQo+PiArwqDCoMKgIH0KPj4gKwo+PiArwqDCoMKgIHB1YiBmbiByZW1vdGVfaWQoJnNl bGYpIC0+ICZzdHIgewo+PiArwqDCoMKgwqDCoMKgwqAgJnNlbGYucmVtb3RlX2lkCj4+ICvCoMKg wqAgfQo+PiArCj4+ICvCoMKgwqAgcHViIGZuIGRhdGEoJnNlbGYpIC0+ICZDIHsKPj4gK8KgwqDC oMKgwqDCoMKgICZzZWxmLmRhdGEKPj4gK8KgwqDCoCB9Cj4+ICt9Cj4+ICsKPj4gKy8vLyBBIGNv bGxlY3Rpb24gYWJzdHJhY3RpbmcgW2BMb2NrZWRTZG5DbGllbnRgXSBmb3IgbXVsdGlwbGUgbG9j a2VkCj4+IHJlbW90ZXMuCj4+ICsvLy8KPj4gKy8vLyBJdCBjYW4gYmUgdXNlZCBmb3IgcnVubmlu ZyB0aGUgc2FtZSBjb21tYW5kIGFjcm9zcyBtdWx0aXBsZQo+PiByZW1vdGVzLCB3aGlsZSBhdXRv bWF0aWNhbGx5Cj4+ICsvLy8gaGFuZGxpbmcgcm9sbGJhY2sgYW5kIHJlbGVhc2luZyBsb2NrcyBp biBjYXNlIG9mIGZhaWx1cmVzIGFjcm9zcwo+PiBhbGwgcmVtb3Rlcy4gSWYgYW4gQVBJIGNhbGwK Pj4gKy8vLyBtYWRlIHRvIG9uZSBvZiB0aGUgcmVtb3RlcyBmYWlscywgdGhlbiB0aGlzIGNsaWVu dCB3aWxsCj4+IGF1dG9tYXRpY2FsbHkgdGFrZSBjYXJlIG9mIHJvbGxpbmcgYmFjawo+PiArLy8v IGFsbCBjaGFuZ2VzIG1hZGUgZHVyaW5nIHRoZSB0cmFuc2FjdGlvbiBhbmQgdGhlbiByZWxlYXNp bmcgdGhlCj4+IGxvY2tzLgo+PiArcHViIHN0cnVjdCBMb2NrZWRTZG5DbGllbnRzPEM+IHsKPj4g K8KgwqDCoCBjbGllbnRzOiBWZWM8KExvY2tlZFNkbkNsaWVudCwgTG9ja2VkU2RuQ2xpZW50Q29u dGV4dDxDPik+LAo+PiArfQo+PiArCj4+ICtpbXBsPEM+IExvY2tlZFNkbkNsaWVudHM8Qz4gewo+ PiArwqDCoMKgIC8vLyBBIGNvbnZlbmllbmNlIGZ1bmN0aW9uIGZvciBjcmVhdGluZyBsb2NrZWQg Y2xpZW50cyBmb3IKPj4gbXVsdGlwbGUgcmVtb3Rlcy4KPj4gK8KgwqDCoCAvLy8KPj4gK8KgwqDC oCAvLy8gRm9yIGVhY2ggcmVtb3RlIGEgQ29udGV4dCBjYW4gYmUgc3BlY2lmaWVkLCB3aGljaCB3 aWxsIGJlCj4+IHN1cHBsaWVkIHRvIGFsbCBjYWxsYmFja3MgdGhhdAo+PiArwqDCoMKgIC8vLyBh cmUgdXNpbmcgdGhpcyBbYExvY2tlZFNkbkNsaWVudHNgXSB0byBtYWtlIGNhbGxzIGFjcm9zcyBh bGwKPj4gcmVtb3Rlcy4KPj4gK8KgwqDCoCAvLy8KPj4gK8KgwqDCoCAvLy8gIyBFcnJvcnMKPj4g K8KgwqDCoCAvLy8KPj4gK8KgwqDCoCAvLy8gVGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiBhbiBl cnJvciBpZjoKPj4gK8KgwqDCoCAvLy8gKiB0aGUgcmVtb3RlIGNvbmZpZ3VyYXRpb24gY2Fubm90 IGJlIHJlYWQKPj4gK8KgwqDCoCAvLy8gKiBhbnkgb2YgdGhlIHN1cHBsaWVkIHJlbW90ZXMgaXMg bm90IGNvbnRhaW5lZCBpbiB0aGUKPj4gY29uZmlndXJhdGlvbgo+PiArwqDCoMKgIC8vLyAqIGxv Y2tpbmcgdGhlIGNvbmZpZ3VyYXRpb24gb24gYW55IHJlbW90ZSBmYWlscwo+PiArwqDCoMKgIC8v Lwo+PiArwqDCoMKgIC8vLyBJZiBuZWNlc3NhcnksIHRoZSBjb25maWd1cmF0aW9uIG9mIGFsbCBy ZW1vdGVzIHdpbGwgYmUKPj4gdW5sb2NrZWQsIGlmIHBvc3NpYmxlLgo+PiArwqDCoMKgIHB1YiBh c3luYyBmbiBmcm9tX3JlbW90ZV9uYW1lczxJOiBJbnRvSXRlcmF0b3I8SXRlbSA9IChTdHJpbmcs IEMpPj4oCj4+ICvCoMKgwqDCoMKgwqDCoCByZW1vdGVfbmFtZXM6IEksCj4+ICvCoMKgwqDCoMKg wqDCoCBhbGxvd19wZW5kaW5nOiBib29sLAo+PiArwqDCoMKgICkgLT4gUmVzdWx0PFNlbGYsIGFu eWhvdzo6RXJyb3I+IHsKPj4gK8KgwqDCoMKgwqDCoMKgIGxldCAocmVtb3RlX2NvbmZpZywgXykg PSBwZG1fY29uZmlnOjpyZW1vdGVzOjpjb25maWcoKT87Cj4+ICsKPj4gK8KgwqDCoMKgwqDCoMKg IGxldCBtdXQgY2xpZW50cyA9IFZlYzo6bmV3KCk7Cj4+ICsKPj4gK8KgwqDCoMKgwqDCoMKgIGZv ciAocmVtb3RlX25hbWUsIGNvbnRleHQpIGluIHJlbW90ZV9uYW1lcyB7Cj4+ICvCoMKgwqDCoMKg wqDCoMKgwqDCoMKgIGxldCByZW1vdGUgPSBnZXRfcmVtb3RlKCZyZW1vdGVfY29uZmlnLCAmcmVt b3RlX25hbWUpPzsKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcHJveG1veF9sb2c6OmluZm8h KCJhY3F1aXJpbmcgbG9jayBmb3IgcmVtb3RlIHt9IiwKPj4gcmVtb3RlLmlkKTsKPj4gKwo+PiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBtYXRjaCBMb2NrZWRTZG5DbGllbnQ6Om5ldyhyZW1vdGUs IGFsbG93X3BlbmRpbmcpLmF3YWl0IHsKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCBPayhjbGllbnQpID0+IHsKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgIGxldCBjb250ZXh0ID0KPj4gTG9ja2VkU2RuQ2xpZW50Q29udGV4dDo6bmV3KHJlbW90ZV9u YW1lLCBjb250ZXh0KTsKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg IGNsaWVudHMucHVzaCgoY2xpZW50LCBjb250ZXh0KSk7Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqAgfQo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIEVycihlcnJv cikgPT4gewo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcHJveG1v eF9sb2c6OmluZm8hKAo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCAiZW5jb3VudGVyZWQgYW4gZXJyb3Igd2hlbiBsb2NraW5nIGEgcmVtb3RlLAo+PiBy ZWxlYXNpbmcgYWxsIGxvY2tzIgo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgKTsKPj4gKwo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAg Zm9yIChjbGllbnQsIF8pIGluIGNsaWVudHMgewo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBwcm94bW94X2xvZzo6aW5mbyEoInJlbGVhc2luZyBsb2Nr IGZvciByZW1vdGUKPj4ge30iLCByZW1vdGUuaWQpOwo+PiArCj4+ICvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGlmIGxldCBFcnIoZXJyb3IpID0KPj4gY2xp ZW50LnJlbGVhc2UoZmFsc2UpLmF3YWl0IHsKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBwcm94bW94X2xvZzo6ZXJyb3IhKAo+PiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqAgImNvdWxkIG5vdCByZWxlYXNlIGxvY2sgZm9yIHJlbW90ZQo+PiB7fToge2Vycm9yOiN9IiwK Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgIHJlbW90ZS5pZAo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgICkKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqAgfQo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgfQo+PiArCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBy ZXR1cm4gRXJyKGVycm9yKS53aXRoX2NvbnRleHQofHwgewo+PiArwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBmb3JtYXQhKCJjb3VsZCBub3QgbG9jayBzZG4g Y29uZmlndXJhdGlvbiBmb3IKPj4gcmVtb3RlIHt9IiwgcmVtb3RlLmlkKQo+PiArwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgfSk7Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqAgfQo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB9Owo+PiArwqDCoMKgwqDC oMKgwqAgfQo+PiArCj4+ICvCoMKgwqDCoMKgwqDCoCBPayhTZWxmIHsgY2xpZW50cyB9KQo+PiAr wqDCoMKgIH0KPj4gKwo+PiArwqDCoMKgIC8vLyBFeGVjdXRlcyB0aGUgZ2l2ZW4gY2FsbGJhY2sg Zm9yIGVhY2ggW2BMb2NrZWRTZG5DbGllbnRgXSBpbgo+PiB0aGlzIGNvbGxlY3Rpb24uCj4+ICvC oMKgwqAgLy8vCj4+ICvCoMKgwqAgLy8vIE9uIGVycm9yLCBpdCB0cmllcyB0byByb2xsYmFjayB0 aGUgY29uZmlndXJhdGlvbiBvZiAqYWxsKgo+PiBsb2NrZWQgY2xpZW50cywgcmVsZWFzZXMgdGhl IGxvY2sKPj4gK8KgwqDCoCAvLy8gYW5kIHJldHVybnMgdGhlIGVycm9yLiBJZiByb2xsYmFja2lu ZyBmYWlscywgYW4gZXJyb3Igd2lsbCBiZQo+PiBsb2dnZWQgYW5kIG5vIGZ1cnRoZXIgYWN0aW9u Cj4+ICvCoMKgwqAgLy8vIGlzIHRha2VuLgo+PiArwqDCoMKgIHB1YiBhc3luYyBmbiBmb3JfZWFj aDxGPihzZWxmLCBjYWxsYmFjazogRikgLT4gUmVzdWx0PFNlbGYsCj4+IGFueWhvdzo6RXJyb3I+ Cj4+ICvCoMKgwqAgd2hlcmUKPj4gK8KgwqDCoMKgwqDCoMKgIEY6IEFzeW5jRm4oCj4+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgICZMb2NrZWRTZG5DbGllbnQsCj4+ICvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgICZMb2NrZWRTZG5DbGllbnRDb250ZXh0PEM+LAo+PiArwqDCoMKgwqDCoMKgwqAgKSAt PiBSZXN1bHQ8KCksIHByb3htb3hfY2xpZW50OjpFcnJvcj4sCj4+ICvCoMKgwqAgewo+PiArwqDC oMKgwqDCoMKgwqAgbGV0IGZ1dHVyZXMgPSBzZWxmLmNsaWVudHMuaXRlcigpLm1hcCh8KGNsaWVu dCwgY29udGV4dCl8IHsKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgY2FsbGJhY2soY2xpZW50 LCBjb250ZXh0KQo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIC5tYXBfb2sofF98 IGNvbnRleHQucmVtb3RlX2lkKCkpCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAg Lm1hcF9lcnIofGVycnwgKGVyciwgY29udGV4dC5yZW1vdGVfaWQoKSkpCj4+ICvCoMKgwqDCoMKg wqDCoCB9KTsKPj4gKwo+PiArwqDCoMKgwqDCoMKgwqAgbGV0IG11dCBlcnJvcnMgPSBmYWxzZTsK Pj4gKwo+PiArwqDCoMKgwqDCoMKgwqAgZm9yIHJlc3VsdCBpbiBqb2luX2FsbChmdXR1cmVzKS5h d2FpdCB7Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIG1hdGNoIHJlc3VsdCB7Cj4+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgT2socmVtb3RlX2lkKSA9PiB7Cj4+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBwcm94bW94X2xvZzo6aW5mbyEoInN1Y2Nj ZXNzZnVsbHkgZXhlY3V0ZWQKPj4gdHJhbnNhY3Rpb24gb24gcmVtb3RlIHtyZW1vdGVfaWR9Iik7 Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgfQo+PiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgIEVycigoZXJyb3IsIHJlbW90ZV9pZCkpID0+IHsKPj4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHByb3htb3hfbG9nOjplcnJvciEoCj4+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICJmYWlsZWQgdG8g ZXhlY3V0ZSB0cmFuc2FjdGlvbiBvbiByZW1vdGUKPj4ge3JlbW90ZV9pZH06IHtlcnJvcjojfSIs Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCApOwo+PiArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZXJyb3JzID0gdHJ1ZTsKPj4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB9Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIH0K Pj4gK8KgwqDCoMKgwqDCoMKgIH0KPj4gKwo+PiArwqDCoMKgwqDCoMKgwqAgaWYgZXJyb3JzIHsK Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgbGV0IG11dCByb2xsYmFja19mdXR1cmVzID0gRnV0 dXJlc1Vub3JkZXJlZDo6bmV3KCk7Cj4+ICsKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZm9y IChjbGllbnQsIGN0eCkgaW4gc2VsZi5jbGllbnRzIHsKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoCBsZXQgY3R4ID0gQXJjOjpuZXcoY3R4KTsKPj4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCBsZXQgZXJyX2N0eCA9IGN0eC5jbG9uZSgpOwo+PiArCj4+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcm9sbGJhY2tfZnV0dXJlcy5wdXNoKAo+PiArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgY2xpZW50Cj4+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIC5yb2xsYmFja19hbmRfcmVsZWFzZSgp Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIC5tYXBf b2sofF98IGN0eCkKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgLm1hcF9lcnIofGVycnwgKGVyciwgZXJyX2N0eCkpLAo+PiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgICk7Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIH0KPj4gKwo+PiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB3aGlsZSBsZXQgU29tZShyZXN1bHQpID0gcm9sbGJhY2tf ZnV0dXJlcy5uZXh0KCkuYXdhaXQgewo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg IG1hdGNoIHJlc3VsdCB7Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCBPayhjdHgpID0+IHsKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqAgcHJveG1veF9sb2c6OmluZm8hKAo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICJzdWNjZXNzZnVsbHkgcm9sbGVkIGJhY2sg Y29uZmlndXJhdGlvbgo+PiBmb3IgcmVtb3RlIHt9IiwKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBjdHgucmVtb3RlX2lkKCkKPj4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKQo+PiArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgfQo+PiArwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqAgRXJyKChfLCBjdHgpKSA9PiB7Cj4+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHByb3htb3hfbG9nOjplcnJvciEoCj4+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAg ImNvdWxkIG5vdCByb2xsYmFjayBjb25maWd1cmF0aW9uIGZvcgo+PiByZW1vdGUge30iLAo+PiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGN0 eC5yZW1vdGVfaWQoKQo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCApCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB9Cj4+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgfQo+PiArwqDCoMKgwqDCoMKgwqDCoMKg wqDCoCB9Cj4gCj4gCj4gaWYgd2UgY291bGQgbm90IHJvbGxiYWNrX2FuZF9yZWxlYXNlLCBzaG91 bGQgd2UgbWF5YmUgY2FsbCByZWxlYXNlIGZvcgo+IHRob3NlID8gVGhlIGFkbWluIGhhcyB0byBj bGVhbnVwIGFueXdheSwgYnV0IGlzIGl0IHBvc3NpYmxlIGZvciBvbmUgdG8KPiByZWxlYXNlIHN1 Y2ggYSBsb2NrICh2aWEgdGhlIGd1aT8pLiBOb3QgdmVyeSBzdXJlIGFib3V0IHRoZSBsb2NrCj4g c2VtYW50aWNzIGhlcmUuCgpJIHRob3VnaHQgYWJvdXQgaXQsIGJ1dCBJIHRoaW5rIGl0IGlzIGJl dHRlciB0byBsZWF2ZSB0aGUgcmVtb3RlIGxvY2tlZApvbiBmYWlsdXJlIHNpbmNlIGFkbWlucyB0 aGVuIGdldCBhbiBlcnJvciBvbiB0aGUgcmVzcGVjdGl2ZSBQVkUgcmVtb3RlCmlmIHRoZXkgd2Fu dCB0byBjaGFuZ2Ugc29tZSBzZXR0aW5ncyB0aGVyZS4KClRoZXkgY2FuIHRoZW4gZWl0aGVyIGV4 cGxpY2l0bHkgcm9sbGJhY2sgdGhlIGNoYW5nZXMgbWFudWFsbHkgb3IgZml4IHRoZQppc3N1ZXMg YW5kIGFwcGx5IHRoZSBjb25maWd1cmF0aW9uIGFueXdheS4KClRoZSBtb3N0IGxpa2VseSBzY2Vu YXJpbyBmb3Igd2h5IHRoaXMgd291bGQgZmFpbCBpcyBuZXR3b3JraW5nIGlzc3VlcwppbW8uIEkg dGhpbmsgaWYgdGhlIHJvbGxiYWNrX2FuZF9yZWxlYXNlIGNhbGwgZmFpbHMsIHRoZXJlIGlzIGEg ZGVjZW50CmNoYW5jZSB0aGF0IGEgc3Vic2VxdWVudCByZWxlYXNlIGNhbGwgd2lsbCBmYWlsIGFz IHdlbGwuIFRoaXMgd291bGQKaW50cm9kdWNlIGEgdGhpcmQgbGV2ZWwgb2YgcmVxdWVzdHMgKyBl cnJvciBoYW5kbGluZywgd2hpY2ggSSdtIG5vdCBzdXJlCmlzIHdvcnRoIHRoZSBwb3RlbnRpYWwg Z2Fpbi4KCkl0IGlzIGFsc28gYW5hbG9nb3VzIHRvIGUuZy4gZmFpbHVyZXMgd2hlbiBzbmFwc2hv dHRpbmcgYSBWTSB3aGVyZSB0aGUKbG9jayBuZWVkcyB0byBiZSBmb3JjaWJseSByZWxlYXNlZCBp aXJjLgoKSSB0aGluayB0aGUgZXJyb3IgbWVzc2FnZSBjb3VsZCBiZSBpbXByb3ZlZCBieSBpbmRp Y2F0aW5nIHRoYXQgdGhlCmNvbmZpZ3VyYXRpb24gaXMgbGVmdCB1bnRvdWNoZWQgYW5kIGFkbWlu cyBuZWVkIHRvIHJvbGxiYWNrIC8gcmVsZWFzZQptYW51YWxseSBhbmQgcG90ZW50aWFsbHkgZXZl biBhIGluZGljYXRvciAvIHBvaW50ZXIgb24gaG93IHRvIGRvIGl0LgoKCj4gYWxzbyB1c2luZyBG dXR1cmVzVW5vcmRlcmVkIGhlcmUgY2FuIG1ha2Ugc2Vuc2UgaGVyZSwgYnV0IGl0J3Mgbm90Cj4g cmVhbGx5IHBhcmFsbGVsLCBzaW5jZSBpdCBvbmx5IGRvZXMgd29yayBkdXJpbmcgYXdhaXQuCj4g Cj4gZG9lcyBpdCBtYWtlIGEgYmlnIGRpZmZlcmVuY2UgKGZvciBtYW55IHJlbW90ZXMpIGluc3Rl YWQgb2YganVzdAo+IGF3YWl0aW5nIHRoZSBmdXR1cmVzIGRpcmVjdGx5PyBvciBqb2luaW5nIHRo ZW0gPwo+IAo+IGkuZS4gaGF2aW5nIGEgbGFyZ2UgbnVtYmVyIG9mIHJlbW90ZXMgdW5vcmRlcmVk IGluIHRoZSBsb2dzIGRvZXMgbm90Cj4gbWFrZSBpdCBlYXNpZXIgdG8gcmVhZC4KPiAKPiBJJ2Qg ZWl0aGVyIGV4cGVjdCB0aGUgcmVtb3RlcyB0byBiZSBzb3J0ZWQsIG9yIHRoZSBmYWlsZWQgcmVt b3RlcyB0byBiZQo+IHNlcGFyYXRlZCBmcm9tIHRoZSBzdWNjZXNzZnVsIG9uZXMgKGUuZy4gb25s eSBsb2dnaW5nIHRoZSBlcnJvciBvbmVzCj4gc2VwYXJhdGVseSBhbmQgb25seSBhIG51bWJlciBm b3IgdGhlIHN1Y2Nlc2Z1bCBvbmVzPykKCkkgdGhpbmsgSSBoYWQgc29tZSBpc3N1ZXMgd2l0aCBq dXN0IHVzaW5nIGEgVmVjIG9mIGZ1dHVyZXMgKyBqb2luX2FsbAoob3duZXJzaGlwICsgYm9ycm93 aW5nIHdpdGggY2xpZW50cyAvIGN0eCkgYW5kIHVzaW5nIEZ1dHVyZXNVbm9yZGVyZWQKcmVzb2x2 ZWQgdGhlIGlzc3VlLiBJJ2xsIGNoZWNrIGFnYWluIG1vcmUgdGhvcm91Z2hseSBvbiB0aGUgcm9v dCBjYXVzZQphbmQgcmVwb3J0IGJhY2suIEkgd2FudGVkIHRvIGltcHJvdmUgaG93IHRoZSByZXF1 ZXN0cyBhcmUgbWFkZSBpbiB0aGUKY2xpZW50IGFueXdheSwgYnV0IGRpZG4ndCB5ZXQgZ2V0IGFy b3VuZCB0byBpdC4gV2UgbWlnaHQgYWxzbyBqdXN0IHdhbnQKdG8gc3Bhd24gYmxvY2tpbmcgdGFz a3MgaW4gdG9raW8gaW5zdGVhZC4KClVzaW5nIEZ1dHVyZXNPcmRlcmVkIHdvdWxkIGJlIGZpbmUg aWYgY29sbGVjdGluZyBpbnRvIGEgVmVjIGRvZXNuJ3QKd29yaywgYnV0IHRoZW4gd2Ugc2hvdWxk IG1heWJlIHNvcnQgdGhlIGNsaWVudHMgaW4gdGhlIGNvbnN0cnVjdG9yCihhbHBoYWJldGljYWxs eSBieSByZW1vdGUgbmFtZT8pIHRvIGVuc3VyZSBkZXRlcm1pbmlzdGljL2NvbnNpc3RlbnQKb3Jk ZXJpbmcgYW55IHRpbWUgYW55IGZ1bmN0aW9uIGluIHRoaXMgY29sbGVjdGlvbiBpcyBjYWxsZWQu CgpBbnl3YXksIEknbGwgbG9vayBpbnRvIGltcHJvdmluZyB0aGlzIGluIHRoZSBuZXh0IHZlcnNp b24gKG1vc3QgbGlrZWx5CmJ5IHNwYXduaW5nIGJsb2NraW5nIHRhc2tzIGluIHRva2lvIGl0c2Vs ZikhCgoKPiBzYW1lIHJlbWFyayBmb3IgJ2FwcGx5X2FuZF9yZWxlYXNlJyBiZWxvdwo+IAo+PiAr Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGJhaWwhKCJydW5uaW5nIHRoZSB0cmFuc2FjdGlv biBmYWlsZWQgb24gYXQgbGVhc3Qgb25lCj4+IHJlbW90ZSEiKTsKPj4gK8KgwqDCoMKgwqDCoMKg IH0KPj4gKwo+PiArwqDCoMKgwqDCoMKgwqAgT2soc2VsZikKPj4gK8KgwqDCoCB9Cj4+ICsKPj4g K8KgwqDCoCAvLyBwdmUtaHR0cC1zZXJ2ZXIgVENQIGNvbm5lY3Rpb24gdGltZW91dCBpcyA1IHNl Y29uZHMsIHVzZSBhCj4+IGxvd2VyIGFtb3VudCB3aXRoIHNvbWUgbWFyZ2luIGZvcgo+PiArwqDC oMKgIC8vIGxhdGVuY3kgaW4gb3JkZXIgdG8gYXZvaWQgcmUtb3BlbmluZyBUQ1AgY29ubmVjdGlv bnMgZm9yIGV2ZXJ5Cj4+IHBvbGxpbmcgcmVxdWVzdC4KPj4gK8KgwqDCoCBjb25zdCBQT0xMSU5H X0lOVEVSVkFMOiBEdXJhdGlvbiA9IER1cmF0aW9uOjpmcm9tX3NlY3MoMyk7Cj4+ICsKPj4gK8Kg wqDCoCAvLy8gQ29udmVuaWVuY2UgZnVuY3Rpb24gZm9yIHBvbGxpbmcgYSBydW5uaW5nIHRhc2sg b24gYSBQVkUgcmVtb3RlLgo+PiArwqDCoMKgIC8vLwo+PiArwqDCoMKgIC8vLyBJdCBwb2xscyBh IGdpdmVuIHRhc2sgb24gYSBnaXZlbiBub2RlLCB3YWl0aW5nIGZvciB0aGUgdGFzawo+PiB0byBm aW5pc2ggc3VjY2Vzc2Z1bGx5Lgo+PiArwqDCoMKgIC8vLwo+PiArwqDCoMKgIC8vLyAjIEVycm9y cwo+PiArwqDCoMKgIC8vLwo+PiArwqDCoMKgIC8vLyBUaGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJu IGFuIGVycm9yIGlmOgo+PiArwqDCoMKgIC8vLyAqIFRoZXJlIHdhcyBhIHByb2JsZW0gcXVlcnlp bmcgdGhlIHRhc2sgc3RhdHVzICh0aGlzIGRvZXMgbm90Cj4+IG5lY2Vzc2FyaWx5IG1lYW4gdGhl IHRhc2sgZmFpbGVkKS4KPj4gK8KgwqDCoCAvLy8gKiBUaGUgdGFzayBmaW5pc2hlZCB1bnN1Y2Nl c3NmdWxseS4KPj4gK8KgwqDCoCBhc3luYyBmbiBwb2xsX3Rhc2soCj4+ICvCoMKgwqDCoMKgwqDC oCBub2RlOiBTdHJpbmcsCj4+ICvCoMKgwqDCoMKgwqDCoCB1cGlkOiBSZW1vdGVVcGlkLAo+PiAr wqDCoMKgwqDCoMKgwqAgY2xpZW50OiBBcmM8ZHluIFB2ZUNsaWVudCArIFNlbmQgKyBTeW5jPiwK Pj4gK8KgwqDCoCApIC0+IFJlc3VsdDxSZW1vdGVVcGlkLCBhbnlob3c6OkVycm9yPiB7Cj4+ICvC oMKgwqDCoMKgwqDCoCBsb29wIHsKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgdG9raW86OnRp bWU6OnNsZWVwKFNlbGY6OlBPTExJTkdfSU5URVJWQUwpLmF3YWl0Owo+PiArCj4+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgIGxldCBzdGF0dXMgPSBjbGllbnQuZ2V0X3Rhc2tfc3RhdHVzKCZub2Rl LAo+PiAmdXBpZC51cGlkKS5hd2FpdD87Cj4+ICsKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAg aWYgIXN0YXR1cy5pc19ydW5uaW5nKCkgewo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgIGlmIHN0YXR1cy5maW5pc2hlZF9zdWNjZXNzZnVsbHkoKSA9PSBTb21lKHRydWUpIHsKPj4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHJldHVybiBPayh1cGlkKTsK Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB9IGVsc2Ugewo+PiArwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgYmFpbCEoCj4+ICvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICJ0YXNrIGRpZCBub3QgZmluaXNoIHN1Y2Nl c3NmdWxseSBvbiByZW1vdGUge30iLAo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCB1cGlkLnJlbW90ZSgpCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCApOwo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIH0K Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgfQo+PiArwqDCoMKgwqDCoMKgwqAgfQo+PiArwqDC oMKgIH0KPj4gKwo+PiArwqDCoMKgIC8vLyBBcHBsaWVzIGFuZCBSZWxvYWRzIHRoZSBTRE4gY29u ZmlndXJhdGlvbiBmb3IgYWxsIGxvY2tlZAo+PiBjbGllbnRzLgo+PiArwqDCoMKgIC8vLwo+PiAr wqDCoMKgIC8vLyBUaGlzIGZ1bmN0aW9uIHRyaWVzIHRvIGFwcGx5IHRoZSBTRE4gY29uZmlndXJh dGlvbiBmb3IgYWxsCj4+IHN1cHBsaWVkIGxvY2tlZCBjbGllbnRzIGFuZCwgaWYKPj4gK8KgwqDC oCAvLy8gaXQgd2FzIHN1Y2Nlc3NmdWwsIHRvIHJlbG9hZCB0aGUgU0ROIGNvbmZpZ3VyYXRpb24g b2YgdGhlCj4+IHJlbW90ZS4gSXQgbG9ncyBzdWNjZXNzIGFuZCBlcnJvcgo+PiArwqDCoMKgIC8v LyBtZXNzYWdlcyB2aWEgcHJveG1veF9sb2cuIFJvbGxiYWNraW5nIGluIGNhc2VzIG9mIGZhaWx1 cmUgaXMKPj4gbm8gbG9uZ2VyIHBvc3NpYmxlLCBzbyB0aGlzCj4+ICvCoMKgwqAgLy8vIGZ1bmN0 aW9uIHRoZW4gcmV0dXJucyBhbiBlcnJvciBpZiBhcHBseWluZyBvciByZWxvYWRpbmcgdGhlCj4+ IGNvbmZpZ3VyYXRpb24gd2FzIHVuc3VjY2Vzc2Z1bAo+PiArwqDCoMKgIC8vLyBvbiBhdCBsZWFz dCBvbmUgcmVtb3RlLgo+PiArwqDCoMKgIC8vLwo+PiArwqDCoMKgIC8vLyAjIEVycm9ycyBUaGlz IGZ1bmN0aW9uIHJldHVybnMgYW4gZXJyb3IgaWYgYXBwbHlpbmcgb3IKPj4gcmVsb2FkaW5nIHRo ZSBjb25maWd1cmF0aW9uIG9uIG9uZQo+PiArwqDCoMKgIC8vLyBvZiB0aGUgcmVtb3RlcyBmYWls ZWQuIEl0IHdpbGwgYWx3YXlzIHdhaXQgZm9yIGFsbCBmdXR1cmVzIHRvCj4+IGZpbmlzaCBhbmQg b25seSByZXR1cm4gYW4KPj4gK8KgwqDCoCAvLy8gZXJyb3IgYWZ0ZXJ3YXJkcy4KPj4gK8KgwqDC oCBwdWIgYXN5bmMgZm4gYXBwbHlfYW5kX3JlbGVhc2Uoc2VsZikgLT4gUmVzdWx0PCgpLCBhbnlo b3c6OkVycm9yPiB7Cj4+ICvCoMKgwqDCoMKgwqDCoCBsZXQgbXV0IGZ1dHVyZXMgPSBGdXR1cmVz VW5vcmRlcmVkOjpuZXcoKTsKPj4gKwo+PiArwqDCoMKgwqDCoMKgwqAgZm9yIChjbGllbnQsIGNv bnRleHQpIGluIHNlbGYuY2xpZW50cyB7Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGxldCBj dHggPSBBcmM6Om5ldyhjb250ZXh0KTsKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgbGV0IGVy cl9jdHggPSBjdHguY2xvbmUoKTsKPj4gKwo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBmdXR1 cmVzLnB1c2goCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgY2xpZW50Cj4+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAuYXBwbHlfYW5kX3JlbGVhc2Uo KQo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgLm1hcF9vayh8KHVw aWQsIGNsaWVudCl8ICgodXBpZCwgY2xpZW50KSwgY3R4KSkKPj4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgIC5tYXBfZXJyKHxlcnJ8IChlcnIsIGVycl9jdHgpKSwKPj4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKTsKPj4gK8KgwqDCoMKgwqDCoMKgIH0KPj4gKwo+PiAr wqDCoMKgwqDCoMKgwqAgbGV0IG11dCByZWxvYWRfZnV0dXJlcyA9IEZ1dHVyZXNVbm9yZGVyZWQ6 Om5ldygpOwo+PiArCj4+ICvCoMKgwqDCoMKgwqDCoCB3aGlsZSBsZXQgU29tZShyZXN1bHQpID0g ZnV0dXJlcy5uZXh0KCkuYXdhaXQgewo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBtYXRjaCBy ZXN1bHQgewo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIE9rKCgodXBpZCwgY2xp ZW50KSwgY3R4KSkgPT4gewo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqAgcHJveG1veF9sb2c6OmluZm8hKAo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCAic3VjY2Vzc2Z1bGx5IGFwcGxpZWQgc2RuIGNvbmZpZyBvbiByZW1v dGUge30iLAo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCBjdHgucmVtb3RlX2lkKCkKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgICk7Cj4+ICsKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGxl dCBPayhyZW1vdGVfdXBpZCkgPQo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCBSZW1vdGVVcGlkOjp0cnlfZnJvbSgoY3R4LnJlbW90ZV9pZCgpLAo+PiB1 cGlkLnRvX3N0cmluZygpLmFzX3N0cigpKSkKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgIGVsc2Ugewo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCBwcm94bW94X2xvZzo6ZXJyb3IhKCJpbnZhbGlkIFVQSUQgcmVjZWl2ZWQK Pj4gZnJvbSBQVkU6IHt1cGlkfSIpOwo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCBjb250aW51ZTsKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgIH07Cj4+ICsKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgIHJlbG9hZF9mdXR1cmVzLnB1c2goCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgIFNlbGY6OnBvbGxfdGFzayh1cGlkLm5vZGUuY2xvbmUoKSwK Pj4gcmVtb3RlX3VwaWQsIGNsaWVudCkKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAubWFwX2Vycihtb3ZlIHxlcnJ8IChlcnIsIGN0eCkp LAo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKTsKPj4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB9Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgRXJyKChlcnJvciwgY3R4KSkgPT4gewo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqAgcHJveG1veF9sb2c6OmVycm9yISgKPj4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgImZhaWxlZCB0byBhcHBseSBzZG4gY29uZmln dXJhdGlvbiBvbiByZW1vdGUKPj4ge306IHtlcnJvcjojfSwgbm90IHJlbG9hZGluZyIsCj4+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGN0eC5yZW1vdGVf aWQoKQo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKTsKPj4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB9Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg IH0KPj4gK8KgwqDCoMKgwqDCoMKgIH0KPj4gKwo+PiArwqDCoMKgwqDCoMKgwqAgcHJveG1veF9s b2c6OmluZm8hKAo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAiV2FpdGluZyBmb3IgcmVsb2Fk IHRhc2tzIHRvIGZpbmlzaCBvbiBhbGwgcmVtb3RlcywgdGhpcwo+PiBjYW4gdGFrZSBhd2hpbGUi Cj4+ICvCoMKgwqDCoMKgwqDCoCApOwo+PiArCj4+ICvCoMKgwqDCoMKgwqDCoCBsZXQgbXV0IGVy cm9ycyA9IGZhbHNlOwo+PiArCj4+ICvCoMKgwqDCoMKgwqDCoCB3aGlsZSBsZXQgU29tZShyZXN1 bHQpID0gcmVsb2FkX2Z1dHVyZXMubmV4dCgpLmF3YWl0IHsKPj4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqAgbWF0Y2ggcmVzdWx0IHsKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBP ayh1cGlkKSA9PiB7Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBw cm94bW94X2xvZzo6aW5mbyEoCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgICJzdWNjZXNzZnVsbHkgcmVsb2FkZWQgY29uZmlndXJhdGlvbiBvbgo+PiBy ZW1vdGUge30iLAo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoCB1cGlkLnJlbW90ZSgpCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoCApOwo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIH0KPj4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBFcnIoKGVycm9yLCBjdHgpKSA9PiB7Cj4+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBwcm94bW94X2xvZzo6ZXJyb3IhKAo+PiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAiY291bGQgbm90 IHJlbG9hZCBjb25maWd1cmF0aW9uIG9uIHJlbW90ZSB7fToKPj4ge2Vycm9yOiN9IiwKPj4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgY3R4LnJlbW90ZV9p ZCgpCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCApOwo+PiArCj4+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBlcnJvcnMgPSB0cnVlOwo+ PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIH0KPj4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqAgfQo+PiArwqDCoMKgwqDCoMKgwqAgfQo+PiArCj4+ICvCoMKgwqDCoMKgwqDCoCBpZiBl cnJvcnMgewo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBiYWlsISgiZmFpbGVkIHRvIGFwcGx5 IGNvbmZpZ3VyYXRpb24gb24gYXQgbGVhc3Qgb25lCj4+IHJlbW90ZSIpOwo+PiArwqDCoMKgwqDC oMKgwqAgfQo+PiArCj4+ICvCoMKgwqDCoMKgwqDCoCBPaygoKSkKPj4gK8KgwqDCoCB9Cj4+ICt9 Cj4gCgoKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCnBk bS1kZXZlbCBtYWlsaW5nIGxpc3QKcGRtLWRldmVsQGxpc3RzLnByb3htb3guY29tCmh0dHBzOi8v bGlzdHMucHJveG1veC5jb20vY2dpLWJpbi9tYWlsbWFuL2xpc3RpbmZvL3BkbS1kZXZlbAo=