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 1o1QWZ-0007Xk-Sw for pgsql-hackers@arkaria.postgresql.org; Wed, 15 Jun 2022 10:45:24 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1o1QWW-0002sZ-Ud for pgsql-hackers@arkaria.postgresql.org; Wed, 15 Jun 2022 10:45:20 +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 1o1QWW-0002sQ-8E for pgsql-hackers@lists.postgresql.org; Wed, 15 Jun 2022 10:45:20 +0000 Received: from mail-ej1-x635.google.com ([2a00:1450:4864:20::635]) by makus.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.92) (envelope-from ) id 1o1QWN-0002D7-Ig for pgsql-hackers@postgresql.org; Wed, 15 Jun 2022 10:45:18 +0000 Received: by mail-ej1-x635.google.com with SMTP id u12so22342596eja.8 for ; Wed, 15 Jun 2022 03:45:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cybertec-at.20210112.gappssmtp.com; s=20210112; h=message-id:date:mime-version:user-agent:from:subject:to:cc :content-language; bh=MpqQXI5x7n3d6PTLKcs3NW2oxt1ouZg9vCmfUGbgmLY=; b=w3fXuppOPmCSiwawKcpTCrpfInU9I7erZ7tTXNdp1q0NFdYpyLfMQ3MNBqkFruYWv2 EbvKJK6m6pUj7mt+giWvKY3AmYGegBb6LCNQph4UPjdtxQwOGbqF92u5vCRCzuPur/0B cY7tMv8Bz92Vab5tz1nkiw7Su8PfXrfjOjnjlyO9dlobmPmUXhs7UG8Idvk+f3fAB3Kb 78fdxMuikGh3ztN7RUZwGxSKMggoHAtGRy2Ptosn5xUQOZnh3x5fYe2Ohnb/fgRA3hTr btukFkBk/EQxV0coAv5qh5sKQsLD13bfHPghkOg+NrHYRnxCw7xNdDCanSIGg5gT3RRv qCtg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:message-id:date:mime-version:user-agent:from :subject:to:cc:content-language; bh=MpqQXI5x7n3d6PTLKcs3NW2oxt1ouZg9vCmfUGbgmLY=; b=lTMOwvUl/AAImN9tdpkyCALBY0ZgA0pWye4Lj4ErsDa0cBvWmpLQMqG0DfpeoiH/MH zJVK4+TPgJ5pGOLi71s3tOq2zr04/yGszVQCOvTd8sgBaOPVHaktGTRlom/d8Tw1ohhA Aj74t4jSauC0CTgiD9nih1LWWW6WA2r2L4zmozb2VB8a1KFG6YCcCGUm2zd/wmluM8ZQ xll4xa3jQQE3Kqzu6qeHoP2lH+rjBd4Tq4rpAfrU2V1E5uFWJ7Ii760kZ/MDkH9pGS7t 3/YZflNB7jP2CS0BkwjSs6i54obqjNk49fud7kmVM2fa/jTysFTlBR80YBAU0ASeMl+9 J+dw== X-Gm-Message-State: AOAM530A1C7xrkV3i457DeJ/0DiIKa9JdmsggMznsx1k2mHfkzcFN+s1 fkpnLCMfQ+DalmgWE1E6JYptsCunYerrXw== X-Google-Smtp-Source: ABdhPJwJM48bPJweMthdjcjmOMAaez34XP7slgTbMiE0P1VJ/LMcGrYePX0cXhD4JTk/tbUR+zn+mw== X-Received: by 2002:a17:906:af6f:b0:70c:3a9b:95c7 with SMTP id os15-20020a170906af6f00b0070c3a9b95c7mr8409388ejb.2.1655289909121; Wed, 15 Jun 2022 03:45:09 -0700 (PDT) Received: from [10.240.0.80] (84-115-233-123.cable.dynamic.surfer.at. [84.115.233.123]) by smtp.gmail.com with ESMTPSA id ah19-20020a1709069ad300b00705976bcd01sm6080518ejc.206.2022.06.15.03.45.08 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Wed, 15 Jun 2022 03:45:08 -0700 (PDT) Content-Type: multipart/mixed; boundary="------------VAPH8cmp0y9H1Q41GOCjujpZ" Message-ID: <437ccbcf-8f80-2919-411d-a3af88becf6c@cybertec.at> Date: Wed, 15 Jun 2022 12:45:07 +0200 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.10.0 From: Christoph Heiss Subject: [PATCH] Add sortsupport for range types and btree_gist To: PostgreSQL Hackers Cc: =?UTF-8?B?SGFucy1Kw7xyZ2VuIFNjaMO2bmln?= Content-Language: en-US List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk This is a multi-part message in MIME format. --------------VAPH8cmp0y9H1Q41GOCjujpZ Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Hi all! The motivation behind this is that incrementally building up a GiST index for certain input data can create a terrible tree structure. Furthermore, exclusion constraints are commonly implemented using GiST indices and for that use case, data is mostly orderable. By sorting the data before inserting it into the index results in a much better index structure, leading to significant performance improvements. Testing was done using following setup, with about 50 million rows: CREATE EXTENSION btree_gist; CREATE TABLE t (id uuid, block_range int4range); CREATE INDEX ON before USING GIST (id, block_range); COPY t FROM '..' DELIMITER ',' CSV HEADER; using SELECT * FROM t WHERE id = '..' AND block_range && '..' as test query, using a unpatched instance and one with the patch applied. Some stats for fetching 10,000 random rows using the query above, 100 iterations to get good averages. The benchmarking was done on a unpatched instance compiled using the exact same options as with the patch applied. [ Results are noted in a unpatched -> patched fashion. ] First set of results are after the initial CREATE TABLE, CREATE INDEX and a COPY to the table, thereby incrementally building the index. Shared Hit Blocks (average): 110.97 -> 78.58 Shared Read Blocks (average): 58.90 -> 47.42 Execution Time (average): 1.10 -> 0.83 ms I/O Read Time (average): 0.19 -> 0.15 ms After a REINDEX on the table, the results improve even more: Shared Hit Blocks (average): 84.24 -> 8.54 Shared Read Blocks (average): 49.89 -> 0.74 Execution Time (average): 0.84 -> 0.065 ms I/O Read Time (average): 0.16 -> 0.004 ms Additionally, the time a REINDEX takes also improves significantly: 672407.584 ms (11:12.408) -> 130670.232 ms (02:10.670) Most of the sortsupport for btree_gist was implemented by re-using already existing infrastructure. For the few remaining types (bit, bool, cash, enum, interval, macaddress8 and time) I manually implemented them directly in btree_gist. It might make sense to move them into the backend for uniformity, but I wanted to get other opinions on that first. `make check-world` reports no regressions. Attached below, besides the patch, are also two scripts for benchmarking. `bench-gist.py` to benchmark the actual patch, example usage of this would be e.g. `./bench-gist.py -o results.csv public.table`. This expects a local instance with no authentication and default `postgres` user. The port can be set using the `--port` option. `plot.py` prints average values (as used above) and creates boxplots for each statistic from the result files produced with `bench-gist.py`. Depends on matplotlib and pandas. Additionally, if needed, the sample dataset used to benchmark this is available to independently verify the results [1]. Thanks, Christoph Heiss --- [1] https://drive.google.com/file/d/1SKRiUYd78_zl7CeD8pLDoggzCCh0wj39 --------------VAPH8cmp0y9H1Q41GOCjujpZ Content-Type: text/x-patch; charset=UTF-8; name="0001-Add-sortsupport-for-range-types-and-btree_gist.patch" Content-Disposition: attachment; filename*0="0001-Add-sortsupport-for-range-types-and-btree_gist.patch" Content-Transfer-Encoding: base64 RnJvbSAyMmUxYjYwOTI5YzM5MzA5ZTA2YzI0NzdkOGQwMjdlNjBhZDQ5YjlkIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBDaHJpc3RvcGggSGVpc3MgPGNocmlzdG9waC5oZWlz c0BjeWJlcnRlYy5hdD4KRGF0ZTogVGh1LCA5IEp1biAyMDIyIDE3OjA3OjQ2ICswMjAwClN1 YmplY3Q6IFtQQVRDSCAxLzFdIEFkZCBzb3J0c3VwcG9ydCBmb3IgcmFuZ2UgdHlwZXMgYW5k IGJ0cmVlX2dpc3QKCkluY3JlbWVudGFsbHkgYnVpbGRpbmcgdXAgYSBHaVNUIGluZGV4IGNh biByZXN1bHQgaW4gYSBzdWItb3B0aW1hbCBpbmRleApzdHJ1Y3R1cmUgZm9yIHJhbmdlIHR5 cGVzLgpCeSBzb3J0aW5nIHRoZSBkYXRhIGJlZm9yZSBpbnNlcnRpbmcgaXQgaW50byB0aGUg aW5kZXggd2lsbCByZXN1bHQgaW4gYQptdWNoIGJldHRlciBpbmRleC4KClRoaXMgY2FuIHBy b3ZpZGUgc2l6ZWFibGUgaW1wcm92ZW1lbnRzIGluIHF1ZXJ5IGV4ZWN1dGlvbiB0aW1lLCBJ L08gcmVhZAp0aW1lIGFuZCBzaGFyZWQgYmxvY2sgaGl0cy9yZWFkcy4KClNpZ25lZC1vZmYt Ynk6IENocmlzdG9waCBIZWlzcyA8Y2hyaXN0b3BoLmhlaXNzQGN5YmVydGVjLmF0PgotLS0K IGNvbnRyaWIvYnRyZWVfZ2lzdC9NYWtlZmlsZSAgICAgICAgICAgICAgICAgfCAgIDMgKy0K IGNvbnRyaWIvYnRyZWVfZ2lzdC9idHJlZV9iaXQuYyAgICAgICAgICAgICAgfCAgMTkgKysr KwogY29udHJpYi9idHJlZV9naXN0L2J0cmVlX2Jvb2wuYyAgICAgICAgICAgICB8ICAyMiAr KysrCiBjb250cmliL2J0cmVlX2dpc3QvYnRyZWVfY2FzaC5jICAgICAgICAgICAgIHwgIDIy ICsrKysKIGNvbnRyaWIvYnRyZWVfZ2lzdC9idHJlZV9lbnVtLmMgICAgICAgICAgICAgfCAg MTkgKysrKwogY29udHJpYi9idHJlZV9naXN0L2J0cmVlX2dpc3QtLTEuNy0tMS44LnNxbCB8 IDEwNSArKysrKysrKysrKysrKysrKysrKwogY29udHJpYi9idHJlZV9naXN0L2J0cmVlX2dp c3QuY29udHJvbCAgICAgICB8ICAgMiArLQogY29udHJpYi9idHJlZV9naXN0L2J0cmVlX2lu dGVydmFsLmMgICAgICAgICB8ICAxOSArKysrCiBjb250cmliL2J0cmVlX2dpc3QvYnRyZWVf bWFjYWRkcjguYyAgICAgICAgIHwgIDE5ICsrKysKIGNvbnRyaWIvYnRyZWVfZ2lzdC9idHJl ZV90aW1lLmMgICAgICAgICAgICAgfCAgMTkgKysrKwogc3JjL2JhY2tlbmQvdXRpbHMvYWR0 L3JhbmdldHlwZXNfZ2lzdC5jICAgICB8ICA3MCArKysrKysrKysrKysrCiBzcmMvaW5jbHVk ZS9jYXRhbG9nL3BnX2FtcHJvYy5kYXQgICAgICAgICAgIHwgICAzICsKIHNyYy9pbmNsdWRl L2NhdGFsb2cvcGdfcHJvYy5kYXQgICAgICAgICAgICAgfCAgIDMgKwogMTMgZmlsZXMgY2hh bmdlZCwgMzIzIGluc2VydGlvbnMoKyksIDIgZGVsZXRpb25zKC0pCiBjcmVhdGUgbW9kZSAx MDA2NDQgY29udHJpYi9idHJlZV9naXN0L2J0cmVlX2dpc3QtLTEuNy0tMS44LnNxbAoKZGlm ZiAtLWdpdCBhL2NvbnRyaWIvYnRyZWVfZ2lzdC9NYWtlZmlsZSBiL2NvbnRyaWIvYnRyZWVf Z2lzdC9NYWtlZmlsZQppbmRleCA0ODk5N2M3NWY2Li40MDk2ZGU3M2VhIDEwMDY0NAotLS0g YS9jb250cmliL2J0cmVlX2dpc3QvTWFrZWZpbGUKKysrIGIvY29udHJpYi9idHJlZV9naXN0 L01ha2VmaWxlCkBAIC0zMyw3ICszMyw4IEBAIEVYVEVOU0lPTiA9IGJ0cmVlX2dpc3QKIERB VEEgPSBidHJlZV9naXN0LS0xLjAtLTEuMS5zcWwgXAogICAgICAgIGJ0cmVlX2dpc3QtLTEu MS0tMS4yLnNxbCBidHJlZV9naXN0LS0xLjIuc3FsIGJ0cmVlX2dpc3QtLTEuMi0tMS4zLnNx bCBcCiAgICAgICAgYnRyZWVfZ2lzdC0tMS4zLS0xLjQuc3FsIGJ0cmVlX2dpc3QtLTEuNC0t MS41LnNxbCBcCi0gICAgICAgYnRyZWVfZ2lzdC0tMS41LS0xLjYuc3FsIGJ0cmVlX2dpc3Qt LTEuNi0tMS43LnNxbAorICAgICAgIGJ0cmVlX2dpc3QtLTEuNS0tMS42LnNxbCBidHJlZV9n aXN0LS0xLjYtLTEuNy5zcWwgXAorICAgICAgIGJ0cmVlX2dpc3QtLTEuNy0tMS44LnNxbAog UEdGSUxFREVTQyA9ICJidHJlZV9naXN0IC0gQi10cmVlIGVxdWl2YWxlbnQgR2lTVCBvcGVy YXRvciBjbGFzc2VzIgogCiBSRUdSRVNTID0gaW5pdCBpbnQyIGludDQgaW50OCBmbG9hdDQg ZmxvYXQ4IGNhc2ggb2lkIHRpbWVzdGFtcCB0aW1lc3RhbXB0eiBcCmRpZmYgLS1naXQgYS9j b250cmliL2J0cmVlX2dpc3QvYnRyZWVfYml0LmMgYi9jb250cmliL2J0cmVlX2dpc3QvYnRy ZWVfYml0LmMKaW5kZXggNWIyNDZiY2RlNC4uYmYzMmJmZDYyOCAxMDA2NDQKLS0tIGEvY29u dHJpYi9idHJlZV9naXN0L2J0cmVlX2JpdC5jCisrKyBiL2NvbnRyaWIvYnRyZWVfZ2lzdC9i dHJlZV9iaXQuYwpAQCAtNyw2ICs3LDcgQEAKICNpbmNsdWRlICJidHJlZV91dGlsc192YXIu aCIKICNpbmNsdWRlICJ1dGlscy9idWlsdGlucy5oIgogI2luY2x1ZGUgInV0aWxzL2J5dGVh LmgiCisjaW5jbHVkZSAidXRpbHMvc29ydHN1cHBvcnQuaCIKICNpbmNsdWRlICJ1dGlscy92 YXJiaXQuaCIKIAogCkBAIC0xOSwxMCArMjAsMTcgQEAgUEdfRlVOQ1RJT05fSU5GT19WMShn YnRfYml0X3BpY2tzcGxpdCk7CiBQR19GVU5DVElPTl9JTkZPX1YxKGdidF9iaXRfY29uc2lz dGVudCk7CiBQR19GVU5DVElPTl9JTkZPX1YxKGdidF9iaXRfcGVuYWx0eSk7CiBQR19GVU5D VElPTl9JTkZPX1YxKGdidF9iaXRfc2FtZSk7CitQR19GVU5DVElPTl9JTkZPX1YxKGdidF9i aXRfc29ydHN1cHBvcnQpOwogCiAKIC8qIGRlZmluZSBmb3IgY29tcGFyaXNvbiAqLwogCitz dGF0aWMgaW50CitiaXRfZmFzdF9jbXAoRGF0dW0geCwgRGF0dW0geSwgU29ydFN1cHBvcnQg c3N1cCkKK3sKKwlyZXR1cm4gRGF0dW1HZXRJbnQzMihEaXJlY3RGdW5jdGlvbkNhbGwyKGJ5 dGVhY21wLCB4LCB5KSk7Cit9CisKIHN0YXRpYyBib29sCiBnYnRfYml0Z3QoY29uc3Qgdm9p ZCAqYSwgY29uc3Qgdm9pZCAqYiwgT2lkIGNvbGxhdGlvbiwgRm1nckluZm8gKmZsaW5mbykK IHsKQEAgLTIwOCwzICsyMTYsMTQgQEAgZ2J0X2JpdF9wZW5hbHR5KFBHX0ZVTkNUSU9OX0FS R1MpCiAJUEdfUkVUVVJOX1BPSU5URVIoZ2J0X3Zhcl9wZW5hbHR5KHJlc3VsdCwgbywgbiwg UEdfR0VUX0NPTExBVElPTigpLAogCQkJCQkJCQkJICAmdGluZm8sIGZjaW5mby0+ZmxpbmZv KSk7CiB9CisKK0RhdHVtCitnYnRfYml0X3NvcnRzdXBwb3J0KFBHX0ZVTkNUSU9OX0FSR1Mp Cit7CisJU29ydFN1cHBvcnQgc3N1cCA9IChTb3J0U3VwcG9ydCkgUEdfR0VUQVJHX1BPSU5U RVIoMCk7CisKKwlzc3VwLT5jb21wYXJhdG9yID0gYml0X2Zhc3RfY21wOworCXNzdXAtPnNz dXBfZXh0cmEgPSBOVUxMOworCisJUEdfUkVUVVJOX1ZPSUQoKTsKK30KZGlmZiAtLWdpdCBh L2NvbnRyaWIvYnRyZWVfZ2lzdC9idHJlZV9ib29sLmMgYi9jb250cmliL2J0cmVlX2dpc3Qv YnRyZWVfYm9vbC5jCmluZGV4IDhiMmFmMTI5YjUuLjNhOWYyMzBlNjggMTAwNjQ0Ci0tLSBh L2NvbnRyaWIvYnRyZWVfZ2lzdC9idHJlZV9ib29sLmMKKysrIGIvY29udHJpYi9idHJlZV9n aXN0L2J0cmVlX2Jvb2wuYwpAQCAtNiw2ICs2LDcgQEAKICNpbmNsdWRlICJidHJlZV9naXN0 LmgiCiAjaW5jbHVkZSAiYnRyZWVfdXRpbHNfbnVtLmgiCiAjaW5jbHVkZSAiY29tbW9uL2lu dC5oIgorI2luY2x1ZGUgInV0aWxzL3NvcnRzdXBwb3J0LmgiCiAKIHR5cGVkZWYgc3RydWN0 IGJvb2xrZXkKIHsKQEAgLTIzLDYgKzI0LDE2IEBAIFBHX0ZVTkNUSU9OX0lORk9fVjEoZ2J0 X2Jvb2xfcGlja3NwbGl0KTsKIFBHX0ZVTkNUSU9OX0lORk9fVjEoZ2J0X2Jvb2xfY29uc2lz dGVudCk7CiBQR19GVU5DVElPTl9JTkZPX1YxKGdidF9ib29sX3BlbmFsdHkpOwogUEdfRlVO Q1RJT05fSU5GT19WMShnYnRfYm9vbF9zYW1lKTsKK1BHX0ZVTkNUSU9OX0lORk9fVjEoZ2J0 X2Jvb2xfc29ydHN1cHBvcnQpOworCitzdGF0aWMgaW50Citib29sX2Zhc3RfY21wKERhdHVt IHgsIERhdHVtIHksIFNvcnRTdXBwb3J0IHNzdXApCit7CisJYm9vbAlhcmcxID0gRGF0dW1H ZXRCb29sKHgpOworCWJvb2wJYXJnMiA9IERhdHVtR2V0Qm9vbCh5KTsKKworCXJldHVybiBh cmcxIC0gYXJnMjsKK30KIAogc3RhdGljIGJvb2wKIGdidF9ib29sZ3QoY29uc3Qgdm9pZCAq YSwgY29uc3Qgdm9pZCAqYiwgRm1nckluZm8gKmZsaW5mbykKQEAgLTE2NywzICsxNzgsMTQg QEAgZ2J0X2Jvb2xfc2FtZShQR19GVU5DVElPTl9BUkdTKQogCSpyZXN1bHQgPSBnYnRfbnVt X3NhbWUoKHZvaWQgKikgYjEsICh2b2lkICopIGIyLCAmdGluZm8sIGZjaW5mby0+ZmxpbmZv KTsKIAlQR19SRVRVUk5fUE9JTlRFUihyZXN1bHQpOwogfQorCitEYXR1bQorZ2J0X2Jvb2xf c29ydHN1cHBvcnQoUEdfRlVOQ1RJT05fQVJHUykKK3sKKwlTb3J0U3VwcG9ydCBzc3VwID0g KFNvcnRTdXBwb3J0KSBQR19HRVRBUkdfUE9JTlRFUigwKTsKKworCXNzdXAtPmNvbXBhcmF0 b3IgPSBib29sX2Zhc3RfY21wOworCXNzdXAtPnNzdXBfZXh0cmEgPSBOVUxMOworCisJUEdf UkVUVVJOX1ZPSUQoKTsKK30KZGlmZiAtLWdpdCBhL2NvbnRyaWIvYnRyZWVfZ2lzdC9idHJl ZV9jYXNoLmMgYi9jb250cmliL2J0cmVlX2dpc3QvYnRyZWVfY2FzaC5jCmluZGV4IDZhYzk3 ZTJiMTIuLjM4OWI3MjUxMzAgMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvYnRyZWVfZ2lzdC9idHJl ZV9jYXNoLmMKKysrIGIvY29udHJpYi9idHJlZV9naXN0L2J0cmVlX2Nhc2guYwpAQCAtNyw2 ICs3LDcgQEAKICNpbmNsdWRlICJidHJlZV91dGlsc19udW0uaCIKICNpbmNsdWRlICJjb21t b24vaW50LmgiCiAjaW5jbHVkZSAidXRpbHMvY2FzaC5oIgorI2luY2x1ZGUgInV0aWxzL3Nv cnRzdXBwb3J0LmgiCiAKIHR5cGVkZWYgc3RydWN0CiB7CkBAIC0yNSw2ICsyNiwxNiBAQCBQ R19GVU5DVElPTl9JTkZPX1YxKGdidF9jYXNoX2NvbnNpc3RlbnQpOwogUEdfRlVOQ1RJT05f SU5GT19WMShnYnRfY2FzaF9kaXN0YW5jZSk7CiBQR19GVU5DVElPTl9JTkZPX1YxKGdidF9j YXNoX3BlbmFsdHkpOwogUEdfRlVOQ1RJT05fSU5GT19WMShnYnRfY2FzaF9zYW1lKTsKK1BH X0ZVTkNUSU9OX0lORk9fVjEoZ2J0X2Nhc2hfc29ydHN1cHBvcnQpOworCitzdGF0aWMgaW50 CitjYXNoX2Zhc3RfY21wKERhdHVtIHgsIERhdHVtIHksIFNvcnRTdXBwb3J0IHNzdXApCit7 CisJYm9vbAlhcmcxID0gRGF0dW1HZXRDYXNoKHgpOworCWJvb2wJYXJnMiA9IERhdHVtR2V0 Q2FzaCh5KTsKKworCXJldHVybiBhcmcxIC0gYXJnMjsKK30KIAogc3RhdGljIGJvb2wKIGdi dF9jYXNoZ3QoY29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYiwgRm1nckluZm8gKmZsaW5m bykKQEAgLTIxNSwzICsyMjYsMTQgQEAgZ2J0X2Nhc2hfc2FtZShQR19GVU5DVElPTl9BUkdT KQogCSpyZXN1bHQgPSBnYnRfbnVtX3NhbWUoKHZvaWQgKikgYjEsICh2b2lkICopIGIyLCAm dGluZm8sIGZjaW5mby0+ZmxpbmZvKTsKIAlQR19SRVRVUk5fUE9JTlRFUihyZXN1bHQpOwog fQorCitEYXR1bQorZ2J0X2Nhc2hfc29ydHN1cHBvcnQoUEdfRlVOQ1RJT05fQVJHUykKK3sK KwlTb3J0U3VwcG9ydCBzc3VwID0gKFNvcnRTdXBwb3J0KSBQR19HRVRBUkdfUE9JTlRFUigw KTsKKworCXNzdXAtPmNvbXBhcmF0b3IgPSBjYXNoX2Zhc3RfY21wOworCXNzdXAtPnNzdXBf ZXh0cmEgPSBOVUxMOworCisJUEdfUkVUVVJOX1ZPSUQoKTsKK30KZGlmZiAtLWdpdCBhL2Nv bnRyaWIvYnRyZWVfZ2lzdC9idHJlZV9lbnVtLmMgYi9jb250cmliL2J0cmVlX2dpc3QvYnRy ZWVfZW51bS5jCmluZGV4IGQ0ZGMzOGEzOGUuLjJhYjBhZTliYzggMTAwNjQ0Ci0tLSBhL2Nv bnRyaWIvYnRyZWVfZ2lzdC9idHJlZV9lbnVtLmMKKysrIGIvY29udHJpYi9idHJlZV9naXN0 L2J0cmVlX2VudW0uYwpAQCAtNyw2ICs3LDcgQEAKICNpbmNsdWRlICJidHJlZV91dGlsc19u dW0uaCIKICNpbmNsdWRlICJmbWdyLmgiCiAjaW5jbHVkZSAidXRpbHMvYnVpbHRpbnMuaCIK KyNpbmNsdWRlICJ1dGlscy9zb3J0c3VwcG9ydC5oIgogCiAvKiBlbnVtcyBhcmUgcmVhbGx5 IE9pZHMsIHNvIHdlIGp1c3QgdXNlIHRoZSBzYW1lIHN0cnVjdHVyZSAqLwogCkBAIC0yNiw4 ICsyNywxNSBAQCBQR19GVU5DVElPTl9JTkZPX1YxKGdidF9lbnVtX3BpY2tzcGxpdCk7CiBQ R19GVU5DVElPTl9JTkZPX1YxKGdidF9lbnVtX2NvbnNpc3RlbnQpOwogUEdfRlVOQ1RJT05f SU5GT19WMShnYnRfZW51bV9wZW5hbHR5KTsKIFBHX0ZVTkNUSU9OX0lORk9fVjEoZ2J0X2Vu dW1fc2FtZSk7CitQR19GVU5DVElPTl9JTkZPX1YxKGdidF9lbnVtX3NvcnRzdXBwb3J0KTsK IAogCitzdGF0aWMgaW50CitlbnVtX2Zhc3RfY21wKERhdHVtIHgsIERhdHVtIHksIFNvcnRT dXBwb3J0IHNzdXApCit7CisJcmV0dXJuIERhdHVtR2V0SW50MzIoRGlyZWN0RnVuY3Rpb25D YWxsMihlbnVtX2NtcCwgeCwgeSkpOworfQorCiBzdGF0aWMgYm9vbAogZ2J0X2VudW1ndChj b25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiLCBGbWdySW5mbyAqZmxpbmZvKQogewpAQCAt MTgzLDMgKzE5MSwxNCBAQCBnYnRfZW51bV9zYW1lKFBHX0ZVTkNUSU9OX0FSR1MpCiAJKnJl c3VsdCA9IGdidF9udW1fc2FtZSgodm9pZCAqKSBiMSwgKHZvaWQgKikgYjIsICZ0aW5mbywg ZmNpbmZvLT5mbGluZm8pOwogCVBHX1JFVFVSTl9QT0lOVEVSKHJlc3VsdCk7CiB9CisKK0Rh dHVtCitnYnRfZW51bV9zb3J0c3VwcG9ydChQR19GVU5DVElPTl9BUkdTKQoreworCVNvcnRT dXBwb3J0IHNzdXAgPSAoU29ydFN1cHBvcnQpIFBHX0dFVEFSR19QT0lOVEVSKDApOworCisJ c3N1cC0+Y29tcGFyYXRvciA9IGVudW1fZmFzdF9jbXA7CisJc3N1cC0+c3N1cF9leHRyYSA9 IE5VTEw7CisKKwlQR19SRVRVUk5fVk9JRCgpOworfQpkaWZmIC0tZ2l0IGEvY29udHJpYi9i dHJlZV9naXN0L2J0cmVlX2dpc3QtLTEuNy0tMS44LnNxbCBiL2NvbnRyaWIvYnRyZWVfZ2lz dC9idHJlZV9naXN0LS0xLjctLTEuOC5zcWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXgg MDAwMDAwMDAwMC4uMDFiZDhmOWY2NAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvYnRy ZWVfZ2lzdC9idHJlZV9naXN0LS0xLjctLTEuOC5zcWwKQEAgLTAsMCArMSwxMDUgQEAKKy8q IGNvbnRyaWIvYnRyZWVfZ2lzdC9idHJlZV9naXN0LS0xLjctLTEuOC5zcWwgKi8KKworLS0g Y29tcGxhaW4gaWYgc2NyaXB0IGlzIHNvdXJjZWQgaW4gcHNxbCwgcmF0aGVyIHRoYW4gdmlh IENSRUFURSBFWFRFTlNJT04KK1xlY2hvIFVzZSAiQUxURVIgRVhURU5TSU9OIGJ0cmVlX2dp c3QgVVBEQVRFIFRPICcxLjgnIiB0byBsb2FkIHRoaXMgZmlsZS4gXHF1aXQKKworQ1JFQVRF IEZVTkNUSU9OIGdidF9iaXRfc29ydHN1cHBvcnQoaW50ZXJuYWwpCitSRVRVUk5TIHZvaWQK K0FTICdNT0RVTEVfUEFUSE5BTUUnCitMQU5HVUFHRSBDIElNTVVUQUJMRSBTVFJJQ1Q7CisK K0NSRUFURSBGVU5DVElPTiBnYnRfYm9vbF9zb3J0c3VwcG9ydChpbnRlcm5hbCkKK1JFVFVS TlMgdm9pZAorQVMgJ01PRFVMRV9QQVRITkFNRScKK0xBTkdVQUdFIEMgSU1NVVRBQkxFIFNU UklDVDsKKworQ1JFQVRFIEZVTkNUSU9OIGdidF9jYXNoX3NvcnRzdXBwb3J0KGludGVybmFs KQorUkVUVVJOUyB2b2lkCitBUyAnTU9EVUxFX1BBVEhOQU1FJworTEFOR1VBR0UgQyBJTU1V VEFCTEUgU1RSSUNUOworCitDUkVBVEUgRlVOQ1RJT04gZ2J0X2VudW1fc29ydHN1cHBvcnQo aW50ZXJuYWwpCitSRVRVUk5TIHZvaWQKK0FTICdNT0RVTEVfUEFUSE5BTUUnCitMQU5HVUFH RSBDIElNTVVUQUJMRSBTVFJJQ1Q7CisKK0NSRUFURSBGVU5DVElPTiBnYnRfaW50dl9zb3J0 c3VwcG9ydChpbnRlcm5hbCkKK1JFVFVSTlMgdm9pZAorQVMgJ01PRFVMRV9QQVRITkFNRScK K0xBTkdVQUdFIEMgSU1NVVRBQkxFIFNUUklDVDsKKworQ1JFQVRFIEZVTkNUSU9OIGdidF9t YWNhZDhfc29ydHN1cHBvcnQoaW50ZXJuYWwpCitSRVRVUk5TIHZvaWQKK0FTICdNT0RVTEVf UEFUSE5BTUUnCitMQU5HVUFHRSBDIElNTVVUQUJMRSBTVFJJQ1Q7CisKK0NSRUFURSBGVU5D VElPTiBnYnRfdGltZV9zb3J0c3VwcG9ydChpbnRlcm5hbCkKK1JFVFVSTlMgdm9pZAorQVMg J01PRFVMRV9QQVRITkFNRScKK0xBTkdVQUdFIEMgSU1NVVRBQkxFIFNUUklDVDsKKworQUxU RVIgT1BFUkFUT1IgRkFNSUxZIGdpc3RfYml0X29wcyBVU0lORyBnaXN0IEFERAorICAgIEZV TkNUSU9OICAgIDExICAoYml0LCBiaXQpIGdidF9iaXRfc29ydHN1cHBvcnQgKGludGVybmFs KSA7CisKK0FMVEVSIE9QRVJBVE9SIEZBTUlMWSBnaXN0X2Jvb2xfb3BzIFVTSU5HIGdpc3Qg QURECisgICAgRlVOQ1RJT04gICAgMTEgIChib29sLCBib29sKSBnYnRfYm9vbF9zb3J0c3Vw cG9ydCAoaW50ZXJuYWwpIDsKKworQUxURVIgT1BFUkFUT1IgRkFNSUxZIGdpc3RfYnl0ZWFf b3BzIFVTSU5HIGdpc3QgQURECisgICAgRlVOQ1RJT04gICAgMTEgIChieXRlYSwgYnl0ZWEp IGJ5dGVhX3NvcnRzdXBwb3J0IChpbnRlcm5hbCkgOworCitBTFRFUiBPUEVSQVRPUiBGQU1J TFkgZ2lzdF9jYXNoX29wcyBVU0lORyBnaXN0IEFERAorICAgIEZVTkNUSU9OICAgIDExICAo bW9uZXksIG1vbmV5KSBnYnRfY2FzaF9zb3J0c3VwcG9ydCAoaW50ZXJuYWwpIDsKKworQUxU RVIgT1BFUkFUT1IgRkFNSUxZIGdpc3RfZGF0ZV9vcHMgVVNJTkcgZ2lzdCBBREQKKyAgICBG VU5DVElPTiAgICAxMSAgKGRhdGUsIGRhdGUpIGRhdGVfc29ydHN1cHBvcnQgKGludGVybmFs KSA7CisKK0FMVEVSIE9QRVJBVE9SIEZBTUlMWSBnaXN0X2VudW1fb3BzIFVTSU5HIGdpc3Qg QURECisgICAgRlVOQ1RJT04gICAgMTEgIChhbnllbnVtLCBhbnllbnVtKSBnYnRfZW51bV9z b3J0c3VwcG9ydCAoaW50ZXJuYWwpIDsKKworQUxURVIgT1BFUkFUT1IgRkFNSUxZIGdpc3Rf ZmxvYXQ0X29wcyBVU0lORyBnaXN0IEFERAorICAgIEZVTkNUSU9OICAgIDExICAoZmxvYXQ0 LCBmbG9hdDQpIGJ0ZmxvYXQ0c29ydHN1cHBvcnQgKGludGVybmFsKSA7CisKK0FMVEVSIE9Q RVJBVE9SIEZBTUlMWSBnaXN0X2Zsb2F0OF9vcHMgVVNJTkcgZ2lzdCBBREQKKyAgICBGVU5D VElPTiAgICAxMSAgKGZsb2F0OCwgZmxvYXQ4KSBidGZsb2F0OHNvcnRzdXBwb3J0IChpbnRl cm5hbCkgOworCitBTFRFUiBPUEVSQVRPUiBGQU1JTFkgZ2lzdF9pbmV0X29wcyBVU0lORyBn aXN0IEFERAorICAgIEZVTkNUSU9OICAgIDExICAoaW5ldCwgaW5ldCkgbmV0d29ya19zb3J0 c3VwcG9ydCAoaW50ZXJuYWwpIDsKKworQUxURVIgT1BFUkFUT1IgRkFNSUxZIGdpc3RfaW50 Ml9vcHMgVVNJTkcgZ2lzdCBBREQKKyAgICBGVU5DVElPTiAgICAxMSAgKGludDIsIGludDIp IGJ0aW50MnNvcnRzdXBwb3J0IChpbnRlcm5hbCkgOworCitBTFRFUiBPUEVSQVRPUiBGQU1J TFkgZ2lzdF9pbnQ0X29wcyBVU0lORyBnaXN0IEFERAorICAgIEZVTkNUSU9OICAgIDExICAo aW50NCwgaW50NCkgYnRpbnQ0c29ydHN1cHBvcnQgKGludGVybmFsKSA7CisKK0FMVEVSIE9Q RVJBVE9SIEZBTUlMWSBnaXN0X2ludDhfb3BzIFVTSU5HIGdpc3QgQURECisgICAgRlVOQ1RJ T04gICAgMTEgIChpbnQ4LCBpbnQ4KSBidGludDhzb3J0c3VwcG9ydCAoaW50ZXJuYWwpIDsK KworQUxURVIgT1BFUkFUT1IgRkFNSUxZIGdpc3RfaW50ZXJ2YWxfb3BzIFVTSU5HIGdpc3Qg QURECisgICAgRlVOQ1RJT04gICAgMTEgIChpbnRlcnZhbCwgaW50ZXJ2YWwpIGdidF9pbnR2 X3NvcnRzdXBwb3J0IChpbnRlcm5hbCkgOworCitBTFRFUiBPUEVSQVRPUiBGQU1JTFkgZ2lz dF9tYWNhZGRyX29wcyBVU0lORyBnaXN0IEFERAorICAgIEZVTkNUSU9OICAgIDExICAobWFj YWRkciwgbWFjYWRkcikgbWFjYWRkcl9zb3J0c3VwcG9ydCAoaW50ZXJuYWwpIDsKKworQUxU RVIgT1BFUkFUT1IgRkFNSUxZIGdpc3RfbWFjYWRkcjhfb3BzIFVTSU5HIGdpc3QgQURECisg ICAgRlVOQ1RJT04gICAgMTEgIChtYWNhZGRyOCwgbWFjYWRkcjgpIGdidF9tYWNhZDhfc29y dHN1cHBvcnQgKGludGVybmFsKSA7CisKK0FMVEVSIE9QRVJBVE9SIEZBTUlMWSBnaXN0X251 bWVyaWNfb3BzIFVTSU5HIGdpc3QgQURECisgICAgRlVOQ1RJT04gICAgMTEgIChudW1lcmlj LCBudW1lcmljKSBudW1lcmljX3NvcnRzdXBwb3J0IChpbnRlcm5hbCkgOworCitBTFRFUiBP UEVSQVRPUiBGQU1JTFkgZ2lzdF9vaWRfb3BzIFVTSU5HIGdpc3QgQURECisgICAgRlVOQ1RJ T04gICAgMTEgIChvaWQsIG9pZCkgYnRvaWRzb3J0c3VwcG9ydCAoaW50ZXJuYWwpIDsKKwor QUxURVIgT1BFUkFUT1IgRkFNSUxZIGdpc3RfdGV4dF9vcHMgVVNJTkcgZ2lzdCBBREQKKyAg ICBGVU5DVElPTiAgICAxMSAgKHRleHQsIHRleHQpIGJ0dGV4dHNvcnRzdXBwb3J0IChpbnRl cm5hbCkgOworCitBTFRFUiBPUEVSQVRPUiBGQU1JTFkgZ2lzdF9icGNoYXJfb3BzIFVTSU5H IGdpc3QgQURECisgICAgRlVOQ1RJT04gICAgMTEgIChicGNoYXIsIGJwY2hhcikgYnBjaGFy X3NvcnRzdXBwb3J0IChpbnRlcm5hbCkgOworCitBTFRFUiBPUEVSQVRPUiBGQU1JTFkgZ2lz dF90aW1lX29wcyBVU0lORyBnaXN0IEFERAorICAgIEZVTkNUSU9OICAgIDExICAodGltZSwg dGltZSkgZ2J0X3RpbWVfc29ydHN1cHBvcnQgKGludGVybmFsKSA7CisKK0FMVEVSIE9QRVJB VE9SIEZBTUlMWSBnaXN0X3RpbWVzdGFtcF9vcHMgVVNJTkcgZ2lzdCBBREQKKyAgICBGVU5D VElPTiAgICAxMSAgKHRpbWVzdGFtcCwgdGltZXN0YW1wKSB0aW1lc3RhbXBfc29ydHN1cHBv cnQgKGludGVybmFsKSA7CisKK0FMVEVSIE9QRVJBVE9SIEZBTUlMWSBnaXN0X3V1aWRfb3Bz IFVTSU5HIGdpc3QgQURECisgICAgRlVOQ1RJT04gICAgMTEgICh1dWlkLCB1dWlkKSB1dWlk X3NvcnRzdXBwb3J0IChpbnRlcm5hbCkgOwpkaWZmIC0tZ2l0IGEvY29udHJpYi9idHJlZV9n aXN0L2J0cmVlX2dpc3QuY29udHJvbCBiL2NvbnRyaWIvYnRyZWVfZ2lzdC9idHJlZV9naXN0 LmNvbnRyb2wKaW5kZXggZmE5MTcxYTgwYS4uYWJmNjY1MzhmMyAxMDA2NDQKLS0tIGEvY29u dHJpYi9idHJlZV9naXN0L2J0cmVlX2dpc3QuY29udHJvbAorKysgYi9jb250cmliL2J0cmVl X2dpc3QvYnRyZWVfZ2lzdC5jb250cm9sCkBAIC0xLDYgKzEsNiBAQAogIyBidHJlZV9naXN0 IGV4dGVuc2lvbgogY29tbWVudCA9ICdzdXBwb3J0IGZvciBpbmRleGluZyBjb21tb24gZGF0 YXR5cGVzIGluIEdpU1QnCi1kZWZhdWx0X3ZlcnNpb24gPSAnMS43JworZGVmYXVsdF92ZXJz aW9uID0gJzEuOCcKIG1vZHVsZV9wYXRobmFtZSA9ICckbGliZGlyL2J0cmVlX2dpc3QnCiBy ZWxvY2F0YWJsZSA9IHRydWUKIHRydXN0ZWQgPSB0cnVlCmRpZmYgLS1naXQgYS9jb250cmli L2J0cmVlX2dpc3QvYnRyZWVfaW50ZXJ2YWwuYyBiL2NvbnRyaWIvYnRyZWVfZ2lzdC9idHJl ZV9pbnRlcnZhbC5jCmluZGV4IGMyYmY4MjA4NmQuLjgwMTc5YWRjOTkgMTAwNjQ0Ci0tLSBh L2NvbnRyaWIvYnRyZWVfZ2lzdC9idHJlZV9pbnRlcnZhbC5jCisrKyBiL2NvbnRyaWIvYnRy ZWVfZ2lzdC9idHJlZV9pbnRlcnZhbC5jCkBAIC02LDYgKzYsNyBAQAogI2luY2x1ZGUgImJ0 cmVlX2dpc3QuaCIKICNpbmNsdWRlICJidHJlZV91dGlsc19udW0uaCIKICNpbmNsdWRlICJ1 dGlscy9idWlsdGlucy5oIgorI2luY2x1ZGUgInV0aWxzL3NvcnRzdXBwb3J0LmgiCiAjaW5j bHVkZSAidXRpbHMvdGltZXN0YW1wLmgiCiAKIHR5cGVkZWYgc3RydWN0CkBAIC0yNyw4ICsy OCwxNSBAQCBQR19GVU5DVElPTl9JTkZPX1YxKGdidF9pbnR2X2NvbnNpc3RlbnQpOwogUEdf RlVOQ1RJT05fSU5GT19WMShnYnRfaW50dl9kaXN0YW5jZSk7CiBQR19GVU5DVElPTl9JTkZP X1YxKGdidF9pbnR2X3BlbmFsdHkpOwogUEdfRlVOQ1RJT05fSU5GT19WMShnYnRfaW50dl9z YW1lKTsKK1BHX0ZVTkNUSU9OX0lORk9fVjEoZ2J0X2ludHZfc29ydHN1cHBvcnQpOwogCiAK K3N0YXRpYyBpbnQKK2ludHZfZmFzdF9jbXAoRGF0dW0geCwgRGF0dW0geSwgU29ydFN1cHBv cnQgc3N1cCkKK3sKKwlyZXR1cm4gRGF0dW1HZXRJbnQzMihEaXJlY3RGdW5jdGlvbkNhbGwy KGludGVydmFsX2NtcCwgeCwgeSkpOworfQorCiBzdGF0aWMgYm9vbAogZ2J0X2ludHZndChj b25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiLCBGbWdySW5mbyAqZmxpbmZvKQogewpAQCAt Mjk1LDMgKzMwMywxNCBAQCBnYnRfaW50dl9zYW1lKFBHX0ZVTkNUSU9OX0FSR1MpCiAJKnJl c3VsdCA9IGdidF9udW1fc2FtZSgodm9pZCAqKSBiMSwgKHZvaWQgKikgYjIsICZ0aW5mbywg ZmNpbmZvLT5mbGluZm8pOwogCVBHX1JFVFVSTl9QT0lOVEVSKHJlc3VsdCk7CiB9CisKK0Rh dHVtCitnYnRfaW50dl9zb3J0c3VwcG9ydChQR19GVU5DVElPTl9BUkdTKQoreworCVNvcnRT dXBwb3J0IHNzdXAgPSAoU29ydFN1cHBvcnQpIFBHX0dFVEFSR19QT0lOVEVSKDApOworCisJ c3N1cC0+Y29tcGFyYXRvciA9IGludHZfZmFzdF9jbXA7CisJc3N1cC0+c3N1cF9leHRyYSA9 IE5VTEw7CisKKwlQR19SRVRVUk5fVk9JRCgpOworfQpkaWZmIC0tZ2l0IGEvY29udHJpYi9i dHJlZV9naXN0L2J0cmVlX21hY2FkZHI4LmMgYi9jb250cmliL2J0cmVlX2dpc3QvYnRyZWVf bWFjYWRkcjguYwppbmRleCA3OTZjYzRlZmVlLi4wMzRlMzRiZjkwIDEwMDY0NAotLS0gYS9j b250cmliL2J0cmVlX2dpc3QvYnRyZWVfbWFjYWRkcjguYworKysgYi9jb250cmliL2J0cmVl X2dpc3QvYnRyZWVfbWFjYWRkcjguYwpAQCAtNyw2ICs3LDcgQEAKICNpbmNsdWRlICJidHJl ZV91dGlsc19udW0uaCIKICNpbmNsdWRlICJ1dGlscy9idWlsdGlucy5oIgogI2luY2x1ZGUg InV0aWxzL2luZXQuaCIKKyNpbmNsdWRlICJ1dGlscy9zb3J0c3VwcG9ydC5oIgogCiB0eXBl ZGVmIHN0cnVjdAogewpAQCAtMjUsOCArMjYsMTUgQEAgUEdfRlVOQ1RJT05fSU5GT19WMShn YnRfbWFjYWQ4X3BpY2tzcGxpdCk7CiBQR19GVU5DVElPTl9JTkZPX1YxKGdidF9tYWNhZDhf Y29uc2lzdGVudCk7CiBQR19GVU5DVElPTl9JTkZPX1YxKGdidF9tYWNhZDhfcGVuYWx0eSk7 CiBQR19GVU5DVElPTl9JTkZPX1YxKGdidF9tYWNhZDhfc2FtZSk7CitQR19GVU5DVElPTl9J TkZPX1YxKGdidF9tYWNhZDhfc29ydHN1cHBvcnQpOwogCiAKK3N0YXRpYyBpbnQKK21hY2Fk ZHI4X2Zhc3RfY21wKERhdHVtIHgsIERhdHVtIHksIFNvcnRTdXBwb3J0IHNzdXApCit7CisJ cmV0dXJuIERhdHVtR2V0SW50MzIoRGlyZWN0RnVuY3Rpb25DYWxsMihtYWNhZGRyOF9jbXAs IHgsIHkpKTsKK30KKwogc3RhdGljIGJvb2wKIGdidF9tYWNhZDhndChjb25zdCB2b2lkICph LCBjb25zdCB2b2lkICpiLCBGbWdySW5mbyAqZmxpbmZvKQogewpAQCAtMTk0LDMgKzIwMiwx NCBAQCBnYnRfbWFjYWQ4X3NhbWUoUEdfRlVOQ1RJT05fQVJHUykKIAkqcmVzdWx0ID0gZ2J0 X251bV9zYW1lKCh2b2lkICopIGIxLCAodm9pZCAqKSBiMiwgJnRpbmZvLCBmY2luZm8tPmZs aW5mbyk7CiAJUEdfUkVUVVJOX1BPSU5URVIocmVzdWx0KTsKIH0KKworRGF0dW0KK2didF9t YWNhZDhfc29ydHN1cHBvcnQoUEdfRlVOQ1RJT05fQVJHUykKK3sKKwlTb3J0U3VwcG9ydCBz c3VwID0gKFNvcnRTdXBwb3J0KSBQR19HRVRBUkdfUE9JTlRFUigwKTsKKworCXNzdXAtPmNv bXBhcmF0b3IgPSBtYWNhZGRyOF9mYXN0X2NtcDsKKwlzc3VwLT5zc3VwX2V4dHJhID0gTlVM TDsKKworCVBHX1JFVFVSTl9WT0lEKCk7Cit9CmRpZmYgLS1naXQgYS9jb250cmliL2J0cmVl X2dpc3QvYnRyZWVfdGltZS5jIGIvY29udHJpYi9idHJlZV9naXN0L2J0cmVlX3RpbWUuYwpp bmRleCBmZDg3NzRhMmYwLi5mYjM0NTQ5ODdiIDEwMDY0NAotLS0gYS9jb250cmliL2J0cmVl X2dpc3QvYnRyZWVfdGltZS5jCisrKyBiL2NvbnRyaWIvYnRyZWVfZ2lzdC9idHJlZV90aW1l LmMKQEAgLTcsNiArNyw3IEBACiAjaW5jbHVkZSAiYnRyZWVfdXRpbHNfbnVtLmgiCiAjaW5j bHVkZSAidXRpbHMvYnVpbHRpbnMuaCIKICNpbmNsdWRlICJ1dGlscy9kYXRlLmgiCisjaW5j bHVkZSAidXRpbHMvc29ydHN1cHBvcnQuaCIKICNpbmNsdWRlICJ1dGlscy90aW1lc3RhbXAu aCIKIAogdHlwZWRlZiBzdHJ1Y3QKQEAgLTI4LDYgKzI5LDcgQEAgUEdfRlVOQ1RJT05fSU5G T19WMShnYnRfdGltZV9kaXN0YW5jZSk7CiBQR19GVU5DVElPTl9JTkZPX1YxKGdidF90aW1l dHpfY29uc2lzdGVudCk7CiBQR19GVU5DVElPTl9JTkZPX1YxKGdidF90aW1lX3BlbmFsdHkp OwogUEdfRlVOQ1RJT05fSU5GT19WMShnYnRfdGltZV9zYW1lKTsKK1BHX0ZVTkNUSU9OX0lO Rk9fVjEoZ2J0X3RpbWVfc29ydHN1cHBvcnQpOwogCiAKICNpZmRlZiBVU0VfRkxPQVQ4X0JZ VkFMCkBAIC0zNyw2ICszOSwxMiBAQCBQR19GVU5DVElPTl9JTkZPX1YxKGdidF90aW1lX3Nh bWUpOwogI2VuZGlmCiAKIAorc3RhdGljIGludAordGltZV9mYXN0X2NtcChEYXR1bSB4LCBE YXR1bSB5LCBTb3J0U3VwcG9ydCBzc3VwKQoreworCXJldHVybiBEYXR1bUdldEludDMyKERp cmVjdEZ1bmN0aW9uQ2FsbDIodGltZV9jbXAsIHgsIHkpKTsKK30KKwogc3RhdGljIGJvb2wK IGdidF90aW1lZ3QoY29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYiwgRm1nckluZm8gKmZs aW5mbykKIHsKQEAgLTMzMiwzICszNDAsMTQgQEAgZ2J0X3RpbWVfc2FtZShQR19GVU5DVElP Tl9BUkdTKQogCSpyZXN1bHQgPSBnYnRfbnVtX3NhbWUoKHZvaWQgKikgYjEsICh2b2lkICop IGIyLCAmdGluZm8sIGZjaW5mby0+ZmxpbmZvKTsKIAlQR19SRVRVUk5fUE9JTlRFUihyZXN1 bHQpOwogfQorCitEYXR1bQorZ2J0X3RpbWVfc29ydHN1cHBvcnQoUEdfRlVOQ1RJT05fQVJH UykKK3sKKwlTb3J0U3VwcG9ydCBzc3VwID0gKFNvcnRTdXBwb3J0KSBQR19HRVRBUkdfUE9J TlRFUigwKTsKKworCXNzdXAtPmNvbXBhcmF0b3IgPSB0aW1lX2Zhc3RfY21wOworCXNzdXAt PnNzdXBfZXh0cmEgPSBOVUxMOworCisJUEdfUkVUVVJOX1ZPSUQoKTsKK30KZGlmZiAtLWdp dCBhL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9yYW5nZXR5cGVzX2dpc3QuYyBiL3NyYy9iYWNr ZW5kL3V0aWxzL2FkdC9yYW5nZXR5cGVzX2dpc3QuYwppbmRleCBmYmYzOWRiZjMwLi4yZGVk MzY1ZGMyIDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC91dGlscy9hZHQvcmFuZ2V0eXBlc19n aXN0LmMKKysrIGIvc3JjL2JhY2tlbmQvdXRpbHMvYWR0L3JhbmdldHlwZXNfZ2lzdC5jCkBA IC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSAidXRpbHMvZm1ncnByb3Rvcy5oIgogI2luY2x1 ZGUgInV0aWxzL211bHRpcmFuZ2V0eXBlcy5oIgogI2luY2x1ZGUgInV0aWxzL3JhbmdldHlw ZXMuaCIKKyNpbmNsdWRlICJ1dGlscy9zb3J0c3VwcG9ydC5oIgogCiAvKgogICogUmFuZ2Ug Y2xhc3MgcHJvcGVydGllcyB1c2VkIHRvIHNlZ3JlZ2F0ZSBkaWZmZXJlbnQgY2xhc3NlcyBv ZiByYW5nZXMgaW4KQEAgLTE3Nyw2ICsxNzgsNyBAQCBzdGF0aWMgdm9pZCByYW5nZV9naXN0 X2RvdWJsZV9zb3J0aW5nX3NwbGl0KFR5cGVDYWNoZUVudHJ5ICp0eXBjYWNoZSwKIHN0YXRp YyB2b2lkIHJhbmdlX2dpc3RfY29uc2lkZXJfc3BsaXQoQ29uc2lkZXJTcGxpdENvbnRleHQg KmNvbnRleHQsCiAJCQkJCQkJCQkgIFJhbmdlQm91bmQgKnJpZ2h0X2xvd2VyLCBpbnQgbWlu X2xlZnRfY291bnQsCiAJCQkJCQkJCQkgIFJhbmdlQm91bmQgKmxlZnRfdXBwZXIsIGludCBt YXhfbGVmdF9jb3VudCk7CitzdGF0aWMgaW50CXJhbmdlX2dpc3RfY21wKERhdHVtIGEsIERh dHVtIGIsIFNvcnRTdXBwb3J0IHNzdXApOwogc3RhdGljIGludAlnZXRfZ2lzdF9yYW5nZV9j bGFzcyhSYW5nZVR5cGUgKnJhbmdlKTsKIHN0YXRpYyBpbnQJc2luZ2xlX2JvdW5kX2NtcChj b25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiLCB2b2lkICphcmcpOwogc3RhdGljIGludAlp bnRlcnZhbF9jbXBfbG93ZXIoY29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYiwgdm9pZCAq YXJnKTsKQEAgLTc3Myw2ICs3NzUsMjAgQEAgcmFuZ2VfZ2lzdF9waWNrc3BsaXQoUEdfRlVO Q1RJT05fQVJHUykKIAlQR19SRVRVUk5fUE9JTlRFUih2KTsKIH0KIAorLyoKKyAqIFNvcnQg c3VwcG9ydCByb3V0aW5lIGZvciBmYXN0IEdpU1QgaW5kZXggYnVpbGQgYnkgc29ydGluZy4K KyAqLworRGF0dW0KK3JhbmdlX2dpc3Rfc29ydHN1cHBvcnQoUEdfRlVOQ1RJT05fQVJHUykK K3sKKwlTb3J0U3VwcG9ydAlzc3VwID0gKFNvcnRTdXBwb3J0KSBQR19HRVRBUkdfUE9JTlRF UigwKTsKKworCXNzdXAtPmNvbXBhcmF0b3IgPSByYW5nZV9naXN0X2NtcDsKKwlzc3VwLT5z c3VwX2V4dHJhID0gTlVMTDsKKworCVBHX1JFVFVSTl9WT0lEKCk7Cit9CisKIC8qIGVxdWFs aXR5IGNvbXBhcmF0b3IgZm9yIEdpU1QgKi8KIERhdHVtCiByYW5nZV9naXN0X3NhbWUoUEdf RlVOQ1RJT05fQVJHUykKQEAgLTE2OTIsNiArMTcwOCw2MCBAQCByYW5nZV9naXN0X2NvbnNp ZGVyX3NwbGl0KENvbnNpZGVyU3BsaXRDb250ZXh0ICpjb250ZXh0LAogCX0KIH0KIAorLyoK KyAqIEdpU1Qgc29ydHN1cHBvcnQgY29tcGFyYXRvciBmb3IgcmFuZ2VzLgorICoKKyAqIE9w ZXJhdGVzIHNvbGVseSBvbiB0aGUgbG93ZXIgYm91bmRzIG9mIHRoZSByYW5nZXMsIGNvbXBh cmluZyB0aGVtIHVzaW5nCisgKiByYW5nZV9jbXBfYm91bmRzKCkuCisgKiBFbXB0eSByYW5n ZXMgYXJlIHNvcnRlZCBiZWZvcmUgbm9uLWVtcHR5IG9uZXMuCisgKi8KK3N0YXRpYyBpbnQK K3JhbmdlX2dpc3RfY21wKERhdHVtIGEsIERhdHVtIGIsIFNvcnRTdXBwb3J0IHNzdXApCit7 CisJUmFuZ2VUeXBlICpyYW5nZV9hID0gRGF0dW1HZXRSYW5nZVR5cGVQKGEpOworCVJhbmdl VHlwZSAqcmFuZ2VfYiA9IERhdHVtR2V0UmFuZ2VUeXBlUChiKTsKKwlUeXBlQ2FjaGVFbnRy eSAqdHlwY2FjaGUgPSBzc3VwLT5zc3VwX2V4dHJhOworCVJhbmdlQm91bmQJbG93ZXIxLAor CQkJCWxvd2VyMjsKKwlSYW5nZUJvdW5kCXVwcGVyMSwKKwkJCQl1cHBlcjI7CisJYm9vbAkJ ZW1wdHkxLAorCQkJCWVtcHR5MjsKKwlpbnQJCQlyZXN1bHQ7CisKKwlpZiAodHlwY2FjaGUg PT0gTlVMTCkgeworCQlBc3NlcnQoUmFuZ2VUeXBlR2V0T2lkKHJhbmdlX2EpID09IFJhbmdl VHlwZUdldE9pZChyYW5nZV9iKSk7CisJCXR5cGNhY2hlID0gbG9va3VwX3R5cGVfY2FjaGUo UmFuZ2VUeXBlR2V0T2lkKHJhbmdlX2EpLCBUWVBFQ0FDSEVfUkFOR0VfSU5GTyk7CisKKwkJ LyoKKwkJICogQ2FjaGUgdGhlIHJhbmdlIGluZm8gYmV0d2VlbiBjYWxscyB0byBhdm9pZCBo YXZpbmcgdG8gY2FsbAorCQkgKiBsb29rdXBfdHlwZV9jYWNoZSgpIGZvciBlYWNoIGNvbXBh cmlzb24uCisJCSAqLworCQlzc3VwLT5zc3VwX2V4dHJhID0gdHlwY2FjaGU7CisJfQorCisJ cmFuZ2VfZGVzZXJpYWxpemUodHlwY2FjaGUsIHJhbmdlX2EsICZsb3dlcjEsICZ1cHBlcjEs ICZlbXB0eTEpOworCXJhbmdlX2Rlc2VyaWFsaXplKHR5cGNhY2hlLCByYW5nZV9iLCAmbG93 ZXIyLCAmdXBwZXIyLCAmZW1wdHkyKTsKKworCS8qIEZvciBiLXRyZWUgdXNlLCBlbXB0eSBy YW5nZXMgc29ydCBiZWZvcmUgYWxsIGVsc2UgKi8KKwlpZiAoZW1wdHkxICYmIGVtcHR5MikK KwkJcmVzdWx0ID0gMDsKKwllbHNlIGlmIChlbXB0eTEpCisJCXJlc3VsdCA9IC0xOworCWVs c2UgaWYgKGVtcHR5MikKKwkJcmVzdWx0ID0gMTsKKwllbHNlCisJCXJlc3VsdCA9IHJhbmdl X2NtcF9ib3VuZHModHlwY2FjaGUsICZsb3dlcjEsICZsb3dlcjIpOworCisJaWYgKChEYXR1 bSkgcmFuZ2VfYSAhPSBhKQorCQlwZnJlZShyYW5nZV9hKTsKKworCWlmICgoRGF0dW0pIHJh bmdlX2IgIT0gYikKKwkJcGZyZWUocmFuZ2VfYik7CisKKwlyZXR1cm4gcmVzdWx0OworfQor CiAvKgogICogRmluZCBjbGFzcyBudW1iZXIgZm9yIHJhbmdlLgogICoKZGlmZiAtLWdpdCBh L3NyYy9pbmNsdWRlL2NhdGFsb2cvcGdfYW1wcm9jLmRhdCBiL3NyYy9pbmNsdWRlL2NhdGFs b2cvcGdfYW1wcm9jLmRhdAppbmRleCA0Y2MxMjliZWJkLi45MzE4YWQ1ZmQ4IDEwMDY0NAot LS0gYS9zcmMvaW5jbHVkZS9jYXRhbG9nL3BnX2FtcHJvYy5kYXQKKysrIGIvc3JjL2luY2x1 ZGUvY2F0YWxvZy9wZ19hbXByb2MuZGF0CkBAIC02MDAsNiArNjAwLDkgQEAKIHsgYW1wcm9j ZmFtaWx5ID0+ICdnaXN0L3JhbmdlX29wcycsIGFtcHJvY2xlZnR0eXBlID0+ICdhbnlyYW5n ZScsCiAgIGFtcHJvY3JpZ2h0dHlwZSA9PiAnYW55cmFuZ2UnLCBhbXByb2NudW0gPT4gJzcn LAogICBhbXByb2MgPT4gJ3JhbmdlX2dpc3Rfc2FtZScgfSwKK3sgYW1wcm9jZmFtaWx5ID0+ ICdnaXN0L3JhbmdlX29wcycsIGFtcHJvY2xlZnR0eXBlID0+ICdhbnlyYW5nZScsCisgIGFt cHJvY3JpZ2h0dHlwZSA9PiAnYW55cmFuZ2UnLCBhbXByb2NudW0gPT4gJzExJywKKyAgYW1w cm9jID0+ICdyYW5nZV9naXN0X3NvcnRzdXBwb3J0JyB9LAogeyBhbXByb2NmYW1pbHkgPT4g J2dpc3QvbmV0d29ya19vcHMnLCBhbXByb2NsZWZ0dHlwZSA9PiAnaW5ldCcsCiAgIGFtcHJv Y3JpZ2h0dHlwZSA9PiAnaW5ldCcsIGFtcHJvY251bSA9PiAnMScsCiAgIGFtcHJvYyA9PiAn aW5ldF9naXN0X2NvbnNpc3RlbnQnIH0sCmRpZmYgLS1naXQgYS9zcmMvaW5jbHVkZS9jYXRh bG9nL3BnX3Byb2MuZGF0IGIvc3JjL2luY2x1ZGUvY2F0YWxvZy9wZ19wcm9jLmRhdAppbmRl eCA4N2FhNTcxYTMzLi40NzY3NmZiNTNlIDEwMDY0NAotLS0gYS9zcmMvaW5jbHVkZS9jYXRh bG9nL3BnX3Byb2MuZGF0CisrKyBiL3NyYy9pbmNsdWRlL2NhdGFsb2cvcGdfcHJvYy5kYXQK QEAgLTEwMzc2LDYgKzEwMzc2LDkgQEAKIHsgb2lkID0+ICczODgxJywgZGVzY3IgPT4gJ0dp U1Qgc3VwcG9ydCcsCiAgIHByb25hbWUgPT4gJ3JhbmdlX2dpc3Rfc2FtZScsIHByb3JldHR5 cGUgPT4gJ2ludGVybmFsJywKICAgcHJvYXJndHlwZXMgPT4gJ2FueXJhbmdlIGFueXJhbmdl IGludGVybmFsJywgcHJvc3JjID0+ICdyYW5nZV9naXN0X3NhbWUnIH0sCit7IG9pZCA9PiAn ODg0OScsIGRlc2NyID0+ICdHaVNUIHN1cHBvcnQnLAorICBwcm9uYW1lID0+ICdyYW5nZV9n aXN0X3NvcnRzdXBwb3J0JywgcHJvcmV0dHlwZSA9PiAndm9pZCcsCisgIHByb2FyZ3R5cGVz ID0+ICdpbnRlcm5hbCcsIHByb3NyYyA9PiAncmFuZ2VfZ2lzdF9zb3J0c3VwcG9ydCcgfSwK IHsgb2lkID0+ICc2MTU0JywgZGVzY3IgPT4gJ0dpU1Qgc3VwcG9ydCcsCiAgIHByb25hbWUg PT4gJ211bHRpcmFuZ2VfZ2lzdF9jb25zaXN0ZW50JywgcHJvcmV0dHlwZSA9PiAnYm9vbCcs CiAgIHByb2FyZ3R5cGVzID0+ICdpbnRlcm5hbCBhbnltdWx0aXJhbmdlIGludDIgb2lkIGlu dGVybmFsJywKLS0gCjIuMzYuMQoK --------------VAPH8cmp0y9H1Q41GOCjujpZ Content-Type: text/x-python; charset=UTF-8; name="plot.py" Content-Disposition: attachment; filename="plot.py" Content-Transfer-Encoding: base64 IyEvdXNyL2Jpbi9lbnYgcHl0aG9uMwoKaW1wb3J0IHN5cwppbXBvcnQgbWF0cGxvdGxpYi5w eXBsb3QgYXMgcGx0CmltcG9ydCBwYW5kYXMgYXMgcGQKCmRmID0gcGQuY29uY2F0KHBkLnJl YWRfY3N2KGYpIGZvciBmIGluIHN5cy5hcmd2WzE6XSkKcHJpbnQoZGYpCgpncnAgPSBkZi5n cm91cGJ5KCd0YmwnKQpwcmludChncnBbJ2hpdCddLm1lYW4oKSkKcHJpbnQoZ3JwWyd0aW1l J10ubWVhbigpKQpwcmludChncnBbJ3JlYWQnXS5tZWFuKCkpCnByaW50KGdycFsnaW90aW1l J10ubWVhbigpKQoKZmlnLCBheHMgPSBwbHQuc3VicGxvdHMoMSwgNCwgZmlnc2l6ZT0oMTYs IDYpKQoKc3RhdHMgPSB7CiAgICAnaGl0JzogJ1NoYXJlZCBibG9jayBoaXRzJywKICAgICd0 aW1lJzonRXhlY3V0aW9uIHRpbWUgaW4gbXMnLAogICAgJ3JlYWQnOiAnU2hhcmVkIGJsb2Nr IHJlYWRzJywKICAgICdpb3RpbWUnOiAnSS9PIHJlYWQgdGltZSBpbiBtcycKfQoKZm9yIGlu ZGV4LCAobmFtZSwgZGVzYykgaW4gZW51bWVyYXRlKHN0YXRzLml0ZW1zKCkpOgogICAgZGYu Ym94cGxvdChieT0ndGJsJywgYXg9YXhzW2luZGV4XSwgY29sdW1uPW5hbWUsIHJvdD00NSwg c2hvd2ZsaWVycz1GYWxzZSkKICAgIGF4c1tpbmRleF0uc2V0X3hsYWJlbCgnJykKICAgIGF4 c1tpbmRleF0uc2V0X3lsYWJlbChkZXNjKQoKcGx0LnRpZ2h0X2xheW91dCh3X3BhZD00KQpw bHQuc3VwdGl0bGUoJ1NvcnRzdXBwb3J0IGZvciByYW5nZSB0eXBlcyBhbmQgYnRyZWVfZ2lz dCcpCnBsdC5zaG93KCkK --------------VAPH8cmp0y9H1Q41GOCjujpZ Content-Type: text/x-python; charset=UTF-8; name="bench-gist.py" Content-Disposition: attachment; filename="bench-gist.py" Content-Transfer-Encoding: base64 IyEvdXNyL2Jpbi9lbnYgcHl0aG9uMwoKaW1wb3J0IGNzdgppbXBvcnQgcHN5Y29wZzIKaW1w b3J0IGxvZ2dpbmcKaW1wb3J0IGFyZ3BhcnNlCgpsb2dnaW5nLmJhc2ljQ29uZmlnKGxldmVs PWxvZ2dpbmcuSU5GTywgZm9ybWF0PSIlKGFzY3RpbWUpcyAlKGxldmVsbmFtZSlzICUobWVz c2FnZSlzIikKCnBhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKCkKcGFyc2VyLmFk ZF9hcmd1bWVudCgiLS1vdXRwdXQiLCAiLW8iKQpwYXJzZXIuYWRkX2FyZ3VtZW50KCItLWl0 ZXJzIiwgIi1uIiwgZGVmYXVsdD0xMCwgdHlwZT1pbnQpCnBhcnNlci5hZGRfYXJndW1lbnQo Ii0tcG9pbnRzIiwgIi1wIiwgZGVmYXVsdD0xMDAwMCwgdHlwZT1pbnQpCnBhcnNlci5hZGRf YXJndW1lbnQoIi0tcG9ydCIsIGRlZmF1bHQ9NTQzMiwgdHlwZT1pbnQpCnBhcnNlci5hZGRf YXJndW1lbnQoImlucHV0cyIsIG5hcmdzPSIqIikKYXJncyA9IHBhcnNlci5wYXJzZV9hcmdz KCkKCmNvbm4gPSBwc3ljb3BnMi5jb25uZWN0KGYnaG9zdD0vdG1wIHVzZXI9cG9zdGdyZXMg ZGJuYW1lPXBvc3RncmVzIHBvcnQ9e2FyZ3MucG9ydH0nKQpjdXIgPSBjb25uLmN1cnNvcigp CgpvdXRwdXQgPSBvcGVuKGFyZ3Mub3V0cHV0LCAndycpCm91dCA9IGNzdi53cml0ZXIob3V0 cHV0KQpvdXQud3JpdGVyb3coWydzY2hlbWEnLCAndGJsJywgJ2knLCAncG9pbnQnLCAndGlt ZScsICdoaXQnLCAncmVhZCcsICdpb3RpbWUnXSkKCmZvciBzY2hlbWEsIHRibCBpbiBbaS5z cGxpdCgiLiIpIGZvciBpIGluIGFyZ3MuaW5wdXRzXToKICAgIGxvZ2dpbmcuaW5mbyhmIkZl dGNoaW5nIHBvaW50cyBmb3Ige3NjaGVtYX0ue3RibH0iKQoKICAgIGN1ci5leGVjdXRlKGYi U0VMRUNUIGlkLCBibG9ja19yYW5nZSBGUk9NIHtzY2hlbWF9Lnt0Ymx9IE9SREVSIEJZIFJB TkRPTSgpIExJTUlUIHthcmdzLnBvaW50c30iKQogICAgZGF0YXBvaW50cyA9IGN1ci5mZXRj aGFsbCgpCgogICAgbG9nZ2luZy5pbmZvKGYiQmVuY2hpbmcge3NjaGVtYX0ue3RibH0iKQog ICAgZm9yIGl0ZXJhdGlvbiBpbiByYW5nZShhcmdzLml0ZXJzKToKICAgICAgICBsb2dnaW5n LmluZm8oZiIgaXRlciB7aXRlcmF0aW9ufSIpCiAgICAgICAgZm9yIHBvaW50aWQsIHBvaW50 IGluIGVudW1lcmF0ZShkYXRhcG9pbnRzKToKICAgICAgICAgICAgY3VyLmV4ZWN1dGUoZiJF WFBMQUlOIChCVUZGRVJTLCBBTkFMWVpFLCBGT1JNQVQgJ2pzb24nKSBTRUxFQ1QgKiBGUk9N IHtzY2hlbWF9Lnt0Ymx9IFdIRVJFIGlkID0gJXMgQU5EIGJsb2NrX3JhbmdlICYmICVzIiwg cG9pbnQpCiAgICAgICAgICAgIGV4cGxhaW4gPSBjdXIuZmV0Y2hvbmUoKVswXVswXQogICAg ICAgICAgICBwbGFuID0gZXhwbGFpblsnUGxhbiddCiAgICAgICAgICAgIGV4ZWNfdGltZSA9 IGV4cGxhaW5bJ0V4ZWN1dGlvbiBUaW1lJ10KICAgICAgICAgICAgaGl0ID0gcGxhblsnU2hh cmVkIEhpdCBCbG9ja3MnXQogICAgICAgICAgICByZWFkID0gcGxhblsnU2hhcmVkIFJlYWQg QmxvY2tzJ10KICAgICAgICAgICAgcmVhZHRpbWUgPSBwbGFuWydJL08gUmVhZCBUaW1lJ10K ICAgICAgICAgICAgb3V0LndyaXRlcm93KGxpc3QobWFwKHN0ciwgW3NjaGVtYSwgdGJsLCBp dGVyYXRpb24rMSwgcG9pbnRpZCsxLCBleGVjX3RpbWUsIGhpdCwgcmVhZCwgcmVhZHRpbWVd KSkpCg== --------------VAPH8cmp0y9H1Q41GOCjujpZ--