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 1vWi9J-0083Zl-2z for pgsql-hackers@arkaria.postgresql.org; Fri, 19 Dec 2025 21:36:34 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1vWi9I-0098ca-2W for pgsql-hackers@arkaria.postgresql.org; Fri, 19 Dec 2025 21:36:33 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1vWi9I-0098cR-0g for pgsql-hackers@lists.postgresql.org; Fri, 19 Dec 2025 21:36:33 +0000 Received: from mail-ed1-x52a.google.com ([2a00:1450:4864:20::52a]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.96) (envelope-from ) id 1vWi9H-001ZNp-1C for pgsql-hackers@postgresql.org; Fri, 19 Dec 2025 21:36:32 +0000 Received: by mail-ed1-x52a.google.com with SMTP id 4fb4d7f45d1cf-64951939e1eso3374659a12.1 for ; Fri, 19 Dec 2025 13:36:30 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1766180189; x=1766784989; darn=postgresql.org; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=O3+xXQXFH/TkLtHCWruQB8jkHZDKvQhp7PuAZAturi8=; b=ImZ7xuPcaBDhOKjFoPyTWmEhaOmHuta4/6At6LZv0LDh8Xtk6Fx0wFevFguI6mmn0s 05uNRzP+C744R9zd+q5HPiV7GjkyZy/GlZx4mpLtTUKLoIlk36ItQm6VWf3by8cEoide OgRxXNhbOZklwQiRy6lA4jtkXS+r/LTxl+sgWXTdz4xTWb4IW9hHbBPrW698QaIsd0mF KRSwGb1FUMYd2swrieLSfOJnjW1REHEZG2I15TWiEq5pHGFuwZ7xABG8nt57QGis62Dg bMjakR96Qc0dPRdp+uY0xnceaLP4AZgsswhAmQlslnLGGobTW98w0FvLJzQBkKqVay0R uN6A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1766180189; x=1766784989; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=O3+xXQXFH/TkLtHCWruQB8jkHZDKvQhp7PuAZAturi8=; b=uv9ORkWCRLZUsWWtthEGHuQBY6BUwR0CoZ7Q7ruzg8nXszTHqSUJ1fSmw0zpUbTcG+ ntGHNVXhDSgDlzo6DcKNr3YdJs77B1q1ICMebCvdJDw62EMM+B3XBMs75psS6me6Yeyq vcfqfuEEhxNJ3szbHriv5PhP1M97OGf/hdfsTyZJgCmidp9GVj87kLKfy7MzI9Ol/+Cg Xr3rk3lPBtMglsIJ6eIq+C80iScvNGFz20cfIiybHI8Tiyd0iVigLSSK4AxvOaaAmNol Q3lJwTQFe0jmPiAtdo6FjMAwSd/S6cPCwHnrZStw1mHrZG8J6b6FQuE/gJY+9KLDy3Ba pBLw== X-Gm-Message-State: AOJu0YzFB28ze/q47R1rgfwuf+Kd4jSSB8y/0Cs0H9ABy1Va0yfegfwd IncJ4WXkO+Mt/RSbTUK3NKJpNfwQdWK/d9ZGOoIIw9EThYiyWzQcFY5hujxTC18uURI6q3f+Kn7 UXT/GaPRL7pAlLNcAh5WZ2Z9jlIvS3Siw7n2Y X-Gm-Gg: AY/fxX4UaKoEaklPnHzmR0dlLnhoUSJ+G4KoCbAva7ikDnNZphuUSsek/RpYY5Lx9XK k+8I95QGZ6XHEkAFD2zCSxpxG+uWJeRVTwiTQJGHibbk5aIZlgMhmgR+Db73H7hkZVEw3ztRWDr 5xT1GJS5FHDZfpmbWdSKPakMgLCnU5Skftci1qSzWI8rTyrBxY3Fq60VmbB6fUGm7lPBxXJfUhA O8toPTf+k7N417nYGHTd1MFvJztfI/6Izw3024jXf9lvOJbaUulfTjEp/a2sXVKSw== X-Google-Smtp-Source: AGHT+IHGUcYnXQynQ8bXjNN5vBNs9n3hHkFJiMN5wWdacBh5St8E9AlZnLLlPkCq3S3sDdBP1nqzdOR9RsNbJqRCRQE= X-Received: by 2002:a17:907:1b0f:b0:b77:1166:7d63 with SMTP id a640c23a62f3a-b8037154f58mr472600366b.40.1766180188489; Fri, 19 Dec 2025 13:36:28 -0800 (PST) MIME-Version: 1.0 References: In-Reply-To: From: Sami Imseih Date: Fri, 19 Dec 2025 15:36:16 -0600 X-Gm-Features: AQt7F2qm6be1yUwNDQ5-wPMrwAsHvTFxMUminabBEOnkdLp_g0FS-5wl_c439oM Message-ID: Subject: Re: Refactor query normalization into core query jumbling To: Bertrand Drouvot Cc: pgsql-hackers Content-Type: multipart/mixed; boundary="000000000000bebcc5064654decb" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000bebcc5064654decb Content-Type: text/plain; charset="UTF-8" > While this is technically correct so the compiler does not complain (because > clocations is a non const pointer in JumbleState and the added const does not > apply to what clocations points to), I think that adding const here is misleading. Yes, I am not happy with this. I initially thought it would be OK to modify the JumbleState as long as it is done in a core function, but after much thought, this is neither a good idea nor safe. If a pointer is marked as a Constant, we should not modify it. So, I went back to think about this, and the core problem as I see it is that multiple hooks on the chain can modify the constant lengths. For example, pg_stat_statements can now modify the constant lengths in JumbleState via fill_in_constant_lengths, and the same JumbleState can have its constant locations modified in a different way. At this time, constant lengths are the only part of the JumbleState that is not set by core. So, I don't think post_parse_analyze receiving JumbleState as a constant is the right approach, nor do we need it. I think we should allow JumbleState to define a normalization callback, which defaults to a core normalization function rather than an extension specific one: ``` jstate->normalize_query = GenerateNormalizedQuery; ``` This way, any extension that wishes to return a normalized string from the same JumbleState can invoke this callback and get consistent results. pg_stat_statements and other extensions with a need to normalize a query string based on the locations of a JumbleState do not need to care about the internals of normalization, they simply invoke the callback and receive the final string. So v2-0001 implements this callback and moves the normalization logic into core. Both changes must be done in the same patch. The comments are also updated where they are no longer applicable or could be improved. One additional improvement that this patch did not include is a bool in JumbleState that tracks whether a normalized string has already been generated. This way, repeated calls to the callback would not need to regenerate the string; only the first call would perform the work, while subsequent calls could simply return the previously computed normalized string. I do like the simplicity of this approach and it removes pg_stat_statements from having to own the normalization code and how well different extensions sharing the same JumbleState can play together. Not yet sure if this is the correct direction, and I am open to other ideas. -- Sami Imseih Amazon Web Services (AWS) --000000000000bebcc5064654decb Content-Type: application/octet-stream; name="v2-0001-pg_stat_statements-enforce-single-query-normaliza.patch" Content-Disposition: attachment; filename="v2-0001-pg_stat_statements-enforce-single-query-normaliza.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mjde2lhu0 RnJvbSAyZmIxNTFiODUwZjg3YTMxOTBlNDllY2I3N2U5NWNiYzcxY2E5ZjA3IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBVYnVudHUgPHVidW50dUBpcC0xNzItMzEtNDYtMjMwLmVjMi5p bnRlcm5hbD4KRGF0ZTogVGh1LCAxOCBEZWMgMjAyNSAxODo1OTozMSArMDAwMApTdWJqZWN0OiBb UEFUQ0ggdjIgMS8xXSBwZ19zdGF0X3N0YXRlbWVudHM6IGVuZm9yY2Ugc2luZ2xlIHF1ZXJ5IG5v cm1hbGl6YXRpb24KIHBlciBKdW1ibGVTdGF0ZQoKQSBKdW1ibGVTdGF0ZSBpbnN0YW5jZSBjYW4g YmUgdXNlZCBieSBtb3JlIHRoYW4gb25lIGV4dGVuc2lvbiwgYW5kIGFsbAp3aWxsIHVzZSB0aGUg c2FtZSBxdWVyeSBzdHJpbmcgYW5kIGNvbnN0YW50IGxvY2F0aW9ucyBwcm9kdWNlZCBieSBjb3Jl CnF1ZXJ5IGp1bWJsaW5nLiBIb3dldmVyLCBnZW5lcmF0ZV9ub3JtYWxpemVkX3F1ZXJ5IGluCnBn X3N0YXRfc3RhdGVtZW50cyBjdXJyZW50bHkgbW9kaWZpZXMgdGhlIGNvbnN0YW50IGxlbmd0aHMg c3RvcmVkIGluCkp1bWJsZVN0YXRlLCB3aGljaCBjb3VsZCBiZSBvdmVyd3JpdHRlbiBieSBhbm90 aGVyIGV4dGVuc2lvbiBpbXBsZW1lbnRpbmcKaXRzIG93biBub3JtYWxpemF0aW9uIGxvZ2ljLiBX aGlsZSB0aGlzIGhhcyBub3QgYmVlbiByZXBvcnRlZCBpbiBwcmFjdGljZSwKaXQgaXMgYW4gdW5k ZXNpcmFibGUgaW50ZXJhY3Rpb24gYW5kIHNob3VsZCBiZSBmaXhlZC4KClRvIGJldHRlciBlbmZv cmNlIHRoaXMgaW52YXJpYW50LCBleHBvc2UgYSBub3JtYWxpemF0aW9uIGNhbGxiYWNrIGluCkp1 bWJsZVN0YXRlIGluaXRpYWxpemVkIHRvIGdlbmVyYXRlX25vcm1hbGl6ZWRfcXVlcnkgYXMgcGFy dCBvZiBtb3ZpbmcgYWxsCnJlbGF0ZWQgbm9ybWFsaXphdGlvbiBjb2RlIGZyb20gcGdfc3RhdF9z dGF0ZW1lbnRzIGludG8gY29yZSBxdWVyeSBqdW1ibGluZy4KTm9ybWFsaXphdGlvbiBpcyBpbnZv a2VkIHRocm91Z2ggdGhpcyBjYWxsYmFjaywgZW5zdXJpbmcgdGhhdCBhbGwgaG9va3MKb24gdGhl IGNhbGwgY2hhaW4gYWNjZXNzaW5nIHRoZSBzYW1lIEp1bWJsZVN0YXRlIHVzZSB0aGUgc2FtZSBu b3JtYWxpemF0aW9uCmZ1bmN0aW9uLgoKVGhpcyByZWZhY3RvciByZW5hbWVzIHRoZSBmdW5jdGlv bnMgdG8gbWF0Y2ggdGhlIG5hbWluZyBjb252ZW50aW9ucyB1c2VkCmJ5IHRoZSBjb3JlIHF1ZXJ5 IGp1bWJsaW5nIGNvZGUgaW4gcXVlcnlqdW1ibGVmdW5jcy5jLCBhbmQgdXBkYXRlcyBjb2RlCmNv bW1lbnRzIHRoYXQgbm8gbG9uZ2VyIGFwcGx5IG9yIHRoYXQgYmVuZWZpdCBmcm9tIGNsYXJpZmlj YXRpb24uCgpEaXNjdXNzaW9uOiBodHRwczovL3Bvc3Rnci5lcy9tL2FRQTl2OW5MdTVxc1g4SUUl NDBwYXF1aWVyLnh5egotLS0KIC4uLi9wZ19zdGF0X3N0YXRlbWVudHMvcGdfc3RhdF9zdGF0ZW1l bnRzLmMgICB8IDI3NyArLS0tLS0tLS0tLS0tLS0tLS0KIHNyYy9iYWNrZW5kL25vZGVzL3F1ZXJ5 anVtYmxlZnVuY3MuYyAgICAgICAgICB8IDI1MSArKysrKysrKysrKysrKysrCiBzcmMvaW5jbHVk ZS9ub2Rlcy9xdWVyeWp1bWJsZS5oICAgICAgICAgICAgICAgfCAgIDkgKwogMyBmaWxlcyBjaGFu Z2VkLCAyNzEgaW5zZXJ0aW9ucygrKSwgMjY2IGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL2Nv bnRyaWIvcGdfc3RhdF9zdGF0ZW1lbnRzL3BnX3N0YXRfc3RhdGVtZW50cy5jIGIvY29udHJpYi9w Z19zdGF0X3N0YXRlbWVudHMvcGdfc3RhdF9zdGF0ZW1lbnRzLmMKaW5kZXggMzkyMDhmODBiNWIu LjVjMTE5MzliNjU2IDEwMDY0NAotLS0gYS9jb250cmliL3BnX3N0YXRfc3RhdGVtZW50cy9wZ19z dGF0X3N0YXRlbWVudHMuYworKysgYi9jb250cmliL3BnX3N0YXRfc3RhdGVtZW50cy9wZ19zdGF0 X3N0YXRlbWVudHMuYwpAQCAtNTAsNyArNTAsNiBAQAogI2luY2x1ZGUgImFjY2Vzcy9odHVwX2Rl dGFpbHMuaCIKICNpbmNsdWRlICJhY2Nlc3MvcGFyYWxsZWwuaCIKICNpbmNsdWRlICJjYXRhbG9n L3BnX2F1dGhpZC5oIgotI2luY2x1ZGUgImNvbW1vbi9pbnQuaCIKICNpbmNsdWRlICJleGVjdXRv ci9pbnN0cnVtZW50LmgiCiAjaW5jbHVkZSAiZnVuY2FwaS5oIgogI2luY2x1ZGUgImppdC9qaXQu aCIKQEAgLTU5LDcgKzU4LDYgQEAKICNpbmNsdWRlICJub2Rlcy9xdWVyeWp1bWJsZS5oIgogI2lu Y2x1ZGUgIm9wdGltaXplci9wbGFubmVyLmgiCiAjaW5jbHVkZSAicGFyc2VyL2FuYWx5emUuaCIK LSNpbmNsdWRlICJwYXJzZXIvc2Nhbm5lci5oIgogI2luY2x1ZGUgInBnc3RhdC5oIgogI2luY2x1 ZGUgInN0b3JhZ2UvZmQuaCIKICNpbmNsdWRlICJzdG9yYWdlL2lwYy5oIgpAQCAtMzc3LDExICsz NzUsNiBAQCBzdGF0aWMgY2hhciAqcXRleHRfZmV0Y2goU2l6ZSBxdWVyeV9vZmZzZXQsIGludCBx dWVyeV9sZW4sCiBzdGF0aWMgYm9vbCBuZWVkX2djX3F0ZXh0cyh2b2lkKTsKIHN0YXRpYyB2b2lk IGdjX3F0ZXh0cyh2b2lkKTsKIHN0YXRpYyBUaW1lc3RhbXBUeiBlbnRyeV9yZXNldChPaWQgdXNl cmlkLCBPaWQgZGJpZCwgaW50NjQgcXVlcnlpZCwgYm9vbCBtaW5tYXhfb25seSk7Ci1zdGF0aWMg Y2hhciAqZ2VuZXJhdGVfbm9ybWFsaXplZF9xdWVyeShKdW1ibGVTdGF0ZSAqanN0YXRlLCBjb25z dCBjaGFyICpxdWVyeSwKLQkJCQkJCQkJCSAgIGludCBxdWVyeV9sb2MsIGludCAqcXVlcnlfbGVu X3ApOwotc3RhdGljIHZvaWQgZmlsbF9pbl9jb25zdGFudF9sZW5ndGhzKEp1bWJsZVN0YXRlICpq c3RhdGUsIGNvbnN0IGNoYXIgKnF1ZXJ5LAotCQkJCQkJCQkJIGludCBxdWVyeV9sb2MpOwotc3Rh dGljIGludAljb21wX2xvY2F0aW9uKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpOwogCiAK IC8qCkBAIC0xMzU5LDkgKzEzNTIsMTcgQEAgcGdzc19zdG9yZShjb25zdCBjaGFyICpxdWVyeSwg aW50NjQgcXVlcnlJZCwKIAkJaWYgKGpzdGF0ZSkKIAkJewogCQkJTFdMb2NrUmVsZWFzZShwZ3Nz LT5sb2NrKTsKLQkJCW5vcm1fcXVlcnkgPSBnZW5lcmF0ZV9ub3JtYWxpemVkX3F1ZXJ5KGpzdGF0 ZSwgcXVlcnksCi0JCQkJCQkJCQkJCQkgICBxdWVyeV9sb2NhdGlvbiwKLQkJCQkJCQkJCQkJCSAg ICZxdWVyeV9sZW4pOworCisJCQkvKgorCQkJICogZ2VuZXJhdGUgdGhlIG5vcm1hbGl6ZWQgcXVl cnkuIE5vdGUgdGhhdCB0aGUgbm9ybWFsaXplZAorCQkJICogcmVwcmVzZW50YXRpb24gbWF5IHdl bGwgdmFyeSBkZXBlbmRpbmcgb24ganVzdCB3aGljaAorCQkJICogImVxdWl2YWxlbnQiIHF1ZXJ5 IGlzIHVzZWQgdG8gY3JlYXRlIHRoZSBoYXNodGFibGUgZW50cnkuIFdlCisJCQkgKiBhc3N1bWUg dGhpcyBpcyBPSy4KKwkJCSAqLworCQkJQXNzZXJ0KGpzdGF0ZS0+bm9ybWFsaXplX3F1ZXJ5ICE9 IE5VTEwpOworCQkJbm9ybV9xdWVyeSA9IGpzdGF0ZS0+bm9ybWFsaXplX3F1ZXJ5KGpzdGF0ZSwg cXVlcnksCisJCQkJCQkJCQkJCQkgcXVlcnlfbG9jYXRpb24sCisJCQkJCQkJCQkJCQkgJnF1ZXJ5 X2xlbik7CiAJCQlMV0xvY2tBY3F1aXJlKHBnc3MtPmxvY2ssIExXX1NIQVJFRCk7CiAJCX0KIApA QCAtMjgyMywyNTkgKzI4MjQsMyBAQCByZWxlYXNlX2xvY2s6CiAKIAlyZXR1cm4gc3RhdHNfcmVz ZXQ7CiB9Ci0KLS8qCi0gKiBHZW5lcmF0ZSBhIG5vcm1hbGl6ZWQgdmVyc2lvbiBvZiB0aGUgcXVl cnkgc3RyaW5nIHRoYXQgd2lsbCBiZSB1c2VkIHRvCi0gKiByZXByZXNlbnQgYWxsIHNpbWlsYXIg cXVlcmllcy4KLSAqCi0gKiBOb3RlIHRoYXQgdGhlIG5vcm1hbGl6ZWQgcmVwcmVzZW50YXRpb24g bWF5IHdlbGwgdmFyeSBkZXBlbmRpbmcgb24KLSAqIGp1c3Qgd2hpY2ggImVxdWl2YWxlbnQiIHF1 ZXJ5IGlzIHVzZWQgdG8gY3JlYXRlIHRoZSBoYXNodGFibGUgZW50cnkuCi0gKiBXZSBhc3N1bWUg dGhpcyBpcyBPSy4KLSAqCi0gKiBJZiBxdWVyeV9sb2MgPiAwLCB0aGVuICJxdWVyeSIgaGFzIGJl ZW4gYWR2YW5jZWQgYnkgdGhhdCBtdWNoIGNvbXBhcmVkIHRvCi0gKiB0aGUgb3JpZ2luYWwgc3Ry aW5nIHN0YXJ0LCBzbyB3ZSBuZWVkIHRvIHRyYW5zbGF0ZSB0aGUgcHJvdmlkZWQgbG9jYXRpb25z Ci0gKiB0byBjb21wZW5zYXRlLiAgKFRoaXMgbGV0cyB1cyBhdm9pZCByZS1zY2FubmluZyBzdGF0 ZW1lbnRzIGJlZm9yZSB0aGUgb25lCi0gKiBvZiBpbnRlcmVzdCwgc28gaXQncyB3b3J0aCBkb2lu Zy4pCi0gKgotICogKnF1ZXJ5X2xlbl9wIGNvbnRhaW5zIHRoZSBpbnB1dCBzdHJpbmcgbGVuZ3Ro LCBhbmQgaXMgdXBkYXRlZCB3aXRoCi0gKiB0aGUgcmVzdWx0IHN0cmluZyBsZW5ndGggb24gZXhp dC4gIFRoZSByZXN1bHRpbmcgc3RyaW5nIG1pZ2h0IGJlIGxvbmdlcgotICogb3Igc2hvcnRlciBk ZXBlbmRpbmcgb24gd2hhdCBoYXBwZW5zIHdpdGggcmVwbGFjZW1lbnQgb2YgY29uc3RhbnRzLgot ICoKLSAqIFJldHVybnMgYSBwYWxsb2MnZCBzdHJpbmcuCi0gKi8KLXN0YXRpYyBjaGFyICoKLWdl bmVyYXRlX25vcm1hbGl6ZWRfcXVlcnkoSnVtYmxlU3RhdGUgKmpzdGF0ZSwgY29uc3QgY2hhciAq cXVlcnksCi0JCQkJCQkgIGludCBxdWVyeV9sb2MsIGludCAqcXVlcnlfbGVuX3ApCi17Ci0JY2hh cgkgICAqbm9ybV9xdWVyeTsKLQlpbnQJCQlxdWVyeV9sZW4gPSAqcXVlcnlfbGVuX3A7Ci0JaW50 CQkJbm9ybV9xdWVyeV9idWZsZW4sCS8qIFNwYWNlIGFsbG93ZWQgZm9yIG5vcm1fcXVlcnkgKi8K LQkJCQlsZW5fdG9fd3J0LAkJLyogTGVuZ3RoIChpbiBieXRlcykgdG8gd3JpdGUgKi8KLQkJCQlx dWVyX2xvYyA9IDAsCS8qIFNvdXJjZSBxdWVyeSBieXRlIGxvY2F0aW9uICovCi0JCQkJbl9xdWVy X2xvYyA9IDAsIC8qIE5vcm1hbGl6ZWQgcXVlcnkgYnl0ZSBsb2NhdGlvbiAqLwotCQkJCWxhc3Rf b2ZmID0gMCwJLyogT2Zmc2V0IGZyb20gc3RhcnQgZm9yIHByZXZpb3VzIHRvayAqLwotCQkJCWxh c3RfdG9rX2xlbiA9IDA7CS8qIExlbmd0aCAoaW4gYnl0ZXMpIG9mIHRoYXQgdG9rICovCi0JaW50 CQkJbnVtX2NvbnN0YW50c19yZXBsYWNlZCA9IDA7Ci0KLQkvKgotCSAqIEdldCBjb25zdGFudHMn IGxlbmd0aHMgKGNvcmUgc3lzdGVtIG9ubHkgZ2l2ZXMgdXMgbG9jYXRpb25zKS4gIE5vdGUKLQkg KiB0aGlzIGFsc28gZW5zdXJlcyB0aGUgaXRlbXMgYXJlIHNvcnRlZCBieSBsb2NhdGlvbi4KLQkg Ki8KLQlmaWxsX2luX2NvbnN0YW50X2xlbmd0aHMoanN0YXRlLCBxdWVyeSwgcXVlcnlfbG9jKTsK LQotCS8qCi0JICogQWxsb3cgZm9yICRuIHN5bWJvbHMgdG8gYmUgbG9uZ2VyIHRoYW4gdGhlIGNv bnN0YW50cyB0aGV5IHJlcGxhY2UuCi0JICogQ29uc3RhbnRzIG11c3QgdGFrZSBhdCBsZWFzdCBv bmUgYnl0ZSBpbiB0ZXh0IGZvcm0sIHdoaWxlIGEgJG4gc3ltYm9sCi0JICogY2VydGFpbmx5IGlz bid0IG1vcmUgdGhhbiAxMSBieXRlcywgZXZlbiBpZiBuIHJlYWNoZXMgSU5UX01BWC4gIFdlCi0J ICogY291bGQgcmVmaW5lIHRoYXQgbGltaXQgYmFzZWQgb24gdGhlIG1heCB2YWx1ZSBvZiBuIGZv ciB0aGUgY3VycmVudAotCSAqIHF1ZXJ5LCBidXQgaXQgaGFyZGx5IHNlZW1zIHdvcnRoIGFueSBl eHRyYSBlZmZvcnQgdG8gZG8gc28uCi0JICovCi0Jbm9ybV9xdWVyeV9idWZsZW4gPSBxdWVyeV9s ZW4gKyBqc3RhdGUtPmNsb2NhdGlvbnNfY291bnQgKiAxMDsKLQotCS8qIEFsbG9jYXRlIHJlc3Vs dCBidWZmZXIgKi8KLQlub3JtX3F1ZXJ5ID0gcGFsbG9jKG5vcm1fcXVlcnlfYnVmbGVuICsgMSk7 Ci0KLQlmb3IgKGludCBpID0gMDsgaSA8IGpzdGF0ZS0+Y2xvY2F0aW9uc19jb3VudDsgaSsrKQot CXsKLQkJaW50CQkJb2ZmLAkJLyogT2Zmc2V0IGZyb20gc3RhcnQgZm9yIGN1ciB0b2sgKi8KLQkJ CQkJdG9rX2xlbjsJLyogTGVuZ3RoIChpbiBieXRlcykgb2YgdGhhdCB0b2sgKi8KLQotCQkvKgot CQkgKiBJZiB3ZSBoYXZlIGFuIGV4dGVybmFsIHBhcmFtIGF0IHRoaXMgbG9jYXRpb24sIGJ1dCBu byBsaXN0cyBhcmUKLQkJICogYmVpbmcgc3F1YXNoZWQgYWNyb3NzIHRoZSBxdWVyeSwgdGhlbiB3 ZSBza2lwIGhlcmU7IHRoaXMgd2lsbCBtYWtlCi0JCSAqIHVzIHByaW50IHRoZSBjaGFyYWN0ZXJz IGZvdW5kIGluIHRoZSBvcmlnaW5hbCBxdWVyeSB0aGF0IHJlcHJlc2VudAotCQkgKiB0aGUgcGFy YW1ldGVyIGluIHRoZSBuZXh0IGl0ZXJhdGlvbiAob3IgYWZ0ZXIgdGhlIGxvb3AgaXMgZG9uZSks Ci0JCSAqIHdoaWNoIGlzIGEgYml0IG9kZCBidXQgc2VlbXMgdG8gd29yayBva2F5IGluIG1vc3Qg Y2FzZXMuCi0JCSAqLwotCQlpZiAoanN0YXRlLT5jbG9jYXRpb25zW2ldLmV4dGVybl9wYXJhbSAm JiAhanN0YXRlLT5oYXNfc3F1YXNoZWRfbGlzdHMpCi0JCQljb250aW51ZTsKLQotCQlvZmYgPSBq c3RhdGUtPmNsb2NhdGlvbnNbaV0ubG9jYXRpb247Ci0KLQkJLyogQWRqdXN0IHJlY29yZGVkIGxv Y2F0aW9uIGlmIHdlJ3JlIGRlYWxpbmcgd2l0aCBwYXJ0aWFsIHN0cmluZyAqLwotCQlvZmYgLT0g cXVlcnlfbG9jOwotCi0JCXRva19sZW4gPSBqc3RhdGUtPmNsb2NhdGlvbnNbaV0ubGVuZ3RoOwot Ci0JCWlmICh0b2tfbGVuIDwgMCkKLQkJCWNvbnRpbnVlOwkJCS8qIGlnbm9yZSBhbnkgZHVwbGlj YXRlcyAqLwotCi0JCS8qIENvcHkgbmV4dCBjaHVuayAod2hhdCBwcmVjZWRlcyB0aGUgbmV4dCBj b25zdGFudCkgKi8KLQkJbGVuX3RvX3dydCA9IG9mZiAtIGxhc3Rfb2ZmOwotCQlsZW5fdG9fd3J0 IC09IGxhc3RfdG9rX2xlbjsKLQkJQXNzZXJ0KGxlbl90b193cnQgPj0gMCk7Ci0JCW1lbWNweShu b3JtX3F1ZXJ5ICsgbl9xdWVyX2xvYywgcXVlcnkgKyBxdWVyX2xvYywgbGVuX3RvX3dydCk7Ci0J CW5fcXVlcl9sb2MgKz0gbGVuX3RvX3dydDsKLQotCQkvKgotCQkgKiBBbmQgaW5zZXJ0IGEgcGFy YW0gc3ltYm9sIGluIHBsYWNlIG9mIHRoZSBjb25zdGFudCB0b2tlbjsgYW5kLCBpZgotCQkgKiB3 ZSBoYXZlIGEgc3F1YXNoYWJsZSBsaXN0LCBpbnNlcnQgYSBwbGFjZWhvbGRlciBjb21tZW50IHN0 YXJ0aW5nCi0JCSAqIGZyb20gdGhlIGxpc3QncyBzZWNvbmQgdmFsdWUuCi0JCSAqLwotCQluX3F1 ZXJfbG9jICs9IHNwcmludGYobm9ybV9xdWVyeSArIG5fcXVlcl9sb2MsICIkJWQlcyIsCi0JCQkJ CQkJICBudW1fY29uc3RhbnRzX3JlcGxhY2VkICsgMSArIGpzdGF0ZS0+aGlnaGVzdF9leHRlcm5f cGFyYW1faWQsCi0JCQkJCQkJICBqc3RhdGUtPmNsb2NhdGlvbnNbaV0uc3F1YXNoZWQgPyAiIC8q LCAuLi4gKi8iIDogIiIpOwotCQludW1fY29uc3RhbnRzX3JlcGxhY2VkKys7Ci0KLQkJLyogbW92 ZSBmb3J3YXJkICovCi0JCXF1ZXJfbG9jID0gb2ZmICsgdG9rX2xlbjsKLQkJbGFzdF9vZmYgPSBv ZmY7Ci0JCWxhc3RfdG9rX2xlbiA9IHRva19sZW47Ci0JfQotCi0JLyoKLQkgKiBXZSd2ZSBjb3Bp ZWQgdXAgdW50aWwgdGhlIGxhc3QgaWdub3JhYmxlIGNvbnN0YW50LiAgQ29weSBvdmVyIHRoZQot CSAqIHJlbWFpbmluZyBieXRlcyBvZiB0aGUgb3JpZ2luYWwgcXVlcnkgc3RyaW5nLgotCSAqLwot CWxlbl90b193cnQgPSBxdWVyeV9sZW4gLSBxdWVyX2xvYzsKLQotCUFzc2VydChsZW5fdG9fd3J0 ID49IDApOwotCW1lbWNweShub3JtX3F1ZXJ5ICsgbl9xdWVyX2xvYywgcXVlcnkgKyBxdWVyX2xv YywgbGVuX3RvX3dydCk7Ci0Jbl9xdWVyX2xvYyArPSBsZW5fdG9fd3J0OwotCi0JQXNzZXJ0KG5f cXVlcl9sb2MgPD0gbm9ybV9xdWVyeV9idWZsZW4pOwotCW5vcm1fcXVlcnlbbl9xdWVyX2xvY10g PSAnXDAnOwotCi0JKnF1ZXJ5X2xlbl9wID0gbl9xdWVyX2xvYzsKLQlyZXR1cm4gbm9ybV9xdWVy eTsKLX0KLQotLyoKLSAqIEdpdmVuIGEgdmFsaWQgU1FMIHN0cmluZyBhbmQgYW4gYXJyYXkgb2Yg Y29uc3RhbnQtbG9jYXRpb24gcmVjb3JkcywKLSAqIGZpbGwgaW4gdGhlIHRleHR1YWwgbGVuZ3Ro cyBvZiB0aG9zZSBjb25zdGFudHMuCi0gKgotICogVGhlIGNvbnN0YW50cyBtYXkgdXNlIGFueSBh bGxvd2VkIGNvbnN0YW50IHN5bnRheCwgc3VjaCBhcyBmbG9hdCBsaXRlcmFscywKLSAqIGJpdC1z dHJpbmdzLCBzaW5nbGUtcXVvdGVkIHN0cmluZ3MgYW5kIGRvbGxhci1xdW90ZWQgc3RyaW5ncy4g IFRoaXMgaXMKLSAqIGFjY29tcGxpc2hlZCBieSB1c2luZyB0aGUgcHVibGljIEFQSSBmb3IgdGhl IGNvcmUgc2Nhbm5lci4KLSAqCi0gKiBJdCBpcyB0aGUgY2FsbGVyJ3Mgam9iIHRvIGVuc3VyZSB0 aGF0IHRoZSBzdHJpbmcgaXMgYSB2YWxpZCBTUUwgc3RhdGVtZW50Ci0gKiB3aXRoIGNvbnN0YW50 cyBhdCB0aGUgaW5kaWNhdGVkIGxvY2F0aW9ucy4gIFNpbmNlIGluIHByYWN0aWNlIHRoZSBzdHJp bmcKLSAqIGhhcyBhbHJlYWR5IGJlZW4gcGFyc2VkLCBhbmQgdGhlIGxvY2F0aW9ucyB0aGF0IHRo ZSBjYWxsZXIgcHJvdmlkZXMgd2lsbAotICogaGF2ZSBvcmlnaW5hdGVkIGZyb20gd2l0aGluIHRo ZSBhdXRob3JpdGF0aXZlIHBhcnNlciwgdGhpcyBzaG91bGQgbm90IGJlCi0gKiBhIHByb2JsZW0u Ci0gKgotICogTXVsdGlwbGUgY29uc3RhbnRzIGNhbiBoYXZlIHRoZSBzYW1lIGxvY2F0aW9uLiAg V2UgcmVzZXQgbGVuZ3RocyBvZiB0aG9zZQotICogcGFzdCB0aGUgZmlyc3QgdG8gLTEgc28gdGhh dCB0aGV5IGNhbiBsYXRlciBiZSBpZ25vcmVkLgotICoKLSAqIElmIHF1ZXJ5X2xvYyA+IDAsIHRo ZW4gInF1ZXJ5IiBoYXMgYmVlbiBhZHZhbmNlZCBieSB0aGF0IG11Y2ggY29tcGFyZWQgdG8KLSAq IHRoZSBvcmlnaW5hbCBzdHJpbmcgc3RhcnQsIHNvIHdlIG5lZWQgdG8gdHJhbnNsYXRlIHRoZSBw cm92aWRlZCBsb2NhdGlvbnMKLSAqIHRvIGNvbXBlbnNhdGUuICAoVGhpcyBsZXRzIHVzIGF2b2lk IHJlLXNjYW5uaW5nIHN0YXRlbWVudHMgYmVmb3JlIHRoZSBvbmUKLSAqIG9mIGludGVyZXN0LCBz byBpdCdzIHdvcnRoIGRvaW5nLikKLSAqCi0gKiBOLkIuIFRoZXJlIGlzIGFuIGFzc3VtcHRpb24g dGhhdCBhICctJyBjaGFyYWN0ZXIgYXQgYSBDb25zdCBsb2NhdGlvbiBiZWdpbnMKLSAqIGEgbmVn YXRpdmUgbnVtZXJpYyBjb25zdGFudC4gIFRoaXMgcHJlY2x1ZGVzIHRoZXJlIGV2ZXIgYmVpbmcg YW5vdGhlcgotICogcmVhc29uIGZvciBhIGNvbnN0YW50IHRvIHN0YXJ0IHdpdGggYSAnLScuCi0g Ki8KLXN0YXRpYyB2b2lkCi1maWxsX2luX2NvbnN0YW50X2xlbmd0aHMoSnVtYmxlU3RhdGUgKmpz dGF0ZSwgY29uc3QgY2hhciAqcXVlcnksCi0JCQkJCQkgaW50IHF1ZXJ5X2xvYykKLXsKLQlMb2Nh dGlvbkxlbiAqbG9jczsKLQljb3JlX3l5c2Nhbl90IHl5c2Nhbm5lcjsKLQljb3JlX3l5X2V4dHJh X3R5cGUgeXlleHRyYTsKLQljb3JlX1lZU1RZUEUgeXlsdmFsOwotCVlZTFRZUEUJCXl5bGxvYzsK LQotCS8qCi0JICogU29ydCB0aGUgcmVjb3JkcyBieSBsb2NhdGlvbiBzbyB0aGF0IHdlIGNhbiBw cm9jZXNzIHRoZW0gaW4gb3JkZXIgd2hpbGUKLQkgKiBzY2FubmluZyB0aGUgcXVlcnkgdGV4dC4K LQkgKi8KLQlpZiAoanN0YXRlLT5jbG9jYXRpb25zX2NvdW50ID4gMSkKLQkJcXNvcnQoanN0YXRl LT5jbG9jYXRpb25zLCBqc3RhdGUtPmNsb2NhdGlvbnNfY291bnQsCi0JCQkgIHNpemVvZihMb2Nh dGlvbkxlbiksIGNvbXBfbG9jYXRpb24pOwotCWxvY3MgPSBqc3RhdGUtPmNsb2NhdGlvbnM7Ci0K LQkvKiBpbml0aWFsaXplIHRoZSBmbGV4IHNjYW5uZXIgLS0tIHNob3VsZCBtYXRjaCByYXdfcGFy c2VyKCkgKi8KLQl5eXNjYW5uZXIgPSBzY2FubmVyX2luaXQocXVlcnksCi0JCQkJCQkJICZ5eWV4 dHJhLAotCQkJCQkJCSAmU2NhbktleXdvcmRzLAotCQkJCQkJCSBTY2FuS2V5d29yZFRva2Vucyk7 Ci0KLQkvKiB3ZSBkb24ndCB3YW50IHRvIHJlLWVtaXQgYW55IGVzY2FwZSBzdHJpbmcgd2Fybmlu Z3MgKi8KLQl5eWV4dHJhLmVzY2FwZV9zdHJpbmdfd2FybmluZyA9IGZhbHNlOwotCi0JLyogU2Vh cmNoIGZvciBlYWNoIGNvbnN0YW50LCBpbiBzZXF1ZW5jZSAqLwotCWZvciAoaW50IGkgPSAwOyBp IDwganN0YXRlLT5jbG9jYXRpb25zX2NvdW50OyBpKyspCi0JewotCQlpbnQJCQlsb2M7Ci0JCWlu dAkJCXRvazsKLQotCQkvKiBJZ25vcmUgY29uc3RhbnRzIGFmdGVyIHRoZSBmaXJzdCBvbmUgaW4g dGhlIHNhbWUgbG9jYXRpb24gKi8KLQkJaWYgKGkgPiAwICYmIGxvY3NbaV0ubG9jYXRpb24gPT0g bG9jc1tpIC0gMV0ubG9jYXRpb24pCi0JCXsKLQkJCWxvY3NbaV0ubGVuZ3RoID0gLTE7Ci0JCQlj b250aW51ZTsKLQkJfQotCi0JCWlmIChsb2NzW2ldLnNxdWFzaGVkKQotCQkJY29udGludWU7CQkJ Lyogc3F1YXNoYWJsZSBsaXN0LCBpZ25vcmUgKi8KLQotCQkvKiBBZGp1c3QgcmVjb3JkZWQgbG9j YXRpb24gaWYgd2UncmUgZGVhbGluZyB3aXRoIHBhcnRpYWwgc3RyaW5nICovCi0JCWxvYyA9IGxv Y3NbaV0ubG9jYXRpb24gLSBxdWVyeV9sb2M7Ci0JCUFzc2VydChsb2MgPj0gMCk7Ci0KLQkJLyoK LQkJICogV2UgaGF2ZSBhIHZhbGlkIGxvY2F0aW9uIGZvciBhIGNvbnN0YW50IHRoYXQncyBub3Qg YSBkdXBlLiBMZXgKLQkJICogdG9rZW5zIHVudGlsIHdlIGZpbmQgdGhlIGRlc2lyZWQgY29uc3Rh bnQuCi0JCSAqLwotCQlmb3IgKDs7KQotCQl7Ci0JCQl0b2sgPSBjb3JlX3l5bGV4KCZ5eWx2YWws ICZ5eWxsb2MsIHl5c2Nhbm5lcik7Ci0KLQkJCS8qIFdlIHNob3VsZCBub3QgaGl0IGVuZC1vZi1z dHJpbmcsIGJ1dCBpZiB3ZSBkbywgYmVoYXZlIHNhbmVseSAqLwotCQkJaWYgKHRvayA9PSAwKQot CQkJCWJyZWFrOwkJCS8qIG91dCBvZiBpbm5lciBmb3ItbG9vcCAqLwotCi0JCQkvKgotCQkJICog V2Ugc2hvdWxkIGZpbmQgdGhlIHRva2VuIHBvc2l0aW9uIGV4YWN0bHksIGJ1dCBpZiB3ZSBzb21l aG93Ci0JCQkgKiBydW4gcGFzdCBpdCwgd29yayB3aXRoIHRoYXQuCi0JCQkgKi8KLQkJCWlmICh5 eWxsb2MgPj0gbG9jKQotCQkJewotCQkJCWlmIChxdWVyeVtsb2NdID09ICctJykKLQkJCQl7Ci0J CQkJCS8qCi0JCQkJCSAqIEl0J3MgYSBuZWdhdGl2ZSB2YWx1ZSAtIHRoaXMgaXMgdGhlIG9uZSBh bmQgb25seSBjYXNlCi0JCQkJCSAqIHdoZXJlIHdlIHJlcGxhY2UgbW9yZSB0aGFuIGEgc2luZ2xl IHRva2VuLgotCQkJCQkgKgotCQkJCQkgKiBEbyBub3QgY29tcGVuc2F0ZSBmb3IgdGhlIGNvcmUg c3lzdGVtJ3Mgc3BlY2lhbC1jYXNlCi0JCQkJCSAqIGFkanVzdG1lbnQgb2YgbG9jYXRpb24gdG8g dGhhdCBvZiB0aGUgbGVhZGluZyAnLScKLQkJCQkJICogb3BlcmF0b3IgaW4gdGhlIGV2ZW50IG9m IGEgbmVnYXRpdmUgY29uc3RhbnQuICBJdCBpcwotCQkJCQkgKiBhbHNvIHVzZWZ1bCBmb3Igb3Vy IHB1cnBvc2VzIHRvIHN0YXJ0IGZyb20gdGhlIG1pbnVzCi0JCQkJCSAqIHN5bWJvbC4gIEluIHRo aXMgd2F5LCBxdWVyaWVzIGxpa2UgInNlbGVjdCAqIGZyb20gZm9vCi0JCQkJCSAqIHdoZXJlIGJh ciA9IDEiIGFuZCAic2VsZWN0ICogZnJvbSBmb28gd2hlcmUgYmFyID0gLTIiCi0JCQkJCSAqIHdp bGwgaGF2ZSBpZGVudGljYWwgbm9ybWFsaXplZCBxdWVyeSBzdHJpbmdzLgotCQkJCQkgKi8KLQkJ CQkJdG9rID0gY29yZV95eWxleCgmeXlsdmFsLCAmeXlsbG9jLCB5eXNjYW5uZXIpOwotCQkJCQlp ZiAodG9rID09IDApCi0JCQkJCQlicmVhazsJLyogb3V0IG9mIGlubmVyIGZvci1sb29wICovCi0J CQkJfQotCi0JCQkJLyoKLQkJCQkgKiBXZSBub3cgcmVseSBvbiB0aGUgYXNzdW1wdGlvbiB0aGF0 IGZsZXggaGFzIHBsYWNlZCBhIHplcm8KLQkJCQkgKiBieXRlIGFmdGVyIHRoZSB0ZXh0IG9mIHRo ZSBjdXJyZW50IHRva2VuIGluIHNjYW5idWYuCi0JCQkJICovCi0JCQkJbG9jc1tpXS5sZW5ndGgg PSBzdHJsZW4oeXlleHRyYS5zY2FuYnVmICsgbG9jKTsKLQkJCQlicmVhazsJCQkvKiBvdXQgb2Yg aW5uZXIgZm9yLWxvb3AgKi8KLQkJCX0KLQkJfQotCi0JCS8qIElmIHdlIGhpdCBlbmQtb2Ytc3Ry aW5nLCBnaXZlIHVwLCBsZWF2aW5nIHJlbWFpbmluZyBsZW5ndGhzIC0xICovCi0JCWlmICh0b2sg PT0gMCkKLQkJCWJyZWFrOwotCX0KLQotCXNjYW5uZXJfZmluaXNoKHl5c2Nhbm5lcik7Ci19Ci0K LS8qCi0gKiBjb21wX2xvY2F0aW9uOiBjb21wYXJhdG9yIGZvciBxc29ydGluZyBMb2NhdGlvbkxl biBzdHJ1Y3RzIGJ5IGxvY2F0aW9uCi0gKi8KLXN0YXRpYyBpbnQKLWNvbXBfbG9jYXRpb24oY29u c3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYikKLXsKLQlpbnQJCQlsID0gKChjb25zdCBMb2NhdGlv bkxlbiAqKSBhKS0+bG9jYXRpb247Ci0JaW50CQkJciA9ICgoY29uc3QgTG9jYXRpb25MZW4gKikg YiktPmxvY2F0aW9uOwotCi0JcmV0dXJuIHBnX2NtcF9zMzIobCwgcik7Ci19CmRpZmYgLS1naXQg YS9zcmMvYmFja2VuZC9ub2Rlcy9xdWVyeWp1bWJsZWZ1bmNzLmMgYi9zcmMvYmFja2VuZC9ub2Rl cy9xdWVyeWp1bWJsZWZ1bmNzLmMKaW5kZXggZmZjMjMwYWY0MjcuLjlkZDQzYTc0NTZmIDEwMDY0 NAotLS0gYS9zcmMvYmFja2VuZC9ub2Rlcy9xdWVyeWp1bWJsZWZ1bmNzLmMKKysrIGIvc3JjL2Jh Y2tlbmQvbm9kZXMvcXVlcnlqdW1ibGVmdW5jcy5jCkBAIC00MCwxMCArNDAsMTIgQEAKICNpbmNs dWRlICJhY2Nlc3MvdHJhbnNhbS5oIgogI2luY2x1ZGUgImNhdGFsb2cvcGdfcHJvYy5oIgogI2lu Y2x1ZGUgImNvbW1vbi9oYXNoZm4uaCIKKyNpbmNsdWRlICJjb21tb24vaW50LmgiCiAjaW5jbHVk ZSAibWlzY2FkbWluLmgiCiAjaW5jbHVkZSAibm9kZXMvbm9kZUZ1bmNzLmgiCiAjaW5jbHVkZSAi bm9kZXMvcXVlcnlqdW1ibGUuaCIKICNpbmNsdWRlICJ1dGlscy9sc3lzY2FjaGUuaCIKKyNpbmNs dWRlICJwYXJzZXIvc2Nhbm5lci5oIgogI2luY2x1ZGUgInBhcnNlci9zY2Fuc3VwLmgiCiAKICNk ZWZpbmUgSlVNQkxFX1NJWkUJCQkJMTAyNAkvKiBxdWVyeSBzZXJpYWxpemF0aW9uIGJ1ZmZlciBz aXplICovCkBAIC02OCw2ICs3MCw4IEBAIHN0YXRpYyB2b2lkIEZsdXNoUGVuZGluZ051bGxzKEp1 bWJsZVN0YXRlICpqc3RhdGUpOwogc3RhdGljIHZvaWQgUmVjb3JkQ29uc3RMb2NhdGlvbihKdW1i bGVTdGF0ZSAqanN0YXRlLAogCQkJCQkJCQlib29sIGV4dGVybl9wYXJhbSwKIAkJCQkJCQkJaW50 IGxvY2F0aW9uLCBpbnQgbGVuKTsKK3N0YXRpYyBjaGFyICpHZW5lcmF0ZU5vcm1hbGl6ZWRRdWVy eShKdW1ibGVTdGF0ZSAqanN0YXRlLCBjb25zdCBjaGFyICpxdWVyeSwKKwkJCQkJCQkJCSBpbnQg cXVlcnlfbG9jLCBpbnQgKnF1ZXJ5X2xlbl9wKTsKIHN0YXRpYyB2b2lkIF9qdW1ibGVOb2RlKEp1 bWJsZVN0YXRlICpqc3RhdGUsIE5vZGUgKm5vZGUpOwogc3RhdGljIHZvaWQgX2p1bWJsZUxpc3Qo SnVtYmxlU3RhdGUgKmpzdGF0ZSwgTm9kZSAqbm9kZSk7CiBzdGF0aWMgdm9pZCBfanVtYmxlRWxl bWVudHMoSnVtYmxlU3RhdGUgKmpzdGF0ZSwgTGlzdCAqZWxlbWVudHMsIE5vZGUgKm5vZGUpOwpA QCAtMTk2LDYgKzIwMCw3IEBAIEluaXRKdW1ibGUodm9pZCkKICNpZmRlZiBVU0VfQVNTRVJUX0NI RUNLSU5HCiAJanN0YXRlLT50b3RhbF9qdW1ibGVfbGVuID0gMDsKICNlbmRpZgorCWpzdGF0ZS0+ bm9ybWFsaXplX3F1ZXJ5ID0gR2VuZXJhdGVOb3JtYWxpemVkUXVlcnk7CiAKIAlyZXR1cm4ganN0 YXRlOwogfQpAQCAtNzczLDMgKzc3OCwyNDkgQEAgX2p1bWJsZVJhbmdlVGJsRW50cnlfZXJlZihK dW1ibGVTdGF0ZSAqanN0YXRlLAogCSAqLwogCUpVTUJMRV9TVFJJTkcoYWxpYXNuYW1lKTsKIH0K KworLyoKKyAqIENvbXBMb2NhdGlvbjogY29tcGFyYXRvciBmb3IgcXNvcnRpbmcgTG9jYXRpb25M ZW4gc3RydWN0cyBieSBsb2NhdGlvbgorICovCitzdGF0aWMgaW50CitDb21wTG9jYXRpb24oY29u c3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYikKK3sKKwlpbnQJCQlsID0gKChjb25zdCBMb2NhdGlv bkxlbiAqKSBhKS0+bG9jYXRpb247CisJaW50CQkJciA9ICgoY29uc3QgTG9jYXRpb25MZW4gKikg YiktPmxvY2F0aW9uOworCisJcmV0dXJuIHBnX2NtcF9zMzIobCwgcik7Cit9CisKKy8qCisgKiBH aXZlbiBhIHZhbGlkIFNRTCBzdHJpbmcgYW5kIGFuIGFycmF5IG9mIGNvbnN0YW50LWxvY2F0aW9u IHJlY29yZHMsCisgKiBmaWxsIGluIHRoZSB0ZXh0dWFsIGxlbmd0aHMgb2YgdGhvc2UgY29uc3Rh bnRzIGluIEp1bWJsZVN0YXRlLgorICoKKyAqIFRoZSBjb25zdGFudHMgbWF5IHVzZSBhbnkgYWxs b3dlZCBjb25zdGFudCBzeW50YXgsIHN1Y2ggYXMgZmxvYXQgbGl0ZXJhbHMsCisgKiBiaXQtc3Ry aW5ncywgc2luZ2xlLXF1b3RlZCBzdHJpbmdzIGFuZCBkb2xsYXItcXVvdGVkIHN0cmluZ3MuICBU aGlzIGlzCisgKiBhY2NvbXBsaXNoZWQgYnkgdXNpbmcgdGhlIHB1YmxpYyBBUEkgZm9yIHRoZSBj b3JlIHNjYW5uZXIuCisgKgorICogTXVsdGlwbGUgY29uc3RhbnRzIGNhbiBoYXZlIHRoZSBzYW1l IGxvY2F0aW9uLiAgV2UgcmVzZXQgbGVuZ3RocyBvZiB0aG9zZQorICogcGFzdCB0aGUgZmlyc3Qg dG8gLTEgc28gdGhhdCB0aGV5IGNhbiBsYXRlciBiZSBpZ25vcmVkLgorICoKKyAqIE4uQi4gVGhl cmUgaXMgYW4gYXNzdW1wdGlvbiB0aGF0IGEgJy0nIGNoYXJhY3RlciBhdCBhIENvbnN0IGxvY2F0 aW9uIGJlZ2lucworICogYSBuZWdhdGl2ZSBudW1lcmljIGNvbnN0YW50LiAgVGhpcyBwcmVjbHVk ZXMgdGhlcmUgZXZlciBiZWluZyBhbm90aGVyCisgKiByZWFzb24gZm9yIGEgY29uc3RhbnQgdG8g c3RhcnQgd2l0aCBhICctJy4KKyAqLworc3RhdGljIHZvaWQKK1NldENvbnN0YW50TGVuZ3RocyhK dW1ibGVTdGF0ZSAqanN0YXRlLCBjb25zdCBjaGFyICpxdWVyeSwKKwkJCQkgICBpbnQgcXVlcnlf bG9jKQoreworCUxvY2F0aW9uTGVuICpsb2NzOworCWNvcmVfeXlzY2FuX3QgeXlzY2FubmVyOwor CWNvcmVfeXlfZXh0cmFfdHlwZSB5eWV4dHJhOworCWNvcmVfWVlTVFlQRSB5eWx2YWw7CisJWVlM VFlQRQkJeXlsbG9jOworCisJLyoKKwkgKiBTb3J0IHRoZSByZWNvcmRzIGJ5IGxvY2F0aW9uIHNv IHRoYXQgd2UgY2FuIHByb2Nlc3MgdGhlbSBpbiBvcmRlciB3aGlsZQorCSAqIHNjYW5uaW5nIHRo ZSBxdWVyeSB0ZXh0LgorCSAqLworCWlmIChqc3RhdGUtPmNsb2NhdGlvbnNfY291bnQgPiAxKQor CQlxc29ydChqc3RhdGUtPmNsb2NhdGlvbnMsIGpzdGF0ZS0+Y2xvY2F0aW9uc19jb3VudCwKKwkJ CSAgc2l6ZW9mKExvY2F0aW9uTGVuKSwgQ29tcExvY2F0aW9uKTsKKwlsb2NzID0ganN0YXRlLT5j bG9jYXRpb25zOworCisJLyogaW5pdGlhbGl6ZSB0aGUgZmxleCBzY2FubmVyIC0tLSBzaG91bGQg bWF0Y2ggcmF3X3BhcnNlcigpICovCisJeXlzY2FubmVyID0gc2Nhbm5lcl9pbml0KHF1ZXJ5LAor CQkJCQkJCSAmeXlleHRyYSwKKwkJCQkJCQkgJlNjYW5LZXl3b3JkcywKKwkJCQkJCQkgU2Nhbktl eXdvcmRUb2tlbnMpOworCisJLyogd2UgZG9uJ3Qgd2FudCB0byByZS1lbWl0IGFueSBlc2NhcGUg c3RyaW5nIHdhcm5pbmdzICovCisJeXlleHRyYS5lc2NhcGVfc3RyaW5nX3dhcm5pbmcgPSBmYWxz ZTsKKworCS8qIFNlYXJjaCBmb3IgZWFjaCBjb25zdGFudCwgaW4gc2VxdWVuY2UgKi8KKwlmb3Ig KGludCBpID0gMDsgaSA8IGpzdGF0ZS0+Y2xvY2F0aW9uc19jb3VudDsgaSsrKQorCXsKKwkJaW50 CQkJbG9jOworCQlpbnQJCQl0b2s7CisKKwkJLyogSWdub3JlIGNvbnN0YW50cyBhZnRlciB0aGUg Zmlyc3Qgb25lIGluIHRoZSBzYW1lIGxvY2F0aW9uICovCisJCWlmIChpID4gMCAmJiBsb2NzW2ld LmxvY2F0aW9uID09IGxvY3NbaSAtIDFdLmxvY2F0aW9uKQorCQl7CisJCQlsb2NzW2ldLmxlbmd0 aCA9IC0xOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAobG9jc1tpXS5zcXVhc2hlZCkKKwkJ CWNvbnRpbnVlOwkJCS8qIHNxdWFzaGFibGUgbGlzdCwgaWdub3JlICovCisKKwkJLyoKKwkJICog QWRqdXN0IHRoZSBjb25zdGFudCdzIGxvY2F0aW9uIHVzaW5nIHRoZSBwcm92aWRlZCBzdGFydGlu ZyBsb2NhdGlvbgorCQkgKiBvZiB0aGUgY3VycmVudCBzdGF0ZW1lbnQuIFRoaXMgYWxsb3dzIHVz IHRvIGF2b2lkIHNjYW5uaW5nIGEKKwkJICogbXVsdGktc3RhdGVtZW50IHN0cmluZyBmcm9tIHRo ZSBiZWdpbm5pbmcuCisJCSAqLworCQlsb2MgPSBsb2NzW2ldLmxvY2F0aW9uIC0gcXVlcnlfbG9j OworCQlBc3NlcnQobG9jID49IDApOworCisJCS8qCisJCSAqIFdlIGhhdmUgYSB2YWxpZCBsb2Nh dGlvbiBmb3IgYSBjb25zdGFudCB0aGF0J3Mgbm90IGEgZHVwZS4gTGV4CisJCSAqIHRva2VucyB1 bnRpbCB3ZSBmaW5kIHRoZSBkZXNpcmVkIGNvbnN0YW50LgorCQkgKi8KKwkJZm9yICg7OykKKwkJ eworCQkJdG9rID0gY29yZV95eWxleCgmeXlsdmFsLCAmeXlsbG9jLCB5eXNjYW5uZXIpOworCisJ CQkvKiBXZSBzaG91bGQgbm90IGhpdCBlbmQtb2Ytc3RyaW5nLCBidXQgaWYgd2UgZG8sIGJlaGF2 ZSBzYW5lbHkgKi8KKwkJCWlmICh0b2sgPT0gMCkKKwkJCQlicmVhazsJCQkvKiBvdXQgb2YgaW5u ZXIgZm9yLWxvb3AgKi8KKworCQkJLyoKKwkJCSAqIFdlIHNob3VsZCBmaW5kIHRoZSB0b2tlbiBw b3NpdGlvbiBleGFjdGx5LCBidXQgaWYgd2Ugc29tZWhvdworCQkJICogcnVuIHBhc3QgaXQsIHdv cmsgd2l0aCB0aGF0LgorCQkJICovCisJCQlpZiAoeXlsbG9jID49IGxvYykKKwkJCXsKKwkJCQlp ZiAocXVlcnlbbG9jXSA9PSAnLScpCisJCQkJeworCQkJCQkvKgorCQkJCQkgKiBJdCdzIGEgbmVn YXRpdmUgdmFsdWUgLSB0aGlzIGlzIHRoZSBvbmUgYW5kIG9ubHkgY2FzZQorCQkJCQkgKiB3aGVy ZSB3ZSByZXBsYWNlIG1vcmUgdGhhbiBhIHNpbmdsZSB0b2tlbi4KKwkJCQkJICoKKwkJCQkJICog RG8gbm90IGNvbXBlbnNhdGUgZm9yIHRoZSBzcGVjaWFsLWNhc2UgYWRqdXN0bWVudCBvZgorCQkJ CQkgKiBsb2NhdGlvbiB0byB0aGF0IG9mIHRoZSBsZWFkaW5nICctJyBvcGVyYXRvciBpbiB0aGUK KwkJCQkJICogZXZlbnQgb2YgYSBuZWdhdGl2ZSBjb25zdGFudCAoc2VlIGRvTmVnYXRlKCkgaW4K KwkJCQkJICogZ3JhbS55KS4gIEl0IGlzIGFsc28gdXNlZnVsIGZvciBvdXIgcHVycG9zZXMgdG8g c3RhcnQKKwkJCQkJICogZnJvbSB0aGUgbWludXMgc3ltYm9sLiAgSW4gdGhpcyB3YXksIHF1ZXJp ZXMgbGlrZQorCQkJCQkgKiAic2VsZWN0ICogZnJvbSBmb28gd2hlcmUgYmFyID0gMSIgYW5kICJz ZWxlY3QgKiBmcm9tCisJCQkJCSAqIGZvbyB3aGVyZSBiYXIgPSAtMiIgd2lsbCBoYXZlIGlkZW50 aWNhbCBub3JtYWxpemVkCisJCQkJCSAqIHF1ZXJ5IHN0cmluZ3MuCisJCQkJCSAqLworCQkJCQl0 b2sgPSBjb3JlX3l5bGV4KCZ5eWx2YWwsICZ5eWxsb2MsIHl5c2Nhbm5lcik7CisJCQkJCWlmICh0 b2sgPT0gMCkKKwkJCQkJCWJyZWFrOwkvKiBvdXQgb2YgaW5uZXIgZm9yLWxvb3AgKi8KKwkJCQl9 CisKKwkJCQkvKgorCQkJCSAqIFdlIG5vdyByZWx5IG9uIHRoZSBhc3N1bXB0aW9uIHRoYXQgZmxl eCBoYXMgcGxhY2VkIGEgemVybworCQkJCSAqIGJ5dGUgYWZ0ZXIgdGhlIHRleHQgb2YgdGhlIGN1 cnJlbnQgdG9rZW4gaW4gc2NhbmJ1Zi4KKwkJCQkgKi8KKwkJCQlsb2NzW2ldLmxlbmd0aCA9IHN0 cmxlbih5eWV4dHJhLnNjYW5idWYgKyBsb2MpOworCQkJCWJyZWFrOwkJCS8qIG91dCBvZiBpbm5l ciBmb3ItbG9vcCAqLworCQkJfQorCQl9CisKKwkJLyogSWYgd2UgaGl0IGVuZC1vZi1zdHJpbmcs IGdpdmUgdXAsIGxlYXZpbmcgcmVtYWluaW5nIGxlbmd0aHMgLTEgKi8KKwkJaWYgKHRvayA9PSAw KQorCQkJYnJlYWs7CisJfQorCisJc2Nhbm5lcl9maW5pc2goeXlzY2FubmVyKTsKK30KKworLyoK KyAqIENhbGxiYWNrIHRvIGdlbmVyYXRlIGEgbm9ybWFsaXplZCB2ZXJzaW9uIG9mIHRoZSBxdWVy eSBzdHJpbmcgdGhhdCB3aWxsIGJlIHVzZWQgdG8KKyAqIHJlcHJlc2VudCBhbGwgc2ltaWxhciBx dWVyaWVzLgorICoKKyAqIEl0IGlzIHRoZSBjYWxsZXIncyBqb2IgdG8gZW5zdXJlIHRoYXQgdGhl IHN0cmluZyBpcyBhIHZhbGlkIFNRTCBzdGF0ZW1lbnQKKyAqIHdpdGggdGhlIGNvcnJlY3QgY29u c3RhbnQgbG9jYXRpb25zIGluIGpzdGF0ZS0+Y2xvY2F0aW9ucy4gU2luY2UgaW4KKyAqIHByYWN0 aWNlIHRoZSBzdHJpbmcgaGFzIGFscmVhZHkgYmVlbiBwYXJzZWQgdXNpbmcgdGhlIGF1dGhvcml0 YXRpdmUgcGFyc2VyCisgKiBhbmQgdGhlIGxvY2F0aW9ucyBhcmUgc2V0IGJ5IGNvcmUgcXVlcnkg anVtYmxpbmcsIHRoaXMgc2hvdWxkIG5vdCBiZSBhIHByb2JsZW0uCisgKgorICogKnF1ZXJ5X2xl bl9wIGNvbnRhaW5zIHRoZSBpbnB1dCBzdHJpbmcgbGVuZ3RoLCBhbmQgaXMgdXBkYXRlZCB3aXRo CisgKiB0aGUgcmVzdWx0IHN0cmluZyBsZW5ndGggb24gZXhpdC4gIFRoZSByZXN1bHRpbmcgc3Ry aW5nIG1pZ2h0IGJlIGxvbmdlcgorICogb3Igc2hvcnRlciBkZXBlbmRpbmcgb24gd2hhdCBoYXBw ZW5zIHdpdGggcmVwbGFjZW1lbnQgb2YgY29uc3RhbnRzLgorICoKKyAqIFJldHVybnMgYSBwYWxs b2MnZCBzdHJpbmcuCisgKi8KK3N0YXRpYyBjaGFyICoKK0dlbmVyYXRlTm9ybWFsaXplZFF1ZXJ5 KEp1bWJsZVN0YXRlICpqc3RhdGUsIGNvbnN0IGNoYXIgKnF1ZXJ5LAorCQkJCQkJaW50IHF1ZXJ5 X2xvYywgaW50ICpxdWVyeV9sZW5fcCkKK3sKKwljaGFyCSAgICpub3JtX3F1ZXJ5OworCWludAkJ CXF1ZXJ5X2xlbiA9ICpxdWVyeV9sZW5fcDsKKwlpbnQJCQlub3JtX3F1ZXJ5X2J1ZmxlbiwJLyog U3BhY2UgYWxsb3dlZCBmb3Igbm9ybV9xdWVyeSAqLworCQkJCWxlbl90b193cnQsCQkvKiBMZW5n dGggKGluIGJ5dGVzKSB0byB3cml0ZSAqLworCQkJCXF1ZXJfbG9jID0gMCwJLyogU291cmNlIHF1 ZXJ5IGJ5dGUgbG9jYXRpb24gKi8KKwkJCQluX3F1ZXJfbG9jID0gMCwgLyogTm9ybWFsaXplZCBx dWVyeSBieXRlIGxvY2F0aW9uICovCisJCQkJbGFzdF9vZmYgPSAwLAkvKiBPZmZzZXQgZnJvbSBz dGFydCBmb3IgcHJldmlvdXMgdG9rICovCisJCQkJbGFzdF90b2tfbGVuID0gMDsJLyogTGVuZ3Ro IChpbiBieXRlcykgb2YgdGhhdCB0b2sgKi8KKwlpbnQJCQludW1fY29uc3RhbnRzX3JlcGxhY2Vk ID0gMDsKKworCS8qCisJICogU2V0IGNvbnN0YW50cycgbGVuZ3RocyBpbiBKdW1ibGVTdGF0ZSwg YXMgb25seSBsb2NhdGlvbnMgYXJlIHNldCBkdXJpbmcKKwkgKiBEb0p1bWJsZSgpLiBOb3RlIHRo aXMgYWxzbyBlbnN1cmVzIHRoZSBpdGVtcyBhcmUgc29ydGVkIGJ5IGxvY2F0aW9uLgorCSAqLwor CVNldENvbnN0YW50TGVuZ3RocygoSnVtYmxlU3RhdGUgKikganN0YXRlLCBxdWVyeSwgcXVlcnlf bG9jKTsKKworCS8qCisJICogQWxsb3cgZm9yICRuIHN5bWJvbHMgdG8gYmUgbG9uZ2VyIHRoYW4g dGhlIGNvbnN0YW50cyB0aGV5IHJlcGxhY2UuCisJICogQ29uc3RhbnRzIG11c3QgdGFrZSBhdCBs ZWFzdCBvbmUgYnl0ZSBpbiB0ZXh0IGZvcm0sIHdoaWxlIGEgJG4gc3ltYm9sCisJICogY2VydGFp bmx5IGlzbid0IG1vcmUgdGhhbiAxMSBieXRlcywgZXZlbiBpZiBuIHJlYWNoZXMgSU5UX01BWC4g IFdlCisJICogY291bGQgcmVmaW5lIHRoYXQgbGltaXQgYmFzZWQgb24gdGhlIG1heCB2YWx1ZSBv ZiBuIGZvciB0aGUgY3VycmVudAorCSAqIHF1ZXJ5LCBidXQgaXQgaGFyZGx5IHNlZW1zIHdvcnRo IGFueSBleHRyYSBlZmZvcnQgdG8gZG8gc28uCisJICovCisJbm9ybV9xdWVyeV9idWZsZW4gPSBx dWVyeV9sZW4gKyBqc3RhdGUtPmNsb2NhdGlvbnNfY291bnQgKiAxMDsKKworCS8qIEFsbG9jYXRl IHJlc3VsdCBidWZmZXIgKi8KKwlub3JtX3F1ZXJ5ID0gcGFsbG9jKG5vcm1fcXVlcnlfYnVmbGVu ICsgMSk7CisKKwlmb3IgKGludCBpID0gMDsgaSA8IGpzdGF0ZS0+Y2xvY2F0aW9uc19jb3VudDsg aSsrKQorCXsKKwkJaW50CQkJb2ZmLAkJLyogT2Zmc2V0IGZyb20gc3RhcnQgZm9yIGN1ciB0b2sg Ki8KKwkJCQkJdG9rX2xlbjsJLyogTGVuZ3RoIChpbiBieXRlcykgb2YgdGhhdCB0b2sgKi8KKwor CQkvKgorCQkgKiBJZiB3ZSBoYXZlIGFuIGV4dGVybmFsIHBhcmFtIGF0IHRoaXMgbG9jYXRpb24s IGJ1dCBubyBsaXN0cyBhcmUKKwkJICogYmVpbmcgc3F1YXNoZWQgYWNyb3NzIHRoZSBxdWVyeSwg dGhlbiB3ZSBza2lwIGhlcmU7IHRoaXMgd2lsbCBtYWtlCisJCSAqIHVzIHByaW50IHRoZSBjaGFy YWN0ZXJzIGZvdW5kIGluIHRoZSBvcmlnaW5hbCBxdWVyeSB0aGF0IHJlcHJlc2VudAorCQkgKiB0 aGUgcGFyYW1ldGVyIGluIHRoZSBuZXh0IGl0ZXJhdGlvbiAob3IgYWZ0ZXIgdGhlIGxvb3AgaXMg ZG9uZSksCisJCSAqIHdoaWNoIGlzIGEgYml0IG9kZCBidXQgc2VlbXMgdG8gd29yayBva2F5IGlu IG1vc3QgY2FzZXMuCisJCSAqLworCQlpZiAoanN0YXRlLT5jbG9jYXRpb25zW2ldLmV4dGVybl9w YXJhbSAmJiAhanN0YXRlLT5oYXNfc3F1YXNoZWRfbGlzdHMpCisJCQljb250aW51ZTsKKworCQlv ZmYgPSBqc3RhdGUtPmNsb2NhdGlvbnNbaV0ubG9jYXRpb247CisKKwkJLyogQWRqdXN0IHRoZSBj b25zdGFudCdzIGxvY2F0aW9uIChzZWUgU2V0Q29uc3RhbnRMZW5ndGhzKSAqLworCQlvZmYgLT0g cXVlcnlfbG9jOworCisJCXRva19sZW4gPSBqc3RhdGUtPmNsb2NhdGlvbnNbaV0ubGVuZ3RoOwor CisJCWlmICh0b2tfbGVuIDwgMCkKKwkJCWNvbnRpbnVlOwkJCS8qIGlnbm9yZSBhbnkgZHVwbGlj YXRlcyAqLworCisJCS8qIENvcHkgbmV4dCBjaHVuayAod2hhdCBwcmVjZWRlcyB0aGUgbmV4dCBj b25zdGFudCkgKi8KKwkJbGVuX3RvX3dydCA9IG9mZiAtIGxhc3Rfb2ZmOworCQlsZW5fdG9fd3J0 IC09IGxhc3RfdG9rX2xlbjsKKwkJQXNzZXJ0KGxlbl90b193cnQgPj0gMCk7CisJCW1lbWNweShu b3JtX3F1ZXJ5ICsgbl9xdWVyX2xvYywgcXVlcnkgKyBxdWVyX2xvYywgbGVuX3RvX3dydCk7CisJ CW5fcXVlcl9sb2MgKz0gbGVuX3RvX3dydDsKKworCQkvKgorCQkgKiBBbmQgaW5zZXJ0IGEgcGFy YW0gc3ltYm9sIGluIHBsYWNlIG9mIHRoZSBjb25zdGFudCB0b2tlbjsgYW5kLCBpZgorCQkgKiB3 ZSBoYXZlIGEgc3F1YXNoYWJsZSBsaXN0LCBpbnNlcnQgYSBwbGFjZWhvbGRlciBjb21tZW50IHN0 YXJ0aW5nCisJCSAqIGZyb20gdGhlIGxpc3QncyBzZWNvbmQgdmFsdWUuCisJCSAqLworCQluX3F1 ZXJfbG9jICs9IHNwcmludGYobm9ybV9xdWVyeSArIG5fcXVlcl9sb2MsICIkJWQlcyIsCisJCQkJ CQkJICBudW1fY29uc3RhbnRzX3JlcGxhY2VkICsgMSArIGpzdGF0ZS0+aGlnaGVzdF9leHRlcm5f cGFyYW1faWQsCisJCQkJCQkJICBqc3RhdGUtPmNsb2NhdGlvbnNbaV0uc3F1YXNoZWQgPyAiIC8q LCAuLi4gKi8iIDogIiIpOworCQludW1fY29uc3RhbnRzX3JlcGxhY2VkKys7CisKKwkJLyogbW92 ZSBmb3J3YXJkICovCisJCXF1ZXJfbG9jID0gb2ZmICsgdG9rX2xlbjsKKwkJbGFzdF9vZmYgPSBv ZmY7CisJCWxhc3RfdG9rX2xlbiA9IHRva19sZW47CisJfQorCisJLyoKKwkgKiBXZSd2ZSBjb3Bp ZWQgdXAgdW50aWwgdGhlIGxhc3QgaWdub3JhYmxlIGNvbnN0YW50LiAgQ29weSBvdmVyIHRoZQor CSAqIHJlbWFpbmluZyBieXRlcyBvZiB0aGUgb3JpZ2luYWwgcXVlcnkgc3RyaW5nLgorCSAqLwor CWxlbl90b193cnQgPSBxdWVyeV9sZW4gLSBxdWVyX2xvYzsKKworCUFzc2VydChsZW5fdG9fd3J0 ID49IDApOworCW1lbWNweShub3JtX3F1ZXJ5ICsgbl9xdWVyX2xvYywgcXVlcnkgKyBxdWVyX2xv YywgbGVuX3RvX3dydCk7CisJbl9xdWVyX2xvYyArPSBsZW5fdG9fd3J0OworCisJQXNzZXJ0KG5f cXVlcl9sb2MgPD0gbm9ybV9xdWVyeV9idWZsZW4pOworCW5vcm1fcXVlcnlbbl9xdWVyX2xvY10g PSAnXDAnOworCisJKnF1ZXJ5X2xlbl9wID0gbl9xdWVyX2xvYzsKKwlyZXR1cm4gbm9ybV9xdWVy eTsKK30KZGlmZiAtLWdpdCBhL3NyYy9pbmNsdWRlL25vZGVzL3F1ZXJ5anVtYmxlLmggYi9zcmMv aW5jbHVkZS9ub2Rlcy9xdWVyeWp1bWJsZS5oCmluZGV4IGRjYjM2ZGNiNDRmLi5hNzU2ZDliMjQ0 NiAxMDA2NDQKLS0tIGEvc3JjL2luY2x1ZGUvbm9kZXMvcXVlcnlqdW1ibGUuaAorKysgYi9zcmMv aW5jbHVkZS9ub2Rlcy9xdWVyeWp1bWJsZS5oCkBAIC03NSw2ICs3NSwxNSBAQCB0eXBlZGVmIHN0 cnVjdCBKdW1ibGVTdGF0ZQogCS8qIFRoZSB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgYWRkZWQgdG8g dGhlIGp1bWJsZSBidWZmZXIgKi8KIAlTaXplCQl0b3RhbF9qdW1ibGVfbGVuOwogI2VuZGlmCisK KwkvKgorCSAqIEludGVybmFsIGNhbGxiYWNrIGZvciBxdWVyeSBub3JtYWxpemF0aW9uLiBUaGUg Y2FsbGJhY2sgbWF5IG1vZGlmeQorCSAqIGludGVybmFsIHN0YXRlIChlLmcuLCBmaWxsaW5nIGlu IGNvbnN0YW50IGxlbmd0aHMpLiBUaGlzIGlzIHNldCB0bworCSAqIEdlbmVyYXRlTm9ybWFsaXpl ZFF1ZXJ5IGR1cmluZyBJbml0SnVtYmxlKCksIGJ1dCB0aGlyZC1wYXJ0eSBwbHVnaW5zCisJICog dGhhdCB3YW50IHRvIHByb3ZpZGUgdGhlaXIgb3duIG5vcm1hbGl6YXRpb24gbWF5IG1vZGlmeSBp dC4KKwkgKi8KKwljaGFyCSAgICooKm5vcm1hbGl6ZV9xdWVyeSkgKHN0cnVjdCBKdW1ibGVTdGF0 ZSAqanN0YXRlLAorCQkJCQkJCQkJY29uc3QgY2hhciAqcXVlcnksIGludCBxdWVyeV9sb2MsIGlu dCAqcXVlcnlfbGVuX3ApOwogfSBKdW1ibGVTdGF0ZTsKIAogLyogVmFsdWVzIGZvciB0aGUgY29t cHV0ZV9xdWVyeV9pZCBHVUMgKi8KLS0gCjIuNDMuMAoK --000000000000bebcc5064654decb--