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.94.2) (envelope-from ) id 1skJH7-009exX-JE for pgsql-hackers@arkaria.postgresql.org; Sat, 31 Aug 2024 08:16:02 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.94.2) (envelope-from ) id 1skJH4-002jBL-In for pgsql-hackers@arkaria.postgresql.org; Sat, 31 Aug 2024 08:15:59 +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.94.2) (envelope-from ) id 1skJH3-002jB6-Ro for pgsql-hackers@lists.postgresql.org; Sat, 31 Aug 2024 08:15:58 +0000 Received: from mail-lj1-x22c.google.com ([2a00:1450:4864:20::22c]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.94.2) (envelope-from ) id 1skJH0-002J33-Up for pgsql-hackers@lists.postgresql.org; Sat, 31 Aug 2024 08:15:57 +0000 Received: by mail-lj1-x22c.google.com with SMTP id 38308e7fff4ca-2f3e071eb64so34033241fa.1 for ; Sat, 31 Aug 2024 01:15:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1725092152; x=1725696952; darn=lists.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=SeGdlu67O4Ha9jMWQCikd+zs+2RQ4hRbYfFQH6izIWI=; b=cMYSn3X44N+SE5lmludksLg4kk4uQwynls/orj4Q/zLCzL5+89RwpRAG+3czKKL4dL Awqi3eQxXGu55gvfkx+6SwfFncqyxgOxCdqL+yBALqHCTPsmcQcAChSqtOFlWgo/mkgy UVrCsJxxwhS/JxC3Ml8Ru8h7chL/22cBBRy44K/DzJIk610/VD7XM57QFW1VlfDwaxww vHHOOUo8Wtde4TKpP8AePQqVK2i1UstuOf21flFMZPTM8XhY6ogjT+wVMWrzoFc7V4KW ioRS7Hll9NcBFEzZnmBLr9OGeA9cZmoot9/gVteWdK7zXl+qn19aSl/eKR1zpa7T1G1u ewnA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1725092152; x=1725696952; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=SeGdlu67O4Ha9jMWQCikd+zs+2RQ4hRbYfFQH6izIWI=; b=wT93+VM1XmmWp3Cy9gUUIRGfPci4vWhVmmzoj4YauDiaMgUtveMFkDXEIAjXzc7DRp /pJqyLSfmDvJX/I98w4di4m9kSoY59gF0zUKALAWyAmAJOcLzr5BySXnLABipmmB2cYl g9r6pVI9H3xSCmbm4El6+18mfuQPmC2OUM83YfLCgUqsVB70QwoKZ4mGlqFYdV1BXN10 Jn5Fck0DhmGWXxcZBKQ9ZzsF/T9lm++1ZF4XRUQTajQ2V0ELYAuSE4mubpqwkWjh+KEr AyYFF0K9BZYEuSG8oPkdjS83MFAyuvMvehgcidFFlvg0fJQCEPquxJ+0HSpbR1E+sf2p gOMQ== X-Forwarded-Encrypted: i=1; AJvYcCUkCw0aXQ0VVBDGZjDD2Xy22sMBltjIM0jGDORUNbw7I2eGNder5cq+sr4I5lJjGLsY31LeIY8Bl9PiOXID@lists.postgresql.org X-Gm-Message-State: AOJu0YyWt/twbmyMKCSCf7SlQlwsMaToaTSNgxxHLZXiTrRymzf/a32V Gkfl/0Z9trcXifUVDVN/v1bin2sfdlwFds3EDXIYDf5X8f/hUvxk+mFdqyDA9qW62Gth4hVSMrw k637rXfzqk1znBYAchJXLdDBghd4= X-Google-Smtp-Source: AGHT+IFHP8vFTFTZIw5/rOLeD0Hmye5GXQgM76eHoWN9v1GqeX9Sb45yQlP1HX7W2XvMnBEmUSvmEvdUhLHGibwQI38= X-Received: by 2002:a05:651c:551:b0:2f0:27da:6864 with SMTP id 38308e7fff4ca-2f6105d7954mr78968671fa.17.1725092151918; Sat, 31 Aug 2024 01:15:51 -0700 (PDT) MIME-Version: 1.0 References: In-Reply-To: From: Bharath Rupireddy Date: Sat, 31 Aug 2024 13:45:39 +0530 Message-ID: Subject: Re: Introduce XID age and inactive timeout based replication slot invalidation To: Peter Smith Cc: Amit Kapila , Ajin Cherian , Bertrand Drouvot , shveta malik , Masahiko Sawada , Nathan Bossart , PostgreSQL Hackers Content-Type: multipart/mixed; boundary="000000000000eba1480620f65036" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000eba1480620f65036 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Hi, Thanks for looking into this. On Fri, Aug 30, 2024 at 8:13=E2=80=AFAM Peter Smith = wrote: > > =3D=3D=3D=3D=3D=3D > Commit message > > 1. > ... introduces a GUC allowing users set inactive timeout. > > ~ > > 1a. You should give the name of the new GUC in the commit message. Modified. > 1b. /set/to set/ Reworded the commit message. > =3D=3D=3D=3D=3D=3D > doc/src/sgml/config.sgml > > GUC "replication_slot_inactive_timeout" > > 2. > Invalidates replication slots that are inactive for longer than > specified amount of time > > nit - suggest use similar wording as the prior GUC (wal_sender_timeout): > Invalidate replication slots that are inactive for longer than this > amount of time. Modified. > 3. > This invalidation check happens either when the slot is acquired for > use or during a checkpoint. The time since the slot has become > inactive is known from its inactive_since value using which the > timeout is measured. > > nit - the wording is too complicated. suggest: > The timeout check occurs when the slot is next acquired for use, or > during a checkpoint. The slot's 'inactive_since' field value is when > the slot became inactive. > 4. > Note that the inactive timeout invalidation mechanism is not > applicable for slots on the standby that are being synced from a > primary server (whose synced field is true). > > nit - that word "whose" seems ambiguous. suggest: > (e.g. the standby slot has 'synced' field true). Reworded. > =3D=3D=3D=3D=3D=3D > doc/src/sgml/system-views.sgml > > 5. > inactive_timeout means that the slot has been inactive for the > duration specified by replication_slot_inactive_timeout parameter. > > nit - suggestion ("longer than"): > ... the slot has been inactive for longer than the duration specified > by the replication_slot_inactive_timeout parameter. Modified. > =3D=3D=3D=3D=3D=3D > src/backend/replication/slot.c > > 6. > /* Maximum number of invalidation causes */ > -#define RS_INVAL_MAX_CAUSES RS_INVAL_WAL_LEVEL > +#define RS_INVAL_MAX_CAUSES RS_INVAL_INACTIVE_TIMEOUT > > IMO this #define belongs in the slot.h, immediately below where the > enum is defined. Please check the commit that introduced it - https://www.postgresql.org/message-id/ZdU3CHqza9XJw4P-%40paquier.xyz. It is kept in the file where it's used. > 7. ReplicationSlotAcquire: > > I had a fundamental question about this logic. > > IIUC the purpose of the patch was to invalidate replication slots that > have been inactive for too long. > > So, it makes sense to me that some periodic processing (e.g. > CheckPointReplicationSlots) might do a sweep over all the slots, and > invalidate the too-long-inactive ones that it finds. > > OTOH, it seemed quite strange to me that the patch logic is also > detecting and invalidating inactive slots during the > ReplicationSlotAcquire function. This is kind of saying "ERROR - > sorry, because this was inactive for too long you can't have it" at > the very moment that you wanted to use it again! IIUC such a slot > would be invalidated by the function InvalidatePossiblyObsoleteSlot(), > but therein lies my doubt -- how can the slot be considered as > "obsolete" when we are in the very act of trying to acquire/use it? > > I guess it might be argued this is not so different to the scenario of > attempting to acquire a slot that had been invalidated momentarily > before during checkpoint processing. But, somehow that scenario seems > more like bad luck to me, versus ReplicationSlotAcquire() deliberately > invalidating something we *know* is wanted. Hm. TBH, there's no real reason for invalidating the slot in ReplicationSlotAcquire(). My thinking back then was to take this opportunity to do some work. I agree to leave the invalidation work to the checkpointer. However, I still think ReplicationSlotAcquire() should error out if the slot has already been invalidated similar to "can no longer get changes from replication slot \"%s\" for wal_removed. > 8. > + ereport(ERROR, > + (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), > + errmsg("can no longer get changes from replication slot \"%s\"", > + NameStr(s->data.name)), > + errdetail("This slot has been invalidated because it was inactive > since %s for more than %d seconds specified by > \"replication_slot_inactive_timeout\".", > + timestamptz_to_str(s->inactive_since), > + replication_slot_inactive_timeout))); > > nit - IMO the info should be split into errdetail + errhint. Like this: > errdetail("The slot became invalid because it was inactive since %s, > which is more than %d seconds ago."...) > errhint("You might need to increase \"%s\".", > "replication_slot_inactive_timeout") "invalid" is being covered by errmsg "invalidating obsolete replication slot", so no need to duplicate it in errdetail. > 9. ReportSlotInvalidation > > + appendStringInfo(&err_detail, > + _("The slot has been inactive since %s for more than %d seconds > specified by \"replication_slot_inactive_timeout\"."), > + timestamptz_to_str(inactive_since), > + replication_slot_inactive_timeout); > + break; > > IMO this error in ReportSlotInvalidation() should be the same as the > other one from ReplicationSlotAcquire(), which I suggested above > (comment #8) should include a hint. Also, including a hint here will > make this new message consistent with the other errhint (for > "max_slot_wal_keep_size") that is already in this function. Not exactly the same but similar. Because ReportSlotInvalidation() errmsg has an "invalidating" component, whereas errmsg in ReplicationSlotAcquire doesn't. Please check latest wordings. > 10. InvalidatePossiblyObsoleteSlot > > + if (cause =3D=3D RS_INVAL_INACTIVE_TIMEOUT && > + (replication_slot_inactive_timeout > 0 && > + s->inactive_since > 0 && > + !(RecoveryInProgress() && s->data.synced))) > > 10a. Everything here is && so this has some redundant parentheses. Removed. > 10b. Actually, IMO this complicated condition is overkill. Won't it be > better to just unconditionally assign > now =3D GetCurrentTimestamp(); here? GetCurrentTimestamp() can get costlier on certain platforms. I think the fields checking in the condition are pretty straight forward - e.g. !RecoveryInProgress() server not in recovery, !s->data.synced slot is not being synced and so on. Added a macro IsInactiveTimeoutSlotInvalidationApplicable() for better readability in two places. > 11. > + * Note that we don't invalidate synced slots because, > + * they are typically considered not active as they don't > + * perform logical decoding to produce the changes. > > nit - tweaked punctuation Used the consistent wording in the commit message, docs and code comments. > 12. > + * If the slot can be acquired, do so or if the slot is already ours, > + * then mark it invalidated. Otherwise we'll signal the owning > + * process, below, and retry. > > nit - tidied this comment. Suggestion: > If the slot can be acquired, do so and mark it as invalidated. If the > slot is already ours, mark it as invalidated. Otherwise, we'll signal > the owning process below and retry. Modified. > 13. > + if (active_pid =3D=3D 0 || > + (MyReplicationSlot !=3D NULL && > + MyReplicationSlot =3D=3D s && > + active_pid =3D=3D MyProcPid)) > > You are already checking MyReplicationSlot =3D=3D s here, so that extra > check for MyReplicationSlot !=3D NULL is redundant, isn't it? Removed. > 14. CheckPointReplicationSlots > > /* > - * Flush all replication slots to disk. > + * Flush all replication slots to disk. Also, invalidate slots during > + * non-shutdown checkpoint. > * > * It is convenient to flush dirty replication slots at the time of chec= kpoint. > * Additionally, in case of a shutdown checkpoint, we also identify the = slots > > nit - /Also, invalidate slots/Also, invalidate obsolete slots/ Modified. > 15. > + {"replication_slot_inactive_timeout", PGC_SIGHUP, REPLICATION_SENDING, > + gettext_noop("Sets the amount of time to wait before invalidating an " > + "inactive replication slot."), > > nit - that is maybe a bit misleading because IIUC there is no real > "waiting" happening anywhere. Suggest: > Sets the amount of time a replication slot can remain inactive before > it will be invalidated. Modified. Please find the attached v44 patch with the above changes. I will include the 0002 xid_age based invalidation patch later. -- Bharath Rupireddy PostgreSQL Contributors Team RDS Open Source Databases Amazon Web Services: https://aws.amazon.com --000000000000eba1480620f65036 Content-Type: application/x-patch; name="v44-0001-Add-inactive_timeout-based-replication-slot-inva.patch" Content-Disposition: attachment; filename="v44-0001-Add-inactive_timeout-based-replication-slot-inva.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_m0husf9v0 RnJvbSBkMGVlNjQzZDI5ZjdkZjZmYTM5NTgxYjRjOTMwNGYzMjdjNzkyNTZhIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBCaGFyYXRoIFJ1cGlyZWRkeSA8YmhhcmF0aC5ydXBpcmVkZHlm b3Jwb3N0Z3Jlc0BnbWFpbC5jb20+CkRhdGU6IFNhdCwgMzEgQXVnIDIwMjQgMDc6NDM6MjIgKzAw MDAKU3ViamVjdDogW1BBVENIIHY0NF0gQWRkIGluYWN0aXZlX3RpbWVvdXQgYmFzZWQgcmVwbGlj YXRpb24gc2xvdCBpbnZhbGlkYXRpb24KClRpbGwgbm93LCBwb3N0Z3JlcyBoYXMgdGhlIGFiaWxp dHkgdG8gaW52YWxpZGF0ZSBpbmFjdGl2ZQpyZXBsaWNhdGlvbiBzbG90cyBiYXNlZCBvbiB0aGUg YW1vdW50IG9mIFdBTCAoc2V0IHZpYQptYXhfc2xvdF93YWxfa2VlcF9zaXplIEdVQykgdGhhdCB3 aWxsIGJlIG5lZWRlZCBmb3IgdGhlIHNsb3RzIGluCmNhc2UgdGhleSBiZWNvbWUgYWN0aXZlLiBI b3dldmVyLCBjaG9vc2luZyBhIGRlZmF1bHQgdmFsdWUgZm9yCnRoaXMgR1VDIGlzIGEgYml0IHRy aWNreS4gQmVjYXVzZSB0aGUgYW1vdW50IG9mIFdBTCBhIGRhdGFiYXNlCmdlbmVyYXRlcywgYW5k IHRoZSBhbGxvY2F0ZWQgc3RvcmFnZSBmb3IgaW5zdGFuY2Ugd2lsbCB2YXJ5CmdyZWF0bHkgaW4g cHJvZHVjdGlvbiwgbWFraW5nIGl0IGRpZmZpY3VsdCB0byBwaW4gZG93biBhCm9uZS1zaXplLWZp dHMtYWxsIHZhbHVlLgoKSXQgaXMgb2Z0ZW4gZWFzeSBmb3IgdXNlcnMgdG8gc2V0IGEgdGltZW91 dCBvZiBzYXkgMSBvciAyIG9yIG4KZGF5cywgYWZ0ZXIgd2hpY2ggYWxsIHRoZSBpbmFjdGl2ZSBz bG90cyBnZXQgaW52YWxpZGF0ZWQuIFRoaXMKY29tbWl0IGludHJvZHVjZXMgYSBHVUMgbmFtZWQg cmVwbGljYXRpb25fc2xvdF9pbmFjdGl2ZV90aW1lb3V0LgpXaGVuIHNldCwgcG9zdGdyZXMgaW52 YWxpZGF0ZXMgc2xvdHMgKGR1cmluZyBub24tc2h1dGRvd24KY2hlY2twb2ludHMpIHRoYXQgYXJl IGluYWN0aXZlIGZvciBsb25nZXIgdGhhbiB0aGlzIGFtb3VudCBvZgp0aW1lLgoKTm90ZSB0aGF0 IHRoZSBpbmFjdGl2ZSB0aW1lb3V0IGludmFsaWRhdGlvbiBtZWNoYW5pc20gaXMgbm90CmFwcGxp Y2FibGUgZm9yIHNsb3RzIG9uIHRoZSBzdGFuZGJ5IHNlcnZlciB0aGF0IGFyZSBiZWluZyBzeW5j ZWQKZnJvbSBwcmltYXJ5IHNlcnZlciAoaS5lLiwgc3RhbmRieSBzbG90cyBoYXZpbmcgJ3N5bmNl ZCcgZmllbGQKdHJ1ZSkuIEJlY2F1c2Ugc3VjaCBzeW5jZWQgc2xvdHMgYXJlIHR5cGljYWxseSBj b25zaWRlcmVkIG5vdAphY3RpdmUgKGZvciB0aGVtIHRvIGJlIGxhdGVyIGNvbnNpZGVyZWQgYXMg aW5hY3RpdmUpIGFzIHRoZXkgZG9uJ3QKcGVyZm9ybSBsb2dpY2FsIGRlY29kaW5nIHRvIHByb2R1 Y2UgdGhlIGNoYW5nZXMuCgpBdXRob3I6IEJoYXJhdGggUnVwaXJlZGR5ClJldmlld2VkLWJ5OiBC ZXJ0cmFuZCBEcm91dm90LCBBbWl0IEthcGlsYQpSZXZpZXdlZC1ieTogQWppbiBDaGVyaWFuLCBT aHZldGEgTWFsaWssIFBldGVyIFNtaXRoCkRpc2N1c3Npb246IGh0dHBzOi8vd3d3LnBvc3RncmVz cWwub3JnL21lc3NhZ2UtaWQvQ0FMajJBQ1c0YVVlLV91RlFPamRXQ0VOLXhYb0xHaG12UkZuTDhT TndfVFo1bkplK2F3QG1haWwuZ21haWwuY29tCkRpc2N1c3Npb246IGh0dHBzOi8vd3d3LnBvc3Rn cmVzcWwub3JnL21lc3NhZ2UtaWQvQ0ElMkJUZ21vWlRiYWFFalNaVUcxRkwwbXp4QWROM3FtWGtz TzNPOV9QWmhFdVhUa1ZuUlElNDBtYWlsLmdtYWlsLmNvbQpEaXNjdXNzaW9uOiBodHRwczovL3d3 dy5wb3N0Z3Jlc3FsLm9yZy9tZXNzYWdlLWlkLzIwMjQwMzI2MDg0MS41amN2N2lobmljY3klNDBh bHZoZXJyZS5wZ3NxbAotLS0KIGRvYy9zcmMvc2dtbC9jb25maWcuc2dtbCAgICAgICAgICAgICAg ICAgICAgICB8ICAzNiArKysKIGRvYy9zcmMvc2dtbC9zeXN0ZW0tdmlld3Muc2dtbCAgICAgICAg ICAgICAgICB8ICAgNyArCiAuLi4vcmVwbGljYXRpb24vbG9naWNhbC9sb2dpY2FsZnVuY3MuYyAg ICAgICAgfCAgIDIgKy0KIHNyYy9iYWNrZW5kL3JlcGxpY2F0aW9uL2xvZ2ljYWwvc2xvdHN5bmMu YyAgICB8ICAgNCArLQogc3JjL2JhY2tlbmQvcmVwbGljYXRpb24vc2xvdC5jICAgICAgICAgICAg ICAgIHwgMTcxICsrKysrKysrKystCiBzcmMvYmFja2VuZC9yZXBsaWNhdGlvbi9zbG90ZnVuY3Mu YyAgICAgICAgICAgfCAgIDIgKy0KIHNyYy9iYWNrZW5kL3JlcGxpY2F0aW9uL3dhbHNlbmRlci5j ICAgICAgICAgICB8ICAgNCArLQogc3JjL2JhY2tlbmQvdXRpbHMvYWR0L3BnX3VwZ3JhZGVfc3Vw cG9ydC5jICAgIHwgICAyICstCiBzcmMvYmFja2VuZC91dGlscy9taXNjL2d1Y190YWJsZXMuYyAg ICAgICAgICAgfCAgMTIgKwogc3JjL2JhY2tlbmQvdXRpbHMvbWlzYy9wb3N0Z3Jlc3FsLmNvbmYu c2FtcGxlIHwgICAxICsKIHNyYy9pbmNsdWRlL3JlcGxpY2F0aW9uL3Nsb3QuaCAgICAgICAgICAg ICAgICB8ICAgNiArLQogc3JjL3Rlc3QvcmVjb3ZlcnkvbWVzb24uYnVpbGQgICAgICAgICAgICAg ICAgIHwgICAxICsKIHNyYy90ZXN0L3JlY292ZXJ5L3QvMDUwX2ludmFsaWRhdGVfc2xvdHMucGwg ICB8IDI4MyArKysrKysrKysrKysrKysrKysKIDEzIGZpbGVzIGNoYW5nZWQsIDUwOCBpbnNlcnRp b25zKCspLCAyMyBkZWxldGlvbnMoLSkKIGNyZWF0ZSBtb2RlIDEwMDY0NCBzcmMvdGVzdC9yZWNv dmVyeS90LzA1MF9pbnZhbGlkYXRlX3Nsb3RzLnBsCgpkaWZmIC0tZ2l0IGEvZG9jL3NyYy9zZ21s L2NvbmZpZy5zZ21sIGIvZG9jL3NyYy9zZ21sL2NvbmZpZy5zZ21sCmluZGV4IDBhZWMxMWY0NDMu Ljk3MGI0OTZlMzkgMTAwNjQ0Ci0tLSBhL2RvYy9zcmMvc2dtbC9jb25maWcuc2dtbAorKysgYi9k b2Mvc3JjL3NnbWwvY29uZmlnLnNnbWwKQEAgLTQ1NTYsNiArNDU1Niw0MiBAQCByZXN0b3JlX2Nv bW1hbmQgPSAnY29weSAiQzpcXHNlcnZlclxcYXJjaGl2ZWRpclxcJWYiICIlcCInICAjIFdpbmRv d3MKICAgICAgIDwvbGlzdGl0ZW0+CiAgICAgIDwvdmFybGlzdGVudHJ5PgogCisgICAgIDx2YXJs aXN0ZW50cnkgaWQ9Imd1Yy1yZXBsaWNhdGlvbi1zbG90LWluYWN0aXZlLXRpbWVvdXQiIHhyZWZs YWJlbD0icmVwbGljYXRpb25fc2xvdF9pbmFjdGl2ZV90aW1lb3V0Ij4KKyAgICAgIDx0ZXJtPjx2 YXJuYW1lPnJlcGxpY2F0aW9uX3Nsb3RfaW5hY3RpdmVfdGltZW91dDwvdmFybmFtZT4gKDx0eXBl PmludGVnZXI8L3R5cGU+KQorICAgICAgPGluZGV4dGVybT4KKyAgICAgICA8cHJpbWFyeT48dmFy bmFtZT5yZXBsaWNhdGlvbl9zbG90X2luYWN0aXZlX3RpbWVvdXQ8L3Zhcm5hbWU+IGNvbmZpZ3Vy YXRpb24gcGFyYW1ldGVyPC9wcmltYXJ5PgorICAgICAgPC9pbmRleHRlcm0+CisgICAgICA8L3Rl cm0+CisgICAgICA8bGlzdGl0ZW0+CisgICAgICAgPHBhcmE+CisgICAgICAgIEludmFsaWRhdGVz IHJlcGxpY2F0aW9uIHNsb3RzIHRoYXQgYXJlIGluYWN0aXZlIGZvciBsb25nZXIgdGhhbgorICAg ICAgICBzcGVjaWZpZWQgYW1vdW50IG9mIHRpbWUuIElmIHRoaXMgdmFsdWUgaXMgc3BlY2lmaWVk IHdpdGhvdXQgdW5pdHMsCisgICAgICAgIGl0IGlzIHRha2VuIGFzIHNlY29uZHMuIEEgdmFsdWUg b2YgemVybyAod2hpY2ggaXMgZGVmYXVsdCkgZGlzYWJsZXMKKyAgICAgICAgdGhlIHRpbWVvdXQg bWVjaGFuaXNtLiBUaGlzIHBhcmFtZXRlciBjYW4gb25seSBiZSBzZXQgaW4KKyAgICAgICAgdGhl IDxmaWxlbmFtZT5wb3N0Z3Jlc3FsLmNvbmY8L2ZpbGVuYW1lPiBmaWxlIG9yIG9uIHRoZSBzZXJ2 ZXIKKyAgICAgICAgY29tbWFuZCBsaW5lLgorICAgICAgIDwvcGFyYT4KKworICAgICAgIDxwYXJh PgorICAgICAgICBUaGlzIGludmFsaWRhdGlvbiBjaGVjayBoYXBwZW5zIGVpdGhlciB3aGVuIHRo ZSBzbG90IGlzIGFjcXVpcmVkCisgICAgICAgIGZvciB1c2Ugb3IgZHVyaW5nIGNoZWNrcG9pbnQu IFRoZSB0aW1lIHNpbmNlIHRoZSBzbG90IGhhcyBiZWNvbWUKKyAgICAgICAgaW5hY3RpdmUgaXMg a25vd24gZnJvbSBpdHMKKyAgICAgICAgPHN0cnVjdGZpZWxkPmluYWN0aXZlX3NpbmNlPC9zdHJ1 Y3RmaWVsZD4gdmFsdWUgdXNpbmcgd2hpY2ggdGhlCisgICAgICAgIHRpbWVvdXQgaXMgbWVhc3Vy ZWQuCisgICAgICAgPC9wYXJhPgorCisgICAgICAgPHBhcmE+CisgICAgICAgIE5vdGUgdGhhdCB0 aGUgaW5hY3RpdmUgdGltZW91dCBpbnZhbGlkYXRpb24gbWVjaGFuaXNtIGlzIG5vdAorICAgICAg ICBhcHBsaWNhYmxlIGZvciBzbG90cyBvbiB0aGUgc3RhbmRieSBzZXJ2ZXIgdGhhdCBhcmUgYmVp bmcgc3luY2VkCisgICAgICAgIGZyb20gcHJpbWFyeSBzZXJ2ZXIgKGkuZS4sIHN0YW5kYnkgc2xv dHMgaGF2aW5nCisgICAgICAgIDxzdHJ1Y3RmaWVsZD5zeW5jZWQ8L3N0cnVjdGZpZWxkPiBmaWVs ZCA8bGl0ZXJhbD50cnVlPC9saXRlcmFsPikuCisgICAgICAgIEJlY2F1c2Ugc3VjaCBzeW5jZWQg c2xvdHMgYXJlIHR5cGljYWxseSBjb25zaWRlcmVkIG5vdCBhY3RpdmUKKyAgICAgICAgKGZvciB0 aGVtIHRvIGJlIGxhdGVyIGNvbnNpZGVyZWQgYXMgaW5hY3RpdmUpIGFzIHRoZXkgZG9uJ3QgcGVy Zm9ybQorICAgICAgICBsb2dpY2FsIGRlY29kaW5nIHRvIHByb2R1Y2UgdGhlIGNoYW5nZXMuCisg ICAgICAgPC9wYXJhPgorICAgICAgPC9saXN0aXRlbT4KKyAgICAgPC92YXJsaXN0ZW50cnk+CisK ICAgICAgPHZhcmxpc3RlbnRyeSBpZD0iZ3VjLXRyYWNrLWNvbW1pdC10aW1lc3RhbXAiIHhyZWZs YWJlbD0idHJhY2tfY29tbWl0X3RpbWVzdGFtcCI+CiAgICAgICA8dGVybT48dmFybmFtZT50cmFj a19jb21taXRfdGltZXN0YW1wPC92YXJuYW1lPiAoPHR5cGU+Ym9vbGVhbjwvdHlwZT4pCiAgICAg ICA8aW5kZXh0ZXJtPgpkaWZmIC0tZ2l0IGEvZG9jL3NyYy9zZ21sL3N5c3RlbS12aWV3cy5zZ21s IGIvZG9jL3NyYy9zZ21sL3N5c3RlbS12aWV3cy5zZ21sCmluZGV4IDYzNGE0YzBmYWIuLmYyMzBl NmU1NzIgMTAwNjQ0Ci0tLSBhL2RvYy9zcmMvc2dtbC9zeXN0ZW0tdmlld3Muc2dtbAorKysgYi9k b2Mvc3JjL3NnbWwvc3lzdGVtLXZpZXdzLnNnbWwKQEAgLTI2MTgsNiArMjYxOCwxMyBAQCBTRUxF Q1QgKiBGUk9NIHBnX2xvY2tzIHBsIExFRlQgSk9JTiBwZ19wcmVwYXJlZF94YWN0cyBwcHgKICAg ICAgICAgICBwZXJmb3JtIGxvZ2ljYWwgZGVjb2RpbmcuICBJdCBpcyBzZXQgb25seSBmb3IgbG9n aWNhbCBzbG90cy4KICAgICAgICAgIDwvcGFyYT4KICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAg ICAgPGxpc3RpdGVtPgorICAgICAgICAgPHBhcmE+CisgICAgICAgICAgPGxpdGVyYWw+aW5hY3Rp dmVfdGltZW91dDwvbGl0ZXJhbD4gbWVhbnMgdGhhdCB0aGUgc2xvdCBoYXMgYmVlbgorICAgICAg ICAgIGluYWN0aXZlIGZvciBsb25nZXIgdGhhbiB0aGUgZHVyYXRpb24gc3BlY2lmaWVkIGJ5Cisg ICAgICAgICAgPHhyZWYgbGlua2VuZD0iZ3VjLXJlcGxpY2F0aW9uLXNsb3QtaW5hY3RpdmUtdGlt ZW91dCIvPiBwYXJhbWV0ZXIuCisgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvbGlzdGl0ZW0+ CiAgICAgICAgPC9pdGVtaXplZGxpc3Q+CiAgICAgICA8L3BhcmE+PC9lbnRyeT4KICAgICAgPC9y b3c+CmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9yZXBsaWNhdGlvbi9sb2dpY2FsL2xvZ2ljYWxm dW5jcy5jIGIvc3JjL2JhY2tlbmQvcmVwbGljYXRpb24vbG9naWNhbC9sb2dpY2FsZnVuY3MuYwpp bmRleCBiNGRkNWNjZTc1Li41NmZjMWE0NWE5IDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9yZXBs aWNhdGlvbi9sb2dpY2FsL2xvZ2ljYWxmdW5jcy5jCisrKyBiL3NyYy9iYWNrZW5kL3JlcGxpY2F0 aW9uL2xvZ2ljYWwvbG9naWNhbGZ1bmNzLmMKQEAgLTE5Nyw3ICsxOTcsNyBAQCBwZ19sb2dpY2Fs X3Nsb3RfZ2V0X2NoYW5nZXNfZ3V0cyhGdW5jdGlvbkNhbGxJbmZvIGZjaW5mbywgYm9vbCBjb25m aXJtLCBib29sIGJpbgogCWVsc2UKIAkJZW5kX29mX3dhbCA9IEdldFhMb2dSZXBsYXlSZWNQdHIo TlVMTCk7CiAKLQlSZXBsaWNhdGlvblNsb3RBY3F1aXJlKE5hbWVTdHIoKm5hbWUpLCB0cnVlKTsK KwlSZXBsaWNhdGlvblNsb3RBY3F1aXJlKE5hbWVTdHIoKm5hbWUpLCB0cnVlLCB0cnVlKTsKIAog CVBHX1RSWSgpOwogCXsKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3JlcGxpY2F0aW9uL2xvZ2lj YWwvc2xvdHN5bmMuYyBiL3NyYy9iYWNrZW5kL3JlcGxpY2F0aW9uL2xvZ2ljYWwvc2xvdHN5bmMu YwppbmRleCA1MTA3MjI5N2ZkLi4yNWM2YTY4YjU0IDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9y ZXBsaWNhdGlvbi9sb2dpY2FsL3Nsb3RzeW5jLmMKKysrIGIvc3JjL2JhY2tlbmQvcmVwbGljYXRp b24vbG9naWNhbC9zbG90c3luYy5jCkBAIC00NDgsNyArNDQ4LDcgQEAgZHJvcF9sb2NhbF9vYnNv bGV0ZV9zbG90cyhMaXN0ICpyZW1vdGVfc2xvdF9saXN0KQogCiAJCQlpZiAoc3luY2VkX3Nsb3Qp CiAJCQl7Ci0JCQkJUmVwbGljYXRpb25TbG90QWNxdWlyZShOYW1lU3RyKGxvY2FsX3Nsb3QtPmRh dGEubmFtZSksIHRydWUpOworCQkJCVJlcGxpY2F0aW9uU2xvdEFjcXVpcmUoTmFtZVN0cihsb2Nh bF9zbG90LT5kYXRhLm5hbWUpLCB0cnVlLCBmYWxzZSk7CiAJCQkJUmVwbGljYXRpb25TbG90RHJv cEFjcXVpcmVkKCk7CiAJCQl9CiAKQEAgLTY2Nyw3ICs2NjcsNyBAQCBzeW5jaHJvbml6ZV9vbmVf c2xvdChSZW1vdGVTbG90ICpyZW1vdGVfc2xvdCwgT2lkIHJlbW90ZV9kYmlkKQogCQkgKiBwcmUt Y2hlY2sgdG8gZW5zdXJlIHRoYXQgYXQgbGVhc3Qgb25lIG9mIHRoZSBzbG90IHByb3BlcnRpZXMg aXMKIAkJICogY2hhbmdlZCBiZWZvcmUgYWNxdWlyaW5nIHRoZSBzbG90LgogCQkgKi8KLQkJUmVw bGljYXRpb25TbG90QWNxdWlyZShyZW1vdGVfc2xvdC0+bmFtZSwgdHJ1ZSk7CisJCVJlcGxpY2F0 aW9uU2xvdEFjcXVpcmUocmVtb3RlX3Nsb3QtPm5hbWUsIHRydWUsIGZhbHNlKTsKIAogCQlBc3Nl cnQoc2xvdCA9PSBNeVJlcGxpY2F0aW9uU2xvdCk7CiAKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5k L3JlcGxpY2F0aW9uL3Nsb3QuYyBiL3NyYy9iYWNrZW5kL3JlcGxpY2F0aW9uL3Nsb3QuYwppbmRl eCAwYTAzNzc2MTU2Li4yNjQ0OGVjYmZkIDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9yZXBsaWNh dGlvbi9zbG90LmMKKysrIGIvc3JjL2JhY2tlbmQvcmVwbGljYXRpb24vc2xvdC5jCkBAIC0xMDcs MTAgKzEwNywxMSBAQCBjb25zdCBjaGFyICpjb25zdCBTbG90SW52YWxpZGF0aW9uQ2F1c2VzW10g PSB7CiAJW1JTX0lOVkFMX1dBTF9SRU1PVkVEXSA9ICJ3YWxfcmVtb3ZlZCIsCiAJW1JTX0lOVkFM X0hPUklaT05dID0gInJvd3NfcmVtb3ZlZCIsCiAJW1JTX0lOVkFMX1dBTF9MRVZFTF0gPSAid2Fs X2xldmVsX2luc3VmZmljaWVudCIsCisJW1JTX0lOVkFMX0lOQUNUSVZFX1RJTUVPVVRdID0gImlu YWN0aXZlX3RpbWVvdXQiLAogfTsKIAogLyogTWF4aW11bSBudW1iZXIgb2YgaW52YWxpZGF0aW9u IGNhdXNlcyAqLwotI2RlZmluZQlSU19JTlZBTF9NQVhfQ0FVU0VTIFJTX0lOVkFMX1dBTF9MRVZF TAorI2RlZmluZQlSU19JTlZBTF9NQVhfQ0FVU0VTIFJTX0lOVkFMX0lOQUNUSVZFX1RJTUVPVVQK IAogU3RhdGljQXNzZXJ0RGVjbChsZW5ndGhvZihTbG90SW52YWxpZGF0aW9uQ2F1c2VzKSA9PSAo UlNfSU5WQUxfTUFYX0NBVVNFUyArIDEpLAogCQkJCSAiYXJyYXkgbGVuZ3RoIG1pc21hdGNoIik7 CkBAIC0xMzEsNiArMTMyLDEyIEBAIFN0YXRpY0Fzc2VydERlY2wobGVuZ3Rob2YoU2xvdEludmFs aWRhdGlvbkNhdXNlcykgPT0gKFJTX0lOVkFMX01BWF9DQVVTRVMgKyAxKSwKICNkZWZpbmUgU0xP VF9NQUdJQwkJMHgxMDUxQ0ExCS8qIGZvcm1hdCBpZGVudGlmaWVyICovCiAjZGVmaW5lIFNMT1Rf VkVSU0lPTgk1CQkvKiB2ZXJzaW9uIGZvciBuZXcgZmlsZXMgKi8KIAorI2RlZmluZSBJc0luYWN0 aXZlVGltZW91dFNsb3RJbnZhbGlkYXRpb25BcHBsaWNhYmxlKHMpIFwKKwkocmVwbGljYXRpb25f c2xvdF9pbmFjdGl2ZV90aW1lb3V0ID4gMCAmJiBcCisJIHMtPmluYWN0aXZlX3NpbmNlID4gMCAm JiBcCisJICFSZWNvdmVyeUluUHJvZ3Jlc3MoKSAmJiBcCisJICFzLT5kYXRhLnN5bmNlZCkKKwog LyogQ29udHJvbCBhcnJheSBmb3IgcmVwbGljYXRpb24gc2xvdCBtYW5hZ2VtZW50ICovCiBSZXBs aWNhdGlvblNsb3RDdGxEYXRhICpSZXBsaWNhdGlvblNsb3RDdGwgPSBOVUxMOwogCkBAIC0xNDAs NiArMTQ3LDcgQEAgUmVwbGljYXRpb25TbG90ICpNeVJlcGxpY2F0aW9uU2xvdCA9IE5VTEw7CiAv KiBHVUMgdmFyaWFibGVzICovCiBpbnQJCQltYXhfcmVwbGljYXRpb25fc2xvdHMgPSAxMDsgLyog dGhlIG1heGltdW0gbnVtYmVyIG9mIHJlcGxpY2F0aW9uCiAJCQkJCQkJCQkJICogc2xvdHMgKi8K K2ludAkJCXJlcGxpY2F0aW9uX3Nsb3RfaW5hY3RpdmVfdGltZW91dCA9IDA7CiAKIC8qCiAgKiBU aGlzIEdVQyBsaXN0cyBzdHJlYW1pbmcgcmVwbGljYXRpb24gc3RhbmRieSBzZXJ2ZXIgc2xvdCBu YW1lcyB0aGF0CkBAIC0xNTksNiArMTY3LDEzIEBAIHN0YXRpYyBYTG9nUmVjUHRyIHNzX29sZGVz dF9mbHVzaF9sc24gPSBJbnZhbGlkWExvZ1JlY1B0cjsKIHN0YXRpYyB2b2lkIFJlcGxpY2F0aW9u U2xvdFNobWVtRXhpdChpbnQgY29kZSwgRGF0dW0gYXJnKTsKIHN0YXRpYyB2b2lkIFJlcGxpY2F0 aW9uU2xvdERyb3BQdHIoUmVwbGljYXRpb25TbG90ICpzbG90KTsKIAorc3RhdGljIGJvb2wgSW52 YWxpZGF0ZVBvc3NpYmx5T2Jzb2xldGVTbG90KFJlcGxpY2F0aW9uU2xvdEludmFsaWRhdGlvbkNh dXNlIGNhdXNlLAorCQkJCQkJCQkJCSAgIFJlcGxpY2F0aW9uU2xvdCAqcywKKwkJCQkJCQkJCQkg ICBYTG9nUmVjUHRyIG9sZGVzdExTTiwKKwkJCQkJCQkJCQkgICBPaWQgZGJvaWQsCisJCQkJCQkJ CQkJICAgVHJhbnNhY3Rpb25JZCBzbmFwc2hvdENvbmZsaWN0SG9yaXpvbiwKKwkJCQkJCQkJCQkg ICBib29sICppbnZhbGlkYXRlZCk7CisKIC8qIGludGVybmFsIHBlcnNpc3RlbmN5IGZ1bmN0aW9u cyAqLwogc3RhdGljIHZvaWQgUmVzdG9yZVNsb3RGcm9tRGlzayhjb25zdCBjaGFyICpuYW1lKTsK IHN0YXRpYyB2b2lkIENyZWF0ZVNsb3RPbkRpc2soUmVwbGljYXRpb25TbG90ICpzbG90KTsKQEAg LTUzNSw5ICs1NTAsMTMgQEAgUmVwbGljYXRpb25TbG90TmFtZShpbnQgaW5kZXgsIE5hbWUgbmFt ZSkKICAqCiAgKiBBbiBlcnJvciBpcyByYWlzZWQgaWYgbm93YWl0IGlzIHRydWUgYW5kIHRoZSBz bG90IGlzIGN1cnJlbnRseSBpbiB1c2UuIElmCiAgKiBub3dhaXQgaXMgZmFsc2UsIHdlIHNsZWVw IHVudGlsIHRoZSBzbG90IGlzIHJlbGVhc2VkIGJ5IHRoZSBvd25pbmcgcHJvY2Vzcy4KKyAqCisg KiBBbiBlcnJvciBpcyByYWlzZWQgaWYgY2hlY2tfZm9yX2ludmFsaWRhdGlvbiBpcyB0cnVlIGFu ZCB0aGUgc2xvdCBoYXMgYmVlbgorICogaW52YWxpZGF0ZWQgcHJldmlvdXNseS4KICAqLwogdm9p ZAotUmVwbGljYXRpb25TbG90QWNxdWlyZShjb25zdCBjaGFyICpuYW1lLCBib29sIG5vd2FpdCkK K1JlcGxpY2F0aW9uU2xvdEFjcXVpcmUoY29uc3QgY2hhciAqbmFtZSwgYm9vbCBub3dhaXQsCisJ CQkJCSAgIGJvb2wgY2hlY2tfZm9yX2ludmFsaWRhdGlvbikKIHsKIAlSZXBsaWNhdGlvblNsb3Qg KnM7CiAJaW50CQkJYWN0aXZlX3BpZDsKQEAgLTYxNSw2ICs2MzQsMjUgQEAgcmV0cnk6CiAJLyog V2UgbWFkZSB0aGlzIHNsb3QgYWN0aXZlLCBzbyBpdCdzIG91cnMgbm93LiAqLwogCU15UmVwbGlj YXRpb25TbG90ID0gczsKIAorCS8qCisJICogRXJyb3Igb3V0IGlmIHRoZSBzbG90IGhhcyBiZWVu IGludmFsaWRhdGVkIHByZXZpb3VzbHkuIEJlY2F1c2UgdGhlcmUncworCSAqIG5vIHVzZSBpbiBh Y3F1aXJpbmcgdGhlIGludmFsaWRhdGVkIHNsb3QuCisJICovCisJaWYgKGNoZWNrX2Zvcl9pbnZh bGlkYXRpb24gJiYKKwkJcy0+ZGF0YS5pbnZhbGlkYXRlZCA9PSBSU19JTlZBTF9JTkFDVElWRV9U SU1FT1VUKQorCXsKKwkJQXNzZXJ0KHMtPmluYWN0aXZlX3NpbmNlID4gMCk7CisJCWVyZXBvcnQo RVJST1IsCisJCQkJKGVycmNvZGUoRVJSQ09ERV9PQkpFQ1RfTk9UX0lOX1BSRVJFUVVJU0lURV9T VEFURSksCisJCQkJIGVycm1zZygiY2FuIG5vIGxvbmdlciBnZXQgY2hhbmdlcyBmcm9tIHJlcGxp Y2F0aW9uIHNsb3QgXCIlc1wiIiwKKwkJCQkJCU5hbWVTdHIocy0+ZGF0YS5uYW1lKSksCisJCQkJ IGVycmRldGFpbCgiVGhlIHNsb3QgYmVjYW1lIGludmFsaWQgYmVjYXVzZSBpdCB3YXMgaW5hY3Rp dmUgc2luY2UgJXMsIHdoaWNoIGlzIG1vcmUgdGhhbiAlZCBzZWNvbmRzIGFnby4iLAorCQkJCQkJ ICAgdGltZXN0YW1wdHpfdG9fc3RyKHMtPmluYWN0aXZlX3NpbmNlKSwKKwkJCQkJCSAgIHJlcGxp Y2F0aW9uX3Nsb3RfaW5hY3RpdmVfdGltZW91dCksCisJCQkJIGVycmhpbnQoIllvdSBtaWdodCBu ZWVkIHRvIGluY3JlYXNlIFwiJXNcIi4iLAorCQkJCQkJICJyZXBsaWNhdGlvbl9zbG90X2luYWN0 aXZlX3RpbWVvdXQuIikpKTsKKwl9CisKIAkvKgogCSAqIFRoZSBjYWxsIHRvIHBnc3RhdF9hY3F1 aXJlX3JlcGxzbG90KCkgcHJvdGVjdHMgYWdhaW5zdCBzdGF0cyBmb3IgYQogCSAqIGRpZmZlcmVu dCBzbG90LCBmcm9tIGJlZm9yZSBhIHJlc3RhcnQgb3Igc3VjaCwgYmVpbmcgcHJlc2VudCBkdXJp bmcKQEAgLTc4NSw3ICs4MjMsNyBAQCBSZXBsaWNhdGlvblNsb3REcm9wKGNvbnN0IGNoYXIgKm5h bWUsIGJvb2wgbm93YWl0KQogewogCUFzc2VydChNeVJlcGxpY2F0aW9uU2xvdCA9PSBOVUxMKTsK IAotCVJlcGxpY2F0aW9uU2xvdEFjcXVpcmUobmFtZSwgbm93YWl0KTsKKwlSZXBsaWNhdGlvblNs b3RBY3F1aXJlKG5hbWUsIG5vd2FpdCwgZmFsc2UpOwogCiAJLyoKIAkgKiBEbyBub3QgYWxsb3cg dXNlcnMgdG8gZHJvcCB0aGUgc2xvdHMgd2hpY2ggYXJlIGN1cnJlbnRseSBiZWluZyBzeW5jZWQK QEAgLTgxMiw3ICs4NTAsNyBAQCBSZXBsaWNhdGlvblNsb3RBbHRlcihjb25zdCBjaGFyICpuYW1l LCBjb25zdCBib29sICpmYWlsb3ZlciwKIAlBc3NlcnQoTXlSZXBsaWNhdGlvblNsb3QgPT0gTlVM TCk7CiAJQXNzZXJ0KGZhaWxvdmVyIHx8IHR3b19waGFzZSk7CiAKLQlSZXBsaWNhdGlvblNsb3RB Y3F1aXJlKG5hbWUsIGZhbHNlKTsKKwlSZXBsaWNhdGlvblNsb3RBY3F1aXJlKG5hbWUsIGZhbHNl LCB0cnVlKTsKIAogCWlmIChTbG90SXNQaHlzaWNhbChNeVJlcGxpY2F0aW9uU2xvdCkpCiAJCWVy ZXBvcnQoRVJST1IsCkBAIC0xNTAxLDEwICsxNTM5LDExIEBAIFJlcG9ydFNsb3RJbnZhbGlkYXRp b24oUmVwbGljYXRpb25TbG90SW52YWxpZGF0aW9uQ2F1c2UgY2F1c2UsCiAJCQkJCSAgIE5hbWVE YXRhIHNsb3RuYW1lLAogCQkJCQkgICBYTG9nUmVjUHRyIHJlc3RhcnRfbHNuLAogCQkJCQkgICBY TG9nUmVjUHRyIG9sZGVzdExTTiwKLQkJCQkJICAgVHJhbnNhY3Rpb25JZCBzbmFwc2hvdENvbmZs aWN0SG9yaXpvbikKKwkJCQkJICAgVHJhbnNhY3Rpb25JZCBzbmFwc2hvdENvbmZsaWN0SG9yaXpv biwKKwkJCQkJICAgVGltZXN0YW1wVHogaW5hY3RpdmVfc2luY2UpCiB7CiAJU3RyaW5nSW5mb0Rh dGEgZXJyX2RldGFpbDsKLQlib29sCQloaW50ID0gZmFsc2U7CisJU3RyaW5nSW5mbwllcnJfaGlu dCA9IE5VTEw7CiAKIAlpbml0U3RyaW5nSW5mbygmZXJyX2RldGFpbCk7CiAKQEAgLTE1MTQsMTMg KzE1NTMsMTYgQEAgUmVwb3J0U2xvdEludmFsaWRhdGlvbihSZXBsaWNhdGlvblNsb3RJbnZhbGlk YXRpb25DYXVzZSBjYXVzZSwKIAkJCXsKIAkJCQl1bnNpZ25lZCBsb25nIGxvbmcgZXggPSBvbGRl c3RMU04gLSByZXN0YXJ0X2xzbjsKIAotCQkJCWhpbnQgPSB0cnVlOwogCQkJCWFwcGVuZFN0cmlu Z0luZm8oJmVycl9kZXRhaWwsCiAJCQkJCQkJCSBuZ2V0dGV4dCgiVGhlIHNsb3QncyByZXN0YXJ0 X2xzbiAlWC8lWCBleGNlZWRzIHRoZSBsaW1pdCBieSAlbGx1IGJ5dGUuIiwKIAkJCQkJCQkJCQkg ICJUaGUgc2xvdCdzIHJlc3RhcnRfbHNuICVYLyVYIGV4Y2VlZHMgdGhlIGxpbWl0IGJ5ICVsbHUg Ynl0ZXMuIiwKIAkJCQkJCQkJCQkgIGV4KSwKIAkJCQkJCQkJIExTTl9GT1JNQVRfQVJHUyhyZXN0 YXJ0X2xzbiksCiAJCQkJCQkJCSBleCk7CisKKwkJCQllcnJfaGludCA9IG1ha2VTdHJpbmdJbmZv KCk7CisJCQkJYXBwZW5kU3RyaW5nSW5mbyhlcnJfaGludCwKKwkJCQkJCQkJIF8oIllvdSBtaWdo dCBuZWVkIHRvIGluY3JlYXNlIFwiJXNcIi4iKSwgIm1heF9zbG90X3dhbF9rZWVwX3NpemUiKTsK IAkJCQlicmVhazsKIAkJCX0KIAkJY2FzZSBSU19JTlZBTF9IT1JJWk9OOgpAQCAtMTUzMSw2ICsx NTczLDE3IEBAIFJlcG9ydFNsb3RJbnZhbGlkYXRpb24oUmVwbGljYXRpb25TbG90SW52YWxpZGF0 aW9uQ2F1c2UgY2F1c2UsCiAJCWNhc2UgUlNfSU5WQUxfV0FMX0xFVkVMOgogCQkJYXBwZW5kU3Ry aW5nSW5mb1N0cmluZygmZXJyX2RldGFpbCwgXygiTG9naWNhbCBkZWNvZGluZyBvbiBzdGFuZGJ5 IHJlcXVpcmVzIFwid2FsX2xldmVsXCIgPj0gXCJsb2dpY2FsXCIgb24gdGhlIHByaW1hcnkgc2Vy dmVyLiIpKTsKIAkJCWJyZWFrOworCQljYXNlIFJTX0lOVkFMX0lOQUNUSVZFX1RJTUVPVVQ6CisJ CQlBc3NlcnQoaW5hY3RpdmVfc2luY2UgPiAwKTsKKwkJCWFwcGVuZFN0cmluZ0luZm8oJmVycl9k ZXRhaWwsCisJCQkJCQkJIF8oIlRoZSBzbG90IGJlY2FtZSBpbmFjdGl2ZSBzaW5jZSAlcywgd2hp Y2ggaXMgbW9yZSB0aGFuICVkIHNlY29uZHMgYWdvLiIpLAorCQkJCQkJCSB0aW1lc3RhbXB0el90 b19zdHIoaW5hY3RpdmVfc2luY2UpLAorCQkJCQkJCSByZXBsaWNhdGlvbl9zbG90X2luYWN0aXZl X3RpbWVvdXQpOworCisJCQllcnJfaGludCA9IG1ha2VTdHJpbmdJbmZvKCk7CisJCQlhcHBlbmRT dHJpbmdJbmZvKGVycl9oaW50LAorCQkJCQkJCSBfKCJZb3UgbWlnaHQgbmVlZCB0byBpbmNyZWFz ZSBcIiVzXCIuIiksICJyZXBsaWNhdGlvbl9zbG90X2luYWN0aXZlX3RpbWVvdXQiKTsKKwkJCWJy ZWFrOwogCQljYXNlIFJTX0lOVkFMX05PTkU6CiAJCQlwZ191bnJlYWNoYWJsZSgpOwogCX0KQEAg LTE1NDIsOSArMTU5NSwxMiBAQCBSZXBvcnRTbG90SW52YWxpZGF0aW9uKFJlcGxpY2F0aW9uU2xv dEludmFsaWRhdGlvbkNhdXNlIGNhdXNlLAogCQkJZXJybXNnKCJpbnZhbGlkYXRpbmcgb2Jzb2xl dGUgcmVwbGljYXRpb24gc2xvdCBcIiVzXCIiLAogCQkJCSAgIE5hbWVTdHIoc2xvdG5hbWUpKSwK IAkJCWVycmRldGFpbF9pbnRlcm5hbCgiJXMiLCBlcnJfZGV0YWlsLmRhdGEpLAotCQkJaGludCA/ IGVycmhpbnQoIllvdSBtaWdodCBuZWVkIHRvIGluY3JlYXNlIFwiJXNcIi4iLCAibWF4X3Nsb3Rf d2FsX2tlZXBfc2l6ZSIpIDogMCk7CisJCQkoZXJyX2hpbnQgIT0gTlVMTCkgPyBlcnJoaW50KCIl cyIsIGVycl9oaW50LT5kYXRhKSA6IDApOwogCiAJcGZyZWUoZXJyX2RldGFpbC5kYXRhKTsKKwor CWlmIChlcnJfaGludCAhPSBOVUxMKQorCQlkZXN0cm95U3RyaW5nSW5mbyhlcnJfaGludCk7CiB9 CiAKIC8qCkBAIC0xNTc0LDYgKzE2MzAsNyBAQCBJbnZhbGlkYXRlUG9zc2libHlPYnNvbGV0ZVNs b3QoUmVwbGljYXRpb25TbG90SW52YWxpZGF0aW9uQ2F1c2UgY2F1c2UsCiAJVHJhbnNhY3Rpb25J ZCBpbml0aWFsX2NhdGFsb2dfZWZmZWN0aXZlX3htaW4gPSBJbnZhbGlkVHJhbnNhY3Rpb25JZDsK IAlYTG9nUmVjUHRyCWluaXRpYWxfcmVzdGFydF9sc24gPSBJbnZhbGlkWExvZ1JlY1B0cjsKIAlS ZXBsaWNhdGlvblNsb3RJbnZhbGlkYXRpb25DYXVzZSBpbnZhbGlkYXRpb25fY2F1c2VfcHJldiBQ R19VU0VEX0ZPUl9BU1NFUlRTX09OTFkgPSBSU19JTlZBTF9OT05FOworCVRpbWVzdGFtcFR6IGlu YWN0aXZlX3NpbmNlID0gMDsKIAogCWZvciAoOzspCiAJewpAQCAtMTU4MSw2ICsxNjM4LDcgQEAg SW52YWxpZGF0ZVBvc3NpYmx5T2Jzb2xldGVTbG90KFJlcGxpY2F0aW9uU2xvdEludmFsaWRhdGlv bkNhdXNlIGNhdXNlLAogCQlOYW1lRGF0YQlzbG90bmFtZTsKIAkJaW50CQkJYWN0aXZlX3BpZCA9 IDA7CiAJCVJlcGxpY2F0aW9uU2xvdEludmFsaWRhdGlvbkNhdXNlIGludmFsaWRhdGlvbl9jYXVz ZSA9IFJTX0lOVkFMX05PTkU7CisJCVRpbWVzdGFtcFR6IG5vdyA9IDA7CiAKIAkJQXNzZXJ0KExX TG9ja0hlbGRCeU1lSW5Nb2RlKFJlcGxpY2F0aW9uU2xvdENvbnRyb2xMb2NrLCBMV19TSEFSRUQp KTsKIApAQCAtMTU5MSw2ICsxNjQ5LDE2IEBAIEludmFsaWRhdGVQb3NzaWJseU9ic29sZXRlU2xv dChSZXBsaWNhdGlvblNsb3RJbnZhbGlkYXRpb25DYXVzZSBjYXVzZSwKIAkJCWJyZWFrOwogCQl9 CiAKKwkJaWYgKGNhdXNlID09IFJTX0lOVkFMX0lOQUNUSVZFX1RJTUVPVVQgJiYKKwkJCUlzSW5h Y3RpdmVUaW1lb3V0U2xvdEludmFsaWRhdGlvbkFwcGxpY2FibGUocykpCisJCXsKKwkJCS8qCisJ CQkgKiBXZSBnZXQgdGhlIGN1cnJlbnQgdGltZSBiZWZvcmVoYW5kIHRvIGF2b2lkIHN5c3RlbSBj YWxsIHdoaWxlCisJCQkgKiBob2xkaW5nIHRoZSBzcGlubG9jay4KKwkJCSAqLworCQkJbm93ID0g R2V0Q3VycmVudFRpbWVzdGFtcCgpOworCQl9CisKIAkJLyoKIAkJICogQ2hlY2sgaWYgdGhlIHNs b3QgbmVlZHMgdG8gYmUgaW52YWxpZGF0ZWQuIElmIGl0IG5lZWRzIHRvIGJlCiAJCSAqIGludmFs aWRhdGVkLCBhbmQgaXMgbm90IGN1cnJlbnRseSBhY3F1aXJlZCwgYWNxdWlyZSBpdCBhbmQgbWFy ayBpdApAQCAtMTY0NCw2ICsxNzEyLDQxIEBAIEludmFsaWRhdGVQb3NzaWJseU9ic29sZXRlU2xv dChSZXBsaWNhdGlvblNsb3RJbnZhbGlkYXRpb25DYXVzZSBjYXVzZSwKIAkJCQkJaWYgKFNsb3RJ c0xvZ2ljYWwocykpCiAJCQkJCQlpbnZhbGlkYXRpb25fY2F1c2UgPSBjYXVzZTsKIAkJCQkJYnJl YWs7CisJCQkJY2FzZSBSU19JTlZBTF9JTkFDVElWRV9USU1FT1VUOgorCisJCQkJCS8qCisJCQkJ CSAqIFF1aWNrIGV4aXQgaWYgaW5hY3RpdmUgdGltZW91dCBpbnZhbGlkYXRpb24gbWVjaGFuaXNt CisJCQkJCSAqIGlzIGRpc2FibGVkIG9yIHNsb3QgaXMgY3VycmVudGx5IGJlaW5nIHVzZWQgb3Ig dGhlCisJCQkJCSAqIHNlcnZlciBpcyBpbiByZWNvdmVyeSBtb2RlIG9yIHRoZSBzbG90IG9uIHN0 YW5kYnkgaXMKKwkJCQkJICogY3VycmVudGx5IGJlaW5nIHN5bmNlZCBmcm9tIHRoZSBwcmltYXJ5 LgorCQkJCQkgKgorCQkJCQkgKiBOb3RlIHRoYXQgdGhlIGluYWN0aXZlIHRpbWVvdXQgaW52YWxp ZGF0aW9uIG1lY2hhbmlzbQorCQkJCQkgKiBpcyBub3QgYXBwbGljYWJsZSBmb3Igc2xvdHMgb24g dGhlIHN0YW5kYnkgc2VydmVyIHRoYXQKKwkJCQkJICogYXJlIGJlaW5nIHN5bmNlZCBmcm9tIHBy aW1hcnkgc2VydmVyLiBCZWNhdXNlIHN1Y2gKKwkJCQkJICogc3luY2VkIHNsb3RzIGFyZSB0eXBp Y2FsbHkgY29uc2lkZXJlZCBub3QgYWN0aXZlIChmb3IKKwkJCQkJICogdGhlbSB0byBiZSBsYXRl ciBjb25zaWRlcmVkIGFzIGluYWN0aXZlKSBhcyB0aGV5IGRvbid0CisJCQkJCSAqIHBlcmZvcm0g bG9naWNhbCBkZWNvZGluZyB0byBwcm9kdWNlIHRoZSBjaGFuZ2VzLgorCQkJCQkgKi8KKwkJCQkJ aWYgKCFJc0luYWN0aXZlVGltZW91dFNsb3RJbnZhbGlkYXRpb25BcHBsaWNhYmxlKHMpKQorCQkJ CQkJYnJlYWs7CisKKwkJCQkJLyoKKwkJCQkJICogQ2hlY2sgaWYgdGhlIHNsb3QgbmVlZHMgdG8g YmUgaW52YWxpZGF0ZWQgZHVlIHRvCisJCQkJCSAqIHJlcGxpY2F0aW9uX3Nsb3RfaW5hY3RpdmVf dGltZW91dCBHVUMuCisJCQkJCSAqLworCQkJCQlpZiAoVGltZXN0YW1wRGlmZmVyZW5jZUV4Y2Vl ZHMocy0+aW5hY3RpdmVfc2luY2UsIG5vdywKKwkJCQkJCQkJCQkJCSAgIHJlcGxpY2F0aW9uX3Ns b3RfaW5hY3RpdmVfdGltZW91dCAqIDEwMDApKQorCQkJCQl7CisJCQkJCQlpbnZhbGlkYXRpb25f Y2F1c2UgPSBjYXVzZTsKKwkJCQkJCWluYWN0aXZlX3NpbmNlID0gcy0+aW5hY3RpdmVfc2luY2U7 CisKKwkJCQkJCS8qCisJCQkJCQkgKiBJbnZhbGlkYXRpb24gZHVlIHRvIGluYWN0aXZlIHRpbWVv dXQgaW1wbGllcyB0aGF0CisJCQkJCQkgKiBubyBvbmUgaXMgdXNpbmcgdGhlIHNsb3QuCisJCQkJ CQkgKi8KKwkJCQkJCUFzc2VydChzLT5hY3RpdmVfcGlkID09IDApOworCQkJCQl9CisJCQkJCWJy ZWFrOwogCQkJCWNhc2UgUlNfSU5WQUxfTk9ORToKIAkJCQkJcGdfdW5yZWFjaGFibGUoKTsKIAkJ CX0KQEAgLTE2NjksMTEgKzE3NzIsMTMgQEAgSW52YWxpZGF0ZVBvc3NpYmx5T2Jzb2xldGVTbG90 KFJlcGxpY2F0aW9uU2xvdEludmFsaWRhdGlvbkNhdXNlIGNhdXNlLAogCQlhY3RpdmVfcGlkID0g cy0+YWN0aXZlX3BpZDsKIAogCQkvKgotCQkgKiBJZiB0aGUgc2xvdCBjYW4gYmUgYWNxdWlyZWQs IGRvIHNvIGFuZCBtYXJrIGl0IGludmFsaWRhdGVkCi0JCSAqIGltbWVkaWF0ZWx5LiAgT3RoZXJ3 aXNlIHdlJ2xsIHNpZ25hbCB0aGUgb3duaW5nIHByb2Nlc3MsIGJlbG93LCBhbmQKLQkJICogcmV0 cnkuCisJCSAqIElmIHRoZSBzbG90IGNhbiBiZSBhY3F1aXJlZCwgZG8gc28gYW5kIG1hcmsgaXQg YXMgaW52YWxpZGF0ZWQuIElmCisJCSAqIHRoZSBzbG90IGlzIGFscmVhZHkgb3VycywgbWFyayBp dCBhcyBpbnZhbGlkYXRlZC4gT3RoZXJ3aXNlLCB3ZSdsbAorCQkgKiBzaWduYWwgdGhlIG93bmlu ZyBwcm9jZXNzIGJlbG93IGFuZCByZXRyeS4KIAkJICovCi0JCWlmIChhY3RpdmVfcGlkID09IDAp CisJCWlmIChhY3RpdmVfcGlkID09IDAgfHwKKwkJCShNeVJlcGxpY2F0aW9uU2xvdCA9PSBzICYm CisJCQkgYWN0aXZlX3BpZCA9PSBNeVByb2NQaWQpKQogCQl7CiAJCQlNeVJlcGxpY2F0aW9uU2xv dCA9IHM7CiAJCQlzLT5hY3RpdmVfcGlkID0gTXlQcm9jUGlkOwpAQCAtMTcyOCw3ICsxODMzLDgg QEAgSW52YWxpZGF0ZVBvc3NpYmx5T2Jzb2xldGVTbG90KFJlcGxpY2F0aW9uU2xvdEludmFsaWRh dGlvbkNhdXNlIGNhdXNlLAogCQkJewogCQkJCVJlcG9ydFNsb3RJbnZhbGlkYXRpb24oaW52YWxp ZGF0aW9uX2NhdXNlLCB0cnVlLCBhY3RpdmVfcGlkLAogCQkJCQkJCQkJICAgc2xvdG5hbWUsIHJl c3RhcnRfbHNuLAotCQkJCQkJCQkJICAgb2xkZXN0TFNOLCBzbmFwc2hvdENvbmZsaWN0SG9yaXpv bik7CisJCQkJCQkJCQkgICBvbGRlc3RMU04sIHNuYXBzaG90Q29uZmxpY3RIb3Jpem9uLAorCQkJ CQkJCQkJICAgaW5hY3RpdmVfc2luY2UpOwogCiAJCQkJaWYgKE15QmFja2VuZFR5cGUgPT0gQl9T VEFSVFVQKQogCQkJCQkodm9pZCkgU2VuZFByb2NTaWduYWwoYWN0aXZlX3BpZCwKQEAgLTE3NzQs NyArMTg4MCw4IEBAIEludmFsaWRhdGVQb3NzaWJseU9ic29sZXRlU2xvdChSZXBsaWNhdGlvblNs b3RJbnZhbGlkYXRpb25DYXVzZSBjYXVzZSwKIAogCQkJUmVwb3J0U2xvdEludmFsaWRhdGlvbihp bnZhbGlkYXRpb25fY2F1c2UsIGZhbHNlLCBhY3RpdmVfcGlkLAogCQkJCQkJCQkgICBzbG90bmFt ZSwgcmVzdGFydF9sc24sCi0JCQkJCQkJCSAgIG9sZGVzdExTTiwgc25hcHNob3RDb25mbGljdEhv cml6b24pOworCQkJCQkJCQkgICBvbGRlc3RMU04sIHNuYXBzaG90Q29uZmxpY3RIb3Jpem9uLAor CQkJCQkJCQkgICBpbmFjdGl2ZV9zaW5jZSk7CiAKIAkJCS8qIGRvbmUgd2l0aCB0aGlzIHNsb3Qg Zm9yIG5vdyAqLwogCQkJYnJlYWs7CkBAIC0xNzk3LDYgKzE5MDQsNyBAQCBJbnZhbGlkYXRlUG9z c2libHlPYnNvbGV0ZVNsb3QoUmVwbGljYXRpb25TbG90SW52YWxpZGF0aW9uQ2F1c2UgY2F1c2Us CiAgKiAtIFJTX0lOVkFMX0hPUklaT046IHJlcXVpcmVzIGEgc25hcHNob3QgPD0gdGhlIGdpdmVu IGhvcml6b24gaW4gdGhlIGdpdmVuCiAgKiAgIGRiOyBkYm9pZCBtYXkgYmUgSW52YWxpZE9pZCBm b3Igc2hhcmVkIHJlbGF0aW9ucwogICogLSBSU19JTlZBTF9XQUxfTEVWRUw6IGlzIGxvZ2ljYWwK KyAqIC0gUlNfSU5WQUxfSU5BQ1RJVkVfVElNRU9VVDogaW5hY3RpdmUgdGltZW91dCBvY2N1cnMK ICAqCiAgKiBOQiAtIHRoaXMgcnVucyBhcyBwYXJ0IG9mIGNoZWNrcG9pbnQsIHNvIGF2b2lkIHJh aXNpbmcgZXJyb3JzIGlmIHBvc3NpYmxlLgogICovCkBAIC0xODQ5LDcgKzE5NTcsOCBAQCByZXN0 YXJ0OgogfQogCiAvKgotICogRmx1c2ggYWxsIHJlcGxpY2F0aW9uIHNsb3RzIHRvIGRpc2suCisg KiBGbHVzaCBhbGwgcmVwbGljYXRpb24gc2xvdHMgdG8gZGlzay4gQWxzbywgaW52YWxpZGF0ZSBv YnNvbGV0ZSBzbG90cyBkdXJpbmcKKyAqIG5vbi1zaHV0ZG93biBjaGVja3BvaW50LgogICoKICAq IEl0IGlzIGNvbnZlbmllbnQgdG8gZmx1c2ggZGlydHkgcmVwbGljYXRpb24gc2xvdHMgYXQgdGhl IHRpbWUgb2YgY2hlY2twb2ludC4KICAqIEFkZGl0aW9uYWxseSwgaW4gY2FzZSBvZiBhIHNodXRk b3duIGNoZWNrcG9pbnQsIHdlIGFsc28gaWRlbnRpZnkgdGhlIHNsb3RzCkBAIC0xOTA3LDYgKzIw MTYsMzggQEAgQ2hlY2tQb2ludFJlcGxpY2F0aW9uU2xvdHMoYm9vbCBpc19zaHV0ZG93bikKIAkJ U2F2ZVNsb3RUb1BhdGgocywgcGF0aCwgTE9HKTsKIAl9CiAJTFdMb2NrUmVsZWFzZShSZXBsaWNh dGlvblNsb3RBbGxvY2F0aW9uTG9jayk7CisKKwlpZiAoIWlzX3NodXRkb3duKQorCXsKKwkJZWxv ZyhERUJVRzEsICJwZXJmb3JtaW5nIHJlcGxpY2F0aW9uIHNsb3QgaW52YWxpZGF0aW9uIGNoZWNr cyIpOworCisJCS8qCisJCSAqIE5COiBXZSB3aWxsIG1ha2UgYW5vdGhlciBwYXNzIG92ZXIgcmVw bGljYXRpb24gc2xvdHMgZm9yCisJCSAqIGludmFsaWRhdGlvbiBjaGVja3MgdG8ga2VlcCB0aGUg Y29kZSBzaW1wbGUuIFRlc3Rpbmcgc2hvd3MgdGhhdAorCQkgKiB0aGVyZSBpcyBubyBub3RpY2Vh YmxlIG92ZXJoZWFkICh3aGVuIGNvbXBhcmVkIHdpdGggd2FsX3JlbW92ZWQKKwkJICogaW52YWxp ZGF0aW9uKSBldmVuIGlmIHdlIHdlcmUgdG8gZG8gaW5hY3RpdmVfdGltZW91dCBpbnZhbGlkYXRp b24KKwkJICogb2YgdGhvdXNhbmRzIG9mIHJlcGxpY2F0aW9uIHNsb3RzIGhlcmUuIElmIGl0IGlz IGV2ZXIgcHJvdmVuIHRoYXQKKwkJICogdGhpcyBhc3N1bXB0aW9uIGlzIHdyb25nLCB3ZSB3aWxs IGhhdmUgdG8gcGVyZm9ybSB0aGUgaW52YWxpZGF0aW9uCisJCSAqIGNoZWNrcyBpbiB0aGUgYWJv dmUgZm9yIGxvb3Agd2l0aCB0aGUgZm9sbG93aW5nIGNoYW5nZXM6CisJCSAqCisJCSAqIC0gQWNx dWlyZSBDb250cm9sTG9jayBsb2NrIG9uY2UgYmVmb3JlIHRoZSBsb29wLgorCQkgKgorCQkgKiAt IENhbGwgSW52YWxpZGF0ZVBvc3NpYmx5T2Jzb2xldGVTbG90IGZvciBlYWNoIHNsb3QuCisJCSAq CisJCSAqIC0gSGFuZGxlIHRoZSBjYXNlcyBpbiB3aGljaCBDb250cm9sTG9jayBnZXRzIHJlbGVh c2VkIGp1c3QgbGlrZQorCQkgKiBJbnZhbGlkYXRlT2Jzb2xldGVSZXBsaWNhdGlvblNsb3RzIGRv ZXMuCisJCSAqCisJCSAqIC0gQXZvaWQgc2F2aW5nIHNsb3QgaW5mbyB0byBkaXNrIHR3byB0aW1l cyBmb3IgZWFjaCBpbnZhbGlkYXRlZAorCQkgKiBzbG90LgorCQkgKgorCQkgKiBYWFg6IFNob3Vs ZCB3ZSBtb3ZlIGluYWN0aXZlX3RpbWVvdXQgaW52YWxpZGF0aW9uIGNoZWNrIGNsb3NlciB0bwor CQkgKiB3YWxfcmVtb3ZlZCBpbiBDcmVhdGVDaGVja1BvaW50IGFuZCBDcmVhdGVSZXN0YXJ0UG9p bnQ/CisJCSAqLworCQlJbnZhbGlkYXRlT2Jzb2xldGVSZXBsaWNhdGlvblNsb3RzKFJTX0lOVkFM X0lOQUNUSVZFX1RJTUVPVVQsCisJCQkJCQkJCQkJICAgMCwKKwkJCQkJCQkJCQkgICBJbnZhbGlk T2lkLAorCQkJCQkJCQkJCSAgIEludmFsaWRUcmFuc2FjdGlvbklkKTsKKwl9CiB9CiAKIC8qCmRp ZmYgLS1naXQgYS9zcmMvYmFja2VuZC9yZXBsaWNhdGlvbi9zbG90ZnVuY3MuYyBiL3NyYy9iYWNr ZW5kL3JlcGxpY2F0aW9uL3Nsb3RmdW5jcy5jCmluZGV4IGM3YmZiYjE1ZTAuLmIxYjdiMDc1YmQg MTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL3JlcGxpY2F0aW9uL3Nsb3RmdW5jcy5jCisrKyBiL3Ny Yy9iYWNrZW5kL3JlcGxpY2F0aW9uL3Nsb3RmdW5jcy5jCkBAIC01NDAsNyArNTQwLDcgQEAgcGdf cmVwbGljYXRpb25fc2xvdF9hZHZhbmNlKFBHX0ZVTkNUSU9OX0FSR1MpCiAJCW1vdmV0byA9IE1p bihtb3ZldG8sIEdldFhMb2dSZXBsYXlSZWNQdHIoTlVMTCkpOwogCiAJLyogQWNxdWlyZSB0aGUg c2xvdCBzbyB3ZSAib3duIiBpdCAqLwotCVJlcGxpY2F0aW9uU2xvdEFjcXVpcmUoTmFtZVN0cigq c2xvdG5hbWUpLCB0cnVlKTsKKwlSZXBsaWNhdGlvblNsb3RBY3F1aXJlKE5hbWVTdHIoKnNsb3Ru YW1lKSwgdHJ1ZSwgdHJ1ZSk7CiAKIAkvKiBBIHNsb3Qgd2hvc2UgcmVzdGFydF9sc24gaGFzIG5l dmVyIGJlZW4gcmVzZXJ2ZWQgY2Fubm90IGJlIGFkdmFuY2VkICovCiAJaWYgKFhMb2dSZWNQdHJJ c0ludmFsaWQoTXlSZXBsaWNhdGlvblNsb3QtPmRhdGEucmVzdGFydF9sc24pKQpkaWZmIC0tZ2l0 IGEvc3JjL2JhY2tlbmQvcmVwbGljYXRpb24vd2Fsc2VuZGVyLmMgYi9zcmMvYmFja2VuZC9yZXBs aWNhdGlvbi93YWxzZW5kZXIuYwppbmRleCBjNWYxMDA5ZjM3Li42MWEwZTM4NzE1IDEwMDY0NAot LS0gYS9zcmMvYmFja2VuZC9yZXBsaWNhdGlvbi93YWxzZW5kZXIuYworKysgYi9zcmMvYmFja2Vu ZC9yZXBsaWNhdGlvbi93YWxzZW5kZXIuYwpAQCAtODQ0LDcgKzg0NCw3IEBAIFN0YXJ0UmVwbGlj YXRpb24oU3RhcnRSZXBsaWNhdGlvbkNtZCAqY21kKQogCiAJaWYgKGNtZC0+c2xvdG5hbWUpCiAJ ewotCQlSZXBsaWNhdGlvblNsb3RBY3F1aXJlKGNtZC0+c2xvdG5hbWUsIHRydWUpOworCQlSZXBs aWNhdGlvblNsb3RBY3F1aXJlKGNtZC0+c2xvdG5hbWUsIHRydWUsIHRydWUpOwogCQlpZiAoU2xv dElzTG9naWNhbChNeVJlcGxpY2F0aW9uU2xvdCkpCiAJCQllcmVwb3J0KEVSUk9SLAogCQkJCQko ZXJyY29kZShFUlJDT0RFX09CSkVDVF9OT1RfSU5fUFJFUkVRVUlTSVRFX1NUQVRFKSwKQEAgLTE0 NjIsNyArMTQ2Miw3IEBAIFN0YXJ0TG9naWNhbFJlcGxpY2F0aW9uKFN0YXJ0UmVwbGljYXRpb25D bWQgKmNtZCkKIAogCUFzc2VydCghTXlSZXBsaWNhdGlvblNsb3QpOwogCi0JUmVwbGljYXRpb25T bG90QWNxdWlyZShjbWQtPnNsb3RuYW1lLCB0cnVlKTsKKwlSZXBsaWNhdGlvblNsb3RBY3F1aXJl KGNtZC0+c2xvdG5hbWUsIHRydWUsIHRydWUpOwogCiAJLyoKIAkgKiBGb3JjZSBhIGRpc2Nvbm5l Y3QsIHNvIHRoYXQgdGhlIGRlY29kaW5nIGNvZGUgZG9lc24ndCBuZWVkIHRvIGNhcmUKZGlmZiAt LWdpdCBhL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9wZ191cGdyYWRlX3N1cHBvcnQuYyBiL3NyYy9i YWNrZW5kL3V0aWxzL2FkdC9wZ191cGdyYWRlX3N1cHBvcnQuYwppbmRleCBjNTRiMDhmZTE4Li44 Mjk1NmQ1OGQzIDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC91dGlscy9hZHQvcGdfdXBncmFkZV9z dXBwb3J0LmMKKysrIGIvc3JjL2JhY2tlbmQvdXRpbHMvYWR0L3BnX3VwZ3JhZGVfc3VwcG9ydC5j CkBAIC0yOTksNyArMjk5LDcgQEAgYmluYXJ5X3VwZ3JhZGVfbG9naWNhbF9zbG90X2hhc19jYXVn aHRfdXAoUEdfRlVOQ1RJT05fQVJHUykKIAlzbG90X25hbWUgPSBQR19HRVRBUkdfTkFNRSgwKTsK IAogCS8qIEFjcXVpcmUgdGhlIGdpdmVuIHNsb3QgKi8KLQlSZXBsaWNhdGlvblNsb3RBY3F1aXJl KE5hbWVTdHIoKnNsb3RfbmFtZSksIHRydWUpOworCVJlcGxpY2F0aW9uU2xvdEFjcXVpcmUoTmFt ZVN0cigqc2xvdF9uYW1lKSwgdHJ1ZSwgZmFsc2UpOwogCiAJQXNzZXJ0KFNsb3RJc0xvZ2ljYWwo TXlSZXBsaWNhdGlvblNsb3QpKTsKIApkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvdXRpbHMvbWlz Yy9ndWNfdGFibGVzLmMgYi9zcmMvYmFja2VuZC91dGlscy9taXNjL2d1Y190YWJsZXMuYwppbmRl eCA1MjFlYzU1OTFjLi42NzVlYjExNWFjIDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC91dGlscy9t aXNjL2d1Y190YWJsZXMuYworKysgYi9zcmMvYmFja2VuZC91dGlscy9taXNjL2d1Y190YWJsZXMu YwpAQCAtMzAyOCw2ICszMDI4LDE4IEBAIHN0cnVjdCBjb25maWdfaW50IENvbmZpZ3VyZU5hbWVz SW50W10gPQogCQlOVUxMLCBOVUxMLCBOVUxMCiAJfSwKIAorCXsKKwkJeyJyZXBsaWNhdGlvbl9z bG90X2luYWN0aXZlX3RpbWVvdXQiLCBQR0NfU0lHSFVQLCBSRVBMSUNBVElPTl9TRU5ESU5HLAor CQkJZ2V0dGV4dF9ub29wKCJTZXRzIHRoZSBhbW91bnQgb2YgdGltZSBhIHJlcGxpY2F0aW9uIHNs b3QgY2FuIHJlbWFpbiBpbmFjdGl2ZSBiZWZvcmUgIgorCQkJCQkJICJpdCB3aWxsIGJlIGludmFs aWRhdGVkLiIpLAorCQkJTlVMTCwKKwkJCUdVQ19VTklUX1MKKwkJfSwKKwkJJnJlcGxpY2F0aW9u X3Nsb3RfaW5hY3RpdmVfdGltZW91dCwKKwkJMCwgMCwgSU5UX01BWCwKKwkJTlVMTCwgTlVMTCwg TlVMTAorCX0sCisKIAl7CiAJCXsiY29tbWl0X2RlbGF5IiwgUEdDX1NVU0VULCBXQUxfU0VUVElO R1MsCiAJCQlnZXR0ZXh0X25vb3AoIlNldHMgdGhlIGRlbGF5IGluIG1pY3Jvc2Vjb25kcyBiZXR3 ZWVuIHRyYW5zYWN0aW9uIGNvbW1pdCBhbmQgIgpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvdXRp bHMvbWlzYy9wb3N0Z3Jlc3FsLmNvbmYuc2FtcGxlIGIvc3JjL2JhY2tlbmQvdXRpbHMvbWlzYy9w b3N0Z3Jlc3FsLmNvbmYuc2FtcGxlCmluZGV4IDY2N2UwZGM0MGEuLmRlY2EzYTRhZWIgMTAwNjQ0 Ci0tLSBhL3NyYy9iYWNrZW5kL3V0aWxzL21pc2MvcG9zdGdyZXNxbC5jb25mLnNhbXBsZQorKysg Yi9zcmMvYmFja2VuZC91dGlscy9taXNjL3Bvc3RncmVzcWwuY29uZi5zYW1wbGUKQEAgLTMzNSw2 ICszMzUsNyBAQAogI3dhbF9zZW5kZXJfdGltZW91dCA9IDYwcwkjIGluIG1pbGxpc2Vjb25kczsg MCBkaXNhYmxlcwogI3RyYWNrX2NvbW1pdF90aW1lc3RhbXAgPSBvZmYJIyBjb2xsZWN0IHRpbWVz dGFtcCBvZiB0cmFuc2FjdGlvbiBjb21taXQKIAkJCQkjIChjaGFuZ2UgcmVxdWlyZXMgcmVzdGFy dCkKKyNyZXBsaWNhdGlvbl9zbG90X2luYWN0aXZlX3RpbWVvdXQgPSAwCSMgaW4gc2Vjb25kczsg MCBkaXNhYmxlcwogCiAjIC0gUHJpbWFyeSBTZXJ2ZXIgLQogCmRpZmYgLS1naXQgYS9zcmMvaW5j bHVkZS9yZXBsaWNhdGlvbi9zbG90LmggYi9zcmMvaW5jbHVkZS9yZXBsaWNhdGlvbi9zbG90LmgK aW5kZXggNDU1ODJjZjlkOC4uNDMxY2MwOGM5OSAxMDA2NDQKLS0tIGEvc3JjL2luY2x1ZGUvcmVw bGljYXRpb24vc2xvdC5oCisrKyBiL3NyYy9pbmNsdWRlL3JlcGxpY2F0aW9uL3Nsb3QuaApAQCAt NTYsNiArNTYsOCBAQCB0eXBlZGVmIGVudW0gUmVwbGljYXRpb25TbG90SW52YWxpZGF0aW9uQ2F1 c2UKIAlSU19JTlZBTF9IT1JJWk9OLAogCS8qIHdhbF9sZXZlbCBpbnN1ZmZpY2llbnQgZm9yIHNs b3QgKi8KIAlSU19JTlZBTF9XQUxfTEVWRUwsCisJLyogaW5hY3RpdmUgc2xvdCB0aW1lb3V0IGhh cyBvY2N1cnJlZCAqLworCVJTX0lOVkFMX0lOQUNUSVZFX1RJTUVPVVQsCiB9IFJlcGxpY2F0aW9u U2xvdEludmFsaWRhdGlvbkNhdXNlOwogCiBleHRlcm4gUEdETExJTVBPUlQgY29uc3QgY2hhciAq Y29uc3QgU2xvdEludmFsaWRhdGlvbkNhdXNlc1tdOwpAQCAtMjMzLDYgKzIzNSw3IEBAIGV4dGVy biBQR0RMTElNUE9SVCBSZXBsaWNhdGlvblNsb3QgKk15UmVwbGljYXRpb25TbG90OwogLyogR1VD cyAqLwogZXh0ZXJuIFBHRExMSU1QT1JUIGludCBtYXhfcmVwbGljYXRpb25fc2xvdHM7CiBleHRl cm4gUEdETExJTVBPUlQgY2hhciAqc3luY2hyb25pemVkX3N0YW5kYnlfc2xvdHM7CitleHRlcm4g UEdETExJTVBPUlQgaW50IHJlcGxpY2F0aW9uX3Nsb3RfaW5hY3RpdmVfdGltZW91dDsKIAogLyog c2htZW0gaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zICovCiBleHRlcm4gU2l6ZSBSZXBsaWNhdGlv blNsb3RzU2htZW1TaXplKHZvaWQpOwpAQCAtMjQ5LDcgKzI1Miw4IEBAIGV4dGVybiB2b2lkIFJl cGxpY2F0aW9uU2xvdERyb3BBY3F1aXJlZCh2b2lkKTsKIGV4dGVybiB2b2lkIFJlcGxpY2F0aW9u U2xvdEFsdGVyKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGJvb2wgKmZhaWxvdmVyLAogCQkJCQkJ CQkgY29uc3QgYm9vbCAqdHdvX3BoYXNlKTsKIAotZXh0ZXJuIHZvaWQgUmVwbGljYXRpb25TbG90 QWNxdWlyZShjb25zdCBjaGFyICpuYW1lLCBib29sIG5vd2FpdCk7CitleHRlcm4gdm9pZCBSZXBs aWNhdGlvblNsb3RBY3F1aXJlKGNvbnN0IGNoYXIgKm5hbWUsIGJvb2wgbm93YWl0LAorCQkJCQkJ CQkgICBib29sIGNoZWNrX2Zvcl9pbnZhbGlkYXRpb24pOwogZXh0ZXJuIHZvaWQgUmVwbGljYXRp b25TbG90UmVsZWFzZSh2b2lkKTsKIGV4dGVybiB2b2lkIFJlcGxpY2F0aW9uU2xvdENsZWFudXAo Ym9vbCBzeW5jZWRfb25seSk7CiBleHRlcm4gdm9pZCBSZXBsaWNhdGlvblNsb3RTYXZlKHZvaWQp OwpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvcmVjb3ZlcnkvbWVzb24uYnVpbGQgYi9zcmMvdGVzdC9y ZWNvdmVyeS9tZXNvbi5idWlsZAppbmRleCA3MTI5MjRjMmZhLi4zMDFiZTBmNmMxIDEwMDY0NAot LS0gYS9zcmMvdGVzdC9yZWNvdmVyeS9tZXNvbi5idWlsZAorKysgYi9zcmMvdGVzdC9yZWNvdmVy eS9tZXNvbi5idWlsZApAQCAtMTAsNiArMTAsNyBAQCB0ZXN0cyArPSB7CiAgICAgICAgJ2VuYWJs ZV9pbmplY3Rpb25fcG9pbnRzJzogZ2V0X29wdGlvbignaW5qZWN0aW9uX3BvaW50cycpID8gJ3ll cycgOiAnbm8nLAogICAgIH0sCiAgICAgJ3Rlc3RzJzogWworICAgICAgJ3QvMDUwX2ludmFsaWRh dGVfc2xvdHMucGwnLAogICAgICAgJ3QvMDAxX3N0cmVhbV9yZXAucGwnLAogICAgICAgJ3QvMDAy X2FyY2hpdmluZy5wbCcsCiAgICAgICAndC8wMDNfcmVjb3ZlcnlfdGFyZ2V0cy5wbCcsCmRpZmYg LS1naXQgYS9zcmMvdGVzdC9yZWNvdmVyeS90LzA1MF9pbnZhbGlkYXRlX3Nsb3RzLnBsIGIvc3Jj L3Rlc3QvcmVjb3ZlcnkvdC8wNTBfaW52YWxpZGF0ZV9zbG90cy5wbApuZXcgZmlsZSBtb2RlIDEw MDY0NAppbmRleCAwMDAwMDAwMDAwLi5mYTZhMTJhMTJkCi0tLSAvZGV2L251bGwKKysrIGIvc3Jj L3Rlc3QvcmVjb3ZlcnkvdC8wNTBfaW52YWxpZGF0ZV9zbG90cy5wbApAQCAtMCwwICsxLDI4MyBA QAorIyBDb3B5cmlnaHQgKGMpIDIwMjQsIFBvc3RncmVTUUwgR2xvYmFsIERldmVsb3BtZW50IEdy b3VwCisKKyMgVGVzdCBmb3IgcmVwbGljYXRpb24gc2xvdHMgaW52YWxpZGF0aW9uCit1c2Ugc3Ry aWN0OwordXNlIHdhcm5pbmdzIEZBVEFMID0+ICdhbGwnOworCit1c2UgUG9zdGdyZVNRTDo6VGVz dDo6VXRpbHM7Cit1c2UgUG9zdGdyZVNRTDo6VGVzdDo6Q2x1c3RlcjsKK3VzZSBUZXN0OjpNb3Jl OwordXNlIFRpbWU6OkhpUmVzIHF3KHVzbGVlcCk7CisKKyMgPT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K KyMgVGVzdGNhc2Ugc3RhcnQKKyMKKyMgSW52YWxpZGF0ZSBzdHJlYW1pbmcgc3RhbmRieSdzIHNs b3QgYXMgd2VsbCBhcyBsb2dpY2FsCisjIGZhaWxvdmVyIHNsb3Qgb24gcHJpbWFyeSBkdWUgdG8g cmVwbGljYXRpb25fc2xvdF9pbmFjdGl2ZV90aW1lb3V0LiBBbHNvLAorIyBjaGVjayB0aGUgbG9n aWNhbCBmYWlsb3ZlciBzbG90IHN5bmNlZCBvbiB0byB0aGUgc3RhbmRieSBkb2Vzbid0IGludmFs aWRhdGUKKyMgdGhlIHNsb3Qgb24gaXRzIG93biwgYnV0IGdldHMgdGhlIGludmFsaWRhdGVkIHN0 YXRlIGZyb20gdGhlIHJlbW90ZSBzbG90IG9uCisjIHRoZSBwcmltYXJ5LgorCisjIEluaXRpYWxp emUgcHJpbWFyeQorbXkgJHByaW1hcnkgPSBQb3N0Z3JlU1FMOjpUZXN0OjpDbHVzdGVyLT5uZXco J3ByaW1hcnknKTsKKyRwcmltYXJ5LT5pbml0KGFsbG93c19zdHJlYW1pbmcgPT4gJ2xvZ2ljYWwn KTsKKworIyBBdm9pZCB1bnByZWRpY3RhYmlsaXR5CiskcHJpbWFyeS0+YXBwZW5kX2NvbmYoCisJ J3Bvc3RncmVzcWwuY29uZicsIHF7CitjaGVja3BvaW50X3RpbWVvdXQgPSAxaAorYXV0b3ZhY3V1 bSA9IG9mZgorfSk7CiskcHJpbWFyeS0+c3RhcnQ7CisKKyMgVGFrZSBiYWNrdXAKK215ICRiYWNr dXBfbmFtZSA9ICdteV9iYWNrdXAnOworJHByaW1hcnktPmJhY2t1cCgkYmFja3VwX25hbWUpOwor CisjIENyZWF0ZSBzdGFuZGJ5CitteSAkc3RhbmRieTEgPSBQb3N0Z3JlU1FMOjpUZXN0OjpDbHVz dGVyLT5uZXcoJ3N0YW5kYnkxJyk7Ciskc3RhbmRieTEtPmluaXRfZnJvbV9iYWNrdXAoJHByaW1h cnksICRiYWNrdXBfbmFtZSwgaGFzX3N0cmVhbWluZyA9PiAxKTsKKworbXkgJGNvbm5zdHJfMSA9 ICRwcmltYXJ5LT5jb25uc3RyOworJHN0YW5kYnkxLT5hcHBlbmRfY29uZigKKwkncG9zdGdyZXNx bC5jb25mJywgcXEoCitob3Rfc3RhbmRieV9mZWVkYmFjayA9IG9uCitwcmltYXJ5X3Nsb3RfbmFt ZSA9ICdzYjFfc2xvdCcKK3ByaW1hcnlfY29ubmluZm8gPSAnJGNvbm5zdHJfMSBkYm5hbWU9cG9z dGdyZXMnCispKTsKKworIyBDcmVhdGUgc3luYyBzbG90IG9uIHRoZSBwcmltYXJ5CiskcHJpbWFy eS0+cHNxbCgncG9zdGdyZXMnLAorCXF7U0VMRUNUIHBnX2NyZWF0ZV9sb2dpY2FsX3JlcGxpY2F0 aW9uX3Nsb3QoJ2xzdWIxX3N5bmNfc2xvdCcsICd0ZXN0X2RlY29kaW5nJywgZmFsc2UsIGZhbHNl LCB0cnVlKTt9CispOworCiskcHJpbWFyeS0+c2FmZV9wc3FsKAorCSdwb3N0Z3JlcycsIHFxWwor ICAgIFNFTEVDVCBwZ19jcmVhdGVfcGh5c2ljYWxfcmVwbGljYXRpb25fc2xvdChzbG90X25hbWUg Oj0gJ3NiMV9zbG90JywgaW1tZWRpYXRlbHlfcmVzZXJ2ZSA6PSB0cnVlKTsKK10pOworCiskc3Rh bmRieTEtPnN0YXJ0OworCisjIFdhaXQgdW50aWwgc3RhbmRieSBoYXMgcmVwbGF5ZWQgZW5vdWdo IGRhdGEKKyRwcmltYXJ5LT53YWl0X2Zvcl9jYXRjaHVwKCRzdGFuZGJ5MSk7CisKKyMgU3luY2hy b25pemUgdGhlIHByaW1hcnkgc2xvdHMgdG8gdGhlIHN0YW5kYnkKKyRzdGFuZGJ5MS0+c2FmZV9w c3FsKCdwb3N0Z3JlcycsICJTRUxFQ1QgcGdfc3luY19yZXBsaWNhdGlvbl9zbG90cygpOyIpOwor CisjIENvbmZpcm0gdGhhdCB0aGUgbG9naWNhbCBmYWlsb3ZlciBzbG90IGlzIGNyZWF0ZWQgb24g dGhlIHN0YW5kYnkgYW5kIGlzCisjIGZsYWdnZWQgYXMgJ3N5bmNlZCcuCitpcyggJHN0YW5kYnkx LT5zYWZlX3BzcWwoCisJCSdwb3N0Z3JlcycsCisJCXF7U0VMRUNUIGNvdW50KCopID0gMSBGUk9N IHBnX3JlcGxpY2F0aW9uX3Nsb3RzCisJCSAgV0hFUkUgc2xvdF9uYW1lID0gJ2xzdWIxX3N5bmNf c2xvdCcgQU5EIHN5bmNlZCBBTkQgTk9UIHRlbXBvcmFyeTt9CisJKSwKKwkidCIsCisJJ2xvZ2lj YWwgc2xvdCBsc3ViMV9zeW5jX3Nsb3QgaGFzIHN5bmNlZCBhcyB0cnVlIG9uIHN0YW5kYnknKTsK KworbXkgJHN0YW5kYnkxX2xvZ3N0YXJ0ID0gLXMgJHN0YW5kYnkxLT5sb2dmaWxlOworbXkgJGxv Z3N0YXJ0ID0gLXMgJHByaW1hcnktPmxvZ2ZpbGU7CitteSAkaW5hY3RpdmVfdGltZW91dCA9IDI7 CisKKyMgU2V0IHRpbWVvdXQgc28gdGhhdCB0aGUgbmV4dCBjaGVja3BvaW50IHdpbGwgaW52YWxp ZGF0ZSB0aGUgaW5hY3RpdmUKKyMgcmVwbGljYXRpb24gc2xvdC4KKyRwcmltYXJ5LT5zYWZlX3Bz cWwoCisJJ3Bvc3RncmVzJywgcXFbCisgICAgQUxURVIgU1lTVEVNIFNFVCByZXBsaWNhdGlvbl9z bG90X2luYWN0aXZlX3RpbWVvdXQgVE8gJyR7aW5hY3RpdmVfdGltZW91dH1zJzsKK10pOworJHBy aW1hcnktPnJlbG9hZDsKKworIyBXYWl0IGZvciB0aGUgbG9naWNhbCBmYWlsb3ZlciBzbG90IHRv IGJlY29tZSBpbmFjdGl2ZSBvbiB0aGUgcHJpbWFyeS4gTm90ZQorIyB0aGF0IG5vYm9keSBoYXMg YWNxdWlyZWQgdGhhdCBzbG90IHlldCwgc28gZHVlIHRvCisjIHJlcGxpY2F0aW9uX3Nsb3RfaW5h Y3RpdmVfdGltZW91dCBzZXR0aW5nIGFib3ZlIGl0IG11c3QgZ2V0IGludmFsaWRhdGVkLgord2Fp dF9mb3Jfc2xvdF9pbnZhbGlkYXRpb24oJHByaW1hcnksICdsc3ViMV9zeW5jX3Nsb3QnLCAkbG9n c3RhcnQsCisJJGluYWN0aXZlX3RpbWVvdXQpOworCisjIFNldCB0aW1lb3V0IG9uIHRoZSBzdGFu ZGJ5IGFsc28gdG8gY2hlY2sgdGhlIHN5bmNlZCBzbG90cyBkb24ndCBnZXQKKyMgaW52YWxpZGF0 ZWQgZHVlIHRvIHRpbWVvdXQgb24gdGhlIHN0YW5kYnkuCiskc3RhbmRieTEtPnNhZmVfcHNxbCgK KwkncG9zdGdyZXMnLCBxcVsKKyAgICBBTFRFUiBTWVNURU0gU0VUIHJlcGxpY2F0aW9uX3Nsb3Rf aW5hY3RpdmVfdGltZW91dCBUTyAnMnMnOworXSk7Ciskc3RhbmRieTEtPnJlbG9hZDsKKworIyBO b3csIHN5bmMgdGhlIGxvZ2ljYWwgZmFpbG92ZXIgc2xvdCBmcm9tIHRoZSByZW1vdGUgc2xvdCBv biB0aGUgcHJpbWFyeS4KKyMgTm90ZSB0aGF0IHRoZSByZW1vdGUgc2xvdCBoYXMgYWxyZWFkeSBi ZWVuIGludmFsaWRhdGVkIGR1ZSB0byBpbmFjdGl2ZQorIyB0aW1lb3V0LiBOb3csIHRoZSBzdGFu ZGJ5IG11c3QgYWxzbyBzZWUgaXQgYXMgaW52YWxpZGF0ZWQuCiskc3RhbmRieTEtPnNhZmVfcHNx bCgncG9zdGdyZXMnLCAiU0VMRUNUIHBnX3N5bmNfcmVwbGljYXRpb25fc2xvdHMoKTsiKTsKKwor IyBXYWl0IGZvciB0aGUgaW5hY3RpdmUgcmVwbGljYXRpb24gc2xvdCB0byBiZSBpbnZhbGlkYXRl ZC4KKyRzdGFuZGJ5MS0+cG9sbF9xdWVyeV91bnRpbCgKKwkncG9zdGdyZXMnLCBxcVsKKwlTRUxF Q1QgQ09VTlQoc2xvdF9uYW1lKSA9IDEgRlJPTSBwZ19yZXBsaWNhdGlvbl9zbG90cworCQlXSEVS RSBzbG90X25hbWUgPSAnbHN1YjFfc3luY19zbG90JyBBTkQKKwkJaW52YWxpZGF0aW9uX3JlYXNv biA9ICdpbmFjdGl2ZV90aW1lb3V0JzsKK10pCisgIG9yIGRpZQorICAiVGltZWQgb3V0IHdoaWxl IHdhaXRpbmcgZm9yIGxzdWIxX3N5bmNfc2xvdCBpbnZhbGlkYXRpb24gdG8gYmUgc3luY2VkIG9u IHN0YW5kYnkiOworCisjIFN5bmNlZCBzbG90IG11c3RuJ3QgZ2V0IGludmFsaWRhdGVkIG9uIHRo ZSBzdGFuZGJ5IGV2ZW4gYWZ0ZXIgYSBjaGVja3BvaW50LAorIyBpdCBtdXN0IHN5bmMgaW52YWxp ZGF0aW9uIGZyb20gdGhlIHByaW1hcnkuIFNvLCB3ZSBtdXN0IG5vdCBzZWUgdGhlIHNsb3Qncwor IyBpbnZhbGlkYXRpb24gbWVzc2FnZSBpbiBzZXJ2ZXIgbG9nLgorJHN0YW5kYnkxLT5zYWZlX3Bz cWwoJ3Bvc3RncmVzJywgIkNIRUNLUE9JTlQiKTsKK29rKCAhJHN0YW5kYnkxLT5sb2dfY29udGFp bnMoCisJCSJpbnZhbGlkYXRpbmcgb2Jzb2xldGUgcmVwbGljYXRpb24gc2xvdCBcImxzdWIxX3N5 bmNfc2xvdFwiIiwKKwkJJHN0YW5kYnkxX2xvZ3N0YXJ0KSwKKwknY2hlY2sgdGhhdCBzeW5lZCBs c3ViMV9zeW5jX3Nsb3QgaGFzIG5vdCBiZWVuIGludmFsaWRhdGVkIG9uIHRoZSBzdGFuZGJ5Jwor KTsKKworIyBTdG9wIHN0YW5kYnkgdG8gbWFrZSB0aGUgc3RhbmRieSdzIHJlcGxpY2F0aW9uIHNs b3Qgb24gdGhlIHByaW1hcnkgaW5hY3RpdmUKKyRzdGFuZGJ5MS0+c3RvcDsKKworIyBXYWl0IGZv ciB0aGUgc3RhbmRieSdzIHJlcGxpY2F0aW9uIHNsb3QgdG8gYmVjb21lIGluYWN0aXZlCit3YWl0 X2Zvcl9zbG90X2ludmFsaWRhdGlvbigkcHJpbWFyeSwgJ3NiMV9zbG90JywgJGxvZ3N0YXJ0LAor CSRpbmFjdGl2ZV90aW1lb3V0KTsKKworIyBUZXN0Y2FzZSBlbmQKKyMgPT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT0KKworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBUZXN0Y2FzZSBzdGFydAorIyBJbnZh bGlkYXRlIGxvZ2ljYWwgc3Vic2NyaWJlcidzIHNsb3QgZHVlIHRvIHJlcGxpY2F0aW9uX3Nsb3Rf aW5hY3RpdmVfdGltZW91dC4KKworbXkgJHB1Ymxpc2hlciA9ICRwcmltYXJ5OworCisjIFByZXBh cmUgZm9yIHRoZSBuZXh0IHRlc3QKKyRwdWJsaXNoZXItPnNhZmVfcHNxbCgKKwkncG9zdGdyZXMn LCBxcVsKKyAgICBBTFRFUiBTWVNURU0gU0VUIHJlcGxpY2F0aW9uX3Nsb3RfaW5hY3RpdmVfdGlt ZW91dCBUTyAnMCc7CitdKTsKKyRwdWJsaXNoZXItPnJlbG9hZDsKKworIyBDcmVhdGUgc3Vic2Ny aWJlcgorbXkgJHN1YnNjcmliZXIgPSBQb3N0Z3JlU1FMOjpUZXN0OjpDbHVzdGVyLT5uZXcoJ3N1 YicpOworJHN1YnNjcmliZXItPmluaXQ7Ciskc3Vic2NyaWJlci0+c3RhcnQ7CisKKyMgQ3JlYXRl IHRhYmxlcworJHB1Ymxpc2hlci0+c2FmZV9wc3FsKCdwb3N0Z3JlcycsICJDUkVBVEUgVEFCTEUg dGVzdF90YmwgKGlkIGludCkiKTsKKyRzdWJzY3JpYmVyLT5zYWZlX3BzcWwoJ3Bvc3RncmVzJywg IkNSRUFURSBUQUJMRSB0ZXN0X3RibCAoaWQgaW50KSIpOworCisjIEluc2VydCBzb21lIGRhdGEK KyRwdWJsaXNoZXItPnNhZmVfcHNxbCgncG9zdGdyZXMnLAorCSJJTlNFUlQgSU5UTyB0ZXN0X3Ri bCBWQUxVRVMgKGdlbmVyYXRlX3NlcmllcygxLCA1KSk7Iik7CisKKyMgU2V0dXAgbG9naWNhbCBy ZXBsaWNhdGlvbgorbXkgJHB1Ymxpc2hlcl9jb25uc3RyID0gJHB1Ymxpc2hlci0+Y29ubnN0ciAu ICcgZGJuYW1lPXBvc3RncmVzJzsKKyRwdWJsaXNoZXItPnNhZmVfcHNxbCgncG9zdGdyZXMnLCAi Q1JFQVRFIFBVQkxJQ0FUSU9OIHB1YiBGT1IgQUxMIFRBQkxFUyIpOworJHB1Ymxpc2hlci0+c2Fm ZV9wc3FsKAorCSdwb3N0Z3JlcycsIHFxWworICAgIFNFTEVDVCBwZ19jcmVhdGVfbG9naWNhbF9y ZXBsaWNhdGlvbl9zbG90KHNsb3RfbmFtZSA6PSAnbHN1YjFfc2xvdCcsIHBsdWdpbiA6PSAncGdv dXRwdXQnKTsKK10pOworCiskc3Vic2NyaWJlci0+c2FmZV9wc3FsKCdwb3N0Z3JlcycsCisJIkNS RUFURSBTVUJTQ1JJUFRJT04gc3ViIENPTk5FQ1RJT04gJyRwdWJsaXNoZXJfY29ubnN0cicgUFVC TElDQVRJT04gcHViIFdJVEggKHNsb3RfbmFtZSA9ICdsc3ViMV9zbG90JywgY3JlYXRlX3Nsb3Qg PSBmYWxzZSkiCispOworCiskc3Vic2NyaWJlci0+d2FpdF9mb3Jfc3Vic2NyaXB0aW9uX3N5bmMo JHB1Ymxpc2hlciwgJ3N1YicpOworCitteSAkcmVzdWx0ID0KKyAgJHN1YnNjcmliZXItPnNhZmVf cHNxbCgncG9zdGdyZXMnLCAiU0VMRUNUIGNvdW50KCopIEZST00gdGVzdF90YmwiKTsKKworaXMo JHJlc3VsdCwgcXEoNSksICJjaGVjayBpbml0aWFsIGNvcHkgd2FzIGRvbmUiKTsKKworJHB1Ymxp c2hlci0+c2FmZV9wc3FsKAorCSdwb3N0Z3JlcycsIHFxWworICAgIEFMVEVSIFNZU1RFTSBTRVQg cmVwbGljYXRpb25fc2xvdF9pbmFjdGl2ZV90aW1lb3V0IFRPICcgJHtpbmFjdGl2ZV90aW1lb3V0 fXMnOworXSk7CiskcHVibGlzaGVyLT5yZWxvYWQ7CisKKyRsb2dzdGFydCA9IC1zICRwdWJsaXNo ZXItPmxvZ2ZpbGU7CisKKyMgU3RvcCBzdWJzY3JpYmVyIHRvIG1ha2UgdGhlIHJlcGxpY2F0aW9u IHNsb3Qgb24gcHVibGlzaGVyIGluYWN0aXZlCiskc3Vic2NyaWJlci0+c3RvcDsKKworIyBXYWl0 IGZvciB0aGUgcmVwbGljYXRpb24gc2xvdCB0byBiZWNvbWUgaW5hY3RpdmUgYW5kIHRoZW4gaW52 YWxpZGF0ZWQgZHVlIHRvCisjIHRpbWVvdXQuCit3YWl0X2Zvcl9zbG90X2ludmFsaWRhdGlvbigk cHVibGlzaGVyLCAnbHN1YjFfc2xvdCcsICRsb2dzdGFydCwKKwkkaW5hY3RpdmVfdGltZW91dCk7 CisKKyMgVGVzdGNhc2UgZW5kOiBJbnZhbGlkYXRlIGxvZ2ljYWwgc3Vic2NyaWJlcidzIHNsb3Qg ZHVlIHRvCisjIHJlcGxpY2F0aW9uX3Nsb3RfaW5hY3RpdmVfdGltZW91dC4KKyMgPT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT0KKworc3ViIHdhaXRfZm9yX3Nsb3RfaW52YWxpZGF0aW9uCit7CisJbXkgKCRu b2RlLCAkc2xvdF9uYW1lLCAkb2Zmc2V0LCAkaW5hY3RpdmVfdGltZW91dCkgPSBAXzsKKwlteSAk bmFtZSA9ICRub2RlLT5uYW1lOworCisJIyBXYWl0IGZvciB0aGUgcmVwbGljYXRpb24gc2xvdCB0 byBiZWNvbWUgaW5hY3RpdmUKKwkkbm9kZS0+cG9sbF9xdWVyeV91bnRpbCgKKwkJJ3Bvc3RncmVz JywgcXFbCisJCVNFTEVDVCBDT1VOVChzbG90X25hbWUpID0gMSBGUk9NIHBnX3JlcGxpY2F0aW9u X3Nsb3RzCisJCQlXSEVSRSBzbG90X25hbWUgPSAnJHNsb3RfbmFtZScgQU5EIGFjdGl2ZSA9ICdm JzsKKwldKQorCSAgb3IgZGllCisJICAiVGltZWQgb3V0IHdoaWxlIHdhaXRpbmcgZm9yIHNsb3Qg JHNsb3RfbmFtZSB0byBiZWNvbWUgaW5hY3RpdmUgb24gbm9kZSAkbmFtZSI7CisKKwkjIFdhaXQg Zm9yIHRoZSByZXBsaWNhdGlvbiBzbG90IGluZm8gdG8gYmUgdXBkYXRlZAorCSRub2RlLT5wb2xs X3F1ZXJ5X3VudGlsKAorCQkncG9zdGdyZXMnLCBxcVsKKwkJU0VMRUNUIENPVU5UKHNsb3RfbmFt ZSkgPSAxIEZST00gcGdfcmVwbGljYXRpb25fc2xvdHMKKwkJCVdIRVJFIGluYWN0aXZlX3NpbmNl IElTIE5PVCBOVUxMCisJCQkJQU5EIHNsb3RfbmFtZSA9ICckc2xvdF9uYW1lJyBBTkQgYWN0aXZl ID0gJ2YnOworCV0pCisJICBvciBkaWUKKwkgICJUaW1lZCBvdXQgd2hpbGUgd2FpdGluZyBmb3Ig aW5mbyBvZiBzbG90ICRzbG90X25hbWUgdG8gYmUgdXBkYXRlZCBvbiBub2RlICRuYW1lIjsKKwor CSMgU2xlZXAgYXQgbGVhc3QgJGluYWN0aXZlX3RpbWVvdXQgZHVyYXRpb24gdG8gYXZvaWQgbXVs dGlwbGUgY2hlY2twb2ludHMKKwkjIGZvciB0aGUgc2xvdCB0byBnZXQgaW52YWxpZGF0ZWQuCisJ c2xlZXAoJGluYWN0aXZlX3RpbWVvdXQpOworCisJY2hlY2tfZm9yX3Nsb3RfaW52YWxpZGF0aW9u X2luX3NlcnZlcl9sb2coJG5vZGUsICRzbG90X25hbWUsICRvZmZzZXQpOworCisJIyBXYWl0IGZv ciB0aGUgaW5hY3RpdmUgcmVwbGljYXRpb24gc2xvdCB0byBiZSBpbnZhbGlkYXRlZAorCSRub2Rl LT5wb2xsX3F1ZXJ5X3VudGlsKAorCQkncG9zdGdyZXMnLCBxcVsKKwkJU0VMRUNUIENPVU5UKHNs b3RfbmFtZSkgPSAxIEZST00gcGdfcmVwbGljYXRpb25fc2xvdHMKKwkJCVdIRVJFIHNsb3RfbmFt ZSA9ICckc2xvdF9uYW1lJyBBTkQKKwkJCWludmFsaWRhdGlvbl9yZWFzb24gPSAnaW5hY3RpdmVf dGltZW91dCc7CisJXSkKKwkgIG9yIGRpZQorCSAgIlRpbWVkIG91dCB3aGlsZSB3YWl0aW5nIGZv ciBpbmFjdGl2ZSBzbG90ICRzbG90X25hbWUgdG8gYmUgaW52YWxpZGF0ZWQgb24gbm9kZSAkbmFt ZSI7CisKKwkjIENoZWNrIHRoYXQgdGhlIGludmFsaWRhdGVkIHNsb3QgY2Fubm90IGJlIGFjcXVp cmVkCisJbXkgKCRyZXN1bHQsICRzdGRvdXQsICRzdGRlcnIpOworCisJKCRyZXN1bHQsICRzdGRv dXQsICRzdGRlcnIpID0gJG5vZGUtPnBzcWwoCisJCSdwb3N0Z3JlcycsIHFxWworCQkJU0VMRUNU IHBnX3JlcGxpY2F0aW9uX3Nsb3RfYWR2YW5jZSgnJHNsb3RfbmFtZScsICcwLzEnKTsKKwldKTsK KworCW9rKCAkc3RkZXJyID1+CisJCSAgL2NhbiBubyBsb25nZXIgZ2V0IGNoYW5nZXMgZnJvbSBy ZXBsaWNhdGlvbiBzbG90ICIkc2xvdF9uYW1lIi8sCisJCSJkZXRlY3RlZCBlcnJvciB1cG9uIHRy eWluZyB0byBhY3F1aXJlIGludmFsaWRhdGVkIHNsb3QgJHNsb3RfbmFtZSBvbiBub2RlICRuYW1l IgorCSAgKQorCSAgb3IgZGllCisJICAiY291bGQgbm90IGRldGVjdCBlcnJvciB1cG9uIHRyeWlu ZyB0byBhY3F1aXJlIGludmFsaWRhdGVkIHNsb3QgJHNsb3RfbmFtZSBvbiBub2RlICRuYW1lIjsK K30KKworIyBDaGVjayBmb3IgaW52YWxpZGF0aW9uIG9mIHNsb3QgaW4gc2VydmVyIGxvZworc3Vi IGNoZWNrX2Zvcl9zbG90X2ludmFsaWRhdGlvbl9pbl9zZXJ2ZXJfbG9nCit7CisJbXkgKCRub2Rl LCAkc2xvdF9uYW1lLCAkb2Zmc2V0KSA9IEBfOworCW15ICRuYW1lID0gJG5vZGUtPm5hbWU7CisJ bXkgJGludmFsaWRhdGVkID0gMDsKKworCWZvciAobXkgJGkgPSAwOyAkaSA8IDEwICogJFBvc3Rn cmVTUUw6OlRlc3Q6OlV0aWxzOjp0aW1lb3V0X2RlZmF1bHQ7ICRpKyspCisJeworCQkkbm9kZS0+ c2FmZV9wc3FsKCdwb3N0Z3JlcycsICJDSEVDS1BPSU5UIik7CisJCWlmICgkbm9kZS0+bG9nX2Nv bnRhaW5zKAorCQkJCSJpbnZhbGlkYXRpbmcgb2Jzb2xldGUgcmVwbGljYXRpb24gc2xvdCBcIiRz bG90X25hbWVcIiIsCisJCQkJJG9mZnNldCkpCisJCXsKKwkJCSRpbnZhbGlkYXRlZCA9IDE7CisJ CQlsYXN0OworCQl9CisJCXVzbGVlcCgxMDBfMDAwKTsKKwl9CisJb2soJGludmFsaWRhdGVkLAor CQkiY2hlY2sgdGhhdCBzbG90ICRzbG90X25hbWUgaW52YWxpZGF0aW9uIGhhcyBiZWVuIGxvZ2dl ZCBvbiBub2RlICRuYW1lIgorCSk7Cit9CisKK2RvbmVfdGVzdGluZygpOwotLSAKMi40My4wCgo= --000000000000eba1480620f65036--