Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1vzGhB-000qyE-0Q for pgsql-hackers@arkaria.postgresql.org; Sun, 08 Mar 2026 16:09:33 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1vzGh8-00AzAY-04 for pgsql-hackers@arkaria.postgresql.org; Sun, 08 Mar 2026 16:09:30 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1vzGh7-00AzAO-1e for pgsql-hackers@lists.postgresql.org; Sun, 08 Mar 2026 16:09:30 +0000 Received: from mail-ej1-x62f.google.com ([2a00:1450:4864:20::62f]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1vzGh2-00000001Vgt-1qV6 for pgsql-hackers@lists.postgresql.org; Sun, 08 Mar 2026 16:09:29 +0000 Received: by mail-ej1-x62f.google.com with SMTP id a640c23a62f3a-b8d7f22d405so1551865066b.0 for ; Sun, 08 Mar 2026 09:09:23 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1772986161; cv=none; d=google.com; s=arc-20240605; b=hQsbrdAUyxtIu3rAWsPBgMztoTIGBZtVkCacuRuch0HUypUAs3oTqM1zlNh6iPH2qP s9+ERbZdNEs/C0GzWRQMH25OOsKG38xJw/yLKIM0Nj67Tmz5fFTNTPsPUoAFduvxqrOu eZJ4Hq7Rt7EUD4YunaZWrn8fTeJdvqnfd4Uja9Lg3lzhFWw8pfsLGDNE3DRA4Fh7yOzc FQLCQalQU6HA5Y65ZtY5O2uyDABllLMSTDp/SrVfYwC+aK0AEB4/JHBLTx3anTMR5y2M /9xtGSel5BcGDcPxcOX/VKIWPVAYm9dZYNKduD2Cb4YwR7qaEw/vm3HtZ6ZN3rn3zHM6 /vgA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=to:subject:message-id:date:from:mime-version:dkim-signature; bh=w8FQ4mmxB/KDhLemuy/4Htcvn2lSNUZQaaUgQH1fQzA=; fh=/poeh4Od7Zb9aHCJ9Q+y44nwC3JnAuD9FOG4N1mQ9Ss=; b=ICArJDWeJVgCP0CTn7442cWrnlEN983u9wnV5yJQDoln5px0oXUtIP+sqF3Ycgnn19 M5+ITii2MszZX9ihuj2l0hWQdCT+Bg/LhSc0tW1VCGqVSeHrK+SuAXd7y02RrVw73UZl uE3aL26mBm1Y+nE17OQ2MXcx2xLTEk/e2jabSwNx/CT2CVI+nJkwmXaN1+aVWj0jz+Cj R42I5Zpy9Ziq7m1YKmzJghMXfraXXGzLazGHSDXErvyH38/wyvuPgPKxS4Km3hXEX0Ym e/56EF9QA7tin7WNuJ2YQaRf1LU7YRhvEZLu5ldK3LxPiW1KsUBbWCBvO2tMS3n8fhJ+ XDyA==; darn=lists.postgresql.org ARC-Authentication-Results: i=1; mx.google.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1772986161; x=1773590961; darn=lists.postgresql.org; h=to:subject:message-id:date:from:mime-version:from:to:cc:subject :date:message-id:reply-to; bh=w8FQ4mmxB/KDhLemuy/4Htcvn2lSNUZQaaUgQH1fQzA=; b=JrfLR0jP3d2FGo5lZEqXu6Eelj8zCfPdbL/tejFxe8Qi+IftTp373YDvuxiA4lymp5 W4WteLeBgdyNZUJ6jOwJuQ+tFqfpuUCCCmL/KrakudbSyHbgJBGAbxyI2bTl0MsCwAN1 M3yKEWTNzrhRLXwFKJ3/Cdc1b8Rhwz0OTQj8mcVm7BZJ2IkHsvsJDuuSZHnFEcExiU09 DEKuFmfy4UCxbeMulSu8kBXyE/a2vzntZiTTsAlnoSrLFS/PaOaXA/1DPxXBY+aKSYS8 /HezjCiC6i0+ruoj8cLhrTaUQnrmqH0uZaMLATFqX6kuMdWwFNvBSYAqOA952pcyUII1 iECg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772986161; x=1773590961; h=to:subject:message-id:date:from:mime-version:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=w8FQ4mmxB/KDhLemuy/4Htcvn2lSNUZQaaUgQH1fQzA=; b=s1ObAELZtY9+WQSl2IG+BnLTfDDGMS6RG14dgVj9fIVq4AwXemAJmknivvln0VTYbG pAEYAeQkvLhLESbmVyc3W8OowZtOmPCijZV1O2tx005k0iPSa8qngPxoOzNgYAmKKE28 BADmUpdOX2Dsuy57TWJ08IWjZJgqSBQqnsTkFjq6dv6OUYsvps3OUJHULFx8ZFOMGJez dT8+p0+2hwBEsEc/TL7VqVQZNPDK+XnNJnfyNE0AcaJGuo1RYewgFzq+EZqs99Yhh4c8 7vrgfKaiHEZvmS6zO8KOvW67Gm13C50eWuNpdqoBzSGWgDtdWQhSGTSwnHMjrxhTuSc4 IA1Q== X-Gm-Message-State: AOJu0YyI2Rtu4mH5dl6P5Wv93H9z8bBwk/sE2/f+OtC626pAGnpNXHk0 mGHlSCh/MKxTVANadZdGMj2Gm2FOrnxl082syQfoUrzd1mpFAv2vrepnkN/DFzDWD0tkg5KiFga m7ZhgGwwKGN7VhHBuAAjEtWENBMyNPt9k9nrL+cA= X-Gm-Gg: ATEYQzzXQ/94M/K+5Vjn4qaP1BcXUNpiAB2RF/2q82vHXcb82xL0JKQdWIs6f+U7Bk3 tLD/du9bBUnLC42Tw+oFpnYO2P4Qg1pF+Z+AufYPKHbQIwm4gKDbDYtwudGksvr99VWjtdDYDOI ChZdjQVgwSyXb64h849lxTwgINK0wai3e+HocWmEFyxWl5kjpBJrz0SC9diPzHgA05TL2kRcsoN oEMWeVdtgap8R9RcrZKYYwviUInsegVgBbeSSiGI5HFG/Nk22/+wA9AJTVuPX8TNYfXPDdWQ/MA yp8hXIefpoM9WNoI38fwHvpNbyk3edMBm9zpFQMieXJcSIVz X-Received: by 2002:a17:906:9f8e:b0:b93:609a:1519 with SMTP id a640c23a62f3a-b942df832dbmr460280166b.48.1772986160412; Sun, 08 Mar 2026 09:09:20 -0700 (PDT) MIME-Version: 1.0 From: Alexandre Felipe Date: Sun, 8 Mar 2026 16:09:07 +0000 X-Gm-Features: AaiRm53PlrPdIVC6itwbUh_qNQN5fyA8uUGw4PHBkxjfoh-onEpYpfPonYiOaQg Message-ID: Subject: Addressing buffer private reference count scalability issue To: PostgreSQL Hackers , Andres Freund Content-Type: multipart/mixed; boundary="00000000000048da9c064c8582e3" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --00000000000048da9c064c8582e3 Content-Type: multipart/alternative; boundary="00000000000048da9b064c8582e1" --00000000000048da9b064c8582e1 Content-Type: text/plain; charset="UTF-8" Hi Hackers, This patch addresses a performance issue pointed out by Andres Freund, 1. Benchmark buffer pinning: You know benchmark code, implemented a few functions that can be use in postgres queries, and a python script that runs them and produces CSV files and SVG plots for the current build. 2. Refactoring reference counting: Before starting to change code and potentially breaking things I considered prudent to isolate it to limit the damage. This code was part of a 8k+ LOC file. 3. Using simplehash: Simply replacing the HTAB for a simplehash, and adding a new set of macros SH_ENTRY_EMPTY, SH_MAKE_EMPTY, SH_MAKE_IN_USE. To allow using the InvalidBuffer special value instead of allocating extra space for a validity flag. Here I assume that the buffer buffer sequence is independent enough from the array size, so I use the buffer as the hash key directly, omitting a hash function call. 4. Compact PrivateRefCountEntry: The original implementation used a 4-byte key and 8-byte value. Reference count uses 32 bits, and it is unreasonable to expect one backend to pin the same buffer 1 billion times. The lock mode uses 32 bits but can only assume 4 values. So I packed them in one single uint32, giving 30 bits for count and 2 bits for lock mode. This makes the entries 8-byte long, on 64-bit CPUs this represents more than a 1/3 reduction in memory. This makes the array aligned with the 64-bit words, copying one entry can be completed in one instruction, and every entry will be aligned. 5. REFCOUNT_ARRAY_ENTRIES=0: since the simplehash is basically some array lookup, it is worth trying to remove it completely and keep only the hash. For small values we would be trading a few branches for a buffer % SIZE, for the use case of prefetch where pin/unpin in a FIFO fashion, it will save an 8-entry array lookup, and some extra data moves. In addition to the patch I am including - A bash script to apply and benchmark the patches sequentially. You might have to adjust REPO_ROOT, in my case it gets it relative to the script path, that is under $REPO_ROOT/.patches/pins/. - A compare-patches.py script that can be copied to src/test/modules/test_buffer_pin to process the benchmark CSV in figures showing one metric for different patches instead of different metrics for one patch as the benchmark.py produces. - A nicely formatted post about this [2] Regards, Alexandre [1] https://www.postgresql.org/message-id/s5p7iou7pdhxhvmv4rohmskwqmr36dc4rybvwlep5yvwrjs4pa%406oxsemms5mw4 [2] https://afelipe.hashnode.dev/postgres-backend-buffer-pinning-algorithm --00000000000048da9b064c8582e1 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
Hi Hackers,

This patch addresses a perf= ormance issue pointed out=C2=A0by Andres Freund,

<= ol style=3D"box-sizing:border-box;border-width:0px;border-style:solid;margi= n:1.25em 0px;padding:0px;list-style-position:initial;max-width:100%;font-fa= mily:"Google Sans Flex",system-ui,-apple-system,"system-ui&q= uot;,"Segoe UI",sans-serif;letter-spacing:-0.252px">
  • Benchmark buffer pinning:=C2=A0You know benchmark code, impl= emented a few functions that can be use in postgres queries, and a python s= cript that runs them and produces CSV files and SVG plots for the current b= uild.

  • Refactoring reference counting:= =C2=A0Before starting to change code and potentially breaking things I cons= idered prudent to isolate it to limit the damage. This code was part of a 8= k+ LOC file.

  • Using simplehash:=C2=A0Sim= ply replacing the HTAB for a simplehash, and adding a new set of macros SH_= ENTRY_EMPTY, SH_MAKE_EMPTY, SH_MAKE_IN_USE. To allow using the InvalidBuffe= r special value instead of allocating extra space for a validity flag. Here= I assume that the buffer buffer sequence is independent enough from the ar= ray size, so I use the buffer as the hash key directly, omitting a hash fun= ction call.

  • Compact PrivateRefCountEntry:=C2=A0The original implementation used a 4-byte key and 8-byte value. Re= ference count uses 32 bits, and it is unreasonable to expect one backend to= pin the same buffer 1 billion times. The lock mode uses 32 bits but can on= ly assume 4 values. So I packed them in one single uint32, giving 30 bits f= or count and 2 bits for lock mode. This makes the entries 8-byte long, on 6= 4-bit CPUs this represents more than a 1/3 reduction in memory. This makes = the array aligned with the 64-bit words, copying one entry can be completed= in one instruction, and every entry will be aligned.

  • REFCOUNT_ARRAY_ENTRIES=3D0:=C2=A0since the simplehash is bas= ically some array lookup, it is worth trying to remove it completely and ke= ep only the hash. For small values we would be trading a few branches for a= buffer % SIZE, for the use case of prefetch where pin/unpin in a FIFO fash= ion, it will save an 8-entry array lookup, and some extra data moves.

  • In addition to the patch I am including=C2=A0
    =
    - A bash script to apply and benchmark the patches sequentia= lly. You might have to adjust REPO_ROOT, in my case it gets it relative to = the script path, that is under $REPO_ROOT/.patches/pins/.
    - A com= pare-patches.py script that can be copied to src/test/modules/test_buffer_p= in to process the benchmark CSV in figures showing one metric for different= patches instead of different metrics for one patch as the benchmark.py pro= duces.
    - A nicely formatted post about this [2]
    --00000000000048da9b064c8582e1-- --00000000000048da9c064c8582e3 Content-Type: application/octet-stream; name="v1-0003-Using-simplehash.patch" Content-Disposition: attachment; filename="v1-0003-Using-simplehash.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mmhxnewo2 RnJvbSAwNzc1MjA0MjAyMjNkM2JjMTRjOWY3YjA3M2MxNTAyMWFhZTIwMzg4IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBBbGV4YW5kcmUgRmVsaXBlIDxvLmFsZXhhbmRyZS5mZWxpcGVA Z21haWwuY29tPgpEYXRlOiBGcmksIDYgTWFyIDIwMjYgMTY6NTU6NDMgKzAwMDAKU3ViamVjdDog W1BBVENIIDMvNV0gVXNpbmcgc2ltcGxlaGFzaAoKVGhpcyBwYXRjaCByZXBsYWNlcyB0aGUgSFRB QiBpbXBsZW1lbnRhdGlvbiB3aXRoIGEgc2ltcGxlaGFzaAphcyBzdWdnZXN0ZWQgYnkgQW5kcmVz IEZyZXVuZCBbMV0uIFRoZSBzaW1wbGVoYXNoIGltcGxlbWVudHMgYSB0ZW1wbGF0ZWQKb3BlbiBh ZGRyZXNzaW5nIGhhc2gsIHdoaWNoIGhhdmUgZW50cnkgc2l6ZSBpbmZvcm1hdGlvbiBhdCBjb21w aWxlIHRpbWUuCgpUaGUgYWNjZXNzIHN0cmF0ZWd5IG9mIHRoZSBzaW1wbGVoYXNoIGlzIHZlcnkg Y2xvc2UgdG8gdGhlIHBsYWluIGFycmF5CnRoYXQgd2FzIHNlZW4gdG8gYmUgdmVyeSBlZmZpY2ll bnQgY29tcGFyZWQgdG8gdGhlIEhUQUIgaW1wbGVtZW50YXRpb24sCndpdGggdGhlIGFkZGl0aW9u YWwgYWR2YW50YWdlIG9mIHVzaW5nIHRoZSBrZXkgdmFsdWUgdG8gaW5pdGlhbGl6ZSB0aGUKc2Vh cmNoIGNsb3NlciB0byB3aGVyZSB0aGUga2V5IGFjdHVhbGx5IGlzLCBpbnN0ZWFkIG9mIGFsd2F5 cyBzY2FubmluZwp0aGUgZW50aXJlIGFycmF5LgoKLS0tCiBzcmMvYmFja2VuZC9zdG9yYWdlL2J1 ZmZlci9idWZfcmVmY291bnQuYyB8IDg2ICsrKysrKysrKysrLS0tLS0tLS0tLS0tCiBzcmMvaW5j bHVkZS9saWIvc2ltcGxlaGFzaC5oICAgICAgICAgICAgICB8IDU5ICsrKysrKysrKystLS0tLS0K IDIgZmlsZXMgY2hhbmdlZCwgODEgaW5zZXJ0aW9ucygrKSwgNjQgZGVsZXRpb25zKC0pCgpkaWZm IC0tZ2l0IGEvc3JjL2JhY2tlbmQvc3RvcmFnZS9idWZmZXIvYnVmX3JlZmNvdW50LmMgYi9zcmMv YmFja2VuZC9zdG9yYWdlL2J1ZmZlci9idWZfcmVmY291bnQuYwppbmRleCAxYzBiZWMyOWM5My4u ZmYzNzM1NWE2MWUgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL3N0b3JhZ2UvYnVmZmVyL2J1Zl9y ZWZjb3VudC5jCisrKyBiL3NyYy9iYWNrZW5kL3N0b3JhZ2UvYnVmZmVyL2J1Zl9yZWZjb3VudC5j CkBAIC00MCwxMCArNDAsMTAgQEAKICAqLwogI2luY2x1ZGUgInBvc3RncmVzLmgiCiAKKyNpbmNs dWRlICJjb21tb24vaGFzaGZuLmgiCiAjaW5jbHVkZSAic3RvcmFnZS9idWZfaW50ZXJuYWxzLmgi CiAjaW5jbHVkZSAic3RvcmFnZS9idWZfcmVmY291bnQuaCIKICNpbmNsdWRlICJzdG9yYWdlL3By b2MuaCIKLSNpbmNsdWRlICJ1dGlscy9oc2VhcmNoLmgiCiAKIAogCkBAIC01NSwxNSArNTUsMzYg QEAgdHlwZWRlZiBzdHJ1Y3QgUHJpdmF0ZVJlZkNvdW50RGF0YQogCiBzdHJ1Y3QgUHJpdmF0ZVJl ZkNvdW50RW50cnkKIHsKLQlCdWZmZXIJCWJ1ZmZlcjsKKwlCdWZmZXIJCWJ1ZmZlcjsJCS8qIGhh c2gga2V5IC0gSW52YWxpZEJ1ZmZlciBtZWFucyBlbXB0eSAqLwogCVByaXZhdGVSZWZDb3VudERh dGEgZGF0YTsKIH07CiAKKy8qCisgKiBEZWZpbmUgc2ltcGxlaGFzaCBwYXJhbWV0ZXJzIGZvciB0 aGUgb3ZlcmZsb3cgaGFzaCB0YWJsZS4KKyAqIFdlIHVzZSBidWZmZXIgPT0gSW52YWxpZEJ1ZmZl ciBhcyB0aGUgImVtcHR5IiBtYXJrZXIgdG8gYXZvaWQgbmVlZGluZworICogYSBzZXBhcmF0ZSBz dGF0dXMgZmllbGQuCisgKi8KKyNkZWZpbmUgU0hfUFJFRklYIHJlZmNvdW50CisjZGVmaW5lIFNI X0VMRU1FTlRfVFlQRSBQcml2YXRlUmVmQ291bnRFbnRyeQorI2RlZmluZSBTSF9LRVlfVFlQRSBC dWZmZXIKKyNkZWZpbmUgU0hfS0VZIGJ1ZmZlcgorI2RlZmluZSBTSF9IQVNIX0tFWSh0Yiwga2V5 KSBtdXJtdXJoYXNoMzIoa2V5KQorI2RlZmluZSBTSF9FUVVBTCh0YiwgYSwgYikgKChhKSA9PSAo YikpCisjZGVmaW5lIFNIX1NDT1BFIHN0YXRpYyBpbmxpbmUKKyNkZWZpbmUgU0hfREVGSU5FCisj ZGVmaW5lIFNIX0RFQ0xBUkUKKy8qIFVzZSBidWZmZXIgZmllbGQgYXMgZW1wdHkgbWFya2VyIC0g bm8gc2VwYXJhdGUgc3RhdHVzIG5lZWRlZCAqLworI2RlZmluZSBTSF9FTlRSWV9FTVBUWShlbnRy eSkgKChlbnRyeSktPmJ1ZmZlciA9PSBJbnZhbGlkQnVmZmVyKQorI2RlZmluZSBTSF9NQUtFX0VN UFRZKGVudHJ5KSAoKGVudHJ5KS0+YnVmZmVyID0gSW52YWxpZEJ1ZmZlcikKKyNkZWZpbmUgU0hf TUFLRV9JTl9VU0UoZW50cnkpICgodm9pZCkwKSAgLyoga2V5IGFzc2lnbm1lbnQgaGFuZGxlcyB0 aGlzICovCisjaW5jbHVkZSAibGliL3NpbXBsZWhhc2guaCIKKwogc3RydWN0IFByaXZhdGVSZWZD b3VudEl0ZXJhdG9yCiB7CiAJaW50CQkJYXJyYXlfaW5kZXg7CiAJYm9vbAkJaW5faGFzaDsKLQlI QVNIX1NFUV9TVEFUVVMgKmhhc2hfc3RhdHVzOworCXJlZmNvdW50X2l0ZXJhdG9yIGhhc2hfaXRl cjsKKwlib29sCQloYXNoX2l0ZXJfdmFsaWQ7CiB9OwogCiAvKiBQcml2YXRlIHJlZmNvdW50IGFy cmF5IGFuZCBrZXlzICovCkBAIC03Miw3ICs5Myw3IEBAIHN0YXRpYyBCdWZmZXIgUHJpdmF0ZVJl ZkNvdW50QXJyYXlLZXlzW1JFRkNPVU5UX0FSUkFZX0VOVFJJRVNdOwogc3RhdGljIHN0cnVjdCBQ cml2YXRlUmVmQ291bnRFbnRyeSBQcml2YXRlUmVmQ291bnRBcnJheVtSRUZDT1VOVF9BUlJBWV9F TlRSSUVTXTsKIAogLyogT3ZlcmZsb3cgaGFzaCB0YWJsZSBmb3Igd2hlbiBhcnJheSBpcyBmdWxs ICovCi1zdGF0aWMgSFRBQiAqUHJpdmF0ZVJlZkNvdW50SGFzaCA9IE5VTEw7CitzdGF0aWMgcmVm Y291bnRfaGFzaCAqUHJpdmF0ZVJlZkNvdW50SGFzaCA9IE5VTEw7CiAKIC8qIENvdW50IG9mIGVu dHJpZXMgdGhhdCBoYXZlIG92ZXJmbG93ZWQgaW50byB0aGUgaGFzaCB0YWJsZSAqLwogc3RhdGlj IGludDMyIFByaXZhdGVSZWZDb3VudE92ZXJmbG93ZWQgPSAwOwpAQCAtMTAwLDI2ICsxMjEsMTgg QEAgc3RhdGljIHBnX25vaW5saW5lIFByaXZhdGVSZWZDb3VudEVudHJ5ICpHZXRQcml2YXRlUmVm Q291bnRFbnRyeVNsb3coQnVmZmVyIGJ1ZmYKIHZvaWQKIEluaXRQcml2YXRlUmVmQ291bnQodm9p ZCkKIHsKLQlIQVNIQ1RMCQloYXNoX2N0bDsKLQotCiAJLyoKIAkgKiBBbiBhZHZpc29yeSBsaW1p dCBvbiB0aGUgbnVtYmVyIG9mIHBpbnMgZWFjaCBiYWNrZW5kIHNob3VsZCBob2xkLCBiYXNlZAog CSAqIG9uIHNoYXJlZF9idWZmZXJzIGFuZCB0aGUgbWF4aW11bSBudW1iZXIgb2YgY29ubmVjdGlv bnMgcG9zc2libGUuCiAJICogVGhhdCdzIHZlcnkgcGVzc2ltaXN0aWMsIGJ1dCBvdXRzaWRlIHRv eS1zaXplZCBzaGFyZWRfYnVmZmVycyBpdCBzaG91bGQKIAkgKiBhbGxvdyBwbGVudHkgb2YgcGlu cy4gIExpbWl0QWRkaXRpb25hbFBpbnMoKSBhbmQKIAkgKiBHZXRBZGRpdGlvbmFsUGluTGltaXQo KSBjYW4gYmUgdXNlZCB0byBjaGVjayB0aGUgcmVtYWluaW5nIGJhbGFuY2UuCi0JICovCi0JIE1h eFByb3BvcnRpb25hbFBpbnMgPSBOQnVmZmVycyAvIChNYXhCYWNrZW5kcyArIE5VTV9BVVhJTElB UllfUFJPQ1MpOwotCisJKi8KKwlNYXhQcm9wb3J0aW9uYWxQaW5zID0gTkJ1ZmZlcnMgLyAoTWF4 QmFja2VuZHMgKyBOVU1fQVVYSUxJQVJZX1BST0NTKTsKIAltZW1zZXQoJlByaXZhdGVSZWZDb3Vu dEFycmF5LCAwLCBzaXplb2YoUHJpdmF0ZVJlZkNvdW50QXJyYXkpKTsKIAltZW1zZXQoJlByaXZh dGVSZWZDb3VudEFycmF5S2V5cywgMCwgc2l6ZW9mKFByaXZhdGVSZWZDb3VudEFycmF5S2V5cykp OwogCi0JaGFzaF9jdGwua2V5c2l6ZSA9IHNpemVvZihCdWZmZXIpOwotCWhhc2hfY3RsLmVudHJ5 c2l6ZSA9IHNpemVvZihQcml2YXRlUmVmQ291bnRFbnRyeSk7Ci0KLQlQcml2YXRlUmVmQ291bnRI YXNoID0gaGFzaF9jcmVhdGUoIlByaXZhdGVSZWZDb3VudCIsIDEwMCwgJmhhc2hfY3RsLAotCQkJ CQkJCQkJICBIQVNIX0VMRU0gfCBIQVNIX0JMT0JTKTsKKwlQcml2YXRlUmVmQ291bnRIYXNoID0g cmVmY291bnRfY3JlYXRlKEN1cnJlbnRNZW1vcnlDb250ZXh0LCAxNiwgTlVMTCk7CiB9CiAKIC8q CkBAIC0xNzMsMTAgKzE4Niw5IEBAIFJlc2VydmVQcml2YXRlUmVmQ291bnRFbnRyeSh2b2lkKQog CQlBc3NlcnQoUHJpdmF0ZVJlZkNvdW50QXJyYXlLZXlzW3ZpY3RpbV9zbG90XSA9PSBQcml2YXRl UmVmQ291bnRBcnJheVt2aWN0aW1fc2xvdF0uYnVmZmVyKTsKIAogCQkvKiBlbnRlciB2aWN0aW0g YXJyYXkgZW50cnkgaW50byBoYXNodGFibGUgKi8KLQkJaGFzaGVudCA9IGhhc2hfc2VhcmNoKFBy aXZhdGVSZWZDb3VudEhhc2gsCi0JCQkJCQkJICAmUHJpdmF0ZVJlZkNvdW50QXJyYXlLZXlzW3Zp Y3RpbV9zbG90XSwKLQkJCQkJCQkgIEhBU0hfRU5URVIsCi0JCQkJCQkJICAmZm91bmQpOworCQlo YXNoZW50ID0gcmVmY291bnRfaW5zZXJ0KFByaXZhdGVSZWZDb3VudEhhc2gsCisJCQkJCQkJCSAg UHJpdmF0ZVJlZkNvdW50QXJyYXlLZXlzW3ZpY3RpbV9zbG90XSwKKwkJCQkJCQkJICAmZm91bmQp OwogCQlBc3NlcnQoIWZvdW5kKTsKIAkJaGFzaGVudC0+ZGF0YSA9IHZpY3RpbV9lbnRyeS0+ZGF0 YTsKIApAQCAtMjUzLDcgKzI2NSw3IEBAIEdldFByaXZhdGVSZWZDb3VudEVudHJ5U2xvdyhCdWZm ZXIgYnVmZmVyLCBib29sIGRvX21vdmUpCiAJaWYgKFByaXZhdGVSZWZDb3VudE92ZXJmbG93ZWQg PT0gMCkKIAkJcmV0dXJuIE5VTEw7CiAKLQlyZXMgPSBoYXNoX3NlYXJjaChQcml2YXRlUmVmQ291 bnRIYXNoLCAmYnVmZmVyLCBIQVNIX0ZJTkQsIE5VTEwpOworCXJlcyA9IHJlZmNvdW50X2xvb2t1 cChQcml2YXRlUmVmQ291bnRIYXNoLCBidWZmZXIpOwogCiAJaWYgKHJlcyA9PSBOVUxMKQogCQly ZXR1cm4gTlVMTDsKQEAgLTI2NCw3ICsyNzYsNiBAQCBHZXRQcml2YXRlUmVmQ291bnRFbnRyeVNs b3coQnVmZmVyIGJ1ZmZlciwgYm9vbCBkb19tb3ZlKQogCWVsc2UKIAl7CiAJCS8qIG1vdmUgYnVm ZmVyIGZyb20gaGFzaHRhYmxlIGludG8gdGhlIGZyZWUgYXJyYXkgc2xvdCAqLwotCQlib29sCQlm b3VuZDsKIAkJUHJpdmF0ZVJlZkNvdW50RW50cnkgKmZyZWU7CiAKIAkJUmVzZXJ2ZVByaXZhdGVS ZWZDb3VudEVudHJ5KCk7CkBAIC0yODAsOCArMjkxLDcgQEAgR2V0UHJpdmF0ZVJlZkNvdW50RW50 cnlTbG93KEJ1ZmZlciBidWZmZXIsIGJvb2wgZG9fbW92ZSkKIAogCQlSZXNlcnZlZFJlZkNvdW50 U2xvdCA9IC0xOwogCi0JCWhhc2hfc2VhcmNoKFByaXZhdGVSZWZDb3VudEhhc2gsICZidWZmZXIs IEhBU0hfUkVNT1ZFLCAmZm91bmQpOwotCQlBc3NlcnQoZm91bmQpOworCQlyZWZjb3VudF9kZWxl dGVfaXRlbShQcml2YXRlUmVmQ291bnRIYXNoLCByZXMpOwogCQlBc3NlcnQoUHJpdmF0ZVJlZkNv dW50T3ZlcmZsb3dlZCA+IDApOwogCQlQcml2YXRlUmVmQ291bnRPdmVyZmxvd2VkLS07CiAKQEAg LTM4NCwxMSArMzk0LDcgQEAgU2hhcmVkQnVmZmVyVW5yZWYoUHJpdmF0ZVJlZkNvdW50RW50cnkg KnJlZikKIAkJfQogCQllbHNlCiAJCXsKLQkJCWJvb2wJCWZvdW5kOwotCQkJQnVmZmVyCQlidWZm ZXIgPSByZWYtPmJ1ZmZlcjsKLQotCQkJaGFzaF9zZWFyY2goUHJpdmF0ZVJlZkNvdW50SGFzaCwg JmJ1ZmZlciwgSEFTSF9SRU1PVkUsICZmb3VuZCk7Ci0JCQlBc3NlcnQoZm91bmQpOworCQkJcmVm Y291bnRfZGVsZXRlX2l0ZW0oUHJpdmF0ZVJlZkNvdW50SGFzaCwgcmVmKTsKIAkJCUFzc2VydChQ cml2YXRlUmVmQ291bnRPdmVyZmxvd2VkID4gMCk7CiAJCQlQcml2YXRlUmVmQ291bnRPdmVyZmxv d2VkLS07CiAJCX0KQEAgLTQ1NiwxMCArNDYyLDEwIEBAIENoZWNrUHJpdmF0ZVJlZkNvdW50TGVh a3Modm9pZCkKIAkvKiBpZiBuZWNlc3Nhcnkgc2VhcmNoIHRoZSBoYXNoICovCiAJaWYgKFByaXZh dGVSZWZDb3VudE92ZXJmbG93ZWQpCiAJewotCQlIQVNIX1NFUV9TVEFUVVMgaHN0YXQ7CisJCXJl ZmNvdW50X2l0ZXJhdG9yIGl0ZXI7CiAKLQkJaGFzaF9zZXFfaW5pdCgmaHN0YXQsIFByaXZhdGVS ZWZDb3VudEhhc2gpOwotCQl3aGlsZSAoKHJlcyA9IChQcml2YXRlUmVmQ291bnRFbnRyeSAqKSBo YXNoX3NlcV9zZWFyY2goJmhzdGF0KSkgIT0gTlVMTCkKKwkJcmVmY291bnRfc3RhcnRfaXRlcmF0 ZShQcml2YXRlUmVmQ291bnRIYXNoLCAmaXRlcik7CisJCXdoaWxlICgocmVzID0gcmVmY291bnRf aXRlcmF0ZShQcml2YXRlUmVmQ291bnRIYXNoLCAmaXRlcikpICE9IE5VTEwpCiAJCXsKIAkJCXMg PSBEZWJ1Z1ByaW50QnVmZmVyUmVmY291bnQocmVzLT5idWZmZXIpOwogCQkJZWxvZyhXQVJOSU5H LCAiYnVmZmVyIHJlZmNvdW50IGxlYWs6ICVzIiwgcyk7CkBAIC00ODIsNyArNDg4LDcgQEAgSW5p dFByaXZhdGVSZWZDb3VudEl0ZXJhdG9yKHZvaWQpCiAKIAlpdGVyLT5hcnJheV9pbmRleCA9IDA7 CiAJaXRlci0+aW5faGFzaCA9IGZhbHNlOwotCWl0ZXItPmhhc2hfc3RhdHVzID0gTlVMTDsKKwlp dGVyLT5oYXNoX2l0ZXJfdmFsaWQgPSBmYWxzZTsKIAlyZXR1cm4gaXRlcjsKIH0KIApAQCAtNTA4 LDIxICs1MTQsMjAgQEAgR2V0TmV4dFByaXZhdGVSZWZDb3VudEVudHJ5KFByaXZhdGVSZWZDb3Vu dEl0ZXJhdG9yICppdGVyKQogCQlpdGVyLT5pbl9oYXNoID0gdHJ1ZTsKIAkJaWYgKFByaXZhdGVS ZWZDb3VudE92ZXJmbG93ZWQgPiAwKQogCQl7Ci0JCQlpdGVyLT5oYXNoX3N0YXR1cyA9IHBhbGxv YyhzaXplb2YoSEFTSF9TRVFfU1RBVFVTKSk7Ci0JCQloYXNoX3NlcV9pbml0KGl0ZXItPmhhc2hf c3RhdHVzLCBQcml2YXRlUmVmQ291bnRIYXNoKTsKKwkJCXJlZmNvdW50X3N0YXJ0X2l0ZXJhdGUo UHJpdmF0ZVJlZkNvdW50SGFzaCwgJml0ZXItPmhhc2hfaXRlcik7CisJCQlpdGVyLT5oYXNoX2l0 ZXJfdmFsaWQgPSB0cnVlOwogCQl9CiAJfQogCi0JaWYgKGl0ZXItPmhhc2hfc3RhdHVzICE9IE5V TEwpCisJaWYgKGl0ZXItPmhhc2hfaXRlcl92YWxpZCkKIAl7CiAJCVByaXZhdGVSZWZDb3VudEVu dHJ5ICpyZXM7CiAKLQkJcmVzID0gKFByaXZhdGVSZWZDb3VudEVudHJ5ICopIGhhc2hfc2VxX3Nl YXJjaChpdGVyLT5oYXNoX3N0YXR1cyk7CisJCXJlcyA9IHJlZmNvdW50X2l0ZXJhdGUoUHJpdmF0 ZVJlZkNvdW50SGFzaCwgJml0ZXItPmhhc2hfaXRlcik7CiAJCWlmIChyZXMgIT0gTlVMTCkKIAkJ CXJldHVybiByZXM7CiAKLQkJcGZyZWUoaXRlci0+aGFzaF9zdGF0dXMpOwotCQlpdGVyLT5oYXNo X3N0YXR1cyA9IE5VTEw7CisJCWl0ZXItPmhhc2hfaXRlcl92YWxpZCA9IGZhbHNlOwogCX0KIAog CXJldHVybiBOVUxMOwpAQCAtNTM0LDExICs1MzksNiBAQCBHZXROZXh0UHJpdmF0ZVJlZkNvdW50 RW50cnkoUHJpdmF0ZVJlZkNvdW50SXRlcmF0b3IgKml0ZXIpCiB2b2lkCiBGcmVlUHJpdmF0ZVJl ZkNvdW50SXRlcmF0b3IoUHJpdmF0ZVJlZkNvdW50SXRlcmF0b3IgKml0ZXIpCiB7Ci0JaWYgKGl0 ZXItPmhhc2hfc3RhdHVzICE9IE5VTEwpCi0JewotCQloYXNoX3NlcV90ZXJtKGl0ZXItPmhhc2hf c3RhdHVzKTsKLQkJcGZyZWUoaXRlci0+aGFzaF9zdGF0dXMpOwotCX0KIAlwZnJlZShpdGVyKTsK IH0KIApkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvbGliL3NpbXBsZWhhc2guaCBiL3NyYy9pbmNs dWRlL2xpYi9zaW1wbGVoYXNoLmgKaW5kZXggODQ4NzE5MjMyYTQuLjNjMDNhN2U5YzliIDEwMDY0 NAotLS0gYS9zcmMvaW5jbHVkZS9saWIvc2ltcGxlaGFzaC5oCisrKyBiL3NyYy9pbmNsdWRlL2xp Yi9zaW1wbGVoYXNoLmgKQEAgLTI4Nyw2ICsyODcsMjAgQEAgU0hfU0NPUEUgdm9pZCBTSF9TVEFU KFNIX1RZUEUgKiB0Yik7CiAjZGVmaW5lIFNIX0NPTVBBUkVfS0VZUyh0YiwgYWhhc2gsIGFrZXks IGIpIChTSF9FUVVBTCh0YiwgYi0+U0hfS0VZLCBha2V5KSkKICNlbmRpZgogCisvKgorICogTWFj cm9zIHRvIGNoZWNrL3NldCBlbnRyeSBzdGF0dXMuIFVzZXJzIGNhbiBvdmVycmlkZSB0aGVzZSB0 byBhdm9pZAorICogbmVlZGluZyBhIHNlcGFyYXRlIHN0YXR1cyBmaWVsZCBpZiB0aGVpciBrZXkg dHlwZSBoYXMgYW4gImludmFsaWQiIHZhbHVlLgorICovCisjaWZuZGVmIFNIX0VOVFJZX0VNUFRZ CisjZGVmaW5lIFNIX0VOVFJZX0VNUFRZKGVudHJ5KSAoKGVudHJ5KS0+c3RhdHVzID09IFNIX1NU QVRVU19FTVBUWSkKKyNlbmRpZgorI2lmbmRlZiBTSF9NQUtFX0VNUFRZCisjZGVmaW5lIFNIX01B S0VfRU1QVFkoZW50cnkpICgoZW50cnkpLT5zdGF0dXMgPSBTSF9TVEFUVVNfRU1QVFkpCisjZW5k aWYKKyNpZm5kZWYgU0hfTUFLRV9JTl9VU0UKKyNkZWZpbmUgU0hfTUFLRV9JTl9VU0UoZW50cnkp ICgoZW50cnkpLT5zdGF0dXMgPSBTSF9TVEFUVVNfSU5fVVNFKQorI2VuZGlmCisKIC8qCiAgKiBX cmFwIHRoZSBmb2xsb3dpbmcgZGVmaW5pdGlvbnMgaW4gaW5jbHVkZSBndWFyZHMsIHRvIGF2b2lk IG11bHRpcGxlCiAgKiBkZWZpbml0aW9uIGVycm9ycyBpZiB0aGlzIGhlYWRlciBpcyBpbmNsdWRl ZCBtb3JlIHRoYW4gb25jZS4gIFRoZSByZXN0IG9mCkBAIC01NDQsNyArNTU4LDcgQEAgU0hfR1JP VyhTSF9UWVBFICogdGIsIHVpbnQ2NCBuZXdzaXplKQogCQl1aW50MzIJCWhhc2g7CiAJCXVpbnQz MgkJb3B0aW1hbDsKIAotCQlpZiAob2xkZW50cnktPnN0YXR1cyAhPSBTSF9TVEFUVVNfSU5fVVNF KQorCQlpZiAoU0hfRU5UUllfRU1QVFkob2xkZW50cnkpKQogCQl7CiAJCQlzdGFydGVsZW0gPSBp OwogCQkJYnJlYWs7CkBAIC01NjYsNyArNTgwLDcgQEAgU0hfR1JPVyhTSF9UWVBFICogdGIsIHVp bnQ2NCBuZXdzaXplKQogCXsKIAkJU0hfRUxFTUVOVF9UWVBFICpvbGRlbnRyeSA9ICZvbGRkYXRh W2NvcHllbGVtXTsKIAotCQlpZiAob2xkZW50cnktPnN0YXR1cyA9PSBTSF9TVEFUVVNfSU5fVVNF KQorCQlpZiAoIVNIX0VOVFJZX0VNUFRZKG9sZGVudHJ5KSkKIAkJewogCQkJdWludDMyCQloYXNo OwogCQkJdWludDMyCQlzdGFydGVsZW0yOwpAQCAtNTgyLDcgKzU5Niw3IEBAIFNIX0dST1coU0hf VFlQRSAqIHRiLCB1aW50NjQgbmV3c2l6ZSkKIAkJCXsKIAkJCQluZXdlbnRyeSA9ICZuZXdkYXRh W2N1cmVsZW1dOwogCi0JCQkJaWYgKG5ld2VudHJ5LT5zdGF0dXMgPT0gU0hfU1RBVFVTX0VNUFRZ KQorCQkJCWlmIChTSF9FTlRSWV9FTVBUWShuZXdlbnRyeSkpCiAJCQkJewogCQkJCQlicmVhazsK IAkJCQl9CkBAIC02NTMsMTQgKzY2NywxNCBAQCByZXN0YXJ0OgogCQlTSF9FTEVNRU5UX1RZUEUg KmVudHJ5ID0gJmRhdGFbY3VyZWxlbV07CiAKIAkJLyogYW55IGVtcHR5IGJ1Y2tldCBjYW4gZGly ZWN0bHkgYmUgdXNlZCAqLwotCQlpZiAoZW50cnktPnN0YXR1cyA9PSBTSF9TVEFUVVNfRU1QVFkp CisJCWlmIChTSF9FTlRSWV9FTVBUWShlbnRyeSkpCiAJCXsKIAkJCXRiLT5tZW1iZXJzKys7CiAJ CQllbnRyeS0+U0hfS0VZID0ga2V5OwogI2lmZGVmIFNIX1NUT1JFX0hBU0gKIAkJCVNIX0dFVF9I QVNIKHRiLCBlbnRyeSkgPSBoYXNoOwogI2VuZGlmCi0JCQllbnRyeS0+c3RhdHVzID0gU0hfU1RB VFVTX0lOX1VTRTsKKwkJCVNIX01BS0VfSU5fVVNFKGVudHJ5KTsKIAkJCSpmb3VuZCA9IGZhbHNl OwogCQkJcmV0dXJuIGVudHJ5OwogCQl9CkBAIC02NzUsNyArNjg5LDcgQEAgcmVzdGFydDoKIAog CQlpZiAoU0hfQ09NUEFSRV9LRVlTKHRiLCBoYXNoLCBrZXksIGVudHJ5KSkKIAkJewotCQkJQXNz ZXJ0KGVudHJ5LT5zdGF0dXMgPT0gU0hfU1RBVFVTX0lOX1VTRSk7CisJCQlBc3NlcnQoIVNIX0VO VFJZX0VNUFRZKGVudHJ5KSk7CiAJCQkqZm91bmQgPSB0cnVlOwogCQkJcmV0dXJuIGVudHJ5Owog CQl9CkBAIC02OTksNyArNzEzLDcgQEAgcmVzdGFydDoKIAkJCQllbXB0eWVsZW0gPSBTSF9ORVhU KHRiLCBlbXB0eWVsZW0sIHN0YXJ0ZWxlbSk7CiAJCQkJZW1wdHllbnRyeSA9ICZkYXRhW2VtcHR5 ZWxlbV07CiAKLQkJCQlpZiAoZW1wdHllbnRyeS0+c3RhdHVzID09IFNIX1NUQVRVU19FTVBUWSkK KwkJCQlpZiAoU0hfRU5UUllfRU1QVFkoZW1wdHllbnRyeSkpCiAJCQkJewogCQkJCQlsYXN0ZW50 cnkgPSBlbXB0eWVudHJ5OwogCQkJCQlicmVhazsKQEAgLTc0OCw3ICs3NjIsNyBAQCByZXN0YXJ0 OgogI2lmZGVmIFNIX1NUT1JFX0hBU0gKIAkJCVNIX0dFVF9IQVNIKHRiLCBlbnRyeSkgPSBoYXNo OwogI2VuZGlmCi0JCQllbnRyeS0+c3RhdHVzID0gU0hfU1RBVFVTX0lOX1VTRTsKKwkJCVNIX01B S0VfSU5fVVNFKGVudHJ5KTsKIAkJCSpmb3VuZCA9IGZhbHNlOwogCQkJcmV0dXJuIGVudHJ5Owog CQl9CkBAIC04MTAsMTIgKzgyNCwxMiBAQCBTSF9MT09LVVBfSEFTSF9JTlRFUk5BTChTSF9UWVBF ICogdGIsIFNIX0tFWV9UWVBFIGtleSwgdWludDMyIGhhc2gpCiAJewogCQlTSF9FTEVNRU5UX1RZ UEUgKmVudHJ5ID0gJnRiLT5kYXRhW2N1cmVsZW1dOwogCi0JCWlmIChlbnRyeS0+c3RhdHVzID09 IFNIX1NUQVRVU19FTVBUWSkKKwkJaWYgKFNIX0VOVFJZX0VNUFRZKGVudHJ5KSkKIAkJewogCQkJ cmV0dXJuIE5VTEw7CiAJCX0KIAotCQlBc3NlcnQoZW50cnktPnN0YXR1cyA9PSBTSF9TVEFUVVNf SU5fVVNFKTsKKwkJQXNzZXJ0KCFTSF9FTlRSWV9FTVBUWShlbnRyeSkpOwogCiAJCWlmIChTSF9D T01QQVJFX0tFWVModGIsIGhhc2gsIGtleSwgZW50cnkpKQogCQkJcmV0dXJuIGVudHJ5OwpAQCAt ODY4LDEwICs4ODIsMTAgQEAgU0hfREVMRVRFKFNIX1RZUEUgKiB0YiwgU0hfS0VZX1RZUEUga2V5 KQogCXsKIAkJU0hfRUxFTUVOVF9UWVBFICplbnRyeSA9ICZ0Yi0+ZGF0YVtjdXJlbGVtXTsKIAot CQlpZiAoZW50cnktPnN0YXR1cyA9PSBTSF9TVEFUVVNfRU1QVFkpCisJCWlmIChTSF9FTlRSWV9F TVBUWShlbnRyeSkpCiAJCQlyZXR1cm4gZmFsc2U7CiAKLQkJaWYgKGVudHJ5LT5zdGF0dXMgPT0g U0hfU1RBVFVTX0lOX1VTRSAmJgorCQlpZiAoIVNIX0VOVFJZX0VNUFRZKGVudHJ5KSAmJgogCQkJ U0hfQ09NUEFSRV9LRVlTKHRiLCBoYXNoLCBrZXksIGVudHJ5KSkKIAkJewogCQkJU0hfRUxFTUVO VF9UWVBFICpsYXN0ZW50cnkgPSBlbnRyeTsKQEAgLTg5NCw5ICs5MDgsOSBAQCBTSF9ERUxFVEUo U0hfVFlQRSAqIHRiLCBTSF9LRVlfVFlQRSBrZXkpCiAJCQkJY3VyZWxlbSA9IFNIX05FWFQodGIs IGN1cmVsZW0sIHN0YXJ0ZWxlbSk7CiAJCQkJY3VyZW50cnkgPSAmdGItPmRhdGFbY3VyZWxlbV07 CiAKLQkJCQlpZiAoY3VyZW50cnktPnN0YXR1cyAhPSBTSF9TVEFUVVNfSU5fVVNFKQorCQkJCWlm IChTSF9FTlRSWV9FTVBUWShjdXJlbnRyeSkpCiAJCQkJewotCQkJCQlsYXN0ZW50cnktPnN0YXR1 cyA9IFNIX1NUQVRVU19FTVBUWTsKKwkJCQkJU0hfTUFLRV9FTVBUWShsYXN0ZW50cnkpOwogCQkJ CQlicmVhazsKIAkJCQl9CiAKQEAgLTkwNiw3ICs5MjAsNyBAQCBTSF9ERUxFVEUoU0hfVFlQRSAq IHRiLCBTSF9LRVlfVFlQRSBrZXkpCiAJCQkJLyogY3VycmVudCBpcyBhdCBvcHRpbWFsIHBvc2l0 aW9uLCBkb25lICovCiAJCQkJaWYgKGN1cm9wdGltYWwgPT0gY3VyZWxlbSkKIAkJCQl7Ci0JCQkJ CWxhc3RlbnRyeS0+c3RhdHVzID0gU0hfU1RBVFVTX0VNUFRZOworCQkJCQlTSF9NQUtFX0VNUFRZ KGxhc3RlbnRyeSk7CiAJCQkJCWJyZWFrOwogCQkJCX0KIApAQCAtOTU3LDkgKzk3MSw5IEBAIFNI X0RFTEVURV9JVEVNKFNIX1RZUEUgKiB0YiwgU0hfRUxFTUVOVF9UWVBFICogZW50cnkpCiAJCWN1 cmVsZW0gPSBTSF9ORVhUKHRiLCBjdXJlbGVtLCBzdGFydGVsZW0pOwogCQljdXJlbnRyeSA9ICZ0 Yi0+ZGF0YVtjdXJlbGVtXTsKIAotCQlpZiAoY3VyZW50cnktPnN0YXR1cyAhPSBTSF9TVEFUVVNf SU5fVVNFKQorCQlpZiAoU0hfRU5UUllfRU1QVFkoY3VyZW50cnkpKQogCQl7Ci0JCQlsYXN0ZW50 cnktPnN0YXR1cyA9IFNIX1NUQVRVU19FTVBUWTsKKwkJCVNIX01BS0VfRU1QVFkobGFzdGVudHJ5 KTsKIAkJCWJyZWFrOwogCQl9CiAKQEAgLTk2OSw3ICs5ODMsNyBAQCBTSF9ERUxFVEVfSVRFTShT SF9UWVBFICogdGIsIFNIX0VMRU1FTlRfVFlQRSAqIGVudHJ5KQogCQkvKiBjdXJyZW50IGlzIGF0 IG9wdGltYWwgcG9zaXRpb24sIGRvbmUgKi8KIAkJaWYgKGN1cm9wdGltYWwgPT0gY3VyZWxlbSkK IAkJewotCQkJbGFzdGVudHJ5LT5zdGF0dXMgPSBTSF9TVEFUVVNfRU1QVFk7CisJCQlTSF9NQUtF X0VNUFRZKGxhc3RlbnRyeSk7CiAJCQlicmVhazsKIAkJfQogCkBAIC05OTcsNyArMTAxMSw3IEBA IFNIX1NUQVJUX0lURVJBVEUoU0hfVFlQRSAqIHRiLCBTSF9JVEVSQVRPUiAqIGl0ZXIpCiAJewog CQlTSF9FTEVNRU5UX1RZUEUgKmVudHJ5ID0gJnRiLT5kYXRhW2ldOwogCi0JCWlmIChlbnRyeS0+ c3RhdHVzICE9IFNIX1NUQVRVU19JTl9VU0UpCisJCWlmIChTSF9FTlRSWV9FTVBUWShlbnRyeSkp CiAJCXsKIAkJCXN0YXJ0ZWxlbSA9IGk7CiAJCQlicmVhazsKQEAgLTEwNjMsNyArMTA3Nyw3IEBA IFNIX0lURVJBVEUoU0hfVFlQRSAqIHRiLCBTSF9JVEVSQVRPUiAqIGl0ZXIpCiAKIAkJaWYgKChp dGVyLT5jdXIgJiB0Yi0+c2l6ZW1hc2spID09IChpdGVyLT5lbmQgJiB0Yi0+c2l6ZW1hc2spKQog CQkJaXRlci0+ZG9uZSA9IHRydWU7Ci0JCWlmIChlbGVtLT5zdGF0dXMgPT0gU0hfU1RBVFVTX0lO X1VTRSkKKwkJaWYgKCFTSF9FTlRSWV9FTVBUWShlbGVtKSkKIAkJewogCQkJcmV0dXJuIGVsZW07 CiAJCX0KQEAgLTExNDAsNyArMTE1NCw3IEBAIFNIX1NUQVQoU0hfVFlQRSAqIHRiKQogCiAJCWVs ZW0gPSAmdGItPmRhdGFbaV07CiAKLQkJaWYgKGVsZW0tPnN0YXR1cyAhPSBTSF9TVEFUVVNfSU5f VVNFKQorCQlpZiAoU0hfRU5UUllfRU1QVFkoZWxlbSkpCiAJCQljb250aW51ZTsKIAogCQloYXNo ID0gU0hfRU5UUllfSEFTSCh0YiwgZWxlbSk7CkBAIC0xMjA1LDYgKzEyMTksOSBAQCBTSF9TVEFU KFNIX1RZUEUgKiB0YikKICN1bmRlZiBTSF9TVE9SRV9IQVNICiAjdW5kZWYgU0hfVVNFX05PTkRF RkFVTFRfQUxMT0NBVE9SCiAjdW5kZWYgU0hfRVFVQUwKKyN1bmRlZiBTSF9FTlRSWV9FTVBUWQor I3VuZGVmIFNIX01BS0VfRU1QVFkKKyN1bmRlZiBTSF9NQUtFX0lOX1VTRQogCiAvKiB1bmRlZmlu ZSBsb2NhbGx5IGRlY2xhcmVkIG1hY3JvcyAqLwogI3VuZGVmIFNIX01BS0VfUFJFRklYCi0tIAoy LjUzLjAKCg== --00000000000048da9c064c8582e3 Content-Type: application/octet-stream; name="v1-0004-Compact-PrivateRefCountEntry.patch" Content-Disposition: attachment; filename="v1-0004-Compact-PrivateRefCountEntry.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mmhxnewr3 RnJvbSA1NmJmZGQ2ZDcyOTYzOTdhN2IzZjBiMjgyZTIzOWZkYzg2ZDY1ODBkIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBBbGV4YW5kcmUgRmVsaXBlIDxvLmFsZXhhbmRyZS5mZWxpcGVA Z21haWwuY29tPgpEYXRlOiBGcmksIDYgTWFyIDIwMjYgMTc6MTU6NDQgKzAwMDAKU3ViamVjdDog W1BBVENIIDQvNV0gQ29tcGFjdCBQcml2YXRlUmVmQ291bnRFbnRyeQoKVGhlIHByZXZpb3VzIGlt cGxlbWVudGF0aW9uIHVzZWQgYW4gOC1iaXRlICg2NC1iaXQpIGVudHJ5IHRvIHN0b3JlCmEgdWlu dDMyIGNvdW50IGFuZCBhbiB1aW50MzIgbG9jayBtb2RlLiBUaGF0IGlzIGZpbmUgd2hlbiB3ZSBz dG9yZQp0aGUgZGF0YSBzZXBhcmF0ZSBmcm9tIHRoZSBrZXkgKGJ1ZmZlcikuIEJ1dCBpbiB0aGUg c2ltcGxlaGFzaAp7a2V5LCB2YWx1ZX0gYXJlIHN0b3JlZCB0b2dldGhlciwgc28gZWFjaCBlbnRy eSBpcyAxMi1ieXRlcy4KVGhpcyBpcyBzb21ld2hhdCBhd2t3YXJkIGFzIHdlIGhhdmUgdG8gZWl0 aGVyIHBhZCB0aGUgZW50cnkgdG8gMTYtYnl0ZXMsCm9yIHRoZSBhY2Nlc3Mgd2lsbCBiZSBhbiBh bHRlcm5hdGluZyBhbGlnbmVkL21pc2FsaWduZWQgYWRkcmVzZXMuCgpIb3dldmVyLCB3ZSBhcmUg cHJvYmFibHkgbm90IGdvaW5nIHRvIG5lZWQgZXZlbiAxNi1iaXRzIGZvciB0aGUgY291bnQKYW5k IDItYml0cyBpcyBlbm91Z2ggZm9yIHRoZSBsb2NrIG1vZGUuIFNvIHdlIGNhbiBlYXNpbHkgcGFj ayB0aGVzZQppbnQgdG8gYSBzaW5nbGUgdWludDMyLgoKSW5jcmVtZW50aW5nL2RlY3JlbWVudGlu ZyB0aGUgY291bnQgY29udGludWUgdGhlIHNhbWUsIGp1c3QgdXNpbmcKNCBpbnN0ZWFkIG9mIDEs IGxvY2sgbW9kZSBhY2Nlc3Mgd2lsbCByZXF1aXJlIG9uZSBvciB0d28gYWRkaXRpb25hbApiaXR3 aXNlIG9wZXJhdGlvbnMuCgpObyBiaXQtc2hpZnRzIGFyZSByZXF1aXJlZC4KCi0tLQogc3JjL2Jh Y2tlbmQvc3RvcmFnZS9idWZmZXIvYnVmX3JlZmNvdW50LmMgfCAxNjcgKysrKysrKysrLS0tLS0t LS0tLS0tLQogMSBmaWxlIGNoYW5nZWQsIDcwIGluc2VydGlvbnMoKyksIDk3IGRlbGV0aW9ucygt KQoKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3N0b3JhZ2UvYnVmZmVyL2J1Zl9yZWZjb3VudC5j IGIvc3JjL2JhY2tlbmQvc3RvcmFnZS9idWZmZXIvYnVmX3JlZmNvdW50LmMKaW5kZXggZmYzNzM1 NWE2MWUuLjI5ZGZiNzIwOTk3IDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9zdG9yYWdlL2J1ZmZl ci9idWZfcmVmY291bnQuYworKysgYi9zcmMvYmFja2VuZC9zdG9yYWdlL2J1ZmZlci9idWZfcmVm Y291bnQuYwpAQCAtNDAsNTMgKzQwLDU0IEBACiAgKi8KICNpbmNsdWRlICJwb3N0Z3Jlcy5oIgog Ci0jaW5jbHVkZSAiY29tbW9uL2hhc2hmbi5oIgogI2luY2x1ZGUgInN0b3JhZ2UvYnVmX2ludGVy bmFscy5oIgogI2luY2x1ZGUgInN0b3JhZ2UvYnVmX3JlZmNvdW50LmgiCiAjaW5jbHVkZSAic3Rv cmFnZS9wcm9jLmgiCiAKIAogCi10eXBlZGVmIHN0cnVjdCBQcml2YXRlUmVmQ291bnREYXRhCisv KgorICogSW1wbGVtZW50YXRpb24gZGV0YWlscyAtIG9wYXF1ZSB0byBjYWxsZXJzLgorICogUGFj a2VkIHJlZmNvdW50IGFuZCBsb2NrbW9kZSBpbiBhIHNpbmdsZSB1aW50MzI6CisgKiAgIEJpdHMg MC0xOiAgbG9ja21vZGUgKDQgdmFsdWVzOiBVTkxPQ0ssIFNIQVJFLCBTSEFSRV9FWENMVVNJVkUs IEVYQ0xVU0lWRSkKKyAqICAgQml0cyAyLTMxOiByZWZjb3VudCAoMzAgYml0cywgbWF4IH4xIGJp bGxpb24pCisgKi8KK3N0cnVjdCBQcml2YXRlUmVmQ291bnRFbnRyeQogewotCWludDMyCQlyZWZj b3VudDsKLQlCdWZmZXJMb2NrTW9kZSBsb2NrbW9kZTsKLX0gUHJpdmF0ZVJlZkNvdW50RGF0YTsK KwlCdWZmZXIJCWJ1ZmZlcjsKKwl1aW50MzIJCWRhdGE7Cit9OwogCi1zdHJ1Y3QgUHJpdmF0ZVJl ZkNvdW50RW50cnkKKyNkZWZpbmUgUFJJVkFURVJFRkNPVU5UX0xPQ0tNT0RFX01BU0sJMHgzCisj ZGVmaW5lIE9ORV9QUklWQVRFX1JFRkVSRU5DRQkJCTQJLyogMSA8PCAyICovCisKKyNkZWZpbmUg UHJpdmF0ZVJlZkNvdW50R2V0TG9ja01vZGUoZCkJKChCdWZmZXJMb2NrTW9kZSkoKGQpICYgUFJJ VkFURVJFRkNPVU5UX0xPQ0tNT0RFX01BU0spKQorI2RlZmluZSBQcml2YXRlUmVmQ291bnRTZXRM b2NrTW9kZShkLCBtKSAoKGQpID0gKChkKSAmIH5QUklWQVRFUkVGQ09VTlRfTE9DS01PREVfTUFT SykgfCAobSkpCisjZGVmaW5lIFByaXZhdGVSZWZDb3VudEdldFJlZkNvdW50KGQpCSgoaW50MzIp KChkKSA+PiAyKSkKKyNkZWZpbmUgUHJpdmF0ZVJlZkNvdW50SXNaZXJvKGQpCQkoKGQpIDwgT05F X1BSSVZBVEVfUkVGRVJFTkNFKQorCitzdHJ1Y3QgUHJpdmF0ZVJlZkNvdW50SXRlcmF0b3IKIHsK LQlCdWZmZXIJCWJ1ZmZlcjsJCS8qIGhhc2gga2V5IC0gSW52YWxpZEJ1ZmZlciBtZWFucyBlbXB0 eSAqLwotCVByaXZhdGVSZWZDb3VudERhdGEgZGF0YTsKKwlpbnQJCQlhcnJheV9pbmRleDsKKwli b29sCQlpbl9oYXNoOworCXZvaWQJICAgKmhhc2hfc3RhdHVzOwogfTsKIAotLyoKLSAqIERlZmlu ZSBzaW1wbGVoYXNoIHBhcmFtZXRlcnMgZm9yIHRoZSBvdmVyZmxvdyBoYXNoIHRhYmxlLgotICog V2UgdXNlIGJ1ZmZlciA9PSBJbnZhbGlkQnVmZmVyIGFzIHRoZSAiZW1wdHkiIG1hcmtlciB0byBh dm9pZCBuZWVkaW5nCi0gKiBhIHNlcGFyYXRlIHN0YXR1cyBmaWVsZC4KLSAqLworLyogRGVmaW5l IHNpbXBsZWhhc2ggZm9yIHByaXZhdGUgcmVmY291bnQgb3ZlcmZsb3cgaGFzaCB0YWJsZSAqLwog I2RlZmluZSBTSF9QUkVGSVggcmVmY291bnQKICNkZWZpbmUgU0hfRUxFTUVOVF9UWVBFIFByaXZh dGVSZWZDb3VudEVudHJ5CiAjZGVmaW5lIFNIX0tFWV9UWVBFIEJ1ZmZlcgogI2RlZmluZSBTSF9L RVkgYnVmZmVyCi0jZGVmaW5lIFNIX0hBU0hfS0VZKHRiLCBrZXkpIG11cm11cmhhc2gzMihrZXkp CisjZGVmaW5lIFNIX0hBU0hfS0VZKHRiLCBrZXkpICgodWludDMyKSAoa2V5KSkKICNkZWZpbmUg U0hfRVFVQUwodGIsIGEsIGIpICgoYSkgPT0gKGIpKQogI2RlZmluZSBTSF9TQ09QRSBzdGF0aWMg aW5saW5lCi0jZGVmaW5lIFNIX0RFRklORQotI2RlZmluZSBTSF9ERUNMQVJFCi0vKiBVc2UgYnVm ZmVyIGZpZWxkIGFzIGVtcHR5IG1hcmtlciAtIG5vIHNlcGFyYXRlIHN0YXR1cyBuZWVkZWQgKi8K ICNkZWZpbmUgU0hfRU5UUllfRU1QVFkoZW50cnkpICgoZW50cnkpLT5idWZmZXIgPT0gSW52YWxp ZEJ1ZmZlcikKICNkZWZpbmUgU0hfTUFLRV9FTVBUWShlbnRyeSkgKChlbnRyeSktPmJ1ZmZlciA9 IEludmFsaWRCdWZmZXIpCi0jZGVmaW5lIFNIX01BS0VfSU5fVVNFKGVudHJ5KSAoKHZvaWQpMCkg IC8qIGtleSBhc3NpZ25tZW50IGhhbmRsZXMgdGhpcyAqLworI2RlZmluZSBTSF9NQUtFX0lOX1VT RShlbnRyeSkgKCh2b2lkKSAwKQorI2RlZmluZSBTSF9ERUNMQVJFCisjZGVmaW5lIFNIX0RFRklO RQogI2luY2x1ZGUgImxpYi9zaW1wbGVoYXNoLmgiCiAKLXN0cnVjdCBQcml2YXRlUmVmQ291bnRJ dGVyYXRvcgotewotCWludAkJCWFycmF5X2luZGV4OwotCWJvb2wJCWluX2hhc2g7Ci0JcmVmY291 bnRfaXRlcmF0b3IgaGFzaF9pdGVyOwotCWJvb2wJCWhhc2hfaXRlcl92YWxpZDsKLX07Ci0KIC8q IFByaXZhdGUgcmVmY291bnQgYXJyYXkgYW5kIGtleXMgKi8KICNkZWZpbmUgUkVGQ09VTlRfQVJS QVlfRU5UUklFUyA4CiBzdGF0aWMgQnVmZmVyIFByaXZhdGVSZWZDb3VudEFycmF5S2V5c1tSRUZD T1VOVF9BUlJBWV9FTlRSSUVTXTsKQEAgLTExMyw3ICsxMTQsNyBAQCBzdGF0aWMgdWludDMyIE1h eFByb3BvcnRpb25hbFBpbnMgPSAwOwogLyogRm9yd2FyZCBkZWNsYXJhdGlvbnMgKi8KIHN0YXRp YyB2b2lkIFJlc2VydmVQcml2YXRlUmVmQ291bnRFbnRyeSh2b2lkKTsKIHN0YXRpYyBQcml2YXRl UmVmQ291bnRFbnRyeSAqTmV3UHJpdmF0ZVJlZkNvdW50RW50cnkoQnVmZmVyIGJ1ZmZlcik7Ci1z dGF0aWMgcGdfbm9pbmxpbmUgUHJpdmF0ZVJlZkNvdW50RW50cnkgKkdldFByaXZhdGVSZWZDb3Vu dEVudHJ5U2xvdyhCdWZmZXIgYnVmZmVyLCBib29sIGRvX21vdmUpOworc3RhdGljIHBnX25vaW5s aW5lIFByaXZhdGVSZWZDb3VudEVudHJ5ICpHZXRQcml2YXRlUmVmQ291bnRFbnRyeVNsb3coQnVm ZmVyIGJ1ZmZlcik7CiAKIC8qCiAgKiBJbml0aWFsaXplIHByaXZhdGUgcmVmY291bnQgdHJhY2tp bmcgZm9yIHRoaXMgYmFja2VuZC4KQEAgLTEzMiw3ICsxMzMsNyBAQCBJbml0UHJpdmF0ZVJlZkNv dW50KHZvaWQpCiAJbWVtc2V0KCZQcml2YXRlUmVmQ291bnRBcnJheSwgMCwgc2l6ZW9mKFByaXZh dGVSZWZDb3VudEFycmF5KSk7CiAJbWVtc2V0KCZQcml2YXRlUmVmQ291bnRBcnJheUtleXMsIDAs IHNpemVvZihQcml2YXRlUmVmQ291bnRBcnJheUtleXMpKTsKIAotCVByaXZhdGVSZWZDb3VudEhh c2ggPSByZWZjb3VudF9jcmVhdGUoQ3VycmVudE1lbW9yeUNvbnRleHQsIDE2LCBOVUxMKTsKKwlQ cml2YXRlUmVmQ291bnRIYXNoID0gcmVmY291bnRfY3JlYXRlKEN1cnJlbnRNZW1vcnlDb250ZXh0 LCA2NCwgTlVMTCk7CiB9CiAKIC8qCkBAIC0xNTgsNiArMTU5LDExIEBAIFJlc2VydmVQcml2YXRl UmVmQ291bnRFbnRyeSh2b2lkKQogCQkJaWYgKFByaXZhdGVSZWZDb3VudEFycmF5S2V5c1tpXSA9 PSBJbnZhbGlkQnVmZmVyKQogCQkJewogCQkJCVJlc2VydmVkUmVmQ291bnRTbG90ID0gaTsKKwor CQkJCS8qCisJCQkJICogV2UgY291bGQgcmV0dXJuIGltbWVkaWF0ZWx5LCBidXQgaXRlcmF0aW5n IHRpbGwgdGhlIGVuZCBvZgorCQkJCSAqIHRoZSBhcnJheSBhbGxvd3MgY29tcGlsZXItYXV0b3Zl Y3Rvcml6YXRpb24uCisJCQkJICovCiAJCQl9CiAJCX0KIApAQCAtMTk1LDEwICsyMDEsNyBAQCBS ZXNlcnZlUHJpdmF0ZVJlZkNvdW50RW50cnkodm9pZCkKIAkJLyogY2xlYXIgdGhlIG5vdyBmcmVl IGFycmF5IHNsb3QgKi8KIAkJUHJpdmF0ZVJlZkNvdW50QXJyYXlLZXlzW3ZpY3RpbV9zbG90XSA9 IEludmFsaWRCdWZmZXI7CiAJCXZpY3RpbV9lbnRyeS0+YnVmZmVyID0gSW52YWxpZEJ1ZmZlcjsK LQotCQltZW1zZXQoJnZpY3RpbV9lbnRyeS0+ZGF0YSwgMCwgc2l6ZW9mKHZpY3RpbV9lbnRyeS0+ ZGF0YSkpOwotCQl2aWN0aW1fZW50cnktPmRhdGEucmVmY291bnQgPSAwOwotCQl2aWN0aW1fZW50 cnktPmRhdGEubG9ja21vZGUgPSBCVUZGRVJfTE9DS19VTkxPQ0s7CisJCXZpY3RpbV9lbnRyeS0+ ZGF0YSA9IDA7CiAKIAkJUHJpdmF0ZVJlZkNvdW50T3ZlcmZsb3dlZCsrOwogCX0KQEAgLTIyMSw4 ICsyMjQsNyBAQCBOZXdQcml2YXRlUmVmQ291bnRFbnRyeShCdWZmZXIgYnVmZmVyKQogCS8qIGFu ZCBmaWxsIGl0ICovCiAJUHJpdmF0ZVJlZkNvdW50QXJyYXlLZXlzW1Jlc2VydmVkUmVmQ291bnRT bG90XSA9IGJ1ZmZlcjsKIAlyZXMtPmJ1ZmZlciA9IGJ1ZmZlcjsKLQlyZXMtPmRhdGEucmVmY291 bnQgPSAwOwotCXJlcy0+ZGF0YS5sb2NrbW9kZSA9IEJVRkZFUl9MT0NLX1VOTE9DSzsKKwlyZXMt PmRhdGEgPSAwOwogCiAJLyogdXBkYXRlIGNhY2hlIGZvciB0aGUgbmV4dCBsb29rdXAgKi8KIAlQ cml2YXRlUmVmQ291bnRFbnRyeUxhc3QgPSBSZXNlcnZlZFJlZkNvdW50U2xvdDsKQEAgLTIzNiw3 ICsyMzgsNyBAQCBOZXdQcml2YXRlUmVmQ291bnRFbnRyeShCdWZmZXIgYnVmZmVyKQogICogU2xv dy1wYXRoIGZvciBHZXRTaGFyZWRCdWZmZXJFbnRyeSgpLgogICovCiBzdGF0aWMgcGdfbm9pbmxp bmUgUHJpdmF0ZVJlZkNvdW50RW50cnkgKgotR2V0UHJpdmF0ZVJlZkNvdW50RW50cnlTbG93KEJ1 ZmZlciBidWZmZXIsIGJvb2wgZG9fbW92ZSkKK0dldFByaXZhdGVSZWZDb3VudEVudHJ5U2xvdyhC dWZmZXIgYnVmZmVyKQogewogCVByaXZhdGVSZWZDb3VudEVudHJ5ICpyZXM7CiAJaW50CQkJbWF0 Y2ggPSAtMTsKQEAgLTI2Niw0MSArMjY4LDExIEBAIEdldFByaXZhdGVSZWZDb3VudEVudHJ5U2xv dyhCdWZmZXIgYnVmZmVyLCBib29sIGRvX21vdmUpCiAJCXJldHVybiBOVUxMOwogCiAJcmVzID0g cmVmY291bnRfbG9va3VwKFByaXZhdGVSZWZDb3VudEhhc2gsIGJ1ZmZlcik7Ci0KLQlpZiAocmVz ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWVsc2UgaWYgKCFkb19tb3ZlKQotCXsKLQkJcmV0 dXJuIHJlczsKLQl9Ci0JZWxzZQotCXsKLQkJLyogbW92ZSBidWZmZXIgZnJvbSBoYXNodGFibGUg aW50byB0aGUgZnJlZSBhcnJheSBzbG90ICovCi0JCVByaXZhdGVSZWZDb3VudEVudHJ5ICpmcmVl OwotCi0JCVJlc2VydmVQcml2YXRlUmVmQ291bnRFbnRyeSgpOwotCi0JCUFzc2VydChSZXNlcnZl ZFJlZkNvdW50U2xvdCAhPSAtMSk7Ci0JCWZyZWUgPSAmUHJpdmF0ZVJlZkNvdW50QXJyYXlbUmVz ZXJ2ZWRSZWZDb3VudFNsb3RdOwotCQlBc3NlcnQoZnJlZS0+YnVmZmVyID09IEludmFsaWRCdWZm ZXIpOwotCi0JCWZyZWUtPmJ1ZmZlciA9IGJ1ZmZlcjsKLQkJZnJlZS0+ZGF0YSA9IHJlcy0+ZGF0 YTsKLQkJUHJpdmF0ZVJlZkNvdW50QXJyYXlLZXlzW1Jlc2VydmVkUmVmQ291bnRTbG90XSA9IGJ1 ZmZlcjsKLQkJUHJpdmF0ZVJlZkNvdW50RW50cnlMYXN0ID0gUmVzZXJ2ZWRSZWZDb3VudFNsb3Q7 Ci0KLQkJUmVzZXJ2ZWRSZWZDb3VudFNsb3QgPSAtMTsKLQotCQlyZWZjb3VudF9kZWxldGVfaXRl bShQcml2YXRlUmVmQ291bnRIYXNoLCByZXMpOwotCQlBc3NlcnQoUHJpdmF0ZVJlZkNvdW50T3Zl cmZsb3dlZCA+IDApOwotCQlQcml2YXRlUmVmQ291bnRPdmVyZmxvd2VkLS07Ci0KLQkJcmV0dXJu IGZyZWU7Ci0JfQorCXJldHVybiByZXM7CiB9CiAKIC8qCi0gKiBSZXR1cm4gdGhlIFByaXZhdGVS ZWZDb3VudEVudHJ5IGZvciB0aGUgcGFzc2VkIGJ1ZmZlci4KKyAqIFJldHVybiB0aGUgUHJpdmF0 ZVJlZkNvdW50IGVudHJ5IGZvciB0aGUgcGFzc2VkIGJ1ZmZlci4KICAqIFJldHVybnMgTlVMTCBp ZiB0aGUgYnVmZmVyIGlzIG5vdCBjdXJyZW50bHkgcGlubmVkLgogICovCiBQcml2YXRlUmVmQ291 bnRFbnRyeSAqCkBAIC0zMTYsNyArMjg4LDcgQEAgR2V0U2hhcmVkQnVmZmVyRW50cnkoQnVmZmVy IGJ1ZmZlcikKIAkJcmV0dXJuICZQcml2YXRlUmVmQ291bnRBcnJheVtQcml2YXRlUmVmQ291bnRF bnRyeUxhc3RdOwogCX0KIAotCXJldHVybiBHZXRQcml2YXRlUmVmQ291bnRFbnRyeVNsb3coYnVm ZmVyLCBmYWxzZSk7CisJcmV0dXJuIEdldFByaXZhdGVSZWZDb3VudEVudHJ5U2xvdyhidWZmZXIp OwogfQogCiAvKgpAQCAtMzMyLDI1ICszMDQsMjAgQEAgU2hhcmVkQnVmZmVyUmVmKEJ1ZmZlciBi dWZmZXIpCiAJQXNzZXJ0KEJ1ZmZlcklzVmFsaWQoYnVmZmVyKSk7CiAJQXNzZXJ0KCFCdWZmZXJJ c0xvY2FsKGJ1ZmZlcikpOwogCi0JLyogQ2hlY2sgY2FjaGUgZmlyc3QsIHRoZW4gc2xvdyBwYXRo ICovCi0JaWYgKGxpa2VseShQcml2YXRlUmVmQ291bnRFbnRyeUxhc3QgIT0gLTEpICYmCi0JCWxp a2VseShQcml2YXRlUmVmQ291bnRBcnJheVtQcml2YXRlUmVmQ291bnRFbnRyeUxhc3RdLmJ1ZmZl ciA9PSBidWZmZXIpKQotCXsKLQkJcmVmID0gJlByaXZhdGVSZWZDb3VudEFycmF5W1ByaXZhdGVS ZWZDb3VudEVudHJ5TGFzdF07Ci0JfQotCWVsc2UKLQl7Ci0JCXJlZiA9IEdldFByaXZhdGVSZWZD b3VudEVudHJ5U2xvdyhidWZmZXIsIHRydWUpOwotCX0KKwlyZWYgPSBHZXRTaGFyZWRCdWZmZXJF bnRyeShidWZmZXIpOwogCiAJaWYgKHJlZiA9PSBOVUxMKQogCXsKIAkJLyogTmV3IHBpbiAtIGNy ZWF0ZSBlbnRyeSAqLwogCQlSZXNlcnZlUHJpdmF0ZVJlZkNvdW50RW50cnkoKTsKIAkJcmVmID0g TmV3UHJpdmF0ZVJlZkNvdW50RW50cnkoYnVmZmVyKTsKKwkJcmVmLT5kYXRhID0gT05FX1BSSVZB VEVfUkVGRVJFTkNFOworCX0KKwllbHNlCisJeworCQkvKiBBbHJlYWR5IHBpbm5lZCAtIGluY3Jl bWVudCAqLworCQlyZWYtPmRhdGEgKz0gT05FX1BSSVZBVEVfUkVGRVJFTkNFOwogCX0KLQotCXJl Zi0+ZGF0YS5yZWZjb3VudCsrOwogCiAJcmV0dXJuIHJlZjsKIH0KQEAgLTM2Myw4ICszMzAsOCBA QCB2b2lkCiBTaGFyZWRCdWZmZXJSZWZFeGlzdGluZyhQcml2YXRlUmVmQ291bnRFbnRyeSAqcmVm KQogewogCUFzc2VydChyZWYgIT0gTlVMTCk7Ci0JQXNzZXJ0KHJlZi0+ZGF0YS5yZWZjb3VudCA+ IDApOwotCXJlZi0+ZGF0YS5yZWZjb3VudCsrOworCUFzc2VydCghUHJpdmF0ZVJlZkNvdW50SXNa ZXJvKHJlZi0+ZGF0YSkpOworCXJlZi0+ZGF0YSArPSBPTkVfUFJJVkFURV9SRUZFUkVOQ0U7CiB9 CiAKIC8qCkBAIC0zNzYsMTQgKzM0MywxNCBAQCBib29sCiBTaGFyZWRCdWZmZXJVbnJlZihQcml2 YXRlUmVmQ291bnRFbnRyeSAqcmVmKQogewogCUFzc2VydChyZWYgIT0gTlVMTCk7Ci0JQXNzZXJ0 KHJlZi0+ZGF0YS5yZWZjb3VudCA+IDApOworCUFzc2VydCghUHJpdmF0ZVJlZkNvdW50SXNaZXJv KHJlZi0+ZGF0YSkpOwogCi0JcmVmLT5kYXRhLnJlZmNvdW50LS07CisJcmVmLT5kYXRhIC09IE9O RV9QUklWQVRFX1JFRkVSRU5DRTsKIAotCWlmIChyZWYtPmRhdGEucmVmY291bnQgPT0gMCkKKwlp ZiAoUHJpdmF0ZVJlZkNvdW50SXNaZXJvKHJlZi0+ZGF0YSkpCiAJewogCQkvKiBObyBtb3JlIHJl ZmVyZW5jZXMgLSBjbGVhbiB1cCB0aGUgZW50cnkgKi8KLQkJQXNzZXJ0KHJlZi0+ZGF0YS5sb2Nr bW9kZSA9PSBCVUZGRVJfTE9DS19VTkxPQ0spOworCQlBc3NlcnQoU2hhcmVkQnVmZmVyR2V0TG9j a01vZGUocmVmKSA9PSBCVUZGRVJfTE9DS19VTkxPQ0spOwogCiAJCWlmIChyZWYgPj0gJlByaXZh dGVSZWZDb3VudEFycmF5WzBdICYmCiAJCQlyZWYgPCAmUHJpdmF0ZVJlZkNvdW50QXJyYXlbUkVG Q09VTlRfQVJSQVlfRU5UUklFU10pCkBAIC0zOTQsNyArMzYxLDggQEAgU2hhcmVkQnVmZmVyVW5y ZWYoUHJpdmF0ZVJlZkNvdW50RW50cnkgKnJlZikKIAkJfQogCQllbHNlCiAJCXsKLQkJCXJlZmNv dW50X2RlbGV0ZV9pdGVtKFByaXZhdGVSZWZDb3VudEhhc2gsIHJlZik7CisJCQkvKiBjb3VsZCBt YWtlIHNsaWdodGx5IG1vcmUgZWZmaWNpZW50IGJ5IHVzaW5nIHRoZSBwb2ludGVyICovCisJCQly ZWZjb3VudF9kZWxldGUoUHJpdmF0ZVJlZkNvdW50SGFzaCwgcmVmLT5idWZmZXIpOwogCQkJQXNz ZXJ0KFByaXZhdGVSZWZDb3VudE92ZXJmbG93ZWQgPiAwKTsKIAkJCVByaXZhdGVSZWZDb3VudE92 ZXJmbG93ZWQtLTsKIAkJfQpAQCAtNDA2LDI0ICszNzQsMjQgQEAgU2hhcmVkQnVmZmVyVW5yZWYo UHJpdmF0ZVJlZkNvdW50RW50cnkgKnJlZikKIH0KIAogLyoKLSAqIEFjY2Vzc29ycyBmb3IgcmVm Y291bnQgZW50cnkgZmllbGRzLgorICogQWNjZXNzb3JzIGZvciByZWZjb3VudCBlbnRyeSBmaWVs ZHMgLSBvcGFxdWUgdG8gY2FsbGVycy4KICAqLwogaW50MzIKIFNoYXJlZEJ1ZmZlclJlZkNvdW50 KFByaXZhdGVSZWZDb3VudEVudHJ5ICpyZWYpCiB7Ci0JcmV0dXJuIHJlZi0+ZGF0YS5yZWZjb3Vu dDsKKwlyZXR1cm4gUHJpdmF0ZVJlZkNvdW50R2V0UmVmQ291bnQocmVmLT5kYXRhKTsKIH0KIAog QnVmZmVyTG9ja01vZGUKIFNoYXJlZEJ1ZmZlckdldExvY2tNb2RlKFByaXZhdGVSZWZDb3VudEVu dHJ5ICpyZWYpCiB7Ci0JcmV0dXJuIHJlZi0+ZGF0YS5sb2NrbW9kZTsKKwlyZXR1cm4gUHJpdmF0 ZVJlZkNvdW50R2V0TG9ja01vZGUocmVmLT5kYXRhKTsKIH0KIAogdm9pZAogU2hhcmVkQnVmZmVy U2V0TG9ja01vZGUoUHJpdmF0ZVJlZkNvdW50RW50cnkgKnJlZiwgQnVmZmVyTG9ja01vZGUgbW9k ZSkKIHsKLQlyZWYtPmRhdGEubG9ja21vZGUgPSBtb2RlOworCVByaXZhdGVSZWZDb3VudFNldExv Y2tNb2RlKHJlZi0+ZGF0YSwgbW9kZSk7CiB9CiAKIEJ1ZmZlcgpAQCAtNDg4LDcgKzQ1Niw3IEBA IEluaXRQcml2YXRlUmVmQ291bnRJdGVyYXRvcih2b2lkKQogCiAJaXRlci0+YXJyYXlfaW5kZXgg PSAwOwogCWl0ZXItPmluX2hhc2ggPSBmYWxzZTsKLQlpdGVyLT5oYXNoX2l0ZXJfdmFsaWQgPSBm YWxzZTsKKwlpdGVyLT5oYXNoX3N0YXR1cyA9IE5VTEw7CiAJcmV0dXJuIGl0ZXI7CiB9CiAKQEAg LTUxNCwyMCArNDgyLDIzIEBAIEdldE5leHRQcml2YXRlUmVmQ291bnRFbnRyeShQcml2YXRlUmVm Q291bnRJdGVyYXRvciAqaXRlcikKIAkJaXRlci0+aW5faGFzaCA9IHRydWU7CiAJCWlmIChQcml2 YXRlUmVmQ291bnRPdmVyZmxvd2VkID4gMCkKIAkJewotCQkJcmVmY291bnRfc3RhcnRfaXRlcmF0 ZShQcml2YXRlUmVmQ291bnRIYXNoLCAmaXRlci0+aGFzaF9pdGVyKTsKLQkJCWl0ZXItPmhhc2hf aXRlcl92YWxpZCA9IHRydWU7CisJCQlyZWZjb3VudF9pdGVyYXRvciAqaGl0ZXIgPSBwYWxsb2Mo c2l6ZW9mKHJlZmNvdW50X2l0ZXJhdG9yKSk7CisKKwkJCXJlZmNvdW50X3N0YXJ0X2l0ZXJhdGUo UHJpdmF0ZVJlZkNvdW50SGFzaCwgaGl0ZXIpOworCQkJaXRlci0+aGFzaF9zdGF0dXMgPSBoaXRl cjsKIAkJfQogCX0KIAotCWlmIChpdGVyLT5oYXNoX2l0ZXJfdmFsaWQpCisJaWYgKGl0ZXItPmhh c2hfc3RhdHVzICE9IE5VTEwpCiAJewogCQlQcml2YXRlUmVmQ291bnRFbnRyeSAqcmVzOwogCi0J CXJlcyA9IHJlZmNvdW50X2l0ZXJhdGUoUHJpdmF0ZVJlZkNvdW50SGFzaCwgJml0ZXItPmhhc2hf aXRlcik7CisJCXJlcyA9IHJlZmNvdW50X2l0ZXJhdGUoUHJpdmF0ZVJlZkNvdW50SGFzaCwgKHJl ZmNvdW50X2l0ZXJhdG9yICopIGl0ZXItPmhhc2hfc3RhdHVzKTsKIAkJaWYgKHJlcyAhPSBOVUxM KQogCQkJcmV0dXJuIHJlczsKIAotCQlpdGVyLT5oYXNoX2l0ZXJfdmFsaWQgPSBmYWxzZTsKKwkJ cGZyZWUoaXRlci0+aGFzaF9zdGF0dXMpOworCQlpdGVyLT5oYXNoX3N0YXR1cyA9IE5VTEw7CiAJ fQogCiAJcmV0dXJuIE5VTEw7CkBAIC01MzksNiArNTEwLDggQEAgR2V0TmV4dFByaXZhdGVSZWZD b3VudEVudHJ5KFByaXZhdGVSZWZDb3VudEl0ZXJhdG9yICppdGVyKQogdm9pZAogRnJlZVByaXZh dGVSZWZDb3VudEl0ZXJhdG9yKFByaXZhdGVSZWZDb3VudEl0ZXJhdG9yICppdGVyKQogeworCWlm IChpdGVyLT5oYXNoX3N0YXR1cyAhPSBOVUxMKQorCQlwZnJlZShpdGVyLT5oYXNoX3N0YXR1cyk7 CiAJcGZyZWUoaXRlcik7CiB9CiAKLS0gCjIuNTMuMAoK --00000000000048da9c064c8582e3 Content-Type: application/octet-stream; name="v1-0002-Refactoring-reference-counting.patch" Content-Disposition: attachment; filename="v1-0002-Refactoring-reference-counting.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mmhxnewl1 RnJvbSBjOGI5MDcyNWZkMDMzNDY1YzY4Njg4ZjQ2NjM4OTJjZTExOTZhNDhlIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBBbGV4YW5kcmUgRmVsaXBlIDxvLmFsZXhhbmRyZS5mZWxpcGVA Z21haWwuY29tPgpEYXRlOiBGcmksIDYgTWFyIDIwMjYgMTY6MzE6MDAgKzAwMDAKU3ViamVjdDog W1BBVENIIDIvNV0gUmVmYWN0b3JpbmcgcmVmZXJlbmNlIGNvdW50aW5nCgpUaGlzIHBhdGNoIHJl ZmFjdG9ycyB0aGUgcmVmZXJlbmNlIGNvdW50aW5nIG1lY2hhbmlzbSBtb3ZpbmcgdGhlCmltcGxl bWVudGF0aW9uIGRldGFpbHMgYXdheSBmcm9tIGJ1Zm1nci4gVW5mb3J0dW5hdGVseSwgdGhpcwpj b21lcyB3aXRoIGFkZGl0aW9uYWwgY2FsbHMgb3ZlcmhlYWQsIGJ1dCBJIHRoaW5rIHRoYXQgdGhl IGVhc2UKb2YgbWFpbnRlbmFuY2Ugd2lsbCBwYXkgb2ZmLiBBbmQgd2l0aCB0aGUgbmV4dCBvcHRp bWlzYXRpb25zLAp3ZSB3aWxsIGVuZCB1cCBiZXR0ZXIgdGhhbiBiZWZvcmUuCgotLS0KIHNyYy9i YWNrZW5kL3N0b3JhZ2UvYnVmZmVyL01ha2VmaWxlICAgICAgIHwgICAxICsKIHNyYy9iYWNrZW5k L3N0b3JhZ2UvYnVmZmVyL2J1Zl9yZWZjb3VudC5jIHwgNjAyICsrKysrKysrKysrKysrKysrKysr CiBzcmMvYmFja2VuZC9zdG9yYWdlL2J1ZmZlci9idWZtZ3IuYyAgICAgICB8IDY2MSArKystLS0t LS0tLS0tLS0tLS0tLS0tCiBzcmMvaW5jbHVkZS9zdG9yYWdlL2J1Zl9yZWZjb3VudC5oICAgICAg ICB8ICA1OCArKwogNCBmaWxlcyBjaGFuZ2VkLCA3MjcgaW5zZXJ0aW9ucygrKSwgNTk1IGRlbGV0 aW9ucygtKQogY3JlYXRlIG1vZGUgMTAwNjQ0IHNyYy9iYWNrZW5kL3N0b3JhZ2UvYnVmZmVyL2J1 Zl9yZWZjb3VudC5jCiBjcmVhdGUgbW9kZSAxMDA2NDQgc3JjL2luY2x1ZGUvc3RvcmFnZS9idWZf cmVmY291bnQuaAoKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3N0b3JhZ2UvYnVmZmVyL01ha2Vm aWxlIGIvc3JjL2JhY2tlbmQvc3RvcmFnZS9idWZmZXIvTWFrZWZpbGUKaW5kZXggZmQ3YzQwZGNi MDguLmM4MTI3MWFhYmY2IDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9zdG9yYWdlL2J1ZmZlci9N YWtlZmlsZQorKysgYi9zcmMvYmFja2VuZC9zdG9yYWdlL2J1ZmZlci9NYWtlZmlsZQpAQCAtMTQs NiArMTQsNyBAQCBpbmNsdWRlICQodG9wX2J1aWxkZGlyKS9zcmMvTWFrZWZpbGUuZ2xvYmFsCiAK IE9CSlMgPSBcCiAJYnVmX2luaXQubyBcCisJYnVmX3JlZmNvdW50Lm8gXAogCWJ1Zl90YWJsZS5v IFwKIAlidWZtZ3IubyBcCiAJZnJlZWxpc3QubyBcCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9z dG9yYWdlL2J1ZmZlci9idWZfcmVmY291bnQuYyBiL3NyYy9iYWNrZW5kL3N0b3JhZ2UvYnVmZmVy L2J1Zl9yZWZjb3VudC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwLi4x YzBiZWMyOWM5MwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9iYWNrZW5kL3N0b3JhZ2UvYnVmZmVy L2J1Zl9yZWZjb3VudC5jCkBAIC0wLDAgKzEsNjAyIEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAq CisgKiBidWZfcmVmY291bnQuYworICoJICBCYWNrZW5kLXByaXZhdGUgYnVmZmVyIHJlZmNvdW50 IHRyYWNraW5nCisgKgorICogRWFjaCBidWZmZXIgaGFzIGEgcHJpdmF0ZSByZWZjb3VudCB0aGF0 IGtlZXBzIHRyYWNrIG9mIHRoZSBudW1iZXIgb2YKKyAqIHRpbWVzIHRoZSBidWZmZXIgaXMgcGlu bmVkIGluIHRoZSBjdXJyZW50IHByb2Nlc3MuICBUaGlzIGlzIHNvIHRoYXQgdGhlCisgKiBzaGFy ZWQgcmVmY291bnQgbmVlZHMgdG8gYmUgbW9kaWZpZWQgb25seSBvbmNlIGlmIGEgYnVmZmVyIGlz IHBpbm5lZCBtb3JlCisgKiB0aGFuIG9uY2UgYnkgYW4gaW5kaXZpZHVhbCBiYWNrZW5kLiBUaGlz IG1lY2hhbmlzbSBpcyBhbHNvIHVzZWQgdG8gdHJhY2sKKyAqIHdoZXRoZXIgdGhpcyBiYWNrZW5k IGhhcyBhIGJ1ZmZlciBsb2NrZWQsIGFuZCwgaWYgc28sIGluIHdoYXQgbW9kZS4KKyAqCisgKiBU byBhdm9pZCAtIGFzIHdlIHVzZWQgdG8gLSByZXF1aXJpbmcgYW4gYXJyYXkgd2l0aCBOQnVmZmVy cyBlbnRyaWVzIHRvIGtlZXAKKyAqIHRyYWNrIG9mIGxvY2FsIGJ1ZmZlcnMsIHdlIHVzZSBhIHNt YWxsIHNlcXVlbnRpYWxseSBzZWFyY2hlZCBhcnJheQorICogKFByaXZhdGVSZWZDb3VudEFycmF5 S2V5cywgd2l0aCB0aGUgY29ycmVzcG9uZGluZyBkYXRhIHN0b3JlZCBpbgorICogUHJpdmF0ZVJl ZkNvdW50QXJyYXkpIGFuZCBhbiBvdmVyZmxvdyBoYXNoIHRhYmxlIChQcml2YXRlUmVmQ291bnRI YXNoKSB0bworICoga2VlcCB0cmFjayBvZiBiYWNrZW5kIGxvY2FsIHBpbnMuCisgKgorICogVW50 aWwgbm8gbW9yZSB0aGFuIFJFRkNPVU5UX0FSUkFZX0VOVFJJRVMgYnVmZmVycyBhcmUgcGlubmVk IGF0IG9uY2UsIGFsbAorICogcmVmY291bnRzIGFyZSBrZXB0IHRyYWNrIG9mIGluIHRoZSBhcnJh eTsgYWZ0ZXIgdGhhdCwgbmV3IGFycmF5IGVudHJpZXMKKyAqIGRpc3BsYWNlIG9sZCBvbmVzIGlu dG8gdGhlIGhhc2ggdGFibGUuIFRoYXQgd2F5IGEgZnJlcXVlbnRseSB1c2VkIGVudHJ5CisgKiBj YW4ndCBnZXQgInN0dWNrIiBpbiB0aGUgaGFzaHRhYmxlIHdoaWxlIGluZnJlcXVlbnQgb25lcyBj bG9nIHRoZSBhcnJheS4KKyAqCisgKiBUaGlzIHdhcyBpbml0aWFsbHkgZGVzaWduZWQgdHJ5aW5n IHRvIG9wdGltaXplIGZvciB0aGUgY2FzZSB3aGVyZSB0aGUKKyAqIG51bWJlciBvZiBwaW5uZWQg YnVmZmVycyBpcyBleHBlY3RlZCB0byBub3QgZXhjZWVkIFJFRkNPVU5UX0FSUkFZX0VOVFJJRVMu CisgKiBIb3dldmVyIHRoaXMgbWlnaHQgbm90IGJlIHRoZSBjYXNlIHdpdGggdGhlIGludHJvZHVj dGlvbiBvZiBwcmVmZXRjaGluZy4KKyAqCisgKiBUbyBlbnRlciBhIGJ1ZmZlciBpbnRvIHRoZSBy ZWZjb3VudCB0cmFja2luZyBtZWNoYW5pc20gZmlyc3QgcmVzZXJ2ZSBhIGZyZWUKKyAqIGVudHJ5 IHVzaW5nIFJlc2VydmVQcml2YXRlUmVmQ291bnRFbnRyeSgpIGFuZCB0aGVuIGxhdGVyLCBpZiBu ZWNlc3NhcnksCisgKiBmaWxsIGl0IHdpdGggTmV3UHJpdmF0ZVJlZkNvdW50RW50cnkoKS4gVGhh dCBzcGxpdCBsZXRzIHVzIGF2b2lkIGRvaW5nCisgKiBtZW1vcnkgYWxsb2NhdGlvbnMgaW4gTmV3 UHJpdmF0ZVJlZkNvdW50RW50cnkoKSB3aGljaCBjYW4gYmUgaW1wb3J0YW50CisgKiBiZWNhdXNl IGluIHNvbWUgc2NlbmFyaW9zIGl0J3MgY2FsbGVkIHdpdGggYSBzcGlubG9jayBoZWxkLi4uCisg KgorICogUG9ydGlvbnMgQ29weXJpZ2h0IChjKSAxOTk2LTIwMjYsIFBvc3RncmVTUUwgR2xvYmFs IERldmVsb3BtZW50IEdyb3VwCisgKiBQb3J0aW9ucyBDb3B5cmlnaHQgKGMpIDE5OTQsIFJlZ2Vu dHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYQorICoKKyAqIElERU5USUZJQ0FUSU9O CisgKgkgIHNyYy9iYWNrZW5kL3N0b3JhZ2UvYnVmZmVyL2J1Zl9yZWZjb3VudC5jCisgKgorICot LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tCisgKi8KKyNpbmNsdWRlICJwb3N0Z3Jlcy5oIgorCisjaW5jbHVkZSAi c3RvcmFnZS9idWZfaW50ZXJuYWxzLmgiCisjaW5jbHVkZSAic3RvcmFnZS9idWZfcmVmY291bnQu aCIKKyNpbmNsdWRlICJzdG9yYWdlL3Byb2MuaCIKKyNpbmNsdWRlICJ1dGlscy9oc2VhcmNoLmgi CisKKworCit0eXBlZGVmIHN0cnVjdCBQcml2YXRlUmVmQ291bnREYXRhCit7CisJaW50MzIJCXJl ZmNvdW50OworCUJ1ZmZlckxvY2tNb2RlIGxvY2ttb2RlOworfSBQcml2YXRlUmVmQ291bnREYXRh OworCitzdHJ1Y3QgUHJpdmF0ZVJlZkNvdW50RW50cnkKK3sKKwlCdWZmZXIJCWJ1ZmZlcjsKKwlQ cml2YXRlUmVmQ291bnREYXRhIGRhdGE7Cit9OworCitzdHJ1Y3QgUHJpdmF0ZVJlZkNvdW50SXRl cmF0b3IKK3sKKwlpbnQJCQlhcnJheV9pbmRleDsKKwlib29sCQlpbl9oYXNoOworCUhBU0hfU0VR X1NUQVRVUyAqaGFzaF9zdGF0dXM7Cit9OworCisvKiBQcml2YXRlIHJlZmNvdW50IGFycmF5IGFu ZCBrZXlzICovCisjZGVmaW5lIFJFRkNPVU5UX0FSUkFZX0VOVFJJRVMgOAorc3RhdGljIEJ1ZmZl ciBQcml2YXRlUmVmQ291bnRBcnJheUtleXNbUkVGQ09VTlRfQVJSQVlfRU5UUklFU107CitzdGF0 aWMgc3RydWN0IFByaXZhdGVSZWZDb3VudEVudHJ5IFByaXZhdGVSZWZDb3VudEFycmF5W1JFRkNP VU5UX0FSUkFZX0VOVFJJRVNdOworCisvKiBPdmVyZmxvdyBoYXNoIHRhYmxlIGZvciB3aGVuIGFy cmF5IGlzIGZ1bGwgKi8KK3N0YXRpYyBIVEFCICpQcml2YXRlUmVmQ291bnRIYXNoID0gTlVMTDsK KworLyogQ291bnQgb2YgZW50cmllcyB0aGF0IGhhdmUgb3ZlcmZsb3dlZCBpbnRvIHRoZSBoYXNo IHRhYmxlICovCitzdGF0aWMgaW50MzIgUHJpdmF0ZVJlZkNvdW50T3ZlcmZsb3dlZCA9IDA7CisK Ky8qIENsb2NrIGhhbmQgZm9yIHNlbGVjdGluZyB2aWN0aW0gd2hlbiBhcnJheSBpcyBmdWxsICov CitzdGF0aWMgdWludDMyIFByaXZhdGVSZWZDb3VudENsb2NrID0gMDsKKworLyogUmVzZXJ2ZWQg c2xvdCBpbmRleCwgb3IgLTEgaWYgbm9uZSByZXNlcnZlZCAqLworc3RhdGljIGludAlSZXNlcnZl ZFJlZkNvdW50U2xvdCA9IC0xOworCisvKiBDYWNoZSBmb3IgbGFzdCBhY2Nlc3NlZCBlbnRyeSAq Lworc3RhdGljIGludAlQcml2YXRlUmVmQ291bnRFbnRyeUxhc3QgPSAtMTsKKworLyogQWR2aXNv cnkgbGltaXQgb24gdGhlIG51bWJlciBvZiBwaW5zIGVhY2ggYmFja2VuZCBzaG91bGQgaG9sZCAq Lworc3RhdGljIHVpbnQzMiBNYXhQcm9wb3J0aW9uYWxQaW5zID0gMDsKKworLyogRm9yd2FyZCBk ZWNsYXJhdGlvbnMgKi8KK3N0YXRpYyB2b2lkIFJlc2VydmVQcml2YXRlUmVmQ291bnRFbnRyeSh2 b2lkKTsKK3N0YXRpYyBQcml2YXRlUmVmQ291bnRFbnRyeSAqTmV3UHJpdmF0ZVJlZkNvdW50RW50 cnkoQnVmZmVyIGJ1ZmZlcik7CitzdGF0aWMgcGdfbm9pbmxpbmUgUHJpdmF0ZVJlZkNvdW50RW50 cnkgKkdldFByaXZhdGVSZWZDb3VudEVudHJ5U2xvdyhCdWZmZXIgYnVmZmVyLCBib29sIGRvX21v dmUpOworCisvKgorICogSW5pdGlhbGl6ZSBwcml2YXRlIHJlZmNvdW50IHRyYWNraW5nIGZvciB0 aGlzIGJhY2tlbmQuCisgKi8KK3ZvaWQKK0luaXRQcml2YXRlUmVmQ291bnQodm9pZCkKK3sKKwlI QVNIQ1RMCQloYXNoX2N0bDsKKworCisJLyoKKwkgKiBBbiBhZHZpc29yeSBsaW1pdCBvbiB0aGUg bnVtYmVyIG9mIHBpbnMgZWFjaCBiYWNrZW5kIHNob3VsZCBob2xkLCBiYXNlZAorCSAqIG9uIHNo YXJlZF9idWZmZXJzIGFuZCB0aGUgbWF4aW11bSBudW1iZXIgb2YgY29ubmVjdGlvbnMgcG9zc2li bGUuCisJICogVGhhdCdzIHZlcnkgcGVzc2ltaXN0aWMsIGJ1dCBvdXRzaWRlIHRveS1zaXplZCBz aGFyZWRfYnVmZmVycyBpdCBzaG91bGQKKwkgKiBhbGxvdyBwbGVudHkgb2YgcGlucy4gIExpbWl0 QWRkaXRpb25hbFBpbnMoKSBhbmQKKwkgKiBHZXRBZGRpdGlvbmFsUGluTGltaXQoKSBjYW4gYmUg dXNlZCB0byBjaGVjayB0aGUgcmVtYWluaW5nIGJhbGFuY2UuCisJICovCisJIE1heFByb3BvcnRp b25hbFBpbnMgPSBOQnVmZmVycyAvIChNYXhCYWNrZW5kcyArIE5VTV9BVVhJTElBUllfUFJPQ1Mp OworCisJbWVtc2V0KCZQcml2YXRlUmVmQ291bnRBcnJheSwgMCwgc2l6ZW9mKFByaXZhdGVSZWZD b3VudEFycmF5KSk7CisJbWVtc2V0KCZQcml2YXRlUmVmQ291bnRBcnJheUtleXMsIDAsIHNpemVv ZihQcml2YXRlUmVmQ291bnRBcnJheUtleXMpKTsKKworCWhhc2hfY3RsLmtleXNpemUgPSBzaXpl b2YoQnVmZmVyKTsKKwloYXNoX2N0bC5lbnRyeXNpemUgPSBzaXplb2YoUHJpdmF0ZVJlZkNvdW50 RW50cnkpOworCisJUHJpdmF0ZVJlZkNvdW50SGFzaCA9IGhhc2hfY3JlYXRlKCJQcml2YXRlUmVm Q291bnQiLCAxMDAsICZoYXNoX2N0bCwKKwkJCQkJCQkJCSAgSEFTSF9FTEVNIHwgSEFTSF9CTE9C Uyk7Cit9CisKKy8qCisgKiBFbnN1cmUgdGhhdCB0aGUgUHJpdmF0ZVJlZkNvdW50QXJyYXkgaGFz IHN1ZmZpY2llbnQgc3BhY2UgdG8gc3RvcmUgb25lIG1vcmUKKyAqIGVudHJ5LgorICovCitzdGF0 aWMgdm9pZAorUmVzZXJ2ZVByaXZhdGVSZWZDb3VudEVudHJ5KHZvaWQpCit7CisJLyogQWxyZWFk eSByZXNlcnZlZCAob3IgZnJlZWQpLCBub3RoaW5nIHRvIGRvICovCisJaWYgKFJlc2VydmVkUmVm Q291bnRTbG90ICE9IC0xKQorCQlyZXR1cm47CisKKwkvKgorCSAqIEZpcnN0IHNlYXJjaCBmb3Ig YSBmcmVlIGVudHJ5IHRoZSBhcnJheSwgdGhhdCdsbCBiZSBzdWZmaWNpZW50IGluIHRoZQorCSAq IG1ham9yaXR5IG9mIGNhc2VzLgorCSAqLworCXsKKwkJaW50CQkJaTsKKworCQlmb3IgKGkgPSAw OyBpIDwgUkVGQ09VTlRfQVJSQVlfRU5UUklFUzsgaSsrKQorCQl7CisJCQlpZiAoUHJpdmF0ZVJl ZkNvdW50QXJyYXlLZXlzW2ldID09IEludmFsaWRCdWZmZXIpCisJCQl7CisJCQkJUmVzZXJ2ZWRS ZWZDb3VudFNsb3QgPSBpOworCQkJfQorCQl9CisKKwkJaWYgKFJlc2VydmVkUmVmQ291bnRTbG90 ICE9IC0xKQorCQkJcmV0dXJuOworCX0KKworCS8qCisJICogTm8gbHVjay4gQWxsIGFycmF5IGVu dHJpZXMgYXJlIGZ1bGwuIE1vdmUgb25lIGFycmF5IGVudHJ5IGludG8gdGhlIGhhc2gKKwkgKiB0 YWJsZS4KKwkgKi8KKwl7CisJCWludAkJCXZpY3RpbV9zbG90OworCQlQcml2YXRlUmVmQ291bnRF bnRyeSAqdmljdGltX2VudHJ5OworCQlQcml2YXRlUmVmQ291bnRFbnRyeSAqaGFzaGVudDsKKwkJ Ym9vbAkJZm91bmQ7CisKKwkJLyogc2VsZWN0IHZpY3RpbSBzbG90ICovCisJCXZpY3RpbV9zbG90 ID0gUHJpdmF0ZVJlZkNvdW50Q2xvY2srKyAlIFJFRkNPVU5UX0FSUkFZX0VOVFJJRVM7CisJCXZp Y3RpbV9lbnRyeSA9ICZQcml2YXRlUmVmQ291bnRBcnJheVt2aWN0aW1fc2xvdF07CisJCVJlc2Vy dmVkUmVmQ291bnRTbG90ID0gdmljdGltX3Nsb3Q7CisKKwkJLyogQmV0dGVyIGJlIHVzZWQsIG90 aGVyd2lzZSB3ZSBzaG91bGRuJ3QgZ2V0IGhlcmUuICovCisJCUFzc2VydChQcml2YXRlUmVmQ291 bnRBcnJheUtleXNbdmljdGltX3Nsb3RdICE9IEludmFsaWRCdWZmZXIpOworCQlBc3NlcnQoUHJp dmF0ZVJlZkNvdW50QXJyYXlbdmljdGltX3Nsb3RdLmJ1ZmZlciAhPSBJbnZhbGlkQnVmZmVyKTsK KwkJQXNzZXJ0KFByaXZhdGVSZWZDb3VudEFycmF5S2V5c1t2aWN0aW1fc2xvdF0gPT0gUHJpdmF0 ZVJlZkNvdW50QXJyYXlbdmljdGltX3Nsb3RdLmJ1ZmZlcik7CisKKwkJLyogZW50ZXIgdmljdGlt IGFycmF5IGVudHJ5IGludG8gaGFzaHRhYmxlICovCisJCWhhc2hlbnQgPSBoYXNoX3NlYXJjaChQ cml2YXRlUmVmQ291bnRIYXNoLAorCQkJCQkJCSAgJlByaXZhdGVSZWZDb3VudEFycmF5S2V5c1t2 aWN0aW1fc2xvdF0sCisJCQkJCQkJICBIQVNIX0VOVEVSLAorCQkJCQkJCSAgJmZvdW5kKTsKKwkJ QXNzZXJ0KCFmb3VuZCk7CisJCWhhc2hlbnQtPmRhdGEgPSB2aWN0aW1fZW50cnktPmRhdGE7CisK KwkJLyogY2xlYXIgdGhlIG5vdyBmcmVlIGFycmF5IHNsb3QgKi8KKwkJUHJpdmF0ZVJlZkNvdW50 QXJyYXlLZXlzW3ZpY3RpbV9zbG90XSA9IEludmFsaWRCdWZmZXI7CisJCXZpY3RpbV9lbnRyeS0+ YnVmZmVyID0gSW52YWxpZEJ1ZmZlcjsKKworCQltZW1zZXQoJnZpY3RpbV9lbnRyeS0+ZGF0YSwg MCwgc2l6ZW9mKHZpY3RpbV9lbnRyeS0+ZGF0YSkpOworCQl2aWN0aW1fZW50cnktPmRhdGEucmVm Y291bnQgPSAwOworCQl2aWN0aW1fZW50cnktPmRhdGEubG9ja21vZGUgPSBCVUZGRVJfTE9DS19V TkxPQ0s7CisKKwkJUHJpdmF0ZVJlZkNvdW50T3ZlcmZsb3dlZCsrOworCX0KK30KKworLyoKKyAq IENyZWF0ZSBhIG5ldyByZWZjb3VudCBlbnRyeSBmb3IgdGhlIGdpdmVuIGJ1ZmZlci4KKyAqLwor c3RhdGljIFByaXZhdGVSZWZDb3VudEVudHJ5ICoKK05ld1ByaXZhdGVSZWZDb3VudEVudHJ5KEJ1 ZmZlciBidWZmZXIpCit7CisJUHJpdmF0ZVJlZkNvdW50RW50cnkgKnJlczsKKworCS8qIG9ubHkg YWxsb3dlZCB0byBiZSBjYWxsZWQgd2hlbiBhIHJlc2VydmF0aW9uIGhhcyBiZWVuIG1hZGUgKi8K KwlBc3NlcnQoUmVzZXJ2ZWRSZWZDb3VudFNsb3QgIT0gLTEpOworCisJLyogdXNlIHVwIHRoZSBy ZXNlcnZlZCBlbnRyeSAqLworCXJlcyA9ICZQcml2YXRlUmVmQ291bnRBcnJheVtSZXNlcnZlZFJl ZkNvdW50U2xvdF07CisKKwkvKiBhbmQgZmlsbCBpdCAqLworCVByaXZhdGVSZWZDb3VudEFycmF5 S2V5c1tSZXNlcnZlZFJlZkNvdW50U2xvdF0gPSBidWZmZXI7CisJcmVzLT5idWZmZXIgPSBidWZm ZXI7CisJcmVzLT5kYXRhLnJlZmNvdW50ID0gMDsKKwlyZXMtPmRhdGEubG9ja21vZGUgPSBCVUZG RVJfTE9DS19VTkxPQ0s7CisKKwkvKiB1cGRhdGUgY2FjaGUgZm9yIHRoZSBuZXh0IGxvb2t1cCAq LworCVByaXZhdGVSZWZDb3VudEVudHJ5TGFzdCA9IFJlc2VydmVkUmVmQ291bnRTbG90OworCisJ UmVzZXJ2ZWRSZWZDb3VudFNsb3QgPSAtMTsKKworCXJldHVybiByZXM7Cit9CisKKy8qCisgKiBT bG93LXBhdGggZm9yIEdldFNoYXJlZEJ1ZmZlckVudHJ5KCkuCisgKi8KK3N0YXRpYyBwZ19ub2lu bGluZSBQcml2YXRlUmVmQ291bnRFbnRyeSAqCitHZXRQcml2YXRlUmVmQ291bnRFbnRyeVNsb3co QnVmZmVyIGJ1ZmZlciwgYm9vbCBkb19tb3ZlKQoreworCVByaXZhdGVSZWZDb3VudEVudHJ5ICpy ZXM7CisJaW50CQkJbWF0Y2ggPSAtMTsKKwlpbnQJCQlpOworCisJLyoKKwkgKiBGaXJzdCBzZWFy Y2ggZm9yIHJlZmVyZW5jZXMgaW4gdGhlIGFycmF5LgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBS RUZDT1VOVF9BUlJBWV9FTlRSSUVTOyBpKyspCisJeworCQlpZiAoUHJpdmF0ZVJlZkNvdW50QXJy YXlLZXlzW2ldID09IGJ1ZmZlcikKKwkJeworCQkJbWF0Y2ggPSBpOworCQl9CisJfQorCisJaWYg KGxpa2VseShtYXRjaCAhPSAtMSkpCisJeworCQlQcml2YXRlUmVmQ291bnRFbnRyeUxhc3QgPSBt YXRjaDsKKwkJcmV0dXJuICZQcml2YXRlUmVmQ291bnRBcnJheVttYXRjaF07CisJfQorCisJLyoK KwkgKiBPbmx5IGxvb2sgdXAgdGhlIGJ1ZmZlciBpbiB0aGUgaGFzaHRhYmxlIGlmIHdlJ3ZlIHBy ZXZpb3VzbHkgb3ZlcmZsb3dlZC4KKwkgKi8KKwlpZiAoUHJpdmF0ZVJlZkNvdW50T3ZlcmZsb3dl ZCA9PSAwKQorCQlyZXR1cm4gTlVMTDsKKworCXJlcyA9IGhhc2hfc2VhcmNoKFByaXZhdGVSZWZD b3VudEhhc2gsICZidWZmZXIsIEhBU0hfRklORCwgTlVMTCk7CisKKwlpZiAocmVzID09IE5VTEwp CisJCXJldHVybiBOVUxMOworCWVsc2UgaWYgKCFkb19tb3ZlKQorCXsKKwkJcmV0dXJuIHJlczsK Kwl9CisJZWxzZQorCXsKKwkJLyogbW92ZSBidWZmZXIgZnJvbSBoYXNodGFibGUgaW50byB0aGUg ZnJlZSBhcnJheSBzbG90ICovCisJCWJvb2wJCWZvdW5kOworCQlQcml2YXRlUmVmQ291bnRFbnRy eSAqZnJlZTsKKworCQlSZXNlcnZlUHJpdmF0ZVJlZkNvdW50RW50cnkoKTsKKworCQlBc3NlcnQo UmVzZXJ2ZWRSZWZDb3VudFNsb3QgIT0gLTEpOworCQlmcmVlID0gJlByaXZhdGVSZWZDb3VudEFy cmF5W1Jlc2VydmVkUmVmQ291bnRTbG90XTsKKwkJQXNzZXJ0KGZyZWUtPmJ1ZmZlciA9PSBJbnZh bGlkQnVmZmVyKTsKKworCQlmcmVlLT5idWZmZXIgPSBidWZmZXI7CisJCWZyZWUtPmRhdGEgPSBy ZXMtPmRhdGE7CisJCVByaXZhdGVSZWZDb3VudEFycmF5S2V5c1tSZXNlcnZlZFJlZkNvdW50U2xv dF0gPSBidWZmZXI7CisJCVByaXZhdGVSZWZDb3VudEVudHJ5TGFzdCA9IFJlc2VydmVkUmVmQ291 bnRTbG90OworCisJCVJlc2VydmVkUmVmQ291bnRTbG90ID0gLTE7CisKKwkJaGFzaF9zZWFyY2go UHJpdmF0ZVJlZkNvdW50SGFzaCwgJmJ1ZmZlciwgSEFTSF9SRU1PVkUsICZmb3VuZCk7CisJCUFz c2VydChmb3VuZCk7CisJCUFzc2VydChQcml2YXRlUmVmQ291bnRPdmVyZmxvd2VkID4gMCk7CisJ CVByaXZhdGVSZWZDb3VudE92ZXJmbG93ZWQtLTsKKworCQlyZXR1cm4gZnJlZTsKKwl9Cit9CisK Ky8qCisgKiBSZXR1cm4gdGhlIFByaXZhdGVSZWZDb3VudEVudHJ5IGZvciB0aGUgcGFzc2VkIGJ1 ZmZlci4KKyAqIFJldHVybnMgTlVMTCBpZiB0aGUgYnVmZmVyIGlzIG5vdCBjdXJyZW50bHkgcGlu bmVkLgorICovCitQcml2YXRlUmVmQ291bnRFbnRyeSAqCitHZXRTaGFyZWRCdWZmZXJFbnRyeShC dWZmZXIgYnVmZmVyKQoreworCUFzc2VydChCdWZmZXJJc1ZhbGlkKGJ1ZmZlcikpOworCUFzc2Vy dCghQnVmZmVySXNMb2NhbChidWZmZXIpKTsKKworCS8qIEZhc3QgcGF0aDogY2hlY2sgb25lLWVu dHJ5IGNhY2hlICovCisJaWYgKGxpa2VseShQcml2YXRlUmVmQ291bnRFbnRyeUxhc3QgIT0gLTEp ICYmCisJCWxpa2VseShQcml2YXRlUmVmQ291bnRBcnJheVtQcml2YXRlUmVmQ291bnRFbnRyeUxh c3RdLmJ1ZmZlciA9PSBidWZmZXIpKQorCXsKKwkJcmV0dXJuICZQcml2YXRlUmVmQ291bnRBcnJh eVtQcml2YXRlUmVmQ291bnRFbnRyeUxhc3RdOworCX0KKworCXJldHVybiBHZXRQcml2YXRlUmVm Q291bnRFbnRyeVNsb3coYnVmZmVyLCBmYWxzZSk7Cit9CisKKy8qCisgKiBJbmNyZW1lbnQgdGhl IHByaXZhdGUgcmVmY291bnQgZm9yIGEgc2hhcmVkIGJ1ZmZlci4KKyAqIENyZWF0ZXMgYSBuZXcg ZW50cnkgaWYgb25lIGRvZXNuJ3QgZXhpc3QuCisgKiBSZXR1cm5zIHRoZSBlbnRyeSBwb2ludGVy LgorICovCitQcml2YXRlUmVmQ291bnRFbnRyeSAqCitTaGFyZWRCdWZmZXJSZWYoQnVmZmVyIGJ1 ZmZlcikKK3sKKwlQcml2YXRlUmVmQ291bnRFbnRyeSAqcmVmOworCisJQXNzZXJ0KEJ1ZmZlcklz VmFsaWQoYnVmZmVyKSk7CisJQXNzZXJ0KCFCdWZmZXJJc0xvY2FsKGJ1ZmZlcikpOworCisJLyog Q2hlY2sgY2FjaGUgZmlyc3QsIHRoZW4gc2xvdyBwYXRoICovCisJaWYgKGxpa2VseShQcml2YXRl UmVmQ291bnRFbnRyeUxhc3QgIT0gLTEpICYmCisJCWxpa2VseShQcml2YXRlUmVmQ291bnRBcnJh eVtQcml2YXRlUmVmQ291bnRFbnRyeUxhc3RdLmJ1ZmZlciA9PSBidWZmZXIpKQorCXsKKwkJcmVm ID0gJlByaXZhdGVSZWZDb3VudEFycmF5W1ByaXZhdGVSZWZDb3VudEVudHJ5TGFzdF07CisJfQor CWVsc2UKKwl7CisJCXJlZiA9IEdldFByaXZhdGVSZWZDb3VudEVudHJ5U2xvdyhidWZmZXIsIHRy dWUpOworCX0KKworCWlmIChyZWYgPT0gTlVMTCkKKwl7CisJCS8qIE5ldyBwaW4gLSBjcmVhdGUg ZW50cnkgKi8KKwkJUmVzZXJ2ZVByaXZhdGVSZWZDb3VudEVudHJ5KCk7CisJCXJlZiA9IE5ld1By aXZhdGVSZWZDb3VudEVudHJ5KGJ1ZmZlcik7CisJfQorCisJcmVmLT5kYXRhLnJlZmNvdW50Kys7 CisKKwlyZXR1cm4gcmVmOworfQorCisvKgorICogSW5jcmVtZW50IHRoZSBwcml2YXRlIHJlZmNv dW50IGZvciBhbiBleGlzdGluZyBlbnRyeS4KKyAqIFVzZSB3aGVuIHlvdSBhbHJlYWR5IGhhdmUg dGhlIGVudHJ5IGZyb20gYSBwcmV2aW91cyBsb29rdXAuCisgKi8KK3ZvaWQKK1NoYXJlZEJ1ZmZl clJlZkV4aXN0aW5nKFByaXZhdGVSZWZDb3VudEVudHJ5ICpyZWYpCit7CisJQXNzZXJ0KHJlZiAh PSBOVUxMKTsKKwlBc3NlcnQocmVmLT5kYXRhLnJlZmNvdW50ID4gMCk7CisJcmVmLT5kYXRhLnJl ZmNvdW50Kys7Cit9CisKKy8qCisgKiBEZWNyZW1lbnQgdGhlIHByaXZhdGUgcmVmY291bnQgZm9y IGEgYnVmZmVyLgorICogSWYgdGhlIHJlZmNvdW50IHJlYWNoZXMgemVybywgcmVtb3ZlcyB0aGUg ZW50cnkgYW5kIHJldHVybnMgdHJ1ZS4KKyAqIFJldHVybnMgZmFsc2UgaWYgdGhlIGJ1ZmZlciBz dGlsbCBoYXMgcmVmZXJlbmNlcy4KKyAqLworYm9vbAorU2hhcmVkQnVmZmVyVW5yZWYoUHJpdmF0 ZVJlZkNvdW50RW50cnkgKnJlZikKK3sKKwlBc3NlcnQocmVmICE9IE5VTEwpOworCUFzc2VydChy ZWYtPmRhdGEucmVmY291bnQgPiAwKTsKKworCXJlZi0+ZGF0YS5yZWZjb3VudC0tOworCisJaWYg KHJlZi0+ZGF0YS5yZWZjb3VudCA9PSAwKQorCXsKKwkJLyogTm8gbW9yZSByZWZlcmVuY2VzIC0g Y2xlYW4gdXAgdGhlIGVudHJ5ICovCisJCUFzc2VydChyZWYtPmRhdGEubG9ja21vZGUgPT0gQlVG RkVSX0xPQ0tfVU5MT0NLKTsKKworCQlpZiAocmVmID49ICZQcml2YXRlUmVmQ291bnRBcnJheVsw XSAmJgorCQkJcmVmIDwgJlByaXZhdGVSZWZDb3VudEFycmF5W1JFRkNPVU5UX0FSUkFZX0VOVFJJ RVNdKQorCQl7CisJCQlyZWYtPmJ1ZmZlciA9IEludmFsaWRCdWZmZXI7CisJCQlQcml2YXRlUmVm Q291bnRBcnJheUtleXNbcmVmIC0gUHJpdmF0ZVJlZkNvdW50QXJyYXldID0gSW52YWxpZEJ1ZmZl cjsKKwkJCVJlc2VydmVkUmVmQ291bnRTbG90ID0gcmVmIC0gUHJpdmF0ZVJlZkNvdW50QXJyYXk7 CisJCX0KKwkJZWxzZQorCQl7CisJCQlib29sCQlmb3VuZDsKKwkJCUJ1ZmZlcgkJYnVmZmVyID0g cmVmLT5idWZmZXI7CisKKwkJCWhhc2hfc2VhcmNoKFByaXZhdGVSZWZDb3VudEhhc2gsICZidWZm ZXIsIEhBU0hfUkVNT1ZFLCAmZm91bmQpOworCQkJQXNzZXJ0KGZvdW5kKTsKKwkJCUFzc2VydChQ cml2YXRlUmVmQ291bnRPdmVyZmxvd2VkID4gMCk7CisJCQlQcml2YXRlUmVmQ291bnRPdmVyZmxv d2VkLS07CisJCX0KKworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlyZXR1cm4gZmFsc2U7Cit9CisK Ky8qCisgKiBBY2Nlc3NvcnMgZm9yIHJlZmNvdW50IGVudHJ5IGZpZWxkcy4KKyAqLworaW50MzIK K1NoYXJlZEJ1ZmZlclJlZkNvdW50KFByaXZhdGVSZWZDb3VudEVudHJ5ICpyZWYpCit7CisJcmV0 dXJuIHJlZi0+ZGF0YS5yZWZjb3VudDsKK30KKworQnVmZmVyTG9ja01vZGUKK1NoYXJlZEJ1ZmZl ckdldExvY2tNb2RlKFByaXZhdGVSZWZDb3VudEVudHJ5ICpyZWYpCit7CisJcmV0dXJuIHJlZi0+ ZGF0YS5sb2NrbW9kZTsKK30KKwordm9pZAorU2hhcmVkQnVmZmVyU2V0TG9ja01vZGUoUHJpdmF0 ZVJlZkNvdW50RW50cnkgKnJlZiwgQnVmZmVyTG9ja01vZGUgbW9kZSkKK3sKKwlyZWYtPmRhdGEu bG9ja21vZGUgPSBtb2RlOworfQorCitCdWZmZXIKK1NoYXJlZEJ1ZmZlckdldEJ1ZmZlcihQcml2 YXRlUmVmQ291bnRFbnRyeSAqcmVmKQoreworCXJldHVybiByZWYtPmJ1ZmZlcjsKK30KKworLyoK KyAqIENoZWNrIGZvciBidWZmZXIgcmVmY291bnQgbGVha3MuCisgKi8KK3ZvaWQKK0NoZWNrUHJp dmF0ZVJlZkNvdW50TGVha3Modm9pZCkKK3sKKyNpZmRlZiBVU0VfQVNTRVJUX0NIRUNLSU5HCisJ aW50CQkJUmVmQ291bnRFcnJvcnMgPSAwOworCVByaXZhdGVSZWZDb3VudEVudHJ5ICpyZXM7CisJ aW50CQkJaTsKKwljaGFyCSAgICpzOworCisJLyogY2hlY2sgdGhlIGFycmF5ICovCisJZm9yIChp ID0gMDsgaSA8IFJFRkNPVU5UX0FSUkFZX0VOVFJJRVM7IGkrKykKKwl7CisJCWlmIChQcml2YXRl UmVmQ291bnRBcnJheUtleXNbaV0gIT0gSW52YWxpZEJ1ZmZlcikKKwkJeworCQkJcmVzID0gJlBy aXZhdGVSZWZDb3VudEFycmF5W2ldOworCisJCQlzID0gRGVidWdQcmludEJ1ZmZlclJlZmNvdW50 KHJlcy0+YnVmZmVyKTsKKwkJCWVsb2coV0FSTklORywgImJ1ZmZlciByZWZjb3VudCBsZWFrOiAl cyIsIHMpOworCQkJcGZyZWUocyk7CisKKwkJCVJlZkNvdW50RXJyb3JzKys7CisJCX0KKwl9CisK KwkvKiBpZiBuZWNlc3Nhcnkgc2VhcmNoIHRoZSBoYXNoICovCisJaWYgKFByaXZhdGVSZWZDb3Vu dE92ZXJmbG93ZWQpCisJeworCQlIQVNIX1NFUV9TVEFUVVMgaHN0YXQ7CisKKwkJaGFzaF9zZXFf aW5pdCgmaHN0YXQsIFByaXZhdGVSZWZDb3VudEhhc2gpOworCQl3aGlsZSAoKHJlcyA9IChQcml2 YXRlUmVmQ291bnRFbnRyeSAqKSBoYXNoX3NlcV9zZWFyY2goJmhzdGF0KSkgIT0gTlVMTCkKKwkJ eworCQkJcyA9IERlYnVnUHJpbnRCdWZmZXJSZWZjb3VudChyZXMtPmJ1ZmZlcik7CisJCQllbG9n KFdBUk5JTkcsICJidWZmZXIgcmVmY291bnQgbGVhazogJXMiLCBzKTsKKwkJCXBmcmVlKHMpOwor CQkJUmVmQ291bnRFcnJvcnMrKzsKKwkJfQorCX0KKworCUFzc2VydChSZWZDb3VudEVycm9ycyA9 PSAwKTsKKyNlbmRpZgorfQorCisvKgorICogSW5pdGlhbGl6ZSBhbiBpdGVyYXRvciBmb3Igd2Fs a2luZyBhbGwgcHJpdmF0ZSByZWZjb3VudCBlbnRyaWVzLgorICovCitQcml2YXRlUmVmQ291bnRJ dGVyYXRvciAqCitJbml0UHJpdmF0ZVJlZkNvdW50SXRlcmF0b3Iodm9pZCkKK3sKKwlQcml2YXRl UmVmQ291bnRJdGVyYXRvciAqaXRlciA9IHBhbGxvYyhzaXplb2YoUHJpdmF0ZVJlZkNvdW50SXRl cmF0b3IpKTsKKworCWl0ZXItPmFycmF5X2luZGV4ID0gMDsKKwlpdGVyLT5pbl9oYXNoID0gZmFs c2U7CisJaXRlci0+aGFzaF9zdGF0dXMgPSBOVUxMOworCXJldHVybiBpdGVyOworfQorCisvKgor ICogR2V0IHRoZSBuZXh0IHByaXZhdGUgcmVmY291bnQgZW50cnkuCisgKiBSZXR1cm5zIE5VTEwg d2hlbiBpdGVyYXRpb24gaXMgY29tcGxldGUuCisgKi8KK1ByaXZhdGVSZWZDb3VudEVudHJ5ICoK K0dldE5leHRQcml2YXRlUmVmQ291bnRFbnRyeShQcml2YXRlUmVmQ291bnRJdGVyYXRvciAqaXRl cikKK3sKKwkvKiBGaXJzdCBpdGVyYXRlIHRocm91Z2ggdGhlIGFycmF5ICovCisJd2hpbGUgKCFp dGVyLT5pbl9oYXNoICYmIGl0ZXItPmFycmF5X2luZGV4IDwgUkVGQ09VTlRfQVJSQVlfRU5UUklF UykKKwl7CisJCWludAkJCWlkeCA9IGl0ZXItPmFycmF5X2luZGV4Kys7CisKKwkJaWYgKFByaXZh dGVSZWZDb3VudEFycmF5S2V5c1tpZHhdICE9IEludmFsaWRCdWZmZXIpCisJCQlyZXR1cm4gJlBy aXZhdGVSZWZDb3VudEFycmF5W2lkeF07CisJfQorCisJLyogVGhlbiBpdGVyYXRlIHRocm91Z2gg dGhlIGhhc2ggaWYgdGhlcmUgYXJlIG92ZXJmbG93ZWQgZW50cmllcyAqLworCWlmICghaXRlci0+ aW5faGFzaCkKKwl7CisJCWl0ZXItPmluX2hhc2ggPSB0cnVlOworCQlpZiAoUHJpdmF0ZVJlZkNv dW50T3ZlcmZsb3dlZCA+IDApCisJCXsKKwkJCWl0ZXItPmhhc2hfc3RhdHVzID0gcGFsbG9jKHNp emVvZihIQVNIX1NFUV9TVEFUVVMpKTsKKwkJCWhhc2hfc2VxX2luaXQoaXRlci0+aGFzaF9zdGF0 dXMsIFByaXZhdGVSZWZDb3VudEhhc2gpOworCQl9CisJfQorCisJaWYgKGl0ZXItPmhhc2hfc3Rh dHVzICE9IE5VTEwpCisJeworCQlQcml2YXRlUmVmQ291bnRFbnRyeSAqcmVzOworCisJCXJlcyA9 IChQcml2YXRlUmVmQ291bnRFbnRyeSAqKSBoYXNoX3NlcV9zZWFyY2goaXRlci0+aGFzaF9zdGF0 dXMpOworCQlpZiAocmVzICE9IE5VTEwpCisJCQlyZXR1cm4gcmVzOworCisJCXBmcmVlKGl0ZXIt Pmhhc2hfc3RhdHVzKTsKKwkJaXRlci0+aGFzaF9zdGF0dXMgPSBOVUxMOworCX0KKworCXJldHVy biBOVUxMOworfQorCisvKgorICogRnJlZSBhbiBpdGVyYXRvciBmcm9tIEluaXRQcml2YXRlUmVm Q291bnRJdGVyYXRvci4KKyAqLwordm9pZAorRnJlZVByaXZhdGVSZWZDb3VudEl0ZXJhdG9yKFBy aXZhdGVSZWZDb3VudEl0ZXJhdG9yICppdGVyKQoreworCWlmIChpdGVyLT5oYXNoX3N0YXR1cyAh PSBOVUxMKQorCXsKKwkJaGFzaF9zZXFfdGVybShpdGVyLT5oYXNoX3N0YXR1cyk7CisJCXBmcmVl KGl0ZXItPmhhc2hfc3RhdHVzKTsKKwl9CisJcGZyZWUoaXRlcik7Cit9CisKKworLyoKKyAqIFJl dHVybiB0aGUgbWF4aW11bSBudW1iZXIgb2YgYnVmZmVycyB0aGF0IGEgYmFja2VuZCBzaG91bGQg dHJ5IHRvIHBpbiBvbmNlLAorICogdG8gYXZvaWQgZXhjZWVkaW5nIGl0cyBmYWlyIHNoYXJlLiAg VGhpcyBpcyB0aGUgaGlnaGVzdCB2YWx1ZSB0aGF0CisgKiBHZXRBZGRpdGlvbmFsUGluTGltaXQo KSBjb3VsZCBldmVyIHJldHVybi4gIE5vdGUgdGhhdCBpdCBtYXkgYmUgemVybyBvbiBhCisgKiBz eXN0ZW0gd2l0aCBhIHZlcnkgc21hbGwgYnVmZmVyIHBvb2wgcmVsYXRpdmUgdG8gbWF4X2Nvbm5l Y3Rpb25zLgorICovCisgdWludDMyCisgR2V0UGluTGltaXQodm9pZCkKKyB7CisJIHJldHVybiBN YXhQcm9wb3J0aW9uYWxQaW5zOworIH0KKworIC8qCisgICogUmV0dXJuIHRoZSBtYXhpbXVtIG51 bWJlciBvZiBhZGRpdGlvbmFsIGJ1ZmZlcnMgdGhhdCB0aGlzIGJhY2tlbmQgc2hvdWxkCisgICog cGluIGlmIGl0IHdhbnRzIHRvIHN0YXkgdW5kZXIgdGhlIHBlci1iYWNrZW5kIGxpbWl0LCBjb25z aWRlcmluZyB0aGUgbnVtYmVyCisgICogb2YgYnVmZmVycyBpdCBoYXMgYWxyZWFkeSBwaW5uZWQu ICBVbmxpa2UgTGltaXRBZGRpdGlvbmFsUGlucygpLCB0aGUgbGltaXQKKyAgKiByZXR1cm4gYnkg dGhpcyBmdW5jdGlvbiBjYW4gYmUgemVyby4KKyAgKi8KKyB1aW50MzIKKyBHZXRBZGRpdGlvbmFs UGluTGltaXQodm9pZCkKKyB7CisJIHVpbnQzMgkJZXN0aW1hdGVkX3BpbnNfaGVsZDsKKworCSAv KgorCSAgKiBXZSBnZXQgdGhlIG51bWJlciBvZiAib3ZlcmZsb3dlZCIgcGlucyBmb3IgZnJlZSwg YnV0IGRvbid0IGtub3cgdGhlCisJICAqIG51bWJlciBvZiBwaW5zIGluIFByaXZhdGVSZWZDb3Vu dEFycmF5LiAgVGhlIGNvc3Qgb2YgY2FsY3VsYXRpbmcgdGhhdAorCSAgKiBleGFjdGx5IGRvZXNu J3Qgc2VlbSB3b3J0aCBpdCwgc28ganVzdCBhc3N1bWUgdGhlIG1heC4KKwkgICovCisJIGVzdGlt YXRlZF9waW5zX2hlbGQgPSBQcml2YXRlUmVmQ291bnRPdmVyZmxvd2VkICsgUkVGQ09VTlRfQVJS QVlfRU5UUklFUzsKKworCSAvKiBJcyB0aGlzIGJhY2tlbmQgYWxyZWFkeSBob2xkaW5nIG1vcmUg dGhhbiBpdHMgZmFpciBzaGFyZT8gKi8KKwkgaWYgKGVzdGltYXRlZF9waW5zX2hlbGQgPiBNYXhQ cm9wb3J0aW9uYWxQaW5zKQorCQkgcmV0dXJuIDA7CisKKwkgcmV0dXJuIE1heFByb3BvcnRpb25h bFBpbnMgLSBlc3RpbWF0ZWRfcGluc19oZWxkOworIH0KKworIC8qCisgICogTGltaXQgdGhlIG51 bWJlciBvZiBwaW5zIGEgYmF0Y2ggb3BlcmF0aW9uIG1heSBhZGRpdGlvbmFsbHkgYWNxdWlyZSwg dG8KKyAgKiBhdm9pZCBydW5uaW5nIG91dCBvZiBwaW5uYWJsZSBidWZmZXJzLgorICAqCisgICog T25lIGFkZGl0aW9uYWwgcGluIGlzIGFsd2F5cyBhbGxvd2VkLCBvbiB0aGUgYXNzdW1wdGlvbiB0 aGF0IHRoZSBvcGVyYXRpb24KKyAgKiByZXF1aXJlcyBhdCBsZWFzdCBvbmUgdG8gbWFrZSBwcm9n cmVzcy4KKyAgKi8KKyB2b2lkCisgTGltaXRBZGRpdGlvbmFsUGlucyh1aW50MzIgKmFkZGl0aW9u YWxfcGlucykKKyB7CisJIHVpbnQzMgkJbGltaXQ7CisKKwkgaWYgKCphZGRpdGlvbmFsX3BpbnMg PD0gMSkKKwkJIHJldHVybjsKKworCSBsaW1pdCA9IEdldEFkZGl0aW9uYWxQaW5MaW1pdCgpOwor CSBsaW1pdCA9IE1heChsaW1pdCwgMSk7CisJIGlmIChsaW1pdCA8ICphZGRpdGlvbmFsX3BpbnMp CisJCSAqYWRkaXRpb25hbF9waW5zID0gbGltaXQ7CisgfQpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tl bmQvc3RvcmFnZS9idWZmZXIvYnVmbWdyLmMgYi9zcmMvYmFja2VuZC9zdG9yYWdlL2J1ZmZlci9i dWZtZ3IuYwppbmRleCA1ZjNkMDgzZTkzOC4uYWE5OWU5N2UyODYgMTAwNjQ0Ci0tLSBhL3NyYy9i YWNrZW5kL3N0b3JhZ2UvYnVmZmVyL2J1Zm1nci5jCisrKyBiL3NyYy9iYWNrZW5kL3N0b3JhZ2Uv YnVmZmVyL2J1Zm1nci5jCkBAIC01NCw2ICs1NCw3IEBACiAjaW5jbHVkZSAic3RvcmFnZS9haW8u aCIKICNpbmNsdWRlICJzdG9yYWdlL2J1Zl9pbnRlcm5hbHMuaCIKICNpbmNsdWRlICJzdG9yYWdl L2J1Zm1nci5oIgorI2luY2x1ZGUgInN0b3JhZ2UvYnVmX3JlZmNvdW50LmgiCiAjaW5jbHVkZSAi c3RvcmFnZS9mZC5oIgogI2luY2x1ZGUgInN0b3JhZ2UvaXBjLmgiCiAjaW5jbHVkZSAic3RvcmFn ZS9sbWdyLmgiCkBAIC05Myw0MyArOTQsNiBAQAogICovCiAjZGVmaW5lIEJVRl9EUk9QX0ZVTExf U0NBTl9USFJFU0hPTEQJCSh1aW50NjQpIChOQnVmZmVycyAvIDMyKQogCi0vKgotICogVGhpcyBp cyBzZXBhcmF0ZWQgb3V0IGZyb20gUHJpdmF0ZVJlZkNvdW50RW50cnkgdG8gYWxsb3cgZm9yIGNv cHlpbmcgYWxsCi0gKiB0aGUgZGF0YSBtZW1iZXJzIHZpYSBzdHJ1Y3QgYXNzaWdubWVudC4KLSAq LwotdHlwZWRlZiBzdHJ1Y3QgUHJpdmF0ZVJlZkNvdW50RGF0YQotewotCS8qCi0JICogSG93IG1h bnkgdGltZXMgaGFzIHRoZSBidWZmZXIgYmVlbiBwaW5uZWQgYnkgdGhpcyBiYWNrZW5kLgotCSAq LwotCWludDMyCQlyZWZjb3VudDsKLQotCS8qCi0JICogSXMgdGhlIGJ1ZmZlciBsb2NrZWQgYnkg dGhpcyBiYWNrZW5kPyBCVUZGRVJfTE9DS19VTkxPQ0sgaW5kaWNhdGVzIHRoYXQKLQkgKiB0aGUg YnVmZmVyIGlzIG5vdCBsb2NrZWQuCi0JICovCi0JQnVmZmVyTG9ja01vZGUgbG9ja21vZGU7Ci19 IFByaXZhdGVSZWZDb3VudERhdGE7Ci0KLXR5cGVkZWYgc3RydWN0IFByaXZhdGVSZWZDb3VudEVu dHJ5Ci17Ci0JLyoKLQkgKiBOb3RlIHRoYXQgdGhpcyBuZWVkcyB0byBiZSBzYW1lIGFzIHRoZSBl bnRyeSdzIGNvcnJlc3BvbmRpbmcKLQkgKiBQcml2YXRlUmVmQ291bnRBcnJheUtleXNbaV0sIGlm IHRoZSBlbnRyeSBpcyBzdG9yZWQgaW4gdGhlIGFycmF5LiBXZQotCSAqIHN0b3JlIGl0IGluIGJv dGggcGxhY2VzIGFzIHRoaXMgaXMgdXNlZCBmb3IgdGhlIGhhc2h0YWJsZSBrZXkgYW5kCi0JICog YmVjYXVzZSBpdCBpcyBtb3JlIGNvbnZlbmllbnQgKHBhc3NpbmcgYXJvdW5kIGEgUHJpdmF0ZVJl ZkNvdW50RW50cnkKLQkgKiBzdWZmaWNlcyB0byBpZGVudGlmeSB0aGUgYnVmZmVyKSBhbmQgZmFz dGVyIChjaGVja2luZyB0aGUga2V5cyBhcnJheSBpcwotCSAqIGZhc3RlciB3aGVuIGNoZWNraW5n IG1hbnkgZW50cmllcywgY2hlY2tpbmcgdGhlIGVudHJ5IGlzIGZhc3RlciBpZiBqdXN0Ci0JICog Y2hlY2tpbmcgYSBzaW5nbGUgZW50cnkpLgotCSAqLwotCUJ1ZmZlcgkJYnVmZmVyOwotCi0JUHJp dmF0ZVJlZkNvdW50RGF0YSBkYXRhOwotfSBQcml2YXRlUmVmQ291bnRFbnRyeTsKLQotLyogNjQg Ynl0ZXMsIGFib3V0IHRoZSBzaXplIG9mIGEgY2FjaGUgbGluZSBvbiBjb21tb24gc3lzdGVtcyAq LwotI2RlZmluZSBSRUZDT1VOVF9BUlJBWV9FTlRSSUVTIDgKLQogLyoKICAqIFN0YXR1cyBvZiBi dWZmZXJzIHRvIGNoZWNrcG9pbnQgZm9yIGEgcGFydGljdWxhciB0YWJsZXNwYWNlLCB1c2VkCiAg KiBpbnRlcm5hbGx5IGluIEJ1ZmZlclN5bmMuCkBAIC0yMTMsNTUgKzE3Nyw2IEBAIGludAkJCWJh Y2tlbmRfZmx1c2hfYWZ0ZXIgPSBERUZBVUxUX0JBQ0tFTkRfRkxVU0hfQUZURVI7CiAvKiBsb2Nh bCBzdGF0ZSBmb3IgTG9ja0J1ZmZlckZvckNsZWFudXAgKi8KIHN0YXRpYyBCdWZmZXJEZXNjICpQ aW5Db3VudFdhaXRCdWYgPSBOVUxMOwogCi0vKgotICogQmFja2VuZC1Qcml2YXRlIHJlZmNvdW50 IG1hbmFnZW1lbnQ6Ci0gKgotICogRWFjaCBidWZmZXIgYWxzbyBoYXMgYSBwcml2YXRlIHJlZmNv dW50IHRoYXQga2VlcHMgdHJhY2sgb2YgdGhlIG51bWJlciBvZgotICogdGltZXMgdGhlIGJ1ZmZl ciBpcyBwaW5uZWQgaW4gdGhlIGN1cnJlbnQgcHJvY2Vzcy4gIFRoaXMgaXMgc28gdGhhdCB0aGUK LSAqIHNoYXJlZCByZWZjb3VudCBuZWVkcyB0byBiZSBtb2RpZmllZCBvbmx5IG9uY2UgaWYgYSBi dWZmZXIgaXMgcGlubmVkIG1vcmUKLSAqIHRoYW4gb25jZSBieSBhbiBpbmRpdmlkdWFsIGJhY2tl bmQuICBJdCdzIGFsc28gdXNlZCB0byBjaGVjayB0aGF0IG5vCi0gKiBidWZmZXJzIGFyZSBzdGls bCBwaW5uZWQgYXQgdGhlIGVuZCBvZiB0cmFuc2FjdGlvbnMgYW5kIHdoZW4gZXhpdGluZy4gV2UK LSAqIGFsc28gdXNlIHRoaXMgbWVjaGFuaXNtIHRvIHRyYWNrIHdoZXRoZXIgdGhpcyBiYWNrZW5k IGhhcyBhIGJ1ZmZlciBsb2NrZWQsCi0gKiBhbmQsIGlmIHNvLCBpbiB3aGF0IG1vZGUuCi0gKgot ICoKLSAqIFRvIGF2b2lkIC0gYXMgd2UgdXNlZCB0byAtIHJlcXVpcmluZyBhbiBhcnJheSB3aXRo IE5CdWZmZXJzIGVudHJpZXMgdG8ga2VlcAotICogdHJhY2sgb2YgbG9jYWwgYnVmZmVycywgd2Ug dXNlIGEgc21hbGwgc2VxdWVudGlhbGx5IHNlYXJjaGVkIGFycmF5Ci0gKiAoUHJpdmF0ZVJlZkNv dW50QXJyYXlLZXlzLCB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIGRhdGEgc3RvcmVkIGluCi0gKiBQ cml2YXRlUmVmQ291bnRBcnJheSkgYW5kIGFuIG92ZXJmbG93IGhhc2ggdGFibGUgKFByaXZhdGVS ZWZDb3VudEhhc2gpIHRvCi0gKiBrZWVwIHRyYWNrIG9mIGJhY2tlbmQgbG9jYWwgcGlucy4KLSAq Ci0gKiBVbnRpbCBubyBtb3JlIHRoYW4gUkVGQ09VTlRfQVJSQVlfRU5UUklFUyBidWZmZXJzIGFy ZSBwaW5uZWQgYXQgb25jZSwgYWxsCi0gKiByZWZjb3VudHMgYXJlIGtlcHQgdHJhY2sgb2YgaW4g dGhlIGFycmF5OyBhZnRlciB0aGF0LCBuZXcgYXJyYXkgZW50cmllcwotICogZGlzcGxhY2Ugb2xk IG9uZXMgaW50byB0aGUgaGFzaCB0YWJsZS4gVGhhdCB3YXkgYSBmcmVxdWVudGx5IHVzZWQgZW50 cnkKLSAqIGNhbid0IGdldCAic3R1Y2siIGluIHRoZSBoYXNodGFibGUgd2hpbGUgaW5mcmVxdWVu dCBvbmVzIGNsb2cgdGhlIGFycmF5LgotICoKLSAqIE5vdGUgdGhhdCBpbiBtb3N0IHNjZW5hcmlv cyB0aGUgbnVtYmVyIG9mIHBpbm5lZCBidWZmZXJzIHdpbGwgbm90IGV4Y2VlZAotICogUkVGQ09V TlRfQVJSQVlfRU5UUklFUy4KLSAqCi0gKgotICogVG8gZW50ZXIgYSBidWZmZXIgaW50byB0aGUg cmVmY291bnQgdHJhY2tpbmcgbWVjaGFuaXNtIGZpcnN0IHJlc2VydmUgYSBmcmVlCi0gKiBlbnRy eSB1c2luZyBSZXNlcnZlUHJpdmF0ZVJlZkNvdW50RW50cnkoKSBhbmQgdGhlbiBsYXRlciwgaWYg bmVjZXNzYXJ5LAotICogZmlsbCBpdCB3aXRoIE5ld1ByaXZhdGVSZWZDb3VudEVudHJ5KCkuIFRo YXQgc3BsaXQgbGV0cyB1cyBhdm9pZCBkb2luZwotICogbWVtb3J5IGFsbG9jYXRpb25zIGluIE5l d1ByaXZhdGVSZWZDb3VudEVudHJ5KCkgd2hpY2ggY2FuIGJlIGltcG9ydGFudAotICogYmVjYXVz ZSBpbiBzb21lIHNjZW5hcmlvcyBpdCdzIGNhbGxlZCB3aXRoIGEgc3BpbmxvY2sgaGVsZC4uLgot ICovCi1zdGF0aWMgQnVmZmVyIFByaXZhdGVSZWZDb3VudEFycmF5S2V5c1tSRUZDT1VOVF9BUlJB WV9FTlRSSUVTXTsKLXN0YXRpYyBzdHJ1Y3QgUHJpdmF0ZVJlZkNvdW50RW50cnkgUHJpdmF0ZVJl ZkNvdW50QXJyYXlbUkVGQ09VTlRfQVJSQVlfRU5UUklFU107Ci1zdGF0aWMgSFRBQiAqUHJpdmF0 ZVJlZkNvdW50SGFzaCA9IE5VTEw7Ci1zdGF0aWMgaW50MzIgUHJpdmF0ZVJlZkNvdW50T3ZlcmZs b3dlZCA9IDA7Ci1zdGF0aWMgdWludDMyIFByaXZhdGVSZWZDb3VudENsb2NrID0gMDsKLXN0YXRp YyBpbnQJUmVzZXJ2ZWRSZWZDb3VudFNsb3QgPSAtMTsKLXN0YXRpYyBpbnQJUHJpdmF0ZVJlZkNv dW50RW50cnlMYXN0ID0gLTE7Ci0KLXN0YXRpYyB1aW50MzIgTWF4UHJvcG9ydGlvbmFsUGluczsK LQotc3RhdGljIHZvaWQgUmVzZXJ2ZVByaXZhdGVSZWZDb3VudEVudHJ5KHZvaWQpOwotc3RhdGlj IFByaXZhdGVSZWZDb3VudEVudHJ5ICpOZXdQcml2YXRlUmVmQ291bnRFbnRyeShCdWZmZXIgYnVm ZmVyKTsKLXN0YXRpYyBQcml2YXRlUmVmQ291bnRFbnRyeSAqR2V0UHJpdmF0ZVJlZkNvdW50RW50 cnkoQnVmZmVyIGJ1ZmZlciwgYm9vbCBkb19tb3ZlKTsKLXN0YXRpYyBpbmxpbmUgaW50MzIgR2V0 UHJpdmF0ZVJlZkNvdW50KEJ1ZmZlciBidWZmZXIpOwotc3RhdGljIHZvaWQgRm9yZ2V0UHJpdmF0 ZVJlZkNvdW50RW50cnkoUHJpdmF0ZVJlZkNvdW50RW50cnkgKnJlZik7Ci0KIC8qIFJlc291cmNl T3duZXIgY2FsbGJhY2tzIHRvIGhvbGQgaW4tcHJvZ3Jlc3MgSS9PcyBhbmQgYnVmZmVyIHBpbnMg Ki8KIHN0YXRpYyB2b2lkIFJlc093bmVyUmVsZWFzZUJ1ZmZlcklPKERhdHVtIHJlcyk7CiBzdGF0 aWMgY2hhciAqUmVzT3duZXJQcmludEJ1ZmZlcklPKERhdHVtIHJlcyk7CkBAIC0yODYsMzAxICsy MDEsNiBAQCBjb25zdCBSZXNvdXJjZU93bmVyRGVzYyBidWZmZXJfcmVzb3duZXJfZGVzYyA9CiAJ LkRlYnVnUHJpbnQgPSBSZXNPd25lclByaW50QnVmZmVyCiB9OwogCi0vKgotICogRW5zdXJlIHRo YXQgdGhlIFByaXZhdGVSZWZDb3VudEFycmF5IGhhcyBzdWZmaWNpZW50IHNwYWNlIHRvIHN0b3Jl IG9uZSBtb3JlCi0gKiBlbnRyeS4gVGhpcyBoYXMgdG8gYmUgY2FsbGVkIGJlZm9yZSB1c2luZyBO ZXdQcml2YXRlUmVmQ291bnRFbnRyeSgpIHRvIGZpbGwKLSAqIGEgbmV3IGVudHJ5IC0gYnV0IGl0 J3MgcGVyZmVjdGx5IGZpbmUgdG8gbm90IHVzZSBhIHJlc2VydmVkIGVudHJ5LgotICovCi1zdGF0 aWMgdm9pZAotUmVzZXJ2ZVByaXZhdGVSZWZDb3VudEVudHJ5KHZvaWQpCi17Ci0JLyogQWxyZWFk eSByZXNlcnZlZCAob3IgZnJlZWQpLCBub3RoaW5nIHRvIGRvICovCi0JaWYgKFJlc2VydmVkUmVm Q291bnRTbG90ICE9IC0xKQotCQlyZXR1cm47Ci0KLQkvKgotCSAqIEZpcnN0IHNlYXJjaCBmb3Ig YSBmcmVlIGVudHJ5IHRoZSBhcnJheSwgdGhhdCdsbCBiZSBzdWZmaWNpZW50IGluIHRoZQotCSAq IG1ham9yaXR5IG9mIGNhc2VzLgotCSAqLwotCXsKLQkJaW50CQkJaTsKLQotCQlmb3IgKGkgPSAw OyBpIDwgUkVGQ09VTlRfQVJSQVlfRU5UUklFUzsgaSsrKQotCQl7Ci0JCQlpZiAoUHJpdmF0ZVJl ZkNvdW50QXJyYXlLZXlzW2ldID09IEludmFsaWRCdWZmZXIpCi0JCQl7Ci0JCQkJUmVzZXJ2ZWRS ZWZDb3VudFNsb3QgPSBpOwotCi0JCQkJLyoKLQkJCQkgKiBXZSBjb3VsZCByZXR1cm4gaW1tZWRp YXRlbHksIGJ1dCBpdGVyYXRpbmcgdGlsbCB0aGUgZW5kIG9mCi0JCQkJICogdGhlIGFycmF5IGFs bG93cyBjb21waWxlci1hdXRvdmVjdG9yaXphdGlvbi4KLQkJCQkgKi8KLQkJCX0KLQkJfQotCi0J CWlmIChSZXNlcnZlZFJlZkNvdW50U2xvdCAhPSAtMSkKLQkJCXJldHVybjsKLQl9Ci0KLQkvKgot CSAqIE5vIGx1Y2suIEFsbCBhcnJheSBlbnRyaWVzIGFyZSBmdWxsLiBNb3ZlIG9uZSBhcnJheSBl bnRyeSBpbnRvIHRoZSBoYXNoCi0JICogdGFibGUuCi0JICovCi0JewotCQkvKgotCQkgKiBNb3Zl IGVudHJ5IGZyb20gdGhlIGN1cnJlbnQgY2xvY2sgcG9zaXRpb24gaW4gdGhlIGFycmF5IGludG8g dGhlCi0JCSAqIGhhc2h0YWJsZS4gVXNlIHRoYXQgc2xvdC4KLQkJICovCi0JCWludAkJCXZpY3Rp bV9zbG90OwotCQlQcml2YXRlUmVmQ291bnRFbnRyeSAqdmljdGltX2VudHJ5OwotCQlQcml2YXRl UmVmQ291bnRFbnRyeSAqaGFzaGVudDsKLQkJYm9vbAkJZm91bmQ7Ci0KLQkJLyogc2VsZWN0IHZp Y3RpbSBzbG90ICovCi0JCXZpY3RpbV9zbG90ID0gUHJpdmF0ZVJlZkNvdW50Q2xvY2srKyAlIFJF RkNPVU5UX0FSUkFZX0VOVFJJRVM7Ci0JCXZpY3RpbV9lbnRyeSA9ICZQcml2YXRlUmVmQ291bnRB cnJheVt2aWN0aW1fc2xvdF07Ci0JCVJlc2VydmVkUmVmQ291bnRTbG90ID0gdmljdGltX3Nsb3Q7 Ci0KLQkJLyogQmV0dGVyIGJlIHVzZWQsIG90aGVyd2lzZSB3ZSBzaG91bGRuJ3QgZ2V0IGhlcmUu ICovCi0JCUFzc2VydChQcml2YXRlUmVmQ291bnRBcnJheUtleXNbdmljdGltX3Nsb3RdICE9IElu dmFsaWRCdWZmZXIpOwotCQlBc3NlcnQoUHJpdmF0ZVJlZkNvdW50QXJyYXlbdmljdGltX3Nsb3Rd LmJ1ZmZlciAhPSBJbnZhbGlkQnVmZmVyKTsKLQkJQXNzZXJ0KFByaXZhdGVSZWZDb3VudEFycmF5 S2V5c1t2aWN0aW1fc2xvdF0gPT0gUHJpdmF0ZVJlZkNvdW50QXJyYXlbdmljdGltX3Nsb3RdLmJ1 ZmZlcik7Ci0KLQkJLyogZW50ZXIgdmljdGltIGFycmF5IGVudHJ5IGludG8gaGFzaHRhYmxlICov Ci0JCWhhc2hlbnQgPSBoYXNoX3NlYXJjaChQcml2YXRlUmVmQ291bnRIYXNoLAotCQkJCQkJCSAg JlByaXZhdGVSZWZDb3VudEFycmF5S2V5c1t2aWN0aW1fc2xvdF0sCi0JCQkJCQkJICBIQVNIX0VO VEVSLAotCQkJCQkJCSAgJmZvdW5kKTsKLQkJQXNzZXJ0KCFmb3VuZCk7Ci0JCS8qIG1vdmUgZGF0 YSBmcm9tIHRoZSBlbnRyeSBpbiB0aGUgYXJyYXkgdG8gdGhlIGhhc2ggZW50cnkgKi8KLQkJaGFz aGVudC0+ZGF0YSA9IHZpY3RpbV9lbnRyeS0+ZGF0YTsKLQotCQkvKiBjbGVhciB0aGUgbm93IGZy ZWUgYXJyYXkgc2xvdCAqLwotCQlQcml2YXRlUmVmQ291bnRBcnJheUtleXNbdmljdGltX3Nsb3Rd ID0gSW52YWxpZEJ1ZmZlcjsKLQkJdmljdGltX2VudHJ5LT5idWZmZXIgPSBJbnZhbGlkQnVmZmVy OwotCi0JCS8qIGNsZWFyIHRoZSB3aG9sZSBkYXRhIG1lbWJlciwganVzdCBmb3IgZnV0dXJlIHBy b29maW5nICovCi0JCW1lbXNldCgmdmljdGltX2VudHJ5LT5kYXRhLCAwLCBzaXplb2YodmljdGlt X2VudHJ5LT5kYXRhKSk7Ci0JCXZpY3RpbV9lbnRyeS0+ZGF0YS5yZWZjb3VudCA9IDA7Ci0JCXZp Y3RpbV9lbnRyeS0+ZGF0YS5sb2NrbW9kZSA9IEJVRkZFUl9MT0NLX1VOTE9DSzsKLQotCQlQcml2 YXRlUmVmQ291bnRPdmVyZmxvd2VkKys7Ci0JfQotfQotCi0vKgotICogRmlsbCBhIHByZXZpb3Vz bHkgcmVzZXJ2ZWQgcmVmY291bnQgZW50cnkuCi0gKi8KLXN0YXRpYyBQcml2YXRlUmVmQ291bnRF bnRyeSAqCi1OZXdQcml2YXRlUmVmQ291bnRFbnRyeShCdWZmZXIgYnVmZmVyKQotewotCVByaXZh dGVSZWZDb3VudEVudHJ5ICpyZXM7Ci0KLQkvKiBvbmx5IGFsbG93ZWQgdG8gYmUgY2FsbGVkIHdo ZW4gYSByZXNlcnZhdGlvbiBoYXMgYmVlbiBtYWRlICovCi0JQXNzZXJ0KFJlc2VydmVkUmVmQ291 bnRTbG90ICE9IC0xKTsKLQotCS8qIHVzZSB1cCB0aGUgcmVzZXJ2ZWQgZW50cnkgKi8KLQlyZXMg PSAmUHJpdmF0ZVJlZkNvdW50QXJyYXlbUmVzZXJ2ZWRSZWZDb3VudFNsb3RdOwotCi0JLyogYW5k IGZpbGwgaXQgKi8KLQlQcml2YXRlUmVmQ291bnRBcnJheUtleXNbUmVzZXJ2ZWRSZWZDb3VudFNs b3RdID0gYnVmZmVyOwotCXJlcy0+YnVmZmVyID0gYnVmZmVyOwotCXJlcy0+ZGF0YS5yZWZjb3Vu dCA9IDA7Ci0JcmVzLT5kYXRhLmxvY2ttb2RlID0gQlVGRkVSX0xPQ0tfVU5MT0NLOwotCi0JLyog dXBkYXRlIGNhY2hlIGZvciB0aGUgbmV4dCBsb29rdXAgKi8KLQlQcml2YXRlUmVmQ291bnRFbnRy eUxhc3QgPSBSZXNlcnZlZFJlZkNvdW50U2xvdDsKLQotCVJlc2VydmVkUmVmQ291bnRTbG90ID0g LTE7Ci0KLQlyZXR1cm4gcmVzOwotfQotCi0vKgotICogU2xvdy1wYXRoIGZvciBHZXRQcml2YXRl UmVmQ291bnRFbnRyeSgpLiBUaGlzIGlzIGJpZyBlbm91Z2ggdG8gbm90IGJlIHdvcnRoCi0gKiBp bmxpbmluZy4gVGhpcyBwYXJ0aWN1bGFybHkgc2VlbXMgdG8gYmUgdHJ1ZSBpZiB0aGUgY29tcGls ZXIgaXMgY2FwYWJsZSBvZgotICogYXV0by12ZWN0b3JpemluZyB0aGUgY29kZSwgYXMgdGhhdCBp bXBvc2VzIGFkZGl0aW9uYWwgc3RhY2stYWxpZ25tZW50Ci0gKiByZXF1aXJlbWVudHMgZXRjLgot ICovCi1zdGF0aWMgcGdfbm9pbmxpbmUgUHJpdmF0ZVJlZkNvdW50RW50cnkgKgotR2V0UHJpdmF0 ZVJlZkNvdW50RW50cnlTbG93KEJ1ZmZlciBidWZmZXIsIGJvb2wgZG9fbW92ZSkKLXsKLQlQcml2 YXRlUmVmQ291bnRFbnRyeSAqcmVzOwotCWludAkJCW1hdGNoID0gLTE7Ci0JaW50CQkJaTsKLQot CS8qCi0JICogRmlyc3Qgc2VhcmNoIGZvciByZWZlcmVuY2VzIGluIHRoZSBhcnJheSwgdGhhdCds bCBiZSBzdWZmaWNpZW50IGluIHRoZQotCSAqIG1ham9yaXR5IG9mIGNhc2VzLgotCSAqLwotCWZv ciAoaSA9IDA7IGkgPCBSRUZDT1VOVF9BUlJBWV9FTlRSSUVTOyBpKyspCi0JewotCQlpZiAoUHJp dmF0ZVJlZkNvdW50QXJyYXlLZXlzW2ldID09IGJ1ZmZlcikKLQkJewotCQkJbWF0Y2ggPSBpOwot CQkJLyogc2VlIFJlc2VydmVQcml2YXRlUmVmQ291bnRFbnRyeSgpIGZvciB3aHkgd2UgZG9uJ3Qg cmV0dXJuICovCi0JCX0KLQl9Ci0KLQlpZiAobGlrZWx5KG1hdGNoICE9IC0xKSkKLQl7Ci0JCS8q IHVwZGF0ZSBjYWNoZSBmb3IgdGhlIG5leHQgbG9va3VwICovCi0JCVByaXZhdGVSZWZDb3VudEVu dHJ5TGFzdCA9IG1hdGNoOwotCi0JCXJldHVybiAmUHJpdmF0ZVJlZkNvdW50QXJyYXlbbWF0Y2hd OwotCX0KLQotCS8qCi0JICogQnkgaGVyZSB3ZSBrbm93IHRoYXQgdGhlIGJ1ZmZlciwgaWYgYWxy ZWFkeSBwaW5uZWQsIGlzbid0IHJlc2lkaW5nIGluCi0JICogdGhlIGFycmF5LgotCSAqCi0JICog T25seSBsb29rIHVwIHRoZSBidWZmZXIgaW4gdGhlIGhhc2h0YWJsZSBpZiB3ZSd2ZSBwcmV2aW91 c2x5IG92ZXJmbG93ZWQKLQkgKiBpbnRvIGl0LgotCSAqLwotCWlmIChQcml2YXRlUmVmQ291bnRP dmVyZmxvd2VkID09IDApCi0JCXJldHVybiBOVUxMOwotCi0JcmVzID0gaGFzaF9zZWFyY2goUHJp dmF0ZVJlZkNvdW50SGFzaCwgJmJ1ZmZlciwgSEFTSF9GSU5ELCBOVUxMKTsKLQotCWlmIChyZXMg PT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JZWxzZSBpZiAoIWRvX21vdmUpCi0JewotCQkvKiBj YWxsZXIgZG9lc24ndCB3YW50IHVzIHRvIG1vdmUgdGhlIGhhc2ggZW50cnkgaW50byB0aGUgYXJy YXkgKi8KLQkJcmV0dXJuIHJlczsKLQl9Ci0JZWxzZQotCXsKLQkJLyogbW92ZSBidWZmZXIgZnJv bSBoYXNodGFibGUgaW50byB0aGUgZnJlZSBhcnJheSBzbG90ICovCi0JCWJvb2wJCWZvdW5kOwot CQlQcml2YXRlUmVmQ291bnRFbnRyeSAqZnJlZTsKLQotCQkvKiBFbnN1cmUgdGhlcmUncyBhIGZy ZWUgYXJyYXkgc2xvdCAqLwotCQlSZXNlcnZlUHJpdmF0ZVJlZkNvdW50RW50cnkoKTsKLQotCQkv KiBVc2UgdXAgdGhlIHJlc2VydmVkIHNsb3QgKi8KLQkJQXNzZXJ0KFJlc2VydmVkUmVmQ291bnRT bG90ICE9IC0xKTsKLQkJZnJlZSA9ICZQcml2YXRlUmVmQ291bnRBcnJheVtSZXNlcnZlZFJlZkNv dW50U2xvdF07Ci0JCUFzc2VydChQcml2YXRlUmVmQ291bnRBcnJheUtleXNbUmVzZXJ2ZWRSZWZD b3VudFNsb3RdID09IGZyZWUtPmJ1ZmZlcik7Ci0JCUFzc2VydChmcmVlLT5idWZmZXIgPT0gSW52 YWxpZEJ1ZmZlcik7Ci0KLQkJLyogYW5kIGZpbGwgaXQgKi8KLQkJZnJlZS0+YnVmZmVyID0gYnVm ZmVyOwotCQlmcmVlLT5kYXRhID0gcmVzLT5kYXRhOwotCQlQcml2YXRlUmVmQ291bnRBcnJheUtl eXNbUmVzZXJ2ZWRSZWZDb3VudFNsb3RdID0gYnVmZmVyOwotCQkvKiB1cGRhdGUgY2FjaGUgZm9y IHRoZSBuZXh0IGxvb2t1cCAqLwotCQlQcml2YXRlUmVmQ291bnRFbnRyeUxhc3QgPSBtYXRjaDsK LQotCQlSZXNlcnZlZFJlZkNvdW50U2xvdCA9IC0xOwotCi0KLQkJLyogZGVsZXRlIGZyb20gaGFz aHRhYmxlICovCi0JCWhhc2hfc2VhcmNoKFByaXZhdGVSZWZDb3VudEhhc2gsICZidWZmZXIsIEhB U0hfUkVNT1ZFLCAmZm91bmQpOwotCQlBc3NlcnQoZm91bmQpOwotCQlBc3NlcnQoUHJpdmF0ZVJl ZkNvdW50T3ZlcmZsb3dlZCA+IDApOwotCQlQcml2YXRlUmVmQ291bnRPdmVyZmxvd2VkLS07Ci0K LQkJcmV0dXJuIGZyZWU7Ci0JfQotfQotCi0vKgotICogUmV0dXJuIHRoZSBQcml2YXRlUmVmQ291 bnQgZW50cnkgZm9yIHRoZSBwYXNzZWQgYnVmZmVyLgotICoKLSAqIFJldHVybnMgTlVMTCBpZiBh IGJ1ZmZlciBkb2Vzbid0IGhhdmUgYSByZWZjb3VudCBlbnRyeS4gT3RoZXJ3aXNlLCBpZgotICog ZG9fbW92ZSBpcyB0cnVlLCBhbmQgdGhlIGVudHJ5IHJlc2lkZXMgaW4gdGhlIGhhc2h0YWJsZSB0 aGUgZW50cnkgaXMKLSAqIG9wdGltaXplZCBmb3IgZnJlcXVlbnQgYWNjZXNzIGJ5IG1vdmluZyBp dCB0byB0aGUgYXJyYXkuCi0gKi8KLXN0YXRpYyBpbmxpbmUgUHJpdmF0ZVJlZkNvdW50RW50cnkg KgotR2V0UHJpdmF0ZVJlZkNvdW50RW50cnkoQnVmZmVyIGJ1ZmZlciwgYm9vbCBkb19tb3ZlKQot ewotCUFzc2VydChCdWZmZXJJc1ZhbGlkKGJ1ZmZlcikpOwotCUFzc2VydCghQnVmZmVySXNMb2Nh bChidWZmZXIpKTsKLQotCS8qCi0JICogSXQncyB2ZXJ5IGNvbW1vbiB0byBsb29rIHVwIHRoZSBz YW1lIGJ1ZmZlciByZXBlYXRlZGx5LiBUbyBtYWtlIHRoYXQKLQkgKiBmYXN0LCB3ZSBoYXZlIGEg b25lLWVudHJ5IGNhY2hlLgotCSAqCi0JICogSW4gY29udHJhc3QgdG8gdGhlIGxvb3AgaW4gR2V0 UHJpdmF0ZVJlZkNvdW50RW50cnlTbG93KCksIGhlcmUgaXQKLQkgKiBmYXN0ZXIgdG8gY2hlY2sg UHJpdmF0ZVJlZkNvdW50QXJyYXlbXS5idWZmZXIsIGFzIGluIHRoZSBjYXNlIG9mIGEgaGl0Ci0J ICogZmV3ZXIgYWRkcmVzc2VzIGFyZSBjb21wdXRlZCBhbmQgZmV3ZXIgY2FjaGVsaW5lcyBhcmUg YWNjZXNzZWQuIFdoZXJlYXMKLQkgKiBpbiBHZXRQcml2YXRlUmVmQ291bnRFbnRyeVNsb3coKSdz IGNhc2UsIGNoZWNraW5nCi0JICogUHJpdmF0ZVJlZkNvdW50QXJyYXlLZXlzIHNhdmVzIGEgbG90 IG9mIG1lbW9yeSBhY2Nlc3Nlcy4KLQkgKi8KLQlpZiAobGlrZWx5KFByaXZhdGVSZWZDb3VudEVu dHJ5TGFzdCAhPSAtMSkgJiYKLQkJbGlrZWx5KFByaXZhdGVSZWZDb3VudEFycmF5W1ByaXZhdGVS ZWZDb3VudEVudHJ5TGFzdF0uYnVmZmVyID09IGJ1ZmZlcikpCi0JewotCQlyZXR1cm4gJlByaXZh dGVSZWZDb3VudEFycmF5W1ByaXZhdGVSZWZDb3VudEVudHJ5TGFzdF07Ci0JfQotCi0JLyoKLQkg KiBUaGUgY29kZSBmb3IgdGhlIGNhY2hlZCBsb29rdXAgaXMgc21hbGwgZW5vdWdoIHRvIGJlIHdv cnRoIGlubGluaW5nCi0JICogaW50byB0aGUgY2FsbGVyLiBJbiB0aGUgbWlzcyBjYXNlIGhvd2V2 ZXIsIHRoYXQgZW1waXJpY2FsbHkgZG9lc24ndAotCSAqIHNlZW0gd29ydGggaXQuCi0JICovCi0J cmV0dXJuIEdldFByaXZhdGVSZWZDb3VudEVudHJ5U2xvdyhidWZmZXIsIGRvX21vdmUpOwotfQot Ci0vKgotICogUmV0dXJucyBob3cgbWFueSB0aW1lcyB0aGUgcGFzc2VkIGJ1ZmZlciBpcyBwaW5u ZWQgYnkgdGhpcyBiYWNrZW5kLgotICoKLSAqIE9ubHkgd29ya3MgZm9yIHNoYXJlZCBtZW1vcnkg YnVmZmVycyEKLSAqLwotc3RhdGljIGlubGluZSBpbnQzMgotR2V0UHJpdmF0ZVJlZkNvdW50KEJ1 ZmZlciBidWZmZXIpCi17Ci0JUHJpdmF0ZVJlZkNvdW50RW50cnkgKnJlZjsKLQotCUFzc2VydChC dWZmZXJJc1ZhbGlkKGJ1ZmZlcikpOwotCUFzc2VydCghQnVmZmVySXNMb2NhbChidWZmZXIpKTsK LQotCS8qCi0JICogTm90IG1vdmluZyB0aGUgZW50cnkgLSB0aGF0J3Mgb2sgZm9yIHRoZSBjdXJy ZW50IHVzZXJzLCBidXQgd2UgbWlnaHQKLQkgKiB3YW50IHRvIGNoYW5nZSB0aGlzIG9uZSBkYXku Ci0JICovCi0JcmVmID0gR2V0UHJpdmF0ZVJlZkNvdW50RW50cnkoYnVmZmVyLCBmYWxzZSk7Ci0K LQlpZiAocmVmID09IE5VTEwpCi0JCXJldHVybiAwOwotCXJldHVybiByZWYtPmRhdGEucmVmY291 bnQ7Ci19Ci0KLS8qCi0gKiBSZWxlYXNlIHJlc291cmNlcyB1c2VkIHRvIHRyYWNrIHRoZSByZWZl cmVuY2UgY291bnQgb2YgYSBidWZmZXIgd2hpY2ggd2Ugbm8KLSAqIGxvbmdlciBoYXZlIHBpbm5l ZCBhbmQgZG9uJ3Qgd2FudCB0byBwaW4gYWdhaW4gaW1tZWRpYXRlbHkuCi0gKi8KLXN0YXRpYyB2 b2lkCi1Gb3JnZXRQcml2YXRlUmVmQ291bnRFbnRyeShQcml2YXRlUmVmQ291bnRFbnRyeSAqcmVm KQotewotCUFzc2VydChyZWYtPmRhdGEucmVmY291bnQgPT0gMCk7Ci0JQXNzZXJ0KHJlZi0+ZGF0 YS5sb2NrbW9kZSA9PSBCVUZGRVJfTE9DS19VTkxPQ0spOwotCi0JaWYgKHJlZiA+PSAmUHJpdmF0 ZVJlZkNvdW50QXJyYXlbMF0gJiYKLQkJcmVmIDwgJlByaXZhdGVSZWZDb3VudEFycmF5W1JFRkNP VU5UX0FSUkFZX0VOVFJJRVNdKQotCXsKLQkJcmVmLT5idWZmZXIgPSBJbnZhbGlkQnVmZmVyOwot CQlQcml2YXRlUmVmQ291bnRBcnJheUtleXNbcmVmIC0gUHJpdmF0ZVJlZkNvdW50QXJyYXldID0g SW52YWxpZEJ1ZmZlcjsKLQotCi0JCS8qCi0JCSAqIE1hcmsgdGhlIGp1c3QgdXNlZCBlbnRyeSBh cyByZXNlcnZlZCAtIGluIG1hbnkgc2NlbmFyaW9zIHRoYXQKLQkJICogYWxsb3dzIHVzIHRvIGF2 b2lkIGV2ZXIgaGF2aW5nIHRvIHNlYXJjaCB0aGUgYXJyYXkvaGFzaCBmb3IgZnJlZQotCQkgKiBl bnRyaWVzLgotCQkgKi8KLQkJUmVzZXJ2ZWRSZWZDb3VudFNsb3QgPSByZWYgLSBQcml2YXRlUmVm Q291bnRBcnJheTsKLQl9Ci0JZWxzZQotCXsKLQkJYm9vbAkJZm91bmQ7Ci0JCUJ1ZmZlcgkJYnVm ZmVyID0gcmVmLT5idWZmZXI7Ci0KLQkJaGFzaF9zZWFyY2goUHJpdmF0ZVJlZkNvdW50SGFzaCwg JmJ1ZmZlciwgSEFTSF9SRU1PVkUsICZmb3VuZCk7Ci0JCUFzc2VydChmb3VuZCk7Ci0JCUFzc2Vy dChQcml2YXRlUmVmQ291bnRPdmVyZmxvd2VkID4gMCk7Ci0JCVByaXZhdGVSZWZDb3VudE92ZXJm bG93ZWQtLTsKLQl9Ci19Ci0KIC8qCiAgKiBCdWZmZXJJc1Bpbm5lZAogICoJCVRydWUgaWZmIHRo ZSBidWZmZXIgaXMgcGlubmVkIChhbHNvIGNoZWNrcyBmb3IgdmFsaWQgYnVmZmVyIG51bWJlciku CkBAIC01OTYsNyArMjE2LDcgQEAgRm9yZ2V0UHJpdmF0ZVJlZkNvdW50RW50cnkoUHJpdmF0ZVJl ZkNvdW50RW50cnkgKnJlZikKIAkJQnVmZmVySXNMb2NhbChidWZudW0pID8gXAogCQkJKExvY2Fs UmVmQ291bnRbLShidWZudW0pIC0gMV0gPiAwKSBcCiAJCTogXAotCShHZXRQcml2YXRlUmVmQ291 bnQoYnVmbnVtKSA+IDApIFwKKwkoR2V0U2hhcmVkQnVmZmVyRW50cnkoYnVmbnVtKSAhPSBOVUxM KSBcCiApCiAKIApAQCAtNjUzLDcgKzI3Myw2IEBAIHN0YXRpYyB2b2lkIFJlbGF0aW9uQ29weVN0 b3JhZ2VVc2luZ0J1ZmZlcihSZWxGaWxlTG9jYXRvciBzcmNsb2NhdG9yLAogCQkJCQkJCQkJCSAg IFJlbEZpbGVMb2NhdG9yIGRzdGxvY2F0b3IsCiAJCQkJCQkJCQkJICAgRm9ya051bWJlciBmb3Jr TnVtLCBib29sIHBlcm1hbmVudCk7CiBzdGF0aWMgdm9pZCBBdFByb2NFeGl0X0J1ZmZlcnMoaW50 IGNvZGUsIERhdHVtIGFyZyk7Ci1zdGF0aWMgdm9pZCBDaGVja0ZvckJ1ZmZlckxlYWtzKHZvaWQp OwogI2lmZGVmIFVTRV9BU1NFUlRfQ0hFQ0tJTkcKIHN0YXRpYyB2b2lkIEFzc2VydE5vdENhdGFs b2dCdWZmZXJMb2NrKEJ1ZmZlciBidWZmZXIsIEJ1ZmZlckxvY2tNb2RlIG1vZGUpOwogI2VuZGlm CkBAIC04MTIsNyArNDMxLDYgQEAgUmVhZFJlY2VudEJ1ZmZlcihSZWxGaWxlTG9jYXRvciBybG9j YXRvciwgRm9ya051bWJlciBmb3JrTnVtLCBCbG9ja051bWJlciBibG9ja04KIAlBc3NlcnQoQnVm ZmVySXNWYWxpZChyZWNlbnRfYnVmZmVyKSk7CiAKIAlSZXNvdXJjZU93bmVyRW5sYXJnZShDdXJy ZW50UmVzb3VyY2VPd25lcik7Ci0JUmVzZXJ2ZVByaXZhdGVSZWZDb3VudEVudHJ5KCk7CiAJSW5p dEJ1ZmZlclRhZygmdGFnLCAmcmxvY2F0b3IsIGZvcmtOdW0sIGJsb2NrTnVtKTsKIAogCWlmIChC dWZmZXJJc0xvY2FsKHJlY2VudF9idWZmZXIpKQpAQCAtMjExNSw3ICsxNzMzLDYgQEAgQnVmZmVy QWxsb2MoU01nclJlbGF0aW9uIHNtZ3IsIGNoYXIgcmVscGVyc2lzdGVuY2UsIEZvcmtOdW1iZXIg Zm9ya051bSwKIAogCS8qIE1ha2Ugc3VyZSB3ZSB3aWxsIGhhdmUgcm9vbSB0byByZW1lbWJlciB0 aGUgYnVmZmVyIHBpbiAqLwogCVJlc291cmNlT3duZXJFbmxhcmdlKEN1cnJlbnRSZXNvdXJjZU93 bmVyKTsKLQlSZXNlcnZlUHJpdmF0ZVJlZkNvdW50RW50cnkoKTsKIAogCS8qIGNyZWF0ZSBhIHRh ZyBzbyB3ZSBjYW4gbG9va3VwIHRoZSBidWZmZXIgKi8KIAlJbml0QnVmZmVyVGFnKCZuZXdUYWcs ICZzbWdyLT5zbWdyX3Jsb2NhdG9yLmxvY2F0b3IsIGZvcmtOdW0sIGJsb2NrTnVtKTsKQEAgLTIz MjcsNyArMTk0NCw3IEBAIHJldHJ5OgogCQlVbmxvY2tCdWZIZHIoYnVmKTsKIAkJTFdMb2NrUmVs ZWFzZShvbGRQYXJ0aXRpb25Mb2NrKTsKIAkJLyogc2FmZXR5IGNoZWNrOiBzaG91bGQgZGVmaW5p dGVseSBub3QgYmUgb3VyICpvd24qIHBpbiAqLwotCQlpZiAoR2V0UHJpdmF0ZVJlZkNvdW50KEJ1 ZmZlckRlc2NyaXB0b3JHZXRCdWZmZXIoYnVmKSkgPiAwKQorCQlpZiAoR2V0U2hhcmVkQnVmZmVy RW50cnkoQnVmZmVyRGVzY3JpcHRvckdldEJ1ZmZlcihidWYpKSAhPSBOVUxMKQogCQkJZWxvZyhF UlJPUiwgImJ1ZmZlciBpcyBwaW5uZWQgaW4gSW52YWxpZGF0ZUJ1ZmZlciIpOwogCQlXYWl0SU8o YnVmKTsKIAkJZ290byByZXRyeTsKQEAgLTIzODAsNyArMTk5Nyw3IEBAIEludmFsaWRhdGVWaWN0 aW1CdWZmZXIoQnVmZmVyRGVzYyAqYnVmX2hkcikKIAlMV0xvY2sJICAgKnBhcnRpdGlvbl9sb2Nr OwogCUJ1ZmZlclRhZwl0YWc7CiAKLQlBc3NlcnQoR2V0UHJpdmF0ZVJlZkNvdW50KEJ1ZmZlckRl c2NyaXB0b3JHZXRCdWZmZXIoYnVmX2hkcikpID09IDEpOworCUFzc2VydChHZXRTaGFyZWRCdWZm ZXJFbnRyeShCdWZmZXJEZXNjcmlwdG9yR2V0QnVmZmVyKGJ1Zl9oZHIpKSAhPSBOVUxMKTsKIAog CS8qIGhhdmUgYnVmZmVyIHBpbm5lZCwgc28gaXQncyBzYWZlIHRvIHJlYWQgdGFnIHdpdGhvdXQg bG9jayAqLwogCXRhZyA9IGJ1Zl9oZHItPnRhZzsKQEAgLTI0NjEsNyArMjA3OCw2IEBAIEdldFZp Y3RpbUJ1ZmZlcihCdWZmZXJBY2Nlc3NTdHJhdGVneSBzdHJhdGVneSwgSU9Db250ZXh0IGlvX2Nv bnRleHQpCiAJICogRW5zdXJlLCBiZWZvcmUgd2UgcGluIGEgdmljdGltIGJ1ZmZlciwgdGhhdCB0 aGVyZSdzIGEgZnJlZSByZWZjb3VudAogCSAqIGVudHJ5IGFuZCByZXNvdXJjZSBvd25lciBzbG90 IGZvciB0aGUgcGluLgogCSAqLwotCVJlc2VydmVQcml2YXRlUmVmQ291bnRFbnRyeSgpOwogCVJl c291cmNlT3duZXJFbmxhcmdlKEN1cnJlbnRSZXNvdXJjZU93bmVyKTsKIAogCS8qIHdlIHJldHVy biBoZXJlIGlmIGEgcHJvc3BlY3RpdmUgdmljdGltIGJ1ZmZlciBnZXRzIHVzZWQgY29uY3VycmVu dGx5ICovCkBAIC0yNTk1LDY0ICsyMjExLDYgQEAgYWdhaW46CiAJcmV0dXJuIGJ1ZjsKIH0KIAot LyoKLSAqIFJldHVybiB0aGUgbWF4aW11bSBudW1iZXIgb2YgYnVmZmVycyB0aGF0IGEgYmFja2Vu ZCBzaG91bGQgdHJ5IHRvIHBpbiBvbmNlLAotICogdG8gYXZvaWQgZXhjZWVkaW5nIGl0cyBmYWly IHNoYXJlLiAgVGhpcyBpcyB0aGUgaGlnaGVzdCB2YWx1ZSB0aGF0Ci0gKiBHZXRBZGRpdGlvbmFs UGluTGltaXQoKSBjb3VsZCBldmVyIHJldHVybi4gIE5vdGUgdGhhdCBpdCBtYXkgYmUgemVybyBv biBhCi0gKiBzeXN0ZW0gd2l0aCBhIHZlcnkgc21hbGwgYnVmZmVyIHBvb2wgcmVsYXRpdmUgdG8g bWF4X2Nvbm5lY3Rpb25zLgotICovCi11aW50MzIKLUdldFBpbkxpbWl0KHZvaWQpCi17Ci0JcmV0 dXJuIE1heFByb3BvcnRpb25hbFBpbnM7Ci19Ci0KLS8qCi0gKiBSZXR1cm4gdGhlIG1heGltdW0g bnVtYmVyIG9mIGFkZGl0aW9uYWwgYnVmZmVycyB0aGF0IHRoaXMgYmFja2VuZCBzaG91bGQKLSAq IHBpbiBpZiBpdCB3YW50cyB0byBzdGF5IHVuZGVyIHRoZSBwZXItYmFja2VuZCBsaW1pdCwgY29u c2lkZXJpbmcgdGhlIG51bWJlcgotICogb2YgYnVmZmVycyBpdCBoYXMgYWxyZWFkeSBwaW5uZWQu ICBVbmxpa2UgTGltaXRBZGRpdGlvbmFsUGlucygpLCB0aGUgbGltaXQKLSAqIHJldHVybiBieSB0 aGlzIGZ1bmN0aW9uIGNhbiBiZSB6ZXJvLgotICovCi11aW50MzIKLUdldEFkZGl0aW9uYWxQaW5M aW1pdCh2b2lkKQotewotCXVpbnQzMgkJZXN0aW1hdGVkX3BpbnNfaGVsZDsKLQotCS8qCi0JICog V2UgZ2V0IHRoZSBudW1iZXIgb2YgIm92ZXJmbG93ZWQiIHBpbnMgZm9yIGZyZWUsIGJ1dCBkb24n dCBrbm93IHRoZQotCSAqIG51bWJlciBvZiBwaW5zIGluIFByaXZhdGVSZWZDb3VudEFycmF5LiAg VGhlIGNvc3Qgb2YgY2FsY3VsYXRpbmcgdGhhdAotCSAqIGV4YWN0bHkgZG9lc24ndCBzZWVtIHdv cnRoIGl0LCBzbyBqdXN0IGFzc3VtZSB0aGUgbWF4LgotCSAqLwotCWVzdGltYXRlZF9waW5zX2hl bGQgPSBQcml2YXRlUmVmQ291bnRPdmVyZmxvd2VkICsgUkVGQ09VTlRfQVJSQVlfRU5UUklFUzsK LQotCS8qIElzIHRoaXMgYmFja2VuZCBhbHJlYWR5IGhvbGRpbmcgbW9yZSB0aGFuIGl0cyBmYWly IHNoYXJlPyAqLwotCWlmIChlc3RpbWF0ZWRfcGluc19oZWxkID4gTWF4UHJvcG9ydGlvbmFsUGlu cykKLQkJcmV0dXJuIDA7Ci0KLQlyZXR1cm4gTWF4UHJvcG9ydGlvbmFsUGlucyAtIGVzdGltYXRl ZF9waW5zX2hlbGQ7Ci19Ci0KLS8qCi0gKiBMaW1pdCB0aGUgbnVtYmVyIG9mIHBpbnMgYSBiYXRj aCBvcGVyYXRpb24gbWF5IGFkZGl0aW9uYWxseSBhY3F1aXJlLCB0bwotICogYXZvaWQgcnVubmlu ZyBvdXQgb2YgcGlubmFibGUgYnVmZmVycy4KLSAqCi0gKiBPbmUgYWRkaXRpb25hbCBwaW4gaXMg YWx3YXlzIGFsbG93ZWQsIG9uIHRoZSBhc3N1bXB0aW9uIHRoYXQgdGhlIG9wZXJhdGlvbgotICog cmVxdWlyZXMgYXQgbGVhc3Qgb25lIHRvIG1ha2UgcHJvZ3Jlc3MuCi0gKi8KLXZvaWQKLUxpbWl0 QWRkaXRpb25hbFBpbnModWludDMyICphZGRpdGlvbmFsX3BpbnMpCi17Ci0JdWludDMyCQlsaW1p dDsKLQotCWlmICgqYWRkaXRpb25hbF9waW5zIDw9IDEpCi0JCXJldHVybjsKLQotCWxpbWl0ID0g R2V0QWRkaXRpb25hbFBpbkxpbWl0KCk7Ci0JbGltaXQgPSBNYXgobGltaXQsIDEpOwotCWlmIChs aW1pdCA8ICphZGRpdGlvbmFsX3BpbnMpCi0JCSphZGRpdGlvbmFsX3BpbnMgPSBsaW1pdDsKLX0K LQogLyoKICAqIExvZ2ljIHNoYXJlZCBiZXR3ZWVuIEV4dGVuZEJ1ZmZlcmVkUmVsQnkoKSwgRXh0 ZW5kQnVmZmVyZWRSZWxUbygpLiBKdXN0IHRvCiAgKiBhdm9pZCBkdXBsaWNhdGluZyB0aGUgdHJh Y2luZyBhbmQgcmVscGVyc2lzdGVuY2UgcmVsYXRlZCBsb2dpYy4KQEAgLTI4MTYsNyArMjM3NCw2 IEBAIEV4dGVuZEJ1ZmZlcmVkUmVsU2hhcmVkKEJ1ZmZlck1hbmFnZXJSZWxhdGlvbiBibXIsCiAK IAkJLyogaW4gY2FzZSB3ZSBuZWVkIHRvIHBpbiBhbiBleGlzdGluZyBidWZmZXIgYmVsb3cgKi8K IAkJUmVzb3VyY2VPd25lckVubGFyZ2UoQ3VycmVudFJlc291cmNlT3duZXIpOwotCQlSZXNlcnZl UHJpdmF0ZVJlZkNvdW50RW50cnkoKTsKIAogCQlJbml0QnVmZmVyVGFnKCZ0YWcsICZCTVJfR0VU X1NNR1IoYm1yKS0+c21ncl9ybG9jYXRvci5sb2NhdG9yLCBmb3JrLAogCQkJCQkgIGZpcnN0X2Js b2NrICsgaSk7CkBAIC0zMTg4LDkgKzI3NDUsOCBAQCBQaW5CdWZmZXIoQnVmZmVyRGVzYyAqYnVm LCBCdWZmZXJBY2Nlc3NTdHJhdGVneSBzdHJhdGVneSwKIAlQcml2YXRlUmVmQ291bnRFbnRyeSAq cmVmOwogCiAJQXNzZXJ0KCFCdWZmZXJJc0xvY2FsKGIpKTsKLQlBc3NlcnQoUmVzZXJ2ZWRSZWZD b3VudFNsb3QgIT0gLTEpOwogCi0JcmVmID0gR2V0UHJpdmF0ZVJlZkNvdW50RW50cnkoYiwgdHJ1 ZSk7CisJcmVmID0gR2V0U2hhcmVkQnVmZmVyRW50cnkoYik7CiAKIAlpZiAocmVmID09IE5VTEwp CiAJewpAQCAtMzI2MCw4ICsyODE2LDcgQEAgUGluQnVmZmVyKEJ1ZmZlckRlc2MgKmJ1ZiwgQnVm ZmVyQWNjZXNzU3RyYXRlZ3kgc3RyYXRlZ3ksCiAJCSAqLwogCQlyZXN1bHQgPSAocGdfYXRvbWlj X3JlYWRfdTY0KCZidWYtPnN0YXRlKSAmIEJNX1ZBTElEKSAhPSAwOwogCi0JCUFzc2VydChyZWYt PmRhdGEucmVmY291bnQgPiAwKTsKLQkJcmVmLT5kYXRhLnJlZmNvdW50Kys7CisJCVNoYXJlZEJ1 ZmZlclJlZkV4aXN0aW5nKHJlZik7CiAJCVJlc291cmNlT3duZXJSZW1lbWJlckJ1ZmZlcihDdXJy ZW50UmVzb3VyY2VPd25lciwgYik7CiAJfQogCkBAIC0zMjk5LDcgKzI4NTQsNyBAQCBQaW5CdWZm ZXJfTG9ja2VkKEJ1ZmZlckRlc2MgKmJ1ZikKIAkgKiBBcyBleHBsYWluZWQsIFdlIGRvbid0IGV4 cGVjdCBhbnkgcHJlZXhpc3RpbmcgcGlucy4gVGhhdCBhbGxvd3MgdXMgdG8KIAkgKiBtYW5pcHVs YXRlIHRoZSBQcml2YXRlUmVmQ291bnQgYWZ0ZXIgcmVsZWFzaW5nIHRoZSBzcGlubG9jawogCSAq LwotCUFzc2VydChHZXRQcml2YXRlUmVmQ291bnRFbnRyeShCdWZmZXJEZXNjcmlwdG9yR2V0QnVm ZmVyKGJ1ZiksIGZhbHNlKSA9PSBOVUxMKTsKKwlBc3NlcnQoR2V0U2hhcmVkQnVmZmVyRW50cnko QnVmZmVyRGVzY3JpcHRvckdldEJ1ZmZlcihidWYpKSA9PSBOVUxMKTsKIAogCS8qCiAJICogU2lu Y2Ugd2UgaG9sZCB0aGUgYnVmZmVyIHNwaW5sb2NrLCB3ZSBjYW4gdXBkYXRlIHRoZSBidWZmZXIg c3RhdGUgYW5kCkBAIC0zMzc2LDExICsyOTMxLDEwIEBAIFVucGluQnVmZmVyTm9Pd25lcihCdWZm ZXJEZXNjICpidWYpCiAJQXNzZXJ0KCFCdWZmZXJJc0xvY2FsKGIpKTsKIAogCS8qIG5vdCBtb3Zp bmcgYXMgd2UncmUgbGlrZWx5IGRlbGV0aW5nIGl0IHNvb24gYW55d2F5ICovCi0JcmVmID0gR2V0 UHJpdmF0ZVJlZkNvdW50RW50cnkoYiwgZmFsc2UpOworCXJlZiA9IEdldFNoYXJlZEJ1ZmZlckVu dHJ5KGIpOwogCUFzc2VydChyZWYgIT0gTlVMTCk7Ci0JQXNzZXJ0KHJlZi0+ZGF0YS5yZWZjb3Vu dCA+IDApOwotCXJlZi0+ZGF0YS5yZWZjb3VudC0tOwotCWlmIChyZWYtPmRhdGEucmVmY291bnQg PT0gMCkKKworCWlmIChTaGFyZWRCdWZmZXJVbnJlZihyZWYpKQogCXsKIAkJdWludDY0CQlvbGRf YnVmX3N0YXRlOwogCkBAIC0zNDA1LDggKzI5NTksNiBAQCBVbnBpbkJ1ZmZlck5vT3duZXIoQnVm ZmVyRGVzYyAqYnVmKQogCQkvKiBTdXBwb3J0IExvY2tCdWZmZXJGb3JDbGVhbnVwKCkgKi8KIAkJ aWYgKG9sZF9idWZfc3RhdGUgJiBCTV9QSU5fQ09VTlRfV0FJVEVSKQogCQkJV2FrZVBpbkNvdW50 V2FpdGVyKGJ1Zik7Ci0KLQkJRm9yZ2V0UHJpdmF0ZVJlZkNvdW50RW50cnkocmVmKTsKIAl9CiB9 CiAKQEAgLTM0MTcsMTAgKzI5NjksNyBAQCBVbnBpbkJ1ZmZlck5vT3duZXIoQnVmZmVyRGVzYyAq YnVmKQogaW5saW5lIHZvaWQKIFRyYWNrTmV3QnVmZmVyUGluKEJ1ZmZlciBidWYpCiB7Ci0JUHJp dmF0ZVJlZkNvdW50RW50cnkgKnJlZjsKLQotCXJlZiA9IE5ld1ByaXZhdGVSZWZDb3VudEVudHJ5 KGJ1Zik7Ci0JcmVmLT5kYXRhLnJlZmNvdW50Kys7CisJU2hhcmVkQnVmZmVyUmVmKGJ1Zik7CiAK IAlSZXNvdXJjZU93bmVyUmVtZW1iZXJCdWZmZXIoQ3VycmVudFJlc291cmNlT3duZXIsIGJ1Zik7 CiAKQEAgLTQwNDAsNyArMzU4OSw2IEBAIFN5bmNPbmVCdWZmZXIoaW50IGJ1Zl9pZCwgYm9vbCBz a2lwX3JlY2VudGx5X3VzZWQsIFdyaXRlYmFja0NvbnRleHQgKndiX2NvbnRleHQpCiAJQnVmZmVy VGFnCXRhZzsKIAogCS8qIE1ha2Ugc3VyZSB3ZSBjYW4gaGFuZGxlIHRoZSBwaW4gKi8KLQlSZXNl cnZlUHJpdmF0ZVJlZkNvdW50RW50cnkoKTsKIAlSZXNvdXJjZU93bmVyRW5sYXJnZShDdXJyZW50 UmVzb3VyY2VPd25lcik7CiAKIAkvKgpAQCAtNDEwNCwxMSArMzY1Miw5IEBAIFN5bmNPbmVCdWZm ZXIoaW50IGJ1Zl9pZCwgYm9vbCBza2lwX3JlY2VudGx5X3VzZWQsIFdyaXRlYmFja0NvbnRleHQg KndiX2NvbnRleHQpCiB2b2lkCiBBdEVPWGFjdF9CdWZmZXJzKGJvb2wgaXNDb21taXQpCiB7Ci0J Q2hlY2tGb3JCdWZmZXJMZWFrcygpOworCUNoZWNrUHJpdmF0ZVJlZkNvdW50TGVha3MoKTsKIAog CUF0RU9YYWN0X0xvY2FsQnVmZmVycyhpc0NvbW1pdCk7Ci0KLQlBc3NlcnQoUHJpdmF0ZVJlZkNv dW50T3ZlcmZsb3dlZCA9PSAwKTsKIH0KIAogLyoKQEAgLTQxMjEsMjUgKzM2NjcsOCBAQCBBdEVP WGFjdF9CdWZmZXJzKGJvb2wgaXNDb21taXQpCiB2b2lkCiBJbml0QnVmZmVyTWFuYWdlckFjY2Vz cyh2b2lkKQogewotCUhBU0hDVEwJCWhhc2hfY3RsOwotCi0JLyoKLQkgKiBBbiBhZHZpc29yeSBs aW1pdCBvbiB0aGUgbnVtYmVyIG9mIHBpbnMgZWFjaCBiYWNrZW5kIHNob3VsZCBob2xkLCBiYXNl ZAotCSAqIG9uIHNoYXJlZF9idWZmZXJzIGFuZCB0aGUgbWF4aW11bSBudW1iZXIgb2YgY29ubmVj dGlvbnMgcG9zc2libGUuCi0JICogVGhhdCdzIHZlcnkgcGVzc2ltaXN0aWMsIGJ1dCBvdXRzaWRl IHRveS1zaXplZCBzaGFyZWRfYnVmZmVycyBpdCBzaG91bGQKLQkgKiBhbGxvdyBwbGVudHkgb2Yg cGlucy4gIExpbWl0QWRkaXRpb25hbFBpbnMoKSBhbmQKLQkgKiBHZXRBZGRpdGlvbmFsUGluTGlt aXQoKSBjYW4gYmUgdXNlZCB0byBjaGVjayB0aGUgcmVtYWluaW5nIGJhbGFuY2UuCi0JICovCi0J TWF4UHJvcG9ydGlvbmFsUGlucyA9IE5CdWZmZXJzIC8gKE1heEJhY2tlbmRzICsgTlVNX0FVWElM SUFSWV9QUk9DUyk7Ci0KLQltZW1zZXQoJlByaXZhdGVSZWZDb3VudEFycmF5LCAwLCBzaXplb2Yo UHJpdmF0ZVJlZkNvdW50QXJyYXkpKTsKLQltZW1zZXQoJlByaXZhdGVSZWZDb3VudEFycmF5S2V5 cywgMCwgc2l6ZW9mKFByaXZhdGVSZWZDb3VudEFycmF5S2V5cykpOwotCi0JaGFzaF9jdGwua2V5 c2l6ZSA9IHNpemVvZihCdWZmZXIpOwotCWhhc2hfY3RsLmVudHJ5c2l6ZSA9IHNpemVvZihQcml2 YXRlUmVmQ291bnRFbnRyeSk7CiAKLQlQcml2YXRlUmVmQ291bnRIYXNoID0gaGFzaF9jcmVhdGUo IlByaXZhdGVSZWZDb3VudCIsIDEwMCwgJmhhc2hfY3RsLAotCQkJCQkJCQkJICBIQVNIX0VMRU0g fCBIQVNIX0JMT0JTKTsKKwlJbml0UHJpdmF0ZVJlZkNvdW50KCk7CiAKIAkvKgogCSAqIEF0UHJv Y0V4aXRfQnVmZmVycyBuZWVkcyBMV0xvY2sgYWNjZXNzLCBhbmQgdGhlcmVieSBoYXMgdG8gYmUg Y2FsbGVkIGF0CkBAIC00MTU4LDYyICszNjg3LDEyIEBAIEF0UHJvY0V4aXRfQnVmZmVycyhpbnQg Y29kZSwgRGF0dW0gYXJnKQogewogCVVubG9ja0J1ZmZlcnMoKTsKIAotCUNoZWNrRm9yQnVmZmVy TGVha3MoKTsKKwlDaGVja1ByaXZhdGVSZWZDb3VudExlYWtzKCk7CiAKIAkvKiBsb2NhbGJ1Zi5j IG5lZWRzIGEgY2hhbmNlIHRvbyAqLwogCUF0UHJvY0V4aXRfTG9jYWxCdWZmZXJzKCk7CiB9CiAK LS8qCi0gKgkJQ2hlY2tGb3JCdWZmZXJMZWFrcyAtIGVuc3VyZSB0aGlzIGJhY2tlbmQgaG9sZHMg bm8gYnVmZmVyIHBpbnMKLSAqCi0gKgkJQXMgb2YgUG9zdGdyZVNRTCA4LjAsIGJ1ZmZlciBwaW5z IHNob3VsZCBnZXQgcmVsZWFzZWQgYnkgdGhlCi0gKgkJUmVzb3VyY2VPd25lciBtZWNoYW5pc20u ICBUaGlzIHJvdXRpbmUgaXMganVzdCBhIGRlYnVnZ2luZwotICoJCWNyb3NzLWNoZWNrIHRoYXQg bm8gcGlucyByZW1haW4uCi0gKi8KLXN0YXRpYyB2b2lkCi1DaGVja0ZvckJ1ZmZlckxlYWtzKHZv aWQpCi17Ci0jaWZkZWYgVVNFX0FTU0VSVF9DSEVDS0lORwotCWludAkJCVJlZkNvdW50RXJyb3Jz ID0gMDsKLQlQcml2YXRlUmVmQ291bnRFbnRyeSAqcmVzOwotCWludAkJCWk7Ci0JY2hhcgkgICAq czsKLQotCS8qIGNoZWNrIHRoZSBhcnJheSAqLwotCWZvciAoaSA9IDA7IGkgPCBSRUZDT1VOVF9B UlJBWV9FTlRSSUVTOyBpKyspCi0JewotCQlpZiAoUHJpdmF0ZVJlZkNvdW50QXJyYXlLZXlzW2ld ICE9IEludmFsaWRCdWZmZXIpCi0JCXsKLQkJCXJlcyA9ICZQcml2YXRlUmVmQ291bnRBcnJheVtp XTsKLQotCQkJcyA9IERlYnVnUHJpbnRCdWZmZXJSZWZjb3VudChyZXMtPmJ1ZmZlcik7Ci0JCQll bG9nKFdBUk5JTkcsICJidWZmZXIgcmVmY291bnQgbGVhazogJXMiLCBzKTsKLQkJCXBmcmVlKHMp OwotCi0JCQlSZWZDb3VudEVycm9ycysrOwotCQl9Ci0JfQotCi0JLyogaWYgbmVjZXNzYXJ5IHNl YXJjaCB0aGUgaGFzaCAqLwotCWlmIChQcml2YXRlUmVmQ291bnRPdmVyZmxvd2VkKQotCXsKLQkJ SEFTSF9TRVFfU1RBVFVTIGhzdGF0OwotCi0JCWhhc2hfc2VxX2luaXQoJmhzdGF0LCBQcml2YXRl UmVmQ291bnRIYXNoKTsKLQkJd2hpbGUgKChyZXMgPSAoUHJpdmF0ZVJlZkNvdW50RW50cnkgKikg aGFzaF9zZXFfc2VhcmNoKCZoc3RhdCkpICE9IE5VTEwpCi0JCXsKLQkJCXMgPSBEZWJ1Z1ByaW50 QnVmZmVyUmVmY291bnQocmVzLT5idWZmZXIpOwotCQkJZWxvZyhXQVJOSU5HLCAiYnVmZmVyIHJl ZmNvdW50IGxlYWs6ICVzIiwgcyk7Ci0JCQlwZnJlZShzKTsKLQkJCVJlZkNvdW50RXJyb3JzKys7 Ci0JCX0KLQl9Ci0KLQlBc3NlcnQoUmVmQ291bnRFcnJvcnMgPT0gMCk7Ci0jZW5kaWYKLX0KLQog I2lmZGVmIFVTRV9BU1NFUlRfQ0hFQ0tJTkcKIC8qCiAgKiBDaGVjayBmb3IgZXhjbHVzaXZlLWxv Y2tlZCBjYXRhbG9nIGJ1ZmZlcnMuICBUaGlzIGlzIHRoZSBjb3JlIG9mCkBAIC00MjM1LDMzICsz NzE0LDIwIEBAIENoZWNrRm9yQnVmZmVyTGVha3Modm9pZCkKIHZvaWQKIEFzc2VydEJ1ZmZlckxv Y2tzUGVybWl0Q2F0YWxvZ1JlYWQodm9pZCkKIHsKKwlQcml2YXRlUmVmQ291bnRJdGVyYXRvciAq aXRlcjsKIAlQcml2YXRlUmVmQ291bnRFbnRyeSAqcmVzOwogCi0JLyogY2hlY2sgdGhlIGFycmF5 ICovCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBSRUZDT1VOVF9BUlJBWV9FTlRSSUVTOyBpKyspCisJ aXRlciA9IEluaXRQcml2YXRlUmVmQ291bnRJdGVyYXRvcigpOworCXdoaWxlICgocmVzID0gR2V0 TmV4dFByaXZhdGVSZWZDb3VudEVudHJ5KGl0ZXIpKSAhPSBOVUxMKQogCXsKLQkJaWYgKFByaXZh dGVSZWZDb3VudEFycmF5S2V5c1tpXSAhPSBJbnZhbGlkQnVmZmVyKQotCQl7Ci0JCQlyZXMgPSAm UHJpdmF0ZVJlZkNvdW50QXJyYXlbaV07Ci0KLQkJCWlmIChyZXMtPmJ1ZmZlciA9PSBJbnZhbGlk QnVmZmVyKQotCQkJCWNvbnRpbnVlOwotCi0JCQlBc3NlcnROb3RDYXRhbG9nQnVmZmVyTG9jayhy ZXMtPmJ1ZmZlciwgcmVzLT5kYXRhLmxvY2ttb2RlKTsKLQkJfQotCX0KKwkJQnVmZmVyCQlidWYg PSBTaGFyZWRCdWZmZXJHZXRCdWZmZXIocmVzKTsKIAotCS8qIGlmIG5lY2Vzc2FyeSBzZWFyY2gg dGhlIGhhc2ggKi8KLQlpZiAoUHJpdmF0ZVJlZkNvdW50T3ZlcmZsb3dlZCkKLQl7Ci0JCUhBU0hf U0VRX1NUQVRVUyBoc3RhdDsKKwkJaWYgKGJ1ZiA9PSBJbnZhbGlkQnVmZmVyKQorCQkJY29udGlu dWU7CiAKLQkJaGFzaF9zZXFfaW5pdCgmaHN0YXQsIFByaXZhdGVSZWZDb3VudEhhc2gpOwotCQl3 aGlsZSAoKHJlcyA9IChQcml2YXRlUmVmQ291bnRFbnRyeSAqKSBoYXNoX3NlcV9zZWFyY2goJmhz dGF0KSkgIT0gTlVMTCkKLQkJewotCQkJQXNzZXJ0Tm90Q2F0YWxvZ0J1ZmZlckxvY2socmVzLT5i dWZmZXIsIHJlcy0+ZGF0YS5sb2NrbW9kZSk7Ci0JCX0KKwkJQXNzZXJ0Tm90Q2F0YWxvZ0J1ZmZl ckxvY2soYnVmLCBTaGFyZWRCdWZmZXJHZXRMb2NrTW9kZShyZXMpKTsKIAl9CisJRnJlZVByaXZh dGVSZWZDb3VudEl0ZXJhdG9yKGl0ZXIpOwogfQogCiBzdGF0aWMgdm9pZApAQCAtNDMxNSw4ICsz NzgxLDEwIEBAIERlYnVnUHJpbnRCdWZmZXJSZWZjb3VudChCdWZmZXIgYnVmZmVyKQogCX0KIAll bHNlCiAJeworCQlQcml2YXRlUmVmQ291bnRFbnRyeSAqcmVmID0gR2V0U2hhcmVkQnVmZmVyRW50 cnkoYnVmZmVyKTsKKwogCQlidWYgPSBHZXRCdWZmZXJEZXNjcmlwdG9yKGJ1ZmZlciAtIDEpOwot CQlsb2Njb3VudCA9IEdldFByaXZhdGVSZWZDb3VudChidWZmZXIpOworCQlsb2Njb3VudCA9IHJl ZiA/IFNoYXJlZEJ1ZmZlclJlZkNvdW50KHJlZikgOiAwOwogCQliYWNrZW5kID0gSU5WQUxJRF9Q Uk9DX05VTUJFUjsKIAl9CiAKQEAgLTUxMDIsNyArNDU3MCw2IEBAIEZsdXNoUmVsYXRpb25CdWZm ZXJzKFJlbGF0aW9uIHJlbCkKIAkJCQllcnJvcl9jb250ZXh0X3N0YWNrID0gJmVycmNhbGxiYWNr OwogCiAJCQkJLyogTWFrZSBzdXJlIHdlIGNhbiBoYW5kbGUgdGhlIHBpbiAqLwotCQkJCVJlc2Vy dmVQcml2YXRlUmVmQ291bnRFbnRyeSgpOwogCQkJCVJlc291cmNlT3duZXJFbmxhcmdlKEN1cnJl bnRSZXNvdXJjZU93bmVyKTsKIAogCQkJCS8qCkBAIC01MTM4LDcgKzQ2MDUsNiBAQCBGbHVzaFJl bGF0aW9uQnVmZmVycyhSZWxhdGlvbiByZWwpCiAJCQljb250aW51ZTsKIAogCQkvKiBNYWtlIHN1 cmUgd2UgY2FuIGhhbmRsZSB0aGUgcGluICovCi0JCVJlc2VydmVQcml2YXRlUmVmQ291bnRFbnRy eSgpOwogCQlSZXNvdXJjZU93bmVyRW5sYXJnZShDdXJyZW50UmVzb3VyY2VPd25lcik7CiAKIAkJ YnVmX3N0YXRlID0gTG9ja0J1ZkhkcihidWZIZHIpOwpAQCAtNTIzMyw3ICs0Njk5LDYgQEAgRmx1 c2hSZWxhdGlvbnNBbGxCdWZmZXJzKFNNZ3JSZWxhdGlvbiAqc21ncnMsIGludCBucmVscykKIAkJ CWNvbnRpbnVlOwogCiAJCS8qIE1ha2Ugc3VyZSB3ZSBjYW4gaGFuZGxlIHRoZSBwaW4gKi8KLQkJ UmVzZXJ2ZVByaXZhdGVSZWZDb3VudEVudHJ5KCk7CiAJCVJlc291cmNlT3duZXJFbmxhcmdlKEN1 cnJlbnRSZXNvdXJjZU93bmVyKTsKIAogCQlidWZfc3RhdGUgPSBMb2NrQnVmSGRyKGJ1Zkhkcik7 CkBAIC01NDU5LDcgKzQ5MjQsNiBAQCBGbHVzaERhdGFiYXNlQnVmZmVycyhPaWQgZGJpZCkKIAkJ CWNvbnRpbnVlOwogCiAJCS8qIE1ha2Ugc3VyZSB3ZSBjYW4gaGFuZGxlIHRoZSBwaW4gKi8KLQkJ UmVzZXJ2ZVByaXZhdGVSZWZDb3VudEVudHJ5KCk7CiAJCVJlc291cmNlT3duZXJFbmxhcmdlKEN1 cnJlbnRSZXNvdXJjZU93bmVyKTsKIAogCQlidWZfc3RhdGUgPSBMb2NrQnVmSGRyKGJ1Zkhkcik7 CkBAIC01NTM0LDE3ICs0OTk4LDE4IEBAIFVubG9ja1JlbGVhc2VCdWZmZXIoQnVmZmVyIGJ1ZmZl cikKIHZvaWQKIEluY3JCdWZmZXJSZWZDb3VudChCdWZmZXIgYnVmZmVyKQogewotCUFzc2VydChC dWZmZXJJc1Bpbm5lZChidWZmZXIpKTsKIAlSZXNvdXJjZU93bmVyRW5sYXJnZShDdXJyZW50UmVz b3VyY2VPd25lcik7CiAJaWYgKEJ1ZmZlcklzTG9jYWwoYnVmZmVyKSkKKwl7CisJCUFzc2VydChM b2NhbFJlZkNvdW50Wy1idWZmZXIgLSAxXSA+IDApOwogCQlMb2NhbFJlZkNvdW50Wy1idWZmZXIg LSAxXSsrOworCX0KIAllbHNlCiAJewotCQlQcml2YXRlUmVmQ291bnRFbnRyeSAqcmVmOworCQlQ cml2YXRlUmVmQ291bnRFbnRyeSAqcmVmID0gR2V0U2hhcmVkQnVmZmVyRW50cnkoYnVmZmVyKTsK IAotCQlyZWYgPSBHZXRQcml2YXRlUmVmQ291bnRFbnRyeShidWZmZXIsIHRydWUpOwogCQlBc3Nl cnQocmVmICE9IE5VTEwpOwotCQlyZWYtPmRhdGEucmVmY291bnQrKzsKKwkJU2hhcmVkQnVmZmVy UmVmRXhpc3RpbmcocmVmKTsKIAl9CiAJUmVzb3VyY2VPd25lclJlbWVtYmVyQnVmZmVyKEN1cnJl bnRSZXNvdXJjZU93bmVyLCBidWZmZXIpOwogfQpAQCAtNTU4MCw3ICs1MDQ1LDcgQEAgTWFya0J1 ZmZlckRpcnR5SGludChCdWZmZXIgYnVmZmVyLCBib29sIGJ1ZmZlcl9zdGQpCiAKIAlidWZIZHIg PSBHZXRCdWZmZXJEZXNjcmlwdG9yKGJ1ZmZlciAtIDEpOwogCi0JQXNzZXJ0KEdldFByaXZhdGVS ZWZDb3VudChidWZmZXIpID4gMCk7CisJQXNzZXJ0KEdldFNoYXJlZEJ1ZmZlckVudHJ5KGJ1ZmZl cikgIT0gTlVMTCk7CiAJLyogaGVyZSwgZWl0aGVyIHNoYXJlIG9yIGV4Y2x1c2l2ZSBsb2NrIGlz IE9LICovCiAJQXNzZXJ0KEJ1ZmZlcklzTG9ja2VkQnlNZShidWZmZXIpKTsKIApAQCAtNTc2Mywx MiArNTIyOCwxMiBAQCBCdWZmZXJMb2NrQWNxdWlyZShCdWZmZXIgYnVmZmVyLCBCdWZmZXJEZXNj ICpidWZfaGRyLCBCdWZmZXJMb2NrTW9kZSBtb2RlKQogCSAqIEdldCByZWZlcmVuY2UgdG8gdGhl IHJlZmNvdW50IGVudHJ5IGJlZm9yZSB3ZSBob2xkIHRoZSBsb2NrLCBpdCBzZWVtcwogCSAqIGJl dHRlciB0byBkbyBiZWZvcmUgaG9sZGluZyB0aGUgbG9jay4KIAkgKi8KLQllbnRyeSA9IEdldFBy aXZhdGVSZWZDb3VudEVudHJ5KGJ1ZmZlciwgdHJ1ZSk7CisJZW50cnkgPSBHZXRTaGFyZWRCdWZm ZXJFbnRyeShidWZmZXIpOwogCiAJLyoKIAkgKiBXZSBiZXR0ZXIgbm90IGFscmVhZHkgaG9sZCBh IGxvY2sgb24gdGhlIGJ1ZmZlci4KIAkgKi8KLQlBc3NlcnQoZW50cnktPmRhdGEubG9ja21vZGUg PT0gQlVGRkVSX0xPQ0tfVU5MT0NLKTsKKwlBc3NlcnQoU2hhcmVkQnVmZmVyR2V0TG9ja01vZGUo ZW50cnkpID09IEJVRkZFUl9MT0NLX1VOTE9DSyk7CiAKIAkvKgogCSAqIExvY2sgb3V0IGNhbmNl bC9kaWUgaW50ZXJydXB0cyB1bnRpbCB3ZSBleGl0IHRoZSBjb2RlIHNlY3Rpb24gcHJvdGVjdGVk CkBAIC01ODU3LDcgKzUzMjIsNyBAQCBCdWZmZXJMb2NrQWNxdWlyZShCdWZmZXIgYnVmZmVyLCBC dWZmZXJEZXNjICpidWZfaGRyLCBCdWZmZXJMb2NrTW9kZSBtb2RlKQogCX0KIAogCS8qIFJlbWVt YmVyIHRoYXQgd2Ugbm93IGhvbGQgdGhpcyBsb2NrICovCi0JZW50cnktPmRhdGEubG9ja21vZGUg PSBtb2RlOworCVNoYXJlZEJ1ZmZlclNldExvY2tNb2RlKGVudHJ5LCBtb2RlKTsKIAogCS8qCiAJ ICogRml4IHRoZSBwcm9jZXNzIHdhaXQgc2VtYXBob3JlJ3MgY291bnQgZm9yIGFueSBhYnNvcmJl ZCB3YWtldXBzLgpAQCAtNTkwOCw3ICs1MzczLDcgQEAgQnVmZmVyTG9ja1VubG9jayhCdWZmZXIg YnVmZmVyLCBCdWZmZXJEZXNjICpidWZfaGRyKQogc3RhdGljIGJvb2wKIEJ1ZmZlckxvY2tDb25k aXRpb25hbChCdWZmZXIgYnVmZmVyLCBCdWZmZXJEZXNjICpidWZfaGRyLCBCdWZmZXJMb2NrTW9k ZSBtb2RlKQogewotCVByaXZhdGVSZWZDb3VudEVudHJ5ICplbnRyeSA9IEdldFByaXZhdGVSZWZD b3VudEVudHJ5KGJ1ZmZlciwgdHJ1ZSk7CisJUHJpdmF0ZVJlZkNvdW50RW50cnkgKmVudHJ5ID0g R2V0U2hhcmVkQnVmZmVyRW50cnkoYnVmZmVyKTsKIAlib29sCQltdXN0d2FpdDsKIAogCS8qCkBA IC01OTE2LDcgKzUzODEsNyBAQCBCdWZmZXJMb2NrQ29uZGl0aW9uYWwoQnVmZmVyIGJ1ZmZlciwg QnVmZmVyRGVzYyAqYnVmX2hkciwgQnVmZmVyTG9ja01vZGUgbW9kZSkKIAkgKiBhbHJlYWR5IGhh cyBsb2NrZWQsIHJldHVybiBmYWxzZSwgaW5kZXBlbmRlbnQgb2YgdGhlIGV4aXN0aW5nIGFuZAog CSAqIGRlc2lyZWQgbG9jayBsZXZlbC4KIAkgKi8KLQlpZiAoZW50cnktPmRhdGEubG9ja21vZGUg IT0gQlVGRkVSX0xPQ0tfVU5MT0NLKQorCWlmIChTaGFyZWRCdWZmZXJHZXRMb2NrTW9kZShlbnRy eSkgIT0gQlVGRkVSX0xPQ0tfVU5MT0NLKQogCQlyZXR1cm4gZmFsc2U7CiAKIAkvKgpAQCAtNTkz Niw3ICs1NDAxLDcgQEAgQnVmZmVyTG9ja0NvbmRpdGlvbmFsKEJ1ZmZlciBidWZmZXIsIEJ1ZmZl ckRlc2MgKmJ1Zl9oZHIsIEJ1ZmZlckxvY2tNb2RlIG1vZGUpCiAJfQogCWVsc2UKIAl7Ci0JCWVu dHJ5LT5kYXRhLmxvY2ttb2RlID0gbW9kZTsKKwkJU2hhcmVkQnVmZmVyU2V0TG9ja01vZGUoZW50 cnksIG1vZGUpOwogCX0KIAogCXJldHVybiAhbXVzdHdhaXQ7CkBAIC02MTQ2LDExICs1NjExLDEx IEBAIEJ1ZmZlckxvY2tEaXNvd25JbnRlcm5hbChCdWZmZXIgYnVmZmVyLCBCdWZmZXJEZXNjICpi dWZfaGRyKQogCUJ1ZmZlckxvY2tNb2RlIG1vZGU7CiAJUHJpdmF0ZVJlZkNvdW50RW50cnkgKnJl ZjsKIAotCXJlZiA9IEdldFByaXZhdGVSZWZDb3VudEVudHJ5KGJ1ZmZlciwgZmFsc2UpOworCXJl ZiA9IEdldFNoYXJlZEJ1ZmZlckVudHJ5KGJ1ZmZlcik7CiAJaWYgKHJlZiA9PSBOVUxMKQogCQll bG9nKEVSUk9SLCAibG9jayAlZCBpcyBub3QgaGVsZCIsIGJ1ZmZlcik7Ci0JbW9kZSA9IHJlZi0+ ZGF0YS5sb2NrbW9kZTsKLQlyZWYtPmRhdGEubG9ja21vZGUgPSBCVUZGRVJfTE9DS19VTkxPQ0s7 CisJbW9kZSA9IFNoYXJlZEJ1ZmZlckdldExvY2tNb2RlKHJlZik7CisJU2hhcmVkQnVmZmVyU2V0 TG9ja01vZGUocmVmLCBCVUZGRVJfTE9DS19VTkxPQ0spOwogCiAJcmV0dXJuIG1vZGU7CiB9CkBA IC02Mzg0LDEyICs1ODQ5LDEyIEBAIHN0YXRpYyBib29sCiBCdWZmZXJMb2NrSGVsZEJ5TWVJbk1v ZGUoQnVmZmVyRGVzYyAqYnVmX2hkciwgQnVmZmVyTG9ja01vZGUgbW9kZSkKIHsKIAlQcml2YXRl UmVmQ291bnRFbnRyeSAqZW50cnkgPQotCQlHZXRQcml2YXRlUmVmQ291bnRFbnRyeShCdWZmZXJE ZXNjcmlwdG9yR2V0QnVmZmVyKGJ1Zl9oZHIpLCBmYWxzZSk7CisJCUdldFNoYXJlZEJ1ZmZlckVu dHJ5KEJ1ZmZlckRlc2NyaXB0b3JHZXRCdWZmZXIoYnVmX2hkcikpOwogCiAJaWYgKCFlbnRyeSkK IAkJcmV0dXJuIGZhbHNlOwogCWVsc2UKLQkJcmV0dXJuIGVudHJ5LT5kYXRhLmxvY2ttb2RlID09 IG1vZGU7CisJCXJldHVybiBTaGFyZWRCdWZmZXJHZXRMb2NrTW9kZShlbnRyeSkgPT0gbW9kZTsK IH0KIAogLyoKQEAgLTY0MDIsMTIgKzU4NjcsMTIgQEAgc3RhdGljIGJvb2wKIEJ1ZmZlckxvY2tI ZWxkQnlNZShCdWZmZXJEZXNjICpidWZfaGRyKQogewogCVByaXZhdGVSZWZDb3VudEVudHJ5ICpl bnRyeSA9Ci0JCUdldFByaXZhdGVSZWZDb3VudEVudHJ5KEJ1ZmZlckRlc2NyaXB0b3JHZXRCdWZm ZXIoYnVmX2hkciksIGZhbHNlKTsKKwkJR2V0U2hhcmVkQnVmZmVyRW50cnkoQnVmZmVyRGVzY3Jp cHRvckdldEJ1ZmZlcihidWZfaGRyKSk7CiAKIAlpZiAoIWVudHJ5KQogCQlyZXR1cm4gZmFsc2U7 CiAJZWxzZQotCQlyZXR1cm4gZW50cnktPmRhdGEubG9ja21vZGUgIT0gQlVGRkVSX0xPQ0tfVU5M T0NLOworCQlyZXR1cm4gU2hhcmVkQnVmZmVyR2V0TG9ja01vZGUoZW50cnkpICE9IEJVRkZFUl9M T0NLX1VOTE9DSzsKIH0KIAogLyoKQEAgLTY1MDMsOSArNTk2OCwxMyBAQCBDaGVja0J1ZmZlcklz UGlubmVkT25jZShCdWZmZXIgYnVmZmVyKQogCX0KIAllbHNlCiAJewotCQlpZiAoR2V0UHJpdmF0 ZVJlZkNvdW50KGJ1ZmZlcikgIT0gMSkKLQkJCWVsb2coRVJST1IsICJpbmNvcnJlY3QgbG9jYWwg cGluIGNvdW50OiAlZCIsCi0JCQkJIEdldFByaXZhdGVSZWZDb3VudChidWZmZXIpKTsKKwkJewor CQkJUHJpdmF0ZVJlZkNvdW50RW50cnkgKnJlZiA9IEdldFNoYXJlZEJ1ZmZlckVudHJ5KGJ1ZmZl cik7CisJCQlpbnQzMgkJcmVmY291bnQgPSByZWYgPyBTaGFyZWRCdWZmZXJSZWZDb3VudChyZWYp IDogMDsKKworCQkJaWYgKHJlZmNvdW50ICE9IDEpCisJCQkJZWxvZyhFUlJPUiwgImluY29ycmVj dCBsb2NhbCBwaW4gY291bnQ6ICVkIiwgcmVmY291bnQpOworCQl9CiAJfQogfQogCkBAIC02Njg2 LDcgKzYxNTUsNyBAQCBIb2xkaW5nQnVmZmVyUGluVGhhdERlbGF5c1JlY292ZXJ5KHZvaWQpCiAJ aWYgKGJ1ZmlkIDwgMCkKIAkJcmV0dXJuIGZhbHNlOwogCi0JaWYgKEdldFByaXZhdGVSZWZDb3Vu dChidWZpZCArIDEpID4gMCkKKwlpZiAoR2V0U2hhcmVkQnVmZmVyRW50cnkoYnVmaWQgKyAxKSAh PSBOVUxMKQogCQlyZXR1cm4gdHJ1ZTsKIAogCXJldHVybiBmYWxzZTsKQEAgLTY3MjEsOCArNjE5 MCwxMiBAQCBDb25kaXRpb25hbExvY2tCdWZmZXJGb3JDbGVhbnVwKEJ1ZmZlciBidWZmZXIpCiAJ fQogCiAJLyogVGhlcmUgc2hvdWxkIGJlIGV4YWN0bHkgb25lIGxvY2FsIHBpbiAqLwotCXJlZmNv dW50ID0gR2V0UHJpdmF0ZVJlZkNvdW50KGJ1ZmZlcik7Ci0JQXNzZXJ0KHJlZmNvdW50KTsKKwl7 CisJCVByaXZhdGVSZWZDb3VudEVudHJ5ICpyZWYgPSBHZXRTaGFyZWRCdWZmZXJFbnRyeShidWZm ZXIpOworCisJCXJlZmNvdW50ID0gcmVmID8gU2hhcmVkQnVmZmVyUmVmQ291bnQocmVmKSA6IDA7 CisJCUFzc2VydChyZWZjb3VudCk7CisJfQogCWlmIChyZWZjb3VudCAhPSAxKQogCQlyZXR1cm4g ZmFsc2U7CiAKQEAgLTY3NzYsOCArNjI0OSwxMiBAQCBJc0J1ZmZlckNsZWFudXBPSyhCdWZmZXIg YnVmZmVyKQogCX0KIAogCS8qIFRoZXJlIHNob3VsZCBiZSBleGFjdGx5IG9uZSBsb2NhbCBwaW4g Ki8KLQlpZiAoR2V0UHJpdmF0ZVJlZkNvdW50KGJ1ZmZlcikgIT0gMSkKLQkJcmV0dXJuIGZhbHNl OworCXsKKwkJUHJpdmF0ZVJlZkNvdW50RW50cnkgKnJlZiA9IEdldFNoYXJlZEJ1ZmZlckVudHJ5 KGJ1ZmZlcik7CisKKwkJaWYgKCFyZWYgfHwgU2hhcmVkQnVmZmVyUmVmQ291bnQocmVmKSAhPSAx KQorCQkJcmV0dXJuIGZhbHNlOworCX0KIAogCWJ1ZkhkciA9IEdldEJ1ZmZlckRlc2NyaXB0b3Io YnVmZmVyIC0gMSk7CiAKQEAgLTc0NDcsNyArNjkyNCw3IEBAIFJlc093bmVyUmVsZWFzZUJ1ZmZl cihEYXR1bSByZXMpCiAJewogCQlQcml2YXRlUmVmQ291bnRFbnRyeSAqcmVmOwogCi0JCXJlZiA9 IEdldFByaXZhdGVSZWZDb3VudEVudHJ5KGJ1ZmZlciwgZmFsc2UpOworCQlyZWYgPSBHZXRTaGFy ZWRCdWZmZXJFbnRyeShidWZmZXIpOwogCiAJCS8qIG5vdCBoYXZpbmcgYSBwcml2YXRlIHJlZmNv dW50IHdvdWxkIGltcGx5IHJlc293bmVyIGNvcnJ1cHRpb24gKi8KIAkJQXNzZXJ0KHJlZiAhPSBO VUxMKTsKQEAgLTc0NTYsNyArNjkzMyw3IEBAIFJlc093bmVyUmVsZWFzZUJ1ZmZlcihEYXR1bSBy ZXMpCiAJCSAqIElmIHRoZSBidWZmZXIgd2FzIGxvY2tlZCBhdCB0aGUgdGltZSBvZiB0aGUgcmVz b3duZXIgcmVsZWFzZSwKIAkJICogcmVsZWFzZSB0aGUgbG9jayBub3cuIFRoaXMgc2hvdWxkIG9u bHkgaGFwcGVuIGFmdGVyIGVycm9ycy4KIAkJICovCi0JCWlmIChyZWYtPmRhdGEubG9ja21vZGUg IT0gQlVGRkVSX0xPQ0tfVU5MT0NLKQorCQlpZiAoU2hhcmVkQnVmZmVyR2V0TG9ja01vZGUocmVm KSAhPSBCVUZGRVJfTE9DS19VTkxPQ0spCiAJCXsKIAkJCUJ1ZmZlckRlc2MgKmJ1ZiA9IEdldEJ1 ZmZlckRlc2NyaXB0b3IoYnVmZmVyIC0gMSk7CiAKQEAgLTc1NDksNyArNzAyNiw2IEBAIEV2aWN0 VW5waW5uZWRCdWZmZXIoQnVmZmVyIGJ1ZiwgYm9vbCAqYnVmZmVyX2ZsdXNoZWQpCiAKIAkvKiBN YWtlIHN1cmUgd2UgY2FuIHBpbiB0aGUgYnVmZmVyLiAqLwogCVJlc291cmNlT3duZXJFbmxhcmdl KEN1cnJlbnRSZXNvdXJjZU93bmVyKTsKLQlSZXNlcnZlUHJpdmF0ZVJlZkNvdW50RW50cnkoKTsK IAogCWRlc2MgPSBHZXRCdWZmZXJEZXNjcmlwdG9yKGJ1ZiAtIDEpOwogCUxvY2tCdWZIZHIoZGVz Yyk7CkBAIC03NTkwLDcgKzcwNjYsNiBAQCBFdmljdEFsbFVucGlubmVkQnVmZmVycyhpbnQzMiAq YnVmZmVyc19ldmljdGVkLCBpbnQzMiAqYnVmZmVyc19mbHVzaGVkLAogCQkJY29udGludWU7CiAK IAkJUmVzb3VyY2VPd25lckVubGFyZ2UoQ3VycmVudFJlc291cmNlT3duZXIpOwotCQlSZXNlcnZl UHJpdmF0ZVJlZkNvdW50RW50cnkoKTsKIAogCQlMb2NrQnVmSGRyKGRlc2MpOwogCkBAIC03NjQ0 LDcgKzcxMTksNiBAQCBFdmljdFJlbFVucGlubmVkQnVmZmVycyhSZWxhdGlvbiByZWwsIGludDMy ICpidWZmZXJzX2V2aWN0ZWQsCiAKIAkJLyogTWFrZSBzdXJlIHdlIGNhbiBwaW4gdGhlIGJ1ZmZl ci4gKi8KIAkJUmVzb3VyY2VPd25lckVubGFyZ2UoQ3VycmVudFJlc291cmNlT3duZXIpOwotCQlS ZXNlcnZlUHJpdmF0ZVJlZkNvdW50RW50cnkoKTsKIAogCQlidWZfc3RhdGUgPSBMb2NrQnVmSGRy KGRlc2MpOwogCkBAIC03NzM2LDcgKzcyMTAsNiBAQCBNYXJrRGlydHlVbnBpbm5lZEJ1ZmZlcihC dWZmZXIgYnVmLCBib29sICpidWZmZXJfYWxyZWFkeV9kaXJ0eSkKIAogCS8qIE1ha2Ugc3VyZSB3 ZSBjYW4gcGluIHRoZSBidWZmZXIuICovCiAJUmVzb3VyY2VPd25lckVubGFyZ2UoQ3VycmVudFJl c291cmNlT3duZXIpOwotCVJlc2VydmVQcml2YXRlUmVmQ291bnRFbnRyeSgpOwogCiAJZGVzYyA9 IEdldEJ1ZmZlckRlc2NyaXB0b3IoYnVmIC0gMSk7CiAJTG9ja0J1ZkhkcihkZXNjKTsKQEAgLTc3 ODksNyArNzI2Miw2IEBAIE1hcmtEaXJ0eVJlbFVucGlubmVkQnVmZmVycyhSZWxhdGlvbiByZWws CiAKIAkJLyogTWFrZSBzdXJlIHdlIGNhbiBwaW4gdGhlIGJ1ZmZlci4gKi8KIAkJUmVzb3VyY2VP d25lckVubGFyZ2UoQ3VycmVudFJlc291cmNlT3duZXIpOwotCQlSZXNlcnZlUHJpdmF0ZVJlZkNv dW50RW50cnkoKTsKIAogCQlidWZfc3RhdGUgPSBMb2NrQnVmSGRyKGRlc2MpOwogCkBAIC03ODQx LDcgKzczMTMsNiBAQCBNYXJrRGlydHlBbGxVbnBpbm5lZEJ1ZmZlcnMoaW50MzIgKmJ1ZmZlcnNf ZGlydGllZCwKIAkJCWNvbnRpbnVlOwogCiAJCVJlc291cmNlT3duZXJFbmxhcmdlKEN1cnJlbnRS ZXNvdXJjZU93bmVyKTsKLQkJUmVzZXJ2ZVByaXZhdGVSZWZDb3VudEVudHJ5KCk7CiAKIAkJTG9j a0J1ZkhkcihkZXNjKTsKIApkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvc3RvcmFnZS9idWZfcmVm Y291bnQuaCBiL3NyYy9pbmNsdWRlL3N0b3JhZ2UvYnVmX3JlZmNvdW50LmgKbmV3IGZpbGUgbW9k ZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAuLjg0Mjc2MGFkMmVlCi0tLSAvZGV2L251bGwKKysr IGIvc3JjL2luY2x1ZGUvc3RvcmFnZS9idWZfcmVmY291bnQuaApAQCAtMCwwICsxLDU4IEBACisv Ki0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBidWZfcmVmY291bnQuaAorICoJICBCYWNrZW5kLXBy aXZhdGUgYnVmZmVyIHJlZmNvdW50IHRyYWNraW5nCisgKgorICogUG9ydGlvbnMgQ29weXJpZ2h0 IChjKSAxOTk2LTIwMjYsIFBvc3RncmVTUUwgR2xvYmFsIERldmVsb3BtZW50IEdyb3VwCisgKiBQ b3J0aW9ucyBDb3B5cmlnaHQgKGMpIDE5OTQsIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2Yg Q2FsaWZvcm5pYQorICoKKyAqIHNyYy9pbmNsdWRlL3N0b3JhZ2UvYnVmX3JlZmNvdW50LmgKKyAq CisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworI2lmbmRlZiBCVUZfUkVGQ09VTlRfSAorI2RlZmlu ZSBCVUZfUkVGQ09VTlRfSAorCisjaW5jbHVkZSAic3RvcmFnZS9idWYuaCIKKyNpbmNsdWRlICJz dG9yYWdlL2J1Zm1nci5oIgorCisvKiBPcGFxdWUgaGFuZGxlIHRvIGEgcHJpdmF0ZSByZWZjb3Vu dCBlbnRyeSAqLwordHlwZWRlZiBzdHJ1Y3QgUHJpdmF0ZVJlZkNvdW50RW50cnkgUHJpdmF0ZVJl ZkNvdW50RW50cnk7CisKKy8qIEluaXRpYWxpemF0aW9uICovCitleHRlcm4gdm9pZCBJbml0UHJp dmF0ZVJlZkNvdW50KHZvaWQpOworCisvKiBQdXJlIGxvb2t1cCAqLworZXh0ZXJuIFByaXZhdGVS ZWZDb3VudEVudHJ5ICpHZXRTaGFyZWRCdWZmZXJFbnRyeShCdWZmZXIgYnVmZmVyKTsKKworLyog UmVmZXJlbmNlIGNvdW50aW5nIC0gY29tcGxleCBvcGVyYXRpb25zICovCitleHRlcm4gUHJpdmF0 ZVJlZkNvdW50RW50cnkgKlNoYXJlZEJ1ZmZlclJlZihCdWZmZXIgYnVmZmVyKTsKK2V4dGVybiB2 b2lkIFNoYXJlZEJ1ZmZlclJlZkV4aXN0aW5nKFByaXZhdGVSZWZDb3VudEVudHJ5ICpyZWYpOwor ZXh0ZXJuIGJvb2wgU2hhcmVkQnVmZmVyVW5yZWYoUHJpdmF0ZVJlZkNvdW50RW50cnkgKnJlZik7 CisKKy8qIEFjY2Vzc29ycyAgKi8KK2V4dGVybiBpbnQzMiBTaGFyZWRCdWZmZXJSZWZDb3VudChQ cml2YXRlUmVmQ291bnRFbnRyeSAqcmVmKTsKK2V4dGVybiBCdWZmZXJMb2NrTW9kZSBTaGFyZWRC dWZmZXJHZXRMb2NrTW9kZShQcml2YXRlUmVmQ291bnRFbnRyeSAqcmVmKTsKK2V4dGVybiB2b2lk IFNoYXJlZEJ1ZmZlclNldExvY2tNb2RlKFByaXZhdGVSZWZDb3VudEVudHJ5ICpyZWYsIEJ1ZmZl ckxvY2tNb2RlIG1vZGUpOworZXh0ZXJuIEJ1ZmZlciBTaGFyZWRCdWZmZXJHZXRCdWZmZXIoUHJp dmF0ZVJlZkNvdW50RW50cnkgKnJlZik7CisKKy8qIFBpbiBsaW1pdGluZyAqLworZXh0ZXJuIHVp bnQzMiBHZXRQaW5MaW1pdCh2b2lkKTsKK2V4dGVybiB1aW50MzIgR2V0QWRkaXRpb25hbFBpbkxp bWl0KHZvaWQpOworZXh0ZXJuIHZvaWQgTGltaXRBZGRpdGlvbmFsUGlucyh1aW50MzIgKmFkZGl0 aW9uYWxfcGlucyk7CisKKy8qIExlYWsgY2hlY2tpbmcgKi8KK2V4dGVybiB2b2lkIENoZWNrUHJp dmF0ZVJlZkNvdW50TGVha3Modm9pZCk7CisKKy8qCisgKiBJdGVyYXRvciBmb3Igd2Fsa2luZyBh bGwgcHJpdmF0ZSByZWZjb3VudCBlbnRyaWVzLgorICogVXNlZCBieSBhc3NlcnRpb24gY2hlY2tp bmcgY29kZSBpbiBidWZtZ3IuYy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgUHJpdmF0ZVJlZkNvdW50 SXRlcmF0b3IgUHJpdmF0ZVJlZkNvdW50SXRlcmF0b3I7CisKK2V4dGVybiBQcml2YXRlUmVmQ291 bnRJdGVyYXRvciAqSW5pdFByaXZhdGVSZWZDb3VudEl0ZXJhdG9yKHZvaWQpOworZXh0ZXJuIFBy aXZhdGVSZWZDb3VudEVudHJ5ICpHZXROZXh0UHJpdmF0ZVJlZkNvdW50RW50cnkoUHJpdmF0ZVJl ZkNvdW50SXRlcmF0b3IgKml0ZXIpOworZXh0ZXJuIHZvaWQgRnJlZVByaXZhdGVSZWZDb3VudEl0 ZXJhdG9yKFByaXZhdGVSZWZDb3VudEl0ZXJhdG9yICppdGVyKTsKKworCisjZW5kaWYJCQkJCQkJ LyogQlVGX1JFRkNPVU5UX0ggKi8KLS0gCjIuNTMuMAoK --00000000000048da9c064c8582e3 Content-Type: application/octet-stream; name="v1-0001-Benchmark-buffer-pinning.patch" Content-Disposition: attachment; filename="v1-0001-Benchmark-buffer-pinning.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mmhxnew70 RnJvbSAyNzJmYTM3NmNmMzNjNWUzZDhmZWZjM2IzOTY3OGQwMTkyNWNiYTFmIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBBbGV4YW5kcmUgRmVsaXBlIDxvLmFsZXhhbmRyZS5mZWxpcGVA Z21haWwuY29tPgpEYXRlOiBXZWQsIDQgTWFyIDIwMjYgMTU6MTM6NTMgKzAwMDAKU3ViamVjdDog W1BBVENIXSBCZW5jaG1hcmsgYnVmZmVyIHBpbm5pbmcKCkludHJvZHVjZXMgYSBiZW5jaG1hcmsg ZmFjaWxpdHkgdGhhdCB3aWxsIGJlIHVzZWQgdG8gZXN0YWJsaXNoIGEgYmFzZWxpbmUKYW5kIGV2 YWx1YXRlIGVhY2ggb2YgdGhlIHN1YnNlcXVlbnQgcGF0Y2hlcy4gSXQgaW5jbHVkZXMgYSB0ZXN0 IG1vZHVsZSwgYW5kCmEgY29udmVuaWVuY2UgcHl0aG9uIHNjcmlwdCB0byBydW4gYW5kIHBsb3Qg dGhlIHJlc3VsdHMuCi0tLQogLmdpdGlnbm9yZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHwgICAzICsKIHNyYy90ZXN0L21vZHVsZXMvdGVzdF9idWZmZXJfcGluL01ha2VmaWxl ICAgICB8ICAxOCArCiBzcmMvdGVzdC9tb2R1bGVzL3Rlc3RfYnVmZmVyX3Bpbi9iZW5jaG1hcmsu cHkgfCAxOTAgKysrKysrKysKIC4uLi9tb2R1bGVzL3Rlc3RfYnVmZmVyX3Bpbi9yZXF1aXJlbWVu dHMudHh0ICB8ICAgOSArCiAuLi4vdGVzdF9idWZmZXJfcGluL3Rlc3RfYnVmZmVyX3Bpbi0tMS4w LnNxbCAgfCAgODggKysrKwogLi4uL21vZHVsZXMvdGVzdF9idWZmZXJfcGluL3Rlc3RfYnVmZmVy X3Bpbi5jIHwgNDIxICsrKysrKysrKysrKysrKysrKwogLi4uL3Rlc3RfYnVmZmVyX3Bpbi90ZXN0 X2J1ZmZlcl9waW4uY29udHJvbCAgIHwgICA0ICsKIDcgZmlsZXMgY2hhbmdlZCwgNzMzIGluc2Vy dGlvbnMoKykKIGNyZWF0ZSBtb2RlIDEwMDY0NCBzcmMvdGVzdC9tb2R1bGVzL3Rlc3RfYnVmZmVy X3Bpbi9NYWtlZmlsZQogY3JlYXRlIG1vZGUgMTAwNzU1IHNyYy90ZXN0L21vZHVsZXMvdGVzdF9i dWZmZXJfcGluL2JlbmNobWFyay5weQogY3JlYXRlIG1vZGUgMTAwNjQ0IHNyYy90ZXN0L21vZHVs ZXMvdGVzdF9idWZmZXJfcGluL3JlcXVpcmVtZW50cy50eHQKIGNyZWF0ZSBtb2RlIDEwMDY0NCBz cmMvdGVzdC9tb2R1bGVzL3Rlc3RfYnVmZmVyX3Bpbi90ZXN0X2J1ZmZlcl9waW4tLTEuMC5zcWwK IGNyZWF0ZSBtb2RlIDEwMDY0NCBzcmMvdGVzdC9tb2R1bGVzL3Rlc3RfYnVmZmVyX3Bpbi90ZXN0 X2J1ZmZlcl9waW4uYwogY3JlYXRlIG1vZGUgMTAwNjQ0IHNyYy90ZXN0L21vZHVsZXMvdGVzdF9i dWZmZXJfcGluL3Rlc3RfYnVmZmVyX3Bpbi5jb250cm9sCgpkaWZmIC0tZ2l0IGEvLmdpdGlnbm9y ZSBiLy5naXRpZ25vcmUKaW5kZXggNGU5MTEzOTVmZTMuLmJjN2EwMzE0MzgwIDEwMDY0NAotLS0g YS8uZ2l0aWdub3JlCisrKyBiLy5naXRpZ25vcmUKQEAgLTQzLDMgKzQzLDYgQEAgbGliKi5wYwog L1JlbGVhc2UvCiAvdG1wX2luc3RhbGwvCiAvcG9ydGxvY2svCisKKyPCoGhpZGRlbiBmaWxlcwor LioKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9tb2R1 bGVzL3Rlc3RfYnVmZmVyX3Bpbi9NYWtlZmlsZSBiL3NyYy90ZXN0L21vZHVsZXMvdGVzdF9idWZm ZXJfcGluL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwLi4y NzA3Zjg0YzViMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L21vZHVsZXMvdGVzdF9idWZm ZXJfcGluL01ha2VmaWxlCkBAIC0wLDAgKzEsMTggQEAKK01PRFVMRV9iaWcgPSB0ZXN0X2J1ZmZl cl9waW4KK09CSlMgPSB0ZXN0X2J1ZmZlcl9waW4ubworCitFWFRFTlNJT04gPSB0ZXN0X2J1ZmZl cl9waW4KK0RBVEEgPSB0ZXN0X2J1ZmZlcl9waW4tLTEuMC5zcWwKKworUEdGSUxFREVTQyA9ICJ0 ZXN0X2J1ZmZlcl9waW4gLSBidWZmZXIgcGlubmluZyBiZW5jaG1hcmtzIgorCitpZmRlZiBVU0Vf UEdYUworUEdfQ09ORklHID0gcGdfY29uZmlnCitQR1hTIDo9ICQoc2hlbGwgJChQR19DT05GSUcp IC0tcGd4cykKK2luY2x1ZGUgJChQR1hTKQorZWxzZQorc3ViZGlyID0gc3JjL3Rlc3QvbW9kdWxl cy90ZXN0X2J1ZmZlcl9waW4KK3RvcF9idWlsZGRpciA9IC4uLy4uLy4uLy4uCitpbmNsdWRlICQo dG9wX2J1aWxkZGlyKS9zcmMvTWFrZWZpbGUuZ2xvYmFsCitpbmNsdWRlICQodG9wX3NyY2Rpcikv Y29udHJpYi9jb250cmliLWdsb2JhbC5taworZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L21v ZHVsZXMvdGVzdF9idWZmZXJfcGluL2JlbmNobWFyay5weSBiL3NyYy90ZXN0L21vZHVsZXMvdGVz dF9idWZmZXJfcGluL2JlbmNobWFyay5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAw MDAwMDAwMC4uMGNmNzk1YTUwYzEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9tb2R1bGVz L3Rlc3RfYnVmZmVyX3Bpbi9iZW5jaG1hcmsucHkKQEAgLTAsMCArMSwxOTAgQEAKKyMhL3Vzci9i aW4vZW52IHB5dGhvbjMKKyIiIgorQnVmZmVyIHBpbm5pbmcgYmVuY2htYXJrIC0gcnVucyBTUUwg YmVuY2htYXJrcyBhbmQgc2F2ZXMgcmVzdWx0cy4KKworVXNhZ2U6CisgICAgcHl0aG9uMyBiZW5j aG1hcmsucHkgW29wdGlvbnNdCisKK0V4YW1wbGVzOgorICAgIHB5dGhvbjMgYmVuY2htYXJrLnB5 IC0tcG9ydCA1NDM0IC0tbmFtZSBwZzE4LWJhc2VsaW5lIC0tdGl0bGUgIlBvc3RncmVTUUwgMTgg QmFzZWxpbmUiCisgICAgcHl0aG9uMyBiZW5jaG1hcmsucHkgLS1wb3J0IDU0MzQgLS1uYW1lIHBh dGNoLTAwMDUgLS10aXRsZSAiV2l0aCBQYXRjaCAwMDA1IgorIiIiCisKK2ltcG9ydCBhcmdwYXJz ZQoraW1wb3J0IG51bXB5IGFzIG5wCitpbXBvcnQgcGFuZGFzIGFzIHBkCitmcm9tIHNxbGFsY2hl bXkgaW1wb3J0IGNyZWF0ZV9lbmdpbmUsIHRleHQKK2ltcG9ydCBtYXRwbG90bGliCittYXRwbG90 bGliLnVzZSgnQWdnJykKK2ltcG9ydCBtYXRwbG90bGliLnB5cGxvdCBhcyBwbHQKK2Zyb20gcGF0 aGxpYiBpbXBvcnQgUGF0aAorCisKK2RlZiBnZW9tc3BhY2VfaW50KHN0YXJ0LCBzdG9wLCBudW0p OgorICAgICIiIkdlbmVyYXRlIGdlb21ldHJpY2FsbHkgc3BhY2VkIGludGVnZXJzLCBwdXNoaW5n IGR1cGxpY2F0ZXMgZm9yd2FyZC4iIiIKKyAgICByYXcgPSBucC5nZW9tc3BhY2Uoc3RhcnQsIHN0 b3AsIG51bSkKKyAgICByZXN1bHQgPSBbXQorICAgIGZvciB2IGluIHJhdzoKKyAgICAgICAgY2Fu ZGlkYXRlID0gbWF4KGludChyb3VuZCh2KSksIHJlc3VsdFstMV0gKyAxIGlmIHJlc3VsdCBlbHNl IDEpCisgICAgICAgIHJlc3VsdC5hcHBlbmQoY2FuZGlkYXRlKQorICAgIHJldHVybiByZXN1bHQK KworCitkZWYgZW5zdXJlX3Rlc3RfdGFibGUoY29ubiwgdGFibGVfbmFtZSwgbWluX2Jsb2Nrcyk6 CisgICAgIiIiQ3JlYXRlIGEgdGFibGUgd2l0aCBlbm91Z2ggYmxvY2tzIGZvciB0aGUgYmVuY2ht YXJrLiIiIgorICAgIHJvd3NfbmVlZGVkID0gbWluX2Jsb2NrcyAqIDIyNiArIDEwMDAwCisgICAg cHJpbnQoZiJDcmVhdGluZyB0YWJsZSB7dGFibGVfbmFtZX0gd2l0aCB+e21pbl9ibG9ja3N9IGJs b2Nrcy4uLiIpCisgICAgY29ubi5leGVjdXRlKHRleHQoZiJEUk9QIFRBQkxFIElGIEVYSVNUUyB7 dGFibGVfbmFtZX0iKSkKKyAgICBjb25uLmV4ZWN1dGUodGV4dChmIkNSRUFURSBVTkxPR0dFRCBU QUJMRSB7dGFibGVfbmFtZX0gQVMgU0VMRUNUIGdlbmVyYXRlX3NlcmllcygxLCB7cm93c19uZWVk ZWR9KSBBUyBpZCIpKQorICAgIHJlc3VsdCA9IGNvbm4uZXhlY3V0ZSh0ZXh0KGYiU0VMRUNUIHBn X3JlbGF0aW9uX3NpemUoJ3t0YWJsZV9uYW1lfScpIC8gODE5MiBhcyBibG9ja3MiKSkuZmV0Y2hv bmUoKQorICAgIGFzc2VydCByZXN1bHRbMF0gPj0gbWluX2Jsb2NrcywgZiJUYWJsZSB7dGFibGVf bmFtZX0gaGFzIHtyZXN1bHRbMF19IGJsb2NrcywgZXhwZWN0ZWQgYXQgbGVhc3Qge21pbl9ibG9j a3N9IgorCitkZWYgcnVuX2JlbmNobWFyayhjb25uLCBmdW5jX3RlbXBsYXRlLCBidWZmZXJfY291 bnRzKToKKyAgICAiIiJSdW4gYSBiZW5jaG1hcmsgZnVuY3Rpb24gYWNyb3NzIGFsbCBidWZmZXIg Y291bnRzIGFuZCBwYXR0ZXJucyBpbiBvbmUgcXVlcnkuIiIiCisgICAgYXJyYXlfc3RyID0gc3Ry KGJ1ZmZlcl9jb3VudHMpCisgICAgc3FsID0gdGV4dChmIiIiCisgICAgICAgIFNFTEVDVAorICAg ICAgICAgICAgQ0FTRSBXSEVOIHIucmFuZG9tIFRIRU4gJ3JhbmRvbScgRUxTRSAnc2VxdWVudGlh bCcgRU5EIGFzIHBhdHRlcm4sCisgICAgICAgICAgICBiLm51bV9idWZmZXJzLAorICAgICAgICAg ICAgcGVyY2VudGlsZV9jb250KDAuNSkgV0lUSElOIEdST1VQIChPUkRFUiBCWSBiZW5jaC5wZXJf b3BfbnMpIGFzIG1lZGlhbl9ucworICAgICAgICBGUk9NCisgICAgICAgICAgICB1bm5lc3QoQVJS QVlbZmFsc2UsIHRydWVdKSBBUyByKHJhbmRvbSksCisgICAgICAgICAgICB1bm5lc3QoQVJSQVlb e2FycmF5X3N0cn1dKSBBUyBiKG51bV9idWZmZXJzKSwKKyAgICAgICAgICAgIExBVEVSQUwge2Z1 bmNfdGVtcGxhdGV9IEFTIGJlbmNoCisgICAgICAgIFdIRVJFIGJlbmNoLml0ZXJhdGlvbiA+IDAK KyAgICAgICAgR1JPVVAgQlkgci5yYW5kb20sIGIubnVtX2J1ZmZlcnMKKyAgICAgICAgT1JERVIg Qlkgci5yYW5kb20sIGIubnVtX2J1ZmZlcnMKKyAgICAiIiIpCisgICAgcmV0dXJuIFtkaWN0KHJv dy5fbWFwcGluZykgZm9yIHJvdyBpbiBjb25uLmV4ZWN1dGUoc3FsKV0KKworCitkZWYgc2F2ZV9y ZXN1bHRzKHJlc3VsdHNfZGlyLCBuYW1lLCByZXN1bHRzX2RpY3QsIHRpdGxlKToKKyAgICAiIiJT YXZlIGJlbmNobWFyayByZXN1bHRzIHRvIENTViBhbmQgZ2VuZXJhdGUgU1ZHIHBsb3QuIiIiCisg ICAgcmVzdWx0c19kaXIgPSBQYXRoKHJlc3VsdHNfZGlyKQorICAgIHJlc3VsdHNfZGlyLm1rZGly KHBhcmVudHM9VHJ1ZSwgZXhpc3Rfb2s9VHJ1ZSkKKworICAgIGFsbF9kYXRhID0gW10KKyAgICBm b3IgYmVuY2hfbmFtZSwgZGF0YSBpbiByZXN1bHRzX2RpY3QuaXRlbXMoKToKKyAgICAgICAgZGYg PSBwZC5EYXRhRnJhbWUoZGF0YSkKKyAgICAgICAgZGZbJ2JlbmNobWFyayddID0gYmVuY2hfbmFt ZQorICAgICAgICBhbGxfZGF0YS5hcHBlbmQoZGYpCisKKyAgICBjb21iaW5lZF9kZiA9IHBkLmNv bmNhdChhbGxfZGF0YSwgaWdub3JlX2luZGV4PVRydWUpCisKKyAgICBjc3ZfcGF0aCA9IHJlc3Vs dHNfZGlyIC8gZiJ7bmFtZX0uY3N2IgorICAgIGNvbWJpbmVkX2RmLnRvX2Nzdihjc3ZfcGF0aCwg aW5kZXg9RmFsc2UpCisgICAgcHJpbnQoZiJTYXZlZCBDU1Y6IHtjc3ZfcGF0aH0iKQorICAgIHJl dHVybiBjb21iaW5lZF9kZgorCisKK2RlZiBwbG90X3Jlc3VsdHMocmVzdWx0c19kaXIsIG5hbWUs IHJlc3VsdHNfZGljdCwgdGl0bGUpOgorICAgICIiIkdlbmVyYXRlIFNWRyBwbG90IGZyb20gYmVu Y2htYXJrIHJlc3VsdHMuIiIiCisgICAgcmVzdWx0c19kaXIgPSBQYXRoKHJlc3VsdHNfZGlyKQor CisgICAgZmlnLCBheCA9IHBsdC5zdWJwbG90cyhmaWdzaXplPSgxMCwgNikpCisKKyAgICBiZW5j aG1hcmtzID0gWworICAgICAgICAoJ3JlYWQnLCAnYmx1ZScsICdvJywgJ1JlYWRCdWZmZXIvUmVs ZWFzZUJ1ZmZlcicpLAorICAgICAgICAoJ3Bpbm5pbmcnLCAnZ3JlZW4nLCAncycsICdJbmNyQnVm ZmVyUmVmQ291bnQvUmVsZWFzZUJ1ZmZlcicpLAorICAgICAgICAoJ2xvY2tpbmcnLCAncHVycGxl JywgJ2QnLCAnTG9ja0J1ZmZlci9VbmxvY2tCdWZmZXInKSwKKyAgICAgICAgKCdyZXNvd25lcics ICdyZWQnLCAnXicsICdSZXNvdXJjZU93bmVyIFJlbWVtYmVyL0ZvcmdldCcpLAorICAgIF0KKwor ICAgIGZvciBiZW5jaF9uYW1lLCBjb2xvciwgbWFya2VyLCBsYWJlbCBpbiBiZW5jaG1hcmtzOgor ICAgICAgICBpZiBiZW5jaF9uYW1lIG5vdCBpbiByZXN1bHRzX2RpY3Q6CisgICAgICAgICAgICBj b250aW51ZQorICAgICAgICBkZiA9IHBkLkRhdGFGcmFtZShyZXN1bHRzX2RpY3RbYmVuY2hfbmFt ZV0pCisKKyAgICAgICAgc2VxX2RhdGEgPSBkZltkZlsncGF0dGVybiddID09ICdzZXF1ZW50aWFs J10KKyAgICAgICAgYXgucGxvdChzZXFfZGF0YVsnbnVtX2J1ZmZlcnMnXSwgc2VxX2RhdGFbJ21l ZGlhbl9ucyddLAorICAgICAgICAgICAgICAgIGNvbG9yPWNvbG9yLCBsaW5lc3R5bGU9Jy0nLCBt YXJrZXI9bWFya2VyLAorICAgICAgICAgICAgICAgIGxpbmV3aWR0aD0yLCBtYXJrZXJzaXplPTYs IGxhYmVsPWYne2xhYmVsfSAoc2VxKScpCisKKyAgICAgICAgcmFuZF9kYXRhID0gZGZbZGZbJ3Bh dHRlcm4nXSA9PSAncmFuZG9tJ10KKyAgICAgICAgYXgucGxvdChyYW5kX2RhdGFbJ251bV9idWZm ZXJzJ10sIHJhbmRfZGF0YVsnbWVkaWFuX25zJ10sCisgICAgICAgICAgICAgICAgY29sb3I9Y29s b3IsIGxpbmVzdHlsZT0nLS0nLCBtYXJrZXI9bWFya2VyLAorICAgICAgICAgICAgICAgIGxpbmV3 aWR0aD0yLCBtYXJrZXJzaXplPTYsIGxhYmVsPWYne2xhYmVsfSAocmFuZCknKQorCisgICAgYXgu c2V0X3hsYWJlbCgnTnVtYmVyIG9mIEJ1ZmZlcnMgKHNsaWRpbmcgd2luZG93KScpCisgICAgYXgu c2V0X3lsYWJlbCgnVGltZSBwZXIgb3BlcmF0aW9uIChucyknKQorICAgIGF4LnNldF90aXRsZSh0 aXRsZSkKKyAgICBheC5zZXRfeWxpbSgwLCBOb25lKQorICAgIGF4LmdyaWQoVHJ1ZSwgYWxwaGE9 MC4zKQorICAgIGF4LnNldF94c2NhbGUoJ2xvZycsIGJhc2U9MikKKyAgICBheC5sZWdlbmQoZm9u dHNpemU9OCwgbG9jPSd1cHBlciBsZWZ0JykKKworICAgIHBsdC50aWdodF9sYXlvdXQoKQorICAg IHN2Z19wYXRoID0gcmVzdWx0c19kaXIgLyBmIntuYW1lfS5zdmciCisgICAgcGx0LnNhdmVmaWco c3ZnX3BhdGgsIGZvcm1hdD0nc3ZnJykKKyAgICBwbHQuY2xvc2UoKQorICAgIHByaW50KGYiU2F2 ZWQgU1ZHOiB7c3ZnX3BhdGh9IikKKworCitkZWYgbWFpbigpOgorICAgIHBhcnNlciA9IGFyZ3Bh cnNlLkFyZ3VtZW50UGFyc2VyKGRlc2NyaXB0aW9uPSdCdWZmZXIgcGlubmluZyBiZW5jaG1hcmsn KQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJy0taXRlcmF0aW9ucycsICctbicsIHR5cGU9aW50 LCBkZWZhdWx0PTEwMDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nTnVtYmVyIG9m IG9wZXJhdGlvbnMgcGVyIHNhbXBsZSAoZGVmYXVsdDogMTAwMDApJykKKyAgICBwYXJzZXIuYWRk X2FyZ3VtZW50KCctLXNhbXBsZXMnLCB0eXBlPWludCwgZGVmYXVsdD01MCwKKyAgICAgICAgICAg ICAgICAgICAgICAgIGhlbHA9J051bWJlciBvZiBzYW1wbGVzIHBlciBkYXRhIHBvaW50IChkZWZh dWx0OiA1MCknKQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJy0tcG9ydCcsIHR5cGU9aW50LCBk ZWZhdWx0PTU0MzIsCisgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdQb3N0Z3JlU1FMIHBv cnQgKGRlZmF1bHQ6IDU0MzIpJykKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctLXBvaW50cycs IHR5cGU9aW50LCBkZWZhdWx0PTUwLAorICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nTnVt YmVyIG9mIGRhdGEgcG9pbnRzIChkZWZhdWx0OiAyMDApJykKKyAgICBwYXJzZXIuYWRkX2FyZ3Vt ZW50KCctLW1heC1kaXN0JywgdHlwZT1pbnQsIGRlZmF1bHQ9NTAwLAorICAgICAgICAgICAgICAg ICAgICAgICAgaGVscD0nTWF4aW11bSBidWZmZXIgY291bnQgdG8gdGVzdCAoZGVmYXVsdDogNTEy KScpCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1uYW1lJywgZGVmYXVsdD0nYmVuY2htYXJr JywKKyAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J05hbWUgZm9yIG91dHB1dCBmaWxlcyAo ZGVmYXVsdDogYmVuY2htYXJrKScpCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS10aXRsZScs IGRlZmF1bHQ9J1Bvc3RncmVTUUwgQnVmZmVyIFBpbm5pbmcgUGVyZm9ybWFuY2UnLAorICAgICAg ICAgICAgICAgICAgICAgICAgaGVscD0nVGl0bGUgZm9yIHRoZSBwbG90JykKKyAgICBwYXJzZXIu YWRkX2FyZ3VtZW50KCctLXJlc3VsdHMtZGlyJywgZGVmYXVsdD1Ob25lLAorICAgICAgICAgICAg ICAgICAgICAgICAgaGVscD0nRGlyZWN0b3J5IGZvciByZXN1bHRzIChkZWZhdWx0OiAuL3Jlc3Vs dHMpJykKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctLXRhYmxlJywgZGVmYXVsdD0nYmVuY2hf bGFyZ2UnLAorICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nVGFibGUgbmFtZSB0byB1c2Ug Zm9yIGJlbmNobWFya3MgKGRlZmF1bHQ6IGJlbmNoX2xhcmdlKScpCisgICAgYXJncyA9IHBhcnNl ci5wYXJzZV9hcmdzKCkKKworICAgIGlmIGFyZ3MucmVzdWx0c19kaXIgaXMgTm9uZToKKyAgICAg ICAgYXJncy5yZXN1bHRzX2RpciA9IFBhdGgoX19maWxlX18pLnBhcmVudCAvICdyZXN1bHRzJwor CisgICAgZW5naW5lID0gY3JlYXRlX2VuZ2luZShmJ3Bvc3RncmVzcWw6Ly9sb2NhbGhvc3Q6e2Fy Z3MucG9ydH0vcG9zdGdyZXMnKQorICAgIGJ1ZmZlcl9jb3VudHMgPSBnZW9tc3BhY2VfaW50KDEs IGFyZ3MubWF4X2Rpc3QsIGFyZ3MucG9pbnRzKQorCisgICAgbWluX2Jsb2Nrc19uZWVkZWQgPSBh cmdzLm1heF9kaXN0ICsgMTAwCisKKyAgICB3aXRoIGVuZ2luZS5jb25uZWN0KCkuZXhlY3V0aW9u X29wdGlvbnMoaXNvbGF0aW9uX2xldmVsPSJBVVRPQ09NTUlUIikgYXMgY29ubjoKKyAgICAgICAg Y29ubi5leGVjdXRlKHRleHQoIkNSRUFURSBFWFRFTlNJT04gSUYgTk9UIEVYSVNUUyB0ZXN0X2J1 ZmZlcl9waW4iKSkKKyAgICAgICAgZW5zdXJlX3Rlc3RfdGFibGUoY29ubiwgYXJncy50YWJsZSwg bWluX2Jsb2Nrc19uZWVkZWQpCisKKworICAgICAgICBuLCBzID0gYXJncy5pdGVyYXRpb25zLCBh cmdzLnNhbXBsZXMKKyAgICAgICAgcHJpbnQoZiJcblJ1bm5pbmcgYmVuY2htYXJrczoge259IGl0 ZXJhdGlvbnMsIHtzfSBzYW1wbGVzLCBtYXgge2FyZ3MubWF4X2Rpc3R9IGJ1ZmZlcnMiKQorCisg ICAgICAgIHJlc3VsdHMgPSB7fQorCisgICAgICAgIHByaW50KCIgIFJ1bm5pbmc6IGJlbmNoX3Bp bm5pbmcuLi4iKQorICAgICAgICByZXN1bHRzWydwaW5uaW5nJ10gPSBydW5fYmVuY2htYXJrKGNv bm4sCisgICAgICAgICAgICBmImJlbmNoX3Bpbm5pbmcoJ3thcmdzLnRhYmxlfScsIGIubnVtX2J1 ZmZlcnMsIHtufSwge3N9LCByLnJhbmRvbSkiLAorICAgICAgICAgICAgYnVmZmVyX2NvdW50cykK KworICAgICAgICBwcmludCgiICBSdW5uaW5nOiBiZW5jaF9sb2NraW5nLi4uIikKKyAgICAgICAg cmVzdWx0c1snbG9ja2luZyddID0gcnVuX2JlbmNobWFyayhjb25uLAorICAgICAgICAgICAgZiJi ZW5jaF9sb2NraW5nKCd7YXJncy50YWJsZX0nLCBiLm51bV9idWZmZXJzLCB7bn0sIHtzfSwgci5y YW5kb20pIiwKKyAgICAgICAgICAgIGJ1ZmZlcl9jb3VudHMpCisKKyAgICAgICAgcHJpbnQoIiAg UnVubmluZzogYmVuY2hfcHJlZmV0Y2hfcGlwZWxpbmUuLi4iKQorICAgICAgICByZXN1bHRzWydy ZWFkJ10gPSBydW5fYmVuY2htYXJrKGNvbm4sCisgICAgICAgICAgICBmImJlbmNoX3ByZWZldGNo X3BpcGVsaW5lKCd7YXJncy50YWJsZX0nLCBiLm51bV9idWZmZXJzLCB7bn0sIHtzfSwgci5yYW5k b20pIiwKKyAgICAgICAgICAgIGJ1ZmZlcl9jb3VudHMpCisKKyAgICAgICAgcHJpbnQoIiAgUnVu bmluZzogYmVuY2hfcmVzb3duZXIuLi4iKQorICAgICAgICByZXN1bHRzWydyZXNvd25lciddID0g cnVuX2JlbmNobWFyayhjb25uLAorICAgICAgICAgICAgZiJiZW5jaF9yZXNvd25lcihiLm51bV9i dWZmZXJzLCB7bn0sIHtzfSwgci5yYW5kb20pIiwKKyAgICAgICAgICAgIGJ1ZmZlcl9jb3VudHMp CisKKyAgICBzYXZlX3Jlc3VsdHMoYXJncy5yZXN1bHRzX2RpciwgYXJncy5uYW1lLCByZXN1bHRz LCBhcmdzLnRpdGxlKQorICAgIHBsb3RfcmVzdWx0cyhhcmdzLnJlc3VsdHNfZGlyLCBhcmdzLm5h bWUsIHJlc3VsdHMsIGFyZ3MudGl0bGUpCisKKyAgICBwcmludChmIlxuRG9uZSEgUmVzdWx0cyBz YXZlZCB0byB7YXJncy5yZXN1bHRzX2Rpcn0ve2FyZ3MubmFtZX0uKiIpCisKKworaWYgX19uYW1l X18gPT0gJ19fbWFpbl9fJzoKKyAgICBtYWluKCkKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L21vZHVs ZXMvdGVzdF9idWZmZXJfcGluL3JlcXVpcmVtZW50cy50eHQgYi9zcmMvdGVzdC9tb2R1bGVzL3Rl c3RfYnVmZmVyX3Bpbi9yZXF1aXJlbWVudHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4 IDAwMDAwMDAwMDAwLi5lNzNhYjU2OTI3NQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L21v ZHVsZXMvdGVzdF9idWZmZXJfcGluL3JlcXVpcmVtZW50cy50eHQKQEAgLTAsMCArMSw5IEBACisj IFJlcXVpcmVtZW50cyBmb3IgYmVuY2htYXJrLnB5CisjIHBpcCBpbnN0YWxsIC1yIHJlcXVpcmVt ZW50cy50eHQKKyPCoG5vdCBlbmZvcmNpbmcgdmVyc2lvbnMsIGFzIGl0IG1pZ2h0IHNpbXBseQor I8Kgd29yayB3aXRoIHlvdXIgaW5zdGFsbGVkIHZlcnNpb25zCitudW1weSAgICAgICAgICAgICMg dGVzdGVkIHdpdGggMS4yNCsKK3BhbmRhcyAgICAgICAgICAgIyB0ZXN0ZWQgd2l0aCAyLjArCitz cWxhbGNoZW15ICAgICAgICMgdGVzdGVkIHdpdGggMi4wKworbWF0cGxvdGxpYiAgICAgICAjIHRl c3RlZCB3aXRoIDMuNysKK3BzeWNvcGcyLWJpbmFyeSAgIyB0ZXN0ZWQgd2l0aCAyLjkrCmRpZmYg LS1naXQgYS9zcmMvdGVzdC9tb2R1bGVzL3Rlc3RfYnVmZmVyX3Bpbi90ZXN0X2J1ZmZlcl9waW4t LTEuMC5zcWwgYi9zcmMvdGVzdC9tb2R1bGVzL3Rlc3RfYnVmZmVyX3Bpbi90ZXN0X2J1ZmZlcl9w aW4tLTEuMC5zcWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAuLjJmYjU1 NzdmYWMyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvbW9kdWxlcy90ZXN0X2J1ZmZlcl9w aW4vdGVzdF9idWZmZXJfcGluLS0xLjAuc3FsCkBAIC0wLDAgKzEsODggQEAKKy8qIHRlc3RfYnVm ZmVyX3Bpbi0tMS4wLnNxbCAqLworCistLSBjb21wbGFpbiBpZiBzY3JpcHQgaXMgc291cmNlZCBp biBwc3FsLCByYXRoZXIgdGhhbiB2aWEgQ1JFQVRFIEVYVEVOU0lPTgorXGVjaG8gVXNlICJDUkVB VEUgRVhURU5TSU9OIHRlc3RfYnVmZmVyX3BpbiIgdG8gbG9hZCB0aGlzIGZpbGUuIFxxdWl0CisK K0NSRUFURSBGVU5DVElPTiBiZW5jaF9wcmVmZXRjaF9waXBlbGluZSgKKyAgICByZWxuYW1lIHRl eHQsCisgICAgcHJlZmV0Y2hfZGlzdCBpbnQsCisgICAgbnVtX29wcyBpbnQsCisgICAgaXRlcmF0 aW9ucyBpbnQsCisgICAgcmFuZG9tX2FjY2VzcyBib29sCispCitSRVRVUk5TIFRBQkxFKGl0ZXJh dGlvbiBpbnQsIHRvdGFsX25zIGJpZ2ludCwgcGVyX29wX25zIGZsb2F0OCkKK0FTICdNT0RVTEVf UEFUSE5BTUUnLCAnYmVuY2hfcHJlZmV0Y2hfcGlwZWxpbmUnCitMQU5HVUFHRSBDIFNUUklDVDsK KworQ09NTUVOVCBPTiBGVU5DVElPTiBiZW5jaF9wcmVmZXRjaF9waXBlbGluZSBJUworJ0JlbmNo bWFyayBidWZmZXIgcGlubmluZyB3aXRoIHNsaWRpbmcgd2luZG93IHByZWZldGNoIHNpbXVsYXRp b24uCitBcmd1bWVudHM6CisgIHJlbG5hbWUgICAgICAgIC0gbmFtZSBvZiB0aGUgcmVsYXRpb24g dG8gdXNlCisgIHByZWZldGNoX2Rpc3QgIC0gbnVtYmVyIG9mIGJ1ZmZlcnMgdG8ga2VlcCBwaW5u ZWQgKHNsaWRpbmcgd2luZG93IHNpemUpCisgIG51bV9vcHMgICAgICAgIC0gbnVtYmVyIG9mIHBp bi91bnBpbiBvcGVyYXRpb25zIHRvIHBlcmZvcm0KKyAgaXRlcmF0aW9ucyAgICAgLSBudW1iZXIg b2YgdGltZXMgdG8gcmVwZWF0IHRoZSBiZW5jaG1hcmsKKyAgcmFuZG9tX2FjY2VzcyAgLSBpZiB0 cnVlLCBhY2Nlc3MgYmxvY2tzIHJhbmRvbWx5OyBpZiBmYWxzZSwgc2VxdWVudGlhbGx5CisnOwor CitDUkVBVEUgRlVOQ1RJT04gYmVuY2hfcGlubmluZygKKyAgICByZWxuYW1lIHRleHQsCisgICAg bnVtX2J1ZmZlcnMgaW50LAorICAgIG51bV9vcHMgaW50LAorICAgIGl0ZXJhdGlvbnMgaW50LAor ICAgIHJhbmRvbV9hY2Nlc3MgYm9vbAorKQorUkVUVVJOUyBUQUJMRShpdGVyYXRpb24gaW50LCB0 b3RhbF9ucyBiaWdpbnQsIHBlcl9vcF9ucyBmbG9hdDgpCitBUyAnTU9EVUxFX1BBVEhOQU1FJywg J2JlbmNoX3Bpbm5pbmcnCitMQU5HVUFHRSBDIFNUUklDVDsKKworQ09NTUVOVCBPTiBGVU5DVElP TiBiZW5jaF9waW5uaW5nIElTCisnQmVuY2htYXJrIHB1cmUgcGluL3VucGluIG9wZXJhdGlvbnMg d2l0aG91dCBidWZmZXIgbG9va3VwLgorVXNlcyBJbmNyQnVmZmVyUmVmQ291bnQvUmVsZWFzZUJ1 ZmZlciBvbiBwcmUtcGlubmVkIGJ1ZmZlcnMgdG8gaXNvbGF0ZQorcmVmY291bnQgdHJhY2tpbmcg b3ZlcmhlYWQgZnJvbSBidWZmZXIgdGFibGUgbG9va3VwcyBhbmQgSS9PLgorQXJndW1lbnRzOgor ICByZWxuYW1lICAgICAgIC0gbmFtZSBvZiB0aGUgcmVsYXRpb24gdG8gdXNlIGZvciBwaW5uaW5n IGJ1ZmZlcnMKKyAgbnVtX2J1ZmZlcnMgICAtIG51bWJlciBvZiBidWZmZXJzIHRvIGtlZXAgYXMg YmFzZSBwaW5zCisgIG51bV9vcHMgICAgICAgLSBudW1iZXIgb2YgcGluL3VucGluIHBhaXJzIHRv IHBlcmZvcm0KKyAgaXRlcmF0aW9ucyAgICAtIG51bWJlciBvZiB0aW1lcyB0byByZXBlYXQgdGhl IGJlbmNobWFyaworICByYW5kb21fYWNjZXNzIC0gaWYgdHJ1ZSwgYWNjZXNzIGJ1ZmZlcnMgcmFu ZG9tbHk7IGlmIGZhbHNlLCBzZXF1ZW50aWFsbHknOworCitDUkVBVEUgRlVOQ1RJT04gYmVuY2hf bG9ja2luZygKKyAgICByZWxuYW1lIHRleHQsCisgICAgbnVtX2J1ZmZlcnMgaW50LAorICAgIG51 bV9vcHMgaW50LAorICAgIGl0ZXJhdGlvbnMgaW50LAorICAgIHJhbmRvbV9hY2Nlc3MgYm9vbAor KQorUkVUVVJOUyBUQUJMRShpdGVyYXRpb24gaW50LCB0b3RhbF9ucyBiaWdpbnQsIHBlcl9vcF9u cyBmbG9hdDgpCitBUyAnTU9EVUxFX1BBVEhOQU1FJywgJ2JlbmNoX2xvY2tpbmcnCitMQU5HVUFH RSBDIFNUUklDVDsKKworQ09NTUVOVCBPTiBGVU5DVElPTiBiZW5jaF9sb2NraW5nIElTCisnQmVu Y2htYXJrIGJ1ZmZlciBsb2NrL3VubG9jayBvcGVyYXRpb25zLgorUHJlLXBpbnMgYWxsIGJsb2Nr cyB0aGVuIHRpbWVzIExvY2tCdWZmZXIvVW5sb2NrQnVmZmVyIGN5Y2xlcyBvdmVyCitkaWZmZXJl bnQgYnVmZmVycyB0byBtZWFzdXJlIGxvY2tpbmcgb3ZlcmhlYWQgc2VwYXJhdGVseSBmcm9tIHBp bm5pbmcuCitBcmd1bWVudHM6CisgIHJlbG5hbWUgICAgICAgLSBuYW1lIG9mIHRoZSByZWxhdGlv biB0byB1c2UKKyAgbnVtX2J1ZmZlcnMgICAtIHNsaWRpbmcgd2luZG93IHNpemUgZm9yIGxvY2tz CisgIG51bV9vcHMgICAgICAgLSBudW1iZXIgb2YgbG9jay91bmxvY2sgcGFpcnMgdG8gcGVyZm9y bQorICBpdGVyYXRpb25zICAgIC0gbnVtYmVyIG9mIHRpbWVzIHRvIHJlcGVhdCB0aGUgYmVuY2ht YXJrCisgIHJhbmRvbV9hY2Nlc3MgLSBpZiB0cnVlLCBhY2Nlc3MgYnVmZmVycyByYW5kb21seTsg aWYgZmFsc2UsIHNlcXVlbnRpYWxseSc7CisKK0NSRUFURSBGVU5DVElPTiBiZW5jaF9yZXNvd25l cigKKyAgICBudW1fYnVmZmVycyBpbnQsCisgICAgbnVtX29wcyBpbnQsCisgICAgaXRlcmF0aW9u cyBpbnQsCisgICAgcmFuZG9tX2FjY2VzcyBib29sCispCitSRVRVUk5TIFRBQkxFKGl0ZXJhdGlv biBpbnQsIHRvdGFsX25zIGJpZ2ludCwgcGVyX29wX25zIGZsb2F0OCkKK0FTICdNT0RVTEVfUEFU SE5BTUUnLCAnYmVuY2hfcmVzb3duZXInCitMQU5HVUFHRSBDIFNUUklDVDsKKworQ09NTUVOVCBP TiBGVU5DVElPTiBiZW5jaF9yZXNvd25lciBJUworJ0JlbmNobWFyayBSZXNvdXJjZU93bmVyIHJl bWVtYmVyL2ZvcmdldCBvcGVyYXRpb25zIG9ubHkuCitVc2VzIGZha2UgcmVzb3VyY2UgdmFsdWVz IC0gbm8gYWN0dWFsIHJlc291cmNlcyBhcmUgdHJhY2tlZC4KK0FyZ3VtZW50czoKKyAgbnVtX2J1 ZmZlcnMgICAtIG51bWJlciBvZiBmYWtlIHJlc291cmNlcyB0byB0cmFjaworICBudW1fb3BzICAg ICAgIC0gbnVtYmVyIG9mIHJlbWVtYmVyL2ZvcmdldCBwYWlycyB0byBwZXJmb3JtCisgIGl0ZXJh dGlvbnMgICAgLSBudW1iZXIgb2YgdGltZXMgdG8gcmVwZWF0IHRoZSBiZW5jaG1hcmsKKyAgcmFu ZG9tX2FjY2VzcyAtIGlmIHRydWUsIGFjY2VzcyByZXNvdXJjZXMgcmFuZG9tbHk7IGlmIGZhbHNl LCBzZXF1ZW50aWFsbHknOwpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvbW9kdWxlcy90ZXN0X2J1ZmZl cl9waW4vdGVzdF9idWZmZXJfcGluLmMgYi9zcmMvdGVzdC9tb2R1bGVzL3Rlc3RfYnVmZmVyX3Bp bi90ZXN0X2J1ZmZlcl9waW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAw MC4uZDVlNTk5NzRkY2IKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9tb2R1bGVzL3Rlc3Rf YnVmZmVyX3Bpbi90ZXN0X2J1ZmZlcl9waW4uYwpAQCAtMCwwICsxLDQyMSBAQAorLyoKKyAqIHRl c3RfYnVmZmVyX3Bpbi5jIC0gQnVmZmVyIHBpbm5pbmcgYmVuY2htYXJrCisgKi8KKworI2luY2x1 ZGUgInBvc3RncmVzLmgiCisKKyNpbmNsdWRlICJhY2Nlc3MvaGVhcGFtLmgiCisjaW5jbHVkZSAi Y2F0YWxvZy9uYW1lc3BhY2UuaCIKKyNpbmNsdWRlICJjb21tb24vcGdfcHJuZy5oIgorI2luY2x1 ZGUgImZtZ3IuaCIKKyNpbmNsdWRlICJmdW5jYXBpLmgiCisjaW5jbHVkZSAibWlzY2FkbWluLmgi CisjaW5jbHVkZSAicG9ydGFiaWxpdHkvaW5zdHJfdGltZS5oIgorI2luY2x1ZGUgInN0b3JhZ2Uv YnVmX2ludGVybmFscy5oIgorI2luY2x1ZGUgInN0b3JhZ2UvYnVmbWdyLmgiCisjaW5jbHVkZSAi dXRpbHMvYnVpbHRpbnMuaCIKKyNpbmNsdWRlICJ1dGlscy9yZWwuaCIKKyNpbmNsdWRlICJ1dGls cy9yZXNvd25lci5oIgorI2luY2x1ZGUgInV0aWxzL3ZhcmxlbmEuaCIKKworUEdfTU9EVUxFX01B R0lDOworCitQR19GVU5DVElPTl9JTkZPX1YxKGJlbmNoX3ByZWZldGNoX3BpcGVsaW5lKTsKK1BH X0ZVTkNUSU9OX0lORk9fVjEoYmVuY2hfcGlubmluZyk7CitQR19GVU5DVElPTl9JTkZPX1YxKGJl bmNoX2xvY2tpbmcpOworUEdfRlVOQ1RJT05fSU5GT19WMShiZW5jaF9yZXNvd25lcik7CisKKy8q IEN1c3RvbSBSZXNvdXJjZU93bmVyRGVzYyBmb3IgYmVuY2htYXJrIC0gZG9lcyBub3RoaW5nIG9u IHJlbGVhc2UgKi8KK3N0YXRpYyB2b2lkIGJlbmNoX3JlbGVhc2VfcmVzb3VyY2UoRGF0dW0gcmVz KSB7IC8qIG5vLW9wICovIH0KKworc3RhdGljIGNvbnN0IFJlc291cmNlT3duZXJEZXNjIGJlbmNo X3Jlc293bmVyX2Rlc2MgPSB7CisJLm5hbWUgPSAiQmVuY2htYXJrUmVzb3VyY2UiLAorCS5yZWxl YXNlX3BoYXNlID0gUkVTT1VSQ0VfUkVMRUFTRV9BRlRFUl9MT0NLUywKKwkucmVsZWFzZV9wcmlv cml0eSA9IFJFTEVBU0VfUFJJT19GSVJTVCwKKwkuUmVsZWFzZVJlc291cmNlID0gYmVuY2hfcmVs ZWFzZV9yZXNvdXJjZSwKKwkuRGVidWdQcmludCA9IE5VTEwsCit9OworCisvKgorICogR2VuZXJh dGUgYW4gYWNjZXNzIHNlcXVlbmNlIGZvciBiZW5jaG1hcmtpbmcuCisgKiBJZiByYW5kb21fYWNj ZXNzIGlzIHRydWUsIHVzZXMgRmlzaGVyLVlhdGVzIHNodWZmbGUuCisgKiBPdGhlcndpc2UsIGdl bmVyYXRlcyBzZXF1ZW50aWFsIHBhdHRlcm4gbW9kdWxvIG51bV9pdGVtcy4KKyAqLworc3RhdGlj IHZvaWQKK2dlbmVyYXRlX2FjY2Vzc19zZXF1ZW5jZShpbnQgKnNlcXVlbmNlLCBpbnQgbnVtX29w ZXJhdGlvbnMsIGludCBudW1faXRlbXMsIGJvb2wgcmFuZG9tX2FjY2VzcykKK3sKKwlmb3IgKGlu dCBpID0gMDsgaSA8IG51bV9vcGVyYXRpb25zOyBpKyspCisJCXNlcXVlbmNlW2ldID0gaSAlIG51 bV9pdGVtczsKKworCWlmIChyYW5kb21fYWNjZXNzKQorCXsKKwkJZm9yIChpbnQgaSA9IG51bV9v cGVyYXRpb25zIC0gMTsgaSA+IDA7IGktLSkKKwkJeworCQkJaW50IGogPSBwZ19wcm5nX3VpbnQ2 NF9yYW5nZSgmcGdfZ2xvYmFsX3Bybmdfc3RhdGUsIDAsIGkpOworCQkJaW50IHRtcCA9IHNlcXVl bmNlW2ldOworCQkJc2VxdWVuY2VbaV0gPSBzZXF1ZW5jZVtqXTsKKwkJCXNlcXVlbmNlW2pdID0g dG1wOworCQl9CisJfQorfQorCisKKy8qCisgKiBiZW5jaF9waW5uaW5nIC0gYmVuY2htYXJrIHB1 cmUgcGluL3VucGluIG9wZXJhdGlvbnMKKyAqCisgKiBXYXJtcyB1cCB0aGUgY2FjaGUgYnkgcmVh ZGluZyBhbGwgYmxvY2tzIGluIHRoZSByZWxhdGlvbi4KKyAqIFByZWNvbXB1dGUgYSBibG9jayBz ZXF1ZW5jZSBpbiB3aGljaCB0aGUgYnVmZmVycyB3aWxsIGJlIHJlYWQuCisgKiBUaGVuIHNjYW4g dGltZXMgcmVwZWF0ZWRseSBhIHNjYW4gZm9sbG93aW5nIHRoZSBibG9jayBzZXF1ZW5jZS4KKyAq IHdpdGggYSBmaXhlZCBkaXN0YW5jZSBvZiBgbnVtX2J1ZmZlcnNgIChwbHVzIHJhbXAgdXAgYW5k IHJhbXAgZG93bikKKyovCitEYXR1bQorYmVuY2hfcHJlZmV0Y2hfcGlwZWxpbmUoUEdfRlVOQ1RJ T05fQVJHUykKK3sKKwlSZXR1cm5TZXRJbmZvICpyc2luZm8gPSAoUmV0dXJuU2V0SW5mbyAqKSBm Y2luZm8tPnJlc3VsdGluZm87CisJdGV4dAkgICAqcmVsbmFtZV90ZXh0ID0gUEdfR0VUQVJHX1RF WFRfUFAoMCk7CisJaW50CQkJbnVtX2J1ZmZlcnMgPSBQR19HRVRBUkdfSU5UMzIoMSk7CisJaW50 CQkJbnVtX29wZXJhdGlvbnMgPSBQR19HRVRBUkdfSU5UMzIoMik7CisJaW50CQkJaXRlcmF0aW9u cyA9IFBHX0dFVEFSR19JTlQzMigzKTsKKwlib29sCQlyYW5kb21fYWNjZXNzID0gUEdfR0VUQVJH X0JPT0woNCk7CisKKwlPaWQJCQlyZWxpZDsKKwlSZWxhdGlvbglyZWw7CisJQmxvY2tOdW1iZXIg bmJsb2NrczsKKwlCdWZmZXIJICAgKnBpcGVsaW5lOworCWludAkJICAgKmJsb2NrX3NlcXVlbmNl OworCWludAkJCWl0ZXI7CisKKwlUdXBsZXN0b3Jlc3RhdGUgKnR1cHN0b3JlOworCVR1cGxlRGVz Ywl0dXBkZXNjOworCURhdHVtCQl2YWx1ZXNbM107CisJYm9vbAkJbnVsbHNbM10gPSB7ZmFsc2Us IGZhbHNlLCBmYWxzZX07CisKKwlpZiAobnVtX2J1ZmZlcnMgPCAxIHx8IG51bV9vcGVyYXRpb25z IDwgbnVtX2J1ZmZlcnMpCisJCWVyZXBvcnQoRVJST1IsIChlcnJtc2coImludmFsaWQgcGFyYW1l dGVycyIpKSk7CisKKwlJbml0TWF0ZXJpYWxpemVkU1JGKGZjaW5mbywgMCk7CisJdHVwc3RvcmUg PSByc2luZm8tPnNldFJlc3VsdDsKKwl0dXBkZXNjID0gcnNpbmZvLT5zZXREZXNjOworCisJcmVs aWQgPSBSYW5nZVZhckdldFJlbGlkKG1ha2VSYW5nZVZhckZyb21OYW1lTGlzdCh0ZXh0VG9RdWFs aWZpZWROYW1lTGlzdChyZWxuYW1lX3RleHQpKSwgQWNjZXNzU2hhcmVMb2NrLCBmYWxzZSk7CisJ cmVsID0gcmVsYXRpb25fb3BlbihyZWxpZCwgQWNjZXNzU2hhcmVMb2NrKTsKKwluYmxvY2tzID0g UmVsYXRpb25HZXROdW1iZXJPZkJsb2NrcyhyZWwpOworCisJaWYgKG5ibG9ja3MgPT0gMCkKKwkJ ZXJlcG9ydChFUlJPUiwgKGVycm1zZygicmVsYXRpb24gaGFzIG5vIGJsb2NrcyIpKSk7CisKKwlw aXBlbGluZSA9IHBhbGxvYzAobnVtX2J1ZmZlcnMgKiBzaXplb2YoQnVmZmVyKSk7CisJYmxvY2tf c2VxdWVuY2UgPSBwYWxsb2MobnVtX29wZXJhdGlvbnMgKiBzaXplb2YoaW50KSk7CisKKwkvKiBX YXJtIHVwICovCisJZm9yIChpbnQgaSA9IDA7IGkgPCBudW1fb3BlcmF0aW9ucyAmJiBpIDwgKGlu dCkgbmJsb2NrczsgaSsrKQorCXsKKwkJQnVmZmVyIGJ1ZiA9IFJlYWRCdWZmZXIocmVsLCBpKTsK KwkJUmVsZWFzZUJ1ZmZlcihidWYpOworCX0KKwlnZW5lcmF0ZV9hY2Nlc3Nfc2VxdWVuY2UoYmxv Y2tfc2VxdWVuY2UsIG51bV9vcGVyYXRpb25zLCBuYmxvY2tzLCByYW5kb21fYWNjZXNzKTsKKwor CWZvciAoaXRlciA9IDA7IGl0ZXIgPCBpdGVyYXRpb25zOyBpdGVyKyspCisJeworCQlpbnN0cl90 aW1lCXN0YXJ0X3RpbWUsIGVuZF90aW1lOworCQlpbnQ2NAkJZWxhcHNlZF9uczsKKworCQlJTlNU Ul9USU1FX1NFVF9DVVJSRU5UKHN0YXJ0X3RpbWUpOworCisJCWZvciAoaW50IGkgPSAwOyBpIDwg bnVtX29wZXJhdGlvbnMgKyBudW1fYnVmZmVyczsgaSsrKQorCQl7CisJCQlpZiAoaSA+PSBudW1f YnVmZmVycykKKwkJCQlSZWxlYXNlQnVmZmVyKHBpcGVsaW5lWyhpIC0gbnVtX2J1ZmZlcnMpICUg bnVtX2J1ZmZlcnNdKTsKKwkJCWlmIChpIDwgbnVtX29wZXJhdGlvbnMpCisJCQkJcGlwZWxpbmVb aSAlIG51bV9idWZmZXJzXSA9IFJlYWRCdWZmZXIocmVsLCBibG9ja19zZXF1ZW5jZVtpXSk7CisJ CX0KKworCQlJTlNUUl9USU1FX1NFVF9DVVJSRU5UKGVuZF90aW1lKTsKKwkJSU5TVFJfVElNRV9T VUJUUkFDVChlbmRfdGltZSwgc3RhcnRfdGltZSk7CisJCWVsYXBzZWRfbnMgPSBJTlNUUl9USU1F X0dFVF9OQU5PU0VDKGVuZF90aW1lKTsKKworCQl2YWx1ZXNbMF0gPSBJbnQzMkdldERhdHVtKGl0 ZXIpOworCQl2YWx1ZXNbMV0gPSBJbnQ2NEdldERhdHVtKGVsYXBzZWRfbnMpOworCQl2YWx1ZXNb Ml0gPSBGbG9hdDhHZXREYXR1bSgoZG91YmxlKSBlbGFwc2VkX25zIC8gbnVtX29wZXJhdGlvbnMp OworCQl0dXBsZXN0b3JlX3B1dHZhbHVlcyh0dXBzdG9yZSwgdHVwZGVzYywgdmFsdWVzLCBudWxs cyk7CisJfQorCisJcGZyZWUocGlwZWxpbmUpOworCXBmcmVlKGJsb2NrX3NlcXVlbmNlKTsKKwly ZWxhdGlvbl9jbG9zZShyZWwsIEFjY2Vzc1NoYXJlTG9jayk7CisKKwlyZXR1cm4gKERhdHVtKSAw OworfQorCisvKgorICogYmVuY2hfcGlubmluZyAtIGJlbmNobWFyayBwdXJlIHBpbi91bnBpbiBv cGVyYXRpb25zCisgKgorICogUHJlLXJlYWRzIGJ1ZmZlcnMgaW50byBjYWNoZSwgdGhlbiB0aW1l cyBJbmNyQnVmZmVyUmVmQ291bnQvUmVsZWFzZUJ1ZmZlcgorICogY3ljbGVzIGluIGEgcGlwZWxp bmVkIGZhc2hpb24uIFRoaXMgaXMgaW50ZW5kZWQgdG8gc2VwYXJhdGUgdGhlCisgKiBwaW4gY291 bnQgZGVwZW5kZW50IHBhcnQgb2YgdGhlIFJlYWRCdWZmZXIvUmVsZWFzZUJ1ZmZlciBvcGVyYXRp b25zCisgKi8KK0RhdHVtCitiZW5jaF9waW5uaW5nKFBHX0ZVTkNUSU9OX0FSR1MpCit7CisJUmV0 dXJuU2V0SW5mbyAqcnNpbmZvID0gKFJldHVyblNldEluZm8gKikgZmNpbmZvLT5yZXN1bHRpbmZv OworCXRleHQJICAgKnJlbG5hbWVfdGV4dCA9IFBHX0dFVEFSR19URVhUX1BQKDApOworCWludAkJ CW51bV9idWZmZXJzID0gUEdfR0VUQVJHX0lOVDMyKDEpOworCWludAkJCW51bV9vcGVyYXRpb25z ID0gUEdfR0VUQVJHX0lOVDMyKDIpOworCWludAkJCWl0ZXJhdGlvbnMgPSBQR19HRVRBUkdfSU5U MzIoMyk7CisJYm9vbAkJcmFuZG9tX2FjY2VzcyA9IFBHX0dFVEFSR19CT09MKDQpOworCisJT2lk CQkJcmVsaWQ7CisJUmVsYXRpb24JcmVsOworCUJsb2NrTnVtYmVyIG5ibG9ja3M7CisJQnVmZmVy CSAgICpiYXNlX2J1ZmZlcnM7CisJQnVmZmVyCSAgICpwaXBlbGluZTsKKwlpbnQJCSAgICphY2Nl c3Nfc2VxdWVuY2U7CisJaW50CQkJaXRlcjsKKworCVR1cGxlc3RvcmVzdGF0ZSAqdHVwc3RvcmU7 CisJVHVwbGVEZXNjCXR1cGRlc2M7CisJRGF0dW0JCXZhbHVlc1szXTsKKwlib29sCQludWxsc1sz XSA9IHtmYWxzZSwgZmFsc2UsIGZhbHNlfTsKKworCWlmIChudW1fYnVmZmVycyA8IDEgfHwgbnVt X29wZXJhdGlvbnMgPCBudW1fYnVmZmVycykKKwkJZXJlcG9ydChFUlJPUiwgKGVycm1zZygiaW52 YWxpZCBwYXJhbWV0ZXJzIikpKTsKKworCUluaXRNYXRlcmlhbGl6ZWRTUkYoZmNpbmZvLCAwKTsK Kwl0dXBzdG9yZSA9IHJzaW5mby0+c2V0UmVzdWx0OworCXR1cGRlc2MgPSByc2luZm8tPnNldERl c2M7CisKKwlyZWxpZCA9IFJhbmdlVmFyR2V0UmVsaWQobWFrZVJhbmdlVmFyRnJvbU5hbWVMaXN0 KHRleHRUb1F1YWxpZmllZE5hbWVMaXN0KHJlbG5hbWVfdGV4dCkpLCBBY2Nlc3NTaGFyZUxvY2ss IGZhbHNlKTsKKwlyZWwgPSByZWxhdGlvbl9vcGVuKHJlbGlkLCBBY2Nlc3NTaGFyZUxvY2spOwor CW5ibG9ja3MgPSBSZWxhdGlvbkdldE51bWJlck9mQmxvY2tzKHJlbCk7CisKKwlpZiAoKEJsb2Nr TnVtYmVyKSBudW1fYnVmZmVycyA+IG5ibG9ja3MpCisJCWVyZXBvcnQoRVJST1IsIChlcnJtc2co Im5vdCBlbm91Z2ggYmxvY2tzIGluIHJlbGF0aW9uIikpKTsKKworCWJhc2VfYnVmZmVycyA9IHBh bGxvYyhudW1fYnVmZmVycyAqIHNpemVvZihCdWZmZXIpKTsKKwlwaXBlbGluZSA9IHBhbGxvYyhu dW1fYnVmZmVycyAqIHNpemVvZihCdWZmZXIpKTsKKwlhY2Nlc3Nfc2VxdWVuY2UgPSBwYWxsb2Mo bnVtX29wZXJhdGlvbnMgKiBzaXplb2YoaW50KSk7CisKKwlnZW5lcmF0ZV9hY2Nlc3Nfc2VxdWVu Y2UoYWNjZXNzX3NlcXVlbmNlLCBudW1fb3BlcmF0aW9ucywgbnVtX2J1ZmZlcnMsIHJhbmRvbV9h Y2Nlc3MpOworCisJLyogUGluIHRoZSBidWZmZXJzIGFzIGJhc2UgcGlucyAoa2VlcHMgdGhlbSBp biBjYWNoZSkgKi8KKwlmb3IgKGludCBpID0gMDsgaSA8IG51bV9idWZmZXJzOyBpKyspCisJCWJh c2VfYnVmZmVyc1tpXSA9IFJlYWRCdWZmZXIocmVsLCBpKTsKKworCWZvciAoaXRlciA9IDA7IGl0 ZXIgPCBpdGVyYXRpb25zOyBpdGVyKyspCisJeworCQlpbnN0cl90aW1lCXN0YXJ0X3RpbWUsIGVu ZF90aW1lOworCQlpbnQ2NAkJZWxhcHNlZF9uczsKKworCQlJTlNUUl9USU1FX1NFVF9DVVJSRU5U KHN0YXJ0X3RpbWUpOworCisJCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtX29wZXJhdGlvbnMgKyBu dW1fYnVmZmVyczsgaSsrKQorCQl7CisJCQlpZiAoaSA+PSBudW1fYnVmZmVycykKKwkJCQlSZWxl YXNlQnVmZmVyKHBpcGVsaW5lWyhpIC0gbnVtX2J1ZmZlcnMpICUgbnVtX2J1ZmZlcnNdKTsKKwkJ CWlmIChpIDwgbnVtX29wZXJhdGlvbnMpCisJCQl7CisJCQkJQnVmZmVyIGJ1ZiA9IGJhc2VfYnVm ZmVyc1thY2Nlc3Nfc2VxdWVuY2VbaV1dOworCQkJCUluY3JCdWZmZXJSZWZDb3VudChidWYpOwor CQkJCXBpcGVsaW5lW2kgJSBudW1fYnVmZmVyc10gPSBidWY7CisJCQl9CisJCX0KKworCQlJTlNU Ul9USU1FX1NFVF9DVVJSRU5UKGVuZF90aW1lKTsKKwkJSU5TVFJfVElNRV9TVUJUUkFDVChlbmRf dGltZSwgc3RhcnRfdGltZSk7CisJCWVsYXBzZWRfbnMgPSBJTlNUUl9USU1FX0dFVF9OQU5PU0VD KGVuZF90aW1lKTsKKworCQl2YWx1ZXNbMF0gPSBJbnQzMkdldERhdHVtKGl0ZXIpOworCQl2YWx1 ZXNbMV0gPSBJbnQ2NEdldERhdHVtKGVsYXBzZWRfbnMpOworCQl2YWx1ZXNbMl0gPSBGbG9hdDhH ZXREYXR1bSgoZG91YmxlKSBlbGFwc2VkX25zIC8gbnVtX29wZXJhdGlvbnMpOworCQl0dXBsZXN0 b3JlX3B1dHZhbHVlcyh0dXBzdG9yZSwgdHVwZGVzYywgdmFsdWVzLCBudWxscyk7CisJfQorCisJ LyogUmVsZWFzZSBiYXNlIHBpbnMgKi8KKwlmb3IgKGludCBpID0gMDsgaSA8IG51bV9idWZmZXJz OyBpKyspCisJCVJlbGVhc2VCdWZmZXIoYmFzZV9idWZmZXJzW2ldKTsKKworCXBmcmVlKGFjY2Vz c19zZXF1ZW5jZSk7CisJcGZyZWUocGlwZWxpbmUpOworCXBmcmVlKGJhc2VfYnVmZmVycyk7CisJ cmVsYXRpb25fY2xvc2UocmVsLCBBY2Nlc3NTaGFyZUxvY2spOworCisJcmV0dXJuIChEYXR1bSkg MDsKK30KKworLyoKKyAqIGJlbmNoX2xvY2tpbmcgLSBiZW5jaG1hcmsgYnVmZmVyIGxvY2svdW5s b2NrIG9wZXJhdGlvbnMKKyAqCisgKiBQcmUtcGlucyBhbGwgYmxvY2tzIHRvIGtlZXAgdGhlbSBp biBjYWNoZSwgdGhlbiB0aW1lcyBMb2NrQnVmZmVyL1VubG9ja0J1ZmZlcgorICogY3ljbGVzIGlu IGEgcGlwZWxpbmVkIGZhc2hpb24gb3ZlciBkaWZmZXJlbnQgYnVmZmVycy4gVGhpcyBtZWFzdXJl cyBsb2NraW5nCisgKiBvdmVyaGVhZCBzZXBhcmF0ZWx5IGZyb20gcGlubmluZywgd2hpbGUgYWNj ZXNzaW5nIG1hbnkgZGlmZmVyZW50IGJ1ZmZlcnMuCisgKi8KK0RhdHVtCitiZW5jaF9sb2NraW5n KFBHX0ZVTkNUSU9OX0FSR1MpCit7CisJUmV0dXJuU2V0SW5mbyAqcnNpbmZvID0gKFJldHVyblNl dEluZm8gKikgZmNpbmZvLT5yZXN1bHRpbmZvOworCXRleHQJICAgKnJlbG5hbWVfdGV4dCA9IFBH X0dFVEFSR19URVhUX1BQKDApOworCWludAkJCW51bV9idWZmZXJzID0gUEdfR0VUQVJHX0lOVDMy KDEpOworCWludAkJCW51bV9vcGVyYXRpb25zID0gUEdfR0VUQVJHX0lOVDMyKDIpOworCWludAkJ CWl0ZXJhdGlvbnMgPSBQR19HRVRBUkdfSU5UMzIoMyk7CisJYm9vbAkJcmFuZG9tX2FjY2VzcyA9 IFBHX0dFVEFSR19CT09MKDQpOworCisJT2lkCQkJcmVsaWQ7CisJUmVsYXRpb24JcmVsOworCUJs b2NrTnVtYmVyIG5ibG9ja3M7CisJQnVmZmVyCSAgICpiYXNlX2J1ZmZlcnM7CisJQnVmZmVyCSAg ICpwaXBlbGluZTsKKwlpbnQJCSAgICpibG9ja19zZXF1ZW5jZTsKKwlpbnQJCQlpdGVyOworCisJ VHVwbGVzdG9yZXN0YXRlICp0dXBzdG9yZTsKKwlUdXBsZURlc2MJdHVwZGVzYzsKKwlEYXR1bQkJ dmFsdWVzWzNdOworCWJvb2wJCW51bGxzWzNdID0ge2ZhbHNlLCBmYWxzZSwgZmFsc2V9OworCisJ aWYgKG51bV9idWZmZXJzIDwgMSB8fCBudW1fb3BlcmF0aW9ucyA8IG51bV9idWZmZXJzKQorCQll cmVwb3J0KEVSUk9SLCAoZXJybXNnKCJpbnZhbGlkIHBhcmFtZXRlcnMiKSkpOworCisJSW5pdE1h dGVyaWFsaXplZFNSRihmY2luZm8sIDApOworCXR1cHN0b3JlID0gcnNpbmZvLT5zZXRSZXN1bHQ7 CisJdHVwZGVzYyA9IHJzaW5mby0+c2V0RGVzYzsKKworCXJlbGlkID0gUmFuZ2VWYXJHZXRSZWxp ZChtYWtlUmFuZ2VWYXJGcm9tTmFtZUxpc3QodGV4dFRvUXVhbGlmaWVkTmFtZUxpc3QocmVsbmFt ZV90ZXh0KSksIEFjY2Vzc1NoYXJlTG9jaywgZmFsc2UpOworCXJlbCA9IHJlbGF0aW9uX29wZW4o cmVsaWQsIEFjY2Vzc1NoYXJlTG9jayk7CisJbmJsb2NrcyA9IFJlbGF0aW9uR2V0TnVtYmVyT2ZC bG9ja3MocmVsKTsKKworCWlmIChuYmxvY2tzID09IDApCisJCWVyZXBvcnQoRVJST1IsIChlcnJt c2coInJlbGF0aW9uIGhhcyBubyBibG9ja3MiKSkpOworCisJYmFzZV9idWZmZXJzID0gcGFsbG9j KG5ibG9ja3MgKiBzaXplb2YoQnVmZmVyKSk7CisJcGlwZWxpbmUgPSBwYWxsb2MobnVtX2J1ZmZl cnMgKiBzaXplb2YoQnVmZmVyKSk7CisJYmxvY2tfc2VxdWVuY2UgPSBwYWxsb2MobnVtX29wZXJh dGlvbnMgKiBzaXplb2YoaW50KSk7CisKKwkvKiBHZW5lcmF0ZSBhY2Nlc3MgcGF0dGVybiBvdmVy IGFsbCBibG9ja3MgKi8KKwlnZW5lcmF0ZV9hY2Nlc3Nfc2VxdWVuY2UoYmxvY2tfc2VxdWVuY2Us IG51bV9vcGVyYXRpb25zLCBuYmxvY2tzLCByYW5kb21fYWNjZXNzKTsKKworCS8qIFBpbiBBTEwg YmxvY2tzIGFzIGJhc2UgcGlucyB0byBrZWVwIHRoZW0gaW4gY2FjaGUgKi8KKwlmb3IgKEJsb2Nr TnVtYmVyIGkgPSAwOyBpIDwgbmJsb2NrczsgaSsrKQorCQliYXNlX2J1ZmZlcnNbaV0gPSBSZWFk QnVmZmVyKHJlbCwgaSk7CisKKwlmb3IgKGl0ZXIgPSAwOyBpdGVyIDwgaXRlcmF0aW9uczsgaXRl cisrKQorCXsKKwkJaW5zdHJfdGltZQlzdGFydF90aW1lLCBlbmRfdGltZTsKKwkJaW50NjQJCWVs YXBzZWRfbnM7CisKKwkJSU5TVFJfVElNRV9TRVRfQ1VSUkVOVChzdGFydF90aW1lKTsKKworCQlm b3IgKGludCBpID0gMDsgaSA8IG51bV9vcGVyYXRpb25zICsgbnVtX2J1ZmZlcnM7IGkrKykKKwkJ eworCQkJaWYgKGkgPj0gbnVtX2J1ZmZlcnMpCisJCQkJTG9ja0J1ZmZlcihwaXBlbGluZVsoaSAt IG51bV9idWZmZXJzKSAlIG51bV9idWZmZXJzXSwgQlVGRkVSX0xPQ0tfVU5MT0NLKTsKKwkJCWlm IChpIDwgbnVtX29wZXJhdGlvbnMpCisJCQl7CisJCQkJQnVmZmVyCQlidWYgPSBiYXNlX2J1ZmZl cnNbYmxvY2tfc2VxdWVuY2VbaV1dOworCisJCQkJTG9ja0J1ZmZlcihidWYsIEJVRkZFUl9MT0NL X1NIQVJFKTsKKwkJCQlwaXBlbGluZVtpICUgbnVtX2J1ZmZlcnNdID0gYnVmOworCQkJfQorCQl9 CisKKwkJSU5TVFJfVElNRV9TRVRfQ1VSUkVOVChlbmRfdGltZSk7CisJCUlOU1RSX1RJTUVfU1VC VFJBQ1QoZW5kX3RpbWUsIHN0YXJ0X3RpbWUpOworCQllbGFwc2VkX25zID0gSU5TVFJfVElNRV9H RVRfTkFOT1NFQyhlbmRfdGltZSk7CisKKwkJdmFsdWVzWzBdID0gSW50MzJHZXREYXR1bShpdGVy KTsKKwkJdmFsdWVzWzFdID0gSW50NjRHZXREYXR1bShlbGFwc2VkX25zKTsKKwkJdmFsdWVzWzJd ID0gRmxvYXQ4R2V0RGF0dW0oKGRvdWJsZSkgZWxhcHNlZF9ucyAvIG51bV9vcGVyYXRpb25zKTsK KwkJdHVwbGVzdG9yZV9wdXR2YWx1ZXModHVwc3RvcmUsIHR1cGRlc2MsIHZhbHVlcywgbnVsbHMp OworCX0KKworCS8qIFJlbGVhc2UgYWxsIGJhc2UgcGlucyAqLworCWZvciAoQmxvY2tOdW1iZXIg aSA9IDA7IGkgPCBuYmxvY2tzOyBpKyspCisJCVJlbGVhc2VCdWZmZXIoYmFzZV9idWZmZXJzW2ld KTsKKworCXBmcmVlKGJsb2NrX3NlcXVlbmNlKTsKKwlwZnJlZShwaXBlbGluZSk7CisJcGZyZWUo YmFzZV9idWZmZXJzKTsKKwlyZWxhdGlvbl9jbG9zZShyZWwsIEFjY2Vzc1NoYXJlTG9jayk7CisK KwlyZXR1cm4gKERhdHVtKSAwOworfQorCisvKgorICogYmVuY2hfcmVzb3duZXIgLSBiZW5jaG1h cmsgUmVzb3VyY2VPd25lciByZW1lbWJlci9mb3JnZXQgb3BlcmF0aW9ucworICoKKyAqIFVzZXMg ZmFrZSByZXNvdXJjZSB2YWx1ZXMgdG8gdGVzdCBwdXJlIFJlc291cmNlT3duZXIgdHJhY2tpbmcg b3ZlcmhlYWQKKyAqIHdpdGhvdXQgYW55IGFjdHVhbCByZXNvdXJjZSBvcGVyYXRpb25zLiBVc2Vz IHNhbWUgcGlwZWxpbmVkIHN0cnVjdHVyZS4KKyAqLworRGF0dW0KK2JlbmNoX3Jlc293bmVyKFBH X0ZVTkNUSU9OX0FSR1MpCit7CisJUmV0dXJuU2V0SW5mbyAqcnNpbmZvID0gKFJldHVyblNldElu Zm8gKikgZmNpbmZvLT5yZXN1bHRpbmZvOworCWludAkJCW51bV9idWZmZXJzID0gUEdfR0VUQVJH X0lOVDMyKDApOworCWludAkJCW51bV9vcGVyYXRpb25zID0gUEdfR0VUQVJHX0lOVDMyKDEpOwor CWludAkJCWl0ZXJhdGlvbnMgPSBQR19HRVRBUkdfSU5UMzIoMik7CisJYm9vbAkJcmFuZG9tX2Fj Y2VzcyA9IFBHX0dFVEFSR19CT09MKDMpOworCisJRGF0dW0JICAgKnJlc291cmNlczsKKwlEYXR1 bQkgICAqcGlwZWxpbmU7CisJaW50CQkgICAqYWNjZXNzX3NlcXVlbmNlOworCWludAkJCWl0ZXI7 CisKKwlUdXBsZXN0b3Jlc3RhdGUgKnR1cHN0b3JlOworCVR1cGxlRGVzYwl0dXBkZXNjOworCURh dHVtCQl2YWx1ZXNbM107CisJYm9vbAkJbnVsbHNbM10gPSB7ZmFsc2UsIGZhbHNlLCBmYWxzZX07 CisKKwlpZiAobnVtX2J1ZmZlcnMgPCAxIHx8IG51bV9vcGVyYXRpb25zIDwgbnVtX2J1ZmZlcnMp CisJCWVyZXBvcnQoRVJST1IsIChlcnJtc2coImludmFsaWQgcGFyYW1ldGVycyIpKSk7CisKKwlJ bml0TWF0ZXJpYWxpemVkU1JGKGZjaW5mbywgMCk7CisJdHVwc3RvcmUgPSByc2luZm8tPnNldFJl c3VsdDsKKwl0dXBkZXNjID0gcnNpbmZvLT5zZXREZXNjOworCisJcmVzb3VyY2VzID0gcGFsbG9j KG51bV9idWZmZXJzICogc2l6ZW9mKERhdHVtKSk7CisJcGlwZWxpbmUgPSBwYWxsb2MobnVtX2J1 ZmZlcnMgKiBzaXplb2YoRGF0dW0pKTsKKwlhY2Nlc3Nfc2VxdWVuY2UgPSBwYWxsb2MobnVtX29w ZXJhdGlvbnMgKiBzaXplb2YoaW50KSk7CisKKwkvKiBVc2UgZmFrZSByZXNvdXJjZSB2YWx1ZXMg KHBvaW50ZXJzIHRvIGFycmF5IGVsZW1lbnRzIGZvciB1bmlxdWVuZXNzKSAqLworCWZvciAoaW50 IGkgPSAwOyBpIDwgbnVtX2J1ZmZlcnM7IGkrKykKKwkJcmVzb3VyY2VzW2ldID0gUG9pbnRlckdl dERhdHVtKCZyZXNvdXJjZXNbaV0pOworCisJZ2VuZXJhdGVfYWNjZXNzX3NlcXVlbmNlKGFjY2Vz c19zZXF1ZW5jZSwgbnVtX29wZXJhdGlvbnMsIG51bV9idWZmZXJzLCByYW5kb21fYWNjZXNzKTsK KworCWZvciAoaXRlciA9IDA7IGl0ZXIgPCBpdGVyYXRpb25zOyBpdGVyKyspCisJeworCQlpbnN0 cl90aW1lCXN0YXJ0X3RpbWUsIGVuZF90aW1lOworCQlpbnQ2NAkJZWxhcHNlZF9uczsKKworCQlJ TlNUUl9USU1FX1NFVF9DVVJSRU5UKHN0YXJ0X3RpbWUpOworCisJCWZvciAoaW50IGkgPSAwOyBp IDwgbnVtX29wZXJhdGlvbnMgKyBudW1fYnVmZmVyczsgaSsrKQorCQl7CisJCQlpZiAoaSA+PSBu dW1fYnVmZmVycykKKwkJCQlSZXNvdXJjZU93bmVyRm9yZ2V0KEN1cnJlbnRSZXNvdXJjZU93bmVy LAorCQkJCQkJCQkJcGlwZWxpbmVbKGkgLSBudW1fYnVmZmVycykgJSBudW1fYnVmZmVyc10sCisJ CQkJCQkJCQkmYmVuY2hfcmVzb3duZXJfZGVzYyk7CisJCQlpZiAoaSA8IG51bV9vcGVyYXRpb25z KQorCQkJeworCQkJCURhdHVtCQlyZXMgPSByZXNvdXJjZXNbYWNjZXNzX3NlcXVlbmNlW2ldXTsK KwkJCQlSZXNvdXJjZU93bmVyRW5sYXJnZShDdXJyZW50UmVzb3VyY2VPd25lcik7CisJCQkJUmVz b3VyY2VPd25lclJlbWVtYmVyKEN1cnJlbnRSZXNvdXJjZU93bmVyLCByZXMsICZiZW5jaF9yZXNv d25lcl9kZXNjKTsKKwkJCQlwaXBlbGluZVtpICUgbnVtX2J1ZmZlcnNdID0gcmVzOworCQkJfQor CQl9CisKKwkJSU5TVFJfVElNRV9TRVRfQ1VSUkVOVChlbmRfdGltZSk7CisJCUlOU1RSX1RJTUVf U1VCVFJBQ1QoZW5kX3RpbWUsIHN0YXJ0X3RpbWUpOworCQllbGFwc2VkX25zID0gSU5TVFJfVElN RV9HRVRfTkFOT1NFQyhlbmRfdGltZSk7CisKKwkJdmFsdWVzWzBdID0gSW50MzJHZXREYXR1bShp dGVyKTsKKwkJdmFsdWVzWzFdID0gSW50NjRHZXREYXR1bShlbGFwc2VkX25zKTsKKwkJdmFsdWVz WzJdID0gRmxvYXQ4R2V0RGF0dW0oKGRvdWJsZSkgZWxhcHNlZF9ucyAvIG51bV9vcGVyYXRpb25z KTsKKwkJdHVwbGVzdG9yZV9wdXR2YWx1ZXModHVwc3RvcmUsIHR1cGRlc2MsIHZhbHVlcywgbnVs bHMpOworCX0KKworCXBmcmVlKGFjY2Vzc19zZXF1ZW5jZSk7CisJcGZyZWUocGlwZWxpbmUpOwor CXBmcmVlKHJlc291cmNlcyk7CisKKwlyZXR1cm4gKERhdHVtKSAwOworfQpkaWZmIC0tZ2l0IGEv c3JjL3Rlc3QvbW9kdWxlcy90ZXN0X2J1ZmZlcl9waW4vdGVzdF9idWZmZXJfcGluLmNvbnRyb2wg Yi9zcmMvdGVzdC9tb2R1bGVzL3Rlc3RfYnVmZmVyX3Bpbi90ZXN0X2J1ZmZlcl9waW4uY29udHJv bApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4uZjA2NTk0MTcxMjcKLS0t IC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9tb2R1bGVzL3Rlc3RfYnVmZmVyX3Bpbi90ZXN0X2J1 ZmZlcl9waW4uY29udHJvbApAQCAtMCwwICsxLDQgQEAKK2NvbW1lbnQgPSAndGVzdF9idWZmZXJf cGluIC0gYnVmZmVyIHBpbm5pbmcgYmVuY2htYXJrcycKK2RlZmF1bHRfdmVyc2lvbiA9ICcxLjAn Cittb2R1bGVfcGF0aG5hbWUgPSAnJGxpYmRpci90ZXN0X2J1ZmZlcl9waW4nCityZWxvY2F0YWJs ZSA9IHRydWUKLS0gCjIuNTMuMAoK --00000000000048da9c064c8582e3 Content-Type: application/octet-stream; name="v1-0005-REFCOUNT_ARRAY_ENTRIES-0.patch" Content-Disposition: attachment; filename="v1-0005-REFCOUNT_ARRAY_ENTRIES-0.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mmhxnewu4 RnJvbSA4NWFiYzgyOTQ3NGE0YjBmNDA0NjFhZjE2OWRkMDgwM2UyZTIyYzg4IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBBbGV4YW5kcmUgRmVsaXBlIDxvLmFsZXhhbmRyZS5mZWxpcGVA Z21haWwuY29tPgpEYXRlOiBGcmksIDYgTWFyIDIwMjYgMTc6NDY6MzggKzAwMDAKU3ViamVjdDog W1BBVENIIDUvNV0gUkVGQ09VTlRfQVJSQVlfRU5UUklFUz0wCgpUaGUgc2ltcGxlIGhhc2ggcGVy Zm9ybWFuY2UgaXMgaXMgZmFpcmx5IGNsb3NlIHRvIHRoZSBkaXJlY3QgYXJyYXkuCkZvciBmZXcg cGlucyB3ZSBhcmUgdHJhZGluZyBvbmUgc21hbGwgZm9yIGxvb3AgZm9yIGFuIGluZGV4IGNhbGN1 bGF0aW9uCihidWZmZXIgJSBOKSwgdGhpcyBjb3VsZCBiZSBhIChidWZmZXIgJiAoTi0xKSkgaWYg d2UgcmVzdHJpY3QgdGhlCnNpbXBsZSBhcnJheSB0byB1c2UgcG93ZXJzIG9mIDIgc2l6ZXMuCgpG b3IgbW9yZSB0aGFuIFJFRkNPVU5UX0FSUkFZX0VOVFJJRVMgb24gZGlzdGluY3QgYnVmZmVycyBw aW5uZWQvdW5waW5uZWQgaW4KYSBGSUZPIGZhc2hpb24sIHRoaXMgaXMgYSBzdHJpY3QgaW1wcm92 ZW1lbnQgYXMgZXZlcnkgcGluIHJlcXVpcmVzIGEgaGFzaAp0YWJsZSBvcGVyYXRpb24uCgotLS0K IHNyYy9iYWNrZW5kL3N0b3JhZ2UvYnVmZmVyL2J1Zl9yZWZjb3VudC5jICAgICB8ICAgNjAgKy0K IHNyYy9pbmNsdWRlL3N0b3JhZ2UvYnVmX3JlZmNvdW50LmggICAgICAgICAgICB8ICAgIDMgKwog MiBmaWxlcyBjaGFuZ2VkCgpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvc3RvcmFnZS9idWZmZXIv YnVmX3JlZmNvdW50LmMgYi9zcmMvYmFja2VuZC9zdG9yYWdlL2J1ZmZlci9idWZfcmVmY291bnQu YwppbmRleCAyOWRmYjcyMDk5Ny4uOTBjYjQyZWRiYjUgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5k L3N0b3JhZ2UvYnVmZmVyL2J1Zl9yZWZjb3VudC5jCisrKyBiL3NyYy9iYWNrZW5kL3N0b3JhZ2Uv YnVmZmVyL2J1Zl9yZWZjb3VudC5jCkBAIC04OCwxNyArODgsMTggQEAgc3RydWN0IFByaXZhdGVS ZWZDb3VudEl0ZXJhdG9yCiAjZGVmaW5lIFNIX0RFRklORQogI2luY2x1ZGUgImxpYi9zaW1wbGVo YXNoLmgiCiAKLS8qIFByaXZhdGUgcmVmY291bnQgYXJyYXkgYW5kIGtleXMgKi8KLSNkZWZpbmUg UkVGQ09VTlRfQVJSQVlfRU5UUklFUyA4CisKKy8qCisgKiBQcml2YXRlIHJlZmNvdW50IGFycmF5 IGFuZCBrZXlzCisgKiBJZiBzZXQgdG8gMCwgYWxsIHRoZSBjb2RlIGhhbmRsaW5nIHRoZSB0cmFu c2ZlcnMgYmV0d2VlbiB0aGUgYXJyYXkKKyAqIGFuZCB0aGUgaGFzaCB0YWJsZSBpcyBkaXNhYmxl ZCBhdCBjb21waWxhdGlvbiB0aW1lLgorKi8KKyNkZWZpbmUgUkVGQ09VTlRfQVJSQVlfRU5UUklF UyAwCisKKyNpZiBSRUZDT1VOVF9BUlJBWV9FTlRSSUVTID4gMAogc3RhdGljIEJ1ZmZlciBQcml2 YXRlUmVmQ291bnRBcnJheUtleXNbUkVGQ09VTlRfQVJSQVlfRU5UUklFU107CiBzdGF0aWMgc3Ry dWN0IFByaXZhdGVSZWZDb3VudEVudHJ5IFByaXZhdGVSZWZDb3VudEFycmF5W1JFRkNPVU5UX0FS UkFZX0VOVFJJRVNdOwogCi0vKiBPdmVyZmxvdyBoYXNoIHRhYmxlIGZvciB3aGVuIGFycmF5IGlz IGZ1bGwgKi8KLXN0YXRpYyByZWZjb3VudF9oYXNoICpQcml2YXRlUmVmQ291bnRIYXNoID0gTlVM TDsKLQotLyogQ291bnQgb2YgZW50cmllcyB0aGF0IGhhdmUgb3ZlcmZsb3dlZCBpbnRvIHRoZSBo YXNoIHRhYmxlICovCi1zdGF0aWMgaW50MzIgUHJpdmF0ZVJlZkNvdW50T3ZlcmZsb3dlZCA9IDA7 Ci0KIC8qIENsb2NrIGhhbmQgZm9yIHNlbGVjdGluZyB2aWN0aW0gd2hlbiBhcnJheSBpcyBmdWxs ICovCiBzdGF0aWMgdWludDMyIFByaXZhdGVSZWZDb3VudENsb2NrID0gMDsKIApAQCAtMTA3LDE0 ICsxMDgsMjMgQEAgc3RhdGljIGludAlSZXNlcnZlZFJlZkNvdW50U2xvdCA9IC0xOwogCiAvKiBD YWNoZSBmb3IgbGFzdCBhY2Nlc3NlZCBlbnRyeSAqLwogc3RhdGljIGludAlQcml2YXRlUmVmQ291 bnRFbnRyeUxhc3QgPSAtMTsKKyNlbmRpZgogCiAvKiBBZHZpc29yeSBsaW1pdCBvbiB0aGUgbnVt YmVyIG9mIHBpbnMgZWFjaCBiYWNrZW5kIHNob3VsZCBob2xkICovCiBzdGF0aWMgdWludDMyIE1h eFByb3BvcnRpb25hbFBpbnMgPSAwOwogCisvKiBIYXNoIHRhYmxlIChvdmVyZmxvdyB3aGVuIGFy cmF5IHVzZWQsIHByaW1hcnkgd2hlbiBoYXNoLW9ubHkpICovCitzdGF0aWMgcmVmY291bnRfaGFz aCAqUHJpdmF0ZVJlZkNvdW50SGFzaCA9IE5VTEw7CisKKy8qIENvdW50IG9mIGVudHJpZXMgaW4g dGhlIGhhc2ggdGFibGUgKi8KK3N0YXRpYyBpbnQzMiBQcml2YXRlUmVmQ291bnRPdmVyZmxvd2Vk ID0gMDsKKworI2lmIFJFRkNPVU5UX0FSUkFZX0VOVFJJRVMgPiAwCiAvKiBGb3J3YXJkIGRlY2xh cmF0aW9ucyAqLwogc3RhdGljIHZvaWQgUmVzZXJ2ZVByaXZhdGVSZWZDb3VudEVudHJ5KHZvaWQp Owogc3RhdGljIFByaXZhdGVSZWZDb3VudEVudHJ5ICpOZXdQcml2YXRlUmVmQ291bnRFbnRyeShC dWZmZXIgYnVmZmVyKTsKIHN0YXRpYyBwZ19ub2lubGluZSBQcml2YXRlUmVmQ291bnRFbnRyeSAq R2V0UHJpdmF0ZVJlZkNvdW50RW50cnlTbG93KEJ1ZmZlciBidWZmZXIpOworI2VuZGlmCiAKIC8q CiAgKiBJbml0aWFsaXplIHByaXZhdGUgcmVmY291bnQgdHJhY2tpbmcgZm9yIHRoaXMgYmFja2Vu ZC4KQEAgLTEzMCwxMiArMTQwLDE1IEBAIEluaXRQcml2YXRlUmVmQ291bnQodm9pZCkKIAkgKiBH ZXRBZGRpdGlvbmFsUGluTGltaXQoKSBjYW4gYmUgdXNlZCB0byBjaGVjayB0aGUgcmVtYWluaW5n IGJhbGFuY2UuCiAJKi8KIAlNYXhQcm9wb3J0aW9uYWxQaW5zID0gTkJ1ZmZlcnMgLyAoTWF4QmFj a2VuZHMgKyBOVU1fQVVYSUxJQVJZX1BST0NTKTsKKyNpZiBSRUZDT1VOVF9BUlJBWV9FTlRSSUVT ID4gMAogCW1lbXNldCgmUHJpdmF0ZVJlZkNvdW50QXJyYXksIDAsIHNpemVvZihQcml2YXRlUmVm Q291bnRBcnJheSkpOwogCW1lbXNldCgmUHJpdmF0ZVJlZkNvdW50QXJyYXlLZXlzLCAwLCBzaXpl b2YoUHJpdmF0ZVJlZkNvdW50QXJyYXlLZXlzKSk7CisjZW5kaWYKIAogCVByaXZhdGVSZWZDb3Vu dEhhc2ggPSByZWZjb3VudF9jcmVhdGUoQ3VycmVudE1lbW9yeUNvbnRleHQsIDY0LCBOVUxMKTsK IH0KIAorI2lmIFJFRkNPVU5UX0FSUkFZX0VOVFJJRVMgPiAwCiAvKgogICogRW5zdXJlIHRoYXQg dGhlIFByaXZhdGVSZWZDb3VudEFycmF5IGhhcyBzdWZmaWNpZW50IHNwYWNlIHRvIHN0b3JlIG9u ZSBtb3JlCiAgKiBlbnRyeS4KQEAgLTIzMyw3ICsyNDYsOSBAQCBOZXdQcml2YXRlUmVmQ291bnRF bnRyeShCdWZmZXIgYnVmZmVyKQogCiAJcmV0dXJuIHJlczsKIH0KKyNlbmRpZiAvKiBSRUZDT1VO VF9BUlJBWV9FTlRSSUVTID4gMCAqLwogCisjaWYgUkVGQ09VTlRfQVJSQVlfRU5UUklFUyA+IDAK IC8qCiAgKiBTbG93LXBhdGggZm9yIEdldFNoYXJlZEJ1ZmZlckVudHJ5KCkuCiAgKi8KQEAgLTI3 MCw2ICsyODUsNyBAQCBHZXRQcml2YXRlUmVmQ291bnRFbnRyeVNsb3coQnVmZmVyIGJ1ZmZlcikK IAlyZXMgPSByZWZjb3VudF9sb29rdXAoUHJpdmF0ZVJlZkNvdW50SGFzaCwgYnVmZmVyKTsKIAly ZXR1cm4gcmVzOwogfQorI2VuZGlmIC8qIFJFRkNPVU5UX0FSUkFZX0VOVFJJRVMgPiAwICovCiAK IC8qCiAgKiBSZXR1cm4gdGhlIFByaXZhdGVSZWZDb3VudCBlbnRyeSBmb3IgdGhlIHBhc3NlZCBi dWZmZXIuCkBAIC0yODEsNiArMjk3LDcgQEAgR2V0U2hhcmVkQnVmZmVyRW50cnkoQnVmZmVyIGJ1 ZmZlcikKIAlBc3NlcnQoQnVmZmVySXNWYWxpZChidWZmZXIpKTsKIAlBc3NlcnQoIUJ1ZmZlcklz TG9jYWwoYnVmZmVyKSk7CiAKKyNpZiBSRUZDT1VOVF9BUlJBWV9FTlRSSUVTID4gMAogCS8qIEZh c3QgcGF0aDogY2hlY2sgb25lLWVudHJ5IGNhY2hlICovCiAJaWYgKGxpa2VseShQcml2YXRlUmVm Q291bnRFbnRyeUxhc3QgIT0gLTEpICYmCiAJCWxpa2VseShQcml2YXRlUmVmQ291bnRBcnJheVtQ cml2YXRlUmVmQ291bnRFbnRyeUxhc3RdLmJ1ZmZlciA9PSBidWZmZXIpKQpAQCAtMjg5LDYgKzMw NiwxMCBAQCBHZXRTaGFyZWRCdWZmZXJFbnRyeShCdWZmZXIgYnVmZmVyKQogCX0KIAogCXJldHVy biBHZXRQcml2YXRlUmVmQ291bnRFbnRyeVNsb3coYnVmZmVyKTsKKyNlbHNlCisJLyogSGFzaC1v bmx5IG1vZGU6IGRpcmVjdCBsb29rdXAgKi8KKwlyZXR1cm4gcmVmY291bnRfbG9va3VwKFByaXZh dGVSZWZDb3VudEhhc2gsIGJ1ZmZlcik7CisjZW5kaWYKIH0KIAogLyoKQEAgLTMwOCwxMCArMzI5 LDIwIEBAIFNoYXJlZEJ1ZmZlclJlZihCdWZmZXIgYnVmZmVyKQogCiAJaWYgKHJlZiA9PSBOVUxM KQogCXsKLQkJLyogTmV3IHBpbiAtIGNyZWF0ZSBlbnRyeSAqLworI2lmIFJFRkNPVU5UX0FSUkFZ X0VOVFJJRVMgPiAwCisJCS8qIE5ldyBwaW4gLSBjcmVhdGUgZW50cnkgaW4gYXJyYXkgKi8KIAkJ UmVzZXJ2ZVByaXZhdGVSZWZDb3VudEVudHJ5KCk7CiAJCXJlZiA9IE5ld1ByaXZhdGVSZWZDb3Vu dEVudHJ5KGJ1ZmZlcik7CiAJCXJlZi0+ZGF0YSA9IE9ORV9QUklWQVRFX1JFRkVSRU5DRTsKKyNl bHNlCisJCS8qIEhhc2gtb25seSBtb2RlOiBpbnNlcnQgZGlyZWN0bHkgKi8KKwkJYm9vbAkJZm91 bmQ7CisKKwkJcmVmID0gcmVmY291bnRfaW5zZXJ0KFByaXZhdGVSZWZDb3VudEhhc2gsIGJ1ZmZl ciwgJmZvdW5kKTsKKwkJQXNzZXJ0KCFmb3VuZCk7CisJCXJlZi0+ZGF0YSA9IE9ORV9QUklWQVRF X1JFRkVSRU5DRTsKKwkJUHJpdmF0ZVJlZkNvdW50T3ZlcmZsb3dlZCsrOworI2VuZGlmCiAJfQog CWVsc2UKIAl7CkBAIC0zNTIsNiArMzgzLDcgQEAgU2hhcmVkQnVmZmVyVW5yZWYoUHJpdmF0ZVJl ZkNvdW50RW50cnkgKnJlZikKIAkJLyogTm8gbW9yZSByZWZlcmVuY2VzIC0gY2xlYW4gdXAgdGhl IGVudHJ5ICovCiAJCUFzc2VydChTaGFyZWRCdWZmZXJHZXRMb2NrTW9kZShyZWYpID09IEJVRkZF Ul9MT0NLX1VOTE9DSyk7CiAKKyNpZiBSRUZDT1VOVF9BUlJBWV9FTlRSSUVTID4gMAogCQlpZiAo cmVmID49ICZQcml2YXRlUmVmQ291bnRBcnJheVswXSAmJgogCQkJcmVmIDwgJlByaXZhdGVSZWZD b3VudEFycmF5W1JFRkNPVU5UX0FSUkFZX0VOVFJJRVNdKQogCQl7CkBAIC0zNjAsNiArMzkyLDcg QEAgU2hhcmVkQnVmZmVyVW5yZWYoUHJpdmF0ZVJlZkNvdW50RW50cnkgKnJlZikKIAkJCVJlc2Vy dmVkUmVmQ291bnRTbG90ID0gcmVmIC0gUHJpdmF0ZVJlZkNvdW50QXJyYXk7CiAJCX0KIAkJZWxz ZQorI2VuZGlmCiAJCXsKIAkJCS8qIGNvdWxkIG1ha2Ugc2xpZ2h0bHkgbW9yZSBlZmZpY2llbnQg YnkgdXNpbmcgdGhlIHBvaW50ZXIgKi8KIAkJCXJlZmNvdW50X2RlbGV0ZShQcml2YXRlUmVmQ291 bnRIYXNoLCByZWYtPmJ1ZmZlcik7CkBAIC00MDksMTEgKzQ0MiwxMSBAQCBDaGVja1ByaXZhdGVS ZWZDb3VudExlYWtzKHZvaWQpCiAjaWZkZWYgVVNFX0FTU0VSVF9DSEVDS0lORwogCWludAkJCVJl ZkNvdW50RXJyb3JzID0gMDsKIAlQcml2YXRlUmVmQ291bnRFbnRyeSAqcmVzOwotCWludAkJCWk7 CiAJY2hhcgkgICAqczsKIAorI2lmIFJFRkNPVU5UX0FSUkFZX0VOVFJJRVMgPiAwCiAJLyogY2hl Y2sgdGhlIGFycmF5ICovCi0JZm9yIChpID0gMDsgaSA8IFJFRkNPVU5UX0FSUkFZX0VOVFJJRVM7 IGkrKykKKwlmb3IgKGludCBpID0gMDsgaSA8IFJFRkNPVU5UX0FSUkFZX0VOVFJJRVM7IGkrKykK IAl7CiAJCWlmIChQcml2YXRlUmVmQ291bnRBcnJheUtleXNbaV0gIT0gSW52YWxpZEJ1ZmZlcikK IAkJewpAQCAtNDI2LDggKzQ1OSw5IEBAIENoZWNrUHJpdmF0ZVJlZkNvdW50TGVha3Modm9pZCkK IAkJCVJlZkNvdW50RXJyb3JzKys7CiAJCX0KIAl9CisjZW5kaWYKIAotCS8qIGlmIG5lY2Vzc2Fy eSBzZWFyY2ggdGhlIGhhc2ggKi8KKwkvKiBzZWFyY2ggdGhlIGhhc2ggKi8KIAlpZiAoUHJpdmF0 ZVJlZkNvdW50T3ZlcmZsb3dlZCkKIAl7CiAJCXJlZmNvdW50X2l0ZXJhdG9yIGl0ZXI7CkBAIC00 NjcsNiArNTAxLDcgQEAgSW5pdFByaXZhdGVSZWZDb3VudEl0ZXJhdG9yKHZvaWQpCiBQcml2YXRl UmVmQ291bnRFbnRyeSAqCiBHZXROZXh0UHJpdmF0ZVJlZkNvdW50RW50cnkoUHJpdmF0ZVJlZkNv dW50SXRlcmF0b3IgKml0ZXIpCiB7CisjaWYgUkVGQ09VTlRfQVJSQVlfRU5UUklFUyA+IDAKIAkv KiBGaXJzdCBpdGVyYXRlIHRocm91Z2ggdGhlIGFycmF5ICovCiAJd2hpbGUgKCFpdGVyLT5pbl9o YXNoICYmIGl0ZXItPmFycmF5X2luZGV4IDwgUkVGQ09VTlRfQVJSQVlfRU5UUklFUykKIAl7CkBA IC00NzUsOCArNTEwLDkgQEAgR2V0TmV4dFByaXZhdGVSZWZDb3VudEVudHJ5KFByaXZhdGVSZWZD b3VudEl0ZXJhdG9yICppdGVyKQogCQlpZiAoUHJpdmF0ZVJlZkNvdW50QXJyYXlLZXlzW2lkeF0g IT0gSW52YWxpZEJ1ZmZlcikKIAkJCXJldHVybiAmUHJpdmF0ZVJlZkNvdW50QXJyYXlbaWR4XTsK IAl9CisjZW5kaWYKIAotCS8qIFRoZW4gaXRlcmF0ZSB0aHJvdWdoIHRoZSBoYXNoIGlmIHRoZXJl IGFyZSBvdmVyZmxvd2VkIGVudHJpZXMgKi8KKwkvKiBUaGVuIGl0ZXJhdGUgdGhyb3VnaCB0aGUg aGFzaCBpZiB0aGVyZSBhcmUgZW50cmllcyAqLwogCWlmICghaXRlci0+aW5faGFzaCkKIAl7CiAJ CWl0ZXItPmluX2hhc2ggPSB0cnVlOwotLSAKMi41My4wCgo= --00000000000048da9c064c8582e3 Content-Type: text/x-sh; charset="US-ASCII"; name="run-all.sh" Content-Disposition: attachment; filename="run-all.sh" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mmhy1i5e5 IyEvYmluL2Jhc2gKc2V0IC1lCgpTQ1JJUFRfRElSPSQoY2QgIiQoZGlybmFtZSAiJDAiKSIgJiYg cHdkKQpQQVRDSF9ESVI9IiRTQ1JJUFRfRElSLyIKUkVQT19ST09UPSQoY2QgIiRTQ1JJUFRfRElS Ly4uLy4uIiAmJiBwd2QpCkJVSUxEU19ESVI9IiRSRVBPX1JPT1QvLmJ1aWxkcyIKREJEQVRBX0RJ Uj0iJFJFUE9fUk9PVC8uZGJkYXRhIgpSRVNVTFRTX0RJUj0iJFJFUE9fUk9PVC9zcmMvdGVzdC9t b2R1bGVzL3Rlc3RfYnVmZmVyX3Bpbi9yZXN1bHRzIgpCRU5DSE1BUktfRElSPSIkUkVQT19ST09U L3NyYy90ZXN0L21vZHVsZXMvdGVzdF9idWZmZXJfcGluIgpta2RpciAtcCAkQkVOQ0hNQVJLX0RJ Ui9yZXN1bHRzLwpQT1JUPTU0MzQKCmNkICIkUkVQT19ST09UIgoKI0FNX09QVFM9Ii0td2hpdGVz cGFjZT1ub3dhcm4gLS0zd2F5IgpBTV9PUFRTPSIiCgpmdW5jdGlvbiBjbGVhbl9yZXBvKCkgewog ICAgZ2l0IHJlc2V0IC0taGFyZAojICAgIGdpdCBjbGVhbiAtZmQKfQoKZnVuY3Rpb24gYnVpbGRf YW5kX3Rlc3QoKSB7CiAgICBsb2NhbCBOQU1FPSIkMSIKICAgIGxvY2FsIFRJVExFPSIkMiIKICAg IGxvY2FsIFBSRUZJWD0iJEJVSUxEU19ESVIvJE5BTUUiCiAgICAKICAgIGVjaG8gIiIKICAgIGVj aG8gIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PSIKICAgIGVjaG8gIkJ1aWxkaW5nOiAkTkFNRSIKICAgIGVjaG8gIj09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIKICAgIAog ICAgIyBDb25maWd1cmUgYW5kIGJ1aWxkCiAgICBtYWtlIGRpc3RjbGVhbiA+L2Rldi9udWxsIDI+ JjEgfHwgdHJ1ZQogICAgLi9jb25maWd1cmUgLS1wcmVmaXg9IiRQUkVGSVgiIC0td2l0aG91dC1p Y3UgLS13aXRob3V0LXJlYWRsaW5lIC0td2l0aG91dC16bGliID4vZGV2L251bGwKICAgIG1ha2Ug LWo4IC1zCiAgICBtYWtlIGluc3RhbGwgLXMKICAgIAogICAgIyBCdWlsZCBhbmQgaW5zdGFsbCBl eHRlbnNpb24KICAgIGNkICIkQkVOQ0hNQVJLX0RJUiIKICAgIG1ha2UgY2xlYW4gLXMgMj4vZGV2 L251bGwgfHwgdHJ1ZQogICAgbWFrZSBQR19DT05GSUc9IiRQUkVGSVgvYmluL3BnX2NvbmZpZyIg VVNFX1BHWFM9MSBpbnN0YWxsIC1zCiAgICBjZCAiJFJFUE9fUk9PVCIKICAgIAogICAgZWNobyAi IgogICAgZWNobyAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09IgogICAgZWNobyAiVGVzdGluZzogJE5BTUUiCiAgICBlY2hvICI9PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0i CiAgICAKICAgICMgU3RvcCBhbnkgcnVubmluZyBzZXJ2ZXIKICAgICIkUFJFRklYL2Jpbi9wZ19j dGwiIC1EICIkREJEQVRBX0RJUiIgc3RvcCAyPi9kZXYvbnVsbCB8fCB0cnVlCiAgICBzbGVlcCAx CiAgICAKICAgICMgSW5pdGlhbGl6ZSBmcmVzaCBkYXRhYmFzZQogICAgcm0gLXJmICIkREJEQVRB X0RJUiIKICAgICIkUFJFRklYL2Jpbi9pbml0ZGIiIC1EICIkREJEQVRBX0RJUiIgPi9kZXYvbnVs bAogICAgCiAgICAjIFN0YXJ0IHNlcnZlcgogICAgIiRQUkVGSVgvYmluL3BnX2N0bCIgLUQgIiRE QkRBVEFfRElSIiAtbCAiJFJFUE9fUk9PVC9sb2dmaWxlXyROQU1FIiAtbyAiLXAgJFBPUlQiIHN0 YXJ0CiAgICBzbGVlcCAyCiAgICAKICAgICMgUnVuIGJlbmNobWFyawogICAgbWtkaXIgLXAgIiRS RVNVTFRTX0RJUiIKICAgIGNkICIkQkVOQ0hNQVJLX0RJUiIKICAgIHB5dGhvbjMgYmVuY2htYXJr LnB5IC0tcG9ydCAkUE9SVCAtLW5hbWUgIiROQU1FIiAtLXRpdGxlICIkVElUTEUiIFwKICAgICAg ICAtLW1heC1kaXN0IDEwMDAwIC0tcG9pbnRzIDIwMCAtLXNhbXBsZXMgNTAgLS1pdGVyYXRpb25z IDIwMDAwCiAgICBjZCAiJFJFUE9fUk9PVCIKICAgIAogICAgIyBTdG9wIHNlcnZlcgogICAgIiRQ UkVGSVgvYmluL3BnX2N0bCIgLUQgIiREQkRBVEFfRElSIiBzdG9wCiAgICAKICAgIGVjaG8gIlJl c3VsdHMgc2F2ZWQgdG86ICRSRVNVTFRTX0RJUi8kTkFNRS57c3ZnLGNzdix0eHR9Igp9CgojICMg TWFzdGVyIHdpdGggcGF0Y2hlcyBhcHBsaWVkIGluY3JlbWVudGFsbHkKZ2l0IGNoZWNrb3V0IC1C IHBpbnMgb3JpZ2luL21hc3RlcgojIGNsZWFuX3JlcG8KCiMgVGhlbiBhcHBseSBlYWNoIG51bWJl cmVkIHBhdGNoIGFuZCBiZW5jaG1hcmsgYWZ0ZXIgZWFjaApmb3IgcGF0Y2ggaW4gIiRQQVRDSF9E SVIiLyoucGF0Y2g7IGRvCiAgICBbIC1mICIkcGF0Y2giIF0gfHwgY29udGludWUKICAgIAogICAg IyBFeHRyYWN0IHBhdGNoIG51bWJlciAoZS5nLiwgMDAwMSAtPiAxKQogICAgcGF0Y2hudW09JChi YXNlbmFtZSAiJHBhdGNoIiB8IGN1dCAtYzEtNCB8IHNlZCAncy9eMCovLycpCiAgICBwYXRjaG5h bWU9JChiYXNlbmFtZSAiJHBhdGNoIiAucGF0Y2gpCiAgICAKICAgIGdpdCBhbSAkQU1fT1BUUyAi JHBhdGNoIgogICAgYnVpbGRfYW5kX3Rlc3QgInBhdGNoLSRwYXRjaG51bSIgIlBhdGNoICRwYXRj aG51bTogJHBhdGNobmFtZSIKZG9uZQoKZWNobyAiIgplY2hvICI9PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iCmVjaG8gIkFsbCBiZW5j aG1hcmtzIGNvbXBsZXRlISIKZWNobyAiUmVzdWx0cyBpbjogJFJFU1VMVFNfRElSLyIKZWNobyAi PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09Igo= --00000000000048da9c064c8582e3 Content-Type: text/x-python-script; charset="US-ASCII"; name="compare-patches.py" Content-Disposition: attachment; filename="compare-patches.py" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mmhy56ze6 IyEvdXNyL2Jpbi9lbnYgcHl0aG9uMwoiIiJHZW5lcmF0ZSBjb21wYXJpc29uIGNoYXJ0cyBmb3Ig c3RlcCouY3N2IGJlbmNobWFyayByZXN1bHRzLiIiIgoKaW1wb3J0IHBhbmRhcyBhcyBwZAppbXBv cnQgbWF0cGxvdGxpYi5weXBsb3QgYXMgcGx0CmltcG9ydCBnbG9iCmltcG9ydCBvcwoKUkVTVUxU U19ESVIgPSBvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5hYnNwYXRoKF9fZmlsZV9fKSkgKyAnL3Jl c3VsdHMnCgojIEZpbmQgYWxsIHN0ZXAqLmNzdiBmaWxlcwpjc3ZfZmlsZXMgPSBzb3J0ZWQoZ2xv Yi5nbG9iKGYne1JFU1VMVFNfRElSfS8qLmNzdicpKQoKIyBGaWx0ZXIgdG8gbWFpbiBzdGVwcyBv bmx5Cm1haW5fc3RlcHMgPSBbZidwYXRjaC17aX0nIGZvciBpIGluIFsxLCAyLCAzLCA0LCA1XV0K Y3N2X2ZpbGVzID0gW2YgZm9yIGYgaW4gY3N2X2ZpbGVzIGlmIGFueShzIGluIGYgZm9yIHMgaW4g bWFpbl9zdGVwcyldCgpwcmludChmIkZvdW5kIHtsZW4oY3N2X2ZpbGVzKX0gc3RlcCBDU1YgZmls ZXM6IikKZm9yIGYgaW4gY3N2X2ZpbGVzOgogICAgcHJpbnQoZiIgIC0ge29zLnBhdGguYmFzZW5h bWUoZil9IikKCiMgTG9hZCBhbGwgZGF0YSBhcyBwaXZvdGVkIHRhYmxlcwphbGxfZGF0YSA9IFtd CmZvciBjc3ZfZmlsZSBpbiBjc3ZfZmlsZXM6CiAgICBkZiA9IHBkLnJlYWRfY3N2KGNzdl9maWxl KQogICAgc3RlcF9uYW1lID0gb3MucGF0aC5iYXNlbmFtZShjc3ZfZmlsZSkucmVwbGFjZSgnLmNz dicsICcnKQogICAgCiAgICBwaXZvdCA9IGRmLnBpdm90X3RhYmxlKGluZGV4PVsncGF0dGVybics ICdudW1fYnVmZmVycyddLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1ucz0nYmVu Y2htYXJrJywgdmFsdWVzPSdtZWRpYW5fbnMnKS5yZXNldF9pbmRleCgpCiAgICBwaXZvdFsnc3Rl cCddID0gc3RlcF9uYW1lCiAgICAKICAgICMgQ29tcHV0ZSBkZXJpdmVkIG1ldHJpY3MKICAgIGlm ICdyZWFkJyBpbiBwaXZvdC5jb2x1bW5zIGFuZCAncmVzb3duZXInIGluIHBpdm90LmNvbHVtbnM6 CiAgICAgICAgcGl2b3RbJ3JlYWQtcmVzb3duZXInXSA9IHBpdm90WydyZWFkJ10gLSBwaXZvdFsn cmVzb3duZXInXQogICAgCiAgICBhbGxfZGF0YS5hcHBlbmQocGl2b3QpCgpkYXRhID0gcGQuY29u Y2F0KGFsbF9kYXRhLCBpZ25vcmVfaW5kZXg9VHJ1ZSkKCiMgRGVmaW5lIG5pY2UgbGFiZWxzCnN0 ZXBfbGFiZWxzID0gewogICAgJ3Y0LXBnMTgtYmFzZWxpbmUnOiAnUG9zdGdyZVNRTCAxOCBCYXNl bGluZScsCiAgICAncGF0Y2gtMSc6ICdQYXRjaCAxOiBQZzE5IEJhc2VsaW5lJywKICAgICdwYXRj aC0yJzogJ1BhdGNoIDI6IFJlZmFjdG9yaW5nJywKICAgICdwYXRjaC0zJzogJ1BhdGNoIDM6IFNp bXBsZSBoYXNoJywKICAgICdwYXRjaC00JzogJ1BhdGNoIDQ6IENvbW9wYWN0IGVudHJ5JywKICAg ICdwYXRjaC01JzogJ1BhdGNoIDU6IE5vIGFycmF5JywKfQoKIyBDb2xvciBzY2hlbWUKY29sb3Jz ID0ge2s6IGMgZm9yIGssIGMgaW4gemlwKAogICAgc3RlcF9sYWJlbHMua2V5cygpLCAKICAgIFsn I2U0MWExYycsICcjMzc3ZWI4JywgJyM0ZGFmNGEnLCAnIzk4NGVhMycsICcjZmY3ZjAwJ10KKX0K CmRlZiBwbG90X2JlbmNobWFyayhiZW5jaG1hcmtfbmFtZSwgdGl0bGUsIG91dHB1dF9uYW1lKToK ICAgICIiIlBsb3QgY29tcGFyaXNvbiBmb3IgYSBzcGVjaWZpYyBiZW5jaG1hcmsuIiIiCiAgICBp ZiBiZW5jaG1hcmtfbmFtZSBub3QgaW4gZGF0YS5jb2x1bW5zOgogICAgICAgIHByaW50KGYiU2tp cHBpbmcge2JlbmNobWFya19uYW1lfTogY29sdW1uIG5vdCBmb3VuZCIpCiAgICAgICAgcmV0dXJu CiAgICAKICAgIGZpZywgYXhlcyA9IHBsdC5zdWJwbG90cygxLCAyLCBmaWdzaXplPSgxMCwgNSkp CiAgICBmaWcuc3VwdGl0bGUodGl0bGUsIGZvbnRzaXplPTE0LCBmb250d2VpZ2h0PSdib2xkJykK ICAgIAogICAgZm9yIGlkeCwgcGF0dGVybiBpbiBlbnVtZXJhdGUoWydzZXF1ZW50aWFsJywgJ3Jh bmRvbSddKToKICAgICAgICBheCA9IGF4ZXNbaWR4XQogICAgICAgIGF4LnNldF90aXRsZShmJ3tw YXR0ZXJuLmNhcGl0YWxpemUoKX0gQWNjZXNzIFBhdHRlcm4nKQogICAgICAgIGF4LnNldF94bGFi ZWwoJ051bWJlciBvZiBCdWZmZXJzJykKICAgICAgICBheC5zZXRfeWxhYmVsKCdUaW1lIChucykn KQogICAgICAgIGF4LnNldF94c2NhbGUoJ2xvZycpCiAgICAgICAgYXguZ3JpZChUcnVlLCBhbHBo YT0wLjMpCiAgICAgICAgCiAgICAgICAgZm9yIHN0ZXAgaW4gbWFpbl9zdGVwczoKICAgICAgICAg ICAgc3Vic2V0ID0gZGF0YVsoZGF0YVsncGF0dGVybiddID09IHBhdHRlcm4pICYgKGRhdGFbJ3N0 ZXAnXSA9PSBzdGVwKV0KICAgICAgICAgICAgaWYgbGVuKHN1YnNldCkgPiAwIGFuZCBiZW5jaG1h cmtfbmFtZSBpbiBzdWJzZXQuY29sdW1uczoKICAgICAgICAgICAgICAgIGF4LnBsb3Qoc3Vic2V0 WydudW1fYnVmZmVycyddLCBzdWJzZXRbYmVuY2htYXJrX25hbWVdLCAKICAgICAgICAgICAgICAg ICAgICAgICBsYWJlbD1zdGVwX2xhYmVscy5nZXQoc3RlcCwgc3RlcCksCiAgICAgICAgICAgICAg ICAgICAgICAgY29sb3I9Y29sb3JzLmdldChzdGVwLCAnZ3JheScpLAogICAgICAgICAgICAgICAg ICAgICAgIGxpbmV3aWR0aD0yLCBtYXJrZXI9J28nLCBtYXJrZXJzaXplPTMpCiAgICAgICAgCiAg ICAgICAgYXgubGVnZW5kKGxvYz0ndXBwZXIgbGVmdCcsIGZvbnRzaXplPTkpCiAgICAKICAgIHBs dC50aWdodF9sYXlvdXQoKQogICAgb3V0cHV0X3BhdGggPSBmJ3tSRVNVTFRTX0RJUn0ve291dHB1 dF9uYW1lfS5zdmcnCiAgICBwbHQuc2F2ZWZpZyhvdXRwdXRfcGF0aCwgZm9ybWF0PSdzdmcnLCBi Ym94X2luY2hlcz0ndGlnaHQnKQogICAgcGx0LnNhdmVmaWcob3V0cHV0X3BhdGgucmVwbGFjZSgn LnN2ZycsICcucG5nJyksIGZvcm1hdD0ncG5nJywgZHBpPTE1MCwgYmJveF9pbmNoZXM9J3RpZ2h0 JykKICAgIHByaW50KGYiU2F2ZWQ6IHtvdXRwdXRfcGF0aH0iKQogICAgcGx0LmNsb3NlKCkKCiMg R2VuZXJhdGUgdGhyZWUgY29tcGFyaXNvbiBmaWd1cmVzCnBsb3RfYmVuY2htYXJrKCdyZWFkLXJl c293bmVyJywgJ1JlYWQvUmVsZWFzZSBleGNsdWRpbmcgUmVzb3duZXInLCAnY29tcGFyZS1yZWFk LXJlc293bmVyJykKcGxvdF9iZW5jaG1hcmsoJ3JlYWQnLCAnUmVhZC9SZWxlYXNlIFBlcmZvcm1h bmNlIENvbXBhcmlzb24nLCAnY29tcGFyZS1yZWFkJykKcGxvdF9iZW5jaG1hcmsoJ3Jlc293bmVy JywgJ1Jlc291cmNlT3duZXIgUGVyZm9ybWFuY2UgQ29tcGFyaXNvbicsICdjb21wYXJlLXJlc293 bmVyJykKcGxvdF9iZW5jaG1hcmsoJ3Bpbm5pbmcnLCAnUGluL1VucGluIFBlcmZvcm1hbmNlIENv bXBhcmlzb24nLCAnY29tcGFyZS1waW5uaW5nJykKcGxvdF9iZW5jaG1hcmsoJ2xvY2tpbmcnLCAn TG9jay9VbmxvY2sgUGVyZm9ybWFuY2UgQ29tcGFyaXNvbicsICdjb21wYXJlLWxvY2tpbmcnKQoK cHJpbnQoIlxuRG9uZSEgR2VuZXJhdGVkIGNvbXBhcmlzb24gY2hhcnRzLiIpCg== --00000000000048da9c064c8582e3--