Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1q9g7c-0002rV-Ax for pgsql-hackers@arkaria.postgresql.org; Thu, 15 Jun 2023 06:06:16 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1q9g7a-0005bv-EE for pgsql-hackers@arkaria.postgresql.org; Thu, 15 Jun 2023 06:06:14 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1q9g7Z-0005bm-NX for pgsql-hackers@lists.postgresql.org; Thu, 15 Jun 2023 06:06:14 +0000 Received: from oss.nttdata.com ([49.212.34.109]) by makus.postgresql.org with esmtps (TLS1.2) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1q9g7Q-002IHD-Sl for pgsql-hackers@lists.postgresql.org; Thu, 15 Jun 2023 06:06:12 +0000 Received: from oss.nttdata.com (localhost [127.0.0.1]) by oss.nttdata.com (Postfix) with ESMTPA id E9E62604CB for ; Thu, 15 Jun 2023 15:06:01 +0900 (JST) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.8 at oss.nttdata.com MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=_2e1da3179149182792001d5129ee6bec" Content-Transfer-Encoding: 7bit Date: Thu, 15 Jun 2023 15:06:01 +0900 From: Masahiro Ikeda To: pgsql-hackers@lists.postgresql.org Subject: Support to define custom wait events for extensions User-Agent: Roundcube Webmail/1.4.11 Message-ID: X-Sender: ikedamsh@oss.nttdata.com List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --=_2e1da3179149182792001d5129ee6bec Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset=US-ASCII; format=flowed Hi, Currently, only one PG_WAIT_EXTENSION event can be used as a wait event for extensions. Therefore, in environments with multiple extensions are installed, it could take time to identify which extension is the bottleneck. So, I'd like to support new APIs to define custom wait events for extensions. It's discussed in [1]. I made patches to realize it. Although I have some TODOs, I want to know your feedbacks. Please feel free to comment. # Implementation of new APIs I implemented 2 new APIs for extensions. * RequestNamedExtensionWaitEventTranche() * GetNamedExtensionWaitEventTranche() Extensions can request custom wait events by calling RequestNamedExtensionWaitEventTranche(). After that, use GetNamedExtensionWaitEventTranche() to get the wait event information. The APIs usage example by extensions are following. ``` shmem_request_hook = shmem_request; shmem_startup_hook = shmem_startup; static void shmem_request(void) { /* request a custom wait event */ RequestNamedExtensionWaitEventTranche("custom_wait_event"); } static void shmem_startup(void) { /* get the wait event information */ custom_wait_event = GetNamedExtensionWaitEventTranche("custom_wait_event"); } void extension_funtion() { (void) WaitLatch(MyLatch, WL_LATCH_SET | WL_TIMEOUT | WL_EXIT_ON_PM_DEATH, 10L * 1000, custom_wait_event); /* notify core with custom wait event */ ResetLatch(MyLatch); } ``` # Implementation overview I referenced the implementation of RequestNamedLWLockTranche()/GetNamedLWLockTranche(). (0001-Support-to-define-custom-wait-events-for-extensions.patch) Extensions calls RequestNamedExtensionWaitEventTranche() in shmem_request_hook() to request wait events to be used by each extension. In the core, the requested wait events are dynamically registered in shared memory. The extension then obtains the wait event information with GetNamedExtensionWaitEventTranche() and uses the value to notify the core that it is waiting. When a string representing of the wait event is requested, it returns the name defined by calling RequestNamedExtensionWaitEventTranche(). # PoC extension I created the PoC extension and you can use it, as shown here: (0002-Add-a-extension-to-test-custom-wait-event.patch) 1. start PostgreSQL with the following configuration shared_preload_libraries = 'inject_wait_event' 2. check wait events periodically psql-1=# SELECT query, wait_event_type, wait_event FROM pg_stat_activity WHERE backend_type = 'client backend' AND pid != pg_backend_pid() ; psql-1=# \watch 3. execute a function to inject a wait event psql-2=# CREATE EXTENSION inject_wait_event; psql-2=# SELECT inject_wait_event(); 4. check the custom wait event You can see the following results of psql-1. (..snip..) query | wait_event_type | wait_event -----------------------------+-----------------+------------ SELECT inject_wait_event(); | Extension | Extension (1 row) (..snip..) (...about 10 seconds later ..) query | wait_event_type | wait_event -----------------------------+-----------------+------------------- SELECT inject_wait_event(); | Extension | custom_wait_event # requested wait event by the extension! (1 row) (..snip..) # TODOs * tests on windows (since I tested on Ubuntu 20.04 only) * add custom wait events for existing contrib modules (ex. postgres_fdw) * add regression code (but, it seems to be difficult) * others? (Please let me know) [1] https://www.postgresql.org/message-id/81290a48-b25c-22a5-31a6-3feff5864fe3%40gmail.com Regards, -- Masahiro Ikeda NTT DATA CORPORATION --=_2e1da3179149182792001d5129ee6bec Content-Transfer-Encoding: base64 Content-Type: text/x-diff; name=0001-Support-to-define-custom-wait-events-for-extensions.patch Content-Disposition: attachment; filename=0001-Support-to-define-custom-wait-events-for-extensions.patch; size=17096 RnJvbSA1OWExMTg0MDJlNWU1OTY4NWZiOWUwZmIwODY4NzJlMjVhNDA1NzM2IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBNYXNhaGlybyBJa2VkYSA8bWFzYWhpcm8uaWtlZGEudXNAaGNv Lm50dC5jby5qcD4KRGF0ZTogVGh1LCAxNSBKdW4gMjAyMyAxMjo1NzoyOSArMDkwMApTdWJqZWN0 OiBbUEFUQ0ggMi8zXSBTdXBwb3J0IHRvIGRlZmluZSBjdXN0b20gd2FpdCBldmVudHMgZm9yIGV4 dGVuc2lvbnMuCgpDdXJyZW50bHksIG9ubHkgb25lIFBHX1dBSVRfRVhURU5TSU9OIGV2ZW50IGNh biBiZSB1c2VkIGFzIGEKd2FpdCBldmVudCBmb3IgZXh0ZW5zaW9ucy4gVGhlcmVmb3JlLCBpbiBl bnZpcm9ubWVudHMgd2l0aCBtdWx0aXBsZQpleHRlbnNpb25zIGFyZSBpbnN0YWxsZWQsIGl0IGNv dWxkIHRha2UgdGltZSB0byBpZGVudGlmeSBib3R0bGVuZWNrcy4KClRoaXMgY29tbWl0IGFsbG93 cyBkZWZpbmluZyBjdXN0b20gd2FpdCBldmVudHMgZm9yIGV4dGVuc2lvbnMgYW5kCmludHJvZHVj ZXMgYSBuZXcgQVBJIGNhbGxlZCBSZXF1ZXN0TmFtZWRFeHRlbnNpb25XYWl0RXZlbnRUcmFuY2hl KCkvCkdldE5hbWVkRXh0ZW5zaW9uV2FpdEV2ZW50VHJhbmNoZSgpLgoKVGhlc2UgcmVmZXIgdG8g UmVxdWVzdE5hbWVkTFdMb2NrVHJhbmNoZSgpL0dldE5hbWVkTFdMb2NrVHJhbmNoZSgpLApidXQg ZG8gbm90IHJlcXVpcmUgYXMgbXVjaCBmbGV4aWJpbGl0eSBhcyBMV0xvY2sgYW5kIGNhbiBiZSBp bXBsZW1lbnRlZAptb3JlIHNpbXBseS4KClRoZSBleHRlbnNpb24gY2FsbHMgUmVxdWVzdE5hbWVk RXh0ZW5zaW9uV2FpdEV2ZW50VHJhbmNoZSgpIGluCnNobWVtX3JlcXVlc3RfaG9vaygpIHRvIHJl cXVlc3Qgd2FpdCBldmVudHMgdG8gYmUgdXNlZCBieSBlYWNoIGV4dGVuc2lvbi4KSW4gdGhlIGNv cmUsIHRoZSByZXF1ZXN0ZWQgd2FpdCBldmVudHMgYXJlIGR5bmFtaWNhbGx5IHJlZ2lzdGVyZWQg aW4gc2hhcmVkCm1lbW9yeS4gVGhlIGV4dGVuc2lvbiB0aGVuIG9idGFpbnMgdGhlIHdhaXQgZXZl bnQgaW5mb3JtYXRpb24gd2l0aApHZXROYW1lZEV4dGVuc2lvbldhaXRFdmVudFRyYW5jaGUoKSBh bmQgdXNlcyB0aGUgdmFsdWUgdG8gbm90aWZ5IHRoZSBjb3JlCnRoYXQgaXQgaXMgd2FpdGluZy4K LS0tCiBzcmMvYmFja2VuZC9wb3N0bWFzdGVyL3Bvc3RtYXN0ZXIuYyAgICAgfCAgIDYgKwogc3Jj L2JhY2tlbmQvc3RvcmFnZS9pcGMvaXBjaS5jICAgICAgICAgIHwgICAzICsKIHNyYy9iYWNrZW5k L3N0b3JhZ2UvaXBjL3NobWVtLmMgICAgICAgICB8ICAgMyArLQogc3JjL2JhY2tlbmQvdXRpbHMv YWN0aXZpdHkvd2FpdF9ldmVudC5jIHwgMzAzICsrKysrKysrKysrKysrKysrKysrKysrLQogc3Jj L2luY2x1ZGUvdXRpbHMvd2FpdF9ldmVudC5oICAgICAgICAgIHwgIDMyICsrKwogNSBmaWxlcyBj aGFuZ2VkLCAzNDUgaW5zZXJ0aW9ucygrKSwgMiBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9z cmMvYmFja2VuZC9wb3N0bWFzdGVyL3Bvc3RtYXN0ZXIuYyBiL3NyYy9iYWNrZW5kL3Bvc3RtYXN0 ZXIvcG9zdG1hc3Rlci5jCmluZGV4IDRjNDkzOTNmYzUuLjUwYWZhM2FhMTQgMTAwNjQ0Ci0tLSBh L3NyYy9iYWNrZW5kL3Bvc3RtYXN0ZXIvcG9zdG1hc3Rlci5jCisrKyBiL3NyYy9iYWNrZW5kL3Bv c3RtYXN0ZXIvcG9zdG1hc3Rlci5jCkBAIC01MTYsNiArNTE2LDggQEAgdHlwZWRlZiBzdHJ1Y3QK IAlpbnQJCQlOYW1lZExXTG9ja1RyYW5jaGVSZXF1ZXN0czsKIAlOYW1lZExXTG9ja1RyYW5jaGUg Kk5hbWVkTFdMb2NrVHJhbmNoZUFycmF5OwogCUxXTG9ja1BhZGRlZCAqTWFpbkxXTG9ja0FycmF5 OworCWludAkJCU5hbWVkRXh0ZW5zaW9uV2FpdEV2ZW50VHJhbmNoZVJlcXVlc3RzOworCU5hbWVk RXh0ZW5zaW9uV2FpdEV2ZW50VHJhbmNoZSAqTmFtZWRFeHRlbnNpb25XYWl0RXZlbnRUcmFuY2hl QXJyYXk7CiAJc2xvY2tfdCAgICAqUHJvY1N0cnVjdExvY2s7CiAJUFJPQ19IRFIgICAqUHJvY0ds b2JhbDsKIAlQR1BST0MJICAgKkF1eGlsaWFyeVByb2NzOwpAQCAtNjA4Nyw2ICs2MDg5LDggQEAg c2F2ZV9iYWNrZW5kX3ZhcmlhYmxlcyhCYWNrZW5kUGFyYW1ldGVycyAqcGFyYW0sIFBvcnQgKnBv cnQsCiAJcGFyYW0tPk5hbWVkTFdMb2NrVHJhbmNoZVJlcXVlc3RzID0gTmFtZWRMV0xvY2tUcmFu Y2hlUmVxdWVzdHM7CiAJcGFyYW0tPk5hbWVkTFdMb2NrVHJhbmNoZUFycmF5ID0gTmFtZWRMV0xv Y2tUcmFuY2hlQXJyYXk7CiAJcGFyYW0tPk1haW5MV0xvY2tBcnJheSA9IE1haW5MV0xvY2tBcnJh eTsKKwlwYXJhbS0+TmFtZWRFeHRlbnNpb25XYWl0RXZlbnRUcmFuY2hlUmVxdWVzdHMgPSBOYW1l ZEV4dGVuc2lvbldhaXRFdmVudFRyYW5jaGVSZXF1ZXN0czsKKwlwYXJhbS0+TmFtZWRFeHRlbnNp b25XYWl0RXZlbnRUcmFuY2hlQXJyYXkgPSBOYW1lZEV4dGVuc2lvbldhaXRFdmVudFRyYW5jaGVB cnJheTsKIAlwYXJhbS0+UHJvY1N0cnVjdExvY2sgPSBQcm9jU3RydWN0TG9jazsKIAlwYXJhbS0+ UHJvY0dsb2JhbCA9IFByb2NHbG9iYWw7CiAJcGFyYW0tPkF1eGlsaWFyeVByb2NzID0gQXV4aWxp YXJ5UHJvY3M7CkBAIC02MzIwLDYgKzYzMjQsOCBAQCByZXN0b3JlX2JhY2tlbmRfdmFyaWFibGVz KEJhY2tlbmRQYXJhbWV0ZXJzICpwYXJhbSwgUG9ydCAqcG9ydCkKIAlOYW1lZExXTG9ja1RyYW5j aGVSZXF1ZXN0cyA9IHBhcmFtLT5OYW1lZExXTG9ja1RyYW5jaGVSZXF1ZXN0czsKIAlOYW1lZExX TG9ja1RyYW5jaGVBcnJheSA9IHBhcmFtLT5OYW1lZExXTG9ja1RyYW5jaGVBcnJheTsKIAlNYWlu TFdMb2NrQXJyYXkgPSBwYXJhbS0+TWFpbkxXTG9ja0FycmF5OworCU5hbWVkRXh0ZW5zaW9uV2Fp dEV2ZW50VHJhbmNoZVJlcXVlc3RzID0gcGFyYW0tPk5hbWVkRXh0ZW5zaW9uV2FpdEV2ZW50VHJh bmNoZVJlcXVlc3RzOworCU5hbWVkRXh0ZW5zaW9uV2FpdEV2ZW50VHJhbmNoZUFycmF5ID0gcGFy YW0tPk5hbWVkRXh0ZW5zaW9uV2FpdEV2ZW50VHJhbmNoZUFycmF5OwogCVByb2NTdHJ1Y3RMb2Nr ID0gcGFyYW0tPlByb2NTdHJ1Y3RMb2NrOwogCVByb2NHbG9iYWwgPSBwYXJhbS0+UHJvY0dsb2Jh bDsKIAlBdXhpbGlhcnlQcm9jcyA9IHBhcmFtLT5BdXhpbGlhcnlQcm9jczsKZGlmZiAtLWdpdCBh L3NyYy9iYWNrZW5kL3N0b3JhZ2UvaXBjL2lwY2kuYyBiL3NyYy9iYWNrZW5kL3N0b3JhZ2UvaXBj L2lwY2kuYwppbmRleCA4ZjFkZWQ3MzM4Li5lZDA1MTIxZmEzIDEwMDY0NAotLS0gYS9zcmMvYmFj a2VuZC9zdG9yYWdlL2lwYy9pcGNpLmMKKysrIGIvc3JjL2JhY2tlbmQvc3RvcmFnZS9pcGMvaXBj aS5jCkBAIC00OSw2ICs0OSw3IEBACiAjaW5jbHVkZSAic3RvcmFnZS9zcGluLmgiCiAjaW5jbHVk ZSAidXRpbHMvZ3VjLmgiCiAjaW5jbHVkZSAidXRpbHMvc25hcG1nci5oIgorI2luY2x1ZGUgInV0 aWxzL3dhaXRfZXZlbnQuaCIKIAogLyogR1VDcyAqLwogaW50CQkJc2hhcmVkX21lbW9yeV90eXBl ID0gREVGQVVMVF9TSEFSRURfTUVNT1JZX1RZUEU7CkBAIC0xNDIsNiArMTQzLDcgQEAgQ2FsY3Vs YXRlU2htZW1TaXplKGludCAqbnVtX3NlbWFwaG9yZXMpCiAJc2l6ZSA9IGFkZF9zaXplKHNpemUs IFN5bmNTY2FuU2htZW1TaXplKCkpOwogCXNpemUgPSBhZGRfc2l6ZShzaXplLCBBc3luY1NobWVt U2l6ZSgpKTsKIAlzaXplID0gYWRkX3NpemUoc2l6ZSwgU3RhdHNTaG1lbVNpemUoKSk7CisJc2l6 ZSA9IGFkZF9zaXplKHNpemUsIFdhaXRFdmVudFNobWVtU2l6ZSgpKTsKICNpZmRlZiBFWEVDX0JB Q0tFTkQKIAlzaXplID0gYWRkX3NpemUoc2l6ZSwgU2htZW1CYWNrZW5kQXJyYXlTaXplKCkpOwog I2VuZGlmCkBAIC0yOTQsNiArMjk2LDcgQEAgQ3JlYXRlU2hhcmVkTWVtb3J5QW5kU2VtYXBob3Jl cyh2b2lkKQogCVN5bmNTY2FuU2htZW1Jbml0KCk7CiAJQXN5bmNTaG1lbUluaXQoKTsKIAlTdGF0 c1NobWVtSW5pdCgpOworCVdhaXRFdmVudFNobWVtSW5pdCgpOwogCiAjaWZkZWYgRVhFQ19CQUNL RU5ECiAKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3N0b3JhZ2UvaXBjL3NobWVtLmMgYi9zcmMv YmFja2VuZC9zdG9yYWdlL2lwYy9zaG1lbS5jCmluZGV4IDU0NjVmYTE5NjQuLjAyYzcyZWJiYjEg MTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL3N0b3JhZ2UvaXBjL3NobWVtLmMKKysrIGIvc3JjL2Jh Y2tlbmQvc3RvcmFnZS9pcGMvc2htZW0uYwpAQCAtODUsNyArODUsOCBAQCBzdGF0aWMgdm9pZCAq U2htZW1CYXNlOwkJCS8qIHN0YXJ0IGFkZHJlc3Mgb2Ygc2hhcmVkIG1lbW9yeSAqLwogCiBzdGF0 aWMgdm9pZCAqU2htZW1FbmQ7CQkJLyogZW5kKzEgYWRkcmVzcyBvZiBzaGFyZWQgbWVtb3J5ICov CiAKLXNsb2NrX3QgICAgKlNobWVtTG9jazsJCQkvKiBzcGlubG9jayBmb3Igc2hhcmVkIG1lbW9y eSBhbmQgTFdMb2NrCitzbG9ja190ICAgICpTaG1lbUxvY2s7CQkJLyogc3BpbmxvY2sgZm9yIHNo YXJlZCBtZW1vcnksIExXTG9jaworCQkJCQkJCQkgKiBhbGxvY2F0aW9uLCBhbmQgbmFtZWQgZXh0 ZW5zaW9uIHdhaXQgZXZlbnQKIAkJCQkJCQkJICogYWxsb2NhdGlvbiAqLwogCiBzdGF0aWMgSFRB QiAqU2htZW1JbmRleCA9IE5VTEw7IC8qIHByaW1hcnkgaW5kZXggaGFzaHRhYmxlIGZvciBzaG1l bSAqLwpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvdXRpbHMvYWN0aXZpdHkvd2FpdF9ldmVudC5j IGIvc3JjL2JhY2tlbmQvdXRpbHMvYWN0aXZpdHkvd2FpdF9ldmVudC5jCmluZGV4IDc5NDBkNjQ2 MzkuLjRiZjcyNWZiYWUgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL3V0aWxzL2FjdGl2aXR5L3dh aXRfZXZlbnQuYworKysgYi9zcmMvYmFja2VuZC91dGlscy9hY3Rpdml0eS93YWl0X2V2ZW50LmMK QEAgLTIyLDExICsyMiwxOCBAQAogICovCiAjaW5jbHVkZSAicG9zdGdyZXMuaCIKIAorI2luY2x1 ZGUgIm1pc2NhZG1pbi5oIgorI2luY2x1ZGUgInBvcnQvcGdfYml0dXRpbHMuaCIKICNpbmNsdWRl ICJzdG9yYWdlL2xtZ3IuaCIJCS8qIGZvciBHZXRMb2NrTmFtZUZyb21UYWdUeXBlICovCiAjaW5j bHVkZSAic3RvcmFnZS9sd2xvY2suaCIJCS8qIGZvciBHZXRMV0xvY2tJZGVudGlmaWVyICovCisj aW5jbHVkZSAic3RvcmFnZS9zcGluLmgiCisjaW5jbHVkZSAidXRpbHMvbWVtdXRpbHMuaCIKICNp bmNsdWRlICJ1dGlscy93YWl0X2V2ZW50LmgiCiAKIAorLyogV2UgdXNlIHRoZSBTaG1lbUxvY2sg c3BpbmxvY2sgdG8gcHJvdGVjdCBFeHRlbnNpb25XYWl0RXZlbnRDb3VudGVyICovCitleHRlcm4g c2xvY2tfdCAqU2htZW1Mb2NrOworCiBzdGF0aWMgY29uc3QgY2hhciAqcGdzdGF0X2dldF93YWl0 X2FjdGl2aXR5KFdhaXRFdmVudEFjdGl2aXR5IHcpOwogc3RhdGljIGNvbnN0IGNoYXIgKnBnc3Rh dF9nZXRfd2FpdF9jbGllbnQoV2FpdEV2ZW50Q2xpZW50IHcpOwogc3RhdGljIGNvbnN0IGNoYXIg KnBnc3RhdF9nZXRfd2FpdF9pcGMoV2FpdEV2ZW50SVBDIHcpOwpAQCAtMzgsNiArNDUsNDYgQEAg c3RhdGljIHVpbnQzMiBsb2NhbF9teV93YWl0X2V2ZW50X2luZm87CiB1aW50MzIJICAgKm15X3dh aXRfZXZlbnRfaW5mbyA9ICZsb2NhbF9teV93YWl0X2V2ZW50X2luZm87CiAKIAorLyogc3RydWN0 IHJlcHJlc2VudGluZyB0aGUgcmVxdWVzdCBmb3IgbmFtZWQgdHJhbmNoZSBvZiBleHRlbnNpb24g d2FpdCBldmVudCAqLwordHlwZWRlZiBzdHJ1Y3QgTmFtZWRFeHRlbnNpb25XYWl0RXZlbnRUcmFu Y2hlUmVxdWVzdAoreworCWNoYXIJCXRyYW5jaGVfbmFtZVtOQU1FREFUQUxFTl07Cit9CQkJTmFt ZWRFeHRlbnNpb25XYWl0RXZlbnRUcmFuY2hlUmVxdWVzdDsKKworc3RhdGljIE5hbWVkRXh0ZW5z aW9uV2FpdEV2ZW50VHJhbmNoZVJlcXVlc3QgKiBOYW1lZEV4dGVuc2lvbldhaXRFdmVudFRyYW5j aGVSZXF1ZXN0QXJyYXkgPSBOVUxMOworc3RhdGljIGludAlOYW1lZEV4dGVuc2lvbldhaXRFdmVu dFRyYW5jaGVSZXF1ZXN0c0FsbG9jYXRlZCA9IDA7CisKKy8qCisgKiBOYW1lZEV4dGVuc2lvbldh aXRFdmVudFRyYW5jaGVSZXF1ZXN0cyBpcyBib3RoIHRoZSB2YWxpZCBsZW5ndGggb2YgdGhlIHJl cXVlc3QgYXJyYXksCisgKiBhbmQgdGhlIGxlbmd0aCBvZiB0aGUgc2hhcmVkLW1lbW9yeSBOYW1l ZEV4dGVuc2lvbldhaXRFdmVudFRyYW5jaGVBcnJheSBsYXRlciBvbi4KKyAqIFRoaXMgdmFyaWFi bGUgYW5kIE5hbWVkRXh0ZW5zaW9uV2FpdEV2ZW50VHJhbmNoZUFycmF5IGFyZSBub24tc3RhdGlj IHNvIHRoYXQKKyAqIHBvc3RtYXN0ZXIuYyBjYW4gY29weSB0aGVtIHRvIGNoaWxkIHByb2Nlc3Nl cyBpbiBFWEVDX0JBQ0tFTkQgYnVpbGRzLgorICovCitpbnQJCQlOYW1lZEV4dGVuc2lvbldhaXRF dmVudFRyYW5jaGVSZXF1ZXN0cyA9IDA7CisKKy8qIHBvaW50cyB0byBkYXRhIGluIHNoYXJlZCBt ZW1vcnkgKi8KK05hbWVkRXh0ZW5zaW9uV2FpdEV2ZW50VHJhbmNoZSAqTmFtZWRFeHRlbnNpb25X YWl0RXZlbnRUcmFuY2hlQXJyYXkgPSBOVUxMOworCitzdGF0aWMgdm9pZCBJbml0aWFsaXplRXh0 ZW5zaW9uV2FpdEV2ZW50VHJhbmNoZXModm9pZCk7CitzdGF0aWMgdm9pZCBFeHRlbnNpb25XYWl0 RXZlbnRSZWdpc3RlclRyYW5jaGUoaW50IHRyYW5jaGVfaWQsIGNvbnN0IGNoYXIgKnRyYW5jaGVf bmFtZSk7CitzdGF0aWMgaW50CUV4dGVuc2lvbldhaXRFdmVudE5ld1RyYW5jaGVJZCh2b2lkKTsK KworLyogZmlyc3QgdHJhbmNoZSBJRCBmb3IgbmFtZWQgdHJhbmNoZSAqLworI2RlZmluZSBOVU1f QlVJTERJTl9XQUlUX0VWRU5UX0VYVEVOU0lPTglcCisJKFdBSVRfRVZFTlRfRVhURU5TSU9OX0ZJ UlNUX1VTRVJfREVGSU5FRCAtIFdBSVRfRVZFTlRfRVhURU5TSU9OKQorCisvKgorICogVGhpcyBp cyBpbmRleGVkIGJ5IHRyYW5jaGUgSUQgbWludXMgTlVNX0JVSUxESU5fV0FJVF9FVkVOVF9FWFRF TlNJT04sIGFuZAorICogc3RvcmVzIHRoZSBuYW1lcyBvZiBhbGwgZHluYW1pY2FsbHktY3JlYXRl ZCB0cmFuY2hlcyBrbm93biB0byB0aGUgY3VycmVudAorICogcHJvY2Vzcy4gIEFueSB1bnVzZWQg ZW50cmllcyBpbiB0aGUgYXJyYXkgd2lsbCBjb250YWluIE5VTEwuCisgKi8KK3N0YXRpYyBjb25z dCBjaGFyICoqRXh0ZW5zaW9uV2FpdEV2ZW50VHJhbmNoZU5hbWVzID0gTlVMTDsKK3N0YXRpYyBp bnQJRXh0ZW5zaW9uV2FpdEV2ZW50VHJhbmNoZU5hbWVzQWxsb2NhdGVkID0gMDsKKworc3RhdGlj IGNvbnN0IGNoYXIgKkdldEV4dGVuc2lvbklkZW50aWZpZXIodWludDMyIGNsYXNzSWQsIHVpbnQx NiBldmVudElkKTsKK3N0YXRpYyBjb25zdCBjaGFyICpHZXRFeHRlbnNpb25UcmFuY2hlTmFtZSh1 aW50MTYgdHJhbmNoZUlkKTsKKworCiAvKgogICogQ29uZmlndXJlIHdhaXQgZXZlbnQgcmVwb3J0 aW5nIHRvIHJlcG9ydCB3YWl0IGV2ZW50cyB0byAqd2FpdF9ldmVudF9pbmZvLgogICogKndhaXRf ZXZlbnRfaW5mbyBuZWVkcyB0byBiZSB2YWxpZCB1bnRpbCBwZ3N0YXRfcmVzZXRfd2FpdF9ldmVu dF9zdG9yYWdlKCkKQEAgLTE2NSw3ICsyMTIsNyBAQCBwZ3N0YXRfZ2V0X3dhaXRfZXZlbnQodWlu dDMyIHdhaXRfZXZlbnRfaW5mbykKIAkJCQlicmVhazsKIAkJCX0KIAkJY2FzZSBQR19XQUlUX0VY VEVOU0lPTjoKLQkJCWV2ZW50X25hbWUgPSAiRXh0ZW5zaW9uIjsKKwkJCWV2ZW50X25hbWUgPSBH ZXRFeHRlbnNpb25JZGVudGlmaWVyKGNsYXNzSWQsIGV2ZW50SWQpOwogCQkJYnJlYWs7CiAJCWNh c2UgUEdfV0FJVF9JUEM6CiAJCQl7CkBAIC03NjIsMyArODA5LDI1NyBAQCBwZ3N0YXRfZ2V0X3dh aXRfaW8oV2FpdEV2ZW50SU8gdykKIAogCXJldHVybiBldmVudF9uYW1lOwogfQorCisvKgorICog UmVxdWVzdE5hbWVkRXh0ZW5zaW9uV2FpdEV2ZW50VHJhbmNoZQorICoJCVJlcXVlc3QgdGhhdCBl eHRyYSB3YWl0IGV2ZW50cyBmb3IgZXh0ZW5zaW9ucyBiZSBhbGxvY2F0ZWQKKyAqICAgICAgZHVy aW5nIHBvc3RtYXN0ZXIgc3RhcnR1cC4KKyAqCisgKiBUaGlzIG1heSBvbmx5IGJlIGNhbGxlZCB2 aWEgdGhlIHNobWVtX3JlcXVlc3RfaG9vayBvZiBhIGxpYnJhcnkgdGhhdCBpcworICogbG9hZGVk IGludG8gdGhlIHBvc3RtYXN0ZXIgdmlhIHNoYXJlZF9wcmVsb2FkX2xpYnJhcmllcy4gIENhbGxz IGZyb20KKyAqIGVsc2V3aGVyZSB3aWxsIGZhaWwuCisgKgorICogVGhlIHRyYW5jaGUgbmFtZSB3 aWxsIGJlIHVzZXItdmlzaWJsZSBhcyBhIHdhaXQgZXZlbnQgbmFtZSwgc28gdHJ5IHRvCisgKiB1 c2UgYSBuYW1lIHRoYXQgZml0cyB0aGUgc3R5bGUgZm9yIHRob3NlLgorICovCit2b2lkCitSZXF1 ZXN0TmFtZWRFeHRlbnNpb25XYWl0RXZlbnRUcmFuY2hlKGNvbnN0IGNoYXIgKnRyYW5jaGVfbmFt ZSkKK3sKKwlOYW1lZEV4dGVuc2lvbldhaXRFdmVudFRyYW5jaGVSZXF1ZXN0ICpyZXF1ZXN0Owor CisJaWYgKCFwcm9jZXNzX3NobWVtX3JlcXVlc3RzX2luX3Byb2dyZXNzKQorCQllbG9nKEZBVEFM LCAiY2Fubm90IHJlcXVlc3QgYWRkaXRpb25hbCB3YWl0IGV2ZW50cyBvdXRzaWRlIHNobWVtX3Jl cXVlc3RfaG9vayIpOworCisJaWYgKE5hbWVkRXh0ZW5zaW9uV2FpdEV2ZW50VHJhbmNoZVJlcXVl c3RBcnJheSA9PSBOVUxMKQorCXsKKwkJTmFtZWRFeHRlbnNpb25XYWl0RXZlbnRUcmFuY2hlUmVx dWVzdHNBbGxvY2F0ZWQgPSAxNjsKKwkJTmFtZWRFeHRlbnNpb25XYWl0RXZlbnRUcmFuY2hlUmVx dWVzdEFycmF5ID0gKE5hbWVkRXh0ZW5zaW9uV2FpdEV2ZW50VHJhbmNoZVJlcXVlc3QgKikKKwkJ CU1lbW9yeUNvbnRleHRBbGxvYyhUb3BNZW1vcnlDb250ZXh0LAorCQkJCQkJCSAgIE5hbWVkRXh0 ZW5zaW9uV2FpdEV2ZW50VHJhbmNoZVJlcXVlc3RzQWxsb2NhdGVkCisJCQkJCQkJICAgKiBzaXpl b2YoTmFtZWRFeHRlbnNpb25XYWl0RXZlbnRUcmFuY2hlUmVxdWVzdCkpOworCX0KKworCWlmIChO YW1lZEV4dGVuc2lvbldhaXRFdmVudFRyYW5jaGVSZXF1ZXN0cyA+PSBOYW1lZEV4dGVuc2lvbldh aXRFdmVudFRyYW5jaGVSZXF1ZXN0c0FsbG9jYXRlZCkKKwl7CisJCWludAkJCWkgPSBwZ19uZXh0 cG93ZXIyXzMyKE5hbWVkRXh0ZW5zaW9uV2FpdEV2ZW50VHJhbmNoZVJlcXVlc3RzICsgMSk7CisK KwkJTmFtZWRFeHRlbnNpb25XYWl0RXZlbnRUcmFuY2hlUmVxdWVzdEFycmF5ID0gKE5hbWVkRXh0 ZW5zaW9uV2FpdEV2ZW50VHJhbmNoZVJlcXVlc3QgKikKKwkJCXJlcGFsbG9jKE5hbWVkRXh0ZW5z aW9uV2FpdEV2ZW50VHJhbmNoZVJlcXVlc3RBcnJheSwKKwkJCQkJIGkgKiBzaXplb2YoTmFtZWRF eHRlbnNpb25XYWl0RXZlbnRUcmFuY2hlUmVxdWVzdCkpOworCQlOYW1lZEV4dGVuc2lvbldhaXRF dmVudFRyYW5jaGVSZXF1ZXN0c0FsbG9jYXRlZCA9IGk7CisJfQorCisJcmVxdWVzdCA9ICZOYW1l ZEV4dGVuc2lvbldhaXRFdmVudFRyYW5jaGVSZXF1ZXN0QXJyYXlbTmFtZWRFeHRlbnNpb25XYWl0 RXZlbnRUcmFuY2hlUmVxdWVzdHNdOworCUFzc2VydChzdHJsZW4odHJhbmNoZV9uYW1lKSArIDEg PD0gTkFNRURBVEFMRU4pOworCXN0cmxjcHkocmVxdWVzdC0+dHJhbmNoZV9uYW1lLCB0cmFuY2hl X25hbWUsIE5BTUVEQVRBTEVOKTsKKwlOYW1lZEV4dGVuc2lvbldhaXRFdmVudFRyYW5jaGVSZXF1 ZXN0cysrOworfQorCisvKgorICogQ29tcHV0ZSBzaG1lbSBzcGFjZSBuZWVkZWQgZm9yIG5hbWVk IHdhaXQgZXZlbnQgdHJhbmNoZXMuCisgKi8KK1NpemUKK1dhaXRFdmVudFNobWVtU2l6ZSh2b2lk KQoreworCVNpemUJCXNpemU7CisJaW50CQkJaTsKKworCS8qIHNwYWNlIGZvciBuYW1lZCB0cmFu Y2hlcy4gKi8KKwlzaXplID0gbXVsX3NpemUoTmFtZWRFeHRlbnNpb25XYWl0RXZlbnRUcmFuY2hl UmVxdWVzdHMsIHNpemVvZihOYW1lZEV4dGVuc2lvbldhaXRFdmVudFRyYW5jaGUpKTsKKworCS8q IHNwYWNlIGZvciBuYW1lIG9mIGVhY2ggdHJhbmNoZS4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgTmFt ZWRFeHRlbnNpb25XYWl0RXZlbnRUcmFuY2hlUmVxdWVzdHM7IGkrKykKKwkJc2l6ZSA9IGFkZF9z aXplKHNpemUsIHN0cmxlbihOYW1lZEV4dGVuc2lvbldhaXRFdmVudFRyYW5jaGVSZXF1ZXN0QXJy YXlbaV0udHJhbmNoZV9uYW1lKSArIDEpOworCisJcmV0dXJuIHNpemU7Cit9CisKKy8qCisgKiBB bGxvY2F0ZSBzaG1lbSBzcGFjZSBmb3IgbmFtZWQgd2FpdCBldmVudCB0cmFuY2hlcyBhbmQgaW5p dGlhbGl6ZSBpdC4KKyAqIFdlIGFsc28gcmVnaXN0ZXIgbmFtZWQgd2FpdCBldmVudCB0cmFuY2hl cyBoZXJlLgorICovCit2b2lkCitXYWl0RXZlbnRTaG1lbUluaXQodm9pZCkKK3sKKwlpZiAoIUlz VW5kZXJQb3N0bWFzdGVyKQorCXsKKwkJU2l6ZQkJc3BhY2VXYWl0RXZlbnQgPSBXYWl0RXZlbnRT aG1lbVNpemUoKTsKKwkJaW50CQkgICAqRXh0ZW5zaW9uV2FpdEV2ZW50Q291bnRlcjsKKwkJY2hh cgkgICAqcHRyOworCisJCS8qIEFsbG9jYXRlIHNwYWNlICovCisJCXB0ciA9IChjaGFyICopIFNo bWVtQWxsb2Moc3BhY2VXYWl0RXZlbnQpOworCisJCS8qIExlYXZlIHJvb20gZm9yIGR5bmFtaWMg YWxsb2NhdGlvbiBvZiB0cmFuY2hlcyAqLworCQlwdHIgKz0gc2l6ZW9mKGludCk7CisKKwkJTmFt ZWRFeHRlbnNpb25XYWl0RXZlbnRUcmFuY2hlQXJyYXkgPSAoTmFtZWRFeHRlbnNpb25XYWl0RXZl bnRUcmFuY2hlICopIHB0cjsKKworCQkvKgorCQkgKiBJbml0aWFsaXplIHRoZSBkeW5hbWljLWFs bG9jYXRpb24gY291bnRlciBmb3IgdHJhbmNoZXMsIHdoaWNoIGlzCisJCSAqIHN0b3JlZCBqdXN0 IGJlZm9yZSB0aGUgZmlyc3Qgd2FpdCBldmVudC4KKwkJICovCisJCUV4dGVuc2lvbldhaXRFdmVu dENvdW50ZXIgPSAoaW50ICopICgoY2hhciAqKSBOYW1lZEV4dGVuc2lvbldhaXRFdmVudFRyYW5j aGVBcnJheSAtIHNpemVvZihpbnQpKTsKKwkJKkV4dGVuc2lvbldhaXRFdmVudENvdW50ZXIgPSBO VU1fQlVJTERJTl9XQUlUX0VWRU5UX0VYVEVOU0lPTjsKKworCQkvKiBJbml0aWFsaXplIHJlcXVl c3RlZCBuYW1lZCB3YWl0IGV2ZW50IHRyYW5jaGVzICovCisJCUluaXRpYWxpemVFeHRlbnNpb25X YWl0RXZlbnRUcmFuY2hlcygpOworCX0KKworCS8qIFJlZ2lzdGVyIG5hbWVkIHdhaXQgZXZlbnQg dHJhbmNoZXMgaW4gdGhlIGN1cnJlbnQgcHJvY2Vzcy4gKi8KKwlmb3IgKGludCBpID0gMDsgaSA8 IE5hbWVkRXh0ZW5zaW9uV2FpdEV2ZW50VHJhbmNoZVJlcXVlc3RzOyBpKyspCisJCUV4dGVuc2lv bldhaXRFdmVudFJlZ2lzdGVyVHJhbmNoZShOYW1lZEV4dGVuc2lvbldhaXRFdmVudFRyYW5jaGVB cnJheVtpXS50cmFuY2hlSWQsCisJCQkJCQkJCQkJICBOYW1lZEV4dGVuc2lvbldhaXRFdmVudFRy YW5jaGVBcnJheVtpXS50cmFuY2hlTmFtZSk7Cit9CisKKy8qCisgKiBJbml0aWFsaXplIHJlcXVl c3RlZCBuYW1lZCB3YWl0IGV2ZW50IHRyYW5jaGVzLgorICovCitzdGF0aWMgdm9pZAorSW5pdGlh bGl6ZUV4dGVuc2lvbldhaXRFdmVudFRyYW5jaGVzKHZvaWQpCit7CisJLyoKKwkgKiBDb3B5IHRo ZSBpbmZvIGFib3V0IGFueSBuYW1lZCB0cmFuY2hlcyBpbnRvIHNoYXJlZCBtZW1vcnkgKHNvIHRo YXQKKwkgKiBvdGhlciBwcm9jZXNzZXMgY2FuIHNlZSBpdCksIGFuZCBpbml0aWFsaXplIHRoZSBy ZXF1ZXN0ZWQgd2FpdCBldmVudHMuCisJICovCisJaWYgKE5hbWVkRXh0ZW5zaW9uV2FpdEV2ZW50 VHJhbmNoZVJlcXVlc3RzID4gMCkKKwl7CisJCWNoYXIJICAgKnRyYW5jaGVOYW1lczsKKwkJaW50 CQkJaTsKKworCQl0cmFuY2hlTmFtZXMgPSAoY2hhciAqKSBOYW1lZEV4dGVuc2lvbldhaXRFdmVu dFRyYW5jaGVBcnJheSArCisJCQkoTmFtZWRFeHRlbnNpb25XYWl0RXZlbnRUcmFuY2hlUmVxdWVz dHMgKiBzaXplb2YoTmFtZWRFeHRlbnNpb25XYWl0RXZlbnRUcmFuY2hlKSk7CisKKwkJZm9yIChp ID0gMDsgaSA8IE5hbWVkRXh0ZW5zaW9uV2FpdEV2ZW50VHJhbmNoZVJlcXVlc3RzOyBpKyspCisJ CXsKKwkJCU5hbWVkRXh0ZW5zaW9uV2FpdEV2ZW50VHJhbmNoZVJlcXVlc3QgKnJlcXVlc3Q7CisJ CQlOYW1lZEV4dGVuc2lvbldhaXRFdmVudFRyYW5jaGUgKnRyYW5jaGU7CisJCQljaGFyCSAgICpu YW1lOworCisJCQlyZXF1ZXN0ID0gJk5hbWVkRXh0ZW5zaW9uV2FpdEV2ZW50VHJhbmNoZVJlcXVl c3RBcnJheVtpXTsKKwkJCXRyYW5jaGUgPSAmTmFtZWRFeHRlbnNpb25XYWl0RXZlbnRUcmFuY2hl QXJyYXlbaV07CisKKwkJCW5hbWUgPSB0cmFuY2hlTmFtZXM7CisJCQl0cmFuY2hlTmFtZXMgKz0g c3RybGVuKHJlcXVlc3QtPnRyYW5jaGVfbmFtZSkgKyAxOworCQkJc3RyY3B5KG5hbWUsIHJlcXVl c3QtPnRyYW5jaGVfbmFtZSk7CisJCQl0cmFuY2hlLT50cmFuY2hlSWQgPSBFeHRlbnNpb25XYWl0 RXZlbnROZXdUcmFuY2hlSWQoKTsKKwkJCXRyYW5jaGUtPnRyYW5jaGVOYW1lID0gbmFtZTsKKwkJ fQorCX0KK30KKworLyoKKyAqIEFsbG9jYXRlIGEgbmV3IHRyYW5jaGUgSUQuCisgKi8KK2ludAor RXh0ZW5zaW9uV2FpdEV2ZW50TmV3VHJhbmNoZUlkKHZvaWQpCit7CisJaW50CQkJcmVzdWx0Owor CWludAkJICAgKkV4dGVuc2lvbldhaXRFdmVudENvdW50ZXI7CisKKwlFeHRlbnNpb25XYWl0RXZl bnRDb3VudGVyID0gKGludCAqKSAoKGNoYXIgKikgTmFtZWRFeHRlbnNpb25XYWl0RXZlbnRUcmFu Y2hlQXJyYXkgLSBzaXplb2YoaW50KSk7CisJU3BpbkxvY2tBY3F1aXJlKFNobWVtTG9jayk7CisJ cmVzdWx0ID0gKCpFeHRlbnNpb25XYWl0RXZlbnRDb3VudGVyKSsrOworCVNwaW5Mb2NrUmVsZWFz ZShTaG1lbUxvY2spOworCisJcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZAorRXh0ZW5zaW9uV2Fp dEV2ZW50UmVnaXN0ZXJUcmFuY2hlKGludCB0cmFuY2hlX2lkLCBjb25zdCBjaGFyICp0cmFuY2hl X25hbWUpCit7CisJLyogVGhpcyBzaG91bGQgb25seSBiZSBjYWxsZWQgZm9yIHVzZXItZGVmaW5l ZCB0cmFuY2hlcy4gKi8KKwlpZiAodHJhbmNoZV9pZCA8IE5VTV9CVUlMRElOX1dBSVRfRVZFTlRf RVhURU5TSU9OKQorCQlyZXR1cm47CisKKwkvKiBDb252ZXJ0IHRvIGFycmF5IGluZGV4LiAqLwor CXRyYW5jaGVfaWQgLT0gTlVNX0JVSUxESU5fV0FJVF9FVkVOVF9FWFRFTlNJT047CisKKwkvKiBJ ZiBuZWNlc3NhcnksIGNyZWF0ZSBvciBlbmxhcmdlIGFycmF5LiAqLworCWlmICh0cmFuY2hlX2lk ID49IEV4dGVuc2lvbldhaXRFdmVudFRyYW5jaGVOYW1lc0FsbG9jYXRlZCkKKwl7CisJCWludAkJ CW5ld2FsbG9jOworCisJCW5ld2FsbG9jID0gcGdfbmV4dHBvd2VyMl8zMihNYXgoOCwgdHJhbmNo ZV9pZCArIDEpKTsKKworCQlpZiAoRXh0ZW5zaW9uV2FpdEV2ZW50VHJhbmNoZU5hbWVzID09IE5V TEwpCisJCQlFeHRlbnNpb25XYWl0RXZlbnRUcmFuY2hlTmFtZXMgPSAoY29uc3QgY2hhciAqKikK KwkJCQlNZW1vcnlDb250ZXh0QWxsb2NaZXJvKFRvcE1lbW9yeUNvbnRleHQsCisJCQkJCQkJCQkg ICBuZXdhbGxvYyAqIHNpemVvZihjaGFyICopKTsKKwkJZWxzZQorCQkJRXh0ZW5zaW9uV2FpdEV2 ZW50VHJhbmNoZU5hbWVzID0KKwkJCQlyZXBhbGxvYzBfYXJyYXkoRXh0ZW5zaW9uV2FpdEV2ZW50 VHJhbmNoZU5hbWVzLCBjb25zdCBjaGFyICosIEV4dGVuc2lvbldhaXRFdmVudFRyYW5jaGVOYW1l c0FsbG9jYXRlZCwgbmV3YWxsb2MpOworCQlFeHRlbnNpb25XYWl0RXZlbnRUcmFuY2hlTmFtZXNB bGxvY2F0ZWQgPSBuZXdhbGxvYzsKKwl9CisKKwlFeHRlbnNpb25XYWl0RXZlbnRUcmFuY2hlTmFt ZXNbdHJhbmNoZV9pZF0gPSB0cmFuY2hlX25hbWU7Cit9CisKKy8qCisgKiBHZXROYW1lZEV4dGVu c2lvbldhaXRFdmVudFRyYW5jaGUgLSByZXR1cm5zIHRoZSBFeHRlbnNpb24gd2FpdCBldmVudCBp bmZvcm1hdGlvbgorICogICAgICBmcm9tIHRoZSBzcGVjaWZpZWQgdHJhbmNoZS4KKyAqCisgKiBD YWxsZXIgbmVlZHMgdG8gcmV0cmlldmUgdGhlIHJlcXVlc3RlZCBudW1iZXIgb2YgRXh0ZW5zaW9u cyBzdGFydGluZyBmcm9tCisgKiB0aGUgYmFzZSBleHRlbnNpb24gYWRkcmVzcyByZXR1cm5lZCBi eSB0aGlzIEFQSS4gIFRoaXMgY2FuIGJlIHVzZWQgZm9yCisgKiB0cmFuY2hlcyB0aGF0IGFyZSBy ZXF1ZXN0ZWQgYnkgdXNpbmcgUmVxdWVzdE5hbWVkRXh0ZW5zaW9uV2FpdEV2ZW50VHJhbmNoZSgp IEFQSS4KKyAqLwordWludDMyCitHZXROYW1lZEV4dGVuc2lvbldhaXRFdmVudFRyYW5jaGUoY29u c3QgY2hhciAqdHJhbmNoZV9uYW1lKQoreworCXVpbnQzMgkJd2FpdF9ldmVudF9pbmZvOworCWlu dAkJCXBvczsKKwlpbnQJCQlpOworCisJLyogVGhlIHdhaXQgZXZlbnQgdHlwZSBpcyBhbHdheXMg UEdfV0FJVF9FWFRFTlNJT04uICovCisJd2FpdF9ldmVudF9pbmZvID0gUEdfV0FJVF9FWFRFTlNJ T047CisKKwkvKgorCSAqIE9idGFpbiB0aGUgbmFtZSBvZiBFeHRlbnNpb24gd2FpdCBldmVudCBi ZWxvbmdpbmcgdG8gcmVxdWVzdGVkCisJICogdHJhbmNoZV9uYW1lIGluIE5hbWVkRXh0ZW5zaW9u V2FpdEV2ZW50VHJhbmNoZUFycmF5LgorCSAqLworCXBvcyA9IDA7CisJZm9yIChpID0gMDsgaSA8 IE5hbWVkRXh0ZW5zaW9uV2FpdEV2ZW50VHJhbmNoZVJlcXVlc3RzOyBpKyspCisJeworCQlpZiAo c3RyY21wKE5hbWVkRXh0ZW5zaW9uV2FpdEV2ZW50VHJhbmNoZVJlcXVlc3RBcnJheVtpXS50cmFu Y2hlX25hbWUsCisJCQkJICAgdHJhbmNoZV9uYW1lKSA9PSAwKQorCQl7CisJCQl3YWl0X2V2ZW50 X2luZm8gfD0gTmFtZWRFeHRlbnNpb25XYWl0RXZlbnRUcmFuY2hlQXJyYXlbcG9zXS50cmFuY2hl SWQ7CisJCQlyZXR1cm4gd2FpdF9ldmVudF9pbmZvOworCQl9CisKKwkJcG9zKys7CisJfQorCisJ ZWxvZyhFUlJPUiwgInJlcXVlc3RlZCB0cmFuY2hlIGlzIG5vdCByZWdpc3RlcmVkIik7CisKKwkv KiBqdXN0IHRvIGtlZXAgY29tcGlsZXIgcXVpZXQgKi8KKwlyZXR1cm4gd2FpdF9ldmVudF9pbmZv OworfQorCisvKgorICogUmV0dXJuIGFuIGlkZW50aWZpZXIgYmFzZWQgb24gdGhlIEV4dGVuc2lv biB3YWl0IGV2ZW50LgorICovCitzdGF0aWMgY29uc3QgY2hhciAqCitHZXRFeHRlbnNpb25JZGVu dGlmaWVyKHVpbnQzMiBjbGFzc0lkLCB1aW50MTYgZXZlbnRJZCkKK3sKKwlBc3NlcnQoY2xhc3NJ ZCA9PSBQR19XQUlUX0VYVEVOU0lPTik7CisJLyogVGhlIGV2ZW50IElEcyBhcmUganVzdCB0cmFu Y2hlIG51bWJlcnMuICovCisJcmV0dXJuIEdldEV4dGVuc2lvblRyYW5jaGVOYW1lKGV2ZW50SWQp OworfQorCisvKgorICogUmV0dXJuIHRoZSBuYW1lIG9mIGFuIEV4dGVuc2lvbiB0cmFuY2hlLgor ICovCitzdGF0aWMgY29uc3QgY2hhciAqCitHZXRFeHRlbnNpb25UcmFuY2hlTmFtZSh1aW50MTYg dHJhbmNoZUlkKQoreworCS8qIEJ1aWxkLWluIHRyYW5jaGU/ICovCisJaWYgKHRyYW5jaGVJZCA8 IE5VTV9CVUlMRElOX1dBSVRfRVZFTlRfRVhURU5TSU9OKQorCQlyZXR1cm4gIkV4dGVuc2lvbiI7 CisKKwkvKiBJdCdzIGFuIGV4dGVuc2lvbiB0cmFuY2hlLCBzbyBsb29rIGluIEV4dGVuc2lvbldh aXRFdmVudFRyYW5jaGVOYW1lc1tdLiAqLworCXRyYW5jaGVJZCAtPSBOVU1fQlVJTERJTl9XQUlU X0VWRU5UX0VYVEVOU0lPTjsKKwlBc3NlcnQodHJhbmNoZUlkIDwgRXh0ZW5zaW9uV2FpdEV2ZW50 VHJhbmNoZU5hbWVzQWxsb2NhdGVkKTsKKworCXJldHVybiBFeHRlbnNpb25XYWl0RXZlbnRUcmFu Y2hlTmFtZXNbdHJhbmNoZUlkXTsKK30KZGlmZiAtLWdpdCBhL3NyYy9pbmNsdWRlL3V0aWxzL3dh aXRfZXZlbnQuaCBiL3NyYy9pbmNsdWRlL3V0aWxzL3dhaXRfZXZlbnQuaAppbmRleCA1MThkM2Iw YTFmLi5mYTQyNjcxYmQ1IDEwMDY0NAotLS0gYS9zcmMvaW5jbHVkZS91dGlscy93YWl0X2V2ZW50 LmgKKysrIGIvc3JjL2luY2x1ZGUvdXRpbHMvd2FpdF9ldmVudC5oCkBAIC03MCw2ICs3MCwzOCBA QCB0eXBlZGVmIGVudW0KIAlXQUlUX0VWRU5UX1dBTF9TRU5ERVJfV1JJVEVfREFUQSwKIH0gV2Fp dEV2ZW50Q2xpZW50OwogCisvKiAtLS0tLS0tLS0tCisgKiBXYWl0IEV2ZW50cyAtIEV4dGVuc2lv bgorICoKKyAqIFVzZSB0aGlzIGNhdGVnb3J5IHdoZW4gdGhlIHNlcnZlciBwcm9jZXNzIGlzIHdh aXRpbmcgZm9yIHNvbWUgY29uZGl0aW9uCisgKiBkZWZpbmVkIGJ5IGFuIGV4dGVuc2lvbiBtb2R1 bGUuCisgKgorICogRXh0ZW5zaW9ucyBjYW4gZGVmaW5lIGN1c3RvbSB3YWl0IGV2ZW50cyBieSBj YWxsaW5nIFJlcXVlc3ROYW1lZEV4dGVuc2lvbldhaXRFdmVudFRyYW5jaGUoKQorICogZHVyaW5n IHBvc3RtYXN0ZXIgc3RhcnR1cC4gIFN1YnNlcXVlbnRseSwgY2FsbCBHZXROYW1lZEV4dGVuc2lv bldhaXRFdmVudFRyYW5jaGUoKSB0bworICogb2J0YWluIHRoZSB3YWl0IGV2ZW50IGluZm9ybWF0 aW9uIHJlcXVlc3RlZC4KKyAqIC0tLS0tLS0tLS0KKyAqLwordHlwZWRlZiBlbnVtCit7CisJV0FJ VF9FVkVOVF9FWFRFTlNJT04gPSBQR19XQUlUX0VYVEVOU0lPTiwKKwlXQUlUX0VWRU5UX0VYVEVO U0lPTl9GSVJTVF9VU0VSX0RFRklORUQKK30JCQlXYWl0RXZlbnRFeHRlbnNpb247CisKK2V4dGVy biB2b2lkIFdhaXRFdmVudFNobWVtSW5pdCh2b2lkKTsKK2V4dGVybiBTaXplIFdhaXRFdmVudFNo bWVtU2l6ZSh2b2lkKTsKK2V4dGVybiB2b2lkIFJlcXVlc3ROYW1lZEV4dGVuc2lvbldhaXRFdmVu dFRyYW5jaGUoY29uc3QgY2hhciAqdHJhbmNoZV9uYW1lKTsKK2V4dGVybiB1aW50MzIgR2V0TmFt ZWRFeHRlbnNpb25XYWl0RXZlbnRUcmFuY2hlKGNvbnN0IGNoYXIgKnRyYW5jaGVfbmFtZSk7CisK Ky8qIHN0cnVjdCBmb3Igc3RvcmluZyBuYW1lZCB0cmFuY2hlIGluZm9ybWF0aW9uICovCit0eXBl ZGVmIHN0cnVjdCBOYW1lZEV4dGVuc2lvbldhaXRFdmVudFRyYW5jaGUKK3sKKwl1aW50MTYJCXRy YW5jaGVJZDsKKwljaGFyCSAgICp0cmFuY2hlTmFtZTsKK30JCQlOYW1lZEV4dGVuc2lvbldhaXRF dmVudFRyYW5jaGU7CisKK2V4dGVybiBQR0RMTElNUE9SVCBOYW1lZEV4dGVuc2lvbldhaXRFdmVu dFRyYW5jaGUgKiBOYW1lZEV4dGVuc2lvbldhaXRFdmVudFRyYW5jaGVBcnJheTsKK2V4dGVybiBQ R0RMTElNUE9SVCBpbnQgTmFtZWRFeHRlbnNpb25XYWl0RXZlbnRUcmFuY2hlUmVxdWVzdHM7CisK IC8qIC0tLS0tLS0tLS0KICAqIFdhaXQgRXZlbnRzIC0gSVBDCiAgKgotLSAKMi4yNS4xCgo= --=_2e1da3179149182792001d5129ee6bec Content-Transfer-Encoding: base64 Content-Type: text/x-diff; name=0003-Add-docs-to-define-custom-wait-events.patch Content-Disposition: attachment; filename=0003-Add-docs-to-define-custom-wait-events.patch; size=3073 RnJvbSA2NWUyNWQ0YjI3YmJiNmQwOTM0ODcyMzEwYzI0ZWUxOWY4OWU5NjMxIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBNYXNhaGlybyBJa2VkYSA8bWFzYWhpcm8uaWtlZGEudXNAaGNv Lm50dC5jby5qcD4KRGF0ZTogVGh1LCAxNSBKdW4gMjAyMyAxMzoxNjowMCArMDkwMApTdWJqZWN0 OiBbUEFUQ0ggMy8zXSBBZGQgZG9jcyB0byBkZWZpbmUgY3VzdG9tIHdhaXQgZXZlbnRzCgotLS0K IGRvYy9zcmMvc2dtbC9tb25pdG9yaW5nLnNnbWwgfCAgNyArKysrKysrCiBkb2Mvc3JjL3NnbWwv eGZ1bmMuc2dtbCAgICAgIHwgMjIgKysrKysrKysrKysrKysrKysrKy0tLQogMiBmaWxlcyBjaGFu Z2VkLCAyNiBpbnNlcnRpb25zKCspLCAzIGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL2RvYy9z cmMvc2dtbC9tb25pdG9yaW5nLnNnbWwgYi9kb2Mvc3JjL3NnbWwvbW9uaXRvcmluZy5zZ21sCmlu ZGV4IDVjZmRjNzBjMDMuLmFlZmRjMDNkYmQgMTAwNjQ0Ci0tLSBhL2RvYy9zcmMvc2dtbC9tb25p dG9yaW5nLnNnbWwKKysrIGIvZG9jL3NyYy9zZ21sL21vbml0b3Jpbmcuc2dtbApAQCAtMTI1Nyw2 ICsxMjU3LDEzIEBAIHBvc3RncmVzICAgMjcwOTMgIDAuMCAgMC4wICAzMDA5NiAgMjc1MiA/ICAg ICAgICBTcyAgIDExOjM0ICAgMDowMCBwb3N0Z3Jlczogc2VyCiAgICA8L3Rncm91cD4KICAgPC90 YWJsZT4KIAorICA8bm90ZT4KKyAgIDxwYXJhPgorICAgIEV4dGVuc2lvbnMgY2FuIGFkZCA8bGl0 ZXJhbD5FeHRlbnNpb248L2xpdGVyYWw+IHR5cGVzIHRvIHRoZSBsaXN0IHNob3duIGluCisgICAg PHhyZWYgbGlua2VuZD0id2FpdC1ldmVudC1leHRlbnNpb24tdGFibGUiLz4uCisgICA8L3BhcmE+ CisgIDwvbm90ZT4KKwogICA8dGFibGUgaWQ9IndhaXQtZXZlbnQtaW8tdGFibGUiPgogICAgPHRp dGxlPldhaXQgRXZlbnRzIG9mIFR5cGUgPGxpdGVyYWw+SU88L2xpdGVyYWw+PC90aXRsZT4KICAg IDx0Z3JvdXAgY29scz0iMiI+CmRpZmYgLS1naXQgYS9kb2Mvc3JjL3NnbWwveGZ1bmMuc2dtbCBi L2RvYy9zcmMvc2dtbC94ZnVuYy5zZ21sCmluZGV4IDk2MjBlYTlhZTMuLjE2MmQ1MGUyNzMgMTAw NjQ0Ci0tLSBhL2RvYy9zcmMvc2dtbC94ZnVuYy5zZ21sCisrKyBiL2RvYy9zcmMvc2dtbC94ZnVu Yy5zZ21sCkBAIC0zMzk3LDE2ICszMzk3LDE2IEBAIENSRUFURSBGVU5DVElPTiBtYWtlX2FycmF5 KGFueWVsZW1lbnQpIFJFVFVSTlMgYW55YXJyYXkKICAgIDwvc2VjdDI+CiAKICAgIDxzZWN0MiBp ZD0ieGZ1bmMtc2hhcmVkLWFkZGluIj4KLSAgICA8dGl0bGU+U2hhcmVkIE1lbW9yeSBhbmQgTFdM b2NrczwvdGl0bGU+CisgICAgPHRpdGxlPlNoYXJlZCBNZW1vcnkgYWxsb2NhdGVkIGJ5IGFkZGlu czwvdGl0bGU+CiAKICAgICA8cGFyYT4KLSAgICAgQWRkLWlucyBjYW4gcmVzZXJ2ZSBMV0xvY2tz IGFuZCBhbiBhbGxvY2F0aW9uIG9mIHNoYXJlZCBtZW1vcnkgb24gc2VydmVyCisgICAgIEFkZC1p bnMgY2FuIHJlc2VydmUgTFdMb2Nrcywgd2FpdCBldmVudHMsIGFuZCBhbiBhbGxvY2F0aW9uIG9m IHNoYXJlZCBtZW1vcnkgb24gc2VydmVyCiAgICAgIHN0YXJ0dXAuICBUaGUgYWRkLWluJ3Mgc2hh cmVkIGxpYnJhcnkgbXVzdCBiZSBwcmVsb2FkZWQgYnkgc3BlY2lmeWluZwogICAgICBpdCBpbgog ICAgICA8eHJlZiBsaW5rZW5kPSJndWMtc2hhcmVkLXByZWxvYWQtbGlicmFyaWVzIi8+PGluZGV4 dGVybT48cHJpbWFyeT5zaGFyZWRfcHJlbG9hZF9saWJyYXJpZXM8L3ByaW1hcnk+PC9pbmRleHRl cm0+LgogICAgICBUaGUgc2hhcmVkIGxpYnJhcnkgc2hvdWxkIHJlZ2lzdGVyIGEgPGxpdGVyYWw+ c2htZW1fcmVxdWVzdF9ob29rPC9saXRlcmFsPgogICAgICBpbiBpdHMgPGZ1bmN0aW9uPl9QR19p bml0PC9mdW5jdGlvbj4gZnVuY3Rpb24uICBUaGlzCi0gICAgIDxsaXRlcmFsPnNobWVtX3JlcXVl c3RfaG9vazwvbGl0ZXJhbD4gY2FuIHJlc2VydmUgTFdMb2NrcyBvciBzaGFyZWQgbWVtb3J5Lgor ICAgICA8bGl0ZXJhbD5zaG1lbV9yZXF1ZXN0X2hvb2s8L2xpdGVyYWw+IGNhbiByZXNlcnZlIExX TG9ja3MsIHdhaXQgZXZlbnRzLCBvciBzaGFyZWQgbWVtb3J5LgogICAgICBTaGFyZWQgbWVtb3J5 IGlzIHJlc2VydmVkIGJ5IGNhbGxpbmc6CiA8cHJvZ3JhbWxpc3Rpbmc+CiB2b2lkIFJlcXVlc3RB ZGRpblNobWVtU3BhY2UoaW50IHNpemUpCkBAIC0zNDUxLDYgKzM0NTEsMjIgQEAgaWYgKCFwdHIp CiB9CiA8L3Byb2dyYW1saXN0aW5nPgogICAgIDwvcGFyYT4KKyAgICA8cGFyYT4KKyAgICAgd2Fp dCBldmVudHMgYXJlIHJlc2VydmVkIGJ5IGNhbGxpbmc6Cis8cHJvZ3JhbWxpc3Rpbmc+Cit2b2lk IFJlcXVlc3ROYW1lZEV4dGVuc2lvbldhaXRFdmVudFRyYW5jaGUoY29uc3QgY2hhciAqdHJhbmNo ZV9uYW1lKQorPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgZnJvbSB5b3VyIDxsaXRlcmFsPnNobWVt X3JlcXVlc3RfaG9vazwvbGl0ZXJhbD4uICBUaGlzIHdpbGwgZW5zdXJlIHRoYXQgCisgICAgIHdh aXQgZXZlbnQgaXMgYXZhaWxhYmxlIHVuZGVyIHRoZSBuYW1lIDxsaXRlcmFsPnRyYW5jaGVfbmFt ZTwvbGl0ZXJhbD4sCisgICAgIHdoaWNoIHRoZSB3YWl0IGV2ZW50IHR5cGUgaXMgPGxpdGVyYWw+ RXh0ZW5zaW9uPC9saXRlcmFsPi4KKyAgICAgVXNlIDxmdW5jdGlvbj5HZXROYW1lZEV4dGVuc2lv bldhaXRFdmVudFRyYW5jaGU8L2Z1bmN0aW9uPgorICAgICB0byBnZXQgYSB3YWl0IGV2ZW50IGlu Zm9ybWF0aW9uLgorICAgIDwvcGFyYT4KKyAgICA8cGFyYT4KKyAgICAgVG8gYXZvaWQgcG9zc2li bGUgcmFjZS1jb25kaXRpb25zLCBlYWNoIGJhY2tlbmQgc2hvdWxkIHVzZSB0aGUgTFdMb2NrCisg ICAgIDxmdW5jdGlvbj5BZGRpblNobWVtSW5pdExvY2s8L2Z1bmN0aW9uPiB3aGVuIGNvbm5lY3Rp bmcgdG8gYW5kIGluaXRpYWxpemluZworICAgICBpdHMgYWxsb2NhdGlvbiBvZiBzaGFyZWQgbWVt b3J5LCBzYW1lIGFzIExXTG9ja3MgcmVzZXJ2YXRpb25zIGFib3ZlLgorICAgIDwvcGFyYT4KICAg IDwvc2VjdDI+CiAKICAgIDxzZWN0MiBpZD0iZXh0ZW5kLWNwcCI+Ci0tIAoyLjI1LjEKCg== --=_2e1da3179149182792001d5129ee6bec Content-Transfer-Encoding: base64 Content-Type: text/x-diff; name=0002-Add-a-extension-to-test-custom-wait-event.patch Content-Disposition: attachment; filename=0002-Add-a-extension-to-test-custom-wait-event.patch; size=5835 RnJvbSA5N2IxYmMxYWMzNzkwMzg3MDFkMWI1N2Y4ZjY0MTQ5YjEzZmMzNTFiIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBNYXNhaGlybyBJa2VkYSA8bWFzYWhpcm8uaWtlZGEudXNAaGNv Lm50dC5jby5qcD4KRGF0ZTogVGh1LCAxNSBKdW4gMjAyMyAxMToyNDowMSArMDkwMApTdWJqZWN0 OiBbUEFUQ0ggMS8zXSBBZGQgYSBleHRlbnNpb24gdG8gdGVzdCBjdXN0b20gd2FpdCBldmVudAoK U2luY2UgdGhlIGV4dGVuc2lvbiBpcyB1c2VkIGZvciBvbmx5IGRldmVsb3BtZW50LCBpdCdzIG5v dCBpbnRlbmRlZAp0byBiZSBjb21taXRlZCBpbiBtYXN0ZXIgYnJhbmNoLgotLS0KIGNvbnRyaWIv aW5qZWN0X3dhaXRfZXZlbnQvLmdpdGlnbm9yZSAgICAgICAgICB8ICAgMSArCiBjb250cmliL2lu amVjdF93YWl0X2V2ZW50L01ha2VmaWxlICAgICAgICAgICAgfCAgMjQgKysrKwogLi4uL2luamVj dF93YWl0X2V2ZW50LS0xLjAuc3FsICAgICAgICAgICAgICAgIHwgIDEyICsrCiBjb250cmliL2lu amVjdF93YWl0X2V2ZW50L2luamVjdF93YWl0X2V2ZW50LmMgfCAxMTkgKysrKysrKysrKysrKysr KysrCiAuLi4vaW5qZWN0X3dhaXRfZXZlbnQuY29udHJvbCAgICAgICAgICAgICAgICAgfCAgIDQg KwogNSBmaWxlcyBjaGFuZ2VkLCAxNjAgaW5zZXJ0aW9ucygrKQogY3JlYXRlIG1vZGUgMTAwNjQ0 IGNvbnRyaWIvaW5qZWN0X3dhaXRfZXZlbnQvLmdpdGlnbm9yZQogY3JlYXRlIG1vZGUgMTAwNjQ0 IGNvbnRyaWIvaW5qZWN0X3dhaXRfZXZlbnQvTWFrZWZpbGUKIGNyZWF0ZSBtb2RlIDEwMDY0NCBj b250cmliL2luamVjdF93YWl0X2V2ZW50L2luamVjdF93YWl0X2V2ZW50LS0xLjAuc3FsCiBjcmVh dGUgbW9kZSAxMDA2NDQgY29udHJpYi9pbmplY3Rfd2FpdF9ldmVudC9pbmplY3Rfd2FpdF9ldmVu dC5jCiBjcmVhdGUgbW9kZSAxMDA2NDQgY29udHJpYi9pbmplY3Rfd2FpdF9ldmVudC9pbmplY3Rf d2FpdF9ldmVudC5jb250cm9sCgpkaWZmIC0tZ2l0IGEvY29udHJpYi9pbmplY3Rfd2FpdF9ldmVu dC8uZ2l0aWdub3JlIGIvY29udHJpYi9pbmplY3Rfd2FpdF9ldmVudC8uZ2l0aWdub3JlCm5ldyBm aWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAuLjQzY2VhNjQ4MGEKLS0tIC9kZXYvbnVs bAorKysgYi9jb250cmliL2luamVjdF93YWl0X2V2ZW50Ly5naXRpZ25vcmUKQEAgLTAsMCArMSBA QAoraW5qZWN0X3dhaXRfZXZlbnQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1n aXQgYS9jb250cmliL2luamVjdF93YWl0X2V2ZW50L01ha2VmaWxlIGIvY29udHJpYi9pbmplY3Rf d2FpdF9ldmVudC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAw Li40MDIyMWU3YWMyCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi9pbmplY3Rfd2FpdF9ldmVu dC9NYWtlZmlsZQpAQCAtMCwwICsxLDI0IEBACisjIGNvbnRyaWIvaW5qZWN0X3dhaXRfZXZlbnQv TWFrZWZpbGUKKworTU9EVUxFX2JpZwk9IGluamVjdF93YWl0X2V2ZW50CisKK09CSlMgPSBcCisJ JChXSU4zMlJFUykgXAorCWluamVjdF93YWl0X2V2ZW50Lm8KKworRVhURU5TSU9OID0gaW5qZWN0 X3dhaXRfZXZlbnQKK0RBVEEgPSBpbmplY3Rfd2FpdF9ldmVudC0tMS4wLnNxbAorUEdGSUxFREVT QyA9ICJpbmplY3Qgd2FpdCBldmVudCBmb3IgdGVzdCIKKworVEFQX1RFU1RTID0gMAorCitpZmRl ZiBVU0VfUEdYUworUEdfQ09ORklHID0gcGdfY29uZmlnCitQR1hTIDo9ICQoc2hlbGwgJChQR19D T05GSUcpIC0tcGd4cykKK2luY2x1ZGUgJChQR1hTKQorZWxzZQorc3ViZGlyID0gY29udHJpYi9p bmplY3Rfd2FpdF9ldmVudAordG9wX2J1aWxkZGlyID0gLi4vLi4KK2luY2x1ZGUgJCh0b3BfYnVp bGRkaXIpL3NyYy9NYWtlZmlsZS5nbG9iYWwKK2luY2x1ZGUgJCh0b3Bfc3JjZGlyKS9jb250cmli L2NvbnRyaWItZ2xvYmFsLm1rCitlbmRpZgpkaWZmIC0tZ2l0IGEvY29udHJpYi9pbmplY3Rfd2Fp dF9ldmVudC9pbmplY3Rfd2FpdF9ldmVudC0tMS4wLnNxbCBiL2NvbnRyaWIvaW5qZWN0X3dhaXRf ZXZlbnQvaW5qZWN0X3dhaXRfZXZlbnQtLTEuMC5zcWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5k ZXggMDAwMDAwMDAwMC4uOGViYWI0MTVjMwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvaW5q ZWN0X3dhaXRfZXZlbnQvaW5qZWN0X3dhaXRfZXZlbnQtLTEuMC5zcWwKQEAgLTAsMCArMSwxMiBA QAorLyogY29udHJpYi9pbmplY3Rfd2FpdF9ldmVudC9pbmplY3Rfd2FpdF9ldmVudC0tMS4wLnNx bCAqLworCistLSBjb21wbGFpbiBpZiBzY3JpcHQgaXMgc291cmNlZCBpbiBwc3FsLCByYXRoZXIg dGhhbiB2aWEgQ1JFQVRFIEVYVEVOU0lPTgorXGVjaG8gVXNlICJDUkVBVEUgRVhURU5TSU9OIGlu amVjdF93YWl0X2V2ZW50IiB0byBsb2FkIHRoaXMgZmlsZS4gXHF1aXQKKworLS0KKy0tIGluamVj dF93YWl0X2V2ZW50KCkKKy0tCitDUkVBVEUgRlVOQ1RJT04gaW5qZWN0X3dhaXRfZXZlbnQoKQor UkVUVVJOUyBWT0lECitBUyAnTU9EVUxFX1BBVEhOQU1FJywgJ2luamVjdF93YWl0X2V2ZW50Jwor TEFOR1VBR0UgQyBTVFJJQ1QgUEFSQUxMRUwgUkVTVFJJQ1RFRDsKZGlmZiAtLWdpdCBhL2NvbnRy aWIvaW5qZWN0X3dhaXRfZXZlbnQvaW5qZWN0X3dhaXRfZXZlbnQuYyBiL2NvbnRyaWIvaW5qZWN0 X3dhaXRfZXZlbnQvaW5qZWN0X3dhaXRfZXZlbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRl eCAwMDAwMDAwMDAwLi5iOTY3MzgwOGQzCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi9pbmpl Y3Rfd2FpdF9ldmVudC9pbmplY3Rfd2FpdF9ldmVudC5jCkBAIC0wLDAgKzEsMTE5IEBACisvKi0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0KKyAqCisgKiBpbmplY3Rfd2FpdF9ldmVudC5jCisgKiAgICAgU3VwcG9y dCBhIGZ1bmN0aW9uIHRvIGluamVjdCB3YWl0IGV2ZW50cyBmb3IgdGVzdAorICoKKyAqIFNpbmNl IHRoZSBleHRlbnNpb24gYXNzdW1lcyB0byBiZSB1c2VkIGZvciBvbmx5IGRldmVsb3BtZW50LAor ICogZG9uJ3QgY29tbWl0IHRoZSBtYXN0ZXIgYnJhbmNoLgorICoKKyAqLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LQorICovCisjaW5jbHVkZSAicG9zdGdyZXMuaCIKKworI2luY2x1ZGUgImZtZ3IuaCIKKyNpbmNs dWRlICJtaXNjYWRtaW4uaCIKKyNpbmNsdWRlICJzdG9yYWdlL2lwYy5oIgorI2luY2x1ZGUgInN0 b3JhZ2UvbHdsb2NrLmgiCisjaW5jbHVkZSAic3RvcmFnZS9sYXRjaC5oIgorI2luY2x1ZGUgInN0 b3JhZ2Uvc2htZW0uaCIKKyNpbmNsdWRlICJ1dGlscy93YWl0X2V2ZW50LmgiCisKK1BHX01PRFVM RV9NQUdJQzsKKworUEdfRlVOQ1RJT05fSU5GT19WMShpbmplY3Rfd2FpdF9ldmVudCk7CisKK3R5 cGVkZWYgc3RydWN0IHN0YXRlCit7CisJdWludDMyCQljdXN0b21fd2FpdF9ldmVudDsJLyogY3Vz dG9tIGEgd2FpdCBldmVudCAqLworfQkJCXN0YXRlOworCitzdGF0aWMgc2htZW1fcmVxdWVzdF9o b29rX3R5cGUgcHJldl9zaG1lbV9yZXF1ZXN0X2hvb2sgPSBOVUxMOworc3RhdGljIHNobWVtX3Jl cXVlc3RfaG9va190eXBlIHByZXZfc2htZW1fc3RhcnR1cF9ob29rID0gTlVMTDsKKworc3RhdGlj IHN0YXRlICogc3MgPSBOVUxMOworCitzdGF0aWMgdm9pZCBzaG1lbV9yZXF1ZXN0KHZvaWQpOwor c3RhdGljIHZvaWQgc2htZW1fc3RhcnR1cCh2b2lkKTsKK3N0YXRpYyB2b2lkIHNobWVtX3N0YXJ0 dXAodm9pZCk7CitzdGF0aWMgU2l6ZSBtZW1zaXplKHZvaWQpOworCit2b2lkCitfUEdfaW5pdCh2 b2lkKQoreworCWlmICghcHJvY2Vzc19zaGFyZWRfcHJlbG9hZF9saWJyYXJpZXNfaW5fcHJvZ3Jl c3MpCisJCXJldHVybjsKKworCXByZXZfc2htZW1fcmVxdWVzdF9ob29rID0gc2htZW1fcmVxdWVz dF9ob29rOworCXNobWVtX3JlcXVlc3RfaG9vayA9IHNobWVtX3JlcXVlc3Q7CisJcHJldl9zaG1l bV9zdGFydHVwX2hvb2sgPSBzaG1lbV9zdGFydHVwX2hvb2s7CisJc2htZW1fc3RhcnR1cF9ob29r ID0gc2htZW1fc3RhcnR1cDsKK30KKworc3RhdGljIHZvaWQKK3NobWVtX3JlcXVlc3Qodm9pZCkK K3sKKwlpZiAocHJldl9zaG1lbV9yZXF1ZXN0X2hvb2spCisJCXByZXZfc2htZW1fcmVxdWVzdF9o b29rKCk7CisKKwlSZXF1ZXN0QWRkaW5TaG1lbVNwYWNlKG1lbXNpemUoKSk7CisKKwkvKiBkZWZp bmUgYSBjdXN0b20gd2FpdCBldmVudCAqLworCVJlcXVlc3ROYW1lZEV4dGVuc2lvbldhaXRFdmVu dFRyYW5jaGUoImN1c3RvbV93YWl0X2V2ZW50Iik7Cit9CisKK3N0YXRpYyB2b2lkCitzaG1lbV9z dGFydHVwKHZvaWQpCit7CisJYm9vbAkJZm91bmQ7CisKKwlpZiAocHJldl9zaG1lbV9zdGFydHVw X2hvb2spCisJCXByZXZfc2htZW1fc3RhcnR1cF9ob29rKCk7CisKKwlzcyA9IE5VTEw7CisKKwkv KgorCSAqIENyZWF0ZSBvciBhdHRhY2ggdG8gdGhlIHNoYXJlZCBtZW1vcnkgc3RhdGUKKwkgKi8K KwlMV0xvY2tBY3F1aXJlKEFkZGluU2htZW1Jbml0TG9jaywgTFdfRVhDTFVTSVZFKTsKKwlzcyA9 IFNobWVtSW5pdFN0cnVjdCgiaW5qZWN0X3dhaXRfZXZlbnQiLAorCQkJCQkJIHNpemVvZihzdGF0 ZSksCisJCQkJCQkgJmZvdW5kKTsKKworCWlmICghZm91bmQpCisJeworCQlzcy0+Y3VzdG9tX3dh aXRfZXZlbnQgPSBHZXROYW1lZEV4dGVuc2lvbldhaXRFdmVudFRyYW5jaGUoImN1c3RvbV93YWl0 X2V2ZW50Iik7CisJfQorCUxXTG9ja1JlbGVhc2UoQWRkaW5TaG1lbUluaXRMb2NrKTsKKworCXJl dHVybjsKK30KKworc3RhdGljIFNpemUKK21lbXNpemUodm9pZCkKK3sKKwlTaXplCQlzaXplOwor CisJc2l6ZSA9IE1BWEFMSUdOKHNpemVvZihzdGF0ZSkpOworCisJcmV0dXJuIHNpemU7Cit9CisK K0RhdHVtCitpbmplY3Rfd2FpdF9ldmVudChQR19GVU5DVElPTl9BUkdTKQoreworCS8qIGRlZmF1 bHQgKi8KKwkodm9pZCkgV2FpdExhdGNoKE15TGF0Y2gsCisJCQkJCSBXTF9MQVRDSF9TRVQgfCBX TF9USU1FT1VUIHwgV0xfRVhJVF9PTl9QTV9ERUFUSCwKKwkJCQkJIDEwTCAqIDEwMDAsCS8qIDEw cyAqLworCQkJCQkgUEdfV0FJVF9FWFRFTlNJT04pOworCVJlc2V0TGF0Y2goTXlMYXRjaCk7CisK KwkvKiBjdXN0b20gd2FpdCBldmVudCAqLworCSh2b2lkKSBXYWl0TGF0Y2goTXlMYXRjaCwKKwkJ CQkJIFdMX0xBVENIX1NFVCB8IFdMX1RJTUVPVVQgfCBXTF9FWElUX09OX1BNX0RFQVRILAorCQkJ CQkgMTBMICogMTAwMCwJLyogMTBzICovCisJCQkJCSBzcy0+Y3VzdG9tX3dhaXRfZXZlbnQpOwor CVJlc2V0TGF0Y2goTXlMYXRjaCk7CisKKwlQR19SRVRVUk5fVk9JRCgpOworfQpkaWZmIC0tZ2l0 IGEvY29udHJpYi9pbmplY3Rfd2FpdF9ldmVudC9pbmplY3Rfd2FpdF9ldmVudC5jb250cm9sIGIv Y29udHJpYi9pbmplY3Rfd2FpdF9ldmVudC9pbmplY3Rfd2FpdF9ldmVudC5jb250cm9sCm5ldyBm aWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAuLjNmMTEzMjE4NWUKLS0tIC9kZXYvbnVs bAorKysgYi9jb250cmliL2luamVjdF93YWl0X2V2ZW50L2luamVjdF93YWl0X2V2ZW50LmNvbnRy b2wKQEAgLTAsMCArMSw0IEBACisjIGluamVjdF93YWl0X2V2ZW50IGV4dGVuc2lvbgorY29tbWVu dCA9ICdhIGZ1bmN0aW9uIGZvciBpbmplY3Rpbmcgd2FpdCBldmVudCBmb3IgdGVzdCcKK2RlZmF1 bHRfdmVyc2lvbiA9ICcxLjAnCittb2R1bGVfcGF0aG5hbWUgPSAnJGxpYmRpci9pbmplY3Rfd2Fp dF9ldmVudCcKLS0gCjIuMjUuMQoK --=_2e1da3179149182792001d5129ee6bec--