From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [212.224.123.68]) by lore.proxmox.com (Postfix) with ESMTPS id 7EA401FF165 for ; Thu, 3 Jul 2025 10:05:11 +0200 (CEST) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 375C0DAFF; Thu, 3 Jul 2025 10:05:52 +0200 (CEST) Message-ID: <4226966c-dd23-4bcf-9ecf-2f129bf1a07b@proxmox.com> Date: Thu, 3 Jul 2025 10:05:47 +0200 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird From: Lukas Wagner To: Proxmox Datacenter Manager development discussion , Dominik Csapak References: <20250512114144.118545-1-l.wagner@proxmox.com> <20250512114144.118545-3-l.wagner@proxmox.com> <112a7d67-79c3-4d23-bee7-8b1d02140104@proxmox.com> Content-Language: de-AT, en-US In-Reply-To: <112a7d67-79c3-4d23-bee7-8b1d02140104@proxmox.com> X-SPAM-LEVEL: Spam detection results: 0 AWL 0.020 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 SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_PASS -0.001 SPF: sender matches SPF record Subject: Re: [pdm-devel] [PATCH proxmox-datacenter-manager v5 2/6] remote tasks: add background task for task polling, use new task cache 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" T24gIDIwMjUtMDUtMTQgMTc6MjcsIERvbWluaWsgQ3NhcGFrIHdyb3RlOgo+PiArCj4+ICsvLy8g VGljayBpbnRlcnZhbCBmb3IgdGhlIHJlbW90ZSB0YXNrIGZldGNoaW5nIHRhc2suCj4+ICsvLy8g VGhpcyBpcyBhbHNvIHRoZSByYXRlIGF0IHdoaWNoIHdlIGNoZWNrIG9uIHRyYWNrZWQgdGFza3Mu Cj4+ICtjb25zdCBUQVNLX1JFRlJFU0hfSU5URVJWQUw6IER1cmF0aW9uID0gRHVyYXRpb246OmZy b21fc2VjcygxMCk7Cj4+ICsKPj4gKy8vLyBJbnRlcnZhbCBpbiBzZWNvbmRzIGF0IHdoaWNoIHRv IGZldGNoIHRoZSBuZXdlc3QgdGFza3MgZnJvbSByZW1vdGVzIChpZiB0aGVyZSBpcyBubyB0cmFj a2VkCj4+ICsvLy8gdGFzayBmb3IgdGhpcyByZW1vdGUpLgo+PiArY29uc3QgUkVHVUxBUl9SRUZS RVNIX0lOVEVSVkFMOiBEdXJhdGlvbiA9IER1cmF0aW9uOjpmcm9tX3NlY3MoNjAwKTsKPiAKPiBp bWhvIHRob3NlIHR3byBhcmUgY29uZnVzaW5nbHkgZG9jdW1lbnRlZCwgaWYgJ1JFR1VMQVJfLi4n IGlzIHVzZWQKPiBmb3IgdGhlIG5vcm1hbCBpbnRlcnZhbCwgd2h5IGRvZXMgJ1RBU0tfUkVGUkUu Licgc2F5IGl0cyB1c2VkIHRvbyBmb3IgdGhhdD8KPiAKCkknbGwgbWFrZSBzdXJlIHRvIHBocmFz ZSBpdCBhIGJpdCBtb3JlIGNsZWFyLiBUaGFua3MhCgo+PiArLy8vIE51bWJlciBvZiBjeWNsZXMg dW50aWwgYSByZWd1bGFyIHJlZnJlc2guCj4+ICtjb25zdCBSRUdVTEFSX1JFRlJFU0hfQ1lDTEVT OiB1NjQgPQo+PiArwqDCoMKgIFJFR1VMQVJfUkVGUkVTSF9JTlRFUlZBTC5hc19zZWNzKCkgLyBU QVNLX1JFRlJFU0hfSU5URVJWQUwuYXNfc2VjcygpOwo+PiArCj4+ICsvLy8gQ2hlY2sgaWYgd2Ug d2FudCB0byByb3RhdGUgb25jZSBldmVyeSBob3VyLgo+IAo+IGNvbW1hcyBhcmUgaW1wb3J0YW50 LCBvbmUgY2FuIHJlYWQgdGhpcyBzZW50ZW5jZSBpbiB0d28gd2F5czoKPiAKPiBDaGVjayBpZiB3 ZSB3YW50IHRvIHJvdGF0ZSwgb25jZSBldmVyeSBob3VyCj4gb3IKPiBDaGVjayBpZiB3YW50IHRv IChyb3RhdGUgb25jZSBldmVyeSBob3VyKSAoYnJhY2tldHMgZm9yIGNsYXJpdHkpCj4gCj4gSU1I TyBhIGJldHRlciB3YXkgdG8gd3JpdGUgdGhhdCBpczoKPiAKPiBDaGVjayBvbmNlIGV2ZXJ5IGhv dXIgaWYgd2Ugd2FudCB0byByb3RhdGUuCgpBY2sKCj4gCj4+ICtjb25zdCBDSEVDS19ST1RBVEVf SU5URVJWQUw6IER1cmF0aW9uID0gRHVyYXRpb246OmZyb21fc2VjcygzNjAwKTsKPj4gKy8vLyBO dW1iZXIgb2YgY3ljbGVzIGJlZm9yZSB3ZSB3YW50IHRvIGNoZWNrIGlmIHdlIHNob3VsZCByb3Rh dGUgdGhlIHRhc2sgYXJjaGl2ZXMuCj4+ICtjb25zdCBDSEVDS19ST1RBVEVfQ1lDTEVTOiB1NjQg PSBDSEVDS19ST1RBVEVfSU5URVJWQUwuYXNfc2VjcygpIC8gVEFTS19SRUZSRVNIX0lOVEVSVkFM LmFzX3NlY3MoKTsKPj4gKwo+PiArLy8vIFJvdGF0ZSBvbmNlIHRoZSBtb3N0IHJlY2VudCBhcmNo aXZlIGZpbGUgaXMgYXQgbGVhc3QgMjQgaG91ciBvbGQuCj4+ICtjb25zdCBST1RBVEVfQUZURVI6 IER1cmF0aW9uID0gRHVyYXRpb246OmZyb21fc2VjcygyNCAqIDM2MDApOwo+PiArCj4+ICsvLy8g S2VlcCA3IGRheXMgd29ydGggb2YgdGFza3MuCj4+ICtjb25zdCBLRUVQX09MRF9GSUxFUzogdTY0 ID0gNzsKPj4gKwo+PiArLy8vIE1heGltdW0gbnVtYmVyIG9mIGNvbmN1cnJlbnQgY29ubmVjdGlv bnMgcGVyIHJlbW90ZS4KPj4gK2NvbnN0IENPTk5FQ1RJT05TX1BFUl9QVkVfUkVNT1RFOiB1c2l6 ZSA9IDU7Cj4+ICsvLy8gTWF4aW11bSBudW1iZXIgb2YgdG90YWwgY29uY3VycmVudCBjb25uZWN0 aW9ucy4gYENPTk5FQ1RJT05TX1BFUl9QVkVfUkVNT1RFYCBpcyB0YWtlbiBpbnRvCj4+ICsvLy8g Y29uc2lkZXJhdGlvbiB3aGVuIGFjY291bnRpbmcgZm9yIHRoZSB0b3RhbCBudW1iZXIgb2YgY29u bmVjdGlvbnMuCj4+ICsvLy8gRm9yIGluc3RhbmNlLCBpZiBgTUFYX0NPTk5FQ1RJT05TYCBpcyAy MCBhbmQgYENPTk5FQ1RJT05TX1BFUl9QVkVfUkVNT1RFYCBpcyA1LCB3ZSBjYW4gY29ubmVjdAo+ PiArLy8vIHRvIDQgUFZFIHJlbW90ZXMgaW4gcGFyYWxsZWwuCj4+ICtjb25zdCBNQVhfQ09OTkVD VElPTlM6IHVzaXplID0gMjA7Cj4+ICsKPj4gKy8vLyBNYXhpbXVtIG51bWJlciBvZiB0YXNrcyB0 byBmZXRjaCBmcm9tIGEgc2luZ2xlIHJlbW90ZSBpbiBvbmUgQVBJIGNhbGwuCj4+ICtjb25zdCBN QVhfVEFTS1NfVE9fRkVUQ0g6IHU2NCA9IDUwMDA7Cj4+ICsKPj4gKy8vLyBTdGFydCB0aGUgcmVt b3RlIHRhc2sgZmV0Y2hpbmcgdGFzawo+PiArcHViIGZuIHN0YXJ0X3Rhc2soKSAtPiBSZXN1bHQ8 KCksIEVycm9yPiB7Cj4+ICvCoMKgwqAgbGV0IGFwaV91aWQgPSBwZG1fY29uZmlnOjphcGlfdXNl cigpPy51aWQ7Cj4+ICvCoMKgwqAgbGV0IGFwaV9naWQgPSBwZG1fY29uZmlnOjphcGlfZ3JvdXAo KT8uZ2lkOwo+PiArwqDCoMKgIGxldCBmaWxlX29wdGlvbnMgPSBDcmVhdGVPcHRpb25zOjpuZXco KQo+PiArwqDCoMKgwqDCoMKgwqAgLm93bmVyKGFwaV91aWQpCj4+ICvCoMKgwqDCoMKgwqDCoCAu Z3JvdXAoYXBpX2dpZCkKPj4gK8KgwqDCoMKgwqDCoMKgIC5wZXJtKE1vZGU6OmZyb21fYml0c190 cnVuY2F0ZSgwbzA3NTApKTsKPj4gK8KgwqDCoCBwcm94bW94X3N5czo6ZnM6OmNyZWF0ZV9wYXRo KFJFTU9URV9UQVNLU19ESVIsIE5vbmUsIFNvbWUoZmlsZV9vcHRpb25zKSk/Owo+IAo+IHRoaXMg c2hvdWxkIHByb2JhYmx5IHVzZSB0aGUgcHJveG1veF9wcm9kdWN0X2NvbmZpZyBjcmF0ZQo+IAoK QWNrLCBJJ2xsIGNoZWNrIHRoYXQgb3V0Cgo+PiArCj4+ICvCoMKgwqAgdG9raW86OnNwYXduKGFz eW5jIG1vdmUgewo+PiArwqDCoMKgwqDCoMKgwqAgbGV0IHRhc2tfc2NoZWR1bGVyID0gc3RkOjpw aW46OnBpbiEocmVtb3RlX3Rhc2tfZmV0Y2hpbmdfdGFzaygpKTsKPj4gK8KgwqDCoMKgwqDCoMKg IGxldCBhYm9ydF9mdXR1cmUgPSBzdGQ6OnBpbjo6cGluIShwcm94bW94X2RhZW1vbjo6c2h1dGRv d25fZnV0dXJlKCkpOwo+PiArwqDCoMKgwqDCoMKgwqAgZnV0dXJlczo6ZnV0dXJlOjpzZWxlY3Qo dGFza19zY2hlZHVsZXIsIGFib3J0X2Z1dHVyZSkuYXdhaXQ7Cj4+ICvCoMKgwqAgfSk7Cj4+ICsK Pj4gK8KgwqDCoCBPaygoKSkKPj4gK30KPj4gKwo+PiArLy8vIFRhc2sgd2hpY2ggaGFuZGxlcyBm ZXRjaGluZyByZW1vdGUgdGFza3MgYW5kIHRhc2sgYXJjaGl2ZSByb3RhdGlvbi4KPj4gKy8vLyBU aGlzIGZ1bmN0aW9uIG5ldmVyIHJldHVybnMuCj4+ICthc3luYyBmbiByZW1vdGVfdGFza19mZXRj aGluZ190YXNrKCkgLT4gISB7Cj4+ICvCoMKgwqAgbGV0IG11dCBjeWNsZSA9IDB1NjQ7Cj4+ICvC oMKgwqAgbGV0IG11dCBpbnRlcnZhbCA9IHRva2lvOjp0aW1lOjppbnRlcnZhbChUQVNLX1JFRlJF U0hfSU5URVJWQUwpOwo+PiArwqDCoMKgIGludGVydmFsLnJlc2V0X2F0KHRhc2tfdXRpbHM6Om5l eHRfYWxpZ25lZF9pbnN0YW50KFRBU0tfUkVGUkVTSF9JTlRFUlZBTC5hc19zZWNzKCkpLmludG8o KSk7Cj4+ICsKPj4gK8KgwqDCoCAvLyBXZSBkb24ndCByZWFsbHkgY2FyZSBhYm91dCBjYXRjaGlu ZyB1cCB0byBtaXNzZWQgdGljaywgd2UganVzdCB3YW50Cj4+ICvCoMKgwqAgLy8gYSBzdGVhZHkg dGljayByYXRlLgo+PiArwqDCoMKgIGludGVydmFsLnNldF9taXNzZWRfdGlja19iZWhhdmlvcih0 b2tpbzo6dGltZTo6TWlzc2VkVGlja0JlaGF2aW9yOjpTa2lwKTsKPj4gKwo+PiArwqDCoMKgIGlm IGxldCBFcnIoZXJyKSA9IGluaXRfY2FjaGUoKS5hd2FpdCB7Cj4+ICvCoMKgwqDCoMKgwqDCoCBs b2c6OmVycm9yISgiZXJyb3Igd2hlbiBpbml0aWFsaXplZCB0YXNrIGNhY2hlOiB7ZXJyfSIpOwo+ PiArwqDCoMKgIH0KPj4gKwo+PiArwqDCoMKgIGxvb3Agewo+PiArwqDCoMKgwqDCoMKgwqAgaW50 ZXJ2YWwudGljaygpLmF3YWl0Owo+PiArwqDCoMKgwqDCoMKgwqAgaWYgbGV0IEVycihlcnIpID0g ZG9fdGljayhjeWNsZSkuYXdhaXQgewo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBsb2c6OmVy cm9yISgiZXJyb3Igd2hlbiBmZXRjaGluZyByZW1vdGUgdGFza3M6IHtlcnJ9Iik7Cj4+ICvCoMKg wqDCoMKgwqDCoCB9Cj4+ICsKPj4gK8KgwqDCoMKgwqDCoMKgIC8vIEF0IGEgcmF0ZSBvZiBvbmUg dGljayBldmVyeSAxMHMgd2Ugd3JhcCBhcm91bmQgaW4gKm9ubHkqIDUgdHJpbGxpb24geWVhcnMs Cj4+ICvCoMKgwqDCoMKgwqDCoCAvLyBiZXR0ZXIgYmUgc2FmZSBhbmQgdXNlIC53cmFwcGluZ19h ZGQoMSkgOikKPj4gK8KgwqDCoMKgwqDCoMKgIGN5Y2xlID0gY3ljbGUud3JhcHBpbmdfYWRkKDEp Owo+PiArwqDCoMKgIH0KPiAKPiB5b3UgZG8gdGhlIGN5Y2xlIGNoZWNrIGhlcmUgbWFudWFsbHks IGJ1dCB0aGlzIGNhbiBiZSBiYWQsIGUuZy4KPiAKPiBpZiBvbmUgY3ljbGUgdGFrZXMgYSBsb25n IHRpbWUgKHNheSAxIG1pbnV0ZSBpbnN0ZWFkIG9mIGEgMTAgc2Vjb25kcykgYW5kIHRoYXQKPiBy ZWd1bGFybHksIHlvdSBmZXRjaCB0aGUgcmVtb3RlcyBub3QgZXZlcnkgMTAgbWludXRlcyAoYXMg dGhlIGNvbW1lbnQgYWJvdmUgd291bGQgaW5kaWNhdGUpCj4gYnV0IG9ubHkgZXZlcnkgaG91cgo+ IAo+IEkgZ3Vlc3MgeW91IHdhbnRlZCB0byBiZSBvbiB0aGUgc2FmZSBzaWRlIGFuZCBub3QgYmVp bmcgdG9vIG92ZXJseSBhZ2dyZXNzaXZlIHdpdGggdGhlIHBvbGxpbmcsCj4gYnV0IGhhdmluZyB0 aGUgZmV0Y2gvcm90YXRpb24gaW50ZXJ2YWwgYmUgdGhhdCBkZXBlbmRlbnQgb24gdGhlIGN5Y2xl IGR1cmF0aW9uIHNlZW1zCj4gYWxzbyBub3QgdmVyeSBnb29kIHRvIG1lLgoKWWVhaCwgdGhlIGlk ZWEgd2FzIHRvIGNvbWJpbmUgdGhlIHJlZ3VsYXIgcG9sbGluZyBhbmQgdGhlIHRyYWNrZWQgdGFz ayBwb2xsaW5nIGludG8gYSBzaW5nbGUgdGFzay4KQnV0IEkgYWdyZWUsIGl0J2QgYmUgcHJvYmFi bHkgYmV0dGVyIHRvIHVzZSB0aW1lc3RhbXBzIGluc3RlYWQgb2YgY3ljbGUgY291bnRzIGZvciBr ZWVwaW5nCnRyYWNrIG9mIHdoYXQgc2hvdWxkIGJlIGRvbmUgd2hlbi4KClRoYW5rcwoKPiAKPj4g K30KPj4gKwo+PiArLy8vIEhhbmRsZSBhIHNpbmdsZSB0aW1lciB0aWNrLgo+PiArLy8vIFdpbGwg aGFuZGxlIGFyY2hpdmUgZmlsZSByb3RhdGlvbiwgcG9sbGluZyBvZiB0cmFja2VkIHRhc2tzIGFu ZCBmZXRjaGluZyBvciByZW1vdGUgdGFza3MuCj4+ICthc3luYyBmbiBkb190aWNrKGN5Y2xlOiB1 NjQpIC0+IFJlc3VsdDwoKSwgRXJyb3I+IHsKPj4gK8KgwqDCoCBsZXQgY2FjaGUgPSByZW1vdGVf dGFza3M6OmdldF9jYWNoZSgpPzsKPj4gKwo+PiArwqDCoMKgIGlmIHNob3VsZF9jaGVja19mb3Jf Y2FjaGVfcm90YXRpb24oY3ljbGUpIHsKPj4gK8KgwqDCoMKgwqDCoMKgIGxvZzo6ZGVidWchKCJj aGVja2luZyBpZiByZW1vdGUgdGFzayBhcmNoaXZlIHNob3VsZCBiZSByb3RhdGVkIik7Cj4+ICvC oMKgwqDCoMKgwqDCoCBpZiByb3RhdGVfY2FjaGUoY2FjaGUuY2xvbmUoKSkuYXdhaXQ/IHsKPj4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgbG9nOjppbmZvISgicm90YXRlZCByZW1vdGUgdGFzayBh cmNoaXZlIik7Cj4+ICvCoMKgwqDCoMKgwqDCoCB9Cj4+ICvCoMKgwqAgfQo+PiArCj4+ICvCoMKg wqAgbGV0IHN0YXRlID0gY2FjaGUucmVhZF9zdGF0ZSgpOwo+PiArCj4+ICvCoMKgwqAgbGV0IG11 dCBhbGxfdGFza3MgPSBIYXNoTWFwOjpuZXcoKTsKPj4gKwo+PiArwqDCoMKgIGxldCB0b3RhbF9j b25uZWN0aW9uc19zZW1hcGhvcmUgPSBBcmM6Om5ldyhTZW1hcGhvcmU6Om5ldyhNQVhfQ09OTkVD VElPTlMpKTsKPj4gK8KgwqDCoCBsZXQgbXV0IGpvaW5fc2V0ID0gSm9pblNldDo6bmV3KCk7Cj4+ ICsKPj4gK8KgwqDCoCAvLyBHZXQgYSBsaXN0IG9mIHJlbW90ZXMgdGhhdCB3ZSBzaG91bGQgcG9s bCBpbiB0aGlzIGN5Y2xlLgo+PiArwqDCoMKgIGxldCByZW1vdGVzID0gcmVtb3Rlc190b19jaGVj ayhjeWNsZSwgJnN0YXRlKS5hd2FpdD87Cj4+ICvCoMKgwqAgZm9yIHJlbW90ZSBpbiByZW1vdGVz IHsKPj4gK8KgwqDCoMKgwqDCoMKgIGxldCBzaW5jZSA9IGdldF9jdXRvZmZfdGltZXN0YW1wKCZy ZW1vdGUsICZzdGF0ZSk7Cj4+ICsKPj4gK8KgwqDCoMKgwqDCoMKgIGxldCBwZXJtaXQgPSBpZiBy ZW1vdGUudHkgPT0gUmVtb3RlVHlwZTo6UHZlIHsKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAg Ly8gQWNxdWlyZSBtdWx0aXBsZSBwZXJtaXRzLCBmb3IgUFZFIHJlbW90ZXMgd2Ugd2FudAo+PiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAvLyB0byBtdWx0aXBsZSBub2RlcyBpbiBwYXJhbGxlbC4K Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgLy8KPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAg Ly8gYC51bndyYXAoKWAgaXMgc2FmZSwgd2UgbmV2ZXIgY2xvc2UgdGhlIHNlbWFwaG9yZS4KPj4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgQXJjOjpjbG9uZSgmdG90YWxfY29ubmVjdGlvbnNfc2Vt YXBob3JlKQo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIC5hY3F1aXJlX21hbnlf b3duZWQoQ09OTkVDVElPTlNfUEVSX1BWRV9SRU1PVEUgYXMgdTMyKQo+PiArwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgIC5hd2FpdAo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgIC51bndyYXAoKQo+IAo+IHdvdWxkIGl0IGJlIHBvc3NpYmxlIHRvIGFjcXVpcmUgdGhlIGNv bm5lY3Rpb24gc2VtYXBob3JlcyBkeW5hbWljYWxsIGluc2lkZSB0aGUKPiBgZmV0Y2hfdGFza3Ng IGNhbGwgdXAgdG8gdGhlIG1heGltdW0/Cj4gCj4gdGhhdCB3YXksIHdlIGNvdWxkIGUuZy4gY29u bmVjdCB0byAyMCByZW1vdGVzIHdpdGggb25lIGhvc3QgaW4gcGFyYWxsZWwKPiBpbnN0ZWFkIG9m IGFsd2F5cyBoYXZpbmcgbWF4aW11bSBvZiA0ID8KPiAobm90IHN1cmUgYWJvdXQgdGhlIHRva2lv IHNlbWFwaG9yZSBwb3NzaWJpbGl0aWVzIGhlcmUpCj4gCj4gSSdkIHN0aWxsIGxpbWl0IGl0IHRv IENPTk5FQ1RJT05TX1BFUl9QVkVfUkVNT1RFIGZvciBlYWNoIHJlbW90ZSwKPiBidXQgaW4gY2Fz ZSBvbmUgcmVtb3RlIGhhcyBsZXNzIG5vZGVzLCB3ZSBjb3VsZCB1dGlsaXplIHRoZSBjb25uZWN0 aW9uIGNvdW50Cj4gZm9yIG1vcmUgcmVtb3RlcywgZG9pbmcgbW9yZSB3b3JrIGluIHBhcmFsbGVs LgoKSUlSQyB0aGVyZSB3YXMgc29tZSBwcm9ibGVtIHdpdGggYWxsb2NhdGluZyB0aGVzZSBvbiBk ZW1hbmQsIEkgdGhpbmsgdGhlcmUgd2FzIHNvbWUgcG90ZW50aWFsCmZvciBhIGRlYWRsb2NrIC0g dGhvdWdoIEkgY2FuJ3QgY29tZSB1cCB3aXRoIHRoZSAnd2h5JyByaWdodCBub3cuIEknbGwgY2hl Y2sgYWdhaW4gYW5kCmFkZCBzb21lIGNvbW1lbnQgaWYgSSByZW1lbWJlciB0aGUgcmVhc29uIGFn YWluLgoKPiAKPj4gK8KgwqDCoMKgwqDCoMKgIH0gZWxzZSB7Cj4+ICvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgIC8vIEZvciBQQlMgcmVtb3RlcyB3ZSBvbmx5IGhhdmUgYSBzaW5nbGUgb3V0Z29pbmcg Y29ubmVjdGlvbgo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAvLwo+PiArwqDCoMKgwqDCoMKg wqDCoMKgwqDCoCAvLyBgLnVud3JhcCgpYCBpcyBzYWZlLCB3ZSBuZXZlciBjbG9zZSB0aGUgc2Vt YXBob3JlLgo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBBcmM6OmNsb25lKCZ0b3RhbF9jb25u ZWN0aW9uc19zZW1hcGhvcmUpCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgLmFj cXVpcmVfb3duZWQoKQo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIC5hd2FpdAo+ PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIC51bndyYXAoKQo+PiArwqDCoMKgwqDC oMKgwqAgfTsKPj4gKwo+PiArwqDCoMKgwqDCoMKgwqAgam9pbl9zZXQuc3Bhd24oYXN5bmMgbW92 ZSB7Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGxvZzo6ZGVidWchKCJmZXRjaGluZyByZW1v dGUgdGFza3MgZm9yICd7fScgc2luY2Uge3NpbmNlfSIsIHJlbW90ZS5pZCk7Cj4+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgIGxldCB0YXNrcyA9IGZldGNoX3Rhc2tzKCZyZW1vdGUsIHNpbmNlKS5h d2FpdC5tYXBfZXJyKHxlcnJ8IHsKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBm b3JtYXRfZXJyISgiY291bGQgbm90IGZldGNoIHRhc2tzIGZyb20gcmVtb3RlICd7fSc6IHtlcnJ9 IiwgcmVtb3RlLmlkKQo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB9KTsKPj4gKwo+PiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoCBkcm9wKHBlcm1pdCk7Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgIHRhc2tzCj4+ICvCoMKgwqDCoMKgwqDCoCB9KTsKPj4gK8KgwqDCoCB9Cj4+ICsKPj4gKwo+ PiArLy8vIFJldHVybiBsaXN0IG9mIHJlbW90ZXMgdGhhdCBhcmUgdG8gYmUgcG9sbGVkIGluIHRo aXMgY3ljbGUuCj4+ICsvLy8KPj4gKy8vLyBJZiBgY3ljbGVgIGlzIGEgbXVsdGlwbGUgb2YgYFJF R1VMQVJfUkVGUkVTSF9DWUNMRVNgLCB0aGUgZnVuY3Rpb24gd2lsbAo+PiArLy8vIHJldHVybiBh bGwgcmVtb3RlcyBmcm9tIHRoZSByZW1vdGUgY29uZmlnLiBUaGlzIGVuc3VyZXMgdGhhdAo+PiAr Ly8vIGFsbCByZW1vdGVzIGFyZSBwb2xsZWQgYXQgcmVndWxhciBpbnRlcnZhbHMuCj4+ICsvLy8g SW4gYW55IG90aGVyIGNhc2Ugd2Ugb25seSByZXR1cm4gcmVtb3RlcyB3aGljaCBjdXJyZW50bHkg aGF2ZSBhIHRyYWNrZWQKPj4gKy8vLyB0YXNrLgo+PiArLy8vIE9uIGRhZW1vbiBzdGFydHVwICh3 aGVuIGN5Y2xlIGlzIDApIHdlIHJldHVybiBhbGwgcmVtb3RlcyB0byBlbnN1cmUKPj4gKy8vLyB0 aGF0IHdlIGdldCBhbiB1cC10by1kYXRlIHRhc2sgbGlzdCBmcm9tIGFsbCByZW1vdGVzLgo+PiAr YXN5bmMgZm4gcmVtb3Rlc190b19jaGVjayhjeWNsZTogdTY0LCBzdGF0ZTogJlN0YXRlKSAtPiBS ZXN1bHQ8VmVjPFJlbW90ZT4sIEVycm9yPiB7Cj4+ICvCoMKgwqAgbGV0IChjb25maWcsIF8pID0g dG9raW86OnRhc2s6OnNwYXduX2Jsb2NraW5nKHBkbV9jb25maWc6OnJlbW90ZXM6OmNvbmZpZyku YXdhaXQ/PzsKPj4gKwo+PiArwqDCoMKgIGxldCBhbGwgPSBjeWNsZSAlIFJFR1VMQVJfUkVGUkVT SF9DWUNMRVMgPT0gMDsKPj4gKwo+PiArwqDCoMKgIGlmIGFsbCB7Cj4+ICvCoMKgwqDCoMKgwqDC oCBPayhjb25maWcuaW50b19pdGVyKCkubWFwKHwoXywgc2VjdGlvbil8IHNlY3Rpb24pLmNvbGxl Y3QoKSkKPj4gK8KgwqDCoCB9IGVsc2Ugewo+PiArwqDCoMKgwqDCoMKgwqAgT2soY29uZmlnCj4+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIC5pbnRvX2l0ZXIoKQo+PiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCAuZmlsdGVyX21hcCh8KG5hbWUsIHJlbW90ZSl8IHsKPj4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCBpZiBsZXQgU29tZSh0cmFja2VkKSA9IHN0YXRlLnRyYWNrZWRfdGFz a3MuZ2V0KCZuYW1lKSB7Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCBpZiAhdHJhY2tlZC5pc19lbXB0eSgpIHsKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqAgU29tZShyZW1vdGUpCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoCB9IGVsc2Ugewo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBOb25lCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCB9Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgfSBlbHNl IHsKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIE5vbmUKPj4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB9Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg IH0pCj4gCj4gaSB0aGluayB0aGlzIGNvdWxkIGJlIG1vcmUgc3VjY2luY3RseSB3cml0dGVuIGFz Ogo+IAo+IHN0YXRlCj4gwqDCoMKgIC50cmFja2VkX3Rhc2tzCj4gwqDCoMKgIC5nZXQoJm5hbWUp Cj4gwqDCoMKgIC5hbmRfdGhlbih8dHJhY2tlZHwgKCF0cmFja2VkLmlzX2VtcHR5KCkpLnRoZW5f c29tZShyZW1vdGUpKQo+IAoKVGhhbmtzLCB3aWxsIGRvIHRoYXQuCgo+PiArwqDCoMKgwqDCoMKg wqDCoMKgwqDCoCAuY29sbGVjdCgpKQo+PiArwqDCoMKgIH0KPj4gK30KPj4gKwo+PiArLy8vIEdl dCB0aGUgdGltZXN0YW1wIGZyb20gd2hpY2ggb24gd2Ugc2hvdWxkIGZldGNoIHRhc2tzIGZvciBh IGdpdmVuIHJlbW90ZS4KPj4gKy8vLyBUaGUgcmV0dXJuZWQgdGltZXN0YW1wIGlzIGEgVU5JWCB0 aW1lc3RhbXAgKGluIHNlY29uZHMpLgo+PiArZm4gZ2V0X2N1dG9mZl90aW1lc3RhbXAocmVtb3Rl OiAmUmVtb3RlLCBzdGF0ZTogJlN0YXRlKSAtPiBpNjQgewo+PiArwqDCoMKgIGxldCBvbGRlc3Rf YWN0aXZlID0gc3RhdGUub2xkZXN0X2FjdGl2ZV90YXNrLmdldCgmcmVtb3RlLmlkKS5jb3BpZWQo KTsKPj4gK8KgwqDCoCBsZXQgeW91bmdlc3RfYXJjaGl2ZWQgPSBzdGF0ZS5tb3N0X3JlY2VudF9h cmNoaXZlX3N0YXJ0dGltZS5nZXQoJnJlbW90ZS5pZCkuY29waWVkKCk7Cj4+ICsKPj4gK8KgwqDC oCBtYXRjaCAob2xkZXN0X2FjdGl2ZSwgeW91bmdlc3RfYXJjaGl2ZWQpIHsKPj4gK8KgwqDCoMKg wqDCoMKgIChOb25lLCBOb25lKSA9PiAwLAo+PiArwqDCoMKgwqDCoMKgwqAgKE5vbmUsIFNvbWUo eW91bmdlc3RfYXJjaGl2ZWQpKSA9PiB5b3VuZ2VzdF9hcmNoaXZlZCwKPj4gK8KgwqDCoMKgwqDC oMKgIChTb21lKG9sZGVzdF9hY3RpdmUpLCBOb25lKSA9PiBvbGRlc3RfYWN0aXZlLAo+PiArwqDC oMKgwqDCoMKgwqAgKFNvbWUob2xkZXN0X2FjdGl2ZSksIFNvbWUoeW91bmdlc3RfYWN0aXZlKSkg PT4gb2xkZXN0X2FjdGl2ZS5taW4oeW91bmdlc3RfYWN0aXZlKSwKPj4gK8KgwqDCoCB9Cj4+ICt9 Cj4+ICsKPj4gKy8vLyBSb3RhdGUgdGhlIHRhc2sgY2FjaGUgaWYgbmVjZXNzYXJ5Lgo+PiArLy8v Cj4+ICsvLy8gUmV0dXJucyBPayh0cnVlKSB0aGUgY2FjaGUncyBmaWxlcyB3ZXJlIHJvdGF0ZWQu Cj4+ICthc3luYyBmbiByb3RhdGVfY2FjaGUoY2FjaGU6IFRhc2tDYWNoZSkgLT4gUmVzdWx0PGJv b2wsIEVycm9yPiB7Cj4+ICvCoMKgwqAgdG9raW86OnRhc2s6OnNwYXduX2Jsb2NraW5nKG1vdmUg fHwgewo+PiArwqDCoMKgwqDCoMKgwqAgY2FjaGUucm90YXRlKAo+PiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCBwcm94bW94X3RpbWU6OmVwb2NoX2k2NCgpLAo+PiArwqDCoMKgwqDCoMKgwqDCoMKg wqDCoCBST1RBVEVfQUZURVIuYXNfc2VjcygpLAo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBL RUVQX09MRF9GSUxFUywKPj4gK8KgwqDCoMKgwqDCoMKgICkKPj4gK8KgwqDCoCB9KQo+PiArwqDC oMKgIC5hd2FpdD8KPj4gK30KPiAKPiBpbiBwYnMsIHdlIHN0YXJ0IGEgd29ya2VyIHRhc2sgZm9y IHRoZSBsb2cgcm90YXRpb24sIG1heWJlIHdlIHdhbnQgaGVyZSB0b28gPwo+IAoKSG1tbSwgZG8g d2UgaGF2ZSBhbnkgZ3VpZGVsaW5lcyB3aGVuIHNvbWV0aGluZyBzaG91bGQgYmUgYSB3b3JrZXIg dGFzayBhbmQgd2hlbiBub3Q/IApJJ20gbm90IG9wcG9zZWQgdG8gaXQsIGJ1dCBJJ20ganVzdCBj dXJpb3VzIHdoZXJlIHRvIGRyYXcgdGhlIGxpbmUuCkFsc28sIGJlaW5nIGEgd29ya2VyIHRhc2sg YWxzbyBpbXBsaWVzIHRoYXQgaXQgY2FuIGJlIGNhbmNlbGxlZCwgcmlnaHQ/IERvZXMgdGhhdCBt YWtlIHNlbnNlIGZvcgpzb21ldGhpbmcgbGlrZSB0aGlzPwoKPj4gKwo+PiArLy8vIEZldGNoIHRh c2tzIChhY3RpdmUgYW5kIGZpbmlzaGVkKSBmcm9tIGEgcmVtb3RlCj4+ICsvLy8gYHNpbmNlYCBp cyBhIFVOSVggdGltZXN0YW1wIChzZWNvbmRzKS4KPj4gK2FzeW5jIGZuIGZldGNoX3Rhc2tzKHJl bW90ZTogJlJlbW90ZSwgc2luY2U6IGk2NCkgLT4gUmVzdWx0PChTdHJpbmcsIEFkZFRhc2tzKSwg RXJyb3I+IHsKPj4gK8KgwqDCoCBsZXQgbXV0IHRhc2tzID0gVmVjOjpuZXcoKTsKPj4gKwo+PiAr wqDCoMKgIGxldCBtdXQgYWxsX3N1Y2Nlc3NmdWwgPSB0cnVlOwo+PiArCj4+ICvCoMKgwqAgbWF0 Y2ggcmVtb3RlLnR5IHsKPj4gK8KgwqDCoMKgwqDCoMKgIFJlbW90ZVR5cGU6OlB2ZSA9PiB7Cj4+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGxldCBwZXJfcmVtb3RlX3NlbWFwaG9yZSA9IEFyYzo6 bmV3KFNlbWFwaG9yZTo6bmV3KENPTk5FQ1RJT05TX1BFUl9QVkVfUkVNT1RFKSk7Cj4+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgIGxldCBtdXQgam9pbl9zZXQgPSBKb2luU2V0OjpuZXcoKTsKCgot LSAKLSBMdWthcwoKCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fXwpwZG0tZGV2ZWwgbWFpbGluZyBsaXN0CnBkbS1kZXZlbEBsaXN0cy5wcm94bW94LmNvbQpo dHRwczovL2xpc3RzLnByb3htb3guY29tL2NnaS1iaW4vbWFpbG1hbi9saXN0aW5mby9wZG0tZGV2 ZWwK