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 1txISK-006DOY-K8 for pgsql-hackers@arkaria.postgresql.org; Wed, 26 Mar 2025 04:33:32 +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 1txISJ-00EgX2-Bm for pgsql-hackers@arkaria.postgresql.org; Wed, 26 Mar 2025 04:33:31 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1txISJ-00EgWs-00 for pgsql-hackers@lists.postgresql.org; Wed, 26 Mar 2025 04:33:31 +0000 Received: from mail-lf1-x136.google.com ([2a00:1450:4864:20::136]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.96) (envelope-from ) id 1txISG-001D4B-1B for pgsql-hackers@postgresql.org; Wed, 26 Mar 2025 04:33:30 +0000 Received: by mail-lf1-x136.google.com with SMTP id 2adb3069b0e04-548430564d9so6886617e87.2 for ; Tue, 25 Mar 2025 21:33:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1742963607; x=1743568407; 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=ZO7W40j6ZNit8DkRvNNbCCBtDl1d3n9Gq366UVubUYM=; b=OejNMZKaoWMhQWkk8aQOWEx2QgfpVe8USlUb5tMwqjf4hXuplAG/RkA9T6CFyWUWaJ sjBw8Yk2lTkfTFFF1uQ89w/GE13gMqywqkwC9S/b+AMNTqkKEEcl7yn9PNzTGmgN7WiH o22HDS24qk+rpQwQCfKs9ioOt/Kwc7JlrBW3+zE5DZGL74jfk/cYOfXdREDR6rEQiypd z6bDghggkEZ8W/1LFv7yPuM9L7d616nx3rrGUucF9NY7dZ6/VK2qDpD8KtXmPFWLH+hI aXapx74eSotiNN+CibJch8lHjAf/qEbb3e3fS59JX/aKO12uxHHZZ89RE4sEfva6hxWO f/6g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1742963607; x=1743568407; 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=ZO7W40j6ZNit8DkRvNNbCCBtDl1d3n9Gq366UVubUYM=; b=eD0ryUtqa2lOVPn1BLZZ+t/NKXFnegGTmCh8GIMc2ZlXQcmaVORuCXxTqeUHBvO67v WD+OlMz76+cr5hA1DF0x/L8otay8yurBADvRH3PPqrcbAtrWcgwDlTtBQ0P8LAGDR3jW MET+bQetaJV5yNlNm3Z8CXNBAJAtZQfYeWUyUxC8HG6B7xF0u1GD/wkXMQafPiAkGsZ5 z13eei6Zu9nSB5yz/2P15vPhJ4X5r03JGJarZ8JZZjker7zEtcMi3TOZqWNhCdMB7JAV 9zm5rlC081f8fI3ZKHlJrLseSLAwwB9wZ9HyFr18PPMJwpDs4upgQEG7Q+3XZNs29Cjc 28kA== X-Forwarded-Encrypted: i=1; AJvYcCW1gn/6j77fvqkwaQH5A1QyZHTxSyae6ssYL7GJpfW9xs3S+u2ID7eMjFqhLMv0g5xkW5O03j4Xl3zx8HH/@postgresql.org X-Gm-Message-State: AOJu0YwuKzG2Nyc/ipXVjNma+FoaEJicDdV0M6EQoqhJTnMbgV1doIEl E+GsrSpaeyb6NP/0B5LPeZ6vtkUKp/hXqNOaPb1qlp/96UtTKD+U6Qnl452d4E/mQydCFeKGicI qgVE5tb3grq+tFnfafCurSKkZKhk= X-Gm-Gg: ASbGncu4mlxTgAAlKsQBnEBlVgAZROJI2gWbHCKPByUyNccnroXF4ntIYEne4Qpxhyn DXDOyRm3yQNnOHb/ywPkcOYrOouzPtW1ZyC/sCFl076gieon32DzzMCH+Ts1kP/gp+yD4jEcvt/ dWDg8hIU4KG+hgNcRJ/8GzdWc= X-Google-Smtp-Source: AGHT+IFPIeFx2FkrS2KRhlSFYpvY9DdD9aPVl8w9uuaNInJ+9aoxWfMy1NqQmRyYJmNTYIHBN8/aHK24OdK5rOSRwnI= X-Received: by 2002:a05:6512:3c87:b0:549:86c8:1133 with SMTP id 2adb3069b0e04-54ad64855c6mr6884355e87.12.1742963606805; Tue, 25 Mar 2025 21:33:26 -0700 (PDT) MIME-Version: 1.0 References: <1890999E-AB11-4090-9234-B4123F974D38@yandex-team.ru> <2e866175-6e52-4f20-b1a9-7e30e433eecb@manitou-mail.org> <96DEC2D9-659A-40E8-B7BA-AF5D162A9E21@yandex-team.ru> <2168BA61-2294-4812-BBD7-342928B7BD63@yandex-team.ru> <11C1A15A-73D9-4690-BC88-CE17A607C2FE@yandex-team.ru> In-Reply-To: <11C1A15A-73D9-4690-BC88-CE17A607C2FE@yandex-team.ru> From: Masahiko Sawada Date: Tue, 25 Mar 2025 21:32:49 -0700 X-Gm-Features: AQ5f1Jqm5Uu_9y62BvfUR8WRD9vACwX97a083P1mjg4eMqRkveaLVjjKs4yXJcg Message-ID: Subject: Re: UUID v7 To: Andrey Borodin Cc: Daniel Verite , Peter Eisentraut , Jelte Fennema-Nio , Sergey Prokhorenko , =?UTF-8?Q?Przemys=C5=82aw_Sztoch?= , Michael Paquier , Aleksander Alekseev , Pgsql-Hackers Mailing List , "David G. Johnston" , Mat Arye , Matthias van de Meent , Nikolay Samokhvalov , Junwang Zhao , Stepan Neretin Content-Type: multipart/mixed; boundary="000000000000a46336063137566e" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000a46336063137566e Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Sun, Feb 9, 2025 at 9:07=E2=80=AFAM Andrey Borodin wrote: > > I've took into account note from Sergey that "offset" is better name for = uuidv7() argument than "shift". > > > On 5 Feb 2025, at 03:02, Masahiko Sawada wrote: > > > >> > >> I was thinking about incorporating test like this. > >> > >>>> With this patch we can generate correct UUIDs in a very distant futu= re. > >>>> postgres=3D# select x, = uuid_ext= ract_timestamp(uuidv7((x::text || ' year'::text)::interval)), > >>>> (x::text || ' year'::text)::interval > >>>> from generate_series(1,9000,1000) x; > >>>> x | uuid_extract_timestamp | interval > >>>> ------+-----------------------------+------------ > >>>> 1 | 2026-01-31 12:00:53.084+05 | 1 year > >>>> 1001 | 3026-01-31 12:00:53.084+05 | 1001 years > >>>> 2001 | 4026-01-31 12:00:53.084+05 | 2001 years > >>>> 3001 | 5026-01-31 12:00:53.084+05 | 3001 years > >>>> 4001 | 6026-01-31 12:00:53.084+05 | 4001 years > >>>> 5001 | 7026-01-31 12:00:53.085+05 | 5001 years > >>>> 6001 | 8026-01-31 12:00:53.085+05 | 6001 years > >>>> 7001 | 9026-01-31 12:00:53.085+05 | 7001 years > >>>> 8001 | 10026-01-31 12:00:53.085+05 | 8001 years > >>>> (9 rows) > >> > > > > Something like following queries might be workable for example? > > > > create table test (c serial, d uuid, t timestamptz generated always as > > (uuid_extract_timestamp(d)) stored); > > insert into test (d) select uuidv7((n || 'years')::interval) from > > generate_series(1, 2000) n; > > select count(*) from (select t - lag(t) over (order by c) as diff from > > test) where diff > '10 year' ; > > Yeah, makes sense. I reduced tolerance to 366+1 day. Must be stable if we= 've done all the time offset business right. > > > Here are some review comments: > > > > #define NS_PER_S INT64CONST(1000000000) > > #define NS_PER_MS INT64CONST(1000000) > > +#define US_PER_MS INT64CONST(1000) > > #define NS_PER_US INT64CONST(1000) > > > > I think it's clear if we put US_PER_MS below NS_PER_US. > > OK. > > > --- > > * > > - * ns is a number of nanoseconds since start of the UNIX epoch. This v= alue is > > + * unix_ts_ms is a number of milliseconds since start of the UNIX epoc= h, > > + * ns_in_ms is a number of nanoseconds within millisecond. These value= s are > > * used for time-dependent bits of UUID. > > > > I think we can mention that the RFC describes that stored unix > > timestamp as an unsigned integer. > > Done. Feel free to adjust my wordings, I've no sense of idiomatic English= . > > > > > --- > > static pg_uuid_t * > > -generate_uuidv7(int64 ns) > > +generate_uuidv7(uint64 unix_ts_ms, uint32 ns_in_ms) > > > > How about renaming ns_in_ms with sub_ms? > > OK. > > > > > --- > > + /* 64 bits is enough for real time, but not for a time range o= f UUID */ > > > > I could not understand the point of this comment. It seems to say that > > 64-bits is not enough for a time range of UUID, but doesn't the time > > range of UUIDv7 use only 48 bits? It seems to need more comments. > > I've tried to say that acquiring current time as an int64 ns since UNIX e= poch is still viable for the code (until year 2262). > > > > --- > > - ns =3D (ts + (POSTGRES_EPOCH_JDATE - UNIX_EPOCH_JDATE) * > > SECS_PER_DAY * USECS_PER_SEC) > > - * NS_PER_US + ns % NS_PER_US; > > + us =3D (ts + (POSTGRES_EPOCH_JDATE - UNIX_EPOCH_JDATE) * > > SECS_PER_DAY * USECS_PER_SEC); > > > > /* Generate an UUIDv7 */ > > - uuid =3D generate_uuidv7(ns); > > + uuid =3D generate_uuidv7(us / US_PER_MS, (us % US_PER_MS) * > > NS_PER_US + ns % NS_PER_US); > > > > Need to update comments in uuidv7_internval() such as: > > > > /* > > * Shift the current timestamp by the given interval. To calculate t= ime > > * shift correctly, we convert the UNIX epoch to TimestampTz and use > > * timestamptz_pl_interval(). Since this calculation is done with > > * microsecond precision, we carry nanoseconds from original ns valu= e to > > * shifted ns value. > > */ > > > > and > > > > /* > > * Convert a TimestampTz value back to an UNIX epoch and back nanose= conds. > > */ > > I've tried. I'm not very satisfied with comments, but could not come up w= ith easier description. > Thank you for updating the patch. I had missed to track this patch. I've updated the patch from your v4 patch. In this version, I excluded the argument name change (from 'shift' to 'offset') as it's not related to the bug fix and simplified the regression test case. Please review it. Regards, -- Masahiko Sawada Amazon Web Services: https://aws.amazon.com --000000000000a46336063137566e Content-Type: application/octet-stream; name="v5-0001-Fix-timestamp-overflow-in-UUIDv7-implementation.patch" Content-Disposition: attachment; filename="v5-0001-Fix-timestamp-overflow-in-UUIDv7-implementation.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_m8pfhwib0 RnJvbSA4MmJhMjY4YjdhZjkzYTc1Yzc2Y2YzNmE4NWM3NjQ3NjFlMGRiZWIxIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBNYXNhaGlrbyBTYXdhZGEgPHNhd2FkYS5tc2hrQGdtYWlsLmNv bT4KRGF0ZTogVHVlLCAyNSBNYXIgMjAyNSAxNToxNDo0MiAtMDcwMApTdWJqZWN0OiBbUEFUQ0gg djVdIEZpeCB0aW1lc3RhbXAgb3ZlcmZsb3cgaW4gVVVJRHY3IGltcGxlbWVudGF0aW9uLgoKUHJl dmlvdXNseSwgdGhlIHV1aWR2N19pbnRlcnZhbCgpIGZ1bmN0aW9uIHBlcmZvcm1lZCB0aW1lc3Rh bXAKc2hpZnRpbmcgY2FsY3VsYXRpb25zIHVzaW5nIG1pY3Jvc2Vjb25kIHByZWNpc2lvbiwgYnV0 IHRoZW4gY29udmVydGVkCnRoZSByZXN1bHQgYmFjayB0byBuYW5vc2Vjb25kIHByZWNpc2lvbi4g U2luY2UgdGhlIG1pbGxpc2Vjb25kIGFuZApzdWItbWlsbGlzZWNvbmQgcGFydHMgd2VyZSBleHRy YWN0ZWQgZnJvbSB0aGlzIG5hbm9zZWNvbmQgdGltZXN0YW1wCmFuZCBzdG9yZWQgaW50byB0aGUg VVVJRHY3IHZhbHVlLCBvdmVyZmxvdyBvY2N1cnJlZCBmb3IgdGltZXN0YW1wcwpiZXlvbmQgdGhl IHllYXIgMjI2Mi4KCldpdGggdGhpcyBjb21taXQsIHRoZSBtaWxsaXNlY29uZCBhbmQgc3ViLW1p bGxpc2Vjb25kIHBhcnRzIGFyZSBzdG9yZWQKZGlyZWN0bHkgaW50byB0aGUgVVVJRHY3IHZhbHVl IHdpdGhvdXQgYmVpbmcgY29udmVydGVkIGJhY2sgdG8gYQpuYW5vc2Vjb25kIHByZWNpc2lvbiB0 aW1lc3RhbXAuIEZvbGxvd2luZyBSRkMgOTU2MiwgdGhlIHRpbWVzdGFtcCBpcwpzdG9yZWQgYXMg YW4gdW5zaWduZWQgaW50ZWdlciwgZW5hYmxpbmcgc3VwcG9ydCBmb3IgZGF0ZXMgdXAgdG8gdGhl CnllYXIgMTA4ODkuCgpSZXBvcnRlZCBhbmQgZml4ZWQgYnkgQW5kcmV5IEJvcm9kaW4sIHdpdGgg Y29zbWV0aWMgY2hhbmdlcyBhbmQKcmVncmVzc2lvbiB0ZXN0cyBieSBtZS4KClJlcG9ydGVkLWJ5 OiBBbmRyZXkgQm9yb2RpbiA8eDRtbW1AeWFuZGV4LXRlYW0ucnU+CkF1dGhvcjogQW5kcmV5IEJv cm9kaW4gPHg0bW1tQHlhbmRleC10ZWFtLnJ1PgpEaXNjdXNzaW9uOiBodHRwczovL3Bvc3Rnci5l cy9tLzk2REVDMkQ5LTY1OUEtNDBFOC1CN0JBLUFGNUQxNjJBOUUyMUB5YW5kZXgtdGVhbS5ydQot LS0KIHNyYy9iYWNrZW5kL3V0aWxzL2FkdC91dWlkLmMgICAgICAgfCAzNCArKysrKysrKysrKysr KystLS0tLS0tLS0tLS0tLS0KIHNyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvdXVpZC5vdXQgfCAx NCArKysrKysrKysrKysKIHNyYy90ZXN0L3JlZ3Jlc3Mvc3FsL3V1aWQuc3FsICAgICAgfCAxMSAr KysrKysrKysrCiAzIGZpbGVzIGNoYW5nZWQsIDQyIGluc2VydGlvbnMoKyksIDE3IGRlbGV0aW9u cygtKQoKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC91dWlkLmMgYi9zcmMvYmFj a2VuZC91dGlscy9hZHQvdXVpZC5jCmluZGV4IDRmODQwMmVmOTI1Li5iZTBmMGY5ZjFjZSAxMDA2 NDQKLS0tIGEvc3JjL2JhY2tlbmQvdXRpbHMvYWR0L3V1aWQuYworKysgYi9zcmMvYmFja2VuZC91 dGlscy9hZHQvdXVpZC5jCkBAIC0yOSw2ICsyOSw3IEBACiAjZGVmaW5lIE5TX1BFUl9TCUlOVDY0 Q09OU1QoMTAwMDAwMDAwMCkKICNkZWZpbmUgTlNfUEVSX01TCUlOVDY0Q09OU1QoMTAwMDAwMCkK ICNkZWZpbmUgTlNfUEVSX1VTCUlOVDY0Q09OU1QoMTAwMCkKKyNkZWZpbmUgVVNfUEVSX01TCUlO VDY0Q09OU1QoMTAwMCkKIAogLyoKICAqIFVVSUQgdmVyc2lvbiA3IHVzZXMgMTIgYml0cyBpbiAi cmFuZF9hIiB0byBzdG9yZSAgMS80MDk2IChvciAyXjEyKSBmcmFjdGlvbnMgb2YKQEAgLTY5LDYg KzcwLDcgQEAgc3RhdGljIGJvb2wgdXVpZF9hYmJyZXZfYWJvcnQoaW50IG1lbXR1cGNvdW50LCBT b3J0U3VwcG9ydCBzc3VwKTsKIHN0YXRpYyBEYXR1bSB1dWlkX2FiYnJldl9jb252ZXJ0KERhdHVt IG9yaWdpbmFsLCBTb3J0U3VwcG9ydCBzc3VwKTsKIHN0YXRpYyBpbmxpbmUgdm9pZCB1dWlkX3Nl dF92ZXJzaW9uKHBnX3V1aWRfdCAqdXVpZCwgdW5zaWduZWQgY2hhciB2ZXJzaW9uKTsKIHN0YXRp YyBpbmxpbmUgaW50NjQgZ2V0X3JlYWxfdGltZV9uc19hc2NlbmRpbmcoKTsKK3N0YXRpYyBwZ191 dWlkX3QgKmdlbmVyYXRlX3V1aWR2Nyh1aW50NjQgdW5peF90c19tcywgdWludDMyIHN1Yl9tcyk7 CiAKIERhdHVtCiB1dWlkX2luKFBHX0ZVTkNUSU9OX0FSR1MpCkBAIC01MjMsMTcgKzUyNSwxNyBA QCBnZXRfcmVhbF90aW1lX25zX2FzY2VuZGluZygpCiAgKiBkZXNjcmliZWQgaW4gdGhlIFJGQy4g VGhpcyBtZXRob2QgdXRpbGl6ZXMgMTIgYml0cyBmcm9tIHRoZSAicmFuZF9hIiBiaXRzCiAgKiB0 byBzdG9yZSBhIDEvNDA5NiAob3IgMl4xMikgZnJhY3Rpb24gb2Ygc3ViLW1pbGxpc2Vjb25kIHBy ZWNpc2lvbi4KICAqCi0gKiBucyBpcyBhIG51bWJlciBvZiBuYW5vc2Vjb25kcyBzaW5jZSBzdGFy dCBvZiB0aGUgVU5JWCBlcG9jaC4gVGhpcyB2YWx1ZSBpcworICogdW5peF90c19tcyBpcyBhIG51 bWJlciBvZiBtaWxsaXNlY29uZHMgc2luY2Ugc3RhcnQgb2YgdGhlIFVOSVggZXBvY2gsCisgKiBh bmQgc3ViX21zIGlzIGEgbnVtYmVyIG9mIG5hbm9zZWNvbmRzIHdpdGhpbiBtaWxsaXNlY29uZC4g VGhlc2UgdmFsdWVzIGFyZQogICogdXNlZCBmb3IgdGltZS1kZXBlbmRlbnQgYml0cyBvZiBVVUlE LgorICoKKyAqIE5COiBhbGwgbnVtYmVycyBoZXJlIGFyZSB1bnNpZ25lZCwgdW5peF90c19tcyBj YW5ub3QgYmUgbmVnYXRpdmUgcGVyIFJGQy4KICAqLwogc3RhdGljIHBnX3V1aWRfdCAqCi1nZW5l cmF0ZV91dWlkdjcoaW50NjQgbnMpCitnZW5lcmF0ZV91dWlkdjcodWludDY0IHVuaXhfdHNfbXMs IHVpbnQzMiBzdWJfbXMpCiB7CiAJcGdfdXVpZF90ICAqdXVpZCA9IHBhbGxvYyhVVUlEX0xFTik7 Ci0JaW50NjQJCXVuaXhfdHNfbXM7Ci0JaW50MzIJCWluY3JlYXNlZF9jbG9ja19wcmVjaXNpb247 Ci0KLQl1bml4X3RzX21zID0gbnMgLyBOU19QRVJfTVM7CisJdWludDMyCQlpbmNyZWFzZWRfY2xv Y2tfcHJlY2lzaW9uOwogCiAJLyogRmlsbCBpbiB0aW1lIHBhcnQgKi8KIAl1dWlkLT5kYXRhWzBd ID0gKHVuc2lnbmVkIGNoYXIpICh1bml4X3RzX21zID4+IDQwKTsKQEAgLTU0Nyw3ICs1NDksNyBA QCBnZW5lcmF0ZV91dWlkdjcoaW50NjQgbnMpCiAJICogc3ViLW1pbGxpc2Vjb25kIHRpbWVzdGFt cCBmcmFjdGlvbiAoU1VCTVNfQklUUyBiaXRzLCBub3QKIAkgKiBTVUJNU19NSU5JTUFMX1NURVBf QklUUykKIAkgKi8KLQlpbmNyZWFzZWRfY2xvY2tfcHJlY2lzaW9uID0gKChucyAlIE5TX1BFUl9N UykgKiAoMSA8PCBTVUJNU19CSVRTKSkgLyBOU19QRVJfTVM7CisJaW5jcmVhc2VkX2Nsb2NrX3By ZWNpc2lvbiA9IChzdWJfbXMgKiAoMSA8PCBTVUJNU19CSVRTKSkgLyBOU19QRVJfTVM7CiAKIAkv KiBGaWxsIHRoZSBpbmNyZWFzZWQgY2xvY2sgcHJlY2lzaW9uIHRvICJyYW5kX2EiIGJpdHMgKi8K IAl1dWlkLT5kYXRhWzZdID0gKHVuc2lnbmVkIGNoYXIpIChpbmNyZWFzZWRfY2xvY2tfcHJlY2lz aW9uID4+IDgpOwpAQCAtNTg2LDcgKzU4OCw4IEBAIGdlbmVyYXRlX3V1aWR2NyhpbnQ2NCBucykK IERhdHVtCiB1dWlkdjcoUEdfRlVOQ1RJT05fQVJHUykKIHsKLQlwZ191dWlkX3QgICp1dWlkID0g Z2VuZXJhdGVfdXVpZHY3KGdldF9yZWFsX3RpbWVfbnNfYXNjZW5kaW5nKCkpOworCWludDY0CQlu cyA9IGdldF9yZWFsX3RpbWVfbnNfYXNjZW5kaW5nKCk7CisJcGdfdXVpZF90ICAqdXVpZCA9IGdl bmVyYXRlX3V1aWR2NyhucyAvIE5TX1BFUl9NUywgbnMgJSBOU19QRVJfTVMpOwogCiAJUEdfUkVU VVJOX1VVSURfUCh1dWlkKTsKIH0KQEAgLTYwMSwxMyArNjA0LDEzIEBAIHV1aWR2N19pbnRlcnZh bChQR19GVU5DVElPTl9BUkdTKQogCVRpbWVzdGFtcFR6IHRzOwogCXBnX3V1aWRfdCAgKnV1aWQ7 CiAJaW50NjQJCW5zID0gZ2V0X3JlYWxfdGltZV9uc19hc2NlbmRpbmcoKTsKKwlpbnQ2NAkJdXM7 CiAKIAkvKgogCSAqIFNoaWZ0IHRoZSBjdXJyZW50IHRpbWVzdGFtcCBieSB0aGUgZ2l2ZW4gaW50 ZXJ2YWwuIFRvIGNhbGN1bGF0ZSB0aW1lCiAJICogc2hpZnQgY29ycmVjdGx5LCB3ZSBjb252ZXJ0 IHRoZSBVTklYIGVwb2NoIHRvIFRpbWVzdGFtcFR6IGFuZCB1c2UKLQkgKiB0aW1lc3RhbXB0el9w bF9pbnRlcnZhbCgpLiBTaW5jZSB0aGlzIGNhbGN1bGF0aW9uIGlzIGRvbmUgd2l0aAotCSAqIG1p Y3Jvc2Vjb25kIHByZWNpc2lvbiwgd2UgY2FycnkgbmFub3NlY29uZHMgZnJvbSBvcmlnaW5hbCBu cyB2YWx1ZSB0bwotCSAqIHNoaWZ0ZWQgbnMgdmFsdWUuCisJICogdGltZXN0YW1wdHpfcGxfaW50 ZXJ2YWwoKS4gVGhpcyBjYWxjdWxhdGlvbiBpcyBkb25lIHdpdGggbWljcm9zZWNvbmQKKwkgKiBw cmVjaXNpb24uCiAJICovCiAKIAl0cyA9IChUaW1lc3RhbXBUeikgKG5zIC8gTlNfUEVSX1VTKSAt CkBAIC02MTgsMTQgKzYyMSwxMSBAQCB1dWlkdjdfaW50ZXJ2YWwoUEdfRlVOQ1RJT05fQVJHUykK IAkJCQkJCQkJCQkJCSBUaW1lc3RhbXBUekdldERhdHVtKHRzKSwKIAkJCQkJCQkJCQkJCSBJbnRl cnZhbFBHZXREYXR1bShzaGlmdCkpKTsKIAotCS8qCi0JICogQ29udmVydCBhIFRpbWVzdGFtcFR6 IHZhbHVlIGJhY2sgdG8gYW4gVU5JWCBlcG9jaCBhbmQgYmFjayBuYW5vc2Vjb25kcy4KLQkgKi8K LQlucyA9ICh0cyArIChQT1NUR1JFU19FUE9DSF9KREFURSAtIFVOSVhfRVBPQ0hfSkRBVEUpICog U0VDU19QRVJfREFZICogVVNFQ1NfUEVSX1NFQykKLQkJKiBOU19QRVJfVVMgKyBucyAlIE5TX1BF Ul9VUzsKKwkvKiBDb252ZXJ0IGEgVGltZXN0YW1wVHogdmFsdWUgYmFjayB0byBhbiBVTklYIGVw b2NoIHRpbWVzdGFtcCAqLworCXVzID0gdHMgKyAoUE9TVEdSRVNfRVBPQ0hfSkRBVEUgLSBVTklY X0VQT0NIX0pEQVRFKSAqIFNFQ1NfUEVSX0RBWSAqIFVTRUNTX1BFUl9TRUM7CiAKIAkvKiBHZW5l cmF0ZSBhbiBVVUlEdjcgKi8KLQl1dWlkID0gZ2VuZXJhdGVfdXVpZHY3KG5zKTsKKwl1dWlkID0g Z2VuZXJhdGVfdXVpZHY3KHVzIC8gVVNfUEVSX01TLCAodXMgJSBVU19QRVJfTVMpICogTlNfUEVS X1VTICsgbnMgJSBOU19QRVJfVVMpOwogCiAJUEdfUkVUVVJOX1VVSURfUCh1dWlkKTsKIH0KZGlm ZiAtLWdpdCBhL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvdXVpZC5vdXQgYi9zcmMvdGVzdC9y ZWdyZXNzL2V4cGVjdGVkL3V1aWQub3V0CmluZGV4IDc5ODYzM2FkNTFlLi5jYmQ0OTczNzZjNCAx MDA2NDQKLS0tIGEvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC91dWlkLm91dAorKysgYi9zcmMv dGVzdC9yZWdyZXNzL2V4cGVjdGVkL3V1aWQub3V0CkBAIC0yMzMsNiArMjMzLDIwIEBAIFNFTEVD VCBhcnJheV9hZ2coaWQgT1JERVIgQlkgZ3VpZF9maWVsZCkgRlJPTSBndWlkMzsKICB7MSwyLDMs NCw1LDYsNyw4LDksMTB9CiAoMSByb3cpCiAKKy0tIENoZWNrIHRoZSB0aW1lc3RhbXAgb2Zmc2V0 cyBmb3IgdjcuCistLQorLS0gZ2VuZXJhdGUgVVVJRHY3IGhhdmluZyB0aW1lc3RhbXBzIHVwIHRv IDEwODg5IHllYXIsIHdoaWNoIGlzIHRoZSBtYXhpbXVtIHllYXIKKy0tIGNhbiBiZSBzdG9yZWQg aW4gVVVJRHY3LCBhbmQgdGhlbiBjaGVjayBpZiB0aGUgdGltZXN0YW1wcyBleHRyYWN0ZWQgZnJv bSBVVUlEdjcKKy0tIHZhbHVlcyBhcmUgbm90IG92ZXJmbG93ZWQuCitXSVRIIHV1aWR0cyBBUyAo CisgICAgIFNFTEVDVCB5LCB0cyBhcyB0cywgbGFnKHRzKSBPVkVSIChPUkRFUiBCWSB5KSBBUyBw cmV2X3RzCisgICAgIEZST00gKFNFTEVDVCB5LCB1dWlkX2V4dHJhY3RfdGltZXN0YW1wKHV1aWR2 NygoeSB8fCAnIHllYXJzJyk6OmludGVydmFsKSkgQVMgdHMgRlJPTSBnZW5lcmF0ZV9zZXJpZXMo LTUwLCAxMDg4OSAtIGV4dHJhY3QoeWVhciBmcm9tIG5vdygpKTo6aW50KSB5KQorKQorU0VMRUNU IHksIHRzLCBwcmV2X3RzIEZST00gdXVpZHRzIFdIRVJFIHRzIDwgcHJldl90czsKKyB5IHwgdHMg fCBwcmV2X3RzIAorLS0tKy0tLS0rLS0tLS0tLS0tCisoMCByb3dzKQorCiAtLSBleHRyYWN0IGZ1 bmN0aW9ucwogLS0gdmVyc2lvbgogU0VMRUNUIHV1aWRfZXh0cmFjdF92ZXJzaW9uKCcxMTExMTEx MS0xMTExLTUxMTEtODExMS0xMTExMTExMTExMTEnKTsgIC0tIDUKZGlmZiAtLWdpdCBhL3NyYy90 ZXN0L3JlZ3Jlc3Mvc3FsL3V1aWQuc3FsIGIvc3JjL3Rlc3QvcmVncmVzcy9zcWwvdXVpZC5zcWwK aW5kZXggMTEwMTg4MzYxZDEuLmNkMGU2NWQzYThiIDEwMDY0NAotLS0gYS9zcmMvdGVzdC9yZWdy ZXNzL3NxbC91dWlkLnNxbAorKysgYi9zcmMvdGVzdC9yZWdyZXNzL3NxbC91dWlkLnNxbApAQCAt MTE5LDYgKzExOSwxNyBAQCBTRUxFQ1QgY291bnQoRElTVElOQ1QgZ3VpZF9maWVsZCkgRlJPTSBn dWlkMTsKIElOU0VSVCBJTlRPIGd1aWQzIChndWlkX2ZpZWxkKSBTRUxFQ1QgdXVpZHY3KCkgRlJP TSBnZW5lcmF0ZV9zZXJpZXMoMSwgMTApOwogU0VMRUNUIGFycmF5X2FnZyhpZCBPUkRFUiBCWSBn dWlkX2ZpZWxkKSBGUk9NIGd1aWQzOwogCistLSBDaGVjayB0aGUgdGltZXN0YW1wIG9mZnNldHMg Zm9yIHY3LgorLS0KKy0tIGdlbmVyYXRlIFVVSUR2NyBoYXZpbmcgdGltZXN0YW1wcyB1cCB0byAx MDg4OSB5ZWFyLCB3aGljaCBpcyB0aGUgbWF4aW11bSB5ZWFyCistLSBjYW4gYmUgc3RvcmVkIGlu IFVVSUR2NywgYW5kIHRoZW4gY2hlY2sgaWYgdGhlIHRpbWVzdGFtcHMgZXh0cmFjdGVkIGZyb20g VVVJRHY3CistLSB2YWx1ZXMgYXJlIG5vdCBvdmVyZmxvd2VkLgorV0lUSCB1dWlkdHMgQVMgKAor ICAgICBTRUxFQ1QgeSwgdHMgYXMgdHMsIGxhZyh0cykgT1ZFUiAoT1JERVIgQlkgeSkgQVMgcHJl dl90cworICAgICBGUk9NIChTRUxFQ1QgeSwgdXVpZF9leHRyYWN0X3RpbWVzdGFtcCh1dWlkdjco KHkgfHwgJyB5ZWFycycpOjppbnRlcnZhbCkpIEFTIHRzIEZST00gZ2VuZXJhdGVfc2VyaWVzKC01 MCwgMTA4ODkgLSBleHRyYWN0KHllYXIgZnJvbSBub3coKSk6OmludCkgeSkKKykKK1NFTEVDVCB5 LCB0cywgcHJldl90cyBGUk9NIHV1aWR0cyBXSEVSRSB0cyA8IHByZXZfdHM7CisKIC0tIGV4dHJh Y3QgZnVuY3Rpb25zCiAKIC0tIHZlcnNpb24KLS0gCjIuNDMuNQoK --000000000000a46336063137566e--